ZGlmZiAtLWdpdCBhL0NsZWFuU3BlYy5tayBiL0NsZWFuU3BlYy5tawppbmRleCBlNmQ5ZWJmLi5kMDg5MGZlIDEwMDY0NAotLS0gYS9DbGVhblNwZWMubWsKKysrIGIvQ2xlYW5TcGVjLm1rCkBAIC00Nyw2ICs0NywxOSBAQAogJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL2xpYi9saWJtZWRpYV9uYXRpdmUuc28pCiAkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9zeW1ib2xzL3N5c3RlbS9saWIvbGlibWVkaWFfbmF0aXZlLnNvKQogJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvc3lzdGVtL2xpYi9saWJtZWRpYV9uYXRpdmUuc28pCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovU0hBUkVEX0xJQlJBUklFUy9saWJhdWRpb2ZsaW5nZXJfaW50ZXJtZWRpYXRlcykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvbGliYXVkaW9mbGluZ2VyLnNvKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL1NIQVJFRF9MSUJSQVJJRVMvbGliYXVkaW9wb2xpY3lfaW50ZXJtZWRpYXRlcykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvbGliYXVkaW9wb2xpY3kuc28pCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovU0hBUkVEX0xJQlJBUklFUy9saWJhdWRpb3BvbGljeV9pbnRlcm1lZGlhdGVzKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvc3lzdGVtL2xpYi9saWJhdWRpb3BvbGljeS5zbykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL29iai9TSEFSRURfTElCUkFSSUVTL2xpYmF1ZGlvcG9saWN5c2VydmljZV9pbnRlcm1lZGlhdGVzKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL1NIQVJFRF9MSUJSQVJJRVMvbGliYXVkaW9wb2xpY3ltYW5hZ2VyX2ludGVybWVkaWF0ZXMpCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9zeXN0ZW0vbGliL2xpYmF1ZGlvcG9saWN5c2VydmljZS5zbykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvbGliYXVkaW9wb2xpY3ltYW5hZ2VyLnNvKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL1NIQVJFRF9MSUJSQVJJRVMvbGliYXVkaW9wb2xpY3lzZXJ2aWNlX2ludGVybWVkaWF0ZXMpCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovU0hBUkVEX0xJQlJBUklFUy9saWJhdWRpb3BvbGljeW1hbmFnZXJfaW50ZXJtZWRpYXRlcykKKwogIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICMgTkVXRVIgQ0xFQU4gU1RFUFMgTVVTVCBCRSBBVCBUSEUgRU5EIE9GIFRIRSBMSVNUCiAjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvY2FtZXJhL0FuZHJvaWQubWsgYi9jYW1lcmEvQW5kcm9pZC5tawppbmRleCA1Y2VkYWIwLi5kYTVhYzU5IDEwMDY0NAotLS0gYS9jYW1lcmEvQW5kcm9pZC5taworKysgYi9jYW1lcmEvQW5kcm9pZC5tawpAQCAtMSwzICsxLDE3IEBACisjIENvcHlyaWdodCAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKIENBTUVSQV9DTElFTlRfTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCiBpbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQpAQCAtOCw2ICsyMiw3IEBACiAJQ2FtZXJhLmNwcCBcCiAJQ2FtZXJhTWV0YWRhdGEuY3BwIFwKIAlDYW1lcmFQYXJhbWV0ZXJzLmNwcCBcCisJQ2FwdHVyZVJlc3VsdC5jcHAgXAogCUNhbWVyYVBhcmFtZXRlcnMyLmNwcCBcCiAJSUNhbWVyYS5jcHAgXAogCUlDYW1lcmFDbGllbnQuY3BwIFwKQEAgLTIyLDYgKzM3LDggQEAKIAljYW1lcmEyL0NhcHR1cmVSZXF1ZXN0LmNwcCBcCiAJUHJvQ2FtZXJhLmNwcCBcCiAJQ2FtZXJhQmFzZS5jcHAgXAorCUNhbWVyYVV0aWxzLmNwcCBcCisJVmVuZG9yVGFnRGVzY3JpcHRvci5jcHAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAJbGliY3V0aWxzIFwKQEAgLTM1LDYgKzUyLDcgQEAKIAogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAJc3lzdGVtL21lZGlhL2NhbWVyYS9pbmNsdWRlIFwKKwlzeXN0ZW0vbWVkaWEvcHJpdmF0ZS9jYW1lcmEvaW5jbHVkZSBcCiAKIExPQ0FMX01PRFVMRTo9IGxpYmNhbWVyYV9jbGllbnQKIApkaWZmIC0tZ2l0IGEvY2FtZXJhL0NhbWVyYS5jcHAgYi9jYW1lcmEvQ2FtZXJhLmNwcAppbmRleCAyMjE5OWZhLi44NWY0NGYwIDEwMDY0NAotLS0gYS9jYW1lcmEvQ2FtZXJhLmNwcAorKysgYi9jYW1lcmEvQ2FtZXJhLmNwcApAQCAtNzcsNiArNzcsMzIgQEAKICAgICByZXR1cm4gQ2FtZXJhQmFzZVQ6OmNvbm5lY3QoY2FtZXJhSWQsIGNsaWVudFBhY2thZ2VOYW1lLCBjbGllbnRVaWQpOwogfQogCitzdGF0dXNfdCBDYW1lcmE6OmNvbm5lY3RMZWdhY3koaW50IGNhbWVyYUlkLCBpbnQgaGFsVmVyc2lvbiwKKyAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICBpbnQgY2xpZW50VWlkLAorICAgICAgICBzcDxDYW1lcmE+JiBjYW1lcmEpCit7CisgICAgQUxPR1YoIiVzOiBjb25uZWN0IGxlZ2FjeSBjYW1lcmEgZGV2aWNlIiwgX19GVU5DVElPTl9fKTsKKyAgICBzcDxDYW1lcmE+IGMgPSBuZXcgQ2FtZXJhKGNhbWVyYUlkKTsKKyAgICBzcDxJQ2FtZXJhQ2xpZW50PiBjbCA9IGM7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgY29uc3Qgc3A8SUNhbWVyYVNlcnZpY2U+JiBjcyA9IENhbWVyYUJhc2VUOjpnZXRDYW1lcmFTZXJ2aWNlKCk7CisKKyAgICBpZiAoY3MgIT0gMCkgeworICAgICAgICBzdGF0dXMgPSBjcy5nZXQoKS0+Y29ubmVjdExlZ2FjeShjbCwgY2FtZXJhSWQsIGhhbFZlcnNpb24sIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFVpZCwgLypvdXQqL2MtPm1DYW1lcmEpOworICAgIH0KKyAgICBpZiAoc3RhdHVzID09IE9LICYmIGMtPm1DYW1lcmEgIT0gMCkgeworICAgICAgICBjLT5tQ2FtZXJhLT5hc0JpbmRlcigpLT5saW5rVG9EZWF0aChjKTsKKyAgICAgICAgYy0+bVN0YXR1cyA9IE5PX0VSUk9SOworICAgICAgICBjYW1lcmEgPSBjOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dXKCJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBjb25uZWN0aW5nIHRvIGNhbWVyYTogJWQiLCBjYW1lcmFJZCk7CisgICAgICAgIGMuY2xlYXIoKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwogc3RhdHVzX3QgQ2FtZXJhOjpyZWNvbm5lY3QoKQogewogICAgIEFMT0dWKCJyZWNvbm5lY3QiKTsKZGlmZiAtLWdpdCBhL2NhbWVyYS9DYW1lcmFCYXNlLmNwcCBiL2NhbWVyYS9DYW1lcmFCYXNlLmNwcAppbmRleCA1NTM3NmIwLi4wNDY5NGNkIDEwMDY0NAotLS0gYS9jYW1lcmEvQ2FtZXJhQmFzZS5jcHAKKysrIGIvY2FtZXJhL0NhbWVyYUJhc2UuY3BwCkBAIC00OSw3ICs0OSw3IEBACiAgICAgICAgIERlYXRoTm90aWZpZXIoKSB7CiAgICAgICAgIH0KIAotICAgICAgICB2aXJ0dWFsIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKSB7CisgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiAvKndobyovKSB7CiAgICAgICAgICAgICBBTE9HVigiYmluZGVyRGllZCIpOwogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrKTsKICAgICAgICAgICAgIGdDYW1lcmFTZXJ2aWNlLmNsZWFyKCk7CkBAIC0xNTMsNyArMTUzLDcgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFRDYW0sIHR5cGVuYW1lIFRDYW1UcmFpdHM+Ci12b2lkIENhbWVyYUJhc2U8VENhbSwgVENhbVRyYWl0cz46OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykgewordm9pZCBDYW1lcmFCYXNlPFRDYW0sIFRDYW1UcmFpdHM+OjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiAvKndobyovKSB7CiAgICAgQUxPR1coIm1lZGlhc2VydmVyJ3MgcmVtb3RlIGJpbmRlciBDYW1lcmEgb2JqZWN0IGRpZWQiKTsKICAgICBub3RpZnlDYWxsYmFjayhDQU1FUkFfTVNHX0VSUk9SLCBDQU1FUkFfRVJST1JfU0VSVkVSX0RJRUQsIC8qZXh0MiovMCk7CiB9CmRpZmYgLS1naXQgYS9jYW1lcmEvQ2FtZXJhTWV0YWRhdGEuY3BwIGIvY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmNwcAppbmRleCA3NzY1OTE0Li4wNDM0MzdmIDEwMDY0NAotLS0gYS9jYW1lcmEvQ2FtZXJhTWV0YWRhdGEuY3BwCisrKyBiL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5jcHAKQEAgLTI1LDYgKzI1LDkgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCisjZGVmaW5lIEFMSUdOX1RPKHZhbCwgYWxpZ25tZW50KSBcCisgICAgKCgodWludHB0cl90KSh2YWwpICsgKChhbGlnbm1lbnQpIC0gMSkpICYgfigoYWxpZ25tZW50KSAtIDEpKQorCiB0eXBlZGVmIFBhcmNlbDo6V3JpdGFibGVCbG9iIFdyaXRhYmxlQmxvYjsKIHR5cGVkZWYgUGFyY2VsOjpSZWFkYWJsZUJsb2IgUmVhZGFibGVCbG9iOwogCkBAIC0yNzAsNyArMjczLDggQEAKICAgICBpZiAoIChyZXMgPSBjaGVja1R5cGUodGFnLCBUWVBFX0JZVEUpKSAhPSBPSykgewogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KLSAgICByZXR1cm4gdXBkYXRlSW1wbCh0YWcsIChjb25zdCB2b2lkKilzdHJpbmcuc3RyaW5nKCksIHN0cmluZy5zaXplKCkpOworICAgIC8vIHN0cmluZy5zaXplKCkgZG9lc24ndCBjb3VudCB0aGUgbnVsbCB0ZXJtaW5hdGlvbiBjaGFyYWN0ZXIuCisgICAgcmV0dXJuIHVwZGF0ZUltcGwodGFnLCAoY29uc3Qgdm9pZCopc3RyaW5nLnN0cmluZygpLCBzdHJpbmcuc2l6ZSgpICsgMSk7CiB9CiAKIHN0YXR1c190IENhbWVyYU1ldGFkYXRhOjp1cGRhdGVJbXBsKHVpbnQzMl90IHRhZywgY29uc3Qgdm9pZCAqZGF0YSwKQEAgLTQzMSw0MCArNDM1LDcwIEBACiAgICAgICAgICpvdXQgPSBOVUxMOwogICAgIH0KIAotICAgIC8vIGFyZzAgPSBtZXRhZGF0YVNpemUgKGludDMyKQotICAgIGludDMyX3QgbWV0YWRhdGFTaXplVG1wID0gLTE7Ci0gICAgaWYgKChlcnIgPSBkYXRhLnJlYWRJbnQzMigmbWV0YWRhdGFTaXplVG1wKSkgIT0gT0spIHsKKyAgICAvLyBTZWUgQ2FtZXJhTWV0YWRhdGE6OndyaXRlVG9QYXJjZWwgZm9yIHBhcmNlbCBkYXRhIGxheW91dCBkaWFncmFtIGFuZCBleHBsYW5hdGlvbi4KKyAgICAvLyBhcmcwID0gYmxvYlNpemUgKGludDMyKQorICAgIGludDMyX3QgYmxvYlNpemVUbXAgPSAtMTsKKyAgICBpZiAoKGVyciA9IGRhdGEucmVhZEludDMyKCZibG9iU2l6ZVRtcCkpICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgbWV0YWRhdGEgc2l6ZSAoZXJyb3IgJWQgJXMpIiwKICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBlcnIsIHN0cmVycm9yKC1lcnIpKTsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9Ci0gICAgY29uc3Qgc2l6ZV90IG1ldGFkYXRhU2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4obWV0YWRhdGFTaXplVG1wKTsKKyAgICBjb25zdCBzaXplX3QgYmxvYlNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGJsb2JTaXplVG1wKTsKKyAgICBjb25zdCBzaXplX3QgYWxpZ25tZW50ID0gZ2V0X2NhbWVyYV9tZXRhZGF0YV9hbGlnbm1lbnQoKTsKIAotICAgIGlmIChtZXRhZGF0YVNpemUgPT0gMCkgeworICAgIC8vIFNwZWNpYWwgY2FzZTogemVybyBibG9iIHNpemUgbWVhbnMgemVybyBzaXplZCAoTlVMTCkgbWV0YWRhdGEuCisgICAgaWYgKGJsb2JTaXplID09IDApIHsKICAgICAgICAgQUxPR1YoIiVzOiBSZWFkIDAtc2l6ZWQgbWV0YWRhdGEiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCi0gICAgLy8gTk9URTogdGhpcyBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gbWUuIHNob3VsZG50IHRoZSBibG9iCisgICAgaWYgKGJsb2JTaXplIDw9IGFsaWdubWVudCkgeworICAgICAgICBBTE9HRSgiJXM6IG1ldGFkYXRhIGJsb2IgaXMgbWFsZm9ybWVkLCBibG9iU2l6ZSglenUpIHNob3VsZCBiZSBsYXJnZXIgdGhhbiBhbGlnbm1lbnQoJXp1KSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBibG9iU2l6ZSwgYWxpZ25tZW50KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBjb25zdCBzaXplX3QgbWV0YWRhdGFTaXplID0gYmxvYlNpemUgLSBhbGlnbm1lbnQ7CisKKyAgICAvLyBOT1RFOiB0aGlzIGRvZXNuJ3QgbWFrZSBzZW5zZSB0byBtZS4gc2hvdWxkbid0IHRoZSBibG9iCiAgICAgLy8ga25vdyBob3cgYmlnIGl0IGlzPyB3aHkgZG8gd2UgaGF2ZSB0byBzcGVjaWZ5IHRoZSBzaXplCiAgICAgLy8gdG8gUGFyY2VsOjpyZWFkQmxvYiA/Ci0KICAgICBSZWFkYWJsZUJsb2IgYmxvYjsKICAgICAvLyBhcmcxID0gbWV0YWRhdGEgKGJsb2IpCiAgICAgZG8gewotICAgICAgICBpZiAoKGVyciA9IGRhdGEucmVhZEJsb2IobWV0YWRhdGFTaXplLCAmYmxvYikpICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIG1ldGFkYXRhIGJsb2IgKHNpemVkICVkKS4gUG9zc2libGUgIgorICAgICAgICBpZiAoKGVyciA9IGRhdGEucmVhZEJsb2IoYmxvYlNpemUsICZibG9iKSkgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgbWV0YWRhdGEgYmxvYiAoc2l6ZWQgJXp1KS4gUG9zc2libGUgIgogICAgICAgICAgICAgICAgICAgIiBzZXJpYWxpemF0aW9uIGJ1Zy4gRXJyb3IgJWQgJXMiLAotICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtZXRhZGF0YVNpemUsIGVyciwgc3RyZXJyb3IoLWVycikpOworICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBibG9iU2l6ZSwgZXJyLCBzdHJlcnJvcigtZXJyKSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCogdG1wID0KLSAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCo+KGJsb2IuZGF0YSgpKTsKIAorICAgICAgICAvLyBhcmcyID0gb2Zmc2V0IChibG9iKQorICAgICAgICAvLyBNdXN0IGJlIGFmdGVyIGJsb2Igc2luY2Ugd2UgZG9uJ3Qga25vdyBvZmZzZXQgdW50aWwgYWZ0ZXIgd3JpdGVCbG9iLgorICAgICAgICBpbnQzMl90IG9mZnNldFRtcDsKKyAgICAgICAgaWYgKChlcnIgPSBkYXRhLnJlYWRJbnQzMigmb2Zmc2V0VG1wKSkgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgbWV0YWRhdGEgb2Zmc2V0VG1wIChlcnJvciAlZCAlcykiLAorICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBlcnIsIHN0cmVycm9yKC1lcnIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNvbnN0IHNpemVfdCBvZmZzZXQgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KG9mZnNldFRtcCk7CisgICAgICAgIGlmIChvZmZzZXQgPj0gYWxpZ25tZW50KSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IG1ldGFkYXRhIG9mZnNldCglenUpIHNob3VsZCBiZSBsZXNzIHRoYW4gYWxpZ25tZW50KCV6dSkiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJsb2JTaXplLCBhbGlnbm1lbnQpOworICAgICAgICAgICAgZXJyID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCB1aW50cHRyX3QgbWV0YWRhdGFTdGFydCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihibG9iLmRhdGEoKSkgKyBvZmZzZXQ7CisgICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90KiB0bXAgPQorICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90Kj4obWV0YWRhdGFTdGFydCk7CisgICAgICAgIEFMT0dWKCIlczogYWxpZ25tZW50IGlzOiAlenUsIG1ldGFkYXRhIHN0YXJ0OiAlcCwgb2Zmc2V0OiAlenUiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYWxpZ25tZW50LCB0bXAsIG9mZnNldCk7CiAgICAgICAgIG1ldGFkYXRhID0gYWxsb2NhdGVfY29weV9jYW1lcmFfbWV0YWRhdGFfY2hlY2tlZCh0bXAsIG1ldGFkYXRhU2l6ZSk7CiAgICAgICAgIGlmIChtZXRhZGF0YSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAvLyBXZSBjb25zaWRlciB0aGF0IGFsbG9jYXRpb24gb25seSBmYWlscyBpZiB0aGUgdmFsaWRhdGlvbgogICAgICAgICAgICAgLy8gYWxzbyBmYWlsZWQsIHRoZXJlZm9yZSB0aGUgcmVhZEZyb21QYXJjZWwgd2FzIGEgZmFpbHVyZS4KKyAgICAgICAgICAgIEFMT0dFKCIlczogbWV0YWRhdGEgYWxsb2NhdGlvbiBhbmQgY29weSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICAgICAgZXJyID0gQkFEX1ZBTFVFOwogICAgICAgICB9CiAgICAgfSB3aGlsZSgwKTsKQEAgLTQ4NSwzOCArNTE5LDgwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCogbWV0YWRhdGEpIHsKICAgICBzdGF0dXNfdCByZXMgPSBPSzsKIAotICAgIC8vIGFyZzAgPSBtZXRhZGF0YVNpemUgKGludDMyKQorICAgIC8qKgorICAgICAqIEJlbG93IGlzIHRoZSBjYW1lcmEgbWV0YWRhdGEgcGFyY2VsIGxheW91dDoKKyAgICAgKgorICAgICAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgKiB8ICAgICAgICAgICAgIGFyZzA6IGJsb2JTaXplICAgICAgICAgICAgICAgICB8CisgICAgICogfCAgICAgICAgICAgICAgKGxlbmd0aCA9IDQpICAgICAgICAgICAgICAgICAgfAorICAgICAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw8LS1Ta2lwIHRoZSByZXN0IGlmIGJsb2JTaXplID09IDAuCisgICAgICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgKiB8ICAgICAgICAgICAgICBhcmcxOiBibG9iICAgICAgICAgICAgICAgICAgICB8CisgICAgICogfCAobGVuZ3RoID0gdmFyaWFibGUsIHNlZSBhcmcxIGxheW91dCBiZWxvdykgfAorICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgICAqIHwgICAgICAgICAgICAgIGFyZzI6IG9mZnNldCAgICAgICAgICAgICAgICAgIHwKKyAgICAgKiB8ICAgICAgICAgICAgICAobGVuZ3RoID0gNCkgICAgICAgICAgICAgICAgICB8CisgICAgICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgICAqLwogCisgICAgLy8gYXJnMCA9IGJsb2JTaXplIChpbnQzMikKICAgICBpZiAobWV0YWRhdGEgPT0gTlVMTCkgeworICAgICAgICAvLyBXcml0ZSB6ZXJvIGJsb2JTaXplIGZvciBudWxsIG1ldGFkYXRhLgogICAgICAgICByZXR1cm4gZGF0YS53cml0ZUludDMyKDApOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEFsd2F5cyBtYWtlIHRoZSBibG9iIHNpemUgc3VmZmljaWVudGx5IGxhcmdlciwgYXMgd2UgbmVlZCBwdXQgYWxpZ25tZW50CisgICAgICogcGFkZGluZyBhbmQgbWV0YWRhdGEgaW50byB0aGUgYmxvYi4gU2luY2Ugd2UgZG9uJ3Qga25vdyB0aGUgYWxpZ25tZW50CisgICAgICogb2Zmc2V0IGJlZm9yZSB3cml0ZUJsb2IuIFRoZW4gd3JpdGUgdGhlIG1ldGFkYXRhIHRvIGFsaWduZWQgb2Zmc2V0LgorICAgICAqLwogICAgIGNvbnN0IHNpemVfdCBtZXRhZGF0YVNpemUgPSBnZXRfY2FtZXJhX21ldGFkYXRhX2NvbXBhY3Rfc2l6ZShtZXRhZGF0YSk7Ci0gICAgcmVzID0gZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KG1ldGFkYXRhU2l6ZSkpOworICAgIGNvbnN0IHNpemVfdCBhbGlnbm1lbnQgPSBnZXRfY2FtZXJhX21ldGFkYXRhX2FsaWdubWVudCgpOworICAgIGNvbnN0IHNpemVfdCBibG9iU2l6ZSA9IG1ldGFkYXRhU2l6ZSArIGFsaWdubWVudDsKKyAgICByZXMgPSBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oYmxvYlNpemUpKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCi0gICAgLy8gYXJnMSA9IG1ldGFkYXRhIChibG9iKQorICAgIHNpemVfdCBvZmZzZXQgPSAwOworICAgIC8qKgorICAgICAqIGFyZzEgPSBtZXRhZGF0YSAoYmxvYikuCisgICAgICoKKyAgICAgKiBUaGUgYmxvYiBzaXplIGlzIHRoZSBzdW0gb2YgZnJvbnQgcGFkZGluZyBzaXplLCBtZXRhZGF0YSBzaXplIGFuZCBiYWNrIHBhZGRpbmcKKyAgICAgKiBzaXplLCB3aGljaCBpcyBlcXVhbCB0byBtZXRhZGF0YVNpemUgKyBhbGlnbm1lbnQuCisgICAgICoKKyAgICAgKiBUaGUgYmxvYiBsYXlvdXQgaXM6CisgICAgICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw8LS0tLVN0YXJ0IGFkZHJlc3Mgb2YgdGhlIGJsb2IgKHVuYWxpZ25lZCkuCisgICAgICogfCAgICAgICAgICAgZnJvbnQgcGFkZGluZyAgICAgICAgICAgIHwKKyAgICAgKiB8ICAgICAgICAgIChzaXplID0gb2Zmc2V0KSAgICAgICAgICAgfAorICAgICAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18PC0tLS1BbGlnbmVkIHN0YXJ0IGFkZHJlc3Mgb2YgbWV0YWRhdGEuCisgICAgICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAqIHwgICAgICAgICAgICBtZXRhZGF0YSAgICAgICAgICAgICAgICB8CisgICAgICogfCAgICAgICAoc2l6ZSA9IG1ldGFkYXRhU2l6ZSkgICAgICAgIHwKKyAgICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgKiB8ICAgICAgICAgICBiYWNrIHBhZGRpbmcgICAgICAgICAgICAgfAorICAgICAqIHwgICAgIChzaXplID0gYWxpZ25tZW50IC0gb2Zmc2V0KSAgICB8CisgICAgICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw8LS0tLUVuZCBhZGRyZXNzIG9mIGJsb2IuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCbG9iIHN0YXJ0IGFkZHJlc3MgKyBibG9iIHNpemUpLgorICAgICAqLwogICAgIFdyaXRhYmxlQmxvYiBibG9iOwogICAgIGRvIHsKLSAgICAgICAgcmVzID0gZGF0YS53cml0ZUJsb2IobWV0YWRhdGFTaXplLCAmYmxvYik7CisgICAgICAgIHJlcyA9IGRhdGEud3JpdGVCbG9iKGJsb2JTaXplLCAmYmxvYik7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGNvcHlfY2FtZXJhX21ldGFkYXRhKGJsb2IuZGF0YSgpLCBtZXRhZGF0YVNpemUsIG1ldGFkYXRhKTsKLQotICAgICAgICBJRl9BTE9HVigpIHsKLSAgICAgICAgICAgIGlmICh2YWxpZGF0ZV9jYW1lcmFfbWV0YWRhdGFfc3RydWN0dXJlKAotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90KilibG9iLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZtZXRhZGF0YVNpemUpICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBGYWlsZWQgdG8gdmFsaWRhdGUgbWV0YWRhdGEgJXAgYWZ0ZXIgd3JpdGluZyBibG9iIiwKLSAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBibG9iLmRhdGEoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dWKCIlczogTWV0YWRhdGEgd3JpdHRlbiB0byBibG9iLiBWYWxpZGF0aW9uIHN1Y2Nlc3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBjb25zdCB1aW50cHRyX3QgbWV0YWRhdGFTdGFydCA9IEFMSUdOX1RPKGJsb2IuZGF0YSgpLCBhbGlnbm1lbnQpOworICAgICAgICBvZmZzZXQgPSBtZXRhZGF0YVN0YXJ0IC0gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGJsb2IuZGF0YSgpKTsKKyAgICAgICAgQUxPR1YoIiVzOiBhbGlnbm1lbnQgaXM6ICV6dSwgbWV0YWRhdGEgc3RhcnQ6ICVwLCBvZmZzZXQ6ICV6dSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBhbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkICo+KG1ldGFkYXRhU3RhcnQpLCBvZmZzZXQpOworICAgICAgICBjb3B5X2NhbWVyYV9tZXRhZGF0YShyZWludGVycHJldF9jYXN0PHZvaWQqPihtZXRhZGF0YVN0YXJ0KSwgbWV0YWRhdGFTaXplLCBtZXRhZGF0YSk7CiAKICAgICAgICAgLy8gTm90IHRvbyBiaWcgb2YgYSBwcm9ibGVtIHNpbmNlIHJlY2VpdmluZyBzaWRlIGRvZXMgaGFyZCB2YWxpZGF0aW9uCiAgICAgICAgIC8vIERvbid0IGNoZWNrIHRoZSBzaXplIHNpbmNlIHRoZSBjb21wYWN0IHNpemUgY291bGQgYmUgbGFyZ2VyCkBAIC01MjgsNiArNjA0LDkgQEAKICAgICB9IHdoaWxlKGZhbHNlKTsKICAgICBibG9iLnJlbGVhc2UoKTsKIAorICAgIC8vIGFyZzIgPSBvZmZzZXQgKGludDMyKQorICAgIHJlcyA9IGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PihvZmZzZXQpKTsKKwogICAgIHJldHVybiByZXM7CiB9CiAKZGlmZiAtLWdpdCBhL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmNwcCBiL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmNwcAppbmRleCBjNTFmMjY1Li4yNWQ2MzJkIDEwMDY0NAotLS0gYS9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5jcHAKKysrIGIvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuY3BwCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vZ3JhcGhpY3MuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogLy8gUGFyYW1ldGVyIGtleXMgdG8gY29tbXVuaWNhdGUgYmV0d2VlbiBjYW1lcmEgYXBwbGljYXRpb24gYW5kIGRyaXZlci4KQEAgLTQ1Niw3ICs0NTcsNyBAQAogCiB2b2lkIENhbWVyYVBhcmFtZXRlcnM6OmR1bXAoKSBjb25zdAogewotICAgIEFMT0dEKCJkdW1wOiBtTWFwLnNpemUgPSAlZCIsIG1NYXAuc2l6ZSgpKTsKKyAgICBBTE9HRCgiZHVtcDogbU1hcC5zaXplID0gJXp1IiwgbU1hcC5zaXplKCkpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1hcC5zaXplKCk7IGkrKykgewogICAgICAgICBTdHJpbmc4IGssIHY7CiAgICAgICAgIGsgPSBtTWFwLmtleUF0KGkpOwpAQCAtNDY1LDEyICs0NjYsMTIgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IENhbWVyYVBhcmFtZXRlcnM6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdAorc3RhdHVzX3QgQ2FtZXJhUGFyYW1ldGVyczo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIC8qYXJncyovKSBjb25zdAogewogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwogICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogICAgIFN0cmluZzggcmVzdWx0OwotICAgIHNucHJpbnRmKGJ1ZmZlciwgMjU1LCAiQ2FtZXJhUGFyYW1ldGVyczo6ZHVtcDogbU1hcC5zaXplID0gJWRcbiIsIG1NYXAuc2l6ZSgpKTsKKyAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIkNhbWVyYVBhcmFtZXRlcnM6OmR1bXA6IG1NYXAuc2l6ZSA9ICV6dVxuIiwgbU1hcC5zaXplKCkpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1NYXAuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgU3RyaW5nOCBrLCB2OwpAQCAtNDgzLDQgKzQ4NCw0NSBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAordm9pZCBDYW1lcmFQYXJhbWV0ZXJzOjpnZXRTdXBwb3J0ZWRQcmV2aWV3Rm9ybWF0cyhWZWN0b3I8aW50PiYgZm9ybWF0cykgY29uc3QgeworICAgIGNvbnN0IGNoYXIqIHN1cHBvcnRlZFByZXZpZXdGb3JtYXRzID0KKyAgICAgICAgICBnZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1NVUFBPUlRFRF9QUkVWSUVXX0ZPUk1BVFMpOworCisgICAgU3RyaW5nOCBmbXRTdHIoc3VwcG9ydGVkUHJldmlld0Zvcm1hdHMpOworICAgIGNoYXIqIHByZXZGbXRzID0gZm10U3RyLmxvY2tCdWZmZXIoZm10U3RyLnNpemUoKSk7CisKKyAgICBjaGFyKiBzYXZlUHRyOworICAgIGNoYXIqIGZtdCA9IHN0cnRva19yKHByZXZGbXRzLCAiLCIsICZzYXZlUHRyKTsKKyAgICB3aGlsZSAoZm10KSB7CisgICAgICAgIGludCBhY3R1YWwgPSBwcmV2aWV3Rm9ybWF0VG9FbnVtKGZtdCk7CisgICAgICAgIGlmIChhY3R1YWwgIT0gLTEpIHsKKyAgICAgICAgICAgIGZvcm1hdHMuYWRkKGFjdHVhbCk7CisgICAgICAgIH0KKyAgICAgICAgZm10ID0gc3RydG9rX3IoTlVMTCwgIiwiLCAmc2F2ZVB0cik7CisgICAgfQorICAgIGZtdFN0ci51bmxvY2tCdWZmZXIoZm10U3RyLnNpemUoKSk7Cit9CisKKworaW50IENhbWVyYVBhcmFtZXRlcnM6OnByZXZpZXdGb3JtYXRUb0VudW0oY29uc3QgY2hhciogZm9ybWF0KSB7CisgICAgcmV0dXJuCisgICAgICAgICFmb3JtYXQgPworICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ3JDYl80MjBfU1AgOgorICAgICAgICAhc3RyY21wKGZvcm1hdCwgUElYRUxfRk9STUFUX1lVVjQyMlNQKSA/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+IG1HbENvbnN1bWVyOwpkaWZmIC0tZ2l0IGEvY21kcy9zY3JlZW5yZWNvcmQvT3ZlcmxheS5jcHAgYi9jbWRzL3NjcmVlbnJlY29yZC9PdmVybGF5LmNwcAppbmRleCA5NmUyNWI4Li43ZmVmNTNkIDEwMDY0NAotLS0gYS9jbWRzL3NjcmVlbnJlY29yZC9PdmVybGF5LmNwcAorKysgYi9jbWRzL3NjcmVlbnJlY29yZC9PdmVybGF5LmNwcApAQCAtMTQsNiArMTQsMTAgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCiAjZGVmaW5lIExPR19UQUcgIlNjcmVlblJlY29yZCIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KQEAgLTI3LDkgKzMxLDYgQEAKICNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KICNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KIAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotCiAjaW5jbHVkZSAic2NyZWVucmVjb3JkLmgiCiAjaW5jbHVkZSAiT3ZlcmxheS5oIgogI2luY2x1ZGUgIlRleHRSZW5kZXJlci5oIgpAQCAtNDcsNyArNDgsNyBAQAogICAgICAgICAicm8ucmV2aXNpb24iLAogICAgICAgICAiZGFsdmlrLnZtLmhlYXBncm93dGhsaW1pdCIsCiAgICAgICAgICJkYWx2aWsudm0uaGVhcHNpemUiLAotICAgICAgICAicGVyc2lzdC5zeXMuZGFsdmlrLnZtLmxpYiIsCisgICAgICAgICJwZXJzaXN0LnN5cy5kYWx2aWsudm0ubGliLjIiLAogICAgICAgICAvLyJyby5wcm9kdWN0LmNwdS5hYmkiLAogICAgICAgICAvLyJyby5ib290bG9hZGVyIiwKICAgICAgICAgLy8idGhpcy1uZXZlci1hcHBlYXJzISIsCkBAIC04NCw3ICs4NSw3IEBACiAgICAgYXNzZXJ0KG1TdGF0ZSA9PSBSVU5OSU5HKTsKIAogICAgIEFMT0dWKCJPdmVybGF5OjpzdGFydCBzdWNjZXNzZnVsIik7Ci0gICAgKnBCdWZmZXJQcm9kdWNlciA9IG1CdWZmZXJRdWV1ZTsKKyAgICAqcEJ1ZmZlclByb2R1Y2VyID0gbVByb2R1Y2VyOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApAQCAtMTY5LDkgKzE3MCwxMCBAQAogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAKLSAgICBtQnVmZmVyUXVldWUgPSBuZXcgQnVmZmVyUXVldWUoLypuZXcgR3JhcGhpY0J1ZmZlckFsbG9jKCkqLyk7Ci0gICAgbUdsQ29uc3VtZXIgPSBuZXcgR0xDb25zdW1lcihtQnVmZmVyUXVldWUsIG1FeHRUZXh0dXJlTmFtZSwKLSAgICAgICAgICAgICAgICBHTF9URVhUVVJFX0VYVEVSTkFMX09FUyk7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gY29uc3VtZXI7CisgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZtUHJvZHVjZXIsICZjb25zdW1lcik7CisgICAgbUdsQ29uc3VtZXIgPSBuZXcgR0xDb25zdW1lcihjb25zdW1lciwgbUV4dFRleHR1cmVOYW1lLAorICAgICAgICAgICAgICAgIEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTLCB0cnVlLCBmYWxzZSk7CiAgICAgbUdsQ29uc3VtZXItPnNldE5hbWUoU3RyaW5nOCgidmlydHVhbCBkaXNwbGF5IikpOwogICAgIG1HbENvbnN1bWVyLT5zZXREZWZhdWx0QnVmZmVyU2l6ZSh3aWR0aCwgaGVpZ2h0KTsKICAgICBtR2xDb25zdW1lci0+c2V0RGVmYXVsdE1heEJ1ZmZlckNvdW50KDUpOwpAQCAtMTg3LDcgKzE4OSw3IEBACiAgICAgQUxPR1YoIk92ZXJsYXk6OnJlbGVhc2VfbCIpOwogICAgIG1PdXRwdXRTdXJmYWNlLmNsZWFyKCk7CiAgICAgbUdsQ29uc3VtZXIuY2xlYXIoKTsKLSAgICBtQnVmZmVyUXVldWUuY2xlYXIoKTsKKyAgICBtUHJvZHVjZXIuY2xlYXIoKTsKIAogICAgIG1UZXhQcm9ncmFtLnJlbGVhc2UoKTsKICAgICBtRXh0VGV4UHJvZ3JhbS5yZWxlYXNlKCk7CkBAIC0yMzQsNyArMjM2LDcgQEAKIAogICAgIGNoYXIgdGV4dEJ1Zls2NF07CiAgICAgZ2V0VGltZVN0cmluZ19sKG1vbm90b25pY05zZWMsIHRleHRCdWYsIHNpemVvZih0ZXh0QnVmKSk7Ci0gICAgU3RyaW5nOCB0aW1lU3RyKFN0cmluZzg6OmZvcm1hdCgiJXMgZj0lbGxkICglemQpIiwKKyAgICBTdHJpbmc4IHRpbWVTdHIoU3RyaW5nODo6Zm9ybWF0KCIlcyBmPSUiIFBSSWQ2NCAiICglemQpIiwKICAgICAgICAgICAgIHRleHRCdWYsIGZyYW1lTnVtYmVyLCBtVG90YWxEcm9wcGVkRnJhbWVzKSk7CiAgICAgbVRleHRSZW5kZXJlci5kcmF3U3RyaW5nKG1UZXhQcm9ncmFtLCBQcm9ncmFtOjprSWRlbnRpdHksIDAsIDAsIHRpbWVTdHIpOwogCmRpZmYgLS1naXQgYS9jbWRzL3NjcmVlbnJlY29yZC9PdmVybGF5LmggYi9jbWRzL3NjcmVlbnJlY29yZC9PdmVybGF5LmgKaW5kZXggYjg0NzNiNC4uYjFiNWMyOSAxMDA2NDQKLS0tIGEvY21kcy9zY3JlZW5yZWNvcmQvT3ZlcmxheS5oCisrKyBiL2NtZHMvc2NyZWVucmVjb3JkL092ZXJsYXkuaApAQCAtNDcsNyArNDcsNiBAQAogICAgICAgICBtTGFzdEZyYW1lTnVtYmVyKC0xKSwKICAgICAgICAgbVRvdGFsRHJvcHBlZEZyYW1lcygwKQogICAgICAgICB7fQotICAgIHZpcnR1YWwgfk92ZXJsYXkoKSB7IGFzc2VydChtU3RhdGUgPT0gVU5JTklUSUFMSVpFRCB8fCBtU3RhdGUgPT0gU1RPUFBFRCk7IH0KIAogICAgIC8vIENyZWF0ZXMgYSB0aHJlYWQgdGhhdCBwZXJmb3JtcyB0aGUgb3ZlcmxheS4gIFBhc3MgaW4gdGhlIHN1cmZhY2UgdGhhdAogICAgIC8vIG91dHB1dCB3aWxsIGJlIHNlbnQgdG8uCkBAIC03MSw2ICs3MCw5IEBACiAgICAgT3ZlcmxheShjb25zdCBPdmVybGF5Jik7CiAgICAgT3ZlcmxheSYgb3BlcmF0b3I9KGNvbnN0IE92ZXJsYXkmKTsKIAorICAgIC8vIERlc3RydWN0aW9uIHZpYSBSZWZCYXNlLgorICAgIHZpcnR1YWwgfk92ZXJsYXkoKSB7IGFzc2VydChtU3RhdGUgPT0gVU5JTklUSUFMSVpFRCB8fCBtU3RhdGUgPT0gU1RPUFBFRCk7IH0KKwogICAgIC8vIERyYXcgdGhlIGluaXRpYWwgaW5mbyBzY3JlZW4uCiAgICAgc3RhdGljIHZvaWQgZG9EcmF3SW5mb1BhZ2UoY29uc3QgRWdsV2luZG93JiB3aW5kb3csCiAgICAgICAgICAgICBjb25zdCBQcm9ncmFtJiB0ZXhSZW5kZXIsIFRleHRSZW5kZXJlciYgdGV4dFJlbmRlcmVyKTsKQEAgLTEyMCw5ICsxMjIsOSBAQAogICAgIC8vIHN1cmZhY2UuCiAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbU91dHB1dFN1cmZhY2U7CiAKLSAgICAvLyBPdXIgcXVldWUuICBUaGUgcHJvZHVjZXIgc2lkZSBpcyBwYXNzZWQgdG8gdGhlIHZpcnR1YWwgZGlzcGxheSwgdGhlCi0gICAgLy8gY29uc3VtZXIgc2lkZSBmZWVkcyBpbnRvIG91ciBHTENvbnN1bWVyLgotICAgIHNwPEJ1ZmZlclF1ZXVlPiBtQnVmZmVyUXVldWU7CisgICAgLy8gUHJvZHVjZXIgc2lkZSBvZiBxdWV1ZSwgcGFzc2VkIGludG8gdGhlIHZpcnR1YWwgZGlzcGxheS4KKyAgICAvLyBUaGUgY29uc3VtZXIgZW5kIGZlZWRzIGludG8gb3VyIEdMQ29uc3VtZXIuCisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbVByb2R1Y2VyOwogCiAgICAgLy8gVGhpcyByZWNlaXZlcyBmcmFtZXMgZnJvbSB0aGUgdmlydHVhbCBkaXNwbGF5IGFuZCBtYWtlcyB0aGVtIGF2YWlsYWJsZQogICAgIC8vIGFzIGFuIGV4dGVybmFsIHRleHR1cmUuCmRpZmYgLS1naXQgYS9jbWRzL3NjcmVlbnJlY29yZC9UZXh0UmVuZGVyZXIuY3BwIGIvY21kcy9zY3JlZW5yZWNvcmQvVGV4dFJlbmRlcmVyLmNwcAppbmRleCA3ODQwNTVjLi42YTkxNzZiIDEwMDY0NAotLS0gYS9jbWRzL3NjcmVlbnJlY29yZC9UZXh0UmVuZGVyZXIuY3BwCisrKyBiL2NtZHMvc2NyZWVucmVjb3JkL1RleHRSZW5kZXJlci5jcHAKQEAgLTM1Myw2ICszNTMsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgQUxPR1YoImdvb2RQb3M9JWQgZm9yIHN0cj0nJXMnIiwgZ29vZFBvcywgc3RyKTsKKyAgICBBTE9HVigiZ29vZFBvcz0lenUgZm9yIHN0cj0nJXMnIiwgZ29vZFBvcywgc3RyKTsKICAgICByZXR1cm4gY29uc3RfY2FzdDxjaGFyKj4oc3RyICsgZ29vZFBvcyk7CiB9CmRpZmYgLS1naXQgYS9jbWRzL3NjcmVlbnJlY29yZC9zY3JlZW5yZWNvcmQuY3BwIGIvY21kcy9zY3JlZW5yZWNvcmQvc2NyZWVucmVjb3JkLmNwcAppbmRleCAwMmVkNTNhLi4wMmRmMWQyIDEwMDY0NAotLS0gYS9jbWRzL3NjcmVlbnJlY29yZC9zY3JlZW5yZWNvcmQuY3BwCisrKyBiL2NtZHMvc2NyZWVucmVjb3JkL3NjcmVlbnJlY29yZC5jcHAKQEAgLTE0LDYgKzE0LDE5IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHRlcm1pb3MuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKwogI2RlZmluZSBMT0dfVEFHICJTY3JlZW5SZWNvcmQiCiAjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19HUkFQSElDUwogLy8jZGVmaW5lIExPR19OREVCVUcgMApAQCAtMzYsMTggKzQ5LDYgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgogCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8Z2V0b3B0Lmg+Ci0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KLSNpbmNsdWRlIDx0ZXJtaW9zLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KICNpbmNsdWRlICJzY3JlZW5yZWNvcmQuaCIKICNpbmNsdWRlICJPdmVybGF5LmgiCiAjaW5jbHVkZSAiRnJhbWVPdXRwdXQuaCIKQEAgLTM1NCw3ICszNTUsNyBAQAogICAgICAgICBjYXNlIE5PX0VSUk9SOgogICAgICAgICAgICAgLy8gZ290IGEgYnVmZmVyCiAgICAgICAgICAgICBpZiAoKGZsYWdzICYgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfQ09ERUNDT05GSUcpICE9IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiR290IGNvZGVjIGNvbmZpZyBidWZmZXIgKCV1IGJ5dGVzKSIsIHNpemUpOworICAgICAgICAgICAgICAgIEFMT0dWKCJHb3QgY29kZWMgY29uZmlnIGJ1ZmZlciAoJXp1IGJ5dGVzKSIsIHNpemUpOwogICAgICAgICAgICAgICAgIGlmIChtdXhlciAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGlzIC0tIHdlIHBhc3NlZCB0aGUgQ1NEIGludG8gTWVkaWFNdXhlciB3aGVuCiAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGdvdCB0aGUgZm9ybWF0IGNoYW5nZSBub3RpZmljYXRpb24KQEAgLTM2Miw3ICszNjMsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChzaXplICE9IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiR290IGRhdGEgaW4gYnVmZmVyICVkLCBzaXplPSVkLCBwdHM9JWxsZCIsCisgICAgICAgICAgICAgICAgQUxPR1YoIkdvdCBkYXRhIGluIGJ1ZmZlciAlenUsIHNpemU9JXp1LCBwdHM9JSIgUFJJZDY0LAogICAgICAgICAgICAgICAgICAgICAgICAgYnVmSW5kZXgsIHNpemUsIHB0c1VzZWMpOwogCiAgICAgICAgICAgICAgICAgeyAvLyBzY29wZQpAQCAtNDczLDcgKzQ3NCw3IEBACiAKICAgICBBTE9HVigiRW5jb2RlciBzdG9wcGluZyAocmVxPSVkKSIsIGdTdG9wUmVxdWVzdGVkKTsKICAgICBpZiAoZ1ZlcmJvc2UpIHsKLSAgICAgICAgcHJpbnRmKCJFbmNvZGVyIHN0b3BwaW5nOyByZWNvcmRlZCAldSBmcmFtZXMgaW4gJWxsZCBzZWNvbmRzXG4iLAorICAgICAgICBwcmludGYoIkVuY29kZXIgc3RvcHBpbmc7IHJlY29yZGVkICV1IGZyYW1lcyBpbiAlIiBQUklkNjQgIiBzZWNvbmRzXG4iLAogICAgICAgICAgICAgICAgIGRlYnVnTnVtRnJhbWVzLCBuYW5vc2Vjb25kc190b19zZWNvbmRzKAogICAgICAgICAgICAgICAgICAgICAgICAgc3lzdGVtVGltZShDTE9DS19NT05PVE9OSUMpIC0gc3RhcnRXaGVuTnNlYykpOwogICAgIH0KZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvU2ltcGxlUGxheWVyLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvU2ltcGxlUGxheWVyLmNwcAppbmRleCA1ZDJkNzIxLi4xYjJmNzkyIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L1NpbXBsZVBsYXllci5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9TaW1wbGVQbGF5ZXIuY3BwCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1RyYWNrLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CkBAIC0yNzUsNyArMjc2LDggQEAKIAogICAgIG1FeHRyYWN0b3IgPSBuZXcgTnVNZWRpYUV4dHJhY3RvcjsKIAotICAgIHN0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPnNldERhdGFTb3VyY2UobVBhdGguY19zdHIoKSk7CisgICAgc3RhdHVzX3QgZXJyID0gbUV4dHJhY3Rvci0+c2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgIE5VTEwgLyogaHR0cFNlcnZpY2UgKi8sIG1QYXRoLmNfc3RyKCkpOwogCiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICBtRXh0cmFjdG9yLmNsZWFyKCk7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L1NpbmVTb3VyY2UuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9TaW5lU291cmNlLmNwcAppbmRleCAxNGI0MzA2Li41ODcwNzdhIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L1NpbmVTb3VyY2UuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvU2luZVNvdXJjZS5jcHAKQEAgLTI0LDcgKzI0LDcgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IFNpbmVTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKK3N0YXR1c190IFNpbmVTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICogLyogcGFyYW1zICovKSB7CiAgICAgQ0hFQ0soIW1TdGFydGVkKTsKIAogICAgIG1Hcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwOwpAQCAtNTgsNyArNTgsNyBAQAogfQogCiBzdGF0dXNfdCBTaW5lU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICAgICAgTWVkaWFCdWZmZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICogLyogb3B0aW9ucyAqLykgewogICAgICpvdXQgPSBOVUxMOwogCiAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlcjsKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvYXVkaW9sb29wLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvYXVkaW9sb29wLmNwcAppbmRleCBlZDdkNmNiLi45NjA3M2YxIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L2F1ZGlvbG9vcC5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9hdWRpb2xvb3AuY3BwCkBAIC0xLDQgKzEsMTggQEAKLSNpbmNsdWRlICJTaW5lU291cmNlLmgiCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KIAogI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+CkBAIC0xMCw0MSArMjQsNzkgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENsaWVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmg+Ci0KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlICJTaW5lU291cmNlLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCi1pbnQgbWFpbigpIHsKLSAgICAvLyBXZSBvbmx5IGhhdmUgYW4gQU1SLVdCIGVuY29kZXIgb24gc2hvbGVzLi4uCi0gICAgc3RhdGljIGJvb2wgb3V0cHV0V0JBTVIgPSBmYWxzZTsKLSAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrU2FtcGxlUmF0ZSA9IG91dHB1dFdCQU1SID8gMTYwMDAgOiA4MDAwOwotICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtOdW1DaGFubmVscyA9IDE7CitzdGF0aWMgdm9pZCB1c2FnZShjb25zdCBjaGFyKiBuYW1lKQoreworICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFstZCBkdXJhdGlvbl0gWy1tXSBbLXddIFs8b3V0cHV0LWZpbGU+XVxuIiwgbmFtZSk7CisgICAgZnByaW50ZihzdGRlcnIsICJFbmNvZGVzIGVpdGhlciBhIHNpbmUgd2F2ZSBvciBtaWNyb3Bob25lIGlucHV0IHRvIEFNUiBmb3JtYXRcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC1kICAgIGR1cmF0aW9uIGluIHNlY29uZHMsIGRlZmF1bHQgNSBzZWNvbmRzXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtbSAgICB1c2UgbWljcm9waG9uZSBmb3IgaW5wdXQsIGRlZmF1bHQgc2luZSBzb3VyY2VcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC13ICAgIHVzZSBBTVIgd2lkZWJhbmQgKGRlZmF1bHQgbmFycm93YmFuZClcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgIDxvdXRwdXQtZmlsZT4gb3V0cHV0IGZpbGUgZm9yIEFNUiBlbmNvZGluZywiCisgICAgICAgICAgICAiIGlmIHVuc3BlY2lmaWVkLCBkZWNvZGUgdG8gc3BlYWtlci5cbiIpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKQoreworICAgIHN0YXRpYyBjb25zdCBpbnQgY2hhbm5lbHMgPSAxOyAvLyBub3QgcGVybWl0dGVkIHRvIGJlIHN0ZXJlbyBub3cKKyAgICB1bnNpZ25lZCBkdXJhdGlvbiA9IDU7CisgICAgYm9vbCB1c2VNaWMgPSBmYWxzZTsKKyAgICBib29sIG91dHB1dFdCQU1SID0gZmFsc2U7CisgICAgYm9vbCBwbGF5VG9TcGVha2VyID0gdHJ1ZTsKKyAgICBjb25zdCBjaGFyKiBmaWxlT3V0ID0gTlVMTDsKKyAgICBpbnQgY2g7CisgICAgd2hpbGUgKChjaCA9IGdldG9wdChhcmdjLCBhcmd2LCAiZDptdyIpKSAhPSAtMSkgeworICAgICAgICBzd2l0Y2ggKGNoKSB7CisgICAgICAgIGNhc2UgJ2QnOgorICAgICAgICAgICAgZHVyYXRpb24gPSBhdG9pKG9wdGFyZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnbSc6CisgICAgICAgICAgICB1c2VNaWMgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3cnOgorICAgICAgICAgICAgb3V0cHV0V0JBTVIgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBhcmdjIC09IG9wdGluZDsKKyAgICBhcmd2ICs9IG9wdGluZDsKKyAgICBpZiAoYXJnYyA9PSAxKSB7CisgICAgICAgIGZpbGVPdXQgPSBhcmd2WzBdOworICAgIH0KKyAgICBjb25zdCBpbnQzMl90IGtTYW1wbGVSYXRlID0gb3V0cHV0V0JBTVIgPyAxNjAwMCA6IDgwMDA7CisgICAgY29uc3QgaW50MzJfdCBrQml0UmF0ZSA9IG91dHB1dFdCQU1SID8gMTYwMDAgOiA4MDAwOwogCiAgICAgYW5kcm9pZDo6UHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwotCiAgICAgT01YQ2xpZW50IGNsaWVudDsKICAgICBDSEVDS19FUShjbGllbnQuY29ubmVjdCgpLCAoc3RhdHVzX3QpT0spOworICAgIHNwPE1lZGlhU291cmNlPiBzb3VyY2U7CiAKLSNpZiAwCi0gICAgc3A8TWVkaWFTb3VyY2U+IHNvdXJjZSA9IG5ldyBTaW5lU291cmNlKGtTYW1wbGVSYXRlLCBrTnVtQ2hhbm5lbHMpOwotI2Vsc2UKLSAgICBzcDxNZWRpYVNvdXJjZT4gc291cmNlID0gbmV3IEF1ZGlvU291cmNlKAotICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsCi0gICAgICAgICAgICBrU2FtcGxlUmF0ZSwKLSAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfaW5fbWFza19mcm9tX2NvdW50KGtOdW1DaGFubmVscykpOwotI2VuZGlmCisgICAgaWYgKHVzZU1pYykgeworICAgICAgICAvLyB0YWxrIGludG8gdGhlIGFwcHJvcHJpYXRlIG1pY3JvcGhvbmUgZm9yIHRoZSBkdXJhdGlvbgorICAgICAgICBzb3VyY2UgPSBuZXcgQXVkaW9Tb3VyY2UoCisgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX01JQywKKyAgICAgICAgICAgICAgICBrU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICBjaGFubmVscyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gdXNlIGEgc2luZSBzb3VyY2UgYXQgNTAwIGh6LgorICAgICAgICBzb3VyY2UgPSBuZXcgU2luZVNvdXJjZShrU2FtcGxlUmF0ZSwgY2hhbm5lbHMpOworICAgIH0KIAogICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOwotCiAgICAgbWV0YS0+c2V0Q1N0cmluZygKICAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwKICAgICAgICAgICAgIG91dHB1dFdCQU1SID8gTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCCi0gICAgICAgICAgICAgICAgICAgICAgICA6IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQik7CisgICAgICAgICAgICAgICAgICAgIDogTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CKTsKIAotICAgIG1ldGEtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIGtOdW1DaGFubmVscyk7CisgICAgbWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgY2hhbm5lbHMpOwogICAgIG1ldGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBrU2FtcGxlUmF0ZSk7Ci0KKyAgICBtZXRhLT5zZXRJbnQzMihrS2V5Qml0UmF0ZSwga0JpdFJhdGUpOwogICAgIGludDMyX3QgbWF4SW5wdXRTaXplOwogICAgIGlmIChzb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kSW50MzIoa0tleU1heElucHV0U2l6ZSwgJm1heElucHV0U2l6ZSkpIHsKICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgbWF4SW5wdXRTaXplKTsKQEAgLTU1LDQ3ICsxMDcsNDEgQEAKICAgICAgICAgICAgIG1ldGEsIHRydWUgLyogY3JlYXRlRW5jb2RlciAqLywKICAgICAgICAgICAgIHNvdXJjZSk7CiAKLSNpZiAxCi0gICAgc3A8QU1SV3JpdGVyPiB3cml0ZXIgPSBuZXcgQU1SV3JpdGVyKCIvc2RjYXJkL291dC5hbXIiKTsKLSAgICB3cml0ZXItPmFkZFNvdXJjZShlbmNvZGVyKTsKLSAgICB3cml0ZXItPnN0YXJ0KCk7Ci0gICAgc2xlZXAoMTApOwotICAgIHdyaXRlci0+c3RvcCgpOwotI2Vsc2UKLSAgICBzcDxNZWRpYVNvdXJjZT4gZGVjb2RlciA9IE9NWENvZGVjOjpDcmVhdGUoCi0gICAgICAgICAgICBjbGllbnQuaW50ZXJmYWNlKCksCi0gICAgICAgICAgICBtZXRhLCBmYWxzZSAvKiBjcmVhdGVFbmNvZGVyICovLAotICAgICAgICAgICAgZW5jb2Rlcik7CisgICAgaWYgKGZpbGVPdXQgIT0gTlVMTCkgeworICAgICAgICAvLyB0YXJnZXQgZmlsZSBzcGVjaWZpZWQsIHdyaXRlIGVuY29kZWQgQU1SIG91dHB1dAorICAgICAgICBzcDxBTVJXcml0ZXI+IHdyaXRlciA9IG5ldyBBTVJXcml0ZXIoZmlsZU91dCk7CisgICAgICAgIHdyaXRlci0+YWRkU291cmNlKGVuY29kZXIpOworICAgICAgICB3cml0ZXItPnN0YXJ0KCk7CisgICAgICAgIHNsZWVwKGR1cmF0aW9uKTsKKyAgICAgICAgd3JpdGVyLT5zdG9wKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gb3RoZXJ3aXNlIGRlY29kZSB0byBzcGVha2VyCisgICAgICAgIHNwPE1lZGlhU291cmNlPiBkZWNvZGVyID0gT01YQ29kZWM6OkNyZWF0ZSgKKyAgICAgICAgICAgICAgICBjbGllbnQuaW50ZXJmYWNlKCksCisgICAgICAgICAgICAgICAgbWV0YSwgZmFsc2UgLyogY3JlYXRlRW5jb2RlciAqLywKKyAgICAgICAgICAgICAgICBlbmNvZGVyKTsKIAotI2lmIDAKLSAgICBBdWRpb1BsYXllciAqcGxheWVyID0gbmV3IEF1ZGlvUGxheWVyKE5VTEwpOwotICAgIHBsYXllci0+c2V0U291cmNlKGRlY29kZXIpOwotCi0gICAgcGxheWVyLT5zdGFydCgpOwotCi0gICAgc2xlZXAoMTApOwotCi0gICAgcGxheWVyLT5zdG9wKCk7Ci0KLSAgICBkZWxldGUgcGxheWVyOwotICAgIHBsYXllciA9IE5VTEw7Ci0jZWxpZiAwCi0gICAgQ0hFQ0tfRVEoZGVjb2Rlci0+c3RhcnQoKSwgKHN0YXR1c190KU9LKTsKLQotICAgIE1lZGlhQnVmZmVyICpidWZmZXI7Ci0gICAgd2hpbGUgKGRlY29kZXItPnJlYWQoJmJ1ZmZlcikgPT0gT0spIHsKLSAgICAgICAgLy8gZG8gc29tZXRoaW5nIHdpdGggYnVmZmVyCi0KLSAgICAgICAgcHV0Y2hhcignLicpOwotICAgICAgICBmZmx1c2goc3Rkb3V0KTsKLQotICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgYnVmZmVyID0gTlVMTDsKKyAgICAgICAgaWYgKHBsYXlUb1NwZWFrZXIpIHsKKyAgICAgICAgICAgIEF1ZGlvUGxheWVyICpwbGF5ZXIgPSBuZXcgQXVkaW9QbGF5ZXIoTlVMTCk7CisgICAgICAgICAgICBwbGF5ZXItPnNldFNvdXJjZShkZWNvZGVyKTsKKyAgICAgICAgICAgIHBsYXllci0+c3RhcnQoKTsKKyAgICAgICAgICAgIHNsZWVwKGR1cmF0aW9uKTsKKyAgICAgICAgICAgIHNvdXJjZS0+c3RvcCgpOyAvLyBtdXN0IHN0b3Agc291cmNlIG90aGVyd2lzZSBkZWxldGUgcGxheWVyIHdpbGwgaGFuZworICAgICAgICAgICAgZGVsZXRlIHBsYXllcjsgLy8gdGhlcmUgaXMgbm8gcGxheWVyLT5zdG9wKCkuLi4KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENIRUNLX0VRKGRlY29kZXItPnN0YXJ0KCksIChzdGF0dXNfdClPSyk7CisgICAgICAgICAgICBNZWRpYUJ1ZmZlciogYnVmZmVyOworICAgICAgICAgICAgd2hpbGUgKGRlY29kZXItPnJlYWQoJmJ1ZmZlcikgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAvLyBkbyBzb21ldGhpbmcgd2l0aCBidWZmZXIgKHNhdmUgaXQgZXZlbnR1YWxseT8pCisgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBzdG9wIGFmdGVyIHNvbWUgY291bnQgdGhvdWdoLi4uCisgICAgICAgICAgICAgICAgcHV0Y2hhcignLicpOworICAgICAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDSEVDS19FUShkZWNvZGVyLT5zdG9wKCksIChzdGF0dXNfdClPSyk7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBDSEVDS19FUShkZWNvZGVyLT5zdG9wKCksIChzdGF0dXNfdClPSyk7Ci0jZW5kaWYKLSNlbmRpZgotCiAgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L2NvZGVjLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvY29kZWMuY3BwCmluZGV4IGZkZmVmZGYuLmZkMDJiY2MgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvY29kZWMuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvY29kZWMuY3BwCkBAIC0xNiw2ICsxNiw3IEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiY29kZWMiCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgIlNpbXBsZVBsYXllci5oIgpAQCAtMjMsNiArMjQsNyBAQAogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC03NSw3ICs3Nyw3IEBACiAgICAgc3RhdGljIGludDY0X3Qga1RpbWVvdXQgPSA1MDBsbDsKIAogICAgIHNwPE51TWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvciA9IG5ldyBOdU1lZGlhRXh0cmFjdG9yOwotICAgIGlmIChleHRyYWN0b3ItPnNldERhdGFTb3VyY2UocGF0aCkgIT0gT0spIHsKKyAgICBpZiAoZXh0cmFjdG9yLT5zZXREYXRhU291cmNlKE5VTEwgLyogaHR0cFNlcnZpY2UgKi8sIHBhdGgpICE9IE9LKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidW5hYmxlIHRvIGluc3RhbnRpYXRlIGV4dHJhY3Rvci5cbiIpOwogICAgICAgICByZXR1cm4gMTsKICAgICB9CkBAIC0yOTEsMTMgKzI5MywxMyBAQAogICAgICAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIHN0YXRlLT5tQ29kZWMtPnJlbGVhc2UoKSk7CiAKICAgICAgICAgaWYgKHN0YXRlLT5tSXNBdWRpbykgewotICAgICAgICAgICAgcHJpbnRmKCJ0cmFjayAlZDogJWxsZCBieXRlcyByZWNlaXZlZC4gJS4yZiBLQi9zZWNcbiIsCisgICAgICAgICAgICBwcmludGYoInRyYWNrICV6dTogJSIgUFJJZDY0ICIgYnl0ZXMgcmVjZWl2ZWQuICUuMmYgS0Ivc2VjXG4iLAogICAgICAgICAgICAgICAgICAgIGksCiAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1OdW1CeXRlc0RlY29kZWQsCiAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1OdW1CeXRlc0RlY29kZWQgKiAxRTYgLyAxMDI0IC8gZWxhcHNlZFRpbWVVcyk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwcmludGYoInRyYWNrICVkOiAlbGxkIGZyYW1lcyBkZWNvZGVkLCAlLjJmIGZwcy4gJWxsZCBieXRlcyAiCi0gICAgICAgICAgICAgICAgICAgInJlY2VpdmVkLiAlLjJmIEtCL3NlY1xuIiwKKyAgICAgICAgICAgIHByaW50ZigidHJhY2sgJXp1OiAlIiBQUklkNjQgIiBmcmFtZXMgZGVjb2RlZCwgJS4yZiBmcHMuICUiIFBSSWQ2NAorICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzIHJlY2VpdmVkLiAlLjJmIEtCL3NlY1xuIiwKICAgICAgICAgICAgICAgICAgICBpLAogICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tTnVtQnVmZmVyc0RlY29kZWQsCiAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1OdW1CdWZmZXJzRGVjb2RlZCAqIDFFNiAvIGVsYXBzZWRUaW1lVXMsCmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L211eGVyLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvbXV4ZXIuY3BwCmluZGV4IGNjYTMzZTAuLmY0YTMzZTggMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvbXV4ZXIuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvbXV4ZXIuY3BwCkBAIC0xNiw5ICsxNiwxMSBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIm11eGVyIgorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgpAQCAtNTgsNyArNjAsNyBAQAogICAgICAgICBpbnQgdHJpbUVuZFRpbWVNcywKICAgICAgICAgaW50IHJvdGF0aW9uRGVncmVlcykgewogICAgIHNwPE51TWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvciA9IG5ldyBOdU1lZGlhRXh0cmFjdG9yOwotICAgIGlmIChleHRyYWN0b3ItPnNldERhdGFTb3VyY2UocGF0aCkgIT0gT0spIHsKKyAgICBpZiAoZXh0cmFjdG9yLT5zZXREYXRhU291cmNlKE5VTEwgLyogaHR0cFNlcnZpY2UgKi8sIHBhdGgpICE9IE9LKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidW5hYmxlIHRvIGluc3RhbnRpYXRlIGV4dHJhY3Rvci4gJXNcbiIsIHBhdGgpOwogICAgICAgICByZXR1cm4gMTsKICAgICB9CkBAIC0xOTgsNyArMjAwLDcgQEAKICAgICB0cmFja0luZGV4TWFwLmNsZWFyKCk7CiAKICAgICBpbnQ2NF90IGVsYXBzZWRUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpIC0gbXV4ZXJTdGFydFRpbWVVczsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlNVQ0NFU1M6IG11eGVyIGdlbmVyYXRlIHRoZSB2aWRlbyBpbiAlbGxkIG1zXG4iLAorICAgIGZwcmludGYoc3RkZXJyLCAiU1VDQ0VTUzogbXV4ZXIgZ2VuZXJhdGUgdGhlIHZpZGVvIGluICUiIFBSSWQ2NCAiIG1zXG4iLAogICAgICAgICAgICAgZWxhcHNlZFRpbWVVcyAvIDEwMDApOwogCiAgICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZC5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZC5jcHAKaW5kZXggYjdhNDBjMi4uZmRjMzUyZSAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9yZWNvcmQuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvcmVjb3JkLmNwcApAQCAtMjk2LDcgKzI5Niw3IEBACiB9CiAjZWxzZQogCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKK2ludCBtYWluKGludCAvKiBhcmdjICovLCBjaGFyICoqIC8qIGFyZ3YgKi8pIHsKICAgICBhbmRyb2lkOjpQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CiAKICAgICBPTVhDbGllbnQgY2xpZW50OwpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9yZWNvcmR2aWRlby5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZHZpZGVvLmNwcAppbmRleCBjMzBjMTIyLi45ZjU0N2M3IDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZHZpZGVvLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZHZpZGVvLmNwcApAQCAtMTYsNiArMTYsNyBAQAogCiAjaW5jbHVkZSAiU2luZVNvdXJjZS5oIgogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BdWRpb1BsYXllci5oPgpAQCAtNzIsNyArNzMsNyBAQAogICAgICAgICByZXR1cm4gbWV0YTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMgX191bnVzZWQpIHsKICAgICAgICAgbU51bUZyYW1lc091dHB1dCA9IDA7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CkBAIC04Miw3ICs4Myw3IEBACiAgICAgfQogCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucyBfX3VudXNlZCkgewogCiAgICAgICAgIGlmIChtTnVtRnJhbWVzT3V0cHV0ICUgMTAgPT0gMCkgewogICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIuIik7CkBAIC05OSw4ICsxMDAsMTIgQEAKICAgICAgICAgLy8gV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgY29udGVudHMuIHdlIGp1c3QgdGVzdCB2aWRlbyBlbmNvZGVyCiAgICAgICAgIC8vIEFsc28sIGJ5IHNraXBwaW5nIHRoZSBjb250ZW50IGdlbmVyYXRpb24sIHdlIGNhbiByZXR1cm4gZnJvbQogICAgICAgICAvLyByZWFkKCkgbXVjaCBmYXN0ZXIuCi0gICAgICAgIC8vY2hhciB4ID0gKGNoYXIpKChkb3VibGUpcmFuZCgpIC8gUkFORF9NQVggKiAyNTUpOwotICAgICAgICAvL21lbXNldCgoKmJ1ZmZlciktPmRhdGEoKSwgeCwgbVNpemUpOworI2lmIDAKKyAgICAgICAgLy8gaXRlcmF0ZSB0aHJvdWdoIHNvbGlkIHBsYW5lcyBvZiBjb2xvci4KKyAgICAgICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgeCA9IDB4NjA7CisgICAgICAgIG1lbXNldCgoKmJ1ZmZlciktPmRhdGEoKSwgeCwgbVNpemUpOworICAgICAgICB4ID0geCA+PSAweGEwID8gMHg2MCA6IHggKyAxOworI2VuZGlmCiAgICAgICAgICgqYnVmZmVyKS0+c2V0X3JhbmdlKDAsIG1TaXplKTsKICAgICAgICAgKCpidWZmZXIpLT5tZXRhX2RhdGEoKS0+Y2xlYXIoKTsKICAgICAgICAgKCpidWZmZXIpLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoCkBAIC0xNjIsNyArMTY3LDcgQEAKICAgICBpbnQgbGV2ZWwgPSAtMTsgICAgICAgIC8vIEVuY29kZXIgc3BlY2lmaWMgZGVmYXVsdAogICAgIGludCBwcm9maWxlID0gLTE7ICAgICAgLy8gRW5jb2RlciBzcGVjaWZpYyBkZWZhdWx0CiAgICAgaW50IGNvZGVjID0gMDsKLSAgICBjaGFyICpmaWxlTmFtZSA9ICIvc2RjYXJkL291dHB1dC5tcDQiOworICAgIGNvbnN0IGNoYXIgKmZpbGVOYW1lID0gIi9zZGNhcmQvb3V0cHV0Lm1wNCI7CiAgICAgYm9vbCBwcmVmZXJTb2Z0d2FyZUNvZGVjID0gZmFsc2U7CiAKICAgICBhbmRyb2lkOjpQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CkBAIC0zMTIsNyArMzE3LDcgQEAKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJyZWNvcmQgZmFpbGVkOiAlZFxuIiwgZXJyKTsKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQotICAgIGZwcmludGYoc3RkZXJyLCAiZW5jb2RpbmcgJWQgZnJhbWVzIGluICVsbGQgdXNcbiIsIG5GcmFtZXMsIChlbmQtc3RhcnQpLzEwMDApOworICAgIGZwcmludGYoc3RkZXJyLCAiZW5jb2RpbmcgJWQgZnJhbWVzIGluICUiIFBSSWQ2NCAiIHVzXG4iLCBuRnJhbWVzLCAoZW5kLXN0YXJ0KS8xMDAwKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgImVuY29kaW5nIHNwZWVkIGlzOiAlLjJmIGZwc1xuIiwgKG5GcmFtZXMgKiAxRTkpIC8gKGVuZC1zdGFydCkpOwogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9zZjIuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9zZjIuY3BwCmluZGV4IGM4MTc0NDMuLjBmNzI5YTMgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvc2YyLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L3NmMi5jcHAKQEAgLTE2LDEwICsxNiwxNSBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgInNmMiIKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCisjaW5jbHVkZSA8c2lnbmFsLmg+CisKICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgorCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KQEAgLTQyLDYgKzQ3LDE4IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCit2b2xhdGlsZSBzdGF0aWMgYm9vbCBjdHJsYyA9IGZhbHNlOworCitzdGF0aWMgc2lnaGFuZGxlcl90IG9sZGhhbmRsZXIgPSBOVUxMOworCitzdGF0aWMgdm9pZCBteXNpZ2hhbmRsZXIoaW50IHNpZ251bSkgeworICAgIGlmIChzaWdudW0gPT0gU0lHSU5UKSB7CisgICAgICAgIGN0cmxjID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBvbGRoYW5kbGVyKHNpZ251bSk7Cit9CisKIHN0cnVjdCBDb250cm9sbGVyIDogcHVibGljIEFIYW5kbGVyIHsKICAgICBDb250cm9sbGVyKGNvbnN0IGNoYXIgKnVyaSwgYm9vbCBkZWNvZGVBdWRpbywKICAgICAgICAgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlLCBib29sIHJlbmRlclRvU3VyZmFjZSkKQEAgLTYyLDcgKzc5LDMwIEBACiAgICAgdmlydHVhbCB+Q29udHJvbGxlcigpIHsKICAgICB9CiAKKyAgICB2aXJ0dWFsIHZvaWQgcHJpbnRTdGF0aXN0aWNzKCkgeworICAgICAgICBpbnQ2NF90IGRlbGF5VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpIC0gbVN0YXJ0VGltZVVzOworCisgICAgICAgIGlmIChtRGVjb2RlQXVkaW8pIHsKKyAgICAgICAgICAgIHByaW50ZigiJSIgUFJJZDY0ICIgYnl0ZXMgcmVjZWl2ZWQuICUuMmYgS0Ivc2VjXG4iLAorICAgICAgICAgICAgbVRvdGFsQnl0ZXNSZWNlaXZlZCwKKyAgICAgICAgICAgIG1Ub3RhbEJ5dGVzUmVjZWl2ZWQgKiAxRTYgLyAxMDI0IC8gZGVsYXlVcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGYoIiVkIGZyYW1lcyBkZWNvZGVkLCAlLjJmIGZwcy4gJSIgUFJJZDY0ICIgYnl0ZXMgIgorICAgICAgICAgICAgICAgICAgICAicmVjZWl2ZWQuICUuMmYgS0Ivc2VjXG4iLAorICAgICAgICAgICAgbU51bU91dHB1dEJ1ZmZlcnNSZWNlaXZlZCwKKyAgICAgICAgICAgIG1OdW1PdXRwdXRCdWZmZXJzUmVjZWl2ZWQgKiAxRTYgLyBkZWxheVVzLAorICAgICAgICAgICAgbVRvdGFsQnl0ZXNSZWNlaXZlZCwKKyAgICAgICAgICAgIG1Ub3RhbEJ5dGVzUmVjZWl2ZWQgKiAxRTYgLyAxMDI0IC8gZGVsYXlVcyk7CisgICAgICAgIH0KKyAgICB9CisKICAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICAgICAgaWYgKGN0cmxjKSB7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgICAgICBwcmludFN0YXRpc3RpY3MoKTsKKyAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wLCBpZCgpKSktPnBvc3QoKTsKKyAgICAgICAgICAgIGN0cmxjID0gZmFsc2U7CisgICAgICAgIH0KICAgICAgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgewogICAgICAgICAgICAgY2FzZSBrV2hhdFN0YXJ0OgogICAgICAgICAgICAgewpAQCAtNzUsNyArMTE1LDggQEAKICNlbmRpZgogCiAgICAgICAgICAgICAgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkobVVSSS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIC8qIGh0dHBTZXJ2aWNlICovLCBtVVJJLmNfc3RyKCkpOwogCiAgICAgICAgICAgICAgICAgc3A8TWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvciA9CiAgICAgICAgICAgICAgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpDcmVhdGUoZGF0YVNvdXJjZSk7CkBAIC05OCw3ICsxMzksMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENIRUNLKG1Tb3VyY2UgIT0gTlVMTCk7CisgICAgICAgICAgICAgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIm5vICVzIHRyYWNrIGZvdW5kXG4iLCBtRGVjb2RlQXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CisgICAgICAgICAgICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIENIRUNLX0VRKG1Tb3VyY2UtPnN0YXJ0KCksIChzdGF0dXNfdClPSyk7CiAKQEAgLTE2Nyw0MiArMjExLDI4IEBACiAgICAgICAgICAgICAgICAgaW50MzJfdCB3aGF0OwogICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ3aGF0IiwgJndoYXQpKTsKIAotICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IEFDb2RlYzo6a1doYXRGaWxsVGhpc0J1ZmZlcikgeworICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IENvZGVjQmFzZTo6a1doYXRGaWxsVGhpc0J1ZmZlcikgewogICAgICAgICAgICAgICAgICAgICBvbkZpbGxUaGlzQnVmZmVyKG1zZyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IEFDb2RlYzo6a1doYXREcmFpblRoaXNCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gQ29kZWNCYXNlOjprV2hhdERyYWluVGhpc0J1ZmZlcikgewogICAgICAgICAgICAgICAgICAgICBpZiAoKG1OdW1PdXRwdXRCdWZmZXJzUmVjZWl2ZWQrKyAlIDE2KSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIi4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgb25EcmFpblRoaXNCdWZmZXIobXNnKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gQUNvZGVjOjprV2hhdEVPUwotICAgICAgICAgICAgICAgICAgICAgICAgfHwgd2hhdCA9PSBBQ29kZWM6OmtXaGF0RXJyb3IpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCh3aGF0ID09IEFDb2RlYzo6a1doYXRFT1MpID8gIiRcbiIgOiAiRVxuIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IENvZGVjQmFzZTo6a1doYXRFT1MKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHdoYXQgPT0gQ29kZWNCYXNlOjprV2hhdEVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50Zigod2hhdCA9PSBDb2RlY0Jhc2U6OmtXaGF0RU9TKSA/ICIkXG4iIDogIkVcbiIpOwogCi0gICAgICAgICAgICAgICAgICAgIGludDY0X3QgZGVsYXlVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSBtU3RhcnRUaW1lVXM7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1EZWNvZGVBdWRpbykgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlbGxkIGJ5dGVzIHJlY2VpdmVkLiAlLjJmIEtCL3NlY1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG90YWxCeXRlc1JlY2VpdmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3RhbEJ5dGVzUmVjZWl2ZWQgKiAxRTYgLyAxMDI0IC8gZGVsYXlVcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVkIGZyYW1lcyBkZWNvZGVkLCAlLjJmIGZwcy4gJWxsZCBieXRlcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlY2VpdmVkLiAlLjJmIEtCL3NlY1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtT3V0cHV0QnVmZmVyc1JlY2VpdmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1PdXRwdXRCdWZmZXJzUmVjZWl2ZWQgKiAxRTYgLyBkZWxheVVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3RhbEJ5dGVzUmVjZWl2ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdGFsQnl0ZXNSZWNlaXZlZCAqIDFFNiAvIDEwMjQgLyBkZWxheVVzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCisgICAgICAgICAgICAgICAgICAgIHByaW50U3RhdGlzdGljcygpOwogICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3RvcCwgaWQoKSkpLT5wb3N0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IEFDb2RlYzo6a1doYXRGbHVzaENvbXBsZXRlZCkgeworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBDb2RlY0Jhc2U6OmtXaGF0Rmx1c2hDb21wbGV0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgbVNlZWtTdGF0ZSA9IFNFRUtfRkxVU0hfQ09NUExFVEVEOwogICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbFJlc3VtZSgpOwogCiAgICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTZWVrLCBpZCgpKSktPnBvc3QoNTAwMDAwMGxsKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gQUNvZGVjOjprV2hhdE91dHB1dEZvcm1hdENoYW5nZWQpIHsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gQUNvZGVjOjprV2hhdFNodXRkb3duQ29tcGxldGVkKSB7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IENvZGVjQmFzZTo6a1doYXRPdXRwdXRGb3JtYXRDaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IENvZGVjQmFzZTo6a1doYXRTaHV0ZG93bkNvbXBsZXRlZCkgewogICAgICAgICAgICAgICAgICAgICBtRGVjb2RlTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtQ29kZWMtPmlkKCkpOwogCiAgICAgICAgICAgICAgICAgICAgIGlmIChtRGVjb2RlTG9vcGVyICE9IGxvb3BlcigpKSB7CkBAIC0yMTAsMTIgKzI0MCw2IEBACiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBsb29wZXIoKS0+c3RvcCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBBQ29kZWM6OmtXaGF0RXJyb3IpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoInNvbWV0aGluZyB3ZW50IHdyb25nLCBjb2RlYyByZXBvcnRlZCBhbiBlcnJvci4iKTsKLQotICAgICAgICAgICAgICAgICAgICBwcmludGYoIkVcbiIpOwotCi0gICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wLCBpZCgpKSktPnBvc3QoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC02MzgsNiArNjYyLDggQEAKIAogICAgIGxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKGNvbnRyb2xsZXIpOwogCisgICAgc2lnbmFsKFNJR0lOVCwgbXlzaWdoYW5kbGVyKTsKKwogICAgIGNvbnRyb2xsZXItPnN0YXJ0QXN5bmMoKTsKIAogICAgIENIRUNLX0VRKGxvb3Blci0+c3RhcnQodHJ1ZSAvKiBydW5PbkNhbGxpbmdUaHJlYWQgKi8pLCAoc3RhdHVzX3QpT0spOwpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9zdGFnZWZyaWdodC5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcAppbmRleCAwMzBiZjFiLi44MWVkY2I0IDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcApAQCAtMTQsMjAgKzE0LDIyIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAic3RhZ2VmcmlnaHQiCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KIAotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQogI2luY2x1ZGUgImpwZWcuaCIKICNpbmNsdWRlICJTaW5lU291cmNlLmgiCiAKICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgogI2luY2x1ZGUgImluY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgiCkBAIC00OSw4ICs1MSw2IEBACiAKICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL1ZpZGVvRnJhbWUuaD4KIAotI2luY2x1ZGUgPGZjbnRsLmg+Ci0KICNpbmNsdWRlIDxndWkvR0xDb25zdW1lci5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2VDb21wb3NlckNsaWVudC5oPgpAQCAtODksOCArODksOCBAQAogICAgIGludDY0X3QgbWluVXMgPSBkZWNvZGVUaW1lc1VzLT5pdGVtQXQoMCk7CiAgICAgaW50NjRfdCBtYXhVcyA9IGRlY29kZVRpbWVzVXMtPml0ZW1BdChuIC0gMSk7CiAKLSAgICBwcmludGYoIm1pbiBkZWNvZGUgdGltZSAlbGxkIHVzICglLjJmIHNlY3MpXG4iLCBtaW5VcywgbWluVXMgLyAxRTYpOwotICAgIHByaW50ZigibWF4IGRlY29kZSB0aW1lICVsbGQgdXMgKCUuMmYgc2VjcylcbiIsIG1heFVzLCBtYXhVcyAvIDFFNik7CisgICAgcHJpbnRmKCJtaW4gZGVjb2RlIHRpbWUgJSIgUFJJZDY0ICIgdXMgKCUuMmYgc2VjcylcbiIsIG1pblVzLCBtaW5VcyAvIDFFNik7CisgICAgcHJpbnRmKCJtYXggZGVjb2RlIHRpbWUgJSIgUFJJZDY0ICIgdXMgKCUuMmYgc2VjcylcbiIsIG1heFVzLCBtYXhVcyAvIDFFNik7CiAKICAgICBzaXplX3QgY291bnRzWzEwMF07CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAxMDA7ICsraSkgewpAQCAtMTEwLDcgKzExMCw3IEBACiAgICAgICAgIGludDY0X3Qgc2xvdFVzID0gbWluVXMgKyAoaSAqIChtYXhVcyAtIG1pblVzKSAvIDEwMCk7CiAKICAgICAgICAgZG91YmxlIGZwcyA9IDFFNiAvIHNsb3RVczsKLSAgICAgICAgcHJpbnRmKCJbJS4yZiBmcHNdOiAlZFxuIiwgZnBzLCBjb3VudHNbaV0pOworICAgICAgICBwcmludGYoIlslLjJmIGZwc106ICV6dVxuIiwgZnBzLCBjb3VudHNbaV0pOwogICAgIH0KIH0KIApAQCAtMjYyLDcgKzI2Miw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBwcmludGYoImJ1ZmZlciBoYXMgdGltZXN0YW1wICVsbGQgdXMgKCUuMmYgc2VjcylcbiIsCisgICAgICAgICAgICAgICAgcHJpbnRmKCJidWZmZXIgaGFzIHRpbWVzdGFtcCAlIiBQUklkNjQgIiB1cyAoJS4yZiBzZWNzKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wVXMsIHRpbWVzdGFtcFVzIC8gMUU2KTsKIAogICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwpAQCAtMjg1LDcgKzI4NSw3IEBACiAgICAgICAgICAgICAgICAgc2Vla1RpbWVVcyA9IChyYW5kKCkgKiAoZmxvYXQpZHVyYXRpb25VcykgLyBSQU5EX01BWDsKICAgICAgICAgICAgICAgICBvcHRpb25zLnNldFNlZWtUbyhzZWVrVGltZVVzKTsKIAotICAgICAgICAgICAgICAgIHByaW50Zigic2Vla2luZyB0byAlbGxkIHVzICglLjJmIHNlY3MpXG4iLAorICAgICAgICAgICAgICAgIHByaW50Zigic2Vla2luZyB0byAlIiBQUklkNjQgIiB1cyAoJS4yZiBzZWNzKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgc2Vla1RpbWVVcywgc2Vla1RpbWVVcyAvIDFFNik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTM4OCw3ICszODgsNyBAQAogICAgICAgICAvLyBzaXplcyBtYXkgYmUgZGlmZmVyZW50IGFjcm9zcyBkZWNvZGVycy4KICAgICAgICAgcHJpbnRmKCJhdmcuICUuMmYgS0Ivc2VjXG4iLCB0b3RhbEJ5dGVzIC8gMTAyNCAqIDFFNiAvIGRlbGF5KTsKIAotICAgICAgICBwcmludGYoImRlY29kZWQgYSB0b3RhbCBvZiAlbGxkIGJ5dGVzXG4iLCB0b3RhbEJ5dGVzKTsKKyAgICAgICAgcHJpbnRmKCJkZWNvZGVkIGEgdG90YWwgb2YgJSIgUFJJZDY0ICIgYnl0ZXNcbiIsIHRvdGFsQnl0ZXMpOwogICAgIH0KIH0KIApAQCAtNTc0LDcgKzU3NCw4IEBACiAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKICAgICAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOwogCi0gICAgICAgICAgICBwcmludGYoIiVsbGRcdCVsbGRcdCVsbGRcbiIsIHNlZWtUaW1lVXMsIHRpbWVVcywgc2Vla1RpbWVVcyAtIHRpbWVVcyk7CisgICAgICAgICAgICBwcmludGYoIiUiIFBSSWQ2NCAiXHQlIiBQUklkNjQgIlx0JSIgUFJJZDY0ICJcbiIsCisgICAgICAgICAgICAgICAgICAgc2Vla1RpbWVVcywgdGltZVVzLCBzZWVrVGltZVVzIC0gdGltZVVzKTsKIAogICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBidWZmZXIgPSBOVUxMOwpAQCAtNjQ1LDcgKzY0Niw3IEBACiAgICAgICAgICAgICAgICAgY29uc3QgQ29kZWNQcm9maWxlTGV2ZWwgJnByb2ZpbGVMZXZlbCA9CiAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2ldLm1Qcm9maWxlTGV2ZWxzW2pdOwogCi0gICAgICAgICAgICAgICAgcHJpbnRmKCIlcyVsZC8lbGQiLCBqID4gMCA/ICIsICIgOiAiIiwKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzJSIgUFJJdTMyICIvJSIgUFJJdTMyLCBqID4gMCA/ICIsICIgOiAiIiwKICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZUxldmVsLm1Qcm9maWxlLCBwcm9maWxlTGV2ZWwubUxldmVsKTsKICAgICAgICAgICAgIH0KIApAQCAtOTM4LDkgKzkzOSwxMyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQ0hFQ0sodXNlU3VyZmFjZVRleEFsbG9jKTsKIAotICAgICAgICAgICAgc3A8QnVmZmVyUXVldWU+IGJxID0gbmV3IEJ1ZmZlclF1ZXVlKCk7Ci0gICAgICAgICAgICBzcDxHTENvbnN1bWVyPiB0ZXh0dXJlID0gbmV3IEdMQ29uc3VtZXIoYnEsIDAgLyogdGV4ICovKTsKLSAgICAgICAgICAgIGdTdXJmYWNlID0gbmV3IFN1cmZhY2UoYnEpOworICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gcHJvZHVjZXI7CisgICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBjb25zdW1lcjsKKyAgICAgICAgICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmcHJvZHVjZXIsICZjb25zdW1lcik7CisgICAgICAgICAgICBzcDxHTENvbnN1bWVyPiB0ZXh0dXJlID0gbmV3IEdMQ29uc3VtZXIoY29uc3VtZXIsIDAgLyogdGV4ICovLAorICAgICAgICAgICAgICAgICAgICBHTENvbnN1bWVyOjpURVhUVVJFX0VYVEVSTkFMLCB0cnVlIC8qIHVzZUZlbmNlU3luYyAqLywKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogaXNDb250cm9sbGVkQnlBcHAgKi8pOworICAgICAgICAgICAgZ1N1cmZhY2UgPSBuZXcgU3VyZmFjZShwcm9kdWNlcik7CiAgICAgICAgIH0KIAogICAgICAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssCkBAIC05NTgsNyArOTYzLDggQEAKIAogICAgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSA9IGFyZ3Zba107CiAKLSAgICAgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9IERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkoZmlsZW5hbWUpOworICAgICAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0KKyAgICAgICAgICAgIERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkoTlVMTCAvKiBodHRwU2VydmljZSAqLywgZmlsZW5hbWUpOwogCiAgICAgICAgIGlmIChzdHJuY2FzZWNtcChmaWxlbmFtZSwgInNpbmU6IiwgNSkgJiYgZGF0YVNvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBjcmVhdGUgZGF0YSBzb3VyY2UuXG4iKTsKQEAgLTEwNzEsNyArMTA3Nyw3IEBACiAKICAgICAgICAgICAgICAgICBpbnQ2NF90IHRodW1iVGltZVVzOwogICAgICAgICAgICAgICAgIGlmIChtZXRhLT5maW5kSW50NjQoa0tleVRodW1ibmFpbFRpbWUsICZ0aHVtYlRpbWVVcykpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJ0aHVtYm5haWxUaW1lOiAlbGxkIHVzICglLjJmIHNlY3MpXG4iLAorICAgICAgICAgICAgICAgICAgICBwcmludGYoInRodW1ibmFpbFRpbWU6ICUiIFBSSWQ2NCAiIHVzICglLjJmIHNlY3MpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGh1bWJUaW1lVXMsIHRodW1iVGltZVVzIC8gMUU2KTsKICAgICAgICAgICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvc3RyZWFtLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvc3RyZWFtLmNwcAppbmRleCBkYmE2N2E5Li4wNTY2ZDE0IDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L3N0cmVhbS5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9zdHJlYW0uY3BwCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+IC8vIGZvciBwcm9wZXJ0eV9nZXQKIAorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSVN0cmVhbVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KQEAgLTE1OSw3ICsxNjAsOSBAQAogTXlDb252ZXJ0aW5nU3RyZWFtU291cmNlOjpNeUNvbnZlcnRpbmdTdHJlYW1Tb3VyY2UoY29uc3QgY2hhciAqZmlsZW5hbWUpCiAgICAgOiBtQ3VycmVudEJ1ZmZlckluZGV4KC0xKSwKICAgICAgIG1DdXJyZW50QnVmZmVyT2Zmc2V0KDApIHsKLSAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSShmaWxlbmFtZSk7CisgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9CisgICAgICAgIERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkoTlVMTCAvKiBodHRwU2VydmljZSAqLywgZmlsZW5hbWUpOworCiAgICAgQ0hFQ0soZGF0YVNvdXJjZSAhPSBOVUxMKTsKIAogICAgIHNwPE1lZGlhRXh0cmFjdG9yPiBleHRyYWN0b3IgPSBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlKGRhdGFTb3VyY2UpOwpAQCAtMzcxLDcgKzM3NCw3IEBACiAgICAgfQogCiAgICAgc3A8SU1lZGlhUGxheWVyPiBwbGF5ZXIgPQotICAgICAgICBzZXJ2aWNlLT5jcmVhdGUoY2xpZW50LCAwKTsKKyAgICAgICAgc2VydmljZS0+Y3JlYXRlKGNsaWVudCwgQVVESU9fU0VTU0lPTl9BTExPQ0FURSk7CiAKICAgICBpZiAocGxheWVyICE9IE5VTEwgJiYgcGxheWVyLT5zZXREYXRhU291cmNlKHNvdXJjZSkgPT0gTk9fRVJST1IpIHsKICAgICAgICAgcGxheWVyLT5zZXRWaWRlb1N1cmZhY2VUZXh0dXJlKHN1cmZhY2UtPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSk7CmRpZmYgLS1naXQgYS9kcm0vY29tbW9uL0RybVN1cHBvcnRJbmZvLmNwcCBiL2RybS9jb21tb24vRHJtU3VwcG9ydEluZm8uY3BwCmluZGV4IDU0MDBiZGQuLjU4NGM2YTYgMTAwNjQ0Ci0tLSBhL2RybS9jb21tb24vRHJtU3VwcG9ydEluZm8uY3BwCisrKyBiL2RybS9jb21tb24vRHJtU3VwcG9ydEluZm8uY3BwCkBAIC00Nyw3ICs0Nyw3IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG1NaW1lVHlwZVZlY3Rvci5zaXplKCk7IGkrKykgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1pbWVUeXBlVmVjdG9yLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGNvbnN0IFN0cmluZzggaXRlbSA9IG1NaW1lVHlwZVZlY3Rvci5pdGVtQXQoaSk7CiAKICAgICAgICAgaWYgKCFzdHJjYXNlY21wKGl0ZW0uc3RyaW5nKCksIG1pbWVUeXBlLnN0cmluZygpKSkgewpAQCAtNTgsNyArNTgsNyBAQAogfQogCiBib29sIERybVN1cHBvcnRJbmZvOjppc1N1cHBvcnRlZEZpbGVTdWZmaXgoY29uc3QgU3RyaW5nOCYgZmlsZVR5cGUpIGNvbnN0IHsKLSAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG1GaWxlU3VmZml4VmVjdG9yLnNpemUoKTsgaSsrKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRmlsZVN1ZmZpeFZlY3Rvci5zaXplKCk7IGkrKykgewogICAgICAgICBjb25zdCBTdHJpbmc4IGl0ZW0gPSBtRmlsZVN1ZmZpeFZlY3Rvci5pdGVtQXQoaSk7CiAKICAgICAgICAgaWYgKCFzdHJjYXNlY21wKGl0ZW0uc3RyaW5nKCksIGZpbGVUeXBlLnN0cmluZygpKSkgewpkaWZmIC0tZ2l0IGEvZHJtL2RybXNlcnZlci9BbmRyb2lkLm1rIGIvZHJtL2RybXNlcnZlci9BbmRyb2lkLm1rCmluZGV4IGRjOTczZGEuLmFhMGFiOWIgMTAwNjQ0Ci0tLSBhL2RybS9kcm1zZXJ2ZXIvQW5kcm9pZC5taworKysgYi9kcm0vZHJtc2VydmVyL0FuZHJvaWQubWsKQEAgLTM5LDQgKzM5LDYgQEAKIAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAorTE9DQUxfMzJfQklUX09OTFkgOj0gdHJ1ZQorCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5jcHAgYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuY3BwCmluZGV4IGRjY2QyM2QuLmQ4YWViMGMgMTAwNjQ0Ci0tLSBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5jcHAKKysrIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyLmNwcApAQCAtMTAxLDcgKzEwMSw3IEBACiBzdGF0dXNfdCBEcm1NYW5hZ2VyOjpsb2FkUGx1Z0lucyhjb25zdCBTdHJpbmc4JiBwbHVnSW5EaXJQYXRoKSB7CiAgICAgbVBsdWdJbk1hbmFnZXIubG9hZFBsdWdJbnMocGx1Z0luRGlyUGF0aCk7CiAgICAgVmVjdG9yPFN0cmluZzg+IHBsdWdJblBhdGhMaXN0ID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luSWRMaXN0KCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBwbHVnSW5QYXRoTGlzdC5zaXplKCk7ICsraSkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGx1Z0luUGF0aExpc3Quc2l6ZSgpOyArK2kpIHsKICAgICAgICAgU3RyaW5nOCBwbHVnSW5QYXRoID0gcGx1Z0luUGF0aExpc3RbaV07CiAgICAgICAgIERybVN1cHBvcnRJbmZvKiBpbmZvID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luKHBsdWdJblBhdGgpLmdldFN1cHBvcnRJbmZvKDApOwogICAgICAgICBpZiAoTlVMTCAhPSBpbmZvKSB7CkBAIC0xMzgsNyArMTM4LDcgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmICghbVN1cHBvcnRJbmZvVG9QbHVnSW5JZE1hcC5pc0VtcHR5KCkpIHsKICAgICAgICAgVmVjdG9yPFN0cmluZzg+IHBsdWdJbklkTGlzdCA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbklkTGlzdCgpOwotICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpbmRleCA9IDA7IGluZGV4IDwgcGx1Z0luSWRMaXN0LnNpemUoKTsgaW5kZXgrKykgeworICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgcGx1Z0luSWRMaXN0LnNpemUoKTsgaW5kZXgrKykgewogICAgICAgICAgICAgSURybUVuZ2luZSYgckRybUVuZ2luZSA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbihwbHVnSW5JZExpc3QuaXRlbUF0KGluZGV4KSk7CiAgICAgICAgICAgICByRHJtRW5naW5lLmluaXRpYWxpemUodW5pcXVlSWQpOwogICAgICAgICAgICAgckRybUVuZ2luZS5zZXRPbkluZm9MaXN0ZW5lcih1bmlxdWVJZCwgdGhpcyk7CkBAIC0xNDksNyArMTQ5LDcgQEAKIHZvaWQgRHJtTWFuYWdlcjo6cmVtb3ZlQ2xpZW50KGludCB1bmlxdWVJZCkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgVmVjdG9yPFN0cmluZzg+IHBsdWdJbklkTGlzdCA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbklkTGlzdCgpOwotICAgIGZvciAodW5zaWduZWQgaW50IGluZGV4ID0gMDsgaW5kZXggPCBwbHVnSW5JZExpc3Quc2l6ZSgpOyBpbmRleCsrKSB7CisgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHBsdWdJbklkTGlzdC5zaXplKCk7IGluZGV4KyspIHsKICAgICAgICAgSURybUVuZ2luZSYgckRybUVuZ2luZSA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbihwbHVnSW5JZExpc3QuaXRlbUF0KGluZGV4KSk7CiAgICAgICAgIHJEcm1FbmdpbmUudGVybWluYXRlKHVuaXF1ZUlkKTsKICAgICB9CkBAIC0yMDgsNyArMjA4LDcgQEAKICAgICBib29sIHJlc3VsdCA9IGZhbHNlOwogICAgIFZlY3RvcjxTdHJpbmc4PiBwbHVnSW5QYXRoTGlzdCA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbklkTGlzdCgpOwogCi0gICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBwbHVnSW5QYXRoTGlzdC5zaXplKCk7ICsraSkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGx1Z0luUGF0aExpc3Quc2l6ZSgpOyArK2kpIHsKICAgICAgICAgSURybUVuZ2luZSYgckRybUVuZ2luZSA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbihwbHVnSW5QYXRoTGlzdFtpXSk7CiAgICAgICAgIHJlc3VsdCA9IHJEcm1FbmdpbmUuY2FuSGFuZGxlKHVuaXF1ZUlkLCBwYXRoKTsKIApAQCAtMzE4LDcgKzMxOCw3IEBACiBzdGF0dXNfdCBEcm1NYW5hZ2VyOjpyZW1vdmVBbGxSaWdodHMoaW50IHVuaXF1ZUlkKSB7CiAgICAgVmVjdG9yPFN0cmluZzg+IHBsdWdJbklkTGlzdCA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbklkTGlzdCgpOwogICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9VTktOT1dOOwotICAgIGZvciAodW5zaWduZWQgaW50IGluZGV4ID0gMDsgaW5kZXggPCBwbHVnSW5JZExpc3Quc2l6ZSgpOyBpbmRleCsrKSB7CisgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHBsdWdJbklkTGlzdC5zaXplKCk7IGluZGV4KyspIHsKICAgICAgICAgSURybUVuZ2luZSYgckRybUVuZ2luZSA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbihwbHVnSW5JZExpc3QuaXRlbUF0KGluZGV4KSk7CiAgICAgICAgIHJlc3VsdCA9IHJEcm1FbmdpbmUucmVtb3ZlQWxsUmlnaHRzKHVuaXF1ZUlkKTsKICAgICAgICAgaWYgKERSTV9OT19FUlJPUiAhPSByZXN1bHQpIHsKQEAgLTQxMiw3ICs0MTIsNyBAQAogICAgIGlmIChOVUxMICE9IGhhbmRsZSkgewogICAgICAgICBoYW5kbGUtPmRlY3J5cHRJZCA9IG1EZWNyeXB0U2Vzc2lvbklkICsgMTsKIAotICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpbmRleCA9IDA7IGluZGV4IDwgcGx1Z0luSWRMaXN0LnNpemUoKTsgaW5kZXgrKykgeworICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgcGx1Z0luSWRMaXN0LnNpemUoKTsgaW5kZXgrKykgewogICAgICAgICAgICAgU3RyaW5nOCBwbHVnSW5JZCA9IHBsdWdJbklkTGlzdC5pdGVtQXQoaW5kZXgpOwogICAgICAgICAgICAgSURybUVuZ2luZSYgckRybUVuZ2luZSA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbihwbHVnSW5JZCk7CiAgICAgICAgICAgICByZXN1bHQgPSByRHJtRW5naW5lLm9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgaGFuZGxlLCBmZCwgb2Zmc2V0LCBsZW5ndGgsIG1pbWUpOwpAQCAtNDQwLDcgKzQ0MCw3IEBACiAgICAgaWYgKE5VTEwgIT0gaGFuZGxlKSB7CiAgICAgICAgIGhhbmRsZS0+ZGVjcnlwdElkID0gbURlY3J5cHRTZXNzaW9uSWQgKyAxOwogCi0gICAgICAgIGZvciAodW5zaWduZWQgaW50IGluZGV4ID0gMDsgaW5kZXggPCBwbHVnSW5JZExpc3Quc2l6ZSgpOyBpbmRleCsrKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBwbHVnSW5JZExpc3Quc2l6ZSgpOyBpbmRleCsrKSB7CiAgICAgICAgICAgICBTdHJpbmc4IHBsdWdJbklkID0gcGx1Z0luSWRMaXN0Lml0ZW1BdChpbmRleCk7CiAgICAgICAgICAgICBJRHJtRW5naW5lJiByRHJtRW5naW5lID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luKHBsdWdJbklkKTsKICAgICAgICAgICAgIHJlc3VsdCA9IHJEcm1FbmdpbmUub3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBoYW5kbGUsIHVyaSwgbWltZSk7CkBAIC01NjUsNyArNTY1LDcgQEAKICAgICBTdHJpbmc4IHBsdWdJbklkKCIiKTsKIAogICAgIGlmIChFTVBUWV9TVFJJTkcgIT0gbWltZVR5cGUpIHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IG1TdXBwb3J0SW5mb1RvUGx1Z0luSWRNYXAuc2l6ZSgpOyBpbmRleCsrKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBtU3VwcG9ydEluZm9Ub1BsdWdJbklkTWFwLnNpemUoKTsgaW5kZXgrKykgewogICAgICAgICAgICAgY29uc3QgRHJtU3VwcG9ydEluZm8mIGRybVN1cHBvcnRJbmZvID0gbVN1cHBvcnRJbmZvVG9QbHVnSW5JZE1hcC5rZXlBdChpbmRleCk7CiAKICAgICAgICAgICAgIGlmIChkcm1TdXBwb3J0SW5mby5pc1N1cHBvcnRlZE1pbWVUeXBlKG1pbWVUeXBlKSkgewpAQCAtNTgxLDcgKzU4MSw3IEBACiAgICAgU3RyaW5nOCBwbHVnSW5JZCgiIik7CiAgICAgY29uc3QgU3RyaW5nOCBmaWxlU3VmZml4ID0gcGF0aC5nZXRQYXRoRXh0ZW5zaW9uKCk7CiAKLSAgICBmb3IgKHVuc2lnbmVkIGludCBpbmRleCA9IDA7IGluZGV4IDwgbVN1cHBvcnRJbmZvVG9QbHVnSW5JZE1hcC5zaXplKCk7IGluZGV4KyspIHsKKyAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgbVN1cHBvcnRJbmZvVG9QbHVnSW5JZE1hcC5zaXplKCk7IGluZGV4KyspIHsKICAgICAgICAgY29uc3QgRHJtU3VwcG9ydEluZm8mIGRybVN1cHBvcnRJbmZvID0gbVN1cHBvcnRJbmZvVG9QbHVnSW5JZE1hcC5rZXlBdChpbmRleCk7CiAKICAgICAgICAgaWYgKGRybVN1cHBvcnRJbmZvLmlzU3VwcG9ydGVkRmlsZVN1ZmZpeChmaWxlU3VmZml4KSkgewpAQCAtNTk5LDcgKzU5OSw3IEBACiAKIHZvaWQgRHJtTWFuYWdlcjo6b25JbmZvKGNvbnN0IERybUluZm9FdmVudCYgZXZlbnQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxpc3RlbmVyTG9jayk7Ci0gICAgZm9yICh1bnNpZ25lZCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IG1TZXJ2aWNlTGlzdGVuZXJzLnNpemUoKTsgaW5kZXgrKykgeworICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBtU2VydmljZUxpc3RlbmVycy5zaXplKCk7IGluZGV4KyspIHsKICAgICAgICAgaW50IHVuaXF1ZUlkID0gbVNlcnZpY2VMaXN0ZW5lcnMua2V5QXQoaW5kZXgpOwogCiAgICAgICAgIGlmICh1bmlxdWVJZCA9PSBldmVudC5nZXRVbmlxdWVJZCgpKSB7CmRpZmYgLS1naXQgYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXJTZXJ2aWNlLmNwcCBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlclNlcnZpY2UuY3BwCmluZGV4IDJiNzE5MDQuLjYzMzQxZTAgMTAwNjQ0Ci0tLSBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlclNlcnZpY2UuY3BwCisrKyBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlclNlcnZpY2UuY3BwCkBAIC0zNCw3ICszNCwxOCBAQAogc3RhdGljIFZlY3Rvcjx1aWRfdD4gdHJ1c3RlZFVpZHM7CiAKIHN0YXRpYyBib29sIGlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoKSB7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgLy8gVE9ETworICAgIC8vIEZvbGxvd2luZyBpbXBsZW1lbnRhdGlvbiBpcyBqdXN0IGZvciByZWZlcmVuY2UuCisgICAgLy8gRWFjaCBPRU0gbWFudWZhY3R1cmVyIHNob3VsZCBpbXBsZW1lbnQvcmVwbGFjZSB3aXRoIHRoZWlyIG93biBzb2x1dGlvbnMuCisgICAgSVBDVGhyZWFkU3RhdGUqIGlwY1N0YXRlID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKTsKKyAgICB1aWRfdCB1aWQgPSBpcGNTdGF0ZS0+Z2V0Q2FsbGluZ1VpZCgpOworCisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCB0cnVzdGVkVWlkcy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAodHJ1c3RlZFVpZHNbaV0gPT0gdWlkKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgRHJtTWFuYWdlclNlcnZpY2U6Omluc3RhbnRpYXRlKCkgewpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL1BsdWdJbk1hbmFnZXIuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9QbHVnSW5NYW5hZ2VyLmgKaW5kZXggN2JiMTQzZi4uYzFkMDE5YSAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL1BsdWdJbk1hbmFnZXIuaAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvUGx1Z0luTWFuYWdlci5oCkBAIC04MCw3ICs4MCw3IEBACiAgICAgICAgIFZlY3RvcjxTdHJpbmc4PiBwbHVnSW5GaWxlTGlzdCA9IGdldFBsdWdJblBhdGhMaXN0KHJzUGx1Z0luRGlyUGF0aCk7CiAKICAgICAgICAgaWYgKCFwbHVnSW5GaWxlTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgcGx1Z0luRmlsZUxpc3Quc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGx1Z0luRmlsZUxpc3Quc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgICAgICBsb2FkUGx1Z0luKHBsdWdJbkZpbGVMaXN0W2ldKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtOTEsNyArOTEsNyBAQAogICAgICAqCiAgICAgICovCiAgICAgdm9pZCB1bmxvYWRQbHVnSW5zKCkgewotICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG1fcGx1Z0luSWRMaXN0LnNpemUoKTsgKytpKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9wbHVnSW5JZExpc3Quc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgIHVubG9hZFBsdWdJbihtX3BsdWdJbklkTGlzdFtpXSk7CiAgICAgICAgIH0KICAgICAgICAgbV9wbHVnSW5JZExpc3QuY2xlYXIoKTsKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9zcmMvRndkTG9ja0VuZ2luZS5jcHAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvc3JjL0Z3ZExvY2tFbmdpbmUuY3BwCmluZGV4IDIzNGFlZjIuLmY0MDA3MzIgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9zcmMvRndkTG9ja0VuZ2luZS5jcHAKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL3NyYy9Gd2RMb2NrRW5naW5lLmNwcApAQCAtMzE2LDYgKzMxNiw3IEBACiAKICAgICBpZiAoLTEgPCBmaWxlRGVzYykgewogICAgICAgICBpZiAoRndkTG9ja0ZpbGVfYXR0YWNoKGZpbGVEZXNjKSA8IDApIHsKKyAgICAgICAgICAgIGNsb3NlKGZpbGVEZXNjKTsKICAgICAgICAgICAgIHJldHVybiBtaW1lU3RyaW5nOwogICAgICAgICB9CiAgICAgICAgIGNvbnN0IGNoYXIqIHBNaW1lVHlwZSA9IEZ3ZExvY2tGaWxlX0dldENvbnRlbnRUeXBlKGZpbGVEZXNjKTsKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0Flc0N0ckRlY3J5cHRvci5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9BZXNDdHJEZWNyeXB0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZjhkNjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9BZXNDdHJEZWNyeXB0b3IuY3BwCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNsZWFyS2V5Q3J5cHRvUGx1Z2luIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9hZXMuaD4KKworI2luY2x1ZGUgIkFlc0N0ckRlY3J5cHRvci5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtCbG9ja0JpdENvdW50ID0ga0Jsb2NrU2l6ZSAqIDg7CisKK2FuZHJvaWQ6OnN0YXR1c190IEFlc0N0ckRlY3J5cHRvcjo6ZGVjcnlwdChjb25zdCBhbmRyb2lkOjpWZWN0b3I8dWludDhfdD4mIGtleSwKKyAgICAgICAgY29uc3QgSXYgaXYsIGNvbnN0IHVpbnQ4X3QqIHNvdXJjZSwKKyAgICAgICAgdWludDhfdCogZGVzdGluYXRpb24sCisgICAgICAgIGNvbnN0IFN1YlNhbXBsZSogc3ViU2FtcGxlcywKKyAgICAgICAgc2l6ZV90IG51bVN1YlNhbXBsZXMsCisgICAgICAgIHNpemVfdCogYnl0ZXNEZWNyeXB0ZWRPdXQpIHsKKyAgICB1aW50MzJfdCBibG9ja09mZnNldCA9IDA7CisgICAgdWludDhfdCBwcmV2aW91c0VuY3J5cHRlZENvdW50ZXJba0Jsb2NrU2l6ZV07CisgICAgbWVtc2V0KHByZXZpb3VzRW5jcnlwdGVkQ291bnRlciwgMCwga0Jsb2NrU2l6ZSk7CisKKyAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICBBRVNfS0VZIG9wZW5zc2xLZXk7CisgICAgQUVTX3NldF9lbmNyeXB0X2tleShrZXkuYXJyYXkoKSwga0Jsb2NrQml0Q291bnQsICZvcGVuc3NsS2V5KTsKKyAgICBJdiBvcGVuc3NsSXY7CisgICAgbWVtY3B5KG9wZW5zc2xJdiwgaXYsIHNpemVvZihvcGVuc3NsSXYpKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU3ViU2FtcGxlczsgKytpKSB7CisgICAgICAgIGNvbnN0IFN1YlNhbXBsZSYgc3ViU2FtcGxlID0gc3ViU2FtcGxlc1tpXTsKKworICAgICAgICBpZiAoc3ViU2FtcGxlLm1OdW1CeXRlc09mQ2xlYXJEYXRhID4gMCkgeworICAgICAgICAgICAgbWVtY3B5KGRlc3RpbmF0aW9uICsgb2Zmc2V0LCBzb3VyY2UgKyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIHN1YlNhbXBsZS5tTnVtQnl0ZXNPZkNsZWFyRGF0YSk7CisgICAgICAgICAgICBvZmZzZXQgKz0gc3ViU2FtcGxlLm1OdW1CeXRlc09mQ2xlYXJEYXRhOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN1YlNhbXBsZS5tTnVtQnl0ZXNPZkVuY3J5cHRlZERhdGEgPiAwKSB7CisgICAgICAgICAgICBBRVNfY3RyMTI4X2VuY3J5cHQoc291cmNlICsgb2Zmc2V0LCBkZXN0aW5hdGlvbiArIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgc3ViU2FtcGxlLm1OdW1CeXRlc09mRW5jcnlwdGVkRGF0YSwgJm9wZW5zc2xLZXksCisgICAgICAgICAgICAgICAgICAgIG9wZW5zc2xJdiwgcHJldmlvdXNFbmNyeXB0ZWRDb3VudGVyLAorICAgICAgICAgICAgICAgICAgICAmYmxvY2tPZmZzZXQpOworICAgICAgICAgICAgb2Zmc2V0ICs9IHN1YlNhbXBsZS5tTnVtQnl0ZXNPZkVuY3J5cHRlZERhdGE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqYnl0ZXNEZWNyeXB0ZWRPdXQgPSBvZmZzZXQ7CisgICAgcmV0dXJuIGFuZHJvaWQ6Ok9LOworfQorCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQWVzQ3RyRGVjcnlwdG9yLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9BZXNDdHJEZWNyeXB0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDE2MjY2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQWVzQ3RyRGVjcnlwdG9yLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0xFQVJLRVlfQUVTX0NUUl9ERUNSWVBUT1JfSF8KKyNkZWZpbmUgQ0xFQVJLRVlfQUVTX0NUUl9ERUNSWVBUT1JfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxVdGlscy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCisjaW5jbHVkZSAiQ2xlYXJLZXlUeXBlcy5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCitjbGFzcyBBZXNDdHJEZWNyeXB0b3IgeworcHVibGljOgorICAgIEFlc0N0ckRlY3J5cHRvcigpIHt9CisKKyAgICBhbmRyb2lkOjpzdGF0dXNfdCBkZWNyeXB0KGNvbnN0IGFuZHJvaWQ6OlZlY3Rvcjx1aW50OF90PiYga2V5LCBjb25zdCBJdiBpdiwKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNvdXJjZSwgdWludDhfdCogZGVzdGluYXRpb24sCisgICAgICAgICAgICBjb25zdCBTdWJTYW1wbGUqIHN1YlNhbXBsZXMsIHNpemVfdCBudW1TdWJTYW1wbGVzLAorICAgICAgICAgICAgc2l6ZV90KiBieXRlc0RlY3J5cHRlZE91dCk7CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQWVzQ3RyRGVjcnlwdG9yKTsKK307CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCisKKyNlbmRpZiAvLyBDTEVBUktFWV9BRVNfQ1RSX0RFQ1JZUFRPUl9IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQW5kcm9pZC5tayBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJhODViNAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0FuZHJvaWQubWsKQEAgLTAsMCArMSw2MiBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgQWVzQ3RyRGVjcnlwdG9yLmNwcCBcCisgICAgQ2xlYXJLZXlVVUlELmNwcCBcCisgICAgQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmNwcCBcCisgICAgQ3J5cHRvRmFjdG9yeS5jcHAgXAorICAgIENyeXB0b1BsdWdpbi5jcHAgXAorICAgIERybUZhY3RvcnkuY3BwIFwKKyAgICBEcm1QbHVnaW4uY3BwIFwKKyAgICBJbml0RGF0YVBhcnNlci5jcHAgXAorICAgIEpzb25XZWJLZXkuY3BwIFwKKyAgICBTZXNzaW9uLmNwcCBcCisgICAgU2Vzc2lvbkxpYnJhcnkuY3BwIFwKKyAgICBVdGlscy5jcHAgXAorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICBiaW9uaWMgXAorICAgIGV4dGVybmFsL2pzbW4gXAorICAgIGV4dGVybmFsL29wZW5zc2wvaW5jbHVkZSBcCisgICAgZnJhbWV3b3Jrcy9hdi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleSBcCisgICAgZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIFwKKyAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlIFwKKworTE9DQUxfTU9EVUxFIDo9IGxpYmRybWNsZWFya2V5cGx1Z2luCisKK0xPQ0FMX1BST1BSSUVUQVJZX01PRFVMRSA6PSB0cnVlCitMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBtZWRpYWRybQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJjcnlwdG8gXAorICAgIGxpYmxvZyBcCisgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBcCisgICAgbGlidXRpbHMgXAorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJqc21uIFwKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJ1aWxkIHVuaXQgdGVzdHMKKworaW5jbHVkZSAkKExPQ0FMX1BBVEgpL3Rlc3RzL0FuZHJvaWQubWsKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5VHlwZXMuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5VHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjg5NTlhCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlUeXBlcy5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENMRUFSS0VZX1RZUEVTX0hfCisjZGVmaW5lIENMRUFSS0VZX1RZUEVTX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9DcnlwdG9BUEkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Flcy5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK2NvbnN0IHVpbnQ4X3Qga0Jsb2NrU2l6ZSA9IEFFU19CTE9DS19TSVpFOwordHlwZWRlZiB1aW50OF90IEtleUlkW2tCbG9ja1NpemVdOwordHlwZWRlZiB1aW50OF90IEl2W2tCbG9ja1NpemVdOworCit0eXBlZGVmIGFuZHJvaWQ6OkNyeXB0b1BsdWdpbjo6U3ViU2FtcGxlIFN1YlNhbXBsZTsKKwordHlwZWRlZiBhbmRyb2lkOjpLZXllZFZlY3RvcjxhbmRyb2lkOjpWZWN0b3I8dWludDhfdD4sCisgICAgICAgIGFuZHJvaWQ6OlZlY3Rvcjx1aW50OF90PiA+IEtleU1hcDsKKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KKworI2VuZGlmIC8vIENMRUFSS0VZX1RZUEVTX0hfCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleVVVSUQuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlVVUlELmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDA1MGY3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlVVUlELmNwcApAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiQ2xlYXJLZXlVVUlELmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK2Jvb2wgaXNDbGVhcktleVVVSUQoY29uc3QgdWludDhfdCB1dWlkWzE2XSkgeworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtDbGVhcktleVVVSURbMTZdID0geworICAgICAgICAweDEwLDB4NzcsMHhFRiwweEVDLDB4QzAsMHhCMiwweDRELDB4MDIsCisgICAgICAgIDB4QUMsMHhFMywweDNDLDB4MUUsMHg1MiwweEUyLDB4RkIsMHg0QgorICAgIH07CisKKyAgICByZXR1cm4gIW1lbWNtcCh1dWlkLCBrQ2xlYXJLZXlVVUlELCBzaXplb2Yoa0NsZWFyS2V5VVVJRCkpOworfQorCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlVVUlELmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApzaW1pbGFyaXR5IGluZGV4IDY3JQpyZW5hbWUgZnJvbSBsaWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKcmVuYW1lIHRvIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5VVVJRC5oCmluZGV4IDEzY2FjNmQuLmFjOTk0MTgKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5VVVJRC5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTQsMTMgKzE0LDE1IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaWZuZGVmIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSAotI2RlZmluZSBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0gKKyNpZm5kZWYgQ0xFQVJLRVlfVVVJRF9IXworI2RlZmluZSBDTEVBUktFWV9VVUlEX0hfCiAKLS8qIC0tLS0tIE1haW4gZmVhdHVyZXMgLS0tLS0gKi8KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzX01DUy5oIiAvKiBUcmFuc2NvZGVyICovCisjaW5jbHVkZSA8c3RkaW50Lmg+CiAKLS8qIC0tLS0tIEFkZC1vbnMgLS0tLS0gKi8KK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CiAKLSNlbmRpZiAvKiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0ggKi8KK2Jvb2wgaXNDbGVhcktleVVVSUQoY29uc3QgdWludDhfdCB1dWlkWzE2XSk7CiAKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCisKKyNlbmRpZiAvLyBDTEVBUktFWV9VVUlEX0hfCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuY3BwCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCA2MSUKY29weSBmcm9tIGxpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaApjb3B5IHRvIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5jcHAKaW5kZXggMTNjYWM2ZC4uZWMxNDIwZQotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDEzICsxNCwxOSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2lmbmRlZiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0gKLSNkZWZpbmUgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19ICisjaW5jbHVkZSAiQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmgiCiAKLS8qIC0tLS0tIE1haW4gZmVhdHVyZXMgLS0tLS0gKi8KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzX01DUy5oIiAvKiBUcmFuc2NvZGVyICovCisjaW5jbHVkZSAiQ3J5cHRvRmFjdG9yeS5oIgorI2luY2x1ZGUgIkRybUZhY3RvcnkuaCIKIAotLyogLS0tLS0gQWRkLW9ucyAtLS0tLSAqLworZXh0ZXJuICJDIiB7CiAKLSNlbmRpZiAvKiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0ggKi8KK2FuZHJvaWQ6OkRybUZhY3RvcnkqIGNyZWF0ZURybUZhY3RvcnkoKSB7CisgICAgcmV0dXJuIG5ldyBjbGVhcmtleWRybTo6RHJtRmFjdG9yeSgpOworfQogCithbmRyb2lkOjpDcnlwdG9GYWN0b3J5KiBjcmVhdGVDcnlwdG9GYWN0b3J5KCkgeworICAgIHJldHVybiBuZXcgY2xlYXJrZXlkcm06OkNyeXB0b0ZhY3RvcnkoKTsKK30KKworfSAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuaApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggNjAlCmNvcHkgZnJvbSBsaWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKY29weSB0byBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuaAppbmRleCAxM2NhYzZkLi5kOWFjZWMxCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDEzICsxNCwxNSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2lmbmRlZiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0gKLSNkZWZpbmUgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19ICisjaWZuZGVmIENMRUFSS0VZX0NSRUFURV9QTFVHSU5fRkFDVE9SSUVTX0hfCisjZGVmaW5lIENMRUFSS0VZX0NSRUFURV9QTFVHSU5fRkFDVE9SSUVTX0hfCiAKLS8qIC0tLS0tIE1haW4gZmVhdHVyZXMgLS0tLS0gKi8KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzX01DUy5oIiAvKiBUcmFuc2NvZGVyICovCisjaW5jbHVkZSA8bWVkaWEvZHJtL0RybUFQSS5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0NyeXB0b0FQSS5oPgogCi0vKiAtLS0tLSBBZGQtb25zIC0tLS0tICovCitleHRlcm4gIkMiIHsKKyAgICBhbmRyb2lkOjpEcm1GYWN0b3J5KiBjcmVhdGVEcm1GYWN0b3J5KCk7CisgICAgYW5kcm9pZDo6Q3J5cHRvRmFjdG9yeSogY3JlYXRlQ3J5cHRvRmFjdG9yeSgpOworfQogCi0jZW5kaWYgLyogTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19IICovCi0KKyNlbmRpZiAvLyBDTEVBUktFWV9DUkVBVEVfUExVR0lOX0ZBQ1RPUklFU19IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3J5cHRvRmFjdG9yeS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcnlwdG9GYWN0b3J5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTMxODliCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3J5cHRvRmFjdG9yeS5jcHAKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ2xlYXJLZXlDcnlwdG9QbHVnaW4iCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisKKyNpbmNsdWRlICJDcnlwdG9GYWN0b3J5LmgiCisKKyNpbmNsdWRlICJDbGVhcktleVVVSUQuaCIKKyNpbmNsdWRlICJDcnlwdG9QbHVnaW4uaCIKKyNpbmNsdWRlICJTZXNzaW9uLmgiCisjaW5jbHVkZSAiU2Vzc2lvbkxpYnJhcnkuaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKworYm9vbCBDcnlwdG9GYWN0b3J5Ojppc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdKSBjb25zdCB7CisgICAgcmV0dXJuIGlzQ2xlYXJLZXlVVUlEKHV1aWQpOworfQorCithbmRyb2lkOjpzdGF0dXNfdCBDcnlwdG9GYWN0b3J5OjpjcmVhdGVQbHVnaW4oCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sCisgICAgICAgIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplLAorICAgICAgICBhbmRyb2lkOjpDcnlwdG9QbHVnaW4qKiBwbHVnaW4pIHsKKyAgICBpZiAoIWlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQpKSB7CisgICAgICAgICpwbHVnaW4gPSBOVUxMOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6QkFEX1ZBTFVFOworICAgIH0KKworICAgIGFuZHJvaWQ6OnNwPFNlc3Npb24+IHNlc3Npb24gPSBTZXNzaW9uTGlicmFyeTo6Z2V0KCktPmZpbmRTZXNzaW9uKAorICAgICAgICAgICAgZGF0YSwgc2l6ZSk7CisgICAgKnBsdWdpbiA9IG5ldyBDcnlwdG9QbHVnaW4oc2Vzc2lvbik7CisgICAgcmV0dXJuIGFuZHJvaWQ6Ok9LOworfQorCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3J5cHRvRmFjdG9yeS5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3J5cHRvRmFjdG9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2OGJjNGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcnlwdG9GYWN0b3J5LmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0xFQVJLRVlfQ1JZUFRPX0ZBQ1RPUllfSF8KKyNkZWZpbmUgQ0xFQVJLRVlfQ1JZUFRPX0ZBQ1RPUllfSF8KKworI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0NyeXB0b0FQSS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKworY2xhc3MgQ3J5cHRvRmFjdG9yeSA6IHB1YmxpYyBhbmRyb2lkOjpDcnlwdG9GYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDcnlwdG9GYWN0b3J5KCkge30KKyAgICB2aXJ0dWFsIH5DcnlwdG9GYWN0b3J5KCkge30KKworICAgIHZpcnR1YWwgYm9vbCBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdKSBjb25zdDsKKworICAgIHZpcnR1YWwgYW5kcm9pZDo6c3RhdHVzX3QgY3JlYXRlUGx1Z2luKAorICAgICAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwKKyAgICAgICAgICAgIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgYW5kcm9pZDo6Q3J5cHRvUGx1Z2luKiogcGx1Z2luKTsKKworcHJpdmF0ZToKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDcnlwdG9GYWN0b3J5KTsKK307CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCisKKyNlbmRpZiAvLyBDTEVBUktFWV9DUllQVE9fRkFDVE9SWV9IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3J5cHRvUGx1Z2luLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NyeXB0b1BsdWdpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRhZDEzNgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NyeXB0b1BsdWdpbi5jcHAKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ2xlYXJLZXlDcnlwdG9QbHVnaW4iCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCisjaW5jbHVkZSAiQ3J5cHRvUGx1Z2luLmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK3VzaW5nIGFuZHJvaWQ6OlZlY3RvcjsKK3VzaW5nIGFuZHJvaWQ6OkFTdHJpbmc7Cit1c2luZyBhbmRyb2lkOjpzdGF0dXNfdDsKKworLy8gUmV0dXJucyBuZWdhdGl2ZSB2YWx1ZXMgZm9yIGVycm9yIGNvZGUgYW5kIHBvc2l0aXZlIHZhbHVlcyBmb3IgdGhlIHNpemUgb2YKKy8vIGRlY3J5cHRlZCBkYXRhLiAgSW4gdGhlb3J5LCB0aGUgb3V0cHV0IHNpemUgY2FuIGJlIGxhcmdlciB0aGFuIHRoZSBpbnB1dAorLy8gc2l6ZSwgYnV0IGluIHByYWN0aWNlIHRoaXMgd2lsbCBuZXZlciBoYXBwZW4gZm9yIEFFUy1DVFIuCitzc2l6ZV90IENyeXB0b1BsdWdpbjo6ZGVjcnlwdChib29sIHNlY3VyZSwgY29uc3QgS2V5SWQga2V5SWQsIGNvbnN0IEl2IGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZSBtb2RlLCBjb25zdCB2b2lkKiBzcmNQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdWJTYW1wbGUqIHN1YlNhbXBsZXMsIHNpemVfdCBudW1TdWJTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZHN0UHRyLCBBU3RyaW5nKiBlcnJvckRldGFpbE1zZykgeworICAgIGlmIChzZWN1cmUpIHsKKyAgICAgICAgZXJyb3JEZXRhaWxNc2ctPnNldFRvKCJTZWN1cmUgZGVjcnlwdGlvbiBpcyBub3Qgc3VwcG9ydGVkIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNsZWFyS2V5LiIpOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgaWYgKG1vZGUgPT0ga01vZGVfVW5lbmNyeXB0ZWQpIHsKKyAgICAgICAgc2l6ZV90IG9mZnNldCA9IDA7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU3ViU2FtcGxlczsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBTdWJTYW1wbGUmIHN1YlNhbXBsZSA9IHN1YlNhbXBsZXNbaV07CisKKyAgICAgICAgICAgIGlmIChzdWJTYW1wbGUubU51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhICE9IDApIHsKKyAgICAgICAgICAgICAgICBlcnJvckRldGFpbE1zZy0+c2V0VG8oCisgICAgICAgICAgICAgICAgICAgICAgICAiRW5jcnlwdGVkIHN1YnNhbXBsZXMgZm91bmQgaW4gYWxsZWdlZGx5IHVuZW5jcnlwdGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhLiIpOworICAgICAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fREVDUllQVDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHN1YlNhbXBsZS5tTnVtQnl0ZXNPZkNsZWFyRGF0YSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGRzdFB0cikgKyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHNyY1B0cikgKyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIHN1YlNhbXBsZS5tTnVtQnl0ZXNPZkNsZWFyRGF0YSk7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHN1YlNhbXBsZS5tTnVtQnl0ZXNPZkNsZWFyRGF0YTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3NpemVfdD4ob2Zmc2V0KTsKKyAgICB9IGVsc2UgaWYgKG1vZGUgPT0ga01vZGVfQUVTX0NUUikgeworICAgICAgICBzaXplX3QgYnl0ZXNEZWNyeXB0ZWQ7CisgICAgICAgIHN0YXR1c190IHJlcyA9IG1TZXNzaW9uLT5kZWNyeXB0KGtleUlkLCBpdiwgc3JjUHRyLCBkc3RQdHIsIHN1YlNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVN1YlNhbXBsZXMsICZieXRlc0RlY3J5cHRlZCk7CisgICAgICAgIGlmIChyZXMgPT0gYW5kcm9pZDo6T0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzc2l6ZV90PihieXRlc0RlY3J5cHRlZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlcnJvckRldGFpbE1zZy0+c2V0VG8oIkRlY3J5cHRpb24gRXJyb3IiKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzc2l6ZV90PihyZXMpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZXJyb3JEZXRhaWxNc2ctPnNldFRvKAorICAgICAgICAgICAgICAgICJTZWxlY3RlZCBlbmNyeXB0aW9uIG1vZGUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgQ2xlYXJLZXkgRFJNICIKKyAgICAgICAgICAgICAgICAiUGx1Z2luLiIpOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NyeXB0b1BsdWdpbi5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3J5cHRvUGx1Z2luLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAyZDllMAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NyeXB0b1BsdWdpbi5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENMRUFSS0VZX0NSWVBUT19QTFVHSU5fSF8KKyNkZWZpbmUgQ0xFQVJLRVlfQ1JZUFRPX1BMVUdJTl9IXworCisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvQ3J5cHRvQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKworI2luY2x1ZGUgIkNsZWFyS2V5VHlwZXMuaCIKKyNpbmNsdWRlICJTZXNzaW9uLmgiCisjaW5jbHVkZSAiVXRpbHMuaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKworY2xhc3MgQ3J5cHRvUGx1Z2luIDogcHVibGljIGFuZHJvaWQ6OkNyeXB0b1BsdWdpbiB7CitwdWJsaWM6CisgICAgQ3J5cHRvUGx1Z2luKGNvbnN0IGFuZHJvaWQ6OnNwPFNlc3Npb24+JiBzZXNzaW9uKSA6IG1TZXNzaW9uKHNlc3Npb24pIHt9CisgICAgdmlydHVhbCB+Q3J5cHRvUGx1Z2luKCkge30KKworICAgIHZpcnR1YWwgYm9vbCByZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQoY29uc3QgY2hhciogbWltZSkgY29uc3QgeworICAgICAgICBVTlVTRUQobWltZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHNzaXplX3QgZGVjcnlwdCgKKyAgICAgICAgICAgIGJvb2wgc2VjdXJlLCBjb25zdCBLZXlJZCBrZXlJZCwgY29uc3QgSXYgaXYsCisgICAgICAgICAgICBNb2RlIG1vZGUsIGNvbnN0IHZvaWQqIHNyY1B0ciwKKyAgICAgICAgICAgIGNvbnN0IFN1YlNhbXBsZSogc3ViU2FtcGxlcywgc2l6ZV90IG51bVN1YlNhbXBsZXMsCisgICAgICAgICAgICB2b2lkKiBkc3RQdHIsIGFuZHJvaWQ6OkFTdHJpbmcqIGVycm9yRGV0YWlsTXNnKTsKKworcHJpdmF0ZToKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDcnlwdG9QbHVnaW4pOworCisgICAgYW5kcm9pZDo6c3A8U2Vzc2lvbj4gbVNlc3Npb247Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQorCisjZW5kaWYgLy8gQ0xFQVJLRVlfQ1JZUFRPX1BMVUdJTl9IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvRHJtRmFjdG9yeS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Ecm1GYWN0b3J5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDI3NWNmCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvRHJtRmFjdG9yeS5jcHAKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ2xlYXJLZXlDcnlwdG9QbHVnaW4iCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworI2luY2x1ZGUgIkRybUZhY3RvcnkuaCIKKworI2luY2x1ZGUgIkRybVBsdWdpbi5oIgorI2luY2x1ZGUgIkNsZWFyS2V5VVVJRC5oIgorI2luY2x1ZGUgIlNlc3Npb25MaWJyYXJ5LmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK2Jvb2wgRHJtRmFjdG9yeTo6aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSkgeworICAgIHJldHVybiBpc0NsZWFyS2V5VVVJRCh1dWlkKTsKK30KKworYm9vbCBEcm1GYWN0b3J5Ojppc0NvbnRlbnRUeXBlU3VwcG9ydGVkKGNvbnN0IGFuZHJvaWQ6OlN0cmluZzggJmluaXREYXRhVHlwZSkgeworICAgIC8vIFRoaXMgc2hvdWxkIG1hdGNoIHRoZSB0eXBlcyBoYW5kZWQgYnkgSW5pdERhdGFQYXJzZXIuCisgICAgcmV0dXJuIGluaXREYXRhVHlwZSA9PSAiY2VuYyIgfHwKKyAgICAgICAgICAgaW5pdERhdGFUeXBlID09ICJ3ZWJtIjsKK30KKworYW5kcm9pZDo6c3RhdHVzX3QgRHJtRmFjdG9yeTo6Y3JlYXRlRHJtUGx1Z2luKAorICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBhbmRyb2lkOjpEcm1QbHVnaW4qKiBwbHVnaW4pIHsKKyAgICBpZiAoIWlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQpKSB7CisgICAgICAgICpwbHVnaW4gPSBOVUxMOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6QkFEX1ZBTFVFOworICAgIH0KKworICAgICpwbHVnaW4gPSBuZXcgRHJtUGx1Z2luKFNlc3Npb25MaWJyYXJ5OjpnZXQoKSk7CisgICAgcmV0dXJuIGFuZHJvaWQ6Ok9LOworfQorCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvRHJtRmFjdG9yeS5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvRHJtRmFjdG9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NGQzZDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Ecm1GYWN0b3J5LmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0xFQVJLRVlfRFJNX0ZBQ1RPUllfSF8KKyNkZWZpbmUgQ0xFQVJLRVlfRFJNX0ZBQ1RPUllfSF8KKworI2luY2x1ZGUgPG1lZGlhL2RybS9Ecm1BUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKyNpbmNsdWRlICJVdGlscy5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCitjbGFzcyBEcm1GYWN0b3J5IDogcHVibGljIGFuZHJvaWQ6OkRybUZhY3RvcnkgeworcHVibGljOgorICAgIERybUZhY3RvcnkoKSB7fQorICAgIHZpcnR1YWwgfkRybUZhY3RvcnkoKSB7fQorCisgICAgdmlydHVhbCBib29sIGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0pOworCisgICAgdmlydHVhbCBib29sIGlzQ29udGVudFR5cGVTdXBwb3J0ZWQoY29uc3QgYW5kcm9pZDo6U3RyaW5nOCAmaW5pdERhdGFUeXBlKTsKKworICAgIHZpcnR1YWwgYW5kcm9pZDo6c3RhdHVzX3QgY3JlYXRlRHJtUGx1Z2luKAorICAgICAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwgYW5kcm9pZDo6RHJtUGx1Z2luKiogcGx1Z2luKTsKKworcHJpdmF0ZToKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEcm1GYWN0b3J5KTsKK307CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCisKKyNlbmRpZiAvLyBDTEVBUktFWV9EUk1fRkFDVE9SWV9IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvRHJtUGx1Z2luLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybVBsdWdpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZmY2E5NAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybVBsdWdpbi5jcHAKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ2xlYXJLZXlDcnlwdG9QbHVnaW4iCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKworI2luY2x1ZGUgIkRybVBsdWdpbi5oIgorCisjaW5jbHVkZSAiU2Vzc2lvbi5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCit1c2luZyBhbmRyb2lkOjpzcDsKKworc3RhdHVzX3QgRHJtUGx1Z2luOjpvcGVuU2Vzc2lvbihWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCkgeworICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmNyZWF0ZVNlc3Npb24oKTsKKyAgICBzZXNzaW9uSWQgPSBzZXNzaW9uLT5zZXNzaW9uSWQoKTsKKyAgICByZXR1cm4gYW5kcm9pZDo6T0s7Cit9CisKK3N0YXR1c190IERybVBsdWdpbjo6Y2xvc2VTZXNzaW9uKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKSB7CisgICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24oc2Vzc2lvbklkKTsKKyAgICBtU2Vzc2lvbkxpYnJhcnktPmRlc3Ryb3lTZXNzaW9uKHNlc3Npb24pOworICAgIHJldHVybiBhbmRyb2lkOjpPSzsKK30KKworc3RhdHVzX3QgRHJtUGx1Z2luOjpnZXRLZXlSZXF1ZXN0KAorICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNjb3BlLAorICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGluaXREYXRhLAorICAgICAgICBjb25zdCBTdHJpbmc4JiBpbml0RGF0YVR5cGUsCisgICAgICAgIEtleVR5cGUga2V5VHlwZSwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4mIG9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiByZXF1ZXN0LAorICAgICAgICBTdHJpbmc4JiBkZWZhdWx0VXJsKSB7CisgICAgVU5VU0VEKG9wdGlvbmFsUGFyYW1ldGVycyk7CisgICAgaWYgKGtleVR5cGUgIT0ga0tleVR5cGVfU3RyZWFtaW5nKSB7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5maW5kU2Vzc2lvbihzY29wZSk7CisgICAgZGVmYXVsdFVybC5jbGVhcigpOworICAgIHJldHVybiBzZXNzaW9uLT5nZXRLZXlSZXF1ZXN0KGluaXREYXRhLCBpbml0RGF0YVR5cGUsICZyZXF1ZXN0KTsKK30KKworc3RhdHVzX3QgRHJtUGx1Z2luOjpwcm92aWRlS2V5UmVzcG9uc2UoCisgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2NvcGUsCisgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgcmVzcG9uc2UsCisgICAgICAgIFZlY3Rvcjx1aW50OF90PiYga2V5U2V0SWQpIHsKKyAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5maW5kU2Vzc2lvbihzY29wZSk7CisgICAgc3RhdHVzX3QgcmVzID0gc2Vzc2lvbi0+cHJvdmlkZUtleVJlc3BvbnNlKHJlc3BvbnNlKTsKKyAgICBpZiAocmVzID09IGFuZHJvaWQ6Ok9LKSB7CisgICAgICAgIGtleVNldElkLmNsZWFyKCk7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3N0YXR1c190IERybVBsdWdpbjo6Z2V0UHJvcGVydHlTdHJpbmcoCisgICAgICAgIGNvbnN0IFN0cmluZzgmIG5hbWUsIFN0cmluZzgmIHZhbHVlKSBjb25zdCB7CisgICAgaWYgKG5hbWUgPT0gInZlbmRvciIpIHsKKyAgICAgICAgdmFsdWUgPSAiR29vZ2xlIjsKKyAgICB9IGVsc2UgaWYgKG5hbWUgPT0gInZlcnNpb24iKSB7CisgICAgICAgIHZhbHVlID0gIjEuMCI7CisgICAgfSBlbHNlIGlmIChuYW1lID09ICJkZXNjcmlwdGlvbiIpIHsKKyAgICAgICAgdmFsdWUgPSAiQ2xlYXJLZXkgQ0RNIjsKKyAgICB9IGVsc2UgaWYgKG5hbWUgPT0gImFsZ29yaXRobXMiKSB7CisgICAgICAgIHZhbHVlID0gIiI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkFwcCByZXF1ZXN0ZWQgdW5rbm93biBzdHJpbmcgcHJvcGVydHkgJXMiLCBuYW1lLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKyAgICByZXR1cm4gYW5kcm9pZDo6T0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvRHJtUGx1Z2luLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Ecm1QbHVnaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2RmOWNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvRHJtUGx1Z2luLmgKQEAgLTAsMCArMSwyMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENMRUFSS0VZX0RSTV9QTFVHSU5fSF8KKyNkZWZpbmUgQ0xFQVJLRVlfRFJNX1BMVUdJTl9IXworCisjaW5jbHVkZSA8bWVkaWEvZHJtL0RybUFQSS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworI2luY2x1ZGUgIlNlc3Npb25MaWJyYXJ5LmgiCisjaW5jbHVkZSAiVXRpbHMuaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKwordXNpbmcgYW5kcm9pZDo6S2V5ZWRWZWN0b3I7Cit1c2luZyBhbmRyb2lkOjpMaXN0OwordXNpbmcgYW5kcm9pZDo6c3RhdHVzX3Q7Cit1c2luZyBhbmRyb2lkOjpTdHJpbmc4OwordXNpbmcgYW5kcm9pZDo6VmVjdG9yOworCitjbGFzcyBEcm1QbHVnaW4gOiBwdWJsaWMgYW5kcm9pZDo6RHJtUGx1Z2luIHsKK3B1YmxpYzoKKyAgICBEcm1QbHVnaW4oU2Vzc2lvbkxpYnJhcnkqIHNlc3Npb25MaWJyYXJ5KQorICAgICAgICAgICAgOiBtU2Vzc2lvbkxpYnJhcnkoc2Vzc2lvbkxpYnJhcnkpIHt9CisgICAgdmlydHVhbCB+RHJtUGx1Z2luKCkge30KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlblNlc3Npb24oVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZVNlc3Npb24oY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRLZXlSZXF1ZXN0KAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzY29wZSwKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGEsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBpbml0RGF0YVR5cGUsCisgICAgICAgICAgICBLZXlUeXBlIGtleVR5cGUsCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiYgb3B0aW9uYWxQYXJhbWV0ZXJzLAorICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiByZXF1ZXN0LAorICAgICAgICAgICAgU3RyaW5nOCYgZGVmYXVsdFVybCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHByb3ZpZGVLZXlSZXNwb25zZSgKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2NvcGUsCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHJlc3BvbnNlLAorICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBrZXlTZXRJZCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUtleXMoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIHsKKyAgICAgICAgVU5VU0VEKHNlc3Npb25JZCk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3RvcmVLZXlzKAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGtleVNldElkKSB7CisgICAgICAgIFVOVVNFRChzZXNzaW9uSWQpOworICAgICAgICBVTlVTRUQoa2V5U2V0SWQpOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeUtleVN0YXR1cygKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4mIGluZm9NYXApIGNvbnN0IHsKKyAgICAgICAgVU5VU0VEKHNlc3Npb25JZCk7CisgICAgICAgIFVOVVNFRChpbmZvTWFwKTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvdmlzaW9uUmVxdWVzdCgKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNlcnRfdHlwZSwKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNlcnRfYXV0aG9yaXR5LAorICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiByZXF1ZXN0LAorICAgICAgICAgICAgU3RyaW5nOCYgZGVmYXVsdFVybCkgeworICAgICAgICBVTlVTRUQoY2VydF90eXBlKTsKKyAgICAgICAgVU5VU0VEKGNlcnRfYXV0aG9yaXR5KTsKKyAgICAgICAgVU5VU0VEKHJlcXVlc3QpOworICAgICAgICBVTlVTRUQoZGVmYXVsdFVybCk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHByb3ZpZGVQcm92aXNpb25SZXNwb25zZSgKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgcmVzcG9uc2UsCisgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIGNlcnRpZmljYXRlLAorICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiB3cmFwcGVkS2V5KSB7CisgICAgICAgIFVOVVNFRChyZXNwb25zZSk7CisgICAgICAgIFVOVVNFRChjZXJ0aWZpY2F0ZSk7CisgICAgICAgIFVOVVNFRCh3cmFwcGVkS2V5KTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5wcm92aXNpb25EZXZpY2UoKSB7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyZVN0b3BzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+ID4mIHNlY3VyZVN0b3BzKSB7CisgICAgICAgIFVOVVNFRChzZWN1cmVTdG9wcyk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VTZWN1cmVTdG9wcyhjb25zdCBWZWN0b3I8dWludDhfdD4mIHNzUmVsZWFzZSkgeworICAgICAgICBVTlVTRUQoc3NSZWxlYXNlKTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvcGVydHlTdHJpbmcoCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBuYW1lLCBTdHJpbmc4JiB2YWx1ZSkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3BlcnR5Qnl0ZUFycmF5KAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgbmFtZSwgVmVjdG9yPHVpbnQ4X3Q+JiB2YWx1ZSkgY29uc3QgeworICAgICAgICBVTlVTRUQobmFtZSk7CisgICAgICAgIFVOVVNFRCh2YWx1ZSk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByb3BlcnR5U3RyaW5nKAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgbmFtZSwgY29uc3QgU3RyaW5nOCYgdmFsdWUpIHsKKyAgICAgICAgVU5VU0VEKG5hbWUpOworICAgICAgICBVTlVTRUQodmFsdWUpOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcm9wZXJ0eUJ5dGVBcnJheSgKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG5hbWUsIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgdmFsdWUpIHsKKyAgICAgICAgVU5VU0VEKG5hbWUpOworICAgICAgICBVTlVTRUQodmFsdWUpOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDaXBoZXJBbGdvcml0aG0oCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCwgY29uc3QgU3RyaW5nOCYgYWxnb3JpdGhtKSB7CisgICAgICAgIFVOVVNFRChzZXNzaW9uSWQpOworICAgICAgICBVTlVTRUQoYWxnb3JpdGhtKTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFjQWxnb3JpdGhtKAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsIGNvbnN0IFN0cmluZzgmIGFsZ29yaXRobSkgeworICAgICAgICBVTlVTRUQoc2Vzc2lvbklkKTsKKyAgICAgICAgVU5VU0VEKGFsZ29yaXRobSk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGVuY3J5cHQoCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYga2V5SWQsCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGlucHV0LAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBpdiwKKyAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgb3V0cHV0KSB7CisgICAgICAgIFVOVVNFRChzZXNzaW9uSWQpOworICAgICAgICBVTlVTRUQoa2V5SWQpOworICAgICAgICBVTlVTRUQoaW5wdXQpOworICAgICAgICBVTlVTRUQoaXYpOworICAgICAgICBVTlVTRUQob3V0cHV0KTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVjcnlwdCgKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBrZXlJZCwKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgaW5wdXQsCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGl2LAorICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBvdXRwdXQpIHsKKyAgICAgICAgVU5VU0VEKHNlc3Npb25JZCk7CisgICAgICAgIFVOVVNFRChrZXlJZCk7CisgICAgICAgIFVOVVNFRChpbnB1dCk7CisgICAgICAgIFVOVVNFRChpdik7CisgICAgICAgIFVOVVNFRChvdXRwdXQpOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzaWduKAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGtleUlkLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBtZXNzYWdlLAorICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBzaWduYXR1cmUpIHsKKyAgICAgICAgVU5VU0VEKHNlc3Npb25JZCk7CisgICAgICAgIFVOVVNFRChrZXlJZCk7CisgICAgICAgIFVOVVNFRChtZXNzYWdlKTsKKyAgICAgICAgVU5VU0VEKHNpZ25hdHVyZSk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHZlcmlmeSgKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBrZXlJZCwKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgbWVzc2FnZSwKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2lnbmF0dXJlLCBib29sJiBtYXRjaCkgeworICAgICAgICBVTlVTRUQoc2Vzc2lvbklkKTsKKyAgICAgICAgVU5VU0VEKGtleUlkKTsKKyAgICAgICAgVU5VU0VEKG1lc3NhZ2UpOworICAgICAgICBVTlVTRUQoc2lnbmF0dXJlKTsKKyAgICAgICAgVU5VU0VEKG1hdGNoKTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2lnblJTQSgKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWxnb3JpdGhtLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBtZXNzYWdlLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiB3cmFwcGVkS2V5LAorICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBzaWduYXR1cmUpIHsKKyAgICAgICAgVU5VU0VEKHNlc3Npb25JZCk7CisgICAgICAgIFVOVVNFRChhbGdvcml0aG0pOworICAgICAgICBVTlVTRUQobWVzc2FnZSk7CisgICAgICAgIFVOVVNFRCh3cmFwcGVkS2V5KTsKKyAgICAgICAgVU5VU0VEKHNpZ25hdHVyZSk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRHJtUGx1Z2luKTsKKworICAgIFNlc3Npb25MaWJyYXJ5KiBtU2Vzc2lvbkxpYnJhcnk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQorCisjZW5kaWYgLy8gQ0xFQVJLRVlfRFJNX1BMVUdJTl9IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvSW5pdERhdGFQYXJzZXIuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvSW5pdERhdGFQYXJzZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMmQ3M2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Jbml0RGF0YVBhcnNlci5jcHAKQEAgLTAsMCArMSwxNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNsZWFyS2V5Q3J5cHRvUGx1Z2luIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8ZW5kaWFuLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiSW5pdERhdGFQYXJzZXIuaCIKKworI2luY2x1ZGUgIkNsZWFyS2V5VVVJRC5oIgorI2luY2x1ZGUgIlV0aWxzLmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK3VzaW5nIGFuZHJvaWQ6OkFTdHJpbmc7Cit1c2luZyBhbmRyb2lkOjpTdHJpbmc4OwordXNpbmcgYW5kcm9pZDo6VmVjdG9yOworCituYW1lc3BhY2UgeworICAgIGNvbnN0IHNpemVfdCBrS2V5SWRTaXplID0gMTY7CisgICAgY29uc3Qgc2l6ZV90IGtTeXN0ZW1JZFNpemUgPSAxNjsKK30KKworYW5kcm9pZDo6c3RhdHVzX3QgSW5pdERhdGFQYXJzZXI6OnBhcnNlKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGEsCisgICAgICAgIGNvbnN0IFN0cmluZzgmIGluaXREYXRhVHlwZSwKKyAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+KiBsaWNlbnNlUmVxdWVzdCkgeworICAgIC8vIEJ1aWxkIGEgbGlzdCBvZiB0aGUga2V5IElEcworICAgIFZlY3Rvcjxjb25zdCB1aW50OF90Kj4ga2V5SWRzOworICAgIGlmIChpbml0RGF0YVR5cGUgPT0gImNlbmMiKSB7CisgICAgICAgIGFuZHJvaWQ6OnN0YXR1c190IHJlcyA9IHBhcnNlUHNzaChpbml0RGF0YSwgJmtleUlkcyk7CisgICAgICAgIGlmIChyZXMgIT0gYW5kcm9pZDo6T0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGluaXREYXRhVHlwZSA9PSAid2VibSIpIHsKKyAgICAgICAgLy8gV2ViTSAiaW5pdCBkYXRhIiBpcyBqdXN0IGEgc2luZ2xlIGtleSBJRAorICAgICAgICBpZiAoaW5pdERhdGEuc2l6ZSgpICE9IGtLZXlJZFNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICAgICAgfQorICAgICAgICBrZXlJZHMucHVzaChpbml0RGF0YS5hcnJheSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgLy8gQnVpbGQgdGhlIHJlcXVlc3QKKyAgICBTdHJpbmc4IHJlcXVlc3RKc29uID0gZ2VuZXJhdGVSZXF1ZXN0KGtleUlkcyk7CisgICAgbGljZW5zZVJlcXVlc3QtPmNsZWFyKCk7CisgICAgbGljZW5zZVJlcXVlc3QtPmFwcGVuZEFycmF5KAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmVxdWVzdEpzb24uc3RyaW5nKCkpLAorICAgICAgICAgICAgcmVxdWVzdEpzb24uc2l6ZSgpKTsKKyAgICByZXR1cm4gYW5kcm9pZDo6T0s7Cit9CisKK2FuZHJvaWQ6OnN0YXR1c190IEluaXREYXRhUGFyc2VyOjpwYXJzZVBzc2goY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKKyAgICAgICAgVmVjdG9yPGNvbnN0IHVpbnQ4X3QqPioga2V5SWRzKSB7CisgICAgc2l6ZV90IHJlYWRQb3NpdGlvbiA9IDA7CisKKyAgICAvLyBWYWxpZGF0ZSBzaXplIGZpZWxkCisgICAgdWludDMyX3QgZXhwZWN0ZWRTaXplID0gaW5pdERhdGEuc2l6ZSgpOworICAgIGV4cGVjdGVkU2l6ZSA9IGh0b25sKGV4cGVjdGVkU2l6ZSk7CisgICAgaWYgKG1lbWNtcCgmaW5pdERhdGFbcmVhZFBvc2l0aW9uXSwgJmV4cGVjdGVkU2l6ZSwKKyAgICAgICAgICAgICAgIHNpemVvZihleHBlY3RlZFNpemUpKSAhPSAwKSB7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisgICAgcmVhZFBvc2l0aW9uICs9IHNpemVvZihleHBlY3RlZFNpemUpOworCisgICAgLy8gVmFsaWRhdGUgUFNTSCBib3ggaWRlbnRpZmllcgorICAgIGNvbnN0IGNoYXIgcHNzaElkZW50aWZpZXJbNF0gPSB7J3AnLCAncycsICdzJywgJ2gnfTsKKyAgICBpZiAobWVtY21wKCZpbml0RGF0YVtyZWFkUG9zaXRpb25dLCBwc3NoSWRlbnRpZmllciwKKyAgICAgICAgICAgICAgIHNpemVvZihwc3NoSWRlbnRpZmllcikpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKyAgICByZWFkUG9zaXRpb24gKz0gc2l6ZW9mKHBzc2hJZGVudGlmaWVyKTsKKworICAgIC8vIFZhbGlkYXRlIEVNRSB2ZXJzaW9uIG51bWJlcgorICAgIGNvbnN0IHVpbnQ4X3QgcHNzaFZlcnNpb24xWzRdID0gezEsIDAsIDAsIDB9OworICAgIGlmIChtZW1jbXAoJmluaXREYXRhW3JlYWRQb3NpdGlvbl0sIHBzc2hWZXJzaW9uMSwKKyAgICAgICAgICAgICAgIHNpemVvZihwc3NoVmVyc2lvbjEpKSAhPSAwKSB7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisgICAgcmVhZFBvc2l0aW9uICs9IHNpemVvZihwc3NoVmVyc2lvbjEpOworCisgICAgLy8gVmFsaWRhdGUgc3lzdGVtIElECisgICAgaWYgKCFpc0NsZWFyS2V5VVVJRCgmaW5pdERhdGFbcmVhZFBvc2l0aW9uXSkpIHsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKyAgICByZWFkUG9zaXRpb24gKz0ga1N5c3RlbUlkU2l6ZTsKKworICAgIC8vIFJlYWQga2V5IElEIGNvdW50CisgICAgdWludDMyX3Qga2V5SWRDb3VudDsKKyAgICBtZW1jcHkoJmtleUlkQ291bnQsICZpbml0RGF0YVtyZWFkUG9zaXRpb25dLCBzaXplb2Yoa2V5SWRDb3VudCkpOworICAgIGtleUlkQ291bnQgPSBudG9obChrZXlJZENvdW50KTsKKyAgICByZWFkUG9zaXRpb24gKz0gc2l6ZW9mKGtleUlkQ291bnQpOworICAgIGlmIChyZWFkUG9zaXRpb24gKyAoa2V5SWRDb3VudCAqIGtLZXlJZFNpemUpICE9CisgICAgICAgICAgICBpbml0RGF0YS5zaXplKCkgLSBzaXplb2YodWludDMyX3QpKSB7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICAvLyBDYWxjdWxhdGUgdGhlIGtleSBJRCBvZmZzZXRzCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGtleUlkQ291bnQ7ICsraSkgeworICAgICAgICBzaXplX3Qga2V5SWRQb3NpdGlvbiA9IHJlYWRQb3NpdGlvbiArIChpICoga0tleUlkU2l6ZSk7CisgICAgICAgIGtleUlkcy0+cHVzaCgmaW5pdERhdGFba2V5SWRQb3NpdGlvbl0pOworICAgIH0KKyAgICByZXR1cm4gYW5kcm9pZDo6T0s7Cit9CisKK1N0cmluZzggSW5pdERhdGFQYXJzZXI6OmdlbmVyYXRlUmVxdWVzdChjb25zdCBWZWN0b3I8Y29uc3QgdWludDhfdCo+JiBrZXlJZHMpIHsKKyAgICBjb25zdCBTdHJpbmc4IGtSZXF1ZXN0UHJlZml4KCJ7XCJraWRzXCI6WyIpOworICAgIGNvbnN0IFN0cmluZzgga1JlcXVlc3RTdWZmaXgoIl0sXCJ0eXBlXCI6XCJ0ZW1wb3JhcnlcIn0iKTsKKyAgICBjb25zdCBTdHJpbmc4IGtCYXNlNjRQYWRkaW5nKCI9Iik7CisKKyAgICBTdHJpbmc4IHJlcXVlc3Qoa1JlcXVlc3RQcmVmaXgpOworICAgIEFTdHJpbmcgZW5jb2RlZElkOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga2V5SWRzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGVuY29kZWRJZC5jbGVhcigpOworICAgICAgICBhbmRyb2lkOjplbmNvZGVCYXNlNjQoa2V5SWRzW2ldLCBrS2V5SWRTaXplLCAmZW5jb2RlZElkKTsKKyAgICAgICAgaWYgKGkgIT0gMCkgeworICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIiwiKTsKKyAgICAgICAgfQorICAgICAgICByZXF1ZXN0LmFwcGVuZEZvcm1hdCgiXCIlc1wiIiwgZW5jb2RlZElkLmNfc3RyKCkpOworICAgIH0KKyAgICByZXF1ZXN0LmFwcGVuZChrUmVxdWVzdFN1ZmZpeCk7CisKKyAgICAvLyBBbmRyb2lkJ3MgQmFzZTY0IGVuY29kZXIgcHJvZHVjZXMgcGFkZGluZy4gRU1FIGZvcmJpZHMgcGFkZGluZy4KKyAgICByZXF1ZXN0LnJlbW92ZUFsbChrQmFzZTY0UGFkZGluZyk7CisgICAgcmV0dXJuIHJlcXVlc3Q7Cit9CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Jbml0RGF0YVBhcnNlci5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvSW5pdERhdGFQYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTA1ZDJhCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvSW5pdERhdGFQYXJzZXIuaApAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDTEVBUktFWV9JTklUX0RBVEFfUEFSU0VSX0hfCisjZGVmaW5lIENMRUFSS0VZX0lOSVRfREFUQV9QQVJTRVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK2NsYXNzIEluaXREYXRhUGFyc2VyIHsKK3B1YmxpYzoKKyAgICBJbml0RGF0YVBhcnNlcigpIHt9CisKKyAgICBhbmRyb2lkOjpzdGF0dXNfdCBwYXJzZShjb25zdCBhbmRyb2lkOjpWZWN0b3I8dWludDhfdD4mIGluaXREYXRhLAorICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6U3RyaW5nOCYgaW5pdERhdGFUeXBlLAorICAgICAgICAgICAgYW5kcm9pZDo6VmVjdG9yPHVpbnQ4X3Q+KiBsaWNlbnNlUmVxdWVzdCk7CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSW5pdERhdGFQYXJzZXIpOworCisgICAgYW5kcm9pZDo6c3RhdHVzX3QgcGFyc2VQc3NoKGNvbnN0IGFuZHJvaWQ6OlZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGEsCisgICAgICAgICAgICBhbmRyb2lkOjpWZWN0b3I8Y29uc3QgdWludDhfdCo+KiBrZXlJZHMpOworCisgICAgYW5kcm9pZDo6U3RyaW5nOCBnZW5lcmF0ZVJlcXVlc3QoCisgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpWZWN0b3I8Y29uc3QgdWludDhfdCo+JiBrZXlJZHMpOworfTsKKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KKworI2VuZGlmIC8vIENMRUFSS0VZX0lOSVRfREFUQV9QQVJTRVJfSF8KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0pzb25XZWJLZXkuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvSnNvbldlYktleS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNmZmFlNAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0pzb25XZWJLZXkuY3BwCkBAIC0wLDAgKzEsMjY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgTE9HX1RBRyAiSnNvbldlYktleSIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0Lmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJKc29uV2ViS2V5LmgiCisKK25hbWVzcGFjZSB7Citjb25zdCBhbmRyb2lkOjpTdHJpbmc4IGtLZXlzVGFnKCJrZXlzIik7Citjb25zdCBhbmRyb2lkOjpTdHJpbmc4IGtLZXlUeXBlVGFnKCJrdHkiKTsKK2NvbnN0IGFuZHJvaWQ6OlN0cmluZzgga1N5bW1ldHJpY0tleVZhbHVlKCJvY3QiKTsKK2NvbnN0IGFuZHJvaWQ6OlN0cmluZzgga0tleVRhZygiayIpOworY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrS2V5SWRUYWcoImtpZCIpOworY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrQmFzZTY0UGFkZGluZygiPSIpOworfQorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCit1c2luZyBhbmRyb2lkOjpBQnVmZmVyOwordXNpbmcgYW5kcm9pZDo6QVN0cmluZzsKKworSnNvbldlYktleTo6SnNvbldlYktleSgpIHsKK30KKworSnNvbldlYktleTo6fkpzb25XZWJLZXkoKSB7Cit9CisKKy8qCisgKiBQYXJzZXMgYSBKU09OIFdlYiBLZXkgU2V0IHN0cmluZywgaW5pdGlhbGl6ZXMgYSBLZXlNYXAgd2l0aCBrZXkgaWQ6a2V5CisgKiBwYWlycyBmcm9tIHRoZSBKU09OIFdlYiBLZXkgU2V0LiBCb3RoIGtleSBpZHMgYW5kIGtleXMgYXJlIGJhc2U2NHVybAorICogZW5jb2RlZC4gVGhlIEtleU1hcCBjb250YWlucyBiYXNlNjR1cmwgZGVjb2RlZCBrZXkgaWQ6a2V5IHBhaXJzLgorICoKKyAqIEByZXR1cm4gUmV0dXJucyBmYWxzZSBmb3IgZXJyb3JzLCB0cnVlIGZvciBzdWNjZXNzLgorICovCitib29sIEpzb25XZWJLZXk6OmV4dHJhY3RLZXlzRnJvbUpzb25XZWJLZXlTZXQoY29uc3QgU3RyaW5nOCYganNvbldlYktleVNldCwKKyAgICAgICAgS2V5TWFwKiBrZXlzKSB7CisKKyAgICBrZXlzLT5jbGVhcigpOworICAgIGlmICghcGFyc2VKc29uV2ViS2V5U2V0KGpzb25XZWJLZXlTZXQsICZtSnNvbk9iamVjdHMpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBtSnNvbk9iamVjdHNbMF0gY29udGFpbnMgdGhlIGVudGlyZSBKU09OIFdlYiBLZXkgU2V0LCBpbmNsdWRpbmcKKyAgICAvLyBhbGwgdGhlIGJhc2U2NCBlbmNvZGVkIGtleXMuIEVhY2gga2V5IGlzIGFsc28gc3RvcmVkIHNlcGFyYXRlbHkgYXMKKyAgICAvLyBhIEpTT04gb2JqZWN0IGluIG1Kc29uT2JqZWN0c1sxLi5uXSB3aGVyZSBuIGlzIHRoZSB0b3RhbAorICAgIC8vIG51bWJlciBvZiBrZXlzIGluIHRoZSBzZXQuCisgICAgaWYgKCFpc0pzb25XZWJLZXlTZXQobUpzb25PYmplY3RzWzBdKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgU3RyaW5nOCBlbmNvZGVkS2V5LCBlbmNvZGVkS2V5SWQ7CisgICAgVmVjdG9yPHVpbnQ4X3Q+IGRlY29kZWRLZXksIGRlY29kZWRLZXlJZDsKKworICAgIC8vIG1Kc29uT2JqZWN0c1sxXSBjb250YWlucyB0aGUgZmlyc3QgSlNPTiBXZWIgS2V5IGluIHRoZSBzZXQKKyAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IG1Kc29uT2JqZWN0cy5zaXplKCk7ICsraSkgeworICAgICAgICBlbmNvZGVkS2V5SWQuY2xlYXIoKTsKKyAgICAgICAgZW5jb2RlZEtleS5jbGVhcigpOworCisgICAgICAgIGlmICghcGFyc2VKc29uT2JqZWN0KG1Kc29uT2JqZWN0c1tpXSwgJm1Ub2tlbnMpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmIChmaW5kS2V5KG1Kc29uT2JqZWN0c1tpXSwgJmVuY29kZWRLZXlJZCwgJmVuY29kZWRLZXkpKSB7CisgICAgICAgICAgICBpZiAoZW5jb2RlZEtleUlkLmlzRW1wdHkoKSB8fCBlbmNvZGVkS2V5LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJNdXN0IGhhdmUgYm90aCBrZXkgaWQgYW5kIGtleSBpbiB0aGUgSnNvbldlYktleSBzZXQuIik7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghZGVjb2RlQmFzZTY0U3RyaW5nKGVuY29kZWRLZXlJZCwgJmRlY29kZWRLZXlJZCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGRlY29kZSBrZXkgaWQoJXMpIiwgZW5jb2RlZEtleUlkLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFkZWNvZGVCYXNlNjRTdHJpbmcoZW5jb2RlZEtleSwgJmRlY29kZWRLZXkpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBkZWNvZGUga2V5KCVzKSIsIGVuY29kZWRLZXkuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBrZXlzLT5hZGQoZGVjb2RlZEtleUlkLCBkZWNvZGVkS2V5KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBKc29uV2ViS2V5OjpkZWNvZGVCYXNlNjRTdHJpbmcoY29uc3QgU3RyaW5nOCYgZW5jb2RlZFRleHQsCisgICAgICAgIFZlY3Rvcjx1aW50OF90PiogZGVjb2RlZFRleHQpIHsKKworICAgIGRlY29kZWRUZXh0LT5jbGVhcigpOworCisgICAgLy8gZW5jb2RlZFRleHQgc2hvdWxkIG5vdCBjb250YWluIHBhZGRpbmcgY2hhcmFjdGVycyBhcyBwZXIgRU1FIHNwZWMuCisgICAgaWYgKGVuY29kZWRUZXh0LmZpbmQoa0Jhc2U2NFBhZGRpbmcpICE9IC0xKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBTaW5jZSBhbmRyb2lkOjpkZWNvZGVCYXNlNjQoKSByZXF1aXJlcyBwYWRkaW5nIGNoYXJhY3RlcnMsCisgICAgLy8gYWRkIHRoZW0gc28gbGVuZ3RoIG9mIGVuY29kZWRUZXh0IGlzIGV4YWN0bHkgYSBtdWx0aXBsZSBvZiA0LgorICAgIGludCByZW1haW5kZXIgPSBlbmNvZGVkVGV4dC5sZW5ndGgoKSAlIDQ7CisgICAgU3RyaW5nOCBwYWRkZWRUZXh0KGVuY29kZWRUZXh0KTsKKyAgICBpZiAocmVtYWluZGVyID4gMCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQgLSByZW1haW5kZXI7ICsraSkgeworICAgICAgICAgICAgcGFkZGVkVGV4dC5hcHBlbmQoa0Jhc2U2NFBhZGRpbmcpOworICAgICAgICB9CisgICAgfQorCisgICAgYW5kcm9pZDo6c3A8QUJ1ZmZlcj4gYnVmZmVyID0KKyAgICAgICAgICAgIGFuZHJvaWQ6OmRlY29kZUJhc2U2NChBU3RyaW5nKHBhZGRlZFRleHQuc3RyaW5nKCkpKTsKKyAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIk1hbGZvcm1lZCBiYXNlNjQgZW5jb2RlZCBjb250ZW50IGZvdW5kLiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZGVjb2RlZFRleHQtPmFwcGVuZEFycmF5KGJ1ZmZlci0+YmFzZSgpLCBidWZmZXItPnNpemUoKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSnNvbldlYktleTo6ZmluZEtleShjb25zdCBTdHJpbmc4JiBqc29uT2JqZWN0LCBTdHJpbmc4KiBrZXlJZCwKKyAgICAgICAgU3RyaW5nOCogZW5jb2RlZEtleSkgeworCisgICAgU3RyaW5nOCBrZXksIHZhbHVlOworCisgICAgLy8gT25seSBhbGxvdyBzeW1tZXRyaWMga2V5LCBpLmUuICJrdHkiOiJvY3QiIHBhaXIuCisgICAgaWYgKGpzb25PYmplY3QuZmluZChrS2V5VHlwZVRhZykgPj0gMCkgeworICAgICAgICBmaW5kVmFsdWUoa0tleVR5cGVUYWcsICZ2YWx1ZSk7CisgICAgICAgIGlmICgwICE9IHZhbHVlLmNvbXBhcmUoa1N5bW1ldHJpY0tleVZhbHVlKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoanNvbk9iamVjdC5maW5kKGtLZXlJZFRhZykgPj0gMCkgeworICAgICAgICBmaW5kVmFsdWUoa0tleUlkVGFnLCBrZXlJZCk7CisgICAgfQorCisgICAgaWYgKGpzb25PYmplY3QuZmluZChrS2V5VGFnKSA+PSAwKSB7CisgICAgICAgIGZpbmRWYWx1ZShrS2V5VGFnLCBlbmNvZGVkS2V5KTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgSnNvbldlYktleTo6ZmluZFZhbHVlKGNvbnN0IFN0cmluZzggJmtleSwgU3RyaW5nOCogdmFsdWUpIHsKKyAgICB2YWx1ZS0+Y2xlYXIoKTsKKyAgICBjb25zdCBjaGFyKiB2YWx1ZVRva2VuOworICAgIGZvciAoVmVjdG9yPFN0cmluZzg+Ojpjb25zdF9pdGVyYXRvciBuZXh0VG9rZW4gPSBtVG9rZW5zLmJlZ2luKCk7CisgICAgICAgIG5leHRUb2tlbiAhPSBtVG9rZW5zLmVuZCgpOyArK25leHRUb2tlbikgeworICAgICAgICBpZiAoMCA9PSAoKm5leHRUb2tlbikuY29tcGFyZShrZXkpKSB7CisgICAgICAgICAgICBpZiAobmV4dFRva2VuICsgMSA9PSBtVG9rZW5zLmVuZCgpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgdmFsdWVUb2tlbiA9ICgqKG5leHRUb2tlbiArIDEpKS5zdHJpbmcoKTsKKyAgICAgICAgICAgIHZhbHVlLT5zZXRUbyh2YWx1ZVRva2VuKTsKKyAgICAgICAgICAgIG5leHRUb2tlbisrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgSnNvbldlYktleTo6aXNKc29uV2ViS2V5U2V0KGNvbnN0IFN0cmluZzgmIGpzb25PYmplY3QpIGNvbnN0IHsKKyAgICBpZiAoanNvbk9iamVjdC5maW5kKGtLZXlzVGFnKSA9PSAtMSkgeworICAgICAgICBBTE9HRSgiSlNPTiBXZWIgS2V5IGRvZXMgbm90IGNvbnRhaW4ga2V5cy4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIFBhcnNlcyBhIEpTT04gb2JqZWN0cyBzdHJpbmcgYW5kIGluaXRpYWxpemVzIGEgdmVjdG9yIG9mIHRva2Vucy4KKyAqCisgKiBAcmV0dXJuIFJldHVybnMgZmFsc2UgZm9yIGVycm9ycywgdHJ1ZSBmb3Igc3VjY2Vzcy4KKyAqLworYm9vbCBKc29uV2ViS2V5OjpwYXJzZUpzb25PYmplY3QoY29uc3QgU3RyaW5nOCYganNvbk9iamVjdCwKKyAgICAgICAgVmVjdG9yPFN0cmluZzg+KiB0b2tlbnMpIHsKKyAgICBqc21uX3BhcnNlciBwYXJzZXI7CisKKyAgICBqc21uX2luaXQoJnBhcnNlcik7CisgICAgaW50IG51bVRva2VucyA9IGpzbW5fcGFyc2UoJnBhcnNlciwKKyAgICAgICAganNvbk9iamVjdC5zdHJpbmcoKSwganNvbk9iamVjdC5zaXplKCksIE5VTEwsIDApOworICAgIGlmIChudW1Ub2tlbnMgPCAwKSB7CisgICAgICAgIEFMT0dFKCJQYXJzZXIgcmV0dXJucyBlcnJvciBjb2RlPSVkIiwgbnVtVG9rZW5zKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVuc2lnbmVkIGludCBqc21uVG9rZW5zU2l6ZSA9IG51bVRva2VucyAqIHNpemVvZihqc21udG9rX3QpOworICAgIG1Kc21uVG9rZW5zLmNsZWFyKCk7CisgICAgbUpzbW5Ub2tlbnMuc2V0Q2FwYWNpdHkoanNtblRva2Vuc1NpemUpOworCisgICAganNtbl9pbml0KCZwYXJzZXIpOworICAgIGludCBzdGF0dXMgPSBqc21uX3BhcnNlKCZwYXJzZXIsIGpzb25PYmplY3Quc3RyaW5nKCksCisgICAgICAgIGpzb25PYmplY3Quc2l6ZSgpLCBtSnNtblRva2Vucy5lZGl0QXJyYXkoKSwgbnVtVG9rZW5zKTsKKyAgICBpZiAoc3RhdHVzIDwgMCkgeworICAgICAgICBBTE9HRSgiUGFyc2VyIHJldHVybnMgZXJyb3IgY29kZT0lZCIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB0b2tlbnMtPmNsZWFyKCk7CisgICAgU3RyaW5nOCB0b2tlbjsKKyAgICBjb25zdCBjaGFyICpwanM7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBudW1Ub2tlbnM7ICsraikgeworICAgICAgICBwanMgPSBqc29uT2JqZWN0LnN0cmluZygpICsgbUpzbW5Ub2tlbnNbal0uc3RhcnQ7CisgICAgICAgIGlmIChtSnNtblRva2Vuc1tqXS50eXBlID09IEpTTU5fU1RSSU5HIHx8CisgICAgICAgICAgICAgICAgbUpzbW5Ub2tlbnNbal0udHlwZSA9PSBKU01OX1BSSU1JVElWRSkgeworICAgICAgICAgICAgdG9rZW4uc2V0VG8ocGpzLCBtSnNtblRva2Vuc1tqXS5lbmQgLSBtSnNtblRva2Vuc1tqXS5zdGFydCk7CisgICAgICAgICAgICB0b2tlbnMtPmFkZCh0b2tlbik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiBQYXJzZXMgSlNPTiBXZWIgS2V5IFNldCBzdHJpbmcgYW5kIGluaXRpYWxpemVzIGEgdmVjdG9yIG9mIEpTT04gb2JqZWN0cy4KKyAqCisgKiBAcmV0dXJuIFJldHVybnMgZmFsc2UgZm9yIGVycm9ycywgdHJ1ZSBmb3Igc3VjY2Vzcy4KKyAqLworYm9vbCBKc29uV2ViS2V5OjpwYXJzZUpzb25XZWJLZXlTZXQoY29uc3QgU3RyaW5nOCYganNvbldlYktleVNldCwKKyAgICAgICAgVmVjdG9yPFN0cmluZzg+KiBqc29uT2JqZWN0cykgeworICAgIGlmIChqc29uV2ViS2V5U2V0LmlzRW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiRW1wdHkgSlNPTiBXZWIgS2V5Iik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBUaGUganNtbiBwYXJzZXIgb25seSBzdXBwb3J0cyB1bmljb2RlIGVuY29kaW5nLgorICAgIGpzbW5fcGFyc2VyIHBhcnNlcjsKKworICAgIC8vIENvbXB1dGVzIG51bWJlciBvZiB0b2tlbnMuIEEgdG9rZW4gbWFya3MgdGhlIHR5cGUsIG9mZnNldCBpbgorICAgIC8vIHRoZSBvcmlnaW5hbCBzdHJpbmcuCisgICAganNtbl9pbml0KCZwYXJzZXIpOworICAgIGludCBudW1Ub2tlbnMgPSBqc21uX3BhcnNlKCZwYXJzZXIsCisgICAgICAgICAgICBqc29uV2ViS2V5U2V0LnN0cmluZygpLCBqc29uV2ViS2V5U2V0LnNpemUoKSwgTlVMTCwgMCk7CisgICAgaWYgKG51bVRva2VucyA8IDApIHsKKyAgICAgICAgQUxPR0UoIlBhcnNlciByZXR1cm5zIGVycm9yIGNvZGU9JWQiLCBudW1Ub2tlbnMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdW5zaWduZWQgaW50IGpzbW5Ub2tlbnNTaXplID0gbnVtVG9rZW5zICogc2l6ZW9mKGpzbW50b2tfdCk7CisgICAgbUpzbW5Ub2tlbnMuc2V0Q2FwYWNpdHkoanNtblRva2Vuc1NpemUpOworCisgICAganNtbl9pbml0KCZwYXJzZXIpOworICAgIGludCBzdGF0dXMgPSBqc21uX3BhcnNlKCZwYXJzZXIsIGpzb25XZWJLZXlTZXQuc3RyaW5nKCksCisgICAgICAgICAgICBqc29uV2ViS2V5U2V0LnNpemUoKSwgbUpzbW5Ub2tlbnMuZWRpdEFycmF5KCksIG51bVRva2Vucyk7CisgICAgaWYgKHN0YXR1cyA8IDApIHsKKyAgICAgICAgQUxPR0UoIlBhcnNlciByZXR1cm5zIGVycm9yIGNvZGU9JWQiLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgU3RyaW5nOCB0b2tlbjsKKyAgICBjb25zdCBjaGFyICpwanM7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Ub2tlbnM7ICsraSkgeworICAgICAgICBwanMgPSBqc29uV2ViS2V5U2V0LnN0cmluZygpICsgbUpzbW5Ub2tlbnNbaV0uc3RhcnQ7CisgICAgICAgIGlmIChtSnNtblRva2Vuc1tpXS50eXBlID09IEpTTU5fT0JKRUNUKSB7CisgICAgICAgICAgICB0b2tlbi5zZXRUbyhwanMsIG1Kc21uVG9rZW5zW2ldLmVuZCAtIG1Kc21uVG9rZW5zW2ldLnN0YXJ0KTsKKyAgICAgICAgICAgIGpzb25PYmplY3RzLT5hZGQodG9rZW4pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvSnNvbldlYktleS5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvSnNvbldlYktleS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZTUwZWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Kc29uV2ViS2V5LmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIENMRUFSS0VZX0pTT05fV0VCX0tFWV9IXworI2RlZmluZSBDTEVBUktFWV9KU09OX1dFQl9LRVlfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisKKyNpbmNsdWRlICJqc21uLmgiCisjaW5jbHVkZSAiVXRpbHMuaCIKKyNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK3VzaW5nIGFuZHJvaWQ6OktleWVkVmVjdG9yOwordXNpbmcgYW5kcm9pZDo6c3A7Cit1c2luZyBhbmRyb2lkOjpTdHJpbmc4OwordXNpbmcgYW5kcm9pZDo6VmVjdG9yOworCitjbGFzcyBKc29uV2ViS2V5IHsKKyBwdWJsaWM6CisgICAgSnNvbldlYktleSgpOworICAgIHZpcnR1YWwgfkpzb25XZWJLZXkoKTsKKworICAgIGJvb2wgZXh0cmFjdEtleXNGcm9tSnNvbldlYktleVNldChjb25zdCBTdHJpbmc4JiBqc29uV2ViS2V5U2V0LAorICAgICAgICAgICAgS2V5TWFwKiBrZXlzKTsKKworIHByaXZhdGU6CisgICAgVmVjdG9yPGpzbW50b2tfdD4gbUpzbW5Ub2tlbnM7CisgICAgVmVjdG9yPFN0cmluZzg+IG1Kc29uT2JqZWN0czsKKyAgICBWZWN0b3I8U3RyaW5nOD4gbVRva2VuczsKKworICAgIGJvb2wgZGVjb2RlQmFzZTY0U3RyaW5nKGNvbnN0IFN0cmluZzgmIGVuY29kZWRUZXh0LAorICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+KiBkZWNvZGVkVGV4dCk7CisgICAgYm9vbCBmaW5kS2V5KGNvbnN0IFN0cmluZzgmIGpzb25PYmplY3QsIFN0cmluZzgqIGtleUlkLAorICAgICAgICAgICAgU3RyaW5nOCogZW5jb2RlZEtleSk7CisgICAgdm9pZCBmaW5kVmFsdWUoY29uc3QgU3RyaW5nOCAma2V5LCBTdHJpbmc4KiB2YWx1ZSk7CisgICAgYm9vbCBpc0pzb25XZWJLZXlTZXQoY29uc3QgU3RyaW5nOCYganNvbk9iamVjdCkgY29uc3Q7CisgICAgYm9vbCBwYXJzZUpzb25PYmplY3QoY29uc3QgU3RyaW5nOCYganNvbk9iamVjdCwgVmVjdG9yPFN0cmluZzg+KiB0b2tlbnMpOworICAgIGJvb2wgcGFyc2VKc29uV2ViS2V5U2V0KGNvbnN0IFN0cmluZzgmIGpzb25XZWJLZXlTZXQsIFZlY3RvcjxTdHJpbmc4PioganNvbk9iamVjdHMpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSnNvbldlYktleSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KKworI2VuZGlmICAvLyBDTEVBUktFWV9KU09OX1dFQl9LRVlfSF8KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1Nlc3Npb24uY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvU2Vzc2lvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUwMTZmNQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1Nlc3Npb24uY3BwCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNsZWFyS2V5Q3J5cHRvUGx1Z2luIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKKyNpbmNsdWRlICJTZXNzaW9uLmgiCisKKyNpbmNsdWRlICJBZXNDdHJEZWNyeXB0b3IuaCIKKyNpbmNsdWRlICJJbml0RGF0YVBhcnNlci5oIgorI2luY2x1ZGUgIkpzb25XZWJLZXkuaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKwordXNpbmcgYW5kcm9pZDo6TXV0ZXg7Cit1c2luZyBhbmRyb2lkOjpTdHJpbmc4OwordXNpbmcgYW5kcm9pZDo6VmVjdG9yOwordXNpbmcgYW5kcm9pZDo6c3RhdHVzX3Q7CisKK3N0YXR1c190IFNlc3Npb246OmdldEtleVJlcXVlc3QoCisgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGEsCisgICAgICAgIGNvbnN0IFN0cmluZzgmIGluaXREYXRhVHlwZSwKKyAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+KiBrZXlSZXF1ZXN0KSBjb25zdCB7CisgICAgSW5pdERhdGFQYXJzZXIgcGFyc2VyOworICAgIHJldHVybiBwYXJzZXIucGFyc2UoaW5pdERhdGEsIGluaXREYXRhVHlwZSwga2V5UmVxdWVzdCk7Cit9CisKK3N0YXR1c190IFNlc3Npb246OnByb3ZpZGVLZXlSZXNwb25zZShjb25zdCBWZWN0b3I8dWludDhfdD4mIHJlc3BvbnNlKSB7CisgICAgU3RyaW5nOCByZXNwb25zZVN0cmluZygKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHJlc3BvbnNlLmFycmF5KCkpLCByZXNwb25zZS5zaXplKCkpOworICAgIEtleU1hcCBrZXlzOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU1hcExvY2spOworICAgIEpzb25XZWJLZXkgcGFyc2VyOworICAgIGlmIChwYXJzZXIuZXh0cmFjdEtleXNGcm9tSnNvbldlYktleVNldChyZXNwb25zZVN0cmluZywgJmtleXMpKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga2V5cy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgY29uc3QgS2V5TWFwOjprZXlfdHlwZSYga2V5SWQgPSBrZXlzLmtleUF0KGkpOworICAgICAgICAgICAgY29uc3QgS2V5TWFwOjp2YWx1ZV90eXBlJiBrZXkgPSBrZXlzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBtS2V5TWFwLmFkZChrZXlJZCwga2V5KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5kcm9pZDo6T0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9VTktOT1dOOworICAgIH0KK30KKworc3RhdHVzX3QgU2Vzc2lvbjo6ZGVjcnlwdCgKKyAgICAgICAgY29uc3QgS2V5SWQga2V5SWQsIGNvbnN0IEl2IGl2LCBjb25zdCB2b2lkKiBzb3VyY2UsCisgICAgICAgIHZvaWQqIGRlc3RpbmF0aW9uLCBjb25zdCBTdWJTYW1wbGUqIHN1YlNhbXBsZXMsCisgICAgICAgIHNpemVfdCBudW1TdWJTYW1wbGVzLCBzaXplX3QqIGJ5dGVzRGVjcnlwdGVkT3V0KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU1hcExvY2spOworCisgICAgVmVjdG9yPHVpbnQ4X3Q+IGtleUlkVmVjdG9yOworICAgIGtleUlkVmVjdG9yLmFwcGVuZEFycmF5KGtleUlkLCBrQmxvY2tTaXplKTsKKyAgICBpZiAobUtleU1hcC5pbmRleE9mS2V5KGtleUlkVmVjdG9yKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9OT19MSUNFTlNFOworICAgIH0KKworICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYga2V5ID0gbUtleU1hcC52YWx1ZUZvcihrZXlJZFZlY3Rvcik7CisgICAgQWVzQ3RyRGVjcnlwdG9yIGRlY3J5cHRvcjsKKyAgICByZXR1cm4gZGVjcnlwdG9yLmRlY3J5cHQoCisgICAgICAgICAgICBrZXksIGl2LAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oc291cmNlKSwKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGRlc3RpbmF0aW9uKSwgc3ViU2FtcGxlcywKKyAgICAgICAgICAgIG51bVN1YlNhbXBsZXMsIGJ5dGVzRGVjcnlwdGVkT3V0KTsKK30KKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1Nlc3Npb24uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1Nlc3Npb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWIwZGMzCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvU2Vzc2lvbi5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENMRUFSS0VZX1NFU1NJT05fSF8KKyNkZWZpbmUgQ0xFQVJLRVlfU0VTU0lPTl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworI2luY2x1ZGUgIkNsZWFyS2V5VHlwZXMuaCIKKyNpbmNsdWRlICJVdGlscy5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCitjbGFzcyBTZXNzaW9uIDogcHVibGljIGFuZHJvaWQ6OlJlZkJhc2UgeworcHVibGljOgorICAgIGV4cGxpY2l0IFNlc3Npb24oY29uc3QgYW5kcm9pZDo6VmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpCisgICAgICAgICAgICA6IG1TZXNzaW9uSWQoc2Vzc2lvbklkKSB7fQorICAgIHZpcnR1YWwgflNlc3Npb24oKSB7fQorCisgICAgY29uc3QgYW5kcm9pZDo6VmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQoKSBjb25zdCB7IHJldHVybiBtU2Vzc2lvbklkOyB9CisKKyAgICBhbmRyb2lkOjpzdGF0dXNfdCBnZXRLZXlSZXF1ZXN0KAorICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6VmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKKyAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OlN0cmluZzgmIGluaXREYXRhVHlwZSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OlZlY3Rvcjx1aW50OF90Pioga2V5UmVxdWVzdCkgY29uc3Q7CisKKyAgICBhbmRyb2lkOjpzdGF0dXNfdCBwcm92aWRlS2V5UmVzcG9uc2UoCisgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpWZWN0b3I8dWludDhfdD4mIHJlc3BvbnNlKTsKKworICAgIGFuZHJvaWQ6OnN0YXR1c190IGRlY3J5cHQoCisgICAgICAgICAgICBjb25zdCBLZXlJZCBrZXlJZCwgY29uc3QgSXYgaXYsIGNvbnN0IHZvaWQqIHNvdXJjZSwKKyAgICAgICAgICAgIHZvaWQqIGRlc3RpbmF0aW9uLCBjb25zdCBTdWJTYW1wbGUqIHN1YlNhbXBsZXMsCisgICAgICAgICAgICBzaXplX3QgbnVtU3ViU2FtcGxlcywgc2l6ZV90KiBieXRlc0RlY3J5cHRlZE91dCk7CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2Vzc2lvbik7CisKKyAgICBjb25zdCBhbmRyb2lkOjpWZWN0b3I8dWludDhfdD4gbVNlc3Npb25JZDsKKworICAgIGFuZHJvaWQ6Ok11dGV4IG1NYXBMb2NrOworICAgIEtleU1hcCBtS2V5TWFwOworfTsKKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KKworI2VuZGlmIC8vIENMRUFSS0VZX1NFU1NJT05fSF8KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1Nlc3Npb25MaWJyYXJ5LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1Nlc3Npb25MaWJyYXJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDQ3YzUzCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvU2Vzc2lvbkxpYnJhcnkuY3BwCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNsZWFyS2V5Q3J5cHRvUGx1Z2luIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCisjaW5jbHVkZSAiU2Vzc2lvbkxpYnJhcnkuaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKwordXNpbmcgYW5kcm9pZDo6TXV0ZXg7Cit1c2luZyBhbmRyb2lkOjpzcDsKK3VzaW5nIGFuZHJvaWQ6OlN0cmluZzg7Cit1c2luZyBhbmRyb2lkOjpWZWN0b3I7CisKK011dGV4IFNlc3Npb25MaWJyYXJ5OjpzU2luZ2xldG9uTG9jazsKK1Nlc3Npb25MaWJyYXJ5KiBTZXNzaW9uTGlicmFyeTo6c1NpbmdsZXRvbiA9IE5VTEw7CisKK1Nlc3Npb25MaWJyYXJ5KiBTZXNzaW9uTGlicmFyeTo6Z2V0KCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKHNTaW5nbGV0b25Mb2NrKTsKKworICAgIGlmIChzU2luZ2xldG9uID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0QoIkluc3RhbnRpYXRpbmcgU2Vzc2lvbiBMaWJyYXJ5IFNpbmdsZXRvbi4iKTsKKyAgICAgICAgc1NpbmdsZXRvbiA9IG5ldyBTZXNzaW9uTGlicmFyeSgpOworICAgIH0KKworICAgIHJldHVybiBzU2luZ2xldG9uOworfQorCitjb25zdCBzcDxTZXNzaW9uPiYgU2Vzc2lvbkxpYnJhcnk6OmNyZWF0ZVNlc3Npb24oKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlc3Npb25zTG9jayk7CisKKyAgICBTdHJpbmc4IHNlc3Npb25JZFN0cmluZyA9IFN0cmluZzg6OmZvcm1hdCgiJXUiLCBtTmV4dFNlc3Npb25JZCk7CisgICAgbU5leHRTZXNzaW9uSWQgKz0gMTsKKyAgICBWZWN0b3I8dWludDhfdD4gc2Vzc2lvbklkOworICAgIHNlc3Npb25JZC5hcHBlbmRBcnJheSgKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHNlc3Npb25JZFN0cmluZy5zdHJpbmcoKSksCisgICAgICAgICAgICBzZXNzaW9uSWRTdHJpbmcuc2l6ZSgpKTsKKworICAgIG1TZXNzaW9ucy5hZGQoc2Vzc2lvbklkLCBuZXcgU2Vzc2lvbihzZXNzaW9uSWQpKTsKKyAgICByZXR1cm4gbVNlc3Npb25zLnZhbHVlRm9yKHNlc3Npb25JZCk7Cit9CisKK2NvbnN0IHNwPFNlc3Npb24+JiBTZXNzaW9uTGlicmFyeTo6ZmluZFNlc3Npb24oCisgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlc3Npb25zTG9jayk7CisgICAgcmV0dXJuIG1TZXNzaW9ucy52YWx1ZUZvcihzZXNzaW9uSWQpOworfQorCitjb25zdCBzcDxTZXNzaW9uPiYgU2Vzc2lvbkxpYnJhcnk6OmZpbmRTZXNzaW9uKAorICAgICAgICBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIFZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQ7CisgICAgc2Vzc2lvbklkLmFwcGVuZEFycmF5KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGRhdGEpLCBzaXplKTsKKyAgICByZXR1cm4gZmluZFNlc3Npb24oc2Vzc2lvbklkKTsKK30KKwordm9pZCBTZXNzaW9uTGlicmFyeTo6ZGVzdHJveVNlc3Npb24oY29uc3Qgc3A8U2Vzc2lvbj4mIHNlc3Npb24pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2Vzc2lvbnNMb2NrKTtcCisgICAgbVNlc3Npb25zLnJlbW92ZUl0ZW0oc2Vzc2lvbi0+c2Vzc2lvbklkKCkpOworfQorCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvU2Vzc2lvbkxpYnJhcnkuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1Nlc3Npb25MaWJyYXJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZjODgyOAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1Nlc3Npb25MaWJyYXJ5LmgKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0xFQVJLRVlfU0VTU0lPTl9MSUJSQVJZX0hfCisjZGVmaW5lIENMRUFSS0VZX1NFU1NJT05fTElCUkFSWV9IXworCisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworI2luY2x1ZGUgIlNlc3Npb24uaCIKKyNpbmNsdWRlICJVdGlscy5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCitjbGFzcyBTZXNzaW9uTGlicmFyeSB7CitwdWJsaWM6CisgICAgc3RhdGljIFNlc3Npb25MaWJyYXJ5KiBnZXQoKTsKKworICAgIGNvbnN0IGFuZHJvaWQ6OnNwPFNlc3Npb24+JiBjcmVhdGVTZXNzaW9uKCk7CisKKyAgICBjb25zdCBhbmRyb2lkOjpzcDxTZXNzaW9uPiYgZmluZFNlc3Npb24oCisgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCk7CisKKyAgICBjb25zdCBhbmRyb2lkOjpzcDxTZXNzaW9uPiYgZmluZFNlc3Npb24oY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgdm9pZCBkZXN0cm95U2Vzc2lvbihjb25zdCBhbmRyb2lkOjpzcDxTZXNzaW9uPiYgc2Vzc2lvbik7CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2Vzc2lvbkxpYnJhcnkpOworCisgICAgU2Vzc2lvbkxpYnJhcnkoKSA6IG1OZXh0U2Vzc2lvbklkKDEpIHt9CisKKyAgICBzdGF0aWMgYW5kcm9pZDo6TXV0ZXggc1NpbmdsZXRvbkxvY2s7CisgICAgc3RhdGljIFNlc3Npb25MaWJyYXJ5KiBzU2luZ2xldG9uOworCisgICAgYW5kcm9pZDo6TXV0ZXggbVNlc3Npb25zTG9jazsKKyAgICB1aW50MzJfdCBtTmV4dFNlc3Npb25JZDsKKyAgICBhbmRyb2lkOjpLZXllZFZlY3RvcjxhbmRyb2lkOjpWZWN0b3I8dWludDhfdD4sIGFuZHJvaWQ6OnNwPFNlc3Npb24+ID4KKyAgICAgICAgICAgIG1TZXNzaW9uczsKK307CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCisKKyNlbmRpZiAvLyBDTEVBUktFWV9TRVNTSU9OX0xJQlJBUllfSF8KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1V0aWxzLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1V0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2M2NDNiCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvVXRpbHMuY3BwCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiVXRpbHMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitib29sIG9wZXJhdG9yPChjb25zdCBWZWN0b3I8dWludDhfdD4gJmxocywgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZyaHMpIHsKKyAgICBpZiAobGhzLnNpemUoKSA8IHJocy5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChsaHMuc2l6ZSgpID4gcmhzLnNpemUoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBtZW1jbXAoKHZvaWQgKilsaHMuYXJyYXkoKSwgKHZvaWQgKilyaHMuYXJyYXkoKSwgcmhzLnNpemUoKSkgPCAwOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9VdGlscy5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTQzMTI0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvVXRpbHMuaApAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDTEVBUktFWV9VVElMU19IXworI2RlZmluZSBDTEVBUktFWV9VVElMU19IXworCisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKKy8vIEFkZCBhIGNvbXBhcmlzb24gb3BlcmF0b3IgZm9yIHRoaXMgVmVjdG9yIHNwZWNpYWxpemF0aW9uIHNvIHRoYXQgaXQgY2FuIGJlCisvLyB1c2VkIGFzIGEga2V5IGluIGEgS2V5ZWRWZWN0b3IuCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2Jvb2wgb3BlcmF0b3I8KGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmbGhzLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJnJocyk7CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpOworCisjZW5kaWYgLy8gQ0xFQVJLRVlfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0Flc0N0ckRlY3J5cHRvclVuaXR0ZXN0LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0Flc0N0ckRlY3J5cHRvclVuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzllNDAyCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvQWVzQ3RyRGVjcnlwdG9yVW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsNDIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKKyNpbmNsdWRlICJBZXNDdHJEZWNyeXB0b3IuaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2NsYXNzIEFlc0N0ckRlY3J5cHRvclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyAgcHJvdGVjdGVkOgorICAgIHR5cGVkZWYgdWludDhfdCBLZXlba0Jsb2NrU2l6ZV07CisKKyAgICBzdGF0dXNfdCBhdHRlbXB0RGVjcnlwdChjb25zdCBLZXkmIGtleSwgY29uc3QgSXYmIGl2LCBjb25zdCB1aW50OF90KiBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdGluYXRpb24sIGNvbnN0IFN1YlNhbXBsZSogc3ViU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtU3ViU2FtcGxlcywgc2l6ZV90KiBieXRlc0RlY3J5cHRlZE91dCkgeworICAgICAgICBWZWN0b3I8dWludDhfdD4ga2V5VmVjdG9yOworICAgICAgICBrZXlWZWN0b3IuYXBwZW5kQXJyYXkoa2V5LCBrQmxvY2tTaXplKTsKKworICAgICAgICBBZXNDdHJEZWNyeXB0b3IgZGVjcnlwdG9yOworICAgICAgICByZXR1cm4gZGVjcnlwdG9yLmRlY3J5cHQoa2V5VmVjdG9yLCBpdiwgc291cmNlLCBkZXN0aW5hdGlvbiwgc3ViU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVN1YlNhbXBsZXMsIGJ5dGVzRGVjcnlwdGVkT3V0KTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8c2l6ZV90IHRvdGFsU2l6ZT4KKyAgICB2b2lkIGF0dGVtcHREZWNyeXB0RXhwZWN0aW5nU3VjY2Vzcyhjb25zdCBLZXkmIGtleSwgY29uc3QgSXYmIGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGVuY3J5cHRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkZWNyeXB0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3ViU2FtcGxlKiBzdWJTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1TdWJTYW1wbGVzKSB7CisgICAgICAgIHVpbnQ4X3Qgb3V0cHV0QnVmZmVyW3RvdGFsU2l6ZV0gPSB7fTsKKyAgICAgICAgc2l6ZV90IGJ5dGVzRGVjcnlwdGVkID0gMDsKKyAgICAgICAgQVNTRVJUX0VRKGFuZHJvaWQ6Ok9LLCBhdHRlbXB0RGVjcnlwdChrZXksIGl2LCBlbmNyeXB0ZWQsIG91dHB1dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJTYW1wbGVzLCBudW1TdWJTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlc0RlY3J5cHRlZCkpOworICAgICAgICBFWFBFQ1RfRVEodG90YWxTaXplLCBieXRlc0RlY3J5cHRlZCk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAob3V0cHV0QnVmZmVyLCBkZWNyeXB0ZWQsIHRvdGFsU2l6ZSkpOworICAgIH0KK307CisKK1RFU1RfRihBZXNDdHJEZWNyeXB0b3JUZXN0LCBEZWNyeXB0c0NvbnRpZ3VvdXNFbmNyeXB0ZWRCbG9jaykgeworICAgIGNvbnN0IHNpemVfdCBrVG90YWxTaXplID0gNjQ7CisgICAgY29uc3Qgc2l6ZV90IGtOdW1TdWJzYW1wbGVzID0gMTsKKworICAgIC8vIFRlc3QgdmVjdG9ycyBmcm9tIE5JU1QtODAwLTM4QQorICAgIEtleSBrZXkgPSB7CisgICAgICAgIDB4MmIsIDB4N2UsIDB4MTUsIDB4MTYsIDB4MjgsIDB4YWUsIDB4ZDIsIDB4YTYsCisgICAgICAgIDB4YWIsIDB4ZjcsIDB4MTUsIDB4ODgsIDB4MDksIDB4Y2YsIDB4NGYsIDB4M2MKKyAgICB9OworCisgICAgSXYgaXYgPSB7CisgICAgICAgIDB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsCisgICAgICAgIDB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYKKyAgICB9OworCisgICAgdWludDhfdCBlbmNyeXB0ZWRba1RvdGFsU2l6ZV0gPSB7CisgICAgICAgIDB4ODcsIDB4NGQsIDB4NjEsIDB4OTEsIDB4YjYsIDB4MjAsIDB4ZTMsIDB4MjYsCisgICAgICAgIDB4MWIsIDB4ZWYsIDB4NjgsIDB4NjQsIDB4OTksIDB4MGQsIDB4YjYsIDB4Y2UsCisgICAgICAgIDB4OTgsIDB4MDYsIDB4ZjYsIDB4NmIsIDB4NzksIDB4NzAsIDB4ZmQsIDB4ZmYsCisgICAgICAgIDB4ODYsIDB4MTcsIDB4MTgsIDB4N2IsIDB4YjksIDB4ZmYsIDB4ZmQsIDB4ZmYsCisgICAgICAgIDB4NWEsIDB4ZTQsIDB4ZGYsIDB4M2UsIDB4ZGIsIDB4ZDUsIDB4ZDMsIDB4NWUsCisgICAgICAgIDB4NWIsIDB4NGYsIDB4MDksIDB4MDIsIDB4MGQsIDB4YjAsIDB4M2UsIDB4YWIsCisgICAgICAgIDB4MWUsIDB4MDMsIDB4MWQsIDB4ZGEsIDB4MmYsIDB4YmUsIDB4MDMsIDB4ZDEsCisgICAgICAgIDB4NzksIDB4MjEsIDB4NzAsIDB4YTAsIDB4ZjMsIDB4MDAsIDB4OWMsIDB4ZWUKKyAgICB9OworCisgICAgdWludDhfdCBkZWNyeXB0ZWRba1RvdGFsU2l6ZV0gPSB7CisgICAgICAgIDB4NmIsIDB4YzEsIDB4YmUsIDB4ZTIsIDB4MmUsIDB4NDAsIDB4OWYsIDB4OTYsCisgICAgICAgIDB4ZTksIDB4M2QsIDB4N2UsIDB4MTEsIDB4NzMsIDB4OTMsIDB4MTcsIDB4MmEsCisgICAgICAgIDB4YWUsIDB4MmQsIDB4OGEsIDB4NTcsIDB4MWUsIDB4MDMsIDB4YWMsIDB4OWMsCisgICAgICAgIDB4OWUsIDB4YjcsIDB4NmYsIDB4YWMsIDB4NDUsIDB4YWYsIDB4OGUsIDB4NTEsCisgICAgICAgIDB4MzAsIDB4YzgsIDB4MWMsIDB4NDYsIDB4YTMsIDB4NWMsIDB4ZTQsIDB4MTEsCisgICAgICAgIDB4ZTUsIDB4ZmIsIDB4YzEsIDB4MTksIDB4MWEsIDB4MGEsIDB4NTIsIDB4ZWYsCisgICAgICAgIDB4ZjYsIDB4OWYsIDB4MjQsIDB4NDUsIDB4ZGYsIDB4NGYsIDB4OWIsIDB4MTcsCisgICAgICAgIDB4YWQsIDB4MmIsIDB4NDEsIDB4N2IsIDB4ZTYsIDB4NmMsIDB4MzcsIDB4MTAKKyAgICB9OworCisgICAgU3ViU2FtcGxlIHN1YlNhbXBsZXNba051bVN1YnNhbXBsZXNdID0geworICAgICAgICB7MCwgNjR9CisgICAgfTsKKworICAgIGF0dGVtcHREZWNyeXB0RXhwZWN0aW5nU3VjY2VzczxrVG90YWxTaXplPihrZXksIGl2LCBlbmNyeXB0ZWQsIGRlY3J5cHRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViU2FtcGxlcywga051bVN1YnNhbXBsZXMpOworfQorCitURVNUX0YoQWVzQ3RyRGVjcnlwdG9yVGVzdCwgRGVjcnlwdHNBbGlnbmVkQmlmdXJjYXRlZEVuY3J5cHRlZEJsb2NrKSB7CisgICAgY29uc3Qgc2l6ZV90IGtUb3RhbFNpemUgPSA2NDsKKyAgICBjb25zdCBzaXplX3Qga051bVN1YnNhbXBsZXMgPSAyOworCisgICAgLy8gVGVzdCB2ZWN0b3JzIGZyb20gTklTVC04MDAtMzhBCisgICAgS2V5IGtleSA9IHsKKyAgICAgICAgMHgyYiwgMHg3ZSwgMHgxNSwgMHgxNiwgMHgyOCwgMHhhZSwgMHhkMiwgMHhhNiwKKyAgICAgICAgMHhhYiwgMHhmNywgMHgxNSwgMHg4OCwgMHgwOSwgMHhjZiwgMHg0ZiwgMHgzYworICAgIH07CisKKyAgICBJdiBpdiA9IHsKKyAgICAgICAgMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywKKyAgICAgICAgMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZgorICAgIH07CisKKyAgICB1aW50OF90IGVuY3J5cHRlZFtrVG90YWxTaXplXSA9IHsKKyAgICAgICAgMHg4NywgMHg0ZCwgMHg2MSwgMHg5MSwgMHhiNiwgMHgyMCwgMHhlMywgMHgyNiwKKyAgICAgICAgMHgxYiwgMHhlZiwgMHg2OCwgMHg2NCwgMHg5OSwgMHgwZCwgMHhiNiwgMHhjZSwKKyAgICAgICAgMHg5OCwgMHgwNiwgMHhmNiwgMHg2YiwgMHg3OSwgMHg3MCwgMHhmZCwgMHhmZiwKKyAgICAgICAgMHg4NiwgMHgxNywgMHgxOCwgMHg3YiwgMHhiOSwgMHhmZiwgMHhmZCwgMHhmZiwKKyAgICAgICAgMHg1YSwgMHhlNCwgMHhkZiwgMHgzZSwgMHhkYiwgMHhkNSwgMHhkMywgMHg1ZSwKKyAgICAgICAgMHg1YiwgMHg0ZiwgMHgwOSwgMHgwMiwgMHgwZCwgMHhiMCwgMHgzZSwgMHhhYiwKKyAgICAgICAgMHgxZSwgMHgwMywgMHgxZCwgMHhkYSwgMHgyZiwgMHhiZSwgMHgwMywgMHhkMSwKKyAgICAgICAgMHg3OSwgMHgyMSwgMHg3MCwgMHhhMCwgMHhmMywgMHgwMCwgMHg5YywgMHhlZQorICAgIH07CisKKyAgICB1aW50OF90IGRlY3J5cHRlZFtrVG90YWxTaXplXSA9IHsKKyAgICAgICAgMHg2YiwgMHhjMSwgMHhiZSwgMHhlMiwgMHgyZSwgMHg0MCwgMHg5ZiwgMHg5NiwKKyAgICAgICAgMHhlOSwgMHgzZCwgMHg3ZSwgMHgxMSwgMHg3MywgMHg5MywgMHgxNywgMHgyYSwKKyAgICAgICAgMHhhZSwgMHgyZCwgMHg4YSwgMHg1NywgMHgxZSwgMHgwMywgMHhhYywgMHg5YywKKyAgICAgICAgMHg5ZSwgMHhiNywgMHg2ZiwgMHhhYywgMHg0NSwgMHhhZiwgMHg4ZSwgMHg1MSwKKyAgICAgICAgMHgzMCwgMHhjOCwgMHgxYywgMHg0NiwgMHhhMywgMHg1YywgMHhlNCwgMHgxMSwKKyAgICAgICAgMHhlNSwgMHhmYiwgMHhjMSwgMHgxOSwgMHgxYSwgMHgwYSwgMHg1MiwgMHhlZiwKKyAgICAgICAgMHhmNiwgMHg5ZiwgMHgyNCwgMHg0NSwgMHhkZiwgMHg0ZiwgMHg5YiwgMHgxNywKKyAgICAgICAgMHhhZCwgMHgyYiwgMHg0MSwgMHg3YiwgMHhlNiwgMHg2YywgMHgzNywgMHgxMAorICAgIH07CisKKyAgICBTdWJTYW1wbGUgc3ViU2FtcGxlc1trTnVtU3Vic2FtcGxlc10gPSB7CisgICAgICAgIHswLCAzMn0sCisgICAgICAgIHswLCAzMn0KKyAgICB9OworCisgICAgYXR0ZW1wdERlY3J5cHRFeHBlY3RpbmdTdWNjZXNzPGtUb3RhbFNpemU+KGtleSwgaXYsIGVuY3J5cHRlZCwgZGVjcnlwdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJTYW1wbGVzLCBrTnVtU3Vic2FtcGxlcyk7Cit9CisKK1RFU1RfRihBZXNDdHJEZWNyeXB0b3JUZXN0LCBEZWNyeXB0c1VuYWxpZ25lZEJpZnVyY2F0ZWRFbmNyeXB0ZWRCbG9jaykgeworICAgIGNvbnN0IHNpemVfdCBrVG90YWxTaXplID0gNjQ7CisgICAgY29uc3Qgc2l6ZV90IGtOdW1TdWJzYW1wbGVzID0gMjsKKworICAgIC8vIFRlc3QgdmVjdG9ycyBmcm9tIE5JU1QtODAwLTM4QQorICAgIEtleSBrZXkgPSB7CisgICAgICAgIDB4MmIsIDB4N2UsIDB4MTUsIDB4MTYsIDB4MjgsIDB4YWUsIDB4ZDIsIDB4YTYsCisgICAgICAgIDB4YWIsIDB4ZjcsIDB4MTUsIDB4ODgsIDB4MDksIDB4Y2YsIDB4NGYsIDB4M2MKKyAgICB9OworCisgICAgSXYgaXYgPSB7CisgICAgICAgIDB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsCisgICAgICAgIDB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYKKyAgICB9OworCisgICAgdWludDhfdCBlbmNyeXB0ZWRba1RvdGFsU2l6ZV0gPSB7CisgICAgICAgIDB4ODcsIDB4NGQsIDB4NjEsIDB4OTEsIDB4YjYsIDB4MjAsIDB4ZTMsIDB4MjYsCisgICAgICAgIDB4MWIsIDB4ZWYsIDB4NjgsIDB4NjQsIDB4OTksIDB4MGQsIDB4YjYsIDB4Y2UsCisgICAgICAgIDB4OTgsIDB4MDYsIDB4ZjYsIDB4NmIsIDB4NzksIDB4NzAsIDB4ZmQsIDB4ZmYsCisgICAgICAgIDB4ODYsIDB4MTcsIDB4MTgsIDB4N2IsIDB4YjksIDB4ZmYsIDB4ZmQsIDB4ZmYsCisgICAgICAgIDB4NWEsIDB4ZTQsIDB4ZGYsIDB4M2UsIDB4ZGIsIDB4ZDUsIDB4ZDMsIDB4NWUsCisgICAgICAgIDB4NWIsIDB4NGYsIDB4MDksIDB4MDIsIDB4MGQsIDB4YjAsIDB4M2UsIDB4YWIsCisgICAgICAgIDB4MWUsIDB4MDMsIDB4MWQsIDB4ZGEsIDB4MmYsIDB4YmUsIDB4MDMsIDB4ZDEsCisgICAgICAgIDB4NzksIDB4MjEsIDB4NzAsIDB4YTAsIDB4ZjMsIDB4MDAsIDB4OWMsIDB4ZWUKKyAgICB9OworCisgICAgdWludDhfdCBkZWNyeXB0ZWRba1RvdGFsU2l6ZV0gPSB7CisgICAgICAgIDB4NmIsIDB4YzEsIDB4YmUsIDB4ZTIsIDB4MmUsIDB4NDAsIDB4OWYsIDB4OTYsCisgICAgICAgIDB4ZTksIDB4M2QsIDB4N2UsIDB4MTEsIDB4NzMsIDB4OTMsIDB4MTcsIDB4MmEsCisgICAgICAgIDB4YWUsIDB4MmQsIDB4OGEsIDB4NTcsIDB4MWUsIDB4MDMsIDB4YWMsIDB4OWMsCisgICAgICAgIDB4OWUsIDB4YjcsIDB4NmYsIDB4YWMsIDB4NDUsIDB4YWYsIDB4OGUsIDB4NTEsCisgICAgICAgIDB4MzAsIDB4YzgsIDB4MWMsIDB4NDYsIDB4YTMsIDB4NWMsIDB4ZTQsIDB4MTEsCisgICAgICAgIDB4ZTUsIDB4ZmIsIDB4YzEsIDB4MTksIDB4MWEsIDB4MGEsIDB4NTIsIDB4ZWYsCisgICAgICAgIDB4ZjYsIDB4OWYsIDB4MjQsIDB4NDUsIDB4ZGYsIDB4NGYsIDB4OWIsIDB4MTcsCisgICAgICAgIDB4YWQsIDB4MmIsIDB4NDEsIDB4N2IsIDB4ZTYsIDB4NmMsIDB4MzcsIDB4MTAKKyAgICB9OworCisgICAgU3ViU2FtcGxlIHN1YlNhbXBsZXNba051bVN1YnNhbXBsZXNdID0geworICAgICAgICB7MCwgMjl9LAorICAgICAgICB7MCwgMzV9CisgICAgfTsKKworICAgIGF0dGVtcHREZWNyeXB0RXhwZWN0aW5nU3VjY2VzczxrVG90YWxTaXplPihrZXksIGl2LCBlbmNyeXB0ZWQsIGRlY3J5cHRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViU2FtcGxlcywga051bVN1YnNhbXBsZXMpOworfQorCitURVNUX0YoQWVzQ3RyRGVjcnlwdG9yVGVzdCwgRGVjcnlwdHNPbmVNaXhlZFN1YlNhbXBsZSkgeworICAgIGNvbnN0IHNpemVfdCBrVG90YWxTaXplID0gNzI7CisgICAgY29uc3Qgc2l6ZV90IGtOdW1TdWJzYW1wbGVzID0gMTsKKworICAgIC8vIEJhc2VkIG9uIHRlc3QgdmVjdG9ycyBmcm9tIE5JU1QtODAwLTM4QQorICAgIEtleSBrZXkgPSB7CisgICAgICAgIDB4MmIsIDB4N2UsIDB4MTUsIDB4MTYsIDB4MjgsIDB4YWUsIDB4ZDIsIDB4YTYsCisgICAgICAgIDB4YWIsIDB4ZjcsIDB4MTUsIDB4ODgsIDB4MDksIDB4Y2YsIDB4NGYsIDB4M2MKKyAgICB9OworCisgICAgSXYgaXYgPSB7CisgICAgICAgIDB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsCisgICAgICAgIDB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYKKyAgICB9OworCisgICAgdWludDhfdCBlbmNyeXB0ZWRba1RvdGFsU2l6ZV0gPSB7CisgICAgICAgIC8vIDggY2xlYXIgYnl0ZXMKKyAgICAgICAgMHhmMCwgMHgxMywgMHhjYSwgMHhjNywgMHgwMCwgMHg2NCwgMHgwYiwgMHhiYiwKKyAgICAgICAgLy8gNjQgZW5jcnlwdGVkIGJ5dGVzCisgICAgICAgIDB4ODcsIDB4NGQsIDB4NjEsIDB4OTEsIDB4YjYsIDB4MjAsIDB4ZTMsIDB4MjYsCisgICAgICAgIDB4MWIsIDB4ZWYsIDB4NjgsIDB4NjQsIDB4OTksIDB4MGQsIDB4YjYsIDB4Y2UsCisgICAgICAgIDB4OTgsIDB4MDYsIDB4ZjYsIDB4NmIsIDB4NzksIDB4NzAsIDB4ZmQsIDB4ZmYsCisgICAgICAgIDB4ODYsIDB4MTcsIDB4MTgsIDB4N2IsIDB4YjksIDB4ZmYsIDB4ZmQsIDB4ZmYsCisgICAgICAgIDB4NWEsIDB4ZTQsIDB4ZGYsIDB4M2UsIDB4ZGIsIDB4ZDUsIDB4ZDMsIDB4NWUsCisgICAgICAgIDB4NWIsIDB4NGYsIDB4MDksIDB4MDIsIDB4MGQsIDB4YjAsIDB4M2UsIDB4YWIsCisgICAgICAgIDB4MWUsIDB4MDMsIDB4MWQsIDB4ZGEsIDB4MmYsIDB4YmUsIDB4MDMsIDB4ZDEsCisgICAgICAgIDB4NzksIDB4MjEsIDB4NzAsIDB4YTAsIDB4ZjMsIDB4MDAsIDB4OWMsIDB4ZWUKKyAgICB9OworCisgICAgdWludDhfdCBkZWNyeXB0ZWRba1RvdGFsU2l6ZV0gPSB7CisgICAgICAgIDB4ZjAsIDB4MTMsIDB4Y2EsIDB4YzcsIDB4MDAsIDB4NjQsIDB4MGIsIDB4YmIsCisgICAgICAgIDB4NmIsIDB4YzEsIDB4YmUsIDB4ZTIsIDB4MmUsIDB4NDAsIDB4OWYsIDB4OTYsCisgICAgICAgIDB4ZTksIDB4M2QsIDB4N2UsIDB4MTEsIDB4NzMsIDB4OTMsIDB4MTcsIDB4MmEsCisgICAgICAgIDB4YWUsIDB4MmQsIDB4OGEsIDB4NTcsIDB4MWUsIDB4MDMsIDB4YWMsIDB4OWMsCisgICAgICAgIDB4OWUsIDB4YjcsIDB4NmYsIDB4YWMsIDB4NDUsIDB4YWYsIDB4OGUsIDB4NTEsCisgICAgICAgIDB4MzAsIDB4YzgsIDB4MWMsIDB4NDYsIDB4YTMsIDB4NWMsIDB4ZTQsIDB4MTEsCisgICAgICAgIDB4ZTUsIDB4ZmIsIDB4YzEsIDB4MTksIDB4MWEsIDB4MGEsIDB4NTIsIDB4ZWYsCisgICAgICAgIDB4ZjYsIDB4OWYsIDB4MjQsIDB4NDUsIDB4ZGYsIDB4NGYsIDB4OWIsIDB4MTcsCisgICAgICAgIDB4YWQsIDB4MmIsIDB4NDEsIDB4N2IsIDB4ZTYsIDB4NmMsIDB4MzcsIDB4MTAKKyAgICB9OworCisgICAgU3ViU2FtcGxlIHN1YlNhbXBsZXNba051bVN1YnNhbXBsZXNdID0geworICAgICAgICB7OCwgNjR9CisgICAgfTsKKworICAgIGF0dGVtcHREZWNyeXB0RXhwZWN0aW5nU3VjY2VzczxrVG90YWxTaXplPihrZXksIGl2LCBlbmNyeXB0ZWQsIGRlY3J5cHRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViU2FtcGxlcywga051bVN1YnNhbXBsZXMpOworfQorCitURVNUX0YoQWVzQ3RyRGVjcnlwdG9yVGVzdCwgRGVjcnlwdHNBbGlnbmVkTWl4ZWRTdWJTYW1wbGVzKSB7CisgICAgY29uc3Qgc2l6ZV90IGtUb3RhbFNpemUgPSA4MDsKKyAgICBjb25zdCBzaXplX3Qga051bVN1YnNhbXBsZXMgPSAyOworCisgICAgLy8gQmFzZWQgb24gdGVzdCB2ZWN0b3JzIGZyb20gTklTVC04MDAtMzhBCisgICAgS2V5IGtleSA9IHsKKyAgICAgICAgMHgyYiwgMHg3ZSwgMHgxNSwgMHgxNiwgMHgyOCwgMHhhZSwgMHhkMiwgMHhhNiwKKyAgICAgICAgMHhhYiwgMHhmNywgMHgxNSwgMHg4OCwgMHgwOSwgMHhjZiwgMHg0ZiwgMHgzYworICAgIH07CisKKyAgICBJdiBpdiA9IHsKKyAgICAgICAgMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywKKyAgICAgICAgMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZgorICAgIH07CisKKyAgICB1aW50OF90IGVuY3J5cHRlZFtrVG90YWxTaXplXSA9IHsKKyAgICAgICAgLy8gOCBjbGVhciBieXRlcworICAgICAgICAweGYwLCAweDEzLCAweGNhLCAweGM3LCAweDAwLCAweDY0LCAweDBiLCAweGJiLAorICAgICAgICAvLyAzMiBlbmNyeXB0ZWQgYnl0ZXMKKyAgICAgICAgMHg4NywgMHg0ZCwgMHg2MSwgMHg5MSwgMHhiNiwgMHgyMCwgMHhlMywgMHgyNiwKKyAgICAgICAgMHgxYiwgMHhlZiwgMHg2OCwgMHg2NCwgMHg5OSwgMHgwZCwgMHhiNiwgMHhjZSwKKyAgICAgICAgMHg5OCwgMHgwNiwgMHhmNiwgMHg2YiwgMHg3OSwgMHg3MCwgMHhmZCwgMHhmZiwKKyAgICAgICAgMHg4NiwgMHgxNywgMHgxOCwgMHg3YiwgMHhiOSwgMHhmZiwgMHhmZCwgMHhmZiwKKyAgICAgICAgLy8gOCBjbGVhciBieXRlcworICAgICAgICAweDk0LCAweGJhLCAweDg4LCAweDJlLCAweDBlLCAweDEyLCAweDExLCAweDU1LAorICAgICAgICAvLyAzMiBlbmNyeXB0ZWQgYnl0ZXMKKyAgICAgICAgMHg1YSwgMHhlNCwgMHhkZiwgMHgzZSwgMHhkYiwgMHhkNSwgMHhkMywgMHg1ZSwKKyAgICAgICAgMHg1YiwgMHg0ZiwgMHgwOSwgMHgwMiwgMHgwZCwgMHhiMCwgMHgzZSwgMHhhYiwKKyAgICAgICAgMHgxZSwgMHgwMywgMHgxZCwgMHhkYSwgMHgyZiwgMHhiZSwgMHgwMywgMHhkMSwKKyAgICAgICAgMHg3OSwgMHgyMSwgMHg3MCwgMHhhMCwgMHhmMywgMHgwMCwgMHg5YywgMHhlZQorICAgIH07CisKKyAgICB1aW50OF90IGRlY3J5cHRlZFtrVG90YWxTaXplXSA9IHsKKyAgICAgICAgMHhmMCwgMHgxMywgMHhjYSwgMHhjNywgMHgwMCwgMHg2NCwgMHgwYiwgMHhiYiwKKyAgICAgICAgMHg2YiwgMHhjMSwgMHhiZSwgMHhlMiwgMHgyZSwgMHg0MCwgMHg5ZiwgMHg5NiwKKyAgICAgICAgMHhlOSwgMHgzZCwgMHg3ZSwgMHgxMSwgMHg3MywgMHg5MywgMHgxNywgMHgyYSwKKyAgICAgICAgMHhhZSwgMHgyZCwgMHg4YSwgMHg1NywgMHgxZSwgMHgwMywgMHhhYywgMHg5YywKKyAgICAgICAgMHg5ZSwgMHhiNywgMHg2ZiwgMHhhYywgMHg0NSwgMHhhZiwgMHg4ZSwgMHg1MSwKKyAgICAgICAgMHg5NCwgMHhiYSwgMHg4OCwgMHgyZSwgMHgwZSwgMHgxMiwgMHgxMSwgMHg1NSwKKyAgICAgICAgMHgzMCwgMHhjOCwgMHgxYywgMHg0NiwgMHhhMywgMHg1YywgMHhlNCwgMHgxMSwKKyAgICAgICAgMHhlNSwgMHhmYiwgMHhjMSwgMHgxOSwgMHgxYSwgMHgwYSwgMHg1MiwgMHhlZiwKKyAgICAgICAgMHhmNiwgMHg5ZiwgMHgyNCwgMHg0NSwgMHhkZiwgMHg0ZiwgMHg5YiwgMHgxNywKKyAgICAgICAgMHhhZCwgMHgyYiwgMHg0MSwgMHg3YiwgMHhlNiwgMHg2YywgMHgzNywgMHgxMAorICAgIH07CisKKyAgICBTdWJTYW1wbGUgc3ViU2FtcGxlc1trTnVtU3Vic2FtcGxlc10gPSB7CisgICAgICAgIHs4LCAzMn0sCisgICAgICAgIHs4LCAzMn0KKyAgICB9OworCisgICAgYXR0ZW1wdERlY3J5cHRFeHBlY3RpbmdTdWNjZXNzPGtUb3RhbFNpemU+KGtleSwgaXYsIGVuY3J5cHRlZCwgZGVjcnlwdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJTYW1wbGVzLCBrTnVtU3Vic2FtcGxlcyk7Cit9CisKK1RFU1RfRihBZXNDdHJEZWNyeXB0b3JUZXN0LCBEZWNyeXB0c1VuYWxpZ25lZE1peGVkU3ViU2FtcGxlcykgeworICAgIGNvbnN0IHNpemVfdCBrVG90YWxTaXplID0gODA7CisgICAgY29uc3Qgc2l6ZV90IGtOdW1TdWJzYW1wbGVzID0gMjsKKworICAgIC8vIEJhc2VkIG9uIHRlc3QgdmVjdG9ycyBmcm9tIE5JU1QtODAwLTM4QQorICAgIEtleSBrZXkgPSB7CisgICAgICAgIDB4MmIsIDB4N2UsIDB4MTUsIDB4MTYsIDB4MjgsIDB4YWUsIDB4ZDIsIDB4YTYsCisgICAgICAgIDB4YWIsIDB4ZjcsIDB4MTUsIDB4ODgsIDB4MDksIDB4Y2YsIDB4NGYsIDB4M2MKKyAgICB9OworCisgICAgSXYgaXYgPSB7CisgICAgICAgIDB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsCisgICAgICAgIDB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYKKyAgICB9OworCisgICAgdWludDhfdCBlbmNyeXB0ZWRba1RvdGFsU2l6ZV0gPSB7CisgICAgICAgIC8vIDggY2xlYXIgYnl0ZXMKKyAgICAgICAgMHhmMCwgMHgxMywgMHhjYSwgMHhjNywgMHgwMCwgMHg2NCwgMHgwYiwgMHhiYiwKKyAgICAgICAgLy8gMzAgZW5jcnlwdGVkIGJ5dGVzCisgICAgICAgIDB4ODcsIDB4NGQsIDB4NjEsIDB4OTEsIDB4YjYsIDB4MjAsIDB4ZTMsIDB4MjYsCisgICAgICAgIDB4MWIsIDB4ZWYsIDB4NjgsIDB4NjQsIDB4OTksIDB4MGQsIDB4YjYsIDB4Y2UsCisgICAgICAgIDB4OTgsIDB4MDYsIDB4ZjYsIDB4NmIsIDB4NzksIDB4NzAsIDB4ZmQsIDB4ZmYsCisgICAgICAgIDB4ODYsIDB4MTcsIDB4MTgsIDB4N2IsIDB4YjksIDB4ZmYsCisgICAgICAgIC8vIDggY2xlYXIgYnl0ZXMKKyAgICAgICAgMHg5NCwgMHhiYSwgMHg4OCwgMHgyZSwgMHgwZSwgMHgxMiwgMHgxMSwgMHg1NSwKKyAgICAgICAgLy8gMzQgZW5jcnlwdGVkIGJ5dGVzCisgICAgICAgIDB4ZmQsIDB4ZmYsIDB4NWEsIDB4ZTQsIDB4ZGYsIDB4M2UsIDB4ZGIsIDB4ZDUsCisgICAgICAgIDB4ZDMsIDB4NWUsIDB4NWIsIDB4NGYsIDB4MDksIDB4MDIsIDB4MGQsIDB4YjAsCisgICAgICAgIDB4M2UsIDB4YWIsIDB4MWUsIDB4MDMsIDB4MWQsIDB4ZGEsIDB4MmYsIDB4YmUsCisgICAgICAgIDB4MDMsIDB4ZDEsIDB4NzksIDB4MjEsIDB4NzAsIDB4YTAsIDB4ZjMsIDB4MDAsCisgICAgICAgIDB4OWMsIDB4ZWUKKyAgICB9OworCisgICAgdWludDhfdCBkZWNyeXB0ZWRba1RvdGFsU2l6ZV0gPSB7CisgICAgICAgIDB4ZjAsIDB4MTMsIDB4Y2EsIDB4YzcsIDB4MDAsIDB4NjQsIDB4MGIsIDB4YmIsCisgICAgICAgIDB4NmIsIDB4YzEsIDB4YmUsIDB4ZTIsIDB4MmUsIDB4NDAsIDB4OWYsIDB4OTYsCisgICAgICAgIDB4ZTksIDB4M2QsIDB4N2UsIDB4MTEsIDB4NzMsIDB4OTMsIDB4MTcsIDB4MmEsCisgICAgICAgIDB4YWUsIDB4MmQsIDB4OGEsIDB4NTcsIDB4MWUsIDB4MDMsIDB4YWMsIDB4OWMsCisgICAgICAgIDB4OWUsIDB4YjcsIDB4NmYsIDB4YWMsIDB4NDUsIDB4YWYsIDB4OTQsIDB4YmEsCisgICAgICAgIDB4ODgsIDB4MmUsIDB4MGUsIDB4MTIsIDB4MTEsIDB4NTUsIDB4OGUsIDB4NTEsCisgICAgICAgIDB4MzAsIDB4YzgsIDB4MWMsIDB4NDYsIDB4YTMsIDB4NWMsIDB4ZTQsIDB4MTEsCisgICAgICAgIDB4ZTUsIDB4ZmIsIDB4YzEsIDB4MTksIDB4MWEsIDB4MGEsIDB4NTIsIDB4ZWYsCisgICAgICAgIDB4ZjYsIDB4OWYsIDB4MjQsIDB4NDUsIDB4ZGYsIDB4NGYsIDB4OWIsIDB4MTcsCisgICAgICAgIDB4YWQsIDB4MmIsIDB4NDEsIDB4N2IsIDB4ZTYsIDB4NmMsIDB4MzcsIDB4MTAKKyAgICB9OworCisgICAgU3ViU2FtcGxlIHN1YlNhbXBsZXNba051bVN1YnNhbXBsZXNdID0geworICAgICAgICB7OCwgMzB9LAorICAgICAgICB7OCwgMzR9CisgICAgfTsKKworICAgIGF0dGVtcHREZWNyeXB0RXhwZWN0aW5nU3VjY2VzczxrVG90YWxTaXplPihrZXksIGl2LCBlbmNyeXB0ZWQsIGRlY3J5cHRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViU2FtcGxlcywga051bVN1YnNhbXBsZXMpOworfQorCitURVNUX0YoQWVzQ3RyRGVjcnlwdG9yVGVzdCwgRGVjcnlwdHNDb21wbGV4TWl4ZWRTdWJTYW1wbGVzKSB7CisgICAgY29uc3Qgc2l6ZV90IGtUb3RhbFNpemUgPSA3MjsKKyAgICBjb25zdCBzaXplX3Qga051bVN1YnNhbXBsZXMgPSA2OworCisgICAgLy8gQmFzZWQgb24gdGVzdCB2ZWN0b3JzIGZyb20gTklTVC04MDAtMzhBCisgICAgS2V5IGtleSA9IHsKKyAgICAgICAgMHgyYiwgMHg3ZSwgMHgxNSwgMHgxNiwgMHgyOCwgMHhhZSwgMHhkMiwgMHhhNiwKKyAgICAgICAgMHhhYiwgMHhmNywgMHgxNSwgMHg4OCwgMHgwOSwgMHhjZiwgMHg0ZiwgMHgzYworICAgIH07CisKKyAgICBJdiBpdiA9IHsKKyAgICAgICAgMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywKKyAgICAgICAgMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZgorICAgIH07CisKKyAgICB1aW50OF90IGVuY3J5cHRlZFtrVG90YWxTaXplXSA9IHsKKyAgICAgICAgLy8gNCBjbGVhciBieXRlcworICAgICAgICAweGYwLCAweDEzLCAweGNhLCAweGM3LAorICAgICAgICAvLyAxIGVuY3J5cHRlZCBieXRlcworICAgICAgICAweDg3LAorICAgICAgICAvLyA5IGVuY3J5cHRlZCBieXRlcworICAgICAgICAweDRkLCAweDYxLCAweDkxLCAweGI2LCAweDIwLCAweGUzLCAweDI2LCAweDFiLAorICAgICAgICAweGVmLAorICAgICAgICAvLyAxMSBjbGVhciBieXRlcworICAgICAgICAweDgxLCAweDRmLCAweDI0LCAweDg3LCAweDBlLCAweGRlLCAweGJhLCAweGFkLAorICAgICAgICAweDExLCAweDliLCAweDQ2LAorICAgICAgICAvLyAyMCBlbmNyeXB0ZWQgYnl0ZXMKKyAgICAgICAgMHg2OCwgMHg2NCwgMHg5OSwgMHgwZCwgMHhiNiwgMHhjZSwKKyAgICAgICAgMHg5OCwgMHgwNiwgMHhmNiwgMHg2YiwgMHg3OSwgMHg3MCwgMHhmZCwgMHhmZiwKKyAgICAgICAgMHg4NiwgMHgxNywgMHgxOCwgMHg3YiwgMHhiOSwgMHhmZiwKKyAgICAgICAgLy8gOCBjbGVhciBieXRlcworICAgICAgICAweDk0LCAweGJhLCAweDg4LCAweDJlLCAweDBlLCAweDEyLCAweDExLCAweDU1LAorICAgICAgICAvLyAzIGNsZWFyIGJ5dGVzCisgICAgICAgIDB4MTAsIDB4ZjUsIDB4MjIsCisgICAgICAgIC8vIDE0IGVuY3J5cHRlZCBieXRlcworICAgICAgICAweGZkLCAweGZmLCAweDVhLCAweGU0LCAweGRmLCAweDNlLCAweGRiLCAweGQ1LAorICAgICAgICAweGQzLCAweDVlLCAweDViLCAweDRmLCAweDA5LCAweDAyLAorICAgICAgICAvLyAyIGNsZWFyIGJ5dGVzCisgICAgICAgIDB4MDIsIDB4MDEKKyAgICB9OworCisgICAgdWludDhfdCBkZWNyeXB0ZWRba1RvdGFsU2l6ZV0gPSB7CisgICAgICAgIDB4ZjAsIDB4MTMsIDB4Y2EsIDB4YzcsIDB4NmIsIDB4YzEsIDB4YmUsIDB4ZTIsCisgICAgICAgIDB4MmUsIDB4NDAsIDB4OWYsIDB4OTYsIDB4ZTksIDB4M2QsIDB4ODEsIDB4NGYsCisgICAgICAgIDB4MjQsIDB4ODcsIDB4MGUsIDB4ZGUsIDB4YmEsIDB4YWQsIDB4MTEsIDB4OWIsCisgICAgICAgIDB4NDYsIDB4N2UsIDB4MTEsIDB4NzMsIDB4OTMsIDB4MTcsIDB4MmEsIDB4YWUsCisgICAgICAgIDB4MmQsIDB4OGEsIDB4NTcsIDB4MWUsIDB4MDMsIDB4YWMsIDB4OWMsIDB4OWUsCisgICAgICAgIDB4YjcsIDB4NmYsIDB4YWMsIDB4NDUsIDB4YWYsIDB4OTQsIDB4YmEsIDB4ODgsCisgICAgICAgIDB4MmUsIDB4MGUsIDB4MTIsIDB4MTEsIDB4NTUsIDB4MTAsIDB4ZjUsIDB4MjIsCisgICAgICAgIDB4OGUsIDB4NTEsIDB4MzAsIDB4YzgsIDB4MWMsIDB4NDYsIDB4YTMsIDB4NWMsCisgICAgICAgIDB4ZTQsIDB4MTEsIDB4ZTUsIDB4ZmIsIDB4YzEsIDB4MTksIDB4MDIsIDB4MDEKKyAgICB9OworCisgICAgU3ViU2FtcGxlIHN1YlNhbXBsZXNba051bVN1YnNhbXBsZXNdID0geworICAgICAgICB7NCwgMX0sCisgICAgICAgIHswLCA5fSwKKyAgICAgICAgezExLCAyMH0sCisgICAgICAgIHs4LCAwfSwKKyAgICAgICAgezMsIDE0fSwKKyAgICAgICAgezIsIDB9CisgICAgfTsKKworICAgIGF0dGVtcHREZWNyeXB0RXhwZWN0aW5nU3VjY2VzczxrVG90YWxTaXplPihrZXksIGl2LCBlbmNyeXB0ZWQsIGRlY3J5cHRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViU2FtcGxlcywga051bVN1YnNhbXBsZXMpOworfQorCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0FuZHJvaWQubWsgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNWJiMjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNTIgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQnVpbGRzIENsZWFyS2V5IERybSBUZXN0cworIworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBDbGVhcktleURybVVuaXRUZXN0CitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIEFlc0N0ckRlY3J5cHRvclVuaXR0ZXN0LmNwcCBcCisgICAgSW5pdERhdGFQYXJzZXJVbml0dGVzdC5jcHAgXAorICAgIEpzb25XZWJLZXlVbml0dGVzdC5jcHAgXAorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICBiaW9uaWMgXAorICAgIGV4dGVybmFsL2d0ZXN0L2luY2x1ZGUgXAorICAgIGV4dGVybmFsL2pzbW4gXAorICAgIGV4dGVybmFsL29wZW5zc2wvaW5jbHVkZSBcCisgICAgZXh0ZXJuYWwvc3RscG9ydC9zdGxwb3J0IFwKKyAgICBmcmFtZXdvcmtzL2F2L2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5IFwKKyAgICBmcmFtZXdvcmtzL2F2L2luY2x1ZGUgXAorICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUgXAorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJndGVzdCBcCisgICAgbGliZ3Rlc3RfbWFpbiBcCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgIGxpYmNyeXB0byBcCisgICAgbGliZHJtY2xlYXJrZXlwbHVnaW4gXAorICAgIGxpYmxvZyBcCisgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBcCisgICAgbGlic3RscG9ydCBcCisgICAgbGlidXRpbHMgXAorCitpbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9Jbml0RGF0YVBhcnNlclVuaXR0ZXN0LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0luaXREYXRhUGFyc2VyVW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYTY1ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9Jbml0RGF0YVBhcnNlclVuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDIzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKKyNpbmNsdWRlICJJbml0RGF0YVBhcnNlci5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworbmFtZXNwYWNlIHsKKyAgICBjb25zdCBzaXplX3Qga0tleUlkU2l6ZSA9IDE2OworICAgIGNvbnN0IFN0cmluZzgga0NlbmNUeXBlKCJjZW5jIik7CisgICAgY29uc3QgU3RyaW5nOCBrV2ViTVR5cGUoIndlYm0iKTsKKyAgICBjb25zdCBTdHJpbmc4IGtCYXNlNjRQYWRkaW5nKCI9Iik7Cit9CisKK2NsYXNzIEluaXREYXRhUGFyc2VyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworICBwcm90ZWN0ZWQ6CisgICAgc3RhdHVzX3QgYXR0ZW1wdFBhcnNlKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGluaXREYXRhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+KiBsaWNlbnNlUmVxdWVzdCkgeworICAgICAgICBJbml0RGF0YVBhcnNlciBwYXJzZXI7CisgICAgICAgIHJldHVybiBwYXJzZXIucGFyc2UoaW5pdERhdGEsIGluaXREYXRhVHlwZSwgbGljZW5zZVJlcXVlc3QpOworICAgIH0KKworICAgIHZvaWQgYXR0ZW1wdFBhcnNlRXhwZWN0aW5nU3VjY2Vzcyhjb25zdCBWZWN0b3I8dWludDhfdD4mIGluaXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBpbml0RGF0YVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxTdHJpbmc4PiYgZXhwZWN0ZWRLZXlzKSB7CisgICAgICAgIGNvbnN0IFN0cmluZzgga1JlcXVlc3RQcmVmaXgoIntcImtpZHNcIjpbIik7CisgICAgICAgIGNvbnN0IFN0cmluZzgga1JlcXVlc3RTdWZmaXgoIl0sXCJ0eXBlXCI6XCJ0ZW1wb3JhcnlcIn0iKTsKKyAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IHJlcXVlc3Q7CisgICAgICAgIEFTU0VSVF9FUShhbmRyb2lkOjpPSywgYXR0ZW1wdFBhcnNlKGluaXREYXRhLCBpbml0RGF0YVR5cGUsICZyZXF1ZXN0KSk7CisKKyAgICAgICAgU3RyaW5nOCByZXF1ZXN0U3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHJlcXVlc3QuYXJyYXkoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9FUSgwLCByZXF1ZXN0U3RyaW5nLmZpbmQoa1JlcXVlc3RQcmVmaXgpKTsKKyAgICAgICAgRVhQRUNUX0VRKHJlcXVlc3RTdHJpbmcuc2l6ZSgpIC0ga1JlcXVlc3RTdWZmaXguc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgcmVxdWVzdFN0cmluZy5maW5kKGtSZXF1ZXN0U3VmZml4KSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZXhwZWN0ZWRLZXlzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBBU3RyaW5nIGVuY29kZWRJZEFTdHJpbmc7CisgICAgICAgICAgICBhbmRyb2lkOjplbmNvZGVCYXNlNjQoZXhwZWN0ZWRLZXlzW2ldLCBrS2V5SWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGVkSWRBU3RyaW5nKTsKKyAgICAgICAgICAgIFN0cmluZzggZW5jb2RlZElkKGVuY29kZWRJZEFTdHJpbmcuY19zdHIoKSk7CisgICAgICAgICAgICBlbmNvZGVkSWQucmVtb3ZlQWxsKGtCYXNlNjRQYWRkaW5nKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHJlcXVlc3RTdHJpbmcuY29udGFpbnMoZW5jb2RlZElkKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGF0dGVtcHRQYXJzZUV4cGVjdGluZ0ZhaWx1cmUoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgaW5pdERhdGFUeXBlKSB7CisgICAgICAgIFZlY3Rvcjx1aW50OF90PiByZXF1ZXN0OworICAgICAgICBBU1NFUlRfTkUoYW5kcm9pZDo6T0ssIGF0dGVtcHRQYXJzZShpbml0RGF0YSwgaW5pdERhdGFUeXBlLCAmcmVxdWVzdCkpOworICAgICAgICBFWFBFQ1RfRVEoMCwgcmVxdWVzdC5zaXplKCkpOworICAgIH0KK307CisKK1RFU1RfRihJbml0RGF0YVBhcnNlclRlc3QsIFBhcnNlc1NpbmdsZUtleVBzc2gpIHsKKyAgICB1aW50OF90IHBzc2hbNTJdID0geworICAgICAgICAwLCAwLCAwLCA1MiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUb3RhbCBTaXplCisgICAgICAgICdwJywgJ3MnLCAncycsICdoJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBTU0gKKyAgICAgICAgMSwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmVyc2lvbgorICAgICAgICAweDEwLCAweDc3LCAweGVmLCAweGVjLCAweGMwLCAweGIyLCAweDRkLCAweDAyLCAvLyBTeXN0ZW0gSUQKKyAgICAgICAgMHhhYywgMHhlMywgMHgzYywgMHgxZSwgMHg1MiwgMHhlMiwgMHhmYiwgMHg0YiwKKyAgICAgICAgMCwgMCwgMCwgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gS2V5IENvdW50CisgICAgICAgIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8vIEtleSBJRCAjMQorICAgICAgICAweDM4LCAweDM5LCAweDMwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAvLyAgICIwMTIzNDU2Nzg5MEFCQ0RFIgorICAgICAgICAwLCAwLCAwLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRhIFNpemUgKGFsd2F5cyAwKQorICAgIH07CisgICAgVmVjdG9yPHVpbnQ4X3Q+IGluaXREYXRhOworICAgIGluaXREYXRhLmFwcGVuZEFycmF5KHBzc2gsIDUyKTsKKworICAgIFZlY3RvcjxTdHJpbmc4PiBleHBlY3RlZEtleXM7CisgICAgZXhwZWN0ZWRLZXlzLnB1c2goU3RyaW5nOCgiMDEyMzQ1Njc4OTBBQkNERSIpKTsKKworICAgIGF0dGVtcHRQYXJzZUV4cGVjdGluZ1N1Y2Nlc3MoaW5pdERhdGEsIGtDZW5jVHlwZSwgZXhwZWN0ZWRLZXlzKTsKK30KKworVEVTVF9GKEluaXREYXRhUGFyc2VyVGVzdCwgUGFyc2VzTXVsdGlwbGVLZXlQc3NoKSB7CisgICAgdWludDhfdCBwc3NoWzg0XSA9IHsKKyAgICAgICAgMCwgMCwgMCwgODQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVG90YWwgU2l6ZQorICAgICAgICAncCcsICdzJywgJ3MnLCAnaCcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQU1NICisgICAgICAgIDEsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZlcnNpb24KKyAgICAgICAgMHgxMCwgMHg3NywgMHhlZiwgMHhlYywgMHhjMCwgMHhiMiwgMHg0ZCwgMHgwMiwgLy8gU3lzdGVtIElECisgICAgICAgIDB4YWMsIDB4ZTMsIDB4M2MsIDB4MWUsIDB4NTIsIDB4ZTIsIDB4ZmIsIDB4NGIsCisgICAgICAgIDAsIDAsIDAsIDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEtleSBDb3VudAorICAgICAgICAweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvLyBLZXkgSUQgIzEKKyAgICAgICAgMHgzOCwgMHgzOSwgMHgzMCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgLy8gICAiMDEyMzQ1Njc4OTBBQkNERSIKKyAgICAgICAgMHg0MywgMHg2YywgMHg2NSwgMHg2MSwgMHg3MiwgMHg0YiwgMHg2NSwgMHg3OSwgLy8gS2V5IElEICMyCisgICAgICAgIDB4NDMsIDB4NmMsIDB4NjUsIDB4NjEsIDB4NzIsIDB4NGIsIDB4NjUsIDB4NzksIC8vICAgIkNsZWFyS2V5Q2xlYXJLZXkiCisgICAgICAgIDB4MjAsIDB4NDcsIDB4NGYsIDB4NGYsIDB4NDcsIDB4NGMsIDB4NDUsIDB4MjAsIC8vIEtleSBJRCAjMworICAgICAgICAweDIwLCAweDQ3LCAweDRmLCAweDRmLCAweDQ3LCAweDRjLCAweDQ1LCAweDIwLCAvLyAgICIgR09PR0xFICBHT09HTEUgIgorICAgICAgICAwLCAwLCAwLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRhIFNpemUgKGFsd2F5cyAwKQorICAgIH07CisgICAgVmVjdG9yPHVpbnQ4X3Q+IGluaXREYXRhOworICAgIGluaXREYXRhLmFwcGVuZEFycmF5KHBzc2gsIDg0KTsKKworICAgIFZlY3RvcjxTdHJpbmc4PiBleHBlY3RlZEtleXM7CisgICAgZXhwZWN0ZWRLZXlzLnB1c2goU3RyaW5nOCgiMDEyMzQ1Njc4OTBBQkNERSIpKTsKKyAgICBleHBlY3RlZEtleXMucHVzaChTdHJpbmc4KCJDbGVhcktleUNsZWFyS2V5IikpOworICAgIGV4cGVjdGVkS2V5cy5wdXNoKFN0cmluZzgoIiBHT09HTEUgIEdPT0dMRSAiKSk7CisKKyAgICBhdHRlbXB0UGFyc2VFeHBlY3RpbmdTdWNjZXNzKGluaXREYXRhLCBrQ2VuY1R5cGUsIGV4cGVjdGVkS2V5cyk7Cit9CisKK1RFU1RfRihJbml0RGF0YVBhcnNlclRlc3QsIFBhcnNlc1dlYk0pIHsKKyAgICB1aW50OF90IGluaXREYXRhUmF3WzE2XSA9IHsKKyAgICAgICAgMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLy8gS2V5IElECisgICAgICAgIDB4MzgsIDB4MzksIDB4MzAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIC8vICAgIjAxMjM0NTY3ODkwQUJDREUiCisgICAgfTsKKyAgICBWZWN0b3I8dWludDhfdD4gaW5pdERhdGE7CisgICAgaW5pdERhdGEuYXBwZW5kQXJyYXkoaW5pdERhdGFSYXcsIDE2KTsKKworICAgIFZlY3RvcjxTdHJpbmc4PiBleHBlY3RlZEtleXM7CisgICAgZXhwZWN0ZWRLZXlzLnB1c2goU3RyaW5nOCgiMDEyMzQ1Njc4OTBBQkNERSIpKTsKKworICAgIGF0dGVtcHRQYXJzZUV4cGVjdGluZ1N1Y2Nlc3MoaW5pdERhdGEsIGtXZWJNVHlwZSwgZXhwZWN0ZWRLZXlzKTsKK30KKworVEVTVF9GKEluaXREYXRhUGFyc2VyVGVzdCwgRmFpbHNGb3JQc3NoVG9vU21hbGwpIHsKKyAgICB1aW50OF90IHBzc2hbMTZdID0geworICAgICAgICAwLCAwLCAwLCA1MiwKKyAgICAgICAgJ3AnLCAncycsICdzJywgJ2gnLAorICAgICAgICAxLCAwLCAwLCAwLAorICAgICAgICAweDEwLCAweDc3LCAweGVmLCAweGVjCisgICAgfTsKKyAgICBWZWN0b3I8dWludDhfdD4gaW5pdERhdGE7CisgICAgaW5pdERhdGEuYXBwZW5kQXJyYXkocHNzaCwgMTYpOworCisgICAgYXR0ZW1wdFBhcnNlRXhwZWN0aW5nRmFpbHVyZShpbml0RGF0YSwga0NlbmNUeXBlKTsKK30KKworVEVTVF9GKEluaXREYXRhUGFyc2VyVGVzdCwgRmFpbHNGb3JXZWJNVG9vU21hbGwpIHsKKyAgICB1aW50OF90IGluaXREYXRhUmF3WzhdID0geworICAgICAgICAweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3CisgICAgfTsKKyAgICBWZWN0b3I8dWludDhfdD4gaW5pdERhdGE7CisgICAgaW5pdERhdGEuYXBwZW5kQXJyYXkoaW5pdERhdGFSYXcsIDgpOworCisgICAgYXR0ZW1wdFBhcnNlRXhwZWN0aW5nRmFpbHVyZShpbml0RGF0YSwga1dlYk1UeXBlKTsKK30KKworVEVTVF9GKEluaXREYXRhUGFyc2VyVGVzdCwgRmFpbHNGb3JQc3NoQmFkU3lzdGVtSWQpIHsKKyAgICB1aW50OF90IHBzc2hbNTJdID0geworICAgICAgICAwLCAwLCAwLCA1MiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUb3RhbCBTaXplCisgICAgICAgICdwJywgJ3MnLCAncycsICdoJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBTU0gKKyAgICAgICAgMSwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmVyc2lvbgorICAgICAgICAweGFjLCAweGUzLCAweDNjLCAweDFlLCAweDUyLCAweGUyLCAweGZiLCAweDRiLCAvLyBTeXN0ZW0gSUQKKyAgICAgICAgMHgxMCwgMHg3NywgMHhlZiwgMHhlYywgMHhjMCwgMHhiMiwgMHg0ZCwgMHgwMiwKKyAgICAgICAgMCwgMCwgMCwgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gS2V5IENvdW50CisgICAgICAgIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8vIEtleSBJRCAjMQorICAgICAgICAweDM4LCAweDM5LCAweDMwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAvLyAgICIwMTIzNDU2Nzg5MEFCQ0RFIgorICAgICAgICAwLCAwLCAwLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRhIFNpemUgKGFsd2F5cyAwKQorICAgIH07CisgICAgVmVjdG9yPHVpbnQ4X3Q+IGluaXREYXRhOworICAgIGluaXREYXRhLmFwcGVuZEFycmF5KHBzc2gsIDUyKTsKKworICAgIGF0dGVtcHRQYXJzZUV4cGVjdGluZ0ZhaWx1cmUoaW5pdERhdGEsIGtDZW5jVHlwZSk7Cit9CisKK1RFU1RfRihJbml0RGF0YVBhcnNlclRlc3QsIEZhaWxzRm9yUHNzaEJhZFNpemUpIHsKKyAgICB1aW50OF90IHBzc2hbNTJdID0geworICAgICAgICAwLCAwLCA3MCwgMjAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUb3RhbCBTaXplCisgICAgICAgICdwJywgJ3MnLCAncycsICdoJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBTU0gKKyAgICAgICAgMSwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmVyc2lvbgorICAgICAgICAweDEwLCAweDc3LCAweGVmLCAweGVjLCAweGMwLCAweGIyLCAweDRkLCAweDAyLCAvLyBTeXN0ZW0gSUQKKyAgICAgICAgMHhhYywgMHhlMywgMHgzYywgMHgxZSwgMHg1MiwgMHhlMiwgMHhmYiwgMHg0YiwKKyAgICAgICAgMCwgMCwgMCwgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gS2V5IENvdW50CisgICAgICAgIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8vIEtleSBJRCAjMQorICAgICAgICAweDM4LCAweDM5LCAweDMwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAvLyAgICIwMTIzNDU2Nzg5MEFCQ0RFIgorICAgICAgICAwLCAwLCAwLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRhIFNpemUgKGFsd2F5cyAwKQorICAgIH07CisgICAgVmVjdG9yPHVpbnQ4X3Q+IGluaXREYXRhOworICAgIGluaXREYXRhLmFwcGVuZEFycmF5KHBzc2gsIDUyKTsKKworICAgIGF0dGVtcHRQYXJzZUV4cGVjdGluZ0ZhaWx1cmUoaW5pdERhdGEsIGtDZW5jVHlwZSk7Cit9CisKK1RFU1RfRihJbml0RGF0YVBhcnNlclRlc3QsIEZhaWxzRm9yUHNzaFdyb25nVmVyc2lvbikgeworICAgIHVpbnQ4X3QgcHNzaFs1Ml0gPSB7CisgICAgICAgIDAsIDAsIDAsIDUyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRvdGFsIFNpemUKKyAgICAgICAgJ3AnLCAncycsICdzJywgJ2gnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUFNTSAorICAgICAgICAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBWZXJzaW9uCisgICAgICAgIDB4MTAsIDB4NzcsIDB4ZWYsIDB4ZWMsIDB4YzAsIDB4YjIsIDB4NGQsIDB4MDIsIC8vIFN5c3RlbSBJRAorICAgICAgICAweGFjLCAweGUzLCAweDNjLCAweDFlLCAweDUyLCAweGUyLCAweGZiLCAweDRiLAorICAgICAgICAwLCAwLCAwLCAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBLZXkgQ291bnQKKyAgICAgICAgMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLy8gS2V5IElEICMxCisgICAgICAgIDB4MzgsIDB4MzksIDB4MzAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIC8vICAgIjAxMjM0NTY3ODkwQUJDREUiCisgICAgICAgIDAsIDAsIDAsIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERhdGEgU2l6ZSAoYWx3YXlzIDApCisgICAgfTsKKyAgICBWZWN0b3I8dWludDhfdD4gaW5pdERhdGE7CisgICAgaW5pdERhdGEuYXBwZW5kQXJyYXkocHNzaCwgNTIpOworCisgICAgYXR0ZW1wdFBhcnNlRXhwZWN0aW5nRmFpbHVyZShpbml0RGF0YSwga0NlbmNUeXBlKTsKK30KKworVEVTVF9GKEluaXREYXRhUGFyc2VyVGVzdCwgRmFpbHNGb3JQc3NoQmFkS2V5Q291bnQpIHsKKyAgICB1aW50OF90IHBzc2hbNTJdID0geworICAgICAgICAwLCAwLCAwLCA1MiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUb3RhbCBTaXplCisgICAgICAgICdwJywgJ3MnLCAncycsICdoJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBTU0gKKyAgICAgICAgMSwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmVyc2lvbgorICAgICAgICAweDEwLCAweDc3LCAweGVmLCAweGVjLCAweGMwLCAweGIyLCAweDRkLCAweDAyLCAvLyBTeXN0ZW0gSUQKKyAgICAgICAgMHhhYywgMHhlMywgMHgzYywgMHgxZSwgMHg1MiwgMHhlMiwgMHhmYiwgMHg0YiwKKyAgICAgICAgMCwgMCwgMCwgNywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gS2V5IENvdW50CisgICAgICAgIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8vIEtleSBJRCAjMQorICAgICAgICAweDM4LCAweDM5LCAweDMwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAvLyAgICIwMTIzNDU2Nzg5MEFCQ0RFIgorICAgICAgICAwLCAwLCAwLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRhIFNpemUgKGFsd2F5cyAwKQorICAgIH07CisgICAgVmVjdG9yPHVpbnQ4X3Q+IGluaXREYXRhOworICAgIGluaXREYXRhLmFwcGVuZEFycmF5KHBzc2gsIDUyKTsKKworICAgIGF0dGVtcHRQYXJzZUV4cGVjdGluZ0ZhaWx1cmUoaW5pdERhdGEsIGtDZW5jVHlwZSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvSnNvbldlYktleVVuaXR0ZXN0LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0pzb25XZWJLZXlVbml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNiMGQ4NAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0pzb25XZWJLZXlVbml0dGVzdC5jcHAKQEAgLTAsMCArMSwzMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiSnNvbldlYktleS5oIgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJVdGlscy5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0gewordXNpbmcgYW5kcm9pZDo6U3RyaW5nODsKK3VzaW5nIGFuZHJvaWQ6OlZlY3RvcjsKKworY2xhc3MgSnNvbldlYktleVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgICAgSnNvbldlYktleSogandrOworCisgICAgSnNvbldlYktleVRlc3QoKSB7CisgICAgICAgIGp3ayA9IG5ldyBKc29uV2ViS2V5OworICAgIH0KKworICAgIHZpcnR1YWwgfkpzb25XZWJLZXlUZXN0KCkgeworICAgICAgICBpZiAoandrKQorICAgICAgICAgICAgZGVsZXRlIGp3azsKKyAgICB9Cit9OworCit2b2lkIHN0cmluZ0Zyb21WZWN0b3IoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBpbnB1dCwKKyAgICAgICAgU3RyaW5nOCogY29udmVydGVkKSB7CisgICAgY29udmVydGVkLT5jbGVhcigpOworICAgIGlmIChpbnB1dC5pc0VtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5wdXQuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgY29udmVydGVkLT5hcHBlbmRGb3JtYXQoIiVjIiwgaW5wdXQuaXRlbUF0KGkpKTsKKyAgICB9Cit9CisKK3ZvaWQgdmVyaWZ5S2V5cyhjb25zdCBLZXlNYXAmIGtleXMsIGNvbnN0IFN0cmluZzgqIGNsZWFyS2V5cykgeworICAgIGlmIChrZXlzLmlzRW1wdHkoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgU3RyaW5nOCBrZXlTdHJpbmc7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrZXlzLnNpemUoKTsgKytpKSB7CisgICAgICAgIHN0cmluZ0Zyb21WZWN0b3Ioa2V5cy52YWx1ZUF0KGkpLCAma2V5U3RyaW5nKTsKKyAgICAgICAgRVhQRUNUX0VRKGtleVN0cmluZywgY2xlYXJLZXlzW2ldKTsKKyAgICB9Cit9CisKK1RFU1RfRihKc29uV2ViS2V5VGVzdCwgTm9TeW1tZXRyaWNLZXkpIHsKKyAgICBjb25zdCBTdHJpbmc4IGpzKAorICAgICAgICAgICAgInsiCisgICAgICAgICAgICAgICAgIlt7IgorICAgICAgICAgICAgICAgICAgICAiXCJrdHlcIjpcInJzYVwiLCIKKyAgICAgICAgICAgICAgICAgICAgIlwiYWxnXCI6XCJBMTI4S1cxXCIsIgorICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcIlkyeGxZWEpyWlhsclpYbHBaREF4XCIsIgorICAgICAgICAgICAgICAgICAgICAiXCJrXCI6XCIxLUdhd2dndUZ5R3JXS2F2N0FYNFZLVWdcIiIKKyAgICAgICAgICAgICAgICAifV0iCisgICAgICAgICAgIn0iKTsKKworICAgIEtleU1hcCBrZXlzOworICAgIEVYUEVDVF9GQUxTRShqd2stPmV4dHJhY3RLZXlzRnJvbUpzb25XZWJLZXlTZXQoanMsICZrZXlzKSk7CisgICAgRVhQRUNUX1RSVUUoa2V5cy5pc0VtcHR5KCkpOworfQorCitURVNUX0YoSnNvbldlYktleVRlc3QsIE5vS2V5c1RhZykgeworICAgIGNvbnN0IFN0cmluZzgganMoCisgICAgICAgICAgICAieyIKKyAgICAgICAgICAgICAgICAiW3siCisgICAgICAgICAgICAgICAgICAgICJcImt0eVwiOlwib2N0XCIsIgorICAgICAgICAgICAgICAgICAgICAiXCJhbGdcIjpcIkExMjhLVzFcIiwiCisgICAgICAgICAgICAgICAgICAgICJcImtpZFwiOlwiWTJ4bFlYSnJaWGxyWlhscFpEQXhcIiwiCisgICAgICAgICAgICAgICAgICAgICJcImtcIjpcIjEtR2F3Z2d1RnlHcldLYXY3QVg0VktVZ1wiIgorICAgICAgICAgICAgICAgICJ9LCIKKyAgICAgICAgICAgICAgICAieyIKKyAgICAgICAgICAgICAgICAgICAgIlwia3R5XCI6XCJvY3RcIiwiCisgICAgICAgICAgICAgICAgICAgICJcImFsZ1wiOlwiQTEyOEtXMlwiLCIKKyAgICAgICAgICAgICAgICAgICAgIlwia1wiOlwiUjI5dlpDQmtZWGtoXCIsIgorICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcIlkyeGxZWEpyWlhsclpYbHBaREF5XCIiCisgICAgICAgICAgICAgICAgIn1dIgorICAgICAgICAgICAgIn0iKTsKKworICAgIEtleU1hcCBrZXlzOworICAgIEVYUEVDVF9GQUxTRShqd2stPmV4dHJhY3RLZXlzRnJvbUpzb25XZWJLZXlTZXQoanMsICZrZXlzKSk7CisgICAgRVhQRUNUX1RSVUUoa2V5cy5pc0VtcHR5KCkpOworfQorCitURVNUX0YoSnNvbldlYktleVRlc3QsIE5vS2V5SWQpIHsKKyAgICBjb25zdCBTdHJpbmc4IGpzKAorICAgICAgICAgICAgInsiCisgICAgICAgICAgICAgICAgIlwia2V5c1wiOiIKKyAgICAgICAgICAgICAgICAgICAgIlt7IgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia3R5XCI6XCJvY3RcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImFsZ1wiOlwiQTEyOEtXMVwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia1wiOlwiU0dWc2JHOGdSbkpwWlc1a0lTRT1cIiIKKyAgICAgICAgICAgICAgICAgICAgIn0iCisgICAgICAgICAgICAgICAgICAgICJ7IgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia3R5XCI6XCJvY3RcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImFsZ1wiOlwiQTEyOEtXMlwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia1wiOlwiUjI5dlpDQmtZWGtoXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcIlkyeGxZWEpyWlhsclpYbHBaREF5XCIiCisgICAgICAgICAgICAgICAgICAgICJ9XSIKKyAgICAgICAgICAgICJ9Iik7CisKKyAgICBLZXlNYXAga2V5czsKKyAgICBFWFBFQ1RfVFJVRShqd2stPmV4dHJhY3RLZXlzRnJvbUpzb25XZWJLZXlTZXQoanMsICZrZXlzKSk7CisgICAgRVhQRUNUX1RSVUUoa2V5cy5zaXplKCkgPT0gMSk7CisKKyAgICBjb25zdCBTdHJpbmc4IGNsZWFyS2V5cygiR29vZCBkYXkhIik7CisgICAgdmVyaWZ5S2V5cyhrZXlzLCAmY2xlYXJLZXlzKTsKK30KKworVEVTVF9GKEpzb25XZWJLZXlUZXN0LCBOb0tleSkgeworICAgIGNvbnN0IFN0cmluZzgganMoCisgICAgICAgICAgICAieyIKKyAgICAgICAgICAgICAgICAiXCJrZXlzXCI6IgorICAgICAgICAgICAgICAgICAgICAiW3siCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrdHlcIjpcIm9jdFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwiYWxnXCI6XCJBMTI4S1cxXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcImBcIiIKKyAgICAgICAgICAgICAgICAgICAgIn0iCisgICAgICAgICAgICAgICAgICAgICJ7IgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia3R5XCI6XCJvY3RcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImFsZ1wiOlwiQTEyOEtXMlwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia1wiOlwiUjI5dlpDQmtZWGtoXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcIlkyeGxZWEpyWlhsclpYbHBaREF5XCIiCisgICAgICAgICAgICAgICAgICAgICJ9XSIKKyAgICAgICAgICAgICJ9Iik7CisKKyAgICBLZXlNYXAga2V5czsKKyAgICBFWFBFQ1RfVFJVRShqd2stPmV4dHJhY3RLZXlzRnJvbUpzb25XZWJLZXlTZXQoanMsICZrZXlzKSk7CisgICAgRVhQRUNUX1RSVUUoa2V5cy5zaXplKCkgPT0gMSk7CisKKyAgICBjb25zdCBTdHJpbmc4IGNsZWFyS2V5cygiR29vZCBkYXkhIik7CisgICAgdmVyaWZ5S2V5cyhrZXlzLCAmY2xlYXJLZXlzKTsKK30KKworVEVTVF9GKEpzb25XZWJLZXlUZXN0LCBNYWxmb3JtZWRLZXkpIHsKKyAgICBjb25zdCBTdHJpbmc4IGpzKAorICAgICAgICAgICAgInsiCisgICAgICAgICAgICAgICAgIlwia2V5c1wiOiIKKyAgICAgICAgICAgICAgICAgICAgIlt7IgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia3R5XCI6XCJvY3RcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImFsZ1wiOlwiQTEyOEtXMVwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia1wiOlwiR2F3Z2d1RnlHcldLYXY3QVg0Vj8/P1wiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia2lkXCI6XCI2N2VmMGdkOHB2ZmQwPVwiIgorICAgICAgICAgICAgICAgICAgICAifSIKKyAgICAgICAgICAgICAgICAgICAgInsiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrdHlcIjpcIm9jdFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwiYWxnXCI6XCJBMTI4S1cxXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrXCI6XCJHYXdnZ3VGeUdyV0thdjdBWDRWPz8/XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjoiCisgICAgICAgICAgICAgICAgICAgICJ9IgorICAgICAgICAgICAgICAgICAgICAieyIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImt0eVwiOlwib2N0XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJhbGdcIjpcIkExMjhLVzFcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICI6XCJHYXdnZ3VGeUdyV0thdjdBWDRWPz8/XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcIjY3ZWYwZ2Q4cHZmZDA9XCIiCisgICAgICAgICAgICAgICAgICAgICJ9IgorICAgICAgICAgICAgICAgICAgICAieyIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImt0eVwiOlwib2N0XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJhbGdcIjpcIkExMjhLVzNcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtpZFwiOlwiWTJ4bFlYSnJaWGxyWlhscFpEQXpcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtcIjpcIlIyOXZaQ0JrWVhraFwiIgorICAgICAgICAgICAgICAgICAgICAifV0iCisgICAgICAgICAgICAifSIpOworCisgICAgS2V5TWFwIGtleXM7CisgICAgRVhQRUNUX1RSVUUoandrLT5leHRyYWN0S2V5c0Zyb21Kc29uV2ViS2V5U2V0KGpzLCAma2V5cykpOworICAgIEVYUEVDVF9UUlVFKGtleXMuc2l6ZSgpID09IDEpOworCisgICAgY29uc3QgU3RyaW5nOCBjbGVhcktleXMoIkdvb2QgZGF5ISIpOworICAgIHZlcmlmeUtleXMoa2V5cywgJmNsZWFyS2V5cyk7Cit9CisKK1RFU1RfRihKc29uV2ViS2V5VGVzdCwgRW1wdHlKc29uV2ViS2V5KSB7CisgICAgY29uc3QgU3RyaW5nOCBqczsKKyAgICBLZXlNYXAga2V5czsKKyAgICBFWFBFQ1RfRkFMU0UoandrLT5leHRyYWN0S2V5c0Zyb21Kc29uV2ViS2V5U2V0KGpzLCAma2V5cykpOworICAgIEVYUEVDVF9UUlVFKGtleXMuaXNFbXB0eSgpKTsKK30KKworVEVTVF9GKEpzb25XZWJLZXlUZXN0LCBNYWxmb3JtZWRKc29uV2ViS2V5KSB7CisgICAgLy8gTWlzc2luZyBiZWdpbiBhcnJheSAnWycKKyAgICBjb25zdCBTdHJpbmc4IGpzKAorICAgICAgICAgICAgInsiCisgICAgICAgICAgICAgICAgIlwia2V5c1wiOiIKKyAgICAgICAgICAgICAgICAgICAgInsiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrdHlcIjpcIm9jdFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwiYWxnXCI6XCJBMTI4S1cxXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrXCI6XCJHYXdnZ3VGeUdyV0thdjdBWDRWS1VnXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcIjY3ZWYwZ2Q4cHZmZDA9XCIiCisgICAgICAgICAgICAgICAgICAgICJ9IgorICAgICAgICAgICAgIl0iCisgICAgICAgICAgICAifSIpOworCisgICAgS2V5TWFwIGtleXM7CisgICAgRVhQRUNUX0ZBTFNFKGp3ay0+ZXh0cmFjdEtleXNGcm9tSnNvbldlYktleVNldChqcywgJmtleXMpKTsKKyAgICBFWFBFQ1RfVFJVRShrZXlzLmlzRW1wdHkoKSk7Cit9CisKK1RFU1RfRihKc29uV2ViS2V5VGVzdCwgU2FtZUtleUlkKSB7CisgICAgY29uc3QgU3RyaW5nOCBqcygKKyAgICAgICAgICAgICJ7IgorICAgICAgICAgICAgICAgICJcImtleXNcIjoiCisgICAgICAgICAgICAgICAgICAgICJbeyIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImt0eVwiOlwib2N0XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJhbGdcIjpcIkExMjhLVzFcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtpZFwiOlwiWTJ4bFlYSnJaWGxyWlhscFpEQXhcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtcIjpcIlNHVnNiRzhnUm5KcFpXNWtJU0VcIiIKKyAgICAgICAgICAgICAgICAgICAgIn0iCisgICAgICAgICAgICAgICAgICAgICJ7IgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia3R5XCI6XCJvY3RcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImFsZ1wiOlwiQTEyOEtXMVwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia1wiOlwiU0dWc2JHOGdSbkpwWlc1a0lRXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcIlkyeGxZWEpyWlhsclpYbHBaREF4XCIiCisgICAgICAgICAgICAgICAgICAgICJ9IgorICAgICAgICAgICAgICAgICAgICAieyIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImt0eVwiOlwib2N0XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJhbGdcIjpcIkExMjhLVzNcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtpZFwiOlwiWTJ4bFlYSnJaWGxyWlhscFpEQXpcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtcIjpcIlIyOXZaQ0JrWVhraFwiIgorICAgICAgICAgICAgICAgICAgICAifV0iCisgICAgICAgICAgICAifSIpOworCisgICAgS2V5TWFwIGtleXM7CisgICAgandrLT5leHRyYWN0S2V5c0Zyb21Kc29uV2ViS2V5U2V0KGpzLCAma2V5cyk7CisgICAgRVhQRUNUX1RSVUUoa2V5cy5zaXplKCkgPT0gMik7CisKKyAgICBjb25zdCBTdHJpbmc4IGNsZWFyS2V5c1tdID0KKyAgICAgICAgICAgIHsgU3RyaW5nOCgiSGVsbG8gRnJpZW5kISIpLCBTdHJpbmc4KCJHb29kIGRheSEiKSB9OworICAgIHZlcmlmeUtleXMoa2V5cywgY2xlYXJLZXlzKTsKK30KKworVEVTVF9GKEpzb25XZWJLZXlUZXN0LCBFeHRyYWN0V2VsbEZvcm1lZEtleXMpIHsKKyAgICBjb25zdCBTdHJpbmc4IGpzKAorICAgICAgICAgICAgInsiCisgICAgICAgICAgICAgICAgIlwia2V5c1wiOiIKKyAgICAgICAgICAgICAgICAgICAgIlt7IgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia3R5XCI6XCJvY3RcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImFsZ1wiOlwiQTEyOEtXMVwiIgorICAgICAgICAgICAgICAgICAgICAifSIKKyAgICAgICAgICAgICAgICAgICAgInsiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrdHlcIjpcIm9jdFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwiYWxnXCI6XCJBMTI4S1cyXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrXCI6XCJTR1ZzYkc4Z1JuSnBaVzVrSVFcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtpZFwiOlwiWTJ4bFlYSnJaWGxyWlhscFpEQXlcIiIKKyAgICAgICAgICAgICAgICAgICAgIn0iCisgICAgICAgICAgICAgICAgICAgICJ7IgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia3R5XCI6XCJvY3RcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImFsZ1wiOlwiQTEyOEtXM1wiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia2lkXCI6XCJZMnhsWVhKclpYbHJaWGxwWkRBelwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia1wiOlwiUjI5dlpDQmtZWGtoXCIiCisgICAgICAgICAgICAgICAgICAgICJ9XSIKKyAgICAgICAgICAgICJ9Iik7CisKKyAgICBLZXlNYXAga2V5czsKKyAgICBqd2stPmV4dHJhY3RLZXlzRnJvbUpzb25XZWJLZXlTZXQoanMsICZrZXlzKTsKKyAgICBFWFBFQ1RfVFJVRShrZXlzLnNpemUoKSA9PSAyKTsKKworICAgIGNvbnN0IFN0cmluZzggY2xlYXJLZXlzW10gPQorICAgICAgICAgICAgeyBTdHJpbmc4KCJIZWxsbyBGcmllbmQhIiksIFN0cmluZzgoIkdvb2QgZGF5ISIpIH07CisgICAgdmVyaWZ5S2V5cyhrZXlzLCBjbGVhcktleXMpOworfQorCitURVNUX0YoSnNvbldlYktleVRlc3QsIEV4dHJhY3RLZXlzKSB7CisgICAgY29uc3QgU3RyaW5nOCBqcygKKyAgICAgICAgICAgICJ7IgorICAgICAgICAgICAgICAgICJcImtleXNcIjoiCisgICAgICAgICAgICAgICAgICAgICJbeyIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtpZFwiOlwiWTJ4bFlYSnJaWGxyWlhscFpEQXhcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtcIjpcIlNHVnNiRzhnUm5KcFpXNWtJU0VcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImt0eVwiOlwib2N0XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJhbGdcIjpcIkExMjhLVzFcIiIKKyAgICAgICAgICAgICAgICAgICAgIn0iCisgICAgICAgICAgICAgICAgICAgICJ7IgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia3R5XCI6XCJvY3RcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImFsZ1wiOlwiQTEyOEtXMlwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia1wiOlwiU0dWc2JHOGdSbkpwWlc1a0lRXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcIlkyeGxZWEpyWlhsclpYbHBaREF5XCIiCisgICAgICAgICAgICAgICAgICAgICJ9IgorICAgICAgICAgICAgICAgICAgICAieyIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImt0eVwiOlwicnNhXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJhbGdcIjpcIkExMjhLVy1yc2FcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtcIjpcIlIyOXZaQ0JrWVhraFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia2lkXCI6XCJyc2EtNjdlZjBnZDhwdmZkMD1cIiIKKyAgICAgICAgICAgICAgICAgICAgIn0iCisgICAgICAgICAgICAgICAgICAgICJ7IgorICAgICAgICAgICAgICAgICAgICAgICAgIlwiYWxnXCI6XCJBMTI4S1czXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcIlkyeGxZWEpyWlhsclpYbHBaREF6XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrXCI6XCJSMjl2WkNCa1lYa2hcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImt0eVwiOlwib2N0XCIiCisgICAgICAgICAgICAgICAgICAgICJ9XSIKKyAgICAgICAgICAgICJ9Iik7CisKKyAgICBLZXlNYXAga2V5czsKKyAgICBqd2stPmV4dHJhY3RLZXlzRnJvbUpzb25XZWJLZXlTZXQoanMsICZrZXlzKTsKKyAgICBFWFBFQ1RfVFJVRShrZXlzLnNpemUoKSA9PSAzKTsKKworICAgIGNvbnN0IFN0cmluZzggY2xlYXJLZXlzW10gPQorICAgICAgICAgICAgeyBTdHJpbmc4KCJIZWxsbyBGcmllbmQhISIpLCBTdHJpbmc4KCJIZWxsbyBGcmllbmQhIiksCisgICAgICAgICAgICAgIFN0cmluZzgoIkdvb2QgZGF5ISIpIH07CisgICAgdmVyaWZ5S2V5cyhrZXlzLCBjbGVhcktleXMpOworfQorCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svQW5kcm9pZC5tayBiL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svQW5kcm9pZC5tawppbmRleCBhZGEyM2EyLi4yNmMyNDViIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9tb2NrL0FuZHJvaWQubWsKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvbW9jay9BbmRyb2lkLm1rCkBAIC0yMSw3ICsyMSw4IEBACiAKIExPQ0FMX01PRFVMRSA6PSBsaWJtb2NrZHJtY3J5cHRvcGx1Z2luCiAKLUxPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9WRU5ET1JfU0hBUkVEX0xJQlJBUklFUykvbWVkaWFkcm0KK0xPQ0FMX1BST1BSSUVUQVJZX01PRFVMRSA6PSB0cnVlCitMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBtZWRpYWRybQogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICBsaWJ1dGlscyBsaWJsb2cKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svTW9ja0RybUNyeXB0b1BsdWdpbi5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9tb2NrL01vY2tEcm1DcnlwdG9QbHVnaW4uY3BwCmluZGV4IGRmMGJjYTMuLjJlYTU1NGIgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svTW9ja0RybUNyeXB0b1BsdWdpbi5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvbW9jay9Nb2NrRHJtQ3J5cHRvUGx1Z2luLmNwcApAQCAtMjk5LDYgKzI5OSwxMiBAQAogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCisgICAgc3RhdHVzX3QgTW9ja0RybVBsdWdpbjo6dW5wcm92aXNpb25EZXZpY2UoKQorICAgIHsKKyAgICAgICAgQUxPR0QoIk1vY2tEcm1QbHVnaW46OnVucHJvdmlzaW9uRGV2aWNlKCkiKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKwogICAgIHN0YXR1c190IE1vY2tEcm1QbHVnaW46OmdldFNlY3VyZVN0b3BzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+ID4gJnNlY3VyZVN0b3BzKQogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwpAQCAtNzI2LDcgKzczMiw3IEBACiAgICAgewogICAgICAgICBTdHJpbmc4IHJlc3VsdDsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TdWJTYW1wbGVzOyBpKyspIHsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIlslZF0ge2NsZWFyOiVkLCBlbmNyeXB0ZWQ6JWR9ICIsIGksCisgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJbJXp1XSB7Y2xlYXI6JXp1LCBlbmNyeXB0ZWQ6JXp1fSAiLCBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mQ2xlYXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mRW5jcnlwdGVkRGF0YSk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svTW9ja0RybUNyeXB0b1BsdWdpbi5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvbW9jay9Nb2NrRHJtQ3J5cHRvUGx1Z2luLmgKaW5kZXggOTdkNzA1Mi4uNGI2MzI5OSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvbW9jay9Nb2NrRHJtQ3J5cHRvUGx1Z2luLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvbW9jay9Nb2NrRHJtQ3J5cHRvUGx1Z2luLmgKQEAgLTg1LDYgKzg1LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmY2VydGlmaWNhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJndyYXBwZWRLZXkpOwogCisgICAgICAgIHN0YXR1c190IHVucHJvdmlzaW9uRGV2aWNlKCk7CisKICAgICAgICAgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcHMoTGlzdDxWZWN0b3I8dWludDhfdD4gPiAmc2VjdXJlU3RvcHMpOwogICAgICAgICBzdGF0dXNfdCByZWxlYXNlU2VjdXJlU3RvcHMoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzc1JlbGVhc2UpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmEuaCBiL2luY2x1ZGUvY2FtZXJhL0NhbWVyYS5oCmluZGV4IDc5NjgyYjguLjJiNjA4NDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYS5oCisrKyBiL2luY2x1ZGUvY2FtZXJhL0NhbWVyYS5oCkBAIC03NCw2ICs3NCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGllbnRVaWQpOwogCisgICAgc3RhdGljICBzdGF0dXNfdCAgY29ubmVjdExlZ2FjeShpbnQgY2FtZXJhSWQsIGludCBoYWxWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpZW50VWlkLCBzcDxDYW1lcmE+JiBjYW1lcmEpOworCiAgICAgICAgICAgICB2aXJ0dWFsICAgICB+Q2FtZXJhKCk7CiAKICAgICAgICAgICAgIHN0YXR1c190ICAgIHJlY29ubmVjdCgpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oIGIvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oCmluZGV4IGQ1MjE1NDMuLmM2MDc0ZmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaAorKysgYi9pbmNsdWRlL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmgKQEAgLTEwMiw2ICsxMDIsMTIgQEAKICAgICB2b2lkIGR1bXAoKSBjb25zdDsKICAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3Q7CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgVmVjdG9yIGNvbnRhaW5pbmcgdGhlIHN1cHBvcnRlZCBwcmV2aWV3IGZvcm1hdHMKKyAgICAgKiBhcyBlbnVtcyBnaXZlbiBpbiBncmFwaGljcy5oLgorICAgICAqLworICAgIHZvaWQgZ2V0U3VwcG9ydGVkUHJldmlld0Zvcm1hdHMoVmVjdG9yPGludD4mIGZvcm1hdHMpIGNvbnN0OworCiAgICAgLy8gUGFyYW1ldGVyIGtleXMgdG8gY29tbXVuaWNhdGUgYmV0d2VlbiBjYW1lcmEgYXBwbGljYXRpb24gYW5kIGRyaXZlci4KICAgICAvLyBUaGUgYWNjZXNzIChyZWFkL3dyaXRlLCByZWFkIG9ubHksIG9yIHdyaXRlIG9ubHkpIGlzIHZpZXdlZCBmcm9tIHRoZQogICAgIC8vIHBlcnNwZWN0aXZlIG9mIGFwcGxpY2F0aW9ucywgbm90IGRyaXZlci4KQEAgLTY3NCw2ICs2ODAsMTMgQEAKICAgICAvLyBIaWdoLWR5bmFtaWMgcmFuZ2UgbW9kZQogICAgIHN0YXRpYyBjb25zdCBjaGFyIExJR0hURlhfSERSW107CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0aGUgc3VwcG9ydGVkIHByZXZpZXcgZm9ybWF0cyBhcyBhbiBlbnVtIGdpdmVuIGluIGdyYXBoaWNzLmgKKyAgICAgKiBjb3Jyc3BvbmRpbmcgdG8gdGhlIGZvcm1hdCBnaXZlbiBpbiB0aGUgaW5wdXQgc3RyaW5nIG9yIC0xIGlmIG5vIHN1Y2gKKyAgICAgKiBjb252ZXJzaW9uIGV4aXN0cy4KKyAgICAgKi8KKyAgICBzdGF0aWMgaW50IHByZXZpZXdGb3JtYXRUb0VudW0oY29uc3QgY2hhciogZm9ybWF0KTsKKwogcHJpdmF0ZToKICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8U3RyaW5nOCxTdHJpbmc4PiAgICBtTWFwOwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYVV0aWxzLmggYi9pbmNsdWRlL2NhbWVyYS9DYW1lcmFVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNmYwNWQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NhbWVyYS9DYW1lcmFVdGlscy5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQ0FNRVJBX0NMSUVOVF9DQU1FUkFVVElMU19ICisjZGVmaW5lIEFORFJPSURfQ0FNRVJBX0NMSUVOVF9DQU1FUkFVVElMU19ICisKKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogQ2FtZXJhVXRpbHMgY29udGFpbnMgdXRpbGl0eSBtZXRob2RzIHRoYXQgYXJlIHNoYXJlZCBiZXR3ZWVuIHRoZSBuYXRpdmUKKyAqIGNhbWVyYSBjbGllbnQsIGFuZCB0aGUgY2FtZXJhIHNlcnZpY2UuCisgKi8KK2NsYXNzIENhbWVyYVV0aWxzIHsKKyAgICBwdWJsaWM6CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIEFOYXRpdmVXaW5kb3cgdHJhbnNmb3JtIGZyb20gdGhlIHN0YXRpYyBjYW1lcmEKKyAgICAgICAgICogbWV0YWRhdGEuICBUaGlzIGlzIGJhc2VkIG9uIHRoZSBzZW5zb3Igb3JpZW50YXRpb24gYW5kIGxlbnMgZmFjaW5nCisgICAgICAgICAqIGF0dHJpYnV0ZXMgb2YgdGhlIGNhbWVyYSBkZXZpY2UuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIHN0YXR1c190IGdldFJvdGF0aW9uVHJhbnNmb3JtKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzdGF0aWNJbmZvLAorICAgICAgICAgICAgICAgIC8qb3V0Ki9pbnQzMl90KiB0cmFuc2Zvcm0pOworICAgIHByaXZhdGU6CisgICAgICAgIENhbWVyYVV0aWxzKCk7Cit9OworCit9IC8qIG5hbWVzcGFjZSBhbmRyb2lkICovCisKKyNlbmRpZiAvKiBBTkRST0lEX0NBTUVSQV9DTElFTlRfQ0FNRVJBVVRJTFNfSCAqLworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9DYXB0dXJlUmVzdWx0LmggYi9pbmNsdWRlL2NhbWVyYS9DYXB0dXJlUmVzdWx0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJlN2Q2ZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY2FtZXJhL0NhcHR1cmVSZXN1bHQuaApAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0NBUFRVUkVSRVNVTFRfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0NBUFRVUkVSRVNVTFRfSAorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogQ2FwdHVyZVJlc3VsdEV4dHJhcyBpcyBhIHN0cnVjdHVyZSB0byBlbmNhcHN1bGF0ZSB2YXJpb3VzIGluZGljZXMgZm9yIGEgY2FwdHVyZSByZXN1bHQuCisgKiBUaGVzZSBpbmRpY2VzIGFyZSBmcmFtZXdvcmstaW50ZXJuYWwgYW5kIG5vdCBzZW50IHRvIHRoZSBIQUwuCisgKi8KK3N0cnVjdCBDYXB0dXJlUmVzdWx0RXh0cmFzIHsKKyAgICAvKioKKyAgICAgKiBBbiBpbnRlZ2VyIHRvIGluZGV4IHRoZSByZXF1ZXN0IHNlcXVlbmNlIHRoYXQgdGhpcyByZXN1bHQgYmVsb25ncyB0by4KKyAgICAgKi8KKyAgICBpbnQzMl90IHJlcXVlc3RJZDsKKworICAgIC8qKgorICAgICAqIEFuIGludGVnZXIgdG8gaW5kZXggdGhpcyByZXN1bHQgaW5zaWRlIGEgcmVxdWVzdCBzZXF1ZW5jZSwgc3RhcnRpbmcgZnJvbSAwLgorICAgICAqLworICAgIGludDMyX3QgYnVyc3RJZDsKKworICAgIC8qKgorICAgICAqIFRPRE86IEFkZCBkb2N1bWVudGF0aW9uIGZvciB0aGlzIGZpZWxkLgorICAgICAqLworICAgIGludDMyX3QgYWZUcmlnZ2VySWQ7CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBBZGQgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBmaWVsZC4KKyAgICAgKi8KKyAgICBpbnQzMl90IHByZWNhcHR1cmVUcmlnZ2VySWQ7CisKKyAgICAvKioKKyAgICAgKiBBIDY0Yml0IGludGVnZXIgdG8gaW5kZXggdGhlIGZyYW1lIG51bWJlciBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXN1bHQuCisgICAgICovCisgICAgaW50NjRfdCBmcmFtZU51bWJlcjsKKworICAgIC8qKgorICAgICAqIFRoZSBwYXJ0aWFsIHJlc3VsdCBjb3VudCAoaW5kZXgpIGZvciB0aGlzIGNhcHR1cmUgcmVzdWx0LgorICAgICAqLworICAgIGludDMyX3QgcGFydGlhbFJlc3VsdENvdW50OworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgaW5pdGlhbGl6ZXMgb2JqZWN0IGFzIGludmFsaWQgYnkgc2V0dGluZyByZXF1ZXN0SWQgdG8gYmUgLTEuCisgICAgICovCisgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcygpCisgICAgICAgIDogcmVxdWVzdElkKC0xKSwKKyAgICAgICAgICBidXJzdElkKDApLAorICAgICAgICAgIGFmVHJpZ2dlcklkKDApLAorICAgICAgICAgIHByZWNhcHR1cmVUcmlnZ2VySWQoMCksCisgICAgICAgICAgZnJhbWVOdW1iZXIoMCksCisgICAgICAgICAgcGFydGlhbFJlc3VsdENvdW50KDApIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiBpdCdzIGEgdmFsaWQgQ2FwdHVyZVJlc3VsdEV4dHJhcyBvYmplY3QuCisgICAgICogT3RoZXJ3aXNlLCByZXR1cm5zIGZhbHNlLiBJdCBpcyB2YWxpZCBvbmx5IHdoZW4gcmVxdWVzdElkIGlzIG5vbi1uZWdhdGl2ZS4KKyAgICAgKi8KKyAgICBib29sIGlzVmFsaWQoKTsKKworICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIHJlYWRGcm9tUGFyY2VsKFBhcmNlbCogcGFyY2VsKTsKKyAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdDsKK307CisKK3N0cnVjdCBDYXB0dXJlUmVzdWx0IDogcHVibGljIHZpcnR1YWwgTGlnaHRSZWZCYXNlPENhcHR1cmVSZXN1bHQ+IHsKKyAgICBDYW1lcmFNZXRhZGF0YSAgICAgICAgICBtTWV0YWRhdGE7CisgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcyAgICAgbVJlc3VsdEV4dHJhczsKKworICAgIENhcHR1cmVSZXN1bHQoKTsKKworICAgIENhcHR1cmVSZXN1bHQoY29uc3QgQ2FwdHVyZVJlc3VsdCYgb3RoZXJSZXN1bHQpOworCisgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgcmVhZEZyb21QYXJjZWwoUGFyY2VsKiBwYXJjZWwpOworICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIHdyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0OworfTsKKworfQorCisjZW5kaWYgLyogQU5EUk9JRF9IQVJEV0FSRV9DQVBUVVJFUkVTVUxUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2FtZXJhL0lDYW1lcmFTZXJ2aWNlLmggYi9pbmNsdWRlL2NhbWVyYS9JQ2FtZXJhU2VydmljZS5oCmluZGV4IGYzNDIxMjIuLmY3ZjA2YmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2FtZXJhL0lDYW1lcmFTZXJ2aWNlLmgKKysrIGIvaW5jbHVkZS9jYW1lcmEvSUNhbWVyYVNlcnZpY2UuaApAQCAtMzEsNiArMzEsOCBAQAogY2xhc3MgSUNhbWVyYURldmljZVVzZXI7CiBjbGFzcyBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOwogY2xhc3MgQ2FtZXJhTWV0YWRhdGE7CitjbGFzcyBWZW5kb3JUYWdEZXNjcmlwdG9yOworY2xhc3MgU3RyaW5nMTY7CiAKIGNsYXNzIElDYW1lcmFTZXJ2aWNlIDogcHVibGljIElJbnRlcmZhY2UKIHsKQEAgLTQ3LDIxICs0OSw0MCBAQAogICAgICAgICBBRERfTElTVEVORVIsCiAgICAgICAgIFJFTU9WRV9MSVNURU5FUiwKICAgICAgICAgR0VUX0NBTUVSQV9DSEFSQUNURVJJU1RJQ1MsCisgICAgICAgIEdFVF9DQU1FUkFfVkVORE9SX1RBR19ERVNDUklQVE9SLAorICAgICAgICBHRVRfTEVHQUNZX1BBUkFNRVRFUlMsCisgICAgICAgIFNVUFBPUlRTX0NBTUVSQV9BUEksCisgICAgICAgIENPTk5FQ1RfTEVHQUNZLAogICAgIH07CiAKICAgICBlbnVtIHsKICAgICAgICAgVVNFX0NBTExJTkdfVUlEID0gLTEKICAgICB9OwogCisgICAgZW51bSB7CisgICAgICAgIEFQSV9WRVJTSU9OXzEgPSAxLAorICAgICAgICBBUElfVkVSU0lPTl8yID0gMiwKKyAgICB9OworCisgICAgZW51bSB7CisgICAgICAgIENBTUVSQV9IQUxfQVBJX1ZFUlNJT05fVU5TUEVDSUZJRUQgPSAtMQorICAgICAgfTsKKwogcHVibGljOgogICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoQ2FtZXJhU2VydmljZSk7CiAKICAgICB2aXJ0dWFsIGludDMyX3QgIGdldE51bWJlck9mQ2FtZXJhcygpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhbWVyYUluZm8oaW50IGNhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IENhbWVyYUluZm8qIGNhbWVyYUluZm8pID0gMDsKKyAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgIHN0cnVjdCBDYW1lcmFJbmZvKiBjYW1lcmFJbmZvKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhpbnQgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEqIGNhbWVyYUluZm8pID0gMDsKKyAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhKiBjYW1lcmFJbmZvKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhbWVyYVZlbmRvclRhZ0Rlc2NyaXB0b3IoCisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiYgZGVzYykgPSAwOwogCiAgICAgLy8gUmV0dXJucyAnT0snIGlmIG9wZXJhdGlvbiBzdWNjZWVkZWQKICAgICAvLyAtIEVycm9yczogQUxSRUFEWV9FWElTVFMgaWYgdGhlIGxpc3RlbmVyIHdhcyBhbHJlYWR5IGFkZGVkCkBAIC05Nyw2ICsxMTgsMzAgQEAKICAgICAgICAgICAgIGludCBjbGllbnRVaWQsCiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBzcDxJQ2FtZXJhRGV2aWNlVXNlcj4mIGRldmljZSkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMZWdhY3lQYXJhbWV0ZXJzKAorICAgICAgICAgICAgaW50IGNhbWVyYUlkLAorICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgU3RyaW5nMTYqIHBhcmFtZXRlcnMpID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgT0sgaWYgZGV2aWNlIHN1cHBvcnRzIGNhbWVyYTIgYXBpLAorICAgICAqIHJldHVybnMgLUVPUE5PVFNVUFAgaWYgaXQgZG9lc24ndC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzQ2FtZXJhQXBpKAorICAgICAgICAgICAgaW50IGNhbWVyYUlkLCBpbnQgYXBpVmVyc2lvbikgPSAwOworCisgICAgLyoqCisgICAgICogQ29ubmVjdCB0aGUgZGV2aWNlIGFzIGEgbGVnYWN5IGRldmljZSBmb3IgYSBnaXZlbiBIQUwgdmVyc2lvbi4KKyAgICAgKiBGb3IgaGFsVmVyc2lvbiwgdXNlIENBTUVSQV9BUElfREVWSUNFX1ZFUlNJT05fKiBmb3IgYSBwYXJ0aWN1bGFyCisgICAgICogdmVyc2lvbiwgb3IgQ0FNRVJBX0hBTF9BUElfVkVSU0lPTl9VTlNQRUNJRklFRCBmb3IgYSBzZXJ2aWNlLXNlbGVjdGVkIHZlcnNpb24uCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25uZWN0TGVnYWN5KGNvbnN0IHNwPElDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsCisgICAgICAgICAgICBpbnQgY2FtZXJhSWQsIGludCBoYWxWZXJzaW9uLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgaW50IGNsaWVudFVpZCwKKyAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgIHNwPElDYW1lcmE+JiBkZXZpY2UpID0gMDsKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaCBiL2luY2x1ZGUvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzU4YWNmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5oCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBWRU5ET1JfVEFHX0RFU0NSSVBUT1JfSAorCisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9jYW1lcmFfdmVuZG9yX3RhZ3MuaD4KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFBhcmNlbDsKKworLyoqCisgKiBWZW5kb3JUYWdEZXNjcmlwdG9yIG9iamVjdHMgYXJlIHBhcmNlbGFibGUgY29udGFpbmVycyBmb3IgdGhlIHZlbmRvciB0YWcKKyAqIGRlZmluaXRpb25zIHByb3ZpZGVkLCBhbmQgYXJlIHR5cGljYWxseSB1c2VkIHRvIHBhc3MgdGhlIHZlbmRvciB0YWcKKyAqIGluZm9ybWF0aW9uIGVudW1lcmF0ZWQgYnkgdGhlIEhBTCB0byBjbGllbnRzIG9mIHRoZSBjYW1lcmEgc2VydmljZS4KKyAqLworY2xhc3MgVmVuZG9yVGFnRGVzY3JpcHRvcgorICAgICAgICA6IHB1YmxpYyBMaWdodFJlZkJhc2U8VmVuZG9yVGFnRGVzY3JpcHRvcj4geworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB+VmVuZG9yVGFnRGVzY3JpcHRvcigpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZm9sbG93aW5nICdnZXQqJyBtZXRob2RzIGltcGxlbWVudCB0aGUgY29ycmVzcG9uZGluZworICAgICAgICAgKiBmdW5jdGlvbnMgZGVmaW5lZCBpbgorICAgICAgICAgKiBzeXN0ZW0vbWVkaWEvY2FtZXJhL2luY2x1ZGUvc3lzdGVtL2NhbWVyYV92ZW5kb3JfdGFncy5oCisgICAgICAgICAqLworCisgICAgICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiB2ZW5kb3IgdGFncyBkZWZpbmVkLgorICAgICAgICBpbnQgZ2V0VGFnQ291bnQoKSBjb25zdDsKKworICAgICAgICAvLyBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGlkJ3Mgb2YgdmVuZG9yIHRhZ3MgZGVmaW5lZC4KKyAgICAgICAgdm9pZCBnZXRUYWdBcnJheSh1aW50MzJfdCogdGFnQXJyYXkpIGNvbnN0OworCisgICAgICAgIC8vIFJldHVybnMgdGhlIHNlY3Rpb24gbmFtZSBzdHJpbmcgZm9yIGEgZ2l2ZW4gdmVuZG9yIHRhZyBpZC4KKyAgICAgICAgY29uc3QgY2hhciogZ2V0U2VjdGlvbk5hbWUodWludDMyX3QgdGFnKSBjb25zdDsKKworICAgICAgICAvLyBSZXR1cm5zIHRoZSB0YWcgbmFtZSBzdHJpbmcgZm9yIGEgZ2l2ZW4gdmVuZG9yIHRhZyBpZC4KKyAgICAgICAgY29uc3QgY2hhciogZ2V0VGFnTmFtZSh1aW50MzJfdCB0YWcpIGNvbnN0OworCisgICAgICAgIC8vIFJldHVybnMgdGhlIHRhZyB0eXBlIGZvciBhIGdpdmVuIHZlbmRvciB0YWcgaWQuCisgICAgICAgIGludCBnZXRUYWdUeXBlKHVpbnQzMl90IHRhZykgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdyaXRlIHRoZSBWZW5kb3JUYWdEZXNjcmlwdG9yIG9iamVjdCBpbnRvIHRoZSBnaXZlbiBwYXJjZWwuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbCgKKyAgICAgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICAgICAgUGFyY2VsKiBwYXJjZWwpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gZ2V0IGEgdmVjdG9yIGNvbnRhaW5pbmcgYWxsIHZlbmRvciB0YWcKKyAgICAgICAgICogc2VjdGlvbnMsIG9yIGFuIGVtcHR5IHZlY3RvciBpZiBub25lIGFyZSBkZWZpbmVkLgorICAgICAgICAgKi8KKyAgICAgICAgU29ydGVkVmVjdG9yPFN0cmluZzg+IGdldEFsbFNlY3Rpb25OYW1lcygpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBMb29rdXAgdGhlIHRhZyBpZCBmb3IgYSBnaXZlbiB0YWcgbmFtZSBhbmQgc2VjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICAgICAqLworICAgICAgICBzdGF0dXNfdCBsb29rdXBUYWcoU3RyaW5nOCBuYW1lLCBTdHJpbmc4IHNlY3Rpb24sIC8qb3V0Ki91aW50MzJfdCogdGFnKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogRHVtcCB0aGUgY3VycmVudGx5IGNvbmZpZ3VyZWQgdmVuZG9yIHRhZ3MgdG8gYSBmaWxlIGRlc2NyaXB0b3IuCisgICAgICAgICAqLworICAgICAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgdmVyYm9zaXR5LCBpbnQgaW5kZW50YXRpb24pIGNvbnN0OworCisgICAgICAgIC8vIFN0YXRpYyBtZXRob2RzOgorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgYSBWZW5kb3JUYWdEZXNjcmlwdG9yIG9iamVjdCBmcm9tIHRoZSBnaXZlbiBwYXJjZWwuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIHN0YXR1c190IGNyZWF0ZUZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwsCisgICAgICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+JiBkZXNjcmlwdG9yKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGEgVmVuZG9yVGFnRGVzY3JpcHRvciBvYmplY3QgZnJvbSB0aGUgZ2l2ZW4gdmVuZG9yX3RhZ19vcHNfdAorICAgICAgICAgKiBzdHJ1Y3QuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIHN0YXR1c190IGNyZWF0ZURlc2NyaXB0b3JGcm9tT3BzKGNvbnN0IHZlbmRvcl90YWdfb3BzX3QqIHZPcHMsCisgICAgICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+JiBkZXNjcmlwdG9yKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgZ2xvYmFsIHZlbmRvciB0YWcgZGVzY3JpcHRvciB0byB1c2UgZm9yIHRoaXMgcHJvY2Vzcy4KKyAgICAgICAgICogQ2FtZXJhIG1ldGFkYXRhIG9wZXJhdGlvbnMgdGhhdCBhY2Nlc3MgdmVuZG9yIHRhZ3Mgd2lsbCB1c2UgdGhlCisgICAgICAgICAqIHZlbmRvciB0YWcgZGVmaW5pdGlvbnMgc2V0IHRoaXMgd2F5LgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRBc0dsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IoY29uc3Qgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4mIGRlc2MpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDbGVhcnMgdGhlIGdsb2JhbCB2ZW5kb3IgdGFnIGRlc2NyaXB0b3IgdXNlZCBieSB0aGlzIHByb2Nlc3MuCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgdm9pZCBjbGVhckdsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgZ2xvYmFsIHZlbmRvciB0YWcgZGVzY3JpcHRvciB1c2VkIGJ5IHRoaXMgcHJvY2Vzcy4KKyAgICAgICAgICogVGhpcyB3aWxsIGNvbnRhaW4gTlVMTCBpZiBubyB2ZW5kb3IgdGFncyBhcmUgZGVmaW5lZC4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiBnZXRHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKCk7CisgICAgcHJvdGVjdGVkOgorICAgICAgICBWZW5kb3JUYWdEZXNjcmlwdG9yKCk7CisgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIEtleWVkVmVjdG9yPFN0cmluZzgsIHVpbnQzMl90Pio+IG1SZXZlcnNlTWFwcGluZzsKKyAgICAgICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIFN0cmluZzg+IG1UYWdUb05hbWVNYXA7CisgICAgICAgIEtleWVkVmVjdG9yPHVpbnQzMl90LCB1aW50MzJfdD4gbVRhZ1RvU2VjdGlvbk1hcDsgLy8gVmFsdWUgaXMgb2Zmc2V0IGluIG1TZWN0aW9ucworICAgICAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgaW50MzJfdD4gbVRhZ1RvVHlwZU1hcDsKKyAgICAgICAgU29ydGVkVmVjdG9yPFN0cmluZzg+IG1TZWN0aW9uczsKKyAgICAgICAgLy8gbXVzdCBiZSBpbnQzMl90IHRvIGJlIGNvbXBhdGlibGUgd2l0aCBQYXJjZWw6OndyaXRlSW50MzIKKyAgICAgICAgaW50MzJfdCBtVGFnQ291bnQ7CisgICAgcHJpdmF0ZToKKyAgICAgICAgdmVuZG9yX3RhZ19vcHMgbVZlbmRvck9wczsKK307CisKK30gLyogbmFtZXNwYWNlIGFuZHJvaWQgKi8KKworI2RlZmluZSBWRU5ET1JfVEFHX0RFU0NSSVBUT1JfSAorI2VuZGlmIC8qIFZFTkRPUl9UQUdfREVTQ1JJUFRPUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuaCBiL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5oCmluZGV4IDhkYWM0ZjIuLjY3MDQ4MGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5oCisrKyBiL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5oCkBAIC0yNCw5ICsyNCwxMiBAQAogI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgogI2luY2x1ZGUgPHN5c3RlbS9jYW1lcmEuaD4KIAorI2luY2x1ZGUgPGNhbWVyYS9DYXB0dXJlUmVzdWx0Lmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIGNsYXNzIENhbWVyYU1ldGFkYXRhOwogCisKIGNsYXNzIElDYW1lcmFEZXZpY2VDYWxsYmFja3MgOiBwdWJsaWMgSUludGVyZmFjZQogewogICAgIC8qKgpAQCAtMzksMjQgKzQyLDI5IEBACiAgICAgICogRXJyb3IgY29kZXMgZm9yIENBTUVSQV9NU0dfRVJST1IKICAgICAgKi8KICAgICBlbnVtIENhbWVyYUVycm9yQ29kZSB7CisgICAgICAgIEVSUk9SX0NBTUVSQV9JTlZBTElEX0VSUk9SID0gLTEsIC8vIFRvIGluZGljYXRlIGFsbCBpbnZhbGlkIGVycm9yIGNvZGVzCiAgICAgICAgIEVSUk9SX0NBTUVSQV9ESVNDT05ORUNURUQgPSAwLAogICAgICAgICBFUlJPUl9DQU1FUkFfREVWSUNFID0gMSwKLSAgICAgICAgRVJST1JfQ0FNRVJBX1NFUlZJQ0UgPSAyCisgICAgICAgIEVSUk9SX0NBTUVSQV9TRVJWSUNFID0gMiwKKyAgICAgICAgRVJST1JfQ0FNRVJBX1JFUVVFU1QgPSAzLAorICAgICAgICBFUlJPUl9DQU1FUkFfUkVTVUxUID0gNCwKKyAgICAgICAgRVJST1JfQ0FNRVJBX0JVRkZFUiA9IDUsCiAgICAgfTsKIAogICAgIC8vIE9uZSB3YXkKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBvbkRldmljZUVycm9yKENhbWVyYUVycm9yQ29kZSBlcnJvckNvZGUpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBvbkRldmljZUVycm9yKENhbWVyYUVycm9yQ29kZSBlcnJvckNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpID0gMDsKIAogICAgIC8vIE9uZSB3YXkKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBvbkRldmljZUlkbGUoKSA9IDA7CiAKICAgICAvLyBPbmUgd2F5Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgb25DYXB0dXJlU3RhcnRlZChpbnQzMl90IHJlcXVlc3RJZCwKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBvbkNhcHR1cmVTdGFydGVkKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wKSA9IDA7CiAKICAgICAvLyBPbmUgd2F5Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgb25SZXN1bHRSZWNlaXZlZChpbnQzMl90IHJlcXVlc3RJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiByZXN1bHQpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBvblJlc3VsdFJlY2VpdmVkKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgPSAwOwogfTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5oIGIvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5oCmluZGV4IGY3MWYzMDIuLjM1NDg4YmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuaAorKysgYi9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmgKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KIAogc3RydWN0IGNhbWVyYV9tZXRhZGF0YTsKIApAQCAtMzAsNiArMzEsMTAgQEAKIGNsYXNzIENhcHR1cmVSZXF1ZXN0OwogY2xhc3MgQ2FtZXJhTWV0YWRhdGE7CiAKK2VudW0geworICAgIE5PX0lOX0ZMSUdIVF9SRVBFQVRJTkdfRlJBTUVTID0gLTEsCit9OworCiBjbGFzcyBJQ2FtZXJhRGV2aWNlVXNlciA6IHB1YmxpYyBJSW50ZXJmYWNlCiB7CiAgICAgLyoqCkBAIC00NCw5ICs0OSw1NSBAQAogICAgICAqIFJlcXVlc3QgSGFuZGxpbmcKICAgICAgKiovCiAKKyAgICAvKioKKyAgICAgKiBGb3Igc3RyZWFtaW5nIHJlcXVlc3RzLCBvdXRwdXQgbGFzdEZyYW1lTnVtYmVyIGlzIHRoZSBsYXN0IGZyYW1lIG51bWJlcgorICAgICAqIG9mIHRoZSBwcmV2aW91cyByZXBlYXRpbmcgcmVxdWVzdC4KKyAgICAgKiBGb3Igbm9uLXN0cmVhbWluZyByZXF1ZXN0cywgb3V0cHV0IGxhc3RGcmFtZU51bWJlciBpcyB0aGUgZXhwZWN0ZWQgbGFzdAorICAgICAqIGZyYW1lIG51bWJlciBvZiB0aGUgY3VycmVudCByZXF1ZXN0LgorICAgICAqLwogICAgIHZpcnR1YWwgaW50ICAgICAgICAgICAgIHN1Ym1pdFJlcXVlc3Qoc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cmVhbWluZyA9IGZhbHNlKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgY2FuY2VsUmVxdWVzdChpbnQgcmVxdWVzdElkKSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cmVhbWluZyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogbGFzdEZyYW1lTnVtYmVyID0gTlVMTCkgPSAwOworCisgICAgLyoqCisgICAgICogRm9yIHN0cmVhbWluZyByZXF1ZXN0cywgb3V0cHV0IGxhc3RGcmFtZU51bWJlciBpcyB0aGUgbGFzdCBmcmFtZSBudW1iZXIKKyAgICAgKiBvZiB0aGUgcHJldmlvdXMgcmVwZWF0aW5nIHJlcXVlc3QuCisgICAgICogRm9yIG5vbi1zdHJlYW1pbmcgcmVxdWVzdHMsIG91dHB1dCBsYXN0RnJhbWVOdW1iZXIgaXMgdGhlIGV4cGVjdGVkIGxhc3QKKyAgICAgKiBmcmFtZSBudW1iZXIgb2YgdGhlIGN1cnJlbnQgcmVxdWVzdC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGludCAgICAgICAgICAgICBzdWJtaXRSZXF1ZXN0TGlzdChMaXN0PHNwPENhcHR1cmVSZXF1ZXN0PiA+IHJlcXVlc3RMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyZWFtaW5nID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqIGxhc3RGcmFtZU51bWJlciA9IE5VTEwpID0gMDsKKworICAgIC8qKgorICAgICAqIE91dHB1dCBsYXN0RnJhbWVOdW1iZXIgaXMgdGhlIGxhc3QgZnJhbWUgbnVtYmVyIG9mIHRoZSBwcmV2aW91cyByZXBlYXRpbmcgcmVxdWVzdC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBjYW5jZWxSZXF1ZXN0KGludCByZXF1ZXN0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiBsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBCZWdpbiB0aGUgZGV2aWNlIGNvbmZpZ3VyYXRpb24uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBiZWdpbkNvbmZpZ3VyZSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IGNhbGwgdG8gZGVsZXRlU3RyZWFtLCBjcmVhdGVTdHJlYW0sCisgICAgICogb3IgZW5kQ29uZmlndXJlLiAgSXQgaXMgbm90IHZhbGlkIHRvIGNhbGwgdGhpcyB3aGVuIHRoZSBkZXZpY2UgaXMgbm90IGlkbGUuCisgICAgICogPHA+CisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgYmVnaW5Db25maWd1cmUoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBFbmQgdGhlIGRldmljZSBjb25maWd1cmF0aW9uLgorICAgICAqCisgICAgICogPHA+CisgICAgICogZW5kQ29uZmlndXJlIG11c3QgYmUgY2FsbGVkIGFmdGVyIHN0cmVhbSBjb25maWd1cmF0aW9uIGlzIGNvbXBsZXRlIChpLmUuIGFmdGVyCisgICAgICogYSBjYWxsIHRvIGJlZ2luQ29uZmlndXJlIGFuZCBzdWJzZXF1ZW50IGNyZWF0ZVN0cmVhbS9kZWxldGVTdHJlYW0gY2FsbHMpLiAgVGhpcworICAgICAqIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgcmVxdWVzdHMgY2FuIGJlIHN1Ym1pdHRlZC4KKyAgICAgKiA8cD4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBlbmRDb25maWd1cmUoKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBkZWxldGVTdHJlYW0oaW50IHN0cmVhbUlkKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgY3JlYXRlU3RyZWFtKApAQCAtNjQsOCArMTE1LDEyIEBACiAgICAgLy8gV2FpdCB1bnRpbCBhbGwgdGhlIHN1Ym1pdHRlZCByZXF1ZXN0cyBoYXZlIGZpbmlzaGVkIHByb2Nlc3NpbmcKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICB3YWl0VW50aWxJZGxlKCkgPSAgMDsKIAotICAgIC8vIEZsdXNoIGFsbCBwZW5kaW5nIGFuZCBpbi1wcm9ncmVzcyB3b3JrIGFzIHF1aWNrbHkgYXMgcG9zc2libGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZmx1c2goKSA9IDA7CisgICAgLyoqCisgICAgICogRmx1c2ggYWxsIHBlbmRpbmcgYW5kIGluLXByb2dyZXNzIHdvcmsgYXMgcXVpY2tseSBhcyBwb3NzaWJsZS4KKyAgICAgKiBPdXRwdXQgbGFzdEZyYW1lTnVtYmVyIGlzIHRoZSBsYXN0IGZyYW1lIG51bWJlciBvZiB0aGUgcHJldmlvdXMgcmVwZWF0aW5nIHJlcXVlc3QuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZmx1c2goLypvdXQqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqIGxhc3RGcmFtZU51bWJlciA9IE5VTEwpID0gMDsKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmgKaW5kZXggZWYzOTJmMC4uN2JlNDQ5YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmgKQEAgLTYxLDYgKzYxLDE3IEBACiAgICAgLy8gIGJ1ZmZlci0+ZnJhbWVDb3VudCAgMAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dEJ1ZmZlcihCdWZmZXIqIGJ1ZmZlciwgaW50NjRfdCBwdHMgPSBrSW52YWxpZFBUUykgPSAwOwogCisgICAgLy8gUmVsZWFzZSAoYSBwb3J0aW9uIG9mKSB0aGUgYnVmZmVyIHByZXZpb3VzbHkgb2J0YWluZWQgYnkgZ2V0TmV4dEJ1ZmZlcigpLgorICAgIC8vIEl0IGlzIHBlcm1pc3NpYmxlIHRvIGNhbGwgcmVsZWFzZUJ1ZmZlcigpIG11bHRpcGxlIHRpbWVzIHBlciBnZXROZXh0QnVmZmVyKCkuCisgICAgLy8gT24gZW50cnk6CisgICAgLy8gIGJ1ZmZlci0+ZnJhbWVDb3VudCAgbnVtYmVyIG9mIGZyYW1lcyB0byByZWxlYXNlLCBtdXN0IGJlIDw9IG51bWJlciBvZiBmcmFtZXMKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICBvYnRhaW5lZCBidXQgbm90IHlldCByZWxlYXNlZAorICAgIC8vICBidWZmZXItPnJhdyAgICAgICAgIHVudXNlZAorICAgIC8vIE9uIHJldHVybjoKKyAgICAvLyAgYnVmZmVyLT5mcmFtZUNvdW50ICAwOyBpbXBsZW1lbnRhdGlvbiBNVVNUIHNldCB0byB6ZXJvCisgICAgLy8gIGJ1ZmZlci0+cmF3ICAgICAgICAgdW5kZWZpbmVkOyBpbXBsZW1lbnRhdGlvbiBpcyBQRVJNSVRURUQgdG8gc2V0IHRvIGFueSB2YWx1ZSwKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICBzbyBpZiBjYWxsZXIgbmVlZHMgdG8gY29udGludWUgdXNpbmcgdGhpcyBidWZmZXIgaXQgbXVzdAorICAgIC8vICAgICAgICAgICAgICAgICAgICAgIGtlZXAgdHJhY2sgb2YgdGhlIHBvaW50ZXIgaXRzZWxmCiAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VCdWZmZXIoQnVmZmVyKiBidWZmZXIpID0gMDsKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9FZmZlY3QuaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9FZmZlY3QuaAppbmRleCBlZWYxYjQxLi41ODM2OTVkIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0F1ZGlvRWZmZWN0LmgKKysrIGIvaW5jbHVkZS9tZWRpYS9BdWRpb0VmZmVjdC5oCkBAIC0zNiw3ICszNiw3IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotY2xhc3MgZWZmZWN0X3BhcmFtX2NibGtfdDsKK3N0cnVjdCBlZmZlY3RfcGFyYW1fY2Jsa190OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTIxOCw4ICsyMTgsOSBAQAogICAgICAqICAgICAgaGlnaGVyIHByaW9yaXRpZXMsIDAgYmVpbmcgdGhlIG5vcm1hbCBwcmlvcml0eS4KICAgICAgKiBjYmY6ICAgICAgICAgb3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24gKHNlZSBlZmZlY3RfY2FsbGJhY2tfdCkKICAgICAgKiB1c2VyOiAgICAgICAgcG9pbnRlciB0byBjb250ZXh0IGZvciB1c2UgYnkgdGhlIGNhbGxiYWNrIHJlY2VpdmVyLgotICAgICAqIHNlc3Npb25JRDogICBhdWRpbyBzZXNzaW9uIHRoaXMgZWZmZWN0IGlzIGFzc29jaWF0ZWQgdG8uIElmIDAsIHRoZSBlZmZlY3Qgd2lsbCBiZSBnbG9iYWwgdG8KLSAgICAgKiAgICAgIHRoZSBvdXRwdXQgbWl4LiBJZiBub3QgMCwgdGhlIGVmZmVjdCB3aWxsIGJlIGFwcGxpZWQgdG8gYWxsIHBsYXllcnMKKyAgICAgKiBzZXNzaW9uSUQ6ICAgYXVkaW8gc2Vzc2lvbiB0aGlzIGVmZmVjdCBpcyBhc3NvY2lhdGVkIHRvLgorICAgICAqICAgICAgSWYgZXF1YWwgdG8gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYLCB0aGUgZWZmZWN0IHdpbGwgYmUgZ2xvYmFsIHRvCisgICAgICogICAgICB0aGUgb3V0cHV0IG1peC4gIE90aGVyd2lzZSwgdGhlIGVmZmVjdCB3aWxsIGJlIGFwcGxpZWQgdG8gYWxsIHBsYXllcnMKICAgICAgKiAgICAgIChBdWRpb1RyYWNrIG9yIE1lZGlhUExheWVyKSB3aXRoaW4gdGhlIHNhbWUgYXVkaW8gc2Vzc2lvbi4KICAgICAgKiBpbzogIEhBTCBhdWRpbyBvdXRwdXQgb3IgaW5wdXQgc3RyZWFtIHRvIHdoaWNoIHRoaXMgZWZmZWN0IG11c3QgYmUgYXR0YWNoZWQuIExlYXZlIGF0IDAgZm9yCiAgICAgICogICAgICBhdXRvbWF0aWMgb3V0cHV0IHNlbGVjdGlvbiBieSBBdWRpb0ZsaW5nZXIuCkBAIC0yMzAsOCArMjMxLDggQEAKICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHkgPSAwLAogICAgICAgICAgICAgICAgICAgZWZmZWN0X2NhbGxiYWNrX3QgY2JmID0gTlVMTCwKICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCA9IDAsCi0gICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbyA9IDAKKyAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgsCisgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbyA9IEFVRElPX0lPX0hBTkRMRV9OT05FCiAgICAgICAgICAgICAgICAgICApOwogCiAgICAgLyogQ29uc3RydWN0b3IuCkBAIC0yNDIsOCArMjQzLDggQEAKICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSA9IDAsCiAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9jYWxsYmFja190IGNiZiA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkID0gMCwKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8gPSAwCisgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgsCisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvID0gQVVESU9fSU9fSEFORExFX05PTkUKICAgICAgICAgICAgICAgICAgICAgKTsKIAogICAgIC8qIFRlcm1pbmF0ZXMgdGhlIEF1ZGlvRWZmZWN0IGFuZCB1bnJlZ2lzdGVycyBpdCBmcm9tIEF1ZGlvRmxpbmdlci4KQEAgLTI2NCw4ICsyNjUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHkgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9jYWxsYmFja190IGNiZiA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8gPSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCA9IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbyA9IEFVRElPX0lPX0hBTkRMRV9OT05FCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKIAogICAgIC8qIFJlc3VsdCBvZiBjb25zdHJ1Y3RpbmcgdGhlIEF1ZGlvRWZmZWN0LiBUaGlzIG11c3QgYmUgY2hlY2tlZApAQCAtNDUzLDYgKzQ1NCw3IEBACiAgICAgc3A8RWZmZWN0Q2xpZW50PiAgICAgICAgbUlFZmZlY3RDbGllbnQ7ICAgICAvLyBJRWZmZWN0Q2xpZW50IGltcGxlbWVudGF0aW9uCiAgICAgc3A8SU1lbW9yeT4gICAgICAgICAgICAgbUNibGtNZW1vcnk7ICAgICAgICAvLyBzaGFyZWQgbWVtb3J5IGZvciBkZWZlcnJlZCBwYXJhbWV0ZXIgc2V0dGluZwogICAgIGVmZmVjdF9wYXJhbV9jYmxrX3QqICAgIG1DYmxrOyAgICAgICAgICAgICAgLy8gY29udHJvbCBibG9jayBmb3IgZGVmZXJyZWQgcGFyYW1ldGVyIHNldHRpbmcKKyAgICBwaWRfdCAgICAgICAgICAgICAgICAgICBtQ2xpZW50UGlkOwogfTsKIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRhZmQ0NQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaApAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgQVVESU9fUE9MSUNZX0hFTFBFUl9IXworI2RlZmluZSBBVURJT19QT0xJQ1lfSEVMUEVSX0hfCisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworYXVkaW9fc3RyZWFtX3R5cGVfdCBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cikKK3sKKyAgICAvLyBmbGFncyB0byBzdHJlYW0gdHlwZSBtYXBwaW5nCisgICAgaWYgKChhdHRyLT5mbGFncyAmIEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCkgPT0gQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSB7CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRTsKKyAgICB9CisgICAgaWYgKChhdHRyLT5mbGFncyAmIEFVRElPX0ZMQUdfU0NPKSA9PSBBVURJT19GTEFHX1NDTykgeworICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ087CisgICAgfQorCisgICAgLy8gdXNhZ2UgdG8gc3RyZWFtIHR5cGUgbWFwcGluZworICAgIHN3aXRjaCAoYXR0ci0+dXNhZ2UpIHsKKyAgICBjYXNlIEFVRElPX1VTQUdFX01FRElBOgorICAgIGNhc2UgQVVESU9fVVNBR0VfR0FNRToKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWToKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRToKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9NVVNJQzsKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOgorICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1NZU1RFTTsKKyAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT046CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTDsKKworICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HOgorICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0RUTUY7CisKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FMQVJNOgorICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0FMQVJNOworICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORToKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9SSU5HOworCisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT046CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVDoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQ6CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQ6CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OOworCisgICAgY2FzZSBBVURJT19VU0FHRV9VTktOT1dOOgorICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTVVTSUM7CisgICAgfQorfQorCisjZW5kaWYgLy9BVURJT19QT0xJQ1lfSEVMUEVSX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmgKaW5kZXggMDUyMDY0ZC4uNGVkYzFiZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9SZWNvcmQuaApAQCAtMjYsNyArMjYsNyBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWNsYXNzIGF1ZGlvX3RyYWNrX2NibGtfdDsKK3N0cnVjdCBhdWRpb190cmFja19jYmxrX3Q7CiBjbGFzcyBBdWRpb1JlY29yZENsaWVudFByb3h5OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0zOSw4ICszOSwxMiBAQAogICAgICAqIEtlZXAgaW4gc3luYyB3aXRoIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9SZWNvcmQuamF2YSBOQVRJVkVfRVZFTlRfKi4KICAgICAgKi8KICAgICBlbnVtIGV2ZW50X3R5cGUgewotICAgICAgICBFVkVOVF9NT1JFX0RBVEEgPSAwLCAgICAgICAgLy8gUmVxdWVzdCB0byByZWFkIG1vcmUgZGF0YSBmcm9tIFBDTSBidWZmZXIuCi0gICAgICAgIEVWRU5UX09WRVJSVU4gPSAxLCAgICAgICAgICAvLyBQQ00gYnVmZmVyIG92ZXJydW4gb2NjdXJyZWQuCisgICAgICAgIEVWRU5UX01PUkVfREFUQSA9IDAsICAgICAgICAvLyBSZXF1ZXN0IHRvIHJlYWQgYXZhaWxhYmxlIGRhdGEgZnJvbSBidWZmZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGV2ZW50IGlzIGRlbGl2ZXJlZCBidXQgdGhlIGNhbGxiYWNrIGhhbmRsZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvZXMgbm90IHdhbnQgdG8gcmVhZCB0aGUgYXZhaWxhYmxlIGRhdGEsIHRoZSBoYW5kbGVyIG11c3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGxpY2l0bHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGUgZXZlbnQgYnkgc2V0dGluZyBmcmFtZUNvdW50IHRvIHplcm8uCisgICAgICAgIEVWRU5UX09WRVJSVU4gPSAxLCAgICAgICAgICAvLyBCdWZmZXIgb3ZlcnJ1biBvY2N1cnJlZC4KICAgICAgICAgRVZFTlRfTUFSS0VSID0gMiwgICAgICAgICAgIC8vIFJlY29yZCBoZWFkIGlzIGF0IHRoZSBzcGVjaWZpZWQgbWFya2VyIHBvc2l0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoU2VlIHNldE1hcmtlclBvc2l0aW9uKCkpLgogICAgICAgICBFVkVOVF9ORVdfUE9TID0gMywgICAgICAgICAgLy8gUmVjb3JkIGhlYWQgaXMgYXQgYSBuZXcgcG9zaXRpb24KQEAgLTYwLDkgKzY0LDEwIEBACiAgICAgICAgIHNpemVfdCAgICAgIGZyYW1lQ291bnQ7ICAgICAvLyBudW1iZXIgb2Ygc2FtcGxlIGZyYW1lcyBjb3JyZXNwb25kaW5nIHRvIHNpemU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBpbnB1dCBpdCBpcyB0aGUgbnVtYmVyIG9mIGZyYW1lcyBhdmFpbGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBvdXRwdXQgaXMgdGhlIG51bWJlciBvZiBmcmFtZXMgYWN0dWFsbHkgZHJhaW5lZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGN1cnJlbnRseSBpZ25vcmVkLCBidXQgd2lsbCBtYWtlIHRoZSBwcmltYXJ5IGZpZWxkIGluIGZ1dHVyZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChjdXJyZW50bHkgaWdub3JlZCBidXQgd2lsbCBtYWtlIHRoZSBwcmltYXJ5IGZpZWxkIGluIGZ1dHVyZSkKIAogICAgICAgICBzaXplX3QgICAgICBzaXplOyAgICAgICAgICAgLy8gaW5wdXQvb3V0cHV0IGluIGJ5dGVzID09IGZyYW1lQ291bnQgKiBmcmFtZVNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIG91dHB1dCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IGRyYWluZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIHRoaXMgaXMgcmVkdW5kYW50IHdpdGggcmVzcGVjdCB0byBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIFRSQU5TRkVSX09CVEFJTiBtb2RlIGlzIGJyb2tlbiBmb3IgOC1iaXQgZGF0YQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2luY2Ugd2UgZG9uJ3QgZGVmaW5lIHRoZSBmcmFtZSBmb3JtYXQKQEAgLTc2LDcgKzgxLDcgQEAKIAogICAgIC8qIEFzIGEgY29udmVuaWVuY2UsIGlmIGEgY2FsbGJhY2sgaXMgc3VwcGxpZWQsIGEgaGFuZGxlciB0aHJlYWQKICAgICAgKiBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgcHJpb3JpdHkuIFRoaXMgdGhyZWFkCi0gICAgICogaW52b2tlcyB0aGUgY2FsbGJhY2sgd2hlbiBhIG5ldyBidWZmZXIgYmVjb21lcyByZWFkeSBvciB2YXJpb3VzIGNvbmRpdGlvbnMgb2NjdXIuCisgICAgICogaW52b2tlcyB0aGUgY2FsbGJhY2sgd2hlbiBhIG5ldyBidWZmZXIgYmVjb21lcyBhdmFpbGFibGUgb3IgdmFyaW91cyBjb25kaXRpb25zIG9jY3VyLgogICAgICAqIFBhcmFtZXRlcnM6CiAgICAgICoKICAgICAgKiBldmVudDogICB0eXBlIG9mIGV2ZW50IG5vdGlmaWVkIChzZWUgZW51bSBBdWRpb1JlY29yZDo6ZXZlbnRfdHlwZSkuCkBAIC05OSw2ICsxMDQsOCBAQAogICAgICAqICAtIE5PX0VSUk9SOiBzdWNjZXNzZnVsIG9wZXJhdGlvbgogICAgICAqICAtIE5PX0lOSVQ6IGF1ZGlvIHNlcnZlciBvciBhdWRpbyBoYXJkd2FyZSBub3QgaW5pdGlhbGl6ZWQKICAgICAgKiAgLSBCQURfVkFMVUU6IHVuc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb24KKyAgICAgKiBmcmFtZUNvdW50IGlzIGd1YXJhbnRlZWQgdG8gYmUgbm9uLXplcm8gaWYgc3RhdHVzIGlzIE5PX0VSUk9SLAorICAgICAqIGFuZCBpcyB1bmRlZmluZWQgb3RoZXJ3aXNlLgogICAgICAqLwogCiAgICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRNaW5GcmFtZUNvdW50KHNpemVfdCogZnJhbWVDb3VudCwKQEAgLTEwOSw3ICsxMTYsNyBAQAogICAgIC8qIEhvdyBkYXRhIGlzIHRyYW5zZmVycmVkIGZyb20gQXVkaW9SZWNvcmQKICAgICAgKi8KICAgICBlbnVtIHRyYW5zZmVyX3R5cGUgewotICAgICAgICBUUkFOU0ZFUl9ERUZBVUxULCAgIC8vIG5vdCBzcGVjaWZpZWQgZXhwbGljaXRseTsgZGV0ZXJtaW5lIGZyb20gb3RoZXIgcGFyYW1ldGVycworICAgICAgICBUUkFOU0ZFUl9ERUZBVUxULCAgIC8vIG5vdCBzcGVjaWZpZWQgZXhwbGljaXRseTsgZGV0ZXJtaW5lIGZyb20gdGhlIG90aGVyIHBhcmFtZXRlcnMKICAgICAgICAgVFJBTlNGRVJfQ0FMTEJBQ0ssICAvLyBjYWxsYmFjayBFVkVOVF9NT1JFX0RBVEEKICAgICAgICAgVFJBTlNGRVJfT0JUQUlOLCAgICAvLyBGSVhNRSBkZXByZWNhdGVkOiBjYWxsIG9idGFpbkJ1ZmZlcigpIGFuZCByZWxlYXNlQnVmZmVyKCkKICAgICAgICAgVFJBTlNGRVJfU1lOQywgICAgICAvLyBzeW5jaHJvbm91cyByZWFkKCkKQEAgLTEzNyw3ICsxNDQsNyBAQAogICAgICAqICAgICAgICAgICAgICAgICAgICAgYmUgbGFyZ2VyIGlmIHRoZSByZXF1ZXN0ZWQgc2l6ZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIGN1cnJlbnQgYXVkaW8gSEFMCiAgICAgICogICAgICAgICAgICAgICAgICAgICBsYXRlbmN5LiAgWmVybyBtZWFucyB0byB1c2UgYSBkZWZhdWx0IHZhbHVlLgogICAgICAqIGNiZjogICAgICAgICAgICAgICAgQ2FsbGJhY2sgZnVuY3Rpb24uIElmIG5vdCBudWxsLCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBwZXJpb2RpY2FsbHkKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgIHRvIGNvbnN1bWUgbmV3IFBDTSBkYXRhIGFuZCBpbmZvcm0gb2YgbWFya2VyLCBwb3NpdGlvbiB1cGRhdGVzLCBldGMuCisgICAgICogICAgICAgICAgICAgICAgICAgICB0byBjb25zdW1lIG5ldyBkYXRhIGFuZCBpbmZvcm0gb2YgbWFya2VyLCBwb3NpdGlvbiB1cGRhdGVzLCBldGMuCiAgICAgICogdXNlcjogICAgICAgICAgICAgICBDb250ZXh0IGZvciB1c2UgYnkgdGhlIGNhbGxiYWNrIHJlY2VpdmVyLgogICAgICAqIG5vdGlmaWNhdGlvbkZyYW1lczogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCBlYWNoIHRpbWUgbm90aWZpY2F0aW9uRnJhbWVzIFBDTQogICAgICAqICAgICAgICAgICAgICAgICAgICAgZnJhbWVzIGFyZSByZWFkeSBpbiByZWNvcmQgdHJhY2sgb3V0cHV0IGJ1ZmZlci4KQEAgLTE1MSwxMSArMTU4LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCAgICAgID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50ID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX3QgY2JmID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkID0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlID0gVFJBTlNGRVJfREVGQVVMVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19JTlBVVF9GTEFHX05PTkUpOwogCkBAIC0xNzEsOSArMTc4LDEwIEBACiAgICAgICogUmV0dXJuZWQgc3RhdHVzIChmcm9tIHV0aWxzL0Vycm9ycy5oKSBjYW4gYmU6CiAgICAgICogIC0gTk9fRVJST1I6IHN1Y2Nlc3NmdWwgaW50aWFsaXphdGlvbgogICAgICAqICAtIElOVkFMSURfT1BFUkFUSU9OOiBBdWRpb1JlY29yZCBpcyBhbHJlYWR5IGluaXRpYWxpemVkIG9yIHJlY29yZCBkZXZpY2UgaXMgYWxyZWFkeSBpbiB1c2UKLSAgICAgKiAgLSBCQURfVkFMVUU6IGludmFsaWQgcGFyYW1ldGVyIChjaGFubmVscywgZm9ybWF0LCBzYW1wbGVSYXRlLi4uKQorICAgICAqICAtIEJBRF9WQUxVRTogaW52YWxpZCBwYXJhbWV0ZXIgKGNoYW5uZWxNYXNrLCBmb3JtYXQsIHNhbXBsZVJhdGUuLi4pCiAgICAgICogIC0gTk9fSU5JVDogYXVkaW8gc2VydmVyIG9yIGF1ZGlvIGhhcmR3YXJlIG5vdCBpbml0aWFsaXplZAogICAgICAqICAtIFBFUk1JU1NJT05fREVOSUVEOiByZWNvcmRpbmcgaXMgbm90IGFsbG93ZWQgZm9yIHRoZSByZXF1ZXN0aW5nIHByb2Nlc3MKKyAgICAgKiBJZiBzdGF0dXMgaXMgbm90IGVxdWFsIHRvIE5PX0VSUk9SLCBkb24ndCBjYWxsIGFueSBvdGhlciBBUElzIG9uIHRoaXMgQXVkaW9SZWNvcmQuCiAgICAgICoKICAgICAgKiBQYXJhbWV0ZXJzIG5vdCBsaXN0ZWQgaW4gdGhlIEF1ZGlvUmVjb3JkIGNvbnN0cnVjdG9ycyBhYm92ZToKICAgICAgKgpAQCAtMTgzLDE2ICsxOTEsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCAgICAgID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfdCBjYmYgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0aHJlYWRDYW5DYWxsSmF2YSA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlID0gVFJBTlNGRVJfREVGQVVMVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fSU5QVVRfRkxBR19OT05FKTsKIAotICAgIC8qIFJlc3VsdCBvZiBjb25zdHJ1Y3RpbmcgdGhlIEF1ZGlvUmVjb3JkLiBUaGlzIG11c3QgYmUgY2hlY2tlZAorICAgIC8qIFJlc3VsdCBvZiBjb25zdHJ1Y3RpbmcgdGhlIEF1ZGlvUmVjb3JkLiBUaGlzIG11c3QgYmUgY2hlY2tlZCBmb3Igc3VjY2Vzc2Z1bCBpbml0aWFsaXphdGlvbgogICAgICAqIGJlZm9yZSB1c2luZyBhbnkgQXVkaW9SZWNvcmQgQVBJIChleGNlcHQgZm9yIHNldCgpKSwgYmVjYXVzZSB1c2luZwogICAgICAqIGFuIHVuaW5pdGlhbGl6ZWQgQXVkaW9SZWNvcmQgcHJvZHVjZXMgdW5kZWZpbmVkIHJlc3VsdHMuCiAgICAgICogU2VlIHNldCgpIG1ldGhvZCBhYm92ZSBmb3IgcG9zc2libGUgcmV0dXJuIGNvZGVzLgpAQCAtMjIxLDcgKzIyOSw3IEBACiAgICAgICAgICAgICBzdGF0dXNfdCAgICBzdGFydChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50ID0gQXVkaW9TeXN0ZW06OlNZTkNfRVZFTlRfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmlnZ2VyU2Vzc2lvbiA9IDApOwogCi0gICAgLyogU3RvcCBhIHRyYWNrLiBJZiBzZXQsIHRoZSBjYWxsYmFjayB3aWxsIGNlYXNlIGJlaW5nIGNhbGxlZC4gIE5vdGUgdGhhdCBvYnRhaW5CdWZmZXIoKSBzdGlsbAorICAgIC8qIFN0b3AgYSB0cmFjay4gIFRoZSBjYWxsYmFjayB3aWxsIGNlYXNlIGJlaW5nIGNhbGxlZC4gIE5vdGUgdGhhdCBvYnRhaW5CdWZmZXIoKSBzdGlsbAogICAgICAqIHdvcmtzIGFuZCB3aWxsIGRyYWluIGJ1ZmZlcnMgdW50aWwgdGhlIHBvb2wgaXMgZXhoYXVzdGVkLCBhbmQgdGhlbiB3aWxsIHJldHVybiBXT1VMRF9CTE9DSy4KICAgICAgKi8KICAgICAgICAgICAgIHZvaWQgICAgICAgIHN0b3AoKTsKQEAgLTIzMiwxMSArMjQwLDE2IEBACiAgICAgICovCiAgICAgICAgICAgICB1aW50MzJfdCAgICBnZXRTYW1wbGVSYXRlKCkgY29uc3QgICB7IHJldHVybiBtU2FtcGxlUmF0ZTsgfQogCisgICAgLyogUmV0dXJuIHRoZSBub3RpZmljYXRpb24gZnJhbWUgY291bnQuCisgICAgICogVGhpcyBpcyBhcHByb3hpbWF0ZWx5IGhvdyBvZnRlbiB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZCwgZm9yIHRyYW5zZmVyIHR5cGUgVFJBTlNGRVJfQ0FMTEJBQ0suCisgICAgICovCisgICAgICAgICAgICBzaXplX3QgICAgICBub3RpZmljYXRpb25GcmFtZXMoKSBjb25zdCAgeyByZXR1cm4gbU5vdGlmaWNhdGlvbkZyYW1lc0FjdDsgfQorCiAgICAgLyogU2V0cyBtYXJrZXIgcG9zaXRpb24uIFdoZW4gcmVjb3JkIHJlYWNoZXMgdGhlIG51bWJlciBvZiBmcmFtZXMgc3BlY2lmaWVkLAogICAgICAqIGEgY2FsbGJhY2sgd2l0aCBldmVudCB0eXBlIEVWRU5UX01BUktFUiBpcyBjYWxsZWQuIENhbGxpbmcgc2V0TWFya2VyUG9zaXRpb24KICAgICAgKiB3aXRoIG1hcmtlciA9PSAwIGNhbmNlbHMgbWFya2VyIG5vdGlmaWNhdGlvbiBjYWxsYmFjay4KICAgICAgKiBUbyBzZXQgYSBtYXJrZXIgYXQgYSBwb3NpdGlvbiB3aGljaCB3b3VsZCBjb21wdXRlIGFzIDAsCi0gICAgICogYSB3b3JrYXJvdW5kIGlzIHRvIHRoZSBzZXQgdGhlIG1hcmtlciBhdCBhIG5lYXJieSBwb3NpdGlvbiBzdWNoIGFzIH4wIG9yIDEuCisgICAgICogYSB3b3JrYXJvdW5kIGlzIHRvIHNldCB0aGUgbWFya2VyIGF0IGEgbmVhcmJ5IHBvc2l0aW9uIHN1Y2ggYXMgfjAgb3IgMS4KICAgICAgKiBJZiB0aGUgQXVkaW9SZWNvcmQgaGFzIGJlZW4gb3BlbmVkIHdpdGggbm8gY2FsbGJhY2sgZnVuY3Rpb24gYXNzb2NpYXRlZCwKICAgICAgKiB0aGUgb3BlcmF0aW9uIHdpbGwgZmFpbC4KICAgICAgKgpAQCAtMzc4LDggKzM5MSwxMCBAQAogICAgICAqIHJldHVybmluZyB0aGUgY3VycmVudCB2YWx1ZSBieSB0aGlzIGZ1bmN0aW9uIGNhbGwuICBTdWNoIGxvc3MgdHlwaWNhbGx5IG9jY3VycyB3aGVuIHRoZQogICAgICAqIHVzZXIgc3BhY2UgcHJvY2VzcyBpcyBibG9ja2VkIGxvbmdlciB0aGFuIHRoZSBjYXBhY2l0eSBvZiBhdWRpbyBkcml2ZXIgYnVmZmVycy4KICAgICAgKiBVbml0czogdGhlIG51bWJlciBvZiBpbnB1dCBhdWRpbyBmcmFtZXMuCisgICAgICogRklYTUUgVGhlIHNpZGUtZWZmZWN0IG9mIHJlc2V0dGluZyB0aGUgY291bnRlciBtYXkgYmUgaW5jb21wYXRpYmxlIHdpdGggbXVsdGktY2xpZW50LgorICAgICAqIENvbnNpZGVyIG1ha2luZyBpdCBtb3JlIGxpa2UgQXVkaW9UcmFjazo6Z2V0VW5kZXJydW5GcmFtZXMgd2hpY2ggZG9lc24ndCBoYXZlIHNpZGUgZWZmZWN0cy4KICAgICAgKi8KLSAgICAgICAgICAgIHVuc2lnbmVkIGludCAgZ2V0SW5wdXRGcmFtZXNMb3N0KCkgY29uc3Q7CisgICAgICAgICAgICB1aW50MzJfdCAgICBnZXRJbnB1dEZyYW1lc0xvc3QoKSBjb25zdDsKIAogcHJpdmF0ZToKICAgICAvKiBjb3B5aW5nIGF1ZGlvIHJlY29yZCBvYmplY3RzIGlzIG5vdCBhbGxvd2VkICovCkBAIC00MTIsNiArNDI3LDcgQEAKICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICBtUGF1c2VkOyAgICAvLyB3aGV0aGVyIHRocmVhZCBpcyByZXF1ZXN0ZWQgdG8gcGF1c2UgYXQgbmV4dCBsb29wIGVudHJ5CiAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgbVBhdXNlZEludDsgLy8gd2hldGhlciB0aHJlYWQgaW50ZXJuYWxseSByZXF1ZXN0cyBwYXVzZQogICAgICAgICBuc2Vjc190ICAgICAgICAgICAgIG1QYXVzZWROczsgIC8vIGlmIG1QYXVzZWRJbnQgdGhlbiBhc3NvY2lhdGVkIHRpbWVvdXQsIG90aGVyd2lzZSBpZ25vcmVkCisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgbUlnbm9yZU5leHRQYXVzZWRJbnQ7ICAgLy8gd2hldGhlciB0byBpZ25vcmUgbmV4dCBtUGF1c2VkSW50IHJlcXVlc3QKICAgICB9OwogCiAgICAgICAgICAgICAvLyBib2R5IG9mIEF1ZGlvUmVjb3JkVGhyZWFkOjp0aHJlYWRMb29wKCkKQEAgLTQyMiw5ICs0MzgsMTAgQEAKICAgICAgICAgICAgIC8vICAgICAgTlNfSU5BQ1RJVkUgaW5hY3RpdmUgc28gZG9uJ3QgcnVuIGFnYWluIHVudGlsIHJlLXN0YXJ0ZWQKICAgICAgICAgICAgIC8vICAgICAgTlNfTkVWRVIgICAgbmV2ZXIgYWdhaW4KICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IE5TX1dIRU5FVkVSID0gLTEsIE5TX0lOQUNUSVZFID0gLTIsIE5TX05FVkVSID0gLTM7Ci0gICAgICAgICAgICBuc2Vjc190IHByb2Nlc3NBdWRpb0J1ZmZlcihjb25zdCBzcDxBdWRpb1JlY29yZFRocmVhZD4mIHRocmVhZCk7CisgICAgICAgICAgICBuc2Vjc190IHByb2Nlc3NBdWRpb0J1ZmZlcigpOwogCiAgICAgICAgICAgICAvLyBjYWxsZXIgbXVzdCBob2xkIGxvY2sgb24gbUxvY2sgZm9yIGFsbCBfbCBtZXRob2RzCisKICAgICAgICAgICAgIHN0YXR1c190IG9wZW5SZWNvcmRfbChzaXplX3QgZXBvY2gpOwogCiAgICAgICAgICAgICAvLyBGSVhNRSBlbnVtIGlzIGZhc3RlciB0aGFuIHN0cmNtcCgpIGZvciBwYXJhbWV0ZXIgJ2Zyb20nCkBAIC00NDQsMTQgKzQ2MSwxNiBAQAogICAgIC8vIGZvciBub3RpZmljYXRpb24gQVBJcwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXNSZXE7IC8vIHJlcXVlc3RlZCBudW1iZXIgb2YgZnJhbWVzIGJldHdlZW4gZWFjaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGlmaWNhdGlvbiBjYWxsYmFjaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIHNwZWNpZmllZCBpbiBjb25zdHJ1Y3RvciBvciBzZXQoKQogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3Q7IC8vIGFjdHVhbCBudW1iZXIgb2YgZnJhbWVzIGJldHdlZW4gZWFjaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGlmaWNhdGlvbiBjYWxsYmFjawotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1SZWZyZXNoUmVtYWluaW5nOyAgLy8gcHJvY2Vzc0F1ZGlvQnVmZmVyKCkgc2hvdWxkIHJlZnJlc2ggbmV4dCAyCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVJlZnJlc2hSZW1haW5pbmc7ICAgICAgLy8gcHJvY2Vzc0F1ZGlvQnVmZmVyKCkgc2hvdWxkIHJlZnJlc2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUmVtYWluaW5nRnJhbWVzIGFuZCBtUmV0cnlPblBhcnRpYWxCdWZmZXIKIAogICAgIC8vIFRoZXNlIGFyZSBwcml2YXRlIHRvIHByb2Nlc3NBdWRpb0J1ZmZlcigpLCBhbmQgYXJlIG5vdCBwcm90ZWN0ZWQgYnkgYSBsb2NrCiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVJlbWFpbmluZ0ZyYW1lczsgICAgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyB0byByZXF1ZXN0IGluIG9idGFpbkJ1ZmZlcigpCiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVJldHJ5T25QYXJ0aWFsQnVmZmVyOyAgLy8gc2xlZXAgYW5kIHJldHJ5IGFmdGVyIHBhcnRpYWwgb2J0YWluQnVmZmVyKCkKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtT2JzZXJ2ZWRTZXF1ZW5jZTsgICAgICAvLyBsYXN0IG9ic2VydmVkIHZhbHVlIG9mIG1TZXF1ZW5jZQorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1PYnNlcnZlZFNlcXVlbmNlOyAgICAgIC8vIGxhc3Qgb2JzZXJ2ZWQgdmFsdWUgb2YgbVNlcXVlbmNlCiAKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtTWFya2VyUG9zaXRpb247ICAgIC8vIGluIHdyYXBwaW5nIChvdmVyZmxvdykgZnJhbWUgdW5pdHMKICAgICBib29sICAgICAgICAgICAgICAgICAgICBtTWFya2VyUmVhY2hlZDsKQEAgLTQ2MCw5ICs0NzksMTMgQEAKIAogICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIG1TdGF0dXM7CiAKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICBtRnJhbWVDb3VudDsgICAgICAgICAgICAvLyBjb3JyZXNwb25kcyB0byBjdXJyZW50IElBdWRpb1JlY29yZCwgdmFsdWUgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBvcnRlZCBiYWNrIGJ5IEF1ZGlvRmxpbmdlciB0byB0aGUgY2xpZW50CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgbVJlcUZyYW1lQ291bnQ7ICAgICAgICAgLy8gZnJhbWUgY291bnQgdG8gcmVxdWVzdCB0aGUgZmlyc3Qgb3IgbmV4dCB0aW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBuZXcgSUF1ZGlvUmVjb3JkIGlzIG5lZWRlZCwgbm9uLWRlY3JlYXNpbmcKKwogICAgIC8vIGNvbnN0YW50IGFmdGVyIGNvbnN0cnVjdG9yIG9yIHNldCgpCiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGU7Ci0gICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgbUZyYW1lQ291bnQ7CiAgICAgYXVkaW9fZm9ybWF0X3QgICAgICAgICAgbUZvcm1hdDsKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtQ2hhbm5lbENvdW50OwogICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZVNpemU7ICAgICAgICAgLy8gYXBwLWxldmVsIGZyYW1lIHNpemUgPT0gQXVkaW9GbGluZ2VyIGZyYW1lIHNpemUKQEAgLTQ3MywxMiArNDk2LDEzIEBACiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25JZDsKICAgICB0cmFuc2Zlcl90eXBlICAgICAgICAgICBtVHJhbnNmZXI7CiAKLSAgICBhdWRpb19pb19oYW5kbGVfdCAgICAgICBtSW5wdXQ7ICAgICAgICAgICAgIC8vIHJldHVybmVkIGJ5IEF1ZGlvU3lzdGVtOjpnZXRJbnB1dCgpCi0KLSAgICAvLyBtYXkgYmUgY2hhbmdlZCBpZiBJQXVkaW9SZWNvcmQgb2JqZWN0IGlzIHJlLWNyZWF0ZWQKKyAgICAvLyBOZXh0IDUgZmllbGRzIG1heSBiZSBjaGFuZ2VkIGlmIElBdWRpb1JlY29yZCBpcyByZS1jcmVhdGVkLCBidXQgYWx3YXlzICE9IDAKKyAgICAvLyBwcm92aWRlZCB0aGUgaW5pdGlhbCBzZXQoKSB3YXMgc3VjY2Vzc2Z1bAogICAgIHNwPElBdWRpb1JlY29yZD4gICAgICAgIG1BdWRpb1JlY29yZDsKICAgICBzcDxJTWVtb3J5PiAgICAgICAgICAgICBtQ2Jsa01lbW9yeTsKICAgICBhdWRpb190cmFja19jYmxrX3QqICAgICBtQ2JsazsgICAgICAgICAgICAgIC8vIHJlLWxvYWQgYWZ0ZXIgbUxvY2sudW5sb2NrKCkKKyAgICBzcDxJTWVtb3J5PiAgICAgICAgICAgICBtQnVmZmVyTWVtb3J5OworICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgICAgIG1JbnB1dDsgICAgICAgICAgICAgLy8gcmV0dXJuZWQgYnkgQXVkaW9TeXN0ZW06OmdldElucHV0KCkKIAogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c1ByaW9yaXR5OyAgLy8gYmVmb3JlIHN0YXJ0KCkKICAgICBTY2hlZFBvbGljeSAgICAgICAgICAgICBtUHJldmlvdXNTY2hlZHVsaW5nR3JvdXA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc4NDdhMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaApAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0FVRElPX1JFU0FNUExFUl9QVUJMSUNfSAorI2RlZmluZSBBTkRST0lEX0FVRElPX1JFU0FNUExFUl9QVUJMSUNfSAorCisvLyBBVURJT19SRVNBTVBMRVJfRE9XTl9SQVRJT19NQVggaXMgdGhlIG1heGltdW0gcmF0aW8gYmV0d2VlbiB0aGUgb3JpZ2luYWwKKy8vIGF1ZGlvIHNhbXBsZSByYXRlIGFuZCB0aGUgdGFyZ2V0IHJhdGUgd2hlbiBkb3duc2FtcGxpbmcsCisvLyBhcyBwZXJtaXR0ZWQgaW4gdGhlIGF1ZGlvIGZyYW1ld29yaywgZS5nLiBBdWRpb1RyYWNrIGFuZCBBdWRpb0ZsaW5nZXIuCisvLyBJbiBwcmFjdGljZSwgaXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGRvd25zYW1wbGUgbW9yZSB0aGFuIDY6MQorLy8gZm9yIGJlc3QgYXVkaW8gcXVhbGl0eSwgZXZlbiB0aG91Z2ggdGhlIGF1ZGlvIGZyYW1ld29yayBwZXJtaXRzIGEgbGFyZ2VyCisvLyBkb3duc2FtcGxpbmcgcmF0aW8uCisvLyBUT0RPOiByZXBsYWNlIHdpdGggYW4gQVBJCisjZGVmaW5lIEFVRElPX1JFU0FNUExFUl9ET1dOX1JBVElPX01BWCAyNTYKKworI2VuZGlmIC8vIEFORFJPSURfQVVESU9fUkVTQU1QTEVSX1BVQkxJQ19ICmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKaW5kZXggMjI1ZWY3Ni4uZjhjMDE5OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaApAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fZWZmZWN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvRmxpbmdlckNsaWVudC5oPgorI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CkBAIC02NywyMCArNjgsMjQgQEAKIAogICAgIC8vIHJldHVybnMgdHJ1ZSBpbiAqc3RhdGUgaWYgdHJhY2tzIGFyZSBhY3RpdmUgb24gdGhlIHNwZWNpZmllZCBzdHJlYW0gb3IgaGF2ZSBiZWVuIGFjdGl2ZQogICAgIC8vIGluIHRoZSBwYXN0IGluUGFzdE1zIG1pbGxpc2Vjb25kcwotICAgIHN0YXRpYyBzdGF0dXNfdCBpc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYm9vbCAqc3RhdGUsIHVpbnQzMl90IGluUGFzdE1zID0gMCk7CisgICAgc3RhdGljIHN0YXR1c190IGlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBib29sICpzdGF0ZSwgdWludDMyX3QgaW5QYXN0TXMpOwogICAgIC8vIHJldHVybnMgdHJ1ZSBpbiAqc3RhdGUgaWYgdHJhY2tzIGFyZSBhY3RpdmUgZm9yIHdoYXQgcXVhbGlmaWVzIGFzIHJlbW90ZSBwbGF5YmFjawogICAgIC8vIG9uIHRoZSBzcGVjaWZpZWQgc3RyZWFtIG9yIGhhdmUgYmVlbiBhY3RpdmUgaW4gdGhlIHBhc3QgaW5QYXN0TXMgbWlsbGlzZWNvbmRzLiBSZW1vdGUKICAgICAvLyBwbGF5YmFjayBpc24ndCBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCBsb2NhbCBwbGF5YmFjay4KICAgICBzdGF0aWMgc3RhdHVzX3QgaXNTdHJlYW1BY3RpdmVSZW1vdGVseShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYm9vbCAqc3RhdGUsCi0gICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcyA9IDApOworICAgICAgICAgICAgdWludDMyX3QgaW5QYXN0TXMpOwogICAgIC8vIHJldHVybnMgdHJ1ZSBpbiAqc3RhdGUgaWYgYSByZWNvcmRlciBpcyBjdXJyZW50bHkgcmVjb3JkaW5nIHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UKICAgICBzdGF0aWMgc3RhdHVzX3QgaXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlLCBib29sICpzdGF0ZSk7CiAKICAgICAvLyBzZXQvZ2V0IGF1ZGlvIGhhcmR3YXJlIHBhcmFtZXRlcnMuIFRoZSBmdW5jdGlvbiBhY2NlcHRzIGEgbGlzdCBvZiBwYXJhbWV0ZXJzCiAgICAgLy8ga2V5IHZhbHVlIHBhaXJzIGluIHRoZSBmb3JtOiBrZXkxPXZhbHVlMTtrZXkyPXZhbHVlMjsuLi4KICAgICAvLyBTb21lIGtleXMgYXJlIHJlc2VydmVkIGZvciBzdGFuZGFyZCBwYXJhbWV0ZXJzIChTZWUgQXVkaW9QYXJhbWV0ZXIgY2xhc3MpLgorICAgIC8vIFRoZSB2ZXJzaW9ucyB3aXRoIGF1ZGlvX2lvX2hhbmRsZV90IGFyZSBpbnRlbmRlZCBmb3IgaW50ZXJuYWwgbWVkaWEgZnJhbWV3b3JrIHVzZSBvbmx5LgogICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKTsKICAgICBzdGF0aWMgU3RyaW5nOCAgZ2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5cyk7CisgICAgLy8gVGhlIHZlcnNpb25zIHdpdGhvdXQgYXVkaW9faW9faGFuZGxlX3QgYXJlIGludGVuZGVkIGZvciBKTkkuCisgICAgc3RhdGljIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycyk7CisgICAgc3RhdGljIFN0cmluZzggIGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cyk7CiAKICAgICBzdGF0aWMgdm9pZCBzZXRFcnJvckNhbGxiYWNrKGF1ZGlvX2Vycm9yX2NhbGxiYWNrIGNiKTsKIApAQCAtOTAsMzYgKzk1LDM3IEBACiAgICAgc3RhdGljIGZsb2F0IGxpbmVhclRvTG9nKGludCB2b2x1bWUpOwogICAgIHN0YXRpYyBpbnQgbG9nVG9MaW5lYXIoZmxvYXQgdm9sdW1lKTsKIAorICAgIC8vIFJldHVybmVkIHNhbXBsaW5nUmF0ZSBhbmQgZnJhbWVDb3VudCBvdXRwdXQgdmFsdWVzIGFyZSBndWFyYW50ZWVkCisgICAgLy8gdG8gYmUgbm9uLXplcm8gaWYgc3RhdHVzID09IE5PX0VSUk9SCiAgICAgc3RhdGljIHN0YXR1c190IGdldE91dHB1dFNhbXBsaW5nUmF0ZSh1aW50MzJfdCogc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBBVURJT19TVFJFQU1fREVGQVVMVCk7CisgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CisgICAgc3RhdGljIHN0YXR1c190IGdldE91dHB1dFNhbXBsaW5nUmF0ZUZvckF0dHIodWludDMyX3QqIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIpOwogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRPdXRwdXRGcmFtZUNvdW50KHNpemVfdCogZnJhbWVDb3VudCwKLSAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gQVVESU9fU1RSRUFNX0RFRkFVTFQpOworICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRPdXRwdXRMYXRlbmN5KHVpbnQzMl90KiBsYXRlbmN5LAotICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBBVURJT19TVFJFQU1fREVGQVVMVCk7CisgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CiAgICAgc3RhdGljIHN0YXR1c190IGdldFNhbXBsaW5nUmF0ZShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogc2FtcGxpbmdSYXRlKTsKICAgICAvLyByZXR1cm5zIHRoZSBudW1iZXIgb2YgZnJhbWVzIHBlciBhdWRpbyBIQUwgd3JpdGUgYnVmZmVyLiBDb3JyZXNwb25kcyB0bwotICAgIC8vIGF1ZGlvX3N0cmVhbS0+Z2V0X2J1ZmZlcl9zaXplKCkvYXVkaW9fc3RyZWFtX2ZyYW1lX3NpemUoKQorICAgIC8vIGF1ZGlvX3N0cmVhbS0+Z2V0X2J1ZmZlcl9zaXplKCkvYXVkaW9fc3RyZWFtX291dF9mcmFtZV9zaXplKCkKICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0RnJhbWVDb3VudChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBmcmFtZUNvdW50KTsKICAgICAvLyByZXR1cm5zIHRoZSBhdWRpbyBvdXRwdXQgc3RyZWFtIGxhdGVuY3kgaW4gbXMuIENvcnJlc3BvbmRzIHRvCiAgICAgLy8gYXVkaW9fc3RyZWFtX291dC0+Z2V0X2xhdGVuY3koKQogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRMYXRlbmN5KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogbGF0ZW5jeSk7CiAKICAgICBzdGF0aWMgYm9vbCByb3V0ZWRUb0EyZHBPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKTsKIAorICAgIC8vIHJldHVybiBzdGF0dXMgTk9fRVJST1IgaW1wbGllcyAqYnVmZlNpemUgPiAwCiAgICAgc3RhdGljIHN0YXR1c190IGdldElucHV0QnVmZmVyU2l6ZSh1aW50MzJfdCBzYW1wbGVSYXRlLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBzaXplX3QqIGJ1ZmZTaXplKTsKIAogICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpOwogCiAgICAgLy8gcmV0dXJuIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHdyaXR0ZW4gYnkgQXVkaW9GbGluZ2VyIHRvIGF1ZGlvIEhBTCBhbmQKLSAgICAvLyBhdWRpbyBkc3AgdG8gREFDIHNpbmNlIHRoZSBvdXRwdXQgb24gd2hpY2ggdGhlIHNwZWNpZmllZCBzdHJlYW0gaXMgcGxheWluZwotICAgIC8vIGhhcyBleGl0ZWQgc3RhbmRieS4KKyAgICAvLyBhdWRpbyBkc3AgdG8gREFDIHNpbmNlIHRoZSBzcGVjaWZpZWQgb3V0cHV0IEkvTyBoYW5kbGUgaGFzIGV4aXRlZCBzdGFuZGJ5LgogICAgIC8vIHJldHVybmVkIHN0YXR1cyAoZnJvbSB1dGlscy9FcnJvcnMuaCkgY2FuIGJlOgogICAgIC8vIC0gTk9fRVJST1I6IHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLCBoYWxGcmFtZXMgYW5kIGRzcEZyYW1lcyBwb2ludCB0byB2YWxpZCBkYXRhCiAgICAgLy8gLSBJTlZBTElEX09QRVJBVElPTjogTm90IHN1cHBvcnRlZCBvbiBjdXJyZW50IGhhcmR3YXJlIHBsYXRmb3JtCkBAIC0xMjcsMTYgKzEzMywyNiBAQAogICAgIC8vIE5PVEU6IHRoaXMgZmVhdHVyZSBpcyBub3Qgc3VwcG9ydGVkIG9uIGFsbCBoYXJkd2FyZSBwbGF0Zm9ybXMgYW5kIGl0IGlzCiAgICAgLy8gbmVjZXNzYXJ5IHRvIGNoZWNrIHJldHVybmVkIHN0YXR1cyBiZWZvcmUgdXNpbmcgdGhlIHJldHVybmVkIHZhbHVlcy4KICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0UmVuZGVyUG9zaXRpb24oYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmhhbEZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpkc3BGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gQVVESU9fU1RSRUFNX0RFRkFVTFQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqaGFsRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqZHNwRnJhbWVzKTsKIAogICAgIC8vIHJldHVybiB0aGUgbnVtYmVyIG9mIGlucHV0IGZyYW1lcyBsb3N0IGJ5IEhBTCBpbXBsZW1lbnRhdGlvbiwgb3IgMCBpZiB0aGUgaGFuZGxlIGlzIGludmFsaWQKLSAgICBzdGF0aWMgc2l6ZV90IGdldElucHV0RnJhbWVzTG9zdChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSk7CisgICAgc3RhdGljIHVpbnQzMl90IGdldElucHV0RnJhbWVzTG9zdChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSk7CiAKLSAgICBzdGF0aWMgaW50IG5ld0F1ZGlvU2Vzc2lvbklkKCk7Ci0gICAgc3RhdGljIHZvaWQgYWNxdWlyZUF1ZGlvU2Vzc2lvbklkKGludCBhdWRpb1Nlc3Npb24pOwotICAgIHN0YXRpYyB2b2lkIHJlbGVhc2VBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uKTsKKyAgICAvLyBBbGxvY2F0ZSBhIG5ldyB1bmlxdWUgSUQgZm9yIHVzZSBhcyBhbiBhdWRpbyBzZXNzaW9uIElEIG9yIEkvTyBoYW5kbGUuCisgICAgLy8gSWYgdW5hYmxlIHRvIGNvbnRhY3QgQXVkaW9GbGluZ2VyLCByZXR1cm5zIEFVRElPX1VOSVFVRV9JRF9BTExPQ0FURSBpbnN0ZWFkLgorICAgIC8vIEZJWE1FIElmIEF1ZGlvRmxpbmdlciB3ZXJlIHRvIGV2ZXIgZXhoYXVzdCB0aGUgdW5pcXVlIElEIG5hbWVzcGFjZSwKKyAgICAvLyAgICAgICB0aGlzIG1ldGhvZCBjb3VsZCBmYWlsIGJ5IHJldHVybmluZyBlaXRoZXIgQVVESU9fVU5JUVVFX0lEX0FMTE9DQVRFCisgICAgLy8gICAgICAgb3IgYW4gdW5zcGVjaWZpZWQgZXhpc3RpbmcgdW5pcXVlIElELgorICAgIHN0YXRpYyBhdWRpb191bmlxdWVfaWRfdCBuZXdBdWRpb1VuaXF1ZUlkKCk7CisKKyAgICBzdGF0aWMgdm9pZCBhY3F1aXJlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbiwgcGlkX3QgcGlkKTsKKyAgICBzdGF0aWMgdm9pZCByZWxlYXNlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbiwgcGlkX3QgcGlkKTsKKworICAgIC8vIEdldCB0aGUgSFcgc3luY2hyb25pemF0aW9uIHNvdXJjZSB1c2VkIGZvciBhbiBhdWRpbyBzZXNzaW9uLgorICAgIC8vIFJldHVybiBhIHZhbGlkIHNvdXJjZSBvciBBVURJT19IV19TWU5DX0lOVkFMSUQgaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgLy8gb3Igbm8gSFcgc3luYyBzb3VyY2UgaXMgdXNlZC4KKyAgICBzdGF0aWMgYXVkaW9faHdfc3luY190IGdldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKTsKIAogICAgIC8vIHR5cGVzIG9mIGlvIGNvbmZpZ3VyYXRpb24gY2hhbmdlIGV2ZW50cyByZWNlaXZlZCB3aXRoIGlvQ29uZmlnQ2hhbmdlZCgpCiAgICAgZW51bSBpb19jb25maWdfZXZlbnQgewpAQCAtMTU1LDcgKzE3MSw4IEBACiAgICAgY2xhc3MgT3V0cHV0RGVzY3JpcHRvciB7CiAgICAgcHVibGljOgogICAgICAgICBPdXRwdXREZXNjcmlwdG9yKCkKLSAgICAgICAgOiBzYW1wbGluZ1JhdGUoMCksIGZvcm1hdChBVURJT19GT1JNQVRfREVGQVVMVCksIGNoYW5uZWxNYXNrKDApLCBmcmFtZUNvdW50KDApLCBsYXRlbmN5KDApICB7fQorICAgICAgICA6IHNhbXBsaW5nUmF0ZSgwKSwgZm9ybWF0KEFVRElPX0ZPUk1BVF9ERUZBVUxUKSwgY2hhbm5lbE1hc2soMCksIGZyYW1lQ291bnQoMCksIGxhdGVuY3koMCkKKyAgICAgICAgICAgIHt9CiAKICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlOwogICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQ7CkBAIC0xOTMsMjcgKzIxMCw0NCBAQAogICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSk7CiAgICAgc3RhdGljIHN0YXR1c190IHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpOwogICAgIHN0YXRpYyBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSk7CisKKyAgICAvLyBDbGllbnQgbXVzdCBzdWNjZXNzZnVsbHkgaGFuZCBvZmYgdGhlIGhhbmRsZSByZWZlcmVuY2UgdG8gQXVkaW9GbGluZ2VyIHZpYSBjcmVhdGVUcmFjaygpLAorICAgIC8vIG9yIHJlbGVhc2UgaXQgd2l0aCByZWxlYXNlT3V0cHV0KCkuCiAgICAgc3RhdGljIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMKTsKKyAgICBzdGF0aWMgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCk7CiAgICAgc3RhdGljIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uID0gMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKTsKICAgICBzdGF0aWMgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24gPSAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbik7CiAgICAgc3RhdGljIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOworCisgICAgLy8gQ2xpZW50IG11c3Qgc3VjY2Vzc2Z1bGx5IGhhbmQgb2ZmIHRoZSBoYW5kbGUgcmVmZXJlbmNlIHRvIEF1ZGlvRmxpbmdlciB2aWEgb3BlblJlY29yZCgpLAorICAgIC8vIG9yIHJlbGVhc2UgaXQgd2l0aCByZWxlYXNlSW5wdXQoKS4KICAgICBzdGF0aWMgYXVkaW9faW9faGFuZGxlX3QgZ2V0SW5wdXQoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfSU5fTU9OTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgPSAwKTsKLSAgICBzdGF0aWMgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7Ci0gICAgc3RhdGljIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7Ci0gICAgc3RhdGljIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QpOworCisgICAgc3RhdGljIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgIHN0YXRpYyBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisgICAgc3RhdGljIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CiAgICAgc3RhdGljIHN0YXR1c190IGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWF4KTsKQEAgLTI1NSw4ICsyODksNTYgQEAKICAgICAvLyBjaGVjayBwcmVzZW5jZSBvZiBhdWRpbyBmbGluZ2VyIHNlcnZpY2UuCiAgICAgLy8gcmV0dXJucyBOT19FUlJPUiBpZiBiaW5kaW5nIHRvIHNlcnZpY2Ugc3VjY2VlZHMsIERFQURfT0JKRUNUIG90aGVyd2lzZQogICAgIHN0YXRpYyBzdGF0dXNfdCBjaGVja0F1ZGlvRmxpbmdlcigpOworCisgICAgLyogTGlzdCBhdmFpbGFibGUgYXVkaW8gcG9ydHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpudW1fcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKTsKKworICAgIC8qIEdldCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KTsKKworICAgIC8qIENyZWF0ZSBhbiBhdWRpbyBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzICovCisgICAgc3RhdGljIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOworCisgICAgLyogUmVsZWFzZSBhbiBhdWRpbyBwYXRjaCAqLworICAgIHN0YXRpYyBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOworCisgICAgLyogTGlzdCBleGlzdGluZyBhdWRpbyBwYXRjaGVzICovCisgICAgc3RhdGljIHN0YXR1c190IGxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pOworICAgIC8qIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24gKi8KKyAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKworCisgICAgc3RhdGljIHN0YXR1c190IGFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UpOworICAgIHN0YXRpYyBzdGF0dXNfdCByZWxlYXNlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisKKyAgICBzdGF0aWMgYXVkaW9fbW9kZV90IGdldFBob25lU3RhdGUoKTsKKwogICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorICAgIGNsYXNzIEF1ZGlvUG9ydENhbGxiYWNrIDogcHVibGljIFJlZkJhc2UKKyAgICB7CisgICAgcHVibGljOgorCisgICAgICAgICAgICAgICAgQXVkaW9Qb3J0Q2FsbGJhY2soKSB7fQorICAgICAgICB2aXJ0dWFsIH5BdWRpb1BvcnRDYWxsYmFjaygpIHt9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBvblNlcnZpY2VEaWVkKCkgPSAwOworCisgICAgfTsKKworICAgIHN0YXRpYyB2b2lkIHNldEF1ZGlvUG9ydENhbGxiYWNrKHNwPEF1ZGlvUG9ydENhbGxiYWNrPiBjYWxsQmFjayk7CisKIHByaXZhdGU6CiAKICAgICBjbGFzcyBBdWRpb0ZsaW5nZXJDbGllbnQ6IHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCwgcHVibGljIEJuQXVkaW9GbGluZ2VyQ2xpZW50CkBAIC0yNzUsNyArMzU3LDggQEAKICAgICAgICAgdmlydHVhbCB2b2lkIGlvQ29uZmlnQ2hhbmdlZChpbnQgZXZlbnQsIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCB2b2lkICpwYXJhbTIpOwogICAgIH07CiAKLSAgICBjbGFzcyBBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6IHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudAorICAgIGNsYXNzIEF1ZGlvUG9saWN5U2VydmljZUNsaWVudDogcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIEJuQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50CiAgICAgewogICAgIHB1YmxpYzoKICAgICAgICAgQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50KCkgewpAQCAtMjgzLDYgKzM2NiwxMCBAQAogCiAgICAgICAgIC8vIERlYXRoUmVjaXBpZW50CiAgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pOworCisgICAgICAgIC8vIElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOworICAgICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwogICAgIH07CiAKICAgICBzdGF0aWMgc3A8QXVkaW9GbGluZ2VyQ2xpZW50PiBnQXVkaW9GbGluZ2VyQ2xpZW50OwpAQCAtMzAyLDExICszODksMTEgQEAKIAogICAgIHN0YXRpYyBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiBnQXVkaW9Qb2xpY3lTZXJ2aWNlOwogCi0gICAgLy8gbWFwcGluZyBiZXR3ZWVuIHN0cmVhbSB0eXBlcyBhbmQgb3V0cHV0cwotICAgIHN0YXRpYyBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9fc3RyZWFtX3R5cGVfdCwgYXVkaW9faW9faGFuZGxlX3Q+IGdTdHJlYW1PdXRwdXRNYXA7CiAgICAgLy8gbGlzdCBvZiBvdXRwdXQgZGVzY3JpcHRvcnMgY29udGFpbmluZyBjYWNoZWQgcGFyYW1ldGVycwogICAgIC8vIChzYW1wbGluZyByYXRlLCBmcmFtZWNvdW50LCBjaGFubmVsIGNvdW50Li4uKQogICAgIHN0YXRpYyBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3QsIE91dHB1dERlc2NyaXB0b3IgKj4gZ091dHB1dHM7CisKKyAgICBzdGF0aWMgc3A8QXVkaW9Qb3J0Q2FsbGJhY2s+IGdBdWRpb1BvcnRDYWxsYmFjazsKIH07CiAKIH07ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1RpbWVzdGFtcC5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1RpbWVzdGFtcC5oCmluZGV4IGMyOWM3ZTUuLjk5ZTljM2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvQXVkaW9UaW1lc3RhbXAuaAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvVGltZXN0YW1wLmgKQEAgLTE5LDYgKzE5LDggQEAKIAogI2luY2x1ZGUgPHRpbWUuaD4KIAorbmFtZXNwYWNlIGFuZHJvaWQgeworCiBjbGFzcyBBdWRpb1RpbWVzdGFtcCB7CiBwdWJsaWM6CiAgICAgQXVkaW9UaW1lc3RhbXAoKSA6IG1Qb3NpdGlvbigwKSB7CkBAIC0zMCw0ICszMiw2IEBACiAgICAgc3RydWN0IHRpbWVzcGVjIG1UaW1lOyAgICAgLy8gY29ycmVzcG9uZGluZyBDTE9DS19NT05PVE9OSUMgd2hlbiBmcmFtZSBpcyBleHBlY3RlZCB0byBwcmVzZW50CiB9OwogCit9ICAgLy8gbmFtZXNwYWNlCisKICNlbmRpZiAgLy8gQU5EUk9JRF9BVURJT19USU1FU1RBTVBfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1RyYWNrLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaAppbmRleCA0NzM2MzY5Li5iNTI1NmYwIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaApAQCAtMjcsNyArMjcsNyBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWNsYXNzIGF1ZGlvX3RyYWNrX2NibGtfdDsKK3N0cnVjdCBhdWRpb190cmFja19jYmxrX3Q7CiBjbGFzcyBBdWRpb1RyYWNrQ2xpZW50UHJveHk7CiBjbGFzcyBTdGF0aWNBdWRpb1RyYWNrQ2xpZW50UHJveHk7CiAKQEAgLTM2LDExICszNiw2IEBACiBjbGFzcyBBdWRpb1RyYWNrIDogcHVibGljIFJlZkJhc2UKIHsKIHB1YmxpYzoKLSAgICBlbnVtIGNoYW5uZWxfaW5kZXggewotICAgICAgICBNT05PICAgPSAwLAotICAgICAgICBMRUZUICAgPSAwLAotICAgICAgICBSSUdIVCAgPSAxCi0gICAgfTsKIAogICAgIC8qIEV2ZW50cyB1c2VkIGJ5IEF1ZGlvVHJhY2sgY2FsbGJhY2sgZnVuY3Rpb24gKGNhbGxiYWNrX3QpLgogICAgICAqIEtlZXAgaW4gc3luYyB3aXRoIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9UcmFjay5qYXZhIE5BVElWRV9FVkVOVF8qLgpAQCAtODIsNiArNzcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChjdXJyZW50bHkgaWdub3JlZCwgYnV0IHdpbGwgbWFrZSB0aGUgcHJpbWFyeSBmaWVsZCBpbiBmdXR1cmUpCiAKICAgICAgICAgc2l6ZV90ICAgICAgc2l6ZTsgICAgICAgICAvLyBpbnB1dC9vdXRwdXQgaW4gYnl0ZXMgPT0gZnJhbWVDb3VudCAqIGZyYW1lU2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIGlucHV0IGl0IGlzIHVudXNlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIG91dHB1dCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IGZpbGxlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIHRoaXMgaXMgcmVkdW5kYW50IHdpdGggcmVzcGVjdCB0byBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBUUkFOU0ZFUl9PQlRBSU4gbW9kZSBpcyBicm9rZW4gZm9yIDgtYml0IGRhdGEKQEAgLTkxLDcgKzg3LDcgQEAKICAgICAgICAgICAgIHZvaWQqICAgICAgIHJhdzsKICAgICAgICAgICAgIHNob3J0KiAgICAgIGkxNjsgICAgICAvLyBzaWduZWQgMTYtYml0CiAgICAgICAgICAgICBpbnQ4X3QqICAgICBpODsgICAgICAgLy8gdW5zaWduZWQgOC1iaXQsIG9mZnNldCBieSAweDgwCi0gICAgICAgIH07CisgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQ6IHVudXNlZCwgb3V0cHV0OiBwb2ludGVyIHRvIGJ1ZmZlcgogICAgIH07CiAKICAgICAvKiBBcyBhIGNvbnZlbmllbmNlLCBpZiBhIGNhbGxiYWNrIGlzIHN1cHBsaWVkLCBhIGhhbmRsZXIgdGhyZWFkCkBAIC0xMjMsNiArMTE5LDggQEAKICAgICAgKiAgLSBOT19FUlJPUjogc3VjY2Vzc2Z1bCBvcGVyYXRpb24KICAgICAgKiAgLSBOT19JTklUOiBhdWRpbyBzZXJ2ZXIgb3IgYXVkaW8gaGFyZHdhcmUgbm90IGluaXRpYWxpemVkCiAgICAgICogIC0gQkFEX1ZBTFVFOiB1bnN1cHBvcnRlZCBjb25maWd1cmF0aW9uCisgICAgICogZnJhbWVDb3VudCBpcyBndWFyYW50ZWVkIHRvIGJlIG5vbi16ZXJvIGlmIHN0YXR1cyBpcyBOT19FUlJPUiwKKyAgICAgKiBhbmQgaXMgdW5kZWZpbmVkIG90aGVyd2lzZS4KICAgICAgKi8KIAogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRNaW5GcmFtZUNvdW50KHNpemVfdCogZnJhbWVDb3VudCwKQEAgLTE1Niw5ICsxNTQsMTAgQEAKICAgICAgKiBzdHJlYW1UeXBlOiAgICAgICAgIFNlbGVjdCB0aGUgdHlwZSBvZiBhdWRpbyBzdHJlYW0gdGhpcyB0cmFjayBpcyBhdHRhY2hlZCB0bwogICAgICAqICAgICAgICAgICAgICAgICAgICAgKGUuZy4gQVVESU9fU1RSRUFNX01VU0lDKS4KICAgICAgKiBzYW1wbGVSYXRlOiAgICAgICAgIERhdGEgc291cmNlIHNhbXBsaW5nIHJhdGUgaW4gSHouCi0gICAgICogZm9ybWF0OiAgICAgICAgICAgICBBdWRpbyBmb3JtYXQgKGUuZyBBVURJT19GT1JNQVRfUENNXzE2X0JJVCBmb3Igc2lnbmVkCi0gICAgICogICAgICAgICAgICAgICAgICAgICAxNiBiaXRzIHBlciBzYW1wbGUpLgotICAgICAqIGNoYW5uZWxNYXNrOiAgICAgICAgQ2hhbm5lbCBtYXNrLgorICAgICAqIGZvcm1hdDogICAgICAgICAgICAgQXVkaW8gZm9ybWF0LiAgRm9yIG1peGVkIHRyYWNrcywgYW55IFBDTSBmb3JtYXQgc3VwcG9ydGVkIGJ5IHNlcnZlciBpcyBPSworICAgICAqICAgICAgICAgICAgICAgICAgICAgb3IgQVVESU9fRk9STUFUX1BDTV84X0JJVCB3aGljaCBpcyBoYW5kbGVkIG9uIGNsaWVudCBzaWRlLiAgRm9yIGRpcmVjdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgYW5kIG9mZmxvYWRlZCB0cmFja3MsIHRoZSBwb3NzaWJsZSBmb3JtYXQocykgZGVwZW5kcyBvbiB0aGUgb3V0cHV0IHNpbmsuCisgICAgICogY2hhbm5lbE1hc2s6ICAgICAgICBDaGFubmVsIG1hc2ssIHN1Y2ggdGhhdCBhdWRpb19pc19vdXRwdXRfY2hhbm5lbChjaGFubmVsTWFzaykgaXMgdHJ1ZS4KICAgICAgKiBmcmFtZUNvdW50OiAgICAgICAgIE1pbmltdW0gc2l6ZSBvZiB0cmFjayBQQ00gYnVmZmVyIGluIGZyYW1lcy4gVGhpcyBkZWZpbmVzIHRoZQogICAgICAqICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24ncyBjb250cmlidXRpb24gdG8gdGhlCiAgICAgICogICAgICAgICAgICAgICAgICAgICBsYXRlbmN5IG9mIHRoZSB0cmFjay4gVGhlIGFjdHVhbCBzaXplIHNlbGVjdGVkIGJ5IHRoZSBBdWRpb1RyYWNrIGNvdWxkIGJlCkBAIC0xODAsMTUgKzE3OSwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQgICAgICAgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgICAgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfdCBjYmYgICAgICAgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciAgICAgICAgICAgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkICAgICAgICA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCAgICAgICAgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUgPSBUUkFOU0ZFUl9ERUZBVUxULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1aWQgPSAtMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdWlkID0gLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQgPSAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBOVUxMKTsKIAogICAgIC8qIENyZWF0ZXMgYW4gYXVkaW8gdHJhY2sgYW5kIHJlZ2lzdGVycyBpdCB3aXRoIEF1ZGlvRmxpbmdlci4KICAgICAgKiBXaXRoIHRoaXMgY29uc3RydWN0b3IsIHRoZSB0cmFjayBpcyBjb25maWd1cmVkIGZvciBzdGF0aWMgYnVmZmVyIG1vZGUuCkBAIC0yMDksMTEgKzIxMCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfdCBjYmYgICAgICA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyICAgICAgICAgID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCAgICAgICA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCAgICAgICA9IEFVRElPX1NFU1NJT05fQUxMT0NBVEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZSA9IFRSQU5TRkVSX0RFRkFVTFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVpZCA9IC0xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1aWQgPSAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCA9IC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcyA9IE5VTEwpOwogCiAgICAgLyogVGVybWluYXRlcyB0aGUgQXVkaW9UcmFjayBhbmQgdW5yZWdpc3RlcnMgaXQgZnJvbSBBdWRpb0ZsaW5nZXIuCiAgICAgICogQWxzbyBkZXN0cm95cyBhbGwgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgQXVkaW9UcmFjay4KQEAgLTI0MSwxNyArMjQ0LDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQgICAgICA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgICA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX3QgY2JmICAgICAgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgICAgICAgICAgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0aHJlYWRDYW5DYWxsSmF2YSA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgICAgICAgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgICAgICAgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlID0gVFJBTlNGRVJfREVGQVVMVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1aWQgPSAtMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVpZCA9IC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCA9IC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBOVUxMKTsKIAogICAgIC8qIFJlc3VsdCBvZiBjb25zdHJ1Y3RpbmcgdGhlIEF1ZGlvVHJhY2suIFRoaXMgbXVzdCBiZSBjaGVja2VkIGZvciBzdWNjZXNzZnVsIGluaXRpYWxpemF0aW9uCiAgICAgICogYmVmb3JlIHVzaW5nIGFueSBBdWRpb1RyYWNrIEFQSSAoZXhjZXB0IGZvciBzZXQoKSksIGJlY2F1c2UgdXNpbmcKQEAgLTI3OSw3ICsyODQsNyBAQAogICAgICAgICAgICAgc2l6ZV90ICAgICAgZnJhbWVTaXplKCkgY29uc3QgICB7IHJldHVybiBtRnJhbWVTaXplOyB9CiAKICAgICAgICAgICAgIHVpbnQzMl90ICAgIGNoYW5uZWxDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsQ291bnQ7IH0KLSAgICAgICAgICAgIHVpbnQzMl90ICAgIGZyYW1lQ291bnQoKSBjb25zdCAgeyByZXR1cm4gbUZyYW1lQ291bnQ7IH0KKyAgICAgICAgICAgIHNpemVfdCAgICAgIGZyYW1lQ291bnQoKSBjb25zdCAgeyByZXR1cm4gbUZyYW1lQ291bnQ7IH0KIAogICAgIC8qIFJldHVybiB0aGUgc3RhdGljIGJ1ZmZlciBzcGVjaWZpZWQgaW4gY29uc3RydWN0b3Igb3Igc2V0KCksIG9yIDAgZm9yIHN0cmVhbWluZyBtb2RlICovCiAgICAgICAgICAgICBzcDxJTWVtb3J5PiBzaGFyZWRCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtU2hhcmVkQnVmZmVyOyB9CkBAIC0zMzYsNyArMzQxLDcgQEAKICAgICAgKi8KICAgICAgICAgICAgIHN0YXR1c190ICAgIHNldFNhbXBsZVJhdGUodWludDMyX3Qgc2FtcGxlUmF0ZSk7CiAKLSAgICAvKiBSZXR1cm4gY3VycmVudCBzb3VyY2Ugc2FtcGxlIHJhdGUgaW4gSHosIG9yIDAgaWYgdW5rbm93biAqLworICAgIC8qIFJldHVybiBjdXJyZW50IHNvdXJjZSBzYW1wbGUgcmF0ZSBpbiBIeiAqLwogICAgICAgICAgICAgdWludDMyX3QgICAgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0OwogCiAgICAgLyogRW5hYmxlcyBsb29waW5nIGFuZCBzZXRzIHRoZSBzdGFydCBhbmQgZW5kIHBvaW50cyBvZiBsb29waW5nLgpAQCAtMzYxLDcgKzM2Niw3IEBACiAgICAgLyogU2V0cyBtYXJrZXIgcG9zaXRpb24uIFdoZW4gcGxheWJhY2sgcmVhY2hlcyB0aGUgbnVtYmVyIG9mIGZyYW1lcyBzcGVjaWZpZWQsIGEgY2FsbGJhY2sgd2l0aAogICAgICAqIGV2ZW50IHR5cGUgRVZFTlRfTUFSS0VSIGlzIGNhbGxlZC4gQ2FsbGluZyBzZXRNYXJrZXJQb3NpdGlvbiB3aXRoIG1hcmtlciA9PSAwIGNhbmNlbHMgbWFya2VyCiAgICAgICogbm90aWZpY2F0aW9uIGNhbGxiYWNrLiAgVG8gc2V0IGEgbWFya2VyIGF0IGEgcG9zaXRpb24gd2hpY2ggd291bGQgY29tcHV0ZSBhcyAwLAotICAgICAqIGEgd29ya2Fyb3VuZCBpcyB0byB0aGUgc2V0IHRoZSBtYXJrZXIgYXQgYSBuZWFyYnkgcG9zaXRpb24gc3VjaCBhcyB+MCBvciAxLgorICAgICAqIGEgd29ya2Fyb3VuZCBpcyB0byBzZXQgdGhlIG1hcmtlciBhdCBhIG5lYXJieSBwb3NpdGlvbiBzdWNoIGFzIH4wIG9yIDEuCiAgICAgICogSWYgdGhlIEF1ZGlvVHJhY2sgaGFzIGJlZW4gb3BlbmVkIHdpdGggbm8gY2FsbGJhY2sgZnVuY3Rpb24gYXNzb2NpYXRlZCwgdGhlIG9wZXJhdGlvbiB3aWxsCiAgICAgICogZmFpbC4KICAgICAgKgpAQCAtNDI1LDcgKzQzMCw3IEBACiAgICAgICogIC0gTk9fRVJST1I6IHN1Y2Nlc3NmdWwgb3BlcmF0aW9uCiAgICAgICogIC0gQkFEX1ZBTFVFOiAgcG9zaXRpb24gaXMgTlVMTAogICAgICAqLwotICAgICAgICAgICAgc3RhdHVzX3QgICAgZ2V0UG9zaXRpb24odWludDMyX3QgKnBvc2l0aW9uKSBjb25zdDsKKyAgICAgICAgICAgIHN0YXR1c190ICAgIGdldFBvc2l0aW9uKHVpbnQzMl90ICpwb3NpdGlvbik7CiAKICAgICAvKiBGb3Igc3RhdGljIGJ1ZmZlciBtb2RlIG9ubHksIHRoaXMgcmV0dXJucyB0aGUgY3VycmVudCBwbGF5YmFjayBwb3NpdGlvbiBpbiBmcmFtZXMKICAgICAgKiByZWxhdGl2ZSB0byBzdGFydCBvZiBidWZmZXIuICBJdCBpcyBhbmFsb2dvdXMgdG8gdGhlIHBvc2l0aW9uIHVuaXRzIHVzZWQgYnkKQEAgLTQ1MCw5ICs0NTUsMTAgQEAKICAgICAgKiAgbm9uZS4KICAgICAgKgogICAgICAqIFJldHVybmVkIHZhbHVlOgotICAgICAqICBoYW5kbGUgb24gYXVkaW8gaGFyZHdhcmUgb3V0cHV0CisgICAgICogIGhhbmRsZSBvbiBhdWRpbyBoYXJkd2FyZSBvdXRwdXQsIG9yIEFVRElPX0lPX0hBTkRMRV9OT05FIGlmIHRoZQorICAgICAqICB0cmFjayBuZWVkZWQgdG8gYmUgcmUtY3JlYXRlZCBidXQgdGhhdCBmYWlsZWQKICAgICAgKi8KLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgIGdldE91dHB1dCgpOworICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgICAgZ2V0T3V0cHV0KCkgY29uc3Q7CiAKICAgICAvKiBSZXR1cm5zIHRoZSB1bmlxdWUgc2Vzc2lvbiBJRCBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmFjay4KICAgICAgKgpAQCAtNTI4LDE1ICs1MzQsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1lc3BlYyAqZWxhcHNlZCA9IE5VTEwsIHNpemVfdCAqbm9uQ29udGlnID0gTlVMTCk7CiBwdWJsaWM6CiAKLS8vRUxfRklYTUUgdG8gYmUgcmVjb25jaWxlZCB3aXRoIG5ldyBvYnRhaW5CdWZmZXIoKSByZXR1cm4gY29kZXMgYW5kIGNvbnRyb2wgYmxvY2sgcHJveHkKLS8vICAgICAgICAgICAgZW51bSB7Ci0vLyAgICAgICAgICAgIE5PX01PUkVfQlVGRkVSUyA9IDB4ODAwMDAwMDEsICAgLy8gc2FtZSBuYW1lIGluIEF1ZGlvRmxpbmdlci5oLCBvayB0byBiZSBkaWZmZXJlbnQgdmFsdWUKLS8vICAgICAgICAgICAgVEVBUl9ET1dOICAgICAgID0gMHg4MDAwMDAwMiwKLS8vICAgICAgICAgICAgU1RPUFBFRCA9IDEsCi0vLyAgICAgICAgICAgIFNUUkVBTV9FTkRfV0FJVCwKLS8vICAgICAgICAgICAgU1RSRUFNX0VORAotLy8gICAgICAgIH07Ci0KICAgICAvKiBSZWxlYXNlIGEgZmlsbGVkIGJ1ZmZlciBvZiAiYXVkaW9CdWZmZXItPmZyYW1lQ291bnQiIGZyYW1lcyBmb3IgQXVkaW9GbGluZ2VyIHRvIHByb2Nlc3MuICovCiAgICAgLy8gRklYTUUgbWFrZSBwcml2YXRlIHdoZW4gb2J0YWluQnVmZmVyKCkgZm9yIFRSQU5TRkVSX09CVEFJTiBpcyByZW1vdmVkCiAgICAgICAgICAgICB2b2lkICAgICAgICByZWxlYXNlQnVmZmVyKEJ1ZmZlciogYXVkaW9CdWZmZXIpOwpAQCAtNTUxLDggKzU0OCwxMSBAQAogICAgICAqICAgICAgV09VTERfQkxPQ0sgICAgICAgICB3aGVuIG9idGFpbkJ1ZmZlcigpIHJldHVybnMgc2FtZSwgb3IKICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UcmFjayB3YXMgc3RvcHBlZCBkdXJpbmcgdGhlIHdyaXRlCiAgICAgICogICAgICBvciBhbnkgb3RoZXIgZXJyb3IgY29kZSByZXR1cm5lZCBieSBJQXVkaW9UcmFjazo6c3RhcnQoKSBvciByZXN0b3JlVHJhY2tfbCgpLgorICAgICAqIERlZmF1bHQgYmVoYXZpb3IgaXMgdG8gb25seSByZXR1cm4gdW50aWwgYWxsIGRhdGEgaGFzIGJlZW4gdHJhbnNmZXJyZWQuIFNldCAnYmxvY2tpbmcnIHRvCisgICAgICogZmFsc2UgZm9yIHRoZSBtZXRob2QgdG8gcmV0dXJuIGltbWVkaWF0ZWx5IHdpdGhvdXQgd2FpdGluZyB0byB0cnkgbXVsdGlwbGUgdGltZXMgdG8gd3JpdGUKKyAgICAgKiB0aGUgZnVsbCBjb250ZW50IG9mIHRoZSBidWZmZXIuCiAgICAgICovCi0gICAgICAgICAgICBzc2l6ZV90ICAgICB3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKTsKKyAgICAgICAgICAgIHNzaXplX3QgICAgIHdyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYmxvY2tpbmcgPSB0cnVlKTsKIAogICAgIC8qCiAgICAgICogRHVtcHMgdGhlIHN0YXRlIG9mIGFuIGF1ZGlvIHRyYWNrLgpAQCAtNTY2LDcgKzU2Niw3IEBACiAgICAgICAgICAgICB1aW50MzJfdCAgICBnZXRVbmRlcnJ1bkZyYW1lcygpIGNvbnN0OwogCiAgICAgLyogR2V0IHRoZSBmbGFncyAqLwotICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZ2V0RmxhZ3MoKSBjb25zdCB7IHJldHVybiBtRmxhZ3M7IH0KKyAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGdldEZsYWdzKCkgY29uc3QgeyBBdXRvTXV0ZXggX2wobUxvY2spOyByZXR1cm4gbUZsYWdzOyB9CiAKICAgICAvKiBTZXQgcGFyYW1ldGVycyAtIG9ubHkgcG9zc2libGUgd2hlbiB1c2luZyBkaXJlY3Qgb3V0cHV0ICovCiAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOwpAQCAtNTgwLDcgKzU4MCwxNSBAQAogICAgICAqIENhdXRpb246IGNhbGxpbmcgdGhpcyBtZXRob2QgdG9vIG9mdGVuIG1heSBiZSBpbmVmZmljaWVudDsKICAgICAgKiBpZiB5b3UgbmVlZCBhIGhpZ2ggcmVzb2x1dGlvbiBtYXBwaW5nIGJldHdlZW4gZnJhbWUgcG9zaXRpb24gYW5kIHByZXNlbnRhdGlvbiB0aW1lLAogICAgICAqIGNvbnNpZGVyIGltcGxlbWVudGluZyB0aGF0IGF0IGFwcGxpY2F0aW9uIGxldmVsLCBiYXNlZCBvbiB0aGUgbG93IHJlc29sdXRpb24gdGltZXN0YW1wcy4KLSAgICAgKiBSZXR1cm5zIE5PX0VSUk9SIGlmIHRpbWVzdGFtcCBpcyB2YWxpZC4KKyAgICAgKiBSZXR1cm5zIE5PX0VSUk9SICAgIGlmIHRpbWVzdGFtcCBpcyB2YWxpZC4KKyAgICAgKiAgICAgICAgIFdPVUxEX0JMT0NLIGlmIGNhbGxlZCBpbiBTVE9QUEVEIG9yIEZMVVNIRUQgc3RhdGUsIG9yIGlmIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgc3RhcnQvQUNUSVZFLCB3aGVuIHRoZSBudW1iZXIgb2YgZnJhbWVzIGNvbnN1bWVkIGlzIGxlc3MgdGhhbiB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIG92ZXJhbGwgaGFyZHdhcmUgbGF0ZW5jeSB0byBwaHlzaWNhbCBvdXRwdXQuIEluIFdPVUxEX0JMT0NLIGNhc2VzLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgb25lIG1pZ2h0IHBvbGwgYWdhaW4sIG9yIHVzZSBnZXRQb3NpdGlvbigpLCBvciB1c2UgMCBwb3NpdGlvbiBhbmQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgdGltZSBmb3IgdGhlIHRpbWVzdGFtcC4KKyAgICAgKiAgICAgICAgIElOVkFMSURfT1BFUkFUSU9OICBpZiBjYWxsZWQgb24gYSBGYXN0VHJhY2ssIHdyb25nIHN0YXRlLCBvciBzb21lIG90aGVyIGVycm9yLgorICAgICAqCisgICAgICogVGhlIHRpbWVzdGFtcCBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkIG9uIHJldHVybiwgaWYgc3RhdHVzIGlzIG5vdCBOT19FUlJPUi4KICAgICAgKi8KICAgICAgICAgICAgIHN0YXR1c190ICAgIGdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKTsKIApAQCAtNTg5LDYgKzU5NywxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UcmFjayhjb25zdCBBdWRpb1RyYWNrJiBvdGhlcik7CiAgICAgICAgICAgICBBdWRpb1RyYWNrJiBvcGVyYXRvciA9IChjb25zdCBBdWRpb1RyYWNrJiBvdGhlcik7CiAKKyAgICAgICAgICAgIHZvaWQgICAgICAgIHNldEF0dHJpYnV0ZXNGcm9tU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpOworICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0U3RyZWFtVHlwZUZyb21BdHRyaWJ1dGVzKGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYWEpOworICAgIC8qIHBhYSBpcyBndWFyYW50ZWVkIG5vbi1OVUxMICovCisgICAgICAgICAgICBib29sICAgICAgICBpc1ZhbGlkQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKnBhYSk7CisKICAgICAvKiBhIHNtYWxsIGludGVybmFsIGNsYXNzIHRvIGhhbmRsZSB0aGUgY2FsbGJhY2sgKi8KICAgICBjbGFzcyBBdWRpb1RyYWNrVGhyZWFkIDogcHVibGljIFRocmVhZAogICAgIHsKQEAgLTYyNiw1MyArNjM5LDYzIEBACiAgICAgICAgICAgICAvLyAgICAgIE5TX0lOQUNUSVZFIGluYWN0aXZlIHNvIGRvbid0IHJ1biBhZ2FpbiB1bnRpbCByZS1zdGFydGVkCiAgICAgICAgICAgICAvLyAgICAgIE5TX05FVkVSICAgIG5ldmVyIGFnYWluCiAgICAgICAgICAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBOU19XSEVORVZFUiA9IC0xLCBOU19JTkFDVElWRSA9IC0yLCBOU19ORVZFUiA9IC0zOwotICAgICAgICAgICAgbnNlY3NfdCBwcm9jZXNzQXVkaW9CdWZmZXIoY29uc3Qgc3A8QXVkaW9UcmFja1RocmVhZD4mIHRocmVhZCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBwcm9jZXNzU3RyZWFtRW5kKGludDMyX3Qgd2FpdENvdW50KTsKKyAgICAgICAgICAgIG5zZWNzX3QgcHJvY2Vzc0F1ZGlvQnVmZmVyKCk7CiAKKyAgICAgICAgICAgIGJvb2wgICAgIGlzT2ZmbG9hZGVkKCkgY29uc3Q7CisgICAgICAgICAgICBib29sICAgICBpc0RpcmVjdCgpIGNvbnN0OworICAgICAgICAgICAgYm9vbCAgICAgaXNPZmZsb2FkZWRPckRpcmVjdCgpIGNvbnN0OwogCiAgICAgICAgICAgICAvLyBjYWxsZXIgbXVzdCBob2xkIGxvY2sgb24gbUxvY2sgZm9yIGFsbCBfbCBtZXRob2RzCiAKLSAgICAgICAgICAgIHN0YXR1c190IGNyZWF0ZVRyYWNrX2woYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGVwb2NoKTsKKyAgICAgICAgICAgIHN0YXR1c190IGNyZWF0ZVRyYWNrX2woKTsKIAogICAgICAgICAgICAgLy8gY2FuIG9ubHkgYmUgY2FsbGVkIHdoZW4gbVN0YXRlICE9IFNUQVRFX0FDVElWRQogICAgICAgICAgICAgdm9pZCBmbHVzaF9sKCk7CiAKICAgICAgICAgICAgIHZvaWQgc2V0TG9vcF9sKHVpbnQzMl90IGxvb3BTdGFydCwgdWludDMyX3QgbG9vcEVuZCwgaW50IGxvb3BDb3VudCk7Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXRfbCgpOwogCiAgICAgICAgICAgICAvLyBGSVhNRSBlbnVtIGlzIGZhc3RlciB0aGFuIHN0cmNtcCgpIGZvciBwYXJhbWV0ZXIgJ2Zyb20nCiAgICAgICAgICAgICBzdGF0dXNfdCByZXN0b3JlVHJhY2tfbChjb25zdCBjaGFyICpmcm9tKTsKIAotICAgICAgICAgICAgYm9vbCAgICAgaXNPZmZsb2FkZWQoKSBjb25zdAorICAgICAgICAgICAgYm9vbCAgICAgaXNPZmZsb2FkZWRfbCgpIGNvbnN0CiAgICAgICAgICAgICAgICAgeyByZXR1cm4gKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDA7IH0KIAotICAgIC8vIE5leHQgMyBmaWVsZHMgbWF5IGJlIGNoYW5nZWQgaWYgSUF1ZGlvVHJhY2sgaXMgcmUtY3JlYXRlZCwgYnV0IGFsd2F5cyAhPSAwCisgICAgICAgICAgICBib29sICAgICBpc09mZmxvYWRlZE9yRGlyZWN0X2woKSBjb25zdAorICAgICAgICAgICAgICAgIHsgcmV0dXJuIChtRmxhZ3MgJiAoQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkpICE9IDA7IH0KKworICAgICAgICAgICAgYm9vbCAgICAgaXNEaXJlY3RfbCgpIGNvbnN0CisgICAgICAgICAgICAgICAgeyByZXR1cm4gKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgIT0gMDsgfQorCisgICAgICAgICAgICAvLyBpbmNyZW1lbnQgbVBvc2l0aW9uIGJ5IHRoZSBkZWx0YSBvZiBtU2VydmVyLCBhbmQgcmV0dXJuIG5ldyB2YWx1ZSBvZiBtUG9zaXRpb24KKyAgICAgICAgICAgIHVpbnQzMl90IHVwZGF0ZUFuZEdldFBvc2l0aW9uX2woKTsKKworICAgIC8vIE5leHQgNCBmaWVsZHMgbWF5IGJlIGNoYW5nZWQgaWYgSUF1ZGlvVHJhY2sgaXMgcmUtY3JlYXRlZCwgYnV0IGFsd2F5cyAhPSAwCiAgICAgc3A8SUF1ZGlvVHJhY2s+ICAgICAgICAgbUF1ZGlvVHJhY2s7CiAgICAgc3A8SU1lbW9yeT4gICAgICAgICAgICAgbUNibGtNZW1vcnk7CiAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiAgICAgbUNibGs7ICAgICAgICAgICAgICAgICAgLy8gcmUtbG9hZCBhZnRlciBtTG9jay51bmxvY2soKQorICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgICAgIG1PdXRwdXQ7ICAgICAgICAgICAgICAgIC8vIHJldHVybmVkIGJ5IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXQoKQogCiAgICAgc3A8QXVkaW9UcmFja1RocmVhZD4gICAgbUF1ZGlvVHJhY2tUaHJlYWQ7CisKICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtVm9sdW1lWzJdOwogICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1TZW5kTGV2ZWw7CiAgICAgbXV0YWJsZSB1aW50MzJfdCAgICAgICAgbVNhbXBsZVJhdGU7ICAgICAgICAgICAgLy8gbXV0YWJsZSBiZWNhdXNlIGdldFNhbXBsZVJhdGUoKSBjYW4gdXBkYXRlIGl0LgotICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50OyAgICAgICAgICAgIC8vIGNvcnJlc3BvbmRzIHRvIGN1cnJlbnQgSUF1ZGlvVHJhY2sKLSAgICBzaXplX3QgICAgICAgICAgICAgICAgICBtUmVxRnJhbWVDb3VudDsgICAgICAgICAvLyBmcmFtZSBjb3VudCB0byByZXF1ZXN0IHRoZSBuZXh0IHRpbWUgYSBuZXcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJQXVkaW9UcmFjayBpcyBuZWVkZWQKLQorICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50OyAgICAgICAgICAgIC8vIGNvcnJlc3BvbmRzIHRvIGN1cnJlbnQgSUF1ZGlvVHJhY2ssIHZhbHVlIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwb3J0ZWQgYmFjayBieSBBdWRpb0ZsaW5nZXIgdG8gdGhlIGNsaWVudAorICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1SZXFGcmFtZUNvdW50OyAgICAgICAgIC8vIGZyYW1lIGNvdW50IHRvIHJlcXVlc3QgdGhlIGZpcnN0IG9yIG5leHQgdGltZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgbmV3IElBdWRpb1RyYWNrIGlzIG5lZWRlZCwgbm9uLWRlY3JlYXNpbmcKIAogICAgIC8vIGNvbnN0YW50IGFmdGVyIGNvbnN0cnVjdG9yIG9yIHNldCgpCiAgICAgYXVkaW9fZm9ybWF0X3QgICAgICAgICAgbUZvcm1hdDsgICAgICAgICAgICAgICAgLy8gYXMgcmVxdWVzdGVkIGJ5IGNsaWVudCwgbm90IGZvcmNlZCB0byAxNi1iaXQKICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICAgICBtU3RyZWFtVHlwZTsKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtQ2hhbm5lbENvdW50OwogICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICAgIG1DaGFubmVsTWFzazsKKyAgICBzcDxJTWVtb3J5PiAgICAgICAgICAgICBtU2hhcmVkQnVmZmVyOwogICAgIHRyYW5zZmVyX3R5cGUgICAgICAgICAgIG1UcmFuc2ZlcjsKKyAgICBhdWRpb19vZmZsb2FkX2luZm9fdCAgICBtT2ZmbG9hZEluZm9Db3B5OworICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190KiBtT2ZmbG9hZEluZm87CisgICAgYXVkaW9fYXR0cmlidXRlc190ICAgICAgbUF0dHJpYnV0ZXM7CiAKICAgICAvLyBtRnJhbWVTaXplIGlzIGVxdWFsIHRvIG1GcmFtZVNpemVBRiBmb3Igbm9uLVBDTSBvciAxNi1iaXQgUENNIGRhdGEuICBGb3IgOC1iaXQgUENNIGRhdGEsIGl0J3MKICAgICAvLyB0d2ljZSBhcyBsYXJnZSBhcyBtRnJhbWVTaXplIGJlY2F1c2UgZGF0YSBpcyBleHBhbmRlZCB0byAxNi1iaXQgYmVmb3JlIGl0J3Mgc3RvcmVkIGluIGJ1ZmZlci4KQEAgLTcwNSwyMSArNzI4LDM5IEBACiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdDsgLy8gYWN0dWFsIG51bWJlciBvZiBmcmFtZXMgYmV0d2VlbiBlYWNoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90aWZpY2F0aW9uIGNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0IGluaXRpYWwgc291cmNlIHNhbXBsZSByYXRlCi0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVJlZnJlc2hSZW1haW5pbmc7ICAgICAgLy8gcHJvY2Vzc0F1ZGlvQnVmZmVyKCkgc2hvdWxkIHJlZnJlc2ggbmV4dCAyCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVJlZnJlc2hSZW1haW5pbmc7ICAgICAgLy8gcHJvY2Vzc0F1ZGlvQnVmZmVyKCkgc2hvdWxkIHJlZnJlc2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUmVtYWluaW5nRnJhbWVzIGFuZCBtUmV0cnlPblBhcnRpYWxCdWZmZXIKIAogICAgIC8vIFRoZXNlIGFyZSBwcml2YXRlIHRvIHByb2Nlc3NBdWRpb0J1ZmZlcigpLCBhbmQgYXJlIG5vdCBwcm90ZWN0ZWQgYnkgYSBsb2NrCiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVJlbWFpbmluZ0ZyYW1lczsgICAgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyB0byByZXF1ZXN0IGluIG9idGFpbkJ1ZmZlcigpCiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVJldHJ5T25QYXJ0aWFsQnVmZmVyOyAgLy8gc2xlZXAgYW5kIHJldHJ5IGFmdGVyIHBhcnRpYWwgb2J0YWluQnVmZmVyKCkKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtT2JzZXJ2ZWRTZXF1ZW5jZTsgICAgICAvLyBsYXN0IG9ic2VydmVkIHZhbHVlIG9mIG1TZXF1ZW5jZQogCi0gICAgc3A8SU1lbW9yeT4gICAgICAgICAgICAgbVNoYXJlZEJ1ZmZlcjsKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtTG9vcFBlcmlvZDsgICAgICAgICAgICAvLyBpbiBmcmFtZXMsIHplcm8gbWVhbnMgbG9vcGluZyBpcyBkaXNhYmxlZAorCiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbU1hcmtlclBvc2l0aW9uOyAgICAgICAgLy8gaW4gd3JhcHBpbmcgKG92ZXJmbG93KSBmcmFtZSB1bml0cwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1NYXJrZXJSZWFjaGVkOwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1OZXdQb3NpdGlvbjsgICAgICAgICAgIC8vIGluIGZyYW1lcwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1VcGRhdGVQZXJpb2Q7ICAgICAgICAgIC8vIGluIGZyYW1lcywgemVybyBtZWFucyBubyBFVkVOVF9ORVdfUE9TCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVNlcnZlcjsgICAgICAgICAgICAgICAgLy8gaW4gZnJhbWVzLCBsYXN0IGtub3duIG1Qcm94eS0+Z2V0UG9zaXRpb24oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGlzIGNvdW50IG9mIGZyYW1lcyBjb25zdW1lZCBieSBzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgYnkgbmV3IElBdWRpb1RyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZXRoZXIgaXQgaXMgcmVzZXQgYnkgc3RvcCgpIGlzIFRCRAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1Qb3NpdGlvbjsgICAgICAgICAgICAgIC8vIGluIGZyYW1lcywgbGlrZSBtU2VydmVyIGV4Y2VwdCBjb250aW51ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb25vdG9uaWNhbGx5IGFmdGVyIG5ldyBJQXVkaW9UcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgY291bGQgYmUgZWFzaWx5IHdpZGVuZWQgdG8gdWludDY0X3QKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtUmVsZWFzZWQ7ICAgICAgICAgICAgICAvLyBpbiBmcmFtZXMsIGNvdW50IG9mIGZyYW1lcyByZWxlYXNlZCB0byBzZXJ2ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgbm90IG5lY2Vzc2FyaWx5IGNvbnN1bWVkIGJ5IHNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNldCBieSBzdG9wKCkgYnV0IGNvbnRpbnVlcyBtb25vdG9uaWNhbGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXIgbmV3IElBdWRpb1RyYWNrIHRvIHJlc3RvcmUgbVBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBjb3VsZCBiZSBlYXNpbHkgd2lkZW5lZCB0byB1aW50NjRfdAorICAgIGludDY0X3QgICAgICAgICAgICAgICAgIG1TdGFydFVzOyAgICAgICAgICAgICAgIC8vIHRoZSBzdGFydCB0aW1lIGFmdGVyIGZsdXNoIG9yIHN0b3AuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSB1c2VkIGZvciBvZmZsb2FkZWQgYW5kIGRpcmVjdCB0cmFja3MuCiAKICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAgICBtRmxhZ3M7CisgICAgICAgIC8vIGNvbnN0IGFmdGVyIHNldCgpLCBleGNlcHQgZm9yIGJpdHMgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBhbmQgQVVESU9fT1VUUFVUX0ZMQUdfT0ZGTE9BRC4KKyAgICAgICAgLy8gbUxvY2sgbXVzdCBiZSBoZWxkIHRvIHJlYWQgb3Igd3JpdGUgdGhvc2UgYml0cyByZWxpYWJseS4KKwogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQ7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbUF1eEVmZmVjdElkOwogCkBAIC03MzksNyArNzgwLDYgQEAKICAgICBzcDxBdWRpb1RyYWNrQ2xpZW50UHJveHk+ICAgICAgIG1Qcm94eTsgICAgICAgICAvLyBwcmltYXJ5IG93bmVyIG9mIHRoZSBtZW1vcnkKIAogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1JblVuZGVycnVuOyAgICAgICAgICAgIC8vIHdoZXRoZXIgdHJhY2sgaXMgY3VycmVudGx5IGluIHVuZGVycnVuIHN0YXRlCi0gICAgU3RyaW5nOCAgICAgICAgICAgICAgICAgbU5hbWU7ICAgICAgICAgICAgICAgICAgLy8gc2VydmVyJ3MgbmFtZSBmb3IgdGhpcyBJQXVkaW9UcmFjawogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1QYXVzZWRQb3NpdGlvbjsKIAogcHJpdmF0ZToKQEAgLTc1NCw4ICs3OTQsOCBAQAogCiAgICAgc3A8RGVhdGhOb3RpZmllcj4gICAgICAgbURlYXRoTm90aWZpZXI7CiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVNlcXVlbmNlOyAgICAgICAgICAgICAgLy8gaW5jcmVtZW50ZWQgZm9yIGVhY2ggbmV3IElBdWRpb1RyYWNrIGF0dGVtcHQKLSAgICBhdWRpb19pb19oYW5kbGVfdCAgICAgICBtT3V0cHV0OyAgICAgICAgICAgICAgICAvLyBjYWNoZWQgb3V0cHV0IGlvIGhhbmRsZQogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRVaWQ7CisgICAgcGlkX3QgICAgICAgICAgICAgICAgICAgbUNsaWVudFBpZDsKIH07CiAKIGNsYXNzIFRpbWVkQXVkaW9UcmFjayA6IHB1YmxpYyBBdWRpb1RyYWNrCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuaCBiL2luY2x1ZGUvbWVkaWEvQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYWEzNzcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuaApAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfQ0hBUkFDVEVSX0VOQ09ESU5HX0RFVEVDVE9SX0gKKyNkZWZpbmUgX0NIQVJBQ1RFUl9FTkNPRElOR19ERVRFQ1RPUl9ICisKKyNpbmNsdWRlIDxtZWRpYS9tZWRpYXNjYW5uZXIuaD4KKworI2luY2x1ZGUgIlN0cmluZ0FycmF5LmgiCisKKyNpbmNsdWRlICJ1bmljb2RlL3VjbnYuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3Vjc2RldC5oIgorI2luY2x1ZGUgInVuaWNvZGUvdXN0cmluZy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIENoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IgeworCisgICAgcHVibGljOgorICAgIENoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IoKTsKKyAgICAgICAgfkNoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IoKTsKKworICAgICAgICB2b2lkIGFkZFRhZyhjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSk7CisgICAgICAgIHNpemVfdCBzaXplKCk7CisKKyAgICAgICAgdm9pZCBkZXRlY3RBbmRDb252ZXJ0KCk7CisgICAgICAgIHN0YXR1c190IGdldFRhZyhpbnQgaW5kZXgsIGNvbnN0IGNoYXIgKipuYW1lLCBjb25zdCBjaGFyKip2YWx1ZSk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBjb25zdCBVQ2hhcnNldE1hdGNoICpnZXRQcmVmZXJyZWQoCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaW5wdXQsIHNpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgY29uc3QgVUNoYXJzZXRNYXRjaCoqIHVjbWEsIHNpemVfdCBtYXRjaGVzLAorICAgICAgICAgICAgICAgIGJvb2wgKmdvb2RtYXRjaCwgaW50ICpoaWdoZXN0bWF0Y2gpOworCisgICAgICAgIGJvb2wgaXNGcmVxdWVudChjb25zdCB1aW50MTZfdCAqdmFsdWVzLCB1aW50MzJfdCBjKTsKKworICAgICAgICAvLyBjYWNoZWQgbmFtZSBhbmQgdmFsdWUgc3RyaW5ncywgZm9yIG5hdGl2ZSBlbmNvZGluZyBzdXBwb3J0LgorICAgICAgICAvLyBUT0RPOiByZXBsYWNlIHRoZXNlIHdpdGggYnl0ZSBibG9iIGFycmF5cyB0aGF0IGRvbid0IHJlcXVpcmUgdGhlIGRhdGEgdG8gYmUKKyAgICAgICAgLy8gc2luZ2xlbnVsbGJ5dGUtdGVybWluYXRlZAorICAgICAgICBTdHJpbmdBcnJheSAgICAgbU5hbWVzOworICAgICAgICBTdHJpbmdBcnJheSAgICAgbVZhbHVlczsKKworICAgICAgICBVQ29udmVydGVyKiAgICAgbVV0ZjhDb252OworfTsKKworCisKK307ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlci5oIGIvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmgKaW5kZXggODk5ZDc5Zi4uMzFhMTRmMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmgKQEAgLTUwLDYgKzUwLDcgQEAKICAgICAgICAgVFJBQ0tfVElNRUQgICA9IDEsICAvLyBjbGllbnQgcmVxdWVzdHMgYSBUaW1lZEF1ZGlvVHJhY2sKICAgICAgICAgVFJBQ0tfRkFTVCAgICA9IDIsICAvLyBjbGllbnQgcmVxdWVzdHMgYSBmYXN0IEF1ZGlvVHJhY2sgb3IgQXVkaW9SZWNvcmQKICAgICAgICAgVFJBQ0tfT0ZGTE9BRCA9IDQsICAvLyBjbGllbnQgcmVxdWVzdHMgb2ZmbG9hZCB0byBodyBjb2RlYworICAgICAgICBUUkFDS19ESVJFQ1QgPSA4LCAgIC8vIGNsaWVudCByZXF1ZXN0cyBhIGRpcmVjdCBvdXRwdXQKICAgICB9OwogICAgIHR5cGVkZWYgdWludDMyX3QgdHJhY2tfZmxhZ3NfdDsKIApAQCAtNjQsMzcgKzY1LDM5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnBGcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja19mbGFnc190ICpmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT24gc3VjY2Vzc2Z1bCByZXR1cm4sIEF1ZGlvRmxpbmdlciB0YWtlcyBvdmVyIHRoZSBoYW5kbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIGFuZCB3aWxsIHJlbGVhc2UgaXQgd2hlbiB0aGUgdHJhY2sgaXMgZGVzdHJveWVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIb3dldmVyIG9uIGZhaWx1cmUsIHRoZSBjbGllbnQgaXMgcmVzcG9uc2libGUgZm9yIHJlbGVhc2UuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgdGlkLCAgLy8gLTEgbWVhbnMgdW51c2VkLCBvdGhlcndpc2UgbXVzdCBiZSB2YWxpZCBub24tMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQ6IGlnbm9yZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0cHV0OiBzZXJ2ZXIncyBkZXNjcmlwdGlvbiBvZiBJQXVkaW9UcmFjayBmb3IgZGlzcGxheSBpbiBsb2dzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBhdHRlbXB0IHRvIHBhcnNlLCBhcyB0aGUgZm9ybWF0IGNvdWxkIGNoYW5nZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCYgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaWVudFVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cykgPSAwOwogCiAgICAgdmlydHVhbCBzcDxJQXVkaW9SZWNvcmQ+IG9wZW5SZWNvcmQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCBBdWRpb0ZsaW5nZXIgdGFrZXMgb3ZlciB0aGUgaGFuZGxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZmVyZW5jZSBhbmQgd2lsbCByZWxlYXNlIGl0IHdoZW4gdGhlIHRyYWNrIGlzIGRlc3Ryb3llZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSG93ZXZlciBvbiBmYWlsdXJlLCB0aGUgY2xpZW50IGlzIHJlc3BvbnNpYmxlIGZvciByZWxlYXNlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqcEZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrX2ZsYWdzX3QgKmZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCB0aWQsICAvLyAtMSBtZWFucyB1bnVzZWQsIG90aGVyd2lzZSBtdXN0IGJlIHZhbGlkIG5vbi0wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKm5vdGlmaWNhdGlvbkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SU1lbW9yeT4mIGNibGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElNZW1vcnk+JiBidWZmZXJzLCAgIC8vIHJldHVybiB2YWx1ZSAwIG1lYW5zIGl0IGZvbGxvd3MgY2JsawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKSA9IDA7CiAKICAgICAvKiBxdWVyeSB0aGUgYXVkaW8gaGFyZHdhcmUgc3RhdGUuIFRoaXMgc3RhdGUgbmV2ZXIgY2hhbmdlcywKICAgICAgKiBhbmQgdGhlcmVmb3JlIGNhbiBiZSBjYWNoZWQuCiAgICAgICovCiAgICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgc2FtcGxlUmF0ZShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGNvbnN0ID0gMDsKLSNpZiAwCi0gICAgdmlydHVhbCAgICAgaW50ICAgICAgICAgY2hhbm5lbENvdW50KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgY29uc3QgPSAwOwotI2VuZGlmCiAgICAgdmlydHVhbCAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgICAgIHNpemVfdCAgICAgIGZyYW1lQ291bnQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBjb25zdCA9IDA7CiAKQEAgLTE0Miw0MCArMTQ1LDQxIEBACiAgICAgdmlydHVhbCBzaXplX3QgZ2V0SW5wdXRCdWZmZXJTaXplKHVpbnQzMl90IHNhbXBsZVJhdGUsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IG9wZW5PdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpwRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcExhdGVuY3lNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IE5VTEwpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5PdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbGF0ZW5jeU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncykgPSAwOwogICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3Qgb3BlbkR1cGxpY2F0ZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MikgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdXNwZW5kT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdG9yZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpID0gMDsKIAotICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3Qgb3BlbklucHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqcEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuSW5wdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbU91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBpbnZhbGlkYXRlU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSkgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRSZW5kZXJQb3NpdGlvbihzaXplX3QgKmhhbEZyYW1lcywgc2l6ZV90ICpkc3BGcmFtZXMsCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqaGFsRnJhbWVzLCB1aW50MzJfdCAqZHNwRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIHNpemVfdCBnZXRJbnB1dEZyYW1lc0xvc3QoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGdldElucHV0RnJhbWVzTG9zdChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBpbnQgbmV3QXVkaW9TZXNzaW9uSWQoKSA9IDA7CisgICAgdmlydHVhbCBhdWRpb191bmlxdWVfaWRfdCBuZXdBdWRpb1VuaXF1ZUlkKCkgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkIGFjcXVpcmVBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGFjcXVpcmVBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uLCBwaWRfdCBwaWQpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUF1ZGlvU2Vzc2lvbklkKGludCBhdWRpb1Nlc3Npb24sIHBpZF90IHBpZCkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKm51bUVmZmVjdHMpIGNvbnN0ID0gMDsKIApAQCAtMTg4LDYgKzE5Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElFZmZlY3RDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXVkaW9GbGluZ2VyIGRvZXNuJ3QgdGFrZSBvdmVyIGhhbmRsZSByZWZlcmVuY2UgZnJvbSBjbGllbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzLApAQCAtMjA5LDYgKzIxNCwyOSBAQAogICAgIC8vIGFuZCBzaG91bGQgYmUgY2FsbGVkIGF0IG1vc3Qgb25jZS4gIEZvciBhIGRlZmluaXRpb24gb2Ygd2hhdCAibG93IFJBTSIgbWVhbnMsIHNlZQogICAgIC8vIGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlci5pc0xvd1JhbURldmljZSgpLgogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TG93UmFtRGV2aWNlKGJvb2wgaXNMb3dSYW1EZXZpY2UpID0gMDsKKworICAgIC8qIExpc3QgYXZhaWxhYmxlIGF1ZGlvIHBvcnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyh1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cykgPSAwOworCisgICAgLyogR2V0IGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydCAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSA9IDA7CisKKyAgICAvKiBDcmVhdGUgYW4gYXVkaW8gcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cyAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkgPSAwOworCisgICAgLyogUmVsZWFzZSBhbiBhdWRpbyBwYXRjaCAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKSA9IDA7CisKKyAgICAvKiBMaXN0IGV4aXN0aW5nIGF1ZGlvIHBhdGNoZXMgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzKSA9IDA7CisgICAgLyogU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbiAqLworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSA9IDA7CisKKyAgICAvKiBHZXQgdGhlIEhXIHN5bmNocm9uaXphdGlvbiBzb3VyY2UgdXNlZCBmb3IgYW4gYXVkaW8gc2Vzc2lvbiAqLworICAgIHZpcnR1YWwgYXVkaW9faHdfc3luY190IGdldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKSA9IDA7CiB9OwogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oIGIvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKaW5kZXggMDliOWVhNi4uMTZmZTljZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CisjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oPgogCiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgogCkBAIC01NSw2ICs1NiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCkgPSAwOworICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IDApID0gMDsKQEAgLTYzLDEzICs3MCwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IDApID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpID0gMDsKICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldElucHV0KGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvU2Vzc2lvbiA9IDApID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWF4KSA9IDA7CkBAIC05OSw2ICsxMTAsNDAgQEAKICAgIC8vIENoZWNrIGlmIG9mZmxvYWQgaXMgcG9zc2libGUgZm9yIGdpdmVuIGZvcm1hdCwgc3RyZWFtIHR5cGUsIHNhbXBsZSByYXRlLAogICAgIC8vIGJpdCByYXRlLCBkdXJhdGlvbiwgdmlkZW8gYW5kIHN0cmVhbWluZyBvciBvZmZsb2FkIHByb3BlcnR5IGlzIGVuYWJsZWQKICAgICB2aXJ0dWFsIGJvb2wgaXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBpbmZvKSA9IDA7CisKKyAgICAvKiBMaXN0IGF2YWlsYWJsZSBhdWRpbyBwb3J0cyBhbmQgdGhlaXIgYXR0cmlidXRlcyAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZ2VuZXJhdGlvbikgPSAwOworCisgICAgLyogR2V0IGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydCAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSA9IDA7CisKKyAgICAvKiBDcmVhdGUgYW4gYXVkaW8gcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cyAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkgPSAwOworCisgICAgLyogUmVsZWFzZSBhbiBhdWRpbyBwYXRjaCAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKSA9IDA7CisKKyAgICAvKiBMaXN0IGV4aXN0aW5nIGF1ZGlvIHBhdGNoZXMgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pID0gMDsKKyAgICAvKiBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlckNsaWVudChjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiYgY2xpZW50KSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pID0gMDsKKworICAgIHZpcnR1YWwgYXVkaW9fbW9kZV90IGdldFBob25lU3RhdGUoKSA9IDA7CiB9OwogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oIGIvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlkZjA0NgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSUFVRElPUE9MSUNZU0VSVklDRUNMSUVOVF9ICisjZGVmaW5lIEFORFJPSURfSUFVRElPUE9MSUNZU0VSVklDRUNMSUVOVF9ICisKKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCA6IHB1YmxpYyBJSW50ZXJmYWNlCit7CitwdWJsaWM6CisgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQpOworCisgICAgLy8gTm90aWZpZXMgYSBjaGFuZ2Ugb2YgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uLgorICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKSA9IDA7CisgICAgLy8gTm90aWZpZXMgYSBjaGFuZ2Ugb2YgYXVkaW8gcGF0Y2ggY29uZmlndXJhdGlvbi4KKyAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpID0gMDsKK307CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBCbkF1ZGlvUG9saWN5U2VydmljZUNsaWVudCA6IHB1YmxpYyBCbkludGVyZmFjZTxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PgoreworcHVibGljOgorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCggdWludDMyX3QgY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9JQVVESU9QT0xJQ1lTRVJWSUNFQ0xJRU5UX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSUF1ZGlvUmVjb3JkLmggYi9pbmNsdWRlL21lZGlhL0lBdWRpb1JlY29yZC5oCmluZGV4IGVjY2MyY2EuLjIwMDM5ODUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSUF1ZGlvUmVjb3JkLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JQXVkaW9SZWNvcmQuaApAQCAtMzQsOSArMzQsNiBAQAogcHVibGljOgogICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoQXVkaW9SZWNvcmQpOwogCi0gICAgLyogZ2V0IHRoaXMgdHJhY2tzIGNvbnRyb2wgYmxvY2sgKi8KLSAgICB2aXJ0dWFsIHNwPElNZW1vcnk+IGdldENibGsoKSBjb25zdCA9IDA7Ci0KICAgICAvKiBBZnRlciBpdCdzIGNyZWF0ZWQgdGhlIHRyYWNrIGlzIG5vdCBhY3RpdmUuIENhbGwgc3RhcnQoKSB0bwogICAgICAqIG1ha2UgaXQgYWN0aXZlLgogICAgICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JQXVkaW9UcmFjay5oIGIvaW5jbHVkZS9tZWRpYS9JQXVkaW9UcmFjay5oCmluZGV4IDVjOGE0ODQuLjYxOWFjNzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSUF1ZGlvVHJhY2suaAorKysgYi9pbmNsdWRlL21lZGlhL0lBdWRpb1RyYWNrLmgKQEAgLTg4LDcgKzg4LDcgQEAKICAgICAvKiBTZW5kIHBhcmFtZXRlcnMgdG8gdGhlIGF1ZGlvIGhhcmR3YXJlICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpID0gMDsKIAotICAgIC8qIFJldHVybiBOT19FUlJPUiBpZiB0aW1lc3RhbXAgaXMgdmFsaWQgKi8KKyAgICAvKiBSZXR1cm4gTk9fRVJST1IgaWYgdGltZXN0YW1wIGlzIHZhbGlkLiAgdGltZXN0YW1wIGlzIHVuZGVmaW5lZCBvdGhlcndpc2UuICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCkgPSAwOwogCiAgICAgLyogU2lnbmFsIHRoZSBwbGF5YmFjayB0aHJlYWQgZm9yIGEgY2hhbmdlIGluIGNvbnRyb2wgYmxvY2sgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSURybS5oIGIvaW5jbHVkZS9tZWRpYS9JRHJtLmgKaW5kZXggMzJhZTI4ZS4uNjhkZTg3YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9JRHJtLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JRHJtLmgKQEAgLTcwLDYgKzcwLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJmNlcnRpZmljYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmd3JhcHBlZEtleSkgPSAwOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCB1bnByb3Zpc2lvbkRldmljZSgpID0gMDsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcHMoTGlzdDxWZWN0b3I8dWludDhfdD4gPiAmc2VjdXJlU3RvcHMpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZVNlY3VyZVN0b3BzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NSZWxlYXNlKSA9IDA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lNZWRpYUNvZGVjTGlzdC5oIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFDb2RlY0xpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTNlYThiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFDb2RlY0xpc3QuaApAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0lNRURJQUNPREVDTElTVF9ICisjZGVmaW5lIEFORFJPSURfSU1FRElBQ09ERUNMSVNUX0gKKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPiAgLy8gZm9yIHN0YXR1c190CisjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IE1lZGlhQ29kZWNJbmZvOworCitjbGFzcyBJTWVkaWFDb2RlY0xpc3Q6IHB1YmxpYyBJSW50ZXJmYWNlCit7CitwdWJsaWM6CisgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShNZWRpYUNvZGVjTGlzdCk7CisKKyAgICB2aXJ0dWFsIHNpemVfdCBjb3VudENvZGVjcygpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHNwPE1lZGlhQ29kZWNJbmZvPiBnZXRDb2RlY0luZm8oc2l6ZV90IGluZGV4KSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIHNzaXplX3QgZmluZENvZGVjQnlUeXBlKAorICAgICAgICAgICAgY29uc3QgY2hhciAqdHlwZSwgYm9vbCBlbmNvZGVyLCBzaXplX3Qgc3RhcnRJbmRleCA9IDApIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgc3NpemVfdCBmaW5kQ29kZWNCeU5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3QgPSAwOworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBCbk1lZGlhQ29kZWNMaXN0OiBwdWJsaWMgQm5JbnRlcmZhY2U8SU1lZGlhQ29kZWNMaXN0PgoreworcHVibGljOgorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCggdWludDMyX3QgY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSU1FRElBQ09ERUNMSVNUX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uaCBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTYzZWI3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFIVFRQQ29ubmVjdGlvbi5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElfTUVESUFfSFRUUF9DT05ORUNUSU9OX0hfCisKKyNkZWZpbmUgSV9NRURJQV9IVFRQX0NPTk5FQ1RJT05fSF8KKworI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IElNZWRpYUhUVFBDb25uZWN0aW9uOworCisvKiogTVVTVCBzdGF5IGluIHN5bmMgd2l0aCBJTWVkaWFIVFRQQ29ubmVjdGlvbi5haWRsICovCisKK3N0cnVjdCBJTWVkaWFIVFRQQ29ubmVjdGlvbiA6IHB1YmxpYyBJSW50ZXJmYWNlIHsKKyAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKE1lZGlhSFRUUENvbm5lY3Rpb24pOworCisgICAgdmlydHVhbCBib29sIGNvbm5lY3QoCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmksIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdCgpID0gMDsKKyAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgPSAwOworICAgIHZpcnR1YWwgb2ZmNjRfdCBnZXRTaXplKCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TUlNRVR5cGUoU3RyaW5nOCAqbWltZVR5cGUpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFVyaShTdHJpbmc4ICp1cmkpID0gMDsKKworcHJpdmF0ZToKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhJTWVkaWFIVFRQQ29ubmVjdGlvbik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIElfTUVESUFfSFRUUF9DT05ORUNUSU9OX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmggYi9pbmNsdWRlL21lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY2ZDZjOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJX01FRElBX0hUVFBfU0VSVklDRV9IXworCisjZGVmaW5lIElfTUVESUFfSFRUUF9TRVJWSUNFX0hfCisKKyNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgSU1lZGlhSFRUUENvbm5lY3Rpb247CisKKy8qKiBNVVNUIHN0YXkgaW4gc3luYyB3aXRoIElNZWRpYUhUVFBTZXJ2aWNlLmFpZGwgKi8KKworc3RydWN0IElNZWRpYUhUVFBTZXJ2aWNlIDogcHVibGljIElJbnRlcmZhY2UgeworICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoTWVkaWFIVFRQU2VydmljZSk7CisKKyAgICB2aXJ0dWFsIHNwPElNZWRpYUhUVFBDb25uZWN0aW9uPiBtYWtlSFRUUENvbm5lY3Rpb24oKSA9IDA7CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSU1lZGlhSFRUUFNlcnZpY2UpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBJX01FRElBX0hUVFBfU0VSVklDRV9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5oIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5oCmluZGV4IDZkYmIyZDcuLjI1Mjk4MDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmgKQEAgLTI2LDYgKzI2LDggQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CisKIGNsYXNzIElNZWRpYU1ldGFkYXRhUmV0cmlldmVyOiBwdWJsaWMgSUludGVyZmFjZQogewogcHVibGljOgpAQCAtMzMsNiArMzUsNyBAQAogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIGRpc2Nvbm5lY3QoKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXREYXRhU291cmNlKAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnNyY1VybCwKICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCkgPSAwOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllci5oIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXIuaAppbmRleCAwY2JkMjY5Li5kYjYyY2Q1IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyLmgKQEAgLTMzLDYgKzMzLDcgQEAKIGNsYXNzIFN1cmZhY2U7CiBjbGFzcyBJU3RyZWFtU291cmNlOwogY2xhc3MgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK3N0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKIAogY2xhc3MgSU1lZGlhUGxheWVyOiBwdWJsaWMgSUludGVyZmFjZQogewpAQCAtNDEsOCArNDIsMTEgQEAKIAogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIGRpc2Nvbm5lY3QoKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXREYXRhU291cmNlKGNvbnN0IGNoYXIgKnVybCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+KiBoZWFkZXJzKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiogaGVhZGVycykgPSAwOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldERhdGFTb3VyY2UoY29uc3Qgc3A8SVN0cmVhbVNvdXJjZT4mIHNvdXJjZSkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFZpZGVvU3VyZmFjZVRleHR1cmUoCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaCBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oCmluZGV4IDI5OThiMzcuLmQ3ZTU4NGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oCkBAIC0zNCw2ICszNCw4IEBACiBzdHJ1Y3QgSUNyeXB0bzsKIHN0cnVjdCBJRHJtOwogc3RydWN0IElIRENQOworc3RydWN0IElNZWRpYUNvZGVjTGlzdDsKK3N0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKIGNsYXNzIElNZWRpYVJlY29yZGVyOwogY2xhc3MgSU9NWDsKIGNsYXNzIElSZW1vdGVEaXNwbGF5OwpAQCAtNDksOSArNTEsMTQgQEAKICAgICB2aXJ0dWFsIHNwPElNZWRpYU1ldGFkYXRhUmV0cmlldmVyPiBjcmVhdGVNZXRhZGF0YVJldHJpZXZlcigpID0gMDsKICAgICB2aXJ0dWFsIHNwPElNZWRpYVBsYXllcj4gY3JlYXRlKGNvbnN0IHNwPElNZWRpYVBsYXllckNsaWVudD4mIGNsaWVudCwgaW50IGF1ZGlvU2Vzc2lvbklkID0gMCkgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgIGRlY29kZShjb25zdCBjaGFyKiB1cmwsIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwgaW50KiBwTnVtQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCogcEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwgc2l6ZV90ICpwU2l6ZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICBkZWNvZGUoCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciogdXJsLAorICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGVSYXRlLAorICAgICAgICAgICAgaW50KiBwTnVtQ2hhbm5lbHMsCisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCogcEZvcm1hdCwKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwgc2l6ZV90ICpwU2l6ZSkgPSAwOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgIGRlY29kZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCwgdWludDMyX3QgKnBTYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBwTnVtQ2hhbm5lbHMsIGF1ZGlvX2Zvcm1hdF90KiBwRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwLCBzaXplX3QgKnBTaXplKSA9IDA7CkBAIC01OSw2ICs2Niw3IEBACiAgICAgdmlydHVhbCBzcDxJQ3J5cHRvPiAgICAgICAgIG1ha2VDcnlwdG8oKSA9IDA7CiAgICAgdmlydHVhbCBzcDxJRHJtPiAgICAgICAgICAgIG1ha2VEcm0oKSA9IDA7CiAgICAgdmlydHVhbCBzcDxJSERDUD4gICAgICAgICAgIG1ha2VIRENQKGJvb2wgY3JlYXRlRW5jcnlwdGlvbk1vZHVsZSkgPSAwOworICAgIHZpcnR1YWwgc3A8SU1lZGlhQ29kZWNMaXN0PiBnZXRDb2RlY0xpc3QoKSBjb25zdCA9IDA7CiAKICAgICAvLyBDb25uZWN0cyB0byBhIHJlbW90ZSBkaXNwbGF5LgogICAgIC8vICdpZmFjZScgc3BlY2lmaWVzIHRoZSBhZGRyZXNzIG9mIHRoZSBsb2NhbCBpbnRlcmZhY2Ugb24gd2hpY2ggdG8gbGlzdGVuIGZvcgpAQCAtOTMsOSArMTAxLDYgQEAKIAogICAgIHZpcnR1YWwgdm9pZCBhZGRCYXR0ZXJ5RGF0YSh1aW50MzJfdCBwYXJhbXMpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHB1bGxCYXR0ZXJ5RGF0YShQYXJjZWwqIHJlcGx5KSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHVwZGF0ZVByb3h5Q29uZmlnKAotICAgICAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgaW50MzJfdCBwb3J0LCBjb25zdCBjaGFyICpleGNsdXNpb25MaXN0KSA9IDA7CiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lPTVguaCBiL2luY2x1ZGUvbWVkaWEvSU9NWC5oCmluZGV4IDg2YTQ0YTkuLjZlNGE0YWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSU9NWC5oCisrKyBiL2luY2x1ZGUvbWVkaWEvSU9NWC5oCkBAIC0zOCw4ICszOCw4IEBACiBwdWJsaWM6CiAgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShPTVgpOwogCi0gICAgdHlwZWRlZiB2b2lkICpidWZmZXJfaWQ7Ci0gICAgdHlwZWRlZiB2b2lkICpub2RlX2lkOworICAgIHR5cGVkZWYgdWludDMyX3QgYnVmZmVyX2lkOworICAgIHR5cGVkZWYgdWludDMyX3Qgbm9kZV9pZDsKIAogICAgIC8vIEdpdmVuIGEgbm9kZV9pZCBhbmQgdGhlIGNhbGxpbmcgcHJvY2VzcycgcGlkLCByZXR1cm5zIHRydWUgaWZmCiAgICAgLy8gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBPTVggaW50ZXJmYWNlIGxpdmVzIGluIHRoZSBzYW1lCkBAIC04Nyw2ICs4NywxMCBAQAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgZW5hYmxlLAogICAgICAgICAgICAgT01YX1UzMiBtYXhGcmFtZVdpZHRoLCBPTVhfVTMyIG1heEZyYW1lSGVpZ2h0KSA9IDA7CiAKKyAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlVmlkZW9UdW5uZWxNb2RlKAorICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgdHVubmVsZWQsCisgICAgICAgICAgICBPTVhfVTMyIGF1ZGlvSHdTeW5jLCBuYXRpdmVfaGFuZGxlX3QgKipzaWRlYmFuZEhhbmRsZSkgPSAwOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBlbmFibGVHcmFwaGljQnVmZmVycygKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBPTVhfQk9PTCBlbmFibGUpID0gMDsKIApAQCAtMTQzLDYgKzE0Nyw4IEBACiAgICAgICAgIElOVEVSTkFMX09QVElPTl9TVVNQRU5ELCAgLy8gZGF0YSBpcyBhIGJvb2wKICAgICAgICAgSU5URVJOQUxfT1BUSU9OX1JFUEVBVF9QUkVWSU9VU19GUkFNRV9ERUxBWSwgIC8vIGRhdGEgaXMgYW4gaW50NjRfdAogICAgICAgICBJTlRFUk5BTF9PUFRJT05fTUFYX1RJTUVTVEFNUF9HQVAsIC8vIGRhdGEgaXMgaW50NjRfdAorICAgICAgICBJTlRFUk5BTF9PUFRJT05fU1RBUlRfVElNRSwgLy8gZGF0YSBpcyBhbiBpbnQ2NF90CisgICAgICAgIElOVEVSTkFMX09QVElPTl9USU1FX0xBUFNFLCAvLyBkYXRhIGlzIGFuIGludDY0X3RbMl0KICAgICB9OwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SW50ZXJuYWxPcHRpb24oCiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsCkBAIC0xODIsOCArMTg4LDYgQEAKICAgICAgICAgICAgIE9NWF9VMzIgcmFuZ2VfbGVuZ3RoOwogICAgICAgICAgICAgT01YX1UzMiBmbGFnczsKICAgICAgICAgICAgIE9NWF9USUNLUyB0aW1lc3RhbXA7Ci0gICAgICAgICAgICBPTVhfUFRSIHBsYXRmb3JtX3ByaXZhdGU7Ci0gICAgICAgICAgICBPTVhfUFRSIGRhdGFfcHRyOwogICAgICAgICB9IGV4dGVuZGVkX2J1ZmZlcl9kYXRhOwogCiAgICAgfSB1OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYUNvZGVjSW5mby5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYUNvZGVjSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNTZhZGIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhQ29kZWNJbmZvLmgKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfQ09ERUNfSU5GT19IXworCisjZGVmaW5lIE1FRElBX0NPREVDX0lORk9fSF8KKworI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFNZXNzYWdlOworc3RydWN0IFBhcmNlbDsKK3N0cnVjdCBDb2RlY0NhcGFiaWxpdGllczsKKworc3RydWN0IE1lZGlhQ29kZWNJbmZvIDogcHVibGljIFJlZkJhc2UgeworICAgIHN0cnVjdCBQcm9maWxlTGV2ZWwgeworICAgICAgICB1aW50MzJfdCBtUHJvZmlsZTsKKyAgICAgICAgdWludDMyX3QgbUxldmVsOworICAgIH07CisKKyAgICBzdHJ1Y3QgQ2FwYWJpbGl0aWVzIDogcHVibGljIFJlZkJhc2UgeworICAgICAgICB2b2lkIGdldFN1cHBvcnRlZFByb2ZpbGVMZXZlbHMoVmVjdG9yPFByb2ZpbGVMZXZlbD4gKnByb2ZpbGVMZXZlbHMpIGNvbnN0OworICAgICAgICB2b2lkIGdldFN1cHBvcnRlZENvbG9yRm9ybWF0cyhWZWN0b3I8dWludDMyX3Q+ICpjb2xvckZvcm1hdHMpIGNvbnN0OworICAgICAgICB1aW50MzJfdCBnZXRGbGFncygpIGNvbnN0OworICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gZ2V0RGV0YWlscygpIGNvbnN0OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgVmVjdG9yPFByb2ZpbGVMZXZlbD4gbVByb2ZpbGVMZXZlbHM7CisgICAgICAgIFZlY3Rvcjx1aW50MzJfdD4gbUNvbG9yRm9ybWF0czsKKyAgICAgICAgdWludDMyX3QgbUZsYWdzOworICAgICAgICBzcDxBTWVzc2FnZT4gbURldGFpbHM7CisKKyAgICAgICAgQ2FwYWJpbGl0aWVzKCk7CisKKyAgICAgICAgLy8gcmVhZCBvYmplY3QgZnJvbSBwYXJjZWwgZXZlbiBpZiBvYmplY3QgY3JlYXRpb24gZmFpbHMKKyAgICAgICAgc3RhdGljIHNwPENhcGFiaWxpdGllcz4gRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgJnBhcmNlbCk7CisgICAgICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0OworCisgICAgICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENhcGFiaWxpdGllcyk7CisKKyAgICAgICAgZnJpZW5kIGNsYXNzIE1lZGlhQ29kZWNJbmZvOworICAgIH07CisKKyAgICBib29sIGlzRW5jb2RlcigpIGNvbnN0OworICAgIGJvb2wgaGFzUXVpcmsoY29uc3QgY2hhciAqbmFtZSkgY29uc3Q7CisgICAgdm9pZCBnZXRTdXBwb3J0ZWRNaW1lcyhWZWN0b3I8QVN0cmluZz4gKm1pbWVzKSBjb25zdDsKKyAgICBjb25zdCBzcDxDYXBhYmlsaXRpZXM+IGdldENhcGFiaWxpdGllc0Zvcihjb25zdCBjaGFyICptaW1lKSBjb25zdDsKKyAgICBjb25zdCBjaGFyICpnZXRDb2RlY05hbWUoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6YXRpb24gb3ZlciBCaW5kZXIKKyAgICAgKi8KKyAgICBzdGF0aWMgc3A8TWVkaWFDb2RlY0luZm8+IEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICZwYXJjZWwpOworICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0OworCitwcml2YXRlOgorICAgIC8vIHZhcmlhYmxlIHNldCBvbmx5IGluIGNvbnN0cnVjdG9yIC0gdGhlc2UgYXJlIGFjY2Vzc2VkIGJ5IE1lZGlhQ29kZWNMaXN0CisgICAgLy8gdG8gYXZvaWQgZHVwbGljYXRpb24gb2Ygc2FtZSB2YXJpYWJsZXMKKyAgICBBU3RyaW5nIG1OYW1lOworICAgIGJvb2wgbUlzRW5jb2RlcjsKKyAgICBib29sIG1IYXNTb2xlTWltZTsgLy8gd2FzIGluaXRpYWxpemVkIHdpdGggbWltZQorCisgICAgVmVjdG9yPEFTdHJpbmc+IG1RdWlya3M7CisgICAgS2V5ZWRWZWN0b3I8QVN0cmluZywgc3A8Q2FwYWJpbGl0aWVzPiA+IG1DYXBzOworCisgICAgc3A8Q2FwYWJpbGl0aWVzPiBtQ3VycmVudENhcHM7IC8vIGN1cnJlbnRseSBpbml0YWxpemVkIGNhcGFiaWxpdGllcworCisgICAgc3NpemVfdCBnZXRDYXBhYmlsaXR5SW5kZXgoY29uc3QgY2hhciAqbWltZSkgY29uc3Q7CisKKyAgICAvKiBNZXRob2RzIHVzZWQgYnkgTWVkaWFDb2RlY0xpc3QgdG8gY29uc3RydWN0IHRoZSBpbmZvCisgICAgICogb2JqZWN0IGZyb20gWE1MLgorICAgICAqCisgICAgICogQWZ0ZXIgaW5mbyBvYmplY3QgaXMgY3JlYXRlZDoKKyAgICAgKiAtIGFkZGl0aW9uYWwgcXVpcmtzIGNhbiBiZSBhZGRlZAorICAgICAqIC0gYWRkaXRpb25hbCBtaW1lcyBjYW4gYmUgYWRkZWQKKyAgICAgKiAgIC0gT01YIGNvZGVjIGNhcGFiaWxpdGllcyBjYW4gYmUgc2V0IGZvciB0aGUgY3VycmVudCBtaW1lLXR5cGUKKyAgICAgKiAgIC0gYSBjYXBhYmlsaXR5IGRldGFpbCBjYW4gYmUgc2V0IGZvciB0aGUgY3VycmVudCBtaW1lLXR5cGUKKyAgICAgKiAgIC0gYSBmZWF0dXJlIGNhbiBiZSBzZXQgZm9yIHRoZSBjdXJyZW50IG1pbWUtdHlwZQorICAgICAqICAgLSBpbmZvIG9iamVjdCBjYW4gYmUgY29tcGxldGVkIHdoZW4gcGFyc2luZyBvZiBhIG1pbWUtdHlwZSBpcyBkb25lCisgICAgICovCisgICAgTWVkaWFDb2RlY0luZm8oQVN0cmluZyBuYW1lLCBib29sIGVuY29kZXIsIGNvbnN0IGNoYXIgKm1pbWUpOworICAgIHZvaWQgYWRkUXVpcmsoY29uc3QgY2hhciAqbmFtZSk7CisgICAgc3RhdHVzX3QgYWRkTWltZShjb25zdCBjaGFyICptaW1lKTsKKyAgICBzdGF0dXNfdCBpbml0aWFsaXplQ2FwYWJpbGl0aWVzKGNvbnN0IENvZGVjQ2FwYWJpbGl0aWVzICZjYXBzKTsKKyAgICB2b2lkIGFkZERldGFpbChjb25zdCBBU3RyaW5nICZrZXksIGNvbnN0IEFTdHJpbmcgJnZhbHVlKTsKKyAgICB2b2lkIGFkZEZlYXR1cmUoY29uc3QgQVN0cmluZyAma2V5LCBpbnQzMl90IHZhbHVlKTsKKyAgICB2b2lkIGFkZEZlYXR1cmUoY29uc3QgQVN0cmluZyAma2V5LCBjb25zdCBjaGFyICp2YWx1ZSk7CisgICAgdm9pZCByZW1vdmVNaW1lKGNvbnN0IGNoYXIgKm1pbWUpOworICAgIHZvaWQgY29tcGxldGUoKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lZGlhQ29kZWNJbmZvKTsKKworICAgIGZyaWVuZCBjbGFzcyBNZWRpYUNvZGVjTGlzdDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfQ09ERUNfSU5GT19IXworCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFNZXRhZGF0YVJldHJpZXZlckludGVyZmFjZS5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmgKaW5kZXggZWNjM2I2NS4uMzhkYmIyMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmgKQEAgLTIwLDEwICsyMCwxMyBAQAogCiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9tZWRpYXNjYW5uZXIuaD4KICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL1ZpZGVvRnJhbWUuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CisKIC8vIEFic3RyYWN0IGJhc2UgY2xhc3MKIGNsYXNzIE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXJCYXNlIDogcHVibGljIFJlZkJhc2UKIHsKQEAgLTMyLDYgKzM1LDcgQEAKICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5NZWRpYU1ldGFkYXRhUmV0cmlldmVyQmFzZSgpIHt9CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldERhdGFTb3VyY2UoCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMKSA9IDA7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaAppbmRleCAyNmQ4NzI5Li5jZjE4YTQ1IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oCkBAIC0yNyw2ICsyNyw3IEBACiAKICNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9UaW1lc3RhbXAuaD4KICNpbmNsdWRlIDxtZWRpYS9NZXRhZGF0YS5oPgogCiAvLyBGd2QgZGVjbCB0byBtYWtlIHN1cmUgZXZlcnlvbmUgYWdyZWVzIHRoYXQgdGhlIHNjb3BlIG9mIHN0cnVjdCBzb2NrYWRkcl9pbiBpcwpAQCAtOTcsNiArOTgsNyBAQAogICAgICAgICB2aXJ0dWFsIHVpbnQzMl90ICAgIGxhdGVuY3koKSBjb25zdCA9IDA7CiAgICAgICAgIHZpcnR1YWwgZmxvYXQgICAgICAgbXNlY3NQZXJGcmFtZSgpIGNvbnN0ID0gMDsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRQb3NpdGlvbih1aW50MzJfdCAqcG9zaXRpb24pIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAgJnRzKSBjb25zdCA9IDA7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0RnJhbWVzV3JpdHRlbih1aW50MzJfdCAqZnJhbWVzd3JpdHRlbikgY29uc3QgPSAwOwogICAgICAgICB2aXJ0dWFsIGludCAgICAgICAgIGdldFNlc3Npb25JZCgpIGNvbnN0ID0gMDsKICAgICAgICAgdmlydHVhbCBhdWRpb19zdHJlYW1fdHlwZV90IGdldEF1ZGlvU3RyZWFtVHlwZSgpIGNvbnN0ID0gMDsKQEAgLTEzNyw2ICsxMzksNyBAQAogICAgIH0KIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCiAgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCiAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyA9IE5VTEwpID0gMDsKIApAQCAtMjEzLDExICsyMTYsNiBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCB1cGRhdGVQcm94eUNvbmZpZygKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGludDMyX3QgcG9ydCwgY29uc3QgY2hhciAqZXhjbHVzaW9uTGlzdCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCiBwcml2YXRlOgogICAgIGZyaWVuZCBjbGFzcyBNZWRpYVBsYXllclNlcnZpY2U7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmgKaW5kZXggOWZjOTYyYy4uZjA2MWQyMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmgKQEAgLTMzLDcgKzMzLDggQEAKICAgICBDQU1DT1JERVJfUVVBTElUWV83MjBQID0gNSwKICAgICBDQU1DT1JERVJfUVVBTElUWV8xMDgwUCA9IDYsCiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfUVZHQSA9IDcsCi0gICAgQ0FNQ09SREVSX1FVQUxJVFlfTElTVF9FTkQgPSA3LAorICAgIENBTUNPUkRFUl9RVUFMSVRZXzIxNjBQID0gOCwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9MSVNUX0VORCA9IDgsCiAKICAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX0xJU1RfU1RBUlQgPSAxMDAwLAogICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfTE9XICA9IDEwMDAsCkBAIC00NCw3ICs0NSwxNyBAQAogICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfNzIwUCA9IDEwMDUsCiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV8xMDgwUCA9IDEwMDYsCiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9RVkdBID0gMTAwNywKLSAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX0xJU1RfRU5EID0gMTAwNywKKyAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzIxNjBQID0gMTAwOCwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX0xJU1RfRU5EID0gMTAwOCwKKworICAgIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfTElTVF9TVEFSVCA9IDIwMDAsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF9MT1cgID0gMjAwMCwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEX0hJR0ggPSAyMDAxLAorICAgIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfNDgwUCA9IDIwMDIsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF83MjBQID0gMjAwMywKKyAgICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEXzEwODBQID0gMjAwNCwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEXzIxNjBQID0gMjAwNSwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEX0xJU1RfRU5EID0gMjAwNSwKIH07CiAKIC8qKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9Tb3VuZFBvb2wuaCBiL2luY2x1ZGUvbWVkaWEvU291bmRQb29sLmgKaW5kZXggMWIyMWEzNi4uZjU3MzEzYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9Tb3VuZFBvb2wuaAorKysgYi9pbmNsdWRlL21lZGlhL1NvdW5kUG9vbC5oCkBAIC0xNjcsNyArMTY3LDcgQEAKICAgICBmcmllbmQgY2xhc3MgU291bmRQb29sVGhyZWFkOwogICAgIGZyaWVuZCBjbGFzcyBTb3VuZENoYW5uZWw7CiBwdWJsaWM6Ci0gICAgU291bmRQb29sKGludCBtYXhDaGFubmVscywgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLCBpbnQgc3JjUXVhbGl0eSk7CisgICAgU291bmRQb29sKGludCBtYXhDaGFubmVscywgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcyk7CiAgICAgflNvdW5kUG9vbCgpOwogICAgIGludCBsb2FkKGNvbnN0IGNoYXIqIHVybCwgaW50IHByaW9yaXR5KTsKICAgICBpbnQgbG9hZChpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCwgaW50IHByaW9yaXR5KTsKQEAgLTE4Myw4ICsxODMsNyBAQAogICAgIHZvaWQgc2V0UHJpb3JpdHkoaW50IGNoYW5uZWxJRCwgaW50IHByaW9yaXR5KTsKICAgICB2b2lkIHNldExvb3AoaW50IGNoYW5uZWxJRCwgaW50IGxvb3ApOwogICAgIHZvaWQgc2V0UmF0ZShpbnQgY2hhbm5lbElELCBmbG9hdCByYXRlKTsKLSAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUoKSBjb25zdCB7IHJldHVybiBtU3RyZWFtVHlwZTsgfQotICAgIGludCBzcmNRdWFsaXR5KCkgY29uc3QgeyByZXR1cm4gbVNyY1F1YWxpdHk7IH0KKyAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIGF0dHJpYnV0ZXMoKSB7IHJldHVybiAmbUF0dHJpYnV0ZXM7IH0KIAogICAgIC8vIGNhbGxlZCBmcm9tIFNvdW5kUG9vbFRocmVhZAogICAgIHZvaWQgc2FtcGxlTG9hZGVkKGludCBzYW1wbGVJRCk7CkBAIC0yMjUsOCArMjI0LDcgQEAKICAgICBMaXN0PFNvdW5kQ2hhbm5lbCo+ICAgICBtU3RvcDsKICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8IGludCwgc3A8U2FtcGxlPiA+ICAgbVNhbXBsZXM7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbU1heENoYW5uZWxzOwotICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgICAgIG1TdHJlYW1UeXBlOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1TcmNRdWFsaXR5OworICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCAgICAgIG1BdHRyaWJ1dGVzOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1BbGxvY2F0ZWQ7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbU5leHRTYW1wbGVJRDsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtTmV4dENoYW5uZWxJRDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL1N0cmluZ0FycmF5LmggYi9pbmNsdWRlL21lZGlhL1N0cmluZ0FycmF5LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhL1N0cmluZ0FycmF5LmgKcmVuYW1lIHRvIGluY2x1ZGUvbWVkaWEvU3RyaW5nQXJyYXkuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmggYi9pbmNsdWRlL21lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuaAppbmRleCAxYWNmYWMzLi44NGI5ODQ2IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuaApAQCAtMjUsNiArMjUsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3N0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKIGNsYXNzIElNZWRpYVBsYXllclNlcnZpY2U7CiBjbGFzcyBJTWVkaWFNZXRhZGF0YVJldHJpZXZlcjsKIApAQCAtNjgsNiArNjksNyBAQAogICAgIHZvaWQgZGlzY29ubmVjdCgpOwogCiAgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCiAgICAgICAgICAgICBjb25zdCBjaGFyICpkYXRhU291cmNlVXJsLAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllci5oIGIvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllci5oCmluZGV4IDRjMDVmYzMuLjljYzIwOGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvbWVkaWFwbGF5ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL21lZGlhcGxheWVyLmgKQEAgLTE2MCw2ICsxNjAsOSBAQAogICAgIC8vIFBsYXliYWNrIHJhdGUgZXhwcmVzc2VkIGluIHBlcm1pbGxlICgxMDAwIGlzIG5vcm1hbCBzcGVlZCksIHNhdmVkIGFzIGludDMyX3QsIHdpdGggbmVnYXRpdmUKICAgICAvLyB2YWx1ZXMgdXNlZCBmb3IgcmV3aW5kaW5nIG9yIHJldmVyc2UgcGxheWJhY2suCiAgICAgS0VZX1BBUkFNRVRFUl9QTEFZQkFDS19SQVRFX1BFUk1JTExFID0gMTMwMCwgICAgICAgICAgICAgICAgLy8gc2V0IG9ubHkKKworICAgIC8vIFNldCBhIFBhcmNlbCBjb250YWluaW5nIHRoZSB2YWx1ZSBvZiBhIHBhcmNlbGxlZCBKYXZhIEF1ZGlvQXR0cmlidXRlIGluc3RhbmNlCisgICAgS0VZX1BBUkFNRVRFUl9BVURJT19BVFRSSUJVVEVTID0gMTQwMCAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IG9ubHkKIH07CiAKIC8vIEtlZXAgSU5WT0tFX0lEXyogaW4gc3luYyB3aXRoIE1lZGlhUGxheWVyLmphdmEuCkBAIC0xNzAsNiArMTczLDcgQEAKICAgICBJTlZPS0VfSURfU0VMRUNUX1RSQUNLID0gNCwKICAgICBJTlZPS0VfSURfVU5TRUxFQ1RfVFJBQ0sgPSA1LAogICAgIElOVk9LRV9JRF9TRVRfVklERU9fU0NBTElOR19NT0RFID0gNiwKKyAgICBJTlZPS0VfSURfR0VUX1NFTEVDVEVEX1RSQUNLID0gNwogfTsKIAogLy8gS2VlcCBNRURJQV9UUkFDS19UWVBFXyogaW4gc3luYyB3aXRoIE1lZGlhUGxheWVyLmphdmEuCkBAIC0xODksNiArMTkzLDggQEAKICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5KGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICpvYmopID0gMDsKIH07CiAKK3N0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKKwogY2xhc3MgTWVkaWFQbGF5ZXIgOiBwdWJsaWMgQm5NZWRpYVBsYXllckNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZpcnR1YWwgSU1lZGlhRGVhdGhOb3RpZmllcgogewpAQCAtMTk5LDYgKzIwNSw3IEBACiAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgZGlzY29ubmVjdCgpOwogCiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CiAKQEAgLTIyMCwxMyArMjI3LDE5IEBACiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0RHVyYXRpb24oaW50ICptc2VjKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICByZXNldCgpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHR5cGUpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90ICp0eXBlKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRMb29waW5nKGludCBsb29wKTsKICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICBpc0xvb3BpbmcoKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRWb2x1bWUoZmxvYXQgbGVmdFZvbHVtZSwgZmxvYXQgcmlnaHRWb2x1bWUpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIG5vdGlmeShpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqb2JqID0gTlVMTCk7Ci0gICAgc3RhdGljICBzdGF0dXNfdCAgICAgICAgZGVjb2RlKGNvbnN0IGNoYXIqIHVybCwgdWludDMyX3QgKnBTYW1wbGVSYXRlLCBpbnQqIHBOdW1DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwgc2l6ZV90ICpwU2l6ZSk7CisgICAgc3RhdGljICBzdGF0dXNfdCAgICAgICAgZGVjb2RlKAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVybCwKKyAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgIGludCogcE51bUNoYW5uZWxzLAorICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsCisgICAgICAgICAgICBzaXplX3QgKnBTaXplKTsKICAgICBzdGF0aWMgIHN0YXR1c190ICAgICAgICBkZWNvZGUoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgsIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBwTnVtQ2hhbm5lbHMsIGF1ZGlvX2Zvcm1hdF90KiBwRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsIHNpemVfdCAqcFNpemUpOwpAQCAtMjQyLDkgKzI1NSw2IEBACiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0UmV0cmFuc21pdEVuZHBvaW50KGNvbnN0IGNoYXIqIGFkZHJTdHJpbmcsIHVpbnQxNl90IHBvcnQpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldE5leHRNZWRpYVBsYXllcihjb25zdCBzcDxNZWRpYVBsYXllcj4mIHBsYXllcik7CiAKLSAgICAgICAgICAgIHN0YXR1c190IHVwZGF0ZVByb3h5Q29uZmlnKAotICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpob3N0LCBpbnQzMl90IHBvcnQsIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QpOwotCiBwcml2YXRlOgogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIGNsZWFyX2woKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZWVrVG9fbChpbnQgbXNlYyk7CkBAIC0yNTMsNiArMjYzLDcgQEAKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBhdHRhY2hOZXdQbGF5ZXIoY29uc3Qgc3A8SU1lZGlhUGxheWVyPiYgcGxheWVyKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICByZXNldF9sKCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZG9TZXRSZXRyYW5zbWl0RW5kcG9pbnQoY29uc3Qgc3A8SU1lZGlhUGxheWVyPiYgcGxheWVyKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBjaGVja1N0YXRlRm9yS2V5U2V0X2woaW50IGtleSk7CiAKICAgICBzcDxJTWVkaWFQbGF5ZXI+ICAgICAgICAgICAgbVBsYXllcjsKICAgICB0aHJlYWRfaWRfdCAgICAgICAgICAgICAgICAgbUxvY2tUaHJlYWRJZDsKQEAgLTI2Nyw2ICsyNzgsNyBAQAogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtUHJlcGFyZVN5bmM7CiAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgICAgIG1QcmVwYXJlU3RhdHVzOwogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgICAgICAgICBtU3RyZWFtVHlwZTsKKyAgICBQYXJjZWwqICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvQXR0cmlidXRlc1BhcmNlbDsKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbUxvb3A7CiAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgIG1MZWZ0Vm9sdW1lOwogICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICBtUmlnaHRWb2x1bWU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaCBiL2luY2x1ZGUvbWVkaWEvbWVkaWFyZWNvcmRlci5oCmluZGV4IDg4YTQyYTAuLmIwYTYyYTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvbWVkaWFyZWNvcmRlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvbWVkaWFyZWNvcmRlci5oCkBAIC0zOSw3ICszOSw3IEBACiBlbnVtIHZpZGVvX3NvdXJjZSB7CiAgICAgVklERU9fU09VUkNFX0RFRkFVTFQgPSAwLAogICAgIFZJREVPX1NPVVJDRV9DQU1FUkEgPSAxLAotICAgIFZJREVPX1NPVVJDRV9HUkFMTE9DX0JVRkZFUiA9IDIsCisgICAgVklERU9fU09VUkNFX1NVUkZBQ0UgPSAyLAogCiAgICAgVklERU9fU09VUkNFX0xJU1RfRU5EICAvLyBtdXN0IGJlIGxhc3QgLSB1c2VkIHRvIHZhbGlkYXRlIGF1ZGlvIHNvdXJjZSB0eXBlCiB9OwpAQCAtNjEsMTIgKzYxLDE4IEBACiAgICAgT1VUUFVUX0ZPUk1BVF9BQUNfQURJRiA9IDUsCiAgICAgT1VUUFVUX0ZPUk1BVF9BQUNfQURUUyA9IDYsCiAKKyAgICBPVVRQVVRfRk9STUFUX0FVRElPX09OTFlfRU5EID0gNywgLy8gVXNlZCBpbiB2YWxpZGF0aW5nIHRoZSBvdXRwdXQgZm9ybWF0LiAgU2hvdWxkIGJlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgYXQgdGhlIGVuZCBvZiB0aGUgYXVkaW8gb25seSBvdXRwdXQgZm9ybWF0cy4KKwogICAgIC8qIFN0cmVhbSBvdmVyIGEgc29ja2V0LCBsaW1pdGVkIHRvIGEgc2luZ2xlIHN0cmVhbSAqLwogICAgIE9VVFBVVF9GT1JNQVRfUlRQX0FWUCA9IDcsCiAKICAgICAvKiBILjI2NC9BQUMgZGF0YSBlbmNhcHN1bGF0ZWQgaW4gTVBFRzIvVFMgKi8KICAgICBPVVRQVVRfRk9STUFUX01QRUcyVFMgPSA4LAogCisgICAgLyogVlA4L1ZPUkJJUyBkYXRhIGluIGEgV0VCTSBjb250YWluZXIgKi8KKyAgICBPVVRQVVRfRk9STUFUX1dFQk0gPSA5LAorCiAgICAgT1VUUFVUX0ZPUk1BVF9MSVNUX0VORCAvLyBtdXN0IGJlIGxhc3QgLSB1c2VkIHRvIHZhbGlkYXRlIGZvcm1hdCB0eXBlCiB9OwogCkBAIC03Nyw2ICs4Myw3IEBACiAgICAgQVVESU9fRU5DT0RFUl9BQUMgPSAzLAogICAgIEFVRElPX0VOQ09ERVJfSEVfQUFDID0gNCwKICAgICBBVURJT19FTkNPREVSX0FBQ19FTEQgPSA1LAorICAgIEFVRElPX0VOQ09ERVJfVk9SQklTID0gNiwKIAogICAgIEFVRElPX0VOQ09ERVJfTElTVF9FTkQgLy8gbXVzdCBiZSB0aGUgbGFzdCAtIHVzZWQgdG8gdmFsaWRhdGUgdGhlIGF1ZGlvIGVuY29kZXIgdHlwZQogfTsKQEAgLTg2LDYgKzkzLDcgQEAKICAgICBWSURFT19FTkNPREVSX0gyNjMgPSAxLAogICAgIFZJREVPX0VOQ09ERVJfSDI2NCA9IDIsCiAgICAgVklERU9fRU5DT0RFUl9NUEVHXzRfU1AgPSAzLAorICAgIFZJREVPX0VOQ09ERVJfVlA4ID0gNCwKIAogICAgIFZJREVPX0VOQ09ERVJfTElTVF9FTkQgLy8gbXVzdCBiZSB0aGUgbGFzdCAtIHVzZWQgdG8gdmFsaWRhdGUgdGhlIHZpZGVvIGVuY29kZXIgdHlwZQogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbWVkaWFzY2FubmVyLmggYi9pbmNsdWRlL21lZGlhL21lZGlhc2Nhbm5lci5oCmluZGV4IGE3MzQwM2IuLmQ1NTUyNzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvbWVkaWFzY2FubmVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9tZWRpYXNjYW5uZXIuaApAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KICNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHB0aHJlYWQuaD4KIAogc3RydWN0IGRpcmVudDsKQEAgLTI5LDYgKzMwLDcgQEAKIAogY2xhc3MgTWVkaWFTY2FubmVyQ2xpZW50OwogY2xhc3MgU3RyaW5nQXJyYXk7CitjbGFzcyBDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yOwogCiBlbnVtIE1lZGlhU2NhblJlc3VsdCB7CiAgICAgLy8gVGhpcyBmaWxlIG9yIGRpcmVjdG9yeSB3YXMgc2Nhbm5lZCBzdWNjZXNzZnVsbHkuCkBAIC00MSw2ICs0MywzMSBAQAogICAgIE1FRElBX1NDQU5fUkVTVUxUX0VSUk9SLAogfTsKIAorc3RydWN0IE1lZGlhQWxidW1BcnQgeworcHVibGljOgorICAgIHN0YXRpYyBNZWRpYUFsYnVtQXJ0ICpmcm9tRGF0YShpbnQzMl90IHNpemUsIGNvbnN0IHZvaWQqIGRhdGEpOworCisgICAgc3RhdGljIHZvaWQgaW5pdChNZWRpYUFsYnVtQXJ0KiBpbnN0YW5jZSwgaW50MzJfdCBzaXplLCBjb25zdCB2b2lkKiBkYXRhKTsKKworICAgIE1lZGlhQWxidW1BcnQgKmNsb25lKCk7CisKKyAgICBjb25zdCBjaGFyICpkYXRhKCkgeworICAgICAgICByZXR1cm4gJm1EYXRhWzBdOworICAgIH0KKworICAgIGludDMyX3Qgc2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1TaXplOworICAgIH0KKworcHJpdmF0ZToKKyAgICBpbnQzMl90IG1TaXplOworICAgIGNoYXIgbURhdGFbXTsKKworICAgIC8vIFlvdSBjYW4ndCBjb25zdHJ1Y3QgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgZGlyZWN0bHkgYmVjYXVzZSB0aGlzIGlzIGEKKyAgICAvLyB2YXJpYWJsZS1zaXplZCBvYmplY3QgcGFzc2VkIHRocm91Z2ggdGhlIGJpbmRlci4KKyAgICBNZWRpYUFsYnVtQXJ0KCk7Cit9IF9fcGFja2VkOworCiBzdHJ1Y3QgTWVkaWFTY2FubmVyIHsKICAgICBNZWRpYVNjYW5uZXIoKTsKICAgICB2aXJ0dWFsIH5NZWRpYVNjYW5uZXIoKTsKQEAgLTUzLDggKzgwLDcgQEAKIAogICAgIHZvaWQgc2V0TG9jYWxlKGNvbnN0IGNoYXIgKmxvY2FsZSk7CiAKLSAgICAvLyBleHRyYWN0cyBhbGJ1bSBhcnQgYXMgYSBibG9jayBvZiBkYXRhCi0gICAgdmlydHVhbCBjaGFyICpleHRyYWN0QWxidW1BcnQoaW50IGZkKSA9IDA7CisgICAgdmlydHVhbCBNZWRpYUFsYnVtQXJ0ICpleHRyYWN0QWxidW1BcnQoaW50IGZkKSA9IDA7CiAKIHByb3RlY3RlZDoKICAgICBjb25zdCBjaGFyICpsb2NhbGUoKSBjb25zdDsKQEAgLTk0LDE1ICsxMjAsOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWltZVR5cGUoY29uc3QgY2hhciogbWltZVR5cGUpID0gMDsKIAogcHJvdGVjdGVkOgotICAgIHZvaWQgY29udmVydFZhbHVlcyh1aW50MzJfdCBlbmNvZGluZyk7Ci0KLXByb3RlY3RlZDoKLSAgICAvLyBjYWNoZWQgbmFtZSBhbmQgdmFsdWUgc3RyaW5ncywgZm9yIG5hdGl2ZSBlbmNvZGluZyBzdXBwb3J0LgotICAgIFN0cmluZ0FycmF5KiAgICBtTmFtZXM7Ci0gICAgU3RyaW5nQXJyYXkqICAgIG1WYWx1ZXM7Ci0KLSAgICAvLyBkZWZhdWx0IGVuY29kaW5nIGJhc2VkIG9uIE1lZGlhU2Nhbm5lcjo6bUxvY2FsZSBzdHJpbmcKLSAgICB1aW50MzJfdCAgICAgICAgbUxvY2FsZUVuY29kaW5nOworICAgIC8vIGRlZmF1bHQgZW5jb2RpbmcgZnJvbSBNZWRpYVNjYW5uZXI6Om1Mb2NhbGUKKyAgICBTdHJpbmc4IG1Mb2NhbGU7CiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UuaAppbmRleCAyYzRhYWZmLi5iMTZlMjBhIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UuaApAQCAtMjcsNyArMjcsNyBAQAogY2xhc3MgQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZSA6IHB1YmxpYyBOQkFJT19Tb3VyY2UgewogCiBwdWJsaWM6Ci0gICAgQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZShBdWRpb0J1ZmZlclByb3ZpZGVyICpwcm92aWRlciwgTkJBSU9fRm9ybWF0IGZvcm1hdCk7CisgICAgQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZShBdWRpb0J1ZmZlclByb3ZpZGVyICpwcm92aWRlciwgY29uc3QgTkJBSU9fRm9ybWF0JiBmb3JtYXQpOwogICAgIHZpcnR1YWwgfkF1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UoKTsKIAogICAgIC8vIE5CQUlPX1BvcnQgaW50ZXJmYWNlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtSW5Tb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1JblNvdXJjZS5oCmluZGV4IDA3ZDhjODkuLjUxNjlmMWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1JblNvdXJjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1JblNvdXJjZS5oCkBAIC00Myw5ICs0Myw5IEBACiAKICAgICAvLyBUaGlzIGlzIGFuIG92ZXItZXN0aW1hdGUsIGFuZCBjb3VsZCBkdXBlIHRoZSBjYWxsZXIgaW50byBtYWtpbmcgYSBibG9ja2luZyByZWFkKCkKICAgICAvLyBGSVhNRSBVc2UgYW4gYXVkaW8gSEFMIEFQSSB0byBxdWVyeSB0aGUgYnVmZmVyIGZpbGxpbmcgc3RhdHVzIHdoZW4gaXQncyBhdmFpbGFibGUuCi0gICAgdmlydHVhbCBzc2l6ZV90IGF2YWlsYWJsZVRvUmVhZCgpIHsgcmV0dXJuIG1TdHJlYW1CdWZmZXJTaXplQnl0ZXMgPj4gbUJpdFNoaWZ0OyB9CisgICAgdmlydHVhbCBzc2l6ZV90IGF2YWlsYWJsZVRvUmVhZCgpIHsgcmV0dXJuIG1TdHJlYW1CdWZmZXJTaXplQnl0ZXMgLyBtRnJhbWVTaXplOyB9CiAKLSAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBjb3VudCk7CisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgY291bnQsIGludDY0X3QgcmVhZFBUUyk7CiAKICAgICAvLyBOQkFJT19TaW5rIGVuZAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuaAppbmRleCA3OTQ4ZDQwLi45OTQ5Yjg4IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5oCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmgKQEAgLTQzLDcgKzQzLDcgQEAKIAogICAgIC8vIFRoaXMgaXMgYW4gb3Zlci1lc3RpbWF0ZSwgYW5kIGNvdWxkIGR1cGUgdGhlIGNhbGxlciBpbnRvIG1ha2luZyBhIGJsb2NraW5nIHdyaXRlKCkKICAgICAvLyBGSVhNRSBVc2UgYW4gYXVkaW8gSEFMIEFQSSB0byBxdWVyeSB0aGUgYnVmZmVyIGVtcHR5aW5nIHN0YXR1cyB3aGVuIGl0J3MgYXZhaWxhYmxlLgotICAgIHZpcnR1YWwgc3NpemVfdCBhdmFpbGFibGVUb1dyaXRlKCkgY29uc3QgeyByZXR1cm4gbVN0cmVhbUJ1ZmZlclNpemVCeXRlcyA+PiBtQml0U2hpZnQ7IH0KKyAgICB2aXJ0dWFsIHNzaXplX3QgYXZhaWxhYmxlVG9Xcml0ZSgpIGNvbnN0IHsgcmV0dXJuIG1TdHJlYW1CdWZmZXJTaXplQnl0ZXMgLyBtRnJhbWVTaXplOyB9CiAKICAgICB2aXJ0dWFsIHNzaXplX3Qgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgY291bnQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL01vbm9QaXBlLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL01vbm9QaXBlLmgKaW5kZXggZDM4MDJmZS4uYjA5YjM1ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9uYmFpby9Nb25vUGlwZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTW9ub1BpcGUuaApAQCAtNDEsNyArNDEsNyBAQAogICAgIC8vIE5vdGU6IHdoYXRldmVyIHNoYXJlcyB0aGlzIG9iamVjdCB3aXRoIGFub3RoZXIgdGhyZWFkIG5lZWRzIHRvIGRvIHNvIGluIGFuIFNNUC1zYWZlIHdheSAobGlrZQogICAgIC8vIGNyZWF0aW5nIGl0IHRoZSBvYmplY3QgYmVmb3JlIGNyZWF0aW5nIHRoZSBvdGhlciB0aHJlYWQsIG9yIHN0b3JpbmcgdGhlIG9iamVjdCB3aXRoIGEKICAgICAvLyByZWxlYXNlX3N0b3JlKS4gT3RoZXJ3aXNlIHRoZSBvdGhlciB0aHJlYWQgY291bGQgc2VlIGEgcGFydGlhbGx5LWNvbnN0cnVjdGVkIG9iamVjdC4KLSAgICBNb25vUGlwZShzaXplX3QgcmVxRnJhbWVzLCBOQkFJT19Gb3JtYXQgZm9ybWF0LCBib29sIHdyaXRlQ2FuQmxvY2sgPSBmYWxzZSk7CisgICAgTW9ub1BpcGUoc2l6ZV90IHJlcUZyYW1lcywgY29uc3QgTkJBSU9fRm9ybWF0JiBmb3JtYXQsIGJvb2wgd3JpdGVDYW5CbG9jayA9IGZhbHNlKTsKICAgICB2aXJ0dWFsIH5Nb25vUGlwZSgpOwogCiAgICAgLy8gTkJBSU9fUG9ydCBpbnRlcmZhY2UKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJBSU8uaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJBSU8uaAppbmRleCAxZGEwYzczLi5kNDIyNTc2IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL25iYWlvL05CQUlPLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9OQkFJTy5oCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVGltZXN0YW1wLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNTIsMzEgKzUzLDQxIEBACiAvLyB0aGUgY29tYmluYXRpb25zIHRoYXQgYXJlIGFjdHVhbGx5IG5lZWRlZCB3aXRoaW4gQXVkaW9GbGluZ2VyLiAgSWYgdGhlIGxpc3Qgb2YgY29tYmluYXRpb25zIGdyb3dzCiAvLyB0b28gbGFyZ2UsIHRoZW4gdGhpcyBkZWNpc2lvbiBzaG91bGQgYmUgcmUtdmlzaXRlZC4KIC8vIFNhbXBsZSByYXRlIGFuZCBjaGFubmVsIGNvdW50IGFyZSBleHBsaWNpdCwgUENNIGludGVybGVhdmVkIDE2LWJpdCBpcyBhc3N1bWVkLgotdHlwZWRlZiB1bnNpZ25lZCBOQkFJT19Gb3JtYXQ7Ci1lbnVtIHsKLSAgICBGb3JtYXRfSW52YWxpZAorc3RydWN0IE5CQUlPX0Zvcm1hdCB7CisvLyBGSVhNRSBtYWtlIHRoaXMgYSBjbGFzcywgYW5kIGNoYW5nZSBGb3JtYXRfLi4uIGdsb2JhbCBtZXRob2RzIHRvIGNsYXNzIG1ldGhvZHMKKy8vcHJpdmF0ZToKKyAgICB1bnNpZ25lZCAgICBtU2FtcGxlUmF0ZTsKKyAgICB1bnNpZ25lZCAgICBtQ2hhbm5lbENvdW50OworICAgIGF1ZGlvX2Zvcm1hdF90ICBtRm9ybWF0OworICAgIHNpemVfdCAgICAgIG1GcmFtZVNpemU7CiB9OwogCi0vLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgb2YgYW4gTkJBSU9fRm9ybWF0IGluIGJ5dGVzCi1zaXplX3QgRm9ybWF0X2ZyYW1lU2l6ZShOQkFJT19Gb3JtYXQgZm9ybWF0KTsKK2V4dGVybiBjb25zdCBOQkFJT19Gb3JtYXQgRm9ybWF0X0ludmFsaWQ7CiAKLS8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSBvZiBhbiBOQkFJT19Gb3JtYXQgYXMgYSBiaXQgc2hpZnQKLXNpemVfdCBGb3JtYXRfZnJhbWVCaXRTaGlmdChOQkFJT19Gb3JtYXQgZm9ybWF0KTsKKy8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSBvZiBhbiBOQkFJT19Gb3JtYXQgaW4gYnl0ZXMKK3NpemVfdCBGb3JtYXRfZnJhbWVTaXplKGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0KTsKIAogLy8gQ29udmVydCBhIHNhbXBsZSByYXRlIGluIEh6IGFuZCBjaGFubmVsIGNvdW50IHRvIGFuIE5CQUlPX0Zvcm1hdAotTkJBSU9fRm9ybWF0IEZvcm1hdF9mcm9tX1NSX0ModW5zaWduZWQgc2FtcGxlUmF0ZSwgdW5zaWduZWQgY2hhbm5lbENvdW50KTsKKy8vIEZJWE1FIHJlbmFtZQorTkJBSU9fRm9ybWF0IEZvcm1hdF9mcm9tX1NSX0ModW5zaWduZWQgc2FtcGxlUmF0ZSwgdW5zaWduZWQgY2hhbm5lbENvdW50LCBhdWRpb19mb3JtYXRfdCBmb3JtYXQpOwogCiAvLyBSZXR1cm4gdGhlIHNhbXBsZSByYXRlIGluIEh6IG9mIGFuIE5CQUlPX0Zvcm1hdAotdW5zaWduZWQgRm9ybWF0X3NhbXBsZVJhdGUoTkJBSU9fRm9ybWF0IGZvcm1hdCk7Cit1bnNpZ25lZCBGb3JtYXRfc2FtcGxlUmF0ZShjb25zdCBOQkFJT19Gb3JtYXQmIGZvcm1hdCk7CiAKIC8vIFJldHVybiB0aGUgY2hhbm5lbCBjb3VudCBvZiBhbiBOQkFJT19Gb3JtYXQKLXVuc2lnbmVkIEZvcm1hdF9jaGFubmVsQ291bnQoTkJBSU9fRm9ybWF0IGZvcm1hdCk7Cit1bnNpZ25lZCBGb3JtYXRfY2hhbm5lbENvdW50KGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0KTsKIAogLy8gQ2FsbGJhY2tzIHVzZWQgYnkgTkJBSU9fU2luazo6d3JpdGVWaWEoKSBhbmQgTkJBSU9fU291cmNlOjpyZWFkVmlhKCkgYmVsb3cuCiB0eXBlZGVmIHNzaXplX3QgKCp3cml0ZVZpYV90KSh2b2lkICp1c2VyLCB2b2lkICpidWZmZXIsIHNpemVfdCBjb3VudCk7CiB0eXBlZGVmIHNzaXplX3QgKCpyZWFkVmlhX3QpKHZvaWQgKnVzZXIsIGNvbnN0IHZvaWQgKmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNvdW50LCBpbnQ2NF90IHJlYWRQVFMpOwogCisvLyBDaGVjayB3aGV0aGVyIGFuIE5CQUlPX0Zvcm1hdCBpcyB2YWxpZAorYm9vbCBGb3JtYXRfaXNWYWxpZChjb25zdCBOQkFJT19Gb3JtYXQmIGZvcm1hdCk7CisKKy8vIENvbXBhcmUgdHdvIE5CQUlPX0Zvcm1hdCB2YWx1ZXMKK2Jvb2wgRm9ybWF0X2lzRXF1YWwoY29uc3QgTkJBSU9fRm9ybWF0JiBmb3JtYXQxLCBjb25zdCBOQkFJT19Gb3JtYXQmIGZvcm1hdDIpOworCiAvLyBBYnN0cmFjdCBjbGFzcyAoaW50ZXJmYWNlKSByZXByZXNlbnRpbmcgYSBkYXRhIHBvcnQuCiBjbGFzcyBOQkFJT19Qb3J0IDogcHVibGljIFJlZkJhc2UgewogCkBAIC0xMTUsMTUgKzEyNiwxNSBAQAogICAgIHZpcnR1YWwgTkJBSU9fRm9ybWF0IGZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIG1OZWdvdGlhdGVkID8gbUZvcm1hdCA6IEZvcm1hdF9JbnZhbGlkOyB9CiAKIHByb3RlY3RlZDoKLSAgICBOQkFJT19Qb3J0KE5CQUlPX0Zvcm1hdCBmb3JtYXQpIDogbU5lZ290aWF0ZWQoZmFsc2UpLCBtRm9ybWF0KGZvcm1hdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CaXRTaGlmdChGb3JtYXRfZnJhbWVCaXRTaGlmdChmb3JtYXQpKSB7IH0KKyAgICBOQkFJT19Qb3J0KGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0KSA6IG1OZWdvdGlhdGVkKGZhbHNlKSwgbUZvcm1hdChmb3JtYXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lU2l6ZShGb3JtYXRfZnJhbWVTaXplKGZvcm1hdCkpIHsgfQogICAgIHZpcnR1YWwgfk5CQUlPX1BvcnQoKSB7IH0KIAogICAgIC8vIEltcGxlbWVudGF0aW9ucyBhcmUgZnJlZSB0byBpZ25vcmUgdGhlc2UgaWYgdGhleSBkb24ndCBuZWVkIHRoZW0KIAogICAgIGJvb2wgICAgICAgICAgICBtTmVnb3RpYXRlZDsgICAgLy8gbU5lZ290aWF0ZWQgaW1wbGllcyAobUZvcm1hdCAhPSBGb3JtYXRfSW52YWxpZCkKICAgICBOQkFJT19Gb3JtYXQgICAgbUZvcm1hdDsgICAgICAgIC8vIChtRm9ybWF0ICE9IEZvcm1hdF9JbnZhbGlkKSBkb2VzIG5vdCBpbXBseSBtTmVnb3RpYXRlZAotICAgIHNpemVfdCAgICAgICAgICBtQml0U2hpZnQ7ICAgICAgLy8gYXNzaWduIGluIHBhcmFsbGVsIHdpdGggYW55IGFzc2lnbm1lbnQgdG8gbUZvcm1hdAorICAgIHNpemVfdCAgICAgICAgICBtRnJhbWVTaXplOyAgICAgLy8gYXNzaWduIGluIHBhcmFsbGVsIHdpdGggYW55IGFzc2lnbm1lbnQgdG8gbUZvcm1hdAogfTsKIAogLy8gQWJzdHJhY3QgY2xhc3MgKGludGVyZmFjZSkgcmVwcmVzZW50aW5nIGEgbm9uLWJsb2NraW5nIGRhdGEgc2luaywgZm9yIHVzZSBieSBhIGRhdGEgcHJvdmlkZXIuCkBAIC0yMTYsMTEgKzIyNywxMSBAQAogCiAgICAgLy8gUmV0dXJucyBOT19FUlJPUiBpZiBhIHRpbWVzdGFtcCBpcyBhdmFpbGFibGUuICBUaGUgdGltZXN0YW1wIGluY2x1ZGVzIHRoZSB0b3RhbCBudW1iZXIKICAgICAvLyBvZiBmcmFtZXMgcHJlc2VudGVkIHRvIGFuIGV4dGVybmFsIG9ic2VydmVyLCB0b2dldGhlciB3aXRoIHRoZSB2YWx1ZSBvZiBDTE9DS19NT05PVE9OSUMKLSAgICAvLyBhcyBvZiB0aGlzIHByZXNlbnRhdGlvbiBjb3VudC4KKyAgICAvLyBhcyBvZiB0aGlzIHByZXNlbnRhdGlvbiBjb3VudC4gIFRoZSB0aW1lc3RhbXAgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCBpZiBlcnJvciBpcyByZXR1cm5lZC4KICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKSB7IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsgfQogCiBwcm90ZWN0ZWQ6Ci0gICAgTkJBSU9fU2luayhOQkFJT19Gb3JtYXQgZm9ybWF0ID0gRm9ybWF0X0ludmFsaWQpIDogTkJBSU9fUG9ydChmb3JtYXQpLCBtRnJhbWVzV3JpdHRlbigwKSB7IH0KKyAgICBOQkFJT19TaW5rKGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0ID0gRm9ybWF0X0ludmFsaWQpIDogTkJBSU9fUG9ydChmb3JtYXQpLCBtRnJhbWVzV3JpdHRlbigwKSB7IH0KICAgICB2aXJ0dWFsIH5OQkFJT19TaW5rKCkgeyB9CiAKICAgICAvLyBJbXBsZW1lbnRhdGlvbnMgYXJlIGZyZWUgdG8gaWdub3JlIHRoZXNlIGlmIHRoZXkgZG9uJ3QgbmVlZCB0aGVtCkBAIC0zMTEsNyArMzIyLDcgQEAKICAgICB2aXJ0dWFsIHZvaWQgICAgb25UaW1lc3RhbXAoY29uc3QgQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCkgeyB9CiAKIHByb3RlY3RlZDoKLSAgICBOQkFJT19Tb3VyY2UoTkJBSU9fRm9ybWF0IGZvcm1hdCA9IEZvcm1hdF9JbnZhbGlkKSA6IE5CQUlPX1BvcnQoZm9ybWF0KSwgbUZyYW1lc1JlYWQoMCkgeyB9CisgICAgTkJBSU9fU291cmNlKGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0ID0gRm9ybWF0X0ludmFsaWQpIDogTkJBSU9fUG9ydChmb3JtYXQpLCBtRnJhbWVzUmVhZCgwKSB7IH0KICAgICB2aXJ0dWFsIH5OQkFJT19Tb3VyY2UoKSB7IH0KIAogICAgIC8vIEltcGxlbWVudGF0aW9ucyBhcmUgZnJlZSB0byBpZ25vcmUgdGhlc2UgaWYgdGhleSBkb24ndCBuZWVkIHRoZW0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJMb2cuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJMb2cuaAppbmRleCA2ZDU5ZWE3Li5iY2JiYzA0IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL25iYWlvL05CTG9nLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9OQkxvZy5oCkBAIC0yNSw2ICsyNSw4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorY2xhc3MgU3RyaW5nODsKKwogY2xhc3MgTkJMb2cgewogCiBwdWJsaWM6CkBAIC0xODcsNiArMTg5LDEwIEBACiAgICAgY29uc3QgU2hhcmVkKiBjb25zdCBtU2hhcmVkOyAvLyByYXcgcG9pbnRlciB0byBzaGFyZWQgbWVtb3J5CiAgICAgY29uc3Qgc3A8SU1lbW9yeT4gbUlNZW1vcnk7IC8vIHJlZi1jb3VudGVkIHZlcnNpb24KICAgICBpbnQzMl90ICAgICBtRnJvbnQ7ICAgICAgICAgLy8gaW5kZXggb2Ygb2xkZXN0IGFja25vd2xlZGdlZCBFbnRyeQorICAgIGludCAgICAgbUZkOyAgICAgICAgICAgICAgICAvLyBmaWxlIGRlc2NyaXB0b3IKKyAgICBpbnQgICAgIG1JbmRlbnQ7ICAgICAgICAgICAgLy8gaW5kZW50YXRpb24gbGV2ZWwKKworICAgIHZvaWQgICAgZHVtcExpbmUoY29uc3QgU3RyaW5nOCYgdGltZXN0YW1wLCBTdHJpbmc4JiBib2R5KTsKIAogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1NxdWFzaFRpbWVzdGFtcCA9IDU7IC8vIHNxdWFzaCB0aGlzIG1hbnkgb3IgbW9yZSBhZGphY2VudCB0aW1lc3RhbXBzCiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGUuaAppbmRleCA3OWE0ZWVlLi5lYmEzN2JjIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGUuaAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGUuaApAQCAtMzAsNyArMzAsMTEgQEAKIAogcHVibGljOgogICAgIC8vIG1heEZyYW1lcyB3aWxsIGJlIHJvdW5kZWQgdXAgdG8gYSBwb3dlciBvZiAyLCBhbmQgYWxsIHNsb3RzIGFyZSBhdmFpbGFibGUuIE11c3QgYmUgPj0gMi4KLSAgICBQaXBlKHNpemVfdCBtYXhGcmFtZXMsIE5CQUlPX0Zvcm1hdCBmb3JtYXQpOworICAgIC8vIGJ1ZmZlciBpcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgc3BlY2lmeWluZyB0aGUgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBwaXBlIGJ1ZmZlciwKKyAgICAvLyB3aGljaCBtdXN0IGJlIG9mIHNpemUgcm91bmR1cChtYXhGcmFtZXMpICogRm9ybWF0X2ZyYW1lU2l6ZShmb3JtYXQpIGJ5dGVzLgorICAgIFBpcGUoc2l6ZV90IG1heEZyYW1lcywgY29uc3QgTkJBSU9fRm9ybWF0JiBmb3JtYXQsIHZvaWQgKmJ1ZmZlciA9IE5VTEwpOworCisgICAgLy8gSWYgYSBidWZmZXIgd2FzIHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3IsIGl0IGlzIG5vdCBhdXRvbWF0aWNhbGx5IGZyZWVkIGJ5IGRlc3RydWN0b3IuCiAgICAgdmlydHVhbCB+UGlwZSgpOwogCiAgICAgLy8gTkJBSU9fUG9ydCBpbnRlcmZhY2UKQEAgLTU3LDYgKzYxLDcgQEAKICAgICB2b2lkICogY29uc3QgICAgbUJ1ZmZlcjsKICAgICB2b2xhdGlsZSBpbnQzMl90IG1SZWFyOyAgICAgICAgIC8vIHdyaXR0ZW4gYnkgYW5kcm9pZF9hdG9taWNfcmVsZWFzZV9zdG9yZQogICAgIHZvbGF0aWxlIGludDMyX3QgbVJlYWRlcnM7ICAgICAgLy8gbnVtYmVyIG9mIFBpcGVSZWFkZXIgY2xpZW50cyBjdXJyZW50bHkgYXR0YWNoZWQgdG8gdGhpcyBQaXBlCisgICAgY29uc3QgYm9vbCAgICAgIG1GcmVlQnVmZmVySW5EZXN0cnVjdG9yOwogfTsKIAogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL1NvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5oCmluZGV4IGNkZmI2ZmUuLmRhZjZiYzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5oCkBAIC00MSw3ICs0MSw3IEBACiAKIHByaXZhdGU6CiAgICAgY29uc3Qgc3A8TkJBSU9fU291cmNlPiBtU291cmNlOyAgICAgLy8gdGhlIHdyYXBwZWQgc291cmNlCi0gICAgLypjb25zdCovIHNpemVfdCAgICBtRnJhbWVCaXRTaGlmdDsgLy8gbG9nMihmcmFtZSBzaXplIGluIGJ5dGVzKQorICAgIC8qY29uc3QqLyBzaXplX3QgICAgbUZyYW1lU2l6ZTsgLy8gZnJhbWUgc2l6ZSBpbiBieXRlcwogICAgIHZvaWQqICAgICAgICAgICAgICAgbUFsbG9jYXRlZDsgLy8gcG9pbnRlciB0byBiYXNlIG9mIGFsbG9jYXRlZCBtZW1vcnkKICAgICBzaXplX3QgICAgICAgICAgICAgIG1TaXplOyAgICAgIC8vIHNpemUgb2YgbUFsbG9jYXRlZCBpbiBmcmFtZXMKICAgICBzaXplX3QgICAgICAgICAgICAgIG1PZmZzZXQ7ICAgIC8vIGZyYW1lIG9mZnNldCB3aXRoaW4gbUFsbG9jYXRlZCBvZiB2YWxpZCBkYXRhCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaAppbmRleCA5YjUzNGU3Li5hMGU1ZDg0IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmgKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxhbmRyb2lkL25hdGl2ZV93aW5kb3cuaD4KICNpbmNsdWRlIDxtZWRpYS9JT01YLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU2tpcEN1dEJ1ZmZlci5oPgogI2luY2x1ZGUgPE9NWF9BdWRpby5oPgogCkBAIC0zMSw0NSArMzIsMzQgQEAKIAogc3RydWN0IEFCdWZmZXI7CiBzdHJ1Y3QgTWVtb3J5RGVhbGVyOworc3RydWN0IERlc2NyaWJlQ29sb3JGb3JtYXRQYXJhbXM7CiAKLXN0cnVjdCBBQ29kZWMgOiBwdWJsaWMgQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZSB7Ci0gICAgZW51bSB7Ci0gICAgICAgIGtXaGF0RmlsbFRoaXNCdWZmZXIgICAgICA9ICdmaWxsJywKLSAgICAgICAga1doYXREcmFpblRoaXNCdWZmZXIgICAgID0gJ2RyYWknLAotICAgICAgICBrV2hhdEVPUyAgICAgICAgICAgICAgICAgPSAnZW9zICcsCi0gICAgICAgIGtXaGF0U2h1dGRvd25Db21wbGV0ZWQgICA9ICdzY29tJywKLSAgICAgICAga1doYXRGbHVzaENvbXBsZXRlZCAgICAgID0gJ2Zjb20nLAotICAgICAgICBrV2hhdE91dHB1dEZvcm1hdENoYW5nZWQgPSAnb3V0QycsCi0gICAgICAgIGtXaGF0RXJyb3IgICAgICAgICAgICAgICA9ICdlcnJvJywKLSAgICAgICAga1doYXRDb21wb25lbnRBbGxvY2F0ZWQgID0gJ2NBbGwnLAotICAgICAgICBrV2hhdENvbXBvbmVudENvbmZpZ3VyZWQgPSAnY0NvbicsCi0gICAgICAgIGtXaGF0SW5wdXRTdXJmYWNlQ3JlYXRlZCA9ICdpc2ZjJywKLSAgICAgICAga1doYXRTaWduYWxlZElucHV0RU9TICAgID0gJ3Nlb3MnLAotICAgICAgICBrV2hhdEJ1ZmZlcnNBbGxvY2F0ZWQgICAgPSAnYWxsYycsCi0gICAgICAgIGtXaGF0T01YRGllZCAgICAgICAgICAgICA9ICdPTVhkJywKLSAgICB9OwotCitzdHJ1Y3QgQUNvZGVjIDogcHVibGljIEFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUsIHB1YmxpYyBDb2RlY0Jhc2UgewogICAgIEFDb2RlYygpOwogCi0gICAgdm9pZCBzZXROb3RpZmljYXRpb25NZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Tm90aWZpY2F0aW9uTWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKICAgICB2b2lkIGluaXRpYXRlU2V0dXAoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwotICAgIHZvaWQgc2lnbmFsRmx1c2goKTsKLSAgICB2b2lkIHNpZ25hbFJlc3VtZSgpOwotICAgIHZvaWQgaW5pdGlhdGVTaHV0ZG93bihib29sIGtlZXBDb21wb25lbnRBbGxvY2F0ZWQgPSBmYWxzZSk7CiAKLSAgICB2b2lkIHNpZ25hbFNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwotICAgIHZvaWQgc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZUFsbG9jYXRlQ29tcG9uZW50KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVDb25maWd1cmVDb21wb25lbnQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZUNyZWF0ZUlucHV0U3VyZmFjZSgpOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZVN0YXJ0KCk7CisgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlU2h1dGRvd24oYm9vbCBrZWVwQ29tcG9uZW50QWxsb2NhdGVkID0gZmFsc2UpOwogCi0gICAgdm9pZCBpbml0aWF0ZUFsbG9jYXRlQ29tcG9uZW50KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKLSAgICB2b2lkIGluaXRpYXRlQ29uZmlndXJlQ29tcG9uZW50KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKLSAgICB2b2lkIGluaXRpYXRlQ3JlYXRlSW5wdXRTdXJmYWNlKCk7Ci0gICAgdm9pZCBpbml0aWF0ZVN0YXJ0KCk7CisgICAgdmlydHVhbCB2b2lkIHNpZ25hbEZsdXNoKCk7CisgICAgdmlydHVhbCB2b2lkIHNpZ25hbFJlc3VtZSgpOwogCi0gICAgdm9pZCBzaWduYWxSZXF1ZXN0SURSRnJhbWUoKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsU2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdmlydHVhbCB2b2lkIHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsUmVxdWVzdElEUkZyYW1lKCk7CiAKLSAgICBib29sIGlzQ29uZmlndXJlZEZvckFkYXB0aXZlUGxheWJhY2soKSB7IHJldHVybiBtSXNDb25maWd1cmVkRm9yQWRhcHRpdmVQbGF5YmFjazsgfQorICAgIC8vIEFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUgaW1wbGVtZW50cyB0aGUgbWVzc2FnZSBoYW5kbGluZworICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgICAgICBoYW5kbGVNZXNzYWdlKG1zZyk7CisgICAgfQogCi0gICAgc3RydWN0IFBvcnREZXNjcmlwdGlvbiA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBzdHJ1Y3QgUG9ydERlc2NyaXB0aW9uIDogcHVibGljIENvZGVjQmFzZTo6UG9ydERlc2NyaXB0aW9uIHsKICAgICAgICAgc2l6ZV90IGNvdW50QnVmZmVycygpOwogICAgICAgICBJT01YOjpidWZmZXJfaWQgYnVmZmVySURBdChzaXplX3QgaW5kZXgpIGNvbnN0OwogICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXJBdChzaXplX3QgaW5kZXgpIGNvbnN0OwpAQCAtODYsNiArNzYsMTYgQEAKICAgICAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUG9ydERlc2NyaXB0aW9uKTsKICAgICB9OwogCisgICAgc3RhdGljIGJvb2wgaXNGbGV4aWJsZUNvbG9yRm9ybWF0KAorICAgICAgICAgICAgY29uc3Qgc3A8SU9NWD4gJm9teCwgSU9NWDo6bm9kZV9pZCBub2RlLAorICAgICAgICAgICAgdWludDMyX3QgY29sb3JGb3JtYXQsIE9NWF9VMzIgKmZsZXhpYmxlRXF1aXZhbGVudCk7CisKKyAgICAvLyBSZXR1cm5zIDAgaWYgY29uZmlndXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkLiAgTk9URTogdGhpcyBpcyB0cmVhdGVkIGJ5CisgICAgLy8gc29tZSBPTVggY29tcG9uZW50cyBhcyBhdXRvIGxldmVsLCBhbmQgYnkgb3RoZXJzIGFzIGludmFsaWQgbGV2ZWwuCisgICAgc3RhdGljIGludCAvKiBPTVhfVklERU9fQVZDTEVWRUxUWVBFICovIGdldEFWQ0xldmVsRm9yKAorICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcmF0ZSwgaW50IGJpdHJhdGUsCisgICAgICAgICAgICBPTVhfVklERU9fQVZDUFJPRklMRVRZUEUgcHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUpOworCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QUNvZGVjKCk7CiAKQEAgLTExOSw2ICsxMTksOCBAQAogICAgICAgICBrV2hhdFJlcXVlc3RJRFJGcmFtZSAgICAgICAgID0gJ3JpZHInLAogICAgICAgICBrV2hhdFNldFBhcmFtZXRlcnMgICAgICAgICAgID0gJ3NldFAnLAogICAgICAgICBrV2hhdFN1Ym1pdE91dHB1dE1ldGFEYXRhQnVmZmVySWZFT1MgPSAnc3VibScsCisgICAgICAgIGtXaGF0T01YRGllZCAgICAgICAgICAgICAgICAgPSAnT01YZCcsCisgICAgICAgIGtXaGF0UmVsZWFzZUNvZGVjSW5zdGFuY2UgICAgPSAncmVsQycsCiAgICAgfTsKIAogICAgIGVudW0gewpAQCAtMTc4LDYgKzE4MCw4IEBACiAgICAgc3A8TWVtb3J5RGVhbGVyPiBtRGVhbGVyWzJdOwogCiAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gbU5hdGl2ZVdpbmRvdzsKKyAgICBzcDxBTWVzc2FnZT4gbUlucHV0Rm9ybWF0OworICAgIHNwPEFNZXNzYWdlPiBtT3V0cHV0Rm9ybWF0OwogCiAgICAgVmVjdG9yPEJ1ZmZlckluZm8+IG1CdWZmZXJzWzJdOwogICAgIGJvb2wgbVBvcnRFT1NbMl07CkBAIC0xOTAsNyArMTk0LDcgQEAKICAgICBib29sIG1Vc2VNZXRhZGF0YU9uRW5jb2Rlck91dHB1dDsKICAgICBib29sIG1GYXRhbEVycm9yOwogICAgIGJvb2wgbVNodXRkb3duSW5Qcm9ncmVzczsKLSAgICBib29sIG1Jc0NvbmZpZ3VyZWRGb3JBZGFwdGl2ZVBsYXliYWNrOworICAgIGJvb2wgbUV4cGxpY2l0U2h1dGRvd247CiAKICAgICAvLyBJZiAibUtlZXBDb21wb25lbnRBbGxvY2F0ZWQiIHdlIG9ubHkgdHJhbnNpdGlvbiBiYWNrIHRvIExvYWRlZCBzdGF0ZQogICAgIC8vIGFuZCBkbyBub3QgcmVsZWFzZSB0aGUgY29tcG9uZW50IGluc3RhbmNlLgpAQCAtMTk4LDE2ICsyMDIsMjUgQEAKIAogICAgIGludDMyX3QgbUVuY29kZXJEZWxheTsKICAgICBpbnQzMl90IG1FbmNvZGVyUGFkZGluZzsKKyAgICBpbnQzMl90IG1Sb3RhdGlvbkRlZ3JlZXM7CiAKICAgICBib29sIG1DaGFubmVsTWFza1ByZXNlbnQ7CiAgICAgaW50MzJfdCBtQ2hhbm5lbE1hc2s7CiAgICAgdW5zaWduZWQgbURlcXVldWVDb3VudGVyOwogICAgIGJvb2wgbVN0b3JlTWV0YURhdGFJbk91dHB1dEJ1ZmZlcnM7CiAgICAgaW50MzJfdCBtTWV0YURhdGFCdWZmZXJzVG9TdWJtaXQ7CisgICAgc2l6ZV90IG1OdW1VbmRlcXVldWVkQnVmZmVyczsKIAogICAgIGludDY0X3QgbVJlcGVhdEZyYW1lRGVsYXlVczsKICAgICBpbnQ2NF90IG1NYXhQdHNHYXBVczsKIAorICAgIGludDY0X3QgbVRpbWVQZXJGcmFtZVVzOworICAgIGludDY0X3QgbVRpbWVQZXJDYXB0dXJlVXM7CisKKyAgICBib29sIG1DcmVhdGVJbnB1dEJ1ZmZlcnNTdXNwZW5kZWQ7CisKKyAgICBib29sIG1UdW5uZWxlZDsKKwogICAgIHN0YXR1c190IHNldEN5Y2xpY0ludHJhTWFjcm9ibG9ja1JlZnJlc2goY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIGludDMyX3QgbW9kZSk7CiAgICAgc3RhdHVzX3QgYWxsb2NhdGVCdWZmZXJzT25Qb3J0KE9NWF9VMzIgcG9ydEluZGV4KTsKICAgICBzdGF0dXNfdCBmcmVlQnVmZmVyc09uUG9ydChPTVhfVTMyIHBvcnRJbmRleCk7CkBAIC0yMzEsNiArMjQ0LDkgQEAKICAgICBzdGF0dXNfdCBzZXRDb21wb25lbnRSb2xlKGJvb2wgaXNFbmNvZGVyLCBjb25zdCBjaGFyICptaW1lKTsKICAgICBzdGF0dXNfdCBjb25maWd1cmVDb2RlYyhjb25zdCBjaGFyICptaW1lLCBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAKKyAgICBzdGF0dXNfdCBjb25maWd1cmVUdW5uZWxlZFZpZGVvUGxheWJhY2soaW50MzJfdCBhdWRpb0h3U3luYywKKyAgICAgICAgICAgIGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+ICZuYXRpdmVXaW5kb3cpOworCiAgICAgc3RhdHVzX3Qgc2V0VmlkZW9Qb3J0Rm9ybWF0VHlwZSgKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LAogICAgICAgICAgICAgT01YX1ZJREVPX0NPRElOR1RZUEUgY29tcHJlc3Npb25Gb3JtYXQsCkBAIC0yMzksNyArMjU1LDcgQEAKICAgICBzdGF0dXNfdCBzZXRTdXBwb3J0ZWRPdXRwdXRGb3JtYXQoKTsKIAogICAgIHN0YXR1c190IHNldHVwVmlkZW9EZWNvZGVyKAotICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZSwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpOworICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZSwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogCiAgICAgc3RhdHVzX3Qgc2V0dXBWaWRlb0VuY29kZXIoCiAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lLCBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CkBAIC0yNDksMTAgKzI2NSwyMCBAQAogICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsCiAgICAgICAgICAgICBPTVhfVklERU9fQ09ESU5HVFlQRSBjb21wcmVzc2lvbkZvcm1hdCk7CiAKKyAgICB0eXBlZGVmIHN0cnVjdCBkcmNQYXJhbXMgeworICAgICAgICBpbnQzMl90IGRyY0N1dDsKKyAgICAgICAgaW50MzJfdCBkcmNCb29zdDsKKyAgICAgICAgaW50MzJfdCBoZWF2eUNvbXByZXNzaW9uOworICAgICAgICBpbnQzMl90IHRhcmdldFJlZkxldmVsOworICAgICAgICBpbnQzMl90IGVuY29kZWRUYXJnZXRMZXZlbDsKKyAgICB9IGRyY1BhcmFtc190OworCiAgICAgc3RhdHVzX3Qgc2V0dXBBQUNDb2RlYygKICAgICAgICAgICAgIGJvb2wgZW5jb2RlciwKICAgICAgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHMsIGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBiaXRSYXRlLAotICAgICAgICAgICAgaW50MzJfdCBhYWNQcm9maWxlLCBib29sIGlzQURUUyk7CisgICAgICAgICAgICBpbnQzMl90IGFhY1Byb2ZpbGUsIGJvb2wgaXNBRFRTLCBpbnQzMl90IHNick1vZGUsCisgICAgICAgICAgICBpbnQzMl90IG1heE91dHB1dENoYW5uZWxDb3VudCwgY29uc3QgZHJjUGFyYW1zX3QmIGRyYywKKyAgICAgICAgICAgIGludDMyX3QgcGNtTGltaXRlckVuYWJsZSk7CiAKICAgICBzdGF0dXNfdCBzZXR1cEFDM0NvZGVjKGJvb2wgZW5jb2RlciwgaW50MzJfdCBudW1DaGFubmVscywgaW50MzJfdCBzYW1wbGVSYXRlKTsKIApAQCAtMjczLDYgKzI5OSw3IEBACiAgICAgc3RhdHVzX3Qgc2V0dXBNUEVHNEVuY29kZXJQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKICAgICBzdGF0dXNfdCBzZXR1cEgyNjNFbmNvZGVyUGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAgICAgc3RhdHVzX3Qgc2V0dXBBVkNFbmNvZGVyUGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgc3RhdHVzX3Qgc2V0dXBIRVZDRW5jb2RlclBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogICAgIHN0YXR1c190IHNldHVwVlBYRW5jb2RlclBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogCiAgICAgc3RhdHVzX3QgdmVyaWZ5U3VwcG9ydEZvclByb2ZpbGVBbmRMZXZlbChpbnQzMl90IHByb2ZpbGUsIGludDMyX3QgbGV2ZWwpOwpAQCAtMzAxLDExICszMjgsMTcgQEAKICAgICB2b2lkIHByb2Nlc3NEZWZlcnJlZE1lc3NhZ2VzKCk7CiAKICAgICB2b2lkIHNlbmRGb3JtYXRDaGFuZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZyZXBseSk7CisgICAgc3RhdHVzX3QgZ2V0UG9ydEZvcm1hdChPTVhfVTMyIHBvcnRJbmRleCwgc3A8QU1lc3NhZ2U+ICZub3RpZnkpOwogCiAgICAgdm9pZCBzaWduYWxFcnJvcigKICAgICAgICAgICAgIE9NWF9FUlJPUlRZUEUgZXJyb3IgPSBPTVhfRXJyb3JVbmRlZmluZWQsCiAgICAgICAgICAgICBzdGF0dXNfdCBpbnRlcm5hbEVycm9yID0gVU5LTk9XTl9FUlJPUik7CiAKKyAgICBzdGF0aWMgYm9vbCBkZXNjcmliZURlZmF1bHRDb2xvckZvcm1hdChEZXNjcmliZUNvbG9yRm9ybWF0UGFyYW1zICZkZXNjcmliZVBhcmFtcyk7CisgICAgc3RhdGljIGJvb2wgZGVzY3JpYmVDb2xvckZvcm1hdCgKKyAgICAgICAgY29uc3Qgc3A8SU9NWD4gJm9teCwgSU9NWDo6bm9kZV9pZCBub2RlLAorICAgICAgICBEZXNjcmliZUNvbG9yRm9ybWF0UGFyYW1zICZkZXNjcmliZVBhcmFtcyk7CisKICAgICBzdGF0dXNfdCByZXF1ZXN0SURSRnJhbWUoKTsKICAgICBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmcGFyYW1zKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmgKaW5kZXggMzJmNDY4Yi4uY2M0NjgwMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5oCkBAIC0xNzIsNyArMTcyLDcgQEAKICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHN1cmZhY2UsCiAgICAgICAgICAgICAgICAgIGJvb2wgc3RvcmVNZXRhRGF0YUluVmlkZW9CdWZmZXJzKTsKIAotICAgIHZpcnR1YWwgdm9pZCBzdGFydENhbWVyYVJlY29yZGluZygpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRDYW1lcmFSZWNvcmRpbmcoKTsKICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZVJlY29yZGluZ0ZyYW1lKGNvbnN0IHNwPElNZW1vcnk+JiBmcmFtZSk7CiAKICAgICAvLyBSZXR1cm5zIHRydWUgaWYgbmVlZCB0byBza2lwIHRoZSBjdXJyZW50IGZyYW1lLgpAQCAtMTg1LDYgKzE4NSw4IEBACiAgICAgdmlydHVhbCB2b2lkIGRhdGFDYWxsYmFja1RpbWVzdGFtcChpbnQ2NF90IHRpbWVzdGFtcFVzLCBpbnQzMl90IG1zZ1R5cGUsCiAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiAmZGF0YSk7CiAKKyAgICB2b2lkIHJlbGVhc2VDYW1lcmEoKTsKKwogcHJpdmF0ZToKICAgICBmcmllbmQgY2xhc3MgQ2FtZXJhU291cmNlTGlzdGVuZXI7CiAKQEAgLTIzNiw3ICsyMzgsNiBAQAogICAgIHN0YXRpYyB2b2lkIGFkanVzdE91dGdvaW5nQU5XQnVmZmVyKElNZW1vcnkqIGRhdGEpOwogCiAgICAgdm9pZCBzdG9wQ2FtZXJhUmVjb3JkaW5nKCk7Ci0gICAgdm9pZCByZWxlYXNlQ2FtZXJhKCk7CiAgICAgc3RhdHVzX3QgcmVzZXQoKTsKIAogICAgIENhbWVyYVNvdXJjZShjb25zdCBDYW1lcmFTb3VyY2UgJik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0Nsb2NrRXN0aW1hdG9yLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0Nsb2NrRXN0aW1hdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZkNmU3NQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2xvY2tFc3RpbWF0b3IuaApAQCAtMCwwICsxLDExMCBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2lmbmRlZiBDTE9DS19FU1RJTUFUT1JfSF8KKworI2RlZmluZSBDTE9DS19FU1RJTUFUT1JfSF8KKworCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RydWN0IENsb2NrRXN0aW1hdG9yIDogUmVmQmFzZSB7CisgICAgdmlydHVhbCBkb3VibGUgZXN0aW1hdGUoZG91YmxlIHgsIGRvdWJsZSB5KSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHJlc2V0KCkgPSAwOworfTsKKworc3RydWN0IFdpbmRvd2VkTGluZWFyRml0RXN0aW1hdG9yIDogQ2xvY2tFc3RpbWF0b3IgeworICAgIHN0cnVjdCBMaW5lYXJGaXQgeworICAgICAgICAvKioKKyAgICAgICAgICogRml0IHkgPSBhICogeCArIGIsIHdoZXJlIGVhY2ggaW5wdXQgaGFzIGEgd2VpZ2h0CisgICAgICAgICAqLworICAgICAgICBkb3VibGUgbVg7ICAvLyBzdW0od19pICogeF9pKQorICAgICAgICBkb3VibGUgbVhYOyAvLyBzdW0od19pICogeF9pXjIpCisgICAgICAgIGRvdWJsZSBtWTsgIC8vIHN1bSh3X2kgKiB5X2kpCisgICAgICAgIGRvdWJsZSBtWVk7IC8vIHN1bSh3X2kgKiB5X2leMikKKyAgICAgICAgZG91YmxlIG1YWTsgLy8gc3VtKHdfaSAqIHhfaSAqIHlfaSkKKyAgICAgICAgZG91YmxlIG1XOyAgLy8gc3VtKHdfaSkKKworICAgICAgICBMaW5lYXJGaXQoKTsKKyAgICAgICAgdm9pZCByZXNldCgpOworICAgICAgICB2b2lkIGNvbWJpbmUoY29uc3QgTGluZWFyRml0ICZsZik7CisgICAgICAgIHZvaWQgYWRkKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHcpOworICAgICAgICB2b2lkIHNjYWxlKGRvdWJsZSB3KTsKKyAgICAgICAgZG91YmxlIGludGVycG9sYXRlKGRvdWJsZSB4KTsKKyAgICAgICAgZG91YmxlIHNpemUoKSBjb25zdDsKKworICAgICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhMaW5lYXJGaXQpOworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBFc3RpbWF0b3IgZm9yIGYoeCkgPSB5JyB3aGVyZSBpbnB1dCB5JyBpcyBub2lzeSwgYnV0CisgICAgICogdGhlb3JldGljYWxseSBsaW5lYXI6CisgICAgICoKKyAgICAgKiAgICAgIHknID1+IHkgPSBhICogeCArIGIKKyAgICAgKgorICAgICAqIEl0IHVzZXMgbGluZWFyIGZpdCByZWdyZXNzaW9uIG92ZXIgYSB0YXBlcmluZyByb2xsaW5nIHdpbmRvdworICAgICAqIHRvIGdldCBhbiBlc3RpbWF0ZSBmb3IgeSAoZnJvbSB0aGUgY3VycmVudCBhbmQgcGFzdCBpbnB1dHMKKyAgICAgKiAoeCwgeScpKS4KKyAgICAgKgorICAgICAqICAgICBfX19fX19fX19fX18KKyAgICAgKiAgICAvfCAgICAgICAgICB8XAorICAgICAqICAgLyB8ICAgICAgICAgIHwgXAorICAgICAqICAvICB8ICAgICAgICAgIHwgIFwgICA8LS0tIG5ldyBkYXRhICh4LCB5JykKKyAgICAgKiAvICAgfCAgIG1haW4gICB8ICAgXAorICAgICAqIDwtLT48LS0tLS0tLS0tLT48LS0+CisgICAgICogdGFpbCAgICAgICAgICAgIGhlYWQKKyAgICAgKgorICAgICAqIHdlaWdodCBpcyAxIHVuZGVyIHRoZSBtYWluIHdpbmRvdywgdGFwZXJzIGV4cG9uZW50aWFsbHkgYnkKKyAgICAgKiB0aGUgZmFjdG9ycyBnaXZlbiBpbiB0aGUgaGVhZCBhbmQgdGhlIHRhaWwuCisgICAgICoKKyAgICAgKiBBc3N1bWluZyB0aGF0IHggYW5kIHknIGFyZSBtb25vdG9uaWMsIHRoYXQgeCBpcyBzb21ld2hhdAorICAgICAqIGV2ZW5seSBzYW1wbGVkLCBhbmQgdGhhdCBhID1+IDEsIHRoZSBlc3RpbWF0ZWQgeSBpcyBhbHNvCisgICAgICogZ29pbmcgdG8gYmUgbW9ub3RvbmljLgorICAgICAqLworICAgIFdpbmRvd2VkTGluZWFyRml0RXN0aW1hdG9yKAorICAgICAgICAgICAgc2l6ZV90IGhlYWRMZW5ndGggPSA1LCBkb3VibGUgaGVhZEZhY3RvciA9IDAuNSwKKyAgICAgICAgICAgIHNpemVfdCBtYWluTGVuZ3RoID0gMCwgZG91YmxlIHRhaWxGYWN0b3IgPSAwLjk5KTsKKworICAgIHZpcnR1YWwgdm9pZCByZXNldCgpOworCisgICAgLy8gYWRkIGEgbmV3IHNhbXBsZSAoeCAtPiB5JykgYW5kIHJldHVybiBhbiBlc3RpbWF0ZWQgdmFsdWUgZm9yIHRoZSB0cnVlIHkKKyAgICB2aXJ0dWFsIGRvdWJsZSBlc3RpbWF0ZShkb3VibGUgeCwgZG91YmxlIHkpOworCitwcml2YXRlOgorICAgIFZlY3Rvcjxkb3VibGU+IG1YSGlzdG9yeTsgLy8gY2lyY3VsYXIgYnVmZmVyCisgICAgVmVjdG9yPGRvdWJsZT4gbVlIaXN0b3J5OyAvLyBjaXJjdWxhciBidWZmZXIKKyAgICBMaW5lYXJGaXQgbUhlYWQ7CisgICAgTGluZWFyRml0IG1NYWluOworICAgIExpbmVhckZpdCBtVGFpbDsKKyAgICBkb3VibGUgbUhlYWRGYWN0b3JJbnY7CisgICAgZG91YmxlIG1UYWlsRmFjdG9yOworICAgIGRvdWJsZSBtRmlyc3RXZWlnaHQ7CisgICAgc2l6ZV90IG1IaXN0b3J5TGVuZ3RoOworICAgIHNpemVfdCBtSGVhZExlbmd0aDsKKyAgICBzaXplX3QgbU51bVNhbXBsZXM7CisgICAgc2l6ZV90IG1TYW1wbGVJeDsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFdpbmRvd2VkTGluZWFyRml0RXN0aW1hdG9yKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJmMjdhNgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmgKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09ERUNfQkFTRV9IXworCisjZGVmaW5lIENPREVDX0JBU0VfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQUJ1ZmZlcjsKKworc3RydWN0IENvZGVjQmFzZSA6IHB1YmxpYyBBSGFuZGxlciB7CisgICAgZW51bSB7CisgICAgICAgIGtXaGF0RmlsbFRoaXNCdWZmZXIgICAgICA9ICdmaWxsJywKKyAgICAgICAga1doYXREcmFpblRoaXNCdWZmZXIgICAgID0gJ2RyYWknLAorICAgICAgICBrV2hhdEVPUyAgICAgICAgICAgICAgICAgPSAnZW9zICcsCisgICAgICAgIGtXaGF0U2h1dGRvd25Db21wbGV0ZWQgICA9ICdzY29tJywKKyAgICAgICAga1doYXRGbHVzaENvbXBsZXRlZCAgICAgID0gJ2Zjb20nLAorICAgICAgICBrV2hhdE91dHB1dEZvcm1hdENoYW5nZWQgPSAnb3V0QycsCisgICAgICAgIGtXaGF0RXJyb3IgICAgICAgICAgICAgICA9ICdlcnJvJywKKyAgICAgICAga1doYXRDb21wb25lbnRBbGxvY2F0ZWQgID0gJ2NBbGwnLAorICAgICAgICBrV2hhdENvbXBvbmVudENvbmZpZ3VyZWQgPSAnY0NvbicsCisgICAgICAgIGtXaGF0SW5wdXRTdXJmYWNlQ3JlYXRlZCA9ICdpc2ZjJywKKyAgICAgICAga1doYXRTaWduYWxlZElucHV0RU9TICAgID0gJ3Nlb3MnLAorICAgICAgICBrV2hhdEJ1ZmZlcnNBbGxvY2F0ZWQgICAgPSAnYWxsYycsCisgICAgfTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXROb3RpZmljYXRpb25NZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVBbGxvY2F0ZUNvbXBvbmVudChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgPSAwOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZUNvbmZpZ3VyZUNvbXBvbmVudChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgPSAwOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZUNyZWF0ZUlucHV0U3VyZmFjZSgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVTdGFydCgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVTaHV0ZG93bihib29sIGtlZXBDb21wb25lbnRBbGxvY2F0ZWQgPSBmYWxzZSkgPSAwOworCisgICAgLy8gcmVxdWlyZSBhbiBleHBsaWNpdCBtZXNzYWdlIGhhbmRsZXIKKyAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxGbHVzaCgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsUmVzdW1lKCkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIHNpZ25hbFJlcXVlc3RJRFJGcmFtZSgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsU2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgPSAwOworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxFbmRPZklucHV0U3RyZWFtKCkgPSAwOworCisgICAgc3RydWN0IFBvcnREZXNjcmlwdGlvbiA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICAgICAgdmlydHVhbCBzaXplX3QgY291bnRCdWZmZXJzKCkgPSAwOworICAgICAgICB2aXJ0dWFsIElPTVg6OmJ1ZmZlcl9pZCBidWZmZXJJREF0KHNpemVfdCBpbmRleCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIHNwPEFCdWZmZXI+IGJ1ZmZlckF0KHNpemVfdCBpbmRleCkgY29uc3QgPSAwOworCisgICAgcHJvdGVjdGVkOgorICAgICAgICBQb3J0RGVzY3JpcHRpb24oKTsKKyAgICAgICAgdmlydHVhbCB+UG9ydERlc2NyaXB0aW9uKCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhQb3J0RGVzY3JpcHRpb24pOworICAgIH07CisKK3Byb3RlY3RlZDoKKyAgICBDb2RlY0Jhc2UoKTsKKyAgICB2aXJ0dWFsIH5Db2RlY0Jhc2UoKTsKKworcHJpdmF0ZToKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDb2RlY0Jhc2UpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDT0RFQ19CQVNFX0hfCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmgKaW5kZXggNmM2NGEyYy4uNzY2YTgxZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmgKQEAgLTMxLDcgKzMxLDEwIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBTWVzc2FnZTsKK3N0cnVjdCBBU3RyaW5nOworc3RydWN0IElNZWRpYUhUVFBTZXJ2aWNlOwogY2xhc3MgU3RyaW5nODsKK3N0cnVjdCBIVFRQQmFzZTsKIAogY2xhc3MgRGF0YVNvdXJjZSA6IHB1YmxpYyBSZWZCYXNlIHsKIHB1YmxpYzoKQEAgLTQzLDggKzQ2LDEzIEBACiAgICAgfTsKIAogICAgIHN0YXRpYyBzcDxEYXRhU291cmNlPiBDcmVhdGVGcm9tVVJJKAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKLSAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCk7CisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyA9IE5VTEwsCisgICAgICAgICAgICBTdHJpbmc4ICpjb250ZW50VHlwZSA9IE5VTEwsCisgICAgICAgICAgICBIVFRQQmFzZSAqaHR0cFNvdXJjZSA9IE5VTEwpOworCisgICAgc3RhdGljIHNwPERhdGFTb3VyY2U+IENyZWF0ZU1lZGlhSFRUUChjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlKTsKIAogICAgIERhdGFTb3VyY2UoKSB7fQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFVUklTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVVSSVNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MzU2MmUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFVUklTb3VyY2UuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBEQVRBX1VSSV9TT1VSQ0VfSF8KKworI2RlZmluZSBEQVRBX1VSSV9TT1VSQ0VfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFCdWZmZXI7CisKK3N0cnVjdCBEYXRhVVJJU291cmNlIDogcHVibGljIERhdGFTb3VyY2UgeworICAgIHN0YXRpYyBzcDxEYXRhVVJJU291cmNlPiBDcmVhdGUoY29uc3QgY2hhciAqdXJpKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkRhdGFVUklTb3VyY2UoKTsKKworcHJpdmF0ZToKKyAgICBzcDxBQnVmZmVyPiBtQnVmZmVyOworCisgICAgRGF0YVVSSVNvdXJjZShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERhdGFVUklTb3VyY2UpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBEQVRBX1VSSV9TT1VSQ0VfSF8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaAppbmRleCBkOTk0Y2IzLi5hOTgxZDFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaApAQCAtMzAsNiArMzAsNyBAQAogY2xhc3MgRmlsZVNvdXJjZSA6IHB1YmxpYyBEYXRhU291cmNlIHsKIHB1YmxpYzoKICAgICBGaWxlU291cmNlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKKyAgICAvLyBGaWxlU291cmNlIHRha2VzIG93bmVyc2hpcCBhbmQgd2lsbCBjbG9zZSB0aGUgZmQKICAgICBGaWxlU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CkBAIC01NSw3ICs1Niw3IEBACiAgICAgc3A8RGVjcnlwdEhhbmRsZT4gbURlY3J5cHRIYW5kbGU7CiAgICAgRHJtTWFuYWdlckNsaWVudCAqbURybU1hbmFnZXJDbGllbnQ7CiAgICAgaW50NjRfdCBtRHJtQnVmT2Zmc2V0OwotICAgIGludDY0X3QgbURybUJ1ZlNpemU7CisgICAgc2l6ZV90IG1Ecm1CdWZTaXplOwogICAgIHVuc2lnbmVkIGNoYXIgKm1Ecm1CdWY7CiAKICAgICBzc2l6ZV90IHJlYWRBdERSTShvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oCmluZGV4IDNlZjZiOWEuLjI2Y2U1ZjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmgKQEAgLTYzLDggKzYzLDggQEAKICAgICBpbnQzMl90IGdldFRpbWVTY2FsZSgpIGNvbnN0IHsgcmV0dXJuIG1UaW1lU2NhbGU7IH0KIAogICAgIHN0YXR1c190IHNldEdlb0RhdGEoaW50IGxhdGl0dWRleDEwMDAwLCBpbnQgbG9uZ2l0dWRleDEwMDAwKTsKLSAgICB2b2lkIHNldFN0YXJ0VGltZU9mZnNldE1zKGludCBtcykgeyBtU3RhcnRUaW1lT2Zmc2V0TXMgPSBtczsgfQotICAgIGludDMyX3QgZ2V0U3RhcnRUaW1lT2Zmc2V0TXMoKSBjb25zdCB7IHJldHVybiBtU3RhcnRUaW1lT2Zmc2V0TXM7IH0KKyAgICB2aXJ0dWFsIHZvaWQgc2V0U3RhcnRUaW1lT2Zmc2V0TXMoaW50IG1zKSB7IG1TdGFydFRpbWVPZmZzZXRNcyA9IG1zOyB9CisgICAgdmlydHVhbCBpbnQzMl90IGdldFN0YXJ0VGltZU9mZnNldE1zKCkgY29uc3QgeyByZXR1cm4gbVN0YXJ0VGltZU9mZnNldE1zOyB9CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5NUEVHNFdyaXRlcigpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oCmluZGV4IDNkNzk1OTYuLmM4YTUwZTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmgKQEAgLTE4LDYgKzE4LDggQEAKIAogI2RlZmluZSBNRURJQV9CVUZGRVJfSF8KIAorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFCdWZmZXJCYXNlLmg+CisKICNpbmNsdWRlIDxwdGhyZWFkLmg+CiAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KQEAgLTQzLDcgKzQ1LDcgQEAKICAgICBNZWRpYUJ1ZmZlck9ic2VydmVyICZvcGVyYXRvcj0oY29uc3QgTWVkaWFCdWZmZXJPYnNlcnZlciAmKTsKIH07CiAKLWNsYXNzIE1lZGlhQnVmZmVyIHsKK2NsYXNzIE1lZGlhQnVmZmVyIDogcHVibGljIE1lZGlhQnVmZmVyQmFzZSB7CiBwdWJsaWM6CiAgICAgLy8gVGhlIHVuZGVybHlpbmcgZGF0YSByZW1haW5zIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyIQogICAgIE1lZGlhQnVmZmVyKHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKQEAgLTU2LDEwICs1OCwxMCBAQAogCiAgICAgLy8gRGVjcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IGFuZCByZXR1cm5zIHRoZSBidWZmZXIgdG8gaXRzCiAgICAgLy8gYXNzb2NpYXRlZCBNZWRpYUJ1ZmZlckdyb3VwIGlmIHRoZSByZWZlcmVuY2UgY291bnQgZHJvcHMgdG8gMC4KLSAgICB2b2lkIHJlbGVhc2UoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpOwogCiAgICAgLy8gSW5jcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50LgotICAgIHZvaWQgYWRkX3JlZigpOworICAgIHZpcnR1YWwgdm9pZCBhZGRfcmVmKCk7CiAKICAgICB2b2lkICpkYXRhKCkgY29uc3Q7CiAgICAgc2l6ZV90IHNpemUoKSBjb25zdDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKaW5kZXggMDQ4ODI5Mi4uYTAwNmY3ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKQEAgLTM0LDkgKzM0LDEyIEBACiAKICAgICB2b2lkIGFkZF9idWZmZXIoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CiAKLSAgICAvLyBCbG9ja3MgdW50aWwgYSBidWZmZXIgaXMgYXZhaWxhYmxlIGFuZCByZXR1cm5zIGl0IHRvIHRoZSBjYWxsZXIsCi0gICAgLy8gdGhlIHJldHVybmVkIGJ1ZmZlciB3aWxsIGhhdmUgYSByZWZlcmVuY2UgY291bnQgb2YgMS4KLSAgICBzdGF0dXNfdCBhY3F1aXJlX2J1ZmZlcihNZWRpYUJ1ZmZlciAqKmJ1ZmZlcik7CisgICAgLy8gSWYgbm9uQmxvY2tpbmcgaXMgZmFsc2UsIGl0IGJsb2NrcyB1bnRpbCBhIGJ1ZmZlciBpcyBhdmFpbGFibGUgYW5kCisgICAgLy8gcGFzc2VzIGl0IHRvIHRoZSBjYWxsZXIgaW4gKmJ1ZmZlciwgd2hpbGUgcmV0dXJuaW5nIE9LLgorICAgIC8vIFRoZSByZXR1cm5lZCBidWZmZXIgd2lsbCBoYXZlIGEgcmVmZXJlbmNlIGNvdW50IG9mIDEuCisgICAgLy8gSWYgbm9uQmxvY2tpbmcgaXMgdHJ1ZSBhbmQgYSBidWZmZXIgaXMgbm90IGltbWVkaWF0ZWx5IGF2YWlsYWJsZSwKKyAgICAvLyBidWZmZXIgaXMgc2V0IHRvIE5VTEwgYW5kIGl0IHJldHVybnMgV09VTERfQkxPQ0suCisgICAgc3RhdHVzX3QgYWNxdWlyZV9idWZmZXIoTWVkaWFCdWZmZXIgKipidWZmZXIsIGJvb2wgbm9uQmxvY2tpbmcgPSBmYWxzZSk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oCmluZGV4IDc2YWE1MDMuLjU0YTRlOGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oCkBAIC0yNiwxMCArMjYsMTEgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFCdWZmZXI7Ci1zdHJ1Y3QgQUNvZGVjOwogc3RydWN0IEFNZXNzYWdlOwogc3RydWN0IEFTdHJpbmc7CitzdHJ1Y3QgQ29kZWNCYXNlOwogc3RydWN0IElDcnlwdG87CitzdHJ1Y3QgSUJhdHRlcnlTdGF0czsKIHN0cnVjdCBTb2Z0d2FyZVJlbmRlcmVyOwogc3RydWN0IFN1cmZhY2U7CiAKQEAgLTQ0LDExICs0NSwyMCBAQAogICAgICAgICBCVUZGRVJfRkxBR19FT1MgICAgICAgICA9IDQsCiAgICAgfTsKIAorICAgIGVudW0geworICAgICAgICBDQl9JTlBVVF9BVkFJTEFCTEUgPSAxLAorICAgICAgICBDQl9PVVRQVVRfQVZBSUxBQkxFID0gMiwKKyAgICAgICAgQ0JfRVJST1IgPSAzLAorICAgICAgICBDQl9PVVRQVVRfRk9STUFUX0NIQU5HRUQgPSA0LAorICAgIH07CisKKyAgICBzdHJ1Y3QgQmF0dGVyeU5vdGlmaWVyOworCiAgICAgc3RhdGljIHNwPE1lZGlhQ29kZWM+IENyZWF0ZUJ5VHlwZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsIGNvbnN0IGNoYXIgKm1pbWUsIGJvb2wgZW5jb2Rlcik7CisgICAgICAgICAgICBjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyLCBjb25zdCBjaGFyICptaW1lLCBib29sIGVuY29kZXIsIHN0YXR1c190ICplcnIgPSBOVUxMKTsKIAogICAgIHN0YXRpYyBzcDxNZWRpYUNvZGVjPiBDcmVhdGVCeUNvbXBvbmVudE5hbWUoCi0gICAgICAgICAgICBjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyLCBjb25zdCBjaGFyICpuYW1lKTsKKyAgICAgICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsIGNvbnN0IGNoYXIgKm5hbWUsIHN0YXR1c190ICplcnIgPSBOVUxMKTsKIAogICAgIHN0YXR1c190IGNvbmZpZ3VyZSgKICAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LApAQCAtNTYsNiArNjYsOCBAQAogICAgICAgICAgICAgY29uc3Qgc3A8SUNyeXB0bz4gJmNyeXB0bywKICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKTsKIAorICAgIHN0YXR1c190IHNldENhbGxiYWNrKGNvbnN0IHNwPEFNZXNzYWdlPiAmY2FsbGJhY2spOworCiAgICAgc3RhdHVzX3QgY3JlYXRlSW5wdXRTdXJmYWNlKHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+KiBidWZmZXJQcm9kdWNlcik7CiAKICAgICBzdGF0dXNfdCBzdGFydCgpOwpAQCAtNjQsNiArNzYsMTAgQEAKICAgICAvLyB1bmNvbmZpZ3VyZWQuCiAgICAgc3RhdHVzX3Qgc3RvcCgpOwogCisgICAgLy8gUmVzZXRzIHRoZSBjb2RlYyB0byB0aGUgSU5JVElBTElaRUQgc3RhdGUuICBDYW4gYmUgY2FsbGVkIGFmdGVyIGFuIGVycm9yCisgICAgLy8gaGFzIG9jY3VyZWQgdG8gbWFrZSB0aGUgY29kZWMgdXNhYmxlLgorICAgIHN0YXR1c190IHJlc2V0KCk7CisKICAgICAvLyBDbGllbnQgTVVTVCBjYWxsIHJlbGVhc2UgYmVmb3JlIHJlbGVhc2luZyBmaW5hbCByZWZlcmVuY2UgdG8gdGhpcwogICAgIC8vIG9iamVjdC4KICAgICBzdGF0dXNfdCByZWxlYXNlKCk7CkBAIC0xMDAsMTYgKzExNiwyMiBAQAogICAgICAgICAgICAgdWludDMyX3QgKmZsYWdzLAogICAgICAgICAgICAgaW50NjRfdCB0aW1lb3V0VXMgPSAwbGwpOwogCisgICAgc3RhdHVzX3QgcmVuZGVyT3V0cHV0QnVmZmVyQW5kUmVsZWFzZShzaXplX3QgaW5kZXgsIGludDY0X3QgdGltZXN0YW1wTnMpOwogICAgIHN0YXR1c190IHJlbmRlck91dHB1dEJ1ZmZlckFuZFJlbGVhc2Uoc2l6ZV90IGluZGV4KTsKICAgICBzdGF0dXNfdCByZWxlYXNlT3V0cHV0QnVmZmVyKHNpemVfdCBpbmRleCk7CiAKICAgICBzdGF0dXNfdCBzaWduYWxFbmRPZklucHV0U3RyZWFtKCk7CiAKICAgICBzdGF0dXNfdCBnZXRPdXRwdXRGb3JtYXQoc3A8QU1lc3NhZ2U+ICpmb3JtYXQpIGNvbnN0OworICAgIHN0YXR1c190IGdldElucHV0Rm9ybWF0KHNwPEFNZXNzYWdlPiAqZm9ybWF0KSBjb25zdDsKIAogICAgIHN0YXR1c190IGdldElucHV0QnVmZmVycyhWZWN0b3I8c3A8QUJ1ZmZlcj4gPiAqYnVmZmVycykgY29uc3Q7CiAgICAgc3RhdHVzX3QgZ2V0T3V0cHV0QnVmZmVycyhWZWN0b3I8c3A8QUJ1ZmZlcj4gPiAqYnVmZmVycykgY29uc3Q7CiAKKyAgICBzdGF0dXNfdCBnZXRPdXRwdXRCdWZmZXIoc2l6ZV90IGluZGV4LCBzcDxBQnVmZmVyPiAqYnVmZmVyKTsKKyAgICBzdGF0dXNfdCBnZXRPdXRwdXRGb3JtYXQoc2l6ZV90IGluZGV4LCBzcDxBTWVzc2FnZT4gKmZvcm1hdCk7CisgICAgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXIoc2l6ZV90IGluZGV4LCBzcDxBQnVmZmVyPiAqYnVmZmVyKTsKKwogICAgIHN0YXR1c190IHJlcXVlc3RJRFJGcmFtZSgpOwogCiAgICAgLy8gTm90aWZpY2F0aW9uIHdpbGwgYmUgcG9zdGVkIG9uY2UgdGhlcmUgImlzIHNvbWV0aGluZyB0byBkbyIsIGkuZS4KQEAgLTEzNSw2ICsxNTcsNyBAQAogICAgICAgICBTVEFSVElORywKICAgICAgICAgU1RBUlRFRCwKICAgICAgICAgRkxVU0hJTkcsCisgICAgICAgIEZMVVNIRUQsCiAgICAgICAgIFNUT1BQSU5HLAogICAgICAgICBSRUxFQVNJTkcsCiAgICAgfTsKQEAgLTE1OSw2ICsxODIsNyBAQAogICAgICAgICBrV2hhdEdldEJ1ZmZlcnMgICAgICAgICAgICAgICAgICAgICA9ICdnZXRCJywKICAgICAgICAga1doYXRGbHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnZmx1cycsCiAgICAgICAgIGtXaGF0R2V0T3V0cHV0Rm9ybWF0ICAgICAgICAgICAgICAgID0gJ2dldE8nLAorICAgICAgICBrV2hhdEdldElucHV0Rm9ybWF0ICAgICAgICAgICAgICAgICA9ICdnZXRJJywKICAgICAgICAga1doYXREZXF1ZXVlSW5wdXRUaW1lZE91dCAgICAgICAgICAgPSAnZElUTycsCiAgICAgICAgIGtXaGF0RGVxdWV1ZU91dHB1dFRpbWVkT3V0ICAgICAgICAgID0gJ2RPVE8nLAogICAgICAgICBrV2hhdENvZGVjTm90aWZ5ICAgICAgICAgICAgICAgICAgICA9ICdjb2RjJywKQEAgLTE2Niw2ICsxOTAsNyBAQAogICAgICAgICBrV2hhdFJlcXVlc3RBY3Rpdml0eU5vdGlmaWNhdGlvbiAgICA9ICdyYWNOJywKICAgICAgICAga1doYXRHZXROYW1lICAgICAgICAgICAgICAgICAgICAgICAgPSAnZ2V0TicsCiAgICAgICAgIGtXaGF0U2V0UGFyYW1ldGVycyAgICAgICAgICAgICAgICAgID0gJ3NldFAnLAorICAgICAgICBrV2hhdFNldENhbGxiYWNrICAgICAgICAgICAgICAgICAgICA9ICdzZXRDJywKICAgICB9OwogCiAgICAgZW51bSB7CkBAIC0xNzksMjYgKzIwNCw0NiBAQAogICAgICAgICBrRmxhZ1Nhd01lZGlhU2VydmVyRGllICAgICAgICAgID0gMTI4LAogICAgICAgICBrRmxhZ0lzRW5jb2RlciAgICAgICAgICAgICAgICAgID0gMjU2LAogICAgICAgICBrRmxhZ0dhdGhlckNvZGVjU3BlY2lmaWNEYXRhICAgID0gNTEyLAorICAgICAgICBrRmxhZ0lzQXN5bmMgICAgICAgICAgICAgICAgICAgID0gMTAyNCwKKyAgICAgICAga0ZsYWdJc0NvbXBvbmVudEFsbG9jYXRlZCAgICAgICA9IDIwNDgsCiAgICAgfTsKIAogICAgIHN0cnVjdCBCdWZmZXJJbmZvIHsKLSAgICAgICAgdm9pZCAqbUJ1ZmZlcklEOworICAgICAgICB1aW50MzJfdCBtQnVmZmVySUQ7CiAgICAgICAgIHNwPEFCdWZmZXI+IG1EYXRhOwogICAgICAgICBzcDxBQnVmZmVyPiBtRW5jcnlwdGVkRGF0YTsKICAgICAgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtRm9ybWF0OwogICAgICAgICBib29sIG1Pd25lZEJ5Q2xpZW50OwogICAgIH07CiAKICAgICBTdGF0ZSBtU3RhdGU7CiAgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKICAgICBzcDxBTG9vcGVyPiBtQ29kZWNMb29wZXI7Ci0gICAgc3A8QUNvZGVjPiBtQ29kZWM7CisgICAgc3A8Q29kZWNCYXNlPiBtQ29kZWM7CiAgICAgQVN0cmluZyBtQ29tcG9uZW50TmFtZTsKICAgICB1aW50MzJfdCBtUmVwbHlJRDsKICAgICB1aW50MzJfdCBtRmxhZ3M7CisgICAgc3RhdHVzX3QgbVN0aWNreUVycm9yOwogICAgIHNwPFN1cmZhY2U+IG1OYXRpdmVXaW5kb3c7CiAgICAgU29mdHdhcmVSZW5kZXJlciAqbVNvZnRSZW5kZXJlcjsKICAgICBzcDxBTWVzc2FnZT4gbU91dHB1dEZvcm1hdDsKKyAgICBzcDxBTWVzc2FnZT4gbUlucHV0Rm9ybWF0OworICAgIHNwPEFNZXNzYWdlPiBtQ2FsbGJhY2s7CisKKyAgICBib29sIG1CYXR0ZXJ5U3RhdE5vdGlmaWVkOworICAgIGJvb2wgbUlzVmlkZW87CisKKyAgICAvLyBpbml0aWFsIGNyZWF0ZSBwYXJhbWV0ZXJzCisgICAgQVN0cmluZyBtSW5pdE5hbWU7CisgICAgYm9vbCBtSW5pdE5hbWVJc1R5cGU7CisgICAgYm9vbCBtSW5pdElzRW5jb2RlcjsKKworICAgIC8vIFVzZWQgb25seSB0byBzeW5jaHJvbml6ZSBhc3luY2hyb25vdXMgZ2V0QnVmZmVyQW5kRm9ybWF0CisgICAgLy8gYWNyb3NzIGFsbCB0aGUgb3RoZXIgKHN5bmNocm9ub3VzKSBidWZmZXIgc3RhdGUgY2hhbmdlCisgICAgLy8gb3BlcmF0aW9ucywgc3VjaCBhcyBkZS9xdWV1ZUluL091dHB1dEJ1ZmZlciwgc3RhcnQgYW5kCisgICAgLy8gc3RvcC9mbHVzaC9yZXNldC9yZWxlYXNlLgorICAgIE11dGV4IG1CdWZmZXJMb2NrOwogCiAgICAgTGlzdDxzaXplX3Q+IG1BdmFpbFBvcnRCdWZmZXJzWzJdOwogICAgIFZlY3RvcjxCdWZmZXJJbmZvPiBtUG9ydEJ1ZmZlcnNbMl07CkBAIC0yMjIsNyArMjY3LDkgQEAKICAgICBzdGF0aWMgc3RhdHVzX3QgUG9zdEFuZEF3YWl0UmVzcG9uc2UoCiAgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgc3A8QU1lc3NhZ2U+ICpyZXNwb25zZSk7CiAKLSAgICBzdGF0dXNfdCBpbml0KGNvbnN0IGNoYXIgKm5hbWUsIGJvb2wgbmFtZUlzVHlwZSwgYm9vbCBlbmNvZGVyKTsKKyAgICBzdGF0aWMgdm9pZCBQb3N0UmVwbHlXaXRoRXJyb3IoaW50MzJfdCByZXBseUlELCBpbnQzMl90IGVycik7CisKKyAgICBzdGF0dXNfdCBpbml0KGNvbnN0IEFTdHJpbmcgJm5hbWUsIGJvb2wgbmFtZUlzVHlwZSwgYm9vbCBlbmNvZGVyKTsKIAogICAgIHZvaWQgc2V0U3RhdGUoU3RhdGUgbmV3U3RhdGUpOwogICAgIHZvaWQgcmV0dXJuQnVmZmVyc1RvQ29kZWMoKTsKQEAgLTIzMiw2ICsyNzksMTAgQEAKICAgICBzdGF0dXNfdCBvblJlbGVhc2VPdXRwdXRCdWZmZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogICAgIHNzaXplX3QgZGVxdWV1ZVBvcnRCdWZmZXIoaW50MzJfdCBwb3J0SW5kZXgpOwogCisgICAgc3RhdHVzX3QgZ2V0QnVmZmVyQW5kRm9ybWF0KAorICAgICAgICAgICAgc2l6ZV90IHBvcnRJbmRleCwgc2l6ZV90IGluZGV4LAorICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gKmJ1ZmZlciwgc3A8QU1lc3NhZ2U+ICpmb3JtYXQpOworCiAgICAgYm9vbCBoYW5kbGVEZXF1ZXVlSW5wdXRCdWZmZXIodWludDMyX3QgcmVwbHlJRCwgYm9vbCBuZXdSZXF1ZXN0ID0gZmFsc2UpOwogICAgIGJvb2wgaGFuZGxlRGVxdWV1ZU91dHB1dEJ1ZmZlcih1aW50MzJfdCByZXBseUlELCBib29sIG5ld1JlcXVlc3QgPSBmYWxzZSk7CiAgICAgdm9pZCBjYW5jZWxQZW5kaW5nRGVxdWV1ZU9wZXJhdGlvbnMoKTsKQEAgLTI0NCw5ICsyOTUsMjggQEAKIAogICAgIHZvaWQgcG9zdEFjdGl2aXR5Tm90aWZpY2F0aW9uSWZQb3NzaWJsZSgpOwogCisgICAgdm9pZCBvbklucHV0QnVmZmVyQXZhaWxhYmxlKCk7CisgICAgdm9pZCBvbk91dHB1dEJ1ZmZlckF2YWlsYWJsZSgpOworICAgIHZvaWQgb25FcnJvcihzdGF0dXNfdCBlcnIsIGludDMyX3QgYWN0aW9uQ29kZSwgY29uc3QgY2hhciAqZGV0YWlsID0gTlVMTCk7CisgICAgdm9pZCBvbk91dHB1dEZvcm1hdENoYW5nZWQoKTsKKwogICAgIHN0YXR1c190IG9uU2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJnBhcmFtcyk7CiAKICAgICBzdGF0dXNfdCBhbWVuZE91dHB1dEZvcm1hdFdpdGhDb2RlY1NwZWNpZmljRGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKKyAgICB2b2lkIHVwZGF0ZUJhdHRlcnlTdGF0KCk7CisgICAgYm9vbCBpc0V4ZWN1dGluZygpIGNvbnN0OworCisgICAgLyogY2FsbGVkIHRvIGdldCB0aGUgbGFzdCBjb2RlYyBlcnJvciB3aGVuIHRoZSBzdGlja3kgZmxhZyBpcyBzZXQuCisgICAgICogaWYgbm8gc3VjaCBjb2RlYyBlcnJvciBpcyBmb3VuZCwgcmV0dXJucyBVTktOT1dOX0VSUk9SLgorICAgICAqLworICAgIGlubGluZSBzdGF0dXNfdCBnZXRTdGlja3lFcnJvcigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TdGlja3lFcnJvciAhPSAwID8gbVN0aWNreUVycm9yIDogVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBpbmxpbmUgdm9pZCBzZXRTdGlja3lFcnJvcihzdGF0dXNfdCBlcnIpIHsKKyAgICAgICAgbUZsYWdzIHw9IGtGbGFnU3RpY2t5RXJyb3I7CisgICAgICAgIG1TdGlja3lFcnJvciA9IGVycjsKKyAgICB9CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZWRpYUNvZGVjKTsKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmgKaW5kZXggNTkwNjIzYi4uNjc3NTRmOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaApAQCAtMjAsNzAgKzIwLDcyIEBACiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhQ29kZWNMaXN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNJbmZvLmg+CiAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgTWVkaWFDb2RlY0xpc3QgewotICAgIHN0YXRpYyBjb25zdCBNZWRpYUNvZGVjTGlzdCAqZ2V0SW5zdGFuY2UoKTsKK3N0cnVjdCBBTWVzc2FnZTsKIAotICAgIHNzaXplX3QgZmluZENvZGVjQnlUeXBlKAorc3RydWN0IE1lZGlhQ29kZWNMaXN0IDogcHVibGljIEJuTWVkaWFDb2RlY0xpc3QgeworICAgIHN0YXRpYyBzcDxJTWVkaWFDb2RlY0xpc3Q+IGdldEluc3RhbmNlKCk7CisKKyAgICB2aXJ0dWFsIHNzaXplX3QgZmluZENvZGVjQnlUeXBlKAogICAgICAgICAgICAgY29uc3QgY2hhciAqdHlwZSwgYm9vbCBlbmNvZGVyLCBzaXplX3Qgc3RhcnRJbmRleCA9IDApIGNvbnN0OwogCi0gICAgc3NpemVfdCBmaW5kQ29kZWNCeU5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3Q7CisgICAgdmlydHVhbCBzc2l6ZV90IGZpbmRDb2RlY0J5TmFtZShjb25zdCBjaGFyICpuYW1lKSBjb25zdDsKIAotICAgIHNpemVfdCBjb3VudENvZGVjcygpIGNvbnN0OwotICAgIGNvbnN0IGNoYXIgKmdldENvZGVjTmFtZShzaXplX3QgaW5kZXgpIGNvbnN0OwotICAgIGJvb2wgaXNFbmNvZGVyKHNpemVfdCBpbmRleCkgY29uc3Q7Ci0gICAgYm9vbCBjb2RlY0hhc1F1aXJrKHNpemVfdCBpbmRleCwgY29uc3QgY2hhciAqcXVpcmtOYW1lKSBjb25zdDsKKyAgICB2aXJ0dWFsIHNpemVfdCBjb3VudENvZGVjcygpIGNvbnN0OwogCi0gICAgc3RhdHVzX3QgZ2V0U3VwcG9ydGVkVHlwZXMoc2l6ZV90IGluZGV4LCBWZWN0b3I8QVN0cmluZz4gKnR5cGVzKSBjb25zdDsKKyAgICB2aXJ0dWFsIHNwPE1lZGlhQ29kZWNJbmZvPiBnZXRDb2RlY0luZm8oc2l6ZV90IGluZGV4KSBjb25zdCB7CisgICAgICAgIGlmIChpbmRleCA+PSBtQ29kZWNJbmZvcy5zaXplKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJiLzI0NDQ1MTI3Iik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUNvZGVjSW5mb3MuaXRlbUF0KGluZGV4KTsKKyAgICB9CiAKLSAgICBzdHJ1Y3QgUHJvZmlsZUxldmVsIHsKLSAgICAgICAgdWludDMyX3QgbVByb2ZpbGU7Ci0gICAgICAgIHVpbnQzMl90IG1MZXZlbDsKLSAgICB9OwotICAgIHN0YXR1c190IGdldENvZGVjQ2FwYWJpbGl0aWVzKAotICAgICAgICAgICAgc2l6ZV90IGluZGV4LCBjb25zdCBjaGFyICp0eXBlLAotICAgICAgICAgICAgVmVjdG9yPFByb2ZpbGVMZXZlbD4gKnByb2ZpbGVMZXZlbHMsCi0gICAgICAgICAgICBWZWN0b3I8dWludDMyX3Q+ICpjb2xvckZvcm1hdHMsCi0gICAgICAgICAgICB1aW50MzJfdCAqZmxhZ3MpIGNvbnN0OworICAgIC8vIHRvIGJlIHVzZWQgYnkgTWVkaWFQbGF5ZXJTZXJ2aWNlIGFsb25lCisgICAgc3RhdGljIHNwPElNZWRpYUNvZGVjTGlzdD4gZ2V0TG9jYWxJbnN0YW5jZSgpOwogCiBwcml2YXRlOgogICAgIGVudW0gU2VjdGlvbiB7CiAgICAgICAgIFNFQ1RJT05fVE9QTEVWRUwsCiAgICAgICAgIFNFQ1RJT05fREVDT0RFUlMsCiAgICAgICAgIFNFQ1RJT05fREVDT0RFUiwKKyAgICAgICAgU0VDVElPTl9ERUNPREVSX1RZUEUsCiAgICAgICAgIFNFQ1RJT05fRU5DT0RFUlMsCiAgICAgICAgIFNFQ1RJT05fRU5DT0RFUiwKKyAgICAgICAgU0VDVElPTl9FTkNPREVSX1RZUEUsCisgICAgICAgIFNFQ1RJT05fSU5DTFVERSwKICAgICB9OwogCi0gICAgc3RydWN0IENvZGVjSW5mbyB7Ci0gICAgICAgIEFTdHJpbmcgbU5hbWU7Ci0gICAgICAgIGJvb2wgbUlzRW5jb2RlcjsKLSAgICAgICAgdWludDMyX3QgbVR5cGVzOwotICAgICAgICB1aW50MzJfdCBtUXVpcmtzOwotICAgIH07Ci0KLSAgICBzdGF0aWMgTWVkaWFDb2RlY0xpc3QgKnNDb2RlY0xpc3Q7CisgICAgc3RhdGljIHNwPElNZWRpYUNvZGVjTGlzdD4gc0NvZGVjTGlzdDsKKyAgICBzdGF0aWMgc3A8SU1lZGlhQ29kZWNMaXN0PiBzUmVtb3RlTGlzdDsKIAogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CiAgICAgU2VjdGlvbiBtQ3VycmVudFNlY3Rpb247CisgICAgVmVjdG9yPFNlY3Rpb24+IG1QYXN0U2VjdGlvbnM7CiAgICAgaW50MzJfdCBtRGVwdGg7CisgICAgQVN0cmluZyBtSHJlZkJhc2U7CiAKLSAgICBWZWN0b3I8Q29kZWNJbmZvPiBtQ29kZWNJbmZvczsKLSAgICBLZXllZFZlY3RvcjxBU3RyaW5nLCBzaXplX3Q+IG1Db2RlY1F1aXJrczsKLSAgICBLZXllZFZlY3RvcjxBU3RyaW5nLCBzaXplX3Q+IG1UeXBlczsKKyAgICBWZWN0b3I8c3A8TWVkaWFDb2RlY0luZm8+ID4gbUNvZGVjSW5mb3M7CisgICAgc3A8TWVkaWFDb2RlY0luZm8+IG1DdXJyZW50SW5mbzsKKyAgICBzcDxJT01YPiBtT01YOwogCiAgICAgTWVkaWFDb2RlY0xpc3QoKTsKICAgICB+TWVkaWFDb2RlY0xpc3QoKTsKIAogICAgIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OwotICAgIHZvaWQgcGFyc2VYTUxGaWxlKEZJTEUgKmZpbGUpOworICAgIHZvaWQgcGFyc2VYTUxGaWxlKGNvbnN0IGNoYXIgKnBhdGgpOworICAgIHZvaWQgcGFyc2VUb3BMZXZlbFhNTEZpbGUoY29uc3QgY2hhciAqcGF0aCk7CiAKICAgICBzdGF0aWMgdm9pZCBTdGFydEVsZW1lbnRIYW5kbGVyV3JhcHBlcigKICAgICAgICAgICAgIHZvaWQgKm1lLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqYXR0cnMpOwpAQCAtOTMsMTMgKzk1LDE4IEBACiAgICAgdm9pZCBzdGFydEVsZW1lbnRIYW5kbGVyKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKiphdHRycyk7CiAgICAgdm9pZCBlbmRFbGVtZW50SGFuZGxlcihjb25zdCBjaGFyICpuYW1lKTsKIAorICAgIHN0YXR1c190IGluY2x1ZGVYTUxGaWxlKGNvbnN0IGNoYXIgKiphdHRycyk7CiAgICAgc3RhdHVzX3QgYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzKGJvb2wgZW5jb2RlciwgY29uc3QgY2hhciAqKmF0dHJzKTsKICAgICB2b2lkIGFkZE1lZGlhQ29kZWMoYm9vbCBlbmNvZGVyLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp0eXBlID0gTlVMTCk7CiAKICAgICBzdGF0dXNfdCBhZGRRdWlyayhjb25zdCBjaGFyICoqYXR0cnMpOwogICAgIHN0YXR1c190IGFkZFR5cGVGcm9tQXR0cmlidXRlcyhjb25zdCBjaGFyICoqYXR0cnMpOworICAgIHN0YXR1c190IGFkZExpbWl0KGNvbnN0IGNoYXIgKiphdHRycyk7CisgICAgc3RhdHVzX3QgYWRkRmVhdHVyZShjb25zdCBjaGFyICoqYXR0cnMpOwogICAgIHZvaWQgYWRkVHlwZShjb25zdCBjaGFyICpuYW1lKTsKIAorICAgIHN0YXR1c190IGluaXRpYWxpemVDYXBhYmlsaXRpZXMoY29uc3QgY2hhciAqdHlwZSk7CisKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZWRpYUNvZGVjTGlzdCk7CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MjljOGIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuaApAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTWVkaWFDb2RlY1NvdXJjZV9IXworI2RlZmluZSBNZWRpYUNvZGVjU291cmNlX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlclJlZmxlY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQUxvb3BlcjsKK2NsYXNzIEFNZXNzYWdlOworY2xhc3MgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK2NsYXNzIE1lZGlhQ29kZWM7CitjbGFzcyBNZXRhRGF0YTsKKworc3RydWN0IE1lZGlhQ29kZWNTb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBNZWRpYUJ1ZmZlck9ic2VydmVyIHsKKyAgICBlbnVtIEZsYWdCaXRzIHsKKyAgICAgICAgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCAgICAgID0gMSwKKyAgICAgICAgRkxBR19VU0VfTUVUQURBVEFfSU5QVVQgICAgID0gMiwKKyAgICB9OworCisgICAgc3RhdGljIHNwPE1lZGlhQ29kZWNTb3VyY2U+IENyZWF0ZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlLAorICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKKworICAgIGJvb2wgaXNWaWRlbygpIGNvbnN0IHsgcmV0dXJuIG1Jc1ZpZGVvOyB9CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gZ2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VyKCk7CisKKyAgICAvLyBNZWRpYVNvdXJjZQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKKyAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKSB7IHJldHVybiBtTWV0YTsgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLAorICAgICAgICAgICAgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKworICAgIC8vIE1lZGlhQnVmZmVyT2JzZXJ2ZXIKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CisKKyAgICAvLyBmb3IgQUhhbmRsZXJSZWZsZWN0b3IKKyAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfk1lZGlhQ29kZWNTb3VyY2UoKTsKKworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgUHVsbGVyOworCisgICAgZW51bSB7CisgICAgICAgIGtXaGF0UHVsbGVyTm90aWZ5LAorICAgICAgICBrV2hhdEVuY29kZXJBY3Rpdml0eSwKKyAgICAgICAga1doYXRTdGFydCwKKyAgICAgICAga1doYXRTdG9wLAorICAgICAgICBrV2hhdFBhdXNlLAorICAgIH07CisKKyAgICBNZWRpYUNvZGVjU291cmNlKAorICAgICAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UsCisgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOworCisgICAgc3RhdHVzX3Qgb25TdGFydChNZXRhRGF0YSAqcGFyYW1zKTsKKyAgICBzdGF0dXNfdCBpbml0KCk7CisgICAgc3RhdHVzX3QgaW5pdEVuY29kZXIoKTsKKyAgICB2b2lkIHJlbGVhc2VFbmNvZGVyKCk7CisgICAgc3RhdHVzX3QgZmVlZEVuY29kZXJJbnB1dEJ1ZmZlcnMoKTsKKyAgICB2b2lkIHNjaGVkdWxlRG9Nb3JlV29yaygpOworICAgIHN0YXR1c190IGRvTW9yZVdvcmsoaW50MzJfdCBudW1JbnB1dCwgaW50MzJfdCBudW1PdXRwdXQpOworICAgIHZvaWQgc3VzcGVuZCgpOworICAgIHZvaWQgcmVzdW1lKGludDY0X3Qgc2tpcEZyYW1lc0JlZm9yZVVzID0gLTFsbCk7CisgICAgdm9pZCBzaWduYWxFT1Moc3RhdHVzX3QgZXJyID0gRVJST1JfRU5EX09GX1NUUkVBTSk7CisgICAgYm9vbCByZWFjaGVkRU9TKCk7CisgICAgc3RhdHVzX3QgcG9zdFN5bmNocm9ub3VzbHlBbmRSZXR1cm5FcnJvcihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKKyAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOworICAgIHNwPEFMb29wZXI+IG1Db2RlY0xvb3BlcjsKKyAgICBzcDxBSGFuZGxlclJlZmxlY3RvcjxNZWRpYUNvZGVjU291cmNlPiA+IG1SZWZsZWN0b3I7CisgICAgc3A8QU1lc3NhZ2U+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3A8TWV0YURhdGE+IG1NZXRhOworICAgIHNwPFB1bGxlcj4gbVB1bGxlcjsKKyAgICBzcDxNZWRpYUNvZGVjPiBtRW5jb2RlcjsKKyAgICB1aW50MzJfdCBtRmxhZ3M7CisgICAgTGlzdDx1aW50MzJfdD4gbVN0b3BSZXBseUlEUXVldWU7CisgICAgYm9vbCBtSXNWaWRlbzsKKyAgICBib29sIG1TdGFydGVkOworICAgIGJvb2wgbVN0b3BwaW5nOworICAgIGJvb2wgbURvTW9yZVdvcmtQZW5kaW5nOworICAgIHNwPEFNZXNzYWdlPiBtRW5jb2RlckFjdGl2aXR5Tm90aWZ5OworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG1HcmFwaGljQnVmZmVyUHJvZHVjZXI7CisgICAgVmVjdG9yPHNwPEFCdWZmZXI+ID4gbUVuY29kZXJJbnB1dEJ1ZmZlcnM7CisgICAgVmVjdG9yPHNwPEFCdWZmZXI+ID4gbUVuY29kZXJPdXRwdXRCdWZmZXJzOworICAgIExpc3Q8TWVkaWFCdWZmZXIgKj4gbUlucHV0QnVmZmVyUXVldWU7CisgICAgTGlzdDxzaXplX3Q+IG1BdmFpbEVuY29kZXJJbnB1dEluZGljZXM7CisgICAgTGlzdDxpbnQ2NF90PiBtRGVjb2RpbmdUaW1lUXVldWU7IC8vIGRlY29kaW5nIHRpbWUgKHVzKSBmb3IgdmlkZW8KKworICAgIC8vIGF1ZGlvIGRyaWZ0IHRpbWUKKyAgICBpbnQ2NF90IG1GaXJzdFNhbXBsZVRpbWVVczsKKyAgICBMaXN0PGludDY0X3Q+IG1EcmlmdFRpbWVRdWV1ZTsKKworICAgIC8vIGZvbGxvd2luZyB2YXJpYWJsZXMgYXJlIHByb3RlY3RlZCBieSBtT3V0cHV0QnVmZmVyTG9jaworICAgIE11dGV4IG1PdXRwdXRCdWZmZXJMb2NrOworICAgIENvbmRpdGlvbiBtT3V0cHV0QnVmZmVyQ29uZDsKKyAgICBMaXN0PE1lZGlhQnVmZmVyKj4gbU91dHB1dEJ1ZmZlclF1ZXVlOworICAgIGJvb2wgbUVuY29kZXJSZWFjaGVkRU9TOworICAgIHN0YXR1c190IG1FcnJvckNvZGU7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZWRpYUNvZGVjU291cmNlKTsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8qIE1lZGlhQ29kZWNTb3VyY2VfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oCmluZGV4IGNmNWJlZGEuLmU2N2Q0ZDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaApAQCAtMjUsNiArMjUsNyBAQAogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1ZQODsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19WUDk7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fQVZDOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkM7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQ7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MzsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMjsKQEAgLTM4LDYgKzM5LDcgQEAKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUM7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fUUNFTFA7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX09QVVM7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9BTEFXOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVzsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19SQVc7CkBAIC01OCw2ICs2MCw4IEBACiAKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9URVhUXzNHUFA7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVEVYVF9TVUJSSVA7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVEVYVF9WVFQ7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVEVYVF9DRUFfNjA4OwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmgKaW5kZXggNjg2ZjI4Ni4uMmU2NjNlYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaApAQCAtMjMsNiArMjMsMTggQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogZW51bSB7CisgICAgLy8gc3RhdHVzX3QgbWFwIGZvciBlcnJvcnMgaW4gdGhlIG1lZGlhIGZyYW1ld29yaworICAgIC8vIE9LIG9yIE5PX0VSUk9SIG9yIDAgcmVwcmVzZW50cyBubyBlcnJvci4KKworICAgIC8vIFNlZSBzeXN0ZW0vY29yZS9pbmNsdWRlL3V0aWxzL0Vycm9ycy5oCisgICAgLy8gU3lzdGVtIHN0YW5kYXJkIGVycm9ycyBmcm9tIC0xIHRocm91Z2ggKHBvc3NpYmx5KSAtMTMzCisgICAgLy8KKyAgICAvLyBFcnJvcnMgd2l0aCBzcGVjaWFsIG1lYW5pbmdzIGFuZCBzaWRlIGVmZmVjdHMuCisgICAgLy8gSU5WQUxJRF9PUEVSQVRJT046ICBPcGVyYXRpb24gYXR0ZW1wdGVkIGluIGFuIGlsbGVnYWwgc3RhdGUgKHdpbGwgdHJ5IHRvIHNpZ25hbCB0byBhcHApLgorICAgIC8vIERFQURfT0JKRUNUOiAgICAgICAgU2lnbmFsIGZyb20gQ29kZWNCYXNlIHRvIE1lZGlhQ29kZWMgdGhhdCBNZWRpYVNlcnZlciBoYXMgZGllZC4KKyAgICAvLyBOQU1FX05PVF9GT1VORDogICAgIFNpZ25hbCBmcm9tIENvZGVjQmFzZSB0byBNZWRpYUNvZGVjIHRoYXQgdGhlIGNvbXBvbmVudCB3YXMgbm90IGZvdW5kLgorCisgICAgLy8gTWVkaWEgZXJyb3JzCiAgICAgTUVESUFfRVJST1JfQkFTRSAgICAgICAgPSAtMTAwMCwKIAogICAgIEVSUk9SX0FMUkVBRFlfQ09OTkVDVEVEID0gTUVESUFfRVJST1JfQkFTRSwKQEAgLTQ2LDI2ICs1OCw1NCBAQAogICAgIC8vIGRybS9kcm1fZnJhbWV3b3JrX2NvbW1vbi5oCiAgICAgRFJNX0VSUk9SX0JBU0UgPSAtMjAwMCwKIAotICAgIEVSUk9SX0RSTV9VTktOT1dOICAgICAgICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFLAotICAgIEVSUk9SX0RSTV9OT19MSUNFTlNFICAgICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMSwKLSAgICBFUlJPUl9EUk1fTElDRU5TRV9FWFBJUkVEICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDIsCi0gICAgRVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRCAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAzLAotICAgIEVSUk9SX0RSTV9ERUNSWVBUX1VOSVRfTk9UX0lOSVRJQUxJWkVEICA9IERSTV9FUlJPUl9CQVNFIC0gNCwKLSAgICBFUlJPUl9EUk1fREVDUllQVCAgICAgICAgICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDUsCi0gICAgRVJST1JfRFJNX0NBTk5PVF9IQU5ETEUgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSA2LAotICAgIEVSUk9SX0RSTV9UQU1QRVJfREVURUNURUQgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gNywKLSAgICBFUlJPUl9EUk1fTk9UX1BST1ZJU0lPTkVEICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDgsCi0gICAgRVJST1JfRFJNX0RFVklDRV9SRVZPS0VEICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSA5LAotICAgIEVSUk9SX0RSTV9SRVNPVVJDRV9CVVNZICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMTAsCisgICAgRVJST1JfRFJNX1VOS05PV04gICAgICAgICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFLAorICAgIEVSUk9SX0RSTV9OT19MSUNFTlNFICAgICAgICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDEsCisgICAgRVJST1JfRFJNX0xJQ0VOU0VfRVhQSVJFRCAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMiwKKyAgICBFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAzLAorICAgIEVSUk9SX0RSTV9ERUNSWVBUX1VOSVRfTk9UX0lOSVRJQUxJWkVEICAgPSBEUk1fRVJST1JfQkFTRSAtIDQsCisgICAgRVJST1JfRFJNX0RFQ1JZUFQgICAgICAgICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gNSwKKyAgICBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSAgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSA2LAorICAgIEVSUk9SX0RSTV9UQU1QRVJfREVURUNURUQgICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDcsCisgICAgRVJST1JfRFJNX05PVF9QUk9WSVNJT05FRCAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gOCwKKyAgICBFUlJPUl9EUk1fREVWSUNFX1JFVk9LRUQgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSA5LAorICAgIEVSUk9SX0RSTV9SRVNPVVJDRV9CVVNZICAgICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDEwLAorICAgIEVSUk9SX0RSTV9JTlNVRkZJQ0lFTlRfT1VUUFVUX1BST1RFQ1RJT04gPSBEUk1fRVJST1JfQkFTRSAtIDExLAorICAgIEVSUk9SX0RSTV9MQVNUX1VTRURfRVJST1JDT0RFICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDExLAogCi0gICAgRVJST1JfRFJNX1ZFTkRPUl9NQVggICAgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSA1MDAsCi0gICAgRVJST1JfRFJNX1ZFTkRPUl9NSU4gICAgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSA5OTksCisgICAgRVJST1JfRFJNX1ZFTkRPUl9NQVggICAgICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gNTAwLAorICAgIEVSUk9SX0RSTV9WRU5ET1JfTUlOICAgICAgICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDk5OSwKIAogICAgIC8vIEhlYXJ0YmVhdCBFcnJvciBDb2RlcwogICAgIEhFQVJUQkVBVF9FUlJPUl9CQVNFID0gLTMwMDAsCiAgICAgRVJST1JfSEVBUlRCRUFUX1RFUk1JTkFURV9SRVFVRVNURUQgICAgICAgICAgICAgICAgICAgICA9IEhFQVJUQkVBVF9FUlJPUl9CQVNFLAorCisgICAgLy8gTkRLIEVycm9yIGNvZGVzCisgICAgLy8gZnJhbWV3b3Jrcy9hdi9pbmNsdWRlL25kay9OZGtNZWRpYUVycm9yLmgKKyAgICAvLyBmcm9tIC0xMDAwMCAoMHhGRkZGRDhGMCAtIDB4RkZGRkQ4RUMpCisgICAgLy8gZnJvbSAtMjAwMDAgKDB4RkZGRkIxRTAgLSAweEZGRkZCMUQ3KQorCisgICAgLy8gQ29kZWMgZXJyb3JzIGFyZSBwZXJtaXR0ZWQgZnJvbSAweDgwMDAxMDAwIHRocm91Z2ggMHg5MDAwRkZGRgorICAgIEVSUk9SX0NPREVDX01BWCAgICA9IChzaWduZWQpMHg5MDAwRkZGRiwKKyAgICBFUlJPUl9DT0RFQ19NSU4gICAgPSAoc2lnbmVkKTB4ODAwMDEwMDAsCisKKyAgICAvLyBTeXN0ZW0gdW5rbm93biBlcnJvcnMgZnJvbSAweDgwMDAwMDAwIC0gMHg4MDAwMDAwNyAoSU5UMzJfTUlOICsgNykKKyAgICAvLyBTZWUgc3lzdGVtL2NvcmUvaW5jbHVkZS91dGlscy9FcnJvcnMuaAogfTsKIAorLy8gYWN0aW9uIGNvZGVzIGZvciBNZWRpYUNvZGVjcyB0aGF0IHRlbGwgdGhlIHVwcGVyIGxheWVyIGFuZCBhcHBsaWNhdGlvbgorLy8gdGhlIHNldmVyaXR5IG9mIGFueSBlcnJvci4KK2VudW0gQWN0aW9uQ29kZSB7CisgICAgQUNUSU9OX0NPREVfRkFUQUwsCisgICAgQUNUSU9OX0NPREVfVFJBTlNJRU5ULAorICAgIEFDVElPTl9DT0RFX1JFQ09WRVJBQkxFLAorfTsKKworLy8gcmV0dXJucyB0cnVlIGlmIGVyciBpcyBhIHJlY29nbml6ZWQgRFJNIGVycm9yIGNvZGUKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0NyeXB0b0Vycm9yKHN0YXR1c190IGVycikgeworICAgIHJldHVybiAoRVJST1JfRFJNX0xBU1RfVVNFRF9FUlJPUkNPREUgPD0gZXJyICYmIGVyciA8PSBFUlJPUl9EUk1fVU5LTk9XTikKKyAgICAgICAgICAgIHx8IChFUlJPUl9EUk1fVkVORE9SX01JTiA8PSBlcnIgJiYgZXJyIDw9IEVSUk9SX0RSTV9WRU5ET1JfTUFYKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBNRURJQV9FUlJPUlNfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaAppbmRleCAzMDc2YTk2Li4xODM5MzNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oCkBAIC02NSw2ICs2NSw4IEBACiAgICAgdmlydHVhbCBjaGFyKiBnZXREcm1UcmFja0luZm8oc2l6ZV90IHRyYWNrSUQsIGludCAqbGVuKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KKyAgICB2aXJ0dWFsIHZvaWQgc2V0VUlEKHVpZF90IHVpZCkgeworICAgIH0KIAogcHJvdGVjdGVkOgogICAgIE1lZGlhRXh0cmFjdG9yKCkgOiBtSXNEcm0oZmFsc2UpIHt9CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDZkOGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaApAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9IVFRQX0hfCisKKyNkZWZpbmUgTUVESUFfSFRUUF9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisKKyNpbmNsdWRlICJpbmNsdWRlL0hUVFBCYXNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IElNZWRpYUhUVFBDb25uZWN0aW9uOworCitzdHJ1Y3QgTWVkaWFIVFRQIDogcHVibGljIEhUVFBCYXNlIHsKKyAgICBNZWRpYUhUVFAoY29uc3Qgc3A8SU1lZGlhSFRUUENvbm5lY3Rpb24+ICZjb25uKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgY29ubmVjdCgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAorICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQpOworCisgICAgdmlydHVhbCB2b2lkIGRpc2Nvbm5lY3QoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7CisKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlY29ubmVjdEF0T2Zmc2V0KG9mZjY0X3Qgb2Zmc2V0KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfk1lZGlhSFRUUCgpOworCisgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBEcm1Jbml0aWFsaXphdGlvbihjb25zdCBjaGFyKiBtaW1lKTsKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0RHJtSW5mbyhzcDxEZWNyeXB0SGFuZGxlPiAmaGFuZGxlLCBEcm1NYW5hZ2VyQ2xpZW50ICoqY2xpZW50KTsKKyAgICB2aXJ0dWFsIFN0cmluZzggZ2V0VXJpKCk7CisgICAgdmlydHVhbCBTdHJpbmc4IGdldE1JTUVUeXBlKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKKyAgICBzcDxJTWVkaWFIVFRQQ29ubmVjdGlvbj4gbUhUVFBDb25uZWN0aW9uOworCisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbUxhc3RIZWFkZXJzOworICAgIEFTdHJpbmcgbUxhc3RVUkk7CisKKyAgICBib29sIG1DYWNoZWRTaXplVmFsaWQ7CisgICAgb2ZmNjRfdCBtQ2FjaGVkU2l6ZTsKKworICAgIHNwPERlY3J5cHRIYW5kbGU+IG1EZWNyeXB0SGFuZGxlOworICAgIERybU1hbmFnZXJDbGllbnQgKm1Ecm1NYW5hZ2VyQ2xpZW50OworCisgICAgdm9pZCBjbGVhckRSTVN0YXRlX2woKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lZGlhSFRUUCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1FRElBX0hUVFBfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmgKaW5kZXggZmY2YTY2ZS4uYmJlNDMwMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmgKQEAgLTMwLDcgKzMwLDcgQEAKIHN0cnVjdCBNZWRpYUJ1ZmZlcjsKIHN0cnVjdCBNZWRpYVNvdXJjZTsKIHN0cnVjdCBNZXRhRGF0YTsKLXN0cnVjdCBNUEVHNFdyaXRlcjsKK3N0cnVjdCBNZWRpYVdyaXRlcjsKIAogLy8gTWVkaWFNdXhlciBpcyB1c2VkIHRvIG11eCBtdWx0aXBsZSB0cmFja3MgaW50byBhIHZpZGVvLiBDdXJyZW50bHksIHdlIG9ubHkKIC8vIHN1cHBvcnQgYSBtcDQgZmlsZSBhcyB0aGUgb3V0cHV0LgpAQCAtNDQsNiArNDQsNyBAQAogICAgIC8vIE91dHB1dEZvcm1hdCBpcyB1cGRhdGVkLgogICAgIGVudW0gT3V0cHV0Rm9ybWF0IHsKICAgICAgICAgT1VUUFVUX0ZPUk1BVF9NUEVHXzQgPSAwLAorICAgICAgICBPVVRQVVRfRk9STUFUX1dFQk0gICA9IDEsCiAgICAgICAgIE9VVFBVVF9GT1JNQVRfTElTVF9FTkQgLy8gbXVzdCBiZSBsYXN0IC0gdXNlZCB0byB2YWxpZGF0ZSBmb3JtYXQgdHlwZQogICAgIH07CiAKQEAgLTExNSw3ICsxMTYsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcywgdWludDMyX3QgZmxhZ3MpIDsKIAogcHJpdmF0ZToKLSAgICBzcDxNUEVHNFdyaXRlcj4gbVdyaXRlcjsKKyAgICBjb25zdCBPdXRwdXRGb3JtYXQgbUZvcm1hdDsKKyAgICBzcDxNZWRpYVdyaXRlcj4gbVdyaXRlcjsKICAgICBWZWN0b3I8IHNwPE1lZGlhQWRhcHRlcj4gPiBtVHJhY2tMaXN0OyAgLy8gRWFjaCB0cmFjayBoYXMgaXRzIE1lZGlhQWRhcHRlci4KICAgICBzcDxNZXRhRGF0YT4gbUZpbGVNZXRhOyAgLy8gTWV0YWRhdGEgZm9yIHRoZSB3aG9sZSBmaWxlLgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmgKaW5kZXggMzgxOGU2My4uYTY1M2RiOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaApAQCAtODIsNiArODIsMTAgQEAKICAgICAgICAgdm9pZCBzZXRMYXRlQnkoaW50NjRfdCBsYXRlbmVzc191cyk7CiAgICAgICAgIGludDY0X3QgZ2V0TGF0ZUJ5KCkgY29uc3Q7CiAKKyAgICAgICAgdm9pZCBzZXROb25CbG9ja2luZygpOworICAgICAgICB2b2lkIGNsZWFyTm9uQmxvY2tpbmcoKTsKKyAgICAgICAgYm9vbCBnZXROb25CbG9ja2luZygpIGNvbnN0OworCiAgICAgcHJpdmF0ZToKICAgICAgICAgZW51bSBPcHRpb25zIHsKICAgICAgICAgICAgIGtTZWVrVG9fT3B0aW9uICAgICAgPSAxLApAQCAtOTEsNiArOTUsNyBAQAogICAgICAgICBpbnQ2NF90IG1TZWVrVGltZVVzOwogICAgICAgICBTZWVrTW9kZSBtU2Vla01vZGU7CiAgICAgICAgIGludDY0X3QgbUxhdGVuZXNzVXM7CisgICAgICAgIGJvb2wgbU5vbkJsb2NraW5nOwogICAgIH07CiAKICAgICAvLyBDYXVzZXMgdGhpcyBzb3VyY2UgdG8gc3VzcGVuZCBwdWxsaW5nIGRhdGEgZnJvbSBpdHMgdXBzdHJlYW0gc291cmNlCkBAIC0xMDUsNyArMTEwLDcgQEAKICAgICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIGFmdGVyIGEgc3VjY2Vzc2Z1bCBzdGFydCgpIGFuZCBiZWZvcmUgdGhlCiAgICAgLy8gZmlyc3QgcmVhZCgpIGNhbGwuCiAgICAgLy8gQ2FsbGVlIGFzc3VtZXMgb3duZXJzaGlwIG9mIHRoZSBidWZmZXJzIGlmIG5vIGVycm9yIGlzIHJldHVybmVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QnVmZmVycyhjb25zdCBWZWN0b3I8TWVkaWFCdWZmZXIgKj4gJmJ1ZmZlcnMpIHsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlcnMoY29uc3QgVmVjdG9yPE1lZGlhQnVmZmVyICo+ICYgLyogYnVmZmVycyAqLykgewogICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhV3JpdGVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhV3JpdGVyLmgKaW5kZXggNWNjOGRjZi4uZTI3ZWExZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYVdyaXRlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFXcml0ZXIuaApAQCAtNDgsNiArNDgsOSBAQAogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCisgICAgdmlydHVhbCB2b2lkIHNldFN0YXJ0VGltZU9mZnNldE1zKGludCBtcykge30KKyAgICB2aXJ0dWFsIGludDMyX3QgZ2V0U3RhcnRUaW1lT2Zmc2V0TXMoKSBjb25zdCB7IHJldHVybiAwOyB9CisKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5NZWRpYVdyaXRlcigpIHt9CiAgICAgaW50NjRfdCBtTWF4RmlsZVNpemVMaW1pdEJ5dGVzOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oCmluZGV4IGY1MWMxMmQuLjNmNDI3OTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmgKQEAgLTUzLDkgKzUzLDEzIEBACiAgICAga0tleUVTRFMgICAgICAgICAgICAgID0gJ2VzZHMnLCAgLy8gcmF3IGRhdGEKICAgICBrS2V5QUFDUHJvZmlsZSAgICAgICAgPSAnYWFjcCcsICAvLyBpbnQzMl90CiAgICAga0tleUFWQ0MgICAgICAgICAgICAgID0gJ2F2Y2MnLCAgLy8gcmF3IGRhdGEKKyAgICBrS2V5SFZDQyAgICAgICAgICAgICAgPSAnaHZjYycsICAvLyByYXcgZGF0YQogICAgIGtLZXlEMjYzICAgICAgICAgICAgICA9ICdkMjYzJywgIC8vIHJhdyBkYXRhCiAgICAga0tleVZvcmJpc0luZm8gICAgICAgID0gJ3ZpbmYnLCAgLy8gcmF3IGRhdGEKICAgICBrS2V5Vm9yYmlzQm9va3MgICAgICAgPSAndmJvbycsICAvLyByYXcgZGF0YQorICAgIGtLZXlPcHVzSGVhZGVyICAgICAgICA9ICdvaGRyJywgIC8vIHJhdyBkYXRhCisgICAga0tleU9wdXNDb2RlY0RlbGF5ICAgID0gJ29jb2QnLCAgLy8gdWludDY0X3QgKGNvZGVjIGRlbGF5IGluIG5zKQorICAgIGtLZXlPcHVzU2Vla1ByZVJvbGwgICA9ICdvc3ByJywgIC8vIHVpbnQ2NF90IChzZWVrIHByZXJvbGwgaW4gbnMpCiAgICAga0tleVdhbnRzTkFMRnJhZ21lbnRzID0gJ05BTGYnLAogICAgIGtLZXlJc1N5bmNGcmFtZSAgICAgICA9ICdzeW5jJywgIC8vIGludDMyX3QgKGJvb2wpCiAgICAga0tleUlzQ29kZWNDb25maWcgICAgID0gJ2NvbmYnLCAgLy8gaW50MzJfdCAoYm9vbCkKQEAgLTE2MiwxMSArMTY2LDE5IEBACiAgICAga0tleUNyeXB0b0RlZmF1bHRJVlNpemUgPSAnY3J5UycsICAvLyBpbnQzMl90CiAKICAgICBrS2V5UHNzaCAgICAgICAgICAgICAgPSAncHNzaCcsICAvLyByYXcgZGF0YQorCisgICAgLy8gUGxlYXNlIHNlZSBNZWRpYUZvcm1hdC5LRVlfSVNfQVVUT1NFTEVDVC4KKyAgICBrS2V5VHJhY2tJc0F1dG9zZWxlY3QgPSAnYXV0bycsIC8vIGJvb2wgKGludDMyX3QpCisgICAgLy8gUGxlYXNlIHNlZSBNZWRpYUZvcm1hdC5LRVlfSVNfREVGQVVMVC4KKyAgICBrS2V5VHJhY2tJc0RlZmF1bHQgICAgPSAnZGZsdCcsIC8vIGJvb2wgKGludDMyX3QpCisgICAgLy8gU2ltaWxhciB0byBNZWRpYUZvcm1hdC5LRVlfSVNfRk9SQ0VEX1NVQlRJVExFIGJ1dCBwZXJ0YWlucyB0byBhdiB0cmFja3MgYXMgd2VsbC4KKyAgICBrS2V5VHJhY2tJc0ZvcmNlZCAgICAgPSAnZnJjZCcsIC8vIGJvb2wgKGludDMyX3QpCiB9OwogCiBlbnVtIHsKICAgICBrVHlwZUVTRFMgICAgICAgID0gJ2VzZHMnLAogICAgIGtUeXBlQVZDQyAgICAgICAgPSAnYXZjYycsCisgICAga1R5cGVIVkNDICAgICAgICA9ICdodmNjJywKICAgICBrVHlwZUQyNjMgICAgICAgID0gJ2QyNjMnLAogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaAppbmRleCA1YWU2ZjZiLi40MDJlN2Y4IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaApAQCAtMzEsNiArMzEsNyBAQAogc3RydWN0IEFCdWZmZXI7CiBzdHJ1Y3QgQU1lc3NhZ2U7CiBzdHJ1Y3QgRGF0YVNvdXJjZTsKK3N0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKIHN0cnVjdCBNZWRpYUJ1ZmZlcjsKIHN0cnVjdCBNZWRpYUV4dHJhY3RvcjsKIHN0cnVjdCBNZWRpYVNvdXJjZTsKQEAgLTQ1LDYgKzQ2LDcgQEAKICAgICBOdU1lZGlhRXh0cmFjdG9yKCk7CiAKICAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsCiAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyA9IE5VTEwpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmgKaW5kZXggNTEyMWMxNy4uZTM0MTE2MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaApAQCAtMjgsNyArMjgsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBNZWRpYUNvZGVjTGlzdDsKK3N0cnVjdCBNZWRpYUNvZGVjSW5mbzsKIGNsYXNzIE1lbW9yeURlYWxlcjsKIHN0cnVjdCBPTVhDb2RlY09ic2VydmVyOwogc3RydWN0IENvZGVjUHJvZmlsZUxldmVsOwpAQCAtMTE1LDcgKzExNSw3IEBACiAgICAgICAgICAgICBWZWN0b3I8Q29kZWNOYW1lQW5kUXVpcmtzPiAqbWF0Y2hpbmdDb2RlY05hbWVzQW5kUXVpcmtzKTsKIAogICAgIHN0YXRpYyB1aW50MzJfdCBnZXRDb21wb25lbnRRdWlya3MoCi0gICAgICAgICAgICBjb25zdCBNZWRpYUNvZGVjTGlzdCAqbGlzdCwgc2l6ZV90IGluZGV4KTsKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiAmbGlzdCk7CiAKICAgICBzdGF0aWMgYm9vbCBmaW5kQ29kZWNRdWlya3MoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgdWludDMyX3QgKnF1aXJrcyk7CiAKQEAgLTM1Miw2ICszNTIsOSBAQAogCiAgICAgaW50NjRfdCBnZXREZWNvZGluZ1RpbWVVcygpOwogCisgICAgc3RhdHVzX3QgcGFyc2VIRVZDQ29kZWNTcGVjaWZpY0RhdGEoCisgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgIHVuc2lnbmVkICpwcm9maWxlLCB1bnNpZ25lZCAqbGV2ZWwpOwogICAgIHN0YXR1c190IHBhcnNlQVZDQ29kZWNTcGVjaWZpY0RhdGEoCiAgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwKICAgICAgICAgICAgIHVuc2lnbmVkICpwcm9maWxlLCB1bnNpZ25lZCAqbGV2ZWwpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Ta2lwQ3V0QnVmZmVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1NraXBDdXRCdWZmZXIuaAppbmRleCAyNjUzYjUzLi4wOThhYTY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1NraXBDdXRCdWZmZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1NraXBDdXRCdWZmZXIuaApAQCAtNDcsNiArNDcsNyBAQAogIHByaXZhdGU6CiAgICAgdm9pZCB3cml0ZShjb25zdCBjaGFyICpzcmMsIHNpemVfdCBudW0pOwogICAgIHNpemVfdCByZWFkKGNoYXIgKmRzdCwgc2l6ZV90IG51bSk7CisgICAgaW50MzJfdCBtU2tpcDsKICAgICBpbnQzMl90IG1Gcm9udFBhZGRpbmc7CiAgICAgaW50MzJfdCBtQmFja1BhZGRpbmc7CiAgICAgaW50MzJfdCBtV3JpdGVIZWFkOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5oCmluZGV4IDY1MTBhNTkuLmViM2FjY2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmgKQEAgLTMwLDcgKzMwLDcgQEAKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKm1pbWVUeXBlLAogICAgICAgICAgICAgTWVkaWFTY2FubmVyQ2xpZW50ICZjbGllbnQpOwogCi0gICAgdmlydHVhbCBjaGFyICpleHRyYWN0QWxidW1BcnQoaW50IGZkKTsKKyAgICB2aXJ0dWFsIE1lZGlhQWxidW1BcnQgKmV4dHJhY3RBbGJ1bUFydChpbnQgZmQpOwogCiBwcml2YXRlOgogICAgIFN0YWdlZnJpZ2h0TWVkaWFTY2FubmVyKGNvbnN0IFN0YWdlZnJpZ2h0TWVkaWFTY2FubmVyICYpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlTWVkaWFTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmgKaW5kZXggZGI1Zjk0Ny4uNDNiNzVmZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlTWVkaWFTb3VyY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VNZWRpYVNvdXJjZS5oCkBAIC0xMTEsNyArMTExLDcgQEAKICAgICAvLyBwYXNzIG1ldGFkYXRhIHRocm91Z2ggdGhlIGJ1ZmZlcnMuIEN1cnJlbnRseSwgaXQgaXMgZm9yY2Ugc2V0IHRvIHRydWUKICAgICBib29sIGlzTWV0YURhdGFTdG9yZWRJblZpZGVvQnVmZmVycygpIGNvbnN0OwogCi0gICAgc3A8QnVmZmVyUXVldWU+IGdldEJ1ZmZlclF1ZXVlKCkgY29uc3QgeyByZXR1cm4gbUJ1ZmZlclF1ZXVlOyB9CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gZ2V0UHJvZHVjZXIoKSBjb25zdCB7IHJldHVybiBtUHJvZHVjZXI7IH0KIAogICAgIC8vIFRvIGJlIGNhbGxlZCBiZWZvcmUgc3RhcnQoKQogICAgIHN0YXR1c190IHNldE1heEFjcXVpcmVkQnVmZmVyQ291bnQoc2l6ZV90IGNvdW50KTsKQEAgLTEzOSwxMiArMTM5LDE3IEBACiAgICAgLy8gZnJhbWVzIGlzIHNlcGFyYXRlIHRoYW4gdGhlIG9uZSBjYWxsaW5nIHN0b3AuCiAgICAgdmlydHVhbCB2b2lkIG9uQnVmZmVyc1JlbGVhc2VkKCk7CiAKKyAgICAvLyBTdXJmYWNlTWVkaWFTb3VyY2UgY2FuJ3QgaGFuZGxlIHNpZGViYW5kIHN0cmVhbXMsIHNvIHRoaXMgaXMgbm90IGV4cGVjdGVkCisgICAgLy8gdG8gZXZlciBiZSBjYWxsZWQuIERvZXMgbm90aGluZy4KKyAgICB2aXJ0dWFsIHZvaWQgb25TaWRlYmFuZFN0cmVhbUNoYW5nZWQoKTsKKwogICAgIHN0YXRpYyBib29sIGlzRXh0ZXJuYWxGb3JtYXQodWludDMyX3QgZm9ybWF0KTsKIAogcHJpdmF0ZToKLSAgICAvLyBtQnVmZmVyUXVldWUgaXMgdGhlIGV4Y2hhbmdlIHBvaW50IGJldHdlZW4gdGhlIHByb2R1Y2VyIGFuZAotICAgIC8vIHRoaXMgY29uc3VtZXIKLSAgICBzcDxCdWZmZXJRdWV1ZT4gbUJ1ZmZlclF1ZXVlOworICAgIC8vIEEgQnVmZmVyUXVldWUsIHJlcHJlc2VudGVkIGJ5IHRoZXNlIGludGVyZmFjZXMsIGlzIHRoZSBleGNoYW5nZSBwb2ludAorICAgIC8vIGJldHdlZW4gdGhlIHByb2R1Y2VyIGFuZCB0aGlzIGNvbnN1bWVyCisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbVByb2R1Y2VyOworICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IG1Db25zdW1lcjsKIAogICAgIHN0cnVjdCBTbG90RGF0YSB7CiAgICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IG1HcmFwaGljQnVmZmVyOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oCmluZGV4IGJiYWQyNzEuLmE3OTVjODAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmgKQEAgLTUzLDYgKzUzLDkgQEAKIC8vIENvbnZlcnQgYSBNSU1FIHR5cGUgdG8gYSBBdWRpb1N5c3RlbTo6YXVkaW9fZm9ybWF0CiBzdGF0dXNfdCBtYXBNaW1lVG9BdWRpb0Zvcm1hdChhdWRpb19mb3JtYXRfdCYgZm9ybWF0LCBjb25zdCBjaGFyKiBtaW1lKTsKIAorLy8gQ29udmVydCBhIGFhYyBwcm9maWxlIHRvIGEgQXVkaW9TeXN0ZW06OmF1ZGlvX2Zvcm1hdAordm9pZCBtYXBBQUNQcm9maWxlVG9BdWRpb0Zvcm1hdChhdWRpb19mb3JtYXRfdCYgZm9ybWF0LCB1aW50NjRfdCBlQWFjUHJvZmlsZSk7CisKIC8vIFNlbmQgaW5mb3JtYXRpb24gZnJvbSBNZXRhRGF0YSB0byB0aGUgSEFMIHZpYSBBdWRpb1NpbmsKIHN0YXR1c190IHNlbmRNZXRhRGF0YVRvSGFsKHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiYgc2luaywgY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhKTsKIApAQCAtNjAsNiArNjMsOCBAQAogYm9vbCBjYW5PZmZsb2FkU3RyZWFtKGNvbnN0IHNwPE1ldGFEYXRhPiYgbWV0YSwgYm9vbCBoYXNWaWRlbywKICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU3RyZWFtaW5nLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpOwogCitBU3RyaW5nIHVyaURlYnVnU3RyaW5nKGNvbnN0IEFTdHJpbmcgJnVyaSwgYm9vbCBpbmNvZ25pdG8gPSBmYWxzZSk7CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gVVRJTFNfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmgKaW5kZXggOWVjZWVhMy4uNzJlM2Q4NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmgKQEAgLTE4LDggKzE4LDM3IEBACiAKICNkZWZpbmUgQV9CQVNFX0hfCiAKKyNkZWZpbmUgQVJSQVlfU0laRShhKSAoc2l6ZW9mKGEpIC8gc2l6ZW9mKCooYSkpKQorCiAjZGVmaW5lIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKG5hbWUpIFwKICAgICBuYW1lKGNvbnN0IG5hbWUgJik7IFwKICAgICBuYW1lICZvcGVyYXRvcj0oY29uc3QgbmFtZSAmKQogCisvKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNpemUgcGFyYW1ldGVyIGlzIHNhZmUgZm9yIG5ldyBhcnJheSBhbGxvY2F0aW9uICgzMi1iaXQpCisgKgorICogRXhhbXBsZSB1c2FnZToKKyAqCisgKiBpZiAoIWlzU2FmZUFycmF5U2l6ZTx1aW50MzJfdD4oYXJyYXlTaXplKSkgeworICogICAgIHJldHVybiBCQURfVkFMVUU7CisgKiB9CisgKiAuLi4KKyAqIHVpbnQzMl90ICpteUFycmF5ID0gbmV3IHVpbnQzMl90W2FycmF5U2l6ZV07CisgKgorICogVGhlcmUgaXMgYSBidWcgaW4gZ2NjIHZlcnNpb25zIGVhcmxpZXIgdGhhbiA0Ljggd2hlcmUgdGhlIG5ld1tdIGFycmF5IGFsbG9jYXRpb24KKyAqIHdpbGwgb3ZlcmZsb3cgaW4gdGhlIGludGVybmFsIDMyIGJpdCBoZWFwIGFsbG9jYXRpb24sIHJlc3VsdGluZyBpbiBhbgorICogdW5kZXJhbGxvY2F0ZWQgYXJyYXkuIFRoaXMgaXMgYSBzZWN1cml0eSBpc3N1ZSB0aGF0IGFsbG93cyBwb3RlbnRpYWwgb3ZlcndyaXRpbmcKKyAqIG9mIG90aGVyIGhlYXAgZGF0YS4KKyAqCisgKiBBbiBhbHRlcm5hdGl2ZSB0byBjaGVja2luZyBpcyB0byBjcmVhdGUgYSBzYWZlIG5ldyBhcnJheSB0ZW1wbGF0ZSBmdW5jdGlvbiB3aGljaAorICogZWl0aGVyIHRocm93cyBhIHN0ZDo6YmFkX2FsbG9jIGV4Y2VwdGlvbiBvciByZXR1cm5zIE5VTEwvbnVsbHB0cl90OyBOVUxMIGNvbnNpZGVyZWQKKyAqIHNhZmUgc2luY2Ugbm9ybWFsIGFjY2VzcyBvZiBOVUxMIHRocm93cyBhbiBleGNlcHRpb24uCisgKgorICogaHR0cHM6Ly9zZWN1cml0eWJsb2cucmVkaGF0LmNvbS8yMDEyLzEwLzMxL2FycmF5LWFsbG9jYXRpb24taW4tY3h4LworICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUz4KK2Jvb2wgaXNTYWZlQXJyYXlTaXplKFMgc2l6ZSkgeworICAgIHJldHVybiBzaXplID49IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gY2FzZSBTIGlzIHNpZ25lZCwgaWdub3JlZCBpZiBub3QuCisgICAgICAgICAgICAmJiBzaXplIDw9IDB4ZmZmZmZmZmYgLyBzaXplb2YoVCk7ICAvLyBtYXgtdW5zaWduZWQtMzItYml0LWludCAvIGVsZW1lbnQtc2l6ZS4KK30KKwogI2VuZGlmICAvLyBBX0JBU0VfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oCmluZGV4IDU1MTBiMTIuLmMzYmYwZmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaApAQCAtMjUsOCArMjUsMTAgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgQUJpdFJlYWRlciB7CitjbGFzcyBBQml0UmVhZGVyIHsKK3B1YmxpYzoKICAgICBBQml0UmVhZGVyKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICB2aXJ0dWFsIH5BQml0UmVhZGVyKCk7CiAKICAgICB1aW50MzJfdCBnZXRCaXRzKHNpemVfdCBuKTsKICAgICB2b2lkIHNraXBCaXRzKHNpemVfdCBuKTsKQEAgLTM3LDE4ICszOSwzMiBAQAogCiAgICAgY29uc3QgdWludDhfdCAqZGF0YSgpIGNvbnN0OwogCi1wcml2YXRlOgorcHJvdGVjdGVkOgogICAgIGNvbnN0IHVpbnQ4X3QgKm1EYXRhOwogICAgIHNpemVfdCBtU2l6ZTsKIAogICAgIHVpbnQzMl90IG1SZXNlcnZvaXI7ICAvLyBsZWZ0LWFsaWduZWQgYml0cwogICAgIHNpemVfdCBtTnVtQml0c0xlZnQ7CiAKLSAgICB2b2lkIGZpbGxSZXNlcnZvaXIoKTsKKyAgICB2aXJ0dWFsIHZvaWQgZmlsbFJlc2Vydm9pcigpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQUJpdFJlYWRlcik7CiB9OwogCitjbGFzcyBOQUxCaXRSZWFkZXIgOiBwdWJsaWMgQUJpdFJlYWRlciB7CitwdWJsaWM6CisgICAgTkFMQml0UmVhZGVyKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKworICAgIGJvb2wgYXRMZWFzdE51bUJpdHNMZWZ0KHNpemVfdCBuKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBpbnQzMl90IG1OdW1aZXJvczsKKworICAgIHZpcnR1YWwgdm9pZCBmaWxsUmVzZXJ2b2lyKCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhOQUxCaXRSZWFkZXIpOworfTsKKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBBX0JJVF9SRUFERVJfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oCmluZGV4IDI4ZjBhZWQuLjYyOTRlZTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaApAQCAtMjcsNiArMjcsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQU1lc3NhZ2U7CitjbGFzcyBNZWRpYUJ1ZmZlckJhc2U7CiAKIHN0cnVjdCBBQnVmZmVyIDogcHVibGljIFJlZkJhc2UgewogICAgIEFCdWZmZXIoc2l6ZV90IGNhcGFjaXR5KTsKQEAgLTQyLDExICs0MywxNyBAQAogCiAgICAgdm9pZCBzZXRSYW5nZShzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CiAKKyAgICAvLyBjcmVhdGUgYnVmZmVyIGZyb20gZHVwIG9mIHNvbWUgbWVtb3J5IGJsb2NrCisgICAgc3RhdGljIHNwPEFCdWZmZXI+IENyZWF0ZUFzQ29weShjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgY2FwYWNpdHkpOworCiAgICAgdm9pZCBzZXRJbnQzMkRhdGEoaW50MzJfdCBkYXRhKSB7IG1JbnQzMkRhdGEgPSBkYXRhOyB9CiAgICAgaW50MzJfdCBpbnQzMkRhdGEoKSBjb25zdCB7IHJldHVybiBtSW50MzJEYXRhOyB9CiAKICAgICBzcDxBTWVzc2FnZT4gbWV0YSgpOwogCisgICAgTWVkaWFCdWZmZXJCYXNlICpnZXRNZWRpYUJ1ZmZlckJhc2UoKTsKKyAgICB2b2lkIHNldE1lZGlhQnVmZmVyQmFzZShNZWRpYUJ1ZmZlckJhc2UgKm1lZGlhQnVmZmVyKTsKKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkFCdWZmZXIoKTsKIApAQCAtNTQsNiArNjEsOCBAQAogICAgIHNwPEFNZXNzYWdlPiBtRmFyZXdlbGw7CiAgICAgc3A8QU1lc3NhZ2U+IG1NZXRhOwogCisgICAgTWVkaWFCdWZmZXJCYXNlICptTWVkaWFCdWZmZXJCYXNlOworCiAgICAgdm9pZCAqbURhdGE7CiAgICAgc2l6ZV90IG1DYXBhY2l0eTsKICAgICBzaXplX3QgbVJhbmdlT2Zmc2V0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmgKaW5kZXggZDJlNmIyOC4uM2JiN2Q3NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5oCkBAIC00MywxMyArNDMsMTMgQEAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBU3RhdGUpOwogfTsKIAotc3RydWN0IEFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUgOiBwdWJsaWMgQUhhbmRsZXIgeworc3RydWN0IEFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUgewogICAgIEFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUoKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUoKTsKIAotICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdmlydHVhbCB2b2lkIGhhbmRsZU1lc3NhZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogCiAgICAgLy8gT25seSB0byBiZSBjYWxsZWQgaW4gcmVzcG9uc2UgdG8gYSBtZXNzYWdlLgogICAgIHZvaWQgY2hhbmdlU3RhdGUoY29uc3Qgc3A8QVN0YXRlPiAmc3RhdGUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmgKaW5kZXggOTQwZmM1NS4uNGQ3NmI2NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5oCkBAIC01Niw4ICs1Niw2IEBACiAKICAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgc3A8QU1lc3NhZ2U+ID4gbVJlcGxpZXM7CiAKLSAgICBzdGF0dXNfdCBwb3N0TWVzc2FnZV9sKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBpbnQ2NF90IGRlbGF5VXMpOwotCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQUxvb3BlclJvc3Rlcik7CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oCmluZGV4IDdlODIzZWIuLmE5ZTIzNWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oCkBAIC01MCw2ICs1MCw3IEBACiAgICAgdm9pZCBzZXREb3VibGUoY29uc3QgY2hhciAqbmFtZSwgZG91YmxlIHZhbHVlKTsKICAgICB2b2lkIHNldFBvaW50ZXIoY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqdmFsdWUpOwogICAgIHZvaWQgc2V0U3RyaW5nKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnMsIHNzaXplX3QgbGVuID0gLTEpOworICAgIHZvaWQgc2V0U3RyaW5nKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IEFTdHJpbmcgJnMpOwogICAgIHZvaWQgc2V0T2JqZWN0KGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHNwPFJlZkJhc2U+ICZvYmopOwogICAgIHZvaWQgc2V0QnVmZmVyKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOwogICAgIHZvaWQgc2V0TWVzc2FnZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBzcDxBTWVzc2FnZT4gJm9iaik7CkBAIC01OCw2ICs1OSw4IEBACiAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAogICAgICAgICAgICAgaW50MzJfdCBsZWZ0LCBpbnQzMl90IHRvcCwgaW50MzJfdCByaWdodCwgaW50MzJfdCBib3R0b20pOwogCisgICAgYm9vbCBjb250YWlucyhjb25zdCBjaGFyICpuYW1lKSBjb25zdDsKKwogICAgIGJvb2wgZmluZEludDMyKGNvbnN0IGNoYXIgKm5hbWUsIGludDMyX3QgKnZhbHVlKSBjb25zdDsKICAgICBib29sIGZpbmRJbnQ2NChjb25zdCBjaGFyICpuYW1lLCBpbnQ2NF90ICp2YWx1ZSkgY29uc3Q7CiAgICAgYm9vbCBmaW5kU2l6ZShjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgKnZhbHVlKSBjb25zdDsKQEAgLTEzNCw3ICsxMzcsOSBAQAogICAgICAgICAgICAgUmVjdCByZWN0VmFsdWU7CiAgICAgICAgIH0gdTsKICAgICAgICAgY29uc3QgY2hhciAqbU5hbWU7CisgICAgICAgIHNpemVfdCAgICAgIG1OYW1lTGVuZ3RoOwogICAgICAgICBUeXBlIG1UeXBlOworICAgICAgICB2b2lkIHNldE5hbWUoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IGxlbik7CiAgICAgfTsKIAogICAgIGVudW0gewpAQCAtMTQ0LDEyICsxNDksMTQgQEAKICAgICBzaXplX3QgbU51bUl0ZW1zOwogCiAgICAgSXRlbSAqYWxsb2NhdGVJdGVtKGNvbnN0IGNoYXIgKm5hbWUpOwotICAgIHZvaWQgZnJlZUl0ZW0oSXRlbSAqaXRlbSk7CisgICAgdm9pZCBmcmVlSXRlbVZhbHVlKEl0ZW0gKml0ZW0pOwogICAgIGNvbnN0IEl0ZW0gKmZpbmRJdGVtKGNvbnN0IGNoYXIgKm5hbWUsIFR5cGUgdHlwZSkgY29uc3Q7CiAKICAgICB2b2lkIHNldE9iamVjdEludGVybmFsKAogICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgc3A8UmVmQmFzZT4gJm9iaiwgVHlwZSB0eXBlKTsKIAorICAgIHNpemVfdCBmaW5kSXRlbUluZGV4KGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBsZW4pIGNvbnN0OworCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQU1lc3NhZ2UpOwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmgKaW5kZXggMGY4ZjFlMS4uN2M5ODY5OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oCkBAIC0xOCwxNCArMTgsMTkgQEAKIAogI2RlZmluZSBBX1NUUklOR19IXwogCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RydWN0IFN0cmluZzg7CitzdHJ1Y3QgUGFyY2VsOworCiBzdHJ1Y3QgQVN0cmluZyB7CiAgICAgQVN0cmluZygpOwogICAgIEFTdHJpbmcoY29uc3QgY2hhciAqcyk7CiAgICAgQVN0cmluZyhjb25zdCBjaGFyICpzLCBzaXplX3Qgc2l6ZSk7CisgICAgQVN0cmluZyhjb25zdCBTdHJpbmc4ICZmcm9tKTsKICAgICBBU3RyaW5nKGNvbnN0IEFTdHJpbmcgJmZyb20pOwogICAgIEFTdHJpbmcoY29uc3QgQVN0cmluZyAmZnJvbSwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IG4pOwogICAgIH5BU3RyaW5nKCk7CkBAIC02NywxNiArNzIsMjYgQEAKICAgICBzaXplX3QgaGFzaCgpIGNvbnN0OwogCiAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEFTdHJpbmcgJm90aGVyKSBjb25zdDsKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgQVN0cmluZyAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICFvcGVyYXRvcj09KG90aGVyKTsKKyAgICB9CiAgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgQVN0cmluZyAmb3RoZXIpIGNvbnN0OwogICAgIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEFTdHJpbmcgJm90aGVyKSBjb25zdDsKIAogICAgIGludCBjb21wYXJlKGNvbnN0IEFTdHJpbmcgJm90aGVyKSBjb25zdDsKKyAgICBpbnQgY29tcGFyZUlnbm9yZUNhc2UoY29uc3QgQVN0cmluZyAmb3RoZXIpIGNvbnN0OwogCisgICAgYm9vbCBlcXVhbHNJZ25vcmVDYXNlKGNvbnN0IEFTdHJpbmcgJm90aGVyKSBjb25zdDsKICAgICBib29sIHN0YXJ0c1dpdGgoY29uc3QgY2hhciAqcHJlZml4KSBjb25zdDsKICAgICBib29sIGVuZHNXaXRoKGNvbnN0IGNoYXIgKnN1ZmZpeCkgY29uc3Q7CisgICAgYm9vbCBzdGFydHNXaXRoSWdub3JlQ2FzZShjb25zdCBjaGFyICpwcmVmaXgpIGNvbnN0OworICAgIGJvb2wgZW5kc1dpdGhJZ25vcmVDYXNlKGNvbnN0IGNoYXIgKnN1ZmZpeCkgY29uc3Q7CiAKICAgICB2b2lkIHRvbG93ZXIoKTsKIAorICAgIHN0YXRpYyBBU3RyaW5nIEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICZwYXJjZWwpOworICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0OworCiBwcml2YXRlOgogICAgIHN0YXRpYyBjb25zdCBjaGFyICprRW1wdHlTdHJpbmc7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaAppbmRleCA2MGNiNDFkLi4yNTViY2JlIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oCkBAIC0yMCw5ICsyMCw0NCBAQAogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IG1hdGggdGVtcGxhdGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAorLyogVCBtdXN0IGJlIGludGVnZXIgdHlwZSwgZGVuIG11c3Qgbm90IGJlIDAgKi8KK3RlbXBsYXRlPGNsYXNzIFQ+CitpbmxpbmUgc3RhdGljIGNvbnN0IFQgZGl2Um91bmQoY29uc3QgVCAmbm9tLCBjb25zdCBUICZkZW4pIHsKKyAgICBpZiAoKG5vbSA+PSAwKSBeIChkZW4gPj0gMCkpIHsKKyAgICAgICAgcmV0dXJuIChub20gLSBkZW4gLyAyKSAvIGRlbjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gKG5vbSArIGRlbiAvIDIpIC8gZGVuOworICAgIH0KK30KKworLyogPT0gY2VpbChub20gLyBkZW4pLiBUIG11c3QgYmUgaW50ZWdlciB0eXBlLCBkZW4gbXVzdCBub3QgYmUgMCAqLwordGVtcGxhdGU8Y2xhc3MgVD4KK2lubGluZSBzdGF0aWMgY29uc3QgVCBkaXZVcChjb25zdCBUICZub20sIGNvbnN0IFQgJmRlbikgeworICAgIGlmIChkZW4gPCAwKSB7CisgICAgICAgIHJldHVybiAobm9tIDwgMCA/IG5vbSArIGRlbiArIDEgOiBub20pIC8gZGVuOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAobm9tIDwgMCA/IG5vbSA6IG5vbSArIGRlbiAtIDEpIC8gZGVuOworICAgIH0KK30KKwordGVtcGxhdGU8Y2xhc3MgVD4KK2lubGluZSBzdGF0aWMgVCBhYnMoY29uc3QgVCAmYSkgeworICAgIHJldHVybiBhIDwgMCA/IC1hIDogYTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVD4KK2lubGluZSBzdGF0aWMgY29uc3QgVCAmbWluKGNvbnN0IFQgJmEsIGNvbnN0IFQgJmIpIHsKKyAgICByZXR1cm4gYSA8IGIgPyBhIDogYjsKK30KKwordGVtcGxhdGU8Y2xhc3MgVD4KK2lubGluZSBzdGF0aWMgY29uc3QgVCAmbWF4KGNvbnN0IFQgJmEsIGNvbnN0IFQgJmIpIHsKKyAgICByZXR1cm4gYSA+IGIgPyBhIDogYjsKK30KKwogdGVtcGxhdGU8Y2xhc3MgVD4KIHZvaWQgRU5TVVJFX1VOU0lHTkVEX1RZUEUoKSB7Ci0gICAgVCBUWVBFX01VU1RfQkVfVU5TSUdORURbKFQpLTEgPCAwID8gLTEgOiAwXTsKKyAgICBUIFRZUEVfTVVTVF9CRV9VTlNJR05FRFsoVCktMSA8IDAgPyAtMSA6IDBdIF9fdW51c2VkOwogfQogCiAvLyBuZWVkbGUgaXMgaW4gcmFuZ2UgW2hheVN0YXJ0LCBoYXlTdGFydCArIGhheVNpemUpCkBAIC00Miw0ICs3NywxMSBAQAogICAgICAgICAgICAgJiYgKFUpKG5lZWRsZVN0YXJ0ICsgbmVlZGxlU2l6ZSAtIGhheVN0YXJ0KSA8PSBoYXlTaXplOwogfQogCisvKiBUIG11c3QgYmUgaW50ZWdlciB0eXBlLCBwZXJpb2QgbXVzdCBiZSBwb3NpdGl2ZSAqLwordGVtcGxhdGU8Y2xhc3MgVD4KK2lubGluZSBzdGF0aWMgVCBwZXJpb2RpY0Vycm9yKGNvbnN0IFQgJnZhbCwgY29uc3QgVCAmcGVyaW9kKSB7CisgICAgVCBlcnIgPSBhYnModmFsKSAlIHBlcmlvZDsKKyAgICByZXR1cm4gKGVyciA8IChwZXJpb2QgLyAyKSkgPyBlcnIgOiAocGVyaW9kIC0gZXJyKTsKK30KKwogI2VuZGlmICAvLyBBX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFCdWZmZXJCYXNlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFCdWZmZXJCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk0MThmYgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUJ1ZmZlckJhc2UuaApAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX0JVRkZFUl9CQVNFX0hfCisKKyNkZWZpbmUgTUVESUFfQlVGRkVSX0JBU0VfSF8KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNZWRpYUJ1ZmZlckJhc2UgeworcHVibGljOgorICAgIE1lZGlhQnVmZmVyQmFzZSgpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgYWRkX3JlZigpID0gMDsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfk1lZGlhQnVmZmVyQmFzZSgpIHt9CisKK3ByaXZhdGU6CisgICAgTWVkaWFCdWZmZXJCYXNlKGNvbnN0IE1lZGlhQnVmZmVyQmFzZSAmKTsKKyAgICBNZWRpYUJ1ZmZlckJhc2UgJm9wZXJhdG9yPShjb25zdCBNZWRpYUJ1ZmZlckJhc2UgJik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1FRElBX0JVRkZFUl9CQVNFX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHREcml2ZXIuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dERyaXZlci5oCmluZGV4IGYyM2MzMzcuLjM3ZWY2NzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dERyaXZlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dERyaXZlci5oCkBAIC0yNSw2ICsyNSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIEFMb29wZXI7CitzdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CiBjbGFzcyBNZWRpYVBsYXllckJhc2U7CiBjbGFzcyBNZWRpYVNvdXJjZTsKIGNsYXNzIFBhcmNlbDsKQEAgLTM0LDcgKzM1LDkgQEAKIAogY2xhc3MgVGltZWRUZXh0RHJpdmVyIHsKIHB1YmxpYzoKLSAgICBUaW1lZFRleHREcml2ZXIoY29uc3Qgd3A8TWVkaWFQbGF5ZXJCYXNlPiAmbGlzdGVuZXIpOworICAgIFRpbWVkVGV4dERyaXZlcigKKyAgICAgICAgICAgIGNvbnN0IHdwPE1lZGlhUGxheWVyQmFzZT4gJmxpc3RlbmVyLAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSk7CiAKICAgICB+VGltZWRUZXh0RHJpdmVyKCk7CiAKQEAgLTc3LDYgKzgwLDcgQEAKICAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOwogICAgIHNwPFRpbWVkVGV4dFBsYXllcj4gbVBsYXllcjsKICAgICB3cDxNZWRpYVBsYXllckJhc2U+IG1MaXN0ZW5lcjsKKyAgICBzcDxJTWVkaWFIVFRQU2VydmljZT4gbUhUVFBTZXJ2aWNlOwogCiAgICAgLy8gVmFyaWFibGVzIHRvIGJlIGd1YXJkZWQgYnkgbUxvY2suCiAgICAgU3RhdGUgbVN0YXRlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZGsvTmRrTWVkaWFDb2RlYy5oIGIvaW5jbHVkZS9uZGsvTmRrTWVkaWFDb2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwN2Y0YzkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25kay9OZGtNZWRpYUNvZGVjLmgKQEAgLTAsMCArMSwyMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGRlZmluZXMgYW4gTkRLIEFQSS4KKyAqIERvIG5vdCByZW1vdmUgbWV0aG9kcy4KKyAqIERvIG5vdCBjaGFuZ2UgbWV0aG9kIHNpZ25hdHVyZXMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSB2YWx1ZSBvZiBjb25zdGFudHMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSBzaXplIG9mIGFueSBvZiB0aGUgY2xhc3NlcyBkZWZpbmVkIGluIGhlcmUuCisgKiBEbyBub3QgcmVmZXJlbmNlIHR5cGVzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBOREsuCisgKiBEbyBub3QgI2luY2x1ZGUgZmlsZXMgdGhhdCBhcmVuJ3QgcGFydCBvZiB0aGUgTkRLLgorICovCisKKyNpZm5kZWYgX05ES19NRURJQV9DT0RFQ19ICisjZGVmaW5lIF9OREtfTUVESUFfQ09ERUNfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9uYXRpdmVfd2luZG93Lmg+CisKKyNpbmNsdWRlICJOZGtNZWRpYUNyeXB0by5oIgorI2luY2x1ZGUgIk5ka01lZGlhRXJyb3IuaCIKKyNpbmNsdWRlICJOZGtNZWRpYUZvcm1hdC5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworc3RydWN0IEFNZWRpYUNvZGVjOwordHlwZWRlZiBzdHJ1Y3QgQU1lZGlhQ29kZWMgQU1lZGlhQ29kZWM7CisKK3N0cnVjdCBBTWVkaWFDb2RlY0J1ZmZlckluZm8geworICAgIGludDMyX3Qgb2Zmc2V0OworICAgIGludDMyX3Qgc2l6ZTsKKyAgICBpbnQ2NF90IHByZXNlbnRhdGlvblRpbWVVczsKKyAgICB1aW50MzJfdCBmbGFnczsKK307Cit0eXBlZGVmIHN0cnVjdCBBTWVkaWFDb2RlY0J1ZmZlckluZm8gQU1lZGlhQ29kZWNCdWZmZXJJbmZvOwordHlwZWRlZiBzdHJ1Y3QgQU1lZGlhQ29kZWNDcnlwdG9JbmZvIEFNZWRpYUNvZGVjQ3J5cHRvSW5mbzsKKworZW51bSB7CisgICAgQU1FRElBQ09ERUNfQlVGRkVSX0ZMQUdfRU5EX09GX1NUUkVBTSA9IDQsCisgICAgQU1FRElBQ09ERUNfQ09ORklHVVJFX0ZMQUdfRU5DT0RFID0gMSwKKyAgICBBTUVESUFDT0RFQ19JTkZPX09VVFBVVF9CVUZGRVJTX0NIQU5HRUQgPSAtMywKKyAgICBBTUVESUFDT0RFQ19JTkZPX09VVFBVVF9GT1JNQVRfQ0hBTkdFRCA9IC0yLAorICAgIEFNRURJQUNPREVDX0lORk9fVFJZX0FHQUlOX0xBVEVSID0gLTEKK307CisKKy8qKgorICogQ3JlYXRlIGNvZGVjIGJ5IG5hbWUuIFVzZSB0aGlzIGlmIHlvdSBrbm93IHRoZSBleGFjdCBjb2RlYyB5b3Ugd2FudCB0byB1c2UuCisgKiBXaGVuIGNvbmZpZ3VyaW5nLCB5b3Ugd2lsbCBuZWVkIHRvIHNwZWNpZnkgd2hldGhlciB0byB1c2UgdGhlIGNvZGVjIGFzIGFuCisgKiBlbmNvZGVyIG9yIGRlY29kZXIuCisgKi8KK0FNZWRpYUNvZGVjKiBBTWVkaWFDb2RlY19jcmVhdGVDb2RlY0J5TmFtZShjb25zdCBjaGFyICpuYW1lKTsKKworLyoqCisgKiBDcmVhdGUgY29kZWMgYnkgbWltZSB0eXBlLiBNb3N0IGFwcGxpY2F0aW9ucyB3aWxsIHVzZSB0aGlzLCBzcGVjaWZ5aW5nIGEKKyAqIG1pbWUgdHlwZSBvYnRhaW5lZCBmcm9tIG1lZGlhIGV4dHJhY3Rvci4KKyAqLworQU1lZGlhQ29kZWMqIEFNZWRpYUNvZGVjX2NyZWF0ZURlY29kZXJCeVR5cGUoY29uc3QgY2hhciAqbWltZV90eXBlKTsKKworLyoqCisgKiBDcmVhdGUgZW5jb2RlciBieSBuYW1lLgorICovCitBTWVkaWFDb2RlYyogQU1lZGlhQ29kZWNfY3JlYXRlRW5jb2RlckJ5VHlwZShjb25zdCBjaGFyICptaW1lX3R5cGUpOworCisvKioKKyAqIGRlbGV0ZSB0aGUgY29kZWMgYW5kIGZyZWUgaXRzIHJlc291cmNlcworICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19kZWxldGUoQU1lZGlhQ29kZWMqKTsKKworLyoqCisgKiBDb25maWd1cmUgdGhlIGNvZGVjLiBGb3IgZGVjb2RpbmcgeW91IHdvdWxkIHR5cGljYWxseSBnZXQgdGhlIGZvcm1hdCBmcm9tIGFuIGV4dHJhY3Rvci4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfY29uZmlndXJlKAorICAgICAgICBBTWVkaWFDb2RlYyosCisgICAgICAgIGNvbnN0IEFNZWRpYUZvcm1hdCogZm9ybWF0LAorICAgICAgICBBTmF0aXZlV2luZG93KiBzdXJmYWNlLAorICAgICAgICBBTWVkaWFDcnlwdG8gKmNyeXB0bywKKyAgICAgICAgdWludDMyX3QgZmxhZ3MpOworCisvKioKKyAqIFN0YXJ0IHRoZSBjb2RlYy4gQSBjb2RlYyBtdXN0IGJlIGNvbmZpZ3VyZWQgYmVmb3JlIGl0IGNhbiBiZSBzdGFydGVkLCBhbmQgbXVzdCBiZSBzdGFydGVkCisgKiBiZWZvcmUgYnVmZmVycyBjYW4gYmUgc2VudCB0byBpdC4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfc3RhcnQoQU1lZGlhQ29kZWMqKTsKKworLyoqCisgKiBTdG9wIHRoZSBjb2RlYy4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfc3RvcChBTWVkaWFDb2RlYyopOworCisvKgorICogRmx1c2ggdGhlIGNvZGVjJ3MgaW5wdXQgYW5kIG91dHB1dC4gQWxsIGluZGljZXMgcHJldmlvdXNseSByZXR1cm5lZCBmcm9tIGNhbGxzIHRvCisgKiBBTWVkaWFDb2RlY19kZXF1ZXVlSW5wdXRCdWZmZXIgYW5kIEFNZWRpYUNvZGVjX2RlcXVldWVPdXRwdXRCdWZmZXIgYmVjb21lIGludmFsaWQuCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX2ZsdXNoKEFNZWRpYUNvZGVjKik7CisKKy8qKgorICogR2V0IGFuIGlucHV0IGJ1ZmZlci4gVGhlIHNwZWNpZmllZCBidWZmZXIgaW5kZXggbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSBvYnRhaW5lZCBmcm9tCisgKiBkZXF1ZXVlSW5wdXRCdWZmZXIsIGFuZCBub3QgeWV0IHF1ZXVlZC4KKyAqLwordWludDhfdCogQU1lZGlhQ29kZWNfZ2V0SW5wdXRCdWZmZXIoQU1lZGlhQ29kZWMqLCBzaXplX3QgaWR4LCBzaXplX3QgKm91dF9zaXplKTsKKworLyoqCisgKiBHZXQgYW4gb3V0cHV0IGJ1ZmZlci4gVGhlIHNwZWNpZmllZCBidWZmZXIgaW5kZXggbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSBvYnRhaW5lZCBmcm9tCisgKiBkZXF1ZXVlT3V0cHV0QnVmZmVyLCBhbmQgbm90IHlldCBxdWV1ZWQuCisgKi8KK3VpbnQ4X3QqIEFNZWRpYUNvZGVjX2dldE91dHB1dEJ1ZmZlcihBTWVkaWFDb2RlYyosIHNpemVfdCBpZHgsIHNpemVfdCAqb3V0X3NpemUpOworCisvKioKKyAqIEdldCB0aGUgaW5kZXggb2YgdGhlIG5leHQgYXZhaWxhYmxlIGlucHV0IGJ1ZmZlci4gQW4gYXBwIHdpbGwgdHlwaWNhbGx5IHVzZSB0aGlzIHdpdGgKKyAqIGdldElucHV0QnVmZmVyKCkgdG8gZ2V0IGEgcG9pbnRlciB0byB0aGUgYnVmZmVyLCB0aGVuIGNvcHkgdGhlIGRhdGEgdG8gYmUgZW5jb2RlZCBvciBkZWNvZGVkCisgKiBpbnRvIHRoZSBidWZmZXIgYmVmb3JlIHBhc3NpbmcgaXQgdG8gdGhlIGNvZGVjLgorICovCitzc2l6ZV90IEFNZWRpYUNvZGVjX2RlcXVldWVJbnB1dEJ1ZmZlcihBTWVkaWFDb2RlYyosIGludDY0X3QgdGltZW91dFVzKTsKKworLyoqCisgKiBTZW5kIHRoZSBzcGVjaWZpZWQgYnVmZmVyIHRvIHRoZSBjb2RlYyBmb3IgcHJvY2Vzc2luZy4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfcXVldWVJbnB1dEJ1ZmZlcihBTWVkaWFDb2RlYyosCisgICAgICAgIHNpemVfdCBpZHgsIG9mZl90IG9mZnNldCwgc2l6ZV90IHNpemUsIHVpbnQ2NF90IHRpbWUsIHVpbnQzMl90IGZsYWdzKTsKKworLyoqCisgKiBTZW5kIHRoZSBzcGVjaWZpZWQgYnVmZmVyIHRvIHRoZSBjb2RlYyBmb3IgcHJvY2Vzc2luZy4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfcXVldWVTZWN1cmVJbnB1dEJ1ZmZlcihBTWVkaWFDb2RlYyosCisgICAgICAgIHNpemVfdCBpZHgsIG9mZl90IG9mZnNldCwgQU1lZGlhQ29kZWNDcnlwdG9JbmZvKiwgdWludDY0X3QgdGltZSwgdWludDMyX3QgZmxhZ3MpOworCisvKioKKyAqIEdldCB0aGUgaW5kZXggb2YgdGhlIG5leHQgYXZhaWxhYmxlIGJ1ZmZlciBvZiBwcm9jZXNzZWQgZGF0YS4KKyAqLworc3NpemVfdCBBTWVkaWFDb2RlY19kZXF1ZXVlT3V0cHV0QnVmZmVyKEFNZWRpYUNvZGVjKiwgQU1lZGlhQ29kZWNCdWZmZXJJbmZvICppbmZvLCBpbnQ2NF90IHRpbWVvdXRVcyk7CitBTWVkaWFGb3JtYXQqIEFNZWRpYUNvZGVjX2dldE91dHB1dEZvcm1hdChBTWVkaWFDb2RlYyopOworCisvKioKKyAqIElmIHlvdSBhcmUgZG9uZSB3aXRoIGEgYnVmZmVyLCB1c2UgdGhpcyBjYWxsIHRvIHJldHVybiB0aGUgYnVmZmVyIHRvCisgKiB0aGUgY29kZWMuIElmIHlvdSBwcmV2aW91c2x5IHNwZWNpZmllZCBhIHN1cmZhY2Ugd2hlbiBjb25maWd1cmluZyB0aGlzCisgKiB2aWRlbyBkZWNvZGVyIHlvdSBjYW4gb3B0aW9uYWxseSByZW5kZXIgdGhlIGJ1ZmZlci4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfcmVsZWFzZU91dHB1dEJ1ZmZlcihBTWVkaWFDb2RlYyosIHNpemVfdCBpZHgsIGJvb2wgcmVuZGVyKTsKKworLyoqCisgKiBJZiB5b3UgYXJlIGRvbmUgd2l0aCBhIGJ1ZmZlciwgdXNlIHRoaXMgY2FsbCB0byB1cGRhdGUgaXRzIHN1cmZhY2UgdGltZXN0YW1wCisgKiBhbmQgcmV0dXJuIGl0IHRvIHRoZSBjb2RlYyB0byByZW5kZXIgaXQgb24gdGhlIG91dHB1dCBzdXJmYWNlLiBJZiB5b3UKKyAqIGhhdmUgbm90IHNwZWNpZmllZCBhbiBvdXRwdXQgc3VyZmFjZSB3aGVuIGNvbmZpZ3VyaW5nIHRoaXMgdmlkZW8gY29kZWMsCisgKiB0aGlzIGNhbGwgd2lsbCBzaW1wbHkgcmV0dXJuIHRoZSBidWZmZXIgdG8gdGhlIGNvZGVjLgorICoKKyAqIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUgSmF2YSBkb2N1bWVudGF0aW9uIGZvciBNZWRpYUNvZGVjLnJlbGVhc2VPdXRwdXRCdWZmZXIuCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX3JlbGVhc2VPdXRwdXRCdWZmZXJBdFRpbWUoCisgICAgICAgIEFNZWRpYUNvZGVjICptRGF0YSwgc2l6ZV90IGlkeCwgaW50NjRfdCB0aW1lc3RhbXBOcyk7CisKKwordHlwZWRlZiBlbnVtIHsKKyAgICBBTUVESUFDT0RFQ1JZUFRPSU5GT19NT0RFX0NMRUFSID0gMCwKKyAgICBBTUVESUFDT0RFQ1JZUFRPSU5GT19NT0RFX0FFU19DVFIgPSAxCit9IGNyeXB0b2luZm9fbW9kZV90OworCisvKioKKyAqIENyZWF0ZSBhbiBBTWVkaWFDb2RlY0NyeXB0b0luZm8gZnJvbSBzY3JhdGNoLiBVc2UgdGhpcyBpZiB5b3UgbmVlZCB0byB1c2UgY3VzdG9tCisgKiBjcnlwdG8gaW5mbywgcmF0aGVyIHRoYW4gb25lIG9idGFpbmVkIGZyb20gQU1lZGlhRXh0cmFjdG9yLgorICoKKyAqIEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyBkZXNjcmliZXMgdGhlIHN0cnVjdHVyZSBvZiBhbiAoYXQgbGVhc3QKKyAqIHBhcnRpYWxseSkgZW5jcnlwdGVkIGlucHV0IHNhbXBsZS4KKyAqIEEgYnVmZmVyJ3MgZGF0YSBpcyBjb25zaWRlcmVkIHRvIGJlIHBhcnRpdGlvbmVkIGludG8gInN1YnNhbXBsZXMiLAorICogZWFjaCBzdWJzYW1wbGUgc3RhcnRzIHdpdGggYSAocG90ZW50aWFsbHkgZW1wdHkpIHJ1biBvZiBwbGFpbiwKKyAqIHVuZW5jcnlwdGVkIGJ5dGVzIGZvbGxvd2VkIGJ5IGEgKGFsc28gcG90ZW50aWFsbHkgZW1wdHkpIHJ1biBvZgorICogZW5jcnlwdGVkIGJ5dGVzLgorICogbnVtQnl0ZXNPZkNsZWFyRGF0YSBjYW4gYmUgbnVsbCB0byBpbmRpY2F0ZSB0aGF0IGFsbCBkYXRhIGlzIGVuY3J5cHRlZC4KKyAqIFRoaXMgaW5mb3JtYXRpb24gZW5jYXBzdWxhdGVzIHBlci1zYW1wbGUgbWV0YWRhdGEgYXMgb3V0bGluZWQgaW4KKyAqIElTTy9JRUMgRkRJUyAyMzAwMS03OjIwMTEgIkNvbW1vbiBlbmNyeXB0aW9uIGluIElTTyBiYXNlIG1lZGlhIGZpbGUgZm9ybWF0IGZpbGVzIi4KKyAqLworQU1lZGlhQ29kZWNDcnlwdG9JbmZvICpBTWVkaWFDb2RlY0NyeXB0b0luZm9fbmV3KAorICAgICAgICBpbnQgbnVtc3Vic2FtcGxlcywKKyAgICAgICAgdWludDhfdCBrZXlbMTZdLAorICAgICAgICB1aW50OF90IGl2WzE2XSwKKyAgICAgICAgY3J5cHRvaW5mb19tb2RlX3QgbW9kZSwKKyAgICAgICAgc2l6ZV90ICpjbGVhcmJ5dGVzLAorICAgICAgICBzaXplX3QgKmVuY3J5cHRlZGJ5dGVzKTsKKworLyoqCisgKiBkZWxldGUgYW4gQU1lZGlhQ29kZWNDcnlwdG9JbmZvIGNyZWF0ZWQgcHJldmlvdXNseSB3aXRoIEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19uZXcsIG9yCisgKiBvYnRhaW5lZCBmcm9tIEFNZWRpYUV4dHJhY3RvcgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZGVsZXRlKEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyopOworCisvKioKKyAqIFRoZSBudW1iZXIgb2Ygc3Vic2FtcGxlcyB0aGF0IG1ha2UgdXAgdGhlIGJ1ZmZlcidzIGNvbnRlbnRzLgorICovCitzaXplX3QgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2dldE51bVN1YlNhbXBsZXMoQU1lZGlhQ29kZWNDcnlwdG9JbmZvKik7CisKKy8qKgorICogQSAxNi1ieXRlIG9wYXF1ZSBrZXkKKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2dldEtleShBTWVkaWFDb2RlY0NyeXB0b0luZm8qLCB1aW50OF90ICpkc3QpOworCisvKioKKyAqIEEgMTYtYnl0ZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IKKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2dldElWKEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyosIHVpbnQ4X3QgKmRzdCk7CisKKy8qKgorICogVGhlIHR5cGUgb2YgZW5jcnlwdGlvbiB0aGF0IGhhcyBiZWVuIGFwcGxpZWQsCisgKiBvbmUgb2YgQU1FRElBQ09ERUNSWVBUT0lORk9fTU9ERV9DTEVBUiBvciBBTUVESUFDT0RFQ1JZUFRPSU5GT19NT0RFX0FFU19DVFIuCisgKi8KK2NyeXB0b2luZm9fbW9kZV90IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19nZXRNb2RlKEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyopOworCisvKioKKyAqIFRoZSBudW1iZXIgb2YgbGVhZGluZyB1bmVuY3J5cHRlZCBieXRlcyBpbiBlYWNoIHN1YnNhbXBsZS4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2dldENsZWFyQnl0ZXMoQU1lZGlhQ29kZWNDcnlwdG9JbmZvKiwgc2l6ZV90ICpkc3QpOworCisvKioKKyAqIFRoZSBudW1iZXIgb2YgdHJhaWxpbmcgZW5jcnlwdGVkIGJ5dGVzIGluIGVhY2ggc3Vic2FtcGxlLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZ2V0RW5jcnlwdGVkQnl0ZXMoQU1lZGlhQ29kZWNDcnlwdG9JbmZvKiwgc2l6ZV90ICpkc3QpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAvL19OREtfTUVESUFfQ09ERUNfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZGsvTmRrTWVkaWFDcnlwdG8uaCBiL2luY2x1ZGUvbmRrL05ka01lZGlhQ3J5cHRvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAzNzRjNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmRrL05ka01lZGlhQ3J5cHRvLmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworLyoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIGFuIE5ESyBBUEkuCisgKiBEbyBub3QgcmVtb3ZlIG1ldGhvZHMuCisgKiBEbyBub3QgY2hhbmdlIG1ldGhvZCBzaWduYXR1cmVzLgorICogRG8gbm90IGNoYW5nZSB0aGUgdmFsdWUgb2YgY29uc3RhbnRzLgorICogRG8gbm90IGNoYW5nZSB0aGUgc2l6ZSBvZiBhbnkgb2YgdGhlIGNsYXNzZXMgZGVmaW5lZCBpbiBoZXJlLgorICogRG8gbm90IHJlZmVyZW5jZSB0eXBlcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgTkRLLgorICogRG8gbm90ICNpbmNsdWRlIGZpbGVzIHRoYXQgYXJlbid0IHBhcnQgb2YgdGhlIE5ESy4KKyAqLworCisjaWZuZGVmIF9OREtfTUVESUFfQ1JZUFRPX0gKKyNkZWZpbmUgX05ES19NRURJQV9DUllQVE9fSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBBTWVkaWFDcnlwdG87Cit0eXBlZGVmIHN0cnVjdCBBTWVkaWFDcnlwdG8gQU1lZGlhQ3J5cHRvOworCit0eXBlZGVmIHVpbnQ4X3QgQU1lZGlhVVVJRFsxNl07CisKK2Jvb2wgQU1lZGlhQ3J5cHRvX2lzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IEFNZWRpYVVVSUQgdXVpZCk7CisKK2Jvb2wgQU1lZGlhQ3J5cHRvX3JlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudChjb25zdCBjaGFyICptaW1lKTsKKworQU1lZGlhQ3J5cHRvKiBBTWVkaWFDcnlwdG9fbmV3KGNvbnN0IEFNZWRpYVVVSUQgdXVpZCwgY29uc3Qgdm9pZCAqaW5pdERhdGEsIHNpemVfdCBpbml0RGF0YVNpemUpOworCit2b2lkIEFNZWRpYUNyeXB0b19kZWxldGUoQU1lZGlhQ3J5cHRvKiBjcnlwdG8pOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmIC8vIF9OREtfTUVESUFfQ1JZUFRPX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmRrL05ka01lZGlhRHJtLmggYi9pbmNsdWRlL25kay9OZGtNZWRpYURybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYWZkZDkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25kay9OZGtNZWRpYURybS5oCkBAIC0wLDAgKzEsNDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIGFuIE5ESyBBUEkuCisgKiBEbyBub3QgcmVtb3ZlIG1ldGhvZHMuCisgKiBEbyBub3QgY2hhbmdlIG1ldGhvZCBzaWduYXR1cmVzLgorICogRG8gbm90IGNoYW5nZSB0aGUgdmFsdWUgb2YgY29uc3RhbnRzLgorICogRG8gbm90IGNoYW5nZSB0aGUgc2l6ZSBvZiBhbnkgb2YgdGhlIGNsYXNzZXMgZGVmaW5lZCBpbiBoZXJlLgorICogRG8gbm90IHJlZmVyZW5jZSB0eXBlcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgTkRLLgorICogRG8gbm90ICNpbmNsdWRlIGZpbGVzIHRoYXQgYXJlbid0IHBhcnQgb2YgdGhlIE5ESy4KKyAqLworCisjaWZuZGVmIF9OREtfTUVESUFfRFJNX0gKKyNkZWZpbmUgX05ES19NRURJQV9EUk1fSAorCisjaW5jbHVkZSAiTmRrTWVkaWFFcnJvci5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisKK3N0cnVjdCBBTWVkaWFEcm07Cit0eXBlZGVmIHN0cnVjdCBBTWVkaWFEcm0gQU1lZGlhRHJtOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgdWludDhfdCAqcHRyOworICAgIHNpemVfdCBsZW5ndGg7Cit9IEFNZWRpYURybUJ5dGVBcnJheTsKKwordHlwZWRlZiBBTWVkaWFEcm1CeXRlQXJyYXkgQU1lZGlhRHJtU2Vzc2lvbklkOwordHlwZWRlZiBBTWVkaWFEcm1CeXRlQXJyYXkgQU1lZGlhRHJtU2NvcGU7Cit0eXBlZGVmIEFNZWRpYURybUJ5dGVBcnJheSBBTWVkaWFEcm1LZXlTZXRJZDsKK3R5cGVkZWYgQU1lZGlhRHJtQnl0ZUFycmF5IEFNZWRpYURybVNlY3VyZVN0b3A7CisKKwordHlwZWRlZiBlbnVtIEFNZWRpYURybUV2ZW50VHlwZSB7CisgICAgLyoqCisgICAgICogVGhpcyBldmVudCB0eXBlIGluZGljYXRlcyB0aGF0IHRoZSBhcHAgbmVlZHMgdG8gcmVxdWVzdCBhIGNlcnRpZmljYXRlIGZyb20KKyAgICAgKiB0aGUgcHJvdmlzaW9uaW5nIHNlcnZlci4gIFRoZSByZXF1ZXN0IG1lc3NhZ2UgZGF0YSBpcyBvYnRhaW5lZCB1c2luZworICAgICAqIEFNZWRpYURybV9nZXRQcm92aXNpb25SZXF1ZXN0LgorICAgICAqLworICAgIEVWRU5UX1BST1ZJU0lPTl9SRVFVSVJFRCA9IDEsCisKKyAgICAvKioKKyAgICAgKiBUaGlzIGV2ZW50IHR5cGUgaW5kaWNhdGVzIHRoYXQgdGhlIGFwcCBuZWVkcyB0byByZXF1ZXN0IGtleXMgZnJvbSBhIGxpY2Vuc2UKKyAgICAgKiBzZXJ2ZXIuICBUaGUgcmVxdWVzdCBtZXNzYWdlIGRhdGEgaXMgb2J0YWluZWQgdXNpbmcgQU1lZGlhRHJtX2dldEtleVJlcXVlc3QuCisgICAgICovCisgICAgRVZFTlRfS0VZX1JFUVVJUkVEID0gMiwKKworICAgIC8qKgorICAgICAqIFRoaXMgZXZlbnQgdHlwZSBpbmRpY2F0ZXMgdGhhdCB0aGUgbGljZW5zZWQgdXNhZ2UgZHVyYXRpb24gZm9yIGtleXMgaW4gYSBzZXNzaW9uCisgICAgICogaGFzIGV4cGlyZWQuICBUaGUga2V5cyBhcmUgbm8gbG9uZ2VyIHZhbGlkLgorICAgICAqLworICAgIEVWRU5UX0tFWV9FWFBJUkVEID0gMywKKworICAgIC8qKgorICAgICAqIFRoaXMgZXZlbnQgbWF5IGluZGljYXRlIHNvbWUgc3BlY2lmaWMgdmVuZG9yLWRlZmluZWQgY29uZGl0aW9uLCBzZWUgeW91cgorICAgICAqIERSTSBwcm92aWRlciBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzCisgICAgICovCisgICAgRVZFTlRfVkVORE9SX0RFRklORUQgPSA0Cit9IEFNZWRpYURybUV2ZW50VHlwZTsKKwordHlwZWRlZiB2b2lkICgqQU1lZGlhRHJtRXZlbnRMaXN0ZW5lcikoQU1lZGlhRHJtICosIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkLAorICAgICAgICBBTWVkaWFEcm1FdmVudFR5cGUgZXZlbnRUeXBlLCBpbnQgZXh0cmEsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBkYXRhU2l6ZSk7CisKKworLyoqCisgKiBRdWVyeSBpZiB0aGUgZ2l2ZW4gc2NoZW1lIGlkZW50aWZpZWQgYnkgaXRzIFVVSUQgaXMgc3VwcG9ydGVkIG9uIHRoaXMgZGV2aWNlLCBhbmQKKyAqIHdoZXRoZXIgdGhlIGRybSBwbHVnaW4gaXMgYWJsZSB0byBoYW5kbGUgdGhlIG1lZGlhIGNvbnRhaW5lciBmb3JtYXQgc3BlY2lmaWVkIGJ5IG1pbWVUeXBlLgorICoKKyAqIHV1aWQgaWRlbnRpZmllcyB0aGUgdW5pdmVyc2FsIHVuaXF1ZSBJRCBvZiB0aGUgY3J5cHRvIHNjaGVtZS4gdXVpZCBtdXN0IGJlIDE2IGJ5dGVzLgorICogbWltZVR5cGUgaXMgdGhlIE1JTUUgdHlwZSBvZiB0aGUgbWVkaWEgY29udGFpbmVyLCBlLmcuICJ2aWRlby9tcDQiLiAgSWYgbWltZVR5cGUKKyAqIGlzIG5vdCBrbm93biBvciByZXF1aXJlZCwgaXQgY2FuIGJlIHByb3ZpZGVkIGFzIE5VTEwuCisgKi8KK2Jvb2wgQU1lZGlhRHJtX2lzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgKnV1aWQsIGNvbnN0IGNoYXIgKm1pbWVUeXBlKTsKKworLyoqCisgKiBDcmVhdGUgYSBNZWRpYURybSBpbnN0YW5jZSBmcm9tIGEgVVVJRAorICogdXVpZCBpZGVudGlmaWVzIHRoZSB1bml2ZXJzYWwgdW5pcXVlIElEIG9mIHRoZSBjcnlwdG8gc2NoZW1lLiB1dWlkIG11c3QgYmUgMTYgYnl0ZXMuCisgKi8KK0FNZWRpYURybSogQU1lZGlhRHJtX2NyZWF0ZUJ5VVVJRChjb25zdCB1aW50OF90ICp1dWlkKTsKKworLyoqCisgKiBSZWxlYXNlIGEgTWVkaWFEcm0gb2JqZWN0CisgKi8KK3ZvaWQgQU1lZGlhRHJtX3JlbGVhc2UoQU1lZGlhRHJtICopOworCisvKioKKyAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIGFuIGV2ZW50IG9jY3VycworICoKKyAqIGxpc3RlbmVyIGlzIHRoZSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgaW52b2tlZCBvbiBldmVudAorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fc2V0T25FdmVudExpc3RlbmVyKEFNZWRpYURybSAqLCBBTWVkaWFEcm1FdmVudExpc3RlbmVyIGxpc3RlbmVyKTsKKworLyoqCisgKiBPcGVuIGEgbmV3IHNlc3Npb24gd2l0aCB0aGUgTWVkaWFEcm0gb2JqZWN0LiAgQSBzZXNzaW9uIElEIGlzIHJldHVybmVkLgorICoKKyAqIHJldHVybnMgTUVESUFEUk1fTk9UX1BST1ZJU0lPTkVEX0VSUk9SIGlmIHByb3Zpc2lvbmluZyBpcyBuZWVkZWQKKyAqIHJldHVybnMgTUVESUFEUk1fUkVTT1VSQ0VfQlVTWV9FUlJPUiBpZiByZXF1aXJlZCByZXNvdXJjZXMgYXJlIGluIHVzZQorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fb3BlblNlc3Npb24oQU1lZGlhRHJtICosIEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkKTsKKworLyoqCisgKiBDbG9zZSBhIHNlc3Npb24gb24gdGhlIE1lZGlhRHJtIG9iamVjdCB0aGF0IHdhcyBwcmV2aW91c2x5IG9wZW5lZAorICogd2l0aCBBTWVkaWFEcm1fb3BlblNlc3Npb24uCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9jbG9zZVNlc3Npb24oQU1lZGlhRHJtICosIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkKTsKKwordHlwZWRlZiBlbnVtIEFNZWRpYURybUtleVR5cGUgeworICAgIC8qKgorICAgICAqIFRoaXMga2V5IHJlcXVlc3QgdHlwZSBzcGVjaWVzIHRoYXQgdGhlIGtleXMgd2lsbCBiZSBmb3Igb25saW5lIHVzZSwgdGhleSB3aWxsCisgICAgICogbm90IGJlIHNhdmVkIHRvIHRoZSBkZXZpY2UgZm9yIHN1YnNlcXVlbnQgdXNlIHdoZW4gdGhlIGRldmljZSBpcyBub3QgY29ubmVjdGVkCisgICAgICogdG8gYSBuZXR3b3JrLgorICAgICAqLworICAgIEtFWV9UWVBFX1NUUkVBTUlORyA9IDEsCisKKyAgICAvKioKKyAgICAgKiBUaGlzIGtleSByZXF1ZXN0IHR5cGUgc3BlY2lmaWVzIHRoYXQgdGhlIGtleXMgd2lsbCBiZSBmb3Igb2ZmbGluZSB1c2UsIHRoZXkKKyAgICAgKiB3aWxsIGJlIHNhdmVkIHRvIHRoZSBkZXZpY2UgZm9yIHVzZSB3aGVuIHRoZSBkZXZpY2UgaXMgbm90IGNvbm5lY3RlZCB0byBhIG5ldHdvcmsuCisgICAgICovCisgICAgS0VZX1RZUEVfT0ZGTElORSA9IDIsCisKKyAgICAvKioKKyAgICAgKiBUaGlzIGtleSByZXF1ZXN0IHR5cGUgc3BlY2lmaWVzIHRoYXQgcHJldmlvdXNseSBzYXZlZCBvZmZsaW5lIGtleXMgc2hvdWxkIGJlIHJlbGVhc2VkLgorICAgICAqLworICAgIEtFWV9UWVBFX1JFTEVBU0UgPSAzCit9IEFNZWRpYURybUtleVR5cGU7CisKKy8qKgorICogIERhdGEgdHlwZSBjb250YWluaW5nIHtrZXksIHZhbHVlfSBwYWlyCisgKi8KK3R5cGVkZWYgc3RydWN0IEFNZWRpYURybUtleVZhbHVlUGFpciB7CisgICAgY29uc3QgY2hhciAqbUtleTsKKyAgICBjb25zdCBjaGFyICptVmFsdWU7Cit9IEFNZWRpYURybUtleVZhbHVlOworCisvKioKKyAqIEEga2V5IHJlcXVlc3QvcmVzcG9uc2UgZXhjaGFuZ2Ugb2NjdXJzIGJldHdlZW4gdGhlIGFwcCBhbmQgYSBsaWNlbnNlIHNlcnZlcgorICogdG8gb2J0YWluIG9yIHJlbGVhc2Uga2V5cyB1c2VkIHRvIGRlY3J5cHQgZW5jcnlwdGVkIGNvbnRlbnQuCisgKiBBTWVkaWFEcm1fZ2V0S2V5UmVxdWVzdCBpcyB1c2VkIHRvIG9idGFpbiBhbiBvcGFxdWUga2V5IHJlcXVlc3QgYnl0ZSBhcnJheSB0aGF0CisgKiBpcyBkZWxpdmVyZWQgdG8gdGhlIGxpY2Vuc2Ugc2VydmVyLiAgVGhlIG9wYXF1ZSBrZXkgcmVxdWVzdCBieXRlIGFycmF5IGlzCisgKiByZXR1cm5lZCBpbiBLZXlSZXF1ZXN0LmRhdGEuICBUaGUgcmVjb21tZW5kZWQgVVJMIHRvIGRlbGl2ZXIgdGhlIGtleSByZXF1ZXN0IHRvCisgKiBpcyByZXR1cm5lZCBpbiBLZXlSZXF1ZXN0LmRlZmF1bHRVcmwuCisgKgorICogQWZ0ZXIgdGhlIGFwcCBoYXMgcmVjZWl2ZWQgdGhlIGtleSByZXF1ZXN0IHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlciwKKyAqIGl0IHNob3VsZCBkZWxpdmVyIHRvIHRoZSByZXNwb25zZSB0byB0aGUgRFJNIGVuZ2luZSBwbHVnaW4gdXNpbmcgdGhlIG1ldGhvZAorICogQU1lZGlhRHJtX3Byb3ZpZGVLZXlSZXNwb25zZS4KKyAqCisgKiBzY29wZSBtYXkgYmUgYSBzZXNzaW9uSWQgb3IgYSBrZXlTZXRJZCwgZGVwZW5kaW5nIG9uIHRoZSBzcGVjaWZpZWQga2V5VHlwZS4KKyAqIFdoZW4gdGhlIGtleVR5cGUgaXMgS0VZX1RZUEVfU1RSRUFNSU5HIG9yIEtFWV9UWVBFX09GRkxJTkUsIHNjb3BlIHNob3VsZCBiZSBzZXQKKyAqIHRvIHRoZSBzZXNzaW9uSWQgdGhlIGtleXMgd2lsbCBiZSBwcm92aWRlZCB0by4gIFdoZW4gdGhlIGtleVR5cGUgaXMKKyAqIEtFWV9UWVBFX1JFTEVBU0UsIHNjb3BlIHNob3VsZCBiZSBzZXQgdG8gdGhlIGtleVNldElkIG9mIHRoZSBrZXlzIGJlaW5nIHJlbGVhc2VkLgorICogUmVsZWFzaW5nIGtleXMgZnJvbSBhIGRldmljZSBpbnZhbGlkYXRlcyB0aGVtIGZvciBhbGwgc2Vzc2lvbnMuCisgKgorICogaW5pdCBjb250YWluZXItc3BlY2lmaWMgZGF0YSwgaXRzIG1lYW5pbmcgaXMgaW50ZXJwcmV0ZWQgYmFzZWQgb24gdGhlIG1pbWUgdHlwZQorICogcHJvdmlkZWQgaW4gdGhlIG1pbWVUeXBlIHBhcmFtZXRlci4gIEl0IGNvdWxkIGNvbnRhaW4sIGZvciBleGFtcGxlLCB0aGUgY29udGVudAorICogSUQsIGtleSBJRCBvciBvdGhlciBkYXRhIG9idGFpbmVkIGZyb20gdGhlIGNvbnRlbnQgbWV0YWRhdGEgdGhhdCBpcyByZXF1aXJlZCBpbgorICogZ2VuZXJhdGluZyB0aGUga2V5IHJlcXVlc3QuIGluaXQgbWF5IGJlIG51bGwgd2hlbiBrZXlUeXBlIGlzIEtFWV9UWVBFX1JFTEVBU0UuCisgKgorICogaW5pdFNpemUgaXMgdGhlIG51bWJlciBvZiBieXRlcyBvZiBpbml0RGF0YQorICoKKyAqIG1pbWVUeXBlIGlkZW50aWZpZXMgdGhlIG1pbWUgdHlwZSBvZiB0aGUgY29udGVudC4KKyAqCisgKiBrZXlUeXBlIHNwZWNpZmVzIHRoZSB0eXBlIG9mIHRoZSByZXF1ZXN0LiBUaGUgcmVxdWVzdCBtYXkgYmUgdG8gYWNxdWlyZSBrZXlzIGZvcgorICogICBzdHJlYW1pbmcgb3Igb2ZmbGluZSBjb250ZW50LCBvciB0byByZWxlYXNlIHByZXZpb3VzbHkgYWNxdWlyZWQga2V5cywgd2hpY2ggYXJlCisgKiAgIGlkZW50aWZpZWQgYnkgYSBrZXlTZXRJZC4KKyAqCisgKiBvcHRpb25hbFBhcmFtZXRlcnMgYXJlIGluY2x1ZGVkIGluIHRoZSBrZXkgcmVxdWVzdCBtZXNzYWdlIHRvIGFsbG93IGEgY2xpZW50CisgKiAgIGFwcGxpY2F0aW9uIHRvIHByb3ZpZGUgYWRkaXRpb25hbCBtZXNzYWdlIHBhcmFtZXRlcnMgdG8gdGhlIHNlcnZlci4KKyAqCisgKiBudW1PcHRpb25hbFBhcmFtZXRlcnMgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2Ygb3B0aW9uYWwgcGFyYW1ldGVycyBwcm92aWRlZAorICogICBieSB0aGUgY2FsbGVyCisgKgorICogT24gZXhpdDoKKyAqICAgMS4gVGhlIGtleVJlcXVlc3QgcG9pbnRlciB3aWxsIHJlZmVyZW5jZSB0aGUgb3BhcXVlIGtleSByZXF1ZXN0IGRhdGEuICBJdAorICogICAgICAgd2lsbCByZXNpZGUgaW4gbWVtb3J5IG93bmVkIGJ5IHRoZSBBTWVkaWFEcm0gb2JqZWN0LCBhbmQgd2lsbCByZW1haW4KKyAqICAgICAgIGFjY2Vzc2libGUgdW50aWwgdGhlIG5leHQgY2FsbCB0byBBTWVkaWFEcm1fZ2V0S2V5UmVxdWVzdCBvciB1bnRpbCB0aGUKKyAqICAgICAgIE1lZGlhRHJtIG9iamVjdCBpcyByZWxlYXNlZC4KKyAqICAgMi4ga2V5UmVxdWVzdFNpemUgd2lsbCBiZSBzZXQgdG8gdGhlIHNpemUgb2YgdGhlIHJlcXVlc3QKKyAqCisgKiByZXR1cm5zIE1FRElBRFJNX05PVF9QUk9WSVNJT05FRF9FUlJPUiBpZiByZXByb3Zpc2lvbmluZyBpcyBuZWVkZWQsIGR1ZSB0byBhCisgKiBwcm9ibGVtIHdpdGggdGhlIGRldmljZSBjZXJ0aWZpY2F0ZS4KKyovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fZ2V0S2V5UmVxdWVzdChBTWVkaWFEcm0gKiwgY29uc3QgQU1lZGlhRHJtU2NvcGUgKnNjb3BlLAorICAgICAgICBjb25zdCB1aW50OF90ICppbml0LCBzaXplX3QgaW5pdFNpemUsIGNvbnN0IGNoYXIgKm1pbWVUeXBlLCBBTWVkaWFEcm1LZXlUeXBlIGtleVR5cGUsCisgICAgICAgIGNvbnN0IEFNZWRpYURybUtleVZhbHVlICpvcHRpb25hbFBhcmFtZXRlcnMsIHNpemVfdCBudW1PcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKiprZXlSZXF1ZXN0LCBzaXplX3QgKmtleVJlcXVlc3RTaXplKTsKKworLyoqCisgKiBBIGtleSByZXNwb25zZSBpcyByZWNlaXZlZCBmcm9tIHRoZSBsaWNlbnNlIHNlcnZlciBieSB0aGUgYXBwLCB0aGVuIGl0IGlzCisgKiBwcm92aWRlZCB0byB0aGUgRFJNIGVuZ2luZSBwbHVnaW4gdXNpbmcgcHJvdmlkZUtleVJlc3BvbnNlLiAgV2hlbiB0aGUKKyAqIHJlc3BvbnNlIGlzIGZvciBhbiBvZmZsaW5lIGtleSByZXF1ZXN0LCBhIGtleVNldElkIGlzIHJldHVybmVkIHRoYXQgY2FuIGJlCisgKiB1c2VkIHRvIGxhdGVyIHJlc3RvcmUgdGhlIGtleXMgdG8gYSBuZXcgc2Vzc2lvbiB3aXRoIEFNZWRpYURybV9yZXN0b3JlS2V5cy4KKyAqIFdoZW4gdGhlIHJlc3BvbnNlIGlzIGZvciBhIHN0cmVhbWluZyBvciByZWxlYXNlIHJlcXVlc3QsIGEgbnVsbCBrZXlTZXRJZCBpcworICogcmV0dXJuZWQuCisgKgorICogc2NvcGUgbWF5IGJlIGEgc2Vzc2lvbklkIG9yIGtleVNldElkIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiB0aGUKKyAqIHJlc3BvbnNlLiAgU2NvcGUgc2hvdWxkIGJlIHNldCB0byB0aGUgc2Vzc2lvbklkIHdoZW4gdGhlIHJlc3BvbnNlIGlzIGZvciBlaXRoZXIKKyAqIHN0cmVhbWluZyBvciBvZmZsaW5lIGtleSByZXF1ZXN0cy4gIFNjb3BlIHNob3VsZCBiZSBzZXQgdG8gdGhlIGtleVNldElkIHdoZW4KKyAqIHRoZSByZXNwb25zZSBpcyBmb3IgYSByZWxlYXNlIHJlcXVlc3QuCisgKgorICogcmVzcG9uc2UgcG9pbnRzIHRvIHRoZSBvcGFxdWUgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyCisgKiByZXNwb25zZVNpemUgc2hvdWxkIGJlIHNldCB0byB0aGUgc2l6ZSBvZiB0aGUgcmVzcG9uc2UgaW4gYnl0ZXMKKyAqLworCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fcHJvdmlkZUtleVJlc3BvbnNlKEFNZWRpYURybSAqLCBjb25zdCBBTWVkaWFEcm1TY29wZSAqc2NvcGUsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnJlc3BvbnNlLCBzaXplX3QgcmVzcG9uc2VTaXplLCBBTWVkaWFEcm1LZXlTZXRJZCAqa2V5U2V0SWQpOworCisvKioKKyAqIFJlc3RvcmUgcGVyc2lzdGVkIG9mZmxpbmUga2V5cyBpbnRvIGEgbmV3IHNlc3Npb24uICBrZXlTZXRJZCBpZGVudGlmaWVzIHRoZQorICoga2V5cyB0byBsb2FkLCBvYnRhaW5lZCBmcm9tIGEgcHJpb3IgY2FsbCB0byBBTWVkaWFEcm1fcHJvdmlkZUtleVJlc3BvbnNlLgorICoKKyAqIHNlc3Npb25JZCBpcyB0aGUgc2Vzc2lvbiBJRCBmb3IgdGhlIERSTSBzZXNzaW9uCisgKiBrZXlTZXRJZCBpZGVudGlmaWVzIHRoZSBzYXZlZCBrZXkgc2V0IHRvIHJlc3RvcmUKKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3Jlc3RvcmVLZXlzKEFNZWRpYURybSAqLCBjb25zdCBBTWVkaWFEcm1TZXNzaW9uSWQgKnNlc3Npb25JZCwKKyAgICAgICAgY29uc3QgQU1lZGlhRHJtS2V5U2V0SWQgKmtleVNldElkKTsKKworLyoqCisgKiBSZW1vdmUgdGhlIGN1cnJlbnQga2V5cyBmcm9tIGEgc2Vzc2lvbi4KKyAqCisgKiBrZXlTZXRJZCBpZGVudGlmaWVzIGtleXMgdG8gcmVtb3ZlCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9yZW1vdmVLZXlzKEFNZWRpYURybSAqLCBjb25zdCBBTWVkaWFEcm1TZXNzaW9uSWQgKmtleVNldElkKTsKKworLyoqCisgKiBSZXF1ZXN0IGFuIGluZm9ybWF0aXZlIGRlc2NyaXB0aW9uIG9mIHRoZSBrZXkgc3RhdHVzIGZvciB0aGUgc2Vzc2lvbi4gIFRoZSBzdGF0dXMgaXMKKyAqIGluIHRoZSBmb3JtIG9mIHtrZXksIHZhbHVlfSBwYWlycy4gIFNpbmNlIERSTSBsaWNlbnNlIHBvbGljaWVzIHZhcnkgYnkgdmVuZG9yLAorICogdGhlIHNwZWNpZmljIHN0YXR1cyBmaWVsZCBuYW1lcyBhcmUgZGV0ZXJtaW5lZCBieSBlYWNoIERSTSB2ZW5kb3IuICBSZWZlciB0byB5b3VyCisgKiBEUk0gcHJvdmlkZXIgZG9jdW1lbnRhdGlvbiBmb3IgZGVmaW5pdGlvbnMgb2YgdGhlIGZpZWxkIG5hbWVzIGZvciBhIHBhcnRpY3VsYXIKKyAqIERSTSBlbmdpbmUgcGx1Z2luLgorICoKKyAqIE9uIGVudHJ5LCBudW1QYWlycyBzaG91bGQgYmUgc2V0IGJ5IHRoZSBjYWxsZXIgdG8gdGhlIG1heGltdW0gbnVtYmVyIG9mIHBhaXJzCisgKiB0aGF0IGNhbiBiZSByZXR1cm5lZCAodGhlIHNpemUgb2YgdGhlIGFycmF5KS4gIE9uIGV4aXQsIG51bVBhaXJzIHdpbGwgYmUgc2V0CisgKiB0byB0aGUgbnVtYmVyIG9mIGVudHJpZXMgd3JpdHRlbiB0byB0aGUgYXJyYXkuICBJZiB0aGUgbnVtYmVyIG9mIHtrZXksIHZhbHVlfSBwYWlycworICogdG8gYmUgcmV0dXJuZWQgaXMgZ3JlYXRlciB0aGFuICpudW1QYWlycywgTUVESUFEUk1fU0hPUlRfQlVGRkVSIHdpbGwgYmUgcmV0dXJuZWQKKyAqIGFuZCBudW1QYWlycyB3aWxsIGJlIHNldCB0byB0aGUgbnVtYmVyIG9mIHBhaXJzIGF2YWlsYWJsZS4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3F1ZXJ5S2V5U3RhdHVzKEFNZWRpYURybSAqLCBjb25zdCBBTWVkaWFEcm1TZXNzaW9uSWQgKnNlc3Npb25JZCwKKyAgICAgICAgQU1lZGlhRHJtS2V5VmFsdWUgKmtleVZhbHVlUGFpcnMsIHNpemVfdCAqbnVtUGFpcnMpOworCisKKy8qKgorICogQSBwcm92aXNpb24gcmVxdWVzdC9yZXNwb25zZSBleGNoYW5nZSBvY2N1cnMgYmV0d2VlbiB0aGUgYXBwIGFuZCBhIHByb3Zpc2lvbmluZworICogc2VydmVyIHRvIHJldHJpZXZlIGEgZGV2aWNlIGNlcnRpZmljYXRlLiAgSWYgcHJvdmlzaW9uaW5pbmcgaXMgcmVxdWlyZWQsIHRoZQorICogRVZFTlRfUFJPVklTSU9OX1JFUVVJUkVEIGV2ZW50IHdpbGwgYmUgc2VudCB0byB0aGUgZXZlbnQgaGFuZGxlci4KKyAqIGdldFByb3Zpc2lvblJlcXVlc3QgaXMgdXNlZCB0byBvYnRhaW4gdGhlIG9wYXF1ZSBwcm92aXNpb24gcmVxdWVzdCBieXRlIGFycmF5IHRoYXQKKyAqIHNob3VsZCBiZSBkZWxpdmVyZWQgdG8gdGhlIHByb3Zpc2lvbmluZyBzZXJ2ZXIuCisgKiBPbiBleGl0OgorICogICAgMS4gVGhlIHByb3Zpc2lvbiByZXF1ZXN0IGRhdGEgd2lsbCBiZSByZWZlcmVuY2VkIGJ5IHByb3Zpc2lvblJlcXVlc3QsIGluCisgKiAgICAgICAgbWVtb3J5IG93bmVkIGJ5IHRoZSBBTWVkaWFEcm0gb2JqZWN0LiAgSXQgd2lsbCByZW1haW4gYWNjZXNzaWJsZSB1bnRpbCB0aGUKKyAqICAgICAgICBuZXh0IGNhbGwgdG8gZ2V0UHJvdmlzaW9uUmVxdWVzdC4KKyAqICAgIDIuIHByb3Zpc2lvblJlcXVlc3RTaXplIHdpbGwgYmUgc2V0IHRvIHRoZSBzaXplIG9mIHRoZSByZXF1ZXN0IGRhdGEuCisgKiAgICAzLiBzZXJ2ZXJVcmwgd2lsbCByZWZlcmVuY2UgYSBOVUxMIHRlcm1pbmF0ZWQgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIFVSTAorICogICAgICAgdGhlIHByb3Zpc2lvbmluZyByZXF1ZXN0IHNob3VsZCBiZSBzZW50IHRvLiAgSXQgd2lsbCByZW1haW4gYWNjZXNzaWJsZSB1bnRpbAorICogICAgICAgdGhlIG5leHQgY2FsbCB0byBnZXRQcm92aXNpb25SZXF1ZXN0LgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fZ2V0UHJvdmlzaW9uUmVxdWVzdChBTWVkaWFEcm0gKiwgY29uc3QgdWludDhfdCAqKnByb3Zpc2lvblJlcXVlc3QsCisgICAgICAgIHNpemVfdCAqcHJvdmlzaW9uUmVxdWVzdFNpemUsIGNvbnN0IGNoYXIgKipzZXJ2ZXJVcmwpOworCisKKy8qKgorICogQWZ0ZXIgYSBwcm92aXNpb24gcmVzcG9uc2UgaXMgcmVjZWl2ZWQgYnkgdGhlIGFwcCwgaXQgaXMgcHJvdmlkZWQgdG8gdGhlIERSTQorICogZW5naW5lIHBsdWdpbiB1c2luZyB0aGlzIG1ldGhvZC4KKyAqCisgKiByZXNwb25zZSBpcyB0aGUgb3BhcXVlIHByb3Zpc2lvbmluZyByZXNwb25zZSBieXRlIGFycmF5IHRvIHByb3ZpZGUgdG8gdGhlCisgKiAgIERSTSBlbmdpbmUgcGx1Z2luLgorICogcmVzcG9uc2VTaXplIGlzIHRoZSBsZW5ndGggb2YgdGhlIHByb3Zpc2lvbmluZyByZXNwb25zZSBpbiBieXRlcy4KKyAqCisgKiByZXR1cm5zIE1FRElBRFJNX0RFVklDRV9SRVZPS0VEX0VSUk9SIGlmIHRoZSByZXNwb25zZSBpbmRpY2F0ZXMgdGhhdCB0aGUKKyAqIHNlcnZlciByZWplY3RlZCB0aGUgcmVxdWVzdAorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fcHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlKEFNZWRpYURybSAqLAorICAgICAgICBjb25zdCB1aW50OF90ICpyZXNwb25zZSwgc2l6ZV90IHJlc3BvbnNlU2l6ZSk7CisKKworLyoqCisgKiBBIG1lYW5zIG9mIGVuZm9yY2luZyBsaW1pdHMgb24gdGhlIG51bWJlciBvZiBjb25jdXJyZW50IHN0cmVhbXMgcGVyIHN1YnNjcmliZXIKKyAqIGFjcm9zcyBkZXZpY2VzIGlzIHByb3ZpZGVkIHZpYSBTZWN1cmVTdG9wLiBUaGlzIGlzIGFjaGlldmVkIGJ5IHNlY3VyZWx5CisgKiBtb25pdG9yaW5nIHRoZSBsaWZldGltZSBvZiBzZXNzaW9ucy4KKyAqCisgKiBJbmZvcm1hdGlvbiBmcm9tIHRoZSBzZXJ2ZXIgcmVsYXRlZCB0byB0aGUgY3VycmVudCBwbGF5YmFjayBzZXNzaW9uIGlzIHdyaXR0ZW4KKyAqIHRvIHBlcnNpc3RlbnQgc3RvcmFnZSBvbiB0aGUgZGV2aWNlIHdoZW4gZWFjaCBNZWRpYUNyeXB0byBvYmplY3QgaXMgY3JlYXRlZC4KKyAqCisgKiBJbiB0aGUgbm9ybWFsIGNhc2UsIHBsYXliYWNrIHdpbGwgYmUgY29tcGxldGVkLCB0aGUgc2Vzc2lvbiBkZXN0cm95ZWQgYW5kIHRoZQorICogU2VjdXJlIFN0b3BzIHdpbGwgYmUgcXVlcmllZC4gVGhlIGFwcCBxdWVyaWVzIHNlY3VyZSBzdG9wcyBhbmQgZm9yd2FyZHMgdGhlCisgKiBzZWN1cmUgc3RvcCBtZXNzYWdlIHRvIHRoZSBzZXJ2ZXIgd2hpY2ggdmVyaWZpZXMgdGhlIHNpZ25hdHVyZSBhbmQgbm90aWZpZXMgdGhlCisgKiBzZXJ2ZXIgc2lkZSBkYXRhYmFzZSB0aGF0IHRoZSBzZXNzaW9uIGRlc3RydWN0aW9uIGhhcyBiZWVuIGNvbmZpcm1lZC4gVGhlIHBlcnNpc3RlZAorICogcmVjb3JkIG9uIHRoZSBjbGllbnQgaXMgb25seSByZW1vdmVkIGFmdGVyIHBvc2l0aXZlIGNvbmZpcm1hdGlvbiB0aGF0IHRoZSBzZXJ2ZXIKKyAqIHJlY2VpdmVkIHRoZSBtZXNzYWdlIHVzaW5nIHJlbGVhc2VTZWN1cmVTdG9wcygpLgorICoKKyAqIG51bVNlY3VyZVN0b3BzIGlzIHNldCBieSB0aGUgY2FsbGVyIHRvIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzZWN1cmUgc3RvcHMgdG8KKyAqIHJldHVybi4gIE9uIGV4aXQsICpudW1TZWN1cmVTdG9wcyB3aWxsIGJlIHNldCB0byB0aGUgbnVtYmVyIGFjdHVhbGx5IHJldHVybmVkLgorICogSWYgKm51bVNlY3VyZVN0b3BzIGlzIHRvbyBzbWFsbCBmb3IgdGhlIG51bWJlciBvZiBzZWN1cmUgc3RvcHMgYXZhaWxhYmxlLAorICogTUVESUFEUk1fU0hPUlRfQlVGRkVSIHdpbGwgYmUgcmV0dXJuZWQgYW5kICpudW1TZWN1cmVTdG9wcyB3aWxsIGJlIHNldCB0byB0aGUKKyAqIG51bWJlciByZXF1aXJlZC4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX2dldFNlY3VyZVN0b3BzKEFNZWRpYURybSAqLAorICAgICAgICBBTWVkaWFEcm1TZWN1cmVTdG9wICpzZWN1cmVTdG9wcywgc2l6ZV90ICpudW1TZWN1cmVTdG9wcyk7CisKKy8qKgorICogUHJvY2VzcyB0aGUgU2VjdXJlU3RvcCBzZXJ2ZXIgcmVzcG9uc2UgbWVzc2FnZSBzc1JlbGVhc2UuICBBZnRlciBhdXRoZW50aWNhdGluZworICogdGhlIG1lc3NhZ2UsIHJlbW92ZSB0aGUgU2VjdXJlU3RvcHMgaWRlbnRpZmllZCBpbiB0aGUgcmVzcG9uc2UuCisgKgorICogc3NSZWxlYXNlIGlzIHRoZSBzZXJ2ZXIgcmVzcG9uc2UgaW5kaWNhdGluZyB3aGljaCBzZWN1cmUgc3RvcHMgdG8gcmVsZWFzZQorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fcmVsZWFzZVNlY3VyZVN0b3BzKEFNZWRpYURybSAqLAorICAgICAgICBjb25zdCBBTWVkaWFEcm1TZWN1cmVTdG9wICpzc1JlbGVhc2UpOworCisvKioKKyAqIFN0cmluZyBwcm9wZXJ0eSBuYW1lOiBpZGVudGlmaWVzIHRoZSBtYWtlciBvZiB0aGUgRFJNIGVuZ2luZSBwbHVnaW4KKyAqLworY29uc3QgY2hhciAqUFJPUEVSVFlfVkVORE9SID0gInZlbmRvciI7CisKKy8qKgorICogU3RyaW5nIHByb3BlcnR5IG5hbWU6IGlkZW50aWZpZXMgdGhlIHZlcnNpb24gb2YgdGhlIERSTSBlbmdpbmUgcGx1Z2luCisgKi8KK2NvbnN0IGNoYXIgKlBST1BFUlRZX1ZFUlNJT04gPSAidmVyc2lvbiI7CisKKy8qKgorICogU3RyaW5nIHByb3BlcnR5IG5hbWU6IGRlc2NyaWJlcyB0aGUgRFJNIGVuZ2luZSBwbHVnaW4KKyAqLworY29uc3QgY2hhciAqUFJPUEVSVFlfREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOworCisvKioKKyAqIFN0cmluZyBwcm9wZXJ0eSBuYW1lOiBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGNpcGhlciBhbmQgbWFjIGFsZ29yaXRobXMKKyAqIHN1cHBvcnRlZCBieSBDcnlwdG9TZXNzaW9uLiAgVGhlIGxpc3QgbWF5IGJlIGVtcHR5IGlmIHRoZSBEUk0gZW5naW5lCisgKiBwbHVnaW4gZG9lcyBub3Qgc3VwcG9ydCBDcnlwdG9TZXNzaW9uIG9wZXJhdGlvbnMuCisgKi8KK2NvbnN0IGNoYXIgKlBST1BFUlRZX0FMR09SSVRITVMgPSAiYWxnb3JpdGhtcyI7CisKKy8qKgorICogUmVhZCBhIERSTSBlbmdpbmUgcGx1Z2luIFN0cmluZyBwcm9wZXJ0eSB2YWx1ZSwgZ2l2ZW4gdGhlIHByb3BlcnR5IG5hbWUgc3RyaW5nLgorICoKKyAqIHByb3BlcnR5TmFtZSBpZGVudGlmaWVzIHRoZSBwcm9wZXJ0eSB0byBxdWVyeQorICogT24gcmV0dXJuLCBwcm9wZXJ0eVZhbHVlIHdpbGwgYmUgc2V0IHRvIHBvaW50IHRvIHRoZSBwcm9wZXJ0eSB2YWx1ZS4gIFRoZQorICogbWVtb3J5IHRoYXQgdGhlIHZhbHVlIHJlc2lkZXMgaW4gaXMgb3duZWQgYnkgdGhlIE5ESyBNZWRpYURybSBBUEkgYW5kCisgKiB3aWxsIHJlbWFpbiB2YWxpZCB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvIEFNZWRpYURybV9nZXRQcm9wZXJ0eVN0cmluZy4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX2dldFByb3BlcnR5U3RyaW5nKEFNZWRpYURybSAqLCBjb25zdCBjaGFyICpwcm9wZXJ0eU5hbWUsCisgICAgICAgIGNvbnN0IGNoYXIgKipwcm9wZXJ0eVZhbHVlKTsKKworLyoqCisgKiBCeXRlIGFycmF5IHByb3BlcnR5IG5hbWU6IHRoZSBkZXZpY2UgdW5pcXVlIGlkZW50aWZpZXIgaXMgZXN0YWJsaXNoZWQgZHVyaW5nCisgKiBkZXZpY2UgcHJvdmlzaW9uaW5nIGFuZCBwcm92aWRlcyBhIG1lYW5zIG9mIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIGVhY2ggZGV2aWNlLgorICovCitjb25zdCBjaGFyICpQUk9QRVJUWV9ERVZJQ0VfVU5JUVVFX0lEID0gImRldmljZVVuaXF1ZUlkIjsKKworLyoqCisgKiBSZWFkIGEgRFJNIGVuZ2luZSBwbHVnaW4gYnl0ZSBhcnJheSBwcm9wZXJ0eSB2YWx1ZSwgZ2l2ZW4gdGhlIHByb3BlcnR5IG5hbWUgc3RyaW5nLgorICogT24gcmV0dXJuLCAqcHJvcGVydHlWYWx1ZSB3aWxsIGJlIHNldCB0byBwb2ludCB0byB0aGUgcHJvcGVydHkgdmFsdWUuICBUaGUKKyAqIG1lbW9yeSB0aGF0IHRoZSB2YWx1ZSByZXNpZGVzIGluIGlzIG93bmVkIGJ5IHRoZSBOREsgTWVkaWFEcm0gQVBJIGFuZAorICogd2lsbCByZW1haW4gdmFsaWQgdW50aWwgdGhlIG5leHQgY2FsbCB0byBBTWVkaWFEcm1fZ2V0UHJvcGVydHlCeXRlQXJyYXkuCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9nZXRQcm9wZXJ0eUJ5dGVBcnJheShBTWVkaWFEcm0gKiwgY29uc3QgY2hhciAqcHJvcGVydHlOYW1lLAorICAgICAgICBBTWVkaWFEcm1CeXRlQXJyYXkgKnByb3BlcnR5VmFsdWUpOworCisvKioKKyAqIFNldCBhIERSTSBlbmdpbmUgcGx1Z2luIFN0cmluZyBwcm9wZXJ0eSB2YWx1ZS4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3NldFByb3BlcnR5U3RyaW5nKEFNZWRpYURybSAqLCBjb25zdCBjaGFyICpwcm9wZXJ0eU5hbWUsCisgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlKTsKKworLyoqCisgKiBTZXQgYSBEUk0gZW5naW5lIHBsdWdpbiBieXRlIGFycmF5IHByb3BlcnR5IHZhbHVlLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fc2V0UHJvcGVydHlCeXRlQXJyYXkoQU1lZGlhRHJtICosIGNvbnN0IGNoYXIgKnByb3BlcnR5TmFtZSwKKyAgICAgICAgY29uc3QgdWludDhfdCAqdmFsdWUsIHNpemVfdCB2YWx1ZVNpemUpOworCisvKioKKyAqIEluIGFkZGl0aW9uIHRvIHN1cHBvcnRpbmcgZGVjcnlwdGlvbiBvZiBEQVNIIENvbW1vbiBFbmNyeXB0ZWQgTWVkaWEsIHRoZQorICogTWVkaWFEcm0gQVBJcyBwcm92aWRlIHRoZSBhYmlsaXR5IHRvIHNlY3VyZWx5IGRlbGl2ZXIgc2Vzc2lvbiBrZXlzIGZyb20KKyAqIGFuIG9wZXJhdG9yJ3Mgc2Vzc2lvbiBrZXkgc2VydmVyIHRvIGEgY2xpZW50IGRldmljZSwgYmFzZWQgb24gdGhlIGZhY3RvcnktaW5zdGFsbGVkCisgKiByb290IG9mIHRydXN0LCBhbmQgdGhlbiBwZXJmb3JtIGVuY3J5cHQsIGRlY3J5cHQsIHNpZ24gYW5kIHZlcmlmeSBvcGVyYXRpb25zCisgKiB3aXRoIHRoZSBzZXNzaW9uIGtleSBvbiBhcmJpdHJhcnkgdXNlciBkYXRhLgorICoKKyAqIE9wZXJhdG9ycyBjcmVhdGUgc2Vzc2lvbiBrZXkgc2VydmVycyB0aGF0IHJlY2VpdmUgc2Vzc2lvbiBrZXkgcmVxdWVzdHMgYW5kIHByb3ZpZGUKKyAqIGVuY3J5cHRlZCBzZXNzaW9uIGtleXMgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIGdlbmVyYWwgcHVycG9zZSBjcnlwdG8gb3BlcmF0aW9ucy4KKyAqCisgKiBHZW5lcmljIGVuY3J5cHQvZGVjcnlwdC9zaWduL3ZlcmlmeSBtZXRob2RzIGFyZSBiYXNlZCBvbiB0aGUgZXN0YWJsaXNoZWQgc2Vzc2lvbgorICoga2V5cy4gIFRoZXNlIGtleXMgYXJlIGV4Y2hhbmdlZCB1c2luZyB0aGUgZ2V0S2V5UmVxdWVzdC9wcm92aWRlS2V5UmVzcG9uc2UgbWV0aG9kcy4KKyAqCisgKiBBcHBsaWNhdGlvbnMgb2YgdGhpcyBjYXBhYmlsaXR5IGluY2x1ZGUgc2VjdXJpbmcgdmFyaW91cyB0eXBlcyBvZiBwdXJjaGFzZWQgb3IKKyAqIHByaXZhdGUgY29udGVudCwgc3VjaCBhcyBhcHBsaWNhdGlvbnMsIGJvb2tzIGFuZCBvdGhlciBtZWRpYSwgcGhvdG9zIG9yIG1lZGlhCisgKiBkZWxpdmVyeSBwcm90b2NvbHMuCisgKi8KKworLyoKKyAqIEVuY3J5cHQgdGhlIGRhdGEgcmVmZXJlbmNlZCBieSBpbnB1dCBvZiBsZW5ndGggZGF0YVNpemUgdXNpbmcgYWxnb3JpdGhtIHNwZWNpZmllZAorICogYnkgY2lwaGVyQWxnb3JpdGhtLCBhbmQgd3JpdGUgdGhlIGVuY3J5cHRlZCByZXN1bHQgaW50byBvdXRwdXQuICBUaGUgY2FsbGVyIG11c3QKKyAqIGVuc3VyZSB0aGF0IHRoZSBvdXRwdXQgYnVmZmVyIGlzIGxhcmdlIGVub3VnaCB0byBhY2NlcHQgZGF0YVNpemUgYnl0ZXMuIFRoZSBrZXkKKyAqIHRvIHVzZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSAxNiBieXRlIGtleUlkLiAgVGhlIGtleSBtdXN0IGhhdmUgYmVlbiBsb2FkZWQgaW50bworICogdGhlIHNlc3Npb24gdXNpbmcgcHJvdmlkZUtleVJlc3BvbnNlLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fZW5jcnlwdChBTWVkaWFEcm0gKiwgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQsCisgICAgICAgIGNvbnN0IGNoYXIgKmNpcGhlckFsZ29yaXRobSwgdWludDhfdCAqa2V5SWQsIHVpbnQ4X3QgKml2LAorICAgICAgICBjb25zdCB1aW50OF90ICppbnB1dCwgdWludDhfdCAqb3V0cHV0LCBzaXplX3QgZGF0YVNpemUpOworCisvKgorICogRGVjcnlwdCB0aGUgZGF0YSByZWZlcmVuY2VkIGJ5IGlucHV0IG9mIGxlbmd0aCBkYXRhU2l6ZSB1c2luZyBhbGdvcml0aG0gc3BlY2lmaWVkCisgKiBieSBjaXBoZXJBbGdvcml0aG0sIGFuZCB3cml0ZSB0aGUgZGVjcnlwdGVkIHJlc3VsdCBpbnRvIG91dHB1dC4gIFRoZSBjYWxsZXIgbXVzdAorICogZW5zdXJlIHRoYXQgdGhlIG91dHB1dCBidWZmZXIgaXMgbGFyZ2UgZW5vdWdoIHRvIGFjY2VwdCBkYXRhU2l6ZSBieXRlcy4gIFRoZSBrZXkKKyAqIHRvIHVzZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSAxNiBieXRlIGtleUlkLiAgVGhlIGtleSBtdXN0IGhhdmUgYmVlbiBsb2FkZWQgaW50bworICogdGhlIHNlc3Npb24gdXNpbmcgcHJvdmlkZUtleVJlc3BvbnNlLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fZGVjcnlwdChBTWVkaWFEcm0gKiwgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQsCisgICAgICAgIGNvbnN0IGNoYXIgKmNpcGhlckFsZ29yaXRobSwgdWludDhfdCAqa2V5SWQsIHVpbnQ4X3QgKml2LAorICAgICAgICBjb25zdCB1aW50OF90ICppbnB1dCwgdWludDhfdCAqb3V0cHV0LCBzaXplX3QgZGF0YVNpemUpOworCisvKgorICogR2VuZXJhdGUgYSBzaWduYXR1cmUgdXNpbmcgdGhlIHNwZWNpZmllZCBtYWNBbGdvcml0aG0gb3ZlciB0aGUgbWVzc2FnZSBkYXRhCisgKiByZWZlcmVuY2VkIGJ5IG1lc3NhZ2Ugb2Ygc2l6ZSBtZXNzYWdlU2l6ZSBhbmQgc3RvcmUgdGhlIHNpZ25hdHVyZSBpbiB0aGUKKyAqIGJ1ZmZlciByZWZlcmVuY2VkIHNpZ25hdHVyZSBvZiBtYXggc2l6ZSAqc2lnbmF0dXJlU2l6ZS4gIElmIHRoZSBidWZmZXIgaXMgbm90CisgKiBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUgc2lnbmF0dXJlLCBNRURJQURSTV9TSE9SVF9CVUZGRVIgaXMgcmV0dXJuZWQgYW5kCisgKiAqc2lnbmF0dXJlU2l6ZSBpcyBzZXQgdG8gdGhlIGJ1ZmZlciBzaXplIHJlcXVpcmVkLiAgVGhlIGtleSB0byB1c2UgaXMgaWRlbnRpZmllZAorICogYnkgdGhlIDE2IGJ5dGUga2V5SWQuICBUaGUga2V5IG11c3QgaGF2ZSBiZWVuIGxvYWRlZCBpbnRvIHRoZSBzZXNzaW9uIHVzaW5nCisgKiBwcm92aWRlS2V5UmVzcG9uc2UuCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9zaWduKEFNZWRpYURybSAqLCBjb25zdCBBTWVkaWFEcm1TZXNzaW9uSWQgKnNlc3Npb25JZCwKKyAgICAgICAgY29uc3QgY2hhciAqbWFjQWxnb3JpdGhtLCB1aW50OF90ICprZXlJZCwgdWludDhfdCAqbWVzc2FnZSwgc2l6ZV90IG1lc3NhZ2VTaXplLAorICAgICAgICB1aW50OF90ICpzaWduYXR1cmUsIHNpemVfdCAqc2lnbmF0dXJlU2l6ZSk7CisKKy8qCisgKiBQZXJmb3JtIGEgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiB1c2luZyB0aGUgc3BlY2lmaWVkIG1hY0FsZ29yaXRobSBvdmVyIHRoZSBtZXNzYWdlCisgKiBkYXRhIHJlZmVyZW5jZWQgYnkgdGhlIG1lc3NhZ2UgcGFyYW1ldGVyIG9mIHNpemUgbWVzc2FnZVNpemUuIFJldHVybnMgTUVESUFEUk1fT0sKKyAqIGlmIHRoZSBzaWduYXR1cmUgbWF0Y2hlcywgb3RoZXJ3aXNlIE1FREFJRFJNX1ZFUklGWV9GQUlMRUQgaXMgcmV0dXJuZWQuIFRoZSBrZXkgdG8KKyAqIHVzZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSAxNiBieXRlIGtleUlkLiAgVGhlIGtleSBtdXN0IGhhdmUgYmVlbiBsb2FkZWQgaW50byB0aGUKKyAqIHNlc3Npb24gdXNpbmcgcHJvdmlkZUtleVJlc3BvbnNlLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fdmVyaWZ5KEFNZWRpYURybSAqLCBjb25zdCBBTWVkaWFEcm1TZXNzaW9uSWQgKnNlc3Npb25JZCwKKyAgICAgICAgY29uc3QgY2hhciAqbWFjQWxnb3JpdGhtLCB1aW50OF90ICprZXlJZCwgY29uc3QgdWludDhfdCAqbWVzc2FnZSwgc2l6ZV90IG1lc3NhZ2VTaXplLAorICAgICAgICBjb25zdCB1aW50OF90ICpzaWduYXR1cmUsIHNpemVfdCBzaWduYXR1cmVTaXplKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgLy9fTkRLX01FRElBX0RSTV9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL25kay9OZGtNZWRpYUVycm9yLmggYi9pbmNsdWRlL25kay9OZGtNZWRpYUVycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI2MTNlYgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmRrL05ka01lZGlhRXJyb3IuaApAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisvKgorICogVGhpcyBmaWxlIGRlZmluZXMgYW4gTkRLIEFQSS4KKyAqIERvIG5vdCByZW1vdmUgbWV0aG9kcy4KKyAqIERvIG5vdCBjaGFuZ2UgbWV0aG9kIHNpZ25hdHVyZXMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSB2YWx1ZSBvZiBjb25zdGFudHMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSBzaXplIG9mIGFueSBvZiB0aGUgY2xhc3NlcyBkZWZpbmVkIGluIGhlcmUuCisgKiBEbyBub3QgcmVmZXJlbmNlIHR5cGVzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBOREsuCisgKiBEbyBub3QgI2luY2x1ZGUgZmlsZXMgdGhhdCBhcmVuJ3QgcGFydCBvZiB0aGUgTkRLLgorICovCisKKyNpZm5kZWYgX05ES19NRURJQV9FUlJPUl9ICisjZGVmaW5lIF9OREtfTUVESUFfRVJST1JfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYgZW51bSB7CisgICAgQU1FRElBX09LID0gMCwKKworICAgIEFNRURJQV9FUlJPUl9CQVNFICAgICAgICAgICAgICAgICAgPSAtMTAwMDAsCisgICAgQU1FRElBX0VSUk9SX1VOS05PV04gICAgICAgICAgICAgICA9IEFNRURJQV9FUlJPUl9CQVNFLAorICAgIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQgICAgICAgICAgICAgPSBBTUVESUFfRVJST1JfQkFTRSAtIDEsCisgICAgQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEICAgICAgICAgICA9IEFNRURJQV9FUlJPUl9CQVNFIC0gMiwKKyAgICBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1QgICAgICAgID0gQU1FRElBX0VSUk9SX0JBU0UgLSAzLAorICAgIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUiAgICAgPSBBTUVESUFfRVJST1JfQkFTRSAtIDQsCisKKyAgICBBTUVESUFfRFJNX0VSUk9SX0JBU0UgICAgICAgICAgICAgID0gLTIwMDAwLAorICAgIEFNRURJQV9EUk1fTk9UX1BST1ZJU0lPTkVEICAgICAgICAgPSBBTUVESUFfRFJNX0VSUk9SX0JBU0UgLSAxLAorICAgIEFNRURJQV9EUk1fUkVTT1VSQ0VfQlVTWSAgICAgICAgICAgPSBBTUVESUFfRFJNX0VSUk9SX0JBU0UgLSAyLAorICAgIEFNRURJQV9EUk1fREVWSUNFX1JFVk9LRUQgICAgICAgICAgPSBBTUVESUFfRFJNX0VSUk9SX0JBU0UgLSAzLAorICAgIEFNRURJQV9EUk1fU0hPUlRfQlVGRkVSICAgICAgICAgICAgPSBBTUVESUFfRFJNX0VSUk9SX0JBU0UgLSA0LAorICAgIEFNRURJQV9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEICAgICAgPSBBTUVESUFfRFJNX0VSUk9SX0JBU0UgLSA1LAorICAgIEFNRURJQV9EUk1fVEFNUEVSX0RFVEVDVEVEICAgICAgICAgPSBBTUVESUFfRFJNX0VSUk9SX0JBU0UgLSA2LAorICAgIEFNRURJQV9EUk1fVkVSSUZZX0ZBSUxFRCAgICAgICAgICAgPSBBTUVESUFfRFJNX0VSUk9SX0JBU0UgLSA3LAorICAgIEFNRURJQV9EUk1fTkVFRF9LRVkgICAgICAgICAgICAgICAgPSBBTUVESUFfRFJNX0VSUk9SX0JBU0UgLSA4LAorICAgIEFNRURJQV9EUk1fTElDRU5TRV9FWFBJUkVEICAgICAgICAgPSBBTUVESUFfRFJNX0VSUk9SX0JBU0UgLSA5LAorCit9IG1lZGlhX3N0YXR1c190OworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmIC8vIF9OREtfTUVESUFfRVJST1JfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZGsvTmRrTWVkaWFFeHRyYWN0b3IuaCBiL2luY2x1ZGUvbmRrL05ka01lZGlhRXh0cmFjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E0ZTcwMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmRrL05ka01lZGlhRXh0cmFjdG9yLmgKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKy8qCisgKiBUaGlzIGZpbGUgZGVmaW5lcyBhbiBOREsgQVBJLgorICogRG8gbm90IHJlbW92ZSBtZXRob2RzLgorICogRG8gbm90IGNoYW5nZSBtZXRob2Qgc2lnbmF0dXJlcy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIGNvbnN0YW50cy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHNpemUgb2YgYW55IG9mIHRoZSBjbGFzc2VzIGRlZmluZWQgaW4gaGVyZS4KKyAqIERvIG5vdCByZWZlcmVuY2UgdHlwZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIE5ESy4KKyAqIERvIG5vdCAjaW5jbHVkZSBmaWxlcyB0aGF0IGFyZW4ndCBwYXJ0IG9mIHRoZSBOREsuCisgKi8KKworI2lmbmRlZiBfTkRLX01FRElBX0VYVFJBQ1RPUl9ICisjZGVmaW5lIF9OREtfTUVESUFfRVhUUkFDVE9SX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiTmRrTWVkaWFDb2RlYy5oIgorI2luY2x1ZGUgIk5ka01lZGlhRm9ybWF0LmgiCisjaW5jbHVkZSAiTmRrTWVkaWFDcnlwdG8uaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgQU1lZGlhRXh0cmFjdG9yOwordHlwZWRlZiBzdHJ1Y3QgQU1lZGlhRXh0cmFjdG9yIEFNZWRpYUV4dHJhY3RvcjsKKworCisvKioKKyAqIENyZWF0ZSBuZXcgbWVkaWEgZXh0cmFjdG9yCisgKi8KK0FNZWRpYUV4dHJhY3RvciogQU1lZGlhRXh0cmFjdG9yX25ldygpOworCisvKioKKyAqIERlbGV0ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBtZWRpYSBleHRyYWN0b3IKKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX2RlbGV0ZShBTWVkaWFFeHRyYWN0b3IqKTsKKworLyoqCisgKiAgU2V0IHRoZSBmaWxlIGRlc2NyaXB0b3IgZnJvbSB3aGljaCB0aGUgZXh0cmFjdG9yIHdpbGwgcmVhZC4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2VGZChBTWVkaWFFeHRyYWN0b3IqLCBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCk7CisKKy8qKgorICogU2V0IHRoZSBVUkkgZnJvbSB3aGljaCB0aGUgZXh0cmFjdG9yIHdpbGwgcmVhZC4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2UoQU1lZGlhRXh0cmFjdG9yKiwgY29uc3QgY2hhciAqbG9jYXRpb24pOyAvLyBUT0RPIHN1cHBvcnQgaGVhZGVycworCisvKioKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHRyYWNrcyBpbiB0aGUgcHJldmlvdXNseSBzcGVjaWZpZWQgbWVkaWEgZmlsZQorICovCitzaXplX3QgQU1lZGlhRXh0cmFjdG9yX2dldFRyYWNrQ291bnQoQU1lZGlhRXh0cmFjdG9yKik7CisKKy8qKgorICogUmV0dXJuIHRoZSBmb3JtYXQgb2YgdGhlIHNwZWNpZmllZCB0cmFjay4gVGhlIGNhbGxlciBtdXN0IGZyZWUgdGhlIHJldHVybmVkIGZvcm1hdAorICovCitBTWVkaWFGb3JtYXQqIEFNZWRpYUV4dHJhY3Rvcl9nZXRUcmFja0Zvcm1hdChBTWVkaWFFeHRyYWN0b3IqLCBzaXplX3QgaWR4KTsKKworLyoqCisgKiBTZWxlY3QgdGhlIHNwZWNpZmllZCB0cmFjay4gU3Vic2VxdWVudCBjYWxscyB0byByZWFkU2FtcGxlRGF0YSwgZ2V0U2FtcGxlVHJhY2tJbmRleCBhbmQKKyAqIGdldFNhbXBsZVRpbWUgb25seSByZXRyaWV2ZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHN1YnNldCBvZiB0cmFja3Mgc2VsZWN0ZWQuCisgKiBTZWxlY3RpbmcgdGhlIHNhbWUgdHJhY2sgbXVsdGlwbGUgdGltZXMgaGFzIG5vIGVmZmVjdCwgdGhlIHRyYWNrIGlzCisgKiBvbmx5IHNlbGVjdGVkIG9uY2UuCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9zZWxlY3RUcmFjayhBTWVkaWFFeHRyYWN0b3IqLCBzaXplX3QgaWR4KTsKKworLyoqCisgKiBVbnNlbGVjdCB0aGUgc3BlY2lmaWVkIHRyYWNrLiBTdWJzZXF1ZW50IGNhbGxzIHRvIHJlYWRTYW1wbGVEYXRhLCBnZXRTYW1wbGVUcmFja0luZGV4IGFuZAorICogZ2V0U2FtcGxlVGltZSBvbmx5IHJldHJpZXZlIGluZm9ybWF0aW9uIGZvciB0aGUgc3Vic2V0IG9mIHRyYWNrcyBzZWxlY3RlZC4uCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl91bnNlbGVjdFRyYWNrKEFNZWRpYUV4dHJhY3RvciosIHNpemVfdCBpZHgpOworCisvKioKKyAqIFJlYWQgdGhlIGN1cnJlbnQgc2FtcGxlLgorICovCitzc2l6ZV90IEFNZWRpYUV4dHJhY3Rvcl9yZWFkU2FtcGxlRGF0YShBTWVkaWFFeHRyYWN0b3IqLCB1aW50OF90ICpidWZmZXIsIHNpemVfdCBjYXBhY2l0eSk7CisKKy8qKgorICogUmVhZCB0aGUgY3VycmVudCBzYW1wbGUncyBmbGFncy4KKyAqLwordWludDMyX3QgQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZUZsYWdzKEFNZWRpYUV4dHJhY3RvciopOyAvLyBzZWUgZGVmaW5pdGlvbnMgYmVsb3cKKworLyoqCisgKiBSZXR1cm5zIHRoZSB0cmFjayBpbmRleCB0aGUgY3VycmVudCBzYW1wbGUgb3JpZ2luYXRlcyBmcm9tIChvciAtMQorICogaWYgbm8gbW9yZSBzYW1wbGVzIGFyZSBhdmFpbGFibGUpCisgKi8KK2ludCBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlVHJhY2tJbmRleChBTWVkaWFFeHRyYWN0b3IqKTsKKworLyoqCisgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNhbXBsZSdzIHByZXNlbnRhdGlvbiB0aW1lIGluIG1pY3Jvc2Vjb25kcy4KKyAqIG9yIC0xIGlmIG5vIG1vcmUgc2FtcGxlcyBhcmUgYXZhaWxhYmxlLgorICovCitpbnQ2NF90IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVUaW1lKEFNZWRpYUV4dHJhY3RvciopOworCisvKioKKyAqIEFkdmFuY2UgdG8gdGhlIG5leHQgc2FtcGxlLiBSZXR1cm5zIGZhbHNlIGlmIG5vIG1vcmUgc2FtcGxlIGRhdGEKKyAqIGlzIGF2YWlsYWJsZSAoZW5kIG9mIHN0cmVhbSkuCisgKi8KK2Jvb2wgQU1lZGlhRXh0cmFjdG9yX2FkdmFuY2UoQU1lZGlhRXh0cmFjdG9yKik7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQU1FRElBRVhUUkFDVE9SX1NFRUtfUFJFVklPVVNfU1lOQywKKyAgICBBTUVESUFFWFRSQUNUT1JfU0VFS19ORVhUX1NZTkMsCisgICAgQU1FRElBRVhUUkFDVE9SX1NFRUtfQ0xPU0VTVF9TWU5DCit9IFNlZWtNb2RlOworCisvKioKKyAqCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9zZWVrVG8oQU1lZGlhRXh0cmFjdG9yKiwgaW50NjRfdCBzZWVrUG9zVXMsIFNlZWtNb2RlIG1vZGUpOworCisvKioKKyAqIG1hcHBpbmcgb2YgY3J5cHRvIHNjaGVtZSB1dWlkIHRvIHRoZSBzY2hlbWUgc3BlY2lmaWMgZGF0YSBmb3IgdGhhdCBzY2hlbWUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgUHNzaEVudHJ5IHsKKyAgICBBTWVkaWFVVUlEIHV1aWQ7CisgICAgc2l6ZV90IGRhdGFsZW47CisgICAgdm9pZCAqZGF0YTsKK30gUHNzaEVudHJ5OworCisvKioKKyAqIGxpc3Qgb2YgY3J5cHRvIHNjaGVtZXMgYW5kIHRoZWlyIGRhdGEKKyAqLwordHlwZWRlZiBzdHJ1Y3QgUHNzaEluZm8geworICAgIHNpemVfdCBudW1lbnRyaWVzOworICAgIFBzc2hFbnRyeSBlbnRyaWVzWzBdOworfSBQc3NoSW5mbzsKKworLyoqCisgKiBHZXQgdGhlIFBTU0ggaW5mbyBpZiBwcmVzZW50LgorICovCitQc3NoSW5mbyogQU1lZGlhRXh0cmFjdG9yX2dldFBzc2hJbmZvKEFNZWRpYUV4dHJhY3RvciopOworCisKK0FNZWRpYUNvZGVjQ3J5cHRvSW5mbyAqQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZUNyeXB0b0luZm8oQU1lZGlhRXh0cmFjdG9yICopOworCisKK2VudW0geworICAgIEFNRURJQUVYVFJBQ1RPUl9TQU1QTEVfRkxBR19TWU5DID0gMSwKKyAgICBBTUVESUFFWFRSQUNUT1JfU0FNUExFX0ZMQUdfRU5DUllQVEVEID0gMiwKK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmIC8vIF9OREtfTUVESUFfRVhUUkFDVE9SX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmRrL05ka01lZGlhRm9ybWF0LmggYi9pbmNsdWRlL25kay9OZGtNZWRpYUZvcm1hdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMjk3OTEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25kay9OZGtNZWRpYUZvcm1hdC5oCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIGFuIE5ESyBBUEkuCisgKiBEbyBub3QgcmVtb3ZlIG1ldGhvZHMuCisgKiBEbyBub3QgY2hhbmdlIG1ldGhvZCBzaWduYXR1cmVzLgorICogRG8gbm90IGNoYW5nZSB0aGUgdmFsdWUgb2YgY29uc3RhbnRzLgorICogRG8gbm90IGNoYW5nZSB0aGUgc2l6ZSBvZiBhbnkgb2YgdGhlIGNsYXNzZXMgZGVmaW5lZCBpbiBoZXJlLgorICogRG8gbm90IHJlZmVyZW5jZSB0eXBlcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgTkRLLgorICogRG8gbm90ICNpbmNsdWRlIGZpbGVzIHRoYXQgYXJlbid0IHBhcnQgb2YgdGhlIE5ESy4KKyAqLworCisjaWZuZGVmIF9OREtfTUVESUFfRk9STUFUX0gKKyNkZWZpbmUgX05ES19NRURJQV9GT1JNQVRfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJOZGtNZWRpYUVycm9yLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IEFNZWRpYUZvcm1hdDsKK3R5cGVkZWYgc3RydWN0IEFNZWRpYUZvcm1hdCBBTWVkaWFGb3JtYXQ7CisKK0FNZWRpYUZvcm1hdCAqQU1lZGlhRm9ybWF0X25ldygpOworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRm9ybWF0X2RlbGV0ZShBTWVkaWFGb3JtYXQqKTsKKworLyoqCisgKiBIdW1hbiByZWFkYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZm9ybWF0LiBUaGUgcmV0dXJuZWQgc3RyaW5nIGlzIG93bmVkIGJ5IHRoZSBmb3JtYXQsCisgKiBhbmQgcmVtYWlucyB2YWxpZCB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvIHRvU3RyaW5nLCBvciB1bnRpbCB0aGUgZm9ybWF0IGlzIGRlbGV0ZWQuCisgKi8KK2NvbnN0IGNoYXIqIEFNZWRpYUZvcm1hdF90b1N0cmluZyhBTWVkaWFGb3JtYXQqKTsKKworYm9vbCBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciAqbmFtZSwgaW50MzJfdCAqb3V0KTsKK2Jvb2wgQU1lZGlhRm9ybWF0X2dldEludDY0KEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIgKm5hbWUsIGludDY0X3QgKm91dCk7Citib29sIEFNZWRpYUZvcm1hdF9nZXRGbG9hdChBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyICpuYW1lLCBmbG9hdCAqb3V0KTsKKy8qKgorICogVGhlIHJldHVybmVkIGRhdGEgaXMgb3duZWQgYnkgdGhlIGZvcm1hdCBhbmQgcmVtYWlucyB2YWxpZCBhcyBsb25nIGFzIHRoZSBuYW1lZCBlbnRyeQorICogaXMgcGFydCBvZiB0aGUgZm9ybWF0LgorICovCitib29sIEFNZWRpYUZvcm1hdF9nZXRCdWZmZXIoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCoqIGRhdGEsIHNpemVfdCAqc2l6ZSk7CisvKioKKyAqIFRoZSByZXR1cm5lZCBzdHJpbmcgaXMgb3duZWQgYnkgdGhlIGZvcm1hdCwgYW5kIHJlbWFpbnMgdmFsaWQgdW50aWwgdGhlIG5leHQgY2FsbCB0byBnZXRTdHJpbmcsCisgKiBvciB1bnRpbCB0aGUgZm9ybWF0IGlzIGRlbGV0ZWQuCisgKi8KK2Jvb2wgQU1lZGlhRm9ybWF0X2dldFN0cmluZyhBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqb3V0KTsKKworCit2b2lkIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyKiBuYW1lLCBpbnQzMl90IHZhbHVlKTsKK3ZvaWQgQU1lZGlhRm9ybWF0X3NldEludDY0KEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIqIG5hbWUsIGludDY0X3QgdmFsdWUpOwordm9pZCBBTWVkaWFGb3JtYXRfc2V0RmxvYXQoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciogbmFtZSwgZmxvYXQgdmFsdWUpOworLyoqCisgKiBUaGUgcHJvdmlkZWQgc3RyaW5nIGlzIGNvcGllZCBpbnRvIHRoZSBmb3JtYXQuCisgKi8KK3ZvaWQgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2YWx1ZSk7CisvKioKKyAqIFRoZSBwcm92aWRlZCBkYXRhIGlzIGNvcGllZCBpbnRvIHRoZSBmb3JtYXQuCisgKi8KK3ZvaWQgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyKiBuYW1lLCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKworCisvKioKKyAqIFhYWCBzaG91bGQgdGhlc2UgYmUgaW50cy9lbnVtcyB0aGF0IHdlIGxvb2sgdXAgaW4gYSB0YWJsZSBhcyBuZWVkZWQ/CisgKi8KK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19QUk9GSUxFOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEU7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5UOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9NQVNLOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfRk9STUFUOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT047CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9GTEFDX0NPTVBSRVNTSU9OX0xFVkVMOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfUkFURTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVDsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lTX0FEVFM7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JU19BVVRPU0VMRUNUOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfREVGQVVMVDsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lTX0ZPUkNFRF9TVUJUSVRMRTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lfRlJBTUVfSU5URVJWQUw7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MQU5HVUFHRTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9IRUlHSFQ7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9XSURUSDsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01JTUU7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QVVNIX0JMQU5LX0JVRkZFUlNfT05fU1RPUDsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1JFUEVBVF9QUkVWSU9VU19GUkFNRV9BRlRFUjsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfV0lEVEg7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TVFJJREU7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmIC8vIF9OREtfTUVESUFfRk9STUFUX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmRrL05ka01lZGlhTXV4ZXIuaCBiL2luY2x1ZGUvbmRrL05ka01lZGlhTXV4ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGQ5NDZjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9uZGsvTmRrTWVkaWFNdXhlci5oCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisvKgorICogVGhpcyBmaWxlIGRlZmluZXMgYW4gTkRLIEFQSS4KKyAqIERvIG5vdCByZW1vdmUgbWV0aG9kcy4KKyAqIERvIG5vdCBjaGFuZ2UgbWV0aG9kIHNpZ25hdHVyZXMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSB2YWx1ZSBvZiBjb25zdGFudHMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSBzaXplIG9mIGFueSBvZiB0aGUgY2xhc3NlcyBkZWZpbmVkIGluIGhlcmUuCisgKiBEbyBub3QgcmVmZXJlbmNlIHR5cGVzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBOREsuCisgKiBEbyBub3QgI2luY2x1ZGUgZmlsZXMgdGhhdCBhcmVuJ3QgcGFydCBvZiB0aGUgTkRLLgorICovCisKKyNpZm5kZWYgX05ES19NRURJQV9NVVhFUl9ICisjZGVmaW5lIF9OREtfTUVESUFfTVVYRVJfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJOZGtNZWRpYUNvZGVjLmgiCisjaW5jbHVkZSAiTmRrTWVkaWFFcnJvci5oIgorI2luY2x1ZGUgIk5ka01lZGlhRm9ybWF0LmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IEFNZWRpYU11eGVyOwordHlwZWRlZiBzdHJ1Y3QgQU1lZGlhTXV4ZXIgQU1lZGlhTXV4ZXI7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQU1FRElBTVVYRVJfT1VUUFVUX0ZPUk1BVF9NUEVHXzQgPSAwLAorICAgIEFNRURJQU1VWEVSX09VVFBVVF9GT1JNQVRfV0VCTSAgID0gMSwKK30gT3V0cHV0Rm9ybWF0OworCisvKioKKyAqIENyZWF0ZSBuZXcgbWVkaWEgbXV4ZXIKKyAqLworQU1lZGlhTXV4ZXIqIEFNZWRpYU11eGVyX25ldyhpbnQgZmQsIE91dHB1dEZvcm1hdCBmb3JtYXQpOworCisvKioKKyAqIERlbGV0ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBtZWRpYSBtdXhlcgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFNdXhlcl9kZWxldGUoQU1lZGlhTXV4ZXIqKTsKKworLyoqCisgKiBTZXQgYW5kIHN0b3JlIHRoZSBnZW9kYXRhIChsYXRpdHVkZSBhbmQgbG9uZ2l0dWRlKSBpbiB0aGUgb3V0cHV0IGZpbGUuCisgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBBTWVkaWFNdXhlcl9zdGFydC4gVGhlIGdlb2RhdGEgaXMgc3RvcmVkCisgKiBpbiB1ZHRhIGJveCBpZiB0aGUgb3V0cHV0IGZvcm1hdCBpcyBBTUVESUFNVVhFUl9PVVRQVVRfRk9STUFUX01QRUdfNCwgYW5kIGlzCisgKiBpZ25vcmVkIGZvciBvdGhlciBvdXRwdXQgZm9ybWF0cy4KKyAqIFRoZSBnZW9kYXRhIGlzIHN0b3JlZCBhY2NvcmRpbmcgdG8gSVNPLTY3MDkgc3RhbmRhcmQuCisgKgorICogQm90aCB2YWx1ZXMgYXJlIHNwZWNpZmllZCBpbiBkZWdyZWVzLgorICogTGF0aXR1ZGUgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWy05MCwgOTBdLgorICogTG9uZ2l0dWRlIG11c3QgYmUgaW4gdGhlIHJhbmdlIFstMTgwLCAxODBdLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFNdXhlcl9zZXRMb2NhdGlvbihBTWVkaWFNdXhlciosIGZsb2F0IGxhdGl0dWRlLCBmbG9hdCBsb25naXR1ZGUpOworCisvKioKKyAqIFNldHMgdGhlIG9yaWVudGF0aW9uIGhpbnQgZm9yIG91dHB1dCB2aWRlbyBwbGF5YmFjay4KKyAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIEFNZWRpYU11eGVyX3N0YXJ0LiBDYWxsaW5nIHRoaXMKKyAqIG1ldGhvZCB3aWxsIG5vdCByb3RhdGUgdGhlIHZpZGVvIGZyYW1lIHdoZW4gbXV4ZXIgaXMgZ2VuZXJhdGluZyB0aGUgZmlsZSwKKyAqIGJ1dCBhZGQgYSBjb21wb3NpdGlvbiBtYXRyaXggY29udGFpbmluZyB0aGUgcm90YXRpb24gYW5nbGUgaW4gdGhlIG91dHB1dAorICogdmlkZW8gaWYgdGhlIG91dHB1dCBmb3JtYXQgaXMgQU1FRElBTVVYRVJfT1VUUFVUX0ZPUk1BVF9NUEVHXzQsIHNvIHRoYXQgYQorICogdmlkZW8gcGxheWVyIGNhbiBjaG9vc2UgdGhlIHByb3BlciBvcmllbnRhdGlvbiBmb3IgcGxheWJhY2suCisgKiBOb3RlIHRoYXQgc29tZSB2aWRlbyBwbGF5ZXJzIG1heSBjaG9vc2UgdG8gaWdub3JlIHRoZSBjb21wb3NpdGlvbiBtYXRyaXgKKyAqIGR1cmluZyBwbGF5YmFjay4KKyAqIFRoZSBhbmdsZSBpcyBzcGVjaWZpZWQgaW4gZGVncmVlcywgY2xvY2t3aXNlLgorICogVGhlIHN1cHBvcnRlZCBhbmdsZXMgYXJlIDAsIDkwLCAxODAsIGFuZCAyNzAgZGVncmVlcy4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhTXV4ZXJfc2V0T3JpZW50YXRpb25IaW50KEFNZWRpYU11eGVyKiwgaW50IGRlZ3JlZXMpOworCisvKioKKyAqIEFkZHMgYSB0cmFjayB3aXRoIHRoZSBzcGVjaWZpZWQgZm9ybWF0LgorICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG5ldyB0cmFjayBvciBhIG5lZ2F0aXZlIHZhbHVlIGluIGNhc2Ugb2YgZmFpbHVyZSwKKyAqIHdoaWNoIGNhbiBiZSBpbnRlcnByZXRlZCBhcyBhIG1lZGlhX3N0YXR1c190LgorICovCitzc2l6ZV90IEFNZWRpYU11eGVyX2FkZFRyYWNrKEFNZWRpYU11eGVyKiwgY29uc3QgQU1lZGlhRm9ybWF0KiBmb3JtYXQpOworCisvKioKKyAqIFN0YXJ0IHRoZSBtdXhlci4gU2hvdWxkIGJlIGNhbGxlZCBhZnRlciBBTWVkaWFNdXhlcl9hZGRUcmFjayBhbmQKKyAqIGJlZm9yZSBBTWVkaWFNdXhlcl93cml0ZVNhbXBsZURhdGEuCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYU11eGVyX3N0YXJ0KEFNZWRpYU11eGVyKik7CisKKy8qKgorICogU3RvcHMgdGhlIG11eGVyLgorICogT25jZSB0aGUgbXV4ZXIgc3RvcHMsIGl0IGNhbiBub3QgYmUgcmVzdGFydGVkLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFNdXhlcl9zdG9wKEFNZWRpYU11eGVyKik7CisKKy8qKgorICogV3JpdGVzIGFuIGVuY29kZWQgc2FtcGxlIGludG8gdGhlIG11eGVyLgorICogVGhlIGFwcGxpY2F0aW9uIG5lZWRzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBzYW1wbGVzIGFyZSB3cml0dGVuIGludG8KKyAqIHRoZSByaWdodCB0cmFja3MuIEFsc28sIGl0IG5lZWRzIHRvIG1ha2Ugc3VyZSB0aGUgc2FtcGxlcyBmb3IgZWFjaCB0cmFjaworICogYXJlIHdyaXR0ZW4gaW4gY2hyb25vbG9naWNhbCBvcmRlciAoZS5nLiBpbiB0aGUgb3JkZXIgdGhleSBhcmUgcHJvdmlkZWQKKyAqIGJ5IHRoZSBlbmNvZGVyLikKKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhTXV4ZXJfd3JpdGVTYW1wbGVEYXRhKEFNZWRpYU11eGVyICptdXhlciwKKyAgICAgICAgc2l6ZV90IHRyYWNrSWR4LCBjb25zdCB1aW50OF90ICpkYXRhLCBjb25zdCBBTWVkaWFDb2RlY0J1ZmZlckluZm8gKmluZm8pOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAvLyBfTkRLX01FRElBX01VWEVSX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmggYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oCmluZGV4IDdmZDkzNzkuLmZhMWIyMGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmgKKysrIGIvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvbWluaWZsb2F0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KQEAgLTQ4LDcgKzQ5LDcgQEAKICNkZWZpbmUgQ0JMS19TVFJFQU1fRU5EX0RPTkUgMHg0MDAgLy8gc2V0IGJ5IHNlcnZlciBvbiByZW5kZXIgY29tcGxldGlvbiwgY2xlYXJlZCBieSBjbGllbnQKIAogLy9FTF9GSVhNRSAyMCBzZWNvbmRzIG1heSBub3QgYmUgZW5vdWdoIGFuZCBtdXN0IGJlIHJlY29uY2lsZWQgd2l0aCBuZXcgb2J0YWluQnVmZmVyIGltcGxlbWVudGF0aW9uCi0jZGVmaW5lIE1BWF9SVU5fT0ZGTE9BREVEX1RJTUVPVVRfTVMgMjAwMDAgLy9hc3N1bWluZyB1cHRvIGEgbWF4aW11bSBvZiAyMCBzZWNvbmRzIG9mIG9mZmxvYWRlZAorI2RlZmluZSBNQVhfUlVOX09GRkxPQURFRF9USU1FT1VUX01TIDIwMDAwIC8vIGFzc3VtaW5nIHVwIHRvIGEgbWF4aW11bSBvZiAyMCBzZWNvbmRzIG9mIG9mZmxvYWRlZAogCiBzdHJ1Y3QgQXVkaW9UcmFja1NoYXJlZFN0cmVhbWluZyB7CiAgICAgLy8gc2ltaWxhciB0byBOQkFJTyBNb25vUGlwZQpAQCAtNjUsNyArNjYsOSBAQAogc3RydWN0IEF1ZGlvVHJhY2tTaGFyZWRTdGF0aWMgewogICAgIFN0YXRpY0F1ZGlvVHJhY2tTaW5nbGVTdGF0ZVF1ZXVlOjpTaGFyZWQKICAgICAgICAgICAgICAgICAgICAgbVNpbmdsZVN0YXRlUXVldWU7Ci0gICAgc2l6ZV90ICAgICAgICAgIG1CdWZmZXJQb3NpdGlvbjsgICAgLy8gdXBkYXRlZCBhc3luY2hyb25vdXNseSBieSBzZXJ2ZXIsCisgICAgLy8gVGhpcyBmaWVsZCBzaG91bGQgYmUgYSBzaXplX3QsIGJ1dCBzaW5jZSBpdCBpcyBsb2NhdGVkIGluIHNoYXJlZCBtZW1vcnkgd2UKKyAgICAvLyBmb3JjZSB0byAzMi1iaXQuICBUaGUgY2xpZW50IGFuZCBzZXJ2ZXIgbWF5IGhhdmUgZGlmZmVyZW50IHR5cGVkZWZzIGZvciBzaXplX3QuCisgICAgdWludDMyX3QgICAgICAgIG1CdWZmZXJQb3NpdGlvbjsgICAgLy8gdXBkYXRlZCBhc3luY2hyb25vdXNseSBieSBzZXJ2ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gImZvciBlbnRlcnRhaW5tZW50IHB1cnBvc2VzIG9ubHkiCiB9OwogCkBAIC05NiwxMSArOTksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSB2YWx1ZSBzaG91bGQgYmUgdXNlZCAiZm9yIGVudGVydGFpbm1lbnQgcHVycG9zZXMgb25seSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggbWVhbnMgZG9uJ3QgbWFrZSBpbXBvcnRhbnQgZGVjaXNpb25zIGJhc2VkIG9uIGl0LgogCi0gICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgZnJhbWVDb3VudF87ICAgIC8vIHVzZWQgZHVyaW5nIGNyZWF0aW9uIHRvIHBhc3MgYWN0dWFsIHRyYWNrIGJ1ZmZlciBzaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gQXVkaW9GbGluZ2VyIHRvIGNsaWVudCwgYW5kIG5vdCByZWZlcmVuY2VkIGFnYWluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIHJlbW92ZSBoZXJlIGFuZCByZXBsYWNlIGJ5IGNyZWF0ZVRyYWNrKCkgaW4vb3V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhcmFtZXRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW5hbWVkIHRvICJfIiB0byBkZXRlY3QgaW5jb3JyZWN0IHVzZQorICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgIG1QYWQxOyAgICAgIC8vIHVudXNlZAogCiAgICAgdm9sYXRpbGUgICAgaW50MzJfdCAgICAgbUZ1dGV4OyAgICAgLy8gZXZlbnQgZmxhZzogZG93biAoUCkgYnkgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwIChWKSBieSBzZXJ2ZXIgb3IgYmluZGVyRGllZCgpIG9yIGludGVycnVwdCgpCkBAIC0xMDgsMTMgKzEwNywxMiBAQAogCiBwcml2YXRlOgogCi0gICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgbU1pbmltdW07ICAgICAgIC8vIHNlcnZlciB3YWtlcyB1cCBjbGllbnQgaWYgYXZhaWxhYmxlID49IG1NaW5pbXVtCisgICAgICAgICAgICAgICAgLy8gVGhpcyBmaWVsZCBzaG91bGQgYmUgYSBzaXplX3QsIGJ1dCBzaW5jZSBpdCBpcyBsb2NhdGVkIGluIHNoYXJlZCBtZW1vcnkgd2UKKyAgICAgICAgICAgICAgICAvLyBmb3JjZSB0byAzMi1iaXQuICBUaGUgY2xpZW50IGFuZCBzZXJ2ZXIgbWF5IGhhdmUgZGlmZmVyZW50IHR5cGVkZWZzIGZvciBzaXplX3QuCisgICAgICAgICAgICAgICAgdWludDMyX3QgICAgbU1pbmltdW07ICAgICAgIC8vIHNlcnZlciB3YWtlcyB1cCBjbGllbnQgaWYgYXZhaWxhYmxlID49IG1NaW5pbXVtCiAKLSAgICAgICAgICAgICAgICAvLyBDaGFubmVsIHZvbHVtZXMgYXJlIGZpeGVkIHBvaW50IFU0LjEyLCBzbyAweDEwMDAgbWVhbnMgMS4wLgotICAgICAgICAgICAgICAgIC8vIExlZnQgY2hhbm5lbCBpcyBpbiBbMDoxNV0sIHJpZ2h0IGNoYW5uZWwgaXMgaW4gWzE2OjMxXS4KLSAgICAgICAgICAgICAgICAvLyBBbHdheXMgcmVhZCBhbmQgd3JpdGUgdGhlIGNvbWJpbmVkIHBhaXIgYXRvbWljYWxseS4KLSAgICAgICAgICAgICAgICAvLyBGb3IgQXVkaW9UcmFjayBvbmx5LCBub3QgdXNlZCBieSBBdWRpb1JlY29yZC4KLSAgICAgICAgICAgICAgICB1aW50MzJfdCAgICBtVm9sdW1lTFI7CisgICAgICAgICAgICAgICAgLy8gU3RlcmVvIGdhaW5zIGZvciBBdWRpb1RyYWNrIG9ubHksIG5vdCB1c2VkIGJ5IEF1ZGlvUmVjb3JkLgorICAgICAgICAgICAgICAgIGdhaW5fbWluaWZsb2F0X3BhY2tlZF90IG1Wb2x1bWVMUjsKIAogICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgIG1TYW1wbGVSYXRlOyAgICAvLyBBdWRpb1RyYWNrIG9ubHk6IGNsaWVudCdzIHJlcXVlc3RlZCBzYW1wbGUgcmF0ZSBpbiBIegogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciAwID09IGRlZmF1bHQuIFdyaXRlLW9ubHkgY2xpZW50LCByZWFkLW9ubHkgc2VydmVyLgpAQCAtMTc3LDEyICsxNzUsMTEgQEAKIAogLy8gUHJveHkgc2VlbiBieSBBdWRpb1RyYWNrIGNsaWVudCBhbmQgQXVkaW9SZWNvcmQgY2xpZW50CiBjbGFzcyBDbGllbnRQcm94eSA6IHB1YmxpYyBQcm94eSB7Ci1wcm90ZWN0ZWQ6CitwdWJsaWM6CiAgICAgQ2xpZW50UHJveHkoYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrLCB2b2lkICpidWZmZXJzLCBzaXplX3QgZnJhbWVDb3VudCwgc2l6ZV90IGZyYW1lU2l6ZSwKICAgICAgICAgICAgIGJvb2wgaXNPdXQsIGJvb2wgY2xpZW50SW5TZXJ2ZXIpOwogICAgIHZpcnR1YWwgfkNsaWVudFByb3h5KCkgeyB9CiAKLXB1YmxpYzoKICAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHRpbWVzcGVjIGtGb3JldmVyOwogICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdGltZXNwZWMga05vbkJsb2NraW5nOwogCkBAIC0yNDUsNyArMjQyLDExIEBACiAgICAgfQogCiAgICAgdm9pZCAgICAgICAgc2V0TWluaW11bShzaXplX3QgbWluaW11bSkgewotICAgICAgICBtQ2Jsay0+bU1pbmltdW0gPSBtaW5pbXVtOworICAgICAgICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbiBvbiBhIDY0LWJpdCBjbGllbnQKKyAgICAgICAgaWYgKG1pbmltdW0gPiBVSU5UMzJfTUFYKSB7CisgICAgICAgICAgICBtaW5pbXVtID0gVUlOVDMyX01BWDsKKyAgICAgICAgfQorICAgICAgICBtQ2Jsay0+bU1pbmltdW0gPSAodWludDMyX3QpIG1pbmltdW07CiAgICAgfQogCiAgICAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgZnJhbWVzIHRoYXQgd291bGQgbmVlZCB0byBiZSBvYnRhaW5lZCBhbmQgcmVsZWFzZWQKQEAgLTI4MSw4ICsyODIsOCBAQAogICAgICAgICBtQ2Jsay0+bVNlbmRMZXZlbCA9IHVpbnQxNl90KHNlbmRMZXZlbCAqIDB4MTAwMCk7CiAgICAgfQogCi0gICAgLy8gY2FsbGVyIG11c3QgbGltaXQgdG8gMCA8PSB2b2x1bWVMUiA8PSAweDEwMDAxMDAwCi0gICAgdm9pZCAgICAgICAgc2V0Vm9sdW1lTFIodWludDMyX3Qgdm9sdW1lTFIpIHsKKyAgICAvLyBzZXQgc3RlcmVvIGdhaW5zCisgICAgdm9pZCAgICAgICAgc2V0Vm9sdW1lTFIoZ2Fpbl9taW5pZmxvYXRfcGFja2VkX3Qgdm9sdW1lTFIpIHsKICAgICAgICAgbUNibGstPm1Wb2x1bWVMUiA9IHZvbHVtZUxSOwogICAgIH0KIApAQCAtMzkyLDggKzM5MywxMCBAQAogY2xhc3MgQXVkaW9UcmFja1NlcnZlclByb3h5IDogcHVibGljIFNlcnZlclByb3h5IHsKIHB1YmxpYzoKICAgICBBdWRpb1RyYWNrU2VydmVyUHJveHkoYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrLCB2b2lkICpidWZmZXJzLCBzaXplX3QgZnJhbWVDb3VudCwKLSAgICAgICAgICAgIHNpemVfdCBmcmFtZVNpemUsIGJvb2wgY2xpZW50SW5TZXJ2ZXIgPSBmYWxzZSkKLSAgICAgICAgOiBTZXJ2ZXJQcm94eShjYmxrLCBidWZmZXJzLCBmcmFtZUNvdW50LCBmcmFtZVNpemUsIHRydWUgLyppc091dCovLCBjbGllbnRJblNlcnZlcikgeyB9CisgICAgICAgICAgICBzaXplX3QgZnJhbWVTaXplLCBib29sIGNsaWVudEluU2VydmVyID0gZmFsc2UsIHVpbnQzMl90IHNhbXBsZVJhdGUgPSAwKQorICAgICAgICA6IFNlcnZlclByb3h5KGNibGssIGJ1ZmZlcnMsIGZyYW1lQ291bnQsIGZyYW1lU2l6ZSwgdHJ1ZSAvKmlzT3V0Ki8sIGNsaWVudEluU2VydmVyKSB7CisgICAgICAgIG1DYmxrLT5tU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgfQogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkF1ZGlvVHJhY2tTZXJ2ZXJQcm94eSgpIHsgfQogCkBAIC00MDEsNyArNDA0LDcgQEAKICAgICAvLyByZXR1cm4gdmFsdWUgb2YgdGhlc2UgbWV0aG9kcyBtdXN0IGJlIHZhbGlkYXRlZCBieSB0aGUgY2FsbGVyCiAgICAgdWludDMyX3QgICAgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1DYmxrLT5tU2FtcGxlUmF0ZTsgfQogICAgIHVpbnQxNl90ICAgIGdldFNlbmRMZXZlbF9VNF8xMigpIGNvbnN0IHsgcmV0dXJuIG1DYmxrLT5tU2VuZExldmVsOyB9Ci0gICAgdWludDMyX3QgICAgZ2V0Vm9sdW1lTFIoKSBjb25zdCB7IHJldHVybiBtQ2Jsay0+bVZvbHVtZUxSOyB9CisgICAgZ2Fpbl9taW5pZmxvYXRfcGFja2VkX3QgZ2V0Vm9sdW1lTFIoKSBjb25zdCB7IHJldHVybiBtQ2Jsay0+bVZvbHVtZUxSOyB9CiAKICAgICAvLyBlc3RpbWF0ZWQgdG90YWwgbnVtYmVyIG9mIGZpbGxlZCBmcmFtZXMgYXZhaWxhYmxlIHRvIHNlcnZlciB0byByZWFkLAogICAgIC8vIHdoaWNoIG1heSBpbmNsdWRlIG5vbi1jb250aWd1b3VzIGZyYW1lcwpAQCAtNDU2LDkgKzQ1OSw4IEBACiBjbGFzcyBBdWRpb1JlY29yZFNlcnZlclByb3h5IDogcHVibGljIFNlcnZlclByb3h5IHsKIHB1YmxpYzoKICAgICBBdWRpb1JlY29yZFNlcnZlclByb3h5KGF1ZGlvX3RyYWNrX2NibGtfdCogY2Jsaywgdm9pZCAqYnVmZmVycywgc2l6ZV90IGZyYW1lQ291bnQsCi0gICAgICAgICAgICBzaXplX3QgZnJhbWVTaXplKQotICAgICAgICA6IFNlcnZlclByb3h5KGNibGssIGJ1ZmZlcnMsIGZyYW1lQ291bnQsIGZyYW1lU2l6ZSwgZmFsc2UgLyppc091dCovLAotICAgICAgICAgICAgZmFsc2UgLypjbGllbnRJblNlcnZlciovKSB7IH0KKyAgICAgICAgICAgIHNpemVfdCBmcmFtZVNpemUsIGJvb2wgY2xpZW50SW5TZXJ2ZXIpCisgICAgICAgIDogU2VydmVyUHJveHkoY2JsaywgYnVmZmVycywgZnJhbWVDb3VudCwgZnJhbWVTaXplLCBmYWxzZSAvKmlzT3V0Ki8sIGNsaWVudEluU2VydmVyKSB7IH0KIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5BdWRpb1JlY29yZFNlcnZlclByb3h5KCkgeyB9CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcml2YXRlL21lZGlhL1N0YXRpY0F1ZGlvVHJhY2tTdGF0ZS5oIGIvaW5jbHVkZS9wcml2YXRlL21lZGlhL1N0YXRpY0F1ZGlvVHJhY2tTdGF0ZS5oCmluZGV4IDQ2YTU5NDYuLmQ0ODMwNjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9TdGF0aWNBdWRpb1RyYWNrU3RhdGUuaAorKysgYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvU3RhdGljQXVkaW9UcmFja1N0YXRlLmgKQEAgLTI1LDkgKzI1LDEzIEBACiAvLyBzdGF0ZSBpcyB3cmFwcGVkIGJ5IGEgU2luZ2xlU3RhdGVRdWV1ZS4KIHN0cnVjdCBTdGF0aWNBdWRpb1RyYWNrU3RhdGUgewogICAgIC8vIGRvIG5vdCBkZWZpbmUgY29uc3RydWN0b3JzLCBkZXN0cnVjdG9ycywgb3IgdmlydHVhbCBtZXRob2RzCi0gICAgc2l6ZV90ICBtTG9vcFN0YXJ0OwotICAgIHNpemVfdCAgbUxvb3BFbmQ7Ci0gICAgaW50ICAgICBtTG9vcENvdW50OworCisgICAgLy8gVGhlc2UgZmllbGRzIHNob3VsZCBib3RoIGJlIHNpemVfdCwgYnV0IHNpbmNlIHRoZXkgYXJlIGxvY2F0ZWQgaW4gc2hhcmVkIG1lbW9yeSB3ZQorICAgIC8vIGZvcmNlIHRvIDMyLWJpdC4gIFRoZSBjbGllbnQgYW5kIHNlcnZlciBtYXkgaGF2ZSBkaWZmZXJlbnQgdHlwZWRlZnMgZm9yIHNpemVfdC4KKyAgICB1aW50MzJfdCAgICBtTG9vcFN0YXJ0OworICAgIHVpbnQzMl90ICAgIG1Mb29wRW5kOworCisgICAgaW50ICAgICAgICAgbUxvb3BDb3VudDsKIH07CiAKIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcml2YXRlL21lZGlhL1ZpZGVvRnJhbWUuaCBiL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9WaWRlb0ZyYW1lLmgKaW5kZXggYTIxMWVkOS4uNTE5M2QwMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wcml2YXRlL21lZGlhL1ZpZGVvRnJhbWUuaAorKysgYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvVmlkZW9GcmFtZS5oCkBAIC0yNSw2NCArMjUsNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLS8vIEEgc2ltcGxlIGJ1ZmZlciB0byBob2xkIGJpbmFyeSBkYXRhCi1jbGFzcyBNZWRpYUFsYnVtQXJ0Ci17Ci1wdWJsaWM6Ci0gICAgTWVkaWFBbGJ1bUFydCgpOiBtU2l6ZSgwKSwgbURhdGEoMCkge30KLQotICAgIGV4cGxpY2l0IE1lZGlhQWxidW1BcnQoY29uc3QgY2hhciogdXJsKSB7Ci0gICAgICAgIG1TaXplID0gMDsKLSAgICAgICAgbURhdGEgPSBOVUxMOwotICAgICAgICBGSUxFICppbiA9IGZvcGVuKHVybCwgInIiKTsKLSAgICAgICAgaWYgKCFpbikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZzZWVrKGluLCAwLCBTRUVLX0VORCk7Ci0gICAgICAgIG1TaXplID0gZnRlbGwoaW4pOyAgLy8gQWxsb2NhdGluZyBidWZmZXIgb2Ygc2l6ZSBlcXVhbHMgdG8gdGhlIGV4dGVybmFsIGZpbGUgc2l6ZS4KLSAgICAgICAgaWYgKG1TaXplID09IDAgfHwgKG1EYXRhID0gbmV3IHVpbnQ4X3RbbVNpemVdKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBmY2xvc2UoaW4pOwotICAgICAgICAgICAgaWYgKG1TaXplICE9IDApIHsKLSAgICAgICAgICAgICAgICBtU2l6ZSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgcmV3aW5kKGluKTsKLSAgICAgICAgaWYgKGZyZWFkKG1EYXRhLCAxLCBtU2l6ZSwgaW4pICE9IG1TaXplKSB7ICAvLyBSZWFkIGZhaWxlZC4KLSAgICAgICAgICAgIGRlbGV0ZVtdIG1EYXRhOwotICAgICAgICAgICAgbURhdGEgPSBOVUxMOwotICAgICAgICAgICAgbVNpemUgPSAwOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZjbG9zZShpbik7Ci0gICAgfQotCi0gICAgTWVkaWFBbGJ1bUFydChjb25zdCBNZWRpYUFsYnVtQXJ0JiBjb3B5KSB7Ci0gICAgICAgIG1TaXplID0gY29weS5tU2l6ZTsKLSAgICAgICAgbURhdGEgPSBOVUxMOyAgLy8gaW5pdGlhbGl6ZSBpdCBmaXJzdAotICAgICAgICBpZiAobVNpemUgPiAwICYmIGNvcHkubURhdGEgIT0gTlVMTCkgewotICAgICAgICAgICBtRGF0YSA9IG5ldyB1aW50OF90W2NvcHkubVNpemVdOwotICAgICAgICAgICBpZiAobURhdGEgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgbWVtY3B5KG1EYXRhLCBjb3B5Lm1EYXRhLCBtU2l6ZSk7Ci0gICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICBtU2l6ZSA9IDA7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIH5NZWRpYUFsYnVtQXJ0KCkgewotICAgICAgICBpZiAobURhdGEgIT0gMCkgewotICAgICAgICAgICAgZGVsZXRlW10gbURhdGE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBJbnRlbnRpb25hbCBwdWJsaWMgYWNjZXNzIG1vZGlmaWVyOgotICAgIC8vIFdlIGhhdmUgdG8ga25vdyB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGluIG9yZGVyIHRvIHNoYXJlIGl0IGJldHdlZW4KLSAgICAvLyBwcm9jZXNzZXM/Ci0gICAgdWludDMyX3QgbVNpemU7ICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIGluIG1EYXRhCi0gICAgdWludDhfdCogbURhdGE7ICAgICAgICAgICAgLy8gQWN0dWFsIGJpbmFyeSBkYXRhCi19OwotCiAvLyBSZXByZXNlbnRzIGEgY29sb3IgY29udmVydGVkIChSR0ItYmFzZWQpIHZpZGVvIGZyYW1lCiAvLyB3aXRoIGJpdG1hcCBwaXhlbHMgc3RvcmVkIGluIEZyYW1lQnVmZmVyCiBjbGFzcyBWaWRlb0ZyYW1lCkBAIC0xMjEsOCArNjMsMTEgQEAKICAgICB1aW50MzJfdCBtRGlzcGxheVdpZHRoOwogICAgIHVpbnQzMl90IG1EaXNwbGF5SGVpZ2h0OwogICAgIHVpbnQzMl90IG1TaXplOyAgICAgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyBpbiBtRGF0YQorICAgIGludDMyX3QgIG1Sb3RhdGlvbkFuZ2xlOyAgIC8vIHJvdGF0aW9uIGFuZ2xlLCBjbG9ja3dpc2UsIHNob3VsZCBiZSBtdWx0aXBsZSBvZiA5MAorICAgIC8vIG1EYXRhIHNob3VsZCBiZSA2NCBiaXQgYWxpZ25lZCB0byBwcmV2ZW50IGFkZGl0aW9uYWwgcGFkZGluZwogICAgIHVpbnQ4X3QqIG1EYXRhOyAgICAgICAgICAgIC8vIEFjdHVhbCBiaW5hcnkgZGF0YQotICAgIGludDMyX3QgIG1Sb3RhdGlvbkFuZ2xlOyAgIC8vIHJvdGF0aW9uIGFuZ2xlLCBjbG9ja3dpc2UKKyAgICAvLyBwYWQgc3RydWN0dXJlIHNvIGl0J3MgdGhlIHNhbWUgc2l6ZSBvbiA2NCBiaXQgYW5kIDMyIGJpdAorICAgIGNoYXIgICAgIG1QYWRkaW5nWzggLSBzaXplb2YobURhdGEpXTsKIH07CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmggYi9pbmNsdWRlL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZkOGViMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuaApAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0lTT1VORFRSSUdHRVJfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0lTT1VORFRSSUdHRVJfSAorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8c3lzdGVtL3NvdW5kX3RyaWdnZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBJU291bmRUcmlnZ2VyIDogcHVibGljIElJbnRlcmZhY2UKK3sKK3B1YmxpYzoKKyAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKFNvdW5kVHJpZ2dlcik7CisKKyAgICB2aXJ0dWFsIHZvaWQgZGV0YWNoKCkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBsb2FkU291bmRNb2RlbChjb25zdCBzcDxJTWVtb3J5PiYgbW9kZWxNZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZF9tb2RlbF9oYW5kbGVfdCAqaGFuZGxlKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHVubG9hZFNvdW5kTW9kZWwoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0UmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YU1lbW9yeSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkgPSAwOworCit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIEJuU291bmRUcmlnZ2VyOiBwdWJsaWMgQm5JbnRlcmZhY2U8SVNvdW5kVHJpZ2dlcj4KK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoIHVpbnQzMl90IGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvL0FORFJPSURfSEFSRFdBUkVfSVNPVU5EVFJJR0dFUl9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyQ2xpZW50LmggYi9pbmNsdWRlL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyQ2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgwNDI5YQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJDbGllbnQuaApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0lTT1VORFRSSUdHRVJfQ0xJRU5UX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9JU09VTkRUUklHR0VSX0NMSUVOVF9ICisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgSVNvdW5kVHJpZ2dlckNsaWVudCA6IHB1YmxpYyBJSW50ZXJmYWNlCit7CitwdWJsaWM6CisKKyAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKFNvdW5kVHJpZ2dlckNsaWVudCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25SZWNvZ25pdGlvbkV2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIG9uU291bmRNb2RlbEV2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIG9uU2VydmljZVN0YXRlQ2hhbmdlKGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSkgPSAwOworCit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIEJuU291bmRUcmlnZ2VyQ2xpZW50IDogcHVibGljIEJuSW50ZXJmYWNlPElTb3VuZFRyaWdnZXJDbGllbnQ+Cit7CitwdWJsaWM6CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KCB1aW50MzJfdCBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy9BTkRST0lEX0hBUkRXQVJFX0lTT1VORFRSSUdHRVJfQ0xJRU5UX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJId1NlcnZpY2UuaCBiL2luY2x1ZGUvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJId1NlcnZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTBjYjAxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckh3U2VydmljZS5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfSVNPVU5EVFJJR0dFUl9TRVJWSUNFX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9JU09VTkRUUklHR0VSX1NFUlZJQ0VfSAorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPHN5c3RlbS9zb3VuZF90cmlnZ2VyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgSVNvdW5kVHJpZ2dlcjsKK2NsYXNzIElTb3VuZFRyaWdnZXJDbGllbnQ7CisKK2NsYXNzIElTb3VuZFRyaWdnZXJId1NlcnZpY2UgOiBwdWJsaWMgSUludGVyZmFjZQoreworcHVibGljOgorCisgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShTb3VuZFRyaWdnZXJId1NlcnZpY2UpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0TW9kdWxlcyhzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciAqbW9kdWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1Nb2R1bGVzKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGF0dGFjaChjb25zdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElTb3VuZFRyaWdnZXI+JiBtb2R1bGUpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q2FwdHVyZVN0YXRlKGJvb2wgYWN0aXZlKSA9IDA7Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIEJuU291bmRUcmlnZ2VySHdTZXJ2aWNlOiBwdWJsaWMgQm5JbnRlcmZhY2U8SVNvdW5kVHJpZ2dlckh3U2VydmljZT4KK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoIHVpbnQzMl90IGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvL0FORFJPSURfSEFSRFdBUkVfSVNPVU5EVFJJR0dFUl9TRVJWSUNFX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5oIGIvaW5jbHVkZS9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEwNWNhYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5oCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU09VTkRUUklHR0VSX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TT1VORFRSSUdHRVJfSAorCisjaW5jbHVkZSA8YmluZGVyL0lCaW5kZXIuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisjaW5jbHVkZSA8c291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckNhbGxiYWNrLmg+CisjaW5jbHVkZSA8c291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuaD4KKyNpbmNsdWRlIDxzb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckh3U2VydmljZS5oPgorI2luY2x1ZGUgPHNvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyQ2xpZW50Lmg+CisjaW5jbHVkZSA8c3lzdGVtL3NvdW5kX3RyaWdnZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNZW1vcnlEZWFsZXI7CisKK2NsYXNzIFNvdW5kVHJpZ2dlciA6IHB1YmxpYyBCblNvdW5kVHJpZ2dlckNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudAoreworcHVibGljOgorCisgICAgdmlydHVhbCB+U291bmRUcmlnZ2VyKCk7CisKKyAgICBzdGF0aWMgIHN0YXR1c190IGxpc3RNb2R1bGVzKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yICptb2R1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm51bU1vZHVsZXMpOworICAgIHN0YXRpYyAgc3A8U291bmRUcmlnZ2VyPiBhdHRhY2goY29uc3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U291bmRUcmlnZ2VyQ2FsbGJhY2s+JiBjYWxsYmFjayk7CisKKyAgICBzdGF0aWMgIHN0YXR1c190IHNldENhcHR1cmVTdGF0ZShib29sIGFjdGl2ZSk7CisKKyAgICAgICAgICAgIHZvaWQgZGV0YWNoKCk7CisKKyAgICAgICAgICAgIHN0YXR1c190IGxvYWRTb3VuZE1vZGVsKGNvbnN0IHNwPElNZW1vcnk+JiBtb2RlbE1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmRfbW9kZWxfaGFuZGxlX3QgKmhhbmRsZSk7CisKKyAgICAgICAgICAgIHN0YXR1c190IHVubG9hZFNvdW5kTW9kZWwoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKKworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhcnRSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUsIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhTWVtb3J5KTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0b3BSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOworCisgICAgICAgICAgICAvLyBCcFNvdW5kVHJpZ2dlckNsaWVudAorICAgICAgICAgICAgdmlydHVhbCB2b2lkIG9uUmVjb2duaXRpb25FdmVudChjb25zdCBzcDxJTWVtb3J5PiYgZXZlbnRNZW1vcnkpOworICAgICAgICAgICAgdmlydHVhbCB2b2lkIG9uU291bmRNb2RlbEV2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSk7CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgb25TZXJ2aWNlU3RhdGVDaGFuZ2UoY29uc3Qgc3A8SU1lbW9yeT4mIGV2ZW50TWVtb3J5KTsKKworICAgICAgICAgICAgLy9JQmluZGVyOjpEZWF0aFJlY2lwaWVudAorICAgICAgICAgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyk7CisKKyAgICAgICAgICAgIHN0YXRpYyBzdGF0dXNfdCBzdHJpbmdUb0d1aWQoY29uc3QgY2hhciAqc3RyLCBzb3VuZF90cmlnZ2VyX3V1aWRfdCAqZ3VpZCk7CisgICAgICAgICAgICBzdGF0aWMgc3RhdHVzX3QgZ3VpZFRvU3RyaW5nKGNvbnN0IHNvdW5kX3RyaWdnZXJfdXVpZF90ICpndWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpzdHIsIHNpemVfdCBtYXhMZW4pOworCitwcml2YXRlOgorICAgICAgICAgICAgU291bmRUcmlnZ2VyKHNvdW5kX3RyaWdnZXJfbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxTb3VuZFRyaWdnZXJDYWxsYmFjaz4mKTsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBzcDxJU291bmRUcmlnZ2VySHdTZXJ2aWNlPiBnZXRTb3VuZFRyaWdnZXJId1NlcnZpY2UoKTsKKworICAgICAgICAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2s7CisgICAgICAgICAgICBzcDxJU291bmRUcmlnZ2VyPiAgICAgICAgICAgICAgICAgICBtSVNvdW5kVHJpZ2dlcjsKKyAgICAgICAgICAgIGNvbnN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2hhbmRsZV90IG1Nb2R1bGU7CisgICAgICAgICAgICBzcDxTb3VuZFRyaWdnZXJDYWxsYmFjaz4gICAgICAgICAgICBtQ2FsbGJhY2s7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy9BTkRST0lEX0hBUkRXQVJFX1NPVU5EVFJJR0dFUl9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJDYWxsYmFjay5oIGIvaW5jbHVkZS9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyQ2FsbGJhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTI3N2YyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyQ2FsbGJhY2suaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NPVU5EVFJJR0dFUl9DQUxMQkFDS19ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU09VTkRUUklHR0VSX0NBTExCQUNLX0gKKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vc291bmRfdHJpZ2dlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFNvdW5kVHJpZ2dlckNhbGxiYWNrIDogcHVibGljIFJlZkJhc2UKK3sKK3B1YmxpYzoKKworICAgICAgICAgICAgU291bmRUcmlnZ2VyQ2FsbGJhY2soKSB7fQorICAgIHZpcnR1YWwgflNvdW5kVHJpZ2dlckNhbGxiYWNrKCkge30KKworICAgIHZpcnR1YWwgdm9pZCBvblJlY29nbml0aW9uRXZlbnQoc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fZXZlbnQgKmV2ZW50KSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25Tb3VuZE1vZGVsRXZlbnQoc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kZWxfZXZlbnQgKmV2ZW50KSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25TZXJ2aWNlU3RhdGVDaGFuZ2Uoc291bmRfdHJpZ2dlcl9zZXJ2aWNlX3N0YXRlX3Qgc3RhdGUpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCBvblNlcnZpY2VEaWVkKCkgPSAwOworCit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy9BTkRST0lEX0hBUkRXQVJFX1NPVU5EVFJJR0dFUl9DQUxMQkFDS19ICmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9BbmRyb2lkLm1rIGIvbGlidmlkZW9lZGl0b3IvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTA1M2U3ZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotaW5jbHVkZSAkKGNhbGwgYWxsLXN1YmRpci1tYWtlZmlsZXMpCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL0FuZHJvaWQubWsgYi9saWJ2aWRlb2VkaXRvci9sdnBwL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIyODY4MjcuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi0jCi0jIGxpYnZpZGVvZWRpdG9ycGxheWVyCi0jCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEU6PSBsaWJ2aWRlb2VkaXRvcnBsYXllcgotCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICBcCi0gICAgVmlkZW9FZGl0b3JUb29scy5jcHAgXAotICAgIFZpZGVvRWRpdG9yUGxheWVyLmNwcCBcCi0gICAgUHJldmlld1BsYXllci5jcHAgXAotICAgIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIuY3BwIFwKLSAgICBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyLmNwcCBcCi0gICAgVmlkZW9FZGl0b3JTUkMuY3BwIFwKLSAgICBEdW1teUF1ZGlvU291cmNlLmNwcCBcCi0gICAgRHVtbXlWaWRlb1NvdXJjZS5jcHAgXAotICAgIFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcuY3BwIFwKLSAgICBQcmV2aWV3UmVuZGVyZXIuY3BwIFwKLSAgICBJNDIwQ29sb3JDb252ZXJ0ZXIuY3BwIFwKLSAgICBOYXRpdmVXaW5kb3dSZW5kZXJlci5jcHAKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCi0gICAgbGlic3RhZ2VmcmlnaHRfY29sb3JfY29udmVyc2lvbgotCi0KLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSAgICAgXAotICAgIGxpYmF1ZGlvZmxpbmdlciAgICAgICAgICAgXAotICAgIGxpYmF1ZGlvdXRpbHMgICAgICAgICAgICAgXAotICAgIGxpYmJpbmRlciAgICAgICAgICAgICAgICAgXAotICAgIGxpYmN1dGlscyAgICAgICAgICAgICAgICAgXAotICAgIGxpYmxvZyAgICAgICAgICAgICAgICAgICAgXAotICAgIGxpYkVHTCAgICAgICAgICAgICAgICAgICAgXAotICAgIGxpYkdMRVN2MiAgICAgICAgICAgICAgICAgXAotICAgIGxpYmd1aSAgICAgICAgICAgICAgICAgICAgXAotICAgIGxpYm1lZGlhICAgICAgICAgICAgICAgICAgXAotICAgIGxpYmRybWZyYW1ld29yayAgICAgICAgICAgXAotICAgIGxpYnN0YWdlZnJpZ2h0ICAgICAgICAgICAgXAotICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAotICAgIGxpYnN0YWdlZnJpZ2h0X29teCAgICAgICAgXAotICAgIGxpYnN5bmMgICAgICAgICAgICAgICAgICAgXAotICAgIGxpYnVpICAgICAgICAgICAgICAgICAgICAgXAotICAgIGxpYnV0aWxzICAgICAgICAgICAgICAgICAgXAotICAgIGxpYnZpZGVvZWRpdG9yX29zYWwgICAgICAgXAotCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gXAotICAgICQoVE9QKS9zeXN0ZW0vbWVkaWEvYXVkaW9fdXRpbHMvaW5jbHVkZSBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcCBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGNvcmVjZyBncmFwaGljcykgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL2x2cHAgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvZmxpbmdlciBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvZWRpdG9yIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvc2VydmljZXMvYXVkaW9mbGluZ2VyCi0KLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJkbAotCi0jIEFsbCBvZiB0aGUgc2hhcmVkIGxpYnJhcmllcyB3ZSBsaW5rIGFnYWluc3QuCi1MT0NBTF9MRExJQlMgOj0gXAotICAgIC1scHRocmVhZCAtbGRsCi0KLUxPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciBcCi0gICAgIC1ETTRfRU5BQkxFX1JFTkRFUklOR01PREUgXAotICAgIC1EVVNFX1NUQUdFRlJJR0hUX0NPREVDUyBcCi0gICAgLURVU0VfU1RBR0VGUklHSFRfQVVESU9ERUMgXAotICAgIC1EVVNFX1NUQUdFRlJJR0hUX1ZJREVPREVDIFwKLSAgICAtRFVTRV9TVEFHRUZSSUdIVF9BVURJT0VOQyBcCi0gICAgLURVU0VfU1RBR0VGUklHSFRfVklERU9FTkMgXAotICAgIC1EVVNFX1NUQUdFRlJJR0hUX1JFQURFUlMgXAotICAgIC1EVVNFX1NUQUdFRlJJR0hUXzNHUFBfUkVBREVSCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQotI2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvRHVtbXlBdWRpb1NvdXJjZS5jcHAgYi9saWJ2aWRlb2VkaXRvci9sdnBwL0R1bW15QXVkaW9Tb3VyY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYmNhYjY4Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvRHVtbXlBdWRpb1NvdXJjZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vICNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkR1bW15QXVkaW9Tb3VyY2UiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgIkR1bW15QXVkaW9Tb3VyY2UuaCIKLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vc3RhdGljCi1zcDxEdW1teUF1ZGlvU291cmNlPiBEdW1teUF1ZGlvU291cmNlOjpDcmVhdGUoCi0gICAgICAgIGludDMyX3Qgc2FtcGxpbmdSYXRlLCBpbnQzMl90IGNoYW5uZWxDb3VudCwKLSAgICAgICAgaW50NjRfdCBmcmFtZUR1cmF0aW9uVXMsIGludDY0X3QgYXVkaW9EdXJhdGlvblVzKSB7Ci0KLSAgICBBTE9HVigiQ3JlYXRlICIpOwotICAgIHJldHVybiBuZXcgRHVtbXlBdWRpb1NvdXJjZShzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVEdXJhdGlvblVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb0R1cmF0aW9uVXMpOwotCi19Ci0KLUR1bW15QXVkaW9Tb3VyY2U6OkR1bW15QXVkaW9Tb3VyY2UoCi0gICAgICAgIGludDMyX3Qgc2FtcGxpbmdSYXRlLCBpbnQzMl90IGNoYW5uZWxDb3VudCwKLSAgICAgICAgaW50NjRfdCBmcmFtZUR1cmF0aW9uVXMsIGludDY0X3QgYXVkaW9EdXJhdGlvblVzKQotICAgIDogbVNhbXBsaW5nUmF0ZShzYW1wbGluZ1JhdGUpLAotICAgICAgbUNoYW5uZWxDb3VudChjaGFubmVsQ291bnQpLAotICAgICAgbUZyYW1lRHVyYXRpb25VcyhmcmFtZUR1cmF0aW9uVXMpLAotICAgICAgbU51bWJlck9mU2FtcGxlUGVyRnJhbWUoMCksCi0gICAgICBtQXVkaW9EdXJhdGlvblVzKGF1ZGlvRHVyYXRpb25VcyksCi0gICAgICBtVGltZVN0YW1wVXMoMCksCi0gICAgICBtQnVmZmVyR3JvdXAoTlVMTCkgewotCi0gICAgbU51bWJlck9mU2FtcGxlUGVyRnJhbWUgPSAoaW50MzJfdCkKLSAgICAgICAgICAgICgoMUwgKiBtU2FtcGxpbmdSYXRlICogbUZyYW1lRHVyYXRpb25VcykvMTAwMDAwMCk7Ci0gICAgbU51bWJlck9mU2FtcGxlUGVyRnJhbWUgPSBtTnVtYmVyT2ZTYW1wbGVQZXJGcmFtZSAgKiBtQ2hhbm5lbENvdW50OwotCi0gICAgQUxPR1YoIkNvbnN0cnVjdG9yOiBFIik7Ci0gICAgQUxPR1YoInNhbXBsaW5nUmF0ZSA9ICVkIiwgc2FtcGxpbmdSYXRlKTsKLSAgICBBTE9HVigiY2hhbm5lbENvdW50ID0gJWQiLCBjaGFubmVsQ291bnQpOwotICAgIEFMT0dWKCJmcmFtZUR1cmF0aW9uVXMgPSAlbGxkIiwgZnJhbWVEdXJhdGlvblVzKTsKLSAgICBBTE9HVigiYXVkaW9EdXJhdGlvblVzID0gJWxsZCIsIGF1ZGlvRHVyYXRpb25Vcyk7Ci0gICAgQUxPR1YoIm1OdW1iZXJPZlNhbXBsZVBlckZyYW1lID0gJWQiLCBtTnVtYmVyT2ZTYW1wbGVQZXJGcmFtZSk7Ci0gICAgQUxPR1YoIkNvbnN0cnVjdG9yOiBYIik7Ci19Ci0KLUR1bW15QXVkaW9Tb3VyY2U6On5EdW1teUF1ZGlvU291cmNlKCkgewotICAgIC8qIERvIG5vdGhpbmcgaGVyZT8gKi8KLSAgICBBTE9HVigifkR1bW15QXVkaW9Tb3VyY2UiKTsKLX0KLQotdm9pZCBEdW1teUF1ZGlvU291cmNlOjpzZXREdXJhdGlvbihpbnQ2NF90IGF1ZGlvRHVyYXRpb25VcykgewotICAgIEFMT0dWKCJzZXREdXJhdGlvbjogJWxsZCB1cyBhZGRlZCB0byAlbGxkIHVzIiwKLSAgICAgICAgYXVkaW9EdXJhdGlvblVzLCBtQXVkaW9EdXJhdGlvblVzKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgbUF1ZGlvRHVyYXRpb25VcyArPSBhdWRpb0R1cmF0aW9uVXM7Ci19Ci0KLXN0YXR1c190IER1bW15QXVkaW9Tb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKLSAgICBBTE9HVigic3RhcnQ6IEUiKTsKLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLQotICAgIG1UaW1lU3RhbXBVcyA9IDA7Ci0KLSAgICBtQnVmZmVyR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cDsKLSAgICBtQnVmZmVyR3JvdXAtPmFkZF9idWZmZXIoCi0gICAgICAgICAgICBuZXcgTWVkaWFCdWZmZXIobU51bWJlck9mU2FtcGxlUGVyRnJhbWUgKiBzaXplb2YoaW50MTZfdCkpKTsKLQotICAgIEFMT0dWKCJzdGFydDogWCIpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgRHVtbXlBdWRpb1NvdXJjZTo6c3RvcCgpIHsKLSAgICBBTE9HVigic3RvcCIpOwotCi0gICAgZGVsZXRlIG1CdWZmZXJHcm91cDsKLSAgICBtQnVmZmVyR3JvdXAgPSBOVUxMOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi0KLXNwPE1ldGFEYXRhPiBEdW1teUF1ZGlvU291cmNlOjpnZXRGb3JtYXQoKSB7Ci0gICAgQUxPR1YoImdldEZvcm1hdCIpOwotCi0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7Ci0gICAgbWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbUNoYW5uZWxDb3VudCk7Ci0gICAgbWV0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIG1TYW1wbGluZ1JhdGUpOwotICAgIG1ldGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgbUZyYW1lRHVyYXRpb25Vcyk7Ci0gICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5RGVjb2RlckNvbXBvbmVudCwgIkR1bW15QXVkaW9Tb3VyY2UiKTsKLQotICAgIHJldHVybiBtZXRhOwotfQotCi1zdGF0dXNfdCBEdW1teUF1ZGlvU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zICpvcHRpb25zKSB7Ci0KLSAgICBBTE9HVigicmVhZDogRSIpOwotCi0gICAgaW50NjRfdCBzZWVrVGltZVVzOwotICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOwotCi0gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKLSAgICAgICAgQ0hFQ0soc2Vla1RpbWVVcyA+PSAwKTsKLSAgICAgICAgbVRpbWVTdGFtcFVzID0gc2Vla1RpbWVVczsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgICAgIGlmIChtVGltZVN0YW1wVXMgPj0gbUF1ZGlvRHVyYXRpb25VcykgewotICAgICAgICAgICAgQUxPR0koInJlYWQ6IEVPUyByZWFjaGVkICVsbGQgPiAlbGxkIiwKLSAgICAgICAgICAgICAgICBtVGltZVN0YW1wVXMsIG1BdWRpb0R1cmF0aW9uVXMpOwotCi0gICAgICAgICAgICAqb3V0ID0gTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgTWVkaWFCdWZmZXIgKmJ1ZmZlcjsKLSAgICBzdGF0dXNfdCBlcnIgPSBtQnVmZmVyR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBhY3F1aXJlIGJ1ZmZlciBmcm9tIG1CdWZmZXJHcm91cDogJWQiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIG1lbXNldCgodWludDhfdCAqKSBidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCi0gICAgICAgICAgICAwLCBtTnVtYmVyT2ZTYW1wbGVQZXJGcmFtZSA8PCAxKTsKLSAgICBidWZmZXItPnNldF9yYW5nZShidWZmZXItPnJhbmdlX29mZnNldCgpLCAobU51bWJlck9mU2FtcGxlUGVyRnJhbWUgPDwgMSkpOwotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCBtVGltZVN0YW1wVXMpOwotCi0gICAgQUxPR1YoInJlYWQ6IG9mZnNldCAgPSAlZCwgc2l6ZSA9ICVkLCBtVGltZVN0YW1wVXMgPSAlbGxkIiwKLSAgICAgICAgICAgICBidWZmZXItPnJhbmdlX29mZnNldCgpLCBidWZmZXItPnNpemUoKSwgbVRpbWVTdGFtcFVzKTsKLQotICAgIG1UaW1lU3RhbXBVcyA9IG1UaW1lU3RhbXBVcyArIG1GcmFtZUR1cmF0aW9uVXM7Ci0gICAgKm91dCA9IGJ1ZmZlcjsKLQotICAgIHJldHVybiBPSzsKLX0KLQotfS8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL0R1bW15QXVkaW9Tb3VyY2UuaCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvRHVtbXlBdWRpb1NvdXJjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZjI1YThjLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvRHVtbXlBdWRpb1NvdXJjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgRFVNTVlfQVVESU9TT1VSQ0VfSF8KLSNkZWZpbmUgRFVNTVlfQVVESU9TT1VSQ0VfSF8KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBNZXRhRGF0YTsKLXN0cnVjdCBNZWRpYUJ1ZmZlckdyb3VwOwotCi1zdHJ1Y3QgRHVtbXlBdWRpb1NvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7Ci0KLXB1YmxpYzoKLSAgICBzdGF0aWMgc3A8RHVtbXlBdWRpb1NvdXJjZT4gQ3JlYXRlKAotICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxpbmdSYXRlLCBpbnQzMl90IGNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICBpbnQ2NF90IGZyYW1lRHVyYXRpb25VcywgaW50NjRfdCBhdWRpb0R1cmF0aW9uVXMpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsCi0gICAgICAgICAgICAgICAgY29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7Ci0KLSAgICB2b2lkIHNldER1cmF0aW9uKGludDY0X3QgYXVkaW9EdXJhdGlvblVzKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkR1bW15QXVkaW9Tb3VyY2UoKTsKLQotcHJpdmF0ZToKLSAgICBpbnQzMl90IG1TYW1wbGluZ1JhdGU7Ci0gICAgaW50MzJfdCBtQ2hhbm5lbENvdW50OwotICAgIGludDY0X3QgbUZyYW1lRHVyYXRpb25VczsKLSAgICBpbnQzMl90IG1OdW1iZXJPZlNhbXBsZVBlckZyYW1lOwotICAgIGludDY0X3QgbUF1ZGlvRHVyYXRpb25VczsKLSAgICBpbnQ2NF90IG1UaW1lU3RhbXBVczsKLSAgICBNdXRleCBtTG9jazsKLQotICAgIE1lZGlhQnVmZmVyR3JvdXAgKm1CdWZmZXJHcm91cDsKLQotICAgIER1bW15QXVkaW9Tb3VyY2UoCi0gICAgICAgICAgICBpbnQzMl90IHNhbXBsaW5nUmF0ZSwgaW50MzJfdCBjaGFubmVsQ291bnQsCi0gICAgICAgICAgICBpbnQ2NF90IGZyYW1lRHVyYXRpb25VcywgaW50NjRfdCBhdWRpb0R1cmF0aW9uVXMpOwotCi0gICAgLy8gRG9uJ3QgY2FsbCBtZQotICAgIER1bW15QXVkaW9Tb3VyY2UoY29uc3QgRHVtbXlBdWRpb1NvdXJjZSAmKTsKLSAgICBEdW1teUF1ZGlvU291cmNlICZvcGVyYXRvcj0oY29uc3QgRHVtbXlBdWRpb1NvdXJjZSAmKTsKLQotfTsKLQotfS8vbmFtZXNwYWNlIGFuZHJvaWQKLQotCi0jZW5kaWYgLy9EVU1NWV9BVURJT1NPVVJDRV9IXwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL0R1bW15VmlkZW9Tb3VyY2UuY3BwIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9EdW1teVZpZGVvU291cmNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjA2ZjkzNy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL0R1bW15VmlkZW9Tb3VyY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkR1bW15VmlkZW9Tb3VyY2UiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSAiVmlkZW9FZGl0b3JUb29scy5oIgotI2luY2x1ZGUgIkR1bW15VmlkZW9Tb3VyY2UuaCIKLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXNwPER1bW15VmlkZW9Tb3VyY2U+IER1bW15VmlkZW9Tb3VyY2U6OkNyZWF0ZSgKLSAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKLSAgICAgICAgdWludDY0X3QgY2xpcER1cmF0aW9uLCBjb25zdCBjaGFyICppbWFnZVVyaSkgewotCi0gICAgQUxPR1YoIkNyZWF0ZSIpOwotICAgIHJldHVybiBuZXcgRHVtbXlWaWRlb1NvdXJjZSgKLSAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgY2xpcER1cmF0aW9uLCBpbWFnZVVyaSk7Ci0KLX0KLQotCi1EdW1teVZpZGVvU291cmNlOjpEdW1teVZpZGVvU291cmNlKAotICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAotICAgICAgICB1aW50NjRfdCBjbGlwRHVyYXRpb24sIGNvbnN0IGNoYXIgKmltYWdlVXJpKSB7Ci0KLSAgICBBTE9HVigiQ29uc3RydWN0b3I6IEUiKTsKLQotICAgIG1GcmFtZVdpZHRoID0gd2lkdGg7Ci0gICAgbUZyYW1lSGVpZ2h0ID0gaGVpZ2h0OwotICAgIG1JbWFnZUNsaXBEdXJhdGlvbiA9IGNsaXBEdXJhdGlvbjsKLSAgICBtVXJpID0gaW1hZ2VVcmk7Ci0gICAgbUltYWdlQnVmZmVyID0gTlVMTDsKLQotICAgIEFMT0dWKCIlcyIsIG1VcmkpOwotICAgIEFMT0dWKCJDb25zdHJ1Y3RvcjogWCIpOwotfQotCi0KLUR1bW15VmlkZW9Tb3VyY2U6On5EdW1teVZpZGVvU291cmNlKCkgewotICAgIC8qIERvIG5vdGhpbmcgaGVyZT8gKi8KLSAgICBBTE9HVigifkR1bW15VmlkZW9Tb3VyY2UiKTsKLX0KLQotCi0KLXN0YXR1c190IER1bW15VmlkZW9Tb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKLSAgICBBTE9HVigic3RhcnQ6IEUiKTsKLQotICAgIC8vIEdldCB0aGUgZnJhbWUgYnVmZmVyIGZyb20gdGhlIHJnYiBmaWxlLCBtVXJpLAotICAgIC8vIGFuZCBzdG9yZSBpdHMgY29udGVudCBpbnRvIGEgTWVkaWFCdWZmZXIKLSAgICBzdGF0dXNfdCBlcnIgPSBMdkdldEltYWdlVGh1bWJOYWlsKAotICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKW1VcmksCi0gICAgICAgICAgICAgICAgICAgIG1GcmFtZUhlaWdodCwgbUZyYW1lV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICoqKSAmbUltYWdlQnVmZmVyKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCJMdkdldEltYWdlVGh1bWJOYWlsIGZhaWxlZDogJWQiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIG1Jc0ZpcnN0SW1hZ2VGcmFtZSA9IHRydWU7Ci0gICAgbUltYWdlU2Vla1RpbWUgPSAwOwotICAgIG1JbWFnZVBsYXlTdGFydFRpbWUgPSAwOwotICAgIG1GcmFtZVRpbWVVcyA9IDA7Ci0KLSAgICBBTE9HVigic3RhcnQ6IFgiKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLQotc3RhdHVzX3QgRHVtbXlWaWRlb1NvdXJjZTo6c3RvcCgpIHsKLSAgICBBTE9HVigic3RvcCIpOwotICAgIHN0YXR1c190IGVyciA9IE9LOwotCi0gICAgaWYgKG1JbWFnZUJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIGZyZWUobUltYWdlQnVmZmVyKTsKLSAgICAgICAgbUltYWdlQnVmZmVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0KLXNwPE1ldGFEYXRhPiBEdW1teVZpZGVvU291cmNlOjpnZXRGb3JtYXQoKSB7Ci0gICAgQUxPR1YoImdldEZvcm1hdCIpOwotCi0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgbWV0YS0+c2V0SW50MzIoa0tleUNvbG9yRm9ybWF0LCBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKTsKLSAgICBtZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIG1GcmFtZVdpZHRoKTsKLSAgICBtZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBtRnJhbWVIZWlnaHQpOwotICAgIG1ldGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgbUltYWdlQ2xpcER1cmF0aW9uKTsKLSAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlEZWNvZGVyQ29tcG9uZW50LCAiRHVtbXlWaWRlb1NvdXJjZSIpOwotCi0gICAgcmV0dXJuIG1ldGE7Ci19Ci0KLXN0YXR1c190IER1bW15VmlkZW9Tb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyICoqb3V0LAotICAgICAgICBjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLQotICAgIEFMT0dWKCJyZWFkOiBFIik7Ci0KLSAgICBjb25zdCBpbnQzMl90IGtUaW1lU2NhbGUgPSAxMDAwOyAgLyogdGltZSBzY2FsZSBpbiBtcyAqLwotICAgIGJvb2wgc2Vla2luZyA9IGZhbHNlOwotICAgIGludDY0X3Qgc2Vla1RpbWVVczsKLSAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgc2Vla01vZGU7Ci0gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmc2Vla01vZGUpKSB7Ci0gICAgICAgIHNlZWtpbmcgPSB0cnVlOwotICAgICAgICBtSW1hZ2VTZWVrVGltZSA9IHNlZWtUaW1lVXM7Ci0gICAgICAgIE00T1NBX2Nsb2NrR2V0VGltZSgmbUltYWdlUGxheVN0YXJ0VGltZSwga1RpbWVTY2FsZSk7Ci0gICAgfQotCi0gICAgaWYgKChtSW1hZ2VTZWVrVGltZSA9PSBtSW1hZ2VDbGlwRHVyYXRpb24pIHx8Ci0gICAgICAgIChtRnJhbWVUaW1lVXMgPT0gKGludDY0X3QpbUltYWdlQ2xpcER1cmF0aW9uKSkgewotICAgICAgICBBTE9HVigicmVhZDogRU9TIHJlYWNoZWQiKTsKLSAgICAgICAgKm91dCA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgIH0KLQotICAgIHN0YXR1c190IGVyciA9IE9LOwotICAgIE1lZGlhQnVmZmVyICpidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoCi0gICAgICAgICAgICBtSW1hZ2VCdWZmZXIsIChtRnJhbWVXaWR0aCAqIG1GcmFtZUhlaWdodCAqIDEuNSkpOwotCi0gICAgLy8gU2V0IHRpbWVzdGFtcCBvZiBidWZmZXIKLSAgICBpZiAobUlzRmlyc3RJbWFnZUZyYW1lKSB7Ci0gICAgICAgIE00T1NBX2Nsb2NrR2V0VGltZSgmbUltYWdlUGxheVN0YXJ0VGltZSwga1RpbWVTY2FsZSk7Ci0gICAgICAgIG1GcmFtZVRpbWVVcyA9ICAobUltYWdlU2Vla1RpbWUgKyAxKTsKLSAgICAgICAgQUxPR1YoInJlYWQ6IGpwZyAxc3QgZnJhbWUgdGltZVVzID0gJWxsZCwgYmVnaW4gY3V0IHRpbWUgPSAlbGQiLAotICAgICAgICAgICAgbUZyYW1lVGltZVVzLCBtSW1hZ2VTZWVrVGltZSk7Ci0KLSAgICAgICAgbUlzRmlyc3RJbWFnZUZyYW1lID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgTTRPU0FfVGltZSAgY3VycmVudFRpbWVNczsKLSAgICAgICAgTTRPU0FfY2xvY2tHZXRUaW1lKCZjdXJyZW50VGltZU1zLCBrVGltZVNjYWxlKTsKLQotICAgICAgICBtRnJhbWVUaW1lVXMgPSBtSW1hZ2VTZWVrVGltZSArCi0gICAgICAgICAgICAoY3VycmVudFRpbWVNcyAtIG1JbWFnZVBsYXlTdGFydFRpbWUpICogMTAwMExMOwotCi0gICAgICAgIEFMT0dWKCJyZWFkOiBqcGcgZnJhbWUgdGltZVVzID0gJWxsZCIsIG1GcmFtZVRpbWVVcyk7Ci0gICAgfQotCi0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+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+ICZzdXJmYWNlLAotICAgICAgICAgICAgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KTsKLQotICAgIGludCBpbml0KCk7Ci0KLSAgICBzcDxTdXJmYWNlPiBtU3VyZmFjZTsKLSAgICBzaXplX3QgbVdpZHRoLCBtSGVpZ2h0OwotCi0gICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciAqbUJ1ZjsKLQotICAgIFByZXZpZXdSZW5kZXJlcihjb25zdCBQcmV2aWV3UmVuZGVyZXIgJik7Ci0gICAgUHJldmlld1JlbmRlcmVyICZvcGVyYXRvcj0oY29uc3QgUHJldmlld1JlbmRlcmVyICYpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBQUkVWSUVXX1JFTkRFUkVSX0hfCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIuY3BwIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvckF1ZGlvUGxheWVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTc2ZjhlOS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODk3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19OREVCVUcgMQotI2RlZmluZSBMT0dfVEFHICJWaWRlb0VkaXRvckF1ZGlvUGxheWVyIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgotI2luY2x1ZGUgPFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotCi0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0KLSNpbmNsdWRlICJQcmV2aWV3UGxheWVyLmgiCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLVZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OlZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIoCi0gICAgICAgIGNvbnN0IHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiAmYXVkaW9TaW5rLAotICAgICAgICBQcmV2aWV3UGxheWVyICpvYnNlcnZlcikKLSAgICA6IG1JbnB1dEJ1ZmZlcihOVUxMKSwKLSAgICAgIG1TYW1wbGVSYXRlKDApLAotICAgICAgbUxhdGVuY3lVcygwKSwKLSAgICAgIG1GcmFtZVNpemUoMCksCi0gICAgICBtTnVtRnJhbWVzUGxheWVkKDApLAotICAgICAgbVBvc2l0aW9uVGltZU1lZGlhVXMoLTEpLAotICAgICAgbVBvc2l0aW9uVGltZVJlYWxVcygtMSksCi0gICAgICBtU2Vla2luZyhmYWxzZSksCi0gICAgICBtUmVhY2hlZEVPUyhmYWxzZSksCi0gICAgICBtRmluYWxTdGF0dXMoT0spLAotICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAotICAgICAgbUlzRmlyc3RCdWZmZXIoZmFsc2UpLAotICAgICAgbUZpcnN0QnVmZmVyUmVzdWx0KE9LKSwKLSAgICAgIG1GaXJzdEJ1ZmZlcihOVUxMKSwKLSAgICAgIG1BdWRpb1NpbmsoYXVkaW9TaW5rKSwKLSAgICAgIG1PYnNlcnZlcihvYnNlcnZlcikgewotCi0gICAgQUxPR1YoIkNvbnN0cnVjdG9yIik7Ci0gICAgbUJHQXVkaW9QQ01GaWxlSGFuZGxlID0gTlVMTDsKLSAgICBtQXVkaW9Qcm9jZXNzID0gTlVMTDsKLSAgICBtQkdBdWRpb1BDTUZpbGVMZW5ndGggPSAwOwotICAgIG1CR0F1ZGlvUENNRmlsZVRyaW1tZWRMZW5ndGggPSAwOwotICAgIG1CR0F1ZGlvUENNRmlsZUR1cmF0aW9uID0gMDsKLSAgICBtQkdBdWRpb1BDTUZpbGVTZWVrUG9pbnQgPSAwOwotICAgIG1CR0F1ZGlvUENNRmlsZU9yaWdpbmFsU2Vla1BvaW50ID0gMDsKLSAgICBtQkdBdWRpb1N0b3J5Qm9hcmRTa2ltVGltZVN0YW1wID0gMDsKLSAgICBtQkdBdWRpb1N0b3J5Qm9hcmRDdXJyZW50TWVkaWFCZWdpbkN1dFRTID0gMDsKLSAgICBtQkdBdWRpb1N0b3J5Qm9hcmRDdXJyZW50TWVkaWFWb2x1bWVWYWwgPSAwOwotICAgIG1TZWVrVGltZVVzID0gMDsKLSAgICBtU291cmNlID0gTlVMTDsKLX0KLQotVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6flZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIoKSB7Ci0KLSAgICBBTE9HVigiRGVzdHJ1Y3RvciIpOwotICAgIGlmIChtU3RhcnRlZCkgewotICAgICAgICByZXNldCgpOwotICAgIH0KLSAgICBpZiAobUF1ZGlvUHJvY2VzcyAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBtQXVkaW9Qcm9jZXNzOwotICAgICAgICBtQXVkaW9Qcm9jZXNzID0gTlVMTDsKLSAgICB9Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6cGF1c2UoYm9vbCBwbGF5UGVuZGluZ1NhbXBsZXMpIHsKLSAgICBBTE9HVigicGF1c2U6IHBsYXlQZW5kaW5nU2FtcGxlcz0lZCIsIHBsYXlQZW5kaW5nU2FtcGxlcyk7Ci0gICAgQ0hFQ0sobVN0YXJ0ZWQpOwotCi0gICAgaWYgKHBsYXlQZW5kaW5nU2FtcGxlcykgewotICAgICAgICBpZiAobUF1ZGlvU2luay5nZXQoKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtQXVkaW9TaW5rLT5zdG9wKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQXVkaW9UcmFjay0+c3RvcCgpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG1BdWRpb1NpbmsuZ2V0KCkgIT0gTlVMTCkgewotICAgICAgICAgICAgbUF1ZGlvU2luay0+cGF1c2UoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1BdWRpb1RyYWNrLT5wYXVzZSgpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OmNsZWFyKCkgewotICAgIEFMT0dWKCJjbGVhciIpOwotICAgIGlmICghbVN0YXJ0ZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChtQXVkaW9TaW5rLmdldCgpICE9IE5VTEwpIHsKLSAgICAgICAgbUF1ZGlvU2luay0+c3RvcCgpOwotICAgICAgICBtQXVkaW9TaW5rLT5jbG9zZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1BdWRpb1RyYWNrLT5zdG9wKCk7Ci0KLSAgICAgICAgbUF1ZGlvVHJhY2suY2xlYXIoKTsKLSAgICB9Ci0KLSAgICAvLyBNYWtlIHN1cmUgdG8gcmVsZWFzZSBhbnkgYnVmZmVyIHdlIGhvbGQgb250byBzbyB0aGF0IHRoZQotICAgIC8vIHNvdXJjZSBpcyBhYmxlIHRvIHN0b3AoKS4KLQotICAgIGlmIChtRmlyc3RCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICBtRmlyc3RCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbUZpcnN0QnVmZmVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAobUlucHV0QnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoIkF1ZGlvUGxheWVyQmFzZSByZWxlYXNpbmcgaW5wdXQgYnVmZmVyLiIpOwotCi0gICAgICAgIG1JbnB1dEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICBtSW5wdXRCdWZmZXIgPSBOVUxMOwotICAgIH0KLQotICAgIG1Tb3VyY2UtPnN0b3AoKTsKLQotICAgIC8vIFRoZSBmb2xsb3dpbmcgaGFjayBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoYXQgdGhlIE9NWAotICAgIC8vIGNvbXBvbmVudCBpcyBjb21wbGV0ZWx5IHJlbGVhc2VkIGJ5IHRoZSB0aW1lIHdlIG1heSB0cnkKLSAgICAvLyB0byBpbnN0YW50aWF0ZSBpdCBhZ2Fpbi4KLSAgICB3cDxNZWRpYVNvdXJjZT4gdG1wID0gbVNvdXJjZTsKLSAgICBtU291cmNlLmNsZWFyKCk7Ci0gICAgd2hpbGUgKHRtcC5wcm9tb3RlKCkgIT0gTlVMTCkgewotICAgICAgICB1c2xlZXAoMTAwMCk7Ci0gICAgfQotICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKLQotICAgIG1OdW1GcmFtZXNQbGF5ZWQgPSAwOwotICAgIG1Qb3NpdGlvblRpbWVNZWRpYVVzID0gLTE7Ci0gICAgbVBvc2l0aW9uVGltZVJlYWxVcyA9IC0xOwotICAgIG1TZWVraW5nID0gZmFsc2U7Ci0gICAgbVJlYWNoZWRFT1MgPSBmYWxzZTsKLSAgICBtRmluYWxTdGF0dXMgPSBPSzsKLSAgICBtU3RhcnRlZCA9IGZhbHNlOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpyZXN1bWUoKSB7Ci0gICAgQUxPR1YoInJlc3VtZSIpOwotCi0gICAgQXVkaW9NaXhTZXR0aW5ncyBhdWRpb01peFNldHRpbmdzOwotCi0gICAgLy8gU2luZ2xlIGF1ZGlvIHBsYXllciBpcyB1c2VkOwotICAgIC8vIFBhc3Mgb24gdGhlIGF1ZGlvIGR1Y2tpbmcgcGFyYW1ldGVycwotICAgIC8vIHdoaWNoIG1pZ2h0IGhhdmUgY2hhbmdlZCB3aXRoIG5ldyBhdWRpbyBzb3VyY2UKLSAgICBhdWRpb01peFNldHRpbmdzLmx2SW5EdWNraW5nX3RocmVzaG9sZCA9Ci0gICAgICAgIG1BdWRpb01peFNldHRpbmdzLT51aUluRHVja2luZ190aHJlc2hvbGQ7Ci0gICAgYXVkaW9NaXhTZXR0aW5ncy5sdkluRHVja2luZ19sb3dWb2x1bWUgPQotICAgICAgICAoKE00T1NBX0Zsb2F0KW1BdWRpb01peFNldHRpbmdzLT51aUluRHVja2luZ19sb3dWb2x1bWUpIC8gMTAwLjA7Ci0gICAgYXVkaW9NaXhTZXR0aW5ncy5sdkluRHVja2luZ19lbmFibGUgPQotICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+YkluRHVja2luZ19lbmFibGU7Ci0gICAgYXVkaW9NaXhTZXR0aW5ncy5sdlBUVm9sTGV2ZWwgPQotICAgICAgICAoKE00T1NBX0Zsb2F0KW1CR0F1ZGlvU3RvcnlCb2FyZEN1cnJlbnRNZWRpYVZvbHVtZVZhbCkgLyAxMDAuMDsKLSAgICBhdWRpb01peFNldHRpbmdzLmx2QlRWb2xMZXZlbCA9Ci0gICAgICAgICgoTTRPU0FfRmxvYXQpbUF1ZGlvTWl4U2V0dGluZ3MtPnVpQWRkVm9sdW1lKSAvIDEwMC4wOwotICAgIGF1ZGlvTWl4U2V0dGluZ3MubHZCVENoYW5uZWxDb3VudCA9IG1BdWRpb01peFNldHRpbmdzLT51aUJUQ2hhbm5lbENvdW50OwotICAgIGF1ZGlvTWl4U2V0dGluZ3MubHZQVENoYW5uZWxDb3VudCA9IG1BdWRpb01peFNldHRpbmdzLT51aU5iQ2hhbm5lbHM7Ci0KLSAgICAvLyBDYWxsIHRvIEF1ZGlvIG1peCBwYXJhbSBzZXR0aW5nCi0gICAgbUF1ZGlvUHJvY2Vzcy0+c2V0TWl4UGFyYW1zKGF1ZGlvTWl4U2V0dGluZ3MpOwotCi0gICAgQ0hFQ0sobVN0YXJ0ZWQpOwotCi0gICAgaWYgKG1BdWRpb1NpbmsuZ2V0KCkgIT0gTlVMTCkgewotICAgICAgICBtQXVkaW9TaW5rLT5zdGFydCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1BdWRpb1RyYWNrLT5zdGFydCgpOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OnNlZWtUbyhpbnQ2NF90IHRpbWVfdXMpIHsKLSAgICBBTE9HVigic2Vla1RvOiAlbGxkIiwgdGltZV91cyk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIG1TZWVraW5nID0gdHJ1ZTsKLSAgICBtUG9zaXRpb25UaW1lUmVhbFVzID0gbVBvc2l0aW9uVGltZU1lZGlhVXMgPSAtMTsKLSAgICBtUmVhY2hlZEVPUyA9IGZhbHNlOwotICAgIG1TZWVrVGltZVVzID0gdGltZV91czsKLQotICAgIGlmIChtQXVkaW9TaW5rICE9IE5VTEwpIHsKLSAgICAgICAgbUF1ZGlvU2luay0+Zmx1c2goKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtQXVkaW9UcmFjay0+Zmx1c2goKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLWJvb2wgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6aXNTZWVraW5nKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBBTE9HVigiaXNTZWVraW5nOiBtU2Vla2luZz0lZCIsIG1TZWVraW5nKTsKLSAgICByZXR1cm4gbVNlZWtpbmc7Ci19Ci0KLWJvb2wgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6cmVhY2hlZEVPUyhzdGF0dXNfdCAqZmluYWxTdGF0dXMpIHsKLSAgICBBTE9HVigicmVhY2hlZEVPUzogc3RhdHVzPSVkIiwgbUZpbmFsU3RhdHVzKTsKLSAgICAqZmluYWxTdGF0dXMgPSBPSzsKLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgKmZpbmFsU3RhdHVzID0gbUZpbmFsU3RhdHVzOwotICAgIHJldHVybiBtUmVhY2hlZEVPUzsKLX0KLQotaW50NjRfdCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpnZXRSZWFsVGltZVVzKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgcmV0dXJuIGdldFJlYWxUaW1lVXNfbCgpOwotfQotCi1pbnQ2NF90IFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OmdldFJlYWxUaW1lVXNfbCgpIHsKLSAgICByZXR1cm4gLW1MYXRlbmN5VXMgKyAobU51bUZyYW1lc1BsYXllZCAqIDEwMDAwMDApIC8gbVNhbXBsZVJhdGU7Ci19Ci0KLWludDY0X3QgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6Z2V0TWVkaWFUaW1lVXMoKSB7Ci0gICAgQUxPR1YoImdldE1lZGlhVGltZVVzIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtUG9zaXRpb25UaW1lTWVkaWFVcyA8IDAgfHwgbVBvc2l0aW9uVGltZVJlYWxVcyA8IDApIHsKLSAgICAgICAgaWYgKG1TZWVraW5nKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVNlZWtUaW1lVXM7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IHJlYWxUaW1lT2Zmc2V0ID0gZ2V0UmVhbFRpbWVVc19sKCkgLSBtUG9zaXRpb25UaW1lUmVhbFVzOwotICAgIGlmIChyZWFsVGltZU9mZnNldCA8IDApIHsKLSAgICAgICAgcmVhbFRpbWVPZmZzZXQgPSAwOwotICAgIH0KLQotICAgIHJldHVybiBtUG9zaXRpb25UaW1lTWVkaWFVcyArIHJlYWxUaW1lT2Zmc2V0OwotfQotCi1ib29sIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OmdldE1lZGlhVGltZU1hcHBpbmcoCi0gICAgICAgIGludDY0X3QgKnJlYWx0aW1lX3VzLCBpbnQ2NF90ICptZWRpYXRpbWVfdXMpIHsKLSAgICBBTE9HVigiZ2V0TWVkaWFUaW1lTWFwcGluZyIpOwotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICAqcmVhbHRpbWVfdXMgPSBtUG9zaXRpb25UaW1lUmVhbFVzOwotICAgICptZWRpYXRpbWVfdXMgPSBtUG9zaXRpb25UaW1lTWVkaWFVczsKLQotICAgIHJldHVybiBtUG9zaXRpb25UaW1lUmVhbFVzICE9IC0xICYmIG1Qb3NpdGlvblRpbWVNZWRpYVVzICE9IC0xOwotfQotCi12b2lkIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OnNldFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICAvLyBCZWZvcmUgc2V0dGluZyBzb3VyY2UsIHN0b3AgYW55IGV4aXN0aW5nIHNvdXJjZS4KLSAgICAvLyBNYWtlIHN1cmUgdG8gcmVsZWFzZSBhbnkgYnVmZmVyIHdlIGhvbGQgb250byBzbyB0aGF0IHRoZQotICAgIC8vIHNvdXJjZSBpcyBhYmxlIHRvIHN0b3AoKS4KLQotICAgIGlmIChtRmlyc3RCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICBtRmlyc3RCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbUZpcnN0QnVmZmVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAobUlucHV0QnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIgcmVsZWFzaW5nIGlucHV0IGJ1ZmZlci4iKTsKLQotICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKLSAgICAgICAgbVNvdXJjZS5jbGVhcigpOwotICAgIH0KLQotICAgIG1Tb3VyY2UgPSBzb3VyY2U7Ci0gICAgbVJlYWNoZWRFT1MgPSBmYWxzZTsKLX0KLQotc3A8TWVkaWFTb3VyY2U+IFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OmdldFNvdXJjZSgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIHJldHVybiBtU291cmNlOwotfQotCi12b2lkIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OnNldE9ic2VydmVyKFByZXZpZXdQbGF5ZXIgKm9ic2VydmVyKSB7Ci0gICAgQUxPR1YoInNldE9ic2VydmVyIik7Ci0gICAgLy9DSEVDSyghbVN0YXJ0ZWQpOwotICAgIG1PYnNlcnZlciA9IG9ic2VydmVyOwotfQotCi1ib29sIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OmlzU3RhcnRlZCgpIHsKLSAgICByZXR1cm4gbVN0YXJ0ZWQ7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpBdWRpb0NhbGxiYWNrKGludCBldmVudCwgdm9pZCAqdXNlciwgdm9pZCAqaW5mbykgewotICAgIHN0YXRpY19jYXN0PFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIgKj4odXNlciktPkF1ZGlvQ2FsbGJhY2soZXZlbnQsIGluZm8pOwotfQotCi0KLXZvaWQgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6QXVkaW9DYWxsYmFjayhpbnQgZXZlbnQsIHZvaWQgKmluZm8pIHsKLSAgICBpZiAoZXZlbnQgIT0gQXVkaW9UcmFjazo6RVZFTlRfTU9SRV9EQVRBKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBBdWRpb1RyYWNrOjpCdWZmZXIgKmJ1ZmZlciA9IChBdWRpb1RyYWNrOjpCdWZmZXIgKilpbmZvOwotICAgIHNpemVfdCBudW1CeXRlc1dyaXR0ZW4gPSBmaWxsQnVmZmVyKGJ1ZmZlci0+cmF3LCBidWZmZXItPnNpemUpOwotCi0gICAgYnVmZmVyLT5zaXplID0gbnVtQnl0ZXNXcml0dGVuOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpzdGFydChib29sIHNvdXJjZUFscmVhZHlTdGFydGVkKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBDSEVDSyghbVN0YXJ0ZWQpOwotICAgIENIRUNLKG1Tb3VyY2UgIT0gTlVMTCk7Ci0gICAgQUxPR1YoIlN0YXJ0Iik7Ci0gICAgc3RhdHVzX3QgZXJyOwotICAgIE00T1NBX0VSUiByZXN1bHQgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQzMiBzdGFydFRpbWUgPSAwOwotICAgIE00T1NBX1VJbnQzMiBzZWVrVGltZVN0YW1wID0gMDsKLSAgICBNNE9TQV9Cb29sIGJTdG9yeUJvYXJkVFNCZXlvbmRCVEVuZEN1dFRpbWUgPSBNNE9TQV9GQUxTRTsKLQotICAgIGlmICghc291cmNlQWxyZWFkeVN0YXJ0ZWQpIHsKLSAgICAgICAgZXJyID0gbVNvdXJjZS0+c3RhcnQoKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIENyZWF0ZSB0aGUgQkcgQXVkaW8gaGFuZGxlcgotICAgIG1BdWRpb1Byb2Nlc3MgPSBuZXcgVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZygpOwotICAgIEF1ZGlvTWl4U2V0dGluZ3MgYXVkaW9NaXhTZXR0aW5nczsKLQotICAgIC8vIFBhc3Mgb24gdGhlIGF1ZGlvIGR1Y2tpbmcgcGFyYW1ldGVycwotICAgIGF1ZGlvTWl4U2V0dGluZ3MubHZJbkR1Y2tpbmdfdGhyZXNob2xkID0KLSAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPnVpSW5EdWNraW5nX3RocmVzaG9sZDsKLSAgICBhdWRpb01peFNldHRpbmdzLmx2SW5EdWNraW5nX2xvd1ZvbHVtZSA9Ci0gICAgICAgICgoTTRPU0FfRmxvYXQpbUF1ZGlvTWl4U2V0dGluZ3MtPnVpSW5EdWNraW5nX2xvd1ZvbHVtZSkgLyAxMDAuMDsKLSAgICBhdWRpb01peFNldHRpbmdzLmx2SW5EdWNraW5nX2VuYWJsZSA9Ci0gICAgICAgIG1BdWRpb01peFNldHRpbmdzLT5iSW5EdWNraW5nX2VuYWJsZTsKLSAgICBhdWRpb01peFNldHRpbmdzLmx2UFRWb2xMZXZlbCA9Ci0gICAgICAgICgoTTRPU0FfRmxvYXQpbUJHQXVkaW9TdG9yeUJvYXJkQ3VycmVudE1lZGlhVm9sdW1lVmFsKSAvIDEwMC4wOwotICAgIGF1ZGlvTWl4U2V0dGluZ3MubHZCVFZvbExldmVsID0KLSAgICAgICAgKChNNE9TQV9GbG9hdCltQXVkaW9NaXhTZXR0aW5ncy0+dWlBZGRWb2x1bWUpIC8gMTAwLjA7Ci0gICAgYXVkaW9NaXhTZXR0aW5ncy5sdkJUQ2hhbm5lbENvdW50ID0gbUF1ZGlvTWl4U2V0dGluZ3MtPnVpQlRDaGFubmVsQ291bnQ7Ci0gICAgYXVkaW9NaXhTZXR0aW5ncy5sdlBUQ2hhbm5lbENvdW50ID0gbUF1ZGlvTWl4U2V0dGluZ3MtPnVpTmJDaGFubmVsczsKLQotICAgIC8vIENhbGwgdG8gQXVkaW8gbWl4IHBhcmFtIHNldHRpbmcKLSAgICBtQXVkaW9Qcm9jZXNzLT5zZXRNaXhQYXJhbXMoYXVkaW9NaXhTZXR0aW5ncyk7Ci0KLSAgICAvLyBHZXQgdGhlIEJHIEF1ZGlvIFBDTSBmaWxlIGRldGFpbHMKLSAgICBpZiAoIG1CR0F1ZGlvUENNRmlsZUhhbmRsZSApIHsKLQotICAgICAgICAvLyBUT0RPIDogMzJiaXRzIHJlcXVpcmVkIGZvciBPU0FMLCB0byBiZSB1cGRhdGVkIG9uY2UgT1NBTCBpcyB1cGRhdGVkCi0gICAgICAgIE00T1NBX1VJbnQzMiB0bXAzMiA9IDA7Ci0gICAgICAgIHJlc3VsdCA9IE00T1NBX2ZpbGVSZWFkR2V0T3B0aW9uKG1CR0F1ZGlvUENNRmlsZUhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCoqKSZ0bXAzMik7Ci0gICAgICAgIG1CR0F1ZGlvUENNRmlsZUxlbmd0aCA9IHRtcDMyOwotICAgICAgICBtQkdBdWRpb1BDTUZpbGVUcmltbWVkTGVuZ3RoID0gbUJHQXVkaW9QQ01GaWxlTGVuZ3RoOwotCi0KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OnN0YXJ0IE00T1NBX2tGaWxlUmVhZEdldEZpbGVTaXplID0gJWxsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlTGVuZ3RoKTsKLQotICAgICAgICAvLyBHZXQgdGhlIGR1cmF0aW9uIGluIHRpbWUgb2YgdGhlIGF1ZGlvIEJUCi0gICAgICAgIGlmICggcmVzdWx0ID09IE00Tk9fRVJST1IgKSB7Ci0gICAgICAgICBBTE9HVigiVkVBUDogY2hhbm5lbHMgPSAlZCBmcmVxID0gJWQiLAotICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPnVpTmJDaGFubmVscywgIG1BdWRpb01peFNldHRpbmdzLT51aVNhbXBsaW5nRnJlcXVlbmN5KTsKLQotICAgICAgICAgICAgLy8gTm8gdHJpbQotICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlRHVyYXRpb24gPSAoKAotICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCkobUJHQXVkaW9QQ01GaWxlTGVuZ3RoL3NpemVvZihNNE9TQV9VSW50MTYpLwotICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlOYkNoYW5uZWxzKSkqMTAwMCApIC8KLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPnVpU2FtcGxpbmdGcmVxdWVuY3k7Ci0KLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjogYmVnaW5DdXRNcyAlZCAsIGVuZEN1dE1zICVkIiwKLSAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCkgbUF1ZGlvTWl4U2V0dGluZ3MtPmJlZ2luQ3V0TXMsCi0gICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpIG1BdWRpb01peFNldHRpbmdzLT5lbmRDdXRNcyk7Ci0KLSAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgdHJpbSBwYXJ0Ci0gICAgICAgICAgICBpZiAoKG1BdWRpb01peFNldHRpbmdzLT5iZWdpbkN1dE1zID09IDApICYmCi0gICAgICAgICAgICAgICAgKG1BdWRpb01peFNldHRpbmdzLT5lbmRDdXRNcyAhPSAwKSkgewotICAgICAgICAgICAgICAgIC8vIEVuZCB0aW1lIGl0c2VsZiB0aGUgZmlsZSBkdXJhdGlvbgotICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZUR1cmF0aW9uID0gbUF1ZGlvTWl4U2V0dGluZ3MtPmVuZEN1dE1zOwotICAgICAgICAgICAgICAgIC8vIExpbWl0IHRoZSBmaWxlIGxlbmd0aCBhbHNvCi0gICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlVHJpbW1lZExlbmd0aCA9ICgoCi0gICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCkobUJHQXVkaW9QQ01GaWxlRHVyYXRpb24gKgotICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPnVpU2FtcGxpbmdGcmVxdWVuY3kpICoKLSAgICAgICAgICAgICAgICAgICAgIG1BdWRpb01peFNldHRpbmdzLT51aU5iQ2hhbm5lbHMpICoKLSAgICAgICAgICAgICAgICAgICAgIHNpemVvZihNNE9TQV9VSW50MTYpKSAvIDEwMDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICgobUF1ZGlvTWl4U2V0dGluZ3MtPmJlZ2luQ3V0TXMgIT0gMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgIChtQXVkaW9NaXhTZXR0aW5ncy0+ZW5kQ3V0TXMgPT0gbUJHQXVkaW9QQ01GaWxlRHVyYXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgLy8gRW5kIHRpbWUgaXRzZWxmIHRoZSBmaWxlIGR1cmF0aW9uCi0gICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlRHVyYXRpb24gPSBtQkdBdWRpb1BDTUZpbGVEdXJhdGlvbiAtCi0gICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPmJlZ2luQ3V0TXM7Ci0gICAgICAgICAgICAgICAgLy8gTGltaXQgdGhlIGZpbGUgbGVuZ3RoIGFsc28KLSAgICAgICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVUcmltbWVkTGVuZ3RoID0gKCgKLSAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KShtQkdBdWRpb1BDTUZpbGVEdXJhdGlvbiAqCi0gICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSkgKgotICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPnVpTmJDaGFubmVscykgKgotICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE00T1NBX1VJbnQxNikpIC8gMTAwMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKChtQXVkaW9NaXhTZXR0aW5ncy0+YmVnaW5DdXRNcyAhPSAwKSAmJgotICAgICAgICAgICAgICAgICAgICAobUF1ZGlvTWl4U2V0dGluZ3MtPmVuZEN1dE1zICE9IDApKSB7Ci0gICAgICAgICAgICAgICAgLy8gRW5kIHRpbWUgaXRzZWxmIHRoZSBmaWxlIGR1cmF0aW9uCi0gICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlRHVyYXRpb24gPSBtQXVkaW9NaXhTZXR0aW5ncy0+ZW5kQ3V0TXMgLQotICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+YmVnaW5DdXRNczsKLSAgICAgICAgICAgICAgICAvLyBMaW1pdCB0aGUgZmlsZSBsZW5ndGggYWxzbwotICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZVRyaW1tZWRMZW5ndGggPSAoKAotICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCkobUJHQXVkaW9QQ01GaWxlRHVyYXRpb24gKgotICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSkgKgotICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlOYkNoYW5uZWxzKSAqCi0gICAgICAgICAgICAgICAgICAgIHNpemVvZihNNE9TQV9VSW50MTYpKSAvIDEwMDA7IC8qbWFrZSB0byBzZWMgZnJvbSBtcyovCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvUGxheWVyOiBmaWxlIGR1cmF0aW9uIHJlY29yZGVkIDogJWxsZCIsCi0gICAgICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZUR1cmF0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIExhc3QgcGxheWVkIGxvY2F0aW9uIHRvIGJlIHNlZWtlZCBhdCBmb3IgbmV4dCBtZWRpYSBpdGVtCi0gICAgICAgIGlmICggcmVzdWx0ID09IE00Tk9fRVJST1IgKSB7Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6bUJHQXVkaW9TdG9yeUJvYXJkU2tpbVRpbWVTdGFtcCAlbGxkIiwKLSAgICAgICAgICAgICAgICAgICAgbUJHQXVkaW9TdG9yeUJvYXJkU2tpbVRpbWVTdGFtcCk7Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6dWlBZGRDdHMgJWQiLAotICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlBZGRDdHMpOwotICAgICAgICAgICAgaWYgKG1CR0F1ZGlvU3RvcnlCb2FyZFNraW1UaW1lU3RhbXAgPj0gbUF1ZGlvTWl4U2V0dGluZ3MtPnVpQWRkQ3RzKSB7Ci0gICAgICAgICAgICAgICAgc3RhcnRUaW1lID0gKG1CR0F1ZGlvU3RvcnlCb2FyZFNraW1UaW1lU3RhbXAgLQotICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlBZGRDdHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6c3RhcnRUaW1lICVkIiwgc3RhcnRUaW1lKTsKLSAgICAgICAgICAgIHNlZWtUaW1lU3RhbXAgPSAwOwotICAgICAgICAgICAgaWYgKHN0YXJ0VGltZSkgewotICAgICAgICAgICAgICAgIGlmIChzdGFydFRpbWUgPj0gbUJHQXVkaW9QQ01GaWxlRHVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIEJHIHRyYWNrIHNob3VsZCBiZSBsb29wZWQgYW5kIHN0YXJ0ZWQgYWdhaW4KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1BdWRpb01peFNldHRpbmdzLT5iTG9vcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIGJlZ2luIGN1dCB0aW1lIHRvIHRoZSBtb2QgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlZWtUaW1lU3RhbXAgPSAoKHN0YXJ0VGltZSVtQkdBdWRpb1BDTUZpbGVEdXJhdGlvbikgKwotICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPmJlZ2luQ3V0TXMpOwotICAgICAgICAgICAgICAgICAgICB9ZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBMb29waW5nIGRpc2FibGVkLCBkb25vdCBkbyBCVCBNaXggLCBzZXQgdG8gZmlsZSBlbmQKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlZWtUaW1lU3RhbXAgPSAobUJHQXVkaW9QQ01GaWxlRHVyYXRpb24gKwotICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPmJlZ2luQ3V0TXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfWVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBCVCBzdGlsbCBwcmVzZW50ICwganVzdCBzZWVrIHRvIHN0b3J5IGJvYXJkIHRpbWUKLSAgICAgICAgICAgICAgICAgICAgc2Vla1RpbWVTdGFtcCA9IHN0YXJ0VGltZSArIG1BdWRpb01peFNldHRpbmdzLT5iZWdpbkN1dE1zOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHNlZWtUaW1lU3RhbXAgPSBtQXVkaW9NaXhTZXR0aW5ncy0+YmVnaW5DdXRNczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ29udmVydCB0aGUgc2Vla1RpbWVTdGFtcCB0byBmaWxlIGxvY2F0aW9uCi0gICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVPcmlnaW5hbFNlZWtQb2ludCA9ICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCkobUF1ZGlvTWl4U2V0dGluZ3MtPmJlZ2luQ3V0TXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBtQXVkaW9NaXhTZXR0aW5ncy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbUF1ZGlvTWl4U2V0dGluZ3MtPnVpTmJDaGFubmVscwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX1VJbnQxNikpLyAxMDAwIDsgLyptYWtlIHRvIHNlYyBmcm9tIG1zKi8KLQotICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50ID0gKChpbnQ2NF90KShzZWVrVGltZVN0YW1wKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbUF1ZGlvTWl4U2V0dGluZ3MtPnVpU2FtcGxpbmdGcmVxdWVuY3kKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG1BdWRpb01peFNldHRpbmdzLT51aU5iQ2hhbm5lbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VSW50MTYpKS8gMTAwMCA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBXZSBhbGxvdyBhbiBvcHRpb25hbCBJTkZPX0ZPUk1BVF9DSEFOR0VEIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZwotICAgIC8vIG9mIHBsYXliYWNrLCBpZiB0aGVyZSBpcyBvbmUsIGdldEZvcm1hdCBiZWxvdyB3aWxsIHJldHJpZXZlIHRoZQotICAgIC8vIHVwZGF0ZWQgZm9ybWF0LCBpZiB0aGVyZSBpc24ndCwgd2UnbGwgc3Rhc2ggYXdheSB0aGUgdmFsaWQgYnVmZmVyCi0gICAgLy8gb2YgZGF0YSB0byBiZSB1c2VkIG9uIHRoZSBmaXJzdCBhdWRpbyBjYWxsYmFjay4KLQotICAgIENIRUNLKG1GaXJzdEJ1ZmZlciA9PSBOVUxMKTsKLQotICAgIG1GaXJzdEJ1ZmZlclJlc3VsdCA9IG1Tb3VyY2UtPnJlYWQoJm1GaXJzdEJ1ZmZlcik7Ci0gICAgaWYgKG1GaXJzdEJ1ZmZlclJlc3VsdCA9PSBJTkZPX0ZPUk1BVF9DSEFOR0VEKSB7Ci0gICAgICAgIEFMT0dWKCJJTkZPX0ZPUk1BVF9DSEFOR0VEISEhIik7Ci0KLSAgICAgICAgQ0hFQ0sobUZpcnN0QnVmZmVyID09IE5VTEwpOwotICAgICAgICBtRmlyc3RCdWZmZXJSZXN1bHQgPSBPSzsKLSAgICAgICAgbUlzRmlyc3RCdWZmZXIgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgICBtSXNGaXJzdEJ1ZmZlciA9IHRydWU7Ci0gICAgfQotCi0gICAgc3A8TWV0YURhdGE+IGZvcm1hdCA9IG1Tb3VyY2UtPmdldEZvcm1hdCgpOwotICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgYm9vbCBzdWNjZXNzID0gZm9ybWF0LT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKTsKLSAgICBDSEVDSyhzdWNjZXNzKTsKLSAgICBDSEVDSyghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKTsKLQotICAgIHN1Y2Nlc3MgPSBmb3JtYXQtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJm1TYW1wbGVSYXRlKTsKLSAgICBDSEVDSyhzdWNjZXNzKTsKLQotICAgIGludDMyX3QgbnVtQ2hhbm5lbHM7Ci0gICAgc3VjY2VzcyA9IGZvcm1hdC0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZudW1DaGFubmVscyk7Ci0gICAgQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgICBpZiAobUF1ZGlvU2luay5nZXQoKSAhPSBOVUxMKSB7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IG1BdWRpb1NpbmstPm9wZW4oCi0gICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsIG51bUNoYW5uZWxzLCBDSEFOTkVMX01BU0tfVVNFX0NIQU5ORUxfT1JERVIsIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAotICAgICAgICAgICAgICAgIERFRkFVTFRfQVVESU9TSU5LX0JVRkZFUkNPVU5ULAotICAgICAgICAgICAgICAgICZWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpBdWRpb1NpbmtDYWxsYmFjaywgdGhpcyk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIGlmIChtRmlyc3RCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG1GaXJzdEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIG1GaXJzdEJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghc291cmNlQWxyZWFkeVN0YXJ0ZWQpIHsKLSAgICAgICAgICAgICAgICBtU291cmNlLT5zdG9wKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBtTGF0ZW5jeVVzID0gKGludDY0X3QpbUF1ZGlvU2luay0+bGF0ZW5jeSgpICogMTAwMDsKLSAgICAgICAgbUZyYW1lU2l6ZSA9IG1BdWRpb1NpbmstPmZyYW1lU2l6ZSgpOwotCi0gICAgICAgIG1BdWRpb1NpbmstPnN0YXJ0KCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUF1ZGlvVHJhY2sgPSBuZXcgQXVkaW9UcmFjaygKLSAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fTVVTSUMsIG1TYW1wbGVSYXRlLCBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKLSAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQobnVtQ2hhbm5lbHMpLAotICAgICAgICAgICAgICAgIDAsIEFVRElPX09VVFBVVF9GTEFHX05PTkUsICZBdWRpb0NhbGxiYWNrLCB0aGlzLCAwKTsKLQotICAgICAgICBpZiAoKGVyciA9IG1BdWRpb1RyYWNrLT5pbml0Q2hlY2soKSkgIT0gT0spIHsKLSAgICAgICAgICAgIG1BdWRpb1RyYWNrLmNsZWFyKCk7Ci0KLSAgICAgICAgICAgIGlmIChtRmlyc3RCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG1GaXJzdEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIG1GaXJzdEJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghc291cmNlQWxyZWFkeVN0YXJ0ZWQpIHsKLSAgICAgICAgICAgICAgICBtU291cmNlLT5zdG9wKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBtTGF0ZW5jeVVzID0gKGludDY0X3QpbUF1ZGlvVHJhY2stPmxhdGVuY3koKSAqIDEwMDA7Ci0gICAgICAgIG1GcmFtZVNpemUgPSBtQXVkaW9UcmFjay0+ZnJhbWVTaXplKCk7Ci0KLSAgICAgICAgbUF1ZGlvVHJhY2stPnN0YXJ0KCk7Ci0gICAgfQotCi0gICAgbVN0YXJ0ZWQgPSB0cnVlOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi0KLXZvaWQgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6cmVzZXQoKSB7Ci0KLSAgICBBTE9HVigicmVzZXQiKTsKLSAgICBjbGVhcigpOwotCi0gICAgLy8gQ2FwdHVyZSB0aGUgY3VycmVudCBzZWVrIHBvaW50Ci0gICAgbUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50ID0gMDsKLSAgICBtQkdBdWRpb1N0b3J5Qm9hcmRTa2ltVGltZVN0YW1wID0wOwotICAgIG1CR0F1ZGlvU3RvcnlCb2FyZEN1cnJlbnRNZWRpYUJlZ2luQ3V0VFM9MDsKLX0KLQotc2l6ZV90IFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OkF1ZGlvU2lua0NhbGxiYWNrKAotICAgICAgICBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luayAqYXVkaW9TaW5rLAotICAgICAgICB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplLCB2b2lkICpjb29raWUsCi0gICAgICAgIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rOjpjYl9ldmVudF90IGV2ZW50KSB7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb1BsYXllciAqbWUgPSAoVmlkZW9FZGl0b3JBdWRpb1BsYXllciAqKWNvb2tpZTsKLQotICAgIGlmIChldmVudCA9PSBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luazo6Q0JfRVZFTlRfRklMTF9CVUZGRVIgKSB7Ci0gICAgICAgIHJldHVybiBtZS0+ZmlsbEJ1ZmZlcihidWZmZXIsIHNpemUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotCi1zaXplX3QgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6ZmlsbEJ1ZmZlcih2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotCi0gICAgaWYgKG1SZWFjaGVkRU9TKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHNpemVfdCBzaXplX2RvbmUgPSAwOwotICAgIHNpemVfdCBzaXplX3JlbWFpbmluZyA9IHNpemU7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNEFNX0J1ZmZlcjE2IGJnRnJhbWUgPSB7TlVMTCwgMH07Ci0gICAgTTRBTV9CdWZmZXIxNiBtaXhGcmFtZSA9IHtOVUxMLCAwfTsKLSAgICBNNEFNX0J1ZmZlcjE2IHB0RnJhbWUgPSB7TlVMTCwgMH07Ci0gICAgaW50NjRfdCBjdXJyZW50U3RlYW1UUyA9IDA7Ci0gICAgaW50NjRfdCBzdGFydFRpbWVGb3JCVCA9IDA7Ci0gICAgTTRPU0FfRmxvYXQgZlBUVm9sTGV2ZWwgPQotICAgICAoKE00T1NBX0Zsb2F0KW1CR0F1ZGlvU3RvcnlCb2FyZEN1cnJlbnRNZWRpYVZvbHVtZVZhbCkvMTAwOwotICAgIE00T1NBX0ludDE2ICAgICAqcFBUTWRhdGE9TlVMTDsKLSAgICBNNE9TQV9VSW50MzIgICAgIHVpUENNc2l6ZSA9IDA7Ci0KLSAgICBib29sIHBvc3RTZWVrQ29tcGxldGUgPSBmYWxzZTsKLSAgICBib29sIHBvc3RFT1MgPSBmYWxzZTsKLQotICAgIHdoaWxlICgoc2l6ZV9yZW1haW5pbmcgPiAwKSYmKGVycj09TTROT19FUlJPUikpIHsKLSAgICAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIG9wdGlvbnM7Ci0KLSAgICAgICAgewotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICAgICAgICAgIGlmIChtU2Vla2luZykgewotICAgICAgICAgICAgICAgIGlmIChtSXNGaXJzdEJ1ZmZlcikgewotICAgICAgICAgICAgICAgICAgICBpZiAobUZpcnN0QnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1GaXJzdEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUZpcnN0QnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtSXNGaXJzdEJ1ZmZlciA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKG1TZWVrVGltZVVzKTsKLQotICAgICAgICAgICAgICAgIGlmIChtSW5wdXRCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtU2Vla2luZyA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgaWYgKG1PYnNlcnZlcikgewotICAgICAgICAgICAgICAgICAgICBwb3N0U2Vla0NvbXBsZXRlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUlucHV0QnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IE9LOwotCi0gICAgICAgICAgICBpZiAobUlzRmlyc3RCdWZmZXIpIHsKLSAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXIgPSBtRmlyc3RCdWZmZXI7Ci0gICAgICAgICAgICAgICAgbUZpcnN0QnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBtRmlyc3RCdWZmZXJSZXN1bHQ7Ci0KLSAgICAgICAgICAgICAgICBtSXNGaXJzdEJ1ZmZlciA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gbVNvdXJjZS0+cmVhZCgmbUlucHV0QnVmZmVyLCAmb3B0aW9ucyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIERhdGEgaXMgUHJpbWFyeSBUcmFjaywgbWl4IHdpdGggYmFja2dyb3VuZCB0cmFjawotICAgICAgICAgICAgICAgIC8vIGFmdGVyIHJlYWRpbmcgc2FtZSBzaXplIGZyb20gQmFja2dyb3VuZCB0cmFjayBQQ00gZmlsZQotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBNaXggb25seSB3aGVuIHNraW0gcG9pbnQgaXMgYWZ0ZXIgc3RhcnRUaW1lIG9mIEJUCi0gICAgICAgICAgICAgICAgICAgIGlmICgoKG1CR0F1ZGlvU3RvcnlCb2FyZFNraW1UaW1lU3RhbXAqIDEwMDApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKG1Qb3NpdGlvblRpbWVNZWRpYVVzIC0gbVNlZWtUaW1lVXMpKSA+PQotICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCkobUF1ZGlvTWl4U2V0dGluZ3MtPnVpQWRkQ3RzICogMTAwMCkpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OklOU0lERSBNSVhJTkciKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJDaGVja2luZyAlbGxkIDw9ICVsbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZVNlZWtQb2ludC1tQkdBdWRpb1BDTUZpbGVPcmlnaW5hbFNlZWtQb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVUcmltbWVkTGVuZ3RoKTsKLQotCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdHIgPSAoTTRPU0FfVm9pZCopKCh1bnNpZ25lZCBpbnQpbUlucHV0QnVmZmVyLT5kYXRhKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyLT5yYW5nZV9vZmZzZXQoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBsZW4gPSBtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCBmcCA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHVpUENNc2l6ZSA9IChtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpKS8yOwotICAgICAgICAgICAgICAgICAgICAgICAgcFBUTWRhdGEgPSAoTTRPU0FfSW50MTYqKSAoKHVpbnQ4X3QqKSBtSW5wdXRCdWZmZXItPmRhdGEoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1JbnB1dEJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigibWl4IHdpdGggYmFja2dyb3VuZCBtYWxsb2MgdG8gZG8gbGVuICVkIiwgbGVuKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgYmdGcmFtZS5tX2RhdGFBZGRyZXNzID0gKE00T1NBX1VJbnQxNiopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKCBsZW4sIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJiZ0ZyYW1lIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiZ0ZyYW1lLm1fYnVmZmVyU2l6ZSA9IGxlbjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbWl4RnJhbWUubV9kYXRhQWRkcmVzcyA9IChNNE9TQV9VSW50MTYqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhsZW4sIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJtaXhGcmFtZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWl4RnJhbWUubV9idWZmZXJTaXplID0gbGVuOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigibWl4IHdpdGggYmdtIHdpdGggc2l6ZSAlbGxkIiwgbUJHQXVkaW9QQ01GaWxlTGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobUlucHV0QnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVBvc2l0aW9uVGltZU1lZGlhVXMpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1CR0F1ZGlvUENNRmlsZVNlZWtQb2ludCAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZU9yaWdpbmFsU2Vla1BvaW50IDw9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobUJHQXVkaW9QQ01GaWxlVHJpbW1lZExlbmd0aCAtIGxlbikpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJDaGVja2luZyBtQkdBdWRpb1BDTUZpbGVIYW5kbGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KW1CR0F1ZGlvUENNRmlsZUhhbmRsZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUJHQXVkaW9QQ01GaWxlSGFuZGxlICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImZpbGxCdWZmZXIgc2Vla2luZyBmaWxlIHRvICVsbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gOiAzMmJpdHMgcmVxdWlyZWQgZm9yIE9TQUwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRtcDMyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpbUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE9TQV9maWxlUmVhZFNlZWsobUJHQXVkaW9QQ01GaWxlSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ZpbGVQb3NpdGlvbiopJnRtcDMyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVTZWVrUG9pbnQgPSB0bXAzMjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk00T1NBX2ZpbGVSZWFkU2VlayBlcnIgJWQiLChpbnQpZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00T1NBX2ZpbGVSZWFkRGF0YShtQkdBdWRpb1BDTUZpbGVIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50OCopYmdGcmFtZS5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiopJmxlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gTTRXQVJfTk9fREFUQV9ZRVQgKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJmaWxsQnVmZmVyIEVuZCBvZiBmaWxlIHJlYWNoZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIHJlYWNoZWQgdGhlIGVuZCBvZiBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIHRvIGJlZ2luIGN1dCB0aW1lIGVxdWFsIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvTWl4U2V0dGluZ3MtPmJMb29wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoaW50NjRfdCkobUF1ZGlvTWl4U2V0dGluZ3MtPmJlZ2luQ3V0TXMpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb01peFNldHRpbmdzLT51aVNhbXBsaW5nRnJlcXVlbmN5KSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlOYkNoYW5uZWxzICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTTRPU0FfVUludDE2KSkgLyAxMDAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJmaWxsQnVmZmVyIExvb3BpbmcgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBtQkdBdWRpb1BDTUZpbGVTZWVrUG9pbnQgJWxsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZVNlZWtQb2ludCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gbWl4aW5nOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0YWtlIGNhcmUgb2Ygdm9sdW1lIG9mIHByaW1hcnkgdHJhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZlBUVm9sTGV2ZWwgPCAxLjApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJpbWFyeVRyYWNrVm9sdW1lKHBQVE1kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlQQ01zaXplLCBmUFRWb2xMZXZlbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVyciAhPSBNNE5PX0VSUk9SICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJmaWxlUmVhZERhdGEgZm9yIGF1ZGlvIGVyciAlZCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVTZWVrUG9pbnQgKz0gbGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImZpbGxCdWZmZXIgbUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJWxsZCIsIG1CR0F1ZGlvUENNRmlsZVNlZWtQb2ludCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFzc2lnbiB0aGUgcHRyIGRhdGEgdG8gcHJpbWFyeSB0cmFjawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRGcmFtZS5tX2RhdGFBZGRyZXNzID0gKE00T1NBX1VJbnQxNiopcHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRGcmFtZS5tX2J1ZmZlclNpemUgPSBsZW47Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhbGwgdG8gbWl4IGFuZCBkdWNrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9Qcm9jZXNzLT5taXhBbmREdWNrKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHRGcmFtZSwgJmJnRnJhbWUsICZtaXhGcmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPdmVyd3JpdGUgdGhlIGRlY29kZWQgYnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbWl4RnJhbWUubV9kYXRhQWRkcmVzcywgbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUF1ZGlvTWl4U2V0dGluZ3MtPmJMb29wKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNb3ZlIHRvIGJlZ2luIGN1dCB0aW1lIGVxdWFsIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlT3JpZ2luYWxTZWVrUG9pbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIG1peGluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0YWtlIGNhcmUgb2Ygdm9sdW1lIGxldmVsIG9mIHByaW1hcnkgdHJhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihmUFRWb2xMZXZlbCA8IDEuMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcmltYXJ5VHJhY2tWb2x1bWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQVE1kYXRhLCB1aVBDTXNpemUsIGZQVFZvbExldmVsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmdGcmFtZS5tX2RhdGFBZGRyZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShiZ0ZyYW1lLm1fZGF0YUFkZHJlc3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1peEZyYW1lLm1fZGF0YUFkZHJlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKG1peEZyYW1lLm1fZGF0YUFkZHJlc3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gbWl4aW5nOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFrZSBjYXJlIG9mIHZvbHVtZSBsZXZlbCBvZiBwcmltYXJ5IHRyYWNrCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihmUFRWb2xMZXZlbCA8IDEuMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFByaW1hcnlUcmFja1ZvbHVtZShwUFRNZGF0YSwgdWlQQ01zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZQVFZvbExldmVsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ0hFQ0soKHN0YXR1cyA9PSBPSyAmJiBtSW5wdXRCdWZmZXIgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICB8fCAoc3RhdHVzICE9IE9LICYmIG1JbnB1dEJ1ZmZlciA9PSBOVUxMKSk7Ci0KLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiZmlsbEJ1ZmZlcjogbVNvdXJjZS0+cmVhZCByZXR1cm5lZCBlcnIgJWQiLCBzdGF0dXMpOwotICAgICAgICAgICAgICAgIGlmIChtT2JzZXJ2ZXIgJiYgIW1SZWFjaGVkRU9TKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBvc3RFT1MgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1SZWFjaGVkRU9TID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtRmluYWxTdGF0dXMgPSBzdGF0dXM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENIRUNLKG1JbnB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAmbVBvc2l0aW9uVGltZU1lZGlhVXMpKTsKLQotICAgICAgICAgICAgbVBvc2l0aW9uVGltZVJlYWxVcyA9Ci0gICAgICAgICAgICAgICAgKChtTnVtRnJhbWVzUGxheWVkICsgc2l6ZV9kb25lIC8gbUZyYW1lU2l6ZSkgKiAxMDAwMDAwKQotICAgICAgICAgICAgICAgICAgICAvIG1TYW1wbGVSYXRlOwotCi0gICAgICAgICAgICBBTE9HVigiYnVmZmVyLT5zaXplKCkgPSAlZCwgIgotICAgICAgICAgICAgICAgICAgICAgIm1Qb3NpdGlvblRpbWVNZWRpYVVzPSUuMmYgbVBvc2l0aW9uVGltZVJlYWxVcz0lLjJmIiwKLSAgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSwKLSAgICAgICAgICAgICAgICAgbVBvc2l0aW9uVGltZU1lZGlhVXMgLyAxRTYsIG1Qb3NpdGlvblRpbWVSZWFsVXMgLyAxRTYpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgbUlucHV0QnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBtSW5wdXRCdWZmZXIgPSBOVUxMOwotCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHNpemVfdCBjb3B5ID0gc2l6ZV9yZW1haW5pbmc7Ci0gICAgICAgIGlmIChjb3B5ID4gbUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSkgewotICAgICAgICAgICAgY29weSA9IG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtZW1jcHkoKGNoYXIgKilkYXRhICsgc2l6ZV9kb25lLAotICAgICAgICAgICAoY29uc3QgY2hhciAqKW1JbnB1dEJ1ZmZlci0+ZGF0YSgpICsgbUlucHV0QnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKLSAgICAgICAgICAgICAgIGNvcHkpOwotCi0gICAgICAgIG1JbnB1dEJ1ZmZlci0+c2V0X3JhbmdlKG1JbnB1dEJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkgKyBjb3B5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgLSBjb3B5KTsKLQotICAgICAgICBzaXplX2RvbmUgKz0gY29weTsKLSAgICAgICAgc2l6ZV9yZW1haW5pbmcgLT0gY29weTsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgICAgIG1OdW1GcmFtZXNQbGF5ZWQgKz0gc2l6ZV9kb25lIC8gbUZyYW1lU2l6ZTsKLSAgICB9Ci0KLSAgICBpZiAocG9zdEVPUykgewotICAgICAgICBtT2JzZXJ2ZXItPnBvc3RBdWRpb0VPUygpOwotICAgIH0KLQotICAgIGlmIChwb3N0U2Vla0NvbXBsZXRlKSB7Ci0gICAgICAgIG1PYnNlcnZlci0+cG9zdEF1ZGlvU2Vla0NvbXBsZXRlKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHNpemVfZG9uZTsKLX0KLQotdm9pZCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpzZXRBdWRpb01peFNldHRpbmdzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19BdWRpb01peGluZ1NldHRpbmdzKiBwQXVkaW9NaXhTZXR0aW5ncykgewotICAgIG1BdWRpb01peFNldHRpbmdzID0gcEF1ZGlvTWl4U2V0dGluZ3M7Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6c2V0QXVkaW9NaXhQQ01GaWxlSGFuZGxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQgcEJHQXVkaW9QQ01GaWxlSGFuZGxlKXsKLSAgICBtQkdBdWRpb1BDTUZpbGVIYW5kbGUgPSBwQkdBdWRpb1BDTUZpbGVIYW5kbGU7Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6c2V0QXVkaW9NaXhTdG9yeUJvYXJkU2tpbVRpbWVTdGFtcCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgcEJHQXVkaW9TdG9yeUJvYXJkU2tpbVRpbWVTdGFtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgcEJHQXVkaW9DdXJyZW50TWVkaWFCZWdpbkN1dFRTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBwQkdBdWRpb0N1cnJlbnRNZWRpYVZvbHVtZVZhbCkgewotCi0gICAgbUJHQXVkaW9TdG9yeUJvYXJkU2tpbVRpbWVTdGFtcCA9IHBCR0F1ZGlvU3RvcnlCb2FyZFNraW1UaW1lU3RhbXA7Ci0gICAgbUJHQXVkaW9TdG9yeUJvYXJkQ3VycmVudE1lZGlhQmVnaW5DdXRUUyA9IHBCR0F1ZGlvQ3VycmVudE1lZGlhQmVnaW5DdXRUUzsKLSAgICBtQkdBdWRpb1N0b3J5Qm9hcmRDdXJyZW50TWVkaWFWb2x1bWVWYWwgPSBwQkdBdWRpb0N1cnJlbnRNZWRpYVZvbHVtZVZhbDsKLX0KLQotdm9pZCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpzZXRQcmltYXJ5VHJhY2tWb2x1bWUoCi0gICAgTTRPU0FfSW50MTYgKmRhdGEsIE00T1NBX1VJbnQzMiBzaXplLCBNNE9TQV9GbG9hdCB2b2xMZXZlbCkgewotCi0gICAgd2hpbGUoc2l6ZS0tID4gMCkgewotICAgICAgICAqZGF0YSA9IChNNE9TQV9JbnQxNikoKCpkYXRhKSp2b2xMZXZlbCk7Ci0gICAgICAgIGRhdGErKzsKLSAgICB9Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JBdWRpb1BsYXllci5oIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvckF1ZGlvUGxheWVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJjYWY1ZTguLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvckF1ZGlvUGxheWVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVkVfQVVESU9fUExBWUVSX0hfCi0jZGVmaW5lIFZFX0FVRElPX1BMQVlFUl9IXwotCi0jaW5jbHVkZSA8bWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1RpbWVTb3VyY2UuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLSNpbmNsdWRlICJNNHhWU1NfQVBJLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JNYWluLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVJlYWRlci5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcuaCIKLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIE1lZGlhU291cmNlOwotY2xhc3MgQXVkaW9UcmFjazsKLWNsYXNzIFByZXZpZXdQbGF5ZXI7Ci0KLWNsYXNzIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIgOiBwdWJsaWMgVGltZVNvdXJjZSB7Ci1wdWJsaWM6Ci0gICAgZW51bSB7Ci0gICAgICAgIFJFQUNIRURfRU9TLAotICAgICAgICBTRUVLX0NPTVBMRVRFCi0gICAgfTsKLQotICAgIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIoY29uc3Qgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+ICZhdWRpb1NpbmssCi0gICAgICAgIFByZXZpZXdQbGF5ZXIgKmF1ZGlvT2JzZXJ2ZXIgPSBOVUxMKTsKLQotICAgIH5WaWRlb0VkaXRvckF1ZGlvUGxheWVyKCk7Ci0KLSAgICAvLyBSZXR1cm4gdGltZSBpbiB1cy4KLSAgICBpbnQ2NF90IGdldFJlYWxUaW1lVXMoKTsKLQotICAgIC8vIFJldHVybnMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCBidWZmZXIgcGxheWVkIChpbiB1cykuCi0gICAgaW50NjRfdCBnZXRNZWRpYVRpbWVVcygpOwotCi0gICAgLy8gUmV0dXJucyB0cnVlIGlmZiBhIG1hcHBpbmcgaXMgZXN0YWJsaXNoZWQsIGkuZS4gdGhlIEF1ZGlvUGxheWVyQmFzZQotICAgIC8vIGhhcyBwbGF5ZWQgYXQgbGVhc3Qgb25lIGZyYW1lIG9mIGF1ZGlvLgotICAgIGJvb2wgZ2V0TWVkaWFUaW1lTWFwcGluZyhpbnQ2NF90ICpyZWFsdGltZV91cywgaW50NjRfdCAqbWVkaWF0aW1lX3VzKTsKLQotICAgIHN0YXR1c190IHN0YXJ0KGJvb2wgc291cmNlQWxyZWFkeVN0YXJ0ZWQgPSBmYWxzZSk7Ci0gICAgdm9pZCBwYXVzZShib29sIHBsYXlQZW5kaW5nU2FtcGxlcyA9IGZhbHNlKTsKLSAgICBzdGF0dXNfdCByZXN1bWUoKTsKLSAgICBzdGF0dXNfdCBzZWVrVG8oaW50NjRfdCB0aW1lX3VzKTsKLSAgICBib29sIGlzU2Vla2luZygpOwotICAgIGJvb2wgcmVhY2hlZEVPUyhzdGF0dXNfdCAqZmluYWxTdGF0dXMpOwotCi0gICAgdm9pZCBzZXRBdWRpb01peFNldHRpbmdzKE00eFZTU19BdWRpb01peGluZ1NldHRpbmdzKiBwQXVkaW9NaXhTZXR0aW5ncyk7Ci0gICAgdm9pZCBzZXRBdWRpb01peFBDTUZpbGVIYW5kbGUoTTRPU0FfQ29udGV4dCBwQkdBdWRpb1BDTUZpbGVIYW5kbGUpOwotICAgIHZvaWQgc2V0QXVkaW9NaXhTdG9yeUJvYXJkU2tpbVRpbWVTdGFtcCgKLSAgICAgICAgTTRPU0FfVUludDMyIHBCR0F1ZGlvU3RvcnlCb2FyZFNraW1UaW1lU3RhbXAsCi0gICAgICAgIE00T1NBX1VJbnQzMiBwQkdBdWRpb0N1cnJlbnRNZWRpYUJlZ2luQ3V0VFMsCi0gICAgICAgIE00T1NBX1VJbnQzMiBwQkdBdWRpb0N1cnJlbnRNZWRpYVZvbHVtZVZhbCk7Ci0KLSAgICB2b2lkIHNldE9ic2VydmVyKFByZXZpZXdQbGF5ZXIgKm9ic2VydmVyKTsKLSAgICB2b2lkIHNldFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSk7Ci0gICAgc3A8TWVkaWFTb3VyY2U+IGdldFNvdXJjZSgpOwotCi0gICAgYm9vbCBpc1N0YXJ0ZWQoKTsKLXByaXZhdGU6Ci0KLSAgICBNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5ncyAqbUF1ZGlvTWl4U2V0dGluZ3M7Ci0gICAgVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZyAqbUF1ZGlvUHJvY2VzczsKLQotICAgIE00T1NBX0NvbnRleHQgbUJHQXVkaW9QQ01GaWxlSGFuZGxlOwotICAgIGludDY0X3QgbUJHQXVkaW9QQ01GaWxlTGVuZ3RoOwotICAgIGludDY0X3QgbUJHQXVkaW9QQ01GaWxlVHJpbW1lZExlbmd0aDsKLSAgICBpbnQ2NF90IG1CR0F1ZGlvUENNRmlsZUR1cmF0aW9uOwotICAgIGludDY0X3QgbUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50OwotICAgIGludDY0X3QgbUJHQXVkaW9QQ01GaWxlT3JpZ2luYWxTZWVrUG9pbnQ7Ci0gICAgaW50NjRfdCBtQkdBdWRpb1N0b3J5Qm9hcmRTa2ltVGltZVN0YW1wOwotICAgIGludDY0X3QgbUJHQXVkaW9TdG9yeUJvYXJkQ3VycmVudE1lZGlhQmVnaW5DdXRUUzsKLSAgICBpbnQ2NF90IG1CR0F1ZGlvU3RvcnlCb2FyZEN1cnJlbnRNZWRpYVZvbHVtZVZhbDsKLQotICAgIHNwPE1lZGlhU291cmNlPiBtU291cmNlOwotICAgIHNwPEF1ZGlvVHJhY2s+IG1BdWRpb1RyYWNrOwotCi0gICAgTWVkaWFCdWZmZXIgKm1JbnB1dEJ1ZmZlcjsKLQotICAgIGludCBtU2FtcGxlUmF0ZTsKLSAgICBpbnQ2NF90IG1MYXRlbmN5VXM7Ci0gICAgc2l6ZV90IG1GcmFtZVNpemU7Ci0KLSAgICBNdXRleCBtTG9jazsKLSAgICBpbnQ2NF90IG1OdW1GcmFtZXNQbGF5ZWQ7Ci0KLSAgICBpbnQ2NF90IG1Qb3NpdGlvblRpbWVNZWRpYVVzOwotICAgIGludDY0X3QgbVBvc2l0aW9uVGltZVJlYWxVczsKLQotICAgIGJvb2wgbVNlZWtpbmc7Ci0gICAgYm9vbCBtUmVhY2hlZEVPUzsKLSAgICBzdGF0dXNfdCBtRmluYWxTdGF0dXM7Ci0gICAgaW50NjRfdCBtU2Vla1RpbWVVczsKLQotICAgIGJvb2wgbVN0YXJ0ZWQ7Ci0KLSAgICBib29sIG1Jc0ZpcnN0QnVmZmVyOwotICAgIHN0YXR1c190IG1GaXJzdEJ1ZmZlclJlc3VsdDsKLSAgICBNZWRpYUJ1ZmZlciAqbUZpcnN0QnVmZmVyOwotCi0gICAgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+IG1BdWRpb1Npbms7Ci0gICAgUHJldmlld1BsYXllciAqbU9ic2VydmVyOwotCi0gICAgc3RhdGljIHZvaWQgQXVkaW9DYWxsYmFjayhpbnQgZXZlbnQsIHZvaWQgKnVzZXIsIHZvaWQgKmluZm8pOwotICAgIHZvaWQgQXVkaW9DYWxsYmFjayhpbnQgZXZlbnQsIHZvaWQgKmluZm8pOwotICAgIHNpemVfdCBmaWxsQnVmZmVyKHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKLSAgICBzdGF0aWMgc2l6ZV90IEF1ZGlvU2lua0NhbGxiYWNrKAotICAgICAgICAgICAgTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1NpbmsgKmF1ZGlvU2luaywKLSAgICAgICAgICAgIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCB2b2lkICptZSwKLSAgICAgICAgICAgIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rOjpjYl9ldmVudF90IGV2ZW50KTsKLQotICAgIHZvaWQgcmVzZXQoKTsKLSAgICB2b2lkIGNsZWFyKCk7Ci0gICAgaW50NjRfdCBnZXRSZWFsVGltZVVzX2woKTsKLSAgICB2b2lkIHNldFByaW1hcnlUcmFja1ZvbHVtZSgKLSAgICAgICAgICAgIE00T1NBX0ludDE2ICpkYXRhLCBNNE9TQV9VSW50MzIgc2l6ZSwgTTRPU0FfRmxvYXQgdm9sTGV2ZWwpOwotCi0gICAgVmlkZW9FZGl0b3JBdWRpb1BsYXllcihjb25zdCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyICYpOwotICAgIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIgJm9wZXJhdG9yPShjb25zdCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyICYpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBWRV9BVURJT19QTEFZRVJfSF8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZy5jcHAgYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMjRmY2Y0Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyOTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZyIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlICJWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZzo6VmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZygpIHsKLSAgICBBTE9HVigiQ29uc3RydWN0b3IiKTsKLQotICAgIG1BdWRWb2xBcnJJbmRleCA9IDA7Ci0gICAgbURvRHVja2luZyA9IDA7Ci0gICAgbUR1Y2tpbmdfZW5hYmxlID0gMDsKLSAgICBtRHVja2luZ19sb3dWb2x1bWUgPSAwOwotICAgIG1EdWNraW5nX3RocmVzaG9sZCA9IDA7Ci0gICAgbUR1Y2tpbmdGYWN0b3IgPSAwOwotCi0gICAgbUJUVm9sTGV2ZWwgPSAwOwotICAgIG1QVFZvbExldmVsID0gMDsKLQotICAgIG1Jc1NTUkNuZWVkZWQgPSAwOwotICAgIG1DaGFubmVsQ29udmVyc2lvbiA9IDA7Ci0KLSAgICBtQlRGb3JtYXQgPSBNT05PXzE2X0JJVDsKLQotICAgIG1JblNhbXBsZVJhdGUgPSA4MDAwOwotICAgIG1PdXRTYW1wbGVSYXRlID0gMTYwMDA7Ci0gICAgbVBUQ2hhbm5lbENvdW50ID0gMjsKLSAgICBtQlRDaGFubmVsQ291bnQgPSAxOwotfQotCi1NNE9TQV9JbnQzMiBWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nOjptaXhBbmREdWNrKAotICAgICAgICB2b2lkICpwcmltYXJ5VHJhY2tCdWZmZXIsCi0gICAgICAgIHZvaWQgKmJhY2tncm91bmRUcmFja0J1ZmZlciwKLSAgICAgICAgdm9pZCAqb3V0QnVmZmVyKSB7Ci0KLSAgICBBTE9HVigibWl4QW5kRHVjazogdHJhY2sgYnVmZmVycyAocHJpbWFyeTogMHgleCBhbmQgYmFja2dyb3VuZDogMHgleCkgIgotICAgICAgICAgICAgImFuZCBvdXQgYnVmZmVyIDB4JXgiLAotICAgICAgICAgICAgcHJpbWFyeVRyYWNrQnVmZmVyLCBiYWNrZ3JvdW5kVHJhY2tCdWZmZXIsIG91dEJ1ZmZlcik7Ci0KLSAgICBNNEFNX0J1ZmZlcjE2KiBwUHJpbWFyeVRyYWNrICAgPSAoTTRBTV9CdWZmZXIxNiopcHJpbWFyeVRyYWNrQnVmZmVyOwotICAgIE00QU1fQnVmZmVyMTYqIHBCYWNrZ3JvdW5kVHJhY2sgPSAoTTRBTV9CdWZmZXIxNiopYmFja2dyb3VuZFRyYWNrQnVmZmVyOwotICAgIE00QU1fQnVmZmVyMTYqIHBNaXhlZE91dEJ1ZmZlciAgPSAoTTRBTV9CdWZmZXIxNiopb3V0QnVmZmVyOwotCi0gICAgLy8gT3V0cHV0IHNpemUgaWYgc2FtZSBhcyBQVCBzaXplCi0gICAgcE1peGVkT3V0QnVmZmVyLT5tX2J1ZmZlclNpemUgPSBwUHJpbWFyeVRyYWNrLT5tX2J1ZmZlclNpemU7Ci0KLSAgICAvLyBCZWZvcmUgbWl4aW5nLCB3ZSBuZWVkIHRvIGhhdmUgb25seSBQVCBhcyBvdXQgYnVmZmVyCi0gICAgbWVtY3B5KCh2b2lkICopcE1peGVkT3V0QnVmZmVyLT5tX2RhdGFBZGRyZXNzLAotICAgICAgICAodm9pZCAqKXBQcmltYXJ5VHJhY2stPm1fZGF0YUFkZHJlc3MsIHBNaXhlZE91dEJ1ZmZlci0+bV9idWZmZXJTaXplKTsKLQotICAgIC8vIEluaXRpYWxpemUgZHVja2luZyB2YXJpYWJsZXMKLSAgICAvLyBJbml0aWFsbHkgY29udGFpbnMgdGhlIGlucHV0IHByaW1hcnkgdHJhY2sKLSAgICBNNE9TQV9JbnQxNiAqcFBUTWRhdGEyID0gKE00T1NBX0ludDE2KilwTWl4ZWRPdXRCdWZmZXItPm1fZGF0YUFkZHJlc3M7Ci0KLSAgICAvLyBDb250YWlucyBCRyB0cmFjayBwcm9jZXNzZWQgZGF0YShsaWtlIGNoYW5uZWwgY29udmVyc2lvbiBldGMuLgotICAgIE00T1NBX0ludDE2ICpwQlRNZGF0YTEgPSAoTTRPU0FfSW50MTYqKSBwQmFja2dyb3VuZFRyYWNrLT5tX2RhdGFBZGRyZXNzOwotCi0gICAgLy8gU2luY2Ugd2UgbmVlZCB0byBnaXZlIHNhbXBsZSBjb3VudCBhbmQgbm90IGJ1ZmZlciBzaXplCi0gICAgTTRPU0FfVUludDMyIHVpUENNc2l6ZSA9IHBNaXhlZE91dEJ1ZmZlci0+bV9idWZmZXJTaXplIC8gMiA7Ci0KLSAgICBpZiAoKG1EdWNraW5nX2VuYWJsZSkgJiYgKG1QVFZvbExldmVsICE9IDAuMCkpIHsKLSAgICAgICAgTTRPU0FfSW50MzIgcGVha0RiVmFsdWUgPSAwOwotICAgICAgICBNNE9TQV9JbnQzMiBwcmV2aW91c0RiVmFsdWUgPSAwOwotICAgICAgICBNNE9TQV9JbnQxNiAqcFBDTTE2U2FtcGxlID0gKE00T1NBX0ludDE2KilwUHJpbWFyeVRyYWNrLT5tX2RhdGFBZGRyZXNzOwotICAgICAgICBjb25zdCBzaXplX3QgbiA9IHBQcmltYXJ5VHJhY2stPm1fYnVmZmVyU2l6ZSAvIHNpemVvZihNNE9TQV9JbnQxNik7Ci0KLSAgICAgICAgZm9yIChzaXplX3QgbG9vcEluZGV4ID0gMDsgbG9vcEluZGV4IDwgbjsgKytsb29wSW5kZXgpIHsKLSAgICAgICAgICAgIGlmIChwUENNMTZTYW1wbGVbbG9vcEluZGV4XSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgcGVha0RiVmFsdWUgPSBwcmV2aW91c0RiVmFsdWUgPiBwUENNMTZTYW1wbGVbbG9vcEluZGV4XSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0RiVmFsdWUgOiBwUENNMTZTYW1wbGVbbG9vcEluZGV4XTsKLSAgICAgICAgICAgICAgICBwcmV2aW91c0RiVmFsdWUgPSBwZWFrRGJWYWx1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcGVha0RiVmFsdWUgPSBwcmV2aW91c0RiVmFsdWUgPiAtcFBDTTE2U2FtcGxlW2xvb3BJbmRleF0gPwotICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNEYlZhbHVlOiAtcFBDTTE2U2FtcGxlW2xvb3BJbmRleF07Ci0gICAgICAgICAgICAgICAgcHJldmlvdXNEYlZhbHVlID0gcGVha0RiVmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtQXVkaW9Wb2x1bWVBcnJheVttQXVkVm9sQXJySW5kZXhdID0gZ2V0RGVjaWJlbFNvdW5kKHBlYWtEYlZhbHVlKTsKLQotICAgICAgICAvLyBDaGVjayBmb3IgdGhyZXNob2xkIGlzIGRvbmUgYWZ0ZXIga1Byb2Nlc3NpbmdXaW5kb3dTaXplIGN5Y2xlcwotICAgICAgICBpZiAobUF1ZFZvbEFyckluZGV4ID49IGtQcm9jZXNzaW5nV2luZG93U2l6ZSAtIDEpIHsKLSAgICAgICAgICAgIG1Eb0R1Y2tpbmcgPSBpc1RocmVzaG9sZEJyZWFjaGVkKAotICAgICAgICAgICAgICAgICAgICBtQXVkaW9Wb2x1bWVBcnJheSwgbUF1ZFZvbEFyckluZGV4LCBtRHVja2luZ190aHJlc2hvbGQpOwotCi0gICAgICAgICAgICBtQXVkVm9sQXJySW5kZXggPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUF1ZFZvbEFyckluZGV4Kys7Ci0gICAgICAgIH0KLQotICAgICAgICAvLwotICAgICAgICAvLyBCZWxvdyBsb2dpYyBjb250cm9scyB0aGUgbWl4aW5nIHdlaWdodGFnZQotICAgICAgICAvLyBmb3IgQmFja2dyb3VuZCBhbmQgUHJpbWFyeSBUcmFja3MKLSAgICAgICAgLy8gZm9yIHRoZSBkdXJhdGlvbiBvZiB3aW5kb3cgdW5kZXIgYW5hbHlzaXMsCi0gICAgICAgIC8vIHRvIGdpdmUgZmFkZS1vdXQgZm9yIEJhY2tncm91bmQgYW5kIGZhZGUtaW4gZm9yIHByaW1hcnkKLSAgICAgICAgLy8gQ3VycmVudCBmYWRpbmcgZmFjdG9yIGlzIGRpc3RyaWJ1dGVkIGluIGVxdWFsIHJhbmdlIG92ZXIKLSAgICAgICAgLy8gdGhlIGRlZmluZWQgd2luZG93IHNpemUuCi0gICAgICAgIC8vIEZvciBhIHdpbmRvdyBzaXplID0gMjUKLSAgICAgICAgLy8gKDUwMCBtcyAod2luZG93IHVuZGVyIGFuYWx5c2lzKSAvIDIwIG1zIChzYW1wbGUgZHVyYXRpb24pKQotICAgICAgICAvLwotCi0gICAgICAgIGlmIChtRG9EdWNraW5nKSB7Ci0gICAgICAgICAgICBpZiAobUR1Y2tpbmdGYWN0b3IgPiBtRHVja2luZ19sb3dWb2x1bWUpIHsKLSAgICAgICAgICAgICAgICAvLyBGQURFIE9VVCBCRyBUcmFjawotICAgICAgICAgICAgICAgIC8vIEluY3JlbWVudCBkdWNraW5nIGZhY3RvciBpbiB0b3RhbCBzdGVwcyBpbiBmYWN0b3IKLSAgICAgICAgICAgICAgICAvLyBvZiBsb3cgdm9sdW1lIHN0ZXBzIHRvIHJlYWNoIGxvdyB2b2x1bWUgbGV2ZWwKLSAgICAgICAgICAgICAgICBtRHVja2luZ0ZhY3RvciAtPSBtRHVja2luZ19sb3dWb2x1bWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1EdWNraW5nRmFjdG9yID0gbUR1Y2tpbmdfbG93Vm9sdW1lOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1EdWNraW5nRmFjdG9yIDwgMS4wICkgewotICAgICAgICAgICAgICAgIC8vIEZBREUgSU4gQkcgVHJhY2sKLSAgICAgICAgICAgICAgICAvLyBJbmNyZW1lbnQgZHVja2luZyBmYWN0b3IgaW4gdG90YWwgc3RlcHMgb2YKLSAgICAgICAgICAgICAgICAvLyBsb3cgdm9sdW1lIGZhY3RvciB0byByZWFjaCBvcmlnLnZvbHVtZSBsZXZlbAotICAgICAgICAgICAgICAgIG1EdWNraW5nRmFjdG9yICs9IG1EdWNraW5nX2xvd1ZvbHVtZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUR1Y2tpbmdGYWN0b3IgPSAxLjA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IC8vIGVuZCBpZiAtIG1EdWNraW5nX2VuYWJsZQotCi0KLSAgICAvLyBNaXhpbmcgbG9naWMKLSAgICBBTE9HVigiT3V0IG9mIER1Y2tpbmcgYW5hbHlzaXMgdWlQQ01zaXplICVkICVmICVmIiwKLSAgICAgICAgICAgIG1Eb0R1Y2tpbmcsIG1EdWNraW5nRmFjdG9yLCBtQlRWb2xMZXZlbCk7Ci0gICAgd2hpbGUgKHVpUENNc2l6ZS0tID4gMCkgewotCi0gICAgICAgIC8vIFNldCB2b2wgZmFjdG9yIGZvciBCVCBhbmQgUFQKLSAgICAgICAgKnBCVE1kYXRhMSA9IChNNE9TQV9JbnQxNikoKnBCVE1kYXRhMSptQlRWb2xMZXZlbCk7Ci0gICAgICAgICpwUFRNZGF0YTIgPSAoTTRPU0FfSW50MTYpKCpwUFRNZGF0YTIqbVBUVm9sTGV2ZWwpOwotCi0gICAgICAgIC8vIE1peCB0aGUgdHdvIHNhbXBsZXMKLSAgICAgICAgaWYgKG1Eb0R1Y2tpbmcpIHsKLQotICAgICAgICAgICAgLy8gRHVjayB0aGUgQkcgdHJhY2sgdG8gZHVja2luZyBmYWN0b3IgdmFsdWUgYmVmb3JlIG1peGluZwotICAgICAgICAgICAgKnBCVE1kYXRhMSA9IChNNE9TQV9JbnQxNikoKCpwQlRNZGF0YTEpKihtRHVja2luZ0ZhY3RvcikpOwotCi0gICAgICAgICAgICAvLyBtaXggYXMgbm9ybWFsIGNhc2UKLSAgICAgICAgICAgICpwQlRNZGF0YTEgPSAoTTRPU0FfSW50MTYpKCpwQlRNZGF0YTEgLzIgKyAqcFBUTWRhdGEyIC8yKTsKLSAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgKnBCVE1kYXRhMSA9IChNNE9TQV9JbnQxNikoKCpwQlRNZGF0YTEpKihtRHVja2luZ0ZhY3RvcikpOwotICAgICAgICAgICAgKnBCVE1kYXRhMSA9IChNNE9TQV9JbnQxNikoKnBCVE1kYXRhMSAvMiArICpwUFRNZGF0YTIgLzIpOwotICAgICAgICB9Ci0KLSAgICAgICAgTTRPU0FfSW50MzIgdGVtcDsKLSAgICAgICAgaWYgKCpwQlRNZGF0YTEgPCAwKSB7Ci0gICAgICAgICAgICB0ZW1wID0gLSgqcEJUTWRhdGExKSAqIDI7IC8vIGJyaW5nIHRvIG9yaWdpbmFsIEFtcGxpdHVkZSBsZXZlbAotCi0gICAgICAgICAgICBpZiAodGVtcCA+IDMyNzY3KSB7Ci0gICAgICAgICAgICAgICAgKnBCVE1kYXRhMSA9IC0zMjc2NjsgLy8gbGVzcyB0aGVuIG1heCBhbGxvd2VkIHZhbHVlCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICpwQlRNZGF0YTEgPSAoTTRPU0FfSW50MTYpKC10ZW1wKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRlbXAgPSAoKnBCVE1kYXRhMSkgKiAyOyAvLyBicmluZyB0byBvcmlnaW5hbCBBbXBsaXR1ZGUgbGV2ZWwKLSAgICAgICAgICAgIGlmICggdGVtcCA+IDMyNzY4KSB7Ci0gICAgICAgICAgICAgICAgKnBCVE1kYXRhMSA9IDMyNzY3OyAvLyBsZXNzIHRoYW4gbWF4IGFsbG93ZWQgdmFsdWUKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgKnBCVE1kYXRhMSA9IChNNE9TQV9JbnQxNil0ZW1wOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcEJUTWRhdGExKys7Ci0gICAgICAgIHBQVE1kYXRhMisrOwotICAgIH0KLQotICAgIG1lbWNweSgodm9pZCAqKXBNaXhlZE91dEJ1ZmZlci0+bV9kYXRhQWRkcmVzcywKLSAgICAgICAgKHZvaWQgKilwQmFja2dyb3VuZFRyYWNrLT5tX2RhdGFBZGRyZXNzLAotICAgICAgICBwQmFja2dyb3VuZFRyYWNrLT5tX2J1ZmZlclNpemUpOwotCi0gICAgQUxPR1YoIm1peEFuZER1Y2s6IFgiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfSW50MzIgVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZzo6Y2FsY3VsYXRlT3V0UmVzYW1wbGVCdWZTaXplKCkgewotCi0gICAgLy8gVGhpcyBhbHJlYWR5IHRha2VzIGNhcmUgb2YgY2hhbm5lbCBjb3VudCBpbiBtQlRCdWZmZXIubV9idWZmZXJTaXplCi0gICAgcmV0dXJuIChtT3V0U2FtcGxlUmF0ZSAvIG1JblNhbXBsZVJhdGUpICogbUJUQnVmZmVyLm1fYnVmZmVyU2l6ZTsKLX0KLQotdm9pZCBWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nOjpzZXRNaXhQYXJhbXMoCi0gICAgICAgIGNvbnN0IEF1ZGlvTWl4U2V0dGluZ3MmIHNldHRpbmcpIHsKLSAgICBBTE9HVigic2V0TWl4UGFyYW1zIik7Ci0KLSAgICBtRHVja2luZ19lbmFibGUgICAgICAgPSBzZXR0aW5nLmx2SW5EdWNraW5nX2VuYWJsZTsKLSAgICBtRHVja2luZ19sb3dWb2x1bWUgICAgPSBzZXR0aW5nLmx2SW5EdWNraW5nX2xvd1ZvbHVtZTsKLSAgICBtRHVja2luZ190aHJlc2hvbGQgICAgPSBzZXR0aW5nLmx2SW5EdWNraW5nX3RocmVzaG9sZDsKLSAgICBtUFRWb2xMZXZlbCAgICAgICAgICAgPSBzZXR0aW5nLmx2UFRWb2xMZXZlbDsKLSAgICBtQlRWb2xMZXZlbCAgICAgICAgICAgPSBzZXR0aW5nLmx2QlRWb2xMZXZlbCA7Ci0gICAgbUJUQ2hhbm5lbENvdW50ICAgICAgID0gc2V0dGluZy5sdkJUQ2hhbm5lbENvdW50OwotICAgIG1QVENoYW5uZWxDb3VudCAgICAgICA9IHNldHRpbmcubHZQVENoYW5uZWxDb3VudDsKLSAgICBtQlRGb3JtYXQgICAgICAgICAgICAgPSBzZXR0aW5nLmx2QlRGb3JtYXQ7Ci0gICAgbUluU2FtcGxlUmF0ZSAgICAgICAgID0gc2V0dGluZy5sdkluU2FtcGxlUmF0ZTsKLSAgICBtT3V0U2FtcGxlUmF0ZSAgICAgICAgPSBzZXR0aW5nLmx2T3V0U2FtcGxlUmF0ZTsKLQotICAgIC8vIFJlc2V0IHRoZSBmb2xsb3dpbmcgcGFyYW1zIHRvIGRlZmF1bHQgdmFsdWVzCi0gICAgbUF1ZFZvbEFyckluZGV4ICAgICAgID0gMDsKLSAgICBtRG9EdWNraW5nICAgICAgICAgICAgPSAwOwotICAgIG1EdWNraW5nRmFjdG9yICAgICAgICA9IDEuMDsKLQotICAgIEFMT0dWKCJkdWNraW5nIGVuYWJsZSAweCV4IGxvd1ZvbHVtZSAlZiB0aHJlc2hvbGQgJWQgIgotICAgICAgICAgICAgImZQVFZvbExldmVsICVmIEJUVm9sTGV2ZWwgJWYiLAotICAgICAgICAgICAgbUR1Y2tpbmdfZW5hYmxlLCBtRHVja2luZ19sb3dWb2x1bWUsIG1EdWNraW5nX3RocmVzaG9sZCwKLSAgICAgICAgICAgIG1QVFZvbExldmVsLCBtUFRWb2xMZXZlbCk7Ci0KLSAgICAvLyBEZWNpZGVzIGlmIFNTUkMgc3VwcG9ydCBpcyBuZWVkZWQgZm9yIHRoaXMgbWl4aW5nCi0gICAgbUlzU1NSQ25lZWRlZCA9IChzZXR0aW5nLmx2SW5TYW1wbGVSYXRlICE9IHNldHRpbmcubHZPdXRTYW1wbGVSYXRlKTsKLSAgICBpZiAoc2V0dGluZy5sdkJUQ2hhbm5lbENvdW50ICE9IHNldHRpbmcubHZQVENoYW5uZWxDb3VudCl7Ci0gICAgICAgIGlmIChzZXR0aW5nLmx2QlRDaGFubmVsQ291bnQgPT0gMil7Ci0gICAgICAgICAgICBtQ2hhbm5lbENvbnZlcnNpb24gPSAxOyAvLyBjb252ZXJ0IHRvIE1PTk8KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1DaGFubmVsQ29udmVyc2lvbiA9IDI7IC8vIENvbnZlcnQgdG8gU1RFUkVPCi0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBtQ2hhbm5lbENvbnZlcnNpb24gPSAwOwotICAgIH0KLX0KLQotLy8gRmFzdCB3YXkgdG8gY29tcHV0ZSAxMCAqIGxvZyh2YWx1ZSkKLU00T1NBX0ludDMyIFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3Npbmc6OmdldERlY2liZWxTb3VuZChNNE9TQV9VSW50MzIgdmFsdWUpIHsKLSAgICBBTE9HVigiZ2V0RGVjaWJlbFNvdW5kOiAlbGQiLCB2YWx1ZSk7Ci0KLSAgICBpZiAodmFsdWUgPD0gMCB8fCB2YWx1ZSA+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+PjEpPDwxOwotCi0gICAgcHJlcGFyZVlWMTJJbWFnZVBsYW5lKHBsYW5lT3V0LCB5djEyUGxhbmVXaWR0aCwgeXYxMlBsYW5lSGVpZ2h0LAotICAgICAoTTRPU0FfVUludDMyKW91dEJ1ZmZlclN0cmlkZSwgKE00VklGSV9VSW50OCAqKW91dEJ1ZmZlcik7Ci0KLSAgICBlcnIgPSBhcHBseVJlbmRlcmluZ01vZGUocGxhbmVJbiwgcGxhbmVPdXQsIG1SZW5kZXJpbmdNb2RlKTsKLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICBBTE9HRSgiZG9JbWFnZVJlbmRlcmluZ01vZGU6IGFwcGx5UmVuZGVyaW5nTW9kZSByZXR1cm5lZCBlcnI9MHgleCIsICh1bnNpZ25lZCBpbnQpZXJyKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotfSAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIuaCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNzU2ZjMyLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfVkVfUFJFVklFV0NPTlRST0xMRVJfSAotI2RlZmluZSBBTkRST0lEX1ZFX1BSRVZJRVdDT05UUk9MTEVSX0gKLQotI2luY2x1ZGUgIlZpZGVvRWRpdG9yUGxheWVyLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JUb29scy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIENhbGxiYWNrIG1lY2hhbmlzbSBmcm9tIFByZXZpZXdDb250cm9sbGVyIHRvIEpuaSAgKi8KLXR5cGVkZWYgdm9pZCAoKmpuaV9wcm9ncmVzc19jYWxsYmFja19mY3QpKHZvaWQqIGNvb2tpZSwgTTRPU0FfVUludDMyIG1zZ1R5cGUsIHZvaWQgKmFyZ2MpOwotCi1zdHJ1Y3QgU3VyZmFjZTsKLXN0cnVjdCBQcmV2aWV3UmVuZGVyZXI7Ci0KLWNsYXNzIFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIgewotCi1wdWJsaWM6Ci0gICAgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcigpOwotICAgIH5WaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyKCk7Ci0KLSAgICBNNE9TQV9FUlIgbG9hZEVkaXRTZXR0aW5ncygKLSAgICAgICAgICAgIE00VlNTM0dQUF9FZGl0U2V0dGluZ3MqIHBTZXR0aW5ncywKLSAgICAgICAgICAgIE00eFZTU19BdWRpb01peGluZ1NldHRpbmdzKiBiZ21TZXR0aW5ncyk7Ci0KLSAgICBNNE9TQV9FUlIgc2V0U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSk7Ci0KLSAgICBNNE9TQV9FUlIgc3RhcnRQcmV2aWV3KAotICAgICAgICAgICAgTTRPU0FfVUludDMyIGZyb21NUywgTTRPU0FfSW50MzIgdG9NcywKLSAgICAgICAgICAgIE00T1NBX1VJbnQxNiBjYWxsQmFja0FmdGVyRnJhbWVDb3VudCwKLSAgICAgICAgICAgIE00T1NBX0Jvb2wgbG9vcCkgOwotCi0gICAgTTRPU0FfVUludDMyIHN0b3BQcmV2aWV3KCk7Ci0KLSAgICBNNE9TQV9FUlIgcmVuZGVyUHJldmlld0ZyYW1lKAotICAgICAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UsCi0gICAgICAgICAgICBWaWRlb0VkaXRvcl9yZW5kZXJQcmV2aWV3RnJhbWVTdHIqIHBGcmFtZUluZm8sCi0gICAgICAgICAgICBWaWRlb0VkaXRvckN1cnJldEVkaXRJbmZvICpwQ3VyckVkaXRJbmZvKTsKLQotICAgIE00T1NBX0VSUiBjbGVhclN1cmZhY2UoCi0gICAgICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSwKLSAgICAgICAgICAgIFZpZGVvRWRpdG9yX3JlbmRlclByZXZpZXdGcmFtZVN0ciogcEZyYW1lSW5mbyk7Ci0KLSAgICBNNE9TQV9Wb2lkIHNldEpuaUNhbGxiYWNrKAotICAgICAgICAgICAgdm9pZCogY29va2llLAotICAgICAgICAgICAgam5pX3Byb2dyZXNzX2NhbGxiYWNrX2ZjdCBjYWxsYmFja0ZjdCk7Ci0KLSAgICBzdGF0dXNfdCBzZXRQcmV2aWV3RnJhbWVSZW5kZXJpbmdNb2RlKAotICAgICAgICAgICAgTTR4VlNTX01lZGlhUmVuZGVyaW5nIG1vZGUsCi0gICAgICAgICAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSBvdXRwdXRWaWRlb1NpemUpOwotCi1wcml2YXRlOgotICAgIGVudW0gewotICAgICAgICBrVG90YWxOdW1QbGF5ZXJJbnN0YW5jZXMgPSAyLAotICAgICAgICBrUHJldmlld1RocmVhZFN0YWNrU2l6ZSA9IDY1NTM2LAotICAgIH07Ci0KLSAgICB0eXBlZGVmIGVudW0gewotICAgICAgICBWZVBsYXllcklkbGUgPSAwLAotICAgICAgICBWZVBsYXllckJ1c3ksCi0gICAgICAgIFZlUGxheWVyQXV0b1N0b3AKLSAgICB9IFBsYXllclN0YXRlOwotCi0gICAgdHlwZWRlZiBlbnVtIHsKLSAgICAgICAgT1ZFUkxBWV9VUERBVEUgPSAwLAotICAgICAgICBPVkVSTEFZX0NMRUFSCi0gICAgfSBPdmVybGF5U3RhdGU7Ci0KLSAgICBzcDxWaWRlb0VkaXRvclBsYXllcj4gbVZlUGxheWVyW2tUb3RhbE51bVBsYXllckluc3RhbmNlc107Ci0gICAgaW50IG1DdXJyZW50UGxheWVyOyAgLy8gcGxheWVyIGluc3RhbmNlIGN1cnJlbnRseSBiZWluZyB1c2VkCi0gICAgc3A8U3VyZmFjZT4gIG1TdXJmYWNlOwotICAgIG11dGFibGUgTXV0ZXggbUxvY2s7Ci0gICAgTTRPU0FfQ29udGV4dCBtVGhyZWFkQ29udGV4dDsKLSAgICBQbGF5ZXJTdGF0ZSBtUGxheWVyU3RhdGU7Ci0gICAgTTRPU0FfQm9vbCAgICBtUHJlcGFyZVJlcWVzdDsKLSAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICoqbUNsaXBMaXN0OwotICAgIE00T1NBX1VJbnQzMiBtTnVtYmVyQ2xpcHNJblN0b3J5Qm9hcmQ7Ci0gICAgTTRPU0FfVUludDMyIG1OdW1iZXJDbGlwc1RvUHJldmlldzsKLSAgICBNNE9TQV9VSW50MzIgbVN0YXJ0aW5nQ2xpcEluZGV4OwotICAgIE00T1NBX0Jvb2wgbVByZXZpZXdMb29waW5nOwotICAgIE00T1NBX1VJbnQzMiBtQ2FsbEJhY2tBZnRlckZyYW1lQ250OwotICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyogbUVmZmVjdHNTZXR0aW5nczsKLSAgICBNNE9TQV9VSW50MzIgbU51bWJlckVmZmVjdHM7Ci0gICAgTTRPU0FfSW50MzIgbUN1cnJlbnRDbGlwTnVtYmVyOwotICAgIE00T1NBX1VJbnQzMiBtQ2xpcFRvdGFsRHVyYXRpb247Ci0gICAgTTRPU0FfVUludDMyIG1DdXJyZW50VmlkZW9FZmZlY3Q7Ci0gICAgTTR4VlNTX0F1ZGlvTWl4aW5nU2V0dGluZ3MqIG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nOwotICAgIE00T1NBX0NvbnRleHQgbUF1ZGlvTWl4UENNRmlsZUhhbmRsZTsKLSAgICBQcmV2aWV3UmVuZGVyZXIgKm1UYXJnZXQ7Ci0gICAgTTRPU0FfQ29udGV4dCBtSm5pQ29va2llOwotICAgIGpuaV9wcm9ncmVzc19jYWxsYmFja19mY3QgbUpuaUNhbGxiYWNrOwotICAgIFZpZGVvRWRpdG9yX3JlbmRlclByZXZpZXdGcmFtZVN0ciBtRnJhbWVTdHI7Ci0gICAgTTRPU0FfVUludDMyIG1DdXJyZW50UGxheWVkRHVyYXRpb247Ci0gICAgTTRPU0FfVUludDMyIG1DdXJyZW50Q2xpcER1cmF0aW9uOwotICAgIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVTaXplIG1PdXRwdXRWaWRlb1NpemU7Ci0gICAgTTRPU0FfVUludDMyIG1GaXJzdFByZXZpZXdDbGlwQmVnaW5UaW1lOwotICAgIE00T1NBX1VJbnQzMiBtTGFzdFByZXZpZXdDbGlwRW5kVGltZTsKLSAgICBNNE9TQV9VSW50MzIgbVZpZGVvU3RvcnlCb2FyZFRpbWVNc1VwdG9GaXJzdFByZXZpZXdDbGlwOwotICAgIE92ZXJsYXlTdGF0ZSBtT3ZlcmxheVN0YXRlOwotICAgIGludCBtQWN0aXZlUGxheWVySW5kZXg7Ci0KLSAgICBNNHhWU1NfTWVkaWFSZW5kZXJpbmcgbVJlbmRlcmluZ01vZGU7Ci0gICAgdWludDMyX3QgbU91dHB1dFZpZGVvV2lkdGg7Ci0gICAgdWludDMyX3QgbU91dHB1dFZpZGVvSGVpZ2h0OwotICAgIGJvb2wgYlN0b3BUaHJlYWRJblByb2dyZXNzOwotICAgIE00T1NBX0NvbnRleHQgbVNlbVRocmVhZFdhaXQ7Ci0gICAgYm9vbCBtSXNGaWZ0aWVzRWZmZWN0U3RhcnRlZDsKLQotICAgIHNwPFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0PiBtVkVBdWRpb1Npbms7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb1BsYXllciAqbVZFQXVkaW9QbGF5ZXI7Ci0gICAgTmF0aXZlV2luZG93UmVuZGVyZXIqIG1OYXRpdmVXaW5kb3dSZW5kZXJlcjsKLQotICAgIE00VklGSV9VSW50OCogIG1GcmFtZVJHQkJ1ZmZlcjsKLSAgICBNNFZJRklfVUludDgqICBtRnJhbWVZVVZCdWZmZXI7Ci0gICAgbXV0YWJsZSBNdXRleCBtTG9ja1NlbTsKLQotCi0gICAgc3RhdGljIE00T1NBX0VSUiBwcmVwYXJlUGxheWVyKHZvaWQqIHBhcmFtLCBpbnQgcGxheWVySW5zdGFuY2UsIGludCBpbmRleCk7Ci0gICAgc3RhdGljIE00T1NBX0VSUiB0aHJlYWRQcm9jKE00T1NBX1ZvaWQqIHBhcmFtKTsKLSAgICBzdGF0aWMgdm9pZCBub3RpZnkodm9pZCogY29va2llLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIpOwotCi0gICAgdm9pZCBzZXRWaWRlb0VmZmVjdFR5cGUoTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSB0eXBlLCBNNE9TQV9Cb29sIGVuYWJsZSk7Ci0KLSAgICBNNE9TQV9FUlIgYXBwbHlWaWRlb0VmZmVjdCgKLSAgICAgICAgICAgIE00T1NBX1ZvaWQgKiBkYXRhUHRyLCBNNE9TQV9VSW50MzIgY29sb3JGb3JtYXQsCi0gICAgICAgICAgICBNNE9TQV9VSW50MzIgdmlkZW9XaWR0aCwgTTRPU0FfVUludDMyIHZpZGVvSGVpZ2h0LAotICAgICAgICAgICAgTTRPU0FfVUludDMyIHRpbWVNcywgTTRPU0FfVm9pZCogb3V0UHRyKTsKLQotICAgIE00T1NBX0VSUiBkb0ltYWdlUmVuZGVyaW5nTW9kZSgKLSAgICAgICAgICAgIE00T1NBX1ZvaWQgKiBkYXRhUHRyLAotICAgICAgICAgICAgTTRPU0FfVUludDMyIGNvbG9yRm9ybWF0LCBNNE9TQV9VSW50MzIgdmlkZW9XaWR0aCwKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiB2aWRlb0hlaWdodCwgTTRPU0FfVm9pZCogb3V0UHRyKTsKLQotICAgIC8vIERvbid0IGNhbGwgbWUhCi0gICAgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcihjb25zdCBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyICYpOwotICAgIFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIgJm9wZXJhdG9yPSgKLSAgICAgICAgICAgIGNvbnN0IFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIgJik7Ci19OwotCi19Ci0KLSNlbmRpZiAvLyBBTkRST0lEX1ZFX1BSRVZJRVdDT05UUk9MTEVSX0gKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JTUkMuY3BwIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclNSQy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM2ZDA4MTIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclNSQy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiVmlkZW9FZGl0b3JTUkMiCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSAiVmlkZW9FZGl0b3JTUkMuaCIKLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLVZpZGVvRWRpdG9yU1JDOjpWaWRlb0VkaXRvclNSQyhjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkgewotICAgIEFMT0dWKCJWaWRlb0VkaXRvclNSQyAlcCglcCkiLCB0aGlzLCBzb3VyY2UuZ2V0KCkpOwotICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtEZWZhdWx0U2FtcGxpbmdGcmVxZW5jeUh6ID0ga0ZyZXEzMjAwMEh6OwotICAgIG1Tb3VyY2UgPSBzb3VyY2U7Ci0gICAgbVJlc2FtcGxlciA9IE5VTEw7Ci0gICAgbUNoYW5uZWxDbnQgPSAwOwotICAgIG1TYW1wbGVSYXRlID0gMDsKLSAgICBtT3V0cHV0U2FtcGxlUmF0ZSA9IGtEZWZhdWx0U2FtcGxpbmdGcmVxZW5jeUh6OwotICAgIG1TdGFydGVkID0gZmFsc2U7Ci0gICAgbUluaXRpYWxUaW1lU3RhbXBVcyA9IC0xOwotICAgIG1BY2N1T3V0QnVmZmVyU2l6ZSAgPSAwOwotICAgIG1TZWVrVGltZVVzID0gLTE7Ci0gICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgbUxlZnRvdmVyID0gMDsKLSAgICBtRm9ybWF0Q2hhbmdlZCA9IGZhbHNlOwotICAgIG1TdG9wUGVuZGluZyA9IGZhbHNlOwotICAgIG1TZWVrTW9kZSA9IFJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkM7Ci0KLSAgICAvLyBJbnB1dCBTb3VyY2UgdmFsaWRhdGlvbgotICAgIHNwPE1ldGFEYXRhPiBmb3JtYXQgPSBtU291cmNlLT5nZXRGb3JtYXQoKTsKLSAgICBjb25zdCBjaGFyICptaW1lOwotICAgIENIRUNLKGZvcm1hdC0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOwotICAgIENIRUNLKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpOwotCi0gICAgLy8gU2V0IHRoZSBtZXRhZGF0YSBvZiB0aGUgb3V0cHV0IGFmdGVyIHJlc2FtcGxpbmcuCi0gICAgbU91dHB1dEZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKLSAgICBtT3V0cHV0Rm9ybWF0LT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKLSAgICBtT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwga0RlZmF1bHRTYW1wbGluZ0ZyZXFlbmN5SHopOwotICAgIG1PdXRwdXRGb3JtYXQtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIDIpOyAgLy8gYWx3YXlzIHN0ZXJlbwotfQotCi1WaWRlb0VkaXRvclNSQzo6flZpZGVvRWRpdG9yU1JDKCkgewotICAgIEFMT0dWKCJ+VmlkZW9FZGl0b3JTUkMgJXAoJXApIiwgdGhpcywgbVNvdXJjZS5nZXQoKSk7Ci0gICAgc3RvcCgpOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclNSQzo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgewotICAgIEFMT0dWKCJzdGFydCAlcCglcCkiLCB0aGlzLCBtU291cmNlLmdldCgpKTsKLSAgICBDSEVDSyghbVN0YXJ0ZWQpOwotCi0gICAgLy8gU2V0IHJlc2FtcGxlciBpZiByZXF1aXJlZAotICAgIGNoZWNrQW5kU2V0UmVzYW1wbGVyKCk7Ci0KLSAgICBtU2Vla1RpbWVVcyA9IC0xOwotICAgIG1TZWVrTW9kZSA9IFJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkM7Ci0gICAgbVN0YXJ0ZWQgPSB0cnVlOwotICAgIG1Tb3VyY2UtPnN0YXJ0KCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yU1JDOjpzdG9wKCkgewotICAgIEFMT0dWKCJzdG9wICVwKCVwKSIsIHRoaXMsIG1Tb3VyY2UuZ2V0KCkpOwotICAgIGlmICghbVN0YXJ0ZWQpIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIGlmIChtQnVmZmVyKSB7Ci0gICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgfQotICAgIG1Tb3VyY2UtPnN0b3AoKTsKLSAgICBpZiAobVJlc2FtcGxlciAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBtUmVzYW1wbGVyOwotICAgICAgICBtUmVzYW1wbGVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBtU3RhcnRlZCA9IGZhbHNlOwotICAgIG1Jbml0aWFsVGltZVN0YW1wVXMgPSAtMTsKLSAgICBtQWNjdU91dEJ1ZmZlclNpemUgPSAwOwotICAgIG1MZWZ0b3ZlciA9IDA7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXNwPE1ldGFEYXRhPiBWaWRlb0VkaXRvclNSQzo6Z2V0Rm9ybWF0KCkgewotICAgIEFMT0dWKCJnZXRGb3JtYXQiKTsKLSAgICByZXR1cm4gbU91dHB1dEZvcm1hdDsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JTUkM6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyX291dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLSAgICBBTE9HVigicmVhZCAlcCglcCkiLCB0aGlzLCBtU291cmNlLmdldCgpKTsKLSAgICAqYnVmZmVyX291dCA9IE5VTEw7Ci0KLSAgICBpZiAoIW1TdGFydGVkKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgIH0KLQotICAgIGlmIChtUmVzYW1wbGVyKSB7Ci0gICAgICAgIC8vIFN0b3JlIHRoZSBzZWVrIHBhcmFtZXRlcnMKLSAgICAgICAgaW50NjRfdCBzZWVrVGltZVVzOwotICAgICAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZSA9IFJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkM7Ci0gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7Ci0gICAgICAgICAgICBBTE9HVigicmVhZCBTZWVrICVsbGQiLCBzZWVrVGltZVVzKTsKLSAgICAgICAgICAgIG1TZWVrVGltZVVzID0gc2Vla1RpbWVVczsKLSAgICAgICAgICAgIG1TZWVrTW9kZSA9IG1vZGU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXZSBhc2sgZm9yIDEwMjQgZnJhbWVzIGluIG91dHB1dAotICAgICAgICAvLyByZXNhbXBsZXIgb3V0cHV0IGlzIGFsd2F5cyAyIGNoYW5uZWxzIGFuZCAzMiBiaXRzCi0gICAgICAgIGNvbnN0IHNpemVfdCBrT3V0cHV0RnJhbWVDb3VudCA9IDEwMjQ7Ci0gICAgICAgIGNvbnN0IHNpemVfdCBrQnl0ZXMgPSBrT3V0cHV0RnJhbWVDb3VudCAqIDIgKiBzaXplb2YoaW50MzJfdCk7Ci0gICAgICAgIGludDMyX3QgKnBUbXBCdWZmZXIgPSAoaW50MzJfdCAqKWNhbGxvYygxLCBrQnl0ZXMpOwotICAgICAgICBpZiAoIXBUbXBCdWZmZXIpIHsKLSAgICAgICAgICAgIEFMT0dFKCJjYWxsb2MgZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeTogJWQgYnl0ZXMiLCBrQnl0ZXMpOwotICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlc2FtcGxlIHRvIHRhcmdldCBxdWFsaXR5Ci0gICAgICAgIG1SZXNhbXBsZXItPnJlc2FtcGxlKHBUbXBCdWZmZXIsIGtPdXRwdXRGcmFtZUNvdW50LCB0aGlzKTsKLQotICAgICAgICBpZiAobVN0b3BQZW5kaW5nKSB7Ci0gICAgICAgICAgICBzdG9wKCk7Ci0gICAgICAgICAgICBtU3RvcFBlbmRpbmcgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENoYW5nZSByZXNhbXBsZXIgYW5kIHJldHJ5IGlmIGZvcm1hdCBjaGFuZ2UgaGFwcGVuZWQKLSAgICAgICAgaWYgKG1Gb3JtYXRDaGFuZ2VkKSB7Ci0gICAgICAgICAgICBtRm9ybWF0Q2hhbmdlZCA9IGZhbHNlOwotICAgICAgICAgICAgY2hlY2tBbmRTZXRSZXNhbXBsZXIoKTsKLSAgICAgICAgICAgIGZyZWUocFRtcEJ1ZmZlcik7Ci0gICAgICAgICAgICByZXR1cm4gcmVhZChidWZmZXJfb3V0LCBOVUxMKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBNZWRpYUJ1ZmZlcgotICAgICAgICBpbnQzMl90IG91dEJ1ZmZlclNpemUgPSBrT3V0cHV0RnJhbWVDb3VudCAqIDIgKiBzaXplb2YoaW50MTZfdCk7Ci0gICAgICAgIE1lZGlhQnVmZmVyKiBvdXRCdWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIob3V0QnVmZmVyU2l6ZSk7Ci0KLSAgICAgICAgLy8gQ29udmVydCBiYWNrIHRvIDIgY2hhbm5lbHMgYW5kIDE2IGJpdHMKLSAgICAgICAgZGl0aGVyQW5kQ2xhbXAoCi0gICAgICAgICAgICAgICAgKGludDMyX3QgKikoKHVpbnQ4X3QqKW91dEJ1ZmZlci0+ZGF0YSgpICsgb3V0QnVmZmVyLT5yYW5nZV9vZmZzZXQoKSksCi0gICAgICAgICAgICAgICAgcFRtcEJ1ZmZlciwga091dHB1dEZyYW1lQ291bnQpOwotICAgICAgICBmcmVlKHBUbXBCdWZmZXIpOwotCi0gICAgICAgIC8vIENvbXB1dGUgYW5kIHNldCB0aGUgbmV3IHRpbWVzdGFtcAotICAgICAgICBzcDxNZXRhRGF0YT4gdG8gPSBvdXRCdWZmZXItPm1ldGFfZGF0YSgpOwotICAgICAgICBpbnQ2NF90IHRvdGFsT3V0RHVyYXRpb25VcyA9IChtQWNjdU91dEJ1ZmZlclNpemUgKiAxMDAwMDAwKSAvIChtT3V0cHV0U2FtcGxlUmF0ZSAqIDIgKiAyKTsKLSAgICAgICAgaW50NjRfdCB0aW1lVXMgPSBtSW5pdGlhbFRpbWVTdGFtcFVzICsgdG90YWxPdXREdXJhdGlvblVzOwotICAgICAgICB0by0+c2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7Ci0KLSAgICAgICAgLy8gdXBkYXRlIHRoZSBhY2N1bXVsYXRlIHNpemUKLSAgICAgICAgbUFjY3VPdXRCdWZmZXJTaXplICs9IG91dEJ1ZmZlclNpemU7Ci0gICAgICAgICpidWZmZXJfb3V0ID0gb3V0QnVmZmVyOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFJlc2FtcGxpbmcgbm90IHJlcXVpcmVkLiBSZWFkIGFuZCBwYXNzLXRocm91Z2guCi0gICAgICAgIE1lZGlhQnVmZmVyICphQnVmZmVyOwotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5yZWFkKCZhQnVmZmVyLCBvcHRpb25zKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQUxPR1YoInJlYWQgcmV0dXJucyBlcnIgPSAlZCIsIGVycik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXJyID09IElORk9fRk9STUFUX0NIQU5HRUQpIHsKLSAgICAgICAgICAgIGNoZWNrQW5kU2V0UmVzYW1wbGVyKCk7Ci0gICAgICAgICAgICByZXR1cm4gcmVhZChidWZmZXJfb3V0LCBOVUxMKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEVPUyBvciBzb21lIG90aGVyIGVycm9yCi0gICAgICAgIGlmKGVyciAhPSBPSykgewotICAgICAgICAgICAgc3RvcCgpOwotICAgICAgICAgICAgKmJ1ZmZlcl9vdXQgPSBOVUxMOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICAqYnVmZmVyX291dCA9IGFCdWZmZXI7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclNSQzo6Z2V0TmV4dEJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgKnBCdWZmZXIsIGludDY0X3QgcHRzKSB7Ci0gICAgQUxPR1YoImdldE5leHRCdWZmZXIgJWQsIGNoYW4gPSAlZCIsIHBCdWZmZXItPmZyYW1lQ291bnQsIG1DaGFubmVsQ250KTsKLSAgICB1aW50MzJfdCBkb25lID0gMDsKLSAgICB1aW50MzJfdCB3YW50ID0gcEJ1ZmZlci0+ZnJhbWVDb3VudCAqIG1DaGFubmVsQ250ICogMjsKLSAgICBwQnVmZmVyLT5yYXcgPSBtYWxsb2Mod2FudCk7Ci0KLSAgICB3aGlsZSAobVN0YXJ0ZWQgJiYgd2FudCA+IDApIHsKLSAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbnkgZGF0YSBsZWZ0LCByZWFkIGEgbmV3IGJ1ZmZlci4KLSAgICAgICAgaWYgKCFtQnVmZmVyKSB7Ci0gICAgICAgICAgICAvLyBpZiB3ZSBzZWVrLCByZXNldCB0aGUgaW5pdGlhbCB0aW1lIHN0YW1wIGFuZCBhY2N1bXVsYXRlZCB0aW1lCi0gICAgICAgICAgICBSZWFkT3B0aW9ucyBvcHRpb25zOwotICAgICAgICAgICAgaWYgKG1TZWVrVGltZVVzID49IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiJXAgY2FjaGVNb3JlX2wgU2VlayByZXF1ZXN0ZWQgPSAlbGxkIiwgdGhpcywgbVNlZWtUaW1lVXMpOwotICAgICAgICAgICAgICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlID0gbVNlZWtNb2RlOwotICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKG1TZWVrVGltZVVzLCBtb2RlKTsKLSAgICAgICAgICAgICAgICBtU2Vla1RpbWVVcyA9IC0xOwotICAgICAgICAgICAgICAgIG1Jbml0aWFsVGltZVN0YW1wVXMgPSAtMTsKLSAgICAgICAgICAgICAgICBtQWNjdU91dEJ1ZmZlclNpemUgPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5yZWFkKCZtQnVmZmVyLCAmb3B0aW9ucyk7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBCdWZmZXItPnJhdyk7Ci0gICAgICAgICAgICAgICAgcEJ1ZmZlci0+cmF3ID0gTlVMTDsKLSAgICAgICAgICAgICAgICBwQnVmZmVyLT5mcmFtZUNvdW50ID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGVyciA9PSBJTkZPX0ZPUk1BVF9DSEFOR0VEKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImdldE5leHRCdWZmZXI6IHNvdXJjZSByZWFkIHJldHVybmVkIElORk9fRk9STUFUX0NIQU5HRUQiKTsKLSAgICAgICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHdlIGNhbm5vdCBzd2l0Y2ggdG8gYSBuZXcgQXVkaW9SZXNhbXBsZXIgYmVjYXVzZQotICAgICAgICAgICAgICAgIC8vIHdlIGFyZSBpbiBhIGNhbGxiYWNrIGNhbGxlZCBieSB0aGUgQXVkaW9SZXNhbXBsZXIgaXRzZWxmLiBTbwotICAgICAgICAgICAgICAgIC8vIGp1c3QgcmVtZW1iZXIgdGhlIGZhY3QgdGhhdCB0aGUgZm9ybWF0IGhhcyBjaGFuZ2VkLCBhbmQgbGV0Ci0gICAgICAgICAgICAgICAgLy8gcmVhZCgpIGhhbmRsZXMgdGhpcy4KLSAgICAgICAgICAgICAgICBtRm9ybWF0Q2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRU9TIG9yIHNvbWUgb3RoZXIgZXJyb3IKLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiRU9TIG9yIHNvbWUgZXJyOiAlZCIsIGVycik7Ci0gICAgICAgICAgICAgICAgLy8gV2UgY2Fubm90IGNhbGwgc3RvcCgpIGhlcmUgYmVjYXVzZSBzdG9wKCkgd2lsbCByZWxlYXNlIHRoZQotICAgICAgICAgICAgICAgIC8vIEF1ZGlvUmVzYW1wbGVyLCBhbmQgd2UgYXJlIGluIGEgY2FsbGJhY2sgb2YgdGhlIEF1ZGlvUmVzYW1wbGVyLgotICAgICAgICAgICAgICAgIC8vIFNvIGp1c3QgcmVtZW1iZXIgdGhlIGZhY3QgYW5kIGxldCByZWFkKCkgY2FsbCBzdG9wKCkuCi0gICAgICAgICAgICAgICAgbVN0b3BQZW5kaW5nID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDSEVDSyhtQnVmZmVyKTsKLSAgICAgICAgICAgIG1MZWZ0b3ZlciA9IG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpOwotICAgICAgICAgICAgaWYgKG1Jbml0aWFsVGltZVN0YW1wVXMgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBpbnQ2NF90IGN1clRTOwotICAgICAgICAgICAgICAgIHNwPE1ldGFEYXRhPiBmcm9tID0gbUJ1ZmZlci0+bWV0YV9kYXRhKCk7Ci0gICAgICAgICAgICAgICAgZnJvbS0+ZmluZEludDY0KGtLZXlUaW1lLCAmY3VyVFMpOwotICAgICAgICAgICAgICAgIEFMT0dWKCJzZXR0aW5nIG1Jbml0aWFsVGltZVN0YW1wVXMgdG8gJWxsZCIsIG1Jbml0aWFsVGltZVN0YW1wVXMpOwotICAgICAgICAgICAgICAgIG1Jbml0aWFsVGltZVN0YW1wVXMgPSBjdXJUUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vdyBjb3B5IGRhdGEgdG8gdGhlIGRlc3RpbmF0aW9uCi0gICAgICAgIHVpbnQzMl90IHRvZG8gPSBtTGVmdG92ZXI7Ci0gICAgICAgIGlmICh0b2RvID4gd2FudCkgewotICAgICAgICAgICAgdG9kbyA9IHdhbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICB1aW50OF90KiBlbmQgPSAodWludDhfdCopbUJ1ZmZlci0+ZGF0YSgpICsgbUJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkKLSAgICAgICAgICAgICAgICArIG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpOwotICAgICAgICBtZW1jcHkoKHVpbnQ4X3QqKXBCdWZmZXItPnJhdyArIGRvbmUsIGVuZCAtIG1MZWZ0b3ZlciwgdG9kbyk7Ci0gICAgICAgIGRvbmUgKz0gdG9kbzsKLSAgICAgICAgd2FudCAtPSB0b2RvOwotICAgICAgICBtTGVmdG92ZXIgLT0gdG9kbzsKLQotICAgICAgICAvLyBSZWxlYXNlIE1lZGlhQnVmZmVyIGFzIHNvb24gYXMgcG9zc2libGUuCi0gICAgICAgIGlmIChtTGVmdG92ZXIgPT0gMCkgewotICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwQnVmZmVyLT5mcmFtZUNvdW50ID0gZG9uZSAvIChtQ2hhbm5lbENudCAqIDIpOwotICAgIEFMT0dWKCJnZXROZXh0QnVmZmVyIGRvbmUgJWQiLCBwQnVmZmVyLT5mcmFtZUNvdW50KTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLQotdm9pZCBWaWRlb0VkaXRvclNSQzo6cmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgKnBCdWZmZXIpIHsKLSAgICBBTE9HVigicmVsZWFzZUJ1ZmZlcjogJXAiLCBwQnVmZmVycyk7Ci0gICAgZnJlZShwQnVmZmVyLT5yYXcpOwotICAgIHBCdWZmZXItPnJhdyA9IE5VTEw7Ci0gICAgcEJ1ZmZlci0+ZnJhbWVDb3VudCA9IDA7Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JTUkM6OmNoZWNrQW5kU2V0UmVzYW1wbGVyKCkgewotICAgIEFMT0dWKCJjaGVja0FuZFNldFJlc2FtcGxlciIpOwotCi0gICAgc3RhdGljIGNvbnN0IHVpbnQxNl90IGtVbml0eUdhaW4gPSAweDEwMDA7Ci0gICAgc3A8TWV0YURhdGE+IGZvcm1hdCA9IG1Tb3VyY2UtPmdldEZvcm1hdCgpOwotICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgQ0hFQ0soZm9ybWF0LT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7Ci0gICAgQ0hFQ0soIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSk7Ci0KLSAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJm1TYW1wbGVSYXRlKSk7Ci0gICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm1DaGFubmVsQ250KSk7Ci0KLSAgICAvLyBJZiBhIHJlc2FtcGxlciBleGlzdHMsIGRlbGV0ZSBpdCBmaXJzdAotICAgIGlmIChtUmVzYW1wbGVyICE9IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIG1SZXNhbXBsZXI7Ci0gICAgICAgIG1SZXNhbXBsZXIgPSBOVUxMOwotICAgIH0KLQotICAgIC8vIENsZWFyIHByZXZpb3VzIGJ1ZmZlcgotICAgIGlmIChtQnVmZmVyKSB7Ci0gICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKG1TYW1wbGVSYXRlICE9IG1PdXRwdXRTYW1wbGVSYXRlIHx8IG1DaGFubmVsQ250ICE9IDIpIHsKLSAgICAgICAgQUxPR1YoIlJlc2FtcGxpbmcgcmVxdWlyZWQgKCVkID0+ICVkIEh6LCAjIGNoYW5uZWxzID0gJWQpIiwKLSAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBtT3V0cHV0U2FtcGxlUmF0ZSwgbUNoYW5uZWxDbnQpOwotCi0gICAgICAgIG1SZXNhbXBsZXIgPSBBdWRpb1Jlc2FtcGxlcjo6Y3JlYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgMTYgLyogYml0IGRlcHRoICovLAotICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0U2FtcGxlUmF0ZSk7Ci0gICAgICAgIENIRUNLKG1SZXNhbXBsZXIpOwotICAgICAgICBtUmVzYW1wbGVyLT5zZXRTYW1wbGVSYXRlKG1TYW1wbGVSYXRlKTsKLSAgICAgICAgbVJlc2FtcGxlci0+c2V0Vm9sdW1lKGtVbml0eUdhaW4sIGtVbml0eUdhaW4pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJSZXNhbXBsaW5nIG5vdCByZXF1aXJlZCAoJWQgPT4gJWQgSHosICMgY2hhbm5lbHMgPSAlZCkiLAotICAgICAgICAgICAgbVNhbXBsZVJhdGUsIG1PdXRwdXRTYW1wbGVSYXRlLCBtQ2hhbm5lbENudCk7Ci0gICAgfQotfQotCi19IC8vbmFtZXNwY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclNSQy5oIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclNSQy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNzA3ZDRkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JTUkMuaAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KLSNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBNZWRpYUJ1ZmZlcjsKLQotY2xhc3MgVmlkZW9FZGl0b3JTUkMgOiBwdWJsaWMgTWVkaWFTb3VyY2UgLCBwdWJsaWMgQXVkaW9CdWZmZXJQcm92aWRlciB7Ci0KLXB1YmxpYzoKLSAgICBWaWRlb0VkaXRvclNSQyhjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0IChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkICgKLSAgICAgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dEJ1ZmZlcihCdWZmZXIqIGJ1ZmZlciwgaW50NjRfdCBwdHMpOwotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlQnVmZmVyKEJ1ZmZlciogYnVmZmVyKTsKLQotICAgIC8vIFNhbXBsaW5nIGZyZXFlbmNpZXMKLSAgICBlbnVtIHsKLSAgICAgICAga0ZyZXE4MDAwSHogID0gODAwMCwKLSAgICAgICAga0ZyZXExMTAyNUh6ID0gMTEwMjUsCi0gICAgICAgIGtGcmVxMTIwMDBIeiA9IDEyMDAwLAotICAgICAgICBrRnJlcTE2MDAwSHogPSAxNjAwMCwKLSAgICAgICAga0ZyZXEyMjA1MEh6ID0gMjIwNTAsCi0gICAgICAgIGtGcmVxMjQwMDBIeiA9IDI0MDAwLAotICAgICAgICBrRnJlcTMyMDAwSHogPSAzMjAwMCwKLSAgICAgICAga0ZyZXE0NDEwMEh6ID0gNDQxMDAsCi0gICAgICAgIGtGcmVxNDgwMDBIeiA9IDQ4MDAwLAotICAgIH07Ci0KLXByb3RlY3RlZCA6Ci0gICAgdmlydHVhbCB+VmlkZW9FZGl0b3JTUkMoKTsKLQotcHJpdmF0ZToKLSAgICBBdWRpb1Jlc2FtcGxlciAqbVJlc2FtcGxlcjsKLSAgICBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKLSAgICBpbnQgbUNoYW5uZWxDbnQ7Ci0gICAgaW50IG1TYW1wbGVSYXRlOwotICAgIGludDMyX3QgbU91dHB1dFNhbXBsZVJhdGU7Ci0gICAgYm9vbCBtU3RhcnRlZDsKLSAgICBzcDxNZXRhRGF0YT4gbU91dHB1dEZvcm1hdDsKLQotICAgIE1lZGlhQnVmZmVyKiBtQnVmZmVyOwotICAgIGludDMyX3QgbUxlZnRvdmVyOwotICAgIGJvb2wgbUZvcm1hdENoYW5nZWQ7Ci0gICAgYm9vbCBtU3RvcFBlbmRpbmc7Ci0KLSAgICBpbnQ2NF90IG1Jbml0aWFsVGltZVN0YW1wVXM7Ci0gICAgaW50NjRfdCBtQWNjdU91dEJ1ZmZlclNpemU7Ci0KLSAgICBpbnQ2NF90IG1TZWVrVGltZVVzOwotICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtU2Vla01vZGU7Ci0KLSAgICBWaWRlb0VkaXRvclNSQygpOwotICAgIHZvaWQgY2hlY2tBbmRTZXRSZXNhbXBsZXIoKTsKLQotICAgIC8vIERvbid0IGNhbGwgbWUKLSAgICBWaWRlb0VkaXRvclNSQyhjb25zdCBWaWRlb0VkaXRvclNSQyYpOwotICAgIFZpZGVvRWRpdG9yU1JDICZvcGVyYXRvcj0oY29uc3QgVmlkZW9FZGl0b3JTUkMgJik7Ci0KLX07Ci0KLX0gLy9uYW1lc3BjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JUb29scy5jcHAgYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yVG9vbHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYjlmZDYwLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JUb29scy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzODgzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JUb29scy5oIgotI2luY2x1ZGUgIlByZXZpZXdSZW5kZXJlci5oIgotLyorIEhhbmRsZSB0aGUgaW1hZ2UgZmlsZXMgaGVyZSAqLwotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotLyotIEhhbmRsZSB0aGUgaW1hZ2UgZmlsZXMgaGVyZSAqLwotCi1jb25zdCBNNFZJRklfVUludDggICBNNFZJRklfQ2xpcFRhYmxlWzEyNTZdCi09IHsKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywKLTB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsCi0weDBjLCAweDBkLCAweDBlLCAweDBmLCAweDEwLCAweDExLCAweDEyLCAweDEzLAotMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwKLTB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIDB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsCi0weDI0LCAweDI1LCAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJhLCAweDJiLAotMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywKLTB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsIDB4MzksIDB4M2EsIDB4M2IsCi0weDNjLCAweDNkLCAweDNlLCAweDNmLCAweDQwLCAweDQxLCAweDQyLCAweDQzLAotMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwKLTB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIDB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsCi0weDU0LCAweDU1LCAweDU2LCAweDU3LCAweDU4LCAweDU5LCAweDVhLCAweDViLAotMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywKLTB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIDB4NjgsIDB4NjksIDB4NmEsIDB4NmIsCi0weDZjLCAweDZkLCAweDZlLCAweDZmLCAweDcwLCAweDcxLCAweDcyLCAweDczLAotMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwKLTB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIDB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsCi0weDg0LCAweDg1LCAweDg2LCAweDg3LCAweDg4LCAweDg5LCAweDhhLCAweDhiLAotMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywKLTB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIDB4OTgsIDB4OTksIDB4OWEsIDB4OWIsCi0weDljLCAweDlkLCAweDllLCAweDlmLCAweGEwLCAweGExLCAweGEyLCAweGEzLAotMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwKLTB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIDB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsCi0weGI0LCAweGI1LCAweGI2LCAweGI3LCAweGI4LCAweGI5LCAweGJhLCAweGJiLAotMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywKLTB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIDB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsCi0weGNjLCAweGNkLCAweGNlLCAweGNmLCAweGQwLCAweGQxLCAweGQyLCAweGQzLAotMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwKLTB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIDB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsCi0weGU0LCAweGU1LCAweGU2LCAweGU3LCAweGU4LCAweGU5LCAweGVhLCAweGViLAotMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywKLTB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIDB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsCi0weGZjLCAweGZkLCAweGZlLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYKLX07Ci0KLS8qIERpdmlzaW9uIHRhYmxlIGZvciAoIDY1NTM1L3ggKTsgeCA9IDAgdG8gNTEyICovCi1jb25zdCBNNFZJRklfVUludDE2ICBNNFZJRklfRGl2VGFibGVbNTEyXQotPSB7Ci0wLCA2NTUzNSwgMzI3NjgsIDIxODQ1LCAxNjM4NCwgMTMxMDcsIDEwOTIyLCA5MzYyLAotODE5MiwgNzI4MSwgNjU1MywgNTk1NywgNTQ2MSwgNTA0MSwgNDY4MSwgNDM2OSwKLTQwOTYsIDM4NTUsIDM2NDAsIDM0NDksIDMyNzYsIDMxMjAsIDI5NzgsIDI4NDksCi0yNzMwLCAyNjIxLCAyNTIwLCAyNDI3LCAyMzQwLCAyMjU5LCAyMTg0LCAyMTE0LAotMjA0OCwgMTk4NSwgMTkyNywgMTg3MiwgMTgyMCwgMTc3MSwgMTcyNCwgMTY4MCwKLTE2MzgsIDE1OTgsIDE1NjAsIDE1MjQsIDE0ODksIDE0NTYsIDE0MjQsIDEzOTQsCi0xMzY1LCAxMzM3LCAxMzEwLCAxMjg1LCAxMjYwLCAxMjM2LCAxMjEzLCAxMTkxLAotMTE3MCwgMTE0OSwgMTEyOSwgMTExMCwgMTA5MiwgMTA3NCwgMTA1NywgMTA0MCwKLTEwMjQsIDEwMDgsIDk5MiwgOTc4LCA5NjMsIDk0OSwgOTM2LCA5MjMsCi05MTAsIDg5NywgODg1LCA4NzMsIDg2MiwgODUxLCA4NDAsIDgyOSwKLTgxOSwgODA5LCA3OTksIDc4OSwgNzgwLCA3NzEsIDc2MiwgNzUzLAotNzQ0LCA3MzYsIDcyOCwgNzIwLCA3MTIsIDcwNCwgNjk3LCA2ODksCi02ODIsIDY3NSwgNjY4LCA2NjEsIDY1NSwgNjQ4LCA2NDIsIDYzNiwKLTYzMCwgNjI0LCA2MTgsIDYxMiwgNjA2LCA2MDEsIDU5NSwgNTkwLAotNTg1LCA1NzksIDU3NCwgNTY5LCA1NjQsIDU2MCwgNTU1LCA1NTAsCi01NDYsIDU0MSwgNTM3LCA1MzIsIDUyOCwgNTI0LCA1MjAsIDUxNiwKLTUxMiwgNTA4LCA1MDQsIDUwMCwgNDk2LCA0OTIsIDQ4OSwgNDg1LAotNDgxLCA0NzgsIDQ3NCwgNDcxLCA0NjgsIDQ2NCwgNDYxLCA0NTgsCi00NTUsIDQ1MSwgNDQ4LCA0NDUsIDQ0MiwgNDM5LCA0MzYsIDQzNCwKLTQzMSwgNDI4LCA0MjUsIDQyMiwgNDIwLCA0MTcsIDQxNCwgNDEyLAotNDA5LCA0MDcsIDQwNCwgNDAyLCAzOTksIDM5NywgMzk0LCAzOTIsCi0zOTAsIDM4NywgMzg1LCAzODMsIDM4MSwgMzc4LCAzNzYsIDM3NCwKLTM3MiwgMzcwLCAzNjgsIDM2NiwgMzY0LCAzNjIsIDM2MCwgMzU4LAotMzU2LCAzNTQsIDM1MiwgMzUwLCAzNDgsIDM0NiwgMzQ0LCAzNDMsCi0zNDEsIDMzOSwgMzM3LCAzMzYsIDMzNCwgMzMyLCAzMzAsIDMyOSwKLTMyNywgMzI2LCAzMjQsIDMyMiwgMzIxLCAzMTksIDMxOCwgMzE2LAotMzE1LCAzMTMsIDMxMiwgMzEwLCAzMDksIDMwNywgMzA2LCAzMDQsCi0zMDMsIDMwMiwgMzAwLCAyOTksIDI5NywgMjk2LCAyOTUsIDI5MywKLTI5MiwgMjkxLCAyODksIDI4OCwgMjg3LCAyODYsIDI4NCwgMjgzLAotMjgyLCAyODEsIDI4MCwgMjc4LCAyNzcsIDI3NiwgMjc1LCAyNzQsCi0yNzMsIDI3MSwgMjcwLCAyNjksIDI2OCwgMjY3LCAyNjYsIDI2NSwKLTI2NCwgMjYzLCAyNjIsIDI2MSwgMjYwLCAyNTksIDI1OCwgMjU3LAotMjU2LCAyNTUsIDI1NCwgMjUzLCAyNTIsIDI1MSwgMjUwLCAyNDksCi0yNDgsIDI0NywgMjQ2LCAyNDUsIDI0NCwgMjQzLCAyNDIsIDI0MSwKLTI0MCwgMjQwLCAyMzksIDIzOCwgMjM3LCAyMzYsIDIzNSwgMjM0LAotMjM0LCAyMzMsIDIzMiwgMjMxLCAyMzAsIDIyOSwgMjI5LCAyMjgsCi0yMjcsIDIyNiwgMjI1LCAyMjUsIDIyNCwgMjIzLCAyMjIsIDIyMiwKLTIyMSwgMjIwLCAyMTksIDIxOSwgMjE4LCAyMTcsIDIxNywgMjE2LAotMjE1LCAyMTQsIDIxNCwgMjEzLCAyMTIsIDIxMiwgMjExLCAyMTAsCi0yMTAsIDIwOSwgMjA4LCAyMDgsIDIwNywgMjA2LCAyMDYsIDIwNSwKLTIwNCwgMjA0LCAyMDMsIDIwMiwgMjAyLCAyMDEsIDIwMSwgMjAwLAotMTk5LCAxOTksIDE5OCwgMTk3LCAxOTcsIDE5NiwgMTk2LCAxOTUsCi0xOTUsIDE5NCwgMTkzLCAxOTMsIDE5MiwgMTkyLCAxOTEsIDE5MSwKLTE5MCwgMTg5LCAxODksIDE4OCwgMTg4LCAxODcsIDE4NywgMTg2LAotMTg2LCAxODUsIDE4NSwgMTg0LCAxODQsIDE4MywgMTgzLCAxODIsCi0xODIsIDE4MSwgMTgxLCAxODAsIDE4MCwgMTc5LCAxNzksIDE3OCwKLTE3OCwgMTc3LCAxNzcsIDE3NiwgMTc2LCAxNzUsIDE3NSwgMTc0LAotMTc0LCAxNzMsIDE3MywgMTcyLCAxNzIsIDE3MiwgMTcxLCAxNzEsCi0xNzAsIDE3MCwgMTY5LCAxNjksIDE2OCwgMTY4LCAxNjgsIDE2NywKLTE2NywgMTY2LCAxNjYsIDE2NSwgMTY1LCAxNjUsIDE2NCwgMTY0LAotMTYzLCAxNjMsIDE2MywgMTYyLCAxNjIsIDE2MSwgMTYxLCAxNjEsCi0xNjAsIDE2MCwgMTU5LCAxNTksIDE1OSwgMTU4LCAxNTgsIDE1NywKLTE1NywgMTU3LCAxNTYsIDE1NiwgMTU2LCAxNTUsIDE1NSwgMTU0LAotMTU0LCAxNTQsIDE1MywgMTUzLCAxNTMsIDE1MiwgMTUyLCAxNTIsCi0xNTEsIDE1MSwgMTUxLCAxNTAsIDE1MCwgMTQ5LCAxNDksIDE0OSwKLTE0OCwgMTQ4LCAxNDgsIDE0NywgMTQ3LCAxNDcsIDE0NiwgMTQ2LAotMTQ2LCAxNDUsIDE0NSwgMTQ1LCAxNDQsIDE0NCwgMTQ0LCAxNDQsCi0xNDMsIDE0MywgMTQzLCAxNDIsIDE0MiwgMTQyLCAxNDEsIDE0MSwKLTE0MSwgMTQwLCAxNDAsIDE0MCwgMTQwLCAxMzksIDEzOSwgMTM5LAotMTM4LCAxMzgsIDEzOCwgMTM3LCAxMzcsIDEzNywgMTM3LCAxMzYsCi0xMzYsIDEzNiwgMTM1LCAxMzUsIDEzNSwgMTM1LCAxMzQsIDEzNCwKLTEzNCwgMTM0LCAxMzMsIDEzMywgMTMzLCAxMzIsIDEzMiwgMTMyLAotMTMyLCAxMzEsIDEzMSwgMTMxLCAxMzEsIDEzMCwgMTMwLCAxMzAsCi0xMzAsIDEyOSwgMTI5LCAxMjksIDEyOSwgMTI4LCAxMjgsIDEyOAotfTsKLQotY29uc3QgTTRWSUZJX0ludDMyICBjb25zdF9zdG9yYWdlMVs4XQotPSB7Ci0weDAwMDAyNTY4LCAweDAwMDAzMzQzLDB4MDAwMDA2NDksMHgwMDAwMGQwZiwgMHgwMDAwRDg2QywgMHgwMDAwRDgzQiwgMHgwMDAxMDAwMCwgMHgwMDAxMDAwMAotfTsKLQotY29uc3QgTTRWSUZJX0ludDMyICBjb25zdF9zdG9yYWdlWzhdCi09IHsKLTB4MDAwMDI1NjgsIDB4MDAwMDMzNDMsIDB4MUJGODAwLCAweDAwMDAwNjQ5LCAweDAwMDAwZDBmLCAweDExMDE4MCwgMHg0MGNmLCAweDIyQkUwMAotfTsKLQotCi1jb25zdCBNNFZJRklfVUludDE2ICAqTTRWSUZJX0RpdlRhYmxlX3plcm8KLSA9ICZNNFZJRklfRGl2VGFibGVbMF07Ci0KLWNvbnN0IE00VklGSV9VSW50OCAgICpNNFZJRklfQ2xpcFRhYmxlX3plcm8KLSA9ICZNNFZJRklfQ2xpcFRhYmxlWzUwMF07Ci0KLU00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwUGxhbmFyVG9ZVVY0MjBTZW1pcGxhbmFyKHZvaWQgKnVzZXJfZGF0YSwKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0ICkgewotCi0gICAgTTRWSUZJX1VJbnQzMiBpOwotICAgIE00VklGSV9VSW50OCAqcF9idWZfc3JjLCAqcF9idWZfZGVzdCwgKnBfYnVmX3NyY191LCAqcF9idWZfc3JjX3Y7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgIHJldHVybl9jb2RlID0gTTRWSUZJX09LOwotCi0gICAgLyogdGhlIGZpbHRlciBpcyBpbXBsZW1lbnRlZCB3aXRoIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIHdpZHRoIGlzIGVxdWFsIHRvIHN0cmlkZSAqLwotICAgIGlmKFBsYW5lSW5bMF0udV93aWR0aCAhPSBQbGFuZUluWzBdLnVfc3RyaWRlKQotICAgICAgICByZXR1cm4gTTRWSUZJX0lOVkFMSURfUEFSQU07Ci0KLSAgICAvKiBUaGUgaW5wdXQgWSBQbGFuZSBpcyB0aGUgc2FtZSBhcyB0aGUgb3V0cHV0IFkgUGxhbmUgKi8KLSAgICBwX2J1Zl9zcmMgPSAmKFBsYW5lSW5bMF0ucGFjX2RhdGFbUGxhbmVJblswXS51X3RvcGxlZnRdKTsKLSAgICBwX2J1Zl9kZXN0ID0gJihQbGFuZU91dFswXS5wYWNfZGF0YVtQbGFuZU91dFswXS51X3RvcGxlZnRdKTsKLSAgICBtZW1jcHkoKHZvaWQgKilwX2J1Zl9kZXN0LCh2b2lkICopcF9idWZfc3JjICwKLSAgICAgICAgUGxhbmVPdXRbMF0udV93aWR0aCAqIFBsYW5lT3V0WzBdLnVfaGVpZ2h0KTsKLQotICAgIC8qIFRoZSBVIGFuZCBWIGNvbXBvbmVudHMgYXJlIHBsYW5hci4gVGhlIG5lZWQgdG8gYmUgbWFkZSBpbnRlcmxlYXZlZCAqLwotICAgIHBfYnVmX3NyY191ID0gJihQbGFuZUluWzFdLnBhY19kYXRhW1BsYW5lSW5bMV0udV90b3BsZWZ0XSk7Ci0gICAgcF9idWZfc3JjX3YgPSAmKFBsYW5lSW5bMl0ucGFjX2RhdGFbUGxhbmVJblsyXS51X3RvcGxlZnRdKTsKLSAgICBwX2J1Zl9kZXN0ICA9ICYoUGxhbmVPdXRbMV0ucGFjX2RhdGFbUGxhbmVPdXRbMV0udV90b3BsZWZ0XSk7Ci0KLSAgICBmb3IoaSA9IDA7IGkgPCBQbGFuZU91dFsxXS51X3dpZHRoKlBsYW5lT3V0WzFdLnVfaGVpZ2h0OyBpKyspCi0gICAgewotICAgICAgICAqcF9idWZfZGVzdCsrID0gKnBfYnVmX3NyY191Kys7Ci0gICAgICAgICpwX2J1Zl9kZXN0KysgPSAqcF9idWZfc3JjX3YrKzsKLSAgICB9Ci0gICAgcmV0dXJuIHJldHVybl9jb2RlOwotfQotCi1NNFZJRklfVUludDggTTRWSUZJX1NlbWlwbGFuYXJZVVY0MjB0b1lVVjQyMCh2b2lkICp1c2VyX2RhdGEsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCApIHsKLQotICAgICBNNFZJRklfVUludDMyIGk7Ci0gICAgIE00VklGSV9VSW50OCAqcF9idWZfc3JjLCAqcF9idWZfZGVzdCwgKnBfYnVmX3NyY191LCAqcF9idWZfc3JjX3Y7Ci0gICAgIE00VklGSV9VSW50OCAqcF9idWZfZGVzdF91LCpwX2J1Zl9kZXN0X3YsKnBfYnVmX3NyY191djsKLSAgICAgTTRWSUZJX1VJbnQ4ICAgICByZXR1cm5fY29kZSA9IE00VklGSV9PSzsKLQotICAgICAvKiB0aGUgZmlsdGVyIGlzIGltcGxlbWVudGVkIHdpdGggdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgd2lkdGggaXMgZXF1YWwgdG8gc3RyaWRlICovCi0gICAgIGlmKFBsYW5lSW5bMF0udV93aWR0aCAhPSBQbGFuZUluWzBdLnVfc3RyaWRlKQotICAgICAgICByZXR1cm4gTTRWSUZJX0lOVkFMSURfUEFSQU07Ci0KLSAgICAgLyogVGhlIGlucHV0IFkgUGxhbmUgaXMgdGhlIHNhbWUgYXMgdGhlIG91dHB1dCBZIFBsYW5lICovCi0gICAgIHBfYnVmX3NyYyA9ICYoUGxhbmVJblswXS5wYWNfZGF0YVtQbGFuZUluWzBdLnVfdG9wbGVmdF0pOwotICAgICBwX2J1Zl9kZXN0ID0gJihQbGFuZU91dFswXS5wYWNfZGF0YVtQbGFuZU91dFswXS51X3RvcGxlZnRdKTsKLSAgICAgbWVtY3B5KCh2b2lkICopcF9idWZfZGVzdCwodm9pZCAqKXBfYnVmX3NyYyAsCi0gICAgICAgICBQbGFuZU91dFswXS51X3dpZHRoICogUGxhbmVPdXRbMF0udV9oZWlnaHQpOwotCi0gICAgIC8qIFRoZSBVIGFuZCBWIGNvbXBvbmVudHMgYXJlIHBsYW5hci4gVGhlIG5lZWQgdG8gYmUgbWFkZSBpbnRlcmxlYXZlZCAqLwotICAgICBwX2J1Zl9zcmNfdXYgPSAmKFBsYW5lSW5bMV0ucGFjX2RhdGFbUGxhbmVJblsxXS51X3RvcGxlZnRdKTsKLSAgICAgcF9idWZfZGVzdF91ICA9ICYoUGxhbmVPdXRbMV0ucGFjX2RhdGFbUGxhbmVPdXRbMV0udV90b3BsZWZ0XSk7Ci0gICAgIHBfYnVmX2Rlc3RfdiAgPSAmKFBsYW5lT3V0WzJdLnBhY19kYXRhW1BsYW5lT3V0WzJdLnVfdG9wbGVmdF0pOwotCi0gICAgIGZvcihpID0gMDsgaSA8IFBsYW5lT3V0WzFdLnVfd2lkdGgqUGxhbmVPdXRbMV0udV9oZWlnaHQ7IGkrKykKLSAgICAgewotICAgICAgICAqcF9idWZfZGVzdF91KysgPSAqcF9idWZfc3JjX3V2Kys7Ci0gICAgICAgICpwX2J1Zl9kZXN0X3YrKyA9ICpwX2J1Zl9zcmNfdXYrKzsKLSAgICAgfQotICAgICByZXR1cm4gcmV0dXJuX2NvZGU7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RDb2xvcihNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aUVmZmVjdEtpbmQpCi0gKgotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiBhcHBseSBhIGNvbG9yIGVmZmVjdCBvbiBhbiBpbnB1dCBZVVY0MjAgcGxhbmFyIGZyYW1lCi0gKiBAbm90ZQotICogQHBhcmFtICAgcEZ1bmN0aW9uQ29udGV4dChJTikgQ29udGFpbnMgd2hpY2ggY29sb3IgdG8gYXBwbHkgKG5vdCB2ZXJ5IGNsZWFuIC4uLikKLSAqIEBwYXJhbSAgIFBsYW5lSW4gICAgICAgICAoSU4pIElucHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgIFBsYW5lT3V0ICAgICAgICAoSU4vT1VUKSBPdXRwdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgcFByb2dyZXNzICAgICAgIChJTi9PVVQpIFByb2dyZXNzIGluZGljYXRpb24gKDAtMTAwKQotICogQHBhcmFtICAgdWlFZmZlY3RLaW5kICAgIChJTikgVW51c2VkCi0gKgotICogQHJldHVybiAgTTRWSUZJX09LOiAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RDb2xvcihNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsIE00T1NBX1VJbnQzMiB1aUVmZmVjdEtpbmQpIHsKLQotICAgIE00VklGSV9JbnQzMiBwbGFuZV9udW1iZXI7Ci0gICAgTTRWSUZJX1VJbnQzMiBpLGo7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2J1Zl9zcmMsICpwX2J1Zl9kZXN0OwotICAgIE00eFZTU19Db2xvclN0cnVjdCogQ29sb3JDb250ZXh0ID0gKE00eFZTU19Db2xvclN0cnVjdCopcEZ1bmN0aW9uQ29udGV4dDsKLQotICAgIGZvciAocGxhbmVfbnVtYmVyID0gMDsgcGxhbmVfbnVtYmVyIDwgMzsgcGxhbmVfbnVtYmVyKyspCi0gICAgewotICAgICAgICBwX2J1Zl9zcmMgPQotICAgICAgICAgJihQbGFuZUluW3BsYW5lX251bWJlcl0ucGFjX2RhdGFbUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfdG9wbGVmdF0pOwotCi0gICAgICAgIHBfYnVmX2Rlc3QgPQotICAgICAgICAgJihQbGFuZU91dFtwbGFuZV9udW1iZXJdLnBhY19kYXRhW1BsYW5lT3V0W3BsYW5lX251bWJlcl0udV90b3BsZWZ0XSk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfaGVpZ2h0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQ2hyb21pbmFuY2UgKi8KLSAgICAgICAgICAgIGlmKHBsYW5lX251bWJlcj09MSB8fCBwbGFuZV9udW1iZXI9PTIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy9zd2l0Y2ggKChNNE9TQV9VSW50MzIpcEZ1bmN0aW9uQ29udGV4dCkgLy8gY29tbWVudGVkIGJlY2F1c2UgYSBzdHJ1Y3R1cmUgZm9yIHRoZSBlZmZlY3RzIGNvbnRleHQgZXhpc3QKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKENvbG9yQ29udGV4dC0+Y29sb3JFZmZlY3RUeXBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0JsYWNrQW5kV2hpdGU6Ci0gICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsMTI4LAotICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1Bpbms6Ci0gICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsMjU1LAotICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyZWVuOgotICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2J1Zl9kZXN0LDAsCi0gICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfU2VwaWE6Ci0gICAgICAgICAgICAgICAgICAgIGlmKHBsYW5lX251bWJlcj09MSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwxMTcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwxMzksCi0gICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfTmVnYXRpdmU6Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfYnVmX2Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBfYnVmX3NyYyAsUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0NvbG9yUkdCMTY6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiByID0gMCxnID0gMCxiID0gMCx5ID0gMCx1ID0gMCx2ID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLypmaXJzdCBnZXQgdGhlIHIsIGcsIGIqLwotICAgICAgICAgICAgICAgICAgICAgICAgYiA9IChDb2xvckNvbnRleHQtPnJnYjE2Q29sb3JEYXRhICYgIDB4MDAxZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnID0gKENvbG9yQ29udGV4dC0+cmdiMTZDb2xvckRhdGEgJiAgMHgwN2UwKT4+NTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHIgPSAoQ29sb3JDb250ZXh0LT5yZ2IxNkNvbG9yRGF0YSAmICAweGY4MDApPj4xMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyprZWVwIHksIGJ1dCByZXBsYWNlIHUgYW5kIHYqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYocGxhbmVfbnVtYmVyPT0xKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdGhlbiBjb252ZXJ0IHRvIHUqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgPSBVMTYociwgZywgYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwoTTRPU0FfVUludDgpdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYocGxhbmVfbnVtYmVyPT0yKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdGhlbiBjb252ZXJ0IHRvIHYqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBWMTYociwgZywgYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwoTTRPU0FfVUludDgpdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JhZGllbnQ6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiByID0gMCxnID0gMCxiID0gMCx5ID0gMCx1ID0gMCx2ID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLypmaXJzdCBnZXQgdGhlIHIsIGcsIGIqLwotICAgICAgICAgICAgICAgICAgICAgICAgYiA9IChDb2xvckNvbnRleHQtPnJnYjE2Q29sb3JEYXRhICYgIDB4MDAxZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnID0gKENvbG9yQ29udGV4dC0+cmdiMTZDb2xvckRhdGEgJiAgMHgwN2UwKT4+NTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHIgPSAoQ29sb3JDb250ZXh0LT5yZ2IxNkNvbG9yRGF0YSAmICAweGY4MDApPj4xMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLypmb3IgY29sb3IgZ3JhZGF0aW9uKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAoTTRPU0FfVUludDE2KSggYiAtICgoYippKS9QbGFuZUluW3BsYW5lX251bWJlcl0udV9oZWlnaHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGcgPSAoTTRPU0FfVUludDE2KShnIC0gKChnKmkpL1BsYW5lSW5bcGxhbmVfbnVtYmVyXS51X2hlaWdodCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgciA9IChNNE9TQV9VSW50MTYpKHIgLSAoKHIqaSkvUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfaGVpZ2h0KSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qa2VlcCB5LCBidXQgcmVwbGFjZSB1IGFuZCB2Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBsYW5lX251bWJlcj09MSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRoZW4gY29udmVydCB0byB1Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ID0gVTE2KHIsIGcsIGIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsKE00T1NBX1VJbnQ4KXUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBsYW5lX251bWJlcj09MikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRoZW4gY29udmVydCB0byB2Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gVjE2KHIsIGcsIGIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsKE00T1NBX1VJbnQ4KXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWSUZJX0lOVkFMSURfUEFSQU07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBMdW1pbmFuY2UgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL3N3aXRjaCAoKE00T1NBX1VJbnQzMilwRnVuY3Rpb25Db250ZXh0KS8vIGNvbW1lbnRlZCBiZWNhdXNlIGEgc3RydWN0dXJlIGZvciB0aGUgZWZmZWN0cyBjb250ZXh0IGV4aXN0Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChDb2xvckNvbnRleHQtPmNvbG9yRWZmZWN0VHlwZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9OZWdhdGl2ZToKLSAgICAgICAgICAgICAgICAgICAgZm9yKGo9MDtqPFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aDtqKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zl9kZXN0W2pdID0gMjU1IC0gcF9idWZfc3JjW2pdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfYnVmX2Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBfYnVmX3NyYyAsUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcF9idWZfc3JjICs9IFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3N0cmlkZTsKLSAgICAgICAgICAgIHBfYnVmX2Rlc3QgKz0gUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3N0cmlkZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RnJhbWluZyhNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aUVmZmVjdEtpbmQpCi0gKgotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiBhZGQgYSBmaXhlZCBvciBhbmltYXRlZCBpbWFnZSBvbiBhbiBpbnB1dCBZVVY0MjAgcGxhbmFyIGZyYW1lCi0gKiBAbm90ZQotICogQHBhcmFtICAgcEZ1bmN0aW9uQ29udGV4dChJTikgQ29udGFpbnMgd2hpY2ggY29sb3IgdG8gYXBwbHkgKG5vdCB2ZXJ5IGNsZWFuIC4uLikKLSAqIEBwYXJhbSAgIFBsYW5lSW4gICAgICAgICAoSU4pIElucHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgIFBsYW5lT3V0ICAgICAgICAoSU4vT1VUKSBPdXRwdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgcFByb2dyZXNzICAgICAgIChJTi9PVVQpIFByb2dyZXNzIGluZGljYXRpb24gKDAtMTAwKQotICogQHBhcmFtICAgdWlFZmZlY3RLaW5kICAgIChJTikgVW51c2VkCi0gKgotICogQHJldHVybiAgTTRWSUZJX09LOiAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGcmFtaW5nKAotICAgICAgICAgICAgTTRPU0FfVm9pZCAqdXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW5bM10sCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kICkgewotCi0gICAgTTRWSUZJX1VJbnQzMiB4LHk7Ci0KLSAgICBNNFZJRklfVUludDggKnBfaW5fWSA9IFBsYW5lSW5bMF0ucGFjX2RhdGE7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2luX1UgPSBQbGFuZUluWzFdLnBhY19kYXRhOwotICAgIE00VklGSV9VSW50OCAqcF9pbl9WID0gUGxhbmVJblsyXS5wYWNfZGF0YTsKLQotICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiBGcmFtaW5nID0gTTRPU0FfTlVMTDsKLSAgICBNNHhWU1NfRnJhbWluZ1N0cnVjdCogY3VycmVudEZyYW1pbmcgPSBNNE9TQV9OVUxMOwotICAgIE00VklGSV9VSW50OCAqRnJhbWluZ1JHQiA9IE00T1NBX05VTEw7Ci0KLSAgICBNNFZJRklfVUludDggKnBfb3V0MDsKLSAgICBNNFZJRklfVUludDggKnBfb3V0MTsKLSAgICBNNFZJRklfVUludDggKnBfb3V0MjsKLQotICAgIE00VklGSV9VSW50MzIgdG9wbGVmdFsyXTsKLQotICAgIE00T1NBX1VJbnQ4IHRyYW5zcGFyZW50MSA9Ci0gICAgIChNNE9TQV9VSW50OCkoKFRSQU5TUEFSRU5UX0NPTE9SICYgMHhGRjAwKT4+OCk7Ci0gICAgTTRPU0FfVUludDggdHJhbnNwYXJlbnQyID0gKE00T1NBX1VJbnQ4KVRSQU5TUEFSRU5UX0NPTE9SOwotCi0jaWZuZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi0gICAgRnJhbWluZyA9IChNNHhWU1NfRnJhbWluZ1N0cnVjdCAqKXVzZXJEYXRhOwotICAgIGN1cnJlbnRGcmFtaW5nID0gKE00eFZTU19GcmFtaW5nU3RydWN0ICopRnJhbWluZy0+cEN1cnJlbnQ7Ci0gICAgRnJhbWluZ1JHQiA9IEZyYW1pbmctPkZyYW1pbmdSZ2ItPnBhY19kYXRhOwotI2VuZGlmIC8qREVDT0RFX0dJRl9PTl9TQVZJTkcqLwotCi0jaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIEZyYW1pbmcgPQotICAgICAoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QgKikoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5hRnJhbWluZ0N0eDsKLSAgICBpZihGcmFtaW5nID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICAoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5jbGlwVGltZSA9IHBQcm9ncmVzcy0+dWlPdXRwdXRUaW1lOwotICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxEZWNvZGVHSUYodXNlckRhdGEpOwotICAgICAgICBpZihNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RnJhbWluZzogXAotICAgICAgICAgICAgICAgIEVycm9yIGluIE00eFZTU19pbnRlcm5hbERlY29kZUdJRjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIEZyYW1pbmcgPQotICAgICAgICAgKE00eFZTU19GcmFtaW5nU3RydWN0ICopKChNNHhWU1NfRnJhbWluZ0NvbnRleHQqKXVzZXJEYXRhKS0+YUZyYW1pbmdDdHg7Ci0gICAgICAgIC8qIEluaXRpYWxpemVzIGZpcnN0IEdJRiB0aW1lICovCi0gICAgICAgICgoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Kil1c2VyRGF0YSktPmN1cnJlbnRfZ2lmX3RpbWUgPQotICAgICAgICAgIHBQcm9ncmVzcy0+dWlPdXRwdXRUaW1lOwotICAgIH0KLSAgICBjdXJyZW50RnJhbWluZyA9IChNNHhWU1NfRnJhbWluZ1N0cnVjdCAqKUZyYW1pbmc7Ci0gICAgRnJhbWluZ1JHQiA9IEZyYW1pbmctPkZyYW1pbmdSZ2ItPnBhY19kYXRhOwotI2VuZGlmIC8qREVDT0RFX0dJRl9PTl9TQVZJTkcqLwotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSBpbnB1dCAvIG91dHB1dCBwbGFuZSBwb2ludGVycyAqLwotICAgIHBfaW5fWSArPSBQbGFuZUluWzBdLnVfdG9wbGVmdDsKLSAgICBwX2luX1UgKz0gUGxhbmVJblsxXS51X3RvcGxlZnQ7Ci0gICAgcF9pbl9WICs9IFBsYW5lSW5bMl0udV90b3BsZWZ0OwotCi0gICAgcF9vdXQwID0gUGxhbmVPdXRbMF0ucGFjX2RhdGE7Ci0gICAgcF9vdXQxID0gUGxhbmVPdXRbMV0ucGFjX2RhdGE7Ci0gICAgcF9vdXQyID0gUGxhbmVPdXRbMl0ucGFjX2RhdGE7Ci0KLSAgICAvKioKLSAgICAgKiBEZXBlbmRpbmcgb24gdGltZSwgaW5pdGlhbGl6ZSBGcmFtaW5nIGZyYW1lIHRvIHVzZSAqLwotICAgIGlmKEZyYW1pbmctPnByZXZpb3VzQ2xpcFRpbWUgPT0gLTEpCi0gICAgewotICAgICAgICBGcmFtaW5nLT5wcmV2aW91c0NsaXBUaW1lID0gcFByb2dyZXNzLT51aU91dHB1dFRpbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgdGhlIGN1cnJlbnQgY2xpcCB0aW1lIGhhcyByZWFjaCB0aGUgZHVyYXRpb24gb2Ygb25lIGZyYW1lIG9mIHRoZSBmcmFtaW5nIHBpY3R1cmUKLSAgICAgKiB3ZSBuZWVkIHRvIHN0ZXAgdG8gbmV4dCBmcmFtaW5nIHBpY3R1cmUgKi8KLSNpZmRlZiBERUNPREVfR0lGX09OX1NBVklORwotICAgIGlmKCgoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Kil1c2VyRGF0YSktPmJfYW5pbWF0ZWQgPT0gTTRPU0FfVFJVRSkKLSAgICB7Ci0gICAgICAgIHdoaWxlKCgoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5jdXJyZW50X2dpZl90aW1lICsgY3VycmVudEZyYW1pbmctPmR1cmF0aW9uKSA8IHBQcm9ncmVzcy0+dWlPdXRwdXRUaW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5jbGlwVGltZSA9Ci0gICAgICAgICAgICAgcFByb2dyZXNzLT51aU91dHB1dFRpbWU7Ci0KLSAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbERlY29kZUdJRih1c2VyRGF0YSk7Ci0gICAgICAgICAgICBpZihNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGcmFtaW5nOiBFcnJvciBpbiBNNHhWU1NfaW50ZXJuYWxEZWNvZGVHSUY6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihjdXJyZW50RnJhbWluZy0+ZHVyYXRpb24gIT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5jdXJyZW50X2dpZl90aW1lICs9IGN1cnJlbnRGcmFtaW5nLT5kdXJhdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5jdXJyZW50X2dpZl90aW1lICs9Ci0gICAgICAgICAgICAgICAgIHBQcm9ncmVzcy0+dWlPdXRwdXRUaW1lIC0gRnJhbWluZy0+cHJldmlvdXNDbGlwVGltZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZyYW1pbmcgPSAoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QgKikoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5hRnJhbWluZ0N0eDsKLSAgICAgICAgICAgIGN1cnJlbnRGcmFtaW5nID0gKE00eFZTU19GcmFtaW5nU3RydWN0ICopRnJhbWluZzsKLSAgICAgICAgICAgIEZyYW1pbmdSR0IgPSBGcmFtaW5nLT5GcmFtaW5nUmdiLT5wYWNfZGF0YTsKLSAgICAgICAgfQotICAgIH0KLSNlbHNlCi0gICAgICAgICAgICBGcmFtaW5nLT5wQ3VycmVudCA9IGN1cnJlbnRGcmFtaW5nLT5wTmV4dDsKLSAgICAgICAgICAgIGN1cnJlbnRGcmFtaW5nID0gKE00eFZTU19GcmFtaW5nU3RydWN0KilGcmFtaW5nLT5wQ3VycmVudDsKLSNlbmRpZiAvKkRFQ09ERV9HSUZfT05fU0FWSU5HKi8KLQotICAgIEZyYW1pbmctPnByZXZpb3VzQ2xpcFRpbWUgPSBwUHJvZ3Jlc3MtPnVpT3V0cHV0VGltZTsKLSAgICBGcmFtaW5nUkdCID0gY3VycmVudEZyYW1pbmctPkZyYW1pbmdSZ2ItPnBhY19kYXRhOwotICAgIHRvcGxlZnRbMF0gPSBjdXJyZW50RnJhbWluZy0+dG9wbGVmdF94OwotICAgIHRvcGxlZnRbMV0gPSBjdXJyZW50RnJhbWluZy0+dG9wbGVmdF95OwotCi0gICAgZm9yKCB4PTAgO3ggPCBQbGFuZUluWzBdLnVfaGVpZ2h0IDsgeCsrKQotICAgIHsKLSAgICAgICAgZm9yKCB5PTAgO3kgPCBQbGFuZUluWzBdLnVfd2lkdGggOyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVG8gaGFuZGxlIGZyYW1pbmcgd2l0aCBpbnB1dCBzaXplICE9IG91dHB1dCBzaXplCi0gICAgICAgICAgICAgKiBGcmFtaW5nIGlzIGFwcGx5ZWQgaWYgY29vcmRpbmF0ZXMgbWF0Y2hlcyBiZXR3ZWVuIGZyYW1pbmcvdG9wbGVmdCBhbmQgaW5wdXQgcGxhbmUgKi8KLSAgICAgICAgICAgIGlmKCB5IDwgKHRvcGxlZnRbMF0gKyBjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlswXS51X3dpZHRoKSAgJiYKLSAgICAgICAgICAgICAgICB5ID49IHRvcGxlZnRbMF0gJiYKLSAgICAgICAgICAgICAgICB4IDwgKHRvcGxlZnRbMV0gKyBjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlswXS51X2hlaWdodCkgJiYKLSAgICAgICAgICAgICAgICB4ID49IHRvcGxlZnRbMV0pCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAvKkFscGhhIGJsZW5kaW5nIHN1cHBvcnQqLwotICAgICAgICAgICAgICAgIE00T1NBX0Zsb2F0IGFscGhhQmxlbmRpbmcgPSAxOwotI2lmZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi0gICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsRWZmZWN0c0FscGhhQmxlbmRpbmcqIGFscGhhQmxlbmRpbmdTdHJ1Y3QgPQotICAgICAgICAgICAgICAgICAoTTR4VlNTX2ludGVybmFsRWZmZWN0c0FscGhhQmxlbmRpbmcqKSgoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Kil1c2VyRGF0YSktPmFscGhhQmxlbmRpbmdTdHJ1Y3Q7Ci0jZWxzZQotICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbEVmZmVjdHNBbHBoYUJsZW5kaW5nKiBhbHBoYUJsZW5kaW5nU3RydWN0ID0KLSAgICAgICAgICAgICAgICAgKE00eFZTU19pbnRlcm5hbEVmZmVjdHNBbHBoYUJsZW5kaW5nKikoKE00eFZTU19GcmFtaW5nU3RydWN0Kil1c2VyRGF0YSktPmFscGhhQmxlbmRpbmdTdHJ1Y3Q7Ci0jZW5kaWYgLy8jaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLQotICAgICAgICAgICAgICAgIGlmKGFscGhhQmxlbmRpbmdTdHJ1Y3QgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHBQcm9ncmVzcy0+dWlQcm9ncmVzcyA8IChNNE9TQV9VSW50MzIpKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZUluVGltZSoxMCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhQmxlbmRpbmcgPSAoKE00T1NBX0Zsb2F0KShhbHBoYUJsZW5kaW5nU3RydWN0LT5tX21pZGRsZSAtIGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fc3RhcnQpKnBQcm9ncmVzcy0+dWlQcm9ncmVzcy8oYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlSW5UaW1lKjEwKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYUJsZW5kaW5nICs9IGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fc3RhcnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYUJsZW5kaW5nIC89IDEwMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKHBQcm9ncmVzcy0+dWlQcm9ncmVzcyA+PSAoTTRPU0FfVUludDMyKShhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVJblRpbWUqMTApICYmIHBQcm9ncmVzcy0+dWlQcm9ncmVzcyA8IDEwMDAgLSAoTTRPU0FfVUludDMyKShhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVPdXRUaW1lKjEwKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyA9IChNNE9TQV9GbG9hdCkoKE00T1NBX0Zsb2F0KWFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fbWlkZGxlLzEwMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgPj0gMTAwMCAtIChNNE9TQV9VSW50MzIpKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZU91dFRpbWUqMTApKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYUJsZW5kaW5nID0gKChNNE9TQV9GbG9hdCkoYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9taWRkbGUgLSBhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2VuZCkpKigxMDAwIC0gcFByb2dyZXNzLT51aVByb2dyZXNzKS8oYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlT3V0VGltZSoxMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYUJsZW5kaW5nICs9IGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZW5kOwotICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyAvPSAxMDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiovCi0KLSAgICAgICAgICAgICAgICBpZigoKihGcmFtaW5nUkdCKT09dHJhbnNwYXJlbnQxKSAmJiAoKihGcmFtaW5nUkdCKzEpPT10cmFuc3BhcmVudDIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKiggcF9vdXQwK3kreCpQbGFuZU91dFswXS51X3N0cmlkZSk9KCoocF9pbl9ZK3kreCpQbGFuZUluWzBdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICAgICAgICAgICooIHBfb3V0MSsoeT4+MSkrKHg+PjEpKlBsYW5lT3V0WzFdLnVfc3RyaWRlKT0oKihwX2luX1UrKHk+PjEpKyh4Pj4xKSpQbGFuZUluWzFdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICAgICAgICAgICooIHBfb3V0MisoeT4+MSkrKHg+PjEpKlBsYW5lT3V0WzJdLnVfc3RyaWRlKT0oKihwX2luX1YrKHk+PjEpKyh4Pj4xKSpQbGFuZUluWzJdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICooIHBfb3V0MCt5K3gqUGxhbmVPdXRbMF0udV9zdHJpZGUpPSgqKGN1cnJlbnRGcmFtaW5nLT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhKyh5LXRvcGxlZnRbMF0pKyh4LXRvcGxlZnRbMV0pKmN1cnJlbnRGcmFtaW5nLT5GcmFtaW5nWXV2WzBdLnVfc3RyaWRlKSkqYWxwaGFCbGVuZGluZzsKLSAgICAgICAgICAgICAgICAgICAgKiggcF9vdXQwK3kreCpQbGFuZU91dFswXS51X3N0cmlkZSkrPSgqKHBfaW5fWSt5K3gqUGxhbmVJblswXS51X3N0cmlkZSkpKigxLWFscGhhQmxlbmRpbmcpOwotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDErKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsxXS51X3N0cmlkZSk9KCooY3VycmVudEZyYW1pbmctPkZyYW1pbmdZdXZbMV0ucGFjX2RhdGErKCh5LXRvcGxlZnRbMF0pPj4xKSsoKHgtdG9wbGVmdFsxXSk+PjEpKmN1cnJlbnRGcmFtaW5nLT5GcmFtaW5nWXV2WzFdLnVfc3RyaWRlKSkqYWxwaGFCbGVuZGluZzsKLSAgICAgICAgICAgICAgICAgICAgKiggcF9vdXQxKyh5Pj4xKSsoeD4+MSkqUGxhbmVPdXRbMV0udV9zdHJpZGUpKz0oKihwX2luX1UrKHk+PjEpKyh4Pj4xKSpQbGFuZUluWzFdLnVfc3RyaWRlKSkqKDEtYWxwaGFCbGVuZGluZyk7Ci0gICAgICAgICAgICAgICAgICAgICooIHBfb3V0MisoeT4+MSkrKHg+PjEpKlBsYW5lT3V0WzJdLnVfc3RyaWRlKT0oKihjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlsyXS5wYWNfZGF0YSsoKHktdG9wbGVmdFswXSk+PjEpKygoeC10b3BsZWZ0WzFdKT4+MSkqY3VycmVudEZyYW1pbmctPkZyYW1pbmdZdXZbMl0udV9zdHJpZGUpKSphbHBoYUJsZW5kaW5nOwotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDIrKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsyXS51X3N0cmlkZSkrPSgqKHBfaW5fVisoeT4+MSkrKHg+PjEpKlBsYW5lSW5bMl0udV9zdHJpZGUpKSooMS1hbHBoYUJsZW5kaW5nKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoIFBsYW5lSW5bMF0udV93aWR0aCA8ICh0b3BsZWZ0WzBdICsgY3VycmVudEZyYW1pbmctPkZyYW1pbmdZdXZbMF0udV93aWR0aCkgJiYKLSAgICAgICAgICAgICAgICAgICAgeSA9PSBQbGFuZUluWzBdLnVfd2lkdGgtMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEZyYW1pbmdSR0IgPSBGcmFtaW5nUkdCICsgMiAqICh0b3BsZWZ0WzBdICsgY3VycmVudEZyYW1pbmctPkZyYW1pbmdZdXZbMF0udV93aWR0aCAtIFBsYW5lSW5bMF0udV93aWR0aCArIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBGcmFtaW5nUkdCID0gRnJhbWluZ1JHQiArIDI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBKdXN0IGNvcHkgaW5wdXQgcGxhbmUgdG8gb3V0cHV0IHBsYW5lICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKiggcF9vdXQwK3kreCpQbGFuZU91dFswXS51X3N0cmlkZSk9KihwX2luX1kreSt4KlBsYW5lSW5bMF0udV9zdHJpZGUpOwotICAgICAgICAgICAgICAgICooIHBfb3V0MSsoeT4+MSkrKHg+PjEpKlBsYW5lT3V0WzFdLnVfc3RyaWRlKT0qKHBfaW5fVSsoeT4+MSkrKHg+PjEpKlBsYW5lSW5bMV0udV9zdHJpZGUpOwotICAgICAgICAgICAgICAgICooIHBfb3V0MisoeT4+MSkrKHg+PjEpKlBsYW5lT3V0WzJdLnVfc3RyaWRlKT0qKHBfaW5fVisoeT4+MSkrKHg+PjEpKlBsYW5lSW5bMl0udV9zdHJpZGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0jaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLSAgICBpZihwUHJvZ3Jlc3MtPmJJc0xhc3QgPT0gTTRPU0FfVFJVRQotICAgICAgICAmJiAoTTRPU0FfQm9vbCkoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5iX0lzRmlsZUdpZiA9PSBNNE9TQV9UUlVFKQotICAgIHsKLSAgICAgICAgTTR4VlNTX2ludGVybmFsRGVjb2RlR0lGX0NsZWFuaW5nKChNNHhWU1NfRnJhbWluZ0NvbnRleHQqKXVzZXJEYXRhKTsKLSAgICB9Ci0jZW5kaWYgLypERUNPREVfR0lGX09OX1NBVklORyovCi0gICAgcmV0dXJuIE00VklGSV9PSzsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZpZnRpZXMoTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kKQotICoKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gbWFrZSBhIHZpZGVvIGxvb2sgYXMgaWYgaXQgd2FzIHRha2VuIGluIHRoZSBmaWZ0aWVzCi0gKiBAbm90ZQotICogQHBhcmFtICAgcFVzZXJEYXRhICAgICAgIChJTikgQ29udGV4dAotICogQHBhcmFtICAgcFBsYW5lSW4gICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgcFBsYW5lT3V0ICAgICAgIChJTi9PVVQpIE91dHB1dCBZVVY0MjAgcGxhbmFyCi0gKiBAcGFyYW0gICBwUHJvZ3Jlc3MgICAgICAgKElOL09VVCkgUHJvZ3Jlc3MgaW5kaWNhdGlvbiAoMC0xMDApCi0gKiBAcGFyYW0gICB1aUVmZmVjdEtpbmQgICAgKElOKSBVbnVzZWQKLSAqCi0gKiBAcmV0dXJuICBNNFZJRklfT0s6ICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIHBGaWZ0aWVzRGF0YSwgcFBsYW5lT3V0IG9yIHBQcm9ncmVzcyBhcmUgTlVMTCAoREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGaWZ0aWVzKAotICAgIE00T1NBX1ZvaWQgKnBVc2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQsIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCApCi17Ci0gICAgTTRWSUZJX1VJbnQzMiB4LCB5LCB4U2hpZnQ7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwSW5ZID0gcFBsYW5lSW5bMF0ucGFjX2RhdGE7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwT3V0WSwgKnBJblliZWdpbjsKLSAgICBNNFZJRklfVUludDggKnBJbkNyLCogcE91dENyOwotICAgIE00VklGSV9JbnQzMiBwbGFuZV9udW1iZXI7Ci0KLSAgICAvKiBJbnRlcm5hbCBjb250ZXh0Ki8KLSAgICBNNHhWU1NfRmlmdGllc1N0cnVjdCogcF9GaWZ0aWVzRGF0YSA9IChNNHhWU1NfRmlmdGllc1N0cnVjdCAqKXBVc2VyRGF0YTsKLQotICAgIC8qIEluaXRpYWxpemUgaW5wdXQgLyBvdXRwdXQgcGxhbmUgcG9pbnRlcnMgKi8KLSAgICBwSW5ZICs9IHBQbGFuZUluWzBdLnVfdG9wbGVmdDsKLSAgICBwT3V0WSA9IHBQbGFuZU91dFswXS5wYWNfZGF0YTsKLSAgICBwSW5ZYmVnaW4gID0gcEluWTsKLQotICAgIC8qIEluaXRpYWxpemUgdGhlIHJhbmRvbSAqLwotICAgIGlmKHBfRmlmdGllc0RhdGEtPnByZXZpb3VzQ2xpcFRpbWUgPCAwKQotICAgIHsKLSAgICAgICAgTTRPU0FfcmFuZEluaXQoKTsKLSAgICAgICAgTTRPU0FfcmFuZCgoTTRPU0FfSW50MzIqKSYocF9GaWZ0aWVzRGF0YS0+c2hpZnRSYW5kb21WYWx1ZSksIChwUGxhbmVJblswXS51X2hlaWdodCkgPj4gNCk7Ci0gICAgICAgIE00T1NBX3JhbmQoKE00T1NBX0ludDMyKikmKHBfRmlmdGllc0RhdGEtPnN0cmlwZVJhbmRvbVZhbHVlKSwgKHBQbGFuZUluWzBdLnVfd2lkdGgpPDwgMik7Ci0gICAgICAgIHBfRmlmdGllc0RhdGEtPnByZXZpb3VzQ2xpcFRpbWUgPSBwUHJvZ3Jlc3MtPnVpT3V0cHV0VGltZTsKLSAgICB9Ci0KLSAgICAvKiBDaG9vc2UgcmFuZG9tIHZhbHVlcyBpZiB3ZSBoYXZlIHJlYWNoZWQgdGhlIGR1cmF0aW9uIG9mIGEgcGFydGlhbCBlZmZlY3QgKi8KLSAgICBlbHNlIGlmKCAocFByb2dyZXNzLT51aU91dHB1dFRpbWUgLSBwX0ZpZnRpZXNEYXRhLT5wcmV2aW91c0NsaXBUaW1lKSA+IHBfRmlmdGllc0RhdGEtPmZpZnRpZXNFZmZlY3REdXJhdGlvbikKLSAgICB7Ci0gICAgICAgIE00T1NBX3JhbmQoKE00T1NBX0ludDMyKikmKHBfRmlmdGllc0RhdGEtPnNoaWZ0UmFuZG9tVmFsdWUpLCAocFBsYW5lSW5bMF0udV9oZWlnaHQpID4+IDQpOwotICAgICAgICBNNE9TQV9yYW5kKChNNE9TQV9JbnQzMiopJihwX0ZpZnRpZXNEYXRhLT5zdHJpcGVSYW5kb21WYWx1ZSksIChwUGxhbmVJblswXS51X3dpZHRoKTw8IDIpOwotICAgICAgICBwX0ZpZnRpZXNEYXRhLT5wcmV2aW91c0NsaXBUaW1lID0gcFByb2dyZXNzLT51aU91dHB1dFRpbWU7Ci0gICAgfQotCi0gICAgLyogUHV0IGluIFNlcGlhIHRoZSBjaHJvbWluYW5jZSAqLwotICAgIGZvciAocGxhbmVfbnVtYmVyID0gMTsgcGxhbmVfbnVtYmVyIDwgMzsgcGxhbmVfbnVtYmVyKyspCi0gICAgewotICAgICAgICBwSW5DciAgPSBwUGxhbmVJbltwbGFuZV9udW1iZXJdLnBhY19kYXRhICArIHBQbGFuZUluW3BsYW5lX251bWJlcl0udV90b3BsZWZ0OwotICAgICAgICBwT3V0Q3IgPSBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS5wYWNfZGF0YSArIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfdG9wbGVmdDsKLQotICAgICAgICBmb3IgKHggPSAwOyB4IDwgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9oZWlnaHQ7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKDEgPT0gcGxhbmVfbnVtYmVyKQotICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBPdXRDciwgMTE3LHBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7IC8qIFUgdmFsdWUgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwT3V0Q3IsIDEzOSxwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOyAvKiBWIHZhbHVlICovCi0KLSAgICAgICAgICAgIHBJbkNyICArPSBwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfc3RyaWRlOwotICAgICAgICAgICAgcE91dENyICs9IHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfc3RyaWRlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQ29tcHV0ZSB0aGUgbmV3IHBpeGVscyB2YWx1ZXMgKi8KLSAgICBmb3IoIHggPSAwIDsgeCA8IHBQbGFuZUluWzBdLnVfaGVpZ2h0IDsgeCsrKQotICAgIHsKLSAgICAgICAgTTRWSUZJX1VJbnQ4ICpwX291dFl0bXAsICpwX2luWXRtcDsKLQotICAgICAgICAvKiBDb21wdXRlIHRoZSB4U2hpZnQgKHJhbmRvbSB2YWx1ZSkgKi8KLSAgICAgICAgaWYgKDAgPT0gKHBfRmlmdGllc0RhdGEtPnNoaWZ0UmFuZG9tVmFsdWUgJSA1ICkpCi0gICAgICAgICAgICB4U2hpZnQgPSAoeCArIHBfRmlmdGllc0RhdGEtPnNoaWZ0UmFuZG9tVmFsdWUgKSAlIChwUGxhbmVJblswXS51X2hlaWdodCAtIDEpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB4U2hpZnQgPSAoeCArIChwUGxhbmVJblswXS51X2hlaWdodCAtIHBfRmlmdGllc0RhdGEtPnNoaWZ0UmFuZG9tVmFsdWUpICkgJSAocFBsYW5lSW5bMF0udV9oZWlnaHQgLSAxKTsKLQotICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBwb2ludGVycyAqLwotICAgICAgICBwX291dFl0bXAgPSBwT3V0WSArIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogeVNoaWZ0IG9mIDEgcGl4ZWwgKi8KLSAgICAgICAgcF9pbll0bXAgID0gcEluWWJlZ2luICsgKHhTaGlmdCAqIHBQbGFuZUluWzBdLnVfc3RyaWRlKTsgIC8qIEFwcGx5IHRoZSB4U2hpZnQgKi8KLQotICAgICAgICBmb3IoIHkgPSAwIDsgeSA8IHBQbGFuZUluWzBdLnVfd2lkdGggOyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFNldCBZIHZhbHVlICovCi0gICAgICAgICAgICBpZiAoeFNoaWZ0ID4gKHBQbGFuZUluWzBdLnVfaGVpZ2h0IC0gNCkpCi0gICAgICAgICAgICAgICAgKnBfb3V0WXRtcCA9IDQwOyAgICAgICAgLyogQWRkIHNvbWUgaG9yaXpvbnRhbCBibGFjayBsaW5lcyBiZXR3ZWVuIHRoZSB0d28gcGFydHMgb2YgdGhlIGltYWdlICovCi0gICAgICAgICAgICBlbHNlIGlmICggeSA9PSBwX0ZpZnRpZXNEYXRhLT5zdHJpcGVSYW5kb21WYWx1ZSkKLSAgICAgICAgICAgICAgICAqcF9vdXRZdG1wID0gOTA7ICAgICAgICAvKiBBZGQgYSByYW5kb20gdmVydGljYWwgbGluZSBmb3IgdGhlIGJ1bGsgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAqcF9vdXRZdG1wID0gKnBfaW5ZdG1wOwotCi0KLSAgICAgICAgICAgIC8qIEdvIHRvIHRoZSBuZXh0IHBpeGVsICovCi0gICAgICAgICAgICBwX291dFl0bXArKzsKLSAgICAgICAgICAgIHBfaW5ZdG1wKys7Ci0KLSAgICAgICAgICAgIC8qIFJlc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSBmb3IgdGhlIGxhc3QgcGl4ZWwqLwotICAgICAgICAgICAgaWYgKHkgPT0gKHBQbGFuZUluWzBdLnVfd2lkdGggLSAyKSkKLSAgICAgICAgICAgICAgICBwX291dFl0bXAgPSBwT3V0WTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEdvIHRvIHRoZSBuZXh0IGxpbmUgKi8KLSAgICAgICAgcE91dFkgKz0gcFBsYW5lT3V0WzBdLnVfc3RyaWRlOwotICAgIH0KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KLXVuc2lnbmVkIGNoYXIgTTRWRkxfbW9kaWZ5THVtYVdpdGhTY2FsZShNNFZpQ29tSW1hZ2VQbGFuZSAqcGxhbmVfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWaUNvbUltYWdlUGxhbmUgKnBsYW5lX291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGx1bV9mYWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKQotewotICAgIHVuc2lnbmVkIHNob3J0ICpwX3NyYywgKnBfZGVzdCwgKnBfc3JjX2xpbmUsICpwX2Rlc3RfbGluZTsKLSAgICB1bnNpZ25lZCBjaGFyICpwX2NzcmMsICpwX2NkZXN0LCAqcF9jc3JjX2xpbmUsICpwX2NkZXN0X2xpbmU7Ci0gICAgdW5zaWduZWQgbG9uZyBwaXhfc3JjOwotICAgIHVuc2lnbmVkIGxvbmcgdV9vdXRweCwgdV9vdXRweDI7Ci0gICAgdW5zaWduZWQgbG9uZyB1X3dpZHRoLCB1X3N0cmlkZSwgdV9zdHJpZGVfb3V0LHVfaGVpZ2h0LCBwaXg7Ci0gICAgbG9uZyBpLCBqOwotCi0gICAgLyogY29weSBvciBmaWx0ZXIgY2hyb21hICovCi0gICAgdV93aWR0aCA9IHBsYW5lX2luWzFdLnVfd2lkdGg7Ci0gICAgdV9oZWlnaHQgPSBwbGFuZV9pblsxXS51X2hlaWdodDsKLSAgICB1X3N0cmlkZSA9IHBsYW5lX2luWzFdLnVfc3RyaWRlOwotICAgIHVfc3RyaWRlX291dCA9IHBsYW5lX291dFsxXS51X3N0cmlkZTsKLSAgICBwX2NkZXN0X2xpbmUgPSAodW5zaWduZWQgY2hhciAqKSAmcGxhbmVfb3V0WzFdLnBhY19kYXRhW3BsYW5lX291dFsxXS51X3RvcGxlZnRdOwotICAgIHBfY3NyY19saW5lID0gKHVuc2lnbmVkIGNoYXIgKikgJnBsYW5lX2luWzFdLnBhY19kYXRhW3BsYW5lX2luWzFdLnVfdG9wbGVmdF07Ci0KLSAgICBpZiAobHVtX2ZhY3RvciA+IDI1NikKLSAgICB7Ci0gICAgICAgIHBfY2Rlc3QgPSAodW5zaWduZWQgY2hhciAqKSAmcGxhbmVfb3V0WzJdLnBhY19kYXRhW3BsYW5lX291dFsyXS51X3RvcGxlZnRdOwotICAgICAgICBwX2NzcmMgPSAodW5zaWduZWQgY2hhciAqKSAmcGxhbmVfaW5bMl0ucGFjX2RhdGFbcGxhbmVfaW5bMl0udV90b3BsZWZ0XTsKLSAgICAgICAgLyogY29weSBjaHJvbWEgKi8KLSAgICAgICAgZm9yIChqID0gdV9oZWlnaHQ7IGogIT0gMDsgai0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGkgPSB1X3dpZHRoOyBpICE9IDA7IGktLSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwX2NkZXN0X2xpbmUsICh2b2lkICopcF9jc3JjX2xpbmUsIHVfd2lkdGgpOwotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfY2Rlc3QsICh2b2lkICopcF9jc3JjLCB1X3dpZHRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBfY2Rlc3RfbGluZSArPSB1X3N0cmlkZV9vdXQ7Ci0gICAgICAgICAgICBwX2NkZXN0ICs9IHVfc3RyaWRlX291dDsKLSAgICAgICAgICAgIHBfY3NyY19saW5lICs9IHVfc3RyaWRlOwotICAgICAgICAgICAgcF9jc3JjICs9IHVfc3RyaWRlOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIGZpbHRlciBjaHJvbWEgKi8KLSAgICAgICAgcGl4ID0gKDEwMjQgLSBsdW1fZmFjdG9yKSA8PCA3OwotICAgICAgICBmb3IgKGogPSB1X2hlaWdodDsgaiAhPSAwOyBqLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBfY2Rlc3QgPSBwX2NkZXN0X2xpbmU7Ci0gICAgICAgICAgICBwX2NzcmMgPSBwX2NzcmNfbGluZTsKLSAgICAgICAgICAgIGZvciAoaSA9IHVfd2lkdGg7IGkgIT0gMDsgaS0tKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwX2NkZXN0KysgPSAoKHBpeCArICgqcF9jc3JjKysgJiAweEZGKSAqIGx1bV9mYWN0b3IpID4+IExVTV9GQUNUT1JfTUFYKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBfY2Rlc3RfbGluZSArPSB1X3N0cmlkZV9vdXQ7Ci0gICAgICAgICAgICBwX2NzcmNfbGluZSArPSB1X3N0cmlkZTsKLSAgICAgICAgfQotICAgICAgICBwX2NkZXN0X2xpbmUgPSAodW5zaWduZWQgY2hhciAqKSAmcGxhbmVfb3V0WzJdLnBhY19kYXRhW3BsYW5lX291dFsyXS51X3RvcGxlZnRdOwotICAgICAgICBwX2NzcmNfbGluZSA9ICh1bnNpZ25lZCBjaGFyICopICZwbGFuZV9pblsyXS5wYWNfZGF0YVtwbGFuZV9pblsyXS51X3RvcGxlZnRdOwotICAgICAgICBmb3IgKGogPSB1X2hlaWdodDsgaiAhPSAwOyBqLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBfY2Rlc3QgPSBwX2NkZXN0X2xpbmU7Ci0gICAgICAgICAgICBwX2NzcmMgPSBwX2NzcmNfbGluZTsKLSAgICAgICAgICAgIGZvciAoaSA9IHVfd2lkdGg7IGkgIT0gMDsgaS0tKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwX2NkZXN0KysgPSAoKHBpeCArICgqcF9jc3JjICYgMHhGRikgKiBsdW1fZmFjdG9yKSA+PiBMVU1fRkFDVE9SX01BWCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwX2NkZXN0X2xpbmUgKz0gdV9zdHJpZGVfb3V0OwotICAgICAgICAgICAgcF9jc3JjX2xpbmUgKz0gdV9zdHJpZGU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyogYXBwbHkgbHVtYSBmYWN0b3IgKi8KLSAgICB1X3dpZHRoID0gcGxhbmVfaW5bMF0udV93aWR0aDsKLSAgICB1X2hlaWdodCA9IHBsYW5lX2luWzBdLnVfaGVpZ2h0OwotICAgIHVfc3RyaWRlID0gKHBsYW5lX2luWzBdLnVfc3RyaWRlID4+IDEpOwotICAgIHVfc3RyaWRlX291dCA9IChwbGFuZV9vdXRbMF0udV9zdHJpZGUgPj4gMSk7Ci0gICAgcF9kZXN0ID0gKHVuc2lnbmVkIHNob3J0ICopICZwbGFuZV9vdXRbMF0ucGFjX2RhdGFbcGxhbmVfb3V0WzBdLnVfdG9wbGVmdF07Ci0gICAgcF9zcmMgPSAodW5zaWduZWQgc2hvcnQgKikgJnBsYW5lX2luWzBdLnBhY19kYXRhW3BsYW5lX2luWzBdLnVfdG9wbGVmdF07Ci0gICAgcF9kZXN0X2xpbmUgPSBwX2Rlc3Q7Ci0gICAgcF9zcmNfbGluZSA9IHBfc3JjOwotCi0gICAgZm9yIChqID0gdV9oZWlnaHQ7IGogIT0gMDsgai0tKQotICAgIHsKLSAgICAgICAgcF9kZXN0ID0gcF9kZXN0X2xpbmU7Ci0gICAgICAgIHBfc3JjID0gcF9zcmNfbGluZTsKLSAgICAgICAgZm9yIChpID0gKHVfd2lkdGggPj4gMSk7IGkgIT0gMDsgaS0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBwaXhfc3JjID0gKHVuc2lnbmVkIGxvbmcpICpwX3NyYysrOwotICAgICAgICAgICAgcGl4ID0gcGl4X3NyYyAmIDB4RkY7Ci0gICAgICAgICAgICB1X291dHB4ID0gKChwaXggKiBsdW1fZmFjdG9yKSA+PiBMVU1fRkFDVE9SX01BWCk7Ci0gICAgICAgICAgICBwaXggPSAoKHBpeF9zcmMgJiAweEZGMDApID4+IDgpOwotICAgICAgICAgICAgdV9vdXRweDIgPSAoKChwaXggKiBsdW1fZmFjdG9yKSA+PiBMVU1fRkFDVE9SX01BWCk8PCA4KSA7Ci0gICAgICAgICAgICAqcF9kZXN0KysgPSAodW5zaWduZWQgc2hvcnQpICh1X291dHB4MiB8IHVfb3V0cHgpOwotICAgICAgICB9Ci0gICAgICAgIHBfZGVzdF9saW5lICs9IHVfc3RyaWRlX291dDsKLSAgICAgICAgcF9zcmNfbGluZSArPSB1X3N0cmlkZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVYoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QqIGZyYW1pbmdDdHgpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGFuIFJHQjU2NSBwbGFuZSB0byBZVVY0MjAgcGxhbmFyCi0gKiBAbm90ZSAgICBJdCBpcyB1c2VkIG9ubHkgZm9yIGZyYW1pbmcgZWZmZWN0Ci0gKiAgICAgICAgICBJdCBhbGxvY2F0ZXMgb3V0cHV0IFlVViBwbGFuZXMKLSAqIEBwYXJhbSAgIGZyYW1pbmdDdHggIChJTikgVGhlIGZyYW1pbmcgc3RydWN0IGNvbnRhaW5pbmcgaW5wdXQgUkdCNTY1IHBsYW5lCi0gKgotICogQHJldHVybiAgTTROT19FUlJPUjogTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DOiBBbGxvY2F0aW9uIGVycm9yIChubyBtb3JlIG1lbW9yeSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWKE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4KQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICAvKioKLSAgICAgKiBBbGxvY2F0ZSBvdXRwdXQgWVVWIHBsYW5lcyAqLwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSAoTTRWSUZJX0ltYWdlUGxhbmUqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygzKnNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSksIE00VlMsIChNNE9TQV9DaGFyKikiTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWOiBPdXRwdXQgcGxhbmUgWVVWIik7Ci0gICAgaWYoZnJhbWluZ0N0eC0+RnJhbWluZ1l1diA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3dpZHRoID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0ID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQ7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3RvcGxlZnQgPSAwOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9zdHJpZGUgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV93aWR0aCpmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0KjMpPj4xLCBNNFZTLCAoTTRPU0FfQ2hhciopIkFsbG9jIGZvciB0aGUgQ29udmVydGlvbiBvdXRwdXQgWVVWIik7OwotICAgIGlmKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVViIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV93aWR0aCA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfaGVpZ2h0ID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0KT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfdG9wbGVmdCA9IDA7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3N0cmlkZSA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnBhY19kYXRhID0gZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSArIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV93aWR0aCAqIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9oZWlnaHQ7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS51X3dpZHRoID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGgpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV9oZWlnaHQgPSAoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV90b3BsZWZ0ID0gMDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfc3RyaWRlID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGgpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0ucGFjX2RhdGEgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnBhY19kYXRhICsgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3dpZHRoICogZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X2hlaWdodDsKLQotICAgIC8qKgotICAgICAqIENvbnZlcnQgaW5wdXQgUkdCIDU2NSB0byBZVVYgNDIwIHRvIGJlIGFibGUgdG8gbWVyZ2UgaXQgd2l0aCBvdXRwdXQgdmlkZW8gaW4gZnJhbWluZyBlZmZlY3QgKi8KLSAgICBlcnIgPSBNNFZJRklfeFZTU19SR0I1NjV0b1lVVjQyMChNNE9TQV9OVUxMLCBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLCBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2KTsKLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVY6IGVycm9yIHdoZW4gY29udmVydGluZyBmcm9tIFJHQiB0byBZVVY6IDB4JXhcbiIsIGVycik7Ci0gICAgfQotCi0gICAgZnJhbWluZ0N0eC0+ZHVyYXRpb24gPSAwOwotICAgIGZyYW1pbmdDdHgtPnByZXZpb3VzQ2xpcFRpbWUgPSAtMTsKLSAgICBmcmFtaW5nQ3R4LT5wcmV2aWV3T2Zmc2V0Q2xpcFRpbWUgPSAtMTsKLQotICAgIC8qKgotICAgICAqIE9ubHkgb25lIGVsZW1lbnQgaW4gdGhlIGNoYWluZWQgbGlzdCAobm8gYW5pbWF0ZWQgaW1hZ2Ugd2l0aCBSR0IgYnVmZmVyLi4uKSAqLwotICAgIGZyYW1pbmdDdHgtPnBDdXJyZW50ID0gZnJhbWluZ0N0eDsKLSAgICBmcmFtaW5nQ3R4LT5wTmV4dCA9IGZyYW1pbmdDdHg7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCODg4dG9ZVVYoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QqIGZyYW1pbmdDdHgpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGFuIFJHQjg4OCBwbGFuZSB0byBZVVY0MjAgcGxhbmFyCi0gKiBAbm90ZSAgICBJdCBpcyB1c2VkIG9ubHkgZm9yIGZyYW1pbmcgZWZmZWN0Ci0gKiAgICAgICAgICBJdCBhbGxvY2F0ZXMgb3V0cHV0IFlVViBwbGFuZXMKLSAqIEBwYXJhbSAgIGZyYW1pbmdDdHggIChJTikgVGhlIGZyYW1pbmcgc3RydWN0IGNvbnRhaW5pbmcgaW5wdXQgUkdCODg4IHBsYW5lCi0gKgotICogQHJldHVybiAgTTROT19FUlJPUjogTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DOiBBbGxvY2F0aW9uIGVycm9yIChubyBtb3JlIG1lbW9yeSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydFJHQjg4OHRvWVVWKE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4KQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICAvKioKLSAgICAgKiBBbGxvY2F0ZSBvdXRwdXQgWVVWIHBsYW5lcyAqLwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSAoTTRWSUZJX0ltYWdlUGxhbmUqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygzKnNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSksIE00VlMsIChNNE9TQV9DaGFyKikiTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWOiBPdXRwdXQgcGxhbmUgWVVWIik7Ci0gICAgaWYoZnJhbWluZ0N0eC0+RnJhbWluZ1l1diA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3dpZHRoID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0ID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQ7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3RvcGxlZnQgPSAwOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9zdHJpZGUgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV93aWR0aCpmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0KjMpPj4xLCBNNFZTLCAoTTRPU0FfQ2hhciopIkFsbG9jIGZvciB0aGUgQ29udmVydGlvbiBvdXRwdXQgWVVWIik7OwotICAgIGlmKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVViIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV93aWR0aCA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfaGVpZ2h0ID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0KT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfdG9wbGVmdCA9IDA7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3N0cmlkZSA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnBhY19kYXRhID0gZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSArIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV93aWR0aCAqIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9oZWlnaHQ7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS51X3dpZHRoID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGgpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV9oZWlnaHQgPSAoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV90b3BsZWZ0ID0gMDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfc3RyaWRlID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGgpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0ucGFjX2RhdGEgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnBhY19kYXRhICsgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3dpZHRoICogZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X2hlaWdodDsKLQotICAgIC8qKgotICAgICAqIENvbnZlcnQgaW5wdXQgUkdCODg4IHRvIFlVViA0MjAgdG8gYmUgYWJsZSB0byBtZXJnZSBpdCB3aXRoIG91dHB1dCB2aWRlbyBpbiBmcmFtaW5nIGVmZmVjdCAqLwotICAgIGVyciA9IE00VklGSV9SR0I4ODh0b1lVVjQyMChNNE9TQV9OVUxMLCBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLCBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2KTsKLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVY6IGVycm9yIHdoZW4gY29udmVydGluZyBmcm9tIFJHQiB0byBZVVY6IDB4JXhcbiIsIGVycik7Ci0gICAgfQotCi0gICAgZnJhbWluZ0N0eC0+ZHVyYXRpb24gPSAwOwotICAgIGZyYW1pbmdDdHgtPnByZXZpb3VzQ2xpcFRpbWUgPSAtMTsKLSAgICBmcmFtaW5nQ3R4LT5wcmV2aWV3T2Zmc2V0Q2xpcFRpbWUgPSAtMTsKLQotICAgIC8qKgotICAgICAqIE9ubHkgb25lIGVsZW1lbnQgaW4gdGhlIGNoYWluZWQgbGlzdCAobm8gYW5pbWF0ZWQgaW1hZ2Ugd2l0aCBSR0IgYnVmZmVyLi4uKSAqLwotICAgIGZyYW1pbmdDdHgtPnBDdXJyZW50ID0gZnJhbWluZ0N0eDsKLSAgICBmcmFtaW5nQ3R4LT5wTmV4dCA9IGZyYW1pbmdDdHg7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNFZJRklfVUludDggTTRWSUZJX1JHQjU2NXRvWVVWNDIwICh2b2lkICpwVXNlckRhdGEsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpCi0gKiBAYXV0aG9yICBQYXRyaWNlIE1hcnRpbmV6IC8gUGhpbGlwcyBEaWdpdGFsIE5ldHdvcmtzIC0gTVA0TmV0Ci0gKiBAYnJpZWYgICB0cmFuc2Zvcm0gUkdCNTY1IGltYWdlIHRvIGEgWVVWNDIwIGltYWdlLgotICogQG5vdGUgICAgQ29udmVydCBSR0I1NjUgdG8gWVVWNDIwLAotICogICAgICAgICAgTG9vcCBvbiBlYWNoIHJvdyAoIDIgcm93cyBieSAyIHJvd3MgKQotICogICAgICAgICAgICAgIExvb3Agb24gZWFjaCBjb2x1bW4gKCAyIGNvbCBieSAyIGNvbCApCi0gKiAgICAgICAgICAgICAgICAgIEdldCA0IFJHQiBzYW1wbGVzIGZyb20gaW5wdXQgZGF0YSBhbmQgYnVpbGQgNCBvdXRwdXQgWSBzYW1wbGVzCi0gKiAgICAgICAgICAgICAgICAgIGFuZCBlYWNoIHNpbmdsZSBVICYgViBkYXRhCi0gKiAgICAgICAgICAgICAgZW5kIGxvb3Agb24gY29sCi0gKiAgICAgICAgICBlbmQgbG9vcCBvbiByb3cKLSAqIEBwYXJhbSAgIHBVc2VyRGF0YTogKElOKSBVc2VyIFNwZWNpZmljIERhdGEKLSAqIEBwYXJhbSAgIHBQbGFuZUluOiAoSU4pIFBvaW50ZXIgdG8gUkdCNTY1IFBsYW5lCi0gKiBAcGFyYW0gICBwUGxhbmVPdXQ6IChPVVQpIFBvaW50ZXIgdG8gIFlVVjQyMCBidWZmZXIgUGxhbmUKLSAqIEByZXR1cm4gIE00VklGSV9PSzogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDogWVVWIFBsYW5lIGhlaWdodCBpcyBPREQKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOiAgWVVWIFBsYW5lIHdpZHRoIGlzIE9ERAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00VklGSV9VSW50OCAgICBNNFZJRklfeFZTU19SR0I1NjV0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpCi17Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl93aWR0aCwgdTMyX2hlaWdodDsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3N0cmlkZV9ZLCB1MzJfc3RyaWRlMl9ZLCB1MzJfc3RyaWRlX1UsIHUzMl9zdHJpZGVfVjsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3N0cmlkZV9yZ2IsIHUzMl9zdHJpZGVfMnJnYjsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX2NvbCwgdTMyX3JvdzsKLQotICAgIE00VklGSV9JbnQzMiAgICBpMzJfcjAwLCBpMzJfcjAxLCBpMzJfcjEwLCBpMzJfcjExOwotICAgIE00VklGSV9JbnQzMiAgICBpMzJfZzAwLCBpMzJfZzAxLCBpMzJfZzEwLCBpMzJfZzExOwotICAgIE00VklGSV9JbnQzMiAgICBpMzJfYjAwLCBpMzJfYjAxLCBpMzJfYjEwLCBpMzJfYjExOwotICAgIE00VklGSV9JbnQzMiAgICBpMzJfeTAwLCBpMzJfeTAxLCBpMzJfeTEwLCBpMzJfeTExOwotICAgIE00VklGSV9JbnQzMiAgICBpMzJfdTAwLCBpMzJfdTAxLCBpMzJfdTEwLCBpMzJfdTExOwotICAgIE00VklGSV9JbnQzMiAgICBpMzJfdjAwLCBpMzJfdjAxLCBpMzJfdjEwLCBpMzJfdjExOwotICAgIE00VklGSV9VSW50OCAgICAqcHU4X3luLCAqcHU4X3lzLCAqcHU4X3UsICpwdThfdjsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF95X2RhdGEsICpwdThfdV9kYXRhLCAqcHU4X3ZfZGF0YTsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF9yZ2JuX2RhdGEsICpwdThfcmdibjsKLSAgICBNNFZJRklfVUludDE2ICAgdTE2X3BpeDEsIHUxNl9waXgyLCB1MTZfcGl4MywgdTE2X3BpeDQ7Ci0gICAgTTRWSUZJX1VJbnQ4IGNvdW50X251bGw9MDsKLQotICAgIC8qIENoZWNrIHBsYW5lcyBoZWlnaHQgYXJlIGFwcHJvcHJpYXRlICovCi0gICAgaWYoIChwUGxhbmVJbi0+dV9oZWlnaHQgIT0gcFBsYW5lT3V0WzBdLnVfaGVpZ2h0KSAgICAgICAgICAgfHwKLSAgICAgICAgKHBQbGFuZU91dFswXS51X2hlaWdodCAhPSAocFBsYW5lT3V0WzFdLnVfaGVpZ2h0PDwxKSkgICB8fAotICAgICAgICAocFBsYW5lT3V0WzBdLnVfaGVpZ2h0ICE9IChwUGxhbmVPdXRbMl0udV9oZWlnaHQ8PDEpKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFZJRklfSUxMRUdBTF9GUkFNRV9IRUlHSFQ7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgcGxhbmVzIHdpZHRoIGFyZSBhcHByb3ByaWF0ZSAqLwotICAgIGlmKCAocFBsYW5lSW4tPnVfd2lkdGggIT0gcFBsYW5lT3V0WzBdLnVfd2lkdGgpICAgICAgICAgfHwKLSAgICAgICAgKHBQbGFuZU91dFswXS51X3dpZHRoICE9IChwUGxhbmVPdXRbMV0udV93aWR0aDw8MSkpIHx8Ci0gICAgICAgIChwUGxhbmVPdXRbMF0udV93aWR0aCAhPSAocFBsYW5lT3V0WzJdLnVfd2lkdGg8PDEpKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDsKLSAgICB9Ci0KLSAgICAvKiBTZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0IGRhdGEgYnVmZmVycyAqLwotICAgIHB1OF95X2RhdGEgPSBwUGxhbmVPdXRbMF0ucGFjX2RhdGEgKyBwUGxhbmVPdXRbMF0udV90b3BsZWZ0OwotICAgIHB1OF91X2RhdGEgPSBwUGxhbmVPdXRbMV0ucGFjX2RhdGEgKyBwUGxhbmVPdXRbMV0udV90b3BsZWZ0OwotICAgIHB1OF92X2RhdGEgPSBwUGxhbmVPdXRbMl0ucGFjX2RhdGEgKyBwUGxhbmVPdXRbMl0udV90b3BsZWZ0OwotCi0gICAgLyogU2V0IHRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGlucHV0IGRhdGEgYnVmZmVycyAqLwotICAgIHB1OF9yZ2JuX2RhdGEgICA9IHBQbGFuZUluLT5wYWNfZGF0YSArIHBQbGFuZUluLT51X3RvcGxlZnQ7Ci0KLSAgICAvKiBHZXQgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBpbWFnZSAqLwotICAgIHUzMl93aWR0aCA9IHBQbGFuZU91dFswXS51X3dpZHRoOwotICAgIHUzMl9oZWlnaHQgPSBwUGxhbmVPdXRbMF0udV9oZWlnaHQ7Ci0KLSAgICAvKiBTZXQgdGhlIHNpemUgb2YgdGhlIG1lbW9yeSBqdW1wcyBjb3JyZXNwb25kaW5nIHRvIHJvdyBqdW1wIGluIGVhY2ggb3V0cHV0IHBsYW5lICovCi0gICAgdTMyX3N0cmlkZV9ZID0gcFBsYW5lT3V0WzBdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGUyX1kgPSB1MzJfc3RyaWRlX1kgPDwgMTsKLSAgICB1MzJfc3RyaWRlX1UgPSBwUGxhbmVPdXRbMV0udV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZV9WID0gcFBsYW5lT3V0WzJdLnVfc3RyaWRlOwotCi0gICAgLyogU2V0IHRoZSBzaXplIG9mIHRoZSBtZW1vcnkganVtcHMgY29ycmVzcG9uZGluZyB0byByb3cganVtcCBpbiBpbnB1dCBwbGFuZSAqLwotICAgIHUzMl9zdHJpZGVfcmdiID0gcFBsYW5lSW4tPnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfMnJnYiA9IHUzMl9zdHJpZGVfcmdiIDw8IDE7Ci0KLQotICAgIC8qIExvb3Agb24gZWFjaCByb3cgb2YgdGhlIG91dHB1dCBpbWFnZSwgaW5wdXQgY29vcmRpbmF0ZXMgYXJlIGVzdGltYXRlZCBmcm9tIG91dHB1dCBvbmVzICovCi0gICAgLyogVHdvIFlVViByb3dzIGFyZSBjb21wdXRlZCBhdCBlYWNoIHBhc3MgKi8KLSAgICBmb3IgKHUzMl9yb3cgPSB1MzJfaGVpZ2h0IDt1MzJfcm93ICE9IDA7IHUzMl9yb3cgLT0yKQotICAgIHsKLSAgICAgICAgLyogQ3VycmVudCBZIHBsYW5lIHJvdyBwb2ludGVycyAqLwotICAgICAgICBwdThfeW4gPSBwdThfeV9kYXRhOwotICAgICAgICAvKiBOZXh0IFkgcGxhbmUgcm93IHBvaW50ZXJzICovCi0gICAgICAgIHB1OF95cyA9IHB1OF95biArIHUzMl9zdHJpZGVfWTsKLSAgICAgICAgLyogQ3VycmVudCBVIHBsYW5lIHJvdyBwb2ludGVyICovCi0gICAgICAgIHB1OF91ID0gcHU4X3VfZGF0YTsKLSAgICAgICAgLyogQ3VycmVudCBWIHBsYW5lIHJvdyBwb2ludGVyICovCi0gICAgICAgIHB1OF92ID0gcHU4X3ZfZGF0YTsKLQotICAgICAgICBwdThfcmdibiA9IHB1OF9yZ2JuX2RhdGE7Ci0KLSAgICAgICAgLyogTG9vcCBvbiBlYWNoIGNvbHVtbiBvZiB0aGUgb3V0cHV0IGltYWdlICovCi0gICAgICAgIGZvciAodTMyX2NvbCA9IHUzMl93aWR0aDsgdTMyX2NvbCAhPSAwIDsgdTMyX2NvbCAtPTIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEdldCBmb3VyIFJHQiA1NjUgc2FtcGxlcyBmcm9tIGlucHV0IGRhdGEgKi8KLSAgICAgICAgICAgIHUxNl9waXgxID0gKiggKE00VklGSV9VSW50MTYgKikgcHU4X3JnYm4pOwotICAgICAgICAgICAgdTE2X3BpeDIgPSAqKCAoTTRWSUZJX1VJbnQxNiAqKSAocHU4X3JnYm4gKyBDU1RfUkdCXzE2X1NJWkUpKTsKLSAgICAgICAgICAgIHUxNl9waXgzID0gKiggKE00VklGSV9VSW50MTYgKikgKHB1OF9yZ2JuICsgdTMyX3N0cmlkZV9yZ2IpKTsKLSAgICAgICAgICAgIHUxNl9waXg0ID0gKiggKE00VklGSV9VSW50MTYgKikgKHB1OF9yZ2JuICsgdTMyX3N0cmlkZV9yZ2IgKyBDU1RfUkdCXzE2X1NJWkUpKTsKLQotICAgICAgICAgICAgLyogVW5wYWNrIFJHQjU2NSB0byA4Yml0IFIsIEcsIEIgKi8KLSAgICAgICAgICAgIC8qICh4LHkpICovCi0gICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9iMDAsaTMyX2cwMCxpMzJfcjAwLHUxNl9waXgxKTsKLSAgICAgICAgICAgIC8qICh4KzEseSkgKi8KLSAgICAgICAgICAgIEdFVF9SR0I1NjUoaTMyX2IxMCxpMzJfZzEwLGkzMl9yMTAsdTE2X3BpeDIpOwotICAgICAgICAgICAgLyogKHgseSsxKSAqLwotICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfYjAxLGkzMl9nMDEsaTMyX3IwMSx1MTZfcGl4Myk7Ci0gICAgICAgICAgICAvKiAoeCsxLHkrMSkgKi8KLSAgICAgICAgICAgIEdFVF9SR0I1NjUoaTMyX2IxMSxpMzJfZzExLGkzMl9yMTEsdTE2X3BpeDQpOwotICAgICAgICAgICAgLyogSWYgUkdCIGlzIHRyYW5zcGFyZW50IGNvbG9yICgwLCA2MywgMCksIHdlIHRyYW5zZm9ybSBpdCB0byB3aGl0ZSAoMzEsNjMsMzEpICovCi0gICAgICAgICAgICBpZihpMzJfYjAwID09IDAgJiYgaTMyX2cwMCA9PSA2MyAmJiBpMzJfcjAwID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaTMyX2IwMCA9IDMxOwotICAgICAgICAgICAgICAgIGkzMl9yMDAgPSAzMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKGkzMl9iMTAgPT0gMCAmJiBpMzJfZzEwID09IDYzICYmIGkzMl9yMTAgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpMzJfYjEwID0gMzE7Ci0gICAgICAgICAgICAgICAgaTMyX3IxMCA9IDMxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoaTMyX2IwMSA9PSAwICYmIGkzMl9nMDEgPT0gNjMgJiYgaTMyX3IwMSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkzMl9iMDEgPSAzMTsKLSAgICAgICAgICAgICAgICBpMzJfcjAxID0gMzE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihpMzJfYjExID09IDAgJiYgaTMyX2cxMSA9PSA2MyAmJiBpMzJfcjExID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaTMyX2IxMSA9IDMxOwotICAgICAgICAgICAgICAgIGkzMl9yMTEgPSAzMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIENvbnZlcnQgUkdCIHZhbHVlIHRvIFlVViAqLwotICAgICAgICAgICAgaTMyX3UwMCA9IFUxNihpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwKTsKLSAgICAgICAgICAgIGkzMl92MDAgPSBWMTYoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7Ci0gICAgICAgICAgICAvKiBsdW1pbmFuY2UgdmFsdWUgKi8KLSAgICAgICAgICAgIGkzMl95MDAgPSBZMTYoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7Ci0KLSAgICAgICAgICAgIGkzMl91MTAgPSBVMTYoaTMyX3IxMCwgaTMyX2cxMCwgaTMyX2IxMCk7Ci0gICAgICAgICAgICBpMzJfdjEwID0gVjE2KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotICAgICAgICAgICAgLyogbHVtaW5hbmNlIHZhbHVlICovCi0gICAgICAgICAgICBpMzJfeTEwID0gWTE2KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotCi0gICAgICAgICAgICBpMzJfdTAxID0gVTE2KGkzMl9yMDEsIGkzMl9nMDEsIGkzMl9iMDEpOwotICAgICAgICAgICAgaTMyX3YwMSA9IFYxNihpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLSAgICAgICAgICAgIC8qIGx1bWluYW5jZSB2YWx1ZSAqLwotICAgICAgICAgICAgaTMyX3kwMSA9IFkxNihpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLQotICAgICAgICAgICAgaTMyX3UxMSA9IFUxNihpMzJfcjExLCBpMzJfZzExLCBpMzJfYjExKTsKLSAgICAgICAgICAgIGkzMl92MTEgPSBWMTYoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0gICAgICAgICAgICAvKiBsdW1pbmFuY2UgdmFsdWUgKi8KLSAgICAgICAgICAgIGkzMl95MTEgPSBZMTYoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0KLSAgICAgICAgICAgIC8qIFN0b3JlIGx1bWluYW5jZSBkYXRhICovCi0gICAgICAgICAgICBwdThfeW5bMF0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MDA7Ci0gICAgICAgICAgICBwdThfeW5bMV0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MTA7Ci0gICAgICAgICAgICBwdThfeXNbMF0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MDE7Ci0gICAgICAgICAgICBwdThfeXNbMV0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MTE7Ci0gICAgICAgICAgICAqcHU4X3UgPSAoTTRWSUZJX1VJbnQ4KSgoaTMyX3UwMCArIGkzMl91MDEgKyBpMzJfdTEwICsgaTMyX3UxMSArIDIpID4+IDIpOwotICAgICAgICAgICAgKnB1OF92ID0gKE00VklGSV9VSW50OCkoKGkzMl92MDAgKyBpMzJfdjAxICsgaTMyX3YxMCArIGkzMl92MTEgKyAyKSA+PiAyKTsKLSAgICAgICAgICAgIC8qIFByZXBhcmUgZm9yIG5leHQgY29sdW1uICovCi0gICAgICAgICAgICBwdThfcmdibiArPSAoQ1NUX1JHQl8xNl9TSVpFPDwxKTsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBjdXJyZW50IFkgcGxhbmUgbGluZSBwb2ludGVyKi8KLSAgICAgICAgICAgIHB1OF95biArPSAyOwotICAgICAgICAgICAgLyogVXBkYXRlIG5leHQgWSBwbGFuZSBsaW5lIHBvaW50ZXIqLwotICAgICAgICAgICAgcHU4X3lzICs9IDI7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgVSBwbGFuZSBsaW5lIHBvaW50ZXIqLwotICAgICAgICAgICAgcHU4X3UgKys7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgViBwbGFuZSBsaW5lIHBvaW50ZXIqLwotICAgICAgICAgICAgcHU4X3YgKys7Ci0gICAgICAgIH0gLyogRW5kIG9mIGhvcml6b250YWwgc2Nhbm5pbmcgKi8KLQotICAgICAgICAvKiBQcmVwYXJlIHBvaW50ZXJzIGZvciB0aGUgbmV4dCByb3cgKi8KLSAgICAgICAgcHU4X3lfZGF0YSArPSB1MzJfc3RyaWRlMl9ZOwotICAgICAgICBwdThfdV9kYXRhICs9IHUzMl9zdHJpZGVfVTsKLSAgICAgICAgcHU4X3ZfZGF0YSArPSB1MzJfc3RyaWRlX1Y7Ci0gICAgICAgIHB1OF9yZ2JuX2RhdGEgKz0gdTMyX3N0cmlkZV8ycmdiOwotCi0KLSAgICB9IC8qIEVuZCBvZiB2ZXJ0aWNhbCBzY2FubmluZyAqLwotCi0gICAgcmV0dXJuIE00VklGSV9PSzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUHJvdG86Ci1NNFZJRklfVUludDggICAgTTRWSUZJX1JHQjg4OHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lT3V0WzNdKTsKLUF1dGhvcjogICAgIFBhdHJpY2UgTWFydGluZXogLyBQaGlsaXBzIERpZ2l0YWwgTmV0d29ya3MgLSBNUDROZXQKLVB1cnBvc2U6ICAgIGZpbGxpbmcgb2YgdGhlIFlVVjQyMCBwbGFuZSBmcm9tIGEgQkdSMjQgcGxhbmUKLUFic3RyYWN0OiAgIExvb3Agb24gZWFjaCByb3cgKCAyIHJvd3MgYnkgMiByb3dzICkKLSAgICAgICAgICAgICAgICBMb29wIG9uIGVhY2ggY29sdW1uICggMiBjb2wgYnkgMiBjb2wgKQotICAgICAgICAgICAgICAgICAgICBHZXQgNCBCR1Igc2FtcGxlcyBmcm9tIGlucHV0IGRhdGEgYW5kIGJ1aWxkIDQgb3V0cHV0IFkgc2FtcGxlcyBhbmQgZWFjaCBzaW5nbGUgVSAmIFYgZGF0YQotICAgICAgICAgICAgICAgIGVuZCBsb29wIG9uIGNvbAotICAgICAgICAgICAgZW5kIGxvb3Agb24gcm93Ci0KLUluOiAgICAgICAgIFJHQjI0IHBsYW5lCi1Jbk91dDogICAgICBub25lCi1PdXQ6ICAgICAgICBhcnJheSBvZiAzIE00VklGSV9JbWFnZVBsYW5lIHN0cnVjdHVyZXMKLU1vZGlmaWVkOiAgIE1MOiBSR0IgZnVuY3Rpb24gbW9kaWZpZWQgdG8gQkdSLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRWSUZJX1VJbnQ4IE00VklGSV9SR0I4ODh0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZU91dFszXSkKLXsKLQotICAgIE00VklGSV9VSW50MzIgICB1MzJfd2lkdGgsIHUzMl9oZWlnaHQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9zdHJpZGVfWSwgdTMyX3N0cmlkZTJfWSwgdTMyX3N0cmlkZV9VLCB1MzJfc3RyaWRlX1YsIHUzMl9zdHJpZGVfcmdiLCB1MzJfc3RyaWRlXzJyZ2I7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9jb2wsIHUzMl9yb3c7Ci0KLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3IwMCwgaTMyX3IwMSwgaTMyX3IxMCwgaTMyX3IxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX2cwMCwgaTMyX2cwMSwgaTMyX2cxMCwgaTMyX2cxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX2IwMCwgaTMyX2IwMSwgaTMyX2IxMCwgaTMyX2IxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3kwMCwgaTMyX3kwMSwgaTMyX3kxMCwgaTMyX3kxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3UwMCwgaTMyX3UwMSwgaTMyX3UxMCwgaTMyX3UxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3YwMCwgaTMyX3YwMSwgaTMyX3YxMCwgaTMyX3YxMTsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF95biwgKnB1OF95cywgKnB1OF91LCAqcHU4X3Y7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfeV9kYXRhLCAqcHU4X3VfZGF0YSwgKnB1OF92X2RhdGE7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfcmdibl9kYXRhLCAqcHU4X3JnYm47Ci0KLSAgICAvKiBjaGVjayBzaXplcyAqLwotICAgIGlmKCAoUGxhbmVJbi0+dV9oZWlnaHQgIT0gUGxhbmVPdXRbMF0udV9oZWlnaHQpICAgICAgICAgfHwKLSAgICAgICAgKFBsYW5lT3V0WzBdLnVfaGVpZ2h0ICE9IChQbGFuZU91dFsxXS51X2hlaWdodDw8MSkpIHx8Ci0gICAgICAgIChQbGFuZU91dFswXS51X2hlaWdodCAhPSAoUGxhbmVPdXRbMl0udV9oZWlnaHQ8PDEpKSkKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDsKLQotICAgIGlmKCAoUGxhbmVJbi0+dV93aWR0aCAhPSBQbGFuZU91dFswXS51X3dpZHRoKSAgICAgICB8fAotICAgICAgICAoUGxhbmVPdXRbMF0udV93aWR0aCAhPSAoUGxhbmVPdXRbMV0udV93aWR0aDw8MSkpICAgfHwKLSAgICAgICAgKFBsYW5lT3V0WzBdLnVfd2lkdGggIT0gKFBsYW5lT3V0WzJdLnVfd2lkdGg8PDEpKSkKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOwotCi0KLSAgICAvKiBzZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0IGRhdGEgYnVmZmVycyAqLwotICAgIHB1OF95X2RhdGEgID0gUGxhbmVPdXRbMF0ucGFjX2RhdGEgKyBQbGFuZU91dFswXS51X3RvcGxlZnQ7Ci0gICAgcHU4X3VfZGF0YSAgPSBQbGFuZU91dFsxXS5wYWNfZGF0YSArIFBsYW5lT3V0WzFdLnVfdG9wbGVmdDsKLSAgICBwdThfdl9kYXRhICA9IFBsYW5lT3V0WzJdLnBhY19kYXRhICsgUGxhbmVPdXRbMl0udV90b3BsZWZ0OwotCi0gICAgLyogaWRlbSBmb3IgaW5wdXQgYnVmZmVyICovCi0gICAgcHU4X3JnYm5fZGF0YSAgID0gUGxhbmVJbi0+cGFjX2RhdGEgKyBQbGFuZUluLT51X3RvcGxlZnQ7Ci0KLSAgICAvKiBnZXQgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBpbWFnZSAqLwotICAgIHUzMl93aWR0aCAgID0gUGxhbmVPdXRbMF0udV93aWR0aDsKLSAgICB1MzJfaGVpZ2h0ICA9IFBsYW5lT3V0WzBdLnVfaGVpZ2h0OwotCi0gICAgLyogc2V0IHRoZSBzaXplIG9mIHRoZSBtZW1vcnkganVtcHMgY29ycmVzcG9uZGluZyB0byByb3cganVtcCBpbiBlYWNoIG91dHB1dCBwbGFuZSAqLwotICAgIHUzMl9zdHJpZGVfWSA9IFBsYW5lT3V0WzBdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGUyX1k9IHUzMl9zdHJpZGVfWSA8PCAxOwotICAgIHUzMl9zdHJpZGVfVSA9IFBsYW5lT3V0WzFdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfViA9IFBsYW5lT3V0WzJdLnVfc3RyaWRlOwotCi0gICAgLyogaWRlbSBmb3IgaW5wdXQgcGxhbmUgKi8KLSAgICB1MzJfc3RyaWRlX3JnYiA9IFBsYW5lSW4tPnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfMnJnYiA9IHUzMl9zdHJpZGVfcmdiIDw8IDE7Ci0KLSAgICAvKiBsb29wIG9uIGVhY2ggcm93IG9mIHRoZSBvdXRwdXQgaW1hZ2UsIGlucHV0IGNvb3JkaW5hdGVzIGFyZSBlc3RpbWF0ZWQgZnJvbSBvdXRwdXQgb25lcyAqLwotICAgIC8qIHR3byBZVVYgcm93cyBhcmUgY29tcHV0ZWQgYXQgZWFjaCBwYXNzICovCi0gICAgZm9yICh1MzJfcm93ID0gdTMyX2hlaWdodCA7dTMyX3JvdyAhPSAwOyB1MzJfcm93IC09MikKLSAgICB7Ci0gICAgICAgIC8qIHVwZGF0ZSB3b3JraW5nIHBvaW50ZXJzICovCi0gICAgICAgIHB1OF95biAgPSBwdThfeV9kYXRhOwotICAgICAgICBwdThfeXMgID0gcHU4X3luICsgdTMyX3N0cmlkZV9ZOwotCi0gICAgICAgIHB1OF91ICAgPSBwdThfdV9kYXRhOwotICAgICAgICBwdThfdiAgID0gcHU4X3ZfZGF0YTsKLQotICAgICAgICBwdThfcmdibj0gcHU4X3JnYm5fZGF0YTsKLQotICAgICAgICAvKiBsb29wIG9uIGVhY2ggY29sdW1uIG9mIHRoZSBvdXRwdXQgaW1hZ2UqLwotICAgICAgICBmb3IgKHUzMl9jb2wgPSB1MzJfd2lkdGg7IHUzMl9jb2wgIT0gMCA7IHUzMl9jb2wgLT0yKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBnZXQgUkdCIHNhbXBsZXMgb2YgNCBwaXhlbHMgKi8KLSAgICAgICAgICAgIEdFVF9SR0IyNChpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwLCBwdThfcmdibiwgMCk7Ci0gICAgICAgICAgICBHRVRfUkdCMjQoaTMyX3IxMCwgaTMyX2cxMCwgaTMyX2IxMCwgcHU4X3JnYm4sIENTVF9SR0JfMjRfU0laRSk7Ci0gICAgICAgICAgICBHRVRfUkdCMjQoaTMyX3IwMSwgaTMyX2cwMSwgaTMyX2IwMSwgcHU4X3JnYm4sIHUzMl9zdHJpZGVfcmdiKTsKLSAgICAgICAgICAgIEdFVF9SR0IyNChpMzJfcjExLCBpMzJfZzExLCBpMzJfYjExLCBwdThfcmdibiwgdTMyX3N0cmlkZV9yZ2IgKyBDU1RfUkdCXzI0X1NJWkUpOwotCi0gICAgICAgICAgICBpMzJfdTAwID0gVTI0KGkzMl9yMDAsIGkzMl9nMDAsIGkzMl9iMDApOwotICAgICAgICAgICAgaTMyX3YwMCA9IFYyNChpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwKTsKLSAgICAgICAgICAgIGkzMl95MDAgPSBZMjQoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7ICAgICAgIC8qIG1hdHJpeCBsdW1pbmFuY2UgKi8KLSAgICAgICAgICAgIHB1OF95blswXT0gKE00VklGSV9VSW50OClpMzJfeTAwOwotCi0gICAgICAgICAgICBpMzJfdTEwID0gVTI0KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotICAgICAgICAgICAgaTMyX3YxMCA9IFYyNChpMzJfcjEwLCBpMzJfZzEwLCBpMzJfYjEwKTsKLSAgICAgICAgICAgIGkzMl95MTAgPSBZMjQoaTMyX3IxMCwgaTMyX2cxMCwgaTMyX2IxMCk7Ci0gICAgICAgICAgICBwdThfeW5bMV09IChNNFZJRklfVUludDgpaTMyX3kxMDsKLQotICAgICAgICAgICAgaTMyX3UwMSA9IFUyNChpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLSAgICAgICAgICAgIGkzMl92MDEgPSBWMjQoaTMyX3IwMSwgaTMyX2cwMSwgaTMyX2IwMSk7Ci0gICAgICAgICAgICBpMzJfeTAxID0gWTI0KGkzMl9yMDEsIGkzMl9nMDEsIGkzMl9iMDEpOwotICAgICAgICAgICAgcHU4X3lzWzBdPSAoTTRWSUZJX1VJbnQ4KWkzMl95MDE7Ci0KLSAgICAgICAgICAgIGkzMl91MTEgPSBVMjQoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0gICAgICAgICAgICBpMzJfdjExID0gVjI0KGkzMl9yMTEsIGkzMl9nMTEsIGkzMl9iMTEpOwotICAgICAgICAgICAgaTMyX3kxMSA9IFkyNChpMzJfcjExLCBpMzJfZzExLCBpMzJfYjExKTsKLSAgICAgICAgICAgIHB1OF95c1sxXSA9IChNNFZJRklfVUludDgpaTMyX3kxMTsKLQotICAgICAgICAgICAgKnB1OF91ICA9IChNNFZJRklfVUludDgpKChpMzJfdTAwICsgaTMyX3UwMSArIGkzMl91MTAgKyBpMzJfdTExICsgMikgPj4gMik7Ci0gICAgICAgICAgICAqcHU4X3YgID0gKE00VklGSV9VSW50OCkoKGkzMl92MDAgKyBpMzJfdjAxICsgaTMyX3YxMCArIGkzMl92MTEgKyAyKSA+PiAyKTsKLQotICAgICAgICAgICAgcHU4X3JnYm4gICAgKz0gIChDU1RfUkdCXzI0X1NJWkU8PDEpOwotICAgICAgICAgICAgcHU4X3luICAgICAgKz0gMjsKLSAgICAgICAgICAgIHB1OF95cyAgICAgICs9IDI7Ci0KLSAgICAgICAgICAgIHB1OF91ICsrOwotICAgICAgICAgICAgcHU4X3YgKys7Ci0gICAgICAgIH0gLyogZW5kIG9mIGhvcml6b250YWwgc2Nhbm5pbmcgKi8KLQotICAgICAgICBwdThfeV9kYXRhICAgICAgKz0gdTMyX3N0cmlkZTJfWTsKLSAgICAgICAgcHU4X3VfZGF0YSAgICAgICs9IHUzMl9zdHJpZGVfVTsKLSAgICAgICAgcHU4X3ZfZGF0YSAgICAgICs9IHUzMl9zdHJpZGVfVjsKLSAgICAgICAgcHU4X3JnYm5fZGF0YSAgICs9IHUzMl9zdHJpZGVfMnJnYjsKLQotCi0gICAgfSAvKiBFbmQgb2YgdmVydGljYWwgc2Nhbm5pbmcgKi8KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KLS8qKiBZVVY0MjAgdG8gWVVWNDIwICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMHRvWVVWNDIwICh2b2lkICpwVXNlckRhdGEsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotICogQGJyaWVmICAgVHJhbnNmb3JtIFlVVjQyMCBpbWFnZSB0byBhIFlVVjQyMCBpbWFnZS4KLSAqIEBwYXJhbSAgIHBVc2VyRGF0YTogKElOKSBVc2VyIFNwZWNpZmljIERhdGEgKFVudXNlZCAtIGNvdWxkIGJlIE5VTEwpCi0gKiBAcGFyYW0gICBwUGxhbmVJbjogKElOKSBQb2ludGVyIHRvIFlVViBwbGFuZSBidWZmZXIKLSAqIEBwYXJhbSAgIHBQbGFuZU91dDogKE9VVCkgUG9pbnRlciB0byBZVVYgUGxhbmUKLSAqIEByZXR1cm4gIE00VklGSV9PSzogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDogRXJyb3IgaW4gcGxhbmUgaGVpZ2h0Ci0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDogIEVycm9yIGluIHBsYW5lIHdpZHRoCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLU00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwdG9ZVVY0MjAodm9pZCAqdXNlcl9kYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluWzNdLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQgKQotewotICAgIE00VklGSV9JbnQzMiBwbGFuZV9udW1iZXI7Ci0gICAgTTRWSUZJX1VJbnQzMiBpOwotICAgIE00VklGSV9VSW50OCAqcF9idWZfc3JjLCAqcF9idWZfZGVzdDsKLQotICAgIGZvciAocGxhbmVfbnVtYmVyID0gMDsgcGxhbmVfbnVtYmVyIDwgMzsgcGxhbmVfbnVtYmVyKyspCi0gICAgewotICAgICAgICBwX2J1Zl9zcmMgPSAmKFBsYW5lSW5bcGxhbmVfbnVtYmVyXS5wYWNfZGF0YVtQbGFuZUluW3BsYW5lX251bWJlcl0udV90b3BsZWZ0XSk7Ci0gICAgICAgIHBfYnVmX2Rlc3QgPSAmKFBsYW5lT3V0W3BsYW5lX251bWJlcl0ucGFjX2RhdGFbUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3RvcGxlZnRdKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9oZWlnaHQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcF9idWZfZGVzdCwgKHZvaWQgKilwX2J1Zl9zcmMgLFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICBwX2J1Zl9zcmMgKz0gUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfc3RyaWRlOwotICAgICAgICAgICAgcF9idWZfZGVzdCArPSBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfc3RyaWRlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpCi0gKiBAYXV0aG9yICBEYXZpZCBEYW5hIChQSElMSVBTIFNvZnR3YXJlKQotICogQGJyaWVmICAgUmVzaXplcyBZVVY0MjAgUGxhbmFyIHBsYW5lLgotICogQG5vdGUgICAgQmFzaWMgc3RydWN0dXJlIG9mIHRoZSBmdW5jdGlvbgotICogICAgICAgICAgTG9vcCBvbiBlYWNoIHJvdyAoc3RlcCAyKQotICogICAgICAgICAgICAgIExvb3Agb24gZWFjaCBjb2x1bW4gKHN0ZXAgMikKLSAqICAgICAgICAgICAgICAgICAgR2V0IGZvdXIgWSBzYW1wbGVzIGFuZCAxIFUgJiBWIHNhbXBsZQotICogICAgICAgICAgICAgICAgICBSZXNpemUgdGhlIFkgd2l0aCBjb3JyZXNwb25pbmcgVSBhbmQgViBzYW1wbGVzCi0gKiAgICAgICAgICAgICAgICAgIFBsYWNlIHRoZSBZVVYgaW4gdGhlIG91cHV0IHBsYW5lCi0gKiAgICAgICAgICAgICAgZW5kIGxvb3AgY29sdW1uCi0gKiAgICAgICAgICBlbmQgbG9vcCByb3cKLSAqICAgICAgICAgIEZvciByZXNpemluZyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIGxpbmVhcmx5IGludGVycG9sYXRlcyBhbG9uZwotICogICAgICAgICAgZWFjaCByb3csIGFuZCB0aGVuIHVzZXMgdGhhdCByZXN1bHQgaW4gYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBkb3duIGVhY2ggY29sdW1uLgotICogICAgICAgICAgRWFjaCBlc3RpbWF0ZWQgcGl4ZWwgaW4gdGhlIG91dHB1dCBpbWFnZSBpcyBhIHdlaWdodGVkCi0gKiAgICAgICAgICBjb21iaW5hdGlvbiBvZiBpdHMgZm91ciBuZWlnaGJvdXJzLiBUaGUgcmF0aW8gb2YgY29tcHJlc3Npb24KLSAqICAgICAgICAgIG9yIGRpbGF0YXRpb24gaXMgZXN0aW1hdGVkIHVzaW5nIGlucHV0IGFuZCBvdXRwdXQgc2l6ZXMuCi0gKiBAcGFyYW0gICBwVXNlckRhdGE6IChJTikgVXNlciBEYXRhCi0gKiBAcGFyYW0gICBwUGxhbmVJbjogKElOKSBQb2ludGVyIHRvIFlVVjQyMCAoUGxhbmFyKSBwbGFuZSBidWZmZXIKLSAqIEBwYXJhbSAgIHBQbGFuZU91dDogKE9VVCkgUG9pbnRlciB0byBZVVY0MjAgKFBsYW5hcikgcGxhbmUKLSAqIEByZXR1cm4gIE00VklGSV9PSzogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDogRXJyb3IgaW4gaGVpZ2h0Ci0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDogIEVycm9yIGluIHdpZHRoCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNFZJRklfVUludDggICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotewotICAgIE00VklGSV9VSW50OCAgICAqcHU4X2RhdGFfaW4sICpwdThfZGF0YV9vdXQsICpwdThkdW07Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9wbGFuZTsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3dpZHRoX2luLCB1MzJfd2lkdGhfb3V0LCB1MzJfaGVpZ2h0X2luLCB1MzJfaGVpZ2h0X291dDsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3N0cmlkZV9pbiwgdTMyX3N0cmlkZV9vdXQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl94X2luYywgdTMyX3lfaW5jOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfeF9hY2N1bSwgdTMyX3lfYWNjdW0sIHUzMl94X2FjY3VtX3N0YXJ0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfd2lkdGgsIHUzMl9oZWlnaHQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl95X2ZyYWM7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl94X2ZyYWM7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl90ZW1wX3ZhbHVlOwotICAgIE00VklGSV9VSW50OCAgICAqcHU4X3NyY190b3A7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfc3JjX2JvdHRvbTsKLQotICAgIE00VklGSV9VSW50OCAgICB1OFdmbGFnID0gMDsKLSAgICBNNFZJRklfVUludDggICAgdThIZmxhZyA9IDA7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIGxvb3AgPSAwOwotCi0KLSAgICAvKgotICAgICBJZiBpbnB1dCB3aWR0aCBpcyBlcXVhbCB0byBvdXRwdXQgd2lkdGggYW5kIGlucHV0IGhlaWdodCBlcXVhbCB0bwotICAgICBvdXRwdXQgaGVpZ2h0IHRoZW4gTTRWSUZJX1lVVjQyMHRvWVVWNDIwIGlzIGNhbGxlZC4KLSAgICAqLwotICAgIGlmICgocFBsYW5lSW5bMF0udV9oZWlnaHQgPT0gcFBsYW5lT3V0WzBdLnVfaGVpZ2h0KSAmJgotICAgICAgICAgICAgICAocFBsYW5lSW5bMF0udV93aWR0aCA9PSBwUGxhbmVPdXRbMF0udV93aWR0aCkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRWSUZJX1lVVjQyMHRvWVVWNDIwKHBVc2VyRGF0YSwgcFBsYW5lSW4sIHBQbGFuZU91dCk7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgZm9yIHRoZSBZVVYgd2lkdGggYW5kIGhlaWdodCBhcmUgZXZlbiAqLwotICAgIGlmICgoSVNfRVZFTihwUGxhbmVJblswXS51X2hlaWdodCkgPT0gRkFMU0UpICAgIHx8Ci0gICAgICAgIChJU19FVkVOKHBQbGFuZU91dFswXS51X2hlaWdodCkgPT0gRkFMU0UpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDsKLSAgICB9Ci0KLSAgICBpZiAoKElTX0VWRU4ocFBsYW5lSW5bMF0udV93aWR0aCkgPT0gRkFMU0UpIHx8Ci0gICAgICAgIChJU19FVkVOKHBQbGFuZU91dFswXS51X3dpZHRoKSA9PSBGQUxTRSkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg7Ci0gICAgfQotCi0gICAgLyogTG9vcCBvbiBwbGFuZXMgKi8KLSAgICBmb3IodTMyX3BsYW5lID0gMDt1MzJfcGxhbmUgPCBQTEFORVM7dTMyX3BsYW5lKyspCi0gICAgewotICAgICAgICAvKiBTZXQgdGhlIHdvcmtpbmcgcG9pbnRlcnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQvb3V0cHV0IGRhdGEgZmllbGQgKi8KLSAgICAgICAgcHU4X2RhdGFfaW4gICAgID0gcFBsYW5lSW5bdTMyX3BsYW5lXS5wYWNfZGF0YSArIHBQbGFuZUluW3UzMl9wbGFuZV0udV90b3BsZWZ0OwotICAgICAgICBwdThfZGF0YV9vdXQgICAgPSBwUGxhbmVPdXRbdTMyX3BsYW5lXS5wYWNfZGF0YSArIHBQbGFuZU91dFt1MzJfcGxhbmVdLnVfdG9wbGVmdDsKLQotICAgICAgICAvKiBHZXQgdGhlIG1lbW9yeSBqdW1wIGNvcnJlc3BvbmRpbmcgdG8gYSByb3cganVtcCAqLwotICAgICAgICB1MzJfc3RyaWRlX2luICAgPSBwUGxhbmVJblt1MzJfcGxhbmVdLnVfc3RyaWRlOwotICAgICAgICB1MzJfc3RyaWRlX291dCAgPSBwUGxhbmVPdXRbdTMyX3BsYW5lXS51X3N0cmlkZTsKLQotICAgICAgICAvKiBTZXQgdGhlIGJvdW5kcyBvZiB0aGUgYWN0aXZlIGltYWdlICovCi0gICAgICAgIHUzMl93aWR0aF9pbiAgICA9IHBQbGFuZUluW3UzMl9wbGFuZV0udV93aWR0aDsKLSAgICAgICAgdTMyX2hlaWdodF9pbiAgID0gcFBsYW5lSW5bdTMyX3BsYW5lXS51X2hlaWdodDsKLQotICAgICAgICB1MzJfd2lkdGhfb3V0ICAgPSBwUGxhbmVPdXRbdTMyX3BsYW5lXS51X3dpZHRoOwotICAgICAgICB1MzJfaGVpZ2h0X291dCAgPSBwUGxhbmVPdXRbdTMyX3BsYW5lXS51X2hlaWdodDsKLQotICAgICAgICAvKgotICAgICAgICBGb3IgdGhlIGNhc2UgLCB3aWR0aF9vdXQgPSB3aWR0aF9pbiAsIHNldCB0aGUgZmxhZyB0byBhdm9pZAotICAgICAgICBhY2Nlc3Npbmcgb25lIGNvbHVtbiBiZXlvbmQgdGhlIGlucHV0IHdpZHRoLkluIHRoaXMgY2FzZSB0aGUgbGFzdAotICAgICAgICBjb2x1bW4gaXMgcmVwbGljYXRlZCBmb3IgcHJvY2Vzc2luZwotICAgICAgICAqLwotICAgICAgICBpZiAodTMyX3dpZHRoX291dCA9PSB1MzJfd2lkdGhfaW4pIHsKLSAgICAgICAgICAgIHUzMl93aWR0aF9vdXQgPSB1MzJfd2lkdGhfb3V0LTE7Ci0gICAgICAgICAgICB1OFdmbGFnID0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENvbXB1dGUgaG9yaXpvbnRhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gd2lkdGguKi8KLSAgICAgICAgaWYgKHUzMl93aWR0aF9vdXQgPj0gdTMyX3dpZHRoX2luKQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzJfeF9pbmMgICA9ICgodTMyX3dpZHRoX2luLTEpICogTUFYX1NIT1JUKSAvICh1MzJfd2lkdGhfb3V0LTEpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdTMyX3hfaW5jICAgPSAodTMyX3dpZHRoX2luICogTUFYX1NIT1JUKSAvICh1MzJfd2lkdGhfb3V0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgIEZvciB0aGUgY2FzZSAsIGhlaWdodF9vdXQgPSBoZWlnaHRfaW4gLCBzZXQgdGhlIGZsYWcgdG8gYXZvaWQKLSAgICAgICAgYWNjZXNzaW5nIG9uZSByb3cgYmV5b25kIHRoZSBpbnB1dCBoZWlnaHQuSW4gdGhpcyBjYXNlIHRoZSBsYXN0Ci0gICAgICAgIHJvdyBpcyByZXBsaWNhdGVkIGZvciBwcm9jZXNzaW5nCi0gICAgICAgICovCi0gICAgICAgIGlmICh1MzJfaGVpZ2h0X291dCA9PSB1MzJfaGVpZ2h0X2luKSB7Ci0gICAgICAgICAgICB1MzJfaGVpZ2h0X291dCA9IHUzMl9oZWlnaHRfb3V0LTE7Ci0gICAgICAgICAgICB1OEhmbGFnID0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENvbXB1dGUgdmVydGljYWwgcmF0aW8gYmV0d2VlbiBzcmMgYW5kIGRlc3RpbmF0aW9uIGhlaWdodC4qLwotICAgICAgICBpZiAodTMyX2hlaWdodF9vdXQgPj0gdTMyX2hlaWdodF9pbikKLSAgICAgICAgewotICAgICAgICAgICAgdTMyX3lfaW5jICAgPSAoKHUzMl9oZWlnaHRfaW4gLSAxKSAqIE1BWF9TSE9SVCkgLyAodTMyX2hlaWdodF9vdXQtMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzJfeV9pbmMgPSAodTMyX2hlaWdodF9pbiAqIE1BWF9TSE9SVCkgLyAodTMyX2hlaWdodF9vdXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgQ2FsY3VsYXRlIGluaXRpYWwgYWNjdW11bGF0b3IgdmFsdWUgOiB1MzJfeV9hY2N1bV9zdGFydC4KLSAgICAgICAgdTMyX3lfYWNjdW1fc3RhcnQgaXMgY29kZWQgb24gMTUgYml0cywgYW5kIHJlcHJlc2VudHMgYSB2YWx1ZQotICAgICAgICBiZXR3ZWVuIDAgYW5kIDAuNQotICAgICAgICAqLwotICAgICAgICBpZiAodTMyX3lfaW5jID49IE1BWF9TSE9SVCkKLSAgICAgICAgewotICAgICAgICAvKgotICAgICAgICBLZWVwIHRoZSBmcmFjdGlvbm5hbCBwYXJ0LCBhc3NpbXVuZyB0aGF0IGludGVnZXIgIHBhcnQgaXMgY29kZWQKLSAgICAgICAgb24gdGhlIDE2IGhpZ2ggYml0cyBhbmQgdGhlIGZyYWN0aW9uYWwgb24gdGhlIDE1IGxvdyBiaXRzCi0gICAgICAgICovCi0gICAgICAgICAgICB1MzJfeV9hY2N1bSA9IHUzMl95X2luYyAmIDB4ZmZmZjsKLQotICAgICAgICAgICAgaWYgKCF1MzJfeV9hY2N1bSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSA9IE1BWF9TSE9SVDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdTMyX3lfYWNjdW0gPj49IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzJfeV9hY2N1bSA9IDA7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8qCi0gICAgICAgIENhbGN1bGF0ZSBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlIDogdTMyX3hfYWNjdW1fc3RhcnQuCi0gICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0IGlzIGNvZGVkIG9uIDE1IGJpdHMsIGFuZCByZXByZXNlbnRzIGEgdmFsdWUKLSAgICAgICAgYmV0d2VlbiAwIGFuZCAwLjUKLSAgICAgICAgKi8KLSAgICAgICAgaWYgKHUzMl94X2luYyA+PSBNQVhfU0hPUlQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID0gdTMyX3hfaW5jICYgMHhmZmZmOwotCi0gICAgICAgICAgICBpZiAoIXUzMl94X2FjY3VtX3N0YXJ0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID0gTUFYX1NIT1JUOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCA+Pj0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHUzMl9oZWlnaHQgPSB1MzJfaGVpZ2h0X291dDsKLQotICAgICAgICAvKgotICAgICAgICBCaWxpbmVhciBpbnRlcnBvbGF0aW9uIGxpbmVhcmx5IGludGVycG9sYXRlcyBhbG9uZyBlYWNoIHJvdywgYW5kCi0gICAgICAgIHRoZW4gdXNlcyB0aGF0IHJlc3VsdCBpbiBhIGxpbmVhciBpbnRlcnBvbGF0aW9uIGRvbncgZWFjaCBjb2x1bW4uCi0gICAgICAgIEVhY2ggZXN0aW1hdGVkIHBpeGVsIGluIHRoZSBvdXRwdXQgaW1hZ2UgaXMgYSB3ZWlnaHRlZCBjb21iaW5hdGlvbgotICAgICAgICBvZiBpdHMgZm91ciBuZWlnaGJvdXJzIGFjY29yZGluZyB0byB0aGUgZm9ybXVsYToKLSAgICAgICAgRihwJyxxJyk9ZihwLHEpUigtYSlSKGIpK2YocCxxLTEpUigtYSlSKGItMSkrZihwKzEscSlSKDEtYSlSKGIpKwotICAgICAgICBmKHArJixxKzEpUigxLWEpUihiLTEpIHdpdGggIFIoeCkgPSAvIHgrMSAgLTEgPTwgeCA9PCAwIFwgMS14Ci0gICAgICAgIDAgPTwgeCA9PCAxIGFuZCBhIChyZXNwLiBiKXdlaWdodGluZyBjb2VmZmljaWVudCBpcyB0aGUgZGlzdGFuY2UKLSAgICAgICAgZnJvbSB0aGUgbmVhcmVzdCBuZWlnaGJvciBpbiB0aGUgcCAocmVzcC4gcSkgZGlyZWN0aW9uCi0gICAgICAgICovCi0KLSAgICAgICAgZG8geyAvKiBTY2FuIGFsbCB0aGUgcm93ICovCi0KLSAgICAgICAgICAgIC8qIFZlcnRpY2FsIHdlaWdodCBmYWN0b3IgKi8KLSAgICAgICAgICAgIHUzMl95X2ZyYWMgPSAodTMyX3lfYWNjdW0+PjEyKSYxNTsKLQotICAgICAgICAgICAgLyogUmVpbml0IGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICB1MzJfeF9hY2N1bSA9IHUzMl94X2FjY3VtX3N0YXJ0OwotCi0gICAgICAgICAgICB1MzJfd2lkdGggPSB1MzJfd2lkdGhfb3V0OwotCi0gICAgICAgICAgICBkbyB7IC8qIFNjYW4gYWxvbmcgZWFjaCByb3cgKi8KLSAgICAgICAgICAgICAgICBwdThfc3JjX3RvcCA9IHB1OF9kYXRhX2luICsgKHUzMl94X2FjY3VtID4+IDE2KTsKLSAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgdTMyX3N0cmlkZV9pbjsKLSAgICAgICAgICAgICAgICB1MzJfeF9mcmFjID0gKHUzMl94X2FjY3VtID4+IDEyKSYxNTsgLyogSG9yaXpvbnRhbCB3ZWlnaHQgZmFjdG9yICovCi0KLSAgICAgICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChwdThfc3JjX3RvcFswXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wWzFdKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHU4X3NyY19ib3R0b21bMF0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbVsxXSp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKE00VklGSV9VSW50OCl1MzJfdGVtcF92YWx1ZTsKLQotICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBob3Jpem9udGFsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgdTMyX3hfYWNjdW0gKz0gdTMyX3hfaW5jOwotICAgICAgICAgICAgfSB3aGlsZSgtLXUzMl93aWR0aCk7Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICBUaGlzIHU4V2ZsYWcgZmxhZyBnZXRzIGluIHRvIGVmZmVjdCBpZiBpbnB1dCBhbmQgb3V0cHV0Ci0gICAgICAgICAgICAgICB3aWR0aCBpcyBzYW1lLCBhbmQgaGVpZ2h0IG1heSBiZSBkaWZmZXJlbnQuIFNvIHByZXZpb3VzCi0gICAgICAgICAgICAgICBwaXhlbCBpcyByZXBsaWNhdGVkIGhlcmUKLSAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAodThXZmxhZykgewotICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQgPSAoTTRWSUZJX1VJbnQ4KXUzMl90ZW1wX3ZhbHVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdThkdW0gPSAocHU4X2RhdGFfb3V0LXUzMl93aWR0aF9vdXQpOwotICAgICAgICAgICAgcHU4X2RhdGFfb3V0ID0gcHU4X2RhdGFfb3V0ICsgdTMyX3N0cmlkZV9vdXQgLSB1MzJfd2lkdGhfb3V0OwotCi0gICAgICAgICAgICAvKiBVcGRhdGUgdmVydGljYWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgIHUzMl95X2FjY3VtICs9IHUzMl95X2luYzsKLSAgICAgICAgICAgIGlmICh1MzJfeV9hY2N1bT4+MTYpIHsKLSAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiA9IHB1OF9kYXRhX2luICsgKHUzMl95X2FjY3VtID4+IDE2KSAqIHUzMl9zdHJpZGVfaW47Ci0gICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gJj0gMHhmZmZmOwotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlKC0tdTMyX2hlaWdodCk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgVGhpcyB1OEhmbGFnIGZsYWcgZ2V0cyBpbiB0byBlZmZlY3QgaWYgaW5wdXQgYW5kIG91dHB1dCBoZWlnaHQKLSAgICAgICAgaXMgc2FtZSwgYW5kIHdpZHRoIG1heSBiZSBkaWZmZXJlbnQuIFNvIHByZXZpb3VzIHBpeGVsIHJvdyBpcwotICAgICAgICByZXBsaWNhdGVkIGhlcmUKLSAgICAgICAgKi8KLSAgICAgICAgaWYgKHU4SGZsYWcpIHsKLSAgICAgICAgICAgIGZvcihsb29wID0wOyBsb29wIDwgKHUzMl93aWR0aF9vdXQrdThXZmxhZyk7IGxvb3ArKykgewotICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpKnB1OGR1bSsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE00VklGSV9PSzsKLX0KLQotTTRPU0FfRVJSIGFwcGx5UmVuZGVyaW5nTW9kZShNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVPdXQsIE00eFZTU19NZWRpYVJlbmRlcmluZyBtZWRpYVJlbmRlcmluZykKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIGlmKG1lZGlhUmVuZGVyaW5nID09IE00eFZTU19rUmVzaXppbmcpCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbCB0aGUgcmVzaXplIGZpbHRlci4gRnJvbSB0aGUgaW50ZXJtZWRpYXRlIGZyYW1lIHRvIHRoZSBlbmNvZGVyIGltYWdlIHBsYW5lICovCi0gICAgICAgIGVyciA9IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvWVVWNDIwKE00T1NBX05VTEwsIHBQbGFuZUluLCBwUGxhbmVPdXQpOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJhcHBseVJlbmRlcmluZ01vZGU6IE00VmlGaWxSZXNpemVCaWxpbmVhcllVVjQyMHRvWVVWNDIwIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNEFJUl9QYXJhbXMgUGFyYW1zOwotICAgICAgICBNNE9TQV9Db250ZXh0IG1fYWlyX2NvbnRleHQ7Ci0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lIHBJbWFnZVBsYW5lc1RlbXBbM107Ci0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVUZW1wOwotICAgICAgICBNNE9TQV9VSW50OCogcE91dFBsYW5lWSA9IHBQbGFuZU91dFswXS5wYWNfZGF0YSArIHBQbGFuZU91dFswXS51X3RvcGxlZnQ7Ci0gICAgICAgIE00T1NBX1VJbnQ4KiBwT3V0UGxhbmVVID0gcFBsYW5lT3V0WzFdLnBhY19kYXRhICsgcFBsYW5lT3V0WzFdLnVfdG9wbGVmdDsKLSAgICAgICAgTTRPU0FfVUludDgqIHBPdXRQbGFuZVYgPSBwUGxhbmVPdXRbMl0ucGFjX2RhdGEgKyBwUGxhbmVPdXRbMl0udV90b3BsZWZ0OwotICAgICAgICBNNE9TQV9VSW50OCogcEluUGxhbmVZID0gTlVMTDsKLSAgICAgICAgTTRPU0FfVUludDgqIHBJblBsYW5lVSA9IE5VTEw7Ci0gICAgICAgIE00T1NBX1VJbnQ4KiBwSW5QbGFuZVYgPSBOVUxMOwotICAgICAgICBNNE9TQV9VSW50MzIgaTsKLQotICAgICAgICAvKnRvIGtlZXAgbWVkaWEgYXNwZWN0IHJhdGlvKi8KLSAgICAgICAgLypJbml0aWFsaXplIEFJUiBQYXJhbXMqLwotICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9IDA7Ci0gICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95ID0gMDsKLSAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gcFBsYW5lSW4tPnVfaGVpZ2h0OwotICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IHBQbGFuZUluLT51X3dpZHRoOwotICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSBwUGxhbmVPdXQtPnVfd2lkdGg7Ci0gICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSBwUGxhbmVPdXQtPnVfaGVpZ2h0OwotICAgICAgICBQYXJhbXMubV9iT3V0cHV0U3RyaXBlID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgIFBhcmFtcy5tX291dHB1dE9yaWVudGF0aW9uID0gTTRDT01NT05fa09yaWVudGF0aW9uVG9wTGVmdDsKLQotICAgICAgICAvKioKLSAgICAgICAgTWVkaWEgcmVuZGVyaW5nOiBCbGFjayBib3JkZXJzKi8KLSAgICAgICAgaWYobWVkaWFSZW5kZXJpbmcgPT0gTTR4VlNTX2tCbGFja0JvcmRlcnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBQbGFuZU91dFswXS5wYWNfZGF0YSxZX1BMQU5FX0JPUkRFUl9WQUxVRSwocFBsYW5lT3V0WzBdLnVfaGVpZ2h0KnBQbGFuZU91dFswXS51X3N0cmlkZSkpOwotICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lT3V0WzFdLnBhY19kYXRhLFVfUExBTkVfQk9SREVSX1ZBTFVFLChwUGxhbmVPdXRbMV0udV9oZWlnaHQqcFBsYW5lT3V0WzFdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwUGxhbmVPdXRbMl0ucGFjX2RhdGEsVl9QTEFORV9CT1JERVJfVkFMVUUsKHBQbGFuZU91dFsyXS51X2hlaWdodCpwUGxhbmVPdXRbMl0udV9zdHJpZGUpKTsKLQotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoID0gcFBsYW5lT3V0WzBdLnVfd2lkdGg7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0ID0gcFBsYW5lT3V0WzBdLnVfaGVpZ2h0OwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3N0cmlkZSA9IHBQbGFuZU91dFswXS51X3dpZHRoOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3RvcGxlZnQgPSAwOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV93aWR0aCA9IHBQbGFuZU91dFsxXS51X3dpZHRoOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCA9IHBQbGFuZU91dFsxXS51X2hlaWdodDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV9zdHJpZGUgPSBwUGxhbmVPdXRbMV0udV93aWR0aDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfd2lkdGggPSBwUGxhbmVPdXRbMl0udV93aWR0aDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQgPSBwUGxhbmVPdXRbMl0udV9oZWlnaHQ7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfc3RyaWRlID0gcFBsYW5lT3V0WzJdLnVfd2lkdGg7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgLyogQWxsb2NhdGVzIHBsYW4gaW4gbG9jYWwgaW1hZ2UgcGxhbmUgc3RydWN0dXJlICovCi0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnBhY19kYXRhID0gKE00T1NBX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoICogcEltYWdlUGxhbmVzVGVtcFswXS51X2hlaWdodCwgTTRWUywgKE00T1NBX0NoYXIqKSJhcHBseVJlbmRlcmluZ01vZGU6IHRlbXBvcmFyeSBwbGFuZSBidWZmZXJZIikgOwotICAgICAgICAgICAgaWYocEltYWdlUGxhbmVzVGVtcFswXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJFcnJvciBhbGxvYyBpbiBhcHBseVJlbmRlcmluZ01vZGUiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnBhY19kYXRhID0gKE00T1NBX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEltYWdlUGxhbmVzVGVtcFsxXS51X3dpZHRoICogcEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCwgTTRWUywgKE00T1NBX0NoYXIqKSJhcHBseVJlbmRlcmluZ01vZGU6IHRlbXBvcmFyeSBwbGFuZSBidWZmZXJVIikgOwotICAgICAgICAgICAgaWYocEltYWdlUGxhbmVzVGVtcFsxXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkVycm9yIGFsbG9jIGluIGFwcGx5UmVuZGVyaW5nTW9kZSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0ucGFjX2RhdGEgPSAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfd2lkdGggKiBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0LCBNNFZTLCAoTTRPU0FfQ2hhciopImFwcGx5UmVuZGVyaW5nTW9kZTogdGVtcG9yYXJ5IHBsYW5lIGJ1ZmZlclYiKSA7Ci0gICAgICAgICAgICBpZihwSW1hZ2VQbGFuZXNUZW1wWzJdLnBhY19kYXRhID09IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRXJyb3IgYWxsb2MgaW4gYXBwbHlSZW5kZXJpbmdNb2RlIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwSW5QbGFuZVkgPSBwSW1hZ2VQbGFuZXNUZW1wWzBdLnBhY19kYXRhIDsKLSAgICAgICAgICAgIHBJblBsYW5lVSA9IHBJbWFnZVBsYW5lc1RlbXBbMV0ucGFjX2RhdGEgOwotICAgICAgICAgICAgcEluUGxhbmVWID0gcEltYWdlUGxhbmVzVGVtcFsyXS5wYWNfZGF0YSA7Ci0KLSAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBJbWFnZVBsYW5lc1RlbXBbMF0ucGFjX2RhdGEsWV9QTEFORV9CT1JERVJfVkFMVUUsKHBJbWFnZVBsYW5lc1RlbXBbMF0udV9oZWlnaHQqcEltYWdlUGxhbmVzVGVtcFswXS51X3N0cmlkZSkpOwotICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcEltYWdlUGxhbmVzVGVtcFsxXS5wYWNfZGF0YSxVX1BMQU5FX0JPUkRFUl9WQUxVRSwocEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCpwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwSW1hZ2VQbGFuZXNUZW1wWzJdLnBhY19kYXRhLFZfUExBTkVfQk9SREVSX1ZBTFVFLChwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0KnBJbWFnZVBsYW5lc1RlbXBbMl0udV9zdHJpZGUpKTsKLQotICAgICAgICAgICAgaWYoKE00T1NBX1VJbnQzMikoKHBQbGFuZUluLT51X2hlaWdodCAqIHBQbGFuZU91dC0+dV93aWR0aCkgL3BQbGFuZUluLT51X3dpZHRoKSA8PSBwUGxhbmVPdXQtPnVfaGVpZ2h0KS8vUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0IDwgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyppdCBpcyBoZWlnaHQgc28gYmxhY2sgYm9yZGVycyB3aWxsIGJlIG9uIHRoZSB0b3AgYW5kIG9uIHRoZSBib3R0b20gc2lkZSovCi0gICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gcFBsYW5lT3V0LT51X3dpZHRoOwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSAoTTRPU0FfVUludDMyKSgocFBsYW5lSW4tPnVfaGVpZ2h0ICogcFBsYW5lT3V0LT51X3dpZHRoKSAvcFBsYW5lSW4tPnVfd2lkdGgpOwotICAgICAgICAgICAgICAgIC8qbnVtYmVyIG9mIGxpbmVzIGF0IHRoZSB0b3AqLwotICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV90b3BsZWZ0ID0gKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0LVBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpPj4xKSkqcEltYWdlUGxhbmVzVGVtcFswXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodDsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfdG9wbGVmdCA9IChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSkpKT4+MSkqcEltYWdlUGxhbmVzVGVtcFsxXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfdG9wbGVmdCA9IChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSkpKT4+MSkqcEltYWdlUGxhbmVzVGVtcFsyXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKml0IGlzIHdpZHRoIHNvIGJsYWNrIGJvcmRlcnMgd2lsbCBiZSBvbiB0aGUgbGVmdCBhbmQgcmlnaHQgc2lkZSovCi0gICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IHBQbGFuZU91dC0+dV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gKE00T1NBX1VJbnQzMikoKHBQbGFuZUluLT51X3dpZHRoICogcFBsYW5lT3V0LT51X2hlaWdodCkgL3BQbGFuZUluLT51X2hlaWdodCk7Ci0KLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfdG9wbGVmdCA9IChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoLVBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCk+PjEpKTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3RvcGxlZnQgPSAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMV0udV93aWR0aC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjE7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3RvcGxlZnQgPSAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qV2lkdGggYW5kIGhlaWdodCBoYXZlIHRvIGJlIGV2ZW4qLwotICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gKFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSAoUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gKFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfd2lkdGggPSAocEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV93aWR0aCA9IChwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3dpZHRoID0gKHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0ID0gKHBJbWFnZVBsYW5lc1RlbXBbMF0udV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCA9IChwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfaGVpZ2h0Pj4xKTw8MTsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQgPSAocEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodD4+MSk8PDE7Ci0KLSAgICAgICAgICAgIC8qQ2hlY2sgdGhhdCB2YWx1ZXMgYXJlIGNvaGVyZW50Ki8KLSAgICAgICAgICAgIGlmKFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9PSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZihQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9PSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBQbGFuZVRlbXAgPSBwSW1hZ2VQbGFuZXNUZW1wOwotCi0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICBNZWRpYSByZW5kZXJpbmc6IENyb3BwaW5nKi8KLSAgICAgICAgaWYobWVkaWFSZW5kZXJpbmcgPT0gTTR4VlNTX2tDcm9wcGluZykKLSAgICAgICAgewotICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IHBQbGFuZU91dC0+dV9oZWlnaHQ7Ci0gICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSBwUGxhbmVPdXQtPnVfd2lkdGg7Ci0gICAgICAgICAgICBpZigoUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCAqIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKSAvUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKmhlaWdodCB3aWxsIGJlIGNyb3BwZWQqLwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9IChNNE9TQV9VSW50MzIpKChQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ICogUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpIC9QYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGgpOwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9IChQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95ID0gKE00T1NBX0ludDMyKSgoTTRPU0FfSW50MzIpKChwUGxhbmVJbi0+dV9oZWlnaHQgLSBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpKT4+MSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyp3aWR0aCB3aWxsIGJlIGNyb3BwZWQqLwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0gKE00T1NBX1VJbnQzMikoKFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCAqIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkgL1BhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpOwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0gKFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9IChNNE9TQV9JbnQzMikoKE00T1NBX0ludDMyKSgocFBsYW5lSW4tPnVfd2lkdGggLSBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkpPj4xKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBQbGFuZVRlbXAgPSBwUGxhbmVPdXQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbCBBSVIgZnVuY3Rpb25zICovCi0gICAgICAgIGVyciA9IE00QUlSX2NyZWF0ZSgmbV9haXJfY29udGV4dCwgTTRBSVJfa1lVVjQyMFApOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiYXBwbHlSZW5kZXJpbmdNb2RlOiBFcnJvciB3aGVuIGluaXRpYWxpemluZyBBSVI6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgZm9yKGk9MDsgaTwzOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYocEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0KLSAgICAgICAgZXJyID0gTTRBSVJfY29uZmlndXJlKG1fYWlyX2NvbnRleHQsICZQYXJhbXMpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiYXBwbHlSZW5kZXJpbmdNb2RlOiBFcnJvciB3aGVuIGNvbmZpZ3VyaW5nIEFJUjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICBNNEFJUl9jbGVhblVwKG1fYWlyX2NvbnRleHQpOwotICAgICAgICAgICAgZm9yKGk9MDsgaTwzOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYocEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IE00QUlSX2dldChtX2Fpcl9jb250ZXh0LCBwUGxhbmVJbiwgcFBsYW5lVGVtcCk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiYXBwbHlSZW5kZXJpbmdNb2RlOiBFcnJvciB3aGVuIGdldHRpbmcgQUlSIHBsYW5lOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIE00QUlSX2NsZWFuVXAobV9haXJfY29udGV4dCk7Ci0gICAgICAgICAgICBmb3IoaT0wOyBpPDM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHBJbWFnZVBsYW5lc1RlbXBbaV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYobWVkaWFSZW5kZXJpbmcgPT0gTTR4VlNTX2tCbGFja0JvcmRlcnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihpPTA7IGk8cFBsYW5lT3V0WzBdLnVfaGVpZ2h0OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcE91dFBsYW5lWSwgKHZvaWQgKilwSW5QbGFuZVksIHBQbGFuZU91dFswXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICBwSW5QbGFuZVkgKz0gcFBsYW5lT3V0WzBdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgcE91dFBsYW5lWSArPSBwUGxhbmVPdXRbMF0udV9zdHJpZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IoaT0wOyBpPHBQbGFuZU91dFsxXS51X2hlaWdodDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBPdXRQbGFuZVUsICh2b2lkICopcEluUGxhbmVVLCBwUGxhbmVPdXRbMV0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgcEluUGxhbmVVICs9IHBQbGFuZU91dFsxXS51X3dpZHRoOwotICAgICAgICAgICAgICAgIHBPdXRQbGFuZVUgKz0gcFBsYW5lT3V0WzFdLnVfc3RyaWRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yKGk9MDsgaTxwUGxhbmVPdXRbMl0udV9oZWlnaHQ7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwT3V0UGxhbmVWLCAodm9pZCAqKXBJblBsYW5lViwgcFBsYW5lT3V0WzJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgIHBJblBsYW5lViArPSBwUGxhbmVPdXRbMl0udV93aWR0aDsKLSAgICAgICAgICAgICAgICBwT3V0UGxhbmVWICs9IHBQbGFuZU91dFsyXS51X3N0cmlkZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yKGk9MDsgaTwzOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYocEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1fYWlyX2NvbnRleHQgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgTTRBSVJfY2xlYW5VcChtX2Fpcl9jb250ZXh0KTsKLSAgICAgICAgICAgIG1fYWlyX2NvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLy9UT0RPOiByZW1vdmUgdGhpcyBjb2RlIGFmdGVyIGxpbmsgd2l0aCB2aWRlb2FydGlzdCBsaWIKLS8qIE00QUlSIGNvZGUqLwotI2RlZmluZSBNNEFJUl9ZVVY0MjBfRk9STUFUX1NVUFBPUlRFRAotI2RlZmluZSBNNEFJUl9ZVVY0MjBBX0ZPUk1BVF9TVVBQT1JURUQKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKiogQ09NUElMQVRJT04gQ0hFQ0tTICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgTTRBSVJfWVVWNDIwX0ZPUk1BVF9TVVBQT1JURUQKLSNpZm5kZWYgTTRBSVJfQkdSNTY1X0ZPUk1BVF9TVVBQT1JURUQKLSNpZm5kZWYgTTRBSVJfUkdCNTY1X0ZPUk1BVF9TVVBQT1JURUQKLSNpZm5kZWYgTTRBSVJfQkdSODg4X0ZPUk1BVF9TVVBQT1JURUQKLSNpZm5kZWYgTTRBSVJfUkdCODg4X0ZPUk1BVF9TVVBQT1JURUQKLSNpZm5kZWYgTTRBSVJfSlBHX0ZPUk1BVF9TVVBQT1JURUQKLQotI2Vycm9yICJQbGVhc2UgZGVmaW5lIGF0IGxlYXN0IG9uZSBpbnB1dCBmb3JtYXQgZm9yIHRoZSBBSVIgY29tcG9uZW50IgotCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKiogTTRBSVIgSU5URVJOQUwgVFlQRVMgREVGSU5JVElPTlMgKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgIE00QUlSX1N0YXRlcwotICogQGJyaWVmICAgICAgIFRoZSBmb2xsb3dpbmcgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgaW50ZXJuYWwgc3RhdGVzIG9mIHRoZSBBSVIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRBSVJfa0NyZWF0ZWQsICAgICAgICAgLyoqPCBTdGF0ZSBhZnRlciBNNEFJUl9jcmVhdGUgaGFzIGJlZW4gY2FsbGVkICovCi0gICAgTTRBSVJfa0NvbmZpZ3VyZWQgICAgICAgICAgIC8qKjwgU3RhdGUgYWZ0ZXIgTTRBSVJfY29uZmlndXJlIGhhcyBiZWVuIGNhbGxlZCAqLwotfU00QUlSX1N0YXRlczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICAgICBNNEFJUl9JbnRlcm5hbENvbnRleHQKLSAqIEBicmllZiAgICAgICBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBpcyB0aGUgaW50ZXJuYWwgY29udGV4dCBvZiB0aGUgQUlSLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRBSVJfU3RhdGVzICAgICAgICAgICAgICAgIG1fc3RhdGU7ICAgICAgICAgICAgLyoqPCBJbnRlcm5hbCBzdGF0ZSAqLwotICAgIE00QUlSX0lucHV0Rm9ybWF0VHlwZSAgIG1faW5wdXRGb3JtYXQ7ICAgICAgLyoqPCBJbnB1dCBmb3JtYXQgbGlrZSBZVVY0MjBQbGFuYXIsIFJHQjU2NSwgSlBHLCBldGMgLi4uICovCi0gICAgTTRBSVJfUGFyYW1zICAgICAgICAgICAgbV9wYXJhbXM7ICAgICAgICAgICAvKio8IEN1cnJlbnQgaW5wdXQgUGFyYW1ldGVyIG9mICB0aGUgcHJvY2Vzc2luZyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHUzMl94X2luY1s0XTsgICAgICAgLyoqPCByYXRpbyBiZXR3ZWVuIGlucHV0IGFuZCBvdXB1dCB3aWR0aCBmb3IgWVVWICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdTMyX3lfaW5jWzRdOyAgICAgICAvKio8IHJhdGlvIGJldHdlZW4gaW5wdXQgYW5kIG91cHV0IGhlaWdodCBmb3IgWVVWICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnRbNF07ICAgLyoqPCBob3Jpem9udGFsIGluaXRpYWwgYWNjdW11bGF0b3IgdmFsdWUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1MzJfeV9hY2N1bV9zdGFydFs0XTsgICAvKio8IFZlcnRpY2FsIGluaXRpYWwgYWNjdW11bGF0b3IgdmFsdWUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1MzJfeF9hY2N1bVs0XTsgICAgIC8qKjwgc2F2ZSBvZiBob3Jpem9udGFsIGFjY3VtdWxhdG9yIHZhbHVlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdTMyX3lfYWNjdW1bNF07ICAgICAvKio8IHNhdmUgb2YgdmVydGljYWwgYWNjdW11bGF0b3IgdmFsdWUgKi8KLSAgICBNNE9TQV9VSW50OCogICAgICAgICAgICBwdThfZGF0YV9pbls0XTsgICAgICAgICAvKio8IFNhdmUgb2YgaW5wdXQgcGxhbmUgcG9pbnRlcnMgaW4gY2FzZSBvZiBzdHJpcGUgbW9kZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1fcHJvY1Jvd3M7ICAgICAgICAgLyoqPCBOdW1iZXIgb2YgcHJvY2Vzc2VkIHJvd3MsIHVzZWQgaW4gc3RyaXBlIG1vZGUgb25seSAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgIG1fYk9ubHlDb3B5OyAgICAgICAgICAgIC8qKjwgRmxhZyB0byBrbm93IGlmIHdlIGp1c3QgcGVyZm9ybSBhIGNvcHkgb3IgYSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgbV9iRmxpcFg7ICAgICAgICAgICAgICAgLyoqPCBEZXBlbmQgb24gb3V0cHV0IG9yaWVudGF0aW9uLCB1c2VkIGR1cmluZyBwcm9jZXNzaW5nIHRvIHJldmVydCBwcm9jZXNzaW5nIG9yZGVyIGluIFggY29vcmRpbmF0ZXMgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICBtX2JGbGlwWTsgICAgICAgICAgICAgICAvKio8IERlcGVuZCBvbiBvdXRwdXQgb3JpZW50YXRpb24sIHVzZWQgZHVyaW5nIHByb2Nlc3NpbmcgdG8gcmV2ZXJ0IHByb2Nlc3Npbmcgb3JkZXIgaW4gWSBjb29yZGluYXRlcyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgIG1fYlJldmVydFhZOyAgICAgICAgICAgIC8qKjwgRGVwZW5kIG9uIG91dHB1dCBvcmllbnRhdGlvbiwgdXNlZCBkdXJpbmcgcHJvY2Vzc2luZyB0byByZXZlcnQgWCBhbmQgWSBwcm9jZXNzaW5nIG9yZGVyICgrLTkwwrAgcm90YXRpb24pICovCi19TTRBSVJfSW50ZXJuYWxDb250ZXh0OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1BQ1JPUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShyZXR2YWwsIHBvaW50ZXIpIGlmICgocG9pbnRlcikgPT0gTTRPU0FfTlVMTCkgcmV0dXJuICgoTTRPU0FfRVJSKShyZXR2YWwpKTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBNNEFJUiBQVUJMSUMgQVBJIElNUExFTUVOVEFUSU9OICoqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRBSVJfY3JlYXRlKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LE00QUlSX0lucHV0Rm9ybWF0VHlwZSBpbnB1dEZvcm1hdCkKLSAqIEBhdXRob3IgIEFybmF1ZCBDb2xsYXJkCi0gKiBAYnJpZWYgICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplIGFuIGluc3RhbmNlIG9mIHRoZSBBSVIuCi0gKiBAcGFyYW0gICBwQ29udGV4dDogICAoSU4vT1VUKSBBZGRyZXNzIG9mIHRoZSBjb250ZXh0IHRvIGNyZWF0ZQotICogQHBhcmFtICAgaW5wdXRGb3JtYXQ6ICAgIChJTikgaW5wdXQgZm9ybWF0IHR5cGUuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KS4gSW52YWxpZCBmb3JtYXRUeXBlCi0gKiBAcmV0dXJuICBNNEVSUl9BTExPQzogTm8gbW9yZSBtZW1vcnkgaXMgYXZhaWxhYmxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QUlSX2NyZWF0ZShNNE9TQV9Db250ZXh0KiBwQ29udGV4dCxNNEFJUl9JbnB1dEZvcm1hdFR5cGUgaW5wdXRGb3JtYXQpCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1IgOwotICAgIE00QUlSX0ludGVybmFsQ29udGV4dCogcEMgPSBNNE9TQV9OVUxMIDsKLSAgICAvKiBDaGVjayB0aGF0IHRoZSBhZGRyZXNzIG9uIHRoZSBjb250ZXh0IGlzIG5vdCBOVUxMICovCi0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfUEFSQU1FVEVSLCBwQ29udGV4dCkgOwotCi0gICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTCA7Ci0KLSAgICAvKiBJbnRlcm5hbCBDb250ZXh0IGNyZWF0aW9uICovCi0gICAgcEMgPSAoTTRBSVJfSW50ZXJuYWxDb250ZXh0KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00QUlSX0ludGVybmFsQ29udGV4dCksIE00QUlSLCAoTTRPU0FfQ2hhciopIkFJUiBpbnRlcm5hbCBjb250ZXh0IikgOwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX0FMTE9DLCBwQykgOwotCi0KLSAgICAvKiBDaGVjayBpZiB0aGUgaW5wdXQgZm9ybWF0IGlzIHN1cHBvcnRlZCAqLwotICAgIHN3aXRjaChpbnB1dEZvcm1hdCkKLSAgICB7Ci0jaWZkZWYgTTRBSVJfWVVWNDIwX0ZPUk1BVF9TVVBQT1JURUQKLSAgICAgICAgY2FzZSBNNEFJUl9rWVVWNDIwUDoKLSAgICAgICAgYnJlYWsgOwotI2VuZGlmCi0jaWZkZWYgTTRBSVJfWVVWNDIwQV9GT1JNQVRfU1VQUE9SVEVECi0gICAgICAgIGNhc2UgTTRBSVJfa1lVVjQyMEFQOgotICAgICAgICBicmVhayA7Ci0jZW5kaWYKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGVyciA9IE00RVJSX0FJUl9GT1JNQVRfTk9UX1NVUFBPUlRFRDsKLSAgICAgICAgICAgIGdvdG8gTTRBSVJfY3JlYXRlX2NsZWFudXAgOwotICAgIH0KLQotICAgIC8qKjwgU2F2ZSBpbnB1dCBmb3JtYXQgYW5kIHVwZGF0ZSBzdGF0ZSAqLwotICAgIHBDLT5tX2lucHV0Rm9ybWF0ID0gaW5wdXRGb3JtYXQ7Ci0gICAgcEMtPm1fc3RhdGUgPSBNNEFJUl9rQ3JlYXRlZDsKLQotICAgIC8qIFJldHVybiB0aGUgY29udGV4dCB0byB0aGUgY2FsbGVyICovCi0gICAgKnBDb250ZXh0ID0gcEMgOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1IgOwotCi1NNEFJUl9jcmVhdGVfY2xlYW51cDoKLSAgICAvKiBFcnJvciBtYW5hZ2VtZW50IDogd2UgZGVzdHJveSB0aGUgY29udGV4dCBpZiBuZWVkZWQgKi8KLSAgICBpZihNNE9TQV9OVUxMICE9IHBDKQotICAgIHsKLSAgICAgICAgZnJlZShwQykgOwotICAgIH0KLQotICAgICpwQ29udGV4dCA9IE00T1NBX05VTEwgOwotCi0gICAgcmV0dXJuIGVyciA7Ci19Ci0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNEFJUl9jbGVhblVwKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi0gKiBAYXV0aG9yICBBcm5hdWQgQ29sbGFyZAotICogQGJyaWVmICAgICAgIFRoaXMgZnVuY3Rpb24gZGVzdHJveXMgYW4gaW5zdGFuY2Ugb2YgdGhlIEFJUiBjb21wb25lbnQKLSAqIEBwYXJhbSAgIHBDb250ZXh0OiAgIChJTikgQ29udGV4dCBpZGVudGlmeWluZyB0aGUgaW5zdGFuY2UgdG8gZGVzdHJveQotICogQHJldHVybiAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkuCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogSW50ZXJuYWwgc3RhdGUgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhpcyBmdW5jdGlvbiBjYWxsLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QUlSX2NsZWFuVXAoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNEFJUl9JbnRlcm5hbENvbnRleHQqIHBDID0gKE00QUlSX0ludGVybmFsQ29udGV4dCopcENvbnRleHQgOwotCi0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfUEFSQU1FVEVSLCBwQ29udGV4dCkgOwotCi0gICAgLyoqPCBDaGVjayBzdGF0ZSAqLwotICAgIGlmKChNNEFJUl9rQ3JlYXRlZCAhPSBwQy0+bV9zdGF0ZSkmJihNNEFJUl9rQ29uZmlndXJlZCAhPSBwQy0+bV9zdGF0ZSkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotICAgIGZyZWUocEMpIDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SIDsKLQotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00QUlSX2NvbmZpZ3VyZShNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNEFJUl9QYXJhbXMqIHBQYXJhbXMpCi0gKiBAYnJpZWYgICAgICAgVGhpcyBmdW5jdGlvbiB3aWxsIGNvbmZpZ3VyZSB0aGUgQUlSLgotICogQG5vdGUgICAgSXQgd2lsbCBzZXQgdGhlIGlucHV0IGFuZCBvdXRwdXQgY29vcmRpbmF0ZXMgYW5kIHNpemVzLAotICogICAgICAgICAgYW5kIGluZGljYXRlcyBpZiB3ZSB3aWxsIHByb2NlZWQgaW4gc3RyaXBlIG9yIG5vdC4KLSAqICAgICAgICAgIEluIGNhc2UgYSBNNEFJUl9nZXQgaW4gc3RyaXBlIG1vZGUgd2FzIG9uIGdvaW5nLCBpdCB3aWxsIGNhbmNlbCB0aGlzIHByZXZpb3VzIHByb2Nlc3NpbmcKLSAqICAgICAgICAgIGFuZCByZXNldCB0aGUgZ2V0IHByb2Nlc3MuCi0gKiBAcGFyYW0gICBwQ29udGV4dDogICAgICAgICAgICAgICAoSU4pIENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIGluc3RhbmNlCi0gKiBAcGFyYW0gICBwUGFyYW1zLT5tX2JPdXRwdXRTdHJpcGU6KElOKSBTdHJpcGUgbW9kZS4KLSAqIEBwYXJhbSAgIHBQYXJhbXMtPm1faW5wdXRDb29yZDogIChJTikgWCxZIGNvb3JkaW5hdGVzIG9mIHRoZSBmaXJzdCB2YWxpZCBwaXhlbCBpbiBpbnB1dC4KLSAqIEBwYXJhbSAgIHBQYXJhbXMtPm1faW5wdXRTaXplOiAgIChJTikgaW5wdXQgUk9JIHNpemUuCi0gKiBAcGFyYW0gICBwUGFyYW1zLT5tX291dHB1dFNpemU6ICAoSU4pIG91dHB1dCBzaXplLgotICogQHJldHVybiAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DOiBObyBtb3JlIG1lbW9yeSBzcGFjZSB0byBhZGQgYSBuZXcgZWZmZWN0LgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KS4KLSAqIEByZXR1cm4gIE00RVJSX0FJUl9GT1JNQVRfTk9UX1NVUFBPUlRFRDogdGhlIHJlcXVlc3RlZCBpbnB1dCBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRBSVJfY29uZmlndXJlKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00QUlSX1BhcmFtcyogcFBhcmFtcykKLXsKLSAgICBNNEFJUl9JbnRlcm5hbENvbnRleHQqIHBDID0gKE00QUlSX0ludGVybmFsQ29udGV4dCopcENvbnRleHQgOwotICAgIE00T1NBX1VJbnQzMiAgICBpLHUzMl93aWR0aF9pbiwgdTMyX3dpZHRoX291dCwgdTMyX2hlaWdodF9pbiwgdTMyX2hlaWdodF9vdXQ7Ci0gICAgTTRPU0FfVUludDMyICAgIG5iX3BsYW5lczsKLQotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcENvbnRleHQpIDsKLQotICAgIGlmKE00QUlSX2tZVVY0MjBBUCA9PSBwQy0+bV9pbnB1dEZvcm1hdCkKLSAgICB7Ci0gICAgICAgIG5iX3BsYW5lcyA9IDQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG5iX3BsYW5lcyA9IDM7Ci0gICAgfQotCi0gICAgLyoqPCBDaGVjayBzdGF0ZSAqLwotICAgIGlmKChNNEFJUl9rQ3JlYXRlZCAhPSBwQy0+bV9zdGF0ZSkmJihNNEFJUl9rQ29uZmlndXJlZCAhPSBwQy0+bV9zdGF0ZSkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyoqIFNhdmUgcGFyYW1ldGVycyAqLwotICAgIHBDLT5tX3BhcmFtcyA9ICpwUGFyYW1zOwotCi0gICAgLyogQ2hlY2sgZm9yIHRoZSBpbnB1dCZvdXRwdXQgd2lkdGggYW5kIGhlaWdodCBhcmUgZXZlbiAqLwotICAgICAgICBpZiggKChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpJjB4MSkgICAgfHwKLSAgICAgICAgICgocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSYweDEpKQotICAgICAgICB7Ci0gICAgICAgICByZXR1cm4gTTRFUlJfQUlSX0lMTEVHQUxfRlJBTUVfU0laRTsKLSAgICAgICAgfQotCi0gICAgaWYoICgocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpJjB4MSkgICAgfHwKLSAgICAgICAgICgocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpJjB4MSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BSVJfSUxMRUdBTF9GUkFNRV9TSVpFOwotICAgICAgICB9Ci0gICAgaWYoKChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkgPT0gKHBDLT5tX3BhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCkpCi0gICAgICAgICYmKChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpID09IChwQy0+bV9wYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0KSkpCi0gICAgewotICAgICAgICAvKio8IE5vIHJlc2l6ZSBpbiB0aGlzIGNhc2UsIHdlIHdpbGwganVzdCBjb3B5IGlucHV0IGluIG91dHB1dCAqLwotICAgICAgICBwQy0+bV9iT25seUNvcHkgPSBNNE9TQV9UUlVFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwQy0+bV9iT25seUNvcHkgPSBNNE9TQV9GQUxTRTsKLQotICAgICAgICAvKio8IEluaXRpYWxpemUgaW50ZXJuYWwgdmFyaWFibGVzIHVzZWQgZm9yIHJlc2l6ZSBmaWx0ZXIgKi8KLSAgICAgICAgZm9yKGk9MDtpPG5iX3BsYW5lcztpKyspCi0gICAgICAgIHsKLQotICAgICAgICAgICAgdTMyX3dpZHRoX2luID0gKChpPT0wKXx8KGk9PTMpKT9wQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV93aWR0aDoocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgrMSk+PjE7Ci0gICAgICAgICAgICB1MzJfaGVpZ2h0X2luID0gKChpPT0wKXx8KGk9PTMpKT9wQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQ6KHBDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCsxKT4+MTsKLSAgICAgICAgICAgIHUzMl93aWR0aF9vdXQgPSAoKGk9PTApfHwoaT09MykpP3BDLT5tX3BhcmFtcy5tX291dHB1dFNpemUubV93aWR0aDoocEMtPm1fcGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoKzEpPj4xOwotICAgICAgICAgICAgdTMyX2hlaWdodF9vdXQgPSAoKGk9PTApfHwoaT09MykpP3BDLT5tX3BhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ6KHBDLT5tX3BhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQrMSk+PjE7Ci0KLSAgICAgICAgICAgICAgICAvKiBDb21wdXRlIGhvcml6b250YWwgcmF0aW8gYmV0d2VlbiBzcmMgYW5kIGRlc3RpbmF0aW9uIHdpZHRoLiovCi0gICAgICAgICAgICAgICAgaWYgKHUzMl93aWR0aF9vdXQgPj0gdTMyX3dpZHRoX2luKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2luY1tpXSAgID0gKCh1MzJfd2lkdGhfaW4tMSkgKiAweDEwMDAwKSAvICh1MzJfd2lkdGhfb3V0LTEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3hfaW5jW2ldICAgPSAodTMyX3dpZHRoX2luICogMHgxMDAwMCkgLyAodTMyX3dpZHRoX291dCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogQ29tcHV0ZSB2ZXJ0aWNhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gaGVpZ2h0LiovCi0gICAgICAgICAgICAgICAgaWYgKHUzMl9oZWlnaHRfb3V0ID49IHUzMl9oZWlnaHRfaW4pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfaW5jW2ldICAgPSAoKHUzMl9oZWlnaHRfaW4gLSAxKSAqIDB4MTAwMDApIC8gKHUzMl9oZWlnaHRfb3V0LTEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfaW5jW2ldID0gKHUzMl9oZWlnaHRfaW4gKiAweDEwMDAwKSAvICh1MzJfaGVpZ2h0X291dCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICBDYWxjdWxhdGUgaW5pdGlhbCBhY2N1bXVsYXRvciB2YWx1ZSA6IHUzMl95X2FjY3VtX3N0YXJ0LgotICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtX3N0YXJ0IGlzIGNvZGVkIG9uIDE1IGJpdHMsIGFuZCByZXByZXNlbnRzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAwLjUKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmIChwQy0+dTMyX3lfaW5jW2ldID49IDB4MTAwMDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgICAgS2VlcCB0aGUgZnJhY3Rpb25uYWwgcGFydCwgYXNzaW11bmcgdGhhdCBpbnRlZ2VyICBwYXJ0IGlzIGNvZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICBvbiB0aGUgMTYgaGlnaCBiaXRzIGFuZCB0aGUgZnJhY3Rpb25uYWwgb24gdGhlIDE1IGxvdyBiaXRzCi0gICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bV9zdGFydFtpXSA9IHBDLT51MzJfeV9pbmNbaV0gJiAweGZmZmY7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFwQy0+dTMyX3lfYWNjdW1fc3RhcnRbaV0pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bV9zdGFydFtpXSA9IDB4MTAwMDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfYWNjdW1fc3RhcnRbaV0gPj49IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bV9zdGFydFtpXSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qKjwgVGFrZSBpbnRvIGFjY291bnQgdGhhdCBZIGNvb3JkaW5hdGUgY2FuIGJlIG9kZAotICAgICAgICAgICAgICAgICAgICBpbiB0aGlzIGNhc2Ugd2UgaGF2ZSB0byBwdXQgYSAwLjUgb2Zmc2V0Ci0gICAgICAgICAgICAgICAgICAgIGZvciBVIGFuZCBWIHBsYW5lIGFzIHRoZXJlIGEgMiB0aW1lcyBzdWItc2FtcGxlZCB2cyBZKi8KLSAgICAgICAgICAgICAgICBpZigocEMtPm1fcGFyYW1zLm1faW5wdXRDb29yZC5tX3kmMHgxKSYmKChpPT0xKXx8KGk9PTIpKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bV9zdGFydFtpXSArPSAweDgwMDA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgQ2FsY3VsYXRlIGluaXRpYWwgYWNjdW11bGF0b3IgdmFsdWUgOiB1MzJfeF9hY2N1bV9zdGFydC4KLSAgICAgICAgICAgICAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgaXMgY29kZWQgb24gMTUgYml0cywgYW5kIHJlcHJlc2VudHMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDAuNQotICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICBpZiAocEMtPnUzMl94X2luY1tpXSA+PSAweDEwMDAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldID0gcEMtPnUzMl94X2luY1tpXSAmIDB4ZmZmZjsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIXBDLT51MzJfeF9hY2N1bV9zdGFydFtpXSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldID0gMHgxMDAwMDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeF9hY2N1bV9zdGFydFtpXSA+Pj0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyoqPCBUYWtlIGludG8gYWNjb3VudCB0aGF0IFggY29vcmRpbmF0ZSBjYW4gYmUgb2RkCi0gICAgICAgICAgICAgICAgICAgIGluIHRoaXMgY2FzZSB3ZSBoYXZlIHRvIHB1dCBhIDAuNSBvZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgZm9yIFUgYW5kIFYgcGxhbmUgYXMgdGhlcmUgYSAyIHRpbWVzIHN1Yi1zYW1wbGVkIHZzIFkqLwotICAgICAgICAgICAgICAgIGlmKChwQy0+bV9wYXJhbXMubV9pbnB1dENvb3JkLm1feCYweDEpJiYoKGk9PTEpfHwoaT09MikpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldICs9IDB4ODAwMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKio8IFJlc2V0IHZhcmlhYmxlIHVzZWQgZm9yIHN0cmlwZSBtb2RlICovCi0gICAgcEMtPm1fcHJvY1Jvd3MgPSAwOwotCi0gICAgLyoqPCBJbml0aWFsaXplIHZhciBmb3IgWC9ZIHByb2Nlc3Npbmcgb3JkZXIgYWNjb3JkaW5nIHRvIG9yaWVudGF0aW9uICovCi0gICAgcEMtPm1fYkZsaXBYID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPm1fYkZsaXBZID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPm1fYlJldmVydFhZID0gTTRPU0FfRkFMU0U7Ci0gICAgc3dpdGNoKHBQYXJhbXMtPm1fb3V0cHV0T3JpZW50YXRpb24pCi0gICAgewotICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblRvcExlZnQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Ub3BSaWdodDoKLSAgICAgICAgICAgIHBDLT5tX2JGbGlwWCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Cb3R0b21SaWdodDoKLSAgICAgICAgICAgIHBDLT5tX2JGbGlwWCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBwQy0+bV9iRmxpcFkgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uQm90dG9tTGVmdDoKLSAgICAgICAgICAgIHBDLT5tX2JGbGlwWSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25MZWZ0VG9wOgotICAgICAgICAgICAgcEMtPm1fYlJldmVydFhZID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblJpZ2h0VG9wOgotICAgICAgICAgICAgcEMtPm1fYlJldmVydFhZID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIHBDLT5tX2JGbGlwWSA9IE00T1NBX1RSVUU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblJpZ2h0Qm90dG9tOgotICAgICAgICAgICAgcEMtPm1fYlJldmVydFhZID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIHBDLT5tX2JGbGlwWCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBwQy0+bV9iRmxpcFkgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uTGVmdEJvdHRvbToKLSAgICAgICAgICAgIHBDLT5tX2JSZXZlcnRYWSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBwQy0+bV9iRmxpcFggPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotICAgIC8qKjwgVXBkYXRlIHN0YXRlICovCi0gICAgcEMtPm1fc3RhdGUgPSBNNEFJUl9rQ29uZmlndXJlZDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SIDsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNEFJUl9nZXQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbiwgTTRWSUZJX0ltYWdlUGxhbmUqIHBPdXQpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcHJvdmlkZSB0aGUgcmVxdWVzdGVkIHJlc2l6ZWQgYXJlYSBvZiBpbnRlcmVzdCBhY2NvcmRpbmcgdG8gc2V0dGluZ3MKLSAqICAgICAgICAgIHByb3ZpZGVkIGluIE00QUlSX2NvbmZpZ3VyZS4KLSAqIEBub3RlICAgIEluIGNhc2UgdGhlIGlucHV0IGZvcm1hdCB0eXBlIGlzIEpQRUcsIGlucHV0IHBsYW5lKHMpCi0gKiAgICAgICAgICBpbiBwSW4gaXMgbm90IHVzZWQuIEluIG5vcm1hbCBtb2RlLCBkaW1lbnNpb24gc3BlY2lmaWVkIGluIG91dHB1dCBwbGFuZShzKSBzdHJ1Y3R1cmUgbXVzdCBiZSB0aGUKLSAqICAgICAgICAgIHNhbWUgdGhhbiB0aGUgb25lIHNwZWNpZmllZCBpbiBNNEFJUl9jb25maWd1cmUuIEluIHN0cmlwZSBtb2RlLCBvbmx5IHRoZSB3aWR0aCB3aWxsIGJlIHRoZSBzYW1lLAotICogICAgICAgICAgaGVpZ2h0IHdpbGwgYmUgdGFrZW4gYXMgdGhlIHN0cmlwZSBoZWlnaHQgKHR5cGljYWxseSAxNikuCi0gKiAgICAgICAgICBJbiBub3JtYWwgbW9kZSwgdGhpcyBmdW5jdGlvbiBpcyBjYWxsIG9uY2UgdG8gZ2V0IHRoZSBmdWxsIG91dHB1dCBwaWN0dXJlLiBJbiBzdHJpcGUgbW9kZSwgaXQgaXMgY2FsbGVkCi0gKiAgICAgICAgICBmb3IgZWFjaCBzdHJpcGUgdGlsbCB0aGUgd2hvbGUgcGljdHVyZSBoYXMgYmVlbiByZXRyaWV2ZWQsYW5kICB0aGUgcG9zaXRpb24gb2YgdGhlIG91dHB1dCBzdHJpcGUgaW4gdGhlIG91dHB1dCBwaWN0dXJlCi0gKiAgICAgICAgICBpcyBpbnRlcm5hbGx5IGluY3JlbWVudGVkIGF0IGVhY2ggc3RlcC4KLSAqICAgICAgICAgIEFueSBjYWxsIHRvIE00QUlSX2NvbmZpZ3VyZSBkdXJpbmcgc3RyaXBlIHByb2Nlc3Mgd2lsbCByZXNldCB0aGlzIG9uZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXQgcGljdHVyZS4KLSAqIEBwYXJhbSAgIHBDb250ZXh0OiAgIChJTikgQ29udGV4dCBpZGVudGlmeWluZyB0aGUgaW5zdGFuY2UKLSAqIEBwYXJhbSAgIHBJbjogICAgICAgICAgICAoSU4pIFBsYW5lIHN0cnVjdHVyZSBjb250YWluaW5nIGlucHV0IFBsYW5lKHMpLgotICogQHBhcmFtICAgcE91dDogICAgICAgKElOL09VVCkgIFBsYW5lIHN0cnVjdHVyZSBjb250YWluaW5nIG91dHB1dCBQbGFuZShzKS4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9BTExPQzogTm8gbW9yZSBtZW1vcnkgc3BhY2UgdG8gYWRkIGEgbmV3IGVmZmVjdC4KLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QUlSX2dldChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSogcEluLCBNNFZJRklfSW1hZ2VQbGFuZSogcE91dCkKLXsKLSAgICBNNEFJUl9JbnRlcm5hbENvbnRleHQqIHBDID0gKE00QUlSX0ludGVybmFsQ29udGV4dCopcENvbnRleHQgOwotICAgIE00T1NBX1VJbnQzMiBpLGosayx1MzJfeF9mcmFjLHUzMl95X2ZyYWMsdTMyX3hfYWNjdW0sdTMyX3lfYWNjdW0sdTMyX3NoaWZ0OwotICAgICAgICBNNE9TQV9VSW50OCAgICAqcHU4X2RhdGFfaW4sICpwdThfZGF0YV9pbl9vcmcsICpwdThfZGF0YV9pbl90bXAsICpwdThfZGF0YV9vdXQ7Ci0gICAgICAgIE00T1NBX1VJbnQ4ICAgICpwdThfc3JjX3RvcDsKLSAgICAgICAgTTRPU0FfVUludDggICAgKnB1OF9zcmNfYm90dG9tOwotICAgIE00T1NBX1VJbnQzMiAgICB1MzJfdGVtcF92YWx1ZTsKLSAgICBNNE9TQV9JbnQzMiBpMzJfdG1wX29mZnNldDsKLSAgICBNNE9TQV9VSW50MzIgICAgbmJfcGxhbmVzOwotCi0KLQotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcENvbnRleHQpIDsKLQotICAgIC8qKjwgQ2hlY2sgc3RhdGUgKi8KLSAgICBpZihNNEFJUl9rQ29uZmlndXJlZCAhPSBwQy0+bV9zdGF0ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICBpZihNNEFJUl9rWVVWNDIwQVAgPT0gcEMtPm1faW5wdXRGb3JtYXQpCi0gICAgewotICAgICAgICBuYl9wbGFuZXMgPSA0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBuYl9wbGFuZXMgPSAzOwotICAgIH0KLQotICAgIC8qKjwgTG9vcCBvbiBlYWNoIFBsYW5lICovCi0gICAgZm9yKGk9MDtpPG5iX3BsYW5lcztpKyspCi0gICAgewotCi0gICAgICAgICAvKiBTZXQgdGhlIHdvcmtpbmcgcG9pbnRlcnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQvb3V0cHV0IGRhdGEgZmllbGQgKi8KLQotICAgICAgICB1MzJfc2hpZnQgPSAoKGk9PTApfHwoaT09MykpPzA6MTsgLyoqPCBEZXBlbmQgb24gTHVtYSBvciBDaHJvbWEgKi8KLQotICAgICAgICBpZigoTTRPU0FfRkFMU0UgPT0gcEMtPm1fcGFyYW1zLm1fYk91dHB1dFN0cmlwZSl8fCgoTTRPU0FfVFJVRSA9PSBwQy0+bV9wYXJhbXMubV9iT3V0cHV0U3RyaXBlKSYmKDAgPT0gcEMtPm1fcHJvY1Jvd3MpKSkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqPCBGb3IgaW5wdXQsIHRha2UgY2FyZSBhYm91dCBST0kgKi8KLSAgICAgICAgICAgIHB1OF9kYXRhX2luICAgICA9IHBJbltpXS5wYWNfZGF0YSArIHBJbltpXS51X3RvcGxlZnQgKyAocEMtPm1fcGFyYW1zLm1faW5wdXRDb29yZC5tX3g+PnUzMl9zaGlmdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgKHBDLT5tX3BhcmFtcy5tX2lucHV0Q29vcmQubV95ID4+IHUzMl9zaGlmdCkgKiBwSW5baV0udV9zdHJpZGU7Ci0KLSAgICAgICAgICAgIC8qKiBHbyBhdCBlbmQgb2YgbGluZS9jb2x1bW4gaW4gY2FzZSBYL1kgc2Nhbm5pbmcgaXMgZmxpcHBlZCAqLwotICAgICAgICAgICAgaWYoTTRPU0FfVFJVRSA9PSBwQy0+bV9iRmxpcFgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gKz0gKChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCk+PnUzMl9zaGlmdCkgLTEgOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoTTRPU0FfVFJVRSA9PSBwQy0+bV9iRmxpcFkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gKz0gKChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQ+PnUzMl9zaGlmdCkgLTEpICogcEluW2ldLnVfc3RyaWRlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKio8IEluaXRpYWxpemUgYWNjdW11bGF0b3JzIGluIGNhc2Ugd2UgYXJlIHVzaW5nIGl0IChiaWxpbmVhciBpbnRlcnBvbGF0aW9uKSAqLwotICAgICAgICAgICAgaWYoIE00T1NBX0ZBTFNFID09IHBDLT5tX2JPbmx5Q29weSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+dTMyX3hfYWNjdW1baV0gPSBwQy0+dTMyX3hfYWNjdW1fc3RhcnRbaV07Ci0gICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtW2ldID0gcEMtPnUzMl95X2FjY3VtX3N0YXJ0W2ldOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKio8IEluIGNhc2Ugb2Ygc3RyaXBlIG1vZGUgZm9yIG90aGVyIHRoYW4gZmlyc3Qgc3RyaXBlLCB3ZSBuZWVkIHRvIHJlY292ZXIgaW5wdXQgcG9pbnRlciBmcm9tIGludGVybmFsIGNvbnRleHQgKi8KLSAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcEMtPnB1OF9kYXRhX2luW2ldOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqPCBJbiBldmVyeSBtb2RlLCBvdXRwdXQgZGF0YSBhcmUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0IHBsYW5lICovCi0gICAgICAgIHB1OF9kYXRhX291dCAgICA9IHBPdXRbaV0ucGFjX2RhdGEgKyBwT3V0W2ldLnVfdG9wbGVmdDsKLQotICAgICAgICAvKio8IEluaXRpYWxpemUgaW5wdXQgb2Zmc2V0IGFwcGxpZWQgYWZ0ZXIgZWFjaCBwaXhlbCAqLwotICAgICAgICBpZihNNE9TQV9GQUxTRSA9PSBwQy0+bV9iRmxpcFkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGkzMl90bXBfb2Zmc2V0ID0gcEluW2ldLnVfc3RyaWRlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaTMyX3RtcF9vZmZzZXQgPSAtcEluW2ldLnVfc3RyaWRlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqPCBJbiB0aGlzIGNhc2UsIG5vIGJpbGluZWFyIGludGVycG9sYXRpb24gaXMgbmVlZGVkIGFzIGlucHV0IGFuZCBvdXRwdXQgZGltZW5zaW9ucyBhcmUgdGhlIHNhbWUgKi8KLSAgICAgICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPm1fYk9ubHlDb3B5KQotICAgICAgICB7Ci0gICAgICAgICAgICAvKio8IE5vICstOTDCsCByb3RhdGlvbiAqLwotICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYlJldmVydFhZKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKjwgTm8gZmxpcCBvbiBYIGFic2Npc3NhICovCi0gICAgICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYkZsaXBYKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBsb2NfaGVpZ2h0ID0gcE91dFtpXS51X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBsb2Nfd2lkdGggPSBwT3V0W2ldLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgbG9jX3N0cmlkZSA9IHBJbltpXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggcm93ICovCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaj0wOyBqPGxvY19oZWlnaHQ7IGorKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBDb3B5IG9uZSB3aG9sZSBsaW5lICovCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwdThfZGF0YV9vdXQsICh2b2lkICopcHU4X2RhdGFfaW4sIGxvY193aWR0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVXBkYXRlIHBvaW50ZXJzICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9vdXQgKz0gcE91dFtpXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKE00T1NBX0ZBTFNFID09IHBDLT5tX2JGbGlwWSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiArPSBsb2Nfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luIC09IGxvY19zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggcm93ICovCi0gICAgICAgICAgICAgICAgICAgIGZvcihqPTA7ajxwT3V0W2ldLnVfaGVpZ2h0O2orKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggcGl4ZWwgb2YgMSByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcihrPTA7azxwT3V0W2ldLnVfd2lkdGg7aysrKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9ICpwdThfZGF0YV9pbi0tOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKio8IFVwZGF0ZSBwb2ludGVycyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfb3V0ICs9IChwT3V0W2ldLnVfc3RyaWRlIC0gcE91dFtpXS51X3dpZHRoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gKz0gcE91dFtpXS51X3dpZHRoICsgaTMyX3RtcF9vZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKjwgSGVyZSB3ZSBoYXZlIGEgKy05MMKwIHJvdGF0aW9uICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCByb3cgKi8KLSAgICAgICAgICAgICAgICBmb3Ioaj0wO2o8cE91dFtpXS51X2hlaWdodDtqKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbl90bXAgPSBwdThfZGF0YV9pbjsKLQotICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBwaXhlbCBvZiAxIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKnB1OF9kYXRhX2luX3RtcDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBVcGRhdGUgaW5wdXQgcG9pbnRlciBpbiBvcmRlciB0byBnbyB0byBuZXh0L3Bhc3QgbGluZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW5fdG1wICs9IGkzMl90bXBfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqPCBVcGRhdGUgcG9pbnRlcnMgKi8KLSAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfb3V0ICs9IChwT3V0W2ldLnVfc3RyaWRlIC0gcE91dFtpXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYkZsaXBYKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiArKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luIC0tOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qKjwgQmlsaW5lYXIgaW50ZXJwb2xhdGlvbiAqLwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLQotICAgICAgICBpZigzICE9IGkpICAvKio8IG90aGVyIHRoYW4gYWxwaGEgcGxhbmUgKi8KLSAgICAgICAgewotICAgICAgICAgICAgLyoqTm8gKy05MMKwIHJvdGF0aW9uICovCi0gICAgICAgICAgICBpZihNNE9TQV9GQUxTRSA9PSBwQy0+bV9iUmV2ZXJ0WFkpCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCByb3cgKi8KLSAgICAgICAgICAgICAgICBmb3Ioaj0wO2o8cE91dFtpXS51X2hlaWdodDtqKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBWZXJ0aWNhbCB3ZWlnaHQgZmFjdG9yICovCi0gICAgICAgICAgICAgICAgICAgIHUzMl95X2ZyYWMgPSAocEMtPnUzMl95X2FjY3VtW2ldPj4xMikmMTU7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogUmVpbml0IGhvcml6b250YWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfeF9hY2N1bSA9IHBDLT51MzJfeF9hY2N1bV9zdGFydFtpXTsKLQotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKE00T1NBX1RSVUUgPT0gIHBDLT5tX2JGbGlwWCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCBwaXhlbCBpbiBhIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihrPTA7azxwT3V0W2ldLnVfd2lkdGg7aysrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeF9mcmFjID0gKHUzMl94X2FjY3VtID4+IDEyKSYxNTsgLyogRnJhY3Rpb24gb2YgSG9yaXpvbnRhbCB3ZWlnaHQgZmFjdG9yICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3AgPSAocHU4X2RhdGFfaW4gLSAodTMyX3hfYWNjdW0gPj4gMTYpKSAtMSA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b20gPSBwdThfc3JjX3RvcCArIGkzMl90bXBfb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChwdThfc3JjX3RvcFsxXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcFswXSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdThfc3JjX2JvdHRvbVsxXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbVswXSp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpdTMyX3RlbXBfdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIGhvcml6b250YWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3hfYWNjdW0gKz0gcEMtPnUzMl94X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBvdXRwdXQgcGl4ZWwgaW4gYSByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl94X2ZyYWMgPSAodTMyX3hfYWNjdW0gPj4gMTIpJjE1OyAvKiBGcmFjdGlvbiBvZiBIb3Jpem9udGFsIHdlaWdodCBmYWN0b3IgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcCA9IHB1OF9kYXRhX2luICsgKHUzMl94X2FjY3VtID4+IDE2KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgaTMyX3RtcF9vZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWUgPSAoTTRWSUZJX1VJbnQ4KSgoKHB1OF9zcmNfdG9wWzBdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wWzFdKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB1OF9zcmNfYm90dG9tWzBdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tWzFdKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpdTMyX3RlbXBfdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIGhvcml6b250YWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3hfYWNjdW0gKz0gcEMtPnUzMl94X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9vdXQgKz0gcE91dFtpXS51X3N0cmlkZSAtIHBPdXRbaV0udV93aWR0aDsKLQotICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdmVydGljYWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtW2ldICs9IHBDLT51MzJfeV9pbmNbaV07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwQy0+dTMyX3lfYWNjdW1baV0+PjE2KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiA9IHB1OF9kYXRhX2luICsgKHBDLT51MzJfeV9hY2N1bVtpXSA+PiAxNikgKiBpMzJfdG1wX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bVtpXSAmPSAweGZmZmY7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgICAgIC8qKiArLTkwwrAgcm90YXRpb24gKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdThfZGF0YV9pbl9vcmcgPSBwdThfZGF0YV9pbjsKLQotICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCByb3cgKi8KLSAgICAgICAgICAgICAgICBmb3Ioaj0wO2o8cE91dFtpXS51X2hlaWdodDtqKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBob3Jpem9udGFsIHdlaWdodCBmYWN0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3hfZnJhYyA9IChwQy0+dTMyX3hfYWNjdW1baV0+PjEyKSYxNTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBSZWluaXQgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gPSBwQy0+dTMyX3lfYWNjdW1fc3RhcnRbaV07Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoTTRPU0FfVFJVRSA9PSAgcEMtPm1fYkZsaXBYKQotICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCBwaXhlbCBpbiBhIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MDtrPHBPdXRbaV0udV93aWR0aDtrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9mcmFjID0gKHUzMl95X2FjY3VtID4+IDEyKSYxNTsgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcCA9IChwdThfZGF0YV9pbiAtIChwQy0+dTMyX3hfYWNjdW1baV0gPj4gMTYpKSAtIDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgaTMyX3RtcF9vZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChwdThfc3JjX3RvcFsxXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcFswXSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdThfc3JjX2JvdHRvbVsxXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbVswXSp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKE00VklGSV9VSW50OCl1MzJfdGVtcF92YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB2ZXJ0aWNhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtICs9IHBDLT51MzJfeV9pbmNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHUzMl95X2FjY3VtPj4xNikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcHU4X2RhdGFfaW4gKyAodTMyX3lfYWNjdW0gPj4gMTYpICogaTMyX3RtcF9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtICY9IDB4ZmZmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCBwaXhlbCBpbiBhIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MDtrPHBPdXRbaV0udV93aWR0aDtrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9mcmFjID0gKHUzMl95X2FjY3VtID4+IDEyKSYxNTsgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3AgPSBwdThfZGF0YV9pbiArIChwQy0+dTMyX3hfYWNjdW1baV0gPj4gMTYpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b20gPSBwdThfc3JjX3RvcCArIGkzMl90bXBfb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgocHU4X3NyY190b3BbMF0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3BbMV0qdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHU4X3NyY19ib3R0b21bMF0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b21bMV0qdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpdTMyX3RlbXBfdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdmVydGljYWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSArPSBwQy0+dTMyX3lfaW5jW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1MzJfeV9hY2N1bT4+MTYpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiA9IHB1OF9kYXRhX2luICsgKHUzMl95X2FjY3VtID4+IDE2KSAqIGkzMl90bXBfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSAmPSAweGZmZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX291dCArPSBwT3V0W2ldLnVfc3RyaWRlIC0gcE91dFtpXS51X3dpZHRoOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBob3Jpem9udGFsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeF9hY2N1bVtpXSArPSBwQy0+dTMyX3hfaW5jW2ldOwotCi0gICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcHU4X2RhdGFfaW5fb3JnOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgfS8qKiAzICE9IGkgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qKk5vICstOTDCsCByb3RhdGlvbiAqLwotICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYlJldmVydFhZKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggcm93ICovCi0gICAgICAgICAgICAgICAgZm9yKGo9MDtqPHBPdXRbaV0udV9oZWlnaHQ7aisrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfeV9mcmFjID0gKHBDLT51MzJfeV9hY2N1bVtpXT4+MTIpJjE1OwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFJlaW5pdCBob3Jpem9udGFsIHdlaWdodCBmYWN0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3hfYWNjdW0gPSBwQy0+dTMyX3hfYWNjdW1fc3RhcnRbaV07Ci0KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihNNE9TQV9UUlVFID09ICBwQy0+bV9iRmxpcFgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBvdXRwdXQgcGl4ZWwgaW4gYSByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3hfZnJhYyA9ICh1MzJfeF9hY2N1bSA+PiAxMikmMTU7IC8qIEZyYWN0aW9uIG9mIEhvcml6b250YWwgd2VpZ2h0IGZhY3RvciAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wID0gKHB1OF9kYXRhX2luIC0gKHUzMl94X2FjY3VtID4+IDE2KSkgLTEgOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tID0gcHU4X3NyY190b3AgKyBpMzJfdG1wX29mZnNldDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgocHU4X3NyY190b3BbMV0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3BbMF0qdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHU4X3NyY19ib3R0b21bMV0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b21bMF0qdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZT0gKHUzMl90ZW1wX3ZhbHVlID4+IDcpKjB4ZmY7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKE00VklGSV9VSW50OCl1MzJfdGVtcF92YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgaG9yaXpvbnRhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeF9hY2N1bSArPSBwQy0+dTMyX3hfaW5jW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCBwaXhlbCBpbiBhIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihrPTA7azxwT3V0W2ldLnVfd2lkdGg7aysrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3hfZnJhYyA9ICh1MzJfeF9hY2N1bSA+PiAxMikmMTU7IC8qIEZyYWN0aW9uIG9mIEhvcml6b250YWwgd2VpZ2h0IGZhY3RvciAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wID0gcHU4X2RhdGFfaW4gKyAodTMyX3hfYWNjdW0gPj4gMTYpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tID0gcHU4X3NyY190b3AgKyBpMzJfdG1wX29mZnNldDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgocHU4X3NyY190b3BbMF0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3BbMV0qdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHU4X3NyY19ib3R0b21bMF0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b21bMV0qdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZT0gKHUzMl90ZW1wX3ZhbHVlID4+IDcpKjB4ZmY7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKE00VklGSV9VSW50OCl1MzJfdGVtcF92YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgaG9yaXpvbnRhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeF9hY2N1bSArPSBwQy0+dTMyX3hfaW5jW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX291dCArPSBwT3V0W2ldLnVfc3RyaWRlIC0gcE91dFtpXS51X3dpZHRoOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB2ZXJ0aWNhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfYWNjdW1baV0gKz0gcEMtPnUzMl95X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBDLT51MzJfeV9hY2N1bVtpXT4+MTYpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcHU4X2RhdGFfaW4gKyAocEMtPnUzMl95X2FjY3VtW2ldID4+IDE2KSAqIGkzMl90bXBfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtW2ldICY9IDB4ZmZmZjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSAvKio8IE00T1NBX0ZBTFNFID09IHBDLT5tX2JSZXZlcnRYWSAqLwotICAgICAgICAgICAgLyoqICstOTDCsCByb3RhdGlvbiAqLwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luX29yZyA9IHB1OF9kYXRhX2luOwotCi0gICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHJvdyAqLwotICAgICAgICAgICAgICAgIGZvcihqPTA7ajxwT3V0W2ldLnVfaGVpZ2h0O2orKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGhvcml6b250YWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfeF9mcmFjID0gKHBDLT51MzJfeF9hY2N1bVtpXT4+MTIpJjE1OwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFJlaW5pdCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSA9IHBDLT51MzJfeV9hY2N1bV9zdGFydFtpXTsKLQotICAgICAgICAgICAgICAgICAgICBpZihNNE9TQV9UUlVFID09ICBwQy0+bV9iRmxpcFgpCi0gICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHBpeGVsIGluIGEgcm93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2ZyYWMgPSAodTMyX3lfYWNjdW0gPj4gMTIpJjE1OyAvKiBWZXJ0aWNhbCB3ZWlnaHQgZmFjdG9yICovCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wID0gKHB1OF9kYXRhX2luIC0gKHBDLT51MzJfeF9hY2N1bVtpXSA+PiAxNikpIC0gMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tID0gcHU4X3NyY190b3AgKyBpMzJfdG1wX29mZnNldDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWUgPSAoTTRWSUZJX1VJbnQ4KSgoKHB1OF9zcmNfdG9wWzFdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wWzBdKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB1OF9zcmNfYm90dG9tWzFdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tWzBdKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZT0gKHUzMl90ZW1wX3ZhbHVlID4+IDcpKjB4ZmY7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSAoTTRWSUZJX1VJbnQ4KXUzMl90ZW1wX3ZhbHVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHZlcnRpY2FsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gKz0gcEMtPnUzMl95X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodTMyX3lfYWNjdW0+PjE2KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gPSBwdThfZGF0YV9pbiArICh1MzJfeV9hY2N1bSA+PiAxNikgKiBpMzJfdG1wX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gJj0gMHhmZmZmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHBpeGVsIGluIGEgcm93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2ZyYWMgPSAodTMyX3lfYWNjdW0gPj4gMTIpJjE1OyAvKiBWZXJ0aWNhbCB3ZWlnaHQgZmFjdG9yICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcCA9IHB1OF9kYXRhX2luICsgKHBDLT51MzJfeF9hY2N1bVtpXSA+PiAxNik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgaTMyX3RtcF9vZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChwdThfc3JjX3RvcFswXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcFsxXSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdThfc3JjX2JvdHRvbVswXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbVsxXSp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWU9ICh1MzJfdGVtcF92YWx1ZSA+PiA3KSoweGZmOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKE00VklGSV9VSW50OCl1MzJfdGVtcF92YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB2ZXJ0aWNhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtICs9IHBDLT51MzJfeV9pbmNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHUzMl95X2FjY3VtPj4xNikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcHU4X2RhdGFfaW4gKyAodTMyX3lfYWNjdW0gPj4gMTYpICogaTMyX3RtcF9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtICY9IDB4ZmZmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfb3V0ICs9IHBPdXRbaV0udV9zdHJpZGUgLSBwT3V0W2ldLnVfd2lkdGg7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIGhvcml6b250YWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtW2ldICs9IHBDLT51MzJfeF9pbmNbaV07Ci0KLSAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gPSBwdThfZGF0YV9pbl9vcmc7Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSAvKio8IE00T1NBX1RSVUUgPT0gcEMtPm1fYlJldmVydFhZICovCi0gICAgICAgIH0vKiogMyA9PSBpICovCi0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKjwgSW4gY2FzZSBvZiBzdHJpcGUgbW9kZSwgc2F2ZSBjdXJyZW50IGlucHV0IHBvaW50ZXIgKi8KLSAgICAgICAgaWYoTTRPU0FfVFJVRSA9PSBwQy0+bV9wYXJhbXMubV9iT3V0cHV0U3RyaXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+cHU4X2RhdGFfaW5baV0gPSBwdThfZGF0YV9pbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKjwgVXBkYXRlIG51bWJlciBvZiBwcm9jZXNzZWQgcm93cywgcmVzZXQgaXQgaWYgd2UgaGF2ZSBmaW5pc2hlZCB3aXRoIHRoZSB3aG9sZSBwcm9jZXNzaW5nICovCi0gICAgcEMtPm1fcHJvY1Jvd3MgKz0gcE91dFswXS51X2hlaWdodDsKLSAgICBpZihNNE9TQV9GQUxTRSA9PSBwQy0+bV9iUmV2ZXJ0WFkpCi0gICAgewotICAgICAgICBpZihwQy0+bV9wYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0IDw9IHBDLT5tX3Byb2NSb3dzKSAgICBwQy0+bV9wcm9jUm93cyA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmKHBDLT5tX3BhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA8PSBwQy0+bV9wcm9jUm93cykgcEMtPm1fcHJvY1Jvd3MgPSAwOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SIDsKLQotfQotLyorIEhhbmRsZSB0aGUgaW1hZ2UgZmlsZXMgaGVyZSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBMdkdldEltYWdlVGh1bWJOYWlsKE00T1NBX1VDaGFyICpmaWxlTmFtZSwgTTRPU0FfVm9pZCAqKnBCdWZmZXIpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIGdpdmVzIFlVVjQyMCBidWZmZXIgb2YgYSBnaXZlbiBpbWFnZSBmaWxlIChpbiBhcmdiODg4IGZvcm1hdCkKLSAqIEBOb3RlOiBUaGUgY2FsbGVyIG9mIHRoZSBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSB0byBmcmVlIHRoZSB5dXYgYnVmZmVyIGFsbG9jYXRlZAotICogQHBhcmFtICAgZmlsZU5hbWU6ICAgICAgIChJTikgUGF0aCB0byB0aGUgZmlsZW5hbWUgb2YgdGhlIGltYWdlIGFyZ2IgZGF0YQotICogQHBhcmFtICAgaGVpZ2h0OiAgICAgKElOKSBIZWlnaHQgb2YgdGhlIGltYWdlCi0gKiBAcGFyYW0gICAgIHdpZHRoOiAgICAgICAgICAgICAoT1VUKSBwQnVmZmVyIHBvaW50ZXIgdG8gdGhlIGFkZHJlc3Mgd2hlcmUgdGhlIHl1diBkYXRhIGFkZHJlc3MgbmVlZHMgdG8gYmUgcmV0dXJuZWQuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfQUxMT0M6IE5vIG1vcmUgbWVtb3J5IHNwYWNlIHRvIGFkZCBhIG5ldyBlZmZlY3QuCi0gKiBAcmV0dXJuICBNNEVSUl9GSUxFX05PVF9GT1VORDogaWYgdGhlIGZpbGUgcGFzc2VkIGRvZXMgbm90IGV4aXN0cy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTHZHZXRJbWFnZVRodW1iTmFpbChjb25zdCBjaGFyICpmaWxlTmFtZSwgTTRPU0FfVUludDMyIGhlaWdodCwgTTRPU0FfVUludDMyIHdpZHRoLCBNNE9TQV9Wb2lkICoqcEJ1ZmZlcikgewotCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgcmdiUGxhbmUsICp5dXZQbGFuZTsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVTaXplX2FyZ2IgPSAod2lkdGggKiBoZWlnaHQgKiA0KTsgLy8gYXJnYiBkYXRhCi0gICAgTTRPU0FfQ29udGV4dCBsSW1hZ2VGaWxlRnAgID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIE00T1NBX1VJbnQ4ICpwVG1wRGF0YSA9IChNNE9TQV9VSW50OCopIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhmcmFtZVNpemVfYXJnYiwgTTRWUywgKE00T1NBX0NoYXIqKSJJbWFnZSBhcmdiIGRhdGEiKTsKLSAgICBpZihwVG1wRGF0YSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBJbWFnZSBjbGlwIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAgICAvKiogUmVhZCB0aGUgYXJnYiBkYXRhIGZyb20gdGhlIHBhc3NlZCBmaWxlLiAqLwotICAgIE00T1NBX0VSUiBsZXJyID0gTTRPU0FfZmlsZVJlYWRPcGVuKCZsSW1hZ2VGaWxlRnAsIChNNE9TQV9Wb2lkICopIGZpbGVOYW1lLCBNNE9TQV9rRmlsZVJlYWQpOwotCi0gICAgaWYoKGxlcnIgIT0gTTROT19FUlJPUikgfHwgKGxJbWFnZUZpbGVGcCA9PSBNNE9TQV9OVUxMKSkKLSAgICB7Ci0gICAgICAgIEFMT0dFKCJMVlByZXZpZXdDb250cm9sbGVyOiBDYW4gbm90IG9wZW4gdGhlIGZpbGUgIik7Ci0gICAgICAgIGZyZWUocFRtcERhdGEpOwotICAgICAgICByZXR1cm4gTTRFUlJfRklMRV9OT1RfRk9VTkQ7Ci0gICAgfQotICAgIGxlcnIgPSBNNE9TQV9maWxlUmVhZERhdGEobEltYWdlRmlsZUZwLCAoTTRPU0FfTWVtQWRkcjgpcFRtcERhdGEsICZmcmFtZVNpemVfYXJnYik7Ci0gICAgaWYobGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgQUxPR0UoIkxWUHJldmlld0NvbnRyb2xsZXI6IGNhbiBub3QgcmVhZCB0aGUgZGF0YSAiKTsKLSAgICAgICAgTTRPU0FfZmlsZVJlYWRDbG9zZShsSW1hZ2VGaWxlRnApOwotICAgICAgICBmcmVlKHBUbXBEYXRhKTsKLSAgICAgICAgcmV0dXJuIGxlcnI7Ci0gICAgfQotICAgIE00T1NBX2ZpbGVSZWFkQ2xvc2UobEltYWdlRmlsZUZwKTsKLQotICAgIE00T1NBX1VJbnQzMiBmcmFtZVNpemUgPSAod2lkdGggKiBoZWlnaHQgKiAzKTsgLy9TaXplIG9mIFlVVjQyMCBkYXRhLgotICAgIHJnYlBsYW5lLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGZyYW1lU2l6ZSwgTTRWUywgKE00T1NBX0NoYXIqKSJJbWFnZSBjbGlwIFJHQjg4OCBkYXRhIik7Ci0gICAgaWYocmdiUGxhbmUucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBJbWFnZSBjbGlwIik7Ci0gICAgICAgIGZyZWUocFRtcERhdGEpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLyoqIFJlbW92ZSB0aGUgYWxwaGEgY2hhbm5lbCAqLwotICAgIGZvciAoTTRPU0FfVUludDMyIGk9MCwgaiA9IDA7IGkgPCBmcmFtZVNpemVfYXJnYjsgaSsrKSB7Ci0gICAgICAgIGlmICgoaSAlIDQpID09IDApIGNvbnRpbnVlOwotICAgICAgICByZ2JQbGFuZS5wYWNfZGF0YVtqXSA9IHBUbXBEYXRhW2ldOwotICAgICAgICBqKys7Ci0gICAgfQotICAgIGZyZWUocFRtcERhdGEpOwotCi0jaWZkZWYgRklMRV9EVU1QCi0gICAgRklMRSAqZnAgPSBmb3BlbigiL3NkY2FyZC9JbnB1dC90ZXN0X3JnYi5yYXciLCAid2IiKTsKLSAgICBpZihmcCA9PSBOVUxMKQotICAgICAgICBBTE9HRSgiRXJyb3JzIGZpbGUgY2FuIG5vdCBiZSBjcmVhdGVkIik7Ci0gICAgZWxzZSB7Ci0gICAgICAgIGZ3cml0ZShyZ2JQbGFuZS5wYWNfZGF0YSwgZnJhbWVTaXplLCAxLCBmcCk7Ci0gICAgICAgIGZjbG9zZShmcCk7Ci0gICAgfQotI2VuZGlmCi0gICAgICAgIHJnYlBsYW5lLnVfaGVpZ2h0ID0gaGVpZ2h0OwotICAgICAgICByZ2JQbGFuZS51X3dpZHRoID0gd2lkdGg7Ci0gICAgICAgIHJnYlBsYW5lLnVfc3RyaWRlID0gd2lkdGgqMzsKLSAgICAgICAgcmdiUGxhbmUudV90b3BsZWZ0ID0gMDsKLQotICAgICAgICB5dXZQbGFuZSA9IChNNFZJRklfSW1hZ2VQbGFuZSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKDMqc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwKLSAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciopIk00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVVjogT3V0cHV0IHBsYW5lIFlVViIpOwotICAgICAgICB5dXZQbGFuZVswXS51X2hlaWdodCA9IGhlaWdodDsKLSAgICAgICAgeXV2UGxhbmVbMF0udV93aWR0aCA9IHdpZHRoOwotICAgICAgICB5dXZQbGFuZVswXS51X3N0cmlkZSA9IHdpZHRoOwotICAgICAgICB5dXZQbGFuZVswXS51X3RvcGxlZnQgPSAwOwotICAgICAgICB5dXZQbGFuZVswXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyh5dXZQbGFuZVswXS51X2hlaWdodCAqIHl1dlBsYW5lWzBdLnVfd2lkdGggKiAxLjUsIE00VlMsIChNNE9TQV9DaGFyKikiaW1hZ2VDbGlwIFlVViBkYXRhIik7Ci0KLSAgICAgICAgeXV2UGxhbmVbMV0udV9oZWlnaHQgPSB5dXZQbGFuZVswXS51X2hlaWdodCA+PjE7Ci0gICAgICAgIHl1dlBsYW5lWzFdLnVfd2lkdGggPSB5dXZQbGFuZVswXS51X3dpZHRoID4+IDE7Ci0gICAgICAgIHl1dlBsYW5lWzFdLnVfc3RyaWRlID0geXV2UGxhbmVbMV0udV93aWR0aDsKLSAgICAgICAgeXV2UGxhbmVbMV0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgeXV2UGxhbmVbMV0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KikoeXV2UGxhbmVbMF0ucGFjX2RhdGEgKyB5dXZQbGFuZVswXS51X2hlaWdodCAqIHl1dlBsYW5lWzBdLnVfd2lkdGgpOwotCi0gICAgICAgIHl1dlBsYW5lWzJdLnVfaGVpZ2h0ID0geXV2UGxhbmVbMF0udV9oZWlnaHQgPj4xOwotICAgICAgICB5dXZQbGFuZVsyXS51X3dpZHRoID0geXV2UGxhbmVbMF0udV93aWR0aCA+PiAxOwotICAgICAgICB5dXZQbGFuZVsyXS51X3N0cmlkZSA9IHl1dlBsYW5lWzJdLnVfd2lkdGg7Ci0gICAgICAgIHl1dlBsYW5lWzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgIHl1dlBsYW5lWzJdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopKHl1dlBsYW5lWzFdLnBhY19kYXRhICsgeXV2UGxhbmVbMV0udV9oZWlnaHQgKiB5dXZQbGFuZVsxXS51X3dpZHRoKTsKLQotCi0gICAgICAgIGVyciA9IE00VklGSV9SR0I4ODh0b1lVVjQyMChNNE9TQV9OVUxMLCAmcmdiUGxhbmUsIHl1dlBsYW5lKTsKLSAgICAgICAgLy9lcnIgPSBNNFZJRklfQkdSODg4dG9ZVVY0MjAoTTRPU0FfTlVMTCwgJnJnYlBsYW5lLCB5dXZQbGFuZSk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBBTE9HRSgiZXJyb3Igd2hlbiBjb252ZXJ0aW5nIGZyb20gUkdCIHRvIFlVVjogMHgleFxuIiwgKHVuc2lnbmVkIGludCllcnIpOwotICAgICAgICB9Ci0gICAgICAgIGZyZWUocmdiUGxhbmUucGFjX2RhdGEpOwotCi0gICAgICAgIC8vQUxPR0UoIlJHQiB0byBZVVYgZG9uZSIpOwotI2lmZGVmIEZJTEVfRFVNUAotICAgICAgICBGSUxFICpmcDEgPSBmb3BlbigiL3NkY2FyZC9JbnB1dC90ZXN0X3l1di5yYXciLCAid2IiKTsKLSAgICAgICAgaWYoZnAxID09IE5VTEwpCi0gICAgICAgICAgICBBTE9HRSgiRXJyb3JzIGZpbGUgY2FuIG5vdCBiZSBjcmVhdGVkIik7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZndyaXRlKHl1dlBsYW5lWzBdLnBhY19kYXRhLCB5dXZQbGFuZVswXS51X2hlaWdodCAqIHl1dlBsYW5lWzBdLnVfd2lkdGggKiAxLjUsIDEsIGZwMSk7Ci0gICAgICAgICAgICBmY2xvc2UoZnAxKTsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICpwQnVmZmVyID0geXV2UGxhbmVbMF0ucGFjX2RhdGE7Ci0gICAgICAgIGZyZWUoeXV2UGxhbmUpOwotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLQotfQotTTRPU0FfVm9pZCBwcmVwYXJlWVVWNDIwSW1hZ2VQbGFuZShNNFZJRklfSW1hZ2VQbGFuZSAqcGxhbmUsCi0gICAgTTRPU0FfVUludDMyIHdpZHRoLCBNNE9TQV9VSW50MzIgaGVpZ2h0LCBNNFZJRklfVUludDggKmJ1ZmZlciwKLSAgICBNNE9TQV9VSW50MzIgcmVwb3J0ZWRXaWR0aCwgTTRPU0FfVUludDMyIHJlcG9ydGVkSGVpZ2h0KSB7Ci0KLSAgICAvL1kgcGxhbmUKLSAgICBwbGFuZVswXS51X3dpZHRoID0gd2lkdGg7Ci0gICAgcGxhbmVbMF0udV9oZWlnaHQgPSBoZWlnaHQ7Ci0gICAgcGxhbmVbMF0udV9zdHJpZGUgPSByZXBvcnRlZFdpZHRoOwotICAgIHBsYW5lWzBdLnVfdG9wbGVmdCA9IDA7Ci0gICAgcGxhbmVbMF0ucGFjX2RhdGEgPSBidWZmZXI7Ci0KLSAgICAvLyBVIHBsYW5lCi0gICAgcGxhbmVbMV0udV93aWR0aCA9IHdpZHRoLzI7Ci0gICAgcGxhbmVbMV0udV9oZWlnaHQgPSBoZWlnaHQvMjsKLSAgICBwbGFuZVsxXS51X3N0cmlkZSA9IHJlcG9ydGVkV2lkdGggPj4gMTsKLSAgICBwbGFuZVsxXS51X3RvcGxlZnQgPSAwOwotICAgIHBsYW5lWzFdLnBhY19kYXRhID0gYnVmZmVyKyhyZXBvcnRlZFdpZHRoKnJlcG9ydGVkSGVpZ2h0KTsKLQotICAgIC8vIFYgUGxhbmUKLSAgICBwbGFuZVsyXS51X3dpZHRoID0gd2lkdGgvMjsKLSAgICBwbGFuZVsyXS51X2hlaWdodCA9IGhlaWdodC8yOwotICAgIHBsYW5lWzJdLnVfc3RyaWRlID0gcmVwb3J0ZWRXaWR0aCA+PiAxOwotICAgIHBsYW5lWzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgcGxhbmVbMl0ucGFjX2RhdGEgPSBwbGFuZVsxXS5wYWNfZGF0YSArICgocmVwb3J0ZWRXaWR0aC8yKSoocmVwb3J0ZWRIZWlnaHQvMikpOwotfQotCi1NNE9TQV9Wb2lkIHByZXBhcmVZVjEySW1hZ2VQbGFuZShNNFZJRklfSW1hZ2VQbGFuZSAqcGxhbmUsCi0gICAgTTRPU0FfVUludDMyIHdpZHRoLCBNNE9TQV9VSW50MzIgaGVpZ2h0LCBNNE9TQV9VSW50MzIgc3RyaWRlLAotICAgIE00VklGSV9VSW50OCAqYnVmZmVyKSB7Ci0KLSAgICAvL1kgcGxhbmUKLSAgICBwbGFuZVswXS51X3dpZHRoID0gd2lkdGg7Ci0gICAgcGxhbmVbMF0udV9oZWlnaHQgPSBoZWlnaHQ7Ci0gICAgcGxhbmVbMF0udV9zdHJpZGUgPSBzdHJpZGU7Ci0gICAgcGxhbmVbMF0udV90b3BsZWZ0ID0gMDsKLSAgICBwbGFuZVswXS5wYWNfZGF0YSA9IGJ1ZmZlcjsKLQotICAgIC8vIFUgcGxhbmUKLSAgICBwbGFuZVsxXS51X3dpZHRoID0gd2lkdGgvMjsKLSAgICBwbGFuZVsxXS51X2hlaWdodCA9IGhlaWdodC8yOwotICAgIHBsYW5lWzFdLnVfc3RyaWRlID0gYW5kcm9pZDo6UHJldmlld1JlbmRlcmVyOjpBTElHTihwbGFuZVswXS51X3N0cmlkZS8yLCAxNik7Ci0gICAgcGxhbmVbMV0udV90b3BsZWZ0ID0gMDsKLSAgICBwbGFuZVsxXS5wYWNfZGF0YSA9IChidWZmZXIKLSAgICAgICAgICAgICAgICArIHBsYW5lWzBdLnVfaGVpZ2h0ICogcGxhbmVbMF0udV9zdHJpZGUKLSAgICAgICAgICAgICAgICArIChwbGFuZVswXS51X2hlaWdodC8yKSAqIGFuZHJvaWQ6OlByZXZpZXdSZW5kZXJlcjo6QUxJR04oKAotICAgICAgICAgICAgICAgICBwbGFuZVswXS51X3N0cmlkZSAvIDIpLCAxNikpOwotCi0gICAgLy8gViBQbGFuZQotICAgIHBsYW5lWzJdLnVfd2lkdGggPSB3aWR0aC8yOwotICAgIHBsYW5lWzJdLnVfaGVpZ2h0ID0gaGVpZ2h0LzI7Ci0gICAgcGxhbmVbMl0udV9zdHJpZGUgPSBhbmRyb2lkOjpQcmV2aWV3UmVuZGVyZXI6OkFMSUdOKHBsYW5lWzBdLnVfc3RyaWRlLzIsIDE2KTsKLSAgICBwbGFuZVsyXS51X3RvcGxlZnQgPSAwOwotICAgIHBsYW5lWzJdLnBhY19kYXRhID0gKGJ1ZmZlciArCi0gICAgIHBsYW5lWzBdLnVfaGVpZ2h0ICogYW5kcm9pZDo6UHJldmlld1JlbmRlcmVyOjpBTElHTihwbGFuZVswXS51X3N0cmlkZSwgMTYpKTsKLQotCi19Ci0KLU00T1NBX1ZvaWQgc3dhcEltYWdlUGxhbmVzKAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcGxhbmVPdXQsCi0gICAgTTRWSUZJX1VJbnQ4ICpidWZmZXIxLCBNNFZJRklfVUludDggKmJ1ZmZlcjIpIHsKLQotICAgIHBsYW5lSW5bMF0udV9oZWlnaHQgPSBwbGFuZU91dFswXS51X2hlaWdodDsKLSAgICBwbGFuZUluWzBdLnVfd2lkdGggPSBwbGFuZU91dFswXS51X3dpZHRoOwotICAgIHBsYW5lSW5bMF0udV9zdHJpZGUgPSBwbGFuZU91dFswXS51X3N0cmlkZTsKLSAgICBwbGFuZUluWzBdLnVfdG9wbGVmdCA9IHBsYW5lT3V0WzBdLnVfdG9wbGVmdDsKLSAgICBwbGFuZUluWzBdLnBhY19kYXRhID0gcGxhbmVPdXRbMF0ucGFjX2RhdGE7Ci0KLSAgICAvKioKLSAgICAgKiBVIHBsYW5lICovCi0gICAgcGxhbmVJblsxXS51X3dpZHRoID0gcGxhbmVPdXRbMV0udV93aWR0aDsKLSAgICBwbGFuZUluWzFdLnVfaGVpZ2h0ID0gcGxhbmVPdXRbMV0udV9oZWlnaHQ7Ci0gICAgcGxhbmVJblsxXS51X3N0cmlkZSA9IHBsYW5lT3V0WzFdLnVfc3RyaWRlOwotICAgIHBsYW5lSW5bMV0udV90b3BsZWZ0ID0gcGxhbmVPdXRbMV0udV90b3BsZWZ0OwotICAgIHBsYW5lSW5bMV0ucGFjX2RhdGEgPSBwbGFuZU91dFsxXS5wYWNfZGF0YTsKLSAgICAvKioKLSAgICAgKiBWIFBsYW5lICovCi0gICAgcGxhbmVJblsyXS51X3dpZHRoID0gcGxhbmVPdXRbMl0udV93aWR0aDsKLSAgICBwbGFuZUluWzJdLnVfaGVpZ2h0ID0gcGxhbmVPdXRbMl0udV9oZWlnaHQ7Ci0gICAgcGxhbmVJblsyXS51X3N0cmlkZSA9IHBsYW5lT3V0WzJdLnVfc3RyaWRlOwotICAgIHBsYW5lSW5bMl0udV90b3BsZWZ0ID0gcGxhbmVPdXRbMl0udV90b3BsZWZ0OwotICAgIHBsYW5lSW5bMl0ucGFjX2RhdGEgPSBwbGFuZU91dFsyXS5wYWNfZGF0YTsKLQotICAgIGlmKHBsYW5lT3V0WzBdLnBhY19kYXRhID09IChNNFZJRklfVUludDgqKWJ1ZmZlcjEpCi0gICAgewotICAgICAgICBwbGFuZU91dFswXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKWJ1ZmZlcjI7Ci0gICAgICAgIHBsYW5lT3V0WzFdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopKGJ1ZmZlcjIgKwotICAgICAgICAgcGxhbmVPdXRbMF0udV93aWR0aCpwbGFuZU91dFswXS51X2hlaWdodCk7Ci0KLSAgICAgICAgcGxhbmVPdXRbMl0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KikoYnVmZmVyMiArCi0gICAgICAgICBwbGFuZU91dFswXS51X3dpZHRoKnBsYW5lT3V0WzBdLnVfaGVpZ2h0ICsKLSAgICAgICAgIHBsYW5lT3V0WzFdLnVfd2lkdGgqcGxhbmVPdXRbMV0udV9oZWlnaHQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwbGFuZU91dFswXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKWJ1ZmZlcjE7Ci0gICAgICAgIHBsYW5lT3V0WzFdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopKGJ1ZmZlcjEgKwotICAgICAgICAgcGxhbmVPdXRbMF0udV93aWR0aCpwbGFuZU91dFswXS51X2hlaWdodCk7Ci0KLSAgICAgICAgcGxhbmVPdXRbMl0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KikoYnVmZmVyMSArCi0gICAgICAgICBwbGFuZU91dFswXS51X3dpZHRoKnBsYW5lT3V0WzBdLnVfaGVpZ2h0ICsKLSAgICAgICAgIHBsYW5lT3V0WzFdLnVfd2lkdGgqcGxhbmVPdXRbMV0udV9oZWlnaHQpOwotICAgIH0KLQotfQotCi1NNE9TQV9Wb2lkIGNvbXB1dGVQZXJjZW50YWdlRG9uZSgKLSAgICBNNE9TQV9VSW50MzIgY3RzTXMsIE00T1NBX1VJbnQzMiBlZmZlY3RTdGFydFRpbWVNcywKLSAgICBNNE9TQV9VSW50MzIgZWZmZWN0RHVyYXRpb24sIE00T1NBX0RvdWJsZSAqcGVyY2VudGFnZURvbmUpIHsKLQotICAgIE00T1NBX0RvdWJsZSB2aWRlb0VmZmVjdFRpbWUgPTA7Ci0KLSAgICAvLyBDb21wdXRlIGhvdyBmYXIgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBlZmZlY3Qgd2UgYXJlLCBpbiBjbGlwLWJhc2UgdGltZS4KLSAgICB2aWRlb0VmZmVjdFRpbWUgPQotICAgICAoTTRPU0FfSW50MzIpKGN0c01zKyAwLjUpIC0gZWZmZWN0U3RhcnRUaW1lTXM7Ci0KLSAgICAvLyBUbyBjYWxjdWxhdGUgJSwgc3Vic3RyYWN0IHRpbWVJbmNyZW1lbnQKLSAgICAvLyBiZWNhdXNlIGVmZmVjdCBzaG91bGQgZmluaXNoIG9uIHRoZSBsYXN0IGZyYW1lCi0gICAgLy8gd2hpY2ggaXMgZnJvbSBDVFMgPSAoZW9mLXRpbWVJbmNyZW1lbnQpIHRpbGwgQ1RTID0gZW9mCi0gICAgKnBlcmNlbnRhZ2VEb25lID0KLSAgICAgdmlkZW9FZmZlY3RUaW1lIC8gKChNNE9TQV9GbG9hdCllZmZlY3REdXJhdGlvbik7Ci0KLSAgICBpZigqcGVyY2VudGFnZURvbmUgPCAwLjApICpwZXJjZW50YWdlRG9uZSA9IDAuMDsKLSAgICBpZigqcGVyY2VudGFnZURvbmUgPiAxLjApICpwZXJjZW50YWdlRG9uZSA9IDEuMDsKLQotfQotCi0KLU00T1NBX1ZvaWQgY29tcHV0ZVByb2dyZXNzRm9yVmlkZW9FZmZlY3QoCi0gICAgTTRPU0FfVUludDMyIGN0c01zLCBNNE9TQV9VSW50MzIgZWZmZWN0U3RhcnRUaW1lTXMsCi0gICAgTTRPU0FfVUludDMyIGVmZmVjdER1cmF0aW9uLCBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyogZXh0UHJvZ3Jlc3MpIHsKLQotICAgIE00T1NBX0RvdWJsZSBwZXJjZW50YWdlRG9uZSA9MDsKLQotICAgIGNvbXB1dGVQZXJjZW50YWdlRG9uZShjdHNNcywgZWZmZWN0U3RhcnRUaW1lTXMsIGVmZmVjdER1cmF0aW9uLCAmcGVyY2VudGFnZURvbmUpOwotCi0gICAgZXh0UHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgPSAoTTRPU0FfVUludDMyKSggcGVyY2VudGFnZURvbmUgKiAxMDAwICk7Ci0gICAgZXh0UHJvZ3Jlc3MtPnVpT3V0cHV0VGltZSA9IChNNE9TQV9VSW50MzIpKGN0c01zICsgMC41KTsKLSAgICBleHRQcm9ncmVzcy0+dWlDbGlwVGltZSA9IGV4dFByb2dyZXNzLT51aU91dHB1dFRpbWU7Ci0gICAgZXh0UHJvZ3Jlc3MtPmJJc0xhc3QgPSBNNE9TQV9GQUxTRTsKLX0KLQotTTRPU0FfRVJSIHByZXBhcmVGcmFtaW5nU3RydWN0dXJlKAotICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4LAotICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyogZWZmZWN0c1NldHRpbmdzLCBNNE9TQV9VSW50MzIgaW5kZXgsCi0gICAgTTRWSUZJX1VJbnQ4KiBvdmVybGF5UkdCLCBNNFZJRklfVUludDgqIG92ZXJsYXlZVVYpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgLy8gRm9yY2UgaW5wdXQgUkdCIGJ1ZmZlciB0byBldmVuIHNpemUgdG8gYXZvaWQgZXJyb3JzIGluIFlVViBjb252ZXJzaW9uCi0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYiA9IGVmZmVjdHNTZXR0aW5nc1tpbmRleF0ueFZTUy5wRnJhbWluZ0J1ZmZlcjsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aCAmIH4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0ID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQgJiB+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID0gTlVMTDsKLQotICAgIGZyYW1pbmdDdHgtPmR1cmF0aW9uID0gZWZmZWN0c1NldHRpbmdzW2luZGV4XS51aUR1cmF0aW9uOwotICAgIGZyYW1pbmdDdHgtPnRvcGxlZnRfeCA9IGVmZmVjdHNTZXR0aW5nc1tpbmRleF0ueFZTUy50b3BsZWZ0X3g7Ci0gICAgZnJhbWluZ0N0eC0+dG9wbGVmdF95ID0gZWZmZWN0c1NldHRpbmdzW2luZGV4XS54VlNTLnRvcGxlZnRfeTsKLSAgICBmcmFtaW5nQ3R4LT5wQ3VycmVudCA9IGZyYW1pbmdDdHg7Ci0gICAgZnJhbWluZ0N0eC0+cE5leHQgPSBmcmFtaW5nQ3R4OwotICAgIGZyYW1pbmdDdHgtPnByZXZpb3VzQ2xpcFRpbWUgPSAtMTsKLQotICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QgPQotICAgICAoTTR4VlNTX2ludGVybmFsRWZmZWN0c0FscGhhQmxlbmRpbmcqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgIHNpemVvZihNNHhWU1NfaW50ZXJuYWxFZmZlY3RzQWxwaGFCbGVuZGluZyksIE00VlMsCi0gICAgICAoTTRPU0FfQ2hhciopImFscGhhIGJsZW5kaW5nIHN0cnVjdCIpOwotCi0gICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlSW5UaW1lID0KLSAgICAgZWZmZWN0c1NldHRpbmdzW2luZGV4XS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVJblRpbWU7Ci0KLSAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVPdXRUaW1lID0KLSAgICAgZWZmZWN0c1NldHRpbmdzW2luZGV4XS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVPdXRUaW1lOwotCi0gICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9lbmQgPQotICAgICBlZmZlY3RzU2V0dGluZ3NbaW5kZXhdLnhWU1MudWlhbHBoYUJsZW5kaW5nRW5kOwotCi0gICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9taWRkbGUgPQotICAgICBlZmZlY3RzU2V0dGluZ3NbaW5kZXhdLnhWU1MudWlhbHBoYUJsZW5kaW5nTWlkZGxlOwotCi0gICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9zdGFydCA9Ci0gICAgIGVmZmVjdHNTZXR0aW5nc1tpbmRleF0ueFZTUy51aWFscGhhQmxlbmRpbmdTdGFydDsKLQotICAgIC8vIElmIG5ldyBPdmVybGF5IGJ1ZmZlciwgY29udmVydCBmcm9tIFJHQiB0byBZVVYKLSAgICBpZigob3ZlcmxheVJHQiAhPSBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSkgfHwgKG92ZXJsYXlZVVYgPT0gTlVMTCkgKSB7Ci0KLSAgICAgICAgLy8gSWYgWVVWIGJ1ZmZlciBleGlzdHMsIGRlbGV0ZSBpdAotICAgICAgICBpZihvdmVybGF5WVVWICE9IE5VTEwpIHsKLSAgICAgICAgICAgZnJlZShvdmVybGF5WVVWKTsKLSAgICAgICAgICAgb3ZlcmxheVlVViA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICBpZihlZmZlY3RzU2V0dGluZ3NbaW5kZXhdLnhWU1MucmdiVHlwZSA9PSBNNFZTUzNHUFBfa1JHQjU2NSkgewotICAgICAgICAvLyBJbnB1dCBSR0I1NjUgcGxhbmUgaXMgcHJvdmlkZWQsCi0gICAgICAgIC8vIGxldCdzIGNvbnZlcnQgaXQgdG8gWVVWNDIwLCBhbmQgdXBkYXRlIGZyYW1pbmcgc3RydWN0dXJlCi0gICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVVihmcmFtaW5nQ3R4KTsKLSAgICB9Ci0gICAgZWxzZSBpZihlZmZlY3RzU2V0dGluZ3NbaW5kZXhdLnhWU1MucmdiVHlwZSA9PSBNNFZTUzNHUFBfa1JHQjg4OCkgewotICAgICAgICAvLyBJbnB1dCBSR0I4ODggcGxhbmUgaXMgcHJvdmlkZWQsCi0gICAgICAgIC8vIGxldCdzIGNvbnZlcnQgaXQgdG8gWVVWNDIwLCBhbmQgdXBkYXRlIGZyYW1pbmcgc3RydWN0dXJlCi0gICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0I4ODh0b1lVVihmcmFtaW5nQ3R4KTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGVyciA9IE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0gICAgICAgIG92ZXJsYXlZVVYgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhOwotICAgICAgICBvdmVybGF5UkdCID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+cGFjX2RhdGE7Ci0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIEFMT0dWKCIgWVVWIGJ1ZmZlciByZXVzZSIpOwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID0gKE00VklGSV9JbWFnZVBsYW5lKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAzKnNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSksIE00VlMsIChNNE9TQV9DaGFyKikiWVVWIik7Ci0KLSAgICAgICAgaWYoZnJhbWluZ0N0eC0+RnJhbWluZ1l1diA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfd2lkdGggPSBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoOwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0ID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQ7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3N0cmlkZSA9IGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGg7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KilvdmVybGF5WVVWOwotCi0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV93aWR0aCA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X2hlaWdodCA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X2hlaWdodCk+PjE7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3N0cmlkZSA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS5wYWNfZGF0YSA9IGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgKwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3dpZHRoICogZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X2hlaWdodDsKLQotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfd2lkdGggPSAoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aCk+PjE7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV9oZWlnaHQgPSAoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQpPj4xOwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV9zdHJpZGUgPSAoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aCk+PjE7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0ucGFjX2RhdGEgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnBhY19kYXRhICsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV93aWR0aCAqIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV9oZWlnaHQ7Ci0KLSAgICAgICAgZnJhbWluZ0N0eC0+ZHVyYXRpb24gPSAwOwotICAgICAgICBmcmFtaW5nQ3R4LT5wcmV2aW91c0NsaXBUaW1lID0gLTE7Ci0gICAgICAgIGZyYW1pbmdDdHgtPnByZXZpZXdPZmZzZXRDbGlwVGltZSA9IC0xOwotCi0gICAgfQotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBhcHBseUNvbG9yRWZmZWN0KE00eFZTU19WaWRlb0VmZmVjdFR5cGUgY29sb3JFZmZlY3QsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwbGFuZU91dCwKLSAgICBNNFZJRklfVUludDggKmJ1ZmZlcjEsIE00VklGSV9VSW50OCAqYnVmZmVyMiwgTTRPU0FfVUludDE2IHJnYkNvbG9yRGF0YSkgewotCi0gICAgTTR4VlNTX0NvbG9yU3RydWN0IGNvbG9yQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIGNvbG9yQ29udGV4dC5jb2xvckVmZmVjdFR5cGUgPSBjb2xvckVmZmVjdDsKLSAgICBjb2xvckNvbnRleHQucmdiMTZDb2xvckRhdGEgPSByZ2JDb2xvckRhdGE7Ci0KLSAgICBlcnIgPSBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdENvbG9yKAotICAgICAoTTRPU0FfVm9pZCAqKSZjb2xvckNvbnRleHQsIHBsYW5lSW4sIHBsYW5lT3V0LCBOVUxMLAotICAgICBjb2xvckVmZmVjdCk7Ci0KLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICBBTE9HVigiTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RDb2xvciglZCkgZXJyb3IgJWQiLAotICAgICAgICAgICAgY29sb3JFZmZlY3QsIGVycik7Ci0KLSAgICAgICAgaWYoTlVMTCAhPSBidWZmZXIxKSB7Ci0gICAgICAgICAgICBmcmVlKGJ1ZmZlcjEpOwotICAgICAgICAgICAgYnVmZmVyMSA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoTlVMTCAhPSBidWZmZXIyKSB7Ci0gICAgICAgICAgICBmcmVlKGJ1ZmZlcjIpOwotICAgICAgICAgICAgYnVmZmVyMiA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvLyBUaGUgb3V0IHBsYW5lIG5vdyBiZWNvbWVzIHRoZSBpbiBwbGFuZSBmb3IgYWRkaW5nIG90aGVyIGVmZmVjdHMKLSAgICBzd2FwSW1hZ2VQbGFuZXMocGxhbmVJbiwgcGxhbmVPdXQsIGJ1ZmZlcjEsIGJ1ZmZlcjIpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIGFwcGx5THVtYUVmZmVjdChNNFZTUzNHUFBfVmlkZW9FZmZlY3RUeXBlIHZpZGVvRWZmZWN0LAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcGxhbmVPdXQsCi0gICAgTTRWSUZJX1VJbnQ4ICpidWZmZXIxLCBNNFZJRklfVUludDggKmJ1ZmZlcjIsIE00T1NBX0ludDMyIGx1bV9mYWN0b3IpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgZXJyID0gTTRWRkxfbW9kaWZ5THVtYVdpdGhTY2FsZSgKLSAgICAgICAgIChNNFZpQ29tSW1hZ2VQbGFuZSopcGxhbmVJbiwoTTRWaUNvbUltYWdlUGxhbmUqKXBsYW5lT3V0LAotICAgICAgICAgbHVtX2ZhY3RvciwgTlVMTCk7Ci0KLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICBBTE9HRSgiTTRWRkxfbW9kaWZ5THVtYVdpdGhTY2FsZSglZCkgZXJyb3IgJWQiLCB2aWRlb0VmZmVjdCwgKGludCllcnIpOwotCi0gICAgICAgIGlmKE5VTEwgIT0gYnVmZmVyMSkgewotICAgICAgICAgICAgZnJlZShidWZmZXIxKTsKLSAgICAgICAgICAgIGJ1ZmZlcjE9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoTlVMTCAhPSBidWZmZXIyKSB7Ci0gICAgICAgICAgICBmcmVlKGJ1ZmZlcjIpOwotICAgICAgICAgICAgYnVmZmVyMj0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8vIFRoZSBvdXQgcGxhbmUgbm93IGJlY29tZXMgdGhlIGluIHBsYW5lIGZvciBhZGRpbmcgb3RoZXIgZWZmZWN0cwotICAgIHN3YXBJbWFnZVBsYW5lcyhwbGFuZUluLCBwbGFuZU91dCwoTTRWSUZJX1VJbnQ4ICopYnVmZmVyMSwKLSAgICAgKE00VklGSV9VSW50OCAqKWJ1ZmZlcjIpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIGFwcGx5RWZmZWN0c0FuZFJlbmRlcmluZ01vZGUodmVQb3N0UHJvY2Vzc1BhcmFtcyAqcGFyYW1zLAotICAgIE00T1NBX1VJbnQzMiByZXBvcnRlZFdpZHRoLCBNNE9TQV9VSW50MzIgcmVwb3J0ZWRIZWlnaHQpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00VklGSV9JbWFnZVBsYW5lIHBsYW5lSW5bM10sIHBsYW5lT3V0WzNdOwotICAgIE00VklGSV9VSW50OCAqZmluYWxPdXRwdXRCdWZmZXIgPSBOVUxMLCAqdGVtcE91dHB1dEJ1ZmZlcj0gTlVMTDsKLSAgICBNNE9TQV9Eb3VibGUgcGVyY2VudGFnZURvbmUgPTA7Ci0gICAgTTRPU0FfSW50MzIgbHVtX2ZhY3RvcjsKLSAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyBleHRQcm9ncmVzczsKLSAgICBNNHhWU1NfRmlmdGllc1N0cnVjdCBmaWZ0aWVzQ3R4OwotICAgIE00T1NBX1VJbnQzMiBmcmFtZVNpemUgPSAwLCBpPTA7Ci0KLSAgICBmcmFtZVNpemUgPSAocGFyYW1zLT52aWRlb1dpZHRoKnBhcmFtcy0+dmlkZW9IZWlnaHQqMykgPj4gMTsKLQotICAgIGZpbmFsT3V0cHV0QnVmZmVyID0gKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGZyYW1lU2l6ZSwgTTRWUywKLSAgICAgKE00T1NBX0NoYXIqKSgibHZwcCBmaW5hbE91dHB1dEJ1ZmZlciIpKTsKLQotICAgIGlmKGZpbmFsT3V0cHV0QnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoImFwcGx5RWZmZWN0c0FuZFJlbmRlcmluZ01vZGU6IG1hbGxvYyBlcnJvciIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLy8gYWxsb2NhdGUgdGhlIHRlbXBPdXRwdXRCdWZmZXIKLSAgICB0ZW1wT3V0cHV0QnVmZmVyID0gKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAoKHBhcmFtcy0+dmlkZW9IZWlnaHQqcGFyYW1zLT52aWRlb1dpZHRoKjMpPj4xKSwgTTRWUywgKE00T1NBX0NoYXIqKSgibHZwcCBjb2xvckJ1ZmZlciIpKTsKLQotICAgIGlmKHRlbXBPdXRwdXRCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiYXBwbHlFZmZlY3RzQW5kUmVuZGVyaW5nTW9kZTogbWFsbG9jIGVycm9yIHRlbXBPdXRwdXRCdWZmZXIiKTsKLSAgICAgICAgaWYoTlVMTCAhPSBmaW5hbE91dHB1dEJ1ZmZlcikgewotICAgICAgICAgICAgZnJlZShmaW5hbE91dHB1dEJ1ZmZlcik7Ci0gICAgICAgICAgICBmaW5hbE91dHB1dEJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8vIEluaXRpYWxpemUgdGhlIEluIHBsYW5lCi0gICAgcHJlcGFyZVlVVjQyMEltYWdlUGxhbmUocGxhbmVJbiwgcGFyYW1zLT52aWRlb1dpZHRoLCBwYXJhbXMtPnZpZGVvSGVpZ2h0LAotICAgICAgIHBhcmFtcy0+dmlkQnVmZmVyLCByZXBvcnRlZFdpZHRoLCByZXBvcnRlZEhlaWdodCk7Ci0KLSAgICAvLyBJbml0aWFsaXplIHRoZSBPdXQgcGxhbmUKLSAgICBwcmVwYXJlWVVWNDIwSW1hZ2VQbGFuZShwbGFuZU91dCwgcGFyYW1zLT52aWRlb1dpZHRoLCBwYXJhbXMtPnZpZGVvSGVpZ2h0LAotICAgICAgIChNNFZJRklfVUludDggKil0ZW1wT3V0cHV0QnVmZmVyLCBwYXJhbXMtPnZpZGVvV2lkdGgsIHBhcmFtcy0+dmlkZW9IZWlnaHQpOwotCi0gICAgLy8gVGhlIHBsYW5lSW4gY29udGFpbnMgdGhlIFlVVjQyMCBpbnB1dCBkYXRhIHRvIHBvc3Rwcm9jZXNzaW5nIG5vZGUKLSAgICAvLyBhbmQgcGxhbmVPdXQgd2lsbCBjb250YWluIHRoZSBZVVY0MjAgZGF0YSB3aXRoIGVmZmVjdAotICAgIC8vIEluIGVhY2ggc3VjY2Vzc2l2ZSBpZiBjb25kaXRpb24sIGFwcGx5IGZpbHRlciB0byBzdWNjZXNzaXZlCi0gICAgLy8gb3V0cHV0IFlVViBmcmFtZSBzbyB0aGF0IGNvbmN1cnJlbnQgZWZmZWN0cyBhcmUgYm90aCBhcHBsaWVkCi0KLSAgICBpZihwYXJhbXMtPmN1cnJlbnRWaWRlb0VmZmVjdCAmIFZJREVPX0VGRkVDVF9CTEFDS0FORFdISVRFKSB7Ci0gICAgICAgIGVyciA9IGFwcGx5Q29sb3JFZmZlY3QoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQmxhY2tBbmRXaGl0ZSwKLSAgICAgICAgICAgICAgcGxhbmVJbiwgcGxhbmVPdXQsIChNNFZJRklfVUludDggKilmaW5hbE91dHB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgKE00VklGSV9VSW50OCAqKXRlbXBPdXRwdXRCdWZmZXIsIDApOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKHBhcmFtcy0+Y3VycmVudFZpZGVvRWZmZWN0ICYgVklERU9fRUZGRUNUX1BJTkspIHsKLSAgICAgICAgZXJyID0gYXBwbHlDb2xvckVmZmVjdChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9QaW5rLAotICAgICAgICAgICAgICBwbGFuZUluLCBwbGFuZU91dCwgKE00VklGSV9VSW50OCAqKWZpbmFsT3V0cHV0QnVmZmVyLAotICAgICAgICAgICAgICAoTTRWSUZJX1VJbnQ4ICopdGVtcE91dHB1dEJ1ZmZlciwgMCk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYocGFyYW1zLT5jdXJyZW50VmlkZW9FZmZlY3QgJiBWSURFT19FRkZFQ1RfR1JFRU4pIHsKLSAgICAgICAgZXJyID0gYXBwbHlDb2xvckVmZmVjdChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9HcmVlbiwKLSAgICAgICAgICAgICAgcGxhbmVJbiwgcGxhbmVPdXQsIChNNFZJRklfVUludDggKilmaW5hbE91dHB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgKE00VklGSV9VSW50OCAqKXRlbXBPdXRwdXRCdWZmZXIsIDApOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKHBhcmFtcy0+Y3VycmVudFZpZGVvRWZmZWN0ICYgVklERU9fRUZGRUNUX1NFUElBKSB7Ci0gICAgICAgIGVyciA9IGFwcGx5Q29sb3JFZmZlY3QoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfU2VwaWEsCi0gICAgICAgICAgICAgIHBsYW5lSW4sIHBsYW5lT3V0LCAoTTRWSUZJX1VJbnQ4ICopZmluYWxPdXRwdXRCdWZmZXIsCi0gICAgICAgICAgICAgIChNNFZJRklfVUludDggKil0ZW1wT3V0cHV0QnVmZmVyLCAwKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZihwYXJhbXMtPmN1cnJlbnRWaWRlb0VmZmVjdCAmIFZJREVPX0VGRkVDVF9ORUdBVElWRSkgewotICAgICAgICBlcnIgPSBhcHBseUNvbG9yRWZmZWN0KE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX05lZ2F0aXZlLAotICAgICAgICAgICAgICBwbGFuZUluLCBwbGFuZU91dCwgKE00VklGSV9VSW50OCAqKWZpbmFsT3V0cHV0QnVmZmVyLAotICAgICAgICAgICAgICAoTTRWSUZJX1VJbnQ4ICopdGVtcE91dHB1dEJ1ZmZlciwgMCk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYocGFyYW1zLT5jdXJyZW50VmlkZW9FZmZlY3QgJiBWSURFT19FRkZFQ1RfR1JBRElFTlQpIHsKLSAgICAgICAgLy8gZmluZCB0aGUgZWZmZWN0IGluIGVmZmVjdFNldHRpbmdzIGFycmF5Ci0gICAgICAgIGZvcihpPTA7aTxwYXJhbXMtPm51bWJlckVmZmVjdHM7aSsrKSB7Ci0gICAgICAgICAgICBpZihwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS5WaWRlb0VmZmVjdFR5cGUgPT0KLSAgICAgICAgICAgICAoTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSlNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9HcmFkaWVudCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBlcnIgPSBhcHBseUNvbG9yRWZmZWN0KE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyYWRpZW50LAotICAgICAgICAgICAgICBwbGFuZUluLCBwbGFuZU91dCwgKE00VklGSV9VSW50OCAqKWZpbmFsT3V0cHV0QnVmZmVyLAotICAgICAgICAgICAgICAoTTRWSUZJX1VJbnQ4ICopdGVtcE91dHB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgcGFyYW1zLT5lZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy51aVJnYjE2SW5wdXRDb2xvcik7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYocGFyYW1zLT5jdXJyZW50VmlkZW9FZmZlY3QgJiBWSURFT19FRkZFQ1RfQ09MT1JfUkdCMTYpIHsKLSAgICAgICAgLy8gRmluZCB0aGUgZWZmZWN0IGluIGVmZmVjdFNldHRpbmdzIGFycmF5Ci0gICAgICAgIGZvcihpPTA7aTxwYXJhbXMtPm51bWJlckVmZmVjdHM7aSsrKSB7Ci0gICAgICAgICAgICBpZihwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS5WaWRlb0VmZmVjdFR5cGUgPT0KLSAgICAgICAgICAgICAoTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSlNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9Db2xvclJHQjE2KQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGVyciA9IGFwcGx5Q29sb3JFZmZlY3QoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQ29sb3JSR0IxNiwKLSAgICAgICAgICAgICAgcGxhbmVJbiwgcGxhbmVPdXQsIChNNFZJRklfVUludDggKilmaW5hbE91dHB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgKE00VklGSV9VSW50OCAqKXRlbXBPdXRwdXRCdWZmZXIsCi0gICAgICAgICAgICAgIHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLnhWU1MudWlSZ2IxNklucHV0Q29sb3IpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKHBhcmFtcy0+Y3VycmVudFZpZGVvRWZmZWN0ICYgVklERU9fRUZGRUNUX0ZJRlRJRVMpIHsKLSAgICAgICAgLy8gRmluZCB0aGUgZWZmZWN0IGluIGVmZmVjdFNldHRpbmdzIGFycmF5Ci0gICAgICAgIGZvcihpPTA7aTxwYXJhbXMtPm51bWJlckVmZmVjdHM7aSsrKSB7Ci0gICAgICAgICAgICBpZihwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS5WaWRlb0VmZmVjdFR5cGUgPT0KLSAgICAgICAgICAgICAoTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSlNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GaWZ0aWVzKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmKGkgPCBwYXJhbXMtPm51bWJlckVmZmVjdHMpIHsKLSAgICAgICAgICAgIGNvbXB1dGVQcm9ncmVzc0ZvclZpZGVvRWZmZWN0KHBhcmFtcy0+dGltZU1zLAotICAgICAgICAgICAgIHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLnVpU3RhcnRUaW1lLAotICAgICAgICAgICAgIHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLnVpRHVyYXRpb24sICZleHRQcm9ncmVzcyk7Ci0KLSAgICAgICAgICAgIGlmKHBhcmFtcy0+aXNGaWZ0aWVzRWZmZWN0U3RhcnRlZCkgewotICAgICAgICAgICAgICAgIGZpZnRpZXNDdHgucHJldmlvdXNDbGlwVGltZSA9IC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmlmdGllc0N0eC5maWZ0aWVzRWZmZWN0RHVyYXRpb24gPQotICAgICAgICAgICAgIDEwMDAvcGFyYW1zLT5lZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy51aUZpZnRpZXNPdXRGcmFtZVJhdGU7Ci0KLSAgICAgICAgICAgIGZpZnRpZXNDdHguc2hpZnRSYW5kb21WYWx1ZSA9IDA7Ci0gICAgICAgICAgICBmaWZ0aWVzQ3R4LnN0cmlwZVJhbmRvbVZhbHVlID0gMDsKLQotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGaWZ0aWVzKAotICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopJmZpZnRpZXNDdHgsIHBsYW5lSW4sIHBsYW5lT3V0LCAmZXh0UHJvZ3Jlc3MsCi0gICAgICAgICAgICAgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRmlmdGllcyk7Ci0KLSAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIk00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RmlmdGllcyBlcnJvciAweCV4IiwgKHVuc2lnbmVkIGludCllcnIpOwotCi0gICAgICAgICAgICAgICAgaWYoTlVMTCAhPSBmaW5hbE91dHB1dEJ1ZmZlcikgewotICAgICAgICAgICAgICAgICAgICBmcmVlKGZpbmFsT3V0cHV0QnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWxPdXRwdXRCdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihOVUxMICE9IHRlbXBPdXRwdXRCdWZmZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZSh0ZW1wT3V0cHV0QnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcE91dHB1dEJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFRoZSBvdXQgcGxhbmUgbm93IGJlY29tZXMgdGhlIGluIHBsYW5lIGZvciBhZGRpbmcgb3RoZXIgZWZmZWN0cwotICAgICAgICAgICAgc3dhcEltYWdlUGxhbmVzKHBsYW5lSW4sIHBsYW5lT3V0LChNNFZJRklfVUludDggKilmaW5hbE91dHB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAoTTRWSUZJX1VJbnQ4ICopdGVtcE91dHB1dEJ1ZmZlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZihwYXJhbXMtPmN1cnJlbnRWaWRlb0VmZmVjdCAmIFZJREVPX0VGRkVDVF9GUkFNSU5HKSB7Ci0KLSAgICAgICAgTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QgZnJhbWluZ0N0eDsKLSAgICAgICAgLy8gRmluZCB0aGUgZWZmZWN0IGluIGVmZmVjdFNldHRpbmdzIGFycmF5Ci0gICAgICAgIGZvcihpPTA7aTxwYXJhbXMtPm51bWJlckVmZmVjdHM7aSsrKSB7Ci0gICAgICAgICAgICBpZihwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS5WaWRlb0VmZmVjdFR5cGUgPT0KLSAgICAgICAgICAgICAoTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSlNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GcmFtaW5nKSB7Ci0gICAgICAgICAgICAgICAgaWYoKHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLnVpU3RhcnRUaW1lIDw9IHBhcmFtcy0+dGltZU1zICsgcGFyYW1zLT50aW1lT2Zmc2V0KSAmJgotICAgICAgICAgICAgICAgICAgICgocGFyYW1zLT5lZmZlY3RzU2V0dGluZ3NbaV0udWlTdGFydFRpbWUrCi0gICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS51aUR1cmF0aW9uKSA+PSBwYXJhbXMtPnRpbWVNcyArIHBhcmFtcy0+dGltZU9mZnNldCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmKGkgPCBwYXJhbXMtPm51bWJlckVmZmVjdHMpIHsKLSAgICAgICAgICAgIGNvbXB1dGVQcm9ncmVzc0ZvclZpZGVvRWZmZWN0KHBhcmFtcy0+dGltZU1zLAotICAgICAgICAgICAgIHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLnVpU3RhcnRUaW1lLAotICAgICAgICAgICAgIHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLnVpRHVyYXRpb24sICZleHRQcm9ncmVzcyk7Ci0KLSAgICAgICAgICAgIGVyciA9IHByZXBhcmVGcmFtaW5nU3RydWN0dXJlKCZmcmFtaW5nQ3R4LAotICAgICAgICAgICAgICAgICAgcGFyYW1zLT5lZmZlY3RzU2V0dGluZ3MsIGksIHBhcmFtcy0+b3ZlcmxheUZyYW1lUkdCQnVmZmVyLAotICAgICAgICAgICAgICAgICAgcGFyYW1zLT5vdmVybGF5RnJhbWVZVVZCdWZmZXIpOwotCi0gICAgICAgICAgICBpZihlcnIgPT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RnJhbWluZygKLSAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKSZmcmFtaW5nQ3R4LCBwbGFuZUluLCBwbGFuZU91dCwgJmV4dFByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZyYW1pbmcpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHguYWxwaGFCbGVuZGluZ1N0cnVjdCk7Ci0KLSAgICAgICAgICAgIGlmKGZyYW1pbmdDdHguRnJhbWluZ1l1diAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LkZyYW1pbmdZdXYpOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHguRnJhbWluZ1l1diA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL0lmIHByZXBhcmVGcmFtaW5nU3RydWN0dXJlIC8gTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGcmFtaW5nCi0gICAgICAgICAgICAvLyByZXR1cm5lZCBlcnJvciwgdGhlbiByZXR1cm4gZnJvbSBmdW5jdGlvbgotICAgICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLQotICAgICAgICAgICAgICAgIGlmKE5VTEwgIT0gZmluYWxPdXRwdXRCdWZmZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShmaW5hbE91dHB1dEJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsT3V0cHV0QnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoTlVMTCAhPSB0ZW1wT3V0cHV0QnVmZmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUodGVtcE91dHB1dEJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBPdXRwdXRCdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBUaGUgb3V0IHBsYW5lIG5vdyBiZWNvbWVzIHRoZSBpbiBwbGFuZSBmb3IgYWRkaW5nIG90aGVyIGVmZmVjdHMKLSAgICAgICAgICAgIHN3YXBJbWFnZVBsYW5lcyhwbGFuZUluLCBwbGFuZU91dCwoTTRWSUZJX1VJbnQ4ICopZmluYWxPdXRwdXRCdWZmZXIsCi0gICAgICAgICAgICAgKE00VklGSV9VSW50OCAqKXRlbXBPdXRwdXRCdWZmZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYocGFyYW1zLT5jdXJyZW50VmlkZW9FZmZlY3QgJiBWSURFT19FRkZFQ1RfRkFERUZST01CTEFDSykgewotICAgICAgICAvKiBmaW5kIHRoZSBlZmZlY3QgaW4gZWZmZWN0U2V0dGluZ3MgYXJyYXkqLwotICAgICAgICBmb3IoaT0wO2k8cGFyYW1zLT5udW1iZXJFZmZlY3RzO2krKykgewotICAgICAgICAgICAgaWYocGFyYW1zLT5lZmZlY3RzU2V0dGluZ3NbaV0uVmlkZW9FZmZlY3RUeXBlID09Ci0gICAgICAgICAgICAgTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRmFkZUZyb21CbGFjaykKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKGkgPCBwYXJhbXMtPm51bWJlckVmZmVjdHMpIHsKLSAgICAgICAgICAgIGNvbXB1dGVQZXJjZW50YWdlRG9uZShwYXJhbXMtPnRpbWVNcywKLSAgICAgICAgICAgICBwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS51aVN0YXJ0VGltZSwKLSAgICAgICAgICAgICBwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS51aUR1cmF0aW9uLCAmcGVyY2VudGFnZURvbmUpOwotCi0gICAgICAgICAgICAvLyBDb21wdXRlIHdoZXJlIHdlIGFyZSBpbiB0aGUgZWZmZWN0IChzY2FsZSBpcyAwLT4xMDI0KQotICAgICAgICAgICAgbHVtX2ZhY3RvciA9IChNNE9TQV9JbnQzMikoIHBlcmNlbnRhZ2VEb25lICogMTAyNCApOwotICAgICAgICAgICAgLy8gQXBwbHkgdGhlIGRhcmtlbmluZyBlZmZlY3QKLSAgICAgICAgICAgIGVyciA9IGFwcGx5THVtYUVmZmVjdChNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9GYWRlRnJvbUJsYWNrLAotICAgICAgICAgICAgICAgICAgcGxhbmVJbiwgcGxhbmVPdXQsIChNNFZJRklfVUludDggKilmaW5hbE91dHB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgIChNNFZJRklfVUludDggKil0ZW1wT3V0cHV0QnVmZmVyLCBsdW1fZmFjdG9yKTsKLSAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKHBhcmFtcy0+Y3VycmVudFZpZGVvRWZmZWN0ICYgVklERU9fRUZGRUNUX0ZBREVUT0JMQUNLKSB7Ci0gICAgICAgIC8vIEZpbmQgdGhlIGVmZmVjdCBpbiBlZmZlY3RTZXR0aW5ncyBhcnJheQotICAgICAgICBmb3IoaT0wO2k8cGFyYW1zLT5udW1iZXJFZmZlY3RzO2krKykgewotICAgICAgICAgICAgaWYocGFyYW1zLT5lZmZlY3RzU2V0dGluZ3NbaV0uVmlkZW9FZmZlY3RUeXBlID09Ci0gICAgICAgICAgICAgTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRmFkZVRvQmxhY2spCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoaSA8IHBhcmFtcy0+bnVtYmVyRWZmZWN0cykgewotICAgICAgICAgICAgY29tcHV0ZVBlcmNlbnRhZ2VEb25lKHBhcmFtcy0+dGltZU1zLAotICAgICAgICAgICAgIHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLnVpU3RhcnRUaW1lLAotICAgICAgICAgICAgIHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLnVpRHVyYXRpb24sICZwZXJjZW50YWdlRG9uZSk7Ci0KLSAgICAgICAgICAgIC8vIENvbXB1dGUgd2hlcmUgd2UgYXJlIGluIHRoZSBlZmZlY3QgKHNjYWxlIGlzIDAtPjEwMjQpCi0gICAgICAgICAgICBsdW1fZmFjdG9yID0gKE00T1NBX0ludDMyKSggKDEuMC1wZXJjZW50YWdlRG9uZSkgKiAxMDI0ICk7Ci0gICAgICAgICAgICAvLyBBcHBseSB0aGUgZGFya2VuaW5nIGVmZmVjdAotICAgICAgICAgICAgZXJyID0gYXBwbHlMdW1hRWZmZWN0KE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX0ZhZGVUb0JsYWNrLAotICAgICAgICAgICAgICAgICAgcGxhbmVJbiwgcGxhbmVPdXQsIChNNFZJRklfVUludDggKilmaW5hbE91dHB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgIChNNFZJRklfVUludDggKil0ZW1wT3V0cHV0QnVmZmVyLCBsdW1fZmFjdG9yKTsKLSAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEFMT0dWKCJkb01lZGlhUmVuZGVyaW5nIENBTEwgZ2V0QnVmZmVyKCkiKTsKLSAgICAvLyBTZXQgdGhlIG91dHB1dCBZVVY0MjAgcGxhbmUgdG8gYmUgY29tcGF0aWJsZSB3aXRoIFlWMTIgZm9ybWF0Ci0gICAgLy8gVyAmIEggZXZlbgotICAgIC8vIFlWVSBpbnN0ZWFkIG9mIFlVVgotICAgIC8vIGFsaWduIGJ1ZmZlcnMgb24gMzIgYml0cwotCi0gICAgLy8gWSBwbGFuZQotICAgIC8vaW4gWVYxMiBmb3JtYXQsIHNpemVzIG11c3QgYmUgZXZlbgotICAgIE00T1NBX1VJbnQzMiB5djEyUGxhbmVXaWR0aCA9ICgocGFyYW1zLT5vdXRWaWRlb1dpZHRoICsxKT4+MSk8PDE7Ci0gICAgTTRPU0FfVUludDMyIHl2MTJQbGFuZUhlaWdodCA9ICgocGFyYW1zLT5vdXRWaWRlb0hlaWdodCsxKT4+MSk8PDE7Ci0KLSAgICBwcmVwYXJlWVYxMkltYWdlUGxhbmUocGxhbmVPdXQsIHl2MTJQbGFuZVdpZHRoLCB5djEyUGxhbmVIZWlnaHQsCi0gICAgIChNNE9TQV9VSW50MzIpcGFyYW1zLT5vdXRCdWZmZXJTdHJpZGUsIChNNFZJRklfVUludDggKilwYXJhbXMtPnBPdXRCdWZmZXIpOwotCi0gICAgZXJyID0gYXBwbHlSZW5kZXJpbmdNb2RlKHBsYW5lSW4sIHBsYW5lT3V0LCBwYXJhbXMtPnJlbmRlcmluZ01vZGUpOwotCi0gICAgaWYoTTRPU0FfTlVMTCAhPSBmaW5hbE91dHB1dEJ1ZmZlcikgewotICAgICAgICBmcmVlKGZpbmFsT3V0cHV0QnVmZmVyKTsKLSAgICAgICAgZmluYWxPdXRwdXRCdWZmZXI9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIGlmKE00T1NBX05VTEwgIT0gdGVtcE91dHB1dEJ1ZmZlcikgewotICAgICAgICBmcmVlKHRlbXBPdXRwdXRCdWZmZXIpOwotICAgICAgICB0ZW1wT3V0cHV0QnVmZmVyID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgQUxPR1YoImRvVmlkZW9Qb3N0UHJvY2Vzc2luZzogYXBwbHlSZW5kZXJpbmdNb2RlIHJldHVybmVkIGVycj0lZCIsZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLWFuZHJvaWQ6OnN0YXR1c190IGdldFZpZGVvU2l6ZUJ5UmVzb2x1dGlvbigKLSAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSByZXNvbHV0aW9uLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwV2lkdGgsIHVpbnQzMl90ICpwSGVpZ2h0KSB7Ci0KLSAgICB1aW50MzJfdCBmcmFtZVdpZHRoLCBmcmFtZUhlaWdodDsKLQotICAgIGlmIChwV2lkdGggPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiZ2V0VmlkZW9GcmFtZVNpemVCeVJlc29sdXRpb24gaW52YWxpZCBwb2ludGVyIGZvciBwV2lkdGgiKTsKLSAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkJBRF9WQUxVRTsKLSAgICB9Ci0gICAgaWYgKHBIZWlnaHQgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiZ2V0VmlkZW9GcmFtZVNpemVCeVJlc29sdXRpb24gaW52YWxpZCBwb2ludGVyIGZvciBwSGVpZ2h0Iik7Ci0gICAgICAgIHJldHVybiBhbmRyb2lkOjpCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgc3dpdGNoIChyZXNvbHV0aW9uKSB7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1NRQ0lGOgotICAgICAgICAgICAgZnJhbWVXaWR0aCA9IDEyODsKLSAgICAgICAgICAgIGZyYW1lSGVpZ2h0ID0gOTY7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRUVZHQToKLSAgICAgICAgICAgIGZyYW1lV2lkdGggPSAxNjA7Ci0gICAgICAgICAgICBmcmFtZUhlaWdodCA9IDEyMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FDSUY6Ci0gICAgICAgICAgICBmcmFtZVdpZHRoID0gMTc2OwotICAgICAgICAgICAgZnJhbWVIZWlnaHQgPSAxNDQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRVkdBOgotICAgICAgICAgICAgZnJhbWVXaWR0aCA9IDMyMDsKLSAgICAgICAgICAgIGZyYW1lSGVpZ2h0ID0gMjQwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQ0lGOgotICAgICAgICAgICAgZnJhbWVXaWR0aCA9IDM1MjsKLSAgICAgICAgICAgIGZyYW1lSGVpZ2h0ID0gMjg4OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rVkdBOgotICAgICAgICAgICAgZnJhbWVXaWR0aCA9IDY0MDsKLSAgICAgICAgICAgIGZyYW1lSGVpZ2h0ID0gNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rV1ZHQToKLSAgICAgICAgICAgIGZyYW1lV2lkdGggPSA4MDA7Ci0gICAgICAgICAgICBmcmFtZUhlaWdodCA9IDQ4MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa05UU0M6Ci0gICAgICAgICAgICBmcmFtZVdpZHRoID0gNzIwOwotICAgICAgICAgICAgZnJhbWVIZWlnaHQgPSA0ODA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s2NDBfMzYwOgotICAgICAgICAgICAgZnJhbWVXaWR0aCA9IDY0MDsKLSAgICAgICAgICAgIGZyYW1lSGVpZ2h0ID0gMzYwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rODU0XzQ4MDoKLSAgICAgICAgICAgIGZyYW1lV2lkdGggPSA4NTQ7Ci0gICAgICAgICAgICBmcmFtZUhlaWdodCA9IDQ4MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEyODBfNzIwOgotICAgICAgICAgICAgZnJhbWVXaWR0aCA9IDEyODA7Ci0gICAgICAgICAgICBmcmFtZUhlaWdodCA9IDcyMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEwODBfNzIwOgotICAgICAgICAgICAgZnJhbWVXaWR0aCA9IDEwODA7Ci0gICAgICAgICAgICBmcmFtZUhlaWdodCA9IDcyMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazk2MF83MjA6Ci0gICAgICAgICAgICBmcmFtZVdpZHRoID0gOTYwOwotICAgICAgICAgICAgZnJhbWVIZWlnaHQgPSA3MjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxOTIwXzEwODA6Ci0gICAgICAgICAgICBmcmFtZVdpZHRoID0gMTkyMDsKLSAgICAgICAgICAgIGZyYW1lSGVpZ2h0ID0gMTA4MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgdmlkZW8gcmVzb2x1dGlvbiAlZC4iLCByZXNvbHV0aW9uKTsKLSAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgKnBXaWR0aCA9IGZyYW1lV2lkdGg7Ci0gICAgKnBIZWlnaHQgPSBmcmFtZUhlaWdodDsKLQotICAgIHJldHVybiBhbmRyb2lkOjpPSzsKLX0KLQotTTRWSUZJX1VJbnQ4IE00VklGSV9Sb3RhdGU5MExlZnRZVVY0MjB0b1lVVjQyMCh2b2lkKiBwVXNlckRhdGEsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KSB7Ci0KLSAgICBNNFZJRklfSW50MzIgcGxhbmVfbnVtYmVyOwotICAgIE00VklGSV9VSW50MzIgaSxqLCB1X3N0cmlkZTsKLSAgICBNNFZJRklfVUludDggKnBfYnVmX3NyYywgKnBfYnVmX2Rlc3Q7Ci0KLSAgICAvKio8IExvb3Agb24gWSxVIGFuZCBWIHBsYW5lcyAqLwotICAgIGZvciAocGxhbmVfbnVtYmVyID0gMDsgcGxhbmVfbnVtYmVyIDwgMzsgcGxhbmVfbnVtYmVyKyspIHsKLSAgICAgICAgLyoqPCBHZXQgYWRyZXNzZXMgb2YgZmlyc3QgdmFsaWQgcGl4ZWwgaW4gaW5wdXQgYW5kIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgLyoqPCBBcyB3ZSBoYXZlIGEgLTkwwrAgcm90YXRpb24sIGZpcnN0IG5lZWRlZCBwaXhlbCBpcyB0aGUgdXBwZXItcmlnaHQgb25lICovCi0gICAgICAgIHBfYnVmX3NyYyA9Ci0gICAgICAgICAgICAmKHBQbGFuZUluW3BsYW5lX251bWJlcl0ucGFjX2RhdGFbcFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3RvcGxlZnRdKSArCi0gICAgICAgICAgICAgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9oZWlnaHQgLSAxIDsKLSAgICAgICAgcF9idWZfZGVzdCA9Ci0gICAgICAgICAgICAmKHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnBhY19kYXRhW3BQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfdG9wbGVmdF0pOwotICAgICAgICB1X3N0cmlkZSA9IHBQbGFuZUluW3BsYW5lX251bWJlcl0udV9zdHJpZGU7Ci0gICAgICAgIC8qKjwgTG9vcCBvbiBvdXRwdXQgcm93cyAqLwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9oZWlnaHQ7IGkrKykgewotICAgICAgICAgICAgLyoqPCBMb29wIG9uIGFsbCBvdXRwdXQgcGl4ZWxzIGluIGEgcm93ICovCi0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgKnBfYnVmX2Rlc3QrKz0gKnBfYnVmX3NyYzsKLSAgICAgICAgICAgICAgICBwX2J1Zl9zcmMgKz0gdV9zdHJpZGU7ICAvKio8IEdvIHRvIHRoZSBuZXh0IHJvdyAqLwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKio8IEdvIG9uIG5leHQgcm93IG9mIHRoZSBvdXRwdXQgZnJhbWUgKi8KLSAgICAgICAgICAgIHBfYnVmX2Rlc3QgKz0KLSAgICAgICAgICAgICAgICBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3N0cmlkZSAtIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGg7Ci0gICAgICAgICAgICAvKio8IEdvIHRvIG5leHQgcGl4ZWwgaW4gdGhlIGxhc3Qgcm93IG9mIHRoZSBpbnB1dCBmcmFtZSovCi0gICAgICAgICAgICBwX2J1Zl9zcmMgLT0KLSAgICAgICAgICAgICAgICBwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfc3RyaWRlICogcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aCArIDEgOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE00VklGSV9PSzsKLX0KLQotTTRWSUZJX1VJbnQ4IE00VklGSV9Sb3RhdGU5MFJpZ2h0WVVWNDIwdG9ZVVY0MjAodm9pZCogcFVzZXJEYXRhLAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkgewotCi0gICAgTTRWSUZJX0ludDMyIHBsYW5lX251bWJlcjsKLSAgICBNNFZJRklfVUludDMyIGksaiwgdV9zdHJpZGU7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2J1Zl9zcmMsICpwX2J1Zl9kZXN0OwotCi0gICAgLyoqPCBMb29wIG9uIFksVSBhbmQgViBwbGFuZXMgKi8KLSAgICBmb3IgKHBsYW5lX251bWJlciA9IDA7IHBsYW5lX251bWJlciA8IDM7IHBsYW5lX251bWJlcisrKSB7Ci0gICAgICAgIC8qKjwgR2V0IGFkcmVzc2VzIG9mIGZpcnN0IHZhbGlkIHBpeGVsIGluIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVyICovCi0gICAgICAgIC8qKjwgQXMgd2UgaGF2ZSBhICs5MMKwIHJvdGF0aW9uLCBmaXJzdCBuZWVkZWQgcGl4ZWwgaXMgdGhlIGxlZnQtZG93biBvbmUgKi8KLSAgICAgICAgcF9idWZfc3JjID0KLSAgICAgICAgICAgICYocFBsYW5lSW5bcGxhbmVfbnVtYmVyXS5wYWNfZGF0YVtwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfdG9wbGVmdF0pICsKLSAgICAgICAgICAgICAocFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3N0cmlkZSAqIChwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoIC0gMSkpOwotICAgICAgICBwX2J1Zl9kZXN0ID0KLSAgICAgICAgICAgICYocFBsYW5lT3V0W3BsYW5lX251bWJlcl0ucGFjX2RhdGFbcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV90b3BsZWZ0XSk7Ci0gICAgICAgIHVfc3RyaWRlID0gcFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3N0cmlkZTsKLSAgICAgICAgLyoqPCBMb29wIG9uIG91dHB1dCByb3dzICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X2hlaWdodDsgaSsrKSB7Ci0gICAgICAgICAgICAvKio8IExvb3Agb24gYWxsIG91dHB1dCBwaXhlbHMgaW4gYSByb3cgKi8KLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAqcF9idWZfZGVzdCsrPSAqcF9idWZfc3JjOwotICAgICAgICAgICAgICAgIHBfYnVmX3NyYyAtPSB1X3N0cmlkZTsgIC8qKjwgR28gdG8gdGhlIHByZXZpb3VzIHJvdyAqLwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKio8IEdvIG9uIG5leHQgcm93IG9mIHRoZSBvdXRwdXQgZnJhbWUgKi8KLSAgICAgICAgICAgIHBfYnVmX2Rlc3QgKz0KLSAgICAgICAgICAgICAgICBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3N0cmlkZSAtIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGg7Ci0gICAgICAgICAgICAvKio8IEdvIHRvIG5leHQgcGl4ZWwgaW4gdGhlIGxhc3Qgcm93IG9mIHRoZSBpbnB1dCBmcmFtZSovCi0gICAgICAgICAgICBwX2J1Zl9zcmMgKz0KLSAgICAgICAgICAgICAgICBwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfc3RyaWRlICogcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aCArMSA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQotCi1NNFZJRklfVUludDggTTRWSUZJX1JvdGF0ZTE4MFlVVjQyMHRvWVVWNDIwKHZvaWQqIHBVc2VyRGF0YSwKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpIHsKLSAgICBNNFZJRklfSW50MzIgcGxhbmVfbnVtYmVyOwotICAgIE00VklGSV9VSW50MzIgaSxqOwotICAgIE00VklGSV9VSW50OCAqcF9idWZfc3JjLCAqcF9idWZfZGVzdCwgdGVtcF9waXgxOwotCi0gICAgLyoqPCBMb29wIG9uIFksVSBhbmQgViBwbGFuZXMgKi8KLSAgICBmb3IgKHBsYW5lX251bWJlciA9IDA7IHBsYW5lX251bWJlciA8IDM7IHBsYW5lX251bWJlcisrKSB7Ci0gICAgICAgIC8qKjwgR2V0IGFkcmVzc2VzIG9mIGZpcnN0IHZhbGlkIHBpeGVsIGluIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVyICovCi0gICAgICAgIHBfYnVmX3NyYyA9Ci0gICAgICAgICAgICAmKHBQbGFuZUluW3BsYW5lX251bWJlcl0ucGFjX2RhdGFbcFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3RvcGxlZnRdKTsKLSAgICAgICAgcF9idWZfZGVzdCA9Ci0gICAgICAgICAgICAmKHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnBhY19kYXRhW3BQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfdG9wbGVmdF0pOwotCi0gICAgICAgIC8qKjwgSWYgcFBsYW5lSW4gPSBwUGxhbmVPdXQsIHRoZSBhbGdvcml0aG0gd2lsbCBiZSBkaWZmZXJlbnQgKi8KLSAgICAgICAgaWYgKHBfYnVmX3NyYyA9PSBwX2J1Zl9kZXN0KSB7Ci0gICAgICAgICAgICAvKio8IEdldCBBZGRyZXNzIG9mIGxhc3QgcGl4ZWwgaW4gdGhlIGxhc3Qgcm93IG9mIHRoZSBmcmFtZSAqLwotICAgICAgICAgICAgcF9idWZfZGVzdCArPQotICAgICAgICAgICAgICAgIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfc3RyaWRlKihwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X2hlaWdodC0xKSArCi0gICAgICAgICAgICAgICAgIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGggLSAxOwotCi0gICAgICAgICAgICAvKio8IFdlIGxvb3AgKGhlaWdodC8yKSB0aW1lcyBvbiB0aGUgcm93cy4KLSAgICAgICAgICAgICAqIEluIGNhc2UgdV9oZWlnaHQgaXMgb2RkLCB0aGUgcm93IGF0IHRoZSBtaWRkbGUgb2YgdGhlIGZyYW1lCi0gICAgICAgICAgICAgKiBoYXMgdG8gYmUgcHJvY2Vzc2VkIGFzIG11c3QgYmUgbWlycm9yZWQgKi8KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoKHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfaGVpZ2h0KT4+MSk7IGkrKykgewotICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgdGVtcF9waXgxPSAqcF9idWZfZGVzdDsKLSAgICAgICAgICAgICAgICAgICAgKnBfYnVmX2Rlc3QtLT0gKnBfYnVmX3NyYzsKLSAgICAgICAgICAgICAgICAgICAgKnBfYnVmX3NyYysrID0gdGVtcF9waXgxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKio8IEdvIG9uIG5leHQgcm93IGluIHRvcCBvZiBmcmFtZSAqLwotICAgICAgICAgICAgICAgIHBfYnVmX3NyYyArPQotICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3N0cmlkZSAtIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgLyoqPCBHbyB0byB0aGUgbGFzdCBwaXhlbCBpbiBwcmV2aW91cyByb3cgaW4gYm90dG9tIG9mIGZyYW1lKi8KLSAgICAgICAgICAgICAgICBwX2J1Zl9kZXN0IC09Ci0gICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfc3RyaWRlIC0gcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqPCBNaXJyb3IgbWlkZGxlIHJvdyBpbiBjYXNlIGhlaWdodCBpcyBvZGQgKi8KLSAgICAgICAgICAgIGlmICgocFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9oZWlnaHQlMikhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcF9idWZfc3JjID0KLSAgICAgICAgICAgICAgICAgICAgJihwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS5wYWNfZGF0YVtwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfdG9wbGVmdF0pOwotICAgICAgICAgICAgICAgIHBfYnVmX3NyYyArPQotICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3N0cmlkZSoocFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9oZWlnaHQ+PjEpOwotICAgICAgICAgICAgICAgIHBfYnVmX2Rlc3QgPQotICAgICAgICAgICAgICAgICAgICBwX2J1Zl9zcmMgKyBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoOwotCi0gICAgICAgICAgICAgICAgLyoqPCBXZSBsb29wIHVfd2lkdGgvMiB0aW1lcyBvbiB0aGlzIHJvdy4KLSAgICAgICAgICAgICAgICAgKiAgSW4gY2FzZSB1X3dpZHRoIGlzIG9kZCwgdGhlIHBpeGVsIGF0IHRoZSBtaWRkbGUgb2YgdGhpcyByb3cKLSAgICAgICAgICAgICAgICAgKiByZW1haW5zIHVuY2hhbmdlZCAqLwotICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAocFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aD4+MSk7IGorKykgewotICAgICAgICAgICAgICAgICAgICB0ZW1wX3BpeDE9ICpwX2J1Zl9kZXN0OwotICAgICAgICAgICAgICAgICAgICAqcF9idWZfZGVzdC0tPSAqcF9idWZfc3JjOwotICAgICAgICAgICAgICAgICAgICAqcF9idWZfc3JjKysgPSB0ZW1wX3BpeDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyoqPCBHZXQgQWRkcmVzcyBvZiBsYXN0IHBpeGVsIGluIHRoZSBsYXN0IHJvdyBvZiB0aGUgb3V0cHV0IGZyYW1lICovCi0gICAgICAgICAgICBwX2J1Zl9kZXN0ICs9Ci0gICAgICAgICAgICAgICAgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9zdHJpZGUqKHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfaGVpZ2h0LTEpICsKLSAgICAgICAgICAgICAgICAgcFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoIC0gMTsKLQotICAgICAgICAgICAgLyoqPCBMb29wIG9uIHJvd3MgKi8KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X2hlaWdodDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGg7IGorKykgewotICAgICAgICAgICAgICAgICAgICAqcF9idWZfZGVzdC0tPSAqcF9idWZfc3JjKys7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqPCBHbyBvbiBuZXh0IHJvdyBpbiB0b3Agb2YgaW5wdXQgZnJhbWUgKi8KLSAgICAgICAgICAgICAgICBwX2J1Zl9zcmMgKz0KLSAgICAgICAgICAgICAgICAgICAgcFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3N0cmlkZSAtIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgLyoqPCBHbyB0byBsYXN0IHBpeGVsIG9mIHByZXZpb3VzIHJvdyBpbiBib3R0b20gb2YgaW5wdXQgZnJhbWUqLwotICAgICAgICAgICAgICAgIHBfYnVmX2Rlc3QgLT0KLSAgICAgICAgICAgICAgICAgICAgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9zdHJpZGUgLSBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE00VklGSV9PSzsKLX0KLQotTTRPU0FfRVJSIGFwcGx5VmlkZW9Sb3RhdGlvbihNNE9TQV9Wb2lkKiBwQnVmZmVyLCBNNE9TQV9VSW50MzIgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBoZWlnaHQsIE00T1NBX1VJbnQzMiByb3RhdGlvbikgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgcGxhbmVJblszXSwgcGxhbmVPdXRbM107Ci0KLSAgICBpZiAocEJ1ZmZlciA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJhcHBseVZpZGVvUm90YXRpb246IE5VTEwgaW5wdXQgZnJhbWUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0gICAgTTRPU0FfVUludDgqIG91dFB0ciA9IChNNE9TQV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgKHdpZHRoKmhlaWdodCoxLjUpLCBNNFZTLCAoTTRPU0FfQ2hhciopKCJyb3RhdGlvbiBvdXQgcHRyIikpOwotICAgIGlmIChvdXRQdHIgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLy8gSW4gcGxhbmUKLSAgICBwcmVwYXJlWVVWNDIwSW1hZ2VQbGFuZShwbGFuZUluLCB3aWR0aCwKLSAgICAgICAgaGVpZ2h0LCAoTTRWSUZJX1VJbnQ4ICopcEJ1ZmZlciwgd2lkdGgsIGhlaWdodCk7Ci0KLSAgICAvLyBPdXQgcGxhbmUKLSAgICBpZiAocm90YXRpb24gIT0gMTgwKSB7Ci0gICAgICAgIHByZXBhcmVZVVY0MjBJbWFnZVBsYW5lKHBsYW5lT3V0LCBoZWlnaHQsCi0gICAgICAgICAgICB3aWR0aCwgb3V0UHRyLCBoZWlnaHQsIHdpZHRoKTsKLSAgICB9Ci0KLSAgICBzd2l0Y2gocm90YXRpb24pIHsKLSAgICAgICAgY2FzZSA5MDoKLSAgICAgICAgICAgIE00VklGSV9Sb3RhdGU5MFJpZ2h0WVVWNDIwdG9ZVVY0MjAoTTRPU0FfTlVMTCwgcGxhbmVJbiwgcGxhbmVPdXQpOwotICAgICAgICAgICAgbWVtY3B5KHBCdWZmZXIsICh2b2lkICopb3V0UHRyLCAod2lkdGgqaGVpZ2h0KjEuNSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAxODA6Ci0gICAgICAgICAgICAvLyBJbiBwbGFuZSByb3RhdGlvbiwgc28gcGxhbmVPdXQgPSBwbGFuZUluCi0gICAgICAgICAgICBNNFZJRklfUm90YXRlMTgwWVVWNDIwdG9ZVVY0MjAoTTRPU0FfTlVMTCwgcGxhbmVJbiwgcGxhbmVJbik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDI3MDoKLSAgICAgICAgICAgIE00VklGSV9Sb3RhdGU5MExlZnRZVVY0MjB0b1lVVjQyMChNNE9TQV9OVUxMLCBwbGFuZUluLCBwbGFuZU91dCk7Ci0gICAgICAgICAgICBtZW1jcHkocEJ1ZmZlciwgKHZvaWQgKilvdXRQdHIsICh3aWR0aCpoZWlnaHQqMS41KSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoImludmFsaWQgcm90YXRpb24gcGFyYW0gJWQiLCAoaW50KXJvdGF0aW9uKTsKLSAgICAgICAgICAgIGVyciA9IE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGZyZWUoKHZvaWQgKilvdXRQdHIpOwotICAgIHJldHVybiBlcnI7Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclRvb2xzLmggYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yVG9vbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWI0NjRkYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yVG9vbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1ZFX1RPT0xTX0gKLSNkZWZpbmUgQU5EUk9JRF9WRV9UT09MU19ICi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIKLS8qIE1hY3JvIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAiTTRWSUZJX0RlZmluZXMuaCIKLS8qIENsaXAgdGFibGUgZGVjbGFyYXRpb24gKi8KLSNpbmNsdWRlICJNNFZJRklfQ2xpcC5oIgotI2luY2x1ZGUgIk00VkZMX3RyYW5zaXRpb24uaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfQVBJLmgiCi0jaW5jbHVkZSAiTTR4VlNTX0FQSS5oIgotI2luY2x1ZGUgIk00eFZTU19JbnRlcm5hbC5oIgotI2luY2x1ZGUgIk00QUlSX0FQSS5oIgotI2luY2x1ZGUgIlByZXZpZXdSZW5kZXJlci5oIgotCi0jZGVmaW5lIE1FRElBX1JFTkRFUklOR19JTlZBTElEIDI1NQotI2RlZmluZSBUUkFOU1BBUkVOVF9DT0xPUiAweDdFMAotI2RlZmluZSBMVU1fRkFDVE9SX01BWCAxMAotZW51bSB7Ci0gICAgVklERU9fRUZGRUNUX05PTkUgICAgICAgICAgICAgICA9IDAsCi0gICAgVklERU9fRUZGRUNUX0JMQUNLQU5EV0hJVEUgICAgICA9IDEsCi0gICAgVklERU9fRUZGRUNUX1BJTksgICAgICAgICAgICAgICA9IDIsCi0gICAgVklERU9fRUZGRUNUX0dSRUVOICAgICAgICAgICAgICA9IDQsCi0gICAgVklERU9fRUZGRUNUX1NFUElBICAgICAgICAgICAgICA9IDgsCi0gICAgVklERU9fRUZGRUNUX05FR0FUSVZFICAgICAgICAgICA9IDE2LAotICAgIFZJREVPX0VGRkVDVF9GUkFNSU5HICAgICAgICAgICAgPSAzMiwKLSAgICBWSURFT19FRkZFQ1RfRklGVElFUyAgICAgICAgICAgID0gNjQsCi0gICAgVklERU9fRUZGRUNUX0NPTE9SX1JHQjE2ICAgICAgICA9IDEyOCwKLSAgICBWSURFT19FRkZFQ1RfR1JBRElFTlQgICAgICAgICAgID0gMjU2LAotICAgIFZJREVPX0VGRkVDVF9GQURFRlJPTUJMQUNLICAgICAgPSA1MTIsCi0gICAgVklERU9fRUZGRUNUX0ZBREVUT0JMQUNLICAgICAgICA9IDIwNDgsCi19OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTTRWSUZJX1VJbnQ4ICp2aWRCdWZmZXI7Ci0gICAgTTRPU0FfVUludDMyIHZpZGVvV2lkdGg7Ci0gICAgTTRPU0FfVUludDMyIHZpZGVvSGVpZ2h0OwotICAgIE00T1NBX1VJbnQzMiB0aW1lTXM7Ci0gICAgTTRPU0FfVUludDMyIHRpbWVPZmZzZXQ7IC8vaGFzIHRoZSBkdXJhdGlvbiBvZiBjbGlwcyBwbGF5ZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVGhlIGZsYWcgc2hhbGwgYmUgdXNlZCBmb3IgRnJhbWluZy4KLSAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MqIGVmZmVjdHNTZXR0aW5nczsKLSAgICBNNE9TQV9VSW50MzIgbnVtYmVyRWZmZWN0czsKLSAgICBNNE9TQV9VSW50MzIgb3V0VmlkZW9XaWR0aDsKLSAgICBNNE9TQV9VSW50MzIgb3V0VmlkZW9IZWlnaHQ7Ci0gICAgTTRPU0FfVUludDMyIGN1cnJlbnRWaWRlb0VmZmVjdDsKLSAgICBNNE9TQV9Cb29sIGlzRmlmdGllc0VmZmVjdFN0YXJ0ZWQ7Ci0gICAgTTR4VlNTX01lZGlhUmVuZGVyaW5nIHJlbmRlcmluZ01vZGU7Ci0gICAgdWludDhfdCAqcE91dEJ1ZmZlcjsKLSAgICBzaXplX3Qgb3V0QnVmZmVyU3RyaWRlOwotICAgIE00VklGSV9VSW50OCogIG92ZXJsYXlGcmFtZVJHQkJ1ZmZlcjsKLSAgICBNNFZJRklfVUludDgqICBvdmVybGF5RnJhbWVZVVZCdWZmZXI7Ci19IHZlUG9zdFByb2Nlc3NQYXJhbXM7Ci0KLU00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwUGxhbmFyVG9ZVVY0MjBTZW1pcGxhbmFyKHZvaWQgKnVzZXJfZGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCApOwotTTRWSUZJX1VJbnQ4IE00VklGSV9TZW1pcGxhbmFyWVVWNDIwdG9ZVVY0MjAodm9pZCAqdXNlcl9kYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0ICk7Ci0KLU00T1NBX0VSUiBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdENvbG9yKE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCxNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLCBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kKTsKLQotTTRPU0FfRVJSIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RnJhbWluZyggTTRPU0FfVm9pZCAqdXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW5bM10sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCApOwotCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGaWZ0aWVzKCBNNE9TQV9Wb2lkICpwVXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCwgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCApOwotCi11bnNpZ25lZCBjaGFyIE00VkZMX21vZGlmeUx1bWFXaXRoU2NhbGUoTTRWaUNvbUltYWdlUGxhbmUgKnBsYW5lX2luLCBNNFZpQ29tSW1hZ2VQbGFuZSAqcGxhbmVfb3V0LCB1bnNpZ25lZCBsb25nIGx1bV9mYWN0b3IsIHZvaWQgKnVzZXJfZGF0YSk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVYoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QqIGZyYW1pbmdDdHgpOwotTTRWSUZJX1VJbnQ4ICAgIE00VklGSV94VlNTX1JHQjU2NXRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCODg4dG9ZVVYoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QqIGZyYW1pbmdDdHgpOwotTTRWSUZJX1VJbnQ4IE00VklGSV9SR0I4ODh0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZU91dFszXSk7Ci0KLS8qKyBIYW5kbGUgdGhlIGltYWdlIGZpbGVzIGhlcmUgKi8KLU00T1NBX0VSUiBMdkdldEltYWdlVGh1bWJOYWlsKGNvbnN0IGNoYXIgKmZpbGVOYW1lLCBNNE9TQV9VSW50MzIgaGVpZ2h0LCBNNE9TQV9VSW50MzIgd2lkdGgsIE00T1NBX1ZvaWQgKipwQnVmZmVyKTsKLS8qLSBIYW5kbGUgdGhlIGltYWdlIGZpbGVzIGhlcmUgKi8KLQotTTRPU0FfRVJSIGFwcGx5UmVuZGVyaW5nTW9kZShNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVPdXQsIE00eFZTU19NZWRpYVJlbmRlcmluZyBtZWRpYVJlbmRlcmluZyk7Ci0KLQotTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjB0b1lVVjQyMCh2b2lkICp1c2VyX2RhdGEsIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW5bM10sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCApOwotTTRWSUZJX1VJbnQ4ICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLU00T1NBX1ZvaWQgcHJlcGFyZVlVVjQyMEltYWdlUGxhbmUoTTRWSUZJX0ltYWdlUGxhbmUgKnBsYW5lLAotICAgIE00T1NBX1VJbnQzMiB3aWR0aCwgTTRPU0FfVUludDMyIGhlaWdodCwgTTRWSUZJX1VJbnQ4ICpidWZmZXIsCi0gICAgTTRPU0FfVUludDMyIHJlcG9ydGVkV2lkdGgsIE00T1NBX1VJbnQzMiByZXBvcnRlZEhlaWdodCk7Ci0KLU00T1NBX1ZvaWQgcHJlcGFyZVlWMTJJbWFnZVBsYW5lKE00VklGSV9JbWFnZVBsYW5lICpwbGFuZSwKLSAgICBNNE9TQV9VSW50MzIgd2lkdGgsIE00T1NBX1VJbnQzMiBoZWlnaHQsIE00T1NBX1VJbnQzMiBzdHJpZGUsIE00VklGSV9VSW50OCAqYnVmZmVyKTsKLQotTTRPU0FfVm9pZCBzd2FwSW1hZ2VQbGFuZXMoCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwbGFuZU91dCwKLSAgICBNNFZJRklfVUludDggKmJ1ZmZlcjEsIE00VklGSV9VSW50OCAqYnVmZmVyMik7Ci0KLU00T1NBX1ZvaWQgY29tcHV0ZVBlcmNlbnRhZ2VEb25lKAotICAgICBNNE9TQV9VSW50MzIgY3RzTXMsIE00T1NBX1VJbnQzMiBlZmZlY3RTdGFydFRpbWVNcywKLSAgICAgTTRPU0FfVUludDMyIGVmZmVjdER1cmF0aW9uLCBNNE9TQV9Eb3VibGUgKnBlcmNlbnRhZ2VEb25lKTsKLQotTTRPU0FfVm9pZCBjb21wdXRlUHJvZ3Jlc3NGb3JWaWRlb0VmZmVjdCgKLSAgICAgTTRPU0FfVUludDMyIGN0c01zLCBNNE9TQV9VSW50MzIgZWZmZWN0U3RhcnRUaW1lTXMsCi0gICAgIE00T1NBX1VJbnQzMiBlZmZlY3REdXJhdGlvbiwgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MqIGV4dFByb2dyZXNzKTsKLQotTTRPU0FfRVJSIHByZXBhcmVGcmFtaW5nU3RydWN0dXJlKAotICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4LAotICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyogZWZmZWN0c1NldHRpbmdzLCBNNE9TQV9VSW50MzIgaW5kZXgsCi0gICAgTTRWSUZJX1VJbnQ4KiBvdmVybGF5UkdCLCBNNFZJRklfVUludDgqIG92ZXJsYXlZVVYpOwotCi1NNE9TQV9FUlIgYXBwbHlDb2xvckVmZmVjdChNNHhWU1NfVmlkZW9FZmZlY3RUeXBlIGNvbG9yRWZmZWN0LAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcGxhbmVPdXQsCi0gICAgTTRWSUZJX1VJbnQ4ICpidWZmZXIxLCBNNFZJRklfVUludDggKmJ1ZmZlcjIsIE00T1NBX1VJbnQxNiByZ2JDb2xvckRhdGEpOwotCi1NNE9TQV9FUlIgYXBwbHlMdW1hRWZmZWN0KE00VlNTM0dQUF9WaWRlb0VmZmVjdFR5cGUgdmlkZW9FZmZlY3QsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwbGFuZU91dCwKLSAgICBNNFZJRklfVUludDggKmJ1ZmZlcjEsIE00VklGSV9VSW50OCAqYnVmZmVyMiwgTTRPU0FfSW50MzIgbHVtX2ZhY3Rvcik7Ci0KLU00T1NBX0VSUiBhcHBseUVmZmVjdHNBbmRSZW5kZXJpbmdNb2RlKHZlUG9zdFByb2Nlc3NQYXJhbXMgKnBhcmFtcywKLSAgICBNNE9TQV9VSW50MzIgcmVwb3J0ZWRXaWR0aCwgTTRPU0FfVUludDMyIHJlcG9ydGVkSGVpZ2h0KTsKLQotYW5kcm9pZDo6c3RhdHVzX3QgZ2V0VmlkZW9TaXplQnlSZXNvbHV0aW9uKE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVTaXplIHJlc29sdXRpb24sCi0gICAgdWludDMyX3QgKnBXaWR0aCwgdWludDMyX3QgKnBIZWlnaHQpOwotCi1NNFZJRklfVUludDggTTRWSUZJX1JvdGF0ZTkwTGVmdFlVVjQyMHRvWVVWNDIwKHZvaWQqIHBVc2VyRGF0YSwKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi1NNFZJRklfVUludDggTTRWSUZJX1JvdGF0ZTkwUmlnaHRZVVY0MjB0b1lVVjQyMCh2b2lkKiBwVXNlckRhdGEsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotTTRWSUZJX1VJbnQ4IE00VklGSV9Sb3RhdGUxODBZVVY0MjB0b1lVVjQyMCh2b2lkKiBwVXNlckRhdGEsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotTTRPU0FfRVJSIGFwcGx5VmlkZW9Sb3RhdGlvbihNNE9TQV9Wb2lkKiBwQnVmZmVyLAotICAgIE00T1NBX1VJbnQzMiB3aWR0aCwgTTRPU0FfVUludDMyIGhlaWdodCwgTTRPU0FfVUludDMyIHJvdGF0aW9uKTsKLSNlbmRpZiAvLyBBTkRST0lEX1ZFX1RPT0xTX0gKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvQW5kcm9pZC5tayBiL2xpYnZpZGVvZWRpdG9yL29zYWwvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTA1M2U3ZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1pbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL0xWT1NBX0ZpbGVSZWFkZXJfb3B0aW0uaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL0xWT1NBX0ZpbGVSZWFkZXJfb3B0aW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjM3Mzc2ZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9MVk9TQV9GaWxlUmVhZGVyX29wdGltLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX0ZpbGVSZWFkZXJfb3B0aW0uaAotICogQGJyaWVmICAgICAgICBGaWxlIHJlYWRlciBmb3IgU3ltYmlhbgotICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgZGVjbGFyZXMgZnVuY3Rpb25zIGFuZCB0eXBlcyB0byByZWFkIGEgZmlsZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLQotCi0jaWZuZGVmIE00T1NBX0ZJTEVSRUFERVJfT1BUSU1fSAotI2RlZmluZSBNNE9TQV9GSUxFUkVBREVSX09QVElNX0gKLQotI2RlZmluZSBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLQotLyoqLwotI2lmbmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLSAgICB0eXBlZGVmIHN0cnVjdAotICAgIHsKLSAgICAgICAgTTRPU0FfVm9pZCogICAgICAgICgqcEZjdFB0cl9PcGVuKSggTTRPU0FfVm9pZCogZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBGaWxlTW9kZUFjY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDE2KiBlcnJubyApOwotICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24gKCpwRmN0UHRyX1JlYWQpKCBNNE9TQV9Wb2lkKiBmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDgqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MTYqIGVycm5vICk7Ci0gICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAoKnBGY3RQdHJfU2VlaykoIE00T1NBX1ZvaWQqIGZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24gcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGUgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDE2KiBlcnJubyApOwotICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24gKCpwRmN0UHRyX1RlbGwpKCBNNE9TQV9Wb2lkKiBmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDE2KiBlcnJubyApOwotICAgICAgICBNNE9TQV9JbnQzMiAgICAgICAgKCpwRmN0UHRyX0Nsb3NlKSggTTRPU0FfVm9pZCogZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MTYqIGVycm5vICk7Ci0gICAgICAgIE00T1NBX1ZvaWQgICAgICAgICAoKnBGY3RQdHJfQWNjZXNzVHlwZSkoIE00T1NBX1VJbnQzMiBGaWxlTW9kZUFjY2Vzc19JbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogRmlsZU1vZGVBY2Nlc3NfT3V0ICk7Ci0KLSAgICB9IE00T1NBX0ZpbGVTeXN0ZW1fRmN0UHRyOwotI2VuZGlmCi0vKiovCi0KLQotLyogUmVhZGVyIEFQSSA6IGJ1ZmZlcml6ZWQgZnVuY3Rpb25zICovCi0jaWZkZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCi0gICAgTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkT3Blbl9vcHRpbSggTTRPU0FfQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBmaWxlRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgZmlsZU1vZGVBY2Nlc3MpOwotI2Vsc2UKLSAgICBNNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRPcGVuX29wdGltKCBNNE9TQV9Db250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIGZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBmaWxlTW9kZUFjY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlU3lzdGVtX0ZjdFB0ciAqRlMpOwotI2VuZGlmCi0KLU00T1NBX0VSUiBNNE9TQV9maWxlUmVhZERhdGFfb3B0aW0oIE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX01lbUFkZHI4IGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiogc2l6ZSApOwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkU2Vla19vcHRpbSggTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVNlZWtBY2Nlc3NNb2RlIHNlZWtNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwb3NpdGlvbiApOwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkQ2xvc2Vfb3B0aW0oIE00T1NBX0NvbnRleHQgY29udGV4dCApOwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkR2V0T3B0aW9uX29wdGltKCBNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkT3B0aW9uSUQgb3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gKm9wdGlvblZhbHVlICk7Ci1NNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRTZXRPcHRpb25fb3B0aW0oIE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRPcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSApOwotCi0jZW5kaWYgLyogTTRPU0FfRklMRVJFQURFUl9PUFRJTV9IICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9MVl9NYWNyb3MuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL0xWX01hY3Jvcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiOGQ3ZTg1Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL0xWX01hY3Jvcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAZmlsZSAgICAgICAgTFZfTWFjcm9zLmgKLSogQHBhciAgICAgICAgTlhQIFNvZnR3YXJlCi0qIEBicmllZiAgICBNYWNyb3MgZGVmaW5pdGlvbiBmb3IgU21hcnRwaG9uZSB0ZWFtCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIExWX01BQ1JPU19ICi0jZGVmaW5lIExWX01BQ1JPU19ICi0KLS8qLS0tLS0tLS0tLS0tKi8KLS8qICAgIElOQ0xVREVTICAqLwotLyotLS0tLS0tLS0tLS0qLwotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogQ0hFQ0tfUFRSKGZjdCwgcCwgZXJyLCBlcnJWYWx1ZSkKLSogQG5vdGUgICAgVGhpcyBtYWNybyBjaGVja3MgdGhlIHZhbHVlIHAuIElmIGl0IGlzIE5VTEwsIGl0IHNldHMgdGhlIHZhcmlhYmxlIGVycgotKiAgICAgICAgICAgdG8gZXJyVmFsdWUgYW5kIGp1bXBzIHRvIHRoZSBsYWJlbCA8ZmN0Pl9jbGVhblVwLiBBIHRyYWNlIGlzIGRpc3BsYXllZAotKiAgICAgICAgICAgc2lnbmFsbGluZyB0aGUgZXJyb3IsIHRoZSBmdW5jdGlvbiBuYW1lIGFuZCB0aGUgbGluZSBudW1iZXIuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIENIRUNLX1BUUihmY3QsIHAsIGVyciwgZXJyVmFsdWUpIFwKLXsgXAotICAgIGlmKE00T1NBX05VTEwgPT0gKHApKSBcCi0gICAgeyBcCi0gICAgICAgIChlcnIpID0gKGVyclZhbHVlKSA7IFwKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoKE00T1NBX0NoYXIqKSIiICNmY3QgIihMJWQpOiAiICNwICIgaXMgTlVMTCwgcmV0dXJuaW5nICIgI2VyclZhbHVlICIiLF9fTElORV9fKSA7IFwKLSAgICAgICAgZ290byBmY3QjI19jbGVhblVwOyBcCi0gICAgfSBcCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogQ0hFQ0tfRVJSKGZjdCwgZXJyKQotKiBAbm90ZSAgICBUaGlzIG1hY3JvIGNoZWNrcyB0aGUgdmFsdWUgZXJyLiBJZiBpdCBpcyBub3QgTlVMTCwgYSB0cmFjZSBpcyBkaXNwbGF5ZWQKLSogICAgICAgICAgIHNpZ25hbGxpbmcgdGhlIGVycm9yLCB0aGUgZnVuY3Rpb24gbmFtZSBhbmQgdGhlIGxpbmUgbnVtYmVyLiBUaGUgbWFjcm8KLSogICAgICAgICAgIGp1bXBzIHRvIHRoZSBsYWJlbCA8ZmN0Pl9jbGVhblVwLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBDSEVDS19FUlIoZmN0LCBlcnIpIFwKLXsgXAotICAgIGlmKE00Tk9fRVJST1IgIT0gKGVycikpIFwKLSAgICB7IFwKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoKE00T1NBX0NoYXIqKSIhISEgIiAjZmN0ICIoTCVkKTogRVJST1IgMHglLjh4IHJldHVybmVkIixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0xJTkVfXyxlcnIpIDsgXAotICAgICAgICBnb3RvIGZjdCMjX2NsZWFuVXA7IFwKLSAgICB9IFwKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIENIRUNLX0VSUihmY3QsIGVycikKLSogQG5vdGUgICAgVGhpcyBtYWNybyBjb21wYXJlcyBhIGN1cnJlbnQgc3RhdGUgd2l0aCBhIHN0YXRlIHZhbHVlLiBJZiB0aGV5IGFyZSBkaWZmZXJlbnQsCi0qICAgICAgICAgICBlcnIgaXMgc2V0IHRvIE00RVJSX1NUQVRFLgotKiAgICAgICAgICAgQSB0cmFjZSBpcyBkaXNwbGF5ZWQgc2lnbmFsbGluZyB0aGUgZXJyb3IsIHRoZSBmdW5jdGlvbiBuYW1lIGFuZCB0aGUgbGluZSBudW1iZXIuCi0qICAgICAgICAgICBUaGUgbWFjcm8ganVtcHMgdG8gdGhlIGxhYmVsIDxmY3Q+X2NsZWFuVXAuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lICAgIENIRUNLX1NUQVRFKGZjdCwgc3RhdGVWYWx1ZSwgc3RhdGUpIFwKLXsgXAotICAgIGlmKChzdGF0ZVZhbHVlKSAhPSAoc3RhdGUpKSBcCi0gICAgeyBcCi0gICAgICAgIE00T1NBX1RSQUNFMV8xKCIiICNmY3QgIiBjYWxsZWQgaW4gYmFkIHN0YXRlICVkIiwgc3RhdGUpIDsgXAotICAgICAgICAoZXJyKSA9IE00RVJSX1NUQVRFIDsgXAotICAgICAgICBnb3RvIGZjdCMjX2NsZWFuVXA7IFwKLSAgICB9IFwKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBTQUZFX0ZSRUUocCkKLSogQG5vdGUgICAgVGhpcyBtYWNybyBjaGVja3MgdGhlIHZhbHVlIG9mIHAgaXMgbm90IE5VTEwuIElmIGl0IGlzIE5VTEwsIGl0IGRvZXMKLSogICAgICAgICAgIG5vdGhpbmcuIEVsc2UsIHAgaXMgZGUgYWxsb2NhdGVkIGFuZCBzZXQgdG8gTlVMTC4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgU0FGRV9GUkVFKHApIFwKLXsgXAotICAgIGlmKE00T1NBX05VTEwgIT0gKHApKSBcCi0gICAgeyBcCi0gICAgICAgIGZyZWUoKHApKSA7IFwKLSAgICAgICAgKHApID0gTTRPU0FfTlVMTCA7IFwKLSAgICB9IFwKLX0KLQotCi0KLSNlbmRpZiAvKi0tLSAgTFZfTUFDUk9TX0ggLS0tKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfQ2hhclN0YXIuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0NoYXJTdGFyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA2MzE2ZjAuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfQ2hhclN0YXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX0NoYXJTdGFyLmgKLSAqIEBpbmdyb3VwCi0gKiBAYnJpZWYgICAgICAgIGV4dGVybmFsIEFQSSBvZiB0aGUgQ2hhciBTdGFyIHNldCBvZiBmdW5jdGlvbnMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIE00T1NBX0NIQVJTVEFSX0gKLSNkZWZpbmUgTTRPU0FfQ0hBUlNUQVJfSAotCi0vKiBnZW5lcmFsIE9TQUwgdHlwZXMgYW5kIHByb3RvdHlwZXMgaW5jbHVzaW9uICAgICAgICAgICAgICAgICAgICAgICovCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX1RpbWUuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlQ29tbW9uLmgiCi0KLS8qIHR5cGVzIGRlZmluaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLXR5cGVkZWYgZW51bQotewotICAgTTRPU0Ffa2NockRlYyAgPSAweDAxLAotICAgTTRPU0Ffa2NockhleGEgPSAweDAyLAotICAgTTRPU0Ffa2Nock9jdCAgPSAweDAzCi19IE00T1NBX2Nock51bUJhc2U7Ci0KLS8qIGVycm9yIGFuZCB3YXJuaW5nIGNvZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTTRFUlJfQ0hSX1NUUl9PVkVSRkxPVyBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNE9TQV9DSEFSU1RBUiwweDAwMDAwMSkKLSNkZWZpbmUgTTRFUlJfQ0hSX0NPTlZfRkFJTEVEICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNE9TQV9DSEFSU1RBUiwweDAwMDAwMikKLSNkZWZpbmUgTTRXQVJfQ0hSX05PVF9GT1VORCAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUixNNE9TQV9DSEFSU1RBUiwweDAwMDAwMSkKLSNkZWZpbmUgTTRXQVJfQ0hSX05VTV9SQU5HRSAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUixNNE9TQV9DSEFSU1RBUiwweDAwMDAwMikKLSNkZWZpbmUgTTRXQVJfQ0hSX05FR0FUSVZFICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUixNNE9TQV9DSEFSU1RBUiwweDAwMDAwMykKLQotLyogcHJvdG90eXBlcyBvZiB0aGUgQ2hhciBTdGFyIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17Ci0jZW5kaWYKLQotTTRPU0FMX0NIQVJTVEFSX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9jaHJOQ29weSAgICAgICAgICAoTTRPU0FfQ2hhciAgICpzdHJPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgICAqc3RySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBsZW4yQ29weSk7Ci1NNE9TQUxfQ0hBUlNUQVJfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2NockFyZUlkZW50aWNhbCAgIChNNE9TQV9DaGFyICAgKnN0ckluMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciAgICpzdHJJbjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0Jvb2wgICpyZXN1bHQpOwotTTRPU0FMX0NIQVJTVEFSX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9jaHJHZXRVSW50MzIgICAgICAoTTRPU0FfQ2hhciAgICpzdHJJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyICp2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgICAqKnN0ck91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfY2hyTnVtQmFzZSBiYXNlKTsKLU00T1NBTF9DSEFSU1RBUl9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfY2hyR2V0VUludDE2ICAgICAgKE00T1NBX0NoYXIgICAqc3RySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiAqdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyICAgKipzdHJPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2Nock51bUJhc2UgYmFzZSk7Ci1NNE9TQUxfQ0hBUlNUQVJfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2NoclNQcmludGYgICAgICAgICAoTTRPU0FfQ2hhciAgKnN0ck91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHN0ck91dE1heExlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciAgICpmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLik7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9DbG9jay5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfQ2xvY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTJlYTY5Ni4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9DbG9jay5oCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfQ2xvY2suaAotICogQGluZ3JvdXAgICAgICBPU0FMCi0gKiBAYnJpZWYgICAgICAgIGNsb2NrIEFQSQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBNNE9TQV9DTE9DS19ICi0jZGVmaW5lIE00T1NBX0NMT0NLX0gKLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9UaW1lLmgiCi0KLQotI2RlZmluZSBNNFdBUl9USU1FU0NBTEVfVE9PX0JJRyAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUixNNE9TQV9DTE9DSywweDAwMDAwMSkgLyoqPCBUaW1lIHByZWNpc2lvbiB0b28gaGlnaCBmb3IgdGhlIHN5c3RlbSovCi0jZGVmaW5lIE00RVJSX0NMT0NLX0JBRF9SRUZfWUVBUiAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00T1NBX0NMT0NLLDB4MDAwMDAxKSAvKio8IElucHV0IHllYXIgb2YgcmVmZXJlbmNlIGlzIG5laXRoZXIgMTkwMCwgbm9yIDE5NzAgbm9yIDIwMDAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLSNlbmRpZgotCi1NNE9TQUxfQ0xPQ0tfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2Nsb2NrR2V0VGltZShNNE9TQV9UaW1lKiBwVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0aW1lc2NhbGUpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLypNNE9TQV9DTE9DS19IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfQ29yZUlELmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9Db3JlSUQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTE3MjgwMC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9Db3JlSUQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNE9TQV9Db3JlSUQuaAotICogQGJyaWVmICBkZWZpbmVzIHRoZSB1bmlxdWVzIGNvbXBvbmVudCBpZGVudGlmaWVycyB1c2VkIGZvciBtZW1vcnkgbWFuYWdlbWVudAotICogICAgICAgICBhbmQgb3B0aW9uSUQgbWVjaGFuaXNtCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgX19NNE9TQV9DT1JFSURfSF9fCi0jZGVmaW5lIF9fTTRPU0FfQ09SRUlEX0hfXwotCi0vKiBDb3JlSWQgYXJlIGRlZmluZWQgb24gMTQgYml0cyAqLwotLyogd2Ugc3RhcnQgZnJvbSAweDAxMDAsIGxvd2VyIHZhbHVlcyBhcmUgcmVzZXJ2ZWQgZm9yIG9zYWwgY29yZSBjb21wb25lbnRzICovCi0KLS8qIHJlYWRlciBzaGVsbHMqLwotI2RlZmluZSBNNFJFQURFUl9DT01NT04gICAgIDB4MDEwMAotI2RlZmluZSBNNFJFQURFUl9BVkkgICAgICAgIDB4MDEwMQotI2RlZmluZSBNNFJFQURFUl9BTVIgICAgICAgIDB4MDEwMgotI2RlZmluZSBNNFJFQURFUl8zR1AgICAgICAgIDB4MDEwMwotI2RlZmluZSBNNFJFQURFUl9ORVQgICAgICAgIDB4MDEwNAotI2RlZmluZSBNNFJFQURFUl8zR1BfSFRUUCAgIDB4MDEwNQotI2RlZmluZSBNNFJFQURFUl9NUDMgICAgICAgIDB4MDEwNgotI2RlZmluZSBNNFJFQURFUl9XQVYgICAgICAgIDB4MDEwNwotI2RlZmluZSBNNFJFQURFUl9NSURJICAgICAgIDB4MDEwOAotI2RlZmluZSBNNFJFQURFUl9BU0YgICAgICAgIDB4MDEwOQotI2RlZmluZSBNNFJFQURFUl9SRUFMICAgICAgICAweDAxMEEKLSNkZWZpbmUgTTRSRUFERVJfQUFDICAgICAgICAweDAxMEIKLSNkZWZpbmUgTTRSRUFERVJfRkxFWCAgICAgICAgMHgwMTBDCi0jZGVmaW5lIE00UkVBREVSX0JCQSAgICAgICAgMHgwMTBECi0jZGVmaW5lIE00UkVBREVSX1NZTlRIRVNJU19BVURJTyAgICAweDAxMEUKLSNkZWZpbmUgTTRSRUFERVJfSlBFRyAgICAgICAgMHgwMTBGCi0KLQotLyogd3JpdGVyIHNoZWxscyovCi0jZGVmaW5lIE00V1JJVEVSX0NPTU1PTiAgICAgMHgwMTEwCi0jZGVmaW5lIE00V1JJVEVSX0FWSSAgICAgICAgMHgwMTExCi0jZGVmaW5lIE00V1JJVEVSX0FNUiAgICAgICAgMHgwMTEyCi0jZGVmaW5lIE00V1JJVEVSXzNHUCAgICAgICAgMHgwMTEzCi0jZGVmaW5lIE00V1JJVEVSX0pQRUcgICAgICAgIDB4MDExNgotI2RlZmluZSBNNFdSSVRFUl9NUDMgICAgICAgIDB4MDExNwotCi0vKiBkZWNvZGVyIHNoZWxscyAqLwotI2RlZmluZSBNNERFQ09ERVJfQ09NTU9OICAgIDB4MDEyMAotI2RlZmluZSBNNERFQ09ERVJfSlBFRyAgICAgIDB4MDEyMQotI2RlZmluZSBNNERFQ09ERVJfTVBFRzQgICAgIDB4MDEyMgotI2RlZmluZSBNNERFQ09ERVJfQVVESU8gICAgIDB4MDEyMwotI2RlZmluZSBNNERFQ09ERVJfQVZDICAgICAgIDB4MDEyNAotI2RlZmluZSBNNERFQ09ERVJfTUlESSAgICAgIDB4MDEyNQotI2RlZmluZSBNNERFQ09ERVJfV01BICAgICAgICAweDAxMjYKLSNkZWZpbmUgTTRERUNPREVSX1dNViAgICAgICAgMHgwMTI3Ci0jZGVmaW5lIE00REVDT0RFUl9STVYgICAgICAgIDB4MDEyOAotI2RlZmluZSBNNERFQ09ERVJfUk1BICAgICAgICAweDAxMjkKLSNkZWZpbmUgTTRERUNPREVSX0FBQyAgICAgICAweDAxMkEKLSNkZWZpbmUgTTRERUNPREVSX0JFQVRCUkVXICAweDAxMkIKLSNkZWZpbmUgTTRERUNPREVSX0VYVEVSTkFMICAweDAxMkMKLQotLyogZW5jb2RlciBzaGVsbHMgKi8KLSNkZWZpbmUgTTRFTkNPREVSX0NPTU1PTiAgICAweDAxMzAKLSNkZWZpbmUgTTRFTkNPREVSX0pQRUcgICAgICAweDAxMzEKLSNkZWZpbmUgTTRFTkNPREVSX01QRUc0ICAgICAweDAxMzIKLSNkZWZpbmUgTTRFTkNPREVSX0FVRElPICAgICAweDAxMzMKLSNkZWZpbmUgTTRFTkNPREVSX1ZJRF9OVUxMICAweDAxMzQKLSNkZWZpbmUgTTRFTkNPREVSX01KUEVHICAgICAgICAweDAxMzUKLSNkZWZpbmUgTTRFTkNPREVSX01QMyAgICAgICAgMHgwMTM2Ci0jZGVmaW5lIE00RU5DT0RFUl9IMjY0ICAgICAgICAweDAxMzcKLSNkZWZpbmUgTTRFTkNPREVSX0FBQyAgICAgICAgMHgwMTM4Ci0jZGVmaW5lIE00RU5DT0RFUl9BTVJOQiAgICAgICAgMHgwMTM5Ci0jZGVmaW5lIE00RU5DT0RFUl9BVURfTlVMTCAgMHgwMTNBCi0jZGVmaW5lIE00RU5DT0RFUl9FWFRFUk5BTCAgMHgwMTNCCi0KLS8qIGNvcmVzICovCi0jZGVmaW5lIE00SlBHX0RFQ09ERVIgICAgICAgMHgwMTQwCi0jZGVmaW5lIE00SlBHX0VOQ09ERVIgICAgICAgMHgwMTQxCi0KLSNkZWZpbmUgTTRNUDRfREVDT0RFUiAgICAgICAweDAxNDIKLSNkZWZpbmUgTTRNUDRfRU5DT0RFUiAgICAgICAweDAxNDMKLQotI2RlZmluZSBNNEFWSV9DT01NT04gICAgICAgIDB4MDE0NAotI2RlZmluZSBNNEFWSV9SRUFERVIgICAgICAgIDB4MDE0NQotI2RlZmluZSBNNEFWSV9XUklURVIgICAgICAgIDB4MDE0NgotCi0jZGVmaW5lIE00SFRUUF9FTkdJTkUgICAgICAgMHgwMTQ3Ci0KLSNkZWZpbmUgTTRPU0FfVE1QRklMRSAgICAgICAweDAxNDgKLSNkZWZpbmUgTTRUT09MX1RJTUVSICAgICAgICAweDAxNDkKLQotI2RlZmluZSBNNEFNUl9SRUFERVIgICAgICAgIDB4MDE0QQotCi0jZGVmaW5lIE00TVAzX1JFQURFUiAgICAgICAgMHgwMTRCCi0KLSNkZWZpbmUgTTRXQVZfUkVBREVSICAgICAgICAweDAxNEMKLSNkZWZpbmUgTTRXQVZfV1JJVEVSICAgICAgICAweDAxNEQKLSNkZWZpbmUgTTRXQVZfQ09NTU9OICAgICAgICAweDAxNEUKLQotI2RlZmluZSBNNEFEVFNfUkVBREVSICAgICAgICAweDAxNEYKLSNkZWZpbmUgTTRBRElGX1JFQURFUiAgICAgICAgMHgwMTZBCi0KLSNkZWZpbmUgTTRTUFMgICAgICAgICAgICAgICAweDAxNTAKLSNkZWZpbmUgTTRFWElGX0RFQ09ERVIgICAgICAweDAxNTEKLSNkZWZpbmUgTTRFWElGX0VOQ09ERVIgICAgICAweDAxNTIKLSNkZWZpbmUgTTRHSUZfREVDT0RFUiAgICAgICAweDAxNTMKLSNkZWZpbmUgTTRHSUZfRU5DT0RFUiAgICAgICAweDAxNTQKLSNkZWZpbmUgTTRQTkdfREVDT0RFUiAgICAgICAweDAxNTUKLSNkZWZpbmUgTTRQTkdfRU5DT0RFUiAgICAgICAweDAxNTYKLSNkZWZpbmUgTTRXQk1QX0RFQ09ERVIgICAgICAweDAxNTcKLSNkZWZpbmUgTTRXQk1QX0VOQ09ERVIgICAgICAweDAxNTgKLQotI2RlZmluZSBNNEFNUl9XUklURVIgICAgICAgIDB4MDE1OSAgICAvKio8IG5vIHJvb20gdG8gcHV0IGl0IGFsb25nIE00QU1SX1JFQURFUiAqLwotCi0KLSNkZWZpbmUgTTRBVkNfREVDT0RFUiAgICAgICAweDAxNUEKLSNkZWZpbmUgTTRBVkNfRU5DT0RFUiAgICAgICAweDAxNUIKLQotI2RlZmluZSBNNEFTRl9SRUFERVIgICAgICAgIDB4MDE1QwotI2RlZmluZSBNNFdNRFJNX0FHRU5UICAgICAgICAweDAxNUQKLSNkZWZpbmUgTTRNSURJX1JFQURFUiAgICAgICAgMHgwMTYyICAgIC8qKjwgbm8gcm9vbSBiZWZvcmUgdGhlIHByZXNlbnRlcnMgKi8KLSNkZWZpbmUgTTRSTV9SRUFERVIgICAgICAgICAweDE2MwotI2RlZmluZSBNNFJNVl9ERUNPREVSICAgICAgICAweDE2NAotI2RlZmluZSBNNFJNQV9ERUNPREVSICAgICAgICAweDE2NQotCi0jZGVmaW5lIE00VE9PTF9YTUwgICAgICAgICAgICAweDAxNjYKLSNkZWZpbmUgTTRUT09MX0VGUiAgICAgICAgICAgIDB4MDE2NyAgICAvKio8IERlY3J5cHRpb24gbW9kdWxlIGZvciBWaWRlbyBBcnRpc3QgKi8KLSNkZWZpbmUgTTRJQUxfRlROICAgICAgICAgICAgMHgwMTY4ICAgIC8qIEZUTiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSUFMICovCi0jZGVmaW5lIE00RlROICAgICAgICAgICAgICAgIDB4MDE2OSAgICAvKiBGVE4gbGlicmFyeSAqLwotCi0vKiBwcmVzZW50ZXIgKi8KLSNkZWZpbmUgTTRQUkVTRU5URVJfQVVESU8gICAweDAxNjAKLSNkZWZpbmUgTTRQUkVTRU5URVJfVklERU8gICAweDAxNjEKLQotLyogaGlnaCBsZXZlbCBpbnRlcmZhY2VzICh2cHMsIGV0Yy4uKSovCi0jZGVmaW5lIE00VlBTICAgICAgICAgICAgICAgMHgwMTcwCi0jZGVmaW5lIE00VlRTICAgICAgICAgICAgICAgMHgwMTcxCi0jZGVmaW5lIE00VlhTICAgICAgICAgICAgICAgMHgwMTcyCi0jZGVmaW5lIE00Q0FMTEJBQ0sgICAgICAgICAgMHgwMTczCi0jZGVmaW5lIE00VkVTICAgICAgICAgICAgICAgMHgwMTc0Ci0jZGVmaW5lIE00UFJFUFJPQ0VTU19WSURFTyAgMHgwMTc1Ci0jZGVmaW5lIE00R1JBQl9BVURJTyAgICAgICAgMHgwMTc2Ci0jZGVmaW5lIE00R1JBQl9WSURFTyAgICAgICAgMHgwMTc3Ci0jZGVmaW5lIE00VlNTQVZJICAgICAgICAgICAgMHgwMTc4Ci0jZGVmaW5lIE00VlNTM0dQUCAgICAgICAgICAgMHgwMTc5Ci0jZGVmaW5lIE00UFRPM0dQUCAgICAgICAgICAgMHgwMTdBCi0jZGVmaW5lIE00UFZYX1BBUlNFUiAgICAgICAgMHgwMTdCCi0jZGVmaW5lIE00VkNTICAgICAgICAgICAgICAgIDB4MDE3QwotI2RlZmluZSBNNE1DUyAgICAgICAgICAgICAgICAweDAxN0QKLSNkZWZpbmUgTTRNTk1DICAgICAgICAgICAgICAgIDB4MDE4MCAgICAvKio8IG1ubSBjb250cm9sbGVyICovCi0jZGVmaW5lIE00VFRFWFRfUEFSU0VSICAgICAgMHgwMTgxICAgIC8qKjwgdGltZWQgdGV4dCAqLwotI2RlZmluZSBNNE1NICAgICAgICAgICAgICAgIDB4MDE4MiAgICAvKio8IE11c2ljIG1hbmFnZXIgKi8KLSNkZWZpbmUgTTRNRFAgICAgICAgICAgICAgICAgMHgwMTgzICAgIC8qKjwgTWV0YWRhdGEgcGFyc2VyICovCi0jZGVmaW5lIE00TU1TUUxDT1JFICAgICAgICAgICAgMHgwMTg0Ci0jZGVmaW5lIE00VlBTSUwgICAgICAgICAgICAgICAgMHgwMTg1Ci0jZGVmaW5lIE00RklMRUlMICAgICAgICAgICAgMHgwMTg2IC8qIElMIGZpbGUgSW50ZXJmYWNlICovCi0jZGVmaW5lIE00TVUgICAgICAgICAgICAgICAgMHgwMTg3Ci0jZGVmaW5lIE00VkVFICAgICAgICAgICAgICAgIDB4MDE4OCAgLyoqPCBWaWRlbyBlZmZlY3QgZW5naW5lICovCi0jZGVmaW5lIE00VkEgICAgICAgICAgICAgICAgMHgwMTg5IC8qIFZpZGVvQXJ0aXN0ICovCi0jZGVmaW5lIE00SlRTICAgICAgICAgICAgICAgIDB4MDE4QQotI2RlZmluZSBNNEpUU0lMICAgICAgICAgICAgICAgIDB4MDE4QgotI2RlZmluZSBNNEFJUiAgICAgICAgICAgICAgICAweDAxOEMgIC8qKjwgQUlSICovCi0jZGVmaW5lIE00U1BFICAgICAgICAgICAgICAgIDB4MDE4RCAgLyoqPCBTdGlsbCBwaWN0dXJlIGVkaXRvciAqLwotI2RlZmluZSBNNFZTICAgICAgICAgICAgICAgIDB4MDE4RSAgICAvKio8IFZpZGVvIFN0dWRpbyAoeFZTUykgKi8KLSNkZWZpbmUgTTRWRVNJTCAgICAgICAgICAgICAgICAweDAxOEYgICAgLyoqPCBWRVMgaWwgKi8KLSNkZWZpbmUgTTRJRDMgICAgICAgICAgICAgICAgMHgwMTkwICAgIC8qKjwgSUQzIFRhZyBNb2R1bGUgKi8KLSNkZWZpbmUgTTRTQyAgICAgICAgICAgICAgICAweDAxOTEgICAgLyoqPCBNZWRpYSBTY2FubmVyICovCi0jZGVmaW5lIE00VEcgICAgICAgICAgICAgICAgMHgwMTkyICAvKio8IFRodW1ibmFpbCBHZW5lcmF0b3IqLwotI2RlZmluZSBNNFRTICAgICAgICAgICAgICAgIDB4MDE5MyAgICAvKio8IFRodW1ibmFpbCBzdG9yYWdlICovCi0jZGVmaW5lIE00TUIgICAgICAgICAgICAgICAgMHgwMTk0ICAgIC8qKjwgTWVkaWEgYnJvd3NlciAqLwotCi0vKiBoaWdoIGxldmVsIGFwcGxpY2F0aW9uICh0ZXN0IG9yIGNsaWVudCBhcHApICovCi0jZGVmaW5lIE00QVBQTEkgICAgICAgICAgICAgMHgwMjAwCi0jZGVmaW5lIE00VkFfQVBQTEkgICAgICAgICAgICAweDAyMDEgICAgLyoqPCBWaWRlbyBBcnRpc3QgdGVzdCBhcHBsaWNhdGlvbiAqLwotCi0vKiBleHRlcm5hbCBjb21wb25lbnRzIChIVyB2aWRlbyBjb2RlY3MsIGV0Yy4pICovCi0jZGVmaW5lIE00VkRfRVhURVJOQUwgICAgICAgIDB4MDMwMAotI2RlZmluZSBNNFZFX0VYVEVSTkFMICAgICAgICAweDAzMDEKLQotCi0vKiBwcmlvcml0eSB0byBjb21iaW5lIHdpdGggbW9kdWxlIGlkcyAqLwotI2RlZmluZSBNNEhJR0hfUFJJT1JJVFkgICAgIDB4QzAwMAotI2RlZmluZSBNNE1FRElVTV9QUklPUklUWSAgIDB4ODAwMAotI2RlZmluZSBNNExPV19QUklPUklUWSAgICAgIDB4NDAwMAotI2RlZmluZSBNNERFRkFVTFRfUFJJT1JJVFkgIDB4MDAwMAotCi0KLSNlbmRpZiAvKl9fTTRPU0FfQ09SRUlEX0hfXyovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0RlYnVnLmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9EZWJ1Zy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MjZhYjUxLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0RlYnVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfRGVidWcuaAotICogQGJyaWVmICAgICAgICBEZWJ1ZyBhbmQgVHJhY2UgTWFjcm8KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLQotI2lmbmRlZiBfTTRPU0FfREVCVUdfSF8KLSNkZWZpbmUgX000T1NBX0RFQlVHX0hfCi0KLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0KLQotLyogZGVmYXV0IHZhbHVlLCBkZWZpbmVkIG9ubHkgaWYgbm90IGRlZmluZWQgYWxyZWFkeS4gKi8KLSNpZm5kZWYgTTRUUkFDRV9JRAotI2RlZmluZSBNNFRSQUNFX0lEIE00VU5LTk9XTl9DT1JFSUQKLSNlbmRpZiAvKiBNNFRSQUNFX0lEIHVuZGVmaW5lZCAqLwotCi0KLSNkZWZpbmUgTTRPU0FfU1VQRVJfREVCVUdfTEVWRUwgMAotCi0jaWZuZGVmIE00T1NBX0RFQlVHX0xFVkVMCi0jZGVmaW5lIE00T1NBX0RFQlVHX0xFVkVMICAgICAgIDAKLSNlbmRpZgotCi0KLSNkZWZpbmUgTTRPU0FfU1VQRVJfVFJBQ0VfTEVWRUwgMAotCi0jaWZuZGVmIE00T1NBX1RSQUNFX0xFVkVMCi0jZGVmaW5lIE00T1NBX1RSQUNFX0xFVkVMICAgICAgIDAKLSNlbmRpZgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLSNlbmRpZgotCi0KLSNpZiAoTTRPU0FfREVCVUdfTEVWRUwgPj0gMSkgfHwgKE00T1NBX1NVUEVSX0RFQlVHX0xFVkVMID49IDEpCi0KLS8qIERlYnVnIG1hY3JvcyAqLwotZXh0ZXJuIE00T1NBX1ZvaWQgTTRPU0FfREVCVUdfdHJhY2VGdW5jdGlvbihNNE9TQV9VSW50MzIgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogZmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogc3RyaW5nQ29uZGl0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlIgcmV0dXJuZWRFcnJvcik7Ci0KLQotI2RlZmluZSBNNE9TQV9ERUJVR19JRngoY29uZCwgZXJyb3JDb2RlLCBtc2csIGxldmVsKVwKLSAgICAgIGlmKGNvbmQpXAotICAgICAge1wKLSAgICAgICAgIE00T1NBX0RFQlVHX3RyYWNlRnVuY3Rpb24oX19MSU5FX18sIChNNE9TQV9DaGFyKilfX0ZJTEVfXywgbGV2ZWwsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopI2NvbmQsIChNNE9TQV9DaGFyKiltc2csXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXJyb3JDb2RlKSk7XAotICAgICAgICAgcmV0dXJuKGVycm9yQ29kZSk7XAotICAgICAgfQotCi0jZGVmaW5lIE00T1NBX0RFQlVHKGVycm9yQ29kZSwgbXNnKVwKLSAgICAgICAgIE00T1NBX0RFQlVHX3RyYWNlRnVuY3Rpb24oX19MSU5FX18sIChNNE9TQV9DaGFyKilfX0ZJTEVfXywgMSxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikjZXJyb3JDb2RlLCAoTTRPU0FfQ2hhciopbXNnLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yQ29kZSkpOwotCi0jZWxzZSAvKihNNE9TQV9ERUJVR19MRVZFTCA+PSAxKSB8fCAoTTRPU0FfU1VQRVJfREVCVUdfTEVWRUwgPj0gMSkqLwotCi0KLSNkZWZpbmUgTTRPU0FfREVCVUcoZXJyb3JDb2RlLCBtc2cpCi0KLSNlbmRpZiAvKihNNE9TQV9ERUJVR19MRVZFTCA+PSAxKSB8fCAoTTRPU0FfU1VQRVJfREVCVUdfTEVWRUwgPj0gMSkqLwotCi0KLQotI2lmIChNNE9TQV9ERUJVR19MRVZFTCA+PSAxKSB8fCAoTTRPU0FfU1VQRVJfREVCVUdfTEVWRUwgPj0gMSkKLSAjZGVmaW5lIE00T1NBX0RFQlVHX0lGMShjb25kLCBlcnJvckNvZGUsIG1zZylcCi0gICAgICAgICBNNE9TQV9ERUJVR19JRngoY29uZCwgZXJyb3JDb2RlLCBtc2csIDEpCi0jZWxzZQotICNkZWZpbmUgTTRPU0FfREVCVUdfSUYxKGNvbmQsIGVycm9yQ29kZSwgbXNnKQotI2VuZGlmIC8qKE00T1NBX0RFQlVHX0xFVkVMID49IDEpIHx8IChNNE9TQV9TVVBFUl9ERUJVR19MRVZFTCA+PSAxKSovCi0KLQotI2lmIChNNE9TQV9ERUJVR19MRVZFTCA+PSAyKSB8fCAoTTRPU0FfU1VQRVJfREVCVUdfTEVWRUwgPj0gMikKLSAjZGVmaW5lIE00T1NBX0RFQlVHX0lGMihjb25kLCBlcnJvckNvZGUsIG1zZylcCi0gICAgICAgICBNNE9TQV9ERUJVR19JRngoY29uZCwgZXJyb3JDb2RlLCBtc2csIDIpCi0jZWxzZQotICNkZWZpbmUgTTRPU0FfREVCVUdfSUYyKGNvbmQsIGVycm9yQ29kZSwgbXNnKQotI2VuZGlmIC8qKE00T1NBX0RFQlVHX0xFVkVMID49IDIpIHx8IChNNE9TQV9TVVBFUl9ERUJVR19MRVZFTCA+PSAyKSovCi0KLQotI2lmIChNNE9TQV9ERUJVR19MRVZFTCA+PSAzKSB8fCAoTTRPU0FfU1VQRVJfREVCVUdfTEVWRUwgPj0gMykKLSAjZGVmaW5lIE00T1NBX0RFQlVHX0lGMyhjb25kLCBlcnJvckNvZGUsIG1zZylcCi0gICAgICAgICBNNE9TQV9ERUJVR19JRngoY29uZCwgZXJyb3JDb2RlLCBtc2csIDMpCi0jZWxzZQotICNkZWZpbmUgTTRPU0FfREVCVUdfSUYzKGNvbmQsIGVycm9yQ29kZSwgbXNnKQotI2VuZGlmIC8qKE00T1NBX0RFQlVHX0xFVkVMID49IDMpIHx8IChNNE9TQV9TVVBFUl9ERUJVR19MRVZFTCA+PSAzKSovCi0KLQotCi0vKiBUcmFjZSBtYWNyb3MgKi8KLQotI2lmIChNNE9TQV9UUkFDRV9MRVZFTCA+PSAxKSB8fCAoTTRPU0FfU1VQRVJfVFJBQ0VfTEVWRUwgPj0gMSkKLQotZXh0ZXJuIE00T1NBX1ZvaWQgTTRPU0FfVFJBQ0VfdHJhY2VGdW5jdGlvbihNNE9TQV9VSW50MzIgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogZmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvcmVJRCBjb3JlSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogc3RyaW5nTXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4gKTsKLQotCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0V4XzAobXNnLCBsZXZlbClcCi0gICAgICBNNE9TQV9UUkFDRV90cmFjZUZ1bmN0aW9uKF9fTElORV9fLCAoTTRPU0FfQ2hhciopX19GSUxFX18sXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ29yZUlEKU00VFJBQ0VfSUQsIGxldmVsLCAoTTRPU0FfQ2hhciopbXNnKTsKLQotCi0jZGVmaW5lIE00T1NBX1RSQUNFeF8xKG1zZywgcGFyYW0xLCBsZXZlbClcCi0gICAgICBNNE9TQV9UUkFDRV90cmFjZUZ1bmN0aW9uKF9fTElORV9fLCAoTTRPU0FfQ2hhciopX19GSUxFX18sXAotICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NvcmVJRClNNFRSQUNFX0lELCBsZXZlbCwgKE00T1NBX0NoYXIqKW1zZywgcGFyYW0xKTsKLQotCi0jZGVmaW5lIE00T1NBX1RSQUNFeF8yKG1zZywgcGFyYW0xLCBwYXJhbTIsIGxldmVsKVwKLSAgICAgIE00T1NBX1RSQUNFX3RyYWNlRnVuY3Rpb24oX19MSU5FX18sIChNNE9TQV9DaGFyKilfX0ZJTEVfXyxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Db3JlSUQpTTRUUkFDRV9JRCwgbGV2ZWwsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopbXNnLCBwYXJhbTEsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbTIpOwotCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0V4XzMobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBsZXZlbClcCi0gICAgICBNNE9TQV9UUkFDRV90cmFjZUZ1bmN0aW9uKF9fTElORV9fLCAoTTRPU0FfQ2hhciopX19GSUxFX18sXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ29yZUlEKU00VFJBQ0VfSUQsIGxldmVsLCAoTTRPU0FfQ2hhciopbXNnLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0xLHBhcmFtMiwgcGFyYW0zKTsKLQotCi0jZGVmaW5lIE00T1NBX1RSQUNFeF80KG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00LCBsZXZlbClcCi0gICAgICBNNE9TQV9UUkFDRV90cmFjZUZ1bmN0aW9uKF9fTElORV9fLCAoTTRPU0FfQ2hhciopX19GSUxFX18sXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ29yZUlEKU00VFJBQ0VfSUQsIGxldmVsLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKW1zZywgcGFyYW0xLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCk7Ci0KLQotI2RlZmluZSBNNE9TQV9UUkFDRXhfNShtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgcGFyYW01LCBsZXZlbClcCi0gICAgICBNNE9TQV9UUkFDRV90cmFjZUZ1bmN0aW9uKF9fTElORV9fLCAoTTRPU0FfQ2hhciopX19GSUxFX18sXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ29yZUlEKU00VFJBQ0VfSUQsIGxldmVsLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKW1zZywgcGFyYW0xLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgcGFyYW01KTsKLQotI2VuZGlmIC8qKE00T1NBX1RSQUNFX0xFVkVMID49IDEpIHx8IChNNE9TQV9TVVBFUl9UUkFDRV9MRVZFTCA+PSAxKSovCi0KLQotCi0jaWYgKE00T1NBX1RSQUNFX0xFVkVMID49IDEpIHx8IChNNE9TQV9TVVBFUl9UUkFDRV9MRVZFTCA+PSAxKQotI2RlZmluZSBNNE9TQV9UUkFDRTFfMChtc2cpXAotICAgICAgICBNNE9TQV9UUkFDRXhfMChtc2csIDEpCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0UxXzEobXNnLCBwYXJhbTEpXAotICAgICAgICBNNE9TQV9UUkFDRXhfMShtc2csIHBhcmFtMSwgMSkKLQotI2RlZmluZSBNNE9TQV9UUkFDRTFfMihtc2csIHBhcmFtMSwgcGFyYW0yKVwKLSAgICAgICAgTTRPU0FfVFJBQ0V4XzIobXNnLCBwYXJhbTEsIHBhcmFtMiwgMSkKLQotI2RlZmluZSBNNE9TQV9UUkFDRTFfMyhtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMpXAotICAgICAgICBNNE9TQV9UUkFDRXhfMyhtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIDEpCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0UxXzQobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQpXAotICAgICAgICBNNE9TQV9UUkFDRXhfNChtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgMSkKLQotI2RlZmluZSBNNE9TQV9UUkFDRTFfNShtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgcGFyYW01KVwKLSAgICAgICAgTTRPU0FfVFJBQ0V4XzUobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIHBhcmFtNSwgMSkKLQotI2Vsc2UgLyooTTRPU0FfVFJBQ0VfTEVWRUwgPj0gMSkgfHwgKE00T1NBX1NVUEVSX1RSQUNFX0xFVkVMID49IDEpKi8KLQotI2RlZmluZSBNNE9TQV9UUkFDRTFfMChtc2cpCi0jZGVmaW5lIE00T1NBX1RSQUNFMV8xKG1zZywgcGFyYW0xKQotI2RlZmluZSBNNE9TQV9UUkFDRTFfMihtc2csIHBhcmFtMSwgcGFyYW0yKQotI2RlZmluZSBNNE9TQV9UUkFDRTFfMyhtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMpCi0jZGVmaW5lIE00T1NBX1RSQUNFMV80KG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00KQotI2RlZmluZSBNNE9TQV9UUkFDRTFfNShtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgcGFyYW01KQotCi0jZW5kaWYgLyooTTRPU0FfVFJBQ0VfTEVWRUwgPj0gMSkgfHwgKE00T1NBX1NVUEVSX1RSQUNFX0xFVkVMID49IDEpKi8KLQotCi0jaWYgKE00T1NBX1RSQUNFX0xFVkVMID49IDIpIHx8IChNNE9TQV9TVVBFUl9UUkFDRV9MRVZFTCA+PSAyKQotI2RlZmluZSBNNE9TQV9UUkFDRTJfMChtc2cpXAotICAgICAgICBNNE9TQV9UUkFDRXhfMChtc2csIDIpCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0UyXzEobXNnLCBwYXJhbTEpXAotICAgICAgICBNNE9TQV9UUkFDRXhfMShtc2csIHBhcmFtMSwgMikKLQotI2RlZmluZSBNNE9TQV9UUkFDRTJfMihtc2csIHBhcmFtMSwgcGFyYW0yKVwKLSAgICAgICAgTTRPU0FfVFJBQ0V4XzIobXNnLCBwYXJhbTEsIHBhcmFtMiwgMikKLQotI2RlZmluZSBNNE9TQV9UUkFDRTJfMyhtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMpXAotICAgICAgICBNNE9TQV9UUkFDRXhfMyhtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIDIpCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0UyXzQobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQpXAotICAgICAgICBNNE9TQV9UUkFDRXhfNChtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgMikKLQotI2RlZmluZSBNNE9TQV9UUkFDRTJfNShtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgcGFyYW01KVwKLSAgICAgICAgTTRPU0FfVFJBQ0V4XzUobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIHBhcmFtNSwgMikKLQotI2Vsc2UgLyooTTRPU0FfVFJBQ0VfTEVWRUwgPj0gMikgfHwgKE00T1NBX1NVUEVSX1RSQUNFX0xFVkVMID49IDIpKi8KLQotI2RlZmluZSBNNE9TQV9UUkFDRTJfMChtc2cpCi0jZGVmaW5lIE00T1NBX1RSQUNFMl8xKG1zZywgcGFyYW0xKQotI2RlZmluZSBNNE9TQV9UUkFDRTJfMihtc2csIHBhcmFtMSwgcGFyYW0yKQotI2RlZmluZSBNNE9TQV9UUkFDRTJfMyhtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMpCi0jZGVmaW5lIE00T1NBX1RSQUNFMl80KG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00KQotI2RlZmluZSBNNE9TQV9UUkFDRTJfNShtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgcGFyYW01KQotI2VuZGlmIC8qKE00T1NBX1RSQUNFX0xFVkVMID49IDIpIHx8IChNNE9TQV9TVVBFUl9UUkFDRV9MRVZFTCA+PSAyKSovCi0KLQotI2lmIChNNE9TQV9UUkFDRV9MRVZFTCA+PSAzKSB8fCAoTTRPU0FfU1VQRVJfVFJBQ0VfTEVWRUwgPj0gMykKLSNkZWZpbmUgTTRPU0FfVFJBQ0UzXzAobXNnKVwKLSAgICAgICAgTTRPU0FfVFJBQ0V4XzAobXNnLCAzKQotCi0jZGVmaW5lIE00T1NBX1RSQUNFM18xKG1zZywgcGFyYW0xKVwKLSAgICAgICAgTTRPU0FfVFJBQ0V4XzEobXNnLCBwYXJhbTEsIDMpCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0UzXzIobXNnLCBwYXJhbTEsIHBhcmFtMilcCi0gICAgICAgIE00T1NBX1RSQUNFeF8yKG1zZywgcGFyYW0xLCBwYXJhbTIsIDMpCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0UzXzMobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zKVwKLSAgICAgICAgTTRPU0FfVFJBQ0V4XzMobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCAzKQotCi0jZGVmaW5lIE00T1NBX1RSQUNFM180KG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00KVwKLSAgICAgICAgTTRPU0FfVFJBQ0V4XzQobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIDMpCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0UzXzUobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIHBhcmFtNSlcCi0gICAgICAgIE00T1NBX1RSQUNFeF81KG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00LCBwYXJhbTUsIDMpCi0KLSNlbHNlIC8qKE00T1NBX1RSQUNFX0xFVkVMID49IDMpIHx8IChNNE9TQV9TVVBFUl9UUkFDRV9MRVZFTCA+PSAzKSovCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0UzXzAobXNnKQotI2RlZmluZSBNNE9TQV9UUkFDRTNfMShtc2csIHBhcmFtMSkKLSNkZWZpbmUgTTRPU0FfVFJBQ0UzXzIobXNnLCBwYXJhbTEsIHBhcmFtMikKLSNkZWZpbmUgTTRPU0FfVFJBQ0UzXzMobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zKQotI2RlZmluZSBNNE9TQV9UUkFDRTNfNChtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCkKLSNkZWZpbmUgTTRPU0FfVFJBQ0UzXzUobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIHBhcmFtNSkKLQotI2VuZGlmIC8qKE00T1NBX1RSQUNFX0xFVkVMID49IDMpIHx8IChNNE9TQV9TVVBFUl9UUkFDRV9MRVZFTCA+PSAzKSovCi0KLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogX000T1NBX0RFQlVHX0hfICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0Vycm9yLmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9FcnJvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NWMzMTc3Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0Vycm9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfRXJyb3IuaAotICogQGluZ3JvdXAgICAgICBPU0FMCi0gKiBAYnJpZWYgICAgICAgIERlZmluaXRpb24gb2YgY29tbW9uIGVycm9yIHR5cGVzCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBjb250YWlucyBtYWNyb3MgdG8gZ2VuZXJhdGUgYW5kIGFuYWx5emUgZXJyb3IgY29kZXMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0KLSNpZm5kZWYgTTRPU0FfRVJST1JfSAotI2RlZmluZSBNNE9TQV9FUlJPUl9ICi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotCi0vKiogTTRPU0FfRVJSIGlzIGEgMzIgYml0cyB1bnNpZ25lZCBpbnRlZ2VyLgotICogVG8gc29ydCByZXR1cm5lZCBjb2RlLCBhIHNwZWNpZmljIG5hbWluZyBjb252ZW50aW9uIG11c3QgYmUgZm9sbG93ZWQ6Ci0gKiAtIFNldmVyaXR5ICgyIGJpdHMpOiBJdCBtYXkgYnIgZWl0aGVyIDBiMDAgKG5vIGVycm9yKSwgMGIwMSAod2FybmluZykgb3IKLSAqICAgICAgICAgICAgICAgICAgICAgIDBiMDEgKGZhdGFsIGVycm9yKQotICogLSBDb3JlIElEICgxNCBiaXRzKTogSXQgaXMgYSB1bmlxdWUgSUQgZm9yIGVhY2ggY29yZSBjb21wb25lbnQKLSAqIC0gRXJyb3JJRCAoMTYgYml0cyk6IEl0IGlzIHRoZSBzcGVjaWZpYyBlcnJvciBjb2RlCi0KLSAqIEVBQ0ggQ09SRSBDT01QT05FTlQgRlVOQ1RJT04gU0hPVUxEIFJFVFVSTiBBTiBNNE9TQV9FUlIKLSovCi10eXBlZGVmIE00T1NBX1VJbnQzMiAgIE00T1NBX0VSUjsKLQotI2RlZmluZSBNNF9PSyAgICAgMAotI2RlZmluZSBNNF9XQVIgICAgMQotI2RlZmluZSBNNF9FUlIgICAgMgotCi0KLS8qIE1hY3JvIHRvIHByb2Nlc3MgTTRPU0FfRVJSICovCi0KLS8qKiBUaGlzIG1hY3JvIHRlc3RzIGlmIHRoZSBwcm92aWRlZCBNNE9TQV9FUlIgaXMgYSB3YXJuaW5nIG9yIG5vdCovCi0jZGVmaW5lIE00T1NBX0VSUl9JU19XQVJOSU5HKGVycm9yKSAgICgoKChlcnJvcik+PjMwKSA9PSBNNF9XQVIpID8gMTowKQotCi0vKiogVGhpcyBtYWNybyB0ZXN0cyBpZiB0aGUgcHJvdmlkZWQgTTRPU0FfRVJSIGlzIGEgZmF0YWwgZXJyb3Igb3Igbm90Ki8KLSNkZWZpbmUgTTRPU0FfRVJSX0lTX0VSUk9SKGVycm9yKSAgICgoKChlcnJvcik+PjMwKSA9PSBNNF9FUlIpID8gMTowKQotCi0vKiogVGhpcyBtYWNybyByZXR1cm5zIGFuIGVycm9yIGNvZGUgYWNjcm9kaW5nIHRvIHRoZSAzIHByb3ZpZGVkIGZpZWxkczoKLSAgKiBAYXJnIHNldmVyaXR5OiAoSU4pIFtNNE9TQV9VSW50MzJdIFNldmVyaXR5IHRvIHB1dCBpbiB0aGUgZXJyb3IgY29kZQotICAqIEBhcmcgY29yZUlEOiAoSU4pIFtNNE9TQV9VSW50MzJdIENvcmVJRCB0byBwdXQgaW4gdGhlIGVycm9yIGNvZGUKLSAgKiBAYXJnIGVycm9ySUQ6IChJTikgW000T1NBX1VJbnQzMl0gRXJyb3JJRCB0byBwdXQgaW4gdGhlIGVycm9yIGNvZGUqLwotI2RlZmluZSBNNE9TQV9FUlJfQ1JFQVRFKHNldmVyaXR5LCBjb3JlSUQsIGVycm9ySUQpXAotICAgKE00T1NBX1VJbnQzMikoKCgoTTRPU0FfVUludDMyKXNldmVyaXR5KTw8MzApKygoKChNNE9TQV9VSW50MzIpY29yZUlEKSYweDAwM0ZGRik8PDE2KSsoKChNNE9TQV9VSW50MzIpZXJyb3JJRCkmMHgwMEZGRkYpKQotCi0vKiogVGhpcyBtYWNybyBleHRyYWN0cyB0aGUgMyBmaWVsZHMgZnJvbSB0aGUgZXJyb3I6Ci0gICogQGFyZyBlcnJvcjogKElOKSBbTTRPU0FfRVJSXSBFcnJvciBjb2RlCi0gICogQGFyZyBzZXZlcml0eTogKE9VVCkgW000T1NBX1VJbnQzMl0gU2V2ZXJpdHkgdG8gcHV0IGluIHRoZSBlcnJvciBjb2RlCi0gICogQGFyZyBjb3JlSUQ6IChPVVQpIFtNNE9TQV9VSW50MzJdIENvcmVJRCB0byBwdXQgaW4gdGhlIGVycm9yIGNvZGUKLSAgKiBAYXJnIGVycm9ySUQ6IChPVVQpIFtNNE9TQV9VSW50MzJdIEVycm9ySUQgdG8gcHV0IGluIHRoZSBlcnJvciBjb2RlKi8KLSNkZWZpbmUgTTRPU0FfRVJSX1NQTElUKGVycm9yLCBzZXZlcml0eSwgY29yZUlELCBlcnJvcklEKVwKLSAgIHsgc2V2ZXJpdHk9KE00T1NBX1VJbnQzMikoKGVycm9yKT4+MzApO1wKLSAgICAgY29yZUlEPShNNE9TQV9VSW50MzIpKCgoZXJyb3IpPj4xNikmMHgwMDNGRkYpO1wKLSAgICAgKE00T1NBX1VJbnQzMikoZXJyb3JJRD0oZXJyb3IpJjB4MDBGRkZGKTsgfQotCi0KLS8qICJmYWtlIiBDb3JlSUQsIGlzIHVzZWQgdG8gcmVwb3J0IGFuIHVua25vd24gQ29yZUlELiBVc2VkIGJ5IHRoZSB0cmFjZSBzeXN0ZW0KLXdoZW4gdGhlIGNvcmUgSUQgbWFjcm8gaXNuJ3QgZGVmaW5lZC4gRGVmaW5lZCBoZXJlIGluc3RlYWQgb2YgQ29yZUlELmggdG8gYXZvaWQKLWludHJvZHVjaW5nIGRlcGVuZGVuY2llcyB0byBjb21tb24vaW5jLiAqLwotCi0jZGVmaW5lIE00VU5LTk9XTl9DT1JFSUQgICAgMHgzRkZGIC8qIG1heCBwb3NzaWJsZSBDb3JlSUQgKi8KLQotI2RlZmluZSBNNF9DT01NT04gICAgICAgICAgIDB4MDAgIC8qKjxDb21tb24qLwotI2RlZmluZSBNNE1QNF9DT01NT04gICAgICAgIDB4MDEgIC8qKjxDb3JlIE1QNCAoY29tbW9uKSovCi0jZGVmaW5lIE00TVA0X1dSSVRFUiAgICAgICAgMHgwMiAgLyoqPENvcmUgTVA0IHdyaXRlciovCi0jZGVmaW5lIE00TVA0X1JFQURFUiAgICAgICAgMHgwMyAgLyoqPENvcmUgTVA0IHJlYWRlciovCi0jZGVmaW5lIE00UlRTUF9DT01NT04gICAgICAgMHgxMSAgLyoqPENvcmUgUlRTUCBjb21tb24qLwotI2RlZmluZSBNNFJUU1BfV1JJVEVSICAgICAgIDB4MTIgIC8qKjxDb3JlIFJUU1AgdHJhbnNtaXR0ZXIqLwotI2RlZmluZSBNNFJUU1BfUkVBREVSICAgICAgIDB4MTMgIC8qKjxDb3JlIFJUU1AgcmVjZWl2ZXIqLwotI2RlZmluZSBNNFJUUF9XUklURVIgICAgICAgIDB4MTQgIC8qKjxDb3JlIFJUUC9SVENQIHJlY2VpdmVyKi8KLSNkZWZpbmUgTTRSVFBfUkVBREVSICAgICAgICAweDE1ICAvKio8Q29yZSBSVFAvUlRDUCB0cmFuc21pdHRlciovCi0jZGVmaW5lIE00U0FQX1dSSVRFUiAgICAgICAgMHgxNiAgLyoqPENvcmUgU0FQIHRyYW5zbWl0dGVyKi8KLSNkZWZpbmUgTTRTQVBfUkVBREVSICAgICAgICAweDE3ICAvKio8Q29yZSBTQVAgcmVjZWl2ZXIqLwotI2RlZmluZSBNNERWQkhfUkVBREVSICAgICAgICAweDE4ICAvKio8Q29yZSBEVkJIIHJlY2VpdmVyKi8KLSNkZWZpbmUgTTRTRFBfV1JJVEVSICAgICAgICAweDIyICAvKio8Q29yZSBTRFAgd3JpdGVyKi8KLSNkZWZpbmUgTTRTRFBfUkVBREVSICAgICAgICAweDMxICAvKio8Q29yZSBTRFAgcmVhZGVyKi8KLSNkZWZpbmUgTTRQQUtfQU1SICAgICAgICAgICAweDMyICAvKio8Q29yZSBwYWNrZXRpemVyIEFNUiAoUkZDMzI2NykqLwotI2RlZmluZSBNNERFUEFLX0FNUiAgICAgICAgIDB4MzMgIC8qKjxDb3JlIGRlLXBhY2tldGl6ZXIgQU1SIChSRkMzMjY3KSovCi0jZGVmaW5lIE00UEFLX0gyNjMgICAgICAgICAgMHgzNCAgLyoqPENvcmUgcGFja2V0aXplciBIMjYzIChSRkMyNDI5KSovCi0jZGVmaW5lIE00REVQQUtfSDI2MyAgICAgICAgMHgzNSAgLyoqPENvcmUgZGUtcGFja2V0aXplciBIMjYzKFJGQzI0MjkpKi8KLSNkZWZpbmUgTTRQQUtfU0lNUExFICAgICAgICAweDM2ICAvKio8Q29yZSBwYWNrZXRpemVyIFNpbXBsZURyYWZ0IChSRkMgeHh4eCkqLwotI2RlZmluZSBNNERFUEFLX1NJTVBMRSAgICAgIDB4MzcgIC8qKjxDb3JlIGRlLXBhY2tldGl6ZXIgU2ltcGxlRHJhZnQgKFJGQyB4eHh4KSovCi0jZGVmaW5lIE00UEFLXzMwMTZfVklERU8gICAgMHgzOCAgLyoqPENvcmUgcGFja2V0aXplciBSRkMzMDE2IHZpZGVvKi8KLSNkZWZpbmUgTTRERVBBS18zMDE2X1ZJREVPICAweDM5ICAvKio8Q29yZSBkZS1wYWNrZXRpemVyIFJGQzMwMTYgdmlkZW8qLwotI2RlZmluZSBNNFBBS18zMDE2X0FVRElPICAgIDB4M0EgIC8qKjxDb3JlIHBhY2tldGl6ZXIgUkZDMzAxNiBhdWRpbyAoTEFUTSkqLwotI2RlZmluZSBNNERFUEFLXzMwMTZfQVVESU8gIDB4M0IgIC8qKjxDb3JlIGRlLXBhY2tldGl6ZXIgUkZDMzAxNiBhdWRpbyAoTEFUTSkqLwotI2RlZmluZSBNNERFUEFLX0gyNjQgICAgICAgIDB4M0MgIC8qKjxDb3JlIGRlLXBhY2tldGl6ZXIgSDI2NCovCi0jZGVmaW5lIE00REVQQUtfUkVBTFYgICAgICAgIDB4M0QgIC8qKjxDb3JlIGRlLXBhY2tldGl6ZXIgUmVhbCBWaWRlbyAqLwotI2RlZmluZSBNNERFUEFLX1JFQUxBICAgICAgICAweDNFICAvKio8Q29yZSBkZS1wYWNrZXRpemVyIFJlYWwgQXVkaW8gKi8KLSNkZWZpbmUgTTRSRFRfUkVBREVSICAgICAgICAweDNGICAvKio8Q29yZSBSRFQgcmVjZWl2ZXIqLwotI2RlZmluZSBNNFRDUF9ETVVYICAgICAgICAgIDB4NTAgIC8qKjxDb3JlIFRDUCBkZW11eCovCi0jZGVmaW5lIE00SU9EX1BBUlNFUiAgICAgICAgMHg1MSAgLyoqPENvcmUgSU9EIHBhcnNlciovCi0jZGVmaW5lIE00T1NBX0ZJTEVfQ09NTU9OICAgMHg2MSAgLyoqPE9TQUwgZmlsZSBjb21tb24qLwotI2RlZmluZSBNNE9TQV9GSUxFX1dSSVRFUiAgIDB4NjIgIC8qKjxPU0FMIGZpbGUgd3JpdGVyKi8KLSNkZWZpbmUgTTRPU0FfRklMRV9SRUFERVIgICAweDYzICAvKio8T1NBTCBmaWxlIHJlYWRlciovCi0jZGVmaW5lIE00T1NBX0ZJTEVfRVhUUkEgICAgMHg2NCAgLyoqPE9TQUwgZmlsZSBleHRyYSovCi0jZGVmaW5lIE00T1NBX0RJUkVDVE9SWSAgICAgMHg2NSAgLyoqPE9TQUwgZGlyZWN0b3J5Ki8KLSNkZWZpbmUgTTRPU0FfU09DS0VUICAgICAgICAweDcxICAvKio8T1NBTCBzb2NrZXQgKGJvdGggcmVhZGVyIGFuZCB3cml0ZXIpKi8KLSNkZWZpbmUgTTRPU0FfVEhSRUFEICAgICAgICAweDgxICAvKio8T1NBTCB0aHJlYWQqLwotI2RlZmluZSBNNE9TQV9NVVRFWCAgICAgICAgIDB4ODIgIC8qKjxPU0FMIG11dGV4Ki8KLSNkZWZpbmUgTTRPU0FfU0VNQVBIT1JFICAgICAweDgzICAvKio8T1NBTCBzZW1hcGhvcmUqLwotI2RlZmluZSBNNE9TQV9DTE9DSyAgICAgICAgIDB4ODQgIC8qKjxPU0FMIGNsb2NrKi8KLSNkZWZpbmUgTTRPU0FfTUVNT1JZICAgICAgICAweDkxICAvKio8T1NBTCBtZW1vcnkqLwotI2RlZmluZSBNNENBTExfQkFDSyAgICAgICAgIDB4QTEgIC8qKjxDYWxsIEJhY2sgZXJyb3IqLwotI2RlZmluZSBNNE9TQV9VUkkgICAgICAgICAgIDB4QjEgIC8qKjxPU0FMIFVSSSBoYW5kbGVyKi8KLSNkZWZpbmUgTTRPU0FfU1RSSU5HICAgICAgICAweEIyICAvKio8T1NBTCBzdHJpbmcqLwotI2RlZmluZSBNNFNZU19DTUFQSSAgICAgICAgIDB4QjMgIC8qKjxTWVNURU0gQ29tbW9uIE1lZGkgQVBJKi8KLSNkZWZpbmUgTTRPU0FfQ0hBUlNUQVIgICAgICAweEI0ICAvKio8T1NBTCBDaGFyU3RhciovCi0jZGVmaW5lIE00UkVBQ1RPUiAgICAgICAgICAgMHhDMSAgLyoqPENvcmUgcmVhY3RvciovCi0jZGVmaW5lIE00VEVTVCAgICAgICAgICAgICAgMHhEMSAgLyoqPFRlc3QgY29tcG9uZW50Ki8KLSNkZWZpbmUgTTRTVEFDSyAgICAgICAgICAgICAgICAweEUxICAvKio8IENvcmUgSUQgb2YgdGhlIGludGVncmF0ZWQgc3RhY2sqLwotI2RlZmluZSBNNFNUQUNLX1JFQUwgICAgICAgIDB4RTIgIC8qKjxDb3JlIElEIG9mIHRoZSBSZWFsIGludGVncmF0ZWQgc3RhY2sgKi8KLSNkZWZpbmUgTTRUT09MX0xCVlRfUEFSQU0gICAweEYxICAvKio8TEJfVlQgY29uZmlnIGZpbGUgbWFuYWdlciovCi0jZGVmaW5lIE00VE9PTF9MSU5LX0xJU1QgICAgMHhGMiAgLyoqPFRvb2wgbGlua2VkIGxpc3QqLwotI2RlZmluZSBNNFRPT0xfQkFTRTY0ICAgICAgIDB4RjMgIC8qKjxDb3JlIGJhc2U2NCBlbmNvZGVyL2RlY29kZXIqLwotCi0KLQotLyogRGVmaW5pdGlvbiBvZiBjb21tb24gZXJyb3IgY29kZXMgKi8KLS8qKiB0aGVyZSBpcyBubyBlcnJvciovCi0jZGVmaW5lIE00Tk9fRVJST1IgICAgICAgICAgICAweDAwMDAwMDAwCi0KLS8qKiBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwqLwotI2RlZmluZSBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNF9DT01NT04sMHgwMDAwMDEpCi0vKiogVGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIG5vdyovCi0jZGVmaW5lIE00RVJSX1NUQVRFICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00X0NPTU1PTiwweDAwMDAwMikKLS8qKiBUaGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUqLwotI2RlZmluZSBNNEVSUl9BTExPQyAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNF9DT01NT04sMHgwMDAwMDMpCi0vKiogUHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUqLwotI2RlZmluZSBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNF9DT01NT04sMHgwMDAwMDQpCi0jZGVmaW5lIE00RVJSX0NPTlRFWFRfRkFJTEVEICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00X0NPTU1PTiwweDAwMDAwNSkKLSNkZWZpbmUgTTRFUlJfQkFEX1NUUkVBTV9JRCAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsTTRfQ09NTU9OLDB4MDAwMDA2KQotLyoqIFRoZSBvcHRpb25JRCBpcyBub3QgYSB2YWxpZCBvbmUqLwotI2RlZmluZSBNNEVSUl9CQURfT1BUSU9OX0lEICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNF9DT01NT04sMHgwMDAwMDcpCi0vKiogVGhpcyBvcHRpb24gaXMgYSB3cml0ZSBvbmx5IG9uZSovCi0jZGVmaW5lIE00RVJSX1dSSVRFX09OTFkgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00X0NPTU1PTiwweDAwMDAwOCkKLS8qKiBUaGlzIG9wdGlvbiBpcyBhIHJlYWQgb25seSBvbmUqLwotI2RlZmluZSBNNEVSUl9SRUFEX09OTFkgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNF9DT01NT04sMHgwMDAwMDkpCi0vKiogVGhpcyBmdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkIHlldCovCi0jZGVmaW5lIE00RVJSX05PVF9JTVBMRU1FTlRFRCAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00X0NPTU1PTiwweDAwMDAwQSkKLQotI2RlZmluZSAgICBNNEVSUl9VTlNVUFBPUlRFRF9NRURJQV9UWVBFICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRfQ09NTU9OLCAweDAwMDAwQikKLQotI2RlZmluZSBNNFdBUl9OT19EQVRBX1lFVCAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUixNNF9DT01NT04sMHgwMDAwMDEpCi0jZGVmaW5lIE00V0FSX05PX01PUkVfU1RSRUFNICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLE00X0NPTU1PTiwweDAwMDAwMikKLSNkZWZpbmUgTTRXQVJfSU5WQUxJRF9USU1FICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9XQVIsTTRfQ09NTU9OLDB4MDAwMDAzKQotI2RlZmluZSBNNFdBUl9OT19NT1JFX0FVICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUixNNF9DT01NT04sMHgwMDAwMDQpCi0jZGVmaW5lIE00V0FSX1RJTUVfT1VUICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLE00X0NPTU1PTiwweDAwMDAwNSkKLS8qKiBUaGUgYnVmZmVyIGlzIGZ1bGwqLwotI2RlZmluZSBNNFdBUl9CVUZGRVJfRlVMTCAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUixNNF9DT01NT04sMHgwMDAwMDYpCi0vKiBUaGUgc2VydmVyIGFza3MgZm9yIGEgcmVkaXJlY3Rpb24gKi8KLSNkZWZpbmUgTTRXQVJfUkVESVJFQ1QgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUixNNF9DT01NT04sMHgwMDAwMDcpCi0jZGVmaW5lIE00V0FSX1RPT19NVUNIX1NUUkVBTVMgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLE00X0NPTU1PTiwweDAwMDAwOCkKLS8qIFNGIENvZGVjIGRldGVjdGVkIElORk9fRk9STUFUX0NIQU5HRSBkdXJpbmcgZGVjb2RlICovCi0jZGVmaW5lIE00V0FSX0lORk9fRk9STUFUX0NIQU5HRSBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUiwgTTRfQ09NTU9OLCAweDAwMDAwOSkKLQotI2VuZGlmIC8qTTRPU0FfRVJST1JfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0V4cG9ydC5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRXhwb3J0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI3YTZlODEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRXhwb3J0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRPU0FfRXhwb3J0LmgKLSAqIEBicmllZiAgICBEYXRhIGFjY2VzcyBleHBvcnQgdHlwZXMgZm9yIEFuZHJvaWQKLSAqIEBub3RlICAgIFRoaXMgZmlsZSBkZWZpbmVzIHR5cGVzIHdoaWNoIG11c3QgYmUKLSAqICAgICAgICAgIHVzZWQgdG8gaW1wb3J0IG9yIGV4cG9ydCBhbnkgZnVuY3Rpb24uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIE00T1NBX0VYUE9SVF9ICi0jZGVmaW5lIE00T1NBX0VYUE9SVF9ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLypfX2NwbHVzcGx1cyovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgT1NBTCBFWFBPUlRTICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBNNE9TQUxfQ0hBUlNUQVJfRVhQT1JUX1RZUEUgICAgICAgICAgICAvKio8IE9TQUwgQ0hBUl9TVEFSICAgICAgICAqLwotI2RlZmluZSBNNE9TQUxfQ0xPQ0tfRVhQT1JUX1RZUEUgICAgICAgICAgICAvKio8IE9TQUwgQ0xPQ0sgICAgICAgICAgICAqLwotI2RlZmluZSBNNE9TQUxfREFURV9FWFBPUlRfVFlQRSAgICAgICAgICAgICAgICAvKio8IE9TQUwgREFURSAgICAgICAgICAgICovCi0jZGVmaW5lIE00T1NBTF9GSUxFX0VYUE9SVF9UWVBFICAgICAgICAgICAgICAgIC8qKjwgT1NBTCBGSUxFICAgICAgICAgICAgKi8KLSNkZWZpbmUgTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFICAgICAgICAgICAgLyoqPCBPU0FMIFJFQUwgVElNRSAgICAgICAgKi8KLSNkZWZpbmUgTTRPU0FMX1NPQ0tFVF9FWFBPUlRfVFlQRSAgICAgICAgICAgIC8qKjwgU09DS0VUICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE00T1NBTF9TVFJJTkdfRVhQT1JUX1RZUEUgICAgICAgICAgICAvKio8IE9TQUwgU1RSSU5HICAgICAgICAqLwotI2RlZmluZSBNNE9TQUxfVVJJX0VYUE9SVF9UWVBFICAgICAgICAgICAgICAgIC8qKjwgT1NBTCBVUkkgICAgICAgICAgICAqLwotI2RlZmluZSBNNE9TQUxfTUVNT1JZX0VYUE9SVF9UWVBFICAgICAgICAgICAgLyoqPCBPU0FMIE1FTU9SWSAgICAgICAgKi8KLSNkZWZpbmUgTTRPU0FMX1RSQUNFX0VYUE9SVF9UWVBFICAgICAgICAgICAgLyoqPCBPU0FMIFRSQUNFICAgICAgICAgICAgKi8KLSNkZWZpbmUgTTRPU0FMX1RPT0xfVElNRVJfRVhQT1JUX1RZUEUgICAgICAgIC8qKjwgT1NBTCBUT09MIFRJTUVSICAgICovCi0jZGVmaW5lIE00T1NBTF9TWVNURU1fQ01fRVhQT1JUX1RZUEUgICAgICAgIC8qKjwgU1lTVEVNIENPTU1PTiBBUEkgICAgKi8KLSNkZWZpbmUgTTRPU0FMX0xJTktFRF9MSVNUX0VYUE9SVF9UWVBFICAgICAgICAvKio8IFRPT0wgTElOS0VEIExJU1QgICAgKi8KLSNkZWZpbmUgTTRPU0FMX01FTU9SWV9NQU5BR0VSX0VYUE9SVF9UWVBFICAgIC8qKjwgTUVNT1JZIE1BTkFHRVIgICAgICAgICovCi0jZGVmaW5lIE00T1NBTF9UUkFDRV9NQU5BR0VSX0VYUE9SVF9UWVBFICAgIC8qKjwgVE9PTCBUUkFDRSBNQU5BR0VSICovCi0jZGVmaW5lIE00VlBTX0VYUE9SVF9UWVBFICAgICAgICAgICAgICAgICAgICAvKio8IFZQUyBBUEkgICAgICAgICAgICAqLwotI2RlZmluZSBNNEFQX0VYUE9SVF9UWVBFICAgICAgICAgICAgICAgICAgICAvKio8IEFVRElPIFBSRVNFTlRFUlMgICAgKi8KLSNkZWZpbmUgTTRWUF9FWFBPUlRfVFlQRSAgICAgICAgICAgICAgICAgICAgLyoqPCBWSURFTyBQUkVTRU5URVJTICAgICovCi0jZGVmaW5lIE00Q0JfRVhQT1JUX1RZUEUgICAgICAgICAgICAgICAgICAgIC8qKjwgQ2FsbCBiYWNrICAgICAgICAgICAgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLypfX2NwbHVzcGx1cyovCi0KLSNlbmRpZiAvKk00T1NBX0VYUE9SVF9IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZUNvbW1vbi5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZUNvbW1vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMmFmYjhjLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVDb21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9GaWxlQ29tbW9uLmgKLSAqIEBpbmdyb3VwICAgICAgT1NBTAotICogQGJyaWVmICAgICAgICBGaWxlIGNvbW1vbgotICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgZGVjbGFyZXMgZnVuY3Rpb25zIGFuZCB0eXBlcyB1c2VkIGJ5IGJvdGggdGhlIGZpbGUKLSAqICAgICAgICAgICAgICAgd3JpdGVyIGFuZCBmaWxlIHJlYWRlci4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLQotI2lmbmRlZiBNNE9TQV9GSUxFQ09NTU9OX0gKLSNkZWZpbmUgTTRPU0FfRklMRUNPTU1PTl9ICi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX1RpbWUuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX09wdGlvbklELmgiCi0KLQotdHlwZWRlZiBNNE9TQV9JbnQzMiBNNE9TQV9GaWxlUG9zaXRpb247Ci0KLS8qKiBUaGlzIGVudW0gZGVmaW5lcyB0aGUgYXBwbGljYXRpb24gbW9kZSBhY2Nlc3MuCi0gKiAgaWUsIHRoZSBhcHBsaWNhdGlvbiB1c2VzIGEgZmlsZSBkZXNjcmlwdG9yIHRvIHJlYWQgb3IgdG8gd3JpdGUgIG9yCi0gKiAgYm90aCB0byByZWFkIGFuZCB3cml0ZSBhdCB0aGUgc2FtZSB0aW1lLgotICogIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIE1NIHByb2plY3Qgb25seS4gSXQgZW5hYmxlcyB0byByZWFkIGFuZCB3cml0ZSB0byBhIGZpbGUKLSAqICB3aXRoIG9uZSBkZXNjcmlwdG9yLgotICovCi10eXBlZGVmIGVudW0KLXsKLSAgIE00T1NBX2tEZXNjTm9uZUFjY2VzcyAgICA9IDB4MDAsCi0gICBNNE9TQV9rRGVzY1JlYWRBY2Nlc3MgICAgPSAweDAxLCAgICAvKiogVGhlIERlc2NyaXB0b3IgcmVhZHMgb25seSBmcm9tIHRoZSBmaWxlICovCi0gICBNNE9TQV9rRGVzY1dyaXRlQWNjZXNzICAgID0gMHgwMiwgICAgLyoqIFRoZSBEZXNjcmlwdG9yIHdyaXRlcyBvbmx5IGZyb20gdGhlIGZpbGUqLwotICAgTTRPU0Ffa0Rlc2NSV0FjY2VzcyAgICAgICAgPSAweDAzICAgIC8qKiBUaGUgRGVzY3JpcHRvciByZWFkcyBhbmQgd3JpdGVzIGZyb20vaW4gdGhlIGZpbGUqLwotfSBNNE9TQV9EZXNjck1vZGVBY2Nlc3M7Ci0KLQotLyoqIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBmaWxlIG1vZGUgYWNjZXNzLiBCb3RoIHRleHQgbW9kZSBhcyBiaW5hcnkgbW9kZQotICAgIGNhbm5vdCBiZSBzZXQgdG9nZXRoZXIuKi8KLXR5cGVkZWYgZW51bQotewotICAgLyoqIFRoZSBmaWxlIG11c3QgYmUgYWNjZXNzZWQgaW4gcmVhZCBvbmx5IG1vZGUqLwotICAgTTRPU0Ffa0ZpbGVSZWFkICAgICAgICAgICAgID0gMHgwMSwKLSAgIC8qKiBUaGUgZmlsZSBtdXN0IGJlIGFjY2Vzc2VkIGluIHdyaXRlIG9ubHkgbW9kZSovCi0gICBNNE9TQV9rRmlsZVdyaXRlICAgICAgICAgICAgPSAweDAyLAotICAgLyoqIFRoZSBmaWxlIG11c3QgYmUgYWNjZXNzZWQgaW4gYXBwZW5kIG1vZGUgKEFuIGV4aXN0aW5nIGZpbGUgbXVzdAotICAgICAgIGJlIGF2YWlsYWJsZSB0byBhcHBlbmQgZGF0YSkqLwotICAgTTRPU0Ffa0ZpbGVBcHBlbmQgICAgICAgICAgID0gMHgwNCwKLSAgIC8qKiBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgaXQgd2lsbCBiZSBjcmVhdGVkKi8KLSAgIE00T1NBX2tGaWxlQ3JlYXRlICAgICAgICAgICA9IDB4MDgsCi0gICAvKiogRGF0YSBhcmUgcHJvY2Vzc2VkIGFzIGJpbmFyeSBvbmUsIHRoZXJlIGlzIG5vIGRhdGEgbWFuYWdlbWVudCovCi0gICBNNE9TQV9rRmlsZUlzVGV4dE1vZGUgICAgICAgPSAweDEwCi19IE00T1NBX0ZpbGVNb2RlQWNjZXNzOwotCi0KLS8qKiBUaGlzIHR5cGUgaXMgdXNlZCB0byBzdG9yZSBhIGRhdGUuKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAvKiogVGltZSBzY2FsZSAodGljayBudW1iZXIgcGVyIHNlY29uZCkqLwotICAgTTRPU0FfVUludDMyIHRpbWVTY2FsZTsKLSAgIC8qKiBEYXRlIGV4cHJlc3NlZCBpbiB0aGUgdGltZSBzY2FsZSovCi0gICBNNE9TQV9UaW1lICAgdGltZTsKLSAgIC8qKiBZZWFyIG9mIHRoZSBhYnNvbHV0ZSB0aW1lICgxOTAwLCAxOTcwIG9yIDIwMDApKi8KLSAgIE00T1NBX1VJbnQzMiByZWZlcmVuY2VZZWFyOwotfSBNNE9TQV9EYXRlOwotCi0KLS8qKiBUaGlzIHN0cnVjdXJlIGRlZmluZXMgdGhlIGZpbGUgYXR0cmlidXRlcyovCi10eXBlZGVmIHN0cnVjdAotewotICAgLyoqIFRoZSBmaWxlIG1vZGUgYWNjZXNzKi8KLSAgIE00T1NBX0ZpbGVNb2RlQWNjZXNzICAgIG1vZGVBY2Nlc3M7Ci0gICAvKiogVGhlIGNyZWF0aW9uIGRhdGUqLwotICAgTTRPU0FfRGF0ZSAgICAgICAgICAgICAgY3JlYXRpb25EYXRlOwotICAgLyoqIFRoZSBsYXN0IG1vZGlmaWNhdGlvbiBkYXRlKi8KLSAgIE00T1NBX0RhdGUgICAgICAgICAgICAgIG1vZGlmaWVkRGF0ZTsKLSAgIC8qKiBUaGUgbGFzdCBhY2Nlc3MgZGF0ZSAocmVhZCkqLwotICAgTTRPU0FfRGF0ZSAgICAgICAgICAgICAgbGFzdEFjY2Vzc0RhdGU7Ci19IE00T1NBX0ZpbGVBdHRyaWJ1dGU7Ci0KLQotCi0vKiogVGhpcyBlbnVtIGRlZmluZXMgdGhlIHNlZWsgYmVoYXZpb3IqLwotdHlwZWRlZiBlbnVtIE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZQotewotICAgLyoqIFJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUqLwotICAgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nICAgICAgICAgICAgPSAweDAxLAotICAgLyoqIFJlbGF0aXZlIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUqLwotICAgTTRPU0Ffa0ZpbGVTZWVrRW5kICAgICAgICAgICAgICAgICAgPSAweDAyLAotICAgLyoqIFJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGZpbGUgcG9zaXRpb24qLwotICAgTTRPU0Ffa0ZpbGVTZWVrQ3VycmVudCAgICAgICAgICAgICAgPSAweDAzCi19IE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZTsKLQotCi0vKiBFcnJvciBjb2RlcyAqLwotI2RlZmluZSBNNEVSUl9GSUxFX05PVF9GT1VORCAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNE9TQV9GSUxFX0NPTU1PTiwgMHgwMDAwMDEpCi0jZGVmaW5lIE00RVJSX0ZJTEVfTE9DS0VEICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00T1NBX0ZJTEVfQ09NTU9OLCAweDAwMDAwMikKLSNkZWZpbmUgTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1MgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRPU0FfRklMRV9DT01NT04sIDB4MDAwMDAzKQotI2RlZmluZSBNNEVSUl9GSUxFX0lOVkFMSURfUE9TSVRJT04gIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNE9TQV9GSUxFX0NPTU1PTiwgMHgwMDAwMDQpCi0KLQotI2VuZGlmIC8qTTRPU0FfRklMRUNPTU1PTl9IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZUNvbW1vbl9wcml2LmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlQ29tbW9uX3ByaXYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWViYTQ1Ni4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlQ29tbW9uX3ByaXYuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9GaWxlQ29tbW9uX3ByaXYuaAotICogQGluZ3JvdXAgICAgICBPU0FMCi0gKiBAYnJpZWYgICAgICAgIEZpbGUgY29tbW9uIHByaXZhdGUgZm9yIEFuZHJvaWQKLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGRlY2xhcmVzIGZ1bmN0aW9ucyBhbmQgdHlwZXMgdXNlZCBieSBib3RoIHRoZSBmaWxlCi0gKiAgICAgICAgICAgICAgIHdyaXRlciBhbmQgZmlsZSByZWFkZXIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIE00T1NBX0ZJTEVDT01NT05fUFJJVl9ICi0jZGVmaW5lIE00T1NBX0ZJTEVDT01NT05fUFJJVl9ICi0KLQotI2luY2x1ZGUgIk00T1NBX0ZpbGVDb21tb24uaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jZGVmaW5lIE00T1NBX2lzQWNjZXNzTW9kZUFjdGl2ZWQoY29tcG91bmRfbW9kZV9hY2Nlc3MsZWxlbWVudGFyeV9tb2RlX2FjY2VzcylcCi0gICAgICAgICgoKGNvbXBvdW5kX21vZGVfYWNjZXNzKSYoZWxlbWVudGFyeV9tb2RlX2FjY2VzcykpPyAxOjApCi0KLQotdHlwZWRlZiBlbnVtIE00T1NBX0xhc3RTZWVrCi17Ci0gICBTZWVrTm9uZSwKLSAgIFNlZWtSZWFkLAotICAgU2Vla1dyaXRlCi19IE00T1NBX0xhc3RTZWVrOwotCi0vKiogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgZmlsZSBjb250ZXh0Ki8KLXR5cGVkZWYgc3RydWN0IHsKLSAgIE00T1NBX1VJbnQzMiAgICAgICAgIGNvcmVJRF9yZWFkOwotICAgTTRPU0FfVUludDMyICAgICAgICAgY29yZUlEX3dyaXRlOwotICAgRklMRSogICAgICAgICAgICAgICAgZmlsZV9kZXNjOwotICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBVUkwgKi8KLSAgIE00T1NBX0NoYXIqICAgICAgICAgIHVybF9uYW1lOwotICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBmaWxlICovCi0gICBNNE9TQV9DaGFyKiAgICAgICAgICBmaWxlX25hbWU7Ci0gICAvKiogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGZpbGUgKi8KLSAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgIGZpbGVfc2l6ZTsKLSAgIC8qKiBUaGUgZmlsZSBtb2RlIGFjY2VzcyB1c2VkIHRvIG9wZW4gdGhlIGZpbGUgKi8KLSAgIE00T1NBX0ZpbGVNb2RlQWNjZXNzIGFjY2Vzc19tb2RlOwotICAgTTRPU0FfTGFzdFNlZWsgICAgICAgY3VycmVudF9zZWVrOwotICAgTTRPU0FfRmlsZVBvc2l0aW9uICAgcmVhZF9wb3NpdGlvbjsKLSAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgIHdyaXRlX3Bvc2l0aW9uOwotICAgTTRPU0FfQm9vbCAgICAgICAgICAgYl9pc19lbmRfb2ZfZmlsZTsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgIE00T1NBX0NvbnRleHQgICAgICAgIHNlbWFwaG9yZV9jb250ZXh0OwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotCi0gICAvKiBUaGVzZSB0d28gdmFyaWFibGVzIHdlcmUgYWRkZWQgdG8gbWFuYWdlIGNhc2Ugd2hlcmUgYSBmaWxlCi0gICAgKiBpcyBvcGVuZWQgaW4gcmVhZCBhbmQgd3JpdGUgbW9kZSB3aXRoIG9uZSBkZXNjcmlwdG9yICovCi0gICAgTTRPU0FfRGVzY3JNb2RlQWNjZXNzICAgIG1fRGVzY3JNb2RlQWNjZXNzOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1fdWlMb2NrTW9kZTsKLQotCi19IE00T1NBX0ZpbGVDb250ZXh0OwotCi0KLQotTTRPU0FfRVJSIE00T1NBX2ZpbGVDb21tb25PcGVuKE00T1NBX1VJbnQxNiBjb3JlX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogVVJMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVNb2RlQWNjZXNzIGZpbGVNb2RlQWNjZXNzKTsKLQotTTRPU0FfRVJSIE00T1NBX2ZpbGVDb21tb25DbG9zZShNNE9TQV9VSW50MTYgY29yZV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLQotTTRPU0FfRVJSIE00T1NBX2ZpbGVDb21tb25HZXRBdHRyaWJ1dGUoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZUF0dHJpYnV0ZSogYXR0cmlidXRlKTsKLQotTTRPU0FfRVJSIE00T1NBX2ZpbGVDb21tb25HZXRVUkwoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhcioqIHVybCk7Ci0KLU00T1NBX0VSUiBNNE9TQV9maWxlQ29tbW9uR2V0RmlsZW5hbWUoTTRPU0FfQ2hhciogdXJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiogZmlsZW5hbWUpOwotCi1NNE9TQV9FUlIgTTRPU0FfZmlsZUNvbW1vblNlZWsoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZSBzZWVrTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qIHBvc2l0aW9uKTsKLQotI2lmZGVmIFVURl9DT05WRVJTSU9OCi1NNE9TQV9FUlIgTTRPU0FfVG9VVEY4X09TQUwgKE00T1NBX1ZvaWQgICAqcEJ1ZmZlckluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCAgKnBCdWZmZXJPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiAqYnVmZmVyT3V0U2l6ZSk7Ci0jZW5kaWYgLypVVEZfQ09OVkVSU0lPTiovCi0KLQotI2VuZGlmIC8qTTRPU0FfRklMRUNPTU1PTl9QUklWX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlUmVhZGVyLmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlUmVhZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMyMjc1NmQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZVJlYWRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX0ZpbGVSZWFkZXIuaAotICogQGluZ3JvdXAgICAgICBPU0FMCi0gKiBAYnJpZWYgICAgICAgIEZpbGUgcmVhZGVyCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBkZWNsYXJlcyBmdW5jdGlvbnMgYW5kIHR5cGVzIHRvIHJlYWQgYSBmaWxlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0jaWZuZGVmIE00T1NBX0ZJTEVSRUFERVJfSAotI2RlZmluZSBNNE9TQV9GSUxFUkVBREVSX0gKLQotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVDb21tb24uaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLQotCi0KLS8qKiBUaGlzIGVudW0gZGVmaW5lcyB0aGUgb3B0aW9uIElEIHRvIGJlIHVzZWQgaW4gTTRPU0FfRmlsZVJlYWRHZXRPcHRpb24oKQotICAgIGFuZCBNNE9TQV9GaWxlUmVhZFNldE9wdGlvbigpKi8KLXR5cGVkZWYgZW51bSBNNE9TQV9GaWxlUmVhZE9wdGlvbklECi17Ci0gICAvKiogR2V0IHRoZSBmaWxlIHNpemUgKE00T1NBX2Zwb3MqKSovCi0gICBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlU2l6ZQotICAgICAgICAgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00T1NBX0ZJTEVfUkVBREVSLCAweDAxKSwKLQotICAgICAgLyoqIEdldCB0aGUgZmlsZSBhdHRyaWJ1dGVzIChNNE9TQV9GaWxlQXR0cmlidXRlKikqLwotICAgTTRPU0Ffa0ZpbGVSZWFkR2V0RmlsZUF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00T1NBX0ZJTEVfUkVBREVSLCAweDAyKSwKLQotICAgLyoqIEdldCB0aGUgZmlsZSBVUkwsIHByb3ZpZGVkIGJ5IHRoZSBNNE9TQV9GaWxlUmVhZE9wZW4gKE00T1NBX0NoYXIqKSovCi0gICBNNE9TQV9rRmlsZVJlYWRHZXRVUkwKLSAgICAgICAgICAgICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNE9TQV9GSUxFX1JFQURFUiwgMHgwMyksCi0KLSAgIC8qKiBHZXQgdGhlIGZpbGUgcG9zaXRpb24gKE00T1NBX2Zwb3MqKSovCi0gICBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlUG9zaXRpb24KLSAgICAgICAgICAgICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNE9TQV9GSUxFX1JFQURFUiwgMHgwNCksCi0KLSAgIC8qKiBDaGVjayBlbmQgb2YgZmlsZTogVFJVRSBpZiB0aGUgRU9GIGhhcyBiZWVuIHJlYWNoZWQsIEZBTFNFIGVsc2UKLSAgICAgICAoTTRPU0FfQm9vbCopKi8KLSAgIE00T1NBX2tGaWxlUmVhZElzRU9GCi0gICAgICAgICAgICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRPU0FfRklMRV9SRUFERVIsIDB4MDUpLAotCi0gICAvKiogQ2hlY2sgbG9jayBvZiBmaWxlICovCi0gICBNNE9TQV9rRmlsZVJlYWRMb2NrTW9kZQotICAgICAgICAgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQURXUklURSwgTTRPU0FfRklMRV9SRUFERVIsIDB4MDYpCi0KLX0gTTRPU0FfRmlsZVJlYWRPcHRpb25JRDsKLQotCi0KLQotCi0vKiogVGhpcyBzdHJ1Y3R1cmUgc3RvcmVzIHRoZSBzZXQgb2YgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgdG8gYWNjZXNzIHRvIGEKLSAgICBmaWxlIGluIHJlYWQgbW9kZSovCi10eXBlZGVmIHN0cnVjdAotewotICAgTTRPU0FfRVJSICgqb3BlblJlYWQpICAgKE00T1NBX0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogZmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGZpbGVNb2RlQWNjZXNzKTsKLQotICAgTTRPU0FfRVJSICgqcmVhZERhdGEpICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9NZW1BZGRyOCBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiBzaXplKTsKLQotICAgTTRPU0FfRVJSICgqc2VlaykgICAgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGUgc2Vla01vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwb3NpdGlvbik7Ci0KLSAgIE00T1NBX0VSUiAoKmNsb3NlUmVhZCkgIChNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotCi0gICBNNE9TQV9FUlIgKCpzZXRPcHRpb24pICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkT3B0aW9uSUQgb3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSk7Ci0KLSAgIE00T1NBX0VSUiAoKmdldE9wdGlvbikgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRPcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uICpvcHRpb25WYWx1ZSk7Ci19IE00T1NBX0ZpbGVSZWFkUG9pbnRlcjsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17Ci0jZW5kaWYKLQotTTRPU0FMX0ZJTEVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkT3BlbiAgICAgICAgKE00T1NBX0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogZmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGZpbGVNb2RlQWNjZXNzKTsKLQotTTRPU0FMX0ZJTEVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkRGF0YSAgICAgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9NZW1BZGRyOCBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiBzaXplKTsKLQotTTRPU0FMX0ZJTEVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkU2VlayAgICAgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGUgc2Vla01vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwb3NpdGlvbik7Ci0KLU00T1NBTF9GSUxFX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9maWxlUmVhZENsb3NlICAgICAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotCi1NNE9TQUxfRklMRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRHZXRPcHRpb24gICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkT3B0aW9uSUQgb3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiAqb3B0aW9uVmFsdWUpOwotCi1NNE9TQUxfRklMRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRTZXRPcHRpb24gICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkT3B0aW9uSUQgb3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAgIC8qTTRPU0FfRklMRVJFQURFUl9IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZVJlYWRlcl9wcml2LmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlUmVhZGVyX3ByaXYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzI3YjA4Ni4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlUmVhZGVyX3ByaXYuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX0ZpbGVSZWFkZXJfcHJpdi5oCi0gKiBAaW5ncm91cCAgICAgIE9TQUwKLSAqIEBicmllZiAgICAgICAgRmlsZSByZWFkZXIgcHJpdmF0ZSBmb3IgQW5kcm9pZAotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgTTRPU0FfRklMRVJFQURFUl9QUklWX0gKLSNkZWZpbmUgTTRPU0FfRklMRVJFQURFUl9QUklWX0gKLQotCi0vKiogVGhvc2UgZGVmaW5lIGVuYWJsZS9kaXNhYmxlIG9wdGlvbiBJRCovCi0KLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfRklMRV9SRUFEX0dFVF9GSUxFX1NJWkUgICAgICAgICAgICAgICBNNE9TQV9UUlVFCi0jZGVmaW5lIE00T1NBX09QVElPTklEX0ZJTEVfUkVBRF9HRVRfRklMRV9BVFRSSUJVVEUgICAgICAgICAgTTRPU0FfVFJVRQotI2RlZmluZSBNNE9TQV9PUFRJT05JRF9GSUxFX1JFQURfR0VUX1VSTCAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSVUUKLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfRklMRV9SRUFEX0dFVF9GSUxFX1BPU0lUSU9OICAgICAgICAgICBNNE9TQV9UUlVFCi0jZGVmaW5lIE00T1NBX09QVElPTklEX0ZJTEVfUkVBRF9JU19FT0YgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJVRQotCi0jZW5kaWYgLypNNE9TQV9GSUxFUkVBREVSX1BSSVZfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVXcml0ZXIuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVXcml0ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWExMTMzMS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlV3JpdGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfRmlsZVdyaXRlci5oCi0gKiBAaW5ncm91cCAgICAgIE9TQUwKLSAqIEBicmllZiAgICAgICAgRmlsZSB3cml0ZXIKLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGRlY2xhcmVzIGZ1bmN0aW9ucyBhbmQgdHlwZXMgdG8gd3JpdGUgaW4gYSBmaWxlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0jaWZuZGVmIE00T1NBX0ZJTEVXUklURVJfSAotI2RlZmluZSBNNE9TQV9GSUxFV1JJVEVSX0gKLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlQ29tbW9uLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0KLQotLyoqIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBvcHRpb24gSUQgdG8gYmUgdXNlZCBpbiBNNE9TQV9GaWxlV3JpdGVHZXRPcHRpb24oKQotYW5kIE00T1NBX0ZpbGVXcml0ZVNldE9wdGlvbigpKi8KLXR5cGVkZWYgZW51bQotewotICAgLyoqIEdldCB0aGUgZmlsZSBVUkwsIHByb3ZpZGVkIGJ5IHRoZSBNNE9TQV9GaWxlV3JpdGVPcGVuIChNNE9TQV9DaGFyKikqLwotICAgTTRPU0Ffa0ZpbGVXcml0ZUdldFVSTAotICAgICAgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00T1NBX0ZJTEVfV1JJVEVSLCAweDAxKSwKLQotICAgLyoqIEdldCB0aGUgZmlsZSBhdHRyaWJ1dGVzIChNNE9TQV9GaWxlQXR0cmlidXRlKikqLwotICAgTTRPU0Ffa0ZpbGVXcml0ZUdldEF0dHJpYnV0ZQotICAgICAgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00T1NBX0ZJTEVfV1JJVEVSLCAweDAyKSwKLQotICAgLyoqIEdldCB0aGUgcmVhZGVyIGNvbnRleHQgZm9yIHJlYWQgJiB3cml0ZSBmaWxlLiAoTTRPU0FfQ29udGV4dCopKi8KLSAgIE00T1NBX2tGaWxlV3JpdGVHZXRSZWFkZXJDb250ZXh0Ci0gICAgICAgICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRPU0FfRklMRV9XUklURVIsIDB4MDMpLAotCi0gICBNNE9TQV9rRmlsZVdyaXRlR2V0RmlsZVBvc2l0aW9uCi0gICAgICAgICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRPU0FfRklMRV9XUklURVIsIDB4MDQpLAotCi0gICBNNE9TQV9rRmlsZVdyaXRlR2V0RmlsZVNpemUKLSAgICAgICAgICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNE9TQV9GSUxFX1dSSVRFUiwgMHgwNSksCi0KLQotICAgIE00T1NBX2tGaWxlV3JpdGVMb2NrTW9kZQotICAgICAgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQURXUklURSwgTTRPU0FfRklMRV9XUklURVIsIDB4MDYpLAotCi0KLSAgIC8qKiBDaGVjayBsb2NrIG9mIGZpbGUgKi8KLSAgIE00T1NBX2tGaWxlV3JpdGVEZXNjTW9kZQotICAgICAgICAgICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFEV1JJVEUsIE00T1NBX0ZJTEVfV1JJVEVSLCAweDA3KQotfSBNNE9TQV9GaWxlV3JpdGVPcHRpb25JRDsKLQotCi0vKiogVGhpcyBzdHJ1Y3R1cmUgc3RvcmVzIHRoZSBzZXQgb2YgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgdG8gYWNjZXNzIHRvIGEgZmlsZQotICAgIGluIHJlYWQgbW9kZSovCi10eXBlZGVmIHN0cnVjdAotewotICAgTTRPU0FfRVJSICgqb3BlbldyaXRlKSAgIChNNE9TQV9Db250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBmaWxlRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGZpbGVNb2RlQWNjZXNzKTsKLQotICAgTTRPU0FfRVJSICgqd3JpdGVEYXRhKSAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX01lbUFkZHI4IGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBzaXplKTsKLQotICAgTTRPU0FfRVJSICgqc2VlaykgICAgICAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZSBzZWVrTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwb3NpdGlvbik7Ci0KLSAgIE00T1NBX0VSUiAoKkZsdXNoKSAgICAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLSAgIE00T1NBX0VSUiAoKmNsb3NlV3JpdGUpICAoTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLSAgIE00T1NBX0VSUiAoKnNldE9wdGlvbikgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSk7Ci0KLSAgIE00T1NBX0VSUiAoKmdldE9wdGlvbikgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiogb3B0aW9uVmFsdWUpOwotfSBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlcjsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17Ci0jZW5kaWYKLQotTTRPU0FMX0ZJTEVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZU9wZW4gICAgICAgKE00T1NBX0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogZmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGZpbGVNb2RlQWNjZXNzKTsKLQotTTRPU0FMX0ZJTEVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZURhdGEgICAgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9NZW1BZGRyOCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBzaXplKTsKLQotLyogUGllcnJlIExlYmVhdXBpbiAyMDA4LzA0LzI5OiBXQVJOSU5HISB0aGUgZmVhdHVyZSBvZiBmaWxlKlNlZWsgd2hpY2ggcmV0dXJucwotdGhlIHBvc2l0aW9uIGluIHRoZSBmaWxlIChmcm9tIHRoZSBiZWdpbm5pbmcpIGFmdGVyIHRoZSBzZWVrIGluIHRoZSAicG9zaXRpb24iCi1wb2ludGVyIGhhcyBiZWVuIGZvdW5kIHRvIGJlIHVucmVsaWFibHkgKG9yIHNvbWV0aW1lcyBub3QgYXQgYWxsKSBpbXBsZW1lbnRlZAotaW4gc29tZSBPU0FMcywgc28gcmVseWluZyBvbiBpdCBpcyBzdHJvbmdseSBkaXNjb3VyYWdlZCwgdW5sZXNzIHlvdSByZWFsbHkgd2FudAotdG8gaGF2ZSBhIHBpenphIGV2ZW5pbmcuICovCi1NNE9TQUxfRklMRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlU2VlayAgICAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZSBzZWVrTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qIHBvc2l0aW9uKTsKLQotTTRPU0FMX0ZJTEVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZUNsb3NlICAgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCk7Ci0KLU00T1NBTF9GSUxFX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9maWxlV3JpdGVGbHVzaCAgICAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotCi1NNE9TQUxfRklMRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlR2V0T3B0aW9uICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX09wdGlvbklEIG9wdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24qIG9wdGlvblZhbHVlKTsKLQotTTRPU0FMX0ZJTEVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZVNldE9wdGlvbiAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotCi0jZW5kaWYgLypNNE9TQV9GSUxFV1JJVEVSX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlV3JpdGVyX3ByaXYuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVXcml0ZXJfcHJpdi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZDk3MmY0Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVXcml0ZXJfcHJpdi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfRmlsZVdyaXRlcl9wcml2LmgKLSAqIEBpbmdyb3VwICAgICAgT1NBTAotICogQGJyaWVmICAgICAgICBGaWxlIHdyaXRlciBwcml2YXRlIGZvciBBbmRyb2lkCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgTTRPU0FfRklMRVdSSVRFUl9QUklWX0gKLSNkZWZpbmUgTTRPU0FfRklMRVdSSVRFUl9QUklWX0gKLQotCi0vKiogVGhvc2UgZGVmaW5lIGVuYWJsZS9kaXNhYmxlIG9wdGlvbiBJRCovCi0KLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfRklMRV9XUklURV9HRVRfRklMRV9TSVpFICAgICAgICAgICAgICBNNE9TQV9UUlVFCi0jZGVmaW5lIE00T1NBX09QVElPTklEX0ZJTEVfV1JJVEVfR0VUX0ZJTEVfQVRUUklCVVRFICAgICAgICAgTTRPU0FfVFJVRQotI2RlZmluZSBNNE9TQV9PUFRJT05JRF9GSUxFX1dSSVRFX0dFVF9SRUFERVJfQ09OVEVYVCAgICAgICAgIE00T1NBX1RSVUUKLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfRklMRV9XUklURV9HRVRfRklMRV9QT1NJVElPTiAgICAgICAgICBNNE9TQV9UUlVFCi0jZGVmaW5lIE00T1NBX09QVElPTklEX0ZJTEVfV1JJVEVfR0VUX1VSTCAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJVRQotCi0jZW5kaWYgLypNNE9TQV9GSUxFV1JJVEVSX1BSSVZfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX01lbW9yeS5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfTWVtb3J5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE0ZDE1Y2MuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfTWVtb3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9NZW1vcnkuaAotICogQGluZ3JvdXAgICAgICBPU0FMCi0gKiBAYnJpZWYgICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIGZ1bmN0aW9uIHByb3RvdHlwZXMgdG8gYWxsb2NhdGUKLSAqICAgICAgICAgICAgICAgYW5kIGZyZWUgbWVtb3J5LgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBNNE9TQV9NRU1PUllfSAotI2RlZmluZSBNNE9TQV9NRU1PUllfSAotCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiIC8qZm9yIE00T1NBX0NvcmVJRCBkZWZpbml0aW9uKi8KLQotdHlwZWRlZiBNNE9TQV9JbnQzMiogTTRPU0FfTWVtQWRkcjMyOwotdHlwZWRlZiBNNE9TQV9JbnQ4KiAgTTRPU0FfTWVtQWRkcjg7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotewotI2VuZGlmCi0KLU00T1NBTF9NRU1PUllfRVhQT1JUX1RZUEUgZXh0ZXJuIE00T1NBX01lbUFkZHIzMiBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MgKE00T1NBX1VJbnQzMiBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29yZUlEIGNvcmVJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIHN0cmluZyk7Ci0KLU00T1NBTF9NRU1PUllfRVhQT1JUX1RZUEUgZXh0ZXJuIE00T1NBX0VSUiBNNE9TQV9yYW5kSW5pdCh2b2lkKTsKLQotCi1NNE9TQUxfTUVNT1JZX0VYUE9SVF9UWVBFIGV4dGVybiBNNE9TQV9FUlIgTTRPU0FfcmFuZChNNE9TQV9JbnQzMiogb3V0X3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIG1heF92YWx1ZSk7Ci0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX011dGV4LmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9NdXRleC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNDk2YmRkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX011dGV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9NdXRleC5oCi0gKiBAaW5ncm91cCAgICAgIE9TQUwKLSAqIEBicmllZiAgICAgICAgbXV0ZXggQVBJCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0KLSNpZm5kZWYgTTRPU0FfTVVURVhfSAotI2RlZmluZSBNNE9TQV9NVVRFWF9ICi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17Ci0KLSNlbmRpZgotCi1NNE9TQUxfUkVBTFRJTUVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX211dGV4T3BlbiggICAgTTRPU0FfQ29udGV4dCogY29udGV4dCApOwotCi0KLU00T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfbXV0ZXhMb2NrKCAgICBNNE9TQV9Db250ZXh0ICBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyICAgdGltZW91dCApOwotCi0KLU00T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfbXV0ZXhVbmxvY2soICBNNE9TQV9Db250ZXh0ICBjb250ZXh0ICk7Ci0KLQotTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9tdXRleENsb3NlKCAgIE00T1NBX0NvbnRleHQgIGNvbnRleHQgKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotCi0jZW5kaWYgLypNNE9TQV9NVVRFWF9IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfT3B0aW9uSUQuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX09wdGlvbklELmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYxYjkwNDQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfT3B0aW9uSUQuaAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX09wdGlvbklELmgKLSAqIEBpbmdyb3VwICAgICAgT1NBTAotICogQGJyaWVmICAgICAgICBPcHRpb24gSUQgbWFjcm9zCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIG1hY3JvcyB0byBnZW5lcmF0ZSBhbmQgYW5hbHl6ZSBvcHRpb24gSUQuCi0gKiAgICAgICAgICAgICAgIE9wdGlvbiBJRCBpcyB1c2VkIGJ5IE00WVlZX1pac2V0T3B0aW9uKCkgYW5kCi0gKiAgICAgICAgICAgICAgIE00WVlZX1paZ2V0T3B0aW9uKCkgZnVuY3Rpb25zLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBNNE9TQV9PUFRJT05JRF9ICi0jZGVmaW5lIE00T1NBX09QVElPTklEX0gKLQotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLQotLyoqIE00T1NBX09wdGlvbklEIGlzIGEgMzIgYml0cyB1bnNpZ25lZCBpbnRlZ2VyLgotLSBSaWdodCBhY2Nlc3MgKDIgYml0cyk6IFNvbWUgb3B0aW9ucyBtYXkgaGF2ZSByZWFkIG9ubHksIHdyaXRlIG9ubHkgb3IgcmVhZAotICBhbmQgd3JpdGUgYWNjZXNzCi0tIENvcmUgSUQgKDE0IGJpdHMpOiBJdCBpcyBhIHVuaXF1ZSBJRCBmb3IgZWFjaCBjb3JlIGNvbXBvbmVudAotLSBTdWJPcHRpb24gSUQgKDE2IGJpdHMpOiBUbyBzZWxlY3Qgd2hpY2ggb3B0aW9uIGluIGEgc3BlY2lmaWMgY29yZSBjb21wb25lbnQKLSovCi10eXBlZGVmIE00T1NBX1VJbnQzMiBNNE9TQV9PcHRpb25JRDsKLXR5cGVkZWYgdm9pZCogICAgICAgIE00T1NBX0RhdGFPcHRpb247Ci0KLSNkZWZpbmUgTTRfUkVBRCAgICAgIDB4MDEKLSNkZWZpbmUgTTRfV1JJVEUgICAgIDB4MDIKLSNkZWZpbmUgTTRfUkVBRFdSSVRFIDB4MDMKLQotLyogTWFjcm8gdG8gcHJvY2VzcyBNNE9TQV9PcHRpb25JRCAqLwotCi0vKiogVGhpcyBtYWNybyBjcmVhdGVzIGFuIG9wdGlvbklEIGdpdmVuIHJlYWQvd3JpdGUgYWNjZXNzLAotICAgIGNvcmVJRCBhbmQgU3ViT3B0aW9uSUQqLwotI2RlZmluZSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKHJpZ2h0LCBjb3JlSUQsIGVycm9ySUQpXAotICAgKE00T1NBX0ludDMyKSgoKCgoKE00T1NBX1VJbnQzMilyaWdodCkmMHgwMyk8PDMwKSkrKCgoKE00T1NBX1VJbnQzMiljb3JlSUQpJjB4MDAzRkZGKTw8MTYpKygoKE00T1NBX1VJbnQzMillcnJvcklEKSYweDAwRkZGRikpCi0KLS8qKiBUaGlzIG1hY3JvIHNwbGl0cyBhbiBvcHRpb25JRCBpbnRvIHJlYWQvd3JpdGUgYWNjZXNzLAotICAgIGNvcmVJRCBhbmQgU3ViT3B0aW9uSUQqLwotI2RlZmluZSBNNE9TQV9PUFRJT05fSURfU1BMSVQob3B0aW9uSUQsIHJpZ2h0LCBjb3JlSUQsIGVycm9ySUQpXAotICAgeyByaWdodD0oTTRPU0FfVUludDgpKChvcHRpb25JRCk+PjMwKTtcCi0gICAgIGNvcmVJRD0oTTRPU0FfVUludDE2KSgoKG9wdGlvbklEKT4+MTYpJjB4MDAwMDNGRkYpO1wKLSAgICAgZXJyb3JJRD0oTTRPU0FfVUludDMyKSgob3B0aW9uSUQpJjB4MDAwMEZGRkYpOyB9Ci0KLS8qKiBUaGlzIG1hY3JvIHJldHVybnMgMSBpZiB0aGUgb3B0aW9uSUQgaXMgd3JpdGFibGUsIDAgb3RoZXJ3aXNlKi8KLSNkZWZpbmUgTTRPU0FfT1BUSU9OX0lEX0lTX1dSSVRBQkxFKG9wdGlvbklEKSAoKCgob3B0aW9uSUQpPj4zMCkmTTRfV1JJVEUpIT0wKQotCi0vKiogVGhpcyBtYWNybyByZXR1cm5zIDEgaWYgdGhlIG9wdGlvbklEIGlzIHJlYWRhYmxlLCAwIG90aGVyd2lzZSovCi0jZGVmaW5lIE00T1NBX09QVElPTl9JRF9JU19SRUFEQUJMRShvcHRpb25JRCkgKCgoKG9wdGlvbklEKT4+MzApJk00X1JFQUQpIT0wKQotCi0vKiogVGhpcyBtYWNybyByZXR1cm5zIDEgaWYgdGhlIG9wdGlvbklEIGhhcyBpdHMgY29yZSBJRCBlcXVhbCB0byAnY29yZUlEJywgMCBvdGhlcndpc2UqLwotI2RlZmluZSBNNE9TQV9PUFRJT05fSURfSVNfQ09SRUlEKG9wdGlvbklELCBjb3JlSUQpXAotICAgKCgoKChvcHRpb25JRCk+PjE2KSYweDAwM0ZGRikgPT0gKGNvcmVJRCkpID8gTTRPU0FfVFJVRTpNNE9TQV9GQUxTRSkKLQotCi0jZW5kaWYgICAvKk00T1NBX09QVElPTklEX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9TZW1hcGhvcmUuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1NlbWFwaG9yZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNjMwNDU0Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1NlbWFwaG9yZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfU2VtYXBob3JlLmgKLSAqIEBpbmdyb3VwICAgICAgT1NBTAotICogQGJyaWVmICAgICAgICBzZW1hcGhvcmUgQVBJCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIE00T1NBX1NFTUFQSE9SRV9ICi0jZGVmaW5lIE00T1NBX1NFTUFQSE9SRV9ICi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotewotI2VuZGlmCi0KLU00T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc2VtYXBob3JlT3BlbiggIE00T1NBX0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiAgIGluaXRpYWxOdW1iZXIgKTsKLQotCi1NNE9TQUxfUkVBTFRJTUVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3NlbWFwaG9yZVBvc3QoICBNNE9TQV9Db250ZXh0ICBjb250ZXh0ICk7Ci0KLQotTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zZW1hcGhvcmVXYWl0KCAgTTRPU0FfQ29udGV4dCAgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgICAgdGltZW91dCApOwotCi0KLU00T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc2VtYXBob3JlQ2xvc2UoIE00T1NBX0NvbnRleHQgIGNvbnRleHQgKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotCi0jZW5kaWYgLypNNE9TQV9TRU1BUEhPUkVfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1RocmVhZC5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfVGhyZWFkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhOTZhZmIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfVGhyZWFkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfVGhyZWFkLmgKLSAqIEBpbmdyb3VwICAgICAgT1NBTAotICogQGJyaWVmICAgICAgICB0aHJlYWQgQVBJCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0KLSNpZm5kZWYgTTRPU0FfVEhSRUFEX0gKLSNkZWZpbmUgTTRPU0FfVEhSRUFEX0gKLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9PcHRpb25JRC5oIgotCi0KLS8qIERlZmluaXRpb24gb2YgY29tbW9uIGVycm9yIGNvZGVzICovCi0jZGVmaW5lIE00RVJSX1RIUkVBRF9OT1RfU1RBUlRFRCBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNE9TQV9USFJFQUQsMHgwMDAwMDEpCi0KLQotdHlwZWRlZiBlbnVtCi17Ci0gICBNNE9TQV9rVGhyZWFkT3BlbmVkICAgPSAweDEwMCwKLSAgIE00T1NBX2tUaHJlYWRTdGFydGluZyA9IDB4MjAwLAotICAgTTRPU0Ffa1RocmVhZFJ1bm5pbmcgID0gMHgzMDAsCi0gICBNNE9TQV9rVGhyZWFkU3RvcHBpbmcgPSAweDQwMCwKLSAgIE00T1NBX2tUaHJlYWRDbG9zZWQgID0gMHg1MDAKLX0gTTRPU0FfVGhyZWFkU3RhdGU7Ci0KLQotCi10eXBlZGVmIGVudW0KLXsKLSAgIE00T1NBX2tUaHJlYWRIaWdoZXN0UHJpb3JpdHkgID0gIDB4MDAwLAotICAgTTRPU0Ffa1RocmVhZEhpZ2hQcmlvcml0eSAgICAgPSAgMHgxMDAsCi0gICBNNE9TQV9rVGhyZWFkTm9ybWFsUHJpb3JpdHkgICA9ICAweDIwMCwKLSAgIE00T1NBX2tUaHJlYWRMb3dQcmlvcml0eSAgICAgID0gIDB4MzAwLAotICAgTTRPU0Ffa1RocmVhZExvd2VzdFByaW9yaXR5ICAgPSAgMHg0MDAKLX0gTTRPU0FfVGhyZWFkUHJpb3JpdHlMZXZlbDsKLQotCi0KLXR5cGVkZWYgZW51bQotewotICAgTTRPU0FfVGhyZWFkU3RhcnRlZAotICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUR8TTRfV1JJVEUsIE00T1NBX1RIUkVBRCwgMHgwMSksCi0KLSAgIE00T1NBX1RocmVhZFN0b3BwZWQKLSAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFEfE00X1dSSVRFLCBNNE9TQV9USFJFQUQsIDB4MDIpLAotCi0gICBNNE9TQV9UaHJlYWRQcmlvcml0eQotICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUR8TTRfV1JJVEUsIE00T1NBX1RIUkVBRCwgMHgwMyksCi0KLSAgIE00T1NBX1RocmVhZE5hbWUKLSAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFEfE00X1dSSVRFLCBNNE9TQV9USFJFQUQsIDB4MDQpLAotCi0gICBNNE9TQV9UaHJlYWRTdGFja1NpemUKLSAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFEfE00X1dSSVRFLCBNNE9TQV9USFJFQUQsIDB4MDUpLAotCi0gICBNNE9TQV9UaHJlYWRVc2VyRGF0YQotICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUR8TTRfV1JJVEUsIE00T1NBX1RIUkVBRCwgMHgwNikKLQotfSBNNE9TQV9UaHJlYWRPcHRpb25JRDsKLQotCi0KLXR5cGVkZWYgTTRPU0FfRVJSICAoKk00T1NBX1RocmVhZERvSXQpKE00T1NBX1ZvaWQqKTsKLXR5cGVkZWYgTTRPU0FfVm9pZCAoKk00T1NBX1RocmVhZENhbGxCYWNrKShNNE9TQV9Db250ZXh0LCBNNE9TQV9Wb2lkKik7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotewotI2VuZGlmCi0KLU00T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfdGhyZWFkU3luY09wZW4oICAgICBNNE9TQV9Db250ZXh0KiAgICAgICAgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RocmVhZERvSXQgICAgICBmdW5jICk7Ci0KLQotTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jU3RhcnQoICAgIE00T1NBX0NvbnRleHQgICAgICAgICBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogICAgICAgICAgIHBhcmFtICk7Ci0KLQotTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jU3RvcCggICAgIE00T1NBX0NvbnRleHQgICAgICAgICBjb250ZXh0ICk7Ci0KLQotTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jQ2xvc2UoICAgIE00T1NBX0NvbnRleHQgICAgICAgICBjb250ZXh0ICk7Ci0KLQotTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jR2V0U3RhdGUoIE00T1NBX0NvbnRleHQgICAgICAgICBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVGhyZWFkU3RhdGUqICAgIHN0YXRlICk7Ci0KLQotTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV90aHJlYWRTbGVlcCggICAgICAgIE00T1NBX1VJbnQzMiAgICAgICAgICB0aW1lICk7Ci0KLQotTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jU2V0T3B0aW9uKE00T1NBX0NvbnRleHQgICAgICAgICBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVGhyZWFkT3B0aW9uSUQgIG9wdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gICAgICB2YWx1ZSApOwotCi0KLU00T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfdGhyZWFkU3luY0dldE9wdGlvbihNNE9TQV9Db250ZXh0ICAgICAgICAgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RocmVhZE9wdGlvbklEICBvcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uKiAgICAgdmFsdWUgKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotCi0jZW5kaWYgLypNNE9TQV9USFJFQURfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1RocmVhZF9wcml2LmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9UaHJlYWRfcHJpdi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNDI0YjA1Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1RocmVhZF9wcml2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9UaHJlYWRfcHJpdi5oCi0gKiBAaW5ncm91cCAgICAgIE9TQUwKLSAqIEBicmllZiAgICAgICAgVGhyZWFkIHByaXZhdGUgZm9yIEFuZHJvaWQKLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIE00T1NBX1RIUkVBRF9QUklWX0gKLSNkZWZpbmUgTTRPU0FfVEhSRUFEX1BSSVZfSAotCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotCi0KLS8qIENvbnRleHQgZm9yIHRoZSB0aHJlYWQgKi8KLXR5cGVkZWYgc3RydWN0IE00T1NBX1RocmVhZENvbnRleHQgewotICAgTTRPU0FfVUludDMyIGNvcmVJRDsgICAgICAgICAgICAgICAgLyogdGhyZWFkIGNvbnRleHQgaWRlbnRpZmlhbnQgKi8KLSAgIHB0aHJlYWRfdCB0aHJlYWRJRDsgICAgICAgICAgICAgICAgIC8qIHRocmVhZCBpZGVudGlmaWVyLiAqLwotICAgTTRPU0FfQ2hhciogbmFtZTsgICAgICAgICAgICAgICAgICAgLyogdGhyZWFkIG5hbWUgKi8KLSAgIE00T1NBX1VJbnQzMiBzdGFja1NpemU7ICAgICAgICAgICAgIC8qIHRocmVhZCBzdGFja1NpemUgaW4gYnl0ZXMgKi8KLSAgIE00T1NBX1RocmVhZERvSXQgZnVuYzsgICAgICAgICAgICAgIC8qIHRocmVhZCBmdW5jdGlvbiAqLwotICAgTTRPU0FfVm9pZCogcGFyYW07ICAgICAgICAgICAgICAgICAgLyogdGhyZWFkIHBhcmFtZXRlciAqLwotLyoKLSAgIE00T1NBX1ZvaWQqIHVzZXJEYXRhOyAgICAgICAgICAgICAgIC8gKiB0aHJlYWQgdXNlciBkYXRhICogLwotKi8KLSAgIE00T1NBX1RocmVhZFN0YXRlIHN0YXRlOyAgICAgICAgICAgIC8qIHRocmVhZCBhdXRvbWF0b24gc3RhdGUgKi8KLSAgIE00T1NBX0NvbnRleHQgc3RhdGVNdXRleDsgICAgICAgICAgIC8qIG11dGV4IGZvciB0aHJlYWQgc3RhdGUgbWFuYWdlbWVudCAqLwotLyoKLSAgIE00T1NBX1RocmVhZENhbGxCYWNrIHN0YXJ0Q2FsbEJhY2s7IC8gKiBzdGFydGluZyB0aHJlYWQgY2FsbCBiYWNrICogLwotICAgTTRPU0FfVGhyZWFkQ2FsbEJhY2sgc3RvcENhbGxCYWNrOyAgLyAqIHN0b3BwaW5nIHRocmVhZCBjYWxsIGJhY2sgKiAvCi0qLwotICAgTTRPU0FfQ29udGV4dCBzZW1TdGFydFN0b3A7ICAgICAgICAgLyogc2VtYXBob3JlIGZvciBzdGFydCBhbmQgc3RvcCBkb19pdCAqLwotICAgTTRPU0FfVGhyZWFkUHJpb3JpdHlMZXZlbCBwcmlvcml0eTsgLyogdGhyZWFkIHByaW9yaXR5IGxldmVsICovCi19IE00T1NBX1RocmVhZENvbnRleHQgOwotCi0KLS8qKiBUaG9zZSBkZWZpbmUgZW5hYmxlL2Rpc2FibGUgb3B0aW9uIElEKi8KLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfVEhSRUFEX1NUQVJURUQgICAgICAgICAgIE00T1NBX1RSVUUKLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfVEhSRUFEX1NUT1BQRUQgICAgICAgICAgIE00T1NBX1RSVUUKLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfVEhSRUFEX1BSSU9SSVRZICAgICAgICAgIE00T1NBX1RSVUUKLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfVEhSRUFEX1NUQUNLX1NJWkUgICAgICAgIE00T1NBX1RSVUUKLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfVEhSRUFEX05BTUUgICAgICAgICAgICAgIE00T1NBX1RSVUUKLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfVEhSRUFEX1VTRVJfREFUQSAgICAgICAgIE00T1NBX1RSVUUKLQotI2VuZGlmIC8qTTRPU0FfVEhSRUFEX1BSSVZfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1RpbWUuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1RpbWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjFmMjVlZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9UaW1lLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9UaW1lLmgKLSAqIEBpbmdyb3VwICAgICAgT1NBTAotICogQGJyaWVmICAgICAgICBUaW1lIG1hY3JvcwotICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aW1lIHR5cGUgYW5kIGFzc29jaWF0ZWQgbWFjcm9zIHdoaWNoIG11c3QKLSAqICAgICAgICAgICAgICAgYmUgdXNlZCB0byBtYW5pcHVsYXRlIHRpbWUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKiAkSWQ6IE00T1NBX1RpbWUuaCx2IDEuMiAyMDA3LzAxLzA1IDEzOjEyOjIyIHRoZW5hdWx0IEV4cCAkICovCi0KLSNpZm5kZWYgTTRPU0FfVElNRV9ICi0jZGVmaW5lIE00T1NBX1RJTUVfSAotCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotCi0KLXR5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZyAgTTRPU0FfVGltZTsKLQotCi0vKiogVGhpcyBtYWNybyBzZXRzIHRoZSB1bmtub3duIHRpbWUgdmFsdWUgKi8KLQotI2RlZmluZSBNNE9TQV9USU1FX1VOS05PV04gMHg4MDAwMDAwMAotCi0vKiogVGhpcyBtYWNybyBjb252ZXJ0cyBhIHRpbWUgd2l0aCBhIHRpbWUgc2NhbGUgdG8gbWlsbGlzZWNvbmQuCi0gICAgVGhlIHJlc3VsdCBpcyBhIE00T1NBX0RvdWJsZSovCi0jZGVmaW5lIE00T1NBX1RJTUVfVE9fTVMocmVzdWx0LCB0aW1lLCB0aW1lc2NhbGUpXAotICAgICAgeyByZXN1bHQgPSAoMTAwMCooTTRPU0FfRG91YmxlKXRpbWUpLygoTTRPU0FfRG91YmxlKXRpbWVzY2FsZSk7IH0KLQotI2VuZGlmIC8qTTRPU0FfVElNRV9IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfVHlwZXMuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1R5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkyYTY4ZDguLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfVHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9UeXBlcy5oCi0gKiBAaW5ncm91cCAgICAgIE9TQUwKLSAqIEBicmllZiAgICAgICAgQWJzdHJhY3Rpb24gdHlwZXMgZm9yIEFuZHJvaWQKLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIHJlZGVmaW5lcyBiYXNpYyB0eXBlcyB3aGljaCBtdXN0IGJlCi0gKiAgICAgICAgICAgICAgIHVzZWQgdG8gZGVjbGFyZSBhbnkgdmFyaWFibGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLQotI2lmbmRlZiBNNE9TQV9UWVBFU19ICi0jZGVmaW5lIE00T1NBX1RZUEVTX0gKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJNNE9TQV9FeHBvcnQuaCIKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotCi10eXBlZGVmIHNpZ25lZCBjaGFyICAgICBNNE9TQV9Cb29sOwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgTTRPU0FfVUludDg7Ci10eXBlZGVmIHNpZ25lZCBjaGFyICAgICBNNE9TQV9JbnQ4OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgTTRPU0FfVUludDE2OwotdHlwZWRlZiBzaWduZWQgc2hvcnQgICAgTTRPU0FfSW50MTY7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgICBNNE9TQV9VSW50MzI7Ci10eXBlZGVmIHNpZ25lZCBsb25nICAgICBNNE9TQV9JbnQzMjsKLQotdHlwZWRlZiBzaWduZWQgY2hhciAgICAgTTRPU0FfQ2hhcjsKLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgIE00T1NBX1VDaGFyOwotCi10eXBlZGVmIGRvdWJsZSAgICAgICAgICBNNE9TQV9Eb3VibGU7Ci10eXBlZGVmIGZsb2F0ICAgICAgICAgICBNNE9TQV9GbG9hdDsKLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgTTRPU0FfV0NoYXI7Ci0KLXR5cGVkZWYgdm9pZCAgICAgICAgICAgIE00T1NBX1ZvaWQ7Ci0KLS8qIE1pbiAmIG1heCBkZWZpbml0aW9ucyovCi0jZGVmaW5lIE00T1NBX1VJTlQ4X01JTiAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgTTRPU0FfVUlOVDhfTUFYICAgICAgICAgICAgICAgIDI1NQotCi0jZGVmaW5lIE00T1NBX1VJTlQxNl9NSU4gICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgTTRPU0FfVUlOVDE2X01BWCAgICAgICAgICAgICA2NTUzNQotCi0jZGVmaW5lIE00T1NBX1VJTlQzMl9NSU4gICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgTTRPU0FfVUlOVDMyX01BWCAgICAgICAgMHhGRkZGRkZGRgotCi0jZGVmaW5lIE00T1NBX0lOVDhfTUlOICAgICAgICAgICAgICAgIC0xMjgKLSNkZWZpbmUgTTRPU0FfSU5UOF9NQVggICAgICAgICAgICAgICAgIDEyNwotCi0jZGVmaW5lIE00T1NBX0lOVDE2X01JTiAgICAgICAgICAgICAtMzI3NjgKLSNkZWZpbmUgTTRPU0FfSU5UMTZfTUFYICAgICAgICAgICAgICAzMjc2NwotCi0jZGVmaW5lIE00T1NBX0lOVDMyX01JTiAgICAgICAoLTB4N0ZGRkZGRkYtMSkKLSNkZWZpbmUgTTRPU0FfSU5UMzJfTUFYICAgICAgICAgMHg3RkZGRkZGRgotCi0jZGVmaW5lIE00T1NBX0NIQVJfTUlOICAgICAgICAgICAgICAgIC0xMjgKLSNkZWZpbmUgTTRPU0FfQ0hBUl9NQVggICAgICAgICAgICAgICAgIDEyNwotCi0jZGVmaW5lIE00T1NBX1VDSEFSX01JTiAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgTTRPU0FfVUNIQVJfTUFYICAgICAgICAgICAgICAgIDI1NQotCi0jZGVmaW5lIE00T1NBX05VTEwgICAgICAgICAgICAgICAgICAgICAweDAwCi0jZGVmaW5lIE00T1NBX1RSVUUgICAgICAgICAgICAgICAgICAgICAweDAxCi0jZGVmaW5lIE00T1NBX0ZBTFNFICAgICAgICAgICAgICAgICAgICAweDAwCi0jZGVmaW5lIE00T1NBX1dBSVRfRk9SRVZFUiAgICAgICAweGZmZmZmZmZmCi0KLSNkZWZpbmUgTTRPU0FfQ09OU1QgICAgICAgICAgICAgICAgICAgY29uc3QKLSNkZWZpbmUgTTRPU0FfSU5MSU5FICAgICAgICAgICAgICAgICBpbmxpbmUKLQotLyogUm9sbG92ZXIgb2Zmc2V0IG9mIHRoZSBjbG9jayAqLwotLyogVGhpcyB2YWx1ZSBtdXN0IGJlIHRoZSBvbmUgb2YgTTRPU0FfY2xvY2tHZXRUaW1lICovCi0jZGVmaW5lIE00T1NBX0NMT0NLX1JPTExPVkVSICAgICAgICAgICBNNE9TQV9JTlQzMl9NQVgKLQotdHlwZWRlZiB2b2lkKiAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0OwotCi0vKiogSXQgaXMgYSB1bmlxdWUgSUQgZm9yIGVhY2ggY29yZSBjb21wb25lbnQqLwotdHlwZWRlZiAgTTRPU0FfVUludDE2IE00T1NBX0NvcmVJRDsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qTTRPU0FfVFlQRVNfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL0FuZHJvaWQubWsgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZjM4YjBjLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotIwotIyBsaWJ2aWRlb2VkaXRvcl9vc2FsCi0jCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEU6PSBsaWJ2aWRlb2VkaXRvcl9vc2FsCi0KLUxPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgIFwKLSAgICBNNE9TQV9DaGFyU3Rhci5jIFwKLSAgICBNNE9TQV9DbG9jay5jIFwKLSAgICBNNE9TQV9GaWxlQ29tbW9uLmMgXAotICAgIE00T1NBX0ZpbGVSZWFkZXIuYyBcCi0gICAgTTRPU0FfRmlsZVdyaXRlci5jIFwKLSAgICBNNE9TQV9NdXRleC5jIFwKLSAgICBNNE9TQV9SYW5kb20uYyBcCi0gICAgTTRPU0FfU2VtYXBob3JlLmMgXAotICAgIE00T1NBX1RocmVhZC5jIFwKLSAgICBNNFBTV19EZWJ1Z1RyYWNlLmMgXAotICAgIE00UFNXX01lbW9yeUludGVyZmFjZS5jIFwKLSAgICBNNFBTV19UcmFjZS5jIFwKLSAgICBMVk9TQV9GaWxlUmVhZGVyX29wdGltLmMKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdXRpbHMgbGlidXRpbHMgbGlibG9nCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jIFwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJkbAotCi0jIEFsbCBvZiB0aGUgc2hhcmVkIGxpYnJhcmllcyB3ZSBsaW5rIGFnYWluc3QuCi1MT0NBTF9MRExJQlMgOj0gXAotICAgIC1scHRocmVhZCAtbGRsCi0KLUxPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciBcCi0gICAgLURfX0FORFJPSURfXyBcCi0gICAgLURNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFIFwKLSAgICAtRFVTRV9TVEFHRUZSSUdIVF9DT0RFQ1MgXAotICAgIC1EVVNFX1NUQUdFRlJJR0hUX0FVRElPREVDIFwKLSAgICAtRFVTRV9TVEFHRUZSSUdIVF9WSURFT0RFQyBcCi0gICAgLURVU0VfU1RBR0VGUklHSFRfQVVESU9FTkMgXAotICAgIC1EVVNFX1NUQUdFRlJJR0hUX1ZJREVPRU5DIFwKLSAgICAtRFVTRV9TVEFHRUZSSUdIVF9SRUFERVJTIFwKLSAgICAtRFVTRV9TVEFHRUZSSUdIVF8zR1BQX1JFQURFUgotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9MVk9TQV9GaWxlUmVhZGVyX29wdGltLmMgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9MVk9TQV9GaWxlUmVhZGVyX29wdGltLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUxMWUwMDguLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTFZPU0FfRmlsZVJlYWRlcl9vcHRpbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA1MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX0ZpbGVSZWFkZXJfb3B0aW0uYwotICogQGJyaWVmCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZ1bmN0aW9ucyB0byBtYW5pcHVsYXRlIGZpbGVzeXN0ZW0gYWNjZXNzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKiogQWRkaXRpb24gb2YgVHJhY2UgSUQgKiovCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLQotI2lmZGVmIE00VFJBQ0VfSUQKLSN1bmRlZiBNNFRSQUNFX0lECi0jZW5kaWYKLSNkZWZpbmUgTTRUUkFDRV9JRCAgICBNNE9TQV9GSUxFX1JFQURFUgotCi0KLSNpbmNsdWRlICJNNE9TQV9GaWxlQ29tbW9uLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVJlYWRlci5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVXcml0ZXIuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotCi0jaW5jbHVkZSAiTFZPU0FfRmlsZVJlYWRlcl9vcHRpbS5oIgotCi0jZGVmaW5lIE00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRgotI2lmbmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLSAgICAjaW5jbHVkZSAiTTRPU0FfRmlsZUFjY2Vzcy5oIgotI2VuZGlmCi0KLSNkZWZpbmUgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUocmV0dmFsLCBwb2ludGVyKSBpZiAoKHBvaW50ZXIpID09IE00T1NBX05VTEwpIHJldHVybiAocmV0dmFsKTsKLQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGaWxlIHJlYWRlciBjYWNoZSBidWZmZXJzIHBhcmFtZXRlcnMgKHNpemUsIG51bWJlciBvZiBidWZmZXJzLCBldGMpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2RlZmluZSBNNE9TQV9SRUFEQlVGRkVSX1NJWkUgICAgMTAyNCoxNgotI2RlZmluZSBNNE9TQV9SRUFEQlVGRkVSX05CICAgICAgICAyCi0jZGVmaW5lIE00T1NBX1JFQURCVUZGRVJfTk9ORSAgICAtMQotI2RlZmluZSBNNE9TQV9FT0YgICAgICAgICAgICAgICAtMQotCi0jZGVmaW5lIE1BWF9GSUxMU19TSU5DRV9MQVNUX0FDQ0VTUyAgICBNNE9TQV9SRUFEQlVGRkVSX05CKjIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXIKLSAqIEBicmllZiAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBGaWxlIHJlYWRlciBCdWZmZXJzIGNvbnRleHQgKHByaXZhdGUpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgIGRhdGE7ICAgICAgICAvKio8IGJ1ZmZlciBkYXRhICovCi0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICBzaXplOyAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBidWZmZXIgKi8KLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gIGZpbGVwb3M7ICAgIC8qKjwgcG9zaXRpb24gaW4gdGhlIGZpbGUgd2hlcmUgdGhlIGJ1ZmZlciBzdGFydHMgKi8KLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gIHJlbWFpbjsgICAgICAgIC8qKjwgZGF0YSBhbW91bnQgbm90IGFscmVhZHkgY29waWVkIGZyb20gYnVmZmVyICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICBuYkZpbGxTaW5jZUxhc3RBY2VzczsgICAgLyoqPCBUbyBrbm93IHNpbmNlIGhvdyBtYW55IHRpbWUgd2UgZGlkbid0IHVzZSB0aGlzIGJ1ZmZlciAqLwotfSBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlcl9vcHRpbTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0Ci0gKiBAYnJpZWYgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgRmlsZSByZWFkZXIgY29udGV4dCAocHJpdmF0ZSkKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBhbGwgRmlsZSBSZWFkZXIgY2FsbHMgdG8gc3RvcmUgdGhlIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgIElzT3BlbmVkOyAgICAgICAvKio8IE1pY3JvIHN0YXRlIG1hY2hpbmUgKi8KLSAgICBNNE9TQV9GaWxlQXR0cmlidXRlICAgICBGaWxlQXR0cmlidXRlOyAgLyoqPCBPcGVuaW5nIG1vZGUgKi8KLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gICAgICAgICByZWFkRmlsZVBvczsgICAgLyoqPCBFZmZlY3RpdmUgcG9zaXRpb24gb2YgdGhlIEdGTCByZWFkIHBvaW50ZXIgKi8KLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gICAgICAgICBhYnNvbHV0ZVBvczsgICAgLyoqPCBWaXJ0dWFsIHBvc2l0aW9uIGZvciBuZXh0IHJlYWRpbmcgKi8KLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gICAgICAgICBmaWxlU2l6ZTsgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgZmlsZSAqLwotCi0gICAgTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJfb3B0aW0gYnVmZmVyW000T1NBX1JFQURCVUZGRVJfTkJdOyAgLyoqPCBSZWFkIGJ1ZmZlcnMgKi8KLQotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgIGFGaWxlRGVzYzsgIC8qKjwgRmlsZSBkZXNjcmlwdG9yICovCi0KLSNpZmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqICAgICBGUzsgICAgICAgICAgICAvKio8IEZpbGVzeXN0ZW0gaW50ZXJmYWNlICovCi0jZWxzZQotICAgIE00T1NBX0ZpbGVTeXN0ZW1fRmN0UHRyICpGUzsgICAgICAgIC8qKjwgRmlsZXN5c3RlbSBpbnRlcmZhY2UgKi8KLSNlbmRpZgotCi19IE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbTsKLQotLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotLyp8ICAgIEdsb2JhbCBmdW5jdGlvbiBmb3IgaGFuZGxpbmcgbG93IGxldmVsIHJlYWQgYWNjZXNzICAgIHwqLwotLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi1zdGF0aWMgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBndl9OWFBTV19SRUFET1BUX2xvd0xldmVsRnVuY3Rpb25zOwotCi1NNE9TQV9FUlIgTlhQU1dfRmlsZVJlYWRlck9wdGltX2luaXQoTTRPU0FfVm9pZCAqbG93TGV2ZWxfZnVuY3Rpb25Qb2ludGVycywgTTRPU0FfVm9pZCAqb3B0aW1pemVkX2Z1bmN0aW9uUG9pbnRlcnMpCi17Ci0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBsb3dMZXZlbF9mcCAgPSAoTTRPU0FfRmlsZVJlYWRQb2ludGVyKikgbG93TGV2ZWxfZnVuY3Rpb25Qb2ludGVyczsKLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIG9wdGltaXplZF9mcCA9IChNNE9TQV9GaWxlUmVhZFBvaW50ZXIqKSBvcHRpbWl6ZWRfZnVuY3Rpb25Qb2ludGVyczsKLQotICAgIC8vU2V0IHRoZSBvcHRpbWl6ZWQgZnVuY3Rpb25zLCB0byBiZSBjYWxsZWQgYnkgdGhlIHVzZXIKLSAgICBvcHRpbWl6ZWRfZnAtPm9wZW5SZWFkICA9IE00T1NBX2ZpbGVSZWFkT3Blbl9vcHRpbTsKLSAgICBvcHRpbWl6ZWRfZnAtPnJlYWREYXRhICA9IE00T1NBX2ZpbGVSZWFkRGF0YV9vcHRpbTsKLSAgICBvcHRpbWl6ZWRfZnAtPnNlZWsgICAgICA9IE00T1NBX2ZpbGVSZWFkU2Vla19vcHRpbTsKLSAgICBvcHRpbWl6ZWRfZnAtPmNsb3NlUmVhZCA9IE00T1NBX2ZpbGVSZWFkQ2xvc2Vfb3B0aW07Ci0gICAgb3B0aW1pemVkX2ZwLT5zZXRPcHRpb24gPSBNNE9TQV9maWxlUmVhZFNldE9wdGlvbl9vcHRpbTsKLSAgICBvcHRpbWl6ZWRfZnAtPmdldE9wdGlvbiA9IE00T1NBX2ZpbGVSZWFkR2V0T3B0aW9uX29wdGltOwotCi0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfRVJSIE5YUFNXX0ZpbGVSZWFkZXJPcHRpbV9jbGVhblVwKCkKLXsKLQotICAgIGd2X05YUFNXX1JFQURPUFRfbG93TGV2ZWxGdW5jdGlvbnMgPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotTTRPU0FfRVJSIE5YUFNXX0ZpbGVSZWFkZXJPcHRpbV9nZXRMb3dMZXZlbEZ1bmN0aW9ucyhNNE9TQV9Wb2lkICoqRlMpCi17Ci0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiogcEZ1bmN0aW9uc1BvaW50ZXIgPSAoTTRPU0FfRmlsZVJlYWRQb2ludGVyKiopIEZTOwotICAgICpwRnVuY3Rpb25zUG9pbnRlciA9IGd2X05YUFNXX1JFQURPUFRfbG93TGV2ZWxGdW5jdGlvbnM7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotLyp8ICAgICAgICBCdWZmZXIgaGFuZGxpbmcgZnVuY3Rpb25zIGZvciBSZWFkIGFjY2VzcyAgICAgICAgIHwqLwotLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJJbml0KE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSogYXBDb250ZXh0KQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX1VJbnQ4IGk7Ci0KLSAgICBmb3IoaT0wOyBpPE00T1NBX1JFQURCVUZGRVJfTkI7IGkrKykKLSAgICB7Ci0gICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLmRhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplID0gMDsKLSAgICAgICAgYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvcyA9IDA7Ci0gICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnJlbWFpbiA9IDA7Ci0gICAgfQotCi0gICAgZm9yKGk9MDsgaTxNNE9TQV9SRUFEQlVGRkVSX05COyBpKyspCi0gICAgewotICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5kYXRhID0gKE00T1NBX01lbUFkZHI4KSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRPU0FfUkVBREJVRkZFUl9TSVpFLCAKLSAgICAgICAgICAgIE00T1NBX0ZJTEVfUkVBREVSLCAoTTRPU0FfQ2hhciAqKSJNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckluaXQiKTsKLSAgICAgICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfQUxMT0MsIGFwQ29udGV4dC0+YnVmZmVyW2ldLmRhdGEpOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9Wb2lkIE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyRnJlZShNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qIGFwQ29udGV4dCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9JbnQ4IGk7Ci0KLSAgICBmb3IoaT0wOyBpPE00T1NBX1JFQURCVUZGRVJfTkI7IGkrKykKLSAgICAgICAgaWYoYXBDb250ZXh0LT5idWZmZXJbaV0uZGF0YSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgZnJlZShhcENvbnRleHQtPmJ1ZmZlcltpXS5kYXRhKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRmlsZVBvc2l0aW9uIE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyQ29weShNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qIGFwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50OCBpLCBNNE9TQV9GaWxlUG9zaXRpb24gcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24gc2l6ZSwgTTRPU0FfTWVtQWRkcjggcERhdGEpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uIGNvcHlzaXplOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBvZmZzZXQ7Ci0KLSAgICBpZihhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplID09IE00T1NBX0VPRikgcmV0dXJuIE00T1NBX0VPRjsKLQotICAgIGlmKCAgIChwb3MgPCBhcENvbnRleHQtPmJ1ZmZlcltpXS5maWxlcG9zKQotICAgICAgIHx8IChwb3MgPiAoYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvcyArIGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemUgLSAxKSkgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDA7IC8qIG5vdGhpbmcgY29waWVkICovCi0gICAgfQotCi0gICAgb2Zmc2V0ID0gcG9zIC0gYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvczsKLQotICAgIGNvcHlzaXplID0gYXBDb250ZXh0LT5idWZmZXJbaV0uc2l6ZSAtIG9mZnNldDsKLSAgICBjb3B5c2l6ZSA9IChzaXplIDwgY29weXNpemUpID8gc2l6ZSA6IGNvcHlzaXplOwotCi0gICAgbWVtY3B5KCh2b2lkICopcERhdGEsICh2b2lkICopKGFwQ29udGV4dC0+YnVmZmVyW2ldLmRhdGEgKyBvZmZzZXQpLCBjb3B5c2l6ZSk7Ci0KLSAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5yZW1haW4gLT0gY29weXNpemU7Ci0gICAgYXBDb250ZXh0LT5idWZmZXJbaV0ubmJGaWxsU2luY2VMYXN0QWNlc3MgPSAwOwotCi0gICAgcmV0dXJuIGNvcHlzaXplOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJGaWxsKE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSogYXBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50OCBpLCBNNE9TQV9GaWxlUG9zaXRpb24gcG9zKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgICAgZ3JpZFBvczsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gICAgdGVtcFBvczsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgIGJ1ZmZlclNpemU7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICAgICBkaWZmOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgICAgc2l6ZTsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSNpZmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgZXJybm8gPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgIGZpbGVSZWFkU2l6ZSA9IDA7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICAgICBmaWxlU2Vla1Bvc2l0aW9uID0gMDsKLSNlbHNlCi0gICAgTTRPU0FfSW50MzIgICAgICAgICByZXRfdmFsOwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgIGVycm5vOwotI2VuZGlmCi0KLSAgICBNNE9TQV9UUkFDRTNfNCgiQnVmZmVyRmlsbCAgaSA9ICVkICBwb3MgPSAlbGQgIHJlYWQgPSAlbGQgIG9sZCA9ICVsZCIsIGksIHBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+cmVhZEZpbGVQb3MsIGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3MpOwotCi0gICAgLyogQXZvaWQgY3ljbGluZyBzdGF0ZW1lbnQgYmVjYXVzZSBvZiBFT0YgKi8KLSAgICBpZihwb3MgPj0gYXBDb250ZXh0LT5maWxlU2l6ZSkKLSAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfQVU7Ci0KLSAgICAvKiBSZWxvY2F0ZSB0byBhYnNvbHV0ZSBwb3N0aW9uIGlmIG5lY2Vzc2FyeSAqLwotICAgIGJ1ZmZlclNpemUgPSBNNE9TQV9SRUFEQlVGRkVSX1NJWkU7Ci0gICAgdGVtcFBvcyA9IChNNE9TQV9GaWxlUG9zaXRpb24pIChwb3MgLyBidWZmZXJTaXplKTsKLSAgICBncmlkUG9zID0gdGVtcFBvcyAqIE00T1NBX1JFQURCVUZGRVJfU0laRTsKLSAgICBkaWZmID0gZ3JpZFBvcyAtIGFwQ29udGV4dC0+cmVhZEZpbGVQb3M7Ci0KLSAgICBpZihkaWZmICE9IDApCi0gICAgewotI2lmZGVmIE00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRgotICAgICAgICBmaWxlU2Vla1Bvc2l0aW9uID0gZGlmZjsKLSAgICAgICAgZXJybm8gPSBhcENvbnRleHQtPkZTLT5zZWVrKGFwQ29udGV4dC0+YUZpbGVEZXNjLCBNNE9TQV9rRmlsZVNlZWtDdXJyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVTZWVrUG9zaXRpb24pOwotICAgICAgICBhcENvbnRleHQtPnJlYWRGaWxlUG9zID0gZ3JpZFBvczsKLQotICAgICAgICBpZihNNE5PX0VSUk9SICE9IGVycm5vKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBlcnJubzsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckZpbGwgRVJSMSA9IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0jZWxzZQotICAgICAgICByZXRfdmFsID0gYXBDb250ZXh0LT5GUy0+cEZjdFB0cl9TZWVrKGFwQ29udGV4dC0+YUZpbGVEZXNjLCBkaWZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9rRmlsZVNlZWtDdXJyZW50LCAmZXJybm8pOwotICAgICAgICBhcENvbnRleHQtPnJlYWRGaWxlUG9zID0gZ3JpZFBvczsKLQotICAgICAgICBpZihyZXRfdmFsICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNE9TQV9GSUxFX1JFQURFUiwgZXJybm8pOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyRmlsbCBFUlIxID0gMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0jZW5kaWYgLypNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYqLwotICAgIH0KLQotICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3MgPSBhcENvbnRleHQtPnJlYWRGaWxlUG9zOwotCi0gICAgLyogUmVhZCBEYXRhICovCi0jaWZkZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCi0gICAgZmlsZVJlYWRTaXplID0gTTRPU0FfUkVBREJVRkZFUl9TSVpFOwotICAgIGVycm5vID0gYXBDb250ZXh0LT5GUy0+cmVhZERhdGEoYXBDb250ZXh0LT5hRmlsZURlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KWFwQ29udGV4dC0+YnVmZmVyW2ldLmRhdGEsICZmaWxlUmVhZFNpemUpOwotCi0gICAgc2l6ZSA9IChNNE9TQV9GaWxlUG9zaXRpb24pZmlsZVJlYWRTaXplOwotICAgIGlmICgoTTROT19FUlJPUiAhPSBlcnJubykmJihNNFdBUl9OT19EQVRBX1lFVCAhPSBlcnJubykpCi0gICAgewotICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplID0gTTRPU0FfRU9GOwotICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5yZW1haW4gPSAwOwotCi0gICAgICAgIGVyciA9IGVycm5vOwotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJGaWxsIEVSUjIgPSAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0jZWxzZQotICAgIHNpemUgPSBhcENvbnRleHQtPkZTLT5wRmN0UHRyX1JlYWQoYXBDb250ZXh0LT5hRmlsZURlc2MsCi0gICAgICAgIChNNE9TQV9VSW50OCAqKWFwQ29udGV4dC0+YnVmZmVyW2ldLmRhdGEsIE00T1NBX1JFQURCVUZGRVJfU0laRSwgJmVycm5vKTsKLSAgICBpZihzaXplID09IC0xKQotICAgIHsKLSAgICAgICAgYXBDb250ZXh0LT5idWZmZXJbaV0uc2l6ZSA9IE00T1NBX0VPRjsKLSAgICAgICAgYXBDb250ZXh0LT5idWZmZXJbaV0ucmVtYWluID0gMDsKLQotICAgICAgICBlcnIgPSBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRPU0FfRklMRV9SRUFERVIsIGVycm5vKTsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyRmlsbCBFUlIyID0gMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplID0gc2l6ZTsKLSAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5yZW1haW4gPSBzaXplOwotICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLm5iRmlsbFNpbmNlTGFzdEFjZXNzID0gMDsKLQotICAgIC8qIFJldHJpZXZlIGN1cnJlbnQgcG9zaXRpb24gKi8KLSNpZmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLSAgICBlcnJubyA9IGFwQ29udGV4dC0+RlMtPmdldE9wdGlvbihhcENvbnRleHQtPmFGaWxlRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlUG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24qKSAmYXBDb250ZXh0LT5yZWFkRmlsZVBvcyk7Ci0KLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnJubykKLSAgICB7Ci0gICAgICAgIGVyciA9IGVycm5vOwotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJGaWxsIEVSUjMgPSAweCV4IiwgZXJyKTsKLSAgICB9Ci0gICAgZWxzZSBpZiggICAoYXBDb250ZXh0LT5idWZmZXJbaV0uc2l6ZSA+PSAwKQotICAgICAgICYmIChhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplIDwgTTRPU0FfUkVBREJVRkZFUl9TSVpFKSApCi0gICAgewotICAgICAgICBlcnIgPSBNNFdBUl9OT19EQVRBX1lFVDsKLSAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIk00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyRmlsbCByZXR1cm5zIE5PIERBVEEgWUVUIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotI2Vsc2UKLSAgICBhcENvbnRleHQtPnJlYWRGaWxlUG9zID0gYXBDb250ZXh0LT5GUy0+cEZjdFB0cl9UZWxsKGFwQ29udGV4dC0+YUZpbGVEZXNjLCAmZXJybm8pOwotCi0gICAgaWYoICAgKGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemUgPj0gMCkKLSAgICAgICAmJiAoYXBDb250ZXh0LT5idWZmZXJbaV0uc2l6ZSA8IE00T1NBX1JFQURCVUZGRVJfU0laRSkgKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRXQVJfTk9fREFUQV9ZRVQ7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckZpbGwgRVJSMyA9IDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSNlbmRpZiAvKk00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRiovCi0KLSAgICAvKiBSZXR1cm4gd2l0aG91dCBlcnJvciAqLwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9JbnQ4IE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyTWF0Y2goTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltKiBhcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uIHBvcykKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9JbnQ4IGk7Ci0KLQotICAgIC8qIFNlbGVjdCB0aGUgYnVmZmVyIHdoaWNoIG1hdGNoZXMgd2l0aCBnaXZlbiBwb3MgKi8KLSAgICBmb3IoaT0wOyBpPE00T1NBX1JFQURCVUZGRVJfTkI7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmKCAgIChwb3MgPj0gYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvcykKLSAgICAgICAgICAgJiYgKHBvcyA8IChhcENvbnRleHQtPmJ1ZmZlcltpXS5maWxlcG9zICsgYXBDb250ZXh0LT5idWZmZXJbaV0uc2l6ZSkpICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE00T1NBX1JFQURCVUZGRVJfTk9ORTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfSW50OCBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlclNlbGVjdChNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qIGFwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50OCBjdXJyZW50X2kpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfSW50OCBpLGo7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uIG1pbl9hbW91bnQsbWF4X2Ftb3VudDsKLSAgICBNNE9TQV9JbnQ4IG1pbl9pLG1heF9jb3VudDsKLQotICAgIC8qIHVwZGF0ZSBuYkZpbGxTaW5jZUxhc3RBY2VzcyBmaWVsZCAqLwotICAgIGZvcihpPTA7IGk8TTRPU0FfUkVBREJVRkZFUl9OQjsgaSsrKQotICAgIHsKLSAgICAgICAgYXBDb250ZXh0LT5idWZmZXJbaV0ubmJGaWxsU2luY2VMYXN0QWNlc3MgKys7Ci0gICAgfQotCi0gICAgLyogUGxhbiBBIDogU2NhbiBmb3IgZW1wdHkgYnVmZmVyICovCi0gICAgZm9yKGk9MDsgaTxNNE9TQV9SRUFEQlVGRkVSX05COyBpKyspCi0gICAgewotICAgICAgICBpZihhcENvbnRleHQtPmJ1ZmZlcltpXS5yZW1haW4gPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtYXhfY291bnQgPSBNNE9TQV9SRUFEQlVGRkVSX05COwotICAgIG1heF9hbW91bnQgPSBNQVhfRklMTFNfU0lOQ0VfTEFTVF9BQ0NFU1M7Ci0KLSAgICAvKiBQbGFuIEIgOiBTY2FuIGZvciBkZWFkIGJ1ZmZlciAqLwotICAgIGZvcihpPTA7IGk8TTRPU0FfUkVBREJVRkZFUl9OQjsgaSsrKQotICAgIHsKLSAgICAgICAgaWYoYXBDb250ZXh0LT5idWZmZXJbaV0ubmJGaWxsU2luY2VMYXN0QWNlc3MgPj0gKE00T1NBX1VJbnQzMikgbWF4X2Ftb3VudCkKLSAgICAgICAgewotICAgICAgICAgICAgbWF4X2Ftb3VudCA9IGFwQ29udGV4dC0+YnVmZmVyW2ldLm5iRmlsbFNpbmNlTGFzdEFjZXNzOwotICAgICAgICAgICAgbWF4X2NvdW50ID0gaTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZihtYXhfY291bnQ8TTRPU0FfUkVBREJVRkZFUl9OQikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8yKCJERUFEIEJVRkZFUjogJWQsICVkIixtYXhfY291bnQsYXBDb250ZXh0LT5idWZmZXJbbWF4X2NvdW50XS5uYkZpbGxTaW5jZUxhc3RBY2Vzcyk7Ci0gICAgICAgIHJldHVybiBtYXhfY291bnQ7Ci0gICAgfQotCi0gICAgbWluX2kgPSBjdXJyZW50X2k7Ci0gICAgbWluX2Ftb3VudCA9IE00T1NBX1JFQURCVUZGRVJfU0laRTsKLQotICAgIC8qIFNlbGVjdCB0aGUgYnVmZmVyIHdoaWNoIGlzIHRoZSBtb3N0ICJlbXB0eSIgKi8KLSAgICBmb3IoaT0wOyBpPE00T1NBX1JFQURCVUZGRVJfTkI7IGkrKykKLSAgICB7Ci0gICAgICAgIGogPSAoaStjdXJyZW50X2kpJU00T1NBX1JFQURCVUZGRVJfTkI7Ci0KLSAgICAgICAgaWYoYXBDb250ZXh0LT5idWZmZXJbal0ucmVtYWluIDwgbWluX2Ftb3VudCkKLSAgICAgICAgewotICAgICAgICAgICAgbWluX2Ftb3VudCA9IGFwQ29udGV4dC0+YnVmZmVyW2pdLnJlbWFpbjsKLSAgICAgICAgICAgIG1pbl9pID0gajsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBtaW5faTsKLQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRPU0FfRmlsZVJlYWRlcl9DYWxjdWxhdGVTaXplKE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSogYXBDb250ZXh0KQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0VSUiAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0jaWZkZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCi0gICAgTTRPU0FfRVJSICAgICAgICAgICAgZXJybm8gPSBNNE5PX0VSUk9SOwotI2Vsc2UKLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICByZXRfdmFsOwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgIGVycm5vOwotI2VuZGlmCi0KLSAgICAvKiBnbyB0byB0aGUgZW5kIG9mIGZpbGUqLwotI2lmZGVmIE00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRgotICAgIGVycm5vID0gYXBDb250ZXh0LT5GUy0+Z2V0T3B0aW9uKGFwQ29udGV4dC0+YUZpbGVEZXNjLCBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbiopICZhcENvbnRleHQtPmZpbGVTaXplKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnJubykKLSAgICB7Ci0gICAgICAgIGVyciA9IGVycm5vOwotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfRmlsZVJlYWRlcl9DYWxjdWxhdGVTaXplIEVSUiA9IDB4JXgiLCBlcnIpOwotICAgIH0KLSNlbHNlCi0gICAgcmV0X3ZhbCA9IGFwQ29udGV4dC0+RlMtPnBGY3RQdHJfU2VlayhhcENvbnRleHQtPmFGaWxlRGVzYywgMCwgTTRPU0Ffa0ZpbGVTZWVrRW5kLCAmZXJybm8pOwotCi0gICAgaWYgKHJldF92YWwgIT0gMCkKLSAgICB7Ci0gICAgICAgIGFwQ29udGV4dC0+cmVhZEZpbGVQb3MgPSBNNE9TQV9FT0Y7Ci0gICAgICAgIGVyciA9IE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNE9TQV9GSUxFX1JFQURFUiwgZXJybm8pOwotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfRmlsZVJlYWRlcl9DYWxjdWxhdGVTaXplIEVSUiA9IDB4JXgiLCBlcnIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBSZXRyaWV2ZSBzaXplIG9mIHRoZSBmaWxlICovCi0gICAgICAgIGFwQ29udGV4dC0+ZmlsZVNpemUgPSBhcENvbnRleHQtPkZTLT5wRmN0UHRyX1RlbGwoYXBDb250ZXh0LT5hRmlsZURlc2MsICZlcnJubyk7Ci0gICAgICAgIGFwQ29udGV4dC0+cmVhZEZpbGVQb3MgPSBhcENvbnRleHQtPmZpbGVTaXplOwotICAgIH0KLSNlbmRpZiAvKk00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRiovCi0KLSAgICByZXR1cm4gZXJyOwotfQotCi0KLS8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi8KLS8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLS8qfCAgICAgICAgICAgICAgICAgICBPU0FMIGZpbGVzeXN0ZW0gQVBJICAgICAgICAgICAgICAgICAgICB8Ki8KLS8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgICAgIFRoaXMgbWV0aG9kIG9wZW5zIHRoZSBwcm92aWRlZCBmaWxlRGVzY3JpcHRvciBhbmQgcmV0dXJucyBpdHMgY29udGV4dC4KLSogQHBhcmFtICAgICAgIHBDb250ZXh0OiAgICAgICAoT1VUKSBGaWxlIHJlYWRlciBjb250ZXh0LgotKiBAcGFyYW0gICAgICAgcEZpbGVEZXNjcmlwdG9yIDogICAgICAgKElOKSBGaWxlIERlc2NyaXB0b3Igb2YgdGhlIGlucHV0IGZpbGUuCi0qIEBwYXJhbSAgICAgICBGaWxlTW9kZUFjY2VzcyA6ICAgICAgICAoSU4pIEZpbGUgbW9kZSBhY2Nlc3MuCi0qIEByZXR1cm4gICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJuICAgICAgTTRFUlJfUEFSQU1FVEVSIHBDb250ZXh0IG9yIGZpbGVEZXNjcmlwdG9yIGlzIE5VTEwKLSogQHJldHVybiAgICAgIE00RVJSX0FMTE9DICAgICB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSogQHJldHVybiAgICAgIE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTICAgICAgdGhlIGZpbGUgbW9kZSBhY2Nlc3MgaXMgbm90IGNvcnJlY3QgKGl0IG11c3QgYmUgZWl0aGVyIGlzVGV4dE1vZGUgb3IgcmVhZCkKLSogQHJldHVybiAgICAgIE00RVJSX0ZJTEVfTk9UX0ZPVU5EIFRoZSBmaWxlIGNhbiBub3QgYmUgb3BlbmVkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmZGVmIE00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRgotICAgIE00T1NBX0VSUiBNNE9TQV9maWxlUmVhZE9wZW5fb3B0aW0oTTRPU0FfQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwRmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgRmlsZU1vZGVBY2Nlc3MpCi0jZWxzZQotICAgIE00T1NBX0VSUiBNNE9TQV9maWxlUmVhZE9wZW5fb3B0aW0oTTRPU0FfQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwRmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgRmlsZU1vZGVBY2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlU3lzdGVtX0ZjdFB0ciAqRlMpCi0jZW5kaWYKLXsKLSAgICBNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qIGFwQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICBNNE9TQV9FUlIgICBlcnIgICAgICAgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1ZvaWQqIGFGaWxlRGVzYyA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfQm9vbCAgYnVmZmVyc19hbGxvY2F0ZWQgPSBNNE9TQV9GQUxTRTsKLSNpZmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLSAgICBNNE9TQV9FUlIgZXJybm8gPSBNNE5PX0VSUk9SOwotI2Vsc2UKLSAgICBNNE9TQV9VSW50MTYgZXJybm87Ci0jZW5kaWYgLypNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYqLwotCi0gICAgTTRPU0FfVFJBQ0UyXzMoIk00T1NBX2ZpbGVSZWFkT3Blbl9vcHRpbSBwID0gMHglcCBmZCA9ICVzIG1vZGUgPSAlbHUiLCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGaWxlRGVzY3JpcHRvciwgRmlsZU1vZGVBY2Nlc3MpOwotCi0gICAgLyogICAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfUEFSQU1FVEVSLCBwQ29udGV4dCk7Ci0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfUEFSQU1FVEVSLCBwRmlsZURlc2NyaXB0b3IpOwotCi0gICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIC8qICAgICAgQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgRmlsZSByZWFkZXIgY29udGV4dC4gKi8KLSAgICBhcENvbnRleHQgPSAoTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GSUxFX1JFQURFUiwgKE00T1NBX0NoYXIgKikiTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltIik7Ci0KLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9BTExPQywgYXBDb250ZXh0KTsKLQotICAgIC8qIFNldCBmaWxlc3lzdGVtIGludGVyZmFjZSAqLwotI2lmZGVmIE00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRgotCi0gICAgLypTZXQgdGhlIG9wdGltaXplZCBmdW5jdGlvbnMsIHRvIGJlIGNhbGxlZCBieSB0aGUgdXNlciovCi0KLSAgICBhcENvbnRleHQtPkZTID0gKE00T1NBX0ZpbGVSZWFkUG9pbnRlciopIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRPU0FfRmlsZVJlYWRQb2ludGVyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZJTEVfUkVBREVSLCAoTTRPU0FfQ2hhciAqKSJNNE9TQV9GaWxlUmVhZGVyT3B0aW1faW5pdCIpOwotICAgIGlmIChNNE9TQV9OVUxMPT1hcENvbnRleHQtPkZTKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00T1NBX0ZpbGVSZWFkZXJPcHRpbV9pbml0IC0gRVJST1IgOiBhbGxvY2F0aW9uIGZhaWxlZCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIGFwQ29udGV4dC0+RlMtPm9wZW5SZWFkICA9IE00T1NBX2ZpbGVSZWFkT3BlbjsKLSAgICBhcENvbnRleHQtPkZTLT5yZWFkRGF0YSAgPSBNNE9TQV9maWxlUmVhZERhdGE7Ci0gICAgYXBDb250ZXh0LT5GUy0+c2VlayAgICAgID0gTTRPU0FfZmlsZVJlYWRTZWVrOwotICAgIGFwQ29udGV4dC0+RlMtPmNsb3NlUmVhZCA9IE00T1NBX2ZpbGVSZWFkQ2xvc2U7Ci0gICAgYXBDb250ZXh0LT5GUy0+c2V0T3B0aW9uID0gTTRPU0FfZmlsZVJlYWRTZXRPcHRpb247Ci0gICAgYXBDb250ZXh0LT5GUy0+Z2V0T3B0aW9uID0gTTRPU0FfZmlsZVJlYWRHZXRPcHRpb247Ci0jZWxzZQotICAgIGFwQ29udGV4dC0+RlMgPSBGUzsKLSNlbmRpZgotCi0gICAgLyogVmVyaWZ5IGFjY2VzcyBtb2RlICovCi0gICAgaWYgKCAgICgoRmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZUFwcGVuZCkgIT0gMCkKLSAgICAgICAgfHwgKChGaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlUmVhZCkgPT0gMCkpCi0gICAgewotICAgICAgICBlcnIgPSBNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUzsKLSAgICAgICAgZ290byBjbGVhbnVwOwotICAgIH0KLQotICAgIC8qIE9wZW4gZmlsZSBpbiByZWFkIG1vZGUgKi8KLSAgICBpZigoRmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZUNyZWF0ZSkgIT0gMCkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAoKEZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVSZWFkKSkKLSAgICAgICAgewotICAgICAgICAgICAgLyogRmlsZSBpcyBvcGVuZWQgaW4gcmVhZCBvbmx5Ki8KLSNpZmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLSAgICAgICAgICAgIGVycm5vID0gYXBDb250ZXh0LT5GUy0+b3BlblJlYWQoJmFGaWxlRGVzYywgcEZpbGVEZXNjcmlwdG9yLCBGaWxlTW9kZUFjY2Vzcyk7Ci0KLSAgICAgICAgICAgIGlmICgoYUZpbGVEZXNjID09IE00T1NBX05VTEwpfHwoTTROT19FUlJPUiAhPSBlcnJubykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogY29udmVydHMgdGhlIGVycm9yIHRvIFBTVyBmb3JtYXQqLwotICAgICAgICAgICAgICAgIGVyciA9IGVycm5vOwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8xKCJNNE9TQV9maWxlUmVhZE9wZW5fb3B0aW0gRVJSMSA9IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+SXNPcGVuZWQgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIH0KLSNlbHNlCi0gICAgICAgICAgICBhRmlsZURlc2MgPSBhcENvbnRleHQtPkZTLT5wRmN0UHRyX09wZW4ocEZpbGVEZXNjcmlwdG9yLCBGaWxlTW9kZUFjY2VzcywgJmVycm5vKTsKLQotICAgICAgICAgICAgaWYgKGFGaWxlRGVzYyA9PSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIGNvbnZlcnRzIHRoZSBlcnJvciB0byBQU1cgZm9ybWF0Ki8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRPU0FfRklMRV9SRUFERVIsIGVycm5vKTsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfZmlsZVJlYWRPcGVuX29wdGltIEVSUjEgPSAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICBhcENvbnRleHQtPklzT3BlbmVkID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+SXNPcGVuZWQgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1M7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIGdvdG8gY2xlYW51cDsKLQotICAgIC8qIEFsbG9jYXRlIGJ1ZmZlcnMgKi8KLSAgICBlcnIgPSBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckluaXQoYXBDb250ZXh0KTsKLSAgICBidWZmZXJzX2FsbG9jYXRlZCA9IE00T1NBX1RSVUU7Ci0KLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIGdvdG8gY2xlYW51cDsKLQotICAgIC8qIEluaXRpYWxpemUgcGFyYW1ldGVycyAqLwotICAgIGFwQ29udGV4dC0+ZmlsZVNpemUgPSAwOwotICAgIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MgPSAwOwotICAgIGFwQ29udGV4dC0+cmVhZEZpbGVQb3MgPSAwOwotCi0gICAgLyogUmV0cmlldmUgdGhlIEZpbGUgRGVzY3JpcHRvciovCi0gICAgYXBDb250ZXh0LT5hRmlsZURlc2MgPSBhRmlsZURlc2M7Ci0KLSAgICAvKiBSZXRyaWV2ZSB0aGUgRmlsZSBtb2RlIEFjY2VzcyAqLwotICAgIGFwQ29udGV4dC0+RmlsZUF0dHJpYnV0ZS5tb2RlQWNjZXNzID0gKE00T1NBX0ZpbGVNb2RlQWNjZXNzKSBGaWxlTW9kZUFjY2VzczsKLQotICAgIC8qUmV0cmlldmUgdGhlIEZpbGUgcmVhZGVyIGNvbnRleHQgKi8KLSAgICAqcENvbnRleHQ9IChNNE9TQV9Db250ZXh0KWFwQ29udGV4dDsKLQotICAgIC8qIENvbXB1dGUgZmlsZSBzaXplICovCi0gICAgZXJyID0gTTRPU0FfRmlsZVJlYWRlcl9DYWxjdWxhdGVTaXplKGFwQ29udGV4dCk7Ci0KLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIGdvdG8gY2xlYW51cDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotCi1jbGVhbnVwOgotCi0gICAgLyogZnJlZSBjb250ZXh0ICovCi0gICAgaWYgKE00T1NBX05VTEwgIT0gYXBDb250ZXh0KQotICAgIHsKLSAgICAgICAgaWYoYnVmZmVyc19hbGxvY2F0ZWQgPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJGcmVlKGFwQ29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmcmVlKCBhcENvbnRleHQpOwotICAgICAgICAqcENvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFMl8xICgiTTRPU0FfZmlsZVJlYWRPcGVuX29wdGltOiByZXR1cm5zIGVycm9yIDB4JTB4IiwgZXJyKQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiAgICAgICBUaGlzIG1ldGhvZCByZWFkcyB0aGUgJ3NpemUnIGJ5dGVzIGluIHRoZSBjb3JlIGZpbGUgcmVhZGVyIChzZWxlY3RlZCBieSBpdHMgJ2NvbnRleHQnKQotKiAgICAgICAgICAgICAgICAgICAgICBhbmQgd3JpdGVzIHRoZSBkYXRhIHRvIHRoZSAnZGF0YScgcG9pbnRlci4gSWYgJ3NpemUnIGJ5dGUgY2FuIG5vdCBiZSByZWFkIGluIHRoZSBjb3JlIGZpbGUgcmVhZGVyLAotKiAgICAgICAgICAgICAgICAgICAgICAnc2l6ZScgcGFyYW1ldGVyIGlzIHVwZGF0ZWQgdG8gbWF0Y2ggdGhlIGNvcnJlY3QgbnVtYmVyIG9mIHJlYWQgYnl0ZXMuCi0qIEBwYXJhbSAgICAgICBwQ29udGV4dDogICAgICAgKElOKSBGaWxlIHJlYWRlciBjb250ZXh0LgotKiBAcGFyYW0gICAgICAgcERhdGEgOiAoT1VUKSBEYXRhIHBvaW50ZXIgb2YgdGhlIHJlYWQgZGF0YS4KLSogQHBhcmFtICAgICAgIHBTaXplIDogKElOT1VUKSBTaXplIG9mIHRoZSBkYXRhIHRvIHJlYWQgKGluIGJ5dGUpLgotKiBAcmV0dXJuICAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybiAgICAgIE00RVJSX1BBUkFNRVRFUiBwU2l6ZSwgZmlsZURlc2NyaXB0b3Igb3IgcERhdGEgaXMgTlVMTAotKiBAcmV0dXJuICAgICAgTTRFUlJfQUxMT0MgICAgIHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotKiBAcmV0dXJuICAgICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWREYXRhX29wdGltKE00T1NBX0NvbnRleHQgcENvbnRleHQsTTRPU0FfTWVtQWRkcjggcERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHBTaXplKQotewotICAgIE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSogYXBDb250ZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltKikgcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBhU2l6ZTsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gY29waWVkU2l6ZTsKLSAgICBNNE9TQV9JbnQ4IHNlbGVjdGVkX2J1ZmZlciwgY3VycmVudF9idWZmZXI7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMygiTTRPU0FfZmlsZVJlYWREYXRhX29wdGltIHAgPSAweCVwICBkID0gMHglcCAgcyA9ICVsdSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQsIHBEYXRhLCAqcFNpemUpOwotCi0gICAgLyogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX0JBRF9DT05URVhULCBhcENvbnRleHQpOwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcERhdGEpOwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcFNpemUpOwotCi0gICAgaWYgKGFwQ29udGV4dC0+SXNPcGVuZWQgIT0gTTRPU0FfVFJVRSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsKLSAgICB9Ci0KLSAgICAvKiBQcmV2ZW50IHJlYWRpbmcgYmV5b25kIEVPRiAqLwotICAgIGlmKCgqcFNpemUgPiAwKSAmJiAoYXBDb250ZXh0LT5hYnNvbHV0ZVBvcyA+PSBhcENvbnRleHQtPmZpbGVTaXplKSkKLSAgICB7Ci0gICAgICAgIGNvcGllZFNpemUgPSAwOwotICAgICAgICBlcnIgPSBNNFdBUl9OT19NT1JFX0FVOwotICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgaWYgZGF0YSBjYW4gYmUgcmVhZCBmcm9tIGEgYnVmZmVyICovCi0gICAgLyogSWYgbm90LCBmaWxsIG9uZSBhY2NvcmRpbmcgdG8gcXVhbnRpemVkIHBvc2l0aW9ucyAqLwotICAgIGNvcGllZFNpemUgPSAwOwotICAgIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBzZWxlY3RlZF9idWZmZXIgPSBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlck1hdGNoKGFwQ29udGV4dCwgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcyk7Ci0KLSAgICBpZihzZWxlY3RlZF9idWZmZXIgPT0gTTRPU0FfUkVBREJVRkZFUl9OT05FKQotICAgIHsKLSAgICAgICAgc2VsZWN0ZWRfYnVmZmVyID0gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJTZWxlY3QoYXBDb250ZXh0LCAwKTsKLSAgICAgICAgZXJyID0gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJGaWxsKGFwQ29udGV4dCwgc2VsZWN0ZWRfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPmFic29sdXRlUG9zKTsKLSAgICB9Ci0KLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIGlmKGVyciA9PSBNNFdBUl9OT19EQVRBX1lFVCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCpwU2l6ZSA8PSAoTTRPU0FfVUludDMyKWFwQ29udGV4dC0+YnVmZmVyW3NlbGVjdGVkX2J1ZmZlcl0uc2l6ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvcGllZFNpemUgPSAoTTRPU0FfVUludDMyKWFwQ29udGV4dC0+YnVmZmVyW3NlbGVjdGVkX2J1ZmZlcl0uc2l6ZTsKLSAgICAgICAgICAgICAgICAvKmNvcHkgdGhlIGNvbnRlbnQgaW50byBwRGF0YSovCi0gICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJDb3B5KGFwQ29udGV4dCwgc2VsZWN0ZWRfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MsIGNvcGllZFNpemUsIHBEYXRhKTsKLSAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTNfMygicmVhZCAgc2l6ZSA9ICVsdSAgYnVmZmVyID0gJWQgIHBvcyA9ICVsZCIsICpwU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkX2J1ZmZlciwgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcyk7Ci0KLSAgICAvKiBDb3B5IGJ1ZmZlciBpbnRvIHBEYXRhICovCi0gICAgd2hpbGUoKChNNE9TQV9VSW50MzIpY29waWVkU2l6ZSA8ICpwU2l6ZSkgJiYgKGVyciA9PSBNNE5PX0VSUk9SKSkKLSAgICB7Ci0gICAgICAgIGFTaXplID0gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJDb3B5KGFwQ29udGV4dCwgc2VsZWN0ZWRfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPmFic29sdXRlUG9zK2NvcGllZFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwU2l6ZS1jb3BpZWRTaXplLCBwRGF0YStjb3BpZWRTaXplKTsKLSAgICAgICAgY29waWVkU2l6ZSArPSBhU2l6ZTsKLQotICAgICAgICBpZihhU2l6ZSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNFdBUl9OT19EQVRBX1lFVDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKChNNE9TQV9VSW50MzIpY29waWVkU2l6ZSA8ICpwU2l6ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50X2J1ZmZlciA9IHNlbGVjdGVkX2J1ZmZlcjsKLSAgICAgICAgICAgICAgICBzZWxlY3RlZF9idWZmZXIgPSBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlck1hdGNoKGFwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MrY29waWVkU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZihzZWxlY3RlZF9idWZmZXIgPT0gTTRPU0FfUkVBREJVRkZFUl9OT05FKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRfYnVmZmVyID0gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJTZWxlY3QoYXBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfYnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJGaWxsKGFwQ29udGV4dCwgc2VsZWN0ZWRfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcytjb3BpZWRTaXplKTsKLQotICAgICAgICAgICAgICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoZXJyID09IE00V0FSX05PX0RBVEFfWUVUKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qSWYgd2UgZ290IGFsbCB0aGUgZGF0YSB0aGF0IHdlIHdhbnRlZCwgd2Ugc2hvdWxkIHJldHVybiBubyBlcnJvciovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgqcFNpemUtY29waWVkU2l6ZSkgPD0gKE00T1NBX1VJbnQzMilhcENvbnRleHQtPmJ1ZmZlcltzZWxlY3RlZF9idWZmZXJdLnNpemUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKklmIHdlIGRpZCBub3QgZ2V0IGVub3VnaCBkYXRhLCB3ZSB3aWxsIHJldHVybiBOT19EQVRBX1lFVCovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmNvcHkgdGhlIGRhdGEgcmVhZCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYVNpemUgPSBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckNvcHkoYXBDb250ZXh0LCBzZWxlY3RlZF9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPmFic29sdXRlUG9zK2NvcGllZFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcFNpemUtY29waWVkU2l6ZSwgcERhdGErY29waWVkU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29waWVkU2l6ZSArPSBhU2l6ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qd2UgcmVhY2hlZCBlbmQgb2YgZmlsZSwgc28gc3RvcCB0cnlpbmcgdG8gcmVhZCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBNNFdBUl9OT19NT1JFX0FVKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00V0FSX05PX0RBVEFfWUVUOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypjb3B5IHRoZSBkYXRhIHJlYWQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFTaXplID0gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJDb3B5KGFwQ29udGV4dCwgc2VsZWN0ZWRfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MrY29waWVkU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcFNpemUtY29waWVkU2l6ZSwgcERhdGErY29waWVkU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29waWVkU2l6ZSArPSBhU2l6ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qd2UgcmVhY2hlZCBlbmQgb2YgZmlsZSwgc28gc3RvcCB0cnlpbmcgdG8gcmVhZCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi1jbGVhbnVwIDoKLQotICAgIC8qIFVwZGF0ZSB0aGUgbmV3IHBvc2l0aW9uIG9mIHRoZSBwb2ludGVyICovCi0gICAgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcyA9IGFwQ29udGV4dC0+YWJzb2x1dGVQb3MgKyBjb3BpZWRTaXplOwotCi0gICAgaWYoKGVyciAhPSBNNE5PX0VSUk9SKSYmKGVyciE9TTRXQVJfTk9fREFUQV9ZRVQpKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UyXzMoIk00T1NBX2ZpbGVSZWFkRGF0YV9vcHRpbSBzaXplID0gJWxkICBjb3BpZWQgPSAlbGQgIGVyciA9IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcFNpemUsIGNvcGllZFNpemUsIGVycik7Ci0gICAgfQotCi0gICAgLyogRWZmZWN0aXZlIGNvcGllZCBzaXplIG11c3QgYmUgcmV0dXJuZWQgKi8KLSAgICAqcFNpemUgPSBjb3BpZWRTaXplOwotCi0KLSAgICAvKiBSZWFkIGlzIGRvbmUgKi8KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgICAgICAgVGhpcyBtZXRob2Qgc2Vla3MgYXQgdGhlIHByb3ZpZGVkIHBvc2l0aW9uIGluIHRoZSBjb3JlIGZpbGUgcmVhZGVyIChzZWxlY3RlZCBieSBpdHMgJ2NvbnRleHQnKS4KLSogICAgICAgICAgICAgIFRoZSBwb3NpdGlvbiBpcyByZWxhdGVkIHRvIHRoZSBzZWVrTW9kZSBwYXJhbWV0ZXIgaXQgY2FuIGJlIGVpdGhlciA6Ci0qICAgICAgICAgICAgICBGcm9tIHRoZSBiZWdpbm5pbmcgKHBvc2l0aW9uIE1VU1QgYmUgcG9zaXRpdmUpIDogZW5kIHBvc2l0aW9uID0gcG9zaXRpb24KLSogICAgICAgICAgICAgIEZyb20gdGhlIGVuZCAocG9zaXRpb24gTVVTVCBiZSBuZWdhdGl2ZSkgOiBlbmQgcG9zaXRpb24gPSBmaWxlIHNpemUgKyBwb3NpdGlvbgotKiAgICAgICAgICAgICAgRnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiAoc2lnbmVkIG9mZnNldCkgOiBlbmQgcG9zaXRpb24gPSBjdXJyZW50IHBvc2l0aW9uICsgcG9zaXRpb24uCi0qIEBwYXJhbSAgICAgICBwQ29udGV4dDogICAgICAgKElOKSBGaWxlIHJlYWRlciBjb250ZXh0LgotKiBAcGFyYW0gICAgICAgU2Vla01vZGUgOiAgICAgIChJTikgU2VlayBhY2Nlc3MgbW9kZS4KLSogQHBhcmFtICAgICAgIHBQb3NpdGlvbiA6ICAgICAoSU4pIFBvc2l0aW9uIGluIHRoZSBmaWxlLgotKiBAcmV0dXJuICAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybiAgICAgIE00RVJSX1BBUkFNRVRFUiBTZWVrbW9kZSBvciBmaWxlRGVzY3JpcHRvciBpcyBOVUxMCi0qIEByZXR1cm4gICAgICBNNEVSUl9BTExPQyAgICAgdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0qIEByZXR1cm4gICAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZS4KLSogQHJldHVybiAgICAgIE00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTiB0aGUgcG9zaXRpb24gY2Fubm90IGJlIHJlYWNoZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRTZWVrX29wdGltKCBNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGUgU2Vla01vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiogcFBvc2l0aW9uKQotewotICAgIE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSogYXBDb250ZXh0ID0gKE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSopIHBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1RSQUNFM18zKCJNNE9TQV9maWxlUmVhZFNlZWtfb3B0aW0gcCA9IDB4JXAgbW9kZSA9ICVkIHBvcyA9ICVkIiwgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Vla01vZGUsICpwUG9zaXRpb24pOwotCi0gICAgLyogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX0JBRF9DT05URVhULCBhcENvbnRleHQpOwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcFBvc2l0aW9uKTsKLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9QQVJBTUVURVIsIFNlZWtNb2RlKTsKLQotICAgIGlmIChhcENvbnRleHQtPklzT3BlbmVkICE9IE00T1NBX1RSVUUpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7ICAgICAgIC8qPCBUaGUgY29udGV4dCBjYW4gbm90IGJlIGNvcnJlY3QgKi8KLSAgICB9Ci0KLSAgICAvKiBHbyB0byB0aGUgZGVzaXJlZCBwb3NpdGlvbiAqLwotICAgIHN3aXRjaChTZWVrTW9kZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nIDoKLSAgICAgICAgICAgIGlmKCpwUG9zaXRpb24gPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsgLyoqPCBCYWQgU2Vla0FjZXNzIG1vZGUgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MgPSAqcFBvc2l0aW9uOwotICAgICAgICAgICAgKnBQb3NpdGlvbiA9IGFwQ29udGV4dC0+YWJzb2x1dGVQb3M7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00T1NBX2tGaWxlU2Vla0VuZCA6Ci0gICAgICAgICAgICBpZigqcFBvc2l0aW9uID4gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7IC8qKjwgQmFkIFNlZWtBY2VzcyBtb2RlICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcENvbnRleHQtPmFic29sdXRlUG9zID0gYXBDb250ZXh0LT5maWxlU2l6ZSArICpwUG9zaXRpb247Ci0gICAgICAgICAgICAqcFBvc2l0aW9uID0gYXBDb250ZXh0LT5hYnNvbHV0ZVBvczsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVTZWVrQ3VycmVudCA6Ci0gICAgICAgICAgICBpZigoKGFwQ29udGV4dC0+YWJzb2x1dGVQb3MgKyAqcFBvc2l0aW9uKSA+IGFwQ29udGV4dC0+ZmlsZVNpemUpIHx8Ci0gICAgICAgICAgICAgICAgKChhcENvbnRleHQtPmFic29sdXRlUG9zICsgKnBQb3NpdGlvbikgPCAwKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsgLyoqPCBCYWQgU2Vla0FjZXNzIG1vZGUgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MgPSBhcENvbnRleHQtPmFic29sdXRlUG9zICsgKnBQb3NpdGlvbjsKLSAgICAgICAgICAgICpwUG9zaXRpb24gPSBhcENvbnRleHQtPmFic29sdXRlUG9zOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICBlcnIgPSBNNEVSUl9QQVJBTUVURVI7IC8qKjwgQmFkIFNlZWtBY2VzcyBtb2RlICovCi0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKiBSZXR1cm4gd2l0aG91dCBlcnJvciAqLwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiAgICAgICBUaGlzIG1ldGhvZCBhc2tzIHRoZSBjb3JlIGZpbGUgcmVhZGVyIHRvIGNsb3NlIHRoZSBmaWxlCi0qICAgICAgICAgICAgICAoYXNzb2NpYXRlZCB0byB0aGUgY29udGV4dCkgYW5kIGFsc28gZnJlZXMgdGhlIGNvbnRleHQuCi0qIEBwYXJhbSAgICAgICBwQ29udGV4dDogICAgICAgKElOKSBGaWxlIHJlYWRlciBjb250ZXh0LgotKiBAcmV0dXJuICAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybiAgICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkQ2xvc2Vfb3B0aW0oTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qIGFwQ29udGV4dCA9IChNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qKSBwQ29udGV4dDsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotI2lmZGVmIE00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRgotICAgIE00T1NBX0VSUiBlcnJubyA9IE00Tk9fRVJST1I7Ci0jZWxzZQotICAgIE00T1NBX1VJbnQxNiBlcnJubzsKLSNlbmRpZgotCi0gICAgTTRPU0FfVFJBQ0UyXzEoIk00T1NBX2ZpbGVSZWFkQ2xvc2Vfb3B0aW0gcCA9IDB4JXAiLCBwQ29udGV4dCApOwotCi0gICAgLyogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX0JBRF9DT05URVhULCBhcENvbnRleHQpOwotCi0gICAgaWYgKGFwQ29udGV4dC0+SXNPcGVuZWQgIT0gTTRPU0FfVFJVRSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsgICAgICAgLyoqPCBUaGUgY29udGV4dCBjYW4gbm90IGJlIGNvcnJlY3QgKi8KLSAgICB9Ci0KLSAgICAvKiBidWZmZXIgKi8KLSAgICBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckZyZWUoYXBDb250ZXh0KTsKLQotICAgIC8qIENsb3NlIHRoZSBmaWxlICovCi0jaWZkZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCi0gICAgZXJybm8gPSBhcENvbnRleHQtPkZTLT5jbG9zZVJlYWQoYXBDb250ZXh0LT5hRmlsZURlc2MpOwotCi0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJybm8pCi0gICAgewotICAgICAgICAvKiBjb252ZXJ0cyB0aGUgZXJyb3IgdG8gUFNXIGZvcm1hdCovCi0gICAgICAgIGVyciA9IGVycm5vOwotICAgICAgICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfZmlsZVJlYWRDbG9zZV9vcHRpbSBFUlIxID0gMHgleCIsIGVycik7Ci0gICAgfQotI2Vsc2UKLSAgICBhUmV0X1ZhbCA9IGFwQ29udGV4dC0+RlMtPnBGY3RQdHJfQ2xvc2UoYXBDb250ZXh0LT5hRmlsZURlc2MsICZlcnJubyk7Ci0KLSAgICBpZiAoYVJldF9WYWwgIT0gMCkKLSAgICB7Ci0gICAgICAgIC8qIGNvbnZlcnRzIHRoZSBlcnJvciB0byBQU1cgZm9ybWF0Ki8KLSAgICAgICAgZXJyID0gTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00T1NBX0ZJTEVfUkVBREVSLCBlcnJubyk7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8xKCJNNE9TQV9maWxlUmVhZENsb3NlX29wdGltIEVSUjEgPSAweCV4IiwgZXJyKTsKLSAgICB9Ci0jZW5kaWYgLypNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYqLwotCi0gICAgYXBDb250ZXh0LT5Jc09wZW5lZCA9IE00T1NBX0ZBTFNFOwotCi0gICAgLy8+Pj4+IEdMTTIwMDkwMjEyIDogc2V0IHRoZSBsb3cgbGV2ZWwgZnVuY3Rpb24gc3RhdGljYWxseQotICAgIGlmIChhcENvbnRleHQtPkZTICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBmcmVlKCBhcENvbnRleHQtPkZTKTsKLSAgICB9Ci0gICAgLy88PDw8IEdMTTIwMDkwMjEyIDogc2V0IHRoZSBsb3cgbGV2ZWwgZnVuY3Rpb24gc3RhdGljYWxseQotCi0gICAgLyogRnJlZSB0aGUgY29udGV4dCAqLwotICAgIGZyZWUoYXBDb250ZXh0KTsKLQotICAgIC8qIFJldHVybiB3aXRob3V0IGVycm9yICovCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgICAgIFRoaXMgaXMgYSBkdW1teSBmdW5jdGlvbiByZXF1aXJlZCB0byBtYWludGFpbiBmdW5jdGlvbiBwb2ludGVyCi0qICAgICAgICAgICAgICBzdHJ1Y3R1cmUuCi0qIEBub3RlICAgICAgICBUaGlzIGlzIGEgZHVtbXkgZnVuY3Rpb24gcmVxdWlyZWQgdG8gbWFpbnRhaW4gZnVuY3Rpb24gcG9pbnRlcgotKiAgICAgICAgICAgICAgc3RydWN0dXJlLgotKiBAcGFyYW0gICAgICAgcENvbnRleHQ6ICAgICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0qIEBwYXJhbSAgICAgICBPcHRpb25JZCA6ICAgICAgKElOKSBJZCBvZiB0aGUgb3B0aW9uIHRvIHNldC4KLSogQHBhcmFtICAgICAgIE9wdGlvblZhbHVlIDogICAoSU4pIFZhbHVlIG9mIHRoZSBvcHRpb24uCi0qIEByZXR1cm4gICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkU2V0T3B0aW9uX29wdGltKE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRPcHRpb25JRCBPcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIE9wdGlvblZhbHVlKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiAgICAgICBUaGlzIG1ldGhvZCBhc2tzIHRoZSBjb3JlIGZpbGUgcmVhZGVyIHRvIHJldHVybiB0aGUgdmFsdWUgYXNzb2NpYXRlZAotKiAgICAgICAgICAgICAgd2l0aCB0aGUgb3B0aW9uSUQuVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZy9kZS1hbGxvY2F0aW5nCi0qICAgICAgICAgICAgICB0aGUgbWVtb3J5IG9mIHRoZSB2YWx1ZSBmaWVsZC4KLSogQG5vdGUgICAgICAgIFRoZSBvcHRpb25zIGhhbmRsZWQgYnkgdGhlIGNvbXBvbmVudCBkZXBlbmQgb24gdGhlIGltcGxlbWVudGF0aW9uCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGNvbXBvbmVudC4KLSogQHBhcmFtICAgICAgIHBDb250ZXh0OiAgICAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgotKiBAcGFyYW0gICAgICAgT3B0aW9uSWQgOiAgICAgIChJTikgSWQgb2YgdGhlIG9wdGlvbiB0byBzZXQuCi0qIEBwYXJhbSAgICAgICBwT3B0aW9uVmFsdWUgOiAgKE9VVCkgVmFsdWUgb2YgdGhlIG9wdGlvbi4KLSogQHJldHVybiAgICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm4gICAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICBwQ29udGV4dCBpcyBOVUxMCi0qIEByZXR1cm4gICAgICBNNEVSUl9CQURfT1BUSU9OX0lEIHRoZSBvcHRpb24gaWQgaXMgbm90IHZhbGlkLgotKiBAcmV0dXJuICAgICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEIFRoZSBvcHRpb24gaXMgbm90IGltcGxlbWVudGVkIHlldC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlUmVhZEdldE9wdGlvbl9vcHRpbShNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkT3B0aW9uSUQgT3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiogcE9wdGlvblZhbHVlKQotewotICAgIE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSogYXBDb250ZXh0ID0gKE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSopIHBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgLyogIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9CQURfQ09OVEVYVCwgYXBDb250ZXh0KTsKLQotICAgIGlmIChhcENvbnRleHQtPklzT3BlbmVkICE9IE00T1NBX1RSVUUpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7ICAgICAgIC8qKjwgVGhlIGNvbnRleHQgY2FuIG5vdCBiZSBjb3JyZWN0ICovCi0gICAgfQotCi0gICAgLyogR2V0IHRoZSBkZXNpcmVkIG9wdGlvbiBpZiBpdCBpcyBhdmFsYWlibGUgKi8KLSAgICBzd2l0Y2goT3B0aW9uSUQpCi0gICAgewotICAgICAgICAvKiBHZXQgRmlsZSBTaXplICovCi0gICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVSZWFkR2V0RmlsZVNpemU6LyoqPCBHZXQgc2l6ZSBvZiB0aGUgZmlsZSwgbGltaXRlZCB0byAzMiBiaXQgc2l6ZSAqLwotCi0gICAgICAgICAgICAoKihNNE9TQV9VSW50MzIgKilwT3B0aW9uVmFsdWUpID0gYXBDb250ZXh0LT5maWxlU2l6ZTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8qIENoZWNrIEVuZCBvZiBmaWxlIE9jY3VycyAqLwotICAgICAgICBjYXNlIE00T1NBX2tGaWxlUmVhZElzRU9GIDogICAgIC8qKjwgU2VlIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlICovCi0KLSAgICAgICAgICAgICgqKE00T1NBX0Jvb2wgKilwT3B0aW9uVmFsdWUpID0gKGFwQ29udGV4dC0+YWJzb2x1dGVQb3MgPj0gYXBDb250ZXh0LT5maWxlU2l6ZSkgPyBNNE9TQV9UUlVFIDogTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvKiBHZXQgRmlsZSBQb3NpdGlvbiAqLwotICAgICAgICBjYXNlIE00T1NBX2tGaWxlUmVhZEdldEZpbGVQb3NpdGlvbiA6ICAgLyoqPCBHZXQgZmlsZSBwb3NpdGlvbiAqLwotCi0gICAgICAgICAgICAqKE00T1NBX0ZpbGVQb3NpdGlvbiAqKXBPcHRpb25WYWx1ZSA9IGFwQ29udGV4dC0+YWJzb2x1dGVQb3M7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvKiBHZXQgQXR0cmlidXRlICovCi0gICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVSZWFkR2V0RmlsZUF0dHJpYnV0ZSA6ICAvKio8IEdldCB0aGUgZmlsZSBhdHRyaWJ1dGUgPSBhY2Nlc3MgbW9kZSAqLwotCi0gICAgICAgICAgICAoKihNNE9TQV9GaWxlQXR0cmlidXRlICopcE9wdGlvblZhbHVlKS5tb2RlQWNjZXNzID0gYXBDb250ZXh0LT5GaWxlQXR0cmlidXRlLm1vZGVBY2Nlc3M7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLyoqPCBCYWQgb3B0aW9uIElEICovCi0gICAgICAgICAgICBlcnIgPSBNNEVSUl9CQURfT1BUSU9OX0lEOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLypSZXR1cm4gd2l0aG91dCBlcnJvciAqLwotICAgIHJldHVybiBlcnI7Ci19CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9DaGFyU3Rhci5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfQ2hhclN0YXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDgxNGNiZi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9DaGFyU3Rhci5jCisrKyAvZGV2L251bGwKQEAgLTEsNTA2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00RFBBS19DaGFyU3Rhci5jCi0gKiBAaW5ncm91cAotICAqIEBicmllZiAgICAgICAgZGVmaW5pdGlvbiBvZiB0aGUgQ2hhciBTdGFyIHNldCBvZiBmdW5jdGlvbnMuCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBDaGFyIFN0YXIgc2V0IG9mIGZ1bmN0aW9ucy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0KLSNpbmNsdWRlICJNNE9TQV9DaGFyU3Rhci5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0KLS8qIFdBUk5JTkc6IFNwZWNpZmljIEFuZHJvaWQgKi8KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIG1pbWljcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgbGliYydzIHN0cm5jcHkoKS4KLSAqIEBub3RlICAgICAgIEl0IGNvcGllcyBleGFjdGx5IGxlbjJDb3B5IGNoYXJhY3RlcnMgZnJvbSBwU3RySW4gdG8gcFN0ck91dCwKLSAqICAgICAgICAgICAgIHRydW5jYXRpbmcgIHBTdHJJbiBvciBhZGRpbmcgbnVsbCBjaGFyYWN0ZXJzIHRvIHBTdHJPdXQgaWYKLSAqICAgICAgICAgICAgIG5lY2Vzc2FyeS4KLSAqICAgICAgICAgICAgIC0gSWYgbGVuMkNvcHkgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBsZW5ndGggb2YgcFN0ckluLAotICogICAgICAgICAgICAgICBhIG51bGwgY2hhcmFjdGVyIGlzIGFwcGVuZGVkIGF1dG9tYXRpY2FsbHkgdG8gdGhlIGNvcGllZAotICogICAgICAgICAgICAgICBzdHJpbmcuCi0gKiAgICAgICAgICAgICAtIElmIGxlbjJDb3B5IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHBTdHJJbiwgcFN0ck91dCBpcwotICogICAgICAgICAgICAgICBwYWRkZWQgd2l0aCBudWxsIGNoYXJhY3RlcnMgdXAgdG8gbGVuZ3RoIGxlbjJDb3B5LgotICogICAgICAgICAgICAgLSBwU3RyT3V0IGFuZCBwU3RySW4gTVVTVCBOT1QgT1ZFUkxBUCAodGhpcyBpcyBOT1QgQ0hFQ0tFRCkuCi0gKiBAcGFyYW0gICAgICBwU3RyT3V0OiAoT1VUKSBEZXN0aW5hdGlvbiBjaGFyYWN0ZXIgc3RyaW5nLgotICogQHBhcmFtICAgICAgcFN0ckluOiAoSU4pIFNvdXJjZSBjaGFyYWN0ZXIgc3RyaW5nLgotICogQHBhcmFtICAgICAgbGVuMkNvcHk6IChJTikgTWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHBTdHJJbiB0byBjb3B5LgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IuCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IHBTdHJJbiBvciBwU3RyT3V0IGlzIE00T1NBX05VTEwuCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9jaHJOQ29weShNNE9TQV9DaGFyKiBwU3RyT3V0LCBNNE9TQV9DaGFyICAgKnBTdHJJbiwgTTRPU0FfVUludDMyIGxlbjJDb3B5KQotewotICAgIE00T1NBX1RSQUNFMV8zKCJNNE9TQV9jaHJOQ29weVx0KE00T1NBX0NoYXIqICV4LE00T1NBX0NoYXIqICV4LE00T1NBX1VJbnQzMiAlbGQpIiwKLSAgICAgICAgcFN0ck91dCxwU3RySW4sbGVuMkNvcHkpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwU3RyT3V0KSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2Nock5Db3B5Olx0cFN0ck91dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBTdHJJbiksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJOQ29weTpcdHBTdHJJbiBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBzdHJuY3B5KChjaGFyICopcFN0ck91dCwgKGNvbnN0IGNoYXIgKilwU3RySW4sIChzaXplX3QpbGVuMkNvcHkpOwotICAgIGlmKGxlbjJDb3B5IDw9IChNNE9TQV9VSW50MzIpc3RybGVuKChjb25zdCBjaGFyICopcFN0ckluKSkKLSAgICB7Ci0gICAgICAgIHBTdHJPdXRbbGVuMkNvcHldID0gJ1wwJzsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBib29sZWFuIGNvbXBhcmlzb24gb2YgcFN0ckluMSBhbmQgcFN0ckluMi4KLSAqIEBub3RlICAgICAgIFRoZSB2YWx1ZSByZXR1cm5lZCBpbiByZXN1bHQgaXMgTTRPU0FfVFJVRSBpZiB0aGUgc3RyaW5nCi0gKiAgICAgICAgICAgICBwb2ludGVkIHRvIGJ5IHBTdHJJbjEgaXMgc3RyaWN0bHkgaWRlbnRpY2FsIHRvIHRoZSBzdHJpbmcgcG9pbnRlZAotICogICAgICAgICAgICAgdG8gYnkgcFN0ckluMiwgYW5kIE00T1NBX0ZBTFNFIG90aGVyd2lzZS4KLSAqIEBwYXJhbSAgICAgIHBTdHJJbjE6IChJTikgRmlyc3QgY2hhcmFjdGVyIHN0cmluZy4KLSAqIEBwYXJhbSAgICAgIHBTdHJJbjI6IChJTikgU2Vjb25kIGNoYXJhY3RlciBzdHJpbmcuCi0gKiBAcGFyYW0gICAgICBjbXBSZXN1bHQ6IChPVVQpIENvbXBhcmlzb24gcmVzdWx0LgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IuCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IHBTdHJJbjEgcFN0ckluMiBvciBjbXBSZXN1bHQgaXMgTTRPU0FfTlVMTC4KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2NockFyZUlkZW50aWNhbChNNE9TQV9DaGFyKiBwU3RySW4xLCBNNE9TQV9DaGFyKiBwU3RySW4yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQm9vbCogcFJlc3VsdCkKLXsKLSAgICBNNE9TQV9VSW50MzIgaTMyLGxlbjMyOwotICAgIE00T1NBX1RSQUNFMV8zKCJNNE9TQV9jaHJBcmVJZGVudGljYWxcdChNNE9TQV9DaGFyKiAleCxNNE9TQV9DaGFyKiAleCwiCi0gICAgICAgICJNNE9TQV9JbnQzMiogJXgpIixwU3RySW4xLHBTdHJJbjIscFJlc3VsdCk7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ckluMSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJBcmVJZGVudGljYWw6XHRwU3RySW4xIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RySW4yLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NockFyZUlkZW50aWNhbDpcdHBTdHJJbjIgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBSZXN1bHQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyQXJlSWRlbnRpY2FsOlx0cFJlc3VsdCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBsZW4zMiA9IChNNE9TQV9VSW50MzIpc3RybGVuKChjb25zdCBjaGFyICopcFN0ckluMSk7Ci0gICAgaWYobGVuMzIgIT0gKE00T1NBX1VJbnQzMilzdHJsZW4oKGNvbnN0IGNoYXIgKilwU3RySW4yKSkKLSAgICB7Ci0gICAgICAgICpwUmVzdWx0ID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgIGZvcihpMzI9MDtpMzI8bGVuMzI7aTMyKyspCi0gICAgewotICAgICAgICBpZihwU3RySW4xW2kzMl0gIT0gcFN0ckluMltpMzJdKQotICAgICAgICB7Ci0gICAgICAgICAgICAqcFJlc3VsdCA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAqcFJlc3VsdCA9IE00T1NBX1RSVUU7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gZ2V0cyBhIE00T1NBX1VJbnQzMiBmcm9tIHN0cmluZy4KLSAqIEBub3RlICAgICAgIFRoaXMgZnVuY3Rpb24gY29udmVydHMgdGhlIGZpcnN0IHNldCBvZiBub24td2hpdGVzcGFjZQotICogICAgICAgICAgICAgY2hhcmFjdGVycyBvZiBwU3RySW4gdG8gYSBNNE9TQV9VSW50MzIgdmFsdWUgcFZhbCwgYXNzdW1pbmcgYQotICogICAgICAgICAgICAgcmVwcmVzZW50YXRpb24gaW4gYmFzZSBwcm92aWRlZCBieSB0aGUgcGFyYW1ldGVyIGJhc2UuIHBTdHJPdXQgaXMKLSAqICAgICAgICAgICAgIHNldCB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBzdHJpbmcgZm9sbG93aW5nIHRoZSBsYXN0Ci0gKiAgICAgICAgICAgICBjaGFyYWN0ZXIgb2YgdGhlIG51bWJlciB0aGF0IGhhcyBiZWVuIGNvbnZlcnRlZC4KLSAqICAgICAgICAgICAgIC0gaW4gY2FzZSBvZiBhIGZhaWx1cmUgZHVyaW5nIHRoZSBjb252ZXJzaW9uLCBwU3RyT3V0IGlzIG5vdAotICogICAgICAgICAgICAgICB1cGRhdGVkLCBhbmQgcFZhbCBpcyBzZXQgdG8gbnVsbC4KLSAqICAgICAgICAgICAgIC0gaW4gY2FzZSBvZiBuZWdhdGl2ZSBudW1iZXIsIHBTdHJPdXQgaXMgbm90IHVwZGF0ZWQsIGFuZCBwVmFsIGlzCi0gKiAgICAgICAgICAgICAgIHNldCB0byBudWxsLgotICogICAgICAgICAgICAgLSBpbiBjYXNlIG9mIG51bWVyaWNhbCBvdmVyZmxvdywgcFZhbCBpcyBzZXQgdG8gTTRPU0FfVUlOVDMyX01BWC4KLSAqICAgICAgICAgICAgIC0gaWYgcFN0ck91dCBpcyBub3QgdG8gYmUgdXNlZCwgaXQgY2FuIGJlIHNldCB0byBNNE9TQV9OVUxMLgotICogQHBhcmFtICAgICAgcFN0ckluOiAoSU4pIENoYXJhY3RlciBzdHJpbmcuCi0gKiBAcGFyYW0gICAgICBwVmFsOiAoT1VUKSByZWFkIHZhbHVlLgotICogQHBhcmFtICAgICAgcFN0ck91dDogKE9VVCkgT3V0cHV0IGNoYXJhY3RlciBzdHJpbmcuCi0gKiBAcGFyYW0gICAgICBiYXNlOiAoSU4pIEJhc2Ugb2YgdGhlIGNoYXJhY3RlciBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvci4KLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogcFN0ckluIG9yIHBWYWwgaXMgTTRPU0FfTlVMTC4KLSAqIEByZXR1cm4gICAgIE00RVJSX0NIUl9DT05WX0ZBSUxFRDogY29udmVyc2lvbiBmYWlsdXJlLgotICogQHJldHVybiAgICAgTTRXQVJfQ0hSX05VTV9SQU5HRTogdGhlIGNoYXJhY3RlciBzdHJpbmcgcmVwcmVzZW50cyBhIG51bWJlcgotICogICAgICAgICAgICAgZ3JlYXRlciB0aGFuIE00T1NBX1VJTlQzMl9NQVguCi0gKiBAcmV0dXJuICAgICBNNFdBUl9DSFJfTkVHQVRJVkU6IHRoZSBjaGFyYWN0ZXIgc3RyaW5nIHJlcHJlc2VudHMgYSBuZWdhdGl2ZQotICogICAgICAgICAgICAgbnVtYmVyLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9jaHJHZXRVSW50MzIoTTRPU0FfQ2hhciogICAgcFN0ckluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqICAgIHBWYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqKiAgICBwU3RyT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9jaHJOdW1CYXNlIGJhc2UpCi17Ci0gICAgTTRPU0FfVUludDMyIHVsOwotICAgIGNoYXIqICAgICAgICBwVGVtcDsKLQotICAgIE00T1NBX1RSQUNFMV80KCJNNE9TQV9jaHJHZXRVSW50MzJcdChNNE9TQV9DaGFyKiAleCwgTTRPU0FfVUludDMyKiAleCIKLSAgICAgICAgIk00T1NBX0NoYXIqKiAleCxNNE9TQV9jaHJOdW1CYXNlICVkKSIscFN0ckluLHBWYWwscFN0ck91dCxiYXNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RySW4sIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NockdldFVJbnQzMjpcdHBTdHJJbiBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFZhbCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJHZXRVSW50MzI6XHRwVmFsIGlzIE00T1NBX05VTEwiKTsKLQotICAgIGVycm5vID0gMDsKLSAgICBzd2l0Y2goYmFzZSkKLSAgICB7Ci0gICAgY2FzZSBNNE9TQV9rY2hyRGVjOgotICAgICAgICB1bCA9IHN0cnRvdWwoKGNvbnN0IGNoYXIgKilwU3RySW4sICZwVGVtcCwgMTApOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00T1NBX2tjaHJIZXhhOgotICAgICAgICB1bCA9IHN0cnRvdWwoKGNvbnN0IGNoYXIgKilwU3RySW4sICZwVGVtcCwxNik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRPU0Ffa2Nock9jdDoKLSAgICAgICAgdWwgPSBzdHJ0b3VsKChjb25zdCBjaGFyICopcFN0ckluLCAmcFRlbXAsOCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyogaGFzIGNvbnZlcnNpb24gZmFpbGVkID8gKi8KLSAgICBpZigoTTRPU0FfQ2hhciopcFRlbXAgPT0gcFN0ckluKQotICAgIHsKLSAgICAgICAgKnBWYWwgPSAwOwotICAgICAgICByZXR1cm4gTTRFUlJfQ0hSX0NPTlZfRkFJTEVEOwotICAgIH0KLQotICAgIC8qIHdhcyB0aGUgbnVtYmVyIG5lZ2F0aXZlID8gKi8KLSAgICBpZigqKHBTdHJJbitzdHJzcG4oKGNvbnN0IGNoYXIgKilwU3RySW4sIiBcdCIpKSA9PSAnLScpCi0gICAgewotICAgICAgICAqcFZhbCA9IDA7Ci0gICAgICAgIHJldHVybiBNNFdBUl9DSFJfTkVHQVRJVkU7Ci0gICAgfQotCi0gICAgLyogaGFzIGFuIG92ZXJmbG93IG9jY3VyZWQgPyAqLwotICAgIGlmKGVycm5vID09IEVSQU5HRSkKLSAgICB7Ci0gICAgICAgICpwVmFsID0gTTRPU0FfVUlOVDMyX01BWDsKLSAgICAgICAgaWYoTTRPU0FfTlVMTCAhPSBwU3RyT3V0KQotICAgICAgICB7Ci0gICAgICAgICAgICAqcFN0ck91dCA9IChNNE9TQV9DaGFyKilwVGVtcDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTTRXQVJfQ0hSX05VTV9SQU5HRTsKLSAgICB9Ci0KLSAgICAvKiBub21pbmFsIGNhc2UgKi8KLSAgICAqcFZhbCA9IChNNE9TQV9VSW50MzIpdWw7Ci0gICAgaWYoTTRPU0FfTlVMTCAhPSBwU3RyT3V0KQotICAgIHsKLSAgICAgICAgKnBTdHJPdXQgPSAoTTRPU0FfQ2hhciopcFRlbXA7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBnZXRzIGEgTTRPU0FfVUludDE2IGZyb20gc3RyaW5nLgotICogQG5vdGUgICAgICAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgZmlyc3Qgc2V0IG9mIG5vbi13aGl0ZXNwYWNlCi0gKiAgICAgICAgICAgICBjaGFyYWN0ZXJzIG9mIHBTdHJJbiB0byBhIE00T1NBX1VJbnQxNiB2YWx1ZSBwVmFsLCBhc3N1bWluZyBhCi0gKiAgICAgICAgICAgICByZXByZXNlbnRhdGlvbiBpbiBiYXNlIHByb3ZpZGVkIGJ5IHRoZSBwYXJhbWV0ZXIgYmFzZS4gcFN0ck91dCBpcwotICogICAgICAgICAgICAgc2V0IHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHN0cmluZyBmb2xsb3dpbmcgdGhlIGxhc3QKLSAqICAgICAgICAgICAgIGNoYXJhY3RlciBvZiB0aGUgbnVtYmVyIHRoYXQgaGFzIGJlZW4gY29udmVydGVkLgotICogICAgICAgICAgICAgLSBpbiBjYXNlIG9mIGEgZmFpbHVyZSBkdXJpbmcgdGhlIGNvbnZlcnNpb24sIHBTdHJPdXQgaXMgbm90Ci0gKiAgICAgICAgICAgICAgIHVwZGF0ZWQsIGFuZCBwVmFsIGlzIHNldCB0byBudWxsLgotICogICAgICAgICAgICAgLSBpbiBjYXNlIG9mIG5lZ2F0aXZlIG51bWJlciwgcFN0ck91dCBpcyBub3QgdXBkYXRlZCwgYW5kIHBWYWwgaXMKLSAqICAgICAgICAgICAgICAgc2V0IHRvIG51bGwuCi0gKiAgICAgICAgICAgICAtIGluIGNhc2Ugb2YgbnVtZXJpY2FsIG92ZXJmbG93LCBwVmFsIGlzIHNldCB0byBNNE9TQV9VSU5UMTZfTUFYLgotICogICAgICAgICAgICAgLSBpZiBwU3RyT3V0IGlzIG5vdCB0byBiZSB1c2VkLCBpdCBjYW4gYmUgc2V0IHRvIE00T1NBX05VTEwuCi0gKiBAcGFyYW0gICAgICBwU3RySW46IChJTikgQ2hhcmFjdGVyIHN0cmluZy4KLSAqIEBwYXJhbSAgICAgIHBWYWw6IChPVVQpIHJlYWQgdmFsdWUuCi0gKiBAcGFyYW0gICAgICBwU3RyT3V0OiAoT1VUKSBPdXRwdXQgY2hhcmFjdGVyIHN0cmluZy4KLSAqIEBwYXJhbSAgICAgIGJhc2U6IChJTikgQmFzZSBvZiB0aGUgY2hhcmFjdGVyIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yLgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBwU3RySW4gb3IgcFZhbCBpcyBNNE9TQV9OVUxMLgotICogQHJldHVybiAgICAgTTRFUlJfQ0hSX0NPTlZfRkFJTEVEOiBjb252ZXJzaW9uIGZhaWx1cmUuCi0gKiBAcmV0dXJuICAgICBNNFdBUl9DSFJfTlVNX1JBTkdFOiB0aGUgY2hhcmFjdGVyIHN0cmluZyByZXByZXNlbnRzIGEgbnVtYmVyCi0gKiAgICAgICAgICAgICBncmVhdGVyIHRoYW4gTTRPU0FfVUlOVDE2X01BWC4KLSAqIEByZXR1cm4gICAgIE00V0FSX0NIUl9ORUdBVElWRTogdGhlIGNoYXJhY3RlciBzdHJpbmcgcmVwcmVzZW50cyBhIG5lZ2F0aXZlCi0gKiAgICAgICAgICAgICBudW1iZXIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2NockdldFVJbnQxNiAoTTRPU0FfQ2hhciogcFN0ckluLCBNNE9TQV9VSW50MTYgKnBWYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiogcFN0ck91dCwgTTRPU0FfY2hyTnVtQmFzZSBiYXNlKQotewotICAgIE00T1NBX1VJbnQzMiB1bDsKLSAgICBjaGFyKiAgICAgICAgcFRlbXA7Ci0KLSAgICBNNE9TQV9UUkFDRTFfNCgiTTRPU0FfY2hyR2V0VUludDE2XHQoTTRPU0FfQ2hhciogJXgsIE00T1NBX1VJbnQxNiogJXgiCi0gICAgICAgICJNNE9TQV9DaGFyKiogJXgsTTRPU0FfY2hyTnVtQmFzZSAlZCkiLHBTdHJJbixwVmFsLHBTdHJPdXQsYmFzZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ckluLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NockdldFVJbnQxNjpcdHBTdHJJbiBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFZhbCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJHZXRVSW50MTY6XHRwVmFsIGlzIE00T1NBX05VTEwiKTsKLQotICAgIHN3aXRjaChiYXNlKQotICAgIHsKLSAgICBjYXNlIE00T1NBX2tjaHJEZWM6Ci0gICAgICAgIHVsID0gc3RydG91bCgoY29uc3QgY2hhciAqKXBTdHJJbiwgJnBUZW1wLDEwKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNE9TQV9rY2hySGV4YToKLSAgICAgICAgdWwgPSBzdHJ0b3VsKChjb25zdCBjaGFyICopcFN0ckluLCAmcFRlbXAsMTYpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00T1NBX2tjaHJPY3Q6Ci0gICAgICAgIHVsID0gc3RydG91bCgoY29uc3QgY2hhciAqKXBTdHJJbiwgJnBUZW1wLDgpOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIC8qIGhhcyBjb252ZXJzaW9uIGZhaWxlZCA/ICovCi0gICAgaWYoKE00T1NBX0NoYXIqKXBUZW1wID09IHBTdHJJbikKLSAgICB7Ci0gICAgICAgICpwVmFsID0gMDsKLSAgICAgICAgcmV0dXJuIE00RVJSX0NIUl9DT05WX0ZBSUxFRDsKLSAgICB9Ci0KLSAgICAvKiB3YXMgdGhlIG51bWJlciBuZWdhdGl2ZSA/ICovCi0gICAgaWYoKihwU3RySW4rc3Ryc3BuKChjb25zdCBjaGFyICopcFN0ckluLCIgXHQiKSkgPT0gJy0nKQotICAgIHsKLSAgICAgICAgKnBWYWwgPSAwOwotICAgICAgICByZXR1cm4gTTRXQVJfQ0hSX05FR0FUSVZFOwotICAgIH0KLQotICAgIC8qIGhhcyBhbiBvdmVyZmxvdyBvY2N1cmVkID8gKi8KLSAgICBpZih1bD5NNE9TQV9VSU5UMTZfTUFYKQotICAgIHsKLSAgICAgICAgKnBWYWwgPSBNNE9TQV9VSU5UMTZfTUFYOwotICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBTdHJPdXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwU3RyT3V0ID0gKE00T1NBX0NoYXIqKXBUZW1wOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNNFdBUl9DSFJfTlVNX1JBTkdFOwotICAgIH0KLQotICAgIC8qIG5vbWluYWwgY2FzZSAqLwotICAgICpwVmFsID0gKE00T1NBX1VJbnQxNil1bDsKLSAgICBpZihNNE9TQV9OVUxMICE9IHBTdHJPdXQpCi0gICAgewotICAgICAgICAqcFN0ck91dCA9IChNNE9TQV9DaGFyKilwVGVtcDsKLSAgICB9Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBNNE9TQV9jaHJTUHJpbnRmKE00T1NBX0NoYXIgICpwU3RyT3V0LCBNNE9TQV9VSW50MzIgc3RyT3V0TWF4TGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciAgICpmb3JtYXQsIC4uLikKLXsKLSAgICB2YV9saXN0ICAgICAgIG1hcmtlcjsKLSAgICBNNE9TQV9DaGFyICAgKnBUZW1wOwotICAgIE00T1NBX0NoYXIgICAqcGVyY2VudFBvaW50ZXI7Ci0gICAgTTRPU0FfQ2hhciAgICpuZXdGb3JtYXQ7Ci0gICAgTTRPU0FfSW50MzIgIG5ld0Zvcm1hdExlbmd0aD0wOwotICAgIE00T1NBX1VJbnQzMiAgY291bnRfbGwgPSAwOwotICAgIE00T1NBX1VJbnQzMiAgY291bnRfdG0gPSAwOwotICAgIE00T1NBX1VJbnQzMiAgY291bnRfYWEgPSAwOwotICAgIE00T1NBX1VJbnQzMiAgY291bnQ7Ci0gICAgTTRPU0FfVUludDMyICBuYkNoYXI7Ci0gICAgTTRPU0FfSW50MzIgICAgIGVycjsKLSAgICBNNE9TQV9DaGFyIGZsYWdDaGFyW10gICAgICAgICAgICAgPSAiJy0rICMwIjsKLSAgICBNNE9TQV9DaGFyIHdpZHRoT3JQcmVjaXNpb25DaGFyW10gPSAiKjAxMjM0NTY3ODkiOwotICAgIE00T1NBX0NoYXIgb3RoZXJQcmVmaXhDaGFyW10gICAgICA9ICJobEwiOwotICAgIE00T1NBX0NoYXIgY29udmVyc2lvbkNoYXJbXSAgICAgICA9ICJkaW91eFhuZmVFZ0djQ3NTcCUiOwotCi0gICAgTTRPU0FfVFJBQ0UxXzMoIk00T1NBX2NoclNQcmludGZcdChNNE9TQV9DaGFyKiAleCwgTTRPU0FfVUludDMyICVsZCIKLSAgICAgICAgIk00T1NBX0NoYXIqICV4KSIscFN0ck91dCxzdHJPdXRNYXhMZW4sZm9ybWF0KTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyT3V0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyU1ByaW50ZjpcdHBTdHJPdXQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IGZvcm1hdCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJTUHJpbnRmOlx0Zm9ybWF0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIHZhX3N0YXJ0KG1hcmtlcixmb3JtYXQpOwotCi0gICAgLyogY291bnQgdGhlIG51bWJlciBvZiAlW2ZsYWdzXVt3aWR0aF1bLnByZWNpc2lvbl1sbFtjb252ZXJzaW9uXSAqLwotICAgIHBUZW1wID0gZm9ybWF0OwotICAgIHdoaWxlKCpwVGVtcCkKLSAgICB7Ci0gICAgICAgIHBlcmNlbnRQb2ludGVyID0gKE00T1NBX0NoYXIgKilzdHJjaHIoKGNvbnN0IGNoYXIgKilwVGVtcCwnJScpOyAvKiBnZXQgdGhlIG5leHQgcGVyY2VudCBjaGFyYWN0ZXIgKi8KLSAgICAgICAgaWYoIXBlcmNlbnRQb2ludGVyKQotICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICJUaGlzIGlzIHRoZSBFbmQiLCAoYykgSi4gTW9ycmlzc29uICovCi0gICAgICAgIHBUZW1wID0gcGVyY2VudFBvaW50ZXIrMTsgICAgICAgICAgIC8qIHNwYW4gaXQgKi8KLSAgICAgICAgaWYoISpwVGVtcCkKLSAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAiVGhpcyBpcyB0aGUgRW5kIiwgKGMpIEouIE1vcnJpc3NvbiAqLwotICAgICAgICBwVGVtcCArPSBzdHJzcG4oKGNvbnN0IGNoYXIgKilwVGVtcCwoY29uc3QgY2hhciAqKWZsYWdDaGFyKTsgICAgLyogc3BhbiB0aGUgb3B0aW9uYWwgZmxhZ3MgKi8KLSAgICAgICAgaWYoISpwVGVtcCkKLSAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAiVGhpcyBpcyB0aGUgRW5kIiwgKGMpIEouIE1vcnJpc3NvbiAqLwotICAgICAgICBwVGVtcCArPSBzdHJzcG4oKGNvbnN0IGNoYXIgKilwVGVtcCwoY29uc3QgY2hhciAqKXdpZHRoT3JQcmVjaXNpb25DaGFyKTsgLyogc3BhbiB0aGUgb3B0aW9uYWwgd2lkdGggKi8KLSAgICAgICAgaWYoISpwVGVtcCkKLSAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAiVGhpcyBpcyB0aGUgRW5kIiwgKGMpIEouIE1vcnJpc3NvbiAqLwotICAgICAgICBpZigqcFRlbXA9PScuJykKLSAgICAgICAgewotICAgICAgICAgICAgcFRlbXArKzsKLSAgICAgICAgICAgIHBUZW1wICs9IHN0cnNwbigoY29uc3QgY2hhciAqKXBUZW1wLCAoY29uc3QgY2hhciAqKXdpZHRoT3JQcmVjaXNpb25DaGFyKTsgLyogc3BhbiB0aGUgb3B0aW9uYWwgcHJlY2lzaW9uICovCi0gICAgICAgIH0KLSAgICAgICAgaWYoISpwVGVtcCkKLSAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAiVGhpcyBpcyB0aGUgRW5kIiwgKGMpIEouIE1vcnJpc3NvbiAqLwotICAgICAgICBpZihzdHJsZW4oKGNvbnN0IGNoYXIgKilwVGVtcCk+PTIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCFzdHJuY21wKChjb25zdCBjaGFyICopcFRlbXAsImxsIiwyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb3VudF9sbCsrOyAgICAgICAgICAgICAgICAgLyogSSBnb3QgT05FICovCi0gICAgICAgICAgICAgICAgcFRlbXAgKz0yOyAgICAgICAgICAgICAgICAgIC8qIHNwYW4gdGhlICJsbCIgcHJlZml4ICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCFzdHJuY21wKChjb25zdCBjaGFyICopcFRlbXAsInRtIiwyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb3VudF90bSsrOwotICAgICAgICAgICAgICAgIHBUZW1wICs9MjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIXN0cm5jbXAoKGNvbnN0IGNoYXIgKilwVGVtcCwiYWEiLDIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvdW50X2FhKys7Ci0gICAgICAgICAgICAgICAgcFRlbXAgKz0yOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBUZW1wICs9IHN0cnNwbigoY29uc3QgY2hhciAqKXBUZW1wLCAoY29uc3QgY2hhciAqKW90aGVyUHJlZml4Q2hhcik7IC8qIHNwYW4gdGhlIG90aGVyIG9wdGlvbmFsIHByZWZpeCAqLwotICAgICAgICBpZighKnBUZW1wKQotICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgLyogIlRoaXMgaXMgdGhlIEVuZCIsIChjKSBKLiBNb3JyaXNzb24gKi8KLSAgICAgICAgcFRlbXAgKz0gc3Ryc3BuKChjb25zdCBjaGFyICopcFRlbXAsIChjb25zdCBjaGFyICopY29udmVyc2lvbkNoYXIpOwotICAgICAgICBpZighKnBUZW1wKQotICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgLyogIlRoaXMgaXMgdGhlIEVuZCIsIChjKSBKLiBNb3JyaXNzb24gKi8KLSAgICB9Ci0KLSAgICBjb3VudCA9IGNvdW50X2xsICsgY291bnRfdG0gKyBjb3VudF9hYTsKLQotICAgIGlmKCFjb3VudCkKLSAgICB7Ci0gICAgICAgIGVycj0gdnNucHJpbnRmKChjaGFyICopcFN0ck91dCwgKHNpemVfdClzdHJPdXRNYXhMZW4gKyAxLCAoY29uc3QgY2hhciAqKWZvcm1hdCwgbWFya2VyKTsKLSAgICAgICAgdmFfZW5kKG1hcmtlcik7Ci0gICAgICAgIGlmICgoZXJyPDApIHx8ICgoTTRPU0FfVUludDMyKWVycj5zdHJPdXRNYXhMZW4pKQotICAgICAgICB7Ci0gICAgICAgICAgICBwU3RyT3V0W3N0ck91dE1heExlbl0gPSAnXDAnOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0NIUl9TVFJfT1ZFUkZMT1c7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgbmV3Rm9ybWF0TGVuZ3RoID0gc3RybGVuKChjb25zdCBjaGFyICopZm9ybWF0KSArIDE7Ci0KLSAgICBuZXdGb3JtYXRMZW5ndGggLT0gKGNvdW50X2xsK2NvdW50X3RtK2NvdW50X2FhKTsKLQotICAgIG5ld0Zvcm1hdCA9KE00T1NBX0NoYXIqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhuZXdGb3JtYXRMZW5ndGgsCi0gICAgICAgIE00T1NBX0NIQVJTVEFSLChNNE9TQV9DaGFyKikiTTRPU0FfY2hyUHJpbnRmOiBuZXdGb3JtYXQiKTsKLSAgICBpZihNNE9TQV9OVUxMID09IG5ld0Zvcm1hdCkKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIG5ld0Zvcm1hdFtuZXdGb3JtYXRMZW5ndGgtMV0gPSAnXDAnOwotICAgIHBUZW1wID0gbmV3Rm9ybWF0OwotCi0gICAgLyogY29weSBmb3JtYXQgdG8gbmV3Rm9ybWF0LCByZXBsYWNpbmcgJVtmbGFnc11bd2lkdGhdWy5wcmVjaXNpb25dbGxbY29udmVyc2lvbl0KLSAgICAgKiBieSAlW2ZsYWdzXVt3aWR0aF1bLnByZWNpc2lvbl1JNjRbY29udmVyc2lvbl0gKi8KLSAgICB3aGlsZSgqZm9ybWF0KQotICAgIHsKLSAgICAgICAgbmJDaGFyID0gc3RyY3NwbigoY29uc3QgY2hhciAqKWZvcm1hdCwgIiUiKTsKLSAgICAgICAgaWYobmJDaGFyKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJuY3B5KChjaGFyICopcFRlbXAsIChjb25zdCBjaGFyICopZm9ybWF0LCBuYkNoYXIpOyAgICAgIC8qIGNvcHkgY2hhcmFjdGVycyBiZWZvcmUgdGhlICUgY2hhcmFjdGVyICovCi0gICAgICAgICAgICBmb3JtYXQgKz1uYkNoYXI7Ci0gICAgICAgICAgICBwVGVtcCAgICs9bmJDaGFyOwotICAgICAgICB9Ci0gICAgICAgIGlmKCEqZm9ybWF0KSBicmVhazsKLSAgICAgICAgKnBUZW1wKysgPSAqZm9ybWF0Kys7ICAgICAgICAgICAgICAgICAvKiBjb3B5IHRoZSAlIGNoYXJhY3RlciAqLwotICAgICAgICBuYkNoYXIgPSBzdHJzcG4oKGNvbnN0IGNoYXIgKilmb3JtYXQsIChjb25zdCBjaGFyICopZmxhZ0NoYXIpOwotICAgICAgICBpZihuYkNoYXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cm5jcHkoKGNoYXIgKilwVGVtcCwgKGNvbnN0IGNoYXIgKilmb3JtYXQsIG5iQ2hhcik7ICAgICAgLyogY29weSB0aGUgZmxhZyBjaGFyYWN0ZXJzICovCi0gICAgICAgICAgICBmb3JtYXQgKz1uYkNoYXI7Ci0gICAgICAgICAgICBwVGVtcCAgICs9bmJDaGFyOwotICAgICAgICB9Ci0gICAgICAgIGlmKCEqZm9ybWF0KSBicmVhazsKLSAgICAgICAgbmJDaGFyID0gc3Ryc3BuKChjb25zdCBjaGFyICopZm9ybWF0LCAoY29uc3QgY2hhciAqKXdpZHRoT3JQcmVjaXNpb25DaGFyKTsKLSAgICAgICAgaWYobmJDaGFyKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJuY3B5KChjaGFyICopcFRlbXAsIChjb25zdCBjaGFyICopZm9ybWF0LCBuYkNoYXIpOyAgICAgIC8qIGNvcHkgdGhlIHdpZHRoIGNoYXJhY3RlcnMgKi8KLSAgICAgICAgICAgIGZvcm1hdCArPW5iQ2hhcjsKLSAgICAgICAgICAgIHBUZW1wICAgKz1uYkNoYXI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoISpmb3JtYXQpIGJyZWFrOwotICAgICAgICBpZigqZm9ybWF0PT0nLicpCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwVGVtcCsrID0gKmZvcm1hdCsrOyAgICAgICAgICAgICAgLyogY29weSB0aGUgZG90IGNoYXJhY3RlciAqLwotICAgICAgICAgICAgaWYoIWZvcm1hdCkgYnJlYWs7Ci0gICAgICAgICAgICBuYkNoYXIgPSBzdHJzcG4oKGNvbnN0IGNoYXIgKilmb3JtYXQsIChjb25zdCBjaGFyICopd2lkdGhPclByZWNpc2lvbkNoYXIpOwotICAgICAgICAgICAgaWYobmJDaGFyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cm5jcHkoKGNoYXIgKilwVGVtcCwgKGNvbnN0IGNoYXIgKilmb3JtYXQsIG5iQ2hhcik7ICAgICAgLyogY29weSB0aGUgd2lkdGggY2hhcmFjdGVycyAqLwotICAgICAgICAgICAgICAgIGZvcm1hdCArPW5iQ2hhcjsKLSAgICAgICAgICAgICAgICBwVGVtcCAgICs9bmJDaGFyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoIWZvcm1hdCkgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoc3RybGVuKChjb25zdCBjaGFyICopZm9ybWF0KT49MikKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIXN0cm5jbXAoKGNvbnN0IGNoYXIgKilmb3JtYXQsICJsbCIsIDIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwVGVtcCsrID0gJ2wnOyAvKiAlbCAqLwotICAgICAgICAgICAgICAgIGZvcm1hdCArPTI7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNwYW4gdGhlICJsbCIgcHJlZml4ICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCFzdHJuY21wKChjb25zdCBjaGFyICopZm9ybWF0LCAidG0iLCAyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqcFRlbXArKyA9ICdsJzsgLyogJWwgKi8KLSAgICAgICAgICAgICAgICBmb3JtYXQgKz0yOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcGFuIHRoZSAidG0iIHByZWZpeCAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZighc3RybmNtcCgoY29uc3QgY2hhciAqKWZvcm1hdCwgImFhIiwgMikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBUZW1wKysgPSAnbCc7Ci0gICAgICAgICAgICAgICAgZm9ybWF0ICs9MjsgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3BhbiB0aGUgImFhIiBwcmVmaXggKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBuYkNoYXIgPSBzdHJzcG4oKGNvbnN0IGNoYXIgKilmb3JtYXQsIChjb25zdCBjaGFyICopb3RoZXJQcmVmaXhDaGFyKTsKLSAgICAgICAgaWYobmJDaGFyKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJuY3B5KChjaGFyICopcFRlbXAsIChjb25zdCBjaGFyICopZm9ybWF0LCBuYkNoYXIpOyAgICAgIC8qIGNvcHkgdGhlIG90aGVyIFByZWZpeCAqLwotICAgICAgICAgICAgZm9ybWF0ICs9bmJDaGFyOwotICAgICAgICAgICAgcFRlbXAgICArPW5iQ2hhcjsKLSAgICAgICAgfQotICAgICAgICBpZighKmZvcm1hdCkgYnJlYWs7Ci0gICAgICAgIG5iQ2hhciA9IHN0cnNwbigoY29uc3QgY2hhciAqKWZvcm1hdCwgKGNvbnN0IGNoYXIgKiljb252ZXJzaW9uQ2hhcik7Ci0gICAgICAgIGlmKG5iQ2hhcikKLSAgICAgICAgewotICAgICAgICAgICAgc3RybmNweSgoY2hhciAqKXBUZW1wLCAoY29uc3QgY2hhciAqKWZvcm1hdCwgbmJDaGFyKTsKLSAgICAgICAgICAgIGZvcm1hdCArPSBuYkNoYXI7Ci0gICAgICAgICAgICBwVGVtcCAgICs9IG5iQ2hhcjsKLSAgICAgICAgfQotICAgICAgICBpZighKmZvcm1hdCkgYnJlYWs7Ci0gICAgfQotCi0gICAgLyogWmVybyB0ZXJtaW5hdGUgdGhlIGZvcm1hdCBzdHJpbmcuICovCi0gICAgKCpwVGVtcCkgPSAnXDAnOwotCi0gICAgZXJyID0gdnNucHJpbnRmKChjaGFyICopcFN0ck91dCwgKHNpemVfdClzdHJPdXRNYXhMZW4gKyAxLCAoY29uc3QgY2hhciAqKW5ld0Zvcm1hdCwgbWFya2VyKTsKLSAgICB2YV9lbmQobWFya2VyKTsKLSAgICBmcmVlKG5ld0Zvcm1hdCk7Ci0gICAgaWYgKChlcnI8MCkgfHwgKChNNE9TQV9VSW50MzIpZXJyPnN0ck91dE1heExlbikpCi0gICAgewotICAgICAgICBwU3RyT3V0W3N0ck91dE1heExlbl0gPSAnXDAnOwotICAgICAgICByZXR1cm4gTTRFUlJfQ0hSX1NUUl9PVkVSRkxPVzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9DbG9jay5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfQ2xvY2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTgxN2IyMi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9DbG9jay5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9DbG9jay5jCi0gKiBAYnJpZWYgICAgICAgIENsb2NrIHJlbGF0ZWQgZnVuY3Rpb25zCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZ1bmN0aW9ucyB0byBtYW5pcHVsYXRlIGNsb2NrCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX0Nsb2NrLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgYW4gYWJzb2x1dGUgdGltZSB0byBhbiB1bmtub3duIHJlZmVyZW5jZSB3aXRoCi0gKiAgICAgICAgICAgICBhIGhpZ2ggcHJlY2lzaW9uLgotICogQG5vdGUgICAgICAgSXQgbWVhbnMgaXQgY2FuIG9ubHkgYmUgdXNlZCB0byBnZXQgYSByZWxhdGl2ZSB0aW1lIGJ5IGNvbXB1dGluZwotICogICAgICAgICAgICAgZGlmZmVyZW5jZXMgYmV0d2VlbiB0byB0aW1lcy4KLSAqICAgICAgICAgICAgIEl0IGlzIHRvIHRoZSBjYWxsZXIgdG8gYWxsb2NhdGUgdGltZS4gVGltZSBpcyBleHByZXNzZWQgaW4KLSAqICAgICAgICAgICAgIHRpbWVzY2FsZSB1bml0LgotICogICAgICAgICAgICAgTTRPU0FfUk9MTE9WRVJfQ0xPQ0sgaW4gTTRPU0FfVHlwZXMuaCBtdXN0IGJlIGNvbmZpZ3VyZWQgd2l0aCB0aGUgcm9sbG92ZXIKLSAqICAgICAgICAgICAgIG9mZnNldCBvZiB0aGlzIGZ1bmN0aW9uLgotICogQHBhcmFtICAgICAgdGltZTogKElOL09VVCkgdGltZQotICogQHBhcmFtICAgICAgdGltZXNjYWxlOiAoSU4pIFRoZSB0aW1lc2NhbGUgKHRpbWUgdW5pdCBwZXIgc2Vjb25kKQotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNFdBUl9USU1FU0NBTEVfVE9PX0JJRzogdGhlIHByZWNpc2lvbiBvZiB0aGUgc3lzdGVtIGNsb2NrIGlzCi0gKiAgICAgICAgICAgICBub3QKLSAqICAgICAgICAgICAgIGNvbXBsaWFudCB3aXRoIHRoZSBpbnB1dCB0aW1lc2NhbGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfY2xvY2tHZXRUaW1lKE00T1NBX1RpbWUqIHBUaW1lLCBNNE9TQV9VSW50MzIgdGltZXNjYWxlKQotewotICAgIHN0cnVjdCB0aW1ldmFsIHR2OwotICAgIHN0cnVjdCB0aW1lem9uZSB0ejsKLSAgICBNNE9TQV9VSW50MzIgdTMyX3RpbWUgPSAwOwotICAgIE00T1NBX1VJbnQzMiB1MzJfdGltZV9oaTsKLSAgICBNNE9TQV9VSW50MzIgdTMyX3RpbWVfbG87Ci0gICAgTTRPU0FfVUludDMyIHUzMl90aW1lX2xoOwotICAgIE00T1NBX1VJbnQzMiBmYWN0b3I7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMigiTTRPU0FfY2xvY2tHZXRUaW1lXHRcdE00T1NBX1RpbWUqIDB4JXhcdE00T1NBX1VJbnQzMiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaW1lLCB0aW1lc2NhbGUpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFRpbWUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2xvY2tHZXRUaW1lOiBwVGltZSBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKDAgPT0gdGltZXNjYWxlLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2xvY2tHZXRUaW1lOiB0aW1lc2NhbGUgaXMgMCIpOwotCi0gICAgZmFjdG9yID0gMTAwMDAwMCAvIHRpbWVzY2FsZTsKLQotICAgIGlmKGdldHRpbWVvZmRheSgmdHYsICZ0eikgPT0gMCkKLSAgICB7Ci0gICAgICAgIHUzMl90aW1lX2xvID0gKHR2LnR2X3NlYyAmIDB4RkZGRikgKiB0aW1lc2NhbGU7Ci0gICAgICAgIHUzMl90aW1lX2hpID0gKCgodHYudHZfc2VjID4+IDE2KSAmIDB4RkZGRikgKiB0aW1lc2NhbGUpICsgKCh1MzJfdGltZV9sbyA+PiAxNikgJiAweEZGRkYpOwotICAgICAgICB1MzJfdGltZV9sbyAmPSAweEZGRkY7Ci0gICAgICAgIHUzMl90aW1lX2xvICs9IHR2LnR2X3VzZWMgLyBmYWN0b3I7Ci0gICAgICAgIHUzMl90aW1lX2hpICs9ICgodTMyX3RpbWVfbG8gPj4gMTYpICYgMHhGRkZGKTsKLSAgICAgICAgdTMyX3RpbWVfbG8gJj0gMHhGRkZGOwotICAgICAgICB1MzJfdGltZSA9ICgodTMyX3RpbWVfaGkgJiAweDdGRkYpIDw8IDE2KSB8IHUzMl90aW1lX2xvOwotICAgIH0KLQotICAgIC8qIE00T1NBX1RpbWUgaXMgc2lnbmVkLCBzbyB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBtYXggdmFsdWUqLwotICAgIGlmICh1MzJfdGltZSA+IE00T1NBX0lOVDMyX01BWCkKLSAgICB7Ci0gICAgICAgIHUzMl90aW1lID0gdTMyX3RpbWUgLSBNNE9TQV9JTlQzMl9NQVg7Ci0gICAgfQotCi0gICAgKnBUaW1lID0gKE00T1NBX1RpbWUpdTMyX3RpbWU7Ci0KLSAgICBpZiggdGltZXNjYWxlID4gMTAwMDAgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00V0FSX1RJTUVTQ0FMRV9UT09fQklHOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfRmlsZUNvbW1vbi5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfRmlsZUNvbW1vbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMTJkYjVkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0ZpbGVDb21tb24uYworKysgL2Rldi9udWxsCkBAIC0xLDY2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9GaWxlQ29tbW9uLmMKLSAqIEBicmllZiAgICAgICAgRmlsZSBjb21tb24gZm9yIEFuZHJvaWQKLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb25zIHVzZWQgYnkgYm90aCB0aGUgZmlsZSB3cml0ZXIKLSAqICAgICAgICAgICAgICAgYW5kIGZpbGUgcmVhZGVyLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBVU0VfU1RBR0VGUklHSFRfQ09ERUNTCi0jZXJyb3IgIlVTRV9TVEFHRUZSSUdIVF9DT0RFQ1MgaXMgbm90IGRlZmluZWQiCi0jZW5kaWYgLypVU0VfU1RBR0VGUklHSFRfQ09ERUNTKi8KLQotI2lmZGVmIFVURl9DT05WRVJTSU9OCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYgLypVVEZfQ09OVkVSU0lPTiovCi0KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0jaW5jbHVkZSAiTTRPU0FfU2VtYXBob3JlLmgiCi0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVDb21tb24uaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlQ29tbW9uX3ByaXYuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9DaGFyU3Rhci5oIgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gb3BlbnMgdGhlIHByb3ZpZGVkIFVSTCBhbmQgcmV0dXJucyBpdHMgY29udGV4dC4KLSAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VyZWQsIHRoZSBjb250ZXh0IGlzIHNldCB0byBOVUxMLgotICogQHBhcmFtICAgICAgY29yZV9pZDogKElOKSBDb3JlIElEIG9mIHRoZSBjYWxsZXIgKE00T1NBX0ZJTEVfUkVBREVSIG9yIE00T1NBX0ZJTEVfV1JJVEVSKQotICogQHBhcmFtICAgICAgY29udGV4dDogKE9VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgotICogQHBhcmFtICAgICAgdXJsOiAoSU4pIFVSTCBvZiB0aGUgaW5wdXQgZmlsZQotICogQHBhcmFtICAgICAgZmlsZU1vZGVBY2Nlc3M6IChJTikgRmlsZSBtb2RlIGFjY2VzcwotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQ6IHRoZSBVUkwgZG9lcyBub3QgbWF0Y2ggd2l0aCB0aGUgc3VwcG9ydGVkCi0gKiAgICAgICAgICAgICBmaWxlCi0gKiBAcmV0dXJuICAgICBNNEVSUl9GSUxFX05PVF9GT1VORDogdGhlIGZpbGUgY2Fubm90IGJlIGZvdW5kCi0gKiBAcmV0dXJuICAgICBNNEVSUl9GSUxFX0xPQ0tFRDogdGhlIGZpbGUgaXMgbG9ja2VkIGJ5IGFuIG90aGVyCi0gKiAgICAgICAgICAgICBhcHBsaWNhdGlvbi9wcm9jZXNzCi0gKiBAcmV0dXJuICAgICBNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUzogdGhlIGZpbGUgbW9kZSBhY2Nlc3MgaXMgbm90IGNvcnJlY3QKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZUNvbW1vbk9wZW4oTTRPU0FfVUludDE2IGNvcmVfaWQsIE00T1NBX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIHBVcmwsIE00T1NBX0ZpbGVNb2RlQWNjZXNzIGZpbGVNb2RlQWNjZXNzKQotewotCi0gICAgTTRPU0FfSW50MzIgaSAgICAgICAgICAgID0gMDsKLSAgICBNNE9TQV9JbnQzMiBpTW9kZSAgICAgICAgPSAwOwotICAgIE00T1NBX0ludDMyIGlTaXplICAgICAgICA9IDA7Ci0gICAgTTRPU0FfSW50MzIgaVNhdmVQb3MgICAgPSAwOwotCi0gICAgTTRPU0FfQ2hhciAgbW9kZVs0XSAgICAgICAgICAgID0gIiI7Ci0gICAgTTRPU0FfQ2hhciogcFJlYWRTdHJpbmcgICAgICAgID0gKE00T1NBX0NoYXIqKSJyIjsKLSAgICBNNE9TQV9DaGFyKiBwV3JpdGVTdHJpbmcgICAgPSAoTTRPU0FfQ2hhciopInciOwotICAgIE00T1NBX0NoYXIqIHBBcHBlbmRTdHJpbmcgICAgPSAoTTRPU0FfQ2hhciopImEiOwotICAgIE00T1NBX0NoYXIqIHBCaW5hcnlTdHJpbmcgICAgPSAoTTRPU0FfQ2hhciopImIiOwotICAgIE00T1NBX0NoYXIqIHBQbHVzU3RyaW5nICAgICAgICA9IChNNE9TQV9DaGFyKikiKyI7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIEZJTEUqIHBGaWxlSGFuZGxlciA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfRmlsZUNvbnRleHQgKnBGaWxlQ29udGV4dCAgICA9IE00T1NBX05VTEw7Ci0KLQotI2lmZGVmIFVURl9DT05WRVJTSU9OCi0gICAgLypGQjogdG8gdGVzdCB0aGUgVVRGMTYtPlVURjggY29udmVyc2lvbiBpbnRvIFZpZGVvIEFydGlzdCovCi0gICAgLypDb252ZXJ0IHRoZSBVUkwgZnJvbSBVVEYxNiB0byBVVEY4Ki8KLSAgICBNNE9TQV9Wb2lkKiB0ZW1wQ29udmVyc2lvbkJ1ZjsKLSAgICBNNE9TQV9VSW50MzIgdGVtcENvbnZlcnNpb25TaXplID0gMTAwMDsKLQotICAgIHRlbXBDb252ZXJzaW9uQnVmID0gKE00T1NBX0NoYXIqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyh0ZW1wQ29udmVyc2lvblNpemUgKzEsIDAsICJjb252ZXJzaW9uIGJ1ZiIpOwotICAgIGlmKHRlbXBDb252ZXJzaW9uQnVmID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRXJyb3Igd2hlbiBhbGxvY2F0aW5nIGNvbnZlcnNpb24gYnVmZmVyXG4iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0gICAgTTRPU0FfVG9VVEY4X09TQUwocFVybCwgdGVtcENvbnZlcnNpb25CdWYsICZ0ZW1wQ29udmVyc2lvblNpemUpOwotICAgICgoTTRPU0FfQ2hhciopdGVtcENvbnZlcnNpb25CdWYpW3RlbXBDb252ZXJzaW9uU2l6ZSBdID0gJ1wwJzsKLQotICAgIHByaW50ZigiZmlsZSBvcGVuICVzXG4iLCB0ZW1wQ29udmVyc2lvbkJ1Zik7Ci0jZW5kaWYgLypVVEYgQ09OVkVSU0lPTiovCi0KLSAgICBNNE9TQV9UUkFDRTNfNCgiTTRPU0FfZmlsZUNvbW1vbk9wZW5cdFx0TTRPU0FfVUludDE2ICVkXHRNNE9TQV9Db250ZXh0KiAweCV4XHQiCi0gICAgICAgICJNNE9TQV9DaGFyKiAlc1x0ZmlsZU1vZGVBY2Nlc3MgJWQiLCBjb3JlX2lkLCBwQ29udGV4dCwgcFVybCwgZmlsZU1vZGVBY2Nlc3MpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsICAgIE00RVJSX1BBUkFNRVRFUiwgICAgIk00T1NBX2ZpbGVDb21tb25PcGVuOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFVybCwgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgICAgIk00T1NBX2ZpbGVDb21tb25PcGVuOiBwVXJsICBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKDAgPT0gZmlsZU1vZGVBY2Nlc3MsICAgIE00RVJSX1BBUkFNRVRFUiwgICAgIk00T1NBX2ZpbGVDb21tb25PcGVuOiBmaWxlTW9kZUFjY2VzcyBpcyAwIik7Ci0KLSAgICAvKiBSZWFkIG1vZGUgbm90IHNldCBmb3IgdGhlIHJlYWRlciAqLwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfRklMRV9SRUFERVIgPT0gY29yZV9pZCkgJiYgIShmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlUmVhZCksCi0gICAgICAgIE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTLCAiTTRPU0FfZmlsZUNvbW1vbk9wZW46IE00T1NBX2tGaWxlUmVhZCIpOwotCi0gICAgLyogUmVhZCBtb2RlIG5vdCBzZXQgZm9yIHRoZSByZWFkZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX0ZJTEVfUkVBREVSID09IGNvcmVfaWQpICYmICEoZmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZVJlYWQpLAotICAgICAgICBNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUywgIk00T1NBX2ZpbGVDb21tb25PcGVuOiBNNE9TQV9rRmlsZVJlYWQiKTsKLQotICAgIC8qIE00T1NBZmlsZVJlYWRPcGVuIGNhbm5vdCBiZSB1c2VkIHdpdGggV3JpdGUgZmlsZSBtb2RlIGFjY2VzcyAqLwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfRklMRV9SRUFERVIgPT0gY29yZV9pZCkgJiYgKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVXcml0ZSksCi0gICAgICAgIE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTLCAiTTRPU0FfZmlsZUNvbW1vbk9wZW46IE00T1NBX2tGaWxlV3JpdGUiKTsKLQotICAgIC8qIEFwcGVuZCBhbmQgQ3JlYXRlIGZsYWdzIGNhbm5vdCBiZSB1c2VkIHdpdGggUmVhZCAqLwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfRklMRV9SRUFERVIgPT0gY29yZV9pZCkgJiYgKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVBcHBlbmQpLAotICAgICAgICBNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUywgIk00T1NBX2ZpbGVDb21tb25PcGVuOiBNNE9TQV9rRmlsZUFwcGVuZCIpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9GSUxFX1JFQURFUiA9PSBjb3JlX2lkKSAmJiAoZmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZUNyZWF0ZSksCi0gICAgICAgIE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTLCAiTTRPU0FfZmlsZUNvbW1vbk9wZW46IE00T1NBX2tGaWxlQ3JlYXRlIik7Ci0KLSAgICAvKiBXcml0ZSBtb2RlIG5vdCBzZXQgZm9yIHRoZSB3cml0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX0ZJTEVfV1JJVEVSID09IGNvcmVfaWQpICYmICEoZmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZVdyaXRlKSwKLSAgICAgICAgTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1MsICJNNE9TQV9maWxlQ29tbW9uT3BlbjogTTRPU0Ffa0ZpbGVXcml0ZSIpOwotCi0gICAgLyogQ3JlYXRlIGZsYWcgbmVjZXNzYXJ5IGZvciBvcGVuaW5nIGZpbGUgKi8KLSAgICBpZiAoKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVSZWFkKSAmJgotICAgICAgICAoZmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZVdyaXRlKSYmKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVDcmVhdGUpKQotICAgIHsKLSAgICAgICAgc3RybmNhdCgoY2hhciAqKW1vZGUsIChjb25zdCBjaGFyICopcFdyaXRlU3RyaW5nLCAoc2l6ZV90KTEpOwotICAgICAgICBzdHJuY2F0KChjaGFyICopbW9kZSwgKGNvbnN0IGNoYXIgKilwUGx1c1N0cmluZywgKHNpemVfdCkxKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYoZmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZUFwcGVuZCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RybmNhdCgoY2hhciAqKW1vZGUsIChjb25zdCBjaGFyICopcEFwcGVuZFN0cmluZywgKHNpemVfdCkxKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVSZWFkKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJuY2F0KChjaGFyICopbW9kZSwgKGNvbnN0IGNoYXIgKilwUmVhZFN0cmluZywgKHNpemVfdCkxKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVXcml0ZSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RybmNhdCgoY2hhciAqKW1vZGUsIChjb25zdCBjaGFyICopcFdyaXRlU3RyaW5nLCAoc2l6ZV90KTEpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVSZWFkKSYmKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVXcml0ZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cm5jYXQoKGNoYXIgKiltb2RlLChjb25zdCBjaGFyICopcFBsdXNTdHJpbmcsIChzaXplX3QpMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZighKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVJc1RleHRNb2RlKSkKLSAgICB7Ci0gICAgICAgIHN0cm5jYXQoKGNoYXIgKiltb2RlLCAoY29uc3QgY2hhciAqKXBCaW5hcnlTdHJpbmcsKHNpemVfdCkxKTsKLSAgICB9Ci0KLSAgICAvKk9wZW4gdGhlIGZpbGUqLwotCi0jaWZkZWYgVVRGX0NPTlZFUlNJT04KLSAgICAvKk9wZW4gdGhlIGNvbnZlcnRlZCBwYXRoKi8KLSAgICBwRmlsZUhhbmRsZXIgPSBmb3BlbigoY29uc3QgY2hhciAqKXRlbXBDb252ZXJzaW9uQnVmLCAoY29uc3QgY2hhciAqKW1vZGUpOwotICAgIC8qRnJlZSB0aGUgdGVtcG9yYXJ5IGRlY29kZWQgYnVmZmVyKi8KLSAgICBmcmVlKHRlbXBDb252ZXJzaW9uQnVmKTsKLSNlbHNlIC8qIFVURl9DT05WRVJTSU9OICovCi0gICAgcEZpbGVIYW5kbGVyID0gZm9wZW4oKGNvbnN0IGNoYXIgKilwVXJsLCAoY29uc3QgY2hhciAqKW1vZGUpOwotI2VuZGlmIC8qIFVURl9DT05WRVJTSU9OICovCi0KLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwRmlsZUhhbmRsZXIpCi0gICAgewotICAgICAgICBzd2l0Y2goZXJybm8pCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBFTk9FTlQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfRklMRV9OT1RfRk9VTkQsICJNNE9TQV9maWxlQ29tbW9uT3BlbjogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSIpOwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJGaWxlIG5vdCBmb3VuZDogJXMiLCBwVXJsKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfRklMRV9OT1RfRk9VTkQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgRUFDQ0VTOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0ZJTEVfTE9DS0VELCAiTTRPU0FfZmlsZUNvbW1vbk9wZW46IFBlcm1pc3Npb24gZGVuaWVkIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0ZJTEVfTE9DS0VEOwotICAgICAgICAgICAgfQotICAgICAgICAgY2FzZSBFSU5WQUw6Ci0gICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUywgIk00T1NBX2ZpbGVDb21tb25PcGVuOiBJbnZhbGlkIEFyZ3VtZW50Iik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1M7Ci0gICAgICAgICB9Ci0gICAgICAgIGNhc2UgRU1GSUxFOgotICAgICAgICAgY2FzZSBFTk9TUEM6Ci0gICAgICAgIGNhc2UgRU5PTUVNOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0FMTE9DLCAiTTRPU0FfZmlsZUNvbW1vbk9wZW46IFRvbyBtYW55IG9wZW4gZmlsZXMiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfTk9UX0lNUExFTUVOVEVELCAiTTRPU0FfZmlsZUNvbW1vbk9wZW4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQWxsb2NhdGUgdGhlIGZpbGUgY29udGV4dCAqLwotICAgIHBGaWxlQ29udGV4dCA9IChNNE9TQV9GaWxlQ29udGV4dCopIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRPU0FfRmlsZUNvbnRleHQpLAotICAgICAgICAgICAgICAgICAgICBjb3JlX2lkLCAoTTRPU0FfQ2hhciopIk00T1NBX2ZpbGVDb21tb25PcGVuOiBmaWxlIGNvbnRleHQiKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwRmlsZUNvbnRleHQpCi0gICAgewotICAgICAgICBmY2xvc2UocEZpbGVIYW5kbGVyKTsKLSAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQUxMT0MsICJNNE9TQV9maWxlQ29tbW9uT3BlbiIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgcEZpbGVDb250ZXh0LT5maWxlX2Rlc2MgICAgICAgID0gcEZpbGVIYW5kbGVyOwotICAgIHBGaWxlQ29udGV4dC0+YWNjZXNzX21vZGUgICAgPSBmaWxlTW9kZUFjY2VzczsKLSAgICBwRmlsZUNvbnRleHQtPmN1cnJlbnRfc2VlayAgICA9IFNlZWtOb25lOwotICAgIHBGaWxlQ29udGV4dC0+Yl9pc19lbmRfb2ZfZmlsZSAgICA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyoqCi0gICAgICogTm90ZTogTmV2ZXIgdXNlIHRoaXMgZXhwcmVzc2lvbiAiaSA9ICh2YWx1ZTEgPT0gdmFsdWUyKSA/IHg6IHk7IgotICAgICAqIGJlY2F1c2UgdGhhdCBkb2Vucyd0IGNvbXBpbGUgb24gb3RoZXIgcGxhdGZvcm1zIChBRFMgZm9yIGV4YW1wbGUpCi0gICAgICogVXNlOiBpZih2YWx1ZTEgPT0gdmFsdWUyKQotICAgICAqICAgICAgICB7IGk9IHg7IC4uZXRjCi0gICAgICovCi0gICAgcEZpbGVDb250ZXh0LT5jb3JlSURfd3JpdGUgPSAwOwotICAgIHBGaWxlQ29udGV4dC0+Y29yZUlEX3JlYWQgPSAwOwotICAgIHBGaWxlQ29udGV4dC0+bV9EZXNjck1vZGVBY2Nlc3MgPSBNNE9TQV9rRGVzY05vbmVBY2Nlc3M7Ci0KLSAgICBpZiAoTTRPU0FfRklMRV9SRUFERVIgPT0gY29yZV9pZCkKLSAgICB7Ci0gICAgICAgIHBGaWxlQ29udGV4dC0+Y29yZUlEX3JlYWQgPSBjb3JlX2lkOwotICAgICAgICBwRmlsZUNvbnRleHQtPm1fRGVzY3JNb2RlQWNjZXNzID0gTTRPU0Ffa0Rlc2NSZWFkQWNjZXNzOwotICAgIH0KLSAgICBlbHNlIGlmIChNNE9TQV9GSUxFX1dSSVRFUiA9PSBjb3JlX2lkKQotICAgIHsKLSAgICAgICAgcEZpbGVDb250ZXh0LT5jb3JlSURfd3JpdGUgPSBjb3JlX2lkOwotICAgICAgICBwRmlsZUNvbnRleHQtPm1fRGVzY3JNb2RlQWNjZXNzID0gTTRPU0Ffa0Rlc2NXcml0ZUFjY2VzczsKLSAgICB9Ci0KLSAgICBwRmlsZUNvbnRleHQtPnJlYWRfcG9zaXRpb24gPSAwOwotICAgIHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb24gPSAwOwotCi0gICAgLyogQWxsb2NhdGUgdGhlIG1lbW9yeSB0byBzdG9yZSB0aGUgVVJMIHN0cmluZyAqLwotICAgIHBGaWxlQ29udGV4dC0+dXJsX25hbWUgPSAoTTRPU0FfQ2hhciopIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzdHJsZW4oKGNvbnN0IGNoYXIgKilwVXJsKSsxLAotICAgICAgICAgICAgICAgICAgICAgICAgY29yZV9pZCwgKE00T1NBX0NoYXIqKSJNNE9TQV9maWxlQ29tbW9uT3BlbjogVVJMIG5hbWUiKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwRmlsZUNvbnRleHQtPnVybF9uYW1lKQotICAgIHsKLSAgICAgICAgZmNsb3NlKHBGaWxlSGFuZGxlcik7Ci0gICAgICAgIGZyZWUocEZpbGVDb250ZXh0KTsKLSAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQUxMT0MsICJNNE9TQV9maWxlQ29tbW9uT3BlbiIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIE00T1NBX2Nock5Db3B5KHBGaWxlQ29udGV4dC0+dXJsX25hbWUsIHBVcmwsIHN0cmxlbigoY29uc3QgY2hhciAqKXBVcmwpKzEpOwotCi0gICAgLyogR2V0IHRoZSBmaWxlIG5hbWUgKi8KLSAgICBlcnIgPSBNNE9TQV9maWxlQ29tbW9uR2V0RmlsZW5hbWUocFVybCwgJnBGaWxlQ29udGV4dC0+ZmlsZV9uYW1lKTsKLSAgICBpZihNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIGZjbG9zZShwRmlsZUhhbmRsZXIpOwotICAgICAgICBmcmVlKHBGaWxlQ29udGV4dC0+dXJsX25hbWUpOwotICAgICAgICBmcmVlKHBGaWxlQ29udGV4dCk7Ci0gICAgICAgIE00T1NBX0RFQlVHKGVyciwgIk00T1NBX2ZpbGVDb21tb25PcGVuIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX3NlbWFwaG9yZU9wZW4oJihwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KSwgMSk7IC8qIEFsbG9jYXRlIHRoZSBzZW1hcGhvcmUgKi8KLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLQotCi0jaWZkZWYgVVNFX1NUQUdFRlJJR0hUX0NPREVDUwotICAgIC8vIFdvcmthcm91bmQgZm9yIGZpbGUgc3lzdGVtIGJ1ZyBvbiBTdGluZ3JheS9Ib25leWNvbWIgd2hlcmUgYSBmaWxlIHJlLWNyZWF0ZWQgd2lsbCBrZWVwCi0gICAgLy8gdGhlIG9yaWdpbmFsIGZpbGUncyBzaXplIGZpbGxlZCB3aXRoIDBzLiBEbyBub3Qgc2VlayB0byB0aGUgZW5kIHRvIGF2b2lkIGlsbCBlZmZlY3RzCi0gICAgaWYoZmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZUFwcGVuZCkgewotICAgICAgICAvKiBHZXQgdGhlIGZpbGUgc2l6ZSAqLwotICAgICAgICBpU2F2ZVBvcyA9IGZ0ZWxsKHBGaWxlSGFuZGxlcik7ICAgICAgICAgICAgLyogICAgMS0gQ2hlY2sgdGhlIGZpcnN0IHBvc2l0aW9uICovCi0gICAgICAgIGZzZWVrKHBGaWxlSGFuZGxlciwgMCwgU0VFS19FTkQpOyAgICAgICAgLyogICAgMi0gR28gdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSovCi0gICAgICAgIGlTaXplID0gZnRlbGwocEZpbGVIYW5kbGVyKTsgICAgICAgICAgICAvKiAgICAzLSBDaGVjayB0aGUgZmlsZSBzaXplICAgICAgICAqLwotICAgICAgICBmc2VlayhwRmlsZUhhbmRsZXIsIGlTYXZlUG9zLCBTRUVLX1NFVCk7LyogICAgNC0gZ28gdG8gdGhlIGZpcnN0IHBvc2l0aW9uICovCi0gICAgfSBlbHNlIHsKLSAgICAgICAgaVNpemUgPSAwOwotICAgIH0KLSNlbHNlIC8qIFVTRV9TVEFHRUZSSUdIVF9DT0RFQ1MgKi8KLSAgICAvKiBHZXQgdGhlIGZpbGUgc2l6ZSAqLwotICAgIGlTYXZlUG9zID0gZnRlbGwocEZpbGVIYW5kbGVyKTsgICAgICAgICAgICAvKiAgICAxLSBDaGVjayB0aGUgZmlyc3QgcG9zaXRpb24gKi8KLSAgICBmc2VlayhwRmlsZUhhbmRsZXIsIDAsIFNFRUtfRU5EKTsgICAgICAgIC8qICAgIDItIEdvIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUqLwotICAgIGlTaXplID0gZnRlbGwocEZpbGVIYW5kbGVyKTsgICAgICAgICAgICAvKiAgICAzLSBDaGVjayB0aGUgZmlsZSBzaXplICAgICAgICAqLwotICAgIGZzZWVrKHBGaWxlSGFuZGxlciwgaVNhdmVQb3MsIFNFRUtfU0VUKTsvKiAgICA0LSBnbyB0byB0aGUgZmlyc3QgcG9zaXRpb24gKi8KLSNlbmRpZiAvKiBVU0VfU1RBR0VGUklHSFRfQ09ERUNTICovCi0KLQotCi0gICAgLyogV2FybmluZyBwb3NzaWJsZSBvdmVyZmxvdyBpZiB0aGUgZmlsZSBpcyBoaWdoZXIgdGhhbiAyR0J5dGVzICovCi0gICAgcEZpbGVDb250ZXh0LT5maWxlX3NpemUgPSBpU2l6ZTsKLQotICAgICpwQ29udGV4dCA9IHBGaWxlQ29udGV4dDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0IGZyb20gVVRGMTYgdG8gVVRGOAotICogQHBhcmFtICAgICAgcEJ1ZmZlckluOiAoSU4pIFVURjE2IGlucHV0IHBhdGgKLSAqIEBwYXJhbSAgICAgIHBCdWZmZXJPdXQ6IChPVVQpIFVURjggb3V0cHV0IHBhdGgKLSAqIEBwYXJhbSAgICAgIGJ1ZmZlck91dFNpemU6IChJTi9PVVQpIHNpemUgb2YgdGhlIG91dHB1dCBwYXRoCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiB0aGUgb3V0cHV0IHBhdGggc2l6ZSBpcyBub3QgZW5vdWdoIHRvIGNvbnRhaW4KLSAqICAgICAgICAgICAgICAgdGhlIGRlY29kZWQgcGF0aAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZmRlZiBVVEZfQ09OVkVSU0lPTgotTTRPU0FfRVJSIE00T1NBX1RvVVRGOF9PU0FMIChNNE9TQV9Wb2lkICAgKnBCdWZmZXJJbiwgTTRPU0FfVUludDggICpwQnVmZmVyT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiAqYnVmZmVyT3V0U2l6ZSkKLXsKLSAgICBNNE9TQV9VSW50MTYgaTsKLSAgICB3Y2hhcl90ICAgICAgKndfc3RyID0gKHdjaGFyX3QgKikgcEJ1ZmZlckluOwotICAgIE00T1NBX1VJbnQzMiBsZW4sIHNpemVfbmVlZGVkLCBzaXplX2dpdmVuOwotICAgIGlmIChwQnVmZmVySW4gPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgICpwQnVmZmVyT3V0PU5VTEw7Ci0gICAgICAgICpidWZmZXJPdXRTaXplPTE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGxlbiAgICAgICAgID0gd2NzbGVuKHdfc3RyKTsKLSAgICAgICAgc2l6ZV9uZWVkZWQgPSBsZW4rMTsKLSAgICAgICAgc2l6ZV9naXZlbiAgPSAqYnVmZmVyT3V0U2l6ZTsKLQotICAgICAgICpidWZmZXJPdXRTaXplPXNpemVfbmVlZGVkOwotICAgICAgICBpZiAoc2l6ZV9naXZlbiA8IHNpemVfbmVlZGVkICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaT0wOyBpPGxlbjsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBCdWZmZXJPdXRbaV09KE00T1NBX1VJbnQ4KXdfc3RyW2ldOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEJ1ZmZlck91dFtsZW5dPTA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0jZW5kaWYgLypVVEYgQ09OVkVSU0lPTiovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBzZWVrcyBhdCB0aGUgcHJvdmlkZWQgcG9zaXRpb24uCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgICBzZWVrTW9kZTogKElOKSBTZWVrIGFjY2VzcyBtb2RlCi0gKiBAcGFyYW0gICAgICBwb3NpdGlvbjogKElOL09VVCkgUG9zaXRpb24gaW4gdGhlIGZpbGUKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICAgICBNNEVSUl9GSUxFX0lOVkFMSURfUE9TSVRJT046IHRoZSBwb3NpdGlvbiBjYW5ub3QgYmUgcmVhY2hlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlQ29tbW9uU2VlayhNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZSBzZWVrTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qIHBGaWxlUG9zKQotewotICAgIE00T1NBX0ZpbGVDb250ZXh0KiBwRmlsZUNvbnRleHQgPSBwQ29udGV4dDsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gZnBvc19jdXJyZW50OwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBmcG9zX3NlZWs7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uIGZwb3NfbnVsbCA9IDA7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uIGZwb3NfbmVnX3VuID0gLTE7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uIGZwb3NfZmlsZV9zaXplOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBmcG9zX3NlZWtfZnJvbV9iZWdpbm5pbmc7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMygiTTRPU0FfZmlsZUNvbW1vblNlZWtcdFx0TTRPU0FfQ29udGV4dCAweCV4XHQgTTRPU0FfRmlsZVNlZWtBY2Nlc3NNb2RlICVkXHRNNE9TQV9GaWxlUG9zaXRpb24qIDB4JXgiLAotICAgICAgICBwQ29udGV4dCwgc2Vla01vZGUsIHBGaWxlUG9zKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9maWxlQ29tbW9uU2VlayIpOwotICAgIE00T1NBX0RFQlVHX0lGMigwID09IHNlZWtNb2RlLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9maWxlQ29tbW9uU2VlayIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBGaWxlUG9zLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9maWxlQ29tbW9uU2VlayIpOwotCi0gICAgZnBvc19maWxlX3NpemUgPSBwRmlsZUNvbnRleHQtPmZpbGVfc2l6ZTsKLQotICAgIGlmKFNlZWtSZWFkID09IHBGaWxlQ29udGV4dC0+Y3VycmVudF9zZWVrKQotICAgIHsKLSAgICAgICAgZnBvc19jdXJyZW50ID0gcEZpbGVDb250ZXh0LT5yZWFkX3Bvc2l0aW9uOwotICAgIH0KLSAgICBlbHNlIGlmKFNlZWtXcml0ZSA9PSBwRmlsZUNvbnRleHQtPmN1cnJlbnRfc2VlaykKLSAgICB7Ci0gICAgICAgIGZwb3NfY3VycmVudCA9IHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb247Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGZwb3NfY3VycmVudCA9IDA7Ci0gICAgfQotCi0gICAgc3dpdGNoKHNlZWtNb2RlKQotICAgIHsKLSAgICBjYXNlIE00T1NBX2tGaWxlU2Vla0N1cnJlbnQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZwb3Nfc2VlayA9ICpwRmlsZVBvczsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgY2FzZSBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmc6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZwb3Nfc2VlayA9ICpwRmlsZVBvcyAtIGZwb3NfY3VycmVudDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgY2FzZSBNNE9TQV9rRmlsZVNlZWtFbmQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZwb3Nfc2VlayA9ICpwRmlsZVBvcyArIGZwb3NfZmlsZV9zaXplIC0gZnBvc19jdXJyZW50OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZnBvc19zZWVrX2Zyb21fYmVnaW5uaW5nID0gZnBvc19jdXJyZW50ICsgZnBvc19zZWVrOwotCi0gICAgaWYoZnNlZWsocEZpbGVDb250ZXh0LT5maWxlX2Rlc2MsIGZwb3Nfc2VlaywgU0VFS19DVVIpICE9IDApCi0gICAgewotICAgICAgICBzd2l0Y2goZXJybm8pCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBFSU5WQUw6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAvKiBtZWFuaW5nIHRoZSB2YWx1ZSBmb3Igb3JpZ2luIGlzIGludmFsaWQgb3IgdGhlIHBvc2l0aW9uCi0gICAgICAgICAgICAgICAgc3BlY2lmaWVkIGJ5IG9mZnNldCBpcyBiZWZvcmUgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSAqLwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9GSUxFX0lOVkFMSURfUE9TSVRJT047Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBFQkFERjoKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7LyogZmlsZSBoYW5kbGUgaXMgaW52YWxpZCAqLwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogU2V0IHRoZSByZXR1cm5lZCBwb3NpdGlvbiBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUgKi8KLSAgICAqcEZpbGVQb3MgPSBmcG9zX3NlZWtfZnJvbV9iZWdpbm5pbmc7Ci0KLSAgICAvKiBTRUVLIGRvbmUsIHJlc2V0IGVuZCBvZiBmaWxlIHZhbHVlICovCi0gICAgcEZpbGVDb250ZXh0LT5iX2lzX2VuZF9vZl9maWxlID0gTTRPU0FfRkFMU0U7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gYXNrcyB0byBjbG9zZSB0aGUgZmlsZSAoYXNzb2NpYXRlZCB0byB0aGUgY29udGV4dCkKLSAqIEBub3RlICAgICAgIFRoZSBjb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyL3dyaXRlciBpcyBmcmVlZC4KLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6IChJTi9PVVQpIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSByZWFkZXIKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1NNE9TQV9FUlIgTTRPU0FfZmlsZUNvbW1vbkNsb3NlKE00T1NBX1VJbnQxNiBjb3JlX2lkLCBNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00T1NBX0ZpbGVDb250ZXh0KiBwRmlsZUNvbnRleHQgPSBwQ29udGV4dDsKLSAgICBNNE9TQV9JbnQzMiBpMzJfZXJyX2NvZGU9MDsKLQotICAgIE00T1NBX1RSQUNFM18yKCJNNE9TQV9maWxlQ29tbW9uQ2xvc2VcdE00T1NBX1VJbnQxNiAlZFx0TTRPU0FfQ29udGV4dCAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlX2lkLCBwQ29udGV4dCk7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsCi0gICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX2ZpbGVDb21tb25DbG9zZTogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LCBNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlQ29tbW9uQ2xvc2U6IHNlbWFwaG9yZV9jb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICBmcmVlKHBGaWxlQ29udGV4dC0+dXJsX25hbWUpOwotICAgIHBGaWxlQ29udGV4dC0+dXJsX25hbWUgPSBNNE9TQV9OVUxMOwotCi0gICAgZnJlZShwRmlsZUNvbnRleHQtPmZpbGVfbmFtZSk7Ci0gICAgcEZpbGVDb250ZXh0LT5maWxlX25hbWUgPSBNNE9TQV9OVUxMOwotCi0gICAgaTMyX2Vycl9jb2RlID0gZmNsb3NlKHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjKTsKLQotICAgIHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjID0gTTRPU0FfTlVMTDsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9zZW1hcGhvcmVDbG9zZShwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsvKiBmcmVlIHRoZSBzZW1hcGhvcmUgKi8KLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICBmcmVlKHBGaWxlQ29udGV4dCk7Ci0KLSAgICBpZiAoaTMyX2Vycl9jb2RlICE9IDApCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX2ZpbGVDb21tb25DbG9zZSIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgdGhlIGZpbGUgYXR0cmlidXRlcyAoYXNzb2NpYXRlZCB0byB0aGUKLSAqICAgICAgICAgICAgIGNvbnRleHQpCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OiAoSU4pIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSByZWFkZXIKLSAqIEBwYXJhbSAgICAgIGF0dHJpYnV0ZTogKE9VVCkgVGhlIGZpbGUgYXR0cmlidXRlIChhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlcikKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVDb21tb25HZXRBdHRyaWJ1dGUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfRmlsZUF0dHJpYnV0ZSogcEF0dHJpYnV0ZSkKLXsKLQotICAgIE00T1NBX0ZpbGVDb250ZXh0KiBmaWxlQ29udGV4dCA9IHBDb250ZXh0OwotCi0gICAgc3RydWN0IHN0YXQgVGhlU3RhdDsKLQotICAgIE00T1NBX1RSQUNFM18yKCJNNE9TQV9maWxlQ29tbW9uR2V0QXR0cmlidXRlXHRNNE9TQV9Db250ZXh0IDB4JXhcdCIKLSAgICAgICAgIk00T1NBX0ZpbGVBdHRyaWJ1dGUqIDB4JXgiLCBwQ29udGV4dCwgcEF0dHJpYnV0ZSk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX2ZpbGVDb21tb25HZXRBdHRyaWJ1dGUiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQXR0cmlidXRlLCAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9maWxlQ29tbW9uR2V0QXR0cmlidXRlIik7Ci0KLSAgICBpZihzdGF0KChjaGFyKilmaWxlQ29udGV4dC0+dXJsX25hbWUsICZUaGVTdGF0KSAhPSAwKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV9maWxlQ29tbW9uR2V0QXR0cmlidXRlIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsKLSAgICB9Ci0KLSAgICBwQXR0cmlidXRlLT5jcmVhdGlvbkRhdGUudGltZSA9IChNNE9TQV9UaW1lKVRoZVN0YXQuc3RfY3RpbWU7Ci0gICAgcEF0dHJpYnV0ZS0+bGFzdEFjY2Vzc0RhdGUudGltZSA9IChNNE9TQV9UaW1lKVRoZVN0YXQuc3RfYXRpbWU7Ci0gICAgcEF0dHJpYnV0ZS0+bW9kaWZpZWREYXRlLnRpbWUgPSAoTTRPU0FfVGltZSlUaGVTdGF0LnN0X210aW1lOwotCi0gICAgcEF0dHJpYnV0ZS0+Y3JlYXRpb25EYXRlLnRpbWVTY2FsZSA9IDE7Ci0gICAgcEF0dHJpYnV0ZS0+bGFzdEFjY2Vzc0RhdGUudGltZVNjYWxlID0gMTsKLSAgICBwQXR0cmlidXRlLT5tb2RpZmllZERhdGUudGltZVNjYWxlID0gMTsKLQotICAgIHBBdHRyaWJ1dGUtPmNyZWF0aW9uRGF0ZS5yZWZlcmVuY2VZZWFyID0gMTk3MDsKLSAgICBwQXR0cmlidXRlLT5sYXN0QWNjZXNzRGF0ZS5yZWZlcmVuY2VZZWFyID0gMTk3MDsKLSAgICBwQXR0cmlidXRlLT5tb2RpZmllZERhdGUucmVmZXJlbmNlWWVhciA9IDE5NzA7Ci0KLSAgICBwQXR0cmlidXRlLT5tb2RlQWNjZXNzID0gZmlsZUNvbnRleHQtPmFjY2Vzc19tb2RlOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBnZXRzIHRoZSBmaWxlIFVSTCAoYXNzb2NpYXRlZCB0byB0aGUgY29udGV4dCkuCi0gKiBAbm90ZQotICogQHBhcmFtICAgICAgY29udGV4dDogKElOKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgICB1cmw6IChPVVQpIFRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgVVJMIChhbGxvY2F0ZWQgYnkKLSAqICAgICAgICAgICAgIE00T1NBX2ZpbGVDb21tb25HZXRVUkwpCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlQ29tbW9uR2V0VVJMKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX0NoYXIqKiBwVXJsKQotewotICAgIE00T1NBX0ZpbGVDb250ZXh0KiBwRmlsZUNvbnRleHQgPSBwQ29udGV4dDsKLSAgICBNNE9TQV9VSW50MzIgICAgdWlMZW5ndGg7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigiTTRPU0FfZmlsZUNvbW1vbkdldFVSTFx0TTRPU0FfQ29udGV4dCAweCV4XHRNNE9TQV9DaGFyKiogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LCBwVXJsKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZUNvbW1vbkdldFVSTDogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBVcmwsICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZUNvbW1vbkdldFVSTDogcFVybCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICB1aUxlbmd0aCA9IHN0cmxlbigoY29uc3QgY2hhciAqKXBGaWxlQ29udGV4dC0+dXJsX25hbWUpKzE7Ci0KLSAgICAvKiBBbGxvY2F0ZSB0aGUgbWVtb3J5IHRvIHN0b3JlIHRoZSB1cmxfbmFtZSAqLwotICAgICpwVXJsID0gKE00T1NBX0NoYXIqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyh1aUxlbmd0aCwgTTRPU0FfRklMRV9DT01NT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopIk00T1NBX2ZpbGVDb21tb25HZXRVUkw6IHVybCIpOwotICAgIGlmKE00T1NBX05VTEwgPT0gKnBVcmwpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9BTExPQywgIk00T1NBX2ZpbGVDb21tb25HZXRVUkwiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIE00T1NBX2Nock5Db3B5KCpwVXJsLCBwRmlsZUNvbnRleHQtPnVybF9uYW1lLCB1aUxlbmd0aCk7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gZ2V0cyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBmaWxlIG5hbWUgYXNzb2NpYXRlZAotICogICAgICAgICAgICAgdG8gdGhlIGlucHV0IFVSTC4KLSAqIEBub3RlICAgICAgIFRoZSB1c2VyIHNob3VsZCBub3QgZm9yZ2V0IHRvIGRlbGV0ZSB0aGUgb3V0cHV0IHN0cmluZyB1c2luZwotICogICAgICAgICAgICAgTTRPU0Ffc3RyRGVzdHJveQotICogQHBhcmFtICAgICAgcFVybDogICAgICAgICAgICAoSU4pIFRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgVVJMCi0gKiBAcGFyYW0gICAgICBwRmlsZU5hbWU6ICAgIChPVVQpIFRoZSBzdHJpbmcgY29udGFpbmluZyB0aGUgVVJMLiBJdCBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkIGluc2lkZSB0aGlzIGZ1bmN0aW9uCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEOiB0aGUgVVJMIGRvZXMgbm90IG1hdGNoIHdpdGggdGhlIHN1cHBvcnRlZAotICogICAgICAgICAgICAgZmlsZQotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlQ29tbW9uR2V0RmlsZW5hbWUoTTRPU0FfQ2hhciogcFVybCwgTTRPU0FfQ2hhcioqIHBGaWxlTmFtZSkKLXsKLSAgICBNNE9TQV9JbnQzMiBpICAgICAgICAgICAgPSAwOwotICAgIE00T1NBX0ludDMyIGlVcmxMZW4gICAgICAgID0gMDsKLSAgICBNNE9TQV9JbnQzMiBGaWxlTmFtZUxlbiA9IDA7Ci0KLSAgICBNNE9TQV9DaGFyKiBwdHJVcmwgICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9DaGFyKiBwdHJGaWxlbmFtZSAgICA9IE00T1NBX05VTEw7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigiTTRPU0FfZmlsZUNvbW1vbkdldFVSTFx0TTRPU0FfQ2hhciogJXNcdE00T1NBX0NoYXIqKiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBVcmwsIHBGaWxlTmFtZSk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwVXJsLCAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlQ29tbW9uR2V0RmlsZW5hbWU6IHBVcmwgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBGaWxlTmFtZSwgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVDb21tb25HZXRGaWxlbmFtZTogcEZpbGVOYW1lIGlzIE00T1NBX05VTEwiKTsKLQotICAgICpwRmlsZU5hbWUgPSBNNE9TQV9OVUxMOwotCi0gICAgLypQYXJzZSBVUkwqLwotICAgIGlVcmxMZW4gPSBzdHJsZW4oKGNvbnN0IGNoYXIgKilwVXJsKTsKLSAgICBmb3IoaT1pVXJsTGVuLTE7IGk+PTA7IGktLSkKLSAgICB7Ci0gICAgICAgIGlmIChwVXJsW2ldICE9ICdcXCcgJiYgcFVybFtpXSAhPSAnLycpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbGVOYW1lTGVuKys7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBicmVhazsgLyogZmluZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlIG5hbWUgKi8KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB0ckZpbGVuYW1lID0gKE00T1NBX0NoYXIqKSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoRmlsZU5hbWVMZW4rMSwgTTRPU0FfRklMRV9DT01NT04sCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikiTTRPU0FfZmlsZUNvbW1vbkdldEZpbGVuYW1lOiBGaWxlbmFtZSBzdHJpbmciKTsKLSAgICBpZiAocHRyRmlsZW5hbWUgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0FMTE9DLCAiTTRPU0FfZmlsZUNvbW1vbkdldEZpbGVuYW1lIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICBwdHJVcmwgPSBwVXJsICsgKGlVcmxMZW4gLSBGaWxlTmFtZUxlbik7Ci0gICAgTTRPU0FfY2hyTkNvcHkocHRyRmlsZW5hbWUsIHB0clVybCwgRmlsZU5hbWVMZW4rMSk7Ci0KLSAgICAqcEZpbGVOYW1lID0gcHRyRmlsZW5hbWU7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfRmlsZVJlYWRlci5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfRmlsZVJlYWRlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MGE3MmY1Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0ZpbGVSZWFkZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDU0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX0ZpbGVSZWFkZXIuYwotICogQGF1dGhvciAgICAgICBDZWRyaWMgTGVjb3V0cmUgKGNlZHJpYy5sZWNvdXRyZUBwaGlsaXBzLmNvbSkKLSAqICAgICAgICAgICAgICAgTGF1cmVudCBGYXkgKGxhdXJlbnQuZmF5QHBoaWxpcHMuY29tKQotICogQHBhciBPcmc6ICAgICBQaGlsaXBzIERpZ2l0YWwgU3lzdGVtcyBMYWJvcmF0b3JpZXMgLSBQYXJpcyAoUERTTC1QKQotICogQGJyaWVmICAgICAgICBGaWxlIHJlYWRlciBmb3IgQW5kcm9pZAotICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBmdW5jdGlvbnMgdG8gcmVhZCBhIGZpbGUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVDb21tb25fcHJpdi5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVSZWFkZXIuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlUmVhZGVyX3ByaXYuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSNpbmNsdWRlICJNNE9TQV9TZW1hcGhvcmUuaCIKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBvcGVucyB0aGUgcHJvdmlkZWQgVVJMIGFuZCByZXR1cm5zIGl0cyBjb250ZXh0LgotKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cmVkLCB0aGUgY29udGV4dCBpcyBzZXQgdG8gTlVMTC4KLSogQHBhcmFtICAgICAgY29udGV4dDogKE9VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgotKiBAcGFyYW0gICAgICB1cmw6IChJTikgVVJMIG9mIHRoZSBpbnB1dCBmaWxlCi0qIEBwYXJhbSAgICAgIGZpbGVNb2RlQWNjZXNzOiAoSU4pIEZpbGUgbW9kZSBhY2Nlc3MKLSogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotKiBAcmV0dXJuICAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQ6IHRoZSBVUkwgZG9lcyBub3QgbWF0Y2ggd2l0aCB0aGUgc3VwcG9ydGVkCi0qICAgICAgICAgICAgIGZpbGUKLSogQHJldHVybiAgICAgTTRFUlJfRklMRV9OT1RfRk9VTkQ6IHRoZSBmaWxlIGNhbm5vdCBiZSBmb3VuZAotKiBAcmV0dXJuICAgICBNNEVSUl9GSUxFX0xPQ0tFRDogdGhlIGZpbGUgaXMgbG9ja2VkIGJ5IGFuIG90aGVyCi0qICAgICAgICAgICAgIGFwcGxpY2F0aW9uL3Byb2Nlc3MKLSogQHJldHVybiAgICAgTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1M6IHRoZSBmaWxlIG1vZGUgYWNjZXNzIGlzIG5vdCBjb3JyZWN0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRPcGVuKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwRmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBmaWxlTW9kZUFjY2VzcykKLXsKLSAgICBNNE9TQV9UUkFDRTFfMygiTTRPU0FfZmlsZVJlYWRPcGVuIDogcEMgPSAweCVwICBmZCA9IDB4JXAgIG1vZGUgPSAlbHUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LCBwRmlsZURlc2NyaXB0b3IsIGZpbGVNb2RlQWNjZXNzKTsKLQotICAgIHJldHVybiBNNE9TQV9maWxlQ29tbW9uT3BlbihNNE9TQV9GSUxFX1JFQURFUiwgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGaWxlRGVzY3JpcHRvciwgZmlsZU1vZGVBY2Nlc3MpOwotfQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSAnc2l6ZScgYnl0ZXMgaW4gdGhlIGNvcmUgZmlsZSByZWFkZXIKLSogICAgICAgICAgICAgKHNlbGVjdGVkIGJ5IGl0cyAnY29udGV4dCcpIGFuZCB3cml0ZXMgdGhlIGRhdGEgdG8gdGhlICdkYXRhJwotKiAgICAgICAgICAgICBwb2ludGVyLgotKiBAbm90ZSAgICAgICBJZiAnc2l6ZScgYnl0ZSBjYW5ub3QgYmUgcmVhZCBpbiB0aGUgY29yZSBmaWxlIHJlYWRlciwgJ3NpemUnCi0qICAgICAgICAgICAgIHBhcmFtZXRlciBpcyB1cGRhdGVkIHRvIG1hdGNoIHRoZSBjb3JyZWN0Ci0qIEBub3RlICAgICAgIG51bWJlciBvZiByZWFkIGJ5dGVzLgotKiBAcGFyYW0gICAgICBjb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyCi0qIEBwYXJhbSAgICAgIGJ1ZmZlcjogKE9VVCkgRGF0YSBwb2ludGVyIG9mIHRoZSByZWFkIGRhdGEKLSogQHBhcmFtICAgICAgc2l6ZTogKElOL09VVCkgU2l6ZSBvZiB0aGUgZGF0YSB0byByZWFkIChpbiBieXRlcykKLSogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0qIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSogQHJldHVybiAgICAgTTRXQVJfTk9fREFUQV9ZRVQ6IHRoZXJlIGlzIG5vIGVub3VnaCBkYXRhIHRvIGZpbGwgdGhlICdkYXRhJwotKiAgICAgICAgICAgICBidWZmZXIsIHNvIHRoZSBzaXplIHBhcmFtZXRlciBoYXMgYmVlbiB1cGRhdGVkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkRGF0YShNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9NZW1BZGRyOCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiBwU2l6ZSkKLXsKLSAgICBNNE9TQV9GaWxlQ29udGV4dCogcEZpbGVDb250ZXh0ID0gcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfSW50MzIgICAgdWlTaXplUmVhZDsKLQotICAgIE00T1NBX1RSQUNFMl8yKCJNNE9TQV9maWxlUmVhZERhdGEgOiBkYXRhID0gMHglcCAgc2l6ZSA9ICVsdSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLCAoTTRPU0FfTlVMTCAhPSBwU2l6ZSkgPyAoKnBTaXplKSA6IDApOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWREYXRhOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gZGF0YSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWREYXRhOiBkYXRhIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU2l6ZSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlUmVhZERhdGE6IHBTaXplIGlzIE00T1NBX05VTEwiKTsKLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwKLSAgICAgIE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfZmlsZVJlYWREYXRhOiBzZW1hcGhvcmVfY29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgaWYoTTRPU0Ffa0Rlc2NSV0FjY2VzcyA9PSBwRmlsZUNvbnRleHQtPm1fRGVzY3JNb2RlQWNjZXNzKSAvKiByZWFkIHdyaXRlICovCi0gICAgewotICAgICAgICB1aVNpemVSZWFkID0gZnJlYWQoZGF0YSwgc2l6ZW9mKE00T1NBX0NoYXIpLCAqcFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZpbGVDb250ZXh0LT5maWxlX2Rlc2MpOwotICAgICAgICBpZigtMSA9PSB1aVNpemVSZWFkKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBoYW5kbGUgaXMgaW52YWxpZCwgb3IgdGhlIGZpbGUgaXMgbm90IG9wZW4gZm9yIHJlYWRpbmcsIG9yIHRoZSBmaWxlIGlzIGxvY2tlZCAqLwotICAgICAgICAgICAgKnBTaXplID0gMDsKLSAgICAgICAgICAgIGVyciA9IE00RVJSX0JBRF9DT05URVhUOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcEZpbGVDb250ZXh0LT5yZWFkX3Bvc2l0aW9uID0gcEZpbGVDb250ZXh0LT5yZWFkX3Bvc2l0aW9uICsgdWlTaXplUmVhZDsKLSAgICAgICAgICAgIGlmICgoTTRPU0FfVUludDMyKXVpU2l6ZVJlYWQgPCAqcFNpemUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBTaXplID0gdWlTaXplUmVhZDsKLSAgICAgICAgICAgICAgICAvKiBUaGlzIGlzIHRoZSBlbmQgb2YgZmlsZSAqLwotICAgICAgICAgICAgICAgIHBGaWxlQ29udGV4dC0+Yl9pc19lbmRfb2ZfZmlsZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRXQVJfTk9fREFUQV9ZRVQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBTaXplID0gdWlTaXplUmVhZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX3NlbWFwaG9yZVdhaXQocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICBpZihwRmlsZUNvbnRleHQtPmN1cnJlbnRfc2VlayAhPSBTZWVrUmVhZCkKLSAgICB7Ci0gICAgICAgIC8qIGZzZWVrIHRvIHRoZSBsYXN0IHJlYWQgcG9zaXRpb24gKi8KLSAgICAgICAgZXJyID0gTTRPU0FfZmlsZUNvbW1vblNlZWsocENvbnRleHQsIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocEZpbGVDb250ZXh0LT5yZWFkX3Bvc2l0aW9uKSk7Ci0gICAgICAgIGlmKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9ERUJVRyhlcnIsICJNNE9TQV9maWxlUmVhZERhdGE6IE00T1NBX2ZpbGVDb21tb25TZWVrIik7Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgICAgICAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIHBGaWxlQ29udGV4dC0+Y3VycmVudF9zZWVrID0gU2Vla1JlYWQ7Ci0gICAgfQotCi0gICAgLyogUmVhZCBkYXRhICovCi0gICAgdWlTaXplUmVhZCA9IGZyZWFkKGRhdGEsIHNpemVvZihNNE9TQV9DaGFyKSwgKnBTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjKTsKLSAgICBpZigtMSA9PSB1aVNpemVSZWFkKQotICAgIHsKLSAgICAgICAgLyogaGFuZGxlIGlzIGludmFsaWQsIG9yIHRoZSBmaWxlIGlzIG5vdCBvcGVuIGZvciByZWFkaW5nLAotICAgICAgICAgb3IgdGhlIGZpbGUgaXMgbG9ja2VkICovCi0gICAgICAgICpwU2l6ZSA9IDA7Ci0gICAgICAgIGVyciA9IE00RVJSX0JBRF9DT05URVhUOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwRmlsZUNvbnRleHQtPnJlYWRfcG9zaXRpb24gPSBwRmlsZUNvbnRleHQtPnJlYWRfcG9zaXRpb24gKyB1aVNpemVSZWFkOwotICAgICAgICBpZiAoKE00T1NBX1VJbnQzMil1aVNpemVSZWFkIDwgKnBTaXplKQotICAgICAgICB7Ci0gICAgICAgICAgICAqcFNpemUgPSB1aVNpemVSZWFkOwotCi0gICAgICAgICAgICAvKiBUaGlzIGlzIHRoZSBlbmQgb2YgZmlsZSAqLwotICAgICAgICAgICAgcEZpbGVDb250ZXh0LT5iX2lzX2VuZF9vZl9maWxlID0gTTRPU0FfVFJVRTsKLQotICAgICAgICAgICAgZXJyID0gTTRXQVJfTk9fREFUQV9ZRVQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAqcFNpemUgPSB1aVNpemVSZWFkOwotICAgICAgICB9Ci0gICAgfQotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0KLSAgICByZXR1cm4gZXJyOwotfQotCi0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIHNlZWtzIGF0IHRoZSBwcm92aWRlZCBwb3NpdGlvbiBpbiB0aGUgY29yZSBmaWxlCi0gKiAgICAgICAgICAgICByZWFkZXIgKHNlbGVjdGVkIGJ5IGl0cyAnY29udGV4dCcpLiBUaGUgcG9zaXRpb24gaXMgcmVsYXRlZCB0bwotICogICAgICAgICAgICAgdGhlIHNlZWtNb2RlIHBhcmFtZXRlciBpdCBjYW4gYmUgZWl0aGVyIGZyb20gdGhlIGJlZ2lubmluZywgZnJvbQotICogICAgICAgICAgICAgdGhlIGVuZCBvciBmcm9tIHRoZSBjdXJyZW50IHBvc3Rpb24uIFRvIHN1cHBvcnQgbGFyZ2UgZmlsZQotICogICAgICAgICAgICAgYWNjZXNzIChtb3JlIHRoYW4gMkdCeXRlcyksIHRoZSBwb3NpdGlvbiBpcyBwcm92aWRlZCBvbiBhIDY0Ci0gKiAgICAgICAgICAgICBiaXRzLgotICogQG5vdGUgICAgICAgSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIHRoZSBjdXJyZW50IHBvc2l0aW9uIHBvaW50ZXIKLSAqICAgICAgICAgICAgIGluIHRoZSBmaWxlIG11c3Qgbm90IGNoYW5nZS4gRWxzZSB0aGUgY3VycmVudAotICogICAgICAgICAgICAgcG9zaXRpb24gcG9pbnRlciBtdXN0IGJlIHVwZGF0ZWQuCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgICBzZWVrTW9kZTogKElOKSBTZWVrIGFjY2VzcyBtb2RlCi0gKiBAcGFyYW0gICAgICBwb3NpdGlvbjogKElOL09VVCkgUG9zaXRpb24gaW4gdGhlIGZpbGUKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICAgICBNNEVSUl9GSUxFX0lOVkFMSURfUE9TSVRJT046IHRoZSBwb3NpdGlvbiBjYW5ub3QgYmUgcmVhY2hlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkU2VlayhNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGUgc2Vla01vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiogcFBvc2l0aW9uKQotewotICAgIE00T1NBX0ZpbGVDb250ZXh0KiBwRmlsZUNvbnRleHQgPSAoTTRPU0FfRmlsZUNvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMigiTTRPU0FfZmlsZVJlYWRTZWVrIDogbW9kZSA9ICVkICBwb3MgPSAlbHUiLCBzZWVrTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocFBvc2l0aW9uICE9IE00T1NBX05VTEwpID8gKCpwUG9zaXRpb24pIDogMCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlUmVhZFNlZWs6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoMCA9PSBzZWVrTW9kZSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlUmVhZFNlZWs6IHNlZWtNb2RlIGlzIDAiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwUG9zaXRpb24sIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlUmVhZFNlZWs6IHBQb3NpdGlvbiBpcyBNNE9TQV9OVUxMIik7Ci0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsCi0gICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX2ZpbGVSZWFkU2Vlazogc2VtYXBob3JlX2NvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgIGlmIChNNE9TQV9rRGVzY1JXQWNjZXNzID09IHBGaWxlQ29udGV4dC0+bV9EZXNjck1vZGVBY2Nlc3MpCi0gICAgewotICAgICAgICAgTTRPU0FfVUludDMyICAgIFNlZWtNb2RlT3B0aW9uOwotICAgICAgICAgLyogR28gdG8gdGhlIGRlc2lyZWQgcG9zaXRpb24gKi8KLSAgICAgICAgaWYgKE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZyA9PSBzZWVrTW9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgU2Vla01vZGVPcHRpb24gPSBTRUVLX1NFVDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChNNE9TQV9rRmlsZVNlZWtFbmQgPT0gc2Vla01vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNlZWtNb2RlT3B0aW9uID0gU0VFS19FTkQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoTTRPU0Ffa0ZpbGVTZWVrQ3VycmVudCA9PSBzZWVrTW9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgU2Vla01vZGVPcHRpb24gPSBTRUVLX0NVUjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE9TQV9maWxlUmVhZFNlZWs6IEVORCBXSVRIIEVSUk9SICEhISAoQ09OVkVSSU9OIEVSUk9SIEZPUiBUSEUgU0VFSyBNT0RFKSIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHbyB0byB0aGUgZGVzaXJlZCBwb3NpdGlvbiAqLwotICAgICAgICBlcnIgPSBmc2VlayhwRmlsZUNvbnRleHQtPmZpbGVfZGVzYywgKnBQb3NpdGlvbiwgU2Vla01vZGVPcHRpb24pOwotICAgICAgICBpZihlcnIgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgLyogY29udmVydHMgdGhlIGVycm9yIHRvIFBTVyBmb3JtYXQqLwotICAgICAgICAgICAgZXJyPSgoTTRPU0FfVUludDMyKShNNF9FUlIpPDwzMCkrKCgoTTRPU0FfRklMRV9XUklURVIpJjB4MDAzRkZGKTw8MTYpKyhNNE9TQV9JbnQxNikoZXJyKTsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9GaWxlUmVhZFNlZWsgZXJyb3I6JXgiLGVycik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFJldHVybiB3aXRob3V0IGVycm9yICovCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0Ffc2VtYXBob3JlV2FpdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgIGlmKHBGaWxlQ29udGV4dC0+Y3VycmVudF9zZWVrICE9IFNlZWtSZWFkKQotICAgIHsKLQotICAgICAgICAvKiBmc2VlayB0byB0aGUgbGFzdCByZWFkIHBvc2l0aW9uICovCi0gICAgICAgIGVyciA9IE00T1NBX2ZpbGVDb21tb25TZWVrKHBDb250ZXh0LCBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBGaWxlQ29udGV4dC0+cmVhZF9wb3NpdGlvbikpOwotICAgICAgICBpZihNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfREVCVUcoZXJyLCAiTTRPU0FfZmlsZVJlYWREYXRhOiBNNE9TQV9maWxlQ29tbW9uU2VlayIpOwotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgICAgICAgICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBwRmlsZUNvbnRleHQtPmN1cnJlbnRfc2VlayA9IFNlZWtSZWFkOwotICAgIH0KLQotICAgIGVyciA9IE00T1NBX2ZpbGVDb21tb25TZWVrKHBDb250ZXh0LCBzZWVrTW9kZSwgcFBvc2l0aW9uKTsKLSAgICBpZihNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHKGVyciwgIk00T1NBX2ZpbGVSZWFkRGF0YTogTTRPU0FfZmlsZUNvbW1vblNlZWsiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEZpbGVDb250ZXh0LT5yZWFkX3Bvc2l0aW9uID0gKnBQb3NpdGlvbjsKLSAgICB9Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICByZXR1cm4gZXJyOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBhc2tzIHRoZSBjb3JlIGZpbGUgcmVhZGVyIHRvIGNsb3NlIHRoZSBmaWxlCi0gKiAgICAgICAgICAgICAoYXNzb2NpYXRlZCB0byB0aGUgY29udGV4dCkuCi0gKiBAbm90ZSAgICAgICBUaGUgY29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlciBpcyBmcmVlZC4KLSAqIEBwYXJhbSAgICAgIHBDb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlUmVhZENsb3NlKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTRPU0FfRmlsZUNvbnRleHQqIHBGaWxlQ29udGV4dCA9IChNNE9TQV9GaWxlQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfZmlsZVJlYWRDbG9zZSA6IHBDID0gMHglcCIsIHBDb250ZXh0KTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWRDbG9zZTogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgaWYoTTRPU0FfRklMRV9XUklURVIgPT0gcEZpbGVDb250ZXh0LT5jb3JlSURfd3JpdGUpCi0gICAgewotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTRPU0FfZmlsZUNvbW1vbkNsb3NlKE00T1NBX0ZJTEVfUkVBREVSLCBwQ29udGV4dCk7Ci19Ci0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBhc2tzIHRoZSBjb3JlIGZpbGUgcmVhZGVyIHRvIHJldHVybiB0aGUgdmFsdWUKLSAqICAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3B0aW9uSUQuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yCi0gKiAgICAgICAgICAgICBhbGxvY2F0aW5nL2RlLWFsbG9jYXRpbmcgdGhlIG1lbW9yeSBvZiB0aGUgdmFsdWUgZmllbGQuCi0gKiBAbm90ZSAgICAgICAndmFsdWUnIG11c3QgYmUgY2FzdCBhY2NvcmRpbmcgdG8gdGhlIHR5cGUgcmVsYXRlZCB0byB0aGUKLSAqICAgICAgICAgICAgIG9wdGlvbklEIEFzIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yCi0gKiAgICAgICAgICAgICBhbGxvY2F0aW5nL2RlLWFsbG9jYXRpbmcgdGhlICd2YWx1ZScgZmllbGQsIHRoZSBjYWxsZWUgbXVzdCBjb3B5Ci0gKiAgICAgICAgICAgICB0aGlzIGZpZWxkIHRvIGl0cyBpbnRlcm5hbCB2YXJpYWJsZS4KLSAqIEBwYXJhbSAgICAgIHBDb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgICBwT3B0aW9uSUQ6IChJTikgSUQgb2YgdGhlIG9wdGlvbgotICogQHBhcmFtICAgICAgcE9wdGlvblZhbHVlOiAoT1VUKSBWYWx1ZSBvZiB0aGUgb3B0aW9uCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfQkFEX09QVElPTl9JRDogdGhlIG9wdGlvbklEIGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfV1JJVEVfT05MWTogdGhpcyBvcHRpb24gaXMgYSB3cml0ZSBvbmx5IG9uZQotICogQHJldHVybiAgICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEOiB0aGlzIG9wdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRHZXRPcHRpb24oTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfRmlsZVJlYWRPcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uKiBwT3B0aW9uVmFsdWUpCi17Ci0gICAgTTRPU0FfRmlsZUNvbnRleHQqIHBGaWxlQ29udGV4dCA9IHBDb250ZXh0OwotCi0gICAgTTRPU0FfVFJBQ0UyXzEoIk00T1NBX2ZpbGVSZWFkR2V0T3B0aW9uIDogb3B0aW9uID0gMHgleCIsIG9wdGlvbklEKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlUmVhZEdldE9wdGlvbjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihvcHRpb25JRCA9PSAwLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlUmVhZEdldE9wdGlvbjogb3B0aW9uSUQgaXMgMCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBPcHRpb25WYWx1ZSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlUmVhZEdldE9wdGlvbjogcE9wdGlvblZhbHVlIGlzIE00T1NBX05VTEwiKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMighTTRPU0FfT1BUSU9OX0lEX0lTX0NPUkVJRChvcHRpb25JRCwgTTRPU0FfRklMRV9SRUFERVIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfT1BUSU9OX0lELCAiTTRPU0FfZmlsZVJlYWRHZXRPcHRpb24iKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoIU00T1NBX09QVElPTl9JRF9JU19SRUFEQUJMRShvcHRpb25JRCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX1dSSVRFX09OTFksICJNNE9TQV9maWxlUmVhZEdldE9wdGlvbiIpOwotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlUmVhZEdldE9wdGlvbjogc2VtYXBob3JlX2NvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgIHN3aXRjaChvcHRpb25JRCkKLSAgICB7Ci0jaWYoTTRPU0FfT1BUSU9OSURfRklMRV9SRUFEX0dFVF9GSUxFX1BPU0lUSU9OID09IE00T1NBX1RSVUUpCi0gICAgY2FzZSBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlUG9zaXRpb246Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiogcFBvc2l0aW9uID0gKE00T1NBX0ZpbGVQb3NpdGlvbiopcE9wdGlvblZhbHVlOwotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgICAgICAgICAgTTRPU0Ffc2VtYXBob3JlV2FpdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgICAgICAgICAgKnBQb3NpdGlvbiA9IHBGaWxlQ29udGV4dC0+cmVhZF9wb3NpdGlvbjsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfRklMRV9SRUFEX0dFVF9GSUxFX1BPU0lUSU9OKi8KLQotI2lmKE00T1NBX09QVElPTklEX0ZJTEVfUkVBRF9JU19FT0YgPT0gTTRPU0FfVFJVRSkKLSAgICBjYXNlIE00T1NBX2tGaWxlUmVhZElzRU9GOgotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9Cb29sKiBiSXNFbmRPZkZpbGUgPSAoTTRPU0FfQm9vbCopcE9wdGlvblZhbHVlOwotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgICAgICAgICAgTTRPU0Ffc2VtYXBob3JlV2FpdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgICAgICAgICAgKmJJc0VuZE9mRmlsZSA9IHBGaWxlQ29udGV4dC0+Yl9pc19lbmRfb2ZfZmlsZTsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfRklMRV9SRUFEX0lTX0VPRiovCi0KLQotI2lmKE00T1NBX09QVElPTklEX0ZJTEVfUkVBRF9HRVRfRklMRV9TSVpFID09IE00T1NBX1RSVUUpCi0gICAgY2FzZSBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlU2l6ZToKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwUG9zaXRpb24gPSAoTTRPU0FfRmlsZVBvc2l0aW9uKilwT3B0aW9uVmFsdWU7Ci0gICAgICAgICAgICBNNE9TQV9JbnQzMiBpU2F2ZVBvcyAgICA9IDA7Ci0gICAgICAgICAgICBNNE9TQV9JbnQzMiBpU2l6ZSAgICAgICAgPSAwOwotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgICAgICAgICAgTTRPU0Ffc2VtYXBob3JlV2FpdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBCdWdmaXg6IHVwZGF0ZSB0aGUgZmlsZSBzaXplLgotICAgICAgICAgICAgKiBXaGVuIGEgZmlsZSBpcyBpbiByZWFkIG1vZGUsIG1heSBiZSBhbm90aGVyIGFwcGxpY2F0aW9uIGlzIHdyaXRpbmcgaW4uCi0gICAgICAgICAgICAqIFNvLCB3ZSBoYXZlIHRvIHVwZGF0ZSB0aGUgZmlsZSBzaXplICovCi0gICAgICAgICAgICBpU2F2ZVBvcyA9IGZ0ZWxsKHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjKTsgICAgICAgICAgICAvKjEtIENoZWNrIHRoZSBmaXJzdCBwb3NpdGlvbiAqLwotICAgICAgICAgICAgZnNlZWsocEZpbGVDb250ZXh0LT5maWxlX2Rlc2MsIDAsIFNFRUtfRU5EKTsgICAgICAgIC8qMi0gR28gdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSAqLwotICAgICAgICAgICAgaVNpemUgPSBmdGVsbChwRmlsZUNvbnRleHQtPmZpbGVfZGVzYyk7ICAgICAgICAgICAgICAgIC8qMy0gQ2hlY2sgdGhlIGZpbGUgc2l6ZSovCi0gICAgICAgICAgICBmc2VlayhwRmlsZUNvbnRleHQtPmZpbGVfZGVzYywgaVNhdmVQb3MsIFNFRUtfU0VUKTsgICAgLyo0LSBnbyB0byB0aGUgZmlyc3QgcG9zaXRpb24qLwotICAgICAgICAgICAgcEZpbGVDb250ZXh0LT5maWxlX3NpemUgPSBpU2l6ZTsKLQotICAgICAgICAgICAgKnBQb3NpdGlvbiA9IHBGaWxlQ29udGV4dC0+ZmlsZV9zaXplOwotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgICAgICAgICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICB9Ci0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9GSUxFX1JFQURfR0VUX0ZJTEVfU0laRSovCi0KLSNpZihNNE9TQV9PUFRJT05JRF9GSUxFX1JFQURfR0VUX0ZJTEVfQVRUUklCVVRFID09IE00T1NBX1RSVUUpCi0gICAgY2FzZSBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlQXR0cmlidXRlOgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRPU0FfZmlsZUNvbW1vbkdldEF0dHJpYnV0ZShwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ZpbGVBdHRyaWJ1dGUqKXBPcHRpb25WYWx1ZSk7Ci0gICAgICAgIH0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX0ZJTEVfUkVBRF9HRVRfRklMRV9BVFRSSUJVVEUqLwotCi0jaWYoTTRPU0FfT1BUSU9OSURfRklMRV9SRUFEX0dFVF9VUkwgPT0gTTRPU0FfVFJVRSkKLSAgICBjYXNlIE00T1NBX2tGaWxlUmVhZEdldFVSTDoKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE00T1NBX2ZpbGVDb21tb25HZXRVUkwocENvbnRleHQsIChNNE9TQV9DaGFyKiopcE9wdGlvblZhbHVlKTsKLSAgICAgICAgfQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfRklMRV9SRUFEX0dFVF9VUkwqLwotCi0gICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVSZWFkTG9ja01vZGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgICooTTRPU0FfVUludDMyKilwT3B0aW9uVmFsdWUgPSBwRmlsZUNvbnRleHQtPm1fdWlMb2NrTW9kZTsKLSAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgTTRPU0FfREVCVUcoTTRFUlJfTk9UX0lNUExFTUVOVEVELCAiTTRPU0FfZmlsZVJlYWRHZXRPcHRpb24iKTsKLQotICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZuICAgICAgICAgTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkU2V0T3B0aW9uIChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSUQsIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpKQotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBhc2tzIHRoZSBjb3JlIGZpbGUgcmVhZGVyIHRvIHNldCB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcHRpb25JRC4KLSAqICAgICAgICAgICAgIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcvZGUtYWxsb2NhdGluZyB0aGUgbWVtb3J5IG9mIHRoZSB2YWx1ZSBmaWVsZC4KLSAqIEBub3RlICAgICAgIEFzIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcvZGUtYWxsb2NhdGluZyB0aGUgJ3ZhbHVlJyBmaWVsZCwgdGhlIGNhbGxlZSBtdXN0IGNvcHkgdGhpcyBmaWVsZAotICogICAgICAgICAgICAgdG8gaXRzIGludGVybmFsIHZhcmlhYmxlLgotICogQHBhcmFtICAgICAgcENvbnRleHQ6IChJTi9PVVQpIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSByZWFkZXIKLSAqIEBwYXJhbSAgICAgIG9wdGlvbklEOiAoSU4pIElEIG9mIHRoZSBvcHRpb24KLSAqIEBwYXJhbSAgICAgIHZhbHVlOiAoSU4pIFZhbHVlIG9mIHRoZSBvcHRpb24KLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfT1BUSU9OX0lEOiB0aGUgb3B0aW9uSUQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9SRUFEX09OTFk6IHRoaXMgb3B0aW9uIGlzIGEgcmVhZCBvbmx5IG9uZQotICogQHJldHVybiAgICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEOiB0aGlzIG9wdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRTZXRPcHRpb24oTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZE9wdGlvbklEIG9wdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpCi17Ci0gICAgTTRPU0FfRmlsZUNvbnRleHQqIHBGaWxlQ29udGV4dCA9IHBDb250ZXh0OwotCi0gICAgTTRPU0FfVFJBQ0UyXzEoIk00T1NBX2ZpbGVSZWFkU2V0T3B0aW9uIDogb3B0aW9uID0gMHgleCIsIG9wdGlvbklEKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlUmVhZFNldE9wdGlvbjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigwID09IG9wdGlvbklELCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlUmVhZFNldE9wdGlvbiIpOwotICAgIE00T1NBX0RFQlVHX0lGMighTTRPU0FfT1BUSU9OX0lEX0lTX0NPUkVJRChvcHRpb25JRCwgTTRPU0FfRklMRV9SRUFERVIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfT1BUSU9OX0lELCAiTTRPU0FfZmlsZVJlYWRTZXRPcHRpb24iKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMighTTRPU0FfT1BUSU9OX0lEX0lTX1dSSVRBQkxFKG9wdGlvbklEKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX1JFQURfT05MWSwgIk00T1NBX2ZpbGVSZWFkU2V0T3B0aW9uIik7Ci0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVSZWFkU2V0T3B0aW9uOiBzZW1hcGhvcmVfY29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgc3dpdGNoKG9wdGlvbklEKQotICAgIHsKLSAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVJlYWRMb2NrTW9kZToKLSAgICAgICAgewotICAgICAgICAgICAgcEZpbGVDb250ZXh0LT5tX3VpTG9ja01vZGU9IChNNE9TQV9VSW50MzIpKihNNE9TQV9VSW50MzIqKW9wdGlvblZhbHVlOwotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX05PVF9JTVBMRU1FTlRFRCwgIk00T1NBX2ZpbGVSZWFkU2V0T3B0aW9uIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfRmlsZVdyaXRlci5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfRmlsZVdyaXRlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzN2ZjMTczLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0ZpbGVXcml0ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDU3NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyLmMKLSAqIEBicmllZiAgICAgICAgRmlsZSB3cml0ZXIgZm9yIEFuZHJvaWQKLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb25zIHRvIHdyaXRlIGluIGEgZmlsZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVDb21tb25fcHJpdi5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVXcml0ZXIuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlV3JpdGVyX3ByaXYuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSNpbmNsdWRlICJNNE9TQV9TZW1hcGhvcmUuaCIKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBvcGVucyB0aGUgcHJvdmlkZWQgVVJMIGFuZCByZXR1cm5zIGl0cyBjb250ZXh0LgotICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJlZCwgdGhlIGNvbnRleHQgaXMgc2V0IHRvIE5VTEwuCi0gKiBAcGFyYW0gICAgICBwQ29udGV4dDogKE9VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHdyaXRlcgotICogQHBhcmFtICAgICAgcFVybDogKElOKSBVUkwgb2YgdGhlIGlucHV0IGZpbGUKLSAqIEBwYXJhbSAgICAgIGZpbGVNb2RlQWNjZXNzOiAoSU4pIEZpbGUgbW9kZSBhY2Nlc3MKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICogQHJldHVybiAgICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEOiB0aGUgVVJMIGRvZXMgbm90IG1hdGNoIHdpdGggdGhlIHN1cHBvcnRlZAotICogICAgICAgICAgICAgZmlsZQotICogQHJldHVybiAgICAgTTRFUlJfRklMRV9OT1RfRk9VTkQ6IHRoZSBmaWxlIGNhbm5vdCBiZSBmb3VuZAotICogQHJldHVybiAgICAgTTRFUlJfRklMRV9MT0NLRUQ6IHRoZSBmaWxlIGlzIGxvY2tlZCBieSBhbiBvdGhlcgotICogICAgICAgICAgICAgYXBwbGljYXRpb24vcHJvY2VzcwotICogQHJldHVybiAgICAgTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1M6IHRoZSBmaWxlIG1vZGUgYWNjZXNzIGlzIG5vdCBjb3JyZWN0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZU9wZW4oTTRPU0FfQ29udGV4dCogcENvbnRleHQsIE00T1NBX1ZvaWQqIHBVcmwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgZmlsZU1vZGVBY2Nlc3MpCi17Ci0gICAgTTRPU0FfVFJBQ0UxXzMoIk00T1NBX2ZpbGVXcml0ZU9wZW4gOiBwQyA9IDB4JXAgIGZkID0gMHglcCAgbW9kZSA9ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LCBwVXJsLCBmaWxlTW9kZUFjY2Vzcyk7Ci0KLSAgICByZXR1cm4gTTRPU0FfZmlsZUNvbW1vbk9wZW4oTTRPU0FfRklMRV9XUklURVIsIHBDb250ZXh0LCBwVXJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTW9kZUFjY2Vzcyk7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIHdyaXRlcyB0aGUgJ3NpemUnIGJ5dGVzIHN0b3JlZCBhdCAnZGF0YScgbWVtb3J5Ci0gKiAgICAgICAgICAgICBpbiB0aGUgZmlsZSBzZWxlY3RlZCBieSBpdHMgY29udGV4dC4KLSAqIEBub3RlICAgICAgIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcvZGUtYWxsb2NhdGluZyB0aGUKLSAqICAgICAgICAgICAgIG1lbW9yeSBmb3IgJ2RhdGEnIHBhcmFtZXRlci4KLSAqIEBub3RlICAgICAgIE1vcmVvdmVyIHRoZSBkYXRhIHBvaW50ZXIgbXVzdCBiZSBhbGxvY2F0ZWQgdG8gc3RvcmUgYXQgbGVhc3QKLSAqICAgICAgICAgICAgICdzaXplJyBieXRlcy4KLSAqIEBwYXJhbSAgICAgIHBDb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgICBidWZmZXI6IChJTikgRGF0YSBwb2ludGVyIG9mIHRoZSB3cml0ZSBkYXRhCi0gKiBAcGFyYW0gICAgICBzaXplOiAoSU4pIFNpemUgb2YgdGhlIGRhdGEgdG8gd3JpdGUgKGluIGJ5dGVzKQotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlRGF0YShNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9NZW1BZGRyOCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpU2l6ZSkKLXsKLSAgICBNNE9TQV9GaWxlQ29udGV4dCogcEZpbGVDb250ZXh0ID0gcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9VSW50MzIgdWlTaXplV3JpdGU7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMigiTTRPU0FfZmlsZVdyaXRlRGF0YSA6IGRhdGEgPSAweCVwICBzaXplID0gJWx1IiwgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpU2l6ZSk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZURhdGE6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBkYXRhLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZURhdGE6IGRhdGEgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigwID09IHVpU2l6ZSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlRGF0YTogdWlTaXplIGlzIDAiKTsKLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlRGF0YTogc2VtYXBob3JlX2NvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgIGlmIChNNE9TQV9rRGVzY1JXQWNjZXNzID09IHBGaWxlQ29udGV4dC0+bV9EZXNjck1vZGVBY2Nlc3MpCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgICAgV3JpdGVTaXplOwotICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICBXcml0ZVNpemUgPSBmd3JpdGUoKHZvaWQgKilkYXRhLDEsIHVpU2l6ZSwgcEZpbGVDb250ZXh0LT5maWxlX2Rlc2MpOwotICAgICAgICBpZihXcml0ZVNpemUgIT0gdWlTaXplKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBjb252ZXJ0cyB0aGUgZXJyb3IgdG8gUFNXIGZvcm1hdCovCi0gICAgICAgICAgICBlcnIgPSAoKE00T1NBX1VJbnQzMikoTTRfRVJSKTw8MzApKygoKE00T1NBX0ZJTEVfV1JJVEVSKSYweDAwM0ZGRik8PDE2KSsoTTRPU0FfSW50MTYpKFdyaXRlU2l6ZSk7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfRmlsZVdyaXRlRGF0YSBlcnJvcjoleCIsZXJyKTsKLSAgICAgICAgfQotICAgICAgICBmZmx1c2gocEZpbGVDb250ZXh0LT5maWxlX2Rlc2MpOwotCi0gICAgICAgIHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb24gPSBwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uICsgV3JpdGVTaXplOwotCi0gICAgICAgIC8qIFVwZGF0ZSB0aGUgZmlsZSBzaXplICovCi0gICAgICAgIGlmKHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb24gPiBwRmlsZUNvbnRleHQtPmZpbGVfc2l6ZSkKLSAgICAgICAgewotICAgICAgICAgICAgcEZpbGVDb250ZXh0LT5maWxlX3NpemUgPSBwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX3NlbWFwaG9yZVdhaXQocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICBpZihwRmlsZUNvbnRleHQtPmN1cnJlbnRfc2VlayAhPSBTZWVrV3JpdGUpCi0gICAgewotICAgICAgICAvKiBmc2VlayB0byB0aGUgbGFzdCByZWFkIHBvc2l0aW9uICovCi0gICAgICAgIGVyciA9IE00T1NBX2ZpbGVDb21tb25TZWVrKHBDb250ZXh0LCBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcsCi0gICAgICAgICAgICAmKHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb24pKTsKLQotICAgICAgICBpZihNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgewotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotICAgICAgICAgICAgTTRPU0FfREVCVUcoZXJyLCAiTTRPU0FfZmlsZVdyaXRlRGF0YTogTTRPU0FfZmlsZUNvbW1vblNlZWsiKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBwRmlsZUNvbnRleHQtPmN1cnJlbnRfc2VlayA9IFNlZWtXcml0ZTsKLSAgICB9Ci0KLSAgICAvKiBXcml0ZSBkYXRhICovCi0gICAgdWlTaXplV3JpdGUgPSBmd3JpdGUoZGF0YSwgc2l6ZW9mKE00T1NBX0NoYXIpLCB1aVNpemUsIHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjKTsKLQotICAgIGlmKHVpU2l6ZVdyaXRlID09IChNNE9TQV9VSW50MzIpLTEpCi0gICAgewotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICAgICAgLyogQW4gZXJyb3Igb2NjdXJlZCAqLwotCi0gICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfZmlsZVdyaXRlRGF0YTogZndyaXRlIGZhaWxlZCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7Ci0gICAgfQotCi0gICAgcEZpbGVDb250ZXh0LT53cml0ZV9wb3NpdGlvbiA9IHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb24gKyB1aVNpemVXcml0ZTsKLQotICAgIC8qIFVwZGF0ZSB0aGUgZmlsZSBzaXplICovCi0gICAgaWYocEZpbGVDb250ZXh0LT53cml0ZV9wb3NpdGlvbiA+IHBGaWxlQ29udGV4dC0+ZmlsZV9zaXplKQotICAgIHsKLSAgICAgICAgcEZpbGVDb250ZXh0LT5maWxlX3NpemUgPSBwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uOwotICAgIH0KLQotICAgIGlmKChNNE9TQV9VSW50MzIpdWlTaXplV3JpdGUgPCB1aVNpemUpCi0gICAgewotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQUxMT0MsICJNNE9TQV9maWxlV3JpdGVEYXRhIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gc2Vla3MgYXQgdGhlIHByb3ZpZGVkIHBvc2l0aW9uIGluIHRoZSBjb3JlIGZpbGUKLSAqICAgICAgICAgICAgIHdyaXRlciAoc2VsZWN0ZWQgYnkgaXRzICdjb250ZXh0JykuIFRoZSBwb3NpdGlvbiBpcyByZWxhdGVkIHRvCi0gKiAgICAgICAgICAgICB0aGUgc2Vla01vZGUgcGFyYW1ldGVyIGl0IGNhbiBiZSBlaXRoZXIgZnJvbSB0aGUgYmVnaW5uaW5nLAotICogICAgICAgICAgICAgZnJvbSB0aGUgZW5kIG9yIGZyb20gdGhlIGN1cnJlbnQgcG9zdGlvbi4gVG8gc3VwcG9ydCBsYXJnZSBmaWxlCi0gKiAgICAgICAgICAgICBhY2Nlc3MgKG1vcmUgdGhhbiAyR0J5dGVzKSwgdGhlIHBvc2l0aW9uIGlzIHByb3ZpZGVkIG9uIGEgNjQKLSAqICAgICAgICAgICAgIGJpdHMuCi0gKiBAbm90ZSAgICAgICBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgdGhlIGN1cnJlbnQgcG9zaXRpb24gcG9pbnRlcgotICogICAgICAgICAgICAgaW4gdGhlIGZpbGUgbXVzdCBub3QgY2hhbmdlLiBFbHNlIHRoZSBjdXJyZW50IHBvc2l0aW9uIHBvaW50ZXIKLSAqICAgICAgICAgICAgIG11c3QgYmUgdXBkYXRlZC4KLSAqIEBwYXJhbSAgICAgIHBDb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgICBzZWVrTW9kZTogKElOKSBTZWVrIGFjY2VzcyBtb2RlCi0gKiBAcGFyYW0gICAgICBwb3NpdGlvbjogKElOL09VVCkgUG9zaXRpb24gaW4gdGhlIGZpbGUKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICAgICBNNEVSUl9GSUxFX0lOVkFMSURfUE9TSVRJT046IHRoZSBwb3NpdGlvbiBjYW5ub3QgYmUgcmVhY2hlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlV3JpdGVTZWVrKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZSBzZWVrTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiogcFBvc2l0aW9uKQotewotICAgIE00T1NBX0ZpbGVDb250ZXh0KiBwRmlsZUNvbnRleHQgPSAoTTRPU0FfRmlsZUNvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMigiTTRPU0FfZmlsZVdyaXRlU2VlayA6IG1vZGUgPSAlZCAgcG9zID0gJWx1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlZWtNb2RlLCAoTTRPU0FfTlVMTCAhPSBwUG9zaXRpb24pID8gKCpwUG9zaXRpb24pIDogMCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZVNlZWs6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoMCA9PSBzZWVrTW9kZSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZVNlZWs6IHNlZW1Nb2RlIGlzIDAiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwUG9zaXRpb24sIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZVNlZWs6IHBQb3NpdGlvbiBpcyBNNE9TQV9OVUxMIik7Ci0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsIE00RVJSX0JBRF9DT05URVhULAotICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZVNlZWs6IHNlbWFwaG9yZV9jb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICBpZiAoTTRPU0Ffa0Rlc2NSV0FjY2VzcyA9PSBwRmlsZUNvbnRleHQtPm1fRGVzY3JNb2RlQWNjZXNzKSAvKiByZWFkIHdyaXRlICovCi0gICAgewotICAgICAgICAgTTRPU0FfVUludDMyICAgIFNlZWtNb2RlT3B0aW9uOwotICAgICAgICAvKlRoZSBwb3NpdGlvbiBmb3IgdGhlIHNlZWsgbW9kZSBiZXR3ZWVuIHRoZSBTSFAgYW5kIHRoZSBPU0FsIHBhcnQgYXJlIGRpZmZlcmVudCAqLwotICAgICAgICBpZiAoTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nID09IHNlZWtNb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBTZWVrTW9kZU9wdGlvbiA9IFNFRUtfU0VUOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKE00T1NBX2tGaWxlU2Vla0VuZCA9PSBzZWVrTW9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgU2Vla01vZGVPcHRpb24gPSBTRUVLX0VORDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChNNE9TQV9rRmlsZVNlZWtDdXJyZW50ID09IHNlZWtNb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBTZWVrTW9kZU9wdGlvbiA9IFNFRUtfQ1VSOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00T1NBX2ZpbGVXcml0ZVNlZWs6IEVORCBXSVRIIEVSUk9SICEhISAoQ09OVkVSSU9OIEVSUk9SIEZPUiBUSEUgU0VFSyBNT0RFKSAiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR28gdG8gdGhlIGRlc2lyZWQgcG9zaXRpb24gKi8KLSAgICAgICAgZXJyID0gZnNlZWsocEZpbGVDb250ZXh0LT5maWxlX2Rlc2MsKnBQb3NpdGlvbixTZWVrTW9kZU9wdGlvbik7Ci0gICAgICAgIGlmKGVyciAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBjb252ZXJ0cyB0aGUgZXJyb3IgdG8gUFNXIGZvcm1hdCovCi0gICAgICAgICAgICBlcnI9KChNNE9TQV9VSW50MzIpKE00X0VSUik8PDMwKSsoKChNNE9TQV9GSUxFX1dSSVRFUikmMHgwMDNGRkYpPDwxNikrKE00T1NBX0ludDE2KShlcnIpOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX0ZpbGVXcml0ZVNlZWsgZXJyb3I6JXgiLGVycik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX3NlbWFwaG9yZVdhaXQocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICBlcnIgPSBNNE9TQV9maWxlQ29tbW9uU2VlayhwQ29udGV4dCwgc2Vla01vZGUsIHBQb3NpdGlvbik7Ci0KLSAgICBpZihNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHKGVyciwgIk00T1NBX2ZpbGVXcml0ZVNlZWs6IE00T1NBX2ZpbGVDb21tb25TZWVrIik7Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcEZpbGVDb250ZXh0LT53cml0ZV9wb3NpdGlvbiA9ICpwUG9zaXRpb247Ci0KLSAgICBwRmlsZUNvbnRleHQtPmN1cnJlbnRfc2VlayA9IFNlZWtXcml0ZTsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBhc2tzIHRoZSBjb3JlIGZpbGUgd3JpdGVyIHRvIGNsb3NlIHRoZSBmaWxlCi0gKiAgICAgICAgICAgICAoYXNzb2NpYXRlZCB0byB0aGUgY29udGV4dCkuCi0gKiBAbm90ZSAgICAgICBUaGUgY29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHdyaXRlciBpcyBmcmVlZC4KLSAqIEBwYXJhbSAgICAgIHBDb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgd3JpdGVyCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlQ2xvc2UoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNE9TQV9GaWxlQ29udGV4dCogcEZpbGVDb250ZXh0ID0gKE00T1NBX0ZpbGVDb250ZXh0KilwQ29udGV4dDsKLQotICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9maWxlV3JpdGVDbG9zZSA6IHBDID0gMHglcCIsIHBDb250ZXh0KTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVDbG9zZTogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgcmV0dXJuIE00T1NBX2ZpbGVDb21tb25DbG9zZShNNE9TQV9GSUxFX1dSSVRFUiwgcENvbnRleHQpOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBmbHVzaGVzIHRoZSBzdHJlYW0gYXNzb2NpYXRlZCB0byB0aGUgY29udGV4dC4KLSAqIEBwYXJhbSAgICAgIHBDb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgd3JpdGVyCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlV3JpdGVGbHVzaChNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00T1NBX0ZpbGVDb250ZXh0KiBwRmlsZUNvbnRleHQgPSBwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgICAgZXJyID0gTTROT19FUlJPUjsKLQotICAgIE00T1NBX1RSQUNFMl8xKCJNNE9TQV9maWxlV3JpdGVGbHVzaCA6IHBDID0gMHglcCIsIHBDb250ZXh0KTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVGbHVzaDogcGNvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsIE00RVJSX0JBRF9DT05URVhULAotICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlRmx1c2g6IHNlbWFwaG9yZV9jb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0Ffc2VtYXBob3JlV2FpdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgIGlmIChmZmx1c2gocEZpbGVDb250ZXh0LT5maWxlX2Rlc2MpICE9IDApCi0gICAgewotICAgICAgICBlcnIgPSBNNEVSUl9CQURfQ09OVEVYVDsKLSAgICB9Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICByZXR1cm4gZXJyOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBhc2tzIHRoZSBjb3JlIGZpbGUgd3JpdGVyIHRvIHJldHVybiB0aGUgdmFsdWUKLSAqICAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3B0aW9uSUQuCi0gKiAgICAgICAgICAgICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nL2RlLWFsbG9jYXRpbmcgdGhlCi0gKiAgICAgICAgICAgICBtZW1vcnkgb2YgdGhlIHZhbHVlIGZpZWxkLgotICogQG5vdGUgICAgICAgJ3ZhbHVlJyBtdXN0IGJlIGNhc3QgYWNjb3JkaW5nIHRvIHRoZSB0eXBlIHJlbGF0ZWQgdG8gdGhlCi0gKiAgICAgICAgICAgICBvcHRpb25JRAotICogICAgICAgICAgICAgQXMgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZy9kZS1hbGxvY2F0aW5nIHRoZQotICogICAgICAgICAgICAgJ3ZhbHVlJyBmaWVsZCwgdGhlIGNhbGxlZSBtdXN0IGNvcHkgdGhpcyBmaWVsZAotICogICAgICAgICAgICAgdG8gaXRzIGludGVybmFsIHZhcmlhYmxlLgotICogQHBhcmFtICAgICAgcENvbnRleHQ6IChJTi9PVVQpIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSB3cml0ZXIKLSAqIEBwYXJhbSAgICAgIG9wdGlvbklEOiAoSU4pIElEIG9mIHRoZSBvcHRpb24KLSAqIEBwYXJhbSAgICAgIHZhbHVlOiAoT1VUKSBWYWx1ZSBvZiB0aGUgb3B0aW9uCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfQkFEX09QVElPTl9JRDogdGhlIG9wdGlvbklEIGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfV1JJVEVfT05MWTogdGhpcyBvcHRpb24gaXMgYSB3cml0ZSBvbmx5IG9uZQotICogQHJldHVybiAgICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEOiB0aGlzIG9wdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZUdldE9wdGlvbihNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9PcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiogcE9wdGlvblZhbHVlKQotewotICAgIE00T1NBX0ZpbGVDb250ZXh0KiBwRmlsZUNvbnRleHQgPSBwQ29udGV4dDsKLQotICAgIE00T1NBX1RSQUNFMl8xKCJNNE9TQV9maWxlV3JpdGVHZXRPcHRpb24gOiBvcHRpb24gPSAweCV4Iiwgb3B0aW9uSUQpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlR2V0T3B0aW9uOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKG9wdGlvbklEID09IDAsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX2ZpbGVXcml0ZUdldE9wdGlvbiIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBPcHRpb25WYWx1ZSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVHZXRPcHRpb246IHBPdGlvblZhbHVlIGlzIE00T1NBX05VTEwiKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMighTTRPU0FfT1BUSU9OX0lEX0lTX0NPUkVJRChvcHRpb25JRCwgTTRPU0FfRklMRV9XUklURVIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9PUFRJT05fSUQsICJNNE9TQV9maWxlV3JpdGVHZXRPcHRpb24iKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoIU00T1NBX09QVElPTl9JRF9JU19SRUFEQUJMRShvcHRpb25JRCksIE00RVJSX1dSSVRFX09OTFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZUdldE9wdGlvbiIpOwotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LCBNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlR2V0T3B0aW9uOiBzZW1hcGhvcmVfY29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgc3dpdGNoKG9wdGlvbklEKQotICAgIHsKLSNpZihNNE9TQV9PUFRJT05JRF9GSUxFX1dSSVRFX0dFVF9GSUxFX1BPU0lUSU9OID09IE00T1NBX1RSVUUpCi0gICAgY2FzZSBNNE9TQV9rRmlsZVdyaXRlR2V0RmlsZVBvc2l0aW9uOgotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qIHBvc2l0aW9uID0gKE00T1NBX0ZpbGVQb3NpdGlvbiopcE9wdGlvblZhbHVlOwotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgICAgICAgICAgTTRPU0Ffc2VtYXBob3JlV2FpdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgICAgICAgICAgKnBvc2l0aW9uID0gcEZpbGVDb250ZXh0LT53cml0ZV9wb3NpdGlvbjsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfRklMRV9XUklURV9HRVRfRklMRV9QT1NJVElPTiovCi0KLSNpZihNNE9TQV9PUFRJT05JRF9GSUxFX1dSSVRFX0dFVF9GSUxFX1NJWkUgPT0gTTRPU0FfVFJVRSkKLSAgICBjYXNlIE00T1NBX2tGaWxlV3JpdGVHZXRGaWxlU2l6ZToKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwb3NpdGlvbiA9IChNNE9TQV9GaWxlUG9zaXRpb24qKXBPcHRpb25WYWx1ZTsKLQotICAgICAgICAgICAgaWYoTTRPU0Ffa0Rlc2NSV0FjY2VzcyA9PSBwRmlsZUNvbnRleHQtPm1fRGVzY3JNb2RlQWNjZXNzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIGlTYXZlUG9zICAgID0gMDsKLSAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBpU2l6ZSAgICAgICAgPSAwOwotCi0gICAgICAgICAgICAgICAgaVNhdmVQb3MgPSBmdGVsbChwRmlsZUNvbnRleHQtPmZpbGVfZGVzYyk7ICAgICAgICAgICAgLyoxLSBDaGVjayB0aGUgZmlyc3QgcG9zaXRpb24gKi8KLSAgICAgICAgICAgICAgICBmc2VlayhwRmlsZUNvbnRleHQtPmZpbGVfZGVzYywgMCwgU0VFS19FTkQpOyAgICAgICAgLyoyLSBHbyB0byB0aGUgZW5kIG9mIHRoZSBmaWxlICovCi0gICAgICAgICAgICAgICAgKnBvc2l0aW9uID0gZnRlbGwocEZpbGVDb250ZXh0LT5maWxlX2Rlc2MpOyAgICAgICAgICAgIC8qMy0gQ2hlY2sgdGhlIGZpbGUgc2l6ZSovCi0gICAgICAgICAgICAgICAgZnNlZWsocEZpbGVDb250ZXh0LT5maWxlX2Rlc2MsIGlTYXZlUG9zLCBTRUVLX1NFVCk7ICAgIC8qNC0gZ28gdG8gdGhlIGZpcnN0IHBvc2l0aW9uKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgIH0KLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVdhaXQocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICAgICAgICAgICpwb3NpdGlvbiA9IHBGaWxlQ29udGV4dC0+ZmlsZV9zaXplOwotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgICAgICAgICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICB9Ci0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9GSUxFX1dSSVRFX0dFVF9GSUxFX1NJWkUqLwotCi0jaWYoTTRPU0FfT1BUSU9OSURfRklMRV9XUklURV9HRVRfVVJMID09IE00T1NBX1RSVUUpCi0gICAgY2FzZSBNNE9TQV9rRmlsZVdyaXRlR2V0VVJMOgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRPU0FfZmlsZUNvbW1vbkdldFVSTCAocENvbnRleHQsIChNNE9TQV9DaGFyKiopcE9wdGlvblZhbHVlKTsKLSAgICAgICAgfQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfRklMRV9XUklURV9HRVRfVVJMKi8KLQotI2lmKE00T1NBX09QVElPTklEX0ZJTEVfV1JJVEVfR0VUX0ZJTEVfQVRUUklCVVRFID09IE00T1NBX1RSVUUpCi0gICAgY2FzZSBNNE9TQV9rRmlsZVdyaXRlR2V0QXR0cmlidXRlOgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRPU0FfZmlsZUNvbW1vbkdldEF0dHJpYnV0ZShwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRPU0FfRmlsZUF0dHJpYnV0ZSopcE9wdGlvblZhbHVlKTsKLSAgICAgICAgfQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfRklMRV9XUklURV9HRVRfRklMRV9BVFRSSUJVVEUqLwotCi0jaWYoTTRPU0FfT1BUSU9OSURfRklMRV9XUklURV9HRVRfUkVBREVSX0NPTlRFWFQgPT0gTTRPU0FfVFJVRSkKLSAgICBjYXNlIE00T1NBX2tGaWxlV3JpdGVHZXRSZWFkZXJDb250ZXh0OgotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9GaWxlTW9kZUFjY2VzcyBhY2Nlc3MgPSBwRmlsZUNvbnRleHQtPmFjY2Vzc19tb2RlOwotCi0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjEoIShhY2Nlc3MgJiBNNE9TQV9rRmlsZVJlYWQpLCBNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlR2V0T3B0aW9uOiBNNE9TQV9rRmlsZVJlYWQiKTsKLQotICAgICAgICAgICAgTTRPU0FfREVCVUdfSUYxKCEoYWNjZXNzICYgTTRPU0Ffa0ZpbGVXcml0ZSksIE00RVJSX0JBRF9DT05URVhULAotICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVHZXRPcHRpb246IE00T1NBX2tGaWxlV3JpdGUiKTsKLQotICAgICAgICAgICAgcEZpbGVDb250ZXh0LT5jb3JlSURfcmVhZCA9IE00T1NBX0ZJTEVfUkVBREVSOwotCi0gICAgICAgICAgICAqcE9wdGlvblZhbHVlID0gcENvbnRleHQ7Ci0KLSAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICB9Ci0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9GSUxFX1dSSVRFX0dFVF9SRUFERVJfQ09OVEVYVCovCi0KLSAgICBjYXNlIE00T1NBX2tGaWxlV3JpdGVMb2NrTW9kZToKLSAgICAgICAgewotICAgICAgICAgICAgKihNNE9TQV9VSW50MzIqKXBPcHRpb25WYWx1ZSA9IHBGaWxlQ29udGV4dC0+bV91aUxvY2tNb2RlOwotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIE00T1NBX0RFQlVHKE00RVJSX05PVF9JTVBMRU1FTlRFRCwgIk00T1NBX2ZpbGVXcml0ZUdldE9wdGlvbiIpOwotCi0gICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLX0KLQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGFza3MgdGhlIGNvcmUgZmlsZSB3cml0ZXIgdG8gc2V0IHRoZSB2YWx1ZQotKiAgICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIG9wdGlvbklELgotKiAgICAgICAgICAgICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nL2RlLWFsbG9jYXRpbmcgdGhlCi0qICAgICAgICAgICAgIG1lbW9yeSBvZiB0aGUgdmFsdWUgZmllbGQuCi0qIEBub3RlICAgICAgIEFzIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcvZGUtYWxsb2NhdGluZyB0aGUKLSogICAgICAgICAgICAgJ3ZhbHVlJyBmaWVsZCwgdGhlIGNhbGxlZSBtdXN0IGNvcHkgdGhpcyBmaWVsZCB0byBpdHMgaW50ZXJuYWwKLSogICAgICAgICAgICAgdmFyaWFibGUuCi0qIEBwYXJhbSAgICAgIHBDb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgd3JpdGVyCi0qIEBwYXJhbSAgICAgIG9wdGlvbklEOiAoSU4pIElEIG9mIHRoZSBvcHRpb24KLSogQHBhcmFtICAgICAgdmFsdWU6IChJTikgVmFsdWUgb2YgdGhlIG9wdGlvbgotKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSogQHJldHVybiAgICAgTTRFUlJfQkFEX09QVElPTl9JRDogdGhlIG9wdGlvbklEIGlzIG5vdCBhIHZhbGlkIG9uZQotKiBAcmV0dXJuICAgICBNNEVSUl9SRUFEX09OTFk6IHRoaXMgb3B0aW9uIGlzIGEgcmVhZCBvbmx5IG9uZQotKiBAcmV0dXJuICAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQ6IHRoaXMgb3B0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlU2V0T3B0aW9uKE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX09wdGlvbklEIG9wdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKQotewotICAgIE00T1NBX0ZpbGVDb250ZXh0KiBwRmlsZUNvbnRleHQgPSBwQ29udGV4dDsKLQotICAgIE00T1NBX1RSQUNFMl8xKCJNNE9TQV9maWxlV3JpdGVTZXRPcHRpb24gOiBvcHRpb24gPSAweCV4Iiwgb3B0aW9uSUQpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlU2V0T3B0aW9uIik7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoMCA9PSBvcHRpb25JRCwgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfZmlsZVdyaXRlU2V0T3B0aW9uIik7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoIU00T1NBX09QVElPTl9JRF9JU19DT1JFSUQob3B0aW9uSUQsIE00T1NBX0ZJTEVfV1JJVEVSKSwKLSAgICAgICAgTTRFUlJfQkFEX09QVElPTl9JRCwgIk00T1NBX2ZpbGVXcml0ZVNldE9wdGlvbiIpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKCFNNE9TQV9PUFRJT05fSURfSVNfV1JJVEFCTEUob3B0aW9uSUQpLCBNNEVSUl9SRUFEX09OTFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlUmVhZFNldE9wdGlvbiIpOwotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsIE00RVJSX0JBRF9DT05URVhULAotICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVTZXRPcHRpb246IHNlbWFwaG9yZV9jb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICBzd2l0Y2gob3B0aW9uSUQpCi0gICAgewotICAgICAgICBjYXNlIE00T1NBX2tGaWxlV3JpdGVMb2NrTW9kZToKLSAgICAgICAgewotICAgICAgICAgICAgcEZpbGVDb250ZXh0LT5tX3VpTG9ja01vZGUgPSAoTTRPU0FfVUludDMyKSooTTRPU0FfVUludDMyKilvcHRpb25WYWx1ZTsKLSAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVdyaXRlRGVzY01vZGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHBGaWxlQ29udGV4dC0+bV9EZXNjck1vZGVBY2Nlc3MgPSAoTTRPU0FfSW50MzIpKihNNE9TQV9JbnQzMiopb3B0aW9uVmFsdWU7Ci0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotICAgIH0KLQotICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX011dGV4LmMgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9NdXRleC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYmU2YmJhLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX011dGV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgICAgTXV0ZXggZm9yIEFuZHJvaWQKLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgbXV0ZXgKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9NdXRleC5oIgotCi0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLQotLyogQ29udGV4dCBmb3IgdGhlIG11dGV4ICovCi10eXBlZGVmIHN0cnVjdAotewotICAgTTRPU0FfVUludDMyICAgICBjb3JlSUQ7ICAgICAgICAgICAgICAgLyogbXV0ZXggY29udGV4dCBpZGVudGlmaWFudCAqLwotICAgcHRocmVhZF9tdXRleF90ICBtdXRleDsgICAgICAgICAgICAgICAgLyogbXV0ZXggKi8KLSAgIHB0aHJlYWRfdCAgICAgICAgdGhyZWFkT3duZXJJRDsgICAgICAgIC8qIHRocmVhZCBvd25lciBpZGVudGlmaWFudCAqLwotfSBNNE9TQV9NdXRleENvbnRleHQ7Ci0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBuZXcgbXV0ZXguCi0gKiBAbm90ZSAgICAgICBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYW5kIGFsbG9jYXRlcyBhIHVuaXF1ZSBjb250ZXh0LiBJdCdzIHRoZQotICogICAgICAgICAgICAgT1NBTCByZWFsIHRpbWUgcmVzcG9uc2liaWxpdHkgZm9yIG1hbmFnaW5nIGl0cyBjb250ZXh0LiBJdCBtdXN0Ci0gKiAgICAgICAgICAgICBiZSBmcmVlZCBieSB0aGUgTTRPU0FfbXV0ZXhDbG9zZSBmdW5jdGlvbi4gVGhlIGNvbnRleHQgcGFyYW1ldGVyCi0gKiAgICAgICAgICAgICB3aWxsIGJlIHNlbnQgYmFjayB0byBhbnkgT1NBTCBjb3JlIG11dGV4IGZ1bmN0aW9ucyB0byBhbGxvdwotICogICAgICAgICAgICAgcmV0cmlldmluZyBkYXRhIGFzc29jaWF0ZWQgdG8gdGhlIG9wZW5lZCBtdXRleC4KLSAqIEBwYXJhbSAgICAgIHBDb250ZXh0OihPVVQpIENvbnRleHQgb2YgdGhlIGNyZWF0ZWQgbXV0ZXgKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKiBAcmV0dXJuICAgICBNNEVSUl9DT05URVhUX0ZBSUxFRDogdGhlIGNvbnRleHQgY3JlYXRpb24gZmFpbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX211dGV4T3BlbihNNE9TQV9Db250ZXh0KiBwQ29udGV4dCkKLXsKLSAgICBNNE9TQV9NdXRleENvbnRleHQqIHBNdXRleENvbnRleHQgPSAoTTRPU0FfTXV0ZXhDb250ZXh0KilNNE9TQV9OVUxMOwotICAgIHB0aHJlYWRfbXV0ZXhhdHRyX3QgYXR0cmlidXRlID0geyAwIH07Ci0gICAgTTRPU0FfQm9vbCBvcGVuZWQgPSBNNE9TQV9GQUxTRTsKLQotICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9tdXRleE9wZW5cdFx0TTRPU0FfQ29udGV4dCogMHgleCIsIHBDb250ZXh0KTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9tdXRleE9wZW46IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLQotICAgICpwQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICBwTXV0ZXhDb250ZXh0ID0gKE00T1NBX011dGV4Q29udGV4dCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNE9TQV9NdXRleENvbnRleHQpLAotICAgICAgICAgICAgICAgICAgICBNNE9TQV9NVVRFWCwgKE00T1NBX0NoYXIqKSJNNE9TQV9tdXRleE9wZW46IG11dGV4IGNvbnRleHQiKTsKLQotICAgIGlmKE00T1NBX05VTEwgPT0gcE11dGV4Q29udGV4dCkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0FMTE9DLCAiTTRPU0FfbXV0ZXhPcGVuIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAvKiBJbml0aWFsaXplIHRoZSBtdXRleCBhdHRyaWJ1dGUuICovCi0gICAgaWYgKCAwID09IHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQoICZhdHRyaWJ1dGUgKSApCi0gICAgewotICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBtdXRleCB0eXBlLiAqLwotICAgICAgICBpZiAoIDAgPT0gcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSggJmF0dHJpYnV0ZSwgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkUgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIG11dGV4LiAqLwotICAgICAgICAgICAgaWYgKDAgPT0gcHRocmVhZF9tdXRleF9pbml0KCAmcE11dGV4Q29udGV4dC0+bXV0ZXgsICZhdHRyaWJ1dGUgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3BlbmVkID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIERlc3Ryb3kgdGhlIG11dGV4IGF0dHJpYnV0ZS4gKi8KLSAgICAgICAgcHRocmVhZF9tdXRleGF0dHJfZGVzdHJveSggJmF0dHJpYnV0ZSApOwotICAgIH0KLQotICAgIGlmKCFvcGVuZWQpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9DT05URVhUX0ZBSUxFRCwgIk00T1NBX211dGV4T3BlbjogT1MgbXV0ZXggY3JlYXRpb24gZmFpbGVkIik7Ci0gICAgICAgIGZyZWUocE11dGV4Q29udGV4dCk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9DT05URVhUX0ZBSUxFRCA7Ci0gICAgfQotCi0gICAgcE11dGV4Q29udGV4dC0+Y29yZUlEID0gTTRPU0FfTVVURVg7Ci0KLSAgICBwTXV0ZXhDb250ZXh0LT50aHJlYWRPd25lcklEID0gMDsKLQotICAgICpwQ29udGV4dCA9IChNNE9TQV9Db250ZXh0KSBwTXV0ZXhDb250ZXh0OwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBtZXRob2QgbG9ja3MgdGhlIG11dGV4LiAiQ29udGV4dCIgaWRlbnRpZmllcyB0aGUgbXV0ZXguCi0gKiBAbm90ZSAgICAgICBJZiB0aGUgbXV0ZXggaXMgYWxyZWFkeSBsb2NrZWQsIHRoZSBjYWxsaW5nIHRocmVhZCBibG9ja3MgdW50aWwKLSAqICAgICAgICAgICAgIHRoZSBtdXRleCBiZWNvbWVzIGF2YWlsYWJsZSAoYnkgY2FsbGluZyBNNE9TQV9tdXRleFVubG9jaykgb3IKLSAqICAgICAgICAgICAgICJ0aW1lb3V0IiBpcyByZWFjaGVkLiBUaGlzIGlzIGEgYmxvY2tpbmcgY2FsbC4KLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6KElOL09VVCkgQ29udGV4dCBvZiB0aGUgbXV0ZXgKLSAqIEBwYXJhbSAgICAgIHRpbWVvdXQ6KElOKSBUaW1lIG91dCBpbiBtaWxsaXNlY29uZHMKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRXQVJfVElNRV9PVVQ6IHRpbWUgb3V0IGlzIGVsYXBzZWQgYmVmb3JlIG11dGV4IGhhcyBiZWVuCi0gKiAgICAgICAgICAgICBhdmFpbGFibGUKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9tdXRleExvY2soTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNE9TQV9VSW50MzIgdGltZW91dCkKLXsKLSAgICBNNE9TQV9NdXRleENvbnRleHQqIHBNdXRleENvbnRleHQgPSAoTTRPU0FfTXV0ZXhDb250ZXh0Kiljb250ZXh0OwotICAgIHB0aHJlYWRfdCAgICAgICAgICAgY3VycmVudFRocmVhZDsKLSAgICBpbnQgICAgICAgICAgICAgICAgIHJlc3VsdDsKLSAgICBzdHJ1Y3QgdGltZXNwZWMgICAgIHRzOwotICAgIHN0cnVjdCB0aW1lc3BlYyAgICAgbGVmdDsKLQotICAgIE00T1NBX1RSQUNFMV8yKCJNNE9TQV9tdXRleExvY2tcdFx0TTRPU0FfQ29udGV4dCAweCV4XHRNNE9TQV9VSW50MzIgJWQiLAotICAgICAgICBjb250ZXh0LCB0aW1lb3V0KTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IGNvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX211dGV4TG9jazogY29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKHBNdXRleENvbnRleHQtPmNvcmVJRCAhPSBNNE9TQV9NVVRFWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfbXV0ZXhMb2NrIik7Ci0KLSAgICBjdXJyZW50VGhyZWFkID0gcHRocmVhZF9zZWxmKCk7Ci0KLSAgICBpZihwTXV0ZXhDb250ZXh0IC0+dGhyZWFkT3duZXJJRCA9PSBjdXJyZW50VGhyZWFkKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV9tdXRleExvY2s6IFRocmVhZCB0cmllZCB0byBsb2NrIGEgbXV0ZXggaXQgYWxyZWFkeSBvd25zIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVCA7Ci0gICAgfQotCi0gICAgLyogTG9jayB0aGUgbXV0ZXguICovCi0gICAgaWYgKCBNNE9TQV9XQUlUX0ZPUkVWRVIgPT0gdGltZW91dCkKLSAgICB7Ci0gICAgICAgIGlmICggMCAhPSBwdGhyZWFkX211dGV4X2xvY2soJnBNdXRleENvbnRleHQtPm11dGV4KSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfbXV0ZXhMb2NrOiBPUyBtdXRleCB3YWl0IGZhaWxlZCIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJlc3VsdCA9IHB0aHJlYWRfbXV0ZXhfdHJ5bG9jaygmcE11dGV4Q29udGV4dC0+bXV0ZXgpOwotICAgICAgICB3aGlsZSAoICggRUJVU1kgPT0gcmVzdWx0ICkgJiYgKCAwIDwgdGltZW91dCApICkKLSAgICAgICAgewotICAgICAgICAgICAgdHMudHZfc2VjICA9IDA7Ci0gICAgICAgICAgICBpZiAoMSA8PSB0aW1lb3V0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRzLnR2X25zZWMgPSAxMDAwMDAwOwotICAgICAgICAgICAgICAgIHRpbWVvdXQgLT0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cy50dl9uc2VjID0gdGltZW91dCAqIDEwMDAwMDA7Ci0gICAgICAgICAgICAgICAgdGltZW91dCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuYW5vc2xlZXAoJnRzLCAmbGVmdCk7Ci0gICAgICAgICAgICByZXN1bHQgPSBwdGhyZWFkX211dGV4X3RyeWxvY2soJnBNdXRleENvbnRleHQtPm11dGV4KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoMCAhPSByZXN1bHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChFQlVTWSA9PSByZXN1bHQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00V0FSX1RJTUVfT1VUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfbXV0ZXhMb2NrOiBPUyBtdXRleCB3YWl0IGZhaWxlZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHBNdXRleENvbnRleHQtPnRocmVhZE93bmVySUQgPSBjdXJyZW50VGhyZWFkOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIHVubG9ja3MgdGhlIG11dGV4LiBUaGUgbXV0ZXggaXMgaWRlbnRpZmllZCBieQotICogICAgICAgICAgICAgaXRzIGNvbnRleHQKLSAqIEBub3RlICAgICAgIFRoZSBNNE9TQV9tdXRleExvY2sgdW5ibG9ja3MgdGhlIHRocmVhZCB3aXRoIHRoZSBoaWdoZXN0Ci0gKiAgICAgICAgICAgICBwcmlvcml0eSBhbmQgbWFkZSBpdCByZWFkeSB0byBydW4uCi0gKiBAbm90ZSAgICAgICBObyBoeXBvdGhlc2VzIGNhbiBiZSBtYWRlIG9uIHdoaWNoIHRocmVhZCB3aWxsIGJlIHVuLWJsb2NrZWQKLSAqICAgICAgICAgICAgIGJldHdlZW4gdGhyZWFkcyB3aXRoIHRoZSBzYW1lIHByaW9yaXR5LgotICogQHBhcmFtICAgICAgY29udGV4dDooSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBtdXRleAotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9tdXRleFVubG9jayhNNE9TQV9Db250ZXh0IGNvbnRleHQpCi17Ci0gICAgTTRPU0FfTXV0ZXhDb250ZXh0KiBwTXV0ZXhDb250ZXh0ID0gKE00T1NBX011dGV4Q29udGV4dCopY29udGV4dDsKLSAgICBwdGhyZWFkX3QgY3VycmVudFRocmVhZDsKLQotICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9tdXRleFVubG9ja1x0XHRNNE9TQV9Db250ZXh0IDB4JXgiLCBjb250ZXh0KTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBjb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfbXV0ZXhVbmxvY2s6IGNvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9NVVRFWCAhPSBwTXV0ZXhDb250ZXh0LT5jb3JlSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV9tdXRleFVubG9jayIpOwotCi0gICAgY3VycmVudFRocmVhZCA9IHB0aHJlYWRfc2VsZigpOwotCi0gICAgaWYocE11dGV4Q29udGV4dC0+dGhyZWFkT3duZXJJRCAhPSBjdXJyZW50VGhyZWFkKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV9tdXRleFVubG9jazogVGhyZWFkIHRyaWVkIHRvIHVubG9jayBhIG11dGV4IGl0IGRvZXNuJ3Qgb3duIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsKLSAgICB9Ci0KLSAgICBwTXV0ZXhDb250ZXh0LT50aHJlYWRPd25lcklEID0gMCA7Ci0KLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcE11dGV4Q29udGV4dC0+bXV0ZXgpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBtZXRob2QgZGVsZXRlcyBhIG11dGV4IChpZGVudGlmeSBieSBpdHMgY29udGV4dCkuIEFmdGVyCi0gKiAgICAgICAgICAgICB0aGlzIGNhbGwsIHRoZSBtdXRleCBhbmQgaXRzIGNvbnRleHQgaXMgbm8gbW9yZSB1c2VhYmxlLiBUaGlzCi0gKiAgICAgICAgICAgICBmdW5jdGlvbiBmcmVlcyBhbGwgdGhlIG1lbW9yeSByZWxhdGVkIHRvIHRoaXMgbXV0ZXguCi0gKiBAbm90ZSAgICAgICBJdCBpcyBhbiBhcHBsaWNhdGlvbiBpc3N1ZSB0byB3YXJyYW50IG5vIG1vcmUgdGhyZWFkcyBhcmUgbG9ja2VkCi0gKiAgICAgICAgICAgICBvbiB0aGUgZGVsZXRlZCBtdXRleC4KLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6KElOL09VVCkgQ29udGV4dCBvZiB0aGUgbXV0ZXgKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX211dGV4Q2xvc2UoTTRPU0FfQ29udGV4dCBjb250ZXh0KQotewotICAgIE00T1NBX011dGV4Q29udGV4dCogcE11dGV4Q29udGV4dCA9IChNNE9TQV9NdXRleENvbnRleHQqKWNvbnRleHQ7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfbXV0ZXhDbG9zZVx0XHRNNE9TQV9Db250ZXh0IDB4JXgiLCBjb250ZXh0KTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IGNvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfbXV0ZXhDbG9zZTogY29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKHBNdXRleENvbnRleHQtPmNvcmVJRCAhPSBNNE9TQV9NVVRFWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX211dGV4VW5sb2NrIik7Ci0KLSAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJnBNdXRleENvbnRleHQtPm11dGV4KTsKLQotICAgIGZyZWUoIHBNdXRleENvbnRleHQpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX1JhbmRvbS5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfUmFuZG9tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMyNGQwMzkuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfUmFuZG9tLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgIE00UFNXX1RyYWNlLmMKLSAqIEBicmllZiAgICAgICAgVHJhY2UgZnVuY3Rpb24gZm9yIHRyYWNlIG1hY3JvcwotICogQG5vdGUgICAgICAgIFRoaXMgZmlsZSBnaXZlcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHRyYWNlIGZ1bmN0aW9uIHVzZWQKLSAqICAgICAgICAgICAgICAgIGluIHRoZSB0cmFjZSBpbnN0cnVtZW50YXRpb24gbWFjcm9zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4gIC8qZm9yIHByaW50ZiAqLwotI2luY2x1ZGUgPHN0ZGFyZy5oPiAvKiBBTlNJIEMgbWFjcm9zIGFuZCBkZWZzIGZvciB2YXJpYWJsZSBhcmdzICovCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX011dGV4LmgiCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmbiAgICAgICAgIE00T1NBX0VSUiBNNE9TQV9yYW5kSW5pdCgpCi0gKiBAYnJpZWYgICAgICB0aGlzIGZ1bmN0aW9uIGluaXRpYWxpemUgdGhlIG51bWJlciBnZW5lcmF0b3IKLSAqICAgICAgICAgICAgICAgdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBvbmNlIGJlZm9yZSBhbnkgY2FsbCB0byBNNE9TQV9yYW5kKCkKLSAqICAgICAgICAgICAgICAgbmVlZCB0aGUgc3RkbGliIGFuZCB0aW1lIGxpYnJhcmllcwotICogQG5vdGUKLSAqIEBwYXJhbQotICogQHJldHVybiAgICAgTTROT19FUlJPUgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfRVJSIE00T1NBX3JhbmRJbml0KCkKLXsKLSAgICBpbnQgaTsKLQotICAgIHNyYW5kKHRpbWUoTlVMTCkpOwotCi0gICAgLyogV2luZG93cycgcmFuZCBpcyByb3R0ZW4sIHRoZSBmaXJzdCBnZW5lcmF0ZWQgdmFsdWUgYWZ0ZXIgdGhlIGluaXQKLSAgICBhYm92ZSBpcyBub3QgcmFuZG9tIGVub3VnaCwgc28gbGV0J3Mgc2hha2UgdGhpbmdzIGEgbGl0dGxlLi4uICovCi0KLSAgICBmb3IgKGk9MDsgaTwxMDA7IGkrKykgcmFuZCgpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmbiAgICAgICAgICAgTTRPU0FfRVJSIE00T1NBX3JhbmQoTTRPU0FfSW50MzIqIG91dF92YWx1ZSwgTTRPU0FfVUludDMyIG1heF92YWx1ZSkKLSAqIEBicmllZiAgICAgICBUaGlzIGZ1bmN0aW9uIGdpdmVzIGEgcmFuZG9tIG51bWJlciBiZXR3ZWVuIDEgYW5kIG1heF92YWx1ZQotICogICAgICAgICAgICAgICAoaW5jbHVzaXZlKSB3aXRoIGFwcHJveGltYXRlbHkgZXF1YWwgcHJvYmFiaWxpdHksIGFuZAotICogICAgICAgICAgICAgICByZXR1cm5zIHRoaXMgbnVtYmVyIGluIG91dF92YWx1ZS4gRm9yIGluc3RhbmNlLCBhIG1heF92YWx1ZQotICogICAgICAgICAgICAgb2YgNiB3aWxsIHNpbXVsYXRlIGEgZmFpciA2LXNpZGVkIGRpY2Ugcm9sbC4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgICBvdXRfdmFsdWUgKE9VVCk6IG9uIHJldHVybiwgcG9pbnRzIHRvIHJhbmRvbSByZXN1bHQKLSAqIEBwYXJhbSAgICAgICBtYXhfdmFsdWUgKElOKTogbWF4IGV4cGVjdGVkIHZhbHVlCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1NNE9TQV9FUlIgTTRPU0FfcmFuZChNNE9TQV9JbnQzMiogb3V0X3ZhbHVlLCBNNE9TQV9VSW50MzIgbWF4X3ZhbHVlKQotewotICAgIGlmKCAob3V0X3ZhbHVlID09IE00T1NBX05VTEwpIHx8IChtYXhfdmFsdWUgPCAxKSApCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgICgqb3V0X3ZhbHVlKSA9IHJhbmQoKTsKLSAgICAvKiBub3RpY2UgdGhpcyBhbGdvcml0aG0gd2lsbCBvbmx5IHdvcmsgZm9yIG1heF92YWx1ZXMgc3VjaCB0aGF0IHRoZSBtdWx0aXBsaWNhdGlvbgotICAgIHdvbid0IG92ZXJmbG93LCB3aGljaCBtZWFucyB0aGF0IG1heF92YWx1ZSB0eXBpY2FsbHkgc2hvdWxkbid0IGdvIG92ZXIgdGhlIHJhbmdlIG9mCi0gICAgYW4gSW50MTYuICovCi0gICAgKCpvdXRfdmFsdWUpID0gKCgoKm91dF92YWx1ZSkgKiBtYXhfdmFsdWUpIC8gKChNNE9TQV9VSW50MzIpUkFORF9NQVggKyAxKSkgKyAxOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfU2VtYXBob3JlLmMgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9TZW1hcGhvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjNiNTg1Mi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9TZW1hcGhvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9TZW1hcGhvcmUuYwotICogQGJyaWVmICAgICAgICBTZW1hcGhvcmUgZm9yIFdpbmRvd3MKLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgc2VtYXBob3JlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0KLQotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX1NlbWFwaG9yZS5oIgotCi0jaW5jbHVkZSA8c2VtYXBob3JlLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLQotCi0vKiBDb250ZXh0IGZvciB0aGUgc2VtYXBob3JlICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICBNNE9TQV9VSW50MzIgICBjb3JlSUQ7ICAgICAvKiBzZW1hcGhvcmUgY29udGV4dCBpZGVudGlmaWFudCAqLwotICAgc2VtX3QgICAgICAgICAgc2VtYXBob3JlOyAgLyogc2VtYXBob3JlICovCi19IE00T1NBX1NlbWFwaG9yZUNvbnRleHQ7Ci0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBtZXRob2QgY3JlYXRlcyBhIG5ldyBzZW1hcGhvcmUgd2l0aCB0aGUgImluaXRpYWxDb3VudGVyIgotICogICAgICAgICAgICAgdmFsdWUuCi0gKiBAbm90ZSAgICAgICBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYW5kIGFsbG9jYXRlcyBhIHVuaXF1ZSBjb250ZXh0LiBJdCdzIHRoZQotICogICAgICAgICAgICAgT1NBTCByZWFsIHRpbWUgcmVzcG9uc2liaWxpdHkgZm9yIG1hbmFnaW5nIGl0cyBjb250ZXh0LiBJdCBtdXN0Ci0gKiAgICAgICAgICAgICBiZSBmcmVlZCBieSB0aGUgTTRPU0Ffc2VtYXBob3JlQ2xvc2UgZnVuY3Rpb24uIFRoZSBjb250ZXh0Ci0gKiAgICAgICAgICAgICBwYXJhbWV0ZXIgd2lsbCBiZSBzZW50IGJhY2sgdG8gYW55IE9TQUwgY29yZSBzZW1hcGhvcmUgZnVuY3Rpb25zCi0gKiAgICAgICAgICAgICB0byBhbGxvdyByZXRyaWV2aW5nIGRhdGEgYXNzb2NpYXRlZCB0byB0aGUgb3BlbmVkIHNlbWFwaG9yZS4KLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6KE9VVCkgQ29udGV4dCBvZiB0aGUgY3JlYXRlZCBzZW1hcGhvcmUKLSAqIEBwYXJhbSAgICAgIGluaXRpYWxfY291bnQ6KElOKSBJbml0aWFsIGNvdW50ZXIgb2YgdGhlIHNlbWFwaG9yZQotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogcHJvdmlkZWQgY29udGV4dCBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKiBAcmV0dXJuICAgICBNNEVSUl9DT05URVhUX0ZBSUxFRDogdGhlIGNvbnRleHQgY3JlYXRpb24gZmFpbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX3NlbWFwaG9yZU9wZW4oTTRPU0FfQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBpbml0aWFsX2NvdW50KQotewotICAgTTRPU0FfU2VtYXBob3JlQ29udGV4dCogc2VtYXBob3JlQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgIE00T1NBX1RSQUNFMV8yKCJNNE9TQV9zZW1hcGhvcmVPcGVuXHRcdE00T1NBX0NvbnRleHQqIDB4JXhcdE00T1NBX1VJbnQzMiAiCi0gICAgICAgICAgICAgICAgICAiJWQiLCBjb250ZXh0LCBpbml0aWFsX2NvdW50KTsKLQotICAgTTRPU0FfREVCVUdfSUYyKGNvbnRleHQgPT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zZW1hcGhvcmVPcGVuIik7Ci0KLSAgICpjb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgc2VtYXBob3JlQ29udGV4dCA9IChNNE9TQV9TZW1hcGhvcmVDb250ZXh0KikgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihNNE9TQV9TZW1hcGhvcmVDb250ZXh0KSwgTTRPU0FfU0VNQVBIT1JFLAotICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikiTTRPU0Ffc2VtYXBob3JlT3Blbjogc2VtYXBob3JlIGNvbnRleHQiKTsKLQotICAgaWYoc2VtYXBob3JlQ29udGV4dCA9PSBNNE9TQV9OVUxMKQotICAgewotICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQUxMT0MsICJNNE9TQV9zZW1hcGhvcmVPcGVuIik7Ci0KLSAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgIH0KLQotICAgaWYgKDAgIT0gc2VtX2luaXQoJnNlbWFwaG9yZUNvbnRleHQtPnNlbWFwaG9yZSwgMCwgaW5pdGlhbF9jb3VudCkpCi0gICB7Ci0gICAgICBmcmVlKHNlbWFwaG9yZUNvbnRleHQpOwotCi0gICAgICBNNE9TQV9ERUJVRyhNNEVSUl9DT05URVhUX0ZBSUxFRCwKLSAgICAgICAgICJNNE9TQV9zZW1hcGhvcmVPcGVuOiBPUyBzZW1hcGhvcmUgY3JlYXRpb24gZmFpbGVkIik7Ci0KLSAgICAgIHJldHVybiBNNEVSUl9DT05URVhUX0ZBSUxFRDsKLSAgIH0KLQotICAgc2VtYXBob3JlQ29udGV4dC0+Y29yZUlEID0gTTRPU0FfU0VNQVBIT1JFIDsKLSAgICpjb250ZXh0ID0gKE00T1NBX0NvbnRleHQpc2VtYXBob3JlQ29udGV4dDsKLQotICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBtZXRob2QgZGVjcmVtZW50cyAob25lIGJ5IG9uZSkgdGhlIHNlbWFwaG9yZSBjb3VudGVyLiBUaGUKLSAqICAgICAgICAgICAgIHNlbWFwaG9yZSBpcyBpZGVudGlmaWVkIGJ5IGl0cyBjb250ZXh0IFRoaXMgY2FsbCBpcyBub3QgYmxvY2tpbmcKLSAqICAgICAgICAgICAgIGlmIHRoZSBzZW1hcGhvcmUgY291bnRlciBpcyBwb3NpdGl2ZSBvciB6ZXJvIChhZnRlcgotICogICAgICAgICAgICAgZGVjcmVtZW50YXRpb24pLiBUaGlzIGNhbGwgaXMgYmxvY2tpbmcgaWYgdGhlIHNlbWFwaG9yZSBjb3VudGVyCi0gKiAgICAgICAgICAgICBpcyBsZXNzIHRoYW4gemVybyAoYWZ0ZXIgZGVjcmVtZW50YXRpb24pLCB1bnRpbCB0aGUgc2VtYXBob3JlIGlzCi0gKiAgICAgICAgICAgICB1cHBlciB0aGFuIHplcm8gKHNlZSBNNE9TQV9zZW1hcGhvcmVQb3N0KSBvciB0aW1lX291dCBpcwotICogICAgICAgICAgICAgcmVhY2hlZC4KLSAqIEBub3RlICAgICAgIElmICJ0aW1lb3V0IiB2YWx1ZSBpcyBNNE9TQV9XQUlUX0ZPUkVWRVIsIHRoZSBjYWxsaW5nIHRocmVhZAotICogICAgICAgICAgICAgd2lsbCBibG9jayBpbmRlZmluaXRlbHkgdW50aWwgdGhlIHNlbWFwaG9yZSAgaXMgdW5sb2NrZWQuCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OihJTi9PVVQpIENvbnRleHQgb2YgdGhlIHNlbWFwaG9yZQotICogQHBhcmFtICAgICAgdGltZW91dDooSU4pIFRpbWUgb3V0IGluIG1pbGxpc2Vjb25kcwotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNFdBUl9USU1FX09VVDogdGltZSBvdXQgaXMgZWxhcHNlZCBiZWZvcmUgc2VtYXBob3JlIGhhcyBiZWVuCi0gKiAgICAgICAgICAgICBhdmFpbGFibGUuCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0Ffc2VtYXBob3JlV2FpdChNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00T1NBX0ludDMyIHRpbWVvdXQpCi17Ci0gICBNNE9TQV9TZW1hcGhvcmVDb250ZXh0KiBzZW1hcGhvcmVDb250ZXh0ID0gKE00T1NBX1NlbWFwaG9yZUNvbnRleHQqKWNvbnRleHQ7Ci0gICBzdHJ1Y3QgdGltZXNwZWMgICAgICAgICB0czsKLSAgIHN0cnVjdCB0aW1lc3BlYyAgICAgICAgIGxlZnQ7Ci0gICBpbnQgICAgICAgICAgICAgICAgICAgICByZXN1bHQ7Ci0KLSAgIE00T1NBX1RSQUNFMV8yKCJNNE9TQV9zZW1hcGhvcmVXYWl0XHRcdE00T1NBX0NvbnRleHQgMHgleFx0TTRPU0FfVUludDMyICVkIiwKLSAgICAgICAgICAgICAgICAgIGNvbnRleHQsIHRpbWVvdXQpOwotCi0gICBNNE9TQV9ERUJVR19JRjIoY29udGV4dCA9PSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3NlbWFwaG9yZVdhaXQiKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKHNlbWFwaG9yZUNvbnRleHQtPmNvcmVJRCAhPSBNNE9TQV9TRU1BUEhPUkUsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV9zZW1hcGhvcmVXYWl0Iik7Ci0KLSAgIGlmICggKE00T1NBX0ludDMyKU00T1NBX1dBSVRfRk9SRVZFUiA9PSB0aW1lb3V0KQotICAgewotICAgICAgIGlmICggMCAhPSBzZW1fd2FpdCgmc2VtYXBob3JlQ29udGV4dC0+c2VtYXBob3JlKSApCi0gICAgICAgewotICAgICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICAgICJNNE9TQV9zZW1hcGhvcmVXYWl0OiBPUyBzZW1hcGhvcmUgd2FpdCBmYWlsZWQiKTsKLQotICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQgOwotICAgICAgIH0KLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSAgICAgICByZXN1bHQgPSBzZW1fdHJ5d2FpdCgmc2VtYXBob3JlQ29udGV4dC0+c2VtYXBob3JlKTsKLSAgICAgICB3aGlsZSAoICgoRUJVU1kgPT0gcmVzdWx0KSB8fCAoRUFHQUlOID09IHJlc3VsdCkpICYmICggMCA8IHRpbWVvdXQgKSApCi0gICAgICAgewotICAgICAgICAgICB0cy50dl9zZWMgID0gMDsKLSAgICAgICAgICAgaWYgKDEgPD0gdGltZW91dCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgdHMudHZfbnNlYyA9IDEwMDAwMDA7Ci0gICAgICAgICAgICAgICB0aW1lb3V0IC09IDE7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgZWxzZQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICB0cy50dl9uc2VjID0gdGltZW91dCAqIDEwMDAwMDA7Ci0gICAgICAgICAgICAgICB0aW1lb3V0ID0gMDsKLSAgICAgICAgICAgfQotICAgICAgICAgICBuYW5vc2xlZXAoJnRzLCAmbGVmdCk7Ci0gICAgICAgICAgIHJlc3VsdCA9IHNlbV90cnl3YWl0KCZzZW1hcGhvcmVDb250ZXh0LT5zZW1hcGhvcmUpOwotICAgICAgIH0KLSAgICAgICBpZiAoMCAhPSByZXN1bHQpCi0gICAgICAgewotICAgICAgICAgICBpZiAoKEVCVVNZID09IHJlc3VsdCkgfHwgKEVBR0FJTiA9PSByZXN1bHQpKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICByZXR1cm4gTTRXQVJfVElNRV9PVVQ7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgZWxzZQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX3NlbWFwaG9yZVdhaXQ6IE9TIHNlbWFwaG9yZSB3YWl0IGZhaWxlZCIpOwotICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOwotICAgICAgICAgICB9Ci0gICAgICAgfQotICAgfQotCi0gICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIGluY3JlbWVudHMgdGhlIHNlbWFwaG9yZSBjb3VudGVyLiBUaGUgc2VtYXBob3JlIGlzCi0gKiAgICAgICAgICAgICBpZGVudGlmaWVkIGJ5IGl0cyBjb250ZXh0Ci0gKiBAbm90ZSAgICAgICBJZiB0aGUgc2VtYXBob3JlIGNvdW50ZXIgaXMgdXBwZXIgdGhhbiB6ZXJvIChhZnRlciBhZGRpdGlvbiksCi0gKiAgICAgICAgICAgICB0aGUgTTRPU0Ffc2VtYXBob3JlV2FpdCBjYWxsIG9mIHRoZSB0aHJlYWQgd2l0aCB0aGUgaGlnaGVzdAotICogICAgICAgICAgICAgcHJpb3JpdHkgaXMgdW5ibG9ja2VkIGFuZCBtYWRlIHJlYWR5IHRvIHJ1bi4KLSAqIEBub3RlICAgICAgIE5vIGh5cG90aGVzZXMgY2FuIGJlIG1hZGUgb24gd2hpY2ggdGhyZWFkIHdpbGwgYmUgdW5ibG9ja2VkCi0gKiAgICAgICAgICAgICBiZXR3ZWVuIHRocmVhZHMgd2l0aCB0aGUgc2FtZSBwcmlvcml0eS4KLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6KElOL09VVCkgQ29udGV4dCBvZiB0aGUgc2VtYXBob3JlCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX3NlbWFwaG9yZVBvc3QoTTRPU0FfQ29udGV4dCBjb250ZXh0KQotewotICAgTTRPU0FfU2VtYXBob3JlQ29udGV4dCogc2VtYXBob3JlQ29udGV4dCA9IChNNE9TQV9TZW1hcGhvcmVDb250ZXh0Kiljb250ZXh0OwotCi0gICBNNE9TQV9UUkFDRTFfMSgiTTRPU0Ffc2VtYXBob3JlUG9zdFx0XHRNNE9TQV9Db250ZXh0IDB4JXgiLCBjb250ZXh0KTsKLQotICAgTTRPU0FfREVCVUdfSUYyKGNvbnRleHQgPT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zZW1hcGhvcmVQb3N0Iik7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMihzZW1hcGhvcmVDb250ZXh0LT5jb3JlSUQgIT0gTTRPU0FfU0VNQVBIT1JFLAotICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhULCAiTTRPU0Ffc2VtYXBob3JlUG9zdCIpOwotCi0gICBzZW1fcG9zdCgmc2VtYXBob3JlQ29udGV4dC0+c2VtYXBob3JlKTsKLQotICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIG1ldGhvZCBkZWxldGVzIGEgc2VtYXBob3JlIChpZGVudGlmeSBieSBpdHMgY29udGV4dCkuCi0gKiAgICAgICAgICAgICBBZnRlciB0aGlzIGNhbGwgdGhlIHNlbWFwaG9yZSBhbmQgaXRzIGNvbnRleHQgaXMgbm8gbW9yZQotICogICAgICAgICAgICAgdXNlYWJsZS4gVGhpcyBmdW5jdGlvbiBmcmVlcyBhbGwgdGhlIG1lbW9yeSByZWxhdGVkIHRvIHRoaXMKLSAqICAgICAgICAgICAgIHNlbWFwaG9yZS4KLSAqIEBub3RlICAgICAgIEl0IGlzIGFuIGFwcGxpY2F0aW9uIGlzc3VlIHRvIHdhcnJhbnQgbm8gbW9yZSB0aHJlYWRzIGFyZSBsb2NrZWQKLSAqICAgICAgICAgICAgIG9uIHRoZSBkZWxldGVkIHNlbWFwaG9yZS4KLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6KElOL09VVCkgQ29udGV4dCBvZiB0aGUgc2VtYXBob3JlCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9zZW1hcGhvcmVDbG9zZShNNE9TQV9Db250ZXh0IGNvbnRleHQpCi17Ci0gICBNNE9TQV9TZW1hcGhvcmVDb250ZXh0KiBzZW1hcGhvcmVDb250ZXh0ID0gKE00T1NBX1NlbWFwaG9yZUNvbnRleHQqKWNvbnRleHQ7Ci0KLSAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9zZW1hcGhvcmVDbG9zZVx0XHRNNE9TQV9Db250ZXh0IDB4JXgiLCBjb250ZXh0KTsKLQotICAgTTRPU0FfREVCVUdfSUYyKGNvbnRleHQgPT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zZW1hcGhvcmVDbG9zZSIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIoc2VtYXBob3JlQ29udGV4dC0+Y29yZUlEICE9IE00T1NBX1NFTUFQSE9SRSwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX3NlbWFwaG9yZUNsb3NlIik7Ci0KLSAgIHNlbV9kZXN0cm95KCZzZW1hcGhvcmVDb250ZXh0LT5zZW1hcGhvcmUpOwotCi0gICBmcmVlKHNlbWFwaG9yZUNvbnRleHQpOwotCi0gICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfVGhyZWFkLmMgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9UaHJlYWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGI1NDI0NS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9UaHJlYWQuYworKysgL2Rldi9udWxsCkBAIC0xLDc5NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX1RocmVhZC5jCi0gKiBAaW5ncm91cCAgICAgIE9TQUwKLSAqIEBicmllZiAgICAgICAgSW1wbGVtZW50cyBhbmQgbWFuaXB1bGF0ZSB0aHJlYWRzCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZ1bmN0aW9ucyB0byBtYW5pcHVsYXRlIHRocmVhZHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpbmNsdWRlIDxzY2hlZC5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLQotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX1RocmVhZC5oIgotI2luY2x1ZGUgIk00T1NBX1RocmVhZF9wcml2LmgiCi0jaW5jbHVkZSAiTTRPU0FfTXV0ZXguaCIKLSNpbmNsdWRlICJNNE9TQV9TZW1hcGhvcmUuaCIKLSNpbmNsdWRlICJNNE9TQV9DaGFyU3Rhci5oIgotCi0KLXZvaWQqIE00T1NBX3RocmVhZFN5bmNGb3JFdmVyRG8odm9pZCAqY29udGV4dCkKLXsKLSAgIE00T1NBX1RocmVhZENvbnRleHQqIHRocmVhZENvbnRleHQgPSAoTTRPU0FfVGhyZWFkQ29udGV4dCopY29udGV4dDsKLSAgIE00T1NBX0Jvb2wgYXV0b19raWxsID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKgotICAgICAgIE00T1NBX1ZvaWQqIHVzZXJEYXRhOwotICAgICovCi0KLSAgIE00T1NBX1RSQUNFMl8xKCJNNE9TQV90aHJlYWRTeW5jRm9yRXZlckRvXHRcdExQVk9JRCAweCV4IiwgY29udGV4dCk7Ci0KLSAgICAvKgotICAgICAgIHVzZXJEYXRhID0gdGhyZWFkQ29udGV4dC0+dXNlckRhdGE7Ci0gICAgKi8KLQotICAgTTRPU0FfbXV0ZXhMb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0KLQotICAgdGhyZWFkQ29udGV4dC0+c3RhdGUgPSBNNE9TQV9rVGhyZWFkUnVubmluZzsKLQotICAgTTRPU0Ffc2VtYXBob3JlUG9zdCh0aHJlYWRDb250ZXh0LT5zZW1TdGFydFN0b3ApOwotCi0gICB3aGlsZSh0aHJlYWRDb250ZXh0LT5zdGF0ZSA9PSBNNE9TQV9rVGhyZWFkUnVubmluZykKLSAgIHsKLSAgICAgIE00T1NBX211dGV4VW5sb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpOwotCi0gICAgICBpZigodGhyZWFkQ29udGV4dC0+ZnVuYyh0aHJlYWRDb250ZXh0LT5wYXJhbSkpICE9IE00Tk9fRVJST1IpCi0gICAgICB7Ci0gICAgICAgICBNNE9TQV9tdXRleExvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLQotICAgICAgICAgaWYodGhyZWFkQ29udGV4dC0+c3RhdGUgPT0gTTRPU0Ffa1RocmVhZFJ1bm5pbmcpCi0gICAgICAgICB7Ci0KLSAgICAgICAgICAgIC8vUFIgMjM1NCAtIEFDTyA6IFN1cHByZXNzIHN0b3BwaW5nIHN0YXRlIGFuZCBkb24ndAotICAgICAgICAgICAgLy8gICAgICAgICB1bmxvY2sgbXV0ZXggYmVmb3JlIGNsb3NpbmcgdGhlIHRocmVhZAotICAgICAgICAgICAgdGhyZWFkQ29udGV4dC0+c3RhdGUgPSBNNE9TQV9rVGhyZWFkT3BlbmVkOwotICAgICAgICAgICAgTTRPU0FfbXV0ZXhVbmxvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgIH0KLQotICAgICAgICAgTTRPU0FfbXV0ZXhVbmxvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCk7Ci0gICAgICB9Ci0KLSAgICAgIE00T1NBX211dGV4TG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotICAgfQotCi0KLSAgIE00T1NBX3NlbWFwaG9yZVBvc3QodGhyZWFkQ29udGV4dC0+c2VtU3RhcnRTdG9wKTsKLQotCi0gICBNNE9TQV9tdXRleFVubG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKLQotCi0gICByZXR1cm4gMDsKLX0KLQotCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKiBAYnJpZWYgICAgICBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgbmV3IHRocmVhZC4gQWZ0ZXIgdGhpcyBjYWxsIHRoZSB0aHJlYWQgaXMKLSAqICAgICAgICAgICAgIGlkZW50aWZpZWQgYnkgaXRzICJjb250ZXh0Ii4gVGhlIHRocmVhZCBmdW5jdGlvbiBpcyBwcm92aWRlZCBieQotICogICAgICAgICAgICAgdGhlICJmdW5jIiBwYXJhbWV0ZXIuIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyAmIGFsbG9jYXRlcyBhIHVuaXF1ZQotICogICAgICAgICAgICAgY29udGV4dC4gSXQncyB0aGUgT1NBTCByZWFsIHRpbWUgcmVzcG9uc2liaWxpdHkgZm9yIG1hbmFnaW5nIGl0cwotICogICAgICAgICAgICAgY29udGV4dC4gSXQgbXVzdCBiZSBmcmVlZCBieSB0aGUgTTRPU0FfdGhyZWFkU3luY0Nsb3NlIGZ1bmN0aW9uLgotICogICAgICAgICAgICAgVGhlIGNvbnRleHQgcGFyYW1ldGVyIHdpbGwgYmUgc2VudCBiYWNrIHRvIGFueSBPU0FMIGNvcmUgdGhyZWFkCi0gKiAgICAgICAgICAgICBmdW5jdGlvbnMgdG8gYWxsb3cgcmV0cmlldmluZyBkYXRhIGFzc29jaWF0ZWQgdG8gdGhlIG9wZW5lZAotICogICAgICAgICAgICAgdGhyZWFkLgotICogQG5vdGUgICAgICAgVGhpcyBmdW5jdGlvbiBjcmVhdGVzIHRoZSB0aHJlYWQsIGJ1dCB0aGUgdGhyZWFkIGlzIG5vdCBydW5uaW5nLgotICogQG5vdGUgICAgICAgT25jZSB0aGUgdGhyZWFkIGlzIGNyZWF0ZWQsIHRoZSBzdGF0ZSBpcyBNNE9TQV9rVGhyZWFkT3BlbmVkLgotICogQHBhcmFtICAgICAgY29udGV4dDooT1VUKSBDb250ZXh0IG9mIHRoZSBjcmVhdGVkIHRocmVhZAotICogQHBhcmFtICAgICAgZnVuYzooSU4pICJkb0l0IiBmdW5jdGlvbiBwb2ludGVyIHRvIHJ1bgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKiBAcmV0dXJuICAgICBNNEVSUl9DT05URVhUX0ZBSUxFRDogdGhlIGNvbnRleHQgY3JlYXRpb24gZmFpbGVkCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jT3BlbihNNE9TQV9Db250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RocmVhZERvSXQgZnVuYykKLXsKLSAgIE00T1NBX1RocmVhZENvbnRleHQqIHRocmVhZENvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgTTRPU0FfRVJSIGVycl9jb2RlOwotCi0gICBNNE9TQV9UUkFDRTFfMigiTTRPU0FfdGhyZWFkU3luY09wZW5cdFx0TTRPU0FfQ29udGV4dCogMHgleFx0IgotICAgICAgICAgICAgICAgICAgIk00T1NBX1RocmVhZERvSXQgMHgleCIsIGNvbnRleHQsIGZ1bmMpOwotCi0gICBNNE9TQV9ERUJVR19JRjIoY29udGV4dCA9PSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3RocmVhZFN5bmNPcGVuIik7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMihmdW5jID09IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3RocmVhZFN5bmNPcGVuIik7Ci0KLSAgICpjb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgdGhyZWFkQ29udGV4dCA9Ci0gICAgICAoTTRPU0FfVGhyZWFkQ29udGV4dCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNE9TQV9UaHJlYWRDb250ZXh0KSwKLSAgICAgIE00T1NBX1RIUkVBRCwgKE00T1NBX0NoYXIqKSJNNE9TQV90aHJlYWRTeW5jT3BlbjogdGhyZWFkIGNvbnRleHQiKTsKLQotICAgaWYodGhyZWFkQ29udGV4dCA9PSBNNE9TQV9OVUxMKQotICAgewotICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQUxMT0MsICJNNE9TQV90aHJlYWRTeW5jT3BlbiIpOwotCi0gICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICB9Ci0KLSAgIHRocmVhZENvbnRleHQtPmZ1bmMgPSBmdW5jOwotICAgdGhyZWFkQ29udGV4dC0+c3RhY2tTaXplID0gNjQgKiAxMDI0OwotICAgdGhyZWFkQ29udGV4dC0+bmFtZSA9IE00T1NBX05VTEw7Ci0gICB0aHJlYWRDb250ZXh0LT50aHJlYWRJRCA9IDA7Ci0gICB0aHJlYWRDb250ZXh0LT5jb3JlSUQgPSBNNE9TQV9USFJFQUQ7Ci0gICB0aHJlYWRDb250ZXh0LT5zdGF0ZSA9IE00T1NBX2tUaHJlYWRPcGVuZWQ7Ci0gICB0aHJlYWRDb250ZXh0LT5wcmlvcml0eSA9IE00T1NBX2tUaHJlYWROb3JtYWxQcmlvcml0eSA7Ci0KLSAgIGVycl9jb2RlID0gTTRPU0FfbXV0ZXhPcGVuKCYodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCkpOwotCi0gICBpZihNNE9TQV9FUlJfSVNfRVJST1IoZXJyX2NvZGUpKQotICAgewotICAgICAgTTRPU0FfREVCVUcoZXJyX2NvZGUsICJNNE9TQV90aHJlYWRTeW5jT3BlbjogTTRPU0FfbXV0ZXhPcGVuIik7Ci0KLSAgICAgIHJldHVybiBlcnJfY29kZTsKLSAgIH0KLQotICAgZXJyX2NvZGUgPSBNNE9TQV9zZW1hcGhvcmVPcGVuKCYodGhyZWFkQ29udGV4dC0+c2VtU3RhcnRTdG9wKSwgMCk7Ci0KLSAgIGlmKE00T1NBX0VSUl9JU19FUlJPUihlcnJfY29kZSkpCi0gICB7Ci0gICAgICBNNE9TQV9ERUJVRyhlcnJfY29kZSwgIk00T1NBX3RocmVhZFN5bmNPcGVuOiBNNE9TQV9zZW1hcGhvcmVPcGVuIik7Ci0KLSAgICAgIHJldHVybiBlcnJfY29kZTsKLSAgIH0KLQotICAgKmNvbnRleHQgPSB0aHJlYWRDb250ZXh0OwotCi0gICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIHJ1bnMgYSBzcGVjaWZpZWQgdGhyZWFkLiBUaGUgInBhcmFtIiBwYXJhbWV0ZXIKLSAqICAgICAgICAgICAgIGFsbG93cyB0aGUgYXBwbGljYXRpb24gdG8gc2V0IGEgc3BlY2lmaWMgcGFyYW1ldGVyIHRvIHRoZQotICogICAgICAgICAgICAgY3JlYXRlZCB0aHJlYWQuIFRoaXMgcGFyYW1ldGVyIHdpbGwgYmUgdXNlZCBhcyB0aGUgc2Vjb25kIG9uZSBvZgotICogICAgICAgICAgICAgdGhlICJNNE9TQV9UaHJlYWREb0l0IiBmdW5jdGlvbi4KLSAqIEBub3RlICAgICAgIFRoaXMgbWV0aG9kIGlzIGEgYmxvY2tpbmcgdXAgdG8gdGhlIHRocmVhZCBpcyBydW5uaW5nLgotICogICAgICAgICAgICAgQmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QsIHRoZSBzdGF0ZSBpcyBNNE9TQV9rVGhyZWFkT3BlbmVkLgotICogICAgICAgICAgICAgT25jZSB0aGUgbWV0aG9kIGlzIGNhbGxlZCwgdGhlIHN0YXRlIGlzIE00T1NBX2tUaHJlYWRTdGFydGluZy4KLSAqICAgICAgICAgICAgIE9uY2UgdGhlIHRocmVhZCBpcyBydW5uaW5nLCB0aGUgc3RhdGUgaXMgTTRPU0Ffa1RocmVhZFJ1bm5pbmcuCi0gKiBAbm90ZSAgICAgICBUaGlzIG1ldGhvZCByZXR1cm5zIGltbWVkaWF0ZWx5LiBJZiB0aGUgInRocmVhZFN0YXJ0ZWQiIG9wdGlvbklECi0gKiAgICAgICAgICAgICBpcyBub3QgTlVMTCwgdGhlIHRocmVhZCB3aWxsIGNhbGwgaXQgYmVmb3JlIHJ1bm5pbmcgdGhlIGRvSXQKLSAqICAgICAgICAgICAgIGZ1bmN0aW9uLgotICogQHBhcmFtICAgICAgY29udGV4dDooSU4vT1VUKSBDb250ZXh0IG9mIHRoZSB0aHJlYWQKLSAqIEBwYXJhbSAgICAgIHBhcmFtOihJTikgQXBwbGljYXRpb24gZGF0YSB0aHJlYWQgcGFyYW1ldGVyCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfU1RBVEU6IHRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBub3cKLSAqIEByZXR1cm4gICAgIE00RVJSX1RIUkVBRF9OT1RfU1RBUlRFRDogdGhlIHRocmVhZCBkaWQgbm90IHN0YXJ0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX3RocmVhZFN5bmNTdGFydChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBhcmFtKQotewotICAgTTRPU0FfVGhyZWFkQ29udGV4dCogdGhyZWFkQ29udGV4dCA9ICAoTTRPU0FfVGhyZWFkQ29udGV4dCopY29udGV4dDsKLSAgIHB0aHJlYWRfYXR0cl90ICAgICBhdHRyaWJ1dGUgPSB7IDAsIDAsIDAsIDAsIDAsIDAgfTsKLSAgIGludCAgICAgICAgICAgICAgICBtaW4gICAgICAgPSAwOwotICAgaW50ICAgICAgICAgICAgICAgIG1heCAgICAgICA9IDA7Ci0gICBpbnQgICAgICAgICAgICAgICAgcHJpb3JpdHkgID0gMDsKLSAgIHN0cnVjdCBzY2hlZF9wYXJhbSBzY2hlZCAgICAgPSB7IDAgfTsKLQotICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX3RocmVhZFN5bmNTdGFydFx0XHRNNE9TQV9Db250ZXh0IDB4JXhcdE00T1NBX1ZvaWQqICIKLSAgICAgICAgICAgICAgICAgICIweCV4IiwgY29udGV4dCwgcGFyYW0pOwotCi0gICBNNE9TQV9ERUJVR19JRjIoY29udGV4dCA9PSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3RocmVhZFN5bmNTdGFydCIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIodGhyZWFkQ29udGV4dC0+Y29yZUlEICE9IE00T1NBX1RIUkVBRCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX3RocmVhZFN5bmNTdGFydCIpOwotCi0gICBNNE9TQV9tdXRleExvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLQotICAgaWYodGhyZWFkQ29udGV4dC0+c3RhdGUgIT0gTTRPU0Ffa1RocmVhZE9wZW5lZCkKLSAgIHsKLSAgICAgIE00T1NBX211dGV4VW5sb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpOwotCi0gICAgICBNNE9TQV9ERUJVRyhNNEVSUl9TVEFURSwgIk00T1NBX3RocmVhZFN5bmNTdGFydCIpOwotCi0gICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICB9Ci0KLSAgIHRocmVhZENvbnRleHQtPnN0YXRlID0gTTRPU0Ffa1RocmVhZFN0YXJ0aW5nOwotCi0gICBNNE9TQV9tdXRleFVubG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKLSAgIHRocmVhZENvbnRleHQtPnBhcmFtID0gcGFyYW07Ci0KLSAgIGlmICggMCA9PSBwdGhyZWFkX2F0dHJfaW5pdCggJmF0dHJpYnV0ZSApICkKLSAgIHsKLSAgICAgIGlmICggMCA9PSBwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUoICZhdHRyaWJ1dGUsIFBUSFJFQURfQ1JFQVRFX0RFVEFDSEVEICkgKQotICAgICAgewotICAgICAgICAgaWYgKCAwID09IHB0aHJlYWRfYXR0cl9zZXRzdGFja3NpemUoICZhdHRyaWJ1dGUsIChzaXplX3QpdGhyZWFkQ29udGV4dC0+c3RhY2tTaXplICkgKQotICAgICAgICAgewotICAgICAgICAgICAgaWYgKCAwID09IHB0aHJlYWRfYXR0cl9zZXRzY2hlZHBvbGljeSggJmF0dHJpYnV0ZSwgU0NIRURfT1RIRVIgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogVGVudGF0aXZlIHBhdGNoZXMgdG8gaGFuZGxlIHByaW9yaXRpZXMgaW4gYSBiZXR0ZXIgd2F5IDogKi8KLSAgICAgICAgICAgICAgICAvKiBVc2UgQW5kcm9pZCdzIHByZWRlZmluZWQgcHJpb3JpdGllcyAocmFuZ2UgKzE5Li4tMjApCi0gICAgICAgICAgICAgICAgICpyYXRoZXIgdGhhbiBMaW51eCBvbmVzICgwLi45OSkqLwotCi0gICAgICAgICAgICAgICAgLyogR2V0IG1pbiBhbmQgbWF4IHByaW9yaXRpZXMgKi8KLSAgICAgICAgICAgICAgICBtaW4gPSBzY2hlZF9nZXRfcHJpb3JpdHlfbWluKCBTQ0hFRF9GSUZPICk7Ci0gICAgICAgICAgICAgICAgbWF4ID0gc2NoZWRfZ2V0X3ByaW9yaXR5X21heCggU0NIRURfRklGTyApOwotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX3RocmVhZFN5bmNTdGFydCBNQVg9JWQgTUlOPSVkIiwgbWF4LCBtaW4pOwotCi0gICAgICAgICAgICAgICAgLyogdGVudGF0aXZlIG1vZGlmaWNhdGlvbiBvZiB0aGUgcHJpb3JpdGllcyAqLwotICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgcHJpb3JpdHkgYmFzZWQgb24gZGVmYXVsdCBhbmRyb2lkIHByaW9yaXRpZXMgKi8KLSAgICAgICAgICAgICAgICAvKiBUaGlzIHByb2JhYmx5IHJlcXVpcmVzIHNvbWUgbW9yZSB0dW5pbmcsCi0gICAgICAgICAgICAgICAgICogb3V0Y29tZSBvZiB0aGlzIHByaW9yaXR5IHNldHRpbmdzIGFyZSBub3QgeWV0IHNhdGlzZmFjdG9yeSAqLwotICAgICAgICAgICAgICAgIC8qIEltcGxlbWVudGluZyB0aHJlYWQgaGFuZGxpbmcgYmFzZWQgb24gQW5kcm9pZCdzIHRocmVhZCBjcmVhdGlvbgotICAgICAgICAgICAgICAgICAqIGhlbHBlcnMgbWlnaHQgYnJpbmcgc29tZSBpbXByb3ZlbWVudCAoc2VlIHRocmVhZHMuaCkgKi8KLSAgICAgICAgICAgICAgICBzd2l0Y2godGhyZWFkQ29udGV4dC0+cHJpb3JpdHkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgTTRPU0Ffa1RocmVhZExvd2VzdFByaW9yaXR5OgotICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSA9IEFORFJPSURfUFJJT1JJVFlfTk9STUFMOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE00T1NBX2tUaHJlYWRMb3dQcmlvcml0eToKLSAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHkgPSBBTkRST0lEX1BSSU9SSVRZX0RJU1BMQVk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTTRPU0Ffa1RocmVhZE5vcm1hbFByaW9yaXR5OgotICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSA9IEFORFJPSURfUFJJT1JJVFlfVVJHRU5UX0RJU1BMQVk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTTRPU0Ffa1RocmVhZEhpZ2hQcmlvcml0eToKLSAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHkgPSBBTkRST0lEX1BSSU9SSVRZX0FVRElPOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE00T1NBX2tUaHJlYWRIaWdoZXN0UHJpb3JpdHk6Ci0gICAgICAgICAgICAgICAgICAgIHByaW9yaXR5ID0gQU5EUk9JRF9QUklPUklUWV9VUkdFTlRfQVVESU87Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzY2hlZC5zY2hlZF9wcmlvcml0eSA9IHByaW9yaXR5OwotCi0gICAgICAgICAgICAgICAgaWYgKCAwID09IHB0aHJlYWRfYXR0cl9zZXRzY2hlZHBhcmFtKCAmYXR0cmlidXRlLCAmc2NoZWQgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoIDAgPT0gcHRocmVhZF9jcmVhdGUoICZ0aHJlYWRDb250ZXh0LT50aHJlYWRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZNNE9TQV90aHJlYWRTeW5jRm9yRXZlckRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopdGhyZWFkQ29udGV4dCApICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBNNE9TQV9GQUxTRSA9PSBNNE9TQV9FUlJfSVNfRVJST1IoIE00T1NBX3NlbWFwaG9yZVdhaXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZENvbnRleHQtPnNlbVN0YXJ0U3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfV0FJVF9GT1JFVkVSICkgKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBwdGhyZWFkX2F0dHJfZGVzdHJveSggJmF0dHJpYnV0ZSApOwotICAgfQotCi0gICBNNE9TQV9tdXRleExvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLQotICAgdGhyZWFkQ29udGV4dC0+c3RhdGUgPSBNNE9TQV9rVGhyZWFkT3BlbmVkOwotCi0gICBNNE9TQV9tdXRleFVubG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKLQotICAgTTRPU0FfREVCVUcoTTRFUlJfVEhSRUFEX05PVF9TVEFSVEVELCAiTTRPU0FfdGhyZWFkU3luY1N0YXJ0Iik7Ci0KLSAgIHJldHVybiBNNEVSUl9USFJFQURfTk9UX1NUQVJURUQ7Ci19Ci0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBtZXRob2Qgc3RvcHMgYSBzcGVjaWZpZWQgdGhyZWFkLgotICogQG5vdGUgICAgICAgVGhpcyBjYWxsIGlzIGEgYmxvY2tpbmcgb25lIHVwIHRvIHRoZSAiTTRPU0FfVGhyZWFkRG9JdCIKLSAqICAgICAgICAgICAgIGZ1bmN0aW9uIGhhcyByZXR1cm5lZC4KLSAqICAgICAgICAgICAgIEJlZm9yZSB0aGUgbWV0aG9kIGlzIGNhbGxlZCwgdGhlIHN0YXRlIGlzIE00T1NBX2tUaHJlYWRSdW5uaW5nLgotICogICAgICAgICAgICAgT25jZSB0aGUgbWV0aG9kIGlzIGNhbGxlZCwgdGhlIHN0YXRlIGlzIE00T1NBX2tUaHJlYWRTdG9wcGluZy4KLSAqICAgICAgICAgICAgIE9uY2UgdGhlIHRocmVhZCBpcyBzdG9wcGVkLCB0aGUgc3RhdGUgaXMgTTRPU0Ffa1RocmVhZE9wZW5lZC4KLSAqIEBub3RlICAgICAgIFRoaXMgbWV0aG9kIHJldHVybnMgb25jZSB0aGUgdGhyZWFkIGhhcyBiZWVuIHN0b3BwZWQuIElmIHRoZQotICogICAgICAgICAgICAgInRocmVhZFN0b3BwZWQiIG9wdGlvbklEIGlzIG5vdCBOVUxMLCB0aGUgdGhyZWFkIHdpbGwgY2FsbCBpdAotICogICAgICAgICAgICAgYmVmb3JlIGR5aW5nLgotICogQHBhcmFtICAgICAgY29udGV4dDooSU4vT1VUKSBDb250ZXh0IG9mIHRoZSB0aHJlYWQKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfU1RBVEU6IHRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBub3cKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jU3RvcChNNE9TQV9Db250ZXh0IGNvbnRleHQpCi17Ci0gICBNNE9TQV9UaHJlYWRDb250ZXh0KiB0aHJlYWRDb250ZXh0ID0gKE00T1NBX1RocmVhZENvbnRleHQqKWNvbnRleHQ7Ci0KLSAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV90aHJlYWRTeW5jU3RvcFx0XHRNNE9TQV9Db250ZXh0IDB4JXgiLCBjb250ZXh0KTsKLQotICAgTTRPU0FfREVCVUdfSUYyKGNvbnRleHQgPT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV90aHJlYWRTeW5jU3RvcCIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIodGhyZWFkQ29udGV4dC0+Y29yZUlEICE9IE00T1NBX1RIUkVBRCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX3RocmVhZFN5bmNTdG9wIik7Ci0KLSAgIE00T1NBX211dGV4TG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotCi0gICBpZih0aHJlYWRDb250ZXh0LT5zdGF0ZSAhPSBNNE9TQV9rVGhyZWFkUnVubmluZykKLSAgIHsKLSAgICAgIE00T1NBX211dGV4VW5sb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpOwotCi0gICAgICBNNE9TQV9ERUJVRyhNNEVSUl9TVEFURSwgIk00T1NBX3RocmVhZFN5bmNTdG9wIik7Ci0KLSAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgIH0KLQotICAgdGhyZWFkQ29udGV4dC0+c3RhdGUgPSBNNE9TQV9rVGhyZWFkU3RvcHBpbmc7Ci0KLSAgIE00T1NBX211dGV4VW5sb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpOwotCi0gICBNNE9TQV9zZW1hcGhvcmVXYWl0KHRocmVhZENvbnRleHQtPnNlbVN0YXJ0U3RvcCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLQotICAgTTRPU0FfbXV0ZXhMb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0KLSAgIHRocmVhZENvbnRleHQtPnN0YXRlID0gTTRPU0Ffa1RocmVhZE9wZW5lZDsKLQotICAgTTRPU0FfbXV0ZXhVbmxvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCk7Ci0KLSAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIGRlbGV0ZXMgYSB0aHJlYWQgKGlkZW50aWZpZWQgYnkgaXRzIGNvbnRleHQpLiBBZnRlcgotICogICAgICAgICAgICAgdGhpcyBjYWxsIHRoZSB0aHJlYWQgYW5kIGl0cyBjb250ZXh0IGFyZSBubyBtb3JlIHVzZWFibGUuIFRoaXMKLSAqICAgICAgICAgICAgIGZ1bmN0aW9uIGZyZWVzIGFsbCB0aGUgbWVtb3J5IHJlbGF0ZWQgdG8gdGhpcyB0aHJlYWQuCi0gKiBAbm90ZSAgICAgICBCZWZvcmUgdGhlIG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBzdGF0ZSBpcyBNNE9TQV9rVGhyZWFkT3BlbmVkLgotICogICAgICAgICAgICAgT25jZSB0aGUgbWV0aG9kIGlzIGNhbGxlZCwgdGhlIHN0YXRlIGlzIE00T1NBX2tUaHJlYWRDbG9zZWQuCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OihJTi9PVVQpIENvbnRleHQgb2YgdGhlIHRocmVhZAotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9TVEFURTogdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIG5vdwotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX3RocmVhZFN5bmNDbG9zZShNNE9TQV9Db250ZXh0IGNvbnRleHQpCi17Ci0gICBNNE9TQV9UaHJlYWRDb250ZXh0KiB0aHJlYWRDb250ZXh0ID0gKE00T1NBX1RocmVhZENvbnRleHQqKWNvbnRleHQ7Ci0gICBNNE9TQV9FUlIgZXJyX2NvZGU7Ci0KLSAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV90aHJlYWRTeW5jQ2xvc2VcdFx0TTRPU0FfQ29udGV4dCAweCV4IiwgY29udGV4dCk7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMihjb250ZXh0ID09IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfdGhyZWFkU3luY0Nsb3NlIik7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMih0aHJlYWRDb250ZXh0LT5jb3JlSUQgIT0gTTRPU0FfVEhSRUFELAotICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfdGhyZWFkU3luY0Nsb3NlIik7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMih0aHJlYWRDb250ZXh0LT5zdGF0ZSA9PSBNNE9TQV9rVGhyZWFkQ2xvc2VkLAotICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfdGhyZWFkU3luY0Nsb3NlIik7Ci0KLSAgIE00T1NBX211dGV4TG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotCi0gICBpZih0aHJlYWRDb250ZXh0LT5zdGF0ZSAhPSBNNE9TQV9rVGhyZWFkT3BlbmVkKQotICAgewotICAgICAgTTRPU0FfbXV0ZXhVbmxvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCk7Ci0KLSAgICAgIE00T1NBX0RFQlVHKE00RVJSX1NUQVRFLCAiTTRPU0FfdGhyZWFkU3luY0Nsb3NlIik7Ci0KLSAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgIH0KLQotICAgdGhyZWFkQ29udGV4dC0+c3RhdGUgPSBNNE9TQV9rVGhyZWFkQ2xvc2VkOwotCi0gICBNNE9TQV9tdXRleFVubG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKLQotICAgZXJyX2NvZGUgPSBNNE9TQV9tdXRleENsb3NlKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpOwotCi0gICBpZihNNE9TQV9FUlJfSVNfRVJST1IoZXJyX2NvZGUpKQotICAgewotICAgICAgTTRPU0FfREVCVUcoZXJyX2NvZGUsICJNNE9TQV90aHJlYWRTeW5jQ2xvc2U6IE00T1NBX211dGV4Q2xvc2UiKTsKLQotICAgICAgcmV0dXJuIGVycl9jb2RlOwotICAgfQotCi0gICBlcnJfY29kZSA9IE00T1NBX3NlbWFwaG9yZUNsb3NlKHRocmVhZENvbnRleHQtPnNlbVN0YXJ0U3RvcCk7Ci0KLSAgIGlmKE00T1NBX0VSUl9JU19FUlJPUihlcnJfY29kZSkpCi0gICB7Ci0gICAgICBNNE9TQV9ERUJVRyhlcnJfY29kZSwgIk00T1NBX3RocmVhZFN5bmNDbG9zZTogTTRPU0Ffc2VtYXBob3JlQ2xvc2UiKTsKLQotICAgICAgcmV0dXJuIGVycl9jb2RlOwotICAgfQotCi0gICBpZih0aHJlYWRDb250ZXh0LT5uYW1lICE9IE00T1NBX05VTEwpCi0gICB7Ci0gICAgICBmcmVlKHRocmVhZENvbnRleHQtPm5hbWUpOwotICAgfQotCi0gICBmcmVlKHRocmVhZENvbnRleHQpOwotCi0gICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIG1ldGhvZCBhc2tzIHRoZSB0aHJlYWQgdG8gcmV0dXJuIGl0cyBzdGF0ZS4KLSAqIEBub3RlICAgICAgIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcvZGVhbGxvY2F0aW5nIHRoZSBzdGF0ZQotICogICAgICAgICAgICAgZmllbGQuCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OihJTikgQ29udGV4dCBvZiB0aGUgdGhyZWFkCi0gKiBAcGFyYW0gICAgICBzdGF0ZTooT1VUKSBUaHJlYWQgc3RhdGUKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX3RocmVhZFN5bmNHZXRTdGF0ZShNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RocmVhZFN0YXRlKiBzdGF0ZSkKLXsKLSAgIE00T1NBX1RocmVhZENvbnRleHQqIHRocmVhZENvbnRleHQgPSAoTTRPU0FfVGhyZWFkQ29udGV4dCopY29udGV4dDsKLQotICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX3RocmVhZFN5bmNHZXRTdGF0ZVx0XHRNNE9TQV9Db250ZXh0IDB4JXhcdCIKLSAgICAgICAgICAgICAgICAgICJNNE9TQV9UaHJlYWRTdGF0ZSogMHgleCIsIGNvbnRleHQsIHN0YXRlKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKGNvbnRleHQgPT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV90aHJlYWRTeW5jR2V0U3RhdGUiKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKHN0YXRlID09IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfdGhyZWFkU3luY0dldFN0YXRlIik7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMih0aHJlYWRDb250ZXh0LT5jb3JlSUQgIT0gTTRPU0FfVEhSRUFELAotICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfdGhyZWFkU3luY0dldFN0YXRlIik7Ci0KLSAgICpzdGF0ZSA9IHRocmVhZENvbnRleHQtPnN0YXRlOwotCi0gICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIG1ldGhvZCBhc2tzIHRoZSBjYWxsaW5nIHRocmVhZCB0byBzbGVlcCBkdXJpbmcgInRpbWVTbGVlcCIKLSAqICAgICAgICAgICAgIG1pbGxpc2Vjb25kcy4KLSAqIEBub3RlICAgICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaGF2ZSBhbnkgY29udGV4dC4KLSAqIEBwYXJhbSAgICAgIHRpbWU6KElOKSBUaW1lIHRvIHNsZWVwIGluIG1pbGxpc2Vjb25kcwotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfdGhyZWFkU2xlZXAoTTRPU0FfVUludDMyIHRpbWUpCi17Ci0gICBzdHJ1Y3QgdGltZXNwZWMgcnF0cCA9IHsgMCwgMCB9OwotICAgc3RydWN0IHRpbWVzcGVjIHJtdHAgPSB7IDAsIDAgfTsKLQotICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX3RocmVhZFNsZWVwXHRcdE00T1NBX1VJbnQzMiAlZCIsIHRpbWUpOwotCi0gICBycXRwLnR2X3NlYyA9ICh0aW1lX3QpdGltZS8xMDAwOwotICAgcnF0cC50dl9uc2VjID0gKHRpbWUlMTAwMCkgKiAxMDAwMDAwOwotICAgbmFub3NsZWVwKCZycXRwLCAmcm10cCk7Ci0KLSAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0jaWYoTTRPU0FfT1BUSU9OSURfVEhSRUFEX1BSSU9SSVRZID09IE00T1NBX1RSVUUpCi0KLU00T1NBX0VSUiBNNE9TQV9TZXRUaHJlYWRTeW5jUHJpb3JpdHkoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpCi17Ci0gICBNNE9TQV9UaHJlYWRDb250ZXh0KiB0aHJlYWRDb250ZXh0ID0gKE00T1NBX1RocmVhZENvbnRleHQqKWNvbnRleHQ7Ci0gICBNNE9TQV9UaHJlYWRQcmlvcml0eUxldmVsIHByaW9yaXR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IChNNE9TQV9UaHJlYWRQcmlvcml0eUxldmVsKShvcHRpb25WYWx1ZSk7Ci0KLSAgIE00T1NBX1RSQUNFMl8yKCJNNE9TQV9TZXRUaHJlYWRTeW5jUHJpb3JpdHlcdFx0TTRPU0FfQ29udGV4dCAweCV4XHQiCi0gICAgICAgICAgICAgICAgICAiTTRPU0FfRGF0YU9wdGlvbiAweCV4IiwgY29udGV4dCwgb3B0aW9uVmFsdWUpOwotCi0gICBpZigoTTRPU0FfVUludDMyKW9wdGlvblZhbHVlPk00T1NBX2tUaHJlYWRMb3dlc3RQcmlvcml0eSkKLSAgIHsKLSAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICB9Ci0KLSAgIHRocmVhZENvbnRleHQtPnByaW9yaXR5ID0gcHJpb3JpdHk7Ci0KLSAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9USFJFQURfUFJJT1JJVFkqLwotCi0KLQotCi0jaWYoTTRPU0FfT1BUSU9OSURfVEhSRUFEX05BTUUgPT0gTTRPU0FfVFJVRSkKLQotTTRPU0FfRVJSIE00T1NBX1NldFRocmVhZFN5bmNOYW1lKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpCi17Ci0gICBNNE9TQV9UaHJlYWRDb250ZXh0KiB0aHJlYWRDb250ZXh0ID0gKE00T1NBX1RocmVhZENvbnRleHQqKWNvbnRleHQ7Ci0gICBNNE9TQV9DaGFyKiBuYW1lID0gKE00T1NBX0NoYXIqKW9wdGlvblZhbHVlOwotICAgTTRPU0FfVUludDMyIG5hbWVTaXplIDsKLQotICAgTTRPU0FfVFJBQ0UyXzIoIk00T1NBX1NldFRocmVhZFN5bmNOYW1lXHRcdE00T1NBX0NvbnRleHQgMHgleFx0IgotICAgICAgICAgICAgICAgICAgIk00T1NBX0RhdGFPcHRpb24gMHgleCIsIGNvbnRleHQsIG9wdGlvblZhbHVlKTsKLQotICAgaWYodGhyZWFkQ29udGV4dC0+bmFtZSAhPSBOVUxMKQotICAgewotICAgICAgZnJlZSh0aHJlYWRDb250ZXh0LT5uYW1lKTsKLSAgICAgIHRocmVhZENvbnRleHQtPm5hbWUgPSBNNE9TQV9OVUxMOwotICAgfQotCi0gICBpZihvcHRpb25WYWx1ZSAhPSBNNE9TQV9OVUxMKQotICAgewotICAgICAgbmFtZVNpemUgPSBzdHJsZW4oKGNvbnN0IGNoYXIgKiluYW1lKSsxOwotCi0gICAgICB0aHJlYWRDb250ZXh0LT5uYW1lID0KLSAgICAgICAgIChNNE9TQV9DaGFyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MobmFtZVNpemUsIE00T1NBX1RIUkVBRCwKLSAgICAgICAgIChNNE9TQV9DaGFyKikiTTRPU0FfU2V0VGhyZWFkU3luY05hbWU6IHRocmVhZCBuYW1lIik7Ci0KLSAgICAgIGlmKHRocmVhZENvbnRleHQgPT0gTTRPU0FfTlVMTCkKLSAgICAgIHsKLSAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgIH0KLQotICAgICAgbWVtY3B5KCh2b2lkICopdGhyZWFkQ29udGV4dC0+bmFtZSwgKHZvaWQgKiluYW1lLAotICAgICAgICAgICAgICAgICAgIG5hbWVTaXplKTsKLSAgIH0KLQotICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX1RIUkVBRF9OQU1FKi8KLQotCi0jaWYoTTRPU0FfT1BUSU9OSURfVEhSRUFEX1NUQUNLX1NJWkUgPT0gTTRPU0FfVFJVRSkKLQotTTRPU0FfRVJSIE00T1NBX1NldFRocmVhZFN5bmNTdGFja1NpemUoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKQotewotICAgTTRPU0FfVGhyZWFkQ29udGV4dCogdGhyZWFkQ29udGV4dCA9IChNNE9TQV9UaHJlYWRDb250ZXh0Kiljb250ZXh0OwotCi0gICBNNE9TQV9UUkFDRTJfMigiTTRPU0FfU2V0VGhyZWFkU3luY1N0YWNrU2l6ZVx0XHRNNE9TQV9Db250ZXh0IDB4JXhcdCIKLSAgICAgICAgICAgICAgICAgICJNNE9TQV9EYXRhT3B0aW9uIDB4JXgiLCBjb250ZXh0LCBvcHRpb25WYWx1ZSk7Ci0KLSAgIHRocmVhZENvbnRleHQtPnN0YWNrU2l6ZSA9IChNNE9TQV9VSW50MzIpb3B0aW9uVmFsdWU7Ci0KLSAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9USFJFQURfU1RBQ0tfU0laRSovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBtZXRob2QgYXNrcyB0aGUgY29yZSBPU0FMLVRocmVhZCBjb21wb25lbnQgdG8gc2V0IHRoZSB2YWx1ZQotICogICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcHRpb25JRC4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IKLSAqICAgICAgICAgICAgIGFsbG9jYXRpbmcvZGVhbGxvY2F0aW5nIHRoZSBtZW1vcnkgb2YgdGhlIHZhbHVlIGZpZWxkLgotICogQG5vdGUgICAgICAgQXMgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBvZiBhbGxvY2F0aW5nL2RlLWFsbG9jYXRpbmcgdGhlCi0gKiAgICAgICAgICAgICAidmFsdWUiIGZpZWxkLCB0aGUgY2FsbGVlIG11c3QgY29weSB0aGlzIGZpZWxkIHRvIGl0cyBpbnRlcm5hbAotICogICAgICAgICAgICAgdmFyaWFibGUuCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OihJTi9PVVQpIENvbnRleHQgb2YgdGhlIHRocmVhZAotICogQHBhcmFtICAgICAgb3B0aW9uSUQ6KElOKSBJRCBvZiB0aGUgb3B0aW9uCi0gKiBAcGFyYW0gICAgICBvcHRpb25WYWx1ZTooSU4pIFZhbHVlIG9mIHRoZSBvcHRpb24KLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfT1BUSU9OX0lEOiB0aGUgb3B0aW9uSUQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9TVEFURTogdGhpcyBvcHRpb24gaXMgbm90IGF2YWlsYWJsZSBub3cKLSAqIEByZXR1cm4gICAgIE00RVJSX1JFQURfT05MWTogdGhpcyBvcHRpb24gaXMgYSByZWFkIG9ubHkgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQ6IHRoaXMgb3B0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jU2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RocmVhZE9wdGlvbklEIG9wdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSkKLXsKLSAgIE00T1NBX1RocmVhZENvbnRleHQqIHRocmVhZENvbnRleHQgPSAoTTRPU0FfVGhyZWFkQ29udGV4dCopY29udGV4dDsKLSAgIE00T1NBX0VSUiBlcnJfY29kZTsKLQotICAgTTRPU0FfVFJBQ0UxXzMoIk00T1NBX3RocmVhZFN5bmNTZXRPcHRpb25cdFx0TTRPU0FfQ29udGV4dCAweCV4XHQiCi0gICAgICAgICAgICAgICAgICAiTTRPU0FfT3B0aW9uSUQgJWRcdE00T1NBX0RhdGFPcHRpb24gMHgleCIsCi0gICAgICAgICAgICAgICAgICBjb250ZXh0LCBvcHRpb25JRCwgb3B0aW9uVmFsdWUpOwotCi0gICBNNE9TQV9ERUJVR19JRjIoY29udGV4dCA9PSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3RocmVhZFN5bmNTZXRPcHRpb24iKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKG9wdGlvbklEID09IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfdGhyZWFkU3luY1NldE9wdGlvbiIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIodGhyZWFkQ29udGV4dC0+Y29yZUlEICE9IE00T1NBX1RIUkVBRCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX3RocmVhZFN5bmNTZXRPcHRpb24iKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKCFNNE9TQV9PUFRJT05fSURfSVNfQ09SRUlEKG9wdGlvbklELCBNNE9TQV9USFJFQUQpLAotICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9PUFRJT05fSUQsICJNNE9TQV90aHJlYWRTeW5jU2V0T3B0aW9uIik7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMighTTRPU0FfT1BUSU9OX0lEX0lTX1dSSVRBQkxFKG9wdGlvbklEKSwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9SRUFEX09OTFksICJNNE9TQV90aHJlYWRTeW5jU2V0T3B0aW9uIik7Ci0KLQotICAgTTRPU0FfbXV0ZXhMb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0KLSAgIGlmKHRocmVhZENvbnRleHQtPnN0YXRlICE9IE00T1NBX2tUaHJlYWRPcGVuZWQpCi0gICB7Ci0gICAgICBNNE9TQV9tdXRleFVubG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKLQotICAgICAgTTRPU0FfREVCVUcoTTRFUlJfU1RBVEUsICJNNE9TQV90aHJlYWRTeW5jU2V0T3B0aW9uIik7Ci0KLSAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgIH0KLQotICAgc3dpdGNoKG9wdGlvbklEKQotICAgewotCi0jaWYoTTRPU0FfT1BUSU9OSURfVEhSRUFEX1BSSU9SSVRZID09IE00T1NBX1RSVUUpCi0gICAgICBjYXNlIE00T1NBX1RocmVhZFByaW9yaXR5OgotICAgICAgewotICAgICAgICAgZXJyX2NvZGUgPSBNNE9TQV9TZXRUaHJlYWRTeW5jUHJpb3JpdHkoY29udGV4dCwgb3B0aW9uVmFsdWUpOwotCi0gICAgICAgICBicmVhazsKLSAgICAgIH0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX1RIUkVBRF9QUklPUklUWSovCi0KLSNpZihNNE9TQV9PUFRJT05JRF9USFJFQURfTkFNRSA9PSBNNE9TQV9UUlVFKQotICAgICAgY2FzZSBNNE9TQV9UaHJlYWROYW1lOgotICAgICAgewotICAgICAgICAgZXJyX2NvZGUgPSBNNE9TQV9TZXRUaHJlYWRTeW5jTmFtZShjb250ZXh0LCBvcHRpb25WYWx1ZSk7Ci0KLSAgICAgICAgIGJyZWFrOwotICAgICAgfQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfVEhSRUFEX05BTUUqLwotCi0jaWYoTTRPU0FfT1BUSU9OSURfVEhSRUFEX1NUQUNLX1NJWkUgPT0gTTRPU0FfVFJVRSkKLSAgICAgIGNhc2UgTTRPU0FfVGhyZWFkU3RhY2tTaXplOgotICAgICAgewotICAgICAgICAgZXJyX2NvZGUgPSBNNE9TQV9TZXRUaHJlYWRTeW5jU3RhY2tTaXplKGNvbnRleHQsIG9wdGlvblZhbHVlKTsKLQotICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9USFJFQURfU1RBQ0tfU0laRSovCi0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICB7Ci0gICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9OT1RfSU1QTEVNRU5URUQsICJNNE9TQV90aHJlYWRTeW5jU2V0T3B0aW9uIik7Ci0KLSAgICAgICAgIGVycl9jb2RlID0gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotICAgICAgfQotICAgfQotCi0gICBNNE9TQV9tdXRleFVubG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKLQotICAgcmV0dXJuIGVycl9jb2RlOwotfQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIG1ldGhvZCBhc2tzIHRoZSBPU0FMLVRocmVhZCB0byByZXR1cm4gdGhlIHZhbHVlIGFzc29jaWF0ZWQKLSAqICAgICAgICAgICAgIHdpdGggdGhlIG9wdGlvbklELiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvcgotICogICAgICAgICAgICAgYWxsb2NhdGluZy9kZWFsbG9jYXRpbmcgdGhlIG1lbW9yeSBvZiB0aGUgdmFsdWUgZmllbGQuCi0gKiBAbm90ZSAgICAgICAib3B0aW9uVmFsdWUiIG11c3QgYmUgY2FzdCBhY2NvcmRpbmcgdG8gdGhlIHR5cGUgcmVsYXRlZCB0byB0aGUKLSAqICAgICAgICAgICAgIG9wdGlvbklELgotICogQG5vdGUgICAgICAgQXMgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGUtYWxsb2NhdGluZyB0aGUgInZhbHVlIgotICogICAgICAgICAgICAgZmllbGQsIHRoZSBjb3JlIE9TQUwtVGhyZWFkIGNvbXBvbmVudCBtdXN0IHBlcmZvcm0gYSBjb3B5IG9mIGl0cwotICogICAgICAgICAgICAgaW50ZXJuYWwgdmFsdWUgdG8gdGhlIHZhbHVlIGZpZWxkLgotICogQHBhcmFtICAgICAgY29udGV4dDooSU4pIENvbnRleHQgb2YgdGhlIHRocmVhZAotICogQHBhcmFtICAgICAgb3B0aW9uSUQ6KElOKSBJRCBvZiB0aGUgb3B0aW9uCi0gKiBAcGFyYW0gICAgICBvcHRpb25WYWx1ZTooT1VUKSBWYWx1ZSBvZiB0aGUgb3B0aW9uCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfQkFEX09QVElPTl9JRDogdGhlIG9wdGlvbklEIGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfV1JJVEVfT05MWTogdGhpcyBvcHRpb24gaXMgYSB3cml0ZSBvbmx5IG9uZQotICogQHJldHVybiAgICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEOiB0aGlzIG9wdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfdGhyZWFkU3luY0dldE9wdGlvbihNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UaHJlYWRPcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24qIG9wdGlvblZhbHVlKQotewotICAgTTRPU0FfVGhyZWFkQ29udGV4dCogdGhyZWFkQ29udGV4dCA9IChNNE9TQV9UaHJlYWRDb250ZXh0Kiljb250ZXh0OwotCi0gICBNNE9TQV9UUkFDRTFfMygiTTRPU0FfdGhyZWFkU3luY0dldE9wdGlvblx0XHRNNE9TQV9Db250ZXh0IDB4JXhcdCIKLSAgICAgICAgICAgICAgICAgICJNNE9TQV9PcHRpb25JRCAlZFx0TTRPU0FfRGF0YU9wdGlvbiogMHgleCIsCi0gICAgICAgICAgICAgICAgICBjb250ZXh0LCBvcHRpb25JRCwgb3B0aW9uVmFsdWUpOwotCi0gICBNNE9TQV9ERUJVR19JRjIoY29udGV4dCA9PSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3RocmVhZFN5bmNHZXRPcHRpb24iKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKG9wdGlvbklEID09IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfdGhyZWFkU3luY0dldE9wdGlvbiIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIob3B0aW9uVmFsdWUgPT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV90aHJlYWRTeW5jR2V0T3B0aW9uIik7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMih0aHJlYWRDb250ZXh0LT5jb3JlSUQgIT0gTTRPU0FfVEhSRUFELAotICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfdGhyZWFkU3luY0dldE9wdGlvbiIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIoIU00T1NBX09QVElPTl9JRF9JU19DT1JFSUQob3B0aW9uSUQsIE00T1NBX1RIUkVBRCksCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX09QVElPTl9JRCwgIk00T1NBX3RocmVhZFN5bmNHZXRPcHRpb24iKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKCFNNE9TQV9PUFRJT05fSURfSVNfUkVBREFCTEUob3B0aW9uSUQpLAotICAgICAgICAgICAgICAgICAgIE00RVJSX1dSSVRFX09OTFksICJNNE9TQV90aHJlYWRTeW5jR2V0T3B0aW9uIik7Ci0KLSAgIHN3aXRjaChvcHRpb25JRCkKLSAgIHsKLQotI2lmKE00T1NBX09QVElPTklEX1RIUkVBRF9QUklPUklUWSA9PSBNNE9TQV9UUlVFKQotICAgICAgY2FzZSBNNE9TQV9UaHJlYWRQcmlvcml0eToKLSAgICAgIHsKLSAgICAgICAgIE00T1NBX1RocmVhZFByaW9yaXR5TGV2ZWwqIHByaW9yaXR5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9UaHJlYWRQcmlvcml0eUxldmVsKilvcHRpb25WYWx1ZTsKLQotICAgICAgICAgKnByaW9yaXR5ID0gdGhyZWFkQ29udGV4dC0+cHJpb3JpdHk7Ci0KLSAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgfQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfVEhSRUFEX1BSSU9SSVRZKi8KLQotI2lmKE00T1NBX09QVElPTklEX1RIUkVBRF9OQU1FID09IE00T1NBX1RSVUUpCi0gICAgICBjYXNlIE00T1NBX1RocmVhZE5hbWU6Ci0gICAgICB7Ci0gICAgICAgICBNNE9TQV9DaGFyKiogbmFtZSA9IChNNE9TQV9DaGFyKiopb3B0aW9uVmFsdWU7Ci0KLSAgICAgICAgICpuYW1lID0gdGhyZWFkQ29udGV4dC0+bmFtZTsKLQotICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICB9Ci0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9USFJFQURfTkFNRSovCi0KLSNpZihNNE9TQV9PUFRJT05JRF9USFJFQURfU1RBQ0tfU0laRSA9PSBNNE9TQV9UUlVFKQotICAgICAgY2FzZSBNNE9TQV9UaHJlYWRTdGFja1NpemU6Ci0gICAgICB7Ci0gICAgICAgICBNNE9TQV9VSW50MzIqIHN0YWNrU2l6ZSA9IChNNE9TQV9VSW50MzIqKW9wdGlvblZhbHVlOwotCi0gICAgICAgICAqc3RhY2tTaXplID0gdGhyZWFkQ29udGV4dC0+c3RhY2tTaXplOwotCi0gICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgIH0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX1RIUkVBRF9TVEFDS19TSVpFKi8KLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICB9Ci0KLSAgIE00T1NBX0RFQlVHKE00RVJSX05PVF9JTVBMRU1FTlRFRCwgIk00T1NBX3RocmVhZFN5bmNHZXRPcHRpb24iKTsKLQotICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRQU1dfRGVidWdUcmFjZS5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRQU1dfRGVidWdUcmFjZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZmNiYTk0Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000UFNXX0RlYnVnVHJhY2UuYworKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICBNNFBTV19EZWJ1Z1RyYWNlLmMKLSAqIEBicmllZiAgICAgIERlZmF1bHQgdHJhY2UgZnVuY3Rpb24gZm9yIGRlYnVnZ2luZyBtYWNyb3MKLSAqIEBub3RlICAgICAgIFRoaXMgZmlsZSBnaXZlcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdHJhY2UgZnVuY3Rpb24KLSAqICAgICAgICAgICAgIHVzZWQgaW4gdGhlIGRlYnVnIGluc3RydW1lbnRhdGlvbiBtYWNyb3MsIGJhc2VkIG9uIHByaW50Zi4KLSAqICAgICAgICAgICAgIEFwcGxpY2F0aW9uIHdyaXRlcnMgYXJlIHN0cm9uZ2x5IGVuY291cmFnZWQgdG8gaW1wbGVtZW50IHRoZWlyCi0gKiAgICAgICAgICAgICBvd24gIk00T1NBX0RlYnVnVHJhY2UiLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0jaW5jbHVkZSA8c3RkaW8uaD4gLypmb3IgcHJpbnRmICovCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0KLS8qI2RlZmluZSBOT19GSUxFICovIC8qIHN1cHByZXNzZXMgdGhlIGZpbGUgbmFtZSBwcmludCBvdXQgKi8KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHZvaWQgTTRPU0FfRGVidWdUcmFjZShNNE9TQV9JbnQzMiBsaW5lLCBjaGFyKiBmaWxlLCBNNE9TQV9JbnQzMiBsZXZlbCwKLSAqICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBjb25kLCBjaGFyKiBtc2csIE00T1NBX0VSUiBlcnIpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIHRoZSB0cmFjZSBmb3IgZGVidWcgdGVzdHMKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gaXMgdG8gYmUgY2FsbGVkIGluIHRoZSBkZWJ1ZyBtYWNyb3Mgb25seS4KLSAqICAgICAgICAgICAgVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIHByaW50Zi4KLSAqIEBwYXJhbSAgICBsaW5lIChJTik6IHRoZSBsaW5lIG51bWJlciBpbiB0aGUgc291cmNlIGZpbGUKLSAqIEBwYXJhbSAgICBmaWxlIChJTik6IHRoZSBzb3VyY2UgZmlsZSBuYW1lCi0gKiBAcGFyYW0gICAgbGV2ZWwgKElOKTogdGhlIGRlYnVnIGxldmVsCi0gKiBAcGFyYW0gICAgbXNnIChJTik6IHRoZSBlcnJvciBtZXNzYWdlCi0gKiBAcGFyYW0gICAgZXJyIChJTik6IHRoZSByZXR1cm4gdmFsdWUgKGVycm9yIGNvZGUpCi0gKiBAcmV0dXJuICAgIG5vbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLU00T1NBTF9UUkFDRV9FWFBPUlRfVFlQRSB2b2lkIE00T1NBX0RlYnVnVHJhY2UoTTRPU0FfSW50MzIgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgbGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIGNvbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIG1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSIGVycikKLXsKLSAgICBNNE9TQV9JbnQzMiBpOwotCi0gICAgLyogdHJ5IHRvICJpbmRlbnQiIHRoZSByZXN1bHRpbmcgdHJhY2VzIGRlcGVuZGluZyBvbiB0aGUgbGV2ZWwgKi8KLSAgICBmb3IgKGkgPTAgOyBpIDwgbGV2ZWw7IGkgKyspCi0gICAgewotICAgICAgICBwcmludGYoIiAiKTsKLSAgICB9Ci0KLSNpZmRlZiBOT19GSUxFCi0gICAgcHJpbnRmKCJFcnJvcjogJWxpLCBvbiAlczogJXNcbiIsZXJyLGNvbmQsbXNnKTsKLSNlbHNlIC8qIE5PX0ZJTEUgICAgICovCi0gICAgcHJpbnRmKCJFcnJvcjogJWxpLCBvbiAlczogJXMgTGluZSAlbHUgaW46ICVzXG4iLGVycixjb25kLG1zZyxsaW5lLGZpbGUpOwotI2VuZGlmIC8qIE5PX0ZJTEUgICAgICovCi0KLX0KLQotTTRPU0FMX1RSQUNFX0VYUE9SVF9UWVBFIE00T1NBX1ZvaWQgTTRPU0FfREVCVUdfdHJhY2VGdW5jdGlvbihNNE9TQV9VSW50MzIgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogZmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogc3RyaW5nQ29uZGl0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlIgcmV0dXJuZWRFcnJvcikKLXsKLSAgICBNNE9TQV9EZWJ1Z1RyYWNlKGxpbmUsIGZpbGVOYW1lLCBsZXZlbCwgc3RyaW5nQ29uZGl0aW9uLCBtZXNzYWdlLCByZXR1cm5lZEVycm9yKTsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRQU1dfTWVtb3J5SW50ZXJmYWNlLmMgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNFBTV19NZW1vcnlJbnRlcmZhY2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWE0Y2NlYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNFBTV19NZW1vcnlJbnRlcmZhY2UuYworKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00UFNXX01lbW9yeUludGVyZmFjZS5jCi0gKiBAYnJpZWYgIE1lbW9yeSBJbnRlcmZhY2UKLSAqIEBub3RlICAgSW1wbGVtZW50YXRpb24gb2YgdGhlIG9zYWwgbWVtb3J5IGZ1bmN0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxtZW1vcnkuaD4KLQotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpZm5kZWYgTTRWUFNfQURWQU5DRURfTUVNT1JZX01BTkFHRVIKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZuICAgICAgICAgTTRPU0FfTWVtQWRkcjMyIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhNNE9TQV9VSW50MzIgc2l6ZSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29yZUlEIGNvcmVJRCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogc3RyaW5nKQotICogQGJyaWVmICAgICAgdGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgYSBtZW1vcnkgYmxvY2sgKGF0IGxlYXN0IDMyIGJpdHMgYWxpZ25lZCkKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgICBzaXplIChJTik6IHNpemUgb2YgYWxsb2NhdGVkIGJsb2NrIGluIGJ5dGVzCi0gKiBAcGFyYW0gICAgICBjb3JlSUQgKElOKTogaWRlbnRpZmljYXRpb24gb2YgdGhlIGNhbGxlciBjb21wb25lbnQKLSAqIEBwYXJhbSAgICAgIHN0cmluZyAoSU4pOiBkZXNjcmlwdGlvbiBvZiB0aGUgYWxsb2NhdGVkIGJsb2NrIChudWxsIHRlcm1pbmF0ZWQpCi0gKiBAcmV0dXJuICAgICBhZGRyZXNzIG9mIHRoZSBhbGxvY2F0ZWQgYmxvY2ssIE00T1NBX05VTEwgaWYgbm8gbWVtb3J5IGF2YWlsYWJsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfTWVtQWRkcjMyIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhNNE9TQV9VSW50MzIgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29yZUlEIGNvcmVJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogc3RyaW5nKQotewotICAgIE00T1NBX01lbUFkZHIzMiBBZGRyZXNzID0gTTRPU0FfTlVMTDsKLQotICAgIC8qKgotICAgICAqIElmIHNpemUgaXMgMCwgbWFsbG9jIG9uIFdJTiBPUyBhbGxvY2F0ZXMgYSB6ZXJvLWxlbmd0aCBpdGVtIGluCi0gICAgICogdGhlIGhlYXAgYW5kIHJldHVybnMgYSB2YWxpZCBwb2ludGVyIHRvIHRoYXQgaXRlbS4KLSAgICAgKiBPbiBvdGhlciBwbGF0Zm9ybXMsIG1hbGxvYyBjb3VsZCByZXR1cm5zIGFuIGludmFsaWQgcG9pbnRlcgotICAgICAqIFNvLCBET04nVCBhbGxvY2F0ZSBtZW1vcnkgb2YgMCBieXRlICovCi0gICAgaWYgKHNpemUgPT0gMCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBBZGRyZXNzOwotICAgIH0KLQotICAgIGlmIChzaXplJTQgIT0gMCkKLSAgICB7Ci0gICAgICAgIHNpemUgPSBzaXplICsgNCAtIChzaXplJTQpOwotICAgIH0KLQotICAgIEFkZHJlc3MgPSAoTTRPU0FfTWVtQWRkcjMyKSBtYWxsb2Moc2l6ZSk7Ci0KLSAgICByZXR1cm4gQWRkcmVzczsKLX0KLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000UFNXX1RyYWNlLmMgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNFBTV19UcmFjZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmM2Q5YTFmLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000UFNXX1RyYWNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgIE00UFNXX1RyYWNlLmMKLSAqIEBicmllZiAgICAgICAgVHJhY2UgZnVuY3Rpb24gZm9yIHRyYWNlIG1hY3JvcwotICogQG5vdGUgICAgICAgIFRoaXMgZmlsZSBnaXZlcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHRyYWNlIGZ1bmN0aW9uIHVzZWQKLSAqICAgICAgICAgICAgICAgIGluIHRoZSB0cmFjZSBpbnN0cnVtZW50YXRpb24gbWFjcm9zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0KLSNpbmNsdWRlIDxzdGRpby5oPiAvKmZvciBwcmludGYgKi8KLSNpbmNsdWRlIDxzdGRhcmcuaD4gLyogQU5TSSBDIG1hY3JvcyBhbmQgZGVmcyBmb3IgdmFyaWFibGUgYXJncyAqLwotI2luY2x1ZGUgInV0aWxzL0xvZy5oIgotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotCi0jZGVmaW5lIE5PX0ZJTEUgLyogc3VwcHJlc3NlcyB0aGUgZmlsZSBuYW1lIHByaW50IG91dCAqLwotCi0jZGVmaW5lIE1BWF9TVFJJTkdfU0laRSAxMDI0Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogdm9pZCBNNE9TQV9UcmFjZShNNE9TQV9JbnQzMiBsaW5lLCBNNE9TQV9DaGFyKiBmaWxlICxNNE9TQV9JbnQzMiBsZXZlbCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogZm9ybWF0LCAuLi4pCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIHRoZSB0cmFjZSBmb3IgZGVidWcgdGVzdHMKLSAqIEBub3RlICAgIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyBwcmludGYuIEZpcnN0IHRoZSB2YXJpYWJsZXMgYXJlIHJldHJpZXZlZCB1c2luZwotICogICAgICAgICAgICBBTlNJIEMgZGVmcyBhbmQgbWFjcm9zIHdoaWNoIGVuYWJsZSB0byBhY2Nlc3MgYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzLgotICogICAgICAgICAgICBUaGVuIHRoZSBwcmludGYgaXMgZG9uZSAod2l0aCBzb21lIG9ybmVtZW50YWwgYWRkcykuCi0gKiBAcGFyYW0gICAgbGV2ZWwgKElOKTogdGhlIGRlYnVnIGxldmVsCi0gKiBAcGFyYW0gICAgZm9ybWF0IChJTik6IHRoZSAicHJpbnRmIiBmb3JtYXRlZCBzdHJpbmcKLSAqIEBwYXJhbSAgICAuLi4gKElOKTogYXMgbWFueSBwYXJhbWV0ZXJzIGFzIHJlcXVpcmVkIC4uLgotICogQHJldHVybiAgICBub25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1NNE9TQUxfVFJBQ0VfRVhQT1JUX1RZUEUgdm9pZCBNNE9TQV9UcmFjZShNNE9TQV9JbnQzMiBsaW5lLCBNNE9TQV9DaGFyKiBmaWxlICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBsZXZlbCwgTTRPU0FfQ2hhciogZm9ybWF0LCAuLi4pCi17Ci0gICAgTTRPU0FfQ2hhciBtZXNzYWdlW01BWF9TVFJJTkdfU0laRV07Ci0gICAgTTRPU0FfSW50MzIgaTsKLSAgICB2YV9saXN0IG1hcmtlcjsgLyogcG9pbnRlciB0byBsaXN0IG9mIGFyZ3VtZW50cyAqLwotCi0gICAgLyogZ2V0IHRoZSB2YXIgYXJndW1lbnRzIGludG8gdGhlIHN0cmluZyBtZXNzYWdlIHRvIGJlIGFibGUgdG8gcHJpbnQgKi8KLSAgICB2YV9zdGFydChtYXJrZXIsZm9ybWF0KTsgLyogc2V0IHB0ciB0byBmaXJzdCBhcmd1bWVudCBpbiB0aGUgbGlzdCBvZiBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbiAqLwotICAgIHZzcHJpbnRmKChjaGFyICopbWVzc2FnZSwgKGNvbnN0IGNoYXIgKilmb3JtYXQsbWFya2VyICk7ICAvKiBmb3JtYXRzIGFuZCB3cml0ZXMgdGhlIGRhdGEgaW50byBtZXNzYWdlICovCi0gICAgdmFfZW5kKG1hcmtlcik7IC8qIHJlc2V0IHBvaW50ZXIgdG8gTlVMTCAqLwotCi0gICAgLyogZG8gdGhlIGFjdHVhbCBwcmludCAqLwotI2lmZGVmIE5PX0ZJTEUKLSAgICBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0lORk8sICJNNE9TQV9UcmFjZSIsICIlcyIsIChjaGFyKiltZXNzYWdlKTsKLSNlbHNlIC8qIE5PX0ZJTEUgICAgICovCi0gICAgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19JTkZPLCAiTTRPU0FfVHJhY2UiLCAiJXMiLCAiJXMgYXQgJWx1IGluICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopbWVzc2FnZSwgbGluZSwgZmlsZSk7Ci0jZW5kaWYgLyogTk9fRklMRSAgICAgKi8KLQotfQotCi1NNE9TQUxfVFJBQ0VfRVhQT1JUX1RZUEUgTTRPU0FfVm9pZCBNNE9TQV9UUkFDRV90cmFjZUZ1bmN0aW9uKE00T1NBX1VJbnQzMiBsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBmaWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29yZUlEIGNvcmVJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBzdHJpbmdNc2csIC4uLikKLXsKLSAgICBNNE9TQV9DaGFyIG1lc3NhZ2VbTUFYX1NUUklOR19TSVpFXTsKLSAgICBNNE9TQV9JbnQzMiBpOwotICAgIHZhX2xpc3QgbWFya2VyOyAvKiBwb2ludGVyIHRvIGxpc3Qgb2YgYXJndW1lbnRzICovCi0KLSAgICAvKiBnZXQgdGhlIHZhciBhcmd1bWVudHMgaW50byB0aGUgc3RyaW5nIG1lc3NhZ2UgdG8gYmUgYWJsZSB0byBwcmludCAqLwotICAgIHZhX3N0YXJ0KG1hcmtlcixzdHJpbmdNc2cpOyAvKiBzZXQgcHRyIHRvIGZpcnN0IGFyZ3VtZW50IGluIHRoZSBsaXN0IG9mIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uICovCi0gICAgdnNwcmludGYoKGNoYXIgKiltZXNzYWdlLCAoY29uc3QgY2hhciAqKXN0cmluZ01zZyxtYXJrZXIgKTsgIC8qIGZvcm1hdHMgYW5kIHdyaXRlcyB0aGUgZGF0YSBpbnRvIG1lc3NhZ2UgKi8KLSAgICB2YV9lbmQobWFya2VyKTsgLyogcmVzZXQgcG9pbnRlciB0byBOVUxMICovCi0KLSAgICAvKiBkbyB0aGUgYWN0dWFsIHByaW50ICovCi0jaWZkZWYgTk9fRklMRQotICAgIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfSU5GTywgIk00T1NBX1RSQUNFX3RyYWNlRnVuY3Rpb24iLCAiJXMiLCAoY2hhciopbWVzc2FnZSk7Ci0jZWxzZSAvKiBOT19GSUxFICAgICAqLwotICAgIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfSU5GTywgIk00T1NBX1RSQUNFX3RyYWNlRnVuY3Rpb24iLCAiJXMiLCAiJXMgYXQgJWx1IGluICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiltZXNzYWdlLCBsaW5lLCAoY2hhciopZmlsZSk7Ci0jZW5kaWYgLyogTk9fRklMRSAgICAgKi8KLQotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL05PVElDRSBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzViMWVmYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9OT1RJQ0UKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotCi0gICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvQW5kcm9pZC5tayBiL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTA1M2U3ZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1pbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvaW5jL000TVA0V19UeXBlcy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9pbmMvTTRNUDRXX1R5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVmOWQxNmIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9pbmMvTTRNUDRXX1R5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRNUDRXX1R5cGVzLmgKLSAqIEBicmllZiAgIERlZmluaXRpb24gb2YgdHlwZXMgZm9yIHRoZSBjb3JlIE1QNCB3cml0ZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaWZuZGVmIE00TVA0V19UWVBFU19ICi0jZGVmaW5lIE00TVA0V19UWVBFU19ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKLQotI2lmbmRlZiBfTTRNUDRXX1VTRV9DU1RfTUVNT1JZX1dSSVRFUgotCi0vKiBpbmNsdWRlcyAqLwotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVdyaXRlci5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVSZWFkZXIuaCIKLSNpbmNsdWRlICJNNFNZU19TdHJlYW0uaCIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRNUDRDX0Z0eXBCb3gKLSAqIEBicmllZiAgICAgICBJbmZvcm1hdGlvbiB0byBidWlsZCB0aGUgJ2Z0eXAnIGF0b20KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotI2RlZmluZSBNNE1QQUNfRlRZUF9UQUcgMHg2Njc0Nzk3MCAvKiAnZnR5cCcgKi8KLSNkZWZpbmUgTTRNUEFDX01BWF9DT01QQVRJQkxFX0JSQU5EUyAxMAotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKiBBbGwgYnJhbmQgZmllbGRzIGFyZSBhY3R1YWxseSBjaGFyWzRdIHN0b3JlZCBpbiBiaWctZW5kaWFuIGludGVnZXIgZm9ybWF0ICovCi0KLSAgICBNNE9TQV9VSW50MzIgICAgbWFqb3JfYnJhbmQ7ICAgICAgICAgLyogZ2VuZXJhbGx5ICczZ3A0JyAgICAgICAgICAgICovCi0gICAgTTRPU0FfVUludDMyICAgIG1pbm9yX3ZlcnNpb247ICAgICAgIC8qIGdlbmVyYWxseSAnMDAwMCcgb3IgJ3gueCAnICAqLwotICAgIE00T1NBX1VJbnQzMiAgICBuYkNvbXBhdGlibGVCcmFuZHM7ICAvKiBudW1iZXIgb2YgY29tcGF0aWJsZSBicmFuZHMgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgY29tcGF0aWJsZV9icmFuZHNbTTRNUEFDX01BWF9DT01QQVRJQkxFX0JSQU5EU107ICAgLyogYXJyYXkgb2YgbWF4IGNvbXBhdGlibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJhbmRzICovCi19IE00TVA0Q19GdHlwQm94OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00TVA0V19tZW1BZGRyCi0gKiBAYnJpZWYgICAgICAgIEJ1ZmZlciBzdHJ1Y3R1cmUgZm9yIHRoZSBNUDQgd3JpdGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVUludDMyICAgICAgICBzaXplOwotICAgIE00T1NBX01lbUFkZHIzMiAgICBhZGRyOwotfSBNNE1QNFdfbWVtQWRkcjsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBUaW1lIHR5cGUgZm9yIHRoZSBjb3JlIE1QNCB3cml0ZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBNNE9TQV9VSW50MzIgTTRNUDRXX1RpbWUzMjsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtZXJhdGlvbiAgIE00TVA0V19TdGF0ZQotICogQGJyaWVmICAgICAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgY29yZSBNUDQgd3JpdGVyIHN0YXRlcwotICogQG5vdGUgICAgICAgICBUaGVzZSBzdGF0ZXMgYXJlIHVzZWQgaW50ZXJuYWx5LCBidXQgY2FuIGJlIHJldHJpZXZlZCBmcm9tIG91dHNpZGUKLSAqICAgICAgICAgICAgICAgdGhlIHdyaXRlci4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRNUDRXX29wZW5lZCAgICAgICAgICAgID0gMHgxMDAsCi0gICAgTTRNUDRXX3JlYWR5ICAgICAgICAgICAgID0gMHgyMDAsCi0gICAgTTRNUDRXX3dyaXRpbmcgICAgICAgICAgID0gMHgzMDAsCi0gICAgTTRNUDRXX3dyaXRpbmdfc3RhcnRBVSAgID0gMHgzMDEsCi0gICAgTTRNUDRXX2Nsb3NlZCAgICAgICAgICAgID0gMHg0MDAKLX0gTTRNUDRXX1N0YXRlOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW1lcmF0aW9uICAgIE00TVA0V19PcHRpb25JRAotICogQGJyaWVmICAgICAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgY29yZSBNUDQgd3JpdGVyIG9wdGlvbnMKLSAqIEBub3RlICAgICAgICBUaGVzZSBvcHRpb25zIGdpdmUgcGFyYW1ldGVycyBmb3IgdGhlIGNvcmUgTVA0IHdyaXRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNE1QNFdfbWF4QVVwZXJDaHVuayAgICAgICAgPSAweEMxMDEsCi0gICAgTTRNUDRXX21heENodW5rU2l6ZSAgICAgICAgID0gMHhDMTAyLAotICAgIE00TVA0V19tYXhDaHVua0ludGVyICAgICAgICA9IDB4QzEwMywKLSAgICBNNE1QNFdfcHJlV3JpdGVDYWxsQmFjayAgICAgPSAweEMxMDQsCi0gICAgTTRNUDRXX3Bvc3RXcml0ZUNhbGxCYWNrICAgID0gMHhDMTA1LAotICAgIE00TVA0V19tYXhBVXNpemUgICAgICAgICAgICA9IDB4QzEwNiwKLSAgICBNNE1QNFdfSU9EICAgICAgICAgICAgICAgICAgPSAweEMxMTEsCi0gICAgTTRNUDRXX0VTRCAgICAgICAgICAgICAgICAgID0gMHhDMTEyLAotICAgIE00TVA0V19TRFAgICAgICAgICAgICAgICAgICA9IDB4QzExMywKLSAgICBNNE1QNFdfdHJhY2tTaXplICAgICAgICAgICAgPSAweEMxMTQsCi0gICAgTTRNUDRXX01PT1ZmaXJzdCAgICAgICAgICAgID0gMHhDMTIxLAotICAgIE00TVA0V19WMl9NT09GICAgICAgICAgICAgICA9IDB4QzEzMSwKLSAgICBNNE1QNFdfVjJfdGJsQ29tcHJlcyAgICAgICAgPSAweEMxMzIsCi0gICAgLyp3YXJuaW5nOiB1bnNwZWNpZmllZCBvcHRpb25zOiovCi0gICAgTTRNUDRXX21heEZpbGVTaXplICAgICAgICAgID0gMHhDMTUyLAotICAgIE00TVA0V19DYW1jb2RlclZlcnNpb24gICAgICA9IDB4QzE1MywgLyowMDAgdG8gOTk5ICEqLwotICAgIE00TVA0V19lc3RpbWF0ZUF1ZGlvU2l6ZSAgICA9IDB4QzE1NCwgLyphdWRpbyBBVXMgYXJlIHByb2Nlc3NlZCBhZnRlciB0aGUgdmlkZW8sICovCi0gICAgLyp0aGlzIG9wdGlvbiBNVVNUIE5PVCBiZSBzZXQgaWYgbm9uIGNvbnN0YW50IGF1ZGlvCi0gICAgZnJhbWUgc2l6ZSAoZS5nLiBpZiBTSUQpKi8KLSAgICBNNE1QNFdfZW1iZWRkZWRTdHJpbmcgICAgICAgPSAweEMxNTUsCi0gICAgTTRNUDRXX2ludGVncmF0aW9uVGFnICAgICAgID0gMHhDMTU2LAotICAgIE00TVA0V19tYXhGaWxlRHVyYXRpb24gICAgICA9IDB4QzE1NywKLSAgICBNNE1QNFdfc2V0RnR5cEJveCAgICAgICAgICAgPSAweEMxNTgsCi0gICAgTTRNUDRXX0RTSSAgICAgICAgICAgICAgICAgID0gMHhDMTU5LAotICAgIC8qIEguMjY0IHRyaW1taW5nICovCi0gICAgTTRNUDRXX01VTF9QUFNfU1BTICAgICAgICAgID0gMHhDMTYwLAotICAgIC8qIEguMjY0IHRyaW1taW5nICovCi19IE00TVA0V19PcHRpb25JRDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBBdWRpbyAmIHZpZGVvIHN0cmVhbSBJRHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotI2RlZmluZSBBdWRpb1N0cmVhbUlEIDEKLSNkZWZpbmUgVmlkZW9TdHJlYW1JRCAyCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRGVmYXVsdCBwYXJhbWV0ZXJzIHZhbHVlcywgdGhhdCBjYW4gYmUgbW9kaWZpZWQgYnkgTTRNUDRXX3NldE9wdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0jZGVmaW5lIE00TVA0V19EZWZhdWx0V2lkdGggMzIwCi0jZGVmaW5lIE00TVA0V19EZWZhdWx0SGVpZ2h0IDI0MAotI2RlZmluZSBNNE1QNFdfRGVmYXVsdE1heEF1U2l6ZSAgNDA5NiAvKmJ5dGVzKi8KLSNkZWZpbmUgTTRNUDRXX0RlZmF1bHRNYXhDaHVua1NpemUgMTAwMDAwIC8qYnl0ZXMqLwotI2RlZmluZSBNNE1QNFdfRGVmYXVsdEludGVybGVhdmVEdXIgMCAvKmJ5dGVzKi8KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNE1QNFdfU3RyZWFtSURzaXplCi0gKiBAYnJpZWYgICAgICAgIFZpZGVvIHBsYW5lIHNpemUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRDsKLSAgICBNNE9TQV9VSW50MTYgICAgaGVpZ2h0OwotICAgIE00T1NBX1VJbnQxNiAgICB3aWR0aDsKLX0gTTRNUDRXX1N0cmVhbUlEc2l6ZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRNUDRXX1RyYWNrRGF0YQotICogQGJyaWVmICAgICAgIEludGVybmFsIGNvcmUgTVA0IHdyaXRlciB0cmFjayBzdHJ1Y3R1cmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNFNZU19TdHJlYW1UeXBlICAgIHRyYWNrVHlwZTsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgIHRpbWVzY2FsZTsgICAgICAgICAgLyogVCAodmlkZW89MTAwMCksIChBTVI4PTgwMDApLCAoQU1SMTY9MTYwMDApKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIHNhbXBsZVNpemU7ICAgICAgICAgLyogUyAodmlkZW89MCkqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgc3R0c1RhYmxlRW50cnlOYjsgICAvKiBKIChhdWRpbz0xKSovCi0gICAgTTRNUDRXX1RpbWUzMiAgICAgICAgbGFzdENUUzsgICAgICAgICAgIC8qIENUUyBvZiB0aGUgcHJldmlvdXMgQVUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgdG8gMC5HaXZlcyBkdXJhdGlvbiBhdCB0aGUgZW5kLiovCi0gICAgTTRPU0FfVUludDMyICAgICAgICBzYW1wbGVOYjsgICAgICAgICAgIC8qIEsgKGF1ZGlvPUYpKi8KLX0gTTRNUDRXX1RyYWNrRGF0YTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRNUDRXX0F1ZGlvVHJhY2tEYXRhCi0gKiBAYnJpZWYgICAgICAgSW50ZXJuYWwgY29yZSBNUDQgd3JpdGVyIGF1ZGlvIHNwZWNpZmljIHN0cnVjdHVyZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00TVA0V19TdGF0ZSAgICAgICAgICAgIG1pY3JvU3RhdGU7Ci0gICAgTTRNUDRXX1RyYWNrRGF0YSAgICAgICAgQ29tbW9uRGF0YTsKLSAgICBNNE9TQV9VQ2hhcioqICAgICAgICAgICBDaHVuazsKLSAgICBNNE9TQV9VSW50MzIqICAgICAgICAgICBjaHVua1NpemVUYWJsZTsKLSNpZm5kZWYgX000TVA0V19NT09WX0ZJUlNUCi0gICAgTTRPU0FfVUludDMyKiAgICAgICAgICAgY2h1bmtPZmZzZXRUYWJsZTsKLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0gICAgTTRPU0FfVUludDMyKiAgICAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlOwotICAgIE00T1NBX1VJbnQzMiogICAgICAgICAgIGNodW5rVGltZU1zVGFibGU7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgY3VycmVudENodW5rOyAgICAgICAvKiBJbml0IHRvIDAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIGN1cnJlbnRQb3M7ICAgICAgICAgLyogSW5pdCB0byAwICovCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBjdXJyZW50U3RzYzsgICAgICAgIC8qIEluaXQgdG8gMCAqLwotI2VuZGlmCi0gICAgTTRNUDRXX1RpbWUzMiAgICAgICAgICAgc2FtcGxlRHVyYXRpb247ICAgICAvKiBDaGVjayAoQU1SOD0xNjApLCAoQU1SMTY9MzIwKSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgTWF4Q2h1bmtTaXplOyAgICAgICAvKiBJbml0IHRvIE00TVA0V19NcDRGaWxlRGF0YS5NYXhDaHVua1NpemUqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIE1heEFVU2l6ZTsgICAgICAgICAgLyogSW5pdCB0byBNNE1QNFdfTXA0RmlsZURhdGEuTWF4QVVTaXplKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBMYXN0QWxsb2NhdGVkQ2h1bms7Ci0gICAgLyogcHJldmlvdXNseSwgYXVkaW8gYXUgc2l6ZSB3YXMgc3VwcG9zZWQgY29uc3RhbnQsCi0gICAgICogd2hpY2ggaXMgYWN0dWFsbHkgbm90IHRoZSBjYXNlIGlmIHNpbGVuY2VzIChzaWQpLiovCi0gICAgLyogYXQgZmlyc3QgYXVkaW8gYXUsIHNhbXBsZVNpemUgaXMgc2V0LiBJdCBpcyBsYXRlciByZXNldCB0byAwIGlmIG5vbiBjb25zdGFudCBzaXplLiovCi0gICAgLyogU28gc2FtcGxlU2l6ZSBzaG91bGQgYmUgdGVzdGVkIHRvIGtub3cgd2VpdGhlciBvciBub3QgdGhlcmUgaXMgYSBUQUJMRV9TVFNaLiAqLwotICAgIE00T1NBX1VJbnQzMiogICAgICAgICAgIFRBQkxFX1NUU1o7IC8qIHRhYmxlIHNpemUgaXMgNEsqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG5iT2ZBbGxvY2F0ZWRTdHN6QmxvY2tzOwotICAgIE00T1NBX1VJbnQzMiogICAgICAgICAgIFRBQkxFX1NUVFM7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbmJPZkFsbG9jYXRlZFN0dHNCbG9ja3M7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbWF4Qml0cmF0ZTsgICAgIC8qbm90IHVzZWQgaW4gYW1yIGNhc2UqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIGF2Z0JpdHJhdGU7ICAgICAvKm5vdCB1c2VkIGluIGFtciBjYXNlKi8KLSAgICBNNE9TQV9VQ2hhciogICAgICAgICAgICBEU0k7ICAgICAgICAgICAgLyogRGVjb2RlciBTcGVjaWZpYyBJbmZvOiBNYXkgYmUgTTRPU0FfTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdGVkKSBmb3IgQU1SICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgZHNpU2l6ZTsgICAgICAgIC8qIERTSSBzaXplLCBhbHdheXMgOSBieXRlcyBmb3IgQU1SICovCi19IE00TVA0V19BdWRpb1RyYWNrRGF0YTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNE1QNFdfVmlkZW9UcmFja0RhdGEKLSAqIEBicmllZiAgICAgICAgSW50ZXJuYWwgY29yZSBNUDQgd3JpdGVyIHZpZGVvIHNwZWNpZmljIHN0cnVjdHVyZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00TVA0V19TdGF0ZSAgICAgICAgICAgIG1pY3JvU3RhdGU7Ci0gICAgTTRNUDRXX1RyYWNrRGF0YSAgICAgICAgQ29tbW9uRGF0YTsKLSAgICBNNE9TQV9VQ2hhcioqICAgICAgICAgICBDaHVuazsKLSAgICBNNE9TQV9VSW50MzIqICAgICAgICAgICBjaHVua1NpemVUYWJsZTsKLSNpZm5kZWYgX000TVA0V19NT09WX0ZJUlNUCi0gICAgTTRPU0FfVUludDMyKiAgICAgICAgICAgY2h1bmtPZmZzZXRUYWJsZTsKLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0gICAgTTRPU0FfVUludDMyKiAgICAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlOwotICAgIE00TVA0V19UaW1lMzIqICAgICAgICAgIGNodW5rVGltZU1zVGFibGU7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgY3VycmVudENodW5rOyAgICAgICAgICAgIC8qIEluaXQgdG8gMCovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgY3VycmVudFBvcyA7ICAgICAgICAgICAgIC8qIEluaXQgdG8gMCovCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBjdXJyZW50U3RzYzsgICAgICAgICAgICAgLyogSW5pdCB0byAwKi8KLSNlbmRpZgotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHN0c3NUYWJsZUVudHJ5TmIgOyAgICAgICAvKiBOKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgICAgICB3aWR0aDsgICAgICAgICAgICAgICAgICAgLyogWCovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICAgICAgaGVpZ2h0OyAgICAgICAgICAgICAgICAgIC8qIFkqLwotICAgIE00T1NBX1VJbnQzMiogICAgICAgICAgIFRBQkxFX1NUVFM7ICAgICAgICAgICAgICAvKiB0YWJsZSBzaXplIGlzIEoqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG5iT2ZBbGxvY2F0ZWRTdHRzQmxvY2tzOwotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0gICAgTTRPU0FfVUludDE2KiAgICAgICAgICAgVEFCTEVfU1RTWjsgICAgICAgICAgICAgIC8qIHRhYmxlIHNpemUgaXMgMksqLwotI2Vsc2UKLSAgICBNNE9TQV9VSW50MzIqICAgICAgICAgICBUQUJMRV9TVFNaOyAgICAgICAgICAgICAgLyogdGFibGUgc2l6ZSBpcyA0SyovCi0jZW5kaWYKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBuYk9mQWxsb2NhdGVkU3RzekJsb2NrczsKLSAgICBNNE9TQV9VSW50MzIqICAgICAgICAgICBUQUJMRV9TVFNTOyAgICAgICAgICAgICAgLyogdGFibGUgc2l6ZSBpcyBOKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBuYk9mQWxsb2NhdGVkU3Rzc0Jsb2NrczsKLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIE1heEFVcGVyQ2h1bms7ICAgICAgICAgICAvKkluaXQgdG8gMCwgaS5lLiBub3QgdXNlZCovCi0jZW5kaWYKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBNYXhDaHVua1NpemU7ICAgICAgICAgICAgLypJbml0IHRvIE00TVA0V19NcDRGaWxlRGF0YS5NYXhDaHVua1NpemUqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIE1heEFVU2l6ZTsgICAgICAgICAgICAgICAvKkluaXQgdG8gTTRNUDRXX01wNEZpbGVEYXRhLk1heEFVU2l6ZSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgTGFzdEFsbG9jYXRlZENodW5rOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1heEJpdHJhdGU7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgYXZnQml0cmF0ZTsKLSAgICBNNE9TQV9VQ2hhciogICAgICAgICAgICBEU0k7ICAgICAgICAgICAgLyogRGVjb2RlciBTcGVjaWZpYyBJbmZvOiBNYXkgYmUgTTRPU0FfTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdGVkKSBmb3IgSDI2MyovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgZHNpU2l6ZTsgICAgICAgIC8qIERTSSBzaXplLCBhbHdheXMgNyBieXRlcyBmb3IgSDI2MyAqLwotfSBNNE1QNFdfVmlkZW9UcmFja0RhdGE7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00TVA0V19NcDRGaWxlRGF0YQotICogQGJyaWVmICAgICAgIEludGVybmFsIGNvcmUgTVA0IHdyaXRlciBwcml2YXRlIGNvbnRleHQgc3RydWN0dXJlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRNUDRXX1N0YXRlICAgICAgICAgICAgICAgICAgc3RhdGU7Ci0gICAgTTRPU0FfQ2hhciogICAgICAgICAgICAgICAgICAgdXJsOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOyAgICAvKiBEIGluIG1zLCBtYXggZHVyYXRpb24gb2YgYXVkaW8mdmlkZW8qLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgIGZpbGVzaXplOyAgICAvKiBhY3R1YWwgZmlsZXNpemUgaW4gYnl0ZXMqLwotICAgIE00TVA0V19BdWRpb1RyYWNrRGF0YSogICAgICAgIGF1ZGlvVHJhY2tQdHI7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgaGFzQXVkaW87Ci0gICAgTTRNUDRXX1ZpZGVvVHJhY2tEYXRhKiAgICAgICAgdmlkZW9UcmFja1B0cjsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICBoYXNWaWRlbzsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICBNYXhDaHVua1NpemU7ICAgICAgIC8qIEluaXQgdG8gMTAwMDAwKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICBNYXhBVVNpemU7ICAgICAgICAgIC8qIEluaXQgdG8gNDA5NiovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgTWF4RmlsZVNpemU7ICAgICAgICAvKiBJbml0IHRvIDAsIGkuZS4gbm90IHVzZWQqLwotICAgIE00TVA0V19UaW1lMzIgICAgICAgICAgICAgICAgIEludGVybGVhdmVEdXI7ICAgICAgLyogSW5pdCB0byAwLCBpLmUuIG5vdCB1c2VkLCBtcyovCi0gICAgLyogTTRNUDRXX1dyaXRlQ2FsbEJhY2sgICAgICAgICAgICBQcmVXcml0ZUNhbGxCYWNrOyovICAgIC8qSW5pdCB0byBNNE9TQV9OVUxMKi8KLSAgICAvKiBNNE1QNFdfV3JpdGVDYWxsQmFjayAgICAgICAgICAgIFBvc3RXcml0ZUNhbGxCYWNrOyovIC8qSW5pdCB0byBNNE9TQV9OVUxMKi8KLSAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogICAgICBmaWxlV3JpdGVyRnVuY3Rpb25zOwotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogICAgICAgIGZpbGVSZWFkZXJGdW5jdGlvbnM7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgY2FtY29kZXJWZXJzaW9uOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgIGVzdGltYXRlQXVkaW9TaXplOyAgLyogZGVmYXVsdCBpcyBmYWxzZSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgYXVkaW9Nc0NodW5rRHVyOyAgICAvKiBpbiBtcywgc2V0IG9ubHkgaWYgZXN0aW1hdGVBdWRpb1NpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHRydWUqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgIGF1ZGlvTXNTdG9wVGltZTsgICAgLyogdGltZSB0byBzdG9wIGF1ZGlvLCBzZXQgb25seSBpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXN0aW1hdGVBdWRpb1NpemUgaXMgdHJ1ZSovCi0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQ7Ci0jaWZuZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgIGFic29sdXRlQ3VycmVudFBvczsgLyogbmV3IGZpZWxkIGZvciBvZmZzZXQgdXBkYXRlKi8KLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0gICAgTTRPU0FfVUNoYXIqICAgICAgICAgICAgICAgICAgZW1iZWRkZWRTdHJpbmc7ICAgICAvKiAxNiBieXRlcyBzdHJpbmcsIGRlZmF1bHQgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlbiBpZiBOVUxMKi8KLSAgICBNNE9TQV9VQ2hhciogICAgICAgICAgICAgICAgICBpbnRlZ3JhdGlvblRhZzsgICAgIC8qIDYwIGJ5dGVzIHN0cmluZywgbWVtc2V0IHRvIDAgaWYgTlVMTCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgIE1heEZpbGVEdXJhdGlvbjsgICAgLyogSW5pdCB0byAwLCBpLmUuIG5vdCB1c2VkKi8KLSAgICBNNE1QNENfRnR5cEJveCAgICAgICAgICAgICAgICBmdHlwOyAgICAgICAgICAgICAgIC8qIGZ0eXAgYXRvbSwgaWYgbm90IGRlZmluZWQgc2V0IG1ham9yX2JyYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsIHdpbGwgdXNlIGRlZmF1bHQgYm94ICovCi0jaWZkZWYgX000TVA0V19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UKLSAgICBNNE9TQV9DaGFyKiAgICAgICAgICAgICAgICAgICAgc2FmZXR5RmlsZVVybDsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW5TYWZldHlGaWxlOwotI2VuZGlmIC8qIF9NNE1QNFdfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTVVMUFBTU1BTOwotfSBNNE1QNFdfTXA0RmlsZURhdGE7Ci0KLSNlbmRpZiAvKiBfTTRNUDRXX1VTRV9DU1RfTUVNT1JZX1dSSVRFUiAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLypNNE1QNFdfVFlQRVNfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvaW5jL000TVA0V19VdGlscy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9pbmMvTTRNUDRXX1V0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZiZTdhYmIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9pbmMvTTRNUDRXX1V0aWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRNUDRXX1V0aWxzLmgKLSAqIEBicmllZiAgIFV0aWxpdGllcyBhbmQgcHJpdmF0ZSBmdW5jdGlvbnMgZGVjbGFyYXRpb24gZm9yIHRoZSBNUDQgd3JpdGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2lmbmRlZiBNNE1QNFdfVVRJTFNfSAotI2RlZmluZSBNNE1QNFdfVVRJTFNfSAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0KLSNpZm5kZWYgX000TVA0V19VU0VfQ1NUX01FTU9SWV9XUklURVIKLQotLyogaW5jbHVkZXMgKi8KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVXcml0ZXIuaCIKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFV0aWxpdHkgZnVuY3Rpb25zIHRvIHdyaXRlIGRhdGEgaW4gYmlnIGVuZGlhbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNUDRXX3B1dEJ5dGUoTTRPU0FfVUNoYXIgYywgICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIGZpbGVGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotTTRPU0FfRVJSIE00TVA0V19wdXRCRTE2KE00T1NBX1VJbnQzMiB2YWwsIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiBmaWxlRnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLU00T1NBX0VSUiBNNE1QNFdfcHV0QkUyNChNNE9TQV9VSW50MzIgdmFsLCBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogZmlsZUZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQgY29udGV4dCk7Ci1NNE9TQV9FUlIgTTRNUDRXX3B1dEJFMzIoTTRPU0FfVUludDMyIHZhbCwgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIGZpbGVGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFdyaXRlIGEgYnVsayBvZiBkYXRhIGludG8gdGhlIHNwZWNpZmllZCBmaWxlLCBzaXplIGlzIGdpdmVuIGluIGJ5dGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1QNFdfcHV0QmxvY2soY29uc3QgTTRPU0FfVUNoYXIqIEJsb2NrLCBNNE9TQV9VSW50MzIgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIGZpbGVGdW5jdGlvbiwgTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb252ZXJ0IHRoZSAnbmInIHVuc2lnbmVkIGludGVnZXJzIGluICd0YWInIHRhYmxlIGZyb20gTEUgaW50byBCRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi12b2lkIE00TVA0V190YWJsZTMyVG9CRShNNE9TQV9VSW50MzIqIHRhYiwgTTRPU0FfVUludDMyIG5iKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb252ZXJ0IGFuIHVuc2lnbmVkIDMyIGJpdHMgaW50ZWdlciBmcm9tIExFIGludG8gQkUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdm9pZCBNNE1QNFdfY29udmVydEludDMyQkUoTTRPU0FfVUludDMyKiB2YWxQdHIpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJlLWFsbG9jYXRpb24gZnVuY3Rpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdm9pZCogTTRNUDRXX3JlYWxsb2MoTTRPU0FfTWVtQWRkcjMyIHB0ciwgTTRPU0FfVUludDMyIG9sZFNpemUsIE00T1NBX1VJbnQzMiBuZXdTaXplKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBEZS1hbGxvY2F0ZSB0aGUgY29udGV4dAotICogVGhpcyBtZXRob2QgaXMgbm8gbG9uZ2VyIGluIHRoZSB3cml0ZXIgZXh0ZXJuYWwgaW50ZXJmYWNlLCBidXQgaXMgY2FsbGVkIGZyb20KLSAqIHRoZSBmdW5jdGlvbiBNNE1QNFdfY2xvc2VXcml0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNUDRXX2ZyZWVDb250ZXh0KE00T1NBX0NvbnRleHQgY29udGV4dCk7Ci0KLQotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFB1dCBIaSBhbmQgTG8gdTE2IHBhcnQgaW4gYSB1MzIgdmFyaWFibGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfVm9pZCBNNE1QNFdfcHV0MzJfSGkoTTRPU0FfVUludDMyKiB0YWIsIE00T1NBX1VJbnQxNiBIaSk7Ci1NNE9TQV9Wb2lkIE00TVA0V19wdXQzMl9MbyhNNE9TQV9VSW50MzIqIHRhYiwgTTRPU0FfVUludDE2IExvKTsKLU00T1NBX1VJbnQxNiBNNE1QNFdfZ2V0MzJfSGkoTTRPU0FfVUludDMyKiB0YWIpOwotTTRPU0FfVUludDE2IE00TVA0V19nZXQzMl9MbyhNNE9TQV9VSW50MzIqIHRhYik7Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9NNE1QNFdfVVNFX0NTVF9NRU1PUllfV1JJVEVSICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAvKk00TVA0V19VVElMU19IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9pbmMvTTRNUDRXX1dyaXRlci5oIGIvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9pbmMvTTRNUDRXX1dyaXRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNzNhMjIzLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvaW5jL000TVA0V19Xcml0ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNE1QNFdfV3JpdGVyLmgKLSAqIEBicmllZiAgIENvcmUgTVA0IHdyaXRlciBpbnRlcmZhY2UKLSAqIEBub3RlICAgIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgTVA0IHdyaXRlciBpbnRlcmZhY2UgZnVuY3Rpb25zLgotICogICAgICAgICAgVGhlIE1QNCB3cml0ZXIgc3BlY2lmaWMgdHlwZXMgYXJlIGRlZmluZWQgaW4gZmlsZSBNNE1QNFdfVHlwZXMuaAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0jaWZuZGVmIE00TVA0V19XUklURVJfSAotI2RlZmluZSBNNE1QNFdfV1JJVEVSX0gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotCi0jaWZuZGVmIF9NNE1QNFdfVVNFX0NTVF9NRU1PUllfV1JJVEVSCi0KLS8qIGluY2x1ZGVzICovCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVXcml0ZXIuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlUmVhZGVyLmgiCi0jaW5jbHVkZSAiTTRTWVNfQWNjZXNzVW5pdC5oIgotI2luY2x1ZGUgIk00TVA0V19UeXBlcy5oIgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE1QNFcgRXJyb3JzICYgV2FybmluZ3MgZGVmaW5pdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0jZGVmaW5lIE00V0FSX01QNFdfT1ZFUlNJWkUgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUiwgTTRNUDRfV1JJVEVSICwweDAwMDAwMSkKLSNkZWZpbmUgTTRXQVJfTVA0V19OT1RfRVZBTFVBQkxFICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLCBNNE1QNF9XUklURVIgLDB4MDAwMDAyKQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBHZXQgTVA0VyB2ZXJzaW9uCi0gKiBAcGFyYW0gICAgbWFqb3IgICAgICAgICAgICAoT1VUKSBQb2ludGVyIHRvIHRoZSAnbWFqb3InIHZlcnNpb24gbnVtYmVyLgotICogQHBhcmFtICAgIG1pbm9yICAgICAgICAgICAgKE9VVCkgUG9pbnRlciB0byB0aGUgJ21pbm9yJyB2ZXJzaW9uIG51bWJlci4KLSAqIEBwYXJhbSAgICByZXZpc2lvbiAgICAgICAgIChPVVQpIFBvaW50ZXIgdG8gdGhlICdyZXZpc2lvbicgbnVtYmVyLgotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNUDRXX2dldFZlcnNpb24oTTRPU0FfVUludDgqIG1ham9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4KiBtaW5vciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCogcmV2aXNpb24pOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBJbml0aWF0aW9uIG9mIHRoZSBNUDQgZmlsZSBjcmVhdGlvbgotICogQHBhcmFtICAgIGNvbnRleHRQdHIgICAgICAgICAgICAgKE9VVCkgUG9pbnRlciB0byB0aGUgTVA0IHdyaXRlciBjb250ZXh0IHRvIGNyZWF0ZS4KLSAqIEBwYXJhbSAgICBvdXRwdXRGaWxlRGVzY3JpcHRvciAgIChJTikgIERlc2NyaXB0b3Igb2YgdGhlIG91dHB1dCBmaWxlIHRvIG9wZW4uCi0gKiBAcGFyYW0gICAgZmlsZVdyaXRlckZ1bmN0aW9uICAgICAoSU4pICBQb2ludGVyIHRvIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBzZXQgb2YKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1NBTCBmaWxlIHdyaXRlIGZ1bmN0aW9ucy4KLSAqIEBwYXJhbSAgICB0ZW1wRmlsZURlc2NyaXB0b3IgICAgIChJTikgIERlc2NyaXB0b3Igb2YgdGhlIHRlbXBvcmFyeSBmaWxlIHRvIG9wZW4uCi0gKiBAcGFyYW0gICAgZmlsZVJlYWRlckZ1bmN0aW9uICAgICAoSU4pICBQb2ludGVyIHRvIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBzZXQgb2YKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1NBTCBmaWxlIHJlYWQgZnVuY3Rpb25zLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBudWxsIG9yIGluY29ycmVjdAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNUDRXX29wZW5Xcml0ZSggTTRPU0FfQ29udGV4dCogICAgICAgICAgICAgICAgICBjb250ZXh0UHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqICAgICAgICBmaWxlV3JpdGVyRnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wRmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiAgICAgICAgICBmaWxlUmVhZGVyRnVuY3Rpb24gKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgQWRkIGEgbmV3IHRyYWNrCi0gKiBAcGFyYW0gICAgY29udGV4dCAgICAgICAgICAgICAgKElOL09VVCkgIE1QNCB3cml0ZXIgY29udGV4dC4KLSAqIEBwYXJhbSAgICBzdHJlYW1EZXNjUHRyICAgICAgICAoSU4pICAgICAgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgZm9yIHRoZSBuZXcgdHJhY2suCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG51bGwgb3IgaW5jb3JyZWN0Ci0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgSW52YWxpZCBzdGF0ZQotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVDogIEFuIGF1ZGlvIChyZXNwLnZpZGVvKSBzdHJlYW0gaGFzIGFscmVhZHkgYmVlbiBhZGRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoaXMgY29udGV4dCB3aGlsZSBhdHRlbXB0aW5nIHRvIGFkZCBhbm90aGVyIG9uZSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCBpcyBmb3JiaWRkZW4uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1QNFdfYWRkU3RyZWFtKCBNNE9TQV9Db250ZXh0ICAgICAgICAgICAgICAgIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24qICAgICBzdHJlYW1EZXNjUHRyKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBTaWduYWwgdG8gdGhlIGNvcmUgTVA0IHdyaXRlciB0aGF0IHRoZXJlIGlzIG5vIG1vcmUgdHJhY2tzIHRvIGFkZAotICogQHBhcmFtICAgY29udGV4dCAgICAgICAgICAgICAoSU4vT1VUKSBNUDQgd3JpdGVyIGNvbnRleHQuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbnVsbCBvciBpbmNvcnJlY3QKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DOiAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIEludmFsaWQgc3RhdGUKLSAqIEByZXR1cm4gIE00RVJSX0JBRF9DT05URVhUOiAgQXVkaW8gc2l6ZSBlc3RpbWF0aW9uIGlzIHJlcXVpcmVkIGJ1dCBub3QgdHdvIHN0cmVhbXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSBiZWVuIGFkZGVkLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNUDRXX3N0YXJ0V3JpdGluZyggTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBBc2tzIHRoZSBjb3JlIE1QNCB3cml0ZXIgdG8gaW5pdGlhdGUgdGhlIGFjY2VzcyB1bml0IGNyZWF0aW9uIGluCi0gKiAgICAgICAgICB0aGUgc3RyZWFtSUQgdHJhY2sKLSAqIEBwYXJhbSAgIGNvbnRleHQgICAgICAgICAgICAgKElOL09VVCkgTVA0IHdyaXRlciBjb250ZXh0LgotICogQHBhcmFtICAgc3RyZWFtSUQgICAgICAgICAgICAoSU4pIFN0cmVhbSBJRCBvZiB0aGUgdHJhY2suCi0gKiBAcGFyYW0gICBhdVB0ciAgICAgICAgICAgICAgIChJTi9PVVQpIEFjY2VzcyB1bml0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBudWxsIG9yIGluY29ycmVjdAotICogQHJldHVybiAgICBNNEVSUl9CQURfU1RSRUFNX0lEOlVua25vd24gc3RyZWFtIElECi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgSW52YWxpZCBzdGF0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNUDRXX3N0YXJ0QVUoIE00T1NBX0NvbnRleHQgICAgICAgIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1N0cmVhbUlEICAgICAgIHN0cmVhbUlELAotICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19BY2Nlc3NVbml0KiAgICBhdVB0cik7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgQXNrIHRoZSBjb3JlIE1QNCB3cml0ZXIgdG8gd3JpdGUgdGhlIGFjY2VzcyB1bml0IGluIHRoZSBzdHJlYW1JRCB0cmFjawotICogQG5vdGUgICAgSWYgTTRNUDRXX1dBUl9PVkVSU0laRSBpcyByZXR1cm5lZCwgTTRNUDRXX3N0YXJ0QVUgbXVzdCBub3QgYmUgY2FsbGVkIGFueW1vcmUsCi0gKiAgICAgICAgICBidXQgZGlyZWN0bHkgTTRNUDRXX2Nsb3NlV3JpdGUoKS4KLSAqIEBwYXJhbSAgIGNvbnRleHQgICAgICAgICAgICAgKElOL09VVCkgICBNUDQgd3JpdGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICBzdHJlYW1JRCAgICAgICAgICAgIChJTikgICAgICAgU3RyZWFtIElEIG9mIHRoZSB0cmFjay4KLSAqIEBwYXJhbSAgIGF1UHRyICAgICAgICAgICAgICAgKElOL09VVCkgICBBY2Nlc3MgdW5pdC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG51bGwgb3IgaW5jb3JyZWN0Ci0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9TVFJFQU1fSUQ6ICAgICAgICBVbmtub3duIHN0cmVhbSBJRAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgICAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgICAgICAgICBJbnZhbGlkIHN0YXRlCi0gKiBAcmV0dXJuICAgIE00V0FSX01QNFdfTk9UX0VWQUxVQUJMRTogICBJdCBpcyBub3QgcG9zc2libGUgdG8gZXZhbHVhdGUgYXVkaW8gc2l6ZSBpZiBhdWRpbwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcyBkb24ndCBoYXZlIGEgY29uc3RhbnQgc2l6ZS4KLSAqIEByZXR1cm4gICAgTTRXQVJfTVA0V19PVkVSU0laRTogICAgICAgIE1heCBmaWxlIHNpemUgd2FzIHJlYWNoZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TVA0V19wcm9jZXNzQVUoIE00T1NBX0NvbnRleHQgICAgICAgIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfU3RyZWFtSUQgICAgICAgc3RyZWFtSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfQWNjZXNzVW5pdCogICAgYXVQdHIpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgQ2xvc2UgdGhlIE1QNCBmaWxlCi0gKiBAbm90ZSAgICAgIEluIHByZXZpb3VzIHZlcnNpb25zIG9mIHRoZSBNUDQgd3JpdGVyLCB0aGUgTTRNUDRXX2ZyZWVDb250ZXh0IG1ldGhvZAotICogICAgICAgICAgICB3YXMgaW4gdGhlIGludGVyZmFjZSwgd2hpY2ggaXMgbm90IHRoZSBjYXNlIGFueW1vcmUuCi0gKiAgICAgICAgICAgIFRoZSBjb250ZXh0IGlzIG5vdyBhbHdheXMgZGVhbGxvY2F0ZWQgaW4gdGhlIE00TVA0V19jbG9zZVdyaXRlIGZ1bmN0aW9uLgotICogQHBhcmFtICAgICBjb250ZXh0ICAgICAgICAgICAgIChJTi9PVVQpIE1QNCB3cml0ZXIgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbnVsbCBvciBpbmNvcnJlY3QKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TVA0V19jbG9zZVdyaXRlKCBNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBBc2sgdGhlIGNvcmUgTVA0IHdyaXRlciB0byByZXR1cm4gdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3B0aW9uSUQKLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgICAgIChJTikgICAgTVA0IHdyaXRlciBjb250ZXh0LgotICogQHBhcmFtICAgIG9wdGlvbiAgICAgICAgICAgICAgICAgKElOKSAgICBPcHRpb24gSUQuCi0gKiBAcGFyYW0gICAgdmFsdWVQdHIgICAgICAgICAgICAgICAoT1VUKSAgIFBvaW50ZXIgdG8gdGhlIG9wdGlvbiB2YWx1ZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBudWxsIG9yIGluY29ycmVjdAotICogQHJldHVybiAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQ6ICBOb3QgaW1wbGVtZW50ZWQgaW4gdGhlIGN1cnJlbnQgdmVyc2lvbgotICogQHJldHVybiAgICBNNEVSUl9CQURfT1BUSU9OX0lEOiAgICBVbmtub3duIG9wdGlvbklECi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9TVFJFQU1fSUQ6ICAgIEJhZCBzdHJlYW0gSUQgaW4gdGhlIG9wdGlvbiB2YWx1ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNUDRXX2dldE9wdGlvbiggTTRPU0FfQ29udGV4dCAgICAgICAgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9PcHRpb25JRCAgICAgICAgb3B0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gICAgKnZhbHVlUHRyKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgQXNrIHRoZSBjb3JlIE1QNCB3cml0ZXIgdG8gc2V0IHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIG9wdGlvbklELgotICogQHBhcmFtICAgIGNvbnRleHQgICAgICAgICAgICAgIChJTi9PVVQpICBNUDQgd3JpdGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgb3B0aW9uICAgICAgICAgICAgICAgKElOKSAgICAgIE9wdGlvbiBJRC4KLSAqIEBwYXJhbSAgICB2YWx1ZSAgICAgICAgICAgICAgICAoSU4pICAgICAgT3B0aW9uIHZhbHVlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG51bGwgb3IgaW5jb3JyZWN0Ci0gKiBAcmV0dXJuICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRDogIE5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgY3VycmVudCB2ZXJzaW9uCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9PUFRJT05fSUQ6ICAgIFVua25vd24gb3B0aW9uSUQKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX1NUUkVBTV9JRDogICAgQmFkIHN0cmVhbSBJRCBpbiB0aGUgb3B0aW9uIHZhbHVlCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgICAgIEEgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1QNFdfc2V0T3B0aW9uKCBNNE9TQV9Db250ZXh0ICAgICAgIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfT3B0aW9uSUQgICAgICBvcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiAgICB2YWx1ZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIEFzayB0aGUgY29yZSBNUDQgd3JpdGVyIHRvIHJldHVybiBpdHMgc3RhdGUuCi0gKiBAbm90ZSAgICAgQnkgc2VsZWN0aW5nIGEgc3BlY2lmaWMgc3RyZWFtSUQgKG5vdCBudWxsKSwgdGhlIGNhbGxlciBjYW4gb2J0YWluCi0gKiAgICAgICAgICAgdGhlIHN0YXRlIG9mIGEgc3BlY2lmaWMgc3RyZWFtLiBCeSB1c2luZyAwIGFzIHN0cmVhbUlEIHRoZSByZXR1cm5lZAotICogICAgICAgICAgIHN0YXRlIGlzIG5vdCBzdHJlYW0gc3BlY2lmaWMuCi0gKiBAcGFyYW0gICAgY29udGV4dCAgICAgICAgICAgICAgICAoSU4vT1VUKSBNUDQgd3JpdGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgY29udGV4dCAgICAgICAgICAgICAgICAoSU4pICAgICBQb2ludGVyIHRvIHRoZSBzdGF0ZSBlbnVtZXJhdGlvbi4KLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgICAgIChJTi9PVVQpIHN0cmVhbUlEIG9mIHRoZSBzdHJlYW0gdG8gcmV0cmlldmUgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWNyby1zdGF0ZSAoMCBmb3IgZ2xvYmFsIHN0YXRlKS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX1NUUkVBTV9JRDogICAgVW5rbm93biBzdHJlYW0gSUQKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBudWxsIG9yIGluY29ycmVjdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNUDRXX2dldFN0YXRlKCBNNE9TQV9Db250ZXh0ICAgIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1QNFdfU3RhdGUqICAgIHN0YXRlUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfU3RyZWFtSUQgICBzdHJlYW1JRCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIEdldCB0aGUgY3VycmVudGx5IGV4cGVjdGVkIGZpbGUgc2l6ZQotICogQHBhcmFtICAgIGNvbnRleHQgICAgICAgICAgICAgKElOL09VVCkgTVA0IHdyaXRlciBjb250ZXh0LgotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNUDRXX2dldEN1cnJlbnRGaWxlU2l6ZSggTTRPU0FfQ29udGV4dCAgICAgICAgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqICAgICAgICBjdXJyZW50RmlsZVNpemUpOwotCi0jZW5kaWYgLyogX000TVA0V19VU0VfQ1NUX01FTU9SWV9XUklURVIgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotCi0jZW5kaWYgLypNNE1QNFdfV1JJVEVSX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9BbmRyb2lkLm1rIGIvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9zcmMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGFiMzJiYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLSMKLSMgbGliM2dwd3JpdGVyCi0jCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEU6PSBsaWJ2aWRlb2VkaXRvcl8zZ3B3cml0ZXIKLQotTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgXAotICAgICAgTTRNUDRXX0ludGVyZmFjZS5jIFwKLSAgICAgIE00TVA0V19VdGlscy5jIFwKLSAgICAgIE00TVA0V19Xcml0ZXIuYwotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJjdXRpbHMgICAgICAgICAgICAgXAotICAgIGxpYnV0aWxzICAgICAgICAgICAgICBcCi0gICAgbGlidmlkZW9lZGl0b3Jfb3NhbCAgIFwKLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYwotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmRsCi0KLSMgQWxsIG9mIHRoZSBzaGFyZWQgbGlicmFyaWVzIHdlIGxpbmsgYWdhaW5zdC4KLUxPQ0FMX0xETElCUyA6PSBcCi0gICAgLWxwdGhyZWFkIC1sZGwKLQotTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyIFwKLSAgICAtRERVUExJQ0FURV9TVFRTX0lOX0xBU1RfQVUKLQotaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9NNE1QNFdfSW50ZXJmYWNlLmMgYi9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9NNE1QNFdfSW50ZXJmYWNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMyYzUyNTAuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9zcmMvTTRNUDRXX0ludGVyZmFjZS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTE0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00TVA0V19JbnRlcmZhY2UuYwotICogQGJyaWVmICAgIDNHUFAgZmlsZSB3cml0ZXIgaW50ZXJmYWNlCi0gKiBAbm90ZSAgICBUaGlzIGltcGxlbWVudGF0aW9uIGZvbGxvd3MgdGhlIGNvbW1vbiBpbnRlcmZhY2UgZGVmaW5lZAotICogICAgICAgICAgaW4gIk00V1JJVEVSX2NvbW1vbi5oIi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0KLS8qKgotICogT1NBTCBpbmNsdWRlcyAqLwotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiICAgICAgICAgICAgLyoqPCBPU0FMIGJhc2ljIHR5cGVzIGRlZmluaXRvbiAqLwotI2luY2x1ZGUgIk00T1NBX0ZpbGVXcml0ZXIuaCIgICAgICAgIC8qKjwgSW5jbHVkZSBmb3IgT1NBTCBmaWxlIGFjY2Vzc2VzIGltcGxlbWVudGF0aW9uICovCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiICAgICAgICAgICAgLyoqPCBJbmNsdWRlIGZvciBPU0FMIG1lbW9yeSBhY2Nlc3NlcyBpbXBsZW1lbnRhdGlvbiAqLwotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiICAgICAgICAgICAgLyoqPCBPU0FMIGRlYnVnIHRvb2xzICovCi0KLS8qKgotICogV3JpdGVyIGluY2x1ZGVzICovCi0jaW5jbHVkZSAiTTRXUklURVJfY29tbW9uLmgiICAgICAgICAvKio8IERlZmluaXRpb24gb2YgdGhlIHdyaXRlciBjb21tb24gaW50ZXJmYWNlIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgbW9kdWxlIGZvbGxvd3MgKi8KLQotI2lmZGVmIF9NNE1QNFdfVVNFX0NTVF9NRU1PUllfV1JJVEVSCi0jaW5jbHVkZSAiTTRNUDRXX1R5cGVzX0NzdE1lbS5oIiAgICAvKio8IE1QNC8zR1AgY29yZSB3cml0ZXIgdHlwZXMgKi8KLSNpbmNsdWRlICJNNE1QNFdfV3JpdGVyX0NzdE1lbS5oIiAgICAvKio8IE1QNC8zR1AgY29yZSB3cml0ZXIgZnVuY3Rpb25zICovCi0jZWxzZQotI2luY2x1ZGUgIk00TVA0V19UeXBlcy5oIiAgICAgICAgICAgIC8qKjwgTVA0LzNHUCBjb3JlIHdyaXRlciB0eXBlcyAqLwotI2luY2x1ZGUgIk00TVA0V19Xcml0ZXIuaCIgICAgICAgICAgICAvKio8IE1QNC8zR1AgY29yZSB3cml0ZXIgZnVuY3Rpb25zICovCi0jZW5kaWYgLyogX000TVA0V19VU0VfQ1NUX01FTU9SWV9XUklURVIgKi8KLQotLyoqCi0gKiBTcGVjaWZpYyBlcnJvcnMgZm9yIHRoaXMgbW9kdWxlICovCi0jZGVmaW5lIE00V1JJVEVSXzNHUF9FUlJfVU5TVVBQT1JURURfU1RSRUFNX1RZUEUgXAotICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNFdSSVRFUl8zR1AsIDB4MDAwMDAxKQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00V1JJVEVSXzNHUF9JbnRlcm5hbENvbnRleHQKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgd3JpdGVyIGNvbnRleHQgKHByaXZhdGUpCi0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgYWxsIHdyaXRlciBjYWxscyB0byBzdG9yZSB0aGUgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfQ29udGV4dCAgICBwTVA0Q29udGV4dDsgICAgLyoqPCBNUDQgd3JpdGVyIGNvbnRleHQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbWF4QVVzaXplczsgICAgICAgIC8qKjwgdGhlIG1heGltdW0gQVUgc2l6ZSBwb3NzaWJsZSAqLwotfSBNNFdSSVRFUl8zR1BfSW50ZXJuYWxDb250ZXh0OwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFdSSVRFUl8zR1Bfb3BlbldyaXRlKE00V1JJVEVSX0NvbnRleHQqIHBDb250ZXh0LCB2b2lkKiBwV2hhdCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogcEZpbGVXcml0ZXJQb2ludGVyKQotICogQGJyaWVmICAgIE9wZW4gYSB3cml0ZXIgc2Vzc2lvbi4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAoT1VUKSBFeGVjdXRpb24gY29udGV4dCBvZiB0aGUgM0dQIHdyaXRlciwgYWxsb2NhdGVkIGJ5IHRoaXMgZnVuY3Rpb24uCi0gKiBAcGFyYW0gICAgb3V0cHV0RmlsZURlc2NyaXB0b3IgKElOKSAgRGVzY3JpcHRvciBvZiB0aGUgb3V0cHV0IGZpbGUgdG8gY3JlYXRlLgotICogQHBhcmFtICAgIGZpbGVXcml0ZXJGdW5jdGlvbiAgICAgKElOKSAgUG9pbnRlciB0byBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgc2V0IG9mIE9TQUwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSB3cml0ZSBmdW5jdGlvbnMuCi0gKiBAcGFyYW0gICAgdGVtcEZpbGVEZXNjcmlwdG9yICAgICAoSU4pICBEZXNjcmlwdG9yIG9mIHRoZSB0ZW1wb3JhcnkgZmlsZSB0byBvcGVuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTlVMTCBpZiBub3QgdXNlZCkKLSAqIEBwYXJhbSAgICBmaWxlUmVhZGVyRnVuY3Rpb24gICAgIChJTikgIFBvaW50ZXIgdG8gc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIHNldCBvZiBPU0FMIGZpbGUgcmVhZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9ucyAoTlVMTCBpZiBub3QgdXNlZCkKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBvciBwRmlsZVB0ckZjdCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgICBhbnkgZXJyb3IgcmV0dXJuZWQgYnkgdGhlIE1QNCBjb3JlIHdyaXRlciBvcGVuV3JpdGUgKEl0cyBjb3JlSUQgaXMgTTRNUDRfV1JJVEVSKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFdSSVRFUl8zR1Bfb3BlbldyaXRlKCBNNFdSSVRFUl9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBvdXRwdXRGaWxlRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogcEZpbGVXcml0ZXJQb2ludGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHRlbXBGaWxlRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZGVyUG9pbnRlciApCi17Ci0gICAgTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCogYXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMCgiTTRXUklURVJfM0dQX29wZW5Xcml0ZSIpOwotCi0gICAgLyoqCi0gICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00V1JJVEVSXzNHUF9vcGVuV3JpdGU6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcEZpbGVXcml0ZXJQb2ludGVyKSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRXUklURVJfM0dQX29wZW5Xcml0ZTogcEZpbGVXcml0ZXJQb2ludGVyIGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICAqICAgIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGNvbnRleHQgKi8KLSAgICAqcENvbnRleHQ9TTRPU0FfTlVMTDsKLSAgICBhcENvbnRleHQgPSAoTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICBzaXplb2YoTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCksCi0gICAgICAgICAgICAgICAgICAgIE00V1JJVEVSXzNHUCwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCIpOwotCi0gICAgaWYgKE00T1NBX05VTEwgPT0gYXBDb250ZXh0KQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00V1JJVEVSXzNHUF9vcGVuV3JpdGU6XAotICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBjb250ZXh0LCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgcmV0dXJuIChNNE9TQV9FUlIpTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogICAgUmVzZXQgY29udGV4dCB2YXJpYWJsZXMgKi8KLSAgICBhcENvbnRleHQtPnBNUDRDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBhcENvbnRleHQtPm1heEFVc2l6ZXMgPSAwOwotCi0gICAgLyoqCi0gICAgICogICAgUmV0dXJuIHRoZSB3cml0ZXIgY29udGV4dCAqLwotICAgICpwQ29udGV4dCA9IChNNFdSSVRFUl9Db250ZXh0ICopYXBDb250ZXh0OwotCi0gICAgLyoqCi0gICAgICogICAgTGF1bmNoIHRoZSBvcGVuV3JpdGUgb2YgdGhlIE1QNCB3cml0ZXIgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRXUklURVJfM0dQX29wZW5Xcml0ZTogY2FsbGluZyBNNE1QNFdfb3BlbldyaXRlKCkiKTsKLQotICAgIGVyciA9IE00TVA0V19vcGVuV3JpdGUoJmFwQ29udGV4dC0+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+IGJpdHMuCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOL09VVCkgTTRfQml0U3RyZWFtUGFyc2VyIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgbGVuZ3RoICAgICAgICAoSU4pIFRoZSBudW1iZXIgb2YgYml0IHRvIHNoaWZ0IHRoZSBiaXRzdHJlYW0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi12b2lkIE00X0JpdFN0cmVhbVBhcnNlcl9GbHVzaEJpdHModm9pZCogcENvbnRleHQsIE00T1NBX0ludDMyIGxlbmd0aCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIEdldCBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBwb2ludGVkIGJ5IHRoZSBiaXRzdHJlYW0gcG9pbnRlci4KLSAqIEl0IGRvZXMgbm90IHVwZGF0ZSB0aGUgYml0c3RyZWFtIHBvaW50ZXIKLSAqCi0gKiBAcGFyYW0gcENvbnRleHQgICA6IEEgcG9pbnRlciB0byB0aGUgY29udGV4dCBpbnRlcm5hbGx5IHVzZWQgYnkgdGhlIHBhY2thZ2UKLSAqIEBwYXJhbSBsZW5ndGggICAgICAgIDogVGhlIG51bWJlciBvZiBiaXQgdG8gZXh0cmFjdCBmcm9tIHRoZSBiaXRzdHJlYW0KLSAqCi0gKiBAcmV0dXJucyB0aGUgcmVhZCBiaXRzCi0qLwotTTRPU0FfVUludDMyIE00X0JpdFN0cmVhbVBhcnNlcl9HZXRCaXRzKHZvaWQqIHBDb250ZXh0LE00T1NBX0ludDMyIGJpdFBvcywgTTRPU0FfSW50MzIgbGVuZ3RoKTsKLQotLyoqCi0qIE00X0JpdFN0cmVhbVBhcnNlcl9SZXN0YXJ0IHJlc2V0cyB0aGUgYml0c3RyZWFtIGluZGV4ZXMuCi0qCi0qIEBwYXJhbSBwQ29udGV4dCAgIDogQSBwb2ludGVyIHRvIHRoZSBjb250ZXh0IGludGVybmFsbHkgdXNlZCBieSB0aGUgcGFja2FnZQotKgotKi8KLXZvaWQgTTRfQml0U3RyZWFtUGFyc2VyX1Jlc3RhcnQodm9pZCogcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBHZXQgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgcG9pbnRlZCBieSB0aGUgYml0c3RyZWFtIHBvaW50ZXIuCi0gKiBAcmV0dXJucyBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIHRoZSBiaXRzdHJlYW0KLSAqIEBub3RlICAgIEl0IHNob3VsZCBiZSB1c2VkIGNhcmVmdWxseSBhcyB0aGUgcG9pbnRlciBpcyBpbiB0aGUgYml0c3RyZWFtIGl0c2VsZgotICogICAgICAgICAgICBhbmQgbm8gY29weSBpcyBtYWRlLgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTi9PVVQpICBNNF9CaXRTdHJlYW1QYXJzZXIgY29udGV4dC4KLSovCi1NNE9TQV9VSW50OCogIE00X0JpdFN0cmVhbVBhcnNlcl9HZXRDdXJyZW50Yml0U3RyZWFtUG9pbnRlcih2b2lkKiBwQ29udGV4dCk7Ci0KLS8qKgotKiBNNF9CaXRTdHJlYW1QYXJzZXJfR2V0U2l6ZSBnZXRzIHRoZSBzaXplIG9mIHRoZSBiaXRzdHJlYW0gaW4gYnl0ZXMKLSoKLSogQHBhcmFtIHBDb250ZXh0ICAgOiBBIHBvaW50ZXIgdG8gdGhlIGNvbnRleHQgaW50ZXJuYWxseSB1c2VkIGJ5IHRoZSBwYWNrYWdlCi0qCi0qIEByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBiaXRzdHJlYW0gaW4gYnl0ZXMKLSovCi1NNE9TQV9JbnQzMiBNNF9CaXRTdHJlYW1QYXJzZXJfR2V0U2l6ZSh2b2lkKiBwQ29udGV4dCk7Ci0KLXZvaWQgTTRfTVBFRzRCaXRTdHJlYW1QYXJzZXJfSW5pdCh2b2lkKiogcENvbnRleHQsIHZvaWQqIHBCaXRTdHJlYW0sIE00T1NBX0ludDMyIHNpemUpOwotCi0vKioKLSogZ2V0TXBlZ0xlbmd0aEZyb21JbnRlZ2VyIHJldHVybnMgYSBkZWNvZGVkIHNpemUgdmFsdWUgZnJvbSBhbiBlbmNvZGVkIG9uZSAoU0RMKQotKgotKiBAcGFyYW0gcENvbnRleHQgICA6IEEgcG9pbnRlciB0byB0aGUgY29udGV4dCBpbnRlcm5hbGx5IHVzZWQgYnkgdGhlIHBhY2thZ2UKLSogQHBhcmFtIHZhbCA6IGVuY29kZWQgdmFsdWUKLSoKLSogQHJldHVybnMgc2l6ZSBpbiBhIGh1bWFuIHJlYWRhYmxlIGZvcm0KLSovCi0KLU00T1NBX0ludDMyIE00X01QRUc0Qml0U3RyZWFtUGFyc2VyX0dldE1wZWdMZW5ndGhGcm9tSW50ZWdlcih2b2lkKiBwQ29udGV4dCwgTTRPU0FfVUludDMyIHZhbCk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgRGVjb2RlIGFuIE1QRUc0IFN5c3RlbXMgZGVzY3JpcHRvciBzaXplIGZyb20gYW4gZW5jb2RlZCBTREwgc2l6ZSBkYXRhLgotICogQG5vdGUgICAgVGhlIHZhbHVlIGlzIHJlYWQgZnJvbSB0aGUgY3VycmVudCBiaXRzdHJlYW0gbG9jYXRpb24uCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOL09VVCkgIE00X0JpdFN0cmVhbVBhcnNlciBjb250ZXh0LgotICogQHJldHVybiAgICBTaXplIGluIGEgaHVtYW4gcmVhZGFibGUgZm9ybQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0ludDMyIE00X01QRUc0Qml0U3RyZWFtUGFyc2VyX0dldE1wZWdMZW5ndGhGcm9tU3RyZWFtKHZvaWQqIHBDb250ZXh0KTsKLQotI2VuZGlmIC8qX19NNF9CSVRTVFJFQU1QQVJTRVJfSF9fKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRfQ29tbW9uLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNF9Db21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzYwYTdkYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNF9Db21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNF9Db21tb24uaAotICogQGJyaWVmICBDb21tb24gZGF0YSBzdHJ1Y3R1cmUgYmV0d2VlbiBzaGVsbHMKLSAqIEBub3RlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBfX000X0NPTU1PTl9IX18KLSNkZWZpbmUgX19NNF9DT01NT05fSF9fCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBfcGFyYW1ldGVyU2V0Ci0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHN0cnVjdHVyZSBvZiBwYXJhbWV0ZXJzIGZvciB0aGUgYXZjCi0gKiAgICAgICAgICAgICAgIGRlY29kZXIgc3BlY2lmaWMgaW5mbwotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCBfcGFyYW1ldGVyU2V0Ci17Ci0gICAgTTRPU0FfVUludDE2IG1fbGVuZ3RoOyAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgaXRlbXMqLwotICAgIE00T1NBX1VJbnQ4KiBtX3BQYXJhbWV0ZXJTZXRVbml0OyAgIC8qIEFycmF5IG9mIGl0ZW1zKi8KLX0gUGFyYW1ldGVyU2V0IDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgX2F2Y1NwZWNpZmljSW5mbwotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgb2Ygc3BlY2lmaWMgaW5mbyBmb3IgdGhlIGF2YyBkZWNvZGVyCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IF9hdmNTcGVjaWZpY0luZm8KLXsKLSAgICBNNE9TQV9VSW50OCAgICAgICAgbV9uYWxVbml0TGVuZ3RoOyAgICAgICAgICAgICAgICAvKiBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIE5BTFVuaXRMZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIGluIGEgQVZDIHNhbXBsZSAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICBtX251bU9mU2VxdWVuY2VQYXJhbWV0ZXJTZXRzOyAgIC8qIE51bWJlciBvZiBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0cyovCi0gICAgTTRPU0FfVUludDggICAgICAgIG1fbnVtT2ZQaWN0dXJlUGFyYW1ldGVyU2V0czsgICAgLyogTnVtYmVyIG9mIHBpY3R1cmUgcGFyYW1ldGVyIHNldHMqLwotICAgIFBhcmFtZXRlclNldCAgICAqbV9wU2VxdWVuY2VQYXJhbWV0ZXJTZXQ7ICAgICAgICAvKiBTZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0cyBhcnJheSovCi0gICAgUGFyYW1ldGVyU2V0ICAgICptX3BQaWN0dXJlUGFyYW1ldGVyU2V0OyAgICAgICAgLyogUGljdHVyZSBwYXJhbWV0ZXIgc2V0cyBhcnJheSovCi19IEF2Y1NwZWNpZmljSW5mbyA7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00X1N5bnRoZXNpc0F1ZGlvSW5mbwotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBzcGVjaWZpYyBwb2ludGVycyB1c2VkIGZvciBzeW50aGVzaXMgYXVkaW8gZm9ybWF0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgX3N5bnRoZXNpc0F1ZGlvSW5mbwotewotICAgIE00T1NBX1ZvaWQqICAgICAgICBtX3BJbnB1dEJ1ZjsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgbV9wSW5wdXRJbmZvOwotICAgIE00T1NBX1VJbnQxNiAgICBtX3VpTmJTdWJGcmFtZVBlclN0ZXA7Ci0gICAgTTRPU0FfVUludDMyICAgIG1fdWlVc2VkQnl0ZXM7Ci19IE00X1N5bnRoZXNpc0F1ZGlvSW5mbzsKLQotCi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTRfQUFDRG93bnNhbXBsaW5nTW9kZQotICogQGJyaWVmICAgVGhpcyBlbnVtIHN0YXRlcyBtb2RlcyBmb3IgRG93biBzYW1wbGluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIEFBQ19rRFNfT0ZGICAgID0gMCwgICAgICAgIC8qKjwgTm8gRG93biBzYW1wbGluZyAqLwotICAgIEFBQ19rRFNfQllfMiAgID0gMSwgICAgICAgIC8qKjwgRG93biBzYW1wbGluZyBieSAyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9maWxlID0gQUFDIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IHNhbXBsaW5nIHJhdGUgPSBhYWNfc2FtcF9mcmVxLzIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2ZpbGUgPSBIRV9BQUMgYW5kIGlucHV0IGlzIEFBQzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0IHNhbXBsaW5nIHJhdGUgPSBhYWNfc2FtcF9mcmVxLihObyBkb3duc2FtcGluZykuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9maWxlID0gSEVfQUFDIGFuZCBpbnB1dCBpcyBIRV9BQUM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dCBzYW1wbGluZyByYXRlID0gYWFjX3NhbXBfZnJlcSAoRG93bnNhbXBsaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9jY3VycyBpbiBTQlIgdG9vbCkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHByb2ZpbGUgPSBIRV9BQUNfdjIgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3QgU3VwcG9ydGVkICovCi0gICAgQUFDX2tEU19CWV8zICAgPSAyLCAgICAgICAgLyoqPCBEb3duIHNhbXBsaW5nIGJ5IDMgIC0gb25seSBmb3IgQUFDIHByb2ZpbGUgKi8KLSAgICBBQUNfa0RTX0JZXzQgICA9IDMsICAgICAgICAvKio8IERvd24gc2FtcGxpbmcgYnkgNCAgLSBvbmx5IGZvciBBQUMgcHJvZmlsZSAqLwotICAgIEFBQ19rRFNfQllfOCAgID0gNCAgICAgICAgLyoqPCBEb3duIHNhbXBsaW5nIGJ5IDggIC0gb25seSBmb3IgQUFDIHByb2ZpbGUgKi8KLQotfSBNNF9BQUNEb3duc2FtcGxpbmdNb2RlOwotCi0KLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNF9BQUNPdXRwdXRNb2RlCi0gKiBAYnJpZWYgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgb3V0cHV0IG1vZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBBQUNfa01vbm8gICAgICA9IDAsICAgIC8qKjwgT3V0cHV0IGlzIE1vbm8gICovCi0gICAgQUFDX2tTdGVyZW8gICAgPSAxICAgICAvKio8IE91dHB1dCBpcyBTdGVyZW8gKi8KLX0gTTRfQUFDT3V0cHV0TW9kZTsKLQotCi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTRfQUFDRGVjUHJvZmlsZQotICogQGJyaWVmICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIEFBQyBkZWNvZGVyIHByb2ZpbGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBBQUNfa0FBQyAgICAgICA9IDAsICAgICAgICAvKio8IEFBQyBwcm9maWxlIChvbmx5IEFBQyBMQyBvYmplY3QgYXJlIHN1cHBvcnRlZCkgKi8KLSAgICBBQUNfa0hFX0FBQyAgICA9IDEsICAgICAgICAvKio8IEhFIEFBQyBvciBBQUMrIHByb2ZpbGUgKFNCUiBpbiBMUCBNb2RlKSAgKi8KLSAgICBBQUNfa0hFX0FBQ192MiA9IDIgICAgICAgIC8qKjwgSEUgQUFDIHYyIG9yIEVuaGFuY2VkIEFBQysgcHJvZmlsZSAoU0JSIFRvb2wgaW4gSFEgTW9kZSkgKi8KLX0gTTRfQUFDRGVjUHJvZmlsZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNF9BYWNEZWNvZGVyQ29uZmlnCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgc3BlY2lmaWMgc2V0dGluZ3MgYWNjb3JkaW5nIHRvCi0gKiAgICAgICAgICAgICAgICB0aGUgdXNlciByZXF1aXJlbWVudHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00X0FBQ0RlY1Byb2ZpbGUgICAgICAgIG1fQUFDRGVjb2RlclByb2ZpbGU7Ci0gICAgTTRfQUFDRG93bnNhbXBsaW5nTW9kZSAgICBtX0Rvd25TYW1wbGluZ01vZGU7Ci0gICAgTTRfQUFDT3V0cHV0TW9kZSAgICAgICAgbV9PdXRwdXRNb2RlOwotCi19IE00X0FhY0RlY29kZXJDb25maWc7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgTTRSRUFERVJfQXVkaW9TYnJVc2VyZGF0YQotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHVzZXIncyBkYXRhIG5lZWRlZCB0byBkZWNvZGUgdGhlCi0gKiAgICAgICAgICAgIEFBQ3BsdXMgc3RyZWFtCi0gKiBAbm90ZSAgICBUaGUgZmllbGQgbV9wRmlyc3RBVSBpcyB1c2VkIGluIGNhc2Ugb2YgbG9jYWwgZmlsZXMgICAgYW5kCi0gKiAgICAgICAgICAgIHRoZSBmaWVsZCBtX2JJc1NickVuYWJsZWQgaXMgdXNlZCBpbiBzdHJlYW1pbmcgY2FzZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICBNNE9TQV9Wb2lkKiAgICAgICAgICAgIG1fcEZpcnN0QVU7ICAgICAgICAgICAgICAgIC8qKjwgVGhlIGZpcnN0IEFVIGZyb20gd2hlcmUgU0JSIGRhdGEgYXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0ZWQgKGxvY2FsIGZpbGUgY2FzZSkqLwotICBNNE9TQV9Cb29sICAgICAgICAgICAgbV9iSXNTYnJFbmFibGVkOyAgICAgICAgLyoqPCBBIGJvb2xlYW4gdGhhdCBpbmRpY2F0ZXMgaWYgdGhlIHN0cmVhbSBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBQ3BsdXMgKHN0cmVhbWluZyBjYXNlKSovCi0gIE00X0FhY0RlY29kZXJDb25maWcqICAgIG1fcEFhY0RlY29kZXJVc2VyQ29uZmlnOy8qKjwgRGVjb2RlciBzcGVjaWZpYyB1c2VyIHNldHRpbmcgKi8KLQotfSBNNFJFQURFUl9BdWRpb1NiclVzZXJkYXRhOwotCi0jZW5kaWYgLyogX19NNF9DT01NT05fSF9fKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRfVXRpbHMuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000X1V0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGExZTA4MjkuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRfVXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNF9VdGlscy5oCi0gKiBAYnJpZWYgICAgVXRpbGl0aWVzCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgZGVmaW5lcyB1dGlsaXR5IG1hY3JvcwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgX19NNF9VVElMU19IX18KLSNkZWZpbmUgX19NNF9VVElMU19IX18KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKiAgICBNNF9NZWRpYVRpbWUgZGVmaW5pdGlvbgotICAgIFRoaXMgdHlwZSBpcyB1c2VkIGludGVybmFsbHkgYnkgc29tZSBzaGVsbCBjb21wb25lbnRzICovCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLXR5cGVkZWYgTTRPU0FfRG91YmxlICAgIE00X01lZGlhVGltZTsKLQotLyogICAgR0VUX01FTU9SWTMyIG1hY3JvIGRlZmluaXRpb24KLSAgICBUaGlzIG1hY3JvIGlzIHVzZWQgYnkgdGhlIDNHUCByZWFkZXIqLwotI2lmZGVmIF9fQklHX0VORElBTgotI2RlZmluZSBHRVRfTUVNT1JZMzIoeCkgKHgpCi0jZWxzZQotI2RlZmluZSBHRVRfTUVNT1JZMzIoeCkgKCAoKCh4KSYweGZmKTw8MjQpIHwgKCgoeCkmMHhmZjAwKTw8OCkgfFwKLSAgICAgKCgoeCkmMHhmZjAwMDApPj44KSB8ICgoKHgpJjB4ZmYwMDAwMDApPj4yNCkgKQotI2VuZGlmIC8qX19CSUdfRU5ESUFOKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9fTTRfVVRJTFNfSF9fKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRfVmlkZW9FZGl0aW5nQ29tbW9uLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNF9WaWRlb0VkaXRpbmdDb21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWU3ZDAzZi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNF9WaWRlb0VkaXRpbmdDb21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDMzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRfVmlkZW9FZGl0aW5nQ29tbW9uLmgKLSAqIEBicmllZiAgICBWaWRlbyBFZGl0aW5nIChWU1MzR1BQLCBNQ1MsIFBUTzNHUFApIGNvbW1vbiBkZWZpbml0aW9ucwotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgX19NNF9WSURFT0VESVRJTkdDT01NT05fSF9fCi0jZGVmaW5lIF9fTTRfVklERU9FRElUSU5HQ09NTU9OX0hfXwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qKgotICogICAgVmVyc2lvbiAqLwotLyogQ0hBTkdFX1ZFUlNJT05fSEVSRSAqLwotI2RlZmluZSBNNFZJREVPRURJVElOR19WRVJTSU9OX01BSk9SICAgIDMKLSNkZWZpbmUgTTRWSURFT0VESVRJTkdfVkVSU0lPTl9NSU5PUiAgICAxCi0jZGVmaW5lIE00VklERU9FRElUSU5HX1ZFUlNJT05fUkVWSVNJT04gICAgMAotCi0jZGVmaW5lIE00VklERU9FRElUSU5HX1ZJREVPX1VOS05PV05fUFJPRklMRSAweDdmZmZmZmZmCi0jZGVmaW5lIE00VklERU9FRElUSU5HX1ZJREVPX1VOS05PV05fTEVWRUwgMHg3ZmZmZmZmZgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlCi0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIGZpbGUgZm9ybWF0IHR5cGUgdG8gYmUgdXNlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bSB7Ci0gICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFAgICAgICAgID0gMCwgICAgICAvKio8IDNHUFAgZmlsZSBtZWRpYSB0eXBlIDogaW5wdXQgJiBvdXRwdXQgKi8KLSAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTVA0ICAgICAgICAgPSAxLCAgICAgIC8qKjwgTVA0ICBmaWxlIG1lZGlhIHR5cGUgOiBpbnB1dCAgICAgICAgICAqLwotICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BTVIgICAgICAgICA9IDIsICAgICAgLyoqPCBBTVIgIGZpbGUgbWVkaWEgdHlwZSA6IGlucHV0ICYgb3V0cHV0ICovCi0gICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QMyAgICAgICAgID0gMywgICAgICAvKio8IE1QMyAgZmlsZSBtZWRpYSB0eXBlIDogaW5wdXQgICAgICAgICAgKi8KLSAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfUENNICAgICAgICAgPSA0LCAgICAgIC8qKjwgUENNIFJBVyBmaWxlIG1lZGlhIHR5cGUgOiBpbnB1dCAgICBSQyAqLwotICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9KUEcgICAgICAgICA9IDUsICAgICAgLyoqPCBTVElMTCBQSUNUVVJFIEZFQVRVUkU6IEpQRyBmaWxlIG1lZGlhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgOiBpbnB1dCBBTkQgT1VUUFVUICovCi0gICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0JNUCAgICAgICAgID0gNiwgICAgICAvKio8IFNUSUxMIFBJQ1RVUkUgRkVBVFVSRTogQk1QIGZpbGUgbWVkaWEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA6IGlucHV0IG9ubHkgKi8KLSAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfR0lGICAgICAgICAgPSA3LCAgICAgIC8qKjwgU1RJTEwgUElDVFVSRSBGRUFUVVJFOiBHSUYgZmlsZSBtZWRpYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIDogaW5wdXQgb25seSAqLwotICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9QTkcgICAgICAgICA9IDgsICAgICAgLyoqPCBTVElMTCBQSUNUVVJFIEZFQVRVUkU6IFBORyBmaWxlIG1lZGlhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgOiBpbnB1dCBvbmx5ICovCi0gICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4ICAgID0gOSwgICAgICAvKio8IFNUSUxMIFBJQ1RVUkUgRkVBVFVSRTogQVJHQjg4ODggZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYSB0eXBlIDogaW5wdXQgb25seSAqLwotICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NNFYgICAgICAgICA9IDEwLCAgICAgLyoqPCBNNFYgIGZpbGUgbWVkaWEgdHlwZSA6IGlucHV0IG9ubHkgICAgICovCi0gICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX1Vuc3VwcG9ydGVkID0gMjU1ICAgICAvKio8IFVuc3VwcG9ydGVkIGZpbGUgbWVkaWEgdHlwZSAgICAgICAgICAgKi8KLX0gTTRWSURFT0VESVRJTkdfRmlsZVR5cGU7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNFZJREVPRURJVElOR19WaWRlb0Zvcm1hdAotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBhdmFsYWlibGUgdmlkZW8gY29tcHJlc3Npb24gZm9ybWF0cy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFZJREVPRURJVElOR19rTm9uZVZpZGVvID0gMCwgLyoqPCBWaWRlbyBub3QgcHJlc2VudCAqLwotICAgIE00VklERU9FRElUSU5HX2tIMjYzID0gMSwgLyoqPCBIMjYzIHZpZGVvICovCi0gICAgTTRWSURFT0VESVRJTkdfa0gyNjQgPSAyLCAgICAvKio8IEgyNjQgdmlkZW8gKi8KLSAgICBNNFZJREVPRURJVElOR19rTVBFRzQgPSAzLCAvKio8IE1QRUctNCB2aWRlbyAqLwotICAgIE00VklERU9FRElUSU5HX2tOdWxsVmlkZW8gPSAyNTQsICAvKio8IERvIG5vdCBjYXJlIHZpZGVvIHR5cGUsIHVzZSBOVUxMIGVuY29kZXIgKi8KLSAgICBNNFZJREVPRURJVElOR19rVW5zdXBwb3J0ZWRWaWRlbyA9IDI1NSAgICAvKio8IFVuc3VwcG9ydGVkIHZpZGVvIHN0cmVhbSB0eXBlICovCi19IE00VklERU9FRElUSU5HX1ZpZGVvRm9ybWF0OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00VklERU9FRElUSU5HX0F1ZGlvRm9ybWF0Ci0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIGF2YWxhaWJsZSBhdWRpbyBmb3JtYXQuCi0gKiBAbm90ZSAgICBIRV9BQUMsIEhFX0FBQ192MiBhbmQgTVAzIGNhbiBub3QgYmUgdXNlZCBmb3IgdGhlIG91dHB1dCBhdWRpbyBmb3JtYXQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0gewotICAgIE00VklERU9FRElUSU5HX2tOb25lQXVkaW8gICAgICAgICAgICA9IDAsICAgIC8qKjwgQXVkaW8gbm90IHByZXNlbnQgKi8KLSAgICBNNFZJREVPRURJVElOR19rQU1SX05CICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgQU1SIE5hcnJvdyBCYW5kIGF1ZGlvICovCi0gICAgTTRWSURFT0VESVRJTkdfa0FBQyAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IEFBQyBhdWRpbyAqLwotICAgIE00VklERU9FRElUSU5HX2tBQUNwbHVzICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBBQUMrIGF1ZGlvICovCi0gICAgTTRWSURFT0VESVRJTkdfa2VBQUNwbHVzICAgICAgICAgICAgID0gNCwgICAgLyoqPCBFbmhhbmNlZCBBQUMrIGF1ZGlvICovCi0gICAgTTRWSURFT0VESVRJTkdfa01QMyAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IE1QMyBhdWRpbyAqLwotICAgIE00VklERU9FRElUSU5HX2tFVlJDICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBFVlJDIGF1ZGlvICovCi0gICAgTTRWSURFT0VESVRJTkdfa1BDTSAgICAgICAgICAgICAgICAgPSA3LCAgICAvKio8IFBDTSBhdWRpbyAqLwotICAgIE00VklERU9FRElUSU5HX2tOdWxsQXVkaW8gICAgICAgICAgID0gMjU0LCAgLyoqPCBEbyBub3QgY2FyZSBhdWRpbyB0eXBlLCB1c2UgTlVMTCBlbmNvZGVyICovCi0gICAgTTRWSURFT0VESVRJTkdfa1Vuc3VwcG9ydGVkQXVkaW8gICAgPSAyNTUgICAgLyoqPCBVbnN1cHBvcnRlZCBhdWRpbyBzdHJlYW0gdHlwZSAqLwotfSBNNFZJREVPRURJVElOR19BdWRpb0Zvcm1hdDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZQotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBhdmFpbGFibGUgb3V0cHV0IGZyYW1lIHNpemVzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00VklERU9FRElUSU5HX2tTUUNJRj0wLCAvKio8IFNRQ0lGIDEyOHg5NiAgKi8KLSAgICBNNFZJREVPRURJVElOR19rUVFWR0EsICAgLyoqPCBRUVZHQSAxNjB4MTIwICovCi0gICAgTTRWSURFT0VESVRJTkdfa1FDSUYsICAgIC8qKjwgUUNJRiAgMTc2eDE0NCAqLwotICAgIE00VklERU9FRElUSU5HX2tRVkdBLCAgICAvKio8IFFWR0EgIDMyMHgyNDAgKi8KLSAgICBNNFZJREVPRURJVElOR19rQ0lGLCAgICAgLyoqPCBDSUYgICAzNTJ4Mjg4ICovCi0gICAgTTRWSURFT0VESVRJTkdfa1ZHQSwgICAgIC8qKjwgVkdBICAgNjQweDQ4MCAqLwotLyogK1BSIExWNTgwNyAqLwotICAgIE00VklERU9FRElUSU5HX2tXVkdBLCAgICAvKio8IFdWR0EgODAweDQ4MCAqLwotICAgIE00VklERU9FRElUSU5HX2tOVFNDLCAgICAvKio8IE5UU0MgNzIweDQ4MCAqLwotLyogLVBSIExWNTgwNyAqLwotCi0vKiArQ1IgR29vZ2xlICovCi0gICAgTTRWSURFT0VESVRJTkdfazY0MF8zNjAsICAvKio8IDY0MHgzNjAgKi8KLSAgICBNNFZJREVPRURJVElOR19rODU0XzQ4MCwgIC8qKjwgODU0eDQ4MCAqLwotICAgIE00VklERU9FRElUSU5HX2sxMjgwXzcyMCwgLyoqPCA3MjBwIDEyODB4NzIwICovCi0gICAgTTRWSURFT0VESVRJTkdfazEwODBfNzIwLCAvKio8IDcyMHAgMTA4MHg3MjAgKi8KLSAgICBNNFZJREVPRURJVElOR19rOTYwXzcyMCwgIC8qKjwgNzIwcCA5NjB4NzIwICovCi0gICAgTTRWSURFT0VESVRJTkdfazE5MjBfMTA4MCAvKio8MTA4MHAgMTkyMHgxMDgwKi8KLS8qIC1DUiBHb29nbGUgKi8KLQotfSBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00VklERU9FRElUSU5HX1ZpZGVvZnJhbWVyYXRlCi0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIGF2YWlsYWJsZSB2aWRlbyBmcmFtZXJhdGVzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00VklERU9FRElUSU5HX2s1X0ZQUyA9IDAsCi0gICAgTTRWSURFT0VESVRJTkdfazdfNV9GUFMsCi0gICAgTTRWSURFT0VESVRJTkdfazEwX0ZQUywKLSAgICBNNFZJREVPRURJVElOR19rMTJfNV9GUFMsCi0gICAgTTRWSURFT0VESVRJTkdfazE1X0ZQUywKLSAgICBNNFZJREVPRURJVElOR19rMjBfRlBTLAotICAgIE00VklERU9FRElUSU5HX2syNV9GUFMsCi0gICAgTTRWSURFT0VESVRJTkdfazMwX0ZQUwotfSBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lcmF0ZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00VklERU9FRElUSU5HX0F1ZGlvU2FtcGxpbmdGcmVxdWVuY3kKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgYXZhaWxhYmxlIG91dHB1dCBhdWRpbyBzYW1wbGluZyBmcmVxdWVuY2llcwotICogQG5vdGUgICAgOCBrSHogaXMgdGhlIG9ubHkgc3VwcG9ydGVkIGZyZXF1ZW5jeSBmb3IgQU1SLU5CIG91dHB1dAotICogQG5vdGUgICAgMTYga0h6IGlzIHRoZSBvbmx5IHN1cHBvcnRlZCBmcmVxdWVuY3kgZm9yIEFBQyBvdXRwdXQKLSAqIEBub3RlICAgIFRoZSByZWNvbW1lbmRlZCBwcmFjdGljZSBpcyB0byB1c2UgdGhlIERlZmF1bHQgdmFsdWUgd2hlbiBzZXR0aW5nIHRoZSBlbmNvZGluZyBwYXJhbWV0ZXJzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtIHsKLSAgICBNNFZJREVPRURJVElOR19rRGVmYXVsdF9BU0YgICAgPSAwLCAgICAvKio8IERlZmF1bHQgQXVkaW8gU2FtcGxpbmcgRnJlcXVlbmN5IGZvciBzZWxlY3RlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvIG91dHB1dCBmb3JtYXQgKi8KLSAgICBNNFZJREVPRURJVElOR19rODAwMF9BU0YgICAgPSA4MDAwLCAgICAvKio8IE5vdGU6IERlZmF1bHQgYXVkaW8gU2FtcGxpbmcgRnJlcXVlbmN5IGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNUi1OQiBvdXRwdXQgKi8KLSAgICBNNFZJREVPRURJVElOR19rMTEwMjVfQVNGICAgID0gMTEwMjUsCi0gICAgTTRWSURFT0VESVRJTkdfazEyMDAwX0FTRiAgICA9IDEyMDAwLAotICAgIE00VklERU9FRElUSU5HX2sxNjAwMF9BU0YgICAgPSAxNjAwMCwgICAgLyoqPCBOb3RlOiBEZWZhdWx0IGF1ZGlvIFNhbXBsaW5nIEZyZXF1ZW5jeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgQUFDIG91dHB1dCAqLwotICAgIE00VklERU9FRElUSU5HX2syMjA1MF9BU0YgICAgPSAyMjA1MCwKLSAgICBNNFZJREVPRURJVElOR19rMjQwMDBfQVNGICAgID0gMjQwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazMyMDAwX0FTRiAgICA9IDMyMDAwLAotICAgIE00VklERU9FRElUSU5HX2s0NDEwMF9BU0YgICAgPSA0NDEwMCwKLSAgICBNNFZJREVPRURJVElOR19rNDgwMDBfQVNGICAgID0gNDgwMDAKLQotfSBNNFZJREVPRURJVElOR19BdWRpb1NhbXBsaW5nRnJlcXVlbmN5OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRWSURFT0VESVRJTkdfQml0cmF0ZQotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBhdmFpbGFibGUgYXVkaW8gb3IgdmlkZW8gYml0cmF0ZXMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRWSURFT0VESVRJTkdfa1ZBUklBQkxFX0tCUFMgPSAtMSwgICAgIC8qIG5vIHJlZ3VsYXRpb24gKi8KLSAgICBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZSA9IDAsICAgLyogdW5kZWZpbmVkICovCi0gICAgTTRWSURFT0VESVRJTkdfazhfS0JQUyA9IDgwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazlfMl9LQlBTID0gOTIwMCwgICAgICAgIC8qIGV2cmMgb25seSAqLwotICAgIE00VklERU9FRElUSU5HX2sxMl8yX0tCUFMgPSAxMjIwMCwgICAgICAvKiBhbXIgb25seSAqLwotICAgIE00VklERU9FRElUSU5HX2sxNl9LQlBTID0gMTYwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazI0X0tCUFMgPSAyNDAwMCwKLSAgICBNNFZJREVPRURJVElOR19rMzJfS0JQUyA9IDMyMDAwLAotICAgIE00VklERU9FRElUSU5HX2s0MF9LQlBTID0gNDAwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazQ4X0tCUFMgPSA0ODAwMCwKLSAgICBNNFZJREVPRURJVElOR19rNTZfS0JQUyA9IDU2MDAwLAotICAgIE00VklERU9FRElUSU5HX2s2NF9LQlBTID0gNjQwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazgwX0tCUFMgPSA4MDAwMCwKLSAgICBNNFZJREVPRURJVElOR19rOTZfS0JQUyA9IDk2MDAwLAotICAgIE00VklERU9FRElUSU5HX2sxMTJfS0JQUyA9IDExMjAwMCwKLSAgICBNNFZJREVPRURJVElOR19rMTI4X0tCUFMgPSAxMjgwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazE2MF9LQlBTID0gMTYwMDAwLAotICAgIE00VklERU9FRElUSU5HX2sxOTJfS0JQUyA9IDE5MjAwMCwKLSAgICBNNFZJREVPRURJVElOR19rMjI0X0tCUFMgPSAyMjQwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazI1Nl9LQlBTID0gMjU2MDAwLAotICAgIE00VklERU9FRElUSU5HX2syODhfS0JQUyA9IDI4ODAwMCwKLSAgICBNNFZJREVPRURJVElOR19rMzIwX0tCUFMgPSAzMjAwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazM4NF9LQlBTID0gMzg0MDAwLAotICAgIE00VklERU9FRElUSU5HX2s1MTJfS0JQUyA9IDUxMjAwMCwKLSAgICBNNFZJREVPRURJVElOR19rODAwX0tCUFMgPSA4MDAwMDAsCi0vKisgTmV3IEVuY29kZXIgYml0cmF0ZXMgKi8KLSAgICBNNFZJREVPRURJVElOR19rMl9NQlBTID0gMjAwMDAwMCwKLSAgICBNNFZJREVPRURJVElOR19rNV9NQlBTID0gNTAwMDAwMCwKLSAgICBNNFZJREVPRURJVElOR19rOF9NQlBTID0gODAwMDAwMCwKLS8qLSBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotfSBNNFZJREVPRURJVElOR19CaXRyYXRlOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00VklERU9FRElUSU5HX0Z0eXBCb3gKLSAqIEBicmllZiAgICAgICAgSW5mb3JtYXRpb24gdG8gYnVpbGQgdGhlICdmdHlwJyBhdG9tCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2RlZmluZSBNNFZJREVPRURJVElOR19NQVhfQ09NUEFUSUJMRV9CUkFORFMgMTAKLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyogQWxsIGJyYW5kIGZpZWxkcyBhcmUgYWN0dWFsbHkgY2hhcls0XSBzdG9yZWQgaW4gYmlnLWVuZGlhbiBpbnRlZ2VyIGZvcm1hdCAqLwotCi0gICAgTTRPU0FfVUludDMyICAgIG1ham9yX2JyYW5kOyAgICAgICAgICAgLyogZ2VuZXJhbGx5ICczZ3A0JyAgICAgICAgICAgICovCi0gICAgTTRPU0FfVUludDMyICAgIG1pbm9yX3ZlcnNpb247ICAgICAgICAgLyogZ2VuZXJhbGx5ICcwMDAwJyBvciAneC54ICcgICovCi0gICAgTTRPU0FfVUludDMyICAgIG5iQ29tcGF0aWJsZUJyYW5kczsgICAgLyogbnVtYmVyIG9mIGNvbXBhdGlibGUgYnJhbmRzICovCi0gICAgTTRPU0FfVUludDMyICAgIGNvbXBhdGlibGVfYnJhbmRzW000VklERU9FRElUSU5HX01BWF9DT01QQVRJQkxFX0JSQU5EU107IC8qIGFycmF5IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4IGNvbXBhdGlibGUgYnJhbmRzICovCi0KLX0gTTRWSURFT0VESVRJTkdfRnR5cEJveDsKLQotLyogU29tZSB1c2VmdWwgYnJhbmRzICovCi0jZGVmaW5lIE00VklERU9FRElUSU5HX0JSQU5EXzAwMDAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgTTRWSURFT0VESVRJTkdfQlJBTkRfM0cyQSAgMHgzMzY3MzI2MQotI2RlZmluZSBNNFZJREVPRURJVElOR19CUkFORF8zR1A0ICAweDMzNjc3MDM0Ci0jZGVmaW5lIE00VklERU9FRElUSU5HX0JSQU5EXzNHUDUgIDB4MzM2NzcwMzUKLSNkZWZpbmUgTTRWSURFT0VESVRJTkdfQlJBTkRfM0dQNiAgMHgzMzY3NzAzNgotI2RlZmluZSBNNFZJREVPRURJVElOR19CUkFORF9BVkMxICAweDYxNzY2MzMxCi0jZGVmaW5lIE00VklERU9FRElUSU5HX0JSQU5EX0VNUCAgIDB4NjU2RDcwMjAKLSNkZWZpbmUgTTRWSURFT0VESVRJTkdfQlJBTkRfSVNPTSAgMHg2OTczNkY2RAotI2RlZmluZSBNNFZJREVPRURJVElOR19CUkFORF9NUDQxICAweDZENzAzNDMxCi0jZGVmaW5lIE00VklERU9FRElUSU5HX0JSQU5EX01QNDIgIDB4NkQ3MDM0MzIKLSNkZWZpbmUgTTRWSURFT0VESVRJTkdfQlJBTkRfVkZKMSAgMHg3NjY2NkEzMQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzCi0gKiBAYnJpZWYgICBUaGlzIHN0cnVjdHVyZSBnYXRoZXJzIHRoZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGFuIGlucHV0IGZpbGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0KLSAgICAvKioKLSAgICAgKiBDb21tb24gKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICBiQW5hbHlzZWQ7ICAgICAgICAgICAvKio8IEZsYWcgdG8ga25vdyBpZiB0aGUgZmlsZSBoYXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZW4gYWxyZWFkeSBhbmFseXNlZCBvciBub3QgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uWzNdOyAgICAgICAgICAvKio8IFZlcnNpb24gb2YgdGhlIGxpYnJhcmllcyB1c2VkIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtIHRoZSBjbGlwIGFuYWx5c2lzICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlDbGlwRHVyYXRpb247ICAgICAgLyoqPCBDbGlwIGR1cmF0aW9uIChpbiBtcykgKi8KLSAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSAgICAgICAgICAgICBGaWxlVHlwZTsgICAgICAgICAgICAvKio8IC4zZ3AsIC5hbXIsIC5tcDMgKi8KLSAgICBNNFZJREVPRURJVElOR19GdHlwQm94ICAgICAgICAgICAgICBmdHlwOyAgICAgICAgICAgICAgICAvKio8IDNncCAnZnR5cCcgYXRvbSwgbWFqb3JfYnJhbmQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIGlmIG5vdCB1c2VkICovCi0KLSAgICAvKioKLSAgICAgKiBWaWRlbyAqLwotICAgIE00VklERU9FRElUSU5HX1ZpZGVvRm9ybWF0ICAgICAgICAgIFZpZGVvU3RyZWFtVHlwZTsgICAgIC8qKjwgRm9ybWF0IG9mIHRoZSB2aWRlbyBzdHJlYW0gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aUNsaXBWaWRlb0R1cmF0aW9uOyAvKio8IFZpZGVvIHRyYWNrIGR1cmF0aW9uIChpbiBtcykgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aVZpZGVvQml0cmF0ZTsgICAgICAvKio8IFZpZGVvIGF2ZXJhZ2UgYml0cmF0ZSAoaW4gYnBzKSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlWaWRlb01heEF1U2l6ZTsgICAgLyoqPCBNYXhpbXVtIEFjY2VzcyBVbml0IHNpemUgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlbyBzdHJlYW0gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aVZpZGVvV2lkdGg7ICAgICAgICAvKio8IFZpZGVvIGZyYW1lIHdpZHRoICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlWaWRlb0hlaWdodDsgICAgICAgLyoqPCBWaWRlbyBmcmFtZSBoZWlnaHQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aVZpZGVvVGltZVNjYWxlOyAgICAvKio8IFZpZGVvIHRpbWUgc2NhbGUgKi8KLSAgICBNNE9TQV9GbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICBmQXZlcmFnZUZyYW1lUmF0ZTsgICAvKio8IEF2ZXJhZ2UgZnJhbWUgcmF0ZSBvZiB0aGUgdmlkZW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSAqLwotICAgIE00T1NBX0ludDMyIHVpVmlkZW9MZXZlbDsgICAvKio8IHZpZGVvIGxldmVsKi8KLSAgICBNNE9TQV9JbnQzMiB1aVZpZGVvUHJvZmlsZTsgLyoqPCB2aWRlbyBwcm9maWxlICovCi0KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICBiTVBFRzRkYXRhUGFydGl0aW9uOyAvKio8IE1QRUctNCB1c2VzIGRhdGEgcGFydGl0aW9uaW5nICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgYk1QRUc0cnZsYzsgICAgICAgICAgLyoqPCBNUEVHLTQgdXNlcyBSVkxDIHRvb2wgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICBiTVBFRzRyZXN5bmNoTWFya2VyOyAvKio8IE1QRUctNCBzdHJlYW0gdXNlcyBSZXN5bmNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFya2VyICovCi0KLSAgICAvKioKLSAgICAgKiBBdWRpbyAqLwotICAgIE00VklERU9FRElUSU5HX0F1ZGlvRm9ybWF0ICAgICAgICAgIEF1ZGlvU3RyZWFtVHlwZTsgICAgIC8qKjwgRm9ybWF0IG9mIHRoZSBhdWRpbyBzdHJlYW0gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aUNsaXBBdWRpb0R1cmF0aW9uOyAvKio8IEF1ZGlvIHRyYWNrIGR1cmF0aW9uIChpbiBtcykgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aUF1ZGlvQml0cmF0ZTsgICAgICAvKio8IEF1ZGlvIGF2ZXJhZ2UgYml0cmF0ZSAoaW4gYnBzKSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgIHVpQXVkaW9NYXhBdVNpemU7ICAgIC8qKjwgTWF4aW11bSBBY2Nlc3MgVW5pdCBzaXplIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyBzdHJlYW0gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aU5iQ2hhbm5lbHM7ICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMT1tb25vLCAyPXN0ZXJlbykgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aVNhbXBsaW5nRnJlcXVlbmN5OyAvKio8IFNhbXBsaW5nIGF1ZGlvIGZyZXF1ZW5jeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoODAwMCBmb3IgYW1yLCAxNjAwMCBvciBtb3JlIGZvciBhYWMpICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlFeHRlbmRlZFNhbXBsaW5nRnJlcXVlbmN5OyAvKio8IEV4dGVuZGVkIGZyZXF1ZW5jeSBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQUMrLCBlQUFDKyBzdHJlYW1zICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlEZWNvZGVkUGNtU2l6ZTsgICAgLyoqPCBTaXplIG9mIHRoZSBkZWNvZGVkIFBDTSBkYXRhICovCi0KLSAgICAvKioKLSAgICAgKiBWaWRlbyBlZGl0aW5nIGNvbXBhdGliaWxpdHkgY2hhcnQgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgYlZpZGVvSXNFZGl0YWJsZTsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFZpZGVvIHN0cmVhbSBjYW4gYmUgZGVjb2RlZCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmUtZW5jb2RlZCAqLwotICAgIE00T1NBX0Jvb2wgICAgICBiQXVkaW9Jc0VkaXRhYmxlOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQXVkaW8gc3RyZWFtIGNhbiBiZSBkZWNvZGVkIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmUtZW5jb2RlZCAqLwotICAgIE00T1NBX0Jvb2wgICAgICBiVmlkZW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcDsgICAgICAgIC8qKjwgVmlkZW8gcHJvcGVydGllcyBtYXRjaCByZWZlcmVuY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAgcHJvcGVydGllcyAqLwotICAgIE00T1NBX0Jvb2wgICAgICBiQXVkaW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcDsgICAgICAgIC8qKjwgQXVkaW8gcHJvcGVydGllcyBtYXRjaCByZWZlcmVuY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwIHByb3BlcnRpZXMgKi8KLQotICAgIC8qKgotICAgICAqIFN0aWxsIFBpY3R1cmUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aVN0aWxsUGljV2lkdGg7ICAgICAgICAvKio8IEltYWdlIHdpZHRoICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlTdGlsbFBpY0hlaWdodDsgICAgICAgLyoqPCBJbWFnZSBoZWlnaHQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aUNsaXBBdWRpb1ZvbHVtZVBlcmNlbnRhZ2U7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldEltYWdlRGF0YTsKLQotICAgIE00T1NBX0ludDMyICAgICB2aWRlb1JvdGF0aW9uRGVncmVlczsgICAgICAgIC8qKjwgVmlkZW8gcm90YXRpb24gZGVncmVlICovCi0KLX0gTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXM7Ci0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0gICAgfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX000X1ZJREVPRURJVElOR0NPTU1PTl9IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTW9ub1RvMklfMTYuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL01vbm9UbzJJXzE2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc0YjFjOGEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTW9ub1RvMklfMTYuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9NT05PVE8ySV8xNl9IXwotI2RlZmluZSBfTU9OT1RPMklfMTZfSF8KLQotCi12b2lkIE1vbm9UbzJJXzE2KCAgY29uc3Qgc2hvcnQgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IG4pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2VuZGlmICAvKiBfTU9OT1RPMklfMTZfSF8gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXNfTUNTLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzX01DUy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMWI2MmUxLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXNfTUNTLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jaWZuZGVmIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfTUNTX0gKLSNkZWZpbmUgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19NQ1NfSAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqKioqKioqKioqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJFQURFUlMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioqKioqKioqKiovCi0KLS8qIC0tLS0tICBBTVIgcmVhZGVyIHN1cHBvcnQgLS0tLS0gKi8KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9SRUFERVJfQU1SICAgICAgICAvKio8IFtkZWZhdWx0XSBTdXBwb3J0IC5hbXIgZmlsZXMgKi8KLQotLyogLS0tLS0gM0dQUCAgcmVhZGVyIHN1cHBvcnQgLS0tLS0gKi8KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9SRUFERVJfM0dQICAgICAgICAvKio8IFtkZWZhdWx0XSBTdXBwb3J0IC5tcDQsIC4zZ3AgZmlsZXMgKi8KLQotCi0vKiAtLS0tLSBNUDMgcmVhZGVyIHN1cHBvcnQgLS0tLS0gKi8KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9SRUFERVJfTVAzICAgICAgICAvKio8IFtkZWZhdWx0XSBTdXBwb3J0IC5tcDMgZmlsZXMgKi8KLQotLyogLS0tLS0gUkFXIHJlYWRlciBzdXBwb3J0IC0tLS0tICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfUkVBREVSX1BDTSAgICAgICAgLyoqPCBbZGVmYXVsdF0gU3VwcG9ydCAucGNtIGZpbGVzICovCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKioqKioqKioqKiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogREVDT0RFUlMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioqKioqKioqKioqLwotCi0vKiAtLS0tLSAgQU1SIE5CIGRlY29kZXIgc3VwcG9ydCAtLS0tLSAqLwotI2RlZmluZSBNNFZTU19TVVBQT1JUX0FVREVDX0FNUk5CICAgICAgIC8qKjwgW2RlZmF1bHRdIFN1cHBvcnQgQU1SIE5CIHN0cmVhbXMgKi8KLQotLyogLS0tLS0gQUFDIGRlY29kZXIgc3VwcG9ydCAtLS0tLSAqLwotI2RlZmluZSBNNFZTU19TVVBQT1JUX0FVREVDX0FBQyAgICAgICAgICAgIC8qKjwgW2RlZmF1bHRdIFN1cHBvcnQgQUFDLCBBQUMrIGFuZCBlQUFDKyBzdHJlYW1zICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfVklERUNfTlVMTAotCi0vKiAtLS0tLSBNUDQvSDI2MyB2aWRlbyBkZWNvZGVyIHN1cHBvcnQgLS0tLS0gKi8KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9WSURFQ18zR1AgICAgICAgICAvKio8IFtkZWZhdWx0XSBTdXBwb3J0IG1wZWc0IGFuZCBIMjYzIGRlY29kZXJzICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX1ZJREVDXzNHUAotI2RlZmluZSBHRVRfREVDT0RFUl9DT05GSUdfSU5GTwotI2VuZGlmCi0KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9WSURFT19BVkMgICAgICAgICAgICAvKio8IFtkZWZhdWx0XSBTdXBwb3J0IEgyNjQgZGVjb2RlcnMgKi8KLQotLyogLS0tLS0gTVAzIGRlY29kZXIgc3VwcG9ydC0tLS0tICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfQVVERUNfTVAzICAgICAgICAgLyoqPCBbZGVmYXVsdF0gU3VwcG9ydCBNUDMgZGVjb2RlcnMgKi8KLQotCi0vKiAtLS0tLSBOVUxMIGRlY29kZXIgc3VwcG9ydC0tLS0tICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfQVVERUNfTlVMTCAgICAgICAgLyoqIFtkZWZhdWx0XSBTdXBwb3J0IFBDTSByZWFkaW5nICovCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXUklURVJTICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqKioqKioqKioqLwotCi0vKiAtLS0tLSAzZ3Agd3JpdGVyIC0tLS0tICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfV1JJVEVSXzNHUFAgICAgICAgLyoqPCBbZGVmYXVsdF0gc3VwcG9ydCBlbmNhcHN1bGF0aW5nIGluIDNncCBmb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHthbXIsYWFjfSB4IHttcGVnNCxoMjYzfSAqLwotCi0KLQotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioqKioqKioqKioqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVOQ09ERVJTICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKi8KLQotLyogLS0tLS0gbXBlZzQgJiBoMjYzIGVuY29kZXIgLS0tLS0gKi8KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9FTkNPREVSX01QRUc0ICAgICAvKio8IFtkZWZhdWx0XSBzdXBwb3J0IGVuY29kaW5nIGluIG1wZWc0IGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDI2MyBmb3JtYXQge3l1dixyZ2J9ICovCi0KLS8qIC0tLS0tIGgyNjQgZW5jb2RlciAtLS0tLSAqLwotI2RlZmluZSBNNFZTU19TVVBQT1JUX0VOQ09ERVJfQVZDCi0KLS8qIC0tLS0tIGFtciBlbmNvZGVyIC0tLS0tICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BTVIgIC8qKjwgW2RlZmF1bHRdIHN1cHBvcnQgZW5jb2RpbmcgaW4gYW1yIDEyLjIgZm9ybWF0IHthbXIsd2F2fSAqLwotCi0vKiAtLS0tLSBhYWMgZW5jb2RlciAtLS0tLSAqLwotI2RlZmluZSBNNFZTU19TVVBQT1JUX0VOQ09ERVJfQUFDICAgICAgIC8qKjwgW2RlZmF1bHRdIHN1cHBvcnQgZW5jb2RpbmcgaW4gYWFjIGZvcm1hdCB7YW1yLHdhdn0gKi8KLQotCi0vKiAtLS0tLSBtcDMgZW5jb2RlciAtLS0tLSAqLwotI2RlZmluZSBNNFZTU19TVVBQT1JUX0VOQ09ERVJfTVAzICAgICAgIC8qKjwgW2RlZmF1bHRdIHN1cHBvcnQgZW5jb2RpbmcgaW4gbXAzIGZvcm1hdCB7bXAzfSAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRUFUVVJFUyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKioqKioqKioqKiovCi0KLS8qIC0tLS0tIFZTUzNHUFAgJiB4VlNTIC0tLS0tICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfRVhURU5ERURfRkVBVFVSRVMgLyoqPCBbZGVmYXVsdF0gaWYgZGVmaW5lZCwgaW1wbGVtZW50YXRpb24gaXMgeFZTUyBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGlzIFZTUzNHUFAgKi8KLQotLyogLS0tLS0gU1BTIC0tLS0tICovCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FWFRFTkRFRF9GRUFUVVJFUwotCi0vLyNkZWZpbmUgTTRTUFNfR0lGX05PVF9TVVBQT1JURUQgIC8qKjwgW29wdGlvbl0gZG8gbm90IHN1cHBvcnQgR0lGIGZvcm1hdCBpbiBzdGlsbCBwaWN0dXJlIGFwaSAqLwotLy8jZGVmaW5lIE00U1BTX0pQRUdfTk9UX1NVUFBPUlRFRCAvKio8IFtvcHRpb25dIGRvIG5vdCBzdXBwb3J0IEpQRUcgZm9ybWF0IGluIHN0aWxsIHBpY3R1cmUgYXBpICovCi0vLyNkZWZpbmUgTTRTUFNfUE5HX05PVF9TVVBQT1JURUQgIC8qKjwgW29wdGlvbl0gZG8gbm90IHN1cHBvcnQgUE5HIGZvcm1hdCBpbiBzdGlsbCBwaWN0dXJlIGFwaSAqLwotI2RlZmluZSBNNFNQU19XQk1QX05PVF9TVVBQT1JURUQgICAvKio8IFtvcHRpb25dIGRvIG5vdCBzdXBwb3J0IFdCTVAgZm9ybWF0IGluIHN0aWxsIHBpY3R1cmUgYXBpICovCi0jZGVmaW5lIE00U1BTX0JHUjU2NV9DT0xPUl9PVVRQVVQgIC8qKjwgW29wdGlvbl0gb3V0cHV0IGluIHN0aWxsIHBpY3R1cmUgYXBpIGlzIEJHUjU2NQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0ID0gQkdSMjQpICovCi0KLSNlbHNlCi0KLSNkZWZpbmUgTTRTUFNfR0lGX05PVF9TVVBQT1JURUQgICAgLyoqPCBbb3B0aW9uXSBkbyBub3Qgc3VwcG9ydCBHSUYgZm9ybWF0IGluIHN0aWxsIHBpY3R1cmUgYXBpICovCi0vLyNkZWZpbmUgTTRTUFNfSlBFR19OT1RfU1VQUE9SVEVEIC8qKjwgW29wdGlvbl0gZG8gbm90IHN1cHBvcnQgSlBFRyBmb3JtYXQgaW4gc3RpbGwgcGljdHVyZSBhcGkgKi8KLSNkZWZpbmUgTTRTUFNfUE5HX05PVF9TVVBQT1JURUQgICAgLyoqPCBbb3B0aW9uXSBkbyBub3Qgc3VwcG9ydCBQTkcgZm9ybWF0IGluIHN0aWxsIHBpY3R1cmUgYXBpICovCi0jZGVmaW5lIE00U1BTX1dCTVBfTk9UX1NVUFBPUlRFRCAgIC8qKjwgW29wdGlvbl0gZG8gbm90IHN1cHBvcnQgV0JNUCBmb3JtYXQgaW4gc3RpbGwgcGljdHVyZSBhcGkgKi8KLS8vI2RlZmluZSBNNFNQU19CR1I1NjVfQ09MT1JfT1VUUFVUIC8qKjwgW29wdGlvbl0gb3V0cHV0IGluIHN0aWxsIHBpY3R1cmUgYXBpIGlzIEJHUjU2NQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCA9IEJHUjI0KSAqLwotCi0jZW5kaWYKLQotI2RlZmluZSBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLQotI2RlZmluZSBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotI2VuZGlmIC8qIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfTUNTX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvU1NSQy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvU1NSQy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYjFjZmNmLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL1NTUkMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICBQcm9qZWN0OjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICVuYW1lOiAgICAgICAgICBTU1JDLmggJSAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAgICBUaGUgaW5wdXQgYW5kIG91dHB1dCBibG9ja3Mgb2YgdGhlIFNSQyBhcmUgYnkgZGVmYXVsdCBibG9ja3Mgb2YgNDAgbXMuICBUaGlzIG1lYW5zIHRoYXQKLSAgICB0aGUgZm9sbG93aW5nIGRlZmF1bHQgYmxvY2sgc2l6ZXMgYXJlIHVzZWQ6Ci0KLSAgICAgICAgICBGcyAgICAgRGVmYXVsdCBCbG9jayBzaXplCi0gICAgICAgIC0tLS0tICAgICAgICAtLS0tLS0tLS0tCi0gICAgICAgICA4MDAwICAgICAgICAgICAzMjAKLSAgICAgICAgMTEwMjUgICAgICAgICAgIDQ0MQotICAgICAgICAxMjAwMCAgICAgICAgICAgNDgwCi0gICAgICAgIDE2MDAwICAgICAgICAgICA2NDAKLSAgICAgICAgMjIwNTAgICAgICAgICAgIDg4MgotICAgICAgICAyNDAwMCAgICAgICAgICAgOTYwCi0gICAgICAgIDMyMDAwICAgICAgICAgIDEyODAKLSAgICAgICAgNDQxMDAgICAgICAgICAgMTc2NAotICAgICAgICA0ODAwMCAgICAgICAgICAxOTIwCi0KLSAgICBBbiBBUEkgaXMgcHJvdmlkZWQgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGJsb2NrIHNpemUgaW50byBhbnkgbXVsdGlwbGUgb2YgdGhlIG1pbmltYWwKLSAgICBibG9jayBzaXplLgotCi0gICAgQWxsIHRoZSBzYW1wbGluZyByYXRlcyBhYm92ZSBhcmUgc3VwcG9ydGVkIGFzIGlucHV0IGFuZCBhcyBvdXRwdXQgc2FtcGxpbmcgcmF0ZQotKi8KLQotI2lmbmRlZiBfX1NTUkNfSF9fCi0jZGVmaW5lIF9fU1NSQ19IX18KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIElOQ0xVREVTCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgREVGSU5JVElPTlMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFNTUkNfSU5TVEFOQ0VfU0laRSAgICAgICAgICA1NDgKLSNkZWZpbmUgU1NSQ19JTlNUQU5DRV9BTElHTk1FTlQgICAgIDQKLSNkZWZpbmUgU1NSQ19TQ1JBVENIX0FMSUdOTUVOVCAgICAgIDQKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIFRZUEUgREVGSU5JVElPTlMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBTdGF0dXMgcmV0dXJuIHZhbHVlcyAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgU1NSQ19PSyAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAgICAgLyogU3VjY2Vzc2Z1bCByZXR1cm4gZnJvbSBhIHJvdXRpbmUgKi8KLSAgICBTU1JDX0lOVkFMSURfRlMgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgICAgICAvKiBUaGUgaW5wdXQgb3IgdGhlIG91dHB1dCBzYW1wbGluZyByYXRlIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWQgKi8KLSAgICBTU1JDX0lOVkFMSURfTlJfQ0hBTk5FTFMgICAgPSAyLCAgICAgICAgICAgICAgICAvKiBUaGUgbnVtYmVyIG9mIGNoYW5uZWxzIGlzIG5vdCBlcXVhbCB0byBtb25vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBzdGVyZW8gKi8KLSAgICBTU1JDX05VTExfUE9JTlRFUiAgICAgICAgICAgPSAzLCAgICAgICAgICAgICAgICAvKiBPbmUgb2YgdGhlIGlucHV0IHBvaW50ZXJzIGlzIE5VTEwgKi8KLSAgICBTU1JDX1dST05HX05SX1NBTVBMRVMgICAgICAgPSA0LCAgICAgICAgICAgICAgICAvKiBJbnZhbGlkIG51bWJlciBvZiBzYW1wbGVzICovCi0gICAgU1NSQ19BTExJTkdNRU5UX0VSUk9SICAgICAgID0gNSwgICAgICAgICAgICAgICAgLyogVGhlIGluc3RhbmNlIG1lbW9yeSBvciB0aGUgc2NyYXRjaCBtZW1vcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IGFsbGlnbmVkICovCi0gICAgU1NSQ19JTlZBTElEX01PREUgICAgICAgICAgID0gNiwgICAgICAgICAgICAgICAgLyogQSB3cm9uZyB2YWx1ZSBoYXMgYmVlbiB1c2VkIGZvciB0aGUgbW9kZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgKi8KLSAgICBTU1JDX0lOVkFMSURfVkFMVUUgICAgICAgICAgPSA3LCAgICAgICAgICAgICAgICAvKiBBbiBpbnZhbGlkIChvdXQgb2YgcmFuZ2UpIHZhbHVlIGhhcyBiZWVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgZm9yIG9uZSBvZiB0aGUgcGFyYW1ldGVycyAqLwotICAgIExWWFhYX1JFVFVSTlNUQVRVU19EVU1NWSA9IExWTV9NQVhFTlVNCi19IFNTUkNfUmV0dXJuU3RhdHVzX2VuOwotCi0vKiBJbnN0YW5jZSBtZW1vcnkgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0lOVDMyIFN0b3JhZ2UgWyBTU1JDX0lOU1RBTkNFX1NJWkUvNCBdOwotfSBTU1JDX0luc3RhbmNlX3Q7Ci0KLS8qIFNjcmF0Y2ggbWVtb3J5ICovCi10eXBlZGVmIExWTV9JTlQzMiBTU1JDX1NjcmF0Y2hfdDsKLQotLyogTnViZXIgb2Ygc2FtcGxlcyBtb2RlICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBTU1JDX05SX1NBTVBMRVNfREVGQVVMVCAgICAgPSAwLAotICAgIFNTUkNfTlJfU0FNUExFU19NSU4gICAgICAgICA9IDEsCi0gICAgU1NSQ19OUl9TQU1QTEVTX0RVTU1ZICAgICAgID0gTFZNX01BWEVOVU0KLX0gU1NSQ19OUl9TQU1QTEVTX01PREVfZW47Ci0KLS8qIEluc3RhbmNlIHBhcmFtZXRlcnMgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0ZzX2VuICAgICAgICAgICBTU1JDX0ZzX0luOwotICAgIExWTV9Gc19lbiAgICAgICAgICAgU1NSQ19Gc19PdXQ7Ci0gICAgTFZNX0Zvcm1hdF9lbiAgICAgICBTU1JDX05yT2ZDaGFubmVsczsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgIE5yU2FtcGxlc0luOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgTnJTYW1wbGVzT3V0OwotfSBTU1JDX1BhcmFtc190OwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBGVU5DVElPTiBQUk9UT1RZUEVTCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIFNTUkNfR2V0TnJTYW1wbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gcmV0cmlldmVzIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyAob3Igc2FtcGxlIHBhaXJzIGZvciBzdGVyZW8pIHRvIGJlICAgICovCi0vKiAgdXNlZCBhcyBpbnB1dCBhbmQgYXMgb3V0cHV0IG9mIHRoZSBTU1JDIG1vZHVsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTW9kZSAgICAgICAgICAgICAgICAgICAgVGhlcmUgYXJlIHR3byBtb2RlczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBTU1JDX05SX1NBTVBFTFNfREVGQVVMVC4gIEluIHRoaXMgbW9kZSwgdGhlIGZ1bmN0aW9uICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgcmV0dXJuIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBmb3IgNDAgbXMgYmxvY2tzICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gU1NSQ19OUl9TQU1QRUxTX01JTiB3aWxsIHJldHVybiB0aGUgbWluaW1hbCBudW1iZXIgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBzYW1wbGVzIHRoYXQgaXMgc3VwcG9ydGVkIGZvciB0aGlzIGNvbnZlcnNpb24gICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGlvLiAgRWFjaCBpbnRlZ2VyIG11bHRpcGxlIG9mIHRoaXMgcmF0aW8gd2lsbCAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgYWNjZXB0ZWQgYnkgdGhlIFNTUkNfSW5pdCBmdW5jdGlvbiAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBTU1JDX1BhcmFtcyAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNTUkNfT0sgICAgICAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19JTlZBTElEX0ZTICAgICAgICAgV2hlbiB0aGUgcmVxdWVzdGVkIGlucHV0IG9yIG91dHB1dCBzYW1wbGluZyByYXRlcyAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgaW52YWxpZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNTUkNfSU5WQUxJRF9OUl9DSEFOTkVMUyBXaGVuIHRoZSBjaGFubmVsIGZvcm1hdCBpcyBub3QgZXF1YWwgdG8gTFZNX01PTk8gICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgTFZNX1NURVJFTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTU1JDX05VTExfUE9JTlRFUiAgICAgICBXaGVuIHBTU1JDX1BhcmFtcyBpcyBhIE5VTEwgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNTUkNfSU5WQUxJRF9NT0RFICAgICAgIFdoZW4gTW9kZSBpcyBub3QgYSB2YWxpZCBzZXR0aW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1TU1JDX1JldHVyblN0YXR1c19lbiBTU1JDX0dldE5yU2FtcGxlcyggU1NSQ19OUl9TQU1QTEVTX01PREVfZW4gIE1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NSQ19QYXJhbXNfdCogICAgICAgICAgIHBTU1JDX1BhcmFtcyApOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgU1NSQ19HZXRTY3JhdGNoU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIHNjcmF0Y2ggc2l6ZSBmb3IgYSBnaXZlbiBjb252ZXJzaW9uIHJhdGlvIGFuZCAgICAgICAgICAgKi8KLS8qICBmb3IgZ2l2ZW4gYnVmZmVyIHNpemVzIGF0IHRoZSBpbnB1dCBhbmQgYXQgdGhlIG91dHB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwU1NSQ19QYXJhbXMgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBTY3JhdGNoU2l6ZSAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIHNjcmF0Y2ggc2l6ZS4gIFRoZSBTU1JDX0dldFNjcmF0Y2hTaXplICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gd2lsbCBmaWxsIGluIHRoZSBjb3JyZWN0IHZhbHVlIChpbiBieXRlcykuICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19PSyAgICAgICAgICAgICAgICAgd2hlbiB0aGUgZnVuY3Rpb24gY2FsbCBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTU1JDX0lOVkFMSURfRlMgICAgICAgICBXaGVuIHRoZSByZXF1ZXN0ZWQgaW5wdXQgb3Igb3V0cHV0IHNhbXBsaW5nIHJhdGVzICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBpbnZhbGlkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19JTlZBTElEX05SX0NIQU5ORUxTIFdoZW4gdGhlIGNoYW5uZWwgZm9ybWF0IGlzIG5vdCBlcXVhbCB0byBMVk1fTU9OTyAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBvciBMVk1fU1RFUkVPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNTUkNfTlVMTF9QT0lOVEVSICAgICAgIFdoZW4gYW55IG9mIHRoZSBpbnB1dCBwb2ludGVycyBpcyBhIE5VTEwgcG9pbnRlciAgICAgICAgICAgICovCi0vKiAgU1NSQ19XUk9OR19OUl9TQU1QTEVTICAgV2hlbiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgb24gdGhlIGlucHV0IG9yIG9uIHRoZSBvdXRwdXQgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgaW5jb3JyZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLVNTUkNfUmV0dXJuU3RhdHVzX2VuIFNTUkNfR2V0U2NyYXRjaFNpemUoICAgU1NSQ19QYXJhbXNfdCogICAgcFNTUkNfUGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIqICAgICAgICBwU2NyYXRjaFNpemUgKTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIFNTUkNfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBTU1JDIG1vZHVsZSBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBTU1JDX0luc3RhbmNlICAgICAgICAgIEluc3RhbmNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwU1NSQ19TY3JhdGNoICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBzY3JhdGNoIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBTU1JDX1BhcmFtcyAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcElucHV0SW5TY3JhdGNoLCAgICAgICAgcG9pbnRlciB0byBhIGxvY2F0aW9uIGluIHRoZSBzY3JhdGNoIG1lbW9yeSB0aGF0IGNhbiBiZSAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIHN0b3JlIHRoZSBpbnB1dCBzYW1wbGVzIChlLmcuIHRvIHNhdmUgbWVtb3J5KSAgICAgICAqLwotLyogIHBPdXRwdXRJblNjcmF0Y2ggICAgICAgIHBvaW50ZXIgdG8gYSBsb2NhdGlvbiBpbiB0aGUgc2NyYXRjaCBtZW1vcnkgdGhhdCBjYW4gYmUgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCB0byBzdG9yZSB0aGUgb3V0cHV0IHNhbXBsZXMgKGUuZy4gdG8gc2F2ZSBtZW1vcnkpICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19PSyAgICAgICAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTU1JDX0lOVkFMSURfRlMgICAgICAgICBXaGVuIHRoZSByZXF1ZXN0ZWQgaW5wdXQgb3Igb3V0cHV0IHNhbXBsaW5nIHJhdGVzICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBpbnZhbGlkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19JTlZBTElEX05SX0NIQU5ORUxTIFdoZW4gdGhlIGNoYW5uZWwgZm9ybWF0IGlzIG5vdCBlcXVhbCB0byBMVk1fTU9OTyAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBvciBMVk1fU1RFUkVPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNTUkNfV1JPTkdfTlJfU0FNUExFUyAgIFdoZW4gdGhlIG51bWJlciBvZiBzYW1wbGVzIG9uIHRoZSBpbnB1dCBvciB0aGUgb3V0cHV0ICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGluY29ycmVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTU1JDX05VTExfUE9JTlRFUiAgICAgICBXaGVuIGFueSBvZiB0aGUgaW5wdXQgcG9pbnRlcnMgaXMgYSBOVUxMIHBvaW50ZXIgICAgICAgICAgICAqLwotLyogIFNTUkNfQUxMSU5HTUVOVF9FUlJPUiAgIFdoZW4gdGhlIGluc3RhbmNlIG1lbW9yeSBvciB0aGUgc2NyYXRjaCBtZW1vcnkgaXMgbm90ICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgNCBieXRlcyBhbGxpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gVGhlIGluaXQgZnVuY3Rpb24gd2lsbCBjbGVhciB0aGUgaW50ZXJuYWwgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLVNTUkNfUmV0dXJuU3RhdHVzX2VuIFNTUkNfSW5pdCggU1NSQ19JbnN0YW5jZV90KiBwU1NSQ19JbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NSQ19TY3JhdGNoX3QqICBwU1NSQ19TY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1JDX1BhcmFtc190KiAgIHBTU1JDX1BhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2KiogICAgICBwcElucHV0SW5TY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYqKiAgICAgIHBwT3V0cHV0SW5TY3JhdGNoKTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIFNTUkNfU2V0R2FpbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gc2V0cyBoZWFkcm9vbSBnYWluIGFuZCB0aGUgcG9zdCBnYWluIG9mIHRoZSBTU1JDICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGJIZWFkcm9vbUdhaW5FbmFibGVkICAgIHBhcmFtZXRlciB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgaGVhZHJvb20gZ2FpbiBvZiB0aGUgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgU1NSQy4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIExWTV9NT0RFX09OLiAgTFZNX01PREVfT0ZGICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgdXNlZCBpbiBjYXNlIGl0IGNhbiBiZSBndWFyYW50ZWVkIHRoYXQgdGhlIGlucHV0ICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsIGlzIGJlbG93IC02ZEIgaW4gYWxsIGNhc2VzICh0aGUgZGVmYXVsdCBoZWFkcm9vbSAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgLTYgZEIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGJPdXRwdXRHYWluRW5hYmxlZCAgICAgIHBhcmFtZXRlciB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgb3V0cHV0IGdhaW4uICBUaGUgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCB2YWx1ZSBpcyBMVk1fTU9ERV9PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE91dHB1dEdhaW4gICAgICAgICAgICAgIHRoZSB2YWx1ZSBvZiB0aGUgb3V0cHV0IGdhaW4uICBUaGUgb3V0cHV0IGdhaW4gaXMgYSBsaW5lYXIgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2FpbiB2YWx1ZS4gMHg3RkZGIGlzIGVxdWFsIHRvICs2IGRCIGFuZCAweDAwMDAgY29ycmVzcG9uZHMgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICB0byAtaW5mIGRCLiAgQnkgZGVmYXVsdCwgYSAzZEIgZ2FpbiBpcyBhcHBsaWVkLCByZXN1bHRpbmcgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIGluIGFuIG92ZXJhbGwgZ2FpbiBvZiAtM2RCICgtNmRCIGhlYWRyb29tICsgM2RCIG91dHB1dCBnYWluKSovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNTUkNfT0sgICAgICAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19OVUxMX1BPSU5URVIgICAgICAgV2hlbiBwU1NSQ19JbnN0YW5jZSBpcyBhIE5VTEwgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTU1JDX0lOVkFMSURfTU9ERSAgICAgICBXcm9uZyB2YWx1ZSB1c2VkIGZvciB0aGUgYkhlYWRyb29tR2FpbkVuYWJsZWQgb3IgdGhlICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIGJPdXRwdXRHYWluRW5hYmxlZCBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19JTlZBTElEX1ZBTFVFICAgICAgV2hlbiBPdXRwdXRHYWluIGlzIG91dCB0byB0aGUgcmFuZ2UgWzA7MzI3NjddICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gVGhlIFNTUkNfU2V0R2FpbnMgZnVuY3Rpb24gaXMgYW4gb3B0aW9uYWwgZnVuY3Rpb24gdGhhdCBzaG91bGQgb25seSBiZSB1c2VkICAgICAgKi8KLS8qICAgICBpbiByYXJlIGNhc2VzLiAgUHJlZmVyYWJseSwgdXNlIHRoZSBkZWZhdWx0IHNldHRpbmdzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotU1NSQ19SZXR1cm5TdGF0dXNfZW4gU1NSQ19TZXRHYWlucyggU1NSQ19JbnN0YW5jZV90KiBwU1NSQ19JbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Nb2RlX2VuICAgICAgYkhlYWRyb29tR2FpbkVuYWJsZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTW9kZV9lbiAgICAgIGJPdXRwdXRHYWluRW5hYmxlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgT3V0cHV0R2FpbiApOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgU1NSQ19Qcm9jZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUHJvY2VzcyBmdW5jdGlvbiBmb3IgdGhlIFNTUkMgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcFNTUkNfSW5zdGFuY2UgICAgICAgICAgSW5zdGFuY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwU1NSQ19BdWRpb0luICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBTU1JDX0F1ZGlvT3V0ICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogU1NSQ19PSyAgICAgICAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBTU1JDX05VTExfUE9JTlRFUiAgICAgICAgV2hlbiBvbmUgb2YgcFNTUkNfSW5zdGFuY2UsIHBTU1JDX0F1ZGlvSW4gb3IgcFNTUkNfQXVkaW9PdXQgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLVNTUkNfUmV0dXJuU3RhdHVzX2VuIFNTUkNfUHJvY2VzcyggIFNTUkNfSW5zdGFuY2VfdCogcFNTUkNfSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYqICAgICAgIHBTU1JDX0F1ZGlvSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYqICAgICAgIHBTU1JDX0F1ZGlvT3V0KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNlbmRpZiAvKiBfX1NTUkNfSF9fICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9WaWRlb0VkaXRvclJlc2FtcGxlci5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvVmlkZW9FZGl0b3JSZXNhbXBsZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjg0OTdkMy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9WaWRlb0VkaXRvclJlc2FtcGxlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVklERU9FRElUT1JSRVNBTVBMRVJfSAotI2RlZmluZSBWSURFT0VESVRPUlJFU0FNUExFUl9ICi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotCi1NNE9TQV9Db250ZXh0IExWQXVkaW9SZXNhbXBsZXJDcmVhdGUoTTRPU0FfSW50MzIgYml0RGVwdGgsIE00T1NBX0ludDMyIGluQ2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIHNhbXBsZVJhdGUsIE00T1NBX0ludDMyIHF1YWxpdHkpOwotdm9pZCBMVkF1ZGlvc2V0U2FtcGxlUmF0ZShNNE9TQV9Db250ZXh0IHJlc2FtcGxlckNvbnRleHQsTTRPU0FfSW50MzIgaW5TYW1wbGVSYXRlKTsKLXZvaWQgTFZBdWRpb3NldFZvbHVtZShNNE9TQV9Db250ZXh0IHJlc2FtcGxlckNvbnRleHQsIE00T1NBX0ludDE2IGxlZnQsIE00T1NBX0ludDE2IHJpZ2h0KSA7Ci12b2lkIExWQXVkaW9yZXNhbXBsZV9Mb3dRdWFsaXR5KE00T1NBX0ludDE2KiBvdXQsIE00T1NBX0ludDE2KiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBvdXRGcmFtZUNvdW50LCBNNE9TQV9Db250ZXh0IHJlc2FtcGxlckNvbnRleHQpOwotdm9pZCBMVkRlc3Ryb3koTTRPU0FfQ29udGV4dCByZXNhbXBsZXJDb250ZXh0KTsKLQotdm9pZCBNb25vVG8ySV8xNiggY29uc3QgTTRPU0FfSW50MTYgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDE2ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQxNiBuKTsKLQotdm9pZCBGcm9tMmlUb01vbm9fMTYoIGNvbnN0IE00T1NBX0ludDE2ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MTYgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQxNiBuKTsKLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0jZW5kaWYgLyogVklERU9FRElUT1JSRVNBTVBMRVJfSCAqLwotCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL21hcmtlci5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvbWFya2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgzY2FkZTAuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvbWFya2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNpZm5kZWYgTUFSS0VSX0gKLSNkZWZpbmUgTUFSS0VSX0gKLQotI2RlZmluZSBBRERfQ09ERV9NQVJLRVJfRlVOKG1fY29uZGl0aW9uKSAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggIShtX2NvbmRpdGlvbikgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDIxNjE0MDYyXG5cdCIgICAgICAvKiAnIWFAYicgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDQ3NzEyNTQzXG5cdCIgICAgICAvKiAnR3ElQycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjQzXG5cdCIgICAgICAvKiAnX19fQycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDI0NUY1RjVGIiAgICAgICAgICAvKiAnJF9fXycgKi8gICAgXAotICAgICAgICApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0KLQotI2RlZmluZSBBRERfVEVYVF9NQVJLRVJfRlVOKG1fY29uZGl0aW9uKSAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggIShtX2NvbmRpdGlvbikgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDIxNjE0MDYyXG5cdCIgICAgICAvKiAnIWFAYicgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDQ3NzEyNTQzXG5cdCIgICAgICAvKiAnR3ElQycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjU0XG5cdCIgICAgICAvKiAnX19fVCcgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDI0NUY1RjVGIiAgICAgICAgICAvKiAnJF9fXycgKi8gICAgXAotICAgICAgICApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000RVhJRkNfQ29tbW9uQVBJLmggYi9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000RVhJRkNfQ29tbW9uQVBJLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUyM2MwMmEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNEVYSUZDX0NvbW1vbkFQSS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNEVYSUZDX0NvbW1vbkFQSS5oCi0gKiBAYnJpZWYgICAgRVhJRiBjb21tb24gZGF0YSBoZWFkZXIKLSAqIEBub3RlICAgIFRoZSB0eXBlcywgc3RydWN0dXJlcyBhbmQgbWFjcm9zIGRlZmluZWQgaW4gdGhpcyBmaWxlIGFsbG93IHJlYWRpbmcKLSAqICAgICAgICAgICAgYW5kIHdyaXRpbmcgRVhJRiBKUEVHIGltYWdlcyBjb21wbGlhbnQgc3BlYyBFWElGIDIuMgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0jaWZuZGVmIF9fTTRfRVhJRl9DT01NT05fQVBJX0hfXwotI2RlZmluZSBfX000X0VYSUZfQ09NTU9OX0FQSV9IX18KLQotI2luY2x1ZGUgIk00VE9PTF9WZXJzaW9uSW5mby5oIgotI2luY2x1ZGUgIk00Q29tbW9uX3R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiB0eXBlIE00RVhJRkNfQ29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfVm9pZCogICAgTTRFWElGQ19Db250ZXh0OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEVycm9ycyAmIFdhcm5pbmdzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jZGVmaW5lIE00RVhJRkNfTk9fRVJSICAgICAgICAgICAgICAweDAwMDAwMDAwICAgIC8qKjwgaW52YWxpZCBwYXJhbWV0ZXIgKi8KLSNkZWZpbmUgTTRFWElGQ19FUlJfUEFSQU1FVEVSICAgICAgIDB4MDAwMDAwMDEgICAgLyoqPCBpbnZhbGlkIHBhcmFtZXRlciAqLwotI2RlZmluZSBNNEVYSUZDX0VSUl9BTExPQyAgICAgICAgICAgMHgwMDAwMDAwMiAgICAvKio8IGFsbG9jYXRpb24gZXJyb3IgKi8KLSNkZWZpbmUgTTRFWElGQ19FUlJfQkFEX0NPTlRFWFQgICAgIDB4MDAwMDAwMDMgICAgLyoqPCBpbnZhbGlkIGNvbnRleHQgKi8KLSNkZWZpbmUgTTRFWElGQ19FUlJfTk9UX0NPTVBMSUFOVCAgIDB4MDAwMDAwMDQgICAgLyoqPCB0aGUgaW1hZ2UgaW4gYnVmZmVyIGlzIG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpQRUcgY29tcGxpYW50ICovCi0jZGVmaW5lIE00RVhJRkNfRVJSX05PX0FQUF9GT1VORCAgICAweDAwMDAwMDA1ICAgIC8qKjwgdGhlIEpQRUcgaW1hZ2UgZG9lcyBub3QgY29udGFpbiBhbnkgQVBQMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGlmIDIuMiBjb21wbGlhbnQgKi8KLSNkZWZpbmUgTTRFWElGQ19XQVJfTk9fVEhVTUJOQUlMICAgIDB4MDAwMDAwMDYgICAgLyoqPCB0aGUgRXhpZiBwYXJ0IGRvZXMgbm90IGNvbnRhaW4gYW55Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRodW1ibmFpbCAqLwotI2RlZmluZSBNNEVYSUZDX0VSUl9BUFBfVFJVTkNBVEVEICAgMHgwMDAwMDAwNyAgICAvKio8IFRoZSBBUFAxIHNlY3Rpb24gaW4gaW5wdXQgYnVmZmVyIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBjb21wbGV0ZSAqLwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00RVhJRkNfQmFzaWNUYWdzCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIHN0b3JlcyB0aGUgYmFzaWMgdGFncyB2YWx1ZXMuCi0gKiBAbm90ZSAgICAgICAgVGhpcyBFeGlmIHJlYWRlciBmb2N1c2VzIG9uIGEgc2V0IG9mICJFbnRyeSBUYWdzIi4KLSAqICAgICAgICAgICAgICAgIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBjb3JyZXNwb25kaW5nICJFbnRyeSBWYWx1ZXMiIG9mIHRoZXNlIHRhZ3MuCi0gKiAgICAgICAgICAgICAgICBNNEVYSUZDX0NoYXIqIGZpZWxkcyBvZiBzdHJ1Y3R1cmUgYXJlIE51bGwgdGVybWluYXRlZCBTdHJpbmdzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfSW50MzIgICAgICAgIHdpZHRoOyAgICAgICAgICAgICAgICAvKio8IGltYWdlIHdpZHRoIGluIHBpeGVscyAqLwotICAgIE00T1NBX0ludDMyICAgICAgICBoZWlnaHQ7ICAgICAgICAgICAgICAgLyoqPCBpbWFnZSBoZWlnaHQgaW4gcGl4ZWxzICovCi0gICAgTTRPU0FfQ2hhciAgICAgICAgKmNyZWF0aW9uRGF0ZVRpbWU7ICAgICAvKio8IGRhdGUgYW5kIHRpbWUgb3JpZ2luYWwgaW1hZ2Ugd2FzIGdlbmVyYXRlZCAqLwotICAgIE00T1NBX0NoYXIgICAgICAgICpsYXN0Q2hhbmdlRGF0ZVRpbWU7ICAgLyoqPCBmaWxlIGNoYW5nZSBkYXRlIGFuZCB0aW1lICovCi0gICAgTTRPU0FfQ2hhciAgICAgICAgKmRlc2NyaXB0aW9uOyAgICAgICAgICAvKio8IGltYWdlIHRpdGxlICovCi0gICAgTTRPU0FfQ2hhciAgICAgICAgKm1ha2U7ICAgICAgICAgICAgICAgICAvKio8IG1hbnVmYWN0dXJlciBvZiBpbWFnZSBpbnB1dCBlcXVpcG1lbnQgKi8KLSAgICBNNE9TQV9DaGFyICAgICAgICAqbW9kZWw7ICAgICAgICAgICAgICAgIC8qKjwgbW9kZWwgb2YgaW1hZ2UgaW5wdXQgZXF1aXBtZW50ICovCi0gICAgTTRPU0FfQ2hhciAgICAgICAgKnNvZnR3YXJlOyAgICAgICAgICAgICAvKio8IHNvZnR3YXJlIHVzZWQgKi8KLSAgICBNNE9TQV9DaGFyICAgICAgICAqYXJ0aXN0OyAgICAgICAgICAgICAgIC8qKjwgcGVyc29uIHdobyBjcmVhdGVkIHRoZSBpbWFnZSAqLwotICAgIE00T1NBX0NoYXIgICAgICAgICpjb3B5cmlnaHQ7ICAgICAgICAgICAgLyoqPCBjb3B5cmlnaHQgaG9sZGVyICovCi0gICAgTTRDT01NT05fT3JpZW50YXRpb24gb3JpZW50YXRpb247ICAgICAgICAvKio8IG9yaWVudGF0aW9uIG9mIGltYWdlICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgIHRodW1ibmFpbFNpemU7ICAgICAgICAvKio8IHNpemUgb2YgdGhlIHRodW1ibmFpbCAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAqdGh1bWJuYWlsSW1nOyAgICAgICAgLyoqPCBwb2ludGVyIHRvIHRoZSB0aHVtYm5haWwgaW4gbWFpbiBpbWFnZSBidWZmZXIqLwotICAgIE00T1NBX0NoYXIgICAgICAgICpsYXRpdHVkZVJlZjsgICAgICAgICAgLyoqPCBsYXRpdHVkZSByZWZlcmVuY2UgKi8KLSAgICBNNENPTU1PTl9Mb2NhdGlvbiBsYXRpdHVkZTsgICAgICAgICAgICAgIC8qKjwgbGF0aXR1ZGUgKi8KLSAgICBNNE9TQV9DaGFyICAgICAgICAqbG9uZ2l0dWRlUmVmOyAgICAgICAgIC8qKjwgbG9uZ2l0dWRlIHJlZmVyZW5jZSAqLwotICAgIE00Q09NTU9OX0xvY2F0aW9uIGxvbmdpdHVkZTsgICAgICAgICAgICAgLyoqPCBsb25naXR1ZGUgKi8KLQotfSBNNEVYSUZDX0Jhc2ljVGFnczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNEVYSUZDX2dldFZlcnNpb24gICAgKE00X1ZlcnNpb25JbmZvICpwVmVyc2lvbikKLSAqIEBicmllZiAgICBnZXQgdGhlIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgZXhpZiBsaWJyYXJ5LgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIHZlcnNpb24gbnVtYmVycyBpbiBhIHN0cnVjdHVyZS4KLSAqIEBwYXJhbSAgICBwVmVyc2lvbjogICAgKE9VVCkgICAgICAgIHRoZSBzdHJ1Y3R1cmUgY29udGFpbmluZyB2ZXJzaW9uIG51bWJlcnMKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFWElGQ19FUlJfUEFSQU1FVEVSOiAgICAgICAgKERlYnVnIG9ubHkpIHRoZSBwYXJhbWV0ZXIgaXMgTTRFWElGQ19OVUxMLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNEVYSUZDX2dldFZlcnNpb24gKE00X1ZlcnNpb25JbmZvICpwVmVyc2lvbik7Ci0KLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyovCi0jZW5kaWYgLyogX19NNF9FWElGX0NPTU1PTl9BUElfSF9fICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRQVE8zR1BQX0FQSS5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFBUTzNHUFBfQVBJLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRhYTIwZDIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFBUTzNHUFBfQVBJLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00UFRPM0dQUF9BUEkuaAotICogQGJyaWVmICAgIFRoZSBQaWN0dXJlcyB0byAzR1BQIENvbnZlcnRlci4KLSAqIEBub3RlICAgIE00UFRPM0dQUCBwcm9kdWNlcyAzR1BQIGNvbXBsaWFudCBhdWRpby92aWRlbyAgZmlsZXMKLSAqICAgICAgICAgICAgZnJvbSBhbiBBTVIgTkIgYXVkaW8gZmlsZSBhbmQgcmF3IHBpY3R1cmVzIGludG8gYSBNUEVHLTQvaDI2MyAzR1BQIGZpbGUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2lmbmRlZiBfX000UFRPM0dQUF9BUElfSF9fCi0jZGVmaW5lIF9fTTRQVE8zR1BQX0FQSV9IX18KLQotLyoqCi0gKiAgICBPU0FMIGJhc2ljIHR5cGVzIGFuZCBlcnJvcnMgKi8KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0KLS8qKgotICogICAgT1NBTCB0eXBlcyBmb3IgZmlsZSBhY2Nlc3MgKi8KLSNpbmNsdWRlICJNNE9TQV9GaWxlUmVhZGVyLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVdyaXRlci5oIgotCi0vKioKLSAqICAgIERlZmluaXRpb24gb2YgTTRfVmVyc2lvbkluZm8gKi8KLSNpbmNsdWRlICJNNFRPT0xfVmVyc2lvbkluZm8uaCIKLQotLyoqCi0gKiBEZWZpbml0aW9ucyBvZiBNNFZJRklfSW1hZ2VQbGFuZSAqLwotI2luY2x1ZGUgIk00VklGSV9GaWx0ZXJzQVBJLmgiCi0KLS8qKgotICogQ29tbW9uIGRlZmluaXRpb25zIG9mIHZpZGVvIGVkaXRpbmcgY29tcG9uZW50cyAqLwotI2luY2x1ZGUgIk00X1ZpZGVvRWRpdGluZ0NvbW1vbi5oIgotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoqCi0gKiAgICBQdWJsaWMgdHlwZSBvZiB0aGUgTTRQVE8zR1BQIGNvbnRleHQgKi8KLXR5cGVkZWYgTTRPU0FfVm9pZCogTTRQVE8zR1BQX0NvbnRleHQ7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNFBUTzNHUFBfUmVwbGFjZUF1ZGlvTW9kZQotICogQGJyaWVmICAgIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgd2F5IHRoZSBhdWRpbyBpcyBtYW5hZ2VkIGlmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgdmlkZW8KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRQVE8zR1BQX2tBdWRpb1BhZGRpbmdNb2RlX05vbmUgPSAwLCAgLyoqPCBBdWRpbyB0cmFjayBpcyBrZXB0IHNob3J0ZXIgdGhhbiB0aGUgdmlkZW8gdHJhY2sqLwotICAgIE00UFRPM0dQUF9rQXVkaW9QYWRkaW5nTW9kZV9TaWxlbmNlLCAgIC8qKjwgSWYgYXVkaW8gaXMgc2hvcnRlciwgc2lsZW5jZSBpcyBhZGRlZCBhdCB0aGUgZW5kKi8KLSAgICBNNFBUTzNHUFBfa0F1ZGlvUGFkZGluZ01vZGVfTG9vcCAgICAgICAvKio8IElmIGF1ZGlvIGlzIHNob3J0ZXIsIGxvb3AgYmFjayB0byB0aGUgYmVnaW5uaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHRoZSB3aG9sZSB0cmFjayBoYXMgYmVlbiBwcm9jZXNzZWQgKi8KLX0gTTRQVE8zR1BQX0F1ZGlvUGFkZGluZ01vZGU7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRQVE8zR1BQX091dHB1dEZpbGVNYXhTaXplCi0gKiBAYnJpZWYgICAgRGVmaW5lcyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSAzR1BQIGZpbGUgcHJvZHVjZWQgYnkgdGhlIFBUTzNHUFAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRQVE8zR1BQX2s1MF9LQiwgICAgICAgICAgICAvKio8IE91dHB1dCAzR1BQIGZpbGUgc2l6ZSBpcyBsaW1pdGVkIHRvIDUwIEtieXRlcyAgKi8KLSAgICBNNFBUTzNHUFBfazc1X0tCLCAgICAgICAgICAgIC8qKjwgT3V0cHV0IDNHUFAgZmlsZSBzaXplIGlzIGxpbWl0ZWQgdG8gNzUgS2J5dGVzICAqLwotICAgIE00UFRPM0dQUF9rMTAwX0tCLCAgICAgICAgICAgLyoqPCBPdXRwdXQgM0dQUCBmaWxlIHNpemUgaXMgbGltaXRlZCB0byAxMDAgS2J5dGVzICovCi0gICAgTTRQVE8zR1BQX2sxNTBfS0IsICAgICAgICAgICAvKio8IE91dHB1dCAzR1BQIGZpbGUgc2l6ZSBpcyBsaW1pdGVkIHRvIDE1MCBLYnl0ZXMgKi8KLSAgICBNNFBUTzNHUFBfazIwMF9LQiwgICAgICAgICAgIC8qKjwgT3V0cHV0IDNHUFAgZmlsZSBzaXplIGlzIGxpbWl0ZWQgdG8gMjAwIEtieXRlcyAqLwotICAgIE00UFRPM0dQUF9rMzAwX0tCLCAgICAgICAgICAgLyoqPCBPdXRwdXQgM0dQUCBmaWxlIHNpemUgaXMgbGltaXRlZCB0byAzMDAgS2J5dGVzICovCi0gICAgTTRQVE8zR1BQX2s0MDBfS0IsICAgICAgICAgICAvKio8IE91dHB1dCAzR1BQIGZpbGUgc2l6ZSBpcyBsaW1pdGVkIHRvIDQwMCBLYnl0ZXMgKi8KLSAgICBNNFBUTzNHUFBfazUwMF9LQiwgICAgICAgICAgIC8qKjwgT3V0cHV0IDNHUFAgZmlsZSBzaXplIGlzIGxpbWl0ZWQgdG8gNTAwIEtieXRlcyAqLwotICAgIE00UFRPM0dQUF9rVU5MSU1JVEVEPS0xICAgICAgLyoqPCBPdXRwdXQgM0dQUCBmaWxlIHNpemUgaXMgbm90IGxpbWl0ZWQgICAgICAgICAgICovCi19IE00UFRPM0dQUF9PdXRwdXRGaWxlTWF4U2l6ZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgKE00UFRPM0dQUF9QaWN0dXJlQ2FsbGJhY2tGY3QpIChNNE9TQV9Wb2lkKiBwUGljdHVyZUN0eHQsCi0gKiBNNFZJRklfSW1hZ2VQbGFuZSogcEltYWdlUGxhbmVzLCBNNE9TQV9Eb3VibGUqIHBQaWN0dXJlRHVyYXRpb24pOwotICogQGJyaWVmICAgIFRoZSBpbnRlZ3JhdG9yIG11c3QgaW1wbGVtZW50IGEgZnVuY3Rpb24gZm9sbG93aW5nIHRoaXMgcHJvdG90eXBlLgotICogICAgICAgICAgICBJdHMgZ29hbCBpcyB0byBmZWVkIHRoZSBQVE8zR1BQIHdpdGggWVVWNDIwIHBpY3R1cmVzLgotICoKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gaXMgZ2l2ZW4gdG8gdGhlIFBUTzNHUFAgaW4gdGhlIE00UFRPM0dQUF9QYXJhbXMgc3RydWN0dXJlCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOKSBUaGUgaW50ZWdyYXRvciBvd24gY29udGV4dAotICogQHBhcmFtICAgIHBJbWFnZVBsYW5lcyhJTi9PVVQpIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdGhyZWUgdmFsaWQgaW1hZ2UgcGxhbmVzCi0gKiBAcGFyYW0gICAgcFBpY3R1cmVEdXJhdGlvbihPVVQpIER1cmF0aW9uIG9mIHRoZSByZXR1cm5lZCBwaWN0dXJlCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNFBUTzNHUFBfV0FSX0xBU1RfUElDVFVSRTogVGhlIHJldHVybmVkIGltYWdlIGlzIHRoZSBsYXN0IG9uZQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsIChiZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIE00T1NBX0VSUiAoTTRQVE8zR1BQX1BpY3R1cmVDYWxsYmFja0ZjdCkgKE00T1NBX1ZvaWQqIHBQaWN0dXJlQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbWFnZVBsYW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRG91YmxlKiBwUGljdHVyZUR1cmF0aW9uKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNFBUTzNHUFBfUGFyYW1zCi0gKiBAYnJpZWYgICAgTTRQVE8zR1BQIHBhcmFtZXRlcnMgZGVmaW5pdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qKjwgT3V0cHV0IHZpZGVvIGNvbXByZXNzaW9uIGZvcm1hdCwgSDI2MyBvciBNUEVHNCAqLwotICAgIE00VklERU9FRElUSU5HX1ZpZGVvRm9ybWF0ICAgICAgT3V0cHV0VmlkZW9Gb3JtYXQ7Ci0gICAgLyoqPCBPdXRwdXQgZnJhbWUgc2l6ZSA6IFNRQ0lGIHRvIFZHQSovCi0gICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZVNpemUgICBPdXRwdXRWaWRlb0ZyYW1lU2l6ZTsKLSAgICAvKio8IFRhcmdldGVkIE91dHB1dCBiaXQtcmF0ZSwgc2VlIGVudW0qLwotICAgIE00VklERU9FRElUSU5HX0JpdHJhdGUgICAgICAgICAgT3V0cHV0VmlkZW9CaXRyYXRlOwotICAgIC8qKjwgTWF4aW11bSBzaXplIG9mIHRoZSBvdXRwdXQgM0dQUCBmaWxlLCBzZWUgZW51bSAqLwotICAgIE00UFRPM0dQUF9PdXRwdXRGaWxlTWF4U2l6ZSAgICAgT3V0cHV0RmlsZU1heFNpemU7Ci0gICAgLyoqPCBDYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgYnkgdGhlIFBUTzNHUFAgdG8gZ2V0IHRoZSBpbnB1dCBwaWN0dXJlcyovCi0gICAgTTRQVE8zR1BQX1BpY3R1cmVDYWxsYmFja0ZjdCogICBwUGljdHVyZUNhbGxiYWNrRmN0OwotICAgIC8qKjwgQ29udGV4dCB0byBiZSBnaXZlbiBhcyB0aGlyZCBhcmd1bWVudCBvZiB0aGUgcGljdHVyZSBjYWxsYmFjayBmdW5jdGlvbiBjYWxsKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgIHBQaWN0dXJlQ2FsbGJhY2tDdHh0OwotICAgIC8qKjwgRmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBpbnB1dCBhdWRpbyB0cmFjayBmaWxlICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICBwSW5wdXRBdWRpb1RyYWNrRmlsZTsKLSAgICAvKio8IEZvcm1hdCBvZiB0aGUgYXVkaW8gZmlsZSAqLwotICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlICAgICAgICAgQXVkaW9GaWxlRm9ybWF0OwotICAgIC8qKjwgVHlwZSBvZiBwcm9jZXNzaW5nIHRvIGFwcGx5IHdoZW4gYXVkaW8gaXMgc2hvcnRlciB0aGFuIHZpZGVvKi8KLSAgICBNNFBUTzNHUFBfQXVkaW9QYWRkaW5nTW9kZSAgICAgIEF1ZGlvUGFkZGluZ01vZGU7Ci0gICAgLyoqPCBGaWxlIGRlc2NyaXB0b3Igb2YgdGhlIG91dHB1dCAzR1BQIGZpbGUgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgIHBPdXRwdXQzZ3BwRmlsZTsKLSAgICAgLyoqPCBGaWxlIGRlc2NyaXB0b3Igb2YgdGhlIHRlbXBvcmFyeSBmaWxlIHRvIHN0b3JlIG1ldGFkYXRhICgibW9vdi5iaW4iKSAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgcFRlbXBvcmFyeUZpbGU7Ci0gICAgLyoqPCBOdW1iZXIgb2YgaW5wdXQgWVVWIGZyYW1lcyB0byBlbmNvZGUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIE5iVmlkZW9GcmFtZXM7Ci0gICAgTTRPU0FfSW50MzIgICB2aWRlb1Byb2ZpbGU7Ci0gICAgTTRPU0FfSW50MzIgICB2aWRlb0xldmVsOwotfSBNNFBUTzNHUFBfUGFyYW1zOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBUTzNHUFBfR2V0VmVyc2lvbihNNF9WZXJzaW9uSW5mbyogcFZlcnNpb25JbmZvKTsKLSAqIEBicmllZiAgICBHZXQgdGhlIE00UFRPM0dQUCB2ZXJzaW9uLgotICogQG5vdGUgICAgQ2FuIGJlIGNhbGxlZCBhbnl0aW1lLiBEbyBub3QgbmVlZCBhbnkgY29udGV4dC4KLSAqIEBwYXJhbSAgICBwVmVyc2lvbkluZm8gICAgICAgIChPVVQpIFBvaW50ZXIgdG8gYSB2ZXJzaW9uIGluZm8gc3RydWN0dXJlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UFRPM0dQUF9HZXRWZXJzaW9uKE00X1ZlcnNpb25JbmZvKiBwVmVyc2lvbkluZm8pOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBUTzNHUFBfSW5pdChNNFBUTzNHUFBfQ29udGV4dCogcENvbnRleHQpOwotICogQGJyaWVmICAgIEluaXRpYWxpemVzIHRoZSBNNFBUTzNHUFAgKGFsbG9jYXRlcyBhbiBleGVjdXRpb24gY29udGV4dCkuCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKE9VVCkgUG9pbnRlciBvbiB0aGUgTTRQVE8zR1BQIGNvbnRleHQgdG8gYWxsb2NhdGUKLSAqIEBwYXJhbSAgIHBGaWxlUmVhZFB0ckZjdCAgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSByZWFkZXIgZnVuY3Rpb25zCi0gKiBAcGFyYW0gICBwRmlsZVdyaXRlUHRyRmN0ICAgIChJTikgUG9pbnRlciB0byBPU0FMIGZpbGUgd3JpdGVyIGZ1bmN0aW9ucwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIFRoZSBjb250ZXh0IHN0cnVjdHVyZSBjb3VsZCBub3QgYmUgYWxsb2NhdGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFBUTzNHUFBfSW5pdChNNFBUTzNHUFBfQ29udGV4dCogcENvbnRleHQsIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVSZWFkUHRyRmN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiBwRmlsZVdyaXRlUHRyRmN0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQVE8zR1BQX09wZW4oTTRQVE8zR1BQX0NvbnRleHQgcENvbnRleHQsIE00UFRPM0dQUF9QYXJhbXMqIHBQYXJhbXMpOwotICogQGJyaWVmICAgIFNldCB0aGUgTTRQVE8zR1BQIGlucHV0IGFuZCBvdXRwdXQgZmlsZXMuCi0gKiBAbm90ZSAgICBJdCBvcGVucyB0aGUgaW5wdXQgZmlsZSwgYnV0IHRoZSBvdXRwdXQgZmlsZSBtYXkgbm90IGJlIGNyZWF0ZWQgeWV0LgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNNFBUTzNHUFAgY29udGV4dAotICogQHBhcmFtICAgIHBQYXJhbXMgICAgICAgICAgICAgICAgKElOKSBQb2ludGVyIHRvIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgUFRPM0dQUC4KLSAqIEBub3RlICAgIFRoZSBwb2ludGVkIHN0cnVjdHVyZSBjYW4gYmUgZGUtYWxsb2NhdGVkIGFmdGVyIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBiZWNhdXNlCi0gKiAgICAgICAgICAgIGl0IGlzIGludGVybmFsbHkgY29waWVkIGJ5IHRoZSBQVE8zR1BQCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBNNFBUTzNHUFAgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKiBAcmV0dXJuICAgIEVSUl9QVE8zR1BQX0lOVkFMSURfVklERU9fRlJBTUVfU0laRV9GT1JfSDI2MyBUaGUgb3V0cHV0IHZpZGVvIGZyYW1lCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSBwYXJhbWV0ZXIgaXMgaW5jb21wYXRpYmxlIHdpdGggSDI2MyBlbmNvZGluZwotICogQHJldHVybiAgICBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZPUk1BVAotICogICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBvdXRwdXQgdmlkZW8gZm9ybWF0ICBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkCi0gKiBAcmV0dXJuICAgIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fQklUUkFURQotICogICAgICAgICAgICAgICAgICAgICAgICBUaGUgb3V0cHV0IHZpZGVvIGJpdC1yYXRlIHBhcmFtZXRlciBpcyB1bmRlZmluZWQKLSAqIEByZXR1cm4gICAgRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GUkFNRV9TSVpFCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBvdXRwdXQgdmlkZW8gZnJhbWUgc2l6ZSBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkCi0gKiBAcmV0dXJuICAgIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfRklMRV9TSVpFCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG91dHB1dCBmaWxlIHNpemUgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZAotICogQHJldHVybiAgICBFUlJfUFRPM0dQUF9VTkRFRklORURfQVVESU9fUEFERElORwotICogICAgICAgICAgICAgICAgICAgICAgICBUaGUgb3V0cHV0IGF1ZGlvIHBhZGRpbmcgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRQVE8zR1BQX09wZW4oTTRQVE8zR1BQX0NvbnRleHQgcENvbnRleHQsIE00UFRPM0dQUF9QYXJhbXMqIHBQYXJhbXMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBUTzNHUFBfU3RlcChNNFBUTzNHUFBfQ29udGV4dCBwQ29udGV4dCk7Ci0gKiBAYnJpZWYgICAgUGVyZm9ybSBvbmUgc3RlcCBvZiB0cmFuY29kaW5nLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTTRQVE8zR1BQIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBNNFBUTzNHUFAgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICAgIE00UFRPM0dQUF9XQVJfRU5EX09GX1BST0NFU1NJTkc6ICAgIEVuY29kaW5nIGNvbXBsZXRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRQVE8zR1BQX1N0ZXAoTTRQVE8zR1BQX0NvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBUTzNHUFBfQ2xvc2UoTTRQVE8zR1BQX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgIEZpbmlzaCB0aGUgTTRQVE8zR1BQIHRyYW5zY29kaW5nLgotICogQG5vdGUgICAgVGhlIG91dHB1dCAzR1BQIGZpbGUgaXMgcmVhZHkgdG8gYmUgcGxheWVkIGFmdGVyIHRoaXMgY2FsbAotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNNFBUTzNHUFAgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIE00UFRPM0dQUCBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UFRPM0dQUF9DbG9zZShNNFBUTzNHUFBfQ29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UFRPM0dQUF9DbGVhblVwKE00UFRPM0dQUF9Db250ZXh0IHBDb250ZXh0KTsKLSAqIEBicmllZiAgICBGcmVlIGFsbCByZXNvdXJjZXMgdXNlZCBieSB0aGUgTTRQVE8zR1BQLgotICogQG5vdGUgICAgVGhlIGNvbnRleHQgaXMgbm8gbW9yZSB2YWxpZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTTRQVE8zR1BQIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UFRPM0dQUF9DbGVhblVwKE00UFRPM0dQUF9Db250ZXh0IHBDb250ZXh0KTsKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLyogX19NNFBUTzNHUFBfQVBJX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000UFRPM0dQUF9FcnJvckNvZGVzLmggYi9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000UFRPM0dQUF9FcnJvckNvZGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU3YmQ1NGYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFBUTzNHUFBfRXJyb3JDb2Rlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFBUTzNHUFBfRXJyb3JDb2Rlcy5oCi0gKiBAYnJpZWYgICAgUGljdHVyZSB0byAzZ3BwIFNlcnZpY2UgZXJyb3IgZGVmaW5pdGlvbnMuCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpZm5kZWYgX19NNFBUTzNHUFBfRXJyb3JDb2Rlc19IX18KLSNkZWZpbmUgX19NNFBUTzNHUFBfRXJyb3JDb2Rlc19IX18KLQotLyoqCi0gKiAgICBPU0FMIGJhc2ljIHR5cGVzIGFuZCBlcnJvcnMgKi8KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0KLS8qKgotICogICAgT1NBTCBjb3JlIElEIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0KLQotLyoqCi0gKiAgICBUaGUgb3V0cHV0IHZpZGVvIGZvcm1hdCBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkICovCi0jZGVmaW5lIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRk9STUFUICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMDEgKQotLyoqCi0gKiAgICBUaGUgb3V0cHV0IHZpZGVvIGZyYW1lIHNpemUgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCAqLwotI2RlZmluZSBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZSQU1FX1NJWkUgICAgICAgIFwKLSAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00UFRPM0dQUCwgMHgwMDAyICkKLS8qKgotICogICAgVGhlIG91dHB1dCB2aWRlbyBiaXQtcmF0ZSBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkICovCi0jZGVmaW5lIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fQklUUkFURSAgICAgICAgICAgXAotICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMDMgKQotLyoqCi0gKiAgICBUaGUgb3V0cHV0IHZpZGVvIGZyYW1lIHNpemUgcGFyYW1ldGVyIGlzIGluY29tcGF0aWJsZSB3aXRoIEgyNjMgZW5jb2RpbmcgKi8KLSNkZWZpbmUgRVJSX1BUTzNHUFBfSU5WQUxJRF9WSURFT19GUkFNRV9TSVpFX0ZPUl9IMjYzICAgICAgICBcCi0gICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFBUTzNHUFAsIDB4MDAwNCApCi0vKioKLSAqICAgIFRoZSBmaWxlIHNpemUgaXMgdW5kZWZpbmVkICovCi0jZGVmaW5lIEVSUl9QVE8zR1BQX0lOVkFMSURfRklMRV9TSVpFICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMDUgKQotLyoqCi0gKiBUaGUgaW5wdXQgYXVkaW8gZmlsZSBjb250YWlucyBhIHRyYWNrIGZvcm1hdCBub3QgaGFuZGxlZCBieSBQVE8zR1BQICovCi0jZGVmaW5lIEVSUl9QVE8zR1BQX1VOSEFORExFRF9BVURJT19UUkFDS19JTlBVVF9GSUxFICAgICAgICAgXAotICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMDYgKQotLyoqCi0gKiAgICBUaGUgb3V0cHV0IHZpZGVvIGZvcm1hdCBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkICovCi0jZGVmaW5lIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfQVVESU9fRk9STUFUICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMDcgKQotCi0vKioKLSAqICAgIFRoZSBBTVIgZGVjb2RlciBpbml0aWFsaXphdGlvbiBmYWlsZWQgKi8KLSNkZWZpbmUgRVJSX1BUTzNHUFBfQU1SX0RFQ09ERVJfSU5JVF9FUlJPUiAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFBUTzNHUFAsIDB4MDAyMCApCi0vKioKLSAqICAgIFRoZSBBTVIgZGVjb2RlciBmYWlsZWQgKi8KLSNkZWZpbmUgRVJSX1BUTzNHUFBfQU1SX0RFQ09ERV9FUlJPUiAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFBUTzNHUFAsIDB4MDAyMSApCi0vKioKLSAqICAgIFRoZSBBTVIgZGVjb2RlciBjbGVhbnVwIGZhaWxlZCAqLwotI2RlZmluZSBFUlJfUFRPM0dQUF9BTVJfREVDT0RFUl9ERVNUUk9ZX0VSUk9SICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00UFRPM0dQUCwgMHgwMDIyICkKLQotLyoqCi0gKiAgICBUaGUgdmlkZW8gZW5jb2RlciBpbml0aWFsaXphdGlvbiBmYWlsZWQgKi8KLSNkZWZpbmUgRVJSX1BUTzNHUFBfVklERU9fRU5DT0RFUl9JTklUX0VSUk9SICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFBUTzNHUFAsIDB4MDAyMyApCi0vKioKLSAqICAgIFRoZSB2aWRlbyBlbmNvZGVyIGRlY29kaW5nIGZhaWxlZCAqLwotI2RlZmluZSBFUlJfUFRPM0dQUF9WSURFT19FTkNPREVfRVJST1IgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00UFRPM0dQUCwgMHgwMDI0ICkKLS8qKgotICogICAgVGhlIHZpZGVvIGVuY29kZXIgY2xlYW51cCBmYWlsZWQgKi8KLSNkZWZpbmUgRVJSX1BUTzNHUFBfVklERU9fRU5DT0RFUl9ERVNUUk9ZX0VSUk9SICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFBUTzNHUFAsIDB4MDAyNSApCi0KLS8qKgotICogICAgVGhlIG91dHB1dCBmaWxlIHNpemUgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCAqLwotI2RlZmluZSBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX0ZJTEVfU0laRSAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00UFRPM0dQUCwgMHgwMDI2ICkKLQotLyoqCi0gKiAgICBUaGUgRW5jb2RpbmcgaXMgY29tcGxldGVkICovCi0jZGVmaW5lIE00UFRPM0dQUF9XQVJfRU5EX09GX1BST0NFU1NJTkcgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMjcgKQotCi0vKioKLSAqICAgIFRoZSBFbmNvZGluZyBpcyBjb21wbGV0ZWQgKi8KLSNkZWZpbmUgTTRQVE8zR1BQX1dBUl9MQVNUX1BJQ1RVUkUgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFBUTzNHUFAsIDB4MDAyOCApCi0KLS8qKgotICogICAgVGhlIG91dHB1dCBhdWRpbyBwYWRkaW5nIHBhcmFtZXRlciBpcyB1bmRlZmluZWQgKi8KLSNkZWZpbmUgRVJSX1BUTzNHUFBfVU5ERUZJTkVEX0FVRElPX1BBRERJTkcgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFBUTzNHUFAsIDB4MDAyOSApCi0KLS8qKgotICogVGhlIHZpZGVvIGVuY29kZXIgZW5jb3VudGVyZWQgYW4gQWNjZXMgVW5pdCBlcnJvcjogdmVyeSBwcm9iYWJseSBhIGZpbGUgd3JpdGUgZXJyb3IgKi8KLSNkZWZpbmUgRVJSX1BUTzNHUFBfRU5DT0RFUl9BQ0NFU19VTklUX0VSUk9SICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFBUTzNHUFAsIDB4MDAyQSApCi0KLSNlbmRpZiAvKiBfX000UFRPM0dQUF9FcnJvckNvZGVzX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000UFRPM0dQUF9JbnRlcm5hbFR5cGVzLmggYi9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000UFRPM0dQUF9JbnRlcm5hbFR5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU5MmU1NjYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFBUTzNHUFBfSW50ZXJuYWxUeXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFBUTzNHUFBfSW50ZXJuYWxUeXBlcy5oCi0gKiBAYnJpZWYgICAgUGljdHVyZSB0byAzZ3BwIFNlcnZpY2UgaW50ZXJuYWwgZGVmaW5pdGlvbnMKLSAqIEBub3RlICAgIFRoaXMgZmlsZSBjb250YWlucyBhbGwgZW51bSBhbmQgdHlwZXMgbm90IHZpc2libGUgdG8gdGhlIGV4dGVybmFsIHdvcmxkLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLQotI2lmbmRlZiBfX000UFRPM0dQUF9JTlRFUk5BTFRZUEVTX0hfXwotI2RlZmluZSBfX000UFRPM0dQUF9JTlRFUk5BTFRZUEVTX0hfXwotCi0jZGVmaW5lIE00UFRPM0dQUF9WRVJTSU9OX01BSk9SICAgICAgICAzCi0jZGVmaW5lIE00UFRPM0dQUF9WRVJTSU9OX01JTk9SICAgICAgICAwCi0jZGVmaW5lIE00UFRPM0dQUF9WRVJTSU9OX1JFVklTSU9OICAgIDYKLQotLyoqCi0gKiAgICBNNFBUTzNHUFAgcHVibGljIEFQSSBhbmQgdHlwZXMgKi8KLSNpbmNsdWRlICJNNFBUTzNHUFBfQVBJLmgiCi0jaW5jbHVkZSAiTTRfVXRpbHMuaCIKLQotLyoqCi0gKiAgICBJbnRlcm5hbGx5IHVzZWQgbW9kdWxlcyAqLwotCi0jaW5jbHVkZSAiTTRXUklURVJfY29tbW9uLmgiICAgIC8qIFdyaXRlIDNHUFAgZmlsZSAgICAqLwotI2luY2x1ZGUgIk00UkVBREVSX0NvbW1vbi5oIiAgICAvKiBSZWFkIEFNUiBmaWxlICAgICovCi0jaW5jbHVkZSAiTTRFTkNPREVSX2NvbW1vbi5oIgotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICAgICAgTTRQVE8zR1BQX1N0YXRlcwotICogQGJyaWVmICAgICAgICBNYWluIHN0YXRlIG1hY2hpbmUgb2YgdGhlIE00UFRPM0dQUC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRQVE8zR1BQX2tTdGF0ZV9DUkVBVEVEICAgICAgICAgPSAwLCAgICAvKio8IE00UFRPM0dQUF9Jbml0IGhhcyBiZWVuIGNhbGxlZCAqLwotICAgIE00UFRPM0dQUF9rU3RhdGVfT1BFTkVEICAgICAgICAgID0gMSwgICAgLyoqPCBNNFBUTzNHUFBfT3BlbiBoYXMgYmVlbiBjYWxsZWQgKi8KLSAgICBNNFBUTzNHUFBfa1N0YXRlX1JFQURZICAgICAgICAgICA9IDIsICAgIC8qKjwgU3RlcCBjYW4gYmUgY2FsbGVkICovCi0gICAgTTRQVE8zR1BQX2tTdGF0ZV9GSU5JU0hFRCAgICAgICAgPSAzLCAgICAvKio8IFRyYW5zY29kaW5nIGlzIGZpbmlzaGVkICovCi0gICAgTTRQVE8zR1BQX2tTdGF0ZV9DTE9TRUQgICAgICAgICAgPSA0ICAgICAvKio8IE91dHB1dCBmaWxlIGhhcyBiZWVuIGNyZWF0ZWQgKi8KLX0KLU00UFRPM0dQUF9TdGF0ZXM7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgICAgIE00UFRPM0dQUF9TdHJlYW1TdGF0ZQotICogQGJyaWVmICAgICAgICBTdGF0ZSBvZiBhIG1lZGlhIHN0cmVhbSBlbmNvZGluZyAoYXVkaW8gb3IgdmlkZW8pLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFBUTzNHUFBfa1N0cmVhbVN0YXRlX05PU1RSRUFNICA9IDAsICAgIC8qKjwgTm8gc3RyZWFtIHByZXNlbnQgKi8KLSAgICBNNFBUTzNHUFBfa1N0cmVhbVN0YXRlX1NUQVJURUQgICA9IDEsICAgIC8qKjwgVGhlIHN0cmVhbSBlbmNvZGluZyBpcyBpbiBwcm9ncmVzcyAqLwotICAgIE00UFRPM0dQUF9rU3RyZWFtU3RhdGVfRklOSVNIRUQgID0gMiAgICAvKio8IFRoZSBzdHJlYW0gaGFzIGZpbmlzaGVkIGVuY29kaW5nICovCi19Ci1NNFBUTzNHUFBfU3RyZWFtU3RhdGU7Ci0KLS8qCi0gKiBEZWZpbml0aW9uIG9mIG1heCBBVSBzaXplICovCi0jZGVmaW5lIE00UFRPM0dQUF9WSURFT19NSU5fQ09NUFJFU1NJT05fUkFUSU8gICAgIDAuOEYgICAgLyoqPCBNYXggQVUgc2l6ZSB3aWxsIGJlIDAuOCB0aW1lcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlVVjQ6MjowIGZyYW1lIHNpemUgKi8KLSNkZWZpbmUgTTRQVE8zR1BQX1ZJREVPX0FVX1NJWkVfVE9fQ0hVTkNLX1NJWkVfUkFUSU8gICAgMS4yRiAvKio8IE1heCBjaHVuayBzaXplIHdpbGwgYmUgMS4yIHRpbWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWF4IEFVIHNpemUgKi8KLSNkZWZpbmUgTTRQVE8zR1BQX0FVRElPX01BWF9BVV9TSVpFICAgICAgICAgICAgICAxMDAwICAgIC8qKjwgQUFDIG1heCBBVSBzaXplIHNlZW1zIHRvIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3V0IDg1MCBieXRlcyAqLwotI2RlZmluZSBNNFBUTzNHUFBfQVVESU9fTUFYX0NIVU5LX1NJWkUgICAgICAgICAgIDUwMDAKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICAgICAgYW5vbnltb3VzIGVudW0KLSAqIEBicmllZiAgICAgICAgZW51bSB0byBrZWVwIHRyYWNrIG9mIHRoZSBlbmNvZGVyIHN0YXRlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLWVudW0KLXsKLSAgICBNNFBUTzNHUFBfa05vRW5jb2RlciwKLSAgICBNNFBUTzNHUFBfa0VuY29kZXJDbG9zZWQsCi0gICAgTTRQVE8zR1BQX2tFbmNvZGVyU3RvcHBlZCwKLSAgICBNNFBUTzNHUFBfa0VuY29kZXJSdW5uaW5nCi19OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFBUTzNHUFBfSW50ZXJuYWxDb250ZXh0Ci0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIE00UFRPM0dQUCBjb250ZXh0IChwcml2YXRlKQotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIGFsbCBNNFBUTzNHUFAgY2FsbHMgdG8gc3RvcmUgdGhlIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKioKLSAgICAgKiAgICBNNFBUTzNHUFAgbWFpbiB2YXJpYWJsZXMgKi8KLSAgICBNNFBUTzNHUFBfU3RhdGVzICAgICAgICAgICAgIG1fU3RhdGU7ICAgICAgICAgICAgLyoqPCBNNFBUTzNHUFAgaW50ZXJuYWwgc3RhdGUgKi8KLSAgICBNNFBUTzNHUFBfUGFyYW1zICAgICAgICAgICAgIG1fUGFyYW1zOyAgICAgICAgICAgLyoqPCBNNFBUTzNHUFAgcGFyYW1ldGVycywgc2V0IGJ5IHRoZSB1c2VyICovCi0gICAgTTRQVE8zR1BQX1N0cmVhbVN0YXRlICAgICAgICBtX1ZpZGVvU3RhdGU7ICAgICAgIC8qKjwgU3RhdGUgb2YgdGhlIHZpZGVvIGVuY29kaW5nICovCi0gICAgTTRQVE8zR1BQX1N0cmVhbVN0YXRlICAgICAgICBtX0F1ZGlvU3RhdGU7ICAgICAgIC8qKjwgU3RhdGUgb2YgdGhlIGF1ZGlvIGVuY29kaW5nICovCi0KLSAgICAvKioKLSAgICAgKiAgICBPU0FMIGZpbGUgcmVhZC93cml0ZSBmdW5jdGlvbnMgKi8KLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqICAgICAgICBwT3NhbEZpbGVSZWFkOyAgICAgLyoqPCBPU0FMIGZpbGUgcmVhZCBmdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHByb3ZpZGVkIGJ5IHVzZXIgKi8KLSAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogICAgICBwT3NhbEZpbGVXcml0ZTsgICAgLyoqPCBPU0FMIGZpbGUgd3JpdGUgZnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHByb3ZpZGVkIGJ5IHVzZXIgKi8KLQotICAgIC8qKgotICAgICAqICAgIFJlYWRlciBzdHVmZiAqLwotICAgIE00X0FjY2Vzc1VuaXQqICAgICAgICAgICAgICAgIG1fcFJlYWRlckF1ZGlvQVU7ICAgIC8qKjwgUmVhZCBhdWRpbyBhY2Nlc3MgdW5pdCAqLwotICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogICAgICAgIG1fcFJlYWRlckF1ZGlvU3RyZWFtOy8qKjwgRGVzY3JpcHRpb24gb2YgdGhlIHJlYWQgYXVkaW8gc3RyZWFtICovCi0KLSAgICAvKioKLSAgICAgKiAgICBXcml0ZXIgc3R1ZmYgKi8KLSAgICBNNFNZU19BY2Nlc3NVbml0ICAgICAgICAgICAgbV9Xcml0ZXJWaWRlb0FVOyAgICAgICAvKio8IFdyaXR0ZW4gdmlkZW8gYWNjZXNzIHVuaXQgKi8KLSAgICBNNFNZU19BY2Nlc3NVbml0ICAgICAgICAgICAgbV9Xcml0ZXJBdWRpb0FVOyAgICAgICAvKio8IFdyaXR0ZW4gYXVkaW8gYWNjZXNzIHVuaXQgKi8KLSAgICBNNEVOQ09ERVJfSGVhZGVyKiAgICAgICAgICAgbV9wRW5jb2RlckhlYWRlcjsgICAgICAvKio8IFNlcXVlbmNlIGhlYWRlciByZXR1cm5lZCBieSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZXIgYXQgZW5jb2RlciBjcmVhdGUgKGlmIGFueSkgKi8KLSAgICBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiogICAgbV9wV3JpdGVyVmlkZW9TdHJlYW07ICAvKio8IERlc2NyaXB0aW9uIG9mIHRoZSB3cml0dGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8gc3RyZWFtICovCi0gICAgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24qICAgIG1fcFdyaXRlckF1ZGlvU3RyZWFtOyAgLyoqPCBEZXNjcmlwdGlvbiBvZiB0aGUgd3JpdHRlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIHN0cmVhbSAqLwotICAgIE00V1JJVEVSX1N0cmVhbVZpZGVvSW5mb3MqICBtX3BXcml0ZXJWaWRlb1N0cmVhbUluZm87ICAgIC8qKjwgVmlkZW8gcHJvcGVydGllcyBvZiB0aGUgd3JpdHRlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8gc3RyZWFtICovCi0gICAgTTRXUklURVJfU3RyZWFtQXVkaW9JbmZvcyogICAgbV9wV3JpdGVyQXVkaW9TdHJlYW1JbmZvOyAgIC8qKjwgQXVkaW8gcHJvcGVydGllcyBvZiB0aGUgd3JpdHRlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gc3RyZWFtICovCi0KLSAgICAvKioKLSAgICAgKiAgICBDb250ZXh0cyBvZiB0aGUgdXNlZCBtb2R1bGVzICAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICBtX3BBdWRpb1JlYWRlckNvbnRleHQ7IC8qKjwgQ29udGV4dCBvZiB0aGUgYXVkaW8gcmVhZGVyIG1vZHVsZSovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgIG1fcDNncFdyaXRlckNvbnRleHQ7ICAgLyoqPCBDb250ZXh0IG9mIHRoZSAzR1Agd3JpdGVyIG1vZHVsZSAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICBtX3BNcDRFbmNvZGVyQ29udGV4dDsgIC8qKjwgTXA0IGVuY29kZXIgY29udGV4dCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICBtX2VFbmNvZGVyU3RhdGU7Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkZXIgSW50ZXJmYWNlcyAqLwotICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSogICAgbV9wUmVhZGVyR2xvYkludDsgICAgLyoqPCBSZWFkZXIgY29tbW9uIGludGVyZmFjZSwgZ2xvYmFsIHBhcnQgKi8KLSAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlKiAgICAgIG1fcFJlYWRlckRhdGFJbnQ7ICAgICAvKio8IFJlYWRlciBjb21tb24gaW50ZXJmYWNlLCBkYXRhIHBhcnQgKi8KLQotICAgIC8qKgotICAgICAqIFdyaXRlciBJbnRlcmZhY2VzICovCi0gICAgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlKiAgIG1fcFdyaXRlckdsb2JJbnQ7ICAgICAvKio8IFdyaXRlciBjb21tb24gaW50ZXJmYWNlLCBnbG9iYWwgcGFydCAqLwotICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqICAgICBtX3BXcml0ZXJEYXRhSW50OyAgICAgLyoqPCBXcml0ZXIgY29tbW9uIGludGVyZmFjZSwgZGF0YSBwYXJ0ICovCi0KLSAgICAvKioKLSAgICAgKiBFbmNvZGVyIEludGVyZmFjZXMgKi8KLSAgICBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlKiAgbV9wRW5jb2RlckludDsgICAgICAgICAgICAgICAgLyoqPCBFbmNvZGVyIGNvbW1vbiBpbnRlcmZhY2UgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgbV9wRW5jb2RlckV4dGVybmFsQVBJOwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICBtX3BFbmNvZGVyVXNlckRhdGE7Ci0KLSAgICAvKioKLSAgICAgKiAqLwotICAgIE00VklGSV9JbWFnZVBsYW5lKiAgICAgICAgICAgIHBTYXZlZFBsYW5lOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgIHVpU2F2ZWREdXJhdGlvbjsKLQotICAgIC8qKgotICAgICAqICAgIFZpZGVvIHJhdGUgY29udHJvbCBzdHVmZiAqLwotICAgIE00X01lZGlhVGltZSAgICAgICAgICAgICAgICBtX2RMYXN0VmlkZW9SZWd1bEN0czsgLyoqPCBMYXN0IHRpbWUgKENUUykgdGhlIHZpZGVvIGJpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVndWxhdGlvbiBoYXMgYmVlbiBjYWxsZWQgKi8KLSAgICBNNF9NZWRpYVRpbWUgICAgICAgICAgICAgICAgbV9tdEN0czsgICAgICAgICAvKio8IEN1cnJlbnQgdmlkZW8gY3RzICovCi0gICAgTTRfTWVkaWFUaW1lICAgICAgICAgICAgICAgIG1fbXROZXh0Q3RzOyAgICAgLyoqPCBOZXh0IHZpZGVvIENUUyB0byB0cmFuc2NvZGUgKi8KLSAgICBNNF9NZWRpYVRpbWUgICAgICAgICAgICAgICAgbV9tdEF1ZGlvQ3RzOyAgICAvKio8IEN1cnJlbnQgYXVkaW8gY3RzICovCi0gICAgTTRfTWVkaWFUaW1lICAgICAgICAgICAgICAgIG1fQXVkaW9PZmZTZXQ7ICAgLyoqPCBBdWRpbyBPZmZzZXQgdG8gYWRkIHRvIHRoZSBjdHMgaW4gbG9vcCBtb2RlKi8KLSAgICBNNF9NZWRpYVRpbWUgICAgICAgICAgICAgICAgbV9QcmV2QXVkaW9DdHM7ICAvKio8IFByZXZpb3VzIGF1ZGlvIGN0cyBmb3IgQUFDIGxvb3BpbmcgKi8KLSAgICBNNF9NZWRpYVRpbWUgICAgICAgICAgICAgICAgbV9EZWx0YUF1ZGlvQ3RzOyAvKio8IERlbHRhIGF1ZGlvIGN0cyBmb3IgQUFDIGxvb3BpbmcgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgbV9DdXJyZW50RmlsZVNpemU7IC8qKjwgQ3VycmVudCBPdXRwdXQgZmlsZSBzaXplICAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICBtX01heEZpbGVTaXplOyAgICAgLyoqPCBNYXggT3V0cHV0IGZpbGUgc2l6ZSAgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgbV9Jc0xhc3RQaWN0dXJlOyAgIC8qKjwgQSBib29sZWFuIHRoYXQgc2lnbmFscyB0byB0aGUgZW5jb2RlciB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBpcyB0aGUgbGFzdCBmcmFtZSB0byBiZSBlbmNvZGVkKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgbV9iTGFzdEludGVybmFsQ2FsbEJhY2s7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIG1fTmJDdXJyZW50RnJhbWU7ICAvKio8IEluZGV4IG9mIHRoZSBjdXJyZW50IFlVViBmcmFtZSBlbmNvZGVkICovCi0KLSAgICAvKioKLSAgICAgKiAgICBBdWRpbyBwYWRkaW5nIG1vZGUgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICBtX2JBdWRpb1BhZGRpbmdTaWxlbmNlOyAgLyoqPCBBIGJvb2xlYW4gdGhhdCBzaWduYWxzIHRoYXQgYXVkaW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVSB3aWxsIGJlIHBhZGRlZCBieSBzaWxlbmNlICovCi19IE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQ7Ci0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBUTzNHUFBfYXBwbHlWUFAoTTRWUFBfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZU91dCkKLSAqIEBicmllZiAgICBDYWxsIGFuIGV4dGVybmFsIGNhbGxiYWNrIHRvIGdldCB0aGUgcGljdHVyZSB0byBlbmNvZGUKLSAqIEBub3RlICAgIEl0IGlzIGNhbGxlZCBieSB0aGUgdmlkZW8gZW5jb2RlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgVlBQIGNvbnRleHQsIHdoaWNoIGFjdHVhbGx5IGlzIHRoZSBNNFBUTzNHUFAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsIGNvbnRleHQgaW4gb3VyIGNhc2UKLSAqIEBwYXJhbSAgICBwUGxhbmVJbiAgICAoSU4pIENvbnRhaW5zIHRoZSBpbWFnZQotICogQHBhcmFtICAgIHBQbGFuZU91dCAgICAoSU4vT1VUKSBQb2ludGVyIHRvIGFuIGFycmF5IG9mIDMgcGxhbmVzIHRoYXQgd2lsbCBjb250YWluIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgWVVWNDIwIGltYWdlIHJlYWQgd2l0aCB0aGUgbV9wUGljdHVyZUNhbGxiYWNrRmN0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIEFueSBlcnJvciByZXR1cm5lZCBieSBhbiB1bmRlcmxheWluZyBtb2R1bGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UFRPM0dQUF9hcHBseVZQUChNNFZQUF9Db250ZXh0IHBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lSW4sCi0gTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZU91dCk7Ci0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9fTTRQVE8zR1BQX0lOVEVSTkFMVFlQRVNfSF9fICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRWU1MzR1BQX0FQSS5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfQVBJLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBiYjcxNDEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfQVBJLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX19NNFZTUzNHUFBfQVBJX0hfXwotI2RlZmluZSBfX000VlNTM0dQUF9BUElfSF9fCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRWU1MzR1BQX0FQSS5oCi0gKiBAYnJpZWYgICBWaWRlbyBTdHVkaW8gU2VydmljZSAzR1BQIHB1YmxpYyBBUEkuCi0gKiBAbm90ZSAgICBWU1MgYWxsb3dzIGVkaXRpbmcgM0dQUCBmaWxlcy4KLSAqICAgICAgICAgIEl0IGlzIGEgc3RyYWlnaHRmb3J3YXJkIGFuZCBmdWxseSBzeW5jaHJvbm91cyBBUEkuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotLyoqCi0gKiAgT1NBTCBiYXNpYyB0eXBlcyBhbmQgZXJyb3JzICovCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotCi0vKioKLSAqICBPU0FMIHR5cGVzIGZvciBmaWxlIGFjY2VzcyAqLwotI2luY2x1ZGUgIk00T1NBX0ZpbGVSZWFkZXIuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlV3JpdGVyLmgiCi0KLS8qKgotICogIERlZmluaXRpb24gb2YgTTRfVmVyc2lvbkluZm8gKi8KLSNpbmNsdWRlICJNNFRPT0xfVmVyc2lvbkluZm8uaCIKLQotLyoqCi0gKiBJbWFnZSBwbGFuZXMgZGVmaW5pdGlvbiAqLwotI2luY2x1ZGUgIk00VklGSV9GaWx0ZXJzQVBJLmgiCi0KLS8qKgotICogQ29tbW9uIGRlZmluaXRpb25zIG9mIHZpZGVvIGVkaXRpbmcgY29tcG9uZW50cyAqLwotI2luY2x1ZGUgIk00X1ZpZGVvRWRpdGluZ0NvbW1vbi5oIgotI2luY2x1ZGUgIk00RU5DT0RFUl9BdWRpb0NvbW1vbi5oIgotI2luY2x1ZGUgIk00QURfQ29tbW9uLmgiCi0jaW5jbHVkZSAiTTREQV9UeXBlcy5oIgotCi0vKioKLSAqIEV4dGVuZGVkIEFQSSAoeFZTUykgKi8KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VYVEVOREVEX0ZFQVRVUkVTCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0V4dGVuZGVkX0FQSS5oIgotI2VuZGlmCi0KLS8vI2luY2x1ZGUgIk00VkRfSFdfQVBJLmgiCi0vLyNpbmNsdWRlICJNNFZFX0FQSS5oIgotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICAgRWRpdGlvbiBGZWF0dXJlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLS8qKgotICogIFB1YmxpYyB0eXBlIG9mIHRoZSBWU1MgZWRpdCBjb250ZXh0ICovCi10eXBlZGVmIE00T1NBX1ZvaWQqIE00VlNTM0dQUF9FZGl0Q29udGV4dDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00VlNTM0dQUF9WaWRlb0VmZmVjdFR5cGUKLSAqIEBicmllZiAgIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgdmlkZW8gZWZmZWN0IHR5cGVzIG9mIHRoZSBWU1MzR1BQCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX05vbmUgICAgICAgICAgID0gMCwgIC8qKjwgTm8gdmlkZW8gZWZmZWN0ICovCi0gICAgTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRmFkZUZyb21CbGFjayAgPSA4LCAgLyoqPCBJbnRlbmRlZCBmb3IgYmVnaW4gZWZmZWN0ICovCi0gICAgTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRmFkZVRvQmxhY2sgICAgPSAxNiwgLyoqPCBJbnRlbmRlZCBmb3IgZW5kIGVmZmVjdCAqLwotICAgIE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX0V4dGVybmFsICAgICAgID0gMjU2IC8qKjwgRXh0ZXJuYWwgZWZmZWN0IGZ1bmN0aW9uIGlzIHVzZWQgKi8KLSAgICAvKiByZXNlcnZlZCAyNTYgKyBuICovICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEV4dGVybmFsIGVmZmVjdCBudW1iZXIgbiAqLwotCi19IE00VlNTM0dQUF9WaWRlb0VmZmVjdFR5cGU7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNFZTUzNHUFBfQXVkaW9FZmZlY3RUeXBlCi0gKiBAYnJpZWYgICBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIGF1ZGlvIGVmZmVjdCB0eXBlcyBvZiB0aGUgVlNTM0dQUAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFZTUzNHUFBfa0F1ZGlvRWZmZWN0VHlwZV9Ob25lICAgID0gMCwKLSAgICBNNFZTUzNHUFBfa0F1ZGlvRWZmZWN0VHlwZV9GYWRlSW4gID0gOCwgLyoqPCBJbnRlbmRlZCBmb3IgYmVnaW4gZWZmZWN0ICovCi0gICAgTTRWU1MzR1BQX2tBdWRpb0VmZmVjdFR5cGVfRmFkZU91dCA9IDE2IC8qKjwgSW50ZW5kZWQgZm9yIGVuZCBlZmZlY3QgKi8KLQotfSBNNFZTUzNHUFBfQXVkaW9FZmZlY3RUeXBlOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTRWU1MzR1BQX1ZpZGVvVHJhbnNpdGlvblR5cGUKLSAqIEBicmllZiAgIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgdmlkZW8gZWZmZWN0IHRoYXQgY2FuIGJlIGFwcGxpZWQgZHVyaW5nIGEgdHJhbnNpdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRWU1MzR1BQX2tWaWRlb1RyYW5zaXRpb25UeXBlX05vbmUgICAgICA9IDAsCi0gICAgTTRWU1MzR1BQX2tWaWRlb1RyYW5zaXRpb25UeXBlX0Nyb3NzRmFkZSA9IDEsCi0gICAgTTRWU1MzR1BQX2tWaWRlb1RyYW5zaXRpb25UeXBlX0V4dGVybmFsICA9IDI1NgotICAgIC8qIHJlc2VydmVkIDI1NiArIG4gKi8gICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRXh0ZXJuYWwgdHJhbnNpdGlvbiBudW1iZXIgbiAqLwotCi19IE00VlNTM0dQUF9WaWRlb1RyYW5zaXRpb25UeXBlOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTRWU1MzR1BQX0F1ZGlvVHJhbnNpdGlvblR5cGUKLSAqIEBicmllZiAgIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgYXVkaW8gZWZmZWN0IHRoYXQgY2FuIGJlIGFwcGxpZWQgZHVyaW5nIGEgdHJhbnNpdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRWU1MzR1BQX2tBdWRpb1RyYW5zaXRpb25UeXBlX05vbmUgPSAwLAotICAgIE00VlNTM0dQUF9rQXVkaW9UcmFuc2l0aW9uVHlwZV9Dcm9zc0ZhZGUKLQotfSBNNFZTUzNHUFBfQXVkaW9UcmFuc2l0aW9uVHlwZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzCi0gKiBAYnJpZWYgICBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBpbmZvcm1hdGlvbiBwcm92aWRlZCB0byB0aGUgZXh0ZXJuYWwgRWZmZWN0Ci0gKiAgICAgICAgICBhbmQgVHJhbnNpdGlvbiBmdW5jdGlvbnMKLSAqIEBub3RlICAgIFRoZSB1aVByb2dyZXNzIHZhbHVlIHNob3VsZCBiZSBlbm91Z2ggZm9yIG1vc3QgY2FzZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKio8IFByb2dyZXNzIG9mIHRoZSBFZmZlY3Qgb3IgdGhlIFRyYW5zaXRpb24sIGZyb20gMCB0byAxMDAwIChvbmUgdGhvdXNhbmQpICovCi0gICAgTTRPU0FfVUludDMyICAgIHVpUHJvZ3Jlc3M7Ci0gICAgLyoqPCBJbmRleCBvZiB0aGUgY3VycmVudCBjbGlwIChmaXJzdCBjbGlwIGluIGNhc2Ugb2YgYSBUcmFuc2l0aW9uKSwgZnJvbSAwIHRvIE4gKi8KLSAgICAvL000T1NBX1VJbnQ4ICAgICB1aUN1cnJlbnRDbGlwOwotICAgIC8qKjwgQ3VycmVudCB0aW1lLCBpbiBtaWxsaXNlY29uZHMsIGluIHRoZSBjdXJyZW50IGNsaXAgdGltZS1saW5lICovCi0gICAgTTRPU0FfVUludDMyICAgIHVpQ2xpcFRpbWU7Ci0gICAgLyoqPCBDdXJyZW50IHRpbWUsIGluIG1pbGxpc2Vjb25kcywgaW4gdGhlIG91dHB1dCBjbGlwIHRpbWUtbGluZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICB1aU91dHB1dFRpbWU7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgYklzTGFzdDsKLQotfSBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00VlNTM0dQUF9jb2RlY1R5cGUKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgY29kZWMgdHlwZXMgdXNlZCB0byBjcmVhdGUgaW50ZXJmYWNlcwotICogQG5vdGUgICAgVGhpcyBlbnVtIGlzIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgVlNTM0dQUCBzZXJ2aWNlcyB0byBpZGVudGlmeQotICogICAgICAgICAgICAgYSBjdXJyZW50bHkgc3VwcG9ydGVkIGNvZGVjIGludGVyZmFjZS4gRWFjaCBjb2RlYyBpcwotICogICAgICAgICAgICByZWdpc3RlcmVkIHdpdGggb25lIG9mIHRoaXMgdHlwZSBhc3NvY2lhdGVkLgotICogICAgICAgICAgICBXaGVuIGEgY29kZWMgaW5zdGFuY2UgaXMgbmVlZGVkLCB0aGlzIHR5cGUgaXMgdXNlZCB0bwotICogICAgICAgICAgICBpZGVudGlmeSBhbmQgcmV0cmlldmUgaXRzIGludGVyZmFjZS4KLSAqICAgICAgICAgICAgVGhpcyBjYW4gYmUgZXh0ZW5kZWQgZm9yIG90aGVyIGNvZGVjcy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgLyogVmlkZW8gRGVjb2RlciBUeXBlcyAqLwotICAgIE00VlNTM0dQUF9rVmlkZW9EZWNNUEVHNCA9IDAsCi0gICAgTTRWU1MzR1BQX2tWaWRlb0RlY0gyNjQsCi0KLSAgICAvKiBWaWRlbyBFbmNvZGVyIFR5cGVzICovCi0gICAgTTRWU1MzR1BQX2tWaWRlb0VuY01QRUc0LAotICAgIE00VlNTM0dQUF9rVmlkZW9FbmNIMjYzLAotICAgIE00VlNTM0dQUF9rVmlkZW9FbmNIMjY0LAotCi0gICAgLyogQXVkaW8gRGVjb2RlciBUeXBlcyAqLwotICAgIE00VlNTM0dQUF9rQXVkaW9EZWNBTVJOQiwKLSAgICBNNFZTUzNHUFBfa0F1ZGlvRGVjQUFDLAotICAgIE00VlNTM0dQUF9rQXVkaW9EZWNNUDMsCi0KLSAgICAvKiBBdWRpbyBFbmNvZGVyIFR5cGVzICovCi0gICAgTTRWU1MzR1BQX2tBdWRpb0VuY0FNUk5CLAotICAgIE00VlNTM0dQUF9rQXVkaW9FbmNBQUMsCi0KLSAgICAvKiBudW1iZXIgb2YgY29kZWNzLCBrZWVwIGl0IGFzIGxhc3QgZW51bSBlbnRyeSwgYmVmb3JlIGludmxhaWQgdHlwZSAqLwotICAgIE00VlNTM0dQUF9rQ29kZWNUeXBlX05CLAotICAgIC8qIGludmFsaWQgY29kZWMgdHlwZSAqLwotICAgIE00VlNTM0dQUF9rQ29kZWNUeXBlSW52YWxpZCA9IDI1NQotCi19IE00VlNTM0dQUF9jb2RlY1R5cGU7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRWU1MzR1BQX2VkaXRWaWRlb0VmZmVjdEZjdAotICogQGJyaWVmICAgICAgIEJlZ2luIGFuZCBFbmQgdmlkZW8gZWZmZWN0IGZ1bmN0aW9ucyBpbXBsZW1lbnRlZCBieSB0aGUgaW50ZWdyYXRvcgotICogICAgICAgICAgICAgIG11c3QgbWF0Y2ggdGhpcyBwcm90b3R5cGUuCi0gKiBAbm90ZSAgICAgICAgVGhlIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIHdpdGggdGhlIG9yaWdpbmFsIGltYWdlIG9mIHRoZSBjbGlwLgotICogICAgICAgICAgICAgIEl0IG11c3QgYXBwbHkgdGhlIHZpZGVvIGVmZmVjdCB0byBidWlsZCB0aGUgb3V0cHV0IGltYWdlLgotICogICAgICAgICAgICAgIFRoZSBwcm9ncmVzcyBvZiB0aGUgZWZmZWN0IGlzIGdpdmVuLCBvbiBhIHNjYWxlIGZyb20gMCB0byAxMDAwLgotICogICAgICAgICAgICAgIFdoZW4gdGhlIGVmZmVjdCBmdW5jdGlvbiBpcyBjYWxsZWQsIGFsbCB0aGUgaW1hZ2UgcGxhbmUgc3RydWN0dXJlcwotICogICAgICAgICAgICAgIGFuZCBidWZmZXJzIGFyZSB2YWxpZCBhbmQgb3duZWQgYnkgdGhlIFZTUyAzR1BQLgotICoKLSAqIEBwYXJhbSAgIHBGdW5jdGlvbkNvbnRleHQgICAgKElOKSBUaGUgZnVuY3Rpb24gY29udGV4dCwgcHJldmlvdXNseSBzZXQgYnkgdGhlIGludGVncmF0b3IKLSAqIEBwYXJhbSAgIHBJbnB1dFBsYW5lcyAgICAgICAgKElOKSBJbnB1dCBZVVY0MjAgaW1hZ2U6IHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdGhyZWUgdmFsaWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSBwbGFuZXMgKFksIFUgYW5kIFYpCi0gKiBAcGFyYW0gICBwT3V0cHV0UGxhbmVzICAgICAgIChJTi9PVVQpIE91dHB1dCAoZmlsdGVyZWQpIFlVVjQyMCBpbWFnZTogcG9pbnRlciB0byBhbiBhcnJheQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aHJlZSB2YWxpZCBpbWFnZSBwbGFuZXMgKFksIFUgYW5kIFYpCi0gKiBAcGFyYW0gICBwUHJvZ3Jlc3MgICAgICAgICAgIChJTikgU2V0IG9mIGluZm9ybWF0aW9uIGFib3V0IHRoZSB2aWRlbyB0cmFuc2l0aW9uIHByb2dyZXNzLgotICogQHBhcmFtICAgdWlFeHRlcm5hbEVmZmVjdElkICAoSU4pIFdoaWNoIGVmZmVjdCBmdW5jdGlvbiBzaG91bGQgYmUgdXNlZCAoZm9yIGV4dGVybmFsIGVmZmVjdHMpCi0gKgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgTTRPU0FfRVJSICgqTTRWU1MzR1BQX2VkaXRWaWRlb0VmZmVjdEZjdCkKLSgKLSAgICBNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwSW5wdXRQbGFuZXMsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBPdXRwdXRQbGFuZXMsCi0gICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAgICBNNE9TQV9VSW50MzIgdWlFeHRlcm5hbEVmZmVjdElkCi0pOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00VlNTM0dQUF9lZGl0VmlkZW9UcmFuc2l0aW9uRmN0Ci0gKiBAYnJpZWYgICAgICAgRXh0ZXJuYWwgdHJhbnNpdGlvbiBmdW5jdGlvbnMgaW1wbGVtZW50ZWQgYnkgdGhlIGludGVncmF0b3IKLSAqICAgICAgICAgICAgICBtdXN0IG1hdGNoIHRoaXMgcHJvdG90eXBlLgotICogQG5vdGUgICAgICAgIFRoZSBmdW5jdGlvbiBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbWFnZSBvZiB0aGUgZmlyc3QgY2xpcCBhbmQKLSAqICAgICAgICAgICAgICB0aGUgaW1hZ2Ugb2YgdGhlIHNlY29uZCBjbGlwLiBJdCBtdXN0IGJ1aWxkIHRoZSBvdXRwdXQgaW1hZ2UKLSAqICAgICAgICAgICAgICBmcm9tIHRoZSB0d28gaW5wdXQgaW1hZ2VzLgotICogICAgICAgICAgICAgIFRoZSBwcm9ncmVzcyBvZiB0aGUgdHJhbnNpdGlvbiBpcyBnaXZlbiwgb24gYSBzY2FsZSBmcm9tIDAgdG8gMTAwMC4KLSAqICAgICAgICAgICAgICBXaGVuIHRoZSBleHRlcm5hbCBmdW5jdGlvbiBpcyBjYWxsZWQsIGFsbCB0aGUgaW1hZ2UgcGxhbmUKLSAqICAgICAgICAgICAgICBzdHJ1Y3R1cmVzIGFuZCBidWZmZXJzIGFyZSB2YWxpZCBhbmQgb3duZWQgYnkgdGhlIFZTUyAzR1BQLgotICoKLSAqIEBwYXJhbSAgIHBGdW5jdGlvbkNvbnRleHQgICAgKElOKSBUaGUgZnVuY3Rpb24gY29udGV4dCwgcHJldmlvdXNseSBzZXQgYnkgdGhlIGludGVncmF0b3IKLSAqIEBwYXJhbSAgIHBDbGlwMUlucHV0UGxhbmVzICAgKElOKSBGaXJzdCBpbnB1dCBZVVY0MjAgaW1hZ2U6IHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdGhyZWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCBpbWFnZSBwbGFuZXMgKFksIFUgYW5kIFYpCi0gKiBAcGFyYW0gICBwQ2xpcDJJbnB1dFBsYW5lcyAgIChJTikgU2Vjb25kIGlucHV0IFlVVjQyMCBpbWFnZTogcG9pbnRlciB0byBhbiBhcnJheSBvZiB0aHJlZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkIGltYWdlIHBsYW5lcyAoWSwgVSBhbmQgVikKLSAqIEBwYXJhbSAgIHBPdXRwdXRQbGFuZXMgICAgICAgKElOL09VVCkgT3V0cHV0IChmaWx0ZXJlZCkgWVVWNDIwIGltYWdlOiBwb2ludGVyIHRvIGFuIGFycmF5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRocmVlIHZhbGlkIGltYWdlIHBsYW5lcyAoWSwgVSBhbmQgVikKLSAqIEBwYXJhbSAgIHBQcm9ncmVzcyAgICAgICAgICAgKElOKSBTZXQgb2YgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHZpZGVvIGVmZmVjdCBwcm9ncmVzcy4KLSAqIEBwYXJhbSAgIHVpRXh0ZXJuYWxUcmFuc2l0aW9uSWQgICAgKElOKSBXaGljaCB0cmFuc2l0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3IgZXh0ZXJuYWwgdHJhbnNpdGlvbnMpCi0gKgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgTTRPU0FfRVJSICgqTTRWU1MzR1BQX2VkaXRWaWRlb1RyYW5zaXRpb25GY3QpCi0oCi0gICAgTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcENsaXAxSW5wdXRQbGFuZXMsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBDbGlwMklucHV0UGxhbmVzLAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwT3V0cHV0UGxhbmVzLAotICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgTTRPU0FfVUludDMyIHVpRXh0ZXJuYWxUcmFuc2l0aW9uSWQKLSk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MKLSAqIEBicmllZiAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYW4gYXVkaW8vdmlkZW8gZWZmZWN0IGZvciB0aGUgZWRpdGlvbi4KLSAqIEBub3RlICAgIEVmZmVjdCBzdGFydCB0aW1lIGlzIHJlbGF0aXZlIHRvIG91dHB1dCBjbGlwLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgdWlTdGFydFRpbWU7ICAgICAgICAgICAvKio8IEluIG1zICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICB1aUR1cmF0aW9uOyAgICAgICAgICAgIC8qKjwgSW4gbXMgKi8KLSAgICBNNFZTUzNHUFBfVmlkZW9FZmZlY3RUeXBlICAgIFZpZGVvRWZmZWN0VHlwZTsgICAgICAgLyoqPCBOb25lLCBGYWRlSW4sIEZhZGVPdXQsIGV0Yy4gKi8KLSAgICBNNFZTUzNHUFBfZWRpdFZpZGVvRWZmZWN0RmN0IEV4dFZpZGVvRWZmZWN0RmN0OyAgICAgLyoqPCBFeHRlcm5hbCBlZmZlY3QgZnVuY3Rpb24gKi8KLSAgICBNNE9TQV9Wb2lkICAgICAgICAgICAgICAgICAgKnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQ7LyoqPCBDb250ZXh0IGdpdmVuIHRvIHRoZSBleHRlcm5hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdCBmdW5jdGlvbiAqLwotICAgIE00VlNTM0dQUF9BdWRpb0VmZmVjdFR5cGUgICAgQXVkaW9FZmZlY3RUeXBlOyAgICAgICAvKio8IE5vbmUsIEZhZGVJbiwgRmFkZU91dCAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FWFRFTkRFRF9GRUFUVVJFUwotICAgIE00eFZTU19FZmZlY3RTZXR0aW5ncyAgICAgICAgIHhWU1M7Ci0jZW5kaWYKLQotfSBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3M7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNFZTUzNHUFBfVHJhbnNpdGlvbkJlaGF2aW91cgotICogQGJyaWVmICAgIFRyYW5zaXRpb24gYmVoYXZpb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRWU1MzR1BQX1RyYW5zaXRpb25CZWhhdmlvdXJfU3BlZWRVcCA9IDAsCi0gICAgTTRWU1MzR1BQX1RyYW5zaXRpb25CZWhhdmlvdXJfTGluZWFyLAotICAgIE00VlNTM0dQUF9UcmFuc2l0aW9uQmVoYXZpb3VyX1NwZWVkRG93biwKLSAgICBNNFZTUzNHUFBfVHJhbnNpdGlvbkJlaGF2aW91cl9TbG93TWlkZGxlLAotICAgIE00VlNTM0dQUF9UcmFuc2l0aW9uQmVoYXZpb3VyX0Zhc3RNaWRkbGUKLX0gTTRWU1MzR1BQX1RyYW5zaXRpb25CZWhhdmlvdXI7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICBNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzCi0gKiBAYnJpZWYgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSB0cmFuc2l0aW9uIHRvIGJlIGFwcGxpZWQgd2hlbiBhc3NlbWJsaW5nIHR3byBjbGlwcy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKio8IER1cmF0aW9uIG9mIHRoZSB0cmFuc2l0aW9uLCBpbiBtaWxsaXNlY29uZHMgKHNldCB0byAwIHRvIGdldCBubyB0cmFuc2l0aW9uKSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgIHVpVHJhbnNpdGlvbkR1cmF0aW9uOwotCi0gICAgLyoqPCBUeXBlIG9mIHRoZSB2aWRlbyB0cmFuc2l0aW9uICovCi0gICAgTTRWU1MzR1BQX1ZpZGVvVHJhbnNpdGlvblR5cGUgICAgVmlkZW9UcmFuc2l0aW9uVHlwZTsKLQotICAgIC8qKjwgRXh0ZXJuYWwgdHJhbnNpdGlvbiB2aWRlbyBlZmZlY3QgZnVuY3Rpb24gKi8KLSAgICBNNFZTUzNHUFBfZWRpdFZpZGVvVHJhbnNpdGlvbkZjdCBFeHRWaWRlb1RyYW5zaXRpb25GY3Q7Ci0KLSAgICAvKio8IENvbnRleHQgb2YgdGhlIGV4dGVybmFsIHRyYW5zaXRpb24gdmlkZW8gZWZmZWN0IGZ1bmN0aW9uICovCi0gICAgTTRPU0FfVm9pZCAgICAgICAgICAgICAgICAgICAgICAqcEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQ7Ci0gICAgTTRWU1MzR1BQX0F1ZGlvVHJhbnNpdGlvblR5cGUgICAgQXVkaW9UcmFuc2l0aW9uVHlwZTsgICAvKio8IFR5cGUgb2YgdGhlIGF1ZGlvIHRyYW5zaXRpb24gKi8KLSAgICBNNFZTUzNHUFBfVHJhbnNpdGlvbkJlaGF2aW91ciAgICAgVHJhbnNpdGlvbkJlaGF2aW91cjsgICAgLyoqPFRyYW5zaXRpb24gYmVoYXZpb3VyKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfRVhURU5ERURfRkVBVFVSRVMKLSAgICBNNHhWU1NfVHJhbnNpdGlvblNldHRpbmdzICAgICAgICB4VlNTOwotI2VuZGlmCi0KLX0gTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5nczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MKLSAqIEBicmllZiAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYW4gaW5wdXQgY2xpcCBmb3IgdGhlIGVkaXRpb24uCi0gKiBAbm90ZSAgICBJdCBhbHNvIGNvbnRhaW5zIHRoZSBzZXR0aW5ncyBmb3IgdGhlIGN1dCBhbmQgYmVnaW4vZW5kIGVmZmVjdHMgYXBwbGllZCB0byB0aGUgY2xpcC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9Wb2lkICAgICAgICAgICAgICAgICAgICAgKnBGaWxlOyAgICAgICAgICAgIC8qKjwgQ2xpcCBmaWxlIGRlc2NyaXB0b3IgKi8KLSAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSAgICAgICAgIEZpbGVUeXBlOyAgICAgICAgIC8qKjwgLjNncCwgLmFtciwgLm1wMyAgICAgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIGZpbGVQYXRoU2l6ZTsgICAgICAvKio8IENsaXAgcGF0aCBzaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZGQgYmVjYXVzZSBvZiBVVEYxNiBjb252ZXJzaW9uKSovCi0gICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgICBDbGlwUHJvcGVydGllczsgICAvKio8IENsaXAgYW5hbHlzaXMgcHJldmlvdXNseSBjb21wdXRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgdWlCZWdpbkN1dFRpbWU7ICAgLyoqPCBCZWdpbiBjdXQgdGltZSwgaW4gbWlsbGlzZWNvbmRzICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICB1aUVuZEN1dFRpbWU7ICAgICAvKio8IEVuZCBjdXQgdGltZSwgaW4gbWlsbGlzZWNvbmRzICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICBiVHJhbnNjb2RpbmdSZXF1aXJlZDsKLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfRVhURU5ERURfRkVBVFVSRVMKLSAgICBNNHhWU1NfQ2xpcFNldHRpbmdzICAgICAgICAgICAgIHhWU1M7Ci0jZW5kaWYKLQotfSBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgTTRWU1MzR1BQX0VkaXRTZXR0aW5ncwotICogQGJyaWVmICAgVGhpcyBzdHJ1Y3R1cmUgZ2F0aGVycyBhbGwgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBkZWZpbmUgYSBjb21wbGV0ZQotICogICAgICAgICAgZWRpdGlvbiBvcGVyYXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnQgb2YgdGhlIGNsaXAgbGlzdCBwQ2xpcExpc3QgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgICB1aUNsaXBOdW1iZXI7Ci0gICAgLyoqPCBUaGUgcHJvcGVydGllcyBvZiB0aGlzIGNsaXAgd2lsbCBiZSB1c2VkIGFzIGEgcmVmZXJlbmNlIGZvciBjb21wYXRpYmlsaXR5IGNoZWNraW5nICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgICAgdWlNYXN0ZXJDbGlwOwotICAgIC8qKjwgTGlzdCBvZiB0aGUgaW5wdXQgY2xpcHMgc2V0dGluZ3MuIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdWlDbGlwTnVtYmVyCi0gICAgIGNsaXAgc2V0dGluZ3MgcG9pbnRlcnMgKi8KLSAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICAgICAgICAgICAqKnBDbGlwTGlzdDsKLSAgICAvKio8IExpc3Qgb2YgdGhlIHRyYW5zaXRpb24gc2V0dGluZ3MuIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdWlDbGlwTnVtYmVyLTEKLSAgICAgdHJhbnNpdGlvbiBzZXR0aW5ncyBwb2ludGVycyAqLwotICAgIE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MgICAgICoqcFRyYW5zaXRpb25MaXN0OwotICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyAgICAgICAgICpFZmZlY3RzOyAgICAgICAgIC8qKjwgTGlzdCBvZiBlZmZlY3RzICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgICAgICAgbmJFZmZlY3RzOyAgICAgLyoqPCBOdW1iZXIgb2YgZWZmZWN0cyBpbiB0aGUgYWJvdmUgbGlzdCAqLwotICAgIC8qKjwgRnJhbWUgcmF0ZSBhdCB3aGljaCB0aGUgbW9kaWZpZWQgdmlkZW8gc2VjdGlvbnMgd2lsbCBiZSBlbmNvZGVkICovCi0gICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZXJhdGUgICAgdmlkZW9GcmFtZVJhdGU7Ci0gICAgTTRPU0FfVm9pZCAgICAgICAgICAgICAgICAgICAgICAgKnBPdXRwdXRGaWxlOyAgICAgIC8qKjwgT3V0cHV0IDNHUFAgY2xpcCBmaWxlIGRlc2NyaXB0b3IgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICB1aU91dHB1dFBhdGhTaXplOyAgICAvKio8IE91dHB1dCBmaWxlIHBhdGggc2l6ZSovCi0gICAgLyoqPCBUZW1wb3JhcnkgZmlsZSB0byBzdG9yZSBtZXRhZGF0YSAoIm1vb3YuYmluIikgKi8KLSAgICBNNE9TQV9Wb2lkICAgICAgICAgICAgICAgICAgICAgICAqcFRlbXBvcmFyeUZpbGU7Ci0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VYVEVOREVEX0ZFQVRVUkVTCi0gICAgTTR4VlNTX0VkaXRTZXR0aW5ncyAgICAgICAgICAgICAgeFZTUzsKLSNlbmRpZgotICAgIE00T1NBX0Zsb2F0ICAgICAgICAgICAgICAgICAgICBQVFZvbExldmVsOwotfSBNNFZTUzNHUFBfRWRpdFNldHRpbmdzOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0QW5hbHlzZUNsaXAoKQotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgY2hlY2tpbmcgaWYgYSBjbGlwIGlzIGNvbXBhdGlibGUgd2l0aCBWU1MgM0dQUCBlZGl0aW5nCi0gKiBAbm90ZSAgICBJdCBhbHNvIGZpbGxzIGEgQ2xpcEFuYWx5c2lzIHN0cnVjdHVyZSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gY2hlY2sgaWYgdHdvCi0gKiAgICAgICAgICBjbGlwcyBhcmUgY29tcGF0aWJsZQotICogQHBhcmFtICAgcENsaXAgICAgICAgICAgICAgICAoSU4pIEZpbGUgZGVzY3JpcHRvciBvZiB0aGUgaW5wdXQgM0dQUC9NUDMgY2xpcCBmaWxlLgotICogQHBhcmFtICAgcENsaXBQcm9wZXJ0aWVzICAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBDbGlwUHJvcGVydGllcyBzdHJ1Y3R1cmUuCi0gKiBAcGFyYW0gICBGaWxlVHlwZSAgICAgICAgICAgIChJTikgVHlwZSBvZiB0aGUgaW5wdXQgZmlsZSAoLjNncCwgLmFtciwgLm1wMykKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfSDI2M19QUk9GSUxFX05PVF9TVVBQT1JURUQKLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQ0xJUF9BTkFMWVNJU19WRVJTSU9OCi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9BTVJfRURJVElOR19VTlNVUFBPUlRFRAotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9IMjYzX1BST0ZJTEUKLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfTVBFRzRfUFJPRklMRQotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9NUEVHNF9SVkxDCi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9WSURFT19GT1JNQVQKLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX0VESVRJTkdfTk9fU1VQUE9SVEVEX1ZJREVPX1NUUkVBTV9JTl9GSUxFCi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0FVRElPX0ZPUk1BVAotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfRURJVElOR19OT19TVVBQT1JURURfU1RSRUFNX0lOX0ZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0QW5hbHlzZUNsaXAoTTRPU0FfVm9pZCAqcENsaXAsIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIEZpbGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgICpwQ2xpcFByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIgKnBGaWxlUmVhZFB0ckZjdCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0Q2hlY2tDbGlwQ29tcGF0aWJpbGl0eSgpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIGFsbG93cyBjaGVja2luZyBpZiB0d28gY2xpcHMgYXJlIGNvbXBhdGlibGUgd2l0aCBlYWNoIG90aGVyCi0gKiAgICAgICAgICBmb3IgVlNTIDNHUFAgZWRpdGluZyBhc3NlbWJseSBmZWF0dXJlLgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwMVByb3BlcnRpZXMgICAgICAgIChJTikgQ2xpcCBhbmFseXNpcyBvZiB0aGUgZmlyc3QgY2xpcAotICogQHBhcmFtICAgcENsaXAyUHJvcGVydGllcyAgICAgICAgKElOKSBDbGlwIGFuYWx5c2lzIG9mIHRoZSBzZWNvbmQgY2xpcAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQ0xJUF9BTkFMWVNJU19WRVJTSU9OCi0gKiBAcmV0dXJuICBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQ0xJUF9BTkFMWVNJU19QTEFURk9STQotICogQHJldHVybiAgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fRk9STUFUCi0gKiBAcmV0dXJuICBNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19GUkFNRV9TSVpFCi0gKiBAcmV0dXJuICBNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19USU1FX1NDQUxFCi0gKiBAcmV0dXJuICBNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19EQVRBX1BBUlRJVElPTklORwotICogQHJldHVybiAgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9NUDNfQVNTRU1CTFkKLSAqIEByZXR1cm4gIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfVklERU9fRk9STUFUCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHkoTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgICpwQ2xpcDFQcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyAgKnBDbGlwMlByb3BlcnRpZXMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdEluaXQoKQotICogQGJyaWVmICAgIEluaXRpYWxpemVzIHRoZSBWU1MgM0dQUCBlZGl0IG9wZXJhdGlvbiAoYWxsb2NhdGVzIGFuIGV4ZWN1dGlvbiBjb250ZXh0KS4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoT1VUKSBQb2ludGVyIG9uIHRoZSBWU1MgM0dQUCBlZGl0IGNvbnRleHQgdG8gYWxsb2NhdGUKLSAqIEBwYXJhbSAgICBwRmlsZVJlYWRQdHJGY3QgICAgICAgIChJTikgUG9pbnRlciB0byBPU0FMIGZpbGUgcmVhZGVyIGZ1bmN0aW9ucwotICogQHBhcmFtICAgcEZpbGVXcml0ZVB0ckZjdCAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHdyaXRlciBmdW5jdGlvbnMKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRJbml0KAotICAgIE00VlNTM0dQUF9FZGl0Q29udGV4dCogcENvbnRleHQsCi0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRQdHJGY3QsCi0gICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIHBGaWxlV3JpdGVQdHJGY3QgKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRDcmVhdGVDbGlwU2V0dGluZ3MoKQotICogQGJyaWVmICAgIEFsbG93cyBmaWxsaW5nIGEgY2xpcCBzZXR0aW5ncyBzdHJ1Y3R1cmUgd2l0aCBkZWZhdWx0IHZhbHVlcwotICoKLSAqIEBub3RlICAgIFdBUk5JTkc6IHBDbGlwU2V0dGluZ3MtPnBGaWxlICAgICAgd2lsbCBiZSBhbGxvY2F0ZWQgaW4gdGhpcyBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gICAgcENsaXBTZXR0aW5ncyAgICAgICAgKElOKSBQb2ludGVyIHRvIGEgdmFsaWQgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyBzdHJ1Y3R1cmUKLSAqIEBwYXJhbSAgIHBGaWxlICAgICAgICAgICAgICAgKElOKSBDbGlwIGZpbGUgbmFtZQotICogQHBhcmFtICAgZmlsZVBhdGhTaXplICAgICAgICAoSU4pIFNpemUgb2YgdGhlIGNsaXAgcGF0aCAobmVlZGVkIGZvciBVVEYxNiBjb252ZXJzaW9uKQotICogQHBhcmFtICAgIG5iRWZmZWN0cyAgICAgICAgICAgKElOKSBOYiBvZiBlZmZlY3Qgc2V0dGluZ3MgdG8gYWxsb2NhdGUKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDbGlwU2V0dGluZ3MgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0Q3JlYXRlQ2xpcFNldHRpbmdzKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDbGlwU2V0dGluZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcEZpbGUsIE00T1NBX1VJbnQzMiBmaWxlUGF0aFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggbmJFZmZlY3RzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXREdXBsaWNhdGVDbGlwU2V0dGluZ3MoKQotICogQGJyaWVmICAgIER1cGxpY2F0ZXMgYSBjbGlwIHNldHRpbmdzIHN0cnVjdHVyZSwgcGVyZm9ybWluZyBhbGxvY2F0aW9ucyBpZiByZXF1aXJlZAotICoKLSAqIEBwYXJhbSAgICBwQ2xpcFNldHRpbmdzRGVzdCAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzIHN0cnVjdHVyZQotICogQHBhcmFtICAgIHBDbGlwU2V0dGluZ3NPcmlnICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIE00VlNTM0dQUF9DbGlwU2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcGFyYW0gICBiQ29weUVmZmVjdHMgICAgICAgIChJTikgRmxhZyB0byBrbm93IGlmIHdlIGhhdmUgdG8gZHVwbGljYXRlIGVmZmVjdHMgKGRlcHJlY2F0ZWQpCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdER1cGxpY2F0ZUNsaXBTZXR0aW5ncyhNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzRGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzT3JpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Cb29sIGJDb3B5RWZmZWN0cyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0RnJlZUNsaXBTZXR0aW5ncygpCi0gKiBAYnJpZWYgICAgRnJlZSB0aGUgcG9pbnRlcnMgYWxsb2NhdGVkIGluIHRoZSBDbGlwU2V0dGluZyBzdHJ1Y3R1cmUgKHBGaWxlLCBFZmZlY3RzKS4KLSAqCi0gKiBAcGFyYW0gICAgcENsaXBTZXR0aW5ncyAgICAgICAgKElOKSBQb2ludGVyIHRvIGEgdmFsaWQgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyBzdHJ1Y3R1cmUKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDbGlwU2V0dGluZ3MgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0RnJlZUNsaXBTZXR0aW5ncyhNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRPcGVuKCkKLSAqIEBicmllZiAgIFNldCB0aGUgVlNTIDNHUFAgaW5wdXQgYW5kIG91dHB1dCBmaWxlcywgYW5kIHNldCB0aGUgc2V0dGluZ3MuCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIFZTUyAzR1BQIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgcFNldHRpbmdzICAgICAgICAgICAoSU4pIEVkaXQgc2V0dGluZ3MKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBWU1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgTTRFUlJfQUxMT0M6ICAgICAgICBUaGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0T3BlbihNNFZTUzNHUFBfRWRpdENvbnRleHQgcENvbnRleHQsIE00VlNTM0dQUF9FZGl0U2V0dGluZ3MgKnBTZXR0aW5ncyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0U3RlcCgpCi0gKiBAYnJpZWYgICBQZXJmb3JtIG9uZSBzdGVwIG9mIGVkaXRpbmcuCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAgICAgKElOKSBWU1MgM0dQUCBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgIHBQcm9ncmVzcyAgICAgICAgICAgICAgIChPVVQpIFByb2dyZXNzIHBlcmNlbnRhZ2UgKDAgdG8gMTAwKSBvZiB0aGUgZWRpdGluZyBvcGVyYXRpb24KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICAgICAgVlNTIDNHUFAgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBjYWxsZWQKLSAqIEByZXR1cm4gIE00VlNTM0dQUF9XQVJfRURJVElOR19ET05FOkVkaXRpb24gaXMgZG9uZSwgdXNlciBzaG91bGQgbm93IGNhbGwgTTRWU1MzR1BQX2VkaXRDbG9zZSgpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdFN0ZXAoTTRWU1MzR1BQX0VkaXRDb250ZXh0IHBDb250ZXh0LCBNNE9TQV9VSW50OCAqcFByb2dyZXNzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRDbG9zZSgpCi0gKiBAYnJpZWYgICBGaW5pc2ggdGhlIFZTUyAzR1BQIGVkaXQgb3BlcmF0aW9uLgotICogQG5vdGUgICAgVGhlIG91dHB1dCAzR1BQIGZpbGUgaXMgcmVhZHkgdG8gYmUgcGxheWVkIGFmdGVyIHRoaXMgY2FsbAotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIFZTUyAzR1BQIGVkaXQgY29udGV4dAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBWU1MgM0dQUCBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgY2FsbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENsb3NlKE00VlNTM0dQUF9FZGl0Q29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0Q2xlYW5VcCgpCi0gKiBAYnJpZWYgICBGcmVlIGFsbCByZXNvdXJjZXMgdXNlZCBieSB0aGUgVlNTIDNHUFAgZWRpdCBvcGVyYXRpb24uCi0gKiBAbm90ZSAgICBUaGUgY29udGV4dCBpcyBubyBtb3JlIHZhbGlkIGFmdGVyIHRoaXMgY2FsbAotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIFZTUyAzR1BQIGVkaXQgY29udGV4dAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRDbGVhblVwKE00VlNTM0dQUF9FZGl0Q29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICAgQXVkaW8gTWl4aW5nIEZlYXR1cmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLS8qKgotICogIFB1YmxpYyB0eXBlIG9mIHRoZSBWU1MgYXVkaW8gbWl4aW5nIGNvbnRleHQgKi8KLXR5cGVkZWYgTTRPU0FfVm9pZCogTTRWU1MzR1BQX0F1ZGlvTWl4aW5nQ29udGV4dDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgIE00VlNTM0dQUF9BdWRpb01peGluZ1NldHRpbmdzCi0gKiBAYnJpZWYgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBzZXR0aW5ncyBvZiB0aGUgYXVkaW8gbWl4aW5nIG9wZXJhdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3JpZ2luYWxDbGlwRmlsZTsgICAgICAvKio8IElucHV0IDNHUFAgY2xpcCBmaWxlICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGRlZEF1ZGlvVHJhY2tGaWxlOyAgIC8qKjwgTmV3IGF1ZGlvIHRyYWNrICovCi0gICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgICAgICAgICAgICAgICAgIEFkZGVkQXVkaW9GaWxlVHlwZTsgICAgIC8qKjwgRmlsZSBGb3JtYXQgb2YgdGhlIG5ldyBhdWRpbyBmaWxlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpQWRkQ3RzOyAgICAgICAgICAgICAgIC8qKjwgVGltZSwgaW4gbWlsbGlzZWNvbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdCB3aGljaCB0aGUgYWRkZWQgYXVkaW8gdHJhY2sgaXMgaW5zZXJ0ZWQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlBZGRWb2x1bWU7ICAgICAgICAgICAgLyoqPCBWb2x1bWUsIGluIHBlcmNlbnRhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgYWRkZWQgYXVkaW8gdHJhY2sgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlCZWdpbkxvb3A7ICAgICAgICAgICAgLyoqPCBEZXNjcmliZXMgaW4gbWlsbGktc2Vjb25kIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgdGltZSBvZiB0aGUgbG9vcCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aUVuZExvb3A7ICAgICAgICAgICAgICAvKio8IERlc2NyaWJlcyBpbiBtaWxsaS1zZWNvbmQgdGhlIGVuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lIG9mIHRoZSBsb29wICgwIG1lYW5zIG5vIGxvb3ApICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSZW1vdmVPcmlnaW5hbDsgICAgICAvKio8IElmIHRydWUsIHRoZSBvcmlnaW5hbCBhdWRpbyB0cmFjawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IHRha2VuIGludG8gYWNjb3VudCAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0cHV0Q2xpcEZpbGU7ICAgICAgLyoqPCBPdXRwdXQgM0dQUCBjbGlwIGZpbGUgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBvcmFyeUZpbGU7ICAgICAgIC8qKjwgVGVtcG9yYXJ5IGZpbGUgdG8gc3RvcmUgbWV0YWRhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJtb292LmJpbiIpICovCi0gICAgLyoqPCBUaGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIG9wdGlvbm5hbC4gVGhleSBhcmUganVzdCB1c2VkIGluIGNhc2Ugb2YgTVAzIHJlcGxhY2VtZW50LiAqLwotICAgIE00VklERU9FRElUSU5HX0F1ZGlvU2FtcGxpbmdGcmVxdWVuY3kgICBvdXRwdXRBU0Y7ICAgICAgICAgLyoqPCBPdXRwdXQgc2FtcGxpbmcgZnJlcXVlbmN5ICovCi0gICAgTTRWSURFT0VESVRJTkdfQXVkaW9Gb3JtYXQgICAgICAgICAgICAgIG91dHB1dEF1ZGlvRm9ybWF0OyAvKio8IE91dHB1dCBhdWRpbyBjb2RlYyhBQUMvQU1SKSovCi0gICAgTTRWSURFT0VESVRJTkdfQml0cmF0ZSAgICAgICAgICAgICAgICAgIG91dHB1dEF1ZGlvQml0cmF0ZTsgLyoqPCBPdXRwdXQgYXVkaW8gYml0cmF0ZSAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXROQkNoYW5uZWxzOyAvKio8IE91dHB1dCBhdWRpbyBuYiBvZiBjaGFubmVscyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiX0R1Y2tpbmdOZWVkZWVkOwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbkR1Y2tpbmdfdGhyZXNob2xkOwotICAgIE00T1NBX0Zsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQlRWb2xMZXZlbDsKLSAgICBNNE9TQV9GbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlBUVm9sTGV2ZWw7Ci0gICAgTTRPU0FfRmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluRHVja2luZ19sb3dWb2x1bWU7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJMb29wOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aVNhbXBsaW5nRnJlcXVlbmN5OwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aU51bUNoYW5uZWxzOwotfSBNNFZTUzNHUFBfQXVkaW9NaXhpbmdTZXR0aW5nczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nSW5pdChNNFZTUzNHUFBfQXVkaW9NaXhpbmdDb250ZXh0KiBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BdWRpb01peGluZ1NldHRpbmdzKiBwU2V0dGluZ3MpCi0gKiBAYnJpZWYgICAgSW5pdGlhbGl6ZXMgdGhlIFZTUyBhdWRpbyBtaXhpbmcgb3BlcmF0aW9uIChhbGxvY2F0ZXMgYW4gZXhlY3V0aW9uIGNvbnRleHQpLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgKE9VVCkgUG9pbnRlciBvbiB0aGUgVlNTIGF1ZGlvIG1peGluZyBjb250ZXh0IHRvIGFsbG9jYXRlCi0gKiBAcGFyYW0gICAgcFNldHRpbmdzICAgICAgICAoSU4pIFBvaW50ZXIgdG8gdmFsaWQgYXVkaW8gbWl4aW5nIHNldHRpbmdzCi0gKiBAcGFyYW0gICAgcEZpbGVSZWFkUHRyRmN0ICAgICAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHJlYWRlciBmdW5jdGlvbnMKLSAqIEBwYXJhbSAgIHBGaWxlV3JpdGVQdHJGY3QgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSB3cml0ZXIgZnVuY3Rpb25zCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfYXVkaW9NaXhpbmdJbml0KAotICAgIE00VlNTM0dQUF9BdWRpb01peGluZ0NvbnRleHQqIHBDb250ZXh0LAotICAgIE00VlNTM0dQUF9BdWRpb01peGluZ1NldHRpbmdzKiBwU2V0dGluZ3MsCi0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRQdHJGY3QsCi0gICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIHBGaWxlV3JpdGVQdHJGY3QgKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nU3RlcCgpCi0gKiBAYnJpZWYgICBQZXJmb3JtIG9uZSBzdGVwIG9mIGF1ZGlvIG1peGluZy4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgICAgICAgICAgICAgIChJTikgVlNTIDNHUFAgYXVkaW8gbWl4aW5nIGNvbnRleHQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEBwYXJhbSAgIHBQcm9ncmVzcyAgICAgICAgICAgICAgICAgICAgICAgKE9VVCkgUHJvZ3Jlc3MgcGVyY2VudGFnZSAoMCB0byAxMDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBmaW5hbGl6YXRpb24gb3BlcmF0aW9uCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgICAgICAgICAgICAgIFZTUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICBNNFZTUzNHUFBfV0FSX0VORF9PRl9BVURJT19NSVhJTkc6IEF1ZGlvIG1peGluZyBpcyBvdmVyLCB1c2VyIHNob3VsZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3cgY2FsbCBNNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwKCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9hdWRpb01peGluZ1N0ZXAoTTRWU1MzR1BQX0F1ZGlvTWl4aW5nQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCAqcFByb2dyZXNzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcCgpCi0gKiBAYnJpZWYgICBGcmVlIGFsbCByZXNvdXJjZXMgdXNlZCBieSB0aGUgVlNTIGF1ZGlvIG1peGluZyBvcGVyYXRpb24uCi0gKiBAbm90ZSAgICBUaGUgY29udGV4dCBpcyBubyBtb3JlIHZhbGlkIGFmdGVyIHRoaXMgY2FsbAotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIFZTUyAzR1BQIGF1ZGlvIG1peGluZyBjb250ZXh0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwKE00VlNTM0dQUF9BdWRpb01peGluZ0NvbnRleHQgcENvbnRleHQpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICAgRXh0cmFjdCBQaWN0dXJlIEZlYXR1cmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLS8qKgotICogIFB1YmxpYyB0eXBlIG9mIHRoZSBWU1MgZXh0cmFjdCBwaWN0dXJlIGNvbnRleHQgKi8KLXR5cGVkZWYgTTRPU0FfVm9pZCogTTRWU1MzR1BQX0V4dHJhY3RQaWN0dXJlQ29udGV4dDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICBNNFZTUzNHUFBfRXh0cmFjdFBpY3R1cmVTZXR0aW5ncwotICogQGJyaWVmICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgc2V0dGluZ3Mgb2YgdGhlIGV4dHJhY3QgcGljdHVyZSBhdWRpbyBvcGVyYXRpb24uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICBwSW5wdXRDbGlwRmlsZTsgIC8qKjwgSW5wdXQgM0dQUCBjbGlwIGZpbGUgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICBpRXh0cmFjdGlvblRpbWU7IC8qKjwgZnJhbWUgdGltZSAoaW4gbXMpIHRvIGJlIGV4dHJhY3RlZCAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRwdXRZdXZQaWM7ICAgLyoqPCBPdXRwdXQgWVVWIHBpY3R1cmUgbmFtZSAqLwotfSBNNFZTUzNHUFBfRXh0cmFjdFBpY3R1cmVTZXR0aW5nczsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2V4dHJhY3RQaWN0dXJlSW5pdCgpCi0gKiBAYnJpZWYgICAgSW5pdGlhbGl6ZXMgdGhlIFZTUyBleHRyYWN0IHBpY3R1cmUgb3BlcmF0aW9uIChhbGxvY2F0ZXMgYW4gZXhlY3V0aW9uIGNvbnRleHQpLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChPVVQpIFBvaW50ZXIgb24gdGhlIFZTUyBleHRyYWN0IHBpY3R1cmUgY29udGV4dCB0byBhbGxvY2F0ZQotICogQHBhcmFtICAgIHBTZXR0aW5ncyAgICAgICAgICAgIChJTikgUG9pbnRlciB0byB2YWxpZCBleHRyYWN0IHBpY3R1cmUgc2V0dGluZ3MKLSAqIEBwYXJhbSAgICBwV2lkdGggICAgICAgICAgICAgICAgKE9VVCkgdmlkZW8gc3RyZWFtIHdpZHRoCi0gKiBAcGFyYW0gICAgcEhlaWdodCAgICAgICAgICAgICAgICAoT1VUKSB2aWRlbyBzdHJlYW0gaGVpZ2h0Ci0gKiBAcGFyYW0gICAgcEZpbGVSZWFkUHRyRmN0ICAgICAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHJlYWRlciBmdW5jdGlvbnMKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICAgICAgICAgICAgICBUaGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0NMSVAxOiAgICBUaGUgaW5wdXQgY2xpcCBpcyBlbXB0eQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dHJhY3RQaWN0dXJlSW5pdCgKLSAgICAgICAgTTRWU1MzR1BQX0V4dHJhY3RQaWN0dXJlQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgIE00VlNTM0dQUF9FeHRyYWN0UGljdHVyZVNldHRpbmdzKiBwU2V0dGluZ3MsCi0gICAgICAgIE00T1NBX1VJbnQzMiAqcFdpZHRoLAotICAgICAgICBNNE9TQV9VSW50MzIgKnBIZWlnaHQsCi0gICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVSZWFkUHRyRmN0ICk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9leHRyYWN0UGljdHVyZVN0ZXAoKQotICogQGJyaWVmICAgUGVyZm9ybSBvbmUgc3RlcCBvZiBwaWN0dXJlIGV4dHJhY3Rpb24uCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAgICAgICAgICAgICAoSU4pIFZTUyBleHRyYWN0IHBpY3R1cmUgY29udGV4dAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgICAgICAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHBhcmFtICAgcERlY1BsYW5lcyAgICAgICAgICAgICAgICAgICAgICAoT1VUKSBQbGFuZSBpbiB3aWNoIHRoZSBleHRyYWN0ZWQgcGljdHVyZSBpcyBjb3BpZWQKLSAqIEBwYXJhbSAgIHBQcm9ncmVzcyAgICAgICAgICAgICAgICAgICAgICAgKE9VVCkgUHJvZ3Jlc3MgcGVyY2VudGFnZSAoMCB0byAxMDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHBpY3R1cmUgZXh0cmFjdGlvbgotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICAgICAgICAgICAgICBWU1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgVlNTX1dBUl9FTkRfT0ZfRVhUUkFDVF9QSUNUVVJFOiBQaWN0dXJlIGV4dHJhY3Rpb24gIGlzIG92ZXIsIHVzZXIgc2hvdWxkIG5vdwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsIE00VlNTM0dQUF9leHRyYWN0UGljdHVyZUNsZWFuVXAoKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dHJhY3RQaWN0dXJlU3RlcChNNFZTUzNHUFBfRXh0cmFjdFBpY3R1cmVDb250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBEZWNQbGFuZXMsIE00T1NBX1VJbnQ4ICpwUHJvZ3Jlc3MpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZXh0cmFjdFBpY3R1cmVDbGVhblVwKCkKLSAqIEBicmllZiAgIEZyZWUgYWxsIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBWU1MgcGljdHVyZSBleHRyYWN0aW9uLgotICogQG5vdGUgICAgVGhlIGNvbnRleHQgaXMgbm8gbW9yZSB2YWxpZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBWU1MgZXh0cmFjdCBwaWN0dXJlIGNvbnRleHQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9leHRyYWN0UGljdHVyZUNsZWFuVXAoTTRWU1MzR1BQX0V4dHJhY3RQaWN0dXJlQ29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICAgQ29tbW9uIGZlYXR1cmVzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9HZXRWZXJzaW9uKCkKLSAqIEBicmllZiAgIEdldCB0aGUgVlNTIHZlcnNpb24uCi0gKiBAbm90ZSAgICBDYW4gYmUgY2FsbGVkIGFueXRpbWUuIERvIG5vdCBuZWVkIGFueSBjb250ZXh0LgotICogQHBhcmFtICAgcFZlcnNpb25JbmZvICAgICAgICAoT1VUKSBQb2ludGVyIHRvIGEgdmVyc2lvbiBpbmZvIHN0cnVjdHVyZQotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX0dldFZlcnNpb24oTTRfVmVyc2lvbkluZm8qIHBWZXJzaW9uSW5mbyk7Ci0KLQotI2lmZGVmIFdJTjMyCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfR2V0RXJyb3JNZXNzYWdlKCkKLSAqIEBicmllZiAgIFJldHVybiBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBnaXZlbiBlcnJvciBjb2RlCi0gKiBAbm90ZSAgICBUaGUgaW5wdXQgc3RyaW5nIG11c3QgYmUgYWxyZWFkeSBhbGxvY2F0ZWQgKGFuZCBsb25nIGVub3VnaCEpCi0gKiBAcGFyYW0gICBlcnIgICAgICAgICAgICAgKElOKSBFcnJvciBjb2RlIHRvIGdldCB0aGUgZGVzY3JpcHRpb24gZnJvbQotICogQHBhcmFtICAgc01lc3NhZ2UgICAgICAgIChJTi9PVVQpIEFsbG9jYXRlZCBzdHJpbmcgaW4gd2hpY2ggdGhlIGRlc2NyaXB0aW9uIHdpbGwgYmUgY29waWVkCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgSW5wdXQgZXJyb3IgaXMgZnJvbSB0aGUgVlNTM0dQUCBtb2R1bGUKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjpJbnB1dCBlcnJvciBpcyBub3QgZnJvbSB0aGUgVlNTM0dQUCBtb2R1bGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9HZXRFcnJvck1lc3NhZ2UoTTRPU0FfRVJSIGVyciwgTTRPU0FfQ2hhciogc01lc3NhZ2UpOwotI2VuZGlmIC8qKjwgV0lOMzIgKi8KLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLyogX19NNFZTUzNHUFBfQVBJX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9FcnJvckNvZGVzLmggYi9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9FcnJvckNvZGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdjNTAwZGEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfRXJyb3JDb2Rlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFZTUzNHUFBfRXJyb3JDb2Rlcy5oCi0gKiBAYnJpZWYgICAgVmlkZW8gU3R1ZGlvIFNlcnZpY2UgM0dQUCBlcnJvciBkZWZpbml0aW9ucy4KLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2lmbmRlZiBfX000VlNTM0dQUF9FcnJvckNvZGVzX0hfXwotI2RlZmluZSBfX000VlNTM0dQUF9FcnJvckNvZGVzX0hfXwotCi0vKioKLSAqICAgIE9TQUwgYmFzaWMgdHlwZXMgYW5kIGVycm9ycyAqLwotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLQotLyoqCi0gKiAgICBPU0FMIGNvcmUgSUQgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICJNNE9TQV9Db3JlSUQuaCIKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogV2FybmluZyBjb2RlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogICAgRW5kIG9mIGVkaXRpb24sIHVzZXIgc2hvdWxkIG5vdyBjYWxsIE00VlNTM0dQUF9lZGl0Q2xvc2UoKSAqLwotI2RlZmluZSBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORSAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9XQVIsIE00VlNTM0dQUCwgMHgwMDAxKQotCi0vKioKLSAqICAgIEVuZCBvZiBhdWRpbyBtaXhpbmcsIHVzZXIgc2hvdWxkIG5vdyBjYWxsIE00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXAoKSAqLwotI2RlZmluZSBNNFZTUzNHUFBfV0FSX0VORF9PRl9BVURJT19NSVhJTkcgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9XQVIsIE00VlNTM0dQUCwgMHgwMDEwKQotCi0vKioKLSAqICAgIEVuZCBvZiBleHRyYWN0IHBpY3R1cmUsIHVzZXIgc2hvdWxkIG5vdyBjYWxsIE00VlNTM0dQUF9leHRyYWN0UGljdHVyZUNsZWFuVXAoKSAqLwotI2RlZmluZSBNNFZTUzNHUFBfV0FSX0VORF9PRl9FWFRSQUNUX1BJQ1RVUkUgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9XQVIsIE00VlNTM0dQUCwgMHgwMDIwKQotLyogUkM6IHRvIGtub3cgd2hlbiBhIGZpbGUgaGFzIGJlZW4gcHJvY2Vzc2VkICovCi0jZGVmaW5lIE00VlNTM0dQUF9XQVJfU1dJVENIX0NMSVAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X1dBUiwgTTRWU1MzR1BQLCAweDAwMzApCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBFcnJvciBjb2RlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBJbnZhbGlkIGZpbGUgdHlwZSAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0lOVkFMSURfRklMRV9UWVBFICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAwMSkKLS8qKgotICogSW52YWxpZCBlZmZlY3Qga2luZCAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0lOVkFMSURfRUZGRUNUX0tJTkQgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAwMikKLS8qKgotICogSW52YWxpZCBlZmZlY3QgdHlwZSBmb3IgdmlkZW8gKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTlZBTElEX1ZJREVPX0VGRkVDVF9UWVBFICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMDMpCi0vKioKLSAqIEludmFsaWQgZWZmZWN0IHR5cGUgZm9yIGF1ZGlvICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9BVURJT19FRkZFQ1RfVFlQRSAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDA0KQotLyoqCi0gKiBJbnZhbGlkIHRyYW5zaXRpb24gdHlwZSBmb3IgdmlkZW8gKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTlZBTElEX1ZJREVPX1RSQU5TSVRJT05fVFlQRSAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMDUpCi0vKioKLSAqIEludmFsaWQgdHJhbnNpdGlvbiB0eXBlIGZvciBhdWRpbyAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQVVESU9fVFJBTlNJVElPTl9UWVBFICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAwNikKLS8qKgotICogSW52YWxpZCB2aWRlbyBlbmNvZGluZyBmcmFtZSByYXRlICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19FTkNPRElOR19GUkFNRV9SQVRFICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMDcpCi0gLyoqCi0gKiBFeHRlcm5hbCBlZmZlY3QgZnVuY3Rpb24gaXMgdXNlZCB3aXRob3V0IGJlaW5nIHNldCAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0VYVEVSTkFMX0VGRkVDVF9OVUxMICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAwOCkKLS8qKgotICogRXh0ZXJuYWwgdHJhbnNpdGlvbiBmdW5jdGlvbiBpcyB1c2VkIHdpdGhvdXQgYmVpbmcgc2V0ICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfRVhURVJOQUxfVFJBTlNJVElPTl9OVUxMICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDA5KQotCi0vKioKLSAqIEJlZ2luIGN1dCB0aW1lIGlzIGxhcmdlciB0aGFuIHRoZSBjbGlwIGR1cmF0aW9uICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0RVUkFUSU9OICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDEwKQotLyoqCi0gKiBCZWdpbiBjdXQgdGltZSBpcyBsYXJnZXIgb3IgZXF1YWwgdGhhbiBlbmQgY3V0ICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0VORF9DVVQgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDExKQotLyoqCi0gKiBUd28gY29uc2VjdXRpdmUgdHJhbnNpdGlvbnMgYXJlIG92ZXJsYXBwaW5nIG9uIG9uZSBjbGlwICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfT1ZFUkxBUFBJTkdfVFJBTlNJVElPTlMgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDEyKQotCi0vKioKLSAqIEFuIGlucHV0IDNHUFAgZmlsZSBpcyBpbnZhbGlkL2NvcnJ1cHRlZCAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0lOVkFMSURfM0dQUF9GSUxFICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAxNikKLS8qKgotICogQSBmaWxlIGNvbnRhaW5zIGFuIHVuc3VwcG9ydGVkIHZpZGVvIGZvcm1hdCAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX1ZJREVPX0ZPUk1BVCAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAxNykKLS8qKgotICogQSBmaWxlIGNvbnRhaW5zIGFuIHVuc3VwcG9ydGVkIGF1ZGlvIGZvcm1hdCAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX0FVRElPX0ZPUk1BVCAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAxOCkKLQotLyoqCi0gKiBBIGZpbGUgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIFZTUyAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0FNUl9FRElUSU5HX1VOU1VQUE9SVEVEICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAxOSkKLSAvKioKLSAqICAgIEFuIGlucHV0IGNsaXAgaGFzIGFuIHVuZXhwZWN0ZWRseSBsYXJnZSBWaWRlbyBBVSAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0lOUFVUX1ZJREVPX0FVX1RPT19MQVJHRSAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAxQSkKLS8qKgotICogICAgQW4gaW5wdXQgY2xpcCBoYXMgYW4gdW5leHBlY3RlZGx5IGxhcmdlIEF1ZGlvIEFVICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSU5QVVRfQVVESU9fQVVfVE9PX0xBUkdFICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDFCKQotLyoqCi0gKiAgICBBbiBpbnB1dCBjbGlwIGhhcyBhIGNvcnJ1cHRlZCBBdWRpbyBBTVIgQVUgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTlBVVF9BVURJT19DT1JSVVBURURfQVUgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAxQykKLS8qKgotICogVGhlIHZpZGVvIGVuY29kZXIgZW5jb3VudGVyZWQgYW4gQWNjZXMgVW5pdCBlcnJvcjogdmVyeSBwcm9iYWJseSBhIGZpbGUgd3JpdGUgZXJyb3IgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9FTkNPREVSX0FDQ0VTX1VOSVRfRVJST1IgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAxRCkKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogRXJyb3JzIHJldHVybmVkIGJ5IE00VlNTM0dQUF9lZGl0QW5hbHlzZUNsaXAoKSAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogVW5zdXBwb3J0ZWQgdmlkZW8gZm9ybWF0IGZvciBWaWRlbyBFZGl0aW5nICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9WSURFT19GT1JNQVQgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAyMCkKLS8qKgotICogVW5zdXBwb3J0ZWQgSDI2MyBwcm9maWxlIGZvciBWaWRlbyBFZGl0aW5nICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9IMjYzX1BST0ZJTEUgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAyMSkKLS8qKgotICogVW5zdXBwb3J0ZWQgTVBFRy00IHByb2ZpbGUgZm9yIFZpZGVvIEVkaXRpbmcgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX01QRUc0X1BST0ZJTEUgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAyMikKLS8qKgotICogVW5zdXBwb3J0ZWQgTVBFRy00IFJWTEMgdG9vbCBmb3IgVmlkZW8gRWRpdGluZyAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfTVBFRzRfUlZMQyAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMjMpCi0vKioKLSAqIFVuc3VwcG9ydGVkIGF1ZGlvIGZvcm1hdCBmb3IgVmlkZW8gRWRpdGluZyAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfQVVESU9fRk9STUFUIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMjQpCi0gLyoqCi0gKiBGaWxlIGNvbnRhaW5zIG5vIHN1cHBvcnRlZCBzdHJlYW0gKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9FRElUSU5HX05PX1NVUFBPUlRFRF9TVFJFQU1fSU5fRklMRSAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUCwgMHgwMDI1KQotLyoqCi0gKiBGaWxlIGNvbnRhaW5zIG5vIHZpZGVvIHN0cmVhbSBvciBhbiB1bnN1cHBvcnRlZCB2aWRlbyBzdHJlYW0gKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9FRElUSU5HX05PX1NVUFBPUlRFRF9WSURFT19TVFJFQU1fSU5fRklMRSAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFAsIDB4MDAyNikKLS8qKgotICogVW5zdXBwb3J0ZWQgdmlkZW8gcHJvZmlsZSBmb3IgVmlkZW8gRWRpdGluZyAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfVklERU9fUFJPRklMRSBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDI3KQotCi0vKioKLSAqIFVuc3VwcG9ydGVkIHZpZGVvIHByb2ZpbGUgZm9yIFZpZGVvIEVkaXRpbmcgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX1ZJREVPX0xFVkVMIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMjgpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBFcnJvcnMgcmV0dXJuZWQgYnkgTTRWU1MzR1BQX2VkaXRDaGVja0NsaXBDb21wYXRpYmlsaXR5KCkgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBBdCBsZWFzdCBvbmUgb2YgdGhlIGNsaXAgYW5hbHlzaXMgaGFzIGJlZW4gZ2VuZXJhdGVkIGJ5IGFub3RoZXIgdmVyc2lvbiBvZiB0aGUgVlNTIDNHUFAgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0NMSVBfQU5BTFlTSVNfVkVSU0lPTiAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMzApCi0vKioKLSAqIENsaXBzIGRvbid0IGhhdmUgdGhlIHNhbWUgdmlkZW8gZm9ybWF0IChIMjYzIG9yIE1QRUc0KSAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19GT1JNQVQgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAzMSkKLS8qKgotICogICAgQ2xpcHMgZG9uJ3QgaGF2ZSB0aGUgc2FtZSBmcmFtZSBzaXplICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX0ZSQU1FX1NJWkUgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDMyKQotLyoqCi0gKiAgICBDbGlwcyBkb24ndCBoYXZlIHRoZSBzYW1lIE1QRUctNCB0aW1lIHNjYWxlICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX1RJTUVfU0NBTEUgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDMzKQotLyoqCi0gKiAgICBDbGlwcyBkb24ndCBoYXZlIHRoZSBzYW1lIHVzZSBvZiBNUEVHLTQgZGF0YSBwYXJ0aXRpb25pbmcgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fREFUQV9QQVJUSVRJT05JTkcgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUCwgMHgwMDM0KQotLyoqCi0gKiAgICBNUDMgY2xpcHMgY2FuJ3QgYmUgYXNzZW1ibGVkICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfTVAzX0FTU0VNQkxZICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDM1KQotLyoqCi0gKiAgQ2xpcHMgZG9uJ3QgaGF2ZSB0aGUgc2FtZSBhdWRpbyBzdHJlYW0gdHlwZSAoZXg6IEFNUiAhPSBBQUMpICovCi0jZGVmaW5lIE00VlNTM0dQUF9XQVJfSU5DT01QQVRJQkxFX0FVRElPX1NUUkVBTV9UWVBFICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9XQVIsIE00VlNTM0dQUCwgMHgwMDM2KQotLyoqCi0gKiAgQ2xpcHMgZG9uJ3QgaGF2ZSB0aGUgc2FtZSBhdWRpbyBudW1iZXIgb2YgY2hhbm5lbHMgKGV4OiBzdGVyZW8gIT0gbW9ubykgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX1dBUl9JTkNPTVBBVElCTEVfQVVESU9fTkJfT0ZfQ0hBTk5FTFMgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X1dBUixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQLCAweDAwMzcpCi0vKioKLSAqICBDbGlwcyBkb24ndCBoYXZlIHRoZSBzYW1lIHNhbXBsaW5nIGZyZXF1ZW5jeSAoZXg6IDQ0MTAwSHogIT0gMTYwMDBIeikgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX1dBUl9JTkNPTVBBVElCTEVfQVVESU9fU0FNUExJTkdfRlJFUVVFTkNZICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X1dBUixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFAsIDB4MDAzOCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEF1ZGlvIG1peGluZyBlcnJvciBjb2RlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogVGhlIGlucHV0IDNHUFAgZmlsZSBkb2VzIG5vdCBjb250YWluIGFueSBzdXBwb3J0ZWQgYXVkaW8gb3IgdmlkZW8gdHJhY2sgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9OT19TVVBQT1JURURfU1RSRUFNX0lOX0ZJTEUgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwNTApCi0vKioKLSAqIFRoZSBWb2x1bWUgb2YgdGhlIGFkZGVkIGF1ZGlvIHRyYWNrIChBZGRWb2x1bWUpIG11c3QgYmUgc3RyaWN0bHkgc3VwZXJpb3IgdGhhbiB6ZXJvICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfQUREVk9MVU1FX0VRVUFMU19aRVJPICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDUxKQotLyoqCi0gKiBUaGUgdGltZSBhdCB3aGljaCB0aGUgYXVkaW8gdHJhY2sgaXMgYWRkZWQgKEFkZEN0cykgY2FuJ3QgYmUgc3VwZXJpb3IgdGhhbiB0aGUKLSAgIGlucHV0IHZpZGVvIHRyYWNrIGR1cmF0aW9uICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfQUREQ1RTX0hJR0hFUl9USEFOX1ZJREVPX0RVUkFUSU9OICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUCwgMHgwMDUyKQotLyoqCi0gKiBUaGUgYXVkaW8gdHJhY2sgZmlsZSBmb3JtYXQgc2V0dGluZyBpcyB1bmRlZmluZWQgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9VTkRFRklORURfQVVESU9fVFJBQ0tfRklMRV9GT1JNQVQgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQLCAweDAwNTMpCi0vKioKLSAqIFRoZSBhZGRlZCBhdWRpbyB0cmFjayBzdHJlYW0gaGFzIGFuIHVuc3VwcG9ydGVkIGZvcm1hdCAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0FEREVEX0FVRElPX1NUUkVBTSAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwNTQpCi0vKioKLSAqIFRoZSBhdWRpbyBtaXhpbmcgZmVhdHVyZSBkb2Vzbid0IHN1cHBvcnQgRVZSQywgTVAzIGF1ZGlvIHRyYWNrcyAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0FVRElPX01JWElOR19VTlNVUFBPUlRFRCAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwNTUpCi0vKioKLSAqIEFuIGFkZGVkIGF1ZGlvIHRyYWNrIGxpbWl0IHRoZSBhdmFpbGFibGUgZmVhdHVyZXM6IHVpQWRkQ3RzIG11c3QgYmUgMAotICAgYW5kIGJSZW1vdmVPcmlnaW5hbCBtdXN0IGJlIE00T1NBX1RSVUUgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9GRUFUVVJFX1VOU1VQUE9SVEVEX1dJVEhfQVVESU9fVFJBQ0sgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFAsIDB4MDA1NikKLS8qKgotICogSW5wdXQgYXVkaW8gdHJhY2sgaXMgbm90IEFNUi1OQiBub3IgQUFDIHNvIGl0IGNhbid0IGJlIG1peGVkIHdpdGggb3V0cHV0ICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfQVVESU9fQ0FOTk9UX0JFX01JWEVEICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQLCAweDAwNTcpCi0vKioKLSAqIElucHV0IGNsaXAgbXVzdCBiZSBhIDNncHAgZmlsZSAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0lOUFVUX0NMSVBfSVNfTk9UX0FfM0dQUCAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUCwgMHgwMDU4KQotLyoqCi0gKiBCZWdpbiBsb29wIHRpbWUgaXMgaGlnaGVyIHRoYW4gZW5kIGxvb3AgdGltZSBvciBoaWdoZXIgdGhhbiBhZGRlZCBjbGlwIGR1cmF0aW9uICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfQkVHSU5MT09QX0hJR0hFUl9FTkRMT09QICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQLCAweDAwNTkpCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEF1ZGlvIG1peGluZyBhbmQgZXh0cmFjdCBwaWN0dXJlIGVycm9yIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIEgyNjMgUHJvZmlsZSAzIGxldmVsIDEwIGlzIG5vdCBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9IMjYzX1BST0ZJTEVfTk9UX1NVUFBPUlRFRCAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQLCAweDAwNjApCi0vKioKLSAqIEZpbGUgY29udGFpbnMgbm8gdmlkZW8gc3RyZWFtIG9yIGFuIHVuc3VwcG9ydGVkIHZpZGVvIHN0cmVhbSAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX05PX1NVUFBPUlRFRF9WSURFT19TVFJFQU1fSU5fRklMRSAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFAsIDB4MDA2MSkKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogSW50ZXJuYWwgZXJyb3IgYW5kIHdhcm5pbmcgY29kZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogSW50ZXJuYWwgc3RhdGUgZXJyb3IgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTlRFUk5BTF9TVEFURSAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDEwMCkKLS8qKgotICogTHVtaW5hbmNlIGZpbHRlciBlZmZlY3QgZXJyb3IgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9MVU1BX0ZJTFRFUl9FUlJPUiAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDEwNCkKLS8qKgotICogVHJhbnNpdGlvbiBmaWx0ZXIgZWZmZWN0IGVycm9yICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfVFJBTlNJVElPTl9GSUxURVJfRVJST1IgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAxMDYpCi0vKioKLSAqIFRoZSBhdWRpbyBkZWNvZGVyIGluaXRpYWxpemF0aW9uIGZhaWxlZCAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0FVRElPX0RFQ09ERVJfSU5JVF9GQUlMRUQgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMTEwKQotLyoqCi0gKiBUaGUgZGVjb2RlciBwcm9kdWNlZCBhbiB1bmF0dGVuZGVkIGFtb3VudCBvZiBQQ00gKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9BVURJT19ERUNPREVEX1BDTV9TSVpFX0lTU1VFICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDExNSkKLS8qKgotICogT3V0cHV0IGZpbGUgbXVzdCBiZSAzR1BQIG9yIE1QMyAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX09VVFBVVF9GSUxFX1RZUEVfRVJST1IgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMTE3KQotLyoqCi0gKiBDYW4gbm90IGZpbmQgYSB2YWxpZCB2aWRlbyBmcmFtZSAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX05PX1ZBTElEX1ZJRF9GUkFNRSAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAxMTgpCi0KLSNlbmRpZiAvKiBfX000VlNTM0dQUF9FcnJvckNvZGVzX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9FeHRlbmRlZF9BUEkuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRWU1MzR1BQX0V4dGVuZGVkX0FQSS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NjY4YjY3Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRWU1MzR1BQX0V4dGVuZGVkX0FQSS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9fTTRWU1MzR1BQX0VYVEVOREVEX0FQSV9IX18KLSNkZWZpbmUgX19NNFZTUzNHUFBfRVhURU5ERURfQVBJX0hfXwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00VlNTM0dQUF9FeHRlbmRlZF9BUEkuaAotICogQGJyaWVmICAgIEFQSSBvZiB4VlNTCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBNNFZTU19TVVBQT1JUX0VYVEVOREVEX0ZFQVRVUkVTCi0jZXJyb3IgIioqKiB0aGUgZmxhZyBNNFZTU19TVVBQT1JUX0VYVEVOREVEX0ZFQVRVUkVTIHNob3VsZCBiZSBhY3RpdmF0ZWQgaW4gQ29tcGlsZXJTd2l0Y2hlc1wKLSAgICAgICAgICAgICBmb3IgVmlkZW9TdHVkaW8gKioqIgotI2VuZGlmCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19nZXRUZXh0UmdiQnVmZmVyRmN0Ci0gKiBAYnJpZWYgICAgICAgIEV4dGVybmFsIHRleHQgdG8gUkdCIGJ1ZmZlciBmdW5jdGlvbnMgaW1wbGVtZW50ZWQgYnkgdGhlIGludGVncmF0b3IKLSAqICAgICAgICAgICAgICAgIG11c3QgbWF0Y2ggdGhpcyBwcm90b3R5cGUuCi0gKiBAbm90ZSAgICAgICAgVGhlIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIHdpdGggdGhlIHJlbmRlcmluZ0RhdGEsIHRoZSB0ZXh0IGJ1ZmZlciBhbmQKLSAqICAgICAgICAgICAgICAgIGl0cyBzaXplLiBJdCBtdXN0IGJ1aWxkIHRoZSBvdXRwdXQgUkdCIGltYWdlIHBsYW5lIGNvbnRhaW5pbmcgdGhlIHRleHQuCi0gKgotICogQHBhcmFtICAgcFJlbmRlcmluZ0RhdGEgICAgKElOKSBUaGUgZGF0YSBnaXZlbiBieSB0aGUgdXNlciBpbiBNNHhWU1NfRWZmZWN0U2V0dGluZ3MKLSAqIEBwYXJhbSAgICBwVGV4dEJ1ZmZlciAgICAgICAgKElOKSBUZXh0IGJ1ZmZlciBnaXZlbiBieSB0aGUgdXNlciBpbiBNNHhWU1NfRWZmZWN0U2V0dGluZ3MKLSAqIEBwYXJhbSAgICB0ZXh0QnVmZmVyU2l6ZSAgICAoSU4pIFRleHQgYnVmZmVyIHNpemUgZ2l2ZW4gYnkgdGhlIHVzZXIgaW4gTTR4VlNTX0VmZmVjdFNldHRpbmdzCi0gKiBAcGFyYW0gICAgcE91dHB1dFBsYW5lICAgIChJTi9PVVQpIE91dHB1dCBSR0I1NjUgaW1hZ2UKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAoKk00eFZTU19nZXRUZXh0UmdiQnVmZmVyRmN0KQotKAotICAgIE00T1NBX1ZvaWQgKnBSZW5kZXJpbmdEYXRhLAotICAgIE00T1NBX1ZvaWQgKnBUZXh0QnVmZmVyLAotICAgIE00T1NBX1VJbnQzMiB0ZXh0QnVmZmVyU2l6ZSwKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqKnBPdXRwdXRQbGFuZQotKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTR4VlNTX0JHTVNldHRpbmdzCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZ2F0aGVycyBhbGwgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBhZGQgQmFja2dyb3VuZCBtdXNpYyB0byAzZ3AgZmlsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVm9pZCAgICAgICAgICAgICAgICAgICpwRmlsZTsgICAgICAgICAvKio8IElucHV0IGZpbGUgcGF0aCAqLwotICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlICAgICBGaWxlVHlwZTsgICAgICAgLyoqPCAuM2dwLCAuYW1yLCAubXAzICAgICAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aUFkZEN0czsgICAgICAgLyoqPCBUaW1lLCBpbiBtaWxsaXNlY29uZHMsIGF0IHdoaWNoIHRoZSBhZGRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gdHJhY2sgaXMgaW5zZXJ0ZWQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlBZGRWb2x1bWU7ICAgICAvKio8IFZvbHVtZSwgaW4gcGVyY2VudGFnZSwgb2YgdGhlIGFkZGVkIGF1ZGlvIHRyYWNrICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpQmVnaW5Mb29wOyAgICAvKio8IERlc2NyaWJlcyBpbiBtaWxsaS1zZWNvbmQgdGhlIHN0YXJ0IHRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGxvb3AgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlFbmRMb29wOyAgICAgIC8qKjwgRGVzY3JpYmVzIGluIG1pbGxpLXNlY29uZCB0aGUgZW5kIHRpbWUgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AgKDAgbWVhbnMgbm8gbG9vcCkgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgYl9EdWNraW5nTmVlZGVlZDsKLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgSW5EdWNraW5nX3RocmVzaG9sZDsgIC8qKjwgVGhyZXNob2xkIHZhbHVlIGF0IHdoaWNoIGJhY2tncm91bmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c2ljIHNoYWxsIGR1Y2sgKi8KLSAgICBNNE9TQV9GbG9hdCAgICAgICAgICAgICAgICAgbG93Vm9sdW1lOyAgICAgICAvKio8IGxvd2VyIHRoZSBiYWNrZ3JvdW5kIHRyYWNrIHRvIHRoaXMgZmFjdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGluY3JlYXNlIHRoZSBwcmltYXJ5IHRyYWNrIHRvIGludmVyc2Ugb2YgdGhpcyBmYWN0b3IgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgYkxvb3A7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpU2FtcGxpbmdGcmVxdWVuY3k7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpTnVtQ2hhbm5lbHM7Ci19IE00eFZTU19CR01TZXR0aW5nczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00VlNTM0dQUF9WaWRlb0VmZmVjdFR5cGUKLSAqIEBicmllZiAgIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgdmlkZW8gZWZmZWN0IHR5cGVzIG9mIHRoZSBWU1MzR1BQCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRWU1MzR1BQX2tSR0I4ODggICAgICAgICAgID0gMCwgIC8qKjwgUkdCODg4IGRhdGEgdHlwZSAqLwotICAgIE00VlNTM0dQUF9rUkdCNTY1ICAgICAgICAgICA9IDEgIC8qKjwgUkdCNTY1IGRhdGEgdHlwZSAqLwotCi19IE00VlNTM0dQUF9SR0JUeXBlOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgIE00eFZTU19FZmZlY3RTZXR0aW5ncwotICogQGJyaWVmICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhbiBhdWRpby92aWRlbyBlZmZlY3QgZm9yIHRoZSBlZGl0aW9uLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyoqPCBJbiBwZXJjZW50IG9mIHRoZSBjdXQgY2xpcCBkdXJhdGlvbiAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgIHVpU3RhcnRQZXJjZW50OwotICAgIC8qKjwgSW4gcGVyY2VudCBvZiB0aGUgKChjbGlwIGR1cmF0aW9uKSAtIChlZmZlY3Qgc3RhcnR0aW1lKSkgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICB1aUR1cmF0aW9uUGVyY2VudDsKLSAgICAvKio8IEZyYW1pbmcgZmlsZSBwYXRoIChHSUYvUE5HIGZpbGUpLCB1c2VkIG9ubHkgaWYgVmlkZW9FZmZlY3RUeXBlID09IGZyYW1pbmcgKi8KLSAgICBNNE9TQV9Wb2lkICAgICAgICAgICAgICAgICAqcEZyYW1pbmdGaWxlUGF0aDsKLSAgICAvKio8IEZyYW1pbmcgUkdCNTY1IGJ1ZmZlciwgIHVzZWQgb25seSBpZiBWaWRlb0VmZmVjdFR5cGUgPT0gZnJhbWluZyAqLwotICAgIE00VklGSV9JbWFnZVBsYW5lICAgICAgICAgICpwRnJhbWluZ0J1ZmZlcjsKLSAgICAvKio8UkdCIEJ1ZmZlciB0eXBlLHVzZWQgb25seSBpZiBWaWRlb0VmZmVjdFR5cGUgPT0gZnJhbWluZyAqLwotICAgIE00VlNTM0dQUF9SR0JUeXBlICAgICAgICAgIHJnYlR5cGU7Ci0gICAgLyoqPCBUaGUgdG9wLWxlZnQgWCBjb29yZGluYXRlIGluIHRoZSBvdXRwdXQgcGljdHVyZSB3aGVyZSB0aGUgYWRkZWQgZnJhbWUgd2lsbCBiZSBkaXNwbGF5ZWQuCi0gICAgIFVzZWQgb25seSBpZiBWaWRlb0VmZmVjdFR5cGUgPT0gZnJhbWluZyB8fCBWaWRlb0VmZmVjdFR5cGUgPT0gdGV4dCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgIHRvcGxlZnRfeDsKLSAgICAvKio8IFRoZSB0b3AtbGVmdCBZIGNvb3JkaW5hdGUgaW4gdGhlIG91dHB1dCBwaWN0dXJlIHdoZXJlIHRoZSBhZGRlZCBmcmFtZSB3aWxsIGJlIGRpc3BsYXllZC4KLSAgICAgVXNlZCBvbmx5IGlmIFZpZGVvRWZmZWN0VHlwZSA9PSBmcmFtaW5nIHx8IFZpZGVvRWZmZWN0VHlwZSA9PSB0ZXh0ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgdG9wbGVmdF95OwotICAgIC8qKjwgRG9lcyBmcmFtaW5nIGltYWdlIGlzIHJlc2l6ZWQgdG8gb3V0cHV0IHZpZGVvIHNpemUuCi0gICAgIFVzZWQgb25seSBpZiBWaWRlb0VmZmVjdFR5cGUgPT0gZnJhbWluZyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgIGJSZXNpemU7Ci0gICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZVNpemUgZnJhbWluZ1NjYWxlZFNpemU7Ci0vKio8IFNpemUgdG8gd2hpY2ggdGhlIHRoZSBmcmFtaW5nIGZpbGUgbmVlZHMgdG8gYmUgcmVzaXplZCAqLwotICAgIC8qKjwgVGV4dCBidWZmZXIuIFVzZWQgb25seSBpZiBWaWRlb0VmZmVjdFR5cGUgPT0gdGV4dCAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgIHBUZXh0QnVmZmVyOwotICAgIC8qKjwgVGV4dCBidWZmZXIgc2l6ZS4gVXNlZCBvbmx5IGlmIFZpZGVvRWZmZWN0VHlwZSA9PSB0ZXh0ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgdGV4dEJ1ZmZlclNpemU7Ci0gICAgLyoqPCBQb2ludGVyIGNvbnRhaW5pbmcgc3BlY2lmaWMgZGF0YSB1c2VkIGJ5IHRoZSBmb250IGVuZ2luZSAoc2l6ZSwgY29sb3IuLi4pICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgcFJlbmRlcmluZ0RhdGE7Ci0gICAgLyoqPCBUZXh0IHBsYW5lIHdpZHRoLiBVc2VkIG9ubHkgaWYgVmlkZW9FZmZlY3RUeXBlID09IHRleHQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICB1aVRleHRCdWZmZXJXaWR0aDsKLSAgICAvKio8IFRleHQgcGxhbmUgaGVpZ2h0LiBVc2VkIG9ubHkgaWYgVmlkZW9FZmZlY3RUeXBlID09IHRleHQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICB1aVRleHRCdWZmZXJIZWlnaHQ7Ci0gICAgLyoqPCBQcm9jZXNzaW5nIHJhdGUgb2YgdGhlIGVmZmVjdCBhZGRlZCB3aGVuIHVzaW5nIHRoZSBGaWZ0aWVzIGVmZmVjdCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgIHVpRmlmdGllc091dEZyYW1lUmF0ZTsKLSAgICAvKio8IFJHQjE2IGlucHV0IGNvbG9yIG9mIHRoZSBlZmZlY3QgYWRkZWQgd2hlbiB1c2luZyB0aGUgcmdiMTYgY29sb3IgZWZmZWN0ICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICAgICAgICAgdWlSZ2IxNklucHV0Q29sb3I7Ci0KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICB1aWFscGhhQmxlbmRpbmdTdGFydDsgICAgICAgLypTdGFydCBwZXJjZW50YWdlIG9mIEFscGhhIGJsZW5kaW5nKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICB1aWFscGhhQmxlbmRpbmdNaWRkbGU7ICAgICAgLypNaWRkbGUgcGVyY2VudGFnZSBvZiBBbHBoYSBibGVuZGluZyovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgdWlhbHBoYUJsZW5kaW5nRW5kOyAgICAgICAgIC8qRW5kIHBlcmNlbnRhZ2Ugb2YgQWxwaGEgYmxlbmRpbmcqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgIHVpYWxwaGFCbGVuZGluZ0ZhZGVJblRpbWU7ICAvKkR1cmF0aW9uLCBpbiBwZXJjZW50YWdlIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3QgZHVyYXRpb24sIG9mIHRoZSBGYWRlSW4gcGhhc2UqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgIHVpYWxwaGFCbGVuZGluZ0ZhZGVPdXRUaW1lOyAgIC8qRHVyYXRpb24sIGluIHBlcmNlbnRhZ2Ugb2YgZWZmZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24sIG9mIHRoZSBGYWRlT3V0IHBoYXNlKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgd2lkdGg7ICAgLyp3aWR0aCBvZiB0aGUgQVJHQjg4ODggY2xpcCAuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZWQgb25seSBpZiB2aWRlbyBlZmZlY3QgaXMgZnJhbW1pbmcgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgaGVpZ2h0OyAvKmhlaWdodCBvZiB0aGUgQVJHQjg4ODggY2xpcCAuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZWQgb25seSBpZiB2aWRlbyBlZmZlY3QgaXMgZnJhbW1pbmcgKi8KLX0gTTR4VlNTX0VmZmVjdFNldHRpbmdzOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNHhWU1NfQWxwaGFNYWdpY1NldHRpbmdzCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgYWxwaGEgbWFnaWMgdHJhbnNpdGlvbiBzZXR0aW5ncwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICBwQWxwaGFGaWxlUGF0aDsgICAgICAgIC8qKjwgQWxwaGEgZmlsZSBwYXRoIChKUEcgZmlsZSkgICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICBibGVuZGluZ1BlcmNlbnQ7ICAgIC8qKjwgQmxlbmRpbmcgUGVyY2VudGFnZSBiZXR3ZWVuIDAgYW5kIDEwMCAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgaXNyZXZlcnNlOyAgICAgICAgICAgIC8qKjwgZGlyZWN0IGVmZmVjdCBvciByZXZlcnNlICovCi0gICAgLypUbyBzdXBwb3J0IEFSR0I4ODg4IDogZ2V0IHRoZSB3aWR0aCBhbmQgaGVpZ2h0ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgd2lkdGg7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgaGVpZ2h0OwotfSBNNHhWU1NfQWxwaGFNYWdpY1NldHRpbmdzOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00eFZTU19TbGlkZVRyYW5zaXRpb25fRGlyZWN0aW9uCi0gKiBAYnJpZWYgICAgRGVmaW5lcyBkaXJlY3Rpb25zIGZvciB0aGUgc2xpZGUgdHJhbnNpdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBNNHhWU1NfU2xpZGVUcmFuc2l0aW9uX1JpZ2h0T3V0TGVmdEluLAotICAgIE00eFZTU19TbGlkZVRyYW5zaXRpb25fTGVmdE91dFJpZ2h0SW4sCi0gICAgTTR4VlNTX1NsaWRlVHJhbnNpdGlvbl9Ub3BPdXRCb3R0b21JbiwKLSAgICBNNHhWU1NfU2xpZGVUcmFuc2l0aW9uX0JvdHRvbU91dFRvcEluCi19IE00eFZTU19TbGlkZVRyYW5zaXRpb25fRGlyZWN0aW9uOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNHhWU1NfQWxwaGFNYWdpY1NldHRpbmdzCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgc2xpZGUgdHJhbnNpdGlvbiBzZXR0aW5ncwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNHhWU1NfU2xpZGVUcmFuc2l0aW9uX0RpcmVjdGlvbiBkaXJlY3Rpb247IC8qIGRpcmVjdGlvbiBvZiB0aGUgc2xpZGUgKi8KLX0gTTR4VlNTX1NsaWRlVHJhbnNpdGlvblNldHRpbmdzOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgIE00eFZTU19UcmFuc2l0aW9uU2V0dGluZ3MKLSAqIEBicmllZiAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYWRkaXRpb25hbCB0cmFuc2l0aW9uIHNldHRpbmdzIHNwZWNpZmljIHRvCi0gKiAgICAgICAgICAgIHhWU1MsIHdoaWNoIGFyZSBhcHBlbmRlZCB0byB0aGUgVlNTM0dQUCB0cmFuc2l0aW9uIHNldHRpbmdzCi0gKiAgICAgICAgICAgIHN0cnVjdHVyZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qIEFueXRoaW5nIHhWU1Mtc3BlY2lmaWMsIGJ1dCBjb21tb24gdG8gYWxsIHRyYW5zaXRpb25zLCB3b3VsZCBnbyBoZXJlLAotICAgIGJlZm9yZSB0aGUgdW5pb24uICovCi0gICAgdW5pb24gewotICAgICAgICAvKio8IEFscGhhTWFnaWMgc2V0dGluZ3MsIHVzZWQgb25seSBpZiBWaWRlb1RyYW5zaXRpb25UeXBlID09Ci0gICAgICAgICAgICBNNHhWU1Nfa1ZpZGVvVHJhbnNpdGlvblR5cGVfQWxwaGFNYWdpYyAqLwotICAgICAgICBNNHhWU1NfQWxwaGFNYWdpY1NldHRpbmdzICAgICAgICAqcEFscGhhTWFnaWNTZXR0aW5nczsKLSAgICAgICAgLyogb25seSBpbiBjYXNlIG9mIHNsaWRlIHRyYW5zaXRpb24uICovCi0gICAgICAgIE00eFZTU19TbGlkZVRyYW5zaXRpb25TZXR0aW5ncyAgICAqcFNsaWRlVHJhbnNpdGlvblNldHRpbmdzOwotICAgIH0gdHJhbnNpdGlvblNwZWNpZmljOwotfSBNNHhWU1NfVHJhbnNpdGlvblNldHRpbmdzOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTR4VlNTX01lZGlhUmVuZGVyaW5nCi0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgZGlmZmVyZW50IG1lZGlhIHJlbmRlcmluZyB1c2luZyBleGlmIG9yaWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTR4VlNTX2tSZXNpemluZyA9IDAsICAgICAgICAvKlRoZSBwaWN0dXJlIGlzIHJlc2l6ZWQsIHRoZSBhc3BlY3QgcmF0aW8gY2FuIGJlIGRpZmZlcmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgb3JpZ2luYWwgb25lLiBBbGwgb2YgdGhlIHBpY3R1cmUgaXMgcmVuZGVyZWQqLwotICAgIE00eFZTU19rQ3JvcHBpbmcsICAgICAgICAgICAgLypUaGUgcGljdHVyZSBpcyBjcm9wcGVkLCB0aGUgYXNwZWN0IHJhdGlvIGlzIHRoZSBzYW1lIGFzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgb3JpZ2luYWwgb25lLiBUaGUgcGljdHVyZSBpcyBub3QgcmVuZGVyZWQgZW50aXJlbHkqLwotICAgIE00eFZTU19rQmxhY2tCb3JkZXJzICAgICAgICAvKkJsYWNrIGJvcmRlcnMgYXJlIHJlbmRlcmVkIGluIG9yZGVyIHRvIGtlZXAgdGhlIG9yaWdpbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3BlY3QgcmF0aW8uIEFsbCB0aGUgcGljdHVyZSBpcyByZW5kZXJlZCovCi0KLX0gTTR4VlNTX01lZGlhUmVuZGVyaW5nOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgTTR4VlNTX0NsaXBTZXR0aW5ncwotICogQGJyaWVmICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhbiBpbnB1dCBjbGlwIGZvciB0aGUgZWRpdGlvbi4KLSAqIEBub3RlICAgIEl0IGFsc28gY29udGFpbnMgdGhlIHNldHRpbmdzIGZvciB0aGUgY3V0IGFuZCBiZWdpbi9lbmQgZWZmZWN0cyBhcHBsaWVkIHRvIHRoZSBjbGlwLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICB1aUJlZ2luQ3V0UGVyY2VudDsgICAgLyoqPCBCZWdpbiBjdXQgdGltZSwgaW4gcGVyY2VudCBvZiBjbGlwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24gKG9ubHkgZm9yIDNHUFAgY2xpcCAhKSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgdWlFbmRDdXRQZXJjZW50OyAgICAvKio8IEVuZCBjdXQgdGltZSwgaW4gcGVyY2VudCBvZiBjbGlwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24gKG9ubHkgZm9yIDNHUFAgY2xpcCAhKSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgdWlEdXJhdGlvbjsgICAgICAgICAgICAvKio8IER1cmF0aW9uIG9mIHRoZSBjbGlwLCBpZiBkaWZmZXJlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIDAsIGhhcyBwcmlvcml0eSBvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpRW5kQ3V0VGltZSBvciB1aUVuZEN1dFBlcmNlbnQgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgaXNQYW5ab29tOyAgICAgICAgICAgIC8qKjwgUkM6IEJvb2xlYW4gdXNlZCB0byBrbm93IGlmIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW4gYW5kIHpvb20gbW9kZSBpcyBlbmFibGVkICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICAgICAgICAgICAgICBQYW5ab29tWGE7ICAgICAgICAgICAgLyoqPCBSQyAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgICAgICAgICAgICAgUGFuWm9vbVRvcGxlZnRYYTsgICAgLyoqPCBSQyAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgICAgICAgICAgICAgUGFuWm9vbVRvcGxlZnRZYTsgICAgLyoqPCBSQyAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgICAgICAgICAgICAgUGFuWm9vbVhiOyAgICAgICAgICAgIC8qKjwgUkMgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WGI7ICAgIC8qKjwgUkMgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WWI7ICAgIC8qKjwgUkMgKi8KLSAgICBNNHhWU1NfTWVkaWFSZW5kZXJpbmcgICAgICAgICAgICBNZWRpYVJlbmRlcmluZzsgICAgICAgIC8qKjwgRkIgb25seSB1c2VkIHdpdGggSlBFRzogdG8gY3JvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzaXplLCBvciByZW5kZXIgYmxhY2sgYm9yZGVycyovCi0KLX0gTTR4VlNTX0NsaXBTZXR0aW5nczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICBNNHhWU1NfRWRpdFNldHRpbmdzCi0gKiBAYnJpZWYgICBUaGlzIHN0cnVjdHVyZSBnYXRoZXJzIGFsbCB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGRlZmluZSBhIGNvbXBsZXRlCi0gKiAgICAgICAgICBlZGl0aW9uIG9wZXJhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyoqPCBPdXRwdXQgdmlkZW8gc2l6ZSAqLwotICAgIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVTaXplICAgICAgICAgICAgIG91dHB1dFZpZGVvU2l6ZTsKLSAgICAvKio8IE91dHB1dCB2aWRlbyBmb3JtYXQgKE1QRUc0IC8gSDI2MykgKi8KLSAgICBNNFZJREVPRURJVElOR19WaWRlb0Zvcm1hdCAgICAgICAgICAgICAgICBvdXRwdXRWaWRlb0Zvcm1hdDsKLSAgICAvKio8IE91dHB1dCBhdWRpbyBmb3JtYXQgKEFBQywgQU1STkIgLi4uKSAqLwotICAgIE00VklERU9FRElUSU5HX0F1ZGlvRm9ybWF0ICAgICAgICAgICAgICAgIG91dHB1dEF1ZGlvRm9ybWF0OwotICAgIC8qKjwgT3V0cHV0IGF1ZGlvIHNhbXBsaW5nIGZyZXEgKDgwMDBIeiwuLi4pICovCi0gICAgTTRWSURFT0VESVRJTkdfQXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSAgICAgb3V0cHV0QXVkaW9TYW1wbEZyZXE7Ci0gICAgLyoqPCBNYXhpbXVtIG91dHB1dCBmaWxlIHNpemUgaW4gQllURVMgKGlmIHNldCB0byAwLCBubyBsaW1pdCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEZpbGVTaXplOwotICAgIC8qKjwgSXMgb3V0cHV0IGF1ZGlvIG11c3QgYmUgTW9ubyA/IFZhbGlkIG9ubHkgZm9yIEFBQyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBdWRpb01vbm87Ci0gICAgLyoqPCBPdXRwdXQgdmlkZW8gYml0cmF0ZSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VmlkZW9CaXRyYXRlOwotICAgIC8qKjwgT3V0cHV0IGF1ZGlvIGJpdHJhdGUqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEF1ZGlvQml0cmF0ZTsKLSAgICAvKio8IEJhY2tncm91bmQgbXVzaWMgdHJhY2sgc2V0dGluZ3MgKi8KLSAgICBNNHhWU1NfQkdNU2V0dGluZ3MgICAgICAgICAgICAgICAgICAgICAgICAqcEJHTXRyYWNrOwotICAgIC8qKjwgRnVuY3Rpb24gcG9pbnRlciBvbiB0ZXh0IHJlbmRlcmluZyBlbmdpbmUsIGlmIG5vdCB1c2VkLCBtdXN0IGJlIHNldCB0byBOVUxMICEhICovCi0gICAgTTR4VlNTX2dldFRleHRSZ2JCdWZmZXJGY3QgICAgICAgICAgICAgICAgcFRleHRSZW5kZXJpbmdGY3Q7Ci0gICAgLyoqIG91dHB1dCB2aWRlbyBwcm9maWxlIGFuZCBsZXZlbCovCi0gICAgTTRPU0FfSW50MzIgICBvdXRwdXRWaWRlb1Byb2ZpbGU7Ci0gICAgTTRPU0FfSW50MzIgICBvdXRwdXRWaWRlb0xldmVsOwotCi19IE00eFZTU19FZGl0U2V0dGluZ3M7Ci0KLSNlbmRpZiAvKiBfX000VlNTM0dQUF9FWFRFTkRFRF9BUElfSF9fICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRWU1MzR1BQX0ludGVybmFsQ29uZmlnLmggYi9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9JbnRlcm5hbENvbmZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNjY5ZmViLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRWU1MzR1BQX0ludGVybmFsQ29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX19NNFZTUzNHUFBfSU5URVJOQUxDT05GSUdfSF9fCi0jZGVmaW5lIF9fTTRWU1MzR1BQX0lOVEVSTkFMQ09ORklHX0hfXwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00VlNTM0dQUF9JbnRlcm5hbENvbmZpZy5oCi0gKiBAYnJpZWYgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHNvbWUgbWFnaWNhbCBhbmQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqLwotLyogVmlkZW9FZGl0aW9uIGNvbmZpZyAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIE00VlNTM0dQUF9NSU5JTUFMX1RSQU5TSVRJT05fRFVSQVRJT04gICAgICAgICAgICAxMDAgICAgLyoqPCAxMDAgbWlsbGlzZWNvbmRzICovCi0jZGVmaW5lIE00VlNTM0dQUF9OQl9BVV9QUkVGRVRDSCAgICAgICAgICAgICAgICAgICAgICAgIDQgICAgICAgIC8qKjwgcHJlZmVjdCA0IEFVcyAqLwotI2RlZmluZSBNNFZTUzNHUFBfTk9fU1RTU19KVU1QX1BPSU5UICAgICAgICAgICAgICAgICAgICA0MDAwMCAvKio8IElmIDNncCBmaWxlIGRvZXMgbm90IGNvbnRhaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbiBTVFNTIHRhYmxlIChubyByYXAgZnJhbWVzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdW1wIGJhY2t3YXJkIDQwIHMgbWF4aW11bSAqLwotCi0vKioqKioqKioqKioqKioqKiovCi0vKiBXcml0ZXIgY29uZmlnICovCi0vKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQgICAgICAgICAgICAgICAgMQotI2RlZmluZSBNNFZTUzNHUFBfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRCAgICAgICAgICAgICAgICAyCi0KLS8qKjwgTWF4IEFVIHNpemUgd2lsbCBiZSAwLjggdGltZXMgdGhlIFlVVjQ6MjowIGZyYW1lIHNpemUgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX1ZJREVPX01JTl9DT01QUkVTU0lPTl9SQVRJTyAgICAgICAgICAgIDAuOUYKLS8qKjwgTWF4IGNodW5rIHNpemUgd2lsbCBiZSAxLjIgdGltZXMgdGhlIG1heCBBVSBzaXplICovCi0jZGVmaW5lIE00VlNTM0dQUF9WSURFT19BVV9TSVpFX1RPX0NIVU5DS19TSVpFX1JBVElPICAgIDEuMkYKLQotLyoqIFJFQUQgQ0FSRUZVTExZIElOIENBU0UgT0YgUkVQT1JURUQgUlVOTklORyBUUk9VQkxFUwotVGhlIG1heCBBVSBzaXplIGlzIHVzZWQgdG8gcHJlLXNldCBtYXggc2l6ZSBvZiBBVSB0aGF0IGNhbiBiZSB3cml0dGVuIGluIHRoZSAzR1Agd3JpdGVyCi1Gb3IgYXVkaW8gc3RhbmRhcmQgd2l0aCB2YXJpYWJsZSBBVSBzaXplLCB0aGVyZSBjb3VsZCBiZSBzb21lIGVuY29kaW5nIHNldHRpbmdzIGxlYWRpbmcgdG8gQVUgc2l6ZQotZXhjZWVkaW5nIHRoaXMgbGltaXQuCi1Gb3IgQUFDIHN0cmVhbXMgZm9yIGluc3RhbmNlIHRoZSBhdmVyYWdlIEFVIHNpemUgaXMgZ2l2ZW4gYnk6Ci1hdiBBVSBzaXplID0gKGF2IGJpdHJhdGUgKiAxMDI0KS8oc2FtcGxpbmcgZnJlcSkKLUlmIFZTUyByZXR1cm5zIHRoZSBtZXNzYWdlOgotPj4gRVJST1I6IGF1ZGlvIEFVIHNpemUgKFhYWFgpIHRvIGNvcHkgbGFyZ2VyIHRoYW4gYWxsb2NhdGVkIG9uZSAoWVlZWSkgPT4gYWJvcnQKLT4+IFBMRUFTRSBDT05UQUNUIFNVUFBPUlQgVE8gRVhURU5EIE1BWCBBVSBTSVpFIElOIFRIRSBQUk9EVUNUIExJQlJBUlkKLUVycm9yIGlzIG1vc3QgbGlrZWx5IHRvIGhhcHBlbiB3aGVuIG1peGluZyB3aXRoIGF1ZGlvIGZ1bGwgcmVwbGFjZW1lbnQKLSAqLwotLyoqPCBBQUMgbWF4IEFVIHNpemUgLSBSRUFEIEVYUExBTkFUSU9OIEFCT1ZFICovCi0jZGVmaW5lIE00VlNTM0dQUF9BVURJT19NQVhfQVVfU0laRSAgICAgICAgICAgICAgICAgICAgICAgIDIwNDgKLS8qKjwgc2V0IHRvIHg0IG1heCBBVSBzaXplIHBlciBjaHVuayAqLwotI2RlZmluZSBNNFZTUzNHUFBfQVVESU9fTUFYX0NIVU5DS19TSVpFICAgICAgICAgICAgICAgICAgICA4MTkyCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqLwotLyogSDI2MyAvIE1QRUc0IGNvbmZpZyAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lICAgIE00VlNTM0dQUF9FRElUX0gyNjNfTU9EVUxPX1RJTUUgICAgICAgICAgICAyNTUKLQotI2lmZGVmIEJJR19FTkRJQU4KLS8qKjwgMHhiMyAwMSAwMCAwMCBMaXR0bGUgZW5kaWFuIC8gYjAwIDAwIDAwIDAxIGIzIGJpZyBlbmRpYW4qLwotI2RlZmluZSAgICBNNFZTUzNHUFBfRURJVF9HT1ZfSEVBREVSICAgICAgICAgICAgMHgwMDAwMDFiMwotI2Vsc2UKLS8qKjwgMHhiMyAwMSAwMCAwMCBMaXR0bGUgZW5kaWFuIC8gYjAwIDAwIDAwIDAxIGIzIGJpZyBlbmRpYW4qLwotI2RlZmluZSAgICBNNFZTUzNHUFBfRURJVF9HT1ZfSEVBREVSICAgICAgICAgICAgMHhiMzAxMDAwMAotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKi8KLS8qIEFNUiBjb25maWcgKi8KLS8qKioqKioqKioqKioqKi8KLQotI2RlZmluZSBNNFZTUzNHUFBfV1JJVFRFTl9BTVJfVFJBQ0tfVElNRV9TQ0FMRSAgICAgICAgICAgIDgwMDAKLSNkZWZpbmUgTTRWU1MzR1BQX0FNUl9ERUNPREVEX1BDTV9TQU1QTEVfTlVNQkVSICAgICAgICAgICAgMTYwICAgICAgICAvKio8IDIwbXMgYXQgODAwMGh6IC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjB4OD0xNjAgc2FtcGxlcyAqLwotI2RlZmluZSBNNFZTUzNHUFBfQU1SX0RFRkFVTFRfQklUUkFURSAgICAgICAgICAgICAgICAgICAxMjIwMCAgIC8qKjwgMTIuMiBrYnBzICovCi0KLS8qKioqKioqKioqKioqKi8KLS8qIEVWUkMgY29uZmlnICovCi0vKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTTRWU1MzR1BQX0VWUkNfREVGQVVMVF9CSVRSQVRFICAgICAgICAgICAgICAgICAgOTIwMCAgIC8qKjwgOS4yIGticHMgKi8KLQotLyoqKioqKioqKioqKioqLwotLyogTVAzIGNvbmZpZyAqLwotLyoqKioqKioqKioqKioqLwotCi0vKiogTWFjcm8gdG8gbWFrZSBhIGp1bXAgb24gdGhlIE1QMyB0cmFjayBvbiBzZXZlcmFsIHN0ZXBzCi0gICAgVG8gYXZvaWQgdG8gYmxvY2sgdGhlIHN5c3RlbSB3aXRoIGFuIGxvbmcgTVAzIGp1bXAsIHRoaXMgcHJvY2VzcwotICAgIGlzIGRpdmlkZWQgb24gc2V2ZXJhbCBzdGVwcy4KLSAqLwotI2RlZmluZSBNNFZTUzNHUFBfTVAzX0pVTVBFRF9BVV9OVU1CRVJfTUFYIDEwMAotCi0vKiogTWFjcm8gdG8gZGVmaW5lIHRoZSBudW1iZXIgb2YgcmVhZCBBVSB0byBhbmFseXNlIHRoZSBiaXRyYXRlCi0gICAgU28gdGhlIHByb2Nlc3Mgd2lsbCByZWFkIHRoZSBmaXJzdCBuIEFVIG9mIHRoZSBNUDMgc3RyZWFtIHRvIGdldAotICAgIHRoZSBhdmVyYWdlIGJpdHJhdGUuIG4gaXMgZGVmaW5lZCBieSB0aGlzIGRlZmluZS4KLSAqLwotI2RlZmluZSBNNFZTUzNHUFBfTVAzX0FVX05VTUJFUl9NQVggNTAwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIGRlZmluZSBBTVIgc2lsZW5jZSBmcmFtZXMgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkUgICAgIDEzCi0jZGVmaW5lIE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfRFVSQVRJT04gMTYwCi0KLSNpZmRlZiBNNFZTUzNHUFBfU0lMRU5DRV9GUkFNRVMKLWNvbnN0IE00T1NBX1VJbnQ4IE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhbTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFXSA9Ci17Ci0gICAgMHgwNCwgMHhGRiwgMHgxOCwgMHhDNywgMHhGMCwgMHgwRCwgMHgwNCwgMHgzMywKLSAgICAweEZGLCAweEUwLCAweDAwLCAweDAwLCAweDAwCi19OwotI2Vsc2UKLWV4dGVybiBjb25zdCBNNE9TQV9VSW50OCBcCi0gICAgICAgICAgICAgIE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhbTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFXTsKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBkZWZpbmUgQUFDIHNpbGVuY2UgZnJhbWVzICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX01PTk9fU0laRSAgICAgIDQKLQotI2lmZGVmIE00VlNTM0dQUF9TSUxFTkNFX0ZSQU1FUwotY29uc3QgTTRPU0FfVUludDggTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX01PTk9bTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX01PTk9fU0laRV0gPQotewotICAgIDB4MDAsIDB4QzgsIDB4MjAsIDB4MDcKLX07Ci0jZWxzZQotZXh0ZXJuIGNvbnN0IE00T1NBX1VJbnQ4IE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05PW000VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05PX1NJWkVdOwotI2VuZGlmCi0KLSNkZWZpbmUgTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX1NURVJFT19TSVpFICAgICAgICA2Ci0KLSNpZmRlZiBNNFZTUzNHUFBfU0lMRU5DRV9GUkFNRVMKLWNvbnN0IE00T1NBX1VJbnQ4IE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU9bTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX1NURVJFT19TSVpFXSA9Ci17Ci0gICAgMHgyMSwgMHgxMCwgMHgwMywgMHgyMCwgMHg1NCwgMHgxQwotfTsKLSNlbHNlCi1leHRlcm4gY29uc3QgTTRPU0FfVUludDggTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX1NURVJFT1tNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPX1NJWkVdOwotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX000VlNTM0dQUF9JTlRFUk5BTENPTkZJR19IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfSW50ZXJuYWxGdW5jdGlvbnMuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRWU1MzR1BQX0ludGVybmFsRnVuY3Rpb25zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU4NTU4ODIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfSW50ZXJuYWxGdW5jdGlvbnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDY1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFZTUzNHUFBfSW50ZXJuYWxGdW5jdGlvbnMuaAotICogQGJyaWVmICAgIFRoaXMgZmlsZSBjb250YWlucyBhbGwgZnVuY3Rpb24gcHJvdG90eXBlcyBub3QgdmlzaWJsZSB0byB0aGUgZXh0ZXJuYWwgd29ybGQuCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0jaWZuZGVmIF9fTTRWU1MzR1BQX0lOVEVSTkFMRlVOQ1RJT05TX0hfXwotI2RlZmluZSBfX000VlNTM0dQUF9JTlRFUk5BTEZVTkNUSU9OU19IX18KLQotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKLS8qKgotICogICAgVlNTIHB1YmxpYyBBUEkgYW5kIHR5cGVzICovCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0FQSS5oIgotCi0vKioKLSAqICAgIFZTUyBwcml2YXRlIHR5cGVzICovCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsVHlwZXMuaCIKLQotCi0jaW5jbHVkZSAiTTRSRUFERVJfQ29tbW9uLmgiIC8qKjwgZm9yIE00X0FjY2Vzc1VuaXQgZGVmaW5pdGlvbiAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qIEFsbCBlcnJvcnMgYXJlIGZhdGFsIGluIHRoZSBWU1MgKi8KLSNkZWZpbmUgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycikgaWYoTTROT19FUlJPUiE9ZXJyKSByZXR1cm4gZXJyOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbygpCi0gKiBAYnJpZWYgICAgT25lIHN0ZXAgb2YgdmlkZW8gcHJvY2Vzc2luZwotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbyhNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbygpCi0gKiBAYnJpZWYgICAgT25lIHN0ZXAgb2YgYXVkaW8gcHJvY2Vzc2luZwotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbyhNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdFN0ZXBNUDMoKQotICogQGJyaWVmICAgIE9uZSBzdGVwIG9mIGF1ZGlvIHByb2Nlc3NpbmcgZm9yIHRoZSBNUDMgY2xpcAotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdFN0ZXBNUDMoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludE9wZW5DbGlwKCkKLSAqIEBicmllZiAgICBPcGVuIG5leHQgY2xpcAotICogQHBhcmFtICAgcEMgICAgICAgICAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludE9wZW5DbGlwKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICoqaENsaXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludERlc3Ryb3lWaWRlb0VuY29kZXIoKQotICogQGJyaWVmICAgIERlc3Ryb3kgdGhlIHZpZGVvIGVuY29kZXIKLSAqIEBub3RlCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50RGVzdHJveVZpZGVvRW5jb2RlcihNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyKCkKLSAqIEBicmllZiAgICBDcmVhdGVzIHRoZSB2aWRlbyBlbmNvZGVyCi0gKiBAbm90ZQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgIE00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXIoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZlZpZGVvKCkKLSAqIEBicmllZiAgICBEbyB3aGF0IHRvIGRvIHdoZW4gdGhlIGVuZCBvZiBhIGNsaXAgdmlkZW8gdHJhY2sgaXMgcmVhY2hlZAotICogQG5vdGUgICAgSWYgdGhlcmUgaXMgYXVkaW8gb24gdGhlIGN1cnJlbnQgY2xpcCwgcHJvY2VzcyBpdCwgZWxzZSBzd2l0Y2ggdG8gdGhlIG5leHQgY2xpcAotICogQHBhcmFtICAgcEMgICAgICAgICAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZlZpZGVvKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZBdWRpbygpCi0gKiBAYnJpZWYgICAgRG8gd2hhdCB0byBkbyB3aGVuIHRoZSBlbmQgb2YgYSBjbGlwIGF1ZGlvIHRyYWNrIGlzIHJlYWNoZWQKLSAqIEBwYXJhbSAgIHBDICAgICAgICAgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZBdWRpbyhNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2hlY2tDbGlwQ29tcGF0aWJsZVdpdGhWc3NFZGl0aW5nKCkKLSAqIEBicmllZiAgICBDaGVjayBpZiB0aGUgY2xpcCBpcyBjb21wYXRpYmxlIHdpdGggVlNTIGVkaXRpbmcKLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ2xpcEN0eHQgICAgICAgICAgICAoSU4pIGludGVybmFsIGNsaXAgY29udGV4dAotICogQHBhcmFtICAgIHBDbGlwUHJvcGVydGllcyAgICAgKE9VVCkgUG9pbnRlciB0byBhIHZhbGlkIENsaXBQcm9wZXJ0aWVzIHN0cnVjdHVyZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2hlY2tDbGlwQ29tcGF0aWJsZVdpdGhWc3NFZGl0aW5nKE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwQ2xpcFByb3BlcnRpZXMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKQotICogQGJyaWVmICAgIE9wZW4gYSBjbGlwLiBDcmVhdGVzIGEgY2xpcCBjb250ZXh0LgotICogQG5vdGUKLSAqIEBwYXJhbSAgIGhDbGlwQ3R4dCAgICAgICAgICAgIChPVVQpIFJldHVybiB0aGUgaW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcGFyYW0gICBwQ2xpcFNldHRpbmdzICAgICAgICAoSU4pIEVkaXQgc2V0dGluZ3Mgb2YgdGhpcyBjbGlwLiBUaGUgbW9kdWxlIHdpbGwga2VlcCBhCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2UgdG8gdGhpcyBwb2ludGVyCi0gKiBAcGFyYW0gICAgcEZpbGVSZWFkUHRyRmN0ICAgICAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHJlYWRlciBmdW5jdGlvbnMKLSAqIEBwYXJhbSAgICBiU2tpcEF1ZGlvVHJhY2sgICAgICAgIChJTikgSWYgdHJ1ZSwgZG8gbm90IG9wZW4gdGhlIGF1ZGlvCi0gKiBAcGFyYW0gICAgYkZhc3RPcGVuTW9kZSAgICAgICAgKElOKSBJZiB0cnVlLCB1c2UgdGhlIGZhc3QgbW9kZSBvZiB0aGUgM2dwcCByZWFkZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25seSB0aGUgZmlyc3QgQVUgaXMgcmVhZCkKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwSW5pdCAoCi0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICoqaENsaXBDdHh0LAotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciAqcEZpbGVSZWFkUHRyRmN0Ci0pOwotCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBPcGVuICgKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCwKLSAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzLAotICAgIE00T1NBX0Jvb2wgYlNraXBBdWRpb1RyYWNrLAotICAgIE00T1NBX0Jvb2wgYkZhc3RPcGVuTW9kZSwKLSAgICBNNE9TQV9Cb29sIGJBdm9pZE9wZW5pbmdWaWRlb0RlYwotKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludENsaXBEZWxldGVBdWRpb1RyYWNrKCkKLSAqIEBicmllZiAgICBEZWxldGUgdGhlIGF1ZGlvIHRyYWNrLiBDbGlwIHdpbGwgYmUgbGlrZSBpZiBpdCBoYWQgbm8gYXVkaW8gdHJhY2sKLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ2xpcEN0eHQgICAgICAgICAgICAoSU4pIEludGVybmFsIGNsaXAgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludENsaXBEZWxldGVBdWRpb1RyYWNrKE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVWaWRlb1VwVG9DdXJyZW50VGltZSgpCi0gKiBAYnJpZWYgICAgSnVtcCB0byB0aGUgcHJldmlvdXMgUkFQIGFuZCBkZWNvZGUgdXAgdG8gdGhlIGN1cnJlbnQgdmlkZW8gdGltZQotICogQHBhcmFtICAgcENsaXBDdHh0ICAgIChJTikgSW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcGFyYW0gICBpQ3RzICAgICAgICAoSU4pIFRhcmdldCBDVFMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVWaWRlb1VwVG9DdHMoTTRWU1MzR1BQX0NsaXBDb250ZXh0KiBwQ2xpcEN0eHQsIE00T1NBX0ludDMyIGlDdHMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSgpCi0gKiBAYnJpZWYgICAgUmVhZCBvbmUgQVUgZnJhbWUgaW4gdGhlIGNsaXAKLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ2xpcEN0eHQgICAgICAgICAgICAoSU4pIEludGVybmFsIGNsaXAgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZSgpCi0gKiBAYnJpZWYgICAgRGVjb2RlIHRoZSBjdXJyZW50IEFVRElPIGZyYW1lLgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgKElOKSBpbnRlcm5hbCBjbGlwIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcERlY29kZUN1cnJlbnRBdWRpb0ZyYW1lKE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdCgpCi0gKiBAYnJpZWYgICAgSnVtcCBpbiB0aGUgYXVkaW8gdHJhY2sgb2YgdGhlIGNsaXAuCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENsaXBDdHh0ICAgICAgICAgICAgKElOKSBpbnRlcm5hbCBjbGlwIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBKdW1wQ3RzICAgICAgICAgICAgKElOL09VVCkgaW46dGFyZ2V0IENUUywgb3V0OiByZWFjaGVkIENUUwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQoTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQsIE00T1NBX0ludDMyICpwSnVtcEN0cyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwQ2xvc2UoKQotICogQGJyaWVmICAgIENsb3NlIGEgY2xpcC4gRGVzdHJveSB0aGUgY29udGV4dC4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ2xpcEN0eHQgICAgICAgICAgICAoSU4pIEludGVybmFsIGNsaXAgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwQ2xvc2UoTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQpOwotCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEVkaXRKdW1wTVAzKCkKLSAqIEBicmllZiAgICBPbmUgc3RlcCBvZiBqdW1waW5nIHByb2Nlc3NpbmcgZm9yIHRoZSBNUDMgY2xpcC4KLSAqIEBub3RlICAgIE9uIG9uZSBzdGVwLCB0aGUganVtcCBvZiBzZXZlcmFsIEFVIGlzIGRvbmUKLSAqIEBwYXJhbSAgIHBDICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludEVkaXRKdW1wTVAzKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3JlZ2lzdGVyV3JpdGVyKCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVnaXN0ZXIgYSBzcGVjaWZpYyBmaWxlIGZvcm1hdCB3cml0ZXIuCi0gKiBAbm90ZSAgICBBY2NvcmRpbmcgdG8gdGhlIE1lZGlhdHlwZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHN0b3JlIGluIHRoZSBpbnRlcm5hbCBjb250ZXh0Ci0gKiAgICAgICAgICAgICB0aGUgd3JpdGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICBwQ29udGV4dCxwV3RyR2xvYmFsSW50ZXJmYWNlIG9yIHBXdHJEYXRhSW50ZXJmYWNlIGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpLCBvciBpbnZhbGlkIE1lZGlhVHlwZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlcldyaXRlcihNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX091dHB1dEZpbGVUeXBlIE1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqIHBXdHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSogcFd0ckRhdGFJbnRlcmZhY2UpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlckVuY29kZXIoKQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gd2lsbCByZWdpc3RlciBhIHNwZWNpZmljIHZpZGVvIGVuY29kZXIuCi0gKiBAbm90ZSAgICBBY2NvcmRpbmcgdG8gdGhlIE1lZGlhdHlwZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHN0b3JlIGluIHRoZSBpbnRlcm5hbCBjb250ZXh0Ci0gKiAgICAgICAgICAgIHRoZSBlbmNvZGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICBwQ29udGV4dCBvciBwRW5jR2xvYmFsSW50ZXJmYWNlIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBpbnZhbGlkIE1lZGlhVHlwZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRW5jb2RlcihNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9Gb3JtYXQgTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UgKnBFbmNHbG9iYWxJbnRlcmZhY2UpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiB3aWxsIHJlZ2lzdGVyIGEgc3BlY2lmaWMgYXVkaW8gZW5jb2Rlci4KLSAqIEBub3RlICAgIEFjY29yZGluZyB0byB0aGUgTWVkaWF0eXBlLCB0aGlzIGZ1bmN0aW9uIHdpbGwgc3RvcmUgaW4gdGhlIGludGVybmFsIGNvbnRleHQKLSAqICAgICAgICAgICAgIHRoZSBlbmNvZGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgICAgICAgICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgbWVkaWFUeXBlOiAgICAgICAgICAgICAgICAoSU4pIFRoZSBtZWRpYSB0eXBlLgotICogQHBhcmFtICAgIHBFbmNHbG9iYWxJbnRlcmZhY2U6ICAgIChPVVQpIHRoZSBlbmNvZGVyIGludGVyZmFjZSBmdW5jdGlvbnMuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgb3IgcEVuY0dsb2JhbEludGVyZmFjZSBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRW5jb2RlcihNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0IE1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZSAqcEVuY0dsb2JhbEludGVyZmFjZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3JlZ2lzdGVyUmVhZGVyKCkKLSAqIEBicmllZiAgICBSZWdpc3RlciByZWFkZXIuCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgTTRWU1MzR1BQX3JlZ2lzdGVyUmVhZGVyKE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfTWVkaWFUeXBlIG1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKnBSZHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSAqcFJkckRhdGFJbnRlcmZhY2UpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRGVjb2RlcigpCi0gKiBAYnJpZWYgICAgUmVnaXN0ZXIgdmlkZW8gZGVjb2RlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHBhcmFtICAgIGRlY29kZXJUeXBlICAgICAgICAgICAgKElOKSBEZWNvZGVyIHR5cGUKLSAqIEBwYXJhbSAgICBwRGVjb2RlckludGVyZmFjZSAgICAoSU4pIERlY29kZXIgaW50ZXJmYWNlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSksIG9yIHRoZSBkZWNvZGVyIHR5cGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgaW52YWxpZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRGVjb2RlcihNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfVmlkZW9UeXBlIGRlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UgKnBEZWNvZGVySW50ZXJmYWNlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfcmVnaXN0ZXJBdWRpb0RlY29kZXIoKQotICogQGJyaWVmICAgIFJlZ2lzdGVyIGF1ZGlvIGRlY29kZXIKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbnRlcm5hbHkgYnkgdGhlIFZTUyB0byByZWdpc3RlciBhdWRpbyBkZWNvZGVycywKLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHBhcmFtICAgIGRlY29kZXJUeXBlICAgICAgICAgICAgKElOKSBBdWRpbyBkZWNvZGVyIHR5cGUKLSAqIEBwYXJhbSAgICBwRGVjb2RlckludGVyZmFjZSAgICAoSU4pIEF1ZGlvIGRlY29kZXIgaW50ZXJmYWNlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCwgb3IgdGhlIGRlY29kZXIgdHlwZSBpcyBpbnZhbGlkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRGVjb2RlcihNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00QURfVHlwZSBkZWNvZGVyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEFEX0ludGVyZmFjZSAqcERlY29kZXJJbnRlcmZhY2UpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsV3JpdGVycygpCi0gKiBAYnJpZWYgICAgVW5yZWdpc3RlciB3cml0ZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbFdyaXRlcnMoTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxFbmNvZGVycygpCi0gKiBAYnJpZWYgICAgVW5yZWdpc3RlciB0aGUgZW5jb2RlcnMKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbEVuY29kZXJzKE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsUmVhZGVycygpCi0gKiBAYnJpZWYgICAgVW5yZWdpc3RlciByZWFkZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbFJlYWRlcnMoTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxEZWNvZGVycygpCi0gKiBAYnJpZWYgICAgVW5yZWdpc3RlciB0aGUgZGVjb2RlcnMKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbERlY29kZXJzKE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9zZXRDdXJyZW50V3JpdGVyKCkKLSAqIEBicmllZiAgICBTZXQgY3VycmVudCB3cml0ZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHBhcmFtICAgIG1lZGlhVHlwZSAgICAgICAgICAgIChJTikgTWVkaWEgdHlwZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgICAgICAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgICBNNFdBUl9WU1NfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ6ICAgIE1lZGlhIHR5cGUgbm90IHN1cHBvcnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgIE00VlNTM0dQUF9zZXRDdXJyZW50V3JpdGVyKE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgbWVkaWFUeXBlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudFZpZGVvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgU2V0IGEgdmlkZW8gZW5jb2RlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgTWVkaWFUeXBlICAgICAgICAgICAoSU4pIEVuY29kZXIgdHlwZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00V0FSX1ZTU19NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDogICAgTWVkaWEgdHlwZSBub3Qgc3VwcG9ydGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgTTRWU1MzR1BQX3NldEN1cnJlbnRWaWRlb0VuY29kZXIoTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1N0cmVhbVR5cGUgbWVkaWFUeXBlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgU2V0IGFuIGF1ZGlvIGVuY29kZXIKLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgTWVkaWFUeXBlICAgICAgICAoSU4pIEVuY29kZXIgdHlwZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcihNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfU3RyZWFtVHlwZSBtZWRpYVR5cGUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9zZXRDdXJyZW50UmVhZGVyKCkKLSAqIEBicmllZiAgICBTZXQgY3VycmVudCByZWFkZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHBhcmFtICAgIG1lZGlhVHlwZSAgICAgICAgICAgIChJTikgTWVkaWEgdHlwZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgICAgICAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgICBNNFdBUl9WU1NfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ6ICAgIE1lZGlhIHR5cGUgbm90IHN1cHBvcnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgIE00VlNTM0dQUF9zZXRDdXJyZW50UmVhZGVyKE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIG1lZGlhVHlwZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3NldEN1cnJlbnRWaWRlb0RlY29kZXIoKQotICogQGJyaWVmICAgIFNldCBhIHZpZGVvIGRlY29kZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHBhcmFtICAgIGRlY29kZXJUeXBlICAgICAgICAoSU4pIERlY29kZXIgdHlwZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00V0FSX1ZTU19NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDogICAgTWVkaWEgdHlwZSBub3Qgc3VwcG9ydGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgTTRWU1MzR1BQX3NldEN1cnJlbnRWaWRlb0RlY29kZXIoTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbVR5cGUgbWVkaWFUeXBlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRGVjb2RlcigpCi0gKiBAYnJpZWYgICAgU2V0IGFuIGF1ZGlvIGRlY29kZXIKLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgZGVjb2RlclR5cGUgICAgICAgIChJTikgRGVjb2RlciB0eXBlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgIE00VlNTM0dQUF9zZXRDdXJyZW50QXVkaW9EZWNvZGVyKE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9TdHJlYW1UeXBlIG1lZGlhVHlwZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX2NsZWFySW50ZXJmYWNlVGFibGVzKCkKLSAqIEBicmllZiAgICBDbGVhciBlbmNvZGVycywgZGVjb2RlcnMsIHJlYWRlciBhbmQgd3JpdGVycyBpbnRlcmZhY2VzIHRhYmxlcwotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBUaGUgY29udGV4dCBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgTTRWU1MzR1BQX2NsZWFySW50ZXJmYWNlVGFibGVzKE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfU3Vic2NyaWJlTWVkaWFBbmRDb2RlYygpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiByZWdpc3RlcnMgdGhlIHJlYWRlciwgZGVjb2RlcnMsIHdyaXRlcnMgYW5kIGVuY29kZXJzCi0gKiAgICAgICAgICBpbiB0aGUgVlNTLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgIHBDb250ZXh0IGlzIE5VTEwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWMoTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfVUludDMyIE00VlNTM0dQUF9pbnRHZXRGcmFtZVNpemVfQU1STkIoKQotICogQGJyaWVmICAgUmV0dXJuIHRoZSBsZW5ndGgsIGluIGJ5dGVzLCBvZiB0aGUgQU1SIE5hcnJvdy1CYW5kIGZyYW1lIGNvbnRhaW5lZCBpbiB0aGUgZ2l2ZW4gYnVmZmVyCi0gKiBAbm90ZQotICogQHBhcmFtICAgcEF1ZGlvRnJhbWUgICAoSU4pIEFNUk5CIGZyYW1lCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX1VJbnQzMiBNNFZTUzNHUFBfaW50R2V0RnJhbWVTaXplX0FNUk5CKE00T1NBX01lbUFkZHI4IHBBdWRpb0ZyYW1lKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9VSW50MzIgTTRWU1MzR1BQX2ludEdldEZyYW1lU2l6ZV9FVlJDKCkKLSAqIEBicmllZiAgIFJldHVybiB0aGUgbGVuZ3RoLCBpbiBieXRlcywgb2YgdGhlIEVWUkMgZnJhbWUgY29udGFpbmVkIGluIHRoZSBnaXZlbiBidWZmZXIKLSAqIEBub3RlCi0gKiAgICAgMCAxIDIgMwotICogICAgKy0rLSstKy0rCi0gKiAgICB8ZnIgdHlwZXwgICAgICAgICAgICAgIFJGQyAzNTU4Ci0gKiAgICArLSstKy0rLSsKLSAqCi0gKiBGcmFtZSBUeXBlOiA0IGJpdHMKLSAqICAgIFRoZSBmcmFtZSB0eXBlIGluZGljYXRlcyB0aGUgdHlwZSBvZiB0aGUgY29ycmVzcG9uZGluZyBjb2RlYyBkYXRhCi0gKiAgICBmcmFtZSBpbiB0aGUgUlRQIHBhY2tldC4KLSAqCi0gKiBGb3IgRVZSQyBhbmQgU01WIGNvZGVjcywgdGhlIGZyYW1lIHR5cGUgdmFsdWVzIGFuZCBzaXplIG9mIHRoZQotICogYXNzb2NpYXRlZCBjb2RlYyBkYXRhIGZyYW1lIGFyZSBkZXNjcmliZWQgaW4gdGhlIHRhYmxlIGJlbG93OgotICoKLSAqIFZhbHVlICAgUmF0ZSAgICAgIFRvdGFsIGNvZGVjIGRhdGEgZnJhbWUgc2l6ZSAoaW4gb2N0ZXRzKQotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgIDAgICAgIEJsYW5rICAgICAgMCAgICAoMCBiaXQpCi0gKiAgIDEgICAgIDEvOCAgICAgICAgMiAgICAoMTYgYml0cykKLSAqICAgMiAgICAgMS80ICAgICAgICA1ICAgICg0MCBiaXRzOyBub3QgdmFsaWQgZm9yIEVWUkMpCi0gKiAgIDMgICAgIDEvMiAgICAgICAxMCAgICAoODAgYml0cykKLSAqICAgNCAgICAgMSAgICAgICAgIDIyICAgICgxNzEgYml0czsgNSBwYWRkZWQgYXQgZW5kIHdpdGggemVyb3MpCi0gKiAgIDUgICAgIEVyYXN1cmUgICAgMCAgICAoU0hPVUxEIE5PVCBiZSB0cmFuc21pdHRlZCBieSBzZW5kZXIpCi0gKgotICogQHBhcmFtICAgcENwQXVkaW9GcmFtZSAgIChJTikgRVZSQyBmcmFtZQotICogQHJldHVybiAgTTROT19FUlJPUjogTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9VSW50MzIgTTRWU1MzR1BQX2ludEdldEZyYW1lU2l6ZV9FVlJDKE00T1NBX01lbUFkZHI4IHBBdWRpb0ZyYW1lKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMoKQotICogQGJyaWVmICAgIEdldCB2aWRlbyBhbmQgYXVkaW8gcHJvcGVydGllcyBmcm9tIHRoZSBjbGlwIHN0cmVhbXMKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gbXVzdCByZXR1cm4gZmF0YWwgZXJyb3JzIG9ubHkgKGVycm9ycyB0aGF0IHNob3VsZCBub3QgaGFwcGVuIGluIHRoZQotICogICAgICAgICAgICAgZmluYWwgaW50ZWdyYXRlZCBwcm9kdWN0KS4KLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgICAgIChJTikgaW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcENsaXBQcm9wZXJ0aWVzICAgICAgICAoT1VUKSBQb2ludGVyIHRvIGEgdmFsaWQgQ2xpcFByb3BlcnRpZXMgc3RydWN0dXJlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzKE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwQ2xpcFByb3BlcnRpZXMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q3JlYXRlQXVkaW9FbmNvZGVyKCkKLSAqIEBicmllZiAgICBSZXNldCB0aGUgYXVkaW8gZW5jb2RlciAoQ3JlYXRlIGl0IGlmIG5lZWRlZCkKLSAqIEBub3RlCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgTTRWU1MzR1BQX2ludENyZWF0ZUF1ZGlvRW5jb2RlcihNNFZTUzNHUFBfRW5jb2RlV3JpdGVDb250ZXh0ICpwQ19ld2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDX1NoZWxsQVBJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpQXVkaW9CaXRyYXRlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlKCkKLSAqIEBicmllZiAgICBDcmVhdGVzIGFuZCBwcmVwYXJlIHRoZSBvdXRwdXQgTVAzIGZpbGUKLSAqIEBub3RlICAgIENyZWF0ZXMgdGhlIHdyaXRlciwgQ3JlYXRlcyB0aGUgb3V0cHV0IGZpbGUsIEFkZHMgdGhlIHN0cmVhbXMsIFJlYWRpZXMgdGhlCi0gKiAgICAgICAgICAgIHdyaXRpbmcgcHJvY2VzcwotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZShNNFZTUzNHUFBfRW5jb2RlV3JpdGVDb250ZXh0ICpwQ19ld2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcENfU2hlbGxBUEksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyICpwT3NhRmlsZVdyaXRQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBPdXRwdXRGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIgKnBPc2FGaWxlUmVhZFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcFRlbXBGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgbWF4T3V0cHV0RmlsZVNpemUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb21wYXRpYmlsaXR5KCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGFsbG93cyBjaGVja2luZyBpZiB0d28gY2xpcHMgYXJlIGNvbXBhdGlibGUgd2l0aCBlYWNoIG90aGVyIGZvcgotICogICAgICAgICAgICAgVlNTIDNHUFAgYXVkaW8gbWl4aW5nIGZlYXR1cmUuCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJTikgQ29udGV4dCBvZiB0aGUgYXVkaW8gbWl4ZXIKLSAqIEBwYXJhbSAgICBwSW5wdXRDbGlwUHJvcGVydGllcyAgICAgICAgKElOKSBDbGlwIGFuYWx5c2lzIG9mIHRoZSBmaXJzdCBjbGlwCi0gKiBAcGFyYW0gICAgcEFkZGVkQ2xpcFByb3BlcnRpZXMgICAgICAgIChJTikgQ2xpcCBhbmFseXNpcyBvZiB0aGUgc2Vjb25kIGNsaXAKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQ0xJUF9BTkFMWVNJU19WRVJTSU9OCi0gKiBAcmV0dXJuICBNNFZTUzNHUFBfRVJSX0lOUFVUX0NMSVBfSVNfTk9UX0FfM0dQUAotICogQHJldHVybiAgTTROT19FUlJPUgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb21wYXRpYmlsaXR5KE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwSW5wdXRDbGlwUHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwQWRkZWRDbGlwUHJvcGVydGllcyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50Q2xpcERlbGV0ZUF1ZGlvVHJhY2soKQotICogQGJyaWVmICAgIERlbGV0ZSB0aGUgYXVkaW8gdHJhY2suIENsaXAgd2lsbCBiZSBsaWtlIGlmIGl0IGhhZCBubyBhdWRpbyB0cmFjawotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgICAgIChJTikgSW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50Q2xpcERlbGV0ZUF1ZGlvVHJhY2soTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFN0YXJ0QVUoKQotICogQGJyaWVmICAgIFN0YXJ0QVUgd3JpdGVyLWxpa2UgaW50ZXJmYWNlIHVzZWQgZm9yIHRoZSBWU1MgM0dQUCBvbmx5Ci0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0OiAoSU4pIEl0IGlzIHRoZSBWU1MgM0dQUCBjb250ZXh0IGluIG91ciBjYXNlCi0gKiBAcGFyYW0gICAgc3RyZWFtSUQ6IChJTikgSWQgb2YgdGhlIHN0cmVhbSB0byB3aGljaCB0aGUgQWNjZXNzIFVuaXQgaXMgcmVsYXRlZC4KLSAqIEBwYXJhbSAgICBwQVU6ICAgICAgKElOL09VVCkgQWNjZXNzIFVuaXQgdG8gYmUgcHJlcGFyZWQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICBNNFZTUzNHUFBfaW50U3RhcnRBVShNNFdSSVRFUl9Db250ZXh0IHBDb250ZXh0LCBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBBVSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50UHJvY2Vzc0FVKCkKLSAqIEBicmllZiAgICBQcm9jZXNzQVUgd3JpdGVyLWxpa2UgaW50ZXJmYWNlIHVzZWQgZm9yIHRoZSBWU1MgM0dQUCBvbmx5Ci0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0OiAoSU4pIEl0IGlzIHRoZSBWU1MgM0dQUCBjb250ZXh0IGluIG91ciBjYXNlCi0gKiBAcGFyYW0gICAgc3RyZWFtSUQ6IChJTikgSWQgb2YgdGhlIHN0cmVhbSB0byB3aGljaCB0aGUgQWNjZXNzIFVuaXQgaXMgcmVsYXRlZC4KLSAqIEBwYXJhbSAgICBwQVU6ICAgICAgKElOL09VVCkgQWNjZXNzIFVuaXQgdG8gYmUgd3JpdHRlbgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgTTRWU1MzR1BQX2ludFByb2Nlc3NBVShNNFdSSVRFUl9Db250ZXh0IHBDb250ZXh0LCBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19BY2Nlc3NVbml0KiBwQVUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50VlBQKCkKLSAqIEBicmllZiAgICBXZSBpbXBsZW1lbnQgb3VyIG93biBWaWRlb1ByZVByb2Nlc3NpbmcgZnVuY3Rpb24KLSAqIEBub3RlICAgIEl0IGlzIGNhbGxlZCBieSB0aGUgdmlkZW8gZW5jb2RlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgVlBQIGNvbnRleHQsIHdoaWNoIGFjdHVhbGx5IGlzIHRoZSBWU1MgM0dQUCBjb250ZXh0IGluIG91ciBjYXNlCi0gKiBAcGFyYW0gICAgcFBsYW5lSW4gICAgKElOKQotICogQHBhcmFtICAgIHBQbGFuZU91dCAgICAoSU4vT1VUKSBQb2ludGVyIHRvIGFuIGFycmF5IG9mIDMgcGxhbmVzIHRoYXQgd2lsbCBjb250YWluIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBZVVY0MjAgaW1hZ2UKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgIE00VlNTM0dQUF9pbnRWUFAoTTRWUFBfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lT3V0KTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9fTTRWU1MzR1BQX0lOVEVSTkFMRlVOQ1RJT05TX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9JbnRlcm5hbFR5cGVzLmggYi9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9JbnRlcm5hbFR5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE3OTAwZjAuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfSW50ZXJuYWxUeXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzgxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00VlNTM0dQUF9JbnRlcm5hbFR5cGVzLmgKLSAqIEBicmllZiAgICBUaGlzIGZpbGUgY29udGFpbnMgYWxsIGVudW0gYW5kIHR5cGVzIG5vdCB2aXNpYmxlIHRvIHRoZSBleHRlcm5hbCB3b3JsZC4KLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0KLSNpZm5kZWYgX19NNFZTUzNHUFBfSU5URVJOQUxUWVBFU19IX18KLSNkZWZpbmUgX19NNFZTUzNHUFBfSU5URVJOQUxUWVBFU19IX18KLQotI2RlZmluZSBNNFZTU19WRVJTSU9OX01BSk9SICAgICAgICAzCi0jZGVmaW5lIE00VlNTX1ZFUlNJT05fTUlOT1IgICAgICAgIDIKLSNkZWZpbmUgTTRWU1NfVkVSU0lPTl9SRVZJU0lPTiAgICA1Ci0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0KLS8qKgotICogICAgVlNTIHB1YmxpYyBBUEkgYW5kIHR5cGVzICovCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0FQSS5oIgotCi0vKioKLSAqICAgIEludGVybmFsbHkgdXNlZCBtb2R1bGVzICovCi0jaW5jbHVkZSAiTTRSRUFERVJfQ29tbW9uLmgiICAgICAgICAvKio8IFJlYWRlciBjb21tb24gaW50ZXJmYWNlICovCi0jaW5jbHVkZSAiTTRXUklURVJfY29tbW9uLmgiICAgICAgICAvKio8IFdyaXRlciBjb21tb24gaW50ZXJmYWNlICovCi0jaW5jbHVkZSAiTTRERUNPREVSX0NvbW1vbi5oIiAgICAgICAgLyoqPCBEZWNvZGVyIGNvbW1vbiBpbnRlcmZhY2UgKi8KLSNpbmNsdWRlICJNNEVOQ09ERVJfY29tbW9uLmgiICAgICAgICAvKio8IEVuY29kZXIgY29tbW9uIGludGVyZmFjZSAqLwotI2luY2x1ZGUgIk00VklGSV9GaWx0ZXJzQVBJLmgiICAgICAgICAvKio8IEltYWdlIHBsYW5lcyBkZWZpbml0aW9uICovCi0jaW5jbHVkZSAiTTRSRUFERVJfM2dwQ29tLmgiICAgICAgICAvKio8IFJlYWQgM0dQUCBmaWxlICAgICAqLwotI2luY2x1ZGUgIk00QURfQ29tbW9uLmgiICAgICAgICAgICAgLyoqPCBEZWNvZGVyIGF1ZGlvICAgKi8KLSNpbmNsdWRlICJNNEVOQ09ERVJfQXVkaW9Db21tb24uaCIgIC8qKjwgRW5jb2RlIGF1ZGlvICAgICovCi0KLQotI2luY2x1ZGUgIlNTUkMuaCIgICAgICAgICAgICAgICAgICAgIC8qKjwgU1NSQyAgICAgICAgICAgICAqLwotI2luY2x1ZGUgIkZyb20yaVRvTW9ub18xNi5oIiAgICAgICAgLyoqPCBTdGVyZW8gdG8gTW9ubyAgICAgKi8KLSNpbmNsdWRlICJNb25vVG8ySV8xNi5oIiAgICAgICAgICAgIC8qKjwgTW9ubyB0byBTdGVyZW8gICAgICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2RlZmluZSBXSU5ET1dfU0laRSAxMAotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICAgICAgTTRWU1MzR1BQX0VkaXRTdGF0ZQotICogQGJyaWVmICAgICAgICBNYWluIHN0YXRlIG1hY2hpbmUgb2YgdGhlIFZTUyAzR1BQIGVkaXQgb3BlcmF0aW9uLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRWU1MzR1BQX2tFZGl0U3RhdGVfQ1JFQVRFRCAgICA9IDAsICAgIC8qKjwgTTRWU1MzR1BQX2VkaXRJbml0IGhhcyBiZWVuIGNhbGxlZCAqLwotICAgIE00VlNTM0dQUF9rRWRpdFN0YXRlX1ZJREVPICAgICAgICA9IDEsICAgIC8qKjwgUHJvY2Vzc2luZyB2aWRlbyB0cmFjayAqLwotICAgIE00VlNTM0dQUF9rRWRpdFN0YXRlX0FVRElPICAgICAgICA9IDIsICAgIC8qKjwgUHJvY2Vzc2luZyBhdWRpbyB0cmFjayAqLwotICAgIE00VlNTM0dQUF9rRWRpdFN0YXRlX01QMyAgICAgICAgPSAzLCAgICAvKio8IFByb2Nlc3NpbmcgTVAzIGF1ZGlvIHRyYWNrICovCi0gICAgTTRWU1MzR1BQX2tFZGl0U3RhdGVfTVAzX0pVTVAgICA9IDQsICAgICAgICAvKio8IFByb2Nlc3NpbmcgYSBqdW1wIGluIGEgTVAzIGF1ZGlvIHRyYWNrICovCi0gICAgTTRWU1MzR1BQX2tFZGl0U3RhdGVfRklOSVNIRUQgICAgPSA1LCAgICAvKio8IFByb2Nlc3NpbmcgZG9uZSwgVlNTIDNHUFAgY2FuIGJlIGNsb3NlZCAqLwotICAgIE00VlNTM0dQUF9rRWRpdFN0YXRlX0NMT1NFRCAgICAgICAgPSA2ICAgICAgICAvKio8IE91dHB1dCBmaWxlIGhhcyBiZWVuIGNsb3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlNTIDNHUFAgY2FuIGJlIGRlc3Ryb3llZCAqLwotfQotTTRWU1MzR1BQX0VkaXRTdGF0ZTsKLQotdHlwZWRlZiBlbnVtCi17Ci0gICAgLyoqPCBEb2luZyBSZWFkL1dyaXRlIG9wZXJhdGlvbi4gVGhpcyBvcGVyYXRpb24gd2lsbCBoYXZlIG5vIHByb2Nlc3NpbmcKLSAgICAgKiBvbiBpbnB1dCBmcmFtZXMuIE9ubHkgdGltZSBzdGFtcCBtYW5pcHVsYXRpb25zIGluIG91dHB1dCBmaWxlLiAqLwotICAgIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfUkVBRF9XUklURSAgICA9IDEwLAotICAgIC8qKjwgRGVjb2RlIGVuY29kZSB0byBjcmVhdGUgYW4gSSBmcmFtZS4gVGhpcyBpcyBkb25lIGZvciBhIHNpbmdsZSBmcmFtZQotICAgICAqIHRvIGNyZWF0ZSBhIG5ldyByZWZlcmVuY2UgZnJhbWUuICovCi0gICAgTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9CRUdJTl9DVVQgICAgID0gMTEsCi0gICAgLyoqPCBEb2luZyBSZWFkLT5EZWNvZGUtPkZpbHRlci0+RW5jb2RlLT5Xcml0ZSBvcGVyYXRpb24gb24gdGhlIGlucHV0IGZpbGUKLSAgICAgKiB0byBjcmVhdGUgdGhlIG91dHB1dCBmaWxlLiAqLwotICAgIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfREVDT0RFX0VOQ09ERSA9IDEyLAotICAgIC8qKjwgQXBwbGllZCB3aGVuIFRyYW5zaXRpb24gaXMgYWN0aXZlIGFuZCBibGVuZGluZyBvZiB0d28gdmlkZW9zIGlzCi0gICAgICogcmVxdWlyZWQuICovCi0gICAgTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9UUkFOU0lUSU9OICAgID0gMTMsCi0gICAgLyoqPCBTcGVjaWFsIFJlYWQvV3JpdGUgbW9kZSB1c2VkIGFmdGVyIEJFR0lOX0NVVCBzdGF0ZS4gVGhlIGZyYW1lCi0gICAgICogaXMgYWxyZWFkeSBjb2RlZCBhcyBJIGZyYW1lIGluIEJFR0lOX0NVVCBzdGF0ZTsgc28gc2tpcCBpdC4gKi8KLSAgICBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0FGVEVSX0NVVCAgICAgPSAxNAotfQotTTRWU1MzR1BQX0VkaXRWaWRlb1N0YXRlOwotCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFZTUzNHUFBfa0VkaXRBdWRpb1N0YXRlX1JFQURfV1JJVEUgICAgPSAyMCwgICAgLyoqPCBEb2luZyBSZWFkL1dyaXRlIG9wZXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobm8gZGVjb2RpbmcvZW5jb2RpbmcpICovCi0gICAgTTRWU1MzR1BQX2tFZGl0QXVkaW9TdGF0ZV9ERUNPREVfRU5DT0RFID0gMjEsICAgIC8qKjwgRG9pbmcgUmVhZC1EZWNvZGUvRmlsdGVyLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5jb2RlLVdyaXRlIG9wZXJhdGlvbiAqLwotICAgIE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfVFJBTlNJVElPTiAgICA9IDIyICAgIC8qKjwgVHJhbnNpdGlvbjsgYmxlbmRpbmcgb2YgdHdvIGF1ZGlvICovCi19Ci1NNFZTUzNHUFBfRWRpdEF1ZGlvU3RhdGU7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICAgICAgTTRWU1MzR1BQX0NsaXBTdGF0dXMKLSAqIEBicmllZiAgICAgICAgU3RhdHVzIG9mIHRoZSBjbGlwLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00VlNTM0dQUF9rQ2xpcFN0YXR1c19SRUFEICAgICAgICAgICAgPSAwLCAgICAvKio8IFRoZSBjbGlwIGlzIGN1cnJlbnRseSByZWFkeSBmb3IgcmVhZGluZyAqLwotICAgIE00VlNTM0dQUF9rQ2xpcFN0YXR1c19ERUNPREUgICAgICAgID0gMSwgICAgLyoqPCBUaGUgY2xpcCBpcyBjdXJyZW50bHkgcmVhZHkgZm9yIGRlY29kaW5nICovCi0gICAgTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERV9VUF9UTyAgICA9IDIgICAgICAgIC8qKjwgVGhlIGNsaXAgaXMgY3VycmVudGx5IGluIHNwbGl0dGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVVcFRvKCkgcHJvY2Vzc2luZyAqLwotfQotTTRWU1MzR1BQX0NsaXBTdGF0dXM7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICAgICAgTTRWU1MzR1BQX0NsaXBDdXJyZW50RWZmZWN0Ci0gKiBAYnJpZWYgICAgICAgIEN1cnJlbnQgZWZmZWN0IGFwcGxpZWQgdG8gdGhlIGNsaXAuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRWU1MzR1BQX2tDbGlwQ3VycmVudEVmZmVjdF9OT05FICAgID0gMCwgICAgLyoqPCBOb25lICovCi0gICAgTTRWU1MzR1BQX2tDbGlwQ3VycmVudEVmZmVjdF9CRUdJTiAgICA9IDEsICAgIC8qKjwgQmVnaW4gZWZmZWN0IGN1cnJlbnRseSBhcHBsaWVkICovCi0gICAgTTRWU1MzR1BQX2tDbGlwQ3VycmVudEVmZmVjdF9FTkQgICAgPSAyICAgICAgICAvKio8IEVuZCBlZmZlY3QgY3VycmVudGx5IGFwcGxpZWQgKi8KLX0KLU00VlNTM0dQUF9DbGlwQ3VycmVudEVmZmVjdDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgICAgICBNNFZTUzNHUFBfQXVkaW9NaXhpbmdTdGF0ZQotICogQGJyaWVmICAgICAgICBNYWluIHN0YXRlIG1hY2hpbmUgb2YgdGhlIFZTUyBhdWRpbyBtaXhpbmcgb3BlcmF0aW9uLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9WSURFTyA9IDAsICAgICAgICAgICAgLyoqPCBWaWRlbyBpcyBiZWluZyBwcm9jZXNzZWQgKi8KLSAgICBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fRklSU1RfU0VHTUVOVCwgIC8qKjwgQXVkaW8gaXMgYmVpbmcgcHJvY2Vzc2VkICovCi0gICAgTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX0FVRElPX1NFQ09ORF9TRUdNRU5ULCAvKio8IEF1ZGlvIGlzIGJlaW5nIHByb2Nlc3NlZCAqLwotICAgIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19USElSRF9TRUdNRU5ULCAgLyoqPCBBdWRpbyBpcyBiZWluZyBwcm9jZXNzZWQgKi8KLSAgICBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfRklOSVNIRUQgICAgICAgICAgICAgIC8qKjwgUHJvY2Vzc2luZyBmaW5pc2hlZCwgdXNlciBtdXN0IG5vdwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbCBNNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwKi8KLX0KLU00VlNTM0dQUF9BdWRpb01peGluZ1N0YXRlOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgICAgIE00VlNTM0dQUF9FeHRyYWN0UGljdHVyZVN0YXRlCi0gKiBAYnJpZWYgICAgICAgIE1haW4gc3RhdGUgbWFjaGluZSBvZiB0aGUgVlNTIHBpY3R1cmUgZXh0cmFjdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFZTUzNHUFBfa0V4dHJhY3RQaWN0dXJlU3RhdGVfT1BFTkVEICAgPSAwLCAgLyoqPCBWaWRlbyBjbGlwIGlzIG9wZW5lZCBhbmQgcmVhZHkgdG8gYmUgcmVhZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnRpbCB0aGUgUkFQIGJlZm9yZSB0aGUgcGljdHVyZSB0byBleHRyYWN0ICovCi0gICAgTTRWU1MzR1BQX2tFeHRyYWN0UGljdHVyZVN0YXRlX1BST0NFU1MgICAgPSAxLCAgLyoqPCBWaWRlbyBpcyBkZWNvZGVkIGZyb20gdGhlIHByZXZpb3VzIFJBUAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgcGljdHVyZSB0byBleHRyYWN0ICovCi0gICAgTTRWU1MzR1BQX2tFeHRyYWN0UGljdHVyZVN0YXRlX0VYVFJBQ1RFRD0gMiAgIC8qKjwgVmlkZW8gQVUgaGFzIGJlZW4gIGRlY29kZWQsIHVzZXIgbXVzdCBub3cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbCBNNFZTUzNHUFBfZXh0cmFjdFBpY3R1cmVDbGVhblVwICovCi19Ci1NNFZTUzNHUFBfRXh0cmFjdFBpY3R1cmVTdGF0ZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgICAgQ29kZWNzIHJlZ2lzdHJhdGlvbiBzYW1lIGFzIGluIFZQUyBhbmQgVkVTLCBzbyBsZXNzIG1hcHBpbmcKLSAqICAgICAgICAgICAgICBpcyByZXF1aXJlZCB0b3dhcmQgVlNTIGFwaSB0eXBlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlKiAgICBwR2xvYmFsRmN0czsgICAgLyoqPCBvcGVuLCBjbG9zZSwgc2V0b3B0aW9uLGV0Yy4uLiBmdW5jdGlvbnMgKi8KLSAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiAgICAgICAgcERhdGFGY3RzOyAgICAgICAgLyoqPCBkYXRhIG1hbmlwdWxhdGlvbiBmdW5jdGlvbnMgKi8KLX0gTTRWU1MzR1BQX1dyaXRlckludGVyZmFjZTsKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0IEFBQ19ERUNfU1RSRUFNX1BST1BTCi0gKiBAYnJpZWYgQUFDIFN0cmVhbSBwcm9wZXJ0aWVzCi0gKiBATm90ZSBhTm9DaGFuIGFuZCBhU2FtcEZyZXEgYXJlIHVzZWQgZm9yIHBhcnNpbmcgZXZlbiB0aGUgdXNlciBwYXJhbWV0ZXJzCi0gKiAgICAgICAgYXJlIGRpZmZlcmVudC4gIFVzZXIgcGFyYW1ldGVycyB3aWxsIGJlIGlucHV0IGZvciB0aGUgb3V0cHV0IGJlaGF2aW91cgotICogICAgICAgIG9mIHRoZSBkZWNvZGVyIHdoZXJlYXMgZm9yIHBhcnNpbmcgYml0c3RyZWFtIHByb3BlcnRpZXMgYXJlIHVzZWQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgTTRPU0FfSW50MzIgYUF1ZGlvT2JqZWN0VHlwZTsgICAgIC8qKjwgQXVkaW8gb2JqZWN0IHR5cGUgb2YgdGhlIHN0cmVhbSAtIGluIGZhY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHR5cGUgZm91bmQgaW4gdGhlIEFjY2VzcyBVbml0IHBhcnNlZCAqLwotICBNNE9TQV9JbnQzMiBhTnVtQ2hhbjsgICAgICAgICAgICAgLyoqPCBudW1iZXIgb2YgY2hhbm5lbHMgKD0xKG1vbm8pIG9yID0yKHN0ZXJlbykpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIGluZGljYXRlZCBieSBpbnB1dCBiaXRzdHJlYW0qLwotICBNNE9TQV9JbnQzMiBhU2FtcEZyZXE7ICAgICAgICAgICAgLyoqPCBzYW1wbGluZyBmcmVxdWVuY3kgaW4gSHogKi8KLSAgTTRPU0FfSW50MzIgYUV4dGVuc2lvblNhbXBGcmVxOyAgIC8qKjwgZXh0ZW5kZWQgc2FtcGxpbmcgZnJlcXVlbmN5IGluIEh6LCA9IDAgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZXh0ZW5kZWQgZnJlcXVlbmN5ICovCi0gIE00T1NBX0ludDMyIGFTQlJQcmVzZW50OyAgICAgICAgICAvKio8IHByZXNlbmNlPTEvYWJzZW5jZT0wIG9mIFNCUiAqLwotICBNNE9TQV9JbnQzMiBhUFNQcmVzZW50OyAgICAgICAgICAgLyoqPCBwcmVzZW5jZT0xL2Fic2VuY2U9MCBvZiBQUyAqLwotICBNNE9TQV9JbnQzMiBhTWF4UENNU2FtcGxlc1BlckNoOyAgLyoqPCBtYXggbnVtYmVyIG9mIFBDTSBzYW1wbGVzIHBlciBjaGFubmVsICovCi19IEFBQ19ERUNfU1RSRUFNX1BST1BTOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgICAgIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dAotICogQGJyaWVmICAgICAgICBGaWxlc3lzdGVtIGFuZCBjb2RlYyByZWdpc3RyYXRpb24gZnVuY3Rpb24gcG9pbnRlcnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgLyoqCi0gICAgICAqIE1lZGlhIGFuZCBDb2RlYyByZWdpc3RyYXRpb24gKi8KLSAgICAvKio8IFRhYmxlIG9mIE00VkVTX1dyaXRlckludGVyZmFjZSBzdHJ1Y3R1cmVzIGZvciBhdmFsYWlibGUgV3JpdGVycyBsaXN0ICovCi0gICAgTTRWU1MzR1BQX1dyaXRlckludGVyZmFjZSAgICBXcml0ZXJJbnRlcmZhY2VbTTRXUklURVJfa1R5cGVfTkJdOwotICAgIC8qKjwgb3BlbiwgY2xvc2UsIHNldG9wdGlvbixldGMuLi4gZnVuY3Rpb25zIG9mIHRoZSB1c2VkIHdyaXRlciovCi0gICAgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlKiAgICBwV3JpdGVyR2xvYmFsRmN0czsKLSAgICAvKio8IGRhdGEgbWFuaXB1bGF0aW9uIGZ1bmN0aW9ucyBvZiB0aGUgdXNlZCB3cml0ZXIgKi8KLSAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiAgICAgICAgcFdyaXRlckRhdGFGY3RzOwotCi0gICAgLyoqPCBUYWJsZSBvZiBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlIHN0cnVjdHVyZXMgZm9yIGF2YWxhaWJsZSBlbmNvZGVycyBsaXN0ICovCi0gICAgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSogICAgcFZpZGVvRW5jb2RlckludGVyZmFjZVtNNEVOQ09ERVJfa1ZpZGVvX05CXTsKLSAgICAvKio8IEZ1bmN0aW9ucyBvZiB0aGUgdXNlZCBlbmNvZGVyICovCi0gICAgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSogICAgcFZpZGVvRW5jb2Rlckdsb2JhbEZjdHM7Ci0KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgcFZpZGVvRW5jb2RlckV4dGVybmFsQVBJVGFibGVbTTRFTkNPREVSX2tWaWRlb19OQl07Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgIHBDdXJyZW50VmlkZW9FbmNvZGVyRXh0ZXJuYWxBUEk7Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgIHBWaWRlb0VuY29kZXJVc2VyRGF0YVRhYmxlW000RU5DT0RFUl9rVmlkZW9fTkJdOwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICBwQ3VycmVudFZpZGVvRW5jb2RlclVzZXJEYXRhOwotCi0gICAgLyoqPCBUYWJsZSBvZiBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2Ugc3RydWN0dXJlcyBmb3IgYXZhbGFpYmxlIGVuY29kZXJzIGxpc3QgKi8KLSAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UqICAgIHBBdWRpb0VuY29kZXJJbnRlcmZhY2VbTTRFTkNPREVSX2tBdWRpb19OQl07Ci0gICAgLyoqPCBUYWJsZSBvZiBpbnRlcm5hbC9leHRlcm5hbCBmbGFncyBmb3IgYXZhbGFpYmxlIGVuY29kZXJzIGxpc3QgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgIHBBdWRpb0VuY29kZXJGbGFnW000RU5DT0RFUl9rQXVkaW9fTkJdOwotICAgIC8qKjwgRnVuY3Rpb25zIG9mIHRoZSB1c2VkIGVuY29kZXIgKi8KLSAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UqICAgIHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzOwotCi0gICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlKiAgIG1fcFJlYWRlckdsb2JhbEl0VGFibGVbTTRSRUFERVJfa01lZGlhVHlwZV9OQl07Ci0gICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSogICAgIG1fcFJlYWRlckRhdGFJdFRhYmxlW000UkVBREVSX2tNZWRpYVR5cGVfTkJdOwotICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSogICBtX3BSZWFkZXI7Ci0gICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSogICAgIG1fcFJlYWRlckRhdGFJdDsKLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgbV91aU5iUmVnaXN0ZXJlZFJlYWRlcnM7Ci0KLSAgICBNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UqICAgbV9wVmlkZW9EZWNvZGVyOwotICAgIE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSogICBtX3BWaWRlb0RlY29kZXJJdFRhYmxlW000REVDT0RFUl9rVmlkZW9UeXBlX05CXTsKLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgbV91aU5iUmVnaXN0ZXJlZFZpZGVvRGVjOwotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICBtX3BDdXJyZW50VmlkZW9EZWNvZGVyVXNlckRhdGE7Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgIG1fcFZpZGVvRGVjb2RlclVzZXJEYXRhVGFibGVbTTRERUNPREVSX2tWaWRlb1R5cGVfTkJdOwotI2VuZGlmCi0KLSAgICBNNEFEX0ludGVyZmFjZSogICAgICAgICAgICAgbV9wQXVkaW9EZWNvZGVyOwotICAgIE00QURfSW50ZXJmYWNlKiAgICAgICAgICAgICAgICBtX3BBdWRpb0RlY29kZXJJdFRhYmxlW000QURfa1R5cGVfTkJdOwotICAgIC8qKjwgc3RvcmUgaW5kaWNlcyBvZiBleHRlcm5hbCBkZWNvZGVycyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgIG1fcEF1ZGlvRGVjb2RlckZsYWdUYWJsZVtNNEFEX2tUeXBlX05CXTsKLQotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgIHBBdWRpb0VuY29kZXJVc2VyRGF0YVRhYmxlW000RU5DT0RFUl9rQXVkaW9fTkJdOwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgIHBDdXJyZW50QXVkaW9FbmNvZGVyVXNlckRhdGE7Ci0KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICBwQXVkaW9EZWNvZGVyVXNlckRhdGFUYWJsZVtNNEFEX2tUeXBlX05CXTsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICBwQ3VycmVudEF1ZGlvRGVjb2RlclVzZXJEYXRhOwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0gICAgLyogYm9vbGVhbiB0byB0ZWxsIHdoZXRoZXIgcmVnaXN0ZXJlZCBleHRlcm5hbCBPTVggY29kZWNzIHNob3VsZCBiZSBmcmVlZCBkdXJpbmcgY2xlYW51cAotICAgICBvciBuZXcgY29kZWMgcmVnaXN0cmF0aW9uKi8KLSAgICBNNE9TQV9Cb29sICAgIGJBbGxvd0ZyZWVpbmdPTVhDb2RlY0ludGVyZmFjZTsKLSNlbmRpZgotCi0KLX0gTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dAotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBpbmZvcm1hdGlvbnMgcmVsYXRlZCB0byBvbmUgM0dQUCBjbGlwIChwcml2YXRlKQotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gc3RvcmUgdGhlIGNvbnRleHQgcmVsYXRlZCB0byBvbmUgY2xpcAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyogICAgICAgIHBTZXR0aW5nczsgICAgICAgICAgICAvKio8IFBvaW50ZXIgdG8gdGhlIGNsaXAgc2V0dGluZ3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChub3QgcG9zc2Vzc2VkKSAqLwotCi0gICAgTTRWU1MzR1BQX0NsaXBTdGF0dXMgICAgICAgIFZzdGF0dXM7ICAgICAgICAgICAgLyoqPCBWaWRlbyBzdGF0dXMgb2YgdGhlIGNsaXAgcmVhZGluZyAqLwotICAgIE00VlNTM0dQUF9DbGlwU3RhdHVzICAgICAgICBBc3RhdHVzOyAgICAgICAgICAgIC8qKjwgQXVkaW8gc3RhdHVzIG9mIHRoZSBjbGlwIHJlYWRpbmcgKi8KLQotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICAgICBpVm9mZnNldDsgICAgICAgICAgICAvKio8IFtNaWxsaXNlY29uZHNdIE9mZnNldCBiZXR3ZWVuIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcCBhbmQgdGhlIG91dHB1dCB2aWRlbyBzdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiZWdpbiBjdXQgdGFrZW4gaW50byBhY2NvdW50KSAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICAgICBpQW9mZnNldDsgICAgICAgICAgIC8qKjwgW1RpbWVzY2FsZV0gT2Zmc2V0IGJldHdlZW4gdGhlIGNsaXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgb3V0cHV0IGF1ZGlvIHN0cmVhbSAoYmVnaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1dCB0YWtlbiBpbnRvIGFjY291bnQpICovCi0KLSAgICAvKioKLSAgICAgKiAzR1BQIHJlYWRlciBTdHVmZiAqLwotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogICAgICAgIHBGaWxlUmVhZFB0ckZjdDsKLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgICAgICAgIHBSZWFkZXJDb250ZXh0OyAgICAgICAgIC8qKjwgQ29udGV4dCBvZiB0aGUgM0dQUCByZWFkZXIgbW9kdWxlICovCi0gICAgTTRfVmlkZW9TdHJlYW1IYW5kbGVyKiAgICAgICAgcFZpZGVvU3RyZWFtOyAgICAgICAgLyoqPCBEZXNjcmlwdGlvbiBvZiB0aGUgcmVhZCB2aWRlbyBzdHJlYW0gKi8KLSAgICBNNF9BdWRpb1N0cmVhbUhhbmRsZXIqICAgICAgICBwQXVkaW9TdHJlYW07ICAgICAgICAvKio8IERlc2NyaXB0aW9uIG9mIHRoZSByZWFkIGF1ZGlvIHN0cmVhbSAqLwotICAgIE00X0FjY2Vzc1VuaXQgICAgICAgICAgICAgICAgVmlkZW9BVTsgICAgICAgICAgICAvKio8IFJlYWQgdmlkZW8gYWNjZXNzIHVuaXQgKHdlIGRvIG5vdCB1c2UgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciB0byBhbGxvY2F0ZSBsYXRlciwgYmVjYXVzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9zdCBvZiB0aGUgdGltZSB3ZSB3aWxsIG5lZWQgaXQpICovCi0gICAgTTRfQWNjZXNzVW5pdCAgICAgICAgICAgICAgICBBdWRpb0FVOyAgICAgICAgICAgIC8qKjwgUmVhZCBhdWRpbyBhY2Nlc3MgdW5pdCAod2UgZG8gbm90IHVzZSBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIGFsbG9jYXRlIGxhdGVyLCBiZWNhdXNlIG1vc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSB0aW1lIHdlIHdpbGwgbmVlZCBpdCkgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICBiVmlkZW9BdUF2YWlsYWJsZTsgICAgLyoqPCBUZWxsIGlmIGEgdmlkZW8gQVUgaXMgYXZhaWxhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJldmlvdXNseSByZWFkKSAqLwotICAgIC8qKjwgQm9vbGVhbiBvbmx5IHVzZWQgdG8gZml4IHRoZSBCWlogYnVnLi4uICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgYkZpcnN0QXVXcml0dGVuOwotCi0gICAgLyoqCi0gICAgICogVmlkZW8gZGVjb2RlciBzdHVmZiAqLwotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgICAgICAgcFZpRGVjQ3R4dDsgICAgICAgICAgICAvKio8IFZpZGVvIGRlY29kZXIgY29udGV4dCAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICBpVmlkZW9EZWNDdHM7ICAgICAgIC8qKjwgW01pbGxpc2Vjb25kc10gRm9yIHZpZGVvIGRlY29kZVVwVG8oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYWN0dWFsIHJlYWNoZWQgY3RzICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgICAgIGlWaWRlb1JlbmRlckN0czsgICAgLyoqPCBbTWlsbGlzZWNvbmRzXSBGb3IgdmlkZW8gcmVuZGVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFjdHVhbCByZWFjaGVkIGN0cyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgIGlzUmVuZGVyRHVwOyAgICAgICAgLyoqPCBUbyBoYW5kbGUgZHVwbGljYXRlIGZyYW1lIHJlbmRlcmluZyBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugb2YgZXh0ZXJuYWwgZGVjb2RpbmcgKi8KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSogICAgICAgICAgICBsYXN0RGVjb2RlZFBsYW5lOyAgICAvKio8IExhc3QgZGVjb2RlZCBwbGFuZSAqLwotCi0gICAgLyoqCi0gICAgICogTVBFRzQgdGltZSBpbmZvIHN0dWZmIGF0IGNsaXAgbGV2ZWwgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgIGJNcGVnNEdvdlN0YXRlOyAgICAgICAgICAgIC8qKjwgTmFtZWx5LCB1cGRhdGUgb3IgaW5pdGlhbGl6YXRpb24gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgIHVpTXBlZzRQcmV2R292VmFsdWVHZXQ7ICAgIC8qKjwgUHJldmlvdXMgR292IHZhbHVlIHJlYWQgKGluIHNlY29uZCkgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgIHVpTXBlZzRQcmV2R292VmFsdWVTZXQ7ICAgIC8qKjwgUHJldmlvdXMgR292IHZhbHVlIHdyaXRlIChpbiBzZWNvbmQpICovCi0KLSAgICAvKioKLSAgICAgKiBUaW1lLWxpbmUgc3R1ZmYgKi8KLSAgICAgLyoqPCBbTWlsbGlzZWNvbmRzXSBDVFMgYXQgd2hpY2ggdGhlIHZpZGVvIGNsaXAgYWN0dWFsbHkgc3RhcnRzICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgICAgIGlBY3R1YWxWaWRlb0JlZ2luQ3V0OwotICAgIC8qKjwgW01pbGxpc2Vjb25kc10gQ1RTIGF0IHdoaWNoIHRoZSBhdWRpbyBjbGlwIGFjdHVhbGx5IHN0YXJ0cyAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICAgICBpQWN0dWFsQXVkaW9CZWdpbkN1dDsKLSAgICAvKio8IFtNaWxsaXNlY29uZHNdIFRpbWUgYXQgd2hpY2ggdGhlIGNsaXAgbXVzdCBlbmQgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgICAgaUVuZFRpbWU7Ci0KLSAgICAvKioKLSAgICAgKiBBdWRpbyBkZWNvZGVyIHN0dWZmICovCi0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgICAgICAgICBwQXVkaW9EZWNDdHh0OyAgICAgICAgLyoqPCBDb250ZXh0IG9mIHRoZSBBTVIgZGVjb2RlciAqLwotICAgIE00QURfQnVmZmVyICAgICAgICAgICAgICAgICBBdWRpb0RlY0J1ZmZlckluOyAgICAvKio8IElucHV0IHN0cnVjdHVyZSBmb3IgdGhlIGF1ZGlvIGRlY29kZXIgKi8KLSAgICBNNEFEX0J1ZmZlciAgICAgICAgICAgICAgICAgICAgQXVkaW9EZWNCdWZmZXJPdXQ7ICAgIC8qKjwgQnVmZmVyIGZvciB0aGUgZGVjb2RlZCBQQ00gZGF0YSAqLwotICAgIEFBQ19ERUNfU1RSRUFNX1BST1BTICAgICAgICBBYWNQcm9wZXJ0aWVzOyAgICAgIC8qKjwgU3RydWN0dXJlIGZvciBuZXcgYXBpIHRvIGdldCBBQUMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgKi8KLQotICAgIC8qKgotICAgICAqIEF1ZGlvIEFVIHRvIEZyYW1lIHNwbGl0IHN0dWZmICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICBiQXVkaW9GcmFtZUF2YWlsYWJsZTsgIC8qKjwgVHJ1ZSBpZiBhbiBhdWRpbyBmcmFtZSBpcyBhdmFpbGFibGUgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgICAgIHBBdWRpb0ZyYW1lUHRyOyAgICAgICAgLyoqPCBQb2ludGVyIHRvIHRoZSBBdWRpbyBmcmFtZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgdWlBdWRpb0ZyYW1lU2l6ZTsgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgYXVkaW8gZnJhbWUgYXZhaWxhYmxlICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICBpQXVkaW9GcmFtZUN0czsgICAgICAgLyoqPCBbVGltZXNjYWxlXSBDVFMgb2YgdGhlIGF1ZGlvIGZyYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgKi8KLQotICAgIC8qKgotICAgICAqIFNpbGVuY2UgZnJhbWUgc3R1ZmYgKi8KLSAgICAgLyoqPCBTaXplIHRvIHJlc2VydmUgdG8gc3RvcmUgYSBwY20gZnVsbCBvZiB6ZXJvcyBjb21wYXRpYmxlIHdpdGggbWFzdGVyIGNsaXAgc3RyZWFtIHR5cGUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlTaWxlbmNlUGNtU2l6ZTsKLSAgICAvKio8IFBvaW50ZXIgdG8gc2lsZW5jZSBmcmFtZSBkYXRhIGNvbXBhdGlibGUgd2l0aCBtYXN0ZXIgY2xpcCBzdHJlYW0gdHlwZSAqLwotICAgIE00T1NBX1VJbnQ4KiAgICAgICAgICAgICAgICBwU2lsZW5jZUZyYW1lRGF0YTsKLSAgICAvKio8IFNpemUgb2Ygc2lsZW5jZSBmcmFtZSBkYXRhIGNvbXBhdGlibGUgd2l0aCBtYXN0ZXIgY2xpcCBzdHJlYW0gdHlwZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aVNpbGVuY2VGcmFtZVNpemU7Ci0gICAgLyoqPCBbVGltZXNjYWxlXSBEdXJhdGlvbiBvZiBzaWxlbmNlIGZyYW1lIGRhdGEgY29tcGF0aWJsZSB3aXRoIG1hc3RlciBjbGlwIHN0cmVhbSB0eXBlICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgIGlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLSAgICBNNE9TQV9Eb3VibGUgICAgICAgICAgICAgICAgc2NhbGVfYXVkaW87ICAgICAgICAgICAgLyoqPCBmcmVxdWVuY3kgLyAxMDAwLjAgKi8KLQotICAgIC8qKgotICAgICAqIEludGVyZmFjZXMgb2YgdGhlIHVzZWQgbW9kdWxlcyAqLwotICAgICAvKio8IEZpbGVzeXN0ZW0gYW5kIHNoZWxsIHJlYWRlciwgZGVjb2RlciBmdW5jdGlvbnMgKi8KLSAgICBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgU2hlbGxBUEk7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgICAgICAgICAgICpwUGxhbmVZdXY7ICAvKiBZVVY0MjAgaW1hZ2UgcGxhbmUsIGNvbnZlcnRlZCBmcm9tIEFSR0I4ODggKi8KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSogICAgICAgICAgbV9wUHJlUmVzaXplRnJhbWU7ICAvKiBUaGUgZGVjb2RlZCBpbWFnZSBiZWZvcmUgcmVzaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb2NhdGVkIG9ubHkgaWYgcmVzaXplIG5lZWRlZCkqLwotICAgIE00VklGSV9JbWFnZVBsYW5lICAgICAgICAgICAqcFBsYW5lWXV2V2l0aEVmZmVjdDsgLyogWVVWNDIwIGltYWdlIHBsYW5lLCB3aXRoIGNvbG9yIGVmZmVjdCAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICBiR2V0WXV2RGF0YUZyb21EZWNvZGVyOyAgLyogQm9vbGVhbiB1c2VkIHRvIGdldCBZVVYgZGF0YSBmcm9tIGR1bW15IHZpZGVvIGRlY29kZXIgb25seSBmb3IgZmlyc3QgdGltZSAqLwotfSBNNFZTUzNHUFBfQ2xpcENvbnRleHQ7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICAgICAgYW5vbnltb3VzIGVudW0KLSAqIEBicmllZiAgICAgICAgZW51bSB0byBrZWVwIHRyYWNrIG9mIHRoZSBlbmNvZGVyIHN0YXRlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotZW51bQotewotICAgIE00VlNTM0dQUF9rTm9FbmNvZGVyLAotICAgIE00VlNTM0dQUF9rRW5jb2RlckNsb3NlZCwKLSAgICBNNFZTUzNHUFBfa0VuY29kZXJTdG9wcGVkLAotICAgIE00VlNTM0dQUF9rRW5jb2RlclJ1bm5pbmcKLX07Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00VlNTM0dQUF9BdWRpb1ZpZGVvQ29udGV4dAotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBhdWRpbyB2aWRlbyBjb250ZXh0IChwcml2YXRlKQotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIGFsbCBhdWRpby92aWRlbywgZW5jb2Rpbmcvd3JpdGluZyBvcGVyYXRpb25zLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyoqCi0gICAgICogVGltaW5nIFN0dWZmICovCi0gICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAvKio8IFtNaWxsaXNlY29uZHNdIER1cmF0aW9uIG9mIHRoZSBvdXRwdXQgZmlsZSwgdXNlZCBmb3IgcHJvZ3Jlc3MgY29tcHV0YXRpb24gKi8KLSAgICBNNE9TQV9Eb3VibGUgICAgICAgICAgICAgICAgZElucHV0VmlkQ3RzOwotICAgIC8qKjwgW01pbGxpc2Vjb25kc10gQ3VycmVudCBDVFMgb2YgdGhlIHZpZGVvIG91dHB1dCBzdHJlYW0gKi8KLSAgICBNNE9TQV9Eb3VibGUgICAgICAgICAgICAgICAgZE91dHB1dFZpZEN0czsKLS8qKjwgW01pbGxpc2Vjb25kc10gQ3VycmVudCBDVFMgb2YgdGhlIGF1ZGlvIG91dHB1dCBzdHJlYW0gKi8KLSAgICBNNE9TQV9Eb3VibGUgICAgICAgICAgICAgICAgZEFUbzsKLSAgICAgLyoqPCBbTWlsbGlzZWNvbmRzXSBEdXJhdGlvbiBvZiB0aGUgb3V0cHV0IGZpbGUsIHVzZWQgZm9yIHByb2dyZXNzIGNvbXB1dGF0aW9uICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgICAgIGlPdXRwdXREdXJhdGlvbjsKLQotICAgIC8qKgotICAgICAqIE91dHB1dCBWaWRlbyBTdHJlYW0gU3R1ZmYgKi8KLSAgICBNNFNZU19TdHJlYW1UeXBlICAgICAgICAgICAgVmlkZW9TdHJlYW1UeXBlOyAgICAgICAgLyoqPCBPdXRwdXQgdmlkZW8gY29kZWMgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgb3V0cHV0VmlkZW9Qcm9maWxlOyAgLyoqPCBPdXRwdXQgdmlkZW8gcHJvZmlsZSAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICBvdXRwdXRWaWRlb0xldmVsOyAgIC8qKjwgT3V0cHV0IHZpZGVvIGxldmVsICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpVmlkZW9CaXRyYXRlOyAgICAgLyoqPCBBdmVyYWdlIHZpZGVvIGJpdHJhdGUgb2YgdGhlIG91dHB1dCBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZWQgZnJvbSBpbnB1dCBiaXRyYXRlcywgZHVyYXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25zIGFuZCBjdXRzICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpVmlkZW9XaWR0aDsgICAgICAgICAgICAvKio8IE91dHB1dCBpbWFnZSB3aWR0aCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aVZpZGVvSGVpZ2h0OyAgICAgICAgICAgIC8qKjwgT3V0cHV0IGltYWdlIGhlaWdodCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aVZpZGVvVGltZVNjYWxlOyAgICAgICAgLyoqPCBUaW1lIHNjYWxlIHRvIHVzZSBmb3IgdGhlIGVuY29kaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgdHJhbnNpdGlvbiAoaWYgTVBFRy00KSAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgIGJWaWRlb0RhdGFQYXJ0aXRpb25pbmc7ICAgIC8qKjwgRGF0YSBwYXJ0aXRpb25pbmcgdG8gdXNlIGZvciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2Rpbmcgb2YgdGhlIHRyYW5zaXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmIE1QRUctNCkgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgICAgICAgICBwVmlkZW9PdXRwdXREc2k7ICAgICAgICAvKio8IERlY29kZXIgU3BlY2lmaWMgSW5mbyBvZiB0aGUgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QRUctNCB0cmFjayAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgICAgICAgICB1aVZpZGVvT3V0cHV0RHNpU2l6ZTsgICAgLyoqPCBTaXplIG9mIHRoZSBEZWNvZGVyIFNwZWNpZmljIEluZm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgb3V0cHV0IE1QRUctNCB0cmFjayAqLwotICAgIC8qKgotICAgICAqIE91dHB1dCBBdWRpbyBTdHJlYW0gU3R1ZmYgKi8KLSAgICBNNFNZU19TdHJlYW1UeXBlICAgICAgICAgICAgQXVkaW9TdHJlYW1UeXBlOyAgICAgICAgLyoqPCBUeXBlIG9mIHRoZSBvdXRwdXQgYXVkaW8gc3RyZWFtICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpTmJDaGFubmVsczsgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSAoMT1tb25vLCAyPXN0ZXJlbykgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlBdWRpb0JpdHJhdGU7ICAgICAgICAgLyoqPCBBdWRpbyBhdmVyYWdlIGJpdHJhdGUgKGluIGJwcykgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlTYW1wbGluZ0ZyZXF1ZW5jeTsgICAgLyoqPCBTYW1wbGluZyBhdWRpbyBmcmVxdWVuY3kgKDgwMDAgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1yLCAxNjAwMCBvciBtb3JlIGZvciBhYWMpICovCi0gICAgTTRPU0FfTWVtQWRkcjggICAgICAgICAgICAgICAgcEF1ZGlvT3V0cHV0RHNpOyAgICAgICAgLyoqPCBEZWNvZGVyIFNwZWNpZmljIEluZm8gb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGF1ZGlvIHRyYWNrICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICAgICAgICAgIHVpQXVkaW9PdXRwdXREc2lTaXplOyAgICAvKio8IFNpemUgb2YgdGhlIERlY29kZXIgU3BlY2lmaWMgSW5mbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBvdXRwdXQgYXVkaW8gdHJhY2sgKi8KLQotICAgIC8qKgotICAgICAqIEF1ZGlvIEVuY29kZXIgc3R1ZmYgKi8KLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgICAgICAgICAgIHBBdWRpb0VuY0N0eHQ7ICAgICAgICAvKio8IENvbnRleHQgb2YgdGhlIGF1ZGlvIGVuY29kZXIgKi8KLSAgICBNNEVOQ09ERVJfQXVkaW9EZWNTcGVjaWZpY0luZm8gIHBBdWRpb0VuY0RTSTsgICAgICAgLyoqPCBEZWNvZGVyIHNwZWNpZmljIGluZm8gYnVpbHQgYnkgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlciAqLwotICAgIE00RU5DT0RFUl9BdWRpb1BhcmFtcyAgICAgICAgICAgQXVkaW9FbmNQYXJhbXM7ICAgICAvKio8IENvbmZpZyBvZiB0aGUgYXVkaW8gZW5jb2RlciAqLwotCi0gICAgLyoqCi0gICAgICogU2lsZW5jZSBmcmFtZSBzdHVmZiAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aVNpbGVuY2VQY21TaXplOyAgICAgICAvKio8IFNpemUgdG8gcmVzZXJ2ZSB0byBzdG9yZSBhIHBjbSBmdWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgemVyb3MgY29tcGF0aWJsZSB3aXRoIG1hc3RlciBjbGlwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIHR5cGUgKi8KLSAgICBNNE9TQV9VSW50OCogICAgICAgICAgICAgICAgcFNpbGVuY2VGcmFtZURhdGE7ICAgICAgLyoqPCBQb2ludGVyIHRvIHNpbGVuY2UgZnJhbWUgZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhdGlibGUgd2l0aCBtYXN0ZXIgY2xpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSB0eXBlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpU2lsZW5jZUZyYW1lU2l6ZTsgICAgIC8qKjwgU2l6ZSBvZiBzaWxlbmNlIGZyYW1lIGRhdGEgY29tcGF0aWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggbWFzdGVyIGNsaXAgc3RyZWFtIHR5cGUgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgaVNpbGVuY2VGcmFtZUR1cmF0aW9uOyAgLyoqPCBbVGltZXNjYWxlXSBEdXJhdGlvbiBvZiBzaWxlbmNlIGZyYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgY29tcGF0aWJsZSB3aXRoIG1hc3RlciBjbGlwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSB0eXBlICovCi0gICAgTTRPU0FfRG91YmxlICAgICAgICAgICAgICAgIHNjYWxlX2F1ZGlvOyAgICAgICAgICAgIC8qKjwgZnJlcXVlbmN5IC8gMTAwMC4wICovCi0KLSAgICAvKioKLSAgICAgKiBWaWRlbyBFbmNvZGVyIHN0dWZmICovCi0gICAgTTRFTkNPREVSX0NvbnRleHQgICAgICAgICAgICBwRW5jQ29udGV4dDsgICAgICAgICAgICAvKio8IENvbnRleHQgb2YgdGhlIGVuY29kZXIgKi8KLSAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlICAgICAgICBPdXJXcml0ZXJEYXRhSW50ZXJmYWNlOyAgICAvKio8IE91ciBvd24gaW1wbGVtZW50YXRpb24gb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlciBpbnRlcmZhY2UsIHRvIGdpdmUgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGVuY29kZXIgc2hlbGwgKi8KLSAgICBNNE9TQV9NZW1BZGRyMzIgICAgICAgICAgICAgICAgcER1bW15QXVCdWZmZXI7ICAgICAgICAgICAgLyoqPCBCdWZmZXIgZ2l2ZW4gdG8gdGhlIGVuY29kZXIgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgdG8gd3JpdGUgQVVzIHdlIGRvbid0IHdhbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIG91dHB1dCAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICAgICBpTXBlZzRHb3ZPZmZzZXQ7ICAgICAgICAvKio8IENsaXAgR09WIG9mZnNldCBpbiBtcyBiZXR3ZWVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvIGFuZCBzeXN0ZW0gdGltZSAqLwotICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgICAgICAgVnBwRXJyb3I7ICAgICAgICAgICAgICAgIC8qKjwgRXJyb3IgZm9yIFZQUCBhcmUgbWFza2VkIGJ5IFZpZGVvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmNvZGVyLCBzbyB3ZSBtdXN0IHJlbWVtYmVyIGl0ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIGVuY29kZXJTdGF0ZTsKLQotICAgIC8qKgotICAgICAqIFdyaXRlciBzdHVmZiAqLwotICAgIE00V1JJVEVSX0NvbnRleHQgICAgICAgICAgICBwM2dwV3JpdGVyQ29udGV4dDsgICAgICAgIC8qKjwgQ29udGV4dCBvZiB0aGUgM0dQUCB3cml0ZXIgbW9kdWxlICovCi0gICAgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24gICAgICAgIFdyaXRlclZpZGVvU3RyZWFtOyAgICAgICAgLyoqPCBEZXNjcmlwdGlvbiBvZiB0aGUgd3JpdHRlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlbyBzdHJlYW0gKi8KLSAgICBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiAgICAgICAgV3JpdGVyQXVkaW9TdHJlYW07ICAgICAgICAvKio8IERlc2NyaXB0aW9uIG9mIHRoZSB3cml0dGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIHN0cmVhbSAqLwotICAgIE00V1JJVEVSX1N0cmVhbVZpZGVvSW5mb3MgICAgV3JpdGVyVmlkZW9TdHJlYW1JbmZvOyAgICAvKio8IFZpZGVvIHByb3BlcnRpZXMgb2YgdGhlIHdyaXR0ZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvIHN0cmVhbSAqLwotICAgIE00V1JJVEVSX1N0cmVhbUF1ZGlvSW5mb3MgICAgV3JpdGVyQXVkaW9TdHJlYW1JbmZvOyAgICAvKio8IEF1ZGlvIHByb3BlcnRpZXMgb2YgdGhlIHdyaXR0ZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gc3RyZWFtICovCi0gICAgTTRTWVNfQWNjZXNzVW5pdCAgICAgICAgICAgIFdyaXRlclZpZGVvQVU7ICAgICAgICAgICAgLyoqPCBXcml0dGVuIHZpZGVvIGFjY2VzcyB1bml0ICovCi0gICAgTTRTWVNfQWNjZXNzVW5pdCAgICAgICAgICAgIFdyaXRlckF1ZGlvQVU7ICAgICAgICAgICAgLyoqPCBXcml0dGVuIGF1ZGlvIGFjY2VzcyB1bml0ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpVmlkZW9NYXhBdVNpemU7ICAgICAgICAvKio8IE1heCBBVSBzaXplIHNldCB0byB0aGUgd3JpdGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSB2aWRlbyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aUF1ZGlvTWF4QXVTaXplOyAgICAgICAgLyoqPCBNYXggQVUgc2l6ZSBzZXQgdG8gdGhlIHdyaXRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgYXVkaW8gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlPdXRwdXRBdmVyYWdlVmlkZW9CaXRyYXRlOyAvKio8IEF2ZXJhZ2UgdmlkZW8gYml0cmF0ZSBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGZpbGUsIGNvbXB1dGVkIGZyb20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgYml0cmF0ZXMsIGR1cmF0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbnMgYW5kIGN1dHMgKi8KLQotfSBNNFZTUzNHUFBfRW5jb2RlV3JpdGVDb250ZXh0OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0Ci0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGVkaXQgVlNTIGNvbnRleHQgKHByaXZhdGUpCi0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgYWxsIFZTUyBlZGl0IG9wZXJhdGlvbnMgdG8gc3RvcmUgdGhlIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qKgotICAgICAqIFZTUyAzR1BQIG1haW4gdmFyaWFibGVzICovCi0gICAgTTRWU1MzR1BQX0VkaXRTdGF0ZSAgICAgICAgIFN0YXRlOyAgICAgICAgICAgICAgICAgICAgLyoqPCBWU1MgaW50ZXJuYWwgc3RhdGUgKi8KLSAgICBNNFZTUzNHUFBfRWRpdFZpZGVvU3RhdGUgICAgVnN0YXRlOwotICAgIE00VlNTM0dQUF9FZGl0QXVkaW9TdGF0ZSAgICBBc3RhdGU7Ci0KLSAgICAvKioKLSAgICAgKiBVc2VyIFNldHRpbmdzIChjb3BpZWQsIHRodXMgb3duZWQgYnkgVlNTM0dQUCkgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgICAgIHVpQ2xpcE51bWJlcjsgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnQgb2YgdGhlIGNsaXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCBwQ2xpcExpc3QuICovCi0gICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAgICAgICAgICAgKnBDbGlwTGlzdDsgICAgICAgICAgICAvKio8IExpc3Qgb2YgdGhlIGlucHV0IGNsaXBzIHNldHRpbmdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheSBvZiB1aUNsaXBOdW1iZXIgY2xpcCBzZXR0aW5ncyAqLwotICAgIE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MgICAqcFRyYW5zaXRpb25MaXN0OyAgICAvKio8IExpc3Qgb2YgdGhlIHRyYW5zaXRpb24gc2V0dGluZ3MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkgb2YgdWlDbGlwTnVtYmVyLTEgdHJhbnNpdGlvbiBzZXR0aW5ncyAqLwotICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyAgICAgICAqcEVmZmVjdHNMaXN0OyAgICAgICAgLyoqPCBMaXN0IG9mIHRoZSBlZmZlY3RzIHNldHRpbmdzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5IG9mIG5iRWZmZWN0cyBSQyAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICAgICAqcEFjdGl2ZUVmZmVjdHNMaXN0OyAgICAvKio8IExpc3Qgb2YgdGhlIGFjdGl2ZSBlZmZlY3RzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuIEFycmF5IG9mIG5iRWZmZWN0cyBSQyAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICAgICAgbmJFZmZlY3RzOyAgICAgICAgICAgIC8qKjwgTnVtYmVycyBvZiBlZmZlY3RzIFJDICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgICAgICBuYkFjdGl2ZUVmZmVjdHM7ICAgIC8qKjwgTnVtYmVycyBvZiBhY3RpdmUgZWZmZWN0cyBSQyAqLwotCi0gICAgLyoqCi0gICAgICogSW5wdXQgU3R1ZmYgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgICAgIHVpQ3VycmVudENsaXA7ICAgICAgICAvKio8IEluZGV4IG9mIHRoZSBjdXJyZW50IGNsaXAgMSBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW5wdXQgY2xpcCBsaXN0ICovCi0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0KiAgICAgICAgICAgIHBDMTsgICAgICAgICAgICAgICAgLyoqPCBDb250ZXh0IG9mIHRoZSBjdXJyZW50IGNsaXAgMSAqLwotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCogICAgICAgICAgICBwQzI7ICAgICAgICAgICAgICAgIC8qKjwgQ29udGV4dCBvZiB0aGUgY3VycmVudCBjbGlwIDIgKi8KLQotICAgIC8qKgotICAgICAqIERlY29kZXIgc3R1ZmYgKi8KLSAgICBNNE9TQV9Eb3VibGUgICAgICAgICAgICAgICAgZE91dHB1dEZyYW1lRHVyYXRpb247ICAgIC8qKjwgW01pbGxpc2Vjb25kc10gZGlyZWN0bHkgcmVsYXRlZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgZnJhbWUgcmF0ZSAqLwotICAgIE00VklGSV9JbWFnZVBsYW5lICAgICAgICAgICAgeXV2MVszXTsgICAgICAgICAgICAvKio8IEZpcnN0IHRlbXBvcmFyeSBZVVY0MjAgaW1hZ2UgcGxhbmUgKi8KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAgICAgICAgICAgIHl1djJbM107ICAgICAgICAgICAgLyoqPCBTZWNvbmQgdGVtcG9yYXJ5IFlVVjQyMCBpbWFnZSBwbGFuZSAqLwotICAgIE00VklGSV9JbWFnZVBsYW5lICAgICAgICAgICAgeXV2M1szXTsgICAgICAgICAgICAvKio8IFRoaXJkIHRlbXBvcmFyeSBZVVY0MjAgaW1hZ2UgcGxhbmUgUkMgKi8KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAgICAgICAgICAgIHl1djRbM107ICAgICAgICAgICAgLyoqPCBGb3VydGggdGVtcG9yYXJ5IFlVVjQyMCBpbWFnZSBwbGFuZSBSQyAqLwotCi0gICAgLyoqCi0gICAgICogRWZmZWN0IHN0dWZmICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgYkNsaXAxQXRCZWdpbkN1dDsgICAgICAgIC8qKjwgW01pbGxpc2Vjb25kc10gVGhlIGNsaXAxIGlzIGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRzIGJlZ2luIGN1dCAqLwotICAgIE00T1NBX0ludDggICAgICAgICAgICAgICAgICAgIGlDbGlwMUFjdGl2ZUVmZmVjdDsgICAgICAgIC8qKjwgVGhlIGluZGV4IG9mIHRoZSBhY3RpdmUgZWZmZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIENsaXAxICg8MCBtZWFucyBub25lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXNlZCBmb3IgdmlkZW8gYW5kIGF1ZGlvIGJ1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IHNpbXVsdGFuZW91c2x5KSAqLwotICAgIE00T1NBX0ludDggICAgICAgICAgICAgICAgICAgIGlDbGlwMkFjdGl2ZUVmZmVjdDsgICAgICAgIC8qKjwgVGhlIGluZGV4IG9mIHRoZSBhY3RpdmUgZWZmZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIENsaXAyICg8MCBtZWFucyBub25lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXNlZCBmb3IgdmlkZW8gYW5kIGF1ZGlvIGJ1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3Qgc2ltdWx0YW5lb3VzbHkpICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgYlRyYW5zaXRpb25FZmZlY3Q7ICAgICAgICAvKio8IFRydWUgaWYgdGhlIHRyYW5zaXRpb24gZWZmZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgYXBwbGllZCBhdCB0aGUgY3VycmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lICovCi0KLSAgICAvKioKLSAgICAgKiBFbmNvZGluZyBhbmQgV3JpdGluZyBvcGVyYXRpb25zICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICBiU3VwcG9ydFNpbGVuY2U7ICAgIC8qKjwgRmxhZyB0byBrbm93IGlmIHRoZSBvdXRwdXQgc3RyZWFtIGNhbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQgc2lsZW5jZSAoZXZlbiBpZiBub3QgZWRpdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBleGFtcGxlIEFBQyssIGJ1dCBub3QgRVZSQykgKi8KLSAgICBNNFZTUzNHUFBfRW5jb2RlV3JpdGVDb250ZXh0ICAgIGV3YzsgICAgICAgICAgICAgICAgLyoqPCBBdWRpbyBhbmQgdmlkZW8gZW5jb2RlL3dyaXRlIHN0dWZmICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgIGJJc01NUzsgICAgICAgICAgICAgICAgLyoqPCBCb29sZWFuIHVzZWQgdG8ga25vdyBpZiB3ZSBhcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nIGEgZmlsZSB3aXRoIGFuIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgY29uc3RyYWludCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgdWlNTVNWaWRlb0JpdHJhdGU7ICAgIC8qKjwgSWYgaW4gTU1TIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldGVkIHZpZGVvIGJpdHJhdGUgKi8KLSAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lcmF0ZSAgICBNTVN2aWRlb0ZyYW1lcmF0ZTsgICAgLyoqPCBJZiBpbiBNTVMgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ZWQgdmlkZW8gZnJhbWVyYXRlICovCi0KLSAgICAvKioKLSAgICAgKiBGaWxlc3lzdGVtIGZ1bmN0aW9ucyAqLwotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogICAgICAgIHBPc2FGaWxlUmVhZFB0cjsgICAgIC8qKjwgT1NBTCBmaWxlIHJlYWQgZnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHByb3ZpZGVkIGJ5IHVzZXIgKi8KLSAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogICAgcE9zYUZpbGVXcml0UHRyOyAgICAgLyoqPCBPU0FMIGZpbGUgd3JpdGUgZnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHByb3ZpZGVkIGJ5IHVzZXIgKi8KLQotICAgIC8qKgotICAgICAqIEludGVyZmFjZXMgb2YgdGhlIHVzZWQgbW9kdWxlcyAqLwotICAgIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAgICAgICAgIFNoZWxsQVBJOyAgICAgICAgICAgLyoqPCBGaWxlc3lzdGVtIGFuZCBzaGVsbCByZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXIgZnVuY3Rpb25zICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgIGJJc3NlY29uZENsaXA7Ci0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICpwQWN0aXZlRWZmZWN0c0xpc3QxOyAgLyoqPCBMaXN0IG9mIHRoZSBhY3RpdmUgZWZmZWN0cyBzZXR0aW5ncy4gQXJyYXkgb2YgbmJFZmZlY3RzIFJDICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgIG5iQWN0aXZlRWZmZWN0czE7ICAvKio8IE51bWJlcnMgb2YgYWN0aXZlIGVmZmVjdHMgUkMgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgbV9iQ2xpcEV4dGVybmFsSGFzU3RhcnRlZDsgIC8qKjwgRmxhZyB0byBpbmRpY2F0ZSB0aGF0IGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsIGVmZmVjdCBpcyBhY3RpdmUgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgaUluT3V0VGltZU9mZnNldDsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgYkVuY29kZVRpbGxFb0Y7Ci0gICAgTTR4VlNTX0VkaXRTZXR0aW5ncyAgICAgIHhWU1M7Ci0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgICAgIG1fYWlyX2NvbnRleHQ7Ci0KLSAgICBNNE9TQV9Cb29sIGJDbGlwMUFjdGl2ZUZyYW1pbmdFZmZlY3Q7IC8qKjwgT3ZlcmxheSBmbGFnIGZvciBjbGlwMSAqLwotICAgIE00T1NBX0Jvb2wgYkNsaXAyQWN0aXZlRnJhbWluZ0VmZmVjdDsgLyoqPCBPdmVybGF5IGZsYWcgZm9yIGNsaXAyLCB1c2VkIGluIHRyYW5zaXRpb24gKi8KLX0gTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQ7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0Ci0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGF1ZGlvIG1peGluZyBWU1MgM0dQUCBjb250ZXh0IChwcml2YXRlKQotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIGFsbCBWU1MgM0dQUCBhdWRpbyBtaXhpbmcgb3BlcmF0aW9ucyB0byBzdG9yZQotICogICAgICAgICAgICAgICAgdGhlIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qKgotICAgICAqICAgIFZTUyBtYWluIHZhcmlhYmxlcyAqLwotICAgIE00VlNTM0dQUF9BdWRpb01peGluZ1N0YXRlIFN0YXRlOyAgICAgICAgICAgICAgICAgICAgLyoqPCBWU1MgYXVkaW8gbWl4aW5nIGludGVybmFsIHN0YXRlICovCi0KLSAgICAvKioKLSAgICAgKiBJbnRlcm5hbCBjb3B5IG9mIHRoZSBpbnB1dCBzZXR0aW5ncyAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgIGlBZGRDdHM7ICAgICAgICAgICAgICAgICAvKio8IFtNaWxsaXNlY29uZHNdIFRpbWUsIGluIG1pbGxpc2Vjb25kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdCB3aGljaCB0aGUgYWRkZWQgYXVkaW8gdHJhY2sgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICB1aUJlZ2luTG9vcDsgICAgICAgICAgICAgICAgLyoqPCBEZXNjcmliZXMgaW4gbWlsbGktc2Vjb25kIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0IHRpbWUgb2YgdGhlIGxvb3AgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICB1aUVuZExvb3A7ICAgICAgICAgICAgICAgIC8qKjwgRGVzY3JpYmVzIGluIG1pbGxpLXNlY29uZCB0aGUgZW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lIG9mIHRoZSBsb29wICgwIG1lYW5zIG5vIGxvb3ApICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgYlJlbW92ZU9yaWdpbmFsOyAgICAgICAgICAgIC8qKjwgSWYgdHJ1ZSwgdGhlIG9yaWdpbmFsIGF1ZGlvIHRyYWNrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IHRha2VuIGludG8gYWNjb3VudCAqLwotCi0gICAgLyoqCi0gICAgICogSW5wdXQgYXVkaW8vdmlkZW8gZmlsZSAqLwotICAgIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgICAgICAgIElucHV0Q2xpcFNldHRpbmdzOyAgICAgICAgLyoqPCBTdHJ1Y3R1cmUgaW50ZXJuYWxseSB1c2VkIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZSB0aGUgaW5wdXQgM0dQUCBzZXR0aW5ncyAqLwotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCogICAgICAgIHBJbnB1dENsaXBDdHh0OyAgICAgICAgICAgLyoqPCBDb250ZXh0IG9mIHRoZSBpbnB1dCAzR1BQIGNsaXAgKi8KLQotICAgIC8qKgotICAgICAqIEFkZGVkIGF1ZGlvIGZpbGUgc3R1ZmYgKi8KLSAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICAgICAgICBBZGRlZENsaXBTZXR0aW5nczsgICAgICAgIC8qKjwgU3RydWN0dXJlIGludGVybmFsbHkgdXNlZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2UgdGhlIGFkZGVkIHNldHRpbmdzICovCi0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0KiAgICAgICAgcEFkZGVkQ2xpcEN0eHQ7ICAgICAgICAgICAvKio8IENvbnRleHQgb2YgdGhlIGFkZGVkIDNHUFAgY2xpcCAqLwotCi0gICAgLyoqCi0gICAgICogQXVkaW8gc3R1ZmYgKi8KLSAgICBNNE9TQV9GbG9hdCAgICAgICAgICAgICAgICAgICAgZk9yaWdGYWN0b3I7ICAgICAgICAgICAgLyoqPCBGYWN0b3IgdG8gYXBwbHkgdG8gdGhlIG9yaWdpbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gdHJhY2sgZm9yIHRoZSBtaXhpbmcgKi8KLSAgICBNNE9TQV9GbG9hdCAgICAgICAgICAgICAgICAgICAgZkFkZGVkRmFjdG9yOyAgICAgICAgICAgIC8qKjwgRmFjdG9yIHRvIGFwcGx5IHRvIHRoZSBhZGRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyB0cmFjayBmb3IgdGhlIG1peGluZyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICBiU3VwcG9ydFNpbGVuY2U7ICAgICAgICAvKio8IEZsYWcgdG8ga25vdyBpZiB0aGUgb3V0cHV0IHN0cmVhbSBjYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0IHNpbGVuY2UgKGV2ZW4gaWYgbm90IGVkaXRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZXhhbXBsZSBBQUMrLCBidXQgbm90IEVWUkMpICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgIGJIYXNBdWRpbzsgICAgICAgICAgICAgIC8qKjwgRmxhZyB0byBrbm93IGlmIHdlIGhhdmUgdG8gZGVsZXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyB0cmFjayAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICBiQXVkaW9NaXhpbmdJc05lZWRlZDsgIC8qKjwgRmxhZyB0byBrbm93IGlmIHdlIGhhdmUgdG8gZG8gbWl4aW5nICovCi0KLSAgICAvKioKLSAgICAgKiBFbmNvZGluZyBhbmQgV3JpdGluZyBvcGVyYXRpb25zICovCi0gICAgTTRWU1MzR1BQX0VuY29kZVdyaXRlQ29udGV4dCAgICBld2M7ICAgICAgICAgICAgICAgIC8qKjwgQXVkaW8gYW5kIHZpZGVvIGVuY29kZS93cml0ZSBzdHVmZiAqLwotCi0gICAgLyoqCi0gICAgICogRmlsZXN5c3RlbSBmdW5jdGlvbnMgKi8KLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqICAgICAgICBwT3NhRmlsZVJlYWRQdHI7ICAgICAvKio8IE9TQUwgZmlsZSByZWFkIGZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBwcm92aWRlZCBieSB1c2VyICovCi0gICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqICAgIHBPc2FGaWxlV3JpdFB0cjsgICAgIC8qKjwgT1NBTCBmaWxlIHdyaXRlIGZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHByb3ZpZGVkIGJ5IHVzZXIgKi8KLQotICAgIC8qKgotICAgICAqIEludGVyZmFjZXMgb2YgdGhlIHVzZWQgbW9kdWxlcyAqLwotICAgIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCBTaGVsbEFQSTsgICAgICAgICAgICAgICAvKio8IEZpbGVzeXN0ZW0gYW5kIHNoZWxsIHJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlciBmdW5jdGlvbnMgKi8KLQotICAgIC8qKgotICAgICAqIFNhbXBsZSBSYXRlIENvbnZlcnRvciAoU1NSQykgc3R1ZmYgKG5lZWRlZCBpbiBjYXNlIG9mIG1peGluZyB3aXRoICE9IEFTRi9uYiBvZiBjaGFubmVscykgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgYl9TU1JDbmVlZGVkOyAgICAgICAgLyoqPCBJZiB0cnVlLCBTU1JDIGlzIG5lZWRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCE9IEFTRiBvciBuYiBvZiBjaGFubmVscykgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgQ2hhbm5lbENvbnZlcnNpb247ICAgIC8qKjwgMT1Db252ZXJzaW9uIGZyb20gTW9ubyB0byBTdGVyZW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyPVN0ZXJlbyB0byBNb25vLCAwPW5vIGNvbnZlcnNpb24gKi8KLSAgICBTU1JDX0luc3RhbmNlX3QgICAgICAgICAgICAgU3NyY0luc3RhbmNlOyAgICAgICAgLyoqPCBDb250ZXh0IG9mIHRoZSBTc3JjICovCi0gICAgU1NSQ19TY3JhdGNoX3QqICAgICAgICAgICAgIFNzcmNTY3JhdGNoOyAgICAgICAgLyoqPCBXb3JraW5nIG1lbW9yeSBvZiB0aGUgU3NyYyAqLwotICAgIHNob3J0ICAgICAgICAgICAgICAgICAgICAgICBpU3NyY05iU2FtcGxJbjsgICAgLyoqPCBOdW1iZXIgb2Ygc2FtcGxlIHRoZSBTc3JjIG5lZWRzIGFzIGlucHV0ICovCi0gICAgc2hvcnQgICAgICAgICAgICAgICAgICAgICAgIGlTc3JjTmJTYW1wbE91dDsgICAgLyoqPCBOdW1iZXIgb2Ygc2FtcGxlIHRoZSBTc3JjIG91dHB1dHMgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgICAgICAgcFNzcmNCdWZmZXJJbjsgICAgICAgIC8qKjwgSW5wdXQgb2YgdGhlIFNTUkMgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgICAgICAgcFNzcmNCdWZmZXJPdXQ7ICAgICAgICAvKio8IE91dHB1dCBvZiB0aGUgU1NSQyAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICAgICAgICBwUG9zSW5Tc3JjQnVmZmVySW47ICAgIC8qKjwgUG9zaXRpb24gaW50byB0aGUgU1NSQyBpbiBidWZmZXIgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgICAgICAgcFBvc0luU3NyY0J1ZmZlck91dDsvKio8IFBvc2l0aW9uIGludG8gdGhlIFNTUkMgb3V0IGJ1ZmZlciAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICAgICAgICBwVGVtcEJ1ZmZlcjsgICAgICAgIC8qKjwgVGVtcG9yYXJ5IGJ1ZmZlciAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICAgICAgICBwUG9zSW5UZW1wQnVmZmVyOyAgICAvKio8IFBvc2l0aW9uIGluIHRlbXBvcmFyeSBidWZmZXIgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgbWluaW11bUJ1ZmZlckluOyAgICAvKio8IE1pbmltdW0gYW1vdW50IG9mIGRlY29kZWQgZGF0YSB0byBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkIGJ5IFNTUkMgYW5kIGNoYW5uZWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0b3IgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgYl9EdWNraW5nTmVlZGVlZDsKLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgSW5EdWNraW5nX3RocmVzaG9sZDsgIC8qKjwgVGhyZXNob2xkIHZhbHVlIGF0IHdoaWNoIGJhY2tncm91bmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzaWMgc2hhbGwgZHVjayAqLwotICAgIE00T1NBX0Zsb2F0ICAgICAgICAgICAgICAgICBJbkR1Y2tpbmdfbG93Vm9sdW1lOyAgLyoqPCBsb3dlciB0aGUgYmFja2dyb3VuZCB0cmFjayB0byB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yIGFuZCBpbmNyZWFzZSB0aGUgcHJpbWFyeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrIHRvIGludmVyc2Ugb2YgdGhpcyBmYWN0b3IgKi8KLSAgICBNNE9TQV9GbG9hdCAgICAgICAgICAgICAgICAgbG93Vm9sdW1lOwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICBhdWRpb1ZvbHVtZUFycmF5W1dJTkRPV19TSVpFXTsgLy8gc3RvcmUgcGVhayBhdWRpbyB2b2wuIGxldmVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZHVyYXRpb24gZm9yIFdJTkRPV19TSVpFCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgIGF1ZFZvbEFyckluZGV4OwotICAgIE00T1NBX0Zsb2F0ICAgICAgICAgICAgICAgICBkdWNraW5nRmFjdG9yIDsgICAgIC8qKjwgbXVsdGlwbHkgYnkgdGhpcyBmYWN0b3IgdG8gYnJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQURFIElOL0ZBREUgT1VUIGVmZmVjdCAqLwotICAgIE00T1NBX0Zsb2F0ICAgICAgICAgICAgICAgICBmQlRWb2xMZXZlbDsKLSAgICBNNE9TQV9GbG9hdCAgICAgICAgICAgICAgICAgZlBUVm9sTGV2ZWw7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgIGJEb0R1Y2tpbmc7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgIGJMb29wOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICBiTm9Mb29waW5nOwotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgICAgIHBMVkF1ZGlvUmVzYW1wbGVyOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICBianVtcGZsYWc7Ci0KLX0gTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00VlNTM0dQUF9JbnRlcm5hbEV4dHJhY3RQaWN0dXJlQ29udGV4dAotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBleHRyYWN0IHBpY3R1cmUgVlNTIGNvbnRleHQgKHByaXZhdGUpCi0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgYWxsIFZTUyBwaWN0dXJlIGV4dHJhY3Rpb25zIHRvIHN0b3JlIHRoZSBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKioKLSAgICAgKiAgICBWU1MgbWFpbiB2YXJpYWJsZXMgKi8KLSAgICBNNFZTUzNHUFBfRXh0cmFjdFBpY3R1cmVTdGF0ZSBTdGF0ZTsgICAgICAgICAgICAgICAgLyoqPCBWU1MgZXh0cmFjdCBwaWN0dXJlaW50ZXJuYWwgc3RhdGUgKi8KLQotICAgIC8qKgotICAgICAqIElucHV0IGZpbGVzICovCi0gICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAgICAgICAgQ2xpcFNldHRpbmdzOyAgICAgICAgICAgIC8qKjwgU3RydWN0dXJlIGludGVybmFsbHkgdXNlZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZSB0aGUgaW5wdXQgM0ZQUCBzZXR0aW5ncyAqLwotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCogICAgICAgIHBJbnB1dENsaXBDdHh0OyAgICAgICAgICAgLyoqPCBDb250ZXh0IG9mIHRoZSBpbnB1dCAzR1BQIGNsaXAgKi8KLQotICAgIC8qKgotICAgICAqIFNldHRpbmdzICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgICAgIGlFeHRyYWN0Q3RzOyAgICAgICAgICAgIC8qKjwgW01pbGxpc2Vjb25kc10gQ3RzIG9mIHRoZSBBVQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGV4dHJhY3RlZCAqLwotCi0gICAgLyoqCi0gICAgICogVmlkZW8gc3R1ZmYgKi8KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAgICAgICAgICAgIGRlY1BsYW5lc1szXTsgICAgICAgICAgICAvKio8IERlY29kZWQgWVVWNDIwIHBpY3R1cmUgcGxhbmUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlWaWRlb1dpZHRoOyAgICAgICAgICAgIC8qKjwgRGVjb2RlZCBpbWFnZSB3aWR0aCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aVZpZGVvSGVpZ2h0OyAgICAgICAgICAgIC8qKjwgRGVjb2RlZCBpbWFnZSBoZWlnaHQgKi8KLQotICAgIC8qCi0gICAgICogRGVjb2RlciBpbmZvICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgaURlY0N0czsgICAgICAvKio8IFtNaWxsaXNlY29uZHNdIERlY29kZWQgQVUgQ3RzICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgYkp1bXBGbGFnOyAgICAgLyoqPCAxIGlmIGEganVtcCBoYXMgYmVlbiBtYWRlICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgaURlbHRhVGltZTsgICAvKio8IFtNaWxsaXNlY29uZHNdIFRpbWUgYmV0d2VlbiBwcmV2aW91cyBSQVAgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUgdG8gZXh0cmFjdCAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgIGlHYXA7ICAgICAgICAgLyoqPCBbTWlsbGlzZWNvbmRzXSBUaW1lIGJldHdlZW4ganVtcCBBVSBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0aW9uIHRpbWUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICB1aVN0ZXA7ICAgICAgICAgIC8qKjwgW01pbGxpc2Vjb25kc10gUHJvZ3Jlc3MgYmFyIHRpbWUgaW5jcmVtZW50ICovCi0KLSAgICAvKioKLSAgICAgKiBGaWxlc3lzdGVtIGZ1bmN0aW9ucyAqLwotICAgICAvKio8IE9TQUwgZmlsZSByZWFkIGZ1bmN0aW9ucywgdG8gYmUgcHJvdmlkZWQgYnkgdXNlciAqLwotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogICAgICAgIHBPc2FGaWxlUmVhZFB0cjsKLSAgICAvKio8IE9TQUwgZmlsZSB3cml0ZSBmdW5jdGlvbnMsIHRvIGJlIHByb3ZpZGVkIGJ5IHVzZXIgKi8KLSAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogICAgcE9zYUZpbGVXcml0UHRyOwotCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgYkNsaXBPcGVuZWQ7Ci19IE00VlNTM0dQUF9JbnRlcm5hbEV4dHJhY3RQaWN0dXJlQ29udGV4dDsKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogX19NNFZTUzNHUFBfSU5URVJOQUxUWVBFU19IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNHhWU1NfQVBJLmggYi9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000eFZTU19BUEkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWNlMTAyZi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000eFZTU19BUEkuaAorKysgL2Rldi9udWxsCkBAIC0xLDU5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfX000WFZTU19BUElfSF9fCi0jZGVmaW5lIF9fTTRYVlNTX0FQSV9IX18KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNHhWU1NfQVBJLmgKLSAqIEBicmllZiAgICBBUEkgb2YgVmlkZW8gU3R1ZGlvIDIuMQotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9FWFRFTkRFRF9GRUFUVVJFUwotCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0FQSS5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9FeHRlbmRlZF9BUEkuaCIKLSNpbmNsdWRlICJNNERFQ09ERVJfQ29tbW9uLmgiCi0vKiBFcnJvcnMgY29kZXMgKi8KLQotLyoqCi0gKiBFbmQgb2YgYW5hbHl6aW5nID0+IHRoZSB1c2VyIGNhbiBjYWxsIE00eFZTU19QcmV2aWV3U3RhcnQgb3IgTTR4VlNTX1NhdmVTdGFydCAqLwotI2RlZmluZSBNNFZTUzNHUFBfV0FSX0FOQUxZWklOR19ET05FICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfV0FSLCBNNFZTLCAweDAwMDEpCi0KLS8qKgotICogRW5kIG9mIHByZXZpZXcgZ2VuZXJhdGluZyA9PiB0aGUgdXNlciBjYW4gbGF1bmNoIHZwcyB0byBzZWUgcHJldmlldy4gT25jZSBwcmV2aWV3IGlzIG92ZXIsCi0gICB0aGUgdXNlciBtdXN0IGNhbGwgTTR4VlNTX1ByZXZpZXdTdG9wKCkgdG8gYmUgYWJsZSB0byBzYXZlIGVkaXRlZCBmaWxlLCBvciB0byBjYWxsIGFub3RoZXIKLSAgIE00eFZTU19TZW5kQ29tbWFuZCgpICovCi0jZGVmaW5lIE00VlNTM0dQUF9XQVJfUFJFVklFV19SRUFEWSAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9XQVIsIE00VlMsIDB4MDAwMikKLQotLyoqCi0gKiBFbmQgb2Ygc2F2ZWQgZmlsZSBnZW5lcmF0aW9uID0+IHRoZSB1c2VyIG11c3QgY2FsbCBNNHhWU1NfU2F2ZVN0b3AoKSAqLwotI2RlZmluZSBNNFZTUzNHUFBfV0FSX1NBVklOR19ET05FICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfV0FSLCBNNFZTLCAweDAwMDMpCi0KLS8qKgotICogVHJhbnNjb2RpbmcgaXMgbmVjZXNzYXJ5IHRvIGdvIGZ1cnRoZXIgLT4gaWYgdGhlIHVzZXIgZG9lcyBub3Qgd2FudCB0byBjb250aW51ZSwKLSAgaGUgbXVzdCBjYWxsIE00eFZTU19zZW5kQ29tbWFuZCgpICovCi0jZGVmaW5lIE00VlNTM0dQUF9XQVJfVFJBTlNDT0RJTkdfTkVDRVNTQVJZICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9XQVIsIE00VlMsIDB4MDAwNCkKLQotLyoqCi0gKiBJbiBjYXNlIG9mIE1NUywgdGhlIG91dHB1dCBmaWxlIHNpemUgd29uJ3QgYmUgcmVhY2hlZCAqLwotI2RlZmluZSBNNFZTUzNHUFBfV0FSX09VVFBVVEZJTEVTSVpFX0VYQ0VFRCAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfV0FSLCBNNFZTLCAweDAwMDUpCi0KLS8qKgotICogSlBHIGlucHV0IGZpbGUgZGltZW5zaW9ucyBhcmUgdG9vIGhpZ2ggKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9KUEdfVE9PX0JJRyAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWUywgMHgwMDAxKQotCi0vKioKLSAqIFVURiBDb252ZXJzaW9uLCB3YXJuaW5nIG9uIHRoZSBzaXplIG9mIHRoZSB0ZW1wb3JhcnkgY29udmVydGVkIGJ1ZmZlciovCi0jZGVmaW5lIE00eFZTU1dBUl9CVUZGRVJfT1VUX1RPT19TTUFMTCAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9XQVIsIE00VlMsIDB4MDAwNikKLQotLyoqCi0gKiBTV0lLQVIgOkVycm9yIHdoYW4gTk9fTU9SRV9TUEFDRSovCi0jZGVmaW5lIE00eFZTU0VSUl9OT19NT1JFX1NQQUNFICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlMsIDB4MDAwNykKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNHhWU1NfVmlkZW9FZmZlY3RUeXBlCi0gKiBAYnJpZWYgICBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIHZpZGVvIGVmZmVjdCB0eXBlcyBvZiB0aGUgeFZTUwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0JsYWNrQW5kV2hpdGUgPSBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9FeHRlcm5hbCsxLCAvKiAyNTcgKi8KLSAgICBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9QaW5rLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjU4ICovCi0gICAgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JlZW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDI1OSAqLwotICAgIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1NlcGlhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyNjAgKi8KLSAgICBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9OZWdhdGl2ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjYxICovCi0gICAgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRnJhbWluZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDI2MiAqLwotICAgIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1RleHQsIC8qIFRleHQgb3ZlcmxheSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyNjMgKi8KLSAgICBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9ab29tSW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjY0ICovCi0gICAgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfWm9vbU91dCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDI2NSAqLwotICAgIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZpZnRpZXMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoyNjYgKi8KLSAgICBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9Db2xvclJHQjE2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qMjY3ICovCi0gICAgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JhZGllbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjI2OCovCi19IE00eFZTU19WaWRlb0VmZmVjdFR5cGU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTR4VlNTX1ZpZGVvVHJhbnNpdGlvblR5cGUKLSAqIEBicmllZiAgIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgdmlkZW8gZWZmZWN0IHRoYXQgY2FuIGJlIGFwcGxpZWQgZHVyaW5nIGEgdHJhbnNpdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNHhWU1Nfa1ZpZGVvVHJhbnNpdGlvblR5cGVfRXh0ZXJuYWwgPSBNNFZTUzNHUFBfa1ZpZGVvVHJhbnNpdGlvblR5cGVfRXh0ZXJuYWwsIC8qMjU2Ki8KLSAgICBNNHhWU1Nfa1ZpZGVvVHJhbnNpdGlvblR5cGVfQWxwaGFNYWdpYywKLSAgICBNNHhWU1Nfa1ZpZGVvVHJhbnNpdGlvblR5cGVfU2xpZGVUcmFuc2l0aW9uLAotICAgIE00eFZTU19rVmlkZW9UcmFuc2l0aW9uVHlwZV9GYWRlQmxhY2sKLQotfSBNNHhWU1NfVmlkZW9UcmFuc2l0aW9uVHlwZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTR4VlNTX1ByZXZpZXdTZXR0aW5ncwotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGdhdGhlcnMgYWxsIHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgYnkgdGhlIFZQUyBmb3IgcHJldmlldwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnAzZ3BQcmV2aWV3RmlsZTsKLSAgICBNNE9TQV9Wb2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcFBDTUZpbGU7Ci0gICAgTTRWSURFT0VESVRJTkdfQXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSAgICBvdXRQQ01fQVNGOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBdWRpb01vbm87Ci0gICAgTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzICAgICAgICAgICAgICAgICAgICpFZmZlY3RzOwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYkVmZmVjdHM7Ci0KLX0gTTR4VlNTX1ByZXZpZXdTZXR0aW5nczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTR4VlNTX3RvVVRGOEZjdAotICogQGJyaWVmICAgICAgICBUaGlzIHByb3RvdHlwZSBkZWZpbmVzIHRoZSBmdW5jdGlvbiBpbXBsZW1lbnRlZCBieSB0aGUgaW50ZWdyYXRvcgotICogICAgICAgICAgICAgICAgdG8gY29udmVydCBhIHN0cmluZyBlbmNvZGVkIGluIGFueSBmb3JtYXQgdG8gYW4gVVRGOCBzdHJpbmcuCi0gKiBAbm90ZQotICoKLSAqIEBwYXJhbSAgICBwQnVmZmVySW4gICAgICAgIElOICAgICAgICAgICAgQnVmZmVyIGNvbnRhaW5pbmcgdGhlIHN0cmluZyB0byBjb252ZXJ0IHRvIFVURjgKLSAqIEBwYXJhbSAgICBwQnVmZmVyT3V0ICAgICAgICBJTiAgICAgICAgICAgIEJ1ZmZlciBjb250YWluaW5nIHRoZSBVVEY4IGNvbnZlcnRlZCBzdHJpbmcKLSAqIEBwYXJhbSAgICBidWZmZXJPdXRTaXplICAgIElOL09VVCAgICBJTjogICAgIFNpemUgb2YgdGhlIGdpdmVuIG91dHB1dCBidWZmZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOiBTaXplIG9mIHRoZSBjb252ZXJ0ZWQgYnVmZmVyCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICgqTTR4VlNTX3RvVVRGOEZjdCkKLSgKLSAgICBNNE9TQV9Wb2lkICAgICAgICAgICAgKnBCdWZmZXJJbiwKLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICpwQnVmZmVyT3V0LAotICAgIE00T1NBX1VJbnQzMiAgICAgICAgKmJ1ZmZlck91dFNpemUKLSk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTR4VlNTX2Zyb21VVEY4RmN0Ci0gKiBAYnJpZWYgICAgICAgIFRoaXMgcHJvdG90eXBlIGRlZmluZXMgdGhlIGZ1bmN0aW9uIGltcGxlbWVudGVkIGJ5IHRoZSBpbnRlZ3JhdG9yCi0gKiAgICAgICAgICAgICAgICB0byBjb252ZXJ0IGFuIFVURjggc3RyaW5nIHRvIGEgc3RyaW5nIGVuY29kZWQgaW4gYW55IGZvcm1hdC4KLSAqIEBub3RlCi0gKgotICogQHBhcmFtICAgIHBCdWZmZXJJbiAgICAgICAgSU4gICAgICAgICAgICBCdWZmZXIgY29udGFpbmluZyB0aGUgVVRGOCBzdHJpbmcgdG8gY29udmVydAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIGRlc2lyZWQgZm9ybWF0LgotICogQHBhcmFtICAgIHBCdWZmZXJPdXQgICAgICAgIElOICAgICAgICAgICAgQnVmZmVyIGNvbnRhaW5pbmcgdGhlIGNvbnZlcnRlZCBzdHJpbmcKLSAqIEBwYXJhbSAgICBidWZmZXJPdXRTaXplICAgIElOL09VVCAgICBJTjogICAgIFNpemUgb2YgdGhlIGdpdmVuIG91dHB1dCBidWZmZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOiBTaXplIG9mIHRoZSBjb252ZXJ0ZWQgYnVmZmVyCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICgqTTR4VlNTX2Zyb21VVEY4RmN0KQotKAotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgKnBCdWZmZXJJbiwKLSAgICBNNE9TQV9Wb2lkICAgICAgICAgICAgKnBCdWZmZXJPdXQsCi0gICAgTTRPU0FfVUludDMyICAgICAgICAqYnVmZmVyT3V0U2l6ZQotKTsKLQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTR4VlNTX0luaXRQYXJhbXMKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHBhcmFtZXRlcnMgZm9yIHhWU1MuCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiAgICAgICAgICAgIHBGaWxlUmVhZFB0cjsKLSAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogICAgICAgIHBGaWxlV3JpdGVQdHI7Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFBhdGg7Ci0gICAgLypGdW5jdGlvbiBwb2ludGVyIG9uIGFuIGV4dGVybmFsIHRleHQgY29udmVyc2lvbiBmdW5jdGlvbiAqLwotICAgIE00eFZTU190b1VURjhGY3QgICAgICAgICAgICAgICAgcENvbnZUb1VURjhGY3Q7Ci0gICAgLypGdW5jdGlvbiBwb2ludGVyIG9uIGFuIGV4dGVybmFsIHRleHQgY29udmVyc2lvbiBmdW5jdGlvbiAqLwotICAgIE00eFZTU19mcm9tVVRGOEZjdCAgICAgICAgICAgICAgICBwQ29udkZyb21VVEY4RmN0OwotCi0KLQotfSBNNHhWU1NfSW5pdFBhcmFtczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTR4VlNTX0luaXQKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgeFZTUwotICogQG5vdGUgICAgICAgIEluaXRpYWxpemVzIHRoZSB4VlNTIGVkaXQgb3BlcmF0aW9uIChhbGxvY2F0ZXMgYW4gZXhlY3V0aW9uIGNvbnRleHQpLgotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChPVVQpIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0IHRvIGFsbG9jYXRlCi0gKiBAcGFyYW0gICAgcGFyYW1zICAgICAgICAgICAgICAgIChJTikgUGFyYW1ldGVycyBtYW5kYXRvcnkgZm9yIHhWU1MKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX0luaXQoTTRPU0FfQ29udGV4dCogcENvbnRleHQsIE00eFZTU19Jbml0UGFyYW1zKiBwYXJhbXMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNHhWU1NfUmVkdWNlVHJhbnNjb2RlCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gY2hhbmdlcyB0aGUgZ2l2ZW4gZWRpdGluZyBzdHJ1Y3R1cmUgaW4gb3JkZXIgdG8KLSAqICAgICAgICAgICAgICAgIG1pbmltaXplIHRoZSB0cmFuc2NvZGluZyB0aW1lLgotICogQG5vdGUgICAgICAgIFRoZSB4VlNTIGFuYWx5c2VzIHRoaXMgc3RydWN0dXJlLCBhbmQgaWYgbmVlZGVkLCBjaGFuZ2VzIHRoZQotICogICAgICAgICAgICAgICAgb3V0cHV0IHBhcmFtZXRlcnMgKFZpZGVvIGNvZGVjLCB2aWRlbyBzaXplLCBhdWRpbyBjb2RlYywKLSAqICAgICAgICAgICAgICAgIGF1ZGlvIG5iIG9mIGNoYW5uZWxzKSB0byBtaW5pbWl6ZSB0aGUgdHJhbnNjb2RpbmcgdGltZS4KLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoT1VUKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dCB0byBhbGxvY2F0ZQotICogQHBhcmFtICAgIHBTZXR0aW5ncyAgICAgICAgICAgIChJTikgRWRpdGlvbiBzZXR0aW5ncyAoYWxsb2NhdGVkIGJ5IHRoZSB1c2VyKQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00eFZTU19SZWR1Y2VUcmFuc2NvZGUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRWU1MzR1BQX0VkaXRTZXR0aW5ncyogcFNldHRpbmdzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTR4VlNTX1NlbmRDb21tYW5kCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gZ2l2ZXMgdG8gdGhlIHhWU1MgYW4gZWRpdGluZyBzdHJ1Y3R1cmUKLSAqIEBub3RlICAgICAgICBUaGUgeFZTUyBhbmFseXNlcyB0aGlzIHN0cnVjdHVyZSwgYW5kIHByZXBhcmUgZWRpdGlvbgotICogICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBhZnRlciBNNHhWU1NfSW5pdCwgYWZ0ZXIKLSAqICAgICAgICAgICAgICAgIE00eFZTU19DbG9zZUNvbW1hbmQsIG9yIGFmdGVyIE00eFZTU19QcmV2aWV3U3RvcC4KLSAqICAgICAgICAgICAgICAgIEFmdGVyIHRoaXMgZnVuY3Rpb24sIHRoZSB1c2VyIG11c3QgY2FsbCBNNHhWU1NfU3RlcCB1bnRpbAotICogICAgICAgICAgICAgICAgaXQgcmV0dXJucyBhbm90aGVyIGVycm9yIHRoYW4gTTROT19FUlJPUi4KLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcFNldHRpbmdzICAgICAgICAgICAgKElOKSBFZGl0aW9uIHNldHRpbmdzIChhbGxvY2F0ZWQgYnkgdGhlIHVzZXIpCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICBNZW1vcnkgYWxsb2NhdGlvbiBoYXMgZmFpbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX1NlbmRDb21tYW5kKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00VlNTM0dQUF9FZGl0U2V0dGluZ3MqIHBTZXR0aW5ncyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19QcmV2aWV3U3RhcnQKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBwcmVwYXJlIHRoZSBwcmV2aWV3Ci0gKiBAbm90ZSAgICAgICAgVGhlIHhWU1MgY3JlYXRlIDNHUCBwcmV2aWV3IGZpbGUgYW5kIGZpbGwgcFByZXZpZXdTZXR0aW5ncyB3aXRoCi0gKiAgICAgICAgICAgICAgICBwcmV2aWV3IHBhcmFtZXRlcnMuCi0gKiAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIG9uY2UgTTR4VlNTX1N0ZXAgaGFzIHJldHVybmVkCi0gKiAgICAgICAgICAgICAgICBNNFZTUzNHUFBfV0FSX0FOQUxZWklOR19ET05FCi0gKiAgICAgICAgICAgICAgICBBZnRlciB0aGlzIGZ1bmN0aW9uLCB0aGUgdXNlciBtdXN0IGNhbGwgTTR4VlNTX1N0ZXAgdW50aWwKLSAqICAgICAgICAgICAgICAgIGl0IHJldHVybnMgYW5vdGhlciBlcnJvciB0aGFuIE00Tk9fRVJST1IuCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgIHBQcmV2aWV3U2V0dGluZ3MgICAgKElOKSBQcmV2aWV3IHNldHRpbmdzIChhbGxvY2F0ZWQgYnkgdGhlIHVzZXIpCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICBNZW1vcnkgYWxsb2NhdGlvbiBoYXMgZmFpbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX1ByZXZpZXdTdGFydChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNHhWU1NfUHJldmlld1NldHRpbmdzKiBwUHJldmlld1NldHRpbmdzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTR4VlNTX1ByZXZpZXdTdG9wCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gdW5hbGxvY2F0ZSBwcmV2aWV3IHJlc3NvdXJjZXMgYW5kIGNoYW5nZSB4VlNTCi0gKiAgICAgICAgICAgICAgICBpbnRlcm5hbCBzdGF0ZSB0byBhbGxvdyBzYXZpbmcgb3IgcmVzZW5kIGFuIGVkaXRpbmcgY29tbWFuZAotICogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgb25jZSBNNHhWU1NfU3RlcCBoYXMgcmV0dXJuZWQKLSAqICAgICAgICAgICAgICAgIE00VlNTM0dQUF9XQVJfUFJFVklFV19SRUFEWQotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00eFZTU19QcmV2aWV3U3RvcChNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTR4VlNTX1NhdmVTdGFydAotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIHByZXBhcmUgdGhlIHNhdmUKLSAqIEBub3RlICAgICAgICBUaGUgeFZTUyBjcmVhdGUgM0dQIGVkaXRlZCBmaW5hbCBmaWxlCi0gKiAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIG9uY2UgTTR4VlNTX1N0ZXAgaGFzIHJldHVybmVkCi0gKiAgICAgICAgICAgICAgICBNNFZTUzNHUFBfV0FSX0FOQUxZWklOR19ET05FCi0gKiAgICAgICAgICAgICAgICBBZnRlciB0aGlzIGZ1bmN0aW9uLCB0aGUgdXNlciBtdXN0IGNhbGwgTTR4VlNTX1N0ZXAgdW50aWwKLSAqICAgICAgICAgICAgICAgIGl0IHJldHVybnMgYW5vdGhlciBlcnJvciB0aGFuIE00Tk9fRVJST1IuCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgIHBGaWxlUGF0aCAgICAgICAgICAgIChJTikgSWYgdGhlIHVzZXIgd2FudHMgdG8gcHJvdmlkZSBhIGRpZmZlcmVudAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBmaWxlbmFtZSwgZWxzZSBjYW4gYmUgTlVMTCAoYWxsb2NhdGVkIGJ5IHRoZSB1c2VyKQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00eFZTU19TYXZlU3RhcnQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVm9pZCogcEZpbGVQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBmaWxlUGF0aFNpemUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNHhWU1NfU2F2ZVN0b3AKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiB1bmFsbG9jYXRlIHNhdmUgcmVzc291cmNlcyBhbmQgY2hhbmdlIHhWU1MKLSAqICAgICAgICAgICAgICAgIGludGVybmFsIHN0YXRlLgotICogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgb25jZSBNNHhWU1NfU3RlcCBoYXMgcmV0dXJuZWQKLSAqICAgICAgICAgICAgICAgIE00VlNTM0dQUF9XQVJfU0FWSU5HX0RPTkUKLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBub3QgYmUgY2FsbGVkIGF0IHRoaXMgdGltZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNHhWU1NfU2F2ZVN0b3AoTTRPU0FfQ29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19TdGVwCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gZXhlY3V0ZXMgZGlmZmVyZW50cyB0YXNrcywgZGVwZW5kaW5nIG9mIHhWU1MKLSAqICAgICAgICAgICAgICAgIGludGVybmFsIHN0YXRlLgotICogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb246Ci0gKiAgICAgICAgICAgICAgICAgICAgLSBhbmFseXNlcyBlZGl0aW5nIHN0cnVjdHVyZSBpZiBjYWxsZWQgYWZ0ZXIgTTR4VlNTX1NlbmRDb21tYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgLSBnZW5lcmF0ZXMgcHJldmlldyBmaWxlIGlmIGNhbGxlZCBhZnRlciBNNHhWU1NfUHJldmlld1N0YXJ0Ci0gKiAgICAgICAgICAgICAgICAgICAgLSBnZW5lcmF0ZXMgZmluYWwgZWRpdGVkIGZpbGUgaWYgY2FsbGVkIGFmdGVyIE00eFZTU19TYXZlU3RhcnQKLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAgICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAgICAgICAgICAgICAoT1VUKSBQcm9ncmVzcyBpbmRpY2F0aW9uIGZyb20gMCB0byAxMDAKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgICAgICAgICBObyBlcnJvciwgdGhlIHVzZXIgbXVzdCBjYWxsIE00eFZTU19TdGVwIGFnYWluCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX1dBUl9QUkVWSUVXX1JFQURZOiAgICBQcmV2aWV3IGZpbGUgaXMgZ2VuZXJhdGVkCi0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9XQVJfU0FWSU5HX0RPTkU6ICAgICAgICBGaW5hbCBlZGl0ZWQgZmlsZSBpcyBnZW5lcmF0ZWQKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX1dBUl9BTkFMWVpJTkdfRE9ORTogICAgQW5hbHlzZSBpcyBkb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00eFZTU19TdGVwKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1VJbnQ4ICpwUHJvZ3Jlc3MpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNHhWU1NfQ2xvc2VDb21tYW5kCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gZGVsZXRlcyBjdXJyZW50IGVkaXRpbmcgcHJvZmlsZSwgdW5hbGxvY2F0ZQotICogICAgICAgICAgICAgICAgcmVzc291cmNlcyBhbmQgY2hhbmdlIHhWU1MgaW50ZXJuYWwgc3RhdGUuCi0gKiBAbm90ZSAgICAgICAgQWZ0ZXIgdGhpcyBmdW5jdGlvbiwgdGhlIHVzZXIgY2FuIGNhbGwgYSBuZXcgTTR4VlNTX1NlbmRDb21tYW5kCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX0Nsb3NlQ29tbWFuZChNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTR4VlNTX0NsZWFuVXAKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBkZWxldGVzIGFsbCB4VlNTIHJlc3NvdXJjZXMKLSAqIEBub3RlICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFmdGVyIE00eFZTU19DbG9zZUNvbW1hbmQuCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX0NsZWFuVXAoTTRPU0FfQ29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19HZXRWZXJzaW9uKE00X1ZlcnNpb25JbmZvICpwVmVyc2lvbikKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBnZXQgdGhlIHZlcnNpb24gb2YgdGhlIFZpZGVvIFN0dWRpbyAyLjEKLSAqCi0gKiBAcGFyYW0gICAgcFZlcnNpb24gICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHZlcnNpb24gaW5mbyBzdHJ1Y3QKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNHhWU1NfR2V0VmVyc2lvbihNNF9WZXJzaW9uSW5mbyAqcFZlcnNpb24pOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdENvbG9yKE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kKQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGFwcGx5IGEgY29sb3IgZWZmZWN0IG9uIGFuIGlucHV0IFlVVjQyMCBwbGFuYXIgZnJhbWUKLSAqIEBub3RlICAgIFRoZSBwcm90b3R5cGUgb2YgdGhpcyBlZmZlY3QgZnVuY3Rpb24gaXMgZXhwb3NlZCBiZWNhdXNlIGl0IG5lZWRzIHRvCi0gKiAgICAgICAgICAgIGNhbGxlZCBieSB0aGUgVlBTIGR1cmluZyB0aGUgcHJldmlldwotICogQHBhcmFtICAgIHBGdW5jdGlvbkNvbnRleHQoSU4pIENvbnRhaW5zIHdoaWNoIGNvbG9yIHRvIGFwcGx5IChub3QgdmVyeSBjbGVhbiAuLi4pCi0gKiBAcGFyYW0gICAgUGxhbmVJbiAgICAgICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIFBsYW5lT3V0ICAgICAgICAoSU4vT1VUKSBPdXRwdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIHBQcm9ncmVzcyAgICAgICAgKElOL09VVCkgUHJvZ3Jlc3MgaW5kaWNhdGlvbiAoMC0xMDApCi0gKiBAcGFyYW0gICAgdWlFZmZlY3RLaW5kICAgIChJTikgVW51c2VkCi0gKgotICogQHJldHVybiAgICBNNFZJRklfT0s6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Q29sb3IKLSgKLSAgICBNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwSW5wdXRQbGFuZXMsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBPdXRwdXRQbGFuZXMsCi0gICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kCi0pOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZyYW1pbmcoTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aUVmZmVjdEtpbmQpCi0gKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gYWRkIGEgZml4ZWQgb3IgYW5pbWF0ZWQgaW1hZ2Ugb24gYW4gaW5wdXQgWVVWNDIwIHBsYW5hciBmcmFtZQotICogQG5vdGUgICAgVGhlIHByb3RvdHlwZSBvZiB0aGlzIGVmZmVjdCBmdW5jdGlvbiBpcyBleHBvc2VkIGJlY2F1c2UgaXQgbmVlZHMgdG8KLSAqICAgICAgICAgICAgY2FsbGVkIGJ5IHRoZSBWUFMgZHVyaW5nIHRoZSBwcmV2aWV3Ci0gKiBAcGFyYW0gICAgcEZ1bmN0aW9uQ29udGV4dChJTikgQ29udGFpbnMgd2hpY2ggY29sb3IgdG8gYXBwbHkgKG5vdCB2ZXJ5IGNsZWFuIC4uLikKLSAqIEBwYXJhbSAgICBQbGFuZUluICAgICAgICAgICAgKElOKSBJbnB1dCBZVVY0MjAgcGxhbmFyCi0gKiBAcGFyYW0gICAgUGxhbmVPdXQgICAgICAgIChJTi9PVVQpIE91dHB1dCBZVVY0MjAgcGxhbmFyCi0gKiBAcGFyYW0gICAgcFByb2dyZXNzICAgICAgICAoSU4vT1VUKSBQcm9ncmVzcyBpbmRpY2F0aW9uICgwLTEwMCkKLSAqIEBwYXJhbSAgICB1aUVmZmVjdEtpbmQgICAgKElOKSBVbnVzZWQKLSAqCi0gKiBAcmV0dXJuICAgIE00VklGSV9PSzogICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGcmFtaW5nCi0oCi0gICAgTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcElucHV0UGxhbmVzLAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwT3V0cHV0UGxhbmVzLAotICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZAotKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGaWZ0aWVzKE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kKQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIG1ha2UgYSB2aWRlbyBsb29rIGFzIGlmIGl0IHdhcyB0YWtlbiBpbiB0aGUgZmlmdGllcwotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwVXNlckRhdGEgICAgICAgKElOKSBDb250ZXh0Ci0gKiBAcGFyYW0gICAgcFBsYW5lSW4gICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIHBQbGFuZU91dCAgICAgICAgKElOL09VVCkgT3V0cHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBwUHJvZ3Jlc3MgICAgICAgIChJTi9PVVQpIFByb2dyZXNzIGluZGljYXRpb24gKDAtMTAwKQotICogQHBhcmFtICAgIHVpRWZmZWN0S2luZCAgICAoSU4pIFVudXNlZAotICoKLSAqIEByZXR1cm4gICAgTTRWSUZJX09LOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIHBGaWZ0aWVzRGF0YSwgcFBsYW5lT3V0IG9yIHBQcm9ncmVzcyBhcmUgTlVMTCAoREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGaWZ0aWVzCi0oCi0gICAgTTRPU0FfVm9pZCAqcFVzZXJEYXRhLAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwSW5wdXRQbGFuZXMsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCwKLSAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgIE00T1NBX1VJbnQzMiB1aUVmZmVjdEtpbmQKLSk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3Rab29tKE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kKQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGFkZCBhIGZpeGVkIG9yIGFuaW1hdGVkIGltYWdlIG9uIGFuIGlucHV0IFlVVjQyMCBwbGFuYXIgZnJhbWUKLSAqIEBub3RlICAgIFRoZSBwcm90b3R5cGUgb2YgdGhpcyBlZmZlY3QgZnVuY3Rpb24gaXMgZXhwb3NlZCBiZWNhdXNlIGl0IG5lZWRzIHRvCi0gKiAgICAgICAgICAgIGNhbGxlZCBieSB0aGUgVlBTIGR1cmluZyB0aGUgcHJldmlldwotICogQHBhcmFtICAgIHBGdW5jdGlvbkNvbnRleHQoSU4pIENvbnRhaW5zIHdoaWNoIHpvb20gdG8gYXBwbHkgKEluL091dCkKLSAqIEBwYXJhbSAgICBQbGFuZUluICAgICAgICAgICAgKElOKSBJbnB1dCBZVVY0MjAgcGxhbmFyCi0gKiBAcGFyYW0gICAgUGxhbmVPdXQgICAgICAgIChJTi9PVVQpIE91dHB1dCBZVVY0MjAgcGxhbmFyCi0gKiBAcGFyYW0gICAgcFByb2dyZXNzICAgICAgICAoSU4vT1VUKSBQcm9ncmVzcyBpbmRpY2F0aW9uICgwLTEwMCkKLSAqIEBwYXJhbSAgICB1aUVmZmVjdEtpbmQgICAgKElOKSBVbnVzZWQKLSAqCi0gKiBAcmV0dXJuICAgIE00VklGSV9PSzogICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3Rab29tCi0oCi0gICAgTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcElucHV0UGxhbmVzLAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwT3V0cHV0UGxhbmVzLAotICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZAotKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTR4VlNTX0NyZWF0ZUNsaXBTZXR0aW5ncygpCi0gKiBAYnJpZWYgICAgQWxsb3dzIGZpbGxpbmcgYSBjbGlwIHNldHRpbmdzIHN0cnVjdHVyZSB3aXRoIGRlZmF1bHQgdmFsdWVzCi0gKgotICogQG5vdGUgICAgV0FSTklORzogcENsaXBTZXR0aW5ncy0+RWZmZWN0c1sgXSB3aWxsIGJlIGFsbG9jYXRlZCBpbiB0aGlzIGZ1bmN0aW9uLgotICogICAgICAgICAgICAgICAgICAgcENsaXBTZXR0aW5ncy0+cEZpbGUgICAgICB3aWxsIGJlIGFsbG9jYXRlZCBpbiB0aGlzIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSAgICBwQ2xpcFNldHRpbmdzICAgICAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzIHN0cnVjdHVyZQotICogQHBhcmFtICAgcEZpbGUgICAgICAgICAgICAgICAoSU4pIENsaXAgZmlsZSBuYW1lCi0gKiBAcGFyYW0gICBmaWxlUGF0aFNpemUgICAgICAgIChJTikgU2l6ZSBvZiB0aGUgY2xpcCBwYXRoIChuZWVkZWQgZm9yIHRoZSBVVEYxNiBjb252ZXJzaW9uKQotICogQHBhcmFtICAgIG5iRWZmZWN0cyAgICAgICAgICAgKElOKSBOYiBvZiBlZmZlY3Qgc2V0dGluZ3MgdG8gYWxsb2NhdGUKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDbGlwU2V0dGluZ3MgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX0NyZWF0ZUNsaXBTZXR0aW5ncyhNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzLCBNNE9TQV9Wb2lkKiBwRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBmaWxlUGF0aFNpemUsIE00T1NBX1VJbnQ4IG5iRWZmZWN0cyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00eFZTU19EdXBsaWNhdGVDbGlwU2V0dGluZ3MoKQotICogQGJyaWVmICAgIER1cGxpY2F0ZXMgYSBjbGlwIHNldHRpbmdzIHN0cnVjdHVyZSwgcGVyZm9ybWluZyBhbGxvY2F0aW9ucyBpZiByZXF1aXJlZAotICoKLSAqIEBwYXJhbSAgICBwQ2xpcFNldHRpbmdzRGVzdCAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzIHN0cnVjdHVyZQotICogQHBhcmFtICAgIHBDbGlwU2V0dGluZ3NPcmlnICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIE00VlNTM0dQUF9DbGlwU2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcGFyYW0gICBiQ29weUVmZmVjdHMgICAgICAgIChJTikgRmxhZyB0byBrbm93IGlmIHdlIGhhdmUgdG8gZHVwbGljYXRlIGVmZmVjdHMKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDbGlwU2V0dGluZ3MgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX0R1cGxpY2F0ZUNsaXBTZXR0aW5ncyhNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzRGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5nc09yaWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0Jvb2wgYkNvcHlFZmZlY3RzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTR4VlNTX0ZyZWVDbGlwU2V0dGluZ3MoKQotICogQGJyaWVmICAgIEZyZWUgdGhlIHBvaW50ZXJzIGFsbG9jYXRlZCBpbiB0aGUgQ2xpcFNldHRpbmcgc3RydWN0dXJlIChwRmlsZSwgRWZmZWN0cykuCi0gKgotICogQHBhcmFtICAgIHBDbGlwU2V0dGluZ3MgICAgICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIE00VlNTM0dQUF9DbGlwU2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00eFZTU19GcmVlQ2xpcFNldHRpbmdzKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDbGlwU2V0dGluZ3MpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX2dldE1DU0NvbnRleHQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfQ29udGV4dCogbWNzQ29udGV4dCkKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBNQ1MgY29udGV4dCB3aXRoaW4gdGhlIHhWU1MgaW50ZXJuYWwgY29udGV4dAotICogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgb25seSBhZnRlciBWU1Mgc3RhdGUgaGFzIG1vdmVkIHRvIGFuYWx5emluZyBzdGF0ZQotICogICAgICAgICAgICAgICAgb3IgYmV5b25kCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgIG1jc0NvbnRleHQgICAgICAgIChPVVQpIFBvaW50ZXIgdG8gcG9pbnRlciBvZiBtY3MgY29udGV4dCB0byByZXR1cm4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX2dldE1DU0NvbnRleHQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfQ29udGV4dCogbWNzQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfZ2V0VlNTM0dQUENvbnRleHQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0KiBtY3NDb250ZXh0KQotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIFZTUzNHUFAgY29udGV4dCB3aXRoaW4gdGhlIHhWU1MgaW50ZXJuYWwgY29udGV4dAotICogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgb25seSBhZnRlciBWU1Mgc3RhdGUgaGFzIG1vdmVkIHRvIEdlbmVyYXRpbmcKLSAqICAgICAgICAgICAgICAgIHByZXZpZXcgb3IgYmV5b25kCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgIHZzczNncHBDb250ZXh0ICAgICAgICAoT1VUKSBQb2ludGVyIHRvIHBvaW50ZXIgb2YgdnNzM2dwcCBjb250ZXh0IHRvIHJldHVybgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBub3QgYmUgY2FsbGVkIGF0IHRoaXMgdGltZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNHhWU1NfZ2V0VlNTM0dQUENvbnRleHQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfQ29udGV4dCogdnNzM2dwcENvbnRleHQpOwotCi0vLyBHZXQgc3VwcG9ydGVkIHZpZGVvIGRlY29kZXJzIGFuZCBjYXBhYmlsaXRpZXMuCi1NNE9TQV9FUlIgTTR4VlNTX2dldFZpZGVvRGVjb2RlckNhcGFiaWxpdGllcyhNNERFQ09ERVJfVmlkZW9EZWNvZGVycyAqKmRlY29kZXJzKTsKLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0jZW5kaWYgLyogX19NNFhWU1NfQVBJX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000eFZTU19JbnRlcm5hbC5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNHhWU1NfSW50ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTI5NjU3Mi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000eFZTU19JbnRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTg3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9fTTRYVlNTX0lOVEVSTkFMX0hfXwotI2RlZmluZSBfX000WFZTU19JTlRFUk5BTF9IX18KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNHhWU1NfSW50ZXJuYWwuaAotICogQGJyaWVmICAgIEludGVybmFsIG9mIFZpZGVvIEF1dGhvcmluZy4KLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotCi0jaW5jbHVkZSAiTTRNQ1NfQVBJLmgiCi0jaW5jbHVkZSAiTTRNQ1NfRXJyb3JDb2Rlcy5oIgotCi0jaW5jbHVkZSAiTTRQVE8zR1BQX0FQSS5oIgotI2luY2x1ZGUgIk00UFRPM0dQUF9FcnJvckNvZGVzLmgiCi0KLSNpbmNsdWRlICJNNEFJUl9BUEkuaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jZGVmaW5lIE00X3hWU1NfTUFKT1IgICAgICAgIDEKLSNkZWZpbmUgTTRfeFZTU19NSU5PUiAgICAgICAgNQotI2RlZmluZSBNNF94VlNTX1JFVklTSU9OICAgIDUKLQotLyogVGhlIGZvbGxvd2luZyBkZWZpbmVzIGRlc2NyaWJlIHRoZSBtYXggZGltZW5zaW9ucyBvZiBhbiBpbnB1dCBKUEcgKi8KLSNkZWZpbmUgTTRYVlNTX01YX0pQR19OQl9PRl9QSVhFTFMgICAgMzkyNjAxNgotCi0vKlNpemUgb2YgdGhlIFVURiB0ZW1wb3JhcnkgY29udmVyc2lvbiBidWZmZXIga2VlcCBpbiB0aGUgVkEgaW50ZXJuYWwgY29udGV4dCBhbmQKLWFsbG9jYXRlIGF0IHRoZSBpbml0aWFsaXphdGlvbiovCi0jZGVmaW5lIFVURl9DT05WRVJTSU9OX0JVRkZFUl9TSVpFICAgICAgICAgICAgMjA0OAotCi0vKiBNYXggcGF0aCBsZW5ndGggc2l6ZSAqLwotI2RlZmluZSAgTTRYVlNTX01BWF9QQVRIX0xFTiAyNTYKLQotLyoqIERldGVybWluZSBhYnNvbHV0ZSB2YWx1ZSBvZiBhLiAqLwotI2RlZmluZSBNNHhWU1NfQUJTKGEpICAgICAgICAgICAgICAgKCAoIChhKSA8ICgwKSApID8gKC0oYSkpIDogKGEpICkKLQotLyoqIFksVSxWIHZhbHVlcyBpbiBjYXNlIG9mIGJsYWNrIGJvcmRlcnMgcmVuZGVyaW5nICovCi0jZGVmaW5lIFlfUExBTkVfQk9SREVSX1ZBTFVFICAgIDB4MDAKLSNkZWZpbmUgVV9QTEFORV9CT1JERVJfVkFMVUUgICAgMHg4MAotI2RlZmluZSBWX1BMQU5FX0JPUkRFUl9WQUxVRSAgICAweDgwCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00eFZTU19FZmZlY3RzQWxwaGFCbGVuZGluZwotICogQGJyaWVmICAgIEludGVybmFsIGVmZmVjdHMgYWxwaGEgYmxlbmRpbmcgcGFyYW1ldGVycwotICogQG5vdGUgICAgVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgYWxsIGludGVybmFsIGluZm9ybWF0aW9ucyB0byBjcmVhdGUgYW4gYWxwaGEKLSAqICAgICAgICAgICAgYmxlbmRpbmcgZm9yIHRoZSBlZmZlY3RzIHRleHQgYW5kIGZyYW1pbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICBtX2ZhZGVJblRpbWU7ICAgICAgICAvKlN0YXJ0IHBlcmNlbnRhZ2Ugb2YgQWxwaGEgYmxlbmRpbmcqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICBtX2ZhZGVPdXRUaW1lOyAgICAgICAgLypNaWRkbGUgcGVyY2VudGFnZSBvZiBBbHBoYSBibGVuZGluZyovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgIG1fZW5kOyAgICAgICAgICAgIC8qRW5kIHBlcmNlbnRhZ2Ugb2YgQWxwaGEgYmxlbmRpbmcqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICBtX21pZGRsZTsgICAgLypEdXJhdGlvbiwgaW4gcGVyY2VudGFnZSBvZiBlZmZlY3QgZHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIEZhZGVJbiBwaGFzZSovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgIG1fc3RhcnQ7ICAgIC8qRHVyYXRpb24sIGluIHBlcmNlbnRhZ2Ugb2YgZWZmZWN0IGR1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIEZhZGVPdXQgcGhhc2UqLwotCi19IE00eFZTU19pbnRlcm5hbEVmZmVjdHNBbHBoYUJsZW5kaW5nOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFRISVMgU1RSVUNUVVJFIE1VU1QgTk9UIEJFIE1PRElGSUVECi0gKiBzdHJ1Y3QgICAgTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QKLSAqIEBicmllZiAgICBJdCBpcyB1c2VkIGludGVybmFsbHkgYnkgeFZTUyBmb3IgZnJhbWluZyBlZmZlY3QsIGFuZCBieSBWUFMgZm9yIHByZXZpZXdpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00VklGSV9JbWFnZVBsYW5lICpGcmFtaW5nUmdiOyAgICAgICAgICAgICAgICAvKio8IGRlY29kZWQgQkdSNTY1IHBsYW5lICovCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKkZyYW1pbmdZdXY7ICAgICAgICAgICAgICAgIC8qKjwgY29udmVydGVkIFlVVjQyMCBwbGFuYXIgcGxhbmUgKi8KLSAgICBNNE9TQV9JbnQzMiBkdXJhdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IER1cmF0aW9uIG9mIHRoZSBmcmFtZSAqLwotICAgIE00T1NBX0ludDMyIHByZXZpb3VzQ2xpcFRpbWU7ICAgICAgICAgICAgICAgIC8qKjwgUHJldmlvdXMgY2xpcCB0aW1lLCB1c2VkIGJ5IGZyYW1pbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyIGZvciBTQVZJTkcgKi8KLSAgICBNNE9TQV9JbnQzMiBwcmV2aWV3T2Zmc2V0Q2xpcFRpbWU7ICAgICAgICAgICAgLyoqPCBQcmV2aW91cyBjbGlwIHRpbWUsIHVzZWQgYnkgZnJhbWluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgZm9yIFBSRVZJRVcgKi8KLSAgICBNNE9TQV9JbnQzMiBwcmV2aWV3Q2xpcFRpbWU7ICAgICAgICAgICAgICAgIC8qKjwgQ3VycmVudCBjbGlwIHRpbWUsIHVzZWQgYnkgZnJhbWluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgZm9yIFBSRVZJRVcgKi8KLSAgICBNNE9TQV9Wb2lkKiBwQ3VycmVudDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEN1cnJlbnQgTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QgdXNlZCBieQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZyBmaWx0ZXIgKi8KLSAgICBNNE9TQV9Wb2lkKiBwTmV4dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOZXh0IE00eFZTU19GcmFtaW5nU3RydWN0LCBpZiBubyBtb3JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQgb24gY3VycmVudCBNNHhWU1NfRnJhbWluZ1N0cnVjdCAqLwotICAgIE00T1NBX1VJbnQzMiB0b3BsZWZ0X3g7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgdG9wLWxlZnQgWCBjb29yZGluYXRlIGluIHRoZSBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUgb2YgdGhlIGZpcnN0IGRlY29kZWQgcGl4ZWwgKi8KLSAgICBNNE9TQV9VSW50MzIgdG9wbGVmdF95OyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVGhlIHRvcC1sZWZ0IFkgY29vcmRpbmF0ZSBpbiB0aGUgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlIG9mIHRoZSBmaXJzdCBkZWNvZGVkIHBpeGVsICovCi0gICAgTTR4VlNTX2ludGVybmFsRWZmZWN0c0FscGhhQmxlbmRpbmcqIGFscGhhQmxlbmRpbmdTdHJ1Y3Q7IC8qIEFscGhhIGJsZW5kaW5nIFN0cnVjdCAqLwotLypUbyBzdXBwb3J0IEFSR0I4ODg4IDogZ2V0IHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGluIGNhc2Ugb2YgZmlsZSBBUkdCODg4IHVzZWQgaW4gZnJhbWluZwotIGFzIHZpZGVvIGVmZmVjdCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB3aWR0aDsgICAvKndpZHRoIG9mIHRoZSBBUkdCODg4OCBjbGlwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlVzZWQgb25seSBpZiB2aWRlbyBlZmZlY3QgaXMgZnJhbW1pbmcgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgaGVpZ2h0OyAvKmhlaWdodCBvZiB0aGUgQVJHQjg4ODggY2xpcCAuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlZCBvbmx5IGlmIHZpZGVvIGVmZmVjdCBpcyBmcmFtbWluZyAqLwotCi19IE00eFZTU19GcmFtaW5nU3RydWN0OwotCi0jaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVEhJUyBTVFJVQ1RVUkUgTVVTVCBOT1QgQkUgTU9ESUZJRUQKLSAqIHN0cnVjdCAgICBNNHhWU1NfRnJhbWluZ0NvbnRleHQKLSAqIEBicmllZiAgICBJdCBpcyB1c2VkIGludGVybmFsbHkgYnkgeFZTUyBmb3IgZnJhbWluZyBlZmZlY3QsIHdoZW4gdGhlIGZsYWcKLSAgICAgICAgICAgICAgICBERUNPREVfR0lGX09OX1NBVklORyBpcyBhY3RpdmF0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiAgICAgICAgICAgIGFGcmFtaW5nQ3R4OyAgICAgICAgLyoqPEZyYW1pbmcgc3RydWN0IGZvciB0aGUgZGVjb2RpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBjdXJyZW50IGZyYW1lIG9mIHRoZSBnaWYqLwotICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiAgICAgICAgICAgIGFGcmFtaW5nQ3R4X2xhc3Q7ICAgIC8qKjxGcmFtaW5nIHN0cnVjdCBmb3IgdGhlIGRlY29kaW5nIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHByZXZpb3VzIGZyYW1lIG9mIHRoZSBnaWYqLwotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogICAgICAgICAgICBwRmlsZVJlYWRQdHI7ICAgIC8qKjwgUG9pbnRlciBvbiBPU0FMIGZpbGUgcmVhZCBmdW5jdGlvbnMgKi8KLSAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogICAgICAgIHBGaWxlV3JpdGVQdHI7ICAgICAvKio8IFBvaW50ZXIgb24gT1NBTCBmaWxlIHdyaXRlIGZ1bmN0aW9ucyAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgcFNQU0NvbnRleHQ7ICAgICAgICAvKio8U1BTIGNvbnRleHQgZm9yIHRoZSBHSUYgZGVjb2RpbmcqLwotICAgIC8vTTRTUFNfU3RyZWFtICAgICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbTsgICAgICAgIC8qKjxHSUYgaW5wdXQgc3RyZWFtIGJ1ZmZlciBwb2ludGVyKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgIHBFZmZlY3RGaWxlUGF0aDsgICAgLyoqPGZpbGUgcGF0aCBvZiB0aGUgZ2lmKi8KLSAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSAgICBvdXRwdXRWaWRlb1NpemU7ICAgIC8qKjwgT3V0cHV0IHZpZGVvIHNpemUgUkMgKi8KLSAgICAvL000U1BTX0Rpc3Bvc2FsTW9kZSAgICAgICAgICAgICAgICBkaXNwb3NhbDsgICAgICAgICAgICAvKio8cHJldmlvdXMgZnJhbWUgR0lGIGRpc3Bvc2FsKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgICAgICAgICAgICAgIGJfYW5pbWF0ZWQ7ICAgICAgICAgICAgLyoqPElzIHRoZSBHSUYgYW5pbWF0ZWQ/Ki8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgYkVmZmVjdFJlc2l6ZTsgICAgICAgIC8qKjxJcyB0aGUgZ2lmIHJlc2l6ZSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICB0b3BsZWZ0X3g7ICAgICAgICAgICAgLyoqPCBUaGUgdG9wLWxlZnQgWCBjb29yZGluYXRlIGluIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgcGljdHVyZSBvZiB0aGUgZmlyc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZCBwaXhlbCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgdG9wbGVmdF95OyAgICAgICAgICAgIC8qKjwgVGhlIHRvcC1sZWZ0IFkgY29vcmRpbmF0ZSBpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IHBpY3R1cmUgb2YgdGhlIGZpcnN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWQgcGl4ZWwgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIHdpZHRoOyAgICAgICAgICAgICAgICAvKio8R0lGIHdpZHRoLCBmaWxsIGR1cmluZyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXphdGlvbiB3aXRoIHRoZSBTUFMqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OyAgICAgICAgICAgICAgICAvKio8R0lGIGhlaWdodCwgZmlsbCBkdXJpbmcgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uIHdpdGggdGhlIFNQUyovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICBlZmZlY3REdXJhdGlvbjsgICAgICAgIC8qKjxFZmZlY3QgZHVyYXRpb24qLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0U3RhcnRUaW1lOyAgICAvKio8RWZmZWN0IHN0YXJ0IHRpbWUqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgY2xpcFRpbWU7ICAgICAgICAgICAgLyoqPGN1cnJlbnQgb3V0cHV0IGNsaXAgdGltZSBmb3IgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBmcmFtZSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICBsYXN0X2NsaXBUaW1lOyAgICAgICAgLyoqPHByZXZpb3VzIG91dHB1dCBjbGlwIHRpbWUgZm9yIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzIGZyYW1lKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIGxhc3RTdGVwRHVyYXRpb247ICAgIC8qKjxUaW1lIGludGVydmFsIGJldHdlZW4gdGhlIHByZXZpb3VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgYW5kIHRoZSBjdXJyZW50IGZyYW1lKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgYl9Jc0ZpbGVHaWY7ICAgICAgICAvKio8SXMgdGhlIGZyYW1pbmcgdXNpbmcgYSBnaWYgZmlsZSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICBsYXN0X3dpZHRoOyAgICAgICAgICAgIC8qKjxMYXN0IGZyYW1lIHdpZHRoKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIGxhc3RfaGVpZ2h0OyAgICAgICAgLyoqPExhc3QgZnJhbWUgaGVpZ2h0Ki8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIGxhc3RfdG9wbGVmdF94OyAgICAgICAgLyoqPExhc3QgZnJhbWUgeCB0b3BsZWZ0Ki8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIGxhc3RfdG9wbGVmdF95OyAgICAgICAgLyoqPExhc3QgZnJhbWUgeSB0b3BsZWZ0Ki8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfZ2lmX3RpbWU7ICAgIC8qKjwgQ3VycmVudCB0aW1lIG9zIHRoZSBHSUYgaW4gb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgdGltZSAqLwotICAgIE00T1NBX0Zsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVEdXJhdGlvblJhdGlvOyAgICAvKio8IEZyYW1lIGR1cmF0aW9uIHJhdGlvICovCi0gICAgTTR4VlNTX2ludGVybmFsRWZmZWN0c0FscGhhQmxlbmRpbmcqICAgIGFscGhhQmxlbmRpbmdTdHJ1Y3Q7LypBbHBoYSBibGVuZGluZyBzdHJ1Y3R1cmUqLwotI2lmZGVmIERFQlVHX0dJRgotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICAgICAgdWlEZWJ1Z19maWxlQ291bnRlcjsvKio8Zm9yIGRlYnVnIHB1cnBvc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50IHRoZSBmcmFtZSBvZiB0aGUgZ2lmKi8KLSNlbmRpZiAvKkRFQlVHX0dJRiovCi19TTR4VlNTX0ZyYW1pbmdDb250ZXh0OwotI2VuZGlmIC8qREVDT0RFX0dJRl9PTl9TQVZJTkcqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNHhWU1NfUHRvM0dQUF9wYXJhbXMKLSAqIEBicmllZiAgICBJbnRlcm5hbCB4VlNTIHBhcmFtZXRlciBmb3IgUHRvM0dQUCBtb2R1bGUKLSAqIEBub3RlICAgIFRoaXMgc3RydWN0dXJlIGlzIGZpbGxlZCBieSBNNHhWU1Nfc2VuZENvbW1hbmQgZnVuY3Rpb24sCi0gKiBAbm90ZSAgICBhbmQgaXMgdXNlZCBkdXJpbmcgTTR4VlNTX1N0ZXAgZnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSBQdG8zR1BQIG1vZHVsZQotICogQG5vdGUgICAgQWxsIHRoZSBKUEcgZmlsZXMgdG8gdHJhbnNmb3JtIHRvIDNHUCBhcmUgY2hhaW5lZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBNNE9TQV9DaGFyKiAgICAgICAgICAgICAgICAgICAgICAgIHBGaWxlSW47Ci0gICAgTTRPU0FfQ2hhciogICAgICAgICAgICAgICAgICAgICAgICBwRmlsZU91dDsKLSAgICBNNE9TQV9DaGFyKiAgICAgICAgICAgICAgICAgICAgICAgIHBGaWxlVGVtcDsgICAgICAgICAgICAvKio8IHRlbXBvcmFyeSBmaWxlIHVzZWQgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhIHdyaXRpbmcsIE5VTEwgaXMgY3N0bWVtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlciBub3QgdXNlZCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgZHVyYXRpb247Ci0gICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgICAgICAgICAgICBJbnB1dEZpbGVUeXBlOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICBpc0NyZWF0ZWQ7ICAgICAgICAgICAgLyoqPCBUaGlzIGJvb2xlYW4gaXMgdXNlZCB0byBrbm93IGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvdXRwdXQgZmlsZSBpcyBhbHJlYWR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQgb3Igbm90ICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgIGlzUGFuWm9vbTsgICAgICAgICAgICAvKio8IFJDOiBCb29sZWFuIHVzZWQgdG8ga25vdyBpZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW4gYW5kIHpvb20gbW9kZSBpcyBlbmFibGVkICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICAgICAgICAgICAgICBQYW5ab29tWGE7ICAgICAgICAgICAgLyoqPCBSQyAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgICAgICAgICAgICAgUGFuWm9vbVRvcGxlZnRYYTsgICAgLyoqPCBSQyAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgICAgICAgICAgICAgUGFuWm9vbVRvcGxlZnRZYTsgICAgLyoqPCBSQyAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgICAgICAgICAgICAgUGFuWm9vbVhiOyAgICAgICAgICAgIC8qKjwgUkMgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WGI7ICAgIC8qKjwgUkMgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WWI7ICAgIC8qKjwgUkMgKi8KLSAgICBNNHhWU1NfTWVkaWFSZW5kZXJpbmcgICAgICAgICAgICBNZWRpYVJlbmRlcmluZzsgICAgICAgIC8qKjwgRkI6IHRvIHJlbmRlciBvciBub3QgcGljdHVyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzcGVjdCByYXRpbyAqLwotICAgIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVyYXRlICAgIGZyYW1lcmF0ZTsgICAgICAgICAgICAvKio8IFJDICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgcE5leHQ7ICAgICAgICAgICAgICAgIC8qKjwgQWRkcmVzcyBvZiBuZXh0IE00eFZTU19QdG8zR1BQX3BhcmFtcyoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ICovCi0gICAgLypUbyBzdXBwb3J0IEFSR0I4ODg4OndpZHRoIGFuZCBoZWlnaHQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB3aWR0aDsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgaGVpZ2h0OwotCi19IE00eFZTU19QdG8zR1BQX3BhcmFtczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTR4VlNTX2ZpZnRpZXNTdHJ1Y3QKLSAqIEBicmllZiAgICBJdCBpcyB1c2VkIGludGVybmFsbHkgYnkgeFZTUyBmb3IgZmlmdGllcyBlZmZlY3QKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1VJbnQzMiBmaWZ0aWVzRWZmZWN0RHVyYXRpb247ICAgIC8qKjwgRHVyYXRpb24gb2YgdGhlIHNhbWUgZWZmZWN0IGluIGEgdmlkZW8gKi8KLSAgICBNNE9TQV9JbnQzMiBwcmV2aW91c0NsaXBUaW1lOyAgICAgICAgICAvKio8IFByZXZpb3VzIGNsaXAgdGltZSwgdXNlZCBieSBmcmFtaW5nIGZpbHRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIFNBVklORyAqLwotICAgIE00T1NBX1VJbnQzMiBzaGlmdFJhbmRvbVZhbHVlOyAgICAgICAgICAgICAgICAvKio8IFZlcnRpY2FsIHNoaWZ0IG9mIHRoZSBpbWFnZSAqLwotICAgICAgTTRPU0FfVUludDMyIHN0cmlwZVJhbmRvbVZhbHVlOyAgICAgICAgICAgICAgICAvKio8IEhvcml6b250YWwgcG9zaXRpb24gb2YgdGhlIHN0cmlwZSAqLwotCi19IE00eFZTU19GaWZ0aWVzU3RydWN0OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNHhWU1NfQ29sb3JSR0IxNgotICogQGJyaWVmICAgIEl0IGlzIHVzZWQgaW50ZXJuYWxseSBieSB4VlNTIGZvciBSR0IxNiBjb2xvciBlZmZlY3QKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00eFZTU19WaWRlb0VmZmVjdFR5cGUgY29sb3JFZmZlY3RUeXBlOyAgICAvKkNvbG9yIHR5cGUgb2YgZWZmZWN0Ki8KLSAgICBNNE9TQV9VSW50MTYgICAgcmdiMTZDb2xvckRhdGE7ICAgICAgICAgICAgLypSR0IxNiBjb2xvciBvbmx5IGZvciB0aGUgUkdCMTYgY29sb3IgZWZmZWN0Ki8KLX0gTTR4VlNTX0NvbG9yU3RydWN0OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00eFZTU19QaWN0dXJlQ2FsbGJhY2tDdHh0Ci0gKiBAYnJpZWYgICAgVGhlIENhbGxiYWNrIENvbnRleHQgcGFyYW1ldGVycyBmb3IgUHRvM0dQUAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfQ2hhciogICAgICAgICAgICAgICAgbV9GaWxlSW47Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbV9OYkltYWdlOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1fSW1hZ2VDb3VudGVyOwotICAgIE00T1NBX0RvdWJsZSAgICAgICAgICAgIG1fdGltZUR1cmF0aW9uOwotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogIG1fcEZpbGVSZWFkUHRyOwotICAgIE00VklGSV9JbWFnZVBsYW5lKiAgICAgICAgbV9wRGVjb2RlZFBsYW5lOyAvKiBVc2VkIGZvciBQYW4gYW5kIFpvb20gb25seSAqLwotICAgIE00eFZTU19QdG8zR1BQX3BhcmFtcyogICAgbV9wUHRvM0dQUHBhcmFtczsKLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgICAgbV9haXJfY29udGV4dDsKLSAgICBNNHhWU1NfTWVkaWFSZW5kZXJpbmcgICAgbV9tZWRpYVJlbmRlcmluZzsKLQotfSBNNHhWU1NfUGljdHVyZUNhbGxiYWNrQ3R4dDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNHhWU1NfU3RhdGUKLSAqIEBicmllZiAgICBJbnRlcm5hbCBTdGF0ZSBvZiB0aGUgeFZTUwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00eFZTU19rU3RhdGVJbml0aWFsaXplZCA9IDAsCi0gICAgTTR4VlNTX2tTdGF0ZUFuYWx5emluZywKLSAgICBNNHhWU1Nfa1N0YXRlT3BlbmVkLAotICAgIC8vTTR4VlNTX2tTdGF0ZUdlbmVyYXRpbmdQcmV2aWV3LAotICAgIC8vTTR4VlNTX2tTdGF0ZVByZXZpZXcsCi0gICAgTTR4VlNTX2tTdGF0ZVNhdmluZywKLSAgICBNNHhWU1Nfa1N0YXRlU2F2ZWQKLQotfSBNNHhWU1NfU3RhdGU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTR4VlNTX2VkaXRNaWNyb1N0YXRlCi0gKiBAYnJpZWYgICAgSW50ZXJuYWwgTWljcm8gc3RhdGUgb2YgdGhlIHhWU1MgZm9yIHByZXZpZXdpbmcvc2F2aW5nIHN0YXRlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00eFZTU19rTWljcm9TdGF0ZUVkaXRpbmcgPSAwLAotICAgIE00eFZTU19rTWljcm9TdGF0ZUF1ZGlvTWl4aW5nCi0KLX0gTTR4VlNTX2VkaXRNaWNyb1N0YXRlOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00eFZTU19lZGl0TWljcm9TdGF0ZQotICogQGJyaWVmICAgIEludGVybmFsIE1pY3JvIHN0YXRlIG9mIHRoZSB4VlNTIGZvciBhbmFseXppbmcgc3RhdGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTR4VlNTX2tNaWNyb1N0YXRlQW5hbHlzZVB0bzNHUFAgPSAwLAotICAgIE00eFZTU19rTWljcm9TdGF0ZUNvbnZlcnRQdG8zR1BQLAotICAgIE00eFZTU19rTWljcm9TdGF0ZUFuYWx5emVNQ1MsCi0gICAgTTR4VlNTX2tNaWNyb1N0YXRlVHJhbnNjb2RlTUNTCi0KLX0gTTR4VlNTX2FuYWx5c2VNaWNyb1N0YXRlOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00eFZTU19NQ1NfcGFyYW1zCi0gKiBAYnJpZWYgICAgSW50ZXJuYWwgeFZTUyBwYXJhbWV0ZXIgZm9yIE1DUyBtb2R1bGUKLSAqIEBub3RlICAgIFRoaXMgc3RydWN0dXJlIGlzIGZpbGxlZCBieSBNNHhWU1Nfc2VuZENvbW1hbmQgZnVuY3Rpb24sCi0gKiBAbm90ZSAgICBhbmQgaXMgdXNlZCBkdXJpbmcgTTR4VlNTX1N0ZXAgZnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSBNQ1MgbW9kdWxlCi0gKiBAbm90ZSAgICBBbGwgdGhlIGlucHV0IGZpbGVzIHRvIHRyYW5zY29kZSBhcmUgY2hhaW5lZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZpbGVJbjsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZpbGVPdXQ7Ci0gICAgLyoqPCB0ZW1wb3JhcnkgZmlsZSB1c2VkIGZvciBtZXRhZGF0YSB3cml0aW5nLCBOVUxMIGlzIGNzdG1lbSB3cml0ZXIgbm90IHVzZWQgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZpbGVUZW1wOwotICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlICAgICAgICAgICAgICAgICAgICBJbnB1dEZpbGVUeXBlOwotICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlICAgICAgICAgICAgICAgICAgICBPdXRwdXRGaWxlVHlwZTsKLSAgICBNNFZJREVPRURJVElOR19WaWRlb0Zvcm1hdCAgICAgICAgICAgICAgICBPdXRwdXRWaWRlb0Zvcm1hdDsKLSAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSAgICAgICAgICAgIE91dHB1dFZpZGVvRnJhbWVTaXplOwotICAgIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVyYXRlICAgICAgICAgICAgT3V0cHV0VmlkZW9GcmFtZVJhdGU7Ci0gICAgTTRWSURFT0VESVRJTkdfQXVkaW9Gb3JtYXQgICAgICAgICAgICAgICAgT3V0cHV0QXVkaW9Gb3JtYXQ7Ci0gICAgTTRWSURFT0VESVRJTkdfQXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSAgICBPdXRwdXRBdWRpb1NhbXBsaW5nRnJlcXVlbmN5OwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBdWRpb01vbm87Ci0gICAgTTRWSURFT0VESVRJTkdfQml0cmF0ZSAgICAgICAgICAgICAgICAgICAgT3V0cHV0VmlkZW9CaXRyYXRlOwotICAgIE00VklERU9FRElUSU5HX0JpdHJhdGUgICAgICAgICAgICAgICAgICAgIE91dHB1dEF1ZGlvQml0cmF0ZTsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0JHTTsKLSAgICAvKio8IFRoaXMgYm9vbGVhbiBpcyB1c2VkIHRvIGtub3cgaWYgdGhlIG91dHB1dCBmaWxlIGlzIGFscmVhZHkgY3JlYXRlZCBvciBub3QgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0NyZWF0ZWQ7Ci0gICAgLyoqPCBBZGRyZXNzIG9mIG5leHQgTTR4VlNTX01DU19wYXJhbXMqIGVsZW1lbnQgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7Ci0KLSAgICAvKkZCOiB0cmFuc2NvZGluZyBwZXIgcGFydHMqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICBCZWdpbkN1dFRpbWU7ICAgIC8qKjwgQmVnaW5uaW5nIGN1dCB0aW1lIGluIGlucHV0IGZpbGUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgRW5kQ3V0VGltZTsgICAgICAvKio8IEVuZCBjdXQgdGltZSBpbiBpbnB1dCBmaWxlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFZpZGVvVGltZXNjYWxlOyAgICAvKk91dHB1dCB0aW1lc2NhbGUqLwotCi0gICAgTTRNQ1NfTWVkaWFSZW5kZXJpbmcgICAgICAgICAgICAgICAgIE1lZGlhUmVuZGVyaW5nOyAgIC8qKjwgRkI6IHRvIGNyb3AsIHJlc2l6ZSwgb3IgcmVuZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxhY2sgYm9yZGVycyovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvY2xpcG51bWJlcjsKLSAgICBNNE9TQV9VSW50MzIgIG91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICBNNE9TQV9VSW50MzIgIG91dHB1dFZpZGVvTGV2ZWw7Ci19IE00eFZTU19NQ1NfcGFyYW1zOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgYWxwaGEgbWFnaWMgdHJhbnNpdGlvbiBzZXR0aW5ncwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAgICAqcFBsYW5lOwotICAgIE00T1NBX0ludDMyICAgICAgICAgYmxlbmRpbmd0aHJlc2hvbGQ7ICAgIC8qKjwgQmxlbmRpbmcgUmFuZ2UgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgaXNyZXZlcnNlOyAgICAgICAgICAgIC8qKjwgZGlyZWN0IGVmZmVjdCBvciByZXZlcnNlICovCi0KLX0gTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5nczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNHhWU1NfaW50ZXJuYWxfU2xpZGVUcmFuc2l0aW9uU2V0dGluZ3MKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBpbnRlcm5hbCBzbGlkZSB0cmFuc2l0aW9uIHNldHRpbmdzCi0gKiBAbm90ZSAgICBUaGlzIHR5cGUgaGFwcGVucyB0byBtYXRjaCB0aGUgZXh0ZXJuYWwgdHJhbnNpdGlvbiBzZXR0aW5ncwotICogICAgICAgICAgICBzdHJ1Y3R1cmUgKGkuZS4gdGhlIG9uZSB3aGljaCBpcyBnaXZlbiBieSB0aGUgYXBwbGljYXRpb24pLCBidXQgYXJlCi0gKiAgICAgICAgICAgIGNvbmNlcHR1YWxseSBkaWZmZXJlbnQgdHlwZXMsIHNvIHRoYXQgaWYgKG9yIHJhdGhlciB3aGVuKSBzb21lIGRheQotICogICAgICAgICAgICB0cmFuc2xhdGlvbiBuZWVkcyB0byBvY2N1ciB3aGVuIGxvYWRpbmcgdGhlIHNldHRpbmdzIGZyb20gdGhlIGFwcCwKLSAqICAgICAgICAgICAgdGhpcyBzZXBhcmF0ZSB0eXBlIHdpbGwgYWxyZWFkeSBiZSByZWFkeS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLXR5cGVkZWYgTTR4VlNTX1NsaWRlVHJhbnNpdGlvblNldHRpbmdzICAgIE00eFZTU19pbnRlcm5hbF9TbGlkZVRyYW5zaXRpb25TZXR0aW5nczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTR4VlNTX2ludGVybmFsSnBlZ0NodW5rTW9kZQotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIGNodW5rIGNhbGxiYWNrIHRvIGRlY29kZQotICogICAgICAgICAgICBhIEpQRUcgYnkgY2h1bmsgbW9kZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00eFZTU19VVEZDb252ZXJzaW9uQ29udGV4dAotICogQGJyaWVmICAgIEludGVybmFsIFVURiBjb252ZXJzaW9uIGNvbnRleHQKLSAqIEBub3RlICAgIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBVVEYgY29udmVyc2lvbiBpbmZvcm1hdGlvbnMKLSAqICAgICAgICAgICAgbmVlZGVkIGJ5IHRoZSB4VlNTIHRvIG1hbmFnZSB0aGUgZGlmZmVyZW50IGZvcm1hdHMgKFVURjgvMTYvQVNDSUkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKkZ1bmN0aW9uIHBvaW50ZXIgb24gYW4gZXh0ZXJuYWwgdGV4dCBjb252ZXJzaW9uIGZ1bmN0aW9uICovCi0gICAgTTR4VlNTX3RvVVRGOEZjdCAgICAgICAgICAgICAgICBwQ29udlRvVVRGOEZjdDsKLSAgICAvKkZ1bmN0aW9uIHBvaW50ZXIgb24gYW4gZXh0ZXJuYWwgdGV4dCBjb252ZXJzaW9uIGZ1bmN0aW9uICovCi0gICAgTTR4VlNTX2Zyb21VVEY4RmN0ICAgICAgICAgICAgICAgIHBDb252RnJvbVVURjhGY3Q7Ci0gICAgLypUZW1wb3JhcnkgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiBlYWNoIGNvbnZlcnNpb24qLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgIC8qU2l6ZSBvZiB0aGUgcHJldmlvdXMgYnVmZmVyLCB0aGUgc2l6ZSBpcyBwcmVkZXJtaW5hdGVkKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIG1fVGVtcE91dENvbnZlcnNpb25TaXplOwotfSBNNHhWU1NfVVRGQ29udmVyc2lvbkNvbnRleHQ7Ci0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNHhWU1NfQ29udGV4dAotICogQGJyaWVmICAgIEludGVybmFsIGNvbnRleHQgb2YgdGhlIHhWU1MKLSAqIEBub3RlICAgIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGFsbCBpbnRlcm5hbCBpbmZvcm1hdGlvbnMgbmVlZGVkIGJ5IHRoZSB4VlNTCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIC8qKjwgUG9pbnRlciBvbiBPU0FMIGZpbGUgcmVhZCBmdW5jdGlvbnMgKi8KLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqICAgICAgICAgICAgcEZpbGVSZWFkUHRyOwotICAgIC8qKjwgUG9pbnRlciBvbiBPU0FMIGZpbGUgd3JpdGUgZnVuY3Rpb25zICovCi0gICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqICAgICAgICBwRmlsZVdyaXRlUHRyOwotICAgIC8qKjwgTG9jYWwgY29weSBvZiB2aWRlbyBlZGl0b3Igc2V0dGluZ3MgKi8KLSAgICBNNFZTUzNHUFBfRWRpdFNldHRpbmdzKiAgICAgICAgICAgIHBTZXR0aW5nczsKLSAgICAvKio8IEN1cnJlbnQgU2V0dGluZ3Mgb2YgdmlkZW8gZWRpdG9yIHRvIHVzZSBpbiBzdGVwIGZ1bmN0aW9ucyBmb3IgcHJldmlldy9zYXZlICovCi0gICAgTTRWU1MzR1BQX0VkaXRTZXR0aW5ncyogICAgICAgICAgICBwQ3VycmVudEVkaXRTZXR0aW5nczsKLSAgICAvKio8IEN1cnJlbnQgY29udGV4dCBvZiB2aWRlbyBlZGl0b3IgdG8gdXNlIGluIHN0ZXAgZnVuY3Rpb25zIGZvciBwcmV2aWV3L3NhdmUgKi8KLSAgICBNNFZTUzNHUFBfRWRpdENvbnRleHQgICAgICAgICAgICBwQ3VycmVudEVkaXRDb250ZXh0OwotICAgIC8qKjwgVGhpcyBpcyB0byBrbm93IGlmIGEgcHJldmlvdXMgTTR4VlNTX3NlbmRDb21tYW5kIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0NsaXBOdW1iZXI7Ci0gICAgLyoqPCBBdWRpbyBtaXhpbmcgc2V0dGluZ3MsIG5lZWRlZCB0byBmcmVlIGl0IGluIE00eFZTU19pbnRlcm5hbENsb3NlQXVkaW9NaXhlZEZpbGUgZnVuY3Rpb24qLwotICAgIE00VlNTM0dQUF9BdWRpb01peGluZ1NldHRpbmdzKiAgICBwQXVkaW9NaXhTZXR0aW5nczsKLSAgICAvKio8IEF1ZGlvIG1peGluZyBjb250ZXh0ICovCi0gICAgTTRWU1MzR1BQX0F1ZGlvTWl4aW5nQ29udGV4dCAgICBwQXVkaW9NaXhDb250ZXh0OwotICAgIC8qKjwgRmlsZSBwYXRoIGZvciBQQ00gb3V0cHV0IGZpbGU6IHVzZWQgZm9yIHByZXZpZXcsIGdpdmVuIHRvIHVzZXIgKi8KLSAgICBNNE9TQV9DaGFyKiAgICAgICAgICAgICAgICAgICAgICAgIHBjbVByZXZpZXdGaWxlOwotICAgIC8qKjwgRHVwbGljYXRpb24gb2Ygb3V0cHV0IGZpbGUgcG9pbnRlciwgdG8gYmUgYWJsZSB0byB1c2UgYXVkaW8gbWl4aW5nICovCi0gICAgTTRPU0FfQ2hhciogICAgICAgICAgICAgICAgICAgICAgICBwT3V0cHV0RmlsZTsKLSAgICAvKio8IER1cGxpY2F0aW9uIG9mIHRlbXBvcmFyeSBmaWxlIHBvaW50ZXIsIHRvIGJlIGFibGUgdG8gdXNlIGF1ZGlvIG1peGluZyAqLwotICAgIE00T1NBX0NoYXIqICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBvcmFyeUZpbGU7Ci0gICAgLyoqPCBNaWNybyBzdGF0ZSBmb3IgU2F2aW5nL1ByZXZpZXdpbmcgc3RhdGUgKi8KLSAgICBNNHhWU1NfZWRpdE1pY3JvU3RhdGUgICAgICAgICAgICBlZGl0aW5nU3RlcDsKLSAgICAvKio8IE1pY3JvIHN0YXRlIGZvciBBbmFseXppbmcgc3RhdGUgKi8KLSAgICBNNHhWU1NfYW5hbHlzZU1pY3JvU3RhdGUgICAgICAgIGFuYWx5c2VTdGVwOwotICAgIC8qKjwgTmIgb2Ygc3RlcCBmb3IgYW5hbHlzaXMgb3Igc2F2ZS9wcmV2aWV3LiBVc2VkIHRvIGNvbXB1dGUgcHJvZ3Jlc3Npb24KLSAgICAgICAgIG9mIGFuYWx5c2lzIG9yIHNhdmUvcHJldmlldyAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICAgICAgbmJTdGVwVG90YWw7Ci0gICAgLyoqPCBDdXJyZW50IHN0ZXAgbnVtYmVyIGZvciBhbmFseXNpcyBvciBzYXZlL3ByZXZpZXcgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGVwOwotICAgIC8qKjwgVG8gYmUgYWJsZSB0byBmcmVlIHBFZmZlY3RzIGR1cmluZyBwcmV2aWV3IGNsb3NlICovCi0gICAgTTR4VlNTX1ByZXZpZXdTZXR0aW5ncyogICAgICAgICAgICBwUHJldmlld1NldHRpbmdzOwotICAgIC8qKjwgVGVtcG9yYXJ5IGZpbGUgcGF0aDogYWxsIHRlbXBvcmFyeSBmaWxlcyBhcmUgY3JlYXRlZCBoZXJlICovCi0gICAgTTRPU0FfQ2hhciogICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFBhdGg7Ci0gICAgLyoqPCBDdXJyZW50IHN0YXRlIG9mIHhWU1MgKi8KLSAgICBNNHhWU1NfU3RhdGUgICAgICAgICAgICAgICAgICAgIG1fc3RhdGU7Ci0gICAgLyoqPCBMaXN0IG9mIHN0aWxsIHBpY3R1cmVzIGlucHV0IHRvIGNvbnZlcnQgdG8gM0dQIHdpdGggcGFyYW1ldGVycyAqLwotICAgIE00eFZTU19QdG8zR1BQX3BhcmFtcyogICAgICAgICAgICBwUFRvM0dQUHBhcmFtc0xpc3Q7Ci0gICAgLyoqPCBDdXJyZW50IGVsZW1lbnQgb2YgdGhlIGFib3ZlIGNoYWluZWQgbGlzdCBiZWVpbmcgcHJvY2Vzc2QgYnkgdGhlIFB0bzNHUFAgKi8KLSAgICBNNHhWU1NfUHRvM0dQUF9wYXJhbXMqICAgICAgICAgICAgcFBUbzNHUFBjdXJyZW50UGFyYW1zOwotICAgIC8qKjwgQ3VycmVudCBQdG8zR1BQIGNvbnRleHQsIG5lZWRlZCB0byBjYWxsIFB0bzNHUFBfc3RlcCBmdW5jdGlvbiBpbiBNNHhWU1Nfc3RlcCBmdW5jdGlvbiAqLwotICAgIE00UFRPM0dQUF9Db250ZXh0ICAgICAgICAgICAgICAgIHBNNFBUTzNHUFBfQ3R4dDsKLSAgICAvKio8IFBvaW50ZXIgb24gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIG9mIHRoZSBQdG8zR1BQIG1vZHVsZSAqLwotICAgIE00eFZTU19QaWN0dXJlQ2FsbGJhY2tDdHh0KiAgICAgICAgcENhbGxCYWNrQ3R4dDsKLSAgICAvKio8IExpc3Qgb2YgZmlsZXMgdG8gdHJhbnNjb2RlIHdpdGggcGFyYW1ldGVycyAqLwotICAgIE00eFZTU19NQ1NfcGFyYW1zKiAgICAgICAgICAgICAgICBwTUNTcGFyYW1zTGlzdDsKLSAgICAvKio8IEN1cnJlbnQgZWxlbWVudCBvZiB0aGUgYWJvdmUgY2hhaW5lZCBsaXN0IGJlZWluZyBwcm9jZXNzZCBieSB0aGUgTUNTICovCi0gICAgTTR4VlNTX01DU19wYXJhbXMqICAgICAgICAgICAgICAgIHBNQ1NjdXJyZW50UGFyYW1zOwotICAgIC8qKjwgQ3VycmVudCBNQ1MgY29udGV4dCwgbmVlZGVkIHRvIGNhbGwgTUNTX3N0ZXAgZnVuY3Rpb24gaW4gTTR4VlNTX3N0ZXAgZnVuY3Rpb24qLwotICAgIE00TUNTX0NvbnRleHQgICAgICAgICAgICAgICAgICAgIHBNQ1NfQ3R4dDsKLSAgICAvKio8IEluZGV4IHRvIGhhdmUgdW5pcXVlIHRlbXBvcmFyeSBmaWxlbmFtZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgdGVtcEZpbGVJbmRleDsKLSAgICAvKio8IEluIGNhc2Ugb2YgTU1TIHVzZSBjYXNlLCB0YXJnZXRlZCBiaXRyYXRlIHRvIHJlYWNoIG91dHB1dCBmaWxlIHNpemUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIHRhcmdldGVkQml0cmF0ZTsKLSAgICAvKio8IElmIHRoZSBzZW5kQ29tbWFuZCBmY3QgaXMgY2FsbGVkIHR3aWNlIG9yIG1vcmUsIHRoZSBmaXJzdCBjb21wdXRlZCB0aW1lc2NhbGUKLSAgICAgICAgcmVjb3JkZWQgaGVyZSBtdXN0IGJlIHJldXNlZCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ZWRUaW1lc2NhbGU7Ci0KLSAgICAvKlVURiBDb252ZXJzaW9uIHN1cHBvcnQqLwotICAgIE00eFZTU19VVEZDb252ZXJzaW9uQ29udGV4dCAgICBVVEZDb252ZXJzaW9uQ29udGV4dDsgICAgLypVVEYgY29udmVyc2lvbiBjb250ZXh0IHN0cnVjdHVyZSovCi0KLX0gTTR4VlNTX0NvbnRleHQ7Ci0KLS8qKgotICogSW50ZXJuYWwgZnVuY3Rpb24gcHJvdG90eXBlcyAqLwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsU3RhcnRUcmFuc2NvZGluZyhNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyICpyb3RhdGlvbkRlZ3JlZSk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxTdG9wVHJhbnNjb2RpbmcoTTRPU0FfQ29udGV4dCBwQ29udGV4dCk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxEZWNvZGVKUEcoTTRPU0FfVm9pZCogcEZpbGVJbiwgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiogcEltYWdlUGxhbmVzKTsKLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4OHRvWVVWNDIwKE00T1NBX1ZvaWQqIHBGaWxlSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqKiBwSW1hZ2VQbGFuZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHdpZHRoLE00T1NBX1VJbnQzMiBoZWlnaHQpOwotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbERlY29kZUFuZFJlc2l6ZUpQRyhNNE9TQV9Wb2lkKiBwRmlsZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbWFnZVBsYW5lcyk7Ci1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAoTTRPU0FfVm9pZCogcEZpbGVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcEltYWdlUGxhbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB3aWR0aCxNNE9TQV9VSW50MzIgaGVpZ2h0KTsKLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbFN0YXJ0Q29udmVydFBpY3R1cmVUbzNncChNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbFN0b3BDb252ZXJ0UGljdHVyZVRvM2dwKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWKE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4KTsKLQotI2lmZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsRGVjb2RlR0lGKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsRGVjb2RlR0lGX0luaXRpYWxpemF0aW9uKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsRGVjb2RlR0lGX0NsZWFuaW5nKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi0jZWxzZQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbERlY29kZUdJRihNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MqIHBFZmZlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4KTsKLSNlbmRpZiAvKkRFQ09ERV9HSUZfT05fU0FWSU5HKi8KLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3QoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyogcEVmZmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZVNpemUgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRWaWRlb1Jlc29sdXRpb24pOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsR2VuZXJhdGVFZGl0ZWRGaWxlKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ2xvc2VFZGl0ZWRGaWxlKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsR2VuZXJhdGVBdWRpb01peEZpbGUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDbG9zZUF1ZGlvTWl4ZWRGaWxlKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsRnJlZVByZXZpZXcoTTRPU0FfQ29udGV4dCBwQ29udGV4dCk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxGcmVlU2F2aW5nKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ZyZWVTZXR0aW5ncyhNNFZTUzNHUFBfRWRpdFNldHRpbmdzKiBwU2V0dGluZ3MpOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ZyZWVDb21tYW5kKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyhNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9DaGFyKiBwRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgKnBGaWxlUHJvcGVydGllcyk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfQWxwaGFNYWdpYyggTTRPU0FfVm9pZCAqdXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4xWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluMlszXSwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlUcmFuc2l0aW9uS2luZCk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfQWxwaGFNYWdpY0JsZW5kaW5nKCBNNE9TQV9Wb2lkICp1c2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJbjFbM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJbjJbM10sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVRyYW5zaXRpb25LaW5kKTsKLQotTTRPU0FfRVJSIE00eFZTU19TbGlkZVRyYW5zaXRpb24oIE00T1NBX1ZvaWQgKnVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluMVszXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluMlszXSwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpVHJhbnNpdGlvbktpbmQpOwotCi1NNE9TQV9FUlIgTTR4VlNTX0ZhZGVCbGFja1RyYW5zaXRpb24oTTRPU0FfVm9pZCAqdXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4xWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4yWzNdLE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVRyYW5zaXRpb25LaW5kKTsKLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbEdldFRhcmdldGVkVGltZVNjYWxlKE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0VkaXRTZXR0aW5ncyogcFNldHRpbmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiogcFRhcmdldGVkVGltZVNjYWxlKTsKLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRUb1VURjgoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVm9pZCogcEJ1ZmZlckluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcEJ1ZmZlck91dCwgTTRPU0FfVUludDMyKiBjb252ZXJ0ZWRTaXplKTsKLQotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1ZvaWQqIHBCdWZmZXJJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcEJ1ZmZlck91dCwgTTRPU0FfVUludDMyKiBjb252ZXJ0ZWRTaXplKTsKLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLQotI2VuZGlmIC8qIF9fTTRYVlNTX0lOVEVSTkFMX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL0FuZHJvaWQubWsgYi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUwNTNlN2QuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotaW5jbHVkZSAkKGNhbGwgYWxsLXN1YmRpci1tYWtlZmlsZXMpCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYy9NNE1DU19BUEkuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jL000TUNTX0FQSS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhODk4N2UyLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jL000TUNTX0FQSS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00TUNTX0FQSS5oCi0gKiBAYnJpZWYgICBNZWRpYSBDb252ZXJzaW9uIFNlcnZpY2UgcHVibGljIEFQSS4KLSAqIEBub3RlICAgIE1DUyBhbGxvd3MgdHJhbnNjb2RpbmcgYSAzZ3AvbXA0IGZpbGUgaW50byBhIG5ldyAzZ3AvbXA0IGZpbGUgY2hhbmdpbmcgdGhlCi0gKiAgICAgICAgICB2aWRlbyBhbmQgYXVkaW8gZW5jb2Rpbmcgc2V0dGluZ3MuCi0gKiAgICAgICAgICBJdCBpcyBhIHN0cmFpZ2h0Zm9yd2FyZCBhbmQgZnVsbHkgc3luY2hyb25vdXMgQVBJLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpZm5kZWYgX19NNE1DU19BUElfSF9fCi0jZGVmaW5lIF9fTTRNQ1NfQVBJX0hfXwotCi0vKioKLSAqICAgIE9TQUwgYmFzaWMgdHlwZXMgYW5kIGVycm9ycyAqLwotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLQotLyoqCi0gKiAgICBPU0FMIHR5cGVzIGZvciBmaWxlIGFjY2VzcyAqLwotI2luY2x1ZGUgIk00T1NBX0ZpbGVSZWFkZXIuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlV3JpdGVyLmgiCi0KLS8qKgotICogICAgRGVmaW5pdGlvbiBvZiBNNF9WZXJzaW9uSW5mbyAqLwotI2luY2x1ZGUgIk00VE9PTF9WZXJzaW9uSW5mby5oIgotCi0vKioKLSAqIENvbW1vbiBkZWZpbml0aW9ucyBvZiB2aWRlbyBlZGl0aW5nIGNvbXBvbmVudHMgKi8KLSNpbmNsdWRlICJNNF9WaWRlb0VkaXRpbmdDb21tb24uaCIKLQotLyoqCi0gKiBUbyBlbmFibGUgZXh0ZXJuYWwgYXVkaW8gY29kZWNzIHJlZ2lzdGVyaW5nKi8KLSNpbmNsdWRlICJNNEFEX0NvbW1vbi5oIgotI2luY2x1ZGUgIk00RU5DT0RFUl9BdWRpb0NvbW1vbi5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qKgotICogICAgUHVibGljIHR5cGUgb2YgdGhlIE1DUyBjb250ZXh0ICovCi10eXBlZGVmIE00T1NBX1ZvaWQqIE00TUNTX0NvbnRleHQ7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNE1DU19NZWRpYVJlbmRlcmluZwotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIGRpZmZlcmVudCBtZWRpYSByZW5kZXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRNQ1Nfa1Jlc2l6aW5nID0gMCwgICAgLyoqPCBUaGUgbWVkaWEgaXMgcmVzaXplZCwgdGhlIGFzcGVjdCByYXRpbyBjYW4gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCBvbmUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgb2YgdGhlIG1lZGlhIGlzIHJlbmRlcmVkICovCi0gICAgTTRNQ1Nfa0Nyb3BwaW5nLCAgICAgICAgLyoqPCBUaGUgbWVkaWEgaXMgY3JvcHBlZCwgdGhlIGFzcGVjdCByYXRpbyBpcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbWUgYXMgdGhlIG9yaWdpbmFsIG9uZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBtZWRpYSBpcyBub3QgcmVuZGVyZWQgZW50aXJlbHkgKi8KLSAgICBNNE1DU19rQmxhY2tCb3JkZXJzICAgICAvKio8IEJsYWNrIGJvcmRlcnMgYXJlIHJlbmRlcmVkIGluIG9yZGVyIHRvIGtlZXAgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbCBhc3BlY3QgcmF0aW8uIEFsbCB0aGUgbWVkaWEgaXMgcmVuZGVyZWQgKi8KLX0gTTRNQ1NfTWVkaWFSZW5kZXJpbmc7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICBNNE1DU19FeHRlcm5hbFByb2dyZXNzCi0gKiBAYnJpZWYgICBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBpbmZvcm1hdGlvbiBwcm92aWRlZCB0byB0aGUgZXh0ZXJuYWwgRWZmZWN0IGZ1bmN0aW9ucwotICogQG5vdGUgICAgVGhlIHVpUHJvZ3Jlc3MgdmFsdWUgc2hvdWxkIGJlIGVub3VnaCBmb3IgbW9zdCBjYXNlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1VJbnQzMiAgICB1aVByb2dyZXNzOyAgICAgLyoqPCBQcm9ncmVzcyBvZiB0aGUgRWZmZWN0IGZyb20gMCB0byAxMDAwIChvbmUgdGhvdXNhbmQpICovCi0gICAgTTRPU0FfVUludDMyICAgIHVpQ2xpcFRpbWU7ICAgICAvKio8IEN1cnJlbnQgdGltZSwgaW4gbWlsbGlzZWNvbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGN1cnJlbnQgY2xpcCB0aW1lLWxpbmUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgdWlPdXRwdXRUaW1lOyAgIC8qKjwgQ3VycmVudCB0aW1lLCBpbiBtaWxsaXNlY29uZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgb3V0cHV0IGNsaXAgdGltZS1saW5lICovCi0KLX0gTTRNQ1NfRXh0ZXJuYWxQcm9ncmVzczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00TUNTX0F1ZGlvRWZmZWN0VHlwZQotICogQGJyaWVmICAgVGhpcyBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSBhdWRpbyBlZmZlY3QgdHlwZXMgb2YgdGhlIE1DUwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNE1DU19rQXVkaW9FZmZlY3RUeXBlX05vbmUgICAgPSAwLAotICAgIE00TUNTX2tBdWRpb0VmZmVjdFR5cGVfRmFkZUluICA9IDgsIC8qKjwgSW50ZW5kZWQgZm9yIGJlZ2luIGVmZmVjdCAqLwotICAgIE00TUNTX2tBdWRpb0VmZmVjdFR5cGVfRmFkZU91dCA9IDE2LCAvKio8IEludGVuZGVkIGZvciBlbmQgZWZmZWN0ICovCi0gICAgTTRNQ1Nfa0F1ZGlvRWZmZWN0VHlwZV9FeHRlcm5hbCA9IDI1NgotCi19IE00TUNTX0F1ZGlvRWZmZWN0VHlwZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE1DU19lZGl0QXVkaW9FZmZlY3RGY3QKLSAqIEBicmllZiAgICAgICBBdWRpbyBlZmZlY3QgZnVuY3Rpb25zIGltcGxlbWVudGVkIGJ5IHRoZSBpbnRlZ3JhdG9yCi0gKiAgICAgICAgICAgICAgbXVzdCBtYXRjaCB0aGlzIHByb3RvdHlwZS4KLSAqIEBub3RlICAgICAgICBUaGUgZnVuY3Rpb24gaXMgcHJvdmlkZWQgd2l0aCB0aGUgb3JpZ2luYWwgUENNIGRhdGEgYnVmZmVyIGFuZCBpdHMgc2l6ZS4KLSAqICAgICAgICAgICAgICBBdWRpbyBlZmZlY3QgaGF2ZSB0byBiZSBhcHBsaWVkIG9uIGl0LgotICogICAgICAgICAgICAgIFRoZSBwcm9ncmVzcyBvZiB0aGUgZWZmZWN0IGlzIGdpdmVuLCBvbiBhIHNjYWxlIGZyb20gMCB0byAxMDAwLgotICogICAgICAgICAgICAgIFdoZW4gdGhlIGVmZmVjdCBmdW5jdGlvbiBpcyBjYWxsZWQsIGFsbCB0aGUgYnVmZmVycyBhcmUgdmFsaWQgYW5kCi0gKiAgICAgICAgICAgICAgb3duZWQgYnkgdGhlIE1DUy4KLSAqCi0gKiBAcGFyYW0gICBwRnVuY3Rpb25Db250ZXh0ICAgIChJTikgVGhlIGZ1bmN0aW9uIGNvbnRleHQsIHByZXZpb3VzbHkgc2V0IGJ5IHRoZSBpbnRlZ3JhdG9yCi0gKiBAcGFyYW0gICBwUENNZGF0YSAgICAgICAgICAgIChJTi9PVVQpIHZhbGlkIFBDTSBkYXRhIGJ1ZmZlcgotICogQHBhcmFtICAgdWlQQ01zaXplICAgICAgICAgICAoSU4vT1VUKSBQQ00gZGF0YSBidWZmZXIgY29ycmVzcG9uZGluZyBzaXplCi0gKiBAcGFyYW0gICBwUHJvZ3Jlc3MgICAgICAgICAgIChJTikgU2V0IG9mIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhdWRpbyBlZmZlY3QgcHJvZ3Jlc3MuCi0gKgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgTTRPU0FfRVJSICgqTTRNQ1NfZWRpdEF1ZGlvRWZmZWN0RmN0KQotKAotICAgIE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gICAgTTRPU0FfSW50MTYgKnBQQ01kYXRhLAotICAgIE00T1NBX1VJbnQzMiB1aVBDTXNpemUsCi0gICAgTTRNQ1NfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzCi0pOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgTTRNQ1NfRWZmZWN0U2V0dGluZ3MKLSAqIEBicmllZiAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYW4gYXVkaW8gZWZmZWN0IGZvciB0aGUgZWRpdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgIHVpU3RhcnRUaW1lOyAgICAgICAgICAgICAgLyoqPCBJbiBtcyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgdWlEdXJhdGlvbjsgICAgICAgICAgICAgICAvKio8IEluIG1zICovCi0gICAgTTRNQ1NfZWRpdEF1ZGlvRWZmZWN0RmN0ICAgICBFeHRBdWRpb0VmZmVjdEZjdDsgICAgICAgIC8qKjwgRXh0ZXJuYWwgZWZmZWN0IGZ1bmN0aW9uICovCi0gICAgTTRPU0FfVm9pZCAgICAgICAgICAgICAgICAgICAqcEV4dEF1ZGlvRWZmZWN0RmN0Q3R4dDsgIC8qKjwgQ29udGV4dCBnaXZlbiB0byB0aGUgZXh0ZXJuYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3QgZnVuY3Rpb24gKi8KLSAgICBNNE1DU19BdWRpb0VmZmVjdFR5cGUgICAgICAgIEF1ZGlvRWZmZWN0VHlwZTsgICAgICAgICAvKio8IE5vbmUsIEZhZGVJbiwgRmFkZU91dCAqLwotCi19IE00TUNTX0VmZmVjdFNldHRpbmdzOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00TUNTX091dHB1dFBhcmFtcwotICogQGJyaWVmICAgIE1DUyBPdXRwdXQgcGFyYW1ldGVycwotICogQG5vdGUgICAgIEZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSB1c2VkIGZvciBzdGlsbCBwaWN0dXJlIGlucHV0cyA6Ci0gKiAgICAgICAgICAgICAtIE91dHB1dEZpbGVUeXBlIChtdXN0IGJlIHNldCB0byBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfSlBHKQotICogICAgICAgICAgICAgLSBiRGlzY2FyZEV4aWYgbXVzdCBiZSBzZXQgdG8gTTRPU0FfVFJVRSBvciBNNE9TQV9GQUxTRQotICogICAgICAgICAgICAgLSBiQWRqdXN0T3JpZW50YXRpb24gbXVzdCBiZSBzZXQgdG8gTTRPU0FfVFJVRSBvciBNNE9TQV9GQUxTRQotICogICAgICAgICAgICAgLSAoTWVkaWFSZW5kZXJpbmcgaXMgbm90IGhhbmRsZWQgOiBvdXRwdXQgaW1hZ2UgcmVzb2x1dGlvbiBpcyBhbHdheXMKLSAgICAgICAgICAgICAgICAgc2V0IGFjY29yZGluZyB0byBCZXN0Rml0IGNyaXRlcmlhKQotICogICAgICAgICAgICBiRGlzY2FyZEV4aWYgYW5kIGJBZGp1c3RPcmllbnRhdGlvbiBhcmUgc3RpbGwgcGljdHVyZSBvbmx5IHBhcmFtZXRlcnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKio8IEZvcm1hdCBvZiB0aGUgb3V0cHV0IGZpbGUgKi8KLSAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSAgICAgICAgICAgICAgICAgT3V0cHV0RmlsZVR5cGU7Ci0gICAgLyoqPCBPdXRwdXQgdmlkZW8gY29tcHJlc3Npb24gZm9ybWF0LCBzZWUgZW51bSAqLwotICAgIE00VklERU9FRElUSU5HX1ZpZGVvRm9ybWF0ICAgICAgICAgICAgICBPdXRwdXRWaWRlb0Zvcm1hdDsKLSAgICAvKio8IE91dHB1dCBmcmFtZSBzaXplIDogUVFWR0EsIFFDSUYgb3IgU1FDSUYgKi8KLSAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSAgICAgICAgICAgT3V0cHV0VmlkZW9GcmFtZVNpemU7Ci0gICAgLyoqPCBUYXJnZXRlZCBPdXRwdXQgZnJhbWVyYXRlLCBzZWUgZW51bSAqLwotICAgIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVyYXRlICAgICAgICAgICBPdXRwdXRWaWRlb0ZyYW1lUmF0ZTsKLSAgICAvKio8IEZvcm1hdCBvZiB0aGUgYXVkaW8gaW4gdGhlIHN0cmVhbSAqLwotICAgIE00VklERU9FRElUSU5HX0F1ZGlvRm9ybWF0ICAgICAgICAgICAgICBPdXRwdXRBdWRpb0Zvcm1hdDsKLSAgICAvKio8IFNhbXBsaW5nIGZyZXF1ZW5jeSBvZiB0aGUgYXVkaW8gaW4gdGhlIHN0cmVhbSAqLwotICAgIE00VklERU9FRElUSU5HX0F1ZGlvU2FtcGxpbmdGcmVxdWVuY3kgICBPdXRwdXRBdWRpb1NhbXBsaW5nRnJlcXVlbmN5OwotICAgIC8qKjwgU2V0IHRvIE00T1NBX1RSVUUgaWYgdGhlIG91dHB1dCBhdWRpbyBpcyBtb25vICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBdWRpb01vbm87Ci0gICAgLyoqPCBPdXRwdXQgUENNIGZpbGUgaWYgbm90IE5VTEwgKi8KLSAgICBNNE9TQV9DaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBPdXRwdXRQQ01maWxlOwotICAgIC8qKjwgVG8gY3JvcCwgcmVzaXplLCBvciByZW5kZXIgYmxhY2sgYm9yZGVycyovCi0gICAgTTRNQ1NfTWVkaWFSZW5kZXJpbmcgICAgICAgICAgICAgICAgICAgIE1lZGlhUmVuZGVyaW5nOwotICAgIC8qKjwgTGlzdCBvZiBlZmZlY3RzICovCi0gICAgTTRNQ1NfRWZmZWN0U2V0dGluZ3MgICAgICAgICAgICAgICAgICAgICpwRWZmZWN0czsKLSAgICAvKio8IE51bWJlciBvZiBlZmZlY3RzIGluIHRoZSBhYm92ZSBsaXN0ICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iRWZmZWN0czsKLQotICAgIC8qLS0tIFNUSUxMIFBJQ1RVUkUgLS0tKi8KLSAgICAvKio8IFRSVUU6IEV2ZW4gaWYgdGhlIGlucHV0IGZpbGUgY29udGFpbnMgYW4gRVhJRiBzZWN0aW9uLAotICAgIHRoZSBvdXRwdXQgZmlsZSB3b24ndCBjb250YWluIGFueSBFWElGIHNlY3Rpb24uKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRpc2NhcmRFeGlmIDsKLQotICAgIC8qKjwgPVRSVUUgOiBwaWN0dXJlIG11c3QgYmUgcm90YXRlZCBpZiBFeGlmIHRhZ3MgaG9sZCBhIHJvdGF0aW9uIGluZm8KLSAgICAoYW5kIHJvdGF0aW9uIGluZm8gaXMgc2V0IHRvIDApKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkFkanVzdE9yaWVudGF0aW9uIDsKLSAgICAvKi0tLSBTVElMTCBQSUNUVVJFIC0tLSovCi0gICAgTTRPU0FfSW50MzIgb3V0cHV0VmlkZW9Qcm9maWxlOwotICAgIE00T1NBX0ludDMyIG91dHB1dFZpZGVvTGV2ZWw7Ci19IE00TUNTX091dHB1dFBhcmFtczsKLQotLyotLS0gU1RJTEwgUElDVFVSRSAtLS0qLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgTTRNQ1NfU1BPdXRwdXRSZXNvbHV0aW9uCi0gKiBAYnJpZWYgICAgU3RpbGwgcGljdHVyZSBzcGVjaWZpYyA6IE1DUyBvdXRwdXQgdGFyZ2V0ZWQgZmlsZSByZXNvbHV0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00TUNTX2tSZXNTYW1lQXNJbnB1dCAgICAgICA9IDB4MDAsIC8qd2lkdGggeCBoZWlnaHQqLwotICAgIE00TUNTX2tSZXNRVkdBICAgICAgICAgICAgICA9IDB4MDEsIC8qMzIweDI0MCovCi0gICAgTTRNQ1Nfa1Jlc1ZHQSAgICAgICAgICAgICAgID0gMHgwMiwgLyo2NDB4NDgwKi8KLSAgICBNNE1DU19rUmVzV1FWR0EgICAgICAgICAgICAgPSAweDAzLCAvKjQwMHgyNDAqLwotICAgIE00TUNTX2tSZXNXVkdBICAgICAgICAgICAgICA9IDB4MDQsIC8qODAweDQ4MCovCi0gICAgTTRNQ1Nfa1Jlc1hHQSAgICAgICAgICAgICAgID0gMHgwNSwgLyoxMDI0eDc2OCovCi0gICAgTTRNQ1Nfa1Jlc0N1c3RvbSAgICAgICAgICAgID0gMHhGRiAgLypTaXplIGlzIHNldCB2aWEgU3RpbGxQaWN0dXJlQ3VzdG9tV2lkdGgvSGVpZ2h0Ki8KLX0gTTRNQ1NfU1BPdXRwdXRSZXNvbHV0aW9uIDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICBNNE1DU19TUFN0cmF0ZWd5Ci0gKiBAYnJpZWYgICAgU3RpbGwgcGljdHVyZSBzcGVjaWZpYyA6IE1DUyBzdHJhdGVneSB0byBjb25maWd1cmUgdGhlIGVuY29kaW5nIHBhcmFtZXRlcnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRNQ1Nfa0ZpbGVTaXplT25seUZpeGVkICAgICAgICAgICAgPSAweDAwLCAvKlN0aWxsUGljdHVyZVJlc29sdXRpb24gYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbGl0eUZhY3RvciBhcmUgaWdub3JlZCovCi0gICAgTTRNQ1Nfa0ZpbGVTaXplQW5kUmVzRml4ZWQgICAgICAgICAgPSAweDAxLCAvKlF1YWxpdHlGYWN0b3IgaXMgaWdub3JlZCovCi0gICAgTTRNQ1Nfa1F1YWxpdHlBbmRSZXNGaXhlZCAgICAgICAgICAgPSAweDAyICAvKk91dHB1dEZpbGVTaXplIGlzIGlnbm9yZWQqLwotfSBNNE1DU19TUFN0cmF0ZWd5IDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICBNNE1DU19TUENyb3AKLSAqIEBicmllZiAgICBTdGlsbCBwaWN0dXJlIHNwZWNpZmljIDogaW5kaWNhdGUgd2hldGhlciBjcm9wcGluZyBzaG91bGQgYmUgZG9uZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZSBjaGFuZ2luZyB0aGUgcmVzb2x1dGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNE1DU19rTm9Dcm9wICAgICAgICAgICAgICAgID0gMHgwMCwgLypObyBDcm9wcGluZyBpcyBwZXJmb3JtZWQqLwotICAgIE00TUNTX2tDcm9wQmVmb3JlUmVzaXplICAgICAgPSAweDAxICAvKklucHV0IGltYWdlIGlzIGNyb3BwZWQgKGJlZm9yZSBjaGFuZ2luZyByZXNvbHV0aW9uKSovCi19IE00TUNTX1NQQ3JvcCA7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRNQ1NfRW5jb2RpbmdQYXJhbXMKLSAqIEBicmllZiAgICBNQ1MgZmlsZSBzaXplLCBiaXRyYXRlIGFuZCBjdXQgcGFyYW1ldGVycwotICogQG5vdGUgICAgIEZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSB1c2VkIGZvciBzdGlsbCBwaWN0dXJlIGlucHV0cyA6Ci0gKiAgICAgICAgICAgICAtIE91dHB1dEZpbGVTaXplCi0gKiAgICAgICAgICAgICAtIFN0aWxsUGljdHVyZVJlc29sdXRpb24KLSAqICAgICAgICAgICAgIC0gUXVhbGl0eUZhY3RvcgotICogICAgICAgICAgICAgLSBTdGlsbFBpY3R1cmVTdHJhdGVneQotICogICAgICAgICAgICAgLSBTdGlsbFBpY3R1cmVDdXN0b21XaWR0aC9IZWlnaHQgKGlmIFN0aWxsUGljdHVyZVJlc29sdXRpb249PU00TUNTX2tSZXNDdXN0b20pCi0gKiAgICAgICAgICAgIFN0aWxsIHBpY3R1cmUgb25seSBwYXJhbWV0ZXJzIDogU3RpbGxQaWN0dXJlUmVzb2x1dGlvbiwgUXVhbGl0eUZhY3RvciwKLSAqICAgICAgICAgICAgU3RpbGxQaWN0dXJlU3RyYXRlZ3kgYW5kIFN0aWxsUGljdHVyZUN1c3RvbVdpZHRoL0hlaWdodAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00VklERU9FRElUSU5HX0JpdHJhdGUgICAgT3V0cHV0VmlkZW9CaXRyYXRlOyAgICAgLyoqPCBUYXJnZXRlZCB2aWRlbyBiaXRyYXRlICovCi0gICAgTTRWSURFT0VESVRJTkdfQml0cmF0ZSAgICBPdXRwdXRBdWRpb0JpdHJhdGU7ICAgICAvKio8IFRhcmdldGVkIGF1ZGlvIGJpdHJhdGUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgIEJlZ2luQ3V0VGltZTsgICAgICAgICAgIC8qKjwgQmVnaW5uaW5nIGN1dCB0aW1lIGluIGlucHV0IGZpbGUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgIEVuZEN1dFRpbWU7ICAgICAgICAgICAgIC8qKjwgRW5kIGN1dCB0aW1lIGluIGlucHV0IGZpbGUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgIE91dHB1dEZpbGVTaXplOyAgICAgICAgIC8qKjwgRXhwZWN0ZWQgcmVzdWx0aW5nIGZpbGUgc2l6ZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgT3V0cHV0VmlkZW9UaW1lc2NhbGU7ICAgLyoqPCBPcHRpb25hbCBwYXJhbWV0ZXIgdXNlZCB0byBmaXggYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc2NhbGUgZHVyaW5nIHRyYW5zY29kaW5nICovCi0KLSAgICAvKi0tLSBTVElMTCBQSUNUVVJFIC0tLSovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICBRdWFsaXR5RmFjdG9yIDsgICAgICAgICAvKio8ID0tMSAodW5kZWZpbmVkKSBvciAwKGxvd2VzdCkuLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTAoYmVzdCkgOiBUaGlzIHBhcmFtZXRlciBpcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHkgaW5kaWNhdGlvbiBmb3IgdGhlIEpQRUcgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIChpZiA9LTEgdGhlIE1DUyB3aWxsIHNldCBxdWFsaXR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5KSovCi0gICAgTTRNQ1NfU1BTdHJhdGVneSAgICAgICAgICAgIFN0aWxsUGljdHVyZVN0cmF0ZWd5IDsgLyoqPCBEZWZpbmVzIHdoaWNoIGlucHV0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgdGFrZW4gaW50byBhY2NvdW50IGJ5IE1DUyovCi0gICAgTTRNQ1NfU1BPdXRwdXRSZXNvbHV0aW9uICAgIFN0aWxsUGljdHVyZVJlc29sdXRpb247LyoqPCBEZXNpcmVkIG91dHB1dCByZXNvbHV0aW9uIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBzdGlsbCBwaWN0dXJlIGZpbGUgKi8KLSAgICAvKio8IChvbmx5IGlmIFJlc29sdXRpb249PU00TUNTX2tSZXNDdXN0b20pIDogQ3VzdG9tIG91dHB1dCBpbWFnZSB3aWR0aCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICBTdGlsbFBpY3R1cmVDdXN0b21XaWR0aDsKLSAgICAvKio8IChvbmx5IGlmIFJlc29sdXRpb249PU00TUNTX2tSZXNDdXN0b20pIDogQ3VzdG9tIG91dHB1dCBpbWFnZSBoZWlnaHQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgU3RpbGxQaWN0dXJlQ3VzdG9tSGVpZ2h0OwotICAgIC8qKjwgSW5kaWNhdGUgd2hldGhlciBDcm9wIHNob3VsZCBiZSBwZXJmb3JtZWQgKi8KLSAgICBNNE1DU19TUENyb3AgICAgICAgICAgICAgICAgU3RpbGxQaWN0dXJlQ3JvcDsKLSAgICAvKio8IChvbmx5IGlmIGNyb3BwaW5nKSBYIGNvb3JkaW5hdGUgb2YgdG9wbGVmdCBjb3JuZXIgb2YgdGhlIGNyb3Agd2luZG93ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIFN0aWxsUGljdHVyZUNyb3BfWDsKLSAgICAvKio8IChvbmx5IGlmIGNyb3BwaW5nKSBZIGNvb3JkaW5hdGUgb2YgdG9wbGVmdCBjb3JuZXIgb2YgdGhlIGNyb3Agd2luZG93ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIFN0aWxsUGljdHVyZUNyb3BfWTsKLSAgICAvKio8IChvbmx5IGlmIGNyb3BwaW5nKSBXaWR0aCBvZiB0aGUgY3JvcCB3aW5kb3cgKGluIHBpeGVscykgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgU3RpbGxQaWN0dXJlQ3JvcF9XOwotICAgIC8qKjwgKG9ubHkgaWYgY3JvcHBpbmcpIEhlaWdodCBvZiB0aGUgY3JvcCB3aW5kb3cgKGluIHBpeGVscykgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgU3RpbGxQaWN0dXJlQ3JvcF9IOwotICAgIC8qLS0tIFNUSUxMIFBJQ1RVUkUgLS0tKi8KLX0gTTRNQ1NfRW5jb2RpbmdQYXJhbXM7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2dldFZlcnNpb24oTTRfVmVyc2lvbkluZm8qIHBWZXJzaW9uSW5mbyk7Ci0gKiBAYnJpZWYgICAgR2V0IHRoZSBNQ1MgdmVyc2lvbi4KLSAqIEBub3RlIENhbiBiZSBjYWxsZWQgYW55dGltZS4gRG8gbm90IG5lZWQgYW55IGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcFZlcnNpb25JbmZvICAgICAgICAoT1VUKSBQb2ludGVyIHRvIGEgdmVyc2lvbiBpbmZvIHN0cnVjdHVyZQotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVI6ICAgIHBWZXJzaW9uSW5mbyBpcyBNNE9TQV9OVUxMIChJZiBEZWJ1ZyBMZXZlbCA+PSAyKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfZ2V0VmVyc2lvbihNNF9WZXJzaW9uSW5mbyogcFZlcnNpb25JbmZvKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW5pdChNNE1DU19Db250ZXh0KiBwQ29udGV4dCwgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRQdHJGY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogcEZpbGVXcml0ZVB0ckZjdCk7Ci0gKiBAYnJpZWYgICAgSW5pdGlhbGl6ZXMgdGhlIE1DUyAoYWxsb2NhdGVzIGFuIGV4ZWN1dGlvbiBjb250ZXh0KS4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoT1VUKSBQb2ludGVyIG9uIHRoZSBNQ1MgY29udGV4dCB0byBhbGxvY2F0ZQotICogQHBhcmFtICAgIHBGaWxlUmVhZFB0ckZjdCAgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSByZWFkZXIgZnVuY3Rpb25zCi0gKiBAcGFyYW0gICAgcEZpbGVXcml0ZVB0ckZjdCAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHdyaXRlciBmdW5jdGlvbnMKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKElmIERlYnVnIExldmVsID49IDIpCi0gKiBAcmV0dXJuICAgTTRFUlJfQUxMT0M6ICAgICAgICBUaGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2luaXQoTTRNQ1NfQ29udGV4dCogcENvbnRleHQsIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVSZWFkUHRyRmN0LAotICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiBwRmlsZVdyaXRlUHRyRmN0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1Nfb3BlbihNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwRmlsZUluLCBNNE9TQV9Wb2lkKiBwRmlsZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpTWF4TWV0YWRhdGFTaXplKTsKLSAqIEBicmllZiAgIFNldCB0aGUgTUNTIGlucHV0IGFuZCBvdXRwdXQgZmlsZXMuCi0gKiBAbm90ZSAgICBJdCBvcGVucyB0aGUgaW5wdXQgZmlsZSwgYnV0IHRoZSBvdXRwdXQgZmlsZSBpcyBub3QgY3JlYXRlZCB5ZXQuCi0gKiAgICAgICAgICBJbiBjYXNlIG9mIHN0aWxsIHBpY3R1cmUsIGZvdXIgSW5wdXRGaWxlVHlwZSBhcmUgcG9zc2libGUKLSAqICAgICAgICAgIChNNFZJREVPRURJVElOR19rRmlsZVR5cGVfSlBHL0JNUC9HSUYvUE5HCi0gKiAgICAgICAgICBJZiBvbmUgb2YgdGhlbSBpcyBzZXQsIHRoZSBPdXRwdXRGaWxlVHlwZSBTSEFMTCBiZSBzZXQgdG8gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0pQRwotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcGFyYW0gICBwRmlsZUluICAgICAgICAgICAgIChJTikgSW5wdXQgZmlsZSB0byB0cmFuc2NvZGUgKFRoZSB0eXBlIG9mIHRoaXMgcGFyYW1ldGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVUkwsIHBpcGUuLi4pIGRlcGVuZHMgb24gdGhlIE9TQUwgaW1wbGVtZW50YXRpb24pLgotICogQHBhcmFtICAgbWVkaWFUeXBlICAgICAgICAgICAoSU4pIENvbnRhaW5lciB0eXBlICguM2dwLC5hbXIsIC4uLikgb2YgaW5wdXQgZmlsZS4KLSAqIEBwYXJhbSAgIHBGaWxlT3V0ICAgICAgICAgICAgKElOKSBPdXRwdXQgZmlsZSB0byBjcmVhdGUgIChUaGUgdHlwZSBvZiB0aGlzIHBhcmFtZXRlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVVJMLCBwaXBlLi4uKSBkZXBlbmRzIG9uIHRoZSBPU0FMIGltcGxlbWVudGF0aW9uKS4KLSAqIEBwYXJhbSAgIHBUZW1wRmlsZSAgICAgICAgICAgKElOKSBUZW1wb3JhcnkgZmlsZSBmb3IgdGhlIGNvbnN0YW50IG1lbW9yeSB3cml0ZXIgdG8gc3RvcmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgKCJtb292LmJpbiIpLgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICBNNEVSUl9BTExPQzogICAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICogQHJldHVybiAgTTRFUlJfRklMRV9OT1RfRk9VTkQ6ICAgVGhlIGlucHV0IGZpbGUgaGFzIG5vdCBiZWVuIGZvdW5kCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfSU5WQUxJRF9JTlBVVF9GSUxFOiAgIFRoZSBpbnB1dCBmaWxlIGlzIG5vdCBhIHZhbGlkIGZpbGUsIG9yIGlzIGNvcnJ1cHRlZAotICogQHJldHVybiAgTTRNQ1NfRVJSX0lOUFVUX0ZJTEVfQ09OVEFJTlNfTk9fU1VQUE9SVEVEX1NUUkVBTTogIFRoZSBpbnB1dCBmaWxlIGNvbnRhaW5zIG5vCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZCBhdWRpbyBvciB2aWRlbyBzdHJlYW0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX29wZW4oTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVm9pZCogcEZpbGVJbiwKLSAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIElucHV0RmlsZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwRmlsZU91dCwgTTRPU0FfVm9pZCogcFRlbXBGaWxlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1Nfc3RlcChNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9VSW50OCAqcFByb2dyZXNzKTsKLSAqIEBicmllZiAgIFBlcmZvcm0gb25lIHN0ZXAgb2YgdHJhbmNvZGluZy4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBQcm9ncmVzcyAgICAgICAgICAgKE9VVCkgUHJvZ3Jlc3MgcGVyY2VudGFnZSAoMCB0byAxMDApIG9mIHRoZSB0cmFuc2NvZGluZwotICogQG5vdGUgICAgcFByb2dyZXNzIG11c3QgYmUgYSB2YWxpZCBhZGRyZXNzLgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBPbmUgb2YgdGhlIHBhcmFtZXRlcnMgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqIEByZXR1cm4gIE00TUNTX1dBUl9UUkFOU0NPRElOR19ET05FOiBUcmFuc2NvZGluZyBpcyBvdmVyLCB1c2VyIHNob3VsZCBub3cgY2FsbCBNNE1DU19jbG9zZSgpCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfQVVESU9fQ09OVkVSU0lPTl9GQUlMRUQ6IFRoZSBhdWRpbyBjb252ZXJzaW9uIChBQUMgdG8gQU1SLU5CLCBNUDMpIGZhaWxlZAotICogQHJldHVybiAgTTRNQ1NfRVJSX0lOVkFMSURfQUFDX1NBTVBMSU5HX0ZSRVFVRU5DWTogVGhlIGlucHV0IGZpbGUgY29udGFpbnMgYW4gQUFDIGF1ZGlvIHRyYWNrCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBhbiBpbnZhbGlkIHNhbXBsaW5nIGZyZXF1ZW5jeQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaG91bGQgbmV2ZXIgaGFwcGVuKQotICogQHJldHVybiAgTTRNQ1NfV0FSX1BJQ1RVUkVfQVVUT19SRVNJWkU6IFBpY3R1cmUgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlc2l6ZWQgdG8gZml0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludG8gcmVxdWlyZW1lbnRzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19zdGVwKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1VJbnQ4ICpwUHJvZ3Jlc3MpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19wYXVzZShNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLSAqIEBicmllZiAgIFBhdXNlIHRoZSB0cmFuc2NvZGluZyBpLmUuIHJlbGVhc2UgdGhlIChleHRlcm5hbCBoYXJkd2FyZSkgdmlkZW8gZGVjb2Rlci4KLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IG5lZWRlZCBpZiBubyBoYXJkd2FyZSBhY2NlbGVyYXRvcnMgYXJlIHVzZWQuCi0gKiAgICAgICAgICBJbiB0aGF0IGNhc2UsIHBhdXNpbmcgdGhlIE1DUyBpcyBzaW1wbHkgYWNoaWV2ZWQgYnkgdGVtcG9yYXJpbHkgc3VzcGVuZGluZwotICogICAgICAgICAgdGhlIE00TUNTX3N0ZXAgZnVuY3Rpb24gY2FsbHMuCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX3BhdXNlKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19yZXN1bWUoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0gKiBAYnJpZWYgICBSZXN1bWUgdGhlIHRyYW5zY29kaW5nIGFmdGVyIGEgcGF1c2UgKHNlZSBNNE1DU19wYXVzZSkuCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBuZWVkZWQgaWYgbm8gaGFyZHdhcmUgYWNjZWxlcmF0b3JzIGFyZSB1c2VkLgotICogICAgICAgICAgSW4gdGhhdCBjYXNlLCByZXN1bWluZyB0aGUgTUNTIGlzIHNpbXBseSBhY2hpZXZlZCBieSBjYWxsaW5nCi0gKiAgICAgICAgICB0aGUgTTRNQ1Nfc3RlcCBmdW5jdGlvbi4KLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfcmVzdW1lKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19jbG9zZShNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLSAqIEBicmllZiAgICBGaW5pc2ggdGhlIE1DUyB0cmFuc2NvZGluZy4KLSAqIEBub3RlIFRoZSBvdXRwdXQgM0dQUCBmaWxlIGlzIHJlYWR5IHRvIGJlIHBsYXllZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChJZiBEZWJ1ZyBMZXZlbCA+PSAyKQotICogQHJldHVybiAgIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2Nsb3NlKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19jbGVhblVwKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgIEZyZWUgYWxsIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBNQ1MuCi0gKiBAbm90ZSBUaGUgY29udGV4dCBpcyBubyBtb3JlIHZhbGlkIGFmdGVyIHRoaXMgY2FsbAotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKElmIERlYnVnIExldmVsID49IDIpCi0gKiBAcmV0dXJuICAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfY2xlYW5VcChNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfYWJvcnQoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0gKiBAYnJpZWYgICAgRmluaXNoIHRoZSBNQ1MgdHJhbnNjb2RpbmcgYW5kIGZyZWUgYWxsIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBNQ1MKLSAqICAgICAgICAgIHdoYXRldmVyIHRoZSBzdGF0ZSBpcy4KLSAqIEBub3RlICAgIFRoZSBjb250ZXh0IGlzIG5vIG1vcmUgdmFsaWQgYWZ0ZXIgdGhpcyBjYWxsCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfYWJvcnQoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2dldElucHV0RmlsZVByb3BlcnRpZXMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMqIHBGaWxlUHJvcGVydGllcyk7Ci0gKiBAYnJpZWYgICBSZXRyaWV2ZXMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGF1ZGlvIGFuZCB2aWRlbyBzdHJlYW1zIGZyb20gdGhlIGlucHV0IGZpbGUuCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBQcm9wZXJ0aWVzICAgICAgICAgKE9VVCkgUG9pbnRlciBvbiBhbiBhbGxvY2F0ZWQgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlIHdoaWNoIGlzIGZpbGxlZCB3aXRoIHRoZSBpbnB1dCBzdHJlYW0gcHJvcGVydGllcy4KLSAqIEBub3RlICAgIFRoZSBzdHJ1Y3R1cmUgcFByb3BlcnRpZXMgbXVzdCBiZSBhbGxvY2F0ZWQgYW5kIGZ1cnRoZXIgZGUtYWxsb2NhdGVkCi0gICAgICAgICAgICBieSB0aGUgYXBwbGljYXRpb24uIFRoZSBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBpbiB0aGUgb3BlbmVkIHN0YXRlLgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2dldElucHV0RmlsZVByb3BlcnRpZXMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyAqcEZpbGVQcm9wZXJ0aWVzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00TUNTX091dHB1dFBhcmFtcyogcFBhcmFtcyk7Ci0gKiBAYnJpZWYgICBTZXQgdGhlIE1DUyB2aWRlbyBvdXRwdXQgcGFyYW1ldGVycy4KLSAqIEBub3RlICAgIE11c3QgYmUgY2FsbGVkIGFmdGVyIE00TUNTX29wZW4uIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBNNE1DU19zdGVwLgotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcGFyYW0gICBwUGFyYW1zICAgICAgICAgICAgIChJTi9PVVQpIFRyYW5zY29kaW5nIHBhcmFtZXRlcnMKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgTTRNQ1NfRVJSX0lOVkFMSURfVklERU9fRlJBTUVfU0laRV9GT1JfSDI2MyA6IE91dHB1dCB2aWRlbyBmcmFtZSBzaXplIHBhcmFtZXRlciBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb21wYXRpYmxlIHdpdGggSDI2MyBlbmNvZGluZwotICogQHJldHVybiAgTTRNQ1NfRVJSX0lOVkFMSURfVklERU9fRlJBTUVfUkFURV9GT1JfSDI2MyA6IE91dHB1dCB2aWRlbyBmcmFtZSBzaXplIHBhcmFtZXRlciBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb21wYXRpYmxlIHdpdGggSDI2MyBlbmNvZGluZwotICogQHJldHVybiAgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRk9STUFUICAgICA6IFVuZGVmaW5lZCBvdXRwdXQgdmlkZW8gZm9ybWF0IHBhcmFtZXRlcgotICogQHJldHVybiAgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfU0laRSA6IFVuZGVmaW5lZCBvdXRwdXQgdmlkZW8gZnJhbWUgc2l6ZQotICogQHJldHVybiAgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfUkFURSA6IFVuZGVmaW5lZCBvdXRwdXQgdmlkZW8gZnJhbWUgcmF0ZQotICogQHJldHVybiAgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfQVVESU9fRk9STUFUIDogVW5kZWZpbmVkIG91dHB1dCBhdWRpbyBmb3JtYXQgcGFyYW1ldGVyCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfRFVSQVRJT05fSVNfTlVMTCA6IFNwZWNpZmllZCBvdXRwdXQgcGFyYW1ldGVycyBkZWZpbmUgYSBudWxsIGR1cmF0aW9uIHN0cmVhbQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5vIGF1ZGlvIGFuZCB2aWRlbykKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX3NldE91dHB1dFBhcmFtcyhNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNE1DU19PdXRwdXRQYXJhbXMqIHBQYXJhbXMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19zZXRFbmNvZGluZ1BhcmFtcyhNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNE1DU19FbmNvZGluZ1BhcmFtcyogcFJhdGVzKQotICogQGJyaWVmICAgU2V0IHRoZSB2YWx1ZXMgb2YgdGhlIGVuY29kaW5nIHBhcmFtZXRlcnMKLSAqIEBub3RlICAgIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBNNE1DU19jaGVja1BhcmFtc0FuZFN0YXJ0KCkuCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHBhcmFtICAgcFJhdGVzICAgICAgICAgICAgIChJTikgVHJhbnNjb2RpbmcgcGFyYW1ldGVycwotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19ISUdIOiBBdWRpbyBiaXRyYXRlIHRvbyBoaWdoICh3ZSBsaW1pdCB0byA5NiBrYnBzKQotICogQHJldHVybiAgTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fTE9XOiBBdWRpbyBiaXRyYXRlIGlzIHRvbyBsb3cgKDE2IGticHMgbWluIGZvciBhYWMsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMi4yIGZvciBhbXIsIDggZm9yIG1wMykKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9CRUdJTl9DVVRfRVFVQUxTX0VORF9DVVQ6IEJlZ2luIGN1dCBhbmQgRW5kIGN1dCBhcmUgZXF1YWxzCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0RVUkFUSU9OOiBCZWdpbiBjdXQgdGltZSBpcyBsYXJnZXIgdGhhbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbnB1dCBjbGlwIGR1cmF0aW9uCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfRU5EX0NVVF9TTUFMTEVSX1RIQU5fQkVHSU5fQ1VUOiBFbmQgY3V0IHRpbWUgaXMgc21hbGxlciB0aGFuIGJlZ2luIGN1dCB0aW1lCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfTUFYRklMRVNJWkVfVE9PX1NNQUxMOiBOb3QgZW5vdWdoIHNwYWNlIHRvIHN0b3JlIHdob2xlIG91dHB1dAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgYXQgZ2l2ZW4gYml0cmF0ZXMKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9WSURFT0JJVFJBVEVfVE9PX0hJR0g6IFZpZGVvIGJpdHJhdGUgdG9vIGhpZ2ggKHdlIGxpbWl0IHRvIDgwMCBrYnBzKQotICogQHJldHVybiAgTTRNQ1NfRVJSX1ZJREVPQklUUkFURV9UT09fTE9XOiBWaWRlbyBiaXRyYXRlIHRvbyBsb3cKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX3NldEVuY29kaW5nUGFyYW1zKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00TUNTX0VuY29kaW5nUGFyYW1zKiBwUmF0ZXMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19nZXRFeHRlbmRlZEVuY29kaW5nUGFyYW1zKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00TUNTX0VuY29kaW5nUGFyYW1zKiBwUmF0ZXMpCi0gKiBAYnJpZWYgICBHZXQgdGhlIGV4dGVuZGVkIHZhbHVlcyBvZiB0aGUgZW5jb2RpbmcgcGFyYW1ldGVycwotICogQG5vdGUgICAgQ291bGQgYmUgY2FsbGVkIGFmdGVyIE00TUNTX3NldEVuY29kaW5nUGFyYW1zLgotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBSYXRlcyAgICAgICAgICAgICAoT1VUKSBUcmFuc2NvZGluZyBwYXJhbWV0ZXJzCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9CRUdJTl9DVVRfRVFVQUxTX0VORF9DVVQ6IEVuY29kaW5nIHNldHRpbmdzIHdvdWxkIHByb2R1Y2UgYQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCBkdXJhdGlvbiBjbGlwID0gZW5jb2RpbmcgaXMgaW1wb3NzaWJsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfZ2V0RXh0ZW5kZWRFbmNvZGluZ1BhcmFtcyhNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNE1DU19FbmNvZGluZ1BhcmFtcyogcFJhdGVzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfY2hlY2tQYXJhbXNBbmRTdGFydChNNE1DU19Db250ZXh0IHBDb250ZXh0KQotICogQGJyaWVmCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fSElHSDogQXVkaW8gYml0cmF0ZSB0b28gaGlnaCAod2UgbGltaXQgdG8gOTYga2JwcykKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0xPVzogQXVkaW8gYml0cmF0ZSBpcyB0b28gbG93ICgxNiBrYnBzIG1pbiBmb3IgYWFjLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIuMiBmb3IgYW1yLCA4IGZvciBtcDMpCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfQkVHSU5fQ1VUX0VRVUFMU19FTkRfQ1VUOiBCZWdpbiBjdXQgYW5kIEVuZCBjdXQgYXJlIGVxdWFscwotICogQHJldHVybiAgTTRNQ1NfRVJSX0JFR0lOX0NVVF9MQVJHRVJfVEhBTl9EVVJBVElPTjogQmVnaW4gY3V0IHRpbWUgaXMgbGFyZ2VyIHRoYW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbnB1dCBjbGlwIGR1cmF0aW9uCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfRU5EX0NVVF9TTUFMTEVSX1RIQU5fQkVHSU5fQ1VUOiBFbmQgY3V0IHRpbWUgaXMgc21hbGxlciB0aGFuIGJlZ2luIGN1dCB0aW1lCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfTUFYRklMRVNJWkVfVE9PX1NNQUxMOiBOb3QgZW5vdWdoIHNwYWNlIHRvIHN0b3JlIHdob2xlIG91dHB1dAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgYXQgZ2l2ZW4gYml0cmF0ZXMKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9WSURFT0JJVFJBVEVfVE9PX0hJR0g6IFZpZGVvIGJpdHJhdGUgdG9vIGhpZ2ggKHdlIGxpbWl0IHRvIDgwMCBrYnBzKQotICogQHJldHVybiAgTTRNQ1NfRVJSX1ZJREVPQklUUkFURV9UT09fTE9XOiAgVmlkZW8gYml0cmF0ZSB0b28gbG93Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19jaGVja1BhcmFtc0FuZFN0YXJ0KE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLyogX19NNE1DU19BUElfSF9fICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jL000TUNTX0Vycm9yQ29kZXMuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jL000TUNTX0Vycm9yQ29kZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzA0MmRiYi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYy9NNE1DU19FcnJvckNvZGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRNQ1NfQVBJLmgKLSAqIEBicmllZiAgTUNTIGVycm9yIGNvZGVzIGRlZmluaXRpb25zIChNZWRpYSBDb21wcmVzc29yIFNlcnZpY2UpCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKi8KLQotI2lmbmRlZiBfX000TUNTX0Vycm9yQ29kZXNfSF9fCi0jZGVmaW5lIF9fTTRNQ1NfRXJyb3JDb2Rlc19IX18KLQotLyoqCi0gKiAgICBPU0FMIGJhc2ljIHR5cGVzIGFuZCBlcnJvcnMgKi8KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0KLS8qKgotICogICAgT1NBTCBjb3JlIElEIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFdhcm5pbmcgY29kZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBFbmQgb2YgcHJvY2Vzc2luZywgdXNlciBzaG91bGQgbm93IGNhbGwgTTRNQ1NfY2xvc2UoKSAqLwotI2RlZmluZSBNNE1DU19XQVJfVFJBTlNDT0RJTkdfRE9ORSAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X1dBUiwgTTRNQ1MsIDB4MSkKLS8qIE1lZGlhdHlwZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBNQ1MgKi8KLSNkZWZpbmUgTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X1dBUiwgTTRNQ1MsIDB4MikKLS8qIEluZGljYXRlIHRoYXQgcGljdHVyZSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVzaXplZCB0byBmaXQgaW50byB0aGUgcmVxdWlyZWQKLSAgIHBhcmFtZXRlcnMgKGZpbGUgc2l6ZSkgKi8KLSNkZWZpbmUgTTRNQ1NfV0FSX1BJQ1RVUkVfQVVUT19SRVNJWkUgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X1dBUiwgTTRNQ1MsIDB4MykKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEVycm9yIGNvZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLS8qIC0tLS0tIE9QRU4gRVJST1JTIC0tLS0tICovCi0KLS8qIFRoZSBpbnB1dCBmaWxlIGNvbnRhaW5zIG5vIHN1cHBvcnRlZCBzdHJlYW0gKG1heSBiZSBhIGNvcnJ1cHRlZCBmaWxlKSAqLwotI2RlZmluZSBNNE1DU19FUlJfSU5QVVRfRklMRV9DT05UQUlOU19OT19TVVBQT1JURURfU1RSRUFNICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgwMSkKLS8qIFRoZSBpbnB1dCBmaWxlIGlzIGludmFsaWQvY29ycnVwdGVkICovCi0jZGVmaW5lIE00TUNTX0VSUl9JTlZBTElEX0lOUFVUX0ZJTEUgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDAyKQotLyogVGhlIGlucHV0IHZpZGVvIGZyYW1lIHNpemUgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCAqLwotI2RlZmluZSBNNE1DU19FUlJfSU5WQUxJRF9JTlBVVF9WSURFT19GUkFNRV9TSVpFICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgwMykKLS8qIFRoZSBpbnB1dCB2aWRlbyBmcmFtZSBzaXplIGlzIG5vbiBtdWx0aXBsZSBvZiAxNiAqLwotI2RlZmluZSBNNE1DU19FUlJfSU5QVVRfVklERU9fU0laRV9OT05fWDE2ICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgwNCkKLQotCi0vKiAtLS0tLSBTRVQgT1VUUFVUIFBBUkFNUyBFUlJPUlMgLS0tLS0gKi8KLQotLyogVGhlIG91dHB1dCB2aWRlbyBmb3JtYXQgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCAqLwotI2RlZmluZSBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GT1JNQVQgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgxMCkKLS8qIFRoZSBvdXRwdXQgdmlkZW8gZnJhbWUgc2l6ZSBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkICovCi0jZGVmaW5lIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZSQU1FX1NJWkUgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDExKQotLyogVGhlIG91dHB1dCB2aWRlbyBmcmFtZSByYXRlIHBhcmFtZXRlciBpcyB1bmRlZmluZWQgKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfUkFURSAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4MTIpCi0vKiBUaGUgb3V0cHV0IGF1ZGlvIGZvcm1hdCBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkICovCi0jZGVmaW5lIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX0FVRElPX0ZPUk1BVCAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDEzKQotLyogVGhlIG91dHB1dCB2aWRlbyBmcmFtZSBzaXplIHBhcmFtZXRlciBpcyBpbmNvbXBhdGlibGUgd2l0aCBIMjYzIGVuY29kaW5nICovCi0jZGVmaW5lIE00TUNTX0VSUl9JTlZBTElEX1ZJREVPX0ZSQU1FX1NJWkVfRk9SX0gyNjMgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDE0KQotLyogVGhlIG91dHB1dCB2aWRlbyBmcmFtZSByYXRlIHBhcmFtZXRlciBpcyBpbmNvbXBhdGlibGUgd2l0aCBIMjYzIGVuY29kaW5nCi0gICAoSXQgY2FuJ3QgaGFwcGVuIGluIGN1cnJlbnQgdmVyc2lvbiBvZiBNQ1MhKSAqLwotI2RlZmluZSBNNE1DU19FUlJfSU5WQUxJRF9WSURFT19GUkFNRV9SQVRFX0ZPUl9IMjYzICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgxNSkKLS8qIEEgbnVsbCBjbGlwIGR1cmF0aW9uIGFzIGJlZW4gY29tcHV0ZWQsIHdoaWNoIGlzIHVudmFsaWQgKHNob3VsZCBuZXZlciBoYXBwZW4hKSAqLwotI2RlZmluZSBNNE1DU19FUlJfRFVSQVRJT05fSVNfTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgxNikKLS8qIFRoZSAubXA0IGNvbnRhaW5lciBjYW5ub3QgaGFuZGxlIGgyNjMgY29kZWMgKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX0gyNjNfRk9SQklEREVOX0lOX01QNF9GSUxFICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4MTcpCi0KLQotLyogLS0tLS0gUFJFUEFSRSBERUNPREVSUyBFUlJPUlMgLS0tLS0gKi8KLQotLyogSDI2MyBQcm9maWxlIChvdGhlciB0aGFuIDApIGlzIG5vdCBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX0gyNjNfUFJPRklMRV9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4MjApCi0vKiBUaGUgaW5wdXQgZmlsZSBjb250YWlucyBhbiBBQUMgYXVkaW8gdHJhY2sgd2l0aCBhbiBpbnZhbGlkIHNhbXBsaW5nIGZyZXF1ZW5jeQotICAgKHNob3VsZCBuZXZlciBoYXBwZW4pICovCi0jZGVmaW5lIE00TUNTX0VSUl9JTlZBTElEX0FBQ19TQU1QTElOR19GUkVRVUVOQ1kgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDIxKQotLyogVGhlIGF1ZGlvIGNvbnZlcnNpb24gKEFBQyB0byBBTVItTkIsIG9yIE1QMykgZmFpbGVkICovCi0jZGVmaW5lIE00TUNTX0VSUl9BVURJT19DT05WRVJTSU9OX0ZBSUxFRCAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDIyKQotCi0KLS8qIC0tLS0tIFNFVCBFTkNPRElORyBQQVJBTVMgRVJST1JTIC0tLS0tICovCi0KLS8qIEJlZ2luIGN1dCB0aW1lIGlzIGxhcmdlciB0aGFuIHRoZSBpbnB1dCBjbGlwIGR1cmF0aW9uICovCi0jZGVmaW5lIE00TUNTX0VSUl9CRUdJTl9DVVRfTEFSR0VSX1RIQU5fRFVSQVRJT04gICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDMwKQotLyogQmVnaW4gY3V0IGFuZCBFbmQgY3V0IGFyZSBlcXVhbHMgKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX0JFR0lOX0NVVF9FUVVBTFNfRU5EX0NVVCAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4MzEpCi0vKiBFbmQgY3V0IHRpbWUgaXMgc21hbGxlciB0aGFuIGJlZ2luIGN1dCB0aW1lICovCi0jZGVmaW5lIE00TUNTX0VSUl9FTkRfQ1VUX1NNQUxMRVJfVEhBTl9CRUdJTl9DVVQgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDMyKQotLyogTm90IGVub3VnaCBzcGFjZSB0byBzdG9yZSB3aG9sZSBvdXRwdXQgZmlsZSBhdCBnaXZlbiBiaXRyYXRlcyAqLwotI2RlZmluZSBNNE1DU19FUlJfTUFYRklMRVNJWkVfVE9PX1NNQUxMICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgzMykKLS8qIFZpZGVvIGJpdHJhdGUgaXMgdG9vIGxvdyAoYXZvaWQgdWdseSB2aWRlbykgKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX1ZJREVPQklUUkFURV9UT09fTE9XICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4MzQpCi0vKiBBdWRpbyBiaXRyYXRlIGlzIHRvbyBsb3cgKDE2IGticHMgbWluIGZvciBhYWMsIDEyLjIgZm9yIGFtciwgOCBmb3IgbXAzKSAqLwotI2RlZmluZSBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19MT1cgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgzNSkKLS8qIFZpZGVvIGJpdHJhdGUgdG9vIGhpZ2ggKHdlIGxpbWl0IHRvIDgwMCBrYnBzKSAqLwotI2RlZmluZSBNNE1DU19FUlJfVklERU9CSVRSQVRFX1RPT19ISUdIICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgzNikKLS8qIEF1ZGlvIGJpdHJhdGUgdG9vIGhpZ2ggKHdlIGxpbWl0IHRvIDk2IGticHMpICovCi0jZGVmaW5lIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0hJR0ggICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDM3KQotCi0vKiAtLS0tLSBPVEhFUlMgRVJST1JTIC0tLS0tICovCi0jZGVmaW5lIE00TUNTX0VSUl9PVVRQVVRfRklMRV9TSVpFX1RPT19TTUFMTCAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDUwKQotI2RlZmluZSBNNE1DU19FUlJfTk9NT1JFX1NQQUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00TUNTLCAweDUxKQotI2RlZmluZSBNNE1DU19FUlJfRklMRV9EUk1fUFJPVEVDVEVEICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00TUNTLCAweDUyKQotI2VuZGlmIC8qIF9fTTRNQ1NfRXJyb3JDb2Rlc19IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMvTTRNQ1NfSW50ZXJuYWxDb25maWcuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jL000TUNTX0ludGVybmFsQ29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVmYWYxZTYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMvTTRNQ1NfSW50ZXJuYWxDb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00TUNTX0FQSS5oCi0gKiBAYnJpZWYgIE1DUyBpbnRlcm5hbCBjb25zdGFudCB2YWx1ZXMgc2V0dGluZ3MKLSAqIEBub3RlICAgVGhpcyBoZWFkZXIgZmlsZSBpcyBub3QgcHVibGljCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqLwotCi0jaWZuZGVmIF9fTTRNQ1NfSU5URVJOQUxDT05GSUdfSF9fCi0jZGVmaW5lIF9fTTRNQ1NfSU5URVJOQUxDT05GSUdfSF9fCi0KLQotLyoqCi0gKiBEZWZpbml0aW9uIG9mIG1heCBBVSBzaXplICovCi0jZGVmaW5lIE00TUNTX0FVRElPX01BWF9DSFVOS19TSVpFICAgICAgICA3MTY4IC8qKjwgYWRkIG1wMyBlbmNvZGVyIGFuZCB3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4IGJpdHJhdGUgaXMgbm93IDMyMGticHMgaW5zdGVhZCBvZiAxMjhrYnBzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhpcyB2YWx1ZSBoYXMgdG8gYmUgaW5jcmVhc2VkIGFjY29yZGluZ2x5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAoKHNpemVvZihNNE9TQV9VSW50OCkqbWF4X2NoYW5uZWxfbnVtYmVyKSszCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGFrZSBhIG1hcmdpbihhZnRlciB0ZXN0cywgMiB3YXMgbm90IGVub3VnaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpKk1BWF9QQ01fR1JBTlVMQVJJVFlfU0FNUExFUyovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBCZWZvcmU6IDQwMDAqLy8qKjwgTWFnaWNhbCAqLwotCi0vKioKLSAqIFZpZGVvIG1heCBBVSBhbmQgZnJhZ21lbnQgc2l6ZSAqLwotI2RlZmluZSBNNE1DU19WSURFT19NSU5fQ09NUFJFU1NJT05fUkFUSU8gICAwLjggLyoqPCBNYWdpY2FsLiBVc2VkIHRvIGRlZmluZSB0aGUgbWF4IEFVIHNpemUgKi8KLSNkZWZpbmUgTTRNQ1NfVklERU9fQ0hVTktfQVVfU0laRV9SQVRJTyAgICAgMS4yIC8qKjwgTWFnaWNhbC4gVXNlZCB0byBkZWZpbmUgdGhlIG1heCBjaHVuayBzaXplICovCi0KLS8qKgotICogVmFyaW91cyBNYWdpY2FscyAqLwotI2RlZmluZSBNNE1DU19XUklURVJfQVVESU9fU1RSRUFNX0lEICAgICAgICAxCi0jZGVmaW5lIE00TUNTX1dSSVRFUl9WSURFT19TVFJFQU1fSUQgICAgICAgIDIKLQotLyoqCi0gKiBHcmFudWxhcml0eSBmb3IgYXVkaW8gZW5jb2RlciAqLwotIC8qKjwgbWluaW11bSBudW1iZXIgb2Ygc2FtcGxlcyB0byBwYXNzIGluIEFNUiBlbmNvZGluZyBjYXNlICovCi0jZGVmaW5lIE00TUNTX1BDTV9BTVJfR1JBTlVMQVJJVFlfU0FNUExFUyAxNjAKLS8qKjwgbWluaW11bSBudW1iZXIgb2Ygc2FtcGxlcyB0byBwYXNzIGluIEFBQyBlbmNvZGluZyBjYXNlICovCi0jZGVmaW5lIE00TUNTX1BDTV9BQUNfR1JBTlVMQVJJVFlfU0FNUExFUyAxMDI0Ci0vKio8IG1pbmltdW0gbnVtYmVyIG9mIHNhbXBsZXMgdG8gcGFzcyBpbiBNUDMgZW5jb2RpbmcgY2FzZSAqLwotI2RlZmluZSBNNE1DU19QQ01fTVAzX0dSQU5VTEFSSVRZX1NBTVBMRVMgNTc2Ci0KLSNkZWZpbmUgTTRNQ1NfQVVESU9fTUFYX0FVX1NJWkUgICAgICAgICAgIDEwMjQgIC8qKjwgYWRkIG1wMyBlbmNvZGVyIGFuZCB3cml0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgaXMgbm90IHVzZWQgYW55bW9yZSwgbm93IHRoZSBtYXggQVUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgaXMgY29tcHV0ZWQgZHluYW1pY2FsbHkgYWNjb3JkaW5nIHRvIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIGNoYW5uZWxzLHRoZSBtYXggUENNIGdyYW51bGFyaXR5IHNhbXBsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGEgbWFyZ2luLiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEJlZm9yZTogMTAyNCovLyoqPCBNYWdpY2FsICovCi0vKioKLSAqIFdyaXRlciBmaWxlIGFuZCBtb292IHNpemUgZXN0aW1hdGlvbiAqLwotI2RlZmluZSBNNE1DU19NT09WX09WRVJfRklMRVNJWkVfUkFUSU8gICAgMS4wNCAgLyoqPCBtYWdpY2FsIG1vb3Ygc2l6ZSBpcyBsZXNzIHRoYW4gNCUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgZmlsZSBzaXplIGluIGF2ZXJhZ2UgKi8KLQotLyoqCi0gKiBJZiAzZ3AgZmlsZSBkb2VzIG5vdCBjb250YWluIGFuIFNUU1MgdGFibGUgKG5vIHJhcCBmcmFtZXMpLAotICAganVtcCBiYWNrd2FyZCB0byBhIHNwZWNpZmllZCBsaW1pdCAqLwotI2RlZmluZSBNNE1DU19OT19TVFNTX0pVTVBfUE9JTlQgICAgICAgICAgNDAwMDAgLyoqPCA0MCBzICovCi0KLSNlbmRpZiAvKiBfX000TUNTX0lOVEVSTkFMQ09ORklHX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYy9NNE1DU19JbnRlcm5hbEZ1bmN0aW9ucy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMvTTRNQ1NfSW50ZXJuYWxGdW5jdGlvbnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjFjNjc5ZS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYy9NNE1DU19JbnRlcm5hbEZ1bmN0aW9ucy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRNQ1NfSW50ZXJuYWxGdW5jdGlvbnMuaAotICogQGJyaWVmICAgVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCBmdW5jdGlvbnMgZGVjbGFyYXRpb25zIGludGVybmFsCi0gKiAgICAgICAgICB0byB0aGUgTUNTLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaWZuZGVmIF9fTTRNQ1NfSU5URVJOQUxGVU5DVElPTlNfSF9fCi0jZGVmaW5lIF9fTTRNQ1NfSU5URVJOQUxGVU5DVElPTlNfSF9fCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2luY2x1ZGUgIk00VlBQX0FQSS5oIgotI2luY2x1ZGUgIk00RU5DT0RFUl9jb21tb24uaCIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19pbnRBcHBseVZQUCggTTRWUFBfQ29udGV4dCBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lT3V0KQotICogQGJyaWVmICAgRG8gdGhlIHZpZGVvIHJlbmRlcmluZyBhbmQgdGhlIHJlc2l6ZSAoaWYgbmVlZGVkKQotICogQG5vdGUgICAgSXQgaXMgY2FsbGVkIGJ5IHRoZSB2aWRlbyBlbmNvZGVyCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAoSU4pICAgICBWUFAgY29udGV4dCwgd2hpY2ggYWN0dWFsbHkgaXMgdGhlIE1DUwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwgY29udGV4dCBpbiBvdXIgY2FzZQotICogQHBhcmFtICAgcFBsYW5lSW4gICAgKElOKSAgICAgQ29udGFpbnMgdGhlIGltYWdlCi0gKiBAcGFyYW0gICBwUGxhbmVPdXQgICAoSU4vT1VUKSBQb2ludGVyIHRvIGFuIGFycmF5IG9mIDMgcGxhbmVzIHRoYXQgd2lsbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbiB0aGUgb3V0cHV0IFlVVjQyMCBpbWFnZQotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBFUlJfTUNTX1ZJREVPX0RFQ09ERV9FUlJPUjogdGhlIHZpZGVvIGRlY29kaW5nIGZhaWxlZAotICogQHJldHVybiAgRVJSX01DU19SRVNJWkVfRVJST1I6ICAgICAgIHRoZSByZXNpemluZyBmYWlsZWQKLSAqIEByZXR1cm4gIEFueSBlcnJvciByZXR1cm5lZCBieSBhbiB1bmRlcmxheWluZyBtb2R1bGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfaW50QXBwbHlWUFAoTTRWUFBfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVPdXQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX1N1YnNjcmliZU1lZGlhQW5kQ29kZWMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiByZWdpc3RlcnMgdGhlIHJlYWRlciwgZGVjb2RlcnMsIHdyaXRlcnMgYW5kIGVuY29kZXJzCi0gKiAgICAgICAgICAgaW4gdGhlIE1DUy4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgTTROT19FUlJPUjogICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSICAgIHBDb250ZXh0IGlzIE5VTEwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1Nfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYyhNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBDbGVhciBlbmNvZGVycywgZGVjb2RlcnMsIHJlYWRlciBhbmQgd3JpdGVycyBpbnRlcmZhY2VzIHRhYmxlcwotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBUaGUgY29udGV4dCBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfY2xlYXJJbnRlcmZhY2VUYWJsZXMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlcldyaXRlcihNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgTWVkaWFUeXBlLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlICpwV3RyR2xvYmFsSW50ZXJmYWNlLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSAqcFd0ckRhdGFJbnRlcmZhY2UpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVnaXN0ZXIgYSBzcGVjaWZpYyBmaWxlIGZvcm1hdCB3cml0ZXIuCi0gKiBAbm90ZSAgICBBY2NvcmRpbmcgdG8gdGhlIE1lZGlhdHlwZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHN0b3JlIGluIHRoZSBpbnRlcm5hbAotICogICAgICAgICAgY29udGV4dCB0aGUgd3JpdGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICBwQ29udGV4dDogICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgcENvbnRleHQscFd0ckdsb2JhbEludGVyZmFjZSBvciBwV3RyRGF0YUludGVyZmFjZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KSwgb3IgaW52YWxpZCBNZWRpYVR5cGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlcldyaXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9PdXRwdXRGaWxlVHlwZSBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqIHBXdHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiBwV3RyRGF0YUludGVyZmFjZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJFbmNvZGVyKCAgIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfVmlkZW9Gb3JtYXQgbWVkaWFUeXBlLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UgKnBFbmNHbG9iYWxJbnRlcmZhY2UpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVnaXN0ZXIgYSBzcGVjaWZpYyB2aWRlbyBlbmNvZGVyLgotICogQG5vdGUgICAgQWNjb3JkaW5nIHRvIHRoZSBNZWRpYXR5cGUsIHRoaXMgZnVuY3Rpb24gd2lsbCBzdG9yZSBpbiB0aGUgaW50ZXJuYWwKLSAqICAgICAgICAgIGNvbnRleHQgdGhlIGVuY29kZXIgY29udGV4dC4KLSAqIEBwYXJhbSAgIHBDb250ZXh0OiAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICBwQ29udGV4dCBvciBwRW5jR2xvYmFsSW50ZXJmYWNlIGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpLCBvciBpbnZhbGlkIE1lZGlhVHlwZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlclZpZGVvRW5jb2RlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfRm9ybWF0IE1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UgKnBFbmNHbG9iYWxJbnRlcmZhY2UpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00TUNTX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKCAgTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0IG1lZGlhVHlwZSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlICpwRW5jR2xvYmFsSW50ZXJmYWNlKQotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiB3aWxsIHJlZ2lzdGVyIGEgc3BlY2lmaWMgYXVkaW8gZW5jb2Rlci4KLSAqIEBub3RlICAgIEFjY29yZGluZyB0byB0aGUgTWVkaWF0eXBlLCB0aGlzIGZ1bmN0aW9uIHdpbGwgc3RvcmUgaW4gdGhlIGludGVybmFsCi0gKiAgICAgICAgICBjb250ZXh0IHRoZSBlbmNvZGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICBwQ29udGV4dDogICAgICAgICAgICAgICAoSU4pICAgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcGFyYW0gICBtZWRpYVR5cGU6ICAgICAgICAgICAgICAoSU4pICAgVGhlIG1lZGlhIHR5cGUuCi0gKiBAcGFyYW0gICBwRW5jR2xvYmFsSW50ZXJmYWNlOiAgICAoT1VUKSAgVGhlIGVuY29kZXIgaW50ZXJmYWNlIGZ1bmN0aW9ucy4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICBwQ29udGV4dCBvciBwRW5jR2xvYmFsSW50ZXJmYWNlIGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9BdWRpb0Zvcm1hdCBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UgKnBFbmNHbG9iYWxJbnRlcmZhY2UpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIFJlZ2lzdGVyIHJlYWRlci4KLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlclJlYWRlciggICBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfTWVkaWFUeXBlIG1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSAqcFJkckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKnBSZHJEYXRhSW50ZXJmYWNlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIFJlZ2lzdGVyIHZpZGVvIGRlY29kZXIKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHBhcmFtICAgZGVjb2RlclR5cGUgICAgICAgICAgKElOKSBEZWNvZGVyIHR5cGUKLSAqIEBwYXJhbSAgIHBEZWNvZGVySW50ZXJmYWNlICAgIChJTikgRGVjb2RlciBpbnRlcmZhY2UuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpLG9yIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyIHR5cGUgaXMgaW52YWxpZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3JlZ2lzdGVyVmlkZW9EZWNvZGVyKCBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9WaWRlb1R5cGUgZGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlICpwRGVjb2RlckludGVyZmFjZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgUmVnaXN0ZXIgYXVkaW8gZGVjb2RlcgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGludGVybmFseSBieSB0aGUgTUNTIHRvIHJlZ2lzdGVyIENvcmUgYXVkaW8gZGVjb2RlcnMsCi0gKiBAcGFyYW0gICBjb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICBkZWNvZGVyVHlwZSAgICAgICAgKElOKSAgICAgQXVkaW8gZGVjb2RlciB0eXBlCi0gKiBAcGFyYW0gICBwRGVjb2RlckludGVyZmFjZSAgKElOKSAgICAgQXVkaW8gZGVjb2RlciBpbnRlcmZhY2UuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICBBIHBhcmFtZXRlciBpcyBudWxsLCBvciB0aGUgZGVjb2RlciB0eXBlIGlzIGludmFsaWQoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJBdWRpb0RlY29kZXIoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRBRF9UeXBlIGRlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00QURfSW50ZXJmYWNlICpwRGVjb2RlckludGVyZmFjZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgVW5yZWdpc3RlciB3cml0ZXIKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3VuUmVnaXN0ZXJBbGxXcml0ZXJzKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIFVucmVnaXN0ZXIgdGhlIGVuY29kZXJzCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU191blJlZ2lzdGVyQWxsRW5jb2RlcnMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgVW5yZWdpc3RlciByZWFkZXIKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3VuUmVnaXN0ZXJBbGxSZWFkZXJzKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIFVucmVnaXN0ZXIgdGhlIGRlY29kZXJzCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU191blJlZ2lzdGVyQWxsRGVjb2RlcnMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgU2V0IGN1cnJlbnQgd3JpdGVyCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHBhcmFtICAgbWVkaWFUeXBlICAgICAgICAgICAoSU4pIE1lZGlhIHR5cGUuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgICAgICAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgTTRXQVJfTUNTX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOiAgTWVkaWEgdHlwZSBub3Qgc3VwcG9ydGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3NldEN1cnJlbnRXcml0ZXIoIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSBtZWRpYVR5cGUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBTZXQgYSB2aWRlbyBlbmNvZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBNZWRpYVR5cGUgICAgICAgICAgIChJTikgRW5jb2RlciB0eXBlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgICAgICAgICAgICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gICAgTTRXQVJfTUNTX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOiAgICBNZWRpYSB0eXBlIG5vdCBzdXBwb3J0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1Nfc2V0Q3VycmVudFZpZGVvRW5jb2RlciggICBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19WaWRlb0Zvcm1hdCBtZWRpYVR5cGUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBTZXQgYW4gYXVkaW8gZW5jb2RlcgotICogQHBhcmFtICAgIGNvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBNZWRpYVR5cGUgICAgICAgIChJTikgRW5jb2RlciB0eXBlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50QXVkaW9FbmNvZGVyKCAgIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0F1ZGlvRm9ybWF0IG1lZGlhVHlwZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIFNldCBjdXJyZW50IHJlYWRlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgbWVkaWFUeXBlICAgICAgICAgICAoSU4pIE1lZGlhIHR5cGUuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gICAgTTRXQVJfTUNTX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOiAgICBNZWRpYSB0eXBlIG5vdCBzdXBwb3J0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1Nfc2V0Q3VycmVudFJlYWRlciggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIG1lZGlhVHlwZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIFNldCBhIHZpZGVvIGRlY29kZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgZGVjb2RlclR5cGUgICAgICAgIChJTikgRGVjb2RlciB0eXBlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgICBNNFdBUl9NQ1NfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ6ICAgIE1lZGlhIHR5cGUgbm90IHN1cHBvcnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50VmlkZW9EZWNvZGVyKCAgIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbVR5cGUgbWVkaWFUeXBlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgU2V0IGFuIGF1ZGlvIGRlY29kZXIKLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgZGVjb2RlclR5cGUgICAgICAgIChJTikgRGVjb2RlciB0eXBlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50QXVkaW9EZWNvZGVyKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00X1N0cmVhbVR5cGUgbWVkaWFUeXBlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50Q2hlY2tBdWRpb0VmZmVjdHMoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQ29udGV4dCkKLSAqIEBicmllZiAgICBDaGVjayBpZiBhbiBlZmZlY3QgaGFzIHRvIGJlIGFwcGxpZWQgY3VycmVudGx5Ci0gKiBAbm90ZSAgICAgSXQgaXMgY2FsbGVkIGJ5IHRoZSBzdGVwRW5jb2RpbmcgZnVuY3Rpb24KLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pICAgTUNTIGludGVybmFsIGNvbnRleHQKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2ludENoZWNrQXVkaW9FZmZlY3RzKE00TUNTX0ludGVybmFsQ29udGV4dCogcEMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19lZGl0QXVkaW9FZmZlY3RGY3RfRmFkZUluKCkKLSAqIEBicmllZiAgICBBcHBseSBhdWRpbyBlZmZlY3QgRmFkZUluIHRvIHBQQ01kYXRhCi0gKiBAcGFyYW0gICAgcEMgICAgICAgICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgIHBQQ01kYXRhICAgICAoSU4vT1VUKSBJbnB1dCBhbmQgT3V0cHV0IFBDTSBhdWRpbyBkYXRhCi0gKiBAcGFyYW0gICAgdWlQQ01zaXplICAgIChJTikgICAgIFNpemUgb2YgcFBDTWRhdGEKLSAqIEBwYXJhbSAgICBwUHJvZ3Jlc3MgICAgKElOKSAgICAgRWZmZWN0IHByb2dyZXNzCi0gKiBAcmV0dXJuICAgTTROT19FUlJPUjogICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19lZGl0QXVkaW9FZmZlY3RGY3RfRmFkZUluKCAgTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MTYgKnBQQ01kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlQQ01zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19lZGl0QXVkaW9FZmZlY3RGY3RfRmFkZUluKCkKLSAqIEBicmllZiAgICBBcHBseSBhdWRpbyBlZmZlY3QgRmFkZUluIHRvIHBQQ01kYXRhCi0gKiBAcGFyYW0gICAgcEMgICAgICAgICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgIHBQQ01kYXRhICAgICAoSU4vT1VUKSBJbnB1dCBhbmQgT3V0cHV0IFBDTSBhdWRpbyBkYXRhCi0gKiBAcGFyYW0gICAgdWlQQ01zaXplICAgIChJTikgICAgIFNpemUgb2YgcFBDTWRhdGEKLSAqIEBwYXJhbSAgICBwUHJvZ3Jlc3MgICAgKElOKSAgICAgRWZmZWN0IHByb2dyZXNzCi0gKiBAcmV0dXJuICAgTTROT19FUlJPUjogICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19lZGl0QXVkaW9FZmZlY3RGY3RfRmFkZU91dCggTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MTYgKnBQQ01kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlQQ01zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogX19NNE1DU19JTlRFUk5BTEZVTkNUSU9OU19IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMvTTRNQ1NfSW50ZXJuYWxUeXBlcy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMvTTRNQ1NfSW50ZXJuYWxUeXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZTRmMjM2Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jL000TUNTX0ludGVybmFsVHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDYwNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRNQ1NfQVBJLmgKLSAqIEBicmllZiAgTUNTIGludGVybmFsIHR5cGVzIGFuZCBzdHJ1Y3R1cmVzIGRlZmluaXRpb25zCi0gKiBAbm90ZSAgIFRoaXMgaGVhZGVyIGZpbGUgaXMgbm90IHB1YmxpYwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKi8KLQotI2lmbmRlZiBfX000TUNTX0lOVEVSTkFMVFlQRVNfSF9fCi0jZGVmaW5lIF9fTTRNQ1NfSU5URVJOQUxUWVBFU19IX18KLQotLyoqCi0gKiAgICBNQ1MgcHVibGljIEFQSSBhbmQgdHlwZXMgKi8KLSNpbmNsdWRlICJNNE1DU19BUEkuaCIKLSNpbmNsdWRlICJNNE1DU19FcnJvckNvZGVzLmgiCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0KLS8qKiBEZXRlcm1pbmUgYWJzb2x1dGUgdmFsdWUgb2YgYS4gKi8KLSNkZWZpbmUgTTRNQ1NfQUJTKGEpICAgICAgICAgICAgICAgKCAoIChhKSA8ICgwKSApID8gKC0oYSkpIDogKGEpICkKLQotCi0jZGVmaW5lIFlfUExBTkVfQk9SREVSX1ZBTFVFICAgIDB4MDAKLSNkZWZpbmUgVV9QTEFORV9CT1JERVJfVkFMVUUgICAgMHg4MAotI2RlZmluZSBWX1BMQU5FX0JPUkRFUl9WQUxVRSAgICAweDgwCi0KLQotLyoqCi0gKiAgICBJbnRlcm5hbGx5IHVzZWQgbW9kdWxlcyAqLwotI2luY2x1ZGUgIk00UkVBREVSXzNncENvbS5oIiAgICAgICAgLyoqPCBSZWFkIDNHUFAgZmlsZSAgICAgKi8KLSNpbmNsdWRlICJNNERFQ09ERVJfQ29tbW9uLmgiICAgICAgIC8qKjwgRGVjb2RlIHZpZGVvICAgICAgICovCi0jaW5jbHVkZSAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIgICAgICAvKio8IFZpZGVvIHJlc2l6ZSAgICAgICAqLwotI2luY2x1ZGUgIk00QURfQ29tbW9uLmgiICAgICAgICAgICAgLyoqPCBEZWNvZGVyIGF1ZGlvICAgICAgKi8KLSNpbmNsdWRlICJTU1JDLmgiICAgICAgICAgICAgICAgICAgIC8qKjwgU1NSQyAgICAgICAgICAgICAgICovCi0jaW5jbHVkZSAiRnJvbTJpVG9Nb25vXzE2LmgiICAgICAgICAvKio8IFN0ZXJlbyB0byBNb25vICAgICAqLwotI2luY2x1ZGUgIk1vbm9UbzJJXzE2LmgiICAgICAgICAgICAgLyoqPCBNb25vIHRvIFN0ZXJlbyAgICAgKi8KLSNpbmNsdWRlICJNNEVOQ09ERVJfQXVkaW9Db21tb24uaCIgIC8qKjwgRW5jb2RlIGF1ZGlvICAgICAgICovCi0jaW5jbHVkZSAiTTRXUklURVJfY29tbW9uLmgiICAgICAgICAvKio8IFdyaXRlciBjb21tb24gaW50ZXJmYWNlICovCi0jaW5jbHVkZSAiTTRFTkNPREVSX2NvbW1vbi5oIgotCi0vKioKLSAqICBJbnN0ZWFkIG9mIGluY2x1ZGluZyBBQUMgY29yZSBwcm9wZXJ0aWVzLCBpdCBpcyBiZXR0ZXIgdG8gcmVkZWZpbmUgdGhlIG5lZWRlZCB0eXBlCi0gKiAgQUFDX0RFQ19TVFJFQU1fUFJPUFMKLSAqICBJbiBjYXNlIG9mIGV4dGVybmFsIEFBQyBkZWNvZGVyLCBpdCB3aWxsIGJlIG5lY2Vzc2FyeSB0byBwdXQgdGhpcyB0eXBlIGFzIHB1YmxpYwotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0IEFBQ19ERUNfU1RSRUFNX1BST1BTCi0gKiBAYnJpZWYgQUFDIFN0cmVhbSBwcm9wZXJ0aWVzCi0gKiBATm90ZSBhTm9DaGFuIGFuZCBhU2FtcEZyZXEgYXJlIHVzZWQgZm9yIHBhcnNpbmcgZXZlbiB0aGUgdXNlciBwYXJhbWV0ZXJzCi0gKiAgICAgICAgYXJlIGRpZmZlcmVudC4gIFVzZXIgcGFyYW1ldGVycyB3aWxsIGJlIGlucHV0IGZvciB0aGUgb3V0cHV0IGJlaGF2aW91cgotICogICAgICAgIG9mIHRoZSBkZWNvZGVyIHdoZXJlYXMgZm9yIHBhcnNpbmcgYml0c3RyZWFtIHByb3BlcnRpZXMgYXJlIHVzZWQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgTTRPU0FfSW50MzIgYUF1ZGlvT2JqZWN0VHlwZTsgICAgIC8qKjwgQXVkaW8gb2JqZWN0IHR5cGUgb2YgdGhlIHN0cmVhbSAtIGluIGZhY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHR5cGUgZm91bmQgaW4gdGhlIEFjY2VzcyBVbml0IHBhcnNlZCAqLwotICBNNE9TQV9JbnQzMiBhTnVtQ2hhbjsgICAgICAgICAgICAgLyoqPCBudW1iZXIgb2YgY2hhbm5lbHMgKD0xKG1vbm8pIG9yID0yKHN0ZXJlbykpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIGluZGljYXRlZCBieSBpbnB1dCBiaXRzdHJlYW0qLwotICBNNE9TQV9JbnQzMiBhU2FtcEZyZXE7ICAgICAgICAgICAgLyoqPCBzYW1wbGluZyBmcmVxdWVuY3kgaW4gSHogKi8KLSAgTTRPU0FfSW50MzIgYUV4dGVuc2lvblNhbXBGcmVxOyAgIC8qKjwgZXh0ZW5kZWQgc2FtcGxpbmcgZnJlcXVlbmN5IGluIEh6LCA9IDAgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZXh0ZW5kZWQgZnJlcXVlbmN5ICovCi0gIE00T1NBX0ludDMyIGFTQlJQcmVzZW50OyAgICAgICAgICAvKio8IHByZXNlbmNlPTEvYWJzZW5jZT0wIG9mIFNCUiAqLwotICBNNE9TQV9JbnQzMiBhUFNQcmVzZW50OyAgICAgICAgICAgLyoqPCBwcmVzZW5jZT0xL2Fic2VuY2U9MCBvZiBQUyAqLwotICBNNE9TQV9JbnQzMiBhTWF4UENNU2FtcGxlc1BlckNoOyAgLyoqPCBtYXggbnVtYmVyIG9mIFBDTSBzYW1wbGVzIHBlciBjaGFubmVsICovCi19IEFBQ19ERUNfU1RSRUFNX1BST1BTOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgICAgQ29kZWNzIHJlZ2lzdHJhdGlvbiBzYW1lIGFzIGluIFZQUyBhbmQgVkVTLCBzbyBsZXNzIG1hcHBpbmcKLSAqICAgICAgICAgICAgICBpcyByZXF1aXJlZCB0b3dhcmQgTUNTIGFwaSB0eXBlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSogcEdsb2JhbEZjdHM7ICAgIC8qKjwgb3BlbiwgY2xvc2UsIHNldG9wdGlvbixldGMuLi4gZnVuY3Rpb25zICovCi0gICAgTTRXUklURVJfRGF0YUludGVyZmFjZSogICAgcERhdGFGY3RzOyAgICAgICAgLyoqPCBkYXRhIG1hbmlwdWxhdGlvbiBmdW5jdGlvbnMgKi8KLX0gTTRNQ1NfV3JpdGVySW50ZXJmYWNlOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgICAgICBNNE1DU19TdGF0ZXMKLSAqIEBicmllZiAgICAgICAgTWFpbiBzdGF0ZSBtYWNoaW5lIG9mIHRoZSBNQ1MuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00TUNTX2tTdGF0ZV9DUkVBVEVELCAgICAgICAgICAgLyoqPCBNNE1DU19pbml0IGhhcyBiZWVuIGNhbGxlZCAgICAgICAgICAgICAgICAqLwotICAgIE00TUNTX2tTdGF0ZV9PUEVORUQsICAgICAgICAgICAgLyoqPCBNNE1DU19vcGVuIGhhcyBiZWVuIGNhbGxlZCAgICAgICAgICAgICAgICAqLwotICAgIE00TUNTX2tTdGF0ZV9TRVQsICAgICAgICAgICAgICAgLyoqPCBBbGwgbWFuZGF0b3J5IHBhcmFtZXRlcnMgaGF2ZSBiZWVuIHNldCAgICAqLwotICAgIE00TUNTX2tTdGF0ZV9SRUFEWSwgICAgICAgICAgICAgLyoqPCBBbGwgb3B0aW9ubmFsIHBhcmFtZXRlcnMgaGF2ZSBiZWVuIHNldCAgICAqLwotICAgIE00TUNTX2tTdGF0ZV9CRUdJTlZJREVPSlVNUCwgICAgLyoqPCBNdXN0IGp1bXAgdG8gdGhlIElmcmFtZSBiZWZvcmUgdGhlIGJlZ2luIGN1dCAqLwotICAgIE00TUNTX2tTdGF0ZV9CRUdJTlZJREVPREVDT0RFLCAgLyoqPCBNdXN0IGRlY29kZSB1cCB0byB0aGUgYmVnaW4gY3V0ICAgICAgICAqLwotICAgIE00TUNTX2tTdGF0ZV9QUk9DRVNTSU5HLCAgICAgICAgLyoqPCBTdGVwIGNhbiBiZSBjYWxsZWQgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIE00TUNTX2tTdGF0ZV9QQVVTRUQsICAgICAgICAgICAgLyoqPCBQYXVzZWQsIFJlc3VtZSBjYW4gYmUgY2FsbGVkICAgICAgICAgICAgKi8KLSAgICBNNE1DU19rU3RhdGVfRklOSVNIRUQsICAgICAgICAgIC8qKjwgVHJhbnNjb2RpbmcgaXMgZmluaXNoZWQgICAgICAgICAgICAgICAgKi8KLSAgICBNNE1DU19rU3RhdGVfQ0xPU0VEICAgICAgICAgICAgIC8qKjwgT3V0cHV0IGZpbGUgaGFzIGJlZW4gY3JlYXRlZCAgICAgICAgICAgICovCi19IE00TUNTX1N0YXRlczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICAgICAgTTRNQ1NfU3RyZWFtU3RhdGUKLSAqIEBicmllZiAgICAgICAgU3RhdGUgb2YgYSBtZWRpYSBzdHJlYW0gZW5jb2RpbmcgKGF1ZGlvIG9yIHZpZGVvKS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRNQ1Nfa1N0cmVhbVN0YXRlX05PU1RSRUFNICA9IDAsICAgIC8qKjwgTm8gc3RyZWFtIHByZXNlbnQgICAgICAgICAgICAgICAgICAgICovCi0gICAgTTRNQ1Nfa1N0cmVhbVN0YXRlX1NUQVJURUQgICA9IDEsICAgIC8qKjwgVGhlIHN0cmVhbSBlbmNvZGluZyBpcyBpbiBwcm9ncmVzcyAqLwotICAgIE00TUNTX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRCAgPSAyICAgIC8qKjwgVGhlIHN0cmVhbSBoYXMgZmluaXNoZWQgZW5jb2RpbmcgICAgKi8KLX0gTTRNQ1NfU3RyZWFtU3RhdGU7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICAgICAgYW5vbnltb3VzIGVudW0KLSAqIEBicmllZiAgICAgICAgZW51bSB0byBrZWVwIHRyYWNrIG9mIHRoZSBlbmNvZGVyIHN0YXRlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLWVudW0KLXsKLSAgICBNNE1DU19rTm9FbmNvZGVyLAotICAgIE00TUNTX2tFbmNvZGVyQ2xvc2VkLAotICAgIE00TUNTX2tFbmNvZGVyU3RvcHBlZCwKLSAgICBNNE1DU19rRW5jb2RlclJ1bm5pbmcKLX07Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00TUNTX0ludGVybmFsQ29udGV4dAotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBNQ1MgY29udGV4dCAocHJpdmF0ZSkKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBhbGwgTUNTIGNhbGxzIHRvIHN0b3JlIHRoZSBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVUludDMyICAgIGJpdFBvczsKLSAgICAgICAgICAgICAgICAgLyogYml0IGNvdW50IG9mIG51bWJlciBvZiBiaXRzIHVzZWQgc28gZmFyICovCi0KLSAgICBNNE9TQV9VSW50OCAgICpzdHJlYW1CdWZmZXI7Ci0gICAgICAgICAgICAgICAgLyogQml0c3RyZWFtIEJ1ZmZlciAqLwotCi0gICAgTTRPU0FfVUludDMyICAgIGJ5dGVDbnQ7Ci0gICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIEJ5dGVzIHdyaXR0ZW4gaW4gQml0c3RyZWFtIGJ1ZmZlciovCi0KLSAgICBNNE9TQV9VSW50MzIgICAgY3VyckJ1ZmY7Ci0gICAgICAgICAgICAgICAgLyogQ3VycmVudCBidWZmZXIgaG9sZHMsIDRieXRlcyBvZiBiaXRzdHJlYW0qLwotCi0gICAgTTRPU0FfVUludDggICBwcmV2Qnl0ZTsKLSAgICAgICAgICAgICAgICAvKiBQcmV2aW91cyBieXRlIHdyaXR0ZW4gaW4gdGhlIGJ1ZmZlciAqLwotCi0gICAgTTRPU0FfVUludDggICBwcmV2UHJldkJ5dGU7Ci0gICAgICAgICAgICAgICAgLyogUHJldmlvdXMgdG8gcHJldmlvdXMgYnl0ZSB3cml0dGVuIGluIHRoZSBidWZmZXIgKi8KLQotfU5TV0FWQ19iaXRTdHJlYW1fdF9NQ1M7Ci0KLSNkZWZpbmUgX01BWG51bV9zbGljZV9ncm91cHMgIDgKLSNkZWZpbmUgX01BWG51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGUgIDI1NgotCi10eXBlZGVmIHN0cnVjdAotewotICBNNE9TQV9VSW50MzIgIGxldmVsX2lkY19pbmRleDsKLSAgTTRPU0FfVUludDMyICBNYXhGcmFtZU51bTsKLSAgTTRPU0FfVUludDMyICBleHBlY3RlZERlbHRhUGVyUGljT3JkZXJDbnRDeWNsZTsKLSAgTTRPU0FfSW50MzIgICBNYXhQaWNPcmRlckNudExzYjsKLSAgTTRPU0FfSW50MzIgICBtYXhfZGVjX2ZyYW1lX2J1ZmZlcmluZzsKLQotICAvKiAocGljX29yZGVyX2NudF90eXBlID09IDEpICovCi0gIE00T1NBX0ludDMyICAgb2Zmc2V0X2Zvcl9ub25fcmVmX3BpYzsKLSAgTTRPU0FfSW50MzIgICBvZmZzZXRfZm9yX3RvcF90b19ib3R0b21fZmllbGQ7Ci0gIE00T1NBX0ludDMyICAgZnJhbWVfY3JvcF9sZWZ0X29mZnNldDsKLSAgTTRPU0FfSW50MzIgICBmcmFtZV9jcm9wX3JpZ2h0X29mZnNldDsKLSAgTTRPU0FfSW50MzIgICBmcmFtZV9jcm9wX3RvcF9vZmZzZXQ7Ci0gIE00T1NBX0ludDMyICAgZnJhbWVfY3JvcF9ib3R0b21fb2Zmc2V0OwotICBNNE9TQV9JbnQzMiAgIG9mZnNldF9mb3JfcmVmX2ZyYW1lW19NQVhudW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlXTsKLQotICBNNE9TQV9VSW50MTYgUGljV2lkdGhJbk1iczsKLSAgTTRPU0FfVUludDE2IEZyYW1lSGVpZ2h0SW5NYnM7Ci0gIE00T1NBX1VJbnQxNiAgcGljX3dpZHRoX2luX21ic19taW51czE7Ci0gIE00T1NBX1VJbnQxNiAgcGljX2hlaWdodF9pbl9tYXBfdW5pdHNfbWludXMxOwotCi0jaWZkZWYgX0NBUF9GTU9fCi0gIE00T1NBX1VJbnQxNiBOdW1TbGljZUdyb3VwTWFwVW5pdHM7Ci0gIE00T1NBX1VJbnQxNiBNYXhQaWNTaXplSW5NYnM7Ci0jZW5kaWYgLypfQ0FQX0ZNT18qLwotCi0gIE00T1NBX1VJbnQ4ICAgcHJvZmlsZV9pZGM7Ci0gIE00T1NBX1VJbnQ4ICAgcmVzZXJ2ZWRfemVyb180Yml0czsKLSAgTTRPU0FfVUludDggICBsZXZlbF9pZGM7Ci0gIE00T1NBX1VJbnQ4ICAgc2VxX3BhcmFtZXRlcl9zZXRfaWQ7Ci0gIE00T1NBX1VJbnQ4ICAgbG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNDsKLSAgTTRPU0FfVUludDggICBwaWNfb3JkZXJfY250X3R5cGU7Ci0gIC8qIGlmKHBpY19vcmRlcl9jbnRfdHlwZSA9PSAwKSAqLwotICBNNE9TQV9VSW50OCAgIGxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNDsKLQotICBNNE9TQV9VSW50OCAgIG51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGU7Ci0gIC8qIGZvciggaSA9IDA7IGkgPCBudW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlOyBpKysgKSAqLwotICBNNE9TQV9VSW50OCAgIG51bV9yZWZfZnJhbWVzOwotCi0gIE00T1NBX0Jvb2wgICAgY29uc3RyYWludF9zZXQwX2ZsYWc7Ci0gIE00T1NBX0Jvb2wgICAgY29uc3RyYWludF9zZXQxX2ZsYWc7Ci0gIE00T1NBX0Jvb2wgICAgY29uc3RyYWludF9zZXQyX2ZsYWc7Ci0gIE00T1NBX0Jvb2wgICAgY29uc3RyYWludF9zZXQzX2ZsYWc7Ci0gIE00T1NBX0Jvb2wgICAgZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWc7Ci0gIE00T1NBX0Jvb2wgICAgZ2Fwc19pbl9mcmFtZV9udW1fdmFsdWVfYWxsb3dlZF9mbGFnOwotICBNNE9TQV9Cb29sICAgIGZyYW1lX21ic19vbmx5X2ZsYWc7Ci0gIE00T1NBX0Jvb2wgICAgbWJfYWRhcHRpdmVfZnJhbWVfZmllbGRfZmxhZzsKLSAgTTRPU0FfQm9vbCAgICBkaXJlY3RfOHg4X2luZmVyZW5jZV9mbGFnOwotICBNNE9TQV9Cb29sICAgIGZyYW1lX2Nyb3BwaW5nX2ZsYWc7Ci0gIE00T1NBX0Jvb2wgICAgdnVpX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnOwotICBNNE9TQV9Cb29sICAgIEFjdGl2ZTsKLQotICAvKiB2dWlfc2VxX3BhcmFtZXRlcnNfdCB2dWlfc2VxX3BhcmFtZXRlcnM7ICovCi19IENvbVNlcXVlbmNlUGFyYW1ldGVyU2V0X3RfTUNTOwotCi10eXBlZGVmIHN0cnVjdAotewotICBNNE9TQV9JbnQxNiAgICAgICBwaWNfaW5pdF9xcF9taW51czI2OwotICBNNE9TQV9JbnQxNiAgICAgICBwaWNfaW5pdF9xc19taW51czI2OwotICBNNE9TQV9JbnQxNiAgICAgICBjaHJvbWFfcXBfaW5kZXhfb2Zmc2V0OwotCi0vLyNpZmRlZiBfQ0FQX0ZNT18KLSAgLyogaWYoIHNsaWNlX2dyb3VwX21hcF90eXBlID0gPSAwICkgKi8KLSAgTTRPU0FfVUludDE2ICAgICAgcnVuX2xlbmd0aF9taW51czFbX01BWG51bV9zbGljZV9ncm91cHNdOwotICAvKiBlbHNlIGlmKCBzbGljZV9ncm91cF9tYXBfdHlwZSA9ID0gMiApICovCi0gIE00T1NBX1VJbnQxNiAgICAgIHRvcF9sZWZ0W19NQVhudW1fc2xpY2VfZ3JvdXBzXTsKLSAgTTRPU0FfVUludDE2ICAgICAgYm90dG9tX3JpZ2h0W19NQVhudW1fc2xpY2VfZ3JvdXBzXTsKLSAgLyogZWxzZSBpZiggc2xpY2VfZ3JvdXBfbWFwX3R5cGUgPSA9IDYgKSAqLwotICBNNE9TQV9VSW50MTYgICAgICBwaWNfc2l6ZV9pbl9tYXBfdW5pdHNfbWludXMxOwotICBNNE9TQV9VSW50MTYgICAgICBzbGljZV9ncm91cF9jaGFuZ2VfcmF0ZV9taW51czE7Ci0KLSAgTTRPU0FfVUludDE2IEZpcnN0TWJJblNsaWNlR3JvdXBbX01BWG51bV9zbGljZV9ncm91cHNdOwotICBNNE9TQV9VSW50MTYgTGFzdE1iSW5TbGljZUdyb3VwW19NQVhudW1fc2xpY2VfZ3JvdXBzXTsKLQotCi0gIE00T1NBX1VJbnQ4ICAqc2xpY2VfZ3JvdXBfaWQ7Ci0gIE00T1NBX1VJbnQ4ICAqTWFwVW5pdFRvU2xpY2VHcm91cE1hcDsKLSAgTTRPU0FfVUludDggICpNYlRvU2xpY2VHcm91cE1hcDsKLSAgTTRPU0FfVUludDE2ICBOdW1TbGljZUdyb3VwTWFwVW5pdHM7Ci0KLSAgTTRPU0FfVUludDggICAgICAgc2xpY2VfZ3JvdXBfbWFwX3R5cGU7Ci0gIC8qIGVsc2UgaWYoIHNsaWNlX2dyb3VwX21hcF90eXBlID0gPSAzIHx8IDQgfHwgNSAqLwotICBNNE9TQV9Cb29sICAgICAgICBzbGljZV9ncm91cF9jaGFuZ2VfZGlyZWN0aW9uX2ZsYWc7Ci0gIE00T1NBX0Jvb2wgICBtYXBfaW5pdGlhbGl6ZWQ7Ci0vLyAjZW5kaWYgLypfQ0FQX0ZNT18qLwotCi0gIE00T1NBX1VJbnQ4ICAgICAgIHBpY19wYXJhbWV0ZXJfc2V0X2lkOwotICBNNE9TQV9VSW50OCAgICAgICBzZXFfcGFyYW1ldGVyX3NldF9pZDsKLSAgTTRPU0FfVUludDggICAgICBudW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxOwotICBNNE9TQV9VSW50OCAgICAgIG51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czE7Ci0gIE00T1NBX1VJbnQ4ICAgICAgIHdlaWdodGVkX2JpcHJlZF9pZGM7Ci0gIE00T1NBX1VJbnQ4ICAgICAgIG51bV9zbGljZV9ncm91cHNfbWludXMxOwotCi0gIE00T1NBX0Jvb2wgICAgICAgIGVudHJvcHlfY29kaW5nX21vZGVfZmxhZzsKLSAgLyogaWYoIHBpY19vcmRlcl9jbnRfdHlwZSA8IDIgKSAgaW4gdGhlIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQgKi8KLSAgTTRPU0FfQm9vbCAgICAgICAgcGljX29yZGVyX3ByZXNlbnRfZmxhZzsKLSAgTTRPU0FfQm9vbCAgICAgICAgd2VpZ2h0ZWRfcHJlZF9mbGFnOwotICBNNE9TQV9Cb29sICAgICAgICBkZWJsb2NraW5nX2ZpbHRlcl9jb250cm9sX3ByZXNlbnRfZmxhZzsKLSAgTTRPU0FfQm9vbCAgICAgICAgY29uc3RyYWluZWRfaW50cmFfcHJlZF9mbGFnOwotICBNNE9TQV9Cb29sICAgICAgICByZWR1bmRhbnRfcGljX2NudF9wcmVzZW50X2ZsYWc7Ci0gIE00T1NBX0Jvb2wgICAgQWN0aXZlOwotCi0gIENvbVNlcXVlbmNlUGFyYW1ldGVyU2V0X3RfTUNTICpwX2FjdGl2ZV9zcHM7Ci19IENvbVBpY3R1cmVQYXJhbWV0ZXJTZXRfdF9NQ1M7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgICBNNE9TQV9VSW50MzIgYml0UG9zOyAgICAgICAgICAgICAgICAvKiE8IGJpdCBwb3NpdGlvbiBpbiBidWZmZXIgKi8KLSAgICAgIE00T1NBX1VJbnQzMiB0b3RhbEJpdHM7ICAgICAgICAgICAgIC8qITwgYml0IHBvc2l0aW9uIGluIGZpbGUgKHRvdGFsIGJpdHMgcmVhZCBzbyBmYXIpICovCi0KLSAgICAgIE00T1NBX1VJbnQzMiBsYXN0VG90YWxCaXRzOyAgICAgICAgIC8qITwgYml0IHBvc2l0aW9uIGluIGZpbGUgb2YgdGhlIGxhc3QgVk9QICovCi0gICAgICBNNE9TQV9VSW50MzIgbnVtQml0c0luQnVmZmVyOyAgICAgICAvKiE8IG51bWJlciBvZiBiaXRzIGluIGJ1ZmZlciAqLwotICAgICAgTTRPU0FfVUludDMyIHJlYWRhYmxlQnl0ZXNJbkJ1ZmZlcjsgLyohPCBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgcmVhZCBpbiBkZWNvZGVyIGJ1ZmZlciovCi0gICAgICBNNE9TQV9VSW50MzIgbWF4QnVmZmVyU2l6ZTsgICAgICAgICAvKiE8IG1heCBidWZmZXIgc2l6ZSBpbiBiaXQgdW5pdHMgKi8KLSAgICAgIE00T1NBX1VJbnQ4ICAqQnVmZmVyOyAgICAgICAgICAgICAgIC8qITwgY2hhciBidWZmZXIgYXQgcmVhZGluZyBmcm9tIGZpbGUgKi8KLSAgICAgIE00T1NBX0ludDMyICAgICBpOEJpdENudDsKLSAgICAgIE00T1NBX1VJbnQzMiAgICAgdWkzMlRlbXBCdWZmOwotICAgICAgTTRPU0FfSW50OCpwdWk4QmZyUHRyOwotICAgICAgTTRPU0FfVUludDMyICAgIHVpMzJMYXN0VHdvQnl0ZXM7ICAvKiE8IHN0b3JlcyB0aGUgbGFzdCByZWFkIHR3byBieXRlcyAqLwotfSBDb21CaXRTdHJlYW1NQ1NfdDsKLQotCi10eXBlZGVmIHN0cnVjdAotewotCi0gICAgTTRPU0FfSW50MzIgcHJldl9mcmFtZV9udW07Ci0gICAgTTRPU0FfSW50MzIgY3VyX2ZyYW1lX251bTsKLSAgICBNNE9TQV9JbnQzMiBwcmV2X25ld19mcmFtZV9udW07Ci0gICAgTTRPU0FfSW50MzIgbG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNDsKLSAgICBNNE9TQV9JbnQzMiBpc19kb25lOwotICAgIE00T1NBX0ludDMyIGlzX2ZpcnN0OwotICAgIE00T1NBX0ludDMyIGZyYW1lX2NvdW50OwotICAgIE00T1NBX0ludDMyIGZyYW1lX21vZF9jb3VudDsKLSAgICBNNE9TQV9JbnQzMiBQT0NfbHNiOwotICAgIE00T1NBX0ludDMyIFBPQ19sc2JfbW9kOwotCi0KLSAgICBNNE9TQV9VSW50MzIgICAgbV9OdW1fQnl0ZXNfTkFMVW5pdExlbmd0aDsKLQotICAgIE00T1NBX1VJbnQ4KiAgICBtX3BEZWNvZGVyU3BlY2lmaWNJbmZvOyAgIC8qKjwgUG9pbnRlciBvbiBzcGVjaWZpYyBpbmZvcm1hdGlvbiByZXF1aXJlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gY3JlYXRlIGEgZGVjb2RlciAqLwotICAgIE00T1NBX1VJbnQzMiAgICBtX2RlY29kZXJTcGVjaWZpY0luZm9TaXplOy8qKjwgU2l6ZSBvZiB0aGUgc3BlY2lmaWMgaW5mb3JtYXRpb24gcG9pbnRlciBhYm92ZSovCi0KLSAgICBNNE9TQV9VSW50OCogICAgbV9wRW5jb2RlclNQUzsKLSAgICBNNE9TQV9VSW50MzIgICAgbV9lbmNvZGVyU1BTU2l6ZTsKLQotICAgIE00T1NBX1VJbnQ4KiAgICBtX3BFbmNvZGVyUFBTOwotICAgIE00T1NBX1VJbnQzMiAgICBtX2VuY29kZXJQUFNTaXplOwotCi0gICAgTTRPU0FfVUludDgqICAgIG1fcEZpbmFsRFNJOwotICAgIE00T1NBX1VJbnQzMiAgICBtX3BGaW5hbERTSVNpemU7Ci0KLSAgICBNNE9TQV9VSW50MzIgICAgbV9lbmNvZGVyX1NQU19DbnQ7Ci0gICAgQ29tU2VxdWVuY2VQYXJhbWV0ZXJTZXRfdF9NQ1MgKnBfY2xpcF9zcHM7Ci0gICAgTTRPU0FfVUludDMyICAgIG1fZW5jb2Rlcl9QUFNfQ250OwotICAgIENvbVBpY3R1cmVQYXJhbWV0ZXJTZXRfdF9NQ1MgICpwX2NsaXBfcHBzOwotCi0gICAgQ29tU2VxdWVuY2VQYXJhbWV0ZXJTZXRfdF9NQ1MgKnBfZW5jb2Rlcl9zcHM7Ci0gICAgQ29tUGljdHVyZVBhcmFtZXRlclNldF90X01DUyAgKnBfZW5jb2Rlcl9wcHM7Ci0KLQotICAgIENvbVNlcXVlbmNlUGFyYW1ldGVyU2V0X3RfTUNTICBlbmNvZGVyX3NwczsKLSAgICBDb21QaWN0dXJlUGFyYW1ldGVyU2V0X3RfTUNTICAgZW5jb2Rlcl9wcHM7Ci0gICAgQ29tU2VxdWVuY2VQYXJhbWV0ZXJTZXRfdF9NQ1MgIGNsaXBfc3BzOwotCi0gICAgLyogRW5jb2RlciBTUFMgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX1VJbnQzMiBlbmNfc2VxX3BhcmFtZXRlcl9zZXRfaWQ7Ci0gICAgTTRPU0FfVUludDMyIGVuY19sb2cyX21heF9mcmFtZV9udW1fbWludXM0OwotICAgIE00T1NBX1VJbnQzMiBlbmNfcGljX29yZGVyX2NudF90eXBlOwotICAgIE00T1NBX1VJbnQzMiBlbmNfbG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0OyAvKiBhcHBsaWNhYmxlIHdoZW4gUE9DIHR5cGUgPSAwICovCi0gICAgTTRPU0FfVUludDMyIGVuY19kZWx0YV9waWNfb3JkZXJfYWx3YXlzX3plcm9fZmxhZzsKLSAgICBNNE9TQV9JbnQzMiBlbmNfb2Zmc2V0X2Zvcl9ub25fcmVmX3BpYzsKLSAgICBNNE9TQV9JbnQzMiBlbmNfb2Zmc2V0X2Zvcl90b3BfdG9fYm90dG9tX2ZpZWxkOwotICAgIE00T1NBX1VJbnQzMiBlbmNfbnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZTsgLyogcmFuZ2UgMCB0byAyNTUgKi8KLSAgICAvKiBhcnJheSBvZiBzaXplIG51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGUgKi8KLSAgICBNNE9TQV9JbnQzMiAgIGVuY19vZmZzZXRfZm9yX3JlZl9mcmFtZVsyNTZdOwotICAgIE00T1NBX1VJbnQzMiBlbmNfbnVtX3JlZl9mcmFtZXM7Ci0gICAgTTRPU0FfVUludDMyIGVuY19nYXBzX2luX2ZyYW1lX251bV92YWx1ZV9hbGxvd2VkX2ZsYWc7Ci0KLQotICAgIC8qIElucHV0IGNsaXAgU1BTIHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9VSW50MzIgY2xpcF9zZXFfcGFyYW1ldGVyX3NldF9pZDsKLSAgICBNNE9TQV9VSW50MzIgY2xpcF9sb2cyX21heF9mcmFtZV9udW1fbWludXM0OwotICAgIE00T1NBX1VJbnQzMiBjbGlwX3BpY19vcmRlcl9jbnRfdHlwZTsKLSAgICBNNE9TQV9VSW50MzIgY2xpcF9sb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQ7IC8qIGFwcGxpY2FibGUgd2hlbiBQT0MgdHlwZSA9IDAgKi8KLSAgICBNNE9TQV9VSW50MzIgY2xpcF9kZWx0YV9waWNfb3JkZXJfYWx3YXlzX3plcm9fZmxhZzsKLSAgICBNNE9TQV9JbnQzMiAgY2xpcF9vZmZzZXRfZm9yX25vbl9yZWZfcGljOwotICAgIE00T1NBX0ludDMyICBjbGlwX29mZnNldF9mb3JfdG9wX3RvX2JvdHRvbV9maWVsZDsKLSAgICBNNE9TQV9VSW50MzIgY2xpcF9udW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlOyAvKiByYW5nZSAwIHRvIDI1NSAqLwotICAgIC8qIGFycmF5IG9mIHNpemUgbnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZSAqLwotICAgIE00T1NBX0ludDMyICBjbGlwX29mZnNldF9mb3JfcmVmX2ZyYW1lWzI1Nl07Ci0gICAgTTRPU0FfVUludDMyIGNsaXBfbnVtX3JlZl9mcmFtZXM7Ci0gICAgTTRPU0FfVUludDMyIGNsaXBfZ2Fwc19pbl9mcmFtZV9udW1fdmFsdWVfYWxsb3dlZF9mbGFnOwotCi0gICAgTTRPU0FfVUludDMyIGZpbmFsX1BQU19JRDsKLSAgICBNNE9TQV9VSW50MzIgZmluYWxfU1BTX0lEOwotICAgIE5TV0FWQ19iaXRTdHJlYW1fdF9NQ1MgIGVuY2JzOwotCi19IE5TV0FWQ19NQ1NfdDsKLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00TUNTX0ludGVybmFsQ29udGV4dAotICogQGJyaWVmICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIE1DUyBjb250ZXh0IChwcml2YXRlKQotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIGFsbCBNQ1MgY2FsbHMgdG8gc3RvcmUgdGhlIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKioKLSAgICAgKiBNQ1MgU3RhdGUgYW5kIHNldHRpbmdzIHN0dWZmICovCi0gICAgTTRNQ1NfU3RhdGVzICAgICAgICAgICAgU3RhdGU7ICAgICAvKio8IE1DUyBpbnRlcm5hbCBzdGF0ZSAqLwotICAgIE00TUNTX1N0cmVhbVN0YXRlICAgICAgIFZpZGVvU3RhdGU7LyoqPCBTdGF0ZSBvZiB0aGUgdmlkZW8gZW5jb2RpbmcgKi8KLSAgICBNNE1DU19TdHJlYW1TdGF0ZSAgICAgICBBdWRpb1N0YXRlOy8qKjwgU3RhdGUgb2YgdGhlIGF1ZGlvIGVuY29kaW5nICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgbm9hdWRpbzsvKio8IEZsYWcgdG8ga25vdyBpZiB3ZSBoYXZlIHRvIGRlYWwgd2l0aCBhdWRpbyB0cmFuc2NvZGluZyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgIG5vdmlkZW87LyoqPCBGbGFnIHRvIGtub3cgaWYgd2UgaGF2ZSB0byBkZWFsIHdpdGggdmlkZW8gdHJhbnNjb2RpbmcgKi8KLQotICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICBJbnB1dEZpbGVQcm9wZXJ0aWVzOy8qKjwgSW5wdXQgYXVkaW8vdmlkZW8gc3RyZWFtIHByb3BlcnRpZXMgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICBwSW5wdXRGaWxlOyAgICAgICAgICAgICAvKio8IFJlbWVtYmVyIGlucHV0IGZpbGUgcG9pbnRlciBiZXR3ZWVuIGZhc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW4gYW5kIG5vcm1hbCBvcGVuICovCi0gICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgSW5wdXRGaWxlVHlwZTsgICAgICAgICAgLyoqPCBSZW1lbWJlciBpbnB1dCBmaWxlIHR5cGUgYmV0d2VlbiBmYXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuIGFuZCBub3JtYWwgb3BlbiAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgIGJGaWxlT3BlbmVkSW5GYXN0TW9kZTsgIC8qKjwgRmxhZyB0byBrbm93IGlmIGEgcGFydGljdWxhciByZWFkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzIGZhc3Qgb3BlbiAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHVpTWF4TWV0YWRhdGFTaXplOyAgICAgIC8qKjwgTGltaXRhdGlvbiBvbiB0aGUgbWF4IGFjY2VwdGFibGUgbW9vdgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSBvZiBhIDNncHAgZmlsZSAqLwotCi0gICAgTTRFTkNPREVSX0Zvcm1hdCAgICAgICAgRW5jb2RpbmdWaWRlb0Zvcm1hdDsgICAgLyoqPCBPdXRwdXQgdmlkZW8gZm9ybWF0LCBzZXQgYnkgdGhlIHVzZXIgKi8KLSAgICBNNEVOQ09ERVJfRnJhbWVXaWR0aCAgICBFbmNvZGluZ1dpZHRoOyAgICAgICAgICAvKio8IE91dHB1dCB2aWRlbyB3aWR0aCwgc2V0IGJ5IHRoZSB1c2VyICovCi0gICAgTTRFTkNPREVSX0ZyYW1lSGVpZ2h0ICAgRW5jb2RpbmdIZWlnaHQ7ICAgICAgICAgLyoqPCBPdXRwdXQgdmlkZW8gaGVpZ2h0LCBzZXQgYnkgdGhlIHVzZXIgKi8KLSAgICBNNEVOQ09ERVJfRnJhbWVSYXRlICAgICBFbmNvZGluZ1ZpZGVvRnJhbWVyYXRlOyAvKio8IE91dHB1dCB2aWRlbyBmcmFtZXJhdGUsIHNldCBieSB0aGUgdXNlciovCi0KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1aUJlZ2luQ3V0VGltZTsgICAgIC8qKjwgQmVnaW4gY3V0IHRpbWUsIGluIG1pbGxpc2Vjb25kcyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHVpRW5kQ3V0VGltZTsgICAgICAgLyoqPCBCZWdpbiBjdXQgdGltZSwgaW4gbWlsbGlzZWNvbmRzICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdWlNYXhGaWxlU2l6ZTsgICAgICAvKio8IE1heGltdW0gb3V0cHV0IGZpbGUgc2l6ZSwgaW4gYnl0ZXMgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1aUF1ZGlvQml0cmF0ZTsgICAgIC8qKjwgVGFyZ2V0ZWQgYXVkaW8gYml0cmF0ZSBpbiBicHMgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1aVZpZGVvQml0cmF0ZTsgICAgIC8qKjwgVGFyZ2V0ZWQgdmlkZW8gYml0cmF0ZSBpbiBicHMgKi8KLQotICAgIE00T1NBX1VJbnQ4ICAgICB1aVByb2dyZXNzOyAgLyoqPCBQcm9ncmVzcyBpbmZvcm1hdGlvbiBzYXZlZCBhdCBlYWNoIHN0ZXAgdG8gYmUgYWJsZSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXQgaW4gY2FzZSBvZiBwYXVzZSAqLwotCi0gICAgLyoqCi0gICAgICogUmVhZGVyIHN0dWZmICovCi0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgICAgcFJlYWRlckNvbnRleHQ7ICAgICAgICAgICAvKio8IENvbnRleHQgb2YgdGhlIHJlYWRlciBtb2R1bGUgKi8KLSAgICBNNF9WaWRlb1N0cmVhbUhhbmRsZXIqICBwUmVhZGVyVmlkZW9TdHJlYW07ICAgICAgIC8qKjwgRGVzY3JpcHRpb24gb2YgdGhlIHJlYWQgdmlkZW8gc3RyZWFtICovCi0gICAgTTRfQXVkaW9TdHJlYW1IYW5kbGVyKiAgcFJlYWRlckF1ZGlvU3RyZWFtOyAgICAgICAvKio8IERlc2NyaXB0aW9uIG9mIHRoZSByZWFkIGF1ZGlvIHN0cmVhbSAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgIGJVbnN1cHBvcnRlZFZpZGVvRm91bmQ7ICAgLyoqPCBUcnVlIGlmIGFuIHVuc3VwcG9ydGVkIHZpZGVvIHN0cmVhbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSBoYXMgYmVlbiBmb3VuZCAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgIGJVbnN1cHBvcnRlZEF1ZGlvRm91bmQ7ICAgLyoqPCBUcnVlIGlmIGFuIHVuc3VwcG9ydGVkIGF1ZGlvIHN0cmVhbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSBoYXMgYmVlbiBmb3VuZCAqLwotICAgIE00X0FjY2Vzc1VuaXQgICAgICAgICAgIFJlYWRlclZpZGVvQVU7ICAgICAgICAgICAgLyoqPCBSZWFkIHZpZGVvIGFjY2VzcyB1bml0ICovCi0gICAgTTRfQWNjZXNzVW5pdCAgICAgICAgICAgUmVhZGVyVmlkZW9BVTE7ICAgICAgICAgICAvKio8IFJlYWQgdmlkZW8gYWNjZXNzIHVuaXQgKi8KLSAgICBNNF9BY2Nlc3NVbml0ICAgICAgICAgICBSZWFkZXJWaWRlb0FVMjsgICAgICAgICAgIC8qKjwgUmVhZCB2aWRlbyBhY2Nlc3MgdW5pdCAqLwotICAgIE00X0FjY2Vzc1VuaXQgICAgICAgICAgIFJlYWRlckF1ZGlvQVU7ICAgICAgICAgICAgLyoqPCBSZWFkIGF1ZGlvIGFjY2VzcyB1bml0ICovCi0gICAgTTRfQWNjZXNzVW5pdCAgICAgICAgICAgUmVhZGVyQXVkaW9BVTE7ICAgICAgICAgICAvKio8IFJlYWQgYXVkaW8gYWNjZXNzIHVuaXQgKi8KLSAgICBNNF9BY2Nlc3NVbml0ICAgICAgICAgICBSZWFkZXJBdWRpb0FVMjsgICAgICAgICAgIC8qKjwgUmVhZCBhdWRpbyBhY2Nlc3MgdW5pdCAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICAgIG1fcERhdGFBZGRyZXNzMTsgICAgICAgICAgLyoqPCBUZW1wb3JhcnkgYnVmZmVyIGZvciBBY2Nlc3MgVW5pdCAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICAgIG1fcERhdGFBZGRyZXNzMjsgICAgICAgICAgLyoqPCBUZW1wb3JhcnkgYnVmZmVyIGZvciBBY2Nlc3MgVW5pdCAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICAgIG1fcERhdGFWaWRlb0FkZHJlc3MxOyAgICAgLyoqPCBUZW1wb3JhcnkgYnVmZmVyIGZvciBBY2Nlc3MgVW5pdCAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICAgIG1fcERhdGFWaWRlb0FkZHJlc3MyOyAgICAgLyoqPCBUZW1wb3JhcnkgYnVmZmVyIGZvciBBY2Nlc3MgVW5pdCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1fYXVkaW9BVUR1cmF0aW9uOyAgICAgICAgLyoqPCBBdWRpbyBBVSBkdXJhdGlvbiAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgIGlBdWRpb0N0c09mZnNldDsgICAgICAgICAgLyoqPCBBdWRpbyBBVSBDVFMgb2Zmc2V0IGR1ZSB0byBiZWdpbiBjdXQgKi8KLQotICAgIC8qKgotICAgICAqIFZpZGVvIGRlY29kZXIgc3R1ZmYgKi8KLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgcFZpRGVjQ3R4dDsgICAgICAgICAvKio8IFZpZGVvIGRlY29kZXIgY29udGV4dCAqLwotICAgIE00T1NBX0RvdWJsZSAgICAgICAgICBkVmlEZWNTdGFydGluZ0N0czsgIC8qKjwgVmlkZW8gQ1RTIGF0IHdoaWNoIHRoZSBkZWNvZGUvZW5jb2RlIHdpbGwgc3RhcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2VkIGZvciBiZWdpbiBjdXQgYW5kIHBhdXNlL3Jlc3VtZSkgKi8KLSAgICBNNE9TQV9Eb3VibGUgICAgICAgICAgZFZpRGVjQ3VycmVudEN0czsgICAvKio8IFZpZGVvIENUUyB0byBkZWNvZGUgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgaVZpZGVvQmVnaW5EZWNJbmNyOyAvKio8IENUUyBzdGVwIGZvciB0aGUgYmVnaW4gY3V0IGRlY29kZSAoZG9lc24ndAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWQgZmxvYXRpbmcgcG9pbnQgcHJlY2lzaW9uKSAqLwotICAgIE00T1NBX0RvdWJsZSAgICAgICAgICBkQ3RzSW5jcmVtZW50OyAgICAgIC8qKjwgQ3RzIGluY3JlbWVudCBmcm9tIG9uZSB2aWRlbyBmcmFtZSB0byBhbm90aGVyKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgaXNSZW5kZXJEdXA7ICAgICAgICAvKio8IFRvIGhhbmRsZSBkdXBsaWNhdGUgZnJhbWUgcmVuZGVyaW5nIGluIGNhc2Ugb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbCBkZWNvZGluZyAqLwotICAgIE00VklGSV9JbWFnZVBsYW5lKiAgICBsYXN0RGVjb2RlZFBsYW5lOyAgIC8qKjwgTGFzdCBkZWNvZGVkIHBsYW5lICovCi0KLSAgICAvKioKLSAgICAgKiBWaWRlbyBlbmNvZGVyIHN0dWZmICovCi0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgIHBWaUVuY0N0eHQ7ICAgICAgICAgLyoqPCBWaWRlbyBlbmNvZGVyIGNvbnRleHQgKi8KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSogICAgcFByZVJlc2l6ZUZyYW1lOyAgICAvKio8IFRoZSBkZWNvZGVkIGltYWdlIGJlZm9yZSByZXNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsbG9jYXRlZCBpZiByZXNpemUgbmVlZGVkIG9ubHkpKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgdWlFbmNWaWRlb0JpdHJhdGU7ICAvKio8IEFjdHVhbCB2aWRlbyBiaXRyYXRlIGZvciB0aGUgdmlkZW8gZW5jb2RlciAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICBvdXRwdXRWaWRlb1RpbWVzY2FsZTsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgZW5jb2RlclN0YXRlOwotCi0gICAgLyoqCi0gICAgICogQXVkaW8gZGVjb2RlciBzdHVmZiAqLwotICAgIE00T1NBX0NvbnRleHQgICAgICAgICBwQXVkaW9EZWNDdHh0OyAgICAgICAgLyoqPCBBdWRpbyAoQUFDKSBkZWNvZGVyIGNvbnRleHQgKi8KLSAgICBNNEFEX0J1ZmZlciAgICAgICAgICAgQXVkaW9EZWNCdWZmZXJJbjsgICAgIC8qKjwgSW5wdXQgc3RydWN0dXJlIGZvciB0aGUgYXVkaW8gZGVjb2RlciAqLwotICAgIE00QURfQnVmZmVyICAgICAgICAgICBBdWRpb0RlY0J1ZmZlck91dDsgICAgLyoqPCBPdXRwdXQgc3RydWN0dXJlIGZvciB0aGUgYXVkaW8gZGVjb2RlciAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICBwUG9zSW5EZWNCdWZmZXJPdXQ7ICAgLyoqPCBQb3NpdGlvbiBpbnRvIHRoZSBkZWNvZGVyIGJ1ZmZlciAqLwotICAgIEFBQ19ERUNfU1RSRUFNX1BST1BTICBBYWNQcm9wZXJ0aWVzOyAgIC8qKjwgU3RydWN0dXJlIGZvciBuZXcgYXBpIHRvIGdldCBBQUMgcHJvcGVydGllcyAqLwotCi0gICAgLyoqCi0gICAgICogU2FtcGxlIFJhdGUgQ29udmVydG9yIChTU1JDKSBzdHVmZiAqLwotICAgIFNTUkNfSW5zdGFuY2VfdCAgICAgICAgU3NyY0luc3RhbmNlOyAgICAgICAvKio8IENvbnRleHQgb2YgdGhlIFNzcmMgKi8KLSAgICBTU1JDX1NjcmF0Y2hfdCogICAgICAgIFNzcmNTY3JhdGNoOyAgICAgICAgLyoqPCBXb3JraW5nIG1lbW9yeSBvZiB0aGUgU3NyYyAqLwotICAgIHNob3J0ICAgICAgICAgICAgICAgICAgaVNzcmNOYlNhbXBsSW47ICAgICAvKio8IE51bWJlciBvZiBzYW1wbGUgdGhlIFNzcmMgbmVlZHMgYXMgaW5wdXQgKi8KLSAgICBzaG9ydCAgICAgICAgICAgICAgICAgIGlTc3JjTmJTYW1wbE91dDsgICAgLyoqPCBOdW1iZXIgb2Ygc2FtcGxlIHRoZSBTc3JjIG91dHB1dHMgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgIHBTc3JjQnVmZmVySW47ICAgICAgLyoqPCBJbnB1dCBvZiB0aGUgU1NSQyAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICAgcFNzcmNCdWZmZXJPdXQ7ICAgICAvKio8IE91dHB1dCBvZiB0aGUgU1NSQyAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICAgcFBvc0luU3NyY0J1ZmZlckluOyAvKio8IFBvc2l0aW9uIGludG8gdGhlIFNTUkMgaW4gYnVmZmVyICovCi0gICAgTTRPU0FfTWVtQWRkcjggICAgICAgICBwUG9zSW5Tc3JjQnVmZmVyT3V0Oy8qKjwgUG9zaXRpb24gaW50byB0aGUgU1NSQyBvdXQgYnVmZmVyICovCi0KLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgIHBMVkF1ZGlvUmVzYW1wbGVyOwotCi0KLSAgICAvKioKLSAgICAgKiBhdWRpbyBlbmNvZGVyIHN0dWZmICovCi0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgICAgICAgICAgICBwQXVkaW9FbmNDdHh0OyAvKio8IENvbnRleHQgb2YgdGhlIGF1ZGlvIGVuY29kZXIgKi8KLSAgICBNNEVOQ09ERVJfQXVkaW9EZWNTcGVjaWZpY0luZm8gIHBBdWRpb0VuY0RTSTsgLyoqPCBEZWNvZGVyIHNwZWNpZmljIGluZm8gYnVpbHQgYnkgdGhlIGVuY29kZXIqLwotICAgIE00RU5DT0RFUl9BdWRpb1BhcmFtcyAgICAgICAgICAgQXVkaW9FbmNQYXJhbXM7LyoqPCBDb25maWcgb2YgdGhlIGF1ZGlvIGVuY29kZXIgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgICAgIHBBdWRpb0VuY29kZXJCdWZmZXI7ICAgICAgLyoqPCBJbnB1dCBvZiB0aGUgZW5jb2RlciAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICAgICAgcFBvc0luQXVkaW9FbmNvZGVyQnVmZmVyOyAvKio8IFBvc2l0aW9uIGludG8gdGhlIGVuY29kZXIgYnVmZmVyICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICBhdWRpb0VuY29kZXJHcmFudWxhcml0eTsgIC8qKjwgTWluaW11bSBudW1iZXIgb2YgcGNtIHNhbXBsZXMgbmVlZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gZmVlZCBhdWRpbyBlbmNvZGVyICovCi0KLSAgICAvKioKLSAgICAgKiBXcml0ZXIgc3R1ZmYgKi8KLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgICAgIHBXcml0ZXJDb250ZXh0OyAgICAgLyoqPCBDb250ZXh0IG9mIHRoZSB3cml0ZXIgbW9kdWxlICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICBwT3V0cHV0RmlsZTsgICAgICAgIC8qKjwgT3V0cHV0IGZpbGUgdG8gYmUgY3JlYXRlZCAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgcFRlbXBvcmFyeUZpbGU7ICAgICAvKio8IFRlbXBvcmFyeSBmaWxlIHRvIGJlIGNyZWF0ZWQgdG8gc3RvcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgKCJtb292LmJpbiIpICovCi0gICAgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24gICBXcml0ZXJWaWRlb1N0cmVhbTsgIC8qKjwgRGVzY3JpcHRpb24gb2YgdGhlIHdyaXR0ZW4gdmlkZW8gc3RyZWFtICovCi0gICAgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24gICBXcml0ZXJBdWRpb1N0cmVhbTsgIC8qKjwgRGVzY3JpcHRpb24gb2YgdGhlIHdyaXR0ZW4gYXVkaW8gc3RyZWFtICovCi0gICAgTTRXUklURVJfU3RyZWFtVmlkZW9JbmZvcyBXcml0ZXJWaWRlb1N0cmVhbUluZm87LyoqPCBWaWRlbyBwcm9wZXJ0aWVzIG9mIHRoZSB3cml0dGVuIHZpZGVvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtICovCi0gICAgTTRTWVNfQWNjZXNzVW5pdCAgICAgICAgICBXcml0ZXJWaWRlb0FVOyAgICAgICAgLyoqPCBXcml0dGVuIHZpZGVvIGFjY2VzcyB1bml0ICovCi0gICAgTTRTWVNfQWNjZXNzVW5pdCAgICAgICAgICBXcml0ZXJBdWRpb0FVOyAgICAgICAgLyoqPCBXcml0dGVuIGF1ZGlvIGFjY2VzcyB1bml0ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICB1aVZpZGVvQVVDb3VudDsgICAgICAgLyoqPCBOdW1iZXIgb2YgdmlkZW8gQVUgd3JpdHRlbiBpbiBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICB1aVZpZGVvTWF4QXVTaXplOyAgICAgLyoqPCBNYXggYWNjZXNzIHVuaXQgc2l6ZSBmb3IgdGhlIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvIHN0cmVhbSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgdWlWaWRlb01heENodW5ja1NpemU7IC8qKjwgTWF4IGNodW5jayBzaXplIGZvciB0aGUgb3V0cHV0IHZpZGVvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICB1aUF1ZGlvQVVDb3VudDsgICAvKio8IE51bWJlciBvZiBhdWRpbyBBVSB3cml0dGVuIGluIG91dHB1dCBmaWxlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICB1aUF1ZGlvTWF4QXVTaXplOyAvKio8IE1heCBhY2Nlc3MgdW5pdCBzaXplIGZvciB0aGUgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gc3RyZWFtICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICB1aUF1ZGlvQ3RzOyAgICAgICAvKio8IEF1ZGlvIEFVIGN0cyAod2hlbiBhdWRpbyBpcyB0cmFuc2NvZGVkKSAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgYl9pc1Jhd1dyaXRlcjsgICAgLyoqPCBCb29sZWFuIHRvIGtub3cgaWYgdGhlIHJhdyB3cml0ZXIgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyZWQgb3Igbm90ICovCi0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgICAgICBwT3V0cHV0UENNZmlsZTsgICAvKio8IE91dHB1dCBQQ00gZmlsZSBpZiBub3QgTlVMTCAqLwotCi0gICAgLyoqCi0gICAgICogRmlsZXN5c3RlbSBmdW5jdGlvbnMgKi8KLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqICAgIHBPc2FGaWxlUmVhZFB0cjsgLyoqPCBPU0FMIGZpbGUgcmVhZCBmdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcHJvdmlkZWQgYnkgdXNlciAqLwotICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiAgcE9zYUZpbGVXcml0UHRyOyAvKio8IE9TQUwgZmlsZSB3cml0ZSBmdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcHJvdmlkZWQgYnkgdXNlciAqLwotCi0gICAgLyoqCi0gICAgICAqIE1lZGlhIGFuZCBDb2RlYyByZWdpc3RyYXRpb24gKi8KLSAgICAvKio8IFRhYmxlIG9mIE00VkVTX1dyaXRlckludGVyZmFjZSBzdHJ1Y3R1cmVzIGZvciBhdmFsYWlibGUgV3JpdGVycyBsaXN0ICovCi0gICAgTTRNQ1NfV3JpdGVySW50ZXJmYWNlICAgICAgICAgICAgICAgV3JpdGVySW50ZXJmYWNlW000V1JJVEVSX2tUeXBlX05CXTsKLSAgICAvKio8IG9wZW4sIGNsb3NlLCBzZXRvcHRpb24sZXRjLi4uIGZ1bmN0aW9ucyBvZiB0aGUgdXNlZCB3cml0ZXIqLwotICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSogICAgICAgICAgIHBXcml0ZXJHbG9iYWxGY3RzOwotICAgIC8qKjwgZGF0YSBtYW5pcHVsYXRpb24gZnVuY3Rpb25zIG9mIHRoZSB1c2VkIHdyaXRlciAqLwotICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqICAgICAgICAgICAgIHBXcml0ZXJEYXRhRmN0czsKLSAgICAvKio8IFRhYmxlIG9mIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2Ugc3RydWN0dXJlcyBmb3IgYXZhbGFpYmxlIGVuY29kZXJzIGxpc3QgKi8KLSAgICBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlKiAgICAgICAgICBwVmlkZW9FbmNvZGVySW50ZXJmYWNlW000RU5DT0RFUl9rVmlkZW9fTkJdOwotICAgIC8qKjwgRnVuY3Rpb25zIG9mIHRoZSB1c2VkIGVuY29kZXIgKi8KLSAgICBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlKiAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0czsKLQotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgIHBWaWRlb0VuY29kZXJFeHRlcm5hbEFQSVRhYmxlW000RU5DT0RFUl9rVmlkZW9fTkJdOwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJyZW50VmlkZW9FbmNvZGVyRXh0ZXJuYWxBUEk7Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgcFZpZGVvRW5jb2RlclVzZXJEYXRhVGFibGVbTTRFTkNPREVSX2tWaWRlb19OQl07Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgcEN1cnJlbnRWaWRlb0VuY29kZXJVc2VyRGF0YTsKLQotICAgIC8qKjwgVGFibGUgb2YgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlIHN0cnVjdHVyZXMgZm9yIGF2YWxhaWJsZSBlbmNvZGVycyBsaXN0ICovCi0gICAgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlKiAgICAgcEF1ZGlvRW5jb2RlckludGVyZmFjZVtNNEVOQ09ERVJfa0F1ZGlvX05CXTsKLSAgICAvKio8IFRhYmxlIG9mIGludGVybmFsL2V4dGVybmFsIGZsYWdzIGZvciBhdmFsYWlibGUgZW5jb2RlcnMgbGlzdCAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgIHBBdWRpb0VuY29kZXJGbGFnW000RU5DT0RFUl9rQXVkaW9fTkJdOwotICAgIC8qKjwgRnVuY3Rpb25zIG9mIHRoZSB1c2VkIGVuY29kZXIgKi8KLSAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UqICAgICBwQXVkaW9FbmNvZGVyR2xvYmFsRmN0czsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICBwQXVkaW9FbmNvZGVyVXNlckRhdGFUYWJsZVtNNEVOQ09ERVJfa0F1ZGlvX05CXTsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudEF1ZGlvRW5jb2RlclVzZXJEYXRhOwotCi0gICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlKiAgICAgICAgICAgbV9wUmVhZGVyR2xvYmFsSXRUYWJsZVtNNFJFQURFUl9rTWVkaWFUeXBlX05CXTsKLSAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlKiAgICAgICAgICAgICBtX3BSZWFkZXJEYXRhSXRUYWJsZVtNNFJFQURFUl9rTWVkaWFUeXBlX05CXTsKLSAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UqICAgICAgICAgICBtX3BSZWFkZXI7Ci0gICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSogICAgICAgICAgICAgbV9wUmVhZGVyRGF0YUl0OwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICAgICAgIG1fdWlOYlJlZ2lzdGVyZWRSZWFkZXJzOwotCi0gICAgTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlKiAgICAgICAgICAgbV9wVmlkZW9EZWNvZGVyOwotICAgIE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSogICAgICAgICAgIG1fcFZpZGVvRGVjb2Rlckl0VGFibGVbTTRERUNPREVSX2tWaWRlb1R5cGVfTkJdOwotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEN1cnJlbnRWaWRlb0RlY29kZXJVc2VyRGF0YTsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICBtX3BWaWRlb0RlY29kZXJVc2VyRGF0YVRhYmxlW000REVDT0RFUl9rVmlkZW9UeXBlX05CXTsKLSNlbmRpZiAvKiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgICAgICBtX3VpTmJSZWdpc3RlcmVkVmlkZW9EZWM7Ci0KLSAgICBNNEFEX0ludGVyZmFjZSogICAgICAgICBtX3BBdWRpb0RlY29kZXI7Ci0gICAgTTRBRF9JbnRlcmZhY2UqICAgICAgICAgbV9wQXVkaW9EZWNvZGVySXRUYWJsZVtNNEFEX2tUeXBlX05CXTsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICBtX3BBdWRpb0RlY29kZXJGbGFnVGFibGVbTTRBRF9rVHlwZV9OQl07IC8qKjwgc3RvcmUgaW5kaWNlcyBvZiBleHRlcm5hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJzICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgbV9wQXVkaW9EZWNvZGVyVXNlckRhdGFUYWJsZVtNNEFEX2tUeXBlX05CXTsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICBtX3BDdXJyZW50QXVkaW9EZWNvZGVyVXNlckRhdGE7Ci0KLSAgICBNNE1DU19NZWRpYVJlbmRlcmluZyAgICBNZWRpYVJlbmRlcmluZzsgICAgIC8qKjwgRkI6IHRvIGNyb3AsIHJlc2l6ZSwgb3IgcmVuZGVyIGJsYWNrIGJvcmRlcnMqLwotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgIG1fYWlyX2NvbnRleHQ7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgYkV4dE9NWEF1ZERlY29kZXI7ICAvKiBFeHRlcm5hbCBPTVggQXVkaW8gZGVjb2RlciAqLwotCi0gICAgLyoqPCBGbEIgMjAwOS4wMy4wNDogQXVkaW8gZWZmZWN0cyovCi0gICAgTTRNQ1NfRWZmZWN0U2V0dGluZ3MgICAgKnBFZmZlY3RzOyAgICAgICAgICAgICAgLyoqPCBMaXN0IG9mIGVmZmVjdHMgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICBuYkVmZmVjdHM7ICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlZmZlY3RzIGluIHRoZSBhYm92ZSBsaXN0ICovCi0gICAgTTRPU0FfSW50OCAgICAgICAgICAgICAgcEFjdGl2ZUVmZmVjdE51bWJlcjsgICAgLyoqPCBFZmZlY3QgSUQgdG8gYmUgYXBwbGllZCwgaWYgLTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZWZmZWN0IGhhcyB0byBiZSBhcHBsaWVkIGN1cnJlbnRseSovCi0KLSNpZmRlZiBNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICBtX2JJc1N0aWxsUGljdHVyZTsgICAgICAgLyoqPCA9VFJVRSBpZiBpbnB1dCBmaWxlIGlzIGEgc3RpbGwgcGljdHVyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSlBFRywgUE5HLCBCTVAsIEdJRikqLwotICAgIE00TUNTX0NvbnRleHQgICAgICAgICAgIG1fcFN0aWxsUGljdHVyZUNvbnRleHQ7IC8qKjwgQ29udGV4dCBvZiB0aGUgc3RpbGwgcGljdHVyZSBwYXJ0IG9mIE1DUyovCi0jZW5kaWYgLypNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUqLwotICAgIE5TV0FWQ19NQ1NfdCAgICAgICAgICAgICptX3BJbnN0YW5jZTsKLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAqSDI2NE1DU1RlbXBCdWZmZXI7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgSDI2NE1DU1RlbXBCdWZmZXJTaXplOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIEgyNjRNQ1NUZW1wQnVmZmVyRGF0YVNpemU7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgYkgyNjRUcmltOwotICAgIC8qIEZsYWcgd2hlbiB0byBnZXQgIGxhc3RkZWNvZGVkZnJhbWVDVFMgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICBiTGFzdERlY29kZWRGcmFtZUNUUzsKLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICBlbmNvZGluZ1ZpZGVvUHJvZmlsZTsKLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICBlbmNvZGluZ1ZpZGVvTGV2ZWw7Ci0KLX0gTTRNQ1NfSW50ZXJuYWxDb250ZXh0OwotCi0KLSNlbmRpZiAvKiBfX000TUNTX0lOVEVSTkFMVFlQRVNfSF9fICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL0FuZHJvaWQubWsgYi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNDcwZTZiLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotIwotIyBsaWJ2aWRlb2VkaXRvcl9tY3MKLSMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRTo9IGxpYnZpZGVvZWRpdG9yX21jcwotCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICBcCi0gICAgICBNNE1DU19BUEkuYyBcCi0gICAgICBNNE1DU19BdWRpb0VmZmVjdHMuYyBcCi0gICAgICBNNE1DU19Db2RlY3MuYyBcCi0gICAgICBNNE1DU19NZWRpYUFuZENvZGVjU3Vic2NyaXB0aW9uLmMgXAotICAgICAgTTRNQ1NfVmlkZW9QcmVQcm9jZXNzaW5nLmMKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGliY3V0aWxzICAgICAgICAgICAgIFwKLSAgICBsaWJ1dGlscyAgICAgICAgICAgICAgXAotICAgIGxpYnZpZGVvZWRpdG9yX29zYWwgICBcCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJkbAotCi0jIEFsbCBvZiB0aGUgc2hhcmVkIGxpYnJhcmllcyB3ZSBsaW5rIGFnYWluc3QuCi1MT0NBTF9MRExJQlMgOj0gXAotICAgIC1scHRocmVhZCAtbGRsCi0KLUxPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciBcCi0gICAgLURNNE1DU19XSVRIX0ZBU1RfT1BFTgotCi1pbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL000TUNTX0FQSS5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTTRNQ1NfQVBJLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMwNTZlZjAuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTTRNQ1NfQVBJLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDk0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNE1DU19BUEkuYwotICogQGJyaWVmICBNQ1MgaW1wbGVtZW50YXRpb24gKFZpZGVvIENvbXByZXNzb3IgU2VydmljZSkKLSAqIEBub3RlICAgVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIEFQSSBhbmQgdGhlIHByb2Nlc3Npbmcgb2YgdGhlIE1DUwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEluY2x1ZGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotLyoqCi0gKiBPU0FMIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIgLyoqPCBPU0FMIG1lbW9yeSBtYW5hZ2VtZW50ICovCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIgIC8qKjwgT1NBTCBkZWJ1ZyBtYW5hZ2VtZW50ICovCi0KLS8qIFBDTSBzYW1wbGVzICovCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JSZXNhbXBsZXIuaCIKLS8qKgotICogRGVjb2RlciBpbnRlcmZhY2UgKi8KLSNpbmNsdWRlICJNNERFQ09ERVJfQ29tbW9uLmgiCi0KLS8qIEVuY29kZXIgaW50ZXJmYWNlKi8KLSNpbmNsdWRlICJNNEVOQ09ERVJfY29tbW9uLmgiCi0KLS8qIEVuYWJsZSBmb3IgREVCVUcgbG9nZ2luZyAqLwotLy8jZGVmaW5lIE1DU19EVU1QX1BDTV9UT19GSUxFCi0jaWZkZWYgTUNTX0RVTVBfUENNX1RPX0ZJTEUKLSNpbmNsdWRlIDxzdGRpby5oPgotRklMRSAqZmlsZV9hdV9yZWFkZXIgPSBOVUxMOwotRklMRSAqZmlsZV9wY21fZGVjb2RlciA9IE5VTEw7Ci1GSUxFICpmaWxlX3BjbV9lbmNvZGVyID0gTlVMTDsKLSNlbmRpZgotCi0vKiBDb3JlIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJNNE1DU19BUEkuaCIKLSNpbmNsdWRlICJNNE1DU19FcnJvckNvZGVzLmgiCi0jaW5jbHVkZSAiTTRNQ1NfSW50ZXJuYWxUeXBlcy5oIgotI2luY2x1ZGUgIk00TUNTX0ludGVybmFsQ29uZmlnLmgiCi0jaW5jbHVkZSAiTTRNQ1NfSW50ZXJuYWxGdW5jdGlvbnMuaCIKLQotI2lmZGVmIE00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRQotI2luY2x1ZGUgIk00TUNTX1N0aWxsUGljdHVyZS5oIgotI2VuZGlmIC8qTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFKi8KLQotLyogQ29tbW9uIGhlYWRlcnMgKGZvciBhYWMpICovCi0jaW5jbHVkZSAiTTRfQ29tbW9uLmgiCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0KLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLSNpbmNsdWRlICJNNFZEX0VYVEVSTkFMX0ludGVyZmFjZS5oIgotI2VuZGlmIC8qIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUyAqLwotCi0jaW5jbHVkZSAiTTRBSVJfQVBJLmgiCi0jaW5jbHVkZSAiT01YX1ZpZGVvLmgiCi0KLS8qIFZlcnNpb24gKi8KLSNkZWZpbmUgTTRNQ1NfVkVSU0lPTl9NQUpPUiAzCi0jZGVmaW5lIE00TUNTX1ZFUlNJT05fTUlOT1IgNAotI2RlZmluZSBNNE1DU19WRVJTSU9OX1JFVklTSU9OICAzCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBTdGF0aWMgbG9jYWwgZnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludFN0ZXBTZXQoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50UHJlcGFyZVZpZGVvRGVjb2RlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50UHJlcGFyZUF1ZGlvUHJvY2Vzc2luZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50UHJlcGFyZVdyaXRlciggTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRQcmVwYXJlQXVkaW9CZWdpbkN1dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50U3RlcEVuY29kaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4ICpwVHJhbnNjb2RlZFRpbWUgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50U3RlcEJlZ2luVmlkZW9KdW1wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRTdGVwQmVnaW5WaWRlb0RlY29kZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50QXVkaW9OdWxsRW5jb2RpbmcoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50QXVkaW9UcmFuc2NvZGluZyggTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZyggTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRWaWRlb1RyYW5zY29kaW5nKCBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludEdldElucHV0Q2xpcFByb3BlcnRpZXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgICAqcENvbnRleHQgKTsKLXN0YXRpYyBNNE9TQV9VSW50MzIgTTRNQ1NfaW50R2V0RnJhbWVTaXplX0FNUk5CKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTWVtQWRkcjggcEF1ZGlvRnJhbWUgKTsKLXN0YXRpYyBNNE9TQV9VSW50MzIgTTRNQ1NfaW50R2V0RnJhbWVTaXplX0VWUkMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9NZW1BZGRyOCBwQXVkaW9GcmFtZSApOwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRDaGVja01heEZpbGVTaXplKCBNNE1DU19Db250ZXh0IHBDb250ZXh0ICk7Ci1zdGF0aWMgTTRWSURFT0VESVRJTkdfQml0cmF0ZSBNNE1DU19pbnRHZXROZWFyZXN0Qml0cmF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIGZyZWViaXRyYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50OCBtb2RlICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludENsZWFuVXBfUmVhZGVyc0RlY29kZXJzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRSZWFsbG9jVGVtcG9yYXJ5QVUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9NZW1BZGRyOCAqYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBuZXdTaXplICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludENoZWNrQW5kR2V0Q29kZWNQcm9wZXJ0aWVzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyk7Ci0KLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50TGltaXRCaXRyYXRlUGVyQ29kZWNQcm9maWxlTGV2ZWwoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQWR2YW5jZWRQYXJhbXMqIEVuY1BhcmFtcyk7Ci1zdGF0aWMgTTRPU0FfSW50MzIgTTRNQ1NfaW50TGltaXRCaXRyYXRlRm9ySDI2M0VuYyhNNE9TQV9JbnQzMiBwcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgbGV2ZWwsIE00T1NBX0ludDMyIGJpdHJhdGUpOwotc3RhdGljIE00T1NBX0ludDMyIE00TUNTX2ludExpbWl0Qml0cmF0ZUZvck1wZWc0RW5jKE00T1NBX0ludDMyIHByb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBsZXZlbCwgTTRPU0FfSW50MzIgYml0cmF0ZSk7Ci1zdGF0aWMgTTRPU0FfSW50MzIgTTRNQ1NfaW50TGltaXRCaXRyYXRlRm9ySDI2NEVuYyhNNE9TQV9JbnQzMiBwcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgbGV2ZWwsIE00T1NBX0ludDMyIGJpdHJhdGUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBFeHRlcm5hbCBmdW5jdGlvbiB1c2VkIG9ubHkgYnkgVmlkZW9FZGl0b3IgYW5kIHRoYXQgZG9lcyBub3QgYXBwZWFyCi0gKiBpbiB0aGUgQVBJCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLU00T1NBX0VSUiBNNE1DU19vcGVuX25vcm1hbE1vZGUoIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkICpwRmlsZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgSW5wdXRGaWxlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQgKnBGaWxlT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCAqcFRlbXBGaWxlICk7Ci0KLS8qIEFsbCBlcnJvcnMgYXJlIGZhdGFsIGluIHRoZSBNQ1MgKi8KLSNkZWZpbmUgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycikgaWYoTTROT19FUlJPUiE9ZXJyKSByZXR1cm4gZXJyOwotCi0vKiBBIGRlZmluZSB1c2VkIHdpdGggU1NSQyAxLjA0IGFuZCBhYm92ZSB0byBhdm9pZCB0YWtpbmcgYmxvY2tzIHNtYWxsZXIKLSAqIHRoYXQgdGhlIG1pbmltYWwgYmxvY2sgc2l6ZQotICovCi0jZGVmaW5lIE00TUNTX1NTUkNfTUlOQkxPQ0tTSVpFICAgICAgICAxMDAKLQotc3RhdGljIE00T1NBX1VDaGFyIFRhYl9NQ1NbOF0gPQotewotICAgIDE3LCA1LCAzLCAzLCAxLCAxLCAxLCAxCi19OwotCi1NNE9TQV9FUlIgSDI2NE1DU19HZXRpbnN0YW5jZSggTlNXQVZDX01DU190ICoqIGluc3RhbmNlICkKLXsKLSAgICBOU1dBVkNfTUNTX3QgKnBfYnMgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIHBfYnMgPSAoTlNXQVZDX01DU190ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihOU1dBVkNfTUNTX3QpLCBNNE1DUywKLSAgICAgICAgKE00T1NBX0NoYXIgKikiTlNXQVZDX01DU190Iik7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwX2JzICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJIMjY0TUNTX0dldGluc3RhbmNlOiBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICBwX2JzLT5wcmV2X2ZyYW1lX251bSA9IDA7Ci0gICAgcF9icy0+Y3VyX2ZyYW1lX251bSA9IDA7Ci0gICAgcF9icy0+bG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCA9IDA7Ci0gICAgcF9icy0+cHJldl9uZXdfZnJhbWVfbnVtID0gMDsKLSAgICBwX2JzLT5pc19kb25lID0gMDsKLSAgICBwX2JzLT5pc19maXJzdCA9IDE7Ci0KLSAgICBwX2JzLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICBwX2JzLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMDsKLQotICAgIHBfYnMtPm1fcEVuY29kZXJTUFMgPSBNNE9TQV9OVUxMOwotICAgIHBfYnMtPm1fZW5jb2RlclNQU1NpemUgPSAwOwotCi0gICAgcF9icy0+bV9wRW5jb2RlclBQUyA9IE00T1NBX05VTEw7Ci0gICAgcF9icy0+bV9lbmNvZGVyUFBTU2l6ZSA9IDA7Ci0KLSAgICBwX2JzLT5tX3BGaW5hbERTSSA9IE00T1NBX05VTEw7Ci0gICAgcF9icy0+bV9wRmluYWxEU0lTaXplID0gMDsKLQotICAgIHBfYnMtPnBfY2xpcF9zcHMgPSBNNE9TQV9OVUxMOwotICAgIHBfYnMtPm1fZW5jb2Rlcl9TUFNfQ250ID0gMDsKLQotICAgIHBfYnMtPnBfY2xpcF9wcHMgPSBNNE9TQV9OVUxMOwotICAgIHBfYnMtPm1fZW5jb2Rlcl9QUFNfQ250ID0gMDsKLQotICAgIHBfYnMtPnBfZW5jb2Rlcl9zcHMgPSBNNE9TQV9OVUxMOwotICAgIHBfYnMtPnBfZW5jb2Rlcl9wcHMgPSBNNE9TQV9OVUxMOwotCi0gICAgcF9icy0+ZW5jb2Rlcl9wcHMuc2xpY2VfZ3JvdXBfaWQgPSBNNE9TQV9OVUxMOwotCi0gICAgKmluc3RhbmNlID0gKE5TV0FWQ19NQ1NfdCAqKXBfYnM7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfVUludDMyIEgyNjRNQ1NfZ2V0Qml0cyggQ29tQml0U3RyZWFtTUNTX3QgKnBfYnMsIE00T1NBX1VJbnQzMiBudW1CaXRzICkKLXsKLSAgICBNNE9TQV9VSW50MzIgdWkzMlJldEJpdHM7Ci0gICAgTTRPU0FfVUludDggKnBiczsKLSAgICBNNE9TQV9JbnQzMiBiY250OwotICAgIHBfYnMtPmk4Qml0Q250IC09IG51bUJpdHM7Ci0gICAgYmNudCA9IHBfYnMtPmk4Qml0Q250OwotCi0gICAgLyogTWVhc3VyZSB0aGUgcXVhbnRpdHkgb2YgYml0cyB0byBiZSByZWFkIGluIHVpMzJUZW1wQnVmZiAqLwotICAgIHVpMzJSZXRCaXRzID0gcF9icy0+dWkzMlRlbXBCdWZmID4+ICgzMiAtIG51bUJpdHMpOwotCi0gICAgLyogUmVhZCBudW1CaXRzIGluIHVpMzJUZW1wQnVmZiAqLwotICAgIHBfYnMtPnVpMzJUZW1wQnVmZiA8PD0gbnVtQml0czsKLSAgICBwX2JzLT5iaXRQb3MgKz0gbnVtQml0czsKLQotICAgIGlmKCBiY250ID4gMjQgKQotICAgIHsKLSAgICAgICAgcmV0dXJuICh1aTMyUmV0Qml0cyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7IC8qIGF0IGxlYXN0IG9uZSBieXRlIGNhbiBiZSBidWZmZXJlZCBpbiB1aTMyVGVtcEJ1ZmYgKi8KLSAgICAgICAgcGJzID0gKE00T1NBX1VJbnQ4ICopcF9icy0+cHVpOEJmclB0cjsKLQotICAgICAgICBpZiggYmNudCA8IChpbnQpKHBfYnMtPm51bUJpdHNJbkJ1ZmZlciAtIHBfYnMtPmJpdFBvcykgKQotICAgICAgICB7IC8qIG5vdCBlbm91Z2ggcmVtYWluaW5nIGJpdHMgaW4gdWkzMlRlbXBCdWZmOiBuZWVkIHRvIGJlIGZpbGxlZCAqLwotICAgICAgICAgICAgZG8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBPbiB0aGUgZmx5IGRldGVjdGlvbiBvZiBFUEIgYnl0ZSAqLwotICAgICAgICAgICAgICAgIGlmKCAoICoocGJzKSA9PSAweDAzKQotICAgICAgICAgICAgICAgICAgICAmJiAoISgoIHBic1stMV0pCi0gICAgICAgICAgICAgICAgICAgIHwgKHBic1stMl0pKSkpIC8vKHBfYnMtPnVpMzJMYXN0VHdvQnl0ZXMgJiAweDAwMDBGRkZGKSA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogRVBCIGJ5dGUgZm91bmQ6IHNraXAgaXQgYW5kIHVwZGF0ZSBiaXRQb3MgYWNjb3JkaW5nbHkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGJzKSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfYnMtPmJpdFBvcyArPSA4OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBwX2JzLT51aTMyVGVtcEJ1ZmYgfD0gKihwYnMpKysgPDwgKDI0IC0gYmNudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiY250ICs9IDg7Ci0gICAgICAgICAgICB9IHdoaWxlICggYmNudCA8PSAyNCApOwotCi0gICAgICAgICAgICBwX2JzLT5wdWk4QmZyUHRyID0gKE00T1NBX0ludDggKilwYnM7Ci0gICAgICAgICAgICBwX2JzLT5pOEJpdENudCA9IGJjbnQ7Ci0gICAgICAgICAgICByZXR1cm4gKHVpMzJSZXRCaXRzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKCBwX2JzLT5iaXRQb3MgPD0gcF9icy0+bnVtQml0c0luQnVmZmVyICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAodWkzMlJldEJpdHMpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gKDApOwotICAgIH0KLX0KLQotTTRPU0FfVm9pZCBIMjY0TUNTX2ZsdXNoQml0cyggQ29tQml0U3RyZWFtTUNTX3QgKnBfYnMsIE00T1NBX1VJbnQzMiBudW1CaXRzICkKLXsKLSAgICBNNE9TQV9VSW50OCAqcGJzOwotICAgIE00T1NBX1VJbnQzMiBiY250OwotICAgIHBfYnMtPmk4Qml0Q250IC09IG51bUJpdHM7Ci0gICAgYmNudCA9IHBfYnMtPmk4Qml0Q250OwotCi0gICAgcF9icy0+dWkzMlRlbXBCdWZmIDw8PSBudW1CaXRzOwotICAgIHBfYnMtPmJpdFBvcyArPSBudW1CaXRzOwotCi0gICAgaWYoIGJjbnQgPiAyNCApCi0gICAgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVsc2UKLSAgICB7IC8qIGF0IGxlYXN0IG9uZSBieXRlIGNhbiBiZSBidWZmZXJlZCBpbiB1aTMyVGVtcEJ1ZmYgKi8KLSAgICAgICAgcGJzID0gKE00T1NBX1VJbnQ4ICopcF9icy0+cHVpOEJmclB0cjsKLQotICAgICAgICBpZiggYmNudCA8IChwX2JzLT5udW1CaXRzSW5CdWZmZXIgLSBwX2JzLT5iaXRQb3MpICkKLSAgICAgICAgeyAgIC8qIE5vdCBlbm91Z2ggcmVtYWluaW5nIGJpdHMgaW4gdWkzMlRlbXBCdWZmOiBuZWVkIHRvIGJlIGZpbGxlZCAqLwotICAgICAgICAgICAgZG8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiAgT24gdGhlIGZseSBkZXRlY3Rpb24gb2YgRVBCIGJ5dGUgKi8KLSAgICAgICAgICAgICAgICBpZiggKCAqKHBicykgPT0gMHgwMykgJiYgKCEoKCBwYnNbLTFdKSB8IChwYnNbLTJdKSkpICkKLSAgICAgICAgICAgICAgICB7IC8qIEpDOiBFUEIgYnl0ZSBmb3VuZDogc2tpcCBpdCBhbmQgdXBkYXRlIGJpdFBvcyBhY2NvcmRpbmdseSAqLwotICAgICAgICAgICAgICAgICAgICAocGJzKSsrOwotICAgICAgICAgICAgICAgICAgICBwX2JzLT5iaXRQb3MgKz0gODsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcF9icy0+dWkzMlRlbXBCdWZmIHw9ICoocGJzKSsrIDw8ICgyNCAtIGJjbnQpOwotICAgICAgICAgICAgICAgIGJjbnQgKz0gODsKLSAgICAgICAgICAgIH0gd2hpbGUgKCBiY250IDw9IDI0ICk7Ci0KLSAgICAgICAgICAgIHBfYnMtPnB1aThCZnJQdHIgPSAoTTRPU0FfSW50OCAqKXBiczsKLSAgICAgICAgICAgIHBfYnMtPmk4Qml0Q250ID0gYmNudDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybjsKLX0KLQotTTRPU0FfVUludDMyIEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUoIENvbUJpdFN0cmVhbU1DU190ICpwX2JzICkKLXsKLSAgICBNNE9TQV9VSW50MzIgY29kZSwgbDAgPSAwLCBsMTsKLSAgICAvKiBSZWFkaW5nIDMyIEJpdHMgZnJvbSBsb2NhbCBjYWNoZSBidWZmZXIgb2YgQml0c3RyZWFtIHN0cnVjdHVyZSovCi0gICAgY29kZSA9IHBfYnMtPnVpMzJUZW1wQnVmZjsKLQotICAgIC8qIENoZWNraW5nIGluIGZpcnN0IDMgYml0cyovCi0gICAgaWYoIGNvZGUgPj4gMjkgKQotICAgIHsKLSAgICAgICAgbDAgPSBUYWJfTUNTWyhjb2RlID4+IDI5KV07Ci0gICAgICAgIGNvZGUgPSBjb2RlID4+ICgzMiAtIGwwKTsKLSAgICAgICAgSDI2NE1DU19mbHVzaEJpdHMocF9icywgbDApOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBjb2RlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb2RlIDw8PSAzOwotCi0gICAgICAgICAgICAgICAgZm9yICggbDAgPSAzOyBjb2RlIDwgMHg4MDAwMDAwMDsgY29kZSA8PD0gMSwgbDArKyApOwotCi0gICAgICAgICAgICAgICAgaWYoIGwwIDwgMTYgKSAvKmFsbCB1c2VmdWwgYml0cyBhcmUgaW5zaWRlIHRoZSAzMiBiaXRzIHJlYWQgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGUgPSBjb2RlID4+ICgzMSAtIGwwKTsKLSAgICAgICAgICAgICAgICAgICAgSDI2NE1DU19mbHVzaEJpdHMocF9icywgMiAqIGwwICsgMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsgLyogUmVhZCB0aGUgdXNlZnVsIGJpdHMgaW4gMiBwYXJ0cyAqLwotICAgICAgICAgICAgICAgICAgICBsMSA9ICggbDAgPDwgMSkgLSAzMTsKLSAgICAgICAgICAgICAgICAgICAgY29kZSA+Pj0gbDA7Ci0gICAgICAgICAgICAgICAgICAgIEgyNjRNQ1NfZmx1c2hCaXRzKHBfYnMsIDMyKTsKLSAgICAgICAgICAgICAgICAgICAgY29kZSA9ICggY29kZSA8PCBsMSkgfCBIMjY0TUNTX2dldEJpdHMocF9icywgbDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBIMjY0TUNTX2ZsdXNoQml0cyhwX2JzLCAzMik7Ci0KLSAgICAgICAgICAgICAgICBpZiggSDI2NE1DU19nZXRCaXRzKHBfYnMsIDEpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGlmIG51bWJlciBvZiBsZWFkaW5nIDAncyBpcyAzMiwgdGhlIG9ubHkgY29kZSBhbGxvd2VkIGlzIDEgZm9sbG93ZWQKLSAgICAgICAgICAgICAgICAgICAgYnkgMzIgMCdzICovCi0KLSAgICAgICAgICAgICAgICAgICAgLypyZWFkaW5nIDMyIG1vcmUgYml0cyBmcm9tIGJpdHN0cmVhbSBidWZmZXIqLwotICAgICAgICAgICAgICAgICAgICBjb2RlID0gSDI2NE1DU19nZXRCaXRzKHBfYnMsIDMyKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggY29kZSA9PSAwICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjb2RlIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyppZiBudW1iZXIgb2YgbGVhZGluZyAwJ3MgaXMgPjMyLCB0aGVuIHN5bWJvbCBpcyA+MzIgYml0cywKLSAgICAgICAgICAgICAgICB3aGljaCBpcyBhbiBlcnJvciAqLwotICAgICAgICAgICAgICAgIC8vcF9icy0+c3RhdGUgPSBfQlNfRVJSOwotICAgICAgICAgICAgICAgIC8vcF9icy0+ZmxhZ3MgfD0gX0JGX1NZTV9FUlI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKCAxICkgLy8ocF9icy0+c3RhdGUgPT0gX0JTX09LKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKGNvZGUgLSAxKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLU00T1NBX0ludDMyIEgyNjRNQ1NfRGVjVkxDUmVhZFNpZ25lZEV4cEdvbG9tYkNvZGUoIENvbUJpdFN0cmVhbU1DU190ICpwX2JzICkKLXsKLSAgICBNNE9TQV9JbnQzMiBjb2RlTm8sIHJldDsKLQotICAgIC8qIHJlYWQgdGhlIHVuc2lnbmVkIGNvZGUgbnVtYmVyICovCi0gICAgY29kZU5vID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLQotICAgIC8qIG1hcCB0byB0aGUgc2lnbmVkIHZhbHVlLCBpZiB2YWx1ZSBpcyBvZGQgdGhlbiBpdCdzIHBvc2l0aXZlLAotICAgIGlmIGV2ZW4gdGhlbiBpdCdzIG5lZ2F0aXZlLCBmb3JtdWxhIGlzICgtMSleKGsrMSkqQ0VJTChrLzIpICovCi0KLSAgICByZXQgPSAoY29kZU5vICYgMHgwMSkgPyAoKCBjb2RlTm8gKyAxKSA+PiAxKSA6ICgoIC1jb2RlTm8pID4+IDEpOwotCi0gICAgcmV0dXJuIHJldDsKLX0KLQotTTRPU0FfVm9pZCBEZWNCaXRTdHJlYW1SZXNldF9NQ1MoIENvbUJpdFN0cmVhbU1DU190ICpwX2JzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGJ5dGVzX3JlYWQgKQotewotICAgIHBfYnMtPmJpdFBvcyA9IDA7Ci0KLSAgICBwX2JzLT5sYXN0VG90YWxCaXRzID0gMDsKLSAgICBwX2JzLT5udW1CaXRzSW5CdWZmZXIgPSBieXRlc19yZWFkIDw8IDM7Ci0gICAgcF9icy0+cmVhZGFibGVCeXRlc0luQnVmZmVyID0gYnl0ZXNfcmVhZDsKLSAgICAvL3BfYnMtPnN0YXRlID0gTTROT19FUlJPUjsvL19CU19PSzsKLSAgICAvL3BfYnMtPmZsYWdzID0gMDsKLQotICAgIHBfYnMtPnVpMzJUZW1wQnVmZiA9IDA7Ci0gICAgcF9icy0+aThCaXRDbnQgPSAwOwotICAgIHBfYnMtPnB1aThCZnJQdHIgPSAoTTRPU0FfSW50OCAqKXBfYnMtPkJ1ZmZlcjsKLSAgICBwX2JzLT51aTMyTGFzdFR3b0J5dGVzID0gMHhGRkZGRkZGRjsKLSAgICBIMjY0TUNTX2dldEJpdHMocF9icywgMCk7Ci19Ci0KLU00T1NBX0VSUiBOU1dBVkNNQ1NfaW5pdEJpdHN0cmVhbSggTlNXQVZDX2JpdFN0cmVhbV90X01DUyAqYlMgKQotewotICAgIGJTLT5iaXRQb3MgPSAwOwotICAgIGJTLT5ieXRlQ250ID0gMDsKLSAgICBiUy0+Y3VyckJ1ZmYgPSAwOwotICAgIGJTLT5wcmV2Qnl0ZSA9IDB4ZmY7Ci0gICAgYlMtPnByZXZQcmV2Qnl0ZSA9IDB4ZmY7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfRVJSIE5TV0FWQ01DU19wdXRCaXRzKCBOU1dBVkNfYml0U3RyZWFtX3RfTUNTICpiUywgTTRPU0FfVUludDMyIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IGxlbmd0aCApCi17Ci0gICAgTTRPU0FfVUludDMyIG1hc2tlZFZhbHVlID0gMCwgdGVtcCA9IDA7Ci0gICAgTTRPU0FfVUludDggYnl0ZU9uZTsKLQotICAgIE00T1NBX1VJbnQzMiBsZW4xID0gKGxlbmd0aCA9PSAzMikgPyAzMSA6IGxlbmd0aDsKLQotICAgIGlmKCAhKGxlbmd0aCkgKQotICAgIHsKLSAgICAgICAgLyogTGVuZ3RoID0gMCwgcmV0dXJuIE9LKi8KLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotCi0gICAgbWFza2VkVmFsdWUgPSAoTTRPU0FfVUludDMyKSh2YWx1ZSAmKCggMSA8PCBsZW4xKSAtIDEpKTsKLQotICAgIGlmKCAzMiA+IChsZW5ndGggKyBiUy0+Yml0UG9zKSApCi0gICAgewotICAgICAgICBiUy0+Yml0UG9zICs9IGxlbmd0aDsKLSAgICAgICAgYlMtPmN1cnJCdWZmIHw9IG1hc2tlZFZhbHVlIDw8ICgzMiAtIGJTLT5iaXRQb3MpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB0ZW1wID0gKCggYlMtPmJpdFBvcyArIGxlbmd0aCkgLSAzMik7Ci0KLSAgICAgICAgYlMtPmN1cnJCdWZmIHw9IChtYXNrZWRWYWx1ZSA+PiAodGVtcCkpOwotCi0gICAgICAgIGJ5dGVPbmUgPQotICAgICAgICAgICAgYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9IChNNE9TQV9VSW50OCkoYlMtPmN1cnJCdWZmID4+IDI0KTsKLQotICAgICAgICBpZiggKCggYlMtPnByZXZQcmV2Qnl0ZQotICAgICAgICAgICAgPT0gMCkgJiAoYlMtPnByZXZCeXRlID09IDApICYgKCEoYnl0ZU9uZSAmIDB4RkMpKSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBiUy0+Ynl0ZUNudCAtPSAxOwotICAgICAgICAgICAgYlMtPnByZXZQcmV2Qnl0ZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSAweDAzOwotICAgICAgICAgICAgYlMtPnByZXZCeXRlID0gYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9IGJ5dGVPbmU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBiUy0+cHJldlByZXZCeXRlID0gYlMtPnByZXZCeXRlOwotICAgICAgICAgICAgYlMtPnByZXZCeXRlID0gYnl0ZU9uZTsKLSAgICAgICAgfQotICAgICAgICBieXRlT25lID0gYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDgpKCggYlMtPmN1cnJCdWZmID4+IDE2KSAmIDB4ZmYpOwotCi0gICAgICAgIGlmKCAoKCBiUy0+cHJldlByZXZCeXRlCi0gICAgICAgICAgICA9PSAwKSAmIChiUy0+cHJldkJ5dGUgPT0gMCkgJiAoIShieXRlT25lICYgMHhGQykpKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJTLT5ieXRlQ250IC09IDE7Ci0gICAgICAgICAgICBiUy0+cHJldlByZXZCeXRlID0gYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9IDB4MDM7Ci0gICAgICAgICAgICBiUy0+cHJldkJ5dGUgPSBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0gYnl0ZU9uZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJTLT5wcmV2UHJldkJ5dGUgPSBiUy0+cHJldkJ5dGU7Ci0gICAgICAgICAgICBiUy0+cHJldkJ5dGUgPSBieXRlT25lOwotICAgICAgICB9Ci0gICAgICAgIGJ5dGVPbmUgPSBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0KLSAgICAgICAgICAgIChNNE9TQV9VSW50OCkoKCBiUy0+Y3VyckJ1ZmYgPj4gOCkgJiAweGZmKTsKLQotICAgICAgICBpZiggKCggYlMtPnByZXZQcmV2Qnl0ZQotICAgICAgICAgICAgPT0gMCkgJiAoYlMtPnByZXZCeXRlID09IDApICYgKCEoYnl0ZU9uZSAmIDB4RkMpKSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBiUy0+Ynl0ZUNudCAtPSAxOwotICAgICAgICAgICAgYlMtPnByZXZQcmV2Qnl0ZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSAweDAzOwotICAgICAgICAgICAgYlMtPnByZXZCeXRlID0gYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9IGJ5dGVPbmU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBiUy0+cHJldlByZXZCeXRlID0gYlMtPnByZXZCeXRlOwotICAgICAgICAgICAgYlMtPnByZXZCeXRlID0gYnl0ZU9uZTsKLSAgICAgICAgfQotICAgICAgICBieXRlT25lID0gYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDgpKChiUy0+Y3VyckJ1ZmYpICYweGZmKTsKLQotICAgICAgICBpZiggKCggYlMtPnByZXZQcmV2Qnl0ZQotICAgICAgICAgICAgPT0gMCkgJiAoYlMtPnByZXZCeXRlID09IDApICYgKCEoYnl0ZU9uZSAmIDB4RkMpKSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBiUy0+Ynl0ZUNudCAtPSAxOwotICAgICAgICAgICAgYlMtPnByZXZQcmV2Qnl0ZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSAweDAzOwotICAgICAgICAgICAgYlMtPnByZXZCeXRlID0gYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9IGJ5dGVPbmU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBiUy0+cHJldlByZXZCeXRlID0gYlMtPnByZXZCeXRlOwotICAgICAgICAgICAgYlMtPnByZXZCeXRlID0gYnl0ZU9uZTsKLSAgICAgICAgfQotCi0gICAgICAgIGJTLT5jdXJyQnVmZiA9IDA7Ci0KLSAgICAgICAgYlMtPmN1cnJCdWZmIHw9ICggbWFza2VkVmFsdWUgJigoIDEgPDwgdGVtcCkgLSAxKSkgPDwgKDMyIC0gdGVtcCk7Ci0KLSAgICAgICAgYlMtPmJpdFBvcyA9IHRlbXA7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBOU1dBVkNNQ1NfcHV0Qml0KCBOU1dBVkNfYml0U3RyZWFtX3RfTUNTICpiUywgTTRPU0FfVUludDMyIHZhbHVlICkKLXsKLSAgICBNNE9TQV9VSW50MzIgbWFza2VkVmFsdWUgPSAwLCB0ZW1wID0gMDsKLSAgICBNNE9TQV9VSW50OCBieXRlT25lOwotCi0gICAgbWFza2VkVmFsdWUgPSAodmFsdWUgPyAxIDogMCk7Ci0KLSAgICBpZiggMzIgPiAoMSArIGJTLT5iaXRQb3MpICkKLSAgICB7Ci0gICAgICAgIGJTLT5iaXRQb3MgKz0gMTsKLSAgICAgICAgYlMtPmN1cnJCdWZmIHw9IG1hc2tlZFZhbHVlIDw8ICgzMiAtIGJTLT5iaXRQb3MpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB0ZW1wID0gMDsKLQotICAgICAgICBiUy0+Y3VyckJ1ZmYgfD0gKG1hc2tlZFZhbHVlKTsKLQotICAgICAgICAvKiB3cml0aW5nIGl0IHRvIG1lbW9yeSovCi0gICAgICAgIGJ5dGVPbmUgPQotICAgICAgICAgICAgYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDgpKGJTLT5jdXJyQnVmZiA+PiAyNCk7Ci0KLSAgICAgICAgaWYoICgoIGJTLT5wcmV2UHJldkJ5dGUKLSAgICAgICAgICAgID09IDApICYgKGJTLT5wcmV2Qnl0ZSA9PSAwKSAmICghKGJ5dGVPbmUgJiAweEZDKSkpICkKLSAgICAgICAgewotICAgICAgICAgICAgYlMtPmJ5dGVDbnQgLT0gMTsKLSAgICAgICAgICAgIGJTLT5wcmV2UHJldkJ5dGUgPSBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0gMHgwMzsKLSAgICAgICAgICAgIGJTLT5wcmV2Qnl0ZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSBieXRlT25lOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYlMtPnByZXZQcmV2Qnl0ZSA9IGJTLT5wcmV2Qnl0ZTsKLSAgICAgICAgICAgIGJTLT5wcmV2Qnl0ZSA9IGJ5dGVPbmU7Ci0gICAgICAgIH0KLSAgICAgICAgYnl0ZU9uZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPQotICAgICAgICAgICAgKE00T1NBX1VJbnQ4KSgoIGJTLT5jdXJyQnVmZiA+PiAxNikgJiAweGZmKTsKLQotICAgICAgICBpZiggKCggYlMtPnByZXZQcmV2Qnl0ZQotICAgICAgICAgICAgPT0gMCkgJiAoYlMtPnByZXZCeXRlID09IDApICYgKCEoYnl0ZU9uZSAmIDB4RkMpKSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBiUy0+Ynl0ZUNudCAtPSAxOwotICAgICAgICAgICAgYlMtPnByZXZQcmV2Qnl0ZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSAweDAzOwotICAgICAgICAgICAgYlMtPnByZXZCeXRlID0gYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9IGJ5dGVPbmU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBiUy0+cHJldlByZXZCeXRlID0gYlMtPnByZXZCeXRlOwotICAgICAgICAgICAgYlMtPnByZXZCeXRlID0gYnl0ZU9uZTsKLSAgICAgICAgfQotICAgICAgICBieXRlT25lID0gYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDgpKCggYlMtPmN1cnJCdWZmID4+IDgpICYgMHhmZik7Ci0KLSAgICAgICAgaWYoICgoIGJTLT5wcmV2UHJldkJ5dGUKLSAgICAgICAgICAgID09IDApICYgKGJTLT5wcmV2Qnl0ZSA9PSAwKSAmICghKGJ5dGVPbmUgJiAweEZDKSkpICkKLSAgICAgICAgewotICAgICAgICAgICAgYlMtPmJ5dGVDbnQgLT0gMTsKLSAgICAgICAgICAgIGJTLT5wcmV2UHJldkJ5dGUgPSBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0gMHgwMzsKLSAgICAgICAgICAgIGJTLT5wcmV2Qnl0ZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSBieXRlT25lOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYlMtPnByZXZQcmV2Qnl0ZSA9IGJTLT5wcmV2Qnl0ZTsKLSAgICAgICAgICAgIGJTLT5wcmV2Qnl0ZSA9IGJ5dGVPbmU7Ci0gICAgICAgIH0KLSAgICAgICAgYnl0ZU9uZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPQotICAgICAgICAgICAgKE00T1NBX1VJbnQ4KSgoYlMtPmN1cnJCdWZmKSAmMHhmZik7Ci0KLSAgICAgICAgaWYoICgoIGJTLT5wcmV2UHJldkJ5dGUKLSAgICAgICAgICAgID09IDApICYgKGJTLT5wcmV2Qnl0ZSA9PSAwKSAmICghKGJ5dGVPbmUgJiAweEZDKSkpICkKLSAgICAgICAgewotICAgICAgICAgICAgYlMtPmJ5dGVDbnQgLT0gMTsKLSAgICAgICAgICAgIGJTLT5wcmV2UHJldkJ5dGUgPSBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0gMHgwMzsKLSAgICAgICAgICAgIGJTLT5wcmV2Qnl0ZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSBieXRlT25lOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYlMtPnByZXZQcmV2Qnl0ZSA9IGJTLT5wcmV2Qnl0ZTsKLSAgICAgICAgICAgIGJTLT5wcmV2Qnl0ZSA9IGJ5dGVPbmU7Ci0gICAgICAgIH0KLSAgICAgICAgYlMtPmN1cnJCdWZmID0gMDsKLSAgICAgICAgYlMtPmJpdFBvcyA9IDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0ludDMyIE5TV0FWQ01DU19wdXRSYnNwVGJpdHMoIE5TV0FWQ19iaXRTdHJlYW1fdF9NQ1MgKmJTICkKLXsKLSAgICBNNE9TQV9VSW50OCB0cmFpbEJpdHMgPSAwOwotICAgIE00T1NBX1VJbnQ4IGJ5dGVDbnQgPSAwOwotCi0gICAgdHJhaWxCaXRzID0gKE00T1NBX1VJbnQ4KShiUy0+Yml0UG9zICUgOCk7Ci0KLSAgICAvKiBBbHJlYWR5IGluIHRoZSBieXRlIGFsaWduZWQgcG9zaXRpb24sCi0gICAgUkJTUCB0cmFpbGluZyBiaXRzIHdpbGwgYmUgMTAwMCAwMDAwICovCi0gICAgaWYoIDAgPT0gdHJhaWxCaXRzICkKLSAgICB7Ci0gICAgICAgIHRyYWlsQml0cyA9ICgxIDw8IDcpOwotICAgICAgICBOU1dBVkNNQ1NfcHV0Qml0cyhiUywgdHJhaWxCaXRzLCA4KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdHJhaWxCaXRzID0gKDggLSB0cmFpbEJpdHMpOwotICAgICAgICBOU1dBVkNNQ1NfcHV0Qml0KGJTLCAxKTsKLSAgICAgICAgdHJhaWxCaXRzLS07Ci0KLSAgICAgICAgaWYoIHRyYWlsQml0cyApCi0gICAgICAgIHsgLyogcHV0IHRyYWlsQml0cyB0aW1lcyB6ZXJvcyAqLwotICAgICAgICAgICAgTlNXQVZDTUNTX3B1dEJpdHMoYlMsIDAsIHRyYWlsQml0cyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBGb3Igd3JpdHRpbmcgdGhlIGN1cnJCdWZmIGluIHN0cmVhbUJ1ZmYgNGJ5dGUgYWxpZ25tZW50IGlzIHJlcXVpcmVkKi8KLSAgICBieXRlQ250ID0gKE00T1NBX1VJbnQ4KSgoIGJTLT5iaXRQb3MgKyA0KSAvIDgpOwotCi0gICAgc3dpdGNoKCBieXRlQ250ICkKLSAgICB7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSAoTTRPU0FfVUludDgpKGJTLT5jdXJyQnVmZiA+PiAyNCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0gKE00T1NBX1VJbnQ4KShiUy0+Y3VyckJ1ZmYgPj4gMjQpOwotICAgICAgICAgICAgYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KSgoIGJTLT5jdXJyQnVmZiA+PiAxNikgJiAweGZmKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSAoTTRPU0FfVUludDgpKGJTLT5jdXJyQnVmZiA+PiAyNCk7Ci0gICAgICAgICAgICBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgpKCggYlMtPmN1cnJCdWZmID4+IDE2KSAmIDB4ZmYpOwotICAgICAgICAgICAgYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KSgoIGJTLT5jdXJyQnVmZiA+PiA4KSAmIDB4ZmYpOwotCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLyogSXQgd2lsbCBub3QgY29tZSBoZXJlICovCi0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvLyAgICBiUy0+Yml0UG9zID0wOwotICAgIC8vICAgIGJTLT5jdXJyQnVmZiA9IDA7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfRVJSIE5TV0FWQ01DU191RXhwVkxDKCBOU1dBVkNfYml0U3RyZWFtX3RfTUNTICpiUywgTTRPU0FfSW50MzIgY29kZU51bSApCi17Ci0KLSAgICBNNE9TQV9JbnQzMiBsb29wLCB0ZW1wOwotICAgIE00T1NBX0ludDMyIGRhdGEgPSAwOwotICAgIE00T1NBX1VJbnQ4IGNvZGVMZW4gPSAwOwotCi0gICAgLyogVGhlIGNvZGVOdW0gY2Fubm90IGJlIGxlc3MgdGhhbiB6ZXJvIGZvciB0aGlzIHVlKHYpICovCi0gICAgaWYoIGNvZGVOdW0gPCAwICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qIEltcGxlbWVudGF0aW9uIGZvciBFbmNvZGluZyBvZiB0aGUgVGFibGUgOS0xIGluIHRoZSBTdGFuZGFyZCAqLwotICAgIHRlbXAgPSBjb2RlTnVtICsgMTsKLQotICAgIGZvciAoIGxvb3AgPSAwOyB0ZW1wICE9IDA7IGxvb3ArKyApCi0gICAgewotICAgICAgICB0ZW1wIC89IDI7Ci0gICAgfQotCi0gICAgY29kZUxlbiA9ICgoIGxvb3AgKiAyKSAtIDEpOwotCi0gICAgZGF0YSA9IGNvZGVOdW0gKyAxOwotCi0gICAgTlNXQVZDTUNTX3B1dEJpdHMoYlMsIGRhdGEsIGNvZGVMZW4pOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBOU1dBVkNNQ1Nfc0V4cFZMQyggTlNXQVZDX2JpdFN0cmVhbV90X01DUyAqYlMsIE00T1NBX0ludDMyIGNvZGVOdW0gKQotewotCi0gICAgTTRPU0FfSW50MzIgbG9vcCwgdGVtcDEsIHRlbXAyOwotICAgIE00T1NBX0ludDMyIGRhdGEgPSAwOwotICAgIE00T1NBX1VJbnQ4IGNvZGVMZW4gPSAwLCBpc1Bvc2l0aXZlID0gMDsKLSAgICBNNE9TQV9VSW50MzIgYWJzY29kZU51bTsKLQotICAgIGlmKCBjb2RlTnVtID4gMCApCi0gICAgewotICAgICAgICBpc1Bvc2l0aXZlID0gMTsKLSAgICB9Ci0KLSAgICBpZiggY29kZU51bSA+IDAgKQotICAgIHsKLSAgICAgICAgYWJzY29kZU51bSA9IGNvZGVOdW07Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGFic2NvZGVOdW0gPSAtY29kZU51bTsKLSAgICB9Ci0KLSAgICB0ZW1wMSA9ICggKCAoIGFic2NvZGVOdW0pIDw8IDEpIC0gaXNQb3NpdGl2ZSkgKyAxOwotICAgIHRlbXAyID0gdGVtcDE7Ci0KLSAgICBmb3IgKCBsb29wID0gMDsgbG9vcCA8IDE2ICYmIHRlbXAyICE9IDA7IGxvb3ArKyApCi0gICAgewotICAgICAgICB0ZW1wMiAvPSAyOwotICAgIH0KLQotICAgIGNvZGVMZW4gPSAoIGxvb3AgKiAyKSAtIDE7Ci0KLSAgICBkYXRhID0gdGVtcDE7Ci0KLSAgICBOU1dBVkNNQ1NfcHV0Qml0cyhiUywgZGF0YSwgY29kZUxlbik7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfRVJSIEgyNjRNQ1NfUHJvY2Vzc0VuY29kZWROQUxVKCAgIE00T1NBX1ZvaWQgKmFpbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCAqaW5idWZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIGluYnVmX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggKm91dGJ1ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgKm91dGJ1Zl9zaXplICkKLXsKLSAgICBDb21CaXRTdHJlYW1NQ1NfdCAqcF9icywgYnM7Ci0gICAgTlNXQVZDX01DU190ICppbnN0YW5jZTsKLSAgICBNNE9TQV9VSW50OCBuYWx1X2luZm87Ci0gICAgTTRPU0FfSW50MzIgZm9yYmlkZGVuX2JpdCwgbmFsX3JlZl9pZGMsIG5hbF91bml0X3R5cGU7Ci0gICAgTTRPU0FfSW50MzIgZmlyc3RfbWJfaW5fc2xpY2UsIHNsaWNlX3R5cGUsIHBpY19wYXJhbWV0ZXJfc2V0X2lkLCBmcmFtZV9udW07Ci0gICAgTTRPU0FfSW50MzIgc2VxX3BhcmFtZXRlcl9zZXRfaWQ7Ci0gICAgTTRPU0FfVUludDggdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQ7Ci0gICAgTTRPU0FfSW50MzIgdGVtcF9mcmFtZV9udW07Ci0gICAgTTRPU0FfSW50MzIgYml0c3RvRGlhY2FyZCwgYnl0ZXM7Ci0gICAgTTRPU0FfVUludDMyIG1hc2tfYml0cyA9IDB4RkZGRkZGRkY7Ci0gICAgTTRPU0FfSW50MzIgbmV3X2J5dGVzLCBpbml0X2JpdF9wb3M7Ci0gICAgTTRPU0FfVUludDMyIG5hbF9zaXplOwotICAgIE00T1NBX1VJbnQzMiBjbnQ7Ci0gICAgTTRPU0FfVUludDMyIG91dGJ1ZmZwb3MgPSAwOwotICAgIE00T1NBX1VJbnQzMiBuYWxfc2l6ZV9sb3cxNiwgbmFsX3NpemVfaGlnaDE2OwotICAgIE00T1NBX1VJbnQzMiBmcmFtZV9zaXplID0gMDsKLSAgICBNNE9TQV9VSW50MzIgdGVtcCA9IDA7Ci0KLSAgICAvLyBTdGFnZUZyaWdodCBlbmNvZGVyIGRvZXMgbm90IHByb3ZpZGUgdGhlIHNpemUgaW4gdGhlIGZpcnN0IDQgYnl0ZXMgb2YgdGhlIEFVLCBhZGQgaXQKLSAgICBNNE9TQV9JbnQ4ICpwVG1wQnVmZjEgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX0ludDggKnBUbXBCdWZmMiA9IE00T1NBX05VTEw7Ci0KLSAgICBwX2JzID0gJmJzOwotICAgIGluc3RhbmNlID0gKE5TV0FWQ19NQ1NfdCAqKWFpbnN0YW5jZTsKLQotICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAiSW4gIEgyNjRNQ1NfUHJvY2Vzc0VuY29kZWROQUxVIHdpdGggRnJhbWVTaXplID0gJWQgIGluQnVmX1NpemU9JWQiLAotICAgICAgICBmcmFtZV9zaXplLCBpbmJ1Zl9zaXplKTsKLQotICAgIC8vIFN0YWdlRnJpZ2h0IGNvZGVjcyBtYXkgYWRkIGEgc3RhcnQgY29kZSwgbWFrZSBzdXJlIGl0IGlzIG5vdCBwcmVzZW50Ci0KLSAgICBpZiggIW1lbWNtcCgodm9pZCAqKWluYnVmZiwKLSAgICAgICAgIlx4MDBceDAwXHgwMFx4MDEiLCA0KSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMygKLSAgICAgICAgICAgICJIMjY0TUNTX1Byb2Nlc3NOQUxVIEVSUk9SIDogTkFMVSBzdGFydCBjb2RlIGhhcyBub3QgYmVlbiByZW1vdmVkICVkICIKLSAgICAgICAgICAgICIweCVYIDB4JVgiLCBpbmJ1Zl9zaXplLCAoKE00T1NBX1VJbnQzMiAqKWluYnVmZilbMF0sCi0gICAgICAgICAgICAoKE00T1NBX1VJbnQzMiAqKWluYnVmZilbMV0pOwotCi0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLy8gU3RhZ2VGcmlnaHQgZW5jb2RlciBkb2VzIG5vdCBwcm92aWRlIHRoZSBzaXplIGluIHRoZSBmaXJzdCA0IGJ5dGVzIG9mIHRoZSBBVSwgYWRkIGl0Ci0gICAgcFRtcEJ1ZmYxID0gKE00T1NBX0ludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoaW5idWZfc2l6ZSArIDQsIE00TUNTLAotICAgICAgICAoTTRPU0FfQ2hhciAqKSJ0bXBOQUxVIik7Ci0gICAgbWVtY3B5KCh2b2lkICopKHBUbXBCdWZmMSArIDQpLCAodm9pZCAqKWluYnVmZiwKLSAgICAgICAgaW5idWZfc2l6ZSk7Ci0gICAgcFRtcEJ1ZmYxWzNdID0gKCAoTTRPU0FfVUludDMyKWluYnVmX3NpemUpICYgMHgwMDAwMDBGRjsKLSAgICBwVG1wQnVmZjFbMl0gPSAoIChNNE9TQV9VSW50MzIpaW5idWZfc2l6ZSA+PiA4KSAmIDB4MDAwMDAwRkY7Ci0gICAgcFRtcEJ1ZmYxWzFdID0gKCAoTTRPU0FfVUludDMyKWluYnVmX3NpemUgPj4gMTYpICYgMHgwMDAwMDBGRjsKLSAgICBwVG1wQnVmZjFbMF0gPSAoIChNNE9TQV9VSW50MzIpaW5idWZfc2l6ZSA+PiAyNCkgJiAweDAwMDAwMEZGOwotICAgIHBUbXBCdWZmMiA9IChNNE9TQV9JbnQ4ICopaW5idWZmOwotICAgIGluYnVmZiA9IChNNE9TQV9VSW50OCAqKXBUbXBCdWZmMTsKLSAgICBpbmJ1Zl9zaXplICs9IDQ7Ci0KLSAgICAvLyBNYWtlIHN1cmUgdGhlIGF2YWlsYWJsZSBzaXplIHdhcyBzZXQKLSAgICBpZiggaW5idWZfc2l6ZSA+PSAqb3V0YnVmX3NpemUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiISEhIEgyNjRNQ1NfUHJvY2Vzc05BTFUgRVJST1IgOiBzcGVjaWZpZWQgYXZhaWxhYmxlIHNpemUgaXMgaW5jb3JyZWN0ICVkICIsCi0gICAgICAgICAgICAqb3V0YnVmX3NpemUpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotCi0KLSAgICB3aGlsZSggKE00T1NBX0ludDMyKWZyYW1lX3NpemUgPCBpbmJ1Zl9zaXplICkKLSAgICB7Ci0gICAgICAgIG1hc2tfYml0cyA9IDB4RkZGRkZGRkY7Ci0gICAgICAgIHBfYnMtPkJ1ZmZlciA9IChNNE9TQV9VSW50OCAqKShpbmJ1ZmYgKyBmcmFtZV9zaXplKTsKLQotICAgICAgICAvLyBVc2UgdW5zaWduZWQgdmFsdWUgdG8gZml4IGVycm9ycyBkdWUgdG8gYml0IHNpZ24gZXh0ZW5zaW9uLCB0aGlzIGZpeCBzaG91bGQgYmUgZ2VuZXJpYwotCi0gICAgICAgIG5hbF9zaXplX2hpZ2gxNiA9ICggKCAoTTRPU0FfVUludDggKilwX2JzLT5CdWZmZXIpWzBdIDw8IDgpCi0gICAgICAgICAgICArICgoTTRPU0FfVUludDggKilwX2JzLT5CdWZmZXIpWzFdOwotICAgICAgICBuYWxfc2l6ZV9sb3cxNiA9ICggKCAoTTRPU0FfVUludDggKilwX2JzLT5CdWZmZXIpWzJdIDw8IDgpCi0gICAgICAgICAgICArICgoTTRPU0FfVUludDggKilwX2JzLT5CdWZmZXIpWzNdOwotCi0gICAgICAgIG5hbHVfaW5mbyA9ICh1bnNpZ25lZCBjaGFyKXBfYnMtPkJ1ZmZlcls0XTsKLQotICAgICAgICBvdXRidWZmW291dGJ1ZmZwb3NdID0gcF9icy0+QnVmZmVyWzRdOwotCi0gICAgICAgIHBfYnMtPkJ1ZmZlciA9IHBfYnMtPkJ1ZmZlciArIDU7Ci0KLSAgICAgICAgcF9icy0+Yml0UG9zID0gMDsKLSAgICAgICAgcF9icy0+bGFzdFRvdGFsQml0cyA9IDA7Ci0gICAgICAgIHBfYnMtPm51bUJpdHNJbkJ1ZmZlciA9ICggaW5idWZfc2l6ZSAtIGZyYW1lX3NpemUgLSA1KSA8PCAzOwotICAgICAgICBwX2JzLT5yZWFkYWJsZUJ5dGVzSW5CdWZmZXIgPSBpbmJ1Zl9zaXplIC0gZnJhbWVfc2l6ZSAtIDU7Ci0KLSAgICAgICAgcF9icy0+dWkzMlRlbXBCdWZmID0gMDsKLSAgICAgICAgcF9icy0+aThCaXRDbnQgPSAwOwotICAgICAgICBwX2JzLT5wdWk4QmZyUHRyID0gKE00T1NBX0ludDggKilwX2JzLT5CdWZmZXI7Ci0gICAgICAgIHBfYnMtPnVpMzJMYXN0VHdvQnl0ZXMgPSAweEZGRkZGRkZGOwotCi0gICAgICAgIEgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAwKTsKLQotICAgICAgICBuYWxfc2l6ZSA9ICggbmFsX3NpemVfaGlnaDE2IDw8IDE2KSArIG5hbF9zaXplX2xvdzE2OwotCi0gICAgICAgIGZyYW1lX3NpemUgKz0gbmFsX3NpemUgKyA0OwotCi0gICAgICAgIGZvcmJpZGRlbl9iaXQgPSAoIG5hbHVfaW5mbyA+PiA3KSAmIDE7Ci0gICAgICAgIG5hbF9yZWZfaWRjID0gKCBuYWx1X2luZm8gPj4gNSkgJiAzOwotICAgICAgICBuYWxfdW5pdF90eXBlID0gKG5hbHVfaW5mbykgJjB4MWY7Ci0KLSAgICAgICAgTlNXQVZDTUNTX2luaXRCaXRzdHJlYW0oJmluc3RhbmNlLT5lbmNicyk7Ci0KLSAgICAgICAgaW5zdGFuY2UtPmVuY2JzLnN0cmVhbUJ1ZmZlciA9IG91dGJ1ZmYgKyBvdXRidWZmcG9zICsgMTsKLQotICAgICAgICBpZiggbmFsX3VuaXRfdHlwZSA9PSA4ICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkVycm9yIDogUFBTIik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBuYWxfdW5pdF90eXBlID09IDcgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKlNQUyBQYWNrZXQgKi8KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJFcnJvciA6IFNQUyIpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggKG5hbF91bml0X3R5cGUgPT0gNSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnN0YW5jZS0+ZnJhbWVfY291bnQgPSAwOwotICAgICAgICAgICAgaW5zdGFuY2UtPlBPQ19sc2IgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoICggbmFsX3VuaXRfdHlwZSA9PSAxKSB8fCAobmFsX3VuaXRfdHlwZSA9PSA1KSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpcnN0X21iX2luX3NsaWNlID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgICAgIHNsaWNlX3R5cGUgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICAgICAgcGljX3BhcmFtZXRlcl9zZXRfaWQgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotCi0gICAgICAgICAgICAvKiBGaXJzdCBNQiBpbiBzbGljZSAqLwotICAgICAgICAgICAgTlNXQVZDTUNTX3VFeHBWTEMoJmluc3RhbmNlLT5lbmNicywgZmlyc3RfbWJfaW5fc2xpY2UpOwotCi0gICAgICAgICAgICAvKiBTbGljZSBUeXBlICovCi0gICAgICAgICAgICBOU1dBVkNNQ1NfdUV4cFZMQygmaW5zdGFuY2UtPmVuY2JzLCBzbGljZV90eXBlKTsKLQotICAgICAgICAgICAgLyogUGljdHVyZSBQYXJhbWV0ZXIgc2V0IElkICovCi0gICAgICAgICAgICBwaWNfcGFyYW1ldGVyX3NldF9pZCA9IGluc3RhbmNlLT5lbmNvZGVyX3Bwcy5waWNfcGFyYW1ldGVyX3NldF9pZDsKLSAgICAgICAgICAgIE5TV0FWQ01DU191RXhwVkxDKCZpbnN0YW5jZS0+ZW5jYnMsIHBpY19wYXJhbWV0ZXJfc2V0X2lkKTsKLQotICAgICAgICAgICAgdGVtcCA9IEgyNjRNQ1NfZ2V0Qml0cyhwX2JzLAotICAgICAgICAgICAgICAgIGluc3RhbmNlLT5lbmNvZGVyX3Nwcy5sb2cyX21heF9mcmFtZV9udW1fbWludXM0ICsgNCk7Ci0gICAgICAgICAgICBOU1dBVkNNQ1NfcHV0Qml0cygmaW5zdGFuY2UtPmVuY2JzLCBpbnN0YW5jZS0+ZnJhbWVfY291bnQsCi0gICAgICAgICAgICAgICAgaW5zdGFuY2UtPmNsaXBfc3BzLmxvZzJfbWF4X2ZyYW1lX251bV9taW51czQgKyA0KTsKLQotICAgICAgICAgICAgLy8gSW4gQmFzZWxpbmUgUHJvZmlsZTogZnJhbWVfbWJzX29ubHlfZmxhZyBzaG91bGQgYmUgT04KLSAgICAgICAgICAgIGlmKCBuYWxfdW5pdF90eXBlID09IDUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICAgICAgICAgIE5TV0FWQ01DU191RXhwVkxDKCZpbnN0YW5jZS0+ZW5jYnMsIHRlbXApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggaW5zdGFuY2UtPmVuY29kZXJfc3BzLnBpY19vcmRlcl9jbnRfdHlwZSA9PSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0ZW1wID0gSDI2NE1DU19nZXRCaXRzKHBfYnMsCi0gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLT5lbmNvZGVyX3Nwcy5sb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQKLSAgICAgICAgICAgICAgICAgICAgKyA0KTsKLQotICAgICAgICAgICAgICAgIC8vIGluIGJhc2VsaW5lIHByb2ZpbGUgZmllbGRfcGljX2ZsYWcgc2hvdWxkIGJlIG9mZi4KLSAgICAgICAgICAgICAgICBpZiggaW5zdGFuY2UtPmVuY29kZXJfcHBzLnBpY19vcmRlcl9wcmVzZW50X2ZsYWcgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGVtcCA9IEgyNjRNQ1NfRGVjVkxDUmVhZFNpZ25lZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggKCBpbnN0YW5jZS0+ZW5jb2Rlcl9zcHMucGljX29yZGVyX2NudF90eXBlID09IDEpCi0gICAgICAgICAgICAgICAgJiYgKGluc3RhbmNlLT5lbmNvZGVyX3Nwcy5kZWx0YV9waWNfb3JkZXJfYWx3YXlzX3plcm9fZmxhZykgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRTaWduZWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotCi0gICAgICAgICAgICAgICAgLy8gaW4gYmFzZWxpbmUgcHJvZmlsZSBmaWVsZF9waWNfZmxhZyBzaG91bGQgYmUgb2ZmLgotICAgICAgICAgICAgICAgIGlmKCBpbnN0YW5jZS0+ZW5jb2Rlcl9wcHMucGljX29yZGVyX3ByZXNlbnRfZmxhZyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0ZW1wID0gSDI2NE1DU19EZWNWTENSZWFkU2lnbmVkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBpbnN0YW5jZS0+Y2xpcF9zcHMucGljX29yZGVyX2NudF90eXBlID09IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE5TV0FWQ01DU19wdXRCaXRzKCZpbnN0YW5jZS0+ZW5jYnMsIGluc3RhbmNlLT5QT0NfbHNiLAotICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS0+Y2xpcF9zcHMubG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ICsgNCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBpbiBiYXNlbGluZSBwcm9maWxlIGZpZWxkX3BpY19mbGFnIHNob3VsZCBiZSBvZmYuCi0gICAgICAgICAgICAgICAgaWYoIGluc3RhbmNlLT5lbmNvZGVyX3Bwcy5waWNfb3JkZXJfcHJlc2VudF9mbGFnICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE5TV0FWQ01DU19zRXhwVkxDKCZpbnN0YW5jZS0+ZW5jYnMsIDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoICggaW5zdGFuY2UtPmNsaXBfc3BzLnBpY19vcmRlcl9jbnRfdHlwZSA9PSAxKQotICAgICAgICAgICAgICAgICYmIChpbnN0YW5jZS0+Y2xpcF9zcHMuZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWcpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBOU1dBVkNNQ1Nfc0V4cFZMQygmaW5zdGFuY2UtPmVuY2JzLCAwKTsKLQotICAgICAgICAgICAgICAgIC8vIGluIGJhc2VsaW5lIHByb2ZpbGUgZmllbGRfcGljX2ZsYWcgc2hvdWxkIGJlIG9mZi4KLSAgICAgICAgICAgICAgICBpZiggaW5zdGFuY2UtPmVuY29kZXJfcHBzLnBpY19vcmRlcl9wcmVzZW50X2ZsYWcgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTlNXQVZDTUNTX3NFeHBWTEMoJmluc3RhbmNlLT5lbmNicywgMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjbnQgPSBwX2JzLT5iaXRQb3MgJiAweDc7Ci0KLSAgICAgICAgICAgIGlmKCBjbnQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNudCA9IDggLSBjbnQ7Ci0gICAgICAgICAgICAgICAgdGVtcCA9IEgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCBjbnQpOwotICAgICAgICAgICAgICAgIE5TV0FWQ01DU19wdXRCaXRzKCZpbnN0YW5jZS0+ZW5jYnMsIHRlbXAsIGNudCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNudCA9IHBfYnMtPmJpdFBvcyA+PiAzOwotCi0gICAgICAgICAgICB3aGlsZSggY250IDwgKG5hbF9zaXplIC0gMikgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX2dldEJpdHMocF9icywgOCk7Ci0gICAgICAgICAgICAgICAgTlNXQVZDTUNTX3B1dEJpdHMoJmluc3RhbmNlLT5lbmNicywgdGVtcCwgOCk7Ci0gICAgICAgICAgICAgICAgY250ID0gcF9icy0+Yml0UG9zID4+IDM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX2dldEJpdHMocF9icywgOCk7Ci0KLSAgICAgICAgICAgIGlmKCB0ZW1wICE9IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNudCA9IDA7Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSggKCB0ZW1wICYgMHgxKSA9PSAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNudCsrOwotICAgICAgICAgICAgICAgICAgICB0ZW1wID0gdGVtcCA+PiAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjbnQrKzsKLSAgICAgICAgICAgICAgICB0ZW1wID0gdGVtcCA+PiAxOwotCi0gICAgICAgICAgICAgICAgaWYoIDggLSBjbnQgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTlNXQVZDTUNTX3B1dEJpdHMoJmluc3RhbmNlLT5lbmNicywgdGVtcCwgKDggLSBjbnQpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBOU1dBVkNNQ1NfcHV0UmJzcFRiaXRzKCZpbnN0YW5jZS0+ZW5jYnMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJIMjY0TUNTX1Byb2Nlc3NFbmNvZGVkTkFMVSA6IDEzIHRlbXAgPSAwIHRyYWlsaW5nIGJpdHMgPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLT5lbmNicy5iaXRQb3MgJSA4KTsKLQotICAgICAgICAgICAgICAgIGlmKCBpbnN0YW5jZS0+ZW5jYnMuYml0UG9zICUgOCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBOU1dBVkNNQ1NfcHV0Qml0cygmaW5zdGFuY2UtPmVuY2JzLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgKDggLSBpbnN0YW5jZS0+ZW5jYnMuYml0UG9zICUgOCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGVtcCA9IGluc3RhbmNlLT5lbmNicy5ieXRlQ250OwotICAgICAgICAgICAgdGVtcCA9IHRlbXAgKyAxOwotCi0gICAgICAgICAgICBvdXRidWZmcG9zID0gb3V0YnVmZnBvcyArIHRlbXA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAqb3V0YnVmX3NpemUgPSBvdXRidWZmcG9zOwotCi0gICAgaW5zdGFuY2UtPlBPQ19sc2IgPSBpbnN0YW5jZS0+UE9DX2xzYiArIDE7Ci0KLSAgICBpZiggaW5zdGFuY2UtPlBPQ19sc2IgPT0gaW5zdGFuY2UtPlBPQ19sc2JfbW9kICkKLSAgICB7Ci0gICAgICAgIGluc3RhbmNlLT5QT0NfbHNiID0gMDsKLSAgICB9Ci0gICAgaW5zdGFuY2UtPmZyYW1lX2NvdW50ID0gaW5zdGFuY2UtPmZyYW1lX2NvdW50ICsgMTsKLQotICAgIGlmKCBpbnN0YW5jZS0+ZnJhbWVfY291bnQgPT0gaW5zdGFuY2UtPmZyYW1lX21vZF9jb3VudCApCi0gICAgewotICAgICAgICBpbnN0YW5jZS0+ZnJhbWVfY291bnQgPSAwOwotICAgIH0KLQotICAgIC8vIFN0YWdlRnJpZ2h0IGVuY29kZXIgZG9lcyBub3QgcHJvdmlkZSB0aGUgc2l6ZSBpbiB0aGUgZmlyc3QgNCBieXRlcyBvZiB0aGUgQVUsIGFkZCBpdAotCi0gICAgZnJlZShwVG1wQnVmZjEpOwotICAgIHBUbXBCdWZmMSA9IE00T1NBX05VTEw7Ci0gICAgaW5idWZmID0gKE00T1NBX1VJbnQ4ICopcFRtcEJ1ZmYyOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0ludDMyIERlY1NQU01DUyggQ29tQml0U3RyZWFtTUNTX3QgKnBfYnMsCi0gICAgICAgICAgICAgICAgICAgICAgQ29tU2VxdWVuY2VQYXJhbWV0ZXJTZXRfdF9NQ1MgKnNwcyApCi17Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0gICAgTTRPU0FfSW50MzIgdGVtcF9tYXhfZHBiX3NpemU7Ci0gICAgTTRPU0FfSW50MzIgbmJfaWdub3JlX2JpdHM7Ci0gICAgTTRPU0FfSW50MzIgZXJyb3I7Ci0gICAgTTRPU0FfVUludDggcHJvZmlsZV9pZGMsIGxldmVsX2lkYywgcmVzZXJ2ZWRfemVyb180Yml0cywKLSAgICAgICAgc2VxX3BhcmFtZXRlcl9zZXRfaWQ7Ci0gICAgTTRPU0FfVUludDggY29uc3RyYWludF9zZXQwX2ZsYWcsIGNvbnN0cmFpbnRfc2V0MV9mbGFnLAotICAgICAgICBjb25zdHJhaW50X3NldDJfZmxhZywgY29uc3RyYWludF9zZXQzX2ZsYWc7Ci0KLSAgICBzcHMtPnByb2ZpbGVfaWRjID0gKE00T1NBX1VJbnQ4KUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCA4KTsKLSAgICBzcHMtPmNvbnN0cmFpbnRfc2V0MF9mbGFnID0gKE00T1NBX0Jvb2wpSDI2NE1DU19nZXRCaXRzKHBfYnMsIDEpOwotICAgIHNwcy0+Y29uc3RyYWludF9zZXQxX2ZsYWcgPSAoTTRPU0FfQm9vbClIMjY0TUNTX2dldEJpdHMocF9icywgMSk7Ci0gICAgc3BzLT5jb25zdHJhaW50X3NldDJfZmxhZyA9IChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLSAgICBzcHMtPmNvbnN0cmFpbnRfc2V0M19mbGFnID0gKE00T1NBX0Jvb2wpSDI2NE1DU19nZXRCaXRzKHBfYnMsIDEpOwotICAgIHJlc2VydmVkX3plcm9fNGJpdHMgPSAoTTRPU0FfVUludDgpSDI2NE1DU19nZXRCaXRzKHBfYnMsIDQpOwotICAgIHNwcy0+bGV2ZWxfaWRjID0gKE00T1NBX1VJbnQ4KUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCA4KTsKLSAgICBzcHMtPnNlcV9wYXJhbWV0ZXJfc2V0X2lkID0KLSAgICAgICAgKE00T1NBX1VJbnQ4KUgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgc3BzLT5sb2cyX21heF9mcmFtZV9udW1fbWludXM0ID0KLSAgICAgICAgKE00T1NBX1VJbnQ4KUgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgc3BzLT5NYXhGcmFtZU51bSA9IDEgPDwgKHNwcy0+bG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCArIDQpOwotICAgIHNwcy0+cGljX29yZGVyX2NudF90eXBlID0KLSAgICAgICAgKE00T1NBX1VJbnQ4KUgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0KLSAgICBpZiAoc3BzLT5waWNfb3JkZXJfY250X3R5cGUgPT0gMCkKLSAgICB7Ci0gICAgICAgIHNwcy0+bG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ID0KLSAgICAgICAgICAgIChNNE9TQV9VSW50OClIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICBzcHMtPk1heFBpY09yZGVyQ250THNiID0KLSAgICAgICAgICAgIDEgPDwgKHNwcy0+bG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ICsgNCk7Ci0gICAgfQotICAgIGVsc2UgaWYoIHNwcy0+cGljX29yZGVyX2NudF90eXBlID09IDEgKQotICAgIHsKLSAgICAgICAgc3BzLT5kZWx0YV9waWNfb3JkZXJfYWx3YXlzX3plcm9fZmxhZyA9Ci0gICAgICAgICAgICAoTTRPU0FfQm9vbClIMjY0TUNTX2dldEJpdHMocF9icywgMSk7Ci0KLSAgICAgICAgLy8gVGhpcyBmaXggc2hvdWxkIGJlIGdlbmVyaWMgdG8gcmVtb3ZlIGNvZGVjIGRlcGVuZGVuY3kKLQotICAgICAgICBzcHMtPm9mZnNldF9mb3Jfbm9uX3JlZl9waWMgPQotICAgICAgICAgICAgSDI2NE1DU19EZWNWTENSZWFkU2lnbmVkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgc3BzLT5vZmZzZXRfZm9yX3RvcF90b19ib3R0b21fZmllbGQgPQotICAgICAgICAgICAgSDI2NE1DU19EZWNWTENSZWFkU2lnbmVkRXhwR29sb21iQ29kZShwX2JzKTsKLQotCi0gICAgICAgIC8qbnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZSBtdXN0IGJlIGluIHRoZSByYW5nZSAwLCAyNTUqLwotCi0gICAgICAgIHNwcy0+bnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDgpSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLQotICAgICAgICAvKiBjb21wdXRlIGRlbHRhUE9DICovCi0gICAgICAgIHNwcy0+ZXhwZWN0ZWREZWx0YVBlclBpY09yZGVyQ250Q3ljbGUgPSAwOwotCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgc3BzLT5udW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUaGlzIGZpeCBzaG91bGQgYmUgZ2VuZXJpYyB0byByZW1vdmUgY29kZWMgZGVwZW5kZW5jeQotICAgICAgICAgICAgc3BzLT5vZmZzZXRfZm9yX3JlZl9mcmFtZVtpXSA9Ci0gICAgICAgICAgICAgICAgSDI2NE1DU19EZWNWTENSZWFkU2lnbmVkRXhwR29sb21iQ29kZShwX2JzKTsKLQotICAgICAgICAgICAgc3BzLT5leHBlY3RlZERlbHRhUGVyUGljT3JkZXJDbnRDeWNsZSArPQotICAgICAgICAgICAgICAgIHNwcy0+b2Zmc2V0X2Zvcl9yZWZfZnJhbWVbaV07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBudW1fcmVmX2ZyYW1lcyBtdXN0IGJlIGluIHRoZSByYW5nZSAwLDE2ICovCi0gICAgc3BzLT5udW1fcmVmX2ZyYW1lcyA9IChNNE9TQV9VSW50OClIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgIHNwcy0+Z2Fwc19pbl9mcmFtZV9udW1fdmFsdWVfYWxsb3dlZF9mbGFnID0KLSAgICAgICAgKE00T1NBX0Jvb2wpSDI2NE1DU19nZXRCaXRzKHBfYnMsIDEpOwotCi0gICAgc3BzLT5waWNfd2lkdGhfaW5fbWJzX21pbnVzMSA9Ci0gICAgICAgIChNNE9TQV9VSW50MTYpSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICBzcHMtPnBpY19oZWlnaHRfaW5fbWFwX3VuaXRzX21pbnVzMSA9Ci0gICAgICAgIChNNE9TQV9VSW50MTYpSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLQotICAgIHNwcy0+ZnJhbWVfbWJzX29ubHlfZmxhZyA9IChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLQotICAgIGlmICghc3BzLT5mcmFtZV9tYnNfb25seV9mbGFnKQotICAgIHsKLSAgICAgICAgc3BzLT5tYl9hZGFwdGl2ZV9mcmFtZV9maWVsZF9mbGFnID0KLSAgICAgICAgICAgIChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgc3BzLT5tYl9hZGFwdGl2ZV9mcmFtZV9maWVsZF9mbGFnID0gMDsKLSAgICB9Ci0KLSAgICBzcHMtPlBpY1dpZHRoSW5NYnMgPSBzcHMtPnBpY193aWR0aF9pbl9tYnNfbWludXMxICsgMTsKLSAgICBzcHMtPkZyYW1lSGVpZ2h0SW5NYnMgPSAoIDIgLSBzcHMtPmZyYW1lX21ic19vbmx5X2ZsYWcpICogXAotICAgICAgICAoc3BzLT5waWNfaGVpZ2h0X2luX21hcF91bml0c19taW51czEgKyAxKTsKLSNpZmRlZiBfQ0FQX0ZNT18KLQotICAgIHNwcy0+TnVtU2xpY2VHcm91cE1hcFVuaXRzID0KLSAgICAgICAgc3BzLT5QaWNXaWR0aEluTWJzICogKHNwcy0+cGljX2hlaWdodF9pbl9tYXBfdW5pdHNfbWludXMxICsgMSk7Ci0gICAgc3BzLT5NYXhQaWNTaXplSW5NYnMgPSBzcHMtPlBpY1dpZHRoSW5NYnMgKiBzcHMtPkZyYW1lSGVpZ2h0SW5NYnM7Ci0KLSNlbmRpZiAvKl9DQVBfRk1PXyovCi0KLSAgICBzcHMtPmRpcmVjdF84eDhfaW5mZXJlbmNlX2ZsYWcgPSAoTTRPU0FfQm9vbClIMjY0TUNTX2dldEJpdHMocF9icywgMSk7Ci0KLSAgICBpZiggc3BzLT5mcmFtZV9tYnNfb25seV9mbGFnID09IDAgKQotICAgICAgICBzcHMtPmRpcmVjdF84eDhfaW5mZXJlbmNlX2ZsYWcgPSAxOwotCi0gICAgc3BzLT5mcmFtZV9jcm9wcGluZ19mbGFnID0gKE00T1NBX0Jvb2wpSDI2NE1DU19nZXRCaXRzKHBfYnMsIDEpOwotCi0gICAgaWYoIHNwcy0+ZnJhbWVfY3JvcHBpbmdfZmxhZyApCi0gICAgewotICAgICAgICBzcHMtPmZyYW1lX2Nyb3BfbGVmdF9vZmZzZXQgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICBzcHMtPmZyYW1lX2Nyb3BfcmlnaHRfb2Zmc2V0ID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgc3BzLT5mcmFtZV9jcm9wX3RvcF9vZmZzZXQgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICBzcHMtPmZyYW1lX2Nyb3BfYm90dG9tX29mZnNldCA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHNwcy0+ZnJhbWVfY3JvcF9sZWZ0X29mZnNldCA9IDA7Ci0gICAgICAgIHNwcy0+ZnJhbWVfY3JvcF9yaWdodF9vZmZzZXQgPSAwOwotICAgICAgICBzcHMtPmZyYW1lX2Nyb3BfdG9wX29mZnNldCA9IDA7Ci0gICAgICAgIHNwcy0+ZnJhbWVfY3JvcF9ib3R0b21fb2Zmc2V0ID0gMDsKLSAgICB9Ci0KLSAgICBzcHMtPnZ1aV9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZyA9IChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLQotICAgIGlmIChzcHMtPnZ1aV9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZykgewotICAgICAgICAvKiBubyBlcnJvciBtZXNzYWdlIGFzIHN0cmVhbSBjYW4gYmUgZGVjb2RlZCB3aXRob3V0IFZVSSBtZXNzYWdlcyAqLwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9JbnQzMiBEZWNQUFNNQ1MoIENvbUJpdFN0cmVhbU1DU190ICpwX2JzLAotICAgICAgICAgICAgICAgICAgICAgIENvbVBpY3R1cmVQYXJhbWV0ZXJTZXRfdF9NQ1MgKnBwcyApCi17Ci0gICAgTTRPU0FfSW50MzIgZXJyb3I7Ci0gICAgTTRPU0FfVUludDMyIHBpY19wYXJhbWV0ZXJfc2V0X2lkOwotCi0jaWZkZWYgX0NBUF9GTU9fCi0gICAgTTRPU0FfVUludDMyIGksIGxlbmd0aCwgdjsKLSNlbmRpZgotCi0gICAgTTRPU0FfSW50MzIgbmJfaWdub3JlX2JpdHM7Ci0KLSAgICBwaWNfcGFyYW1ldGVyX3NldF9pZCA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgcHBzLT5waWNfcGFyYW1ldGVyX3NldF9pZCA9IChNNE9TQV9VSW50OClwaWNfcGFyYW1ldGVyX3NldF9pZDsKLQotICAgIHBwcy0+c2VxX3BhcmFtZXRlcl9zZXRfaWQgPQotICAgICAgICAoTTRPU0FfVUludDgpSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLQotICAgIC8qIGVudHJvcHlfY29kaW5nX21vZGVfZmxhZyBtdXN0IGJlIDAgb3IgMSAqLwotICAgIHBwcy0+ZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnID0gKE00T1NBX0Jvb2wpSDI2NE1DU19nZXRCaXRzKHBfYnMsIDEpOwotICAgIHBwcy0+cGljX29yZGVyX3ByZXNlbnRfZmxhZyA9IChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLQotICAgIHBwcy0+bnVtX3NsaWNlX2dyb3Vwc19taW51czEgPQotICAgICAgICAoTTRPU0FfVUludDgpSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLQotI2lmZGVmIF9DQVBfRk1PXwotICAgIC8qIEZNTyBzdHVmZiBiZWdpbnMgaGVyZSAqLwotCi0gICAgcHBzLT5tYXBfaW5pdGlhbGl6ZWQgPSBGQUxTRTsKLQotICAgIGlmKCBwcHMtPm51bV9zbGljZV9ncm91cHNfbWludXMxID4gMCApCi0gICAgewotICAgICAgICBwcHMtPnNsaWNlX2dyb3VwX21hcF90eXBlID0KLSAgICAgICAgICAgIChNNE9TQV9VSW50OClIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotCi0gICAgICAgIHN3aXRjaCggcHBzLT5zbGljZV9ncm91cF9tYXBfdHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8PSBwcHMtPm51bV9zbGljZV9ncm91cHNfbWludXMxOyBpKysgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHBzLT5ydW5fbGVuZ3RoX21pbnVzMVtpXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDE2KUgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBwcHMtPm51bV9zbGljZV9ncm91cHNfbWludXMxOyBpKysgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHBzLT50b3BfbGVmdFtpXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDE2KUgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICAgICAgICAgIHBwcy0+Ym90dG9tX3JpZ2h0W2ldID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MTYpSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgICAgICBwcHMtPnNsaWNlX2dyb3VwX2NoYW5nZV9kaXJlY3Rpb25fZmxhZyA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLSAgICAgICAgICAgICAgICBwcHMtPnNsaWNlX2dyb3VwX2NoYW5nZV9yYXRlX21pbnVzMSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MTYpSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgICAgIHBwcy0+cGljX3NpemVfaW5fbWFwX3VuaXRzX21pbnVzMSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MTYpSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLQotICAgICAgICAgICAgICAgIHBwcy0+c2xpY2VfZ3JvdXBfaWQgPSAoSDI2NFVJbnQ4Ci0gICAgICAgICAgICAgICAgICAgICopTTRIMjY0RGVjX21hbGxvYygocHBzLT5waWNfc2l6ZV9pbl9tYXBfdW5pdHNfbWludXMxCi0gICAgICAgICAgICAgICAgICAgICsgMSksIE00SDI2NF9DT1JFSUQsIChNNE9TQV9DaGFyICopIlBQUyIpOwotCi0gICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gcHBzLT5zbGljZV9ncm91cF9pZCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJEZWNQUFNNQ1M6IGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZvciAoIGxlbmd0aCA9IDAsIHYgPSBwcHMtPm51bV9zbGljZV9ncm91cHNfbWludXMxICsgMTsgdiAhPSAwOwotICAgICAgICAgICAgICAgICAgICB2ID4+PSAxLCBsZW5ndGgrKyApOwotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDw9IHBwcy0+cGljX3NpemVfaW5fbWFwX3VuaXRzX21pbnVzMTsgaSsrICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcHBzLT5zbGljZV9ncm91cF9pZFtpXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KWdldEJpdHMocF92bGNfZW5naW5lLT5wX2JzLCBsZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBwcy0+c2xpY2VfZ3JvdXBfbWFwX3R5cGUgPSAwOwotICAgIH0KLSAgICAvKiBFbmQgb2YgRk1PIHN0dWZmICovCi0KLSNlbHNlCi0KLSNlbmRpZiAvKiBfQ0FQX0ZNT18gKi8KLQotICAgIC8qIG51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czEgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMCwgMzEgKi8KLQotICAgIHBwcy0+bnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMSA9Ci0gICAgICAgIChNNE9TQV9VSW50OClIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgIC8qIG51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMCwgMzEgKi8KLSAgICBwcHMtPm51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEgPQotICAgICAgICAoTTRPU0FfVUludDgpSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICBwcHMtPndlaWdodGVkX3ByZWRfZmxhZyA9IChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLQotICAgIC8qIHdlaWdodGVkX2JpcHJlZF9pZGMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMCwyICovCi0gICAgcHBzLT53ZWlnaHRlZF9iaXByZWRfaWRjID0gKE00T1NBX0Jvb2wpSDI2NE1DU19nZXRCaXRzKHBfYnMsIDIpOwotCi0gICAgLyogcGljX2luaXRfcXBfbWludXMyNiBtdXN0IGJlIGluIHRoZSByYW5nZSAtMjYsMjUgKi8KLSAgICBwcHMtPnBpY19pbml0X3FwX21pbnVzMjYgPQotICAgICAgICAoTTRPU0FfSW50MTYpSDI2NE1DU19EZWNWTENSZWFkU2lnbmVkRXhwR29sb21iQ29kZShwX2JzKTsKLQotICAgIC8qIHBpY19pbml0X3FzX21pbnVzMjYgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgLTI2LDI1ICovCi0gICAgcHBzLT5waWNfaW5pdF9xc19taW51czI2ID0KLSAgICAgICAgKE00T1NBX0ludDE2KUgyNjRNQ1NfRGVjVkxDUmVhZFNpZ25lZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0KLSAgICAvKiBjaHJvbWFfcXBfaW5kZXhfb2Zmc2V0IG11c3QgYmUgaW4gdGhlIHJhbmdlIC0xMiwrMTIgKi8KLSAgICBwcHMtPmNocm9tYV9xcF9pbmRleF9vZmZzZXQgPQotICAgICAgICAoTTRPU0FfSW50MTYpSDI2NE1DU19EZWNWTENSZWFkU2lnbmVkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICBwcHMtPmRlYmxvY2tpbmdfZmlsdGVyX2NvbnRyb2xfcHJlc2VudF9mbGFnID0KLSAgICAgICAgKE00T1NBX0Jvb2wpSDI2NE1DU19nZXRCaXRzKHBfYnMsIDEpOwotICAgIHBwcy0+Y29uc3RyYWluZWRfaW50cmFfcHJlZF9mbGFnID0gKE00T1NBX0Jvb2wpSDI2NE1DU19nZXRCaXRzKHBfYnMsIDEpOwotICAgIHBwcy0+cmVkdW5kYW50X3BpY19jbnRfcHJlc2VudF9mbGFnID0gKE00T1NBX0Jvb2wpSDI2NE1DU19nZXRCaXRzKHBfYnMsIDEpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBIMjY0TUNTX1Byb2Nlc3NTUFNfUFBTKCBOU1dBVkNfTUNTX3QgKmluc3RhbmNlLCBNNE9TQV9VSW50OCAqaW5idWZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgaW5idWZfc2l6ZSApCi17Ci0gICAgQ29tQml0U3RyZWFtTUNTX3QgKnBfYnMsIGJzOwotICAgIENvbUJpdFN0cmVhbU1DU190ICpwX2JzMSwgYnMxOwotCi0gICAgTTRPU0FfVUludDggbmFsdV9pbmZvID0gMDsKLSAgICBNNE9TQV9JbnQzMiBmb3JiaWRkZW5fYml0LCBuYWxfcmVmX2lkYywgbmFsX3VuaXRfdHlwZTsKLSAgICBNNE9TQV9JbnQzMiBmaXJzdF9tYl9pbl9zbGljZSwgc2xpY2VfdHlwZSwgcGljX3BhcmFtZXRlcl9zZXRfaWQgPSAwLAotICAgICAgICBmcmFtZV9udW07Ci0gICAgTTRPU0FfSW50MzIgc2VxX3BhcmFtZXRlcl9zZXRfaWQ7Ci0gICAgTTRPU0FfVUludDggdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQ7Ci0gICAgTTRPU0FfSW50MzIgdGVtcF9mcmFtZV9udW07Ci0gICAgTTRPU0FfSW50MzIgYml0c3RvRGlhY2FyZCwgYnl0ZXM7Ci0gICAgTTRPU0FfVUludDMyIG1hc2tfYml0cyA9IDB4RkZGRkZGRkY7Ci0gICAgTTRPU0FfSW50MzIgbmV3X2J5dGVzLCBpbml0X2JpdF9wb3M7Ci0gICAgTTRPU0FfVUludDMyIG5hbF9zaXplID0gMDsKLSAgICBNNE9TQV9VSW50MzIgY250LCBjbnQxOwotICAgIE00T1NBX1VJbnQzMiBvdXRidWZmcG9zID0gMDsKLSAgICBNNE9TQV9VSW50MzIgbmFsX3NpemVfbG93MTYsIG5hbF9zaXplX2hpZ2gxNjsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVfc2l6ZSA9IDA7Ci0gICAgTTRPU0FfVUludDMyIHRlbXAgPSAwOwotICAgIE00T1NBX1VJbnQ4ICpsQ2xpcERTSTsKLSAgICBNNE9TQV9VSW50OCAqbENsaXBEU0lfUFBTX3N0YXJ0OwotICAgIE00T1NBX1VJbnQzMiBsQ2xpcERTSV9QUFNfb2Zmc2V0ID0gMDsKLQotICAgIE00T1NBX1VJbnQ4ICpsUFBTX0J1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfVUludDMyIGxQUFNfQnVmZmVyX1NpemUgPSAwOwotCi0gICAgTTRPU0FfVUludDMyIGxTaXplLCBsU2l6ZTE7Ci0gICAgTTRPU0FfVUludDMyIGxBY3RpdmVTUFNJRF9DbGlwOwotICAgIE00T1NBX1VJbnQzMiBsQ2xpcFBQU1JlbUJpdHMgPSAwOwotCi0gICAgTTRPU0FfVUludDMyIGxFbmNvZGVyX1NQU0lEID0gMDsKLSAgICBNNE9TQV9VSW50MzIgbEVuY29kZXJfUFBTSUQgPSAwOwotICAgIE00T1NBX1VJbnQzMiBsRW5jb2RlclBQU1JlbUJpdHMgPSAwOwotICAgIE00T1NBX1VJbnQzMiBsRm91bmQgPSAwOwotICAgIE00T1NBX1VJbnQzMiBzaXplOwotCi0gICAgTTRPU0FfVUludDggQ2xpcF9TUFNJRFszMl0gPSB7IDAgfTsKLSAgICBNNE9TQV9VSW50OCBDbGlwX1VzZWRTUFNJRFszMl0gPSB7IDAgfTsKLSAgICBNNE9TQV9VSW50OCBDbGlwX1BQU0lEWzI1Nl0gPSB7IDAgfTsKLSAgICBNNE9TQV9VSW50OCBDbGlwX1NQU0lEX2luX1BQU1syNTZdID0geyAwIH07Ci0gICAgTTRPU0FfVUludDggQ2xpcF9Vc2VkUFBTSURbMjU2XSA9IHsgMCB9OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgcF9icyA9ICZiczsKLSAgICBwX2JzMSA9ICZiczE7Ci0KLSAgICAvKiBGaW5kIHRoZSBhY3RpdmUgU1BTIElEICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IGluc3RhbmNlKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiSDI2NE1DU19Qcm9jZXNzU1BTX1BQUzogaW5zdGFuY2UgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgaW5zdGFuY2UtPm1fTnVtX0J5dGVzX05BTFVuaXRMZW5ndGggPQotICAgICAgICAgICAgKGluc3RhbmNlLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvWzRdICYgMHgwMykgKyAxOwotCi0gICAgaW5zdGFuY2UtPm1fZW5jb2Rlcl9TUFNfQ250ID0gaW5zdGFuY2UtPm1fcERlY29kZXJTcGVjaWZpY0luZm9bNV0gJiAweDFGOwotCi0gICAgbENsaXBEU0kgPSBpbnN0YW5jZS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyArIDY7Ci0KLSAgICBsQ2xpcERTSV9QUFNfb2Zmc2V0ID0gNjsKLQotICAgIGZvciAoIGNudCA9IDA7IGNudCA8IGluc3RhbmNlLT5tX2VuY29kZXJfU1BTX0NudDsgY250KysgKQotICAgIHsKLSAgICAgICAgbFNpemUgPSAoIGxDbGlwRFNJWzBdIDw8IDgpICsgbENsaXBEU0lbMV07Ci0gICAgICAgIGxDbGlwRFNJID0gbENsaXBEU0kgKyAyOwotCi0gICAgICAgIHBfYnMtPkJ1ZmZlciA9IChNNE9TQV9VSW50OCAqKShsQ2xpcERTSSArIDQpOwotICAgICAgICBEZWNCaXRTdHJlYW1SZXNldF9NQ1MocF9icywgbFNpemUgLSA0KTsKLQotICAgICAgICBDbGlwX1NQU0lEW2NudF0gPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICBDbGlwX1VzZWRTUFNJRFtDbGlwX1NQU0lEW2NudF1dID0gMTsKLQotICAgICAgICBsQ2xpcERTSSA9IGxDbGlwRFNJICsgbFNpemU7Ci0gICAgICAgIGxDbGlwRFNJX1BQU19vZmZzZXQgPSBsQ2xpcERTSV9QUFNfb2Zmc2V0ICsgMiArIGxTaXplOwotICAgIH0KLQotICAgIGluc3RhbmNlLT5tX2VuY29kZXJfUFBTX0NudCA9IGxDbGlwRFNJWzBdOwotICAgIGxDbGlwRFNJID0gbENsaXBEU0kgKyAxOwotCi0gICAgbENsaXBEU0lfUFBTX3N0YXJ0ID0gbENsaXBEU0k7Ci0KLSAgICBmb3IgKCBjbnQgPSAwOyBjbnQgPCBpbnN0YW5jZS0+bV9lbmNvZGVyX1BQU19DbnQ7IGNudCsrICkKLSAgICB7Ci0gICAgICAgIGxTaXplID0gKCBsQ2xpcERTSVswXSA8PCA4KSArIGxDbGlwRFNJWzFdOwotICAgICAgICBsQ2xpcERTSSA9IGxDbGlwRFNJICsgMjsKLQotICAgICAgICBwX2JzLT5CdWZmZXIgPSAoTTRPU0FfVUludDggKikobENsaXBEU0kgKyAxKTsKLSAgICAgICAgRGVjQml0U3RyZWFtUmVzZXRfTUNTKHBfYnMsIGxTaXplIC0gMSk7Ci0KLSAgICAgICAgQ2xpcF9QUFNJRFtjbnRdID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgQ2xpcF9Vc2VkUFBTSURbQ2xpcF9QUFNJRFtjbnRdXSA9IDE7Ci0gICAgICAgIENsaXBfU1BTSURfaW5fUFBTW0NsaXBfUFBTSURbY250XV0gPQotICAgICAgICAgICAgSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLQotICAgICAgICBsQ2xpcERTSSA9IGxDbGlwRFNJICsgbFNpemU7Ci0gICAgfQotCi0gICAgLyogRmluZCB0aGUgY2xpcCBTUFMgSUQgdXNlZCBhdCB0aGUgY3V0IHN0YXJ0IGZyYW1lICovCi0gICAgd2hpbGUoICggKE00T1NBX0ludDMyKWZyYW1lX3NpemUpIDwgaW5idWZfc2l6ZSApCi0gICAgewotICAgICAgICBtYXNrX2JpdHMgPSAweEZGRkZGRkZGOwotICAgICAgICBwX2JzLT5CdWZmZXIgPSAoTTRPU0FfVUludDggKikoaW5idWZmICsgZnJhbWVfc2l6ZSk7Ci0KLSAgICAgICAgc3dpdGNoKCBpbnN0YW5jZS0+bV9OdW1fQnl0ZXNfTkFMVW5pdExlbmd0aCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICBuYWxfc2l6ZSA9ICh1bnNpZ25lZCBjaGFyKXBfYnMtPkJ1ZmZlclswXTsKLSAgICAgICAgICAgICAgICBuYWx1X2luZm8gPSAodW5zaWduZWQgY2hhcilwX2JzLT5CdWZmZXJbMV07Ci0gICAgICAgICAgICAgICAgcF9icy0+QnVmZmVyID0gcF9icy0+QnVmZmVyICsgMjsKLQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgbmFsX3NpemVfaGlnaDE2ID0gKCBwX2JzLT5CdWZmZXJbMF0gPDwgOCkgKyBwX2JzLT5CdWZmZXJbMV07Ci0gICAgICAgICAgICAgICAgbmFsX3NpemUgPSBuYWxfc2l6ZV9oaWdoMTY7Ci0gICAgICAgICAgICAgICAgbmFsdV9pbmZvID0gKHVuc2lnbmVkIGNoYXIpcF9icy0+QnVmZmVyWzJdOwotICAgICAgICAgICAgICAgIHBfYnMtPkJ1ZmZlciA9IHBfYnMtPkJ1ZmZlciArIDM7Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgIG5hbF9zaXplX2hpZ2gxNiA9ICggcF9icy0+QnVmZmVyWzBdIDw8IDgpICsgcF9icy0+QnVmZmVyWzFdOwotICAgICAgICAgICAgICAgIG5hbF9zaXplX2xvdzE2ID0gKCBwX2JzLT5CdWZmZXJbMl0gPDwgOCkgKyBwX2JzLT5CdWZmZXJbM107Ci0gICAgICAgICAgICAgICAgbmFsX3NpemUgPSAoIG5hbF9zaXplX2hpZ2gxNiA8PCAxNikgKyBuYWxfc2l6ZV9sb3cxNjsKLSAgICAgICAgICAgICAgICBuYWx1X2luZm8gPSAodW5zaWduZWQgY2hhcilwX2JzLT5CdWZmZXJbNF07Ci0gICAgICAgICAgICAgICAgcF9icy0+QnVmZmVyID0gcF9icy0+QnVmZmVyICsgNTsKLQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5hbF9zaXplID09IDApIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCIwIHNpemUgbmFsIHVuaXQgYXQgbGluZSAlZCIsIF9fTElORV9fKTsKLSAgICAgICAgICAgIGZyYW1lX3NpemUgKz0gaW5zdGFuY2UtPm1fTnVtX0J5dGVzX05BTFVuaXRMZW5ndGg7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHBfYnMtPmJpdFBvcyA9IDA7Ci0gICAgICAgIHBfYnMtPmxhc3RUb3RhbEJpdHMgPSAwOwotICAgICAgICBwX2JzLT5udW1CaXRzSW5CdWZmZXIgPQotICAgICAgICAgICAgKCBpbmJ1Zl9zaXplIC0gZnJhbWVfc2l6ZSAtIGluc3RhbmNlLT5tX051bV9CeXRlc19OQUxVbml0TGVuZ3RoIC0gMSkKLSAgICAgICAgICAgIDw8IDM7Ci0gICAgICAgIHBfYnMtPnJlYWRhYmxlQnl0ZXNJbkJ1ZmZlciA9Ci0gICAgICAgICAgICBpbmJ1Zl9zaXplIC0gZnJhbWVfc2l6ZSAtIGluc3RhbmNlLT5tX051bV9CeXRlc19OQUxVbml0TGVuZ3RoIC0gMTsKLQotICAgICAgICBwX2JzLT51aTMyVGVtcEJ1ZmYgPSAwOwotICAgICAgICBwX2JzLT5pOEJpdENudCA9IDA7Ci0gICAgICAgIHBfYnMtPnB1aThCZnJQdHIgPSAoTTRPU0FfSW50OCAqKXBfYnMtPkJ1ZmZlcjsKLSAgICAgICAgcF9icy0+dWkzMkxhc3RUd29CeXRlcyA9IDB4RkZGRkZGRkY7Ci0KLSAgICAgICAgSDI2NE1DU19nZXRCaXRzKHBfYnMsIDApOwotCi0gICAgICAgIGZyYW1lX3NpemUgKz0gbmFsX3NpemUgKyBpbnN0YW5jZS0+bV9OdW1fQnl0ZXNfTkFMVW5pdExlbmd0aDsKLQotICAgICAgICBmb3JiaWRkZW5fYml0ID0gKCBuYWx1X2luZm8gPj4gNykgJiAxOwotICAgICAgICBuYWxfcmVmX2lkYyA9ICggbmFsdV9pbmZvID4+IDUpICYgMzsKLSAgICAgICAgbmFsX3VuaXRfdHlwZSA9IChuYWx1X2luZm8pICYweDFmOwotCi0gICAgICAgIGlmKCBuYWxfdW5pdF90eXBlID09IDggKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiSDI2NE1DU19Qcm9jZXNzU1BTX1BQUygpIEVycm9yOiBQUFMiKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggbmFsX3VuaXRfdHlwZSA9PSA3ICkKLSAgICAgICAgewotICAgICAgICAgICAgLypTUFMgUGFja2V0ICovCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiSDI2NE1DU19Qcm9jZXNzU1BTX1BQUygpIEVycm9yOiBTUFMiKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggKCBuYWxfdW5pdF90eXBlID09IDEpIHx8IChuYWxfdW5pdF90eXBlID09IDUpICkKLSAgICAgICAgewotICAgICAgICAgICAgZmlyc3RfbWJfaW5fc2xpY2UgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICAgICAgc2xpY2VfdHlwZSA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICBwaWNfcGFyYW1ldGVyX3NldF9pZCA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGxBY3RpdmVTUFNJRF9DbGlwID0gQ2xpcF9TUFNJRF9pbl9QUFNbcGljX3BhcmFtZXRlcl9zZXRfaWRdOwotCi0gICAgaW5zdGFuY2UtPmZpbmFsX1NQU19JRCA9IGxBY3RpdmVTUFNJRF9DbGlwOwotICAgIC8qIERvIHdlIG5lZWQgdG8gYWRkIGVuY29kZXIgUFBTIHRvIGNsaXAgUFBTICovCi0KLSAgICBsQ2xpcERTSSA9IGxDbGlwRFNJX1BQU19zdGFydDsKLQotICAgIGZvciAoIGNudCA9IDA7IGNudCA8IGluc3RhbmNlLT5tX2VuY29kZXJfUFBTX0NudDsgY250KysgKQotICAgIHsKLSAgICAgICAgbFNpemUgPSAoIGxDbGlwRFNJWzBdIDw8IDgpICsgbENsaXBEU0lbMV07Ci0gICAgICAgIGxDbGlwRFNJID0gbENsaXBEU0kgKyAyOwotCi0gICAgICAgIGlmKCBsQWN0aXZlU1BTSURfQ2xpcCA9PSBDbGlwX1NQU0lEX2luX1BQU1tDbGlwX1BQU0lEW2NudF1dICkKLSAgICAgICAgewotICAgICAgICAgICAgbFBQU19CdWZmZXIgPSBsQ2xpcERTSSArIDE7Ci0gICAgICAgICAgICBsUFBTX0J1ZmZlcl9TaXplID0gbFNpemUgLSAxOwotCi0gICAgICAgICAgICBwX2JzLT5CdWZmZXIgPSAoTTRPU0FfVUludDggKikobENsaXBEU0kgKyAxKTsKLSAgICAgICAgICAgIERlY0JpdFN0cmVhbVJlc2V0X01DUyhwX2JzLCBsU2l6ZSAtIDEpOwotCi0gICAgICAgICAgICBDbGlwX1BQU0lEW2NudF0gPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICAgICAgQ2xpcF9Vc2VkUFBTSURbQ2xpcF9TUFNJRFtjbnRdXSA9IDE7Ci0gICAgICAgICAgICBDbGlwX1NQU0lEX2luX1BQU1tjbnRdID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgICAgIGxDbGlwUFBTUmVtQml0cyA9ICggbFNpemUgLSAxKSA8PCAzOwotICAgICAgICAgICAgbENsaXBQUFNSZW1CaXRzIC09IHBfYnMtPmJpdFBvczsKLQotICAgICAgICAgICAgdGVtcCA9IGxDbGlwRFNJW2xTaXplIC0gMV07Ci0KLSAgICAgICAgICAgIGNudDEgPSAwOwotCi0gICAgICAgICAgICB3aGlsZSggKCB0ZW1wICYgMHgxKSA9PSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjbnQxKys7Ci0gICAgICAgICAgICAgICAgdGVtcCA9IHRlbXAgPj4gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNudDErKzsKLSAgICAgICAgICAgIGxDbGlwUFBTUmVtQml0cyAtPSBjbnQxOwotCi0gICAgICAgICAgICBsU2l6ZTEgPSBpbnN0YW5jZS0+bV9lbmNvZGVyUFBTU2l6ZSAtIDE7Ci0gICAgICAgICAgICBwX2JzMS0+QnVmZmVyID0gKE00T1NBX1VJbnQ4ICopKGluc3RhbmNlLT5tX3BFbmNvZGVyUFBTICsgMSk7Ci0gICAgICAgICAgICBEZWNCaXRTdHJlYW1SZXNldF9NQ1MocF9iczEsIGxTaXplMSk7Ci0KLSAgICAgICAgICAgIGxFbmNvZGVyX1BQU0lEID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzMSk7Ci0gICAgICAgICAgICBsRW5jb2Rlcl9TUFNJRCA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9iczEpOwotCi0gICAgICAgICAgICBsRW5jb2RlclBQU1JlbUJpdHMgPSAoIGxTaXplMSkgPDwgMzsKLSAgICAgICAgICAgIGxFbmNvZGVyUFBTUmVtQml0cyAtPSBwX2JzMS0+Yml0UG9zOwotCi0gICAgICAgICAgICB0ZW1wID0gaW5zdGFuY2UtPm1fcEVuY29kZXJQUFNbbFNpemUxXTsKLQotICAgICAgICAgICAgY250MSA9IDA7Ci0KLSAgICAgICAgICAgIHdoaWxlKCAoIHRlbXAgJiAweDEpID09IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNudDErKzsKLSAgICAgICAgICAgICAgICB0ZW1wID0gdGVtcCA+PiAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY250MSsrOwotICAgICAgICAgICAgbEVuY29kZXJQUFNSZW1CaXRzIC09IGNudDE7Ci0KLSAgICAgICAgICAgIGlmKCBsRW5jb2RlclBQU1JlbUJpdHMgPT0gbENsaXBQUFNSZW1CaXRzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3aGlsZSggbEVuY29kZXJQUFNSZW1CaXRzID4gOCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9IEgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCA4KTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcDIgPSBIMjY0TUNTX2dldEJpdHMocF9iczEsIDgpOwotICAgICAgICAgICAgICAgICAgICBsRW5jb2RlclBQU1JlbUJpdHMgPSBsRW5jb2RlclBQU1JlbUJpdHMgLSA4OwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCB0ZW1wMSAhPSB0ZW1wMiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYoIGxFbmNvZGVyUFBTUmVtQml0cyA8IDggKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIGxFbmNvZGVyUFBTUmVtQml0cyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxID0gSDI2NE1DU19nZXRCaXRzKHBfYnMsIGxFbmNvZGVyUFBTUmVtQml0cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMiA9IEgyNjRNQ1NfZ2V0Qml0cyhwX2JzMSwgbEVuY29kZXJQUFNSZW1CaXRzKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRlbXAxID09IHRlbXAyICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsRm91bmQgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbEZvdW5kID0gMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGxDbGlwRFNJID0gbENsaXBEU0kgKyBsU2l6ZTsKLSAgICB9Ci0KLSAgICAvKiBGb3JtIHRoZSBmaW5hbCBTUFMgYW5kIFBQUyBkYXRhICovCi0KLSAgICBpZiggbEZvdW5kID09IDEgKQotICAgIHsKLSAgICAgICAgLyogTm8gbmVlZCB0byBhZGQgUFBTICovCi0gICAgICAgIGluc3RhbmNlLT5maW5hbF9QUFNfSUQgPSBDbGlwX1BQU0lEW2NudF07Ci0KLSAgICAgICAgaW5zdGFuY2UtPm1fcEZpbmFsRFNJID0KLSAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhpbnN0YW5jZS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgIE00TUNTLCAoTTRPU0FfQ2hhciAqKSJpbnN0YW5jZS0+bV9wRmluYWxEU0kiKTsKLQotICAgICAgICBpZiggaW5zdGFuY2UtPm1fcEZpbmFsRFNJID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiaW5zdGFuY2UtPm1fcEZpbmFsRFNJOiBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnN0YW5jZS0+bV9wRmluYWxEU0lTaXplID0gaW5zdGFuY2UtPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemU7Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKWluc3RhbmNlLT5tX3BGaW5hbERTSSwKLSAgICAgICAgICAgICh2b2lkICopaW5zdGFuY2UtPm1fcERlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICBpbnN0YW5jZS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIEFERCBQUFMgKi8KLSAgICAgICAgLyogZmluZCB0aGUgZnJlZSBQUFMgSUQgKi8KLQotICAgICAgICBjbnQgPSAwOwotCi0gICAgICAgIHdoaWxlKCBDbGlwX1VzZWRQUFNJRFtjbnRdICkKLSAgICAgICAgewotICAgICAgICAgICAgY250Kys7Ci0gICAgICAgIH0KLSAgICAgICAgaW5zdGFuY2UtPmZpbmFsX1BQU19JRCA9IGNudDsKLQotICAgICAgICBzaXplID0gaW5zdGFuY2UtPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgKyBpbnN0YW5jZS0+bV9lbmNvZGVyUFBTU2l6ZQotICAgICAgICAgICAgKyAxMDsKLQotICAgICAgICBpbnN0YW5jZS0+bV9wRmluYWxEU0kgPSAoTTRPU0FfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZSwgTTRNQ1MsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJpbnN0YW5jZS0+bV9wRmluYWxEU0kiKTsKLQotICAgICAgICBpZiggaW5zdGFuY2UtPm1fcEZpbmFsRFNJID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiaW5zdGFuY2UtPm1fcEZpbmFsRFNJOiBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICBtZW1jcHkoKHZvaWQgKilpbnN0YW5jZS0+bV9wRmluYWxEU0ksCi0gICAgICAgICAgICAodm9pZCAqKWluc3RhbmNlLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAgICAgaW5zdGFuY2UtPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUpOwotCi0gICAgICAgIHRlbXAgPSBpbnN0YW5jZS0+bV9wRmluYWxEU0lbbENsaXBEU0lfUFBTX29mZnNldF07Ci0gICAgICAgIHRlbXAgPSB0ZW1wICsgMTsKLSAgICAgICAgaW5zdGFuY2UtPm1fcEZpbmFsRFNJW2xDbGlwRFNJX1BQU19vZmZzZXRdID0gdGVtcDsKLQotICAgICAgICAvL3RlbXAgPSBpbnN0YW5jZS0+bV9wRW5jb2RlclBQU1swXTsKLSAgICAgICAgbFNpemUxID0gaW5zdGFuY2UtPm1fZW5jb2RlclBQU1NpemUgLSAxOwotICAgICAgICBwX2JzMS0+QnVmZmVyID0gKE00T1NBX1VJbnQ4ICopKGluc3RhbmNlLT5tX3BFbmNvZGVyUFBTICsgMSk7Ci0gICAgICAgIERlY0JpdFN0cmVhbVJlc2V0X01DUyhwX2JzMSwgbFNpemUxKTsKLQotICAgICAgICBsRW5jb2Rlcl9QUFNJRCA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9iczEpOwotICAgICAgICBsRW5jb2Rlcl9TUFNJRCA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9iczEpOwotCi0gICAgICAgIGxFbmNvZGVyUFBTUmVtQml0cyA9ICggbFNpemUxKSA8PCAzOwotICAgICAgICBsRW5jb2RlclBQU1JlbUJpdHMgLT0gcF9iczEtPmJpdFBvczsKLQotICAgICAgICB0ZW1wID0gaW5zdGFuY2UtPm1fcEVuY29kZXJQUFNbbFNpemUxXTsKLQotICAgICAgICBjbnQxID0gMDsKLQotICAgICAgICB3aGlsZSggKCB0ZW1wICYgMHgxKSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgY250MSsrOwotICAgICAgICAgICAgdGVtcCA9IHRlbXAgPj4gMTsKLSAgICAgICAgfQotICAgICAgICBjbnQxKys7Ci0gICAgICAgIGxFbmNvZGVyUFBTUmVtQml0cyAtPSBjbnQxOwotCi0gICAgICAgIGluc3RhbmNlLT5tX3BGaW5hbERTSVtpbnN0YW5jZS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSArIDJdID0KLSAgICAgICAgICAgIGluc3RhbmNlLT5tX3BFbmNvZGVyUFBTWzBdOwotCi0gICAgICAgIE5TV0FWQ01DU19pbml0Qml0c3RyZWFtKCZpbnN0YW5jZS0+ZW5jYnMpOwotICAgICAgICBpbnN0YW5jZS0+ZW5jYnMuc3RyZWFtQnVmZmVyID0KLSAgICAgICAgICAgICYoaW5zdGFuY2UtPm1fcEZpbmFsRFNJW2luc3RhbmNlLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplICsgM10pOwotICAgICAgICBsUFBTX0J1ZmZlciA9IGluc3RhbmNlLT5lbmNicy5zdHJlYW1CdWZmZXI7Ci0KLSAgICAgICAgTlNXQVZDTUNTX3VFeHBWTEMoJmluc3RhbmNlLT5lbmNicywgaW5zdGFuY2UtPmZpbmFsX1BQU19JRCk7Ci0gICAgICAgIE5TV0FWQ01DU191RXhwVkxDKCZpbnN0YW5jZS0+ZW5jYnMsIGluc3RhbmNlLT5maW5hbF9TUFNfSUQpOwotCi0gICAgICAgIHdoaWxlKCBsRW5jb2RlclBQU1JlbUJpdHMgPiA4ICkKLSAgICAgICAgewotICAgICAgICAgICAgdGVtcCA9IEgyNjRNQ1NfZ2V0Qml0cyhwX2JzMSwgOCk7Ci0gICAgICAgICAgICBOU1dBVkNNQ1NfcHV0Qml0cygmaW5zdGFuY2UtPmVuY2JzLCB0ZW1wLCA4KTsKLSAgICAgICAgICAgIGxFbmNvZGVyUFBTUmVtQml0cyA9IGxFbmNvZGVyUFBTUmVtQml0cyAtIDg7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggbEVuY29kZXJQUFNSZW1CaXRzICkKLSAgICAgICAgewotICAgICAgICAgICAgdGVtcCA9IEgyNjRNQ1NfZ2V0Qml0cyhwX2JzMSwgbEVuY29kZXJQUFNSZW1CaXRzKTsKLSAgICAgICAgICAgIE5TV0FWQ01DU19wdXRCaXRzKCZpbnN0YW5jZS0+ZW5jYnMsIHRlbXAsIGxFbmNvZGVyUFBTUmVtQml0cyk7Ci0gICAgICAgIH0KLSAgICAgICAgTlNXQVZDTUNTX3B1dFJic3BUYml0cygmaW5zdGFuY2UtPmVuY2JzKTsKLQotICAgICAgICB0ZW1wID0gaW5zdGFuY2UtPmVuY2JzLmJ5dGVDbnQ7Ci0gICAgICAgIGxQUFNfQnVmZmVyX1NpemUgPSB0ZW1wOwotICAgICAgICB0ZW1wID0gdGVtcCArIDE7Ci0KLSAgICAgICAgaW5zdGFuY2UtPm1fcEZpbmFsRFNJW2luc3RhbmNlLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplXSA9Ci0gICAgICAgICAgICAoIHRlbXAgPj4gOCkgJiAweEZGOwotICAgICAgICBpbnN0YW5jZS0+bV9wRmluYWxEU0lbaW5zdGFuY2UtPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgKyAxXSA9Ci0gICAgICAgICAgICAodGVtcCkgJjB4RkY7Ci0gICAgICAgIGluc3RhbmNlLT5tX3BGaW5hbERTSVNpemUgPQotICAgICAgICAgICAgaW5zdGFuY2UtPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgKyAyICsgdGVtcDsKLSAgICB9Ci0KLSAgICAvKiBEZWNvZGUgdGhlIGNsaXAgU1BTICovCi0KLSAgICBsQ2xpcERTSSA9IGluc3RhbmNlLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvICsgNjsKLQotICAgIGxDbGlwRFNJX1BQU19vZmZzZXQgPSA2OwotCi0gICAgZm9yICggY250ID0gMDsgY250IDwgaW5zdGFuY2UtPm1fZW5jb2Rlcl9TUFNfQ250OyBjbnQrKyApCi0gICAgewotICAgICAgICBsU2l6ZSA9ICggbENsaXBEU0lbMF0gPDwgOCkgKyBsQ2xpcERTSVsxXTsKLSAgICAgICAgbENsaXBEU0kgPSBsQ2xpcERTSSArIDI7Ci0KLSAgICAgICAgaWYoIENsaXBfU1BTSURbY250XSA9PSBpbnN0YW5jZS0+ZmluYWxfU1BTX0lEICkKLSAgICAgICAgewotICAgICAgICAgICAgcF9icy0+QnVmZmVyID0gKE00T1NBX1VJbnQ4ICopKGxDbGlwRFNJICsgMSk7Ci0gICAgICAgICAgICBEZWNCaXRTdHJlYW1SZXNldF9NQ1MocF9icywgbFNpemUgLSAxKTsKLQotICAgICAgICAgICAgZXJyID0gRGVjU1BTTUNTKHBfYnMsICZpbnN0YW5jZS0+Y2xpcF9zcHMpOwotICAgICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL0NsaXBfU1BTSURbY250XSA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICAvL0NsaXBfVXNlZFNQU0lEW0NsaXBfU1BTSURbY250XV0gPSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBsQ2xpcERTSSA9IGxDbGlwRFNJICsgbFNpemU7Ci0gICAgfQotCi0gICAgLyogRGVjb2RlIGVuY29kZXIgU1BTICovCi0gICAgcF9icy0+QnVmZmVyID0gKE00T1NBX1VJbnQ4ICopKGluc3RhbmNlLT5tX3BFbmNvZGVyU1BTICsgMSk7Ci0gICAgRGVjQml0U3RyZWFtUmVzZXRfTUNTKHBfYnMsIGluc3RhbmNlLT5tX2VuY29kZXJTUFNTaXplIC0gMSk7Ci0gICAgZXJyID0gRGVjU1BTTUNTKHBfYnMsICZpbnN0YW5jZS0+ZW5jb2Rlcl9zcHMpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYoIGluc3RhbmNlLT5lbmNvZGVyX3Nwcy5udW1fcmVmX2ZyYW1lcwotICAgID4gaW5zdGFuY2UtPmNsaXBfc3BzLm51bV9yZWZfZnJhbWVzICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAxMDA7IC8vbm90IHN1cHBvcnRlZAotICAgIH0KLQotICAgIHBfYnMtPkJ1ZmZlciA9IChNNE9TQV9VSW50OCAqKWxQUFNfQnVmZmVyOwotICAgIERlY0JpdFN0cmVhbVJlc2V0X01DUyhwX2JzLCBsUFBTX0J1ZmZlcl9TaXplKTsKLSAgICBEZWNQUFNNQ1MocF9icywgJmluc3RhbmNlLT5lbmNvZGVyX3Bwcyk7Ci0KLSAgICBpbnN0YW5jZS0+ZnJhbWVfY291bnQgPSAwOwotICAgIGluc3RhbmNlLT5mcmFtZV9tb2RfY291bnQgPQotICAgICAgICAxIDw8IChpbnN0YW5jZS0+Y2xpcF9zcHMubG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCArIDQpOwotCi0gICAgaW5zdGFuY2UtPlBPQ19sc2IgPSAwOwotICAgIGluc3RhbmNlLT5QT0NfbHNiX21vZCA9Ci0gICAgICAgIDEgPDwgKGluc3RhbmNlLT5jbGlwX3Nwcy5sb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQgKyA0KTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgSDI2NE1DU19Qcm9jZXNzTkFMVSggTlNXQVZDX01DU190ICphaW5zdGFuY2UsIE00T1NBX1VJbnQ4ICppbmJ1ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgaW5idWZfc2l6ZSwgTTRPU0FfVUludDggKm91dGJ1ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgKm91dGJ1Zl9zaXplICkKLXsKLSAgICBDb21CaXRTdHJlYW1NQ1NfdCAqcF9icywgYnM7Ci0gICAgTlNXQVZDX01DU190ICppbnN0YW5jZTsKLSAgICBNNE9TQV9VSW50OCBuYWx1X2luZm87Ci0gICAgTTRPU0FfSW50MzIgZm9yYmlkZGVuX2JpdCwgbmFsX3JlZl9pZGMsIG5hbF91bml0X3R5cGU7Ci0gICAgTTRPU0FfSW50MzIgZmlyc3RfbWJfaW5fc2xpY2UsIHNsaWNlX3R5cGUsIHBpY19wYXJhbWV0ZXJfc2V0X2lkLCBmcmFtZV9udW07Ci0gICAgTTRPU0FfSW50MzIgc2VxX3BhcmFtZXRlcl9zZXRfaWQ7Ci0gICAgTTRPU0FfVUludDggdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQ7Ci0gICAgTTRPU0FfSW50MzIgdGVtcF9mcmFtZV9udW07Ci0gICAgTTRPU0FfSW50MzIgYml0c3RvRGlhY2FyZCwgYnl0ZXM7Ci0gICAgTTRPU0FfVUludDMyIG1hc2tfYml0cyA9IDB4RkZGRkZGRkY7Ci0gICAgTTRPU0FfSW50MzIgbmV3X2J5dGVzLCBpbml0X2JpdF9wb3M7Ci0gICAgTTRPU0FfVUludDMyIG5hbF9zaXplOwotICAgIE00T1NBX1VJbnQzMiBjbnQ7Ci0gICAgTTRPU0FfVUludDMyIG91dGJ1ZmZwb3MgPSAwOwotICAgIC8vI2lmbmRlZiBER1JfRklYIC8vICsgbmV3Ci0gICAgTTRPU0FfVUludDMyIG5hbF9zaXplX2xvdzE2LCBuYWxfc2l6ZV9oaWdoMTY7Ci0gICAgLy8jZW5kaWYgLy8gKyBlbmQgbmV3Ci0gICAgTTRPU0FfVUludDMyIGZyYW1lX3NpemUgPSAwOwotICAgIE00T1NBX1VJbnQzMiB0ZW1wID0gMDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9VSW50OCAqYnVmZjsKLQotICAgIHBfYnMgPSAmYnM7Ci0gICAgaW5zdGFuY2UgPSAoTlNXQVZDX01DU190ICopYWluc3RhbmNlOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBpbnN0YW5jZSksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIkgyNjRNQ1NfUHJvY2Vzc05BTFU6IGluc3RhbmNlIGlzIE00T1NBX05VTEwiKTsKLQotICAgIGlmKCBpbnN0YW5jZS0+aXNfZG9uZSApCi0gICAgICAgIHJldHVybiBlcnI7Ci0KLSAgICBpbmJ1ZmZbMF0gPSAweDAwOwotICAgIGluYnVmZlsxXSA9IDB4MDA7Ci0gICAgaW5idWZmWzJdID0gMHgwMDsKLSAgICBpbmJ1ZmZbM10gPSAweDAxOwotCi0KLSAgICB3aGlsZSggKE00T1NBX0ludDMyKWZyYW1lX3NpemUgPCBpbmJ1Zl9zaXplICkKLSAgICB7Ci0gICAgICAgIG1hc2tfYml0cyA9IDB4RkZGRkZGRkY7Ci0gICAgICAgIHBfYnMtPkJ1ZmZlciA9IChNNE9TQV9VSW50OCAqKShpbmJ1ZmYgKyBmcmFtZV9zaXplKTsKLQotCi0gICAgICAgIG5hbHVfaW5mbyA9ICh1bnNpZ25lZCBjaGFyKXBfYnMtPkJ1ZmZlcls0XTsKLQotICAgICAgICBvdXRidWZmW291dGJ1ZmZwb3NdID0gcF9icy0+QnVmZmVyWzBdOwotICAgICAgICBvdXRidWZmW291dGJ1ZmZwb3MgKyAxXSA9IHBfYnMtPkJ1ZmZlclsxXTsKLSAgICAgICAgb3V0YnVmZltvdXRidWZmcG9zICsgMl0gPSBwX2JzLT5CdWZmZXJbMl07Ci0gICAgICAgIG91dGJ1ZmZbb3V0YnVmZnBvcyArIDNdID0gcF9icy0+QnVmZmVyWzNdOwotICAgICAgICBvdXRidWZmW291dGJ1ZmZwb3MgKyA0XSA9IHBfYnMtPkJ1ZmZlcls0XTsKLQotICAgICAgICBwX2JzLT5CdWZmZXIgPSBwX2JzLT5CdWZmZXIgKyA1OwotCi0gICAgICAgIHBfYnMtPmJpdFBvcyA9IDA7Ci0gICAgICAgIHBfYnMtPmxhc3RUb3RhbEJpdHMgPSAwOwotICAgICAgICBwX2JzLT5udW1CaXRzSW5CdWZmZXIgPSAoIGluYnVmX3NpemUgLSBmcmFtZV9zaXplIC0gNSkgPDwgMzsKLSAgICAgICAgcF9icy0+cmVhZGFibGVCeXRlc0luQnVmZmVyID0gaW5idWZfc2l6ZSAtIGZyYW1lX3NpemUgLSA1OwotCi0gICAgICAgIHBfYnMtPnVpMzJUZW1wQnVmZiA9IDA7Ci0gICAgICAgIHBfYnMtPmk4Qml0Q250ID0gMDsKLSAgICAgICAgcF9icy0+cHVpOEJmclB0ciA9IChNNE9TQV9JbnQ4ICopcF9icy0+QnVmZmVyOwotICAgICAgICBwX2JzLT51aTMyTGFzdFR3b0J5dGVzID0gMHhGRkZGRkZGRjsKLQotICAgICAgICBIMjY0TUNTX2dldEJpdHMocF9icywgMCk7Ci0KLQotCi0gICAgICAgIG5hbF9zaXplID0gaW5idWZfc2l6ZSAtIGZyYW1lX3NpemUgLSA0OwotICAgICAgICBidWZmID0gaW5idWZmICsgZnJhbWVfc2l6ZSArIDQ7Ci0KLSAgICAgICAgd2hpbGUoIG5hbF9zaXplID4gNCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCAoIGJ1ZmZbMF0gPT0gMHgwMCkgJiYgKGJ1ZmZbMV0gPT0gMHgwMCkgJiYgKGJ1ZmZbMl0gPT0gMHgwMCkKLSAgICAgICAgICAgICAgICAmJiAoYnVmZlszXSA9PSAweDAxKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWZmID0gYnVmZiArIDE7Ci0gICAgICAgICAgICBuYWxfc2l6ZSA9IG5hbF9zaXplIC0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBuYWxfc2l6ZSA8PSA0ICkKLSAgICAgICAgewotICAgICAgICAgICAgbmFsX3NpemUgPSAwOwotICAgICAgICB9Ci0gICAgICAgIG5hbF9zaXplID0gKCBpbmJ1Zl9zaXplIC0gZnJhbWVfc2l6ZSAtIDQpIC0gbmFsX3NpemU7Ci0KLSAgICAgICAgLy8gICAgICBNNE9TQV9UUkFDRTFfMygiSDI2NE1DU19Qcm9jZXNzTkFMVSBmcmFtZSAgaW5wdXQgYnVmZiBzaXplID0gJWQgIGN1cnJlbnQgcG9zaXRpb24KLSAgICAgICAgLy89ICVkICAgbmFsIHNpemUgPSAlZCIsCi0gICAgICAgIC8vICBpbmJ1Zl9zaXplLCBmcmFtZV9zaXplLCAgbmFsX3NpemUgKyA0KTsKLSAgICAgICAgZnJhbWVfc2l6ZSArPSBuYWxfc2l6ZSArIDQ7Ci0KLQotCi0gICAgICAgIGZvcmJpZGRlbl9iaXQgPSAoIG5hbHVfaW5mbyA+PiA3KSAmIDE7Ci0gICAgICAgIG5hbF9yZWZfaWRjID0gKCBuYWx1X2luZm8gPj4gNSkgJiAzOwotICAgICAgICBuYWxfdW5pdF90eXBlID0gKG5hbHVfaW5mbykgJjB4MWY7Ci0KLSAgICAgICAgaWYoIG5hbF91bml0X3R5cGUgPT0gNSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qSURSL1BQUyBQYWNrZXQgLSBEbyBub3RoaW5nKi8KLSAgICAgICAgICAgIGluc3RhbmNlLT5pc19kb25lID0gMTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBOU1dBVkNNQ1NfaW5pdEJpdHN0cmVhbSgmaW5zdGFuY2UtPmVuY2JzKTsKLSAgICAgICAgaW5zdGFuY2UtPmVuY2JzLnN0cmVhbUJ1ZmZlciA9IG91dGJ1ZmYgKyBvdXRidWZmcG9zICsgNTsKLQotICAgICAgICBpZiggbmFsX3VuaXRfdHlwZSA9PSA4ICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkgyNjRNQ1NfUHJvY2Vzc05BTFUoKSBFcnJvcjogUFBTIik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIG5hbF91bml0X3R5cGUgPT0gNyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qU1BTIFBhY2tldCAqLwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkgyNjRNQ1NfUHJvY2Vzc05BTFUoKSBFcnJvcjogU1BTIik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCAobmFsX3VuaXRfdHlwZSA9PSA1KSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluc3RhbmNlLT5mcmFtZV9jb3VudCA9IDA7Ci0gICAgICAgICAgICBpbnN0YW5jZS0+UE9DX2xzYiA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggKG5hbF91bml0X3R5cGUgPT0gMSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaXJzdF9tYl9pbl9zbGljZSA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICBOU1dBVkNNQ1NfdUV4cFZMQygmaW5zdGFuY2UtPmVuY2JzLCBmaXJzdF9tYl9pbl9zbGljZSk7Ci0KLSAgICAgICAgICAgIHNsaWNlX3R5cGUgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICAgICAgTlNXQVZDTUNTX3VFeHBWTEMoJmluc3RhbmNlLT5lbmNicywgc2xpY2VfdHlwZSk7Ci0KLSAgICAgICAgICAgIHBpY19wYXJhbWV0ZXJfc2V0X2lkID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgICAgIE5TV0FWQ01DU191RXhwVkxDKCZpbnN0YW5jZS0+ZW5jYnMsIHBpY19wYXJhbWV0ZXJfc2V0X2lkKTsKLQotICAgICAgICAgICAgdGVtcCA9IEgyNjRNQ1NfZ2V0Qml0cyhwX2JzLAotICAgICAgICAgICAgICAgIGluc3RhbmNlLT5jbGlwX3Nwcy5sb2cyX21heF9mcmFtZV9udW1fbWludXM0ICsgNCk7Ci0gICAgICAgICAgICBOU1dBVkNNQ1NfcHV0Qml0cygmaW5zdGFuY2UtPmVuY2JzLCBpbnN0YW5jZS0+ZnJhbWVfY291bnQsCi0gICAgICAgICAgICAgICAgaW5zdGFuY2UtPmNsaXBfc3BzLmxvZzJfbWF4X2ZyYW1lX251bV9taW51czQgKyA0KTsKLQotICAgICAgICAgICAgLy8gSW4gQmFzZWxpbmUgUHJvZmlsZTogZnJhbWVfbWJzX29ubHlfZmxhZyBzaG91bGQgYmUgT04KLQotICAgICAgICAgICAgaWYoIG5hbF91bml0X3R5cGUgPT0gNSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGVtcCA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICAgICAgTlNXQVZDTUNTX3VFeHBWTEMoJmluc3RhbmNlLT5lbmNicywgdGVtcCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBpbnN0YW5jZS0+Y2xpcF9zcHMucGljX29yZGVyX2NudF90eXBlID09IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX2dldEJpdHMocF9icywKLSAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UtPmNsaXBfc3BzLmxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNAotICAgICAgICAgICAgICAgICAgICArIDQpOwotICAgICAgICAgICAgICAgIE5TV0FWQ01DU19wdXRCaXRzKCZpbnN0YW5jZS0+ZW5jYnMsIGluc3RhbmNlLT5QT0NfbHNiLAotICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS0+Y2xpcF9zcHMubG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ICsgNCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCAoIGluc3RhbmNlLT5jbGlwX3Nwcy5waWNfb3JkZXJfY250X3R5cGUgPT0gMSkKLSAgICAgICAgICAgICAgICAmJiAoaW5zdGFuY2UtPmNsaXBfc3BzLmRlbHRhX3BpY19vcmRlcl9hbHdheXNfemVyb19mbGFnKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGVtcCA9IEgyNjRNQ1NfRGVjVkxDUmVhZFNpZ25lZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICAgICAgTlNXQVZDTUNTX3NFeHBWTEMoJmluc3RhbmNlLT5lbmNicywgdGVtcCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNudCA9IHBfYnMtPmJpdFBvcyAmIDB4NzsKLQotICAgICAgICAgICAgaWYoIGNudCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY250ID0gOCAtIGNudDsKLSAgICAgICAgICAgICAgICB0ZW1wID0gSDI2NE1DU19nZXRCaXRzKHBfYnMsIGNudCk7Ci0gICAgICAgICAgICAgICAgTlNXQVZDTUNTX3B1dEJpdHMoJmluc3RhbmNlLT5lbmNicywgdGVtcCwgY250KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY250ID0gcF9icy0+Yml0UG9zID4+IDM7Ci0KLSAgICAgICAgICAgIHdoaWxlKCBjbnQgPCAobmFsX3NpemUgLSAyKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGVtcCA9IEgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCA4KTsKLSAgICAgICAgICAgICAgICBOU1dBVkNNQ1NfcHV0Qml0cygmaW5zdGFuY2UtPmVuY2JzLCB0ZW1wLCA4KTsKLSAgICAgICAgICAgICAgICBjbnQgPSBwX2JzLT5iaXRQb3MgPj4gMzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGVtcCA9IEgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCA4KTsKLQotICAgICAgICAgICAgaWYoIHRlbXAgIT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY250ID0gMDsKLQotICAgICAgICAgICAgICAgIHdoaWxlKCAoIHRlbXAgJiAweDEpID09IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY250Kys7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXAgPSB0ZW1wID4+IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNudCsrOwotICAgICAgICAgICAgICAgIHRlbXAgPSB0ZW1wID4+IDE7Ci0KLSAgICAgICAgICAgICAgICBpZiggOCAtIGNudCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBOU1dBVkNNQ1NfcHV0Qml0cygmaW5zdGFuY2UtPmVuY2JzLCB0ZW1wLCAoOCAtIGNudCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIE5TV0FWQ01DU19wdXRSYnNwVGJpdHMoJmluc3RhbmNlLT5lbmNicyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIGluc3RhbmNlLT5lbmNicy5iaXRQb3MgJSA4ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE5TV0FWQ01DU19wdXRCaXRzKCZpbnN0YW5jZS0+ZW5jYnMsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAoOCAtIGluc3RhbmNlLT5lbmNicy5iaXRQb3MgJSA4KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0ZW1wID0gaW5zdGFuY2UtPmVuY2JzLmJ5dGVDbnQ7Ci0gICAgICAgICAgICB0ZW1wID0gdGVtcCArIDE7Ci0KLSAgICAgICAgICAgIG91dGJ1ZmZbb3V0YnVmZnBvc10gPSAoTTRPU0FfVUludDgpKCggdGVtcCA+PiAyNCkgJiAweEZGKTsKLSAgICAgICAgICAgIG91dGJ1ZmZbb3V0YnVmZnBvcyArIDFdID0gKE00T1NBX1VJbnQ4KSgoIHRlbXAgPj4gMTYpICYgMHhGRik7Ci0gICAgICAgICAgICBvdXRidWZmW291dGJ1ZmZwb3MgKyAyXSA9IChNNE9TQV9VSW50OCkoKCB0ZW1wID4+IDgpICYgMHhGRik7Ci0gICAgICAgICAgICBvdXRidWZmW291dGJ1ZmZwb3MgKyAzXSA9IChNNE9TQV9VSW50OCkoKHRlbXApICYweEZGKTsKLSAgICAgICAgICAgIG91dGJ1ZmZwb3MgPSBvdXRidWZmcG9zICsgdGVtcCArIDQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwX2JzLT5CdWZmZXIgPSBwX2JzLT5CdWZmZXIgLSA1OwotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopICZvdXRidWZmW291dGJ1ZmZwb3NdLAotICAgICAgICAgICAgICAgICh2b2lkICopcF9icy0+QnVmZmVyLCBuYWxfc2l6ZSArIDQpOwotCi0gICAgICAgICAgICBvdXRidWZmW291dGJ1ZmZwb3NdID0gKE00T1NBX1VJbnQ4KSgobmFsX3NpemUgPj4gMjQpJiAweEZGKTsKLSAgICAgICAgb3V0YnVmZltvdXRidWZmcG9zICsgMV0gPSAoTTRPU0FfVUludDgpKChuYWxfc2l6ZSA+PiAxNikmIDB4RkYpOzsKLSAgICAgICAgb3V0YnVmZltvdXRidWZmcG9zICsgMl0gPSAoTTRPU0FfVUludDgpKChuYWxfc2l6ZSA+PiA4KSYgMHhGRik7OwotICAgICAgICBvdXRidWZmW291dGJ1ZmZwb3MgKyAzXSA9IChNNE9TQV9VSW50OCkoKG5hbF9zaXplKSYgMHhGRik7OwotCi0gICAgICAgICAgICBvdXRidWZmcG9zID0gb3V0YnVmZnBvcyArIG5hbF9zaXplICsgNDsKLSAgICAgICAgfQotICAgIH0KLQotICAgICpvdXRidWZfc2l6ZSA9IG91dGJ1ZmZwb3M7Ci0KLSAgICBpbnN0YW5jZS0+UE9DX2xzYiA9IGluc3RhbmNlLT5QT0NfbHNiICsgMTsKLQotICAgIGlmKCBpbnN0YW5jZS0+UE9DX2xzYiA9PSBpbnN0YW5jZS0+UE9DX2xzYl9tb2QgKQotICAgIHsKLSAgICAgICAgaW5zdGFuY2UtPlBPQ19sc2IgPSAwOwotICAgIH0KLSAgICBpbnN0YW5jZS0+ZnJhbWVfY291bnQgPSBpbnN0YW5jZS0+ZnJhbWVfY291bnQgKyAxOwotCi0gICAgaWYoIGluc3RhbmNlLT5mcmFtZV9jb3VudCA9PSBpbnN0YW5jZS0+ZnJhbWVfbW9kX2NvdW50ICkKLSAgICB7Ci0gICAgICAgIGluc3RhbmNlLT5mcmFtZV9jb3VudCA9IDA7Ci0gICAgfQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgICBNNE1DU19jb252ZXRGcm9tQnl0ZVN0cmVhbXRvTkFMU3RyZWFtKCAgTTRPU0FfVUludDggKmluYnVmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgaW5idWZfc2l6ZSApCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfVUludDMyIGZyYW1lc2l6ZSA9IDA7Ci0gICAgTTRPU0FfVUludDMyIG5hbF9zaXplID0wOwotICAgIE00T1NBX1VJbnQ4ICpidWZmOwotCi0KLSAgICB3aGlsZShmcmFtZXNpemUgPCBpbmJ1Zl9zaXplKQotICAgIHsKLSAgICAgICAgICAgIG5hbF9zaXplID0gaW5idWZfc2l6ZSAtIGZyYW1lc2l6ZSAtIDQ7Ci0gICAgICAgICAgICBidWZmID0gIGluYnVmZiArIGZyYW1lc2l6ZSArIDQ7Ci0KLSAgICAgICAgICAgIHdoaWxlKG5hbF9zaXplID4gNCl7Ci0gICAgICAgICAgICAgICAgaWYoKGJ1ZmZbMF0gPT0gMHgwMCkgJiYKLSAgICAgICAgICAgICAgICAoYnVmZlsxXSA9PSAweDAwKSAmJgotICAgICAgICAgICAgICAgIChidWZmWzJdID09IDB4MDApICYmCi0gICAgICAgICAgICAgICAgKGJ1ZmZbM10gPT0gMHgwMSkpewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnVmZiA9IGJ1ZmYgKyAxOwotICAgICAgICAgICAgICAgIG5hbF9zaXplID0gbmFsX3NpemUgLTE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKG5hbF9zaXplIDw9IDQpewotICAgICAgICAgICAgICAgIG5hbF9zaXplID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5hbF9zaXplID0gKGluYnVmX3NpemUgLSBmcmFtZXNpemUgLSA0KSAtIG5hbF9zaXplOwotCi0gICAgICAgIGluYnVmZltmcmFtZXNpemUgKyAwXSAgPSAoTTRPU0FfVUludDgpKChuYWxfc2l6ZSA+PiAyNCkmIDB4RkYpOwotICAgICAgICBpbmJ1ZmZbZnJhbWVzaXplICsgMV0gID0gKE00T1NBX1VJbnQ4KSgobmFsX3NpemUgPj4gMTYpJiAweEZGKTsKLSAgICAgICAgaW5idWZmW2ZyYW1lc2l6ZSArIDJdICA9IChNNE9TQV9VSW50OCkoKG5hbF9zaXplID4+IDgpJiAweEZGKTsKLSAgICAgICAgaW5idWZmW2ZyYW1lc2l6ZSArIDNdICA9IChNNE9TQV9VSW50OCkoKG5hbF9zaXplICkmIDB4RkYpOwotICAgICAgICBmcmFtZXNpemUgKz0gbmFsX3NpemUgKyA0OwotCi0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNE1DU19jb252ZXRGcm9tQnl0ZVN0cmVhbXRvTkFMU3RyZWFtIGZyYW1lc2l6ZSA9ICV4IG5hbHNpemUgPSAleCIsCi0gICAgICAgICAgICBmcmFtZXNpemUsIG5hbF9zaXplKQotICAgIH0KLQotICAgIHJldHVybiAgZXJyOwotfQotCi0KLU00T1NBX0VSUiBIMjY0TUNTX0ZyZWVpbnN0YW5jZSggTlNXQVZDX01DU190ICppbnN0YW5jZSApCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IGluc3RhbmNlKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiSDI2NE1DU19GcmVlaW5zdGFuY2U6IGluc3RhbmNlIGlzIE00T1NBX05VTEwiKTsKLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IGluc3RhbmNlLT5lbmNvZGVyX3Bwcy5zbGljZV9ncm91cF9pZCApCi0gICAgewotICAgICAgICBmcmVlKGluc3RhbmNlLT5lbmNvZGVyX3Bwcy5zbGljZV9ncm91cF9pZCk7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gaW5zdGFuY2UtPnBfZW5jb2Rlcl9zcHMgKQotICAgIHsKLSAgICAgICAgZnJlZShpbnN0YW5jZS0+cF9lbmNvZGVyX3Nwcyk7Ci0gICAgICAgIGluc3RhbmNlLT5wX2VuY29kZXJfc3BzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBpbnN0YW5jZS0+cF9lbmNvZGVyX3BwcyApCi0gICAgewotICAgICAgICBmcmVlKGluc3RhbmNlLT5wX2VuY29kZXJfcHBzKTsKLSAgICAgICAgaW5zdGFuY2UtPnBfZW5jb2Rlcl9wcHMgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IGluc3RhbmNlLT5tX3BGaW5hbERTSSApCi0gICAgewotICAgICAgICBmcmVlKGluc3RhbmNlLT5tX3BGaW5hbERTSSk7Ci0gICAgICAgIGluc3RhbmNlLT5tX3BGaW5hbERTSSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gaW5zdGFuY2UgKQotICAgIHsKLSAgICAgICAgZnJlZShpbnN0YW5jZSk7Ci0gICAgICAgIGluc3RhbmNlID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfZ2V0VmVyc2lvbihNNF9WZXJzaW9uSW5mbyogcFZlcnNpb25JbmZvKTsKLSAqIEBicmllZiAgICBHZXQgdGhlIE1DUyB2ZXJzaW9uLgotICogQG5vdGUgQ2FuIGJlIGNhbGxlZCBhbnl0aW1lLiBEbyBub3QgbmVlZCBhbnkgY29udGV4dC4KLSAqIEBwYXJhbSAgICBwVmVyc2lvbkluZm8gICAgICAgIChPVVQpIFBvaW50ZXIgdG8gYSB2ZXJzaW9uIGluZm8gc3RydWN0dXJlCi0gKiBAcmV0dXJuICAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUjogICAgcFZlcnNpb25JbmZvIGlzIE00T1NBX05VTEwgKElmIERlYnVnIExldmVsID49IDIpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19nZXRWZXJzaW9uKCBNNF9WZXJzaW9uSW5mbyAqcFZlcnNpb25JbmZvICkKLXsKLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRNQ1NfZ2V0VmVyc2lvbiBjYWxsZWQgd2l0aCBwVmVyc2lvbkluZm89MHgleCIsCi0gICAgICAgIHBWZXJzaW9uSW5mbyk7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFZlcnNpb25JbmZvKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1NfZ2V0VmVyc2lvbjogcFZlcnNpb25JbmZvIGlzIE00T1NBX05VTEwiKTsKLQotICAgIHBWZXJzaW9uSW5mby0+bV9tYWpvciA9IE00TUNTX1ZFUlNJT05fTUFKT1I7Ci0gICAgcFZlcnNpb25JbmZvLT5tX21pbm9yID0gTTRNQ1NfVkVSU0lPTl9NSU5PUjsKLSAgICBwVmVyc2lvbkluZm8tPm1fcmV2aXNpb24gPSBNNE1DU19WRVJTSU9OX1JFVklTSU9OOwotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19nZXRWZXJzaW9uKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIEluaXRpYWxpemVzIHRoZSBNQ1MgKGFsbG9jYXRlcyBhbiBleGVjdXRpb24gY29udGV4dCkuCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKE9VVCkgUG9pbnRlciBvbiB0aGUgTUNTIGNvbnRleHQgdG8gYWxsb2NhdGUKLSAqIEBwYXJhbSAgICBwRmlsZVJlYWRQdHJGY3QgICAgIChJTikgUG9pbnRlciB0byBPU0FMIGZpbGUgcmVhZGVyIGZ1bmN0aW9ucwotICogQHBhcmFtICAgIHBGaWxlV3JpdGVQdHJGY3QgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSB3cml0ZXIgZnVuY3Rpb25zCi0gKiBAcmV0dXJuICAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChJZiBEZWJ1ZyBMZXZlbCA+PSAyKQotICogQHJldHVybiAgIE00RVJSX0FMTE9DOiAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotTTRPU0FfRVJSIE00TUNTX2luaXQoIE00TUNTX0NvbnRleHQgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyICpwRmlsZVJlYWRQdHJGY3QsCi0gICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciAqcEZpbGVXcml0ZVB0ckZjdCApCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIE00T1NBX1RSQUNFM18zKAotICAgICAgICAiTTRNQ1NfaW5pdCBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4LCBwRmlsZVJlYWRQdHJGY3Q9MHgleCwgcEZpbGVXcml0ZVB0ckZjdD0weCV4IiwKLSAgICAgICAgcENvbnRleHQsIHBGaWxlUmVhZFB0ckZjdCwgcEZpbGVXcml0ZVB0ckZjdCk7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19pbml0OiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBGaWxlUmVhZFB0ckZjdCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00TUNTX2luaXQ6IHBGaWxlUmVhZFB0ckZjdCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBGaWxlV3JpdGVQdHJGY3QpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19pbml0OiBwRmlsZVdyaXRlUHRyRmN0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICogQWxsb2NhdGUgdGhlIE1DUyBjb250ZXh0IGFuZCByZXR1cm4gaXQgdG8gdGhlIHVzZXIgKi8KLSAgICBwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00TUNTX0ludGVybmFsQ29udGV4dCksCi0gICAgICAgIE00TUNTLCAoTTRPU0FfQ2hhciAqKSJNNE1DU19JbnRlcm5hbENvbnRleHQiKTsKLSAgICAqcENvbnRleHQgPSBwQzsKLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00TUNTX2luaXQoKTogdW5hYmxlIHRvIGFsbG9jYXRlIE00TUNTX0ludGVybmFsQ29udGV4dCwgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEluaXQgdGhlIGNvbnRleHQuIEFsbCBwb2ludGVycyBtdXN0IGJlIGluaXRpYWxpemVkIHRvIE00T1NBX05VTEwKLSAgICAqIGJlY2F1c2UgQ2xlYW5VcCgpIGNhbiBiZSBjYWxsZWQganVzdCBhZnRlciBJbml0KCkuICovCi0gICAgcEMtPlN0YXRlID0gTTRNQ1Nfa1N0YXRlX0NSRUFURUQ7Ci0gICAgcEMtPnBPc2FGaWxlUmVhZFB0ciA9IHBGaWxlUmVhZFB0ckZjdDsKLSAgICBwQy0+cE9zYUZpbGVXcml0UHRyID0gcEZpbGVXcml0ZVB0ckZjdDsKLSAgICBwQy0+VmlkZW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9OT1NUUkVBTTsKLSAgICBwQy0+QXVkaW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9OT1NUUkVBTTsKLSAgICBwQy0+bm9hdWRpbyA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5ub3ZpZGVvID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPnVpUHJvZ3Jlc3MgPSAwOwotCi0gICAgLyoqCi0gICAgKiBSZWFkZXIgc3R1ZmYgKi8KLSAgICBwQy0+cElucHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPklucHV0RmlsZVR5cGUgPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfVW5zdXBwb3J0ZWQ7Ci0gICAgcEMtPmJGaWxlT3BlbmVkSW5GYXN0TW9kZSA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5wUmVhZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmJVbnN1cHBvcnRlZFZpZGVvRm91bmQgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+YlVuc3VwcG9ydGVkQXVkaW9Gb3VuZCA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5pQXVkaW9DdHNPZmZzZXQgPSAwOwotICAgIC8qIEZpcnN0IHRlbXBvcmFyeSB2aWRlbyBBVSB0byBoYXZlIG1vcmUgcHJlY2lzZSBlbmQgdmlkZW8gY3V0Ki8KLSAgICBwQy0+UmVhZGVyVmlkZW9BVTEubV9zdHJ1Y3RTaXplID0gMDsKLSAgICAvKiBTZWNvbmQgdGVtcG9yYXJ5IHZpZGVvIEFVIHRvIGhhdmUgbW9yZSBwcmVjaXNlIGVuZCB2aWRlbyBjdXQqLwotICAgIHBDLT5SZWFkZXJWaWRlb0FVMi5tX3N0cnVjdFNpemUgPSAwOwotICAgIHBDLT5SZWFkZXJBdWRpb0FVMS5tX3N0cnVjdFNpemUgPSAwOwotICAgIHBDLT5SZWFkZXJBdWRpb0FVMi5tX3N0cnVjdFNpemUgPSAwOwotICAgIHBDLT5tX2F1ZGlvQVVEdXJhdGlvbiA9IDA7Ci0gICAgcEMtPm1fcERhdGFBZGRyZXNzMSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm1fcERhdGFBZGRyZXNzMiA9IE00T1NBX05VTEw7Ci0gICAgLyogRmlyc3QgdGVtcG9yYXJ5IHZpZGVvIEFVIGRhdGEgdG8gaGF2ZSBtb3JlIHByZWNpc2UgZW5kIHZpZGVvIGN1dCovCi0gICAgcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxID0gTTRPU0FfTlVMTDsKLSAgICAvKiBTZWNvbmQgdGVtcG9yYXJ5IHZpZGVvIEFVIGRhdGEgdG8gaGF2ZSBtb3JlIHByZWNpc2UgZW5kIHZpZGVvIGN1dCovCi0gICAgcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MyID0gTTRPU0FfTlVMTDsKLQotICAgIC8qKgotICAgICogVmlkZW8gZGVjb2RlciBzdHVmZiAqLwotICAgIHBDLT5wVmlEZWNDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+ZFZpRGVjU3RhcnRpbmdDdHMgPSAwLjA7Ci0gICAgcEMtPmlWaWRlb0JlZ2luRGVjSW5jciA9IDA7Ci0gICAgcEMtPmRWaURlY0N1cnJlbnRDdHMgPSAwLjA7Ci0gICAgcEMtPmRDdHNJbmNyZW1lbnQgPSAwLjA7Ci0gICAgcEMtPmlzUmVuZGVyRHVwID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKioKLSAgICAqIFZpZGVvIGVuY29kZXIgc3R1ZmYgKi8KLSAgICBwQy0+cFZpRW5jQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBQcmVSZXNpemVGcmFtZSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnVpRW5jVmlkZW9CaXRyYXRlID0gMDsKLSAgICBwQy0+ZW5jb2RlclN0YXRlID0gTTRNQ1Nfa05vRW5jb2RlcjsKLQotICAgIC8qKgotICAgICogQXVkaW8gZGVjb2RlciBzdHVmZiAqLwotICAgIHBDLT5wQXVkaW9EZWNDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+QXVkaW9EZWNCdWZmZXJJbi5tX2RhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+QXVkaW9EZWNCdWZmZXJJbi5tX2J1ZmZlclNpemUgPSAwOwotICAgIHBDLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplID0gMDsKLSAgICBwQy0+cFBvc0luRGVjQnVmZmVyT3V0ID0gTTRPU0FfTlVMTDsKLSAgICAvKioKLSAgICAqIFNzcmMgc3R1ZmYgKi8KLSAgICBwQy0+cFNzcmNCdWZmZXJJbiA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBTc3JjQnVmZmVyT3V0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmlTc3JjTmJTYW1wbEluID0gMDsKLSAgICBwQy0+aVNzcmNOYlNhbXBsT3V0ID0gMDsKLSAgICBwQy0+U3NyY1NjcmF0Y2ggPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wTFZBdWRpb1Jlc2FtcGxlciA9IE00T1NBX05VTEw7Ci0gICAgLyoqCi0gICAgKiBBdWRpbyBlbmNvZGVyICovCi0gICAgcEMtPnBBdWRpb0VuY0N0eHQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wQXVkaW9FbmNEU0kuaW5mb1NpemUgPSAwOwotICAgIHBDLT5wQXVkaW9FbmNEU0kucEluZm8gPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wQXVkaW9FbmNvZGVyQnVmZmVyID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFBvc0luQXVkaW9FbmNvZGVyQnVmZmVyID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+YXVkaW9FbmNvZGVyR3JhbnVsYXJpdHkgPSAwOwotCi0gICAgLyoqCi0gICAgKiBXcml0ZXIgc3R1ZmYgKi8KLSAgICBwQy0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wVGVtcG9yYXJ5RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBXcml0ZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+dWlWaWRlb0FVQ291bnQgPSAwOwotICAgIHBDLT51aVZpZGVvTWF4QXVTaXplID0gMDsKLSAgICBwQy0+dWlWaWRlb01heENodW5ja1NpemUgPSAwOwotICAgIHBDLT51aUF1ZGlvQVVDb3VudCA9IDA7Ci0gICAgcEMtPnVpQXVkaW9NYXhBdVNpemUgPSAwOwotCi0gICAgcEMtPnVpQXVkaW9DdHMgPSAwOwotICAgIHBDLT5iX2lzUmF3V3JpdGVyID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPnBPdXRwdXRQQ01maWxlID0gTTRPU0FfTlVMTDsKLQotICAgIC8qIEVuY29kaW5nIGNvbmZpZyAqLwotICAgIHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0ID0gTTRFTkNPREVSX2tOVUxMOyAvKio8IE5vIGZvcm1hdCBzZXQgeWV0ICovCi0gICAgcEMtPkVuY29kaW5nV2lkdGggPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgTm8gc2l6ZSBzZXQgeWV0ICovCi0gICAgcEMtPkVuY29kaW5nSGVpZ2h0ID0gMDsgICAgICAgICAgICAgICAgICAgIC8qKjwgTm8gc2l6ZSBzZXQgeWV0ICovCi0gICAgcEMtPkVuY29kaW5nVmlkZW9GcmFtZXJhdGUgPSAwOyAgICAgICAgICAgIC8qKjwgTm8gZnJhbWVyYXRlIHNldCB5ZXQgKi8KLQotICAgIHBDLT51aUJlZ2luQ3V0VGltZSA9IDA7ICAgICAgICAgICAgICAgICAgICAvKio8IE5vIGJlZ2luIGN1dCAqLwotICAgIHBDLT51aUVuZEN1dFRpbWUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAvKio8IE5vIGVuZCBjdXQgKi8KLSAgICBwQy0+dWlNYXhGaWxlU2l6ZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBObyBsaW1pdCAqLwotICAgIHBDLT51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgIE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlOyAvKio8IE5vIGJpdHJhdGUgc2V0IHlldCAqLwotICAgIHBDLT51aVZpZGVvQml0cmF0ZSA9Ci0gICAgICAgIE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlOyAvKio8IE5vIGJpdHJhdGUgc2V0IHlldCAqLwotCi0gICAgcEMtPldyaXRlclZpZGVvU3RyZWFtLnN0cmVhbVR5cGUgPSBNNFNZU19rVmlkZW9Vbmtub3duOwotICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uSGVhZGVyLnBCdWYgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1UeXBlID0gTTRTWVNfa0F1ZGlvVW5rbm93bjsKLQotICAgIHBDLT5vdXRwdXRWaWRlb1RpbWVzY2FsZSA9IDA7Ci0KLSAgICAvKkZCIDIwMDgvMTAvMjA6IGFkZCBtZWRpYSByZW5kZXJpbmcgcGFyYW1ldGVyIGFuZCBBSVIgY29udGV4dCB0byBrZWVwIG1lZGlhIGFzcGVjdCByYXRpbyovCi0gICAgcEMtPk1lZGlhUmVuZGVyaW5nID0gTTRNQ1Nfa1Jlc2l6aW5nOwotICAgIHBDLT5tX2Fpcl9jb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAvKiovCi0KLSAgICAvKioKLSAgICAqIEZsQiAyMDA5LjAzLjA0OiBhZGQgYXVkaW8gRWZmZWN0cyovCi0gICAgcEMtPnBFZmZlY3RzID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bmJFZmZlY3RzID0gMDsKLSAgICBwQy0+cEFjdGl2ZUVmZmVjdE51bWJlciA9IC0xOwotICAgIC8qKi8KLQotICAgIC8qCi0gICAgKiBSZXNldCBwb2ludGVycyBmb3IgbWVkaWEgYW5kIGNvZGVjcyBpbnRlcmZhY2VzICovCi0gICAgZXJyID0gTTRNQ1NfY2xlYXJJbnRlcmZhY2VUYWJsZXMocEMpOwotICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgLyoKLSAgICAqICBDYWxsIHRoZSBtZWRpYSBhbmQgY29kZWNzIHN1YnNjcmlwdGlvbiBtb2R1bGUgKi8KLSAgICBlcnIgPSBNNE1DU19zdWJzY3JpYmVNZWRpYUFuZENvZGVjKHBDKTsKLSAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotI2lmZGVmIE00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRQotICAgIC8qKgotICAgICogSW5pdGlhbGl6ZSB0aGUgU3RpbGwgcGljdHVyZSBwYXJ0IG9mIE1DUyovCi0KLSAgICBlcnIgPSBNNE1DU19zdGlsbFBpY0luaXQocEMsIHBGaWxlUmVhZFB0ckZjdCwgcEZpbGVXcml0ZVB0ckZjdCk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICBwQy0+bV9iSXNTdGlsbFBpY3R1cmUgPSBNNE9TQV9GQUxTRTsKLQotI2VuZGlmIC8qTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFKi8KLQotICAgIHBDLT5tX3BJbnN0YW5jZSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPkgyNjRNQ1NUZW1wQnVmZmVyID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+SDI2NE1DU1RlbXBCdWZmZXJTaXplID0gMDsKLSAgICBwQy0+SDI2NE1DU1RlbXBCdWZmZXJEYXRhU2l6ZSA9IDA7Ci0gICAgcEMtPmJIMjY0VHJpbSA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyogRmxhZyB0byBnZXQgdGhlIGxhc3QgZGVjb2RlZCBmcmFtZSBjdHMgKi8KLSAgICBwQy0+Ykxhc3REZWNvZGVkRnJhbWVDVFMgPSBNNE9TQV9GQUxTRTsKLQotICAgIGlmKCBwQy0+bV9wSW5zdGFuY2UgPT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBlcnIgPSBIMjY0TUNTX0dldGluc3RhbmNlKCZwQy0+bV9wSW5zdGFuY2UpOwotICAgIH0KLSAgICBwQy0+YkV4dE9NWEF1ZERlY29kZXIgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfaW5pdCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19vcGVuKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1ZvaWQqIHBGaWxlSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwRmlsZU91dCwgTTRPU0FfVm9pZCogcFRlbXBGaWxlKTsKLSAqIEBicmllZiAgIFNldCB0aGUgTUNTIGlucHV0IGFuZCBvdXRwdXQgZmlsZXMuCi0gKiBAbm90ZSAgICBJdCBvcGVucyB0aGUgaW5wdXQgZmlsZSwgYnV0IHRoZSBvdXRwdXQgZmlsZSBpcyBub3QgY3JlYXRlZCB5ZXQuCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBGaWxlSW4gICAgICAgICAgICAgKElOKSBJbnB1dCBmaWxlIHRvIHRyYW5zY29kZSAoVGhlIHR5cGUgb2YgdGhpcyBwYXJhbWV0ZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVSTCwgcGlwZS4uLikgZGVwZW5kcyBvbiB0aGUgT1NBTCBpbXBsZW1lbnRhdGlvbikuCi0gKiBAcGFyYW0gICBtZWRpYVR5cGUgICAgICAgICAgIChJTikgQ29udGFpbmVyIHR5cGUgKC4zZ3AsLmFtcixtcDMgLi4uKSBvZiBpbnB1dCBmaWxlLgotICogQHBhcmFtICAgcEZpbGVPdXQgICAgICAgICAgICAoSU4pIE91dHB1dCBmaWxlIHRvIGNyZWF0ZSAgKFRoZSB0eXBlIG9mIHRoaXMgcGFyYW1ldGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVUkwsIHBpcGUuLi4pIGRlcGVuZHMgb24gdGhlIE9TQUwgaW1wbGVtZW50YXRpb24pLgotICogQHBhcmFtICAgcFRlbXBGaWxlICAgICAgICAgICAoSU4pIFRlbXBvcmFyeSBmaWxlIGZvciB0aGUgY29uc3RhbnQgbWVtb3J5IHdyaXRlciB0bwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUgbWV0YWRhdGEgKCJtb292LmJpbiIpLgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICBNNEVSUl9BTExPQzogICAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICogQHJldHVybiAgTTRFUlJfRklMRV9OT1RfRk9VTkQ6ICAgVGhlIGlucHV0IGZpbGUgaGFzIG5vdCBiZWVuIGZvdW5kCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfSU5WQUxJRF9JTlBVVF9GSUxFOiAgIFRoZSBpbnB1dCBmaWxlIGlzIG5vdCBhIHZhbGlkIGZpbGUsIG9yIGlzIGNvcnJ1cHRlZAotICogQHJldHVybiAgTTRNQ1NfRVJSX0lOUFVUX0ZJTEVfQ09OVEFJTlNfTk9fU1VQUE9SVEVEX1NUUkVBTTogIFRoZSBpbnB1dCBmaWxlIGNvbnRhaW5zIG5vCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkIGF1ZGlvIG9yIHZpZGVvIHN0cmVhbQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1Nfb3BlbiggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVm9pZCAqcEZpbGVJbiwKLSAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIElucHV0RmlsZVR5cGUsIE00T1NBX1ZvaWQgKnBGaWxlT3V0LAotICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCAqcFRlbXBGaWxlICkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCAqKShwQ29udGV4dCk7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIE00UkVBREVSX01lZGlhRmFtaWx5IG1lZGlhRmFtaWx5OwotICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyOwotCi0gICAgTTRPU0FfVFJBQ0UyXzMoCi0gICAgICAgICJNNE1DU19vcGVuIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgsIHBGaWxlSW49MHgleCwgcEZpbGVPdXQ9MHgleCIsCi0gICAgICAgIHBDb250ZXh0LCBwRmlsZUluLCBwRmlsZU91dCk7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19vcGVuOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBGaWxlSW4pLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19vcGVuOiBwRmlsZUluIGlzIE00T1NBX05VTEwiKTsKLQotICAgIGlmKCAoIElucHV0RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0pQRykKLSAgICAgICAgfHwgKElucHV0RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX1BORykKLSAgICAgICAgfHwgKElucHV0RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0dJRikKLSAgICAgICAgfHwgKElucHV0RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0JNUCkgKQotICAgIHsKLSNpZmRlZiBNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUKLSAgICAgICAgLyoqCi0gICAgICAgICogSW5kaWNhdGUgdGhhdCB3ZSBtdXN0IHVzZSB0aGUgc3RpbGwgcGljdHVyZSBmdW5jdGlvbnMqLwotCi0gICAgICAgIHBDLT5tX2JJc1N0aWxsUGljdHVyZSA9IE00T1NBX1RSVUU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2FsbCB0aGUgc3RpbGwgcGljdHVyZSBNQ1MgZnVuY3Rpb25zKi8KLSAgICAgICAgcmV0dXJuIE00TUNTX3N0aWxsUGljT3BlbihwQywgcEZpbGVJbiwgSW5wdXRGaWxlVHlwZSwgcEZpbGVPdXQpOwotCi0jZWxzZQotCi0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00TUNTX29wZW46IFN0aWxsIHBpY3R1cmUgaXMgbm90IHN1cHBvcnRlZCB3aXRoIHRoaXMgdmVyc2lvbiBvZiBNQ1MiKTsKLSAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9JTlBVVF9GSUxFX0NPTlRBSU5TX05PX1NVUFBPUlRFRF9TVFJFQU07Ci0KLSNlbmRpZiAvKk00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRSovCi0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIHN0YXRlIGF1dG9tYXRvbiAqLwotICAgIGlmKCBNNE1DU19rU3RhdGVfQ1JFQVRFRCAhPSBwQy0+U3RhdGUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX29wZW4oKTogV3JvbmcgU3RhdGUgKCVkKSwgcmV0dXJuaW5nIE00RVJSX1NUQVRFIiwKLSAgICAgICAgICAgIHBDLT5TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKiBDb3B5IGZ1bmN0aW9uIGlucHV0IHBhcmFtZXRlcnMgaW50byBvdXIgY29udGV4dCAqLwotICAgIHBDLT5wSW5wdXRGaWxlID0gcEZpbGVJbjsKLSAgICBwQy0+SW5wdXRGaWxlVHlwZSA9IElucHV0RmlsZVR5cGU7Ci0gICAgcEMtPnBPdXRwdXRGaWxlID0gcEZpbGVPdXQ7Ci0gICAgcEMtPnBUZW1wb3JhcnlGaWxlID0gcFRlbXBGaWxlOwotICAgIHBDLT51aVByb2dyZXNzID0gMDsKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiBPcGVuIGlucHV0IGZpbGUgd2l0aCB0aGUgcmVhZGVyICovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgZXJyID0gTTRNQ1Nfc2V0Q3VycmVudFJlYWRlcihwQ29udGV4dCwgcEMtPklucHV0RmlsZVR5cGUpOwotICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgLyoqCi0gICAgKiBSZXNldCByZWFkZXIgcmVsYXRlZCB2YXJpYWJsZXMgKi8KLSAgICBwQy0+VmlkZW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9OT1NUUkVBTTsKLSAgICBwQy0+QXVkaW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9OT1NUUkVBTTsKLSAgICBwQy0+cFJlYWRlclZpZGVvU3RyZWFtID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtID0gTTRPU0FfTlVMTDsKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qIEluaXRpYWxpemVzIHRoZSByZWFkZXIgc2hlbGwgYW5kIG9wZW4gdGhlIGRhdGEgZmlsZSAqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdENyZWF0ZSgmcEMtPnBSZWFkZXJDb250ZXh0KTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1Nfb3BlbigpOiBtX3BSZWFkZXItPm1fcEZjdENyZWF0ZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIExpbmsgdGhlIHJlYWRlciBpbnRlcmZhY2UgdG8gdGhlIHJlYWRlciBjb250ZXh0ICovCi0gICAgcEMtPm1fcFJlYWRlckRhdGFJdC0+bV9yZWFkZXJDb250ZXh0ID0gcEMtPnBSZWFkZXJDb250ZXh0OwotCi0gICAgLyoqCi0gICAgKiBTZXQgdGhlIHJlYWRlciBzaGVsbCBmaWxlIGFjY2VzcyBmdW5jdGlvbnMgKi8KLSAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RTZXRPcHRpb24ocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICBNNFJFQURFUl9rT3B0aW9uSURfU2V0T3NhRmlsZVJlYWRlckZjdHNQdHIsCi0gICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKXBDLT5wT3NhRmlsZVJlYWRQdHIpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19vcGVuKCk6IG1fcFJlYWRlci0+bV9wRmN0U2V0T3B0aW9uIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotI2lmZGVmIE00TUNTX1dJVEhfRkFTVF9PUEVOCi0KLSAgICBpZiggTTRPU0FfRkFMU0UgPT0gcEMtPmJGaWxlT3BlbmVkSW5GYXN0TW9kZSApCi0gICAgewotICAgICAgICBNNE9TQV9Cb29sIHRydWVWYWx1ZSA9IE00T1NBX1RSVUU7Ci0KLSAgICAgICAgLyogRm9yIGZpcnN0IGNhbGwgdXNlIGZhc3Qgb3BlbiBtb2RlICovCi0gICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdFNldE9wdGlvbihwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICBNNFJFQURFUl8zR1Bfa09wdGlvbklEX0Zhc3RPcGVuTW9kZSwgJnRydWVWYWx1ZSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPmJGaWxlT3BlbmVkSW5GYXN0TW9kZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1Nfb3BlbigpOiBNNFJFQURFUl8zR1Bfa09wdGlvbklEX0Zhc3RPcGVuTW9kZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0KLSAgICAgICAgICAgIGlmKCAoICggKE00T1NBX1VJbnQzMilNNEVSUl9CQURfT1BUSU9OX0lEKSA9PSBlcnIpCi0gICAgICAgICAgICAgICAgfHwgKCggKE00T1NBX1VJbnQzMilNNEVSUl9QQVJBTUVURVIpID09IGVycikgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIE5vdCBmYXRhbCwgc29tZSByZWFkZXJzIG1heSBub3Qgc3VwcG9ydCBmYXN0IG9wZW4gbW9kZSAqLwotICAgICAgICAgICAgICAgIHBDLT5iRmlsZU9wZW5lZEluRmFzdE1vZGUgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX0Jvb2wgZmFsc2VWYWx1ZSA9IE00T1NBX0ZBTFNFOwotCi0gICAgICAgIC8qIEZvciBzZWNvbmQgY2FsbCB1c2Ugbm9ybWFsIG9wZW4gbW9kZSAqLwotICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RTZXRPcHRpb24ocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgTTRSRUFERVJfM0dQX2tPcHRpb25JRF9GYXN0T3Blbk1vZGUsICZmYWxzZVZhbHVlKTsKLSAgICB9Ci0KLSNlbmRpZiAvKiBNNE1DU19XSVRIX0ZBU1RfT1BFTiAqLwotCi0gICAgLyoqCi0gICAgKiBPcGVuIHRoZSBpbnB1dCBmaWxlICovCi0KLSAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RPcGVuKHBDLT5wUmVhZGVyQ29udGV4dCwgcEMtPnBJbnB1dEZpbGUpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiB1aUR1bW15LCB1aUNvcmVJZDsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX29wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RPcGVuIHJldHVybnMgMHgleCIsIGVycik7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogSWYgdGhlIGVycm9yIGlzIGZyb20gdGhlIGNvcmUgcmVhZGVyLCB3ZSBjaGFuZ2UgaXQgdG8gYSBwdWJsaWMgVlhTIGVycm9yICovCi0gICAgICAgIE00T1NBX0VSUl9TUExJVChlcnIsIHVpRHVtbXksIHVpQ29yZUlkLCB1aUR1bW15KTsKLQotICAgICAgICBpZiggTTRNUDRfUkVBREVSID09IHVpQ29yZUlkICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00TUNTX29wZW4oKTogcmV0dXJuaW5nIE00TUNTX0VSUl9JTlZBTElEX0lOUFVUX0ZJTEUiKTsKLSAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfSU5WQUxJRF9JTlBVVF9GSUxFOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBHZXQgdGhlIHN0cmVhbXMgZnJvbSB0aGUgaW5wdXQgZmlsZSAqLwotICAgIHdoaWxlKCBNNE5PX0VSUk9SID09IGVyciApCi0gICAgewotICAgICAgICBlcnIgPQotICAgICAgICAgICAgcEMtPm1fcFJlYWRlci0+bV9wRmN0R2V0TmV4dFN0cmVhbSggcEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lZGlhRmFtaWx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBTdHJlYW1IYW5kbGVyKTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBJbiBjYXNlIHdlIGZvdW5kIGEgQklGUyBzdHJlYW0gb3Igc29tZXRoaW5nIGVsc2UuLi4qLwotICAgICAgICBpZiggKCBlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRFUlJfUkVBREVSX1VOS05PV05fU1RSRUFNX1RZUEUpKQotICAgICAgICAgICAgfHwgKGVyciA9PSAoKE00T1NBX1VJbnQzMilNNFdBUl9UT09fTVVDSF9TVFJFQU1TKSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSAvKio8IE9uZSBzdHJlYW0gZm91bmQgKi8KLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEZvdW5kIHRoZSBmaXJzdCB2aWRlbyBzdHJlYW0gKi8KLSAgICAgICAgICAgIGlmKCAoIE00UkVBREVSX2tNZWRpYUZhbWlseVZpZGVvID09IG1lZGlhRmFtaWx5KQotICAgICAgICAgICAgICAgICYmIChNNE9TQV9OVUxMID09IHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0pICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggKCBNNERBX1N0cmVhbVR5cGVWaWRlb0gyNjMgPT0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgKE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzQKLSAgICAgICAgICAgICAgICAgICAgPT0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgKE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmMKLSAgICAgICAgICAgICAgICAgICAgPT0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfb3BlbigpOiBGb3VuZCBhIEgyNjMgb3IgTVBFRy00IHZpZGVvIHN0cmVhbSBpbiBpbnB1dCAzZ3BwIGNsaXAiKTsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBLZWVwIHBvaW50ZXIgdG8gdGhlIHZpZGVvIHN0cmVhbSAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlclZpZGVvU3RyZWFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNF9WaWRlb1N0cmVhbUhhbmRsZXIgKilwU3RyZWFtSGFuZGxlcjsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmJVbnN1cHBvcnRlZFZpZGVvRm91bmQgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fYlN0cmVhbUlzT0sgPSBNNE9TQV9UUlVFOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEluaXQgb3VyIHZpZGVvIHN0cmVhbSBzdGF0ZSB2YXJpYWJsZSAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+VmlkZW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9TVEFSVEVEOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFJlc2V0IHRoZSBzdHJlYW0gcmVhZGVyICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdFJlc2V0KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX29wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyLT5tX3BGY3RSZXNldCh2aWRlbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEluaXRpYWxpemVzIGFuIGFjY2VzcyBVbml0ICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdEZpbGxBdVN0cnVjdChwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlciwgJnBDLT5SZWFkZXJWaWRlb0FVKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfb3BlbigpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BSZWFkZXItPm1fcEZjdEZpbGxBdVN0cnVjdCh2aWRlbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIC8qKjwgTm90IEgyNjMgb3IgTVBFRy00IChIMjY0LCBldGMuKSAqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX29wZW4oKTogRm91bmQgYW4gdW5zdXBwb3J0ZWQgdmlkZW8gc3RyZWFtICgweCV4KSBpblwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgM2dwcCBjbGlwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcEMtPmJVbnN1cHBvcnRlZFZpZGVvRm91bmQgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9iU3RyZWFtSXNPSyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiArQ1JMVjY3NzUgLUguMjY0IFRyaW1taW5nICovCi0gICAgICAgICAgICAgICAgaWYoIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmMKLSAgICAgICAgICAgICAgICAgICAgPT0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSApCi0gICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgIC8vIFNQUyBhbmQgUFBTIGFyZSBzdG9yZWFkIGFzIHBlciB0aGUgM2dwIGZpbGUgZm9ybWF0Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BJbnN0YW5jZS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9wSDI2NERlY29kZXJTcGVjaWZpY0luZm87Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BJbnN0YW5jZS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9IMjY0ZGVjb2RlclNwZWNpZmljSW5mb1NpemU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIC1DUkxWNjc3NSAtSC4yNjQgVHJpbW1pbmcgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBGb3VuZCB0aGUgZmlyc3QgYXVkaW8gc3RyZWFtICovCi0gICAgICAgICAgICBlbHNlIGlmKCAoIE00UkVBREVSX2tNZWRpYUZhbWlseUF1ZGlvID09IG1lZGlhRmFtaWx5KQotICAgICAgICAgICAgICAgICYmIChNNE9TQV9OVUxMID09IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0pICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggKCBNNERBX1N0cmVhbVR5cGVBdWRpb0Ftck5hcnJvd0JhbmQKLSAgICAgICAgICAgICAgICAgICAgPT0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgKE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjID09IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpCi0gICAgICAgICAgICAgICAgICAgIHx8IChNNERBX1N0cmVhbVR5cGVBdWRpb01wMwotICAgICAgICAgICAgICAgICAgICA9PSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKQotICAgICAgICAgICAgICAgICAgICB8fCAoTTREQV9TdHJlYW1UeXBlQXVkaW9FdnJjCi0gICAgICAgICAgICAgICAgICAgID09IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX29wZW4oKTogRm91bmQgYW4gQU1SLU5CLCBBQUMgb3IgTVAzIGF1ZGlvIHN0cmVhbSBpbiBpbnB1dCBjbGlwIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogS2VlcCBwb2ludGVyIHRvIHRoZSBhdWRpbyBzdHJlYW0gKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRfQXVkaW9TdHJlYW1IYW5kbGVyICopcFN0cmVhbUhhbmRsZXI7Ci0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX2JTdHJlYW1Jc09LID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmJVbnN1cHBvcnRlZEF1ZGlvRm91bmQgPSBNNE9TQV9GQUxTRTsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBJbml0IG91ciBhdWRpbyBzdHJlYW0gc3RhdGUgdmFyaWFibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfU1RBUlRFRDsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBSZXNldCB0aGUgc3RyZWFtIHJlYWRlciAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RSZXNldChwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyQXVkaW9TdHJlYW0pOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19vcGVuKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0UmVzZXQoYXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBJbml0aWFsaXplcyBhbiBhY2Nlc3MgVW5pdCAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXIsICZwQy0+UmVhZGVyQXVkaW9BVSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX29wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QoYXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBPdXRwdXQgbWF4IEFVIHNpemUgaXMgZXF1YWwgdG8gaW5wdXQgbWF4IEFVIHNpemUgKHRoaXMgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgKiB3aWxsIGJlIGNoYW5nZWQgaWYgdGhlcmUgaXMgYXVkaW8gdHJhbnNjb2RpbmcpICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT51aUF1ZGlvTWF4QXVTaXplID0gcFN0cmVhbUhhbmRsZXItPm1fbWF4QVVTaXplOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKio8IE5vdCBBTVItTkIsIEFBQywgTVAzIG5vciBFVlJDIChBTVItV0IsIFdBVi4uLikgKi8KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX29wZW4oKTogRm91bmQgYW4gdW5zdXBwb3J0ZWQgYXVkaW8gc3RyZWFtICgweCV4KSBpbiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0IDNncHAgY2xpcCIsIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpOwotCi0gICAgICAgICAgICAgICAgICAgIHBDLT5iVW5zdXBwb3J0ZWRBdWRpb0ZvdW5kID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fYlN0cmVhbUlzT0sgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IC8qKjwgZW5kIG9mIHdoaWxlIChNNE5PX0VSUk9SID09IGVycikgKi8KLQotICAgIC8qKgotICAgICogQ2hlY2sgd2UgZm91bmQgYXQgbGVhc3Qgb25lIHN1cHBvcnRlZCBzdHJlYW0gKi8KLSAgICBpZiggKCBNNE9TQV9OVUxMID09IHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0pCi0gICAgICAgICYmIChNNE9TQV9OVUxMID09IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0pICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00TUNTX29wZW4oKTogcmV0dXJuaW5nIE00TUNTX0VSUl9JTlBVVF9GSUxFX0NPTlRBSU5TX05PX1NVUFBPUlRFRF9TVFJFQU0iKTsKLSAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9JTlBVVF9GSUxFX0NPTlRBSU5TX05PX1NVUFBPUlRFRF9TVFJFQU07Ci0gICAgfQotCi0gICAgaWYoIHBDLT5WaWRlb1N0YXRlID09IE00TUNTX2tTdHJlYW1TdGF0ZV9TVEFSVEVEICkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRWaWRlb0RlY29kZXIocENvbnRleHQsCi0gICAgICAgICAgICBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUpOwotICAgICAgICAvKkZCIDIwMDktMDItMDk6IHRoZSBlcnJvciBpcyBjaGVjayBhbmQgcmV0dXJuZWQgb25seSBpZiB2aWRlbyBjb2RlY3MgYXJlIGNvbXBpbGVkLAotICAgICAgICBlbHNlIG9ubHkgYXVkaW8gaXMgdXNlZCwgdGhhdCBpcyB3aHkgdGhlIGVkaXRpbmcgcHJvY2VzcyBjYW4gY29udGludWUqLwotI2lmbmRlZiBNNE1DU19BVURJT09OTFkKLQotICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotI2Vsc2UKLQotICAgICAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikgJiYgKE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRCAhPSBlcnIpICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0gICAgICAgIH0KLQotI2VuZGlmIC8qTTRNQ1NfQVVESU9PTkxZKi8KLQotICAgIH0KLQotICAgIGlmKCBwQy0+QXVkaW9TdGF0ZSA9PSBNNE1DU19rU3RyZWFtU3RhdGVfU1RBUlRFRCApCi0gICAgewotICAgICAgICAvL0VWUkMKLSAgICAgICAgaWYoIE00REFfU3RyZWFtVHlwZUF1ZGlvRXZyYwotICAgICAgICAgICAgIT0gcFN0cmVhbUhhbmRsZXItPgotICAgICAgICAgICAgbV9zdHJlYW1UeXBlICkgLyogZGVjb2RlciBub3Qgc3VwcG9ydGVkIHlldCwgYnV0IGFsbG93IHRvIGRvIG51bGwgZW5jb2RpbmcgKi8KLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRNQ1Nfc2V0Q3VycmVudEF1ZGlvRGVjb2RlcihwQ29udGV4dCwKLSAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUpOwotICAgICAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEdldCB0aGUgYXVkaW8gYW5kIHZpZGVvIHN0cmVhbSBwcm9wZXJ0aWVzICovCi0gICAgZXJyID0gTTRNQ1NfaW50R2V0SW5wdXRDbGlwUHJvcGVydGllcyhwQyk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1Nfb3BlbigpOiBNNE1DU19pbnRHZXRJbnB1dENsaXBQcm9wZXJ0aWVzIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBTZXQgdGhlIGJlZ2luIGN1dCBkZWNvZGluZyBpbmNyZW1lbnQgYWNjb3JkaW5nIHRvIHRoZSBpbnB1dCBmcmFtZSByYXRlICovCi0gICAgaWYoIDAuICE9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmZBdmVyYWdlRnJhbWVSYXRlICkgLyoqPCBzYW5pdHkgY2hlY2sgKi8KLSAgICB7Ci0gICAgICAgIHBDLT5pVmlkZW9CZWdpbkRlY0luY3IgPSAoTTRPU0FfSW50MzIpKDMwMDAuCi0gICAgICAgICAgICAvIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLgotICAgICAgICAgICAgZkF2ZXJhZ2VGcmFtZVJhdGUpOyAvKio8IGFib3V0IDMgZnJhbWVzICovCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBDLT5pVmlkZW9CZWdpbkRlY0luY3IgPQotICAgICAgICAgICAgMjAwOyAvKio8IGRlZmF1bHQgdmFsdWU6IDIwMCBtaWxsaXNlY29uZHMgKDMgZnJhbWVzIEAgMTVmcHMpKi8KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFVwZGF0ZSBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfT1BFTkVEOwotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19vcGVuKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX3N0ZXAoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVUludDggKnBQcm9ncmVzcyk7Ci0gKiBAYnJpZWYgICBQZXJmb3JtIG9uZSBzdGVwIG9mIHRyYW5jb2RpbmcuCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcGFyYW0gICBwUHJvZ3Jlc3MgICAgICAgICAgIChPVVQpIFByb2dyZXNzIHBlcmNlbnRhZ2UgKDAgdG8gMTAwKSBvZiB0aGUgdHJhbnNjb2RpbmcKLSAqIEBub3RlICAgIHBQcm9ncmVzcyBtdXN0IGJlIGEgdmFsaWQgYWRkcmVzcy4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgT25lIG9mIHRoZSBwYXJhbWV0ZXJzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICBNNE1DU19XQVJfVFJBTlNDT0RJTkdfRE9ORTogVHJhbnNjb2RpbmcgaXMgb3ZlciwgdXNlciBzaG91bGQgbm93IGNhbGwgTTRNQ1NfY2xvc2UoKQotICogQHJldHVybiAgTTRNQ1NfRVJSX0FVRElPX0NPTlZFUlNJT05fRkFJTEVEOiBUaGUgYXVkaW8gY29udmVyc2lvbiAoQUFDIHRvIEFNUi1OQiBvciBNUDMpIGZhaWxlZAotICogQHJldHVybiAgTTRNQ1NfRVJSX0lOVkFMSURfQUFDX1NBTVBMSU5HX0ZSRVFVRU5DWTogVGhlIGlucHV0IGZpbGUgY29udGFpbnMgYW4gQUFDIGF1ZGlvIHRyYWNrCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYW4gaW52YWxpZCBzYW1wbGluZyBmcmVxdWVuY3kgKHNob3VsZCBuZXZlciBoYXBwZW4pCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19zdGVwKCBNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9VSW50OCAqcFByb2dyZXNzICkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCAqKShwQ29udGV4dCk7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRNQ1Nfc3RlcCBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4IiwgcENvbnRleHQpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1Nfc3RlcDogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwUHJvZ3Jlc3MpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19zdGVwOiBwUHJvZ3Jlc3MgaXMgTTRPU0FfTlVMTCIpOwotCi0jaWZkZWYgTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFCi0KLSAgICBpZiggcEMtPm1fYklzU3RpbGxQaWN0dXJlICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENhbGwgdGhlIHN0aWxsIHBpY3R1cmUgTUNTIGZ1bmN0aW9ucyovCi0gICAgICAgIHJldHVybiBNNE1DU19zdGlsbFBpY1N0ZXAocEMsIHBQcm9ncmVzcyk7Ci0gICAgfQotCi0jZW5kaWYgLypNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUqLwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24gKi8KLQotICAgIHN3aXRjaCggcEMtPlN0YXRlICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRNQ1Nfa1N0YXRlX1JFQURZOgotICAgICAgICAgICAgKnBQcm9ncmVzcyA9IDA7Ci0gICAgICAgICAgICByZXR1cm4gTTRNQ1NfaW50U3RlcFNldChwQyk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00TUNTX2tTdGF0ZV9CRUdJTlZJREVPSlVNUDoKLSAgICAgICAgICAgICpwUHJvZ3Jlc3MgPSBwQy0+dWlQcm9ncmVzczsKLSAgICAgICAgICAgIHJldHVybiBNNE1DU19pbnRTdGVwQmVnaW5WaWRlb0p1bXAocEMpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNE1DU19rU3RhdGVfQkVHSU5WSURFT0RFQ09ERToKLSAgICAgICAgICAgICpwUHJvZ3Jlc3MgPSBwQy0+dWlQcm9ncmVzczsKLSAgICAgICAgICAgIHJldHVybiBNNE1DU19pbnRTdGVwQmVnaW5WaWRlb0RlY29kZShwQyk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00TUNTX2tTdGF0ZV9QUk9DRVNTSU5HOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgIGVyciA9IE00TUNTX2ludFN0ZXBFbmNvZGluZyhwQywgcFByb2dyZXNzKTsKLSAgICAgICAgICAgICAgICAvKiBTYXZlIHByb2dyZXNzIGluZm8gaW4gY2FzZSBvZiBwYXVzZSAqLwotICAgICAgICAgICAgICAgIHBDLT51aVByb2dyZXNzID0gKnBQcm9ncmVzczsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDogLyoqPCBTdGF0ZSBlcnJvciAqLwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX3N0ZXAoKTogV3JvbmcgU3RhdGUgKCVkKSwgcmV0dXJuaW5nIE00RVJSX1NUQVRFIiwKLSAgICAgICAgICAgICAgICBwQy0+U3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfcGF1c2UoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0gKiBAYnJpZWYgICBQYXVzZSB0aGUgdHJhbnNjb2RpbmcgaS5lLiByZWxlYXNlIHRoZSAoZXh0ZXJuYWwgaGFyZHdhcmUpIHZpZGVvIGRlY29kZXIuCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBuZWVkZWQgaWYgbm8gaGFyZHdhcmUgYWNjZWxlcmF0b3JzIGFyZSB1c2VkLgotICogICAgICAgICAgSW4gdGhhdCBjYXNlLCBwYXVzaW5nIHRoZSBNQ1MgaXMgc2ltcGx5IGFjaGlldmVkIGJ5IHRlbXBvcmFyaWx5IHN1c3BlbmRpbmcKLSAqICAgICAgICAgIHRoZSBNNE1DU19zdGVwIGZ1bmN0aW9uIGNhbGxzLgotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19wYXVzZSggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCApCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQgKikocENvbnRleHQpOwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMSgiTTRNQ1NfcGF1c2UgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCIsIHBDb250ZXh0KTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00TUNTX3BhdXNlOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0KLSNpZmRlZiBNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUKLQotICAgIGlmKCBwQy0+bV9iSXNTdGlsbFBpY3R1cmUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBzdGlsbCBwaWN0dXJlIE1DUyBmdW5jdGlvbiovCi0gICAgICAgIHJldHVybiBNNE1DU19zdGlsbFBpY1BhdXNlKHBDKTsKLSAgICB9Ci0KLSNlbmRpZiAvKk00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRSovCi0KLSAgICAvKioKLSAgICAqIENoZWNrIHN0YXRlIGF1dG9tYXRvbiAqLwotCi0gICAgc3dpdGNoKCBwQy0+U3RhdGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNE1DU19rU3RhdGVfQkVHSU5WSURFT0pVTVA6IC8qKjwgdGhlIHZpZGVvIGRlY29kZXIgaGFzIGJlZW4gY3JlYXRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2UgbXVzdCBkZXN0cm95IGl0ICovCi0gICAgICAgIGNhc2UgTTRNQ1Nfa1N0YXRlX0JFR0lOVklERU9ERUNPREU6IC8qKjwgdGhlIHZpZGVvIGlzIGJlaW5nIHVzZWQsIHdlIG11c3QgZGVzdHJveSBpdCAqLwotICAgICAgICBjYXNlIE00TUNTX2tTdGF0ZV9QUk9DRVNTSU5HOiAvKio8IHRoZSB2aWRlbyBpcyBiZWluZyB1c2VkLCB3ZSBtdXN0IGRlc3Ryb3kgaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgLyoqPCBPSywgbm90aGluZyB0byBkbyBoZXJlICovCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OiAvKio8IFN0YXRlIGVycm9yICovCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfcGF1c2UoKTogV3JvbmcgU3RhdGUgKCVkKSwgcmV0dXJuaW5nIE00RVJSX1NUQVRFIiwKLSAgICAgICAgICAgICAgICBwQy0+U3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qKgotICAgICogU2V0IHRoZSBDVFMgYXQgd2hpY2ggd2Ugd2lsbCByZXN1bWUgdGhlIGRlY29kaW5nICovCi0gICAgaWYoIHBDLT5kVmlEZWNDdXJyZW50Q3RzID4gcEMtPmRWaURlY1N0YXJ0aW5nQ3RzICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFdlIHBhc3NlZCB0aGUgc3RhcnRpbmcgQ1RTLCBzbyB0aGUgcmVzdW1lIHRhcmdldCBpcyB0aGUgY3VycmVudCBDVFMgKi8KLSAgICAgICAgcEMtPmRWaURlY1N0YXJ0aW5nQ3RzID0gcEMtPmRWaURlY0N1cnJlbnRDdHM7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICAvKioKLSAgICAgICAgKiBXZSBoYXZlbid0IHBhc3NlZCB0aGUgc3RhcnRpbmcgQ1RTIHlldCwgc28gdGhlIHJlc3VtZSB0YXJnZXQgaXMgc3RpbGwgdGhlIHN0YXJ0aW5nIENUUwotICAgICAgICAqIC0tPiBub3RoaW5nIHRvIGRvIGluIHRoZSBlbHNlIGJsb2NrICovCi0gICAgfQotCi0gICAgLyoqCi0gICAgKiBGcmVlIHZpZGVvIGRlY29kZXIgc3R1ZmYgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cFZpRGVjQ3R4dCApCi0gICAgewotICAgICAgICBlcnIgPSBwQy0+bV9wVmlkZW9EZWNvZGVyLT5tX3BGY3REZXN0cm95KHBDLT5wVmlEZWNDdHh0KTsKLSAgICAgICAgcEMtPnBWaURlY0N0eHQgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19wYXVzZTogbV9wVmlkZW9EZWNvZGVyLT5wRmN0RGVzdHJveSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogU3RhdGUgdHJhbnNpdGlvbiAqLwotICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9QQVVTRUQ7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfcGF1c2UoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfcmVzdW1lKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgUmVzdW1lIHRoZSB0cmFuc2NvZGluZyBhZnRlciBhIHBhdXNlIChzZWUgTTRNQ1NfcGF1c2UpLgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgbmVlZGVkIGlmIG5vIGhhcmR3YXJlIGFjY2VsZXJhdG9ycyBhcmUgdXNlZC4KLSAqICAgICAgICAgIEluIHRoYXQgY2FzZSwgcmVzdW1pbmcgdGhlIE1DUyBpcyBzaW1wbHkgYWNoaWV2ZWQgYnkgY2FsbGluZwotICogICAgICAgICAgdGhlIE00TUNTX3N0ZXAgZnVuY3Rpb24uCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX3Jlc3VtZSggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCApCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQgKikocENvbnRleHQpOwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMSgiTTRNQ1NfcmVzdW1lIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgiLCBwQ29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19yZXN1bWU6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLQotI2lmZGVmIE00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRQotCi0gICAgaWYoIHBDLT5tX2JJc1N0aWxsUGljdHVyZSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIHN0aWxsIHBpY3R1cmUgTUNTIGZ1bmN0aW9uKi8KLSAgICAgICAgcmV0dXJuIE00TUNTX3N0aWxsUGljUmVzdW1lKHBDKTsKLSAgICB9Ci0KLSNlbmRpZiAvKk00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRSovCi0KLSAgICAvKioKLSAgICAqIENoZWNrIHN0YXRlIGF1dG9tYXRvbiAqLwotCi0gICAgc3dpdGNoKCBwQy0+U3RhdGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNE1DU19rU3RhdGVfUEFVU0VEOiAvKio8IE9LLCBub3RoaW5nIHRvIGRvIGhlcmUgKi8KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgLyoqPCBTdGF0ZSBlcnJvciAqLwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX3Jlc3VtZSgpOiBXcm9uZyBTdGF0ZSAoJWQpLCByZXR1cm5pbmcgTTRFUlJfU1RBVEUiLAotICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFByZXBhcmUgdGhlIHZpZGVvIGRlY29kZXIgKi8KLSAgICBlcnIgPSBNNE1DU19pbnRQcmVwYXJlVmlkZW9EZWNvZGVyKHBDKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19yZXN1bWUoKTogTTRNQ1NfaW50UHJlcGFyZVZpZGVvRGVjb2RlcigpIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBTdGF0ZSB0cmFuc2l0aW9uICovCi0gICAgaWYoIDAuMCA9PSBwQy0+ZFZpRGVjU3RhcnRpbmdDdHMgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogV2UgYXJlIHN0aWxsIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRlY29kZWQgc3RyZWFtLCBubyBuZWVkIHRvIGp1bXAsIHdlIGNhbiBwcm9jZWVkICovCi0gICAgICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9QUk9DRVNTSU5HOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBKdW1waW5nICovCi0gICAgICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9CRUdJTlZJREVPSlVNUDsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfcmVzdW1lKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2Nsb3NlKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgIEZpbmlzaCB0aGUgTUNTIHRyYW5zY29kaW5nLgotICogQG5vdGUgVGhlIG91dHB1dCAzR1BQIGZpbGUgaXMgcmVhZHkgdG8gYmUgcGxheWVkIGFmdGVyIHRoaXMgY2FsbAotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKElmIERlYnVnIExldmVsID49IDIpCi0gKiBAcmV0dXJuICAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfY2xvc2UoIE00TUNTX0NvbnRleHQgcENvbnRleHQgKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICopKHBDb250ZXh0KTsKLSAgICBNNEVOQ09ERVJfSGVhZGVyICplbmNIZWFkZXI7Ci0gICAgTTRTWVNfU3RyZWFtSURtZW1BZGRyIHN0cmVhbUhlYWRlcjsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SLCBlcnIyOwotCi0gICAgTTRPU0FfVFJBQ0UyXzEoIk00TUNTX2Nsb3NlIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgiLCBwQ29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19jbG9zZTogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotCi0jaWZkZWYgTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFCi0KLSAgICBpZiggcEMtPm1fYklzU3RpbGxQaWN0dXJlICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEluZGljYXRlIHRoYXQgY3VycmVudCBmaWxlIGlzIG5vIGxvbmdlciBhIHN0aWxsIHBpY3R1cmUqLwotICAgICAgICBwQy0+bV9iSXNTdGlsbFBpY3R1cmUgPSBNNE9TQV9GQUxTRTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIHN0aWxsIHBpY3R1cmUgTUNTIGZ1bmN0aW9uKi8KLSAgICAgICAgcmV0dXJuIE00TUNTX3N0aWxsUGljQ2xvc2UocEMpOwotICAgIH0KLQotI2VuZGlmIC8qTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFKi8KLQotICAgIC8qKgotICAgICogQ2hlY2sgc3RhdGUgYXV0b21hdG9uICovCi0KLSAgICBpZiggTTRNQ1Nfa1N0YXRlX0ZJTklTSEVEICE9IHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1NfY2xvc2UoKTogV3JvbmcgU3RhdGUgKCVkKSwgcmV0dXJuaW5nIE00RVJSX1NUQVRFIiwKLSAgICAgICAgICAgIHBDLT5TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKiBDbG9zZSB0aGUgZW5jb2RlciBiZWZvcmUgdGhlIHdyaXRlciB0byBiZSBjZXJ0YWluIGFsbCB0aGUgQVVzIGhhdmUgYmVlbiB3cml0dGVuIGFuZCB3ZSBjYW4KLSAgICBnZXQgdGhlIERTSS4gKi8KLQotICAgIC8qIEhhcyB0aGUgZW5jb2RlciBhY3R1YWxseSBiZWVuIHN0YXJ0ZWQ/IERvbid0IHN0b3AgaXQgaWYgdGhhdCdzIG5vdCB0aGUgY2FzZS4gKi8KLSAgICBpZiggTTRNQ1Nfa0VuY29kZXJSdW5uaW5nID09IHBDLT5lbmNvZGVyU3RhdGUgKQotICAgIHsKLSAgICAgICAgaWYoIHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0b3AgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0b3AocEMtPnBWaUVuY0N0eHQpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfY2xvc2U6IHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RvcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIC8qIFdlbGwuLi4gaG93IHRoZSBoZWNrIGRvIHlvdSBoYW5kbGUgYSBmYWlsZWQgY2xlYW51cD8gKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHBDLT5lbmNvZGVyU3RhdGUgPSBNNE1DU19rRW5jb2RlclN0b3BwZWQ7Ci0gICAgfQotCi0gICAgLyogSGFzIHRoZSBlbmNvZGVyIGFjdHVhbGx5IGJlZW4gb3BlbmVkPyBEb24ndCBjbG9zZSBpdCBpZiB0aGF0J3Mgbm90IHRoZSBjYXNlLiAqLwotICAgIGlmKCBNNE1DU19rRW5jb2RlclN0b3BwZWQgPT0gcEMtPmVuY29kZXJTdGF0ZSApCi0gICAgewotICAgICAgICBlcnIgPSBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbG9zZShwQy0+cFZpRW5jQ3R4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2Nsb3NlOiBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qIFdlbGwuLi4gaG93IHRoZSBoZWNrIGRvIHlvdSBoYW5kbGUgYSBmYWlsZWQgY2xlYW51cD8gKi8KLSAgICAgICAgfQotCi0gICAgICAgIHBDLT5lbmNvZGVyU3RhdGUgPSBNNE1DU19rRW5jb2RlckNsb3NlZDsKLSAgICB9Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKioqKioqKiogQ2xvc2UgdGhlIHdyaXRlciAqKioqKioqKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cFdyaXRlckNvbnRleHQgKSAvKiBoYXBwZW5zIGluIHN0YXRlIF9TRVQgKi8KLSAgICB7Ci0gICAgICAgIC8qIEhXIGVuY29kZXI6IGZldGNoIHRoZSBEU0kgZnJvbSB0aGUgc2hlbGwgdmlkZW8gZW5jb2RlciwgYW5kIGZlZWQgaXQgdG8gdGhlIHdyaXRlciBiZWZvcmUKLSAgICAgICAgY2xvc2luZyBpdC4gKi8KLQotICAgICAgICBpZiggcEMtPm5vdmlkZW8gIT0gTTRPU0FfVFJVRSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCAoIE00RU5DT0RFUl9rTVBFRzQgPT0gcEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQpCi0gICAgICAgICAgICAgICAgfHwgKE00RU5DT0RFUl9rSDI2NCA9PSBwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEdldE9wdGlvbihwQy0+cFZpRW5jQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2tPcHRpb25JRF9FbmNvZGVySGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJmVuY0hlYWRlcik7Ci0KLSAgICAgICAgICAgICAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikgfHwgKE00T1NBX05VTEwgPT0gZW5jSGVhZGVyLT5wQnVmKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19jbG9zZTogZmFpbGVkIHRvIGdldCB0aGUgZW5jb2RlciBoZWFkZXIgKGVyciAweCV4KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAvKio8IG5vIHJldHVybiBoZXJlLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGRlYWxsb2NhdGUgYWZ0ZXIgY2xvc2UsIGV2ZW4KLSAgICAgICAgICAgICAgICAgICAgIGlmIGl0IGZhaWxzLiAqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBzZXQgdGhpcyBoZWFkZXIgaW4gdGhlIHdyaXRlciAqLwotICAgICAgICAgICAgICAgICAgICBzdHJlYW1IZWFkZXIuc3RyZWFtSUQgPSBNNE1DU19XUklURVJfVklERU9fU1RSRUFNX0lEOwotICAgICAgICAgICAgICAgICAgICBzdHJlYW1IZWFkZXIuc2l6ZSA9IGVuY0hlYWRlci0+U2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtSGVhZGVyLmFkZHIgPSAoTTRPU0FfTWVtQWRkcjMyKWVuY0hlYWRlci0+cEJ1ZjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiY2FsbGluZyBzZXQgb3B0aW9uIik7Ci0gICAgICAgICAgICAgICAgZXJyID0gcEMtPnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKHBDLT5wV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfa0RTSSwgJnN0cmVhbUhlYWRlcik7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoInNldCBvcHRpb24gZG9uZSIpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX2Nsb3NlOiBmYWlsZWQgdG8gc2V0IHRoZSBEU0kgaW4gdGhlIHdyaXRlciAoZXJyIDB4JXgpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggKCBNNE9TQV9UUlVFID09IHBDLT5iSDI2NFRyaW0pCi0gICAgICAgICAgICAgICAgJiYgKE00RU5DT0RFUl9rTlVMTCA9PSBwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKHBDLT51aUJlZ2luQ3V0VGltZSA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkRlY29kZXIgc3BlY2lmaWMgaW5mbyBzaXplID0gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fcEluc3RhbmNlLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplKTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcEluc3RhbmNlLT5tX3BGaW5hbERTSVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fcEluc3RhbmNlLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiRGVjb2RlciBzcGVjaWZpYyBpbmZvIHBvaW50ZXIgPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcEMtPm1fcEluc3RhbmNlLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvKTsKLQotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wSW5zdGFuY2UtPm1fcEZpbmFsRFNJID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+bV9wSW5zdGFuY2UtPiBcCi0gICAgICAgICAgICAgICAgICAgICAgICBtX2RlY29kZXJTcGVjaWZpY0luZm9TaXplLCBNNE1DUywKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopImluc3RhbmNlLT5tX3BGaW5hbERTSSIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+bV9wSW5zdGFuY2UtPm1fcEZpbmFsRFNJID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiaW5zdGFuY2UtPm1fcEZpbmFsRFNJOiBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPm1fcEluc3RhbmNlLT5tX3BGaW5hbERTSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPiBcCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BJbnN0YW5jZS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX3BJbnN0YW5jZS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN0cmVhbUhlYWRlci5zdHJlYW1JRCA9IE00TUNTX1dSSVRFUl9WSURFT19TVFJFQU1fSUQ7Ci0gICAgICAgICAgICAgICAgc3RyZWFtSGVhZGVyLnNpemUgPSBwQy0+bV9wSW5zdGFuY2UtPm1fcEZpbmFsRFNJU2l6ZTsKLSAgICAgICAgICAgICAgICBzdHJlYW1IZWFkZXIuYWRkciA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpcEMtPm1fcEluc3RhbmNlLT5tX3BGaW5hbERTSTsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiY2FsbGluZyBzZXQgb3B0aW9uIik7Ci0gICAgICAgICAgICAgICAgZXJyID0gcEMtPnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKHBDLT5wV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfa0RTSSwgJnN0cmVhbUhlYWRlcik7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoInNldCBvcHRpb24gZG9uZSIpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX2Nsb3NlOiBmYWlsZWQgdG8gc2V0IHRoZSBEU0kgaW4gdGhlIHdyaXRlciAoZXJyIDB4JXgpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qIFdyaXRlIGFuZCBjbG9zZSB0aGUgM0dQIG91dHB1dCBmaWxlICovCi0gICAgICAgIGVycjIgPSBwQy0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RDbG9zZVdyaXRlKHBDLT5wV3JpdGVyQ29udGV4dCk7Ci0gICAgICAgIHBDLT5wV3JpdGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyMiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19jbG9zZTogcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RDbG9zZVdyaXRlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyMik7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApCi0gICAgICAgICAgICAgICAgZXJyID0gZXJyMjsKLSAgICAgICAgICAgIC8qKjwgbm8gcmV0dXJuIGhlcmUsIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZGVhbGxvY2F0ZSBhZnRlciBjbG9zZSwgZXZlbiBpZiBpdCBmYWlscy4qLwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQ2xvc2Ugb3V0cHV0IFBDTSBmaWxlIGlmIG5lZWRlZCAqLwotICAgIGlmKCBwQy0+cE91dHB1dFBDTWZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBwQy0+cE9zYUZpbGVXcml0UHRyLT5jbG9zZVdyaXRlKHBDLT5wT3V0cHV0UENNZmlsZSk7Ci0gICAgICAgIHBDLT5wT3V0cHV0UENNZmlsZSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLypGbEIgMjAwOS4wMy4wNDogYWRkIGF1ZGlvIGVmZmVjdHMsCi0gICAgZnJlZSBlZmZlY3RzIGxpc3QqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wRWZmZWN0cyApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wRWZmZWN0cyk7Ci0gICAgICAgIHBDLT5wRWZmZWN0cyA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIHBDLT5uYkVmZmVjdHMgPSAwOwotICAgIHBDLT5wQWN0aXZlRWZmZWN0TnVtYmVyID0gLTE7Ci0KLSAgICAvKioKLSAgICAqIFN0YXRlIHRyYW5zaXRpb24gKi8KLSAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfQ0xPU0VEOwotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPkgyNjRNQ1NUZW1wQnVmZmVyICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPkgyNjRNQ1NUZW1wQnVmZmVyKTsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfY2xvc2UoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19jbGVhblVwKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgIEZyZWUgYWxsIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBNQ1MuCi0gKiBAbm90ZSBUaGUgY29udGV4dCBpcyBubyBtb3JlIHZhbGlkIGFmdGVyIHRoaXMgY2FsbAotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKElmIERlYnVnIExldmVsID49IDIpCi0gKiBAcmV0dXJuICAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfY2xlYW5VcCggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCApCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQgKikocENvbnRleHQpOwotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00TUNTX2NsZWFuVXAgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCIsIHBDb250ZXh0KTsKLQotI2lmZGVmIE1DU19EVU1QX1BDTV9UT19GSUxFCi0KLSAgICBpZiggZmlsZV9hdV9yZWFkZXIgKQotICAgIHsKLSAgICAgICAgZmNsb3NlKGZpbGVfYXVfcmVhZGVyKTsKLSAgICAgICAgZmlsZV9hdV9yZWFkZXIgPSBOVUxMOwotICAgIH0KLQotICAgIGlmKCBmaWxlX3BjbV9kZWNvZGVyICkKLSAgICB7Ci0gICAgICAgIGZjbG9zZShmaWxlX3BjbV9kZWNvZGVyKTsKLSAgICAgICAgZmlsZV9wY21fZGVjb2RlciA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYoIGZpbGVfcGNtX2VuY29kZXIgKQotICAgIHsKLSAgICAgICAgZmNsb3NlKGZpbGVfcGNtX2VuY29kZXIpOwotICAgICAgICBmaWxlX3BjbV9lbmNvZGVyID0gTlVMTDsKLSAgICB9Ci0KLSNlbmRpZgotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDb250ZXh0ICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00TUNTX2NsZWFuVXA6IHBDb250ZXh0IGlzIE00T1NBX05VTEwsIHJldHVybmluZyBNNEVSUl9QQVJBTUVURVIiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIHN0YXRlIGF1dG9tYXRvbiAqLwotICAgIGlmKCBNNE1DU19rU3RhdGVfQ0xPU0VEICE9IHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19jbGVhblVwKCk6IFdyb25nIFN0YXRlICglZCksIHJldHVybmluZyBNNEVSUl9TVEFURSIsCi0gICAgICAgICAgICBwQy0+U3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPm1fcEluc3RhbmNlICkKLSAgICB7Ci0gICAgICAgIGVyciA9IEgyNjRNQ1NfRnJlZWluc3RhbmNlKHBDLT5tX3BJbnN0YW5jZSk7Ci0gICAgICAgIHBDLT5tX3BJbnN0YW5jZSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyogLS0tLS0gRnJlZSB2aWRlbyBlbmNvZGVyIHN0dWZmLCBpZiBuZWVkZWQgLS0tLS0gKi8KLQotICAgIGlmKCAoIE00T1NBX05VTEwgIT0gcEMtPnBWaUVuY0N0eHQpCi0gICAgICAgICYmIChNNE9TQV9OVUxMICE9IHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cykgKQotICAgIHsKLSAgICAgICAgZXJyID0gcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xlYW51cChwQy0+cFZpRW5jQ3R4dCk7Ci0gICAgICAgIHBDLT5wVmlFbmNDdHh0ID0gTTRPU0FfTlVMTDsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfY2xlYW5VcDogcFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbGVhbnVwIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgfQotCi0gICAgICAgIHBDLT5lbmNvZGVyU3RhdGUgPSBNNE1DU19rTm9FbmNvZGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICogSW4gdGhlIEgyNjMgY2FzZSwgd2UgYWxsb2NhdGVkIG91ciBvd24gRFNJIGJ1ZmZlciAqLwotICAgIGlmKCAoIE00RU5DT0RFUl9rSDI2MyA9PSBwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCkKLSAgICAgICAgJiYgKE00T1NBX05VTEwgIT0gcEMtPldyaXRlclZpZGVvU3RyZWFtSW5mby5IZWFkZXIucEJ1ZikgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLkhlYWRlci5wQnVmKTsKLSAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtSW5mby5IZWFkZXIucEJ1ZiA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBQcmVSZXNpemVGcmFtZSApCi0gICAgewotICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhICkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+cFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocEMtPnBQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lWzFdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEpOwotICAgICAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZVsyXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgZnJlZShwQy0+cFByZVJlc2l6ZUZyYW1lKTsKLSAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyogLS0tLS0gRnJlZSB0aGUgc3NyYyBzdHVmZiAtLS0tLSAqLwotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPlNzcmNTY3JhdGNoICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPlNzcmNTY3JhdGNoKTsKLSAgICAgICAgcEMtPlNzcmNTY3JhdGNoID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cFNzcmNCdWZmZXJJbiApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wU3NyY0J1ZmZlckluKTsKLSAgICAgICAgcEMtPnBTc3JjQnVmZmVySW4gPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wU3NyY0J1ZmZlck91dCApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wU3NyY0J1ZmZlck91dCk7Ci0gICAgICAgIHBDLT5wU3NyY0J1ZmZlck91dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYgKHBDLT5wTFZBdWRpb1Jlc2FtcGxlciAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTFZEZXN0cm95KHBDLT5wTFZBdWRpb1Jlc2FtcGxlcik7Ci0gICAgICAgIHBDLT5wTFZBdWRpb1Jlc2FtcGxlciA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyogLS0tLS0gRnJlZSB0aGUgYXVkaW8gZW5jb2RlciBzdHVmZiAtLS0tLSAqLwotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBBdWRpb0VuY0N0eHQgKQotICAgIHsKLSAgICAgICAgZXJyID0gcEMtPnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2UocEMtPnBBdWRpb0VuY0N0eHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19jbGVhblVwOiBwQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IHBDLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsZWFuVXAocEMtPnBBdWRpb0VuY0N0eHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19jbGVhblVwOiBwQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsZWFuVXAgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4sIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgcEMtPnBBdWRpb0VuY0N0eHQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wQXVkaW9FbmNvZGVyQnVmZmVyICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnBBdWRpb0VuY29kZXJCdWZmZXIpOwotICAgICAgICBwQy0+cEF1ZGlvRW5jb2RlckJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyogLS0tLS0gRnJlZSBhbGwgb3RoZXIgc3R1ZmYgLS0tLS0gKi8KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgcmVhZGVycyBhbmQgdGhlIGRlY29kZXJzICovCi0gICAgTTRNQ1NfaW50Q2xlYW5VcF9SZWFkZXJzRGVjb2RlcnMocEMpOwotCi0jaWZkZWYgTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBzdGlsbCBwaWN0dXJlIHJlc291cmNlcyAqLwotCi0gICAgTTRNQ1Nfc3RpbGxQaWNDbGVhblVwKHBDKTsKLQotI2VuZGlmIC8qTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFKi8KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgc2hlbGxzIGludGVyZmFjZXMgKi8KLQotICAgIE00TUNTX3VuUmVnaXN0ZXJBbGxXcml0ZXJzKHBDb250ZXh0KTsKLSAgICBNNE1DU191blJlZ2lzdGVyQWxsRW5jb2RlcnMocENvbnRleHQpOwotICAgIE00TUNTX3VuUmVnaXN0ZXJBbGxSZWFkZXJzKHBDb250ZXh0KTsKLSAgICBNNE1DU191blJlZ2lzdGVyQWxsRGVjb2RlcnMocENvbnRleHQpOwotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBjb250ZXh0IGl0c2VsZiAqLwotICAgIGZyZWUocEMpOwotICAgIHBDID0gTTRPU0FfTlVMTDsKLQotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19jbGVhblVwKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2Fib3J0KE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgIEZpbmlzaCB0aGUgTUNTIHRyYW5zY29kaW5nIGFuZCBmcmVlIGFsbCByZXNvdXJjZXMgdXNlZCBieSB0aGUgTUNTCi0gKiAgICAgICAgICB3aGF0ZXZlciB0aGUgc3RhdGUgaXMuCi0gKiBAbm90ZSAgICBUaGUgY29udGV4dCBpcyBubyBtb3JlIHZhbGlkIGFmdGVyIHRoaXMgY2FsbAotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2Fib3J0KCBNNE1DU19Db250ZXh0IHBDb250ZXh0ICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9FUlIgZXJyMSA9IE00Tk9fRVJST1I7Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQgKikocENvbnRleHQpOwotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcENvbnRleHQgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotCi0gICAgaWYoICggcEMtPlN0YXRlID09IE00TUNTX2tTdGF0ZV9DUkVBVEVEKQotICAgICAgICB8fCAocEMtPlN0YXRlID09IE00TUNTX2tTdGF0ZV9DTE9TRUQpICkKLSAgICB7Ci0gICAgICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9DTE9TRUQ7Ci0KLSAgICAgICAgZXJyID0gTTRNQ1NfY2xlYW5VcChwQ29udGV4dCk7Ci0KLSAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX2Fib3J0IDogTTRNQ1NfY2xlYW5VcCBmYWlscyBlcnIgPSAweCV4IiwgZXJyKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotI2lmZGVmIE00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRQotCi0gICAgICAgIGlmKCBwQy0+bV9iSXNTdGlsbFBpY3R1cmUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQ2FuY2VsIHRoZSBvbmdvaW5nIHByb2Nlc3NlcyBpZiBhbnkqLwotICAgICAgICAgICAgZXJyID0gTTRNQ1Nfc3RpbGxQaWNDYW5jZWwocEMpOwotCi0gICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfYWJvcnQgOiBNNE1DU19zdGlsbFBpY0NhbmNlbCBmYWlscyBlcnIgPSAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qU3RpbGwgcGljdHVyZSBwcm9jZXNzIGlzIG5vdyBzdG9wcGVkOyBDYXJyeSBvbiB3aXRoIGNsb3NlIGFuZCBjbGVhbnVwKi8KLSAgICAgICAgfQotCi0jZW5kaWYgLypNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUqLwotCi0gICAgICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9GSU5JU0hFRDsKLQotICAgICAgICBlcnIgPSBNNE1DU19jbG9zZShwQ29udGV4dCk7Ci0KLSAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX2Fib3J0IDogTTRNQ1NfY2xvc2UgZmFpbHMgZXJyID0gMHgleCIsIGVycik7Ci0gICAgICAgICAgICBlcnIxID0gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRNQ1NfY2xlYW5VcChwQ29udGV4dCk7Ci0KLSAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX2Fib3J0IDogTTRNQ1NfY2xlYW5VcCBmYWlscyBlcnIgPSAweCV4IiwgZXJyKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlcnIgPSAoZXJyMSA9PSBNNE5PX0VSUk9SKSA/IGVyciA6IGVycjE7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfZ2V0SW5wdXRGaWxlUHJvcGVydGllcyhNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzKiBwRmlsZVByb3BlcnRpZXMpOwotICogQGJyaWVmICAgUmV0cmlldmVzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBhdWRpbyBhbmQgdmlkZW8gc3RyZWFtcyBmcm9tIHRoZSBpbnB1dCBmaWxlLgotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcGFyYW0gICBwUHJvcGVydGllcyAgICAgICAgIChPVVQpIFBvaW50ZXIgb24gYW4gYWxsb2NhdGVkIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzCi1zdHJ1Y3R1cmUgd2hpY2ggaXMgZmlsbGVkIHdpdGggdGhlIGlucHV0IHN0cmVhbSBwcm9wZXJ0aWVzLgotICogQG5vdGUgICAgVGhlIHN0cnVjdHVyZSBwUHJvcGVydGllcyBtdXN0IGJlIGFsbG9jYXRlZCBhbmQgZnVydGhlciBkZS1hbGxvY2F0ZWQKLWJ5IHRoZSBhcHBsaWNhdGlvbi4gVGhlIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGluIHRoZSBvcGVuZWQgc3RhdGUuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfZ2V0SW5wdXRGaWxlUHJvcGVydGllcyggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwRmlsZVByb3BlcnRpZXMgKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICopKHBDb250ZXh0KTsKLQotICAgIE00T1NBX1RSQUNFMl8yKCJNNE1DU19nZXRJbnB1dEZpbGVQcm9wZXJ0aWVzIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgsIFwKLSAgICAgICAgICAgICAgICAgICBwRmlsZVByb3BlcnRpZXM9MHgleCIsIHBDb250ZXh0LCBwRmlsZVByb3BlcnRpZXMpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1NfZ2V0SW5wdXRGaWxlUHJvcGVydGllczogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwRmlsZVByb3BlcnRpZXMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19nZXRJbnB1dEZpbGVQcm9wZXJ0aWVzOiBwUHJvcGVydGllcyBpcyBNNE9TQV9OVUxMIik7Ci0KLSNpZmRlZiBNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUKLQotICAgIGlmKCBwQy0+bV9iSXNTdGlsbFBpY3R1cmUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBzdGlsbCBwaWN0dXJlIE1DUyBmdW5jdGlvbiovCi0gICAgICAgIHJldHVybiBNNE1DU19zdGlsbFBpY0dldElucHV0RmlsZVByb3BlcnRpZXMocEMsIHBGaWxlUHJvcGVydGllcyk7Ci0gICAgfQotCi0jZW5kaWYgLypNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUqLwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24gKi8KLQotICAgIGlmKCBNNE1DU19rU3RhdGVfT1BFTkVEICE9IHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19nZXRJbnB1dEZpbGVQcm9wZXJ0aWVzKCk6IFdyb25nIFN0YXRlICglZCksIHJldHVybmluZyBNNEVSUl9TVEFURSIsCi0gICAgICAgICAgICBwQy0+U3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb3B5IHByZXZpb3VzbHkgY29tcHV0ZWQgcHJvcGVydGllcyBpbnRvIGdpdmVuIHN0cnVjdHVyZSAqLwotICAgIG1lbWNweSgodm9pZCAqKXBGaWxlUHJvcGVydGllcywKLSAgICAgICAgKHZvaWQgKikgJnBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLAotICAgICAgICBzaXplb2YoTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMpKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19zZXRPdXRwdXRQYXJhbXMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRNQ1NfT3V0cHV0UGFyYW1zKiBwUGFyYW1zKTsKLSAqIEBicmllZiAgIFNldCB0aGUgTUNTIHZpZGVvIG91dHB1dCBwYXJhbWV0ZXJzLgotICogQG5vdGUgICAgTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgTTRNQ1Nfb3Blbi4gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIE00TUNTX3N0ZXAuCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBQYXJhbXMgICAgICAgICAgICAgKElOL09VVCkgVHJhbnNjb2RpbmcgcGFyYW1ldGVycwotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfSU5WQUxJRF9WSURFT19GUkFNRV9TSVpFX0ZPUl9IMjYzIDogT3V0cHV0IHZpZGVvIGZyYW1lIHNpemUgcGFyYW1ldGVyIGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb21wYXRpYmxlIHdpdGggSDI2MyBlbmNvZGluZwotICogQHJldHVybiAgTTRNQ1NfRVJSX0lOVkFMSURfVklERU9fRlJBTUVfUkFURV9GT1JfSDI2MyA6IE91dHB1dCB2aWRlbyBmcmFtZSBzaXplIHBhcmFtZXRlciBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29tcGF0aWJsZSB3aXRoIEgyNjMgZW5jb2RpbmcKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZPUk1BVCAgICAgOiBVbmRlZmluZWQgb3V0cHV0IHZpZGVvIGZvcm1hdCBwYXJhbWV0ZXIKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZSQU1FX1NJWkUgOiBVbmRlZmluZWQgb3V0cHV0IHZpZGVvIGZyYW1lIHNpemUKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZSQU1FX1JBVEUgOiBVbmRlZmluZWQgb3V0cHV0IHZpZGVvIGZyYW1lIHJhdGUKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX0FVRElPX0ZPUk1BVCA6IFVuZGVmaW5lZCBvdXRwdXQgYXVkaW8gZm9ybWF0IHBhcmFtZXRlcgotICogQHJldHVybiAgTTRNQ1NfRVJSX0RVUkFUSU9OX0lTX05VTEwgOiBTcGVjaWZpZWQgb3V0cHV0IHBhcmFtZXRlcnMgZGVmaW5lIGEgbnVsbCBkdXJhdGlvbiBzdHJlYW0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobm8gYXVkaW8gYW5kIHZpZGVvKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zKCBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19PdXRwdXRQYXJhbXMgKnBQYXJhbXMgKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICopKHBDb250ZXh0KTsKLSAgICBNNE9TQV9VSW50MzIgdWlGcmFtZVdpZHRoOwotICAgIE00T1NBX1VJbnQzMiB1aUZyYW1lSGVpZ2h0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMigKLSAgICAgICAgIk00TUNTX3NldE91dHB1dFBhcmFtcyBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4LCBwUGFyYW1zPTB4JXgiLAotICAgICAgICBwQ29udGV4dCwgcFBhcmFtcyk7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19zZXRPdXRwdXRQYXJhbXM6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFBhcmFtcyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00TUNTX3NldE91dHB1dFBhcmFtczogcFBhcmFtIGlzIE00T1NBX05VTEwiKTsKLQotI2lmZGVmIE00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRQotCi0gICAgaWYoIHBDLT5tX2JJc1N0aWxsUGljdHVyZSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIHN0aWxsIHBpY3R1cmUgTUNTIGZ1bmN0aW9uKi8KLSAgICAgICAgcmV0dXJuIE00TUNTX3N0aWxsUGljU2V0T3V0cHV0UGFyYW1zKHBDLCBwUGFyYW1zKTsKLSAgICB9Ci0KLSNlbmRpZiAvKk00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRSovCi0KLSAgICAvKioKLSAgICAqIENoZWNrIHN0YXRlIGF1dG9tYXRvbiAqLwotCi0gICAgaWYoIE00TUNTX2tTdGF0ZV9PUEVORUQgIT0gcEMtPlN0YXRlICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX3NldE91dHB1dFBhcmFtcygpOiBXcm9uZyBTdGF0ZSAoJWQpLCByZXR1cm5pbmcgTTRFUlJfU1RBVEUiLAotICAgICAgICAgICAgcEMtPlN0YXRlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qIElnbm9yZSBhdWRpbyBvciB2aWRlbyBzdHJlYW0gaWYgdGhlIG91dHB1dCBkbyBub3QgbmVlZCBpdCwgKi8KLSAgICAvKiBvciBpZiB0aGUgaW5wdXQgZmlsZSBkb2VzIG5vdCBoYXZlIGFueSBhdWRpbyBvciB2aWRlbyBzdHJlYW0gKi8KLSAgICAvKkZsQiAyNi4wMi4yMDA5OiBhZGQgbXAzIGFzIG1jcyBvdXRwdXQgZm9ybWF0Ki8KLSAgICBpZiggKCBwUGFyYW1zLT5PdXRwdXRWaWRlb0Zvcm1hdCA9PSBNNFZJREVPRURJVElOR19rTm9uZVZpZGVvKQotICAgICAgICB8fCAocEMtPlZpZGVvU3RhdGUgPT0gTTRNQ1Nfa1N0cmVhbVN0YXRlX05PU1RSRUFNKQotICAgICAgICB8fCAocFBhcmFtcy0+T3V0cHV0RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FNUikKLSAgICAgICAgfHwgKHBQYXJhbXMtPk91dHB1dEZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NUDMpICkKLSAgICB7Ci0gICAgICAgIHBDLT5ub3ZpZGVvID0gTTRPU0FfVFJVRTsKLSAgICB9Ci0KLSAgICBpZiggKCBwUGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdCA9PSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvKQotICAgICAgICB8fCAocEMtPkF1ZGlvU3RhdGUgPT0gTTRNQ1Nfa1N0cmVhbVN0YXRlX05PU1RSRUFNKSApCi0gICAgewotICAgICAgICBwQy0+bm9hdWRpbyA9IE00T1NBX1RSVUU7Ci0gICAgfQotCi0gICAgaWYoIHBDLT5ub2F1ZGlvICYmIHBDLT5ub3ZpZGVvICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIiEhISBNNE1DU19zZXRPdXRwdXRQYXJhbXMgOiBjbGlwIGlzIE5VTEwsIHRoZXJlIGlzIG5vIGF1ZGlvLCBubyB2aWRlbyIpOwotICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0RVUkFUSU9OX0lTX05VTEw7Ci0gICAgfQotCi0gICAgLyogU2V0IHdyaXRlciAqLwotICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRXcml0ZXIocENvbnRleHQsIHBQYXJhbXMtPk91dHB1dEZpbGVUeXBlKTsKLSAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgIC8qIFNldCB2aWRlbyBwYXJhbWV0ZXJzICovCi0gICAgaWYoIHBDLT5ub3ZpZGVvID09IE00T1NBX0ZBTFNFICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIFZpZGVvIEZvcm1hdCBjb3JyZWN0bmVzcyAqLwotCi0gICAgICAgIHN3aXRjaCggcFBhcmFtcy0+T3V0cHV0VmlkZW9Gb3JtYXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tIMjYzOgotICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zLT5PdXRwdXRGaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTVA0ICkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9IMjYzX0ZPUkJJRERFTl9JTl9NUDRfRklMRTsKLQotICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0ID0gTTRFTkNPREVSX2tIMjYzOwotICAgICAgICAgICAgICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRWaWRlb0VuY29kZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0KTsKLSAgICAgICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTVBFRzQ6Ci0KLSAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCA9IE00RU5DT0RFUl9rTVBFRzQ7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRNQ1Nfc2V0Q3VycmVudFZpZGVvRW5jb2RlcihwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9Gb3JtYXQpOwotICAgICAgICAgICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tIMjY0OgotCi0gICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQgPSBNNEVOQ09ERVJfa0gyNjQ7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRNQ1Nfc2V0Q3VycmVudFZpZGVvRW5jb2RlcihwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9Gb3JtYXQpOwotICAgICAgICAgICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tOdWxsVmlkZW86Ci0gICAgICAgICAgICAgICAgaWYoICggcFBhcmFtcy0+T3V0cHV0RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QNCkKLSAgICAgICAgICAgICAgICAgICAgJiYgKHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZQotICAgICAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rSDI2MykgKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0gyNjNfRk9SQklEREVOX0lOX01QNF9GSUxFOwotCi0KLSAgICAgICAgICAgICAgICAvKiBFbmNvZGVyIG5lZWRlZCBmb3IgYmVnaW4gY3V0IHRvIGdlbmVyYXRlIGFuIEktZnJhbWUgKi8KLSAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCA9IE00RU5DT0RFUl9rTlVMTDsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNE1DU19zZXRDdXJyZW50VmlkZW9FbmNvZGVyKHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUpOwotICAgICAgICAgICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19zZXRPdXRwdXRQYXJhbXM6IFVuZGVmaW5lZCBvdXRwdXQgdmlkZW8gZm9ybWF0ICglZCksXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GT1JNQVQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRk9STUFUOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgVmlkZW8gZnJhbWUgc2l6ZSBjb3JyZWN0bmVzcyAqLwotICAgICAgICBpZiggTTRWSURFT0VESVRJTkdfa051bGxWaWRlbyA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0Zvcm1hdCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVpRnJhbWVXaWR0aCA9Ci0gICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nV2lkdGggPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvV2lkdGg7Ci0gICAgICAgICAgICB1aUZyYW1lSGVpZ2h0ID0KLSAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdIZWlnaHQgPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvSGVpZ2h0OwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogU2V0IG91dHB1dCB2aWRlbyBwcm9maWxlIGFuZCBsZXZlbCAqLwotICAgICAgICAgICAgcEMtPmVuY29kaW5nVmlkZW9Qcm9maWxlID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb1Byb2ZpbGU7Ci0gICAgICAgICAgICAvKiogU2V0IHRoZSB0YXJnZXQgdmlkZW8gbGV2ZWwsIGJlY2F1c2UgaW5wdXQgM2dwIGZpbGUgbWF5Ci0gICAgICAgICAgICAgKiAgaGF2ZSB3cm9uZyB2aWRlbyBsZXZlbCB2YWx1ZSAoc29tZSBlbmNvZGVycyBkbyBub3QgcmVzcGVjdAotICAgICAgICAgICAgICogIGxldmVsIHJlc3RyaWN0aW9ucyBsaWtlIHZpZGVvIHJlc29sdXRpb24gd2hlbiBjb250ZW50IGlzIGNyZWF0ZWQpLgotICAgICAgICAgICAgICoqLwotICAgICAgICAgICAgcEMtPmVuY29kaW5nVmlkZW9MZXZlbCA9IHBQYXJhbXMtPm91dHB1dFZpZGVvTGV2ZWw7Ci0KLSAgICAgICAgICAgIC8vIENsaXAncyBvcmlnaW5hbCB3aWR0aCBhbmQgaGVpZ2h0IG1heSBub3QgYmUKLSAgICAgICAgICAgIC8vIG11bHRpcGxlIG9mIDE2LgotICAgICAgICAgICAgLy8gRW5zdXJlIGVuY29kaW5nIHdpZHRoIGFuZCBoZWlnaHQgYXJlIG11bHRpcGxlIG9mIDE2Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IHJlbWFpbmRlciA9IHBDLT5FbmNvZGluZ1dpZHRoICUgMTY7Ci0gICAgICAgICAgICBpZiAocmVtYWluZGVyICE9IDApIHsKLSAgICAgICAgICAgICAgICBpZiAocmVtYWluZGVyID49IDgpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gUm9sbCBmb3J3YXJkCi0gICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1dpZHRoICsgKDE2LXJlbWFpbmRlcik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gUm9sbCBiYWNrd2FyZAotICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdXaWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdXaWR0aCAtIHJlbWFpbmRlcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdWlGcmFtZVdpZHRoID0gcEMtPkVuY29kaW5nV2lkdGg7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlbWFpbmRlciA9IHBDLT5FbmNvZGluZ0hlaWdodCAlIDE2OwotICAgICAgICAgICAgaWYgKHJlbWFpbmRlciAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlbWFpbmRlciA+PSA4KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFJvbGwgZm9yd2FyZAotICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdIZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nSGVpZ2h0ICsgKDE2LXJlbWFpbmRlcik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gUm9sbCBiYWNrd2FyZAotICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdIZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nSGVpZ2h0IC0gcmVtYWluZGVyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1aUZyYW1lSGVpZ2h0ID0gcEMtPkVuY29kaW5nSGVpZ2h0OwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogU2V0IG91dHB1dCB2aWRlbyBwcm9maWxlIGFuZCBsZXZlbCAqLwotICAgICAgICAgICAgcEMtPmVuY29kaW5nVmlkZW9Qcm9maWxlID0gcFBhcmFtcy0+b3V0cHV0VmlkZW9Qcm9maWxlOwotICAgICAgICAgICAgcEMtPmVuY29kaW5nVmlkZW9MZXZlbCA9IHBQYXJhbXMtPm91dHB1dFZpZGVvTGV2ZWw7Ci0KLSAgICAgICAgICAgIHN3aXRjaCggcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1NRQ0lGOgotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lV2lkdGggPSBwQy0+RW5jb2RpbmdXaWR0aCA9IE00RU5DT0RFUl9TUUNJRl9XaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZUhlaWdodCA9IHBDLT5FbmNvZGluZ0hlaWdodCA9IE00RU5DT0RFUl9TUUNJRl9IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUVFWR0E6Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVXaWR0aCA9IHBDLT5FbmNvZGluZ1dpZHRoID0gTTRFTkNPREVSX1FRVkdBX1dpZHRoOwotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lSGVpZ2h0ID0gcEMtPkVuY29kaW5nSGVpZ2h0ID0gTTRFTkNPREVSX1FRVkdBX0hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRQ0lGOgotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lV2lkdGggPSBwQy0+RW5jb2RpbmdXaWR0aCA9IE00RU5DT0RFUl9RQ0lGX1dpZHRoOwotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lSGVpZ2h0ID0gcEMtPkVuY29kaW5nSGVpZ2h0ID0gTTRFTkNPREVSX1FDSUZfSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FWR0E6Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVXaWR0aCA9IHBDLT5FbmNvZGluZ1dpZHRoID0gTTRFTkNPREVSX1FWR0FfV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVIZWlnaHQgPSBwQy0+RW5jb2RpbmdIZWlnaHQgPSBNNEVOQ09ERVJfUVZHQV9IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQ0lGOgotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lV2lkdGggPSBwQy0+RW5jb2RpbmdXaWR0aCA9IE00RU5DT0RFUl9DSUZfV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVIZWlnaHQgPSBwQy0+RW5jb2RpbmdIZWlnaHQgPSBNNEVOQ09ERVJfQ0lGX0hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tWR0E6Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVXaWR0aCA9IHBDLT5FbmNvZGluZ1dpZHRoID0gTTRFTkNPREVSX1ZHQV9XaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZUhlaWdodCA9IHBDLT5FbmNvZGluZ0hlaWdodCA9IE00RU5DT0RFUl9WR0FfSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgLyogK1BSIExWNTgwNyAqLwotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1dWR0E6Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVXaWR0aCA9IHBDLT5FbmNvZGluZ1dpZHRoID0gTTRFTkNPREVSX1dWR0FfV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVIZWlnaHQgPSBwQy0+RW5jb2RpbmdIZWlnaHQgPSBNNEVOQ09ERVJfV1ZHQV9IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTlRTQzoKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZVdpZHRoID0gcEMtPkVuY29kaW5nV2lkdGggPSBNNEVOQ09ERVJfTlRTQ19XaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZUhlaWdodCA9IHBDLT5FbmNvZGluZ0hlaWdodCA9IE00RU5DT0RFUl9OVFNDX0hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIC8qIC1QUiBMVjU4MDcqLwotICAgICAgICAgICAgICAgICAgICAvKiArQ1IgR29vZ2xlICovCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNjQwXzM2MDoKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZVdpZHRoID0gcEMtPkVuY29kaW5nV2lkdGggPSBNNEVOQ09ERVJfNjQwXzM2MF9XaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZUhlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdIZWlnaHQgPSBNNEVOQ09ERVJfNjQwXzM2MF9IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rODU0XzQ4MDoKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZVdpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1dpZHRoID0gTTRFTkNPREVSXzg1NF80ODBfV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVIZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nSGVpZ2h0ID0gTTRFTkNPREVSXzg1NF80ODBfSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEyODBfNzIwOgotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lV2lkdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nV2lkdGggPSBNNEVOQ09ERVJfMTI4MF83MjBfV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVIZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nSGVpZ2h0ID0gTTRFTkNPREVSXzEyODBfNzIwX0hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMDgwXzcyMDoKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZVdpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1dpZHRoID0gTTRFTkNPREVSXzEwODBfNzIwX1dpZHRoOwotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lSGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ0hlaWdodCA9IE00RU5DT0RFUl8xMDgwXzcyMF9IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rOTYwXzcyMDoKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZVdpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1dpZHRoID0gTTRFTkNPREVSXzk2MF83MjBfV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVIZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nSGVpZ2h0ID0gTTRFTkNPREVSXzk2MF83MjBfSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazE5MjBfMTA4MDoKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZVdpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1dpZHRoID0gTTRFTkNPREVSXzE5MjBfMTA4MF9XaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZUhlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdIZWlnaHQgPSBNNEVOQ09ERVJfMTkyMF8xMDgwX0hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIC8qIC1DUiBHb29nbGUgKi8KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19zZXRPdXRwdXRQYXJhbXM6IFVuZGVmaW5lZCBvdXRwdXQgdmlkZW8gZnJhbWUgc2l6ZSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAoJWQpLCByZXR1cm5pbmcgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfU0laRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GUkFNRV9TSVpFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ29tcHV0ZSB2aWRlbyBtYXggYXUgc2l6ZSBhbmQgbWF4IGNodW5jayBzaXplLgotICAgICAgICAqIFdlIGRvIGl0IGhlcmUgYmVjYXVzZSBpdCBkZXBlbmRzIG9uIHRoZSBmcmFtZSBzaXplIG9ubHksIGFuZAotICAgICAgICAqIGJlY2F1c2Ugd2UgbmVlZCBpdCBmb3IgdGhlIGZpbGUgc2l6ZS92aWRlbyBiaXRyYXRlIGVzdGltYXRpb25zICovCi0gICAgICAgIHBDLT51aVZpZGVvTWF4QXVTaXplID0KLSAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKDEuNUYgKihNNE9TQV9GbG9hdCkodWlGcmFtZVdpZHRoICogdWlGcmFtZUhlaWdodCkgXAotICAgICAgICAgICAgKk00TUNTX1ZJREVPX01JTl9DT01QUkVTU0lPTl9SQVRJTyk7Ci0gICAgICAgIHBDLT51aVZpZGVvTWF4Q2h1bmNrU2l6ZSA9IChNNE9TQV9VSW50MzIpKHBDLT51aVZpZGVvTWF4QXVTaXplICAgICAgIFwKLSAgICAgICAgICAgICoKLSAgICAgICAgICAgIE00TUNTX1ZJREVPX0NIVU5LX0FVX1NJWkVfUkFUSU8pOyAvKio8IGZyb20gbWF4IEFVIHNpemUgdG8gbWF4IENodW5jayBzaXplICovCi0KLSAgICAgICAgaWYoIDAgPT0gcEMtPnVpVmlkZW9NYXhBdVNpemUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBTaXplIG1heSBiZSB6ZXJvIGluIGNhc2Ugb2YgbnVsbCBlbmNvZGluZyB3aXRoIHVucmVjb2duaXplZCBzdHJlYW0gKi8KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19zZXRPdXRwdXRQYXJhbXM6IHZpZGVvIGZyYW1lIHNpemUgaXMgMCByZXR1cm5pbmdcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GUkFNRV9TSVpFIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfU0laRTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogU2l6ZSBjaGVjayBmb3IgSDI2MyAob25seSB2YWxpZCBzaXplcyBhcmUgQ0lGLCBRQ0lGIGFuZCBTUUNJRikgKi8KLQotICAgICAgICBpZiggTTRWSURFT0VESVRJTkdfa0gyNjMgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9Gb3JtYXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2goIHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tTUUNJRjoKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRQ0lGOgotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0NJRjoKLSAgICAgICAgICAgICAgICAgICAgLyogT0sgKi8KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19zZXRPdXRwdXRQYXJhbXMoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRNQ1NfRVJSX0lOVkFMSURfVklERU9fRlJBTUVfU0laRV9GT1JfSDI2MyIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0lOVkFMSURfVklERU9fRlJBTUVfU0laRV9GT1JfSDI2MzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIFZpZGVvIEZyYW1lIHJhdGUgY29ycmVjdG5lc3MgKi8KLSAgICAgICAgaWYoIE00VklERU9FRElUSU5HX2tOdWxsVmlkZW8gIT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9Gb3JtYXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2goIHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVSYXRlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s1X0ZQUzoKLSAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nVmlkZW9GcmFtZXJhdGUgPSBNNEVOQ09ERVJfazVfRlBTOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazdfNV9GUFM6Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlID0gTTRFTkNPREVSX2s3XzVfRlBTOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEwX0ZQUzoKLSAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nVmlkZW9GcmFtZXJhdGUgPSBNNEVOQ09ERVJfazEwX0ZQUzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMl81X0ZQUzoKLSAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nVmlkZW9GcmFtZXJhdGUgPSBNNEVOQ09ERVJfazEyXzVfRlBTOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazE1X0ZQUzoKLSAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nVmlkZW9GcmFtZXJhdGUgPSBNNEVOQ09ERVJfazE1X0ZQUzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syMF9GUFM6Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlID0gTTRFTkNPREVSX2syMF9GUFM7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjVfRlBTOgotICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdWaWRlb0ZyYW1lcmF0ZSA9IE00RU5DT0RFUl9rMjVfRlBTOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazMwX0ZQUzoKLSAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nVmlkZW9GcmFtZXJhdGUgPSBNNEVOQ09ERVJfazMwX0ZQUzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19zZXRPdXRwdXRQYXJhbXM6IFVuZGVmaW5lZCBvdXRwdXQgdmlkZW8gZnJhbWUgcmF0ZVwKLSAgICAgICAgICAgICAgICAgICAgICAgICglZCksIHJldHVybmluZyBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GUkFNRV9SQVRFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVSYXRlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZSQU1FX1JBVEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBGcmFtZSByYXRlIGNoZWNrIGZvciBIMjYzIChvbmx5IGRpdmlkZXJzIG9mIDMwIGZwcyAoMjkuOTcgYWN0dWFsbHkpKSAqLwotICAgICAgICBpZiggTTRWSURFT0VESVRJTkdfa0gyNjMgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9Gb3JtYXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2goIHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rNV9GUFM6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazdfNV9GUFM6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazEwX0ZQUzoKLSAgICAgICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rMTVfRlBTOgotICAgICAgICAgICAgICAgIGNhc2UgTTRFTkNPREVSX2szMF9GUFM6Ci0gICAgICAgICAgICAgICAgICAgIC8qIE9LICovCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00TUNTX0VSUl9JTlZBTElEX1ZJREVPX0ZSQU1FX1JBVEVfRk9SX0gyNjMiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9JTlZBTElEX1ZJREVPX0ZSQU1FX1JBVEVfRk9SX0gyNjM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBTZXQgYXVkaW8gcGFyYW1ldGVycyAqLwotICAgIGlmKCBwQy0+bm9hdWRpbyA9PSBNNE9TQV9GQUxTRSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayBBdWRpbyBGb3JtYXQgY29ycmVjdG5lc3MgKi8KLSAgICAgICAgc3dpdGNoKCBwUGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FNUl9OQjoKLQotICAgICAgICAgICAgICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRBdWRpb0VuY29kZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvRm9ybWF0KTsKLSAgICAgICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0FNUk5COwotICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazgwMDBIejsKLSAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuQ2hhbm5lbE51bSA9IE00RU5DT0RFUl9rTW9ubzsKLSAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuU3BlY2lmUGFyYW0uQW1yU0lEID0gTTRFTkNPREVSX2tBbXJOb1NJRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDOgotCi0gICAgICAgICAgICAgICAgZXJyID0gTTRNQ1Nfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcihwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9Gb3JtYXQpOwotICAgICAgICAgICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rQUFDOwotICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazE2MDAwSHo7Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2goIHBQYXJhbXMtPk91dHB1dEF1ZGlvU2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rODAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2s4MDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxNjAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2sxNjAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjIwNTBfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMjIwNTBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazI0MDAwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazI0MDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2szMjAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2szMjAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNDQxMDBfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rNDQxMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazQ4MDAwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazQ4MDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMTAyNV9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEyMDAwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRGVmYXVsdF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChwUGFyYW1zLT5iQXVkaW9Nb25vID09IE00T1NBX1RSVUUpID8gXAotICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2tNb25vIDogTTRFTkNPREVSX2tTdGVyZW87Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5SZWd1bGF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rQWFjUmVndWxOb25lOyAvL000RU5DT0RFUl9rQWFjQml0UmVzZXJ2b2lyCi0gICAgICAgICAgICAgICAgICAgIC8qIHVudXNlZCAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuU3BlY2lmUGFyYW0uQWFjUGFyYW0uYklTID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5iTVMgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFhY1BhcmFtLmJQTlMgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFhY1BhcmFtLmJUTlMgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgLyogVE9ETyBjaGFuZ2UgaW50byBoaWdoc3BlZWQgYXNhcCAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuU3BlY2lmUGFyYW0uQWFjUGFyYW0uYkhpZ2hTcGVlZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgLypGbEIgMjYuMDIuMjAwOTogYWRkIG1wMyBhcyBtY3Mgb3V0cHV0IGZvcm1hdCwgYWRkIG1wMyBlbmNvZGVyKi8KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tNUDM6Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRBdWRpb0VuY29kZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdCk7Ci0gICAgICAgICAgICAgICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa01QMzsKLSAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgKHBQYXJhbXMtPmJBdWRpb01vbm8gPT0gTTRPU0FfVFJVRSkgPyBcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfa01vbm8gOiBNNEVOQ09ERVJfa1N0ZXJlbzsKLQotICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2sxNjAwMEh6OwotCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCggcFBhcmFtcy0+T3V0cHV0QXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazgwMDBfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazgwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTEwMjVfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazExMDI1SHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEyMDAwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2sxMjAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxNjAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMTYwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjIwNTBfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazIyMDUwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazI0MDAwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2syNDAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2szMjAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMzIwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNDQxMDBfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazQ0MTAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazQ4MDAwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2s0ODAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tEZWZhdWx0X0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTnVsbEF1ZGlvOgotICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+cEVmZmVjdHMgPT0gTTRPU0FfTlVMTCB8fCBwUGFyYW1zLT5uYkVmZmVjdHMgPT0gMCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIGVuY29kZXIgbmVlZGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID0gTTRFTkNPREVSX2tBdWRpb05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX3NhbXBsaW5nRnJlcXVlbmN5OwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHMgPT0gMSkgPyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2tNb25vIDogTTRFTkNPREVSX2tTdGVyZW87Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX3NhbXBsaW5nRnJlcXVlbmN5OwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHMgPT0gMSkgPyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2tNb25vIDogTTRFTkNPREVSX2tTdGVyZW87Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCggcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBTVJfTkI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX3NldE91dHB1dFBhcmFtcyBjYWxsaW5nIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX3NldEN1cnJlbnRBdWRpb0VuY29kZXIgTTRWSURFT0VESVRJTkdfa051bGwsIEFNUiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE1DU19zZXRDdXJyZW50QXVkaW9FbmNvZGVyKHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rQU1STkI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazgwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gPSBNNEVOQ09ERVJfa01vbm87Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fc2FtcGxpbmdGcmVxdWVuY3kKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IDgwMDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID0gTTRFTkNPREVSX2tBTVJOQjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuU3BlY2lmUGFyYW0uQW1yU0lEID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rQW1yTm9TSUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19zZXRPdXRwdXRQYXJhbXMgY2FsbGluZyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19zZXRDdXJyZW50QXVkaW9FbmNvZGVyIE00VklERU9FRElUSU5HX2tOdWxsLCBBQUMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRNQ1Nfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcihwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0FBQzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFhY1BhcmFtLlJlZ3VsYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2tBYWNSZWd1bE5vbmU7IC8vTTRFTkNPREVSX2tBYWNCaXRSZXNlcnZvaXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMTYwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMTYwMDBIejsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zYW1wbGluZ0ZyZXF1ZW5jeSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjAwMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rMTYwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjIwNTA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfazIyMDUwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI0MDAwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2syNDAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjAwMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rMzIwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDQxMDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfazQ0MTAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ4MDAwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2s0ODAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0FBQzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bnVzZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuU3BlY2lmUGFyYW0uQWFjUGFyYW0uYklTID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFhY1BhcmFtLmJNUyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5iUE5TID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFhY1BhcmFtLmJUTlMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPIGNoYW5nZSBpbnRvIGhpZ2hzcGVlZCBhc2FwICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFhY1BhcmFtLmJIaWdoU3BlZWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTVAzOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zIGNhbGxpbmdcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX3NldEN1cnJlbnRBdWRpb0VuY29kZXIgTTRWSURFT0VESVRJTkdfa051bGwsIE1QMyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRBdWRpb0VuY29kZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID0gTTRFTkNPREVSX2tNUDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMTYwMDBIejsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCggcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4MDAwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2s4MDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2MDAwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2sxNjAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjA1MDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rMjIwNTBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQwMDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfazI0MDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMyMDAwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2szMjAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0NDEwMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rNDQxMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDgwMDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfazQ4MDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rTVAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tFVlJDOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rVW5zdXBwb3J0ZWRBdWRpbzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19zZXRPdXRwdXRQYXJhbXM6IE91dHB1dCBhdWRpbyBmb3JtYXQgKCVkKSBpc1wKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb21wYXRpYmxlIHdpdGggYXVkaW8gZWZmZWN0cywgcmV0dXJuaW5nIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfQVVESU9fRk9STUFUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfQVVESU9fRk9STUFUOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAvKiBFVlJDCi0gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRVZSQzoKLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgZXJyID0gTTRNQ1Nfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcihwQ29udGV4dCwgcFBhcmFtcy0+XAotICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgT3V0cHV0QXVkaW9Gb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rRVZSQzsKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rODAwMEh6OwotICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuQ2hhbm5lbE51bSA9IE00RU5DT0RFUl9rTW9ubzsKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgYnJlYWs7ICovCi0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zOiBVbmRlZmluZWQgb3V0cHV0IGF1ZGlvIGZvcm1hdCAoJWQpLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX0FVRElPX0ZPUk1BVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvRm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX0FVRElPX0ZPUk1BVDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKCBwUGFyYW1zLT5wT3V0cHV0UENNZmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIHBDLT5wT3V0cHV0UENNZmlsZSA9IHBQYXJhbXMtPnBPdXRwdXRQQ01maWxlOwotCi0gICAgICAgIC8qIE9wZW4gb3V0cHV0IFBDTSBmaWxlICovCi0gICAgICAgIHBDLT5wT3NhRmlsZVdyaXRQdHItPm9wZW5Xcml0ZSgmKHBDLT5wT3V0cHV0UENNZmlsZSksCi0gICAgICAgICAgICBwUGFyYW1zLT5wT3V0cHV0UENNZmlsZSwgTTRPU0Ffa0ZpbGVXcml0ZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBDLT5wT3V0cHV0UENNZmlsZSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLypTdG9yZSBtZWRpYSByZW5kZXJpbmcgcGFyYW1ldGVyIGludG8gdGhlIGludGVybmFsIGNvbnRleHQqLwotICAgIHBDLT5NZWRpYVJlbmRlcmluZyA9IHBQYXJhbXMtPk1lZGlhUmVuZGVyaW5nOwotCi0gICAgLyogQWRkIGF1ZGlvIGVmZmVjdHMqLwotICAgIC8qQ29weSBNQ1MgZWZmZWN0cyBzdHJ1Y3R1cmUgaW50byBpbnRlcm5hbCBjb250ZXh0Ki8KLSAgICBpZiggcFBhcmFtcy0+bmJFZmZlY3RzID4gMCApCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgaiA9IDA7Ci0gICAgICAgIHBDLT5uYkVmZmVjdHMgPSBwUGFyYW1zLT5uYkVmZmVjdHM7Ci0gICAgICAgIHBDLT5wRWZmZWN0cyA9IChNNE1DU19FZmZlY3RTZXR0aW5ncyAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+bmJFZmZlY3RzIFwKLSAgICAgICAgICAgICpzaXplb2YoTTRNQ1NfRWZmZWN0U2V0dGluZ3MpLCBNNE1DUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopIkFsbG9jYXRpb24gb2YgZWZmZWN0cyBsaXN0Iik7Ci0KLSAgICAgICAgaWYoIHBDLT5wRWZmZWN0cyA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TUNTX3NldE91dHB1dFBhcmFtcygpOiBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKCBqID0gMDsgaiA8IHBDLT5uYkVmZmVjdHM7IGorKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIENvcHkgZWZmZWN0IHRvICJsb2NhbCIgc3RydWN0dXJlICovCi0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKikgJihwQy0+cEVmZmVjdHNbal0pLAotICAgICAgICAgICAgICAgICh2b2lkICopICYocFBhcmFtcy0+cEVmZmVjdHNbal0pLAotICAgICAgICAgICAgICAgIHNpemVvZihNNE1DU19FZmZlY3RTZXR0aW5ncykpOwotCi0gICAgICAgICAgICBzd2l0Y2goIHBDLT5wRWZmZWN0c1tqXS5BdWRpb0VmZmVjdFR5cGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgTTRNQ1Nfa0F1ZGlvRWZmZWN0VHlwZV9Ob25lOgotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19zZXRPdXRwdXRQYXJhbXMoKTogZWZmZWN0IHR5cGUgJWkgaXMgTm9uZSIsIGopOwotICAgICAgICAgICAgICAgICAgICBwQy0+cEVmZmVjdHNbal0ucEV4dEF1ZGlvRWZmZWN0RmN0Q3R4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wRWZmZWN0c1tqXS5FeHRBdWRpb0VmZmVjdEZjdCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNE1DU19rQXVkaW9FZmZlY3RUeXBlX0ZhZGVJbjoKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zKCk6IGVmZmVjdCB0eXBlICVpIGlzIEZhZGVJbiIsIGopOwotICAgICAgICAgICAgICAgICAgICBwQy0+cEVmZmVjdHNbal0ucEV4dEF1ZGlvRWZmZWN0RmN0Q3R4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wRWZmZWN0c1tqXS5FeHRBdWRpb0VmZmVjdEZjdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19lZGl0QXVkaW9FZmZlY3RGY3RfRmFkZUluOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRNQ1Nfa0F1ZGlvRWZmZWN0VHlwZV9GYWRlT3V0OgotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19zZXRPdXRwdXRQYXJhbXMoKTogZWZmZWN0IHR5cGUgJWkgaXMgRmFkZU91dCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBqKTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBFZmZlY3RzW2pdLnBFeHRBdWRpb0VmZmVjdEZjdEN0eHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICBwQy0+cEVmZmVjdHNbal0uRXh0QXVkaW9FZmZlY3RGY3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfZWRpdEF1ZGlvRWZmZWN0RmN0X0ZhZGVPdXQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNE1DU19rQXVkaW9FZmZlY3RUeXBlX0V4dGVybmFsOgotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19zZXRPdXRwdXRQYXJhbXMoKTogZWZmZWN0IHR5cGUgJWkgaXMgRXh0ZXJuYWwiLAotICAgICAgICAgICAgICAgICAgICAgICAgaik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBFZmZlY3RzICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+cEVmZmVjdHNbal0uRXh0QXVkaW9FZmZlY3RGY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zKCk6IG5vIGV4dGVybmFsIGVmZmVjdCBmdW5jdGlvblwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NvY2lhdGVkIHRvIGV4dGVybmFsIGVmZmVjdCBudW1iZXIgJWkiLCBqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBFZmZlY3RzW2pdLnBFeHRBdWRpb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBFZmZlY3RzW2pdLnBFeHRBdWRpb0VmZmVjdEZjdEN0eHQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wRWZmZWN0c1tqXS5FeHRBdWRpb0VmZmVjdEZjdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+cEVmZmVjdHNbal0uRXh0QXVkaW9FZmZlY3RGY3Q7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX3NldE91dHB1dFBhcmFtcygpOiBlZmZlY3QgdHlwZSBub3QgcmVjb2duaXplZCIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBDLT5uYkVmZmVjdHMgPSAwOwotICAgICAgICBwQy0+cEVmZmVjdHMgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogVXBkYXRlIHN0YXRlIGF1dG9tYXRvbiAqLwotICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9TRVQ7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX3NldE91dHB1dFBhcmFtcygpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19zZXRFbmNvZGluZ1BhcmFtcyhNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNE1DU19FbmNvZGluZ1BhcmFtcyogcFJhdGVzKQotICogQGJyaWVmICAgU2V0IHRoZSB2YWx1ZXMgb2YgdGhlIGVuY29kaW5nIHBhcmFtZXRlcnMKLSAqIEBub3RlICAgIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBNNE1DU19jaGVja1BhcmFtc0FuZFN0YXJ0KCkuCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHBhcmFtICAgcFJhdGVzICAgICAgICAgICAgIChJTikgVHJhbnNjb2RpbmcgcGFyYW1ldGVycwotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19ISUdIOiBBdWRpbyBiaXRyYXRlIHRvbyBoaWdoICh3ZSBsaW1pdCB0byA5NiBrYnBzKQotICogQHJldHVybiAgTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fTE9XOiBBdWRpbyBiaXRyYXRlIGlzIHRvbyBsb3cgKDE2IGticHMgbWluIGZvciBhYWMsIDEyLjIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYW1yLCA4IGZvciBtcDMpCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfQkVHSU5fQ1VUX0VRVUFMU19FTkRfQ1VUOiBCZWdpbiBjdXQgYW5kIEVuZCBjdXQgYXJlIGVxdWFscwotICogQHJldHVybiAgTTRNQ1NfRVJSX0JFR0lOX0NVVF9MQVJHRVJfVEhBTl9EVVJBVElPTjogQmVnaW4gY3V0IHRpbWUgaXMgbGFyZ2VyIHRoYW4gdGhlIGlucHV0IGNsaXAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbgotICogQHJldHVybiAgTTRNQ1NfRVJSX0VORF9DVVRfU01BTExFUl9USEFOX0JFR0lOX0NVVDogRW5kIGN1dCB0aW1lIGlzIHNtYWxsZXIgdGhhbiBiZWdpbiBjdXQgdGltZQotICogQHJldHVybiAgTTRNQ1NfRVJSX01BWEZJTEVTSVpFX1RPT19TTUFMTDogTm90IGVub3VnaCBzcGFjZSB0byBzdG9yZSB3aG9sZSBvdXRwdXQgZmlsZSBhdCBnaXZlbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRyYXRlcwotICogQHJldHVybiAgTTRNQ1NfRVJSX1ZJREVPQklUUkFURV9UT09fSElHSDogVmlkZW8gYml0cmF0ZSB0b28gaGlnaCAod2UgbGltaXQgdG8gODAwIGticHMpCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfVklERU9CSVRSQVRFX1RPT19MT1c6ICBWaWRlbyBiaXRyYXRlIHRvbyBsb3cKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX3NldEVuY29kaW5nUGFyYW1zKCBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0VuY29kaW5nUGFyYW1zICpwUmF0ZXMgKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICopKHBDb250ZXh0KTsKLSAgICBNNE9TQV9VSW50MzIgaiA9IDA7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMigKLSAgICAgICAgIk00TUNTX3NldEVuY29kaW5nUGFyYW1zIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgsIHBSYXRlcz0weCV4IiwKLSAgICAgICAgcENvbnRleHQsIHBSYXRlcyk7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19zZXRFbmNvZGluZ1BhcmFtczogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwUmF0ZXMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19zZXRFbmNvZGluZ1BhcmFtczogcFJhdGVzIGlzIE00T1NBX05VTEwiKTsKLQotI2lmZGVmIE00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRQotCi0gICAgaWYoIHBDLT5tX2JJc1N0aWxsUGljdHVyZSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIHN0aWxsIHBpY3R1cmUgTUNTIGZ1bmN0aW9uKi8KLSAgICAgICAgcmV0dXJuIE00TUNTX3N0aWxsUGljU2V0RW5jb2RpbmdQYXJhbXMocEMsIHBSYXRlcyk7Ci0gICAgfQotCi0jZW5kaWYgLypNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUqLwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24gKi8KLQotICAgIGlmKCBNNE1DU19rU3RhdGVfU0VUICE9IHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19zZXRFbmNvZGluZ1BhcmFtcygpOiBXcm9uZyBTdGF0ZSAoJWQpLCByZXR1cm5pbmcgTTRFUlJfU1RBVEUiLAotICAgICAgICAgICAgcEMtPlN0YXRlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qIFNldCBnaXZlbiB2YWx1ZXMgKi8KLSAgICBwQy0+dWlWaWRlb0JpdHJhdGUgPSBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZTsKLSAgICBwQy0+dWlBdWRpb0JpdHJhdGUgPSBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZTsKLSAgICBwQy0+dWlCZWdpbkN1dFRpbWUgPSBwUmF0ZXMtPkJlZ2luQ3V0VGltZTsKLSAgICBwQy0+dWlFbmRDdXRUaW1lID0gcFJhdGVzLT5FbmRDdXRUaW1lOwotICAgIHBDLT51aU1heEZpbGVTaXplID0gcFJhdGVzLT5PdXRwdXRGaWxlU2l6ZTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgYmVnaW4gY3V0IHRpbWUgdmFsaWRpdHkgKi8KLSAgICBpZiggcEMtPnVpQmVnaW5DdXRUaW1lID49IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNE1DU19zZXRFbmNvZGluZ1BhcmFtcygpOiBCZWdpbiBjdXQgbGFyZ2VyIHRoYW4gZHVyYXRpb24gKCVkPiVkKSxcCi0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE1DU19FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0RVUkFUSU9OIiwKLSAgICAgICAgICAgICAgICAgICAgICAgcEMtPnVpQmVnaW5DdXRUaW1lLCBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbik7Ci0gICAgICAgIHJldHVybiBNNE1DU19FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0RVUkFUSU9OOwotICAgIH0KLQotICAgIC8qKgotICAgICogSWYgZW5kIGN1dCB0aW1lIGlzIHRvbyBsYXJnZSwgd2Ugc2V0IGl0IHRvIHRoZSBjbGlwIGR1cmF0aW9uICovCi0gICAgaWYoIHBDLT51aUVuZEN1dFRpbWUgPiBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiApCi0gICAgewotICAgICAgICBwQy0+dWlFbmRDdXRUaW1lID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBlbmQgY3V0IHRpbWUgdmFsaWRpdHkgKi8KLSAgICBpZiggcEMtPnVpRW5kQ3V0VGltZSA+IDAgKQotICAgIHsKLSAgICAgICAgaWYoIHBDLT51aUVuZEN1dFRpbWUgPCBwQy0+dWlCZWdpbkN1dFRpbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTRNQ1Nfc2V0RW5jb2RpbmdQYXJhbXMoKTogQmVnaW4gY3V0IGdyZWF0ZXIgdGhhbiBlbmQgY3V0ICglZCwlZCksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE1DU19FUlJfRU5EX0NVVF9TTUFMTEVSX1RIQU5fQkVHSU5fQ1VUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT51aUJlZ2luQ3V0VGltZSwgcEMtPnVpRW5kQ3V0VGltZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0VORF9DVVRfU01BTExFUl9USEFOX0JFR0lOX0NVVDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBwQy0+dWlFbmRDdXRUaW1lID09IHBDLT51aUJlZ2luQ3V0VGltZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNE1DU19zZXRFbmNvZGluZ1BhcmFtcygpOiBCZWdpbiBhbmQgRW5kIGN1dHMgYXJlIGVxdWFsICglZCwlZCksXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00TUNTX0VSUl9CRUdJTl9DVVRfRVFVQUxTX0VORF9DVVQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnVpQmVnaW5DdXRUaW1lLCBwQy0+dWlFbmRDdXRUaW1lKTsKLSAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfQkVHSU5fQ1VUX0VRVUFMU19FTkRfQ1VUOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBGbEIgMjAwOS4wMy4wNDogY2hlY2sgYXVkaW8gZWZmZWN0cyBzdGFydCB0aW1lIGFuZCBkdXJhdGlvbiB2YWxpZGl0eSovCi0gICAgZm9yICggaiA9IDA7IGogPCBwQy0+bmJFZmZlY3RzOyBqKysgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIG91dHB1dEVuZEN1dCA9IHBDLT51aUVuZEN1dFRpbWU7Ci0KLSAgICAgICAgaWYoIHBDLT51aUVuZEN1dFRpbWUgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG91dHB1dEVuZEN1dCA9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIHBDLT5wRWZmZWN0c1tqXS51aVN0YXJ0VGltZSA+IChvdXRwdXRFbmRDdXQgLSBwQy0+dWlCZWdpbkN1dFRpbWUpICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00TUNTX3NldEVuY29kaW5nUGFyYW1zKCk6IEVmZmVjdHMgc3RhcnQgdGltZSBpcyBsYXJnZXIgdGhhblwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uICglZCwlZCksIHJldHVybmluZyBNNEVSUl9QQVJBTUVURVIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBFZmZlY3RzW2pdLnVpU3RhcnRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDLT51aUVuZEN1dFRpbWUgLSBwQy0+dWlCZWdpbkN1dFRpbWUpKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggcEMtPnBFZmZlY3RzW2pdLnVpU3RhcnRUaW1lICsgcEMtPnBFZmZlY3RzW2pdLnVpRHVyYXRpb24gPiBcCi0gICAgICAgICAgICAob3V0cHV0RW5kQ3V0IC0gcEMtPnVpQmVnaW5DdXRUaW1lKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFJlLWFkanVzdCB0aGUgZWZmZWN0IGR1cmF0aW9uIHVudGlsIHRoZSBlbmQgb2YgdGhlIG91dHB1dCBjbGlwKi8KLSAgICAgICAgICAgIHBDLT5wRWZmZWN0c1tqXS51aUR1cmF0aW9uID0gKG91dHB1dEVuZEN1dCAtIHBDLT51aUJlZ2luQ3V0VGltZSkgLSBcCi0gICAgICAgICAgICAgICAgcEMtPnBFZmZlY3RzW2pdLnVpU3RhcnRUaW1lOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgYXVkaW8gYml0cmF0ZSBjb25zaXN0ZW5jeSAqLwotICAgIGlmKCAoIHBDLT5ub2F1ZGlvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAmJiAocEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCAhPSBNNEVOQ09ERVJfa0F1ZGlvTlVMTCkgKQotICAgIHsKLSAgICAgICAgaWYoIHBDLT51aUF1ZGlvQml0cmF0ZSAhPSBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID09IE00RU5DT0RFUl9rQU1STkIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBwQy0+dWlBdWRpb0JpdHJhdGUgPiBNNFZJREVPRURJVElOR19rMTJfMl9LQlBTICkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0hJR0g7Ci0KLSAgICAgICAgICAgICAgICBpZiggcEMtPnVpQXVkaW9CaXRyYXRlIDwgTTRWSURFT0VESVRJTkdfazEyXzJfS0JQUyApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19MT1c7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL0VWUkMKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgZWxzZSBpZihwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID09IE00RU5DT0RFUl9rRVZSQykKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgaWYocEMtPnVpQXVkaW9CaXRyYXRlID4gTTRWSURFT0VESVRJTkdfazlfMl9LQlBTKQotICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19ISUdIOwotICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgaWYocEMtPnVpQXVkaW9CaXRyYXRlIDwgTTRWSURFT0VESVRJTkdfazlfMl9LQlBTKQotICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fTE9XOwotICAgICAgICAgICAgLy8gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKkZsQiAyNi4wMi4yMDA5OiBhZGQgbXAzIGFzIG1jcyBvdXRwdXQgZm9ybWF0LCBhZGQgbXAzIGVuY29kZXIqLwotICAgICAgICAgICAgZWxzZSBpZiggcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9PSBNNEVOQ09ERVJfa01QMyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPj0gTTRFTkNPREVSX2szMjAwMEh6ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qTXBlZyBsYXllciAxKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT51aUF1ZGlvQml0cmF0ZSA+IDMyMDAwMCApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fSElHSDsKLQotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPnVpQXVkaW9CaXRyYXRlIDwgMzIwMDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0xPVzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA+PSBNNEVOQ09ERVJfazE2MDAwSHogKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypNcGVnIGxheWVyIDIqLwotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPnVpQXVkaW9CaXRyYXRlID4gMTYwMDAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19ISUdIOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAoIHBDLT51aUF1ZGlvQml0cmF0ZSA8IDgwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHBDLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtID09IE00RU5DT0RFUl9rTW9ubykKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IChwQy0+dWlBdWRpb0JpdHJhdGUgPCAxNjAwMAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgcEMtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0KLSAgICAgICAgICAgICAgICAgICAgICAgID09IE00RU5DT0RFUl9rU3RlcmVvKSApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fTE9XOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID09IE00RU5DT0RFUl9rODAwMEh6Ci0gICAgICAgICAgICAgICAgICAgIHx8IHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPT0gTTRFTkNPREVSX2sxMTAyNUh6Ci0gICAgICAgICAgICAgICAgICAgIHx8IHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPT0gTTRFTkNPREVSX2sxMjAwMEh6ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qTXBlZyBsYXllciAyLjUqLwotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPnVpQXVkaW9CaXRyYXRlID4gNjQwMDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0hJR0g7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoICggcEMtPnVpQXVkaW9CaXRyYXRlIDwgODAwMAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgcEMtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gPT0gTTRFTkNPREVSX2tNb25vKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHBDLT51aUF1ZGlvQml0cmF0ZSA8IDE2MDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBwQy0+QXVkaW9FbmNQYXJhbXMuQ2hhbm5lbE51bQotICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRFTkNPREVSX2tTdGVyZW8pICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19MT1c7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19zZXRFbmNvZGluZ1BhcmFtczogTVAzIGF1ZGlvIHNhbXBsaW5nIGZyZXF1ZW5jeSBlcnJvclwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCVkKSIsIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggcEMtPnVpQXVkaW9CaXRyYXRlID4gTTRWSURFT0VESVRJTkdfazE5Ml9LQlBTICkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0hJR0g7Ci0KLSAgICAgICAgICAgICAgICBpZiggcEMtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gPT0gTTRFTkNPREVSX2tNb25vICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+dWlBdWRpb0JpdHJhdGUgPCBNNFZJREVPRURJVElOR19rMTZfS0JQUyApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fTE9XOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPnVpQXVkaW9CaXRyYXRlIDwgTTRWSURFT0VESVRJTkdfazMyX0tCUFMgKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0xPVzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogTlVMTCBhdWRpbyA6IGNvcHkgaW5wdXQgZmlsZSBiaXRyYXRlICovCi0gICAgICAgIHBDLT51aUF1ZGlvQml0cmF0ZSA9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQXVkaW9CaXRyYXRlOwotICAgIH0KLQotICAgIC8qIENoZWNrIHZpZGVvIGJpdHJhdGUgY29uc2lzdGVuY3kgKi8KLSAgICBpZiggKCBwQy0+bm92aWRlbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgJiYgKHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0ICE9IE00RU5DT0RFUl9rTlVMTCkgKQotICAgIHsKLSAgICAgICAgaWYoIHBDLT51aVZpZGVvQml0cmF0ZSAhPSBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBwQy0+dWlWaWRlb0JpdHJhdGUgPiBNNFZJREVPRURJVElOR19rOF9NQlBTICkKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX1ZJREVPQklUUkFURV9UT09fSElHSDsKLQotICAgICAgICAgICAgaWYoIHBDLT51aVZpZGVvQml0cmF0ZSA8IE00VklERU9FRElUSU5HX2sxNl9LQlBTICkKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX1ZJREVPQklUUkFURV9UT09fTE9XOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIE5VTEwgdmlkZW8gOiBjb3B5IGlucHV0IGZpbGUgYml0cmF0ZSAqLwotICAgICAgICBwQy0+dWlWaWRlb0JpdHJhdGUgPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZTsKLSAgICB9Ci0KLSAgICBpZiggcFJhdGVzLT5PdXRwdXRWaWRlb1RpbWVzY2FsZSA8PSAzMDAwMAotICAgICAgICAmJiBwUmF0ZXMtPk91dHB1dFZpZGVvVGltZXNjYWxlID4gMCApCi0gICAgewotICAgICAgICBwQy0+b3V0cHV0VmlkZW9UaW1lc2NhbGUgPSBwUmF0ZXMtPk91dHB1dFZpZGVvVGltZXNjYWxlOwotICAgIH0KLQotICAgIC8qIENoZWNrIGZpbGUgc2l6ZSAqLwotICAgIHJldHVybiBNNE1DU19pbnRDaGVja01heEZpbGVTaXplKHBDKTsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfZ2V0RXh0ZW5kZWRFbmNvZGluZ1BhcmFtcyhNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNE1DU19FbmNvZGluZ1BhcmFtcyogcFJhdGVzKQotICogQGJyaWVmICAgR2V0IHRoZSBleHRlbmRlZCB2YWx1ZXMgb2YgdGhlIGVuY29kaW5nIHBhcmFtZXRlcnMKLSAqIEBub3RlICAgIENvdWxkIGJlIGNhbGxlZCBhZnRlciBNNE1DU19zZXRFbmNvZGluZ1BhcmFtcy4KLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcGFyYW0gICBwUmF0ZXMgICAgICAgICAgICAgKE9VVCkgVHJhbnNjb2RpbmcgcGFyYW1ldGVycwotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfQkVHSU5fQ1VUX0VRVUFMU19FTkRfQ1VUOiBFbmNvZGluZyBzZXR0aW5ncyB3b3VsZCBwcm9kdWNlIGEgbnVsbCBkdXJhdGlvbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwID0gZW5jb2RpbmcgaXMgaW1wb3NzaWJsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfZ2V0RXh0ZW5kZWRFbmNvZGluZ1BhcmFtcyggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0VuY29kaW5nUGFyYW1zICpwUmF0ZXMgKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICopKHBDb250ZXh0KTsKLQotICAgIE00T1NBX0ludDMyIG1pbmF1ZGlvYml0cmF0ZTsKLSAgICBNNE9TQV9JbnQzMiBtaW52aWRlb2JpdHJhdGU7Ci0gICAgTTRPU0FfSW50MzIgbWF4Y29tYmluZWRiaXRyYXRlOwotCi0gICAgTTRPU0FfSW50MzIgY2FsY2JpdHJhdGU7Ci0KLSAgICBNNE9TQV9VSW50MzIgbWF4ZHVyYXRpb247Ci0gICAgTTRPU0FfVUludDMyIGNhbGNkdXJhdGlvbjsKLQotICAgIE00T1NBX0Jvb2wgZml4ZWRfYXVkaW8gPSBNNE9TQV9GQUxTRTsKLSAgICBNNE9TQV9Cb29sIGZpeGVkX3ZpZGVvID0gTTRPU0FfRkFMU0U7Ci0KLSNpZmRlZiBNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUKLQotICAgIGlmKCBwQy0+bV9iSXNTdGlsbFBpY3R1cmUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBzdGlsbCBwaWN0dXJlIE1DUyBmdW5jdGlvbiovCi0gICAgICAgIHJldHVybiBNNE1DU19zdGlsbFBpY0dldEV4dGVuZGVkRW5jb2RpbmdQYXJhbXMocEMsIHBSYXRlcyk7Ci0gICAgfQotCi0jZW5kaWYgLypNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUqLwotCi0gICAgcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPQotICAgICAgICBNNE1DU19pbnRHZXROZWFyZXN0Qml0cmF0ZShwQy0+dWlWaWRlb0JpdHJhdGUsIDApOwotICAgIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgTTRNQ1NfaW50R2V0TmVhcmVzdEJpdHJhdGUocEMtPnVpQXVkaW9CaXRyYXRlLCAwKTsKLSAgICBwUmF0ZXMtPkJlZ2luQ3V0VGltZSA9IHBDLT51aUJlZ2luQ3V0VGltZTsKLSAgICBwUmF0ZXMtPkVuZEN1dFRpbWUgPSBwQy0+dWlFbmRDdXRUaW1lOwotICAgIHBSYXRlcy0+T3V0cHV0RmlsZVNpemUgPSBwQy0+dWlNYXhGaWxlU2l6ZTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgc3RhdGUgYXV0b21hdG9uICovCi0gICAgaWYoIE00TUNTX2tTdGF0ZV9TRVQgIT0gcEMtPlN0YXRlICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19nZXRFeHRlbmRlZEVuY29kaW5nUGFyYW1zKCk6IFdyb25nIFN0YXRlICglZCksXAotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfU1RBVEUiLCBwQy0+U3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyogQ29tcHV0ZSBtaW4gYXVkaW8gYml0cmF0ZSAqLwotICAgIGlmKCBwQy0+bm9hdWRpbyApCi0gICAgewotICAgICAgICBmaXhlZF9hdWRpbyA9IE00T1NBX1RSVUU7Ci0gICAgICAgIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0gMDsKLSAgICAgICAgbWluYXVkaW9iaXRyYXRlID0gMDsKLSAgICB9Ci0gICAgZWxzZSBpZiggcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9PSBNNEVOQ09ERVJfa0F1ZGlvTlVMTCApCi0gICAgewotICAgICAgICBmaXhlZF9hdWRpbyA9IE00T1NBX1RSVUU7Ci0gICAgICAgIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlBdWRpb0JpdHJhdGU7Ci0gICAgICAgIG1pbmF1ZGlvYml0cmF0ZSA9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQXVkaW9CaXRyYXRlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiggcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9PSBNNEVOQ09ERVJfa0FNUk5CICkKLSAgICAgICAgewotICAgICAgICAgICAgZml4ZWRfYXVkaW8gPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPSBNNFZJREVPRURJVElOR19rMTJfMl9LQlBTOwotICAgICAgICAgICAgbWluYXVkaW9iaXRyYXRlID0gTTRWSURFT0VESVRJTkdfazEyXzJfS0JQUzsKLSAgICAgICAgfQotICAgICAgICAvL0VWUkMKLSAgICAgICAgLy8gICAgICAgIGlmKHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPT0gTTRFTkNPREVSX2tFVlJDKQotICAgICAgICAvLyAgICAgICAgewotICAgICAgICAvLyAgICAgICAgICAgIGZpeGVkX2F1ZGlvID0gTTRPU0FfVFJVRTsKLSAgICAgICAgLy8gICAgICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IE00VklERU9FRElUSU5HX2s5XzJfS0JQUzsKLSAgICAgICAgLy8gICAgICAgICAgICBtaW5hdWRpb2JpdHJhdGUgPSBNNFZJREVPRURJVElOR19rOV8yX0tCUFM7Ci0gICAgICAgIC8vICAgICAgICB9Ci0gICAgICAgIC8qRmxCIDI2LjAyLjIwMDk6IGFkZCBtcDMgYXMgbWNzIG91dHB1dCBmb3JtYXQqLwotICAgICAgICBlbHNlIGlmKCBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID09IE00RU5DT0RFUl9rTVAzICkKLSAgICAgICAgewotICAgICAgICAgICAgbWluYXVkaW9iaXRyYXRlID0KLSAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rMzJfS0JQUzsgLypEZWZhdWx0IG1pbiBhdWRpbyBiaXRyYXRlIGZvciBNUEVHIGxheWVyIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYm90aCBtb25vIGFuZCBzdGVyZW8gY2hhbm5lbHMqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgbWluYXVkaW9iaXRyYXRlID0gKHBDLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtID09IE00RU5DT0RFUl9rTW9ubykKLSAgICAgICAgICAgICAgICA/IE00VklERU9FRElUSU5HX2sxNl9LQlBTIDogTTRWSURFT0VESVRJTkdfazMyX0tCUFM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBDaGVjayBhdWRpbyBiaXRyYXRlIGlzIGluIHRoZSBjb3JyZWN0IHJhbmdlICovCi0gICAgaWYoIGZpeGVkX2F1ZGlvID09IE00T1NBX0ZBTFNFICkKLSAgICB7Ci0gICAgICAgIGlmKCAoIHBDLT51aUF1ZGlvQml0cmF0ZSA+IDApCi0gICAgICAgICAgICAmJiAocFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPCBtaW5hdWRpb2JpdHJhdGUpICkKLSAgICAgICAgewotICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPSBtaW5hdWRpb2JpdHJhdGU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPiBNNFZJREVPRURJVElOR19rOTZfS0JQUyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0gTTRWSURFT0VESVRJTkdfazk2X0tCUFM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBDb21wdXRlIG1pbiB2aWRlbyBiaXRyYXRlICovCi0gICAgaWYoIHBDLT5ub3ZpZGVvICkKLSAgICB7Ci0gICAgICAgIGZpeGVkX3ZpZGVvID0gTTRPU0FfVFJVRTsKLSAgICAgICAgcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPSAwOwotICAgICAgICBtaW52aWRlb2JpdHJhdGUgPSAwOwotICAgIH0KLSAgICBlbHNlIGlmKCBwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCA9PSBNNEVOQ09ERVJfa05VTEwgKQotICAgIHsKLSAgICAgICAgZml4ZWRfdmlkZW8gPSBNNE9TQV9UUlVFOwotICAgICAgICBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9CaXRyYXRlOwotICAgICAgICBtaW52aWRlb2JpdHJhdGUgPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgbWludmlkZW9iaXRyYXRlID0gTTRWSURFT0VESVRJTkdfazE2X0tCUFM7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgdmlkZW8gYml0cmF0ZSBpcyBpbiB0aGUgY29ycmVjdCByYW5nZSAqLwotICAgIGlmKCBmaXhlZF92aWRlbyA9PSBNNE9TQV9GQUxTRSApCi0gICAgewotICAgICAgICBpZiggKCBwQy0+dWlWaWRlb0JpdHJhdGUgPiAwKQotICAgICAgICAgICAgJiYgKHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlIDwgbWludmlkZW9iaXRyYXRlKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0gbWludmlkZW9iaXRyYXRlOwotICAgICAgICB9Ci0gICAgICAgIC8qKyBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotICAgICAgICBpZiggcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPiBNNFZJREVPRURJVElOR19rOF9NQlBTICkKLSAgICAgICAgewotICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPSBNNFZJREVPRURJVElOR19rOF9NQlBTOwotICAgICAgICB9Ci0gICAgICAgIC8qLSBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotICAgIH0KLQotICAgIC8qIENoZWNrIGN1dCB0aW1lcyBhcmUgaW4gY29ycmVjdCByYW5nZSAqLwotICAgIGlmKCAoIHBSYXRlcy0+QmVnaW5DdXRUaW1lID49IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uKQotICAgICAgICB8fCAoKCBwUmF0ZXMtPkJlZ2luQ3V0VGltZSA+PSBwUmF0ZXMtPkVuZEN1dFRpbWUpCi0gICAgICAgICYmIChwUmF0ZXMtPkVuZEN1dFRpbWUgPiAwKSkgKQotICAgIHsKLSAgICAgICAgcFJhdGVzLT5CZWdpbkN1dFRpbWUgPSAwOwotICAgICAgICBwUmF0ZXMtPkVuZEN1dFRpbWUgPSAwOwotICAgIH0KLQotICAgIGlmKCBwUmF0ZXMtPkVuZEN1dFRpbWUgPT0gMCApCi0gICAgICAgIGNhbGNkdXJhdGlvbiA9Ci0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uIC0gcFJhdGVzLT5CZWdpbkN1dFRpbWU7Ci0gICAgZWxzZQotICAgICAgICBjYWxjZHVyYXRpb24gPSBwUmF0ZXMtPkVuZEN1dFRpbWUgLSBwUmF0ZXMtPkJlZ2luQ3V0VGltZTsKLQotICAgIC8qIHByaW9yaXR5IDEgOiBtYXggZmlsZSBzaXplICovCi0gICAgaWYoIHBSYXRlcy0+T3V0cHV0RmlsZVNpemUgPT0gMCApCi0gICAgewotICAgICAgICAvKiB3ZSBjYW4gcHV0IG1heGltdW0gdmFsdWVzIGZvciBhbGwgdW5kZWZpbmVkIHBhcmFtZXRlcnMgKi8KLSAgICAgICAgaWYoIHBSYXRlcy0+RW5kQ3V0VGltZSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgcFJhdGVzLT5FbmRDdXRUaW1lID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggKCBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9PSBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZSkKLSAgICAgICAgICAgICYmIChmaXhlZF9hdWRpbyA9PSBNNE9TQV9GQUxTRSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IE00VklERU9FRElUSU5HX2s5Nl9LQlBTOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoICggcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPT0gTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUpCi0gICAgICAgICAgICAmJiAoZml4ZWRfdmlkZW8gPT0gTTRPU0FfRkFMU0UpICkKLSAgICAgICAgewotICAgICAgICAgICAgLyorIE5ldyBFbmNvZGVyIGJpdHJhdGVzICovCi0gICAgICAgICAgICBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9IE00VklERU9FRElUSU5HX2s4X01CUFM7Ci0gICAgICAgICAgICAvKi0gTmV3IEVuY29kZXIgYml0cmF0ZXMgKi8KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBjb21wdXRlIG1heCBkdXJhdGlvbiAqLwotICAgICAgICBtYXhkdXJhdGlvbiA9IChNNE9TQV9VSW50MzIpKHBSYXRlcy0+T3V0cHV0RmlsZVNpemUKLSAgICAgICAgICAgIC8gTTRNQ1NfTU9PVl9PVkVSX0ZJTEVTSVpFX1JBVElPCi0gICAgICAgICAgICAvIChtaW52aWRlb2JpdHJhdGUgKyBtaW5hdWRpb2JpdHJhdGUpICogODAwMC4wKTsKLQotICAgICAgICBpZiggbWF4ZHVyYXRpb24KLSAgICAgICAgICAgICsgcFJhdGVzLT5CZWdpbkN1dFRpbWUgPiBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1heGR1cmF0aW9uID0KLSAgICAgICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiAtIHBSYXRlcy0+QmVnaW5DdXRUaW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogcHJpb3JpdHkgMiA6IGN1dCB0aW1lcyAqLwotICAgICAgICBpZiggKCBwUmF0ZXMtPkJlZ2luQ3V0VGltZSA+IDApIHx8IChwUmF0ZXMtPkVuZEN1dFRpbWUgPiAwKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBjYWxjZHVyYXRpb24gPiBtYXhkdXJhdGlvbiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FsY2R1cmF0aW9uID0gbWF4ZHVyYXRpb247Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBjYWxjZHVyYXRpb24gPT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9CRUdJTl9DVVRfRVFVQUxTX0VORF9DVVQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1heGNvbWJpbmVkYml0cmF0ZSA9IChNNE9TQV9VSW50MzIpKHBSYXRlcy0+T3V0cHV0RmlsZVNpemUKLSAgICAgICAgICAgICAgICAvIE00TUNTX01PT1ZfT1ZFUl9GSUxFU0laRV9SQVRJTyAvIChjYWxjZHVyYXRpb24gLyA4MDAwLjApKTsKLQotICAgICAgICAgICAgLyogYXVkaW8gYW5kIHZpZGVvIGJpdHJhdGVzICovCi0gICAgICAgICAgICBpZiggKCBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZQotICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlKQotICAgICAgICAgICAgICAgICYmIChwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZQotICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogc2V0IGF1ZGlvID0gMS8zIGFuZCB2aWRlbyA9IDIvMyAqLwotICAgICAgICAgICAgICAgIGlmKCBmaXhlZF9hdWRpbyA9PSBNNE9TQV9GQUxTRSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPm5vdmlkZW8gKQotICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfaW50R2V0TmVhcmVzdEJpdHJhdGUobWF4Y29tYmluZWRiaXRyYXRlLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfaW50R2V0TmVhcmVzdEJpdHJhdGUobWF4Y29tYmluZWRiaXRyYXRlIC8gMywKLSAgICAgICAgICAgICAgICAgICAgICAgIDApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA8IG1pbmF1ZGlvYml0cmF0ZSApCi0gICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IG1pbmF1ZGlvYml0cmF0ZTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPiBNNFZJREVPRURJVElOR19rOTZfS0JQUyApCi0gICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IE00VklERU9FRElUSU5HX2s5Nl9LQlBTOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCBmaXhlZF92aWRlbyA9PSBNNE9TQV9GQUxTRSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19pbnRHZXROZWFyZXN0Qml0cmF0ZShtYXhjb21iaW5lZGJpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgIC0gcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUsIDApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA8IG1pbnZpZGVvYml0cmF0ZSApCi0gICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9IG1pbnZpZGVvYml0cmF0ZTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPiBNNFZJREVPRURJVElOR19rOF9NQlBTICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2s4X01CUFM7IC8qKyBOZXcgRW5jb2RlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cmF0ZXMgKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogcHJpb3JpdHkgMyA6IGF1ZGlvIGJpdHJhdGUgKi8KLSAgICAgICAgICAgICAgICBpZiggcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUoICggZml4ZWRfYXVkaW8gPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAocFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPj0gbWluYXVkaW9iaXRyYXRlKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICArIG1pbnZpZGVvYml0cmF0ZSA+IG1heGNvbWJpbmVkYml0cmF0ZSkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfaW50R2V0TmVhcmVzdEJpdHJhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUsIC0xKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAoIGZpeGVkX2F1ZGlvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlIDwgbWluYXVkaW9iaXRyYXRlKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0gbWluYXVkaW9iaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FsY2JpdHJhdGUgPSBNNE1DU19pbnRHZXROZWFyZXN0Qml0cmF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGNvbWJpbmVkYml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSwgMCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGNhbGNiaXRyYXRlIDwgbWludmlkZW9iaXRyYXRlICkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGNiaXRyYXRlID0gbWludmlkZW9iaXRyYXRlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBjYWxjYml0cmF0ZSA+IE00VklERU9FRElUSU5HX2s4X01CUFMgKQotICAgICAgICAgICAgICAgICAgICAgICAgY2FsY2JpdHJhdGUgPSBNNFZJREVPRURJVElOR19rOF9NQlBTOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAoIGZpeGVkX3ZpZGVvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCggcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlID4gY2FsY2JpdHJhdGUpKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0gY2FsY2JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogcHJpb3JpdHkgNCA6IHZpZGVvIGJpdHJhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAhPSBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCAoIGZpeGVkX3ZpZGVvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA+PSBtaW52aWRlb2JpdHJhdGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtaW5hdWRpb2JpdHJhdGUgPiBtYXhjb21iaW5lZGJpdHJhdGUpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX2ludEdldE5lYXJlc3RCaXRyYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSwgLTEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggKCBmaXhlZF92aWRlbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAocFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPCBtaW52aWRlb2JpdHJhdGUpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9IG1pbnZpZGVvYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FsY2JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX2ludEdldE5lYXJlc3RCaXRyYXRlKG1heGNvbWJpbmVkYml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUsIDApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggY2FsY2JpdHJhdGUgPCBtaW5hdWRpb2JpdHJhdGUgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGNiaXRyYXRlID0gbWluYXVkaW9iaXRyYXRlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggY2FsY2JpdHJhdGUgPiBNNFZJREVPRURJVElOR19rOTZfS0JQUyApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsY2JpdHJhdGUgPSBNNFZJREVPRURJVElOR19rOTZfS0JQUzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoICggZml4ZWRfYXVkaW8gPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCggcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAocFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPiBjYWxjYml0cmF0ZSkpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IGNhbGNiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogcHJpb3JpdHkgMyA6IGF1ZGlvIGJpdHJhdGUgKi8KLSAgICAgICAgICAgIGlmKCBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSAhPSBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogcHJpb3JpdHkgNCA6IHZpZGVvIGJpdHJhdGUgKi8KLSAgICAgICAgICAgICAgICBpZiggcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogY29tcHV0ZSBtYXggZHVyYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgbWF4ZHVyYXRpb24gPSAoTTRPU0FfVUludDMyKShwUmF0ZXMtPk91dHB1dEZpbGVTaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAvIE00TUNTX01PT1ZfT1ZFUl9GSUxFU0laRV9SQVRJTwotICAgICAgICAgICAgICAgICAgICAgICAgLyAocFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUpICogODAwMC4wKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggbWF4ZHVyYXRpb24gKyBwUmF0ZXMtPkJlZ2luQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAgICAgPiBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heGR1cmF0aW9uID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHBSYXRlcy0+QmVnaW5DdXRUaW1lOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGNhbGNkdXJhdGlvbiA+IG1heGR1cmF0aW9uICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FsY2R1cmF0aW9uID0gbWF4ZHVyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggY2FsY2R1cmF0aW9uID09IDAgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0JFR0lOX0NVVF9FUVVBTFNfRU5EX0NVVDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBzdGFydCB3aXRoIG1pbiB2aWRlbyBiaXRyYXRlICovCi0gICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0gbWludmlkZW9iaXRyYXRlOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIGNvbXB1dGUgbWF4IGR1cmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIG1heGR1cmF0aW9uID0gKE00T1NBX1VJbnQzMikocFJhdGVzLT5PdXRwdXRGaWxlU2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgLyBNNE1DU19NT09WX09WRVJfRklMRVNJWkVfUkFUSU8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8gKHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICArIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlKSAqIDgwMDAuMCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIG1heGR1cmF0aW9uICsgcFJhdGVzLT5CZWdpbkN1dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgID4gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb24gKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXhkdXJhdGlvbiA9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwUmF0ZXMtPkJlZ2luQ3V0VGltZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBjYWxjZHVyYXRpb24gPiBtYXhkdXJhdGlvbiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGNkdXJhdGlvbiA9IG1heGR1cmF0aW9uOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGNhbGNkdXJhdGlvbiA9PSAwICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9CRUdJTl9DVVRfRVFVQUxTX0VORF9DVVQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKiBzZWFyY2ggbWF4IHBvc3NpYmxlIHZpZGVvIGJpdHJhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgbWF4Y29tYmluZWRiaXRyYXRlID0gKE00T1NBX1VJbnQzMikocFJhdGVzLT5PdXRwdXRGaWxlU2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgLyBNNE1DU19NT09WX09WRVJfRklMRVNJWkVfUkFUSU8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8gKGNhbGNkdXJhdGlvbiAvIDgwMDAuMCkpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlKCAoIGZpeGVkX3ZpZGVvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICA8IE00VklERU9FRElUSU5HX2s4X01CUFMpICkgLyorIE5ldyBFbmNvZGVyIGJpdHJhdGVzICovCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGNiaXRyYXRlID0gTTRNQ1NfaW50R2V0TmVhcmVzdEJpdHJhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUsICsxKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGNhbGNiaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA8PSBtYXhjb21iaW5lZGJpdHJhdGUgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0gY2FsY2JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogcHJpb3JpdHkgNCA6IHZpZGVvIGJpdHJhdGUgKi8KLSAgICAgICAgICAgICAgICBpZiggcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogc3RhcnQgd2l0aCBtaW4gYXVkaW8gYml0cmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IG1pbmF1ZGlvYml0cmF0ZTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBjb21wdXRlIG1heCBkdXJhdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICBtYXhkdXJhdGlvbiA9IChNNE9TQV9VSW50MzIpKHBSYXRlcy0+T3V0cHV0RmlsZVNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8gTTRNQ1NfTU9PVl9PVkVSX0ZJTEVTSVpFX1JBVElPCi0gICAgICAgICAgICAgICAgICAgICAgICAvIChwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgKyBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSkgKiA4MDAwLjApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBtYXhkdXJhdGlvbiArIHBSYXRlcy0+QmVnaW5DdXRUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICA+IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbWF4ZHVyYXRpb24gPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcFJhdGVzLT5CZWdpbkN1dFRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggY2FsY2R1cmF0aW9uID4gbWF4ZHVyYXRpb24gKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWxjZHVyYXRpb24gPSBtYXhkdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBjYWxjZHVyYXRpb24gPT0gMCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfQkVHSU5fQ1VUX0VRVUFMU19FTkRfQ1VUOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogc2VhcmNoIG1heCBwb3NzaWJsZSBhdWRpbyBiaXRyYXRlICovCi0gICAgICAgICAgICAgICAgICAgIG1heGNvbWJpbmVkYml0cmF0ZSA9IChNNE9TQV9VSW50MzIpKHBSYXRlcy0+T3V0cHV0RmlsZVNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8gTTRNQ1NfTU9PVl9PVkVSX0ZJTEVTSVpFX1JBVElPCi0gICAgICAgICAgICAgICAgICAgICAgICAvIChjYWxjZHVyYXRpb24gLyA4MDAwLjApKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSggKCBmaXhlZF9hdWRpbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgPCBNNFZJREVPRURJVElOR19rOTZfS0JQUykgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWxjYml0cmF0ZSA9IE00TUNTX2ludEdldE5lYXJlc3RCaXRyYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlLCArMSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjYWxjYml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPD0gbWF4Y29tYmluZWRiaXRyYXRlICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IGNhbGNiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGNvbXB1dGUgbWF4IGR1cmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIG1heGR1cmF0aW9uID0gKE00T1NBX1VJbnQzMikocFJhdGVzLT5PdXRwdXRGaWxlU2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgLyBNNE1DU19NT09WX09WRVJfRklMRVNJWkVfUkFUSU8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8gKG1pbnZpZGVvYml0cmF0ZSArIG1pbmF1ZGlvYml0cmF0ZSkgKiA4MDAwLjApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBtYXhkdXJhdGlvbiArIHBSYXRlcy0+QmVnaW5DdXRUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICA+IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbWF4ZHVyYXRpb24gPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcFJhdGVzLT5CZWdpbkN1dFRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggY2FsY2R1cmF0aW9uID4gbWF4ZHVyYXRpb24gKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWxjZHVyYXRpb24gPSBtYXhkdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBjYWxjZHVyYXRpb24gPT0gMCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfQkVHSU5fQ1VUX0VRVUFMU19FTkRfQ1VUOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogc2V0IGF1ZGlvID0gMS8zIGFuZCB2aWRlbyA9IDIvMyAqLwotICAgICAgICAgICAgICAgICAgICBtYXhjb21iaW5lZGJpdHJhdGUgPSAoTTRPU0FfVUludDMyKShwUmF0ZXMtPk91dHB1dEZpbGVTaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAvIE00TUNTX01PT1ZfT1ZFUl9GSUxFU0laRV9SQVRJTwotICAgICAgICAgICAgICAgICAgICAgICAgLyAoY2FsY2R1cmF0aW9uIC8gODAwMC4wKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGZpeGVkX2F1ZGlvID09IE00T1NBX0ZBTFNFICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5ub3ZpZGVvICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfaW50R2V0TmVhcmVzdEJpdHJhdGUobWF4Y29tYmluZWRiaXRyYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19pbnRHZXROZWFyZXN0Qml0cmF0ZShtYXhjb21iaW5lZGJpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIDMsIDApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPCBtaW5hdWRpb2JpdHJhdGUgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0gbWluYXVkaW9iaXRyYXRlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgID4gTTRWSURFT0VESVRJTkdfazk2X0tCUFMgKQotICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazk2X0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggZml4ZWRfdmlkZW8gPT0gTTRPU0FfRkFMU0UgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfaW50R2V0TmVhcmVzdEJpdHJhdGUobWF4Y29tYmluZWRiaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSwgMCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA8IG1pbnZpZGVvYml0cmF0ZSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPSBtaW52aWRlb2JpdHJhdGU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgPiBNNFZJREVPRURJVElOR19rOF9NQlBTICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2s4X01CUFM7IC8qKyBOZXcgRW5jb2RlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cmF0ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIHJlY29tcHV0ZSBtYXggZHVyYXRpb24gd2l0aCBmaW5hbCBiaXRyYXRlcyAqLwotICAgIGlmKCBwUmF0ZXMtPk91dHB1dEZpbGVTaXplID4gMCApCi0gICAgewotICAgICAgICBtYXhkdXJhdGlvbiA9IChNNE9TQV9VSW50MzIpKHBSYXRlcy0+T3V0cHV0RmlsZVNpemUKLSAgICAgICAgICAgIC8gTTRNQ1NfTU9PVl9PVkVSX0ZJTEVTSVpFX1JBVElPCi0gICAgICAgICAgICAvIChwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSArIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlKQotICAgICAgICAgICAgKiA4MDAwLjApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBtYXhkdXJhdGlvbiA9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uOwotICAgIH0KLQotICAgIGlmKCBtYXhkdXJhdGlvbgotICAgICAgICArIHBSYXRlcy0+QmVnaW5DdXRUaW1lID4gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb24gKQotICAgIHsKLSAgICAgICAgbWF4ZHVyYXRpb24gPQotICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb24gLSBwUmF0ZXMtPkJlZ2luQ3V0VGltZTsKLSAgICB9Ci0KLSAgICBpZiggcFJhdGVzLT5FbmRDdXRUaW1lID09IDAgKQotICAgIHsKLSAgICAgICAgcFJhdGVzLT5FbmRDdXRUaW1lID0gcFJhdGVzLT5CZWdpbkN1dFRpbWUgKyBtYXhkdXJhdGlvbjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgY2FsY2R1cmF0aW9uID0gcFJhdGVzLT5FbmRDdXRUaW1lIC0gcFJhdGVzLT5CZWdpbkN1dFRpbWU7Ci0KLSAgICAgICAgaWYoIGNhbGNkdXJhdGlvbiA+IG1heGR1cmF0aW9uICkKLSAgICAgICAgewotICAgICAgICAgICAgcFJhdGVzLT5FbmRDdXRUaW1lID0gcFJhdGVzLT5CZWdpbkN1dFRpbWUgKyBtYXhkdXJhdGlvbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIFNob3VsZCBuZXZlciBoYXBwZW4gOiBjb25zdHJhaW50cyBhcmUgdG9vIHN0cm9uZyAqLwotICAgIGlmKCBwUmF0ZXMtPkVuZEN1dFRpbWUgPT0gcFJhdGVzLT5CZWdpbkN1dFRpbWUgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9CRUdJTl9DVVRfRVFVQUxTX0VORF9DVVQ7Ci0gICAgfQotCi0gICAgLyogZXN0aW1hdGVkIHJlc3VsdGluZyBmaWxlIHNpemUgKi8KLSAgICBwUmF0ZXMtPk91dHB1dEZpbGVTaXplID0gKE00T1NBX1VJbnQzMikoTTRNQ1NfTU9PVl9PVkVSX0ZJTEVTSVpFX1JBVElPCi0gICAgICAgICogKHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlICsgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUpCi0gICAgICAgICogKCggcFJhdGVzLT5FbmRDdXRUaW1lIC0gcFJhdGVzLT5CZWdpbkN1dFRpbWUpIC8gODAwMC4wKSk7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfY2hlY2tQYXJhbXNBbmRTdGFydChNNE1DU19Db250ZXh0IHBDb250ZXh0KQotICogQGJyaWVmICAgQ2hlY2sgcGFyYW1ldGVycyB0byBzdGFydAotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0hJR0g6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvIGJpdHJhdGUgdG9vIGhpZ2ggKHdlIGxpbWl0IHRvIDk2IGticHMpCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19MT1c6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvIGJpdHJhdGUgaXMgdG9vIGxvdyAoMTYga2JwcyBtaW4gZm9yIGFhYywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIuMiBmb3IgYW1yLCA4IGZvciBtcDMpCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfQkVHSU5fQ1VUX0VRVUFMU19FTkRfQ1VUOgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCZWdpbiBjdXQgYW5kIEVuZCBjdXQgYXJlIGVxdWFscwotICogQHJldHVybiAgTTRNQ1NfRVJSX0JFR0lOX0NVVF9MQVJHRVJfVEhBTl9EVVJBVElPTjoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVnaW4gY3V0IHRpbWUgaXMgbGFyZ2VyIHRoYW4gdGhlIGlucHV0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAgZHVyYXRpb24KLSAqIEByZXR1cm4gIE00TUNTX0VSUl9FTkRfQ1VUX1NNQUxMRVJfVEhBTl9CRUdJTl9DVVQ6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZCBjdXQgdGltZSBpcyBzbWFsbGVyIHRoYW4gYmVnaW4gY3V0IHRpbWUKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9NQVhGSUxFU0laRV9UT09fU01BTEw6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdCBlbm91Z2ggc3BhY2UgdG8gc3RvcmUgd2hvbGUgb3V0cHV0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgYXQgZ2l2ZW4gYml0cmF0ZXMKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9WSURFT0JJVFJBVEVfVE9PX0hJR0g6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZGVvIGJpdHJhdGUgdG9vIGhpZ2ggKHdlIGxpbWl0IHRvIDgwMCBrYnBzKQotICogQHJldHVybiAgTTRNQ1NfRVJSX1ZJREVPQklUUkFURV9UT09fTE9XOgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWRlbyBiaXRyYXRlIHRvbyBsb3cKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2NoZWNrUGFyYW1zQW5kU3RhcnQoIE00TUNTX0NvbnRleHQgcENvbnRleHQgKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICopKHBDb250ZXh0KTsKLSAgICBNNE1DU19FbmNvZGluZ1BhcmFtcyBWZXJpZnlSYXRlczsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1NfY2hlY2tQYXJhbXNBbmRTdGFydDogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotCi0jaWZkZWYgTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFCi0KLSAgICBpZiggcEMtPm1fYklzU3RpbGxQaWN0dXJlICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgc3RpbGwgcGljdHVyZSBNQ1MgZnVuY3Rpb24qLwotICAgICAgICByZXR1cm4gTTRNQ1Nfc3RpbGxQaWNDaGVja1BhcmFtc0FuZFN0YXJ0KHBDKTsKLSAgICB9Ci0KLSNlbmRpZiAvKk00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRSovCi0KLSAgICAvKioKLSAgICAqIENoZWNrIHN0YXRlIGF1dG9tYXRvbiAqLwotCi0gICAgaWYoIE00TUNTX2tTdGF0ZV9TRVQgIT0gcEMtPlN0YXRlICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2NoZWNrUGFyYW1zQW5kU3RhcnQoKTogV3JvbmcgU3RhdGUgKCVkKSwgcmV0dXJuaW5nIE00RVJSX1NUQVRFIiwKLSAgICAgICAgICAgIHBDLT5TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKiBBdWRpbyBiaXRyYXRlIHNob3VsZCBub3Qgc3RheSB1bmRlZmluZWQgYXQgdGhpcyBwb2ludCAqLwotICAgIGlmKCAoIHBDLT5ub2F1ZGlvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAmJiAocEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCAhPSBNNEVOQ09ERVJfa0F1ZGlvTlVMTCkKLSAgICAgICAgJiYgKHBDLT51aUF1ZGlvQml0cmF0ZSA9PSBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZSkgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TUNTX2NoZWNrUGFyYW1zQW5kU3RhcnQgOiB1bmRlZmluZWQgYXVkaW8gYml0cmF0ZSIpOwotICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fTE9XOwotICAgIH0KLQotICAgIC8qIFZpZGVvIGJpdHJhdGUgc2hvdWxkIG5vdCBzdGF5IHVuZGVmaW5lZCBhdCB0aGlzIHBvaW50ICovCi0gICAgaWYoICggcEMtPm5vdmlkZW8gPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICYmIChwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCAhPSBNNEVOQ09ERVJfa05VTEwpCi0gICAgICAgICYmIChwQy0+dWlWaWRlb0JpdHJhdGUgPT0gTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUpICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19jaGVja1BhcmFtc0FuZFN0YXJ0IDogdW5kZWZpbmVkIHZpZGVvIGJpdHJhdGUiKTsKLSAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9WSURFT0JJVFJBVEVfVE9PX0xPVzsKLSAgICB9Ci0KLSAgICAvKiBTZXQgZW5kIGN1dCB0aW1lIGlmIG5lY2Vzc2FyeSAobm90IGFuIGVycm9yKSAqLwotICAgIGlmKCBwQy0+dWlFbmRDdXRUaW1lID09IDAgKQotICAgIHsKLSAgICAgICAgcEMtPnVpRW5kQ3V0VGltZSA9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uOwotICAgIH0KLQotICAgIC8qIEZvcmNlIGEgcmUtc2V0IHRvIGNoZWNrIHZhbGlkaXR5IG9mIHBhcmFtZXRlcnMgKi8KLSAgICBWZXJpZnlSYXRlcy5PdXRwdXRWaWRlb0JpdHJhdGUgPSBwQy0+dWlWaWRlb0JpdHJhdGU7Ci0gICAgVmVyaWZ5UmF0ZXMuT3V0cHV0QXVkaW9CaXRyYXRlID0gcEMtPnVpQXVkaW9CaXRyYXRlOwotICAgIFZlcmlmeVJhdGVzLkJlZ2luQ3V0VGltZSA9IHBDLT51aUJlZ2luQ3V0VGltZTsKLSAgICBWZXJpZnlSYXRlcy5FbmRDdXRUaW1lID0gcEMtPnVpRW5kQ3V0VGltZTsKLSAgICBWZXJpZnlSYXRlcy5PdXRwdXRGaWxlU2l6ZSA9IHBDLT51aU1heEZpbGVTaXplOwotICAgIFZlcmlmeVJhdGVzLk91dHB1dFZpZGVvVGltZXNjYWxlID0gcEMtPm91dHB1dFZpZGVvVGltZXNjYWxlOwotCi0gICAgZXJyID0gTTRNQ1Nfc2V0RW5jb2RpbmdQYXJhbXMocENvbnRleHQsICZWZXJpZnlSYXRlcyk7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIHBhcmFtZXRlcnMgY29uc2lzdGVuY3kgKi8KLSAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TUNTX2NoZWNrUGFyYW1zQW5kU3RhcnQgOiBpbnZhbGlkIHBhcmFtZXRlciBmb3VuZCIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogQWxsIGlzIE9LIDogdXBkYXRlIHN0YXRlIGF1dG9tYXRvbiAqLwotICAgIHBDLT51aUVuY1ZpZGVvQml0cmF0ZSA9IHBDLT51aVZpZGVvQml0cmF0ZTsKLSAgICBwQy0+QXVkaW9FbmNQYXJhbXMuQml0cmF0ZSA9IHBDLT51aUF1ZGlvQml0cmF0ZTsKLQotI2lmZGVmIE00TUNTX1dJVEhfRkFTVF9PUEVOCi0gICAgLyoqCi0gICAgKiBSZW1ha2UgdGhlIG9wZW4gaWYgaXQgd2FzIGRvbmUgaW4gZmFzdCBtb2RlICovCi0KLSAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YkZpbGVPcGVuZWRJbkZhc3RNb2RlICkKLSAgICB7Ci0gICAgICAgIC8qIENsb3NlIHRoZSBmaWxlIG9wZW5lZCBpbiBmYXN0IG1vZGUgKi8KLSAgICAgICAgTTRNQ1NfaW50Q2xlYW5VcF9SZWFkZXJzRGVjb2RlcnMocEMpOwotCi0gICAgICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9DUkVBVEVEOwotCi0gICAgICAgIC8qIFJlb3BlbiBpdCBpbiBub3JtYWwgbW9kZSAqLwotICAgICAgICBlcnIgPSBNNE1DU19vcGVuKHBDb250ZXh0LCBwQy0+cElucHV0RmlsZSwgcEMtPklucHV0RmlsZVR5cGUsCi0gICAgICAgICAgICBwQy0+cE91dHB1dEZpbGUsIHBDLT5wVGVtcG9yYXJ5RmlsZSk7Ci0KLSAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2NoZWNrUGFyYW1zQW5kU3RhcnQgOiBNNE1DU19PcGVuIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0jZW5kaWYgLyogTTRNQ1NfV0lUSF9GQVNUX09QRU4gKi8KLQotICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9SRUFEWTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19pbnRTdGVwU2V0KE00TUNTX0ludGVybmFsQ29udGV4dCogcEMpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50U3RlcFNldCggTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNEVOQ09ERVJfSGVhZGVyICplbmNIZWFkZXI7Ci0KLSAgICAvKioKLSAgICAqIFByZXBhcmUgdGhlIHZpZGVvIGRlY29kZXIgKi8KLSAgICBlcnIgPSBNNE1DU19pbnRQcmVwYXJlVmlkZW9EZWNvZGVyKHBDKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRTdGVwU2V0KCk6IE00TUNTX2ludFByZXBhcmVWaWRlb0RlY29kZXIoKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiggKCBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0gyNjQpCi0gICAgICAgICYmIChwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCA9PSBNNEVOQ09ERVJfa05VTEwpICkKLSAgICB7Ci0gICAgICAgIHBDLT5iSDI2NFRyaW0gPSBNNE9TQV9UUlVFOwotICAgIH0KLQotICAgIC8qKgotICAgICogUHJlcGFyZSB0aGUgdmlkZW8gZW5jb2RlciAqLwotICAgIGVyciA9IE00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXIocEMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludFN0ZXBTZXQoKTogTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcigpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmKCAoIHBDLT51aUJlZ2luQ3V0VGltZSAhPSAwKQotICAgICAgICAmJiAocEMtPklucHV0RmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tIMjY0KQotICAgICAgICAmJiAocEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQgPT0gTTRFTkNPREVSX2tOVUxMKSApCi0gICAgewotCi0gICAgICAgIGVyciA9IHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihwQy0+cFZpRW5jQ3R4dCwKLSAgICAgICAgICAgIE00RU5DT0RFUl9rT3B0aW9uSURfSDI2NFByb2Nlc3NOQUxVQ29udGV4dCwKLSAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKXBDLT5tX3BJbnN0YW5jZSk7Ci0KLSAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX2ludFN0ZXRTZXQgOnBGY3RTZXRPcHRpb24gZmFpbGVkICAoZXJyIDB4JXgpIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihwQy0+cFZpRW5jQ3R4dCwKLSAgICAgICAgICAgIE00RU5DT0RFUl9rT3B0aW9uSURfU2V0SDI2NFByb2Nlc3NOQUxVZmN0c1B0ciwKLSAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmSDI2NE1DU19Qcm9jZXNzRW5jb2RlZE5BTFUpOwotCi0gICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19pbnRTdGV0U2V0IDpwRmN0U2V0T3B0aW9uIGZhaWxlZCAgKGVyciAweCV4KSIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RHZXRPcHRpb24ocEMtPnBWaUVuY0N0eHQsCi0gICAgICAgICAgICBNNEVOQ09ERVJfa09wdGlvbklEX0VuY29kZXJIZWFkZXIsCi0gICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJmVuY0hlYWRlcik7Ci0KLSAgICAgICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpIHx8IChNNE9TQV9OVUxMID09IGVuY0hlYWRlci0+cEJ1ZikgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfY2xvc2U6IGZhaWxlZCB0byBnZXQgdGhlIGVuY29kZXIgaGVhZGVyIChlcnIgMHgleCkiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKio8IG5vIHJldHVybiBoZXJlLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGRlYWxsb2NhdGUgYWZ0ZXIgY2xvc2UsIGV2ZW4gaWYgaXQgZmFpbHMuKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEhhbmRsZSBEU0kgZmlyc3QgYml0cwotI2RlZmluZSBTUFNfU1RBUlRfUE9TIDYKLQotICAgICAgICAgICAgcEMtPm1fcEluc3RhbmNlLT5tX2VuY29kZXJTUFNTaXplID0KLSAgICAgICAgICAgICAgICAoIGVuY0hlYWRlci0+cEJ1ZltTUFNfU1RBUlRfUE9TXSA8PCA4KQotICAgICAgICAgICAgICAgICsgZW5jSGVhZGVyLT5wQnVmW1NQU19TVEFSVF9QT1MgKyAxXTsKLSAgICAgICAgICAgIHBDLT5tX3BJbnN0YW5jZS0+bV9wRW5jb2RlclNQUyA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopKGVuY0hlYWRlci0+cEJ1ZikgKyBTUFNfU1RBUlRfUE9TICsgMjsKLQotICAgICAgICAgICAgcEMtPm1fcEluc3RhbmNlLT5tX2VuY29kZXJQUFNTaXplID0KLSAgICAgICAgICAgICAgICAoIGVuY0hlYWRlci0+cEJ1ZltTUFNfU1RBUlRfUE9TICsgMwotICAgICAgICAgICAgICAgICsgcEMtPm1fcEluc3RhbmNlLT5tX2VuY29kZXJTUFNTaXplXSA8PCA4KQotICAgICAgICAgICAgICAgICsgZW5jSGVhZGVyLT5wQnVmW1NQU19TVEFSVF9QT1MgKyA0Ci0gICAgICAgICAgICAgICAgKyBwQy0+bV9wSW5zdGFuY2UtPm1fZW5jb2RlclNQU1NpemVdOwotICAgICAgICAgICAgcEMtPm1fcEluc3RhbmNlLT5tX3BFbmNvZGVyUFBTID0gKE00T1NBX1VJbnQ4ICopZW5jSGVhZGVyLT5wQnVmICsgU1BTX1NUQVJUX1BPUyArIDUKLSAgICAgICAgICAgICAgICArIHBDLT5tX3BJbnN0YW5jZS0+bV9lbmNvZGVyU1BTU2l6ZTsKLQotICAgICAgICAgICAgLyogQ2hlY2sgdGhlIERTSSBpbnRlZ3JpdHkgKi8KLSAgICAgICAgICAgIGlmKCBlbmNIZWFkZXItPlNpemUgIT0gKHBDLT5tX3BJbnN0YW5jZS0+bV9lbmNvZGVyU1BTU2l6ZQotICAgICAgICAgICAgICAgICsgcEMtPm1fcEluc3RhbmNlLT5tX2VuY29kZXJQUFNTaXplICsgNSArIFNQU19TVEFSVF9QT1MpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMygKLSAgICAgICAgICAgICAgICAgICAgIiEhISBNNE1DU19pbnRTdGVwU2V0IEVSUk9SIDogaW52YWxpZCBTUFMgLyBQUFMgJWQgJWQgJWQiLAotICAgICAgICAgICAgICAgICAgICBlbmNIZWFkZXItPlNpemUsIHBDLT5tX3BJbnN0YW5jZS0+bV9lbmNvZGVyU1BTU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcEluc3RhbmNlLT5tX2VuY29kZXJQUFNTaXplKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBQcmVwYXJlIGF1ZGlvIHByb2Nlc3NpbmcgKi8KLSAgICBlcnIgPSBNNE1DU19pbnRQcmVwYXJlQXVkaW9Qcm9jZXNzaW5nKHBDKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRTdGVwU2V0KCk6IE00TUNTX2ludFByZXBhcmVBdWRpb1Byb2Nlc3NpbmcoKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFByZXBhcmUgdGhlIHdyaXRlciAqLwotICAgIGVyciA9IE00TUNTX2ludFByZXBhcmVXcml0ZXIocEMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludFN0ZXBTZXQoKTogTTRNQ1NfaW50UHJlcGFyZVdyaXRlcigpIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBKdW1wIHRoZSBhdWRpbyBzdHJlYW0gdG8gdGhlIGJlZ2luIGN1dCB0aW1lIChhbGwgQVVzIGFyZSBSQVApCi0gICAgKiBNdXN0IGJlIGRvbmUgYWZ0ZXIgdGhlIDNncHAgd3JpdGVyIGluaXQsIGJlY2F1c2UgaXQgbWF5IHdyaXRlIHRoZSBmaXJzdAotICAgICogYXVkaW8gQVUgaW4gc29tZSBjYXNlcyAqLwotICAgIGVyciA9IE00TUNTX2ludFByZXBhcmVBdWRpb0JlZ2luQ3V0KHBDKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRTdGVwU2V0KCk6IE00TUNTX2ludFByZXBhcmVBdWRpb0JlZ2luQ3V0KCkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBVcGRhdGUgc3RhdGUgYXV0b21hdG9uICovCi0gICAgaWYoIDAgPT0gcEMtPnVpQmVnaW5DdXRUaW1lICkKLSAgICB7Ci0gICAgICAgIHBDLT5kVmlEZWNTdGFydGluZ0N0cyA9IDAuMDsKLSAgICAgICAgLyoqCi0gICAgICAgICogTm8gYmVnaW4gY3V0LCBkbyB0aGUgZW5jb2RpbmcgKi8KLSAgICAgICAgcEMtPlN0YXRlID0gTTRNQ1Nfa1N0YXRlX1BST0NFU1NJTkc7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFJlbWVtYmVyIHRoYXQgd2UgbXVzdCBzdGFydCB0aGUgZGVjb2RlL2VuY29kZSBwcm9jZXNzIGF0IHRoZSBiZWdpbiBjdXQgdGltZSAqLwotICAgICAgICBwQy0+ZFZpRGVjU3RhcnRpbmdDdHMgPSAoTTRPU0FfRG91YmxlKXBDLT51aUJlZ2luQ3V0VGltZTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBKdW1waW5nICovCi0gICAgICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9CRUdJTlZJREVPSlVNUDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX2ludFN0ZXBTZXQoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50UHJlcGFyZVZpZGVvRGVjb2RlcihNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDKTsKLSAqIEBicmllZiAgICBQcmVwYXJlIHRoZSB2aWRlbyBkZWNvZGVyLgotICogQHBhcmFtICAgIHBDICAgICAgICAgIChJTikgTUNTIHByaXZhdGUgY29udGV4dAotICogQHJldHVybiAgIE00Tk9fRVJST1IgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgTTRNQ1NfRVJSX0gyNjNfUFJPRklMRV9OT1RfU1VQUE9SVEVECi0gKiBAcmV0dXJuICAgQW55IGVycm9yIHJldHVybmVkIGJ5IGFuIHVuZGVybGF5aW5nIG1vZHVsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludFByZXBhcmVWaWRlb0RlY29kZXIoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfVm9pZCAqZGVjb2RlclVzZXJEYXRhOwotICAgIE00REVDT0RFUl9PdXRwdXRGaWx0ZXIgRmlsdGVyT3B0aW9uOwotCi0gICAgaWYoIHBDLT5ub3ZpZGVvICkKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLSAgICAvKioKLSAgICAqIENyZWF0ZSB0aGUgZGVjb2RlciwgaWYgaXQgaGFzIG5vdCBiZWVuIGNyZWF0ZWQgeWV0ICh0byBnZXQgdmlkZW8gcHJvcGVydGllcyBmb3IgZXhhbXBsZSkgKi8KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cFZpRGVjQ3R4dCApCi0gICAgewotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotCi0gICAgICAgIGRlY29kZXJVc2VyRGF0YSA9IHBDLT5tX3BDdXJyZW50VmlkZW9EZWNvZGVyVXNlckRhdGE7Ci0KLSNlbHNlCi0KLSAgICAgICAgZGVjb2RlclVzZXJEYXRhID0gTTRPU0FfTlVMTDsKLQotI2VuZGlmIC8qIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUyA/ICovCi0KLSAgICAgICAgZXJyID0gcEMtPm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlKCZwQy0+cFZpRGVjQ3R4dCwKLSAgICAgICAgICAgICZwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcywgcEMtPm1fcFJlYWRlciwKLSAgICAgICAgICAgIHBDLT5tX3BSZWFkZXJEYXRhSXQsICZwQy0+UmVhZGVyVmlkZW9BVSwgZGVjb2RlclVzZXJEYXRhKTsKLQotICAgICAgICBpZiggKE00T1NBX1VJbnQzMikoTTRFUlJfREVDT0RFUl9IMjYzX1BST0ZJTEVfTk9UX1NVUFBPUlRFRCkgPT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIE91ciBkZWNvZGVyIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggSDI2MyBwcm9maWxlIG90aGVyIHRoYW4gMC4KLSAgICAgICAgICAgICogU28gaXQgcmV0dXJucyB0aGlzIGludGVybmFsIGVycm9yIGNvZGUuCi0gICAgICAgICAgICAqIFdlIHRyYW5zbGF0ZSBpdCB0byBvdXIgb3duIGVycm9yIGNvZGUgKi8KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19pbnRQcmVwYXJlVmlkZW9EZWNvZGVyOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE1DU19FUlJfSDI2M19QUk9GSUxFX05PVF9TVVBQT1JURUQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfSDI2M19QUk9GSUxFX05PVF9TVVBQT1JURUQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRGVjb2RlcjpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BWaWRlb0RlY29kZXItPm1fcEZjdENyZWF0ZSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBNNFZJREVPRURJVElOR19rSDI2NCA9PSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWx0ZXJPcHRpb24ubV9wRmlsdGVyRnVuY3Rpb24gPQotICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopICZNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMDsKLSAgICAgICAgICAgIEZpbHRlck9wdGlvbi5tX3BGaWx0ZXJVc2VyRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICBlcnIgPSBwQy0+bV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb24ocEMtPnBWaURlY0N0eHQsCi0gICAgICAgICAgICAgICAgTTRERUNPREVSX2tPcHRpb25JRF9PdXRwdXRGaWx0ZXIsCi0gICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZGaWx0ZXJPcHRpb24pOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19pbnRQcmVwYXJlVmlkZW9EZWNvZGVyOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BWaWRlb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbiByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX2ludFByZXBhcmVWaWRlb0RlY29kZXIoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcihNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDKTsKLSAqIEBicmllZiAgICBQcmVwYXJlIHRoZSB2aWRlbyBlbmNvZGVyLgotICogQHBhcmFtICAgIHBDICAgICAgICAgIChJTikgTUNTIHByaXZhdGUgY29udGV4dAotICogQHJldHVybiAgIE00Tk9fRVJST1IgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgQW55IGVycm9yIHJldHVybmVkIGJ5IGFuIHVuZGVybGF5aW5nIG1vZHVsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXIoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRFTkNPREVSX0FkdmFuY2VkUGFyYW1zIEVuY1BhcmFtczsgLyoqPCBFbmNvZGVyIGFkdmFuY2VkIHBhcmFtZXRlcnMgKi8KLSAgICBNNEVOQ09ERVJfUGFyYW1zIEVuY1BhcmFtczE7Ci0gICAgTTRPU0FfRG91YmxlIGRGcmFtZVJhdGU7ICAgICAgICAgICAgLyoqPCB0bXAgdmFyaWFibGUgKi8KLQotICAgIGlmKCBwQy0+bm92aWRlbyApCi0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotCi0gICAgaWYoIHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0ID09IE00RU5DT0RFUl9rTlVMTCApCi0gICAgewotICAgICAgICAvKiBBcHByb3hpbWF0aXZlIGN0cyBpbmNyZW1lbnQgKi8KLSAgICAgICAgcEMtPmRDdHNJbmNyZW1lbnQgPSAxMDAwLjAgLyBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2F2ZXJhZ2VGcmFtZVJhdGU7Ci0KLSAgICAgICAgaWYoIHBDLT51aUJlZ2luQ3V0VGltZSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXIoKTogTnVsbCBlbmNvZGluZywgZG8gbm90aGluZy4iKTsKLSAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXIoKTogTnVsbCBlbmNvZGluZywgSS1mcmFtZSBkZWZhdWx0cy4iKTsKLQotICAgICAgICAgICAgLyogU2V0IHVzZWZ1bCBwYXJhbWV0ZXJzIHRvIGVuY29kZSB0aGUgZmlyc3QgSS1mcmFtZSAqLwotICAgICAgICAgICAgRW5jUGFyYW1zLklucHV0Rm9ybWF0ID0gTTRFTkNPREVSX2tJWVVWNDIwOwotICAgICAgICAgICAgRW5jUGFyYW1zLnZpZGVvUHJvZmlsZSA9IHBDLT5lbmNvZGluZ1ZpZGVvUHJvZmlsZTsKLSAgICAgICAgICAgIEVuY1BhcmFtcy52aWRlb0xldmVsPSBwQy0+ZW5jb2RpbmdWaWRlb0xldmVsOwotCi0gICAgICAgICAgICBzd2l0Y2goIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2MzoKLSAgICAgICAgICAgICAgICAgICAgRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rSDI2MzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tNUEVHNDoKLSAgICAgICAgICAgICAgICAgICAgRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rTVBFRzQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2NDoKLSAgICAgICAgICAgICAgICAgICAgRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rSDI2NDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcjogdW5rbm93biBlbmNvZGluZyB2aWRlbyBmb3JtYXRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICglZCksIHJldHVybmluZyBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVXaWR0aCA9IHBDLT5FbmNvZGluZ1dpZHRoOwotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gcEMtPkVuY29kaW5nSGVpZ2h0OwotICAgICAgICAgICAgRW5jUGFyYW1zLkJpdHJhdGUgPSBwQy0+dWlFbmNWaWRlb0JpdHJhdGU7Ci0gICAgICAgICAgICBFbmNQYXJhbXMuYkludGVybmFsUmVndWxhdGlvbiA9Ci0gICAgICAgICAgICAgICAgTTRPU0FfRkFMU0U7IC8qIGRvIG5vdCBjb25zdHJhaW4gdGhlIEktZnJhbWUgKi8KLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZVJhdGUgPSBwQy0+RW5jb2RpbmdWaWRlb0ZyYW1lcmF0ZTsKLQotICAgICAgICAgICAgLyogT3RoZXIgZW5jb2Rpbmcgc2V0dGluZ3MgKHF1aXRlIGFsbCBkdW1teS4uLikgKi8KLSAgICAgICAgICAgIEVuY1BhcmFtcy51aUhvcml6b250YWxTZWFyY2hSYW5nZSA9IDA7ICAgIC8qIHVzZSBkZWZhdWx0ICovCi0gICAgICAgICAgICBFbmNQYXJhbXMudWlWZXJ0aWNhbFNlYXJjaFJhbmdlID0gMDsgICAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgICAgICAgICAgRW5jUGFyYW1zLmJFcnJvclJlc2lsaWVuY2UgPSBNNE9TQV9GQUxTRTsgLyogbm8gZXJyb3IgcmVzaWxpZW5jZSAqLwotICAgICAgICAgICAgRW5jUGFyYW1zLnVpSVZvcFBlcmlvZCA9IDA7ICAgICAgICAgICAgICAgLyogdXNlIGRlZmF1bHQgKi8KLSAgICAgICAgICAgIEVuY1BhcmFtcy51aU1vdGlvbkVzdGltYXRpb25Ub29scyA9Ci0gICAgICAgICAgICAgICAgMDsgLyogTTRWX01PVElPTl9FU1RfVE9PTFNfQUxMICovCi0gICAgICAgICAgICBFbmNQYXJhbXMuYkFjUHJlZGljdGlvbiA9IE00T1NBX1RSVUU7ICAgICAvKiB1c2UgQUMgcHJlZGljdGlvbiAqLwotICAgICAgICAgICAgRW5jUGFyYW1zLnVpU3RhcnRpbmdRdWFudGl6ZXJWYWx1ZSA9IDU7ICAgLyogaW5pdGlhbCBRUCA9IDUgKi8KLSAgICAgICAgICAgIEVuY1BhcmFtcy5iRGF0YVBhcnRpdGlvbmluZyA9Ci0gICAgICAgICAgICAgICAgTTRPU0FfRkFMU0U7IC8qIG5vIGRhdGEgcGFydGl0aW9uaW5nICovCi0KLSAgICAgICAgICAgIC8qIFJhdGUgZmFjdG9yICovCi0gICAgICAgICAgICBFbmNQYXJhbXMudWlUaW1lU2NhbGUgPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvVGltZVNjYWxlOwotICAgICAgICAgICAgRW5jUGFyYW1zLnVpUmF0ZUZhY3RvciA9IDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcigpOiBOb3JtYWwgZW5jb2RpbmcsIHNldCBmdWxsIGNvbmZpZy4iKTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBTZXQgZW5jb2RlciBzaGVsbCBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byBNQ1Mgc2V0dGluZ3MgKi8KLSAgICAgICAgRW5jUGFyYW1zLkZvcm1hdCA9IHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0OwotICAgICAgICBFbmNQYXJhbXMuSW5wdXRGb3JtYXQgPSBNNEVOQ09ERVJfa0lZVVY0MjA7Ci0gICAgICAgIEVuY1BhcmFtcy52aWRlb1Byb2ZpbGUgPSBwQy0+ZW5jb2RpbmdWaWRlb1Byb2ZpbGU7Ci0gICAgICAgIEVuY1BhcmFtcy52aWRlb0xldmVsPSBwQy0+ZW5jb2RpbmdWaWRlb0xldmVsOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFZpZGVvIGZyYW1lIHNpemUgKi8KLSAgICAgICAgRW5jUGFyYW1zLkZyYW1lV2lkdGggPSBwQy0+RW5jb2RpbmdXaWR0aDsKLSAgICAgICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gcEMtPkVuY29kaW5nSGVpZ2h0OwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFZpZGVvIGJpdHJhdGUgaGFzIGJlZW4gcHJldmlvdXNseSBjb21wdXRlZCAqLwotICAgICAgICBFbmNQYXJhbXMuQml0cmF0ZSA9IHBDLT51aUVuY1ZpZGVvQml0cmF0ZTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBNQ1MgdXNlIHRoZSAidHJ1ZSIgY29yZSBpbnRlcm5hbCBiaXRyYXRlIHJlZ3VsYXRpb24gKi8KLSAgICAgICAgRW5jUGFyYW1zLmJJbnRlcm5hbFJlZ3VsYXRpb24gPSBNNE9TQV9UUlVFOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIE90aGVyIGVuY29kZXIgc2V0dGluZ3MgKi8KLQotICAgICAgICBFbmNQYXJhbXMudWlIb3Jpem9udGFsU2VhcmNoUmFuZ2UgPSAwOyAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgICAgICBFbmNQYXJhbXMudWlWZXJ0aWNhbFNlYXJjaFJhbmdlID0gMDsgICAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgICAgICBFbmNQYXJhbXMuYkVycm9yUmVzaWxpZW5jZSA9IE00T1NBX0ZBTFNFOyAvKiBubyBlcnJvciByZXNpbGllbmNlICovCi0gICAgICAgIEVuY1BhcmFtcy51aUlWb3BQZXJpb2QgPSAwOyAgICAgICAgICAgICAgIC8qIHVzZSBkZWZhdWx0ICovCi0gICAgICAgIEVuY1BhcmFtcy51aU1vdGlvbkVzdGltYXRpb25Ub29scyA9Ci0gICAgICAgICAgICAwOyAvKiBNNFZfTU9USU9OX0VTVF9UT09MU19BTEwgKi8KLSAgICAgICAgRW5jUGFyYW1zLmJBY1ByZWRpY3Rpb24gPSBNNE9TQV9UUlVFOyAgICAgLyogdXNlIEFDIHByZWRpY3Rpb24gKi8KLSAgICAgICAgRW5jUGFyYW1zLnVpU3RhcnRpbmdRdWFudGl6ZXJWYWx1ZSA9IDEwOyAgLyogaW5pdGlhbCBRUCA9IDEwICovCi0gICAgICAgIEVuY1BhcmFtcy5iRGF0YVBhcnRpdGlvbmluZyA9Ci0gICAgICAgICAgICBNNE9TQV9GQUxTRTsgLyogbm8gZGF0YSBwYXJ0aXRpb25pbmcgKi8KLQotCi0gICAgICAgIC8qKgotICAgICAgICAqIFZpZGVvIGVuY29kZXIgZnJhbWUgcmF0ZSBhbmQgcmF0ZSBmYWN0b3IgKi8KLSAgICAgICAgRW5jUGFyYW1zLkZyYW1lUmF0ZSA9IHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlOwotICAgICAgICBFbmNQYXJhbXMudWlUaW1lU2NhbGUgPSBwQy0+b3V0cHV0VmlkZW9UaW1lc2NhbGU7Ci0KLSAgICAgICAgc3dpdGNoKCBwQy0+RW5jb2RpbmdWaWRlb0ZyYW1lcmF0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRFTkNPREVSX2s1X0ZQUzoKLSAgICAgICAgICAgICAgICBkRnJhbWVSYXRlID0gNS4wOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rN181X0ZQUzoKLSAgICAgICAgICAgICAgICBkRnJhbWVSYXRlID0gNy41OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rMTBfRlBTOgotICAgICAgICAgICAgICAgIGRGcmFtZVJhdGUgPSAxMC4wOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rMTJfNV9GUFM6Ci0gICAgICAgICAgICAgICAgZEZyYW1lUmF0ZSA9IDEyLjU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRFTkNPREVSX2sxNV9GUFM6Ci0gICAgICAgICAgICAgICAgZEZyYW1lUmF0ZSA9IDE1LjA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRFTkNPREVSX2syMF9GUFM6IC8qKjwgTVBFRy00IG9ubHkgKi8KLSAgICAgICAgICAgICAgICBkRnJhbWVSYXRlID0gMjAuMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazI1X0ZQUzogLyoqPCBNUEVHLTQgb25seSAqLwotICAgICAgICAgICAgICAgIGRGcmFtZVJhdGUgPSAyNS4wOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rMzBfRlBTOgotICAgICAgICAgICAgICAgIGRGcmFtZVJhdGUgPSAzMC4wOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcjogdW5rbm93biBlbmNvZGluZyB2aWRlbyBmcmFtZSByYXRlXAotICAgICAgICAgICAgICAgICAgICAoMHgleCksIHJldHVybmluZyBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GUkFNRV9SQVRFIiwKLSAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nVmlkZW9GcmFtZXJhdGUpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GUkFNRV9SQVRFOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIHR3byBmcmFtZXMgKi8KLSAgICAgICAgaWYoIE00RU5DT0RFUl9rSDI2MyA9PSBFbmNQYXJhbXMuRm9ybWF0ICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPmRDdHNJbmNyZW1lbnQgPSAxMDAxLjAgLyBkRnJhbWVSYXRlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLyoqPCBNUEVHNCBvciBILjI2NCAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+ZEN0c0luY3JlbWVudCA9IDEwMDAuMCAvIGRGcmFtZVJhdGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMaW1pdCB0aGUgdmlkZW8gYml0cmF0ZSBhY2NvcmRpbmcgdG8gZW5jb2RlciBwcm9maWxlCi0gICAgICogYW5kIGxldmVsICovCi0gICAgZXJyID0gTTRNQ1NfaW50TGltaXRCaXRyYXRlUGVyQ29kZWNQcm9maWxlTGV2ZWwoJkVuY1BhcmFtcyk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXI6IGxpbWl0IGJpdHJhdGUgcmV0dXJuZWQgZXJyIFwKLSAgICAgICAgICAgICAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENyZWF0ZSB2aWRlbyBlbmNvZGVyICovCi0gICAgZXJyID0gcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0SW5pdCgmcEMtPnBWaUVuY0N0eHQsCi0gICAgICAgIHBDLT5wV3JpdGVyRGF0YUZjdHMsIFwKLSAgICAgICAgTTRNQ1NfaW50QXBwbHlWUFAsIHBDLCBwQy0+cEN1cnJlbnRWaWRlb0VuY29kZXJFeHRlcm5hbEFQSSwgXAotICAgICAgICBwQy0+cEN1cnJlbnRWaWRlb0VuY29kZXJVc2VyRGF0YSk7Ci0KLSAgICAvKio8IFdlIHB1dCB0aGUgTUNTIGNvbnRleHQgaW4gcGxhY2Ugb2YgdGhlIFZQUCBjb250ZXh0ICovCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXI6IEVuY29kZXJJbnQtPnBGY3RJbml0IHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHBDLT5lbmNvZGVyU3RhdGUgPSBNNE1DU19rRW5jb2RlckNsb3NlZDsKLQotICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iSDI2NFRyaW0gKQotICAgICAgICAvL2lmKChNNEVOQ09ERVJfa05VTEwgPT0gcEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQpCi0gICAgICAgIC8vICAgICYmIChNNFZJREVPRURJVElOR19rSDI2NCA9PSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUpKQotICAgIHsKLSAgICAgICAgRW5jUGFyYW1zMS5JbnB1dEZvcm1hdCA9IEVuY1BhcmFtcy5JbnB1dEZvcm1hdDsKLSAgICAgICAgLy9FbmNQYXJhbXMxLklucHV0RnJhbWVXaWR0aCA9IEVuY1BhcmFtcy5JbnB1dEZyYW1lV2lkdGg7Ci0gICAgICAgIC8vRW5jUGFyYW1zMS5JbnB1dEZyYW1lSGVpZ2h0ID0gRW5jUGFyYW1zLklucHV0RnJhbWVIZWlnaHQ7Ci0gICAgICAgIEVuY1BhcmFtczEuRnJhbWVXaWR0aCA9IEVuY1BhcmFtcy5GcmFtZVdpZHRoOwotICAgICAgICBFbmNQYXJhbXMxLkZyYW1lSGVpZ2h0ID0gRW5jUGFyYW1zLkZyYW1lSGVpZ2h0OwotICAgICAgICBFbmNQYXJhbXMxLnZpZGVvUHJvZmlsZT0gRW5jUGFyYW1zLnZpZGVvUHJvZmlsZTsKLSAgICAgICAgRW5jUGFyYW1zMS52aWRlb0xldmVsPSBFbmNQYXJhbXMudmlkZW9MZXZlbDsKLSAgICAgICAgRW5jUGFyYW1zMS5CaXRyYXRlID0gRW5jUGFyYW1zLkJpdHJhdGU7Ci0gICAgICAgIEVuY1BhcmFtczEuRnJhbWVSYXRlID0gRW5jUGFyYW1zLkZyYW1lUmF0ZTsKLSAgICAgICAgRW5jUGFyYW1zMS5Gb3JtYXQgPSBNNEVOQ09ERVJfa0gyNjQ7IC8vRW5jUGFyYW1zLkZvcm1hdDsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIm1jcyBlbmNvZGVyIG9wZW4gcHJvZmlsZSA6JWQsIGxldmVsICVkIiwKLSAgICAgICAgICAgIEVuY1BhcmFtczEudmlkZW9Qcm9maWxlLCBFbmNQYXJhbXMxLnZpZGVvTGV2ZWwpOwotICAgICAgICBlcnIgPSBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RPcGVuKHBDLT5wVmlFbmNDdHh0LAotICAgICAgICAgICAgJnBDLT5Xcml0ZXJWaWRlb0FVLCAmRW5jUGFyYW1zMSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJtY3MgZW5jb2RlciBvcGVuIEFkdiBwcm9maWxlIDolZCwgbGV2ZWwgJWQiLAotICAgICAgICAgICAgRW5jUGFyYW1zLnZpZGVvUHJvZmlsZSwgRW5jUGFyYW1zLnZpZGVvTGV2ZWwpOwotICAgICAgICBlcnIgPSBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RPcGVuKHBDLT5wVmlFbmNDdHh0LAotICAgICAgICAgICAgJnBDLT5Xcml0ZXJWaWRlb0FVLCAmRW5jUGFyYW1zKTsKLSAgICB9Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcjogRW5jb2RlckludC0+cEZjdE9wZW4gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcEMtPmVuY29kZXJTdGF0ZSA9IE00TUNTX2tFbmNvZGVyU3RvcHBlZDsKLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0YXJ0ICkKLSAgICB7Ci0gICAgICAgIGVyciA9IHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0YXJ0KHBDLT5wVmlFbmNDdHh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcjogRW5jb2RlckludC0+cEZjdFN0YXJ0IHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwQy0+ZW5jb2RlclN0YXRlID0gTTRNQ1Nfa0VuY29kZXJSdW5uaW5nOwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiBWaWRlbyByZXNpemUgbWFuYWdlbWVudCAgICAqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyoqCi0gICAgKiBDb21wYXJlIHZpZGVvIGlucHV0IHNpemUgYW5kIHZpZGVvIG91dHB1dCBzaXplIHRvIGNoZWNrIGlmIHJlc2l6ZSBpcyBuZWVkZWQgKi8KLSAgICBpZiggKCAoTTRPU0FfVUludDMyKUVuY1BhcmFtcy5GcmFtZVdpZHRoCi0gICAgICAgICE9IHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fdmlkZW9XaWR0aCkKLSAgICAgICAgfHwgKChNNE9TQV9VSW50MzIpRW5jUGFyYW1zLkZyYW1lSGVpZ2h0Ci0gICAgICAgICE9IHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fdmlkZW9IZWlnaHQpICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEFsbG9jYXRlIHRoZSBpbnRlcm1lZGlhdGUgdmlkZW8gcGxhbmUgdGhhdCB3aWxsIHJlY2VpdmUgdGhlIGRlY29kZWQgaW1hZ2UgYmVmb3JlCi0gICAgICAgICByZXNpemluZyAqLwotICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lID0KLSAgICAgICAgICAgIChNNFZJRklfSW1hZ2VQbGFuZSAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygzICogc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwKLSAgICAgICAgICAgIE00TUNTLCAoTTRPU0FfQ2hhciAqKSJtX3BQcmVSZXNpemVGcmFtZSIpOwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5wUHJlUmVzaXplRnJhbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcigpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBtX3BQcmVSZXNpemVGcmFtZSwgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEFsbG9jYXRlIHRoZSBZIHBsYW5lICovCi0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMF0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZVswXS51X3dpZHRoID0gcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICBtX3ZpZGVvV2lkdGg7IC8qKjwgaW5wdXQgd2lkdGggKi8KLSAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZVswXS51X2hlaWdodCA9IHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgbV92aWRlb0hlaWdodDsgLyoqPCBpbnB1dCBoZWlnaHQgKi8KLSAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZVswXS51X3N0cmlkZSA9IHBDLT4KLSAgICAgICAgICAgIHBQcmVSZXNpemVGcmFtZVswXS51X3dpZHRoOyAvKio8IHNpbXBsZSBjYXNlOiBzdHJpZGUgZXF1YWxzIHdpZHRoICovCi0KLSAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZVswXS5wYWNfZGF0YSA9Ci0gICAgICAgICAgICAoTTRWSUZJX1VJbnQ4ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBDLT5wUHJlUmVzaXplRnJhbWVbMF0udV9zdHJpZGUgXAotICAgICAgICAgICAgKnBDLT5wUHJlUmVzaXplRnJhbWVbMF0udV9oZWlnaHQsIE00TUNTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikibV9wUHJlUmVzaXplRnJhbWVbMF0ucGFjX2RhdGEiKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXIoKTpcCi0gICAgICAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgbV9wUHJlUmVzaXplRnJhbWVbMF0ucGFjX2RhdGEsIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQWxsb2NhdGUgdGhlIFUgcGxhbmUgKi8KLSAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZVsxXS51X3RvcGxlZnQgPSAwOwotICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lWzFdLnVfd2lkdGggPSBwQy0+cFByZVJlc2l6ZUZyYW1lWzBdLnVfd2lkdGgKLSAgICAgICAgICAgID4+IDE7IC8qKjwgVSB3aWR0aCBpcyBoYWxmIHRoZSBZIHdpZHRoICovCi0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMV0udV9oZWlnaHQgPSBwQy0+cFByZVJlc2l6ZUZyYW1lWzBdLnVfaGVpZ2h0Ci0gICAgICAgICAgICA+PiAxOyAvKio8IFUgaGVpZ2h0IGlzIGhhbGYgdGhlIFkgaGVpZ2h0ICovCi0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMV0udV9zdHJpZGUgPSBwQy0+Ci0gICAgICAgICAgICBwUHJlUmVzaXplRnJhbWVbMV0udV93aWR0aDsgLyoqPCBzaW1wbGUgY2FzZTogc3RyaWRlIGVxdWFscyB3aWR0aCAqLwotCi0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEgPQotICAgICAgICAgICAgKE00VklGSV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+cFByZVJlc2l6ZUZyYW1lWzFdLnVfc3RyaWRlIFwKLSAgICAgICAgICAgICpwQy0+cFByZVJlc2l6ZUZyYW1lWzFdLnVfaGVpZ2h0LCBNNE1DUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopIm1fcFByZVJlc2l6ZUZyYW1lWzFdLnBhY19kYXRhIik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlVmlkZW9FbmNvZGVyKCk6XAotICAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgbV9wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEsIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQWxsb2NhdGUgdGhlIFYgcGxhbmUgKi8KLSAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZVsyXS51X3RvcGxlZnQgPSAwOwotICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lWzJdLnVfd2lkdGggPSBwQy0+Ci0gICAgICAgICAgICBwUHJlUmVzaXplRnJhbWVbMV0udV93aWR0aDsgLyoqPCBWIHdpZHRoIGVxdWFscyBVIHdpZHRoICovCi0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMl0udV9oZWlnaHQgPSBwQy0+Ci0gICAgICAgICAgICBwUHJlUmVzaXplRnJhbWVbMV0udV9oZWlnaHQ7IC8qKjwgViBoZWlnaHQgZXF1YWxzIFUgaGVpZ2h0ICovCi0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMl0udV9zdHJpZGUgPSBwQy0+Ci0gICAgICAgICAgICBwUHJlUmVzaXplRnJhbWVbMl0udV93aWR0aDsgLyoqPCBzaW1wbGUgY2FzZTogc3RyaWRlIGVxdWFscyB3aWR0aCAqLwotCi0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEgPQotICAgICAgICAgICAgKE00VklGSV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+cFByZVJlc2l6ZUZyYW1lWzJdLnVfc3RyaWRlIFwKLSAgICAgICAgICAgICpwQy0+cFByZVJlc2l6ZUZyYW1lWzJdLnVfaGVpZ2h0LCBNNE1DUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopIm1fcFByZVJlc2l6ZUZyYW1lWzFdLnBhY19kYXRhIik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBQcmVSZXNpemVGcmFtZVsyXS5wYWNfZGF0YSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlVmlkZW9FbmNvZGVyKCk6XAotICAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgbV9wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEsIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19pbnRQcmVwYXJlVmlkZW9FbmNvZGVyKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2ludFByZXBhcmVBdWRpb1Byb2Nlc3NpbmcoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyk7Ci0gKiBAYnJpZWYgICAgUHJlcGFyZSB0aGUgQUFDIGRlY29kZXIsIHRoZSBTUkMgYW5kIHRoZSBBTVItTkIgZW5jb2RlciBhbmQgdGhlIE1QMyBlbmNvZGVyLgotICogQHBhcmFtICAgIHBDICAgICAgICAgIChJTikgTUNTIHByaXZhdGUgY29udGV4dAotICogQHJldHVybiAgIE00Tk9fRVJST1IgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgQW55IGVycm9yIHJldHVybmVkIGJ5IGFuIHVuZGVybGF5aW5nIG1vZHVsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludFByZXBhcmVBdWRpb1Byb2Nlc3NpbmcoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBTU1JDX1JldHVyblN0YXR1c19lbgotICAgICAgICBSZXR1cm5TdGF0dXM7IC8qIEZ1bmN0aW9uIHJldHVybiBzdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgTFZNX0lOVDE2IE5yU2FtcGxlc01pbiA9Ci0gICAgICAgIDA7IC8qIE1pbmltYWwgbnVtYmVyIG9mIHNhbXBsZXMgb24gdGhlIGlucHV0IG9yIG9uIHRoZSBvdXRwdXQgKi8KLSAgICBMVk1fSU5UMzIgU2NyYXRjaFNpemU7IC8qIFRoZSBzaXplIG9mIHRoZSBzY3JhdGNoIG1lbW9yeSAgICAgICAgICAgICAgICovCi0gICAgTFZNX0lOVDE2Ci0gICAgICAgICpwSW5wdXRJblNjcmF0Y2g7IC8qIFBvaW50ZXIgdG8gaW5wdXQgaW4gdGhlIHNjcmF0Y2ggYnVmZmVyICAgICAgICovCi0gICAgTFZNX0lOVDE2Ci0gICAgICAgICpwT3V0cHV0SW5TY3JhdGNoOyAvKiBQb2ludGVyIHRvIHRoZSBvdXRwdXQgaW4gdGhlIHNjcmF0Y2ggYnVmZmVyICAqLwotICAgIFNTUkNfUGFyYW1zX3Qgc3NyY1BhcmFtczsgICAgICAgICAgLyogTWVtb3J5IGZvciBpbml0IHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICovCi0KLSNpZmRlZiBNQ1NfRFVNUF9QQ01fVE9fRklMRQotCi0gICAgZmlsZV9hdV9yZWFkZXIgPSBmb3BlbigibWNzX1JlYWRlck91dHB1dC5yYXciLCAid2IiKTsKLSAgICBmaWxlX3BjbV9kZWNvZGVyID0gZm9wZW4oIm1jc19EZWNvZGVyT3V0cHV0LnBjbSIsICJ3YiIpOwotICAgIGZpbGVfcGNtX2VuY29kZXIgPSBmb3BlbigibWNzX0VuY29kZXJJbnB1dC5wY20iLCAid2IiKTsKLQotI2VuZGlmCi0KLSAgICBpZiggcEMtPm5vYXVkaW8gKQotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLQotICAgIGlmKCBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID09IE00RU5DT0RFUl9rQXVkaW9OVUxMICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVBdWRpb1Byb2Nlc3NpbmcoKTogTnVsbCBlbmNvZGluZywgZG8gbm90aGluZy4iKTsKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCBDcmVhdGUgYW5kICJzdGFydCIgdGhlIGRlY29kZXIgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5tX3BBdWRpb0RlY29kZXIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZUF1ZGlvUHJvY2Vzc2luZygpOiBGYWlscyB0byBpbml0aWF0ZSB0aGUgYXVkaW8gZGVjb2Rlci4iKTsKLSAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9BVURJT19DT05WRVJTSU9OX0ZBSUxFRDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cEF1ZGlvRGVjQ3R4dCApCi0gICAgewotICAgICAgICBlcnIgPSBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYygmcEMtPnBBdWRpb0RlY0N0eHQsCi0gICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLCBwQy0+bV9wQ3VycmVudEF1ZGlvRGVjb2RlclVzZXJEYXRhKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRGVjb2RlcjogbV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYoIE00VklERU9FRElUSU5HX2tBTVJfTkIgPT0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlICkgewotICAgICAgICAvKiBBTVIgREVDT0RFUiBDT05GSUdVUkFUSU9OICovCi0KLSAgICAgICAgLyogbm90aGluZyBzcGVjaWZpYyB0byBkbyAqLwotICAgIH0KLSAgICBlbHNlIGlmKCBNNFZJREVPRURJVElOR19rRVZSQyA9PSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgKSB7Ci0gICAgICAgIC8qIEVWUkMgREVDT0RFUiBDT05GSUdVUkFUSU9OICovCi0KLSAgICAgICAgLyogbm90aGluZyBzcGVjaWZpYyB0byBkbyAqLwotICAgIH0KLSAgICBlbHNlIGlmKCBNNFZJREVPRURJVElOR19rTVAzID09IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSApIHsKLSAgICAgICAgLyogTVAzIERFQ09ERVIgQ09ORklHVVJBVElPTiAqLwotCi0gICAgICAgIC8qIG5vdGhpbmcgc3BlY2lmaWMgdG8gZG8gKi8KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogQUFDIERFQ09ERVIgQ09ORklHVVJBVElPTiAqLwotICAgICAgICBNNF9BYWNEZWNvZGVyQ29uZmlnIEFhY0RlY1BhcmFtOwotCi0gICAgICAgIEFhY0RlY1BhcmFtLm1fQUFDRGVjb2RlclByb2ZpbGUgPSBBQUNfa0FBQzsKLSAgICAgICAgQWFjRGVjUGFyYW0ubV9Eb3duU2FtcGxpbmdNb2RlID0gQUFDX2tEU19PRkY7Ci0KLSAgICAgICAgaWYoIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPT0gTTRFTkNPREVSX2tBTVJOQiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFhY0RlY1BhcmFtLm1fT3V0cHV0TW9kZSA9IEFBQ19rTW9ubzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEZvciB0aGlzIHZlcnNpb24sIHdlIGVuY29kZSBvbmx5IGluIEFBQyAqLwotICAgICAgICAgICAgaWYoIE00RU5DT0RFUl9rTW9ubyA9PSBwQy0+QXVkaW9FbmNQYXJhbXMuQ2hhbm5lbE51bSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQWFjRGVjUGFyYW0ubV9PdXRwdXRNb2RlID0gQUFDX2tNb25vOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFhY0RlY1BhcmFtLm1fT3V0cHV0TW9kZSA9IEFBQ19rU3RlcmVvOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcEMtPm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uQXVkaW9EZWMocEMtPnBBdWRpb0RlY0N0eHQsCi0gICAgICAgICAgICBNNEFEX2tPcHRpb25JRF9Vc2VyUGFyYW0sIChNNE9TQV9EYXRhT3B0aW9uKSAmQWFjRGVjUGFyYW0pOwotICAgIH0KLQotICAgIHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbkF1ZGlvRGVjKHBDLT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICBNNEFEX2tPcHRpb25JRF8zZ3BSZWFkZXJJbnRlcmZhY2UsIChNNE9TQV9EYXRhT3B0aW9uKSBwQy0+bV9wUmVhZGVyRGF0YUl0KTsKLQotICAgIHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbkF1ZGlvRGVjKHBDLT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICBNNEFEX2tPcHRpb25JRF9BdWRpb0FVLCAoTTRPU0FfRGF0YU9wdGlvbikgJnBDLT5SZWFkZXJBdWRpb0FVKTsKLQotICAgIGlmKCBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTdGFydEF1ZGlvRGVjICE9IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgLyogTm90IGltcGxlbWVudGVkIGluIGFsbCBkZWNvZGVycyAqLwotICAgICAgICBlcnIgPSBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTdGFydEF1ZGlvRGVjKHBDLT5wQXVkaW9EZWNDdHh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRGVjb2RlcjogbV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTdGFydEF1ZGlvRGVjIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEFsbG9jYXRlIG91dHB1dCBidWZmZXIgZm9yIHRoZSBhdWRpbyBkZWNvZGVyICovCi0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlEZWNvZGVkUGNtU2l6ZSA9Ci0gICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYnl0ZUZyYW1lTGVuZ3RoCi0gICAgICAgICogcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9ieXRlU2FtcGxlU2l6ZQotICAgICAgICAqIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fbmJDaGFubmVsczsKLQotICAgIGlmKCBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aURlY29kZWRQY21TaXplID4gMCApCi0gICAgewotICAgICAgICBwQy0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplID0KLSAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpRGVjb2RlZFBjbVNpemU7Ci0gICAgICAgIHBDLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEMtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSBcCi0gICAgICAgICAgICAqc2l6ZW9mKHNob3J0KSwgTTRNQ1MsIChNNE9TQV9DaGFyICopIkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSIpOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0RlY29kZXIoKTpcCi0gICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIEF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MsIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLSAgICAvKnwgU2V0IHRoZSBTU1JDIHBhcmFtZXRlcnMgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0gICAgc3dpdGNoKCBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX3NhbXBsaW5nRnJlcXVlbmN5ICkKLSAgICB7Ci0gICAgICAgIGNhc2UgODAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19JbiA9IExWTV9GU184MDAwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAxMTAyNToKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19JbiA9IExWTV9GU18xMTAyNTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMTIwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfSW4gPSBMVk1fRlNfMTIwMDA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDE2MDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX0luID0gTFZNX0ZTXzE2MDAwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAyMjA1MDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19JbiA9IExWTV9GU18yMjA1MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMjQwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfSW4gPSBMVk1fRlNfMjQwMDA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDMyMDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX0luID0gTFZNX0ZTXzMyMDAwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSA0NDEwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19JbiA9IExWTV9GU180NDEwMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgNDgwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfSW4gPSBMVk1fRlNfNDgwMDA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0RlY29kZXI6IGludmFsaWQgaW5wdXQgQUFDIHNhbXBsaW5nIGZyZXF1ZW5jeSAoJWQgSHopLFwKLSAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00TUNTX0VSUl9JTlZBTElEX0FBQ19TQU1QTElOR19GUkVRVUVOQ1kiLAotICAgICAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fc2FtcGxpbmdGcmVxdWVuY3kpOwotICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9JTlZBTElEX0FBQ19TQU1QTElOR19GUkVRVUVOQ1k7Ci0gICAgfQotCi0gICAgaWYoIDEgPT0gcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzICkKLSAgICB7Ci0gICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Ock9mQ2hhbm5lbHMgPSBMVk1fTU9OTzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgc3NyY1BhcmFtcy5TU1JDX05yT2ZDaGFubmVscyA9IExWTV9TVEVSRU87Ci0gICAgfQotCi0gICAgLypGbEIgMjYuMDIuMjAwOTogYWRkIG1wMyBhcyBvdXRwdXQgZm9ybWF0Ki8KLSAgICBpZiggcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9PSBNNEVOQ09ERVJfa0FBQwotICAgICAgICB8fCBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID09IE00RU5DT0RFUl9rTVAzICkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCggcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRFTkNPREVSX2s4MDAwSHo6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU184MDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rMTEwMjVIejoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfT3V0ID0gTFZNX0ZTXzExMDI1OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rMTIwMDBIejoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfT3V0ID0gTFZNX0ZTXzEyMDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rMTYwMDBIejoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfT3V0ID0gTFZNX0ZTXzE2MDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rMjIwNTBIejoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfT3V0ID0gTFZNX0ZTXzIyMDUwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rMjQwMDBIejoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfT3V0ID0gTFZNX0ZTXzI0MDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rMzIwMDBIejoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfT3V0ID0gTFZNX0ZTXzMyMDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rNDQxMDBIejoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfT3V0ID0gTFZNX0ZTXzQ0MTAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rNDgwMDBIejoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfT3V0ID0gTFZNX0ZTXzQ4MDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZUF1ZGlvUHJvY2Vzc2luZzogaW52YWxpZCBvdXRwdXQgQUFDIHNhbXBsaW5nIGZyZXF1ZW5jeSBcCi0gICAgICAgICAgICAgICAgICAgICglZCBIeiksIHJldHVybmluZyBNNE1DU19FUlJfSU5WQUxJRF9BQUNfU0FNUExJTkdfRlJFUVVFTkNZIiwKLSAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9JTlZBTElEX0FBQ19TQU1QTElOR19GUkVRVUVOQ1k7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU184MDAwOwotICAgIH0KLQotCi0KLSAgICBSZXR1cm5TdGF0dXMgPSAwOwotCi0gICAgc3dpdGNoKCBzc3JjUGFyYW1zLlNTUkNfRnNfSW4gKQotICAgIHsKLSAgICAgICAgY2FzZSBMVk1fRlNfODAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSAzMjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIExWTV9GU18xMTAyNToKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSA0NDE7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIExWTV9GU18xMjAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSA0ODA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIExWTV9GU18xNjAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSA2NDA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIExWTV9GU18yMjA1MDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSA4ODI7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIExWTV9GU18yNDAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSA5NjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIExWTV9GU18zMjAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSAxMjgwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBMVk1fRlNfNDQxMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gMTc2NDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTFZNX0ZTXzQ4MDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNJbiA9IDE5MjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgUmV0dXJuU3RhdHVzID0gLTE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBzd2l0Y2goIHNzcmNQYXJhbXMuU1NSQ19Gc19PdXQgKQotICAgIHsKLSAgICAgICAgY2FzZSBMVk1fRlNfODAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0ID0gMzIwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBMVk1fRlNfMTEwMjU6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA9IDQ0MTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTFZNX0ZTXzEyMDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQgPSA0ODA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIExWTV9GU18xNjAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0ID0gNjQwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBMVk1fRlNfMjIwNTA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA9IDg4MjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTFZNX0ZTXzI0MDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQgPSA5NjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIExWTV9GU18zMjAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0ID0gMTI4MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTFZNX0ZTXzQ0MTAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQgPSAxNzY0OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBMVk1fRlNfNDgwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA9IDE5MjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgUmV0dXJuU3RhdHVzID0gLTE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLQotCi0gICAgaWYoIFJldHVyblN0YXR1cyAhPSBTU1JDX09LICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVBdWRpb1Byb2Nlc3Npbmc6XAotICAgICAgICAgICAgIEVycm9yIGNvZGUgJWQgcmV0dXJuZWQgYnkgdGhlIFNTUkNfR2V0TnJTYW1wbGVzIGZ1bmN0aW9uIiwKLSAgICAgICAgICAgIFJldHVyblN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBNNE1DU19FUlJfQVVESU9fQ09OVkVSU0lPTl9GQUlMRUQ7Ci0gICAgfQotCi0gICAgTnJTYW1wbGVzTWluID0KLSAgICAgICAgKExWTV9JTlQxNikoKHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPiBzc3JjUGFyYW1zLk5yU2FtcGxlc091dCkKLSAgICAgICAgPyBzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA6IHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4pOwotCi0gICAgd2hpbGUoIE5yU2FtcGxlc01pbiA8IE00TUNTX1NTUkNfTUlOQkxPQ0tTSVpFICkKLSAgICB7IC8qIERvbid0IHRha2UgYmxvY2tzIHNtYWxsZXIgdGhhdCB0aGUgbWluaW1hbCBibG9jayBzaXplICovCi0gICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSAoTFZNX0lOVDE2KShzc3JjUGFyYW1zLk5yU2FtcGxlc0luIDw8IDEpOwotICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA9IChMVk1fSU5UMTYpKHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0IDw8IDEpOwotICAgICAgICBOclNhbXBsZXNNaW4gPSAoTFZNX0lOVDE2KShOclNhbXBsZXNNaW4gPDwgMSk7Ci0gICAgfQotCi0KLSAgICBwQy0+aVNzcmNOYlNhbXBsSW4gPSAoTFZNX0lOVDE2KSgKLSAgICAgICAgc3NyY1BhcmFtcy4KLSAgICAgICAgTnJTYW1wbGVzSW4pOyAvKiBtdWx0aXBsaWNhdGlvbiBieSBOck9mQ2hhbm5lbHMgaXMgZG9uZSBiZWxvdyAqLwotICAgIHBDLT5pU3NyY05iU2FtcGxPdXQgPSAoTFZNX0lOVDE2KShzc3JjUGFyYW1zLk5yU2FtcGxlc091dCk7Ci0KLSAgICAvKioKLSAgICAqIEFsbG9jYXRlIGJ1ZmZlciBmb3IgdGhlIGlucHV0IG9mIHRoZSBTU1JDICovCi0gICAgcEMtPnBTc3JjQnVmZmVySW4gPQotICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBDLT5pU3NyY05iU2FtcGxJbiAqIHNpemVvZihzaG9ydCkgXAotICAgICAgICAqcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzLCBNNE1DUywKLSAgICAgICAgKE00T1NBX0NoYXIgKikicFNzcmNCdWZmZXJJbiIpOwotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBTc3JjQnVmZmVySW4gKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRGVjb2RlcigpOlwKLSAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgcFNzcmNCdWZmZXJJbiwgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiA9IChNNE9TQV9NZW1BZGRyOClwQy0+cFNzcmNCdWZmZXJJbjsKLQotICAgIC8qKgotICAgICogQWxsb2NhdGUgYnVmZmVyIGZvciB0aGUgb3V0cHV0IG9mIHRoZSBTU1JDICovCi0gICAgcEMtPnBTc3JjQnVmZmVyT3V0ID0KLSAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+aVNzcmNOYlNhbXBsT3V0ICogc2l6ZW9mKHNob3J0KSBcCi0gICAgICAgICpwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHMsIE00TUNTLAotICAgICAgICAoTTRPU0FfQ2hhciAqKSJwU3NyY0J1ZmZlck91dCIpOwotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBTc3JjQnVmZmVyT3V0ICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0RlY29kZXIoKTpcCi0gICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIHBTc3JjQnVmZmVyT3V0LCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotCi0gICAgcEMtPnBMVkF1ZGlvUmVzYW1wbGVyID0gTFZBdWRpb1Jlc2FtcGxlckNyZWF0ZSgKLSAgICAgICAgMTYsIC8qZ0lucHV0UGFyYW1zLmx2QlRDaGFubmVsQ291bnQqLwotICAgICAgICAoTTRPU0FfSW50MTYpcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlOYkNoYW5uZWxzLypzc3JjUGFyYW1zLlNTUkNfTnJPZkNoYW5uZWxzKi8sCi0gICAgICAgIChNNE9TQV9JbnQzMikocEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSkvKnNzcmNQYXJhbXMuU1NSQ19Gc19PdXQqLywgMSk7Ci0KLSAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBMVkF1ZGlvUmVzYW1wbGVyKQotICAgICB7Ci0gICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgIH0KLQotICAgIExWQXVkaW9zZXRTYW1wbGVSYXRlKHBDLT5wTFZBdWRpb1Jlc2FtcGxlciwKLSAgICAgICAgLypnSW5wdXRQYXJhbXMubHZJblNhbXBsZVJhdGUqLwotICAgICAgICAvKnBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5Ki8KLSAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeS8qc3NyY1BhcmFtcy5TU1JDX0ZzX0luKi8pOwotCi0gICAgTFZBdWRpb3NldFZvbHVtZShwQy0+cExWQXVkaW9SZXNhbXBsZXIsIChNNE9TQV9JbnQxNikoMHgxMDAwIC8qIDB4N2ZmZiAqLyksCi0gICAgICAgIChNNE9TQV9JbnQxNikoMHgxMDAwLyoweDdmZmYqLykpOwotCi0KLSAgICAvKiBfX19fX19fX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLSAgICAvKnwgSW5pdCB0aGUgYXVkaW8gZW5jb2RlciB8Ki8KLSAgICAvKnxfX19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotICAgIC8qIEluaXRpYWxpc2UgdGhlIGF1ZGlvIGVuY29kZXIgKi8KLQotICAgIGVyciA9IHBDLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEluaXQoJnBDLT5wQXVkaW9FbmNDdHh0LAotICAgICAgICBwQy0+cEN1cnJlbnRBdWRpb0VuY29kZXJVc2VyRGF0YSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZUF1ZGlvUHJvY2Vzc2luZzogcEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RJbml0IHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qIE9wZW4gdGhlIGF1ZGlvIGVuY29kZXIgKi8KLSAgICBlcnIgPSBwQy0+cEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RPcGVuKHBDLT5wQXVkaW9FbmNDdHh0LAotICAgICAgICAmcEMtPkF1ZGlvRW5jUGFyYW1zLCAmcEMtPnBBdWRpb0VuY0RTSSwKLSAgICAgICAgTTRPU0FfTlVMTCAvKiBubyBncmFiYmluZyAqLyk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZUF1ZGlvUHJvY2Vzc2luZzogcEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RPcGVuIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qIEFsbG9jYXRlIHRoZSBpbnB1dCBidWZmZXIgZm9yIHRoZSBhdWRpbyBlbmNvZGVyICovCi0gICAgc3dpdGNoKCBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tBTVJOQjoKLSAgICAgICAgICAgIHBDLT5hdWRpb0VuY29kZXJHcmFudWxhcml0eSA9IE00TUNTX1BDTV9BTVJfR1JBTlVMQVJJVFlfU0FNUExFUzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tBQUM6Ci0gICAgICAgICAgICBwQy0+YXVkaW9FbmNvZGVyR3JhbnVsYXJpdHkgPSBNNE1DU19QQ01fQUFDX0dSQU5VTEFSSVRZX1NBTVBMRVM7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLypGbEIgMjYuMDIuMjAwOTogYWRkIG1wMyBhcyBvdXRwdXQgZm9ybWF0Ki8KLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa01QMzoKLSAgICAgICAgICAgIHBDLT5hdWRpb0VuY29kZXJHcmFudWxhcml0eSA9IE00TUNTX1BDTV9NUDNfR1JBTlVMQVJJVFlfU0FNUExFUzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICBkZWZhdWx0OgotICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYoIE00RU5DT0RFUl9rTW9ubyA9PSBwQy0+QXVkaW9FbmNQYXJhbXMuQ2hhbm5lbE51bSApCi0gICAgICAgIHBDLT5hdWRpb0VuY29kZXJHcmFudWxhcml0eSAqPSBzaXplb2Yoc2hvcnQpOwotICAgIGVsc2UKLSAgICAgICAgcEMtPmF1ZGlvRW5jb2RlckdyYW51bGFyaXR5ICo9IHNpemVvZihzaG9ydCkgKiAyOwotCi0gICAgcEMtPnBQb3NJbkF1ZGlvRW5jb2RlckJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBBdWRpb0VuY29kZXJCdWZmZXIgPQotICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBDLT5hdWRpb0VuY29kZXJHcmFudWxhcml0eSwgTTRNQ1MsCi0gICAgICAgIChNNE9TQV9DaGFyICopInBDLT5wQXVkaW9FbmNvZGVyQnVmZmVyIik7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX2ludFByZXBhcmVBdWRpb1Byb2Nlc3NpbmcoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50UHJlcGFyZVdyaXRlcihNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDKTsKLSAqIEBicmllZiAgICBQcmVwYXJlIHRoZSB3cml0ZXIuCi0gKiBAcGFyYW0gICAgcEMgICAgICAgICAgKElOKSBNQ1MgcHJpdmF0ZSBjb250ZXh0Ci0gKiBAcmV0dXJuICAgTTROT19FUlJPUiAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICBBbnkgZXJyb3IgcmV0dXJuZWQgYnkgYW4gdW5kZXJsYXlpbmcgbW9kdWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50UHJlcGFyZVdyaXRlciggTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9VSW50MzIgdWlWZXJzaW9uOyAvKio8IFRvIHdyaXRlIGNvbXBvbmVudCB2ZXJzaW9uIGluIDNncCB3cml0ZXIgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCBwRFNJID0gTTRPU0FfTlVMTDsgLyoqPCBUbyBjcmVhdGUgdGhlIERlY29kZXIgU3BlY2lmaWMgSW5mbyAqLwotICAgIE00U1lTX1N0cmVhbUlEVmFsdWUgb3B0aW9uVmFsdWU7IC8qKjwgRm9yIHRoZSBzZXRvcHRpb24gY2FsbHMgKi8KLSAgICBNNE9TQV9VSW50MzIgVGFyZ2V0ZWRGaWxlU2l6ZTsKLSAgICBNNE9TQV9Cb29sIGJNVUxQUFNTUFMgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qKgotICAgICogSW5pdCB0aGUgd3JpdGVyICovCi0gICAgZXJyID0gcEMtPnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0T3BlbigmcEMtPnBXcml0ZXJDb250ZXh0LCBwQy0+cE91dHB1dEZpbGUsCi0gICAgICAgIHBDLT5wT3NhRmlsZVdyaXRQdHIsIHBDLT5wVGVtcG9yYXJ5RmlsZSwgcEMtPnBPc2FGaWxlUmVhZFB0cik7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVdyaXRlcjogcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RPcGVuIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogTGluayB0byB0aGUgd3JpdGVyIGNvbnRleHQgaW4gdGhlIHdyaXRlciBpbnRlcmZhY2UgKi8KLSAgICBwQy0+cFdyaXRlckRhdGFGY3RzLT5wV3JpdGVyQ29udGV4dCA9IHBDLT5wV3JpdGVyQ29udGV4dDsKLQotICAgIC8qKgotICAgICogU2V0IHRoZSBwcm9kdWN0IGRlc2NyaXB0aW9uIHN0cmluZyBpbiB0aGUgd3JpdHRlbiBmaWxlICovCi0gICAgZXJyID0gcEMtPnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKHBDLT5wV3JpdGVyQ29udGV4dCwKLSAgICAgICAgTTRXUklURVJfa0VtYmVkZGVkU3RyaW5nLCAoTTRPU0FfRGF0YU9wdGlvbikiTlhQLVNXIDogTUNTICAgICIpOwotCi0gICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpICYmICgoIChNNE9TQV9VSW50MzIpTTRFUlJfQkFEX09QVElPTl9JRCkKLSAgICAgICAgIT0gZXJyKSApIC8qIHRoaXMgb3B0aW9uIG1heSBub3QgYmUgaW1wbGVtZW50ZWQgYnkgc29tZSB3cml0ZXJzICovCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlV3JpdGVyOlwKLSAgICAgICAgICAgICBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihNNFdSSVRFUl9rRW1iZWRkZWRTdHJpbmcpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogU2V0IHRoZSBwcm9kdWN0IHZlcnNpb24gaW4gdGhlIHdyaXR0ZW4gZmlsZSAqLwotICAgIHVpVmVyc2lvbiA9Ci0gICAgICAgIE00VklERU9FRElUSU5HX1ZFUlNJT05fTUFKT1IgKiAxMDAgKyBNNFZJREVPRURJVElOR19WRVJTSU9OX01JTk9SICogMTAKLSAgICAgICAgKyBNNFZJREVPRURJVElOR19WRVJTSU9OX1JFVklTSU9OOwotICAgIGVyciA9IHBDLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihwQy0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00V1JJVEVSX2tFbWJlZGRlZFZlcnNpb24sIChNNE9TQV9EYXRhT3B0aW9uKSAmdWlWZXJzaW9uKTsKLQotICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSAmJiAoKCAoTTRPU0FfVUludDMyKU00RVJSX0JBRF9PUFRJT05fSUQpCi0gICAgICAgICE9IGVycikgKSAvKiB0aGlzIG9wdGlvbiBtYXkgbm90IGJlIGltcGxlbWVudGVkIGJ5IHNvbWUgd3JpdGVycyAqLwotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVdyaXRlcjogXAotICAgICAgICAgICAgcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oTTRXUklURVJfa0VtYmVkZGVkVmVyc2lvbikgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJZiB0aGVyZSBpcyBhIHZpZGVvIGlucHV0LCBhbGxvY2F0ZSBhbmQgZmlsbCB0aGUgdmlkZW8gc3RyZWFtIHN0cnVjdHVyZXMgZm9yIHRoZSB3cml0ZXIgKi8KLSAgICBpZiggcEMtPm5vdmlkZW8gPT0gTTRPU0FfRkFMU0UgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogRmlsbCBWaWRlbyBwcm9wZXJ0aWVzIHN0cnVjdHVyZSBmb3IgdGhlIEFkZFN0cmVhbSBtZXRob2QgKi8KLSAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtSW5mby5oZWlnaHQgPSBwQy0+RW5jb2RpbmdIZWlnaHQ7Ci0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8ud2lkdGggPSBwQy0+RW5jb2RpbmdXaWR0aDsKLSAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtSW5mby5mcHMgPQotICAgICAgICAgICAgMDsgLyoqPCBOb3QgdXNlZCBieSB0aGUgc2hlbGwvY29yZSB3cml0ZXIgKi8KLSAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtSW5mby5IZWFkZXIucEJ1ZiA9Ci0gICAgICAgICAgICBNNE9TQV9OVUxMOyAvKio8IFdpbGwgYmUgdXBkYXRlZCBsYXRlciAqLwotICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLkhlYWRlci5TaXplID0gMDsgLyoqPCBXaWxsIGJlIHVwZGF0ZWQgbGF0ZXIgKi8KLQotICAgICAgICAvKioKLSAgICAgICAgKiBGaWxsIFZpZGVvIHN0cmVhbSBkZXNjcmlwdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBBZGRTdHJlYW0gbWV0aG9kICovCi0gICAgICAgIHN3aXRjaCggcEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rTVBFRzQ6Ci0gICAgICAgICAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtLnN0cmVhbVR5cGUgPSBNNFNZU19rTVBFR180OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rSDI2MzoKLSAgICAgICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW0uc3RyZWFtVHlwZSA9IE00U1lTX2tIMjYzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rSDI2NDoKLSAgICAgICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW0uc3RyZWFtVHlwZSA9IE00U1lTX2tIMjY0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rTlVMTDoKLSAgICAgICAgICAgICAgICBzd2l0Y2goIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tNUEVHNDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbS5zdHJlYW1UeXBlID0gTTRTWVNfa01QRUdfNDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0gyNjM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW0uc3RyZWFtVHlwZSA9IE00U1lTX2tIMjYzOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2NDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbS5zdHJlYW1UeXBlID0gTTRTWVNfa0gyNjQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVXcml0ZXI6IGNhc2UgaW5wdXQ9TTRFTkNPREVSX2tOVUxMLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93biBmb3JtYXQgKDB4JXgpLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZPUk1BVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZPUk1BVDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6IC8qKjwgSXQgc2hvdWxkIG5ldmVyIGhhcHBlbiwgYWxyZWFkeSB0ZXN0ZWQgKi8KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVXcml0ZXI6IHVua25vd24gZm9ybWF0ICgweCV4KSxcCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRk9STUFUIiwKLSAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GT1JNQVQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBWaWRlbyBiaXRyYXRlIHZhbHVlIHdpbGwgYmUgdGhlIHJlYWwgdmFsdWUgKi8KLSAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtLmF2ZXJhZ2VCaXRyYXRlID0KLSAgICAgICAgICAgIChNNE9TQV9JbnQzMilwQy0+dWlFbmNWaWRlb0JpdHJhdGU7Ci0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbS5tYXhCaXRyYXRlID0gKE00T1NBX0ludDMyKXBDLT51aUVuY1ZpZGVvQml0cmF0ZTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBtb3N0IG90aGVyIHBhcmFtZXRlcnMgYXJlICJkdW1teSIgKi8KLSAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtLnN0cmVhbUlEID0gTTRNQ1NfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRDsKLSAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtLnRpbWVTY2FsZSA9Ci0gICAgICAgICAgICAwOyAvKio8IE5vdCB1c2VkIGJ5IHRoZSBzaGVsbC9jb3JlIHdyaXRlciAqLwotICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW0ucHJvZmlsZUxldmVsID0KLSAgICAgICAgICAgIDA7IC8qKjwgTm90IHVzZWQgYnkgdGhlIHNoZWxsL2NvcmUgd3JpdGVyICovCi0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbS5kdXJhdGlvbiA9Ci0gICAgICAgICAgICAwOyAvKio8IE5vdCB1c2VkIGJ5IHRoZSBzaGVsbC9jb3JlIHdyaXRlciAqLwotICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW0uZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPQotICAgICAgICAgICAgc2l6ZW9mKE00V1JJVEVSX1N0cmVhbVZpZGVvSW5mb3MpOwotICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW0uZGVjb2RlclNwZWNpZmljSW5mbyA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKSAmKHBDLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8pOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFVwZGF0ZSBFbmNvZGVyIEhlYWRlciBwcm9wZXJ0aWVzIGZvciBWaWRlbyBzdHJlYW0gaWYgbmVlZGVkICovCi0gICAgICAgIGlmKCBNNEVOQ09ERVJfa0gyNjMgPT0gcEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQ3JlYXRlcyB0aGUgSDI2MyBEU0kgKi8KLSAgICAgICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uSGVhZGVyLlNpemUgPQotICAgICAgICAgICAgICAgIDc7IC8qKjwgSDI2MyBvdXRwdXQgRFNJIGlzIGFsd2F5cyA3IGJ5dGVzICovCi0gICAgICAgICAgICBwRFNJID0gKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyg3LCBNNE1DUywgKE00T1NBX0NoYXIKLSAgICAgICAgICAgICAgICAqKSJwQy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLkhlYWRlci5wQnVmIChEU0kgSDI2MykiKTsKLQotICAgICAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcERTSSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TUNTX2ludFByZXBhcmVXcml0ZXIoKTogdW5hYmxlIHRvIGFsbG9jYXRlIHBEU0kgKEgyNjMpLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBWZW5kb3IgaXMgTlhQIFNvZnR3YXJlOiBOLCBYLCBQLCBTLiAqLwotICAgICAgICAgICAgcERTSVswXSA9ICdOJzsKLSAgICAgICAgICAgIHBEU0lbMV0gPSAnWCc7Ci0gICAgICAgICAgICBwRFNJWzJdID0gJ1AnOwotICAgICAgICAgICAgcERTSVszXSA9ICdTJzsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIERlY29kZXIgdmVyc2lvbiBpcyAwICovCi0gICAgICAgICAgICBwRFNJWzRdID0gMDsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIExldmVsIGlzIHRoZSBzaXh0aCBieXRlIG9mIHRoZSBEU0kuICovCi0gICAgICAgICAgICBzd2l0Y2goIHBDLT5FbmNvZGluZ1dpZHRoICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9TUUNJRl9XaWR0aDoKLSAgICAgICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9RQ0lGX1dpZHRoOgotICAgICAgICAgICAgICAgICAgICBpZiggKCBwQy0+dWlFbmNWaWRlb0JpdHJhdGUgPD0gTTRFTkNPREVSX2s2NF9LQlBTKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlIDw9IE00RU5DT0RFUl9rMTVfRlBTKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEU0lbNV0gPSAxMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCAoIHBDLT51aUVuY1ZpZGVvQml0cmF0ZSA8PSBNNEVOQ09ERVJfazEyOF9LQlBTKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlIDw9IE00RU5DT0RFUl9rMTVfRlBTKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEU0lbNV0gPSA0NTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCAoIHBDLT51aUVuY1ZpZGVvQml0cmF0ZSA8PSBNNEVOQ09ERVJfazEyOF9LQlBTKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlIDw9IE00RU5DT0RFUl9rMzBfRlBTKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEU0lbNV0gPSAyMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCAoIHBDLT51aUVuY1ZpZGVvQml0cmF0ZSA8PSBNNEVOQ09ERVJfazM4NF9LQlBTKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlIDw9IE00RU5DT0RFUl9rMzBfRlBTKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEU0lbNV0gPSAzMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCAoIHBDLT51aUVuY1ZpZGVvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgPD0gTTRFTkNPREVSX2s4MDBfS0JQUy8qMjA0OCovKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlIDw9IE00RU5DT0RFUl9rMzBfRlBTKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEU0lbNV0gPSA0MDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRFTkNPREVSX0NJRl9XaWR0aDoKLSAgICAgICAgICAgICAgICAgICAgaWYoICggcEMtPnVpRW5jVmlkZW9CaXRyYXRlIDw9IE00RU5DT0RFUl9rMTI4X0tCUFMpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAocEMtPkVuY29kaW5nVmlkZW9GcmFtZXJhdGUgPD0gTTRFTkNPREVSX2sxNV9GUFMpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcERTSVs1XSA9IDIwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoICggcEMtPnVpRW5jVmlkZW9CaXRyYXRlIDw9IE00RU5DT0RFUl9rMzg0X0tCUFMpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAocEMtPkVuY29kaW5nVmlkZW9GcmFtZXJhdGUgPD0gTTRFTkNPREVSX2szMF9GUFMpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcERTSVs1XSA9IDMwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoICggcEMtPnVpRW5jVmlkZW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICA8PSBNNEVOQ09ERVJfazgwMF9LQlBTLyoyMDQ4Ki8pCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAocEMtPkVuY29kaW5nVmlkZW9GcmFtZXJhdGUgPD0gTTRFTkNPREVSX2szMF9GUFMpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcERTSVs1XSA9IDQwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogUHJvZmlsZSBpcyB0aGUgc2V2ZW50aCBieXRlIG9mIHRoZSBEU0kuICovCi0gICAgICAgICAgICBwRFNJWzZdID0gMDsKLQotICAgICAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtSW5mby5IZWFkZXIucEJ1ZiA9IHBEU0k7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggTTRFTkNPREVSX2tOVUxMID09IHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0ICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogSWYgd2UgY29weSB0aGUgc3RyZWFtIGZyb20gdGhlIGlucHV0LCB3ZSBjb3B5IGl0cyBEU0kgKi8KLQotICAgICAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtSW5mby5IZWFkZXIuU2l6ZSA9IHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemU7Ci0gICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLkhlYWRlci5wQnVmID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbzsKLQotICAgICAgICB9Ci0gICAgICAgIC8qIG90aGVyd2lzZSAoTVBFRzQpLCB0aGUgRFNJIHdpbGwgYmUgcmVjb3ZlcmVkIGZyb20gdGhlIGVuY29kZXIgbGF0ZXIgb24uICovCi0KLSAgICAgICAgLyorQ1JMVjY3NzUgLSBILjI2NCBUcmltbWluZyAgKi8KLSAgICAgICAgaWYoIHBDLT5iSDI2NFRyaW0gPT0gTTRPU0FfVFJVRSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJNVUxQUFNTUFMgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgZXJyID0gcEMtPnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKHBDLT5wV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNVUxfUFBTX1NQUywKLSAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJmJNVUxQUFNTUFMpOwotCi0gICAgICAgICAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICAmJiAoKCAoTTRPU0FfVUludDMyKU00RVJSX0JBRF9PUFRJT05fSUQpCi0gICAgICAgICAgICAgICAgIT0gZXJyKSApIC8qIHRoaXMgb3B0aW9uIG1heSBub3QgYmUgaW1wbGVtZW50ZWQgYnkgc29tZSB3cml0ZXJzICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlV3JpdGVyOlwKLSAgICAgICAgICAgICAgICAgICAgIHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKE00V1JJVEVSX2tNVUxfUFBTX1NQUykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qLUNSTFY2Nzc1IC0gSC4yNjQgVHJpbW1pbmcgICovCi0gICAgICAgIC8qKgotICAgICAgICAqIEFkZCB0aGUgdmlkZW8gc3RyZWFtICovCi0gICAgICAgIGVyciA9IHBDLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdEFkZFN0cmVhbShwQy0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAmcEMtPldyaXRlclZpZGVvU3RyZWFtKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVdyaXRlcjogcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RBZGRTdHJlYW0odmlkZW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogVXBkYXRlIEFVIHByb3BlcnRpZXMgZm9yIHZpZGVvIHN0cmVhbSAqLwotICAgICAgICBwQy0+V3JpdGVyVmlkZW9BVS5zdHJlYW0gPSAmKHBDLT5Xcml0ZXJWaWRlb1N0cmVhbSk7Ci0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb0FVLmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPldyaXRlclZpZGVvQVUuc2l6ZSA9IDA7Ci0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb0FVLkNUUyA9IDA7IC8qKiBSZXNldCB0aW1lICovCi0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb0FVLkRUUyA9IDA7Ci0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb0FVLmF0dHJpYnV0ZSA9IEFVX1JBUDsKLSAgICAgICAgcEMtPldyaXRlclZpZGVvQVUubmJGcmFnID0gMDsgLyoqIE5vIGZyYWdtZW50ICovCi0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb0FVLmZyYWcgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFNldCB0aGUgd3JpdGVyIG1heCB2aWRlbyBBVSBzaXplICovCi0gICAgICAgIG9wdGlvblZhbHVlLnN0cmVhbUlEID0gTTRNQ1NfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRDsKLSAgICAgICAgb3B0aW9uVmFsdWUudmFsdWUgPSBwQy0+dWlWaWRlb01heEF1U2l6ZTsKLSAgICAgICAgZXJyID0gcEMtPnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKHBDLT5wV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIChNNE9TQV9VSW50MzIpTTRXUklURVJfa01heEFVU2l6ZSwKLSAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmb3B0aW9uVmFsdWUpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlV3JpdGVyOiBcCi0gICAgICAgICAgICAgICAgcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oTTRXUklURVJfa01heEFVU2l6ZSwgdmlkZW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogU2V0IHRoZSB3cml0ZXIgbWF4IHZpZGVvIGNodW5rIHNpemUgKi8KLSAgICAgICAgb3B0aW9uVmFsdWUudmFsdWUgPSBwQy0+dWlWaWRlb01heENodW5ja1NpemU7Ci0gICAgICAgIGVyciA9IHBDLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihwQy0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNYXhDaHVuY2tTaXplLAotICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZvcHRpb25WYWx1ZSk7Ci0KLSAgICAgICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpICYmICgoIChNNE9TQV9VSW50MzIpTTRFUlJfQkFEX09QVElPTl9JRCkKLSAgICAgICAgICAgICE9IGVycikgKSAvKiB0aGlzIG9wdGlvbiBtYXkgbm90IGJlIGltcGxlbWVudGVkIGJ5IHNvbWUgd3JpdGVycyAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVdyaXRlcjpcCi0gICAgICAgICAgICAgICAgIHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKE00V1JJVEVSX2tNYXhBVVNpemUsIHZpZGVvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogSWYgdGhlcmUgaXMgYW4gYXVkaW8gaW5wdXQsIGFsbG9jYXRlIGFuZCBmaWxsIHRoZSBhdWRpbyBzdHJlYW0gc3RydWN0dXJlcyBmb3IgdGhlIHdyaXRlciAqLwotICAgIGlmKCBwQy0+bm9hdWRpbyA9PSBNNE9TQV9GQUxTRSApCi0gICAgewotICAgICAgICBNNFdSSVRFUl9TdHJlYW1BdWRpb0luZm9zIHN0cmVhbUF1ZGlvSW5mbzsKLQotICAgICAgICBzdHJlYW1BdWRpb0luZm8ubmJTYW1wbGVzUGVyU2VjID0gMDsgLyoqPCB1bnVzZWQgYnkgb3VyIHNoZWxsIHdyaXRlciAqLwotICAgICAgICBzdHJlYW1BdWRpb0luZm8ubmJCaXRzUGVyU2FtcGxlID0gMDsgLyoqPCB1bnVzZWQgYnkgb3VyIHNoZWxsIHdyaXRlciAqLwotICAgICAgICBzdHJlYW1BdWRpb0luZm8ubmJDaGFubmVscyA9IDE7ICAgICAgLyoqPCB1bnVzZWQgYnkgb3VyIHNoZWxsIHdyaXRlciAqLwotCi0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5hdmVyYWdlQml0cmF0ZSA9Ci0gICAgICAgICAgICAwOyAvKio8IEl0IGlzIG5vdCB1c2VkIGJ5IHRoZSBzaGVsbCwgdGhlIERTSSBpcyB0YWtlbiBpbnRvIGFjY291bnQgaW5zdGVhZCAqLwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9TdHJlYW0ubWF4Qml0cmF0ZSA9Ci0gICAgICAgICAgICAwOyAvKio8IE5vdCB1c2VkIGJ5IHRoZSBzaGVsbC9jb3JlIHdyaXRlciAqLwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEZpbGwgQXVkaW8gc3RyZWFtIGRlc2NyaXB0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIEFkZFN0cmVhbSBtZXRob2QgKi8KLSAgICAgICAgc3dpdGNoKCBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfa0FNUk5COgotICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1UeXBlID0gTTRTWVNfa0FNUjsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfa0FBQzoKLSAgICAgICAgICAgICAgICBwQy0+V3JpdGVyQXVkaW9TdHJlYW0uc3RyZWFtVHlwZSA9IE00U1lTX2tBQUM7Ci0gICAgICAgICAgICAgICAgcEMtPldyaXRlckF1ZGlvU3RyZWFtLmF2ZXJhZ2VCaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgcEMtPldyaXRlckF1ZGlvU3RyZWFtLm1heEJpdHJhdGUgPSBwQy0+QXVkaW9FbmNQYXJhbXMuQml0cmF0ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIC8qRmxCIDI2LjAyLjIwMDk6IGFkZCBtcDMgYXMgb3V0cHV0IGZvcm1hdCovCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rTVAzOgotICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1UeXBlID0gTTRTWVNfa01QMzsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfa0F1ZGlvTlVMTDoKLSAgICAgICAgICAgICAgICBzd2l0Y2goIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FNUl9OQjoKLSAgICAgICAgICAgICAgICAgICAgcEMtPldyaXRlckF1ZGlvU3RyZWFtLnN0cmVhbVR5cGUgPSBNNFNZU19rQU1SOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgLypGbEIgMjYuMDIuMjAwOTogYWRkIG1wMyBhcyBvdXRwdXQgZm9ybWF0Ki8KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tNUDM6Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1UeXBlID0gTTRTWVNfa01QMzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUM6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDcGx1czoKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tlQUFDcGx1czoKLSAgICAgICAgICAgICAgICAgICAgcEMtPldyaXRlckF1ZGlvU3RyZWFtLnN0cmVhbVR5cGUgPSBNNFNZU19rQUFDOwotICAgICAgICAgICAgICAgICAgICBwQy0+V3JpdGVyQXVkaW9TdHJlYW0uYXZlcmFnZUJpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5tYXhCaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5CaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0VWUkM6Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1UeXBlID0gTTRTWVNfa0VWUkM7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvOgotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1BDTToKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tOdWxsQXVkaW86Ci0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rVW5zdXBwb3J0ZWRBdWRpbzoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OiAvKio8IEl0IHNob3VsZCBuZXZlciBoYXBwZW4sIGFscmVhZHkgdGVzdGVkICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlV3JpdGVyOiBcCi0gICAgICAgICAgICAgICAgICAgIHVua25vd24gZm9ybWF0ICgweCV4KSwgcmV0dXJuaW5nIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX0FVRElPX0ZPUk1BVCIsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9BVURJT19GT1JNQVQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBNQ1MgcHJvZHVjZXMgb25seSBBTVItTkIgb3V0cHV0ICovCi0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1JRCA9IE00TUNTX1dSSVRFUl9BVURJT19TVFJFQU1fSUQ7Ci0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5kdXJhdGlvbiA9Ci0gICAgICAgICAgICAwOyAvKio8IE5vdCB1c2VkIGJ5IHRoZSBzaGVsbC9jb3JlIHdyaXRlciAqLwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9TdHJlYW0ucHJvZmlsZUxldmVsID0KLSAgICAgICAgICAgIDA7IC8qKjwgTm90IHVzZWQgYnkgdGhlIHNoZWxsL2NvcmUgd3JpdGVyICovCi0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS50aW1lU2NhbGUgPSBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5OwotCi0gICAgICAgIGlmKCBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID09IE00RU5DT0RFUl9rQXVkaW9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogSWYgd2UgY29weSB0aGUgc3RyZWFtIGZyb20gdGhlIGlucHV0LCB3ZSBjb3B5IGl0cyBEU0kgKi8KLSAgICAgICAgICAgIHN0cmVhbUF1ZGlvSW5mby5IZWFkZXIuU2l6ZSA9IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPgotICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemU7Ci0gICAgICAgICAgICBzdHJlYW1BdWRpb0luZm8uSGVhZGVyLnBCdWYgPQotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHBDLT5wQXVkaW9FbmNEU0kucEluZm8gIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogVXNlIHRoZSBEU0kgZ2l2ZW4gYnkgdGhlIGVuY29kZXIgb3BlbigpICovCi0gICAgICAgICAgICAgICAgc3RyZWFtQXVkaW9JbmZvLkhlYWRlci5TaXplID0gcEMtPnBBdWRpb0VuY0RTSS5pbmZvU2l6ZTsKLSAgICAgICAgICAgICAgICBzdHJlYW1BdWRpb0luZm8uSGVhZGVyLnBCdWYgPSBwQy0+cEF1ZGlvRW5jRFNJLnBJbmZvOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFdyaXRlciB3aWxsIHB1dCBhIGRlZmF1bHQgUGhpbGlwcyBEU0kgKi8KLSAgICAgICAgICAgICAgICBzdHJlYW1BdWRpb0luZm8uSGVhZGVyLlNpemUgPSAwOwotICAgICAgICAgICAgICAgIHN0cmVhbUF1ZGlvSW5mby5IZWFkZXIucEJ1ZiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBPdXIgd3JpdGVyIHNoZWxsIGludGVyZmFjZSBpcyBhIGxpdHRsZSB0cmlja3k6IHdlIHB1dCBNNFdSSVRFUl9TdHJlYW1BdWRpb0luZm9zCi0gICAgICAgICBpbiB0aGUgRFNJIHBvaW50ZXIuLi4gKi8KLSAgICAgICAgcEMtPldyaXRlckF1ZGlvU3RyZWFtLmRlY29kZXJTcGVjaWZpY0luZm8gPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMikgJnN0cmVhbUF1ZGlvSW5mbzsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBBZGQgdGhlIGF1ZGlvIHN0cmVhbSB0byB0aGUgd3JpdGVyICovCi0gICAgICAgIGVyciA9IHBDLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdEFkZFN0cmVhbShwQy0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAmcEMtPldyaXRlckF1ZGlvU3RyZWFtKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVdyaXRlcjogcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RBZGRTdHJlYW0oYXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBMaW5rIHRoZSBBVSBhbmQgdGhlIHN0cmVhbSAqLwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5zdHJlYW0gPSAmKHBDLT5Xcml0ZXJBdWRpb1N0cmVhbSk7Ci0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPldyaXRlckF1ZGlvQVUuc2l6ZSA9IDA7Ci0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLkNUUyA9IDA7IC8qKiBSZXNldCB0aW1lICovCi0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLkRUUyA9IDA7Ci0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLmF0dHJpYnV0ZSA9IDA7Ci0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLm5iRnJhZyA9IDA7IC8qKiBObyBmcmFnbWVudCAqLwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5mcmFnID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBTZXQgdGhlIHdyaXRlciBhdWRpbyBtYXggQVUgc2l6ZSAqLwotICAgICAgICAvKiBBcyBtYXggYml0cmF0ZSBpcyBub3cgMzIwa2JwcyBpbnN0ZWFkIG9mIDEyOGticHMsIG1heCBBVQotICAgICAgICAgKiBzaXplIGhhcyB0byBiZSBpbmNyZWFzZWQgYWRhcHQgdGhlIG1heCBBVSBzaXplIGFjY29yZGluZyB0byB0aGUgc3RyZWFtIHR5cGUgYW5kIHRoZQotICAgICAgICAgKiBjaGFubmVscyBudW1iZXJzKi8KLSAgICAgICAgLyogQWZ0ZXIgdGVzdHMsIGEgbWFyZ2luIG9mIDMgaXMgdGFrZW4gKDIgd2FzIG5vdCBlbm91Z2ggYW5kIHJhaXNlcyB0byBtZW1vcnkgb3ZlcndyaXRlKQotICAgICAgICAgKi8KLSAgICAgICAgLy9wQy0+dWlBdWRpb01heEF1U2l6ZSA9IE00TUNTX0FVRElPX01BWF9BVV9TSVpFOwotICAgICAgICBzd2l0Y2goIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFNZU19rQU1SOgotICAgICAgICAgICAgICAgIHBDLT51aUF1ZGlvTWF4QXVTaXplID0gTTRNQ1NfUENNX0FNUl9HUkFOVUxBUklUWV9TQU1QTEVTCi0gICAgICAgICAgICAgICAgICAgICogKCggcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlOYkNoYW5uZWxzCi0gICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKHNob3J0KSkgKyAzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFNZU19rTVAzOgotICAgICAgICAgICAgICAgIHBDLT51aUF1ZGlvTWF4QXVTaXplID0gTTRNQ1NfUENNX01QM19HUkFOVUxBUklUWV9TQU1QTEVTCi0gICAgICAgICAgICAgICAgICAgICogKCggcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlOYkNoYW5uZWxzCi0gICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKHNob3J0KSkgKyAzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFNZU19rQUFDOgotICAgICAgICAgICAgICAgIHBDLT51aUF1ZGlvTWF4QXVTaXplID0gTTRNQ1NfUENNX0FBQ19HUkFOVUxBUklUWV9TQU1QTEVTCi0gICAgICAgICAgICAgICAgICAgICogKCggcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlOYkNoYW5uZWxzCi0gICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKHNob3J0KSkgKyAzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAvKmNhc2UgTTRTWVNfa0VWUkM6Ci0gICAgICAgICAgICAgICAgcEMtPnVpQXVkaW9NYXhBdVNpemUgPSBNNE1DU19QQ01fRVZSQ19HUkFOVUxBUklUWV9TQU1QTEVTKgotICAgICAgICAgICAgICAgICgocEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlOYkNoYW5uZWxzICogc2l6ZW9mKHNob3J0KSkrMyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ki8KLSAgICAgICAgICAgIGRlZmF1bHQ6IC8qKjwgSXQgc2hvdWxkIG5ldmVyIGhhcHBlbiwgYWxyZWFkeSB0ZXN0ZWQgKi8KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVXcml0ZXI6IHVua25vd24gZm9ybWF0ICgweCV4KSxcCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfQVVESU9fRk9STUFUIiwKLSAgICAgICAgICAgICAgICAgICAgcEMtPldyaXRlckF1ZGlvU3RyZWFtLnN0cmVhbVR5cGUpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9BVURJT19GT1JNQVQ7Ci0gICAgICAgIH0KLQotICAgICAgICBvcHRpb25WYWx1ZS5zdHJlYW1JRCA9IE00TUNTX1dSSVRFUl9BVURJT19TVFJFQU1fSUQ7Ci0gICAgICAgIG9wdGlvblZhbHVlLnZhbHVlID0gcEMtPnVpQXVkaW9NYXhBdVNpemU7Ci0gICAgICAgIGVyciA9IHBDLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihwQy0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNYXhBVVNpemUsCi0gICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJm9wdGlvblZhbHVlKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVdyaXRlcjogcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oYXVkaW8sXAotICAgICAgICAgICAgICAgIE00V1JJVEVSX2tNYXhBVVNpemUpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBvcHRpb25WYWx1ZS52YWx1ZSA9IE00TUNTX0FVRElPX01BWF9DSFVOS19TSVpFOwotICAgICAgICBlcnIgPSBwQy0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24ocEMtPnBXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgKE00T1NBX1VJbnQzMilNNFdSSVRFUl9rTWF4Q2h1bmNrU2l6ZSwKLSAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmb3B0aW9uVmFsdWUpOwotCi0gICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSAmJiAoKCAoTTRPU0FfVUludDMyKU00RVJSX0JBRF9PUFRJT05fSUQpCi0gICAgICAgICAgICAhPSBlcnIpICkgLyogdGhpcyBvcHRpb24gbWF5IG5vdCBiZSBpbXBsZW1lbnRlZCBieSBzb21lIHdyaXRlcnMgKi8KLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVXcml0ZXI6IHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKGF1ZGlvLFwKLSAgICAgICAgICAgICAgICBNNFdSSVRFUl9rTWF4Q2h1bmNrU2l6ZSkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgKiBTZXQgdGhlIGxpbWl0YXRpb24gc2l6ZSBvZiB0aGUgd3JpdGVyICovCi0gICAgVGFyZ2V0ZWRGaWxlU2l6ZSA9IHBDLT51aU1heEZpbGVTaXplOwotICAgIC8qIGFkZCAxIGtCIG1hcmdpbiAqLwotICAgIGlmKCBUYXJnZXRlZEZpbGVTaXplID4gODE5MiApCi0gICAgICAgIFRhcmdldGVkRmlsZVNpemUgLT0gMTAyNDsKLQotICAgIGVyciA9IHBDLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihwQy0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgIChNNE9TQV9VSW50MzIpTTRXUklURVJfa01heEZpbGVTaXplLAotICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJlRhcmdldGVkRmlsZVNpemUpOwotCi0gICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpICYmICgoIChNNE9TQV9VSW50MzIpTTRFUlJfQkFEX09QVElPTl9JRCkKLSAgICAgICAgIT0gZXJyKSApIC8qIHRoaXMgb3B0aW9uIG1heSBub3QgYmUgaW1wbGVtZW50ZWQgYnkgc29tZSB3cml0ZXJzICovCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlV3JpdGVyOiBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvblwKLSAgICAgICAgICAgIChNNFdSSVRFUl9rTWF4RmlsZVNpemUpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENsb3NlIHRoZSBzdHJlYW0gcmVnaXN0ZXJpbmcgaW4gb3JkZXIgdG8gYmUgcmVhZHkgdG8gd3JpdGUgZGF0YSAqLwotICAgIGVyciA9IHBDLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFN0YXJ0V3JpdGluZyhwQy0+cFdyaXRlckNvbnRleHQpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVXcml0ZXI6IHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U3RhcnRXcml0aW5nIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfaW50UHJlcGFyZVdyaXRlcigpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19pbnRQcmVwYXJlQXVkaW9CZWdpbkN1dChNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDKTsKLSAqIEBicmllZiAgICBETyB0aGUgYXVkaW8gYmVnaW4gY3V0LgotICogQHBhcmFtICAgIHBDICAgICAgICAgIChJTikgTUNTIHByaXZhdGUgY29udGV4dAotICogQHJldHVybiAgIE00Tk9fRVJST1IgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgQW55IGVycm9yIHJldHVybmVkIGJ5IGFuIHVuZGVybGF5aW5nIG1vZHVsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludFByZXBhcmVBdWRpb0JlZ2luQ3V0KCBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX0ludDMyIGlDdHM7Ci0gICAgTTRPU0FfVUludDMyIHVpRnJhbWVTaXplOwotCi0gICAgaWYoIHBDLT5ub2F1ZGlvICkKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIGFuIGF1ZGlvIGJlZ2luIGN1dCBpcyBuZWVkZWQgKi8KLSAgICBpZiggKCBNNE9TQV9OVUxMID09IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0pIHx8ICgwID09IHBDLT51aUJlZ2luQ3V0VGltZSkgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZUF1ZGlvQmVnaW5DdXQoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IgKGEpIik7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgIC8qKgotICAgICogSnVtcCBhdCB0aGUgYmVnaW4gY3V0IHRpbWUgKi8KLSAgICBpQ3RzID0gcEMtPnVpQmVnaW5DdXRUaW1lOwotICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdEp1bXAocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyQXVkaW9TdHJlYW0sICZpQ3RzKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlQXVkaW9CZWdpbkN1dDogbV9wRmN0SnVtcChBdWRpbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmVtZW1iZXIgYXVkaW8gYmVnaW4gY3V0IG9mZnNldCAqLwotICAgIHBDLT5pQXVkaW9DdHNPZmZzZXQgPSBpQ3RzOwotCi0gICAgLyoqCi0gICAgKiBBTVItTkIgJiBFVlJDOiB0aGVyZSBtYXkgYmUgbWFueSBmcmFtZXMgcGVyIEFVLgotICAgICogSW4gdGhhdCBjYXNlIHdlIG5lZWQgdG8gc2xpY2UgdGhlIGZpcnN0IEFVIHRvIGtlZXAgdGhlIDIwIG1zIGN1dCBwcmVjaXNpb24gKi8KLSAgICBpZiggKCBNNERBX1N0cmVhbVR5cGVBdWRpb0Ftck5hcnJvd0JhbmQKLSAgICAgICAgPT0gcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKQotICAgICAgICB8fCAoTTREQV9TdHJlYW1UeXBlQXVkaW9FdnJjCi0gICAgICAgID09IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSkgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogSWYgdGhlIG5leHQgZnJhbWUgQ1RTIGlzIGxvd2VyIHRoYW4gdGhlIGJlZ2luIGN1dCB0aW1lLAotICAgICAgICAqIHdlIG11c3QgcmVhZCB0aGUgQVUgYW5kIHBhcnNlIGl0cyBmcmFtZXMgdG8gcmVhY2ggdGhlCi0gICAgICAgICogbmVhcmVzdCB0byB0aGUgYmVnaW4gY3V0ICovCi0gICAgICAgIGlmKCAoIGlDdHMgKyAyMCkgPCAoTTRPU0FfSW50MzIpcEMtPnVpQmVnaW5DdXRUaW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFJlYWQgdGhlIGZpcnN0IGF1ZGlvIEFVIGFmdGVyIHRoZSBqdW1wICovCi0gICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAmcEMtPlJlYWRlckF1ZGlvQVUpOwotCi0gICAgICAgICAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZUF1ZGlvQmVnaW5DdXQoKTogbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUoYXVkaW8pXAotICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyBNNFdBUl9OT19NT1JFX0FVISBSZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgICAgICBNNE5PX0VSUk9SOyAvKio8IG5vIGZhdGFsIGVycm9yIGhlcmUsIHdlIHNob3VsZCBiZSBhYmxlIHRvIHB1cnN1ZSAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZUF1ZGlvQmVnaW5DdXQoKTogbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUoQXVkaW8pXAotICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogV2hpbGUgdGhlIG5leHQgQVUgaGFzIGEgbG93ZXIgQ1RTIHRoYW4gdGhlIGJlZ2luIGN1dCB0aW1lLCB3ZSBhZHZhbmNlIHRvCi0gICAgICAgICAgICB0aGUgbmV4dCBmcmFtZSAqLwotICAgICAgICAgICAgd2hpbGUoICggaUN0cyArIDIwKSA8PSAoTTRPU0FfSW50MzIpcEMtPnVpQmVnaW5DdXRUaW1lICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEdldCB0aGUgc2l6ZSBvZiB0aGUgZnJhbWUgKi8KLSAgICAgICAgICAgICAgICBzd2l0Y2goIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpRnJhbWVTaXplID0gTTRNQ1NfaW50R2V0RnJhbWVTaXplX0FNUk5CKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVLm1fZGF0YUFkZHJlc3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb0V2cmM6Ci0gICAgICAgICAgICAgICAgICAgICAgICB1aUZyYW1lU2l6ZSA9IE00TUNTX2ludEdldEZyYW1lU2l6ZV9FVlJDKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVLm1fZGF0YUFkZHJlc3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpRnJhbWVTaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCAwID09IHVpRnJhbWVTaXplICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIENvcnJ1cHRlZCBmcmFtZSEgV2UgZ2V0IG91dCBvZiB0aGlzIG1lc3MhCi0gICAgICAgICAgICAgICAgICAgICogV2UgZG9uJ3Qgd2FudCB0byBjcmFzaCBoZXJlLi4uICovCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVBdWRpb0JlZ2luQ3V0KCk6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX2ludEdldEZyYW1lU2l6ZV94eHggcmV0dXJucyAwISBSZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgICAgIE00Tk9fRVJST1I7IC8qKjwgbm8gZmF0YWwgZXJyb3IgaGVyZSwgd2Ugc2hvdWxkIGJlIGFibGUgdG8gcHVyc3VlICovCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBHbyB0byB0aGUgbmV4dCBmcmFtZSAqLwotICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVLm1fZGF0YUFkZHJlc3MgKz0gdWlGcmFtZVNpemU7Ci0gICAgICAgICAgICAgICAgcEMtPlJlYWRlckF1ZGlvQVUubV9zaXplIC09IHVpRnJhbWVTaXplOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBHZXQgdGhlIENUUyBvZiB0aGUgbmV4dCBmcmFtZSAqLwotICAgICAgICAgICAgICAgIGlDdHMgKz0gMjA7IC8qKjwgQU1SLCBFVlJDIGZyYW1lIGR1cmF0aW9uIGlzIGFsd2F5cyAyMCBtcyAqLwotICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVLm1fQ1RTID0gaUN0czsKLSAgICAgICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVS5tX0RUUyA9IGlDdHM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBVcGRhdGUgdGhlIGF1ZGlvIGJlZ2luIGN1dCBvZmZzZXQgKi8KLSAgICAgICAgICAgIHBDLT5pQXVkaW9DdHNPZmZzZXQgPSBpQ3RzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19pbnRQcmVwYXJlQXVkaW9CZWdpbkN1dCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19pbnRTdGVwRW5jb2RpbmcoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQywgTTRPU0FfVUludDgqIHBQcm9ncmVzcykKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRTdGVwRW5jb2RpbmcoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCAqcFByb2dyZXNzICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX1VJbnQzMiB1aUF1ZGlvU3RlcENvdW50ID0gMDsKLQotICAgIC8qIC0tLS0tLS0tLS0gVklERU8gVFJBTlNDT0RJTkcgLS0tLS0tLS0tLSAqLwotCi0gICAgaWYoICggcEMtPm5vdmlkZW8gPT0gTTRPU0FfRkFMU0UpICYmIChNNE1DU19rU3RyZWFtU3RhdGVfU1RBUlRFRAotICAgICAgICA9PSBwQy0+VmlkZW9TdGF0ZSkgKSAvKio8IElmIHRoZSB2aWRlbyBlbmNvZGluZyBpcyBnb2luZyBvbiAqLwotICAgIHsKLSAgICAgICAgaWYoIHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0ID09IE00RU5DT0RFUl9rTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nKHBDKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00TUNTX2ludFZpZGVvVHJhbnNjb2RpbmcocEMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogTm8gbW9yZSBzcGFjZSwgcXVpdCBwcm9wZXJseSAqLwotICAgICAgICBpZiggTTRXQVJfV1JJVEVSX1NUT1BfUkVRID09IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwUHJvZ3Jlc3MgPSAoTTRPU0FfVUludDgpKCggKCAoTTRPU0FfVUludDMyKXBDLT5kVmlEZWNDdXJyZW50Q3RzCi0gICAgICAgICAgICAgICAgLSBwQy0+dWlCZWdpbkN1dFRpbWUpICogMTAwKQotICAgICAgICAgICAgICAgIC8gKHBDLT51aUVuZEN1dFRpbWUgLSBwQy0+dWlCZWdpbkN1dFRpbWUpKTsKLQotICAgICAgICAgICAgcEMtPlN0YXRlID0gTTRNQ1Nfa1N0YXRlX0ZJTklTSEVEOwotCi0gICAgICAgICAgICAvKiBiYWQgZmlsZSBwcm9kdWNlZCBvbiB2ZXJ5IHNob3J0IDNncCBmaWxlICovCi0gICAgICAgICAgICBpZiggcEMtPmRWaURlY0N1cnJlbnRDdHMgLSBwQy0+dWlCZWdpbkN1dFRpbWUgPT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogTm90aGluZyBoYXMgYmVlbiBlbmNvZGVkIC0+IGJhZCBwcm9kdWNlZCBmaWxlIC0+IGVycm9yIHJldHVybmVkICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRTdGVwRW5jb2RpbmcoKTogdmlkZW8gdHJhbnNjb2RpbmcgcmV0dXJuc1wKLSAgICAgICAgICAgICAgICAgICAgIE00TUNTX0VSUl9PVVRQVVRfRklMRV9TSVpFX1RPT19TTUFMTCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfT1VUUFVUX0ZJTEVfU0laRV9UT09fU01BTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0jaWZuZGVmIE00TUNTX0FVRElPT05MWQotICAgICAgICAgICAgICAgIC8qIGNsZWFuIEFJUiBjb250ZXh0IG5lZWRlZCB0byBrZWVwIG1lZGlhIGFzcGVjdCByYXRpbyovCi0KLSAgICAgICAgICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+bV9haXJfY29udGV4dCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNEFJUl9jbGVhblVwKHBDLT5tX2Fpcl9jb250ZXh0KTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdDogRXJyb3Igd2hlbiBjbGVhbmluZyBBSVI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5tX2Fpcl9jb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0KLSNlbmRpZiAvKk00TUNTX0FVRElPT05MWSovCi0KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFN0ZXBFbmNvZGluZygpOiB2aWRlbyB0cmFuc2NvZGluZyByZXR1cm5zIE00TUNTX0VSUl9OT01PUkVfU1BBQ0UiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX05PTU9SRV9TUEFDRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKjwgVGhlIGlucHV0IHBsYW5lIGlzIG51bGwgYmVjYXVzZSB0aGUgaW5wdXQgaW1hZ2Ugd2lsbCBiZSBvYnRhaW5lZCBieSB0aGUKLSAgICAgICAgVlBQIGZpbHRlciBmcm9tIHRoZSBjb250ZXh0ICovCi0gICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSAmJiAoTTRXQVJfTk9fTU9SRV9BVSAhPSBlcnIpICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFN0ZXBFbmNvZGluZygpOiB2aWRlbyB0cmFuc2NvZGluZyByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIC0tLS0tLS0tLS0gQVVESU8gVFJBTlNDT0RJTkcgLS0tLS0tLS0tLSAqLwotCi0gICAgaWYoICggcEMtPm5vYXVkaW8gPT0gTTRPU0FfRkFMU0UpICYmIChNNE1DU19rU3RyZWFtU3RhdGVfU1RBUlRFRAotICAgICAgICA9PSBwQy0+QXVkaW9TdGF0ZSkgKSAvKio8IElmIHRoZXJlIGlzIGFuIGF1ZGlvIHN0cmVhbSAqLwotICAgIHsKLSAgICAgICAgd2hpbGUoCi0gICAgICAgICAgICAvKio8IElmIHRoZSB2aWRlbyBlbmNvZGluZyBpcyBydW5uaW5nLCBlbmNvZGUgYXVkaW8gdW50aWwgd2UgcmVhY2ggdmlkZW8gdGltZSAqLwotICAgICAgICAgICAgKCAoIHBDLT5ub3ZpZGVvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAgICAgJiYgKE00TUNTX2tTdHJlYW1TdGF0ZV9TVEFSVEVEID09IHBDLT5WaWRlb1N0YXRlKQotICAgICAgICAgICAgJiYgKHBDLT5SZWFkZXJBdWRpb0FVLm1fQ1RTCi0gICAgICAgICAgICArIHBDLT5tX2F1ZGlvQVVEdXJhdGlvbiA8IHBDLT5SZWFkZXJWaWRlb0FVLm1fQ1RTKSkgfHwKLSAgICAgICAgICAgIC8qKjwgSWYgdGhlIHZpZGVvIGVuY29kaW5nIGlzIG5vdCBydW5uaW5nLCBwZXJmb3JtIDEgc3RlcCBvZiBhdWRpbyBlbmNvZGluZyAqLwotICAgICAgICAgICAgKCggTTRNQ1Nfa1N0cmVhbVN0YXRlX1NUQVJURUQgPT0gcEMtPkF1ZGlvU3RhdGUpCi0gICAgICAgICAgICAmJiAodWlBdWRpb1N0ZXBDb3VudCA8IDEpKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVpQXVkaW9TdGVwQ291bnQrKzsKLQotICAgICAgICAgICAgLyoqPCBjaGVjayBpZiBhbiBhZGlvIGVmZmVjdCBoYXMgdG8gYmUgYXBwbGllZCovCi0gICAgICAgICAgICBlcnIgPSBNNE1DU19pbnRDaGVja0F1ZGlvRWZmZWN0cyhwQyk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRTdGVwRW5jb2RpbmcoKTogTTRNQ1NfaW50Q2hlY2tBdWRpb0VmZmVjdHMgcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID09IE00RU5DT0RFUl9rQXVkaW9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNE1DU19pbnRBdWRpb051bGxFbmNvZGluZyhwQyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIC8qKjwgQXVkaW8gdHJhbnNjb2RpbmcgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNE1DU19pbnRBdWRpb1RyYW5zY29kaW5nKHBDKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIE5vIG1vcmUgc3BhY2UsIHF1aXQgcHJvcGVybHkgKi8KLSAgICAgICAgICAgIGlmKCBNNFdBUl9XUklURVJfU1RPUF9SRVEgPT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqcFByb2dyZXNzID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KSgoICggKE00T1NBX1VJbnQzMilwQy0+UmVhZGVyQXVkaW9BVS5tX0NUUwotICAgICAgICAgICAgICAgICAgICAtIHBDLT51aUJlZ2luQ3V0VGltZSkgKiAxMDApCi0gICAgICAgICAgICAgICAgICAgIC8gKHBDLT51aUVuZEN1dFRpbWUgLSBwQy0+dWlCZWdpbkN1dFRpbWUpKTsKLQotICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9GSU5JU0hFRDsKLQotICAgICAgICAgICAgICAgIC8qIGJhZCBmaWxlIHByb2R1Y2VkIG9uIHZlcnkgc2hvcnQgM2dwIGZpbGUgKi8KLSAgICAgICAgICAgICAgICBpZiggcEMtPlJlYWRlckF1ZGlvQVUubV9DVFMgLSBwQy0+dWlCZWdpbkN1dFRpbWUgPT0gMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBOb3RoaW5nIGhhcyBiZWVuIGVuY29kZWQgLT4gYmFkIHByb2R1Y2VkIGZpbGUgLT4gZXJyb3IgcmV0dXJuZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50U3RlcEVuY29kaW5nKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIHRyYW5zY29kaW5nIHJldHVybnMgTTRNQ1NfRVJSX09VVFBVVF9GSUxFX1NJWkVfVE9PX1NNQUxMIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfT1VUUFVUX0ZJTEVfU0laRV9UT09fU01BTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0jaWZuZGVmIE00TUNTX0FVRElPT05MWQotICAgICAgICAgICAgICAgICAgICAvKiBjbGVhbiBBSVIgY29udGV4dCBuZWVkZWQgdG8ga2VlcCBtZWRpYSBhc3BlY3QgcmF0aW8qLwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5tX2Fpcl9jb250ZXh0ICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRBSVJfY2xlYW5VcChwQy0+bV9haXJfY29udGV4dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OiBFcnJvciB3aGVuIGNsZWFuaW5nIEFJUjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX2Fpcl9jb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0jZW5kaWYgLypNNE1DU19BVURJT09OTFkqLwotCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFN0ZXBFbmNvZGluZygpOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyB0cmFuc2NvZGluZyByZXR1cm5zIE00TUNTX0VSUl9OT01PUkVfU1BBQ0UiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9OT01PUkVfU1BBQ0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDLT5BdWRpb1N0YXRlID0gTTRNQ1Nfa1N0cmVhbVN0YXRlX0ZJTklTSEVEOwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50U3RlcEVuY29kaW5nKCk6IGF1ZGlvIHRyYW5zY29kaW5nIHJldHVybnMgTTRXQVJfTk9fTU9SRV9BVSIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50U3RlcEVuY29kaW5nKCk6IGF1ZGlvIHRyYW5zY29kaW5nIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIENoZWNrIGZvciBlbmQgY3V0ICovCi0gICAgICAgICAgICAvKiBXZSBhYnNvbHV0ZWx5IHdhbnQgdG8gaGF2ZSBsZXNzIG9yIHNhbWUgYXVkaW8gZHVyYXRpb24gYXMgdmlkZW8gLT4KLSAgICAgICAgICAgICgyKnBDLT5tX2F1ZGlvQVVEdXJhdGlvbikgKi8KLSAgICAgICAgICAgIGlmKCAoTTRPU0FfVUludDMyKXBDLT5SZWFkZXJBdWRpb0FVLm1fQ1RTCi0gICAgICAgICAgICAgICAgKyAoMiAqcEMtPm1fYXVkaW9BVUR1cmF0aW9uKSA+IHBDLT51aUVuZEN1dFRpbWUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDLT5BdWRpb1N0YXRlID0gTTRNQ1Nfa1N0cmVhbVN0YXRlX0ZJTklTSEVEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogLS0tLS0tLS0tLSBQUk9HUkVTUyBNQU5BR0VNRU5UIC0tLS0tLS0tLS0gKi8KLQotICAgIC8qKgotICAgICogQ29tcHV0ZSBwcm9ncmVzcyAqLwotICAgIGlmKCBwQy0+bm92aWRlbyApCi0gICAgewotICAgICAgICBpZiggcEMtPlJlYWRlckF1ZGlvQVUubV9DVFMgPCBwQy0+dWlCZWdpbkN1dFRpbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAqcFByb2dyZXNzID0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwUHJvZ3Jlc3MgPSAoTTRPU0FfVUludDgpKCggKCAoTTRPU0FfVUludDMyKXBDLT5SZWFkZXJBdWRpb0FVLm1fQ1RTCi0gICAgICAgICAgICAgICAgLSBwQy0+dWlCZWdpbkN1dFRpbWUpICogMTAwKQotICAgICAgICAgICAgICAgIC8gKHBDLT51aUVuZEN1dFRpbWUgLSBwQy0+dWlCZWdpbkN1dFRpbWUpKTsKLSAgICAgICAgfQotICAgICAgICAvL3ByaW50ZigiOiAlNi4wZlxiXGJcYlxiXGJcYlxiXGIiLCBwQy0+UmVhZGVyQXVkaW9BVS5tX0NUUyk7Ci0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYoIHBDLT5kVmlEZWNDdXJyZW50Q3RzIDwgcEMtPnVpQmVnaW5DdXRUaW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgKnBQcm9ncmVzcyA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAqcFByb2dyZXNzID0gKE00T1NBX1VJbnQ4KSgoICggKE00T1NBX1VJbnQzMilwQy0+ZFZpRGVjQ3VycmVudEN0cwotICAgICAgICAgICAgICAgIC0gcEMtPnVpQmVnaW5DdXRUaW1lKSAqIDEwMCkKLSAgICAgICAgICAgICAgICAvIChwQy0+dWlFbmRDdXRUaW1lIC0gcEMtPnVpQmVnaW5DdXRUaW1lKSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy9wcmludGYoIjogJTYuMGZcYlxiXGJcYlxiXGJcYlxiIiwgcEMtPmRWaURlY0N1cnJlbnRDdHMpOwotICAgIH0KLQotICAgIC8qKgotICAgICogU2FuaXR5IGNoZWNrICovCi0gICAgaWYoICpwUHJvZ3Jlc3MgPiA5OSApCi0gICAgewotICAgICAgICAqcFByb2dyZXNzID0gOTk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJbmNyZW1lbnQgQ1RTIGZvciBuZXh0IHN0ZXAgKi8KLSAgICBpZiggcEMtPm5vdmlkZW8gPT0gTTRPU0FfRkFMU0UgKQotICAgIHsKLSAgICAgICAgaWYoIHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0ID09IE00RU5DT0RFUl9rTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgcEMtPmRWaURlY0N1cnJlbnRDdHMgKz0gIDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+ZFZpRGVjQ3VycmVudEN0cyArPSBwQy0+ZEN0c0luY3JlbWVudDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogVGhlIHRyYW5zY29kaW5nIGlzIGZpbmlzaGVkIHdoZW4gbm8gc3RyZWFtIGlzIGJlaW5nIGVuY29kZWQgYW55bW9yZSAqLwotICAgIGlmKCAoICggcEMtPm5vdmlkZW8pIHx8IChNNE1DU19rU3RyZWFtU3RhdGVfRklOSVNIRUQgPT0gcEMtPlZpZGVvU3RhdGUpKQotICAgICAgICAmJiAoKCBwQy0+bm9hdWRpbykgfHwgKE00TUNTX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRCA9PSBwQy0+QXVkaW9TdGF0ZSkpICkKLSAgICB7Ci0gICAgICAgIC8qIHRoZSBBSVIgcGFydCBjYW4gb25seSBiZSB1c2VkIHdoZW4gdmlkZW8gY29kZWNzIGFyZSBjb21waWxlZCovCi0jaWZuZGVmIE00TUNTX0FVRElPT05MWQotICAgICAgICAvKiBjbGVhbiBBSVIgY29udGV4dCBuZWVkZWQgdG8ga2VlcCBtZWRpYSBhc3BlY3QgcmF0aW8qLwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5tX2Fpcl9jb250ZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRBSVJfY2xlYW5VcChwQy0+bV9haXJfY29udGV4dCk7Ci0KLSAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OiBFcnJvciB3aGVuIGNsZWFuaW5nIEFJUjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBDLT5tX2Fpcl9jb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0jZW5kaWYgLypNNE1DU19BVURJT09OTFkqLwotICAgICAgICAvKiovCi0KLSAgICAgICAgKnBQcm9ncmVzcyA9IDEwMDsKLSAgICAgICAgcEMtPlN0YXRlID0gTTRNQ1Nfa1N0YXRlX0ZJTklTSEVEOwotICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICJNNE1DU19pbnRTdGVwRW5jb2RpbmcoKTogdHJhbnNjb2RpbmcgZmluaXNoZWQsIHJldHVybmluZyBNNE1DU19XQVJfVFJBTlNDT0RJTkdfRE9ORSIpOwotICAgICAgICByZXR1cm4gTTRNQ1NfV0FSX1RSQU5TQ09ESU5HX0RPTkU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19pbnRTdGVwRW5jb2RpbmcoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50U3RlcEJlZ2luVmlkZW9KdW1wKE00TUNTX0ludGVybmFsQ29udGV4dCogcEMpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50U3RlcEJlZ2luVmlkZW9KdW1wKCBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX0ludDMyIGlDdHM7Ci0KLSAgICBpZiggcEMtPm5vdmlkZW8gKQotICAgIHsKLSAgICAgICAgcEMtPlN0YXRlID0gTTRNQ1Nfa1N0YXRlX0JFR0lOVklERU9ERUNPREU7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgIC8qKgotICAgICogSnVtcCB0byB0aGUgcHJldmlvdXMgUkFQIGluIHRoZSBjbGlwIChmaXJzdCBnZXQgdGhlIHRpbWUsIHRoZW4ganVtcCkgKi8KLSAgICBpQ3RzID0gKE00T1NBX0ludDMyKXBDLT5kVmlEZWNTdGFydGluZ0N0czsKLSAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RHZXRQcmV2UmFwVGltZShwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSwgJmlDdHMpOwotCi0gICAgaWYoIE00V0FSX1JFQURFUl9JTkZPUk1BVElPTl9OT1RfUFJFU0VOVCA9PSBlcnIgKQotICAgIHsKLSAgICAgICAgLyogTm8gUkFQIHRhYmxlLCBqdW1wIGJhY2t3YXJkIGFuZCBwcmVkZWNvZGUgKi8KLSAgICAgICAgaUN0cyA9IChNNE9TQV9JbnQzMilwQy0+ZFZpRGVjU3RhcnRpbmdDdHMgLSBNNE1DU19OT19TVFNTX0pVTVBfUE9JTlQ7Ci0KLSAgICAgICAgaWYoIGlDdHMgPCAwICkKLSAgICAgICAgICAgIGlDdHMgPSAwOwotICAgIH0KLSAgICBlbHNlIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRTdGVwQmVnaW5WaWRlb0p1bXA6IG1fcEZjdEdldFByZXZSYXBUaW1lIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKiArIENSTFY2Nzc1IC1ILjI2NCBUcmltbWluZyAqLwotCi0gICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJIMjY0VHJpbSApCi0gICAgewotCi0gICAgICAgIC8vIFNhdmUganVtcCB0aW1lIGZvciBzYWZldHksIHRoaXMgZml4IHNob3VsZCBiZSBnZW5lcmljCi0KLSAgICAgICAgTTRPU0FfSW50MzIgaUN0c09yaSA9IGlDdHM7Ci0KLQotICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RKdW1wKHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSwgJmlDdHMpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRTdGVwQmVnaW5WaWRlb0p1bXA6IG1fcEZjdEp1bXAoVikgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggcEMtPlJlYWRlclZpZGVvQVUxLm1fc3RydWN0U2l6ZSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEluaXRpYWxpemVzIGFuIGFjY2VzcyBVbml0ICovCi0gICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAmcEMtPlJlYWRlclZpZGVvQVUxKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX29wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QodmlkZW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdShwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cFJlYWRlclZpZGVvU3RyZWFtLAotICAgICAgICAgICAgICAgICZwQy0+UmVhZGVyVmlkZW9BVTEpOwotCi0gICAgICAgICAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcoKTogXAotICAgICAgICAgICAgICAgICAgICBtX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdSh2aWRlbykgcmV0dXJucyBNNFdBUl9OT19NT1JFX0FVIik7Ci0gICAgICAgICAgICAgICAgLyogVGhlIGF1ZGlvIHRyYW5zY29kaW5nIGlzIGZpbmlzaGVkICovCi0gICAgICAgICAgICAgICAgcEMtPlZpZGVvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfRklOSVNIRUQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nKCk6XAotICAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUodmlkZW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcEMtPlJlYWRlclZpZGVvQVUxLm1fc3RydWN0U2l6ZSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBIMjY0TUNTX1Byb2Nlc3NTUFNfUFBTKHBDLT5tX3BJbnN0YW5jZSwKLSAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKXBDLT5SZWFkZXJWaWRlb0FVMS5tX2RhdGFBZGRyZXNzLCBwQy0+UmVhZGVyVmlkZW9BVTEubV9zaXplKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50U3RlcEJlZ2luVmlkZW9KdW1wOiBIMjY0TUNTX1Byb2Nlc3NTUFNfUFBTIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLQotICAgICAgICAvLyBSZXN0b3JlIGp1bXAgdGltZSBmb3Igc2FmZXR5LCB0aGlzIGZpeCBzaG91bGQgYmUgZ2VuZXJpYwotCi0gICAgICAgIGlDdHMgPSBpQ3RzT3JpOwotCi0KLSAgICB9Ci0gICAgLyogLSBDUkxWNjc3NSAtSC4yNjQgVHJpbW1pbmcgKi8KLQotICAgIC8qKgotICAgICogRGVjb2RlIG9uZSBzdGVwICovCi0gICAgcEMtPmRWaURlY0N1cnJlbnRDdHMgPSAoTTRPU0FfRG91YmxlKShpQ3RzICsgcEMtPmlWaWRlb0JlZ2luRGVjSW5jcik7Ci0KLSAgICAvKioKLSAgICAqIEJlIHN1cmUgd2UgZG9uJ3QgZGVjb2RlIHRvbyBmYXIgKi8KLSAgICBpZiggcEMtPmRWaURlY0N1cnJlbnRDdHMgPiBwQy0+ZFZpRGVjU3RhcnRpbmdDdHMgKQotICAgIHsKLSAgICAgICAgcEMtPmRWaURlY0N1cnJlbnRDdHMgPSBwQy0+ZFZpRGVjU3RhcnRpbmdDdHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBEZWNvZGUgYXQgbGVhc3Qgb25jZSB3aXRoIHRoZSBiSnVtcCBmbGFnIHRvIHRydWUgKi8KLSAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwRGVjb2RlVmlkZW9VcFRvQ3RzOiBEZWNvZGluZyB1cFRvIENUUyAlLjNmIiwKLSAgICAgICAgcEMtPmRWaURlY0N1cnJlbnRDdHMpOwotICAgIHBDLT5pc1JlbmRlckR1cCA9IE00T1NBX0ZBTFNFOwotICAgIGVyciA9Ci0gICAgICAgIHBDLT5tX3BWaWRlb0RlY29kZXItPm1fcEZjdERlY29kZShwQy0+cFZpRGVjQ3R4dCwgJnBDLT5kVmlEZWNDdXJyZW50Q3RzLAotICAgICAgICBNNE9TQV9UUlVFLCAwKTsKLQotICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSAmJiAoTTRXQVJfTk9fTU9SRV9BVSAhPSBlcnIpCi0gICAgICAgICYmIChlcnIgIT0gTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUUpICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludFN0ZXBCZWdpblZpZGVvSnVtcDogbV9wRmN0RGVjb2RlIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmKCBlcnIgPT0gTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIkRlY29kaW5nIG91dHB1dCB0aGUgc2FtZSBmcmFtZSBhcyBiZWZvcmUgMSIpOwotICAgICAgICBwQy0+aXNSZW5kZXJEdXAgPSBNNE9TQV9UUlVFOwotICAgIH0KLQotICAgIC8qKgotICAgICogSW5jcmVtZW50IGRlY29kaW5nIGN0cyBmb3IgdGhlIG5leHQgc3RlcCAqLwotICAgIHBDLT5kVmlEZWNDdXJyZW50Q3RzICs9IChNNE9TQV9Eb3VibGUpcEMtPmlWaWRlb0JlZ2luRGVjSW5jcjsKLQotICAgIC8qKgotICAgICogVXBkYXRlIHN0YXRlIGF1dG9tYXRvbiAqLwotICAgIGlmKCBwQy0+ZFZpRGVjQ3VycmVudEN0cyA+IHBDLT5kVmlEZWNTdGFydGluZ0N0cyApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBCZSBzdXJlIHdlIGRvbid0IGRlY29kZSB0b28gZmFyICovCi0gICAgICAgIHBDLT5kVmlEZWNDdXJyZW50Q3RzID0gcEMtPmRWaURlY1N0YXJ0aW5nQ3RzOwotICAgICAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfUFJPQ0VTU0lORzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEMtPlN0YXRlID0gTTRNQ1Nfa1N0YXRlX0JFR0lOVklERU9ERUNPREU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19pbnRTdGVwQmVnaW5WaWRlb0p1bXAoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50U3RlcEJlZ2luVmlkZW9EZWNvZGUoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQykKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRTdGVwQmVnaW5WaWRlb0RlY29kZSggTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNF9NZWRpYVRpbWUgZERlY1RhcmdldDsKLQotICAgIGlmKCBwQy0+bm92aWRlbyApCi0gICAgewotICAgICAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfUFJPQ0VTU0lORzsKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBEZWNvZGUgKi8KLSAgICBkRGVjVGFyZ2V0ID0gcEMtPmRWaURlY0N1cnJlbnRDdHM7Ci0gICAgTTRPU0FfVFJBQ0UzXzEoIk00TUNTX2ludFN0ZXBCZWdpbkRlY29kZTogRGVjb2RpbmcgdXBUbyBDVFMgJS4zZiIsCi0gICAgICAgIHBDLT5kVmlEZWNDdXJyZW50Q3RzKTsKLSAgICBwQy0+aXNSZW5kZXJEdXAgPSBNNE9TQV9GQUxTRTsKLSAgICBlcnIgPSBwQy0+bV9wVmlkZW9EZWNvZGVyLT5tX3BGY3REZWNvZGUocEMtPnBWaURlY0N0eHQsICZkRGVjVGFyZ2V0LAotICAgICAgICBNNE9TQV9GQUxTRSwgMCk7Ci0KLSAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikgJiYgKE00V0FSX05PX01PUkVfQVUgIT0gZXJyKQotICAgICAgICAmJiAoZXJyICE9IE00V0FSX1ZJREVPUkVOREVSRVJfTk9fTkVXX0ZSQU1FKSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRTdGVwQmVnaW5WaWRlb0RlY29kZTogbV9wRmN0RGVjb2RlIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmKCBlcnIgPT0gTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIkRlY29kaW5nIG91dHB1dCB0aGUgc2FtZSBmcmFtZSBhcyBiZWZvcmUgMiIpOwotICAgICAgICBwQy0+aXNSZW5kZXJEdXAgPSBNNE9TQV9UUlVFOwotICAgIH0KLQotICAgIC8qKgotICAgICogSW5jcmVtZW50IGRlY29kaW5nIGN0cyBmb3IgdGhlIG5leHQgc3RlcCAqLwotICAgIHBDLT5kVmlEZWNDdXJyZW50Q3RzICs9IChNNE9TQV9Eb3VibGUpcEMtPmlWaWRlb0JlZ2luRGVjSW5jcjsKLQotICAgIC8qKgotICAgICogVXBkYXRlIHN0YXRlIGF1dG9tYXRvbiwgaWYgbmVlZGVkICovCi0gICAgaWYoICggKE00T1NBX1VJbnQzMilwQy0+ZFZpRGVjQ3VycmVudEN0cyA+IHBDLT5kVmlEZWNTdGFydGluZ0N0cykKLSAgICAgICAgfHwgKE00V0FSX05PX01PUkVfQVUgPT0gZXJyKSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBCZSBzdXJlIHdlIGRvbid0IGRlY29kZSB0b28gZmFyICovCi0gICAgICAgIHBDLT5kVmlEZWNDdXJyZW50Q3RzID0gKE00T1NBX0RvdWJsZSlwQy0+ZFZpRGVjU3RhcnRpbmdDdHM7Ci0gICAgICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9QUk9DRVNTSU5HOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfaW50U3RlcEJlZ2luVmlkZW9EZWNvZGUoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogZGVmaW5lIEFNUiBzaWxlbmNlIGZyYW1lcyAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfU0laRSAxMwotI2RlZmluZSBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X0RVUkFUSU9OIDE2MAotCi0jaWZkZWYgTTRWU1MzR1BQX1NJTEVOQ0VfRlJBTUVTCi0KLWNvbnN0IE00T1NBX1VJbnQ4IE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhbCi0gICAgTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFXSA9Ci0gICAgewotICAgICAgICAweDA0LCAweEZGLCAweDE4LCAweEM3LCAweEYwLCAweDBELCAweDA0LCAweDMzLCAweEZGLCAweEUwLCAweDAwLCAweDAwLCAweDAwCi0gICAgfTsKLSNlbHNlCi0KLWV4dGVybgotY29uc3QKLU00T1NBX1VJbnQ4Ci1NNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4W000VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfU0laRV07Ci0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBkZWZpbmUgQUFDIHNpbGVuY2UgZnJhbWVzICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX01PTk9fU0laRSAgICAgIDQKLQotI2lmZGVmIE00VlNTM0dQUF9TSUxFTkNFX0ZSQU1FUwotCi1jb25zdCBNNE9TQV9VSW50OCBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OT1sKLSAgICBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OT19TSVpFXSA9Ci0gICAgewotICAgICAgICAweDAwLCAweEM4LCAweDIwLCAweDA3Ci0gICAgfTsKLSNlbHNlCi0KLWV4dGVybiBjb25zdCBNNE9TQV9VSW50OAotTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX01PTk9bTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX01PTk9fU0laRV07Ci0KLSNlbmRpZgotCi0jZGVmaW5lIE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU9fU0laRSAgICAgICAgNgotCi0jaWZkZWYgTTRWU1MzR1BQX1NJTEVOQ0VfRlJBTUVTCi0KLWNvbnN0IE00T1NBX1VJbnQ4IE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU9bCi0gICAgTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX1NURVJFT19TSVpFXSA9Ci0gICAgewotICAgICAgICAweDIxLCAweDEwLCAweDAzLCAweDIwLCAweDU0LCAweDFDCi0gICAgfTsKLSNlbHNlCi0KLWV4dGVybiBjb25zdAotTTRPU0FfVUludDgKLU00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU9bTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX1NURVJFT19TSVpFXTsKLQotI2VuZGlmCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2ludEF1ZGlvTnVsbEVuY29kaW5nKE00TUNTX0ludGVybmFsQ29udGV4dCogcEMpCi0gKiBAcmV0dXJuICAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50QXVkaW9OdWxsRW5jb2RpbmcoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBpZiggcEMtPm5vYXVkaW8gKQotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLQotICAgIC8qIENoZWNrIGlmIGFsbCBhdWRpbyBmcmFtZSBoYXMgYmVlbiB3cml0dGVuIChoYXBwZW5zIGF0IGJlZ2luIGN1dCkgKi8KLSAgICBpZiggcEMtPlJlYWRlckF1ZGlvQVUubV9zaXplID09IDAgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogSW5pdGlhbGl6ZXMgYSBuZXcgQVUgaWYgbmVlZGVkICovCi0gICAgICAgIGlmKCBwQy0+UmVhZGVyQXVkaW9BVTEubV9zdHJ1Y3RTaXplID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogSW5pdGlhbGl6ZXMgYW4gYWNjZXNzIFVuaXQgKi8KLSAgICAgICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdEZpbGxBdVN0cnVjdChwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgICAgICZwQy0+UmVhZGVyQXVkaW9BVTEpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfb3BlbigpOiBtX3BSZWFkZXItPm1fcEZjdEZpbGxBdVN0cnVjdChhdWRpbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwQy0+bV9wRGF0YUFkZHJlc3MxID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBDLT5SZWFkZXJBdWRpb0FVMS5tX21heHNpemUsCi0gICAgICAgICAgICAgICAgTTRNQ1MsIChNNE9TQV9DaGFyICopIlRlbXBvcmFyeSBBVTEgYnVmZmVyIik7Ci0KLSAgICAgICAgICAgIGlmKCBwQy0+bV9wRGF0YUFkZHJlc3MxID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9OdWxsRW5jb2RpbmcoKTogYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyQXVkaW9TdHJlYW0sCi0gICAgICAgICAgICAgICAgJnBDLT5SZWFkZXJBdWRpb0FVMSk7Ci0KLSAgICAgICAgICAgIGlmKCBNNFdBUl9OT19NT1JFX0FVID09IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRBdWRpb051bGxFbmNvZGluZygpOlwKLSAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KGF1ZGlvKSByZXR1cm5zIE00V0FSX05PX01PUkVfQVUiKTsKLSAgICAgICAgICAgICAgICAvKiBUaGUgYXVkaW8gdHJhbnNjb2RpbmcgaXMgZmluaXNoZWQgKi8KLSAgICAgICAgICAgICAgICBwQy0+QXVkaW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9OdWxsRW5jb2RpbmcoKTogXAotICAgICAgICAgICAgICAgICAgICBtX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdShBdWRpbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLypGQiAyMDA5LjA0LjAyOiBQUiBzdXJueHAjNjE2OiBDcmFzaCBpbiBNQ1Mgd2hpbGUgQXVkaW8gQVUgY29weWluZyAsCi0gICAgICAgICAgICAgY29uc3RhbnQgbWVtb3J5IHJlYWRlciBjYXNlKi8KLSAgICAgICAgICAgIGlmKCBwQy0+UmVhZGVyQXVkaW9BVTEubV9tYXhzaXplCi0gICAgICAgID4gcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIENvbnN0YW50IG1lbW9yeSByZWFkZXIgY2FzZSwgd2UgbmVlZCB0byByZWFsbG9jYXRlIHRoZSB0ZW1wb3JhcnkgYnVmZmVycyAqLwotICAgICAgICAgICAgICAgIE00TUNTX2ludFJlYWxsb2NUZW1wb3JhcnlBVSgoTTRPU0FfTWVtQWRkcjgKLSAgICAgICAgICAgICAgICAgICAgKikgJihwQy0+bV9wRGF0YUFkZHJlc3MxKSwgcEMtPlJlYWRlckF1ZGlvQVUxLm1fbWF4c2l6ZSk7Ci0gICAgICAgICAgICAgICAgLyogcEMtPm1fcERhdGFBZGRyZXNzMSBhbmQKLSAgICAgICAgICAgICAgICBwQy0+bV9wRGF0YUFkZHJlc3MyIG11c3QgYmUgcmVhbGxvY2F0ZWQgYXQgdGhlIHNhbWUgdGltZSAqLwotICAgICAgICAgICAgICAgIC8qIGJlY2F1c2UgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUgdGFrZQotICAgICAgICAgICAgICAgICBtYXhpbXVtIHZhbHVlLiBUaGVuIHRoZSB0ZXN0ICJpZihwQy0+UmVhZGVyQXVkaW9BVT8ubV9tYXhzaXplID4KLSAgICAgICAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplKSIgaXMgbmV2ZXIgdHJ1ZSAqLwotICAgICAgICAgICAgICAgIC8qIGFuZCB0aGUgc2l6ZSBvZiB0aGUgc2Vjb25kIGJ1ZmZlciBpcyBuZXZlciBjaGFuZ2VkLiAqLwotICAgICAgICAgICAgICAgIE00TUNTX2ludFJlYWxsb2NUZW1wb3JhcnlBVSgoTTRPU0FfTWVtQWRkcjgKLSAgICAgICAgICAgICAgICAgICAgKikgJihwQy0+bV9wRGF0YUFkZHJlc3MyKSwgcEMtPlJlYWRlckF1ZGlvQVUxLm1fbWF4c2l6ZSk7Ci0gICAgICAgICAgICAgICAgLyogcEMtPm1fcERhdGFBZGRyZXNzMSBhbmQKLSAgICAgICAgICAgICAgICBwQy0+bV9wRGF0YUFkZHJlc3MyIG11c3QgYmUgcmVhbGxvY2F0ZWQgYXQgdGhlIHNhbWUgdGltZSAqLwotICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBzdHJlYW0gcHJvcGVydGllcyAqLwotICAgICAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgcEMtPlJlYWRlckF1ZGlvQVUxLm1fbWF4c2l6ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5tX3BEYXRhQWRkcmVzczEsCi0gICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+UmVhZGVyQXVkaW9BVTEubV9kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVTEubV9zaXplKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBwQy0+UmVhZGVyQXVkaW9BVTIubV9zdHJ1Y3RTaXplID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogSW5pdGlhbGl6ZXMgYW4gYWNjZXNzIFVuaXQgKi8KLSAgICAgICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdEZpbGxBdVN0cnVjdChwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgICAgICZwQy0+UmVhZGVyQXVkaW9BVTIpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfb3BlbigpOiBtX3BSZWFkZXItPm1fcEZjdEZpbGxBdVN0cnVjdChhdWRpbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEMtPm1fcERhdGFBZGRyZXNzMiA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+UmVhZGVyQXVkaW9BVTIubV9tYXhzaXplLAotICAgICAgICAgICAgICAgIE00TUNTLCAoTTRPU0FfQ2hhciAqKSJUZW1wb3JhcnkgQVUgYnVmZmVyIik7Ci0KLSAgICAgICAgICAgIGlmKCBwQy0+bV9wRGF0YUFkZHJlc3MyID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9OdWxsRW5jb2RpbmcoKTogYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgKiBSZWFkIHRoZSBuZXh0IGF1ZGlvIEFVIGluIHRoZSBpbnB1dCBmaWxlICovCi0gICAgICAgIGlmKCBwQy0+UmVhZGVyQXVkaW9BVTIubV9DVFMgPiBwQy0+UmVhZGVyQXVkaW9BVTEubV9DVFMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKikgJnBDLT5SZWFkZXJBdWRpb0FVLAotICAgICAgICAgICAgICAgICh2b2lkICopICZwQy0+UmVhZGVyQXVkaW9BVTIsIHNpemVvZihNNF9BY2Nlc3NVbml0KSk7Ci0gICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAmcEMtPlJlYWRlckF1ZGlvQVUxKTsKLQotICAgICAgICAgICAgaWYoIHBDLT5SZWFkZXJBdWRpb0FVMS5tX21heHNpemUKLSAgICAgICAgICAgICAgICA+IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBDb25zdGFudCBtZW1vcnkgcmVhZGVyIGNhc2UsIHdlIG5lZWQgdG8gcmVhbGxvY2F0ZSB0aGUgdGVtcG9yYXJ5IGJ1ZmZlcnMgKi8KLSAgICAgICAgICAgICAgICBNNE1DU19pbnRSZWFsbG9jVGVtcG9yYXJ5QVUoKE00T1NBX01lbUFkZHI4Ci0gICAgICAgICAgICAgICAgICAgICopICYocEMtPm1fcERhdGFBZGRyZXNzMSksIHBDLT5SZWFkZXJBdWRpb0FVMS5tX21heHNpemUpOwotICAgICAgICAgICAgICAgIC8qICAgcEMtPm1fcERhdGFBZGRyZXNzMQotICAgICAgICAgICAgICAgICAqIGFuZCBwQy0+bV9wRGF0YUFkZHJlc3MyIG11c3QgYmUgcmVhbGxvY2F0ZWQgYXQgdGhlIHNhbWUgdGltZSAqCi0gICAgICAgICAgICAgICAgICogYmVjYXVzZSBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSB0YWtlCi0gICAgICAgICAgICAgICAgICogbWF4aW11bSB2YWx1ZS4gVGhlbiB0aGUgdGVzdCAiaWYocEMtPlJlYWRlckF1ZGlvQVU/Lm1fbWF4c2l6ZSA+Ci0gICAgICAgICAgICAgICAgICogcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUpIiBpcyBuZXZlciB0cnVlICoKLSAgICAgICAgICAgICAgICAgKiBhbmQgdGhlIHNpemUgb2YgdGhlIHNlY29uZCBidWZmZXIgaXMgbmV2ZXIgY2hhbmdlZC4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBNNE1DU19pbnRSZWFsbG9jVGVtcG9yYXJ5QVUoKE00T1NBX01lbUFkZHI4Ci0gICAgICAgICAgICAgICAgICAgICopICYocEMtPm1fcERhdGFBZGRyZXNzMiksIHBDLT5SZWFkZXJBdWRpb0FVMS5tX21heHNpemUpOwotICAgICAgICAgICAgICAgIC8qIHBDLT5tX3BEYXRhQWRkcmVzczEgYW5kCi0gICAgICAgICAgICAgICAgICogcEMtPm1fcERhdGFBZGRyZXNzMiBtdXN0IGJlIHJlYWxsb2NhdGVkIGF0IHRoZSBzYW1lIHRpbWUKLSAgICAgICAgICAgICAgICAgKiBVcGRhdGUgc3RyZWFtIHByb3BlcnRpZXMKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVMS5tX21heHNpemU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiovCi0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+bV9wRGF0YUFkZHJlc3MxLAotICAgICAgICAgICAgICAgICh2b2lkICopcEMtPlJlYWRlckF1ZGlvQVUxLm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgcEMtPlJlYWRlckF1ZGlvQVUxLm1fc2l6ZSk7Ci0gICAgICAgICAgICBwQy0+bV9hdWRpb0FVRHVyYXRpb24gPQotICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVMS5tX0NUUyAtIHBDLT5SZWFkZXJBdWRpb0FVMi5tX0NUUzsKLSAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVLm1fZGF0YUFkZHJlc3MgPSBwQy0+bV9wRGF0YUFkZHJlc3MyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopICZwQy0+UmVhZGVyQXVkaW9BVSwKLSAgICAgICAgICAgICAgICAodm9pZCAqKSAmcEMtPlJlYWRlckF1ZGlvQVUxLCBzaXplb2YoTTRfQWNjZXNzVW5pdCkpOwotICAgICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyQXVkaW9TdHJlYW0sCi0gICAgICAgICAgICAgICAgJnBDLT5SZWFkZXJBdWRpb0FVMik7Ci0gICAgICAgICAgICAvKiBDcmFzaCBpbiBNQ1Mgd2hpbGUgQXVkaW8gQVUgY29weWluZyAsCi0gICAgICAgICAgICAgKiBjb25zdGFudCBtZW1vcnkgcmVhZGVyIGNhc2UKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYoIHBDLT5SZWFkZXJBdWRpb0FVMi5tX21heHNpemUKLSAgICAgICAgICAgICAgICA+IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBDb25zdGFudCBtZW1vcnkgcmVhZGVyIGNhc2UsIHdlIG5lZWQgdG8gcmVhbGxvY2F0ZSB0aGUgdGVtcG9yYXJ5IGJ1ZmZlcnMgKi8KLSAgICAgICAgICAgICAgICBNNE1DU19pbnRSZWFsbG9jVGVtcG9yYXJ5QVUoKE00T1NBX01lbUFkZHI4Ci0gICAgICAgICAgICAgICAgICAgICopICYocEMtPm1fcERhdGFBZGRyZXNzMiksIHBDLT5SZWFkZXJBdWRpb0FVMi5tX21heHNpemUpOwotICAgICAgICAgICAgICAgIC8qIHBDLT5tX3BEYXRhQWRkcmVzczEgYW5kCi0gICAgICAgICAgICAgICAgICogcEMtPm1fcERhdGFBZGRyZXNzMiBtdXN0IGJlIHJlYWxsb2NhdGVkIGF0IHRoZSBzYW1lIHRpbWUKLSAgICAgICAgICAgICAgICAgKiBiZWNhdXNlIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplIHRha2UgbWF4aW11bQotICAgICAgICAgICAgICAgICAqIHZhbHVlLiBUaGVuIHRoZSB0ZXN0ICJpZihwQy0+UmVhZGVyQXVkaW9BVT8ubV9tYXhzaXplID4gcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICogbV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUpIiBpcyBuZXZlciB0cnVlCi0gICAgICAgICAgICAgICAgICogYW5kIHRoZSBzaXplIG9mIHRoZSBzZWNvbmQgYnVmZmVyIGlzIG5ldmVyIGNoYW5nZWQuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgTTRNQ1NfaW50UmVhbGxvY1RlbXBvcmFyeUFVKChNNE9TQV9NZW1BZGRyOAotICAgICAgICAgICAgICAgICAgICAqKSAmKHBDLT5tX3BEYXRhQWRkcmVzczEpLCBwQy0+UmVhZGVyQXVkaW9BVTIubV9tYXhzaXplKTsKLSAgICAgICAgICAgICAgICAvKiBbIEVORCBdIDIwMDkxMDA4ICBKRlYgUFIgZml4IHN1cm54cHN3IzEwNzE6IHBDLT5tX3BEYXRhQWRkcmVzczEgYW5kCi0gICAgICAgICAgICAgICAgIHBDLT5tX3BEYXRhQWRkcmVzczIgbXVzdCBiZSByZWFsbG9jYXRlZCBhdCB0aGUgc2FtZSB0aW1lICovCi0gICAgICAgICAgICAgICAgLyogVXBkYXRlIHN0cmVhbSBwcm9wZXJ0aWVzICovCi0gICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUgPQotICAgICAgICAgICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVTIubV9tYXhzaXplOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPm1fcERhdGFBZGRyZXNzMiwKLSAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5SZWFkZXJBdWRpb0FVMi5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVMi5tX3NpemUpOwotICAgICAgICAgICAgcEMtPm1fYXVkaW9BVUR1cmF0aW9uID0KLSAgICAgICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVTIubV9DVFMgLSBwQy0+UmVhZGVyQXVkaW9BVTEubV9DVFM7Ci0gICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVS5tX2RhdGFBZGRyZXNzID0gcEMtPm1fcERhdGFBZGRyZXNzMTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBNNFdBUl9OT19NT1JFX0FVID09IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRBdWRpb051bGxFbmNvZGluZygpOiBcCi0gICAgICAgICAgICAgICAgbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUoYXVkaW8pIHJldHVybnMgTTRXQVJfTk9fTU9SRV9BVSIpOwotICAgICAgICAgICAgLyogVGhlIGF1ZGlvIHRyYW5zY29kaW5nIGlzIGZpbmlzaGVkICovCi0gICAgICAgICAgICBwQy0+QXVkaW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9OdWxsRW5jb2RpbmcoKTogXAotICAgICAgICAgICAgICAgIG1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KEF1ZGlvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBQcmVwYXJlIHRoZSB3cml0ZXIgQVUgKi8KLSAgICBlcnIgPSBwQy0+cFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShwQy0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00TUNTX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsICZwQy0+V3JpdGVyQXVkaW9BVSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9OdWxsRW5jb2RpbmcoKTogcFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShBdWRpbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYoIHBDLT51aUF1ZGlvQVVDb3VudAotICAgICAgICA9PSAwICkgLyogSWYgaXQgaXMgdGhlIGZpcnN0IEFVLCB3ZSBzZXQgaXQgdG8gc2lsZW5jZQotICAgICAgICAoZWxzZSwgZXJyb3JzIDB4Mzg0MSwgMHgzODQ3IGluIG91ciBBQUMgZGVjb2RlcikgKi8KLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0FBQwotICAgICAgICAgICAgfHwgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rQUFDcGx1cwotICAgICAgICAgICAgfHwgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rZUFBQ3BsdXMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlOYkNoYW5uZWxzID09IDEgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLnNpemUgPSBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OT19TSVpFOwotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKU00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05PLAotICAgICAgICAgICAgICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5zaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyA9PSAyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5zaXplID0gTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX1NURVJFT19TSVpFOwotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKU00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU8sCi0gICAgICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLnNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIE11c3QgbmV2ZXIgaGFwcGVuIC4uLiovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRBdWRpb051bGxFbmNvZGluZzogQmFkIG51bWJlciBvZiBjaGFubmVscyBpbiBhdWRpbyBpbnB1dCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfSU5WQUxJRF9JTlBVVF9GSUxFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0FNUl9OQiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLnNpemUgPSBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkU7Ci0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+V3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAodm9pZCAqKU00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDgsCi0gICAgICAgICAgICAgICAgcEMtPldyaXRlckF1ZGlvQVUuc2l6ZSk7Ci0gICAgICAgICAgICAvKiBTb21lIHJlbWFpbmluZyBBTVIgQVUgbmVlZHMgdG8gYmUgY29waWVkICovCi0gICAgICAgICAgICBpZiggcEMtPlJlYWRlckF1ZGlvQVUubV9zaXplICE9IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBXcml0ZXIgQVUgKi8KLSAgICAgICAgICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5zaXplICs9IHBDLT5SZWFkZXJBdWRpb0FVLm1fc2l6ZTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKikocEMtPldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3MKLSAgICAgICAgICAgICAgICAgICAgKyBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkUpLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5SZWFkZXJBdWRpb0FVLm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVLm1fc2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKk1QMyBjYXNlOiBjb3B5IHRoZSBBVSovCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9OdWxsRW5jb2RpbmcoKTogQ29weWluZyBhdWRpbyBBVTogc2l6ZT0lZCIsCi0gICAgICAgICAgICAgICAgcEMtPlJlYWRlckF1ZGlvQVUubV9zaXplKTsKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICh2b2lkICopcEMtPlJlYWRlckF1ZGlvQVUubV9kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVS5tX3NpemUpOwotICAgICAgICAgICAgcEMtPldyaXRlckF1ZGlvQVUuc2l6ZSA9IHBDLT5SZWFkZXJBdWRpb0FVLm1fc2l6ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDb3B5IGF1ZGlvIGRhdGEgZnJvbSByZWFkZXIgQVUgdG8gd3JpdGVyIEFVICovCi0gICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgIk00TUNTX2ludEF1ZGlvTnVsbEVuY29kaW5nKCk6IENvcHlpbmcgYXVkaW8gQVU6IHNpemU9JWQiLAotICAgICAgICAgICAgcEMtPlJlYWRlckF1ZGlvQVUubV9zaXplKTsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAodm9pZCAqKXBDLT5SZWFkZXJBdWRpb0FVLm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVS5tX3NpemUpOwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5zaXplID0gcEMtPlJlYWRlckF1ZGlvQVUubV9zaXplOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ29udmVydCBDVFMgdW5pdCBmcm9tIG1pbGxpc2Vjb25kcyB0byB0aW1lc2NhbGUgKi8KLSAgICBwQy0+V3JpdGVyQXVkaW9BVS5DVFMgPQotICAgICAgICAoTTRPU0FfVGltZSkoKCggcEMtPlJlYWRlckF1ZGlvQVUubV9DVFMgLSBwQy0+aUF1ZGlvQ3RzT2Zmc2V0KQotICAgICAgICAqIChwQy0+V3JpdGVyQXVkaW9TdHJlYW0udGltZVNjYWxlIC8gMTAwMC4wKSkpOwotCi0gICAgaWYoIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rQU1SX05CCi0gICAgICAgICYmIHBDLT51aUF1ZGlvQVVDb3VudCA9PSAwICkKLSAgICB7Ci0gICAgICAgIHBDLT5pQXVkaW9DdHNPZmZzZXQgLT0KLSAgICAgICAgICAgIDIwOyAvKiBEdXJhdGlvbiBvZiBhIHNpbGVuY2UgQU1SIEFVLCB0byBoYW5kbGUgdGhlIGR1cmF0aW9uIG9mIHRoZSBhZGRlZAotICAgICAgICAgICAgICAgIHNpbGVuY2UgZnJhbWUgKi8KLSAgICB9Ci0gICAgcEMtPldyaXRlckF1ZGlvQVUubmJGcmFnID0gMDsKLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRNQ1NfaW50QXVkaW9OdWxsRW5jb2RpbmcoKTogYXVkaW8gQVU6IENUUz0lZCBtcyIsCi0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLkNUUyk7Ci0KLSAgICAvKioKLSAgICAqIFdyaXRlIGl0IHRvIHRoZSBvdXRwdXQgZmlsZSAqLwotICAgIHBDLT51aUF1ZGlvQVVDb3VudCsrOwotICAgIGVyciA9IHBDLT5wV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUocEMtPnBXcml0ZXJDb250ZXh0LAotICAgICAgICBNNE1DU19XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPldyaXRlckF1ZGlvQVUpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludEF1ZGlvTnVsbEVuY29kaW5nKCk6IHBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVShBdWRpbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyogQWxsIHRoZSBhdWRpbyBoYXMgYmVlbiB3cml0dGVuICovCi0gICAgcEMtPlJlYWRlckF1ZGlvQVUubV9zaXplID0gMDsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfaW50QXVkaW9OdWxsRW5jb2RpbmcoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgSW5pdCBBdWRpbyBUcmFuc2NvZGluZwotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRBdWRpb1RyYW5zY29kaW5nKCBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgR2VuZXJhbCBlcnJvciAqLwotCi0gICAgTTRPU0FfVUludDMyCi0gICAgICAgIHVpQnl0ZXNEZWM7IC8qKjwgTmIgb2YgYnl0ZXMgYXZhaWxhYmxlIGluIHRoZSBkZWNvZGVyIE9VVCBidWZmZXIgKi8KLSAgICBNNE9TQV9VSW50MzIKLSAgICAgICAgdWlEZWNvZGVyMlNzcmNfTmJCeXRlczsgLyoqPCBOYiBvZiBieXRlcyBjb3BpZWQgaW50byB0aGUgc3NyYyBJTiBidWZmZXIgKi8KLQotICAgIGludCBzc3JjRXJyOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBFcnJvciB3aGlsZSBzc3JjIHByb2Nlc3NpbmcgKi8KLSAgICBNNE9TQV9VSW50MzIgdWlTc3JjSW5TaXplOyAvKio8IFNpemUgaW4gYnl0ZXMgb2Ygc3NyYyBpbnRwdXQgYnVmZmVyICovCi0gICAgTTRPU0FfVUludDMyCi0gICAgICAgIHVpU3NyY0luUm9vbTsgLyoqPCBOYiBvZiBieXRlcyBhdmFpbGFibGUgaW4gdGhlIHNzcmMgSU4gYnVmZmVyICovCi0gICAgTTRPU0FfTWVtQWRkcjgKLSAgICAgICAgcFNzcmNJbnB1dDsgLyoqPCBQb2ludGVyIHRvIHRoZSBnb29kIGJ1ZmZlciBsb2NhdGlvbiBmb3Igc3NyYyBpbnB1dCAqLwotICAgIE00T1NBX1VJbnQzMiB1aVNzcmNPdXRTaXplOyAvKio8IFNpemUgaW4gYnl0ZXMgb2Ygc3NyYyBvdXRwdXQgYnVmZmVyICovCi0gICAgTTRPU0FfVUludDMyCi0gICAgICAgIHVpQnl0ZXNTc3JjOyAvKio8IE5iIG9mIGJ5dGVzIGF2YWlsYWJsZSBpbiB0aGUgc3NyYyBPVVQgYnVmZmVyICovCi0KLSAgICBNNE9TQV9VSW50OAotICAgICAgICBuZWVkQ2hhbm5lbENvbnZlcnNpb247IC8qKjwgRmxhZyB0byBpbmRpY2F0ZSBpZiBhIHN0ZXJlbyA8LT4gbW9ubyBjb252ZXJzaW9uIGlzIG5lZWRlZCAqLwotICAgIE00T1NBX1VJbnQzMgotICAgICAgICB1aUNoYW5uZWxDb252ZXJ0b3JDb2VmZjsgLyoqPCBNdWx0aXBsaWNhdGl2ZSBjb2VmZmljaWVudCBpZiBzdGVyZW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwtPiBtb25vIGNvbnZlcnNpb24gaXMgYXBwbGllZCAqLwotICAgIE00T1NBX01lbUFkZHI4IHBDaGFubmVsQ29udmVydG9ySW5wdXQgPQotICAgICAgICBNNE9TQV9OVUxMOyAvKio8IFBvaW50ZXIgdG8gdGhlIGdvb2QgYnVmZmVyIGxvY2F0aW9uIGZvciBjaGFubmVsIGNvbnZlcnRvciBpbnB1dCAqLwotICAgIE00T1NBX1VJbnQzMiB1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgPQotICAgICAgICAwOyAvKio8IE5iIG9mIHBjbSBzYW1wbGVzIHRvIGNvbnZlcnQgaW4gY2hhbm5lbCBjb252ZXJ0b3IgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCBwQ2hhbm5lbENvbnZlcnRvck91dHB1dCA9Ci0gICAgICAgIE00T1NBX05VTEw7IC8qKjwgUG9pbnRlciB0byB0aGUgZ29vZCBidWZmZXIgbG9jYXRpb24gZm9yIGNoYW5uZWwgY29udmVydG9yIG91dHB1dCAqLwotCi0gICAgTTRPU0FfVGltZQotICAgICAgICBmcmFtZVRpbWVEZWx0YTsgLyoqPCBEdXJhdGlvbiBvZiB0aGUgZW5jb2RlZCAodGhlbiB3cml0dGVuKSBkYXRhICovCi0gICAgTTRPU0FfVUludDMyCi0gICAgICAgIHVpRW5jb2RlckluUm9vbTsgLyoqPCBOYiBvZiBieXRlcyBhdmFpbGFibGUgaW4gdGhlIGVuY29kZXIgSU4gYnVmZmVyICovCi0gICAgTTRPU0FfVUludDMyCi0gICAgICAgIHVpU3NyYzJFbmNvZGVyX05iQnl0ZXM7IC8qKjwgTmIgb2YgYnl0ZXMgY29waWVkIGZyb20gdGhlIHNzcmMgT1VUIGJ1ZmZlciAqLwotICAgIE00T1NBX01lbUFkZHI4Ci0gICAgICAgIHBFbmNvZGVySW5wdXQ7IC8qKjwgUG9pbnRlciB0byB0aGUgZ29vZCBidWZmZXIgbG9jYXRpb24gZm9yIGVuY29kZXIgaW5wdXQgKi8KLSAgICBNNEVOQ09ERVJfQXVkaW9CdWZmZXIgcEVuY0luQnVmZmVyOyAgIC8qKjwgRW5jb2RlciBpbnB1dCBidWZmZXIgZm9yIGFwaSAqLwotICAgIE00RU5DT0RFUl9BdWRpb0J1ZmZlciBwRW5jT3V0QnVmZmVyOyAgLyoqPCBFbmNvZGVyIG91dHB1dCBidWZmZXIgZm9yIGFwaSAqLwotCi0gICAgTTRPU0FfSW50MTYgKnRlbXBCdWZmT3V0ID0gTTRPU0FfTlVMTDsKLSAgICAvKkZsQiAyMDA5LjAzLjA0OiBhcHBseSBhdWRpbyBlZmZlY3RzIGlmIGFuIGVmZmVjdCBpcyBhY3RpdmUqLwotICAgIE00T1NBX0ludDggKnBBY3RpdmVFZmZlY3ROdW1iZXIgPSAmKHBDLT5wQWN0aXZlRWZmZWN0TnVtYmVyKTsKLQotICAgIHVpbnQzMl90IGVyckNvZGUgPSBNNE5PX0VSUk9SOwotCi0gICAgaWYoIHBDLT5ub2F1ZGlvICkKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLSAgICAvKiBfX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgfCovCi0gICAgLyp8IFJFQUQgQU5EIERFQ09ERSB8Ki8KLSAgICAvKnxfX19fX19fX19fX19fX19fX3wqLwotCi0gICAgLyogQ2hlY2sgaWYgd2UgaGF2ZSB0byBlbXB0eSB0aGUgZGVjb2RlciBvdXQgYnVmZmVyIGZpcnN0ICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBQb3NJbkRlY0J1ZmZlck91dCApCi0gICAgewotICAgICAgICBnb3RvIG00bWNzX2ludGF1ZGlvdHJhbnNjb2RpbmdfZmVlZF9yZXNhbXBsZXI7Ci0gICAgfQotCi0gICAgZXJyID0gcEMtPm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RlcEF1ZGlvRGVjKHBDLT5wQXVkaW9EZWNDdHh0LAotICAgICAgICBNNE9TQV9OVUxMLCAmcEMtPkF1ZGlvRGVjQnVmZmVyT3V0LCBNNE9TQV9GQUxTRSk7Ci0KLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRBdWRpb1RyYW5zY29kaW5nKCk6IG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RlcEF1ZGlvIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotI2lmZGVmIE1DU19EVU1QX1BDTV9UT19GSUxFCi0KLSAgICBmd3JpdGUocEMtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MsCi0gICAgICAgIHBDLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUsIDEsIGZpbGVfcGNtX2RlY29kZXIpOwotCi0jZW5kaWYKLQotICAgIHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdEdldE9wdGlvbkF1ZGlvRGVjKHBDLT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICBNNEFEX2tPcHRpb25JRF9HZXRBdWRpb0FVRXJyQ29kZSwgKE00T1NBX0RhdGFPcHRpb24pICZlcnJDb2RlKTsKLQotICAgIGlmICggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnJDb2RlICkgewotICAgICAgICBwQy0+QXVkaW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRBdWRpb1RyYW5zY29kaW5nKCk6XAotICAgICAgICAgICAgICAgICBtX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdShhdWRpbykgcmV0dXJucyBNNFdBUl9OT19NT1JFX0FVIik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyQ29kZTsKLSAgIH0KLQotICAgIC8qIFNldCB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgZGVjb2RlciBvdXQgYnVmZmVyICovCi0gICAgcEMtPnBQb3NJbkRlY0J1ZmZlck91dCA9IHBDLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzOwotCi0gICAgLyogX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICB8Ki8KLSAgICAvKnwgRkVFRCBSRVNBTVBMRVIgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX3wqLwotCi1tNG1jc19pbnRhdWRpb3RyYW5zY29kaW5nX2ZlZWRfcmVzYW1wbGVyOgotCi0gICAgLyogQ2hlY2sgaWYgd2UgaGF2ZSB0byBlbXB0eSB0aGUgc3NyYyBvdXQgYnVmZmVyIGZpcnN0ICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgKQotICAgIHsKLSAgICAgICAgZ290byBtNG1jc19pbnRhdWRpb3RyYW5zY29kaW5nX3ByZXBhcmVfaW5wdXRfYnVmZmVyOwotICAgIH0KLQotICAgIC8qIENvbXB1dGUgbnVtYmVyIG9mIGJ5dGVzIHJlbWFpbmluZyBpbiB0aGUgZGVjb2RlciBidWZmZXIgKi8KLSAgICB1aVNzcmNJblNpemUgPSBwQy0+aVNzcmNOYlNhbXBsSW4gKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICogcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzOwotICAgIHVpQnl0ZXNEZWMgPSAoIHBDLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzCi0gICAgICAgICsgcEMtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSkgLSBwQy0+cFBvc0luRGVjQnVmZmVyT3V0OwotCi0gICAgLyogQ2hlY2sgaWYgd2UgY2FuIGZlZWQgZGlyZWN0bHkgdGhlIFNzcmMgd2l0aCB0aGUgZGVjb2RlciBvdXQgYnVmZmVyICovCi0gICAgaWYoICggcEMtPnBQb3NJblNzcmNCdWZmZXJJbiA9PSBwQy0+cFNzcmNCdWZmZXJJbikKLSAgICAgICAgJiYgKHVpQnl0ZXNEZWMgPj0gdWlTc3JjSW5TaXplKSApCi0gICAgewotICAgICAgICBwU3NyY0lucHV0ID0gcEMtPnBQb3NJbkRlY0J1ZmZlck91dDsKLQotICAgICAgICAvKiB1cGRhdGUgZGF0YSBjb25zdW1lZCBpbnRvIGRlY29kZXIgYnVmZmVyIGFmdGVyIHJlc2FtcGxpbmcgKi8KLSAgICAgICAgaWYoIHVpQnl0ZXNEZWMgPT0gdWlTc3JjSW5TaXplICkKLSAgICAgICAgICAgIHBDLT5wUG9zSW5EZWNCdWZmZXJPdXQgPSBNNE9TQV9OVUxMOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBwQy0+cFBvc0luRGVjQnVmZmVyT3V0ICs9IHVpU3NyY0luU2l6ZTsKLQotICAgICAgICBnb3RvIG00bWNzX2ludGF1ZGlvdHJhbnNjb2RpbmdfZG9fcmVzYW1wbGluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENvbXB1dGUgcmVtYWluaW5nIHNwYWNlIGluIFNzcmMgYnVmZmVyIGluICovCi0gICAgdWlTc3JjSW5Sb29tID0gKCBwQy0+cFNzcmNCdWZmZXJJbiArIHVpU3NyY0luU2l6ZSkgLSBwQy0+cFBvc0luU3NyY0J1ZmZlckluOwotCi0gICAgLyoqCi0gICAgKiBOYiBvZiBieXRlcyBjb3BpZWQgaXMgdGhlIG1pbmltdW0gYmV0d2VlbiBuYiBvZiBieXRlcyByZW1haW5pbmcgaW4KLSAgICAqIGRlY29kZXIgb3V0IGJ1ZmZlciBhbmQgc3BhY2UgcmVtYWluaW5nIGluIHNzcmMgaW4gYnVmZmVyICovCi0gICAgdWlEZWNvZGVyMlNzcmNfTmJCeXRlcyA9Ci0gICAgICAgICh1aVNzcmNJblJvb20gPCB1aUJ5dGVzRGVjKSA/IHVpU3NyY0luUm9vbSA6IHVpQnl0ZXNEZWM7Ci0KLSAgICAvKioKLSAgICAqIENvcHkgZnJvbSB0aGUgZGVjb2RlciBvdXQgYnVmZmVyIGludG8gdGhlIFNzcmMgaW4gYnVmZmVyICovCi0gICAgbWVtY3B5KCh2b2lkICopcEMtPnBQb3NJblNzcmNCdWZmZXJJbiwgKHZvaWQgKilwQy0+cFBvc0luRGVjQnVmZmVyT3V0LAotICAgICAgICB1aURlY29kZXIyU3NyY19OYkJ5dGVzKTsKLQotICAgIC8qKgotICAgICogVXBkYXRlIHRoZSBwb3NpdGlvbiBpbiB0aGUgZGVjb2RlciBvdXQgYnVmZmVyICovCi0gICAgcEMtPnBQb3NJbkRlY0J1ZmZlck91dCArPSB1aURlY29kZXIyU3NyY19OYkJ5dGVzOwotCi0gICAgLyoqCi0gICAgKiBVcGRhdGUgdGhlIHBvc2l0aW9uIGluIHRoZSBTc3JjIGluIGJ1ZmZlciAqLwotICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gKz0gdWlEZWNvZGVyMlNzcmNfTmJCeXRlczsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaWYgdGhlIGRlY29kZXIgYnVmZmVyIG91dCBpcyBlbXB0eSAqLwotICAgIGlmKCAoIHBDLT5wUG9zSW5EZWNCdWZmZXJPdXQgLSBwQy0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcykKLSAgICAgICAgPT0gKE00T1NBX0ludDMyKXBDLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgKQotICAgIHsKLSAgICAgICAgcEMtPnBQb3NJbkRlY0J1ZmZlck91dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgaWYgdGhlIFNzcmMgaW4gYnVmZmVyIGlzIHJlYWR5ICg9IGZ1bGwpICovCi0gICAgaWYoICggcEMtPnBQb3NJblNzcmNCdWZmZXJJbiAtIHBDLT5wU3NyY0J1ZmZlckluKQotICAgICAgICA8IChNNE9TQV9JbnQzMil1aVNzcmNJblNpemUgKQotICAgIHsKLSAgICAgICAgZ290byBtNG1jc19pbnRhdWRpb3RyYW5zY29kaW5nX2VuZDsKLSAgICB9Ci0KLSAgICBwU3NyY0lucHV0ID0gcEMtPnBTc3JjQnVmZmVySW47Ci0KLSAgICAvKiB1cGRhdGUgZGF0YSBjb25zdW1lZCBpbnRvIHNzcmMgYnVmZmVyIGluIGFmdGVyIHJlc2FtcGxpbmcgKGVtcHR5KSAqLwotICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gPSBwQy0+cFNzcmNCdWZmZXJJbjsKLQotICAgIC8qIF9fX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgICAgfCovCi0gICAgLyp8IERPIFRIRSBSRVNBTVBMSU5HIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX198Ki8KLQotbTRtY3NfaW50YXVkaW90cmFuc2NvZGluZ19kb19yZXNhbXBsaW5nOgotCi0gICAgLyoqCi0gICAgKiBObyBuZWVkIGZvciBtZW1jb3B5LCB3ZSBjYW4gZmVlZCBTc3JjIGRpcmVjdGx5IHdpdGggdGhlIGRhdGEgaW4gdGhlIGF1ZGlvCi0gICAgZGVjb2RlciBvdXQgYnVmZmVyKi8KLQotICAgIHNzcmNFcnIgPSAwOwotCi0gICAgaWYoIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fbmJDaGFubmVscyA9PSAxICkKLSAgICB7Ci0gICAgICAgIHRlbXBCdWZmT3V0ID0KLSAgICAgICAgICAgIChzaG9ydCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygocEMtPmlTc3JjTmJTYW1wbE91dCAqIHNpemVvZihzaG9ydCkgKiAyCi0gICAgICAgICAgICAqICgoKnBDKS5JbnB1dEZpbGVQcm9wZXJ0aWVzKS51aU5iQ2hhbm5lbHMpLAotICAgICAgICAgICAgTTRWU1MzR1BQLChNNE9TQV9DaGFyICopICJ0ZW1wQnVmZk91dCIpOwotICAgICAgICBtZW1zZXQoKHZvaWQgKil0ZW1wQnVmZk91dCwgMCwocEMtPmlTc3JjTmJTYW1wbE91dCAqIHNpemVvZihzaG9ydCkgKiAyCi0gICAgICAgICAgICAqICgoKnBDKS5JbnB1dEZpbGVQcm9wZXJ0aWVzKS51aU5iQ2hhbm5lbHMpKTsKLQotICAgICAgICBMVkF1ZGlvcmVzYW1wbGVfTG93UXVhbGl0eSgoc2hvcnQgKil0ZW1wQnVmZk91dCwgKHNob3J0ICopcFNzcmNJbnB1dCwKLSAgICAgICAgICAgIHBDLT5pU3NyY05iU2FtcGxPdXQsIHBDLT5wTFZBdWRpb1Jlc2FtcGxlcik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG1lbXNldCgodm9pZCAqKXBDLT5wU3NyY0J1ZmZlck91dCwgMCwgKHBDLT5pU3NyY05iU2FtcGxPdXQgKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAqICgoKnBDKS5JbnB1dEZpbGVQcm9wZXJ0aWVzKS51aU5iQ2hhbm5lbHMpKTsKLQotICAgICAgICBMVkF1ZGlvcmVzYW1wbGVfTG93UXVhbGl0eSgoc2hvcnQgKilwQy0+cFNzcmNCdWZmZXJPdXQsCi0gICAgICAgICAgICAoc2hvcnQgKilwU3NyY0lucHV0LCBwQy0+aVNzcmNOYlNhbXBsT3V0LCBwQy0+cExWQXVkaW9SZXNhbXBsZXIpOwotICAgIH0KLQotICAgIGlmKCBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHMgPT0gMSApCi0gICAgewotICAgICAgICBGcm9tMmlUb01vbm9fMTYoKHNob3J0ICopdGVtcEJ1ZmZPdXQsIChzaG9ydCAqKXBDLT5wU3NyY0J1ZmZlck91dCwKLSAgICAgICAgICAgIChzaG9ydClwQy0+aVNzcmNOYlNhbXBsT3V0KTsKLSAgICAgICAgZnJlZSh0ZW1wQnVmZk91dCk7Ci0gICAgfQotCi0KLSAgICBpZiggMCAhPSBzc3JjRXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludEF1ZGlvVHJhbnNjb2Rpbmc6IFNTUkNfUHJvY2VzcyByZXR1cm5zIDB4JXgsIFwKLSAgICAgICAgICAgIHJldHVybmluZyBNNE1DU19FUlJfQVVESU9fQ09OVkVSU0lPTl9GQUlMRUQiLAotICAgICAgICAgICAgc3NyY0Vycik7Ci0gICAgICAgIHJldHVybiBNNE1DU19FUlJfQVVESU9fQ09OVkVSU0lPTl9GQUlMRUQ7Ci0gICAgfQotCi0gICAgcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgPSBwQy0+cFNzcmNCdWZmZXJPdXQ7Ci0KLSAgICAvKiBfX19fX19fX19fX19fX19fX19fX19fICovCi0gICAgLyp8ICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCBQUkVQQVJFIElOUFVUIEJVRkZFUiB8Ki8KLSAgICAvKnxfX19fX19fX19fX19fX19fX19fX19ffCovCi0KLW00bWNzX2ludGF1ZGlvdHJhbnNjb2RpbmdfcHJlcGFyZV9pbnB1dF9idWZmZXI6Ci0KLSAgICAvKiBTZXQgdGhlIGZsYWcgZm9yIGNoYW5uZWwgY29udmVyc2lvbiByZXF1aXJlbWVudCAqLwotICAgIGlmKCAoIHBDLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtID09IE00RU5DT0RFUl9rTW9ubykKLSAgICAgICAgJiYgKHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fbmJDaGFubmVscyA9PSAyKSApCi0gICAgewotICAgICAgICBuZWVkQ2hhbm5lbENvbnZlcnNpb24gPSAxOwotICAgICAgICB1aUNoYW5uZWxDb252ZXJ0b3JDb2VmZiA9IDQ7Ci0gICAgfQotICAgIGVsc2UgaWYoICggcEMtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gPT0gTTRFTkNPREVSX2tTdGVyZW8pCi0gICAgICAgICYmIChwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHMgPT0gMSkgKQotICAgIHsKLSAgICAgICAgbmVlZENoYW5uZWxDb252ZXJzaW9uID0gMjsKLSAgICAgICAgdWlDaGFubmVsQ29udmVydG9yQ29lZmYgPSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBuZWVkQ2hhbm5lbENvbnZlcnNpb24gPSAwOwotICAgICAgICB1aUNoYW5uZWxDb252ZXJ0b3JDb2VmZiA9IDI7Ci0gICAgfQotCi0gICAgLyogQ29tcHV0ZSBudW1iZXIgb2YgYnl0ZXMgcmVtYWluaW5nIGluIHRoZSBTc3JjIGJ1ZmZlciAqLwotICAgIHVpU3NyY091dFNpemUgPSBwQy0+aVNzcmNOYlNhbXBsT3V0ICogc2l6ZW9mKHNob3J0KQotICAgICAgICAqIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fbmJDaGFubmVsczsKLSAgICB1aUJ5dGVzU3NyYyA9Ci0gICAgICAgICggcEMtPnBTc3JjQnVmZmVyT3V0ICsgdWlTc3JjT3V0U2l6ZSkgLSBwQy0+cFBvc0luU3NyY0J1ZmZlck91dDsKLQotICAgIC8qIENoZWNrIGlmIHRoZSBzc3JjIGJ1ZmZlciBpcyBmdWxsICovCi0gICAgaWYoIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ID09IHBDLT5wU3NyY0J1ZmZlck91dCApCi0gICAgewotICAgICAgICB1aVNzcmMyRW5jb2Rlcl9OYkJ5dGVzID0KLSAgICAgICAgICAgIHBDLT5hdWRpb0VuY29kZXJHcmFudWxhcml0eSAqIHVpQ2hhbm5lbENvbnZlcnRvckNvZWZmIC8gMjsKLQotICAgICAgICAvKiBDaGVjayBpZiB3ZSBjYW4gZmVlZCBkaXJlY3RseSB0aGUgZW5jb2RlciB3aXRoIHRoZSBzc3JjIG91dCBidWZmZXIgKi8KLSAgICAgICAgaWYoICggcEMtPnBQb3NJbkF1ZGlvRW5jb2RlckJ1ZmZlciA9PSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgJiYgKHVpQnl0ZXNTc3JjID49IHVpU3NyYzJFbmNvZGVyX05iQnl0ZXMpICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogdXBkYXRlIHBvc2l0aW9uIGluIHNzcmMgb3V0IGJ1ZmZlciBhZnRlciBlbmNvZGluZyAqLwotICAgICAgICAgICAgaWYoIHVpQnl0ZXNTc3JjID09IHVpU3NyYzJFbmNvZGVyX05iQnl0ZXMgKQotICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCArPSB1aVNzcmMyRW5jb2Rlcl9OYkJ5dGVzOwotCi0gICAgICAgICAgICAvKiBtYXJrIHRoZSBlbmNvZGVyIGJ1ZmZlciByZWFkeSAoPSBmdWxsKSAqLwotICAgICAgICAgICAgcEMtPnBQb3NJbkF1ZGlvRW5jb2RlckJ1ZmZlciA9Ci0gICAgICAgICAgICAgICAgcEMtPnBBdWRpb0VuY29kZXJCdWZmZXIgKyBwQy0+YXVkaW9FbmNvZGVyR3JhbnVsYXJpdHk7Ci0KLSAgICAgICAgICAgIGlmKCBuZWVkQ2hhbm5lbENvbnZlcnNpb24gPiAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBjaGFubmVsIGNvbnZlcnRvciB3cml0ZXMgZGlyZWN0bHkgaW50byBlbmNvZGVyIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIHBFbmNvZGVySW5wdXQgPSBwQy0+cEF1ZGlvRW5jb2RlckJ1ZmZlcjsKLQotICAgICAgICAgICAgICAgIHBDaGFubmVsQ29udmVydG9ySW5wdXQgPSBwQy0+cFNzcmNCdWZmZXJPdXQ7Ci0gICAgICAgICAgICAgICAgcENoYW5uZWxDb252ZXJ0b3JPdXRwdXQgPSBwQy0+cEF1ZGlvRW5jb2RlckJ1ZmZlcjsKLSAgICAgICAgICAgICAgICB1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgPQotICAgICAgICAgICAgICAgICAgICB1aVNzcmMyRW5jb2Rlcl9OYkJ5dGVzIC8gc2l6ZW9mKHNob3J0KTsKLQotICAgICAgICAgICAgICAgIGdvdG8gbTRtY3NfaW50YXVkaW90cmFuc2NvZGluZ19jaGFubmVsX2NvbnZlcnRvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBlbmNvZGUgZGlyZWN0bHkgZnJvbSBzc3JjIG91dCBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICBwRW5jb2RlcklucHV0ID0gcEMtPnBTc3JjQnVmZmVyT3V0OwotCi0gICAgICAgICAgICAgICAgZ290byBtNG1jc19pbnRhdWRpb3RyYW5zY29kaW5nX2VuY29kZV9hbmRfd3JpdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENvbXB1dGUgcmVtYWluaW5nIHNwYWNlIGluIGVuY29kZXIgYnVmZmVyIGluICovCi0gICAgaWYoIHBDLT5wUG9zSW5BdWRpb0VuY29kZXJCdWZmZXIgPT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBwQy0+cFBvc0luQXVkaW9FbmNvZGVyQnVmZmVyID0gcEMtPnBBdWRpb0VuY29kZXJCdWZmZXI7Ci0gICAgfQotCi0gICAgdWlFbmNvZGVySW5Sb29tID0gKCBwQy0+cEF1ZGlvRW5jb2RlckJ1ZmZlciArIHBDLT5hdWRpb0VuY29kZXJHcmFudWxhcml0eSkKLSAgICAgICAgLSBwQy0+cFBvc0luQXVkaW9FbmNvZGVyQnVmZmVyOwotICAgIHBFbmNvZGVySW5wdXQgPSBwQy0+cEF1ZGlvRW5jb2RlckJ1ZmZlcjsKLQotICAgIC8qKgotICAgICogTmIgb2YgYnl0ZXMgY29waWVkIGlzIHRoZSBtaW5pbXVtIGJldHdlZW4gbmIgb2YgYnl0ZXMgcmVtYWluaW5nIGluCi0gICAgKiBkZWNvZGVyIG91dCBidWZmZXIgYW5kIHNwYWNlIHJlbWFpbmluZyBpbiBzc3JjIGluIGJ1ZmZlciAqLwotICAgIHVpU3NyYzJFbmNvZGVyX05iQnl0ZXMgPQotICAgICAgICAoKCB1aUVuY29kZXJJblJvb20gKiB1aUNoYW5uZWxDb252ZXJ0b3JDb2VmZiAvIDIpIDwgdWlCeXRlc1NzcmMpCi0gICAgICAgID8gKHVpRW5jb2RlckluUm9vbSAqIHVpQ2hhbm5lbENvbnZlcnRvckNvZWZmIC8gMikgOiB1aUJ5dGVzU3NyYzsKLQotICAgIGlmKCBuZWVkQ2hhbm5lbENvbnZlcnNpb24gPiAwICkKLSAgICB7Ci0gICAgICAgIC8qIGNoYW5uZWwgY29udmVydG9yIHdyaXRlcyBkaXJlY3RseSBpbnRvIGVuY29kZXIgYnVmZmVyICovCi0gICAgICAgIHBDaGFubmVsQ29udmVydG9ySW5wdXQgPSBwQy0+cFBvc0luU3NyY0J1ZmZlck91dDsKLSAgICAgICAgcENoYW5uZWxDb252ZXJ0b3JPdXRwdXQgPSBwQy0+cFBvc0luQXVkaW9FbmNvZGVyQnVmZmVyOwotICAgICAgICB1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgPSB1aVNzcmMyRW5jb2Rlcl9OYkJ5dGVzIC8gc2l6ZW9mKHNob3J0KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogY29weSBmcm9tIHRoZSBzc3JjIG91dCBidWZmZXIgaW50byB0aGUgZW5jb2RlciBpbiBidWZmZXIgKi8KLSAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPnBQb3NJbkF1ZGlvRW5jb2RlckJ1ZmZlciwgKHZvaWQgKilwQy0+cFBvc0luU3NyY0J1ZmZlck91dCwKLSAgICAgICAgICAgIHVpU3NyYzJFbmNvZGVyX05iQnl0ZXMpOwotICAgIH0KLQotICAgIC8qIFVwZGF0ZSBwb3NpdGlvbiBpbiBzc3JjIG91dCBidWZmZXIgYWZ0ZXIgZW5jb2RpbmcgKi8KLSAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCArPSB1aVNzcmMyRW5jb2Rlcl9OYkJ5dGVzOwotCi0gICAgLyogVXBkYXRlIHRoZSBwb3NpdGlvbiBpbiB0aGUgZW5jb2RlciBpbiBidWZmZXIgKi8KLSAgICBwQy0+cFBvc0luQXVkaW9FbmNvZGVyQnVmZmVyICs9Ci0gICAgICAgIHVpU3NyYzJFbmNvZGVyX05iQnl0ZXMgKiAyIC8gdWlDaGFubmVsQ29udmVydG9yQ29lZmY7Ci0KLSAgICAvKiBDaGVjayBpZiB0aGUgc3NyYyBidWZmZXIgb3V0IGlzIGVtcHR5ICovCi0gICAgaWYoICggcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgLSBwQy0+cFNzcmNCdWZmZXJPdXQpCi0gICAgICAgID09IChNNE9TQV9JbnQzMil1aVNzcmNPdXRTaXplICkKLSAgICB7Ci0gICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKiBnbyB0byBuZXh0IHN0YXRlbWVudCAqLwotICAgIGlmKCBuZWVkQ2hhbm5lbENvbnZlcnNpb24gPiAwICkKLSAgICAgICAgZ290byBtNG1jc19pbnRhdWRpb3RyYW5zY29kaW5nX2NoYW5uZWxfY29udmVydG9yOwotICAgIGVsc2UKLSAgICAgICAgZ290byBtNG1jc19pbnRhdWRpb3RyYW5zY29kaW5nX2VuY29kZV9hbmRfd3JpdGU7Ci0KLSAgICAvKiBfX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgfCovCi0gICAgLyp8IFNURVJFTyA8LT4gTU9OTyB8Ki8KLSAgICAvKnxfX19fX19fX19fX19fX19fX3wqLwotCi1tNG1jc19pbnRhdWRpb3RyYW5zY29kaW5nX2NoYW5uZWxfY29udmVydG9yOgotCi0gICAgLyogY29udmVydCB0aGUgaW5wdXQgcGNtIHN0cmVhbSB0byBtb25vIG9yIHRvIHN0ZXJlbyAqLwotICAgIHN3aXRjaCggbmVlZENoYW5uZWxDb252ZXJzaW9uICkKLSAgICB7Ci0gICAgICAgIGNhc2UgMTogLyogc3RlcmVvIHRvIG1vbm8gKi8KLSAgICAgICAgICAgIEZyb20yaVRvTW9ub18xNigoc2hvcnQgKilwQ2hhbm5lbENvbnZlcnRvcklucHV0LAotICAgICAgICAgICAgICAgIChzaG9ydCAqKXBDaGFubmVsQ29udmVydG9yT3V0cHV0LAotICAgICAgICAgICAgICAgIChzaG9ydCkodWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzIC8gMikpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAyOiAvKiBtb25vIHRvIHN0ZXJlbyAqLwotICAgICAgICAgICAgTW9ub1RvMklfMTYoKHNob3J0ICopcENoYW5uZWxDb252ZXJ0b3JJbnB1dCwKLSAgICAgICAgICAgICAgICAoc2hvcnQgKilwQ2hhbm5lbENvbnZlcnRvck91dHB1dCwKLSAgICAgICAgICAgICAgICAoc2hvcnQpdWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qIF9fX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCBFTkNPREUgQU5EIFdSSVRFIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX3wqLwotCi1tNG1jc19pbnRhdWRpb3RyYW5zY29kaW5nX2VuY29kZV9hbmRfd3JpdGU6Ci0KLSAgICAvKiBDaGVjayBpZiB0aGUgZW5jb2RlciBpbiBidWZmZXIgaXMgcmVhZHkgKD0gZnVsbCkgKi8KLSAgICBpZiggKCBwQy0+cFBvc0luQXVkaW9FbmNvZGVyQnVmZmVyIC0gcEMtPnBBdWRpb0VuY29kZXJCdWZmZXIpCi0gICAgICAgIDwgKE00T1NBX0ludDMyKXBDLT5hdWRpb0VuY29kZXJHcmFudWxhcml0eSApCi0gICAgewotICAgICAgICBnb3RvIG00bWNzX2ludGF1ZGlvdHJhbnNjb2RpbmdfZW5kOwotICAgIH0KLQotICAgIC8qIFtNb25vXSBvciBbU3RlcmVvIGludGVybGVhdmVkXSA6IGFsbCBpcyBpbiBvbmUgYnVmZmVyICovCi0gICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclswXSA9IHBFbmNvZGVySW5wdXQ7Ci0gICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gPSBwQy0+YXVkaW9FbmNvZGVyR3JhbnVsYXJpdHk7Ci0gICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclsxXSA9IE00T1NBX05VTEw7Ci0gICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMV0gPSAwOwotCi0gICAgLyogVGltZSBpbiBtcyBmcm9tIGRhdGEgc2l6ZSwgYmVjYXVzZSBpdCBpcyBQQ00xNiBzYW1wbGVzICovCi0gICAgZnJhbWVUaW1lRGVsdGEgPQotICAgICAgICAoIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdICogdWlDaGFubmVsQ29udmVydG9yQ29lZmYgLyAyKQotICAgICAgICAvIHNpemVvZihzaG9ydCkgLyBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHM7Ci0KLSAgICAvKioKLSAgICAqIFByZXBhcmUgdGhlIHdyaXRlciBBVSAqLwotICAgIGVyciA9IHBDLT5wV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKHBDLT5wV3JpdGVyQ29udGV4dCwKLSAgICAgICAgTTRNQ1NfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwgJnBDLT5Xcml0ZXJBdWRpb0FVKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRBdWRpb1RyYW5zY29kaW5nKCk6IHBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoQXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qRmxCIDIwMDkuMDMuMDQ6IGFwcGx5IGF1ZGlvIGVmZmVjdHMgaWYgYW4gZWZmZWN0IGlzIGFjdGl2ZSovCi0gICAgaWYoICpwQWN0aXZlRWZmZWN0TnVtYmVyID49IDAgJiYgKnBBY3RpdmVFZmZlY3ROdW1iZXIgPCBwQy0+bmJFZmZlY3RzICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+cEVmZmVjdHNbKnBBY3RpdmVFZmZlY3ROdW1iZXJdLkV4dEF1ZGlvRWZmZWN0RmN0ICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE1DU19FeHRlcm5hbFByb2dyZXNzIHBQcm9ncmVzczsKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wUHJvZ3Jlc3MgPSAwOwotICAgICAgICAgICAgcFByb2dyZXNzLnVpQ2xpcFRpbWUgPSAoTTRPU0FfVUludDMyKXBDLT5SZWFkZXJBdWRpb0FVLm1fQ1RTOwotCi0gICAgICAgICAgICBwUHJvZ3Jlc3MudWlPdXRwdXRUaW1lID0gKCBwQy0+V3JpdGVyQXVkaW9BVS5DVFMgKiAxMDAwKQotICAgICAgICAgICAgICAgIC8gcEMtPldyaXRlckF1ZGlvU3RyZWFtLnRpbWVTY2FsZTsKLSAgICAgICAgICAgIHRlbXBQcm9ncmVzcyA9ICggKE00T1NBX1VJbnQzMilwQy0+UmVhZGVyQXVkaW9BVS5tX0NUUwotICAgICAgICAgICAgICAgIC0gcEMtPnBFZmZlY3RzWypwQWN0aXZlRWZmZWN0TnVtYmVyXS51aVN0YXJ0VGltZQotICAgICAgICAgICAgICAgIC0gcEMtPnVpQmVnaW5DdXRUaW1lKSAqIDEwMDA7Ci0gICAgICAgICAgICBwUHJvZ3Jlc3MudWlQcm9ncmVzcyA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikodGVtcFByb2dyZXNzIC8gKE00T1NBX1VJbnQzMilwQy0+cEVmZmVjdHNbCi0gICAgICAgICAgICAgICAgICAgICpwQWN0aXZlRWZmZWN0TnVtYmVyXS51aUR1cmF0aW9uKTsKLQotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+cEVmZmVjdHNbKnBBY3RpdmVFZmZlY3ROdW1iZXJdLkV4dEF1ZGlvRWZmZWN0RmN0KAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBFZmZlY3RzWypwQWN0aXZlRWZmZWN0TnVtYmVyXS5wRXh0QXVkaW9FZmZlY3RGY3RDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDE2ICopcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdLCAmcFByb2dyZXNzKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9UcmFuc2NvZGluZygpOiBFeHRBdWRpb0VmZmVjdEZjdCgpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogUHJlcGFyZSBvdXRwdXQgYnVmZmVyICovCi0gICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJbMF0gPQotICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcEMtPldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3M7Ci0gICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdID0gMDsKLQotI2lmZGVmIE1DU19EVU1QX1BDTV9UT19GSUxFCi0KLSAgICBmd3JpdGUocEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclswXSwgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0sIDEsCi0gICAgICAgIGZpbGVfcGNtX2VuY29kZXIpOwotCi0jZW5kaWYKLQotICAgIGlmKCBNNE9TQV9GQUxTRSA9PSBwQy0+Yl9pc1Jhd1dyaXRlciApCi0gICAgewotICAgICAgICAvKiBUaGlzIGFsbG93IHRvIHdyaXRlIFBDTSBkYXRhIHRvIGZpbGUgYW5kIHRvIGVuY29kZSBBTVIgZGF0YSwKLSAgICAgICAgIHdoZW4gb3V0cHV0IGZpbGUgaXMgbm90IFJBVyAqLwotICAgICAgICBpZiggcEMtPnBPdXRwdXRQQ01maWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+cE9zYUZpbGVXcml0UHRyLT53cml0ZURhdGEocEMtPnBPdXRwdXRQQ01maWxlLAotICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMF0sIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEVuY29kZSB0aGUgUENNIGF1ZGlvICovCi0gICAgICAgIGVyciA9IHBDLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0ZXAocEMtPnBBdWRpb0VuY0N0eHQsCi0gICAgICAgICAgICAmcEVuY0luQnVmZmVyLCAmcEVuY091dEJ1ZmZlcik7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludEF1ZGlvVHJhbnNjb2RpbmcoKTogcEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGVwIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiB1cGRhdGUgZGF0YSBjb25zdW1lZCBpbnRvIGVuY29kZXIgYnVmZmVyIGluIGFmdGVyIGVuY29kaW5nIChlbXB0eSkgKi8KLSAgICAgICAgcEMtPnBQb3NJbkF1ZGlvRW5jb2RlckJ1ZmZlciA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogU2V0IEFVIGN0cyBhbmQgc2l6ZSAqLwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5zaXplID0KLSAgICAgICAgICAgIHBFbmNPdXRCdWZmZXIuCi0gICAgICAgICAgICBwVGFibGVCdWZmZXJTaXplWzBdOyAvKio8IEdldCB0aGUgc2l6ZSBvZiBlbmNvZGVkIGRhdGEgKi8KLSAgICAgICAgcEMtPldyaXRlckF1ZGlvQVUuQ1RTICs9IGZyYW1lVGltZURlbHRhOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFVwZGF0ZSBkdXJhdGlvbiBvZiB0aGUgZW5jb2RlZCBBVSAqLwotICAgICAgICBwQy0+bV9hdWRpb0FVRHVyYXRpb24gPQotICAgICAgICAgICAgKCBmcmFtZVRpbWVEZWx0YSAqIDEwMDApIC8gcEMtPldyaXRlckF1ZGlvU3RyZWFtLnRpbWVTY2FsZTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBXcml0ZSB0aGUgZW5jb2RlZCBBVSB0byB0aGUgb3V0cHV0IGZpbGUgKi8KLSAgICAgICAgcEMtPnVpQXVkaW9BVUNvdW50Kys7Ci0gICAgICAgIGVyciA9IHBDLT5wV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUocEMtPnBXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgTTRNQ1NfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwgJnBDLT5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9UcmFuc2NvZGluZygpOiBwV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUoQXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogdXBkYXRlIGRhdGEgY29uc3VtZWQgaW50byBlbmNvZGVyIGJ1ZmZlciBpbiBhZnRlciBlbmNvZGluZyAoZW1wdHkpICovCi0gICAgICAgIHBDLT5wUG9zSW5BdWRpb0VuY29kZXJCdWZmZXIgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpCi0gICAgICAgICAgICBwRW5jb2RlcklucHV0OyAvKiB3aWxsIGJlIGNvbnZlcnRlZCBiYWNrIHRvIHU4KiBpbiBmaWxlIHdyaXRlICovCi0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLnNpemUgPSBwQy0+YXVkaW9FbmNvZGVyR3JhbnVsYXJpdHk7Ci0gICAgICAgIHBDLT51aUF1ZGlvQVVDb3VudCsrOwotCi0gICAgICAgIGVyciA9IHBDLT5wV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUocEMtPnBXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgTTRNQ1NfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwgJnBDLT5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9UcmFuc2NvZGluZygpOiBwV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUoQXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBfX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICB8Ki8KLSAgICAvKnwgT05FIFBBU1MgRE9ORSB8Ki8KLSAgICAvKnxfX19fX19fX19fX19fX198Ki8KLQotbTRtY3NfaW50YXVkaW90cmFuc2NvZGluZ19lbmQ6Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX2ludEF1ZGlvVHJhbnNjb2RpbmcoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50UmVhbGxvY1RlbXBvcmFyeUFVKE00T1NBX01lbUFkZHI4KiBhZGRyLCBNNE9TQV9VSW50MzIgbmV3U2l6ZSkKLSAqIFVzZWQgb25seSBpbiBjYXNlIG9mIDNHUCBjb25zdGFudCBtZW1vcnkgcmVhZGVyLCB0byBiZSBhYmxlIHRvIHJlYWxsb2MgdGVtcG9yYXJ5IEFVCi0gKiBiZWNhdXNlIG1heCBBVSBzaXplIGNhbiBiZSByZWV2YWx1YXRlZCBkdXJpbmcgcmVhZGluZwotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRSZWFsbG9jVGVtcG9yYXJ5QVUoIE00T1NBX01lbUFkZHI4ICphZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIG5ld1NpemUgKQotewotICAgIGlmKCAqYWRkciAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIGZyZWUoKmFkZHIpOwotICAgICAgICAqYWRkciA9IChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MobmV3U2l6ZSwgTTRNQ1MsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJSZWFsbG9jYXRpb24gb2YgdGVtcG9yYXJ5IEFVIGJ1ZmZlciIpOwotCi0gICAgICAgIGlmKCAqYWRkciA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nKE00TUNTX0ludGVybmFsQ29udGV4dCogcEMpCi0gKiBAYXV0aG9yICAgQWxleGlzIFZhcGlsbG9uIChOWFAgU29mdHdhcmUgVmlzaW9uKQotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZyggTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgLyogRHVyYXRpb24gb2YgdGhlIEFVIChmaW5kIHRoZSBuZXh0IEFVIGR1cmF0aW9uCi0gICAgICogdG8gb2J0YWluIGEgbW9yZSBwcmVjaXNlIHZpZGVvIGVuZCBjdXQpCi0gICAgICovCi0gICAgTTRPU0FfVUludDMyIHZpZGVvQVVEdXJhdGlvbiA9IDA7Ci0KLSAgICBNNE9TQV9NZW1BZGRyOCBXcml0ZWJ1ZmZlckFkZCA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfSW50MzIgbGFzdGRlY29kZWRDVFMgPSAwOwotICAgIE00X0FjY2Vzc1VuaXQgbFJlYWRlclZpZGVvQVU7IC8qKjwgUmVhZCB2aWRlbyBhY2Nlc3MgdW5pdCAqLwotCi0gICAgaWYoIHBDLT5ub3ZpZGVvICkKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLSAgICAvKiBILjI2NCBUcmltbWluZyAqLwotICAgIGlmKCAoICggcEMtPmJIMjY0VHJpbSA9PSBNNE9TQV9UUlVFKQotICAgICAgICAmJiAocEMtPnVpVmlkZW9BVUNvdW50IDwgcEMtPm1fcEluc3RhbmNlLT5jbGlwX3Nwcy5udW1fcmVmX2ZyYW1lcykKLSAgICAgICAgJiYgKHBDLT51aUJlZ2luQ3V0VGltZSA+IDApKQotICAgICAgICB8fCAoKCBwQy0+dWlWaWRlb0FVQ291bnQgPT0gMCkgJiYgKHBDLT51aUJlZ2luQ3V0VGltZSA+IDApKSApCi0gICAgewotICAgICAgICBlcnIgPSBNNE1DU19pbnRWaWRlb1RyYW5zY29kaW5nKHBDKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLQotICAgIGlmKChwQy0+Ykxhc3REZWNvZGVkRnJhbWVDVFMgPT0gTTRPU0FfRkFMU0UpICYmIChwQy0+dWlCZWdpbkN1dFRpbWUgPiAwKSkKLSAgICB7Ci0gICAgICAgIC8vIFN0YWdlRnJpZ2h0IGVuY29kZXIgZG9lcyBwcmVmZXRjaCwgdGhlIG9uZSBmcmFtZSB3ZSByZXF1ZXN0ZWQgd2lsbCBub3QgYmUgd3JpdHRlbiB1bnRpbAotICAgICAgICAvLyB0aGUgZW5jb2RlciBpcyBjbG9zZWQsIHNvIGRvIGl0IG5vdyByYXRoZXIgdGhhbiBpbiBNQ1NfY2xvc2UKLSAgICAgICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICB8fCAoTTRNQ1Nfa0VuY29kZXJSdW5uaW5nICE9IHBDLT5lbmNvZGVyU3RhdGUpICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzIoCi0gICAgICAgICAgICAgICAgIiEhISBNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZyBFUlJPUiA6IE00TUNTX2ludFZpZGVvVHJhbnNjb2RpbmcgIgotICAgICAgICAgICAgICAgICJyZXR1cm5zIDB4JVggdy8gZW5jU3RhdGU9JWQiLCBlcnIsIHBDLT5lbmNvZGVyU3RhdGUpOwotCi0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogU3RvcCBhbmQgY2xvc2UgdGhlIGVuY29kZXIgbm93IHRvIGZsdXNoIHRoZSBmcmFtZSAocHJlZmV0Y2gpICovCi0gICAgICAgIGlmKCBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdG9wICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdG9wKHBDLT5wVmlFbmNDdHh0KTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIiEhISBNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZyBFUlJPUiA6IGVuY29kZXIgc3RvcCByZXR1cm5zIDB4JVgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcEMtPmVuY29kZXJTdGF0ZSA9IE00TUNTX2tFbmNvZGVyU3RvcHBlZDsKLSAgICAgICAgZXJyID0gcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2UocEMtPnBWaUVuY0N0eHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICIhISEgTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcgRVJST1IgOiBlbmNvZGVyIGNsb3NlIHJldHVybnMgMHglWCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgcEMtPmVuY29kZXJTdGF0ZSA9IE00TUNTX2tFbmNvZGVyQ2xvc2VkOwotICAgIH0KLQotCi0gICAgaWYgKChwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCA9PSBNNEVOQ09ERVJfa05VTEwpCi0gICAgICAgICYmIChwQy0+Ykxhc3REZWNvZGVkRnJhbWVDVFMgPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICYmIChwQy0+dWlCZWdpbkN1dFRpbWUgPiAwKSkgewotCi0gICAgICAgIHBDLT5iTGFzdERlY29kZWRGcmFtZUNUUyA9IE00T1NBX1RSVUU7Ci0gICAgICAgIGVyciA9IHBDLT5tX3BWaWRlb0RlY29kZXItPm1fcEZjdEdldE9wdGlvbihwQy0+cFZpRGVjQ3R4dCwKLSAgICAgICAgICAgIE00REVDT0RFUl9rT3B0aW9uSURfQVZDTGFzdERlY29kZWRGcmFtZUNUUywgJmxhc3RkZWNvZGVkQ1RTKTsKLQotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZzogbV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RHZXRPcHRpb24gcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgLyogRG8gbm90IG5lZWQgdmlkZW8gZGVjb2RlciBhbnkgbW9yZSwgbmVlZCB0byBkZXN0cm95IGl0LiBPdGhlcndpc2UgaXQKLSAgICAgICAgICogd2lsbCBjYWxsIHJlYWRlciBmdW5jdGlvbiB3aGljaCB3aWxsIGNhdXNlIGZyYW1lIGxvc3QgZHVyaW5nIHRyaW1pbmcsCi0gICAgICAgICAqIHNpbmNlIHRoZSAzZ3AgcmVhZGVyIGlzIHNoYXJlZCBiZXR3ZWVuIE1DUyBhbmQgZGVjb2Rlci4qLwotICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+cFZpRGVjQ3R4dCkgewotICAgICAgICAgICAgZXJyID0gcEMtPm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0RGVzdHJveShwQy0+cFZpRGVjQ3R4dCk7Ci0gICAgICAgICAgICBwQy0+cFZpRGVjQ3R4dCA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2Rpbmc6IGRlY29kZXIgcEZjdERlc3Ryb3kgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0SnVtcChwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyVmlkZW9TdHJlYW0sICZsYXN0ZGVjb2RlZENUUyk7Ci0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2Rpbmc6IG1fcEZjdEp1bXAoVikgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8qIEluaXRpYWxpemVzIGFuIGFjY2VzcyBVbml0ICovCi0KLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0RmlsbEF1U3RydWN0KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSwgJmxSZWFkZXJWaWRlb0FVKTsKLQotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZzptX3BSZWFkZXItPm1fcEZjdEZpbGxBdVN0cnVjdCh2aWRlbylcCi0gICAgICAgICAgICAgICAgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cFJlYWRlclZpZGVvU3RyZWFtLCAmbFJlYWRlclZpZGVvQVUpOwotCi0gICAgICAgIGlmIChNNFdBUl9OT19NT1JFX0FVID09IGVycikgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nKCk6XAotICAgICAgICAgICAgICAgICBtX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdSh2aWRlbykgcmV0dXJucyBNNFdBUl9OT19NT1JFX0FVIik7Ci0gICAgICAgICAgICAvKiBUaGUgYXVkaW8gdHJhbnNjb2RpbmcgaXMgZmluaXNoZWQgKi8KLSAgICAgICAgICAgIHBDLT5WaWRlb1N0YXRlID0gTTRNQ1Nfa1N0cmVhbVN0YXRlX0ZJTklTSEVEOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nKCk6XAotICAgICAgICAgICAgICAgICBtX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdSh2aWRlbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIiMjIyBbVFNfQ0hFQ0tdIE00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nICB2aWRlbyBBVSBDVFM6ICVkICIsCi0gICAgICAgICAgICBsUmVhZGVyVmlkZW9BVS5tX0NUUyk7Ci0KLQotICAgIH0KLQotCi0gICAgcEMtPmJMYXN0RGVjb2RlZEZyYW1lQ1RTID0gTTRPU0FfVFJVRTsKLQotCi0gICAgLyogRmluZCB0aGUgbmV4dCBBVSBkdXJhdGlvbiB0byBvYnRhaW4gYSBtb3JlIHByZWNpc2UgdmlkZW8gZW5kIGN1dCovCi0gICAgLyoqCi0gICAgKiBJbml0aWFsaXplcyBhIG5ldyBBVSBpZiBuZWVkZWQgKi8KLQotICAgIGlmIChwQy0+UmVhZGVyVmlkZW9BVTEubV9zdHJ1Y3RTaXplID09IDApIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogSW5pdGlhbGl6ZXMgYW4gYWNjZXNzIFVuaXQgKi8KLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0RmlsbEF1U3RydWN0KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSwKLSAgICAgICAgICAgICZwQy0+UmVhZGVyVmlkZW9BVTEpOwotCi0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX29wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QodmlkZW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczEgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+UmVhZGVyVmlkZW9BVTEubV9tYXhzaXplLCBNNE1DUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopIlRlbXBvcmFyeSB2aWRlbyBBVTEgYnVmZmVyIik7Ci0KLSAgICAgICAgaWYgKHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcoKTogYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSwKLSAgICAgICAgICAgICZwQy0+UmVhZGVyVmlkZW9BVTEpOwotCi0gICAgICAgIGlmKCBNNFdBUl9OT19NT1JFX0FVID09IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZygpOlwKLSAgICAgICAgICAgICAgICAgbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUodmlkZW8pIHJldHVybnMgTTRXQVJfTk9fTU9SRV9BVSIpOwotICAgICAgICAgICAgLyogVGhlIGF1ZGlvIHRyYW5zY29kaW5nIGlzIGZpbmlzaGVkICovCi0gICAgICAgICAgICBwQy0+VmlkZW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcoKTogbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUodmlkZW8pXAotICAgICAgICAgICAgICAgICByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBwQy0+UmVhZGVyVmlkZW9BVTEubV9tYXhzaXplCi0gICAgICAgICAgICA+IHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogQ29uc3RhbnQgbWVtb3J5IHJlYWRlciBjYXNlLCB3ZSBuZWVkIHRvIHJlYWxsb2NhdGUgdGhlIHRlbXBvcmFyeSBidWZmZXJzICovCi0gICAgICAgICAgICBNNE1DU19pbnRSZWFsbG9jVGVtcG9yYXJ5QVUoKE00T1NBX01lbUFkZHI4Ci0gICAgICAgICAgICAgICAgKikgJihwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczEpLCBwQy0+UmVhZGVyVmlkZW9BVTEubV9tYXhzaXplKTsKLSAgICAgICAgICAgIC8qIHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMQotICAgICAgICAgICAgYW5kIHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMiBtdXN0IGJlIHJlYWxsb2NhdGVkIGF0IHRoZSBzYW1lIHRpbWUgKi8KLSAgICAgICAgICAgIC8qIGJlY2F1c2UgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUgdGFrZSBtYXhpbXVtIHZhbHVlLgotICAgICAgICAgICAgIFRoZW4gdGhlIHRlc3QgImlmKHBDLT5SZWFkZXJWaWRlb0FVPy5tX21heHNpemUgPiBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSkiIGlzIG5ldmVyIHRydWUgKi8KLSAgICAgICAgICAgIC8qIGFuZCB0aGUgc2l6ZSBvZiB0aGUgc2Vjb25kIGJ1ZmZlciBpcyBuZXZlciBjaGFuZ2VkLiAqLwotICAgICAgICAgICAgTTRNQ1NfaW50UmVhbGxvY1RlbXBvcmFyeUFVKChNNE9TQV9NZW1BZGRyOAotICAgICAgICAgICAgICAgICopICYocEMtPm1fcERhdGFWaWRlb0FkZHJlc3MyKSwgcEMtPlJlYWRlclZpZGVvQVUxLm1fbWF4c2l6ZSk7Ci0gICAgICAgICAgICAvKiBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczEgYW5kCi0gICAgICAgICAgICBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczIgbXVzdCBiZSByZWFsbG9jYXRlZCBhdCB0aGUgc2FtZSB0aW1lICovCi0gICAgICAgICAgICAvKiBVcGRhdGUgc3RyZWFtIHByb3BlcnRpZXMgKi8KLSAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplID0KLSAgICAgICAgICAgICAgICBwQy0+UmVhZGVyVmlkZW9BVTEubV9tYXhzaXplOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMSwKLSAgICAgICAgICAgICh2b2lkICopcEMtPlJlYWRlclZpZGVvQVUxLm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICBwQy0+UmVhZGVyVmlkZW9BVTEubV9zaXplKTsKLSAgICB9Ci0KLSAgICBpZiggcEMtPlJlYWRlclZpZGVvQVUyLm1fc3RydWN0U2l6ZSA9PSAwICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEluaXRpYWxpemVzIGFuIGFjY2VzcyBVbml0ICovCi0gICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdEZpbGxBdVN0cnVjdChwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyVmlkZW9TdHJlYW0sCi0gICAgICAgICAgICAmcEMtPlJlYWRlclZpZGVvQVUyKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1Nfb3BlbigpOiBtX3BSZWFkZXItPm1fcEZjdEZpbGxBdVN0cnVjdCh2aWRlbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczIgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+UmVhZGVyVmlkZW9BVTIubV9tYXhzaXplLCBNNE1DUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopIlRlbXBvcmFyeSB2aWRlbyBBVSBidWZmZXIiKTsKLQotICAgICAgICBpZiggcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MyID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcoKTogYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qKgotICAgICogUmVhZCB0aGUgbmV4dCB2aWRlbyBBVSBpbiB0aGUgaW5wdXQgZmlsZSAqLwotICAgIGlmKCBwQy0+UmVhZGVyVmlkZW9BVTIubV9DVFMgPiBwQy0+UmVhZGVyVmlkZW9BVTEubV9DVFMgKQotICAgIHsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopICZwQy0+UmVhZGVyVmlkZW9BVSwKLSAgICAgICAgICAgICh2b2lkICopICZwQy0+UmVhZGVyVmlkZW9BVTIsIHNpemVvZihNNF9BY2Nlc3NVbml0KSk7Ci0gICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdShwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyVmlkZW9TdHJlYW0sCi0gICAgICAgICAgICAmcEMtPlJlYWRlclZpZGVvQVUxKTsKLQotICAgICAgICBpZiggcEMtPlJlYWRlclZpZGVvQVUxLm1fbWF4c2l6ZQotICAgICAgICAgICAgPiBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIENvbnN0YW50IG1lbW9yeSByZWFkZXIgY2FzZSwgd2UgbmVlZCB0byByZWFsbG9jYXRlIHRoZSB0ZW1wb3JhcnkgYnVmZmVycyAqLwotICAgICAgICAgICAgTTRNQ1NfaW50UmVhbGxvY1RlbXBvcmFyeUFVKChNNE9TQV9NZW1BZGRyOAotICAgICAgICAgICAgICAgICopICYocEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxKSwgcEMtPlJlYWRlclZpZGVvQVUxLm1fbWF4c2l6ZSk7Ci0gICAgICAgICAgICAvKiBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczEgYW5kCi0gICAgICAgICAgICAgcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MyIG11c3QgYmUgcmVhbGxvY2F0ZWQgYXQgdGhlIHNhbWUgdGltZSAqLwotICAgICAgICAgICAgLyogYmVjYXVzZSBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSB0YWtlIG1heGltdW0gdmFsdWUuCi0gICAgICAgICAgICAgVGhlbiB0aGUgdGVzdCAiaWYocEMtPlJlYWRlclZpZGVvQVU/Lm1fbWF4c2l6ZSA+IHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplKSIgaXMgbmV2ZXIgdHJ1ZSAqLwotICAgICAgICAgICAgLyogYW5kIHRoZSBzaXplIG9mIHRoZSBzZWNvbmQgYnVmZmVyIGlzIG5ldmVyIGNoYW5nZWQuICovCi0gICAgICAgICAgICBNNE1DU19pbnRSZWFsbG9jVGVtcG9yYXJ5QVUoKE00T1NBX01lbUFkZHI4Ci0gICAgICAgICAgICAgICAgKikgJihwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczIpLCBwQy0+UmVhZGVyVmlkZW9BVTEubV9tYXhzaXplKTsKLSAgICAgICAgICAgIC8qIHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMSBhbmQKLSAgICAgICAgICAgIHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMiBtdXN0IGJlIHJlYWxsb2NhdGVkIGF0IHRoZSBzYW1lIHRpbWUgKi8KLSAgICAgICAgICAgIC8qIFVwZGF0ZSBzdHJlYW0gcHJvcGVydGllcyAqLwotICAgICAgICAgICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUgPQotICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJWaWRlb0FVMS5tX21heHNpemU7Ci0gICAgICAgIH0KLSAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxLAotICAgICAgICAgICAgKHZvaWQgKilwQy0+UmVhZGVyVmlkZW9BVTEubV9kYXRhQWRkcmVzcywKLSAgICAgICAgICAgIHBDLT5SZWFkZXJWaWRlb0FVMS5tX3NpemUpOwotICAgICAgICB2aWRlb0FVRHVyYXRpb24gPSBwQy0+UmVhZGVyVmlkZW9BVTEubV9DVFMgLSBwQy0+UmVhZGVyVmlkZW9BVTIubV9DVFM7Ci0gICAgICAgIHBDLT5SZWFkZXJWaWRlb0FVLm1fZGF0YUFkZHJlc3MgPSBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKSAmcEMtPlJlYWRlclZpZGVvQVUsCi0gICAgICAgICAgICAodm9pZCAqKSAmcEMtPlJlYWRlclZpZGVvQVUxLCBzaXplb2YoTTRfQWNjZXNzVW5pdCkpOwotICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cFJlYWRlclZpZGVvU3RyZWFtLAotICAgICAgICAgICAgJnBDLT5SZWFkZXJWaWRlb0FVMik7Ci0KLSAgICAgICAgaWYoIHBDLT5SZWFkZXJWaWRlb0FVMi5tX21heHNpemUKLSAgICAgICAgICAgID4gcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDb25zdGFudCBtZW1vcnkgcmVhZGVyIGNhc2UsIHdlIG5lZWQgdG8gcmVhbGxvY2F0ZSB0aGUgdGVtcG9yYXJ5IGJ1ZmZlcnMgKi8KLSAgICAgICAgICAgIE00TUNTX2ludFJlYWxsb2NUZW1wb3JhcnlBVSgoTTRPU0FfTWVtQWRkcjgKLSAgICAgICAgICAgICAgICAqKSAmKHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMiksIHBDLT5SZWFkZXJWaWRlb0FVMi5tX21heHNpemUpOwotICAgICAgICAgICAgLyogcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxIGFuZAotICAgICAgICAgICAgIHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMiBtdXN0IGJlIHJlYWxsb2NhdGVkIGF0IHRoZSBzYW1lIHRpbWUgKi8KLSAgICAgICAgICAgIC8qIGJlY2F1c2UgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUgdGFrZSBtYXhpbXVtIHZhbHVlLgotICAgICAgICAgICAgIFRoZW4gdGhlIHRlc3QgImlmKHBDLT5SZWFkZXJWaWRlb0FVPy5tX21heHNpemUgPiBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSkiIGlzIG5ldmVyIHRydWUgKi8KLSAgICAgICAgICAgIC8qIGFuZCB0aGUgc2l6ZSBvZiB0aGUgc2Vjb25kIGJ1ZmZlciBpcyBuZXZlciBjaGFuZ2VkLiAqLwotICAgICAgICAgICAgTTRNQ1NfaW50UmVhbGxvY1RlbXBvcmFyeUFVKChNNE9TQV9NZW1BZGRyOAotICAgICAgICAgICAgICAgICopICYocEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxKSwgcEMtPlJlYWRlclZpZGVvQVUyLm1fbWF4c2l6ZSk7Ci0gICAgICAgICAgICAvKiBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczEgYW5kCi0gICAgICAgICAgICBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczIgbXVzdCBiZSByZWFsbG9jYXRlZCBhdCB0aGUgc2FtZSB0aW1lICovCi0gICAgICAgICAgICAvKiBVcGRhdGUgc3RyZWFtIHByb3BlcnRpZXMgKi8KLSAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplID0KLSAgICAgICAgICAgICAgICBwQy0+UmVhZGVyVmlkZW9BVTIubV9tYXhzaXplOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMiwKLSAgICAgICAgICAgICh2b2lkICopcEMtPlJlYWRlclZpZGVvQVUyLm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICBwQy0+UmVhZGVyVmlkZW9BVTIubV9zaXplKTsKLSAgICAgICAgdmlkZW9BVUR1cmF0aW9uID0gcEMtPlJlYWRlclZpZGVvQVUyLm1fQ1RTIC0gcEMtPlJlYWRlclZpZGVvQVUxLm1fQ1RTOwotICAgICAgICBwQy0+UmVhZGVyVmlkZW9BVS5tX2RhdGFBZGRyZXNzID0gcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxOwotICAgIH0KLQotICAgIGlmKCBNNFdBUl9OT19NT1JFX0FVID09IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICJNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZygpOlwKLSAgICAgICAgICAgICBtX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdSh2aWRlbykgcmV0dXJucyBNNFdBUl9OT19NT1JFX0FVIik7Ci0gICAgICAgIC8qIFRoZSB2aWRlbyB0cmFuc2NvZGluZyBpcyBmaW5pc2hlZCAqLwotICAgICAgICBwQy0+VmlkZW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcoKTogbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUoVmlkZW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBQcmVwYXJlIHRoZSB3cml0ZXIgQVUgKi8KLSAgICAgICAgZXJyID0gcEMtPnBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUocEMtPnBXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgTTRNQ1NfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRCwgJnBDLT5Xcml0ZXJWaWRlb0FVKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcoKTogcFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShWaWRlbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIENvcHkgdmlkZW8gZGF0YSBmcm9tIHJlYWRlciBBVSB0byB3cml0ZXIgQVUgKi8KLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZygpOiBDb3B5aW5nIHZpZGVvIEFVOiBzaXplPSVkIiwKLSAgICAgICAgICAgICAgICBwQy0+UmVhZGVyVmlkZW9BVS5tX3NpemUpOwotICAgICAgICAgICAgLyogKyBDUkxWNjc3NSAtSC4yNjQgVHJpbW1pbmcgKi8KLSAgICAgICAgICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iSDI2NFRyaW0gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBwQy0+SDI2NE1DU1RlbXBCdWZmZXJTaXplCi0gICAgICAgICAgICAgICAgICAgIDwgKHBDLT5SZWFkZXJWaWRlb0FVLm1fc2l6ZSArIDIwNDgpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5IMjY0TUNTVGVtcEJ1ZmZlclNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgKHBDLT5SZWFkZXJWaWRlb0FVLm1fc2l6ZSArIDIwNDgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+SDI2NE1DU1RlbXBCdWZmZXIgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocEMtPkgyNjRNQ1NUZW1wQnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwQy0+SDI2NE1DU1RlbXBCdWZmZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBDLT5IMjY0TUNTVGVtcEJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE1DUywgKE00T1NBX0NoYXIgKikicEMtPkgyNjRNQ1NUZW1wQnVmZmVyIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5IMjY0TUNTVGVtcEJ1ZmZlciA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nKCk6IGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBDLT5IMjY0TUNTVGVtcEJ1ZmZlckRhdGFTaXplID0gcEMtPkgyNjRNQ1NUZW1wQnVmZmVyU2l6ZTsKLQotICAgICAgICAgICAgICAgIGVyciA9IEgyNjRNQ1NfUHJvY2Vzc05BTFUocEMtPm1fcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilwQy0+UmVhZGVyVmlkZW9BVS5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICBwQy0+UmVhZGVyVmlkZW9BVS5tX3NpemUsIHBDLT5IMjY0TUNTVGVtcEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyICopJnBDLT5IMjY0TUNTVGVtcEJ1ZmZlckRhdGFTaXplKTsKLQotICAgICAgICAgICAgICAgIGlmKCBwQy0+bV9wSW5zdGFuY2UtPmlzX2RvbmUgPT0gMSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE1DU19jb252ZXRGcm9tQnl0ZVN0cmVhbXRvTkFMU3RyZWFtKAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopcEMtPlJlYWRlclZpZGVvQVUubV9kYXRhQWRkcmVzcyAsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+UmVhZGVyVmlkZW9BVS5tX3NpemUpOwotCi0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5Xcml0ZXJWaWRlb0FVLmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikocEMtPlJlYWRlclZpZGVvQVUubV9kYXRhQWRkcmVzcyArIDQpLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPlJlYWRlclZpZGVvQVUubV9zaXplIC0gNCk7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJWaWRlb0FVLnNpemUgPSBwQy0+UmVhZGVyVmlkZW9BVS5tX3NpemUgLSA0OwotICAgICAgICAgICAgICAgICAgICBXcml0ZWJ1ZmZlckFkZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcEMtPldyaXRlclZpZGVvQVUuZGF0YUFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5Xcml0ZXJWaWRlb0FVLmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikocEMtPkgyNjRNQ1NUZW1wQnVmZmVyICsgNCksCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+SDI2NE1DU1RlbXBCdWZmZXJEYXRhU2l6ZSAtIDQpOwotICAgICAgICAgICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9BVS5zaXplID0gcEMtPkgyNjRNQ1NUZW1wQnVmZmVyRGF0YVNpemUgLSA0OwotICAgICAgICAgICAgICAgICAgICBXcml0ZWJ1ZmZlckFkZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcEMtPldyaXRlclZpZGVvQVUuZGF0YUFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogSC4yNjQgVHJpbW1pbmcgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+V3JpdGVyVmlkZW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+UmVhZGVyVmlkZW9BVS5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICBwQy0+UmVhZGVyVmlkZW9BVS5tX3NpemUpOwotICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJWaWRlb0FVLnNpemUgPSBwQy0+UmVhZGVyVmlkZW9BVS5tX3NpemU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQ29udmVydCBDVFMgdW5pdCBmcm9tIG1pbGxpc2Vjb25kcyB0byB0aW1lc2NhbGUgKi8KLSAgICAgICAgICAgIHBDLT5Xcml0ZXJWaWRlb0FVLkNUUyA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1RpbWUpKCgoIHBDLT5SZWFkZXJWaWRlb0FVLm1fQ1RTIC0gcEMtPmRWaURlY1N0YXJ0aW5nQ3RzKQotICAgICAgICAgICAgICAgICogKHBDLT5Xcml0ZXJWaWRlb1N0cmVhbS50aW1lU2NhbGUgLyAxMDAwLjApKSk7Ci0gICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9BVS5uYkZyYWcgPSAwOwotICAgICAgICAgICAgcEMtPldyaXRlclZpZGVvQVUuYXR0cmlidXRlID0gcEMtPlJlYWRlclZpZGVvQVUubV9hdHRyaWJ1dGU7Ci0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKCJNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZygpOiB2aWRlbyBBVTogQ1RTPSVkIG1zIiwKLSAgICAgICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9BVS5DVFMpOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFdyaXRlIGl0IHRvIHRoZSBvdXRwdXQgZmlsZSAqLwotICAgICAgICBwQy0+dWlWaWRlb0FVQ291bnQrKzsKLSAgICAgICAgZXJyID0gcEMtPnBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVShwQy0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICBNNE1DU19XUklURVJfVklERU9fU1RSRUFNX0lELCAmcEMtPldyaXRlclZpZGVvQVUpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZygpOiBwV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUoVmlkZW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgLyogKyBDUkxWNjc3NSAtSC4yNjQgVHJpbW1pbmcgKi8KLSAgICAgICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJIMjY0VHJpbSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBwQy0+bV9wSW5zdGFuY2UtPmlzX2RvbmUgPT0gMSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopKFdyaXRlYnVmZmVyQWRkIC0gNCksCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopKHBDLT5SZWFkZXJWaWRlb0FVLm1fZGF0YUFkZHJlc3MpLCA0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKikoV3JpdGVidWZmZXJBZGQgLSA0KSwKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikocEMtPkgyNjRNQ1NUZW1wQnVmZmVyKSwgNCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gLyogSC4yNjQgVHJpbW1pbmcgKi8KLSAgICB9Ci0gICAgLyoqCi0gICAgKiBDaGVjayBmb3IgZW5kIGN1dC4gKi8KLSAgICAvKiBCdWcgZml4IDExLzEyLzIwMDg6IFdlIGFic29sdXRlbHkgd2FudCB0byBoYXZlIGxlc3Mgb3Igc2FtZSB2aWRlbyBkdXJhdGlvbiAtPgotICAgICgyKnZpZGVvQVVEdXJhdGlvbikgdG8gaGF2ZSBhIG1vcmUgcHJlY2lzZSBlbmQgY3V0Ki8KLSAgICBpZiggcEMtPlJlYWRlclZpZGVvQVUubV9DVFMgKyAoMiAqdmlkZW9BVUR1cmF0aW9uKSA+IHBDLT51aUVuZEN1dFRpbWUgKQotICAgIHsKLSAgICAgICAgcEMtPlZpZGVvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfRklOSVNIRUQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZygpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19pbnRWaWRlb1RyYW5zY29kaW5nKE00TUNTX0ludGVybmFsQ29udGV4dCogcEMpCi0gKiBAYXV0aG9yICAgQWxleGlzIFZhcGlsbG9uIChOWFAgU29mdHdhcmUgVmlzaW9uKQotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRWaWRlb1RyYW5zY29kaW5nKCBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNF9NZWRpYVRpbWUgbXRUcmFuc2NvZGVkVGltZSA9IDAuMDsKLSAgICBNNEVOQ09ERVJfRnJhbWVNb2RlIEZyYW1lTW9kZTsKLSAgICBNNE9TQV9JbnQzMiBkZXJpdmUgPSAwOwotCi0gICAgLyoqCi0gICAgKiBHZXQgdmlkZW8gQ1RTIHRvIGRlY29kZSAqLwotICAgIG10VHJhbnNjb2RlZFRpbWUgPSBwQy0+ZFZpRGVjQ3VycmVudEN0czsKLSAgICBGcmFtZU1vZGUgPSBNNEVOQ09ERVJfa05vcm1hbEZyYW1lOwotCi0gICAgLyoqCi0gICAgKiBEZWNvZGUgdmlkZW8gKi8KLSAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgIk00TUNTX2ludFZpZGVvVHJhbnNjb2RpbmcoKTogQ2FsbGluZyBtX3BWaWRlb0RlY29kZXItPm1fcEZjdERlY29kZSglLjJmKSIsCi0gICAgICAgIG10VHJhbnNjb2RlZFRpbWUpOwotICAgIHBDLT5pc1JlbmRlckR1cCA9IE00T1NBX0ZBTFNFOwotICAgIGVyciA9IHBDLT5tX3BWaWRlb0RlY29kZXItPm1fcEZjdERlY29kZShwQy0+cFZpRGVjQ3R4dCwgJm10VHJhbnNjb2RlZFRpbWUsCi0gICAgICAgIE00T1NBX0ZBTFNFLCAwKTsKLQotICAgIGlmKCBNNFdBUl9OT19NT1JFX0FVID09IGVyciApCi0gICAgewotICAgICAgICBGcmFtZU1vZGUgPQotICAgICAgICAgICAgTTRFTkNPREVSX2tMYXN0RnJhbWU7IC8qKjwgV2Ugd2lsbCBnaXZlIHRoaXMgdmFsdWUgdG8gdGhlIGVuY29kZXIgdG8KLSAgICAgICAgICAgIGFzayBmb3IgdGhlIGVuZCBvZiB0aGUgZW5jb2RpbmcgKi8KLSAgICAgICAgcEMtPlZpZGVvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfRklOSVNIRUQ7Ci0gICAgfQotICAgIGVsc2UgaWYoIGVyciA9PSBNNFdBUl9WSURFT1JFTkRFUkVSX05PX05FV19GUkFNRSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTJfMCgiRGVjb2Rpbmcgb3V0cHV0IHRoZSBzYW1lIGZyYW1lIGFzIGJlZm9yZSAzIik7Ci0gICAgICAgIHBDLT5pc1JlbmRlckR1cCA9IE00T1NBX1RSVUU7Ci0gICAgfQotICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludFZpZGVvVHJhbnNjb2RpbmcoKTogbV9wVmlkZW9EZWNvZGVyLT5tX3BGY3REZWNvZGUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2hlY2sgZm9yIGVuZCBjdXQuCi0gICAgKiBXZSBtdXN0IGNoZWNrIGhlcmUgaWYgdGhlIGVuZCBjdXQgaXMgcmVhY2hlZCwgYmVjYXVzZSBpbiB0aGF0IGNhc2Ugd2UgbXVzdAotICAgICogY2FsbCB0aGUgbGFzdCBlbmNvZGUgc3RlcCAoLT4gYkxhc3RGcmFtZSBzZXQgdG8gdHJ1ZSkgKi8KLSAgICBpZiggKCBwQy0+ZFZpRGVjQ3VycmVudEN0cyArIHBDLT5kQ3RzSW5jcmVtZW50ICkgPj0gKHBDLT51aUVuZEN1dFRpbWUKLSAgICAgICAgKyBNNE1DU19BQlMocEMtPmRWaURlY1N0YXJ0aW5nQ3RzIC0gcEMtPnVpQmVnaW5DdXRUaW1lKSkgKQotICAgIHsKLSAgICAgICAgRnJhbWVNb2RlID0KLSAgICAgICAgICAgIE00RU5DT0RFUl9rTGFzdEZyYW1lOyAvKio8IFdlIHdpbGwgZ2l2ZSB0aGlzIHZhbHVlIHRvIHRoZSBlbmNvZGVyIHRvCi0gICAgICAgICAgICBhc2sgZm9yIHRoZSBlbmQgb2YgdGhlIGVuY29kaW5nICovCi0gICAgICAgIHBDLT5WaWRlb1N0YXRlID0gTTRNQ1Nfa1N0cmVhbVN0YXRlX0ZJTklTSEVEOwotICAgICAgICBkZXJpdmUgPSAoTTRPU0FfSW50MzIpKCggcEMtPmRWaURlY0N1cnJlbnRDdHMgKyBwQy0+ZEN0c0luY3JlbWVudCArIDAuNSkKLSAgICAgICAgICAgIC0gKHBDLT51aUVuZEN1dFRpbWUKLSAgICAgICAgICAgICsgTTRNQ1NfQUJTKHBDLT5kVmlEZWNTdGFydGluZ0N0cyAtIHBDLT51aUJlZ2luQ3V0VGltZSkpKTsKLSAgICB9Ci0KLSAgICAvKiBVcGRhdGUgc3RhcnRpbmcgQ1RTIHRvIGhhdmUgYSBtb3JlIHByZWNpc2UgdmFsdWUgKAotICAgIHRoZSBiZWdpbiBjdXQgaXMgbm90IGEgcmVhbCBDVFMpKi8KLSAgICBpZiggcEMtPnVpVmlkZW9BVUNvdW50ID09IDAgKQotICAgIHsKLSAgICAgICAgcEMtPmRWaURlY1N0YXJ0aW5nQ3RzID0gbXRUcmFuc2NvZGVkVGltZTsKLSAgICAgICAgcEMtPmRWaURlY0N1cnJlbnRDdHMgPSBwQy0+ZFZpRGVjU3RhcnRpbmdDdHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBFbmNvZGUgdmlkZW8gKi8KLSAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgIk00TUNTX2ludFZpZGVvVHJhbnNjb2RpbmcoKTogQ2FsbGluZyBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEVuY29kZSB3aXRoIHZpZGVvQ3RzXAotICAgICAgICAgPSAlLjJmIixwQy0+UmVhZGVyVmlkZW9BVS5tX0NUUyk7Ci0gICAgcEMtPnVpVmlkZW9BVUNvdW50Kys7Ci0gICAgLyogdXBkYXRlIHRoZSBnaXZlbiBkdXJhdGlvbiAodGhlIGJlZ2luIGN1dCBpcyBub3QgYSByZWFsIENUUykqLwotICAgIGVyciA9IHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEVuY29kZShwQy0+cFZpRW5jQ3R4dCwgTTRPU0FfTlVMTCwKLSAgICAgICAgKHBDLT5kVmlEZWNDdXJyZW50Q3RzIC0gcEMtPmRWaURlY1N0YXJ0aW5nQ3RzIC0gKGRlcml2ZSA+PiAxKSksCi0gICAgICAgIEZyYW1lTW9kZSk7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19pbnRHZXRJbnB1dENsaXBQcm9wZXJ0aWVzKE00TUNTX0ludGVybmFsQ29udGV4dCogcENvbnRleHQpCi0gKiBAYXV0aG9yICAgRG91bnlhIE1hbmFpIChOWFAgU29mdHdhcmUgVmlzaW9uKQotICogQGJyaWVmICAgIFJldHJpZXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBhdWRpbyBhbmQgdmlkZW8gc3RyZWFtcyBmcm9tIHRoZSBpbnB1dCBmaWxlLgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKElmIERlYnVnIExldmVsID49IDIpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50R2V0SW5wdXRDbGlwUHJvcGVydGllcyggTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApCi17Ci0gICAgTTRERUNPREVSX01QRUc0X0RlY29kZXJDb25maWdJbmZvIERlY0NvbmZJbmZvOwotICAgIE00UkVBREVSXzNHUF9IMjYzUHJvcGVydGllcyBIMjYzcHJvcDsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX1VJbnQzMiB2aWRlb0JpdHJhdGU7Ci0gICAgTTRERUNPREVSX1ZpZGVvU2l6ZSB2aWRlb1NpemU7Ci0gICAgTTRfQUFDVHlwZSBpQWFjVHlwZSA9IDA7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQywgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1NfaW50R2V0SW5wdXRDbGlwUHJvcGVydGllczogcEMgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgKiBSZXNldCBjb21tb24gY2hhcmFjdGVyaXN0aWNzICovCi0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuYkFuYWx5c2VkID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuRmlsZVR5cGUgPSAwOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZlcnNpb25bMF0gPSBNNFZJREVPRURJVElOR19WRVJTSU9OX01BSk9SOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZlcnNpb25bMV0gPSBNNFZJREVPRURJVElOR19WRVJTSU9OX01JTk9SOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZlcnNpb25bMl0gPSBNNFZJREVPRURJVElOR19WRVJTSU9OX1JFVklTSU9OOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uID0gMDsKLQotICAgIG1lbXNldCgodm9pZCAqKSAmcEMtPklucHV0RmlsZVByb3BlcnRpZXMuZnR5cCwKLSAgICAgICAgMCwgc2l6ZW9mKE00VklERU9FRElUSU5HX0Z0eXBCb3gpKTsKLQotICAgIC8qKgotICAgICogUmVzZXQgdmlkZW8gY2hhcmFjdGVyaXN0aWNzICovCi0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa05vbmVWaWRlbzsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBWaWRlb0R1cmF0aW9uID0gMDsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZSA9IDA7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb01heEF1U2l6ZSA9IDA7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb1dpZHRoID0gMDsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvSGVpZ2h0ID0gMDsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvVGltZVNjYWxlID0gMDsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5mQXZlcmFnZUZyYW1lUmF0ZSA9IDAuMDsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvTGV2ZWwgPQotICAgICAgICBNNFZJREVPRURJVElOR19WSURFT19VTktOT1dOX0xFVkVMOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9Qcm9maWxlID0KLSAgICAgICAgTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9QUk9GSUxFOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmJNUEVHNGRhdGFQYXJ0aXRpb24gPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5iTVBFRzRydmxjID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuYk1QRUc0cmVzeW5jaE1hcmtlciA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyoqCi0gICAgKiBSZXNldCBhdWRpbyBjaGFyYWN0ZXJpc3RpY3MgKi8KLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcEF1ZGlvRHVyYXRpb24gPSAwOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQXVkaW9CaXRyYXRlID0gMDsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUF1ZGlvTWF4QXVTaXplID0gMDsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aU5iQ2hhbm5lbHMgPSAwOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kgPSAwOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpRXh0ZW5kZWRTYW1wbGluZ0ZyZXF1ZW5jeSA9IDA7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlEZWNvZGVkUGNtU2l6ZSA9IDA7Ci0KLSAgICAvKiBSZXNldCBjb21wYXRpYmlsaXR5IGNoYXJ0IChub3QgdXNlZCBpbiBNQ1MpICovCi0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuYlZpZGVvSXNFZGl0YWJsZSA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmJBdWRpb0lzRWRpdGFibGUgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5iVmlkZW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcCA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKioKLSAgICAqIFZpZGVvIHN0cmVhbSBwcm9wZXJ0aWVzICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSApCi0gICAgewotICAgICAgICBzd2l0Y2goIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNDoKLSAgICAgICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rTVBFRzQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVmlkZW9IMjYzOgotICAgICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9IE00VklERU9FRElUSU5HX2tIMjYzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmM6Ci0gICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa0gyNjQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVW5rbm93bjoKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID0KLSAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa1Vuc3VwcG9ydGVkVmlkZW87Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBpZiBiaXRyYXRlIG5vdCBhdmFpbGFibGUgcmV0cmlldmUgYW4gZXN0aW1hdGlvbiBvZiB0aGUgb3ZlcmFsbCBiaXRyYXRlICovCi0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9CaXRyYXRlID0KLSAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fYXZlcmFnZUJpdFJhdGU7Ci0KLSAgICAgICAgaWYoIDAgPT0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+bV9wUmVhZGVyLT5tX3BGY3RHZXRPcHRpb24ocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIE00UkVBREVSX2tPcHRpb25JRF9CaXRyYXRlLCAmdmlkZW9CaXRyYXRlKTsKLQotICAgICAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogd2UgZ2V0IHRoZSBvdmVyYWxsIGJpdHJhdGUsIHN1YnN0cmFjdCB0aGUgYXVkaW8gYml0cmF0ZSBpZiBhbnkgKi8KLSAgICAgICAgICAgICAgICB2aWRlb0JpdHJhdGUgLT0KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9hdmVyYWdlQml0UmF0ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9CaXRyYXRlID0gdmlkZW9CaXRyYXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogUmV0cmlldmUgdGhlIFByb2ZpbGUgJiBMZXZlbCAqLwotICAgICAgICBpZiggKCBNNFZJREVPRURJVElOR19rSDI2MyAhPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUpCi0gICAgICAgICAgICAmJiAoTTRWSURFT0VESVRJTkdfa0gyNjQKLSAgICAgICAgICAgICE9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBVc2UgdGhlIERTSSBwYXJzaW5nIGZ1bmN0aW9uIGZyb20gdGhlIGV4dGVybmFsIHZpZGVvIHNoZWxsIGRlY29kZXIuCi0gICAgICAgICAgICBTZWUgdGhlIGNvbW1lbnRzIGluIE00VlNTM0dQUF9DbGlwQW5hbHlzaXMuYywgaXQncyBwcmV0dHkgbXVjaCB0aGUKLSAgICAgICAgICAgIHNhbWUgaXNzdWUuICovCi0KLSAgICAgICAgICAgIGVyciA9IE00REVDT0RFUl9FWFRFUk5BTF9QYXJzZVZpZGVvRFNJKHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAmRGVjQ29uZkluZm8sICZ2aWRlb1NpemUpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50R2V0SW5wdXRDbGlwUHJvcGVydGllcygpOlwKLSAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9FWFRFUk5BTF9QYXJzZVZpZGVvRFNJIHJldHVybnMgMHglMDhYIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX3ZpZGVvV2lkdGggPSB2aWRlb1NpemUubV91aVdpZHRoOwotICAgICAgICAgICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV92aWRlb0hlaWdodCA9IHZpZGVvU2l6ZS5tX3VpSGVpZ2h0OwotICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb1RpbWVTY2FsZSA9IERlY0NvbmZJbmZvLnVpVGltZVNjYWxlOwotICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuYk1QRUc0ZGF0YVBhcnRpdGlvbiA9Ci0gICAgICAgICAgICAgICAgRGVjQ29uZkluZm8uYkRhdGFQYXJ0aXRpb247Ci0gICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5iTVBFRzRydmxjID0gRGVjQ29uZkluZm8uYlVzZU9mUlZMQzsKLSAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmJNUEVHNHJlc3luY2hNYXJrZXIgPQotICAgICAgICAgICAgICAgIERlY0NvbmZJbmZvLnVpVXNlT2ZSZXN5bmNoTWFya2VyOwotCi0gICAgICAgICAgICBlcnIgPSBnZXRNUEVHNFByb2ZpbGVBbmRMZXZlbChEZWNDb25mSW5mby51aVByb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAmKHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9Qcm9maWxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICYocEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb0xldmVsKSk7Ci0gICAgICAgICAgICBpZiAoIE00Tk9fRVJST1IgIT0gZXJyICkgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19pbnRHZXRJbnB1dENsaXBQcm9wZXJ0aWVzKCk6XAotICAgICAgICAgICAgICAgICAgICBnZXRNUEVHNFByb2ZpbGVBbmRMZXZlbCByZXR1cm5zIDB4JTA4WCIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBNNFZJREVPRURJVElOR19rSDI2MyA9PQotICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlICkgewotCi0gICAgICAgICAgICBlcnIgPSBnZXRIMjYzUHJvZmlsZUFuZExldmVsKHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAmKHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9Qcm9maWxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICYocEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb0xldmVsKSk7Ci0gICAgICAgICAgICBpZiAoIE00Tk9fRVJST1IgIT0gZXJyICkgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19pbnRHZXRJbnB1dENsaXBQcm9wZXJ0aWVzKCk6XAotICAgICAgICAgICAgICAgICAgICBnZXRIMjYzUHJvZmlsZUFuZExldmVsIHJldHVybnMgMHglMDhYIiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogRm9yIGgyNjMgc2V0IGRlZmF1bHQgdGltZXNjYWxlIDogMzAwMDA6MTAwMSAqLwotICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb1RpbWVTY2FsZSA9IDMwMDAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCBNNFZJREVPRURJVElOR19rSDI2NCA9PQotICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlICkgewotCi0gICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvVGltZVNjYWxlID0gMzAwMDA7Ci0gICAgICAgICAgICBlcnIgPSBnZXRBVkNQcm9maWxlQW5kTGV2ZWwocEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICYocEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb1Byb2ZpbGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgJihwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvTGV2ZWwpKTsKLSAgICAgICAgICAgIGlmICggTTROT19FUlJPUiAhPSBlcnIgKSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX2ludEdldElucHV0Q2xpcFByb3BlcnRpZXMoKTpcCi0gICAgICAgICAgICAgICAgICAgIGdldEFWQ1Byb2ZpbGVBbmRMZXZlbCByZXR1cm5zIDB4JTA4WCIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIEhlcmUgYmVjYXVzZSB3aWR0aCB4IGhlaWdodCBpcyBjb3JyZWN0IG9ubHkgYWZ0ZXIgZHNpIHBhcnNpbmcKLSAgICAgICAgKGRvbmUgaW4gY3JlYXRlIGRlY29kZXIpICovCi0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9IZWlnaHQgPQotICAgICAgICAgICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV92aWRlb0hlaWdodDsKLSAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb1dpZHRoID0KLSAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fdmlkZW9XaWR0aDsKLSAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwVmlkZW9EdXJhdGlvbiA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKXBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fZHVyYXRpb247Ci0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmZBdmVyYWdlRnJhbWVSYXRlID0KLSAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYXZlcmFnZUZyYW1lUmF0ZTsKLSAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb01heEF1U2l6ZSA9Ci0gICAgICAgICAgICBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZTsKLSAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudmlkZW9Sb3RhdGlvbkRlZ3JlZXMgPQotICAgICAgICAgICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+dmlkZW9Sb3RhdGlvbkRlZ3JlZXM7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iVW5zdXBwb3J0ZWRWaWRlb0ZvdW5kICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID0KLSAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rVW5zdXBwb3J0ZWRWaWRlbzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9IE00VklERU9FRElUSU5HX2tOb25lVmlkZW87Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEF1ZGlvIHN0cmVhbSBwcm9wZXJ0aWVzICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSApCi0gICAgewotICAgICAgICBzd2l0Y2goIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJOYXJyb3dCYW5kOgotICAgICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tBTVJfTkI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9BYWM6Ci0gICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa0FBQzsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb01wMzoKLSAgICAgICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rTVAzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvRXZyYzoKLSAgICAgICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rRVZSQzsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVVbmtub3duOgotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPQotICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rVW5zdXBwb3J0ZWRBdWRpbzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCAoIE00T1NBX05VTEwgIT0gcEMtPm1fcEF1ZGlvRGVjb2RlcikKLSAgICAgICAgICAgICYmIChNNE9TQV9OVUxMID09IHBDLT5wQXVkaW9EZWNDdHh0KSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRHZXRJbnB1dENsaXBQcm9wZXJ0aWVzOiBjYWxsaW5nIENyZWF0ZUF1ZGlvRGVjb2RlciwgdXNlckRhdGE9IDB4JXgiLAotICAgICAgICAgICAgICAgIHBDLT5tX3BDdXJyZW50QXVkaW9EZWNvZGVyVXNlckRhdGEpOwotCi0gICAgICAgICAgICBpZiggTTRPU0FfRkFMU0UgPT0gcEMtPmJFeHRPTVhBdWREZWNvZGVyICkgewotICAgICAgICAgICAgICAgIGVyciA9IE00TUNTX2ludENoZWNrQW5kR2V0Q29kZWNQcm9wZXJ0aWVzKHBDKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYygKLSAgICAgICAgICAgICAgICAgICAgJnBDLT5wQXVkaW9EZWNDdHh0LCBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wQ3VycmVudEF1ZGlvRGVjb2RlclVzZXJEYXRhKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBBQUMgcHJvcGVydGllcyovCi0gICAgICAgICAgICAgICAgICAgIC8vZ2V0IGZyb20gUmVhZGVyOyB0ZW1wb3JhcnksIHRpbGwgQXVkaW8gZGVjb2RlciBzaGVsbCBBUEkgYXZhaWxhYmxlIHRvCi0gICAgICAgICAgICAgICAgICAgIC8vZ2V0IHRoZSBBQUMgcHJvcGVydGllcwotICAgICAgICAgICAgICAgICAgICBwQy0+QWFjUHJvcGVydGllcy5hTnVtQ2hhbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHM7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5BYWNQcm9wZXJ0aWVzLmFTYW1wRnJlcSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX3NhbXBsaW5nRnJlcXVlbmN5OwotCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdEdldE9wdGlvbkF1ZGlvRGVjKAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBBdWRpb0RlY0N0eHQsIE00QURfa09wdGlvbklEX1N0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJmlBYWNUeXBlKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50R2V0SW5wdXRDbGlwUHJvcGVydGllczpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0R2V0T3B0aW9uQXVkaW9EZWMgcmV0dXJucyBlcnIgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlBYWNUeXBlID0gTTRfa0FBQzsgLy9zZXQgdG8gZGVmYXVsdAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRHZXRJbnB1dENsaXBQcm9wZXJ0aWVzOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RHZXRPcHRpb25BdWRpb0RlYyByZXR1cm5zIHN0cmVhbVR5cGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlBYWNUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCggaUFhY1R5cGUgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00X2tBQUM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkFhY1Byb3BlcnRpZXMuYVNCUlByZXNlbnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BYWNQcm9wZXJ0aWVzLmFQU1ByZXNlbnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00X2tBQUNwbHVzOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BYWNQcm9wZXJ0aWVzLmFTQlJQcmVzZW50ID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QWFjUHJvcGVydGllcy5hUFNQcmVzZW50ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QWFjUHJvcGVydGllcy5hRXh0ZW5zaW9uU2FtcEZyZXEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zYW1wbGluZ0ZyZXF1ZW5jeTsgLy9UT0RPCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRfa2VBQUNwbHVzOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BYWNQcm9wZXJ0aWVzLmFTQlJQcmVzZW50ID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QWFjUHJvcGVydGllcy5hUFNQcmVzZW50ID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QWFjUHJvcGVydGllcy5hRXh0ZW5zaW9uU2FtcEZyZXEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zYW1wbGluZ0ZyZXF1ZW5jeTsgLy9UT0RPCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRfa1Vua25vd246Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRHZXRJbnB1dENsaXBQcm9wZXJ0aWVzOiBBQUMgTkJDaGFucz0lZCwgU2FtcGxGcmVxPSVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QWFjUHJvcGVydGllcy5hTnVtQ2hhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QWFjUHJvcGVydGllcy5hU2FtcEZyZXEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludEdldElucHV0Q2xpcFByb3BlcnRpZXM6XAotICAgICAgICAgICAgICAgICAgICAgbV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvL0VWUkMKLSAgICAgICAgaWYoIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZQotICAgICAgICAgICAgPT0gTTREQV9TdHJlYW1UeXBlQXVkaW9FdnJjICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogZGVjb2RlciBub3QgaW1wbGVtZW50ZWQgeWV0LCBwcm92aWRlIHNvbWUgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSBudWxsIGVuY29kaW5nICovCi0gICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHMgPSAxOwotICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA9IDgwMDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBCdWdmaXggUDRNRTAwMDAxMTI4OiBXaXRoIHNvbWUgSU1UQyBmaWxlcywgdGhlIEFNUiBiaXQgcmF0ZSBpcyAwIGticHMgYWNjb3JkaW5nCi0gICAgICAgICB0aGUgR2V0UHJvcGVydGllcyBmdW5jdGlvbiAqLwotICAgICAgICBpZiggMCA9PSBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2F2ZXJhZ2VCaXRSYXRlICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIE00VklERU9FRElUSU5HX2tBTVJfTkIKLSAgICAgICAgICAgICAgICA9PSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQmV0dGVyIHJldHVybmluZyBhIGd1ZXNzZWQgMTIuMiBrYnBzIHZhbHVlIHRoYW4gYSBzdXJlLXRvLWJlLWZhbHNlCi0gICAgICAgICAgICAgICAgMCBrYnBzIHZhbHVlISAqLwotICAgICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazEyXzJfS0JQUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIE00VklERU9FRElUSU5HX2tFVlJDCi0gICAgICAgICAgICAgICAgPT0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEJldHRlciByZXR1cm5pbmcgYSBndWVzc2VkIDguNSBrYnBzIHZhbHVlIHRoYW4gYSBzdXJlLXRvLWJlLWZhbHNlCi0gICAgICAgICAgICAgICAgMCBrYnBzIHZhbHVlISAqLwotICAgICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazlfMl9LQlBTOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBGaWxlQml0cmF0ZTsKLQotICAgICAgICAgICAgICAgIC8qIENhbiBoYXBwZW4gYWxzbyBmb3IgYWFjLCBpbiB0aGlzIGNhc2Ugd2UgY2FsY3VsYXRlIGFuIGFwcHJveGltYXRpdmUgKi8KLSAgICAgICAgICAgICAgICAvKiB2YWx1ZSBmcm9tIGdsb2JhbCBiaXRyYXRlIGFuZCB2aWRlbyBiaXRyYXRlICovCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0R2V0T3B0aW9uKHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfa09wdGlvbklEX0JpdHJhdGUsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmRmlsZUJpdHJhdGUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludEdldElucHV0Q2xpcFByb3BlcnRpZXM6IE00UkVBREVSX2tPcHRpb25JRF9CaXRyYXRlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIEZpbGVCaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgIC0gcEMtPgotICAgICAgICAgICAgICAgICAgICBJbnB1dEZpbGVQcm9wZXJ0aWVzLgotICAgICAgICAgICAgICAgICAgICB1aVZpZGVvQml0cmF0ZSAvKiBub3JtYWxseSBzZXR0ZWQgdG8gMCwgaWYgbm8gdmlkZW8gKi87Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9hdmVyYWdlQml0UmF0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyA9Ci0gICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHM7Ci0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kgPQotICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9zYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwQXVkaW9EdXJhdGlvbiA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKXBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fZHVyYXRpb247Ci0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQXVkaW9NYXhBdVNpemUgPQotICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemU7Ci0KLSAgICAgICAgLyogQnVnOiB3aXRoIGFhYywgdmFsdWUgaXMgMCB1bnRpbCBkZWNvZGVyIHN0YXJ0KCkgaXMgY2FsbGVkICovCi0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpRGVjb2RlZFBjbVNpemUgPQotICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9ieXRlRnJhbWVMZW5ndGgKLSAgICAgICAgICAgICogcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9ieXRlU2FtcGxlU2l6ZQotICAgICAgICAgICAgKiBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHM7Ci0KLSAgICAgICAgLyogTmV3IGFhYyBwcm9wZXJ0aWVzICovCi0gICAgICAgIGlmKCBNNERBX1N0cmVhbVR5cGVBdWRpb0FhYwotICAgICAgICAgICAgPT0gcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlOYkNoYW5uZWxzID0gcEMtPkFhY1Byb3BlcnRpZXMuYU51bUNoYW47Ci0gICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICBwQy0+QWFjUHJvcGVydGllcy5hU2FtcEZyZXE7Ci0KLSAgICAgICAgICAgIGlmKCBwQy0+QWFjUHJvcGVydGllcy5hU0JSUHJlc2VudCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID0KLSAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa0FBQ3BsdXM7Ci0gICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlFeHRlbmRlZFNhbXBsaW5nRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICAgICAgcEMtPkFhY1Byb3BlcnRpZXMuYUV4dGVuc2lvblNhbXBGcmVxOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggcEMtPkFhY1Byb3BlcnRpZXMuYVBTUHJlc2VudCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID0KLSAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa2VBQUNwbHVzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iVW5zdXBwb3J0ZWRBdWRpb0ZvdW5kICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID0KLSAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rVW5zdXBwb3J0ZWRBdWRpbzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9IE00VklERU9FRElUSU5HX2tOb25lQXVkaW87Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBHZXQgJ2Z0eXAnIGF0b20gKi8KLSAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RHZXRPcHRpb24ocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICBNNFJFQURFUl9rT3B0aW9uSURfM2dwRnR5cEJveCwgJnBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmZ0eXApOwotCi0gICAgLyogQW5hbHlzaXMgaXMgc3VjY2Vzc2Z1bCAqLwotICAgIGlmKCBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBWaWRlb0R1cmF0aW9uCi0gICAgICAgID4gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwQXVkaW9EdXJhdGlvbiApCi0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uID0KLSAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwVmlkZW9EdXJhdGlvbjsKLSAgICBlbHNlCi0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uID0KLSAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwQXVkaW9EdXJhdGlvbjsKLQotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkZpbGVUeXBlID0gcEMtPklucHV0RmlsZVR5cGU7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuYkFuYWx5c2VkID0gTTRPU0FfVFJVRTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX1VJbnQzMiBNNE1DU19pbnRHZXRGcmFtZVNpemVfQU1STkIoTTRPU0FfTWVtQWRkcjggcEF1ZGlvRnJhbWUpCi0gKiBAYnJpZWYgICBSZXR1cm4gdGhlIGxlbmd0aCwgaW4gYnl0ZXMsIG9mIHRoZSBBTVIgTmFycm93LUJhbmQgZnJhbWUgY29udGFpbmVkIGluIHRoZSBnaXZlbiBidWZmZXIKLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ3BBdWRpb0ZyYW1lICAgKElOKSBBTVJOQiBmcmFtZQotICogQHJldHVybiAgTTROT19FUlJPUjogTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX1VJbnQzMiBNNE1DU19pbnRHZXRGcmFtZVNpemVfQU1STkIoIE00T1NBX01lbUFkZHI4IHBBdWRpb0ZyYW1lICkKLXsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVTaXplID0gMDsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVUeXBlID0gKCAoICpwQXVkaW9GcmFtZSkgJigweEYgPDwgMykpID4+IDM7Ci0KLSAgICBzd2l0Y2goIGZyYW1lVHlwZSApCi0gICAgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSA5NTsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgNDc1MCBicHMgKi8KLQotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAxMDM7Ci0gICAgICAgICAgICBicmVhazsgLyogIDUxNTAgYnBzICovCi0KLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgZnJhbWVTaXplID0gMTE4OwotICAgICAgICAgICAgYnJlYWs7IC8qICA1OTAwIGJwcyAqLwotCi0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDEzNDsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgNjcwMCBicHMgKi8KLQotICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAxNDg7Ci0gICAgICAgICAgICBicmVhazsgLyogIDc0MDAgYnBzICovCi0KLSAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgZnJhbWVTaXplID0gMTU5OwotICAgICAgICAgICAgYnJlYWs7IC8qICA3OTUwIGJwcyAqLwotCi0gICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDIwNDsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAxMDIwMCBicHMgKi8KLQotICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAyNDQ7Ci0gICAgICAgICAgICBicmVhazsgLyogMTIwMDAgYnBzICovCi0KLSAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgZnJhbWVTaXplID0gMzk7Ci0gICAgICAgICAgICBicmVhazsgLyogU0lEIChTaWxlbmNlKSAqLwotCi0gICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAwOwotICAgICAgICAgICAgYnJlYWs7IC8qIE5vIGRhdGEgKi8KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludEdldEZyYW1lU2l6ZV9BTVJOQigpOiBDb3JydXB0ZWQgQU1SIGZyYW1lISByZXR1cm5pbmcgMC4iKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHJldHVybiAoMSArICgoIGZyYW1lU2l6ZSArIDcpIC8gOCkpOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX1VJbnQzMiBNNE1DU19pbnRHZXRGcmFtZVNpemVfRVZSQyhNNE9TQV9NZW1BZGRyOCBwQXVkaW9GcmFtZSkKLSAqIEBicmllZiAgIFJldHVybiB0aGUgbGVuZ3RoLCBpbiBieXRlcywgb2YgdGhlIEVWUkMgZnJhbWUgY29udGFpbmVkIGluIHRoZSBnaXZlbiBidWZmZXIKLSAqIEBub3RlCi0gKiAgICAgMCAxIDIgMwotICogICAgKy0rLSstKy0rCi0gKiAgICB8ZnIgdHlwZXwgICAgICAgICAgICAgIFJGQyAzNTU4Ci0gKiAgICArLSstKy0rLSsKLSAqCi0gKiBGcmFtZSBUeXBlOiA0IGJpdHMKLSAqICAgIFRoZSBmcmFtZSB0eXBlIGluZGljYXRlcyB0aGUgdHlwZSBvZiB0aGUgY29ycmVzcG9uZGluZyBjb2RlYyBkYXRhCi0gKiAgICBmcmFtZSBpbiB0aGUgUlRQIHBhY2tldC4KLSAqCi0gKiBGb3IgRVZSQyBhbmQgU01WIGNvZGVjcywgdGhlIGZyYW1lIHR5cGUgdmFsdWVzIGFuZCBzaXplIG9mIHRoZQotICogYXNzb2NpYXRlZCBjb2RlYyBkYXRhIGZyYW1lIGFyZSBkZXNjcmliZWQgaW4gdGhlIHRhYmxlIGJlbG93OgotICoKLSAqIFZhbHVlICAgUmF0ZSAgICAgIFRvdGFsIGNvZGVjIGRhdGEgZnJhbWUgc2l6ZSAoaW4gb2N0ZXRzKQotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgIDAgICAgIEJsYW5rICAgICAgMCAgICAoMCBiaXQpCi0gKiAgIDEgICAgIDEvOCAgICAgICAgMiAgICAoMTYgYml0cykKLSAqICAgMiAgICAgMS80ICAgICAgICA1ICAgICg0MCBiaXRzOyBub3QgdmFsaWQgZm9yIEVWUkMpCi0gKiAgIDMgICAgIDEvMiAgICAgICAxMCAgICAoODAgYml0cykKLSAqICAgNCAgICAgMSAgICAgICAgIDIyICAgICgxNzEgYml0czsgNSBwYWRkZWQgYXQgZW5kIHdpdGggemVyb3MpCi0gKiAgIDUgICAgIEVyYXN1cmUgICAgMCAgICAoU0hPVUxEIE5PVCBiZSB0cmFuc21pdHRlZCBieSBzZW5kZXIpCi0gKgotICogQHBhcmFtICAgcENwQXVkaW9GcmFtZSAgIChJTikgRVZSQyBmcmFtZQotICogQHJldHVybiAgTTROT19FUlJPUjogTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX1VJbnQzMiBNNE1DU19pbnRHZXRGcmFtZVNpemVfRVZSQyggTTRPU0FfTWVtQWRkcjggcEF1ZGlvRnJhbWUgKQotewotICAgIE00T1NBX1VJbnQzMiBmcmFtZVNpemUgPSAwOwotICAgIE00T1NBX1VJbnQzMiBmcmFtZVR5cGUgPSAoICpwQXVkaW9GcmFtZSkgJjB4MEY7Ci0KLSAgICBzd2l0Y2goIGZyYW1lVHlwZSApCi0gICAgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAwOwotICAgICAgICAgICAgYnJlYWs7IC8qICBibGFuayAqLwotCi0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDE2OwotICAgICAgICAgICAgYnJlYWs7IC8qICAxLzggKi8KLQotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSA0MDsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgMS80ICovCi0KLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgZnJhbWVTaXplID0gODA7Ci0gICAgICAgICAgICBicmVhazsgLyogIDEvMiAqLwotCi0gICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDE3MTsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgMSAqLwotCi0gICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDA7Ci0gICAgICAgICAgICBicmVhazsgLyogIGVyYXN1cmUgKi8KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludEdldEZyYW1lU2l6ZV9FVlJDKCk6IENvcnJ1cHRlZCBFVlJDIGZyYW1lISByZXR1cm5pbmcgMC4iKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHJldHVybiAoMSArICgoIGZyYW1lU2l6ZSArIDcpIC8gOCkpOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19pbnRDaGVja01heEZpbGVTaXplKE00TUNTX0NvbnRleHQgcENvbnRleHQpCi0gKiBAYnJpZWYgICAgQ2hlY2sgaWYgbWF4IGZpbGUgc2l6ZSBpcyBncmVhdGVyIGVub3VnaCB0byBlbmNvZGUgYSBmaWxlIHdpdGggdGhlCi0gKiAgICAgICAgICAgY3VycmVudCBzZWxlY3RlZCBiaXRyYXRlcyBhbmQgZHVyYXRpb24uCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcmV0dXJuICAgTTROT19FUlJPUgotICogQHJldHVybiAgIE00TUNTX0VSUl9NQVhGSUxFU0laRV9UT09fU01BTEwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRDaGVja01heEZpbGVTaXplKCBNNE1DU19Db250ZXh0IHBDb250ZXh0ICkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCAqKShwQ29udGV4dCk7Ci0KLSAgICBNNE9TQV9VSW50MzIgZHVyYXRpb247Ci0gICAgTTRPU0FfVUludDMyIGF1ZGlvYml0cmF0ZTsKLSAgICBNNE9TQV9VSW50MzIgdmlkZW9iaXRyYXRlOwotCi0gICAgLyogZnJlZSBmaWxlIHNpemUgOiBPSyAqLwotICAgIGlmKCBwQy0+dWlNYXhGaWxlU2l6ZSA9PSAwICkKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLSAgICAvKiBkdXJhdGlvbiAqLwotICAgIGlmKCBwQy0+dWlFbmRDdXRUaW1lID09IDAgKQotICAgIHsKLSAgICAgICAgZHVyYXRpb24gPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiAtIHBDLT51aUJlZ2luQ3V0VGltZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZHVyYXRpb24gPSBwQy0+dWlFbmRDdXRUaW1lIC0gcEMtPnVpQmVnaW5DdXRUaW1lOwotICAgIH0KLQotICAgIC8qIGF1ZGlvIGJpdHJhdGUgKi8KLSAgICBpZiggcEMtPm5vYXVkaW8gKQotICAgIHsKLSAgICAgICAgYXVkaW9iaXRyYXRlID0gMDsKLSAgICB9Ci0gICAgZWxzZSBpZiggcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9PSBNNEVOQ09ERVJfa0F1ZGlvTlVMTCApCi0gICAgewotICAgICAgICBhdWRpb2JpdHJhdGUgPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZTsKLSAgICB9Ci0gICAgZWxzZSBpZiggcEMtPnVpQXVkaW9CaXRyYXRlID09IE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlICkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCggcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRFTkNPREVSX2tBTVJOQjoKLSAgICAgICAgICAgICAgICBhdWRpb2JpdHJhdGUgPSBNNFZJREVPRURJVElOR19rMTJfMl9LQlBTOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIC8vRVZSQwotICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfa0VWUkM6Ci0gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgYXVkaW9iaXRyYXRlID0gTTRWSURFT0VESVRJTkdfazlfMl9LQlBTOwotICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OiAvKiBBQUMgYW5kIE1QMyovCi0gICAgICAgICAgICAgICAgYXVkaW9iaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgKHBDLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtID09IE00RU5DT0RFUl9rTW9ubykKLSAgICAgICAgICAgICAgICAgICAgPyBNNFZJREVPRURJVElOR19rMTZfS0JQUyA6IE00VklERU9FRElUSU5HX2szMl9LQlBTOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGF1ZGlvYml0cmF0ZSA9IHBDLT51aUF1ZGlvQml0cmF0ZTsKLSAgICB9Ci0KLSAgICAvKiB2aWRlbyBiaXRyYXRlICovCi0gICAgaWYoIHBDLT5ub3ZpZGVvICkKLSAgICB7Ci0gICAgICAgIHZpZGVvYml0cmF0ZSA9IDA7Ci0gICAgfQotICAgIGVsc2UgaWYoIHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0ID09IE00RU5DT0RFUl9rTlVMTCApCi0gICAgewotICAgICAgICB2aWRlb2JpdHJhdGUgPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZTsKLSAgICB9Ci0gICAgZWxzZSBpZiggcEMtPnVpVmlkZW9CaXRyYXRlID09IE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlICkKLSAgICB7Ci0gICAgICAgIHZpZGVvYml0cmF0ZSA9IE00VklERU9FRElUSU5HX2sxNl9LQlBTOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB2aWRlb2JpdHJhdGUgPSBwQy0+dWlWaWRlb0JpdHJhdGU7Ci0gICAgfQotCi0gICAgLyogbWF4IGZpbGUgc2l6ZSAqLwotICAgIGlmKCAoTTRPU0FfVUludDMyKXBDLT51aU1heEZpbGVTaXplCi0gICAgICAgIDwgKE00T1NBX1VJbnQzMikoTTRNQ1NfTU9PVl9PVkVSX0ZJTEVTSVpFX1JBVElPCi0gICAgICAgICogKGF1ZGlvYml0cmF0ZSArIHZpZGVvYml0cmF0ZSkgKiAoZHVyYXRpb24gLyA4MDAwLjApKSApCi0gICAgICAgIHJldHVybiBNNE1DU19FUlJfTUFYRklMRVNJWkVfVE9PX1NNQUxMOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRWSURFT0VESVRJTkdfQml0cmF0ZSBNNE1DU19pbnRHZXROZWFyZXN0Qml0cmF0ZShNNE9TQV9VSW50MzIgZnJlZWJpdHJhdGUsIE00T1NBX0ludDggbW9kZSkKLSAqIEBicmllZiAgICBSZXR1cm5zIHRoZSBjbG9zZXN0IGJpdHJhdGUgdmFsdWUgZnJvbSB0aGUgZW51bSBsaXN0IG9mIHR5cGUgTTRWSURFT0VESVRJTkdfQml0cmF0ZQotICogQHBhcmFtICAgIGZyZWViaXRyYXRlOiB1bnNpZ25lZCBpbnQgdmFsdWUKLSAqIEBwYXJhbSAgICBtb2RlOiAtMTpwcmV2aW91cywwOmN1cnJlbnQsMTpuZXh0Ci0gKiBAcmV0dXJuICAgYml0cmF0ZSB2YWx1ZSBpbiBlbnVtIGxpc3QgTTRWSURFT0VESVRJTkdfQml0cmF0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRWSURFT0VESVRJTkdfQml0cmF0ZQotTTRNQ1NfaW50R2V0TmVhcmVzdEJpdHJhdGUoIE00T1NBX0ludDMyIGZyZWViaXRyYXRlLCBNNE9TQV9JbnQ4IG1vZGUgKQotewotICAgIE00T1NBX0ludDMyIGJpdGFycmF5IFtdID0KLSAgICB7Ci0gICAgICAgIDAsIE00VklERU9FRElUSU5HX2sxNl9LQlBTLCBNNFZJREVPRURJVElOR19rMjRfS0JQUywKLSAgICAgICAgTTRWSURFT0VESVRJTkdfazMyX0tCUFMsIE00VklERU9FRElUSU5HX2s0OF9LQlBTLAotICAgICAgICBNNFZJREVPRURJVElOR19rNjRfS0JQUywgTTRWSURFT0VESVRJTkdfazk2X0tCUFMsCi0gICAgICAgIE00VklERU9FRElUSU5HX2sxMjhfS0JQUywgTTRWSURFT0VESVRJTkdfazE5Ml9LQlBTLAotICAgICAgICBNNFZJREVPRURJVElOR19rMjU2X0tCUFMsIE00VklERU9FRElUSU5HX2syODhfS0JQUywKLSAgICAgICAgTTRWSURFT0VESVRJTkdfazM4NF9LQlBTLCBNNFZJREVPRURJVElOR19rNTEyX0tCUFMsCi0gICAgICAgIE00VklERU9FRElUSU5HX2s4MDBfS0JQUywgTTRWSURFT0VESVRJTkdfazJfTUJQUywKLSAgICAgICAgTTRWSURFT0VESVRJTkdfazVfTUJQUywKLSAgICAgICAgTTRWSURFT0VESVRJTkdfazhfTUJQUywgLyorIE5ldyBFbmNvZGVyIGJpdHJhdGVzICovCi0gICAgICAgIE00T1NBX0lOVDMyX01BWAotICAgIH07Ci0KLSAgICBjb25zdCBNNE9TQV9VSW50MzIgbmJiaXRyYXRlcyA9IDE0OwotICAgIE00T1NBX1VJbnQzMiBpOwotCi0gICAgZm9yICggaSA9IDA7IGZyZWViaXRyYXRlID49IGJpdGFycmF5W2ldOyBpKysgKTsKLQotICAgIHN3aXRjaCggbW9kZSApCi0gICAgewotICAgICAgICBjYXNlIC0xOiAvKiBwcmV2aW91cyAqLwotICAgICAgICAgICAgaWYoIGkgPD0gMiApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJpdGFycmF5W2kgLSAyXTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMDogLyogY3VycmVudCAqLwotICAgICAgICAgICAgaWYoIGkgPD0gMSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJpdGFycmF5W2kgLSAxXTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMTogLyogbmV4dCAqLwotICAgICAgICAgICAgaWYoIGkgPj0gbmJiaXRyYXRlcyApCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00T1NBX0lOVDMyX01BWDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gYml0YXJyYXlbaV07Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50Q2xlYW5VcF9SZWFkZXJzRGVjb2RlcnMoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyk7Ci0gKiBAYnJpZWYgICAgRnJlZSBhbGwgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSBNNE1DU19vcGVuKCkKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50Q2xlYW5VcF9SZWFkZXJzRGVjb2RlcnMoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgTTRPU0FfVFJBQ0UyXzEoIk00TUNTX2ludENsZWFuVXBfUmVhZGVyc0RlY29kZXJzIGNhbGxlZCB3aXRoIHBDPTB4JXgiLCBwQyk7Ci0KLSAgICAvKiovCi0gICAgLyogLS0tLS0gRnJlZSB2aWRlbyBkZWNvZGVyIHN0dWZmLCBpZiBuZWVkZWQgLS0tLS0gKi8KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wVmlEZWNDdHh0ICkKLSAgICB7Ci0gICAgICAgIGVyciA9IHBDLT5tX3BWaWRlb0RlY29kZXItPm1fcEZjdERlc3Ryb3kocEMtPnBWaURlY0N0eHQpOwotICAgICAgICBwQy0+cFZpRGVjQ3R4dCA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2NsZWFuVXA6IG1fcFZpZGVvRGVjb2Rlci0+cEZjdERlc3Ryb3kgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4sIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogLS0tLS0gRnJlZSB0aGUgYXVkaW8gZGVjb2RlciBzdHVmZiAtLS0tLSAqLwotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBBdWRpb0RlY0N0eHQgKQotICAgIHsKLSAgICAgICAgZXJyID0gcEMtPm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0RGVzdHJveUF1ZGlvRGVjKHBDLT5wQXVkaW9EZWNDdHh0KTsKLSAgICAgICAgcEMtPnBBdWRpb0RlY0N0eHQgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19jbGVhblVwOiBtX3BBdWRpb0RlY29kZXItPm1fcEZjdERlc3Ryb3lBdWRpb0RlYyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKio8IGRvbid0IHJldHVybiwgd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBmcmVlICovCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzKTsKLSAgICAgICAgcEMtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qIC0tLS0tIEZyZWUgcmVhZGVyIHN0dWZmLCBpZiBuZWVkZWQgLS0tLS0gKi8KLSAgICAvLyBXZSBjYW5ub3QgZnJlZSB0aGUgcmVhZGVyIGJlZm9yZSBkZWNvZGVycyBiZWNhdXNlIHRoZSBkZWNvZGVycyBtYXkgcmVhZAotICAgIC8vIGZyb20gdGhlIHJlYWRlciAoaW4gYW5vdGhlciB0aHJlYWQpIGJlZm9yZSBiZWluZyBzdG9wcGVkLgotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPgotICAgICAgICBwUmVhZGVyQ29udGV4dCApIC8qKjwgbWF5IGJlIE00T1NBX05VTEwgaWYgTTRNQ1Nfb3BlbiB3YXMgbm90IGNhbGxlZCAqLwotICAgIHsKLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0Q2xvc2UocEMtPnBSZWFkZXJDb250ZXh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1NfY2xlYW5VcDogbV9wUmVhZGVyLT5tX3BGY3RDbG9zZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKio8IGRvbid0IHJldHVybiwgd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBmcmVlICovCi0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3REZXN0cm95KHBDLT5wUmVhZGVyQ29udGV4dCk7Ci0gICAgICAgIHBDLT5wUmVhZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2NsZWFuVXA6IG1fcFJlYWRlci0+bV9wRmN0RGVzdHJveSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4sIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYoIHBDLT5tX3BEYXRhQWRkcmVzczEgIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5tX3BEYXRhQWRkcmVzczEpOwotICAgICAgICBwQy0+bV9wRGF0YUFkZHJlc3MxID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggcEMtPm1fcERhdGFBZGRyZXNzMiAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPm1fcERhdGFBZGRyZXNzMik7Ci0gICAgICAgIHBDLT5tX3BEYXRhQWRkcmVzczIgPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICAvKkJ1ZyBmaXggMTEvMTIvMjAwOCAodG8gb2J0YWluIG1vcmUgcHJlY2lzZSB2aWRlbyBlbmQgY3V0KSovCi0gICAgaWYoIHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMSAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxKTsKLSAgICAgICAgcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MyICE9IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczIpOwotICAgICAgICBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczIgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLS8qKgotCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1ZvaWQqIHBGaWxlSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcEZpbGVPdXQsIE00T1NBX1ZvaWQqIHBUZW1wRmlsZSk7Ci0gKiBAYnJpZWYgICBTZXQgdGhlIE1DUyBpbnB1dCBhbmQgb3V0cHV0IGZpbGVzLiBJdCBpcyB0aGUgc2FtZSBhcyBNNE1DU19vcGVuIHdpdGhvdXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19XSVRIX0ZBU1RfT1BFTiBmbGFnCi1JdCBpcyB1c2VkIGluIFZpZGVvQXJ0aXN0Ci0gKiBAbm90ZSAgICBJdCBvcGVucyB0aGUgaW5wdXQgZmlsZSwgYnV0IHRoZSBvdXRwdXQgZmlsZSBpcyBub3QgY3JlYXRlZCB5ZXQuCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBGaWxlSW4gICAgICAgICAgICAgKElOKSBJbnB1dCBmaWxlIHRvIHRyYW5zY29kZSAoVGhlIHR5cGUgb2YgdGhpcyBwYXJhbWV0ZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVSTCwgcGlwZS4uLikgZGVwZW5kcyBvbiB0aGUgT1NBTCBpbXBsZW1lbnRhdGlvbikuCi0gKiBAcGFyYW0gICBtZWRpYVR5cGUgICAgICAgICAgIChJTikgQ29udGFpbmVyIHR5cGUgKC4zZ3AsLmFtciwgLi4uKSBvZiBpbnB1dCBmaWxlLgotICogQHBhcmFtICAgcEZpbGVPdXQgICAgICAgICAgICAoSU4pIE91dHB1dCBmaWxlIHRvIGNyZWF0ZSAgKFRoZSB0eXBlIG9mIHRoaXMgcGFyYW1ldGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVSTCwgcGlwZS4uLikgZGVwZW5kcyBvbiB0aGUgT1NBTCBpbXBsZW1lbnRhdGlvbikuCi0gKiBAcGFyYW0gICBwVGVtcEZpbGUgICAgICAgICAgIChJTikgVGVtcG9yYXJ5IGZpbGUgZm9yIHRoZSBjb25zdGFudCBtZW1vcnkgd3JpdGVyIHRvIHN0b3JlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhICgibW9vdi5iaW4iKS4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgTTRFUlJfQUxMT0M6ICAgICAgICBUaGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkKLSAqIEByZXR1cm4gIE00RVJSX0ZJTEVfTk9UX0ZPVU5EOiAgIFRoZSBpbnB1dCBmaWxlIGhhcyBub3QgYmVlbiBmb3VuZAotICogQHJldHVybiAgTTRNQ1NfRVJSX0lOVkFMSURfSU5QVVRfRklMRTogICBUaGUgaW5wdXQgZmlsZSBpcyBub3QgYSB2YWxpZCBmaWxlLCBvciBpcyBjb3JydXB0ZWQKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9JTlBVVF9GSUxFX0NPTlRBSU5TX05PX1NVUFBPUlRFRF9TVFJFQU06ICBUaGUgaW5wdXQgZmlsZSBjb250YWlucyBubwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQgYXVkaW8gb3IgdmlkZW8gc3RyZWFtCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19vcGVuX25vcm1hbE1vZGUoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVm9pZCogcEZpbGVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIElucHV0RmlsZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcEZpbGVPdXQsIE00T1NBX1ZvaWQqIHBUZW1wRmlsZSkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCopKHBDb250ZXh0KTsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRSRUFERVJfTWVkaWFGYW1pbHkgbWVkaWFGYW1pbHk7Ci0gICAgTTRfU3RyZWFtSGFuZGxlciogcFN0cmVhbUhhbmRsZXI7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMygiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgsIHBGaWxlSW49MHgleCxcCi0gICAgIHBGaWxlT3V0PTB4JXgiLCBwQ29udGV4dCwgcEZpbGVJbiwgcEZpbGVPdXQpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBGaWxlSW4pICwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlOiBwRmlsZUluIGlzIE00T1NBX05VTEwiKTsKLQotICAgIGlmICgoSW5wdXRGaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfSlBHKQotICAgICAgICB8fChJbnB1dEZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9QTkcpCi0gICAgICAgIHx8KElucHV0RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0dJRikKLSAgICAgICAgfHwoSW5wdXRGaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQk1QKSkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19vcGVuX25vcm1hbE1vZGU6IFN0aWxsIHBpY3R1cmUgaXMgbm90XAotICAgICAgICAgICAgIHN1cHBvcnRlZCB3aXRoIHRoaXMgZnVuY3Rpb24iKTsKLSAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9JTlBVVF9GSUxFX0NPTlRBSU5TX05PX1NVUFBPUlRFRF9TVFJFQU07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBpZiAoTTRNQ1Nfa1N0YXRlX0NSRUFURUQgIT0gcEMtPlN0YXRlKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX29wZW5fbm9ybWFsTW9kZSgpOiBXcm9uZyBTdGF0ZSAoJWQpLCByZXR1cm5pbmcgTTRFUlJfU1RBVEUiLAotICAgICAgICAgICAgIHBDLT5TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKiBDb3B5IGZ1bmN0aW9uIGlucHV0IHBhcmFtZXRlcnMgaW50byBvdXIgY29udGV4dCAqLwotICAgIHBDLT5wSW5wdXRGaWxlICAgICA9IHBGaWxlSW47Ci0gICAgcEMtPklucHV0RmlsZVR5cGUgID0gSW5wdXRGaWxlVHlwZTsKLSAgICBwQy0+cE91dHB1dEZpbGUgICAgPSBwRmlsZU91dDsKLSAgICBwQy0+cFRlbXBvcmFyeUZpbGUgPSBwVGVtcEZpbGU7Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogT3BlbiBpbnB1dCBmaWxlIHdpdGggdGhlIHJlYWRlciAqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRSZWFkZXIocENvbnRleHQsIHBDLT5JbnB1dEZpbGVUeXBlKTsKLSAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgIC8qKgotICAgICogUmVzZXQgcmVhZGVyIHJlbGF0ZWQgdmFyaWFibGVzICovCi0gICAgcEMtPlZpZGVvU3RhdGUgICAgICAgICAgPSBNNE1DU19rU3RyZWFtU3RhdGVfTk9TVFJFQU07Ci0gICAgcEMtPkF1ZGlvU3RhdGUgICAgICAgICAgPSBNNE1DU19rU3RyZWFtU3RhdGVfTk9TVFJFQU07Ci0gICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSAgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0gID0gTTRPU0FfTlVMTDsKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qIEluaXRpYWxpemVzIHRoZSByZWFkZXIgc2hlbGwgYW5kIG9wZW4gdGhlIGRhdGEgZmlsZSAqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdENyZWF0ZSgmcEMtPnBSZWFkZXJDb250ZXh0KTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKCk6IG1fcFJlYWRlci0+bV9wRmN0Q3JlYXRlIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBMaW5rIHRoZSByZWFkZXIgaW50ZXJmYWNlIHRvIHRoZSByZWFkZXIgY29udGV4dCAqLwotICAgIHBDLT5tX3BSZWFkZXJEYXRhSXQtPm1fcmVhZGVyQ29udGV4dCA9IHBDLT5wUmVhZGVyQ29udGV4dDsKLQotICAgIC8qKgotICAgICogU2V0IHRoZSByZWFkZXIgc2hlbGwgZmlsZSBhY2Nlc3MgZnVuY3Rpb25zICovCi0gICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0U2V0T3B0aW9uKHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgIE00UkVBREVSX2tPcHRpb25JRF9TZXRPc2FGaWxlUmVhZGVyRmN0c1B0ciwKLSAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pcEMtPnBPc2FGaWxlUmVhZFB0cik7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX29wZW5fbm9ybWFsTW9kZSgpOiBtX3BSZWFkZXItPm1fcEZjdFNldE9wdGlvbiByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogT3BlbiB0aGUgaW5wdXQgZmlsZSAqLwotICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdE9wZW4ocEMtPnBSZWFkZXJDb250ZXh0LCBwQy0+cElucHV0RmlsZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIHVpRHVtbXksIHVpQ29yZUlkOwotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKCk6IG1fcFJlYWRlci0+bV9wRmN0T3BlbiByZXR1cm5zIDB4JXgiLCBlcnIpOwotCi0gICAgICAgIGlmIChlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRFUlJfVU5TVVBQT1JURURfTUVESUFfVFlQRSkpIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19vcGVuX25vcm1hbE1vZGUoKTogcmV0dXJuaW5nIE00TUNTX0VSUl9GSUxFX0RSTV9QUk9URUNURUQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfRklMRV9EUk1fUFJPVEVDVEVEOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIElmIHRoZSBlcnJvciBpcyBmcm9tIHRoZSBjb3JlIHJlYWRlciwgd2UgY2hhbmdlIGl0IHRvIGEgcHVibGljIFZYUyBlcnJvciAqLwotICAgICAgICAgICAgTTRPU0FfRVJSX1NQTElUKGVyciwgdWlEdW1teSwgdWlDb3JlSWQsIHVpRHVtbXkpOwotICAgICAgICAgICAgaWYgKE00TVA0X1JFQURFUiA9PSB1aUNvcmVJZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKCk6IHJldHVybmluZyBNNE1DU19FUlJfSU5WQUxJRF9JTlBVVF9GSUxFIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9JTlZBTElEX0lOUFVUX0ZJTEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEdldCB0aGUgc3RyZWFtcyBmcm9tIHRoZSBpbnB1dCBmaWxlICovCi0gICAgd2hpbGUgKE00Tk9fRVJST1IgPT0gZXJyKQotICAgIHsKLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0R2V0TmV4dFN0cmVhbShwQy0+cFJlYWRlckNvbnRleHQsICZtZWRpYUZhbWlseSwKLSAgICAgICAgICAgICZwU3RyZWFtSGFuZGxlcik7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogSW4gY2FzZSB3ZSBmb3VuZCBhIEJJRlMgc3RyZWFtIG9yIHNvbWV0aGluZyBlbHNlLi4uKi8KLSAgICAgICAgaWYoKGVyciA9PSAoKE00T1NBX1VJbnQzMilNNEVSUl9SRUFERVJfVU5LTk9XTl9TVFJFQU1fVFlQRSkpCi0gICAgICAgICAgICB8fCAoZXJyID09ICgoTTRPU0FfVUludDMyKU00V0FSX1RPT19NVUNIX1NUUkVBTVMpKSkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IgPT0gZXJyKSAvKio8IE9uZSBzdHJlYW0gZm91bmQgKi8KLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEZvdW5kIHRoZSBmaXJzdCB2aWRlbyBzdHJlYW0gKi8KLSAgICAgICAgICAgIGlmICgoTTRSRUFERVJfa01lZGlhRmFtaWx5VmlkZW8gPT0gbWVkaWFGYW1pbHkpIFwKLSAgICAgICAgICAgICAgICAmJiAoTTRPU0FfTlVMTCA9PSBwQy0+cFJlYWRlclZpZGVvU3RyZWFtKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoKE00REFfU3RyZWFtVHlwZVZpZGVvSDI2Mz09cFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgKE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzQ9PXBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9WSURFT19BVkMKLSAgICAgICAgICAgICAgICAgICAgfHwoTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2Yz09cFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkpCi0jZWxzZQotICAgICAgICAgICAgICAgICAgICB8fCgoTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2Yz09cFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgJiYocEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbTTRERUNPREVSX2tWaWRlb1R5cGVBVkNdICE9IE00T1NBX05VTEwpKSkKLSNlbmRpZgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX29wZW5fbm9ybWFsTW9kZSgpOlwKLSAgICAgICAgICAgICAgICAgICAgIEZvdW5kIGEgSDI2MyBvciBNUEVHLTQgdmlkZW8gc3RyZWFtIGluIGlucHV0IDNncHAgY2xpcCIpOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEtlZXAgcG9pbnRlciB0byB0aGUgdmlkZW8gc3RyZWFtICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0gPSAoTTRfVmlkZW9TdHJlYW1IYW5kbGVyKilwU3RyZWFtSGFuZGxlcjsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmJVbnN1cHBvcnRlZFZpZGVvRm91bmQgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fYlN0cmVhbUlzT0sgPSBNNE9TQV9UUlVFOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEluaXQgb3VyIHZpZGVvIHN0cmVhbSBzdGF0ZSB2YXJpYWJsZSAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+VmlkZW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9TVEFSVEVEOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFJlc2V0IHRoZSBzdHJlYW0gcmVhZGVyICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdFJlc2V0KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciopcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX29wZW5fbm9ybWFsTW9kZSgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyLT5tX3BGY3RSZXNldCh2aWRlbykgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBJbml0aWFsaXplcyBhbiBhY2Nlc3MgVW5pdCAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QocEMtPnBSZWFkZXJDb250ZXh0LCBwU3RyZWFtSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAmcEMtPlJlYWRlclZpZGVvQVUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19vcGVuX25vcm1hbE1vZGUoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0RmlsbEF1U3RydWN0KHZpZGVvKSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIC8qKjwgTm90IEgyNjMgb3IgTVBFRy00IChIMjY0LCBldGMuKSAqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX29wZW5fbm9ybWFsTW9kZSgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGb3VuZCBhbiB1bnN1cHBvcnRlZCB2aWRlbyBzdHJlYW0gKDB4JXgpIGluIGlucHV0IDNncHAgY2xpcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpOwotCi0gICAgICAgICAgICAgICAgICAgIHBDLT5iVW5zdXBwb3J0ZWRWaWRlb0ZvdW5kID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fYlN0cmVhbUlzT0sgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogRm91bmQgdGhlIGZpcnN0IGF1ZGlvIHN0cmVhbSAqLwotICAgICAgICAgICAgZWxzZSBpZiAoKE00UkVBREVSX2tNZWRpYUZhbWlseUF1ZGlvID09IG1lZGlhRmFtaWx5KQotICAgICAgICAgICAgICAgICYmIChNNE9TQV9OVUxMID09IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICgoTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJOYXJyb3dCYW5kPT1wU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICAoTTREQV9TdHJlYW1UeXBlQXVkaW9BYWM9PXBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChNNERBX1N0cmVhbVR5cGVBdWRpb01wMz09cFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgKE00REFfU3RyZWFtVHlwZUF1ZGlvRXZyYz09cFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX29wZW5fbm9ybWFsTW9kZSgpOiBGb3VuZCBhbiBBTVItTkIsIEFBQyBcCi0gICAgICAgICAgICAgICAgICAgICAgICBvciBNUDMgYXVkaW8gc3RyZWFtIGluIGlucHV0IGNsaXAiKTsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBLZWVwIHBvaW50ZXIgdG8gdGhlIGF1ZGlvIHN0cmVhbSAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtID0gKE00X0F1ZGlvU3RyZWFtSGFuZGxlciopcFN0cmVhbUhhbmRsZXI7Ci0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX2JTdHJlYW1Jc09LID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmJVbnN1cHBvcnRlZEF1ZGlvRm91bmQgPSBNNE9TQV9GQUxTRTsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBJbml0IG91ciBhdWRpbyBzdHJlYW0gc3RhdGUgdmFyaWFibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfU1RBUlRFRDsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBSZXNldCB0aGUgc3RyZWFtIHJlYWRlciAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RSZXNldChwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5wUmVhZGVyQXVkaW9TdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19vcGVuX25vcm1hbE1vZGUoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0UmVzZXQoYXVkaW8pIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogSW5pdGlhbGl6ZXMgYW4gYWNjZXNzIFVuaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0RmlsbEF1U3RydWN0KHBDLT5wUmVhZGVyQ29udGV4dCwgcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgJnBDLT5SZWFkZXJBdWRpb0FVKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKCk6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BSZWFkZXItPm1fcEZjdEZpbGxBdVN0cnVjdChhdWRpbykgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBPdXRwdXQgbWF4IEFVIHNpemUgaXMgZXF1YWwgdG8gaW5wdXQgbWF4IEFVIHNpemUgKHRoaXMgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgKiB3aWxsIGJlIGNoYW5nZWQgaWYgdGhlcmUgaXMgYXVkaW8gdHJhbnNjb2RpbmcpICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT51aUF1ZGlvTWF4QXVTaXplID0gcFN0cmVhbUhhbmRsZXItPm1fbWF4QVVTaXplOwotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKjwgTm90IEFNUi1OQiwgQUFDLCBNUDMgbm9yIEVWUkMgKEFNUi1XQiwgV0FWLi4uKSAqLwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKCk6IEZvdW5kIGFuIHVuc3VwcG9ydGVkIGF1ZGlvIHN0cmVhbVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoMHgleCkgaW4gaW5wdXQgM2dwcCBjbGlwIiwgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcEMtPmJVbnN1cHBvcnRlZEF1ZGlvRm91bmQgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9iU3RyZWFtSXNPSyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gLyoqPCBlbmQgb2Ygd2hpbGUgKE00Tk9fRVJST1IgPT0gZXJyKSAqLwotCi0gICAgLyoqCi0gICAgKiBDaGVjayB3ZSBmb3VuZCBhdCBsZWFzdCBvbmUgc3VwcG9ydGVkIHN0cmVhbSAqLwotICAgIGlmKChNNE9TQV9OVUxMID09IHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0pICYmIChNNE9TQV9OVUxMID09IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0pKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TUNTX29wZW5fbm9ybWFsTW9kZSgpOiByZXR1cm5pbmcgXAotICAgICAgICAgICAgTTRNQ1NfRVJSX0lOUFVUX0ZJTEVfQ09OVEFJTlNfTk9fU1VQUE9SVEVEX1NUUkVBTSIpOwotICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0lOUFVUX0ZJTEVfQ09OVEFJTlNfTk9fU1VQUE9SVEVEX1NUUkVBTTsKLSAgICB9Ci0KLSNpZm5kZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0gICAgaWYocEMtPlZpZGVvU3RhdGUgPT0gTTRNQ1Nfa1N0cmVhbVN0YXRlX1NUQVJURUQpCi0gICAgewotICAgICAgICBlcnIgPSBNNE1DU19zZXRDdXJyZW50VmlkZW9EZWNvZGVyKHBDb250ZXh0LAotICAgICAgICAgICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKTsKLSAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBpZihwQy0+QXVkaW9TdGF0ZSA9PSBNNE1DU19rU3RyZWFtU3RhdGVfU1RBUlRFRCkKLSAgICB7Ci0gICAgICAgIC8vRVZSQwotICAgICAgICBpZihNNERBX1N0cmVhbVR5cGVBdWRpb0V2cmMgIT0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkKLSAgICAgICAgIC8qIGRlY29kZXIgbm90IHN1cHBvcnRlZCB5ZXQsIGJ1dCBhbGxvdyB0byBkbyBudWxsIGVuY29kaW5nICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRBdWRpb0RlY29kZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogR2V0IHRoZSBhdWRpbyBhbmQgdmlkZW8gc3RyZWFtIHByb3BlcnRpZXMgKi8KLSAgICBlcnIgPSBNNE1DU19pbnRHZXRJbnB1dENsaXBQcm9wZXJ0aWVzKHBDKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKCk6XAotICAgICAgICAgICAgIE00TUNTX2ludEdldElucHV0Q2xpcFByb3BlcnRpZXMgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFNldCB0aGUgYmVnaW4gY3V0IGRlY29kaW5nIGluY3JlbWVudCBhY2NvcmRpbmcgdG8gdGhlIGlucHV0IGZyYW1lIHJhdGUgKi8KLSAgICBpZiAoMC4gIT0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMuZkF2ZXJhZ2VGcmFtZVJhdGUpIC8qKjwgc2FuaXR5IGNoZWNrICovCi0gICAgewotICAgICAgICBwQy0+aVZpZGVvQmVnaW5EZWNJbmNyID0gKE00T1NBX0ludDMyKSgzMDAwLiBcCi0gICAgICAgICAgICAvIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmZBdmVyYWdlRnJhbWVSYXRlKTsgLyoqPCBhYm91dCAzIGZyYW1lcyAqLwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwQy0+aVZpZGVvQmVnaW5EZWNJbmNyID0gMjAwOyAvKio8IGRlZmF1bHQgdmFsdWU6IDIwMCBtaWxsaXNlY29uZHMgKDMgZnJhbWVzIEAgMTVmcHMpKi8KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFVwZGF0ZSBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfT1BFTkVEOwotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19vcGVuX25vcm1hbE1vZGUoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfRVJSIE00TUNTX2ludENoZWNrQW5kR2V0Q29kZWNQcm9wZXJ0aWVzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQykgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRBRF9CdWZmZXIgb3V0cHV0QnVmZmVyOwotICAgIHVpbnQzMl90IG9wdGlvblZhbHVlID0wOwotCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX2ludENoZWNrQW5kR2V0Q29kZWNQcm9wZXJ0aWVzIDpzdGFydCIpOwotCi0gICAgLy8gRGVjb2RlIGZpcnN0IGF1ZGlvIGZyYW1lIGZyb20gY2xpcCB0byBnZXQgcHJvcGVydGllcyBmcm9tIGNvZGVjCi0KLSAgICBpZiAoTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgPT0KLSAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSkgewotCi0gICAgICAgIGVyciA9IHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdENyZWF0ZUF1ZGlvRGVjKAotICAgICAgICAgICAgICAgICAgICAmcEMtPnBBdWRpb0RlY0N0eHQsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0sICYocEMtPkFhY1Byb3BlcnRpZXMpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBlcnIgPSBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYygKLSAgICAgICAgICAgICAgICAgICAgJnBDLT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wQ3VycmVudEF1ZGlvRGVjb2RlclVzZXJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50Q2hlY2tBbmRHZXRDb2RlY1Byb3BlcnRpZXM6IG1fcEZjdENyZWF0ZUF1ZGlvRGVjIFwKLSAgICAgICAgICAgICByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbkF1ZGlvRGVjKHBDLT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICBNNEFEX2tPcHRpb25JRF8zZ3BSZWFkZXJJbnRlcmZhY2UsIChNNE9TQV9EYXRhT3B0aW9uKSBwQy0+bV9wUmVhZGVyRGF0YUl0KTsKLQotICAgIHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbkF1ZGlvRGVjKHBDLT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICBNNEFEX2tPcHRpb25JRF9BdWRpb0FVLCAoTTRPU0FfRGF0YU9wdGlvbikgJnBDLT5SZWFkZXJBdWRpb0FVKTsKLQotICAgIGlmKCBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTdGFydEF1ZGlvRGVjICE9IE00T1NBX05VTEwgKSB7Ci0KLSAgICAgICAgZXJyID0gcEMtPm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RhcnRBdWRpb0RlYyhwQy0+cEF1ZGlvRGVjQ3R4dCk7Ci0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApIHsKLQotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludENoZWNrQW5kR2V0Q29kZWNQcm9wZXJ0aWVzOiBtX3BGY3RTdGFydEF1ZGlvRGVjIFwKLSAgICAgICAgICAgICAgICAgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEFsbG9jYXRlIG91dHB1dCBidWZmZXIgZm9yIHRoZSBhdWRpbyBkZWNvZGVyICovCi0gICAgb3V0cHV0QnVmZmVyLm1fYnVmZmVyU2l6ZSA9Ci0gICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYnl0ZUZyYW1lTGVuZ3RoCi0gICAgICAgICogcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9ieXRlU2FtcGxlU2l6ZQotICAgICAgICAqIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fbmJDaGFubmVsczsKLQotICAgIGlmKCBvdXRwdXRCdWZmZXIubV9idWZmZXJTaXplID4gMCApIHsKLQotICAgICAgICBvdXRwdXRCdWZmZXIubV9kYXRhQWRkcmVzcyA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKG91dHB1dEJ1ZmZlci5tX2J1ZmZlclNpemUgXAotICAgICAgICAgICAgKnNpemVvZihzaG9ydCksIE00TUNTLCAoTTRPU0FfQ2hhciAqKSJvdXRwdXRCdWZmZXIubV9idWZmZXJTaXplIik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gb3V0cHV0QnVmZmVyLm1fZGF0YUFkZHJlc3MgKSB7Ci0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRDaGVja0FuZEdldENvZGVjUHJvcGVydGllcygpOlwKLSAgICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIG91dHB1dEJ1ZmZlci5tX2RhdGFBZGRyZXNzLCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGVyciA9IHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFN0ZXBBdWRpb0RlYyhwQy0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgTTRPU0FfTlVMTCwgJm91dHB1dEJ1ZmZlciwgTTRPU0FfRkFMU0UpOwotCi0gICAgaWYgKCBlcnIgPT0gTTRXQVJfSU5GT19GT1JNQVRfQ0hBTkdFICkgewotCi0gICAgICAgIC8vIEdldCB0aGUgcHJvcGVydGllcyBmcm9tIGNvZGVjIG5vZGUKLSAgICAgICAgcEMtPm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0R2V0T3B0aW9uQXVkaW9EZWMocEMtPnBBdWRpb0RlY0N0eHQsCi0gICAgICAgICAgIE00QURfa09wdGlvbklEX0F1ZGlvTmJDaGFubmVscywgKE00T1NBX0RhdGFPcHRpb24pICZvcHRpb25WYWx1ZSk7Ci0KLSAgICAgICAgLy8gUmVzZXQgUmVhZGVyIHN0cnVjdHVyZSB2YWx1ZSBhbHNvCi0gICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fbmJDaGFubmVscyA9IG9wdGlvblZhbHVlOwotCi0gICAgICAgIHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdEdldE9wdGlvbkF1ZGlvRGVjKHBDLT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgTTRBRF9rT3B0aW9uSURfQXVkaW9TYW1wRnJlcXVlbmN5LCAoTTRPU0FfRGF0YU9wdGlvbikgJm9wdGlvblZhbHVlKTsKLQotICAgICAgICAvLyBSZXNldCBSZWFkZXIgc3RydWN0dXJlIHZhbHVlIGFsc28KLSAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA9IG9wdGlvblZhbHVlOwotCi0gICAgICAgIGlmIChNNERBX1N0cmVhbVR5cGVBdWRpb0FhYyA9PQotICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKSB7Ci0KLSAgICAgICAgICAgIHBDLT5BYWNQcm9wZXJ0aWVzLmFOdW1DaGFuID0KLSAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHM7Ci0gICAgICAgICAgICBwQy0+QWFjUHJvcGVydGllcy5hU2FtcEZyZXEgPQotICAgICAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fc2FtcGxpbmdGcmVxdWVuY3k7Ci0KLSAgICAgICAgfQotCi0gICAgfSBlbHNlIGlmKCBlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1NfaW50Q2hlY2tBbmRHZXRDb2RlY1Byb3BlcnRpZXM6XAotICAgICAgICAgICAgbV9wRmN0U3RlcEF1ZGlvRGVjIHJldHVybnMgZXJyID0gMHgleCIsIGVycik7Ci0gICAgfQotCi0gICAgZnJlZShvdXRwdXRCdWZmZXIubV9kYXRhQWRkcmVzcyk7Ci0KLSAgICAvLyBSZXNldCB0aGUgc3RyZWFtIHJlYWRlcgotICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdFJlc2V0KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cFJlYWRlckF1ZGlvU3RyZWFtKTsKLQotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1NfaW50Q2hlY2tBbmRHZXRDb2RlY1Byb3BlcnRpZXNcCi0gICAgICAgICAgICBFcnJvciBpbiByZXNldGluZyByZWFkZXI6IDB4JXgiLCBlcnIpOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci0KLX0KLQotTTRPU0FfRVJSIE00TUNTX2ludExpbWl0Qml0cmF0ZVBlckNvZGVjUHJvZmlsZUxldmVsKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0FkdmFuY2VkUGFyYW1zKiBFbmNQYXJhbXMpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgc3dpdGNoIChFbmNQYXJhbXMtPkZvcm1hdCkgewotICAgICAgICBjYXNlIE00RU5DT0RFUl9rSDI2MzoKLSAgICAgICAgICAgIEVuY1BhcmFtcy0+Qml0cmF0ZSA9IE00TUNTX2ludExpbWl0Qml0cmF0ZUZvckgyNjNFbmMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5jUGFyYW1zLT52aWRlb1Byb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5jUGFyYW1zLT52aWRlb0xldmVsLCBFbmNQYXJhbXMtPkJpdHJhdGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa01QRUc0OgotICAgICAgICAgICAgRW5jUGFyYW1zLT5CaXRyYXRlID0gTTRNQ1NfaW50TGltaXRCaXRyYXRlRm9yTXBlZzRFbmMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5jUGFyYW1zLT52aWRlb1Byb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5jUGFyYW1zLT52aWRlb0xldmVsLCBFbmNQYXJhbXMtPkJpdHJhdGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa0gyNjQ6Ci0gICAgICAgICAgICBFbmNQYXJhbXMtPkJpdHJhdGUgPSBNNE1DU19pbnRMaW1pdEJpdHJhdGVGb3JIMjY0RW5jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY1BhcmFtcy0+dmlkZW9Qcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY1BhcmFtcy0+dmlkZW9MZXZlbCwgRW5jUGFyYW1zLT5CaXRyYXRlKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1NfaW50TGltaXRCaXRyYXRlUGVyQ29kZWNQcm9maWxlTGV2ZWw6IFwKLSAgICAgICAgICAgICAgICBXcm9uZyBlbmMgZm9ybWF0ICVkIiwgRW5jUGFyYW1zLT5Gb3JtYXQpOwotICAgICAgICAgICAgZXJyID0gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLQotfQotCi1NNE9TQV9JbnQzMiBNNE1DU19pbnRMaW1pdEJpdHJhdGVGb3JIMjY0RW5jKE00T1NBX0ludDMyIHByb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBsZXZlbCwgTTRPU0FfSW50MzIgYml0cmF0ZSkgewotCi0gICAgTTRPU0FfSW50MzIgdmlkQml0cmF0ZSA9IDA7Ci0KLSAgICBzd2l0Y2ggKHByb2ZpbGUpIHsKLSAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lOgotICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNQcm9maWxlTWFpbjoKLQotICAgICAgICAgICAgc3dpdGNoIChsZXZlbCkgewotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwxOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiA2NDAwMCkgPyA2NDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwxYjoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMTI4MDAwKSA/IDEyODAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwxMToKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMTkyMDAwKSA/IDE5MjAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwxMjoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMzg0MDAwKSA/IDM4NDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwxMzoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gNzY4MDAwKSA/IDc2ODAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwyOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAyMDAwMDAwKSA/IDIwMDAwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMjE6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDQwMDAwMDApID8gNDAwMDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwyMjoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gNDAwMDAwMCkgPyA0MDAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDM6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDEwMDAwMDAwKSA/IDEwMDAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDMxOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAxNDAwMDAwMCkgPyAxNDAwMDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwzMjoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMjAwMDAwMDApID8gMjAwMDAwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsNDoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMjAwMDAwMDApID8gMjAwMDAwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsNDE6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDUwMDAwMDAwKSA/IDUwMDAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDQyOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiA1MDAwMDAwMCkgPyA1MDAwMDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWw1OgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAxMzUwMDAwMDApID8gMTM1MDAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDUxOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAyNDAwMDAwMDApID8gMjQwMDAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNQcm9maWxlSGlnaDoKLSAgICAgICAgICAgIHN3aXRjaCAobGV2ZWwpIHsKLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDE6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDgwMDAwKSA/IDgwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDFiOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAxNjAwMDApID8gMTYwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDExOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAyNDAwMDApID8gMjQwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDEyOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiA0ODAwMDApID8gNDgwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDEzOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiA5NjAwMDApID8gOTYwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDI6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDI1MDAwMDApID8gMjUwMDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwyMToKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gNTAwMDAwMCkgPyA1MDAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDIyOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiA1MDAwMDAwKSA/IDUwMDAwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMzoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMTI1MDAwMDApID8gMTI1MDAwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMzE6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDE3NTAwMDAwKSA/IDE3NTAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDMyOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAyNTAwMDAwMCkgPyAyNTAwMDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWw0OgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAyNTAwMDAwMCkgPyAyNTAwMDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWw0MToKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gNjI1MDAwMDApID8gNjI1MDAwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsNDI6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDYyNTAwMDAwKSA/IDYyNTAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDU6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDE2ODc1MDAwMCkgPyAxNjg3NTAwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsNTE6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDMwMDAwMDAwMCkgPyAzMDAwMDAwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvLyBXZSBkbyBub3QgaGFuZGxlIGFueSBvdGhlciBBVkMgcHJvZmlsZSBmb3Igbm93LgotICAgICAgICAgICAgLy8gUmV0dXJuIGlucHV0IGJpdHJhdGUKLSAgICAgICAgICAgIHZpZEJpdHJhdGUgPSBiaXRyYXRlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIHZpZEJpdHJhdGU7Ci19Ci0KLU00T1NBX0ludDMyIE00TUNTX2ludExpbWl0Qml0cmF0ZUZvck1wZWc0RW5jKE00T1NBX0ludDMyIHByb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBsZXZlbCwgTTRPU0FfSW50MzIgYml0cmF0ZSkgewotCi0gICAgTTRPU0FfSW50MzIgdmlkQml0cmF0ZSA9IDA7Ci0KLSAgICBzd2l0Y2ggKHByb2ZpbGUpIHsKLSAgICAgICAgY2FzZSBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlOgotICAgICAgICAgICAgc3dpdGNoIChsZXZlbCkgewotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fTVBFRzRMZXZlbDA6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDY0MDAwKSA/IDY0MDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19NUEVHNExldmVsMGI6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDEyODAwMCkgPyAxMjgwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX01QRUc0TGV2ZWwxOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiA2NDAwMCkgPyA2NDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fTVBFRzRMZXZlbDI6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDEyODAwMCkgPyAxMjgwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX01QRUc0TGV2ZWwzOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAzODQwMDApID8gMzg0MDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gV2UgZG8gbm90IGhhbmRsZSBhbnkgb3RoZXIgTVBFRzQgcHJvZmlsZSBmb3Igbm93LgotICAgICAgICAgICAgLy8gUmV0dXJuIGlucHV0IGJpdHJhdGUKLSAgICAgICAgICAgIHZpZEJpdHJhdGUgPSBiaXRyYXRlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIHZpZEJpdHJhdGU7Ci19Ci0KLU00T1NBX0ludDMyIE00TUNTX2ludExpbWl0Qml0cmF0ZUZvckgyNjNFbmMoTTRPU0FfSW50MzIgcHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIGxldmVsLCBNNE9TQV9JbnQzMiBiaXRyYXRlKSB7Ci0KLSAgICBNNE9TQV9JbnQzMiB2aWRCaXRyYXRlID0gMDsKLQotICAgIHN3aXRjaCAocHJvZmlsZSkgewotICAgICAgICBjYXNlIE9NWF9WSURFT19IMjYzUHJvZmlsZUJhc2VsaW5lOgotICAgICAgICAgICAgc3dpdGNoIChsZXZlbCkgewotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fSDI2M0xldmVsMTA6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDY0MDAwKSA/IDY0MDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19IMjYzTGV2ZWwyMDoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMTI4MDAwKSA/IDEyODAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fSDI2M0xldmVsMzA6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDM4NDAwMCkgPyAzODQwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvLyBXZSBkbyBub3QgaGFuZGxlIGFueSBvdGhlciBIMjYzIHByb2ZpbGUgZm9yIG5vdy4KLSAgICAgICAgICAgIC8vIFJldHVybiBpbnB1dCBiaXRyYXRlCi0gICAgICAgICAgICB2aWRCaXRyYXRlID0gYml0cmF0ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiB2aWRCaXRyYXRlOwotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTTRNQ1NfQXVkaW9FZmZlY3RzLmMgYi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9NNE1DU19BdWRpb0VmZmVjdHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDg4ZGU2OC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9NNE1DU19BdWRpb0VmZmVjdHMuYworKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRNQ1NfQVBJLmMKLSAqIEBicmllZiAgTUNTIGltcGxlbWVudGF0aW9uIChWaWRlbyBDb21wcmVzc29yIFNlcnZpY2UpCi0gKiBAbm90ZSAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBBUEkgYW5kIHRoZSBwcm9jZXNzaW5nIG9mIHRoZSBNQ1MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiovCi0KLS8qKioqKioqKioqKioqKioqLwotLyoqKiBJbmNsdWRlcyAqKiovCi0vKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBPU0FMIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIgICAvKio8IE9TQUwgbWVtb3J5IG1hbmFnZW1lbnQgKi8KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIiAgICAvKio8IE9TQUwgZGVidWcgbWFuYWdlbWVudCAqLwotCi0vKiBPdXIgaGVhZGVycyAqLwotI2luY2x1ZGUgIk00TUNTX0FQSS5oIgotI2luY2x1ZGUgIk00TUNTX0Vycm9yQ29kZXMuaCIKLSNpbmNsdWRlICJNNE1DU19JbnRlcm5hbFR5cGVzLmgiCi0jaW5jbHVkZSAiTTRNQ1NfSW50ZXJuYWxDb25maWcuaCIKLSNpbmNsdWRlICJNNE1DU19JbnRlcm5hbEZ1bmN0aW9ucy5oIgotCi0vKiBDb21tb24gaGVhZGVycyAoZm9yIGFhYykgKi8KLSNpbmNsdWRlICJNNF9Db21tb24uaCIKLQotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotI2luY2x1ZGUgIk00VkRfRVhURVJOQUxfSW50ZXJmYWNlLmgiCi0jZW5kaWYgLyogTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTICovCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19pbnRDaGVja0F1ZGlvRWZmZWN0cyhNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDb250ZXh0KQotICogQGJyaWVmICAgIENoZWNrIGlmIGFuIGVmZmVjdCBoYXMgdG8gYmUgYXBwbGllZCBjdXJyZW50bHkKLSAqIEBub3RlICAgIEl0IGlzIGNhbGxlZCBieSB0aGUgc3RlcEVuY29kaW5nIGZ1bmN0aW9uCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOKSBNQ1MgaW50ZXJuYWwgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfaW50Q2hlY2tBdWRpb0VmZmVjdHMoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQykKLXsKLSAgICBNNE9TQV9JbnQ4ICpwQWN0aXZlRWZmZWN0TnVtYmVyID0gJihwQy0+cEFjdGl2ZUVmZmVjdE51bWJlcik7Ci0KLSAgICAqcEFjdGl2ZUVmZmVjdE51bWJlciA9IC0xOwotCi0gICAgaWYocEMtPlJlYWRlckF1ZGlvQVUubV9DVFMgPiBwQy0+dWlCZWdpbkN1dFRpbWUKLSAgICAmJiBwQy0+UmVhZGVyQXVkaW9BVS5tX0NUUyA8IHBDLT51aUVuZEN1dFRpbWUpCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgb3V0cHV0UmVsYXRlZFRpbWUgPSAwOwotICAgICAgICBNNE9TQV9VSW50OCB1aUVmZmVjdEluZGV4ID0gMDsKLSAgICAgICAgb3V0cHV0UmVsYXRlZFRpbWUgPQotICAgICAgICAoTTRPU0FfVUludDMyKShwQy0+UmVhZGVyQXVkaW9BVS5tX0NUUyAgLSBwQy0+dWlCZWdpbkN1dFRpbWUgKyAwLjUpOwotCi0gICAgICAgIGZvcih1aUVmZmVjdEluZGV4PTA7IHVpRWZmZWN0SW5kZXg8cEMtPm5iRWZmZWN0czsgdWlFZmZlY3RJbmRleCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKG91dHB1dFJlbGF0ZWRUaW1lID49Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikocEMtPnBFZmZlY3RzW3VpRWZmZWN0SW5kZXhdLnVpU3RhcnRUaW1lKSkgJiYKLSAgICAgICAgICAgICAgICAob3V0cHV0UmVsYXRlZFRpbWUgPAotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKHBDLT5wRWZmZWN0c1t1aUVmZmVjdEluZGV4XS51aVN0YXJ0VGltZSArXAotICAgICAgICAgICAgICAgIHBDLT5wRWZmZWN0c1t1aUVmZmVjdEluZGV4XS51aUR1cmF0aW9uKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBBY3RpdmVFZmZlY3ROdW1iZXIgPSB1aUVmZmVjdEluZGV4OwotICAgICAgICAgICAgICAgIHVpRWZmZWN0SW5kZXggPSBwQy0+bmJFZmZlY3RzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfZWRpdEF1ZGlvRWZmZWN0RmN0X0ZhZGVJbigpCi0gKiBAYnJpZWYgICAgQXBwbHkgYXVkaW8gZWZmZWN0IEZhZGVJbiB0byBwUENNZGF0YQotICogQHBhcmFtICAgcEMgICAgICAgICAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICBwUENNZGF0YSAgICAoSU4vT1VUKSBJbnB1dCBhbmQgT3V0cHV0IFBDTSBhdWRpbyBkYXRhCi0gKiBAcGFyYW0gICAgdWlQQ01zaXplICAgIChJTikgICAgIFNpemUgb2YgcFBDTWRhdGEKLSAqIEBwYXJhbSAgICBwUHJvZ3Jlc3MgICAgKElOKSAgICAgRWZmZWN0IHByb2dyZXNzCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19lZGl0QXVkaW9FZmZlY3RGY3RfRmFkZUluKCAgTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MTYgKnBQQ01kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlQQ01zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MpCi17Ci0gICAgLyogd2Ugd2lsbCBjYXN0IGVhY2ggSW50MTYgc2FtcGxlIGludG8gdGhpcyBJbnQzMiB2YXJpYWJsZSAqLwotICAgIE00T1NBX0ludDMyIGkzMnNhbXBsZTsKLQotICAgIC8qKgotICAgICAqIFNhbml0eSBjaGVjayAqLwotICAgIGlmKHBQcm9ncmVzcy0+dWlQcm9ncmVzcyA+IDEwMDApCi0gICAgewotICAgICAgICBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgPSAxMDAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZyb20gYnVmZmVyIHNpemUgKGJ5dGVzKSB0byBudW1iZXIgb2Ygc2FtcGxlIChpbnQxNik6IGRpdmlkZSBieSB0d28gKi8KLSAgICB1aVBDTXNpemUgPj49IDE7Ci0KLSAgICAvKioKLSAgICAgKiBMb29wIG9uIHNhbXBsZXMgKi8KLSAgICB3aGlsZSAodWlQQ01zaXplLS0+MCkgLyoqPCBkZWNyZW1lbnRpbmcgdG8gb3B0aW1pemUgKi8KLSAgICB7Ci0gICAgICAgIGkzMnNhbXBsZSA9ICpwUENNZGF0YTsKLSAgICAgICAgaTMyc2FtcGxlICo9IHBQcm9ncmVzcy0+dWlQcm9ncmVzczsKLSAgICAgICAgaTMyc2FtcGxlIC89IDEwMDA7Ci0gICAgICAgICpwUENNZGF0YSsrID0gKE00T1NBX0ludDE2KWkzMnNhbXBsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgICBSZXR1cm4gKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfZWRpdEF1ZGlvRWZmZWN0RmN0X0ZhZGVJbjogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19lZGl0QXVkaW9FZmZlY3RGY3RfRmFkZU91dCgpCi0gKiBAYnJpZWYgICAgQXBwbHkgYXVkaW8gZWZmZWN0IEZhZGVJbiB0byBwUENNZGF0YQotICogQHBhcmFtICAgIHBDICAgICAgICAgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcFBDTWRhdGEgICAgKElOL09VVCkgSW5wdXQgYW5kIE91dHB1dCBQQ00gYXVkaW8gZGF0YQotICogQHBhcmFtICAgIHVpUENNc2l6ZSAgICAoSU4pICAgICBTaXplIG9mIHBQQ01kYXRhCi0gKiBAcGFyYW0gICAgcFByb2dyZXNzICAgIChJTikgICAgIEVmZmVjdCBwcm9ncmVzcwotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19lZGl0QXVkaW9FZmZlY3RGY3RfRmFkZU91dCggTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MTYgKnBQQ01kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlQQ01zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MpCi17Ci0gICAgLyogd2Ugd2lsbCBjYXN0IGVhY2ggSW50MTYgc2FtcGxlIGludG8gdGhpcyBJbnQzMiB2YXJpYWJsZSAqLwotICAgIE00T1NBX0ludDMyIGkzMnNhbXBsZTsKLQotICAgIC8qKgotICAgICAqIFNhbml0eSBjaGVjayAqLwotICAgIGlmKHBQcm9ncmVzcy0+dWlQcm9ncmVzcyA+IDEwMDApCi0gICAgewotICAgICAgICBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgPSAxMDAwOwotICAgIH0KLSAgICBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgPSAxMDAwIC0gcFByb2dyZXNzLT51aVByb2dyZXNzOwotCi0gICAgLyoqCi0gICAgICogRnJvbSBidWZmZXIgc2l6ZSAoYnl0ZXMpIHRvIG51bWJlciBvZiBzYW1wbGUgKGludDE2KTogZGl2aWRlIGJ5IHR3byAqLwotICAgIHVpUENNc2l6ZSA+Pj0gMTsKLQotICAgIC8qKgotICAgICAqIExvb3Agb24gc2FtcGxlcyAqLwotICAgIHdoaWxlICh1aVBDTXNpemUtLT4wKSAvKio8IGRlY3JlbWVudGluZyB0byBvcHRpbWl6ZSAqLwotICAgIHsKLSAgICAgICAgaTMyc2FtcGxlID0gKnBQQ01kYXRhOwotICAgICAgICBpMzJzYW1wbGUgKj0gcFByb2dyZXNzLT51aVByb2dyZXNzOwotICAgICAgICBpMzJzYW1wbGUgLz0gMTAwMDsKLSAgICAgICAgKnBQQ01kYXRhKysgPSAoTTRPU0FfSW50MTYpaTMyc2FtcGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICAgIFJldHVybiAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19lZGl0QXVkaW9FZmZlY3RGY3RfRmFkZU91dDogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTTRNQ1NfQ29kZWNzLmMgYi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9NNE1DU19Db2RlY3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTU0NDkyYi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9NNE1DU19Db2RlY3MuYworKysgL2Rldi9udWxsCkBAIC0xLDkxNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNE1DU19Db2RlY3MuYwotICogQGJyaWVmICBNQ1MgaW1wbGVtZW50YXRpb24KLSAqIEBub3RlICAgVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCBmdW5jdGlvbnMgcmVsYXRlZCB0byBhdWRpby92aWRlbwotICogICAgICAgICBjb2RlYyBtYW5pcHVsYXRpb25zLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBJbmNsdWRlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIgICAgICAgICAgICAvKiBJbmNsdWRlIGZvciBPU0FMIGRlYnVnIHNlcnZpY2VzICovCi0jaW5jbHVkZSAiTTRNQ1NfSW50ZXJuYWxUeXBlcy5oIiAgICAvKiBJbnRlcm5hbCB0eXBlcyBvZiB0aGUgTUNTICovCi0KLQotI2lmZGVmIE00TUNTX1NVUFBPUlRfVklERUNfM0dQCi0jaW5jbHVkZSAiTTRfTVBFRzRWSV9WaWRlb0hhbmRsZXIuaCIgIC8qbmVlZGVkIGZvciByZW5kZXJlciBlcnJvciBjb2RlcyovCi0jZW5kaWYKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00TUNTX2NsZWFySW50ZXJmYWNlVGFibGVzKCkKLSAqIEBicmllZiAgICBDbGVhciBlbmNvZGVycywgZGVjb2RlcnMsIHJlYWRlciBhbmQgd3JpdGVycyBpbnRlcmZhY2VzIHRhYmxlcwotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBUaGUgY29udGV4dCBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX2NsZWFySW50ZXJmYWNlVGFibGVzKE00TUNTX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX1VJbnQ4IGk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgLyogSW5pdGlhbGlzYXRpb24gdGhhdCB3aWxsIGFsbG93IHRvIGNoZWNrIGlmIHJlZ2lzdGVyaW5nIHR3aWNlICovCi0gICAgcEMtPnBXcml0ZXJHbG9iYWxGY3RzID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFdyaXRlckRhdGFGY3RzID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cyA9IE00T1NBX05VTEw7Ci0KLSAgICBwQy0+cEN1cnJlbnRWaWRlb0VuY29kZXJFeHRlcm5hbEFQSSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBDdXJyZW50VmlkZW9FbmNvZGVyVXNlckRhdGEgPSBNNE9TQV9OVUxMOwotCi0gICAgZm9yIChpID0gMDsgaSA8IE00V1JJVEVSX2tUeXBlX05COyBpKysgKQotICAgIHsKLSAgICAgICAgcEMtPldyaXRlckludGVyZmFjZVtpXS5wR2xvYmFsRmN0cyA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5Xcml0ZXJJbnRlcmZhY2VbaV0ucERhdGFGY3RzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTTRFTkNPREVSX2tWaWRlb19OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPnBWaWRlb0VuY29kZXJFeHRlcm5hbEFQSVRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPnBWaWRlb0VuY29kZXJVc2VyRGF0YVRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTTRFTkNPREVSX2tBdWRpb19OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPnBBdWRpb0VuY29kZXJGbGFnW2ldID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgIHBDLT5wQXVkaW9FbmNvZGVyVXNlckRhdGFUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyogSW5pdGlhbGlzYXRpb24gdGhhdCB3aWxsIGFsbG93IHRvIGNoZWNrIGlmIHJlZ2lzdGVyaW5nIHR3aWNlICovCi0gICAgcEMtPm1fcFJlYWRlciA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm1fcFJlYWRlckRhdGFJdCAgID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV91aU5iUmVnaXN0ZXJlZFJlYWRlcnMgID0gMDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBNNFJFQURFUl9rTWVkaWFUeXBlX05COyBpKysgKQotICAgIHsKLSAgICAgICAgcEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICBwQy0+bV9wUmVhZGVyRGF0YUl0VGFibGVbaV0gICA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgcEMtPm1fcFZpZGVvRGVjb2RlciA9IE00T1NBX05VTEw7Ci0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0gICAgcEMtPm1fcEN1cnJlbnRWaWRlb0RlY29kZXJVc2VyRGF0YSA9IE00T1NBX05VTEw7Ci0jZW5kaWYgLyogTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTICovCi0gICAgcEMtPm1fdWlOYlJlZ2lzdGVyZWRWaWRlb0RlYyA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IE00REVDT0RFUl9rVmlkZW9UeXBlX05COyBpKysgKQotICAgIHsKLSAgICAgICAgcEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbaV0gPSBNNE9TQV9OVUxMOwotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotICAgICAgICBwQy0+bV9wVmlkZW9EZWNvZGVyVXNlckRhdGFUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0jZW5kaWYgLyogTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTICovCi0gICAgfQotCi0gICAgcEMtPm1fcEF1ZGlvRGVjb2RlciA9IE00T1NBX05VTEw7Ci0gICAgZm9yIChpID0gMDsgaSA8IE00QURfa1R5cGVfTkI7IGkrKyApCi0gICAgewotICAgICAgICBwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5tX3BBdWRpb0RlY29kZXJGbGFnVGFibGVbaV0gPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgcEMtPm1fcEF1ZGlvRGVjb2RlclVzZXJEYXRhVGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00TUNTX3JlZ2lzdGVyV3JpdGVyKCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVnaXN0ZXIgYSBzcGVjaWZpYyBmaWxlIGZvcm1hdCB3cml0ZXIuCi0gKiBAbm90ZSAgICBBY2NvcmRpbmcgdG8gdGhlIE1lZGlhdHlwZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHN0b3JlIGluIHRoZSBpbnRlcm5hbCBjb250ZXh0Ci0gKiAgICAgICAgICB0aGUgd3JpdGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICAgTTRFUlJfUEFSQU1FVEVSICAgICBwQ29udGV4dCxwV3RyR2xvYmFsSW50ZXJmYWNlIG9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV3RyRGF0YUludGVyZmFjZSBpcyBNNE9TQV9OVUxMCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVidWcgb25seSksIG9yIGludmFsaWQgTWVkaWFUeXBlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3JlZ2lzdGVyV3JpdGVyKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00V1JJVEVSX091dHB1dEZpbGVUeXBlIE1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSogcFd0ckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqIHBXdHJEYXRhSW50ZXJmYWNlKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLQotICAgIC8qKgotICAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKHBDID09IE00T1NBX05VTEwpLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNQ1M6IGNvbnRleHQgaXMgTTRPU0FfTlVMTCBpbiBNNE1DU19yZWdpc3RlcldyaXRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocFd0ckdsb2JhbEludGVyZmFjZSA9PSBNNE9TQV9OVUxMKSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAicFd0ckdsb2JhbEludGVyZmFjZSBpcyBNNE9TQV9OVUxMIGluIE00TUNTX3JlZ2lzdGVyV3JpdGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChwV3RyRGF0YUludGVyZmFjZSA9PSBNNE9TQV9OVUxMKSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAicFd0ckRhdGFJbnRlcmZhY2UgaXMgTTRPU0FfTlVMTCBpbiBNNE1DU19yZWdpc3RlcldyaXRlciIpOwotCi0gICAgTTRPU0FfVFJBQ0UzXzMoIk1DUzogTTRNQ1NfcmVnaXN0ZXJXcml0ZXIgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCxcCi0gICAgIHBXdHJHbG9iYWxJbnRlcmZhY2U9MHgleCwgcFd0ckRhdGFJbnRlcmZhY2U9MHgleCIsIHBDLHBXdHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgIHBXdHJEYXRhSW50ZXJmYWNlKTsKLQotICAgIGlmKChNZWRpYVR5cGUgPT0gTTRXUklURVJfa1Vua25vd24pIHx8IChNZWRpYVR5cGUgPj0gTTRXUklURVJfa1R5cGVfTkIpKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwgIkludmFsaWQgbWVkaWEgdHlwZSIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmIChwQy0+V3JpdGVySW50ZXJmYWNlW01lZGlhVHlwZV0ucEdsb2JhbEZjdHMgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAvKiBhIHdyaXRlciBjb3JyZXNwb25kaW5nIHRvIHRoaXMgbWVkaWEgdHlwZSBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgISovCi0gICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRFUlJfUEFSQU1FVEVSLCAiVGhpcyBtZWRpYSB0eXBlIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCIpOwotICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFNhdmUgd3JpdGVyIGludGVyZmFjZSBpbiBjb250ZXh0ICovCi0gICAgcEMtPldyaXRlckludGVyZmFjZVtNZWRpYVR5cGVdLnBHbG9iYWxGY3RzID0gcFd0ckdsb2JhbEludGVyZmFjZTsKLSAgICBwQy0+V3JpdGVySW50ZXJmYWNlW01lZGlhVHlwZV0ucERhdGFGY3RzID0gcFd0ckRhdGFJbnRlcmZhY2U7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlckVuY29kZXIoKQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gd2lsbCByZWdpc3RlciBhIHNwZWNpZmljIHZpZGVvIGVuY29kZXIuCi0gKiBAbm90ZSAgICBBY2NvcmRpbmcgdG8gdGhlIE1lZGlhdHlwZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHN0b3JlIGluIHRoZSBpbnRlcm5hbCBjb250ZXh0Ci0gKiAgICAgICAgICAgdGhlIGVuY29kZXIgY29udGV4dC4KLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgIHBDb250ZXh0IG9yIHBFbmNHbG9iYWxJbnRlcmZhY2UgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSksCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaW52YWxpZCBNZWRpYVR5cGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJWaWRlb0VuY29kZXIgKAotICAgICAgICAgICAgICAgICAgICBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfRm9ybWF0IE1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSAqcEVuY0dsb2JhbEludGVyZmFjZSkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICAvKioKLSAgICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChwQyA9PSBNNE9TQV9OVUxMKSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTUNTOiBjb250ZXh0IGlzIE00T1NBX05VTEwgaW4gTTRNQ1NfcmVnaXN0ZXJWaWRlb0VuY29kZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKHBFbmNHbG9iYWxJbnRlcmZhY2UgPT0gTTRPU0FfTlVMTCksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgInBFbmNHbG9iYWxJbnRlcmZhY2UgaXMgTTRPU0FfTlVMTCBpbiBNNE1DU19yZWdpc3RlclZpZGVvRW5jb2RlciIpOwotCi0gICAgTTRPU0FfVFJBQ0UzXzIoIk1DUzogTTRNQ1NfcmVnaXN0ZXJWaWRlb0VuY29kZXIgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCxcCi0gICAgICAgICBwRW5jR2xvYmFsSW50ZXJmYWNlPTB4JXgiLCBwQywgcEVuY0dsb2JhbEludGVyZmFjZSk7Ci0KLSAgICBpZiAoTWVkaWFUeXBlID49IE00RU5DT0RFUl9rVmlkZW9fTkIpCi0gICAgewotICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwgIkludmFsaWQgdmlkZW8gZW5jb2RlciB0eXBlIik7Ci0gICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmIChwQy0+cFZpZGVvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICAvKiBjYW4gYmUgbGVnaXRpbWF0ZSwgaW4gY2FzZXMgd2hlcmUgd2UgaGF2ZSBvbmUgdmVyc2lvbiB0aGF0IGNhbiB1c2UgZXh0ZXJuYWwgZW5jb2RlcnMKLSAgICAgICAgYnV0IHdoaWNoIHN0aWxsIGhhcyB0aGUgYnVpbHQtaW4gb25lIHRvIGJlIGFibGUgdG8gd29yayB3aXRob3V0IGFuIGV4dGVybmFsIGVuY29kZXI7IGluCi0gICAgICAgIHRoaXMgY2FzZSB0aGUgbmV3IGVuY29kZXIgc2ltcGx5IHJlcGxhY2VzIHRoZSBvbGQgb25lIChpLmUuIHdlIHVucmVnaXN0ZXIgaXQgZmlyc3QpLiAqLwotICAgICAgICBmcmVlKHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0pOwotICAgICAgICBwQy0+cFZpZGVvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFNhdmUgZW5jb2RlciBpbnRlcmZhY2UgaW4gY29udGV4dCAqLwotICAgIHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0gPSBwRW5jR2xvYmFsSW50ZXJmYWNlOwotICAgIC8qIFRoZSBhY3R1YWwgdXNlckRhdGEgYW5kIGV4dGVybmFsIEFQSSB3aWxsIGJlIHNldCBieSB0aGUgcmVnaXN0cmF0aW9uIGZ1bmN0aW9uIGluIHRoZSBjYXNlCi0gICAgb2YgYW4gZXh0ZXJuYWwgZW5jb2RlciAoYWRkIGl0IGFzIGEgcGFyYW1ldGVyIHRvIHRoaXMgZnVuY3Rpb24gaW4gdGhlIGxvbmcgcnVuPykgKi8KLSAgICBwQy0+cFZpZGVvRW5jb2RlclVzZXJEYXRhVGFibGVbTWVkaWFUeXBlXSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBWaWRlb0VuY29kZXJFeHRlcm5hbEFQSVRhYmxlW01lZGlhVHlwZV0gPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJBdWRpb0VuY29kZXIoKQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gd2lsbCByZWdpc3RlciBhIHNwZWNpZmljIGF1ZGlvIGVuY29kZXIuCi0gKiBAbm90ZSAgICBBY2NvcmRpbmcgdG8gdGhlIE1lZGlhdHlwZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHN0b3JlIGluIHRoZSBpbnRlcm5hbCBjb250ZXh0Ci0gKiAgICAgICAgICAgdGhlIGVuY29kZXIgY29udGV4dC4KLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgICAgICAgICAgICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSAqIEBwYXJhbSAgICBtZWRpYVR5cGU6ICAgICAgICAgICAgICAgIChJTikgVGhlIG1lZGlhIHR5cGUuCi0gKiBAcGFyYW0gICAgcEVuY0dsb2JhbEludGVyZmFjZTogICAgKE9VVCkgdGhlIGVuY29kZXIgaW50ZXJmYWNlIGZ1bmN0aW9ucy4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVI6ICAgcENvbnRleHQgb3IgcEVuY0dsb2JhbEludGVyZmFjZSBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlckF1ZGlvRW5jb2RlcigKLSAgICAgICAgICAgICAgICAgICAgTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0IE1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlICpwRW5jR2xvYmFsSW50ZXJmYWNlKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLQotICAgIC8qKgotICAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKHBDID09IE00T1NBX05VTEwpLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNQ1M6IGNvbnRleHQgaXMgTTRPU0FfTlVMTCBpbiBNNE1DU19yZWdpc3RlckF1ZGlvRW5jb2RlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocEVuY0dsb2JhbEludGVyZmFjZSA9PSBNNE9TQV9OVUxMKSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAicEVuY0dsb2JhbEludGVyZmFjZSBpcyBNNE9TQV9OVUxMIGluIE00TUNTX3JlZ2lzdGVyQXVkaW9FbmNvZGVyIik7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigiTUNTOiBNNE1DU19yZWdpc3RlckF1ZGlvRW5jb2RlciBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4LFwKLSAgICAgICAgIHBFbmNHbG9iYWxJbnRlcmZhY2U9MHgleCIsIHBDLCBwRW5jR2xvYmFsSW50ZXJmYWNlKTsKLQotICAgIGlmIChNZWRpYVR5cGUgPj0gTTRFTkNPREVSX2tBdWRpb19OQikKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNEVSUl9QQVJBTUVURVIsICJJbnZhbGlkIGF1ZGlvIGVuY29kZXIgdHlwZSIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmKE00T1NBX05VTEwgIT0gcEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbTWVkaWFUeXBlXSkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbTWVkaWFUeXBlXSk7Ci0gICAgICAgIHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0gPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIGlmKE00T1NBX05VTEwgIT0gcEMtPnBBdWRpb0VuY29kZXJVc2VyRGF0YVRhYmxlW01lZGlhVHlwZV0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocEMtPnBBdWRpb0VuY29kZXJVc2VyRGF0YVRhYmxlW01lZGlhVHlwZV0pOwotICAgICAgICAgICAgcEMtPnBBdWRpb0VuY29kZXJVc2VyRGF0YVRhYmxlW01lZGlhVHlwZV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBTYXZlIGVuY29kZXIgaW50ZXJmYWNlIGluIGNvbnRleHQgKi8KLSAgICBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdID0gcEVuY0dsb2JhbEludGVyZmFjZTsKLSAgICBwQy0+cEF1ZGlvRW5jb2RlckZsYWdbTWVkaWFUeXBlXSA9IE00T1NBX0ZBTFNFOyAvKiBpbnRlcm5hbCBlbmNvZGVyICovCi0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlclJlYWRlcigpCi0gKiBAYnJpZWYgICAgUmVnaXN0ZXIgcmVhZGVyLgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlclJlYWRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9NZWRpYVR5cGUgbWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlICpwUmRyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSAqcFJkckRhdGFJbnRlcmZhY2UpCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0OwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcFJkckdsb2JhbEludGVyZmFjZSksCi0gICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE1DU19yZWdpc3RlclJlYWRlcjogaW52YWxpZCBwb2ludGVyIG9uIGdsb2JhbCBpbnRlcmZhY2UiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcFJkckRhdGFJbnRlcmZhY2UpLAotICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRNQ1NfcmVnaXN0ZXJSZWFkZXI6IGludmFsaWQgcG9pbnRlciBvbiBkYXRhIGludGVyZmFjZSIpOwotCi0gICAgaWYgKG1lZGlhVHlwZSA9PSBNNFJFQURFUl9rTWVkaWFUeXBlVW5rbm93biB8fCBtZWRpYVR5cGUgPj0gTTRSRUFERVJfa01lZGlhVHlwZV9OQikKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNEVSUl9QQVJBTUVURVIsICJJbnZhbGlkIG1lZGlhIHR5cGUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiAocEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbbWVkaWFUeXBlXSAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgLyogYSByZWFkZXIgY29ycmVzcG9uZGluZyB0byB0aGlzIG1lZGlhIHR5cGUgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkICEqLwotICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwgIlRoaXMgbWVkaWEgdHlwZSBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQiKTsKLSAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgcEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbbWVkaWFUeXBlXSA9IHBSZHJHbG9iYWxJbnRlcmZhY2U7Ci0gICAgcEMtPm1fcFJlYWRlckRhdGFJdFRhYmxlW21lZGlhVHlwZV0gICA9IHBSZHJEYXRhSW50ZXJmYWNlOwotCi0gICAgcEMtPm1fdWlOYlJlZ2lzdGVyZWRSZWFkZXJzKys7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlclZpZGVvRGVjb2RlcigpCi0gKiBAYnJpZWYgICAgUmVnaXN0ZXIgdmlkZW8gZGVjb2RlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHBhcmFtICAgIGRlY29kZXJUeXBlICAgICAgICAgICAgKElOKSBEZWNvZGVyIHR5cGUKLSAqIEBwYXJhbSAgICBwRGVjb2RlckludGVyZmFjZSAgICAoSU4pIERlY29kZXIgaW50ZXJmYWNlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSksIG9yIHRoZSBkZWNvZGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgaXMgaW52YWxpZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlclZpZGVvRGVjb2RlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9WaWRlb1R5cGUgZGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlICpwRGVjb2RlckludGVyZmFjZSkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwRGVjb2RlckludGVyZmFjZSksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNE1DU19yZWdpc3RlclZpZGVvRGVjb2RlcjogaW52YWxpZCBwb2ludGVyIG9uIGRlY29kZXIgaW50ZXJmYWNlIik7Ci0KLSAgICBpZiAoZGVjb2RlclR5cGUgPj0gTTRERUNPREVSX2tWaWRlb1R5cGVfTkIpCi0gICAgewotICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwgIkludmFsaWQgdmlkZW8gZGVjb2RlciB0eXBlIik7Ci0gICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmIChwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0gIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0jaWZuZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotICAgICAgICAvKiBhIGRlY29kZXIgY29ycmVzcG9uZGluZyB0byB0aGlzIG1lZGlhIHR5cGUgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkICEqLwotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRFUlJfUEFSQU1FVEVSLCAiRGVjb2RlciBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSNlbHNlIC8qIGV4dGVybmFsIGRlY29kZXJzIGFyZSBwb3NzaWJsZSAqLwotICAgICAgICAvKiBjYW4gYmUgbGVnaXRpbWF0ZSwgaW4gY2FzZXMgd2hlcmUgd2UgaGF2ZSBvbmUgdmVyc2lvbiB0aGF0IGNhbiB1c2UgZXh0ZXJuYWwgZGVjb2RlcnMKLSAgICAgICAgYnV0IHdoaWNoIHN0aWxsIGhhcyB0aGUgYnVpbHQtaW4gb25lIHRvIGJlIGFibGUgdG8gd29yayB3aXRob3V0IGFuIGV4dGVybmFsIGRlY29kZXI7IGluCi0gICAgICAgIHRoaXMgY2FzZSB0aGUgbmV3IGRlY29kZXIgc2ltcGx5IHJlcGxhY2VzIHRoZSBvbGQgb25lIChpLmUuIHdlIHVucmVnaXN0ZXIgaXQgZmlyc3QpLiAqLwotICAgICAgICBmcmVlKHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSk7Ci0gICAgICAgIHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIC8qIG9oLCBhbmQgZG9uJ3QgZm9yZ2V0IHRoZSB1c2VyIGRhdGEsIHRvby4gKi8KLSAgICAgICAgaWYgKHBDLT5tX3BWaWRlb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXSAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5tX3BWaWRlb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXSk7Ci0gICAgICAgICAgICBwQy0+bV9wVmlkZW9EZWNvZGVyVXNlckRhdGFUYWJsZVtkZWNvZGVyVHlwZV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0jZW5kaWYgLyogYXJlIGV4dGVybmFsIGRlY29kZXJzIHBvc3NpYmxlPyAqLwotICAgIH0KLQotICAgIHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSA9IHBEZWNvZGVySW50ZXJmYWNlOwotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotICAgIHBDLT5tX3BWaWRlb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXSA9IE00T1NBX05VTEw7Ci0gICAgLyogVGhlIGFjdHVhbCB1c2VyRGF0YSB3aWxsIGJlIHNldCBieSB0aGUgcmVnaXN0cmF0aW9uIGZ1bmN0aW9uIGluIHRoZSBjYXNlCi0gICAgb2YgYW4gZXh0ZXJuYWwgZGVjb2RlciAoYWRkIGl0IGFzIGEgcGFyYW1ldGVyIHRvIHRoaXMgZnVuY3Rpb24gaW4gdGhlIGxvbmcgcnVuPykgKi8KLSNlbmRpZiAvKiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMgKi8KLSAgICBwQy0+bV91aU5iUmVnaXN0ZXJlZFZpZGVvRGVjKys7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlckF1ZGlvRGVjb2RlcigpCi0gKiBAYnJpZWYgICAgUmVnaXN0ZXIgYXVkaW8gZGVjb2RlcgotICogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbnRlcm5hbHkgYnkgdGhlIE1DUyB0bwotICogICAgICAgICAgICAgIHJlZ2lzdGVyIGF1ZGlvIGRlY29kZXJzLAotICogQHBhcmFtICAgIGNvbnRleHQgICAgICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgZGVjb2RlclR5cGUgICAgICAgICAgICAoSU4pIEF1ZGlvIGRlY29kZXIgdHlwZQotICogQHBhcmFtICAgIHBEZWNvZGVySW50ZXJmYWNlICAgIChJTikgQXVkaW8gZGVjb2RlciBpbnRlcmZhY2UuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwsIG9yIHRoZSBkZWNvZGVyIHR5cGUgaXMgaW52YWxpZChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlckF1ZGlvRGVjb2RlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEFEX1R5cGUgZGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEFEX0ludGVyZmFjZSAqcERlY29kZXJJbnRlcmZhY2UpCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0OwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcERlY29kZXJJbnRlcmZhY2UpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRNQ1NfcmVnaXN0ZXJBdWRpb0RlY29kZXI6IGludmFsaWQgcG9pbnRlciBvbiBkZWNvZGVyIGludGVyZmFjZSIpOwotCi0gICAgaWYgKGRlY29kZXJUeXBlID49IE00QURfa1R5cGVfTkIpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRFUlJfUEFSQU1FVEVSLCAiSW52YWxpZCBhdWRpbyBkZWNvZGVyIHR5cGUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdKTsKLSAgICAgICAgcEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdID0gTTRPU0FfTlVMTDsKLQotICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5tX3BBdWRpb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXSkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+bV9wQXVkaW9EZWNvZGVyVXNlckRhdGFUYWJsZVtkZWNvZGVyVHlwZV0pOwotICAgICAgICAgICAgcEMtPm1fcEF1ZGlvRGVjb2RlclVzZXJEYXRhVGFibGVbZGVjb2RlclR5cGVdID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLSAgICBwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0gPSBwRGVjb2RlckludGVyZmFjZTsKLSAgICBwQy0+bV9wQXVkaW9EZWNvZGVyRmxhZ1RhYmxlW2RlY29kZXJUeXBlXSA9IE00T1NBX0ZBTFNFOyAvKiBpbnRlcm5hbCBkZWNvZGVyICovCi0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU191blJlZ2lzdGVyQWxsV3JpdGVycygpCi0gKiBAYnJpZWYgICAgVW5yZWdpc3RlciB3cml0ZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfdW5SZWdpc3RlckFsbFdyaXRlcnMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfSW50MzIgaTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTTRXUklURVJfa1R5cGVfTkI7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChwQy0+V3JpdGVySW50ZXJmYWNlW2ldLnBHbG9iYWxGY3RzICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocEMtPldyaXRlckludGVyZmFjZVtpXS5wR2xvYmFsRmN0cyApOwotICAgICAgICAgICAgcEMtPldyaXRlckludGVyZmFjZVtpXS5wR2xvYmFsRmN0cyA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBDLT5Xcml0ZXJJbnRlcmZhY2VbaV0ucERhdGFGY3RzICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocEMtPldyaXRlckludGVyZmFjZVtpXS5wRGF0YUZjdHMgKTsKLSAgICAgICAgICAgIHBDLT5Xcml0ZXJJbnRlcmZhY2VbaV0ucERhdGFGY3RzID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHBDLT5wV3JpdGVyR2xvYmFsRmN0cyA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBXcml0ZXJEYXRhRmN0cyA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU191blJlZ2lzdGVyQWxsRW5jb2RlcnMoKQotICogQGJyaWVmICAgIFVucmVnaXN0ZXIgdGhlIGVuY29kZXJzCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3VuUmVnaXN0ZXJBbGxFbmNvZGVycyhNNE1DU19Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLSAgICBNNE9TQV9JbnQzMiBpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBNNEVOQ09ERVJfa1ZpZGVvX05COyBpKyspCi0gICAgewotICAgICAgICBpZiAocEMtPnBWaWRlb0VuY29kZXJJbnRlcmZhY2VbaV0gIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+cFZpZGVvRW5jb2RlckludGVyZmFjZVtpXSApOwotICAgICAgICAgICAgcEMtPnBWaWRlb0VuY29kZXJJbnRlcmZhY2VbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IE00RU5DT0RFUl9rQXVkaW9fTkI7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtpXSAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKkRvbid0IGZyZWUgZXh0ZXJuYWwgYXVkaW8gZW5jb2RlcnMgaW50ZXJmYWNlcyovCi0gICAgICAgICAgICBpZiAoTTRPU0FfRkFMU0UgPT0gcEMtPnBBdWRpb0VuY29kZXJGbGFnW2ldKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUocEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbaV0gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cyA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzID0gTTRPU0FfTlVMTDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00TUNTX3VuUmVnaXN0ZXJBbGxSZWFkZXJzKCkKLSAqIEBicmllZiAgICBVbnJlZ2lzdGVyIHJlYWRlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU191blJlZ2lzdGVyQWxsUmVhZGVycyhNNE1DU19Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLSAgICBNNE9TQV9JbnQzMiBpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBNNFJFQURFUl9rTWVkaWFUeXBlX05COyBpKyspCi0gICAgewotICAgICAgICBpZiAocEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbaV0gIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+bV9wUmVhZGVyR2xvYmFsSXRUYWJsZVtpXSApOwotICAgICAgICAgICAgcEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwQy0+bV9wUmVhZGVyRGF0YUl0VGFibGVbaV0gIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+bV9wUmVhZGVyRGF0YUl0VGFibGVbaV0gKTsKLSAgICAgICAgICAgIHBDLT5tX3BSZWFkZXJEYXRhSXRUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwQy0+bV91aU5iUmVnaXN0ZXJlZFJlYWRlcnMgPSAwOwotICAgIHBDLT5tX3BSZWFkZXIgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3BSZWFkZXJEYXRhSXQgPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRNQ1NfdW5SZWdpc3RlckFsbERlY29kZXJzKCkKLSAqIEBicmllZiAgICBVbnJlZ2lzdGVyIHRoZSBkZWNvZGVycwotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU191blJlZ2lzdGVyQWxsRGVjb2RlcnMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfSW50MzIgaTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTTRERUNPREVSX2tWaWRlb1R5cGVfTkI7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtpXSAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2ldICk7Ci0gICAgICAgICAgICBwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTTRBRF9rVHlwZV9OQjsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2ldICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qRG9uJ3QgZnJlZSBleHRlcm5hbCBhdWRpbyBkZWNvZGVycyBpbnRlcmZhY2VzKi8KLSAgICAgICAgICAgIGlmIChNNE9TQV9GQUxTRSA9PSBwQy0+bV9wQXVkaW9EZWNvZGVyRmxhZ1RhYmxlW2ldKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUocEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbaV0gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHBDLT5tX3VpTmJSZWdpc3RlcmVkVmlkZW9EZWMgPSAwOwotICAgIHBDLT5tX3BWaWRlb0RlY29kZXIgPSBNNE9TQV9OVUxMOwotCi0gICAgcEMtPm1fcEF1ZGlvRGVjb2RlciA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50V3JpdGVyKCkKLSAqIEBicmllZiAgICBTZXQgY3VycmVudCB3cml0ZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHBhcmFtICAgIG1lZGlhVHlwZSAgICAgICAgICAgIChJTikgTWVkaWEgdHlwZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgICAgICAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgICBNNFdBUl9NQ1NfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ6ICAgIE1lZGlhIHR5cGUgbm90IHN1cHBvcnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50V3JpdGVyKCBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgbWVkaWFUeXBlKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLSAgICBNNFdSSVRFUl9PdXRwdXRGaWxlVHlwZSB3cml0ZXJUeXBlOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIHN3aXRjaCAobWVkaWFUeXBlKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUDoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTVA0OgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NNFY6Ci0gICAgICAgICAgICB3cml0ZXJUeXBlID0gTTRXUklURVJfazNHUFA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQU1SOgotICAgICAgICAgICAgd3JpdGVyVHlwZSA9IE00V1JJVEVSX2tBTVI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTVAzOgotICAgICAgICAgICAgd3JpdGVyVHlwZSA9IE00V1JJVEVSX2tNUDM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfUENNOgotICAgICAgICAgICAgcEMtPmJfaXNSYXdXcml0ZXIgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgd3JpdGVyVHlwZSA9IE00V1JJVEVSX2tQQ007Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQsCi0gICAgICAgICAgICAgICAgICJXcml0ZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOwotICAgIH0KLQotICAgIHBDLT5wV3JpdGVyR2xvYmFsRmN0cyA9IHBDLT5Xcml0ZXJJbnRlcmZhY2Vbd3JpdGVyVHlwZV0ucEdsb2JhbEZjdHM7Ci0gICAgcEMtPnBXcml0ZXJEYXRhRmN0cyA9IHBDLT5Xcml0ZXJJbnRlcmZhY2Vbd3JpdGVyVHlwZV0ucERhdGFGY3RzOwotCi0gICAgaWYgKHBDLT5wV3JpdGVyR2xvYmFsRmN0cyA9PSBNNE9TQV9OVUxMIHx8IHBDLT5wV3JpdGVyRGF0YUZjdHMgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQsCi0gICAgICAgICAgICAgIldyaXRlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgcmV0dXJuIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBwQy0+cFdyaXRlckRhdGFGY3RzLT5wV3JpdGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50VmlkZW9FbmNvZGVyKCkKLSAqIEBicmllZiAgICBTZXQgYSB2aWRlbyBlbmNvZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBNZWRpYVR5cGUgICAgICAgICAgIChJTikgRW5jb2RlciB0eXBlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgICAgICAgICAgICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gICAgTTRXQVJfTUNTX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOiAgICBNZWRpYSB0eXBlIG5vdCBzdXBwb3J0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1Nfc2V0Q3VycmVudFZpZGVvRW5jb2RlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfVmlkZW9Gb3JtYXQgbWVkaWFUeXBlKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLSAgICBNNEVOQ09ERVJfRm9ybWF0IGVuY29kZXJUeXBlOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIHN3aXRjaCAobWVkaWFUeXBlKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2MzoKLSAgICAgICAgICAgIGVuY29kZXJUeXBlID0gTTRFTkNPREVSX2tIMjYzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa01QRUc0OgotICAgICAgICAgICAgZW5jb2RlclR5cGUgPSBNNEVOQ09ERVJfa01QRUc0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0gyNjQ6Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FWQwotICAgICAgICAgICAgZW5jb2RlclR5cGUgPSBNNEVOQ09ERVJfa0gyNjQ7Ci0gICAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICAgICAiVmlkZW8gZW5jb2RlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzID0gcEMtPnBWaWRlb0VuY29kZXJJbnRlcmZhY2VbZW5jb2RlclR5cGVdOwotICAgIHBDLT5wQ3VycmVudFZpZGVvRW5jb2RlckV4dGVybmFsQVBJID0gcEMtPnBWaWRlb0VuY29kZXJFeHRlcm5hbEFQSVRhYmxlW2VuY29kZXJUeXBlXTsKLSAgICBwQy0+cEN1cnJlbnRWaWRlb0VuY29kZXJVc2VyRGF0YSA9IHBDLT5wVmlkZW9FbmNvZGVyVXNlckRhdGFUYWJsZVtlbmNvZGVyVHlwZV07Ci0KLSAgICBpZiAocEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICJWaWRlbyBlbmNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00TUNTX3NldEN1cnJlbnRBdWRpb0VuY29kZXIoKQotICogQGJyaWVmICAgIFNldCBhbiBhdWRpbyBlbmNvZGVyCi0gKiBAcGFyYW0gICAgY29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHBhcmFtICAgIE1lZGlhVHlwZSAgICAgICAgKElOKSBFbmNvZGVyIHR5cGUKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3NldEN1cnJlbnRBdWRpb0VuY29kZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0F1ZGlvRm9ybWF0IG1lZGlhVHlwZSkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0IGVuY29kZXJUeXBlOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIHN3aXRjaCAobWVkaWFUeXBlKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQU1SX05COgotICAgICAgICAgICAgZW5jb2RlclR5cGUgPSBNNEVOQ09ERVJfa0FNUk5COwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FBQzoKLSAgICAgICAgICAgIGVuY29kZXJUeXBlID0gTTRFTkNPREVSX2tBQUM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTVAzOgotICAgICAgICAgICAgZW5jb2RlclR5cGUgPSBNNEVOQ09ERVJfa01QMzsKLSAgICAgICAgICAgIGJyZWFrOwotLy9FVlJDCi0vLyAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRVZSQzoKLS8vICAgICAgICAgICAgZW5jb2RlclR5cGUgPSBNNEVOQ09ERVJfa0VWUkM7Ci0vLyAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRCwKLSAgICAgICAgICAgICAgICAgIkF1ZGlvIGVuY29kZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOwotICAgIH0KLQotICAgIHBDLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cyA9IHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW2VuY29kZXJUeXBlXTsKLSAgICBwQy0+cEN1cnJlbnRBdWRpb0VuY29kZXJVc2VyRGF0YSA9IHBDLT5wQXVkaW9FbmNvZGVyVXNlckRhdGFUYWJsZVtlbmNvZGVyVHlwZV07Ci0KLSAgICBpZiAocEMtPnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICJBdWRpbyBlbmNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00TUNTX3NldEN1cnJlbnRSZWFkZXIoKQotICogQGJyaWVmICAgIFNldCBjdXJyZW50IHJlYWRlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgbWVkaWFUeXBlICAgICAgICAgICAgKElOKSBNZWRpYSB0eXBlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00V0FSX01DU19NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDogICAgTWVkaWEgdHlwZSBub3Qgc3VwcG9ydGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3NldEN1cnJlbnRSZWFkZXIoIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSBtZWRpYVR5cGUpCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0OwotICAgIE00UkVBREVSX01lZGlhVHlwZSByZWFkZXJUeXBlOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIHN3aXRjaCAobWVkaWFUeXBlKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUDoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTVA0OgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NNFY6Ci0gICAgICAgICAgICByZWFkZXJUeXBlID0gTTRSRUFERVJfa01lZGlhVHlwZTNHUFA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQU1SOgotICAgICAgICAgICAgcmVhZGVyVHlwZSA9IE00UkVBREVSX2tNZWRpYVR5cGVBTVI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTVAzOgotICAgICAgICAgICAgcmVhZGVyVHlwZSA9IE00UkVBREVSX2tNZWRpYVR5cGVNUDM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQsCi0gICAgICAgICAgICAgICAgICJSZWFkZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOwotICAgIH0KLQotICAgIHBDLT5tX3BSZWFkZXIgICAgICAgPSBwQy0+bV9wUmVhZGVyR2xvYmFsSXRUYWJsZVtyZWFkZXJUeXBlXTsKLSAgICBwQy0+bV9wUmVhZGVyRGF0YUl0ID0gcEMtPm1fcFJlYWRlckRhdGFJdFRhYmxlW3JlYWRlclR5cGVdOwotCi0gICAgaWYgKHBDLT5tX3BSZWFkZXIgPT0gTTRPU0FfTlVMTCB8fCBwQy0+bV9wUmVhZGVyRGF0YUl0ID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICJSZWFkZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIHJldHVybiBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ7Ci0gICAgfQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00TUNTX3NldEN1cnJlbnRWaWRlb0RlY29kZXIoKQotICogQGJyaWVmICAgIFNldCBhIHZpZGVvIGRlY29kZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHBhcmFtICAgIGRlY29kZXJUeXBlICAgICAgICAoSU4pIERlY29kZXIgdHlwZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00V0FSX01DU19NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDogICAgTWVkaWEgdHlwZSBub3Qgc3VwcG9ydGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3NldEN1cnJlbnRWaWRlb0RlY29kZXIoICAgTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfU3RyZWFtVHlwZSBtZWRpYVR5cGUpCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0OwotICAgIE00REVDT0RFUl9WaWRlb1R5cGUgZGVjb2RlclR5cGU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgc3dpdGNoIChtZWRpYVR5cGUpCi0gICAgewotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzQ6Ci0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVmlkZW9IMjYzOgotICAgICAgICAgICAgZGVjb2RlclR5cGUgPSBNNERFQ09ERVJfa1ZpZGVvVHlwZU1QRUc0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2YzoKLSAgICAgICAgICAgIGRlY29kZXJUeXBlID0gTTRERUNPREVSX2tWaWRlb1R5cGVBVkM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQsCi0gICAgICAgICAgICAgICAgICJWaWRlbyBkZWNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgcmV0dXJuIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBwQy0+bV9wVmlkZW9EZWNvZGVyID0gcEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdOwotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotICAgIHBDLT5tX3BDdXJyZW50VmlkZW9EZWNvZGVyVXNlckRhdGEgPQotICAgICAgICAgICAgcEMtPm1fcFZpZGVvRGVjb2RlclVzZXJEYXRhVGFibGVbZGVjb2RlclR5cGVdOwotI2VuZGlmIC8qIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUyAqLwotCi0gICAgaWYgKHBDLT5tX3BWaWRlb0RlY29kZXIgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQsCi0gICAgICAgICAgICAgIlZpZGVvIGRlY29kZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIHJldHVybiBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRNQ1Nfc2V0Q3VycmVudEF1ZGlvRGVjb2RlcigpCi0gKiBAYnJpZWYgICAgU2V0IGFuIGF1ZGlvIGRlY29kZXIKLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgZGVjb2RlclR5cGUgICAgICAgIChJTikgRGVjb2RlciB0eXBlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50QXVkaW9EZWNvZGVyKCAgIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbVR5cGUgbWVkaWFUeXBlKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLSAgICBNNEFEX1R5cGUgZGVjb2RlclR5cGU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgc3dpdGNoIChtZWRpYVR5cGUpCi0gICAgewotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZDoKLSAgICAgICAgICAgIGRlY29kZXJUeXBlID0gTTRBRF9rVHlwZUFNUk5COwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9BYWM6Ci0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9BYWNBRFRTOgotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjQURJRjoKLSAgICAgICAgICAgIGRlY29kZXJUeXBlID0gTTRBRF9rVHlwZUFBQzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvTXAzOgotICAgICAgICAgICAgZGVjb2RlclR5cGUgPSBNNEFEX2tUeXBlTVAzOwotICAgICAgICAgICAgYnJlYWs7Ci0vL0VWUkMKLS8vICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvRXZyYzoKLS8vICAgICAgICAgICAgZGVjb2RlclR5cGUgPSBNNEFEX2tUeXBlRVZSQzsKLS8vICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICAgICAiQXVkaW8gZGVjb2RlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgcEMtPm1fcEF1ZGlvRGVjb2RlciA9IHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXTsKLSAgICBwQy0+bV9wQ3VycmVudEF1ZGlvRGVjb2RlclVzZXJEYXRhID0KLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcEF1ZGlvRGVjb2RlclVzZXJEYXRhVGFibGVbZGVjb2RlclR5cGVdOwotCi0gICAgaWYgKHBDLT5tX3BBdWRpb0RlY29kZXIgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQsCi0gICAgICAgICAgICAgIkF1ZGlvIGRlY29kZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIHJldHVybiBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL000TUNTX01lZGlhQW5kQ29kZWNTdWJzY3JpcHRpb24uYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL000TUNTX01lZGlhQW5kQ29kZWNTdWJzY3JpcHRpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjMxY2E4Ny4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9NNE1DU19NZWRpYUFuZENvZGVjU3Vic2NyaXB0aW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRNQ1NfTWVkaWFBbmRDb2RlY1N1YnNjcmlwdGlvbi5jCi0gKiBAYnJpZWYgIE1lZGlhIHJlYWRlcnMgYW5kIGNvZGVjcyBzdWJzY3JpcHRpb24KLSAqIEBub3RlICAgVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIHN1YnNjcmlwdGlvbiBvZiBzdXBwb3J0ZWQgbWVkaWEKLSAqICAgICAgICAgcmVhZGVycyBhbmQgZGVjb2RlcnMgZm9yIHRoZSBNQ1MuIFBvdGVudGlhbCBzdXBwb3J0IGNhbgotICogICAgICAgICBiZSBhY3RpdmF0ZWQgb3IgZGUtYWN0aXZhdGVkCi0gKiAgICAgICAgIHVzaW5nIGNvbXBpbGF0aW9uIGZsYWdzIHNldCBpbiB0aGUgcHJvamVjdHMgc2V0dGluZ3MuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEluY2x1ZGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKLQotCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE1DU19JbnRlcm5hbFR5cGVzLmgiICAgICAgICAgICAgICAgIC8qKjwgSW5jbHVkZSBmb3IgTUNTIHNwZWNpZmljIHR5cGVzICovCi0jaW5jbHVkZSAiTTRNQ1NfSW50ZXJuYWxGdW5jdGlvbnMuaCIgICAgICAgICAgICAvKio8IFJlZ2lzdHJhdGlvbiBtb2R1bGUgKi8KLQotLyogX19fX19fX19fX19fX19fX19fX19fX18gKi8KLS8qfCAgICAgICAgICAgICAgICAgICAgICAgfCovCi0vKnwgIHJlYWRlciBzdWJzY3JpcHRpb24gIHwqLwotLyp8X19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotLyogUmVhZGVyIHJlZ2lzdHJhdGlvbiA6IGF0IGxlYXN0IG9uZSByZWFkZXIgbXVzdCBiZSBkZWZpbmVkICovCi0jaWZuZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSXzNHUAotI2lmbmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl9BTVIKLSNpZm5kZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfTVAzCi0jZXJyb3IgIm5vIHJlYWRlciByZWdpc3RlcmVkIgotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfUkVBREVSX01QMyAqLwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfUkVBREVSX0FNUiAqLwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfUkVBREVSXzNHUCAqLwotCi0vKiBJbmNsdWRlIGZpbGVzIGZvciBlYWNoIHJlYWRlciB0byBzdWJzY3JpYmUgKi8KLSNpZmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl8zR1AKLSNpbmNsdWRlICJWaWRlb0VkaXRvcjNncFJlYWRlci5oIgotI2VuZGlmCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl9BTVIKLSNpbmNsdWRlICJNNFJFQURFUl9BbXIuaCIKLSNlbmRpZgotI2lmZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSX01QMwotI2luY2x1ZGUgIlZpZGVvRWRpdG9yTXAzUmVhZGVyLmgiCi0jZW5kaWYKLQotLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCi0vKnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLS8qfCAgdmlkZW8gZGVjb2RlciBzdWJzY3JpcHRpb24gIHwqLwotLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLSNpbmNsdWRlICJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlci5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyLmgiCi0KLQotCi0vKiBfX19fX19fX19fX19fX19fX19fX19fXyAqLwotLyp8ICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLS8qfCAgd3JpdGVyIHN1YnNjcmlwdGlvbiAgfCovCi0vKnxfX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0vKiBXcml0ZXIgcmVnaXN0cmF0aW9uIDogYXQgbGVhc3Qgb25lIHdyaXRlciBtdXN0IGJlIGRlZmluZWQgKi8KLSNpZm5kZWYgTTRWU1NfU1VQUE9SVF9XUklURVJfQU1SCi0jaWZuZGVmIE00VlNTX1NVUFBPUlRfV1JJVEVSXzNHUFAKLSNpZm5kZWYgTTRWU1NfU1VQUE9SVF9XUklURVJfUENNCi0jaWZuZGVmIE00VlNTX1NVUFBPUlRfV1JJVEVSX01QMwotI2Vycm9yICJubyB3cml0ZXIgcmVnaXN0ZXJlZCIKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1dSSVRFUl9NUDMgKi8KLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1dSSVRFUl9QQ00gKi8KLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1dSSVRFUl8zR1BQICovCi0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9XUklURVJfQU1SICovCi0KLS8qIEluY2x1ZGUgZmlsZXMgZm9yIGVhY2ggd3JpdGVyIHRvIHN1YnNjcmliZSAqLwotI2lmZGVmIE00VlNTX1NVUFBPUlRfV1JJVEVSX0FNUgotZXh0ZXJuIE00T1NBX0VSUiBNNFdSSVRFUl9BTVJfZ2V0SW50ZXJmYWNlcyggTTRXUklURVJfT3V0cHV0RmlsZVR5cGUqIFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqKiBTcmNHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiogU3JjRGF0YUludGVyZmFjZSk7Ci0jZW5kaWYKLSNpZmRlZiBNNFZTU19TVVBQT1JUX1dSSVRFUl8zR1BQCi1leHRlcm4gTTRPU0FfRVJSIE00V1JJVEVSXzNHUF9nZXRJbnRlcmZhY2VzKCBNNFdSSVRFUl9PdXRwdXRGaWxlVHlwZSogVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSoqIFNyY0dsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqKiBTcmNEYXRhSW50ZXJmYWNlKTsKLSNlbmRpZgotI2lmZGVmIE00VlNTX1NVUFBPUlRfV1JJVEVSX1BDTQotZXh0ZXJuIE00T1NBX0VSUiBNNFdSSVRFUl9QQ01fZ2V0SW50ZXJmYWNlcyggTTRXUklURVJfT3V0cHV0RmlsZVR5cGUqIFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqKiBTcmNHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiogU3JjRGF0YUludGVyZmFjZSk7Ci0jZW5kaWYKLSNpZmRlZiBNNFZTU19TVVBQT1JUX1dSSVRFUl9NUDMKLWV4dGVybiBNNE9TQV9FUlIgTTRXUklURVJfTVAzX2dldEludGVyZmFjZXMoIE00V1JJVEVSX091dHB1dEZpbGVUeXBlKiBUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlKiogU3JjR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSoqIFNyY0RhdGFJbnRlcmZhY2UpOwotI2VuZGlmCi0KLS8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0vKnwgIHZpZGVvIGVuY29kZXIgc3Vic2NyaXB0aW9uICB8Ki8KLS8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotI2luY2x1ZGUgIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXIuaCIKLQotCi0vKiBJbmNsdWRlIGZpbGVzIGZvciBlYWNoIHZpZGVvIGVuY29kZXIgdG8gc3Vic2NyaWJlICovCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX01QRUc0Ci0vLyNpbmNsdWRlICJNNE1QNEVfaW50ZXJmYWNlLmgiCi0jZW5kaWYKLQotCi0jZGVmaW5lIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKHJldHZhbCwgcG9pbnRlcikgXAotICAgIGlmICgocG9pbnRlcikgPT0gTTRPU0FfTlVMTCkgcmV0dXJuICgoTTRPU0FfRVJSKShyZXR2YWwpKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfU3Vic2NyaWJlTWVkaWFBbmRDb2RlYyhNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHJlZ2lzdGVycyB0aGUgcmVhZGVyLCBkZWNvZGVycywgd3JpdGVycyBhbmQgZW5jb2RlcnMKLSAqICAgICAgICAgIGluIHRoZSBNQ1MuCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgcENvbnRleHQgaXMgTlVMTAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1Nfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYyhNNE1DU19Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgTTRSRUFERVJfTWVkaWFUeXBlICAgICAgICAgIHJlYWRlck1lZGlhVHlwZTsKLSAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UqICAgcFJlYWRlckdsb2JhbEludGVyZmFjZTsKLSAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlKiAgICAgcFJlYWRlckRhdGFJbnRlcmZhY2U7Ci0KLSAgICBNNFdSSVRFUl9PdXRwdXRGaWxlVHlwZSAgICAgd3JpdGVyTWVkaWFUeXBlOwotICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSogICBwV3JpdGVyR2xvYmFsSW50ZXJmYWNlOwotICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqICAgICBwV3JpdGVyRGF0YUludGVyZmFjZTsKLQotICAgIE00QURfVHlwZSAgICAgICAgICAgICAgICAgICBhdWRpb0RlY29kZXJUeXBlOwotICAgIE00RU5DT0RFUl9BdWRpb0Zvcm1hdCAgICAgICBhdWRpb0NvZGVjVHlwZTsKLSAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UqIHBBdWRpb0NvZGVjSW50ZXJmYWNlOwotICAgIE00QURfSW50ZXJmYWNlKiAgICAgICAgICAgICBwQXVkaW9EZWNvZGVySW50ZXJmYWNlOwotCi0gICAgTTRERUNPREVSX1ZpZGVvVHlwZSAgICAgICAgIHZpZGVvRGVjb2RlclR5cGU7Ci0gICAgTTRFTkNPREVSX0Zvcm1hdCAgICAgICAgICAgIHZpZGVvQ29kZWNUeXBlOwotICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UqICBwVmlkZW9Db2RlY0ludGVyZmFjZTsKLSAgICBNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UqICAgcFZpZGVvRGVjb2RlckludGVyZmFjZTsKLQotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcENvbnRleHQpOwotCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCAgcmVhZGVyIHN1YnNjcmlwdGlvbiAgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotICAgIC8qIC0tLSAzR1AgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl8zR1AKLSAgICBlcnIgPSBWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRJbnRlcmZhY2UoJnJlYWRlck1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUmVhZGVyRGF0YUludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSXzNHUCBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNE1DU19yZWdpc3RlclJlYWRlciggcENvbnRleHQsIHJlYWRlck1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlYWRlckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlYWRlckRhdGFJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICAiTTRNQ1Nfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgM0dQIHJlYWRlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfUkVBREVSXzNHUCAqLwotCi0gICAgLyogLS0tIEFNUiAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSX0FNUgotICAgIGVyciA9IE00UkVBREVSX0FNUl9nZXRJbnRlcmZhY2VzKCAgICZyZWFkZXJNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBSZWFkZXJEYXRhSW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfQU1SIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00TUNTX3JlZ2lzdGVyUmVhZGVyKCBwQ29udGV4dCwgcmVhZGVyTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVhZGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVhZGVyRGF0YUludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgICJNNE1DU19zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBBTVIgcmVhZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9SRUFERVJfQU1SICovCi0KLSAgICAvKiAtLS0gTVAzIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfTVAzCi0KLSAgICBlcnIgPSBWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXRJbnRlcmZhY2UoJnJlYWRlck1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUmVhZGVyRGF0YUludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX01QMyBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNE1DU19yZWdpc3RlclJlYWRlciggcENvbnRleHQsIHJlYWRlck1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlYWRlckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlYWRlckRhdGFJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICAiTTRNQ1Nfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgTVAzIHJlYWRlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfUkVBREVSX01QMyAqLwotCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCi0gICAgLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0gICAgLyp8ICB2aWRlbyBkZWNvZGVyIHN1YnNjcmlwdGlvbiAgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLSAgICAvKiAtLS0gTVBFRzQgJiBIMjYzIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9WSURFQ18zR1AKLQotICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldEludGVyZmFjZV9NUEVHNCggJnZpZGVvRGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopJnBWaWRlb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNERFQ09ERVJfTVBFRzQgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRNQ1NfcmVnaXN0ZXJWaWRlb0RlY29kZXIoICAgcENvbnRleHQsIHZpZGVvRGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZGVvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgICJNNE1DU19zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBNUEVHNCBkZWNvZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9WSURFQ18zR1AgKi8KLQotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9WSURFT19BVkMKLQotICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldEludGVyZmFjZV9IMjY0KCAmdmlkZW9EZWNvZGVyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKikmcFZpZGVvRGVjb2RlckludGVyZmFjZSk7Ci0KLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRERUNPREVSX0FWQyBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNE1DU19yZWdpc3RlclZpZGVvRGVjb2RlciggICBwQ29udGV4dCwgdmlkZW9EZWNvZGVyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW9EZWNvZGVySW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAgIk00TUNTX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIEFWQyBkZWNvZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9WSURFT19BVkMgKi8KLQotCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCi0gICAgLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0gICAgLyp8ICBhdWRpbyBkZWNvZGVyIHN1YnNjcmlwdGlvbiAgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLSAgICAvKiAtLS0gQU1STkIgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0FVREVDX0FNUk5CCi0gICAgZXJyID0gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlX0FNUk5CKCZhdWRpb0RlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBdWRpb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNEFEIFBISUxJUFMgQU1STkIgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRNQ1NfcmVnaXN0ZXJBdWRpb0RlY29kZXIoICAgcENvbnRleHQsIGF1ZGlvRGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEF1ZGlvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgICJNNE1DU19zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBQSElMSVBTIEFNUk5CIGRlY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX0FVREVDX0FNUk5CICovCi0KLSAgICAvKiAtLS0gQUFDIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9BVURFQ19BQUMKLQotICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZV9BQUMoJmF1ZGlvRGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQXVkaW9EZWNvZGVySW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRBRCBQSElMSVBTIEFBQyBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNE1DU19yZWdpc3RlckF1ZGlvRGVjb2RlciggICBwQ29udGV4dCwgYXVkaW9EZWNvZGVyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXVkaW9EZWNvZGVySW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAgIk00TUNTX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIFBISUxJUFMgQUFDIGRlY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX0FVREVDX0FBQyAqLwotCi0gICAgLyogLS0tIE1QMyAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfQVVERUNfTVAzCi0KLSAgICBlcnIgPSBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRJbnRlcmZhY2VfTVAzKCZhdWRpb0RlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEF1ZGlvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00QUQgUEhJTElQUyBNUDMgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRNQ1NfcmVnaXN0ZXJBdWRpb0RlY29kZXIoICAgcENvbnRleHQsIGF1ZGlvRGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEF1ZGlvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgICJNNE1DU19zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBQSElMSVBTIE1QMyBkZWNvZGVyIik7Ci0jZW5kaWYgIC8qIE00VlNTX1NVUFBPUlRfQVVERUNfTVAzICovCi0KLSAgICAvKiAtLS0gRVZSQyAtLS0gKi8KLQotCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCAgd3JpdGVyIHN1YnNjcmlwdGlvbiAgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotICAgIC8qIC0tLSBQQ00gLS0tICovCi0KLQotICAgIC8qIC0tLSAzR1BQIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9XUklURVJfM0dQUAotICAgIC8qIHJldHJpZXZlcyB0aGUgM0dQUCB3cml0ZXIgbWVkaWEgdHlwZSBhbmQgcG9pbnRlciB0byBmdW5jdGlvbnMqLwotICAgIGVyciA9IE00V1JJVEVSXzNHUF9nZXRJbnRlcmZhY2VzKCAgICZ3cml0ZXJNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBXcml0ZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBXcml0ZXJEYXRhSW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRXUklURVJfM0dQIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00TUNTX3JlZ2lzdGVyV3JpdGVyKCBwQ29udGV4dCwgd3JpdGVyTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV3JpdGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV3JpdGVyRGF0YUludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgICJNNE1DU19zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciAzR1BQIHdyaXRlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfV1JJVEVSXzNHUFAgKi8KLQotCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCi0gICAgLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0gICAgLyp8ICB2aWRlbyBlbmNvZGVyIHN1YnNjcmlwdGlvbiAgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLSAgICAvKiAtLS0gTVBFRzQgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfTVBFRzQKLSAgICAgICAvKiByZXRyaWV2ZXMgdGhlIE1QRUc0IGVuY29kZXIgdHlwZSBhbmQgcG9pbnRlciB0byBmdW5jdGlvbnMqLwotICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZV9NUEVHNCgmdmlkZW9Db2RlY1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFZpZGVvQ29kZWNJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfT1BFTl9BRFZBTkNFRCk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TVA0RV9NUEVHNCBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNE1DU19yZWdpc3RlclZpZGVvRW5jb2RlciggICBwQ29udGV4dCwgdmlkZW9Db2RlY1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZGVvQ29kZWNJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICAiTTRNQ1Nfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgdmlkZW8gTVBFRzQgZW5jb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9NUEVHNCAqLwotCi0gICAgLyogLS0tIEgyNjMgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfTVBFRzQKLSAgICAvKiByZXRyaWV2ZXMgdGhlIEgyNjMgZW5jb2RlciB0eXBlIGFuZCBwb2ludGVyIHRvIGZ1bmN0aW9ucyovCi0gICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0gyNjMoJnZpZGVvQ29kZWNUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBWaWRlb0NvZGVjSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX09QRU5fQURWQU5DRUQpOwotCi0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TVA0RV9IMjYzIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00TUNTX3JlZ2lzdGVyVmlkZW9FbmNvZGVyKCBwQ29udGV4dCwgdmlkZW9Db2RlY1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWaWRlb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAgIk00TUNTX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIHZpZGVvIEgyNjMgZW5jb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9NUEVHNCAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FWQwotICAgIC8qIHJldHJpZXZlcyB0aGUgSDI2MyBlbmNvZGVyIHR5cGUgYW5kIHBvaW50ZXIgdG8gZnVuY3Rpb25zKi8KLSAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfSDI2NCgmdmlkZW9Db2RlY1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFZpZGVvQ29kZWNJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfT1BFTl9BRFZBTkNFRCk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00SDI2NEUgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRNQ1NfcmVnaXN0ZXJWaWRlb0VuY29kZXIoIHBDb250ZXh0LCB2aWRlb0NvZGVjVHlwZSwgcFZpZGVvQ29kZWNJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICAiTTRNQ1Nfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgdmlkZW8gSDI2NCBlbmNvZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FWQyAqLwotCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCi0gICAgLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0gICAgLyp8ICBhdWRpbyBlbmNvZGVyIHN1YnNjcmlwdGlvbiAgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLSAgICAvKiAtLS0gQU1SIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FNUgotICAgICAgIC8qIHJldHJpZXZlcyB0aGUgQU1SIGVuY29kZXIgdHlwZSBhbmQgcG9pbnRlciB0byBmdW5jdGlvbnMqLwotICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZV9BTVJOQigmYXVkaW9Db2RlY1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEF1ZGlvQ29kZWNJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNEFNUiBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNE1DU19yZWdpc3RlckF1ZGlvRW5jb2RlciggICBwQ29udGV4dCwgYXVkaW9Db2RlY1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEF1ZGlvQ29kZWNJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICAiTTRNQ1Nfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgYXVkaW8gQU1SIGVuY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfQU1SICovCi0KLSAgICAvKiAtLS0gQUFDIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FBQwotICAgIC8qIHJldHJpZXZlcyB0aGUgQUFDIGVuY29kZXIgdHlwZSBhbmQgcG9pbnRlciB0byBmdW5jdGlvbnMqLwotICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZV9BQUMoJmF1ZGlvQ29kZWNUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRBQUMgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRNQ1NfcmVnaXN0ZXJBdWRpb0VuY29kZXIoICAgcENvbnRleHQsIGF1ZGlvQ29kZWNUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAgIk00TUNTX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIGF1ZGlvIEFBQyBlbmNvZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FBQyAqLwotCi0KLQotICAgIC8qIC0tLSBNUDMgLS0tICovCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX01QMwotICAgIC8qIHJldHJpZXZlcyB0aGUgTVAzIGVuY29kZXIgdHlwZSBhbmQgcG9pbnRlciB0byBmdW5jdGlvbnMqLwotICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZV9NUDMoJmF1ZGlvQ29kZWNUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNUDNFIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00TUNTX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKCBwQ29udGV4dCwgYXVkaW9Db2RlY1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAgIk00TUNTX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIGF1ZGlvIE1QMyBlbmNvZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9FTkNPREVSX01QMyAqLwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTTRNQ1NfVmlkZW9QcmVQcm9jZXNzaW5nLmMgYi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9NNE1DU19WaWRlb1ByZVByb2Nlc3NpbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzQ5ZjY4ZS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9NNE1DU19WaWRlb1ByZVByb2Nlc3NpbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDQ1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRNQ1NfVmlkZW9QcmVQcm9jZXNzaW5nLmMKLSAqIEBicmllZiAgTUNTIGltcGxlbWVudGF0aW9uCi0gKiBAbm90ZSAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBlbmNvZGVyIGNhbGxiYWNrIG9mIHRoZSBNQ1MuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSW5jbHVkZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0vKiBPU0FMIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIgICAgICAgLyogT1NBTCBtZW1vcnkgbWFuYWdlbWVudCAqLwotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiICAgICAgICAvKiBPU0FMIGRlYnVnIG1hbmFnZW1lbnQgKi8KLQotCi0vKiBDb3JlIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJNNE1DU19JbnRlcm5hbFR5cGVzLmgiCi0jaW5jbHVkZSAiTTRNQ1NfRXJyb3JDb2Rlcy5oIgotCi0vKioKLSAqIFZpZGVvIHByZXByb2Nlc3NpbmcgaW50ZXJmYWNlIGRlZmluaXRpb24gKi8KLSNpbmNsdWRlICJNNFZQUF9BUEkuaCIKLQotLyoqCi0gKiBWaWRlbyBmaWx0ZXJzICovCi0jaW5jbHVkZSAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIgLyoqPCBmb3IgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9ZVVY0MjAoKSAqLwotCi0jaWZuZGVmIE00TUNTX0FVRElPT05MWQotI2luY2x1ZGUgIk00QUlSX0FQSS5oIgotI2VuZGlmIC8qTTRNQ1NfQVVESU9PTkxZKi8KLS8qKi8KLQotCi0KLQotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19pbnRBcHBseVZQUChNNFZQUF9Db250ZXh0IHBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lT3V0KQotICogQGJyaWVmICAgIERvIHRoZSB2aWRlbyByZW5kZXJpbmcgYW5kIHRoZSByZXNpemUgKGlmIG5lZWRlZCkKLSAqIEBub3RlICAgIEl0IGlzIGNhbGxlZCBieSB0aGUgdmlkZW8gZW5jb2RlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgVlBQIGNvbnRleHQsIHdoaWNoIGFjdHVhbGx5IGlzIHRoZSBNQ1MgaW50ZXJuYWwgY29udGV4dCBpbiBvdXIgY2FzZQotICogQHBhcmFtICAgIHBQbGFuZUluICAgIChJTikgQ29udGFpbnMgdGhlIGltYWdlCi0gKiBAcGFyYW0gICAgcFBsYW5lT3V0ICAgIChJTi9PVVQpIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgMyBwbGFuZXMgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIG91dHB1dAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVVWNDIwIGltYWdlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00TUNTX0VSUl9WSURFT19ERUNPREVfRVJST1I6IHRoZSB2aWRlbyBkZWNvZGluZyBmYWlsZWQKLSAqIEByZXR1cm4gICAgTTRNQ1NfRVJSX1JFU0laRV9FUlJPUjogdGhlIHJlc2l6aW5nIGZhaWxlZAotICogQHJldHVybiAgICBBbnkgZXJyb3IgcmV0dXJuZWQgYnkgYW4gdW5kZXJsYXlpbmcgbW9kdWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19pbnRBcHBseVZQUChNNFZQUF9Db250ZXh0IHBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVPdXQpCi17Ci0gICAgTTRPU0FfRVJSICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotCi0vKiBUaGlzIHBhcnQgaXMgdXNlZCBvbmx5IGlmIHZpZGVvIGNvZGVjcyBhcmUgY29tcGlsZWQqLwotI2lmbmRlZiBNNE1DU19BVURJT09OTFkKLSAgICAvKioKLSAgICAgKiBUaGUgVlBQIGNvbnRleHQgaXMgYWN0dWFsbHkgdGhlIE1DUyBjb250ZXh0ISAqLwotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KikocENvbnRleHQpOwotCi0gICAgTTRfTWVkaWFUaW1lIG10Q3RzID0gcEMtPmRWaURlY0N1cnJlbnRDdHM7Ci0KLSAgICAvKioKLSAgICAgKiBXaGVuIENsb3NpbmcgYWZ0ZXIgYW4gZXJyb3Igb2NjdXJlZCwgaXQgbWF5IGhhcHBlbiB0aGF0IHBSZWFkZXJWaWRlb0FVLT5tX2RhdGFBZGRyZXNzIGhhcwotICAgICAqIG5vdCBiZWVuIGFsbG9jYXRlZCB5ZXQuIFdoZW4gY2xvc2luZyBpbiBwYXVzZSBtb2RlLCB0aGUgZGVjb2RlciBjYW4gYmUgbnVsbC4KLSAgICAgKiBXZSBkb24ndCB3YW50IGFuIGVycm9yIHRvIGJlIHJldHVybmVkIGJlY2F1c2UgaXQgd291bGQgaW50ZXJydXB0IHRoZSBjbG9zZSBwcm9jZXNzIGFuZAotICAgICAqIHRodXMgc29tZSByZXNvdXJjZXMgd291bGQgYmUgbG9ja2VkLiBTbyB3ZSByZXR1cm4gTTROT19FUlJPUi4KLSAgICAgKi8KLSAgICAvKiBJbml0aWFsaXplIHRvIGJsYWNrIHBsYW5lIHRoZSBvdXRwdXQgcGxhbmUgaWYgdGhlIG1lZGlhIHJlbmRlcmluZwotICAgICBpcyBibGFjayBib3JkZXJzICovCi0gICAgaWYocEMtPk1lZGlhUmVuZGVyaW5nID09IE00TUNTX2tCbGFja0JvcmRlcnMpCi0gICAgewotICAgICAgICBtZW1zZXQoKHZvaWQgKilwUGxhbmVPdXRbMF0ucGFjX2RhdGEsWV9QTEFORV9CT1JERVJfVkFMVUUsCi0gICAgICAgICAgICAocFBsYW5lT3V0WzBdLnVfaGVpZ2h0KnBQbGFuZU91dFswXS51X3N0cmlkZSkpOwotICAgICAgICBtZW1zZXQoKHZvaWQgKilwUGxhbmVPdXRbMV0ucGFjX2RhdGEsVV9QTEFORV9CT1JERVJfVkFMVUUsCi0gICAgICAgICAgICAocFBsYW5lT3V0WzFdLnVfaGVpZ2h0KnBQbGFuZU91dFsxXS51X3N0cmlkZSkpOwotICAgICAgICBtZW1zZXQoKHZvaWQgKilwUGxhbmVPdXRbMl0ucGFjX2RhdGEsVl9QTEFORV9CT1JERVJfVkFMVUUsCi0gICAgICAgICAgICAocFBsYW5lT3V0WzJdLnVfaGVpZ2h0KnBQbGFuZU91dFsyXS51X3N0cmlkZSkpOwotICAgIH0KLSAgICBlbHNlIGlmICgoTTRPU0FfTlVMTCA9PSBwQy0+UmVhZGVyVmlkZW9BVS5tX2RhdGFBZGRyZXNzKSB8fAotICAgICAgICAgICAgIChNNE9TQV9OVUxMID09IHBDLT5wVmlEZWNDdHh0KSkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBXZSBtdXN0IGZpbGwgdGhlIGlucHV0IG9mIHRoZSBlbmNvZGVyIHdpdGggYSBkdW1teSBpbWFnZSwgYmVjYXVzZQotICAgICAgICAgKiBlbmNvZGluZyBub2lzZSBsZWFkcyB0byBhIGh1Z2UgdmlkZW8gQVUsIGFuZCB0aHVzIGEgd3JpdGVyIGJ1ZmZlciBvdmVyZmxvdy4gKi8KLSAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lT3V0WzBdLnBhY19kYXRhLDAsCi0gICAgICAgICAgICAgcFBsYW5lT3V0WzBdLnVfc3RyaWRlICogcFBsYW5lT3V0WzBdLnVfaGVpZ2h0KTsKLSAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lT3V0WzFdLnBhY19kYXRhLDAsCi0gICAgICAgICAgICAgcFBsYW5lT3V0WzFdLnVfc3RyaWRlICogcFBsYW5lT3V0WzFdLnVfaGVpZ2h0KTsKLSAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lT3V0WzJdLnBhY19kYXRhLDAsCi0gICAgICAgICAgICAgcFBsYW5lT3V0WzJdLnVfc3RyaWRlICogcFBsYW5lT3V0WzJdLnVfaGVpZ2h0KTsKLQotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNQ1NfaW50QXBwbHlWUFA6IHBSZWFkZXJWaWRlb0FVLT5tX2RhdGFBZGRyZXNzIGlzIE00T1NBX05VTEwsXAotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICB9Ci0KLSAgICBpZihwQy0+aXNSZW5kZXJEdXAgPT0gTTRPU0FfRkFMU0UpCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogICAgbV9wUHJlUmVzaXplRnJhbWUgZGlmZmVyZW50IHRoYW4gTTRPU0FfTlVMTCBtZWFucyB0aGF0IHJlc2l6aW5nIGlzIG5lZWRlZCAqLwotICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+cFByZVJlc2l6ZUZyYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiogRkIgMjAwOC8xMC8yMDoKLSAgICAgICAgICAgIFVzZWQgZm9yIGNyb3BwaW5nIGFuZCBibGFjayBib3JkZXJzKi8KLSAgICAgICAgICAgIE00QUlSX1BhcmFtcyBQYXJhbXM7Ci0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19pbnRBcHBseVZQUDogTmVlZCB0byByZXNpemUiKTsKLSAgICAgICAgICAgIGVyciA9IHBDLT5tX3BWaWRlb0RlY29kZXItPm1fcEZjdFJlbmRlcihwQy0+cFZpRGVjQ3R4dCwgJm10Q3RzLAotICAgICAgICAgICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWUsIE00T1NBX1RSVUUpOwotICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19pbnRBcHBseVZQUDogbV9wRmN0UmVuZGVyIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKHBDLT5NZWRpYVJlbmRlcmluZyA9PSBNNE1DU19rUmVzaXppbmcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBDYWxsIHRoZSByZXNpemUgZmlsdGVyLiBGcm9tIHRoZSBpbnRlcm1lZGlhdGUgZnJhbWUgdG8gdGhlIGVuY29kZXIKLSAgICAgICAgICAgICAgICAgKiBpbWFnZSBwbGFuZQotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvWVVWNDIwKE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWUsIHBQbGFuZU91dCk7Ci0gICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX2ludEFwcGx5VlBQOiBNNFZpRmlsUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyAweCV4ISIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lIHBJbWFnZVBsYW5lc1RlbXBbM107Ci0gICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZVRlbXA7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDgqIHBPdXRQbGFuZVkgPSBwUGxhbmVPdXRbMF0ucGFjX2RhdGEgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBsYW5lT3V0WzBdLnVfdG9wbGVmdDsKLSAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCogcE91dFBsYW5lVSA9IHBQbGFuZU91dFsxXS5wYWNfZGF0YSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXRbMV0udV90b3BsZWZ0OwotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4KiBwT3V0UGxhbmVWID0gcFBsYW5lT3V0WzJdLnBhY19kYXRhICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dFsyXS51X3RvcGxlZnQ7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDgqIHBJblBsYW5lWSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDgqIHBJblBsYW5lVSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDgqIHBJblBsYW5lViA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGkgPSAwOwotCi0gICAgICAgICAgICAgICAgLypGQiAyMDA4LzEwLzIwOiB0byBrZWVwIG1lZGlhIGFzcGVjdCByYXRpbyovCi0gICAgICAgICAgICAgICAgLypJbml0aWFsaXplIEFJUiBQYXJhbXMqLwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV94ID0gMDsKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSA9IDA7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gcEMtPnBQcmVSZXNpemVGcmFtZS0+dV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSBwQy0+cFByZVJlc2l6ZUZyYW1lLT51X3dpZHRoOwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IHBQbGFuZU91dC0+dV93aWR0aDsKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gcFBsYW5lT3V0LT51X2hlaWdodDsKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9iT3V0cHV0U3RyaXBlID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0T3JpZW50YXRpb24gPSBNNENPTU1PTl9rT3JpZW50YXRpb25Ub3BMZWZ0OwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgTWVkaWEgcmVuZGVyaW5nOiBCbGFjayBib3JkZXJzKi8KLSAgICAgICAgICAgICAgICBpZihwQy0+TWVkaWFSZW5kZXJpbmcgPT0gTTRNQ1Nfa0JsYWNrQm9yZGVycykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV93aWR0aCA9IHBQbGFuZU91dFswXS51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0ID0gcFBsYW5lT3V0WzBdLnVfaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfc3RyaWRlID0gcFBsYW5lT3V0WzBdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV90b3BsZWZ0ID0gMDsKLQotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfd2lkdGggPSBwUGxhbmVPdXRbMV0udV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCA9IHBQbGFuZU91dFsxXS51X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3N0cmlkZSA9IHBQbGFuZU91dFsxXS51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfdG9wbGVmdCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3dpZHRoID0gcFBsYW5lT3V0WzJdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQgPSBwUGxhbmVPdXRbMl0udV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV9zdHJpZGUgPSBwUGxhbmVPdXRbMl0udV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3RvcGxlZnQgPSAwOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIEFsbG9jYXRlcyBwbGFuIGluIGxvY2FsIGltYWdlIHBsYW5lIHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnBhY19kYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBJbWFnZVBsYW5lc1RlbXBbMF1cCi0gICAgICAgICAgICAgICAgICAgICAgICAudV93aWR0aCAqIHBJbWFnZVBsYW5lc1RlbXBbMF0udV9oZWlnaHQsIE00VlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OiB0ZW1wb3JhcnkgcGxhbmUgYnVmZmVyWSIpIDsKLSAgICAgICAgICAgICAgICAgICAgaWYocEltYWdlUGxhbmVzVGVtcFswXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRXJyb3IgYWxsb2MgaW4gTTRNQ1NfaW50QXBwbHlWUFAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnBhY19kYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBJbWFnZVBsYW5lc1RlbXBbMV1cCi0gICAgICAgICAgICAgICAgICAgICAgICAudV93aWR0aCAqIHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHQsIE00VlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OiB0ZW1wb3JhcnkgcGxhbmUgYnVmZmVyVSIpIDsKLSAgICAgICAgICAgICAgICAgICAgaWYocEltYWdlUGxhbmVzVGVtcFsxXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRXJyb3IgYWxsb2MgaW4gTTRNQ1NfaW50QXBwbHlWUFAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnBhY19kYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBJbWFnZVBsYW5lc1RlbXBbMl1cCi0gICAgICAgICAgICAgICAgICAgICAgICAudV93aWR0aCAqIHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTLChNNE9TQV9DaGFyICopIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6IHRlbXBvcmFyeSBwbGFuZSBidWZmZXJWIikgOwotICAgICAgICAgICAgICAgICAgICBpZihwSW1hZ2VQbGFuZXNUZW1wWzJdLnBhY19kYXRhID09IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJFcnJvciBhbGxvYyBpbiBNNE1DU19pbnRBcHBseVZQUCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcEluUGxhbmVZID0gcEltYWdlUGxhbmVzVGVtcFswXS5wYWNfZGF0YSA7Ci0gICAgICAgICAgICAgICAgICAgIHBJblBsYW5lVSA9IHBJbWFnZVBsYW5lc1RlbXBbMV0ucGFjX2RhdGEgOwotICAgICAgICAgICAgICAgICAgICBwSW5QbGFuZVYgPSBwSW1hZ2VQbGFuZXNUZW1wWzJdLnBhY19kYXRhIDsKLQotICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwSW1hZ2VQbGFuZXNUZW1wWzBdLnBhY19kYXRhLFlfUExBTkVfQk9SREVSX1ZBTFVFLAotICAgICAgICAgICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lc1RlbXBbMF0udV9oZWlnaHQqcEltYWdlUGxhbmVzVGVtcFswXS51X3N0cmlkZSkpOwotICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwSW1hZ2VQbGFuZXNUZW1wWzFdLnBhY19kYXRhLFVfUExBTkVfQk9SREVSX1ZBTFVFLAotICAgICAgICAgICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHQqcEltYWdlUGxhbmVzVGVtcFsxXS51X3N0cmlkZSkpOwotICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwSW1hZ2VQbGFuZXNUZW1wWzJdLnBhY19kYXRhLFZfUExBTkVfQk9SREVSX1ZBTFVFLAotICAgICAgICAgICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQqcEltYWdlUGxhbmVzVGVtcFsyXS51X3N0cmlkZSkpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKChNNE9TQV9VSW50MzIpKChwQy0+cFByZVJlc2l6ZUZyYW1lLT51X2hlaWdodCAqIHBQbGFuZU91dC0+dV93aWR0aClcCi0gICAgICAgICAgICAgICAgICAgICAgICAgL3BDLT5wUHJlUmVzaXplRnJhbWUtPnVfd2lkdGgpIDw9IHBQbGFuZU91dC0+dV9oZWlnaHQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLy9QYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPCBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyppdCBpcyBoZWlnaHQgc28gYmxhY2sgYm9yZGVycyB3aWxsIGJlIG9uIHRoZSB0b3AgYW5kIG9uIHRoZSBib3R0b20gc2lkZSovCi0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSBwUGxhbmVPdXQtPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwQy0+cFByZVJlc2l6ZUZyYW1lLT51X2hlaWdodCAqIHBQbGFuZU91dC0+dV93aWR0aClcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9wQy0+cFByZVJlc2l6ZUZyYW1lLT51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qbnVtYmVyIG9mIGxpbmVzIGF0IHRoZSB0b3AqLwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRNQ1NfQUJTKChNNE9TQV9JbnQzMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lc1RlbXBbMF0udV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1QYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0KT4+MSkpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV9oZWlnaHQgPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRNQ1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xKSkpPj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE1DU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpKSk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBJbWFnZVBsYW5lc1RlbXBbMl0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qaXQgaXMgd2lkdGggc28gYmxhY2sgYm9yZGVycyB3aWxsIGJlIG9uIHRoZSBsZWZ0IGFuZCByaWdodCBzaWRlKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSBwUGxhbmVPdXQtPnVfaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKHBDLT5wUHJlUmVzaXplRnJhbWUtPnVfd2lkdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwUGxhbmVPdXQtPnVfaGVpZ2h0KVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL3BDLT5wUHJlUmVzaXplRnJhbWUtPnVfaGVpZ2h0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRNQ1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoLVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoKT4+MSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRNQ1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzVGVtcFsxXS51X3dpZHRoLVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MSkpKT4+MSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00TUNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aC1cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjEpKSk+PjEpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLypXaWR0aCBhbmQgaGVpZ2h0IGhhdmUgdG8gYmUgZXZlbiovCi0gICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IChQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IChQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9IChQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfd2lkdGggPSAocEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3dpZHRoID0gKHBJbWFnZVBsYW5lc1RlbXBbMV0udV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aCA9IChwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0ID0gKHBJbWFnZVBsYW5lc1RlbXBbMF0udV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfaGVpZ2h0ID0gKHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0ID0gKHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQ+PjEpPDwxOwotCi0gICAgICAgICAgICAgICAgICAgIC8qQ2hlY2sgdGhhdCB2YWx1ZXMgYXJlIGNvaGVyZW50Ki8KLSAgICAgICAgICAgICAgICAgICAgaWYoUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID09IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPT0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBQbGFuZVRlbXAgPSBwSW1hZ2VQbGFuZXNUZW1wOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgIE1lZGlhIHJlbmRlcmluZzogQ3JvcHBpbmcqLwotICAgICAgICAgICAgICAgIGlmKHBDLT5NZWRpYVJlbmRlcmluZyA9PSBNNE1DU19rQ3JvcHBpbmcpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gcFBsYW5lT3V0LT51X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gcFBsYW5lT3V0LT51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICBpZigoUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCAqIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAvUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLypoZWlnaHQgd2lsbCBiZSBjcm9wcGVkKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKChQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkgLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0Pj4xKTw8MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKChNNE9TQV9JbnQzMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBDLT5wUHJlUmVzaXplRnJhbWUtPnVfaGVpZ2h0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSk+PjEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyp3aWR0aCB3aWxsIGJlIGNyb3BwZWQqLwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgoUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMikoKE00T1NBX0ludDMyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocEMtPnBQcmVSZXNpemVGcmFtZS0+dV93aWR0aFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKSk+PjEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBQbGFuZVRlbXAgPSBwUGxhbmVPdXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIENhbGwgQUlSIGZ1bmN0aW9ucyAqLwotICAgICAgICAgICAgICAgIGlmKE00T1NBX05VTEwgPT0gcEMtPm1fYWlyX2NvbnRleHQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNEFJUl9jcmVhdGUoJnBDLT5tX2Fpcl9jb250ZXh0LCBNNEFJUl9rWVVWNDIwUCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdDpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3Igd2hlbiBpbml0aWFsaXppbmcgQUlSOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSBNNEFJUl9jb25maWd1cmUocEMtPm1fYWlyX2NvbnRleHQsICZQYXJhbXMpOwotICAgICAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6XAotICAgICAgICAgICAgICAgICAgICAgRXJyb3Igd2hlbiBjb25maWd1cmluZyBBSVI6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICBNNEFJUl9jbGVhblVwKHBDLT5tX2Fpcl9jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSBNNEFJUl9nZXQocEMtPm1fYWlyX2NvbnRleHQsIHBDLT5wUHJlUmVzaXplRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZVRlbXApOwotICAgICAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6XAotICAgICAgICAgICAgICAgICAgICAgRXJyb3Igd2hlbiBnZXR0aW5nIEFJUiBwbGFuZTogMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIE00QUlSX2NsZWFuVXAocEMtPm1fYWlyX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKHBDLT5NZWRpYVJlbmRlcmluZyA9PSBNNE1DU19rQmxhY2tCb3JkZXJzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yKGk9MDsgaTxwUGxhbmVPdXRbMF0udV9oZWlnaHQ7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCAgICh2b2lkICopcE91dFBsYW5lWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBJblBsYW5lWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXRbMF0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSW5QbGFuZVkgKz0gcFBsYW5lT3V0WzBdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwT3V0UGxhbmVZICs9IHBQbGFuZU91dFswXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPHBQbGFuZU91dFsxXS51X2hlaWdodDsgaSsrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoICAgKHZvaWQgKilwT3V0UGxhbmVVLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEluUGxhbmVVLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dFsxXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJblBsYW5lVSArPSBwUGxhbmVPdXRbMV0udV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRQbGFuZVUgKz0gcFBsYW5lT3V0WzFdLnVfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZvcihpPTA7IGk8cFBsYW5lT3V0WzJdLnVfaGVpZ2h0OyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSggICAodm9pZCAqKXBPdXRQbGFuZVYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwSW5QbGFuZVYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBsYW5lT3V0WzJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEluUGxhbmVWICs9IHBQbGFuZU91dFsyXS51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgcE91dFBsYW5lViArPSBwUGxhbmVPdXRbMl0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPDM7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYocEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfaW50QXBwbHlWUFA6IERvbid0IG5lZWQgcmVzaXppbmciKTsKLSAgICAgICAgICAgIGVyciA9IHBDLT5tX3BWaWRlb0RlY29kZXItPm1fcEZjdFJlbmRlcihwQy0+cFZpRGVjQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXRDdHMsIHBQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUlVFKTsKLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1NfaW50QXBwbHlWUFA6IG1fcEZjdFJlbmRlciByZXR1cm5zIDB4JXghIiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBDLT5sYXN0RGVjb2RlZFBsYW5lID0gcFBsYW5lT3V0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBDb3B5IGxhc3QgZGVjb2RlZCBwbGFuZSB0byBvdXRwdXQgcGxhbmUgKi8KLSAgICAgICAgbWVtY3B5KCh2b2lkICopcFBsYW5lT3V0WzBdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+bGFzdERlY29kZWRQbGFuZVswXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAocFBsYW5lT3V0WzBdLnVfaGVpZ2h0ICogcFBsYW5lT3V0WzBdLnVfd2lkdGgpKTsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopcFBsYW5lT3V0WzFdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+bGFzdERlY29kZWRQbGFuZVsxXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKHBQbGFuZU91dFsxXS51X2hlaWdodCAqIHBQbGFuZU91dFsxXS51X3dpZHRoKSk7Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXBQbGFuZU91dFsyXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPmxhc3REZWNvZGVkUGxhbmVbMl0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChwUGxhbmVPdXRbMl0udV9oZWlnaHQgKiBwUGxhbmVPdXRbMl0udV93aWR0aCkpOwotICAgICAgICBwQy0+bGFzdERlY29kZWRQbGFuZSA9IHBQbGFuZU91dDsKLSAgICB9Ci0KLQotI2VuZGlmIC8qTTRNQ1NfQVVESU9PTkxZKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfaW50QXBwbHlWUFA6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9OT1RJQ0UgYi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9OT1RJQ0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YjFlZmEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLQotICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL0FuZHJvaWQubWsgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBjYWExNWIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLSMKLSMgbGlidnNzCi0jCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFOj0gbGlidmlkZW9lZGl0b3JfY29yZQotCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICBcCi0gICAgICBNNFBUTzNHUFBfQVBJLmMgXAotICAgICAgTTRQVE8zR1BQX1ZpZGVvUHJlUHJvY2Vzc2luZy5jIFwKLSAgICAgIE00VklGSV94VlNTX1JHQjU2NXRvWVVWNDIwLmMgXAotICAgICAgTTR4VlNTX0FQSS5jIFwKLSAgICAgIE00eFZTU19pbnRlcm5hbC5jIFwKLSAgICAgIE00VlNTM0dQUF9BdWRpb01peGluZy5jIFwKLSAgICAgIE00VlNTM0dQUF9DbGlwLmMgXAotICAgICAgTTRWU1MzR1BQX0NsaXBBbmFseXNpcy5jIFwKLSAgICAgIE00VlNTM0dQUF9Db2RlY3MuYyBcCi0gICAgICBNNFZTUzNHUFBfRWRpdC5jIFwKLSAgICAgIE00VlNTM0dQUF9FZGl0QXVkaW8uYyBcCi0gICAgICBNNFZTUzNHUFBfRWRpdFZpZGVvLmMgXAotICAgICAgTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNTdWJzY3JpcHRpb24uYyBcCi0gICAgICBNNENoYW5uZWxDb252ZXJ0ZXIuYyBcCi0gICAgICBNNFZEX0VYVEVSTkFMX0JpdHN0cmVhbVBhcnNlci5jIFwKLSAgICAgIE00QUlSX0FQSS5jIFwKLSAgICAgIE00UkVBREVSX1BjbS5jIFwKLSAgICAgIE00UENNUl9Db3JlUmVhZGVyLmMgXAotICAgICAgTTRBRF9OdWxsLmMgXAotICAgICAgTTRBTVJSX0NvcmVSZWFkZXIuYyBcCi0gICAgICBNNFJFQURFUl9BbXIuYyBcCi0gICAgICBNNFZEX1Rvb2xzLmMgXAotICAgICAgVmlkZW9FZGl0b3JSZXNhbXBsZXIuY3BwIFwKLSAgICAgIE00REVDT0RFUl9OdWxsLmMKLQotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9ICAgICAgIFwKLSAgICBsaWJhdWRpb2ZsaW5nZXIgICAgICAgICAgICAgXAotICAgIGxpYmF1ZGlvdXRpbHMgICAgICAgICAgICAgICBcCi0gICAgbGliYmluZGVyICAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJjdXRpbHMgICAgICAgICAgICAgICAgICAgXAotICAgIGxpYmxvZyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbGlibWVkaWEgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJzdGFnZWZyaWdodCAgICAgICAgICAgICAgXAotICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gICBcCi0gICAgbGlic3RhZ2VmcmlnaHRfb214ICAgICAgICAgIFwKLSAgICBsaWJ1dGlscyAgICAgICAgICAgICAgICAgICAgXAotICAgIGxpYnZpZGVvZWRpdG9yX29zYWwgICAgICAgICBcCi0gICAgbGlidmlkZW9lZGl0b3JfdmlkZW9maWx0ZXJzIFwKLSAgICBsaWJ2aWRlb2VkaXRvcnBsYXllciAgICAgICAgXAotCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJzdGFnZWZyaWdodF9jb2xvcl9jb252ZXJzaW9uIFwKLSAgICBsaWJ2aWRlb2VkaXRvcl9tY3MgXAotICAgIGxpYnZpZGVvZWRpdG9yX3N0YWdlZnJpZ2h0c2hlbGxzIFwKLSAgICBsaWJ2aWRlb2VkaXRvcl8zZ3B3cml0ZXIgXAotCi1MT0NBTF9DX0lOQ0xVREVTICs9IFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvdnNzL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIgXAotICAgICQoVE9QKS9zeXN0ZW0vbWVkaWEvYXVkaW9fZWZmZWN0cy9pbmNsdWRlIFwKLSAgICAkKFRPUCkvc3lzdGVtL21lZGlhL2F1ZGlvX3V0aWxzL2luY2x1ZGUKLQotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmRsCi0KLSMgQWxsIG9mIHRoZSBzaGFyZWQgbGlicmFyaWVzIHdlIGxpbmsgYWdhaW5zdC4KLUxPQ0FMX0xETElCUyA6PSBcCi0gICAgLWxwdGhyZWFkIC1sZGwKLQotTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyIFwKLSAgICAtRE00eFZTU19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0VubyBcCi0gICAgLURERUNPREVfR0lGX09OX1NBVklORwotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000QURfTnVsbC5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNEFEX051bGwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2QxZWM3My4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000QURfTnVsbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNEFEX051bGwuYwotICogQGJyaWVmICAgSW1wbGVtZW50YXRpb24gb2YgdGhlIE1QMyBkZWNvZGVyIHB1YmxpYyBpbnRlcmZhY2UKLSAqIEBub3RlICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGEgIm51bGwiIGF1ZGlvIGRlY29kZXIsIHRoYXQgaXMgYSBkZWNvZGVyCi0gKiAgICAgICAgICB0aGF0IGRvIG5vdGhpbmcgZXhjZXB0IGdldHRpbmcgQVUgZnJvbSB0aGUgcmVhZGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00VE9PTF9WZXJzaW9uSW5mby5oIgotI2luY2x1ZGUgIk00QURfQ29tbW9uLmgiCi0jaW5jbHVkZSAiTTRBRF9OdWxsLmgiCi0KLSNkZWZpbmUgTTRBRF9GT1JDRV8xNkJJVFMKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBOVUxMIEF1ZGlvIERlY29kZXIgdmVyc2lvbiBpbmZvcm1hdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLS8qIENIQU5HRV9WRVJTSU9OX0hFUkUgKi8KLSNkZWZpbmUgTTRBRF9OVUxMX01BSk9SICAgIDEKLSNkZWZpbmUgTTRBRF9OVUxMX01JTk9SICAgIDEKLSNkZWZpbmUgTTRBRF9OVUxMX1JFVklTSU9OIDQKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRBRF9OdWxsQ29udGV4dAotICogQGJyaWVmICAgICAgICBJbnRlcm5hbCBudWxsIGRlY29kZXIgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyoqPCBQb2ludGVyIHRvIHRoZSBzdHJlYW0gaGFuZGxlciBwcm92aWRlZCBieSB0aGUgdXNlciAqLwotICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogICAgbV9wQXVkaW9TdHJlYW1oYW5kbGVyOwotfSBNNEFEX051bGxDb250ZXh0OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTlhQIE1QMyBkZWNvZGVyIGZ1bmN0aW9ucyBkZWZpbml0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG51bGwgZGVjb2RlcgotICogQG5vdGUgICAgQWxsb2NhdGVzIHRoZSBjb250ZXh0Ci0gKgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAgICAgKE9VVCkgICAgQ29udGV4dCBvZiB0aGUgZGVjb2RlcgotICogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyOiAoSU4pICAgIFBvaW50ZXIgdG8gYW4gYXVkaW8gc3RyZWFtIGRlc2NyaXB0aW9uCi0gKiBAcGFyYW0gICAgcFVzZXJEYXRhOiAgICAgICAgKElOKSAgICBQb2ludGVyIHRvIFVzZXIgZGF0YQotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEUgICAgICAgICAgICAgU3RhdGUgYXV0b21hdG9uIGlzIG5vdCBhcHBsaWVkCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DICAgICAgICAgICAgIGEgbWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgIE00QURfTlVMTF9jcmVhdGUoICBNNEFEX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9BdWRpb1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwVXNlckRhdGEpCi17Ci0gICAgTTRBRF9OdWxsQ29udGV4dCogcEM7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDb250ZXh0ID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgIk00QURfTlVMTF9jcmVhdGU6IGludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlciA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICJNNEFEX05VTExfY3JlYXRlOiBpbnZhbGlkIHBvaW50ZXIgcFN0cmVhbUhhbmRsZXIiKTsKLQotICAgIHBDID0gKE00QURfTnVsbENvbnRleHQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRBRF9OdWxsQ29udGV4dCksCi0gICAgICAgICAgICAgICAgIE00REVDT0RFUl9BVURJTywgKE00T1NBX0NoYXIgKikiTTRBRF9OdWxsQ29udGV4dCIpOwotICAgIGlmIChwQyA9PSAoTTRBRF9OdWxsQ29udGV4dCopMCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJDYW4gbm90IGFsbG9jYXRlIG51bGwgZGVjb2RlciBjb250ZXh0Iik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAqcENvbnRleHQgPSBwQzsKLQotICAgIHBDLT5tX3BBdWRpb1N0cmVhbWhhbmRsZXIgPSBwU3RyZWFtSGFuZGxlcjsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBEZXN0cm95cyB0aGUgaW5zdGFuY2Ugb2YgdGhlIG51bGwgZGVjb2RlcgotICogQG5vdGUgICAgIEFmdGVyIHRoaXMgY2FsbCB0aGUgY29udGV4dCBpcyBpbnZhbGlkCi0gKgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgZGVjb2RlcgotICoKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SICAgICAgICAgICAgVGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVIgICAgIFRoZSBjb250ZXh0IGlzIGludmFsaWQgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgIE00QURfTlVMTF9kZXN0cm95KE00QURfQ29udGV4dCBjb250ZXh0KQotewotICAgIE00QURfTnVsbENvbnRleHQqIHBDID0gKE00QURfTnVsbENvbnRleHQqKWNvbnRleHQ7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKGNvbnRleHQgPT0gTTRPU0FfTlVMTCksIE00RVJSX1BBUkFNRVRFUiwgIk00QURfTlVMTF9kZXN0cm95OiBpbnZhbGlkIGNvbnRleHQiKTsKLQotICAgIGZyZWUocEMpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgU2ltcGx5IG91dHB1dCB0aGUgZ2l2ZW4gYXVkaW8gZGF0YQotICogQG5vdGUKLSAqCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXIKLSAqIEBwYXJhbSAgIHBJbnB1dEJ1ZmZlcjogICAgIChJTi9PVVQpSW5wdXQgRGF0YSBidWZmZXIuIEl0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBhdWRpbyBmcmFtZS4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBtdXN0IGJlIHVwZGF0ZWQgaW5zaWRlIHRoZSBmdW5jdGlvbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byByZWZsZWN0IHRoZSBzaXplIG9mIHRoZSBhY3R1YWxseSBkZWNvZGVkIGRhdGEuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlLmcuIHRoZSBmaXJzdCBmcmFtZSBpbiBwSW5wdXRCdWZmZXIpCi0gKiBAcGFyYW0gICBwRGVjb2RlZFBDTUJ1ZmZlcjogKE9VVCkgIE91dHB1dCBQQ00gYnVmZmVyIChkZWNvZGVkIGRhdGEpLgotICogQHBhcmFtICAganVtcGluZzogICAgICAgICAgIChJTikgICBNNE9TQV9UUlVFIGlmIGEganVtcCB3YXMganVzdCBkb25lLCBNNE9TQV9GQUxTRSBvdGhlcndpc2UuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgICBNNEFEX05VTExfc3RlcChNNEFEX0NvbnRleHQgY29udGV4dCwgTTRBRF9CdWZmZXIgKnBJbnB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEFEX0J1ZmZlciAqcERlY29kZWRQQ01CdWZmZXIsIE00T1NBX0Jvb2wganVtcGluZykKLXsKLSAgICBNNEFEX051bGxDb250ZXh0KiBwQyA9IChNNEFEX051bGxDb250ZXh0Kiljb250ZXh0OwotCi0gICAgLypUaGUgVlBTIHNlbmRzIGEgemVybyBidWZmZXIgYXQgdGhlIGVuZCovCi0gICAgaWYgKDAgPT0gcElucHV0QnVmZmVyLT5tX2J1ZmZlclNpemUpCi0gICAgewotICAgICAgICByZXR1cm4gTTRXQVJfTk9fTU9SRV9BVTsKLSAgICB9Ci0KLSAgICBpZiAocElucHV0QnVmZmVyLT5tX2J1ZmZlclNpemUgPiBwRGVjb2RlZFBDTUJ1ZmZlci0+bV9idWZmZXJTaXplKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0jaWZkZWYgTTRBRF9GT1JDRV8xNkJJVFMKLSAgICAvKmlmIHJlYWQgc2FtcGxlcyBhcmUgOCBiaXRzLCBjb21wbGV0ZSB0aGVtIHRvIDE2IGJpdHMqLwotICAgIGlmIChwQy0+bV9wQXVkaW9TdHJlYW1oYW5kbGVyLT5tX2J5dGVTYW1wbGVTaXplID09IDEpCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgaTsKLSAgICAgICAgTTRPU0FfSW50MTYgIHZhbDsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcElucHV0QnVmZmVyLT5tX2J1ZmZlclNpemU7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgdmFsID0gKE00T1NBX0ludDE2KSgoTTRPU0FfVUludDgpKHBJbnB1dEJ1ZmZlci0+bV9kYXRhQWRkcmVzc1tpXSkgLSAxMjgpOwotCi0gICAgICAgICAgICBwRGVjb2RlZFBDTUJ1ZmZlci0+bV9kYXRhQWRkcmVzc1tpKjJdICAgPSAoTTRPU0FfSW50OCkodmFsPj44KTsKLSAgICAgICAgICAgIHBEZWNvZGVkUENNQnVmZmVyLT5tX2RhdGFBZGRyZXNzW2kqMisxXSA9IChNNE9TQV9JbnQ4KSh2YWwmMHgwMGZmKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBtZW1jcHkoKHZvaWQgKilwRGVjb2RlZFBDTUJ1ZmZlci0+bV9kYXRhQWRkcmVzcywgKHZvaWQgKilwSW5wdXRCdWZmZXItPm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIHBJbnB1dEJ1ZmZlci0+bV9idWZmZXJTaXplICk7Ci0gICAgfQotI2Vsc2UgLypNNEFEX0ZPUkNFXzE2QklUUyovCi0gICAgbWVtY3B5KCh2b2lkICopcERlY29kZWRQQ01CdWZmZXItPm1fZGF0YUFkZHJlc3MsICh2b2lkICopcElucHV0QnVmZmVyLT5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICBwSW5wdXRCdWZmZXItPm1fYnVmZmVyU2l6ZSApOwotI2VuZGlmIC8qTTRBRF9GT1JDRV8xNkJJVFMqLwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgR2V0cyB0aGUgZGVjb2RlciB2ZXJzaW9uCi0gKiBAbm90ZSAgICBUaGUgdmVyc2lvbiBpcyBnaXZlbiBpbiBhIE00X1ZlcnNpb25JbmZvIHN0cnVjdHVyZQotICoKLSAqIEBwYXJhbSAgIHBWYWx1ZTogICAgIChPVVQpICAgICAgIFBvaW50ZXIgdG8gdGhlIHZlcnNpb24gc3RydWN0dXJlCi0gKgotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIHBWZXJzaW9uSW5mbyBwb2ludGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgIE00QURfTlVMTF9nZXRWZXJzaW9uKE00X1ZlcnNpb25JbmZvKiBwVmVyc2lvbkluZm8pCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwVmVyc2lvbkluZm8gPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00QURfTlVMTF9nZXRWZXJzaW9uOiBpbnZhbGlkIHBvaW50ZXIgcFZlcnNpb25JbmZvIik7Ci0KLSAgICAvKiBVcCB1bnRpbCBub3csIHRoZSBudWxsIGRlY29kZXIgdmVyc2lvbiBpcyBub3QgYXZhaWxhYmxlICovCi0KLSAgICAvKiBDSEFOR0VfVkVSU0lPTl9IRVJFICovCi0gICAgcFZlcnNpb25JbmZvLT5tX21ham9yICAgICAgICA9IE00QURfTlVMTF9NQUpPUjsgICAgICAvKm1ham9yIHZlcnNpb24gb2YgdGhlIGNvbXBvbmVudCovCi0gICAgcFZlcnNpb25JbmZvLT5tX21pbm9yICAgICAgICA9IE00QURfTlVMTF9NSU5PUjsgICAgICAvKm1pbm9yIHZlcnNpb24gb2YgdGhlIGNvbXBvbmVudCovCi0gICAgcFZlcnNpb25JbmZvLT5tX3JldmlzaW9uICAgID0gTTRBRF9OVUxMX1JFVklTSU9OOyAgICAvKnJldmlzaW9uIHZlcnNpb24gb2YgdGhlIGNvbXBvbmVudCovCi0gICAgcFZlcnNpb25JbmZvLT5tX3N0cnVjdFNpemU9c2l6ZW9mKE00X1ZlcnNpb25JbmZvKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBnZXRJbnRlcmZhY2UgZnVuY3Rpb24gZGVmaW5pdGlvbnMgb2YgTlhQIE1QMyBkZWNvZGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiBSZXRyaWV2ZXMgdGhlIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSB0aGUgZGVjb2RlcgotICogQHBhcmFtIHBEZWNvZGVyVHlwZSAgICAgICAgOiBwb2ludGVyIG9uIGFuIE00QURfVHlwZSAoYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgZGVjb2RlciB0eXBlIHN1cHBvcnRlZCBieQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGRlY29kZXIKLSAqIEBwYXJhbSBwRGVjb2RlckludGVyZmFjZSAgIDogYWRkcmVzcyBvZiBhIHBvaW50ZXIgdGhhdCB3aWxsIGJlIHNldCB0byB0aGUgaW50ZXJmYWNlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkIGJ5IHRoaXMgZGVjb2Rlci4gVGhlIGludGVyZmFjZSBpcyBhIHN0cnVjdHVyZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgYnkgdGhlIGZ1bmN0aW9uIGFuZCBtdXN0IGJlIHVuLWFsbG9jYXRlZCBieSB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVyLgotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgaWYgT0sKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0MgaWYgYWxsb2NhdGlvbiBmYWlsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRBRF9OVUxMX2dldEludGVyZmFjZSggTTRBRF9UeXBlICpwRGVjb2RlclR5cGUsIE00QURfSW50ZXJmYWNlICoqcERlY29kZXJJbnRlcmZhY2UpCi17Ci0gICAgKnBEZWNvZGVySW50ZXJmYWNlID0gKCAgTTRBRF9JbnRlcmZhY2UqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyggc2l6ZW9mKE00QURfSW50ZXJmYWNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfQVVESU8sIChNNE9TQV9DaGFyICopIk00QURfSW50ZXJmYWNlIiApOwotICAgIGlmIChNNE9TQV9OVUxMID09ICpwRGVjb2RlckludGVyZmFjZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAqcERlY29kZXJUeXBlID0gTTRBRF9rVHlwZVBDTTsKLQotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RDcmVhdGVBdWRpb0RlYyAgICAgICA9IE00QURfTlVMTF9jcmVhdGU7Ci0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdERlc3Ryb3lBdWRpb0RlYyAgICAgID0gTTRBRF9OVUxMX2Rlc3Ryb3k7Ci0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdFN0ZXBBdWRpb0RlYyAgICAgICAgID0gTTRBRF9OVUxMX3N0ZXA7Ci0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdEdldFZlcnNpb25BdWRpb0RlYyAgID0gTTRBRF9OVUxMX2dldFZlcnNpb247Ci0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdFN0YXJ0QXVkaW9EZWMgICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0UmVzZXRBdWRpb0RlYyAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RTZXRPcHRpb25BdWRpb0RlYyAgICA9IE00T1NBX05VTEw7Ci0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdEdldE9wdGlvbkF1ZGlvRGVjICAgID0gTTRPU0FfTlVMTDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000QUlSX0FQSS5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNEFJUl9BUEkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjI4OTdiMC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000QUlSX0FQSS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNEFJUl9BUEkuYwotICogQGJyaWVmICBBcmVhIG9mIEludGVyZXN0IFJlc2l6ZXIgIEFQSQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jZGVmaW5lIE00QUlSX1lVVjQyMF9GT1JNQVRfU1VQUE9SVEVECi0jZGVmaW5lIE00QUlSX1lVVjQyMEFfRk9STUFUX1NVUFBPUlRFRAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiBDT01QSUxBVElPTiBDSEVDS1MgKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBNNEFJUl9ZVVY0MjBfRk9STUFUX1NVUFBPUlRFRAotI2lmbmRlZiBNNEFJUl9CR1I1NjVfRk9STUFUX1NVUFBPUlRFRAotI2lmbmRlZiBNNEFJUl9SR0I1NjVfRk9STUFUX1NVUFBPUlRFRAotI2lmbmRlZiBNNEFJUl9CR1I4ODhfRk9STUFUX1NVUFBPUlRFRAotI2lmbmRlZiBNNEFJUl9SR0I4ODhfRk9STUFUX1NVUFBPUlRFRAotI2lmbmRlZiBNNEFJUl9KUEdfRk9STUFUX1NVUFBPUlRFRAotCi0jZXJyb3IgIlBsZWFzZSBkZWZpbmUgYXQgbGVhc3Qgb25lIGlucHV0IGZvcm1hdCBmb3IgdGhlIEFJUiBjb21wb25lbnQiCi0KLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSU5DTFVERVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0jaW5jbHVkZSAiTTRPU0FfTXV0ZXguaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNFZJRklfRmlsdGVyc0FQSS5oIgotI2luY2x1ZGUgIk00QUlSX0FQSS5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqIE00QUlSIElOVEVSTkFMIFRZUEVTIERFRklOSVRJT05TICoqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgICBNNEFJUl9TdGF0ZXMKLSAqIEBicmllZiAgICAgICBUaGUgZm9sbG93aW5nIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIGludGVybmFsIHN0YXRlcyBvZiB0aGUgQUlSLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNEFJUl9rQ3JlYXRlZCwgICAgICAgIC8qKjwgU3RhdGUgYWZ0ZXIgTTRBSVJfY3JlYXRlIGhhcyBiZWVuIGNhbGxlZCAqLwotICAgIE00QUlSX2tDb25maWd1cmVkICAgICAgLyoqPCBTdGF0ZSBhZnRlciBNNEFJUl9jb25maWd1cmUgaGFzIGJlZW4gY2FsbGVkICovCi19TTRBSVJfU3RhdGVzOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgICAgICAgTTRBSVJfSW50ZXJuYWxDb250ZXh0Ci0gKiBAYnJpZWYgICAgICAgICBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBpcyB0aGUgaW50ZXJuYWwgY29udGV4dCBvZiB0aGUgQUlSLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00QUlSX1N0YXRlcyAgICAgICAgICAgIG1fc3RhdGU7ICAgICAgICAvKio8IEludGVybmFsIHN0YXRlICovCi0gICAgTTRBSVJfSW5wdXRGb3JtYXRUeXBlICAgbV9pbnB1dEZvcm1hdDsgIC8qKjwgSW5wdXQgZm9ybWF0IGxpa2UgWVVWNDIwUGxhbmFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJHQjU2NSwgSlBHLCBldGMgLi4uICovCi0gICAgTTRBSVJfUGFyYW1zICAgICAgICAgICAgbV9wYXJhbXM7ICAgICAgIC8qKjwgQ3VycmVudCBpbnB1dCBQYXJhbWV0ZXIgb2YgIHRoZSBwcm9jZXNzaW5nICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdTMyX3hfaW5jWzRdOyAgIC8qKjwgcmF0aW8gYmV0d2VlbiBpbnB1dCBhbmQgb3VwdXQgd2lkdGggZm9yIFlVViAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHUzMl95X2luY1s0XTsgICAvKio8IHJhdGlvIGJldHdlZW4gaW5wdXQgYW5kIG91cHV0IGhlaWdodCBmb3IgWVVWICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnRbNF07ICAgIC8qKjwgaG9yaXpvbnRhbCBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdTMyX3lfYWNjdW1fc3RhcnRbNF07ICAgIC8qKjwgVmVydGljYWwgaW5pdGlhbCBhY2N1bXVsYXRvciB2YWx1ZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHUzMl94X2FjY3VtWzRdOyAvKio8IHNhdmUgb2YgaG9yaXpvbnRhbCBhY2N1bXVsYXRvciB2YWx1ZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHUzMl95X2FjY3VtWzRdOyAvKio8IHNhdmUgb2YgdmVydGljYWwgYWNjdW11bGF0b3IgdmFsdWUgKi8KLSAgICBNNE9TQV9VSW50OCogICAgICAgICAgICBwdThfZGF0YV9pbls0XTsgLyoqPCBTYXZlIG9mIGlucHV0IHBsYW5lIHBvaW50ZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gY2FzZSBvZiBzdHJpcGUgbW9kZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1fcHJvY1Jvd3M7ICAgICAvKio8IE51bWJlciBvZiBwcm9jZXNzZWQgcm93cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBpbiBzdHJpcGUgbW9kZSBvbmx5ICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICBtX2JPbmx5Q29weTsgIC8qKjwgRmxhZyB0byBrbm93IGlmIHdlIGp1c3QgcGVyZm9ybSBhIGNvcHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICBtX2JGbGlwWDsgICAgIC8qKjwgRGVwZW5kIG9uIG91dHB1dCBvcmllbnRhdGlvbiwgdXNlZCBkdXJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NpbmcgdG8gcmV2ZXJ0IHByb2Nlc3Npbmcgb3JkZXIgaW4gWAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZXMgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgIG1fYkZsaXBZOyAgICAgLyoqPCBEZXBlbmQgb24gb3V0cHV0IG9yaWVudGF0aW9uLCB1c2VkIGR1cmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZyB0byByZXZlcnQgcHJvY2Vzc2luZyBvcmRlciBpbiBZCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRlcyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgbV9iUmV2ZXJ0WFk7ICAvKio8IERlcGVuZCBvbiBvdXRwdXQgb3JpZW50YXRpb24sIHVzZWQgZHVyaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nIHRvIHJldmVydCBYIGFuZCBZIHByb2Nlc3Npbmcgb3JkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKy05MLAgcm90YXRpb24pICovCi19TTRBSVJfSW50ZXJuYWxDb250ZXh0OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1BQ1JPUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShyZXR2YWwsIHBvaW50ZXIpXAotICAgICBpZiAoKHBvaW50ZXIpID09IE00T1NBX05VTEwpIHJldHVybiAoKE00T1NBX0VSUikocmV0dmFsKSk7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogTTRBSVIgUFVCTElDIEFQSSBJTVBMRU1FTlRBVElPTiAqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00QUlSX2NyZWF0ZShNNE9TQV9Db250ZXh0KiBwQ29udGV4dCxNNEFJUl9JbnB1dEZvcm1hdFR5cGUgaW5wdXRGb3JtYXQpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplIGFuIGluc3RhbmNlIG9mIHRoZSBBSVIuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgKElOL09VVCkgQWRkcmVzcyBvZiB0aGUgY29udGV4dCB0byBjcmVhdGUKLSAqIEBwYXJhbSAgICBpbnB1dEZvcm1hdDogICAoSU4pIGlucHV0IGZvcm1hdCB0eXBlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpLiBJbnZhbGlkIGZvcm1hdFR5cGUKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6IE5vIG1vcmUgbWVtb3J5IGlzIGF2YWlsYWJsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRBSVJfY3JlYXRlKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LE00QUlSX0lucHV0Rm9ybWF0VHlwZSBpbnB1dEZvcm1hdCkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUiA7Ci0gICAgTTRBSVJfSW50ZXJuYWxDb250ZXh0KiBwQyA9IE00T1NBX05VTEwgOwotCi0gICAgLyogQ2hlY2sgdGhhdCB0aGUgYWRkcmVzcyBvbiB0aGUgY29udGV4dCBpcyBub3QgTlVMTCAqLwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcENvbnRleHQpIDsKLQotICAgICpwQ29udGV4dCA9IE00T1NBX05VTEwgOwotCi0gICAgLyogSW50ZXJuYWwgQ29udGV4dCBjcmVhdGlvbiAqLwotICAgIHBDID0gKE00QUlSX0ludGVybmFsQ29udGV4dCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNEFJUl9JbnRlcm5hbENvbnRleHQpLAotICAgICAgICAgTTRBSVIsKE00T1NBX0NoYXIgKikiQUlSIGludGVybmFsIGNvbnRleHQiKSA7Ci0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfQUxMT0MsIHBDKSA7Ci0KLQotICAgIC8qIENoZWNrIGlmIHRoZSBpbnB1dCBmb3JtYXQgaXMgc3VwcG9ydGVkICovCi0gICAgc3dpdGNoKGlucHV0Rm9ybWF0KQotICAgIHsKLSNpZmRlZiBNNEFJUl9ZVVY0MjBfRk9STUFUX1NVUFBPUlRFRAotICAgICAgICBjYXNlIE00QUlSX2tZVVY0MjBQOgotICAgICAgICBicmVhayA7Ci0jZW5kaWYKLSNpZmRlZiBNNEFJUl9ZVVY0MjBBX0ZPUk1BVF9TVVBQT1JURUQKLSAgICAgICAgY2FzZSBNNEFJUl9rWVVWNDIwQVA6Ci0gICAgICAgIGJyZWFrIDsKLSNlbmRpZgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgZXJyID0gTTRFUlJfQUlSX0ZPUk1BVF9OT1RfU1VQUE9SVEVEOwotICAgICAgICAgICAgZ290byBNNEFJUl9jcmVhdGVfY2xlYW51cCA7Ci0gICAgfQotCi0gICAgLyoqPCBTYXZlIGlucHV0IGZvcm1hdCBhbmQgdXBkYXRlIHN0YXRlICovCi0gICAgcEMtPm1faW5wdXRGb3JtYXQgPSBpbnB1dEZvcm1hdDsKLSAgICBwQy0+bV9zdGF0ZSA9IE00QUlSX2tDcmVhdGVkOwotCi0gICAgLyogUmV0dXJuIHRoZSBjb250ZXh0IHRvIHRoZSBjYWxsZXIgKi8KLSAgICAqcENvbnRleHQgPSBwQyA7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUiA7Ci0KLU00QUlSX2NyZWF0ZV9jbGVhbnVwOgotICAgIC8qIEVycm9yIG1hbmFnZW1lbnQgOiB3ZSBkZXN0cm95IHRoZSBjb250ZXh0IGlmIG5lZWRlZCAqLwotICAgIGlmKE00T1NBX05VTEwgIT0gcEMpCi0gICAgewotICAgICAgICBmcmVlKHBDKSA7Ci0gICAgfQotCi0gICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTCA7Ci0KLSAgICByZXR1cm4gZXJyIDsKLX0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00QUlSX2NsZWFuVXAoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGRlc3Ryb3lzIGFuIGluc3RhbmNlIG9mIHRoZSBBSVIgY29tcG9uZW50Ci0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTikgQ29udGV4dCBpZGVudGlmeWluZyB0aGUgaW5zdGFuY2UgdG8gZGVzdHJveQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpLgotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogSW50ZXJuYWwgc3RhdGUgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhpcyBmdW5jdGlvbiBjYWxsLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRBSVJfY2xlYW5VcChNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00QUlSX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRBSVJfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dCA7Ci0KLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9QQVJBTUVURVIsIHBDb250ZXh0KSA7Ci0KLSAgICAvKio8IENoZWNrIHN0YXRlICovCi0gICAgaWYoKE00QUlSX2tDcmVhdGVkICE9IHBDLT5tX3N0YXRlKSYmKE00QUlSX2tDb25maWd1cmVkICE9IHBDLT5tX3N0YXRlKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0gICAgZnJlZShwQykgOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1IgOwotCi19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRBSVJfY29uZmlndXJlKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00QUlSX1BhcmFtcyogcFBhcmFtcykKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gd2lsbCBjb25maWd1cmUgdGhlIEFJUi4KLSAqIEBub3RlICAgIEl0IHdpbGwgc2V0IHRoZSBpbnB1dCBhbmQgb3V0cHV0IGNvb3JkaW5hdGVzIGFuZCBzaXplcywKLSAqICAgICAgICAgIGFuZCBpbmRpY2F0ZXMgaWYgd2Ugd2lsbCBwcm9jZWVkIGluIHN0cmlwZSBvciBub3QuCi0gKiAgICAgICAgICBJbiBjYXNlIGEgTTRBSVJfZ2V0IGluIHN0cmlwZSBtb2RlIHdhcyBvbiBnb2luZywgaXQgd2lsbCBjYW5jZWwgdGhpcyBwcmV2aW91cwotICogICAgICAgICAgcHJvY2Vzc2luZyBhbmQgcmVzZXQgdGhlIGdldCBwcm9jZXNzLgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAgICAgICAgICAgICAoSU4pIENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIGluc3RhbmNlCi0gKiBAcGFyYW0gICAgcFBhcmFtcy0+bV9iT3V0cHV0U3RyaXBlOihJTikgU3RyaXBlIG1vZGUuCi0gKiBAcGFyYW0gICAgcFBhcmFtcy0+bV9pbnB1dENvb3JkOiAgICAoSU4pIFgsWSBjb29yZGluYXRlcyBvZiB0aGUgZmlyc3QgdmFsaWQgcGl4ZWwgaW4gaW5wdXQuCi0gKiBAcGFyYW0gICAgcFBhcmFtcy0+bV9pbnB1dFNpemU6ICAgIChJTikgaW5wdXQgUk9JIHNpemUuCi0gKiBAcGFyYW0gICAgcFBhcmFtcy0+bV9vdXRwdXRTaXplOiAgICAoSU4pIG91dHB1dCBzaXplLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogTm8gbW9yZSBtZW1vcnkgc3BhY2UgdG8gYWRkIGEgbmV3IGVmZmVjdC4KLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KS4KLSAqIEByZXR1cm4gICAgTTRFUlJfQUlSX0ZPUk1BVF9OT1RfU1VQUE9SVEVEOiB0aGUgcmVxdWVzdGVkIGlucHV0IGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRBSVJfY29uZmlndXJlKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00QUlSX1BhcmFtcyogcFBhcmFtcykKLXsKLSAgICBNNEFJUl9JbnRlcm5hbENvbnRleHQqIHBDID0gKE00QUlSX0ludGVybmFsQ29udGV4dCopcENvbnRleHQgOwotICAgIE00T1NBX1VJbnQzMiAgICBpLHUzMl93aWR0aF9pbiwgdTMyX3dpZHRoX291dCwgdTMyX2hlaWdodF9pbiwgdTMyX2hlaWdodF9vdXQ7Ci0gICAgTTRPU0FfVUludDMyICAgIG5iX3BsYW5lczsKLQotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcENvbnRleHQpIDsKLQotICAgIGlmKE00QUlSX2tZVVY0MjBBUCA9PSBwQy0+bV9pbnB1dEZvcm1hdCkKLSAgICB7Ci0gICAgICAgIG5iX3BsYW5lcyA9IDQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG5iX3BsYW5lcyA9IDM7Ci0gICAgfQotCi0gICAgLyoqPCBDaGVjayBzdGF0ZSAqLwotICAgIGlmKChNNEFJUl9rQ3JlYXRlZCAhPSBwQy0+bV9zdGF0ZSkmJihNNEFJUl9rQ29uZmlndXJlZCAhPSBwQy0+bV9zdGF0ZSkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyoqIFNhdmUgcGFyYW1ldGVycyAqLwotICAgIHBDLT5tX3BhcmFtcyA9ICpwUGFyYW1zOwotCi0gICAgLyogQ2hlY2sgZm9yIHRoZSBpbnB1dCZvdXRwdXQgd2lkdGggYW5kIGhlaWdodCBhcmUgZXZlbiAqLwotICAgICAgICBpZiggKChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpJjB4MSkgICAgfHwKLSAgICAgICAgICAgICgocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSYweDEpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUlSX0lMTEVHQUxfRlJBTUVfU0laRTsKLSAgICAgICAgfQotCi0gICAgIGlmKCAoKHBDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKSYweDEpICAgIHx8Ci0gICAgICAgICAgICAoKHBDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKSYweDEpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUlSX0lMTEVHQUxfRlJBTUVfU0laRTsKLSAgICAgICAgfQotICAgIGlmKCgocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpID09IChwQy0+bV9wYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGgpKQotICAgICAgICAmJigocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSA9PSAocEMtPm1fcGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCkpKQotICAgIHsKLSAgICAgICAgLyoqPCBObyByZXNpemUgaW4gdGhpcyBjYXNlLCB3ZSB3aWxsIGp1c3QgY29weSBpbnB1dCBpbiBvdXRwdXQgKi8KLSAgICAgICAgcEMtPm1fYk9ubHlDb3B5ID0gTTRPU0FfVFJVRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEMtPm1fYk9ubHlDb3B5ID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAgICAgLyoqPCBJbml0aWFsaXplIGludGVybmFsIHZhcmlhYmxlcyB1c2VkIGZvciByZXNpemUgZmlsdGVyICovCi0gICAgICAgIGZvcihpPTA7aTxuYl9wbGFuZXM7aSsrKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIHUzMl93aWR0aF9pbiA9ICgoaT09MCl8fChpPT0zKSk/cEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGg6XAotICAgICAgICAgICAgICAgIChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCsxKT4+MTsKLSAgICAgICAgICAgIHUzMl9oZWlnaHRfaW4gPSAoKGk9PTApfHwoaT09MykpP3BDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodDpcCi0gICAgICAgICAgICAgICAgKHBDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCsxKT4+MTsKLSAgICAgICAgICAgIHUzMl93aWR0aF9vdXQgPSAoKGk9PTApfHwoaT09MykpP3BDLT5tX3BhcmFtcy5tX291dHB1dFNpemUubV93aWR0aDpcCi0gICAgICAgICAgICAgICAgKHBDLT5tX3BhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCsxKT4+MTsKLSAgICAgICAgICAgIHUzMl9oZWlnaHRfb3V0ID0gKChpPT0wKXx8KGk9PTMpKT9wQy0+bV9wYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0OlwKLSAgICAgICAgICAgICAgICAocEMtPm1fcGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCsxKT4+MTsKLQotICAgICAgICAgICAgICAgIC8qIENvbXB1dGUgaG9yaXpvbnRhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gd2lkdGguKi8KLSAgICAgICAgICAgICAgICBpZiAodTMyX3dpZHRoX291dCA+PSB1MzJfd2lkdGhfaW4pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3hfaW5jW2ldICAgPSAoKHUzMl93aWR0aF9pbi0xKSAqIDB4MTAwMDApIC8gKHUzMl93aWR0aF9vdXQtMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeF9pbmNbaV0gICA9ICh1MzJfd2lkdGhfaW4gKiAweDEwMDAwKSAvICh1MzJfd2lkdGhfb3V0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBDb21wdXRlIHZlcnRpY2FsIHJhdGlvIGJldHdlZW4gc3JjIGFuZCBkZXN0aW5hdGlvbiBoZWlnaHQuKi8KLSAgICAgICAgICAgICAgICBpZiAodTMyX2hlaWdodF9vdXQgPj0gdTMyX2hlaWdodF9pbikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9pbmNbaV0gICA9ICgodTMyX2hlaWdodF9pbiAtIDEpICogMHgxMDAwMCkgLyAodTMyX2hlaWdodF9vdXQtMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9pbmNbaV0gPSAodTMyX2hlaWdodF9pbiAqIDB4MTAwMDApIC8gKHUzMl9oZWlnaHRfb3V0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgIENhbGN1bGF0ZSBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlIDogdTMyX3lfYWNjdW1fc3RhcnQuCi0gICAgICAgICAgICAgICAgdTMyX3lfYWNjdW1fc3RhcnQgaXMgY29kZWQgb24gMTUgYml0cywgYW5kIHJlcHJlc2VudHMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDAuNQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKHBDLT51MzJfeV9pbmNbaV0gPj0gMHgxMDAwMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgICBLZWVwIHRoZSBmcmFjdGlvbm5hbCBwYXJ0LCBhc3NpbXVuZyB0aGF0IGludGVnZXIgIHBhcnQgaXMgY29kZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIG9uIHRoZSAxNiBoaWdoIGJpdHMgYW5kIHRoZSBmcmFjdGlvbm5hbCBvbiB0aGUgMTUgbG93IGJpdHMKLSAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtX3N0YXJ0W2ldID0gcEMtPnUzMl95X2luY1tpXSAmIDB4ZmZmZjsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIXBDLT51MzJfeV9hY2N1bV9zdGFydFtpXSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtX3N0YXJ0W2ldID0gMHgxMDAwMDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bV9zdGFydFtpXSA+Pj0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtX3N0YXJ0W2ldID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyoqPCBUYWtlIGludG8gYWNjb3VudCB0aGF0IFkgY29vcmRpbmF0ZSBjYW4gYmUgb2RkCi0gICAgICAgICAgICAgICAgICAgIGluIHRoaXMgY2FzZSB3ZSBoYXZlIHRvIHB1dCBhIDAuNSBvZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgZm9yIFUgYW5kIFYgcGxhbmUgYXMgdGhlcmUgYSAyIHRpbWVzIHN1Yi1zYW1wbGVkIHZzIFkqLwotICAgICAgICAgICAgICAgIGlmKChwQy0+bV9wYXJhbXMubV9pbnB1dENvb3JkLm1feSYweDEpJiYoKGk9PTEpfHwoaT09MikpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtX3N0YXJ0W2ldICs9IDB4ODAwMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICBDYWxjdWxhdGUgaW5pdGlhbCBhY2N1bXVsYXRvciB2YWx1ZSA6IHUzMl94X2FjY3VtX3N0YXJ0LgotICAgICAgICAgICAgICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCBpcyBjb2RlZCBvbiAxNSBiaXRzLCBhbmQgcmVwcmVzZW50cyBhIHZhbHVlIGJldHdlZW4KLSAgICAgICAgICAgICAgICAgICAgMCBhbmQgMC41Ci0gICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgIGlmIChwQy0+dTMyX3hfaW5jW2ldID49IDB4MTAwMDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3hfYWNjdW1fc3RhcnRbaV0gPSBwQy0+dTMyX3hfaW5jW2ldICYgMHhmZmZmOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICghcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3hfYWNjdW1fc3RhcnRbaV0gPSAweDEwMDAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldID4+PSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3hfYWNjdW1fc3RhcnRbaV0gPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKio8IFRha2UgaW50byBhY2NvdW50IHRoYXQgWCBjb29yZGluYXRlIGNhbiBiZSBvZGQKLSAgICAgICAgICAgICAgICAgICAgaW4gdGhpcyBjYXNlIHdlIGhhdmUgdG8gcHV0IGEgMC41IG9mZnNldAotICAgICAgICAgICAgICAgICAgICBmb3IgVSBhbmQgViBwbGFuZSBhcyB0aGVyZSBhIDIgdGltZXMgc3ViLXNhbXBsZWQgdnMgWSovCi0gICAgICAgICAgICAgICAgaWYoKHBDLT5tX3BhcmFtcy5tX2lucHV0Q29vcmQubV94JjB4MSkmJigoaT09MSl8fChpPT0yKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3hfYWNjdW1fc3RhcnRbaV0gKz0gMHg4MDAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKjwgUmVzZXQgdmFyaWFibGUgdXNlZCBmb3Igc3RyaXBlIG1vZGUgKi8KLSAgICBwQy0+bV9wcm9jUm93cyA9IDA7Ci0KLSAgICAvKio8IEluaXRpYWxpemUgdmFyIGZvciBYL1kgcHJvY2Vzc2luZyBvcmRlciBhY2NvcmRpbmcgdG8gb3JpZW50YXRpb24gKi8KLSAgICBwQy0+bV9iRmxpcFggPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+bV9iRmxpcFkgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+bV9iUmV2ZXJ0WFkgPSBNNE9TQV9GQUxTRTsKLSAgICBzd2l0Y2gocFBhcmFtcy0+bV9vdXRwdXRPcmllbnRhdGlvbikKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uVG9wTGVmdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblRvcFJpZ2h0OgotICAgICAgICAgICAgcEMtPm1fYkZsaXBYID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkJvdHRvbVJpZ2h0OgotICAgICAgICAgICAgcEMtPm1fYkZsaXBYID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIHBDLT5tX2JGbGlwWSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Cb3R0b21MZWZ0OgotICAgICAgICAgICAgcEMtPm1fYkZsaXBZID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkxlZnRUb3A6Ci0gICAgICAgICAgICBwQy0+bV9iUmV2ZXJ0WFkgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uUmlnaHRUb3A6Ci0gICAgICAgICAgICBwQy0+bV9iUmV2ZXJ0WFkgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgcEMtPm1fYkZsaXBZID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblJpZ2h0Qm90dG9tOgotICAgICAgICAgICAgcEMtPm1fYlJldmVydFhZID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIHBDLT5tX2JGbGlwWCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBwQy0+bV9iRmxpcFkgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uTGVmdEJvdHRvbToKLSAgICAgICAgICAgIHBDLT5tX2JSZXZlcnRYWSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBwQy0+bV9iRmxpcFggPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotICAgIC8qKjwgVXBkYXRlIHN0YXRlICovCi0gICAgcEMtPm1fc3RhdGUgPSBNNEFJUl9rQ29uZmlndXJlZDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SIDsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNEFJUl9nZXQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbiwgTTRWSUZJX0ltYWdlUGxhbmUqIHBPdXQpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcHJvdmlkZSB0aGUgcmVxdWVzdGVkIHJlc2l6ZWQgYXJlYSBvZiBpbnRlcmVzdCBhY2NvcmRpbmcgdG8KLSAqICAgICAgICAgIHNldHRpbmdzICBwcm92aWRlZCBpbiBNNEFJUl9jb25maWd1cmUuCi0gKiBAbm90ZSAgICBJbiBjYXNlIHRoZSBpbnB1dCBmb3JtYXQgdHlwZSBpcyBKUEVHLCBpbnB1dCBwbGFuZShzKQotICogICAgICAgICAgaW4gcEluIGlzIG5vdCB1c2VkLiBJbiBub3JtYWwgbW9kZSwgZGltZW5zaW9uIHNwZWNpZmllZCBpbiBvdXRwdXQgcGxhbmUocykgc3RydWN0dXJlCi0gKiAgICAgICAgICBtdXN0IGJlIHRoZSBzYW1lIHRoYW4gdGhlIG9uZSBzcGVjaWZpZWQgaW4gTTRBSVJfY29uZmlndXJlLiBJbiBzdHJpcGUgbW9kZSwgb25seSB0aGUKLSAqICAgICAgICAgIHdpZHRoIHdpbGwgYmUgdGhlIHNhbWUsIGhlaWdodCB3aWxsIGJlIHRha2VuIGFzIHRoZSBzdHJpcGUgaGVpZ2h0ICh0eXBpY2FsbHkgMTYpLgotICogICAgICAgICAgSW4gbm9ybWFsIG1vZGUsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbCBvbmNlIHRvIGdldCB0aGUgZnVsbCBvdXRwdXQgcGljdHVyZS4KLSAqICAgICAgICAgIEluIHN0cmlwZSBtb2RlLCBpdCBpcyBjYWxsZWQgZm9yIGVhY2ggc3RyaXBlIHRpbGwgdGhlIHdob2xlIHBpY3R1cmUgaGFzIGJlZW4KLSAqICAgICAgICAgIHJldHJpZXZlZCxhbmQgIHRoZSBwb3NpdGlvbiBvZiB0aGUgb3V0cHV0IHN0cmlwZSBpbiB0aGUgb3V0cHV0IHBpY3R1cmUKLSAqICAgICAgICAgIGlzIGludGVybmFsbHkgaW5jcmVtZW50ZWQgYXQgZWFjaCBzdGVwLgotICogICAgICAgICAgQW55IGNhbGwgdG8gTTRBSVJfY29uZmlndXJlIGR1cmluZyBzdHJpcGUgcHJvY2VzcyB3aWxsIHJlc2V0IHRoaXMgb25lIHRvIHRoZQotICogICAgICAgICAgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXQgcGljdHVyZS4KLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSBpbnN0YW5jZQotICogQHBhcmFtICAgIHBJbjogICAgICAgICAgICAoSU4pIFBsYW5lIHN0cnVjdHVyZSBjb250YWluaW5nIGlucHV0IFBsYW5lKHMpLgotICogQHBhcmFtICAgIHBPdXQ6ICAgICAgICAoSU4vT1VUKSAgUGxhbmUgc3RydWN0dXJlIGNvbnRhaW5pbmcgb3V0cHV0IFBsYW5lKHMpLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogTm8gbW9yZSBtZW1vcnkgc3BhY2UgdG8gYWRkIGEgbmV3IGVmZmVjdC4KLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00QUlSX2dldChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSogcEluLCBNNFZJRklfSW1hZ2VQbGFuZSogcE91dCkKLXsKLSAgICBNNEFJUl9JbnRlcm5hbENvbnRleHQqIHBDID0gKE00QUlSX0ludGVybmFsQ29udGV4dCopcENvbnRleHQgOwotICAgIE00T1NBX1VJbnQzMiBpLGosayx1MzJfeF9mcmFjLHUzMl95X2ZyYWMsdTMyX3hfYWNjdW0sdTMyX3lfYWNjdW0sdTMyX3NoaWZ0OwotICAgICAgICBNNE9TQV9VSW50OCAgICAqcHU4X2RhdGFfaW4sICpwdThfZGF0YV9pbl9vcmcsICpwdThfZGF0YV9pbl90bXAsICpwdThfZGF0YV9vdXQ7Ci0gICAgICAgIE00T1NBX1VJbnQ4ICAgICpwdThfc3JjX3RvcDsKLSAgICAgICAgTTRPU0FfVUludDggICAgKnB1OF9zcmNfYm90dG9tOwotICAgIE00T1NBX1VJbnQzMiAgICB1MzJfdGVtcF92YWx1ZTsKLSAgICBNNE9TQV9JbnQzMiAgICBpMzJfdG1wX29mZnNldDsKLSAgICBNNE9TQV9VSW50MzIgICAgbmJfcGxhbmVzOwotCi0KLQotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcENvbnRleHQpIDsKLQotICAgIC8qKjwgQ2hlY2sgc3RhdGUgKi8KLSAgICBpZihNNEFJUl9rQ29uZmlndXJlZCAhPSBwQy0+bV9zdGF0ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICBpZihNNEFJUl9rWVVWNDIwQVAgPT0gcEMtPm1faW5wdXRGb3JtYXQpCi0gICAgewotICAgICAgICBuYl9wbGFuZXMgPSA0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBuYl9wbGFuZXMgPSAzOwotICAgIH0KLQotICAgIC8qKjwgTG9vcCBvbiBlYWNoIFBsYW5lICovCi0gICAgZm9yKGk9MDtpPG5iX3BsYW5lcztpKyspCi0gICAgewotCi0gICAgICAgICAvKiBTZXQgdGhlIHdvcmtpbmcgcG9pbnRlcnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQvb3V0cHV0IGRhdGEgZmllbGQgKi8KLQotICAgICAgICB1MzJfc2hpZnQgPSAoKGk9PTApfHwoaT09MykpPzA6MTsgLyoqPCBEZXBlbmQgb24gTHVtYSBvciBDaHJvbWEgKi8KLQotICAgICAgICBpZigoTTRPU0FfRkFMU0UgPT0gcEMtPm1fcGFyYW1zLm1fYk91dHB1dFN0cmlwZSlcCi0gICAgICAgICAgICB8fCgoTTRPU0FfVFJVRSA9PSBwQy0+bV9wYXJhbXMubV9iT3V0cHV0U3RyaXBlKSYmKDAgPT0gcEMtPm1fcHJvY1Jvd3MpKSkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqPCBGb3IgaW5wdXQsIHRha2UgY2FyZSBhYm91dCBST0kgKi8KLSAgICAgICAgICAgIHB1OF9kYXRhX2luICAgICA9IHBJbltpXS5wYWNfZGF0YSArIHBJbltpXS51X3RvcGxlZnQgXAotICAgICAgICAgICAgICAgICsgKHBDLT5tX3BhcmFtcy5tX2lucHV0Q29vcmQubV94Pj51MzJfc2hpZnQpCi0gICAgICAgICAgICAgICAgICAgICAgICArIChwQy0+bV9wYXJhbXMubV9pbnB1dENvb3JkLm1feSA+PiB1MzJfc2hpZnQpICogcEluW2ldLnVfc3RyaWRlOwotCi0gICAgICAgICAgICAvKiogR28gYXQgZW5kIG9mIGxpbmUvY29sdW1uIGluIGNhc2UgWC9ZIHNjYW5uaW5nIGlzIGZsaXBwZWQgKi8KLSAgICAgICAgICAgIGlmKE00T1NBX1RSVUUgPT0gcEMtPm1fYkZsaXBYKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luICs9ICgocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpPj51MzJfc2hpZnQpIC0xIDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKE00T1NBX1RSVUUgPT0gcEMtPm1fYkZsaXBZKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luICs9ICgocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0Pj51MzJfc2hpZnQpIC0xKVwKLSAgICAgICAgICAgICAgICAgICAgICogcEluW2ldLnVfc3RyaWRlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKio8IEluaXRpYWxpemUgYWNjdW11bGF0b3JzIGluIGNhc2Ugd2UgYXJlIHVzaW5nIGl0IChiaWxpbmVhciBpbnRlcnBvbGF0aW9uKSAqLwotICAgICAgICAgICAgaWYoIE00T1NBX0ZBTFNFID09IHBDLT5tX2JPbmx5Q29weSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+dTMyX3hfYWNjdW1baV0gPSBwQy0+dTMyX3hfYWNjdW1fc3RhcnRbaV07Ci0gICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtW2ldID0gcEMtPnUzMl95X2FjY3VtX3N0YXJ0W2ldOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKio8IEluIGNhc2Ugb2Ygc3RyaXBlIG1vZGUgZm9yIG90aGVyIHRoYW4gZmlyc3Qgc3RyaXBlLCB3ZSBuZWVkIHRvIHJlY292ZXIgaW5wdXQKLSAgICAgICAgICAgICAgICAgcG9pbnRlciBmcm9tIGludGVybmFsIGNvbnRleHQgKi8KLSAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcEMtPnB1OF9kYXRhX2luW2ldOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqPCBJbiBldmVyeSBtb2RlLCBvdXRwdXQgZGF0YSBhcmUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0IHBsYW5lICovCi0gICAgICAgIHB1OF9kYXRhX291dCAgICA9IHBPdXRbaV0ucGFjX2RhdGEgKyBwT3V0W2ldLnVfdG9wbGVmdDsKLQotICAgICAgICAvKio8IEluaXRpYWxpemUgaW5wdXQgb2Zmc2V0IGFwcGxpZWQgYWZ0ZXIgZWFjaCBwaXhlbCAqLwotICAgICAgICBpZihNNE9TQV9GQUxTRSA9PSBwQy0+bV9iRmxpcFkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGkzMl90bXBfb2Zmc2V0ID0gcEluW2ldLnVfc3RyaWRlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaTMyX3RtcF9vZmZzZXQgPSAtcEluW2ldLnVfc3RyaWRlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqPCBJbiB0aGlzIGNhc2UsIG5vIGJpbGluZWFyIGludGVycG9sYXRpb24gaXMgbmVlZGVkIGFzIGlucHV0IGFuZCBvdXRwdXQgZGltZW5zaW9ucwotICAgICAgICAgICAgYXJlIHRoZSBzYW1lICovCi0gICAgICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5tX2JPbmx5Q29weSkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqPCBObyArLTkwsCByb3RhdGlvbiAqLwotICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYlJldmVydFhZKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKjwgTm8gZmxpcCBvbiBYIGFic2Npc3NhICovCi0gICAgICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYkZsaXBYKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggcm93ICovCi0gICAgICAgICAgICAgICAgICAgIGZvcihqPTA7ajxwT3V0W2ldLnVfaGVpZ2h0O2orKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBDb3B5IG9uZSB3aG9sZSBsaW5lICovCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwdThfZGF0YV9vdXQsICh2b2lkICopcHU4X2RhdGFfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRbaV0udV93aWR0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVXBkYXRlIHBvaW50ZXJzICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9vdXQgKz0gcE91dFtpXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKE00T1NBX0ZBTFNFID09IHBDLT5tX2JGbGlwWSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiArPSBwSW5baV0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gLT0gcEluW2ldLnVfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICBmb3Ioaj0wO2o8cE91dFtpXS51X2hlaWdodDtqKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIHBpeGVsIG9mIDEgcm93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSAqcHU4X2RhdGFfaW4tLTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBVcGRhdGUgcG9pbnRlcnMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX291dCArPSAocE91dFtpXS51X3N0cmlkZSAtIHBPdXRbaV0udV93aWR0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luICs9IHBPdXRbaV0udV93aWR0aCArIGkzMl90bXBfb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKio8IEhlcmUgd2UgaGF2ZSBhICstOTCwIHJvdGF0aW9uICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCByb3cgKi8KLSAgICAgICAgICAgICAgICBmb3Ioaj0wO2o8cE91dFtpXS51X2hlaWdodDtqKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbl90bXAgPSBwdThfZGF0YV9pbjsKLQotICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBwaXhlbCBvZiAxIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKnB1OF9kYXRhX2luX3RtcDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBVcGRhdGUgaW5wdXQgcG9pbnRlciBpbiBvcmRlciB0byBnbyB0byBuZXh0L3Bhc3QgbGluZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW5fdG1wICs9IGkzMl90bXBfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqPCBVcGRhdGUgcG9pbnRlcnMgKi8KLSAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfb3V0ICs9IChwT3V0W2ldLnVfc3RyaWRlIC0gcE91dFtpXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYkZsaXBYKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiArKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luIC0tOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qKjwgQmlsaW5lYXIgaW50ZXJwb2xhdGlvbiAqLwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLQotICAgICAgICBpZigzICE9IGkpICAgIC8qKjwgb3RoZXIgdGhhbiBhbHBoYSBwbGFuZSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICAvKipObyArLTkwsCByb3RhdGlvbiAqLwotICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYlJldmVydFhZKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggcm93ICovCi0gICAgICAgICAgICAgICAgZm9yKGo9MDtqPHBPdXRbaV0udV9oZWlnaHQ7aisrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfeV9mcmFjID0gKHBDLT51MzJfeV9hY2N1bVtpXT4+MTIpJjE1OwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFJlaW5pdCBob3Jpem9udGFsIHdlaWdodCBmYWN0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3hfYWNjdW0gPSBwQy0+dTMyX3hfYWNjdW1fc3RhcnRbaV07Ci0KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihNNE9TQV9UUlVFID09ICBwQy0+bV9iRmxpcFgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBvdXRwdXQgcGl4ZWwgaW4gYSByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3hfZnJhYyA9ICh1MzJfeF9hY2N1bSA+PiAxMikmMTU7IC8qIEZyYWN0aW9uIG9mIEhvcml6b250YWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodCBmYWN0b3IgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcCA9IChwdThfZGF0YV9pbiAtICh1MzJfeF9hY2N1bSA+PiAxNikpIC0xIDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgaTMyX3RtcF9vZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWUgPSAoTTRWSUZJX1VJbnQ4KSgoKHB1OF9zcmNfdG9wWzFdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcFswXSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB1OF9zcmNfYm90dG9tWzFdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbVswXSp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpdTMyX3RlbXBfdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIGhvcml6b250YWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3hfYWNjdW0gKz0gcEMtPnUzMl94X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBvdXRwdXQgcGl4ZWwgaW4gYSByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl94X2ZyYWMgPSAodTMyX3hfYWNjdW0gPj4gMTIpJjE1OyAvKiBGcmFjdGlvbiBvZiBIb3Jpem9udGFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHQgZmFjdG9yICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3AgPSBwdThfZGF0YV9pbiArICh1MzJfeF9hY2N1bSA+PiAxNik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b20gPSBwdThfc3JjX3RvcCArIGkzMl90bXBfb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChwdThfc3JjX3RvcFswXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3BbMV0qdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdThfc3JjX2JvdHRvbVswXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b21bMV0qdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKE00VklGSV9VSW50OCl1MzJfdGVtcF92YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgaG9yaXpvbnRhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeF9hY2N1bSArPSBwQy0+dTMyX3hfaW5jW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX291dCArPSBwT3V0W2ldLnVfc3RyaWRlIC0gcE91dFtpXS51X3dpZHRoOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB2ZXJ0aWNhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfYWNjdW1baV0gKz0gcEMtPnUzMl95X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICBpZiAocEMtPnUzMl95X2FjY3VtW2ldPj4xNikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gPSBwdThfZGF0YV9pbiArIChwQy0+dTMyX3lfYWNjdW1baV0gPj4gMTYpICogaTMyX3RtcF9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bVtpXSAmPSAweGZmZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgICAgIC8qKiArLTkwsCByb3RhdGlvbiAqLwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luX29yZyA9IHB1OF9kYXRhX2luOwotCi0gICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHJvdyAqLwotICAgICAgICAgICAgICAgIGZvcihqPTA7ajxwT3V0W2ldLnVfaGVpZ2h0O2orKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGhvcml6b250YWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfeF9mcmFjID0gKHBDLT51MzJfeF9hY2N1bVtpXT4+MTIpJjE1OwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFJlaW5pdCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSA9IHBDLT51MzJfeV9hY2N1bV9zdGFydFtpXTsKLQotICAgICAgICAgICAgICAgICAgICBpZihNNE9TQV9UUlVFID09ICBwQy0+bV9iRmxpcFgpCi0gICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHBpeGVsIGluIGEgcm93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2ZyYWMgPSAodTMyX3lfYWNjdW0gPj4gMTIpJjE1OyAvKiBWZXJ0aWNhbCB3ZWlnaHQgZmFjdG9yICovCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wID0gKHB1OF9kYXRhX2luIC0gKHBDLT51MzJfeF9hY2N1bVtpXSA+PiAxNikpIC0gMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tID0gcHU4X3NyY190b3AgKyBpMzJfdG1wX29mZnNldDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWUgPSAoTTRWSUZJX1VJbnQ4KSgoKHB1OF9zcmNfdG9wWzFdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3BbMF0qdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdThfc3JjX2JvdHRvbVsxXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tWzBdKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSAoTTRWSUZJX1VJbnQ4KXUzMl90ZW1wX3ZhbHVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHZlcnRpY2FsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gKz0gcEMtPnUzMl95X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1MzJfeV9hY2N1bT4+MTYpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiA9IHB1OF9kYXRhX2luICsgKHUzMl95X2FjY3VtID4+IDE2KSAqIGkzMl90bXBfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtICY9IDB4ZmZmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCBwaXhlbCBpbiBhIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MDtrPHBPdXRbaV0udV93aWR0aDtrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9mcmFjID0gKHUzMl95X2FjY3VtID4+IDEyKSYxNTsgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3AgPSBwdThfZGF0YV9pbiArIChwQy0+dTMyX3hfYWNjdW1baV0gPj4gMTYpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b20gPSBwdThfc3JjX3RvcCArIGkzMl90bXBfb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgocHU4X3NyY190b3BbMF0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcFsxXSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB1OF9zcmNfYm90dG9tWzBdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b21bMV0qdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpdTMyX3RlbXBfdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdmVydGljYWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSArPSBwQy0+dTMyX3lfaW5jW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHUzMl95X2FjY3VtPj4xNikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcHU4X2RhdGFfaW4gKyAodTMyX3lfYWNjdW0gPj4gMTYpICogaTMyX3RtcF9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gJj0gMHhmZmZmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9vdXQgKz0gcE91dFtpXS51X3N0cmlkZSAtIHBPdXRbaV0udV93aWR0aDsKLQotICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgaG9yaXpvbnRhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3hfYWNjdW1baV0gKz0gcEMtPnUzMl94X2luY1tpXTsKLQotICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiA9IHB1OF9kYXRhX2luX29yZzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0vKiogMyAhPSBpICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAvKipObyArLTkwsCByb3RhdGlvbiAqLwotICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYlJldmVydFhZKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggcm93ICovCi0gICAgICAgICAgICAgICAgZm9yKGo9MDtqPHBPdXRbaV0udV9oZWlnaHQ7aisrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfeV9mcmFjID0gKHBDLT51MzJfeV9hY2N1bVtpXT4+MTIpJjE1OwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFJlaW5pdCBob3Jpem9udGFsIHdlaWdodCBmYWN0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3hfYWNjdW0gPSBwQy0+dTMyX3hfYWNjdW1fc3RhcnRbaV07Ci0KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihNNE9TQV9UUlVFID09ICBwQy0+bV9iRmxpcFgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBvdXRwdXQgcGl4ZWwgaW4gYSByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3hfZnJhYyA9ICh1MzJfeF9hY2N1bSA+PiAxMikmMTU7IC8qIEZyYWN0aW9uIG9mIEhvcml6b250YWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHQgZmFjdG9yICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3AgPSAocHU4X2RhdGFfaW4gLSAodTMyX3hfYWNjdW0gPj4gMTYpKSAtMSA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b20gPSBwdThfc3JjX3RvcCArIGkzMl90bXBfb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChwdThfc3JjX3RvcFsxXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3BbMF0qdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB1OF9zcmNfYm90dG9tWzFdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbVswXSp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlPSAodTMyX3RlbXBfdmFsdWUgPj4gNykqMHhmZjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSAoTTRWSUZJX1VJbnQ4KXUzMl90ZW1wX3ZhbHVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBob3Jpem9udGFsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl94X2FjY3VtICs9IHBDLT51MzJfeF9pbmNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHBpeGVsIGluIGEgcm93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MDtrPHBPdXRbaV0udV93aWR0aDtrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeF9mcmFjID0gKHUzMl94X2FjY3VtID4+IDEyKSYxNTsgLyogRnJhY3Rpb24gb2YgSG9yaXpvbnRhbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0IGZhY3RvciAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wID0gcHU4X2RhdGFfaW4gKyAodTMyX3hfYWNjdW0gPj4gMTYpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tID0gcHU4X3NyY190b3AgKyBpMzJfdG1wX29mZnNldDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgocHU4X3NyY190b3BbMF0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wWzFdKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHU4X3NyY19ib3R0b21bMF0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tWzFdKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWU9ICh1MzJfdGVtcF92YWx1ZSA+PiA3KSoweGZmOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpdTMyX3RlbXBfdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIGhvcml6b250YWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3hfYWNjdW0gKz0gcEMtPnUzMl94X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9vdXQgKz0gcE91dFtpXS51X3N0cmlkZSAtIHBPdXRbaV0udV93aWR0aDsKLQotICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdmVydGljYWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtW2ldICs9IHBDLT51MzJfeV9pbmNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgaWYgKHBDLT51MzJfeV9hY2N1bVtpXT4+MTYpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcHU4X2RhdGFfaW4gKyAocEMtPnUzMl95X2FjY3VtW2ldID4+IDE2KSAqIGkzMl90bXBfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfYWNjdW1baV0gJj0gMHhmZmZmOwotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IC8qKjwgTTRPU0FfRkFMU0UgPT0gcEMtPm1fYlJldmVydFhZICovCi0gICAgICAgICAgICAvKiogKy05MLAgcm90YXRpb24gKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdThfZGF0YV9pbl9vcmcgPSBwdThfZGF0YV9pbjsKLQotICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCByb3cgKi8KLSAgICAgICAgICAgICAgICBmb3Ioaj0wO2o8cE91dFtpXS51X2hlaWdodDtqKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBob3Jpem9udGFsIHdlaWdodCBmYWN0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3hfZnJhYyA9IChwQy0+dTMyX3hfYWNjdW1baV0+PjEyKSYxNTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBSZWluaXQgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gPSBwQy0+dTMyX3lfYWNjdW1fc3RhcnRbaV07Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoTTRPU0FfVFJVRSA9PSAgcEMtPm1fYkZsaXBYKQotICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCBwaXhlbCBpbiBhIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MDtrPHBPdXRbaV0udV93aWR0aDtrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9mcmFjID0gKHUzMl95X2FjY3VtID4+IDEyKSYxNTsgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcCA9IChwdThfZGF0YV9pbiAtIChwQy0+dTMyX3hfYWNjdW1baV0gPj4gMTYpKSAtIDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgaTMyX3RtcF9vZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChwdThfc3JjX3RvcFsxXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wWzBdKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHU4X3NyY19ib3R0b21bMV0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbVswXSp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWU9ICh1MzJfdGVtcF92YWx1ZSA+PiA3KSoweGZmOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKE00VklGSV9VSW50OCl1MzJfdGVtcF92YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB2ZXJ0aWNhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtICs9IHBDLT51MzJfeV9pbmNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodTMyX3lfYWNjdW0+PjE2KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gPSBwdThfZGF0YV9pbiArICh1MzJfeV9hY2N1bSA+PiAxNikgKiBpMzJfdG1wX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSAmPSAweGZmZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBvdXRwdXQgcGl4ZWwgaW4gYSByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcihrPTA7azxwT3V0W2ldLnVfd2lkdGg7aysrKQotICAgICAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfZnJhYyA9ICh1MzJfeV9hY2N1bSA+PiAxMikmMTU7IC8qIFZlcnRpY2FsIHdlaWdodCBmYWN0b3IgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wID0gcHU4X2RhdGFfaW4gKyAocEMtPnUzMl94X2FjY3VtW2ldID4+IDE2KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tID0gcHU4X3NyY190b3AgKyBpMzJfdG1wX29mZnNldDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWUgPSAoTTRWSUZJX1VJbnQ4KSgoKHB1OF9zcmNfdG9wWzBdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3BbMV0qdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdThfc3JjX2JvdHRvbVswXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tWzFdKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZT0gKHUzMl90ZW1wX3ZhbHVlID4+IDcpKjB4ZmY7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSAoTTRWSUZJX1VJbnQ4KXUzMl90ZW1wX3ZhbHVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHZlcnRpY2FsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gKz0gcEMtPnUzMl95X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1MzJfeV9hY2N1bT4+MTYpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiA9IHB1OF9kYXRhX2luICsgKHUzMl95X2FjY3VtID4+IDE2KSAqIGkzMl90bXBfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtICY9IDB4ZmZmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfb3V0ICs9IHBPdXRbaV0udV9zdHJpZGUgLSBwT3V0W2ldLnVfd2lkdGg7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIGhvcml6b250YWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtW2ldICs9IHBDLT51MzJfeF9pbmNbaV07Ci0KLSAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gPSBwdThfZGF0YV9pbl9vcmc7Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSAvKio8IE00T1NBX1RSVUUgPT0gcEMtPm1fYlJldmVydFhZICovCi0gICAgICAgIH0vKiogMyA9PSBpICovCi0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKjwgSW4gY2FzZSBvZiBzdHJpcGUgbW9kZSwgc2F2ZSBjdXJyZW50IGlucHV0IHBvaW50ZXIgKi8KLSAgICAgICAgaWYoTTRPU0FfVFJVRSA9PSBwQy0+bV9wYXJhbXMubV9iT3V0cHV0U3RyaXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+cHU4X2RhdGFfaW5baV0gPSBwdThfZGF0YV9pbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKjwgVXBkYXRlIG51bWJlciBvZiBwcm9jZXNzZWQgcm93cywgcmVzZXQgaXQgaWYgd2UgaGF2ZSBmaW5pc2hlZAotICAgICAgICAgd2l0aCB0aGUgd2hvbGUgcHJvY2Vzc2luZyAqLwotICAgIHBDLT5tX3Byb2NSb3dzICs9IHBPdXRbMF0udV9oZWlnaHQ7Ci0gICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYlJldmVydFhZKQotICAgIHsKLSAgICAgICAgaWYocEMtPm1fcGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA8PSBwQy0+bV9wcm9jUm93cykgICAgcEMtPm1fcHJvY1Jvd3MgPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZihwQy0+bV9wYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPD0gcEMtPm1fcHJvY1Jvd3MpICAgIHBDLT5tX3Byb2NSb3dzID0gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUiA7Ci0KLX0KLQotCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRBTVJSX0NvcmVSZWFkZXIuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRBTVJSX0NvcmVSZWFkZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjMwZjlkYy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000QU1SUl9Db3JlUmVhZGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgIE00QU1SUl9Db3JlUmVhZGVyLmMKLSAqIEBicmllZiAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiBBTVIgcGFyc2VyCi0gKiBAbm90ZSAgICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBBUEkgSW1wbGVtZW50YXRpb24gZm9yCi0gKiAgICAgICAgICAgICAgQU1SIFBhcnNlci4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaW5jbHVkZSAiTTRBTVJSX0NvcmVSZWFkZXIuaCIKLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE1heGltdW0gYml0cmF0ZSBwZXIgYW1yIHR5cGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jZGVmaW5lIE00QU1SUl9OQl9NQVhfQklUX1JBVEUgICAgMTIyMDAKLSNkZWZpbmUgTTRBTVJSX1dCX01BWF9CSVRfUkFURSAgICAyMzg1MAotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEFNUiByZWFkZXIgY29udGV4dCBJRAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNkZWZpbmUgTTRBTVJSX0NPTlRFWFRJRCAgICAweDQxNGQ1MjUyCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQW4gQU1SIGZyYW1lIGlzIDIwbXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jZGVmaW5lIE00QU1SUl9GUkFNRV9MRU5HVEggICAgIDIwCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRm9yIHRoZSBzZWVrLCB0aGUgZmlsZSBpcyBzcGxpdHRlZCBpbiA0MCBzZWdtZW50cyBmb3IgZmFzdGVyIHNlYXJjaAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNkZWZpbmUgICAgTTRBTVJSX05VTV9TRUVLX0VOVFJJRVMgNDAKLQotI2RlZmluZSBNNEFNUlJfTkJfU0FNUExFX0ZSRVFVRU5DWSA4MDAwICAgICAgICAvKio8IE5hcnJvdyBiYW5kIHNhbXBsaW5nIHJhdGUgKi8KLSNkZWZpbmUgTTRBTVJSX1dCX1NBTVBMRV9GUkVRVUVOQ1kgMTYwMDAgICAgLyoqPCBXaWRlIGJhbmQgc2FtcGxpbmcgcmF0ZSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEFNUiByZWFkZXIgdmVyc2lvbiBudW1iZXJzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotLyogQ0hBTkdFX1ZFUlNJT05fSEVSRSAqLwotI2RlZmluZSBNNEFNUlJfVkVSU0lPTl9NQUpPUiAxCi0jZGVmaW5lIE00QU1SUl9WRVJTSU9OX01JTk9SIDExCi0jZGVmaW5lIE00QU1SUl9WRVJTSU9OX1JFVklTSU9OIDMKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRfQU1SUl9Db250ZXh0Ci0gKiBAYnJpZWYgICAgICAgIEludGVybmFsIEFNUiByZWFkZXIgY29udGV4dCBzdHJ1Y3R1cmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICBtX2NvbnRleHRJZCA7ICAgICAgLyogRml4ZWQgSWQuIHRvIGNoZWNrIGZvciB2YWxpZCBDb250ZXh0Ki8KLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqICAgbV9wT3NhRmlsZVB0ckZjdDsgIC8qIEZpbGUgZnVuY3Rpb24gcG9pbnRlciAqLwotICAgIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKiBtX3BTdHJlYW1IYW5kbGVyOyAgLyogU3RyZWFtIERlc2NyaXB0aW9uICovCi0gICAgTTRPU0FfVUludDMyKiAgICAgICAgICAgIG1fcFNlZWtJbmRleDsgICAgICAvKiBTZWVrIEluZGV4IFRhYmxlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgIG1fc2Vla0ludGVydmFsOyAgICAvKiBTdG9yZXMgdGhlIHNlZWsgSW50ZXJ2YWwgc3RvcmVkIGluIHRoZSBJbmRleCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICBtX21heEF1U2l6ZTsgICAgICAgLyogU3RvcmVzIHRoZSBtYXggQXUgU2l6ZSAqLwotICAgIE00T1NBX01lbUFkZHIzMiAgICAgICAgICBtX3BkYXRhQWRkcmVzczsgICAgLyogUG9pbnRlciB0byBzdG9yZSBBVSBkYXRhICovCi0gICAgTTRTWVNfU3RyZWFtVHlwZSAgICAgICAgIG1fc3RyZWFtVHlwZTsgICAgICAvKiBTdG9yZXMgdGhlIHN0cmVhbSB0eXBlIEFNUiBOQiBvciBXQiAqLwotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgICBtX3BBTVJGaWxlOyAgICAgICAgLyogRGF0YSBzdG9yYWdlICovCi0gICAgTTRBTVJSX1N0YXRlICAgICAgICAgICAgIG1fc3RhdHVzOyAgICAgICAgICAvKiBBTVIgUmVhZGVyIFN0YXR1cyAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICBtX3N0cnVjdFNpemU7ICAgICAgLyogc2l6ZSBvZiBzdHJ1Y3R1cmUqLwotfSBNNF9BTVJSX0NvbnRleHQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUGFyc2VyIGludGVybmFsIGZ1bmN0aW9ucywgbm90IHVzYWJsZSBmcm9tIG91dHNpZGUgdGhlIHJlYWRlciBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfVUludDMyICAgIE00QU1SUl9nZXRBdVNpemUoTTRPU0FfVUludDMyIGZyYW1lVHlwZSwgIE00U1lTX1N0cmVhbVR5cGUgc3RyZWFtVHlwZSk7Ci1NNE9TQV9VSW50MzIgICAgTTRBTVJSX2dldEJpdHJhdGUoTTRPU0FfVUludDMyIGZyYW1lVHlwZSwgIE00U1lTX1N0cmVhbVR5cGUgc3RyZWFtVHlwZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfVUludDMyICAgIE00QU1SUl9nZXRBdVNpemUoTTRPU0FfVUludDMyIGZyYW1lVHlwZSwgIE00U1lTX1N0cmVhbVR5cGUgc3RyZWFtVHlwZSkKLSAqIEBicmllZiAgICBJbnRlcm5hbCBmdW5jdGlvbiB0byB0aGUgQU1SIFBhcnNlciwgcmV0dXJucyB0aGUgQVUgc2l6ZSBvZiB0aGUgRnJhbWUKLSAqIEBub3RlICAgICBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSBzdHJlYW0gdHlwZSBhbmQgdGhlIGZyYW1ldHlwZSBhbmQgcmV0dXJucyB0aGUKLSAqICAgICAgICAgICBmcmFtZSBsZW5naHQKLSAqIEBwYXJhbSAgICBmcmFtZVR5cGUoSU4pICAgIDogQU1SIGZyYW1lIHR5cGUKLSAqIEBwYXJhbSAgICBzdHJlYW1UeXBlKElOKSAgICA6IEFNUiBzdHJlYW0gdHlwZSBOQiBvciBXQgotICogQHJldHVybnMgIFRoZSBmcmFtZSBzaXplIGJhc2VkIG9uIHRoZSBmcmFtZSB0eXBlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9VSW50MzIgICAgTTRBTVJSX2dldEF1U2l6ZShNNE9TQV9VSW50MzIgZnJhbWVUeXBlLCAgTTRTWVNfU3RyZWFtVHlwZSBzdHJlYW1UeXBlKQotewotICAgIGNvbnN0IE00T1NBX1VJbnQzMiAgICBNNEFNUlJfTkJfQVVTSVpFW109ezEzLDE0LDE2LDE4LDIwLDIxLDI3LDMyLDYsNiw2fTsKLSAgICBjb25zdCBNNE9TQV9VSW50MzIgICAgTTRBTVJSX1dCX0FVU0laRVtdPXsxOCwyNCwzMywzNyw0MSw0Nyw1MSw1OSw2MSw2fTsKLQotICAgIGlmICggc3RyZWFtVHlwZSA9PSBNNFNZU19rQU1SICkKLSAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRBTVJSX05CX0FVU0laRVtmcmFtZVR5cGVdOwotICAgIH0KLSAgICBlbHNlIC8qIE00U1lTX2tBTVJfV0IgKi8KLSAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRBTVJSX1dCX0FVU0laRVtmcmFtZVR5cGVdOwotICAgIH0KLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9VSW50MzIgICAgTTRBTVJSX2dldEJpdHJhdGUoTTRPU0FfVUludDMyIGZyYW1lVHlwZSwgIE00U1lTX1N0cmVhbVR5cGUgc3RyZWFtVHlwZSkKLSAqIEBicmllZiAgICBJbnRlcm5hbCBmdW5jdGlvbiB0byB0aGUgQU1SIFBhcnNlciwgcmV0dXJucyB0aGUgQml0IHJhdGUgb2YgdGhlIEZyYW1lCi0gKiBAbm90ZSAgICAgVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgc3RyZWFtIHR5cGUgYW5kIHRoZSBmcmFtZXR5cGUgYW5kIHJldHVybnMgdGhlCi0gKiAgICAgICAgICAgYml0IHJhdGUgZm9yIHRoZSBnaXZlbiBmcmFtZS4KLSAqIEBwYXJhbSAgICBmcmFtZVR5cGUoSU4pICAgIDogQU1SIGZyYW1lIHR5cGUKLSAqIEBwYXJhbSAgICBzdHJlYW1UeXBlKElOKSAgICA6IEFNUiBzdHJlYW0gdHlwZSBOQiBvciBXQgotICogQHJldHVybnMgIFRoZSBmcmFtZSdzIGJpdCByYXRlIGJhc2VkIG9uIHRoZSBmcmFtZSB0eXBlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9VSW50MzIgICAgTTRBTVJSX2dldEJpdHJhdGUoTTRPU0FfVUludDMyIGZyYW1lVHlwZSwgIE00U1lTX1N0cmVhbVR5cGUgc3RyZWFtVHlwZSkKLXsKLSAgICBjb25zdCBNNE9TQV9VSW50MzIgICAgTTRBTVJSX05CX0JJVFJBVEVbXT0KLSAgICAgICAgezQ3NTAsNTE1MCw1OTAwLDY3MDAsNzQwMCw3OTUwLDEwMjAwLDEyMjAwLDEyMjAwLDEyMjAwLDEyMjAwfTsKLSAgICBjb25zdCBNNE9TQV9VSW50MzIgICAgTTRBTVJSX1dCX0JJVFJBVEVbXT0KLSAgICAgICAgezY2MDAsODg1MCwxMjY1MCwxNDI1MCwxNTg1MCwxODI1MCwxOTg1MCwyMzA1MCwyMzg1MCwxMjIwMH07Ci0KLSAgICBpZiAoIHN0cmVhbVR5cGUgPT0gTTRTWVNfa0FNUiApCi0gICAgewotICAgICAgICAgICAgcmV0dXJuIE00QU1SUl9OQl9CSVRSQVRFW2ZyYW1lVHlwZV07Ci0gICAgfQotICAgIGVsc2UgLyogTTRTWVNfa0FNUl9XQiAqLwotICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNEFNUlJfV0JfQklUUkFURVtmcmFtZVR5cGVdOwotICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNEFNUlJfb3BlblJlYWQoTTRPU0FfQ29udGV4dCogcENvbnRleHQsIE00T1NBX1ZvaWQqIHBGaWxlRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVGdW5jdGlvbikKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRfQU1SUl9Db250ZXh0KiAgICBwU3RyZWFtQ29udGV4dDsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gIGZpbGVQb3M7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTRFUlJfRklMRV9OT1RfRk9VTkQgOwotICAgIE00T1NBX1VJbnQzMiBzaXplIDsKLSAgICBNNE9TQV9VSW50MzIgZGF0YSA7Ci0gICAgTTRPU0FfQ2hhciAqTTRfVG9rZW47Ci0gICAgTTRPU0FfVUludDMyICp0b2tlblB0cjsKLQotICAgIC8qIEhlYWRlciBmb3IgQU1SIE5CICovCi0gICAgTTRPU0FfVUludDMyIE00X0FNUl8xICAgICAgID0gMHg0ZDQxMjEyMzsKLSAgICBNNE9TQV9VSW50MzIgTTRfQU1SX05CXzIgICAgPSAweDAwMDAwYTUyOwotCi0gICAgLyogSGVhZGVyIGZvciBBTVIgV0IgKi8KLSAgICBNNE9TQV9VSW50MzIgTTRfQU1SX1dCXzIgICAgPSAweDQyNTcyZDUyOwotICAgIE00T1NBX1VJbnQzMiBNNF9BTVJfV0JfMyAgICA9IDB4MDAwMDAwMGE7Ci0gICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTCA7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLE00RVJSX1BBUkFNRVRFUiwiQ29udGV4dCBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBGaWxlRGVzY3JpcHRvciksTTRFUlJfUEFSQU1FVEVSLCJGaWxlIERlc2MuIE00T1NBX05VTEwiKTsKLQotICAgIE00X1Rva2VuID0gKE00T1NBX0NoYXIqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRPU0FfTWVtQWRkcjMyKSozLCBNNEFNUl9SRUFERVIsCi0gICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopKCJNNF9Ub2tlbiIpKTsKLSAgICBpZihNNE9TQV9OVUxMID09IE00X1Rva2VuKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYzKChNNE9TQV9OVUxMID09IE00X1Rva2VuKSxNNEVSUl9BTExPQywiTWVtIEFsbG9jIGZhaWxlZCAtIE00X1Rva2VuIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQyA7Ci0gICAgfQotCi0gICAgcFN0cmVhbUNvbnRleHQ9IChNNF9BTVJSX0NvbnRleHQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRfQU1SUl9Db250ZXh0KSwgTTRBTVJfUkVBREVSLAotICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikoInBTdHJlYW1Db250ZXh0IikpOwotICAgIGlmKE00T1NBX05VTEwgPT0gcFN0cmVhbUNvbnRleHQpCi0gICAgewotICAgICAgICBmcmVlKE00X1Rva2VuKTsKLSAgICAgICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTCA7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQyA7Ci0gICAgfQotCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgY29udGV4dCAqLwotICAgIHBTdHJlYW1Db250ZXh0LT5tX2NvbnRleHRJZCA9IE00QU1SUl9DT05URVhUSUQ7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fc3RydWN0U2l6ZT1zaXplb2YoTTRfQU1SUl9Db250ZXh0KTsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdD1wRmlsZUZ1bmN0aW9uIDsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlciA9IE00T1NBX05VTEwgOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlID0gTTRPU0FfTlVMTCA7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fc3RhdHVzID0gTTRBTVJSX2tPcGVuaW5nIDsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wU2Vla0luZGV4ID0gTTRPU0FfTlVMTCA7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fc2Vla0ludGVydmFsID0gMDsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9tYXhBdVNpemUgPSAwIDsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIGVycj1wU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+b3BlblJlYWQoJnBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlLAotICAgICAgICAoTTRPU0FfQ2hhciopcEZpbGVEZXNjcmlwdG9yLE00T1NBX2tGaWxlUmVhZCApOwotICAgIGlmICggZXJyICE9IE00Tk9fRVJST1IgKQotICAgIHsKLSAgICAgICAgLyogTTRPU0FfREVCVUdfSUYzKChlcnIgIT0gTTROT19FUlJPUiksZXJyLCJGaWxlIG9wZW4gZmFpbGVkIik7ICovCi0gICAgICAgIGZyZWUocFN0cmVhbUNvbnRleHQpOwotICAgICAgICBmcmVlKE00X1Rva2VuKTsKLSAgICAgICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTCA7Ci0gICAgICAgIHJldHVybiBlcnIgOwotICAgIH0KLQotICAgIHBTdHJlYW1Db250ZXh0LT5tX3N0YXR1cyA9IE00QU1SUl9rT3BlbmluZyA7Ci0KLSAgICBzaXplID0gNjsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+cmVhZERhdGEocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUsCi0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00X1Rva2VuLCAmc2l6ZSk7Ci0gICAgaWYoc2l6ZSAhPSA2KQotICAgIHsKLSAgICAgICAgZ290byBjbGVhbnVwOwotICAgIH0KLQotICAgIHRva2VuUHRyID0gKE00T1NBX1VJbnQzMiopTTRfVG9rZW4gOwotICAgIC8qIENoZWNrIGZvciB0aGUgZmlyc3QgNCBieXRlcyBvZiB0aGUgaGVhZGVyIGNvbW1vbiB0byBXQiBhbmQgTkIqLwotICAgIGlmICgqdG9rZW5QdHIgIT0gTTRfQU1SXzEpCi0gICAgewotICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgfQotCi0gICAgdG9rZW5QdHIrKzsKLSAgICBkYXRhID0gKnRva2VuUHRyICYgMHgwMDAwRkZGRiA7Ci0gICAgLyogQ2hlY2sgaWYgdGhlIG5leHQgcGFydCBpcyBOYXJyb3cgYmFuZCBoZWFkZXIgKi8KLSAgICBpZiAoZGF0YSE9IE00X0FNUl9OQl8yKQotICAgIHsKLSAgICAgICAgLyogU3RyZWFtIGlzIEFNUiBXaWRlIEJhbmQgKi8KLSAgICAgICAgZmlsZVBvcyA9IDQ7Ci0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5zZWVrKHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlLAotICAgICAgICAgICAgIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZywgJmZpbGVQb3MpOwotICAgICAgICBzaXplID0gNTsKLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPnJlYWREYXRhKHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlLAotICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClNNF9Ub2tlbiwgJnNpemUpOwotICAgICAgICBpZihzaXplICE9IDUpCi0gICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgIHRva2VuUHRyPShNNE9TQV9VSW50MzIqKU00X1Rva2VuOwotICAgICAgICAvKiBDaGVjayBmb3IgdGhlIFdpZGUgYmFuZCBoYWRlciAqLwotICAgICAgICBpZigqdG9rZW5QdHIhPSBNNF9BTVJfV0JfMikKLSAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAgICAgdG9rZW5QdHIrKzsKLSAgICAgICAgZGF0YSA9ICp0b2tlblB0ciAmIDB4MDAwMDAwRkYgOwotICAgICAgICBpZihkYXRhIT0gTTRfQU1SX1dCXzMpCi0gICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUgPSBNNFNZU19rQU1SX1dCIDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogU3RyZWFtIGlzIGEgTmFycm93IGJhbmQgc3RyZWFtICovCi0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUgPSBNNFNZU19rQU1SIDsKLSAgICB9Ci0gICAgLyogIE5vIFByb2ZpbGUgbGV2ZWwgZGVmaW5lZCAqLwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3N0YXR1cyA9IE00QU1SUl9rT3BlbmVkOwotCi0gICAgZnJlZShNNF9Ub2tlbik7Ci0gICAgKnBDb250ZXh0ID0gcFN0cmVhbUNvbnRleHQgOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotCi1jbGVhbnVwOgotCi0gICAgaWYoTTRPU0FfTlVMTCAhPSBwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSkKLSAgICB7Ci0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5jbG9zZVJlYWQocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUpOwotICAgIH0KLQotICAgIGZyZWUoTTRfVG9rZW4pOwotICAgIGZyZWUocFN0cmVhbUNvbnRleHQpOwotCi0gICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTCA7Ci0KLSAgICByZXR1cm4gKE00T1NBX0VSUilNNEVSUl9BTVJfTk9UX0NPTVBMSUFOVDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00QU1SUl9nZXROZXh0U3RyZWFtKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24qIHBTdHJlYW1EZXNjICkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRfQU1SUl9Db250ZXh0KiAgICBwU3RyZWFtQ29udGV4dD0oTTRfQU1SUl9Db250ZXh0KilDb250ZXh0OwotICAgIE00T1NBX0NoYXIgICAgICAgICAgICBmcmFtZUhlYWRlciwgZnJhbWVUeXBlIDsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgIHNpemUsIGF1Q291bnQ9MDsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gIGZpbGVQb3M7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gQ29udGV4dCksTTRFUlJfUEFSQU1FVEVSLCJDb250ZXh0IE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFN0cmVhbURlc2MpLE00RVJSX1BBUkFNRVRFUiwiU3RyZWFtIERlc2MuIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKHBTdHJlYW1Db250ZXh0LT5tX2NvbnRleHRJZCAhPSBNNEFNUlJfQ09OVEVYVElEKSxNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICJCYWQgQ29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoIHBTdHJlYW1Db250ZXh0LT5tX3N0YXR1cyAhPSBNNEFNUlJfa09wZW5lZCksIE00RVJSX1NUQVRFLCAiSW52YWxpZCBTdGF0ZSIpOwotCi0gICAgaWYgKE00T1NBX05VTEwgIT0gcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXIpCi0gICAgewotICAgICAgICByZXR1cm4gTTRXQVJfTk9fTU9SRV9TVFJFQU0gOwotICAgIH0KLQotICAgIHNpemUgPSAxOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5yZWFkRGF0YShwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSwKLSAgICAgICAgIChNNE9TQV9NZW1BZGRyOCkmZnJhbWVIZWFkZXIsICZzaXplKTsKLQotICAgIC8qIFhGRkYgRlhYWCAtPiBGIGlzIHRoZSBGcmFtZSB0eXBlICovCi0gICAgZnJhbWVUeXBlID0gKCBmcmFtZUhlYWRlciAmIDB4NzggKSA+PiAzIDsKLQotICAgIGlmICggZnJhbWVUeXBlID09IDE1ICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFdBUl9OT19EQVRBX1lFVCA7Ci0gICAgfQotCi0gICAgaWYgKCggcFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSA9PSBNNFNZU19rQU1SICkgJiYgKCBmcmFtZVR5cGUgPiAxMSApKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChNNE9TQV9FUlIpTTRFUlJfQU1SX0lOVkFMSURfRlJBTUVfVFlQRTsKLSAgICB9Ci0KLSAgICBpZiAoKCBwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlID09IE00U1lTX2tBTVJfV0IgKSAmJiAoIGZyYW1lVHlwZSA+IDkgKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoTTRPU0FfRVJSKU00RVJSX0FNUl9JTlZBTElEX0ZSQU1FX1RZUEU7Ci0gICAgfQotCi0gICAgLyogQXZlcmFnZSBiaXQgcmF0ZSBpcyBhc3NpZ25lZCB0aGUgYml0cmF0ZSBvZiB0aGUgZmlyc3QgZnJhbWUgKi8KLSAgICBwU3RyZWFtRGVzYy0+YXZlcmFnZUJpdHJhdGUgPSBNNEFNUlJfZ2V0Qml0cmF0ZShmcmFtZVR5cGUscFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSk7Ci0KLSAgICBmaWxlUG9zID0gLTE7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPnNlZWsocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUsIE00T1NBX2tGaWxlU2Vla0N1cnJlbnQsCi0gICAgICAgICAmZmlsZVBvcyk7Ci0KLSAgICAvKiBJbml0aWFsaXplIHBTdHJlYW1EZXNjICovCi0gICAgcFN0cmVhbURlc2MtPnByb2ZpbGVMZXZlbCA9IDB4RkYgOwotICAgIHBTdHJlYW1EZXNjLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IDAgOwotICAgIHBTdHJlYW1EZXNjLT5kZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTCA7Ci0gICAgcFN0cmVhbURlc2MtPm1heEJpdHJhdGUgPSAocFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSA9PQotICAgICAgICBNNFNZU19rQU1SICk/TTRBTVJSX05CX01BWF9CSVRfUkFURTpNNEFNUlJfV0JfTUFYX0JJVF9SQVRFOwotICAgIHBTdHJlYW1EZXNjLT5wcm9maWxlTGV2ZWwgPSAweEZGIDsKLSAgICBwU3RyZWFtRGVzYy0+c3RyZWFtSUQgPSAxOwotICAgIHBTdHJlYW1EZXNjLT5zdHJlYW1UeXBlID0gcFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZTsKLQotICAgIC8qIFRpbWVzY2FsZSBlcXVhbHMgU2FtcGxpbmcgRnJlcXVlbmN5OiBOQi04MDAwIEh6LCBXQi0xNjAwMCBIeiAqLwotICAgIHBTdHJlYW1EZXNjLT50aW1lU2NhbGUgPSAocFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSA9PSBNNFNZU19rQU1SICk/ODAwMDoxNjAwMDsKLSAgICBwU3RyZWFtRGVzYy0+ZHVyYXRpb24gPSBNNE9TQV9USU1FX1VOS05PV047Ci0KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlciA9Ci0gICAgICAgICAoTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24qKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24pLAotICAgICAgICAgICAgIE00QU1SX1JFQURFUiwgKE00T1NBX0NoYXIgKikoInBTdHJlYW1Db250ZXh0LT5tX3BTdHJlYW1IYW5kbGVyIikpOwotICAgIGlmKE00T1NBX05VTEwgPT0gcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXIpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLyogQ29weSB0aGUgU3RyZWFtIERlc2MuIGludG8gdGhlIENvbnRleHQgKi8KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlci0+YXZlcmFnZUJpdHJhdGUgPSBwU3RyZWFtRGVzYy0+YXZlcmFnZUJpdHJhdGU7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXItPmRlY29kZXJTcGVjaWZpY0luZm8gPSBNNE9TQV9OVUxMIDsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSAwIDsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlci0+ZHVyYXRpb24gPSBNNE9TQV9USU1FX1VOS05PV047Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXItPnByb2ZpbGVMZXZlbCA9IDB4RkYgOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BTdHJlYW1IYW5kbGVyLT5zdHJlYW1JRCA9IDE7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXItPnN0cmVhbVR5cGUgPSBwU3RyZWFtRGVzYy0+c3RyZWFtVHlwZSA7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXItPnRpbWVTY2FsZSA9IHBTdHJlYW1EZXNjLT50aW1lU2NhbGUgOwotCi0gICAgLyogQ291bnQgdGhlIG51bWJlciBvZiBBY2Nlc3MgVW5pdCBpbiB0aGUgRmlsZSB0byBnZXQgdGhlICovCi0gICAgLyogZHVyYXRpb24gb2YgdGhlIHN0cmVhbSA9IDIwIG1zICogbnVtYmVyIG9mIGFjY2VzcyB1bml0ICovCi0gICAgd2hpbGUoMSkKLSAgICB7Ci0gICAgICAgIHNpemUgPSAxOwotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+cmVhZERhdGEocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUsCi0gICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KSZmcmFtZUhlYWRlciwgJnNpemUpOwotICAgICAgICBpZiAoIHNpemUgPT0gMCkKLSAgICAgICAgICAgIGJyZWFrIDsKLSAgICAgICAgZnJhbWVUeXBlID0gKGZyYW1lSGVhZGVyICYgMHg3OCkgPj4gMyA7Ci0gICAgICAgIC8qIEdldCB0aGUgZnJhbWUgc2l6ZSBhbmQgc2tpcCBzbyBtYW55IGJ5dGVzICovCi0gICAgICAgIGlmKGZyYW1lVHlwZSAhPSAxNSl7Ci0gICAgICAgICAgICAvKiBHTEEgMjAwNTA2Mjggd2hlbiBmcmFtZXR5cGUgaXMgPjEwIHdlIHJlYWQgb3ZlciBhIHRhYmxlICovCi0gICAgICAgICAgICBpZihmcmFtZVR5cGUgPiAxMCkKLSAgICAgICAgICAgICAgICBjb250aW51ZSA7Ci0KLSAgICAgICAgICAgIHNpemUgPSBNNEFNUlJfZ2V0QXVTaXplKGZyYW1lVHlwZSwgcFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICBpZihzaXplID4gcFN0cmVhbUNvbnRleHQtPm1fbWF4QXVTaXplICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9tYXhBdVNpemUgPSBzaXplIDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbGVQb3MgPSBzaXplLTE7Ci0gICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+c2VlayhwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSwKLSAgICAgICAgICAgICAgICAgTTRPU0Ffa0ZpbGVTZWVrQ3VycmVudCwgJmZpbGVQb3MpOwotICAgICAgICAgICAgYXVDb3VudCsrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogRWFjaCBGcmFtZSBpcyAyMCBtIFNlYy4gKi8KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlci0+ZHVyYXRpb24gPSBhdUNvdW50ICogTTRBTVJSX0ZSQU1FX0xFTkdUSCA7Ci0gICAgcFN0cmVhbURlc2MtPmR1cmF0aW9uID0gcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXItPmR1cmF0aW9uIDsKLQotICAgIC8qIFB1dCB0aGUgZmlsZSBwb2ludGVyIGJhY2sgYXQgdGhlIGZpcnN0IEFjY2VzcyB1bml0ICovCi0gICAgaWYoIHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUgPT0gTTRTWVNfa0FNUiApCi0gICAgewotICAgICAgICBmaWxlUG9zID0gNjsKLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPnNlZWsocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUsCi0gICAgICAgICAgICAgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nLCAmZmlsZVBvcyk7Ci0gICAgfQotICAgIGlmICggcFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSA9PSBNNFNZU19rQU1SX1dCICkKLSAgICB7Ci0gICAgICAgIGZpbGVQb3MgPSA5OwotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+c2VlayhwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSwKLSAgICAgICAgICAgICBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcsICZmaWxlUG9zKTsKLSAgICB9Ci0gICAgcmV0dXJuIE00Tk9fRVJST1IgOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00QU1SUl9zdGFydFJlYWRpbmcoTTRPU0FfQ29udGV4dCBDb250ZXh0LCBNNFNZU19TdHJlYW1JRCogcFN0cmVhbUlEcyApCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00X0FNUlJfQ29udGV4dCogcFN0cmVhbUNvbnRleHQ9KE00X0FNUlJfQ29udGV4dCopQ29udGV4dDsKLSAgICBNNE9TQV9JbnQzMiBzaXplID0gMCA7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gQ29udGV4dCksTTRFUlJfUEFSQU1FVEVSLCJDb250ZXh0IE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFN0cmVhbUlEcyksTTRFUlJfUEFSQU1FVEVSLCJTdHJlYW0gSWRzLiBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChwU3RyZWFtQ29udGV4dC0+bV9jb250ZXh0SWQgIT0gTTRBTVJSX0NPTlRFWFRJRCksTTRFUlJfQkFEX0NPTlRFWFQsCi0gICAgICAgICAiQmFkIENvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKCBwU3RyZWFtQ29udGV4dC0+bV9zdGF0dXMgIT0gTTRBTVJSX2tPcGVuZWQpLCBNNEVSUl9TVEFURSwgIkludmFsaWQgU3RhdGUiKTsKLQotICAgIHdoaWxlKCBwU3RyZWFtSURzW3NpemVdICE9IDAgKQotICAgIHsKLSAgICAgICAgaWYoIHBTdHJlYW1JRHNbc2l6ZSsrXSAhPSAxICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQgOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBkYXRhIEFkZHJlc3MgZm9yIHVzZSBpbiBOZXh0QVUoKSAqLwotICAgIGlmKE00T1NBX05VTEwgPT0gcFN0cmVhbUNvbnRleHQtPm1fcGRhdGFBZGRyZXNzKQotICAgIHsKLSAgICAgICAgc2l6ZSA9IHBTdHJlYW1Db250ZXh0LT5tX21heEF1U2l6ZSA7Ci0gICAgICAgIC8qIGRhdGFBZGRyZXNzIGlzIG93bmVkIGJ5IFBhcnNlciwgYXBwbGljYXRpb24gc2hvdWxkIG5vdCBkZWxldGUgb3IgZnJlZSBpdCAqLwotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9wZGF0YUFkZHJlc3MgPShNNE9TQV9NZW1BZGRyMzIpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemUgKyAoNCAtIHNpemUgJSA0KSwKLSAgICAgICAgICAgIE00QU1SX1JFQURFUiwgKE00T1NBX0NoYXIgKikoInBTdHJlYW1Db250ZXh0LT5tX3BkYXRhQWRkcmVzcyIpKTsKLSAgICAgICAgaWYoTTRPU0FfTlVMTCA9PSBwU3RyZWFtQ29udGV4dC0+bV9wZGF0YUFkZHJlc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9ERUJVR19JRjMoKE00T1NBX05VTEwgPT0gcFN0cmVhbUNvbnRleHQtPm1fcGRhdGFBZGRyZXNzKSxNNEVSUl9BTExPQywKLSAgICAgICAgICAgICAgICAgICAgIk1lbSBBbGxvYyBmYWlsZWQgLSBkYXRhQWRkcmVzcyIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIFNldCB0aGUgc3RhdGUgb2YgY29udGV4dCB0byBSZWFkaW5nICovCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fc3RhdHVzID0gTTRBTVJSX2tSZWFkaW5nIDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SIDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00QU1SUl9uZXh0QVUoTTRPU0FfQ29udGV4dCBDb250ZXh0LCBNNFNZU19TdHJlYW1JRCBTdHJlYW1JRCwgTTRTWVNfQWNjZXNzVW5pdCogcEF1KQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNF9BTVJSX0NvbnRleHQqIHBTdHJlYW1Db250ZXh0PShNNF9BTVJSX0NvbnRleHQqKUNvbnRleHQ7Ci0gICAgTTRPU0FfQ2hhciAgICAgICAgZnJhbWVIZWFkZXIgOwotICAgIE00T1NBX0NoYXIgICAgICAgIGZyYW1lVHlwZSA7Ci0gICAgTTRPU0FfSW50MzIgICAgICAgIGF1U2l6ZTsKLSAgICBNNE9TQV9VSW50MzIgICAgc2l6ZSA7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICBmaWxlUG9zOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IENvbnRleHQpLE00RVJSX1BBUkFNRVRFUiwiQ29udGV4dCBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBBdSksTTRFUlJfUEFSQU1FVEVSLCJBY2Nlc3MgVW5pdCAuIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKHBTdHJlYW1Db250ZXh0LT5tX2NvbnRleHRJZCAhPSBNNEFNUlJfQ09OVEVYVElEKSxNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICJCYWQgQ29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoIHBTdHJlYW1Db250ZXh0LT5tX3N0YXR1cyAhPSBNNEFNUlJfa1JlYWRpbmcpLCBNNEVSUl9TVEFURSwgIkludmFsaWQgU3RhdGUiKTsKLQotICAgIGlmICggU3RyZWFtSUQgIT0gMSApCi0gICAgewotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgfQotCi0gICAgLyogUmVhZCB0aGUgZnJhbWUgaGVhZGVyIGJ5dGUgKi8KLSAgICBzaXplID0gcFN0cmVhbUNvbnRleHQtPm1fbWF4QXVTaXplOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5yZWFkRGF0YShwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSwKLSAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwU3RyZWFtQ29udGV4dC0+bV9wZGF0YUFkZHJlc3MsICZzaXplKTsKLSAgICBpZihzaXplICE9IHBTdHJlYW1Db250ZXh0LT5tX21heEF1U2l6ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX0FVOwotICAgIH0KLQotICAgIGZyYW1lSGVhZGVyID0gKChNNE9TQV9NZW1BZGRyOClwU3RyZWFtQ29udGV4dC0+bV9wZGF0YUFkZHJlc3MpWzBdOwotCi0gICAgZnJhbWVUeXBlID0gKCBmcmFtZUhlYWRlciAmIDB4NzggKSA+PiAzIDsKLQotICAgIGlmICgoIHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUgPT0gTTRTWVNfa0FNUiApICYmCi0gICAgICAgICggZnJhbWVUeXBlID4gMTEgKSAmJiAoIGZyYW1lVHlwZSAhPSAxNSApKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChNNE9TQV9FUlIpTTRFUlJfQU1SX0lOVkFMSURfRlJBTUVfVFlQRTsKLSAgICB9Ci0KLSAgICBpZiAoKCBwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlID09IE00U1lTX2tBTVJfV0IgKSAmJgotICAgICAgICAoIGZyYW1lVHlwZSA+IDkgKSAmJiAoIGZyYW1lVHlwZSAhPSAxNSApKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChNNE9TQV9FUlIpTTRFUlJfQU1SX0lOVkFMSURfRlJBTUVfVFlQRTsKLSAgICB9Ci0KLSAgICAvKiBHZXQgdGhlIGZyYW1lIHNpemUgKi8KLSAgICBpZihmcmFtZVR5cGUgPT0gMTUpCi0gICAgewotICAgICAgICBhdVNpemUgPSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBhdVNpemUgPSBNNEFNUlJfZ2V0QXVTaXplKGZyYW1lVHlwZSwgcFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSk7Ci0gICAgfQotCi0gICAgc2l6ZSAtPSBhdVNpemUgOwotICAgIGlmKHNpemUgIT0gMCkKLSAgICB7Ci0gICAgICAgIGZpbGVQb3MgPSAtKChNNE9TQV9GaWxlUG9zaXRpb24pc2l6ZSk7Ci0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5zZWVrKHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlLAotICAgICAgICAgICAgIE00T1NBX2tGaWxlU2Vla0N1cnJlbnQsICZmaWxlUG9zKTsKLSAgICB9Ci0KLSAgICBwQXUtPnNpemUgPSBhdVNpemUgOwotCi0gICAgLyogZXZlbiB3aGVuIGZyYW1lVHlwZSA9PSAxNSAobm8gZGF0YSBmcmFtZSksIEFSTSBjb3JlIGRlY29kZXIgb3V0cHV0cyBmdWxsIFBDTSBidWZmZXIgKi8KLSAgICAvKmlmKGZyYW1lVHlwZSA9PSAxNSApCi0gICAgewotICAgICAgICBwQXUtPkNUUyArPSAwOwotICAgIH0qLwotICAgIC8qZWxzZSovCi0gICAgewotICAgICAgICBwQXUtPkNUUyArPSBNNEFNUlJfRlJBTUVfTEVOR1RIIDsKLSAgICB9Ci0KLQotICAgIHBBdS0+RFRTID0gcEF1LT5DVFMgOwotICAgIHBBdS0+YXR0cmlidXRlID0gTTRTWVNfa0ZyYWdBdHRyT2s7Ci0KLSAgICBwQXUtPnN0cmVhbSA9IHBTdHJlYW1Db250ZXh0LT5tX3BTdHJlYW1IYW5kbGVyOwotICAgIHBBdS0+ZGF0YUFkZHJlc3MgPSBwU3RyZWFtQ29udGV4dC0+bV9wZGF0YUFkZHJlc3MgOwotCi0gICAgaWYoZnJhbWVIZWFkZXIgJiAweDgwKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfQVU7Ci0gICAgfQotCi0gICAgLyogQ2hhbmdlIHRoZSBzdGF0ZSB0byBpbXBsZW1lbnQgTmV4dEF1LT5mcmVlQXUtPk5leHRBdSBGU00gKi8KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9zdGF0dXMgPSBNNEFNUlJfa1JlYWRpbmdfbmV4dEFVIDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SIDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNEFNUlJfZnJlZUFVKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQgU3RyZWFtSUQsIE00U1lTX0FjY2Vzc1VuaXQqIHBBdSkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRfQU1SUl9Db250ZXh0KiBwU3RyZWFtQ29udGV4dD0oTTRfQU1SUl9Db250ZXh0KilDb250ZXh0OwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBDb250ZXh0KSxNNEVSUl9QQVJBTUVURVIsIkNvbnRleHQgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQXUpLE00RVJSX1BBUkFNRVRFUiwiQWNjZXNzIFVuaXQgLiBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChwU3RyZWFtQ29udGV4dC0+bV9jb250ZXh0SWQgIT0gTTRBTVJSX0NPTlRFWFRJRCksTTRFUlJfQkFEX0NPTlRFWFQsCi0gICAgICAgICAiQmFkIENvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKCBwU3RyZWFtQ29udGV4dC0+bV9zdGF0dXMgIT0gTTRBTVJSX2tSZWFkaW5nX25leHRBVSksIE00RVJSX1NUQVRFLAotICAgICAgICAgIkludmFsaWQgU3RhdGUiKTsKLQotICAgIGlmICgoIFN0cmVhbUlEICE9IDEgKSAmJiAoIFN0cmVhbUlEICE9IDApKQotICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgIH0KLQotICAgIC8qIENoYW5nZSB0aGUgc3RhdGUgdG8gUmVhZGluZyBzbyBhcyB0byBhbGxvdyBhY2Nlc3MgdG8gbmV4dCBBVSAqLwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3N0YXR1cyA9IE00QU1SUl9rUmVhZGluZyA7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUiA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRBTVJSX3NlZWsoTTRPU0FfQ29udGV4dCBDb250ZXh0LCBNNFNZU19TdHJlYW1JRCogcFN0cmVhbUlELCBNNE9TQV9UaW1lIHRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfU2Vla0FjY2Vzc01vZGUgc2Vla01vZGUsIE00T1NBX1RpbWUqIHBPYnRhaW5DVFMpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00X0FNUlJfQ29udGV4dCogcFN0cmVhbUNvbnRleHQ9KE00X0FNUlJfQ29udGV4dCopQ29udGV4dDsKLSAgICBNNE9TQV9VSW50MzIgY291bnQsIHByZXZBVSwgbmV4dEFVIDsKLSAgICBNNE9TQV9VSW50MzIgc2l6ZSA7Ci0gICAgTTRPU0FfVUludDMyIGF1U2l6ZSA7Ci0gICAgTTRPU0FfVUludDMyIHBvc2l0aW9uLCBwYXJ0U2Vla1RpbWU7Ci0gICAgTTRPU0FfVUludDMyIGF1Q291bnQgPSAwLCBza2lwQXVDb3VudCA9IDAgOwotICAgIE00T1NBX0NoYXIgICAgZnJhbWVIZWFkZXIgOwotICAgIE00T1NBX0NoYXIgICAgZnJhbWVUeXBlIDsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gIGZpbGVQb3M7Ci0gICAgTTRPU0FfRG91YmxlIHRpbWVfZG91YmxlOwotCi0gICAgLypNYWtlIGV4cGxpY2l0IHRpbWUgY2FzdCwgYnV0IHRha2UgY2FyZSB0aGF0IHRpbWVzY2FsZSBpcyBub3QgdXNlZCAhISEqLwotICAgIE00T1NBX1RJTUVfVE9fTVModGltZV9kb3VibGUsIHRpbWUsIDEwMDApOwotCi0gICAgKnBPYnRhaW5DVFMgPSAwOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IENvbnRleHQpLE00RVJSX1BBUkFNRVRFUiwiQ29udGV4dCBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChwU3RyZWFtQ29udGV4dC0+bV9jb250ZXh0SWQgIT0gTTRBTVJSX0NPTlRFWFRJRCksTTRFUlJfQkFEX0NPTlRFWFQsCi0gICAgICAgICAiQmFkIENvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKCBwU3RyZWFtQ29udGV4dC0+bV9zdGF0dXMgIT0gTTRBTVJSX2tSZWFkaW5nKSAmJiBcCi0gICAgICAgICggcFN0cmVhbUNvbnRleHQtPm1fc3RhdHVzICE9IE00QU1SUl9rT3BlbmVkKSwgTTRFUlJfU1RBVEUsICJJbnZhbGlkIFN0YXRlIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKCh0aW1lX2RvdWJsZSA8IDApLE00RVJSX1BBUkFNRVRFUiwibmVnYXRpdmUgdGltZSIpOwotCi0gICAgLyogQ29taW5nIHRvIHNlZWsgZm9yIHRoZSBmaXJzdCB0aW1lLCBuZWVkIHRvIGJ1aWxkIHRoZSBzZWVrSW5kZXggVGFibGUgKi8KLSAgICBpZihNNE9TQV9OVUxMID09IHBTdHJlYW1Db250ZXh0LT5tX3BTZWVrSW5kZXgpCi0gICAgewotICAgICAgICBNNE9TQV9Eb3VibGUgZHVyYXRpb25fZG91YmxlOwotCi0gICAgICAgIGNvdW50ID0gMCA7Ci0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BTZWVrSW5kZXggPQotICAgICAgICAgICAgIChNNE9TQV9VSW50MzIqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhNNEFNUlJfTlVNX1NFRUtfRU5UUklFUyAqIHNpemVvZihNNE9TQV9VSW50MzIpLAotICAgICAgICAgICAgICAgICBNNEFNUl9SRUFERVIsIChNNE9TQV9DaGFyICopKCJwU3RyZWFtQ29udGV4dC0+bV9wU2Vla0luZGV4IikpOwotCi0gICAgICAgIGlmKE00T1NBX05VTEwgPT0gcFN0cmVhbUNvbnRleHQtPm1fcFNlZWtJbmRleCkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfREVCVUdfSUYzKChNNE9TQV9OVUxMID09IHBTdHJlYW1Db250ZXh0LT5tX3BTZWVrSW5kZXgpLE00RVJSX0FMTE9DLAotICAgICAgICAgICAgICAgICJNZW0gQWxsb2MgRmFpbGVkIC0gU2Vla0luZGV4Iik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0MgOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogcG9pbnQgdG8gdGhlIGZpcnN0IEFVICovCi0gICAgICAgIGlmKCBwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlID09IE00U1lTX2tBTVIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaWxlUG9zID0gNjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIC8qaWYgKCBwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlID09IE00U1lTX2tBTVJfV0IgKSovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbGVQb3MgPSA5OwotICAgICAgICB9Ci0KLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPnNlZWsocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUsCi0gICAgICAgICAgICAgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nLCAmZmlsZVBvcyk7Ci0KLSAgICAgICAgLyogU2V0IHRoZSBwb3N0aW9uIHRvIGJlZ2luaW5nIG9mIGZpcnN0IEFVICovCi0gICAgICAgIHBvc2l0aW9uID0gKHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUgIT0gTTRTWVNfa0FNUik/OTo2OwotCi0gICAgICAgIC8qTWFrZSBleHBsaWNpdCB0aW1lIGNhc3QsIGJ1dCB0YWtlIGNhcmUgdGhhdCB0aW1lc2NhbGUgaXMgbm90IHVzZWQgISEhKi8KLSAgICAgICAgTTRPU0FfVElNRV9UT19NUyhkdXJhdGlvbl9kb3VibGUsIHBTdHJlYW1Db250ZXh0LT5tX3BTdHJlYW1IYW5kbGVyLT5kdXJhdGlvbiwgMTAwMCk7Ci0KLSAgICAgICAgLyogQ2FsY3VsYXRlIHRoZSBzZWVrIEludGVydmFsIGR1cmF0aW9uIGJhc2VkIG9uIHRvdGFsIGR1dGF0aW9uICovCi0gICAgICAgIC8qIEludGVydmFsID0gKGR1cmF0aW9uIC8gRU5UUklFUykgaW4gbXVsdGlwbGVzIG9mIEFVIGZyYW1lIGxlbmd0aCAqLwotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9zZWVrSW50ZXJ2YWwgPQotICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKGR1cmF0aW9uX2RvdWJsZSAvIE00QU1SUl9OVU1fU0VFS19FTlRSSUVTKSA7Ci0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3NlZWtJbnRlcnZhbCAvPSBNNEFNUlJfRlJBTUVfTEVOR1RIIDsKLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fc2Vla0ludGVydmFsICo9IE00QU1SUl9GUkFNRV9MRU5HVEggOwotICAgICAgICBza2lwQXVDb3VudCA9IHBTdHJlYW1Db250ZXh0LT5tX3NlZWtJbnRlcnZhbCAvIE00QU1SUl9GUkFNRV9MRU5HVEggOwotCi0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BTZWVrSW5kZXhbY291bnQrK109cG9zaXRpb247Ci0gICAgICAgIHdoaWxlKGNvdW50IDwgTTRBTVJSX05VTV9TRUVLX0VOVFJJRVMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzaXplID0gMTsKLSAgICAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5yZWFkRGF0YShwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSwKLSAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KSZmcmFtZUhlYWRlciwgJnNpemUpOwotICAgICAgICAgICAgaWYgKCBzaXplID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnJlYWsgOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnJhbWVUeXBlID0gKGZyYW1lSGVhZGVyICYgMHg3OCkgPj4gMyA7Ci0gICAgICAgICAgICBpZihmcmFtZVR5cGUgIT0gMTUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqPCBidWdmaXggUm9uYW4gQ291c3luIDA1LzA0LzIwMDY6IEluIHRoZSBjb3JlIHJlYWRlciBBTVIsIHRoZQotICAgICAgICAgICAgICAgICAqIGZ1bmN0aW9uIE00QU1SUl9zZWVrIGRvZXNuJ3QgY2hlY2sgdGhlIGZyYW1lVHlwZSAqLwotICAgICAgICAgICAgICAgIGlmICgoIHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUgPT0gTTRTWVNfa0FNUiApICYmICggZnJhbWVUeXBlID4gMTAgKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTVJfSU5WQUxJRF9GUkFNRV9UWVBFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKCBwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlID09IE00U1lTX2tBTVJfV0IgKSAmJiAoIGZyYW1lVHlwZSA+IDkgKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTVJfSU5WQUxJRF9GUkFNRV9UWVBFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhdVNpemUgPSBNNEFNUlJfZ2V0QXVTaXplKGZyYW1lVHlwZSwgcFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICAgICAgcG9zaXRpb24gKz0gYXVTaXplIDsKLSAgICAgICAgICAgICAgICBmaWxlUG9zID0gYXVTaXplLTE7Ci0gICAgICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPnNlZWsocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUsCi0gICAgICAgICAgICAgICAgICAgICBNNE9TQV9rRmlsZVNlZWtDdXJyZW50LCAmZmlsZVBvcyk7Ci0gICAgICAgICAgICAgICAgYXVDb3VudCsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBvc2l0aW9uICsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogU2tpcCB0aGUgbnVtYmVyIG9mIEFVJ3MgYXMgcGVyIGludGVydmFsIGFuZCBzdG9yZSBpbiB0aGUgSW5kZXggdGFibGUgKi8KLSAgICAgICAgICAgIGlmICggKHNraXBBdUNvdW50ICE9IDApICYmICEoYXVDb3VudCAlIHNraXBBdUNvdW50KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9wU2Vla0luZGV4W2NvdW50KytdID0gcG9zaXRpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9LyogRW5kIG9mIEJ1aWxkaW5nIHRoZSBzZWVrIHRhYmxlICovCi0KLSAgICAvKiBVc2UgdGhlIHNlZWsgdGFibGUgdG8gc2VlayB0aGUgcmVxdWlyZWQgdGltZSBpbiB0aGUgc3RyZWFtICovCi0KLSAgICAvKiBJZiB3ZSBhcmUgc2Vla2luZyB0aGUgYmVnaW5pbmcgb2YgdGhlIGZpbGUgcG9pbnQgdG8gZmlyc3QgQVUgKi8KLSAgICBpZiAoIHNlZWtNb2RlID09IE00U1lTX2tCZWdpbm5pbmcgKQotICAgIHsKLSAgICAgICAgaWYoIHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUgPT0gTTRTWVNfa0FNUiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbGVQb3MgPSA2OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLyppZiAoIHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUgPT0gTTRTWVNfa0FNUl9XQiApKi8KLSAgICAgICAgewotICAgICAgICAgICAgZmlsZVBvcyA9IDk7Ci0gICAgICAgIH0KLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPnNlZWsocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUsCi0gICAgICAgICAgICAgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nLCAmZmlsZVBvcyApOwotICAgICAgICByZXR1cm4gTTROT19FUlJPUiA7Ci0gICAgfQotCi0gICAgLyogR2V0IHRoZSBOZWFyZXN0IFNlY29uZCAqLwotICAgIGlmICgwICE9IHBTdHJlYW1Db250ZXh0LT5tX3NlZWtJbnRlcnZhbCkKLSAgICB7Ci0gICAgICAgIHBvc2l0aW9uID0gKE00T1NBX1VJbnQzMikodGltZV9kb3VibGUgLyBwU3RyZWFtQ29udGV4dC0+bV9zZWVrSW50ZXJ2YWwpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKmF2b2lkIGRpdmlzaW9uIGJ5IDAqLwotICAgICAgICBwb3NpdGlvbiA9IDA7Ci0gICAgfQotCi0gICAgLyogV2UgaGF2ZSBvbmx5IDQwIHNlZWsgSW5kZXguICovCi0gICAgcG9zaXRpb249KHBvc2l0aW9uID49IE00QU1SUl9OVU1fU0VFS19FTlRSSUVTKT9NNEFNUlJfTlVNX1NFRUtfRU5UUklFUy0xOnBvc2l0aW9uOwotCi0gICAgLyogU2Vla0luZGV4IHdpbGwgcG9pbnQgdG8gbmVhcmVzdCBBdSwgd2UgbmVlZCB0byBzZWFyY2ggZm9yIHRoZQotICAgIHJlcXVpcmVkIHRpbWUgZm9ybSB0aGF0IHBvc2l0aW9uICovCi0gICAgcGFydFNlZWtUaW1lID0gKE00T1NBX1VJbnQzMil0aW1lX2RvdWJsZSAtIHBvc2l0aW9uICogcFN0cmVhbUNvbnRleHQtPm1fc2Vla0ludGVydmFsOwotCi0gICAgcG9zaXRpb24gPSBwU3RyZWFtQ29udGV4dC0+bV9wU2Vla0luZGV4W3Bvc2l0aW9uXTsKLQotICAgIGlmKCFwb3NpdGlvbikKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFdBUl9JTlZBTElEX1RJTUUgOwotICAgIH0KLQotICAgIC8qIHBvaW50IHRoZSBmaWxlIHBvaW50ZXIgdG8gbmVhcmVzdCBBVSAqLwotICAgIGZpbGVQb3MgPSBwb3NpdGlvbjsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+c2VlayhwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSwgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nLAotICAgICAgICAgJmZpbGVQb3MgKTsKLQotICAgIGlmICggcGFydFNlZWtUaW1lID09IDApCi0gICAgewotICAgICAgICAqcE9idGFpbkNUUyA9IHRpbWU7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgICpwT2J0YWluQ1RTID0gKE00T1NBX1RpbWUpKHRpbWVfZG91YmxlIC0gKE00T1NBX0RvdWJsZSlwYXJ0U2Vla1RpbWUpOwotCi0gICAgc3dpdGNoKHNlZWtNb2RlKQotICAgIHsKLSAgICAgICAgLyogR2V0IHRoZSBBVSBiZWZvcmUgdGhlIHRhcmdldCB0aW1lICovCi0gICAgICAgIGNhc2UgTTRTWVNfa1ByZXZpb3VzUkFQOgotICAgICAgICBjYXNlIE00U1lTX2tOb1JBUHByZXZpb3VzOgotICAgICAgICAgICAgcG9zaXRpb24gPSBwYXJ0U2Vla1RpbWUgLyBNNEFNUlJfRlJBTUVfTEVOR1RIIDsKLSAgICAgICAgICAgIGlmICggIShwYXJ0U2Vla1RpbWUgJSBNNEFNUlJfRlJBTUVfTEVOR1RIKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcG9zaXRpb24gLS0gOwotICAgICAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgICAgLyogR2V0IHRoZSBDbG9zZXN0IEFVIGZvbGxvd2luZyB0aGUgdGFyZ2V0IHRpbWUgKi8KLSAgICAgICAgY2FzZSBNNFNZU19rTmV4dFJBUDoKLSAgICAgICAgY2FzZSBNNFNZU19rTm9SQVBuZXh0OgotICAgICAgICAgICAgcG9zaXRpb24gPSAocGFydFNlZWtUaW1lICsgTTRBTVJSX0ZSQU1FX0xFTkdUSCApLyBNNEFNUlJfRlJBTUVfTEVOR1RIIDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8qICBHZXQgdGhlIGNsb3Nlc3QgQVUgdG8gdGFyZ2V0IHRpbWUgKi8KLSAgICAgICAgY2FzZSBNNFNZU19rQ2xvc2VzdFJBUDoKLSAgICAgICAgY2FzZSBNNFNZU19rTm9SQVBjbG9zZXN0OgotICAgICAgICAgICAgcHJldkFVID0gcGFydFNlZWtUaW1lLShwYXJ0U2Vla1RpbWUvTTRBTVJSX0ZSQU1FX0xFTkdUSCkqTTRBTVJSX0ZSQU1FX0xFTkdUSDsKLSAgICAgICAgICAgIG5leHRBVSA9Ci0gICAgICAgICAgICAgICAgICgocGFydFNlZWtUaW1lK000QU1SUl9GUkFNRV9MRU5HVEgpL000QU1SUl9GUkFNRV9MRU5HVEgpKk00QU1SUl9GUkFNRV9MRU5HVEggLVwKLSAgICAgICAgICAgICAgICAgICAgIHBhcnRTZWVrVGltZSA7Ci0gICAgICAgICAgICBpZihwcmV2QVUgPCBuZXh0QVUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwYXJ0U2Vla1RpbWUgLyBNNEFNUlJfRlJBTUVfTEVOR1RIIDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IChwYXJ0U2Vla1RpbWUgKyBNNEFNUlJfRlJBTUVfTEVOR1RIICkvIE00QU1SUl9GUkFNRV9MRU5HVEggOwotICAgICAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFNZU19rQmVnaW5uaW5nOgotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjb3VudCA9IDAgOwotICAgIC8qIFNraXAgdGhlIEFjY2VzcyB1bml0IGluIHRoZSBzdHJlYW0gdG8gc2tpcCB0aGUgcGFydCBzZWVrIHRpbWUsCi0gICAgICAgdG8gcmVhY2ggdGhlIHJlcXVpcmVkIHRhcmdldCB0aW1lICovCi0gICAgd2hpbGUoY291bnQgPCBwb3NpdGlvbiApCi0gICAgewotICAgICAgICBzaXplID0gMTsKLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPnJlYWREYXRhKHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlLAotICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOCkmZnJhbWVIZWFkZXIsICZzaXplKTsKLSAgICAgICAgaWYgKCBzaXplID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIElmIHRoZSB0YXJnZXQgdGltZSBpcyBpbnZhbGlkLCBwb2ludCB0byBiZWdpbmluZyBhbmQgcmV0dXJuICovCi0gICAgICAgICAgICAqcE9idGFpbkNUUyA9IDA7Ci0gICAgICAgICAgICBmaWxlUG9zID0gcFN0cmVhbUNvbnRleHQtPm1fcFNlZWtJbmRleFswXTsKLSAgICAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5zZWVrKHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlLAotICAgICAgICAgICAgICAgICBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcsICZmaWxlUG9zKTsKLSAgICAgICAgICAgIHJldHVybiBNNFdBUl9JTlZBTElEX1RJTUUgOwotICAgICAgICB9Ci0gICAgICAgICpwT2J0YWluQ1RTICs9IE00QU1SUl9GUkFNRV9MRU5HVEg7IC8qU2hvdWxkIHVzZSBNNE9TQV9JTlQ2NF9BREQgISEqLwotICAgICAgICBjb3VudCsrOwotICAgICAgICBmcmFtZVR5cGUgPSAoZnJhbWVIZWFkZXIgJiAweDc4KSA+PiAzIDsKLSAgICAgICAgaWYoZnJhbWVUeXBlID09IDE1KQotICAgICAgICB7Ci0gICAgICAgICAgICBhdVNpemUgPSAxIDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGF1U2l6ZSA9IE00QU1SUl9nZXRBdVNpemUoZnJhbWVUeXBlLCBwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbGVQb3MgPSBhdVNpemUtMTsKLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPnNlZWsocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUsCi0gICAgICAgICAgICAgTTRPU0Ffa0ZpbGVTZWVrQ3VycmVudCwgJmZpbGVQb3MpOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00QU1SUl9jbG9zZVJlYWQoTTRPU0FfQ29udGV4dCBDb250ZXh0KQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNF9BTVJSX0NvbnRleHQqIHBTdHJlYW1Db250ZXh0PShNNF9BTVJSX0NvbnRleHQqKUNvbnRleHQ7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IENvbnRleHQpLE00RVJSX1BBUkFNRVRFUiwiQ29udGV4dCBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKiBDbG9zZSB0aGUgQU1SIHN0cmVhbSAqLwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5jbG9zZVJlYWQocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUpOwotCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fc3RhdHVzPU00QU1SUl9rQ2xvc2VkIDsKLQotICAgIC8qIENoZWNrIGlmIEFVIGRhdGEgQWRkcmVzcyBpcyBhbGxvY2F0ZWQgbWVtb3J5IGFuZCBmcmVlIGl0ICovCi0gICAgaWYoTTRPU0FfTlVMTCAhPSBwU3RyZWFtQ29udGV4dC0+bV9wZGF0YUFkZHJlc3MpCi0gICAgewotICAgICAgICBmcmVlKHBTdHJlYW1Db250ZXh0LT5tX3BkYXRhQWRkcmVzcyk7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgaWYgdGhlIHN0cmVhbSBoYW5kbGVyIGlzIGFsbG9jYXRlZCBtZW1vcnkgKi8KLSAgICBpZihNNE9TQV9OVUxMICE9IHBTdHJlYW1Db250ZXh0LT5tX3BTdHJlYW1IYW5kbGVyKQotICAgIHsKLSAgICAgICAgZnJlZShwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlcik7Ci0gICAgfQotCi0gICAgLyogU2VlayB0YWJsZSBpcyBjcmVhdGVkIG9ubHkgd2hlbiBzZWVrIGlzIHVzZWQsIHNvIGNoZWNrIGlmIG1lbW9yeSBpcyBhbGxvY2F0ZWQgKi8KLSAgICBpZihNNE9TQV9OVUxMICE9IHBTdHJlYW1Db250ZXh0LT5tX3BTZWVrSW5kZXgpCi0gICAgewotICAgICAgICBmcmVlKHBTdHJlYW1Db250ZXh0LT5tX3BTZWVrSW5kZXgpOwotICAgIH0KLQotICAgIC8qIEZyZWUgdGhlIGNvbnRleHQgKi8KLSAgICBmcmVlKHBTdHJlYW1Db250ZXh0KTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SIDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNEFNUlJfZ2V0U3RhdGUoTTRPU0FfQ29udGV4dCBDb250ZXh0LCBNNEFNUlJfU3RhdGUqIHBTdGF0ZSwgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSWQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00X0FNUlJfQ29udGV4dCogcFN0cmVhbUNvbnRleHQ9KE00X0FNUlJfQ29udGV4dCopQ29udGV4dDsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gQ29udGV4dCksTTRFUlJfUEFSQU1FVEVSLCJDb250ZXh0IE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKHBTdHJlYW1Db250ZXh0LT5tX2NvbnRleHRJZCAhPSBNNEFNUlJfQ09OVEVYVElEKSxNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICJCYWQgQ29udGV4dCIpOwotCi0gICAgaWYgKCggc3RyZWFtSWQgIT0gMSApICYmICggc3RyZWFtSWQgIT0gMCkpCi0gICAgewotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgfQotCi0gICAgKnBTdGF0ZSA9IHBTdHJlYW1Db250ZXh0LT5tX3N0YXR1cyA7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUiA7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNEFNUlJfZ2V0VmVyc2lvbiAgICAoTTRfVmVyc2lvbkluZm8gKnBWZXJzaW9uKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9UUkFDRTFfMSgiTTRBTVJSX2dldFZlcnNpb24gY2FsbGVkIHdpdGggcFZlcnNpb246IDB4JXhcbiIsIHBWZXJzaW9uKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKChNNE9TQV9VSW50MzIpIHBWZXJzaW9uID09IDApLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJwVmVyc2lvbiBpcyBOVUxMIGluIE00QU1SUl9nZXRWZXJzaW9uIik7Ci0KLSAgICBwVmVyc2lvbi0+bV9tYWpvciA9IE00QU1SUl9WRVJTSU9OX01BSk9SOwotICAgIHBWZXJzaW9uLT5tX21pbm9yID0gTTRBTVJSX1ZFUlNJT05fTUlOT1I7Ci0gICAgcFZlcnNpb24tPm1fcmV2aXNpb24gPSBNNEFNUlJfVkVSU0lPTl9SRVZJU0lPTjsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00QU1SUl9nZXRtYXhBVXNpemUoTTRPU0FfQ29udGV4dCBDb250ZXh0LCBNNE9TQV9VSW50MzIgKnBNYXhBdVNpemUpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00X0FNUlJfQ29udGV4dCogcFN0cmVhbUNvbnRleHQ9KE00X0FNUlJfQ29udGV4dCopQ29udGV4dDsKLQotICAgIC8qKgotICAgICAqIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gQ29udGV4dCksICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgIk00QU1SUl9nZXRtYXhBVXNpemU6IENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwTWF4QXVTaXplKSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgIk00QU1SUl9nZXRtYXhBVXNpemU6IHBNYXhBdVNpemUgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgKnBNYXhBdVNpemUgPSBwU3RyZWFtQ29udGV4dC0+bV9tYXhBdVNpemU7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNENoYW5uZWxDb252ZXJ0ZXIuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRDaGFubmVsQ29udmVydGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZjYTU1NTAuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNENoYW5uZWxDb252ZXJ0ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNENoYW5uZWxDb3ZlcnRlci5jCi0gKiBAYnJpZWYKLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotdm9pZCBNb25vVG8ySV8xNiggY29uc3Qgc2hvcnQgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBuKQotewotICAgIHNob3J0IGlpOwotICAgIHNyYyArPSBuLTE7Ci0gICAgZHN0ICs9IChuKjIpLTE7Ci0KLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSl7Ci0gICAgICAgICpkc3QtLSA9ICpzcmM7Ci0gICAgICAgICpkc3QtLSA9ICpzcmMtLTsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci0KLXZvaWQgRnJvbTJpVG9Nb25vXzE2KCBjb25zdCBzaG9ydCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgbikKLXsKLSAgICBzaG9ydCBpaTsKLSAgICBsb25nIFRlbXA7Ci0gICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pewotICAgICAgICBUZW1wID0gKGxvbmcpKihzcmMrKyk7Ci0gICAgICAgIFRlbXAgKz0gKGxvbmcpKihzcmMrKyk7Ci0gICAgICAgICooZHN0KyspID0gKHNob3J0KShUZW1wID4+MSk7Ci0gICAgfQotCi0gICAgcmV0dXJuOwotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000REVDT0RFUl9OdWxsLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000REVDT0RFUl9OdWxsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEwZGFkMzAuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNERFQ09ERVJfTnVsbC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDM2ICswLDAgQEAKLS8qDQotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QNCi0gKg0KLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotLyoqDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBmaWxlICAgIE00REVDT0RFUl9OdWxsLmMNCi0gKiBAYnJpZWYgICBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgTnVsbCBkZWNvZGVyIHB1YmxpYyBpbnRlcmZhY2UNCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBhICJudWxsIiB2aWRlbyBkZWNvZGVyLCBpLmUuIGEgZGVjb2Rlcg0KLSAqICAgICAgICAgIHRoYXQgZG9lcyBub3RoaW5nDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSovDQotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCINCi0NCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCINCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCINCi0jaW5jbHVkZSAiTTRUT09MX1ZlcnNpb25JbmZvLmgiDQotI2luY2x1ZGUgIk00REFfVHlwZXMuaCINCi0jaW5jbHVkZSAiTTRERUNPREVSX0NvbW1vbi5oIg0KLSNpbmNsdWRlICJNNERFQ09ERVJfTnVsbC5oIg0KLQ0KLS8qKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBOVUxMIFZpZGVvIERlY29kZXIgdmVyc2lvbiBpbmZvcm1hdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qLw0KLS8qIENIQU5HRV9WRVJTSU9OX0hFUkUgKi8NCi0jZGVmaW5lIE00REVDT0RFUl9OVUxMX01BSk9SICAgIDENCi0jZGVmaW5lIE00REVDT0RFUl9OVUxMX01JTk9SICAgIDANCi0jZGVmaW5lIE00REVDT0RFUl9OVUxMX1JFVklTSU9OIDANCi0NCi0vKioNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogc3RydWN0dXJlICAgIE00X1ZpZGVvSGFuZGxlcl9Db250ZXh0DQotICogQGJyaWVmICAgICAgIERlZmluZXMgdGhlIGludGVybmFsIGNvbnRleHQgb2YgYSB2aWRlbyBkZWNvZGVyIGluc3RhbmNlDQotICogQG5vdGUgICAgICAgIFRoZSBjb250ZXh0IGlzIGFsbG9jYXRlZCBhbmQgZnJlZWQgYnkgdGhlIHZpZGVvIGRlY29kZXINCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICBtX3BMaWJyYXJ5OyAgICAgICAgICAgIC8vIENvcmUgbGlicmFyeSBpZGVudGlmaWVyDQotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICBtX0RlY29kZXJJZDsgICAgICAgICAgIC8vIENvcmUgZGVjb2RlciBpZGVudGlmaWVyDQotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICBtX1JlbmRlcmVySWQ7ICAgICAgICAgIC8vIENvcmUgcmVuZGVyZXIgaWRlbnRpZmllcg0KLSAgICBNNF9WaWRlb1N0cmVhbUhhbmRsZXIqICAgbV9wVmlkZW9TdHJlYW1oYW5kbGVyOyAvLyBWaWRlbyBzdHJlYW0gZGVzY3JpcHRpb24NCi0gICAgTTRfQWNjZXNzVW5pdCogICAgICAgICAgIG1fcE5leHRBY2Nlc3NVbml0VG9EZWNvZGU7IC8vIEFjY2VzcyB1bml0IHVzZWQgdG8NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlYWQgYW5kIGRlY29kZSBvbmUgZnJhbWUNCi0gICAgdm9pZCogICAgICAgICAgICAgICAgICAgIG1fcFVzZXJEYXRhOyAgICAgICAgICAgLy8gUG9pbnRlciB0byBhbnkgdXNlciBkYXRhDQotICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UqICBtX3BSZWFkZXI7ICAgICAgICAgICAgIC8vIFJlYWRlciBkYXRhIGludGVyZmFjZQ0KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgbV9iRG9SZW5kZXJpbmc7ICAgICAgICAvLyBEZWNpZGVzIGlmIHJlbmRlciByZXF1aXJlZA0KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgbV9zdHJ1Y3RTaXplOyAgICAgICAgICAvLyBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUNCi0NCi0gICAgTTRERUNPREVSX091dHB1dEZpbHRlciogbV9wVmlkZW9GaWx0ZXI7ICAgICAgICAgLy8gQ29sb3IgY29udmVyc2lvbiBmaWx0ZXINCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgICAgICAgKnBEZWNZdXZEYXRhOyAgICAgICAgICAgLy8gUG9pbnRlciB0byBZdXYgZGF0YSBwbGFuZQ0KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAgICAgICAqcERlY1l1dldpdGhFZmZlY3Q7ICAgICAvLyBQb2ludGVyIHRvIFl1diBwbGFuZSB3aXRoIGNvbG9yIGVmZmVjdA0KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgYll1dldpdGhFZmZlY3RTZXQ7ICAgICAvLyBPcmlnaW5hbCBZdXYgZGF0YSBPUiBZdXYgd2l0aCBjb2xvciBlZmZlY3QNCi0NCi19IE00X1ZpZGVvSGFuZGxlcl9Db250ZXh0Ow0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKioqKioqKioqKioqKiogTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKiovDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLS8qKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAYnJpZWYgICBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBkZWNvZGVyDQotICogQG5vdGUgICAgQWxsb2NhdGVzIHRoZSBjb250ZXh0DQotICoNCi0gKiBAcGFyYW0gICBwQ29udGV4dDogICAgICAgKE9VVCkgICBDb250ZXh0IG9mIHRoZSBkZWNvZGVyDQotICogQHBhcmFtICAgcFN0cmVhbUhhbmRsZXI6IChJTikgICAgUG9pbnRlciB0byBhIHZpZGVvIHN0cmVhbSBkZXNjcmlwdGlvbg0KLSAqIEBwYXJhbSAgIHBTcmNJbnRlcmZhY2U6ICAoSU4pICAgIFBvaW50ZXIgdG8gdGhlIE00UkVBREVSX0RhdGFJbnRlcmZhY2UNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgdGhhdCBtdXN0IGJlIHVzZWQgYnkgdGhlDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlciB0byByZWFkIGRhdGEgZnJvbSB0aGUgc3RyZWFtDQotICogQHBhcmFtICAgcEFjY2Vzc1VuaXQgICAgIChJTikgICAgUG9pbnRlciB0byBhbiBhY2Nlc3MgdW5pdA0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlcikgd2hlcmUgZGVjb2RlZCBkYXRhDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIHN0b3JlZA0KLSAqDQotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgVGhlcmUgaXMgbm8gZXJyb3INCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgICAgICBTdGF0ZSBhdXRvbWF0b24gaXMgbm90IGFwcGxpZWQNCi0gKiBAcmV0dXJuICBNNEVSUl9BTExPQyAgICAgICAgICAgICBBIG1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQNCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBBdCBsZWFzdCBvbmUgaW5wdXQgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXINCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKi8NCi1NNE9TQV9FUlIgTTRERUNPREVSX05VTExfY3JlYXRlKE00T1NBX0NvbnRleHQgKnBDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKnBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKnBSZWFkZXJEYXRhSW50ZXJmYWNlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfQWNjZXNzVW5pdCogcEFjY2Vzc1VuaXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwVXNlckRhdGEpIHsNCi0NCi0gICAgTTRfVmlkZW9IYW5kbGVyX0NvbnRleHQqIHBTdHJlYW1Db250ZXh0ID0gTTRPU0FfTlVMTDsNCi0NCi0gICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTDsNCi0gICAgcFN0cmVhbUNvbnRleHQgPSAoTTRfVmlkZW9IYW5kbGVyX0NvbnRleHQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyAoDQotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE00X1ZpZGVvSGFuZGxlcl9Db250ZXh0KSwgTTRERUNPREVSX01QRUc0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk00X1ZpZGVvSGFuZGxlcl9Db250ZXh0Iik7DQotICAgIGlmIChwU3RyZWFtQ29udGV4dCA9PSAwKSB7DQotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7DQotICAgIH0NCi0NCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fc3RydWN0U2l6ZSA9IHNpemVvZihNNF9WaWRlb0hhbmRsZXJfQ29udGV4dCk7DQotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BOZXh0QWNjZXNzVW5pdFRvRGVjb2RlID0gTTRPU0FfTlVMTDsNCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fcExpYnJhcnkgICAgICAgICAgICAgID0gTTRPU0FfTlVMTDsNCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlciAgID0gTTRPU0FfTlVMTDsNCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fRGVjb2RlcklkICAgICAgICAgICAgID0gLTE7DQotICAgIHBTdHJlYW1Db250ZXh0LT5tX1JlbmRlcmVySWQgICAgICAgICAgICA9IC0xOw0KLQ0KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wVXNlckRhdGEgPSBNNE9TQV9OVUxMOw0KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9iRG9SZW5kZXJpbmcgPSBNNE9TQV9UUlVFOw0KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wVmlkZW9GaWx0ZXIgPSBNNE9TQV9OVUxMOw0KLSAgICBwU3RyZWFtQ29udGV4dC0+Yll1dldpdGhFZmZlY3RTZXQgPSBNNE9TQV9GQUxTRTsNCi0NCi0gICAgKnBDb250ZXh0PXBTdHJlYW1Db250ZXh0Ow0KLSAgICByZXR1cm4gTTROT19FUlJPUjsNCi19DQotDQotLyoqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBicmllZiAgIERlc3Ryb3kgdGhlIGluc3RhbmNlIG9mIHRoZSBkZWNvZGVyDQotICogQG5vdGUgICAgQWZ0ZXIgdGhpcyBjYWxsIHRoZSBjb250ZXh0IGlzIGludmFsaWQNCi0gKg0KLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgZGVjb2Rlcg0KLSAqDQotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICBUaGVyZSBpcyBubyBlcnJvcg0KLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgVGhlIGNvbnRleHQgaXMgaW52YWxpZA0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qLw0KLU00T1NBX0VSUiBNNERFQ09ERVJfTlVMTF9kZXN0cm95KE00T1NBX0NvbnRleHQgcENvbnRleHQpIHsNCi0NCi0gICAgTTRfVmlkZW9IYW5kbGVyX0NvbnRleHQqIHBTdHJlYW1Db250ZXh0ID0gKE00X1ZpZGVvSGFuZGxlcl9Db250ZXh0KilwQ29udGV4dDsNCi0NCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBTdHJlYW1Db250ZXh0KSwNCi0gICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00REVDT0RFUl9OVUxMX2Rlc3Ryb3k6IGludmFsaWQgY29udGV4dCBwb2ludGVyIik7DQotDQotICAgIGZyZWUocFN0cmVhbUNvbnRleHQpOw0KLQ0KLSAgICByZXR1cm4gTTROT19FUlJPUjsNCi19DQotDQotLyoqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBicmllZiAgIEdldCBhbiBvcHRpb24gdmFsdWUgZnJvbSB0aGUgZGVjb2Rlcg0KLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRoZSBjYWxsZXIgdG8gcmV0cmlldmUgYSBwcm9wZXJ0eSB2YWx1ZToNCi0gKg0KLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgIChJTikgICAgICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXINCi0gKiBAcGFyYW0gICBvcHRpb25JZDogICAoSU4pICAgICAgICBJbmRpY2F0ZXMgdGhlIG9wdGlvbiB0byBnZXQNCi0gKiBAcGFyYW0gICBwVmFsdWU6ICAgICAoSU4vT1VUKSAgICBQb2ludGVyIHRvIHN0cnVjdHVyZSBvciB2YWx1ZSB3aGVyZQ0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiBpcyBzdG9yZWQNCi0gKg0KLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgIFRoZXJlIGlzIG5vIGVycm9yDQotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgVGhlIGNvbnRleHQgaXMgaW52YWxpZCAoaW4gREVCVUcgb25seSkNCi0gKiBAcmV0dXJuICBNNEVSUl9CQURfT1BUSU9OX0lEICAgICBXaGVuIHRoZSBvcHRpb24gSUQgaXMgbm90IGEgdmFsaWQgb25lDQotICogQHJldHVybiAgTTRFUlJfU1RBVEUgICAgICAgICAgICAgU3RhdGUgYXV0b21hdG9uIGlzIG5vdCBhcHBsaWVkDQotICogQHJldHVybiAgTTRFUlJfTk9UX0lNUExFTUVOVEVEICAgRnVuY3Rpb24gbm90IGltcGxlbWVudGVkDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSovDQotTTRPU0FfRVJSIE00REVDT0RFUl9OVUxMX2dldE9wdGlvbihNNE9TQV9Db250ZXh0IGNvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gIHBWYWx1ZSkgew0KLQ0KLSAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOw0KLX0NCi0NCi0vKioNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGJyaWVmICAgU2V0IGFuIG9wdGlvbiB2YWx1ZSBvZiB0aGUgZGVjb2Rlcg0KLSAqIEBub3RlICAgIEFsbG93cyB0aGUgY2FsbGVyIHRvIHNldCBhIHByb3BlcnR5IHZhbHVlOg0KLSAqDQotICogQHBhcmFtICAgY29udGV4dDogICAgKElOKSAgICAgICAgQ29udGV4dCBvZiB0aGUgZGVjb2Rlcg0KLSAqIEBwYXJhbSAgIG9wdGlvbklkOiAgIChJTikgICAgICAgIElkZW50aWZpZXIgaW5kaWNhdGluZyB0aGUgb3B0aW9uIHRvIHNldA0KLSAqIEBwYXJhbSAgIHBWYWx1ZTogICAgIChJTikgICAgICAgIFBvaW50ZXIgdG8gc3RydWN0dXJlIG9yIHZhbHVlDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3B0aW9uIGlzIHN0b3JlZA0KLSAqDQotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgVGhlcmUgaXMgbm8gZXJyb3INCi0gKiBAcmV0dXJuICBNNEVSUl9CQURfT1BUSU9OX0lEICAgICBUaGUgb3B0aW9uIElEIGlzIG5vdCBhIHZhbGlkIG9uZQ0KLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFICAgICAgICAgICAgIFN0YXRlIGF1dG9tYXRvbiBpcyBub3QgYXBwbGllZA0KLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIFRoZSBvcHRpb24gcGFyYW1ldGVyIGlzIGludmFsaWQNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKi8NCi1NNE9TQV9FUlIgTTRERUNPREVSX05VTExfc2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX09wdGlvbklEIG9wdGlvbklkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBwVmFsdWUpIHsNCi0NCi0gICAgTTRERUNPREVSX091dHB1dEZpbHRlciAqcEZpbHRlck9wdGlvbjsNCi0NCi0gICAgTTRfVmlkZW9IYW5kbGVyX0NvbnRleHQgKnBTdHJlYW1Db250ZXh0ID0NCi0gICAgICAgIChNNF9WaWRlb0hhbmRsZXJfQ29udGV4dCopY29udGV4dDsNCi0NCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7DQotICAgIE00T1NBX1VJbnQzMiBoZWlnaHQgPSAwOw0KLSAgICBNNE9TQV9VSW50OCAqcF9zcmMsKnBfZGVzOw0KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSogcFRlbXBEZWNZdXZEYXRhID0gTTRPU0FfTlVMTDsNCi0NCi0gICAgc3dpdGNoIChvcHRpb25JZCkgew0KLSAgICAgICAgY2FzZSBNNERFQ09ERVJfa09wdGlvbklEX0RlY1l1dkRhdGE6DQotICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZEYXRhID0gKE00VklGSV9JbWFnZVBsYW5lICopcFZhbHVlOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgY2FzZSBNNERFQ09ERVJfa09wdGlvbklEX1l1dldpdGhFZmZlY3RDb250aWd1b3VzOg0KLSAgICAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdCA9IChNNFZJRklfSW1hZ2VQbGFuZSAqKXBWYWx1ZTsNCi0gICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgIGNhc2UgTTRERUNPREVSX2tPcHRpb25JRF9FbmFibGVZdXZXaXRoRWZmZWN0Og0KLSAgICAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5iWXV2V2l0aEVmZmVjdFNldCA9IChNNE9TQV9Cb29sKXBWYWx1ZTsNCi0gICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgIGNhc2UgTTRERUNPREVSX2tPcHRpb25JRF9ZdXZXaXRoRWZmZWN0Tm9uQ29udGlndW91czoNCi0gICAgICAgICAgICBwVGVtcERlY1l1dkRhdGEgPSAgKE00VklGSV9JbWFnZVBsYW5lICopcFZhbHVlOw0KLQ0KLSAgICAgICAgICAgIHBfZGVzID0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzBdLnBhY19kYXRhICsNCi0gICAgICAgICAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFswXS51X3RvcGxlZnQ7DQotICAgICAgICAgICAgcF9zcmMgPSBwVGVtcERlY1l1dkRhdGFbMF0ucGFjX2RhdGEgKw0KLSAgICAgICAgICAgICAgICAgcFRlbXBEZWNZdXZEYXRhWzBdLnVfdG9wbGVmdDsNCi0NCi0gICAgICAgICAgICBmb3IgKGhlaWdodCA9IDA7IGhlaWdodDxwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMF0udV9oZWlnaHQ7DQotICAgICAgICAgICAgIGhlaWdodCsrKSB7DQotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzLCAodm9pZCAqKXBfc3JjLA0KLSAgICAgICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzBdLnVfd2lkdGgpOw0KLQ0KLSAgICAgICAgICAgICAgICBwX2RlcyArPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMF0udV9zdHJpZGU7DQotICAgICAgICAgICAgICAgIHBfc3JjICs9IHBUZW1wRGVjWXV2RGF0YVswXS51X3N0cmlkZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcF9kZXMgPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMV0ucGFjX2RhdGEgKw0KLSAgICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMV0udV90b3BsZWZ0Ow0KLSAgICAgICAgICAgIHBfc3JjID0gcFRlbXBEZWNZdXZEYXRhWzFdLnBhY19kYXRhICsNCi0gICAgICAgICAgICAgcFRlbXBEZWNZdXZEYXRhWzFdLnVfdG9wbGVmdDsNCi0NCi0gICAgICAgICAgICBmb3IgKGhlaWdodCA9IDA7IGhlaWdodDxwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMV0udV9oZWlnaHQ7DQotICAgICAgICAgICAgIGhlaWdodCsrKSB7DQotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzLCAodm9pZCAqKXBfc3JjLA0KLSAgICAgICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzFdLnVfd2lkdGgpOw0KLQ0KLSAgICAgICAgICAgICAgICBwX2RlcyArPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMV0udV9zdHJpZGU7DQotICAgICAgICAgICAgICAgIHBfc3JjICs9IHBUZW1wRGVjWXV2RGF0YVsxXS51X3N0cmlkZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcF9kZXMgPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMl0ucGFjX2RhdGEgKw0KLSAgICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMl0udV90b3BsZWZ0Ow0KLSAgICAgICAgICAgIHBfc3JjID0gcFRlbXBEZWNZdXZEYXRhWzJdLnBhY19kYXRhICsNCi0gICAgICAgICAgICAgcFRlbXBEZWNZdXZEYXRhWzJdLnVfdG9wbGVmdDsNCi0NCi0gICAgICAgICAgICBmb3IgKGhlaWdodCA9IDA7IGhlaWdodDxwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMl0udV9oZWlnaHQ7DQotICAgICAgICAgICAgIGhlaWdodCsrKSB7DQotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzLCAodm9pZCAqKXBfc3JjLA0KLSAgICAgICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzJdLnVfd2lkdGgpOw0KLQ0KLSAgICAgICAgICAgICAgICBwX2RlcyArPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMl0udV9zdHJpZGU7DQotICAgICAgICAgICAgICAgIHBfc3JjICs9IHBUZW1wRGVjWXV2RGF0YVsyXS51X3N0cmlkZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICBjYXNlIE00REVDT0RFUl9rT3B0aW9uSURfT3V0cHV0RmlsdGVyOg0KLSAgICAgICAgICAgIHBGaWx0ZXJPcHRpb24gPSAoTTRERUNPREVSX091dHB1dEZpbHRlciopcFZhbHVlOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgY2FzZSBNNERFQ09ERVJfa09wdGlvbklEX0RlYmxvY2tpbmdGaWx0ZXI6DQotICAgICAgICAgICAgZXJyID0gTTRFUlJfQkFEX09QVElPTl9JRDsNCi0gICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgZXJyID0gTTRFUlJfQkFEX09QVElPTl9JRDsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICByZXR1cm4gZXJyOw0KLX0NCi0NCi0vKioNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGJyaWVmICAgRGVjb2RlIHZpZGVvIEFjY2VzcyBVbml0cyB1cCB0byBhIHRhcmdldCB0aW1lDQotICogQG5vdGUgICAgUGFyc2UgYW5kIGRlY29kZSB0aGUgdmlkZW8gdW50aWwgaXQgY2FuIG91dHB1dCBhIGRlY29kZWQgaW1hZ2UNCi0gKiAgICAgICAgICBmb3Igd2hpY2ggdGhlIGNvbXBvc2l0aW9uIHRpbWUgaXMgZXF1YWwgb3IgZ3JlYXRlciB0byB0aGUNCi0gKiAgICAgICAgICBwYXNzZWQgdGFyZ2V0ZWQgdGltZS4NCi0gKiAgICAgICAgICBUaGUgZGF0YSBhcmUgcmVhZCBmcm9tIHRoZSByZWFkZXIgZGF0YSBpbnRlcmZhY2UgcGFzc2VkIHRvDQotICogICAgICAgICAgTTRERUNPREVSX01QRUc0X2NyZWF0ZS4NCi0gKg0KLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgIChJTikgICAgICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXINCi0gKiBAcGFyYW0gICBwVGltZTogICAgICAoSU4vT1VUKSAgICBJTjogVGltZSB0byBkZWNvZGUgdXAgdG8gKGluIG1zZWMpDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOlRpbWUgb2YgdGhlIGxhc3QgZGVjb2RlZCBmcmFtZSAoaW4gbXNlYykNCi0gKiBAcGFyYW0gICBiSnVtcDogICAgICAoSU4pICAgICAgICAwIGlmIG5vIGp1bXAgb2NjdXJlZCBqdXN0IGJlZm9yZSB0aGlzIGNhbGwNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIGlmIGEgYSBqdW1wIGhhcyBqdXN0IGJlZW4gbWFkZQ0KLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yDQotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0DQotICogQHJldHVybiAgTTRXQVJfTk9fTU9SRV9BVSAgICAgICAgdGhlcmUgaXMgbm8gbW9yZSBhY2Nlc3MgdW5pdCB0byBkZWNvZGUgKEVPUykNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKi8NCi1NNE9TQV9FUlIgTTRERUNPREVSX05VTExfZGVjb2RlKE00T1NBX0NvbnRleHQgY29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X01lZGlhVGltZSogcFRpbWUsIE00T1NBX0Jvb2wgYkp1bXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0b2xlcmFuY2UpIHsKLQ0KLSAgICAvLyBEbyBub3RoaW5nOyBpbnB1dCB0aW1lIHN0YW1wIGl0c2VsZiByZXR1cm5lZA0KLSAgICByZXR1cm4gTTROT19FUlJPUjsNCi19DQotDQotLyoqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBicmllZiAgIFJlbmRlcnMgdGhlIHZpZGVvIGF0IHRoZSBzcGVjaWZpZWQgdGltZS4NCi0gKiBAbm90ZQ0KLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgICAoSU4pICAgICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXINCi0gKiBAcGFyYW0gICBwVGltZTogICAgICAgKElOL09VVCkgICBJTjogVGltZSB0byByZW5kZXIgdG8gKGluIG1zZWNzKQ0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVDpUaW1lIG9mIHRoZSByZW5kZXJlZCBmcmFtZSAoaW4gbXMpDQotICogQHBhcmFtICAgcE91dHB1dFBsYW5lOihPVVQpICAgICAgT3V0cHV0IHBsYW5lIGZpbGxlZCB3aXRoIGRlY29kZWQgZGF0YQ0KLSAqIEBwYXJhbSAgIGJGb3JjZVJlbmRlcjooSU4pICAgICAgIDEgaWYgdGhlIGltYWdlIG11c3QgYmUgcmVuZGVyZWQgZXZlbiBpdA0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcyBiZWVuIHJlbmRlcmVkIGFscmVhZHkNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIGlmIG5vdA0KLSAqDQotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgVGhlcmUgaXMgbm8gZXJyb3INCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQNCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgICAgICBTdGF0ZSBhdXRvbWF0b24gaXMgbm90IGFwcGxpZWQNCi0gKiBAcmV0dXJuICBNNEVSUl9BTExPQyAgICAgICAgICAgICBUaGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkNCi0gKiBAcmV0dXJuICBNNFdBUl9WSURFT1JFTkRFUkVSX05PX05FV19GUkFNRSAgICBJZiB0aGUgZnJhbWUgaGFzIGFscmVhZHkgYmVlbiByZW5kZXJlZA0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qLw0KLU00T1NBX0VSUiBNNERFQ09ERVJfTlVMTF9yZW5kZXIoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNF9NZWRpYVRpbWUqIHBUaW1lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBPdXRwdXRQbGFuZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0Jvb2wgYkZvcmNlUmVuZGVyKSB7DQotDQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOw0KLSAgICBNNE9TQV9VSW50MzIgaGVpZ2h0Ow0KLSAgICBNNE9TQV9VSW50OCAqcF9zcmMsKnBfZGVzOw0KLSAgICBNNF9WaWRlb0hhbmRsZXJfQ29udGV4dCogICAgcFN0cmVhbUNvbnRleHQgPQ0KLSAgICAgICAgKE00X1ZpZGVvSGFuZGxlcl9Db250ZXh0Kiljb250ZXh0Ow0KLQ0KLSAgICBpZiAocFN0cmVhbUNvbnRleHQtPmJZdXZXaXRoRWZmZWN0U2V0ID09IE00T1NBX1RSVUUpIHsNCi0NCi0gICAgICAgIHBfZGVzID0gcE91dHB1dFBsYW5lWzBdLnBhY19kYXRhICsgcE91dHB1dFBsYW5lWzBdLnVfdG9wbGVmdDsNCi0gICAgICAgIHBfc3JjID0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzBdLnBhY19kYXRhICsNCi0gICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMF0udV90b3BsZWZ0Ow0KLQ0KLSAgICAgICAgZm9yIChoZWlnaHQgPSAwOyBoZWlnaHQ8cE91dHB1dFBsYW5lWzBdLnVfaGVpZ2h0OyBoZWlnaHQrKykgew0KLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzLCAodm9pZCAqKXBfc3JjLCBwT3V0cHV0UGxhbmVbMF0udV93aWR0aCk7DQotICAgICAgICAgICAgcF9kZXMgKz0gcE91dHB1dFBsYW5lWzBdLnVfc3RyaWRlOw0KLSAgICAgICAgICAgIHBfc3JjICs9IHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFswXS51X3N0cmlkZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHBfZGVzID0gcE91dHB1dFBsYW5lWzFdLnBhY19kYXRhICsgcE91dHB1dFBsYW5lWzFdLnVfdG9wbGVmdDsNCi0gICAgICAgIHBfc3JjID0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzFdLnBhY19kYXRhICsNCi0gICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMV0udV90b3BsZWZ0Ow0KLQ0KLSAgICAgICAgZm9yIChoZWlnaHQgPSAwOyBoZWlnaHQ8cE91dHB1dFBsYW5lWzFdLnVfaGVpZ2h0OyBoZWlnaHQrKykgew0KLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzLCAodm9pZCAqKXBfc3JjLCBwT3V0cHV0UGxhbmVbMV0udV93aWR0aCk7DQotICAgICAgICAgICAgcF9kZXMgKz0gcE91dHB1dFBsYW5lWzFdLnVfc3RyaWRlOw0KLSAgICAgICAgICAgIHBfc3JjICs9IHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFsxXS51X3N0cmlkZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHBfZGVzID0gcE91dHB1dFBsYW5lWzJdLnBhY19kYXRhICsgcE91dHB1dFBsYW5lWzJdLnVfdG9wbGVmdDsNCi0gICAgICAgIHBfc3JjID0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzJdLnBhY19kYXRhICsNCi0gICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMl0udV90b3BsZWZ0Ow0KLQ0KLSAgICAgICAgZm9yIChoZWlnaHQgPSAwOyBoZWlnaHQ8cE91dHB1dFBsYW5lWzJdLnVfaGVpZ2h0OyBoZWlnaHQrKykgew0KLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzLCAodm9pZCAqKXBfc3JjLCBwT3V0cHV0UGxhbmVbMl0udV93aWR0aCk7DQotICAgICAgICAgICAgcF9kZXMgKz0gcE91dHB1dFBsYW5lWzJdLnVfc3RyaWRlOw0KLSAgICAgICAgICAgIHBfc3JjICs9IHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFsyXS51X3N0cmlkZTsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0NCi0gICAgICAgIHBfZGVzID0gcE91dHB1dFBsYW5lWzBdLnBhY19kYXRhICsgcE91dHB1dFBsYW5lWzBdLnVfdG9wbGVmdDsNCi0gICAgICAgIHBfc3JjID0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZEYXRhWzBdLnBhY19kYXRhICsNCi0gICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dkRhdGFbMF0udV90b3BsZWZ0Ow0KLQ0KLSAgICAgICAgZm9yIChoZWlnaHQgPSAwOyBoZWlnaHQ8cE91dHB1dFBsYW5lWzBdLnVfaGVpZ2h0OyBoZWlnaHQrKykgew0KLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzLCAodm9pZCAqKXBfc3JjLCBwT3V0cHV0UGxhbmVbMF0udV93aWR0aCk7DQotICAgICAgICAgICAgcF9kZXMgKz0gcE91dHB1dFBsYW5lWzBdLnVfc3RyaWRlOw0KLSAgICAgICAgICAgIHBfc3JjICs9IHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2RGF0YVswXS51X3N0cmlkZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHBfZGVzID0gcE91dHB1dFBsYW5lWzFdLnBhY19kYXRhICsgcE91dHB1dFBsYW5lWzFdLnVfdG9wbGVmdDsNCi0gICAgICAgIHBfc3JjID0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZEYXRhWzFdLnBhY19kYXRhICsNCi0gICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dkRhdGFbMV0udV90b3BsZWZ0Ow0KLQ0KLSAgICAgICAgZm9yIChoZWlnaHQgPSAwOyBoZWlnaHQ8cE91dHB1dFBsYW5lWzFdLnVfaGVpZ2h0OyBoZWlnaHQrKykgew0KLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzLCAodm9pZCAqKXBfc3JjLCBwT3V0cHV0UGxhbmVbMV0udV93aWR0aCk7DQotICAgICAgICAgICAgcF9kZXMgKz0gcE91dHB1dFBsYW5lWzFdLnVfc3RyaWRlOw0KLSAgICAgICAgICAgIHBfc3JjICs9IHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2RGF0YVsxXS51X3N0cmlkZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHBfZGVzID0gcE91dHB1dFBsYW5lWzJdLnBhY19kYXRhICsgcE91dHB1dFBsYW5lWzJdLnVfdG9wbGVmdDsNCi0gICAgICAgIHBfc3JjID0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZEYXRhWzJdLnBhY19kYXRhICsNCi0gICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dkRhdGFbMl0udV90b3BsZWZ0Ow0KLQ0KLSAgICAgICAgZm9yIChoZWlnaHQgPSAwOyBoZWlnaHQ8cE91dHB1dFBsYW5lWzJdLnVfaGVpZ2h0OyBoZWlnaHQrKykgew0KLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzLCh2b2lkICopcF9zcmMscE91dHB1dFBsYW5lWzJdLnVfd2lkdGgpOw0KLSAgICAgICAgICAgIHBfZGVzICs9IHBPdXRwdXRQbGFuZVsyXS51X3N0cmlkZTsNCi0gICAgICAgICAgICBwX3NyYyArPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dkRhdGFbMl0udV9zdHJpZGU7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIGVycjsNCi19DQotDQotLyoqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBicmllZiBSZXRyaWV2ZXMgdGhlIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSB0aGUgZGVjb2Rlcg0KLSAqIEBwYXJhbSBwRGVjb2RlclR5cGUgICAgICAgIDogUG9pbnRlciB0byBhIE00REVDT0RFUl9WaWRlb1R5cGUNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyKQ0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIGRlY29kZXIgdHlwZQ0KLSAqIEBwYXJhbSBwRGVjb2RlckludGVyZmFjZSAgIDogQWRkcmVzcyBvZiBhIHBvaW50ZXIgdGhhdCB3aWxsIGJlIHNldCB0bw0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSB0aGlzIGRlY29kZXIuDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgaW50ZXJmYWNlIGlzIGEgc3RydWN0dXJlIGFsbG9jYXRlZCBieQ0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBmdW5jdGlvbiBhbmQgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLg0KLSAqDQotICogQHJldHVybnMgOiBNNE5PX0VSUk9SICBpZiBPSw0KLSAqICAgICAgICAgICAgTTRFUlJfQUxMT0MgaWYgYWxsb2NhdGlvbiBmYWlsZWQNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKi8NCi1NNE9TQV9FUlIgTTRERUNPREVSX05VTExfZ2V0SW50ZXJmYWNlIChNNERFQ09ERVJfVmlkZW9UeXBlICpwRGVjb2RlclR5cGUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSAqKnBEZWNvZGVySW50ZXJmYWNlKSB7DQotDQotICAgICpwRGVjb2RlckludGVyZmFjZSA9DQotICAgICAgICAoTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoDQotICAgICAgICAgc2l6ZW9mKE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSksDQotICAgICAgICAgTTRERUNPREVSX01QRUc0LCAoTTRPU0FfQ2hhciAqKSJNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UiKTsNCi0NCi0gICAgaWYgKE00T1NBX05VTEwgPT0gKnBEZWNvZGVySW50ZXJmYWNlKSB7DQotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7DQotICAgIH0NCi0NCi0gICAgKnBEZWNvZGVyVHlwZSA9IE00REVDT0RFUl9rVmlkZW9UeXBlWVVWNDIwUDsNCi0NCi0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdENyZWF0ZSAgICA9IE00REVDT0RFUl9OVUxMX2NyZWF0ZTsNCi0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdERlc3Ryb3kgICA9IE00REVDT0RFUl9OVUxMX2Rlc3Ryb3k7DQotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RHZXRPcHRpb24gPSBNNERFQ09ERVJfTlVMTF9nZXRPcHRpb247DQotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RTZXRPcHRpb24gPSBNNERFQ09ERVJfTlVMTF9zZXRPcHRpb247DQotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3REZWNvZGUgICAgPSBNNERFQ09ERVJfTlVMTF9kZWNvZGU7DQotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RSZW5kZXIgICAgPSBNNERFQ09ERVJfTlVMTF9yZW5kZXI7DQotDQotICAgIHJldHVybiBNNE5PX0VSUk9SOw0KLX0NCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000UENNUl9Db3JlUmVhZGVyLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000UENNUl9Db3JlUmVhZGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMzNDMyNTQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFBDTVJfQ29yZVJlYWRlci5jCisrKyAvZGV2L251bGwKQEAgLTEsNzE2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFBDTV9QQ01SZWFkZXIuYwotICogQGJyaWVmICAgUENNIHJlYWRlciBpbXBsZW1lbnRhdGlvbgotICogQG5vdGUgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb25zIG9mIHRoZSBQQ00gcmVhZGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLSNpbmNsdWRlICJNNE9TQV9DaGFyU3Rhci5oIgotI2luY2x1ZGUgIk00UENNUl9Db3JlUmVhZGVyLmgiCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9DaGFyU3Rhci5oIgotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBQQ00gcmVhZGVyIHZlcnNpb24gbnVtYmVycwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0vKiBDSEFOR0VfVkVSU0lPTl9IRVJFICovCi0jZGVmaW5lIE00UENNUl9WRVJTSU9OX01BSk9SIDEKLSNkZWZpbmUgTTRQQ01SX1ZFUlNJT05fTUlOT1IgMAotI2RlZmluZSBNNFBDTVJfVkVSU0lPTl9SRVZJU0lPTiAwCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UENNUl9vcGVuUmVhZChNNE9TQV9Db250ZXh0KiBwQ29udGV4dCwgTTRPU0FfVm9pZCogcFVybCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZGVyUG9pbnRlciogcEZpbGVGdW5jdGlvbikKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gb3BlbnMgYSBQQ00gZmlsZQotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiA6Ci0gKiAgICAgICAgICAtIG9wZW5zIGEgUENNIGZpbGUKLSAqICAgICAgICAgIC0gaW5pdGlhbGl6ZXMgUENNIGNvbnRleHQsCi0gKiAgICAgICAgICAtIHZlcmlmaWVzIFBDTSBmaWxlIGZvcm1hdAotICogICAgICAgICAgLSBGaWxsIGRlY29kZXIgY29uZmlnIHN0cnVjdHVyZQotICogICAgICAgICAgLSBDaGFuZ2VzIHN0YXRlIG9mIHRoZSByZWFkZXIgaW4gJ09wZW5pbmcnCi0gKiBAcGFyYW0gICBwQ29udGV4dDogKE9VVCkgUG9pbnRlciBvbiB0aGUgUENNIFJlYWRlciBjb250ZXh0Ci0gKiBAcGFyYW0gICBwVXJsOiAoSU4pIE5hbWUgb2YgdGhlIFBDTSBmaWxlCi0gKiBAcGFyYW0gICBwRmlsZUZ1bmN0aW9uczogKElOKSBQb2ludGVyIG9uIHRoZSBmaWxlIGFjY2VzcyBmdW5jdGlvbnMKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IgZHVyaW5nIHRoZSBvcGVuaW5nCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICAgICAgIHBDb250ZXh0IGFuZC9vciBwVXJsIGFuZC9vciBwRmlsZUZ1bmN0aW9uIGlzIE5VTEwKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DICAgICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICBNNEVSUl9GSUxFX05PVF9GT1VORCAgICAgICAgICAgIHRoZSBmaWxlIGNhbm5vdCBiZSBmb3VuZAotICogQHJldHVybiAgTTRQQ01DX0VSUl9QQ01fTk9UX0NPTVBMSUFOVCAgICB0aGUgZmlsZSBkb2VzIG5vdCBzZWVtIHRvIGJlIGNvbXBsaWFudCwgbm8gUklGRiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgbGFjayBvZiBhbnkgbWFuZGF0b3J5IGNodW5rLgotICogQHJldHVybiAgTTRQQ01DX0VSUl9QQ01fTk9UX1NVUFBPUlRFRCAgICB0aGUgUENNIGZvcm1hdCBvZiB0aGlzIGZpbGUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlcgotICogQHJldHVybiAgQW55IE00T1NBX0ZJTEUgZXJyb3JzICAgICAgICAgICBzZWUgT1NBTCBGaWxlIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbGVkIGVycm9ycwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRQQ01SX29wZW5SZWFkKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwVXJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlRnVuY3Rpb24pCi17Ci0gICAgTTRPU0FfRVJSICAgICAgIGVycjsKLSAgICBNNFBDTVJfQ29udGV4dCAqY29udGV4dDsKLSAgICBNNE9TQV9DaGFyKiAgICAgICAgcFRlbXBVUkw7Ci0gICAgTTRPU0FfQ2hhciAgICAgICAgdmFsdWVbNl07Ci0KLSAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCi0gICAgaWYoKE00T1NBX05VTEwgPT0gcENvbnRleHQpfHwgKE00T1NBX05VTEwgPT0gcFVybCkgfHwoTTRPU0FfTlVMTCA9PSBwRmlsZUZ1bmN0aW9uKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyogQWxsb2NhdGVzIHRoZSBjb250ZXh0ICovCi0gICAgY29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgY29udGV4dCA9IChNNFBDTVJfQ29udGV4dCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRQQ01SX0NvbnRleHQpLCBNNFdBVl9SRUFERVIsCi0gICAgICAgICAoTTRPU0FfQ2hhciAqKSJNNFBDTVJfb3BlblJlYWQiKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBjb250ZXh0KQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICAqcENvbnRleHQgPSAoTTRPU0FfQ29udGV4dCljb250ZXh0OwotCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgY29udGV4dCAqLwotICAgIGNvbnRleHQtPm1fb2Zmc2V0ID0gMDsKLQotICAgIGNvbnRleHQtPm1fc3RhdGUgICAgICAgICAgICA9IE00UENNUl9rSW5pdDsKLSAgICBjb250ZXh0LT5tX21pY3JvU3RhdGUgICAgICAgPSBNNFBDTVJfa0luaXQ7Ci0gICAgY29udGV4dC0+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+bV9zdGF0ZSAhPSBNNFBDTVJfa09wZW5pbmcpICYmIChjLT5tX3N0YXRlICE9IE00UENNUl9rT3BlbmluZ19zdHJlYW1SZXRyaWV2ZWQpXAotICAgICAgICAgJiYgKGMtPm1fc3RhdGUgIT0gTTRQQ01SX2tSZWFkaW5nKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKiBEZXBlbmQgb2YgdGhlIE9wdGlvbklELCB0aGUgdmFsdWUgdG8gc2V0IGlzIGRpZmZlcmVudCAqLwotICAgIHN3aXRjaChvcHRpb25JRCkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRQQ01SX2tQQ01ibG9ja1NpemU6Ci0gICAgICAgICAgICBjLT5tX2Jsb2NrU2l6ZSA9IChNNE9TQV9VSW50MzIpVmFsdWU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9PUFRJT05fSUQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRQQ01SX2dldFZlcnNpb24gKE00X1ZlcnNpb25JbmZvICpwVmVyc2lvbikKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfVFJBQ0UxXzEoIk00UENNUl9nZXRWZXJzaW9uIGNhbGxlZCB3aXRoIHBWZXJzaW9uOiAweCV4IiwgcFZlcnNpb24pOwotICAgIE00T1NBX0RFQlVHX0lGMSgoKE00T1NBX1VJbnQzMikgcFZlcnNpb24gPT0gMCksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgInBWZXJzaW9uIGlzIE5VTEwgaW4gTTRQQ01SX2dldFZlcnNpb24iKTsKLQotICAgIHBWZXJzaW9uLT5tX21ham9yID0gTTRQQ01SX1ZFUlNJT05fTUFKT1I7Ci0gICAgcFZlcnNpb24tPm1fbWlub3IgPSBNNFBDTVJfVkVSU0lPTl9NSU5PUjsKLSAgICBwVmVyc2lvbi0+bV9yZXZpc2lvbiA9IE00UENNUl9WRVJTSU9OX1JFVklTSU9OOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000UFRPM0dQUF9BUEkuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRQVE8zR1BQX0FQSS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNDJmZmI3Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRQVE8zR1BQX0FQSS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTkyOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRQVE8zR1BQX0FQSS5jCi0gKiBAYnJpZWYgICBQaWN0dXJlIHRvIDNncHAgU2VydmljZSBpbXBsZW1lbnRhdGlvbi4KLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKjE2IGJ5dGVzIHNpZ25hdHVyZSB0byBiZSB3cml0dGVuIGluIHRoZSBnZW5lcmF0ZWQgM2dwIGZpbGVzICovCi0jZGVmaW5lIE00UFRPM0dQUF9TSUdOQVRVUkUgICAgICJOWFAtU1cgOiBQVE8zR1BQIgotCi0vKioqKioqKioqKioqKioqKi8KLS8qKiogSW5jbHVkZXMgKioqLwotLyoqKioqKioqKioqKioqKiovCi0KLS8qKgotICogIE91ciBoZWFkZXIgKi8KLSNpbmNsdWRlICJNNFBUTzNHUFBfSW50ZXJuYWxUeXBlcy5oIgotI2luY2x1ZGUgIk00UFRPM0dQUF9BUEkuaCIKLQotLyoqCi0gKiAgT3VyIGVycm9ycyAqLwotI2luY2x1ZGUgIk00UFRPM0dQUF9FcnJvckNvZGVzLmgiCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfTVBFRzQKLSNpbmNsdWRlICJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlci5oIgotI2VuZGlmCi0KLQotLyoqCi0gKiAgT1NBTCBoZWFkZXJzICovCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiICAgICAgIC8qIE9TQUwgbWVtb3J5IG1hbmFnZW1lbnQgKi8KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIiAgICAgICAgLyogT1NBTCBkZWJ1ZyBtYW5hZ2VtZW50ICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKiogVmFyaW91cyBNYWdpY2FscyAqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIE00UFRPM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lEICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgTTRQVE8zR1BQX1dSSVRFUl9WSURFT19TVFJFQU1fSUQgICAgICAgICAgICAgICAgMgotI2RlZmluZSBNNFBUTzNHUFBfUVVBTlRJWkVSX1NURVAgICAgICAgICAgICAgICAgICAgICAgICA0ICAgICAgIC8qKjwgUXVhbnRpemVyIHN0ZXAgKi8KLSNkZWZpbmUgTTRQVE8zR1BQX1dSSVRFUl9BVURJT19QUk9GSUxFX0xFVkVMICAgICAgICAgICAgMHhGRiAgICAvKio8IE5vIHNwZWNpZmljIHByb2ZpbGUgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCAqLwotI2RlZmluZSBNNFBUTzNHUFBfV1JJVEVSX0FVRElPX0FNUl9USU1FX1NDQUxFICAgICAgICAgICA4MDAwICAgIC8qKjwgQU1SICovCi0jZGVmaW5lIE00UFRPM0dQUF9CSVRSQVRFX1JFR1VMQVRJT05fQ1RTX1BFUklPRF9JTl9NUyAgIDUwMCAgICAgLyoqPCBNQUdJQ0FMICovCi0jZGVmaW5lIE00UFRPM0dQUF9NQVJHRV9PRl9GSUxFX1NJWkUgICAgICAgICAgICAgICAgICAgIDI1MDAwICAgLyoqPCBNQUdJQ0FMICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGRlZmluZSAgIEFNUiAxMi4yIGticHMgc2lsZW5jZSBmcmFtZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNkZWZpbmUgTTRQVE8zR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzEyMl9TSVpFICAgICAzMgotI2RlZmluZSBNNFBUTzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMTIyX0RVUkFUSU9OIDIwCi1jb25zdCBNNE9TQV9VSW50OCBNNFBUTzNHUFBfQU1SX0FVX1NJTEVOQ0VfMTIyX0ZSQU1FW000UFRPM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8xMjJfU0laRV09Ci17IDB4M0MsIDB4OTEsIDB4MTcsIDB4MTYsIDB4QkUsIDB4NjYsIDB4NzgsIDB4MDAsIDB4MDAsIDB4MDEsIDB4RTcsIDB4QUYsCi0gIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfTsKLQotI2RlZmluZSBNNFBUTzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkUgICAgIDEzCi0jZGVmaW5lIE00UFRPM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfRFVSQVRJT04gMjAKLWNvbnN0IE00T1NBX1VJbnQ4IE00UFRPM0dQUF9BTVJfQVVfU0lMRU5DRV8wNDhfRlJBTUVbTTRQVE8zR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFXSA9Ci17IDB4MDQsIDB4RkYsIDB4MTgsIDB4QzcsIDB4RjAsIDB4MEQsIDB4MDQsIDB4MzMsIDB4RkYsIDB4RTAsIDB4MDAsIDB4MDAsIDB4MDAgfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKiogIlByaXZhdGUiIGZ1bmN0aW9ucyAqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIE00T1NBX0VSUiBNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZyhNNFBUTzNHUFBfSW50ZXJuYWxDb250ZXh0KiBwQyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKiAiRXh0ZXJuYWwiIGZ1bmN0aW9ucyAqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiBNNE9TQV9FUlIgTTRXUklURVJfM0dQX2dldEludGVyZmFjZXMoTTRXUklURVJfT3V0cHV0RmlsZVR5cGUqIHBUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqKiBTcmNHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqKiBTcmNEYXRhSW50ZXJmYWNlKTsKLWV4dGVybiBNNE9TQV9FUlIgTTRSRUFERVJfQU1SX2dldEludGVyZmFjZXMoTTRSRUFERVJfTWVkaWFUeXBlICpwTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKipwUmRyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICoqcFJkckRhdGFJbnRlcmZhY2UpOwotZXh0ZXJuIE00T1NBX0VSUiBNNFJFQURFUl8zR1BfZ2V0SW50ZXJmYWNlcyhNNFJFQURFUl9NZWRpYVR5cGUgKnBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSAqKnBSZHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKipwUmRyRGF0YUludGVyZmFjZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKiAiU3RhdGljIiBmdW5jdGlvbnMgKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgTTRPU0FfRVJSIE00UFRPM0dQUF93cml0ZUFtclNpbGVuY2UxMjJGcmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqIHBXcml0ZXJEYXRhSW50SW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfQ29udGV4dCogcFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19BY2Nlc3NVbml0KiBwV3JpdGVyQXVkaW9BVSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RpbWUgbXRJbmNDdHMpOwotc3RhdGljIE00T1NBX0VSUiBNNFBUTzNHUFBfd3JpdGVBbXJTaWxlbmNlMDQ4RnJhbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqIHBXcml0ZXJEYXRhSW50SW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9Db250ZXh0KiBwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfQWNjZXNzVW5pdCogcFdyaXRlckF1ZGlvQVUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RpbWUgbXRJbmNDdHMpOwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQVE8zR1BQX0dldFZlcnNpb24oTTRfVmVyc2lvbkluZm8qIHBWZXJzaW9uSW5mbyk7Ci0gKiBAYnJpZWYgICBHZXQgdGhlIE00UFRPM0dQUCB2ZXJzaW9uLgotICogQG5vdGUgICAgQ2FuIGJlIGNhbGxlZCBhbnl0aW1lLiBEbyBub3QgbmVlZCBhbnkgY29udGV4dC4KLSAqIEBwYXJhbSAgIHBWZXJzaW9uSW5mbyAgICAgICAgKE9VVCkgUG9pbnRlciB0byBhIHZlcnNpb24gaW5mbyBzdHJ1Y3R1cmUKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgcFZlcnNpb25JbmZvIGlzIE00T1NBX05VTEwgKElmIERlYnVnIExldmVsID49IDIpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00UFRPM0dQUF9HZXRWZXJzaW9uKE00X1ZlcnNpb25JbmZvKiBwVmVyc2lvbkluZm8pCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX1RSQUNFM18xKCJNNFBUTzNHUFBfR2V0VmVyc2lvbiBjYWxsZWQgd2l0aCBwVmVyc2lvbkluZm89MHgleCIsIHBWZXJzaW9uSW5mbyk7Ci0KLSAgICAvKioKLSAgICAgKiAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTD09cFZlcnNpb25JbmZvKSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAiTTRQVE8zR1BQX0dldFZlcnNpb246IHBWZXJzaW9uSW5mbyBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBwVmVyc2lvbkluZm8tPm1fbWFqb3IgICAgICAgPSBNNFBUTzNHUFBfVkVSU0lPTl9NQUpPUjsKLSAgICBwVmVyc2lvbkluZm8tPm1fbWlub3IgICAgICAgPSBNNFBUTzNHUFBfVkVSU0lPTl9NSU5PUjsKLSAgICBwVmVyc2lvbkluZm8tPm1fcmV2aXNpb24gICAgPSBNNFBUTzNHUFBfVkVSU0lPTl9SRVZJU0lPTjsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBUTzNHUFBfSW5pdChNNFBUTzNHUFBfQ29udGV4dCogcENvbnRleHQpOwotICogQGJyaWVmICAgSW5pdGlhbGl6ZXMgdGhlIE00UFRPM0dQUCAoYWxsb2NhdGVzIGFuIGV4ZWN1dGlvbiBjb250ZXh0KS4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChPVVQpIFBvaW50ZXIgb24gdGhlIE00UFRPM0dQUCBjb250ZXh0IHRvIGFsbG9jYXRlCi0gKiBAcGFyYW0gICBwRmlsZVJlYWRQdHJGY3QgICAgIChJTikgUG9pbnRlciB0byBPU0FMIGZpbGUgcmVhZGVyIGZ1bmN0aW9ucwotICogQHBhcmFtICAgcEZpbGVXcml0ZVB0ckZjdCAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHdyaXRlciBmdW5jdGlvbnMKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChJZiBEZWJ1ZyBMZXZlbCA+PSAyKQotICogQHJldHVybiAgTTRFUlJfQUxMT0M6ICAgICAgICBUaGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00UFRPM0dQUF9Jbml0KCAgIE00UFRPM0dQUF9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZFB0ckZjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogcEZpbGVXcml0ZVB0ckZjdCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dCAqcEM7Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRQVE8zR1BQX0luaXQgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCIsIHBDb250ZXh0KTsKLQotICAgIC8qKgotICAgICAqICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgIk00UFRPM0dQUF9Jbml0OiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKioKLSAgICAgKiAgQWxsb2NhdGUgdGhlIE00UFRPM0dQUCBjb250ZXh0IGFuZCByZXR1cm4gaXQgdG8gdGhlIHVzZXIgKi8KLSAgICBwQyA9IChNNFBUTzNHUFBfSW50ZXJuYWxDb250ZXh0KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQpLCBNNFBUTzNHUFAsCi0gICAgICAgIChNNE9TQV9DaGFyICopIk00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQiKTsKLSAgICAqcENvbnRleHQgPSBwQzsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQykKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFBUTzNHUFBfU3RlcCgpOiB1bmFibGUgdG8gYWxsb2NhdGUgTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dCxcCi0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEluaXQgdGhlIGNvbnRleHQuIEFsbCBwb2ludGVycyBtdXN0IGJlIGluaXRpYWxpemVkIHRvIE00T1NBX05VTEwgYmVjYXVzZSBDbGVhblVwKCkKLSAgICAgICAgY2FuIGJlIGNhbGxlZCBqdXN0IGFmdGVyIEluaXQoKS4gKi8KLSAgICBwQy0+bV9TdGF0ZSA9IE00UFRPM0dQUF9rU3RhdGVfQ1JFQVRFRDsKLSAgICBwQy0+bV9WaWRlb1N0YXRlID0gTTRQVE8zR1BQX2tTdHJlYW1TdGF0ZV9OT1NUUkVBTTsKLSAgICBwQy0+bV9BdWRpb1N0YXRlID0gTTRQVE8zR1BQX2tTdHJlYW1TdGF0ZV9OT1NUUkVBTTsKLQotICAgIC8qKgotICAgICAqICBSZWFkZXIgc3R1ZmYgKi8KLSAgICBwQy0+bV9wUmVhZGVyQXVkaW9BVSAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbSAgICA9IE00T1NBX05VTEw7Ci0KLSAgICAvKioKLSAgICAgKiAgV3JpdGVyIHN0dWZmICovCi0gICAgcEMtPm1fcEVuY29kZXJIZWFkZXIgICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW0gICAgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbSAgICA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtSW5mbz0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW1JbmZvPSBNNE9TQV9OVUxMOwotCi0gICAgLyoqCi0gICAgICogIENvbnRleHRzIG9mIHRoZSB1c2VkIG1vZHVsZXMgICovCi0gICAgcEMtPm1fcEF1ZGlvUmVhZGVyQ29udGV4dCAgICA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm1fcDNncFdyaXRlckNvbnRleHQgID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV9wTXA0RW5jb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX2VFbmNvZGVyU3RhdGUgPSBNNFBUTzNHUFBfa05vRW5jb2RlcjsKLQotICAgIC8qKgotICAgICAqICBJbnRlcmZhY2VzIG9mIHRoZSB1c2VkIG1vZHVsZXMgKi8KLSAgICBwQy0+bV9wUmVhZGVyR2xvYkludCAgICA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm1fcFJlYWRlckRhdGFJbnQgICAgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3BXcml0ZXJHbG9iSW50ICAgID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV9wV3JpdGVyRGF0YUludCAgICA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm1fcEVuY29kZXJJbnQgICAgICAgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3BFbmNvZGVyRXh0ZXJuYWxBUEkgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3BFbmNvZGVyVXNlckRhdGEgPSBNNE9TQV9OVUxMOwotCi0gICAgLyoqCi0gICAgICogRmlsbCB0aGUgT1NBTCBmaWxlIGZ1bmN0aW9uIHNldCAqLwotICAgIHBDLT5wT3NhbEZpbGVSZWFkID0gcEZpbGVSZWFkUHRyRmN0OwotICAgIHBDLT5wT3NhbEZpbGVXcml0ZSA9IHBGaWxlV3JpdGVQdHJGY3Q7Ci0KLSAgICAvKioKLSAgICAgKiAgVmlkZW8gcmF0ZSBjb250cm9sIHN0dWZmICovCi0gICAgcEMtPm1fbXRDdHMgICAgICAgICAgICAgPSAwLjBGOwotICAgIHBDLT5tX210TmV4dEN0cyAgICAgICAgID0gMC4wRjsKLSAgICBwQy0+bV9tdEF1ZGlvQ3RzICAgICAgICA9IDAuMEY7Ci0gICAgcEMtPm1fQXVkaW9PZmZTZXQgICAgICAgPSAwLjBGOwotICAgIHBDLT5tX2RMYXN0VmlkZW9SZWd1bEN0cz0gMC4wRjsKLSAgICBwQy0+bV9QcmV2QXVkaW9DdHMgICAgICA9IDAuMEY7Ci0gICAgcEMtPm1fRGVsdGFBdWRpb0N0cyAgICAgPSAwLjBGOwotCi0gICAgcEMtPm1fTWF4RmlsZVNpemUgICAgICAgPSAwOwotICAgIHBDLT5tX0N1cnJlbnRGaWxlU2l6ZSAgID0gMDsKLQotICAgIHBDLT5tX0lzTGFzdFBpY3R1cmUgICAgICAgICA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5tX2JBdWRpb1BhZGRpbmdTaWxlbmNlICA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5tX2JMYXN0SW50ZXJuYWxDYWxsQmFjayA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5tX05iQ3VycmVudEZyYW1lICAgICAgICA9IDA7Ci0KLSAgICBwQy0+cFNhdmVkUGxhbmUgPSBNNE9TQV9OVUxMOwotICAgIHBDLT51aVNhdmVkRHVyYXRpb24gPSAwOwotCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00UFRPM0dQUF9Jbml0KCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UFRPM0dQUF9PcGVuKE00UFRPM0dQUF9Db250ZXh0IHBDb250ZXh0LCBNNFBUTzNHUFBfUGFyYW1zKiBwUGFyYW1zKTsKLSAqIEBicmllZiAgIFNldCB0aGUgTTRQVE8zR1BQIGlucHV0IGFuZCBvdXRwdXQgZmlsZXMuCi0gKiBAbm90ZSAgICBJdCBvcGVucyB0aGUgaW5wdXQgZmlsZSwgYnV0IHRoZSBvdXRwdXQgZmlsZSBtYXkgbm90IGJlIGNyZWF0ZWQgeWV0LgotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE00UFRPM0dQUCBjb250ZXh0Ci0gKiBAcGFyYW0gICBwUGFyYW1zICAgICAgICAgICAgIChJTikgUG9pbnRlciB0byB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIFBUTzNHUFAuCi0gKiBAbm90ZSAgICBUaGUgcG9pbnRlZCBzdHJ1Y3R1cmUgY2FuIGJlIGRlLWFsbG9jYXRlZCBhZnRlciB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYmVjYXVzZQotICogICAgICAgICAgaXQgaXMgaW50ZXJuYWxseSBjb3BpZWQgYnkgdGhlIFBUTzNHUFAKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE00UFRPM0dQUCBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZAotICogQHJldHVybiAgTTRFUlJfQUxMT0M6ICAgICAgICBUaGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkKLSAqIEByZXR1cm4gIEVSUl9QVE8zR1BQX0lOVkFMSURfVklERU9fRlJBTUVfU0laRV9GT1JfSDI2MyBUaGUgb3V0cHV0IHZpZGVvIGZyYW1lCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgcGFyYW1ldGVyIGlzIGluY29tcGF0aWJsZSB3aXRoIEgyNjMgZW5jb2RpbmcKLSAqIEByZXR1cm4gIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRk9STUFUICAgICAgIFRoZSBvdXRwdXQgdmlkZW8gZm9ybWF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkCi0gKiBAcmV0dXJuICBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0JJVFJBVEUgICAgICBUaGUgb3V0cHV0IHZpZGVvIGJpdC1yYXRlIHBhcmFtZXRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgdW5kZWZpbmVkCi0gKiBAcmV0dXJuICBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZSQU1FX1NJWkUgICBUaGUgb3V0cHV0IHZpZGVvIGZyYW1lIHNpemUgcGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB1bmRlZmluZWQKLSAqIEByZXR1cm4gIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfRklMRV9TSVpFICAgICAgICAgIFRoZSBvdXRwdXQgZmlsZSBzaXplIHBhcmFtZXRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgdW5kZWZpbmVkCi0gKiBAcmV0dXJuICBFUlJfUFRPM0dQUF9VTkRFRklORURfQVVESU9fUEFERElORyAgICAgICAgICAgICBUaGUgb3V0cHV0IGF1ZGlvIHBhZGRpbmcgcGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB1bmRlZmluZWQKLSAqIEByZXR1cm4gIEVSUl9QVE8zR1BQX1VOSEFORExFRF9BVURJT19UUkFDS19JTlBVVF9GSUxFICAgIFRoZSBpbnB1dCBhdWRpbyBmaWxlIGNvbnRhaW5zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHRyYWNrIGZvcm1hdCBub3QgaGFuZGxlZCBieSBQVE8zR1BQCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNFBUTzNHUFBfT3BlbihNNFBUTzNHUFBfQ29udGV4dCBwQ29udGV4dCwgTTRQVE8zR1BQX1BhcmFtcyogcFBhcmFtcykKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dCAgICpwQyA9IChNNFBUTzNHUFBfSW50ZXJuYWxDb250ZXh0KikocENvbnRleHQpOwotICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgTTRSRUFERVJfTWVkaWFGYW1pbHkgICAgbWVkaWFGYW1pbHk7Ci0gICAgTTRfU3RyZWFtSGFuZGxlciogICAgICAgcFN0cmVhbUhhbmRsZXI7Ci0gICAgTTRSRUFERVJfTWVkaWFUeXBlICAgICAgcmVhZGVyTWVkaWFUeXBlOwotCi0gICAgTTRPU0FfVFJBQ0UyXzIoIk00UFRPM0dQUF9PcGVuIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgsIHBQYXJhbXM9MHgleCIsIHBDb250ZXh0LCBwUGFyYW1zKTsKLQotICAgIC8qKgotICAgICAqICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLCBcCi0gICAgICAgICAgICAgICAgICAgICJNNFBUTzNHUFBfT3BlbjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwUGFyYW1zKSwgIE00RVJSX1BBUkFNRVRFUiwgXAotICAgICAgICAgICAgICAgICAgICAiTTRQVE8zR1BQX09wZW46IHBQYXJhbXMgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgICogIENoZWNrIHBhcmFtZXRlcnMgY29ycmVjdG5lc3MgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFBhcmFtcy0+cFBpY3R1cmVDYWxsYmFja0ZjdCksCi0gICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNFBUTzNHUFBfT3BlbjogcEMtPm1fUGFyYW1zLnBQaWN0dXJlQ2FsbGJhY2tGY3QgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwUGFyYW1zLT5wUGljdHVyZUNhbGxiYWNrQ3R4dCksCi0gICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAiTTRQVE8zR1BQX09wZW46IHBDLT5tX1BhcmFtcy5wUGljdHVyZUNhbGxiYWNrQ3R4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBQYXJhbXMtPnBPdXRwdXQzZ3BwRmlsZSksCi0gICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRQVE8zR1BQX09wZW46IHBDLT5tX1BhcmFtcy5wT3V0cHV0M2dwcEZpbGUgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwUGFyYW1zLT5wVGVtcG9yYXJ5RmlsZSksCi0gICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRQVE8zR1BQX09wZW46IHBDLT5tX1BhcmFtcy5wVGVtcG9yYXJ5RmlsZSBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKioKLSAgICAgKiBWaWRlbyBGb3JtYXQgKi8KLSAgICBpZiggKE00VklERU9FRElUSU5HX2tIMjYzICE9IHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0KSAmJgotICAgICAgICAoTTRWSURFT0VESVRJTkdfa01QRUc0ICE9IHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0KSAmJgotICAgICAgICAoTTRWSURFT0VESVRJTkdfa0gyNjQgIT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9Gb3JtYXQpKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFBUTzNHUFBfT3BlbjogVW5kZWZpbmVkIG91dHB1dCB2aWRlbyBmb3JtYXQiKTsKLSAgICAgICAgcmV0dXJuIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRk9STUFUOwotICAgICB9Ci0KLSAgICAgLyoqCi0gICAgICogVmlkZW8gQml0cmF0ZSAqLwotICAgIGlmKCEoKE00VklERU9FRElUSU5HX2sxNl9LQlBTICAgICAgID09IHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSkgfHwKLSAgICAgICAgIChNNFZJREVPRURJVElOR19rMjRfS0JQUyAgICAgICA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUpIHx8Ci0gICAgICAgICAoTTRWSURFT0VESVRJTkdfazMyX0tCUFMgICAgICAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlKSB8fAotICAgICAgICAgKE00VklERU9FRElUSU5HX2s0OF9LQlBTICAgICAgID09IHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSkgfHwKLSAgICAgICAgIChNNFZJREVPRURJVElOR19rNjRfS0JQUyAgICAgICA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUpIHx8Ci0gICAgICAgICAoTTRWSURFT0VESVRJTkdfazk2X0tCUFMgICAgICAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlKSB8fAotICAgICAgICAgKE00VklERU9FRElUSU5HX2sxMjhfS0JQUyAgICAgID09IHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSkgfHwKLSAgICAgICAgIChNNFZJREVPRURJVElOR19rMTkyX0tCUFMgICAgICA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUpIHx8Ci0gICAgICAgICAoTTRWSURFT0VESVRJTkdfazI1Nl9LQlBTICAgICAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlKSB8fAotICAgICAgICAgKE00VklERU9FRElUSU5HX2syODhfS0JQUyAgICAgID09IHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSkgfHwKLSAgICAgICAgIChNNFZJREVPRURJVElOR19rMzg0X0tCUFMgICAgICA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUpIHx8Ci0gICAgICAgICAoTTRWSURFT0VESVRJTkdfazUxMl9LQlBTICAgICAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlKSB8fAotICAgICAgICAgKE00VklERU9FRElUSU5HX2s4MDBfS0JQUyAgICAgID09IHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSkgfHwKLSAgICAgICAgIC8qKyBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotICAgICAgICAgKE00VklERU9FRElUSU5HX2syX01CUFMgICAgICAgID09IHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSkgfHwKLSAgICAgICAgIChNNFZJREVPRURJVElOR19rNV9NQlBTICAgICAgICA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUpIHx8Ci0gICAgICAgICAoTTRWSURFT0VESVRJTkdfazhfTUJQUyAgICAgICAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlKSB8fAotICAgICAgICAgKE00VklERU9FRElUSU5HX2tWQVJJQUJMRV9LQlBTID09IHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSkpKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFBUTzNHUFBfT3BlbjogVW5kZWZpbmVkIG91dHB1dCB2aWRlbyBiaXRyYXRlIik7Ci0gICAgICAgIHJldHVybiBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0JJVFJBVEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmlkZW8gZnJhbWUgc2l6ZSAqLwotICAgIGlmICghKChNNFZJREVPRURJVElOR19rU1FDSUYgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUpIHx8Ci0gICAgICAgICAgKE00VklERU9FRElUSU5HX2tRUVZHQSA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSkgfHwKLSAgICAgICAgICAoTTRWSURFT0VESVRJTkdfa1FDSUYgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUpIHx8Ci0gICAgICAgICAgKE00VklERU9FRElUSU5HX2tRVkdBID09IHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplKSB8fAotICAgICAgICAgIChNNFZJREVPRURJVElOR19rQ0lGICA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSkgfHwKLSAgICAgICAgICAoTTRWSURFT0VESVRJTkdfa1ZHQSAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUpIHx8Ci0KLSAgICAgICAgICAoTTRWSURFT0VESVRJTkdfa05UU0MgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUpIHx8Ci0gICAgICAgICAgKE00VklERU9FRElUSU5HX2tXVkdBID09IHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplKSB8fAotCi0gICAgICAgICAgKE00VklERU9FRElUSU5HX2s2NDBfMzYwID09IHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplKSB8fAotICAgICAgICAgIChNNFZJREVPRURJVElOR19rODU0XzQ4MCA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSkgfHwKLSAgICAgICAgICAoTTRWSURFT0VESVRJTkdfazEyODBfNzIwID09IHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplKSB8fAotICAgICAgICAgIChNNFZJREVPRURJVElOR19rMTA4MF83MjAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUpIHx8Ci0gICAgICAgICAgKE00VklERU9FRElUSU5HX2s5NjBfNzIwID09IHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplKSB8fAotICAgICAgICAgIChNNFZJREVPRURJVElOR19rMTkyMF8xMDgwID09IHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplKSkpIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UFRPM0dQUF9PcGVuOiBVbmRlZmluZWQgb3V0cHV0IHZpZGVvIGZyYW1lIHNpemUiKTsKLSAgICAgICAgcmV0dXJuIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfU0laRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYXhpbXVtIHNpemUgb2YgdGhlIG91dHB1dCAzR1BQIGZpbGUgKi8KLSAgICBpZiAoISgoTTRQVE8zR1BQX2s1MF9LQiAgICAgPT0gcFBhcmFtcy0+T3V0cHV0RmlsZU1heFNpemUpIHx8Ci0gICAgICAgICAgKE00UFRPM0dQUF9rNzVfS0IgICAgID09IHBQYXJhbXMtPk91dHB1dEZpbGVNYXhTaXplKSB8fAotICAgICAgICAgIChNNFBUTzNHUFBfazEwMF9LQiAgICA9PSBwUGFyYW1zLT5PdXRwdXRGaWxlTWF4U2l6ZSkgfHwKLSAgICAgICAgICAoTTRQVE8zR1BQX2sxNTBfS0IgICAgPT0gcFBhcmFtcy0+T3V0cHV0RmlsZU1heFNpemUpIHx8Ci0gICAgICAgICAgKE00UFRPM0dQUF9rMjAwX0tCICAgID09IHBQYXJhbXMtPk91dHB1dEZpbGVNYXhTaXplKSB8fAotICAgICAgICAgIChNNFBUTzNHUFBfazMwMF9LQiAgICA9PSBwUGFyYW1zLT5PdXRwdXRGaWxlTWF4U2l6ZSkgfHwKLSAgICAgICAgICAoTTRQVE8zR1BQX2s0MDBfS0IgICAgPT0gcFBhcmFtcy0+T3V0cHV0RmlsZU1heFNpemUpIHx8Ci0gICAgICAgICAgKE00UFRPM0dQUF9rNTAwX0tCICAgID09IHBQYXJhbXMtPk91dHB1dEZpbGVNYXhTaXplKSB8fAotICAgICAgICAgIChNNFBUTzNHUFBfa1VOTElNSVRFRCA9PSBwUGFyYW1zLT5PdXRwdXRGaWxlTWF4U2l6ZSkpKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFBUTzNHUFBfT3BlbjogVW5kZWZpbmVkIG91dHB1dCAzR1BQIGZpbGUgc2l6ZSIpOwotICAgICAgICByZXR1cm4gRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9GSUxFX1NJWkU7Ci0gICAgfQotCi0gICAgLyogQXVkaW8gcGFkZGluZyAqLwotICAgIGlmIChNNE9TQV9OVUxMICE9IHBQYXJhbXMtPnBJbnB1dEF1ZGlvVHJhY2tGaWxlKSB7Ci0gICAgICAgIGlmICgoISggKE00UFRPM0dQUF9rQXVkaW9QYWRkaW5nTW9kZV9Ob25lICAgPT0gcFBhcmFtcy0+QXVkaW9QYWRkaW5nTW9kZSkgfHwKLSAgICAgICAgICAgICAgICAoTTRQVE8zR1BQX2tBdWRpb1BhZGRpbmdNb2RlX1NpbGVuY2U9PSBwUGFyYW1zLT5BdWRpb1BhZGRpbmdNb2RlKSB8fAotICAgICAgICAgICAgICAgIChNNFBUTzNHUFBfa0F1ZGlvUGFkZGluZ01vZGVfTG9vcCAgID09IHBQYXJhbXMtPkF1ZGlvUGFkZGluZ01vZGUpKSkpIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFBUTzNHUFBfT3BlbjogVW5kZWZpbmVkIGF1ZGlvIHBhZGRpbmciKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJfUFRPM0dQUF9VTkRFRklORURfQVVESU9fUEFERElORzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKjwgU2l6ZSBjaGVjayBmb3IgSDI2MyAob25seSB2YWxpZCBzaXplcyBhcmUgQ0lGLCBRQ0lGIGFuZCBTUUNJRikgKi8KLSAgICBpZiAoKE00VklERU9FRElUSU5HX2tIMjYzID09IHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0KSAmJgotICAgICAgICAoTTRWSURFT0VESVRJTkdfa1NRQ0lGICE9IHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplKSAmJgotICAgICAgICAoTTRWSURFT0VESVRJTkdfa1FDSUYgIT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUpICYmCi0gICAgICAgIChNNFZJREVPRURJVElOR19rQ0lGICE9IHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplKSkgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRQVE8zR1BQX09wZW4oKTpcCi0gICAgICAgICAgICAgcmV0dXJuaW5nIEVSUl9QVE8zR1BQX0lOVkFMSURfVklERU9fRlJBTUVfU0laRV9GT1JfSDI2MyIpOwotICAgICAgICByZXR1cm4gRVJSX1BUTzNHUFBfSU5WQUxJRF9WSURFT19GUkFNRV9TSVpFX0ZPUl9IMjYzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBDaGVjayBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBpZiAoTTRQVE8zR1BQX2tTdGF0ZV9DUkVBVEVEICE9IHBDLT5tX1N0YXRlKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfT3BlbigpOiBXcm9uZyBTdGF0ZSAoJWQpLCByZXR1cm5pbmcgTTRFUlJfU1RBVEUiLCBwQy0+bV9TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb3B5IHRoZSBNNFBUTzNHUFBfUGFyYW1zIHN0cnVjdHVyZSAqLwotICAgIG1lbWNweSgodm9pZCAqKSgmcEMtPm1fUGFyYW1zKSwKLSAgICAgICAgICAgICAgICAodm9pZCAqKXBQYXJhbXMsIHNpemVvZihNNFBUTzNHUFBfUGFyYW1zKSk7Ci0gICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9PcGVuOiBvdXRwdXRWaWRlb0JpdHJhdGUgPSAlZCIsIHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0JpdHJhdGUpOwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qIE9wZW4gaW5wdXQgZmlsZSB3aXRoIHRoZSByZWFkZXIgKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1fUGFyYW1zLnBJbnB1dEF1ZGlvVHJhY2tGaWxlKSB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXQgdGhlIHJlYWRlciBpbnRlcmZhY2UgYWNjb3JkaW5nIHRvIHRoZSBpbnB1dCBhdWRpbyBmaWxlIHR5cGUgKi8KLSAgICAgICAgc3dpdGNoKHBDLT5tX1BhcmFtcy5BdWRpb0ZpbGVGb3JtYXQpCi0gICAgICAgIHsKLSNpZmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl9BTVIKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQU1SOgotICAgICAgICBlcnIgPSBNNFJFQURFUl9BTVJfZ2V0SW50ZXJmYWNlcyggJnJlYWRlck1lZGlhVHlwZSwgJnBDLT5tX3BSZWFkZXJHbG9iSW50LAotICAgICAgICAgICAgICAgICZwQy0+bV9wUmVhZGVyRGF0YUludCk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9PcGVuKCk6IE00UkVBREVSX0FNUl9nZXRJbnRlcmZhY2VzIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgQUFDX1NVUFBPUlRFRAotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQOgotICAgICAgICAgICAgZXJyID0gTTRSRUFERVJfM0dQX2dldEludGVyZmFjZXMoICZyZWFkZXJNZWRpYVR5cGUsICZwQy0+bV9wUmVhZGVyR2xvYkludCwKLSAgICAgICAgICAgICAgICAgICAgJnBDLT5tX3BSZWFkZXJEYXRhSW50KTsKLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX09wZW4oKTogTTRSRUFERVJfM0dQX2dldEludGVyZmFjZXMgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEVSUl9QVE8zR1BQX1VOSEFORExFRF9BVURJT19UUkFDS19JTlBVVF9GSUxFOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBJbml0aWFsaXplcyB0aGUgcmVhZGVyIHNoZWxsICovCi0gICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXJHbG9iSW50LT5tX3BGY3RDcmVhdGUoJnBDLT5tX3BBdWRpb1JlYWRlckNvbnRleHQpOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfT3BlbigpOiBwUmVhZGVyR2xvYkludC0+bV9wRmN0Q3JlYXRlIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgcEMtPm1fcFJlYWRlckRhdGFJbnQtPm1fcmVhZGVyQ29udGV4dCA9IHBDLT5tX3BBdWRpb1JlYWRlckNvbnRleHQ7Ci0gICAgICAgIC8qKjwgTGluayB0aGUgcmVhZGVyIGludGVyZmFjZSB0byB0aGUgcmVhZGVyIGNvbnRleHQgKi8KLQotICAgICAgICAvKioKLSAgICAgICAgICogIFNldCB0aGUgcmVhZGVyIHNoZWxsIGZpbGUgYWNjZXNzIGZ1bmN0aW9ucyAqLwotICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyR2xvYkludC0+bV9wRmN0U2V0T3B0aW9uKHBDLT5tX3BBdWRpb1JlYWRlckNvbnRleHQsCi0gICAgICAgICAgICBNNFJFQURFUl9rT3B0aW9uSURfU2V0T3NhRmlsZVJlYWRlckZjdHNQdHIsICAoTTRPU0FfRGF0YU9wdGlvbilwQy0+cE9zYWxGaWxlUmVhZCk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9PcGVuKCk6IHBSZWFkZXJHbG9iSW50LT5tX3BGY3RTZXRPcHRpb24gcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogIE9wZW4gdGhlIGlucHV0IGF1ZGlvIGZpbGUgKi8KLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckdsb2JJbnQtPm1fcEZjdE9wZW4ocEMtPm1fcEF1ZGlvUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgIHBDLT5tX1BhcmFtcy5wSW5wdXRBdWRpb1RyYWNrRmlsZSk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9PcGVuKCk6IHBSZWFkZXJHbG9iSW50LT5tX3BGY3RPcGVuIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICBwQy0+bV9wUmVhZGVyR2xvYkludC0+bV9wRmN0RGVzdHJveShwQy0+bV9wQXVkaW9SZWFkZXJDb250ZXh0KTsKLSAgICAgICAgICAgIHBDLT5tX3BBdWRpb1JlYWRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiAgR2V0IHRoZSBhdWRpbyBzdHJlYW1zIGZyb20gdGhlIGlucHV0IGZpbGUgKi8KLSAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgd2hpbGUgKE00Tk9fRVJST1IgPT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyR2xvYkludC0+bV9wRmN0R2V0TmV4dFN0cmVhbShwQy0+bV9wQXVkaW9SZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICZtZWRpYUZhbWlseSwgJnBTdHJlYW1IYW5kbGVyKTsKLQotICAgICAgICAgICAgaWYoKGVyciA9PSAoKE00T1NBX1VJbnQzMilNNEVSUl9SRUFERVJfVU5LTk9XTl9TVFJFQU1fVFlQRSkpIHx8Ci0gICAgICAgICAgICAgICAgICAgKGVyciA9PSAoKE00T1NBX1VJbnQzMilNNFdBUl9UT09fTVVDSF9TVFJFQU1TKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgPT0gZXJyKSAvKio8IE9uZSBzdHJlYW0gZm91bmQgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKio8IEZvdW5kIGFuIGF1ZGlvIHN0cmVhbSAqLwotICAgICAgICAgICAgICAgIGlmICgoTTRSRUFERVJfa01lZGlhRmFtaWx5QXVkaW8gPT0gbWVkaWFGYW1pbHkpCi0gICAgICAgICAgICAgICAgICAgICYmIChNNE9TQV9OVUxMID09IHBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUmVhZGVyQXVkaW9TdHJlYW0gPSAoTTRfQXVkaW9TdHJlYW1IYW5kbGVyKilwU3RyZWFtSGFuZGxlcjsKLSAgICAgICAgICAgICAgICAgICAgLyoqPCBLZWVwIHBvaW50ZXIgdG8gdGhlIGF1ZGlvIHN0cmVhbSAqLwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRQVE8zR1BQX09wZW4oKTogRm91bmQgYW4gYXVkaW8gc3RyZWFtIGluIGlucHV0Iik7Ci0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX2JTdHJlYW1Jc09LID0gTTRPU0FfVFJVRTsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICogIEFsbG9jYXRlIGF1ZGlvIEFVIHVzZWQgZm9yIHJlYWQgb3BlcmF0aW9ucyAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUmVhZGVyQXVkaW9BVSA9IChNNF9BY2Nlc3NVbml0KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00X0FjY2Vzc1VuaXQpLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRQVE8zR1BQLChNNE9TQV9DaGFyICopInBSZWFkZXJBdWRpb0FVIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBDLT5tX3BSZWFkZXJBdWRpb0FVKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRQVE8zR1BQX09wZW4oKTogdW5hYmxlIHRvIGFsbG9jYXRlIHBSZWFkZXJBdWRpb0FVLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiAgSW5pdGlhbGl6ZXMgYW4gYWNjZXNzIFVuaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckdsb2JJbnQtPm1fcEZjdEZpbGxBdVN0cnVjdChwQy0+bV9wQXVkaW9SZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLCBwQy0+bV9wUmVhZGVyQXVkaW9BVSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9PcGVuKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWFkZXJHbG9iSW50LT5tX3BGY3RGaWxsQXVTdHJ1Y3QoYXVkaW8pcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fYlN0cmVhbUlzT0sgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChNNFdBUl9OT19NT1JFX1NUUkVBTSAhPSBlcnIpIC8qKjwgVW5leHBlY3RlZCBlcnJvciBjb2RlICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9PcGVuKCk6XAotICAgICAgICAgICAgICAgICAgICAgcFJlYWRlckdsb2JJbnQtPm1fcEZjdEdldE5leHRTdHJlYW0gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9IC8qIHdoaWxlKi8KLSAgICB9IC8qaWYgKE00T1NBX05VTEwgIT0gcEMtPm1fUGFyYW1zLnBJbnB1dEF1ZGlvVHJhY2tGaWxlKSovCi0KLSAgICBwQy0+bV9WaWRlb1N0YXRlID0gTTRQVE8zR1BQX2tTdHJlYW1TdGF0ZV9TVEFSVEVEOwotCi0gICAgLyoqCi0gICAgICogSW5pdCB0aGUgYXVkaW8gc3RyZWFtICovCi0gICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1fcFJlYWRlckF1ZGlvU3RyZWFtKQotICAgIHsKLSAgICAgICAgcEMtPm1fQXVkaW9TdGF0ZSA9IE00UFRPM0dQUF9rU3RyZWFtU3RhdGVfU1RBUlRFRDsKLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckdsb2JJbnQtPm1fcEZjdFJlc2V0KHBDLT5tX3BBdWRpb1JlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciopcEMtPm1fcFJlYWRlckF1ZGlvU3RyZWFtKTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX09wZW4oKTogcFJlYWRlckRhdGFJbnQtPm1fcEZjdFJlc2V0KGF1ZGlvIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFVwZGF0ZSBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBwQy0+bV9TdGF0ZSA9IE00UFRPM0dQUF9rU3RhdGVfT1BFTkVEOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBtYXggRmlsZSBzaXplICovCi0gICAgc3dpdGNoKHBDLT5tX1BhcmFtcy5PdXRwdXRGaWxlTWF4U2l6ZSkKLSAgICB7Ci0gICAgY2FzZSBNNFBUTzNHUFBfazUwX0tCOiAgcEMtPm1fTWF4RmlsZVNpemUgPSA1MDAwMDsgIGJyZWFrOwotICAgIGNhc2UgTTRQVE8zR1BQX2s3NV9LQjogIHBDLT5tX01heEZpbGVTaXplID0gNzUwMDA7ICBicmVhazsKLSAgICBjYXNlIE00UFRPM0dQUF9rMTAwX0tCOiBwQy0+bV9NYXhGaWxlU2l6ZSA9IDEwMDAwMDsgYnJlYWs7Ci0gICAgY2FzZSBNNFBUTzNHUFBfazE1MF9LQjogcEMtPm1fTWF4RmlsZVNpemUgPSAxNTAwMDA7IGJyZWFrOwotICAgIGNhc2UgTTRQVE8zR1BQX2syMDBfS0I6IHBDLT5tX01heEZpbGVTaXplID0gMjAwMDAwOyBicmVhazsKLSAgICBjYXNlIE00UFRPM0dQUF9rMzAwX0tCOiBwQy0+bV9NYXhGaWxlU2l6ZSA9IDMwMDAwMDsgYnJlYWs7Ci0gICAgY2FzZSBNNFBUTzNHUFBfazQwMF9LQjogcEMtPm1fTWF4RmlsZVNpemUgPSA0MDAwMDA7IGJyZWFrOwotICAgIGNhc2UgTTRQVE8zR1BQX2s1MDBfS0I6IHBDLT5tX01heEZpbGVTaXplID0gNTAwMDAwOyBicmVhazsKLSAgICBjYXNlIE00UFRPM0dQUF9rVU5MSU1JVEVEOgotICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRQVE8zR1BQX09wZW4oKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQVE8zR1BQX1N0ZXAoTTRQVE8zR1BQX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgUGVyZm9ybSBvbmUgc3RlcCBvZiB0cmFuY29kaW5nLgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNNFBUTzNHUFAgY29udGV4dAotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgTTRQVE8zR1BQIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBjYWxsZWQKLSAqIEByZXR1cm4gIE00UFRPM0dQUF9XQVJfRU5EX09GX1BST0NFU1NJTkcgRW5jb2RpbmcgY29tcGxldGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNFBUTzNHUFBfU3RlcChNNFBUTzNHUFBfQ29udGV4dCBwQ29udGV4dCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dCopKHBDb250ZXh0KTsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9VSW50MzIgbF91aUF1ZGlvU3RlcENvdW50ID0gMDsKLSAgICBNNE9TQV9JbnQzMiAgSnVtcFRvVGltZSA9IDA7Ci0gICAgTTRPU0FfVGltZSAgbXRJbmNDdHM7Ci0KLSAgICAvKioKLSAgICAgKiAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTD09cENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgIk00UFRPM0dQUF9TdGVwOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKioKLSAgICAgKiAgQ2hlY2sgc3RhdGUgYXV0b21hdG9uICovCi0gICAgaWYgKCAhKChNNFBUTzNHUFBfa1N0YXRlX09QRU5FRCA9PSBwQy0+bV9TdGF0ZSkgfHwgKE00UFRPM0dQUF9rU3RhdGVfUkVBRFkgPT0gcEMtPm1fU3RhdGUpKSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1N0ZXAoKTogV3JvbmcgU3RhdGUgKCVkKSwgcmV0dXJuaW5nIE00RVJSX1NUQVRFIiwgcEMtPm1fU3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKioKLSAgICAgKiAgSW4gY2FzZSB0aGlzIGlzIHRoZSBmaXJzdCBzdGVwLCB3ZSBwcmVwYXJlIHRoZSBkZWNvZGVyLCB0aGUgZW5jb2RlciBhbmQgdGhlIHdyaXRlciAqLwotICAgIGlmIChNNFBUTzNHUFBfa1N0YXRlX09QRU5FRCA9PSBwQy0+bV9TdGF0ZSkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8wKCJNNFBUTzNHUFBfU3RlcCgpOiBUaGlzIGlzIHRoZSBmaXJzdCBzdGVwLCBcCi0gICAgICAgICAgICAgICAgICAgICAgIGNhbGxpbmcgTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3NpbmciKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogIFByZXBhcmUgdGhlIHJlYWRlciwgdGhlIGRlY29kZXIsIHRoZSBlbmNvZGVyLCB0aGUgd3JpdGVyLi4uICovCi0gICAgICAgIGVyciA9IE00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nKHBDKTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1N0ZXAoKTogTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3NpbmcoKSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiAgVXBkYXRlIHN0YXRlIGF1dG9tYXRvbiAqLwotICAgICAgICBwQy0+bV9TdGF0ZSA9IE00UFRPM0dQUF9rU3RhdGVfUkVBRFk7Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00UFRPM0dQUF9TdGVwKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIChhKSIpOwotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsgLyoqPCB3ZSBvbmx5IGRvIHRoYXQgaW4gdGhlIGZpcnN0IHN0ZXAsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0IFJFQUwgc3RlcCB3aWxsIGJlIHRoZSBuZXh0IG9uZSAqLwotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiBDaGVjayBpZiB3ZSByZWFjaGVkIHRoZSB0YXJnZXRlZCBmaWxlIHNpemUuCi0gICAgICogV2UgZG8gdGhhdCBiZWZvcmUgdGhlIGVuY29kaW5nLCBiZWNhdXNlIHRoZSBjb3JlIGVuY29kZXIgaGFzIHRvIGtub3cgaWYgdGhpcyBpcwotICAgICAqIHRoZSBsYXN0IGZyYW1lIHRvIGVuY29kZSAqLwotICAgIGVyciA9IHBDLT5tX3BXcml0ZXJHbG9iSW50LT5wRmN0R2V0T3B0aW9uKHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICBNNFdSSVRFUl9rRmlsZVNpemVBdWRpb0VzdGltYXRlZCwgKE00T1NBX0RhdGFPcHRpb24pICZwQy0+bV9DdXJyZW50RmlsZVNpemUpOwotICAgIGlmICgoMCAhPSBwQy0+bV9NYXhGaWxlU2l6ZSkgJiYKLSAgICAgICAgLyoqPCBBZGQgYSBtYXJnZSB0byB0aGUgZmlsZSBzaXplIGluIG9yZGVyIHRvIG5ldmVyIGV4Y2VlZCB0aGUgbWF4IGZpbGUgc2l6ZSAqLwotICAgICAgICgocEMtPm1fQ3VycmVudEZpbGVTaXplICsgTTRQVE8zR1BQX01BUkdFX09GX0ZJTEVfU0laRSkgPj0gcEMtPm1fTWF4RmlsZVNpemUpKQotICAgIHsKLSAgICAgICAgcEMtPm1fSXNMYXN0UGljdHVyZSA9IE00T1NBX1RSVUU7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICogIEF0IHRoYXQgcG9pbnQgd2UgYXJlIGluIE00UFRPM0dQUF9rU3RhdGVfUkVBRFkgc3RhdGUKLSAgICAqICBXZSBwZXJmb3JtIG9uZSBzdGVwIG9mIHZpZGVvIGVuY29kaW5nCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgLyoqKioqKioqKioqKiogVklERU8gRU5DT0RJTkcgKioqKioqKioqKioqKioqLwotICAgIGlmIChNNFBUTzNHUFBfa1N0cmVhbVN0YXRlX1NUQVJURUQgPT0gcEMtPm1fVmlkZW9TdGF0ZSkgLyoqPElmIHRoZSB2aWRlbyBlbmNvZGluZyBpcyBnb2luZyBvbiovCi0gICAgeyAgIC8qKgotICAgICAgICAgKiBDYWxsIHRoZSBlbmNvZGVyICAqLwotICAgICAgICBwQy0+bV9OYkN1cnJlbnRGcmFtZSsrOwotCi0gICAgICAgIC8qIENoZWNrIGlmIGl0IGlzIHRoZSBsYXN0IGZyYW1lIHRoZSB0byBlbmNvZGUgKi8KLSAgICAgICAgaWYoKHBDLT5tX1BhcmFtcy5OYlZpZGVvRnJhbWVzID4gMCkgXAotICAgICAgICAgICAgJiYgKHBDLT5tX05iQ3VycmVudEZyYW1lID49IHBDLT5tX1BhcmFtcy5OYlZpZGVvRnJhbWVzKSkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPm1fSXNMYXN0UGljdHVyZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBNNE9TQV9UUkFDRTJfMigiTTRQVE8zR1BQX1N0ZXAoKTogQ2FsbGluZyBwRW5jb2RlckludC0+cEZjdEVuY29kZSB3aXRoIHZpZGVvQ3RzID0gJS4yZlwKLSAgICAgICAgICAgICAgICAgICAgICAgbmIgPSAlbHUiLCBwQy0+bV9tdEN0cywgcEMtPm1fTmJDdXJyZW50RnJhbWUpOwotCi0gICAgICAgIGVyciA9IHBDLT5tX3BFbmNvZGVySW50LT5wRmN0RW5jb2RlKHBDLT5tX3BNcDRFbmNvZGVyQ29udGV4dCwgTTRPU0FfTlVMTCwKLSAgICAgICAgICAgIC8qKjwgVGhlIGlucHV0IHBsYW5lIGlzIG51bGwgYmVjYXVzZSB0aGUgaW5wdXQgUGljdHVyZSB3aWxsIGJlIG9idGFpbmVkIGJ5IHRoZVwKLSAgICAgICAgICAgIFZQUCBmaWx0ZXIgZnJvbSB0aGUgY29udGV4dCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX210Q3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwQy0+bV9Jc0xhc3RQaWN0dXJlID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfa0xhc3RGcmFtZSA6IE00RU5DT0RFUl9rTm9ybWFsRnJhbWUpICk7Ci0gICAgICAgIC8qKjwgTGFzdCBwYXJhbSBzZXQgdG8gTTRPU0FfVFJVRSBzaWduYWxzIHRoYXQgdGhpcyBpcyB0aGUgbGFzdCBmcmFtZSB0byBiZSBlbmNvZGVkLFwKLSAgICAgICAgTTRPU0FfRkFMU0UgZWxzZSAqLwotCi0gICAgICAgIE00T1NBX1RSQUNFM18yKCJNNFBUTzNHUFBfU3RlcCgpOiBwRW5jb2RlckludC0+cEZjdEVuY29kZSByZXR1cm5zIDB4JXgsIHZpZEZvcm1hdCA9MHgleCIsCi0gICAgICAgICAgICBlcnIsIHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0Zvcm1hdCk7Ci0gICAgICAgIGlmKChNNE5PX0VSUk9SID09IGVycikgJiYgKE00VklERU9FRElUSU5HX2tIMjY0ID09IHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0Zvcm1hdCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIENoZWNrIGlmIGxhc3QgZnJhbWUuKgotICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZihNNE9TQV9UUlVFID09IHBDLT5tX0lzTGFzdFBpY3R1cmUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00UFRPM0dQUF9TdGVwKCk6IExhc3QgcGljdHVyZSIpOwotICAgICAgICAgICAgICAgIHBDLT5tX1ZpZGVvU3RhdGUgPSBNNFBUTzNHUFBfa1N0cmVhbVN0YXRlX0ZJTklTSEVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICBpZiAoTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIpIC8qKjwgVGhlIHZpZGVvIGVuY29kaW5nIGlzIGZpbmlzaGVkICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFBUTzNHUFBfU3RlcCgpOiBwRW5jb2RlckludC0+cEZjdEVuY29kZSByZXR1cm5zIE00V0FSX05PX01PUkVfQVUiKTsKLSAgICAgICAgICAgIHBDLT5tX1ZpZGVvU3RhdGUgPSBNNFBUTzNHUFBfa1N0cmVhbVN0YXRlX0ZJTklTSEVEOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSAgICAgLyoqPCBVbmV4cGVjdGVkIGVycm9yIGNvZGUgKi8KLSAgICAgICAgewotICAgICAgICAgICAgaWYoICgoKE00T1NBX1VJbnQzMilNNFdBUl9XUklURVJfU1RPUF9SRVEpID09IGVycikgfHwKLSAgICAgICAgICAgICAgICAgICAgKCgoTTRPU0FfVUludDMyKU00RVJSX0FMTE9DKSA9PSBlcnIpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRQVE8zR1BQX1N0ZXA6IHJldHVybmluZyBFUlJfUFRPM0dQUF9FTkNPREVSX0FDQ0VTX1VOSVRfRVJST1IiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJSX1BUTzNHUFBfRU5DT0RFUl9BQ0NFU19VTklUX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfU3RlcCgpOiBwRW5jb2RlckludC0+cEZjdEVuY29kZShsYXN0KSAoYSkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSAvKio8IEVuZCBvZiB2aWRlbyBlbmNvZGluZyAqLwotCi0KLSAgICAvKioqKioqIEFVRElPIFRSQU5TQ09ESU5HIChyZWFkICsgbnVsbCBlbmNvZGluZyArIHdyaXRlKSAqKioqKiovCi0gICAgaWYgKE00UFRPM0dQUF9rU3RyZWFtU3RhdGVfU1RBUlRFRCA9PSBwQy0+bV9BdWRpb1N0YXRlKQotICAgIHsKLSAgICAgICAgd2hpbGUgKCAoTTRQVE8zR1BQX2tTdHJlYW1TdGF0ZV9TVEFSVEVEID09IHBDLT5tX0F1ZGlvU3RhdGUpICYmCi0gICAgICAgICAgICAgICAgKHBDLT5tX210QXVkaW9DdHMgPCBwQy0+bV9tdE5leHRDdHMpKQotCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxfdWlBdWRpb1N0ZXBDb3VudCsrOwotICAgICAgICAgICAgaWYgKE00T1NBX0ZBTFNFID09IHBDLT5tX2JBdWRpb1BhZGRpbmdTaWxlbmNlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKjwgUmVhZCB0aGUgbmV4dCBhdWRpbyBBVSBpbiB0aGUgaW5wdXQgQXVkaW8gZmlsZSAqLwotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXJEYXRhSW50LT5tX3BGY3RHZXROZXh0QXUocEMtPm1fcEF1ZGlvUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbSwgcEMtPm1fcFJlYWRlckF1ZGlvQVUpOwotICAgICAgICAgICAgICAgIHBDLT5tX210QXVkaW9DdHMgPSBwQy0+bV9wUmVhZGVyQXVkaW9BVS0+bV9DVFMgKyBwQy0+bV9BdWRpb09mZlNldDsKLQotICAgICAgICAgICAgICAgIGlmIChNNFdBUl9OT19NT1JFX0FVID09IGVycikgICAgLyogVGhlIGF1ZGlvIHRyYW5zY29kaW5nIGlzIGZpbmlzaGVkICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiTTRQVE8zR1BQX1N0ZXAoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlYWRlckRhdGFJbnQtPm1fcEZjdEdldE5leHRBdShhdWRpbykgcmV0dXJucyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdBUl9OT19NT1JFX0FVIik7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaChwQy0+bV9QYXJhbXMuQXVkaW9QYWRkaW5nTW9kZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFBUTzNHUFBfa0F1ZGlvUGFkZGluZ01vZGVfTm9uZToKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX0F1ZGlvU3RhdGUgPSBNNFBUTzNHUFBfa1N0cmVhbVN0YXRlX0ZJTklTSEVEOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00UFRPM0dQUF9rQXVkaW9QYWRkaW5nTW9kZV9TaWxlbmNlOgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBwQy0+bV9wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBEbyBub3RoaW5nIGlmIHRoZSBpbnB1dCBhdWRpbyBmaWxlIGZvcm1hdCBpcyBub3QgQU1SICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9BdWRpb1N0YXRlID0gTTRQVE8zR1BQX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fYkF1ZGlvUGFkZGluZ1NpbGVuY2UgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFBUTzNHUFBfa0F1ZGlvUGFkZGluZ01vZGVfTG9vcDoKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgSnVtcCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhdWRpbyBmaWxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckdsb2JJbnQtPm1fcEZjdEp1bXAocEMtPm1fcEF1ZGlvUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbSwgJkp1bXBUb1RpbWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9TdGVwKCk6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVhZGVyRGF0YUludC0+bV9wRmN0UmVzZXQoYXVkaW8gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJOYXJyb3dCYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IHBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fbXRBdWRpb0N0cyArPSAyMDsgLyo8IFNFTUMgYnVnIGZpeGVkIGF0IEx1bmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fQXVkaW9PZmZTZXQgPSBwQy0+bV9tdEF1ZGlvQ3RzOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAnQlpaWicgYnVnIGZpeDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYWRkIGEgc2lsZW5jZSBmcmFtZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdEluY0N0cyA9IChNNE9TQV9UaW1lKSgocEMtPm1fbXRBdWRpb0N0cykgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbS0+dGltZVNjYWxlIC8gMTAwMC4wKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00UFRPM0dQUF93cml0ZUFtclNpbGVuY2UxMjJGcmFtZShwQy0+bV9wV3JpdGVyRGF0YUludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0LCAmcEMtPm1fV3JpdGVyQXVkaW9BVSwgbXRJbmNDdHMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9TdGVwKCk6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UFRPM0dQUF9BZGRBbXJTaWxlbmNlU2lkIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LyoqPCBBZGQgPT4gbm8gYXVkaW8gY3RzIGluY3JlbWVudC4uLiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX0F1ZGlvT2ZmU2V0ID0gcEMtPm1fbXRBdWRpb0N0cyArIHBDLT5tX0RlbHRhQXVkaW9DdHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9IC8qIGVuZCBvZjogc3dpdGNoICovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9TdGVwKCk6IHBSZWFkZXJEYXRhSW50LT5tX3BGY3RHZXROZXh0QXUoQXVkaW8pXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICogU2F2ZSB0aGUgZGVsdGEgQ3RzIChBQUMgb25seSkgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fRGVsdGFBdWRpb0N0cyA9IHBDLT5tX3BSZWFkZXJBdWRpb0FVLT5tX0NUUyAtIHBDLT5tX1ByZXZBdWRpb0N0czsKLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fUHJldkF1ZGlvQ3RzICA9IHBDLT5tX3BSZWFkZXJBdWRpb0FVLT5tX0NUUzsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICogIFByZXBhcmUgdGhlIHdyaXRlciBBVSAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+bV9wV3JpdGVyRGF0YUludC0+cFN0YXJ0QVUocEMtPm1fcDNncFdyaXRlckNvbnRleHQsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAmcEMtPm1fV3JpdGVyQXVkaW9BVSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9TdGVwKCk6IHBXcml0ZXJEYXRhSW50LT5wU3RhcnRBVShBdWRpbylcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiAgQ29weSBhdWRpbyBkYXRhIGZyb20gcmVhZGVyIEFVIHRvIHdyaXRlciBBVSAqLwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMSgiTTRQVE8zR1BQX1N0ZXAoKTogQ29weWluZyBhdWRpbyBBVTogc2l6ZT0lZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUmVhZGVyQXVkaW9BVS0+bV9zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPm1fV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPm1fcFJlYWRlckF1ZGlvQVUtPm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUmVhZGVyQXVkaW9BVS0+bV9zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fV3JpdGVyQXVkaW9BVS5zaXplID0gcEMtPm1fcFJlYWRlckF1ZGlvQVUtPm1fc2l6ZTsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICogIENvbnZlcnQgQ1RTIHVuaXQgZnJvbSBtaWxsaXNlY29uZHMgdG8gdGltZXNjYWxlICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChNNERBX1N0cmVhbVR5cGVBdWRpb0Ftck5hcnJvd0JhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICE9IHBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9Xcml0ZXJBdWRpb0FVLkNUUyAgPSAoTTRPU0FfVGltZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBDLT5tX0F1ZGlvT2ZmU2V0ICsgcEMtPm1fcFJlYWRlckF1ZGlvQVUtPm1fQ1RTKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtLT50aW1lU2NhbGUgLyAxMDAwLjApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fV3JpdGVyQXVkaW9BVS5DVFMgPSAoTTRPU0FfVGltZSkocEMtPm1fbXRBdWRpb0N0cyAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbS0+dGltZVNjYWxlIC8gMTAwMC4wKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fV3JpdGVyQXVkaW9BVS5uYkZyYWcgPSAwOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMSgiTTRQVE8zR1BQX1N0ZXAoKTogYXVkaW8gQVU6IENUUz0lZCBtcyIsIHBDLT5tX210QXVkaW9DdHMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qcEMtPm1fcFJlYWRlckF1ZGlvQVUtPm1fQ1RTKi8pOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiAgV3JpdGUgaXQgdG8gdGhlIG91dHB1dCBmaWxlICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5tX3BXcml0ZXJEYXRhSW50LT5wUHJvY2Vzc0FVKHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0LCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJnBDLT5tX1dyaXRlckF1ZGlvQVUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9TdGVwKCk6IHBXcml0ZXJEYXRhSW50LT5wUHJvY2Vzc0FVKEF1ZGlvKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSAvKio8IE00T1NBX1RSVUUgPT0gcEMtPm1fYkF1ZGlvUGFkZGluZ1NpbGVuY2UgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJOYXJyb3dCYW5kID09Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIEZpbGwgaW4gYXVkaW8gYXUgd2l0aCBzaWxlbmNlICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5tX210QXVkaW9DdHMgKz0gMjA7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIFBhZGQgd2l0aCBzaWxlbmNlICovCi0gICAgICAgICAgICAgICAgICAgIG10SW5jQ3RzID0gKE00T1NBX1RpbWUpKHBDLT5tX210QXVkaW9DdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICogKHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbS0+dGltZVNjYWxlIC8gMTAwMC4wKSk7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00UFRPM0dQUF93cml0ZUFtclNpbGVuY2UwNDhGcmFtZShwQy0+bV9wV3JpdGVyRGF0YUludCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0LCAmcEMtPm1fV3JpdGVyQXVkaW9BVSwgbXRJbmNDdHMpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9TdGVwKCk6IE00UFRPM0dQUF9BZGRBbXJTaWxlbmNlU2lkIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSAvKio8IERvIG5vdGhpbmcgaWYgdGhlIGlucHV0IGF1ZGlvIGZpbGUgZm9ybWF0IGlzIG5vdCBBTVIgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5tX0F1ZGlvU3RhdGUgPSBNNFBUTzNHUFBfa1N0cmVhbVN0YXRlX0ZJTklTSEVEOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICB9IC8qKjwgd2hpbGUgKi8KLSAgICB9IC8qKjwgRW5kIG9mIGF1ZGlvIGVuY29kaW5nICovCi0KLSAgICBwQy0+bV9tdEN0cyA9IHBDLT5tX210TmV4dEN0czsKLQotICAgIC8qKgotICAgICAqICBUaGUgdHJhbnNjb2RpbmcgaXMgZmluaXNoZWQgd2hlbiBubyBzdHJlYW0gaXMgYmVpbmcgZW5jb2RlZCBhbnltb3JlICovCi0gICAgaWYgKE00UFRPM0dQUF9rU3RyZWFtU3RhdGVfRklOSVNIRUQgPT0gcEMtPm1fVmlkZW9TdGF0ZSkKLSAgICB7Ci0gICAgICAgIHBDLT5tX1N0YXRlID0gTTRQVE8zR1BQX2tTdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIk00UFRPM0dQUF9TdGVwKCk6IHRyYW5zY29kaW5nIGZpbmlzaGVkLCByZXR1cm5pbmcgTTRXQVJfTk9fTU9SRV9BVSIpOwotICAgICAgICByZXR1cm4gTTRQVE8zR1BQX1dBUl9FTkRfT0ZfUFJPQ0VTU0lORzsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRQVE8zR1BQX1N0ZXAoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IgKGIpIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UFRPM0dQUF9DbG9zZShNNFBUTzNHUFBfQ29udGV4dCBwQ29udGV4dCk7Ci0gKiBAYnJpZWYgICBGaW5pc2ggdGhlIE00UFRPM0dQUCB0cmFuc2NvZGluZy4KLSAqIEBub3RlICAgIFRoZSBvdXRwdXQgM0dQUCBmaWxlIGlzIHJlYWR5IHRvIGJlIHBsYXllZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNNFBUTzNHUFAgY29udGV4dAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChJZiBEZWJ1ZyBMZXZlbCA+PSAyKQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgIE00UFRPM0dQUCBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNFBUTzNHUFBfQ2xvc2UoTTRQVE8zR1BQX0NvbnRleHQgcENvbnRleHQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQgKnBDID0gKE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQqKShwQ29udGV4dCk7Ci0gICAgTTRPU0FfRVJSICAgIG9zYUVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfVUludDMyIGxhc3RDVFM7Ci0gICAgTTRFTkNPREVSX0hlYWRlciogZW5jSGVhZGVyOwotICAgIE00U1lTX1N0cmVhbUlEbWVtQWRkciBzdHJlYW1IZWFkZXI7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRQVE8zR1BQX0Nsb3NlIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgiLCBwQ29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAgKiAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTD09cENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsICJNNFBUTzNHUFBfQ2xvc2U6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qIENoZWNrIHN0YXRlIGF1dG9tYXRvbiAqLwotICAgIGlmICgocEMtPm1fU3RhdGUgIT0gTTRQVE8zR1BQX2tTdGF0ZV9PUEVORUQpICYmCi0gICAgICAgIChwQy0+bV9TdGF0ZSAhPSBNNFBUTzNHUFBfa1N0YXRlX1JFQURZKSAmJgotICAgICAgICAocEMtPm1fU3RhdGUgIT0gTTRQVE8zR1BQX2tTdGF0ZV9GSU5JU0hFRCkpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX0Nsb3NlKCk6IFdyb25nIFN0YXRlICglZCksIHJldHVybmluZyBNNEVSUl9TVEFURSIsIHBDLT5tX1N0YXRlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qKioqKioqKiBGaW5pc2ggdGhlIGVuY29kaW5nICoqKioqKioqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIGlmIChNNFBUTzNHUFBfa1N0YXRlX1JFQURZID09IHBDLT5tX1N0YXRlKQotICAgIHsKLSAgICAgICAgcEMtPm1fU3RhdGUgPSBNNFBUTzNHUFBfa1N0YXRlX0ZJTklTSEVEOwotICAgIH0KLQotICAgIGlmIChNNFBUTzNHUFBfa0VuY29kZXJSdW5uaW5nID09IHBDLT5tX2VFbmNvZGVyU3RhdGUpCi0gICAgewotICAgICAgICBpZiAocEMtPm1fcEVuY29kZXJJbnQtPnBGY3RTdG9wICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG9zYUVyciA9IHBDLT5tX3BFbmNvZGVySW50LT5wRmN0U3RvcChwQy0+bV9wTXA0RW5jb2RlckNvbnRleHQpOwotICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gb3NhRXJyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfY2xvc2U6IG1fcEVuY29kZXJJbnQtPnBGY3RTdG9wIHJldHVybnMgMHgleCIsIG9zYUVycik7Ci0gICAgICAgICAgICAgICAgLyogV2VsbC4uLiBob3cgdGhlIGhlY2sgZG8geW91IGhhbmRsZSBhIGZhaWxlZCBjbGVhbnVwPyAqLwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcEMtPm1fZUVuY29kZXJTdGF0ZSA9IE00UFRPM0dQUF9rRW5jb2RlclN0b3BwZWQ7Ci0gICAgfQotCi0gICAgLyogSGFzIHRoZSBlbmNvZGVyIGFjdHVhbGx5IGJlZW4gb3BlbmVkPyBEb24ndCBjbG9zZSBpdCBpZiB0aGF0J3Mgbm90IHRoZSBjYXNlLiAqLwotICAgIGlmIChNNFBUTzNHUFBfa0VuY29kZXJTdG9wcGVkID09IHBDLT5tX2VFbmNvZGVyU3RhdGUpCi0gICAgewotICAgICAgICBvc2FFcnIgPSBwQy0+bV9wRW5jb2RlckludC0+cEZjdENsb3NlKHBDLT5tX3BNcDRFbmNvZGVyQ29udGV4dCk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IG9zYUVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9jbG9zZTogbV9wRW5jb2RlckludC0+cEZjdENsb3NlIHJldHVybnMgMHgleCIsIG9zYUVycik7Ci0gICAgICAgICAgICAvKiBXZWxsLi4uIGhvdyB0aGUgaGVjayBkbyB5b3UgaGFuZGxlIGEgZmFpbGVkIGNsZWFudXA/ICovCi0gICAgICAgIH0KLQotICAgICAgICBwQy0+bV9lRW5jb2RlclN0YXRlID0gTTRQVE8zR1BQX2tFbmNvZGVyQ2xvc2VkOwotICAgIH0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qKioqKioqKiBDbG9zZSAzR1Agb3V0ICoqKioqKioqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1fcDNncFdyaXRlckNvbnRleHQpICAvKiBoYXBwZW5zIGluIHN0YXRlIF9TRVQgKi8KLSAgICB7Ci0gICAgICAgIC8qIEhXIGVuY29kZXI6IGZldGNoIHRoZSBEU0kgZnJvbSB0aGUgc2hlbGwgdmlkZW8gZW5jb2RlciwgYW5kIGZlZWQgaXQgdG8gdGhlIHdyaXRlciBiZWZvcmUKLSAgICAgICAgY2xvc2luZyBpdC4gKi8KLSAgICAgICAgaWYgKChNNFZJREVPRURJVElOR19rTVBFRzQgPT0gcEMtPm1fUGFyYW1zLk91dHB1dFZpZGVvRm9ybWF0KQotICAgICAgICAgICAgfHwgKE00VklERU9FRElUSU5HX2tIMjY0ID09IHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0Zvcm1hdCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG9zYUVyciA9IHBDLT5tX3BFbmNvZGVySW50LT5wRmN0R2V0T3B0aW9uKHBDLT5tX3BNcDRFbmNvZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICBNNEVOQ09ERVJfa09wdGlvbklEX0VuY29kZXJIZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikmZW5jSGVhZGVyKTsKLSAgICAgICAgICAgIGlmICggKE00Tk9fRVJST1IgIT0gb3NhRXJyKSB8fCAoTTRPU0FfTlVMTCA9PSBlbmNIZWFkZXItPnBCdWYpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX2Nsb3NlOiBmYWlsZWQgdG8gZ2V0IHRoZSBlbmNvZGVyIGhlYWRlciAoZXJyIDB4JXgpIiwKLSAgICAgICAgICAgICAgICAgICAgb3NhRXJyKTsKLSAgICAgICAgICAgICAgICAvKio8IG5vIHJldHVybiBoZXJlLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGRlYWxsb2NhdGUgYWZ0ZXIgY2xvc2UsIGV2ZW4gaWYgXAotICAgICAgICAgICAgICAgIGl0IGZhaWxzLiAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIHNldCB0aGlzIGhlYWRlciBpbiB0aGUgd3JpdGVyICovCi0gICAgICAgICAgICAgICAgc3RyZWFtSGVhZGVyLnN0cmVhbUlEID0gTTRQVE8zR1BQX1dSSVRFUl9WSURFT19TVFJFQU1fSUQ7Ci0gICAgICAgICAgICAgICAgc3RyZWFtSGVhZGVyLnNpemUgPSBlbmNIZWFkZXItPlNpemU7Ci0gICAgICAgICAgICAgICAgc3RyZWFtSGVhZGVyLmFkZHIgPSAoTTRPU0FfTWVtQWRkcjMyKWVuY0hlYWRlci0+cEJ1ZjsKLSAgICAgICAgICAgICAgICBvc2FFcnIgPSBwQy0+bV9wV3JpdGVyR2xvYkludC0+cEZjdFNldE9wdGlvbihwQy0+bV9wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfa0RTSSwgJnN0cmVhbUhlYWRlcik7Ci0gICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gb3NhRXJyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9jbG9zZTogZmFpbGVkIHRvIHNldCB0aGUgRFNJIGluIHRoZSB3cml0ZXIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXJyIDB4JXgpICAgIiwgb3NhRXJyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBVcGRhdGUgbGFzdCBWaWRlbyBDVFMgKi8KLSAgICAgICAgbGFzdENUUyA9IChNNE9TQV9VSW50MzIpcEMtPm1fbXRDdHM7Ci0KLSAgICAgICAgb3NhRXJyID0gcEMtPm1fcFdyaXRlckdsb2JJbnQtPnBGY3RTZXRPcHRpb24ocEMtPm1fcDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNYXhGaWxlRHVyYXRpb24sICZsYXN0Q1RTKTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gb3NhRXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX0Nsb3NlOiBTZXRPcHRpb24oTTRXUklURVJfa01heEZpbGVEdXJhdGlvbikgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBvc2FFcnIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogV3JpdGUgYW5kIGNsb3NlIHRoZSAzR1Agb3V0cHV0IGZpbGUgKi8KLSAgICAgICAgb3NhRXJyID0gcEMtPm1fcFdyaXRlckdsb2JJbnQtPnBGY3RDbG9zZVdyaXRlKHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0KTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gb3NhRXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX0Nsb3NlOiBwV3JpdGVyR2xvYkludC0+cEZjdENsb3NlV3JpdGUgcmV0dXJucyAweCV4Iiwgb3NhRXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuIHlldCwgd2UgaGF2ZSB0byBjbG9zZSBvdGhlciB0aGluZ3MgKi8KLSAgICAgICAgfQotICAgICAgICBwQy0+bV9wM2dwV3JpdGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhdGUgdHJhbnNpdGlvbiAqLwotICAgIHBDLT5tX1N0YXRlID0gTTRQVE8zR1BQX2tTdGF0ZV9DTE9TRUQ7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRQVE8zR1BQX0Nsb3NlKCk6IHJldHVybmluZyAweCV4Iiwgb3NhRXJyKTsKLSAgICByZXR1cm4gb3NhRXJyOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UFRPM0dQUF9DbGVhblVwKE00UFRPM0dQUF9Db250ZXh0IHBDb250ZXh0KTsKLSAqIEBicmllZiAgIEZyZWUgYWxsIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBNNFBUTzNHUFAuCi0gKiBAbm90ZSAgICBUaGUgY29udGV4dCBpcyBubyBtb3JlIHZhbGlkIGFmdGVyIHRoaXMgY2FsbAotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE00UFRPM0dQUCBjb250ZXh0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKElmIERlYnVnIExldmVsID49IDIpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNFBUTzNHUFBfQ2xlYW5VcChNNFBUTzNHUFBfQ29udGV4dCBwQ29udGV4dCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dCopKHBDb250ZXh0KTsKLQotICAgIE00T1NBX1RSQUNFM18xKCJNNFBUTzNHUFBfQ2xlYW5VcCBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4IiwgcENvbnRleHQpOwotCi0gICAgLyoqCi0gICAgICogIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEw9PXBDb250ZXh0KSxNNEVSUl9QQVJBTUVURVIsICJNNFBUTzNHUFBfQ2xlYW5VcDogcENvbnRleHQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgICogIEZpcnN0IGNhbGwgQ2xvc2UsIGlmIG5lZWRlZCwgdG8gY2xlYW4gdGhlIHZpZGVvIGVuY29kZXIgKi8KLQotICAgIGlmICgoTTRQVE8zR1BQX2tTdGF0ZV9PUEVORUQgPT0gcEMtPm1fU3RhdGUpIHx8IChNNFBUTzNHUFBfa1N0YXRlX1JFQURZID09IHBDLT5tX1N0YXRlKQotICAgICAgICB8fCAoTTRQVE8zR1BQX2tTdGF0ZV9GSU5JU0hFRCA9PSBwQy0+bV9TdGF0ZSkpCi0gICAgewotICAgICAgICBlcnIgPSBNNFBUTzNHUFBfQ2xvc2UocENvbnRleHQpOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfQ2xlYW5VcDogTTRQVE8zR1BQX0Nsb3NlIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAvKio8IGRvbid0IHJldHVybiwgd2UgaGF2ZSB0byBmcmVlIG90aGVyIGNvbXBvbmVudHMgKi8KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqICBGcmVlIEF1ZGlvIHJlYWRlciBzdHVmZiwgaWYgbmVlZGVkICovCi0KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wQXVkaW9SZWFkZXJDb250ZXh0KSAvKio8IG1heSBiZSBNNE9TQV9OVUxMIGlmIE00UFRPM0dQUF9PcGVuIHdhcyBub3RcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVkICovCi0gICAgewotCi0gICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXJHbG9iSW50LT5tX3BGY3RDbG9zZShwQy0+bV9wQXVkaW9SZWFkZXJDb250ZXh0KTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX0NsZWFuVXA6IHBSZWFkZXJHbG9iSW50LT5tX3BGY3RDbG9zZSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4sIHdlIGhhdmUgdG8gZnJlZSBvdGhlciBjb21wb25lbnRzICovCi0gICAgICAgIH0KLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckdsb2JJbnQtPm1fcEZjdERlc3Ryb3kocEMtPm1fcEF1ZGlvUmVhZGVyQ29udGV4dCk7Ci0gICAgICAgIHBDLT5tX3BBdWRpb1JlYWRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfQ2xlYW5VcDogcFJlYWRlckdsb2JJbnQtPm1fcEZjdERlc3Ryb3kgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBoYXZlIHRvIGZyZWUgb3RoZXIgY29tcG9uZW50cyAqLwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1fcFJlYWRlckF1ZGlvQVUpCi0gICAgewotICAgICAgICBmcmVlKHBDLT5tX3BSZWFkZXJBdWRpb0FVKTsKLSAgICAgICAgcEMtPm1fcFJlYWRlckF1ZGlvQVUgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBGcmVlIHZpZGVvIGVuY29kZXIgc3R1ZmYsIGlmIG5lZWRlZCAqLwotICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX3BNcDRFbmNvZGVyQ29udGV4dCkKLSAgICB7Ci0gICAgICAgIGVyciA9IHBDLT5tX3BFbmNvZGVySW50LT5wRmN0Q2xlYW51cChwQy0+bV9wTXA0RW5jb2RlckNvbnRleHQpOwotICAgICAgICBwQy0+bV9wTXA0RW5jb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfQ2xlYW5VcDogcEVuY29kZXJJbnQtPnBGY3REZXN0cm95IHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAvKio8IGRvbid0IHJldHVybiwgd2UgaGF2ZSB0byBmcmVlIG90aGVyIGNvbXBvbmVudHMgKi8KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbSkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtKTsKLSAgICAgICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0pOwotICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0gPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW1JbmZvKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW1JbmZvKTsKLSAgICAgICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbUluZm8pCi0gICAgewotICAgICAgICBmcmVlKHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbUluZm8pOwotICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW1JbmZvID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqICBGcmVlIHRoZSBzaGVsbHMgaW50ZXJmYWNlcyAqLwotICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX3BSZWFkZXJHbG9iSW50KQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+bV9wUmVhZGVyR2xvYkludCk7Ci0gICAgICAgIHBDLT5tX3BSZWFkZXJHbG9iSW50ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1fcFJlYWRlckRhdGFJbnQpCi0gICAgewotICAgICAgICBmcmVlKHBDLT5tX3BSZWFkZXJEYXRhSW50KTsKLSAgICAgICAgcEMtPm1fcFJlYWRlckRhdGFJbnQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKE00T1NBX05VTEwgIT0gcEMtPm1fcEVuY29kZXJJbnQpCi0gICAgewotICAgICAgICBmcmVlKHBDLT5tX3BFbmNvZGVySW50KTsKLSAgICAgICAgcEMtPm1fcEVuY29kZXJJbnQgPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5tX3BXcml0ZXJHbG9iSW50KQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+bV9wV3JpdGVyR2xvYkludCk7Ci0gICAgICAgIHBDLT5tX3BXcml0ZXJHbG9iSW50ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgaWYoTTRPU0FfTlVMTCAhPSBwQy0+bV9wV3JpdGVyRGF0YUludCkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPm1fcFdyaXRlckRhdGFJbnQpOwotICAgICAgICBwQy0+bV9wV3JpdGVyRGF0YUludCA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIC8qKjwgRG8gbm90IGZyZWUgcEMtPnBPc2FNZW1vcnlQdHJGY3QgYW5kIHBDLT5wT3NhTWVtb3J5UHRyRmN0LCBiZWNhdXNlIGl0J3Mgb3duZWQgYnkgdGhlIFwKLSAgICBhcHBsaWNhdGlvbiAqLwotCi0gICAgLyoqCi0gICAgICogIEZyZWUgdGhlIGNvbnRleHQgaXRzZWxmICovCi0gICAgZnJlZShwQyk7Ci0gICAgcEMgPSBNNE9TQV9OVUxMOwotCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00UFRPM0dQUF9DbGVhblVwKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKiogSU5URVJOQUwgRlVOQ1RJT05TICoqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3NpbmcoTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dCogcEMpOwotICogQGJyaWVmICAgUHJlcGFyZSBhbGwgcmVzb3VyY2VzIGFuZCBpbnRlcmZhY2VzIGZvciB0aGUgdHJhbnNjb2RpbmcuCi0gKiBAbm90ZSAgICBJdCBpcyBjYWxsZWQgYnkgdGhlIGZpcnN0IE00T1NBX1N0ZXAoKSBjYWxsCi0gKiBAcGFyYW0gICBwQyAgICAgICAgICAoSU4pIE00UFRPM0dQUCBwcml2YXRlIGNvbnRleHQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6IE5vIGVycm9yCi0gKiBAcmV0dXJuICBBbnkgZXJyb3IgcmV0dXJuZWQgYnkgYW4gdW5kZXJsYXlpbmcgbW9kdWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZyhNNFBUTzNHUFBfSW50ZXJuYWxDb250ZXh0KiBwQykKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFdSSVRFUl9PdXRwdXRGaWxlVHlwZSBvdXRwdXRGaWxlVHlwZTsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1aVZlcnNpb247Ci0gICAgTTRFTkNPREVSX0Zvcm1hdCAgICAgICAgZW5jRm9ybWF0OwotICAgIE00RU5DT0RFUl9BZHZhbmNlZFBhcmFtcyAgIEVuY1BhcmFtczsgICAgLyoqPCBFbmNvZGVyIGFkdmFuY2VkIHBhcmFtZXRlcnMgKi8KLSAgICBNNFNZU19TdHJlYW1JRFZhbHVlICAgICBvcHRpb25WYWx1ZTsKLQotICAgIE00T1NBX1RSQUNFM18xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZyBjYWxsZWQgd2l0aCBwQz0weCV4IiwgcEMpOwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKi8KLSAgICAvKioqKioqKiogVmlkZW8gRW5jb2RlciBQYXJhbWVzIGluaXQgKioqKioqKiovCi0gICAgLyoqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIC8qKgotICAgICAqICBHZXQgdGhlIGNvcnJlY3QgZW5jb2RlciBpbnRlcmZhY2UgKi8KLSAgICBzd2l0Y2gocEMtPm1fUGFyYW1zLk91dHB1dFZpZGVvRm9ybWF0KQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTVBFRzQ6Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX01QRUc0Ci0gICAgICAgICAgICAgICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX01QRUc0KCZlbmNGb3JtYXQsICZwQy0+bV9wRW5jb2RlckludCwKLSAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX09QRU5fQURWQU5DRUQpOwotI2Vsc2UgLyogc29mdHdhcmUgTVBFRzQgZW5jb2RlciBub3QgYXZhaWxhYmxlISAqLwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJObyBNUEVHNCBlbmNvZGVyIGF2YWlsYWJsZSEgRGlkIHlvdSBmb3JnZXQgdG8gcmVnaXN0ZXIgb25lPyIpOwotICAgICAgICAgICAgICAgIGVyciA9IE00RVJSX1NUQVRFOwotI2VuZGlmIC8qIHNvZnR3YXJlIE1QRUc0IGVuY29kZXIgYXZhaWxhYmxlPyAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0gyNjM6Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX01QRUc0Ci0gICAgICAgICAgICAgICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0gyNjMoJmVuY0Zvcm1hdCwgJnBDLT5tX3BFbmNvZGVySW50LAotICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfT1BFTl9BRFZBTkNFRCk7Ci0jZWxzZSAvKiBzb2Z0d2FyZSBIMjYzIGVuY29kZXIgbm90IGF2YWlsYWJsZSEgKi8KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTm8gSDI2MyBlbmNvZGVyIGF2YWlsYWJsZSEgRGlkIHlvdSBmb3JnZXQgdG8gcmVnaXN0ZXIgb25lPyIpOwotICAgICAgICAgICAgICAgIGVyciA9IE00RVJSX1NUQVRFOwotI2VuZGlmIC8qIHNvZnR3YXJlIEgyNjMgZW5jb2RlciBhdmFpbGFibGU/ICovCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2NDoKLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfQVZDCi0gICAgICAgICAgICAgICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0gyNjQoJmVuY0Zvcm1hdCwgJnBDLT5tX3BFbmNvZGVySW50LAotICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfT1BFTl9BRFZBTkNFRCk7Ci0jZWxzZSAvKiBzb2Z0d2FyZSBIMjY0IGVuY29kZXIgbm90IGF2YWlsYWJsZSEgKi8KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IE5vIEgyNjQgZW5jb2RlciBhdmFpbGFibGUhXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpZCB5b3UgZm9yZ2V0IHRvIHJlZ2lzdGVyIG9uZT8iKTsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9TVEFURTsKLSNlbmRpZiAvKiBzb2Z0d2FyZSBIMjY0IGVuY29kZXIgYXZhaWxhYmxlPyAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IHVua25vd24gZm9ybWF0IDB4JXggcmV0dXJuaW5nIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9NNFBUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GT1JNQVQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fUGFyYW1zLk91dHB1dFZpZGVvRm9ybWF0KTsKLSAgICAgICAgICAgIHJldHVybiBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZPUk1BVDsKLSAgICB9Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoInN3aXRjaChwQy0+bV9QYXJhbXMuT3V0cHV0VmlkZW9Gb3JtYXQpOiBnZXRJbnRlcmZhY2VzIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEZpbGwgZW5jb2RlciBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byBNNFBUTzNHUFAgc2V0dGluZ3MgKi8KLQotICAgIC8qKgotICAgICAqIFZpZGVvIGZyYW1lIHNpemUgKi8KLSAgICBzd2l0Y2gocEMtPm1fUGFyYW1zLk91dHB1dFZpZGVvRnJhbWVTaXplKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rU1FDSUYgOgotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gTTRFTkNPREVSX1NRQ0lGX0hlaWdodDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZVdpZHRoICA9IE00RU5DT0RFUl9TUUNJRl9XaWR0aDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRUVZHQSA6Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVIZWlnaHQgPSBNNEVOQ09ERVJfUVFWR0FfSGVpZ2h0OwotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lV2lkdGggID0gTTRFTkNPREVSX1FRVkdBX1dpZHRoOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FDSUYgOgotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gTTRFTkNPREVSX1FDSUZfSGVpZ2h0OwotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lV2lkdGggID0gTTRFTkNPREVSX1FDSUZfV2lkdGg7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUVZHQSA6Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVIZWlnaHQgPSBNNEVOQ09ERVJfUVZHQV9IZWlnaHQ7Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVXaWR0aCAgPSBNNEVOQ09ERVJfUVZHQV9XaWR0aDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tDSUYgOgotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gTTRFTkNPREVSX0NJRl9IZWlnaHQ7Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVXaWR0aCAgPSBNNEVOQ09ERVJfQ0lGX1dpZHRoOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1ZHQSA6Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVIZWlnaHQgPSBNNEVOQ09ERVJfVkdBX0hlaWdodDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZVdpZHRoICA9IE00RU5DT0RFUl9WR0FfV2lkdGg7Ci0gICAgICAgICAgICBicmVhazsKLS8qICtQUiBMVjU4MDcgKi8KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rV1ZHQSA6Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVIZWlnaHQgPSBNNEVOQ09ERVJfV1ZHQV9IZWlnaHQ7Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVXaWR0aCAgPSBNNEVOQ09ERVJfV1ZHQV9XaWR0aDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tOVFNDOgotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gTTRFTkNPREVSX05UU0NfSGVpZ2h0OwotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lV2lkdGggID0gTTRFTkNPREVSX05UU0NfV2lkdGg7Ci0gICAgICAgICAgICBicmVhazsKLS8qIC1QUiBMVjU4MDcgKi8KLS8qICtDUiBHb29nbGUgKi8KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNjQwXzM2MDoKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZUhlaWdodCA9IE00RU5DT0RFUl82NDBfMzYwX0hlaWdodDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZVdpZHRoICA9IE00RU5DT0RFUl82NDBfMzYwX1dpZHRoOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rODU0XzQ4MDoKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZUhlaWdodCA9IE00RU5DT0RFUl84NTRfNDgwX0hlaWdodDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZVdpZHRoICA9IE00RU5DT0RFUl84NTRfNDgwX1dpZHRoOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTI4MF83MjA6Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVIZWlnaHQgPSBNNEVOQ09ERVJfMTI4MF83MjBfSGVpZ2h0OwotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lV2lkdGggID0gTTRFTkNPREVSXzEyODBfNzIwX1dpZHRoOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTA4MF83MjA6Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVIZWlnaHQgPSBNNEVOQ09ERVJfMTA4MF83MjBfSGVpZ2h0OwotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lV2lkdGggID0gTTRFTkNPREVSXzEwODBfNzIwX1dpZHRoOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rOTYwXzcyMDoKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZUhlaWdodCA9IE00RU5DT0RFUl85NjBfNzIwX0hlaWdodDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZVdpZHRoICA9IE00RU5DT0RFUl85NjBfNzIwX1dpZHRoOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTkyMF8xMDgwOgotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gTTRFTkNPREVSXzE5MjBfMTA4MF9IZWlnaHQ7Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVXaWR0aCAgPSBNNEVOQ09ERVJfMTkyMF8xMDgwX1dpZHRoOwotICAgICAgICAgICAgYnJlYWs7Ci0vKiAtQ1IgR29vZ2xlICovCi0gICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiB1bmtub3duIGZvcm1hdCAweCV4IHJldHVybmluZyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJfTTRQVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfU0laRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9QYXJhbXMuT3V0cHV0VmlkZW9GcmFtZVNpemUpOwotICAgICAgICAgICAgcmV0dXJuIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfU0laRTsKLSAgICB9Ci0KLSAgICBFbmNQYXJhbXMuSW5wdXRGb3JtYXQgPSBNNEVOQ09ERVJfa0lZVVY0MjA7Ci0KLSAgICAvKioKLSAgICAgKiBWaWRlbyBiaXRyYXRlICovCi0gICAgc3dpdGNoKHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0JpdHJhdGUpCi0gICAgewotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxNl9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syNF9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2szMl9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s0OF9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s2NF9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s5Nl9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMjhfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTkyX0tCUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazI1Nl9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syODhfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMzg0X0tCUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazUxMl9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s4MDBfS0JQUzoKLS8qKyBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syX01CUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazVfTUJQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rOF9NQlBTOgotLyotIE5ldyBFbmNvZGVyIGJpdHJhdGVzICovCi0gICAgICAgICAgICBFbmNQYXJhbXMuQml0cmF0ZSA9IHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0JpdHJhdGU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tWQVJJQUJMRV9LQlBTOgotLyorIE5ldyBFbmNvZGVyIGJpdHJhdGVzICovCi0gICAgICAgICAgICBFbmNQYXJhbXMuQml0cmF0ZSA9IE00VklERU9FRElUSU5HX2s4X01CUFM7Ci0vKi0gTmV3IEVuY29kZXIgYml0cmF0ZXMgKi8KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiB1bmtub3duIGZvcm1hdCAweCV4IHJldHVybmluZ1wKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9NNFBUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19CSVRSQVRFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0JpdHJhdGUpOwotICAgICAgICAgICAgcmV0dXJuIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fQklUUkFURTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWaWRlbyBmb3JtYXQgKi8KLSAgICBzd2l0Y2gocEMtPm1fUGFyYW1zLk91dHB1dFZpZGVvRm9ybWF0KQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTVBFRzQgOgotICAgICAgICAgICAgRW5jUGFyYW1zLkZvcm1hdCAgICA9IE00RU5DT0RFUl9rTVBFRzQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2MyA6Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRm9ybWF0ICAgID0gTTRFTkNPREVSX2tIMjYzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0gyNjQ6Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRm9ybWF0ICAgID0gTTRFTkNPREVSX2tIMjY0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiB1bmtub3duIGZvcm1hdCAweCV4IHJldHVybmluZ1wKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9NNFBUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GT1JNQVQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fUGFyYW1zLk91dHB1dFZpZGVvRm9ybWF0KTsKLSAgICAgICAgICAgIHJldHVybiBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWaWRlbyBmcmFtZSByYXRlIChzZXQgaXQgdG8gbWF4ID0gMzAgZnBzKSAqLwotICAgIEVuY1BhcmFtcy51aVRpbWVTY2FsZSA9IDMwOwotICAgIEVuY1BhcmFtcy51aVJhdGVGYWN0b3IgPSAxOwotCi0gICAgRW5jUGFyYW1zLkZyYW1lUmF0ZSA9IE00RU5DT0RFUl9rMzBfRlBTOwotCi0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qKioqKioqKiAzR1Agb3V0IGluaXQgKioqKioqKiovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIC8qIEdldCB0aGUgM0dQUCB3cml0ZXIgaW50ZXJmYWNlICovCi0gICAgZXJyID0gTTRXUklURVJfM0dQX2dldEludGVyZmFjZXMoJm91dHB1dEZpbGVUeXBlLCAmcEMtPm1fcFdyaXRlckdsb2JJbnQsICZwQy0+bV9wV3JpdGVyRGF0YUludCk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00V1JJVEVSXzNHUF9nZXRJbnRlcmZhY2VzOiBNNFdSSVRFUl8zR1BfZ2V0SW50ZXJmYWNlcyByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qIEluaXQgdGhlIDNHUFAgd3JpdGVyICovCi0gICAgZXJyID0gcEMtPm1fcFdyaXRlckdsb2JJbnQtPnBGY3RPcGVuKCZwQy0+bV9wM2dwV3JpdGVyQ29udGV4dCwgcEMtPm1fUGFyYW1zLnBPdXRwdXQzZ3BwRmlsZSwKLSAgICAgICAgcEMtPnBPc2FsRmlsZVdyaXRlLCBwQy0+bV9QYXJhbXMucFRlbXBvcmFyeUZpbGUsIHBDLT5wT3NhbEZpbGVSZWFkKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IHBXcml0ZXJHbG9iSW50LT5wRmN0T3BlbiByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBMaW5rIHRvIHRoZSB3cml0ZXIgY29udGV4dCBpbiB0aGUgd3JpdGVyIGludGVyZmFjZSAqLwotICAgIHBDLT5tX3BXcml0ZXJEYXRhSW50LT5wV3JpdGVyQ29udGV4dCA9IHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0OwotCi0gICAgLyoqCi0gICAgICogIFNldCB0aGUgcHJvZHVjdCBkZXNjcmlwdGlvbiBzdHJpbmcgaW4gdGhlIHdyaXR0ZW4gZmlsZSAqLwotICAgIGVyciA9IHBDLT5tX3BXcml0ZXJHbG9iSW50LT5wRmN0U2V0T3B0aW9uKHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0LCBNNFdSSVRFUl9rRW1iZWRkZWRTdHJpbmcsCi0gICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKU00UFRPM0dQUF9TSUdOQVRVUkUpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZzogXAotICAgICAgICAgICAgICAgICAgICAgICBwV3JpdGVyR2xvYkludC0+cEZjdFNldE9wdGlvbihNNFdSSVRFUl9rRW1iZWRkZWRTdHJpbmcpIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFNldCB0aGUgcHJvZHVjdCB2ZXJzaW9uIGluIHRoZSB3cml0dGVuIGZpbGUgKi8KLSAgICB1aVZlcnNpb24gPSBNNFZJREVPRURJVElOR19WRVJTSU9OX01BSk9SKjEwMCArIE00VklERU9FRElUSU5HX1ZFUlNJT05fTUlOT1IqMTAKLSAgICAgICAgKyBNNFZJREVPRURJVElOR19WRVJTSU9OX1JFVklTSU9OOwotICAgIGVyciA9IHBDLT5tX3BXcml0ZXJHbG9iSW50LT5wRmN0U2V0T3B0aW9uKHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0LCBNNFdSSVRFUl9rRW1iZWRkZWRWZXJzaW9uLAotICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikmdWlWZXJzaW9uKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckdsb2JJbnQtPnBGY3RTZXRPcHRpb24oTTRXUklURVJfa0VtYmVkZGVkVmVyc2lvbikgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQWxsb2NhdGUgYW5kIGZpbGwgdGhlIHZpZGVvIHN0cmVhbSBzdHJ1Y3R1cmVzIGZvciB0aGUgd3JpdGVyICovCi0gICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtID0KLSAgICAgICAgKE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKSwgTTRQVE8zR1BQLAotICAgICAgICAoTTRPU0FfQ2hhciAqKSJwV3JpdGVyVmlkZW9TdHJlYW0iKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW0pCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3NpbmcoKTogdW5hYmxlIHRvIGFsbG9jYXRlIHBXcml0ZXJWaWRlb1N0cmVhbSwgXAotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW1JbmZvID0KLSAgICAgICAgKE00V1JJVEVSX1N0cmVhbVZpZGVvSW5mb3MqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRXUklURVJfU3RyZWFtVmlkZW9JbmZvcyksIE00UFRPM0dQUCwKLSAgICAgICAgKE00T1NBX0NoYXIgKikicFdyaXRlclZpZGVvU3RyZWFtSW5mbyIpOwotICAgIGlmIChNNE9TQV9OVUxMID09IHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbUluZm8pCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3NpbmcoKTogdW5hYmxlIHRvIGFsbG9jYXRlIHBXcml0ZXJWaWRlb1N0cmVhbUluZm8sXAotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbGwgVmlkZW8gcHJvcGVydGllcyBzdHJ1Y3R1cmUgZm9yIHRoZSBBZGRTdHJlYW0gbWV0aG9kICovCi0gICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtSW5mby0+aGVpZ2h0ICAgICAgICA9IEVuY1BhcmFtcy5GcmFtZUhlaWdodDsKLSAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW1JbmZvLT53aWR0aCAgICAgICAgID0gRW5jUGFyYW1zLkZyYW1lV2lkdGg7Ci0gICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtSW5mby0+ZnBzICAgICAgICAgICA9IDA7ICAgICAgICAvKio8IE5vdCB1c2VkIGJ5IHRoZSBjb3JlIHdyaXRlciAqLwotICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbUluZm8tPkhlYWRlci5wQnVmICAgPSBNNE9TQV9OVUxMOwotICAgIC8qKiBObyBoZWFkZXIsIHdpbGwgYmUgc2V0IGJ5IHNldE9wdGlvbiAqLwotICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbUluZm8tPkhlYWRlci5TaXplICAgPSAwOwotCi0gICAgLyoqCi0gICAgICogIEZpbGwgVmlkZW8gc3RyZWFtIGRlc2NyaXB0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIEFkZFN0cmVhbSBtZXRob2QgKi8KLSAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW0tPnN0cmVhbUlEID0gTTRQVE8zR1BQX1dSSVRFUl9WSURFT19TVFJFQU1fSUQ7Ci0KLSAgICAvKioKLSAgICAgKiBWaWRlbyBmb3JtYXQgKi8KLSAgICBzd2l0Y2gocEMtPm1fUGFyYW1zLk91dHB1dFZpZGVvRm9ybWF0KQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTVBFRzQ6Ci0gICAgICAgICAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW0tPnN0cmVhbVR5cGUgPSBNNFNZU19rTVBFR180OyAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tIMjYzOgotICAgICAgICAgICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtLT5zdHJlYW1UeXBlID0gTTRTWVNfa0gyNjM7ICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2NDoKLSAgICAgICAgICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbS0+c3RyZWFtVHlwZSA9IE00U1lTX2tIMjY0OyAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiB1bmtub3duIGZvcm1hdCAweCV4IHJldHVybmluZyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJfTTRQVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRk9STUFUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0Zvcm1hdCk7Ci0gICAgICAgICAgICByZXR1cm4gRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GT1JNQVQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmlkZW8gYml0cmF0ZSAqLwotICAgIHN3aXRjaChwQy0+bV9QYXJhbXMuT3V0cHV0VmlkZW9CaXRyYXRlKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTZfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjRfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMzJfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNDhfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNjRfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rOTZfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTI4X0tCUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazE5Ml9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syNTZfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjg4X0tCUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazM4NF9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s1MTJfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rODAwX0tCUFM6Ci0vKisgTmV3IEVuY29kZXIgYml0cmF0ZXMgKi8KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMl9NQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s1X01CUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazhfTUJQUzoKLS8qLSBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotICAgICAgICAgICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtLT5hdmVyYWdlQml0cmF0ZSA9IHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0JpdHJhdGU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tWQVJJQUJMRV9LQlBTIDoKLSAgICAgICAgICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbS0+YXZlcmFnZUJpdHJhdGUgPSAwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IHVua25vd24gZm9ybWF0IDB4JXggcmV0dXJuaW5nXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSX000UFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0JJVFJBVEUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fUGFyYW1zLk91dHB1dFZpZGVvQml0cmF0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19CSVRSQVRFOwotICAgIH0KLQotICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbS0+ZHVyYXRpb24gICAgICAgICAgICAgICAgICA9IDA7ICAgICAgICAvKio8IER1cmF0aW9uIGlzIG5vdCBrbm93biAqLwotICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbS0+dGltZVNjYWxlICAgICAgICAgICAgICAgICA9IDA7ICAgIC8qKjwgTm90IHVzZWQgYnkgdGhlIGNvcmUgd3JpdGVyICovCi0gICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtLT5tYXhCaXRyYXRlICAgICAgICAgICAgICAgID0gcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtLT5hdmVyYWdlQml0cmF0ZTsKLSAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW0tPnByb2ZpbGVMZXZlbCAgICAgICAgICAgICAgPSAwOyAgICAvKio8IE5vdCB1c2VkIGJ5IHRoZSBjb3JlIHdyaXRlciAqLwotICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbS0+ZGVjb2RlclNwZWNpZmljSW5mbyAgICAgICA9IChNNE9TQV9NZW1BZGRyMzIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtSW5mbyk7Ci0gICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSAgID0gc2l6ZW9mKE00V1JJVEVSX1N0cmVhbVZpZGVvSW5mb3MpOwotCi0gICAgLyoqCi0gICAgICogVXBkYXRlIEFVIHByb3BlcnRpZXMgZm9yIHZpZGVvIHN0cmVhbSAqLwotICAgIHBDLT5tX1dyaXRlclZpZGVvQVUuQ1RTICAgICAgICAgPSBwQy0+bV9Xcml0ZXJWaWRlb0FVLkRUUyA9IDA7ICAvKiogUmVzZXQgdGltZSAqLwotICAgIHBDLT5tX1dyaXRlclZpZGVvQVUuc2l6ZSAgICAgICAgPSAwOwotICAgIHBDLT5tX1dyaXRlclZpZGVvQVUuZnJhZyAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX1dyaXRlclZpZGVvQVUubmJGcmFnICAgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogTm8gZnJhZ21lbnQgKi8KLSAgICBwQy0+bV9Xcml0ZXJWaWRlb0FVLnN0cmVhbSAgICAgID0gcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtOwotICAgIHBDLT5tX1dyaXRlclZpZGVvQVUuYXR0cmlidXRlICAgPSBBVV9SQVA7Ci0gICAgcEMtPm1fV3JpdGVyVmlkZW9BVS5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0KLSAgICAvKioKLSAgICAgKiAgSWYgdGhlcmUgaXMgYW4gYXVkaW8gaW5wdXQsIGFsbG9jYXRlIGFuZCBmaWxsIHRoZSBhdWRpbyBzdHJlYW0gc3RydWN0dXJlcyBmb3IgdGhlIHdyaXRlciAqLwotICAgIGlmKE00T1NBX05VTEwgIT0gcEMtPm1fcFJlYWRlckF1ZGlvU3RyZWFtKQotICAgIHsKLSAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtID0KLSAgICAgICAgICAgIChNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiksIE00UFRPM0dQUCwKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopInBXcml0ZXJBdWRpb1N0cmVhbSIpOwotICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZygpOiB1bmFibGUgdG8gYWxsb2NhdGUgcFdyaXRlckF1ZGlvU3RyZWFtLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW1JbmZvID0KLSAgICAgICAgICAgIChNNFdSSVRFUl9TdHJlYW1BdWRpb0luZm9zKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00V1JJVEVSX1N0cmVhbUF1ZGlvSW5mb3MpLCBNNFBUTzNHUFAsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJwV3JpdGVyQXVkaW9TdHJlYW1JbmZvIik7Ci0gICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbUluZm8pCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZygpOiB1bmFibGUgdG8gYWxsb2NhdGUgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckF1ZGlvU3RyZWFtSW5mbywgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW1JbmZvLT5uYlNhbXBsZXNQZXJTZWMgPSAwOyAvKio8IHVudXNlZCBieSBvdXIgc2hlbGwgd3JpdGVyICovCi0gICAgICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbUluZm8tPm5iQml0c1BlclNhbXBsZSA9IDA7IC8qKjwgdW51c2VkIGJ5IG91ciBzaGVsbCB3cml0ZXIgKi8KLSAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtSW5mby0+bmJDaGFubmVscyA9IDE7ICAgICAgLyoqPCB1bnVzZWQgYnkgb3VyIHNoZWxsIHdyaXRlciAqLwotCi0gICAgICAgIGlmKCAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wUmVhZGVyQXVkaW9TdHJlYW0pICYmIC8qIGF1ZGlvIGNvdWxkIGhhdmUgYmVlbiBkaXNjYXJkZWQgKi8KLSAgICAgICAgICAgIChNNE9TQV9OVUxMICE9IHBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbykgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBJZiB3ZSBjb3B5IHRoZSBzdHJlYW0gZnJvbSB0aGUgaW5wdXQsIHdlIGNvcHkgaXRzIERTSSAqLwotICAgICAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtSW5mby0+SGVhZGVyLlNpemUgPQotICAgICAgICAgICAgICAgIHBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsKLSAgICAgICAgICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbUluZm8tPkhlYWRlci5wQnVmID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcEMtPm1fcFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogV3JpdGVyIHdpbGwgcHV0IGEgZGVmYXVsdCBEU0kgKi8KLSAgICAgICAgICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbUluZm8tPkhlYWRlci5TaXplID0gMDsKLSAgICAgICAgICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbUluZm8tPkhlYWRlci5wQnVmID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGQgdGhlIGF1ZGlvIHN0cmVhbSAqLwotICAgICAgICBzd2l0Y2ggKHBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZDoKLSAgICAgICAgICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0tPnN0cmVhbVR5cGUgPSBNNFNZU19rQU1SOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb0FhYzoKLSAgICAgICAgICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0tPnN0cmVhbVR5cGUgPSBNNFNZU19rQUFDOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb0V2cmM6Ci0gICAgICAgICAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtLT5zdHJlYW1UeXBlID0gTTRTWVNfa0VWUkM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZzogdW5oYW5kbGVkIGF1ZGlvIGZvcm1hdCAoMHgleCksXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0JJVFJBVEUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9BVURJT19GT1JNQVQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBGaWxsIEF1ZGlvIHN0cmVhbSBkZXNjcmlwdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBBZGRTdHJlYW0gbWV0aG9kICovCi0gICAgICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbS0+c3RyZWFtSUQgICAgICAgICAgICAgICAgICA9IE00UFRPM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lEOwotICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0tPmR1cmF0aW9uICAgICAgICAgICAgICAgICAgPSAwOy8qKjwgRHVyYXRpb24gaXMgbm90IGtub3duIHlldCAqLwotICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0tPnRpbWVTY2FsZSAgICAgICAgICAgICAgICAgPSBNNFBUTzNHUFBfV1JJVEVSX0FVRElPX0FNUl9USU1FX1NDQUxFOwotICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0tPnByb2ZpbGVMZXZlbCAgICAgICAgICAgICAgPSBNNFBUTzNHUFBfV1JJVEVSX0FVRElPX1BST0ZJTEVfTEVWRUw7Ci0gICAgICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbS0+YXZlcmFnZUJpdHJhdGUgICAgICAgICAgICA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9hdmVyYWdlQml0UmF0ZTsKLSAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtLT5tYXhCaXRyYXRlICAgICAgICAgICAgICAgID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtLT5hdmVyYWdlQml0cmF0ZTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogT3VyIHdyaXRlciBzaGVsbCBpbnRlcmZhY2UgaXMgYSBsaXR0bGUgdHJpY2t5OiB3ZSBwdXQgTTRXUklURVJfU3RyZWFtQXVkaW9JbmZvcyBcCi0gICAgICAgICAgICBpbiB0aGUgRFNJIHBvaW50ZXIuLi4gKi8KLSAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtLT5kZWNvZGVyU3BlY2lmaWNJbmZvID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMilwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW1JbmZvOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBVcGRhdGUgQVUgcHJvcGVydGllcyBmb3IgYXVkaW8gc3RyZWFtICovCi0gICAgICAgIHBDLT5tX1dyaXRlckF1ZGlvQVUuQ1RTICAgICAgICAgPSBwQy0+bV9Xcml0ZXJBdWRpb0FVLkRUUyA9IDA7ICAvKiogUmVzZXQgdGltZSAqLwotICAgICAgICBwQy0+bV9Xcml0ZXJBdWRpb0FVLnNpemUgICAgICAgID0gMDsKLSAgICAgICAgcEMtPm1fV3JpdGVyQXVkaW9BVS5mcmFnICAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5tX1dyaXRlckF1ZGlvQVUubmJGcmFnICAgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogTm8gZnJhZ21lbnQgKi8KLSAgICAgICAgcEMtPm1fV3JpdGVyQXVkaW9BVS5zdHJlYW0gICAgICA9IHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbTsKLSAgICAgICAgcEMtPm1fV3JpdGVyQXVkaW9BVS5hdHRyaWJ1dGUgICA9IEFVX1JBUDsKLSAgICAgICAgcEMtPm1fV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKioqKioqKiogVmlkZW8gRW5jb2RlciBJbml0ICoqKioqKioqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAvKioKLSAgICAgKiBQVE8gdXNlcyBpdHMgb3duIGJpdHJhdGUgcmVndWxhdGlvbiwgbm90IHRoZSAidHJ1ZSIgY29yZSByZWd1bGF0aW9uICovCi0gICAgRW5jUGFyYW1zLmJJbnRlcm5hbFJlZ3VsYXRpb24gPSBNNE9TQV9UUlVFOyAvL000T1NBX0ZBTFNFOwotICAgIEVuY1BhcmFtcy51aVN0YXJ0aW5nUXVhbnRpemVyVmFsdWUgPSBNNFBUTzNHUFBfUVVBTlRJWkVSX1NURVA7Ci0KLSAgICBFbmNQYXJhbXMudmlkZW9Qcm9maWxlID0gcEMtPm1fUGFyYW1zLnZpZGVvUHJvZmlsZTsKLSAgICBFbmNQYXJhbXMudmlkZW9MZXZlbCA9IHBDLT5tX1BhcmFtcy52aWRlb0xldmVsOwotCi0gICAgLyoqCi0gICAgICogT3RoZXIgZW5jb2RlciBzZXR0aW5ncyAqLwotCi0gICAgRW5jUGFyYW1zLnVpSG9yaXpvbnRhbFNlYXJjaFJhbmdlICA9IDA7ICAgICAgICAgICAgIC8qIHVzZSBkZWZhdWx0ICovCi0gICAgRW5jUGFyYW1zLnVpVmVydGljYWxTZWFyY2hSYW5nZSAgICA9IDA7ICAgICAgICAgICAgIC8qIHVzZSBkZWZhdWx0ICovCi0gICAgRW5jUGFyYW1zLmJFcnJvclJlc2lsaWVuY2UgICAgICAgICA9IE00T1NBX0ZBTFNFOyAgIC8qIG5vIGVycm9yIHJlc2lsaWVuY2UgKi8KLSAgICBFbmNQYXJhbXMudWlJVm9wUGVyaW9kICAgICAgICAgICAgID0gMTU7ICAgICAgICAgICAgIC8qIHVzZSBkZWZhdWx0ICovCi0gICAgRW5jUGFyYW1zLnVpTW90aW9uRXN0aW1hdGlvblRvb2xzICA9IDA7ICAgICAgICAgICAgIC8qIE00Vl9NT1RJT05fRVNUX1RPT0xTX0FMTCAqLwotICAgIEVuY1BhcmFtcy5iQWNQcmVkaWN0aW9uICAgICAgICAgICAgPSBNNE9TQV9UUlVFOyAgICAvKiB1c2UgQUMgcHJlZGljdGlvbiAqLwotICAgIEVuY1BhcmFtcy5iRGF0YVBhcnRpdGlvbmluZyAgICAgICAgPSBNNE9TQV9GQUxTRTsgICAvKiBubyBkYXRhIHBhcnRpdGlvbmluZyAqLwotCi0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdmlkZW8gZW5jb2RlciAqLwotICAgIGVyciA9IHBDLT5tX3BFbmNvZGVySW50LT5wRmN0SW5pdCgmcEMtPm1fcE1wNEVuY29kZXJDb250ZXh0LCBwQy0+bV9wV3JpdGVyRGF0YUludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UFRPM0dQUF9hcHBseVZQUCwgcEMsIHBDLT5tX3BFbmNvZGVyRXh0ZXJuYWxBUEksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9wRW5jb2RlclVzZXJEYXRhKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IEVuY29kZXJJbnQtPnBGY3RJbml0IHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcEMtPm1fZUVuY29kZXJTdGF0ZSA9IE00UFRPM0dQUF9rRW5jb2RlckNsb3NlZDsKLQotICAgIGVyciA9IHBDLT5tX3BFbmNvZGVySW50LT5wRmN0T3BlbihwQy0+bV9wTXA0RW5jb2RlckNvbnRleHQsICZwQy0+bV9Xcml0ZXJWaWRlb0FVLCAmRW5jUGFyYW1zKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IEVuY29kZXJJbnQtPnBGY3RPcGVuIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcEMtPm1fZUVuY29kZXJTdGF0ZSA9IE00UFRPM0dQUF9rRW5jb2RlclN0b3BwZWQ7Ci0KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wRW5jb2RlckludC0+cEZjdFN0YXJ0KQotICAgIHsKLSAgICAgICAgZXJyID0gcEMtPm1fcEVuY29kZXJJbnQtPnBGY3RTdGFydChwQy0+bV9wTXA0RW5jb2RlckNvbnRleHQpOwotCi0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiBFbmNvZGVySW50LT5wRmN0U3RhcnQgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwQy0+bV9lRW5jb2RlclN0YXRlID0gTTRQVE8zR1BQX2tFbmNvZGVyUnVubmluZzsKLQotICAgIC8qKgotICAgICAqIE5vIG1vcmUgIHNldG9wdGlvbiBvbiAiTTRFTkNPREVSX2tWaWRlb0ZyYWdtZW50U2l6ZSIgaGVyZS4KLSAgICAgKiBJdCBpcyBub3cgYXV0b21hdGljbHkgYW5kICJzbWFydGx5IiBzZXQgaW4gdGhlIGVuY29kZXIgc2hlbGwuICovCi0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyoqKioqKioqIDNHUCBvdXQgYWRkIHN0cmVhbXMgICoqKioqKioqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIGVyciA9IHBDLT5tX3BXcml0ZXJHbG9iSW50LT5wRmN0QWRkU3RyZWFtKHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0LCBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW0pOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZzogcFdyaXRlckdsb2JJbnQtPnBGY3RBZGRTdHJlYW0odmlkZW8pIHJldHVybnNcCi0gICAgICAgICAgICAgICAgICAgICAgIDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB2aWRlbyBtYXggYXUgc2l6ZSAqLwotICAgIG9wdGlvblZhbHVlLnN0cmVhbUlEICAgID0gTTRQVE8zR1BQX1dSSVRFUl9WSURFT19TVFJFQU1fSUQ7Ci0gICAgb3B0aW9uVmFsdWUudmFsdWUgPSAoTTRPU0FfVUludDMyKSgxLjVGICogKE00T1NBX0Zsb2F0KShwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW1JbmZvLT53aWR0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW1JbmZvLT5oZWlnaHQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIE00UFRPM0dQUF9WSURFT19NSU5fQ09NUFJFU1NJT05fUkFUSU8pOwotICAgIE00T1NBX1RSQUNFM18xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZyxNNFdSSVRFUl9rTWF4QVVTaXplOiAldSIsb3B0aW9uVmFsdWUudmFsdWUpOwotICAgIGVyciA9IHBDLT5tX3BXcml0ZXJHbG9iSW50LT5wRmN0U2V0T3B0aW9uKHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNYXhBVVNpemUsKE00T1NBX0RhdGFPcHRpb24pICZvcHRpb25WYWx1ZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiBwV3JpdGVyR2xvYkludC0+cEZjdFNldE9wdGlvbih2aWRlbyxcCi0gICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX2tNYXhBVVNpemUpIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHZpZGVvIG1heCBjaHVuY2sgc2l6ZSAqLwotICAgIG9wdGlvblZhbHVlLnZhbHVlID0gKE00T1NBX1VJbnQzMikoKE00T1NBX0Zsb2F0KW9wdGlvblZhbHVlLnZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAqIE00UFRPM0dQUF9WSURFT19BVV9TSVpFX1RPX0NIVU5DS19TSVpFX1JBVElPKTsKLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3NpbmcsTTRXUklURVJfa01heENodW5ja1NpemU6ICV1IixvcHRpb25WYWx1ZS52YWx1ZSk7Ci0gICAgZXJyID0gcEMtPm1fcFdyaXRlckdsb2JJbnQtPnBGY3RTZXRPcHRpb24ocEMtPm1fcDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNYXhDaHVuY2tTaXplLChNNE9TQV9EYXRhT3B0aW9uKSAmb3B0aW9uVmFsdWUpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZzogcFdyaXRlckdsb2JJbnQtPnBGY3RTZXRPcHRpb24odmlkZW8sXAotICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9rTWF4Q2h1bmNrU2l6ZSkgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wUmVhZGVyQXVkaW9TdHJlYW0pCi0gICAgewotICAgICAgICBlcnIgPSBwQy0+bV9wV3JpdGVyR2xvYkludC0+cEZjdEFkZFN0cmVhbShwQy0+bV9wM2dwV3JpdGVyQ29udGV4dCwgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtKTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IHBXcml0ZXJHbG9iSW50LT5wRmN0QWRkU3RyZWFtKGF1ZGlvKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXQgYXVkaW8gbWF4IGF1IHNpemUgKi8KLSAgICAgICAgb3B0aW9uVmFsdWUudmFsdWUgICAgICAgPSBNNFBUTzNHUFBfQVVESU9fTUFYX0FVX1NJWkU7Ci0gICAgICAgIG9wdGlvblZhbHVlLnN0cmVhbUlEICAgID0gTTRQVE8zR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQ7Ci0gICAgICAgIGVyciA9IHBDLT5tX3BXcml0ZXJHbG9iSW50LT5wRmN0U2V0T3B0aW9uKHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgKE00T1NBX1VJbnQzMilNNFdSSVRFUl9rTWF4QVVTaXplLChNNE9TQV9EYXRhT3B0aW9uKSAmb3B0aW9uVmFsdWUpOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZzogcFdyaXRlckdsb2JJbnQtPnBGY3RTZXRPcHRpb24oYXVkaW8sXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfa01heEFVU2l6ZSkgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0IGF1ZGlvIG1heCBjaHVuY2sgc2l6ZSAqLwotICAgICAgICBvcHRpb25WYWx1ZS52YWx1ZSA9IE00UFRPM0dQUF9BVURJT19NQVhfQ0hVTktfU0laRTsgLyoqPCBNYWdpY2FsICovCi0gICAgICAgIGVyciA9IHBDLT5tX3BXcml0ZXJHbG9iSW50LT5wRmN0U2V0T3B0aW9uKHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMilNNFdSSVRFUl9rTWF4Q2h1bmNrU2l6ZSwoTTRPU0FfRGF0YU9wdGlvbikgJm9wdGlvblZhbHVlKTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IHBXcml0ZXJHbG9iSW50LT5wRmN0U2V0T3B0aW9uKGF1ZGlvLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX2tNYXhDaHVuY2tTaXplKSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogQ2xvc2UgdGhlIHN0cmVhbSByZWdpc3RlcmluZyBpbiBvcmRlciB0byBiZSByZWFkeSB0byB3cml0ZSBkYXRhICovCi0gICAgZXJyID0gcEMtPm1fcFdyaXRlckdsb2JJbnQtPnBGY3RTdGFydFdyaXRpbmcocEMtPm1fcDNncFdyaXRlckNvbnRleHQpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZzogcFdyaXRlckdsb2JJbnQtPnBGY3RTdGFydFdyaXRpbmcgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIE00T1NBX0VSUiBNNFBUTzNHUFBfd3JpdGVBbXJTaWxlbmNlMTIyRnJhbWUoTTRXUklURVJfRGF0YUludGVyZmFjZSogcFdyaXRlckRhdGFJbnRJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfQ29udGV4dCogcFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBXcml0ZXJBdWRpb0FVLCBNNE9TQV9UaW1lIG10SW5jQ3RzKQotICogQGJyaWVmICAgV3JpdGUgYW4gQU1SIDEyLjJrYnBzIHNpbGVuY2UgRlJBTUUgaW50byB0aGUgd3JpdGVyCi0gKiBAbm90ZSAgICBNYWlubHkgdXNlZCB0byBmaXggdGhlICdienonIGJ1Zy4uLgotICogQHBhcmFtICAgcFdyaXRlckRhdGFJbnRJbnRlcmZhY2UgKElOKSAgICB3cml0ZXIgZGF0YSBpbnRlcmZhY2VzCi0gKiAgICAgICAgICBwV3JpdGVyQ29udGV4dCAgICAgICAgICAoSU4vT1VUKXdyaXRlciBjb250ZXh0Ci0gKiAgICAgICAgICBwV3JpdGVyQXVkaW9BVSAgICAgICAgICAoT1VUKSAgIHdyaXRlciBhdWRpbyBhY2Nlc3MgdW5pdAotICogICAgICAgICAgbXRJbmNDdHMgICAgICAgICAgICAgICAgKElOKSAgICB3cml0ZXIgQ1RTCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRQVE8zR1BQX3dyaXRlQW1yU2lsZW5jZTEyMkZyYW1lKE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqIHBXcml0ZXJEYXRhSW50SW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfQ29udGV4dCogcFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfQWNjZXNzVW5pdCogcFdyaXRlckF1ZGlvQVUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVGltZSBtdEluY0N0cykKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgZXJyID0gcFdyaXRlckRhdGFJbnRJbnRlcmZhY2UtPnBTdGFydEFVKHBXcml0ZXJDb250ZXh0LCBNNFBUTzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV3JpdGVyQXVkaW9BVSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF93cml0ZUFtclNpbGVuY2UxMjJGcmFtZTogcFdyaXRlckRhdGFJbnQtPnBTdGFydEFVKGF1ZGlvKSByZXR1cm5zIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweCV4ISIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgbWVtY3B5KCh2b2lkICopcFdyaXRlckF1ZGlvQVUtPmRhdGFBZGRyZXNzLAotICAgICAodm9pZCAqKU00UFRPM0dQUF9BTVJfQVVfU0lMRU5DRV8xMjJfRlJBTUUsIE00UFRPM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8xMjJfU0laRSk7Ci0gICAgcFdyaXRlckF1ZGlvQVUtPnNpemUgICAgPSBNNFBUTzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMTIyX1NJWkU7Ci0gICAgcFdyaXRlckF1ZGlvQVUtPkNUUyAgICAgPSBtdEluY0N0czsKLSAgICBwV3JpdGVyQXVkaW9BVS0+bmJGcmFnICA9IDA7Ci0KLSAgICBlcnIgPSBwV3JpdGVyRGF0YUludEludGVyZmFjZS0+cFByb2Nlc3NBVShwV3JpdGVyQ29udGV4dCwgTTRQVE8zR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV3JpdGVyQXVkaW9BVSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF93cml0ZUFtclNpbGVuY2UxMjJGcmFtZTogcFdyaXRlckRhdGFJbnQtPnBQcm9jZXNzQVUoc2lsZW5jZSkgXAotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5zIDB4JXghIiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gTTRPU0FfRVJSIE00UFRPM0dQUF93cml0ZUFtclNpbGVuY2UwNDhGcmFtZShNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiBwV3JpdGVyRGF0YUludEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9Db250ZXh0KiBwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfQWNjZXNzVW5pdCogcFdyaXRlckF1ZGlvQVUsIE00T1NBX1RpbWUgbXRJbmNDdHMpCi0gKiBAYnJpZWYgICBXcml0ZSBhbiBBTVIgMTIuMmticHMgc2lsZW5jZSBGUkFNRSBpbnRvIHRoZSB3cml0ZXIKLSAqIEBub3RlICAgIE1haW5seSB1c2VkIHRvIGZpeCB0aGUgJ2J6eicgYnVnLi4uCi0gKiBAcGFyYW0gICBwV3JpdGVyRGF0YUludEludGVyZmFjZSAoSU4pICAgIHdyaXRlciBkYXRhIGludGVyZmFjZXMKLSAqICAgICAgICAgIHBXcml0ZXJDb250ZXh0ICAgICAgICAgIChJTi9PVVQpd3JpdGVyIGNvbnRleHQKLSAqICAgICAgICAgIHBXcml0ZXJBdWRpb0FVICAgICAgICAgIChPVVQpICAgd3JpdGVyIGF1ZGlvIGFjY2VzcyB1bml0Ci0gKiAgICAgICAgICBtdEluY0N0cyAgICAgICAgICAgICAgICAoSU4pICAgIHdyaXRlciBDVFMKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6IE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotc3RhdGljIE00T1NBX0VSUiBNNFBUTzNHUFBfd3JpdGVBbXJTaWxlbmNlMDQ4RnJhbWUoTTRXUklURVJfRGF0YUludGVyZmFjZSogcFdyaXRlckRhdGFJbnRJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9Db250ZXh0KiBwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBXcml0ZXJBdWRpb0FVLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVGltZSBtdEluY0N0cykKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgZXJyID0gcFdyaXRlckRhdGFJbnRJbnRlcmZhY2UtPnBTdGFydEFVKHBXcml0ZXJDb250ZXh0LCBNNFBUTzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckF1ZGlvQVUpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfd3JpdGVBbXJTaWxlbmNlMDQ4RnJhbWU6IHBXcml0ZXJEYXRhSW50LT5wU3RhcnRBVShhdWRpbylcCi0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIG1lbWNweSgodm9pZCAqKXBXcml0ZXJBdWRpb0FVLT5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAodm9pZCAqKU00UFRPM0dQUF9BTVJfQVVfU0lMRU5DRV8wNDhfRlJBTUUsCi0gICAgICAgICAgICAgICAgTTRQVE8zR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFKTsKLSAgICBwV3JpdGVyQXVkaW9BVS0+c2l6ZSAgICA9IE00UFRPM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfU0laRTsKLSAgICBwV3JpdGVyQXVkaW9BVS0+Q1RTICAgICA9IG10SW5jQ3RzOwotICAgIHBXcml0ZXJBdWRpb0FVLT5uYkZyYWcgID0gMDsKLQotICAgIGVyciA9IHBXcml0ZXJEYXRhSW50SW50ZXJmYWNlLT5wUHJvY2Vzc0FVKHBXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICBNNFBUTzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwgcFdyaXRlckF1ZGlvQVUpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfd3JpdGVBbXJTaWxlbmNlMDQ4RnJhbWU6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckRhdGFJbnQtPnBQcm9jZXNzQVUoc2lsZW5jZSkgcmV0dXJucyAweCV4ISIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFBUTzNHUFBfVmlkZW9QcmVQcm9jZXNzaW5nLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000UFRPM0dQUF9WaWRlb1ByZVByb2Nlc3NpbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTZhNjQ5OC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000UFRPM0dQUF9WaWRlb1ByZVByb2Nlc3NpbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRQVE8zR1BQX1ZpZGVvUHJlUHJvY2Vzc2luZy5jCi0gKiBAYnJpZWYgICBQaWN0dXJlIHRvIDNncHAgU2VydmljZSB2aWRlbyBwcmVwcm9jZXNzaW5nIG1hbmFnZW1lbnQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotLyoqCi0gKiAgICBPU0FMIERlYnVnIHV0aWxpdGllcyAqLwotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0KLS8qKgotICogICAgT1NBTCBNZW1vcnkgbWFuYWdlbWVudCAqLwotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotCi0vKioKLSAqICAgIERlZmluaXRpb24gb2YgdGhlIE00UFRPM0dQUCBpbnRlcm5hbCBjb250ZXh0ICovCi0jaW5jbHVkZSAiTTRQVE8zR1BQX0ludGVybmFsVHlwZXMuaCIKLQotLyoqCi0gKiAgICBEZWZpbml0aW9uIG9mIHRoZSBNNFBUTzNHUFAgZXJyb3JzICovCi0jaW5jbHVkZSAiTTRQVE8zR1BQX0Vycm9yQ29kZXMuaCIKLQotLyogSWYgdGltZSBpbmNyZW1lbnQgaXMgdG9vIGxvdyB0aGVuIHdlIGhhdmUgYW4gaW5maW5pdGUgYWxsb2MgbG9vcCBpbnRvIE00VmlFbmNDYXB0dXJlRnJhbWUoKSAqLwotLyogVGltZSBpbmNyZW1lbnQgc2hvdWxkIG1hdGNoIDMwIGZwcyBtYXhpbXVtICovCi0jZGVmaW5lIE00UFRPM0dQUF9NSU5fVElNRV9JTkNSRU1FTlQgMzMuMzMzMzMzNAotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UFRPM0dQUF9hcHBseVZQUChNNFZQUF9Db250ZXh0IHBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVPdXQpCi0gKiBAYnJpZWYgICAgQ2FsbCBhbiBleHRlcm5hbCBjYWxsYmFjayB0byBnZXQgdGhlIHBpY3R1cmUgdG8gZW5jb2RlCi0gKiBAbm90ZSAgICBJdCBpcyBjYWxsZWQgYnkgdGhlIHZpZGVvIGVuY29kZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFZQUCBjb250ZXh0LCB3aGljaCBhY3R1YWxseSBpcyB0aGUgTTRQVE8zR1BQIGludGVybmFsIGNvbnRleHQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIG91ciBjYXNlCi0gKiBAcGFyYW0gICAgcFBsYW5lSW4gICAgKElOKSBDb250YWlucyB0aGUgaW1hZ2UKLSAqIEBwYXJhbSAgICBwUGxhbmVPdXQgICAgKElOL09VVCkgUG9pbnRlciB0byBhbiBhcnJheSBvZiAzIHBsYW5lcyB0aGF0IHdpbGwgY29udGFpbiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IFlVVjQyMCBpbWFnZSByZWFkIHdpdGggdGhlIG1fcFBpY3R1cmVDYWxsYmFja0ZjdAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBBbnkgZXJyb3IgcmV0dXJuZWQgYnkgYW4gdW5kZXJsYXlpbmcgbW9kdWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRQVE8zR1BQX2FwcGx5VlBQKE00VlBQX0NvbnRleHQgcENvbnRleHQsIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZU91dCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRVJSICAgIGVycjsKLSAgICBNNE9TQV9Eb3VibGUgbXREdXJhdGlvbjsKLSAgICBNNE9TQV9VSW50MzIgaTsKLQotICAgIC8qKiogTk9URSAqKiovCi0gICAgLyogSXQncyBPSyB0byBnZXQgcFBsYW5lSW4gPT0gTTRPU0FfTlVMTCBoZXJlICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBzaW5jZSBpdCBoYXMgYmVlbiBnaXZlbiBOVUxMIGluIHRoZSBwRmN0RW5jb2RlKCkgY2FsbC4gICAgICAgICAgICAqLwotICAgIC8qIEl0J3MgYmVjYXVzZSB3ZSB1c2UgdGhlIE00UFRPM0dQUCBpbnRlcm5hbCBjb250ZXh0IHRvICAgICAgICAgICAgKi8KLSAgICAvKiB0cmFuc21pdCB0aGUgZW5jb2RlciBpbnB1dCBkYXRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogVGhlIGlucHV0IGRhdGEgaXMgdGhlIGltYWdlIHJlYWQgZnJvbSB0aGUgbV9wUGljdHVyZUNhbGxiYWNrRmN0ICAgICovCi0KLSAgICAvKioKLSAgICAgKiAgICBUaGUgVlBQIGNvbnRleHQgaXMgYWN0dWFsbHkgdGhlIE00UFRPM0dQUCBjb250ZXh0ISAqLwotICAgIE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQgKnBDID0gKE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQqKShwQ29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAqICBHZXQgdGhlIHBpY3R1cmUgdG8gZW5jb2RlICovCi0gICAgaWYgKE00T1NBX0ZBTFNFID09IHBDLT5tX2JMYXN0SW50ZXJuYWxDYWxsQmFjaykKLSAgICB7Ci0gICAgICAgIGVyciA9IHBDLT5tX1BhcmFtcy5wUGljdHVyZUNhbGxiYWNrRmN0KHBDLT5tX1BhcmFtcy5wUGljdHVyZUNhbGxiYWNrQ3R4dCwgcFBsYW5lT3V0LAotICAgICAgICAgICAgICZtdER1cmF0aW9uKTsKLQotICAgICAgICAvKiBJbiBjYXNlIG9mIGVycm9yIHdoZW4gZ2V0dGluZyBZVVYgdG8gZW5jb2RlIChleDogZXJyb3Igd2hlbiBkZWNvZGluZyBhIEpQRUcpICovCi0gICAgICAgIGlmKChNNE5PX0VSUk9SICE9IGVycikgJiYgKCgoTTRPU0FfVUludDMyKU00UFRPM0dQUF9XQVJfTEFTVF9QSUNUVVJFKSAhPSBlcnIpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIElmIGVuZCBvZiBlbmNvZGluZyBpcyBhc2tlZCBieSB0aGUgc2l6ZSBsaW1pdGF0aW9uIHN5c3RlbSwKLSAgICAgICAgICogd2UgbXVzdCBlbmQgdGhlIGVuY29kaW5nIHRoZSBzYW1lIHdheSB0aGF0IHdoZW4gaXQgaXMgYXNrZWQgYnkgdGhlCi0gICAgICAgICAqIHBpY3R1cmUgY2FsbGJhY2sgKGEuay5hLiB0aGUgaW50ZWdyYXRvcikuCi0gICAgICAgICAqIFRodXMgd2Ugc2ltdWxhdGUgdGhlIExhc3RQaWN0dXJlIGNvZGUgcmV0dXJuOiAqLwotICAgICAgICBpZiAoTTRPU0FfVFJVRSA9PSBwQy0+bV9Jc0xhc3RQaWN0dXJlKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNFBUTzNHUFBfV0FSX0xBU1RfUElDVFVSRTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCgoTTRPU0FfVUludDMyKU00UFRPM0dQUF9XQVJfTEFTVF9QSUNUVVJFKSA9PSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5tX2JMYXN0SW50ZXJuYWxDYWxsQmFjayA9IE00T1NBX1RSVUU7IC8qIFRvZ2dsZSBmbGFnIGZvciB0aGUgZmluYWwgY2FsbCBvZiB0aGUgQ0IqLwotICAgICAgICAgICAgcEMtPm1fSXNMYXN0UGljdHVyZSAgICAgICAgID0gTTRPU0FfVFJVRTsgLyogVG8gc3RvcCB0aGUgZW5jb2RlciAqLwotICAgICAgICAgICAgcEMtPnBTYXZlZFBsYW5lICAgICAgICAgICAgID0gcFBsYW5lT3V0OyAgLyogU2F2ZSB0aGUgbGFzdCBZVVYgcGxhbmUgcHRyICovCi0gICAgICAgICAgICBwQy0+dWlTYXZlZER1cmF0aW9uICAgICAgICAgPSAoTTRPU0FfVUludDMyKW10RHVyYXRpb247IC8qIFNhdmUgdGhlIGxhc3QgZHVyYXRpb24gKi8KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKio8IE5vdCBuZWNlc3NhcnkgaGVyZSBiZWNhdXNlIHRoZSBsYXN0IGZyYW1lIGR1cmF0aW9uIGlzIHNldCB0byB0aGUtbGFzdC1idXQtb25lIGJ5Ci0gICAgICAgICAgICAgICAgdGhlIGxpZ2h0IHdyaXRlciAqLwotICAgICAgICAvKio8IE9ubHkgbmVjZXNzYXJ5IGZvciBwQy0+bV9tdE5leHRDdHMgYmVsb3cuLi4qLwotICAgICAgICBtdER1cmF0aW9uID0gcEMtPnVpU2F2ZWREdXJhdGlvbjsKLQotCi0gICAgICAgIC8qKiBDb3B5IHRoZSBsYXN0IFlVViBwbGFuZSBpbnRvIHRoZSBjdXJyZW50IG9uZQotICAgICAgICAgKiAodGhlIGxhc3QgcGljIGlzIHNwbGl0ZWQgZHVlIHRvIHRoZSBjYWxsYmFjayBleHRyYS1jYWxsLi4uICovCi0gICAgICAgIGZvciAoaT0wOyBpPDM7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFBsYW5lT3V0W2ldLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5wU2F2ZWRQbGFuZVtpXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dFtpXS51X3N0cmlkZSAqIHBQbGFuZU91dFtpXS51X2hlaWdodCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBUaW1lSW5jcmVtZW50IHNob3VsZCBiZSAzMCBmcHMgbWF4aW11bSAqLwotICAgIGlmKG10RHVyYXRpb24gPCBNNFBUTzNHUFBfTUlOX1RJTUVfSU5DUkVNRU5UKQotICAgIHsKLSAgICAgICAgbXREdXJhdGlvbiA9IE00UFRPM0dQUF9NSU5fVElNRV9JTkNSRU1FTlQ7Ci0gICAgfQotCi0gICAgcEMtPm1fbXROZXh0Q3RzICs9IG10RHVyYXRpb247Ci0KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRQVE8zR1BQX2FwcGx5VlBQOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000UkVBREVSX0Ftci5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFJFQURFUl9BbXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDg1OTE1Ny4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000UkVBREVSX0Ftci5jCisrKyAvZGV2L251bGwKQEAgLTEsNzkwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRSRUFERVJfQW1yLmMKLSAqIEBicmllZiAgR2VuZXJpYyBlbmNhcHN1bGF0aW9uIG9mIHRoZSBjb3JlIGFtciByZWFkZXIKLSAqIEBub3RlICAgVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIGdlbmVyaWMgTTRSRUFERVIgaW50ZXJmYWNlCi0gKiAgICAgICAgIG9uIHRvcCBvZiB0aGUgQU1SIHJlYWRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9Db3JlSUQuaCIKLQotI2luY2x1ZGUgIk00X1V0aWxzLmgiCi0KLSNpbmNsdWRlICJNNEFNUlJfQ29yZVJlYWRlci5oIgotI2luY2x1ZGUgIk00UkVBREVSX0Ftci5oIgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFJFQURFUl9BTVJfQ29udGV4dAotICogQGJyaWVmICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGludGVybmFsIGNvbnRleHQgb2YgYSBhbXIgcmVhZGVyIGluc3RhbmNlCi0gKiBAbm90ZSAgICAgICAgVGhlIGNvbnRleHQgaXMgYWxsb2NhdGVkIGFuZCBkZS1hbGxvY2F0ZWQgYnkgdGhlIHJlYWRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IF9NNFJFQURFUl9BTVJfQ29udGV4dAotewotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgIG1fcENvcmVDb250ZXh0OyAgICAgLyoqPCBjb3JlIGFtciByZWFkZXIgY29udGV4dCAqLwotICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogIG1fcEF1ZGlvU3RyZWFtOyAgICAgLyoqPCBwb2ludGVyIG9uIHRoZSBhdWRpbyBzdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiByZXR1cm5lZCBieSB0aGUgY29yZSAqLwotICAgIE00U1lTX0FjY2Vzc1VuaXQgICAgICAgIG1fYXVkaW9BdTsgICAgICAgICAgLyoqPCBhdWRpbyBhY2Nlc3MgdW5pdCB0byBiZSBmaWxsZWQgYnkgdGhlIGNvcmUgKi8KLSAgICBNNE9TQV9UaW1lICAgICAgICAgICAgICBtX21heER1cmF0aW9uOyAgICAgIC8qKjwgZHVyYXRpb24gb2YgdGhlIGF1ZGlvIHN0cmVhbSAqLwotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogICAgbV9wT3NhRmlsZVJlYWRlckZjdHM7ICAgIC8qKjwgT1NBTCBmaWxlIHJlYWQgZnVuY3Rpb25zICovCi0KLX0gTTRSRUFERVJfQU1SX0NvbnRleHQ7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSByZWFkZXIKLSAqIEBub3RlICAgICBhbGxvY2F0ZXMgdGhlIGNvbnRleHQKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgICAgIChPVVQpICAgIHBvaW50ZXIgb24gYSByZWFkZXIgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9BTExPQyAgICAgICAgICAgICAgICBhIG1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFJFQURFUl9BTVJfY3JlYXRlKE00T1NBX0NvbnRleHQgKnBDb250ZXh0KQotewotICAgIE00UkVBREVSX0FNUl9Db250ZXh0KiBwUmVhZGVyQ29udGV4dDsKLQotICAgIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDb250ZXh0ID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfQU1SX2NyZWF0ZTogaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIHBSZWFkZXJDb250ZXh0ID0gKE00UkVBREVSX0FNUl9Db250ZXh0KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00UkVBREVSX0FNUl9Db250ZXh0KSwKLSAgICAgICAgIE00UkVBREVSX0FNUiwgKE00T1NBX0NoYXIgKikiTTRSRUFERVJfQU1SX0NvbnRleHQiKTsKLSAgICBpZiAocFJlYWRlckNvbnRleHQgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICBwUmVhZGVyQ29udGV4dC0+bV9wQXVkaW9TdHJlYW0gID0gTTRPU0FfTlVMTDsKLSAgICBwUmVhZGVyQ29udGV4dC0+bV9hdWRpb0F1LmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICBwUmVhZGVyQ29udGV4dC0+bV9tYXhEdXJhdGlvbiA9IDA7Ci0gICAgcFJlYWRlckNvbnRleHQtPm1fcENvcmVDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBwUmVhZGVyQ29udGV4dC0+bV9wT3NhRmlsZVJlYWRlckZjdHMgPSBNNE9TQV9OVUxMOwotCi0gICAgKnBDb250ZXh0ID0gcFJlYWRlckNvbnRleHQ7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgZGVzdHJveSB0aGUgaW5zdGFuY2Ugb2YgdGhlIHJlYWRlcgotICogQG5vdGUgICAgIGFmdGVyIHRoaXMgY2FsbCB0aGUgY29udGV4dCBpcyBpbnZhbGlkCi0gKgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00UkVBREVSX0FNUl9kZXN0cm95KE00T1NBX0NvbnRleHQgY29udGV4dCkKLXsKLSAgICBNNFJFQURFUl9BTVJfQ29udGV4dCogICBwQz0oTTRSRUFERVJfQU1SX0NvbnRleHQqKWNvbnRleHQ7Ci0KLSAgICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfQU1SX2Rlc3Ryb3k6IGludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICAvKioKLSAgICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQykKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9BTVJfZGVzdHJveSgpOiBNNFJFQURFUl9BTVJfZGVzdHJveTogY29udGV4dCBpcyBNNE9TQV9OVUxMLFwKLSAgICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfUEFSQU1FVEVSIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgZnJlZShwQyk7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBvcGVuIHRoZSByZWFkZXIgYW5kIGluaXRpYWxpemVzIGl0cyBjcmVhdGVkIGluc3RhbmNlCi0gKiBAbm90ZSAgICAgdGhpcyBmdW5jdGlvbiBvcGVucyB0aGUgQU1SIGZpbGUKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcEZpbGVEZXNjcmlwdG9yOiAgICAoSU4pICAgIFBvaW50ZXIgdG8gcHJvcHJpZXRhcnkgZGF0YSBpZGVudGlmeWluZyB0aGUgbWVkaWEgdG8gb3BlbgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgICAgIHRoZSBjb250ZXh0IGlzIE5VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFJFQURFUl9BTVJfb3BlbihNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00T1NBX1ZvaWQqIHBGaWxlRGVzY3JpcHRvcikKLXsKLSAgICBNNFJFQURFUl9BTVJfQ29udGV4dCogICAgcEMgPSAoTTRSRUFERVJfQU1SX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgIGVycjsKLQotICAgIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMqLwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfQU1SX29wZW46IGludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBGaWxlRGVzY3JpcHRvciksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9BTVJfb3BlbjogaW52YWxpZCBwb2ludGVyIHBGaWxlRGVzY3JpcHRvciIpOwotCi0gICAgZXJyID0gTTRBTVJSX29wZW5SZWFkKCAmcEMtPm1fcENvcmVDb250ZXh0LCBwRmlsZURlc2NyaXB0b3IsIHBDLT5tX3BPc2FGaWxlUmVhZGVyRmN0cyk7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgY2xvc2UgdGhlIHJlYWRlcgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgdGhlIGNvbnRleHQgaXMgTlVMTAotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICBNNFJFQURFUl9BTVJfY2xvc2UoTTRPU0FfQ29udGV4dCBjb250ZXh0KQotewotICAgIE00UkVBREVSX0FNUl9Db250ZXh0KiAgICBwQyA9IChNNFJFQURFUl9BTVJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICAgZXJyOwotICAgIE00QU1SUl9TdGF0ZSBTdGF0ZTsKLQotICAgIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMqLwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9BTVJfY2xvc2U6IGludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICAvKioKLSAgICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQykKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9BTVJfY2xvc2UoKTogTTRSRUFERVJfQU1SX2Nsb3NlOiBjb250ZXh0IGlzIE00T1NBX05VTEwsXAotICAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9QQVJBTUVURVIiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wQXVkaW9TdHJlYW0pCi0gICAgewotICAgICAgICBlcnIgPSBNNEFNUlJfZ2V0U3RhdGUocEMtPm1fcENvcmVDb250ZXh0LCAmU3RhdGUsCi0gICAgICAgICAgICAgICAgKChNNF9TdHJlYW1IYW5kbGVyKilwQy0+bV9wQXVkaW9TdHJlYW0pLT5tX3N0cmVhbUlkKTsKLSAgICAgICAgaWYoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9BTVJfY2xvc2U6IGVycm9yIHdoZW4gY2FsbGluZyBNNEFNUlJfZ2V0U3RhdGVcbiIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChNNEFNUlJfa1JlYWRpbmdfbmV4dEFVID09IFN0YXRlKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNEFNUlJfZnJlZUFVKHBDLT5tX3BDb3JlQ29udGV4dCwKLSAgICAgICAgICAgICAgICAoKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tX3BBdWRpb1N0cmVhbSktPm1fc3RyZWFtSWQsICAmcEMtPm1fYXVkaW9BdSk7Ci0gICAgICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX0FNUl9jbG9zZTogZXJyb3Igd2hlbiBmcmVlaW5nIGFjY2VzcyB1bml0XG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogRGVsZXRlIHRoZSBEU0kgaWYgbmVlZGVkICovCi0gICAgICAgIGlmKE00T1NBX05VTEwgIT0gcEMtPm1fcEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKFwKLSAgICAgICAgICAgICAgICBwQy0+bV9wQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm8pOwotCi0gICAgICAgICAgICBwQy0+bV9wQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSAwOwotICAgICAgICAgICAgcEMtPm1fcEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEZpbmFsbHkgZGVzdHJveSB0aGUgc3RyZWFtIGhhbmRsZXIgKi8KLSAgICAgICAgZnJlZShwQy0+bV9wQXVkaW9TdHJlYW0pOwotICAgICAgICBwQy0+bV9wQXVkaW9TdHJlYW0gPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX3BDb3JlQ29udGV4dCkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00QU1SUl9jbG9zZVJlYWQocEMtPm1fcENvcmVDb250ZXh0KTsKLSAgICAgICAgcEMtPm1fcENvcmVDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBHZXQgdGhlIG5leHQgc3RyZWFtIGZvdW5kIGluIHRoZSBtZWRpYQotICogQG5vdGUgICAgY3VycmVudCB2ZXJzaW9uIG5lZWRzIHRvIHRyYW5zbGF0ZSBNNFNZU19TdHJlYW0gdG8gTTRfU3RyZWFtSGFuZGxlcgotICoKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIHBNZWRpYUZhbWlseTogICAoT1VUKSAgcG9pbnRlciB0byBhIHVzZXIgYWxsb2NhdGVkIE00UkVBREVSX01lZGlhRmFtaWx5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIG1lZGlhIGZhbWlseSBvZiB0aGUgZm91bmQgc3RyZWFtCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXI6IChPVVQpICBwb2ludGVyIHRvIGEgc3RyZWFtIGhhbmRsZXIgdGhhdCB3aWxsIGJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgYW5kIGZpbGxlZCB3aXRoIHRoZSBmb3VuZCBzdHJlYW0gZGVzY3JpcHRpb24KLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNFdBUl9OT19NT1JFX1NUUkVBTSAgbm8gbW9yZSBhdmFpbGFibGUgc3RyZWFtIGluIHRoZSBtZWRpYSAoYWxsIHN0cmVhbXMgZm91bmQpCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQgKGluIERFQlVHIG1vZGUgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRSRUFERVJfQU1SX2dldE5leHRTdHJlYW0oTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFJFQURFUl9NZWRpYUZhbWlseSAqcE1lZGlhRmFtaWx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKipwU3RyZWFtSGFuZGxlclBhcmFtKQotewotICAgIE00UkVBREVSX0FNUl9Db250ZXh0KiAgIHBDPShNNFJFQURFUl9BTVJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICBlcnI7Ci0gICAgTTRTWVNfU3RyZWFtSUQgICAgICAgICAgc3RyZWFtSWRBcnJheVsyXTsKLSAgICBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiBzdHJlYW1EZXNjOwotICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogIHBBdWRpb1N0cmVhbUhhbmRsZXI7Ci0gICAgTTRfU3RyZWFtSGFuZGxlciogICAgICAgcFN0cmVhbUhhbmRsZXI7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDID09IDApLCAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAiTTRSRUFERVJfQU1SX2dldE5leHRTdHJlYW06IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocE1lZGlhRmFtaWx5ID09IDApLCAgICAgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICJNNFJFQURFUl9BTVJfZ2V0TmV4dFN0cmVhbTogaW52YWxpZCBwb2ludGVyIHRvIE1lZGlhRmFtaWx5Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlclBhcmFtID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgIk00UkVBREVSX0FNUl9nZXROZXh0U3RyZWFtOiBpbnZhbGlkIHBvaW50ZXIgdG8gU3RyZWFtSGFuZGxlciIpOwotCi0gICAgZXJyID0gTTRBTVJSX2dldE5leHRTdHJlYW0oIHBDLT5tX3BDb3JlQ29udGV4dCwgJnN0cmVhbURlc2MpOwotICAgIGlmIChlcnIgPT0gTTRXQVJfTk9fTU9SRV9TVFJFQU0pCi0gICAgewotICAgICAgICBzdHJlYW1JZEFycmF5WzBdID0gMDsKLSAgICAgICAgc3RyZWFtSWRBcnJheVsxXSA9IDA7Ci0gICAgICAgIGVyciA9IE00QU1SUl9zdGFydFJlYWRpbmcocEMtPm1fcENvcmVDb250ZXh0LCBzdHJlYW1JZEFycmF5KTsKLSAgICAgICAgaWYgKChNNE9TQV9VSW50MzIpTTRFUlJfQUxMT0MgPT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiTTRSRUFERVJfQU1SX2dldE5leHRTdHJlYW06IE00QU1SUl9zdGFydFJlYWRpbmcgcmV0dXJucyBNNEVSUl9BTExPQyEiKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfU1RSRUFNOwotICAgIH0KLSAgICBlbHNlIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgKnBNZWRpYUZhbWlseSA9IE00UkVBREVSX2tNZWRpYUZhbWlseUF1ZGlvOwotCi0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlciA9IChNNF9BdWRpb1N0cmVhbUhhbmRsZXIqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRfQXVkaW9TdHJlYW1IYW5kbGVyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0FNUiwgKE00T1NBX0NoYXIgKikiTTRfQXVkaW9TdHJlYW1IYW5kbGVyIik7Ci0gICAgaWYgKHBBdWRpb1N0cmVhbUhhbmRsZXIgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgcFN0cmVhbUhhbmRsZXIgPShNNF9TdHJlYW1IYW5kbGVyKikocEF1ZGlvU3RyZWFtSGFuZGxlcik7Ci0gICAgKnBTdHJlYW1IYW5kbGVyUGFyYW0gPSBwU3RyZWFtSGFuZGxlcjsKLSAgICBwQy0+bV9wQXVkaW9TdHJlYW0gPSBwQXVkaW9TdHJlYW1IYW5kbGVyOwotCi0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9zdHJ1Y3RTaXplID0gc2l6ZW9mKE00X0F1ZGlvU3RyZWFtSGFuZGxlcik7Ci0KLSAgICAvKgotICAgICAqIEF1ZGlvIHN0cmVhbSBoYW5kbGVyIGZpZWxkcyBhcmUgaW5pdGlhbGlzZWQgd2l0aCAwIHZhbHVlLgotICAgICAqIFRoZXkgd2lsbCBiZSBwcm9wZXJseSBzZXQgYnkgdGhlIEFNUiBkZWNvZGVyCi0gICAgICovCi0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA9IDA7Ci0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9ieXRlRnJhbWVMZW5ndGggICA9IDA7Ci0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9ieXRlU2FtcGxlU2l6ZSAgICA9IDA7Ci0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9uYkNoYW5uZWxzICAgICAgICA9IDA7Ci0KLSAgICBwU3RyZWFtSGFuZGxlci0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyAgICA9IChNNE9TQV9VSW50OCopKHN0cmVhbURlc2MuZGVjb2RlclNwZWNpZmljSW5mbyk7Ci0gICAgcFN0cmVhbUhhbmRsZXItPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSBzdHJlYW1EZXNjLmRlY29kZXJTcGVjaWZpY0luZm9TaXplOwotICAgIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkICAgICAgICAgICAgICAgID0gc3RyZWFtRGVzYy5zdHJlYW1JRDsKLSAgICBwU3RyZWFtSGFuZGxlci0+bV9kdXJhdGlvbiAgICAgICAgICAgICAgICA9IHN0cmVhbURlc2MuZHVyYXRpb247Ci0gICAgcFN0cmVhbUhhbmRsZXItPm1fcFVzZXJEYXRhICAgICAgICAgICAgICAgPSAodm9pZCopc3RyZWFtRGVzYy50aW1lU2NhbGU7IC8qdHJpY2sgdG8gY2hhbmdlKi8KLQotICAgIGlmIChzdHJlYW1EZXNjLmR1cmF0aW9uID4gcEMtPm1fbWF4RHVyYXRpb24pCi0gICAgewotICAgICAgICBwQy0+bV9tYXhEdXJhdGlvbiA9IHN0cmVhbURlc2MuZHVyYXRpb247Ci0gICAgfQotICAgIHBTdHJlYW1IYW5kbGVyLT5tX2F2ZXJhZ2VCaXRSYXRlICAgICAgICAgID0gc3RyZWFtRGVzYy5hdmVyYWdlQml0cmF0ZTsKLQotICAgIE00QU1SUl9nZXRtYXhBVXNpemUocEMtPm1fcENvcmVDb250ZXh0LCAmcFN0cmVhbUhhbmRsZXItPm1fbWF4QVVTaXplKTsKLQotICAgIHN3aXRjaCAoc3RyZWFtRGVzYy5zdHJlYW1UeXBlKQotICAgIHsKLSAgICBjYXNlIE00U1lTX2tBTVI6Ci0gICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUgPSBNNERBX1N0cmVhbVR5cGVBdWRpb0Ftck5hcnJvd0JhbmQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRTWVNfa0FNUl9XQjoKLSAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSA9IE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yV2lkZUJhbmQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGZpbGwgdGhlIGFjY2VzcyB1bml0IHN0cnVjdHVyZSB3aXRoIGluaXRpYWxpemF0aW9uIHZhbHVlcwotICogQG5vdGUKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXI6IChJTikgICAgIHBvaW50ZXIgdG8gdGhlIHN0cmVhbSBoYW5kbGVyIHRvCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHRoZSBhY2Nlc3MgdW5pdCB3aWxsIGJlIGFzc29jaWF0ZWQKLSAqIEBwYXJhbSAgICBwQWNjZXNzVW5pdDogICAgKElOL09VVCkgcG9pbnRlciB0byB0aGUgYWNjZXNzIHVuaXQgKGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGluaXRpYWxpemUKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFJFQURFUl9BTVJfZmlsbEF1U3RydWN0KE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfQWNjZXNzVW5pdCAqcEFjY2Vzc1VuaXQpCi17Ci0gICAgTTRSRUFERVJfQU1SX0NvbnRleHQqICAgcEMgPSAoTTRSRUFERVJfQU1SX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRTWVNfQWNjZXNzVW5pdCogICAgICAgcEF1OwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQyA9PSAwKSwgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX0FNUl9maWxsQXVTdHJ1Y3Q6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9BTVJfZmlsbEF1U3RydWN0OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfU3RyZWFtSGFuZGxlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocEFjY2Vzc1VuaXQgPT0gMCksICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9BTVJfZmlsbEF1U3RydWN0OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfQWNjZXNzVW5pdCIpOwotCi0gICAgaWYgKHBTdHJlYW1IYW5kbGVyID09IChNNF9TdHJlYW1IYW5kbGVyKilwQy0+bV9wQXVkaW9TdHJlYW0pCi0gICAgewotICAgICAgICBwQXUgPSAmcEMtPm1fYXVkaW9BdTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX0FNUl9maWxsQXVTdHJ1Y3Q6IHBhc3NlZCBTdHJlYW1IYW5kbGVyIGlzIG5vdCBrbm93blxuIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgcEF1LT5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgcEF1LT5zaXplICAgICAgICA9IDA7Ci0gICAgLyogSkM6IGJ1ZyBmaXggMTE5NyAoc2V0IENUUyB0byAtMjAgaW4gb3JkZXIgdGhlIGZpcnN0IEFVIENUUyBpcyAwKSAqLwotICAgIHBBdS0+Q1RTICAgICAgICAgPSAtMjA7Ci0gICAgcEF1LT5EVFMgICAgICAgICA9IC0yMDsKLSAgICBwQXUtPmF0dHJpYnV0ZSAgID0gMDsKLSAgICBwQXUtPm5iRnJhZyAgICAgID0gMDsKLQotICAgIHBBY2Nlc3NVbml0LT5tX3NpemUgICAgICAgICA9IDA7Ci0gICAgLyogSkM6IGJ1ZyBmaXggMTE5NyAoc2V0IENUUyB0byAtMjAgaW4gb3JkZXIgdGhlIGZpcnN0IEFVIENUUyBpcyAwKSAqLwotICAgIHBBY2Nlc3NVbml0LT5tX0NUUyAgICAgICAgICA9IC0yMDsKLSAgICBwQWNjZXNzVW5pdC0+bV9EVFMgICAgICAgICAgPSAtMjA7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fYXR0cmlidXRlICAgID0gMDsKLSAgICBwQWNjZXNzVW5pdC0+bV9kYXRhQWRkcmVzcyAgPSBNNE9TQV9OVUxMOy8qcEJ1ZmZlcjsqLwotICAgIHBBY2Nlc3NVbml0LT5tX21heHNpemUgICAgICA9IHBTdHJlYW1IYW5kbGVyLT5tX21heEFVU2l6ZTsKLSAgICBwQWNjZXNzVW5pdC0+bV9zdHJlYW1JRCAgICAgPSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZDsKLSAgICBwQWNjZXNzVW5pdC0+bV9zdHJ1Y3RTaXplICAgPSBzaXplb2YoTTRfQWNjZXNzVW5pdCk7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgZ2V0IGFuIG9wdGlvbiB2YWx1ZSBmcm9tIHRoZSByZWFkZXIKLSAqIEBub3RlICAgIHRoaXMgZnVuY3Rpb24gZm9sbG93cyB0aGUgc2V0L2dldCBvcHRpb24gbWVjaGFuaXNtIGRlc2NyaWJlZCBpbiBPU0FMIDMuMAotICogICAgICAgICAgaXQgYWxsb3dzIHRoZSBjYWxsZXIgdG8gcmV0cmlldmUgYSBwcm9wZXJ0eSB2YWx1ZToKLSAqICAgICAgICAgIC0gdGhlIGR1cmF0aW9uIG9mIHRoZSBsb25nZXN0IHN0cmVhbSBvZiB0aGUgbWVkaWEKLSAqICAgICAgICAgIC0gdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSByZWFkZXIgKG5vdCBpbXBsZW1lbnRlZCB5ZXQpCi0gKgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIG9wdGlvbklkOiAgICAgICAgKElOKSAgICBpbmRpY2F0ZXMgdGhlIG9wdGlvbiB0byBnZXQKLSAqIEBwYXJhbSAgICBwVmFsdWU6ICAgICAgICAgICAgKE9VVCkgICAgcG9pbnRlciB0byBzdHJ1Y3R1cmUgb3IgdmFsdWUgKGFsbG9jYXRlZCBieSB1c2VyKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcHRpb24gaXMgc3RvcmVkCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgICAgd2hlbiB0aGUgb3B0aW9uIElEIGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFJFQURFUl9BTVJfZ2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIHBWYWx1ZSkKLQotewotICAgIE00UkVBREVSX0FNUl9Db250ZXh0KiBwQyA9IChNNFJFQURFUl9BTVJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCAgICAgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcFZhbHVlKSwgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCB2YWx1ZSBwb2ludGVyIik7Ci0KLSAgICBzd2l0Y2gob3B0aW9uSWQpCi0gICAgewotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0R1cmF0aW9uIDoKLSAgICAgICAgewotICAgICAgICAgICAgKihNNE9TQV9UaW1lKilwVmFsdWUgPSBwQy0+bV9tYXhEdXJhdGlvbjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0JpdHJhdGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiogcEJpdHJhdGUgPSAoTTRPU0FfVUludDMyKilwVmFsdWU7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wQXVkaW9TdHJlYW0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBCaXRyYXRlID0gcEMtPm1fcEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2F2ZXJhZ2VCaXRSYXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBCaXRyYXRlID0gMDsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9WZXJzaW9uOgotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNEFNUlJfZ2V0VmVyc2lvbigoTTRfVmVyc2lvbkluZm8qKXBWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBzZXQgZW4gb3B0aW9uIHZhbHVlIG9mIHRoZSByZWFkZGVyCi0gKiBAbm90ZSAgICB0aGlzIGZ1bmN0aW9uIGZvbGxvd3MgdGhlIHNldC9nZXQgb3B0aW9uIG1lY2hhbmlzbSBkZXNjcmliZWQgaW4gT1NBTCAzLjAKLSAqICAgICAgICAgIGl0IGFsbG93cyB0aGUgY2FsbGVyIHRvIHNldCBhIHByb3BlcnR5IHZhbHVlOgotICogICAgICAgICAgLSB0aGUgT1NBTCBmaWxlIHJlYWQgZnVuY3Rpb25zCi0gKgotICogQHBhcmFtICAgY29udGV4dDogICAgKElOKSAgICAgICAgQ29udGV4dCBvZiB0aGUgZGVjb2RlcgotICogQHBhcmFtICAgb3B0aW9uSWQ6ICAgKElOKSAgICAgICAgSWRlbnRpZmllciBpbmRpY2F0aW5nIHRoZSBvcHRpb24gdG8gc2V0Ci0gKiBAcGFyYW0gICBwVmFsdWU6ICAgICAoSU4pICAgICAgICBQb2ludGVyIHRvIHN0cnVjdHVyZSBvciB2YWx1ZSAoYWxsb2NhdGVkIGJ5IHVzZXIpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcHRpb24gaXMgc3RvcmVkCi0gKgotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgVGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX0JBRF9PUFRJT05fSUQgICAgIFRoZSBvcHRpb24gSUQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgICAgICBTdGF0ZSBhdXRvbWF0b24gaXMgbm90IGFwcGxpZWQKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIFRoZSBvcHRpb24gcGFyYW1ldGVyIGlzIGludmFsaWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRSRUFERVJfQU1SX3NldE9wdGlvbihNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00T1NBX09wdGlvbklEIG9wdGlvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBwVmFsdWUpCi17Ci0gICAgTTRSRUFERVJfQU1SX0NvbnRleHQqIHBDID0gKE00UkVBREVSX0FNUl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksICAgICBNNEVSUl9QQVJBTUVURVIsICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwVmFsdWUpLCBNNEVSUl9QQVJBTUVURVIsICJpbnZhbGlkIHZhbHVlIHBvaW50ZXIiKTsKLQotICAgIHN3aXRjaChvcHRpb25JZCkKLSAgICB7Ci0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfU2V0T3NhRmlsZVJlYWRlckZjdHNQdHIgOgotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+bV9wT3NhRmlsZVJlYWRlckZjdHMgPSAoTTRPU0FfRmlsZVJlYWRQb2ludGVyKilwVmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdCA6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIHJlc2V0IHRoZSBzdHJlYW0sIHRoYXQgaXMgc2VlayBpdCB0byBiZWdpbm5pbmcgYW5kIG1ha2UgaXQgcmVhZHkgdG8gYmUgcmVhZAotICogQG5vdGUgICAgdGhpcyBmdW5jdGlvbiBpcyB0byBiZSBkZXByZWNhdGVkIGluIG5leHQgdmVyc2lvbnMKLSAqCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXIgICAgKElOKSAgICBUaGUgc3RyZWFtIGhhbmRsZXIgb2YgdGhlIHN0cmVhbSB0byByZXNldAotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICogQHJldHVybiAgICBNNEVSUl9CQURfU1RSRUFNX0lEICAgICAgICB0aGUgc3RyZWFtSUQgZG9lcyBub3QgZXhpc3QKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEUgICAgdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIG5vdwotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgTTRXQVJfSU5WQUxJRF9USU1FICAgICAgICBiZWdpbm5pbmcgb2YgdGhlIHN0cmVhbSBjYW4gbm90IGJlIHJlYWNoZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRSRUFERVJfQU1SX3Jlc2V0KE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIpCi17Ci0gICAgTTRSRUFERVJfQU1SX0NvbnRleHQqICAgcEMgPSAoTTRSRUFERVJfQU1SX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRTWVNfU3RyZWFtSUQgICAgICAgICAgc3RyZWFtSWRBcnJheVsyXTsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICBlcnI7Ci0gICAgTTRTWVNfQWNjZXNzVW5pdCogICAgICAgcEF1OwotICAgIE00T1NBX1RpbWUgICAgICAgICAgICAgIHRpbWU2NCA9IDA7Ci0gICAgTTRBTVJSX1N0YXRlICAgICAgICAgICAgU3RhdGU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDID09IDApLCBNNEVSUl9QQVJBTUVURVIsICJNNFJFQURFUl9BTVJfcmVzZXQ6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9BTVJfcmVzZXQ6IGludmFsaWQgcG9pbnRlciB0byBNNF9TdHJlYW1IYW5kbGVyIik7Ci0KLSAgICBpZiAocFN0cmVhbUhhbmRsZXIgPT0gKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tX3BBdWRpb1N0cmVhbSkKLSAgICB7Ci0gICAgICAgIHBBdSA9ICZwQy0+bV9hdWRpb0F1OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfQU1SX3Jlc2V0OiBwYXNzZWQgU3RyZWFtSGFuZGxlciBpcyBub3Qga25vd25cbiIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGVyciA9IE00QU1SUl9nZXRTdGF0ZShwQy0+bV9wQ29yZUNvbnRleHQsICZTdGF0ZSwgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQpOwotICAgIGlmIChNNEFNUlJfa1JlYWRpbmdfbmV4dEFVID09IFN0YXRlKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRBTVJSX2ZyZWVBVShwQy0+bV9wQ29yZUNvbnRleHQsIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkLCBwQXUpOwotICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9BTVJfcmVzZXQ6IGVycm9yIHdoZW4gZnJlZWluZyBhY2Nlc3MgdW5pdFxuIik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHBBdS0+ZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHN0cmVhbUlkQXJyYXlbMF0gPSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZDsKLSAgICBzdHJlYW1JZEFycmF5WzFdID0gMDsKLQotICAgIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAvKiBmb3IgcmVzZXQgZHVyaW5nIHBsYXliYWNrICovCi0gICAgLyogKHNldCBDVFMgdG8gLTIwIGluIG9yZGVyIHRoZSBmaXJzdCBBVSBDVFMgaXMgMCkgKi8KLSAgICBwQXUtPkNUUyA9IC0yMDsKLSAgICBwQXUtPkRUUyA9IC0yMDsKLQotICAgIGVyciA9IE00QU1SUl9zZWVrKHBDLT5tX3BDb3JlQ29udGV4dCwgc3RyZWFtSWRBcnJheSwgdGltZTY0LCBNNFNZU19rQmVnaW5uaW5nLCAmdGltZTY0KTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfQU1SX3Jlc2V0OiBlcnJvciB3aGVuIGNhbGxpbmcgTTRBTVJSX3NlZWsoKVxuIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAganVtcCBpbnRvIHRoZSBzdHJlYW0gYXQgdGhlIHNwZWNpZmllZCB0aW1lCi0gKiBAbm90ZQotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlciAgICAoSU4pICAgICB0aGUgc3RyZWFtIGRlc2NyaXB0aW9uIG9mIHRoZSBzdHJlYW0gdG8gbWFrZSBqdW1wCi0gKiBAcGFyYW0gICAgcFRpbWUgICAgICAgICAgICAoSU4vT1VUKSBJTjogIHRoZSB0aW1lIHRvIGp1bXAgdG8gKGluIG1zKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOiB0aGUgdGltZSB0byB3aGljaCB0aGUgc3RyZWFtIHJlYWxseSBqdW1wZWQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybiAgICBNNEVSUl9BTExPQyAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqIEByZXR1cm4gICAgTTRXQVJfSU5WQUxJRF9USU1FICAgICAgICB0aGUgdGltZSBjYW4gbm90IGJlIHJlYWNoZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRSRUFERVJfQU1SX2p1bXAoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIqIHBUaW1lKQotewotICAgIE00UkVBREVSX0FNUl9Db250ZXh0KiAgIHBDID0gKE00UkVBREVSX0FNUl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00U1lTX1N0cmVhbUlEICAgICAgICAgIHN0cmVhbUlkQXJyYXlbMl07Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgZXJyOwotICAgIE00U1lTX0FjY2Vzc1VuaXQqICAgICAgIHBBdTsKLSAgICBNNE9TQV9UaW1lICAgICAgICAgICAgICB0aW1lNjQgPSAoTTRPU0FfVGltZSkqcFRpbWU7Ci0gICAgTTRBTVJSX1N0YXRlICAgICAgICAgICAgU3RhdGU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDID09IDApLCBNNEVSUl9QQVJBTUVURVIsICJNNFJFQURFUl9BTVJfcmVzZXQ6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9BTVJfcmVzZXQ6IGludmFsaWQgcG9pbnRlciB0byBNNF9TdHJlYW1IYW5kbGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwVGltZSA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLCAiTTRSRUFERVJfM0dQX2p1bXA6IGludmFsaWQgdGltZSBwb2ludGVyIik7Ci0KLSAgICBpZiAocFN0cmVhbUhhbmRsZXIgPT0gKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tX3BBdWRpb1N0cmVhbSkKLSAgICB7Ci0gICAgICAgIHBBdSA9ICZwQy0+bV9hdWRpb0F1OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfQU1SX2p1bXA6IHBhc3NlZCBTdHJlYW1IYW5kbGVyIGlzIG5vdCBrbm93blxuIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgZXJyID0gTTRBTVJSX2dldFN0YXRlKHBDLT5tX3BDb3JlQ29udGV4dCwgJlN0YXRlLCBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZCk7Ci0gICAgaWYgKE00QU1SUl9rUmVhZGluZ19uZXh0QVUgPT0gU3RhdGUpCi0gICAgewotICAgICAgICBlcnIgPSBNNEFNUlJfZnJlZUFVKHBDLT5tX3BDb3JlQ29udGV4dCwgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQsIHBBdSk7Ci0gICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX0FNUl9qdW1wOiBlcnJvciB3aGVuIGZyZWVpbmcgYWNjZXNzIHVuaXRcbiIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBwQXUtPmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBzdHJlYW1JZEFycmF5WzBdID0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQ7Ci0gICAgc3RyZWFtSWRBcnJheVsxXSA9IDA7Ci0KLSAgICBwQXUtPkNUUyA9IHRpbWU2NDsKLSAgICBwQXUtPkRUUyA9IHRpbWU2NDsKLSAgICBlcnIgPSBNNEFNUlJfc2VlayhwQy0+bV9wQ29yZUNvbnRleHQsIHN0cmVhbUlkQXJyYXksIHRpbWU2NCwgTTRTWVNfa05vUkFQcHJldmlvdXMsICZ0aW1lNjQpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9BTVJfanVtcDogZXJyb3Igd2hlbiBjYWxsaW5nIE00QU1SUl9zZWVrKClcbiIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgICpwVGltZSA9IChNNE9TQV9JbnQzMil0aW1lNjQ7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIEdldHMgYW4gYWNjZXNzIHVuaXQgKEFVKSBmcm9tIHRoZSBzdHJlYW0gaGFuZGxlciBzb3VyY2UuCi0gKiBAbm90ZSAgICBBbiBBVSBpcyB0aGUgc21hbGxlc3QgcG9zc2libGUgYW1vdW50IG9mIGRhdGEgdG8gYmUgZGVjb2RlZCBieSBhIGRlY29kZXIgKGF1ZGlvL3ZpZGVvKS4KLSAqICAgICAgICAgIEluIHRoZSBjdXJyZW50IHZlcnNpb24sIHdlIG5lZWQgdG8gdHJhbnNsYXRlIE00T1NBX0FjY2Vzc1VuaXQgdG8gTTRfQWNjZXNzVW5pdAotICoKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICAgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXIgIChJTikgICAgICAgIFRoZSBzdHJlYW0gaGFuZGxlciBvZiB0aGUgc3RyZWFtIHRvIG1ha2UganVtcAotICogQHBhcmFtICAgIHBBY2Nlc3NVbml0ICAgICAoSU4vT1VUKSAgICBQb2ludGVyIHRvIGFuIGFjY2VzcyB1bml0IHRvIGZpbGwgd2l0aCByZWFkIGRhdGEgKHRoZSBhdQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgaXMgYWxsb2NhdGVkIGJ5IHRoZSB1c2VyLCBhbmQgbXVzdCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplZCBieSBjYWxsaW5nIE00UkVBREVSX2ZpbGxBdVN0cnVjdF9mY3QgYWZ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpb24pCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybiAgICBNNEVSUl9BTExPQyAgICAgICAgICAgICBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX1NUUkVBTV9JRCAgICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBzdHJlYW0gSWQuIGRvZXMgbm90IGV4aXN0LgotICogQHJldHVybiAgICBNNFdBUl9OT19NT1JFX0FVICAgICAgICB0aGVyZSBhcmUgbm8gbW9yZSBhY2Nlc3MgdW5pdCBpbiB0aGUgc3RyZWFtIChlbmQgb2Ygc3RyZWFtKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFJFQURFUl9BTVJfZ2V0TmV4dEF1KE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X0FjY2Vzc1VuaXQgKnBBY2Nlc3NVbml0KQotewotICAgIE00UkVBREVSX0FNUl9Db250ZXh0KiAgIHBDID0gKE00UkVBREVSX0FNUl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRTWVNfQWNjZXNzVW5pdCogICAgICAgcEF1OwotICAgIE00X01lZGlhVGltZSAgICAgICAgICAgIHRpbWVTY2FsZTsKLSAgICBNNEFNUlJfU3RhdGUgICAgICAgICAgICBTdGF0ZTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgocEMgPT0gMCksICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9BTVJfZ2V0TmV4dEF1OiBpbnZhbGlkIGNvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBTdHJlYW1IYW5kbGVyID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfQU1SX2dldE5leHRBdTogaW52YWxpZCBwb2ludGVyIHRvIE00X1N0cmVhbUhhbmRsZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBBY2Nlc3NVbml0ID09IDApLCAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfQU1SX2dldE5leHRBdTogaW52YWxpZCBwb2ludGVyIHRvIE00X0FjY2Vzc1VuaXQiKTsKLQotICAgIC8qIGtlZXAgdHJhY2Ugb2YgdGhlIGFsbG9jYXRlZCBidWZmZXJzIGluIEFVIHRvIGJlIGFibGUgdG8gZnJlZSB0aGVtIGF0IGRlc3Ryb3koKQotICAgICAgIGJ1dCBiZSBhd2FyZSB0aGF0IHN5c3RlbSBpcyByaXNreSBhbmQgd291bGQgbmVlZCB1cGdyYWRlIGlmIG1vcmUgdGhhbgotICAgICAgIG9uZSB2aWRlbyBhbmQgb25lIGF1ZGlvIEFVIGlzIG5lZWRlZCAqLwotICAgIGlmIChwU3RyZWFtSGFuZGxlciA9PSAoTTRfU3RyZWFtSGFuZGxlciopcEMtPm1fcEF1ZGlvU3RyZWFtKQotICAgIHsKLSAgICAgICAgcEF1ID0gJnBDLT5tX2F1ZGlvQXU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9BTVJfZ2V0TmV4dEF1OiBwYXNzZWQgU3RyZWFtSGFuZGxlciBpcyBub3Qga25vd25cbiIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGVyciA9IE00QU1SUl9nZXRTdGF0ZShwQy0+bV9wQ29yZUNvbnRleHQsICZTdGF0ZSwgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQpOwotICAgIGlmIChNNEFNUlJfa1JlYWRpbmdfbmV4dEFVID09IFN0YXRlKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRBTVJSX2ZyZWVBVShwQy0+bV9wQ29yZUNvbnRleHQsIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkLCBwQXUpOwotICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9BVklfZ2V0TmV4dEF1OiBlcnJvciB3aGVuIGZyZWVpbmcgYWNjZXNzIHVuaXRcbiIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBwQXUtPmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBwQXUtPm5iRnJhZyA9IDA7Ci0gICAgZXJyID0gTTRBTVJSX25leHRBVShwQy0+bV9wQ29yZUNvbnRleHQsIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkLCBwQXUpOwotCi0gICAgaWYgKGVyciA9PSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgdGltZVNjYWxlID0gKE00T1NBX0Zsb2F0KShNNE9TQV9JbnQzMikocFN0cmVhbUhhbmRsZXItPm1fcFVzZXJEYXRhKS8xMDAwOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9kYXRhQWRkcmVzcyA9IChNNE9TQV9NZW1BZGRyOClwQXUtPmRhdGFBZGRyZXNzOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9zaXplID0gcEF1LT5zaXplOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9DVFMgID0gKE00X01lZGlhVGltZSlwQXUtPkNUUy8qL3RpbWVTY2FsZSovOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9EVFMgID0gKE00X01lZGlhVGltZSlwQXUtPkRUUy8qL3RpbWVTY2FsZSovOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9hdHRyaWJ1dGUgPSBwQXUtPmF0dHJpYnV0ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fc2l6ZT0wOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgUmV0cmlldmVzIHRoZSBnZW5lcmljIGludGVyZmFjZXMgaW1wbGVtZW50ZWQgYnkgdGhlIHJlYWRlcgotKgotKiBAcGFyYW0gcE1lZGlhVHlwZSAgICAgICAgICA6IFBvaW50ZXIgb24gYSBNNFJFQURFUl9NZWRpYVR5cGUgKGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyKQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgbWVkaWEgdHlwZSBzdXBwb3J0ZWQgYnkgdGhpcyByZWFkZXIKLSogQHBhcmFtIHBSZHJHbG9iYWxJbnRlcmZhY2UgOiBBZGRyZXNzIG9mIGEgcG9pbnRlciB0aGF0IHdpbGwgYmUgc2V0IHRvIHRoZSBnbG9iYWwgaW50ZXJmYWNlIGltcGxlbWVudGVkCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhpcyByZWFkZXIuIFRoZSBpbnRlcmZhY2UgaXMgYSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIGJ5IHRoZSBmdW5jdGlvbiBhbmQgbXVzdAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHVuLWFsbG9jYXRlZCBieSB0aGUgY2FsbGVyLgotKiBAcGFyYW0gcFJkckRhdGFJbnRlcmZhY2UgICA6IEFkZHJlc3Mgb2YgYSBwb2ludGVyIHRoYXQgd2lsbCBiZSBzZXQgdG8gdGhlIGRhdGEgaW50ZXJmYWNlIGltcGxlbWVudGVkCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhpcyByZWFkZXIuIFRoZSBpbnRlcmZhY2UgaXMgYSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIGJ5IHRoZSBmdW5jdGlvbiBhbmQgbXVzdAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHVuLWFsbG9jYXRlZCBieSB0aGUgY2FsbGVyLgotKgotKiBAcmV0dXJucyA6IE00Tk9fRVJST1IgICAgIGlmIE9LCi0qICAgICAgICAgICAgRVJSX0FMTE9DICAgICAgaWYgYW4gYWxsb2NhdGlvbiBmYWlsZWQKLSogICAgICAgICAgICBFUlJfUEFSQU1FVEVSICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQgKGluIERFQlVHIG9ubHkpCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgTTRSRUFERVJfQU1SX2dldEludGVyZmFjZXMoTTRSRUFERVJfTWVkaWFUeXBlICpwTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKipwUmRyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICoqcFJkckRhdGFJbnRlcmZhY2UpCi17Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwTWVkaWFUeXBlID09IDApLCAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfQU1SX2dldEludGVyZmFjZXM6IGludmFsaWQgcG9pbnRlciB0byBNZWRpYVR5cGUiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBSZHJHbG9iYWxJbnRlcmZhY2UgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9BTVJfZ2V0SW50ZXJmYWNlczogaW52YWxpZCBwb2ludGVyIHRvIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFJkckRhdGFJbnRlcmZhY2UgPT0gMCksICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX0FNUl9nZXRJbnRlcmZhY2VzOiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRSRUFERVJfRGF0YUludGVyZmFjZSIpOwotCi0gICAgKnBSZHJHbG9iYWxJbnRlcmZhY2UgPQotICAgICAgICAgKE00UkVBREVSX0dsb2JhbEludGVyZmFjZSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKCBzaXplb2YoTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlKSwKLSAgICAgICAgICAgICBNNFJFQURFUl9BTVIsIChNNE9TQV9DaGFyICopIk00UkVBREVSX0dsb2JhbEludGVyZmFjZSIgKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSAqcFJkckdsb2JhbEludGVyZmFjZSkKLSAgICB7Ci0gICAgICAgICpwUmRyRGF0YUludGVyZmFjZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgKnBSZHJEYXRhSW50ZXJmYWNlID0gKE00UkVBREVSX0RhdGFJbnRlcmZhY2UqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyggc2l6ZW9mKE00UkVBREVSX0RhdGFJbnRlcmZhY2UpLAotICAgICAgICAgTTRSRUFERVJfQU1SLCAoTTRPU0FfQ2hhciAqKSJNNFJFQURFUl9EYXRhSW50ZXJmYWNlIik7Ci0gICAgaWYgKE00T1NBX05VTEwgPT0gKnBSZHJEYXRhSW50ZXJmYWNlKQotICAgIHsKLSAgICAgICAgZnJlZSgqcFJkckdsb2JhbEludGVyZmFjZSk7Ci0gICAgICAgICpwUmRyR2xvYmFsSW50ZXJmYWNlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgICpwTWVkaWFUeXBlID0gTTRSRUFERVJfa01lZGlhVHlwZUFNUjsKLQotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdENyZWF0ZSAgICAgICAgICAgPSBNNFJFQURFUl9BTVJfY3JlYXRlOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdERlc3Ryb3kgICAgICAgICAgPSBNNFJFQURFUl9BTVJfZGVzdHJveTsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RPcGVuICAgICAgICAgICAgID0gTTRSRUFERVJfQU1SX29wZW47Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0Q2xvc2UgICAgICAgICAgICA9IE00UkVBREVSX0FNUl9jbG9zZTsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RHZXRPcHRpb24gICAgICAgID0gTTRSRUFERVJfQU1SX2dldE9wdGlvbjsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RTZXRPcHRpb24gICAgICAgID0gTTRSRUFERVJfQU1SX3NldE9wdGlvbjsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RHZXROZXh0U3RyZWFtICAgID0gTTRSRUFERVJfQU1SX2dldE5leHRTdHJlYW07Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0RmlsbEF1U3RydWN0ICAgICA9IE00UkVBREVSX0FNUl9maWxsQXVTdHJ1Y3Q7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0U3RhcnQgICAgICAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0U3RvcCAgICAgICAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0SnVtcCAgICAgICAgICAgICA9IE00UkVBREVSX0FNUl9qdW1wOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdFJlc2V0ICAgICAgICAgICAgPSBNNFJFQURFUl9BTVJfcmVzZXQ7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0R2V0UHJldlJhcFRpbWUgICA9IE00T1NBX05VTEw7IC8qYWxsIEFVcyBhcmUgUkFQKi8KLQotICAgICgqcFJkckRhdGFJbnRlcmZhY2UpLT5tX3BGY3RHZXROZXh0QXUgICAgICAgICAgPSBNNFJFQURFUl9BTVJfZ2V0TmV4dEF1OwotCi0gICAgKCpwUmRyRGF0YUludGVyZmFjZSktPm1fcmVhZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFJFQURFUl9QY20uYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRSRUFERVJfUGNtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgzMzkzMGIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFJFQURFUl9QY20uYworKysgL2Rldi9udWxsCkBAIC0xLDcyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNFJFQURFUl9XYXYuYwotICogQGJyaWVmICBHZW5lcmljIGVuY2Fwc3VsYXRpb24gb2YgdGhlIGNvcmUgcGNtIHJlYWRlcgotICogQG5vdGUgICBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgZ2VuZXJpYyBNNFJFQURFUiBpbnRlcmZhY2UKLSAqICAgICAgICAgb24gdG9wIG9mIHRoZSBQQ00gcmVhZGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0jaW5jbHVkZSAiTTRUT09MX1ZlcnNpb25JbmZvLmgiCi0jaW5jbHVkZSAiTTRQQ01SX0NvcmVSZWFkZXIuaCIKLSNpbmNsdWRlICJNNFJFQURFUl9QY20uaCIKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00UkVBREVSX1dBVl9Db250ZXh0Ci0gKiBAYnJpZWYgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgaW50ZXJuYWwgY29udGV4dCBvZiBhIHdhdiByZWFkZXIgaW5zdGFuY2UKLSAqIEBub3RlICAgICAgICBUaGUgY29udGV4dCBpcyBhbGxvY2F0ZWQgYW5kIGRlLWFsbG9jYXRlZCBieSB0aGUgcmVhZGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0IF9NNFJFQURFUl9QQ01fQ29udGV4dAotewotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgIG1fY29yZUNvbnRleHQ7ICAgICAgICAvKio8IGNvcmUgd2F2IHJlYWRlciBjb250ZXh0ICovCi0gICAgTTRfU3RyZWFtSGFuZGxlciogICAgICAgbV9wQXVkaW9TdHJlYW07ICAgICAgIC8qKjwgcG9pbnRlciBvbiB0aGUgYXVkaW8gc3RyZWFtIGRlc2NyaXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmVkIGJ5IHRoZSBjb3JlICovCi0gICAgTTRTWVNfQWNjZXNzVW5pdCAgICAgICAgbV9hdWRpb0F1OyAgICAgICAgICAgIC8qKjwgYXVkaW8gYWNjZXNzIHVuaXQgdG8gYmUgZmlsbGVkIGJ5IHRoZSBjb3JlICovCi0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiAgbV9wT3NhRmlsZVJlYWRlckZjdHM7IC8qKjwgT1NBTCBmaWxlIHJlYWQgZnVuY3Rpb25zICovCi0KLX0gTTRSRUFERVJfUENNX0NvbnRleHQ7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBDcmVhdGVzIGEgd2F2IHJlYWRlciBpbnN0YW5jZQotICogQG5vdGUgICAgYWxsb2NhdGVzIHRoZSBjb250ZXh0Ci0gKiBAcGFyYW0gICBwQ29udGV4dDogICAgICAgICAgICAoT1VUKSAgUG9pbnRlciB0byBhIHdhdiByZWFkZXIgY29udGV4dAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9BTExPQzogICAgICAgICAgICAgICAgYSBtZW1vcnkgYWxsb2NhdGlvbiBoYXMgZmFpbGVkCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRSRUFERVJfUENNX2NyZWF0ZShNNE9TQV9Db250ZXh0KiBwQ29udGV4dCkKLXsKLSAgICBNNFJFQURFUl9QQ01fQ29udGV4dCogICBwUmVhZGVyQ29udGV4dDsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgocENvbnRleHQgPT0gMCksICAgICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fY3JlYXRlOiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgcFJlYWRlckNvbnRleHQgPSAoTTRSRUFERVJfUENNX0NvbnRleHQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRSRUFERVJfUENNX0NvbnRleHQpLAotICAgICAgICAgTTRSRUFERVJfV0FWLCAoTTRPU0FfQ2hhciAqKSJNNFJFQURFUl9QQ01fQ29udGV4dCIpOwotICAgIGlmIChwUmVhZGVyQ29udGV4dCA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHBSZWFkZXJDb250ZXh0LT5tX2NvcmVDb250ZXh0ICAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgIHBSZWFkZXJDb250ZXh0LT5tX3BBdWRpb1N0cmVhbSAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgIHBSZWFkZXJDb250ZXh0LT5tX2F1ZGlvQXUuZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIHBSZWFkZXJDb250ZXh0LT5tX3BPc2FGaWxlUmVhZGVyRmN0cyAgPSBNNE9TQV9OVUxMOwotCi0gICAgKnBDb250ZXh0ID0gcFJlYWRlckNvbnRleHQ7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBEZXN0cm95IHRoZSBpbnN0YW5jZSBvZiB0aGUgcmVhZGVyCi0gKiBAbm90ZSAgICB0aGUgY29udGV4dCBpcyB1bi1hbGxvY2F0ZWQKLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgICAgICAgKElOKSBjb250ZXh0IG9mIHRoZSBuZXR3b3JrIHJlYWRlcgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRSRUFERVJfUENNX2Rlc3Ryb3koTTRPU0FfQ29udGV4dCBjb250ZXh0KQotewotICAgIE00UkVBREVSX1BDTV9Db250ZXh0KiBwQyA9IChNNFJFQURFUl9QQ01fQ29udGV4dCopY29udGV4dDsKLQotICAgIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2Rlc3Ryb3k6IGludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBmcmVlKHBDKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIEluaXRpYWxpemVzIHRoZSByZWFkZXIgaW5zdGFuY2UKLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgICAgICAgICAoSU4pICAgIGNvbnRleHQgb2YgdGhlIG5ldHdvcmsgcmVhZGVyCi0gKiBAcGFyYW0gICBwRmlsZURlc2NyaXB0b3I6ICAgKElOKSAgICBQb2ludGVyIHRvIHByb3ByaWV0YXJ5IGRhdGEgaWRlbnRpZnlpbmcgdGhlIG1lZGlhIHRvIG9wZW4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFJFQURFUl9QQ01fb3BlbihNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00T1NBX1ZvaWQqIHBGaWxlRGVzY3JpcHRvcikKLXsKLSAgICBNNFJFQURFUl9QQ01fQ29udGV4dCogICBwQyA9IChNNFJFQURFUl9QQ01fQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICBlcnI7Ci0KLSAgICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9vcGVuOiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwRmlsZURlc2NyaXB0b3IpLCAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fb3BlbjogaW52YWxpZCBwb2ludGVyIHBGaWxlRGVzY3JpcHRvciIpOwotCi0gICAgZXJyID0gTTRQQ01SX29wZW5SZWFkKCYocEMtPm1fY29yZUNvbnRleHQpLCAoTTRPU0FfQ2hhciopcEZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgcEMtPm1fcE9zYUZpbGVSZWFkZXJGY3RzKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICBjbG9zZSB0aGUgcmVhZGVyCi0gKiBAbm90ZQotICogQHBhcmFtICAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgdGhlIGNvbnRleHQgaXMgTlVMTAotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UkVBREVSX1BDTV9jbG9zZShNNE9TQV9Db250ZXh0IGNvbnRleHQpCi17Ci0gICAgTTRSRUFERVJfUENNX0NvbnRleHQqICAgcEMgPSAoTTRSRUFERVJfUENNX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgZXJyOwotCi0gICAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fY2xvc2U6IGludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICAvKiBGcmVlIGF1ZGlvIEFVIGFuZCBhdWRpbyBzdHJlYW0gKi8KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wQXVkaW9TdHJlYW0pCi0gICAgewotICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9hdWRpb0F1LmRhdGFBZGRyZXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNFBDTVJfZnJlZUFVKHBDLT5tX2NvcmVDb250ZXh0LCBwQy0+bV9wQXVkaW9TdHJlYW0tPm1fc3RyZWFtSWQsCi0gICAgICAgICAgICAgICAgICZwQy0+bV9hdWRpb0F1KTsKLSAgICAgICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfUENNX2Nsb3NlOiBFcnJvciB3aGVuIGZyZWVpbmcgYXVkaW8gYWNjZXNzIHVuaXQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZyZWUocEMtPm1fcEF1ZGlvU3RyZWFtKTsKLSAgICAgICAgcEMtPm1fcEF1ZGlvU3RyZWFtID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLQotICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX2NvcmVDb250ZXh0KQotICAgIHsKLSAgICAgICAgLyogQ2xvc2UgdGhhIFBDTSBmaWxlICovCi0gICAgICAgZXJyID0gTTRQQ01SX2Nsb3NlUmVhZChwQy0+bV9jb3JlQ29udGV4dCk7Ci0gICAgICAgcEMtPm1fY29yZUNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBzZXQgZW4gb3B0aW9uIHZhbHVlIG9mIHRoZSByZWFkZXIKLSAqIEBub3RlICAgIHRoaXMgZnVuY3Rpb24gZm9sbG93cyB0aGUgc2V0L2dldCBvcHRpb24gbWVjaGFuaXNtIGRlc2NyaWJlZCBpbiBPU0FMIDMuMAotICogICAgICAgICAgaXQgYWxsb3dzIHRoZSBjYWxsZXIgdG8gc2V0IGEgcHJvcGVydHkgdmFsdWU6Ci0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgb3B0aW9uSWQ6ICAgICAgIChJTikgICAgaW5kaWNhdGVzIHRoZSBvcHRpb24gdG8gc2V0Ci0gKiBAcGFyYW0gICAgcFZhbHVlOiAgICAgICAgIChJTikgICAgcG9pbnRlciB0byBzdHJ1Y3R1cmUgb3IgdmFsdWUgKGFsbG9jYXRlZCBieSB1c2VyKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcHRpb24gaXMgc3RvcmVkCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX09QVElPTl9JRCAgICB3aGVuIHRoZSBvcHRpb24gSUQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFJFQURFUl9QQ01fc2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsIHZvaWQqIHBWYWx1ZSkKLXsKLSAgICBNNFJFQURFUl9QQ01fQ29udGV4dCogcEMgPSAoTTRSRUFERVJfUENNX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fc2V0T3B0aW9uOiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwVmFsdWUpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX3NldE9wdGlvbjogaW52YWxpZCB2YWx1ZSBwb2ludGVyIik7Ci0KLSAgICBzd2l0Y2gob3B0aW9uSWQpCi0gICAgewotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX1NldE9zYUZpbGVSZWFkZXJGY3RzUHRyIDoKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPm1fcE9zYUZpbGVSZWFkZXJGY3RzID0gKE00T1NBX0ZpbGVSZWFkUG9pbnRlciopcFZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQgOgotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIFJldHJpZXZlcyB0aGUgYW4gb3B0aW9uIHZhbHVlIGZyb20gdGhlIHJlYWRlciwgZ2l2ZW4gYW4gb3B0aW9uIElELgotICogQG5vdGUgICAgdGhpcyBmdW5jdGlvbiBmb2xsb3dzIHRoZSBzZXQvZ2V0IG9wdGlvbiBtZWNoYW5pc20gZGVzY3JpYmVkIGluIE9TQUwgMy4wCi0gKiAgICAgICAgICBpdCBhbGxvd3MgdGhlIGNhbGxlciB0byByZXRyaWV2ZSBhIHByb3BlcnR5IHZhbHVlOgotICoKLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAoSU4pIGNvbnRleHQgb2YgdGhlIG5ldHdvcmsgcmVhZGVyCi0gKiBAcGFyYW0gICBvcHRpb25JZDogKElOKSBvcHRpb24gaWRlbnRpZmljYXRvciB3aG9zZSBvcHRpb24gdmFsdWUgaXMgdG8gYmUgcmV0cmlldmVkLgotICogQHBhcmFtICAgcFZhbHVlOiAgKE9VVCkgb3B0aW9uIHZhbHVlIHJldHJpZXZlZC4KLSAqCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfQkFEX09QVElPTl9JRDogdGhlIHJlcXVpcmVkIG9wdGlvbiBpZGVudGlmaWNhdG9yIGlzIHVua25vd24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UkVBREVSX1BDTV9nZXRPcHRpb24oTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNE9TQV9PcHRpb25JRCBvcHRpb25JZCwgdm9pZCogcFZhbHVlKQotewotICAgIE00UkVBREVSX1BDTV9Db250ZXh0KiAgIHBDb250ZXh0ID0gKE00UkVBREVSX1BDTV9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgIGVyciAgICAgID0gTTROT19FUlJPUjsKLQotICAgIC8qIG5vIGNoZWNrIG9mIGNvbnRleHQgYXQgdGhpcyBsZXZlbCBiZWNhdXNlIHNvbWUgb3B0aW9uIGRvZXMgbm90IG5lZWQgaXQgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBWYWx1ZSA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9nZXRPcHRpb246IGludmFsaWQgcG9pbnRlciBvbiB2YWx1ZSIpOwotCi0gICAgc3dpdGNoIChvcHRpb25JZCkKLSAgICB7Ci0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfRHVyYXRpb246Ci0gICAgICAgICooKE00T1NBX1VJbnQzMiopcFZhbHVlKSA9IHBDb250ZXh0LT5tX3BBdWRpb1N0cmVhbS0+bV9kdXJhdGlvbjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9WZXJzaW9uOgotICAgICAgICBlcnIgPSBNNFBDTVJfZ2V0VmVyc2lvbigoTTRfVmVyc2lvbkluZm8qKXBWYWx1ZSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfQ29weXJpZ2h0OgotICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0JpdHJhdGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiogcEJpdHJhdGUgPSAoTTRPU0FfVUludDMyKilwVmFsdWU7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQ29udGV4dC0+bV9wQXVkaW9TdHJlYW0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBCaXRyYXRlID0gcENvbnRleHQtPm1fcEF1ZGlvU3RyZWFtLT5tX2F2ZXJhZ2VCaXRSYXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBCaXRyYXRlID0gMDsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgICBlcnIgPSBNNEVSUl9CQURfT1BUSU9OX0lEOwotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfUENNX2dldE9wdGlvbjogdW5zdXBwb3J0ZWQgb3B0aW9uSWQiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBHZXQgdGhlIG5leHQgc3RyZWFtIGZvdW5kIGluIHRoZSBtZWRpYQotICogQG5vdGUKLSAqCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgICAgICAgKElOKSAgY29udGV4dCBvZiB0aGUgbmV0d29yayByZWFkZXIKLSAqIEBwYXJhbSAgIHBNZWRpYUZhbWlseTogICAoT1VUKSBwb2ludGVyIHRvIGEgdXNlciBhbGxvY2F0ZWQgTTRSRUFERVJfTWVkaWFGYW1pbHkgdGhhdCB3aWxsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgZmlsbGVkCi0gKiBAcGFyYW0gICBwU3RyZWFtSGFuZGxlcjogKE9VVCkgcG9pbnRlciB0byBhIHN0cmVhbSBoYW5kbGVyIHRoYXQgd2lsbCBiZSBhbGxvY2F0ZWQgYW5kIGZpbGxlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIGZvdW5kIHN0cmVhbSBkZXNjcmlwdGlvbgotICoKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgIHRoZXJlIGlzIG5vIGVycm9yLgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgTTRXQVJfTk9fTU9SRV9TVFJFQU0gICAgbm8gbW9yZSBhdmFpbGFibGUgc3RyZWFtIGluIHRoZSBtZWRpYSAoYWxsIHN0cmVhbXMgZm91bmQpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFJFQURFUl9QQ01fZ2V0TmV4dFN0cmVhbShNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00UkVBREVSX01lZGlhRmFtaWx5ICpwTWVkaWFGYW1pbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqKnBTdHJlYW1IYW5kbGVyKQotewotICAgIE00UkVBREVSX1BDTV9Db250ZXh0KiAgIHBDPShNNFJFQURFUl9QQ01fQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICBlcnI7Ci0vKiAgICBNNF9TdHJlYW1IYW5kbGVyKiAgICAgICBwU3RyZWFtSGFuZGxlciA9IE00T1NBX05VTEw7Ki8KLSAgICBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiBzdHJlYW1EZXNjOwotICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogIHBBdWRpb1N0cmVhbUhhbmRsZXI7Ci0gICAgTTRPU0FfRG91YmxlICAgICAgICAgICAgZkR1cmF0aW9uOwotICAgIE00U1lTX1N0cmVhbUlEICAgICAgICAgIHN0cmVhbUlkQXJyYXlbMl07Ci0gICAgTTRQQ01DX0RlY29kZXJTcGVjaWZpY0luZm8qIHBEc2k7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDID09IDApLCAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2dldE5leHRTdHJlYW06IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocE1lZGlhRmFtaWx5ID09IDApLCAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fZ2V0TmV4dFN0cmVhbTogaW52YWxpZCBwb2ludGVyIHRvIE1lZGlhRmFtaWx5Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlciA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9nZXROZXh0U3RyZWFtOiBpbnZhbGlkIHBvaW50ZXIgdG8gU3RyZWFtSGFuZGxlciIpOwotCi0gICAgZXJyID0gTTRQQ01SX2dldE5leHRTdHJlYW0oIHBDLT5tX2NvcmVDb250ZXh0LCAmc3RyZWFtRGVzYyk7Ci0gICAgaWYgKGVyciA9PSBNNFdBUl9OT19NT1JFX1NUUkVBTSkKLSAgICB7Ci0gICAgICAgIHN0cmVhbUlkQXJyYXlbMF0gPSAwOwotICAgICAgICBzdHJlYW1JZEFycmF5WzFdID0gMDsKLSAgICAgICAgZXJyID0gTTRQQ01SX3N0YXJ0UmVhZGluZyhwQy0+bV9jb3JlQ29udGV4dCwgc3RyZWFtSWRBcnJheSk7IC8qdG8gcHV0IGluIG9wZW4gZnVuY3Rpb24qLwotCi0gICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX1NUUkVBTTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICByZXR1cm4gZXJyOyAvKmFsc28gcmV0dXJuIE00V0FSX05PX01PUkVfU1RSRUFNKi8KLSAgICB9Ci0KLSAgICBzd2l0Y2ggKHN0cmVhbURlc2Muc3RyZWFtVHlwZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRTWVNfa0F1ZGlvVW5rbm93bjoKLSAgICAgICAgY2FzZSBNNFNZU19rUENNXzE2Yml0c1M6Ci0gICAgICAgIGNhc2UgTTRTWVNfa1BDTV8xNmJpdHNVOgotICAgICAgICBjYXNlIE00U1lTX2tQQ01fOGJpdHNVOgotICAgICAgICAgICAgKnBNZWRpYUZhbWlseSA9IE00UkVBREVSX2tNZWRpYUZhbWlseUF1ZGlvOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIk00UkVBREVSX1BDTV9nZXROZXh0U3RyZWFtOiBmb3VuZCBhdWRpbyBzdHJlYW0iKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgKnBNZWRpYUZhbWlseSA9IE00UkVBREVSX2tNZWRpYUZhbWlseVVua25vd247Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiTTRSRUFERVJfUENNX2dldE5leHRTdHJlYW06IGZvdW5kIFVOS05PV04gc3RyZWFtIik7Ci0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICB9Ci0KLSAgICBwQXVkaW9TdHJlYW1IYW5kbGVyID0gKE00X0F1ZGlvU3RyZWFtSGFuZGxlciopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNF9BdWRpb1N0cmVhbUhhbmRsZXIpLAotICAgICAgICAgTTRSRUFERVJfV0FWLCAoTTRPU0FfQ2hhciAqKSJNNF9BdWRpb1N0cmVhbUhhbmRsZXIiKTsKLSAgICBpZiAocEF1ZGlvU3RyZWFtSGFuZGxlciA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICBwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3N0cnVjdFNpemUgPSBzaXplb2YoTTRfQXVkaW9TdHJlYW1IYW5kbGVyKTsKLSAgICBwQy0+bV9wQXVkaW9TdHJlYW0gPSAoTTRfU3RyZWFtSGFuZGxlciopKHBBdWRpb1N0cmVhbUhhbmRsZXIpOwotCi0gICAgcERzaSA9IChNNFBDTUNfRGVjb2RlclNwZWNpZmljSW5mbyopKHN0cmVhbURlc2MuZGVjb2RlclNwZWNpZmljSW5mbyk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwRHNpID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2dldE5leHRTdHJlYW06IGludmFsaWQgZGVjb2RlciBzcGVjaWZpYyBpbmZvIGluIHN0cmVhbSIpOwotCi0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA9IHBEc2ktPlNhbXBsZUZyZXF1ZW5jeTsKLSAgICBwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVTYW1wbGVTaXplICAgID0gKE00T1NBX1VJbnQzMikocERzaS0+Qml0c1BlclNhbXBsZS84KTsKLSAgICAvKiBtX2J5dGVGcmFtZUxlbmd0aCBpcyBiYWRseSBuYW1lZDogaXQgaXMgbm90IGluIGJ5dGVzIGJ1dCBpbiBzYW1wbGVzIG51bWJlciAqLwotICAgIGlmKHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fc2FtcGxpbmdGcmVxdWVuY3kgPT0gODAwMCkKLSAgICB7Ci0gICAgICAgIC8qIEFNUiBjYXNlICovCi0gICAgICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fYnl0ZUZyYW1lTGVuZ3RoICAgPQotICAgICAgICAgICAgICgoKHN0cmVhbURlc2MuYXZlcmFnZUJpdHJhdGUvOCkvNTApL3BEc2ktPm5iQ2hhbm5lbHMpXAotICAgICAgICAgICAgICAgIC9wQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVTYW1wbGVTaXplOy8qLzUwIHRvIGdldCBhcm91bmQgMjAgbXMgb2YgYXVkaW8qLwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBBQUMgQ2FzZSAqLwotICAgICAgICBwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVGcmFtZUxlbmd0aCA9Ci0gICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKChzdHJlYW1EZXNjLmF2ZXJhZ2VCaXRyYXRlLzgpLzE1LjYyNSkvcERzaS0+bmJDaGFubmVscylcCi0gICAgICAgICAgICAgICAgL3BBdWRpb1N0cmVhbUhhbmRsZXItPm1fYnl0ZVNhbXBsZVNpemU7Ci0gICAgfQotCi0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9uYkNoYW5uZWxzICAgICAgICA9IHBEc2ktPm5iQ2hhbm5lbHM7Ci0KLSAgICBNNE9TQV9USU1FX1RPX01TKCBmRHVyYXRpb24sIHN0cmVhbURlc2MuZHVyYXRpb24sIHN0cmVhbURlc2MudGltZVNjYWxlKTsKLSAgICBwQy0+bV9wQXVkaW9TdHJlYW0tPm1fZHVyYXRpb24gICAgICAgICAgICAgICAgPSAoTTRPU0FfSW50MzIpZkR1cmF0aW9uOwotICAgIHBDLT5tX3BBdWRpb1N0cmVhbS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyAgICA9IChNNE9TQV9VSW50OCopKHN0cmVhbURlc2MuZGVjb2RlclNwZWNpZmljSW5mbyk7Ci0gICAgcEMtPm1fcEF1ZGlvU3RyZWFtLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0gc3RyZWFtRGVzYy5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsKLSAgICBwQy0+bV9wQXVkaW9TdHJlYW0tPm1fc3RyZWFtSWQgICAgICAgICAgICAgICAgPSBzdHJlYW1EZXNjLnN0cmVhbUlEOwotICAgIHBDLT5tX3BBdWRpb1N0cmVhbS0+bV9wVXNlckRhdGEgICAgICAgICAgICAgICA9Ci0gICAgICAgICh2b2lkKilzdHJlYW1EZXNjLnRpbWVTY2FsZTsgLyp0cmljayB0byBjaGFuZ2UqLwotICAgIHBDLT5tX3BBdWRpb1N0cmVhbS0+bV9hdmVyYWdlQml0UmF0ZSAgICAgICAgICA9IHN0cmVhbURlc2MuYXZlcmFnZUJpdHJhdGU7Ci0gICAgcEMtPm1fcEF1ZGlvU3RyZWFtLT5tX21heEFVU2l6ZSAgICAgICAgICAgICAgID0KLSAgICAgICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fYnl0ZUZyYW1lTGVuZ3RoKnBBdWRpb1N0cmVhbUhhbmRsZXItPm1fYnl0ZVNhbXBsZVNpemVcCi0gICAgICAgICAgICAqcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9uYkNoYW5uZWxzOwotICAgIHBDLT5tX3BBdWRpb1N0cmVhbS0+bV9zdHJlYW1UeXBlICAgICAgICAgICAgICA9IE00REFfU3RyZWFtVHlwZUF1ZGlvUGNtOwotCi0gICAgKnBTdHJlYW1IYW5kbGVyID0gcEMtPm1fcEF1ZGlvU3RyZWFtOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgZmlsbCB0aGUgYWNjZXNzIHVuaXQgc3RydWN0dXJlIHdpdGggaW5pdGlhbGl6YXRpb24gdmFsdWVzCi0gKiBAbm90ZQotICoKLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgICAgICAoSU4pIGNvbnRleHQgb2YgdGhlIG5ldHdvcmsgcmVhZGVyCi0gKiBAcGFyYW0gICBwU3RyZWFtSGFuZGxlcjogKElOKSBwb2ludGVyIHRvIHRoZSBzdHJlYW0gaGFuZGxlciB0byB3aGljaCB0aGUgYWNjZXNzIHVuaXQgd2lsbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBhc3NvY2lhdGVkCi0gKiBAcGFyYW0gICBwQWNjZXNzVW5pdDogICAgKElOKSBwb2ludGVyIHRvIHRoZSBhY2Nlc3MgdW5pdChhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlcikgdG8gaW5pdGlhbGl6ZQotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgdGhlcmUgaXMgbm8gZXJyb3IuCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFJFQURFUl9QQ01fZmlsbEF1U3RydWN0KE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfQWNjZXNzVW5pdCAqcEFjY2Vzc1VuaXQpCi17Ci0gICAgTTRSRUFERVJfUENNX0NvbnRleHQqICAgcEMgPSAoTTRSRUFERVJfUENNX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRTWVNfQWNjZXNzVW5pdCogICAgICAgcEF1OwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQyA9PSAwKSwgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9maWxsQXVTdHJ1Y3Q6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fZmlsbEF1U3RydWN0OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfU3RyZWFtSGFuZGxlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocEFjY2Vzc1VuaXQgPT0gMCksICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fZmlsbEF1U3RydWN0OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfQWNjZXNzVW5pdCIpOwotCi0gICAgaWYgKHBTdHJlYW1IYW5kbGVyID09IChNNF9TdHJlYW1IYW5kbGVyKilwQy0+bV9wQXVkaW9TdHJlYW0pCi0gICAgewotICAgICAgICBwQXUgPSAmcEMtPm1fYXVkaW9BdTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX1BDTV9maWxsQXVTdHJ1Y3Q6IHBhc3NlZCBTdHJlYW1IYW5kbGVyIGlzIG5vdCBrbm93biIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIHBBdS0+ZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIHBBdS0+c2l6ZSAgICAgICAgPSAwOwotICAgIHBBdS0+Q1RTICAgICAgICAgPSAwOwotICAgIHBBdS0+RFRTICAgICAgICAgPSAwOwotICAgIHBBdS0+YXR0cmlidXRlICAgPSAwOwotICAgIHBBdS0+bmJGcmFnICAgICAgPSAwOwotCi0gICAgcEFjY2Vzc1VuaXQtPm1fc2l6ZSAgICAgICAgID0gMDsKLSAgICBwQWNjZXNzVW5pdC0+bV9DVFMgICAgICAgICAgPSAwOwotICAgIHBBY2Nlc3NVbml0LT5tX0RUUyAgICAgICAgICA9IDA7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fYXR0cmlidXRlICAgID0gMDsKLSAgICBwQWNjZXNzVW5pdC0+bV9kYXRhQWRkcmVzcyAgPSBNNE9TQV9OVUxMOy8qcEJ1ZmZlcjsqLwotICAgIHBBY2Nlc3NVbml0LT5tX21heHNpemUgICAgICA9IHBTdHJlYW1IYW5kbGVyLT5tX21heEFVU2l6ZTsKLSAgICBwQWNjZXNzVW5pdC0+bV9zdHJlYW1JRCAgICAgPSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZDsKLSAgICBwQWNjZXNzVW5pdC0+bV9zdHJ1Y3RTaXplICAgPSBzaXplb2YoTTRfQWNjZXNzVW5pdCk7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICByZXNldCB0aGUgc3RyZWFtLCB0aGF0IGlzOiBzZWVrIGl0IHRvIGJlZ2lubmluZyBhbmQgbWFrZSBpdCByZWFkeSB0byBiZSByZWFkCi0gKiBAbm90ZQotICogQHBhcmFtICAgY29udGV4dDogICAgICAgIChJTikgY29udGV4dCBvZiB0aGUgbmV0d29yayByZWFkZXIKLSAqIEBwYXJhbSAgIHBTdHJlYW1IYW5kbGVyOiAoSU4pIFRoZSBzdHJlYW0gaGFuZGxlciBvZiB0aGUgc3RyZWFtIHRvIHJlc2V0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvci4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UkVBREVSX1BDTV9yZXNldChNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyKQotewotICAgIE00UkVBREVSX1BDTV9Db250ZXh0KiAgIHBDID0gKE00UkVBREVSX1BDTV9Db250ZXh0Kiljb250ZXh0OwotICAgIE00U1lTX1N0cmVhbUlEICAgICAgICAgIHN0cmVhbUlkQXJyYXlbMl07Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgZXJyOwotICAgIE00U1lTX0FjY2Vzc1VuaXQqICAgICAgIHBBdTsKLSAgICBNNE9TQV9UaW1lICAgICAgICAgICAgICAgIHRpbWU2NCA9IDA7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDID09IDApLCBNNEVSUl9QQVJBTUVURVIsICJNNFJFQURFUl9QQ01fcmVzZXQ6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fcmVzZXQ6IGludmFsaWQgcG9pbnRlciB0byBNNF9TdHJlYW1IYW5kbGVyIik7Ci0KLSAgICBpZiAocFN0cmVhbUhhbmRsZXIgPT0gKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tX3BBdWRpb1N0cmVhbSkKLSAgICB7Ci0gICAgICAgIHBBdSA9ICZwQy0+bV9hdWRpb0F1OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfUENNX3Jlc2V0OiBwYXNzZWQgU3RyZWFtSGFuZGxlciBpcyBub3Qga25vd24iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiAocEF1LT5kYXRhQWRkcmVzcyAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRQQ01SX2ZyZWVBVShwQy0+bV9jb3JlQ29udGV4dCwgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQsIHBBdSk7Ci0gICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX1BDTV9yZXNldDogZXJyb3Igd2hlbiBmcmVlaW5nIGFjY2VzcyB1bml0Iik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHBBdS0+ZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHN0cmVhbUlkQXJyYXlbMF0gPSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZDsKLSAgICBzdHJlYW1JZEFycmF5WzFdID0gMDsKLQotICAgIHBBdS0+Q1RTID0gMDsKLSAgICBwQXUtPkRUUyA9IDA7Ci0KLSAgICAvKiBUaGlzIGNhbGwgaXMgbmVlZGVkIG9ubHkgd2hlbiByZXBsYXkgZHVyaW5nIHBsYXliYWNrICovCi0gICAgZXJyID0gTTRQQ01SX3NlZWsocEMtPm1fY29yZUNvbnRleHQsIHN0cmVhbUlkQXJyYXksIHRpbWU2NCwgTTRTWVNfa0JlZ2lubmluZywgJnRpbWU2NCk7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIEdldCB0aGUgbmV4dCBhY2Nlc3MgdW5pdCBvZiB0aGUgc3BlY2lmaWVkIHN0cmVhbQotICogQG5vdGUKLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgICAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgIHBTdHJlYW1IYW5kbGVyICAoSU4pICAgICAgICBUaGUgc3RyZWFtIGhhbmRsZXIgb2YgdGhlIHN0cmVhbSB0byBtYWtlIGp1bXAKLSAqIEBwYXJhbSAgIHBBY2Nlc3NVbml0ICAgICAoSU4vT1VUKSAgICBQb2ludGVyIHRvIGFuIGFjY2VzcyB1bml0IHRvIGZpbGwgd2l0aCByZWFkIGRhdGEKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhlIGF1IHN0cnVjdHVyZSBpcyBhbGxvY2F0ZWQgYnkgdGhlIHVzZXIsIGFuZCBtdXN0IGJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IGNhbGxpbmcgTTRSRUFERVJfZmlsbEF1U3RydWN0X2ZjdCBhZnRlciBjcmVhdGlvbikKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJucyBNNEVSUl9BTExPQyAgICAgICAgICAgICAgICAgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0gKiBAcmV0dXJucyBNNEVSUl9CQURfU1RSRUFNX0lEICAgICAgICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBzdHJlYW0gSWQuIGRvZXMgbm90IGV4aXN0LgotICogQHJldHVybnMgTTRXQVJfTk9fREFUQV9ZRVQgICAgICAgICAgIHRoZXJlIGlzIG5vIGVub3VnaCBkYXRhIG9uIHRoZSBzdHJlYW0gZm9yIG5ldyBhY2Nlc3MgdW5pdAotICogQHJldHVybnMgTTRXQVJfTk9fTU9SRV9BVSAgICAgICAgICAgIHRoZXJlIGFyZSBubyBtb3JlIGFjY2VzcyB1bml0IGluIHRoZSBzdHJlYW0gKGVuZCBvZiBzdHJlYW0pCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFJFQURFUl9QQ01fZ2V0TmV4dEF1KE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9BY2Nlc3NVbml0ICpwQWNjZXNzVW5pdCkKLXsKLSAgICBNNFJFQURFUl9QQ01fQ29udGV4dCogICBwQyA9IChNNFJFQURFUl9QQ01fQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00U1lTX0FjY2Vzc1VuaXQqICAgICAgIHBBdTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgocEMgPT0gMCksICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fZ2V0TmV4dEF1OiBpbnZhbGlkIGNvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBTdHJlYW1IYW5kbGVyID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2dldE5leHRBdTogaW52YWxpZCBwb2ludGVyIHRvIE00X1N0cmVhbUhhbmRsZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBBY2Nlc3NVbml0ID09IDApLCAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2dldE5leHRBdTogaW52YWxpZCBwb2ludGVyIHRvIE00X0FjY2Vzc1VuaXQiKTsKLQotICAgIC8qIGtlZXAgdHJhY2Ugb2YgdGhlIGFsbG9jYXRlZCBidWZmZXJzIGluIEFVIHRvIGJlIGFibGUgdG8gZnJlZSB0aGVtIGF0IGRlc3Ryb3koKQotICAgICAgIGJ1dCBiZSBhd2FyZSB0aGF0IHN5c3RlbSBpcyByaXNreSBhbmQgd291bGQgbmVlZCB1cGdyYWRlIGlmIG1vcmUgdGhhbgotICAgICAgIG9uZSB2aWRlbyBhbmQgb25lIGF1ZGlvIEFVIGlzIG5lZWRlZCAqLwotICAgIGlmIChwU3RyZWFtSGFuZGxlciA9PSAoTTRfU3RyZWFtSGFuZGxlciopcEMtPm1fcEF1ZGlvU3RyZWFtKQotICAgIHsKLSAgICAgICAgcEF1ID0gJnBDLT5tX2F1ZGlvQXU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9QQ01fZ2V0TmV4dEF1OiBwYXNzZWQgU3RyZWFtSGFuZGxlciBpcyBub3Qga25vd24iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiAocEF1LT5kYXRhQWRkcmVzcyAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRQQ01SX2ZyZWVBVShwQy0+bV9jb3JlQ29udGV4dCwgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQsIHBBdSk7Ci0gICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX1BDTV9nZXROZXh0QXU6IGVycm9yIHdoZW4gZnJlZWluZyBhY2Nlc3MgdW5pdCIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHBBdS0+bmJGcmFnID0gMDsKLSAgICBlcnIgPSBNNFBDTVJfbmV4dEFVKHBDLT5tX2NvcmVDb250ZXh0LCBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZCwgcEF1KTsKLQotICAgIGlmIChlcnIgPT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIHBBY2Nlc3NVbml0LT5tX2RhdGFBZGRyZXNzID0gKE00T1NBX01lbUFkZHI4KXBBdS0+ZGF0YUFkZHJlc3M7Ci0gICAgICAgIHBBY2Nlc3NVbml0LT5tX3NpemUgPSBwQXUtPnNpemU7Ci0gICAgICAgIHBBY2Nlc3NVbml0LT5tX0NUUyAgPSAoTTRPU0FfRG91YmxlKXBBdS0+Q1RTOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9EVFMgID0gKE00T1NBX0RvdWJsZSlwQXUtPkRUUzsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fYXR0cmlidXRlID0gcEF1LT5hdHRyaWJ1dGU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBBY2Nlc3NVbml0LT5tX3NpemU9MDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAganVtcCBpbnRvIHRoZSBzdHJlYW0gYXQgdGhlIHNwZWNpZmllZCB0aW1lCi0gKiBAbm90ZQotICogQHBhcmFtICAgY29udGV4dDogICAgICAgIChJTikgICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgcFN0cmVhbUhhbmRsZXIgIChJTikgICAgIHRoZSBzdHJlYW0gaGFuZGxlciBvZiB0aGUgc3RyZWFtIHRvIG1ha2UganVtcAotICogQHBhcmFtICAgcFRpbWUgICAgICAgICAgIChJTi9PVVQpIElOOiAgdGhlIHRpbWUgdG8ganVtcCB0byAoaW4gbXMpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOiB0aGUgdGltZSB0byB3aGljaCB0aGUgc3RyZWFtIHJlYWxseSBqdW1wZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1dCBpbiB0aGlzIHJlYWRlciwgd2UgZG8gbm90IG1vZGlmeSB0aGUgdGltZQotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX0JBRF9DT05URVhUICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DICAgICAgICAgICAgIHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICogQHJldHVybiAgTTRFUlJfQkFEX1NUUkVBTV9JRCAgICAgdGhlIHN0cmVhbUlEIGRvZXMgbm90IGV4aXN0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFJFQURFUl9QQ01fanVtcChNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLAotICAgICBNNE9TQV9JbnQzMiogcFRpbWUpCi17Ci0gICAgTTRSRUFERVJfUENNX0NvbnRleHQqICAgcEMgPSAoTTRSRUFERVJfUENNX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRTWVNfU3RyZWFtSUQgICAgICAgICAgc3RyZWFtSWRBcnJheVsyXTsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICBlcnI7Ci0gICAgTTRTWVNfQWNjZXNzVW5pdCogICAgICAgcEF1OwotICAgIE00T1NBX1RpbWUgICAgICAgICAgICAgICAgdGltZTY0OwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQyA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLCAiTTRSRUFERVJfUENNX2p1bXA6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fanVtcDogaW52YWxpZCBwb2ludGVyIHRvIE00X1N0cmVhbUhhbmRsZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBUaW1lID09IDApLCBNNEVSUl9QQVJBTUVURVIsICJNNFJFQURFUl9QQ01fanVtcDogaW52YWxpZCB0aW1lIHBvaW50ZXIiKTsKLQotICAgIHRpbWU2NCA9IChNNE9TQV9UaW1lKSpwVGltZTsKLQotICAgIGlmIChwU3RyZWFtSGFuZGxlciA9PSBwQy0+bV9wQXVkaW9TdHJlYW0pCi0gICAgewotICAgICAgICBwQXUgPSAmcEMtPm1fYXVkaW9BdTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX1BDTV9qdW1wOiBwYXNzZWQgU3RyZWFtSGFuZGxlciBpcyBub3Qga25vd24iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiAocEF1LT5kYXRhQWRkcmVzcyAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRQQ01SX2ZyZWVBVShwQy0+bV9jb3JlQ29udGV4dCwgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQsIHBBdSk7Ci0gICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX1BDTV9qdW1wOiBFcnJvciB3aGVuIGZyZWVpbmcgYWNjZXNzIHVuaXQiKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgcEF1LT5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgc3RyZWFtSWRBcnJheVswXSA9IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkOwotICAgIHN0cmVhbUlkQXJyYXlbMV0gPSAwOwotCi0gICAgcEF1LT5DVFMgPSB0aW1lNjQ7Ci0gICAgcEF1LT5EVFMgPSB0aW1lNjQ7Ci0KLSAgICBlcnIgPSBNNFBDTVJfc2VlayhwQy0+bV9jb3JlQ29udGV4dCwgc3RyZWFtSWRBcnJheSwgdGltZTY0LCBNNFNZU19rQmVnaW5uaW5nLCAmdGltZTY0KTsKLQotICAgICpwVGltZSA9IChNNE9TQV9JbnQzMil0aW1lNjQ7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgUmV0cmlldmVzIHRoZSBnZW5lcmljIGludGVyZmFjZXMgaW1wbGVtZW50ZWQgYnkgdGhlIHJlYWRlcgotICoKLSAqIEBwYXJhbSBwTWVkaWFUeXBlICAgICAgICAgIDogUG9pbnRlciBvbiBhIE00UkVBREVSX01lZGlhVHlwZSAoYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgbWVkaWEgdHlwZSBzdXBwb3J0ZWQgYnkgdGhpcyByZWFkZXIKLSAqIEBwYXJhbSBwUmRyR2xvYmFsSW50ZXJmYWNlIDogQWRkcmVzcyBvZiBhIHBvaW50ZXIgdGhhdCB3aWxsIGJlIHNldCB0byB0aGUgZ2xvYmFsIGludGVyZmFjZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZCBieSB0aGlzIHJlYWRlci4gVGhlIGludGVyZmFjZSBpcyBhIHN0cnVjdHVyZSBhbGxvY2F0ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIGZ1bmN0aW9uIGFuZCBtdXN0IGJlIHVuLWFsbG9jYXRlZCBieSB0aGUgY2FsbGVyLgotICogQHBhcmFtIHBSZHJEYXRhSW50ZXJmYWNlICAgOiBBZGRyZXNzIG9mIGEgcG9pbnRlciB0aGF0IHdpbGwgYmUgc2V0IHRvIHRoZSBkYXRhIGludGVyZmFjZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZCBieSB0aGlzIHJlYWRlci4gVGhlIGludGVyZmFjZSBpcyBhIHN0cnVjdHVyZSBhbGxvY2F0ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIGZ1bmN0aW9uIGFuZCBtdXN0IGJlIHVuLWFsbG9jYXRlZCBieSB0aGUgY2FsbGVyLgotICoKLSAqIEByZXR1cm5zIDogTTROT19FUlJPUiAgICAgaWYgT0sKLSAqICAgICAgICAgICAgRVJSX0FMTE9DICAgICAgaWYgYW4gYWxsb2NhdGlvbiBmYWlsZWQKLSAqICAgICAgICAgICAgRVJSX1BBUkFNRVRFUiAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRSRUFERVJfUENNX2dldEludGVyZmFjZXMoTTRSRUFERVJfTWVkaWFUeXBlICpwTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlICoqcFJkckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKipwUmRyRGF0YUludGVyZmFjZSkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwTWVkaWFUeXBlID09IDApLCAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2dldEludGVyZmFjZXM6IGludmFsaWQgcG9pbnRlciB0byBNZWRpYVR5cGUgcGFzc2VkIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwUmRyR2xvYmFsSW50ZXJmYWNlID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2dldEludGVyZmFjZXM6IGludmFsaWQgcG9pbnRlciB0byBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBSZHJEYXRhSW50ZXJmYWNlID09IDApLCAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fZ2V0SW50ZXJmYWNlczogaW52YWxpZCBwb2ludGVyIHRvIE00UkVBREVSX0RhdGFJbnRlcmZhY2UiKTsKLQotICAgICpwUmRyR2xvYmFsSW50ZXJmYWNlID0KLSAgICAgICAgIChNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyggc2l6ZW9mKE00UkVBREVSX0dsb2JhbEludGVyZmFjZSksIE00UkVBREVSX1dBViwKLSAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJNNFJFQURFUl9QQ00gR2xvYmFsSW50ZXJmYWNlIik7Ci0gICAgaWYgKE00T1NBX05VTEwgPT0gKnBSZHJHbG9iYWxJbnRlcmZhY2UpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgICpwUmRyRGF0YUludGVyZmFjZSA9Ci0gICAgICAgICAoTTRSRUFERVJfRGF0YUludGVyZmFjZSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKCBzaXplb2YoTTRSRUFERVJfRGF0YUludGVyZmFjZSksIE00UkVBREVSX1dBViwKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopICJNNFJFQURFUl9QQ00gRGF0YUludGVyZmFjZSIpOwotICAgIGlmIChNNE9TQV9OVUxMID09ICpwUmRyRGF0YUludGVyZmFjZSkKLSAgICB7Ci0gICAgICAgIGZyZWUoKnBSZHJHbG9iYWxJbnRlcmZhY2UpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgKnBNZWRpYVR5cGUgPSBNNFJFQURFUl9rTWVkaWFUeXBlUENNOwotCi0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0Q3JlYXRlICAgICAgICAgICA9IE00UkVBREVSX1BDTV9jcmVhdGU7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0RGVzdHJveSAgICAgICAgICA9IE00UkVBREVSX1BDTV9kZXN0cm95OwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdE9wZW4gICAgICAgICAgICAgPSBNNFJFQURFUl9QQ01fb3BlbjsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RDbG9zZSAgICAgICAgICAgID0gTTRSRUFERVJfUENNX2Nsb3NlOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdFN0YXJ0ICAgICAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdFN0b3AgICAgICAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdEdldE9wdGlvbiAgICAgICAgPSBNNFJFQURFUl9QQ01fZ2V0T3B0aW9uOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdFNldE9wdGlvbiAgICAgICAgPSBNNFJFQURFUl9QQ01fc2V0T3B0aW9uOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdEdldE5leHRTdHJlYW0gICAgPSBNNFJFQURFUl9QQ01fZ2V0TmV4dFN0cmVhbTsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RGaWxsQXVTdHJ1Y3QgICAgID0gTTRSRUFERVJfUENNX2ZpbGxBdVN0cnVjdDsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RKdW1wICAgICAgICAgICAgID0gTTRSRUFERVJfUENNX2p1bXA7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0UmVzZXQgICAgICAgICAgICA9IE00UkVBREVSX1BDTV9yZXNldDsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RHZXRQcmV2UmFwVGltZSAgID0gTTRPU0FfTlVMTDsgLyphbGwgQVVzIGFyZSBSQVAqLwotCi0gICAgKCpwUmRyRGF0YUludGVyZmFjZSktPm1fcEZjdEdldE5leHRBdSAgICAgICAgICA9IE00UkVBREVSX1BDTV9nZXROZXh0QXU7Ci0KLSAgICAoKnBSZHJEYXRhSW50ZXJmYWNlKS0+bV9yZWFkZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWRF9FWFRFUk5BTF9CaXRzdHJlYW1QYXJzZXIuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWRF9FWFRFUk5BTF9CaXRzdHJlYW1QYXJzZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2M2N2U3Mi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VkRfRVhURVJOQUxfQml0c3RyZWFtUGFyc2VyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2OTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jaW5jbHVkZSAidXRpbHMvTG9nLmgiCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotCi0jaW5jbHVkZSAiTTRWRF9FWFRFUk5BTF9JbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJNNFZEX1Rvb2xzLmgiCi0jaW5jbHVkZSAiTTRfVmlkZW9FZGl0aW5nQ29tbW9uLmgiCi0jaW5jbHVkZSAiT01YX1ZpZGVvLmgiCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRWRF9FWFRFUk5BTF9CaXRzdHJlYW1QYXJzZXIuYwotICogQGJyaWVmCi0gKiBAbm90ZSAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGV4dGVybmFsIEJpdHN0cmVhbSBwYXJzZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTTRPU0FfVUludDggY29kZTsKLSAgICBNNE9TQV9JbnQzMiBwcm9maWxlOwotICAgIE00T1NBX0ludDMyIGxldmVsOwotfSBjb2RlUHJvZmlsZUxldmVsOwotCi1zdGF0aWMgY29kZVByb2ZpbGVMZXZlbCBtcGVnNFByb2ZpbGVMZXZlbFRhYmxlW10gPSB7Ci0gICAgezB4MDEsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsMX0sCi0gICAgezB4MDIsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsMn0sCi0gICAgezB4MDMsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsM30sCi0gICAgezB4MDQsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsNGF9LAotICAgIHsweDA1LCBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDV9LAotICAgIHsweDA4LCBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDB9LAotICAgIHsweDExLCBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlU2NhbGFibGUsT01YX1ZJREVPX01QRUc0TGV2ZWwxfSwKLSAgICB7MHgxMiwgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZVNjYWxhYmxlLE9NWF9WSURFT19NUEVHNExldmVsMn0sCi0gICAgezB4MjEsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVDb3JlLCBPTVhfVklERU9fTVBFRzRMZXZlbDF9LAotICAgIHsweDIyLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQ29yZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwyfSwKLSAgICB7MHgzMiwgT01YX1ZJREVPX01QRUc0UHJvZmlsZU1haW4sIE9NWF9WSURFT19NUEVHNExldmVsMn0sCi0gICAgezB4MzMsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVNYWluLCBPTVhfVklERU9fTVBFRzRMZXZlbDN9LAotICAgIHsweDM0LCBPTVhfVklERU9fTVBFRzRQcm9maWxlTWFpbiwgT01YX1ZJREVPX01QRUc0TGV2ZWw0fSwKLSAgICB7MHg0MiwgT01YX1ZJREVPX01QRUc0UHJvZmlsZU5iaXQsIE9NWF9WSURFT19NUEVHNExldmVsMn0sCi0gICAgezB4NTEsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTY2FsYWJsZVRleHR1cmUsIE9NWF9WSURFT19NUEVHNExldmVsMX0sCi0gICAgezB4NjEsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGVGYWNlLCBPTVhfVklERU9fTVBFRzRMZXZlbDF9LAotICAgIHsweDYyLCBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlRmFjZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwyfSwKLSAgICB7MHg3MSwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUJhc2ljQW5pbWF0ZWQsIE9NWF9WSURFT19NUEVHNExldmVsMX0sCi0gICAgezB4NzIsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVCYXNpY0FuaW1hdGVkLCBPTVhfVklERU9fTVBFRzRMZXZlbDJ9LAotICAgIHsweDgxLCBPTVhfVklERU9fTVBFRzRQcm9maWxlSHlicmlkLCBPTVhfVklERU9fTVBFRzRMZXZlbDF9LAotICAgIHsweDgyLCBPTVhfVklERU9fTVBFRzRQcm9maWxlSHlicmlkLCBPTVhfVklERU9fTVBFRzRMZXZlbDJ9LAotICAgIHsweDkxLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRSZWFsVGltZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwxfSwKLSAgICB7MHg5MiwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkUmVhbFRpbWUsIE9NWF9WSURFT19NUEVHNExldmVsMn0sCi0gICAgezB4OTMsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFJlYWxUaW1lLCBPTVhfVklERU9fTVBFRzRMZXZlbDN9LAotICAgIHsweDk0LCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRSZWFsVGltZSwgT01YX1ZJREVPX01QRUc0TGV2ZWw0fSwKLSAgICB7MHhhMSwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUNvcmVTY2FsYWJsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwxfSwKLSAgICB7MHhhMiwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUNvcmVTY2FsYWJsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwyfSwKLSAgICB7MHhhMywgT01YX1ZJREVPX01QRUc0UHJvZmlsZUNvcmVTY2FsYWJsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwzfSwKLSAgICB7MHhiMSwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkQ29kaW5nLCBPTVhfVklERU9fTVBFRzRMZXZlbDF9LAotICAgIHsweGIyLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRDb2RpbmcsIE9NWF9WSURFT19NUEVHNExldmVsMn0sCi0gICAgezB4YjMsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZENvZGluZywgT01YX1ZJREVPX01QRUc0TGV2ZWwzfSwKLSAgICB7MHhiNCwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkQ29kaW5nLCBPTVhfVklERU9fTVBFRzRMZXZlbDR9LAotICAgIHsweGMxLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRDb3JlLCBPTVhfVklERU9fTVBFRzRMZXZlbDF9LAotICAgIHsweGMyLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRDb3JlLCBPTVhfVklERU9fTVBFRzRMZXZlbDJ9LAotICAgIHsweGQxLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTY2FsYWJsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwxfSwKLSAgICB7MHhkMiwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2NhbGFibGUsIE9NWF9WSURFT19NUEVHNExldmVsMn0sCi0gICAgezB4ZDMsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNjYWxhYmxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDN9LAotICAgIHsweGYwLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsMH0sCi0gICAgezB4ZjEsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwxfSwKLSAgICB7MHhmMiwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDJ9LAotICAgIHsweGYzLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsM30sCi0gICAgezB4ZjQsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWw0fSwKLSAgICB7MHhmNSwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDV9Ci19OwotCi1NNE9TQV9VSW50MzIgTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeShNNFZTX0JpdHN0cmVhbV9jdHh0KiBwYXJzaW5nQ3R4dCwKLSAgICAgTTRPU0FfVUludDMyIG5iX2JpdHMpCi17Ci0gICAgICAgIHJldHVybihNNFZEX1Rvb2xzX0dldEJpdHNGcm9tTWVtb3J5KHBhcnNpbmdDdHh0LG5iX2JpdHMpKTsKLX0KLQotTTRPU0FfRVJSIE00VkRfRVhURVJOQUxfV3JpdGVCaXRzVG9NZW1vcnkoTTRPU0FfVUludDMyIGJpdHNUb1dyaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX01lbUFkZHIzMiBkZXN0X2JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggb2Zmc2V0LCBNNE9TQV9VSW50OCBuYl9iaXRzKQotewotICAgICAgICByZXR1cm4gKE00VkRfVG9vbHNfV3JpdGVCaXRzVG9NZW1vcnkoIGJpdHNUb1dyaXRlLGRlc3RfYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwgIG5iX2JpdHMpKTsKLX0KLQotTTRPU0FfRVJSIE00REVDT0RFUl9FWFRFUk5BTF9QYXJzZVZpZGVvRFNJKE00T1NBX1VJbnQ4KiBwVm9sLCBNNE9TQV9JbnQzMiBhVm9sU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9NUEVHNF9EZWNvZGVyQ29uZmlnSW5mbyogcERjaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9WaWRlb1NpemUqIHBWaWRlb1NpemUpCi17Ci0gICAgTTRWU19CaXRzdHJlYW1fY3R4dCBwYXJzaW5nQ3R4dDsKLSAgICBNNE9TQV9VSW50MzIgY29kZSwgajsKLSAgICBNNE9TQV9NZW1BZGRyOCBzdGFydDsKLSAgICBNNE9TQV9VSW50OCBpOwotICAgIE00T1NBX1VJbnQzMiB0aW1lX2luY3JfbGVuZ3RoOwotICAgIE00T1NBX1VJbnQ4IHZvbF92ZXJpZD0wLCBiX2hpZXJhcmNoeV90eXBlOwotCi0gICAgLyogUGFyc2luZyB2YXJpYWJsZXMgKi8KLSAgICBNNE9TQV9VSW50OCB2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgPSAwOwotICAgIE00T1NBX1VJbnQ4IHNwcml0ZV9lbmFibGUgPSAwOwotICAgIE00T1NBX1VJbnQ4IHJlZHVjZWRfcmVzb2x1dGlvbl92b3BfZW5hYmxlID0gMDsKLSAgICBNNE9TQV9VSW50OCBzY2FsYWJpbGl0eSA9IDA7Ci0gICAgTTRPU0FfVUludDggZW5oYW5jZW1lbnRfdHlwZSA9IDA7Ci0gICAgTTRPU0FfVUludDggY29tcGxleGl0eV9lc3RpbWF0aW9uX2Rpc2FibGUgPSAwOwotICAgIE00T1NBX1VJbnQ4IGludGVybGFjZWQgPSAwOwotICAgIE00T1NBX1VJbnQ4IHNwcml0ZV93YXJwaW5nX3BvaW50cyA9IDA7Ci0gICAgTTRPU0FfVUludDggc3ByaXRlX2JyaWdodG5lc3NfY2hhbmdlID0gMDsKLSAgICBNNE9TQV9VSW50OCBxdWFudF9wcmVjaXNpb24gPSAwOwotCi0gICAgLyogRmlsbCB0aGUgc3RydWN0dXJlIHdpdGggZGVmYXVsdCBwYXJhbWV0ZXJzICovCi0gICAgcFZpZGVvU2l6ZS0+bV91aVdpZHRoICAgICAgICAgICAgICA9IDA7Ci0gICAgcFZpZGVvU2l6ZS0+bV91aUhlaWdodCAgICAgICAgICAgICA9IDA7Ci0KLSAgICBwRGNpLT51aVRpbWVTY2FsZSAgICAgICAgICA9IDA7Ci0gICAgcERjaS0+dWlQcm9maWxlICAgICAgICAgICAgPSAwOwotICAgIHBEY2ktPnVpVXNlT2ZSZXN5bmNoTWFya2VyID0gMDsKLSAgICBwRGNpLT5iRGF0YVBhcnRpdGlvbiAgICAgICA9IE00T1NBX0ZBTFNFOwotICAgIHBEY2ktPmJVc2VPZlJWTEMgICAgICAgICAgID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKiBSZXNldCB0aGUgYml0c3RyZWFtIGNvbnRleHQgKi8KLSAgICBwYXJzaW5nQ3R4dC5zdHJlYW1fYnl0ZSA9IDA7Ci0gICAgcGFyc2luZ0N0eHQuc3RyZWFtX2luZGV4ID0gODsKLSAgICBwYXJzaW5nQ3R4dC5pbiA9IChNNE9TQV9JbnQ4ICopcFZvbDsKLQotICAgIHN0YXJ0ID0gKE00T1NBX0ludDggKilwVm9sOwotCi0gICAgLyogU3RhcnQgcGFyc2luZyAqLwotICAgIHdoaWxlIChwYXJzaW5nQ3R4dC5pbiAtIHN0YXJ0IDwgYVZvbFNpemUpCi0gICAgewotICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDgpOwotICAgICAgICBpZiAoY29kZSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDgpOwotICAgICAgICAgICAgaWYgKGNvZGUgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDgpOwotICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBzdGFydCBjb2RlIGZvdW5kICovCi0gICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgOCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogLS0tLS0gMHgyMC4uMHgyRiA6IHZpZGVvX29iamVjdF9sYXllcl9zdGFydF9jb2RlIC0tLS0tICovCi0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChjb2RlID4gMHgxRikgJiYgKGNvZGUgPCAweDMwKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogcmFuZG9tIGFjY2Vzc2libGUgdm9sICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4KTsvKiB2aWRlbyBvYmplY3QgdHlwZSBpbmRpY2F0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBpcyBvYmplY3QgbGF5ZXIgaWRlbnRpZmllciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCk7IC8qIHZpZGVvIG9iamVjdCBsYXllciB2ZXJpZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbF92ZXJpZCA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzKTsgLyogdmlkZW8gb2JqZWN0IGxheWVyIHByaW9yaXR5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0KTsvKiBhc3BlY3QgcmF0aW8gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDE1KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNik7IC8qIHBhcl93aWR0aCBhbmQgcGFyX2hlaWdodCAoOCs4KSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7Lyogdm9sIGNvbnRyb2wgcGFyYW1ldGVycyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyk7LyogY2hyb21hIGZvcm1hdCArIGxvdyBkZWxheSAoMysxKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiB2YnYgcGFyYW1ldGVycyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyKTsvKiBmaXJzdCBhbmQgbGF0dGVyIGhhbGYgYml0cmF0ZSArIDIgbWFya2VyIGJpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE1ICsgMSArIDE1ICsgMSkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMSk7LyogZmlyc3QgYW5kIGxhdHRlciBoYWxmIHZidiBidWZmZXIgc2l6ZSArIGZpcnN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxmIHZidiBvY2N1cGFuY3kgKyBtYXJrZXIgYml0cyAoMTUrMSszKzExKzEpKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNik7LyogZmlyc3QgaGFsZiB2YnYgb2NjdXBhbmN5ICsgbWFya2VyIGJpdHMgKDE1KzEpKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKTsgLyogdmlkZW8gb2JqZWN0IGxheWVyIHNoYXBlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBOZWVkIHRvIHNhdmUgaXQgZm9yIHZvcCBwYXJzaW5nICovCi0gICAgICAgICAgICAgICAgICAgICAgICB2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgPSAoTTRPU0FfVUludDgpY29kZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgIT0gMCkgcmV0dXJuIDA7IC8qIG9ubHkgcmVjdGFuZ3VsYXIgY2FzZSBzdXBwb3J0ZWQgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7IC8qIE1hcmtlciBiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2KTsgLyogVk9QIHRpbWUgaW5jcmVtZW50IHJlc29sdXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBEY2ktPnVpVGltZVNjYWxlID0gY29kZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29tcHV0ZXMgdGltZSBpbmNyZW1lbnQgbGVuZ3RoICovCi0gICAgICAgICAgICAgICAgICAgICAgICBqICAgID0gY29kZSAtIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyAoaSA8IDMyKSAmJiAoaiAhPSAwKTsgaiA+Pj0xKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfaW5jcl9sZW5ndGggPSAoaSA9PSAwKSA/IDEgOiBpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBNYXJrZXIgYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBGaXhlZCBWT1AgcmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZV9pbmNyX2xlbmd0aCk7LyogRml4ZWQgVk9QIHRpbWUgaW5jcmVtZW50ICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSAhPSAxKSAvKiAxID0gQmluYXJ5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodmlkZW9fb2JqZWN0X2xheWVyX3NoYXBlID09IDApIC8qIDAgPSByZWN0YW5ndWxhciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBNYXJrZXIgYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMpOy8qIFdpZHRoICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWaWRlb1NpemUtPm1fdWlXaWR0aCA9IGNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzKTsvKiBIZWlnaHQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZGVvU2l6ZS0+bV91aUhlaWdodCA9IGNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogaW50ZXJsYWNlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJsYWNlZCA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogT0JNQyBkaXNhYmxlICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHZvbF92ZXJpZCA9PSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBzcHJpdGUgZW5hYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlX2VuYWJsZSA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKTsvKiBzcHJpdGUgZW5hYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlX2VuYWJsZSA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzcHJpdGVfZW5hYmxlID09IDEpIHx8IChzcHJpdGVfZW5hYmxlID09IDIpKQotICAgICAgICAgICAgICAgICAgICAgICAgLyogU3ByaXRlIHN0YXRpYyA9IDEgYW5kIFNwcml0ZSBHTUMgPSAyICovCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwcml0ZV9lbmFibGUgIT0gMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMyk7Lyogc3ByaXRlIHdpZHRoICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzKTsvKiBzcHJpdGUgaGVpZ2h0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzKTsvKiBzcHJpdGUgbCBjb29yZGluYXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzKTsvKiBzcHJpdGUgdG9wIGNvb3JkaW5hdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBNYXJrZXIgYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYpOy8qIHNwcml0ZSB3YXJwaW5nIHBvaW50cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZV93YXJwaW5nX3BvaW50cyA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKTsvKiBzcHJpdGUgd2FycGluZyBhY2N1cmFjeSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBzcHJpdGUgYnJpZ2h0bmVzcyBjaGFuZ2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVfYnJpZ2h0bmVzc19jaGFuZ2UgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ByaXRlX2VuYWJsZSAhPSAyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogbG93IGxhdGVuY3kgc3ByaXRlIGVuYWJsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodm9sX3ZlcmlkICE9IDEpICYmICh2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgIT0gMCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBzYWRjdCBkaXNhYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMSk7IC8qIG5vdCA4IGJpdHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0KTsvKiBxdWFudCBwcmVjaXNpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudF9wcmVjaXNpb24gPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQpOy8qIGJpdHMgcGVyIHBpeGVsICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdyZXlzY2FsZSBub3Qgc3VwcG9ydGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZih2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgPT0gMykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyk7IC8qIG5vZ3JheSBxdWFudCB1cGRhdGUgKyBjb21wb3NpdGlvbiBtZXRob2QgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lYXIgY29tcG9zaXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIHF1YW50IHR5cGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogbG9hZCBpbnRyYSBxdWFudCBtYXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgOCk7LyogKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgICAgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IDY0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogbG9hZCBub24gaW50cmEgcXVhbnQgbWF0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDgpOy8qICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICAgID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkgPCA2NCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2xfdmVyaWQgIT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogcXVhcnRlciBzYW1wbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIGNvbXBsZXhpdHkgZXN0aW1hdGlvbiBkaXNhYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV4aXR5X2VzdGltYXRpb25fZGlzYWJsZSA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIHJlc3luYyBtYXJrZXIgZGlzYWJsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcERjaS0+dWlVc2VPZlJlc3luY2hNYXJrZXIgPSAoY29kZSkgPyAwIDogMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIGRhdGEgcGFydGl0aW9ubmVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGNpLT5iRGF0YVBhcnRpdGlvbiA9IChjb2RlKSA/IE00T1NBX1RSVUUgOiBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJldmVyc2libGUgVkxDICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGNpLT5iVXNlT2ZSVkxDID0gKGNvZGUpID8gTTRPU0FfVFJVRSA6IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9sX3ZlcmlkICE9IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsvKiBuZXdwcmVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlZHVjZWQgcmVzb2x1dGlvbiB2b3AgZW5hYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWR1Y2VkX3Jlc29sdXRpb25fdm9wX2VuYWJsZSA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDEpOy8qIHNjYWxhYmlsaXR5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBzY2FsYWJpbGl0eSA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaGllcmFyY2h5IHR5cGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJfaGllcmFyY2h5X3R5cGUgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWYgbGF5ZXIgaWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlZiBzYW1wbGluZyBkaXJlY3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhvciBzYW1wbGluZyBmYWN0b3IgTiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgNSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaG9yIHNhbXBsaW5nIGZhY3RvciBNICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2ZXJ0IHNhbXBsaW5nIGZhY3RvciBOICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2ZXJ0IHNhbXBsaW5nIGZhY3RvciBNICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmhhbmNlbWVudCB0eXBlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmhhbmNlbWVudF90eXBlID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCghYl9oaWVyYXJjaHlfdHlwZSkgJiYgKHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSA9PSAxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVzZSByZWYgc2hhcGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXNlIHJlZiB0ZXh0dXJlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNoYXBlIGhvciBzYW1wbGluZyBmYWN0b3IgTiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaGFwZSBob3Igc2FtcGxpbmcgZmFjdG9yIE0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2hhcGUgdmVydCBzYW1wbGluZyBmYWN0b3IgTiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaGFwZSB2ZXJ0IHNhbXBsaW5nIGZhY3RvciBNICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgNSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKiAtLS0tLSAweEIwIDogdmlzdWFsX29iamVjdF9zZXF1ZW5jZV9zdGFydF9jb2RlIC0tLS0tICovCi0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihjb2RlID09IDB4QjApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb2ZpbGVfYW5kX2xldmVsX2luZGljYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRGNpLT51aVByb2ZpbGUgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIC0tLS0tIDB4QjUgOiB2aXN1YWxfb2JqZWN0X3N0YXJ0X2NvZGUgLS0tLS0gKi8KLQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKGNvZGUgPT0gMHhCNSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogaXMgb2JqZWN0IGxheWVyIGlkZW50aWZpZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2aXN1YWwgb2JqZWN0IHZlcmlkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xfdmVyaWQgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmlzdWFsIG9iamVjdCBsYXllciBwcmlvcml0eSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlYWxpZ24gb24gYnl0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgNyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sX3ZlcmlkID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIC0tLS0tIGVuZCAtLS0tLSAqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoKGNvZGUgPj4gMikgPT0gMHgyMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogSDI2MyAuLi4tPiB3cm9uZyovCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgZ2V0QVZDUHJvZmlsZUFuZExldmVsKE00T1NBX1VJbnQ4KiBwRFNJLCBNNE9TQV9JbnQzMiBEU0lTaXplLAotICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyICpwUHJvZmlsZSwgTTRPU0FfSW50MzIgKnBMZXZlbCkgewotCi0gICAgTTRPU0FfVUludDE2IGluZGV4ID0gMjg7IC8qIHRoZSAyOXRoIGJ5dGUgaXMgU1BTIHN0YXJ0ICovCi0gICAgTTRPU0FfQm9vbCBjb25zdHJhaW50U2V0MzsKLQotICAgIGlmICgocFByb2ZpbGUgPT0gTTRPU0FfTlVMTCkgfHwgKHBMZXZlbCA9PSBNNE9TQV9OVUxMKSkgewotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmICgoRFNJU2l6ZSA8PSBpbmRleCkgfHwgKHBEU0kgPT0gTTRPU0FfTlVMTCkpIHsKLSAgICAgICAgQUxPR0UoImdldEFWQ1Byb2ZpbGVBbmRMZXZlbDogRFNJIGlzIGludmFsaWQiKTsKLSAgICAgICAgKnBQcm9maWxlID0gTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9QUk9GSUxFOwotICAgICAgICAqcExldmVsID0gTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9MRVZFTDsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBjb25zdHJhaW50U2V0MyA9IChwRFNJW2luZGV4KzJdICYgMHgxMCk7Ci0gICAgQUxPR1YoImdldEFWQ1Byb2ZpbGVBbmRMZXZlbCBwcm9maWxlX2J5dGUgJWQsIGxldmVsX2J5dGU6ICVkIGNvbnN0cmFpbjNmbGFnIiwKLSAgICAgICAgICBwRFNJW2luZGV4KzFdLCBwRFNJW2luZGV4KzNdLCBjb25zdHJhaW50U2V0Myk7Ci0KLSAgICBzd2l0Y2ggKHBEU0lbaW5kZXgrMV0pIHsKLSAgICAgICAgY2FzZSA2NjoKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA3NzoKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDg4OgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVFeHRlbmRlZDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEwMDoKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlSGlnaDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDExMDoKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlSGlnaDEwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTIyOgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoNDIyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjQ0OgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoNDQ0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAqcFByb2ZpbGUgPSBNNFZJREVPRURJVElOR19WSURFT19VTktOT1dOX1BST0ZJTEU7Ci0gICAgfQotCi0gICAgc3dpdGNoIChwRFNJW2luZGV4KzNdKSB7Ci0gICAgICAgIGNhc2UgMTA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDExOgotICAgICAgICAgICAgaWYgKGNvbnN0cmFpbnRTZXQzKQotICAgICAgICAgICAgICAgICpwTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWwxYjsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMTE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMjoKLSAgICAgICAgICAgICpwTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWwxMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEzOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDEzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDIxOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDIxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjI6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMjI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzMDoKLSAgICAgICAgICAgICpwTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWwzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzE6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMzE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzMjoKLSAgICAgICAgICAgICpwTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWwzMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQwOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0MToKLSAgICAgICAgICAgICpwTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWw0MTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQyOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDQyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNTA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsNTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDUxOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDUxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAqcExldmVsID0gTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9MRVZFTDsKLSAgICB9Ci0gICAgQUxPR1YoImdldEFWQ1Byb2ZpbGVBbmRMZXZlbCBwcm9maWxlICVsZCBsZXZlbCAlbGQiLCAqcFByb2ZpbGUsICpwTGV2ZWwpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgZ2V0SDI2M1Byb2ZpbGVBbmRMZXZlbChNNE9TQV9VSW50OCogcERTSSwgTTRPU0FfSW50MzIgRFNJU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiAqcFByb2ZpbGUsIE00T1NBX0ludDMyICpwTGV2ZWwpIHsKLQotICAgIE00T1NBX1VJbnQxNiBpbmRleCA9IDc7IC8qIHRoZSA1dGggYW5kIDZ0aCBieXRlcyBjb250YWluIHRoZSBsZXZlbCBhbmQgcHJvZmlsZSAqLwotCi0gICAgaWYgKChwUHJvZmlsZSA9PSBNNE9TQV9OVUxMKSB8fCAocExldmVsID09IE00T1NBX05VTEwpKSB7Ci0gICAgICAgIEFMT0dFKCJnZXRIMjYzUHJvZmlsZUFuZExldmVsIGludmFsaWQgcG9pbnRlciBmb3IgcFByb2ZpbGUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiAoKERTSVNpemUgPCBpbmRleCkgfHwgKHBEU0kgPT0gTTRPU0FfTlVMTCkpIHsKLSAgICAgICAgQUxPR0UoImdldEgyNjNQcm9maWxlQW5kTGV2ZWw6IERTSSBpcyBpbnZhbGlkIik7Ci0gICAgICAgICpwUHJvZmlsZSA9IE00VklERU9FRElUSU5HX1ZJREVPX1VOS05PV05fUFJPRklMRTsKLSAgICAgICAgKnBMZXZlbCA9IE00VklERU9FRElUSU5HX1ZJREVPX1VOS05PV05fTEVWRUw7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotICAgIEFMT0dWKCJnZXRIMjYzUHJvZmlsZUFuZExldmVsIHByb2ZpbGVfYnl0ZSAlZCwgbGV2ZWxfYnl0ZSIsCi0gICAgICAgICAgcERTSVs2XSwgcERTSVs1XSk7Ci0gICAgLyogZ2V0IHRoZSBIMjYzIGxldmVsICovCi0gICAgc3dpdGNoIChwRFNJWzVdKSB7Ci0gICAgICAgIGNhc2UgMTA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDEwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDIwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDMwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDQwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDU6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDQ1OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNTA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDUwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNjA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDYwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNzA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDcwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICpwTGV2ZWwgPSBNNFZJREVPRURJVElOR19WSURFT19VTktOT1dOX0xFVkVMOwotICAgIH0KLQotICAgIC8qIGdldCBIMjYzIHByb2ZpbGUgKi8KLSAgICBzd2l0Y2ggKHBEU0lbNl0pIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0gyNjNQcm9maWxlQmFzZWxpbmU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0gyNjNQcm9maWxlSDMyMENvZGluZzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAqcFByb2ZpbGUgPSBPTVhfVklERU9fSDI2M1Byb2ZpbGVCYWNrd2FyZENvbXBhdGlibGU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0gyNjNQcm9maWxlSVNXVjI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0gyNjNQcm9maWxlSVNXVjM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0gyNjNQcm9maWxlSGlnaENvbXByZXNzaW9uOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19IMjYzUHJvZmlsZUludGVybmV0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19IMjYzUHJvZmlsZUludGVybGFjZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICAqcFByb2ZpbGUgPSBPTVhfVklERU9fSDI2M1Byb2ZpbGVIaWdoTGF0ZW5jeTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAqcFByb2ZpbGUgPSBNNFZJREVPRURJVElOR19WSURFT19VTktOT1dOX1BST0ZJTEU7Ci0gICAgfQotICAgIEFMT0dWKCJnZXRIMjYzUHJvZmlsZUFuZExldmVsIHByb2ZpbGUgJWxkIGxldmVsICVsZCIsICpwUHJvZmlsZSwgKnBMZXZlbCk7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBnZXRNUEVHNFByb2ZpbGVBbmRMZXZlbChNNE9TQV9VSW50OCBwcm9maWxlQW5kTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgKnBQcm9maWxlLCBNNE9TQV9JbnQzMiAqcExldmVsKSB7Ci0KLSAgICBNNE9TQV9VSW50MzIgaSA9IDA7Ci0gICAgTTRPU0FfVUludDMyIGxlbmd0aCA9IDA7Ci0gICAgaWYgKChwUHJvZmlsZSA9PSBNNE9TQV9OVUxMKSB8fCAocExldmVsID09IE00T1NBX05VTEwpKSB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotICAgIEFMT0dWKCJnZXRNUEVHNFByb2ZpbGVBbmRMZXZlbCBwcm9maWxlQW5kTGV2ZWwgJWQiLCBwcm9maWxlQW5kTGV2ZWwpOwotICAgIGxlbmd0aCA9IHNpemVvZihtcGVnNFByb2ZpbGVMZXZlbFRhYmxlKSAvc2l6ZW9mKG1wZWc0UHJvZmlsZUxldmVsVGFibGVbMF0pOwotICAgICpwUHJvZmlsZSA9IE00VklERU9FRElUSU5HX1ZJREVPX1VOS05PV05fUFJPRklMRTsKLSAgICAqcExldmVsID0gTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9MRVZFTDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgaWYgKG1wZWc0UHJvZmlsZUxldmVsVGFibGVbaV0uY29kZSA9PSBwcm9maWxlQW5kTGV2ZWwpIHsKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IG1wZWc0UHJvZmlsZUxldmVsVGFibGVbaV0ucHJvZmlsZTsKLSAgICAgICAgICAgICpwTGV2ZWwgPSBtcGVnNFByb2ZpbGVMZXZlbFRhYmxlW2ldLmxldmVsOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQUxPR1YoImdldE1QRUc0UHJvZmlsZUFuZExldmVsIHByb2ZpbGUgJWxkIGxldmVsICVsZCIsICpwUHJvZmlsZSwgKnBMZXZlbCk7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VkRfVG9vbHMuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWRF9Ub29scy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZGI0YjQxLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWRF9Ub29scy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0KLSNpbmNsdWRlICJNNFZEX1Rvb2xzLmgiCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNFZEX1Rvb2xzLmMKLSAqIEBicmllZgotICogQG5vdGUgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBoZWxwZXIgZnVuY3Rpb25zIGZvciBCaXRzdHJlYW0gcGFyc2VyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotTTRPU0FfVUludDMyIE00VkRfVG9vbHNfR2V0Qml0c0Zyb21NZW1vcnkoTTRWU19CaXRzdHJlYW1fY3R4dCogcGFyc2luZ0N0eHQsCi0gICAgIE00T1NBX1VJbnQzMiBuYl9iaXRzKQotewotICAgIE00T1NBX1VJbnQzMiAgICBjb2RlOwotICAgIE00T1NBX1VJbnQzMiAgICBpOwotICAgIGNvZGUgPSAwOwotICAgIGZvciAoaSA9IDA7IGkgPCBuYl9iaXRzOyBpKyspCi0gICAgewotICAgICAgICBpZiAocGFyc2luZ0N0eHQtPnN0cmVhbV9pbmRleCA9PSA4KQotICAgICAgICB7Ci0gICAgICAgICAgICAvL000T1NBX21lbWNweSggKE00T1NBX01lbUFkZHI4KSYocGFyc2luZ0N0eHQtPnN0cmVhbV9ieXRlKSwgcGFyc2luZ0N0eHQtPmluLAotICAgICAgICAgICAgLy8gICAgIHNpemVvZih1bnNpZ25lZCBjaGFyKSk7Ci0gICAgICAgICAgICBwYXJzaW5nQ3R4dC0+c3RyZWFtX2J5dGUgPSAodW5zaWduZWQgY2hhcikocGFyc2luZ0N0eHQtPmluKVswXTsKLSAgICAgICAgICAgIHBhcnNpbmdDdHh0LT5pbisrOwotICAgICAgICAgICAgLy9mcmVhZCgmc3RyZWFtX2J5dGUsIHNpemVvZih1bnNpZ25lZCBjaGFyKSwxLGluKTsKLSAgICAgICAgICAgIHBhcnNpbmdDdHh0LT5zdHJlYW1faW5kZXggPSAwOwotICAgICAgICB9Ci0gICAgICAgIGNvZGUgPSAoY29kZSA8PCAxKTsKLSAgICAgICAgY29kZSB8PSAoKHBhcnNpbmdDdHh0LT5zdHJlYW1fYnl0ZSAmIDB4ODApID4+IDcpOwotCi0gICAgICAgIHBhcnNpbmdDdHh0LT5zdHJlYW1fYnl0ZSA9IChwYXJzaW5nQ3R4dC0+c3RyZWFtX2J5dGUgPDwgMSk7Ci0gICAgICAgIHBhcnNpbmdDdHh0LT5zdHJlYW1faW5kZXgrKzsKLSAgICB9Ci0KLSAgICByZXR1cm4gY29kZTsKLX0KLQotTTRPU0FfRVJSIE00VkRfVG9vbHNfV3JpdGVCaXRzVG9NZW1vcnkoTTRPU0FfVUludDMyIGJpdHNUb1dyaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX01lbUFkZHIzMiBkZXN0X2JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggb2Zmc2V0LCBNNE9TQV9VSW50OCBuYl9iaXRzKQotewotICAgIE00T1NBX1VJbnQ4IGksajsKLSAgICBNNE9TQV9VSW50MzIgdGVtcF9kZXN0ID0gMCwgbWFzayA9IDAsIHRlbXAgPSAxOwotICAgIE00T1NBX1VJbnQzMiBpbnB1dCA9IGJpdHNUb1dyaXRlOwotICAgIGlucHV0ID0gKGlucHV0IDw8ICgzMiAtIG5iX2JpdHMgLSBvZmZzZXQpKTsKLQotICAgIC8qIFB1dCBkZXN0aW5hdGlvbiBidWZmZXIgdG8gMCAqLwotICAgIGZvcihqPTA7ajwzO2orKykKLSAgICB7Ci0gICAgICAgIGZvcihpPTA7aTw4O2krKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYoKGoqOCkraSA+PSBvZmZzZXQgJiYgKGoqOCkraSA8IG5iX2JpdHMgKyBvZmZzZXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWFzayB8PSAodGVtcCA8PCAoKDcqKGorMSkpLWkraikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIG1hc2sgPSB+bWFzazsKLSAgICAqZGVzdF9iaXRzICY9IG1hc2s7Ci0KLSAgICAvKiBQYXJzZSBpbnB1dCBiaXRzLCBhbmQgZmlsbCBvdXRwdXQgYnVmZmVyICovCi0gICAgZm9yKGo9MDtqPDM7aisrKQotICAgIHsKLSAgICAgICAgZm9yKGk9MDtpPDg7aSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZigoaio4KStpID49IG9mZnNldCAmJiAoaio4KStpIDwgbmJfYml0cyArIG9mZnNldCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0ZW1wID0gKChpbnB1dCAmICgweDgwMDAwMDAwID4+IG9mZnNldCkpID4+ICgzMS1vZmZzZXQpKTsKLSAgICAgICAgICAgICAgICAvLypkZXN0X2JpdHMgfD0gKHRlbXAgPDwgKDMxIC0gaSkpOwotICAgICAgICAgICAgICAgICpkZXN0X2JpdHMgfD0gKHRlbXAgPDwgKCg3KihqKzEpKS1pK2opKTsKLSAgICAgICAgICAgICAgICBpbnB1dCA9IChpbnB1dCA8PCAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZJRklfeFZTU19SR0I1NjV0b1lVVjQyMC5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZJRklfeFZTU19SR0I1NjV0b1lVVjQyMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NmJiNDZiLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWSUZJX3hWU1NfUkdCNTY1dG9ZVVY0MjAuYworKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgIE00VklGSV9SR0I1NjV0b1lVVjQyMC5jCi0gKiBAYnJpZWYgICAgQ29udGFpbiB2aWRlbyBsaWJyYXJ5IGZ1bmN0aW9uCi0gKiBAbm90ZSAgICAgQ29sb3IgQ29udmVyc2lvbiBGaWx0ZXIKLSAqICAgICAgICAgICAtIyBDb250YWlucyB0aGUgZm9ybWF0IGNvbnZlcnNpb24gZmlsdGVycyBmcm9tIFJHQjU2NSB0byBZVVY0MjAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLS8qIFByb3RvdHlwZXMgb2YgZnVuY3Rpb25zLCBhbmQgdHlwZSBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgICAgIk00VklGSV9GaWx0ZXJzQVBJLmgiCi0vKiBNYWNybyBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgICAgIk00VklGSV9EZWZpbmVzLmgiCi0vKiBDbGlwIHRhYmxlIGRlY2xhcmF0aW9uICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0NsaXAuaCIKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00VklGSV9VSW50OCBNNFZJRklfUkdCNTY1dG9ZVVY0MjAgKHZvaWQgKnBVc2VyRGF0YSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotICogQGJyaWVmICAgdHJhbnNmb3JtIFJHQjU2NSBpbWFnZSB0byBhIFlVVjQyMCBpbWFnZS4KLSAqIEBub3RlICAgIENvbnZlcnQgUkdCNTY1IHRvIFlVVjQyMCwKLSAqICAgICAgICAgIExvb3Agb24gZWFjaCByb3cgKCAyIHJvd3MgYnkgMiByb3dzICkKLSAqICAgICAgICAgICAgICBMb29wIG9uIGVhY2ggY29sdW1uICggMiBjb2wgYnkgMiBjb2wgKQotICogICAgICAgICAgICAgICAgICBHZXQgNCBSR0Igc2FtcGxlcyBmcm9tIGlucHV0IGRhdGEgYW5kIGJ1aWxkIDQgb3V0cHV0IFkgc2FtcGxlcwotICogICAgICAgICAgICAgICAgICBhbmQgZWFjaCBzaW5nbGUgVSAmIFYgZGF0YQotICogICAgICAgICAgICAgIGVuZCBsb29wIG9uIGNvbAotICogICAgICAgICAgZW5kIGxvb3Agb24gcm93Ci0gKiBAcGFyYW0gICBwVXNlckRhdGE6IChJTikgVXNlciBTcGVjaWZpYyBEYXRhCi0gKiBAcGFyYW0gICBwUGxhbmVJbjogKElOKSBQb2ludGVyIHRvIFJHQjU2NSBQbGFuZQotICogQHBhcmFtICAgcFBsYW5lT3V0OiAoT1VUKSBQb2ludGVyIHRvICBZVVY0MjAgYnVmZmVyIFBsYW5lCi0gKiBAcmV0dXJuICBNNFZJRklfT0s6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9IRUlHSFQ6IFlVViBQbGFuZSBoZWlnaHQgaXMgT0RECi0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDogIFlVViBQbGFuZSB3aWR0aCBpcyBPREQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNFZJRklfVUludDggICAgTTRWSUZJX3hWU1NfUkdCNTY1dG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotewotICAgIE00VklGSV9VSW50MzIgICB1MzJfd2lkdGgsIHUzMl9oZWlnaHQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9zdHJpZGVfWSwgdTMyX3N0cmlkZTJfWSwgdTMyX3N0cmlkZV9VLCB1MzJfc3RyaWRlX1Y7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9zdHJpZGVfcmdiLCB1MzJfc3RyaWRlXzJyZ2I7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9jb2wsIHUzMl9yb3c7Ci0KLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3IwMCwgaTMyX3IwMSwgaTMyX3IxMCwgaTMyX3IxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX2cwMCwgaTMyX2cwMSwgaTMyX2cxMCwgaTMyX2cxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX2IwMCwgaTMyX2IwMSwgaTMyX2IxMCwgaTMyX2IxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3kwMCwgaTMyX3kwMSwgaTMyX3kxMCwgaTMyX3kxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3UwMCwgaTMyX3UwMSwgaTMyX3UxMCwgaTMyX3UxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3YwMCwgaTMyX3YwMSwgaTMyX3YxMCwgaTMyX3YxMTsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF95biwgKnB1OF95cywgKnB1OF91LCAqcHU4X3Y7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfeV9kYXRhLCAqcHU4X3VfZGF0YSwgKnB1OF92X2RhdGE7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfcmdibl9kYXRhLCAqcHU4X3JnYm47Ci0gICAgTTRWSUZJX1VJbnQxNiAgIHUxNl9waXgxLCB1MTZfcGl4MiwgdTE2X3BpeDMsIHUxNl9waXg0OwotICAgIE00VklGSV9VSW50OCBjb3VudF9udWxsPTA7Ci0KLSAgICAvKiBDaGVjayBwbGFuZXMgaGVpZ2h0IGFyZSBhcHByb3ByaWF0ZSAqLwotICAgIGlmKCAocFBsYW5lSW4tPnVfaGVpZ2h0ICE9IHBQbGFuZU91dFswXS51X2hlaWdodCkgICAgICAgICAgIHx8Ci0gICAgICAgIChwUGxhbmVPdXRbMF0udV9oZWlnaHQgIT0gKHBQbGFuZU91dFsxXS51X2hlaWdodDw8MSkpICAgfHwKLSAgICAgICAgKHBQbGFuZU91dFswXS51X2hlaWdodCAhPSAocFBsYW5lT3V0WzJdLnVfaGVpZ2h0PDwxKSkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUOwotICAgIH0KLQotICAgIC8qIENoZWNrIHBsYW5lcyB3aWR0aCBhcmUgYXBwcm9wcmlhdGUgKi8KLSAgICBpZiggKHBQbGFuZUluLT51X3dpZHRoICE9IHBQbGFuZU91dFswXS51X3dpZHRoKSAgICAgICAgIHx8Ci0gICAgICAgIChwUGxhbmVPdXRbMF0udV93aWR0aCAhPSAocFBsYW5lT3V0WzFdLnVfd2lkdGg8PDEpKSB8fAotICAgICAgICAocFBsYW5lT3V0WzBdLnVfd2lkdGggIT0gKHBQbGFuZU91dFsyXS51X3dpZHRoPDwxKSkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg7Ci0gICAgfQotCi0gICAgLyogU2V0IHRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG91dHB1dCBkYXRhIGJ1ZmZlcnMgKi8KLSAgICBwdThfeV9kYXRhID0gcFBsYW5lT3V0WzBdLnBhY19kYXRhICsgcFBsYW5lT3V0WzBdLnVfdG9wbGVmdDsKLSAgICBwdThfdV9kYXRhID0gcFBsYW5lT3V0WzFdLnBhY19kYXRhICsgcFBsYW5lT3V0WzFdLnVfdG9wbGVmdDsKLSAgICBwdThfdl9kYXRhID0gcFBsYW5lT3V0WzJdLnBhY19kYXRhICsgcFBsYW5lT3V0WzJdLnVfdG9wbGVmdDsKLQotICAgIC8qIFNldCB0aGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbnB1dCBkYXRhIGJ1ZmZlcnMgKi8KLSAgICBwdThfcmdibl9kYXRhICAgPSBwUGxhbmVJbi0+cGFjX2RhdGEgKyBwUGxhbmVJbi0+dV90b3BsZWZ0OwotCi0gICAgLyogR2V0IHRoZSBzaXplIG9mIHRoZSBvdXRwdXQgaW1hZ2UgKi8KLSAgICB1MzJfd2lkdGggPSBwUGxhbmVPdXRbMF0udV93aWR0aDsKLSAgICB1MzJfaGVpZ2h0ID0gcFBsYW5lT3V0WzBdLnVfaGVpZ2h0OwotCi0gICAgLyogU2V0IHRoZSBzaXplIG9mIHRoZSBtZW1vcnkganVtcHMgY29ycmVzcG9uZGluZyB0byByb3cganVtcCBpbiBlYWNoIG91dHB1dCBwbGFuZSAqLwotICAgIHUzMl9zdHJpZGVfWSA9IHBQbGFuZU91dFswXS51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlMl9ZID0gdTMyX3N0cmlkZV9ZIDw8IDE7Ci0gICAgdTMyX3N0cmlkZV9VID0gcFBsYW5lT3V0WzFdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfViA9IHBQbGFuZU91dFsyXS51X3N0cmlkZTsKLQotICAgIC8qIFNldCB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGp1bXBzIGNvcnJlc3BvbmRpbmcgdG8gcm93IGp1bXAgaW4gaW5wdXQgcGxhbmUgKi8KLSAgICB1MzJfc3RyaWRlX3JnYiA9IHBQbGFuZUluLT51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlXzJyZ2IgPSB1MzJfc3RyaWRlX3JnYiA8PCAxOwotCi0KLSAgICAvKiBMb29wIG9uIGVhY2ggcm93IG9mIHRoZSBvdXRwdXQgaW1hZ2UsIGlucHV0IGNvb3JkaW5hdGVzIGFyZSBlc3RpbWF0ZWQgZnJvbSBvdXRwdXQgb25lcyAqLwotICAgIC8qIFR3byBZVVYgcm93cyBhcmUgY29tcHV0ZWQgYXQgZWFjaCBwYXNzICovCi0gICAgZm9yICh1MzJfcm93ID0gdTMyX2hlaWdodCA7dTMyX3JvdyAhPSAwOyB1MzJfcm93IC09MikKLSAgICB7Ci0gICAgICAgIC8qIEN1cnJlbnQgWSBwbGFuZSByb3cgcG9pbnRlcnMgKi8KLSAgICAgICAgcHU4X3luID0gcHU4X3lfZGF0YTsKLSAgICAgICAgLyogTmV4dCBZIHBsYW5lIHJvdyBwb2ludGVycyAqLwotICAgICAgICBwdThfeXMgPSBwdThfeW4gKyB1MzJfc3RyaWRlX1k7Ci0gICAgICAgIC8qIEN1cnJlbnQgVSBwbGFuZSByb3cgcG9pbnRlciAqLwotICAgICAgICBwdThfdSA9IHB1OF91X2RhdGE7Ci0gICAgICAgIC8qIEN1cnJlbnQgViBwbGFuZSByb3cgcG9pbnRlciAqLwotICAgICAgICBwdThfdiA9IHB1OF92X2RhdGE7Ci0KLSAgICAgICAgcHU4X3JnYm4gPSBwdThfcmdibl9kYXRhOwotCi0gICAgICAgIC8qIExvb3Agb24gZWFjaCBjb2x1bW4gb2YgdGhlIG91dHB1dCBpbWFnZSAqLwotICAgICAgICBmb3IgKHUzMl9jb2wgPSB1MzJfd2lkdGg7IHUzMl9jb2wgIT0gMCA7IHUzMl9jb2wgLT0yKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBHZXQgZm91ciBSR0IgNTY1IHNhbXBsZXMgZnJvbSBpbnB1dCBkYXRhICovCi0gICAgICAgICAgICB1MTZfcGl4MSA9ICooIChNNFZJRklfVUludDE2ICopIHB1OF9yZ2JuKTsKLSAgICAgICAgICAgIHUxNl9waXgyID0gKiggKE00VklGSV9VSW50MTYgKikgKHB1OF9yZ2JuICsgQ1NUX1JHQl8xNl9TSVpFKSk7Ci0gICAgICAgICAgICB1MTZfcGl4MyA9ICooIChNNFZJRklfVUludDE2ICopIChwdThfcmdibiArIHUzMl9zdHJpZGVfcmdiKSk7Ci0gICAgICAgICAgICB1MTZfcGl4NCA9ICooIChNNFZJRklfVUludDE2ICopIChwdThfcmdibiArIHUzMl9zdHJpZGVfcmdiICsgQ1NUX1JHQl8xNl9TSVpFKSk7Ci0KLSAgICAgICAgICAgIC8qIFVucGFjayBSR0I1NjUgdG8gOGJpdCBSLCBHLCBCICovCi0gICAgICAgICAgICAvKiAoeCx5KSAqLwotICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfYjAwLGkzMl9nMDAsaTMyX3IwMCx1MTZfcGl4MSk7Ci0gICAgICAgICAgICAvKiAoeCsxLHkpICovCi0gICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9iMTAsaTMyX2cxMCxpMzJfcjEwLHUxNl9waXgyKTsKLSAgICAgICAgICAgIC8qICh4LHkrMSkgKi8KLSAgICAgICAgICAgIEdFVF9SR0I1NjUoaTMyX2IwMSxpMzJfZzAxLGkzMl9yMDEsdTE2X3BpeDMpOwotICAgICAgICAgICAgLyogKHgrMSx5KzEpICovCi0gICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9iMTEsaTMyX2cxMSxpMzJfcjExLHUxNl9waXg0KTsKLSAgICAgICAgICAgIC8qIElmIFJHQiBpcyB0cmFuc3BhcmVudCBjb2xvciAoMCwgNjMsIDApLCB3ZSB0cmFuc2Zvcm0gaXQgdG8gd2hpdGUgKDMxLDYzLDMxKSAqLwotICAgICAgICAgICAgaWYoaTMyX2IwMCA9PSAwICYmIGkzMl9nMDAgPT0gNjMgJiYgaTMyX3IwMCA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkzMl9iMDAgPSAzMTsKLSAgICAgICAgICAgICAgICBpMzJfcjAwID0gMzE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihpMzJfYjEwID09IDAgJiYgaTMyX2cxMCA9PSA2MyAmJiBpMzJfcjEwID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaTMyX2IxMCA9IDMxOwotICAgICAgICAgICAgICAgIGkzMl9yMTAgPSAzMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKGkzMl9iMDEgPT0gMCAmJiBpMzJfZzAxID09IDYzICYmIGkzMl9yMDEgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpMzJfYjAxID0gMzE7Ci0gICAgICAgICAgICAgICAgaTMyX3IwMSA9IDMxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoaTMyX2IxMSA9PSAwICYmIGkzMl9nMTEgPT0gNjMgJiYgaTMyX3IxMSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkzMl9iMTEgPSAzMTsKLSAgICAgICAgICAgICAgICBpMzJfcjExID0gMzE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBDb252ZXJ0IFJHQiB2YWx1ZSB0byBZVVYgKi8KLSAgICAgICAgICAgIGkzMl91MDAgPSBVMTYoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7Ci0gICAgICAgICAgICBpMzJfdjAwID0gVjE2KGkzMl9yMDAsIGkzMl9nMDAsIGkzMl9iMDApOwotICAgICAgICAgICAgLyogbHVtaW5hbmNlIHZhbHVlICovCi0gICAgICAgICAgICBpMzJfeTAwID0gWTE2KGkzMl9yMDAsIGkzMl9nMDAsIGkzMl9iMDApOwotCi0gICAgICAgICAgICBpMzJfdTEwID0gVTE2KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotICAgICAgICAgICAgaTMyX3YxMCA9IFYxNihpMzJfcjEwLCBpMzJfZzEwLCBpMzJfYjEwKTsKLSAgICAgICAgICAgIC8qIGx1bWluYW5jZSB2YWx1ZSAqLwotICAgICAgICAgICAgaTMyX3kxMCA9IFkxNihpMzJfcjEwLCBpMzJfZzEwLCBpMzJfYjEwKTsKLQotICAgICAgICAgICAgaTMyX3UwMSA9IFUxNihpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLSAgICAgICAgICAgIGkzMl92MDEgPSBWMTYoaTMyX3IwMSwgaTMyX2cwMSwgaTMyX2IwMSk7Ci0gICAgICAgICAgICAvKiBsdW1pbmFuY2UgdmFsdWUgKi8KLSAgICAgICAgICAgIGkzMl95MDEgPSBZMTYoaTMyX3IwMSwgaTMyX2cwMSwgaTMyX2IwMSk7Ci0KLSAgICAgICAgICAgIGkzMl91MTEgPSBVMTYoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0gICAgICAgICAgICBpMzJfdjExID0gVjE2KGkzMl9yMTEsIGkzMl9nMTEsIGkzMl9iMTEpOwotICAgICAgICAgICAgLyogbHVtaW5hbmNlIHZhbHVlICovCi0gICAgICAgICAgICBpMzJfeTExID0gWTE2KGkzMl9yMTEsIGkzMl9nMTEsIGkzMl9iMTEpOwotCi0gICAgICAgICAgICAvKiBTdG9yZSBsdW1pbmFuY2UgZGF0YSAqLwotICAgICAgICAgICAgcHU4X3luWzBdID0gKE00VklGSV9VSW50OClpMzJfeTAwOwotICAgICAgICAgICAgcHU4X3luWzFdID0gKE00VklGSV9VSW50OClpMzJfeTEwOwotICAgICAgICAgICAgcHU4X3lzWzBdID0gKE00VklGSV9VSW50OClpMzJfeTAxOwotICAgICAgICAgICAgcHU4X3lzWzFdID0gKE00VklGSV9VSW50OClpMzJfeTExOwotICAgICAgICAgICAgKnB1OF91ID0gKE00VklGSV9VSW50OCkoKGkzMl91MDAgKyBpMzJfdTAxICsgaTMyX3UxMCArIGkzMl91MTEgKyAyKSA+PiAyKTsKLSAgICAgICAgICAgICpwdThfdiA9IChNNFZJRklfVUludDgpKChpMzJfdjAwICsgaTMyX3YwMSArIGkzMl92MTAgKyBpMzJfdjExICsgMikgPj4gMik7Ci0gICAgICAgICAgICAvKiBQcmVwYXJlIGZvciBuZXh0IGNvbHVtbiAqLwotICAgICAgICAgICAgcHU4X3JnYm4gKz0gKENTVF9SR0JfMTZfU0laRTw8MSk7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgY3VycmVudCBZIHBsYW5lIGxpbmUgcG9pbnRlciovCi0gICAgICAgICAgICBwdThfeW4gKz0gMjsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBuZXh0IFkgcGxhbmUgbGluZSBwb2ludGVyKi8KLSAgICAgICAgICAgIHB1OF95cyArPSAyOwotICAgICAgICAgICAgLyogVXBkYXRlIFUgcGxhbmUgbGluZSBwb2ludGVyKi8KLSAgICAgICAgICAgIHB1OF91ICsrOwotICAgICAgICAgICAgLyogVXBkYXRlIFYgcGxhbmUgbGluZSBwb2ludGVyKi8KLSAgICAgICAgICAgIHB1OF92ICsrOwotICAgICAgICB9IC8qIEVuZCBvZiBob3Jpem9udGFsIHNjYW5uaW5nICovCi0KLSAgICAgICAgLyogUHJlcGFyZSBwb2ludGVycyBmb3IgdGhlIG5leHQgcm93ICovCi0gICAgICAgIHB1OF95X2RhdGEgKz0gdTMyX3N0cmlkZTJfWTsKLSAgICAgICAgcHU4X3VfZGF0YSArPSB1MzJfc3RyaWRlX1U7Ci0gICAgICAgIHB1OF92X2RhdGEgKz0gdTMyX3N0cmlkZV9WOwotICAgICAgICBwdThfcmdibl9kYXRhICs9IHUzMl9zdHJpZGVfMnJnYjsKLQotCi0gICAgfSAvKiBFbmQgb2YgdmVydGljYWwgc2Nhbm5pbmcgKi8KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0vKiBFbmQgb2YgZmlsZSBNNFZJRklfUkdCNTY1dG9ZVVY0MjAuYyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9BdWRpb01peGluZy5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfQXVkaW9NaXhpbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmYwYmMwNi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9BdWRpb01peGluZy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDEzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRWU1MzR1BQX0F1ZGlvTWl4aW5nLmMKLSAqIEBicmllZiAgICBWaWRlbyBTdHVkaW8gU2VydmljZSAzR1BQIGF1ZGlvIG1peGluZyBpbXBsZW1lbnRhdGlvbi4KLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotLyoqKioqKioqKioqKioqKiovCi0vKioqIEluY2x1ZGVzICoqKi8KLS8qKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotLyoqCi0gKiBPdXIgaGVhZGVycyAqLwotI2luY2x1ZGUgIk00VlNTM0dQUF9BUEkuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxUeXBlcy5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbEZ1bmN0aW9ucy5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9FcnJvckNvZGVzLmgiCi0KLS8qIFB1dCB0aGUgZGVmaW5pdGlvbiBvZiBzaWxlbmNlIGZyYW1lcyBoZXJlICovCi0jZGVmaW5lIE00VlNTM0dQUF9TSUxFTkNFX0ZSQU1FUwotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbENvbmZpZy5oIgotCi0vKioKLSAqIE9TQUwgaGVhZGVycyAqLwotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIiAvKio8IE9TQUwgbWVtb3J5IG1hbmFnZW1lbnQgKi8KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIiAgLyoqPCBPU0FMIGRlYnVnIG1hbmFnZW1lbnQgKi8KLQotCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JSZXNhbXBsZXIuaCIKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIFN0YXRpYyBmdW5jdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUgotTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbiggTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0F1ZGlvTWl4aW5nU2V0dGluZ3MgKnBTZXR0aW5ncyApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwVmlkZW8oCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9SZXBsYWNlKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weU9yaWcoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5QWRkZWQoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb252ZXJ0KAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRG9NaXhpbmcoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2UoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdUcmFuc2l0aW9uKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRGVzdHJveVZpZGVvRW5jb2RlcigKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfQm9vbCBNNFZTUzNHUFBfaXNUaHJlc2hvbGRCcmVhY2hlZCggTTRPU0FfSW50MzIgKmF2ZXJhZ2VWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIHN0b3JlQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiB0aHJlc2hvbGRWYWx1ZSApOwotLyoqCi0gKiAgICBJbnRlcm5hbCB3YXJuaW5nICovCi0jZGVmaW5lIE00VlNTM0dQUF9XQVJfRU5EX09GX0FEREVEX0FVRElPICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X1dBUiwgTTRWU1MzR1BQLCAweDAwMzApCi0KLS8qIEEgZGVmaW5lIHVzZWQgd2l0aCBTU1JDIDEuMDQgYW5kIGFib3ZlIHRvIGF2b2lkIHRha2luZwotYmxvY2tzIHNtYWxsZXIgdGhhdCB0aGUgbWluaW1hbCBibG9jayBzaXplICovCi0jZGVmaW5lIE00VlNTX1NTUkNfTUlOQkxPQ0tTSVpFICAgICAgICA2MDAKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nSW5pdChNNFZTUzNHUFBfQXVkaW9NaXhpbmdDb250ZXh0KiBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BdWRpb01peGluZ1NldHRpbmdzKiBwU2V0dGluZ3MpCi0gKiBAYnJpZWYgICAgSW5pdGlhbGl6ZXMgdGhlIFZTUyBhdWRpbyBtaXhpbmcgb3BlcmF0aW9uIChhbGxvY2F0ZXMgYW4gZXhlY3V0aW9uIGNvbnRleHQpLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgKE9VVCkgUG9pbnRlciBvbiB0aGUgVlNTIGF1ZGlvIG1peGluZyBjb250ZXh0IHRvIGFsbG9jYXRlCi0gKiBAcGFyYW0gICAgcFNldHRpbmdzICAgICAgICAoSU4pIFBvaW50ZXIgdG8gdmFsaWQgYXVkaW8gbWl4aW5nIHNldHRpbmdzCi0gKiBAcGFyYW0gICAgcEZpbGVSZWFkUHRyRmN0ICAgICAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHJlYWRlciBmdW5jdGlvbnMKLSAqIEBwYXJhbSAgIHBGaWxlV3JpdGVQdHJGY3QgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSB3cml0ZXIgZnVuY3Rpb25zCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotTTRPU0FfRVJSIE00VlNTM0dQUF9hdWRpb01peGluZ0luaXQoIE00VlNTM0dQUF9BdWRpb01peGluZ0NvbnRleHQgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0F1ZGlvTWl4aW5nU2V0dGluZ3MgKnBTZXR0aW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciAqcEZpbGVSZWFkUHRyRmN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIgKnBGaWxlV3JpdGVQdHJGY3QgKQotewotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEM7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIE00T1NBX1RSQUNFM18yKAotICAgICAgICAiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nSW5pdCBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4LCBwU2V0dGluZ3M9MHgleCIsCi0gICAgICAgIHBDb250ZXh0LCBwU2V0dGluZ3MpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nSW5pdDogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwU2V0dGluZ3MpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfYXVkaW9NaXhpbmdJbml0OiBwU2V0dGluZ3MgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwRmlsZVJlYWRQdHJGY3QpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfYXVkaW9NaXhpbmdJbml0OiBwRmlsZVJlYWRQdHJGY3QgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwRmlsZVdyaXRlUHRyRmN0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nSW5pdDogcEZpbGVXcml0ZVB0ckZjdCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBpZiggcFNldHRpbmdzLT51aUJlZ2luTG9vcCA+IHBTZXR0aW5ncy0+dWlFbmRMb29wICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0luaXQ6IEJlZ2luIGxvb3AgdGltZSBpcyBoaWdoZXIgdGhhbiBlbmQgbG9vcCB0aW1lISIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9CRUdJTkxPT1BfSElHSEVSX0VORExPT1A7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBbGxvY2F0ZSB0aGUgVlNTIGF1ZGlvIG1peGluZyBjb250ZXh0IGFuZCByZXR1cm4gaXQgdG8gdGhlIHVzZXIgKi8KLSAgICBwQyA9IChNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQKLSAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCksCi0gICAgICAgIE00VlNTM0dQUCwoTTRPU0FfQ2hhciAqKSJNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQiKTsKLSAgICAqcENvbnRleHQgPSBwQzsKLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0luaXQoKTogdW5hYmxlIHRvIGFsbG9jYXRlIFwKLSAgICAgICAgICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCxyZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8qIEluaXRpYWxpemF0aW9uIG9mIGNvbnRleHQgVmFyaWFibGVzICovCi0gICAgbWVtc2V0KCh2b2lkICopcEMgLDAsCi0gICAgICAgICAgICAgICAgIHNpemVvZihNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQpKTsKLSAgICAvKioKLSAgICAqIENvcHkgdGhpcyBzZXR0aW5nIGluIGNvbnRleHQgKi8KLSAgICBwQy0+aUFkZEN0cyA9IHBTZXR0aW5ncy0+dWlBZGRDdHM7Ci0gICAgcEMtPmJSZW1vdmVPcmlnaW5hbCA9IHBTZXR0aW5ncy0+YlJlbW92ZU9yaWdpbmFsOwotICAgIHBDLT5iX0R1Y2tpbmdOZWVkZWVkID0gcFNldHRpbmdzLT5iX0R1Y2tpbmdOZWVkZWVkOwotICAgIHBDLT5JbkR1Y2tpbmdfdGhyZXNob2xkID0gcFNldHRpbmdzLT5JbkR1Y2tpbmdfdGhyZXNob2xkOwotICAgIHBDLT5mQlRWb2xMZXZlbCA9IHBTZXR0aW5ncy0+ZkJUVm9sTGV2ZWw7Ci0gICAgcEMtPmZQVFZvbExldmVsID0gcFNldHRpbmdzLT5mUFRWb2xMZXZlbDsKLSAgICBwQy0+SW5EdWNraW5nX2xvd1ZvbHVtZSA9IHBTZXR0aW5ncy0+SW5EdWNraW5nX2xvd1ZvbHVtZTsKLSAgICBwQy0+YkRvRHVja2luZyA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5iTG9vcCA9IHBTZXR0aW5ncy0+Ykxvb3A7Ci0gICAgcEMtPmJOb0xvb3BpbmcgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+Ymp1bXBmbGFnID0gTTRPU0FfVFJVRTsKLSAgICAvKioKLSAgICAqIEluaXQgc29tZSBjb250ZXh0IHZhcmlhYmxlcyAqLwotCi0gICAgcEMtPnBJbnB1dENsaXBDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEFkZGVkQ2xpcEN0eHQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5mT3JpZ0ZhY3RvciA9IDEuMEY7Ci0gICAgcEMtPmZBZGRlZEZhY3RvciA9IDAuMEY7Ci0gICAgcEMtPmJTdXBwb3J0U2lsZW5jZSA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5iSGFzQXVkaW8gPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+YkF1ZGlvTWl4aW5nSXNOZWVkZWQgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qIEluaXQgUEMtPmV3YyBtZW1iZXJzICovCi0gICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSA9IE00U1lTX2tWaWRlb1Vua25vd247Ci0gICAgcEMtPmV3Yy5iVmlkZW9EYXRhUGFydGl0aW9uaW5nID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2kgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0F1ZGlvVW5rbm93bjsKLSAgICBwQy0+ZXdjLnVpTmJDaGFubmVscyA9IDE7Ci0gICAgcEMtPmV3Yy5wQXVkaW9PdXRwdXREc2kgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmV3Yy5wQXVkaW9FbmNEU0kucEluZm8gPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MucEVuY0NvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MucER1bW15QXVCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wTFZBdWRpb1Jlc2FtcGxlciA9IE00T1NBX05VTEw7Ci0gICAgLyoqCi0gICAgKiBTZXQgdGhlIE9TQUwgZmlsZXN5c3RlbSBmdW5jdGlvbiBzZXQgKi8KLSAgICBwQy0+cE9zYUZpbGVSZWFkUHRyID0gcEZpbGVSZWFkUHRyRmN0OwotICAgIHBDLT5wT3NhRmlsZVdyaXRQdHIgPSBwRmlsZVdyaXRlUHRyRmN0OwotCi0gICAgLyoqCi0gICAgKiBTc3JjIHN0dWZmICovCi0gICAgcEMtPmJfU1NSQ25lZWRlZCA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5wU3NyY0J1ZmZlckluID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFNzcmNCdWZmZXJPdXQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wVGVtcEJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBQb3NJblRlbXBCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+U3NyY1NjcmF0Y2ggPSBNNE9TQV9OVUxMOwotICAgIHBDLT51aUJlZ2luTG9vcCA9IHBTZXR0aW5ncy0+dWlCZWdpbkxvb3A7Ci0gICAgcEMtPnVpRW5kTG9vcCA9IHBTZXR0aW5ncy0+dWlFbmRMb29wOwotCi0gICAgLyoKLSAgICAqIFJlc2V0IHBvaW50ZXJzIGZvciBtZWRpYSBhbmQgY29kZWNzIGludGVyZmFjZXMgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfY2xlYXJJbnRlcmZhY2VUYWJsZXMoJnBDLT5TaGVsbEFQSSk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAvKiAgQ2FsbCB0aGUgbWVkaWEgYW5kIGNvZGVjcyBzdWJzY3JpcHRpb24gbW9kdWxlICovCi0gICAgZXJyID0gTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWMoJnBDLT5TaGVsbEFQSSk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAvKioKLSAgICAqIE9wZW4gaW5wdXQgY2xpcCwgYWRkZWQgY2xpcCBhbmQgb3V0cHV0IGNsaXAgYW5kIHByb2NlZWQgd2l0aCB0aGUgc2V0dGluZ3MgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKHBDLCBwU2V0dGluZ3MpOwotICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgLyoqCi0gICAgKiBVcGRhdGUgbWFpbiBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cElucHV0Q2xpcEN0eHQtPnBWaWRlb1N0cmVhbSApCi0gICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9WSURFTzsKLSAgICBlbHNlCi0gICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19GSVJTVF9TRUdNRU5UOwotCi0gICAgcEMtPmV3Yy5pT3V0cHV0RHVyYXRpb24gPSAoTTRPU0FfSW50MzIpcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICBDbGlwUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbjsKLSAgICAvKmdJbnB1dFBhcmFtcy5sdkJUQ2hhbm5lbENvdW50Ki8KLSAgICBwQy0+cExWQXVkaW9SZXNhbXBsZXIgPSBMVkF1ZGlvUmVzYW1wbGVyQ3JlYXRlKDE2LAotICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzLAotICAgICAgICAvKiBnSW5wdXRQYXJhbXMubHZPdXRTYW1wbGVSYXRlKi8oTTRPU0FfSW50MzIpcFNldHRpbmdzLT5vdXRwdXRBU0YsIDEpOwotICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cExWQXVkaW9SZXNhbXBsZXIgKQotICAgICB7Ci0gICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgIH0KLSAgICAgICAgTFZBdWRpb3NldFNhbXBsZVJhdGUocEMtPnBMVkF1ZGlvUmVzYW1wbGVyLAotICAgICAgICAvKmdJbnB1dFBhcmFtcy5sdkluU2FtcGxlUmF0ZSovCi0gICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5KTsKLQotICAgIExWQXVkaW9zZXRWb2x1bWUocEMtPnBMVkF1ZGlvUmVzYW1wbGVyLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MTYpKDB4MTAwMCApLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MTYpKDB4MTAwMCApKTsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nSW5pdCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfYXVkaW9NaXhpbmdTdGVwKE00VlNTM0dQUF9BdWRpb01peGluZ0NvbnRleHQgcENvbnRleHQpCi0gKiBAYnJpZWYgICAgUGVyZm9ybSBvbmUgc3RlcCBvZiBhdWRpbyBtaXhpbmcuCi0gKiBAbm90ZQotICogQHBhcmFtICAgICBwQ29udGV4dCAgICAgICAgICAoSU4pIFZTUyBhdWRpbyBtaXhpbmcgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHBhcmFtICAgICBwUHJvZ3Jlc3MgICAgICAgICAoT1VUKSBQcm9ncmVzcyBwZXJjZW50YWdlICgwIHRvIDEwMCkgb2YgdGhlIGZpbmFsaXphdGlvbiBvcGVyYXRpb24KLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgVlNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX1dBUl9FTkRfT0ZfQVVESU9fTUlYSU5HOiBBdWRpbyBtaXhpbmcgaXMgb3ZlciwgdXNlciBzaG91bGQgbm93IGNhbGwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwKCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9hdWRpb01peGluZ1N0ZXAoIE00VlNTM0dQUF9BdWRpb01peGluZ0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCAqcFByb2dyZXNzICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgPQotICAgICAgICAoTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICopcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nU3RlcCBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4IiwKLSAgICAgICAgcENvbnRleHQpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nU3RlcDogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgKiBTdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBzd2l0Y2goIHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICBjYXNlIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9WSURFTzoKLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBWaWRlbyhwQyk7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBDb21wdXRlIHRoZSBwcm9ncmVzcyBwZXJjZW50YWdlCi0gICAgICAgICAgICAqIE5vdGU6IGF1ZGlvIGFuZCB2aWRlbyBDVFMgYXJlIG5vdCBpbml0aWFsaXplZCBiZWZvcmUKLSAgICAgICAgICAgICogdGhlIGNhbGwgb2YgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcFZpZGVvICovCi0KLSAgICAgICAgICAgIC8qIFA0TUUwMDAwMzI3NjogRmlyc3QgMC01MCUgc2VnbWVudCBpcyBkZWRpY2F0ZWQgdG8gc3RhdGUgOgotICAgICAgICAgICAgICAgTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX1ZJREVPICovCi0gICAgICAgICAgICAqcFByb2dyZXNzID0gKE00T1NBX1VJbnQ4KSg1MCAqIChwQy0+ZXdjLldyaXRlclZpZGVvQVUuQ1RTKQotICAgICAgICAgICAgICAgIC8gcEMtPnBJbnB1dENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fZHVyYXRpb24pOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVGhlcmUgbWF5IGJlIG5vIGF1ZGlvIHRyYWNrIChSZW1vdmUgYXVkaW8gdHJhY2sgZmVhdHVyZSkuCi0gICAgICAgICAgICAqIEluIHRoYXQgY2FzZSB3ZSBkb3VibGUgdGhlIGN1cnJlbnQgcGVyY2VudGFnZSAqLwotICAgICAgICAgICAgaWYoIE00U1lTX2tBdWRpb1Vua25vd24gPT0gcEMtPmV3Yy5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1UeXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoICpwUHJvZ3Jlc3MpIDw8PSAxOyAvKio8IHgyICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCAqcFByb2dyZXNzID49IDUwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqcFByb2dyZXNzID0KLSAgICAgICAgICAgICAgICAgICAgNDk7IC8qKjwgVmlkZW8gcHJvY2Vzc2luZyBpcyBub3QgZ3JlYXRlciB0aGFuIDUwJSAqLwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBwQy0+Ykhhc0F1ZGlvICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFZpZGVvIGlzIG92ZXIsIHN0YXRlIHRyYW5zaXRpb24gdG8gYXVkaW8gYW5kIHJldHVybiBPSyAqLwotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPmlBZGRDdHMgPiAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fRklSU1RfU0VHTUVOVDsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPlN0YXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19TRUNPTkRfU0VHTUVOVDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogTm8gYXVkaW8sIHN0YXRlIHRyYW5zaXRpb24gdG8gRklOSVNIRUQgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX0ZJTklTSEVEOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nU3RlcDogTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcFZpZGVvIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19GSVJTVF9TRUdNRU5UOgotICAgICAgICBjYXNlIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19TRUNPTkRfU0VHTUVOVDoKLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fVEhJUkRfU0VHTUVOVDoKLSAgICAgICAgICAgIGlmKCBwQy0+cEFkZGVkQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzCi0gICAgICAgICAgICAgICAgIT0gLXBDLT5wQWRkZWRDbGlwQ3R4dC0+aVNpbGVuY2VGcmFtZUR1cmF0aW9uCi0gICAgICAgICAgICAgICAgJiYgKHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgLSAwLjUpCi0gICAgICAgICAgICAgICAgLyBwQy0+cEFkZGVkQ2xpcEN0eHQtPnNjYWxlX2F1ZGlvID4gcEMtPnVpRW5kTG9vcAotICAgICAgICAgICAgICAgICYmIHBDLT51aUVuZExvb3AgPiAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmKHBDLT5iTG9vcCA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+Yk5vTG9vcGluZyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfSW50MzIganVtcENUUyA9IChNNE9TQV9JbnQzMikocEMtPnVpQmVnaW5Mb29wKTsKLQotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQWRkZWRDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RKdW1wKAotICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wQWRkZWRDbGlwQ3R4dC0+Ci0gICAgICAgICAgICAgICAgICAgIHBBdWRpb1N0cmVhbSwgJmp1bXBDVFMpOwotCi0gICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ1N0ZXA6IGVycm9yIHdoZW4ganVtcGluZyBpbiBhZGRlZCBhdWRpbyBjbGlwOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogVXNlIG9mZnNldCB0byBnaXZlIGEgY29ycmVjdCBDVFMgLi4uICovCi0gICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5pQW9mZnNldCA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMikocEMtPmV3Yy5kQVRvICogcEMtPmV3Yy5zY2FsZV9hdWRpbyArIDAuNSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIE00T1NBX0ZBTFNFID09IHBDLT5iUmVtb3ZlT3JpZ2luYWwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peChwQyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvUmVwbGFjZShwQyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBDb21wdXRlIHRoZSBwcm9ncmVzcyBwZXJjZW50YWdlCi0gICAgICAgICAgICAqIE5vdGU6IGF1ZGlvIGFuZCB2aWRlbyBDVFMgYXJlIG5vdCBpbml0aWFsaXplZCBiZWZvcmUKLSAgICAgICAgICAgICogdGhlIGNhbGwgb2YgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvICovCi0gICAgICAgICAgICBpZiggMCAhPSBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogUDRNRTAwMDAzMjc2OiBTZWNvbmQgNTAtMTAwJSBzZWdtZW50IGlzIGRlZGljYXRlZCB0byBzdGF0ZXMgOgotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJTy4uLiAqLwotICAgICAgICAgICAgICAgIC8qIEZvciBBdWRpbyB0aGUgcHJvZ3Jlc3MgY29tcHV0YXRpb24gaXMgYmFzZWQgb24gZEF0byBhbmQgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgIGl0IGlzIG1vcmUgYWNjdXJhdGUgKi8KLSAgICAgICAgICAgICAgICAqcFByb2dyZXNzID0gKE00T1NBX1VJbnQ4KSg1MAotICAgICAgICAgICAgICAgICAgICArICg1MCAqIHBDLT5ld2MuZEFUbyAtIHBDLT5wSW5wdXRDbGlwQ3R4dC0+aVZvZmZzZXQpCi0gICAgICAgICAgICAgICAgICAgIC8gKHBDLT5ld2MuaU91dHB1dER1cmF0aW9uKSk7IC8qKjwgNTAgZm9yIDEwMC8yICoqLwotCi0gICAgICAgICAgICAgICAgaWYoICpwUHJvZ3Jlc3MgPj0gMTAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICpwUHJvZ3Jlc3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgOTk7IC8qKjwgSXQncyBub3QgcmVhbGx5IGZpbmlzaGVkLCBJIHByZWZlciB0byByZXR1cm4gbGVzcyB0aGFuIDEwMCUgKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBQcm9ncmVzcyA9IDk5OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQXVkaW8gaXMgb3Zlciwgc3RhdGUgdHJhbnNpdGlvbiB0byBGSU5JU0hFRCAqLwotICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ1N0ZXA6IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpbyByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfRklOSVNIRUQ6Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBQcm9ncmVzcyBwZXJjZW50YWdlOiBmaW5hbGl6ZSBmaW5pc2hlZCAtPiAxMDAlICovCi0gICAgICAgICAgICAqcFByb2dyZXNzID0gMTAwOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQXVkaW8gbWl4aW5nIGlzIGZpbmlzaGVkLCByZXR1cm4gY29ycmVjdCB3YXJuaW5nICovCi0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9FTkRfT0ZfQVVESU9fTUlYSU5HOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nU3RlcDogU3RhdGUgZXJyb3IgKDB4JXgpISBSZXR1cm5pbmcgTTRFUlJfU1RBVEUiLAotICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwKE00VlNTM0dQUF9BdWRpb01peGluZ0NvbnRleHQgcENvbnRleHQpCi0gKiBAYnJpZWYgICAgRnJlZSBhbGwgcmVzb3VyY2VzIHVzZWQgYnkgdGhlIFZTUyBhdWRpbyBtaXhpbmcgb3BlcmF0aW9uLgotICogQG5vdGUgICAgVGhlIGNvbnRleHQgaXMgbm8gbW9yZSB2YWxpZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgVlNTIGF1ZGlvIG1peGluZyBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcCggTTRWU1MzR1BQX0F1ZGlvTWl4aW5nQ29udGV4dCBwQ29udGV4dCApCi17Ci0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyA9Ci0gICAgICAgIChNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX1VJbnQzMiBsYXN0Q1RTOwotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXAgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCIsCi0gICAgICAgIHBDb250ZXh0KTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXA6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcENvbnRleHQgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcCgpOiBNNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwOiBwQ29udGV4dCBpc1wKLSAgICAgICAgICAgICBNNE9TQV9OVUxMLCByZXR1cm5pbmcgTTRFUlJfUEFSQU1FVEVSIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDbG9zZSBJbnB1dCAzR1BQIGZpbGUgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cElucHV0Q2xpcEN0eHQgKQotICAgIHsKLSAgICAgICAgTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKHBDLT5wSW5wdXRDbGlwQ3R4dCk7Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDbG9zZSBBZGRlZCAzR1BQIGZpbGUgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cEFkZGVkQ2xpcEN0eHQgKQotICAgIHsKLSAgICAgICAgTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKHBDLT5wQWRkZWRDbGlwQ3R4dCk7Ci0gICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDbG9zZSB0aGUgM0dQIHdyaXRlci4gSW4gbm9ybWFsIHVzZSBjYXNlIGl0IGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkLAotICAgICAgYnV0IG5vdCBpbiBhYm9ydCB1c2UgY2FzZSAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQgKQotICAgIHsKLSAgICAgICAgLyogVXBkYXRlIGxhc3QgVmlkZW8gQ1RTICovCi0gICAgICAgIGxhc3RDVFMgPSBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbjsKLQotICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgKE00T1NBX1VJbnQzMilNNFdSSVRFUl9rTWF4RmlsZUR1cmF0aW9uLCAmbGFzdENUUyk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXA6IFNldE9wdGlvbihNNFdSSVRFUl9rTWF4RmlsZUR1cmF0aW9uKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckdsb2JhbEZjdHMtPnBGY3RDbG9zZVdyaXRlKAotICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXA6IHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2VXcml0ZSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4gdGhlIGVycm9yIGJlY2F1c2Ugd2UgaGF2ZSBvdGhlciB0aGluZ3MgdG8gZnJlZSEgKi8KLSAgICAgICAgfQotICAgICAgICBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIEF1ZGlvIGVuY29kZXIgY29udGV4dCAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCApCi0gICAgewotICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbG9zZSgKLSAgICAgICAgICAgIHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXA6IHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2UgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4sIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xlYW5VcCgKLSAgICAgICAgICAgIHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXA6IHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xlYW5VcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKio8IGRvbid0IHJldHVybiwgd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBmcmVlICovCi0gICAgICAgIH0KLQotICAgICAgICBwQy0+ZXdjLnBBdWRpb0VuY0N0eHQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgc3NyYyBzdHVmZiAqLwotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPlNzcmNTY3JhdGNoICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPlNzcmNTY3JhdGNoKTsKLSAgICAgICAgcEMtPlNzcmNTY3JhdGNoID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cFNzcmNCdWZmZXJJbiApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wU3NyY0J1ZmZlckluKTsKLSAgICAgICAgcEMtPnBTc3JjQnVmZmVySW4gPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wU3NyY0J1ZmZlck91dAotICAgICAgICAmJiAoTTRPU0FfVFJVRSA9PSBwQy0+Yl9TU1JDbmVlZGVkIHx8IHBDLT5DaGFubmVsQ29udmVyc2lvbiA+IDApICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnBTc3JjQnVmZmVyT3V0KTsKLSAgICAgICAgcEMtPnBTc3JjQnVmZmVyT3V0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cFRlbXBCdWZmZXIgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+cFRlbXBCdWZmZXIpOwotICAgICAgICBwQy0+cFRlbXBCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmIChwQy0+cExWQXVkaW9SZXNhbXBsZXIgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIExWRGVzdHJveShwQy0+cExWQXVkaW9SZXNhbXBsZXIpOwotICAgICAgICBwQy0+cExWQXVkaW9SZXNhbXBsZXIgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgc2hlbGxzIGludGVyZmFjZXMgKi8KLSAgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbFdyaXRlcnMoJnBDLT5TaGVsbEFQSSk7Ci0gICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxFbmNvZGVycygmcEMtPlNoZWxsQVBJKTsKLSAgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbFJlYWRlcnMoJnBDLT5TaGVsbEFQSSk7Ci0gICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxEZWNvZGVycygmcEMtPlNoZWxsQVBJKTsKLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgY29udGV4dCAqLwotICAgIGZyZWUocENvbnRleHQpOwotICAgIHBDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKiogICAgICAgICAgICAgICAgICBTVEFUSUMgRlVOQ1RJT05TICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpCi0gKiBAYnJpZWYgICAgSW5pdGlhbGl6ZXMgdGhlIFZTUyBhdWRpbyBtaXhpbmcgb3BlcmF0aW9uIChhbGxvY2F0ZXMgYW4gZXhlY3V0aW9uIGNvbnRleHQpLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgKE9VVCkgUG9pbnRlciBvbiB0aGUgVlNTIGF1ZGlvIG1peGluZyBjb250ZXh0IHRvIGFsbG9jYXRlCi0gKiBAcGFyYW0gICAgcFNldHRpbmdzICAgICAgICAoSU4pIFBvaW50ZXIgdG8gdmFsaWQgYXVkaW8gbWl4aW5nIHNldHRpbmdzCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIKLU00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BdWRpb01peGluZ1NldHRpbmdzICpwU2V0dGluZ3MgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfVUludDMyIG91dHB1dEFTRiA9IDA7Ci0gICAgTTRFTkNPREVSX0hlYWRlciAqZW5jSGVhZGVyOwotCi0gICAgTTRPU0FfVFJBQ0UzXzIoCi0gICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgsIHBTZXR0aW5ncz0weCV4IiwKLSAgICAgICAgcEMsIHBTZXR0aW5ncyk7Ci0KLSAgICAvKioKLSAgICAqIFRoZSBBZGQgVm9sdW1lIG11c3QgYmUgKHN0cmljdGx5KSBzdXBlcmlvciB0aGFuIHplcm8gKi8KLSAgICBpZiggcFNldHRpbmdzLT51aUFkZFZvbHVtZSA9PSAwICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogQWRkVm9sdW1lIGlzIHplcm8sXAotICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfQUREVk9MVU1FX0VRVUFMU19aRVJPIik7Ci0gICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0FERFZPTFVNRV9FUVVBTFNfWkVSTzsKLSAgICB9Ci0gICAgLyoKLSAgICBlbHNlIGlmKHBTZXR0aW5ncy0+dWlBZGRWb2x1bWUgPj0gMTAwKSAvLyBJZiB2b2x1bWUgaXMgc2V0IHRvIDEwMCwgbm8gbW9yZSBvcmlnaW5hbCBhdWRpbyAuLi4KLSAgICB7Ci0gICAgcEMtPmJSZW1vdmVPcmlnaW5hbCA9IE00T1NBX1RSVUU7Ci0gICAgfQotICAgICovCi0gICAgLyoqCi0gICAgKiBCdWlsZCB0aGUgaW5wdXQgY2xpcCBzZXR0aW5ncyAqLwotICAgIHBDLT5JbnB1dENsaXBTZXR0aW5ncy5wRmlsZSA9Ci0gICAgICAgIHBTZXR0aW5ncy0+cE9yaWdpbmFsQ2xpcEZpbGU7IC8qKjwgSW5wdXQgM0dQUCBmaWxlIGRlc2NyaXB0b3IgKi8KLSAgICBwQy0+SW5wdXRDbGlwU2V0dGluZ3MuRmlsZVR5cGUgPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUDsKLSAgICBwQy0+SW5wdXRDbGlwU2V0dGluZ3MudWlCZWdpbkN1dFRpbWUgPQotICAgICAgICAwOyAvKio8IE5vIG5vdGlvbiBvZiBjdXQgZm9yIHRoZSBhdWRpbyBtaXhpbmcgZmVhdHVyZSAqLwotICAgIHBDLT5JbnB1dENsaXBTZXR0aW5ncy51aUVuZEN1dFRpbWUgPQotICAgICAgICAwOyAvKio8IE5vIG5vdGlvbiBvZiBjdXQgZm9yIHRoZSBhdWRpbyBtaXhpbmcgZmVhdHVyZSAqLwotCi0gICAgLyoqCi0gICAgKiBPcGVuIHRoZSBvcmlnaW5hbCBBdWRpby9WaWRlbyAzR1BQIGNsaXAgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcEluaXQoJnBDLT5wSW5wdXRDbGlwQ3R4dCwgcEMtPnBPc2FGaWxlUmVhZFB0cik7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOiBNNFZTUzNHUFBfaW50Q2xpcEluaXQob3JpZykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBPcGVuKHBDLT5wSW5wdXRDbGlwQ3R4dCwgJnBDLT5JbnB1dENsaXBTZXR0aW5ncywKLSAgICAgICAgTTRPU0FfRkFMU0UsIE00T1NBX0ZBTFNFLCBNNE9TQV9UUlVFKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCk6IE00VlNTM0dQUF9pbnRDbGlwT3BlbihvcmlnKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cElucHV0Q2xpcEN0eHQtPnBBdWRpb1N0cmVhbSApCi0gICAgICAgIHsKLSAgICAgICAgcEMtPmJSZW1vdmVPcmlnaW5hbCA9IE00T1NBX1RSVUU7Ci0gICAgICAgIH0KLSAgICAvKioKLSAgICAqIElmIHRoZXJlIGlzIG5vIHZpZGVvLCBpdCdzIGFuIGVycm9yICovCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBJbnB1dENsaXBDdHh0LT5wVmlkZW9TdHJlYW0gKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOiBubyB2aWRlbyBzdHJlYW0gaW4gY2xpcCxcCi0gICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9OT19TVVBQT1JURURfU1RSRUFNX0lOX0ZJTEUiKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfTk9fU1VQUE9SVEVEX1NUUkVBTV9JTl9GSUxFOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ29tcHV0ZSBjbGlwIHByb3BlcnRpZXMgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50QnVpbGRBbmFseXNpcyhwQy0+cElucHV0Q2xpcEN0eHQsCi0gICAgICAgICZwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMob3JpZykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBCdWlsZCB0aGUgYWRkZWQgY2xpcCBzZXR0aW5ncyAqLwotICAgIHBDLT5BZGRlZENsaXBTZXR0aW5ncy5wRmlsZSA9Ci0gICAgICAgIHBTZXR0aW5ncy0+cEFkZGVkQXVkaW9UcmFja0ZpbGU7IC8qKjwgQWRkZWQgZmlsZSBkZXNjcmlwdG9yICovCi0gICAgcEMtPkFkZGVkQ2xpcFNldHRpbmdzLkZpbGVUeXBlID0gcFNldHRpbmdzLT5BZGRlZEF1ZGlvRmlsZVR5cGU7Ci0gICAgcEMtPkFkZGVkQ2xpcFNldHRpbmdzLnVpQmVnaW5DdXRUaW1lID0KLSAgICAgICAgMDsgLyoqPCBObyBub3Rpb24gb2YgY3V0IGZvciB0aGUgYXVkaW8gbWl4aW5nIGZlYXR1cmUgKi8KLSAgICBwQy0+QWRkZWRDbGlwU2V0dGluZ3MudWlFbmRDdXRUaW1lICAgPSAwOy8qKjwgTm8gbm90aW9uIG9mIGN1dCBmb3IgdGhlIGF1ZGlvIG1peGluZyBmZWF0dXJlICovCi0gICAgcEMtPkFkZGVkQ2xpcFNldHRpbmdzLkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscz0KLSAgICAgICAgcFNldHRpbmdzLT51aU51bUNoYW5uZWxzOwotICAgIHBDLT5BZGRlZENsaXBTZXR0aW5ncy5DbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5PSAgICBwU2V0dGluZ3MtPnVpU2FtcGxpbmdGcmVxdWVuY3k7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+QWRkZWRDbGlwU2V0dGluZ3MucEZpbGUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogT3BlbiB0aGUgYWRkZWQgQXVkaW8gY2xpcCAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcEluaXQoJnBDLT5wQWRkZWRDbGlwQ3R4dCwgcEMtPnBPc2FGaWxlUmVhZFB0cik7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogTTRWU1MzR1BQX2ludENsaXBJbml0KGFkZGVkKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBPcGVuKHBDLT5wQWRkZWRDbGlwQ3R4dCwgJnBDLT5BZGRlZENsaXBTZXR0aW5ncywKLSAgICAgICAgICAgIE00T1NBX0ZBTFNFLCBNNE9TQV9GQUxTRSwgTTRPU0FfVFJVRSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogTTRWU1MzR1BQX2ludENsaXBPcGVuKGFkZGVkKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogSWYgdGhlcmUgaXMgbm8gYXVkaW8sIGl0J3MgYW4gZXJyb3IgKi8KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBBZGRlZENsaXBDdHh0LT5wQXVkaW9TdHJlYW0gKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOiBubyBhdWRpbyBub3IgdmlkZW8gc3RyZWFtIGluIGNsaXAsXAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX05PX1NVUFBPUlRFRF9TVFJFQU1fSU5fRklMRSIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfTk9fU1VQUE9SVEVEX1NUUkVBTV9JTl9GSUxFOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ29tcHV0ZSBjbGlwIHByb3BlcnRpZXMgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMocEMtPnBBZGRlZENsaXBDdHh0LAotICAgICAgICAgICAgJnBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcyk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMoYWRkZWQpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBzd2l0Y2goIHBTZXR0aW5ncy0+b3V0cHV0QVNGICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rODAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgb3V0cHV0QVNGID0gODAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTYwMDBfQVNGOgotICAgICAgICAgICAgICAgIG91dHB1dEFTRiA9IDE2MDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syMjA1MF9BU0Y6Ci0gICAgICAgICAgICAgICAgb3V0cHV0QVNGID0gMjIwNTA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazI0MDAwX0FTRjoKLSAgICAgICAgICAgICAgICBvdXRwdXRBU0YgPSAyNDAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMzIwMDBfQVNGOgotICAgICAgICAgICAgICAgIG91dHB1dEFTRiA9IDMyMDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s0NDEwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgb3V0cHV0QVNGID0gNDQxMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazQ4MDAwX0FTRjoKLSAgICAgICAgICAgICAgICBvdXRwdXRBU0YgPSA0ODAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQmFkIHBhcmFtZXRlciBpbiBvdXRwdXQgQVNGICIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggcEMtPmJSZW1vdmVPcmlnaW5hbCA9PSBNNE9TQV9UUlVFCi0gICAgICAgICAgICAmJiAocEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa01QMyB8fCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICBDbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa1BDTQotICAgICAgICAgICAgfHwgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICAhPSBwU2V0dGluZ3MtPm91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICB8fCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ICE9IG91dHB1dEFTRgotICAgICAgICAgICAgfHwgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzCi0gICAgICAgICAgICAhPSBwU2V0dGluZ3MtPm91dHB1dE5CQ2hhbm5lbHMpICkKLSAgICAgICAgewotCi0gICAgICAgICAgICBpZiggcFNldHRpbmdzLT5vdXRwdXRBdWRpb0Zvcm1hdCA9PSBNNFZJREVPRURJVElOR19rQU1SX05CICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPm91dHB1dEFTRiA9IE00VklERU9FRElUSU5HX2s4MDAwX0FTRjsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPm91dHB1dE5CQ2hhbm5lbHMgPSAxOwotICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplID0gMzIwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggcFNldHRpbmdzLT5vdXRwdXRBdWRpb0Zvcm1hdCA9PSBNNFZJREVPRURJVElOR19rQUFDICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgIDIwNDggKiBwU2V0dGluZ3MtPm91dHB1dE5CQ2hhbm5lbHM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICBvdXRwdXRBU0Y7Ci0KLSAgICAgICAgICAgIGlmKCBvdXRwdXRBU0YgIT0gcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFdlIG5lZWQgdG8gY2FsbCBTU1JDIGluIG9yZGVyIHRvIGFsaWduIEFTRiBhbmQvb3IgbmIgb2YgY2hhbm5lbHMgKi8KLSAgICAgICAgICAgICAgICAvKiBNb3Jlb3ZlciwgYXVkaW8gZW5jb2RlciBtYXkgYmUgbmVlZGVkIGluIGNhc2Ugb2YgYXVkaW8gcmVwbGFjaW5nLi4uICovCi0gICAgICAgICAgICAgICAgcEMtPmJfU1NSQ25lZWRlZCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPm91dHB1dE5CQ2hhbm5lbHMKLSAgICAgICAgICAgICAgICA8IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFN0ZXJlbyB0byBNb25vICovCi0gICAgICAgICAgICAgICAgcEMtPkNoYW5uZWxDb252ZXJzaW9uID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIHBTZXR0aW5ncy0+b3V0cHV0TkJDaGFubmVscwotICAgICAgICAgICAgICAgID4gcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogTW9ubyB0byBTdGVyZW8gKi8KLSAgICAgICAgICAgICAgICBwQy0+Q2hhbm5lbENvbnZlcnNpb24gPSAyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzID0KLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPm91dHB1dE5CQ2hhbm5lbHM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayBjb21wYXRpYmlsaXR5IGNoYXJ0ICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbXBhdGliaWxpdHkocEMsCi0gICAgICAgICAgICAmcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLAotICAgICAgICAgICAgJnBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcyk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTpcCi0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29tcGF0aWJpbGl0eSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgbG9vcCBwYXJhbWV0ZXJzICovCi0gICAgICAgIGlmKCBwQy0+dWlCZWdpbkxvb3AgPiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aUNsaXBBdWRpb0R1cmF0aW9uICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTpcCi0gICAgICAgICAgICAgICAgYmVnaW4gbG9vcCB0aW1lIGlzIGhpZ2hlciB0aGFuIGFkZGVkIGNsaXAgYXVkaW8gZHVyYXRpb24iKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0JFR0lOTE9PUF9ISUdIRVJfRU5ETE9PUDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIE9rLCBsZXQncyBnbyB3aXRoIHRoaXMgYXVkaW8gdHJhY2sgKi8KLSAgICAgICAgcEMtPmJIYXNBdWRpbyA9IE00T1NBX1RSVUU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIE5vIGFkZGVkIGZpbGUsIGZvcmNlIHJlbW92ZSBvcmlnaW5hbCAqLwotICAgICAgICBwQy0+QWRkZWRDbGlwU2V0dGluZ3MuRmlsZVR5cGUgPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfVW5zdXBwb3J0ZWQ7Ci0gICAgICAgIHBDLT5iUmVtb3ZlT3JpZ2luYWwgPSBNNE9TQV9UUlVFOwotICAgICAgICBwQy0+Ykhhc0F1ZGlvID0gTTRPU0FfRkFMU0U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb3B5IHRoZSB2aWRlbyBwcm9wZXJ0aWVzIG9mIHRoZSBpbnB1dCBjbGlwIHRvIHRoZSBvdXRwdXQgcHJvcGVydGllcyAqLwotICAgIHBDLT5ld2MudWlWaWRlb0JpdHJhdGUgPQotICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGU7Ci0gICAgcEMtPmV3Yy51aVZpZGVvV2lkdGggPQotICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb1dpZHRoOwotICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvSGVpZ2h0OwotICAgIHBDLT5ld2MudWlWaWRlb1RpbWVTY2FsZSA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvVGltZVNjYWxlOwotICAgIHBDLT5ld2MuYlZpZGVvRGF0YVBhcnRpdGlvbmluZyA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5iTVBFRzRkYXRhUGFydGl0aW9uOwotICAgIHBDLT5ld2Mub3V0cHV0VmlkZW9Qcm9maWxlID0KLSAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9Qcm9maWxlOwotICAgIHBDLT5ld2Mub3V0cHV0VmlkZW9MZXZlbCA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvTGV2ZWw7Ci0gICAgc3dpdGNoKCBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0gyNjM6Ci0gICAgICAgICAgICBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSA9IE00U1lTX2tIMjYzOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTVBFRzQ6Ci0gICAgICAgICAgICBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSA9IE00U1lTX2tNUEVHXzQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tIMjY0OgotICAgICAgICAgICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgPSBNNFNZU19rSDI2NDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSA9IE00U1lTX2tWaWRlb1Vua25vd247Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKiBBZGQgYSBsaW5rIHRvIHZpZGVvIGRzaSAqLwotICAgIGlmKCBNNFNZU19rSDI2NCA9PSBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSApCi0gICAgewotCi0gICAgICAgIC8qIEZvciBILjI2NCBlbmNvZGVyIGNhc2UKLSAgICAgICAgKiBGZXRjaCB0aGUgRFNJIGZyb20gdGhlIHNoZWxsIHZpZGVvIGVuY29kZXIsIGFuZCBmZWVkIGl0IHRvIHRoZSB3cml0ZXIgKi8KLQotICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbjogZ2V0IERTSSBmb3IgSDI2NCBzdHJlYW0iKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+ZXdjLnBFbmNDb250ZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW46IHBDLT5ld2MucEVuY0NvbnRleHQgaXMgTlVMTCIpOwotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyKHBDKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW46XAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDcmVhdGVWaWRlb0VuY29kZXIgcmV0dXJuZWQgZXJyb3IgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+ZXdjLnBFbmNDb250ZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0R2V0T3B0aW9uKAotICAgICAgICAgICAgICAgIHBDLT5ld2MucEVuY0NvbnRleHQsIE00RU5DT0RFUl9rT3B0aW9uSURfRW5jb2RlckhlYWRlciwKLSAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJmVuY0hlYWRlcik7Ci0KLSAgICAgICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSB8fCAoTTRPU0FfTlVMTCA9PSBlbmNIZWFkZXItPnBCdWYpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW46IGZhaWxlZCB0byBnZXQgdGhlIGVuY29kZXIgaGVhZGVyIChlcnIgMHgleCkiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbjogZW5jSGVhZGVyLT5wQnVmPTB4JXgsIHNpemU9MHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVuY0hlYWRlci0+cEJ1ZiwgZW5jSGVhZGVyLT5TaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW46IHNlbmQgRFNJIGZvciBIMjY0IHN0cmVhbSB0byAzR1Agd3JpdGVyIik7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEFsbG9jYXRlIGFuZCBjb3B5IHRoZSBuZXcgRFNJICovCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2kgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGVuY0hlYWRlci0+U2l6ZSwgTTRWU1MzR1BQLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJwQy0+ZXdjLnBWaWRlb091dHB1dERzaSAoSDI2NCkiKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgcFZpZGVvT3V0cHV0RHNpIChIMjY0KSwgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvT3V0cHV0RHNpU2l6ZSA9IChNNE9TQV9VSW50MTYpZW5jSGVhZGVyLT5TaXplOwotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5ld2MucFZpZGVvT3V0cHV0RHNpLCAodm9pZCAqKWVuY0hlYWRlci0+cEJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgZW5jSGVhZGVyLT5TaXplKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRGVzdHJveVZpZGVvRW5jb2RlcihwQyk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuOlwKLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRGVzdHJveVZpZGVvRW5jb2RlciByZXR1cm5lZCBlcnJvciAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuOiBwQy0+ZXdjLnBFbmNDb250ZXh0IGlzIE5VTEwsIGNhbm5vdCBnZXQgdGhlIERTSSIpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW46IGlucHV0IGNsaXAgdmlkZW8gc3RyZWFtIHR5cGUgPSAweCV4IiwKLSAgICAgICAgICAgIHBDLT5ld2MuVmlkZW9TdHJlYW1UeXBlKTsKLSAgICAgICAgcEMtPmV3Yy51aVZpZGVvT3V0cHV0RHNpU2l6ZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDE2KXBDLT5wSW5wdXRDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemU7Ci0gICAgICAgIHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpID0gKE00T1NBX01lbUFkZHI4KXBDLT5wSW5wdXRDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb3B5IHRoZSBhdWRpbyBwcm9wZXJ0aWVzIG9mIHRoZSBhZGRlZCBjbGlwIHRvIHRoZSBvdXRwdXQgcHJvcGVydGllcyAqLwotICAgIGlmKCBwQy0+Ykhhc0F1ZGlvICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+YlJlbW92ZU9yaWdpbmFsID09IE00T1NBX1RSVUUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpTmJDaGFubmVscyA9Ci0gICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVsczsKLSAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZTsKLSAgICAgICAgICAgIHBDLT5ld2MudWlTYW1wbGluZ0ZyZXF1ZW5jeSA9IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5OwotICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VQY21TaXplID0KLSAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlEZWNvZGVkUGNtU2l6ZTsKLSAgICAgICAgICAgIHBDLT5ld2Muc2NhbGVfYXVkaW8gPSBwQy0+ZXdjLnVpU2FtcGxpbmdGcmVxdWVuY3kgLyAxMDAwLjA7Ci0KLSAgICAgICAgICAgIC8qIGlmIG91dHB1dCBzZXR0aW5ncyBhcmUgZGlmZmVyZW50cyBmcm9tIGFkZGVkIGNsaXAgc2V0dGluZ3MsCi0gICAgICAgICAgICB3ZSBuZWVkIHRvIHJlZW5jb2RlIEJHTSAqLwotICAgICAgICAgICAgaWYoIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAhPSBwU2V0dGluZ3MtPm91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICAgICAgfHwgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kgIT0gb3V0cHV0QVNGCi0gICAgICAgICAgICAgICAgfHwgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscwotICAgICAgICAgICAgICAgICE9IHBTZXR0aW5ncy0+b3V0cHV0TkJDaGFubmVscwotICAgICAgICAgICAgICAgIHx8IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa01QMyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogU2V0IHJlYWRlciBEU0kgdG8gTlVMTCAodW5rbm93biksIHdlIHdpbGwgdXNlIGVuY29kZXIgRFNJIGxhdGVyICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbyAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgIGZyZWUocEMtPnBBZGRlZENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPlwKLSAgICAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpTmJDaGFubmVscyA9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHM7Ci0gICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNhbXBsaW5nRnJlcXVlbmN5ID0gcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5OwotICAgICAgICAgICAgICAgIHBDLT5ld2Muc2NhbGVfYXVkaW8gPSBwQy0+ZXdjLnVpU2FtcGxpbmdGcmVxdWVuY3kgLyAxMDAwLjA7Ci0KLSAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT5vdXRwdXRBdWRpb0Zvcm1hdCA9PSBNNFZJREVPRURJVElOR19rQU1SX05CICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0FNUjsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4OwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfRFVSQVRJT047Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUgPSAxMjIwMDsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNhbXBsaW5nRnJlcXVlbmN5ID0gODAwMDsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VQY21TaXplID0gMzIwOwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnNjYWxlX2F1ZGlvID0gcEMtPmV3Yy51aVNhbXBsaW5nRnJlcXVlbmN5IC8gMTAwMC4wOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCBwU2V0dGluZ3MtPm91dHB1dEF1ZGlvRm9ybWF0ID09IE00VklERU9FRElUSU5HX2tBQUMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rQUFDOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPm91dHB1dEF1ZGlvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIHBDLT5ld2MudWlTYW1wbGluZ0ZyZXF1ZW5jeSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjAwMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rMjRfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIyMDUwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQwMDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazMyX0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjAwMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rNDhfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ0MTAwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDgwMDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazY0X0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rNjRfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+ZXdjLnVpTmJDaGFubmVscyA9PSAyICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgYml0cmF0ZSBoYXZlIHRvIGJlIGRvdWJsZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpQXVkaW9CaXRyYXRlICs9IHBDLT5ld2MudWlBdWRpb0JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpQXVkaW9CaXRyYXRlID0gcFNldHRpbmdzLT5vdXRwdXRBdWRpb0JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPmV3Yy51aU5iQ2hhbm5lbHMgPT0gMSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKU00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05POwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05PX1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU9fU0laRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAxMDI0OyAvKiBBQUMgaXMgYWx3YXlzIDEwMjQvRnJlcSBzYW1wbGUgZHVyYXRpb24gKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoKCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBTVJfTkI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSA9IE00U1lTX2tBTVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4OwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfU0laRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X0RVUkFUSU9OOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDOgotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUNwbHVzOgotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tlQUFDcGx1czoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0FBQzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5ld2MudWlOYkNoYW5uZWxzID09IDEgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OTzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05PX1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKU00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU87Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPX1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAyNDsgLyogQUFDIGlzIGFsd2F5cyAxMDI0L0ZyZXEgc2FtcGxlIGR1cmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tFVlJDOgotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rRVZSQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPSAxNjA7IC8qIEVWUkMgZnJhbWVzIGFyZSAyMCBtcyBhdCA4MDAwIEh6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYWtlcyBpdCBlYXNpZXIgdG8gZmFjdG9yaXplIGFtciBhbmQgZXZyYyBjb2RlKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUENNOgotICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHJlYWRlciBEU0kgdG8gTlVMTCAodW5rbm93biksIHdlIHdpbGwgdXNlIGVuY29kZXIgRFNJIGxhdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ID09IDgwMDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0FNUjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0gKE00T1NBX1VJbnQ4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0ODsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfU0laRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfRFVSQVRJT047Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aUF1ZGlvQml0cmF0ZSA9IE00VklERU9FRElUSU5HX2sxMl8yX0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeSA9PSAxNjAwMCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5ld2MudWlOYkNoYW5uZWxzID09IDEgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rQUFDOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0gKE00T1NBX1VJbnQ4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKU00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05POwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OT19TSVpFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDI0OyAvKiBBQUMgaXMgYWx3YXlzIDEwMjQvRnJlcSBzYW1wbGUgZHVyYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rMzJfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rQUFDOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0gKE00T1NBX1VJbnQ4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKU00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU87Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU9fU0laRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAyNDsgLyogQUFDIGlzIGFsd2F5cyAxMDI0L0ZyZXEgc2FtcGxlIGR1cmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazY0X0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0F1ZGlvVW5rbm93bjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSA9IE00U1lTX2tBdWRpb1Vua25vd247Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIEFkZCBhIGxpbmsgdG8gYXVkaW8gZHNpICovCi0gICAgICAgICAgICBwQy0+ZXdjLnVpQXVkaW9PdXRwdXREc2lTaXplID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDE2KXBDLT5wQWRkZWRDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplOwotICAgICAgICAgICAgcEMtPmV3Yy5wQXVkaW9PdXRwdXREc2kgPSAoTTRPU0FfTWVtQWRkcjgpcEMtPnBBZGRlZENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPgotICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm87Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpTmJDaGFubmVscyA9Ci0gICAgICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVsczsKLSAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZTsKLSAgICAgICAgICAgIHBDLT5ld2MudWlTYW1wbGluZ0ZyZXF1ZW5jeSA9IHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5OwotICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VQY21TaXplID0KLSAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlEZWNvZGVkUGNtU2l6ZTsKLSAgICAgICAgICAgIHBDLT5ld2Muc2NhbGVfYXVkaW8gPSBwQy0+ZXdjLnVpU2FtcGxpbmdGcmVxdWVuY3kgLyAxMDAwLjA7Ci0KLSAgICAgICAgICAgIHN3aXRjaCggcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQU1SX05COgotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSA9IE00U1lTX2tBTVI7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0ODsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFOwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X0RVUkFUSU9OOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FBQzoKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUNwbHVzOgotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa2VBQUNwbHVzOgotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSA9IE00U1lTX2tBQUM7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5ld2MudWlOYkNoYW5uZWxzID09IDEgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OTzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OT19TSVpFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX1NURVJFTzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPX1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgMTAyNDsgLyogQUFDIGlzIGFsd2F5cyAxMDI0L0ZyZXEgc2FtcGxlIGR1cmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rQXVkaW9Vbmtub3duOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuOiBObyBhdWRpbyB0cmFjayBpbiBpbnB1dCBmaWxlLiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9BVURJT19DQU5OT1RfQkVfTUlYRUQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBBZGQgYSBsaW5rIHRvIGF1ZGlvIGRzaSAqLwotICAgICAgICAgICAgcEMtPmV3Yy51aUF1ZGlvT3V0cHV0RHNpU2l6ZSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQxNilwQy0+cElucHV0Q2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsKLSAgICAgICAgICAgIHBDLT5ld2MucEF1ZGlvT3V0cHV0RHNpID0gKE00T1NBX01lbUFkZHI4KXBDLT5wSW5wdXRDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb3B5IGNvbW1vbiAnc2lsZW5jZSBmcmFtZSBzdHVmZicgdG8gQ2xpcENvbnRleHQgKi8KLSAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnVpU2lsZW5jZVBjbVNpemUgPSBwQy0+ZXdjLnVpU2lsZW5jZVBjbVNpemU7Ci0gICAgcEMtPnBJbnB1dENsaXBDdHh0LT5wU2lsZW5jZUZyYW1lRGF0YSA9IHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGE7Ci0gICAgcEMtPnBJbnB1dENsaXBDdHh0LT51aVNpbGVuY2VGcmFtZVNpemUgPSBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZTsKLSAgICBwQy0+cElucHV0Q2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9IHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uOwotICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+c2NhbGVfYXVkaW8gPSBwQy0+ZXdjLnNjYWxlX2F1ZGlvOwotCi0gICAgcEMtPnBJbnB1dENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyA9Ci0gICAgICAgIC1wQy0+cElucHV0Q2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsgLyogUmVzZXQgdGltZSAqLwotCi0gICAgLyoqCi0gICAgKiBDb3B5IGNvbW1vbiAnc2lsZW5jZSBmcmFtZSBzdHVmZicgdG8gQ2xpcENvbnRleHQgKi8KLSAgICBpZiggcEMtPmJIYXNBdWRpbyApCi0gICAgewotICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnVpU2lsZW5jZVBjbVNpemUgPSBwQy0+ZXdjLnVpU2lsZW5jZVBjbVNpemU7Ci0gICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNpbGVuY2VGcmFtZURhdGEgPSBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhOwotICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnVpU2lsZW5jZUZyYW1lU2l6ZSA9IHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplOwotICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLSAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5zY2FsZV9hdWRpbyA9IHBDLT5ld2Muc2NhbGVfYXVkaW87Ci0KLSAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyA9Ci0gICAgICAgICAgICAtcEMtPnBBZGRlZENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb247IC8qIFJlc2V0IHRpbWUgKi8KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIEFkZEN0cyBpcyBsb3dlciB0aGFuIG9yaWdpbmFsIGNsaXAgZHVyYXRpb24gKi8KLSAgICBpZiggKCBNNE9TQV9OVUxMICE9IHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtKQotICAgICAgICAmJiAocEMtPmlBZGRDdHMgPiAoTTRPU0FfSW50MzIpcEMtPnBJbnB1dENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPgotICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX2R1cmF0aW9uKSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCk6IHVpQWRkQ3RzIGlzIGxhcmdlciB0aGFuIHZpZGVvIGR1cmF0aW9uLFwKLSAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0FERENUU19ISUdIRVJfVEhBTl9WSURFT19EVVJBVElPTiIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9BRERDVFNfSElHSEVSX1RIQU5fVklERU9fRFVSQVRJT047Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJZiB0aGUgYXVkaW8gdHJhY2tzIGFyZSBub3QgY29tcGF0aWJsZSwgcmVwbGFjZSBpbnB1dCB0cmFjayBieSBzaWxlbmNlICovCi0gICAgaWYoIE00T1NBX0ZBTFNFID09IHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgQ2xpcFByb3BlcnRpZXMuYkF1ZGlvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXAgKQotICAgIHsKLSAgICAgICAgTTRWU1MzR1BQX2ludENsaXBEZWxldGVBdWRpb1RyYWNrKHBDLT5wSW5wdXRDbGlwQ3R4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiBhdWRpbyBtaXhpbmcgaXMgcmVxdWlyZWQgKi8KLSAgICBpZiggKCAoIHBDLT5iSGFzQXVkaW8pICYmIChNNE9TQV9GQUxTRQotICAgICAgICA9PSBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuYkF1ZGlvSXNFZGl0YWJsZSkpCi0gICAgICAgIHx8IChNNE9TQV9UUlVFID09IHBDLT5iUmVtb3ZlT3JpZ2luYWwpICkgLyp8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwU2V0dGluZ3MtPnVpQWRkVm9sdW1lID49IDEwMCkpICovCi0gICAgewotICAgICAgICBwQy0+YkF1ZGlvTWl4aW5nSXNOZWVkZWQgPSBNNE9TQV9GQUxTRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEMtPmJBdWRpb01peGluZ0lzTmVlZGVkID0gTTRPU0FfVFJVRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIG91dHB1dCBhdWRpbyBjYW4gc3VwcG9ydCBzaWxlbmNlIGZyYW1lcwotICAgIFRyaWNrIGkgdXNlIGJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwIGZpbGVkIHRvIHN0b3JlIHRoYXQgICovCi0gICAgaWYoIHBDLT5iSGFzQXVkaW8gKQotICAgIHsKLSAgICAgICAgcEMtPmJTdXBwb3J0U2lsZW5jZSA9IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLmJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwOwotCi0gICAgICAgIGlmKCBNNE9TQV9GQUxTRSA9PSBwQy0+YlN1cHBvcnRTaWxlbmNlICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHBDLT5pQWRkQ3RzID4gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCk6XAotICAgICAgICAgICAgICAgICAgICBpQWRkQ3RzIHNob3VsZCBiZSBzZXQgdG8gMCB3aXRoIHRoaXMgYXVkaW8gdHJhY2sgISIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0ZFQVRVUkVfVU5TVVBQT1JURURfV0lUSF9BVURJT19UUkFDSzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIDAgPCBwQy0+dWlFbmRMb29wICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgIHVpRW5kTG9vcCBzaG91bGQgYmUgc2V0IHRvIDAgd2l0aCB0aGlzIGF1ZGlvIHRyYWNrICEiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9GRUFUVVJFX1VOU1VQUE9SVEVEX1dJVEhfQVVESU9fVFJBQ0s7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYoIHBDLT5iX0R1Y2tpbmdOZWVkZWVkID09IE00T1NBX0ZBTFNFKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ29tcHV0ZSB0aGUgZmFjdG9yIHRvIGFwcGx5IHRvIHNhbXBsZSB0byBkbyB0aGUgbWl4aW5nICovCi0gICAgICAgIHBDLT5mQWRkZWRGYWN0b3IgPSAwLjUwRjsKLSAgICAgICAgcEMtPmZPcmlnRmFjdG9yID0gMC41MEY7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIFNTUkMgaXMgbmVlZGVkICovCi0gICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJfU1NSQ25lZWRlZCApCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgbnVtZXJhdG9yLCBkZW5vbWluYXRvciwgcmF0aW8sIHJhdGlvQnVmZmVyOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEluaXQgdGhlIFNTUkMgbW9kdWxlICovCi0gICAgICAgIFNTUkNfUmV0dXJuU3RhdHVzX2VuCi0gICAgICAgICAgICBSZXR1cm5TdGF0dXM7IC8qIEZ1bmN0aW9uIHJldHVybiBzdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIExWTV9JTlQxNiBOclNhbXBsZXNNaW4gPQotICAgICAgICAgICAgMDsgLyogTWluaW1hbCBudW1iZXIgb2Ygc2FtcGxlcyBvbiB0aGUgaW5wdXQgb3Igb24gdGhlIG91dHB1dCAqLwotICAgICAgICBMVk1fSU5UMzIKLSAgICAgICAgICAgIFNjcmF0Y2hTaXplOyAvKiBUaGUgc2l6ZSBvZiB0aGUgc2NyYXRjaCBtZW1vcnkgICAgICAgICAgICAgICAqLwotICAgICAgICBMVk1fSU5UMTYKLSAgICAgICAgICAgICpwSW5wdXRJblNjcmF0Y2g7IC8qIFBvaW50ZXIgdG8gaW5wdXQgaW4gdGhlIHNjcmF0Y2ggYnVmZmVyICAgICAgICovCi0gICAgICAgIExWTV9JTlQxNgotICAgICAgICAgICAgKgotICAgICAgICAgICAgcE91dHB1dEluU2NyYXRjaDsgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGluIHRoZSBzY3JhdGNoIGJ1ZmZlciAgKi8KLSAgICAgICAgU1NSQ19QYXJhbXNfdCBzc3JjUGFyYW1zOyAgICAgICAgICAvKiBNZW1vcnkgZm9yIGluaXQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICBzd2l0Y2goIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDgwMDA6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX0luID0gTFZNX0ZTXzgwMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMTEwMjU6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX0luID0gTFZNX0ZTXzExMDI1OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDEyMDAwOgotICAgICAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19JbiA9IExWTV9GU18xMjAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAxNjAwMDoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfSW4gPSBMVk1fRlNfMTYwMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMjIwNTA6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX0luID0gTFZNX0ZTXzIyMDUwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDI0MDAwOgotICAgICAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19JbiA9IExWTV9GU18yNDAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAzMjAwMDoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfSW4gPSBMVk1fRlNfMzIwMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgNDQxMDA6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX0luID0gTFZNX0ZTXzQ0MTAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDQ4MDAwOgotICAgICAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19JbiA9IExWTV9GU180ODAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW46IGludmFsaWQgYWRkZWQgY2xpcCBzYW1wbGluZyBmcmVxdWVuY3kgKCVkIEh6KSxcCi0gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0FEREVEX0FVRElPX1NUUkVBTSIsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfQURERURfQVVESU9fU1RSRUFNOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIDEgPT0gcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Ock9mQ2hhbm5lbHMgPSBMVk1fTU9OTzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Ock9mQ2hhbm5lbHMgPSBMVk1fU1RFUkVPOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoKCBwQy0+ZXdjLnVpU2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDgwMDA6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU184MDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDE2MDAwOgotICAgICAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19PdXQgPSBMVk1fRlNfMTYwMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMjIwNTA6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU18yMjA1MDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAyNDAwMDoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfT3V0ID0gTFZNX0ZTXzI0MDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDMyMDAwOgotICAgICAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19PdXQgPSBMVk1fRlNfMzIwMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgNDQxMDA6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU180NDEwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSA0ODAwMDoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfT3V0ID0gTFZNX0ZTXzQ4MDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbjogaW52YWxpZCBvdXRwdXQgc2FtcGxpbmcgZnJlcXVlbmN5ICglZCBIeiksXAotICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9BVURJT19DQU5OT1RfQkVfTUlYRUQiLAotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpU2FtcGxpbmdGcmVxdWVuY3kpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0FVRElPX0NBTk5PVF9CRV9NSVhFRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBSZXR1cm5TdGF0dXMgPSAwOwotCi0gICAgICAgIHN3aXRjaCAoc3NyY1BhcmFtcy5TU1JDX0ZzX0luKXsKLSAgICAgICAgY2FzZSBMVk1fRlNfODAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSAzMjA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVk1fRlNfMTEwMjU6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID00NDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVk1fRlNfMTIwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gICAgNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzE2MDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNJbiA9ICAgIDY0MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExWTV9GU18yMjA1MDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSAgICA4ODI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVk1fRlNfMjQwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gICAgOTYwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzMyMDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNJbiA9IDEyODA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVk1fRlNfNDQxMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gMTc2NDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExWTV9GU180ODAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSAxOTIwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBSZXR1cm5TdGF0dXMgPSAtMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChzc3JjUGFyYW1zLlNTUkNfRnNfT3V0KXsKLSAgICAgICAgY2FzZSBMVk1fRlNfODAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0PSAzMjA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVk1fRlNfMTEwMjU6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA9NDQxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzEyMDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQ9ICAgIDQ4MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExWTV9GU18xNjAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0PSAgICA2NDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVk1fRlNfMjIwNTA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc091dD0gICAgODgyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzI0MDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQ9ICAgIDk2MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExWTV9GU18zMjAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0ID0gMTI4MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExWTV9GU180NDEwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0PSAxNzY0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzQ4MDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQgPSAxOTIwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBSZXR1cm5TdGF0dXMgPSAtMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmKCBSZXR1cm5TdGF0dXMgIT0gU1NSQ19PSyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuOlwKLSAgICAgICAgICAgICAgICBFcnJvciBjb2RlICVkIHJldHVybmVkIGJ5IHRoZSBTU1JDX0dldE5yU2FtcGxlcyBmdW5jdGlvbiIsCi0gICAgICAgICAgICAgICAgUmV0dXJuU3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0FVRElPX0NBTk5PVF9CRV9NSVhFRDsKLSAgICAgICAgfQotCi0gICAgICAgIE5yU2FtcGxlc01pbiA9Ci0gICAgICAgICAgICAoTFZNX0lOVDE2KSgoc3NyY1BhcmFtcy5OclNhbXBsZXNJbiA+IHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0KQotICAgICAgICAgICAgPyBzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA6IHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4pOwotCi0gICAgICAgIHdoaWxlKCBOclNhbXBsZXNNaW4gPCBNNFZTU19TU1JDX01JTkJMT0NLU0laRSApCi0gICAgICAgIHsgLyogRG9uJ3QgdGFrZSBibG9ja3Mgc21hbGxlciB0aGF0IHRoZSBtaW5pbWFsIGJsb2NrIHNpemUgKi8KLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSAoTFZNX0lOVDE2KShzc3JjUGFyYW1zLk5yU2FtcGxlc0luIDw8IDEpOwotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQgPSAoTFZNX0lOVDE2KShzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA8PCAxKTsKLSAgICAgICAgICAgIE5yU2FtcGxlc01pbiA9IChMVk1fSU5UMTYpKE5yU2FtcGxlc01pbiA8PCAxKTsKLSAgICAgICAgfQotICAgICAgICBwQy0+aVNzcmNOYlNhbXBsSW4gPSAoTFZNX0lOVDE2KSgKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuCi0gICAgICAgICAgICBOclNhbXBsZXNJbik7IC8qIG11bHRpcGxpY2F0aW9uIGJ5IE5yT2ZDaGFubmVscyBpcyBkb25lIGJlbG93ICovCi0gICAgICAgIHBDLT5pU3NyY05iU2FtcGxPdXQgPSAoTFZNX0lOVDE2KShzc3JjUGFyYW1zLk5yU2FtcGxlc091dCk7Ci0KLSAgICAgICAgbnVtZXJhdG9yID0KLSAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5Ci0gICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHM7Ci0gICAgICAgIGRlbm9taW5hdG9yID0KLSAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5Ci0gICAgICAgICAgICAqIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHM7Ci0KLSAgICAgICAgaWYoIG51bWVyYXRvciAlIGRlbm9taW5hdG9yID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICByYXRpb0J1ZmZlciA9IChNNE9TQV9VSW50MzIpKG51bWVyYXRvciAvIGRlbm9taW5hdG9yKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJhdGlvQnVmZmVyID0gKE00T1NBX1VJbnQzMikobnVtZXJhdG9yIC8gZGVub21pbmF0b3IpICsgMTsKLSAgICAgICAgfQotCi0gICAgICAgIHJhdGlvID0KLSAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKCggcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUKLSAgICAgICAgICAgICogcmF0aW9CdWZmZXIpIC8gKHBDLT5pU3NyY05iU2FtcGxJbiAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICogcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzKSk7Ci0KLSAgICAgICAgaWYoIHJhdGlvID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBJdCBtZWFucyB0aGF0IHRoZSBpbnB1dCBzaXplIG9mIFNTUkMgYnVmZmVySW4gaXMgYmlnZ2VyIHRoYW4gdGhlIGFza2VkIGJ1ZmZlciAqLwotICAgICAgICAgICAgcEMtPm1pbmltdW1CdWZmZXJJbiA9IHBDLT5pU3NyY05iU2FtcGxJbiAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHM7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByYXRpbysrOyAvKiBXZSB1c2UgdGhlIGltbWVkaWF0ZSBzdXBlcmlvciBpbnRlZ2VyICovCi0gICAgICAgICAgICBwQy0+bWluaW11bUJ1ZmZlckluID0gcmF0aW8gKiAocEMtPmlTc3JjTmJTYW1wbEluICogc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICogcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBBbGxvY2F0ZSBidWZmZXIgZm9yIHRoZSBpbnB1dCBvZiB0aGUgU1NSQyAqLwotICAgICAgICBwQy0+cFNzcmNCdWZmZXJJbiA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBDLT5taW5pbXVtQnVmZmVySW4KLSAgICAgICAgICAgICsgcEMtPnBBZGRlZENsaXBDdHh0LT4KLSAgICAgICAgICAgIEF1ZGlvRGVjQnVmZmVyT3V0LgotICAgICAgICAgICAgbV9idWZmZXJTaXplLAotICAgICAgICAgICAgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJwU3NyY0J1ZmZlckluIik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBTc3JjQnVmZmVySW4gKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOlwKLSAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgcFNzcmNCdWZmZXJJbiwgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiA9IChNNE9TQV9NZW1BZGRyOClwQy0+cFNzcmNCdWZmZXJJbjsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBBbGxvY2F0ZSBidWZmZXIgZm9yIHRoZSBvdXRwdXQgb2YgdGhlIFNTUkMgKi8KLSAgICAgICAgLyogVGhlICIzIiB2YWx1ZSBiZWxvdyBzaG91bGQgYmUgb3B0aW1pemVkIC4uLiBvbmUgZGF5IC4uLiAqLwotICAgICAgICBwQy0+cFNzcmNCdWZmZXJPdXQgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygzICogcEMtPmlTc3JjTmJTYW1wbE91dCAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICogcEMtPmV3Yy51aU5iQ2hhbm5lbHMsIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicFNzcmNCdWZmZXJPdXQiKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cFNzcmNCdWZmZXJPdXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOlwKLSAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgcFNzcmNCdWZmZXJPdXQsIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ID0gcEMtPnBTc3JjQnVmZmVyT3V0OwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEFsbG9jYXRlIHRlbXBvcmFyeSBidWZmZXIgbmVlZGVkIGluIGNhc2Ugb2YgY2hhbm5lbCBjb252ZXJzaW9uICovCi0gICAgICAgIGlmKCBwQy0+Q2hhbm5lbENvbnZlcnNpb24gPiAwICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogVGhlICIzIiB2YWx1ZSBiZWxvdyBzaG91bGQgYmUgb3B0aW1pemVkIC4uLiBvbmUgZGF5IC4uLiAqLwotICAgICAgICAgICAgcEMtPnBUZW1wQnVmZmVyID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKDMgKiBwQy0+aVNzcmNOYlNhbXBsT3V0Ci0gICAgICAgICAgICAgICAgKiBzaXplb2Yoc2hvcnQpICogcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscywgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJwU3NyY0J1ZmZlck91dCIpOwotCi0gICAgICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cFRlbXBCdWZmZXIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOlwKLSAgICAgICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIHBUZW1wQnVmZmVyLCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQy0+cFBvc0luVGVtcEJ1ZmZlciA9IHBDLT5wVGVtcEJ1ZmZlcjsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmKCBwQy0+Q2hhbm5lbENvbnZlcnNpb24gPiAwICkKLSAgICB7Ci0gICAgICAgIHBDLT5taW5pbXVtQnVmZmVySW4gPQotICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQWxsb2NhdGUgYnVmZmVyIGZvciB0aGUgaW5wdXQgb2YgdGhlIFNTUkMgKi8KLSAgICAgICAgcEMtPnBTc3JjQnVmZmVySW4gPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+bWluaW11bUJ1ZmZlckluCi0gICAgICAgICAgICArIHBDLT5wQWRkZWRDbGlwQ3R4dC0+Ci0gICAgICAgICAgICBBdWRpb0RlY0J1ZmZlck91dC4KLSAgICAgICAgICAgIG1fYnVmZmVyU2l6ZSwKLSAgICAgICAgICAgIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicFNzcmNCdWZmZXJJbiIpOwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5wU3NyY0J1ZmZlckluICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogXAotICAgICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBwU3NyY0J1ZmZlckluLCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluID0gKE00T1NBX01lbUFkZHI4KXBDLT5wU3NyY0J1ZmZlckluOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEFsbG9jYXRlIGJ1ZmZlciBmb3IgdGhlIG91dHB1dCBvZiB0aGUgU1NSQyAqLwotICAgICAgICAvKiBUaGUgIjMiIHZhbHVlIGJlbG93IHNob3VsZCBiZSBvcHRpbWl6ZWQgLi4uIG9uZSBkYXkgLi4uICovCi0gICAgICAgIHBDLT5wU3NyY0J1ZmZlck91dCA9IChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSwKLSAgICAgICAgICAgIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicFNzcmNCdWZmZXJPdXQiKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cFNzcmNCdWZmZXJPdXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOlwKLSAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgcFNzcmNCdWZmZXJPdXQsIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ID0gcEMtPnBTc3JjQnVmZmVyT3V0OwotICAgIH0KLSAgICBlbHNlIGlmKCAocEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rTVAzKXx8Ci0gICAgICAgICAocEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rUENNKSkKLSAgICB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiBtaW5idWZmZXIgPSAwOwotCi0gICAgICAgIGlmKCBwU2V0dGluZ3MtPm91dHB1dEF1ZGlvRm9ybWF0ID09IE00VklERU9FRElUSU5HX2tBQUMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+bWluaW11bUJ1ZmZlckluID0gMjA0OCAqIHBDLT5ld2MudWlOYkNoYW5uZWxzOwotICAgICAgICAgICAgbWluYnVmZmVyID0gcEMtPm1pbmltdW1CdWZmZXJJbjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBwU2V0dGluZ3MtPm91dHB1dEF1ZGlvRm9ybWF0ID09IE00VklERU9FRElUSU5HX2tBTVJfTkIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+bWluaW11bUJ1ZmZlckluID0gMzIwOwotCi0gICAgICAgICAgICBpZiggcEMtPnBBZGRlZENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgPiAzMjAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1pbmJ1ZmZlciA9IHBDLT5wQWRkZWRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1pbmJ1ZmZlciA9IHBDLT5taW5pbXVtQnVmZmVySW47IC8qIE5vdCByZWFsbHkgcG9zc2libGUgLi4uKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJCYWQgb3V0cHV0IGF1ZGlvIGZvcm1hdCwgaW4gY2FzZSBvZiBNUDMgcmVwbGFjaW5nIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQWxsb2NhdGUgYnVmZmVyIGZvciB0aGUgaW5wdXQgb2YgdGhlIFNTUkMgKi8KLSAgICAgICAgcEMtPnBTc3JjQnVmZmVySW4gPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygyICogbWluYnVmZmVyLCBNNFZTUzNHUFAsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJwU3NyY0J1ZmZlckluIik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBTc3JjQnVmZmVySW4gKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOiB1bmFibGUgdG8gYWxsb2NhdGUgcFNzcmNCdWZmZXJJbixcCi0gICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiA9IChNNE9TQV9NZW1BZGRyOClwQy0+cFNzcmNCdWZmZXJJbjsKLQotICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCA9IHBDLT5wUG9zSW5Tc3JjQnVmZmVySW47Ci0gICAgICAgIHBDLT5wU3NyY0J1ZmZlck91dCA9IHBDLT5wU3NyY0J1ZmZlckluOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2hlY2sgaWYgYXVkaW8gZW5jb2RlciBpcyBuZWVkZWQgdG8gZG8gYXVkaW8gbWl4aW5nIG9yIGF1ZGlvIHJlc2FtcGxpbmcgKi8KLSAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YkF1ZGlvTWl4aW5nSXNOZWVkZWQgfHwgTTRWSURFT0VESVRJTkdfa1BDTQotICAgICAgICA9PSBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgIHx8IE00VklERU9FRElUSU5HX2tNUDMKLSAgICAgICAgPT0gcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICB8fCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICE9IHBTZXR0aW5ncy0+b3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgfHwgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kKLSAgICAgICAgIT0gb3V0cHV0QVNGCi0gICAgICAgIHx8IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMKLSAgICAgICAgIT0gcFNldHRpbmdzLT5vdXRwdXROQkNoYW5uZWxzICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEluaXQgdGhlIGF1ZGlvIGVuY29kZXIgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENyZWF0ZUF1ZGlvRW5jb2RlcigmcEMtPmV3YywgJnBDLT5TaGVsbEFQSSwKLSAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCk6IE00VlNTM0dQUF9pbnRDcmVhdGVBdWRpb0VuY29kZXIoKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogSW4gY2FzZSBvZiBQQ00sIE1QMyBvciBhdWRpbyByZXBsYWNlIHdpdGggcmVlbmNvZGluZywgdXNlIGVuY29kZXIgRFNJICovCi0gICAgICAgIGlmKCBwQy0+ZXdjLnVpQXVkaW9PdXRwdXREc2lTaXplID09IDAgJiYgKE00VklERU9FRElUSU5HX2tQQ00KLSAgICAgICAgICAgID09IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgIHx8IE00VklERU9FRElUSU5HX2tNUDMgPT0gcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICB8fCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICBDbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICE9IHBTZXR0aW5ncy0+b3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgIHx8IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kgIT0gb3V0cHV0QVNGCi0gICAgICAgICAgICB8fCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMKLSAgICAgICAgICAgICE9IHBTZXR0aW5ncy0+b3V0cHV0TkJDaGFubmVscykgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpQXVkaW9PdXRwdXREc2lTaXplID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDE2KXBDLT5ld2MucEF1ZGlvRW5jRFNJLmluZm9TaXplOwotICAgICAgICAgICAgcEMtPmV3Yy5wQXVkaW9PdXRwdXREc2kgPSBwQy0+ZXdjLnBBdWRpb0VuY0RTSS5wSW5mbzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogSW5pdCB0aGUgb3V0cHV0IDNHUFAgZmlsZSAqLwotICAgIC8qMTEvMTIvMjAwOCBDUjMyODMgYWRkIHRoZSBtYXggb3V0cHV0IGZpbGUgc2l6ZSBmb3IgdGhlIE1NUyB1c2UgY2FzZSBpbiBWaWRlb0FydGlzdCovCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlKCZwQy0+ZXdjLCAmcEMtPlNoZWxsQVBJLAotICAgICAgICBwQy0+cE9zYUZpbGVXcml0UHRyLCBwU2V0dGluZ3MtPnBPdXRwdXRDbGlwRmlsZSwKLSAgICAgICAgcEMtPnBPc2FGaWxlUmVhZFB0ciwgcFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSwgMCk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOiBNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGUoKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nV3JpdGVTaWxlbmNlKCkKLSAqIEBicmllZiAgICBXcml0ZSBhbiBhdWRpbyBzaWxlbmNlIGZyYW1lIGludG8gdGhlIHdyaXRlcgotICogQG5vdGUgICAgTWFpbmx5IHVzZWQgd2hlbiBwYWRkaW5nIHdpdGggc2lsZW5jZQotICogQHBhcmFtICAgIHBDICAgICAgICAgICAgKElOKSBWU1MgYXVkaW8gbWl4aW5nIGludGVybmFsIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2UoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nV3JpdGVTaWxlbmNlOlwKLSAgICAgICAgIHBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoYXVkaW8pIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFMl8wKCJBICMjIyMgc2lsZW5jZSBBVSIpOwotCi0gICAgbWVtY3B5KCh2b2lkICopcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzLAotICAgICAgICAodm9pZCAqKXBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEsIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplKTsKLQotICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplID0gcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemU7Ci0gICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyA9Ci0gICAgICAgIChNNE9TQV9UaW1lKShwQy0+ZXdjLmRBVG8gKiBwQy0+ZXdjLnNjYWxlX2F1ZGlvICsgMC41KTsKLQotICAgIE00T1NBX1RSQUNFMl8yKCJCIC0tLS0gd3JpdGUgOiBjdHMgID0gJWxkIFsgMHgleCBdIiwKLSAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLmRBVG8pLCBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSk7Ci0KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2U6XAotICAgICAgICAgICAgcFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKHNpbGVuY2UpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBwQy0+ZXdjLmRBVG8gKz0gcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gLyBwQy0+ZXdjLnNjYWxlX2F1ZGlvOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBWaWRlbyhNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDKQotICogQGJyaWVmICAgIFBlcmZvcm0gb25lIHN0ZXAgb2YgdmlkZW8uCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDICAgICAgICAgICAgKElOKSBWU1MgYXVkaW8gbWl4aW5nIGludGVybmFsIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwVmlkZW8oCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9VSW50MTYgb2Zmc2V0OwotCi0gICAgTTRPU0FfVFJBQ0UyXzMoIiAgVklERU8gc3RlcCA6IGRWVG8gPSAlZiAgc3RhdGUgPSAlZCAgb2Zmc2V0ID0gJWxkIiwKLSAgICAgICAgcEMtPmV3Yy5kT3V0cHV0VmlkQ3RzLCBwQy0+U3RhdGUsIHBDLT5wSW5wdXRDbGlwQ3R4dC0+aVZvZmZzZXQpOwotCi0gICAgLyoqCi0gICAgKiBSZWFkIHRoZSBpbnB1dCB2aWRlbyBBVSAqLwotICAgIGVyciA9IHBDLT5wSW5wdXRDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUoCi0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBJbnB1dENsaXBDdHh0LT5wVmlkZW9TdHJlYW0sCi0gICAgICAgICZwQy0+cElucHV0Q2xpcEN0eHQtPlZpZGVvQVUpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBWaWRlbygpOiBtX3BGY3RHZXROZXh0QXUodmlkZW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFMl8zKCJDIC4uLi4gcmVhZCAgOiBjdHMgID0gJS4wZiArICVsZCBbIDB4JXggXSIsCi0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+VmlkZW9BVS5tX0NUUywgcEMtPnBJbnB1dENsaXBDdHh0LT5pVm9mZnNldCwKLSAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5WaWRlb0FVLm1fc2l6ZSk7Ci0KLSAgICAvKioKLSAgICAqIEdldCB0aGUgb3V0cHV0IEFVIHRvIHdyaXRlIGludG8gKi8KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICBNNFZTUzNHUFBfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRCwgJnBDLT5ld2MuV3JpdGVyVmlkZW9BVSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcFZpZGVvOiBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKFZpZGVvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgb2Zmc2V0ID0gMDsKLSAgICAvKiBmb3IgaC4yNjQgc3RyZWFtIGRvIG5vdCByZWFkIHRoZSAxc3QgNCBieXRlcyBhcyB0aGV5IGFyZSBoZWFkZXIgaW5kaWNhdG9ycyAqLwotICAgIGlmKCBwQy0+cElucHV0Q2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlCi0gICAgICAgID09IE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmMgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcFZpZGVvKCk6IGlucHV0IHN0cmVhbSB0eXBlIEgyNjQiKTsKLSAgICAgICAgb2Zmc2V0ID0gNDsKLSAgICB9Ci0gICAgcEMtPnBJbnB1dENsaXBDdHh0LT5WaWRlb0FVLm1fc2l6ZSAgLT0gIG9mZnNldDsKLSAgICAvKioKLSAgICAqIENoZWNrIHRoYXQgdGhlIHZpZGVvIEFVIGlzIG5vdCBsYXJnZXIgdGhhbiBleHBlY3RlZCAqLwotICAgIGlmKCBwQy0+cElucHV0Q2xpcEN0eHQtPlZpZGVvQVUubV9zaXplID4gcEMtPmV3Yy51aVZpZGVvTWF4QXVTaXplICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBWaWRlbzogQVUgc2l6ZSBncmVhdGVyIHRoYW4gTWF4QXVTaXplICglZD4lZCkhXAotICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5QVVRfVklERU9fQVVfVE9PX0xBUkdFIiwKLSAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+VmlkZW9BVS5tX3NpemUsIHBDLT5ld2MudWlWaWRlb01heEF1U2l6ZSk7Ci0gICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOUFVUX1ZJREVPX0FVX1RPT19MQVJHRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENvcHkgdGhlIGlucHV0IEFVIHBheWxvYWQgdG8gdGhlIG91dHB1dCBBVSAqLwotICAgIG1lbWNweSgodm9pZCAqKXBDLT5ld2MuV3JpdGVyVmlkZW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgKHZvaWQgKikocEMtPnBJbnB1dENsaXBDdHh0LT5WaWRlb0FVLm1fZGF0YUFkZHJlc3MgKyBvZmZzZXQpLAotICAgICAgICAocEMtPnBJbnB1dENsaXBDdHh0LT5WaWRlb0FVLm1fc2l6ZSkpOwotCi0gICAgLyoqCi0gICAgKiBDb3B5IHRoZSBpbnB1dCBBVSBwYXJhbWV0ZXJzIHRvIHRoZSBvdXRwdXQgQVUgKi8KLSAgICBwQy0+ZXdjLldyaXRlclZpZGVvQVUuc2l6ZSA9IHBDLT5wSW5wdXRDbGlwQ3R4dC0+VmlkZW9BVS5tX3NpemU7Ci0gICAgcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLkNUUyA9Ci0gICAgICAgIChNNE9TQV9VSW50MzIpKHBDLT5wSW5wdXRDbGlwQ3R4dC0+VmlkZW9BVS5tX0NUUyArIDAuNSk7Ci0gICAgcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLmF0dHJpYnV0ZSA9IHBDLT5wSW5wdXRDbGlwQ3R4dC0+VmlkZW9BVS5tX2F0dHJpYnV0ZTsKLQotICAgIC8qKgotICAgICogV3JpdGUgdGhlIEFVICovCi0gICAgTTRPU0FfVFJBQ0UyXzIoIkQgLS0tLSB3cml0ZSA6IGN0cyAgPSAlbHUgWyAweCV4IF0iLAotICAgICAgICBwQy0+ZXdjLldyaXRlclZpZGVvQVUuQ1RTLCBwQy0+ZXdjLldyaXRlclZpZGVvQVUuc2l6ZSk7Ci0KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00VlNTM0dQUF9XUklURVJfVklERU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwVmlkZW86IHBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVShWaWRlbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcFZpZGVvKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peChNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDKQotICogQGJyaWVmICAgIFBlcmZvcm0gb25lIHN0ZXAgb2YgYXVkaW8uCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDICAgICAgICAgICAgKElOKSBWU1MgYXVkaW8gbWl4aW5nIGludGVybmFsIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIE00T1NBX1RSQUNFMl8zKCIgIEFVRElPIG1peCAgOiBkQVRvID0gJWYgIHN0YXRlID0gJWQgIG9mZnNldCA9ICVsZCIsCi0gICAgICAgIHBDLT5ld2MuZEFUbywgcEMtPlN0YXRlLCBwQy0+cElucHV0Q2xpcEN0eHQtPmlBb2Zmc2V0KTsKLQotICAgIHN3aXRjaCggcEMtPlN0YXRlICkKLSAgICB7Ci0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICBjYXNlIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19GSVJTVF9TRUdNRU5UOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlPcmlnKHBDKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXg6XAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weU9yaWcoMSkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQ2hlY2sgaWYgd2UgcmVhY2hlZCB0aGUgQWRkQ3RzICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5ld2MuZEFUbyA+PSBwQy0+aUFkZEN0cyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBGaXJzdCBzZWdtZW50IGlzIG92ZXIsIHN0YXRlIHRyYW5zaXRpb24gdG8gc2Vjb25kIGFuZCByZXR1cm4gT0sgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX0FVRElPX1NFQ09ORF9TRUdNRU5UOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFRyYW5zaXRpb24gZnJvbSByZWFkaW5nIHN0YXRlIHRvIGVuY29kaW5nIHN0YXRlICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1RyYW5zaXRpb24ocEMpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTogcHJlLWVuY29kZSBmYWlscyBlcnIgPSAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yIHNvIHRoZSBzdGVwIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFnYWluICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUFvZmZzZXQgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLmRBVG8gKiBwQy0+ZXdjLnNjYWxlX2F1ZGlvICsgMC41KTsKLQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IgKDEtPjIpIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICBjYXNlIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19TRUNPTkRfU0VHTUVOVDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YkF1ZGlvTWl4aW5nSXNOZWVkZWQgKSAvKio8IE1peCAqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogUmVhZCB0aGUgYWRkZWQgYXVkaW8gQVUgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5DaGFubmVsQ29udmVyc2lvbiA+IDAgfHwgcEMtPmJfU1NSQ25lZWRlZCA9PSBNNE9TQV9UUlVFCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa01QMyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluIGNhc2Ugb2Ygc2FtcGxpbmcgZnJlcSBjb252ZXJzaW9uIGFuZC9vciBjaGFubmVsIGNvbnZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmVhZCBuZXh0IEFVIHdpbGwgYmUgICAgY2FsbGVkIGJ5IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRG9NaXhpbmcgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocEMtPnBBZGRlZENsaXBDdHh0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzMoIkUgLi4uLiByZWFkICA6IGN0cyAgPSAlLjBmICsgJS4wZiBbIDB4JXggXSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gcEMtPnBBZGRlZENsaXBDdHh0LT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPmlBb2Zmc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBwQy0+cEFkZGVkQ2xpcEN0eHQtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNFdBUl9OT19NT1JFX0FVID09IGVyciApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBEZWNpZGUgd2hhdCB0byBkbyB3aGVuIGF1ZGlvIGlzIG92ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggcEMtPnVpRW5kTG9vcCA+IDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogSnVtcCBhdCB0aGUgQmVnaW4gbG9vcCB0aW1lICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIHRpbWUgPSAoTTRPU0FfSW50MzIpKHBDLT51aUJlZ2luTG9vcCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPnBBZGRlZENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRmN0SnVtcCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilwQy0+cEFkZGVkQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4KCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0SnVtcChhdWRpbyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRyYW5zaXRpb24gZnJvbSBlbmNvZGluZyBzdGF0ZSB0byByZWFkaW5nIHN0YXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1RyYW5zaXRpb24ocEMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlLWVuY29kZSBmYWlscyBlcnIgPSAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFNlY29uZCBzZWdtZW50IGlzIG92ZXIsIHN0YXRlIHRyYW5zaXRpb24gdG8gdGhpcmQgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPlN0YXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19USElSRF9TRUdNRU5UOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yIHNvIHRoZSBzdGVwIGZ1bmN0aW9uIHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZCBhZ2FpbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiAoMi0+MykgYSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZjdEdldE5leHRBdShhdWRpbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogUmVhZCB0aGUgb3JpZ2luYWwgYXVkaW8gQVUgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocEMtPnBJbnB1dENsaXBDdHh0KTsKLQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygiRiAuLi4uIHJlYWQgIDogY3RzICA9ICUuMGYgKyAlLjBmIFsgMHgleCBdIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8gcEMtPnBJbnB1dENsaXBDdHh0LT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+aUFvZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8gcEMtPnBJbnB1dENsaXBDdHh0LT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BGY3RHZXROZXh0QXUoYXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPkNoYW5uZWxDb252ZXJzaW9uID09IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHBDLT5iX1NTUkNuZWVkZWQgPT0gTTRPU0FfRkFMU0UKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSAhPSBNNFZJREVPRURJVElOR19rTVAzICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIEdldCB0aGUgb3V0cHV0IEFVIHRvIHdyaXRlIGludG8gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBDLT5ld2MuV3JpdGVyQXVkaW9BVSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXg6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKGF1ZGlvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogUGVyZm9ybSB0aGUgYXVkaW8gbWl4aW5nICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0RvTWl4aW5nKHBDKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZXJyID09IE00VlNTM0dQUF9XQVJfRU5EX09GX0FEREVEX0FVRElPICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4OlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEb01peGluZyByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIC8qKjwgTm8gbWl4LCBqdXN0IGNvcHkgYWRkZWQgYXVkaW8gKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlBZGRlZChwQyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00V0FSX05PX01PUkVfQVUgPT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIERlY2lkZSB3aGF0IHRvIGRvIHdoZW4gYXVkaW8gaXMgb3ZlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT51aUVuZExvb3AgPiAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEp1bXAgYXQgdGhlIEJlZ2luIGxvb3AgdGltZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIHRpbWUgPSAoTTRPU0FfSW50MzIpKHBDLT51aUJlZ2luTG9vcCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0SnVtcCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilwQy0+cEFkZGVkQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0SnVtcChhdWRpbyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICdCWlpaJyBidWcgZml4OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYWRkIGEgc2lsZW5jZSBmcmFtZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1dyaXRlU2lsZW5jZShwQyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4KCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nV3JpdGVTaWxlbmNlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3Igc28gdGhlIHN0ZXAgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWdhaW4gdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQgYXVkaW8gZGF0YSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUFvZmZzZXQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKHBDLT5ld2MuZEFUbyAqIHBDLT5ld2Muc2NhbGVfYXVkaW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAwLjUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiAobG9vcCkiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUcmFuc2l0aW9uIHRvIGJlZ2luIGN1dCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1RyYW5zaXRpb24ocEMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZS1lbmNvZGUgZmFpbHMgZXJyID0gMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogU2Vjb25kIHNlZ21lbnQgaXMgb3Zlciwgc3RhdGUgdHJhbnNpdGlvbiB0byB0aGlyZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19USElSRF9TRUdNRU5UOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciBzbyB0aGUgc3RlcCBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhZ2FpbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4KCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiAoMi0+MykgYiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5T3JpZygyKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBDaGVjayBpZiB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHZpZGVvICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5ld2MuZEFUbyA+PSBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTogVmlkZW8gZHVyYXRpb24gcmVhY2hlZCxcCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRXQVJfTk9fTU9SRV9BVSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRXQVJfTk9fTU9SRV9BVTsgLyoqPCBTaW11bGF0ZSBlbmQgb2YgZmlsZSBlcnJvciAqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fVEhJUkRfU0VHTUVOVDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5T3JpZyhwQyk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4OlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlPcmlnKDMpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIENoZWNrIGlmIHdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgdmlkZW8gKi8KLSAgICAgICAgICAgICAgICBpZiggcEMtPmV3Yy5kQVRvID49IHBDLT5ld2MuaU91dHB1dER1cmF0aW9uICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIFZpZGVvIGR1cmF0aW9uIHJlYWNoZWQsIHJldHVybmluZyBNNFdBUl9OT19NT1JFX0FVIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX0FVOyAvKio8IFNpbXVsYXRlIGVuZCBvZiBmaWxlIGVycm9yICovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9SZXBsYWNlKE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMpCi0gKiBAYnJpZWYgICAgUGVyZm9ybSBvbmUgc3RlcCBvZiBhdWRpby4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcEMgICAgICAgICAgICAoSU4pIFZTUyBhdWRpbyBtaXhpbmcgaW50ZXJuYWwgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb1JlcGxhY2UoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIE00T1NBX1RSQUNFMl8zKCIgIEFVRElPIHJlcGwgOiBkQVRvID0gJWYgIHN0YXRlID0gJWQgIG9mZnNldCA9ICVsZCIsCi0gICAgICAgIHBDLT5ld2MuZEFUbywgcEMtPlN0YXRlLCBwQy0+cElucHV0Q2xpcEN0eHQtPmlBb2Zmc2V0KTsKLQotICAgIHN3aXRjaCggcEMtPlN0YXRlICkKLSAgICB7Ci0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICBjYXNlIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19GSVJTVF9TRUdNRU5UOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogUmVwbGFjZSB0aGUgU0lEIChzaWxlbmNlKSBwYXlsb2FkIGluIHRoZSB3cml0ZXIgQVUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2UocEMpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1dyaXRlU2lsZW5jZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIENoZWNrIGlmIHdlIHJlYWNoZWQgdGhlIEFkZEN0cyAqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+ZXdjLmRBVG8gPj0gcEMtPmlBZGRDdHMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogRmlyc3Qgc2VnbWVudCBpcyBvdmVyLCBzdGF0ZSB0cmFuc2l0aW9uIHRvIHNlY29uZCBhbmQgcmV0dXJuIE9LICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19TRUNPTkRfU0VHTUVOVDsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciBzbyB0aGUgc3RlcCBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhZ2FpbiAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPmlBb2Zmc2V0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMikocEMtPmV3Yy5kQVRvICogcEMtPmV3Yy5zY2FsZV9hdWRpbyArIDAuNSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb1JlcGxhY2UoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00Tk9fRVJST1IgKDEtPjIpIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fU0VDT05EX1NFR01FTlQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weUFkZGVkKHBDKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNFdBUl9OT19NT1JFX0FVID09IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBEZWNpZGUgd2hhdCB0byBkbyB3aGVuIGF1ZGlvIGlzIG92ZXIgKi8KLQotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPnVpRW5kTG9vcCA+IDAgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogSnVtcCBhdCB0aGUgQmVnaW4gbG9vcCB0aW1lICovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiB0aW1lID0gKE00T1NBX0ludDMyKShwQy0+dWlCZWdpbkxvb3ApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+cEFkZGVkQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0SnVtcCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKilwQy0+cEFkZGVkQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwgJnRpbWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvUmVwbGFjZSgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyLT5tX3BGY3RKdW1wKGF1ZGlvIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqICdCWlpaJyBidWcgZml4OgotICAgICAgICAgICAgICAgICAgICAgICAgKiBhZGQgYSBzaWxlbmNlIGZyYW1lICovCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2UocEMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4KCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2UgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3Igc28gdGhlIHN0ZXAgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWdhaW4gdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCBhdWRpbyBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPmlBb2Zmc2V0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKHBDLT5ld2MuZEFUbyAqIHBDLT5ld2Muc2NhbGVfYXVkaW8gKyAwLjUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvUmVwbGFjZSgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiAobG9vcCkiKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YlN1cHBvcnRTaWxlbmNlICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFNlY29uZCBzZWdtZW50IGlzIG92ZXIsIHN0YXRlIHRyYW5zaXRpb24gdG8gdGhpcmQgYW5kIHJldHVybiBPSyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX0FVRElPX1RISVJEX1NFR01FTlQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciBzbyB0aGUgc3RlcCBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhZ2FpbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb1JlcGxhY2UoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiAoMi0+MykiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFRoZSB0aGlyZCBzZWdtZW50IChzaWxlbmNlKSBpcyBvbmx5IGRvbmUgaWYgc3VwcG9ydGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgKiBJbiBvdGhlciBjYXNlLCB3ZSBmaW5pc2ggaGVyZS4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9GSU5JU0hFRDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yIHNvIHRoZSBzdGVwIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFnYWluICovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvUmVwbGFjZSgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE5PX0VSUk9SICgyLT5GKSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvUmVwbGFjZSgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlPcmlnKDIpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQ2hlY2sgaWYgd2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBjbGlwICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5ld2MuZEFUbyA+PSBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9SZXBsYWNlKCk6IENsaXAgZHVyYXRpb24gcmVhY2hlZCxcCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRXQVJfTk9fTU9SRV9BVSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRXQVJfTk9fTU9SRV9BVTsgLyoqPCBTaW11bGF0ZSBlbmQgb2YgZmlsZSBlcnJvciAqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fVEhJUkRfU0VHTUVOVDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFJlcGxhY2UgdGhlIFNJRCAoc2lsZW5jZSkgcGF5bG9hZCBpbiB0aGUgd3JpdGVyIEFVICovCi0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nV3JpdGVTaWxlbmNlKHBDKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2UgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBDaGVjayBpZiB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHZpZGVvICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5ld2MuZEFUbyA+PSBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9SZXBsYWNlKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgVmlkZW8gZHVyYXRpb24gcmVhY2hlZCwgcmV0dXJuaW5nIE00V0FSX05PX01PUkVfQVUiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfQVU7IC8qKjwgU2ltdWxhdGUgZW5kIG9mIGZpbGUgZXJyb3IgKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb1JlcGxhY2UoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weU9yaWcoTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQykKLSAqIEBicmllZiAgICBSZWFkIG9uZSBBVSBmcm9tIHRoZSBvcmlnaW5hbCBhdWRpbyBmaWxlIGFuZCB3cml0ZSBpdCB0byB0aGUgb3V0cHV0Ci0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDICAgIChJTikgVlNTIGF1ZGlvIG1peGluZyBpbnRlcm5hbCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weU9yaWcoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIC8qKgotICAgICogUmVhZCB0aGUgaW5wdXQgb3JpZ2luYWwgYXVkaW8gQVUgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShwQy0+cElucHV0Q2xpcEN0eHQpOwotCi0gICAgTTRPU0FfVFJBQ0UyXzMoIkcgLi4uLiByZWFkICA6IGN0cyAgPSAlLjBmICsgJS4wZiBbIDB4JXggXSIsCi0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgLyBwQy0+cElucHV0Q2xpcEN0eHQtPnNjYWxlX2F1ZGlvLAotICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPmlBb2Zmc2V0IC8gcEMtPnBJbnB1dENsaXBDdHh0LT5zY2FsZV9hdWRpbywKLSAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5T3JpZygpOiBtX3BGY3RHZXROZXh0QXUoYXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogR2V0IHRoZSBvdXRwdXQgQVUgdG8gd3JpdGUgaW50byAqLwotICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5T3JpZzogcFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShhdWRpbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ29weSB0aGUgaW5wdXQgQVUgcHJvcGVydGllcyB0byB0aGUgb3V0cHV0IEFVICovCi0gICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUgPSBwQy0+cElucHV0Q2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemU7Ci0gICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgKyBwQy0+cElucHV0Q2xpcEN0eHQtPmlBb2Zmc2V0OwotCi0gICAgLyoqCi0gICAgKiBDb3B5IHRoZSBBVSBpdHNlbGYgKi8KLSAgICBtZW1jcHkoKHZvaWQgKilwQy0+ZXdjLldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3MsCi0gICAgICAgICh2b2lkICopcEMtPnBJbnB1dENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0ciwgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUpOwotCi0gICAgLyoqCi0gICAgKiBXcml0ZSB0aGUgbWl4ZWQgQVUgKi8KLSAgICBNNE9TQV9UUkFDRTJfMigiSCAtLS0tIHdyaXRlIDogY3RzICA9ICVsZCBbIDB4JXggXSIsCi0gICAgICAgIChNNE9TQV9JbnQzMikocEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyAvIHBDLT5ld2Muc2NhbGVfYXVkaW8pLAotICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSk7Ci0KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5T3JpZzogcFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKGF1ZGlvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJbmNyZW1lbnQgdGhlIGF1ZGlvIENUUyBmb3IgdGhlIG5leHQgc3RlcCAqLwotICAgIHBDLT5ld2MuZEFUbyArPSBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiAvIHBDLT5ld2Muc2NhbGVfYXVkaW87Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlPcmlnKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlBZGRlZChNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDKQotICogQGJyaWVmICAgIFJlYWQgb25lIEFVIGZyb20gdGhlIGFkZGVkIGF1ZGlvIGZpbGUgYW5kIHdyaXRlIGl0IHRvIHRoZSBvdXRwdXQKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcEMgICAgKElOKSBWU1MgYXVkaW8gbWl4aW5nIGludGVybmFsIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5QWRkZWQoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIGlmKHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa01QMyB8fAotICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tQQ00gfHwKLSAgICAgICAgcEMtPmJfU1NSQ25lZWRlZCA9PSBNNE9TQV9UUlVFIHx8Ci0gICAgICAgIHBDLT5DaGFubmVsQ29udmVyc2lvbiA+IDApCi0gICAgewotICAgICAgICBNNEVOQ09ERVJfQXVkaW9CdWZmZXIgcEVuY0luQnVmZmVyOyAvKio8IEVuY29kZXIgaW5wdXQgYnVmZmVyIGZvciBhcGkgKi8KLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvQnVmZmVyCi0gICAgICAgICAgICBwRW5jT3V0QnVmZmVyOyAvKio8IEVuY29kZXIgb3V0cHV0IGJ1ZmZlciBmb3IgYXBpICovCi0gICAgICAgIE00T1NBX1RpbWUKLSAgICAgICAgICAgIGZyYW1lVGltZURlbHRhOyAvKio8IER1cmF0aW9uIG9mIHRoZSBlbmNvZGVkICh0aGVuIHdyaXR0ZW4pIGRhdGEgKi8KLSAgICAgICAgTTRPU0FfTWVtQWRkcjggdGVtcFBvc0J1ZmZlcjsKLQotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb252ZXJ0KHBDKTsKLQotICAgICAgICBpZiggZXJyID09IE00VlNTM0dQUF9XQVJfRU5EX09GX0FEREVEX0FVRElPICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlBZGRlZDpcCi0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29udmVydCBlbmQgb2YgYWRkZWQgZmlsZSIpOwotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weUFkZGVkOlwKLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb252ZXJ0IHJldHVybmVkIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEdldCB0aGUgb3V0cHV0IEFVIHRvIHdyaXRlIGludG8gKi8KLSAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUocEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4OlwKLSAgICAgICAgICAgICAgICBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKGF1ZGlvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFtNb25vXSBvciBbU3RlcmVvIGludGVybGVhdmVkXSA6IGFsbCBpcyBpbiBvbmUgYnVmZmVyICovCi0gICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMF0gPSBwQy0+cFNzcmNCdWZmZXJPdXQ7Ci0gICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdID0KLSAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplOwotICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyWzFdID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMV0gPSAwOwotCi0gICAgICAgIC8qIFRpbWUgaW4gbXMgZnJvbSBkYXRhIHNpemUsIGJlY2F1c2UgaXQgaXMgUENNMTYgc2FtcGxlcyAqLwotICAgICAgICBmcmFtZVRpbWVEZWx0YSA9IHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdIC8gc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgLyBwQy0+ZXdjLnVpTmJDaGFubmVsczsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBQcmVwYXJlIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJbMF0gPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzczsKLSAgICAgICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdID0gMDsKLQotICAgICAgICBNNE9TQV9UUkFDRTJfMCgiSyAqKioqIGJsZW5kIEFVcyIpOwotICAgICAgICAvKioKLSAgICAgICAgKiBFbmNvZGUgdGhlIFBDTSBhdWRpbyAqLwotCi0gICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0ZXAoCi0gICAgICAgICAgICBwQy0+ZXdjLnBBdWRpb0VuY0N0eHQsICZwRW5jSW5CdWZmZXIsICZwRW5jT3V0QnVmZmVyKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRG9NaXhpbmcoKTpcCi0gICAgICAgICAgICAgICAgcEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGVwIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBTZXQgQVUgY3RzIGFuZCBzaXplICovCi0gICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplID0KLSAgICAgICAgICAgIHBFbmNPdXRCdWZmZXIuCi0gICAgICAgICAgICBwVGFibGVCdWZmZXJTaXplWzBdOyAvKio8IEdldCB0aGUgc2l6ZSBvZiBlbmNvZGVkIGRhdGEgKi8KLSAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyArPSBmcmFtZVRpbWVEZWx0YTsKLQotICAgICAgICAvKiBVcGRhdGUgZGVjb2RlZCBidWZmZXIgaGVyZSAqLwotICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+Yl9TU1JDbmVlZGVkIHx8IHBDLT5DaGFubmVsQ29udmVyc2lvbiA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0ZW1wUG9zQnVmZmVyID0gcEMtPnBTc3JjQnVmZmVyT3V0Ci0gICAgICAgICAgICAgICAgKyBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgICAgIG1lbW1vdmUoKHZvaWQgKilwQy0+cFNzcmNCdWZmZXJPdXQsICh2b2lkICopdGVtcFBvc0J1ZmZlciwKLSAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCAtIHRlbXBQb3NCdWZmZXIpOwotICAgICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgLT0KLSAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRlbXBQb3NCdWZmZXIgPSBwQy0+cFNzcmNCdWZmZXJJbiArIHBDLT5taW5pbXVtQnVmZmVySW47Ci0gICAgICAgICAgICBtZW1tb3ZlKCh2b2lkICopcEMtPnBTc3JjQnVmZmVySW4sICh2b2lkICopdGVtcFBvc0J1ZmZlciwKLSAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC0gdGVtcFBvc0J1ZmZlcik7Ci0gICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC09IHBDLT5taW5pbXVtQnVmZmVySW47Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBXcml0ZSB0aGUgbWl4ZWQgQVUgKi8KLSAgICAgICAgTTRPU0FfVFJBQ0UyXzIoIkogLS0tLSB3cml0ZSA6IGN0cyAgPSAlbGQgWyAweCV4IF0iLAotICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTIC8gcEMtPmV3Yy5zY2FsZV9hdWRpbyksCi0gICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSk7Ci0KLSAgICAgICAgZXJyID0KLSAgICAgICAgICAgIHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUocEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weUFkZGVkOlwKLSAgICAgICAgICAgICAgICBwV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUoYXVkaW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogSW5jcmVtZW50IHRoZSBhdWRpbyBDVFMgZm9yIHRoZSBuZXh0IHN0ZXAgKi8KLSAgICAgICAgcEMtPmV3Yy5kQVRvICs9IGZyYW1lVGltZURlbHRhIC8gcEMtPmV3Yy5zY2FsZV9hdWRpbzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogUmVhZCB0aGUgYWRkZWQgYXVkaW8gQVUgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocEMtPnBBZGRlZENsaXBDdHh0KTsKLQotICAgICAgICBNNE9TQV9UUkFDRTJfMygiSSAuLi4uIHJlYWQgIDogY3RzICA9ICUuMGYgKyAlLjBmIFsgMHgleCBdIiwKLSAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMKLSAgICAgICAgICAgIC8gcEMtPnBBZGRlZENsaXBDdHh0LT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUFvZmZzZXQgLyBwQy0+cEFkZGVkQ2xpcEN0eHQtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weUFkZGVkKCk6IG1fcEZjdEdldE5leHRBdShhdWRpbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEdldCB0aGUgb3V0cHV0IEFVIHRvIHdyaXRlIGludG8gKi8KLSAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUocEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weUFkZGVkOlwKLSAgICAgICAgICAgICAgICBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKGF1ZGlvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENvcHkgdGhlIGlucHV0IEFVIHByb3BlcnRpZXMgdG8gdGhlIG91dHB1dCBBVSAqLwotCi0gICAgICAgIC8qKiBUSEUgQ0hFQ0sgQkVMT1cgSVMgQURERUQgVE8gUFJFVkVOVCBJU1NVRVMgTElOS0VEIFRPIFBSRS1BTExPQ0FURUQgTUFYIEFVIFNJWkUKLSAgICAgICAgbWF4IEFVIHNpemUgaXMgc2V0IGJhc2VkIG9uIE00VlNTM0dQUF9BVURJT19NQVhfQVVfU0laRSBkZWZpbmVkIGluIGZpbGUKLSAgICAgICAgTTRWU1MzR1BQX0ludGVybmFsQ29uZmlnLmgsIElmIHRoaXMgZXJyb3Igb2NjdXJzIGluY3JlYXNlIHRoZSBsaW1pdCBzZXQgaW4gdGhpcyBmaWxlCi0gICAgICAgICovCi0gICAgICAgIGlmKCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemUgPiBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgICAgICJFUlJPUjogYXVkaW8gQVUgc2l6ZSAoJWQpIHRvIGNvcHkgbGFyZ2VyIHRoYW4gYWxsb2NhdGVkIG9uZSAoJWQpID0+IGFib3J0IiwKLSAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemUsCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUpOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIlBMRUFTRSBDT05UQUNUIFNVUFBPUlQgVE8gRVhURU5EIE1BWCBBVSBTSVpFIElOIFRIRSBQUk9EVUNUIExJQlJBUlkiKTsKLSAgICAgICAgICAgIGVyciA9IE00RVJSX1VOU1VQUE9SVEVEX01FRElBX1RZUEU7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplID0gcEMtPnBBZGRlZENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplOwotICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTID0KLSAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgKyBwQy0+cEFkZGVkQ2xpcEN0eHQtPmlBb2Zmc2V0OwotCi0gICAgICAgIC8qKgotICAgICAgICAqIENvcHkgdGhlIEFVIGl0c2VsZiAqLwotICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+ZXdjLldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAodm9pZCAqKXBDLT5wQWRkZWRDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIsIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplKTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBXcml0ZSB0aGUgbWl4ZWQgQVUgKi8KLSAgICAgICAgTTRPU0FfVFJBQ0UyXzIoIkogLS0tLSB3cml0ZSA6IGN0cyAgPSAlbGQgWyAweCV4IF0iLAotICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTIC8gcEMtPmV3Yy5zY2FsZV9hdWRpbyksCi0gICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSk7Ci0KLSAgICAgICAgZXJyID0KLSAgICAgICAgICAgIHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUocEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weUFkZGVkOlwKLSAgICAgICAgICAgICAgICBwV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUoYXVkaW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogSW5jcmVtZW50IHRoZSBhdWRpbyBDVFMgZm9yIHRoZSBuZXh0IHN0ZXAgKi8KLSAgICAgICAgcEMtPmV3Yy5kQVRvICs9IHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uIC8gcEMtPmV3Yy5zY2FsZV9hdWRpbzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlBZGRlZCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29udmVydChNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDKQotICogQGJyaWVmICAgIENvbnZlcnQgUENNIG9mIGFkZGVkIHRyYWNrIHRvIHRoZSByaWdodCBBU0YgLyBuYiBvZiBDaGFubmVscwotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQyAgICAoSU4pIFZTUyBhdWRpbyBtaXhpbmcgaW50ZXJuYWwgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbnZlcnQoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBpbnQgc3NyY0VycjsgLyoqPCBFcnJvciB3aGlsZSBzc3JjIHByb2Nlc3NpbmcgKi8KLSAgICBNNE9TQV9VSW50MzIgdWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzID0KLSAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgLyBzaXplb2Yoc2hvcnQpCi0gICAgICAgIC8gcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVsczsKLSAgICBNNE9TQV9NZW1BZGRyOCB0ZW1wUG9zQnVmZmVyOwotCi0gICAgTTRPU0FfVUludDMyIG91dEZyYW1lQ291bnQgPSB1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXM7Ci0gICAgLyogRG8gd2UgbmVlZCB0byBmZWVkIFNTUkMgYnVmZmVyIEluID8gKi8KLSAgICAvKioKLSAgICAqIFJDOiBUaGlzIGlzIG5vdCByZWFsbHkgb3B0aW11bSAobWVtbW92ZSkuIFdlIHNob3VsZCBoYW5kbGUgdGhpcyB3aXRoIGxpbmtlZCBsaXN0LiAqLwotICAgIHdoaWxlKCBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC0gcEMtPnBTc3JjQnVmZmVySW4gPCAoTTRPU0FfSW50MzIpcEMtPm1pbmltdW1CdWZmZXJJbiApCi0gICAgewotICAgICAgICAvKiBXZSBuZWVkIHRvIGdldCBtb3JlIFBDTSBkYXRhICovCi0gICAgICAgIGlmIChwQy0+Yk5vTG9vcGluZyA9PSBNNE9TQV9UUlVFKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNFdBUl9OT19NT1JFX0FVOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShwQy0+cEFkZGVkQ2xpcEN0eHQpOwotICAgICAgICB9Ci0gICAgICAgIGlmKHBDLT5ianVtcGZsYWcpCi0gICAgICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEp1bXAgYXQgdGhlIEJlZ2luIGxvb3AgdGltZSAqLwotICAgICAgICAgICAgTTRPU0FfSW50MzIgdGltZSA9IChNNE9TQV9JbnQzMikocEMtPnVpQmVnaW5Mb29wKTsKLQotICAgICAgICAgICAgZXJyID0KLSAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0SnVtcFwKLSAgICAgICAgICAgICAgICAgICAgKHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciopcEMtPnBBZGRlZENsaXBDdHh0LT5wQXVkaW9TdHJlYW0sICZ0aW1lKTsKLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29udmVydCgpOlwKLSAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0SnVtcChhdWRpbyByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQy0+Ymp1bXBmbGFnID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgTTRPU0FfVFJBQ0UyXzMoIkUgLi4uLiByZWFkICA6IGN0cyAgPSAlLjBmICsgJS4wZiBbIDB4JXggXSIsCi0gICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyAvIHBDLT5wQWRkZWRDbGlwQ3R4dC0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUFvZmZzZXQgLyBwQy0+cEFkZGVkQ2xpcEN0eHQtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplKTsKLSAgICAgICAgaWYoIE00V0FSX05PX01PUkVfQVUgPT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYocEMtPmJOb0xvb3BpbmcgPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+dWlFbmRMb29wID0wOyAvKiBWYWx1ZSAwIG1lYW5zIG5vIGxvb3BpbmcgaXMgcmVxdWlyZWQgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBEZWNpZGUgd2hhdCB0byBkbyB3aGVuIGF1ZGlvIGlzIG92ZXIgKi8KLSAgICAgICAgICAgIGlmKCBwQy0+dWlFbmRMb29wID4gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBKdW1wIGF0IHRoZSBCZWdpbiBsb29wIHRpbWUgKi8KLSAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiB0aW1lID0gKE00T1NBX0ludDMyKShwQy0+dWlCZWdpbkxvb3ApOwotCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPnBBZGRlZENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdEp1bXAoCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBBZGRlZENsaXBDdHh0LT4KLSAgICAgICAgICAgICAgICAgICAgcEF1ZGlvU3RyZWFtLCAmdGltZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29udmVydCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0SnVtcChhdWRpbyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogVHJhbnNpdGlvbiBmcm9tIGVuY29kaW5nIHN0YXRlIHRvIHJlYWRpbmcgc3RhdGUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdUcmFuc2l0aW9uKHBDKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTogcHJlLWVuY29kZSBmYWlscyBlcnIgPSAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBTZWNvbmQgc2VnbWVudCBpcyBvdmVyLCBzdGF0ZSB0cmFuc2l0aW9uIHRvIHRoaXJkIGFuZCByZXR1cm4gT0sgKi8KLSAgICAgICAgICAgICAgICBwQy0+U3RhdGUgPSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fVEhJUkRfU0VHTUVOVDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3Igc28gdGhlIHN0ZXAgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWdhaW4gKi8KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbnZlcnQoKTpcCi0gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfV0FSX0VORF9PRl9BRERFRF9BVURJTyAoMi0+MykgYSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX0VORF9PRl9BRERFRF9BVURJTzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb252ZXJ0KCk6IG1fcEZjdEdldE5leHRBdShhdWRpbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUocEMtPnBBZGRlZENsaXBDdHh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRG9NaXhpbmc6XAotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUoYWRkZWQpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0NPUlJVUFRFRF9BVTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENvcHkgZGVjb2RlZCBkYXRhIGludG8gU1NSQyBidWZmZXIgaW4gKi8KLSAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPnBQb3NJblNzcmNCdWZmZXJJbiwKLSAgICAgICAgICAgICh2b2lkICopcEMtPnBBZGRlZENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUpOwotICAgICAgICAvKiBVcGRhdGUgcG9zaXRpb24gcG9pbnRlciBpbnRvIFNTUkMgYnVmZmVyIEluICovCi0KLSAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiArPQotICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0gICAgfQotCi0gICAgLyogRG8gdGhlIHJlc2FtcGxpbmcgLyBjaGFubmVsIGNvbnZlcnNpb24gaWYgbmVlZGVkICg9ZmVlZCBidWZmZXIgb3V0KSAqLwotICAgIGlmKCBwQy0+Yl9TU1JDbmVlZGVkID09IE00T1NBX1RSVUUgKQotICAgIHsKLSAgICAgICAgcEMtPkNoYW5uZWxDb252ZXJzaW9uID0gMDsKLSAgICAgICAgaWYoIHBDLT5DaGFubmVsQ29udmVyc2lvbiA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICB3aGlsZSggcEMtPnBQb3NJblRlbXBCdWZmZXIgLSBwQy0+cFRlbXBCdWZmZXIKLSAgICAgICAgICAgICAgICA8IChNNE9TQV9JbnQzMikocEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUKLSAgICAgICAgICAgICAgICAqcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscykKLSAgICAgICAgICAgICAgICAvIHBDLT5DaGFubmVsQ29udmVyc2lvbiApCi0gICAgICAgICAgICAgICAgLyogV2UgdXNlIENoYW5uZWxDb252ZXJzaW9uIHZhcmlhYmxlIGJlY2F1c2UgaW4gY2FzZSAyLCB3ZSBuZWVkIHR3aWNlIGxlc3MgZGF0YSAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNzcmNFcnIgPSAwOwotICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBDLT5wUG9zSW5UZW1wQnVmZmVyLDAsCi0gICAgICAgICAgICAgICAgICAgIChwQy0+aVNzcmNOYlNhbXBsT3V0ICogc2l6ZW9mKHNob3J0KSAqIHBDLT5ld2MudWlOYkNoYW5uZWxzKSk7Ci0KLSAgICAgICAgICAgICAgICBMVkF1ZGlvcmVzYW1wbGVfTG93UXVhbGl0eSgoc2hvcnQqKXBDLT5wUG9zSW5UZW1wQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAoc2hvcnQqKXBDLT5wU3NyY0J1ZmZlckluLAotICAgICAgICAgICAgICAgICAgICBwQy0+aVNzcmNOYlNhbXBsT3V0LAotICAgICAgICAgICAgICAgICAgICBwQy0+cExWQXVkaW9SZXNhbXBsZXIpOwotICAgICAgICAgICAgICAgIGlmKCAwICE9IHNzcmNFcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29udmVydDogU1NSQ19Qcm9jZXNzIHJldHVybnMgMHgleCwgcmV0dXJuaW5nICIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzc3JjRXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNzcmNFcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcEMtPnBQb3NJblRlbXBCdWZmZXIgKz0gcEMtPmlTc3JjTmJTYW1wbE91dCAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgKiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVsczsKLQotICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBTU1JDIGJ1ZmZlckluICovCi0gICAgICAgICAgICAgICAgdGVtcFBvc0J1ZmZlciA9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wU3NyY0J1ZmZlckluICsgKHBDLT5pU3NyY05iU2FtcGxJbiAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgKiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgbWVtbW92ZSgodm9pZCAqKXBDLT5wU3NyY0J1ZmZlckluLCAodm9pZCAqKXRlbXBQb3NCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gLSB0ZW1wUG9zQnVmZmVyKTsKLSAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC09IHBDLT5pU3NyY05iU2FtcGxJbiAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgKiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVsczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdoaWxlKCBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCAtIHBDLT5wU3NyY0J1ZmZlck91dAotICAgICAgICAgICAgICAgIDwgKE00T1NBX0ludDMyKXBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzc3JjRXJyID0gMDsKLSAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwQy0+cFBvc0luU3NyY0J1ZmZlck91dCwwLAotICAgICAgICAgICAgICAgICAgICAocEMtPmlTc3JjTmJTYW1wbE91dCAqIHNpemVvZihzaG9ydCkgKiBwQy0+ZXdjLnVpTmJDaGFubmVscykpOwotCi0gICAgICAgICAgICAgICAgTFZBdWRpb3Jlc2FtcGxlX0xvd1F1YWxpdHkoKHNob3J0KilwQy0+cFBvc0luU3NyY0J1ZmZlck91dCwKLSAgICAgICAgICAgICAgICAgICAgKHNob3J0KilwQy0+cFNzcmNCdWZmZXJJbiwKLSAgICAgICAgICAgICAgICAgICAgcEMtPmlTc3JjTmJTYW1wbE91dCwKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBMVkF1ZGlvUmVzYW1wbGVyKTsKLSAgICAgICAgICAgICAgICBpZiggMCAhPSBzc3JjRXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbnZlcnQ6IFNTUkNfUHJvY2VzcyByZXR1cm5zIDB4JXgsIHJldHVybmluZyAiLAotICAgICAgICAgICAgICAgICAgICAgICAgc3NyY0Vycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzc3JjRXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCArPQotICAgICAgICAgICAgICAgICAgICBwQy0+aVNzcmNOYlNhbXBsT3V0ICogc2l6ZW9mKHNob3J0KSAqIHBDLT5ld2MudWlOYkNoYW5uZWxzOwotCi0gICAgICAgICAgICAgICAgLyogVXBkYXRlIFNTUkMgYnVmZmVySW4gKi8KLSAgICAgICAgICAgICAgICB0ZW1wUG9zQnVmZmVyID0KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBTc3JjQnVmZmVySW4gKyAocEMtPmlTc3JjTmJTYW1wbEluICogc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzKTsKLSAgICAgICAgICAgICAgICBtZW1tb3ZlKCh2b2lkICopcEMtPnBTc3JjQnVmZmVySW4sICh2b2lkICopdGVtcFBvc0J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiAtIHRlbXBQb3NCdWZmZXIpOwotICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gLT0gcEMtPmlTc3JjTmJTYW1wbEluICogc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ29udmVydCBTdGVyZW88LT5Nb25vICovCi0gICAgICAgIHN3aXRjaCggcEMtPkNoYW5uZWxDb252ZXJzaW9uICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAwOiAvKiBObyBjaGFubmVsIGNvbnZlcnNpb24gKi8KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAxOiAvKiBzdGVyZW8gdG8gbW9ubyAqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCAtIHBDLT5wU3NyY0J1ZmZlck91dAotICAgICAgICAgICAgICAgICAgICA8IChNNE9TQV9JbnQzMilwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBGcm9tMmlUb01vbm9fMTYoKHNob3J0ICopcEMtPnBUZW1wQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgKHNob3J0ICopcEMtPnBTc3JjQnVmZmVyT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgKHNob3J0KSh1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMpKTsKLSAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHBUZW1wQnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgIHRlbXBQb3NCdWZmZXIgPSBwQy0+cFRlbXBCdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgKHVpQ2hhbm5lbENvbnZlcnRvck5iU2FtcGxlcyAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgICAgICogcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICB1aU5iQ2hhbm5lbHMpOyAvKiBCdWZmZXIgaXMgaW4gYnl0ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgbWVtbW92ZSgodm9pZCAqKXBDLT5wVGVtcEJ1ZmZlciwgKHZvaWQgKil0ZW1wUG9zQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblRlbXBCdWZmZXIgLSB0ZW1wUG9zQnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblRlbXBCdWZmZXIgLT0KLSAgICAgICAgICAgICAgICAgICAgICAgICh1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ICs9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMjogLyogbW9ubyB0byBzdGVyZW8gKi8KLSAgICAgICAgICAgICAgICBpZiggcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgLSBwQy0+cFNzcmNCdWZmZXJPdXQKLSAgICAgICAgICAgICAgICAgICAgPCAoTTRPU0FfSW50MzIpcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTW9ub1RvMklfMTYoKHNob3J0ICopcEMtPnBUZW1wQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgKHNob3J0ICopcEMtPnBTc3JjQnVmZmVyT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgKHNob3J0KXVpQ2hhbm5lbENvbnZlcnRvck5iU2FtcGxlcyk7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBQb3NCdWZmZXIgPSBwQy0+cFRlbXBCdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgKHVpQ2hhbm5lbENvbnZlcnRvck5iU2FtcGxlcyAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgICAgICogcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzKTsKLSAgICAgICAgICAgICAgICAgICAgbWVtbW92ZSgodm9pZCAqKXBDLT5wVGVtcEJ1ZmZlciwgKHZvaWQgKil0ZW1wUG9zQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblRlbXBCdWZmZXIgLSB0ZW1wUG9zQnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblRlbXBCdWZmZXIgLT0KLSAgICAgICAgICAgICAgICAgICAgICAgICh1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ICs9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiggcEMtPkNoYW5uZWxDb252ZXJzaW9uID4gMCApCi0gICAgewotICAgICAgICAvL000T1NBX1VJbnQzMiB1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgPQotICAgICAgICAvLyBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSAvIHNpemVvZihzaG9ydCkgLwotICAgICAgICAvLyBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzOwotICAgICAgICAvKiBDb252ZXJ0IFN0ZXJlbzwtPk1vbm8gKi8KLSAgICAgICAgc3dpdGNoKCBwQy0+Q2hhbm5lbENvbnZlcnNpb24gKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDA6IC8qIE5vIGNoYW5uZWwgY29udmVyc2lvbiAqLwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDE6IC8qIHN0ZXJlbyB0byBtb25vICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0IC0gcEMtPnBTc3JjQnVmZmVyT3V0Ci0gICAgICAgICAgICAgICAgICAgIDwgKE00T1NBX0ludDMyKXBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEZyb20yaVRvTW9ub18xNigoc2hvcnQgKilwQy0+cFNzcmNCdWZmZXJJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChzaG9ydCAqKXBDLT5wU3NyY0J1ZmZlck91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChzaG9ydCkodWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzKSk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBwVGVtcEJ1ZmZlciAqLwotICAgICAgICAgICAgICAgICAgICB0ZW1wUG9zQnVmZmVyID0gcEMtPnBTc3JjQnVmZmVySW4KLSAgICAgICAgICAgICAgICAgICAgICAgICsgKHVpQ2hhbm5lbENvbnZlcnRvck5iU2FtcGxlcyAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgICAgICogcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICB1aU5iQ2hhbm5lbHMpOyAvKiBCdWZmZXIgaXMgaW4gYnl0ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgbWVtbW92ZSgodm9pZCAqKXBDLT5wU3NyY0J1ZmZlckluLCAodm9pZCAqKXRlbXBQb3NCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC0gdGVtcFBvc0J1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gLT0KLSAgICAgICAgICAgICAgICAgICAgICAgICh1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ICs9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMjogLyogbW9ubyB0byBzdGVyZW8gKi8KLSAgICAgICAgICAgICAgICBpZiggcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgLSBwQy0+cFNzcmNCdWZmZXJPdXQKLSAgICAgICAgICAgICAgICAgICAgPCAoTTRPU0FfSW50MzIpcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTW9ub1RvMklfMTYoKHNob3J0ICopcEMtPnBTc3JjQnVmZmVySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAoc2hvcnQgKilwQy0+cFNzcmNCdWZmZXJPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoc2hvcnQpdWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcFBvc0J1ZmZlciA9IHBDLT5wU3NyY0J1ZmZlckluCi0gICAgICAgICAgICAgICAgICAgICAgICArICh1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgICAgIG1lbW1vdmUoKHZvaWQgKilwQy0+cFNzcmNCdWZmZXJJbiwgKHZvaWQgKil0ZW1wUG9zQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiAtIHRlbXBQb3NCdWZmZXIpOwotICAgICAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC09Ci0gICAgICAgICAgICAgICAgICAgICAgICAodWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzICogc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICAgICAgICAgKiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMpOwotICAgICAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCArPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIE5vIGNoYW5uZWwgY29udmVyc2lvbiBub3Igc2FtcGwuIGZyZXEuIGNvbnZlcnNpb24gbmVlZGVkLCBqdXN0IGJ1ZmZlciBtYW5hZ2VtZW50ICovCi0gICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ID0gcEMtPnBQb3NJblNzcmNCdWZmZXJJbjsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfSW50MzIgTTRWU1MzR1BQX2dldERlY2liZWxTb3VuZCggTTRPU0FfVUludDMyIHZhbHVlICkKLSAgICB7Ci0gICAgaW50IGRiU291bmQgPSAxOwotCi0gICAgaWYoIHZhbHVlID09IDAgKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGlmKCB2YWx1ZSA+IDB4NDAwMCAmJiB2YWx1ZSA8PSAweDgwMDAgKSAgICAgIC8vIDMyNzY4Ci0gICAgICAgIGRiU291bmQgPSA5MDsKLQotICAgIGVsc2UgaWYoIHZhbHVlID4gMHgyMDAwICYmIHZhbHVlIDw9IDB4NDAwMCApIC8vIDE2Mzg0Ci0gICAgICAgIGRiU291bmQgPSA4NDsKLQotICAgIGVsc2UgaWYoIHZhbHVlID4gMHgxMDAwICYmIHZhbHVlIDw9IDB4MjAwMCApIC8vIDgxOTIKLSAgICAgICAgZGJTb3VuZCA9IDc4OwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDA4MDAgJiYgdmFsdWUgPD0gMHgxMDAwICkgLy8gNDAyOAotICAgICAgICBkYlNvdW5kID0gNzI7Ci0KLSAgICBlbHNlIGlmKCB2YWx1ZSA+IDB4MDQwMCAmJiB2YWx1ZSA8PSAweDA4MDAgKSAvLyAyMDQ4Ci0gICAgICAgIGRiU291bmQgPSA2NjsKLQotICAgIGVsc2UgaWYoIHZhbHVlID4gMHgwMjAwICYmIHZhbHVlIDw9IDB4MDQwMCApIC8vIDEwMjQKLSAgICAgICAgZGJTb3VuZCA9IDYwOwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDAxMDAgJiYgdmFsdWUgPD0gMHgwMjAwICkgLy8gNTEyCi0gICAgICAgIGRiU291bmQgPSA1NDsKLQotICAgIGVsc2UgaWYoIHZhbHVlID4gMHgwMDgwICYmIHZhbHVlIDw9IDB4MDEwMCApIC8vIDI1NgotICAgICAgICBkYlNvdW5kID0gNDg7Ci0KLSAgICBlbHNlIGlmKCB2YWx1ZSA+IDB4MDA0MCAmJiB2YWx1ZSA8PSAweDAwODAgKSAvLyAxMjgKLSAgICAgICAgZGJTb3VuZCA9IDQyOwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDAwMjAgJiYgdmFsdWUgPD0gMHgwMDQwICkgLy8gNjQKLSAgICAgICAgZGJTb3VuZCA9IDM2OwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDAwMTAgJiYgdmFsdWUgPD0gMHgwMDIwICkgLy8gMzIKLSAgICAgICAgZGJTb3VuZCA9IDMwOwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDAwMDggJiYgdmFsdWUgPD0gMHgwMDEwICkgLy8xNgotICAgICAgICBkYlNvdW5kID0gMjQ7Ci0KLSAgICBlbHNlIGlmKCB2YWx1ZSA+IDB4MDAwNyAmJiB2YWx1ZSA8PSAweDAwMDggKSAvLzgKLSAgICAgICAgZGJTb3VuZCA9IDI0OwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDAwMDMgJiYgdmFsdWUgPD0gMHgwMDA3ICkgLy8gNAotICAgICAgICBkYlNvdW5kID0gMTg7Ci0KLSAgICBlbHNlIGlmKCB2YWx1ZSA+IDB4MDAwMSAmJiB2YWx1ZSA8PSAweDAwMDMgKSAvLzIKLSAgICAgICAgZGJTb3VuZCA9IDEyOwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDAwMCAmJiB2YWx1ZSA8PSAweDAwMDEgKSAgLy8gMQotICAgICAgICBkYlNvdW5kID0gNjsKLQotICAgIGVsc2UKLSAgICAgICAgZGJTb3VuZCA9IDA7Ci0KLSAgICByZXR1cm4gZGJTb3VuZDsKLSAgICB9Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRG9NaXhpbmcoTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQykKLSAqIEBicmllZiAgICBNaXggdGhlIGN1cnJlbnQgYXVkaW8gQVVzIChkZWNvZGVyLCBtaXgsIGVuY29kZSkKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcEMgICAgKElOKSBWU1MgYXVkaW8gbWl4aW5nIGludGVybmFsIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEb01peGluZygKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX0ludDE2ICpwUENNZGF0YTE7Ci0gICAgTTRPU0FfSW50MTYgKnBQQ01kYXRhMjsKLSAgICBNNE9TQV9VSW50MzIgdWlQQ01zaXplOwotCi0gICAgTTRFTkNPREVSX0F1ZGlvQnVmZmVyIHBFbmNJbkJ1ZmZlcjsgIC8qKjwgRW5jb2RlciBpbnB1dCBidWZmZXIgZm9yIGFwaSAqLwotICAgIE00RU5DT0RFUl9BdWRpb0J1ZmZlciBwRW5jT3V0QnVmZmVyOyAvKio8IEVuY29kZXIgb3V0cHV0IGJ1ZmZlciBmb3IgYXBpICovCi0gICAgTTRPU0FfVGltZQotICAgICAgICBmcmFtZVRpbWVEZWx0YTsgLyoqPCBEdXJhdGlvbiBvZiB0aGUgZW5jb2RlZCAodGhlbiB3cml0dGVuKSBkYXRhICovCi0gICAgTTRPU0FfTWVtQWRkcjggdGVtcFBvc0J1ZmZlcjsKLSAgICAvKiBkdWNraW5nIHZhcmlhYmxlICovCi0gICAgTTRPU0FfVUludDE2IGxvb3BJbmRleCA9IDA7Ci0gICAgTTRPU0FfSW50MTYgKnBQQ00xNlNhbXBsZSA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfSW50MzIgcGVha0RiVmFsdWUgPSAwOwotICAgIE00T1NBX0ludDMyIHByZXZpb3VzRGJWYWx1ZSA9IDA7Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0KLSAgICAvKioKLSAgICAqIERlY29kZSBvcmlnaW5hbCBhdWRpbyB0cmFjayBBVSAqLwotCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZShwQy0+cElucHV0Q2xpcEN0eHQpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0RvTWl4aW5nOlwKLSAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUob3JpZykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0NPUlJVUFRFRF9BVTsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+Yl9TU1JDbmVlZGVkIHx8IHBDLT5DaGFubmVsQ29udmVyc2lvbiA+IDAKLSAgICAgICAgfHwgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICA9PSBNNFZJREVPRURJVElOR19rTVAzICkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbnZlcnQocEMpOwotCi0gICAgICAgIGlmKCBlcnIgPT0gTTRWU1MzR1BQX1dBUl9FTkRfT0ZfQURERURfQVVESU8gKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0RvTWl4aW5nOiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb252ZXJ0IHJldHVybmVkIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9BVURJT19ERUNPREVEX1BDTV9TSVpFX0lTU1VFOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogR2V0IHRoZSBvdXRwdXQgQVUgdG8gd3JpdGUgaW50byAqLwotICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsICZwQy0+ZXdjLldyaXRlckF1ZGlvQVUpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXg6XAotICAgICAgICAgICAgICAgIHBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoYXVkaW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgcFBDTWRhdGEyID0gKE00T1NBX0ludDE2ICopcEMtPnBTc3JjQnVmZmVyT3V0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBEZWNvZGUgYWRkZWQgYXVkaW8gdHJhY2sgQVUgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZShwQy0+cEFkZGVkQ2xpcEN0eHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEb01peGluZzpcCi0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZShhZGRlZCkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5QVVRfQVVESU9fQ09SUlVQVEVEX0FVOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgYm90aCBjbGlwcyBkZWNvZGVkIHRoZSBzYW1lIGFtb3VudCBvZiBQQ00gc2FtcGxlcyAqLwotICAgICAgICBpZiggcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUKLSAgICAgICAgICAgICE9IHBDLT5wQWRkZWRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0RvTWl4aW5nOlwKLSAgICAgICAgICAgICAgICBib3RoIGNsaXBzIEFVIG11c3QgaGF2ZSB0aGUgc2FtZSBkZWNvZGVkIFBDTSBzaXplISIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfQVVESU9fREVDT0RFRF9QQ01fU0laRV9JU1NVRTsKLSAgICAgICAgfQotICAgICAgICBwUENNZGF0YTIgPSAoTTRPU0FfSW50MTYgKilwQy0+cEFkZGVkQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBNaXggdGhlIHR3byBkZWNvZGVkIFBDTSBhdWRpb3MgKi8KLSAgICBwUENNZGF0YTEgPQotICAgICAgICAoTTRPU0FfSW50MTYgKilwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3M7Ci0gICAgdWlQQ01zaXplID0gcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUKLSAgICAgICAgLyAyOyAvKmJ1ZmZlciBzaXplIChieXRlcykgdG8gbnVtYmVyIG9mIHNhbXBsZSAoaW50MTYpKi8KLQotICAgIGlmKCBwQy0+Yl9EdWNraW5nTmVlZGVlZCApCi0gICAgewotICAgICAgICBsb29wSW5kZXggPSAwOwotICAgICAgICBwZWFrRGJWYWx1ZSA9IDA7Ci0gICAgICAgIHByZXZpb3VzRGJWYWx1ZSA9IHBlYWtEYlZhbHVlOwotCi0gICAgICAgIHBQQ00xNlNhbXBsZSA9IChNNE9TQV9JbnQxNiAqKXBDLT5wSW5wdXRDbGlwQ3R4dC0+Ci0gICAgICAgICAgICBBdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzOwotCi0gICAgICAgIC8vQ2FsY3VsYXRlIHRoZSBwZWFrIHZhbHVlCi0gICAgICAgICB3aGlsZSggbG9vcEluZGV4Ci0gICAgICAgICAgICAgPCBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZQotICAgICAgICAgICAgLyBzaXplb2YoTTRPU0FfSW50MTYpICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHBQQ00xNlNhbXBsZVtsb29wSW5kZXhdID49IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBlYWtEYlZhbHVlID0gcHJldmlvdXNEYlZhbHVlID4gcFBDTTE2U2FtcGxlW2xvb3BJbmRleF0KLSAgICAgICAgICAgICAgICA/IHByZXZpb3VzRGJWYWx1ZSA6IHBQQ00xNlNhbXBsZVtsb29wSW5kZXhdOwotICAgICAgICAgICAgICAgIHByZXZpb3VzRGJWYWx1ZSA9IHBlYWtEYlZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBlYWtEYlZhbHVlID0gcHJldmlvdXNEYlZhbHVlID4gLXBQQ00xNlNhbXBsZVtsb29wSW5kZXhdCi0gICAgICAgICAgICAgICAgPyBwcmV2aW91c0RiVmFsdWUgOiAtcFBDTTE2U2FtcGxlW2xvb3BJbmRleF07Ci0gICAgICAgICAgICAgICAgcHJldmlvdXNEYlZhbHVlID0gcGVha0RiVmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsb29wSW5kZXgrKzsKLSAgICAgICAgfQotCi0gICAgICAgIHBDLT5hdWRpb1ZvbHVtZUFycmF5W3BDLT5hdWRWb2xBcnJJbmRleF0gPQotICAgICAgICAgICAgTTRWU1MzR1BQX2dldERlY2liZWxTb3VuZChwZWFrRGJWYWx1ZSk7Ci0KLSAgICAgICAgLyogV0lORE9XX1NJWkUgaXMgMTAgYnkgZGVmYXVsdCBhbmQgY2hlY2sgZm9yIHRocmVzaG9sZCBpcyBkb25lIGFmdGVyIDEwIGN5Y2xlcyAqLwotICAgICAgICBpZiggcEMtPmF1ZFZvbEFyckluZGV4ID49IFdJTkRPV19TSVpFIC0gMSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5iRG9EdWNraW5nID0KLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaXNUaHJlc2hvbGRCcmVhY2hlZCgoTTRPU0FfSW50MzIgKikmKHBDLT5hdWRpb1ZvbHVtZUFycmF5KSwKLSAgICAgICAgICAgICAgICBwQy0+YXVkVm9sQXJySW5kZXgsIHBDLT5JbkR1Y2tpbmdfdGhyZXNob2xkKTsKLQotICAgICAgICAgICAgcEMtPmF1ZFZvbEFyckluZGV4ID0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5hdWRWb2xBcnJJbmRleCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgKkJlbG93IGxvZ2ljIGNvbnRyb2xzIHRoZSBtaXhpbmcgd2VpZ2h0YWdlIGZvciBCYWNrZ3JvdW5kIFRyYWNrIGFuZCBQcmltYXJ5IFRyYWNrCi0gICAgICAgICpmb3IgdGhlIGR1cmF0aW9uIG9mIHdpbmRvdyB1bmRlciBhbmFseXNpcyB0byBnaXZlIGZhZGUtb3V0IGZvciBCYWNrZ3JvdW5kIGFuZCBmYWRlLWluCi0gICAgICAgICpmb3IgcHJpbWFyeQotICAgICAgICAqCi0gICAgICAgICpDdXJyZW50IGZhZGluZyBmYWN0b3IgaXMgZGlzdHJpYnV0ZWQgaW4gZXF1YWwgcmFuZ2Ugb3ZlciB0aGUgZGVmaW5lZCB3aW5kb3cgc2l6ZS4KLSAgICAgICAgKgotICAgICAgICAqRm9yIGEgd2luZG93IHNpemUgPSAyNSAoNTAwIG1zICh3aW5kb3cgdW5kZXIgYW5hbHlzaXMpIC8gMjAgbXMgKHNhbXBsZSBkdXJhdGlvbikpCi0gICAgICAgICoKLSAgICAgICAgKi8KLQotICAgICAgICBpZiggcEMtPmJEb0R1Y2tpbmcgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggcEMtPmR1Y2tpbmdGYWN0b3IKLSAgICAgICAgICAgICAgICA+IHBDLT5JbkR1Y2tpbmdfbG93Vm9sdW1lICkgLy8gRkFERSBPVVQgQkcgVHJhY2sKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZGVjcmVtZW50IGR1Y2tpbmcgZmFjdG9yIGluIHRvdGFsIHN0ZXBzIGluIGZhY3RvciBvZiBsb3cgdm9sdW1lIHN0ZXBzIHRvIHJlYWNoCi0gICAgICAgICAgICAgICAgICAgIC8vIGxvdyB2b2x1bWUgbGV2ZWwKLSAgICAgICAgICAgICAgICBwQy0+ZHVja2luZ0ZhY3RvciAtPSAocEMtPkluRHVja2luZ19sb3dWb2x1bWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDLT5kdWNraW5nRmFjdG9yID0gcEMtPkluRHVja2luZ19sb3dWb2x1bWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggcEMtPmR1Y2tpbmdGYWN0b3IgPCAxLjAgKSAvLyBGQURFIElOIEJHIFRyYWNrCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gaW5jcmVtZW50IGR1Y2tpbmcgZmFjdG9yIGluIHRvdGFsIHN0ZXBzIG9mIGxvdyB2b2x1bWUgZmFjdG9yIHRvIHJlYWNoCi0gICAgICAgICAgICAgICAgLy8gb3JpZy52b2x1bWUgbGV2ZWwKLSAgICAgICAgICAgICAgICBwQy0+ZHVja2luZ0ZhY3RvciArPSAocEMtPkluRHVja2luZ19sb3dWb2x1bWUpOwotICAgICAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+ZHVja2luZ0ZhY3RvciA9IDEuMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKiBlbmRpZiAtIGR1Y2tpbmdfZW5hYmxlICovCi0KLSAgICAgICAgLyogTWl4aW5nIExvZ2ljICovCi0KLSAgICAgICAgd2hpbGUoIHVpUENNc2l6ZS0tID4gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX0ludDMyIHRlbXA7Ci0KLSAgICAgICAgICAgLyogc2V0IHZvbCBmYWN0b3IgZm9yIEJUIGFuZCBQVCAqLwotICAgICAgICAgICAgKnBQQ01kYXRhMiA9IChNNE9TQV9JbnQxNikoKnBQQ01kYXRhMiAqIHBDLT5mQlRWb2xMZXZlbCk7Ci0KLSAgICAgICAgICAgICpwUENNZGF0YTEgPSAoTTRPU0FfSW50MTYpKCpwUENNZGF0YTEgKiBwQy0+ZlBUVm9sTGV2ZWwpOwotCi0gICAgICAgICAgICAvKiBtaXggdGhlIHR3byBzYW1wbGVzICovCi0KLSAgICAgICAgICAgICpwUENNZGF0YTIgPSAoTTRPU0FfSW50MTYpKCggKnBQQ01kYXRhMikgKiAocEMtPmR1Y2tpbmdGYWN0b3IpKTsKLSAgICAgICAgICAgICpwUENNZGF0YTEgPSAoTTRPU0FfSW50MTYpKCpwUENNZGF0YTIgLyAyICsgKnBQQ01kYXRhMSAvIDIpOwotCi0KLSAgICAgICAgICAgIGlmKCAqcFBDTWRhdGExIDwgMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGVtcCA9IC0oICpwUENNZGF0YTEpCi0gICAgICAgICAgICAgICAgICAgICogMjsgLy8gYnJpbmcgdG8gc2FtZSBBbXBsaXR1ZGUgbGV2ZWwgYXMgaXQgd2FzIG9yaWdpbmFsCi0KLSAgICAgICAgICAgICAgICBpZiggdGVtcCA+IDMyNzY3ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICpwUENNZGF0YTEgPSAtMzI3NjY7IC8vIGxlc3MgdGhlbiBtYXggYWxsb3dlZCB2YWx1ZQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAqcFBDTWRhdGExID0gKE00T1NBX0ludDE2KSgtdGVtcCk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0ZW1wID0gKCAqcFBDTWRhdGExKQotICAgICAgICAgICAgICAgICogMjsgLy8gYnJpbmcgdG8gc2FtZSBBbXBsaXR1ZGUgbGV2ZWwgYXMgaXQgd2FzIG9yaWdpbmFsCi0KLSAgICAgICAgICAgIGlmKCB0ZW1wID4gMzI3NjggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwUENNZGF0YTEgPSAzMjc2NzsgLy8gbGVzcyB0aGFuIG1heCBhbGxvd2VkIHZhbHVlCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBQQ01kYXRhMSA9IChNNE9TQV9JbnQxNil0ZW1wOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBQQ01kYXRhMisrOwotICAgICAgICAgICAgcFBDTWRhdGExKys7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgd2hpbGUoIHVpUENNc2l6ZS0tID4gMCApCi0gICAgICAgewotICAgICAgICAvKiBtaXggdGhlIHR3byBzYW1wbGVzICovCi0gICAgICAgICAgICAqcFBDTWRhdGExID0gKE00T1NBX0ludDE2KSgqcFBDTWRhdGExICogcEMtPmZPcmlnRmFjdG9yICogcEMtPmZQVFZvbExldmVsCi0gICAgICAgICAgICAgICArICpwUENNZGF0YTIgKiBwQy0+ZkFkZGVkRmFjdG9yICogcEMtPmZCVFZvbExldmVsICk7Ci0KLSAgICAgICAgICAgIHBQQ01kYXRhMSsrOwotICAgICAgICAgICAgcFBDTWRhdGEyKys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBVcGRhdGUgcEMtPnBTc3JjQnVmZmVyT3V0IGJ1ZmZlciAqLwotCi0gICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJfU1NSQ25lZWRlZCB8fCBwQy0+Q2hhbm5lbENvbnZlcnNpb24gPiAwICkKLSAgICB7Ci0gICAgICAgIHRlbXBQb3NCdWZmZXIgPSBwQy0+cFNzcmNCdWZmZXJPdXQKLSAgICAgICAgICAgICsgcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0gICAgICAgIG1lbW1vdmUoKHZvaWQgKilwQy0+cFNzcmNCdWZmZXJPdXQsICh2b2lkICopdGVtcFBvc0J1ZmZlciwKLSAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0IC0gdGVtcFBvc0J1ZmZlcik7Ci0gICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0IC09Ci0gICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICB9Ci0gICAgZWxzZSBpZiggcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICA9PSBNNFZJREVPRURJVElOR19rTVAzICkKLSAgICB7Ci0gICAgICAgIHRlbXBQb3NCdWZmZXIgPSBwQy0+cFNzcmNCdWZmZXJJbgotICAgICAgICAgICAgKyBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgbWVtbW92ZSgodm9pZCAqKXBDLT5wU3NyY0J1ZmZlckluLCAodm9pZCAqKXRlbXBQb3NCdWZmZXIsCi0gICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC0gdGVtcFBvc0J1ZmZlcik7Ci0gICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gLT0KLSAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplOwotICAgIH0KLQotICAgIC8qIFtNb25vXSBvciBbU3RlcmVvIGludGVybGVhdmVkXSA6IGFsbCBpcyBpbiBvbmUgYnVmZmVyICovCi0gICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclswXSA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzczsKLSAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplOwotICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMV0gPSBNNE9TQV9OVUxMOwotICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzFdID0gMDsKLQotICAgIC8qIFRpbWUgaW4gbXMgZnJvbSBkYXRhIHNpemUsIGJlY2F1c2UgaXQgaXMgUENNMTYgc2FtcGxlcyAqLwotICAgIGZyYW1lVGltZURlbHRhID0KLSAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gLyBzaXplb2Yoc2hvcnQpIC8gcEMtPmV3Yy51aU5iQ2hhbm5lbHM7Ci0KLSAgICAvKioKLSAgICAqIFByZXBhcmUgb3V0cHV0IGJ1ZmZlciAqLwotICAgIHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyWzBdID0KLSAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzczsKLSAgICBwRW5jT3V0QnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gPSAwOwotCi0gICAgTTRPU0FfVFJBQ0UyXzAoIksgKioqKiBibGVuZCBBVXMiKTsKLQotICAgIC8qKgotICAgICogRW5jb2RlIHRoZSBQQ00gYXVkaW8gKi8KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGVwKHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCwKLSAgICAgICAgJnBFbmNJbkJ1ZmZlciwgJnBFbmNPdXRCdWZmZXIpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0RvTWl4aW5nKCk6IHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RlcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFNldCBBVSBjdHMgYW5kIHNpemUgKi8KLSAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSA9Ci0gICAgICAgIHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXTsgLyoqPCBHZXQgdGhlIHNpemUgb2YgZW5jb2RlZCBkYXRhICovCi0gICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyArPSBmcmFtZVRpbWVEZWx0YTsKLQotICAgIC8qKgotICAgICogV3JpdGUgdGhlIEFVICovCi0gICAgTTRPU0FfVFJBQ0UyXzIoIkwgLS0tLSB3cml0ZSA6IGN0cyAgPSAlbGQgWyAweCV4IF0iLAotICAgICAgICAoTTRPU0FfSW50MzIpKHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5DVFMgLyBwQy0+ZXdjLnNjYWxlX2F1ZGlvKSwKLSAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUpOwotCi0gICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVShwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwgJnBDLT5ld2MuV3JpdGVyQXVkaW9BVSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRG9NaXhpbmc6IHBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJbmNyZW1lbnQgdGhlIGF1ZGlvIENUUyBmb3IgdGhlIG5leHQgc3RlcCAqLwotICAgIHBDLT5ld2MuZEFUbyArPSBmcmFtZVRpbWVEZWx0YSAvIHBDLT5ld2Muc2NhbGVfYXVkaW87Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0RvTWl4aW5nKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdUcmFuc2l0aW9uKE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMpCi0gKiBAYnJpZWYgICAgRGVjb2RlL2VuY29kZSBhIGZldyBBVSBiYWNrd2FyZCB0byBpbml0aWF0ZSB0aGUgZW5jb2RlciBmb3IgbGF0ZXIgTWl4IHNlZ21lbnQuCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDICAgIChJTikgVlNTIGF1ZGlvIG1peGluZyBpbnRlcm5hbCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nVHJhbnNpdGlvbigKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRFTkNPREVSX0F1ZGlvQnVmZmVyIHBFbmNJbkJ1ZmZlcjsgIC8qKjwgRW5jb2RlciBpbnB1dCBidWZmZXIgZm9yIGFwaSAqLwotICAgIE00RU5DT0RFUl9BdWRpb0J1ZmZlciBwRW5jT3V0QnVmZmVyOyAvKio8IEVuY29kZXIgb3V0cHV0IGJ1ZmZlciBmb3IgYXBpICovCi0gICAgTTRPU0FfVGltZQotICAgICAgICBmcmFtZVRpbWVEZWx0YSA9IDA7IC8qKjwgRHVyYXRpb24gb2YgdGhlIGVuY29kZWQgKHRoZW4gd3JpdHRlbikgZGF0YSAqLwotCi0gICAgTTRPU0FfSW50MzIgaVRhcmdldEN0cywgaUN1cnJlbnRDdHM7Ci0KLSAgICAvKioKLSAgICAqICdCWlpaJyBidWcgZml4OgotICAgICogYWRkIGEgc2lsZW5jZSBmcmFtZSAqLwotICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1dyaXRlU2lsZW5jZShwQyk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nVHJhbnNpdGlvbigpOlwKLSAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1dyaXRlU2lsZW5jZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpQ3VycmVudEN0cyA9IChNNE9TQV9JbnQzMikocEMtPmV3Yy5kQVRvICogcEMtPmV3Yy5zY2FsZV9hdWRpbyArIDAuNSk7Ci0KLSAgICAvKiBEbyBub3QgZG8gcHJlLWVuY29kZSBzdGVwIGlmIHRoZXJlIGlzIG5vIG1peGluZyAocmVtb3ZlLCAxMDAgJSwgb3Igbm90IGVkaXRhYmxlKSAqLwotICAgIGlmKCBNNE9TQV9GQUxTRSA9PSBwQy0+YkF1ZGlvTWl4aW5nSXNOZWVkZWQgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQWR2YW5jZSBpbiB0aGUgb3JpZ2luYWwgYXVkaW8gc3RyZWFtIHRvIHJlYWNoIHRoZSBjdXJyZW50IHRpbWUKLSAgICAgICAgKiAoV2UgZG9uJ3Qgd2FudCBpQXVkaW9DVFMgdG8gYmUgbW9kaWZpZWQgYnkgdGhlIGp1bXAgZnVuY3Rpb24sCi0gICAgICAgICogc28gd2UgaGF2ZSB0byB1c2UgYSBsb2NhbCB2YXJpYWJsZSkuICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQocEMtPnBJbnB1dENsaXBDdHh0LCAmaUN1cnJlbnRDdHMpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdUcmFuc2l0aW9uOlwKLSAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcEp1bXBBdWRpb0F0KCkgcmV0dXJucyAweCV4ISIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKjwgZG9uJ3QgdHJ5IHRvIHByZS1kZWNvZGUgaWYgY2xpcCBpcyBhdCBpdHMgYmVnaW5uaW5nLi4uICovCi0gICAgICAgIGlmKCBpQ3VycmVudEN0cyA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogR2V0IHRoZSBvdXRwdXQgQVUgdG8gd3JpdGUgaW50byAqLwotICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwgTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsCi0gICAgICAgICAgICAgICAgJnBDLT5ld2MuV3JpdGVyQXVkaW9BVSk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdUcmFuc2l0aW9uOlwKLSAgICAgICAgICAgICAgICAgICAgcFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShhdWRpbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEp1bXAgYSBmZXcgQVVzIGJhY2t3YXJkICovCi0gICAgICAgICAgICBpVGFyZ2V0Q3RzID0gaUN1cnJlbnRDdHMgLSBNNFZTUzNHUFBfTkJfQVVfUFJFRkVUQ0gKLSAgICAgICAgICAgICAgICAqIHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uOwotCi0gICAgICAgICAgICBpZiggaVRhcmdldEN0cyA8IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlUYXJnZXRDdHMgPSAwOyAvKio8IFNhbml0eSBjaGVjayAqLwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcEp1bXBBdWRpb0F0KHBDLT5wSW5wdXRDbGlwQ3R4dCwgJmlUYXJnZXRDdHMpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nVHJhbnNpdGlvbjogREVDT0RFX0VOQ09ERS1wcmVmZXRjaDpcCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIERlY29kZS9lbmNvZGUgdXAgdG8gdGhlIHdhbnRlZCBwb3NpdGlvbiAqLwotICAgICAgICAgICAgd2hpbGUoIHBDLT5wSW5wdXRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgPCBpQ3VycmVudEN0cyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocEMtPnBJbnB1dENsaXBDdHh0KTsKLQotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8zKCJNIC4uLi4gcmVhZCAgOiBjdHMgID0gJS4wZiArICUuMGYgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzCi0gICAgICAgICAgICAgICAgICAgIC8gcEMtPnBJbnB1dENsaXBDdHh0LT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5pQW9mZnNldAotICAgICAgICAgICAgICAgICAgICAvIHBDLT5wSW5wdXRDbGlwQ3R4dC0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nVHJhbnNpdGlvbjogREVDT0RFX0VOQ09ERS1wcmVmZXRjaDpcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShiKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZSgKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0KTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdUcmFuc2l0aW9uOiBERUNPREVfRU5DT0RFLXByZWZldGNoOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIFtNb25vXSBvciBbU3RlcmVvIGludGVybGVhdmVkXSA6IGFsbCBpcyBpbiBvbmUgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclswXSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzczsKLSAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplOwotICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMV0gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzFdID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIFRpbWUgaW4gbXMgZnJvbSBkYXRhIHNpemUsIGJlY2F1c2UgaXQgaXMgUENNMTYgc2FtcGxlcyAqLwotICAgICAgICAgICAgICAgIGZyYW1lVGltZURlbHRhID0KLSAgICAgICAgICAgICAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gLyBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgICAgIC8gcEMtPmV3Yy51aU5iQ2hhbm5lbHM7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFByZXBhcmUgb3V0cHV0IGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyWzBdID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzczsKLSAgICAgICAgICAgICAgICBwRW5jT3V0QnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gPSAwOwotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIk4gKioqKiBwcmUtZW5jb2RlIik7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEVuY29kZSB0aGUgUENNIGF1ZGlvICovCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RlcCgKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wQXVkaW9FbmNDdHh0LCAmcEVuY0luQnVmZmVyLCAmcEVuY091dEJ1ZmZlcik7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nVHJhbnNpdGlvbigpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RlcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBTZXQgQVUgY3RzIGFuZCBzaXplICovCi0gICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSA9IHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVsKLSAgICAgICAgICAgICAgICAwXTsgLyoqPCBHZXQgdGhlIHNpemUgb2YgZW5jb2RlZCBkYXRhICovCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyArPSBmcmFtZVRpbWVEZWx0YTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogV3JpdGUgdGhlIEFVICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzIoIk8gLS0tLSB3cml0ZSA6IGN0cyAgPSAlbGQgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5DVFMgLyBwQy0+ZXdjLnNjYWxlX2F1ZGlvKSwKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUpOwotCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVSgKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwgTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsCi0gICAgICAgICAgICAgICAgICAgICZwQy0+ZXdjLldyaXRlckF1ZGlvQVUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1RyYW5zaXRpb246XAotICAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVIHJldHVybnMgMHgleCEiLCAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogSW5jcmVtZW50IHRoZSBhdWRpbyBDVFMgZm9yIHRoZSBuZXh0IHN0ZXAgKi8KLSAgICAgICAgICAgICAgICBwQy0+ZXdjLmRBVG8gKz0gcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gLyBwQy0+ZXdjLnNjYWxlX2F1ZGlvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NyZWF0ZVZpZGVvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgQ3JlYXRlcyB0aGUgdmlkZW8gZW5jb2RlcgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDcmVhdGVWaWRlb0VuY29kZXIoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNEVOQ09ERVJfQWR2YW5jZWRQYXJhbXMgRW5jUGFyYW1zOwotCi0gICAgLyoqCi0gICAgKiBTaW11bGF0ZSBhIHdyaXRlciBpbnRlcmZhY2Ugd2l0aCBvdXIgc3BlY2lmaWMgZnVuY3Rpb24gKi8KLSAgICBwQy0+ZXdjLk91cldyaXRlckRhdGFJbnRlcmZhY2UucFByb2Nlc3NBVSA9Ci0gICAgICAgIE00VlNTM0dQUF9pbnRQcm9jZXNzQVU7IC8qKjwgVGhpcyBmdW5jdGlvbiBpcyBWU1MgM0dQUCBzcGVjaWZpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IGl0IGZvbGxvdyB0aGUgd3JpdGVyIGludGVyZmFjZSAqLwotICAgIHBDLT5ld2MuT3VyV3JpdGVyRGF0YUludGVyZmFjZS5wU3RhcnRBVSA9Ci0gICAgICAgIE00VlNTM0dQUF9pbnRTdGFydEFVOyAvKio8IFRoaXMgZnVuY3Rpb24gaXMgVlNTIDNHUFAgc3BlY2lmaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXQgaXQgZm9sbG93IHRoZSB3cml0ZXIgaW50ZXJmYWNlICovCi0gICAgcEMtPmV3Yy5PdXJXcml0ZXJEYXRhSW50ZXJmYWNlLnBXcml0ZXJDb250ZXh0ID0KLSAgICAgICAgKE00V1JJVEVSX0NvbnRleHQpCi0gICAgICAgIHBDOyAvKio8IFdlIGdpdmUgdGhlIGludGVybmFsIGNvbnRleHQgYXMgd3JpdGVyIGNvbnRleHQgKi8KLQotICAgIC8qKgotICAgICogR2V0IHRoZSBlbmNvZGVyIGludGVyZmFjZSwgaWYgbm90IGFscmVhZHkgZG9uZSAqLwotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cyApCi0gICAgewotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfc2V0Q3VycmVudFZpZGVvRW5jb2RlcigmcEMtPlNoZWxsQVBJLAotICAgICAgICAgICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUpOwotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDcmVhdGVWaWRlb0VuY29kZXI6IHNldEN1cnJlbnRFbmNvZGVyIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFNldCBlbmNvZGVyIHNoZWxsIHBhcmFtZXRlcnMgYWNjb3JkaW5nIHRvIFZTUyBzZXR0aW5ncyAqLwotCi0gICAgLyogQ29tbW9uIHBhcmFtZXRlcnMgKi8KLSAgICBFbmNQYXJhbXMuSW5wdXRGb3JtYXQgPSBNNEVOQ09ERVJfa0lZVVY0MjA7Ci0gICAgRW5jUGFyYW1zLkZyYW1lV2lkdGggPSBwQy0+ZXdjLnVpVmlkZW9XaWR0aDsKLSAgICBFbmNQYXJhbXMuRnJhbWVIZWlnaHQgPSBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQ7Ci0gICAgRW5jUGFyYW1zLnVpVGltZVNjYWxlID0gcEMtPmV3Yy51aVZpZGVvVGltZVNjYWxlOwotICAgIEVuY1BhcmFtcy52aWRlb1Byb2ZpbGUgPSBwQy0+ZXdjLm91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICBFbmNQYXJhbXMudmlkZW9MZXZlbCA9IHBDLT5ld2Mub3V0cHV0VmlkZW9MZXZlbDsKLQotICAgIC8qIE5vIHN0cmljdCByZWd1bGF0aW9uIGluIHZpZGVvIGVkaXRvciAqLwotICAgIC8qIEJlY2F1c2Ugb2YgdGhlIGVmZmVjdHMgYW5kIHRyYW5zaXRpb25zIHdlIHNob3VsZCBhbGxvdyBtb3JlIGZsZXhpYmlsaXR5ICovCi0gICAgLyogQWxzbyBpdCBwcmV2ZW50cyB0byBkcm9wIGltcG9ydGFudCBmcmFtZXMKLSAgICAgICh3aXRoIGEgYmFkIHJlc3VsdCBvbiBzaGVkdWxpbmcgYW5kIGJsb2NrIGVmZmV0Y3MpICovCi0gICAgRW5jUGFyYW1zLmJJbnRlcm5hbFJlZ3VsYXRpb24gPSBNNE9TQV9GQUxTRTsKLSAgICBFbmNQYXJhbXMuRnJhbWVSYXRlID0gTTRFTkNPREVSX2tWQVJJQUJMRV9GUFM7Ci0KLSAgICAvKioKLSAgICAqIE90aGVyIGVuY29kZXIgc2V0dGluZ3MgKGRlZmF1bHRzKSAqLwotICAgIEVuY1BhcmFtcy51aUhvcml6b250YWxTZWFyY2hSYW5nZSA9IDA7ICAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgIEVuY1BhcmFtcy51aVZlcnRpY2FsU2VhcmNoUmFuZ2UgPSAwOyAgICAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgIEVuY1BhcmFtcy5iRXJyb3JSZXNpbGllbmNlID0gTTRPU0FfRkFMU0U7ICAvKiBubyBlcnJvciByZXNpbGllbmNlICovCi0gICAgRW5jUGFyYW1zLnVpSVZvcFBlcmlvZCA9IDA7ICAgICAgICAgICAgICAgIC8qIHVzZSBkZWZhdWx0ICovCi0gICAgRW5jUGFyYW1zLnVpTW90aW9uRXN0aW1hdGlvblRvb2xzID0gMDsgICAgIC8qIE00Vl9NT1RJT05fRVNUX1RPT0xTX0FMTCAqLwotICAgIEVuY1BhcmFtcy5iQWNQcmVkaWN0aW9uID0gTTRPU0FfVFJVRTsgICAgICAvKiB1c2UgQUMgcHJlZGljdGlvbiAqLwotICAgIEVuY1BhcmFtcy51aVN0YXJ0aW5nUXVhbnRpemVyVmFsdWUgPSAxMDsgICAvKiBpbml0aWFsIFFQID0gMTAgKi8KLSAgICBFbmNQYXJhbXMuYkRhdGFQYXJ0aXRpb25pbmcgPSBNNE9TQV9GQUxTRTsgLyogbm8gZGF0YSBwYXJ0aXRpb25pbmcgKi8KLQotICAgIHN3aXRjaCggcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFNZU19rSDI2MzoKLQotICAgICAgICAgICAgRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rSDI2MzsKLQotICAgICAgICAgICAgRW5jUGFyYW1zLnVpU3RhcnRpbmdRdWFudGl6ZXJWYWx1ZSA9IDEwOwotICAgICAgICAgICAgRW5jUGFyYW1zLnVpUmF0ZUZhY3RvciA9IDE7IC8qIGRlZmF1bHQgKi8KLQotICAgICAgICAgICAgRW5jUGFyYW1zLmJFcnJvclJlc2lsaWVuY2UgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5iRGF0YVBhcnRpdGlvbmluZyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFNZU19rTVBFR180OgotCi0gICAgICAgICAgICBFbmNQYXJhbXMuRm9ybWF0ID0gTTRFTkNPREVSX2tNUEVHNDsKLQotICAgICAgICAgICAgRW5jUGFyYW1zLnVpU3RhcnRpbmdRdWFudGl6ZXJWYWx1ZSA9IDg7Ci0gICAgICAgICAgICBFbmNQYXJhbXMudWlSYXRlRmFjdG9yID0gMTsKLQotICAgICAgICAgICAgaWYoIE00T1NBX0ZBTFNFID09IHBDLT5ld2MuYlZpZGVvRGF0YVBhcnRpdGlvbmluZyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRW5jUGFyYW1zLmJFcnJvclJlc2lsaWVuY2UgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICBFbmNQYXJhbXMuYkRhdGFQYXJ0aXRpb25pbmcgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFbmNQYXJhbXMuYkVycm9yUmVzaWxpZW5jZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgRW5jUGFyYW1zLmJEYXRhUGFydGl0aW9uaW5nID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRTWVNfa0gyNjQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyOiBNNFNZU19IMjY0Iik7Ci0KLSAgICAgICAgICAgIEVuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0gyNjQ7Ci0KLSAgICAgICAgICAgIEVuY1BhcmFtcy51aVN0YXJ0aW5nUXVhbnRpemVyVmFsdWUgPSAxMDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy51aVJhdGVGYWN0b3IgPSAxOyAvKiBkZWZhdWx0ICovCi0KLSAgICAgICAgICAgIEVuY1BhcmFtcy5iRXJyb3JSZXNpbGllbmNlID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICBFbmNQYXJhbXMuYkRhdGFQYXJ0aXRpb25pbmcgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyOiBVbmtub3duIHZpZGVvU3RyZWFtVHlwZSAweCV4IiwKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX1ZJREVPX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICBFbmNQYXJhbXMuQml0cmF0ZSA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZTsKLQotICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyOiBjYWxsaW5nIGVuY29kZXIgcEZjdEluaXQiKTsKLSAgICAvKioKLSAgICAqIEluaXQgdGhlIHZpZGVvIGVuY29kZXIgKGFkdmFuY2VkIHNldHRpbmdzIHZlcnNpb24gb2YgdGhlIGVuY29kZXIgT3BlbiBmdW5jdGlvbikgKi8KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RJbml0KCZwQy0+ZXdjLnBFbmNDb250ZXh0LAotICAgICAgICAmcEMtPmV3Yy5PdXJXcml0ZXJEYXRhSW50ZXJmYWNlLCBNNFZTUzNHUFBfaW50VlBQLCBwQywKLSAgICAgICAgcEMtPlNoZWxsQVBJLnBDdXJyZW50VmlkZW9FbmNvZGVyRXh0ZXJuYWxBUEksCi0gICAgICAgIHBDLT5TaGVsbEFQSS5wQ3VycmVudFZpZGVvRW5jb2RlclVzZXJEYXRhKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDcmVhdGVWaWRlb0VuY29kZXI6XAotICAgICAgICAgICAgcFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RJbml0IHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHBDLT5ld2MuZW5jb2RlclN0YXRlID0gTTRWU1MzR1BQX2tFbmNvZGVyQ2xvc2VkOwotICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyOiBjYWxsaW5nIGVuY29kZXIgcEZjdE9wZW4iKTsKLSAgICBNNE9TQV9UUkFDRTFfMigidnNzOiBhdWRpbyBtaXggZW5jb2RlciBvcGVuIHByb2ZpbGUgOiVkLCBsZXZlbCAlZCIsCi0gICAgICAgIEVuY1BhcmFtcy52aWRlb1Byb2ZpbGUsIEVuY1BhcmFtcy52aWRlb0xldmVsKTsKLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RPcGVuKHBDLT5ld2MucEVuY0NvbnRleHQsCi0gICAgICAgICZwQy0+ZXdjLldyaXRlclZpZGVvQVUsICZFbmNQYXJhbXMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NyZWF0ZVZpZGVvRW5jb2RlcjpcCi0gICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdE9wZW4gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcEMtPmV3Yy5lbmNvZGVyU3RhdGUgPSBNNFZTUzNHUFBfa0VuY29kZXJTdG9wcGVkOwotICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyOiBjYWxsaW5nIGVuY29kZXIgcEZjdFN0YXJ0Iik7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGFydCApCi0gICAgewotICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGFydCgKLSAgICAgICAgICAgIHBDLT5ld2MucEVuY0NvbnRleHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDcmVhdGVWaWRlb0VuY29kZXI6XAotICAgICAgICAgICAgICAgIHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RhcnQgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHBDLT5ld2MuZW5jb2RlclN0YXRlID0gTTRWU1MzR1BQX2tFbmNvZGVyUnVubmluZzsKLQotICAgIC8qKgotICAgICogICAgUmV0dXJuICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDcmVhdGVWaWRlb0VuY29kZXI6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0Rlc3Ryb3lWaWRlb0VuY29kZXIoKQotICogQGJyaWVmICAgIERlc3Ryb3kgdGhlIHZpZGVvIGVuY29kZXIKLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRGVzdHJveVZpZGVvRW5jb2RlcigKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5ld2MucEVuY0NvbnRleHQgKQotICAgIHsKLSAgICAgICAgaWYoIE00VlNTM0dQUF9rRW5jb2RlclJ1bm5pbmcgPT0gcEMtPmV3Yy5lbmNvZGVyU3RhdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggcEMtPlNoZWxsQVBJLnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RvcCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdG9wKAotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBFbmNDb250ZXh0KTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEZXN0cm95VmlkZW9FbmNvZGVyOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RvcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBDLT5ld2MuZW5jb2RlclN0YXRlID0gTTRWU1MzR1BQX2tFbmNvZGVyU3RvcHBlZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEhhcyB0aGUgZW5jb2RlciBhY3R1YWxseSBiZWVuIG9wZW5lZD8gRG9uJ3QgY2xvc2UgaXQgaWYgdGhhdCdzIG5vdCB0aGUgY2FzZS4gKi8KLSAgICAgICAgaWYoIE00VlNTM0dQUF9rRW5jb2RlclN0b3BwZWQgPT0gcEMtPmV3Yy5lbmNvZGVyU3RhdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbG9zZSgKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLnBFbmNDb250ZXh0KTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0Rlc3Ryb3lWaWRlb0VuY29kZXI6XAotICAgICAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBDLT5ld2MuZW5jb2RlclN0YXRlID0gTTRWU1MzR1BQX2tFbmNvZGVyQ2xvc2VkOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xlYW51cCgKLSAgICAgICAgICAgIHBDLT5ld2MucEVuY0NvbnRleHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEZXN0cm95VmlkZW9FbmNvZGVyOlwKLSAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsZWFudXAgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgV2UgZG8gbm90IHJldHVybiB0aGUgZXJyb3IgaGVyZSBiZWNhdXNlIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgcEMtPmV3Yy5lbmNvZGVyU3RhdGUgPSBNNFZTUzNHUFBfa05vRW5jb2RlcjsKLSAgICAgICAgLyoqCi0gICAgICAgICogUmVzZXQgdmFyaWFibGUgKi8KLSAgICAgICAgcEMtPmV3Yy5wRW5jQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEZXN0cm95VmlkZW9FbmNvZGVyOiByZXR1cm5pbmcgMHgleCIsIGVycik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfQm9vbCBNNFZTUzNHUFBfaXNUaHJlc2hvbGRCcmVhY2hlZCggTTRPU0FfSW50MzIgKmF2ZXJhZ2VWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgc3RvcmVDb3VudCwgTTRPU0FfSW50MzIgdGhyZXNob2xkVmFsdWUgKQotewotICAgIE00T1NBX0Jvb2wgcmVzdWx0ID0gMDsKLSAgICBpbnQgaTsKLSAgICBpbnQgZmluYWxWYWx1ZSA9IDA7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IHN0b3JlQ291bnQ7IGkrKyApCi0gICAgICAgIGZpbmFsVmFsdWUgKz0gYXZlcmFnZVZhbHVlW2ldOwotCi0gICAgZmluYWxWYWx1ZSA9IGZpbmFsVmFsdWUgLyBzdG9yZUNvdW50OwotCi0KLSAgICBpZiggZmluYWxWYWx1ZSA+IHRocmVzaG9sZFZhbHVlICkKLSAgICAgICAgcmVzdWx0ID0gTTRPU0FfVFJVRTsKLSAgICBlbHNlCi0gICAgICAgIHJlc3VsdCA9IE00T1NBX0ZBTFNFOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0NsaXAuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0NsaXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDA2MTJmMy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9DbGlwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFZTUzNHUFBfQ2xpcC5jCi0gKiBAYnJpZWYgICAgSW1wbGVtZW50YXRpb24gb2YgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gaW5wdXQgY2xpcCBtYW5hZ2VtZW50LgotICogQG5vdGUgICAgQWxsIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUgYXJlIHN0YXRpYywgaS5lLiBub24gcHVibGljCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotLyoqKioqKioqKioqKioqKiovCi0vKioqIEluY2x1ZGVzICoqKi8KLS8qKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotLyoqCi0gKiAgICBPdXIgaGVhZGVycyAqLwotI2luY2x1ZGUgIk00VlNTM0dQUF9BUEkuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfRXJyb3JDb2Rlcy5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbFR5cGVzLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsRnVuY3Rpb25zLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsQ29uZmlnLmgiCi0KLS8qKgotICogICAgT1NBTCBoZWFkZXJzICovCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiIC8qIE9TQUwgbWVtb3J5IG1hbmFnZW1lbnQgKi8KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIiAgLyogT1NBTCBkZWJ1ZyBtYW5hZ2VtZW50ICovCi0KLQotLyoqCi0gKiBDb21tb24gaGVhZGVycyAoZm9yIGFhYykgKi8KLSNpbmNsdWRlICJNNF9Db21tb24uaCIKLQotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotI2luY2x1ZGUgIk00VkRfRVhURVJOQUxfSW50ZXJmYWNlLmgiCi0KLSNlbmRpZiAvKiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMgKi8KLQotLyogT3NhbCBoZWFkZXIgZmlsZW5vICovCi0jaW5jbHVkZSAiTTRPU0FfQ2hhclN0YXIuaCIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBkZWZpbmUgICAgU3RhdGljIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwUHJlcGFyZUF1ZGlvRGVjb2RlcigKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCApOwotCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDaGVja0FuZEdldENvZGVjQWFjUHJvcGVydGllcygKLSAgICAgICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKQotICogQGJyaWVmICAgIE9wZW4gYSBjbGlwLiBDcmVhdGVzIGEgY2xpcCBjb250ZXh0LgotICogQG5vdGUKLSAqIEBwYXJhbSAgIGhDbGlwQ3R4dCAgICAgICAgICAgIChPVVQpIFJldHVybiB0aGUgaW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcGFyYW0gICBwQ2xpcFNldHRpbmdzICAgICAgICAoSU4pIEVkaXQgc2V0dGluZ3Mgb2YgdGhpcyBjbGlwLiBUaGUgbW9kdWxlIHdpbGwga2VlcCBhCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2UgdG8gdGhpcyBwb2ludGVyCi0gKiBAcGFyYW0gICAgcEZpbGVSZWFkUHRyRmN0ICAgICAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHJlYWRlciBmdW5jdGlvbnMKLSAqIEBwYXJhbSAgICBiU2tpcEF1ZGlvVHJhY2sgICAgICAgIChJTikgSWYgdHJ1ZSwgZG8gbm90IG9wZW4gdGhlIGF1ZGlvCi0gKiBAcGFyYW0gICAgYkZhc3RPcGVuTW9kZSAgICAgICAgKElOKSBJZiB0cnVlLCB1c2UgdGhlIGZhc3QgbW9kZSBvZiB0aGUgM2dwcCByZWFkZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25seSB0aGUgZmlyc3QgQVUgaXMgcmVhZCkKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwSW5pdCggTTRWU1MzR1BQX0NsaXBDb250ZXh0ICoqIGhDbGlwQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyICpwRmlsZVJlYWRQdHJGY3QgKQotewotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gaENsaXBDdHh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBJbml0OiBoQ2xpcEN0eHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwRmlsZVJlYWRQdHJGY3QpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcEluaXQ6IHBGaWxlUmVhZFB0ckZjdCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKioKLSAgICAqIEFsbG9jYXRlIHRoZSBjbGlwIGNvbnRleHQgKi8KLSAgICAqaENsaXBDdHh0ID0KLSAgICAgICAgKE00VlNTM0dQUF9DbGlwQ29udGV4dCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRWU1MzR1BQX0NsaXBDb250ZXh0KSwKLSAgICAgICAgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJNNFZTUzNHUFBfQ2xpcENvbnRleHQiKTsKLQotICAgIGlmKCBNNE9TQV9OVUxMID09ICpoQ2xpcEN0eHQgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBJbml0KCk6IHVuYWJsZSB0byBhbGxvY2F0ZSBNNFZTUzNHUFBfQ2xpcENvbnRleHQsXAotICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9pbnRDbGlwSW5pdCgpOiBjbGlwQ3R4dD0weCV4IiwgKmhDbGlwQ3R4dCk7Ci0KLQotICAgIC8qKgotICAgICogVXNlIHRoaXMgc2hvcnRjdXQgdG8gc2ltcGxpZnkgdGhlIGNvZGUgKi8KLSAgICBwQ2xpcEN0eHQgPSAqaENsaXBDdHh0OwotCi0gICAgLyogSW5pYWxpemF0aW9uIG9mIGNvbnRleHQgVmFyaWFibGVzICovCi0gICAgbWVtc2V0KCh2b2lkICopcENsaXBDdHh0LCAwLHNpemVvZihNNFZTUzNHUFBfQ2xpcENvbnRleHQpKTsKLQotICAgIHBDbGlwQ3R4dC0+cFNldHRpbmdzID0gTTRPU0FfTlVMTDsKLQotICAgIC8qKgotICAgICogSW5pdCB0aGUgY2xpcCBjb250ZXh0ICovCi0gICAgcENsaXBDdHh0LT5pVm9mZnNldCA9IDA7Ci0gICAgcENsaXBDdHh0LT5pQW9mZnNldCA9IDA7Ci0gICAgcENsaXBDdHh0LT5Wc3RhdHVzID0gTTRWU1MzR1BQX2tDbGlwU3RhdHVzX1JFQUQ7Ci0gICAgcENsaXBDdHh0LT5Bc3RhdHVzID0gTTRWU1MzR1BQX2tDbGlwU3RhdHVzX1JFQUQ7Ci0KLSAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbSA9IE00T1NBX05VTEw7Ci0gICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0gPSBNNE9TQV9OVUxMOwotICAgIHBDbGlwQ3R4dC0+VmlkZW9BVS5tX2RhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICBwQ2xpcEN0eHQtPkF1ZGlvQVUubV9kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0KLSAgICBwQ2xpcEN0eHQtPnBWaURlY0N0eHQgPSBNNE9TQV9OVUxMOwotICAgIHBDbGlwQ3R4dC0+aVZpZGVvRGVjQ3RzID0gMDsKLSAgICBwQ2xpcEN0eHQtPmlWaWRlb1JlbmRlckN0cyA9IDA7Ci0gICAgcENsaXBDdHh0LT5sYXN0RGVjb2RlZFBsYW5lID0gTTRPU0FfTlVMTDsKLSAgICBwQ2xpcEN0eHQtPmlBY3R1YWxWaWRlb0JlZ2luQ3V0ID0gMDsKLSAgICBwQ2xpcEN0eHQtPmlBY3R1YWxBdWRpb0JlZ2luQ3V0ID0gMDsKLSAgICBwQ2xpcEN0eHQtPmJWaWRlb0F1QXZhaWxhYmxlID0gTTRPU0FfRkFMU0U7Ci0gICAgcENsaXBDdHh0LT5iRmlyc3RBdVdyaXR0ZW4gPSBNNE9TQV9GQUxTRTsKLQotICAgIHBDbGlwQ3R4dC0+Yk1wZWc0R292U3RhdGUgPSBNNE9TQV9GQUxTRTsKLQotICAgIHBDbGlwQ3R4dC0+YkF1ZGlvRnJhbWVBdmFpbGFibGUgPSBNNE9TQV9GQUxTRTsKLSAgICBwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyID0gTTRPU0FfTlVMTDsKLSAgICBwQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzID0gMDsKLSAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQgPSAwOwotICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplID0gMDsKLSAgICBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotCi0gICAgcENsaXBDdHh0LT5wRmlsZVJlYWRQdHJGY3QgPSBwRmlsZVJlYWRQdHJGY3Q7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXYgICA9IE00T1NBX05VTEw7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0ID0gTTRPU0FfTlVMTDsKLSAgICBwQ2xpcEN0eHQtPm1fcFByZVJlc2l6ZUZyYW1lID0gTTRPU0FfTlVMTDsKLSAgICBwQ2xpcEN0eHQtPmJHZXRZdXZEYXRhRnJvbURlY29kZXIgPSBNNE9TQV9UUlVFOwotCi0gICAgLyoKLSAgICAqIFJlc2V0IHBvaW50ZXJzIGZvciBtZWRpYSBhbmQgY29kZWNzIGludGVyZmFjZXMgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfY2xlYXJJbnRlcmZhY2VUYWJsZXMoJnBDbGlwQ3R4dC0+U2hlbGxBUEkpOwotICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgLyoKLSAgICAqICBDYWxsIHRoZSBtZWRpYSBhbmQgY29kZWNzIHN1YnNjcmlwdGlvbiBtb2R1bGUgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYygmcENsaXBDdHh0LT5TaGVsbEFQSSk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLy8gVGhpcyBtZXRob2QgbWFwcyB0aGUgZnJlcXVlbmN5IHZhbHVlIHRvIGEgc3RyaW5nLgotc3RhdGljIGNvbnN0IGNoYXIqIGZyZXFUb1N0cmluZyhpbnQgZnJlcSkgewotICAgIHN3aXRjaCAoZnJlcSkgewotICAgIGNhc2UgODAwMDoKLSAgICAgICAgcmV0dXJuICJfODAwMCI7Ci0gICAgY2FzZSAxMTAyNToKLSAgICAgICAgcmV0dXJuICJfMTEwMjUiOwotICAgIGNhc2UgMTIwMDA6Ci0gICAgICAgIHJldHVybiAiXzEyMDAwIjsKLSAgICBjYXNlIDE2MDAwOgotICAgICAgICByZXR1cm4gIl8xNjAwMCI7Ci0gICAgY2FzZSAyMjA1MDoKLSAgICAgICAgcmV0dXJuICJfMjIwNTAiOwotICAgIGNhc2UgMjQwMDA6Ci0gICAgICAgIHJldHVybiAiXzI0MDAwIjsKLSAgICBjYXNlIDMyMDAwOgotICAgICAgICByZXR1cm4gIl8zMjAwMCI7Ci0gICAgY2FzZSA0NDEwMDoKLSAgICAgICAgcmV0dXJuICJfNDQxMDAiOwotICAgIGNhc2UgNDgwMDA6Ci0gICAgICAgIHJldHVybiAiXzQ4MDAwIjsKLSAgICBkZWZhdWx0OgotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiVW5zdXBwb3J0ZWQgc2FtcGxpbmcgcmF0ZTogJWQgSHoiLCBmcmVxKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotfQotCi0vLyBUaGlzIG1ldGhvZCBtYXBzIHRoZSBudW1iZXIgb2YgY2hhbm5lbCB2YWx1ZSB0bwotLy8gYSBzdHJpbmcgdGhhdCB3aWxsIGJlIHBhcnQgb2YgYSBmaWxlIG5hbWUgZXh0ZW5zaW9uCi1zdGF0aWMgY29uc3QgY2hhciogY2hhbm5lbFRvU3RyaW5nQW5kRmlsZUV4dChpbnQgY2hhbm5lbHMpIHsKLSAgICBzd2l0Y2ggKGNoYW5uZWxzKSB7Ci0gICAgY2FzZSAxOgotICAgICAgICByZXR1cm4gIl8xLnBjbSI7Ci0gICAgY2FzZSAyOgotICAgICAgICByZXR1cm4gIl8yLnBjbSI7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIlVuc3VwcG9ydGVkICVkIGNoYW5uZWxzIiwgY2hhbm5lbHMpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci19Ci0KLS8qIE5vdGU6IGlmIHRoZSBjbGlwIGlzIG9wZW5lZCBpbiBmYXN0IG1vZGUsIGl0IGNhbiBvbmx5IGJlIHVzZWQgZm9yIGFuYWx5c2lzIGFuZCBub3RoaW5nIGVsc2UuICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBPcGVuKCBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5ncywgTTRPU0FfQm9vbCBiU2tpcEF1ZGlvVHJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0Jvb2wgYkZhc3RPcGVuTW9kZSwgTTRPU0FfQm9vbCBiQXZvaWRPcGVuaW5nVmlkZW9EZWMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRSRUFERVJfTWVkaWFGYW1pbHkgbWVkaWFGYW1pbHk7Ci0gICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXI7Ci0gICAgTTRfU3RyZWFtSGFuZGxlciAgZHVtbXlTdHJlYW1IYW5kbGVyOwotICAgIE00T1NBX0ludDMyIGlEdXJhdGlvbjsKLSAgICBNNE9TQV9Wb2lkICpkZWNvZGVyVXNlckRhdGE7Ci0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0KLSAgICBNNERFQ09ERVJfTVBFRzRfRGVjb2RlckNvbmZpZ0luZm8gZHVtbXk7Ci0gICAgTTRERUNPREVSX1ZpZGVvU2l6ZSB2aWRlb1NpemVGcm9tRFNJOwotI2VuZGlmIC8qIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUyAqLwotCi0gICAgTTRERUNPREVSX091dHB1dEZpbHRlciBGaWx0ZXJPcHRpb247Ci0KLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBDdHh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuOiBwQ2xpcEN0eHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ2xpcFNldHRpbmdzKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuOiBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwiKTsKLQotICAgIE00T1NBX1RSQUNFM18yKAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuOiBjYWxsZWQgd2l0aCBwQ2xpcEN0eHQ6IDB4JXgsIGJBdm9pZE9wZW5pbmdWaWRlb0RlYz0weCV4IiwKLSAgICAgICAgcENsaXBDdHh0LCBiQXZvaWRPcGVuaW5nVmlkZW9EZWMpOwotICAgIC8qKgotICAgICogS2VlcCBhIHBvaW50ZXIgdG8gdGhlIGNsaXAgc2V0dGluZ3MuIFJlbWVtYmVyIHRoYXQgd2UgZG9uJ3QgcG9zc2VzcyBpdCEgKi8KLSAgICBwQ2xpcEN0eHQtPnBTZXR0aW5ncyA9IHBDbGlwU2V0dGluZ3M7Ci0gICAgaWYoTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4ID09IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSkgewotICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludENsaXBPcGVuOiBJbWFnZSBzdHJlYW07IHNldCBjdXJyZW50IHZpZCBkZWMiKTsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX3NldEN1cnJlbnRWaWRlb0RlY29kZXIoCi0gICAgICAgICAgICAgICAgICAmcENsaXBDdHh0LT5TaGVsbEFQSSwgTTREQV9TdHJlYW1UeXBlVmlkZW9BUkdCODg4OCk7Ci0gICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgICAgIGRlY29kZXJVc2VyRGF0YSA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdENyZWF0ZSgKLSAgICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPnBWaURlY0N0eHQsCi0gICAgICAgICAgICAgICAgICAmZHVtbXlTdHJlYW1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXIsCi0gICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdCwKLSAgICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPlZpZGVvQVUsCi0gICAgICAgICAgICAgICAgICBkZWNvZGVyVXNlckRhdGEpOwotCi0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRDbGlwT3BlbjogXAotICAgICAgICAgICAgICAgIG1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIE00T1NBX1RSQUNFM18xKCJNNFZTUzNHUFBfaW50Q2xpcE9wZW46IFwKLSAgICAgICAgICAgIFZpZCBkZWMgc3RhcnRlZDsgcFZpRGVjQ3R4dD0weCV4IiwgcENsaXBDdHh0LT5wVmlEZWNDdHh0KTsKLQotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEdldCB0aGUgY29ycmVjdCByZWFkZXIgaW50ZXJmYWNlICovCi0gICAgZXJyID0gTTRWU1MzR1BQX3NldEN1cnJlbnRSZWFkZXIoJnBDbGlwQ3R4dC0+U2hlbGxBUEksCi0gICAgICAgIHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAvKioKLSAgICAqIEluaXQgdGhlIDNHUFAgb3IgTVAzIHJlYWRlciAqLwotICAgIGVyciA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RDcmVhdGUoJnBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwT3BlbigpOiBtX3BSZWFkZXItPm1fcEZjdENyZWF0ZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIExpbmsgdGhlIHJlYWRlciBpbnRlcmZhY2UgdG8gdGhlIHJlYWRlciBjb250ZXh0ICh1c2VkIGJ5IHRoZSBkZWNvZGVyIHRvIGtub3cgdGhlIHJlYWRlcikgKi8KLSAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdC0+bV9yZWFkZXJDb250ZXh0ID0KLSAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dDsKLQotICAgIC8qKgotICAgICogU2V0IHRoZSBPU0FMIHJlYWQgZnVuY3Rpb24gc2V0ICovCi0gICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdFNldE9wdGlvbigKLSAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgTTRSRUFERVJfa09wdGlvbklEX1NldE9zYUZpbGVSZWFkZXJGY3RzUHRyLAotICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikocENsaXBDdHh0LT5wRmlsZVJlYWRQdHJGY3QpKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RTZXRPcHRpb24gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBTZXQgdGhlIGZhc3Qgb3BlbiBtb2RlIGlmIGFza2VkICgzR1BQIG9ubHkpICovCi0gICAgaWYoIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQID09IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSApCi0gICAgewotICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBiRmFzdE9wZW5Nb2RlICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdFNldE9wdGlvbigKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIE00UkVBREVSXzNHUF9rT3B0aW9uSURfRmFzdE9wZW5Nb2RlLCBNNE9TQV9OVUxMKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwT3BlbigpOlwKLSAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyLT5tX3BGY3RTZXRPcHRpb24oRmFzdE9wZW5Nb2RlKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBTZXQgdGhlIHNraXAgYXVkaW8gb3B0aW9uIGlmIGFza2VkICovCi0gICAgICAgIGlmKCBNNE9TQV9UUlVFID09IGJTa2lwQXVkaW9UcmFjayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICBNNFJFQURFUl8zR1Bfa09wdGlvbklEX1ZpZGVvT25seSwgTTRPU0FfTlVMTCk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RTZXRPcHRpb24oVmlkZW9Pbmx5KSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfUENNKSB7Ci0gICAgICAgIC8vIENvbXBvc2UgdGhlIHRlbXAgZmlsZW5hbWUgd2l0aCBzYW1wbGUgcmF0ZSBhbmQgY2hhbm5lbCBpbmZvcm1hdGlvbi4KLSAgICAgICAgY29uc3QgY2hhciogZnJlcVN0ciA9IGZyZXFUb1N0cmluZygKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kpOwotCi0gICAgICAgIGlmIChmcmVxU3RyID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX0lOQ09NUEFUSUJMRV9BVURJT19TQU1QTElOR19GUkVRVUVOQ1k7Ci0gICAgICAgIH0KLQotICAgICAgICBjb25zdCBjaGFyKiBjaGFuU3RyID0gY2hhbm5lbFRvU3RyaW5nQW5kRmlsZUV4dCgKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyk7Ci0KLSAgICAgICAgaWYgKGNoYW5TdHIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX0lOQ09NUEFUSUJMRV9BVURJT19OQl9PRl9DSEFOTkVMUzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFsbG9jYXRlIG9uZSBieXRlIG1vcmUgdG8gaG9sZCB0aGUgbnVsbCB0ZXJtaW5hdG9yCi0gICAgICAgIE00T1NBX1VJbnQzMiBsZW5ndGggPQotICAgICAgICAgICAgc3RybGVuKHBDbGlwU2V0dGluZ3MtPnBGaWxlKSArIHN0cmxlbihmcmVxU3RyKSArIHN0cmxlbihjaGFuU3RyKSArIDE7Ci0KLSAgICAgICAgY2hhciogcFRlbXBGaWxlID0gKGNoYXIgKikgbWFsbG9jKGxlbmd0aCk7Ci0gICAgICAgIGlmIChwVGVtcEZpbGUgPT0gTlVMTCkgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRDbGlwT3BlbigpOiBtYWxsb2MgJWQgYnl0ZXMgZmFpbCIsbGVuZ3RoKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBtZW1zZXQocFRlbXBGaWxlLCAwLCBsZW5ndGgpOwotICAgICAgICBtZW1jcHkocFRlbXBGaWxlLCBwQ2xpcFNldHRpbmdzLT5wRmlsZSwgc3RybGVuKHBDbGlwU2V0dGluZ3MtPnBGaWxlKSk7Ci0gICAgICAgIHN0cm5jYXQocFRlbXBGaWxlLCBmcmVxU3RyLCBzdHJsZW4oZnJlcVN0cikpOwotICAgICAgICBzdHJuY2F0KHBUZW1wRmlsZSwgY2hhblN0ciwgc3RybGVuKGNoYW5TdHIpKTsKLQotICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0T3BlbiggcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwgcFRlbXBGaWxlKTsKLSAgICAgICAgaWYgKHBUZW1wRmlsZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBmcmVlKHBUZW1wRmlsZSk7Ci0gICAgICAgICAgICBwVGVtcEZpbGUgPSBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmICggTTROT19FUlJPUiAhPSBlcnIgKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludENsaXBPcGVuKCk6IG9wZW4gcGNtIGZpbGUgcmV0dXJucyBlcnJvciA6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgIC8qKgotICAgICAgICAqIE9wZW4gdGhlIDNHUFAvTVAzIGNsaXAgZmlsZSAqLwotICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0T3BlbiggcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICBwQ2xpcFNldHRpbmdzLT5wRmlsZSk7Ci0gICAgfQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgdWlEdW1teSwgdWlDb3JlSWQ7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwT3BlbigpOiBtX3BSZWFkZXItPm1fcEZjdE9wZW4gcmV0dXJucyAweCV4IiwgZXJyKTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBJZiB0aGUgZXJyb3IgaXMgZnJvbSB0aGUgY29yZSByZWFkZXIsIHdlIGNoYW5nZSBpdCB0byBhIHB1YmxpYyBWU1MzR1BQIGVycm9yICovCi0gICAgICAgIE00T1NBX0VSUl9TUExJVChlcnIsIHVpRHVtbXksIHVpQ29yZUlkLCB1aUR1bW15KTsKLQotICAgICAgICBpZiggTTRNUDRfUkVBREVSID09IHVpQ29yZUlkICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwT3BlbigpOiByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9JTlZBTElEXzNHUFBfRklMRSIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF8zR1BQX0ZJTEU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEdldCB0aGUgYXVkaW8gYW5kIHZpZGVvIHN0cmVhbXMgKi8KLSAgICB3aGlsZSggZXJyID09IE00Tk9fRVJST1IgKQotICAgIHsKLSAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdEdldE5leHRTdHJlYW0oCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LCAmbWVkaWFGYW1pbHksICZwU3RyZWFtSGFuZGxlcik7Ci0KLSAgICAgICAgLyppbiBjYXNlIHdlIGZvdW5kIGEgQklGUyBzdHJlYW0gb3Igc29tZXRoaW5nIGVsc2UuLi4qLwotICAgICAgICBpZiggKCBlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRFUlJfUkVBREVSX1VOS05PV05fU1RSRUFNX1RZUEUpKQotICAgICAgICAgICAgfHwgKGVyciA9PSAoKE00T1NBX1VJbnQzMilNNFdBUl9UT09fTVVDSF9TVFJFQU1TKSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSAvKio8IE9uZSBzdHJlYW0gZm91bmQgKi8KLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEZvdW5kIGEgdmlkZW8gc3RyZWFtICovCi0gICAgICAgICAgICBpZiggKCBtZWRpYUZhbWlseSA9PSBNNFJFQURFUl9rTWVkaWFGYW1pbHlWaWRlbykKLSAgICAgICAgICAgICAgICAmJiAoTTRPU0FfTlVMTCA9PSBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbSkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAoIE00REFfU3RyZWFtVHlwZVZpZGVvSDI2MyA9PSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKQotICAgICAgICAgICAgICAgICAgICB8fCAoTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNAotICAgICAgICAgICAgICAgICAgICA9PSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKQotICAgICAgICAgICAgICAgICAgICB8fCAoTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2YwotICAgICAgICAgICAgICAgICAgICA9PSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBGb3VuZCBhIEgyNjMgb3IgTVBFRy00IG9yIEgyNjQgdmlkZW8gc3RyZWFtIGluIGlucHV0IDNncHAgY2xpcDsgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogS2VlcCBwb2ludGVyIHRvIHRoZSB2aWRlbyBzdHJlYW0gKi8KLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00X1ZpZGVvU3RyZWFtSGFuZGxlciAqKXBTdHJlYW1IYW5kbGVyOwotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9iU3RyZWFtSXNPSyA9IE00T1NBX1RSVUU7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogUmVzZXQgdGhlIHN0cmVhbSByZWFkZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdFJlc2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0pOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RSZXNldCh2aWRlbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEluaXRpYWxpemVzIGFuIGFjY2VzcyBVbml0ICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QoCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPlZpZGVvQVUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QodmlkZW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSAvKio8IE5vdCBIMjYzIG9yIE1QRUctNCAoSDI2NCwgZXRjLikgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTX2VkaXRDbGlwT3BlbigpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZvdW5kIGFuIHVuc3VwcG9ydGVkIHZpZGVvIHN0cmVhbSAoMHgleCkgaW4gaW5wdXQgM2dwcCBjbGlwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpOwotCi0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX2JTdHJlYW1Jc09LID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEZvdW5kIGFuIGF1ZGlvIHN0cmVhbSAqLwotICAgICAgICAgICAgZWxzZSBpZiggKCBtZWRpYUZhbWlseSA9PSBNNFJFQURFUl9rTWVkaWFGYW1pbHlBdWRpbykKLSAgICAgICAgICAgICAgICAmJiAoTTRPU0FfTlVMTCA9PSBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAoIE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZAotICAgICAgICAgICAgICAgICAgICA9PSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKQotICAgICAgICAgICAgICAgICAgICB8fCAoTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgPT0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgKE00REFfU3RyZWFtVHlwZUF1ZGlvTXAzCi0gICAgICAgICAgICAgICAgICAgID09IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpCi0gICAgICAgICAgICAgICAgICAgIHx8IChNNERBX1N0cmVhbVR5cGVBdWRpb0V2cmMKLSAgICAgICAgICAgICAgICAgICAgPT0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgKE00REFfU3RyZWFtVHlwZUF1ZGlvUGNtCi0gICAgICAgICAgICAgICAgICAgID09IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwT3BlbigpOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICBGb3VuZCBhbiBBTVItTkIgb3IgQUFDIG9yIE1QMyBhdWRpbyBzdHJlYW0gaW4gaW5wdXQgY2xpcDsgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogS2VlcCBwb2ludGVyIHRvIHRoZSBhdWRpbyBzdHJlYW0gKi8KLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00X0F1ZGlvU3RyZWFtSGFuZGxlciAqKXBTdHJlYW1IYW5kbGVyOwotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9iU3RyZWFtSXNPSyA9IE00T1NBX1RSVUU7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogUmVzZXQgdGhlIHN0cmVhbSByZWFkZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdFJlc2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0pOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RSZXNldChhdWRpbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEluaXRpYWxpemVzIGFuIGFjY2VzcyBVbml0ICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QoCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPkF1ZGlvQVUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QoYXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSAvKio8IE5vdCBBTVItTkIgb3IgQUFDIChBTVItV0IuLi4pICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBGb3VuZCBhbiB1bnN1cHBvcnRlZCBhdWRpbyBzdHJlYW0gKDB4JXgpIGluIGlucHV0IDNncHAvbXAzIGNsaXAiLAotICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fYlN0cmVhbUlzT0sgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuKCk6IG1fcFJlYWRlci0+bV9wRmN0R2V0TmV4dFN0cmVhbSgpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJbml0IFZpZGVvIGRlY29kZXIgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbSApCi0gICAgewotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotICAvKiBJZiBleHRlcm5hbCBkZWNvZGVycyBhcmUgcG9zc2libGUsIGl0J3MgYmVzdCB0byBhdm9pZCBvcGVuaW5nIHRoZSBkZWNvZGVyIGlmIHRoZSBjbGlwIGlzIG9ubHkKLSAgZ29pbmcgdG8gYmUgdXNlZCBmb3IgYW5hbHlzaXMsIGFzIHdlJ3JlIG5vdCBnb2luZyB0byB1c2UgaXQgZm9yIHRoZSBhbmFseXNpcyBpbiB0aGUgY2FzZSBvZiBhCi0gIHBvc3NpYmxlIGV4dGVybmFsIGRlY29kZXIgYW55d2F5LCBhbmQgZWl0aGVyIHRoZXJlIGNvdWxkIGJlIG5vIGRlY29kZXIgYXQgdGhpcyBwb2ludCBvciB0aGUgSFcKLSAgZGVjb2RlciBjb3VsZCBiZSBwcmVzZW50LCB3aGljaCB3ZSB3YW50IHRvIGF2b2lkIG9wZW5pbmcgZm9yIHRoYXQuIFNlZSBjb21tZW50cyBpbgotICBpbnRCdWlsZEFuYWx5c2lzIGZvciBtb3JlIGRldGFpbHMuICovCi0KLSAgLyogQ0hBTkdFTUUgVGVtcG9yYXJpbHkgb25seSBkbyB0aGlzIGZvciBNUEVHNCwgc2luY2UgZm9yIG5vdyBvbmx5IE1QRUc0IGV4dGVybmFsIGRlY29kZXJzIGFyZQotICBzdXBwb3J0ZWQsIGFuZCB0aGUgZm9sbG93aW5nIHdvdWxkbid0IHdvcmsgZm9yIEgyNjMgc28gYSByZWxlYXNlIHdoZXJlIGV4dGVybmFsIGRlY29kZXJzIGFyZQotICBwb3NzaWJsZSwgYnV0IG5vdCB1c2VkLCB3b3VsZG4ndCB3b3JrIHdpdGggSDI2MyBzdHVmZi4gKi8KLQotICAgICAgICBpZiggYkF2b2lkT3BlbmluZ1ZpZGVvRGVjICYmIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzQKLSAgICAgICAgICAgID09IHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBPb3BzISBUaGUgbWVyZSBhY3Qgb2Ygb3BlbmluZyB0aGUgZGVjb2RlciBhbHNvIHJlc3VsdHMgaW4gdGhlIGltYWdlIHNpemUgYmVpbmcKLSAgICAgICAgICAgIGZpbGxlZCBpbiB0aGUgdmlkZW8gc3RyZWFtISBDb21wZW5zYXRlIGZvciB0aGlzIGJ5IHVzaW5nIFBhcnNlVmlkZW9EU0kgdG8gZmlsbAotICAgICAgICAgICAgdGhpcyBpbmZvLiAqLwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwT3BlbjogTXBlZzQgc3RyZWFtOyB2aWQgZGVjIG5vdCBzdGFydGVkIik7Ci0gICAgICAgICAgICBlcnIgPSBNNERFQ09ERVJfRVhURVJOQUxfUGFyc2VWaWRlb0RTSShwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAmZHVtbXksICZ2aWRlb1NpemVGcm9tRFNJKTsKLQotICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPm1fdmlkZW9XaWR0aCA9IHZpZGVvU2l6ZUZyb21EU0kubV91aVdpZHRoOwotICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPm1fdmlkZW9IZWlnaHQgPQotICAgICAgICAgICAgICAgIHZpZGVvU2l6ZUZyb21EU0kubV91aUhlaWdodDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLQotI2VuZGlmCi0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW46IE1wNC9IMjYzL0gyNjQgc3RyZWFtOyBzZXQgY3VycmVudCB2aWQgZGVjIik7Ci0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfc2V0Q3VycmVudFZpZGVvRGVjb2RlcigmcENsaXBDdHh0LT5TaGVsbEFQSSwKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKTsKLSAgICAgICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0KLSAgICAgICAgICAgIGRlY29kZXJVc2VyRGF0YSA9Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BDdXJyZW50VmlkZW9EZWNvZGVyVXNlckRhdGE7Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgIGRlY29kZXJVc2VyRGF0YSA9IE00T1NBX05VTEw7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlKAotICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPnBWaURlY0N0eHQsCi0gICAgICAgICAgICAgICAgJnBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcywKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlciwKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdCwKLSAgICAgICAgICAgICAgICAmcENsaXBDdHh0LT5WaWRlb0FVLCBkZWNvZGVyVXNlckRhdGEpOwotCi0gICAgICAgICAgICBpZiggKCAoKE00T1NBX1VJbnQzMilNNEVSUl9ERUNPREVSX0gyNjNfUFJPRklMRV9OT1RfU1VQUE9SVEVEKSA9PSBlcnIpCi0gICAgICAgICAgICAgICAgfHwgKCgoTTRPU0FfVUludDMyKU00RVJSX0RFQ09ERVJfSDI2M19OT1RfQkFTRUxJTkUpID09IGVycikgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogT3VyIGRlY29kZXIgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBIMjYzIHByb2ZpbGUgb3RoZXIgdGhhbiAwLgotICAgICAgICAgICAgICAgICogU28gaXQgcmV0dXJucyB0aGlzIGludGVybmFsIGVycm9yIGNvZGUuCi0gICAgICAgICAgICAgICAgKiBXZSB0cmFuc2xhdGUgaXQgdG8gb3VyIG93biBlcnJvciBjb2RlICovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSDI2M19QUk9GSUxFX05PVF9TVVBQT1JURUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW46IG1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW46IFZpZCBkZWMgc3RhcnRlZDsgcFZpRGVjQ3R4dD0weCV4IiwKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaURlY0N0eHQpOwotCi0gICAgICAgICAgICBpZiggTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2YwotICAgICAgICAgICAgICAgID09IHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZpbHRlck9wdGlvbi5tX3BGaWx0ZXJGdW5jdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopICZNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMDsKLSAgICAgICAgICAgICAgICBGaWx0ZXJPcHRpb24ubV9wRmlsdGVyVXNlckRhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCwgTTRERUNPREVSX2tPcHRpb25JRF9PdXRwdXRGaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmRmlsdGVyT3B0aW9uKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW46IG1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW46IG1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uXAotICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX2tPcHRpb25JRF9PdXRwdXRGaWx0ZXIgT0siKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0KLSAgICAgICAgfQotCi0jZW5kaWYKLQotICAgIH0KLQotICAgIC8qKgotICAgICogSW5pdCBBdWRpbyBkZWNvZGVyICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0gKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBQcmVwYXJlQXVkaW9EZWNvZGVyKHBDbGlwQ3R4dCk7Ci0gICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotICAgICAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX2ludENsaXBPcGVuOiBBdWRpbyBkZWMgc3RhcnRlZDsgY29udGV4dD0weCV4IiwKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9BVS5tX3N0cmVhbUlEID0gMDsKLSAgICAgICAgcENsaXBDdHh0LT5BdWRpb0FVLm1fZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgICAgICBwQ2xpcEN0eHQtPkF1ZGlvQVUubV9zaXplID0gMDsKLSAgICAgICAgcENsaXBDdHh0LT5BdWRpb0FVLm1fQ1RTID0gMDsKLSAgICAgICAgcENsaXBDdHh0LT5BdWRpb0FVLm1fRFRTID0gMDsKLSAgICAgICAgcENsaXBDdHh0LT5BdWRpb0FVLm1fYXR0cmlidXRlID0gMDsKLSAgICAgICAgcENsaXBDdHh0LT5BdWRpb0FVLm1fbWF4c2l6ZSA9IDA7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9BVS5tX3N0cnVjdFNpemUgPSBzaXplb2YocENsaXBDdHh0LT5BdWRpb0FVKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEdldCB0aGUgZHVyYXRpb24gb2YgdGhlIGxvbmdlc3Qgc3RyZWFtICovCi0gICAgaWYoIE00T1NBX1RSVUUgPT0gcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLmJBbmFseXNlZCApCi0gICAgewotICAgICAgICAvKiBJZiBhbHJlYWR5IGNhbGN1bGF0ZWQgc2V0IGl0IHRvIHByZXZpb3VzIHZhbHVlICovCi0gICAgICAgIC8qIEJlY2F1c2UgZmFzdCBvcGVuIGFuZCBmdWxsIG9wZW4gY2FuIHJldHVybiBhIGRpZmZlcmVudCB2YWx1ZSwKLSAgICAgICAgICAgaXQgY2FuIG1pc21hdGNoIHVzZXIgc2V0dGluZ3MgKi8KLSAgICAgICAgLyogVmlkZW8gdHJhY2sgaXMgbW9yZSBpbXBvcnRhbnQgdGhhbiBhdWRpbyB0cmFjayAoaWYgdmlkZW8gdHJhY2sgaXMgc2hvcnRlciB0aGFuCi0gICAgICAgICAgIGF1ZGlvIHRyYWNrLCBpdCBjYW4gbGVkIHRvIGN1dCBsYXJnZXIgdGhhbiBleHBlY3RlZCkgKi8KLSAgICAgICAgaUR1cmF0aW9uID0gcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0KLSAgICAgICAgaWYoIGlEdXJhdGlvbiA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgaUR1cmF0aW9uID0gcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIEVsc2UgY29tcHV0ZSBpdCBmcm9tIHN0cmVhbXMgKi8KLSAgICAgICAgaUR1cmF0aW9uID0gMDsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlEdXJhdGlvbiA9IChNNE9TQV9JbnQzMikoCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fZHVyYXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoICggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSkgJiYgKChNNE9TQV9JbnQzMikoCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9kdXJhdGlvbikKLSAgICAgICAgICAgID4gaUR1cmF0aW9uKSAmJiBpRHVyYXRpb24gPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlEdXJhdGlvbiA9IChNNE9TQV9JbnQzMikoCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fZHVyYXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJZiBlbmQgdGltZSBpcyBub3QgdXNlZCwgd2Ugc2V0IGl0IHRvIHRoZSB2aWRlbyB0cmFjayBkdXJhdGlvbiAqLwotICAgIGlmKCAwID09IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT51aUVuZEN1dFRpbWUgKQotICAgIHsKLSAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPnVpRW5kQ3V0VGltZSA9IChNNE9TQV9VSW50MzIpaUR1cmF0aW9uOwotICAgIH0KLQotICAgIHBDbGlwQ3R4dC0+aUVuZFRpbWUgPSAoTTRPU0FfSW50MzIpcENsaXBDdHh0LT5wU2V0dGluZ3MtPnVpRW5kQ3V0VGltZTsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludENsaXBPcGVuKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50Q2xpcERlbGV0ZUF1ZGlvVHJhY2soKQotICogQGJyaWVmICAgIERlbGV0ZSB0aGUgYXVkaW8gdHJhY2suIENsaXAgd2lsbCBiZSBsaWtlIGlmIGl0IGhhZCBubyBhdWRpbyB0cmFjawotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgICAgIChJTikgSW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludENsaXBEZWxldGVBdWRpb1RyYWNrKCBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCApCi17Ci0gICAgLyoqCi0gICAgKiBCdXQgd2UgZG9uJ3QgaGF2ZSB0byBmcmVlIHRoZSBhdWRpbyBzdHJlYW0uIEl0IHdpbGwgYmUgZnJlZWQgYnkgdGhlIHJlYWRlciB3aGVuIGNsb3NpbmcgaXQqLwotICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtID0gTTRPU0FfTlVMTDsKLQotICAgIC8qKgotICAgICogV2Ugd2lsbCByZXR1cm4gYSBjb25zdGFudCBzaWxlbmNlIEFNUiBBVS4KLSAgICAqIFdlIHNldCBpdCBoZXJlIG9uY2UsIGluc3RlYWQgb2YgYXQgZWFjaCByZWFkIGF1ZGlvIHN0ZXAuICovCi0gICAgcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0ciA9IChNNE9TQV9NZW1BZGRyOClwQ2xpcEN0eHQtPnBTaWxlbmNlRnJhbWVEYXRhOwotICAgIHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSA9IHBDbGlwQ3R4dC0+dWlTaWxlbmNlRnJhbWVTaXplOwotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBkZWNvZGVkIGF1ZGlvIGJ1ZmZlciAoaXQgbmVlZHMgdG8gYmUgcmUtYWxsb2NhdGVkIHRvIHN0b3JlIHNpbGVuY2UKLSAgICAgIGZyYW1lIGV2ZW50dWFsbHkpKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgKQotICAgIHsKLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MpOwotICAgICAgICBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHJldHVybjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVWaWRlb1VwVG9DdXJyZW50VGltZSgpCi0gKiBAYnJpZWYgICAgSnVtcCB0byB0aGUgcHJldmlvdXMgUkFQIGFuZCBkZWNvZGUgdXAgdG8gdGhlIGN1cnJlbnQgdmlkZW8gdGltZQotICogQHBhcmFtICAgcENsaXBDdHh0ICAgIChJTikgSW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcGFyYW0gICBpQ3RzICAgICAgICAoSU4pIFRhcmdldCBDVFMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlVmlkZW9VcFRvQ3RzKCBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBpQ3RzICkKLXsKLSAgICBNNE9TQV9JbnQzMiBpUmFwQ3RzLCBpQ2xpcEN0czsKLSAgICBNNF9NZWRpYVRpbWUgZERlY29kZVRpbWU7Ci0gICAgTTRPU0FfQm9vbCBiQ2xpcEp1bXAgPSBNNE9TQV9GQUxTRTsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgLyoqCi0gICAgKiBDb21wdXRlIHRoZSB0aW1lIGluIHRoZSBjbGlwIGJhc2UgKi8KLSAgICBpQ2xpcEN0cyA9IGlDdHMgLSBwQ2xpcEN0eHQtPmlWb2Zmc2V0OwotCi0gICAgLyoqCi0gICAgKiBJZiB3ZSB3ZXJlIHJlYWRpbmcgdGhlIGNsaXAsIHdlIG11c3QganVtcCB0byB0aGUgcHJldmlvdXMgUkFQCi0gICAgKiB0byBkZWNvZGUgZnJvbSB0aGF0IHBvaW50LiAqLwotICAgIGlmKCBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfUkVBRCA9PSBwQ2xpcEN0eHQtPlZzdGF0dXMgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogVGhlIGRlY29kZXIgbXVzdCBiZSB0b2xkIHRvIGp1bXAgKi8KLSAgICAgICAgYkNsaXBKdW1wID0gTTRPU0FfVFJVRTsKLSAgICAgICAgcENsaXBDdHh0LT5pVmlkZW9EZWNDdHMgPSBpQ2xpcEN0czsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBSZW1lbWJlciB0aGUgY2xpcCByZWFkaW5nIHN0YXRlICovCi0gICAgICAgIHBDbGlwQ3R4dC0+VnN0YXR1cyA9IE00VlNTM0dQUF9rQ2xpcFN0YXR1c19ERUNPREVfVVBfVE87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJZiB3ZSBhcmUgaW4gZGVjb2RlVXBUbygpIHByb2Nlc3MsIGNoZWNrIGlmIHdlIG5lZWQgdG8gZG8KLSAgICBvbmUgbW9yZSBzdGVwIG9yIGlmIGRlY29kaW5nIGlzIGZpbmlzaGVkICovCi0gICAgaWYoIE00VlNTM0dQUF9rQ2xpcFN0YXR1c19ERUNPREVfVVBfVE8gPT0gcENsaXBDdHh0LT5Wc3RhdHVzICkKLSAgICB7Ci0gICAgICAgIC8qIERvIGEgc3RlcCBvZiA1MDAgbXMgZGVjb2RpbmcgKi8KLSAgICAgICAgcENsaXBDdHh0LT5pVmlkZW9EZWNDdHMgKz0gNTAwOwotCi0gICAgICAgIGlmKCBwQ2xpcEN0eHQtPmlWaWRlb0RlY0N0cyA+IGlDbGlwQ3RzICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogVGFyZ2V0IHRpbWUgcmVhY2hlZCwgd2Ugc3dpdGNoIGJhY2sgdG8gREVDT0RFIG1vZGUgKi8KLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+aVZpZGVvRGVjQ3RzID0gaUNsaXBDdHM7Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPlZzdGF0dXMgPSBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfREVDT0RFOwotICAgICAgICB9Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UyXzEoImMgLCwsLCBkZWNvZGUgdXAgdG8gOiAlbGQiLCBwQ2xpcEN0eHQtPmlWaWRlb0RlY0N0cyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIEp1c3QgZGVjb2RlIGF0IGN1cnJlbnQgY2xpcCBjdHMgKi8KLSAgICAgICAgcENsaXBDdHh0LT5pVmlkZW9EZWNDdHMgPSBpQ2xpcEN0czsKLQotICAgICAgICBNNE9TQV9UUkFDRTJfMSgiZCAsLCwsIGRlY29kZSB1cCB0byA6ICVsZCIsIHBDbGlwQ3R4dC0+aVZpZGVvRGVjQ3RzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIERlY29kZSB1cCB0byB0aGUgdGFyZ2V0ICovCi0gICAgTTRPU0FfVFJBQ0UzXzIoCi0gICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcERlY29kZVZpZGVvVXBUb0N0czogRGVjb2RpbmcgdXBUbyBDVFMgJS4zZiwgcENsaXBDdHh0PTB4JXgiLAotICAgICAgICBkRGVjb2RlVGltZSwgcENsaXBDdHh0KTsKLQotICAgIGREZWNvZGVUaW1lID0gKE00T1NBX0RvdWJsZSlwQ2xpcEN0eHQtPmlWaWRlb0RlY0N0czsKLSAgICBwQ2xpcEN0eHQtPmlzUmVuZGVyRHVwID0gTTRPU0FfRkFMU0U7Ci0gICAgZXJyID0KLSAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdERlY29kZShwQ2xpcEN0eHQtPnBWaURlY0N0eHQsCi0gICAgICAgICZkRGVjb2RlVGltZSwgYkNsaXBKdW1wLCAwKTsKLQotICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSAmJiAoTTRXQVJfTk9fTU9SRV9BVSAhPSBlcnIpCi0gICAgICAgICYmIChlcnIgIT0gTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUUpICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwRGVjb2RlVmlkZW9VcFRvQ3RzOiBtX3BGY3REZWNvZGUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmKCBlcnIgPT0gTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUUgKQotICAgIHsKLSAgICAgICAgcENsaXBDdHh0LT5pc1JlbmRlckR1cCA9IE00T1NBX1RSVUU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludENsaXBEZWNvZGVWaWRlb1VwVG9DdHM6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKCkKLSAqIEBicmllZiAgICBSZWFkIG9uZSBBVSBmcmFtZSBpbiB0aGUgY2xpcAotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgICAgIChJTikgSW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKAotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0ICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgLyogLS0tLS0tLS0tLSBOTyBBVURJTyAtLS0tLS0tLS0tICovCi0gICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSApCi0gICAgewotICAgICAgICAvKiBJZiB0aGVyZSBpcyBubyBhdWRpbyB0cmFjaywgd2UgcmV0dXJuIHNpbGVuY2UgQVVzICovCi0gICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDbGlwQ3R4dC0+cFNpbGVuY2VGcmFtZURhdGE7Ci0gICAgICAgIHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSA9IHBDbGlwQ3R4dC0+dWlTaWxlbmNlRnJhbWVTaXplOwotICAgICAgICBwQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzICs9IHBDbGlwQ3R4dC0+aVNpbGVuY2VGcmFtZUR1cmF0aW9uOwotCi0gICAgICAgIE00T1NBX1RSQUNFMl8wKCJiICMjIyMgYmxhbmsgdHJhY2siKTsKLSAgICB9Ci0KLSAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgLyogLS0tLS0tLS0tLSBBTVItTkIsIEVWUkMgLS0tLS0tLS0tLSAqLwotICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotICAgIGVsc2UgaWYoICggTTRWSURFT0VESVRJTkdfa0FNUl9OQgotICAgICAgICA9PSBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlKQotICAgICAgICB8fCAoTTRWSURFT0VESVRJTkdfa0VWUkMKLSAgICAgICAgPT0gcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSkgKQotICAgIHsKLSAgICAgICAgaWYoIE00T1NBX0ZBTFNFID09IHBDbGlwQ3R4dC0+YkF1ZGlvRnJhbWVBdmFpbGFibGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogTm8gQVUgYXZhaWxhYmxlLCBzbyB3ZSBtdXN0IG11c3QgcmVhZCBvbmUgZnJvbSB0aGUgb3JpZ2luYWwgdHJhY2sgcmVhZGVyICovCi0gICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KAotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAmcENsaXBDdHh0LT5BdWRpb0FVKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFNldCB0aGUgY3VycmVudCBBTVIgZnJhbWUgcG9zaXRpb24gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVhZCBBVSAqLwotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIgPSBwQ2xpcEN0eHQtPkF1ZGlvQVUubV9kYXRhQWRkcmVzczsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogU2V0IHRoZSBBTVIgZnJhbWUgQ1RTICovCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMikocENsaXBDdHh0LT5BdWRpb0FVLm1fQ1RTCi0gICAgICAgICAgICAgICAgICAgICogcENsaXBDdHh0LT5zY2FsZV9hdWRpbyArIDAuNSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCAoIE00V0FSX05PX01PUkVfQVUgPT0gZXJyKSAmJiAoTTRWSURFT0VESVRJTkdfa0FNUl9OQgotICAgICAgICAgICAgICAgID09IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIElmIHRoZXJlIGlzIGxlc3MgYXVkaW8gdGhhbiB0aGUgc3RyZWFtIGR1cmF0aW9uIGluZGljYXRlZCwKLSAgICAgICAgICAgICAgICAqIHdlIHJldHVybiBzaWxlbmNlIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4gKi8KLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDbGlwQ3R4dC0+cFNpbGVuY2VGcmFtZURhdGE7Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplID0gcENsaXBDdHh0LT51aVNpbGVuY2VGcmFtZVNpemU7Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyArPSBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLQotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJhICMjIyMgc2lsZW5jZSBBVSIpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBSZXR1cm4gd2l0aCBNNFdBUl9OT19NT1JFX0FVICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSgpLUFNUjogXAotICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRXQVJfTk9fTU9SRV9BVSAoc2lsZW5jZSkiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRXQVJfTk9fTU9SRV9BVTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgLyoqPCBmYXRhbCBlcnJvciAob3Igbm8gc2lsZW5jZSBpbiBFVlJDKSAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoKS1BTVI6IG1fcEZjdEdldE5leHRBdSgpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIC8qIGJBdWRpb0ZyYW1lQXZhaWxhYmxlICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBHbyB0byB0aGUgbmV4dCBBTVIgZnJhbWUgaW4gdGhlIEFVICovCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyICs9IHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEluY3JlbWVudCBDVFM6IG9uZSBBTVIgZnJhbWUgaXMgMjAgbXMgbG9uZyAqLwotICAgICAgICAgICAgcENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyArPSBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEdldCB0aGUgc2l6ZSBvZiB0aGUgcG9pbnRlZCBBTVIgZnJhbWUgKi8KLSAgICAgICAgc3dpdGNoKCBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQU1SX05COgotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MTYpTTRWU1MzR1BQX2ludEdldEZyYW1lU2l6ZV9BTVJOQigKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0cik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0VWUkM6Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQxNilNNFZTUzNHUFBfaW50R2V0RnJhbWVTaXplX0VWUkMoCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCAwID09IHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSgpLUFNUjogQVUgZnJhbWUgc2l6ZSA9PSAwLFwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9JTlBVVF9BVURJT19DT1JSVVBURURfQU1SX0FVIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9JTlBVVF9BVURJT19DT1JSVVBURURfQVU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggcENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplID4gcENsaXBDdHh0LT5BdWRpb0FVLm1fc2l6ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSgpLUFNUjogQVUgZnJhbWUgc2l6ZSBncmVhdGVyIHRoYW4gQVUgc2l6ZSEsXAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0NPUlJVUFRFRF9BTVJfQVUiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0NPUlJVUFRFRF9BVTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIGlmIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgQVUgaGFzIGJlZW4gcmVhY2hlZCBvciBub3QgKi8KLSAgICAgICAgaWYoICggcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0ciArIHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSkKLSAgICAgICAgICAgIDwgKHBDbGlwQ3R4dC0+QXVkaW9BVS5tX2RhdGFBZGRyZXNzICsgcENsaXBDdHh0LT5BdWRpb0FVLm1fc2l6ZSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPmJBdWRpb0ZyYW1lQXZhaWxhYmxlID0gTTRPU0FfVFJVRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+YkF1ZGlvRnJhbWVBdmFpbGFibGUgPQotICAgICAgICAgICAgICAgIE00T1NBX0ZBTFNFOyAvKio8IHdpbGwgYmUgdXNlZCBmb3IgbmV4dCBjYWxsICovCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgLyogLS0tLS0tLS0tLSBBQUMgLS0tLS0tLS0tLSAqLwotICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotICAgIGVsc2UgaWYoICggTTRWSURFT0VESVRJTkdfa0FBQwotICAgICAgICA9PSBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlKQotICAgICAgICB8fCAoTTRWSURFT0VESVRJTkdfa0FBQ3BsdXMKLSAgICAgICAgPT0gcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSkKLSAgICAgICAgfHwgKE00VklERU9FRElUSU5HX2tlQUFDcGx1cwotICAgICAgICA9PSBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlKSApCi0gICAgewotICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KAotICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0sCi0gICAgICAgICAgICAmcENsaXBDdHh0LT5BdWRpb0FVKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyID0gcENsaXBDdHh0LT5BdWRpb0FVLm1fZGF0YUFkZHJlc3M7Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemUgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MTYpcENsaXBDdHh0LT5BdWRpb0FVLm1fc2l6ZTsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgPQotICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMikocENsaXBDdHh0LT5BdWRpb0FVLm1fQ1RTICogcENsaXBDdHh0LT5zY2FsZV9hdWRpbwotICAgICAgICAgICAgICAgICsgMC41KTsKLQotICAgICAgICAgICAgLyogUGF0Y2ggYmVjYXVzZSBtX0NUUyBpcyB1bmZvcnR1bmF0ZWx5IHJvdW5kZWQgaW4gM2dwIHJlYWRlciBzaGVsbCAqLwotICAgICAgICAgICAgLyogKGN0cyBpcyBub3QgYW4gaW50ZWdlciB3aXRoIGZyZXF1ZW5jeSAyNCBrSHogZm9yIGV4YW1wbGUpICovCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzID0gKCAoIHBDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMKLSAgICAgICAgICAgICAgICArIHBDbGlwQ3R4dC0+aVNpbGVuY2VGcmFtZUR1cmF0aW9uIC8gMikKLSAgICAgICAgICAgICAgICAvIHBDbGlwQ3R4dC0+aVNpbGVuY2VGcmFtZUR1cmF0aW9uKQotICAgICAgICAgICAgICAgICogcENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb247Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogSWYgdGhlcmUgaXMgbGVzcyBhdWRpbyB0aGFuIHRoZSBzdHJlYW0gZHVyYXRpb24gaW5kaWNhdGVkLAotICAgICAgICAgICAgKiB3ZSByZXR1cm4gc2lsZW5jZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uICovCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcENsaXBDdHh0LT5wU2lsZW5jZUZyYW1lRGF0YTsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSA9IHBDbGlwQ3R4dC0+dWlTaWxlbmNlRnJhbWVTaXplOwotICAgICAgICAgICAgcENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyArPSBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLQotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoImEgIyMjIyBzaWxlbmNlIEFVIik7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBSZXR1cm4gd2l0aCBNNFdBUl9OT19NT1JFX0FVICovCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoKS1BQUM6XAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFdBUl9OT19NT1JFX0FVIChzaWxlbmNlKSIpOwotICAgICAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfQVU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAvKio8IGZhdGFsIGVycm9yICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSgpLUFBQzogbV9wRmN0R2V0TmV4dEF1KCkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIC8qIC0tLS0tLS0tLS0gTVAzLCBvdGhlcnMgLS0tLS0tLS0tLSAqLwotICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdSgKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgJnBDbGlwQ3R4dC0+QXVkaW9BVSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKCktTVAzOiBtX3BGY3RHZXROZXh0QXUoKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0ciA9IHBDbGlwQ3R4dC0+QXVkaW9BVS5tX2RhdGFBZGRyZXNzOwotICAgICAgICBwQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemUgPSAoTTRPU0FfVUludDE2KXBDbGlwQ3R4dC0+QXVkaW9BVS5tX3NpemU7Ci0gICAgICAgIHBDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgPQotICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQ2xpcEN0eHQtPkF1ZGlvQVUubV9DVFMgKiBwQ2xpcEN0eHQtPnNjYWxlX2F1ZGlvCi0gICAgICAgICAgICArIDAuNSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcFByZXBhcmVBdWRpb0RlY29kZXIoKQotICogQGJyaWVmICAgIENyZWF0ZXMgYW5kIGluaXRpYWxpemUgdGhlIGF1ZGlvIGRlY29kZXIgZm9yIHRoZSBjbGlwLgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgKElOKSBpbnRlcm5hbCBjbGlwIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwUHJlcGFyZUF1ZGlvRGVjb2RlcigKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCApCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRfU3RyZWFtVHlwZSBhdWRpb3R5cGU7Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICBNNF9BQUNUeXBlIGlBYWNUeXBlID0gMDsKLQotI2VuZGlmCi0KLSAgICAvKioKLSAgICAqIFNldCB0aGUgcHJvcGVyIGF1ZGlvIGRlY29kZXIgKi8KLQotICAgIGF1ZGlvdHlwZSA9IHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGU7Ci0KLSAgICAvL0VWUkMKLSAgICBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9FdnJjCi0gICAgICAgICE9IGF1ZGlvdHlwZSApIC8qIGRlY29kZXIgbm90IHN1cHBvcnRlZCB5ZXQsIGJ1dCBhbGxvdyB0byBkbyBudWxsIGVuY29kaW5nICovCi0KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX3NldEN1cnJlbnRBdWRpb0RlY29kZXIoJnBDbGlwQ3R4dC0+U2hlbGxBUEksIGF1ZGlvdHlwZSk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAvKioKLSAgICAqIENyZWF0ZXMgdGhlIGF1ZGlvIGRlY29kZXIgKi8KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2RlciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFByZXBhcmVBdWRpb0RlY29kZXIoKTogRmFpbHMgdG8gaW5pdGlhdGUgdGhlIGF1ZGlvIGRlY29kZXIuIik7Ci0gICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0FVRElPX0RFQ09ERVJfSU5JVF9GQUlMRUQ7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0ICkKLSAgICB7Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgaWYoIE00T1NBX1RSVUUgPT0gcENsaXBDdHh0LT5TaGVsbEFQSS5iQWxsb3dGcmVlaW5nT01YQ29kZWNJbnRlcmZhY2UgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgPT0gYXVkaW90eXBlICkgewotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDaGVja0FuZEdldENvZGVjQWFjUHJvcGVydGllcygKLSAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoTTREQV9TdHJlYW1UeXBlQXVkaW9QY20gIT0gYXVkaW90eXBlKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdENyZWF0ZUF1ZGlvRGVjKAotICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgICAgIE00T1NBX05VTEwpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwUHJlcGFyZUF1ZGlvRGVjb2RlcjogbV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlY1wKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwUHJlcGFyZUF1ZGlvRGVjb2RlcjpcCi0gICAgICAgICAgICAgICAgQ3JlYXRpbmcgZXh0ZXJuYWwgYXVkaW8gZGVjb2RlciBvZiB0eXBlIDB4JXgiLCBhdWRpb3R5cGUpOwotICAgICAgICAgICAgLyogRXh0ZXJuYWwgT01YIGNvZGVjcyBhcmUgdXNlZCovCi0gICAgICAgICAgICBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgPT0gYXVkaW90eXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlQXVkaW9EZWMoCi0gICAgICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLnBDdXJyZW50QXVkaW9EZWNvZGVyVXNlckRhdGEpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIEFBQyBwcm9wZXJ0aWVzKi8KLSAgICAgICAgICAgICAgICAgICAgLypnZXQgZnJvbSBSZWFkZXI7IHRlbXBvcmFyeSwgdGlsbCBBdWRpbyBkZWNvZGVyIHNoZWxsIEFQSQotICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSB0byBnZXQgdGhlIEFBQyBwcm9wZXJ0aWVzKi8KLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFOdW1DaGFuID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHM7Ci0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hU2FtcEZyZXEgPQotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fc2FtcGxpbmdGcmVxdWVuY3k7Ci0KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPgotICAgICAgICAgICAgICAgICAgICAgICAgbV9wRmN0R2V0T3B0aW9uQXVkaW9EZWMocENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgTTRBRF9rT3B0aW9uSURfU3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmaUFhY1R5cGUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFByZXBhcmVBdWRpb0RlY29kZXI6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0R2V0T3B0aW9uQXVkaW9EZWMgcmV0dXJucyBlcnIgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpQWFjVHlwZSA9IE00X2tBQUM7IC8vc2V0IHRvIGRlZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFByZXBhcmVBdWRpb0RlY29kZXI6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0R2V0T3B0aW9uQXVkaW9EZWMgcmV0dXJucyBzdHJlYW1UeXBlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlBYWNUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIGlBYWNUeXBlICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNF9rQUFDOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hU0JSUHJlc2VudCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFQU1ByZXNlbnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00X2tBQUNwbHVzOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hU0JSUHJlc2VudCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFQU1ByZXNlbnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hRXh0ZW5zaW9uU2FtcEZyZXEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9zYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNF9rZUFBQ3BsdXM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFTQlJQcmVzZW50ID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPkFhY1Byb3BlcnRpZXMuYVBTUHJlc2VudCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFFeHRlbnNpb25TYW1wRnJlcSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX3NhbXBsaW5nRnJlcXVlbmN5OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMigKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFByZXBhcmVBdWRpb0RlY29kZXI6IEFBQyBOQkNoYW5zPSVkLCBTYW1wbEZyZXE9JWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFOdW1DaGFuLAotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFTYW1wRnJlcSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYygKLSAgICAgICAgICAgICAgICAmcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0LCBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLnBDdXJyZW50QXVkaW9EZWNvZGVyVXNlckRhdGEpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBQcmVwYXJlQXVkaW9EZWNvZGVyOlwKLSAgICAgICAgICAgICAgICAgICAgbV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotI2Vsc2UKLSAgICAgICAgLyogVHJpY2ssIEkgdXNlIHBVc2VyRGF0YSB0byByZXRyaWV2ZSBhYWMgcHJvcGVydGllcywKLSAgICAgICAgICAgd2FpdGluZyBmb3Igc29tZSBiZXR0ZXIgaW1wbGVtZW50YXRpb24uLi4gKi8KLQotICAgICAgICBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgPT0gYXVkaW90eXBlICkKLSAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYygKLSAgICAgICAgICAgICZwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwgJihwQ2xpcEN0eHQtPkFhY1Byb3BlcnRpZXMpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdENyZWF0ZUF1ZGlvRGVjKAotICAgICAgICAgICAgJnBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCwgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0sCi0gICAgICAgICAgICBNNE9TQV9OVUxMIC8qIHRvIGJlIGNoYW5nZWQgd2l0aCBIVyBpbnRlcmZhY2VzICovKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBQcmVwYXJlQXVkaW9EZWNvZGVyOlwKLSAgICAgICAgICAgICAgICBtX3BBdWRpb0RlY29kZXItPm1fcEZjdENyZWF0ZUF1ZGlvRGVjIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICB9Ci0KLSAgICBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJOYXJyb3dCYW5kID09IGF1ZGlvdHlwZSApIHsKLSAgICAgICAgLyogQU1SIERFQ09ERVIgQ09ORklHVVJBVElPTiAqLwotCi0gICAgICAgIC8qIG5vdGhpbmcgc3BlY2lmaWMgdG8gZG8gKi8KLSAgICB9Ci0gICAgZWxzZSBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9FdnJjID09IGF1ZGlvdHlwZSApIHsKLSAgICAgICAgLyogRVZSQyBERUNPREVSIENPTkZJR1VSQVRJT04gKi8KLQotICAgICAgICAvKiBub3RoaW5nIHNwZWNpZmljIHRvIGRvICovCi0gICAgfQotICAgIGVsc2UgaWYoIE00REFfU3RyZWFtVHlwZUF1ZGlvTXAzID09IGF1ZGlvdHlwZSApIHsKLSAgICAgICAgLyogTVAzIERFQ09ERVIgQ09ORklHVVJBVElPTiAqLwotCi0gICAgICAgIC8qIG5vdGhpbmcgc3BlY2lmaWMgdG8gZG8gKi8KLSAgICB9Ci0gICAgZWxzZSBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgPT0gYXVkaW90eXBlICkKLSAgICB7Ci0gICAgICAgIC8qIEFBQyBERUNPREVSIENPTkZJR1VSQVRJT04gKi8KLQotICAgICAgICAvKiBEZWNvZGUgaGlnaCBxdWFsaXR5IGFhYyBidXQgZGlzYWJsZSBQUyBhbmQgU0JSICovCi0gICAgICAgIC8qIEJlY2F1c2Ugd2UgaGF2ZSB0byBtaXggZGlmZmVyZW50IGtpbmQgb2YgQUFDIHNvIHdlIG11c3QgdGFrZSB0aGUgbG93ZXN0IGNhcGFiaWxpdHkgKi8KLSAgICAgICAgLyogSW4gTUNTIGl0IHdhcyBub3QgbmVlZGVkIGJlY2F1c2UgdGhlcmUgaXMgb25seSBvbmUgc3RyZWFtICovCi0gICAgICAgIE00X0FhY0RlY29kZXJDb25maWcgQWFjRGVjUGFyYW07Ci0KLSAgICAgICAgQWFjRGVjUGFyYW0ubV9BQUNEZWNvZGVyUHJvZmlsZSA9IEFBQ19rQUFDOwotICAgICAgICBBYWNEZWNQYXJhbS5tX0Rvd25TYW1wbGluZ01vZGUgPSBBQUNfa0RTX09GRjsKLQotICAgICAgICBpZiggTTRFTkNPREVSX2tNb25vID09IHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBBYWNEZWNQYXJhbS5tX091dHB1dE1vZGUgPSBBQUNfa01vbm87Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBBYWNEZWNQYXJhbS5tX091dHB1dE1vZGUgPSBBQUNfa1N0ZXJlbzsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb25BdWRpb0RlYygKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgICAgIE00QURfa09wdGlvbklEX1VzZXJQYXJhbSwgKE00T1NBX0RhdGFPcHRpb24pICZBYWNEZWNQYXJhbSk7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbkF1ZGlvRGVjICkgewotICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uQXVkaW9EZWMoCi0gICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsIE00QURfa09wdGlvbklEXzNncFJlYWRlckludGVyZmFjZSwKLSAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdCk7Ci0KLSAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbkF1ZGlvRGVjKAotICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0LCBNNEFEX2tPcHRpb25JRF9BdWRpb0FVLAotICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZwQ2xpcEN0eHQtPkF1ZGlvQVUpOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTdGFydEF1ZGlvRGVjICkKLSAgICB7Ci0gICAgICAgIC8qIE5vdCBpbXBsZW1lbnRlZCBpbiBhbGwgZGVjb2RlcnMgKi8KLSAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFN0YXJ0QXVkaW9EZWMoCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFByZXBhcmVBdWRpb0RlY29kZXI6XAotICAgICAgICAgICAgICAgIG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RhcnRBdWRpb0RlYyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBbGxvY2F0ZSBvdXRwdXQgYnVmZmVyIGZvciB0aGUgYXVkaW8gZGVjb2RlciAqLwotICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplID0KLSAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fYnl0ZUZyYW1lTGVuZ3RoCi0gICAgICAgICogcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fYnl0ZVNhbXBsZVNpemUKLSAgICAgICAgKiBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzOwotICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyA9Ci0gICAgICAgIChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUKLSAgICAgICAgKiBzaXplb2YoTTRPU0FfSW50MTYpLAotICAgICAgICBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopIkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSIpOwotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwUHJlcGFyZUF1ZGlvRGVjb2RlcigpOlwKLSAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBBdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcERlY29kZUN1cnJlbnRBdWRpb0ZyYW1lKCkKLSAqIEBicmllZiAgICBEZWNvZGUgdGhlIGN1cnJlbnQgQVVESU8gZnJhbWUuCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENsaXBDdHh0ICAgICAgICAoSU4pIGludGVybmFsIGNsaXAgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcERlY29kZUN1cnJlbnRBdWRpb0ZyYW1lKAotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0ICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgLyoqCi0gICAgKiBTaWxlbmNlIG1vZGUgKi8KLSAgICBpZiggcENsaXBDdHh0LT5wU2lsZW5jZUZyYW1lRGF0YQotICAgICAgICA9PSAoTTRPU0FfVUludDggKilwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBBbGxvY2F0ZSBvdXRwdXQgYnVmZmVyIGZvciB0aGUgYXVkaW8gZGVjb2RlciAqLwotICAgICAgICAgICAgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgPQotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+dWlTaWxlbmNlUGNtU2l6ZTsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZQotICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX0ludDE2KSwKLSAgICAgICAgICAgICAgICBNNFZTUzNHUFAsKE00T1NBX0NoYXIgKikgIkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSIpOwotCi0gICAgICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZSgpOlwKLSAgICAgICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIEF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MsIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIEZpbGwgaXQgd2l0aCAwICg9IHBjbSBzaWxlbmNlKSAqLwotICAgICAgICBtZW1zZXQocENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLDAsCi0gICAgICAgICAgICAgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgKiBzaXplb2YoTTRPU0FfSW50MTYpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocENsaXBDdHh0LT5wU2V0dGluZ3MtPkZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9QQ00pCi0gICAgewotICAgICAgICBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVySW4ubV9kYXRhQWRkcmVzcyA9IChNNE9TQV9NZW1BZGRyOCkgcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0cjsKLSAgICAgICAgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlckluLm1fYnVmZmVyU2l6ZSAgPSBwQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemU7Ci0KLSAgICAgICAgbWVtY3B5KCh2b2lkICopcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgKHZvaWQgKilwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVySW4ubV9kYXRhQWRkcmVzcywgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlckluLm1fYnVmZmVyU2l6ZSk7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplID0gcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlckluLm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgLyoqCi0gICAgICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLQotICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZSgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICB9Ci0gICAgLyoqCi0gICAgKiBTdGFuZGFyZCBkZWNvZGluZyBtb2RlICovCi0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogRGVjb2RlIGN1cnJlbnQgQU1SIGZyYW1lICovCi0gICAgICAgIGlmICggcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0ciAhPSBNNE9TQV9OVUxMICkgewotICAgICAgICAgICAgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlckluLm1fZGF0YUFkZHJlc3MgPQotICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyOwotICAgICAgICAgICAgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlckluLm1fYnVmZmVyU2l6ZSA9Ci0gICAgICAgICAgICAgcENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplOwotICAgICAgICAgICAgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlckluLm1fdGltZVN0YW1wVXMgPQotICAgICAgICAgICAgIChpbnQ2NF90KSAocENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyAqIDEwMDBMTCk7Ci0KLSAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTdGVwQXVkaW9EZWMoCi0gICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICAgICZwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVySW4sICZwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0LAotICAgICAgICAgICAgIE00T1NBX0ZBTFNFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFBhc3MgTnVsbCBpbnB1dCBidWZmZXIKLSAgICAgICAgICAgIC8vIFJlYWRlciBpbnZva2VkIGZyb20gQXVkaW8gZGVjb2RlciBzb3VyY2UKLSAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTdGVwQXVkaW9EZWMoCi0gICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICAgIE00T1NBX05VTEwsICZwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0LAotICAgICAgICAgICAgIE00T1NBX0ZBTFNFKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcERlY29kZUN1cnJlbnRBdWRpb0ZyYW1lKCk6XAotICAgICAgICAgICAgICAgIG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RlcEF1ZGlvIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcERlY29kZUN1cnJlbnRBdWRpb0ZyYW1lKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQoKQotICogQGJyaWVmICAgIEp1bXAgaW4gdGhlIGF1ZGlvIHRyYWNrIG9mIHRoZSBjbGlwLgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgICAgIChJTikgaW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcGFyYW0gICBwSnVtcEN0cyAgICAgICAgICAgIChJTi9PVVQpIGluOnRhcmdldCBDVFMsIG91dDogcmVhY2hlZCBDVFMKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdCggTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiAqcEp1bXBDdHMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfSW50MzIgaVRhcmdldEN0czsKLSAgICBNNE9TQV9JbnQzMiBpSnVtcEN0c01zOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDbGlwQ3R4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQ6IHBDbGlwQ3R4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBKdW1wQ3RzKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdDogcEp1bXBDdHMgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgaVRhcmdldEN0cyA9ICpwSnVtcEN0czsKLQotICAgIC8qKgotICAgICogSWYgdGhlcmUgaXMgbm8gYXVkaW8gc3RyZWFtLCB3ZSBzaW11bGF0ZSBhIGp1bXAgYXQgdGhlIHRhcmdldCBqdW1wIENUUyAqLwotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIHRoZSB0YXJnZXQgQ1RTIHdpbGwgYmUgcmVhY2hlZCBhdCBuZXh0IFJlYWRGcmFtZSBjYWxsICh0aHVzIHRoZSAtMjApICovCi0gICAgICAgICpwSnVtcEN0cyA9IGlUYXJnZXRDdHMgLSBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLQotICAgICAgICAvKiBQYXRjaCBiZWNhdXNlIG1fQ1RTIGlzIHVuZm9ydHVuYXRlbHkgcm91bmRlZCBpbiAzZ3AgcmVhZGVyIHNoZWxsICovCi0gICAgICAgIC8qIChjdHMgaXMgbm90IGFuIGludGVnZXIgd2l0aCBmcmVxdWVuY3kgMjQga0h6IGZvciBleGFtcGxlKSAqLwotICAgICAgICAqcEp1bXBDdHMgPSAoICggKnBKdW1wQ3RzICsgcENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb24gLyAyKQotICAgICAgICAgICAgLyBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbikKLSAgICAgICAgICAgICogcENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb247Ci0gICAgICAgIHBDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgPQotICAgICAgICAgICAgKgotICAgICAgICAgICAgcEp1bXBDdHM7IC8qIHNpbXVsYXRlIGEgcmVhZCBhdCBqdW1wIHBvc2l0aW9uIGZvciBsYXRlciBzaWxlbmNlIEFVcyAqLwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9JbnQzMiBjdXJyZW50X3RpbWUgPSAwOwotICAgICAgICBNNE9TQV9JbnQzMiBsb29wX2NvdW50ZXIgPSAwOwotCi0gICAgICAgIGlmKCAoTTREQV9TdHJlYW1UeXBlQXVkaW9NcDMKLSAgICAgICAgICAgID09IHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUpICkKLSAgICAgICAgewotICAgICAgICAgICAgd2hpbGUoICggbG9vcF9jb3VudGVyIDwgTTRWU1MzR1BQX01QM19KVU1QRURfQVVfTlVNQkVSX01BWCkKLSAgICAgICAgICAgICAgICAmJiAoY3VycmVudF90aW1lIDwgaVRhcmdldEN0cykgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUoCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPkF1ZGlvQVUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQ6IG1fcEZjdEdldE5leHRBdSgpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGN1cnJlbnRfdGltZSA9IChNNE9TQV9JbnQzMilwQ2xpcEN0eHQtPkF1ZGlvQVUubV9DVFM7Ci0gICAgICAgICAgICAgICAgbG9vcF9jb3VudGVyKys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBUaGUgY3VycmVudCBBVSBpcyBzdG9yZWQgKi8KLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIgPSBwQ2xpcEN0eHQtPkF1ZGlvQVUubV9kYXRhQWRkcmVzczsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQxNilwQ2xpcEN0eHQtPkF1ZGlvQVUubV9zaXplOwotICAgICAgICAgICAgcENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQ2xpcEN0eHQtPkF1ZGlvQVUubV9DVFMgKiBwQ2xpcEN0eHQtPnNjYWxlX2F1ZGlvCi0gICAgICAgICAgICAgICAgKyAwLjUpOwotCi0gICAgICAgICAgICAqcEp1bXBDdHMgPSBwQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEp1bXAgaW4gdGhlIGF1ZGlvIHN0cmVhbSAqLwotICAgICAgICAgICAgaUp1bXBDdHNNcyA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKSgqcEp1bXBDdHMgLyBwQ2xpcEN0eHQtPnNjYWxlX2F1ZGlvICsgMC41KTsKLQotICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdEp1bXAoCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgICAgICZpSnVtcEN0c01zKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQoKTogbV9wRmN0SnVtcCgpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgKnBKdW1wQ3RzID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKGlKdW1wQ3RzTXMgKiBwQ2xpcEN0eHQtPnNjYWxlX2F1ZGlvICsgMC41KTsKLQotICAgICAgICAgICAgLyogUGF0Y2ggYmVjYXVzZSBtX0NUUyBpcyB1bmZvcnR1bmF0ZWx5IHJvdW5kZWQgaW4gM2dwIHJlYWRlciBzaGVsbCAqLwotICAgICAgICAgICAgLyogKGN0cyBpcyBub3QgYW4gaW50ZWdlciB3aXRoIGZyZXF1ZW5jeSAyNCBrSHogZm9yIGV4YW1wbGUpICovCi0gICAgICAgICAgICAqcEp1bXBDdHMgPSAoICggKnBKdW1wQ3RzICsgcENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb24gLyAyKQotICAgICAgICAgICAgICAgIC8gcENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb24pCi0gICAgICAgICAgICAgICAgKiBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgPSAwOyAvKiBObyBmcmFtZSByZWFkIHlldCAqLwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVG8gZGV0ZWN0IHNvbWUgbWF5LWJlIGJ1Z3MsIEkgcHJlZmVyIHRvIHJlc2V0IGFsbCB0aGVzZSBhZnRlciBhIGp1bXAgKi8KLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+YkF1ZGlvRnJhbWVBdmFpbGFibGUgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogSW4gQU1SLCB3ZSBoYXZlIHRvIG1hbmFnZSBtdWx0aS1mcmFtZWQgQVVzLAotICAgICAgICAgICAgYnV0IGFsc28gaW4gQUFDIHRoZSBqdW1wIGNhbiBiZSAxIEFVIHRvbyBtdWNoIGJhY2t3YXJkICovCi0gICAgICAgICAgICBpZiggKnBKdW1wQ3RzIDwgaVRhcmdldEN0cyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBKdW1wIGRvZXNuJ3QgcmVhZCBhbnkgQVUsIHdlIG11c3QgcmVhZCBhdCBsZWFzdCBvbmUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShwQ2xpcEN0eHQpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShhKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFJlYWQgQVUgZnJhbWVzIGFzIGxvbmcgYXMgd2UgcmVhY2ggdGhlIEFVIGJlZm9yZSB0aGUgdGFyZ2V0IENUUwotICAgICAgICAgICAgICAgICogKHNvIHRoZSB0YXJnZXQgd2lsbCBiZSByZWFjaGVkIHdoZW4gdGhlIHVzZXIgY2FsbCBSZWFkTmV4dEF1ZGlvRnJhbWUpLiAqLwotICAgICAgICAgICAgICAgIHdoaWxlKCBwQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzCi0gICAgICAgICAgICAgICAgICAgIDwgKGlUYXJnZXRDdHMgLSBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbikgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocENsaXBDdHh0KTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShiKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBSZXR1cm4gdGhlIENUUyB0aGF0IHdpbGwgYmUgcmVhY2hlZCBhdCBuZXh0IFJlYWRGcmFtZSAqLwotICAgICAgICAgICAgICAgICpwSnVtcEN0cyA9IHBDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMKLSAgICAgICAgICAgICAgICAgICAgKyBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcENsb3NlKCkKLSAqIEBicmllZiAgICBDbG9zZSBhIGNsaXAuIERlc3Ryb3kgdGhlIGNvbnRleHQuCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENsaXBDdHh0ICAgICAgICAgICAgKElOKSBJbnRlcm5hbCBjbGlwIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBDbG9zZSggTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBDdHh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBDbG9zZTogcENsaXBDdHh0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgdmlkZW8gZGVjb2RlciBjb250ZXh0ICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5wVmlEZWNDdHh0ICkKLSAgICB7Ci0gICAgICAgIHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wVmlkZW9EZWNvZGVyLT5tX3BGY3REZXN0cm95KAotICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlEZWNDdHh0KTsKLSAgICAgICAgcENsaXBDdHh0LT5wVmlEZWNDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIGF1ZGlvIGRlY29kZXIgY29udGV4dCAgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQgKQotICAgIHsKLSAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdERlc3Ryb3lBdWRpb0RlYygKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwQ2xvc2U6IG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0RGVzdHJveUF1ZGlvRGVjIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgfQotCi0gICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBkZWNvZGVkIGF1ZGlvIGJ1ZmZlciAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyApCi0gICAgewotICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyk7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBdWRpbyBBVSBpcyBhbGxvY2F0ZWQgYnkgcmVhZGVyLgotICAgICogSWYgbm8gYXVkaW8gdHJhY2ssIGF1ZGlvIEFVIGlzIHNldCBhdCAnc2lsZW50JyAoU0lEKSBieSBWU1MuCi0gICAgKiBBcyBhIGNvbnNlcXVlbmNlLCBpZiBhdWRpbyBBVSBpcyBzZXQgdG8gJ3NpbGVudCcgKHN0YXRpYykKLSAgICBpdCBjYW4ndCBiZSBmcmVlIHVubGVzcyBpdCBpcyBzZXQgdG8gTlVMTCAqLwotICAgIGlmKCAoIChNNE9TQV9NZW1BZGRyOClNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4Ci0gICAgICAgID09IHBDbGlwQ3R4dC0+QXVkaW9BVS5tX2RhdGFBZGRyZXNzKQotICAgICAgICB8fCAoKE00T1NBX01lbUFkZHI4KXBDbGlwQ3R4dC0+cFNpbGVuY2VGcmFtZURhdGEKLSAgICAgICAgPT0gcENsaXBDdHh0LT5BdWRpb0FVLm1fZGF0YUFkZHJlc3MpICkKLSAgICB7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9BVS5tX2RhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0ICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENsb3NlIHRoZSAzR1BQIG9yIE1QMyByZWFkZXIgKi8KLSAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdENsb3NlKAotICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwQ2xvc2UoKTogbV9wUmVhZGVyLT5tX3BGY3RDbG9zZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBEZXN0cm95IHRoZSAzR1BQIG9yIE1QMyByZWFkZXIgY29udGV4dCAqLwotICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0RGVzdHJveSgKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcENsb3NlKCk6IG1fcFJlYWRlci0+bV9wRmN0RGVzdHJveSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgIH0KLQotICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9pbnRDbGlwQ2xvc2UoQ3R4dD0weCV4KTogcmV0dXJuaW5nIE00Tk9fRVJST1IiLAotICAgICAgICBwQ2xpcEN0eHQpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKCBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCApCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1IsIGVycjI7Ci0KLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBDdHh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBDbGVhblVwOiBwQ2xpcEN0eHQgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSB2aWRlbyBkZWNvZGVyIGNvbnRleHQgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBWaURlY0N0eHQgKQotICAgIHsKLSAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdERlc3Ryb3koCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaURlY0N0eHQpOwotICAgICAgICBwQ2xpcEN0eHQtPnBWaURlY0N0eHQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgYXVkaW8gZGVjb2RlciBjb250ZXh0ICAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCApCi0gICAgewotICAgICAgICBlcnIyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdERlc3Ryb3lBdWRpb0RlYygKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyMiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcENsZWFuVXA6IG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0RGVzdHJveUF1ZGlvRGVjIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgZXJyID0gZXJyMjsKLSAgICAgICAgfQotCi0gICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBkZWNvZGVkIGF1ZGlvIGJ1ZmZlciAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyApCi0gICAgewotICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyk7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBdWRpbyBBVSBpcyBhbGxvY2F0ZWQgYnkgcmVhZGVyLgotICAgICogSWYgbm8gYXVkaW8gdHJhY2ssIGF1ZGlvIEFVIGlzIHNldCBhdCAnc2lsZW50JyAoU0lEKSBieSBWU1MuCi0gICAgKiBBcyBhIGNvbnNlcXVlbmNlLCBpZiBhdWRpbyBBVSBpcyBzZXQgdG8gJ3NpbGVudCcgKHN0YXRpYykKLSAgICBpdCBjYW4ndCBiZSBmcmVlIHVubGVzcyBpdCBpcyBzZXQgdG8gTlVMTCAqLwotICAgIGlmKCAoIChNNE9TQV9NZW1BZGRyOClNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4Ci0gICAgICAgID09IHBDbGlwQ3R4dC0+QXVkaW9BVS5tX2RhdGFBZGRyZXNzKQotICAgICAgICB8fCAoKE00T1NBX01lbUFkZHI4KXBDbGlwQ3R4dC0+cFNpbGVuY2VGcmFtZURhdGEKLSAgICAgICAgPT0gcENsaXBDdHh0LT5BdWRpb0FVLm1fZGF0YUFkZHJlc3MpICkKLSAgICB7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9BVS5tX2RhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0ICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENsb3NlIHRoZSAzR1BQIG9yIE1QMyByZWFkZXIgKi8KLSAgICAgICAgZXJyMiA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RDbG9zZSgKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVycjIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKCk6IG1fcFJlYWRlci0+bV9wRmN0Q2xvc2UgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIGVyciA9IGVycjI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBEZXN0cm95IHRoZSAzR1BQIG9yIE1QMyByZWFkZXIgY29udGV4dCAqLwotICAgICAgICBlcnIyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdERlc3Ryb3koCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcCgpOiBtX3BSZWFkZXItPm1fcEZjdERlc3Ryb3kgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIGVyciA9IGVycjI7Ci0gICAgICAgIH0KLQotICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZihwQ2xpcEN0eHQtPnBQbGFuZVl1diAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIGlmKHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnBhY19kYXRhICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXZbMF0ucGFjX2RhdGEpOwotICAgICAgICAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXYpOwotICAgICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1diA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYocENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0ICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgaWYocENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzBdLnBhY19kYXRhICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3QpOwotICAgICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3QgPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIHNoZWxscyBpbnRlcmZhY2VzICovCi0gICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxXcml0ZXJzKCZwQ2xpcEN0eHQtPlNoZWxsQVBJKTsKLSAgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbEVuY29kZXJzKCZwQ2xpcEN0eHQtPlNoZWxsQVBJKTsKLSAgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbFJlYWRlcnMoJnBDbGlwQ3R4dC0+U2hlbGxBUEkpOwotICAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsRGVjb2RlcnMoJnBDbGlwQ3R4dC0+U2hlbGxBUEkpOwotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcDogcENsaXBDdHh0PTB4JXgiLCBwQ2xpcEN0eHQpOwotICAgIC8qKgotICAgICogRnJlZSB0aGUgY2xpcCBjb250ZXh0ICovCi0gICAgZnJlZShwQ2xpcEN0eHQpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9VSW50MzIgTTRWU1MzR1BQX2ludEdldEZyYW1lU2l6ZV9BTVJOQigpCi0gKiBAYnJpZWYgICBSZXR1cm4gdGhlIGxlbmd0aCwgaW4gYnl0ZXMsIG9mIHRoZSBBTVIgTmFycm93LUJhbmQgZnJhbWUgY29udGFpbmVkIGluIHRoZSBnaXZlbiBidWZmZXIKLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQXVkaW9GcmFtZSAgIChJTikgQU1STkIgZnJhbWUKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6IE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotTTRPU0FfVUludDMyIE00VlNTM0dQUF9pbnRHZXRGcmFtZVNpemVfQU1STkIoIE00T1NBX01lbUFkZHI4IHBBdWRpb0ZyYW1lICkKLXsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVTaXplID0gMDsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVUeXBlID0gKCAoICpwQXVkaW9GcmFtZSkgJigweEYgPDwgMykpID4+IDM7Ci0KLSAgICBzd2l0Y2goIGZyYW1lVHlwZSApCi0gICAgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSA5NTsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgNDc1MCBicHMgKi8KLQotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAxMDM7Ci0gICAgICAgICAgICBicmVhazsgLyogIDUxNTAgYnBzICovCi0KLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgZnJhbWVTaXplID0gMTE4OwotICAgICAgICAgICAgYnJlYWs7IC8qICA1OTAwIGJwcyAqLwotCi0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDEzNDsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgNjcwMCBicHMgKi8KLQotICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAxNDg7Ci0gICAgICAgICAgICBicmVhazsgLyogIDc0MDAgYnBzICovCi0KLSAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgZnJhbWVTaXplID0gMTU5OwotICAgICAgICAgICAgYnJlYWs7IC8qICA3OTUwIGJwcyAqLwotCi0gICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDIwNDsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAxMDIwMCBicHMgKi8KLQotICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAyNDQ7Ci0gICAgICAgICAgICBicmVhazsgLyogMTIwMDAgYnBzICovCi0KLSAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgZnJhbWVTaXplID0gMzk7Ci0gICAgICAgICAgICBicmVhazsgLyogU0lEIChTaWxlbmNlKSAqLwotCi0gICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAwOwotICAgICAgICAgICAgYnJlYWs7IC8qIE5vIGRhdGEgKi8KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRHZXRGcmFtZVNpemVfQU1STkIoKTogQ29ycnVwdGVkIEFNUiBmcmFtZSEgcmV0dXJuaW5nIDAuIik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gKDEgKyAoKCBmcmFtZVNpemUgKyA3KSAvIDgpKTsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9VSW50MzIgTTRWU1MzR1BQX2ludEdldEZyYW1lU2l6ZV9FVlJDKCkKLSAqIEBicmllZiAgIFJldHVybiB0aGUgbGVuZ3RoLCBpbiBieXRlcywgb2YgdGhlIEVWUkMgZnJhbWUgY29udGFpbmVkIGluIHRoZSBnaXZlbiBidWZmZXIKLSAqIEBub3RlCi0gKiAgICAgMCAxIDIgMwotICogICAgKy0rLSstKy0rCi0gKiAgICB8ZnIgdHlwZXwgICAgICAgICAgICAgIFJGQyAzNTU4Ci0gKiAgICArLSstKy0rLSsKLSAqCi0gKiBGcmFtZSBUeXBlOiA0IGJpdHMKLSAqICAgIFRoZSBmcmFtZSB0eXBlIGluZGljYXRlcyB0aGUgdHlwZSBvZiB0aGUgY29ycmVzcG9uZGluZyBjb2RlYyBkYXRhCi0gKiAgICBmcmFtZSBpbiB0aGUgUlRQIHBhY2tldC4KLSAqCi0gKiBGb3IgRVZSQyBhbmQgU01WIGNvZGVjcywgdGhlIGZyYW1lIHR5cGUgdmFsdWVzIGFuZCBzaXplIG9mIHRoZQotICogYXNzb2NpYXRlZCBjb2RlYyBkYXRhIGZyYW1lIGFyZSBkZXNjcmliZWQgaW4gdGhlIHRhYmxlIGJlbG93OgotICoKLSAqIFZhbHVlICAgUmF0ZSAgICAgIFRvdGFsIGNvZGVjIGRhdGEgZnJhbWUgc2l6ZSAoaW4gb2N0ZXRzKQotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgIDAgICAgIEJsYW5rICAgICAgMCAgICAoMCBiaXQpCi0gKiAgIDEgICAgIDEvOCAgICAgICAgMiAgICAoMTYgYml0cykKLSAqICAgMiAgICAgMS80ICAgICAgICA1ICAgICg0MCBiaXRzOyBub3QgdmFsaWQgZm9yIEVWUkMpCi0gKiAgIDMgICAgIDEvMiAgICAgICAxMCAgICAoODAgYml0cykKLSAqICAgNCAgICAgMSAgICAgICAgIDIyICAgICgxNzEgYml0czsgNSBwYWRkZWQgYXQgZW5kIHdpdGggemVyb3MpCi0gKiAgIDUgICAgIEVyYXN1cmUgICAgMCAgICAoU0hPVUxEIE5PVCBiZSB0cmFuc21pdHRlZCBieSBzZW5kZXIpCi0gKgotICogQHBhcmFtICAgcENwQXVkaW9GcmFtZSAgIChJTikgRVZSQyBmcmFtZQotICogQHJldHVybiAgTTROT19FUlJPUjogTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfVUludDMyIE00VlNTM0dQUF9pbnRHZXRGcmFtZVNpemVfRVZSQyggTTRPU0FfTWVtQWRkcjggcEF1ZGlvRnJhbWUgKQotewotICAgIE00T1NBX1VJbnQzMiBmcmFtZVNpemUgPSAwOwotICAgIE00T1NBX1VJbnQzMiBmcmFtZVR5cGUgPSAoICpwQXVkaW9GcmFtZSkgJjB4MEY7Ci0KLSAgICBzd2l0Y2goIGZyYW1lVHlwZSApCi0gICAgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAwOwotICAgICAgICAgICAgYnJlYWs7IC8qICBibGFuayAqLwotCi0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDE2OwotICAgICAgICAgICAgYnJlYWs7IC8qICAxLzggKi8KLQotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSA0MDsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgMS80ICovCi0KLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgZnJhbWVTaXplID0gODA7Ci0gICAgICAgICAgICBicmVhazsgLyogIDEvMiAqLwotCi0gICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDE3MTsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgMSAqLwotCi0gICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDA7Ci0gICAgICAgICAgICBicmVhazsgLyogIGVyYXN1cmUgKi8KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRHZXRGcmFtZVNpemVfRVZSQygpOiBDb3JydXB0ZWQgRVZSQyBmcmFtZSEgcmV0dXJuaW5nIDAuIik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gKDEgKyAoKCBmcmFtZVNpemUgKyA3KSAvIDgpKTsKLX0KLQotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDaGVja0FuZEdldENvZGVjQWFjUHJvcGVydGllcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0KSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNEFEX0J1ZmZlciBvdXRwdXRCdWZmZXI7Ci0gICAgdWludDMyX3Qgb3B0aW9uVmFsdWUgPTA7Ci0KLSAgICAvLyBEZWNvZGUgZmlyc3QgYXVkaW8gZnJhbWUgZnJvbSBjbGlwIHRvIGdldCBwcm9wZXJ0aWVzIGZyb20gY29kZWMKLQotICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYygKLSAgICAgICAgICAgICAgICAgICAgJnBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0sICYocENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzKSk7Ci0KLSAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uQXVkaW9EZWMoCi0gICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCwgTTRBRF9rT3B0aW9uSURfM2dwUmVhZGVySW50ZXJmYWNlLAotICAgICAoTTRPU0FfRGF0YU9wdGlvbikgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXJEYXRhSXQpOwotCi0gICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbkF1ZGlvRGVjKAotICAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsIE00QURfa09wdGlvbklEX0F1ZGlvQVUsCi0gICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmcENsaXBDdHh0LT5BdWRpb0FVKTsKLQotICAgIGlmKCBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RhcnRBdWRpb0RlYyAhPSBNNE9TQV9OVUxMICkgewotCi0gICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTdGFydEF1ZGlvRGVjKAotICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0KTsKLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkgewotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrQW5kR2V0Q29kZWNBYWNQcm9wZXJ0aWVzOiBcCi0gICAgICAgICAgICAgICAgIG1fcEZjdFN0YXJ0QXVkaW9EZWMgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEFsbG9jYXRlIG91dHB1dCBidWZmZXIgZm9yIHRoZSBhdWRpbyBkZWNvZGVyICovCi0gICAgb3V0cHV0QnVmZmVyLm1fYnVmZmVyU2l6ZSA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2J5dGVGcmFtZUxlbmd0aAotICAgICAgICAqIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2J5dGVTYW1wbGVTaXplCi0gICAgICAgICogcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fbmJDaGFubmVsczsKLQotICAgIGlmKCBvdXRwdXRCdWZmZXIubV9idWZmZXJTaXplID4gMCApIHsKLQotICAgICAgICBvdXRwdXRCdWZmZXIubV9kYXRhQWRkcmVzcyA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKG91dHB1dEJ1ZmZlci5tX2J1ZmZlclNpemUgXAotICAgICAgICAgICAgKnNpemVvZihzaG9ydCksIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikib3V0cHV0QnVmZmVyLm1fYnVmZmVyU2l6ZSIpOwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMID09IG91dHB1dEJ1ZmZlci5tX2RhdGFBZGRyZXNzICkgewotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrQW5kR2V0Q29kZWNBYWNQcm9wZXJ0aWVzKCk6XAotICAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgb3V0cHV0QnVmZmVyLm1fZGF0YUFkZHJlc3MiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTdGVwQXVkaW9EZWMoCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsIE00T1NBX05VTEwsICZvdXRwdXRCdWZmZXIsIE00T1NBX0ZBTFNFKTsKLQotICAgIGlmICggZXJyID09IE00V0FSX0lORk9fRk9STUFUX0NIQU5HRSApIHsKLQotICAgICAgICAvLyBHZXQgdGhlIHByb3BlcnRpZXMgZnJvbSBjb2RlYyBub2RlCi0gICAgICAgIHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RHZXRPcHRpb25BdWRpb0RlYygKLSAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgICAgTTRBRF9rT3B0aW9uSURfQXVkaW9OYkNoYW5uZWxzLCAoTTRPU0FfRGF0YU9wdGlvbikgJm9wdGlvblZhbHVlKTsKLQotICAgICAgICBwQ2xpcEN0eHQtPkFhY1Byb3BlcnRpZXMuYU51bUNoYW4gPSBvcHRpb25WYWx1ZTsKLSAgICAgICAgLy8gUmVzZXQgUmVhZGVyIHN0cnVjdHVyZSB2YWx1ZSBhbHNvCi0gICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHMgPSBvcHRpb25WYWx1ZTsKLQotICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0R2V0T3B0aW9uQXVkaW9EZWMoCi0gICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsCi0gICAgICAgICAgTTRBRF9rT3B0aW9uSURfQXVkaW9TYW1wRnJlcXVlbmN5LCAoTTRPU0FfRGF0YU9wdGlvbikgJm9wdGlvblZhbHVlKTsKLQotICAgICAgICBwQ2xpcEN0eHQtPkFhY1Byb3BlcnRpZXMuYVNhbXBGcmVxID0gb3B0aW9uVmFsdWU7Ci0gICAgICAgIC8vIFJlc2V0IFJlYWRlciBzdHJ1Y3R1cmUgdmFsdWUgYWxzbwotICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA9IG9wdGlvblZhbHVlOwotCi0gICAgfSBlbHNlIGlmKCBlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludENoZWNrQW5kR2V0Q29kZWNBYWNQcm9wZXJ0aWVzOlwKLSAgICAgICAgICAgIG1fcEZjdFN0ZXBBdWRpb0RlYyByZXR1cm5zIGVyciA9IDB4JXgiLCBlcnIpOwotICAgIH0KLQotICAgIGZyZWUob3V0cHV0QnVmZmVyLm1fZGF0YUFkZHJlc3MpOwotCi0gICAgLy8gUmVzZXQgdGhlIHN0cmVhbSByZWFkZXIKLSAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0UmVzZXQoCi0gICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgIChNNF9TdHJlYW1IYW5kbGVyICopcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0pOwotCi0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50Q2hlY2tBbmRHZXRDb2RlY0FhY1Byb3BlcnRpZXNcCi0gICAgICAgICAgICBFcnJvciBpbiByZXNldGluZyByZWFkZXI6IDB4JXgiLCBlcnIpOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci0KLX0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0NsaXBBbmFseXNpcy5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfQ2xpcEFuYWx5c2lzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUyYzZkN2EuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfQ2xpcEFuYWx5c2lzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFZTUzNHUFBfQ2xpcEFuYWx5c2lzLmMKLSAqIEBicmllZiAgICBJbXBsZW1lbnRhdGlvbiBvZiBmdW5jdGlvbnMgcmVsYXRlZCB0byBhbmFseXNpcyBvZiBpbnB1dCBjbGlwcwotICogQG5vdGUgICAgQWxsIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUgYXJlIHN0YXRpYywgaS5lLiBub24gcHVibGljCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotLyoqKioqKioqKioqKioqKiovCi0vKioqIEluY2x1ZGVzICoqKi8KLS8qKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotLyoqCi0gKiAgICBPdXIgaGVhZGVycyAqLwotI2luY2x1ZGUgIk00VlNTM0dQUF9BUEkuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfRXJyb3JDb2Rlcy5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbFR5cGVzLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsRnVuY3Rpb25zLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsQ29uZmlnLmgiCi0jaW5jbHVkZSAiTTRWRF9FWFRFUk5BTF9JbnRlcmZhY2UuaCIKLQotCi0vKioKLSAqICAgIE9TQUwgaGVhZGVycyAqLwotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIiAvKiBPU0FMIG1lbW9yeSBtYW5hZ2VtZW50ICovCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIgIC8qIE9TQUwgZGVidWcgbWFuYWdlbWVudCAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdEFuYWx5c2VDbGlwKCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGFsbG93cyBjaGVja2luZyBpZiBhIGNsaXAgaXMgY29tcGF0aWJsZSB3aXRoIFZTUyAzR1BQIGVkaXRpbmcKLSAqIEBub3RlICAgIEl0IGFsc28gZmlsbHMgYSBDbGlwQW5hbHlzaXMgc3RydWN0dXJlLCB3aGljaCBjYW4gYmUgdXNlZCB0byBjaGVjayBpZiB0d28KLSAqICAgICAgICBjbGlwcyBhcmUgY29tcGF0aWJsZQotICogQHBhcmFtICAgIHBDbGlwICAgICAgICAgICAgICAgIChJTikgRmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBpbnB1dCAzR1BQL01QMyBjbGlwIGZpbGUuCi0gKiBAcGFyYW0gICAgcENsaXBQcm9wZXJ0aWVzICAgICAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBDbGlwUHJvcGVydGllcyBzdHJ1Y3R1cmUuCi0gKiBAcGFyYW0gICAgRmlsZVR5cGUgICAgICAgICAgICAoSU4pIFR5cGUgb2YgdGhlIGlucHV0IGZpbGUgKC4zZ3AsIC5hbXIsIC5tcDMpCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9IMjYzX1BST0ZJTEVfTk9UX1NVUFBPUlRFRAotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQX0FOQUxZU0lTX1ZFUlNJT04KLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX0FNUl9FRElUSU5HX1VOU1VQUE9SVEVECi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0gyNjNfUFJPRklMRQotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9NUEVHNF9QUk9GSUxFCi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX01QRUc0X1JWTEMKLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX1ZJREVPX0ZPUk1BVAotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfRURJVElOR19OT19TVVBQT1JURURfVklERU9fU1RSRUFNX0lOX0ZJTEUKLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfQVVESU9fRk9STUFUCi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9FRElUSU5HX05PX1NVUFBPUlRFRF9TVFJFQU1fSU5fRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcCggTTRPU0FfVm9pZCAqcENsaXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSBGaWxlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwQ2xpcFByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIgKnBGaWxlUmVhZFB0ckZjdCApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ29udGV4dDsKLSAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzIENsaXBTZXR0aW5nczsKLQotICAgIE00T1NBX1RSQUNFM18yKAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcCBjYWxsZWQgd2l0aCBwQ2xpcD0weCV4LCBwQ2xpcFByb3BlcnRpZXM9MHgleCIsCi0gICAgICAgIHBDbGlwLCBwQ2xpcFByb3BlcnRpZXMpOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdEFuYWx5c2VDbGlwOiBwQ2xpcCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDbGlwUHJvcGVydGllcyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0QW5hbHlzZUNsaXA6IHBDbGlwUHJvcGVydGllcyBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKioKLSAgICAqIEJ1aWxkIGR1bW15IGNsaXAgc2V0dGluZ3MsIGluIG9yZGVyIHRvIHVzZSB0aGUgZWRpdENsaXBPcGVuIGZ1bmN0aW9uICovCi0gICAgQ2xpcFNldHRpbmdzLnBGaWxlID0gcENsaXA7Ci0gICAgQ2xpcFNldHRpbmdzLkZpbGVUeXBlID0gRmlsZVR5cGU7Ci0gICAgQ2xpcFNldHRpbmdzLnVpQmVnaW5DdXRUaW1lID0gMDsKLSAgICBDbGlwU2V0dGluZ3MudWlFbmRDdXRUaW1lID0gMDsKLQotICAgIC8qIENsaXAgcHJvcGVydGllcyBub3QgYnVpbGQgeWV0LCBzZXQgYXQgbGVhc3QgdGhpcyBmbGFnICovCi0gICAgQ2xpcFNldHRpbmdzLkNsaXBQcm9wZXJ0aWVzLmJBbmFseXNlZCA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyoqCi0gICAgKiBPcGVuIHRoZSBjbGlwIGluIGZhc3Qgb3BlbiBtb2RlICovCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBJbml0KCZwQ2xpcENvbnRleHQsIHBGaWxlUmVhZFB0ckZjdCk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcDogTTRWU1MzR1BQX2ludENsaXBJbml0KCkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEZyZWUgdGhlIGNsaXAgKi8KLSAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDb250ZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKHBDbGlwQ29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcE9wZW4ocENsaXBDb250ZXh0LCAmQ2xpcFNldHRpbmdzLCBNNE9TQV9GQUxTRSwKLSAgICAgICAgTTRPU0FfVFJVRSwgTTRPU0FfVFJVRSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcDogTTRWU1MzR1BQX2ludENsaXBPcGVuKCkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotCi0gICAgICAgIE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChwQ2xpcENvbnRleHQpOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEhlcmUgaXQgaXMgYmV0dGVyIHRvIHJldHVybiB0aGUgRWRpdGluZyBzcGVjaWZpYyBlcnJvciBjb2RlICovCi0gICAgICAgIGlmKCAoICgoTTRPU0FfVUludDMyKU00RVJSX0RFQ09ERVJfSDI2M19QUk9GSUxFX05PVF9TVVBQT1JURUQpID09IGVycikKLSAgICAgICAgICAgIHx8ICgoKE00T1NBX1VJbnQzMilNNEVSUl9ERUNPREVSX0gyNjNfTk9UX0JBU0VMSU5FKSA9PSBlcnIpICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0QW5hbHlzZUNsaXA6XAotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwT3BlbigpIHJldHVybnMgTTRWU1MzR1BQX0VSUl9IMjYzX1BST0ZJTEVfTk9UX1NVUFBPUlRFRCIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSDI2M19QUk9GSUxFX05PVF9TVVBQT1JURUQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEFuYWx5c2UgdGhlIGNsaXAgKi8KLSAgICBpZihNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODggIT0gcENsaXBDb250ZXh0LT5wU2V0dGluZ3MtPkZpbGVUeXBlKSB7Ci0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzKHBDbGlwQ29udGV4dCwgcENsaXBQcm9wZXJ0aWVzKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcDogTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMoKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogRnJlZSB0aGUgY2xpcCAqLwotICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKHBDbGlwQ29udGV4dCk7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qKgotICAgICogRnJlZSB0aGUgY2xpcCAqLwotICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwQ2xvc2UocENsaXBDb250ZXh0KTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdEFuYWx5c2VDbGlwOiBNNFZTU19pbnRDbGlwQ2xvc2UoKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChwQ2xpcENvbnRleHQpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChwQ2xpcENvbnRleHQpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayB0aGUgY2xpcCBpcyBjb21wYXRpYmxlIHdpdGggVlNTIGVkaXRpbmcgKi8KLSAgICBpZihNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODggIT0gQ2xpcFNldHRpbmdzLkZpbGVUeXBlKSB7Ci0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDaGVja0NsaXBDb21wYXRpYmxlV2l0aFZzc0VkaXRpbmcocENsaXBQcm9wZXJ0aWVzKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcDpcCi0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENoZWNrQ2xpcENvbXBhdGlibGVXaXRoVnNzRWRpdGluZygpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHkoKQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIGNoZWNraW5nIGlmIHR3byBjbGlwcyBhcmUgY29tcGF0aWJsZSB3aXRoIGVhY2ggb3RoZXIgZm9yCi0gKiAgICAgICAgVlNTIDNHUFAgZWRpdGluZyBhc3NlbWJseSBmZWF0dXJlLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ2xpcDFQcm9wZXJ0aWVzICAgICAgICAoSU4pIENsaXAgYW5hbHlzaXMgb2YgdGhlIGZpcnN0IGNsaXAKLSAqIEBwYXJhbSAgICBwQ2xpcDJQcm9wZXJ0aWVzICAgICAgICAoSU4pIENsaXAgYW5hbHlzaXMgb2YgdGhlIHNlY29uZCBjbGlwCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQX0FOQUxZU0lTX1ZFUlNJT04KLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fRk9STUFUCi0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX0ZSQU1FX1NJWkUKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fVElNRV9TQ0FMRQotICogQHJldHVybiAgICBNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19EQVRBX1BBUlRJVElPTklORwotICogQHJldHVybiAgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9NUDNfQVNTRU1CTFkKLSAqIEByZXR1cm4gIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfVklERU9fRk9STUFUCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHkoIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwQ2xpcDFQcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgKnBDbGlwMlByb3BlcnRpZXMgKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX0VSUiB2aWRlb19lcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX0VSUiBhdWRpb19lcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgTTRPU0FfQm9vbCBiQ2xpcDFJc0FBQyA9IE00T1NBX0ZBTFNFOwotICAgIE00T1NBX0Jvb2wgYkNsaXAySXNBQUMgPSBNNE9TQV9GQUxTRTsKLQotICAgIE00T1NBX1RSQUNFM18yKCJNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHkgY2FsbGVkIHdpdGggcENsaXAxQW5hbHlzaXM9MHgleCxcCi0gICAgICAgICAgICAgICAgICAgcENsaXAyQW5hbHlzaXM9MHgleCIsIHBDbGlwMVByb3BlcnRpZXMsIHBDbGlwMlByb3BlcnRpZXMpOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXAxUHJvcGVydGllcyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2hlY2tDbGlwQ29tcGF0aWJpbGl0eTogcENsaXAxUHJvcGVydGllcyBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDbGlwMlByb3BlcnRpZXMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHk6IHBDbGlwMlByb3BlcnRpZXMgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgaWYoICggTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QMyA9PSBwQ2xpcDFQcm9wZXJ0aWVzLT5GaWxlVHlwZSkKLSAgICAgICAgfHwgKE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BTVIgPT0gcENsaXAxUHJvcGVydGllcy0+RmlsZVR5cGUpICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQ2xpcDFQcm9wZXJ0aWVzICE9IHBDbGlwMlByb3BlcnRpZXMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRDaGVja0NsaXBDb21wYXRpYmlsaXR5OiBNUDMgQ0FOIE9OTFkgQkUgQ1VULFwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9NUDNfQVNTRU1CTFkiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX01QM19BU1NFTUJMWTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFdlIGFyZSBpbiBWU1MgU3BsaXR0ZXIgbW9kZSAqLwotICAgICAgICAgICAgZ290byBhdWRpb19hbmFseXNpczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKioqKioqKioqIEF1ZGlvICoqKioqKioqKioqKi8KLQotYXVkaW9fYW5hbHlzaXM6Ci0gICAgaWYoIE00VklERU9FRElUSU5HX2tOb25lQXVkaW8gIT0gcENsaXAxUHJvcGVydGllcy0+Ci0gICAgICAgIEF1ZGlvU3RyZWFtVHlwZSApIC8qKjwgaWYgdGhlcmUgaXMgYW4gYXVkaW8gc3RyZWFtICovCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayBhdWRpbyBmb3JtYXQgaXMgQUFDICovCi0gICAgICAgIHN3aXRjaCggcENsaXAxUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDOgotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDcGx1czoKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa2VBQUNwbHVzOgotICAgICAgICAgICAgICAgIGJDbGlwMUlzQUFDID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiggTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbyAhPSBwQ2xpcDJQcm9wZXJ0aWVzLT4KLSAgICAgICAgQXVkaW9TdHJlYW1UeXBlICkgLyoqPCBpZiB0aGVyZSBpcyBhbiBhdWRpbyBzdHJlYW0gKi8KLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIGF1ZGlvIGZvcm1hdCBpcyBBQUMgKi8KLSAgICAgICAgc3dpdGNoKCBwQ2xpcDJQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUM6Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUNwbHVzOgotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rZUFBQ3BsdXM6Ci0gICAgICAgICAgICAgICAgYkNsaXAySXNBQUMgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogSWYgdGhlcmUgaXMgbm8gYXVkaW8sIHRoZSBjbGlwcyBhcmUgY29tcGF0aWJsZXMgLi4uICovCi0gICAgaWYoICggcENsaXAxUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlICE9IE00VklERU9FRElUSU5HX2tOb25lQXVkaW8pCi0gICAgICAgICYmIChwQ2xpcDJQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgIT0gTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbykgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgYm90aCBjbGlwcyBoYXZlIHNhbWUgYXVkaW8gc3RyZWFtIHR5cGUKLSAgICAgICAgKiBBbmQgbGV0X3Mgc2F5IEFBQywgQUFDKyBhbmQgZUFBQysgYXJlIG1peGFibGUgKi8KLSAgICAgICAgaWYoICggcENsaXAxUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICAhPSBwQ2xpcDJQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUpCi0gICAgICAgICAgICAmJiAoKCBNNE9TQV9GQUxTRSA9PSBiQ2xpcDFJc0FBQykgfHwgKE00T1NBX0ZBTFNFID09IGJDbGlwMklzQUFDKSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRDaGVja0NsaXBDb21wYXRpYmlsaXR5OlwKLSAgICAgICAgICAgICAgICBDbGlwcyBkb24ndCBoYXZlIHRoZSBzYW1lIEF1ZGlvIFN0cmVhbSBUeXBlIik7Ci0KLSAgICAgICAgICAgIGF1ZGlvX2VyciA9IE00VlNTM0dQUF9XQVJfSU5DT01QQVRJQkxFX0FVRElPX1NUUkVBTV9UWVBFOwotICAgICAgICAgICAgZ290byBhbmFseXNpc19kb25lOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgYm90aCBjbGlwcyBoYXZlIHNhbWUgbnVtYmVyIG9mIGNoYW5uZWxzICovCi0gICAgICAgIGlmKCBwQ2xpcDFQcm9wZXJ0aWVzLT51aU5iQ2hhbm5lbHMgIT0gcENsaXAyUHJvcGVydGllcy0+dWlOYkNoYW5uZWxzICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2hlY2tDbGlwQ29tcGF0aWJpbGl0eTogQ2xpcHMgZG9uJ3QgaGF2ZSB0aGUgc2FtZSBOYiBvZiBDaGFubmVscyIpOwotICAgICAgICAgICAgYXVkaW9fZXJyID0gTTRWU1MzR1BQX1dBUl9JTkNPTVBBVElCTEVfQVVESU9fTkJfT0ZfQ0hBTk5FTFM7Ci0gICAgICAgICAgICBnb3RvIGFuYWx5c2lzX2RvbmU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayBib3RoIGNsaXBzIGhhdmUgc2FtZSBzYW1wbGluZyBmcmVxdWVuY3kgKi8KLSAgICAgICAgaWYoIHBDbGlwMVByb3BlcnRpZXMtPnVpU2FtcGxpbmdGcmVxdWVuY3kKLSAgICAgICAgICAgICE9IHBDbGlwMlByb3BlcnRpZXMtPnVpU2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRDaGVja0NsaXBDb21wYXRpYmlsaXR5OlwKLSAgICAgICAgICAgICAgICBDbGlwcyBkb24ndCBoYXZlIHRoZSBzYW1lIFNhbXBsaW5nIEZyZXF1ZW5jeSIpOwotICAgICAgICAgICAgYXVkaW9fZXJyID0gTTRWU1MzR1BQX1dBUl9JTkNPTVBBVElCTEVfQVVESU9fU0FNUExJTkdfRlJFUVVFTkNZOwotICAgICAgICAgICAgZ290byBhbmFseXNpc19kb25lOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcENsaXAyUHJvcGVydGllcy0+YkF1ZGlvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXAgPSBNNE9TQV9UUlVFOwotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotCi1hbmFseXNpc19kb25lOgotICAgIGlmKCB2aWRlb19lcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgIHJldHVybiB2aWRlb19lcnI7Ci0KLSAgICBpZiggYXVkaW9fZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICByZXR1cm4gYXVkaW9fZXJyOwotCi0gICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHkoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMoKQotICogQGJyaWVmICAgIEdldCB2aWRlbyBhbmQgYXVkaW8gcHJvcGVydGllcyBmcm9tIHRoZSBjbGlwIHN0cmVhbXMKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gbXVzdCByZXR1cm4gZmF0YWwgZXJyb3JzIG9ubHkgKGVycm9ycyB0aGF0IHNob3VsZCBub3QgaGFwcGVuCi0gKiAgICAgICAgaW4gdGhlIGZpbmFsIGludGVncmF0ZWQgcHJvZHVjdCkuCi0gKiBAcGFyYW0gICBwQ2xpcEN0eHQgICAgICAgICAgICAoSU4pIGludGVybmFsIGNsaXAgY29udGV4dAotICogQHBhcmFtICAgIHBDbGlwUHJvcGVydGllcyAgICAgICAgKE9VVCkgUG9pbnRlciB0byBhIHZhbGlkIENsaXBQcm9wZXJ0aWVzIHN0cnVjdHVyZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMoIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwQ2xpcFByb3BlcnRpZXMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRERUNPREVSX01QRUc0X0RlY29kZXJDb25maWdJbmZvIERlY0NvbmZpZ0luZm87Ci0gICAgTTRERUNPREVSX1ZpZGVvU2l6ZSBkdW1teVNpemU7Ci0gICAgTTRERUNPREVSX0FWQ1Byb2ZpbGVMZXZlbCBBVkNQcm9mbGU7Ci0KLSAgICBwQ2xpcFByb3BlcnRpZXMtPmJBbmFseXNlZCA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyoqCi0gICAgKiBSZXNldCB2aWRlbyBjaGFyYWN0ZXJpc3RpY3MgKi8KLSAgICBwQ2xpcFByb3BlcnRpZXMtPlZpZGVvU3RyZWFtVHlwZSA9IE00VklERU9FRElUSU5HX2tOb25lVmlkZW87Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT51aUNsaXBWaWRlb0R1cmF0aW9uID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9CaXRyYXRlID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9NYXhBdVNpemUgPSAwOwotICAgIHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb1dpZHRoID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9IZWlnaHQgPSAwOwotICAgIHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb1RpbWVTY2FsZSA9IDA7Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT5mQXZlcmFnZUZyYW1lUmF0ZSA9IDAuMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9Qcm9maWxlID0KLSAgICAgICAgTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9QUk9GSUxFOwotICAgIHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb0xldmVsID0KLSAgICAgICAgTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9MRVZFTDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPmJNUEVHNGRhdGFQYXJ0aXRpb24gPSBNNE9TQV9GQUxTRTsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPmJNUEVHNHJ2bGMgPSBNNE9TQV9GQUxTRTsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPmJNUEVHNHJlc3luY2hNYXJrZXIgPSBNNE9TQV9GQUxTRTsKLQotICAgIG1lbXNldCgodm9pZCAqKSAmcENsaXBQcm9wZXJ0aWVzLT5mdHlwLDAsCi0gICAgICAgIHNpemVvZihwQ2xpcFByb3BlcnRpZXMtPmZ0eXApKTsKLQotICAgIC8qKgotICAgICogVmlkZW8gQW5hbHlzaXMgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbSApCi0gICAgewotICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9XaWR0aCA9IHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX3ZpZGVvV2lkdGg7Ci0gICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb0hlaWdodCA9IHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX3ZpZGVvSGVpZ2h0OwotICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPmZBdmVyYWdlRnJhbWVSYXRlID0KLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX2F2ZXJhZ2VGcmFtZVJhdGU7Ci0KLSAgICAgICAgc3dpdGNoKCBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0OgotCi0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5WaWRlb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rTVBFRzQ7Ci0KLSAgIC8qIFRoaXMgaXNzdWUgaXMgc28gaW5jcmVkaWJseSBzdHVwaWQgdGhhdCBpdCdzIGRlcHJlc3NpbmcuIEJhc2ljYWxseSwgYSBmaWxlIGNhbiBiZSBhbmFseXNlZAotICAgb3V0c2lkZSBvZiBhbnkgY29udGV4dCAoYmVzaWRlcyB0aGF0IG9mIHRoZSBjbGlwIGl0c2VsZiksIHNvIHRoYXQgZm9yIGluc3RhbmNlIHR3byBjbGlwcyBjYW4KLSAgIGJlIGNoZWNrZWQgZm9yIGNvbXBhdGliaWxpdHkgYmVmb3JlIGFsbG9jYXRpbmcgYW4gZWRpdCBjb250ZXh0IGZvciBlZGl0aW5nIHRoZW0uIEJ1dCB0aGlzCi0gICBtZWFucyB0aGVyZSBpcyBubyB3YXkgaW4gaGVjayB0byBwYXNzIGFuIGV4dGVybmFsIHZpZGVvIGRlY29kZXIgKHRvIGJlZ2luIHdpdGgpIHRvIHRoaXMKLSAgIGZ1bmN0aW9uLCBhcyB0aGV5IHdvcmsgYnkgYmVpbmcgcmVnaXN0ZXJlZCBpbiBhbiBleGlzdGluZyBjb250ZXh0OyBmdXJ0aGVybW9yZSwgaXQgaXMgYWN0dWFsbHkKLSAgIHByZXR0eSBvdmVya2lsbCB0byB1c2UgYSBmdWxsIGRlY29kZXIgZm9yIHRoYXQsIG1vcmVzbyBhIEhBUkRXQVJFIGRlY29kZXIganVzdCB0byBnZXQgdGhlCi0gICBjbGlwIGNvbmZpZyBpbmZvLiBJbiBmYWN0LCB0aGUgaGFyZHdhcmUgaXRzZWxmIGRvZXNuJ3QgcHJvdmlkZSB0aGlzIHNlcnZpY2UsIGluIHRoZSBjYXNlIG9mIGEKLSAgIEhXIGRlY29kZXIsIHRoZSBzaGVsbCBidWlsZHMgdGhlIGNvbmZpZyBpbmZvIGl0c2VsZiwgc28gd2UgZG9uJ3QgbmVlZCB0aGUgYWN0dWFsIGRlY29kZXIsIG9ubHkKLSAgIGEgZGV0YWNoZWQgZnVuY3Rpb25hbGl0eSBvZiBpdC4gU28gaW4gY2FzZSBIVy9leHRlcm5hbCBkZWNvZGVycyBtYXkgYmUgcHJlc2VudCwgd2UgaW5zdGVhZCB1c2UKLSAgIGRpcmVjdGx5IHRoZSBEU0kgcGFyc2luZyBmdW5jdGlvbiBvZiB0aGUgc2hlbGwgSFcgZGVjb2RlciAod2hpY2ggd2Uga25vdyB0byBiZSBwcmVzZW50LCBzaW5jZQotICAgSFcgZGVjb2RlcnMgYXJlIHBvc3NpYmxlKSB0byBnZXQgdGhlIGNvbmZpZyBpbmZvLiBOb3RpY2UgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIGV2ZW4gaWYgdGhlCi0gICBzb2Z0d2FyZSBkZWNvZGVyIGlzIGFjdHVhbGx5IHByZXNlbnQgYW5kIGV2ZW4gaWYgaXQgd2lsbCBlbmQgdXAgYmVpbmcgYWN0dWFsbHkgdXNlZDogZmlndXJpbmcKLSAgIG91dCB0aGUgY29uZmlnIGRvZXMgbm90IGludm9sdmUgYWN0dWFsIGRlY29kaW5nIG5vciB0aGUgcGFydGljdWxhcml0aWVzIG9mIGEgc3BlY2lmaWMgZGVjb2RlciwKLSAgIGl0J3MgdGhlIGZhY3QgdGhhdCBpdCdzIE1QRUc0IHRoYXQgbWF0dGVycywgc28gaXQgc2hvdWxkIG5vdCBiZSBmdW5jdGlvbmFsbHkgYW55IGRpZmZlcmVudAotICAgZnJvbSB0aGUgd2F5IGl0IHdhcyBkb25lIGJlZm9yZSAoYW5kIGl0J3MgbGlnaHQgZW5vdWdoIGZvciBwZXJmb3JtYW5jZSBub3QgdG8gYmUgYW55IHByb2JsZW0KLSAgICAgICAgIHdoYXRzb2V2ZXIpLiAqLwotCi0gICAgICAgICAgICAgICAgZXJyID0gTTRERUNPREVSX0VYVEVSTkFMX1BhcnNlVmlkZW9EU0kocENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRlY0NvbmZpZ0luZm8sICZkdW1teVNpemUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX0VYVEVSTkFMX1BhcnNlVmlkZW9EU0kgcmV0dXJucyAweCUwOFgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb1RpbWVTY2FsZSA9Ci0gICAgICAgICAgICAgICAgICAgIERlY0NvbmZpZ0luZm8udWlUaW1lU2NhbGU7Ci0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5iTVBFRzRkYXRhUGFydGl0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgRGVjQ29uZmlnSW5mby5iRGF0YVBhcnRpdGlvbjsKLSAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPmJNUEVHNHJ2bGMgPQotICAgICAgICAgICAgICAgICAgICBEZWNDb25maWdJbmZvLmJVc2VPZlJWTEM7Ci0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5iTVBFRzRyZXN5bmNoTWFya2VyID0KLSAgICAgICAgICAgICAgICAgICAgRGVjQ29uZmlnSW5mby51aVVzZU9mUmVzeW5jaE1hcmtlcjsKLSAgICAgICAgICAgICAgICBlcnIgPSBnZXRNUEVHNFByb2ZpbGVBbmRMZXZlbChEZWNDb25maWdJbmZvLnVpUHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb1Byb2ZpbGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvTGV2ZWwpKTsKLSAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMoKTogXAotICAgICAgICAgICAgICAgICAgICAgICAgIGdldE1QRUc0UHJvZmlsZUFuZExldmVsIHJldHVybnMgMHglMDhYIiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVmlkZW9IMjYzOgotCi0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5WaWRlb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rSDI2MzsKLSAgICAgICAgICAgICAgICAvKiBIMjYzIHRpbWUgc2NhbGUgaXMgYWx3YXlzIDMwMDAwICovCi0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvVGltZVNjYWxlID0gMzAwMDA7Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSBnZXRIMjYzUHJvZmlsZUFuZExldmVsKHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9Qcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9MZXZlbCk7Ci0gICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50QnVpbGRBbmFseXNpcygpOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SDI2M1Byb2ZpbGVBbmRMZXZlbCByZXR1cm5zIDB4JTA4WCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmM6Ci0KLSAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPlZpZGVvU3RyZWFtVHlwZSA9IE00VklERU9FRElUSU5HX2tIMjY0OwotICAgICAgICAgICAgICAgIGVyciA9IGdldEFWQ1Byb2ZpbGVBbmRMZXZlbChwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvUHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvTGV2ZWwpOwotICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMoKTogXAotICAgICAgICAgICAgICAgICAgICAgICAgIGdldEFWQ1Byb2ZpbGVBbmRMZXZlbCByZXR1cm5zIDB4JTA4WCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXM6IHVua25vd24gaW5wdXQgdmlkZW8gZm9ybWF0ICgweCV4KSxcCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiIsCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUpOwotCi0gICAgICAgICAgICAgICAgIC8qKiBXZSBkbyBub3QgcmV0dXJuIGVycm9yIGhlcmUuCi0gICAgICAgICAgICAgICAgICAgKiAgVGhlIHZpZGVvIGZvcm1hdCBjb21wYXRpYmlsaXR5IGNoZWNrIHdpbGwgYmUgZG9uZSBsYXR0ZXIgKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlDbGlwVmlkZW9EdXJhdGlvbiA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKXBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2R1cmF0aW9uOwotICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9NYXhBdVNpemUgPQotICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplOwotCi0gICAgICAgIC8qIGlmIHZpZGVvIGJpdHJhdGUgbm90IGF2YWlsYWJsZSByZXRyaWV2ZSBhbiBlc3RpbWF0aW9uIG9mIHRoZSBvdmVyYWxsIGJpdHJhdGUgKi8KLSAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvQml0cmF0ZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKXBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fYXZlcmFnZUJpdFJhdGU7Ci0KLSAgICAgICAgaWYoIDAgPT0gcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvQml0cmF0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RHZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwgTTRSRUFERVJfa09wdGlvbklEX0JpdHJhdGUsCi0gICAgICAgICAgICAgICAgJnBDbGlwUHJvcGVydGllcy0+dWlWaWRlb0JpdHJhdGUpOwotCi0gICAgICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogd2UgZ2V0IHRoZSBvdmVyYWxsIGJpdHJhdGUsIHN1YnN0cmFjdCB0aGUgYXVkaW8gYml0cmF0ZSBpZiBhbnkgKi8KLSAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9CaXRyYXRlIC09Ci0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2F2ZXJhZ2VCaXRSYXRlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXNldCBhdWRpbyBjaGFyYWN0ZXJpc3RpY3MgKi8KLSAgICBwQ2xpcFByb3BlcnRpZXMtPkF1ZGlvU3RyZWFtVHlwZSA9IE00VklERU9FRElUSU5HX2tOb25lQXVkaW87Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT51aUNsaXBBdWRpb0R1cmF0aW9uID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpQXVkaW9CaXRyYXRlID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpQXVkaW9NYXhBdVNpemUgPSAwOwotICAgIHBDbGlwUHJvcGVydGllcy0+dWlOYkNoYW5uZWxzID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpU2FtcGxpbmdGcmVxdWVuY3kgPSAwOwotICAgIHBDbGlwUHJvcGVydGllcy0+dWlFeHRlbmRlZFNhbXBsaW5nRnJlcXVlbmN5ID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpRGVjb2RlZFBjbVNpemUgPSAwOwotCi0gICAgLyoqCi0gICAgKiBBdWRpbyBBbmFseXNpcyAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtICkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCggcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJOYXJyb3dCYW5kOgotCi0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rQU1SX05COwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjOgotCi0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rQUFDOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvTXAzOgotCi0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rTVAzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvRXZyYzoKLQotICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa0VWUkM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9QY206Ci0KLSAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPkF1ZGlvU3RyZWFtVHlwZSA9IE00VklERU9FRElUSU5HX2tQQ007Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzOiB1bmtub3duIGlucHV0IGF1ZGlvIGZvcm1hdCAoMHgleCksXAotICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiEiLAotICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgTTROT19FUlJPUjsgLyoqPCBXZSBkbyBub3QgcmV0dXJuIGVycm9yIGhlcmUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBhdWRpbyBmb3JtYXQgY29tcGF0aWJpbGl0eSBjaGVjayB3aWxsIGJlIGRvbmUgbGF0dGVyICovCi0gICAgICAgIH0KLQotICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpQXVkaW9NYXhBdVNpemUgPQotICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplOwotICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpQ2xpcEF1ZGlvRHVyYXRpb24gPQotICAgICAgICAgICAgKE00T1NBX1VJbnQzMilwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9kdXJhdGlvbjsKLQotICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpTmJDaGFubmVscyA9IHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHM7Ci0gICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9zYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aURlY29kZWRQY21TaXplID0KLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2J5dGVGcmFtZUxlbmd0aAotICAgICAgICAgICAgKiBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9ieXRlU2FtcGxlU2l6ZQotICAgICAgICAgICAgKiBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEJ1Z2ZpeCBQNE1FMDAwMDExMjg6IFdpdGggc29tZSBJTVRDIGZpbGVzLCB0aGUgQU1SIGJpdCByYXRlIGlzIDAga2JwcwotICAgICAgICBhY2NvcmRpbmcgdGhlIEdldFByb3BlcnRpZXMgZnVuY3Rpb24gKi8KLSAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKXBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT4KLSAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fYXZlcmFnZUJpdFJhdGU7Ci0KLSAgICAgICAgaWYoIDAgPT0gcENsaXBQcm9wZXJ0aWVzLT51aUF1ZGlvQml0cmF0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBNNFZJREVPRURJVElOR19rQU1SX05CID09IHBDbGlwUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqQmV0dGVyIHJldHVybmluZyBhIGd1ZXNzZWQgMTIuMiBrYnBzIHZhbHVlIHRoYW4gYSBzdXJlLXRvLWJlLWZhbHNlIDAga2JwcyB2YWx1ZSEqLwotICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlBdWRpb0JpdHJhdGUgPSBNNFZTUzNHUFBfQU1SX0RFRkFVTFRfQklUUkFURTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIE00VklERU9FRElUSU5HX2tFVlJDID09IHBDbGlwUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqQmV0dGVyIHJldHVybmluZyBhIGd1ZXNzZWQgOS4yIGticHMgdmFsdWUgdGhhbiBhIHN1cmUtdG8tYmUtZmFsc2UgMCBrYnBzIHZhbHVlISovCi0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FVlJDX0RFRkFVTFRfQklUUkFURTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0R2V0T3B0aW9uKAotICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LCBNNFJFQURFUl9rT3B0aW9uSURfQml0cmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgJnBDbGlwUHJvcGVydGllcy0+dWlBdWRpb0JpdHJhdGUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0gKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogd2UgZ2V0IHRoZSBvdmVyYWxsIGJpdHJhdGUsIHN1YnN0cmFjdCB0aGUgdmlkZW8gYml0cmF0ZSBpZiBhbnkgKi8KLSAgICAgICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aUF1ZGlvQml0cmF0ZSAtPSBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX2F2ZXJhZ2VCaXRSYXRlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIE5ldyBhYWMgcHJvcGVydGllcyAqLwotICAgICAgICBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMKLSAgICAgICAgICAgID09IHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpTmJDaGFubmVscyA9IHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hTnVtQ2hhbjsKLSAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFTYW1wRnJlcTsKLQotICAgICAgICAgICAgaWYoIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hU0JSUHJlc2VudCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rQUFDcGx1czsKLSAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpRXh0ZW5kZWRTYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hRXh0ZW5zaW9uU2FtcEZyZXE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBwQ2xpcEN0eHQtPkFhY1Byb3BlcnRpZXMuYVBTUHJlc2VudCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rZUFBQ3BsdXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBHZXQgJ2Z0eXAnIGF0b20gKi8KLSAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0R2V0T3B0aW9uKAotICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICBNNFJFQURFUl9rT3B0aW9uSURfM2dwRnR5cEJveCwgJnBDbGlwUHJvcGVydGllcy0+ZnR5cCk7Ci0KLSAgICAvKioKLSAgICAqIFdlIHdyaXRlIHRoZSBWU1MgM0dQUCB2ZXJzaW9uIGluIHRoZSBjbGlwIGFuYWx5c2lzIHRvIGJlIHN1cmUgdGhlIGludGVncmF0b3IgZG9lc24ndAotICAgICogbWl4IG9sZGVyIGFuYWx5c2lzIHJlc3VsdHMgd2l0aCBuZXdlciBsaWJyYXJpZXMgKi8KLSAgICBwQ2xpcFByb3BlcnRpZXMtPlZlcnNpb25bMF0gPSBNNFZJREVPRURJVElOR19WRVJTSU9OX01BSk9SOwotICAgIHBDbGlwUHJvcGVydGllcy0+VmVyc2lvblsxXSA9IE00VklERU9FRElUSU5HX1ZFUlNJT05fTUlOT1I7Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT5WZXJzaW9uWzJdID0gTTRWSURFT0VESVRJTkdfVkVSU0lPTl9SRVZJU0lPTjsKLQotICAgIHBDbGlwUHJvcGVydGllcy0+RmlsZVR5cGUgPSBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+RmlsZVR5cGU7Ci0KLSAgICBpZiggcENsaXBQcm9wZXJ0aWVzLT51aUNsaXBWaWRlb0R1cmF0aW9uCi0gICAgICAgID4gcENsaXBQcm9wZXJ0aWVzLT51aUNsaXBBdWRpb0R1cmF0aW9uICkKLSAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aUNsaXBEdXJhdGlvbiA9IHBDbGlwUHJvcGVydGllcy0+dWlDbGlwVmlkZW9EdXJhdGlvbjsKLSAgICBlbHNlCi0gICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlDbGlwRHVyYXRpb24gPSBwQ2xpcFByb3BlcnRpZXMtPnVpQ2xpcEF1ZGlvRHVyYXRpb247Ci0KLSAgICAvKiBSZXNldCBjb21wYXRpYmlsaXR5IGNoYXJ0ICovCi0gICAgcENsaXBQcm9wZXJ0aWVzLT5iVmlkZW9Jc0VkaXRhYmxlID0gTTRPU0FfRkFMU0U7Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0VkaXRhYmxlID0gTTRPU0FfRkFMU0U7Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT5iVmlkZW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcCA9IE00T1NBX0ZBTFNFOwotICAgIHBDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXAgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qIEFuYWx5c2lzIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgKi8KLSAgICBwQ2xpcFByb3BlcnRpZXMtPmJBbmFseXNlZCA9IE00T1NBX1RSVUU7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDaGVja0NsaXBDb21wYXRpYmxlV2l0aFZzc0VkaXRpbmcoKQotICogQGJyaWVmICAgIENoZWNrIGlmIHRoZSBjbGlwIGlzIGNvbXBhdGlibGUgd2l0aCBWU1MgZWRpdGluZwotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgICAgIChJTikgaW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcENsaXBQcm9wZXJ0aWVzICAgICAoT1VUKSBQb2ludGVyIHRvIGEgdmFsaWQgQ2xpcFByb3BlcnRpZXMgc3RydWN0dXJlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2hlY2tDbGlwQ29tcGF0aWJsZVdpdGhWc3NFZGl0aW5nKAotICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwQ2xpcFByb3BlcnRpZXMgKQotewotICAgIE00T1NBX1VJbnQzMiB1aU5iT2ZWYWxpZFN0cmVhbXMgPSAwOwotICAgIE00T1NBX0VSUiB2aWRlb19lcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX0VSUiBhdWRpb19lcnIgPSBNNE5PX0VSUk9SOwotICAgIC8qKioqKioqKiogZmlsZSB0eXBlICoqKioqKioqKi8KLQotICAgIGlmKCBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQU1SID09IHBDbGlwUHJvcGVydGllcy0+RmlsZVR5cGUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrQ2xpcENvbXBhdGlibGVXaXRoVnNzRWRpdGluZzpcCi0gICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9BTVJfRURJVElOR19VTlNVUFBPUlRFRCIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9BTVJfRURJVElOR19VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBpZiggTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QMyA9PSBwQ2xpcFByb3BlcnRpZXMtPkZpbGVUeXBlICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDaGVja0NsaXBDb21wYXRpYmxlV2l0aFZzc0VkaXRpbmcoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKiBWaWRlbyAqKioqKioqKiovCi0KLSAgICBpZiggTTRWSURFT0VESVRJTkdfa05vbmVWaWRlbwotICAgICAgICAhPSBwQ2xpcFByb3BlcnRpZXMtPlZpZGVvU3RyZWFtVHlwZSApIC8qKjwgaWYgdGhlcmUgaXMgYSB2aWRlbyBzdHJlYW0gKi8KLSAgICB7Ci0gICAgICAgIC8qIENoZWNrIHZpZGVvIGZvcm1hdCBpcyBNUEVHLTQsIEgyNjMgb3IgSDI2NCAqLwotICAgICAgICBzd2l0Y2goIHBDbGlwUHJvcGVydGllcy0+VmlkZW9TdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2MzoKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa01QRUc0OgotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2NDoKLSAgICAgICAgICAgICAgICB1aU5iT2ZWYWxpZFN0cmVhbXMrKzsKLSAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPmJWaWRlb0lzRWRpdGFibGUgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OiAvKjwgS08sIHdlIHJldHVybiBlcnJvciAqLwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrQ2xpcENvbXBhdGlibGVXaXRoVnNzRWRpdGluZygpOiB1bnN1cHBvcnRlZCB2aWRlbyBmb3JtYXQiKTsKLSAgICAgICAgICAgICAgICB2aWRlb19lcnIgPSBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX1ZJREVPX0ZPUk1BVDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBBdWRpbyBvbmx5IHN0cmVhbSBhcmUgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgYnkgdGhlIFZTUyBlZGl0aW5nIGZlYXR1cmUKLSAgICAgICAgKHVubGVzcyBpbiB0aGUgTVAzIGNhc2UpICovCi0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDaGVja0NsaXBDb21wYXRpYmxlV2l0aFZzc0VkaXRpbmcoKTogTm8gdmlkZW8gc3RyZWFtIGluIGNsaXAiKTsKLSAgICAgICAgdmlkZW9fZXJyID0gTTRWU1MzR1BQX0VSUl9FRElUSU5HX05PX1NVUFBPUlRFRF9WSURFT19TVFJFQU1fSU5fRklMRTsKLSAgICB9Ci0KLSAgICAvKioqKioqKioqIEF1ZGlvICoqKioqKioqKi8KLSAgICBpZiggTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbyAhPSBwQ2xpcFByb3BlcnRpZXMtPgotICAgICAgICBBdWRpb1N0cmVhbVR5cGUgKSAvKio8IGlmIHRoZXJlIGlzIGFuIGF1ZGlvIHN0cmVhbSAqLwotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgYXVkaW8gZm9ybWF0IGlzIEFNUi1OQiwgRVZSQyBvciBBQUMgKi8KLSAgICAgICAgc3dpdGNoKCBwQ2xpcFByb3BlcnRpZXMtPkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FNUl9OQjoKLSAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzRWRpdGFibGUgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIHVpTmJPZlZhbGlkU3RyZWFtcysrOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUM6Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUNwbHVzOgotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rZUFBQ3BsdXM6Ci0gICAgICAgICAgICAgICAgc3dpdGNoKCBwQ2xpcFByb3BlcnRpZXMtPnVpU2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIDgwMDA6Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjAwMDoKLSAgICAgICAgICAgICAgICBjYXNlIDIyMDUwOgotICAgICAgICAgICAgICAgIGNhc2UgMjQwMDA6Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjAwMDoKLSAgICAgICAgICAgICAgICBjYXNlIDQ0MTAwOgotICAgICAgICAgICAgICAgIGNhc2UgNDgwMDA6Ci0gICAgICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNFZGl0YWJsZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHVpTmJPZlZhbGlkU3RyZWFtcysrOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tFVlJDOgotICAgICAgICAgICAgICAgIC8qPCBPSywgd2UgcHJvY2VlZCwgbm8gcmV0dXJuICovCi0gICAgICAgICAgICAgICAgdWlOYk9mVmFsaWRTdHJlYW1zKys7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6IC8qPCBLTywgd2UgcmV0dXJuIGVycm9yICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2hlY2tDbGlwQ29tcGF0aWJsZVdpdGhWc3NFZGl0aW5nKCk6IHVuc3VwcG9ydGVkIGF1ZGlvIGZvcm1hdCIpOwotICAgICAgICAgICAgICAgIGF1ZGlvX2VyciA9IE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9BVURJT19GT1JNQVQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogU2lsZW5jZSBpcyBhbHdheXMgZWRpdGFibGUgKi8KLSAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0VkaXRhYmxlID0gTTRPU0FfVFJVRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSB2YWxpZCBzdHJlYW0gaW4gdGhlIGZpbGUuLi4gKi8KLSAgICBpZiggdmlkZW9fZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICByZXR1cm4gdmlkZW9fZXJyOwotCi0gICAgaWYoIGF1ZGlvX2VyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgcmV0dXJuIGF1ZGlvX2VycjsKLQotICAgIGlmKCAwID09IHVpTmJPZlZhbGlkU3RyZWFtcyApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2hlY2tDbGlwQ29tcGF0aWJsZVdpdGhWc3NFZGl0aW5nKCk6IEZpbGUgY29udGFpbnMgbm8gc3VwcG9ydGVkIHN0cmVhbSxcCi0gICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9FRElUSU5HX05PX1NVUFBPUlRFRF9TVFJFQU1fSU5fRklMRSIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9FRElUSU5HX05PX1NVUFBPUlRFRF9TVFJFQU1fSU5fRklMRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICJNNFZTUzNHUFBfaW50Q2hlY2tDbGlwQ29tcGF0aWJsZVdpdGhWc3NFZGl0aW5nKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbXBhdGliaWxpdHkoKQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIGNoZWNraW5nIGlmIHR3byBjbGlwcyBhcmUgY29tcGF0aWJsZSB3aXRoIGVhY2ggb3RoZXIgZm9yCi0gKiAgICAgICAgVlNTIDNHUFAgYXVkaW8gbWl4aW5nIGZlYXR1cmUuCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJTikgQ29udGV4dCBvZiB0aGUgYXVkaW8gbWl4ZXIKLSAqIEBwYXJhbSAgICBwSW5wdXRDbGlwUHJvcGVydGllcyAgICAgICAgKElOKSBDbGlwIGFuYWx5c2lzIG9mIHRoZSBmaXJzdCBjbGlwCi0gKiBAcGFyYW0gICAgcEFkZGVkQ2xpcFByb3BlcnRpZXMgICAgICAgIChJTikgQ2xpcCBhbmFseXNpcyBvZiB0aGUgc2Vjb25kIGNsaXAKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0NMSVBfQU5BTFlTSVNfVkVSU0lPTgotICogQHJldHVybiAgTTRWU1MzR1BQX0VSUl9JTlBVVF9DTElQX0lTX05PVF9BXzNHUFAKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSCi1NNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb21wYXRpYmlsaXR5KCBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBDLCBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyAqcElucHV0Q2xpcFByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwQWRkZWRDbGlwUHJvcGVydGllcyApCi17Ci0gICAgTTRPU0FfQm9vbCBiQ2xpcDFJc0FBQyA9IE00T1NBX0ZBTFNFOwotICAgIE00T1NBX0Jvb2wgYkNsaXAySXNBQUMgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qKgotICAgICogUmVzZXQgc2V0dGluZ3MgKi8KLSAgICBwSW5wdXRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNFZGl0YWJsZSA9IE00T1NBX0ZBTFNFOwotICAgIHBBZGRlZENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0VkaXRhYmxlID0gTTRPU0FfRkFMU0U7Ci0gICAgcElucHV0Q2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwID0gTTRPU0FfRkFMU0U7Ci0gICAgcEFkZGVkQ2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIHRoYXQgYW5hbHlzaXMgaGFzIGJlZW4gZ2VuZXJhdGVkIGJ5IHRoaXMgdmVyc2lvbiBvZiB0aGUgVlNTM0dQUCBsaWJyYXJ5ICovCi0gICAgaWYoICggcElucHV0Q2xpcFByb3BlcnRpZXMtPlZlcnNpb25bMF0gIT0gTTRWSURFT0VESVRJTkdfVkVSU0lPTl9NQUpPUikKLSAgICAgICAgfHwgKHBJbnB1dENsaXBQcm9wZXJ0aWVzLT5WZXJzaW9uWzFdICE9IE00VklERU9FRElUSU5HX1ZFUlNJT05fTUlOT1IpCi0gICAgICAgIHx8IChwSW5wdXRDbGlwUHJvcGVydGllcy0+VmVyc2lvblsyXQotICAgICE9IE00VklERU9FRElUSU5HX1ZFUlNJT05fUkVWSVNJT04pICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbXBhdGliaWxpdHk6IFRoZSBjbGlwIGFuYWx5c2lzIGhhcyBiZWVuIGdlbmVyYXRlZFwKLSAgICAgICAgICAgIGJ5IGFub3RoZXIgdmVyc2lvbiwgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQX0FOQUxZU0lTX1ZFUlNJT04iKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQX0FOQUxZU0lTX1ZFUlNJT047Ci0gICAgfQotCi0gICAgaWYoICggcEFkZGVkQ2xpcFByb3BlcnRpZXMtPlZlcnNpb25bMF0gIT0gTTRWSURFT0VESVRJTkdfVkVSU0lPTl9NQUpPUikKLSAgICAgICAgfHwgKHBBZGRlZENsaXBQcm9wZXJ0aWVzLT5WZXJzaW9uWzFdICE9IE00VklERU9FRElUSU5HX1ZFUlNJT05fTUlOT1IpCi0gICAgICAgIHx8IChwQWRkZWRDbGlwUHJvcGVydGllcy0+VmVyc2lvblsyXQotICAgICE9IE00VklERU9FRElUSU5HX1ZFUlNJT05fUkVWSVNJT04pICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbXBhdGliaWxpdHk6IFRoZSBjbGlwIGFuYWx5c2lzIGhhcyBiZWVuIGdlbmVyYXRlZFwKLSAgICAgICAgICAgIGJ5IGFub3RoZXIgdmVyc2lvbiwgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQX0FOQUxZU0lTX1ZFUlNJT04iKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQX0FOQUxZU0lTX1ZFUlNJT047Ci0gICAgfQotCi0gICAgLyoqKioqKioqKiBpbnB1dCBmaWxlIHR5cGUgKioqKioqKioqLwotCi0gICAgaWYoIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQICE9IHBJbnB1dENsaXBQcm9wZXJ0aWVzLT5GaWxlVHlwZSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb21wYXRpYmlsaXR5OlwKLSAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0lOUFVUX0NMSVBfSVNfTk9UX0FfM0dQUCIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9JTlBVVF9DTElQX0lTX05PVF9BXzNHUFA7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKiBpbnB1dCBhdWRpbyAqKioqKioqKiovCi0KLSAgICBpZiggTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbyAhPSBwSW5wdXRDbGlwUHJvcGVydGllcy0+Ci0gICAgICAgIEF1ZGlvU3RyZWFtVHlwZSApIC8qKjwgaWYgdGhlcmUgaXMgYW4gYXVkaW8gc3RyZWFtICovCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayBhdWRpbyBmb3JtYXQgaXMgQU1SLU5CIG9yIEFBQyAqLwotICAgICAgICBzd2l0Y2goIHBJbnB1dENsaXBQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBTVJfTkI6Ci0gICAgICAgICAgICAgICAgcElucHV0Q2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzRWRpdGFibGUgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUM6Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUNwbHVzOgotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rZUFBQ3BsdXM6Ci0gICAgICAgICAgICAgICAgc3dpdGNoKCBwSW5wdXRDbGlwUHJvcGVydGllcy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgODAwMDoKLSAgICAgICAgICAgICAgICBjYXNlIDE2MDAwOgotICAgICAgICAgICAgICAgIGNhc2UgMjIwNTA6Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDAwMDoKLSAgICAgICAgICAgICAgICBjYXNlIDMyMDAwOgotICAgICAgICAgICAgICAgIGNhc2UgNDQxMDA6Ci0gICAgICAgICAgICAgICAgY2FzZSA0ODAwMDoKLSAgICAgICAgICAgICAgICAgICAgcElucHV0Q2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzRWRpdGFibGUgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYkNsaXAxSXNBQUMgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIFNpbGVuY2UgaXMgYWx3YXlzIGVkaXRhYmxlICovCi0gICAgICAgIHBJbnB1dENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0VkaXRhYmxlID0gTTRPU0FfVFJVRTsKLSAgICB9Ci0KLSAgICAvKioqKioqKioqIGFkZGVkIGF1ZGlvICoqKioqKioqKi8KLQotICAgIGlmKCBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvICE9IHBBZGRlZENsaXBQcm9wZXJ0aWVzLT4KLSAgICAgICAgQXVkaW9TdHJlYW1UeXBlICkgLyoqPCBpZiB0aGVyZSBpcyBhbiBhdWRpbyBzdHJlYW0gKi8KLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIGF1ZGlvIGZvcm1hdCBpcyBBTVItTkIgb3IgQUFDICovCi0gICAgICAgIHN3aXRjaCggcEFkZGVkQ2xpcFByb3BlcnRpZXMtPkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FNUl9OQjoKLSAgICAgICAgICAgICAgICBwQWRkZWRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNFZGl0YWJsZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgcEFkZGVkQ2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwID0KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJVRTsgLyogSSB1c2UgdGhpcyBmaWVsZCB0byBrbm93IGlmIHNpbGVuY2Ugc3VwcG9ydGVkICovCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FBQzoKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FBQ3BsdXM6Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tlQUFDcGx1czoKLSAgICAgICAgICAgICAgICBzd2l0Y2goIHBBZGRlZENsaXBQcm9wZXJ0aWVzLT51aVNhbXBsaW5nRnJlcXVlbmN5ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSA4MDAwOgotICAgICAgICAgICAgICAgIGNhc2UgMTYwMDA6Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjA1MDoKLSAgICAgICAgICAgICAgICBjYXNlIDI0MDAwOgotICAgICAgICAgICAgICAgIGNhc2UgMzIwMDA6Ci0gICAgICAgICAgICAgICAgY2FzZSA0NDEwMDoKLSAgICAgICAgICAgICAgICBjYXNlIDQ4MDAwOgotICAgICAgICAgICAgICAgICAgICBwQWRkZWRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNFZGl0YWJsZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBBZGRlZENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcCA9Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSVUU7IC8qIEkgdXNlIHRoaXMgZmllbGQgdG8ga25vdyBpZiBzaWxlbmNlIHN1cHBvcnRlZCAqLwotICAgICAgICAgICAgICAgIGJDbGlwMklzQUFDID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRVZSQzoKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUENNOgotICAgICAgICAgICAgICAgIHBBZGRlZENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0VkaXRhYmxlID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBwQWRkZWRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXAgPQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUlVFOyAvKiBJIHVzZSB0aGlzIGZpZWxkIHRvIGtub3cgaWYgc2lsZW5jZSBzdXBwb3J0ZWQgKi8KLQotICAgICAgICAgICAgICAgIGlmKCBwQWRkZWRDbGlwUHJvcGVydGllcy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSA9PSAxNjAwMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBiQ2xpcDJJc0FBQyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tNUDM6IC8qUkMqLwotICAgICAgICAgICAgICAgIHBBZGRlZENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0VkaXRhYmxlID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBwQWRkZWRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXAgPQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUlVFOyAvKiBJIHVzZSB0aGlzIGZpZWxkIHRvIGtub3cgaWYgc2lsZW5jZSBzdXBwb3J0ZWQgKi8KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAvKiBUaGUgd3JpdGVyIGNhbm5vdCB3cml0ZSB0aGlzICBpbnRvIGEgM2dwcCAqLwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29tcGF0aWJpbGl0eTpcCi0gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0FEREVEX0FVRElPX1NUUkVBTSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0FEREVEX0FVRElPX1NUUkVBTTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBTaWxlbmNlIGlzIGFsd2F5cyBlZGl0YWJsZSAqLwotICAgICAgICBwQWRkZWRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNFZGl0YWJsZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgIHBBZGRlZENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcCA9Ci0gICAgICAgICAgICBNNE9TQV9UUlVFOyAvKiBJIHVzZSB0aGlzIGZpZWxkIHRvIGtub3cgaWYgc2lsZW5jZSBzdXBwb3J0ZWQgKi8KLSAgICB9Ci0KLSAgICBpZiggcEMtPmJSZW1vdmVPcmlnaW5hbCA9PSBNNE9TQV9GQUxTRSApCi0gICAgewotICAgICAgICBpZiggcElucHV0Q2xpcFByb3BlcnRpZXMtPnVpU2FtcGxpbmdGcmVxdWVuY3kKLSAgICAgICAgICAgICE9IHBBZGRlZENsaXBQcm9wZXJ0aWVzLT51aVNhbXBsaW5nRnJlcXVlbmN5ICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogV2UgbmVlZCB0byBjYWxsIFNTUkMgaW4gb3JkZXIgdG8gYWxpZ24gQVNGIGFuZC9vciBuYiBvZiBjaGFubmVscyAqLwotICAgICAgICAgICAgLyogTW9yZW92ZXIsIGF1ZGlvIGVuY29kZXIgbWF5IGJlIG5lZWRlZCBpbiBjYXNlIG9mIGF1ZGlvIHJlcGxhY2luZy4uLiAqLwotICAgICAgICAgICAgcEMtPmJfU1NSQ25lZWRlZCA9IE00T1NBX1RSVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggcElucHV0Q2xpcFByb3BlcnRpZXMtPnVpTmJDaGFubmVscwotICAgICAgICAgICAgPCBwQWRkZWRDbGlwUHJvcGVydGllcy0+dWlOYkNoYW5uZWxzICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogU3RlcmVvIHRvIE1vbm8gKi8KLSAgICAgICAgICAgIHBDLT5DaGFubmVsQ29udmVyc2lvbiA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggcElucHV0Q2xpcFByb3BlcnRpZXMtPnVpTmJDaGFubmVscwotICAgICAgICAgICAgPiBwQWRkZWRDbGlwUHJvcGVydGllcy0+dWlOYkNoYW5uZWxzICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogTW9ubyB0byBTdGVyZW8gKi8KLSAgICAgICAgICAgIHBDLT5DaGFubmVsQ29udmVyc2lvbiA9IDI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwSW5wdXRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXAgPSBNNE9TQV9UUlVFOwotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29tcGF0aWJpbGl0eSgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfQ29kZWNzLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9Db2RlY3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWNlZDkzNy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9Db2RlY3MuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00VlNTM0dQUF9Db2RlY3MuYwotICogQGJyaWVmICBWU1MgaW1wbGVtZW50YXRpb24KLSAqIEBub3RlICAgVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCBmdW5jdGlvbnMgcmVsYXRlZCB0byBhdWRpby92aWRlbwotICogICAgICAgICAgICBjb2RlYyBtYW5pcHVsYXRpb25zLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIgICAgICAgICAgICAgLyoqPCBJbmNsdWRlIGZvciBPU0FMIGRlYnVnIHNlcnZpY2VzICovCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0Vycm9yQ29kZXMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxUeXBlcy5oIiAvKio8IEludGVybmFsIHR5cGVzIG9mIHRoZSBWU1MgKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfY2xlYXJJbnRlcmZhY2VUYWJsZXMoKQotICogQGJyaWVmICAgIENsZWFyIGVuY29kZXJzLCBkZWNvZGVycywgcmVhZGVyIGFuZCB3cml0ZXJzIGludGVyZmFjZXMgdGFibGVzCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIFRoZSBjb250ZXh0IGlzIG51bGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9jbGVhckludGVyZmFjZVRhYmxlcyggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQyApCi17Ci0gICAgTTRPU0FfVUludDggaTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICAvKiBJbml0aWFsaXNhdGlvbiB0aGF0IHdpbGwgYWxsb3cgdG8gY2hlY2sgaWYgcmVnaXN0ZXJpbmcgdHdpY2UgKi8KLSAgICBwQy0+cFdyaXRlckdsb2JhbEZjdHMgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wV3JpdGVyRGF0YUZjdHMgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cyA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEN1cnJlbnRBdWRpb0VuY29kZXJVc2VyRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBDdXJyZW50QXVkaW9EZWNvZGVyVXNlckRhdGEgPSBNNE9TQV9OVUxMOwotCi0gICAgcEMtPnBDdXJyZW50VmlkZW9FbmNvZGVyRXh0ZXJuYWxBUEkgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wQ3VycmVudFZpZGVvRW5jb2RlclVzZXJEYXRhID0gTTRPU0FfTlVMTDsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgTTRXUklURVJfa1R5cGVfTkI7IGkrKyApCi0gICAgewotICAgICAgICBwQy0+V3JpdGVySW50ZXJmYWNlW2ldLnBHbG9iYWxGY3RzID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPldyaXRlckludGVyZmFjZVtpXS5wRGF0YUZjdHMgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGZvciAoIGkgPSAwOyBpIDwgTTRFTkNPREVSX2tWaWRlb19OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPnBWaWRlb0VuY29kZXJFeHRlcm5hbEFQSVRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPnBWaWRlb0VuY29kZXJVc2VyRGF0YVRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IE00RU5DT0RFUl9rQXVkaW9fTkI7IGkrKyApCi0gICAgewotICAgICAgICBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5wQXVkaW9FbmNvZGVyRmxhZ1tpXSA9IE00T1NBX0ZBTFNFOwotICAgICAgICBwQy0+cEF1ZGlvRW5jb2RlclVzZXJEYXRhVGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qIEluaXRpYWxpc2F0aW9uIHRoYXQgd2lsbCBhbGxvdyB0byBjaGVjayBpZiByZWdpc3RlcmluZyB0d2ljZSAqLwotICAgIHBDLT5tX3BSZWFkZXIgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3BSZWFkZXJEYXRhSXQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3VpTmJSZWdpc3RlcmVkUmVhZGVycyA9IDA7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IE00UkVBREVSX2tNZWRpYVR5cGVfTkI7IGkrKyApCi0gICAgewotICAgICAgICBwQy0+bV9wUmVhZGVyR2xvYmFsSXRUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5tX3BSZWFkZXJEYXRhSXRUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgcEMtPm1fcFZpZGVvRGVjb2RlciA9IE00T1NBX05VTEw7Ci0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0KLSAgICBwQy0+bV9wQ3VycmVudFZpZGVvRGVjb2RlclVzZXJEYXRhID0gTTRPU0FfTlVMTDsKLSNlbmRpZiAvKiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMgKi8KLQotICAgIHBDLT5tX3VpTmJSZWdpc3RlcmVkVmlkZW9EZWMgPSAwOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBNNERFQ09ERVJfa1ZpZGVvVHlwZV9OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLQotICAgICAgICBwQy0+bV9wVmlkZW9EZWNvZGVyVXNlckRhdGFUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0KLSNlbmRpZiAvKiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMgKi8KLQotICAgIH0KLQotICAgIHBDLT5tX3BBdWRpb0RlY29kZXIgPSBNNE9TQV9OVUxMOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBNNEFEX2tUeXBlX05COyBpKysgKQotICAgIHsKLSAgICAgICAgcEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICBwQy0+bV9wQXVkaW9EZWNvZGVyRmxhZ1RhYmxlW2ldID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgIHBDLT5wQXVkaW9EZWNvZGVyVXNlckRhdGFUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3JlZ2lzdGVyV3JpdGVyKCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVnaXN0ZXIgYSBzcGVjaWZpYyBmaWxlIGZvcm1hdCB3cml0ZXIuCi0gKiBAbm90ZSAgICBBY2NvcmRpbmcgdG8gdGhlIE1lZGlhdHlwZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHN0b3JlIGluIHRoZSBpbnRlcm5hbAotICogICAgICAgIGNvbnRleHQgdGhlIHdyaXRlciBjb250ZXh0LgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgcENvbnRleHQscFd0ckdsb2JhbEludGVyZmFjZSBvciBwV3RyRGF0YUludGVyZmFjZSBpcyBNNE9TQV9OVUxMCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlYnVnIG9ubHkpLCBvciBpbnZhbGlkIE1lZGlhVHlwZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX3JlZ2lzdGVyV3JpdGVyKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9PdXRwdXRGaWxlVHlwZSBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSAqcFd0ckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSAqcFd0ckRhdGFJbnRlcmZhY2UgKQotewotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigocEMgPT0gTTRPU0FfTlVMTCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZTUzogY29udGV4dCBpcyBNNE9TQV9OVUxMIGluIE00VlNTM0dQUF9yZWdpc3RlcldyaXRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocFd0ckdsb2JhbEludGVyZmFjZSA9PSBNNE9TQV9OVUxMKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAicFd0ckdsb2JhbEludGVyZmFjZSBpcyBNNE9TQV9OVUxMIGluIE00VlNTM0dQUF9yZWdpc3RlcldyaXRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocFd0ckRhdGFJbnRlcmZhY2UgPT0gTTRPU0FfTlVMTCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgInBXdHJEYXRhSW50ZXJmYWNlIGlzIE00T1NBX05VTEwgaW4gTTRWU1MzR1BQX3JlZ2lzdGVyV3JpdGVyIik7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMygKLSAgICAgICAgIlZTUzogTTRWU1MzR1BQX3JlZ2lzdGVyV3JpdGVyIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgsIHBXdHJHbG9iYWxJbnRlcmZhY2U9MHgleCxcCi0gICAgICAgIHBXdHJEYXRhSW50ZXJmYWNlPTB4JXgiLAotICAgICAgICBwQywgcFd0ckdsb2JhbEludGVyZmFjZSwgcFd0ckRhdGFJbnRlcmZhY2UpOwotCi0gICAgaWYoICggTWVkaWFUeXBlID09IE00V1JJVEVSX2tVbmtub3duKSB8fCAoTWVkaWFUeXBlID49IE00V1JJVEVSX2tUeXBlX05CKSApCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRFUlJfUEFSQU1FVEVSLCAiSW52YWxpZCBtZWRpYSB0eXBlIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYoIHBDLT5Xcml0ZXJJbnRlcmZhY2VbTWVkaWFUeXBlXS5wR2xvYmFsRmN0cyAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIC8qIGEgd3JpdGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBtZWRpYSB0eXBlIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCAhKi8KLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICJUaGlzIG1lZGlhIHR5cGUgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIFNhdmUgd3JpdGVyIGludGVyZmFjZSBpbiBjb250ZXh0ICovCi0gICAgcEMtPldyaXRlckludGVyZmFjZVtNZWRpYVR5cGVdLnBHbG9iYWxGY3RzID0gcFd0ckdsb2JhbEludGVyZmFjZTsKLSAgICBwQy0+V3JpdGVySW50ZXJmYWNlW01lZGlhVHlwZV0ucERhdGFGY3RzID0gcFd0ckRhdGFJbnRlcmZhY2U7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0VuY29kZXIoKQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gd2lsbCByZWdpc3RlciBhIHNwZWNpZmljIHZpZGVvIGVuY29kZXIuCi0gKiBAbm90ZSAgICBBY2NvcmRpbmcgdG8gdGhlIE1lZGlhdHlwZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHN0b3JlIGluIHRoZSBpbnRlcm5hbAotICogICAgICAgIGNvbnRleHQgdGhlIGVuY29kZXIgY29udGV4dC4KLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgIHBDb250ZXh0IG9yIHBFbmNHbG9iYWxJbnRlcmZhY2UgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSksCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaW52YWxpZCBNZWRpYVR5cGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRW5jb2RlciggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0Zvcm1hdCBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UgKnBFbmNHbG9iYWxJbnRlcmZhY2UgKQotewotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigocEMgPT0gTTRPU0FfTlVMTCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZTUzogY29udGV4dCBpcyBNNE9TQV9OVUxMIGluIE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRW5jb2RlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocEVuY0dsb2JhbEludGVyZmFjZSA9PSBNNE9TQV9OVUxMKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAicEVuY0dsb2JhbEludGVyZmFjZSBpcyBNNE9TQV9OVUxMIGluIE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRW5jb2RlciIpOwotCi0gICAgTTRPU0FfVFJBQ0UzXzMoCi0gICAgICAgICJWU1M6IE00VlNTM0dQUF9yZWdpc3RlckVuY29kZXIgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCwgcEVuY0dsb2JhbEludGVyZmFjZT0weCV4LFwKLSAgICAgICAgTWVkaWFUeXBlPTB4JXgiLAotICAgICAgICBwQywgcEVuY0dsb2JhbEludGVyZmFjZSwgTWVkaWFUeXBlKTsKLQotICAgIGlmKCBNZWRpYVR5cGUgPj0gTTRFTkNPREVSX2tWaWRlb19OQiApCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgIkludmFsaWQgdmlkZW8gZW5jb2RlciB0eXBlIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYoIHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0gIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICAvKiBjYW4gYmUgbGVnaXRpbWF0ZSwgaW4gY2FzZXMgd2hlcmUgd2UgaGF2ZSBvbmUgdmVyc2lvbiB0aGF0IGNhbiB1c2UgZXh0ZXJuYWwgZW5jb2RlcnMKLSAgICAgICAgYnV0IHdoaWNoIHN0aWxsIGhhcyB0aGUgYnVpbHQtaW4gb25lIHRvIGJlIGFibGUgdG8gd29yayB3aXRob3V0IGFuIGV4dGVybmFsIGVuY29kZXI7IGluCi0gICAgICAgIHRoaXMgY2FzZSB0aGUgbmV3IGVuY29kZXIgc2ltcGx5IHJlcGxhY2VzIHRoZSBvbGQgb25lIChpLmUuIHdlIHVucmVnaXN0ZXIgaXQgZmlyc3QpLiAqLwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iQWxsb3dGcmVlaW5nT01YQ29kZWNJbnRlcmZhY2UgKQotICAgICAgICB7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICBmcmVlKHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0pOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgcEMtPnBWaWRlb0VuY29kZXJJbnRlcmZhY2VbTWVkaWFUeXBlXSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIFNhdmUgZW5jb2RlciBpbnRlcmZhY2UgaW4gY29udGV4dCAqLwotICAgIHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0gPSBwRW5jR2xvYmFsSW50ZXJmYWNlOwotICAgIC8qIFRoZSBhY3R1YWwgdXNlckRhdGEgYW5kIGV4dGVybmFsIEFQSSB3aWxsIGJlIHNldCBieSB0aGUgcmVnaXN0cmF0aW9uIGZ1bmN0aW9uIGluIHRoZSBjYXNlCi0gICAgb2YgYW4gZXh0ZXJuYWwgZW5jb2RlciAoYWRkIGl0IGFzIGEgcGFyYW1ldGVyIHRvIHRoaXMgZnVuY3Rpb24gaW4gdGhlIGxvbmcgcnVuPykgKi8KLSAgICBwQy0+cFZpZGVvRW5jb2RlclVzZXJEYXRhVGFibGVbTWVkaWFUeXBlXSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBWaWRlb0VuY29kZXJFeHRlcm5hbEFQSVRhYmxlW01lZGlhVHlwZV0gPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVnaXN0ZXIgYSBzcGVjaWZpYyBhdWRpbyBlbmNvZGVyLgotICogQG5vdGUgICAgQWNjb3JkaW5nIHRvIHRoZSBNZWRpYXR5cGUsIHRoaXMgZnVuY3Rpb24gd2lsbCBzdG9yZSBpbiB0aGUgaW50ZXJuYWwKLSAqICAgICAgICBjb250ZXh0IHRoZSBlbmNvZGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgICAgICAgICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgbWVkaWFUeXBlOiAgICAgICAgICAgICAgICAoSU4pIFRoZSBtZWRpYSB0eXBlLgotICogQHBhcmFtICAgIHBFbmNHbG9iYWxJbnRlcmZhY2U6ICAgIChPVVQpIHRoZSBlbmNvZGVyIGludGVyZmFjZSBmdW5jdGlvbnMuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgb3IgcEVuY0dsb2JhbEludGVyZmFjZSBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQgTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UgKnBFbmNHbG9iYWxJbnRlcmZhY2UgKQotewotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigocEMgPT0gTTRPU0FfTlVMTCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZTUzogY29udGV4dCBpcyBNNE9TQV9OVUxMIGluIE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRW5jb2RlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocEVuY0dsb2JhbEludGVyZmFjZSA9PSBNNE9TQV9OVUxMKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAicEVuY0dsb2JhbEludGVyZmFjZSBpcyBNNE9TQV9OVUxMIGluIE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRW5jb2RlciIpOwotCi0gICAgTTRPU0FfVFJBQ0UzXzMoCi0gICAgICAgICJWU1M6IE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRW5jb2RlciBjYWxsZWQgcENvbnRleHQ9MHgleCwgcEVuY0dsb2JhbEludGVyZmFjZT0weCV4LFwKLSAgICAgICAgTWVkaWFUeXBlPTB4JXgiLAotICAgICAgICBwQywgcEVuY0dsb2JhbEludGVyZmFjZSwgTWVkaWFUeXBlKTsKLQotICAgIGlmKCBNZWRpYVR5cGUgPj0gTTRFTkNPREVSX2tBdWRpb19OQiApCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgIkludmFsaWQgYXVkaW8gZW5jb2RlciB0eXBlIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYoIHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0gIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0pOwotICAgICAgICBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgLyoKLSAgICAqIFNhdmUgZW5jb2RlciBpbnRlcmZhY2UgaW4gY29udGV4dCAqLwotICAgIHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0gPSBwRW5jR2xvYmFsSW50ZXJmYWNlOwotICAgIHBDLT5wQXVkaW9FbmNvZGVyRmxhZ1tNZWRpYVR5cGVdID0gTTRPU0FfRkFMU0U7IC8qIGludGVybmFsIGVuY29kZXIgKi8KLSAgICBwQy0+cEF1ZGlvRW5jb2RlclVzZXJEYXRhVGFibGVbTWVkaWFUeXBlXSA9IE00T1NBX05VTEw7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigKLSAgICAgICAgIk00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRW5jb2RlcjogcEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbMHgleF0gPSAweCV4IiwKLSAgICAgICAgTWVkaWFUeXBlLCBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlclJlYWRlcigpCi0gKiBAYnJpZWYgICAgUmVnaXN0ZXIgcmVhZGVyLgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX3JlZ2lzdGVyUmVhZGVyKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9NZWRpYVR5cGUgbWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKnBSZHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKnBSZHJEYXRhSW50ZXJmYWNlICkKLXsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwUmRyR2xvYmFsSW50ZXJmYWNlKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX3JlZ2lzdGVyUmVhZGVyOiBpbnZhbGlkIHBvaW50ZXIgb24gZ2xvYmFsIGludGVyZmFjZSIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwUmRyRGF0YUludGVyZmFjZSksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9yZWdpc3RlclJlYWRlcjogaW52YWxpZCBwb2ludGVyIG9uIGRhdGEgaW50ZXJmYWNlIik7Ci0KLSAgICBpZiggbWVkaWFUeXBlID09IE00UkVBREVSX2tNZWRpYVR5cGVVbmtub3duCi0gICAgICAgIHx8IG1lZGlhVHlwZSA+PSBNNFJFQURFUl9rTWVkaWFUeXBlX05CICkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNEVSUl9QQVJBTUVURVIsICJJbnZhbGlkIG1lZGlhIHR5cGUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiggcEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbbWVkaWFUeXBlXSAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIC8qIGEgcmVhZGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBtZWRpYSB0eXBlIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCAhKi8KLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICJUaGlzIG1lZGlhIHR5cGUgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgcEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbbWVkaWFUeXBlXSA9IHBSZHJHbG9iYWxJbnRlcmZhY2U7Ci0gICAgcEMtPm1fcFJlYWRlckRhdGFJdFRhYmxlW21lZGlhVHlwZV0gPSBwUmRyRGF0YUludGVyZmFjZTsKLQotICAgIHBDLT5tX3VpTmJSZWdpc3RlcmVkUmVhZGVycysrOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3JlZ2lzdGVyVmlkZW9EZWNvZGVyKCkKLSAqIEBicmllZiAgICBSZWdpc3RlciB2aWRlbyBkZWNvZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgZGVjb2RlclR5cGUgICAgICAgICAgICAoSU4pIERlY29kZXIgdHlwZQotICogQHBhcmFtICAgIHBEZWNvZGVySW50ZXJmYWNlICAgIChJTikgRGVjb2RlciBpbnRlcmZhY2UuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciB0aGUgZGVjb2RlciB0eXBlIGlzIGludmFsaWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRGVjb2RlciggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX1ZpZGVvVHlwZSBkZWNvZGVyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlICpwRGVjb2RlckludGVyZmFjZSApCi17Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcERlY29kZXJJbnRlcmZhY2UpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0RlY29kZXI6IGludmFsaWQgcG9pbnRlciBvbiBkZWNvZGVyIGludGVyZmFjZSIpOwotCi0gICAgaWYoIGRlY29kZXJUeXBlID49IE00REVDT0RFUl9rVmlkZW9UeXBlX05CICkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAiSW52YWxpZCB2aWRlbyBkZWNvZGVyIHR5cGUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiggcEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdICE9IE00T1NBX05VTEwgKQotICAgIHsKLSNpZm5kZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0gICAgICAgIC8qIGEgZGVjb2RlciBjb3JyZXNwb25kaW5nIHRvIHRoaXMgbWVkaWEgdHlwZSBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgISovCi0KLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICJEZWNvZGVyIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotCi0jZWxzZSAvKiBleHRlcm5hbCBkZWNvZGVycyBhcmUgcG9zc2libGUgKi8KLSAgICAgICAgLyogY2FuIGJlIGxlZ2l0aW1hdGUsIGluIGNhc2VzIHdoZXJlIHdlIGhhdmUgb25lIHZlcnNpb24gdGhhdCBjYW4gdXNlIGV4dGVybmFsIGRlY29kZXJzCi0gICAgICAgIGJ1dCB3aGljaCBzdGlsbCBoYXMgdGhlIGJ1aWx0LWluIG9uZSB0byBiZSBhYmxlIHRvIHdvcmsgd2l0aG91dCBhbiBleHRlcm5hbCBkZWNvZGVyOyBpbgotICAgICAgICB0aGlzIGNhc2UgdGhlIG5ldyBkZWNvZGVyIHNpbXBseSByZXBsYWNlcyB0aGUgb2xkIG9uZSAoaS5lLiB3ZSB1bnJlZ2lzdGVyIGl0IGZpcnN0KS4gKi8KLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YkFsbG93RnJlZWluZ09NWENvZGVjSW50ZXJmYWNlICkKLSAgICAgICAgewotCi0jZW5kaWYKLQotICAgICAgICAgICAgZnJlZShwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0pOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgcEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdID0gTTRPU0FfTlVMTDsKLSAgICAgICAgLyogb2gsIGFuZCBkb24ndCBmb3JnZXQgdGhlIHVzZXIgZGF0YSwgdG9vLiAqLwotICAgICAgICBpZiggcEMtPm1fcFZpZGVvRGVjb2RlclVzZXJEYXRhVGFibGVbZGVjb2RlclR5cGVdICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5tX3BWaWRlb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXSk7Ci0gICAgICAgICAgICBwQy0+bV9wVmlkZW9EZWNvZGVyVXNlckRhdGFUYWJsZVtkZWNvZGVyVHlwZV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0jZW5kaWYgLyogYXJlIGV4dGVybmFsIGRlY29kZXJzIHBvc3NpYmxlPyAqLwotCi0gICAgfQotCi0gICAgcEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdID0gcERlY29kZXJJbnRlcmZhY2U7Ci0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0KLSAgICBwQy0+bV9wVmlkZW9EZWNvZGVyVXNlckRhdGFUYWJsZVtkZWNvZGVyVHlwZV0gPSBNNE9TQV9OVUxMOwotICAgIC8qIFRoZSBhY3R1YWwgdXNlckRhdGEgd2lsbCBiZSBzZXQgYnkgdGhlIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbiBpbiB0aGUgY2FzZQotICAgIG9mIGFuIGV4dGVybmFsIGRlY29kZXIgKGFkZCBpdCBhcyBhIHBhcmFtZXRlciB0byB0aGlzIGZ1bmN0aW9uIGluIHRoZSBsb25nIHJ1bj8pICovCi0KLSNlbmRpZiAvKiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMgKi8KLQotICAgIHBDLT5tX3VpTmJSZWdpc3RlcmVkVmlkZW9EZWMrKzsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRGVjb2RlcigpCi0gKiBAYnJpZWYgICAgUmVnaXN0ZXIgYXVkaW8gZGVjb2RlcgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGludGVybmFseSBieSB0aGUgVlNTIHRvIHJlZ2lzdGVyIE5YUCBhdWRpbyBkZWNvZGVycywKLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHBhcmFtICAgIGRlY29kZXJUeXBlICAgICAgICAgICAgKElOKSBBdWRpbyBkZWNvZGVyIHR5cGUKLSAqIEBwYXJhbSAgICBwRGVjb2RlckludGVyZmFjZSAgICAoSU4pIEF1ZGlvIGRlY29kZXIgaW50ZXJmYWNlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICBBIHBhcmFtZXRlciBpcyBudWxsLCBvciB0aGUgZGVjb2RlciB0eXBlIGlzIGludmFsaWQoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRGVjb2RlciggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRBRF9UeXBlIGRlY29kZXJUeXBlLCBNNEFEX0ludGVyZmFjZSAqcERlY29kZXJJbnRlcmZhY2UpCi17Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcERlY29kZXJJbnRlcmZhY2UpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfcmVnaXN0ZXJBdWRpb0RlY29kZXI6IGludmFsaWQgcG9pbnRlciBvbiBkZWNvZGVyIGludGVyZmFjZSIpOwotCi0gICAgaWYoIGRlY29kZXJUeXBlID49IE00QURfa1R5cGVfTkIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICJJbnZhbGlkIGF1ZGlvIGRlY29kZXIgdHlwZSIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLSAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdKTsKLSAgICAgICAgcEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdID0gTTRPU0FfTlVMTDsKLQotICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0pOwotICAgICAgICAgICAgcEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotCi0KLSAgICBwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0gPSBwRGVjb2RlckludGVyZmFjZTsKLSAgICBwQy0+bV9wQXVkaW9EZWNvZGVyRmxhZ1RhYmxlW2RlY29kZXJUeXBlXSA9Ci0gICAgICAgIE00T1NBX0ZBTFNFOyAvKiBpbnRlcm5hbCBkZWNvZGVyICovCi0gICAgcEMtPnBBdWRpb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXSA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbFdyaXRlcnMoKQotICogQGJyaWVmICAgIFVucmVnaXN0ZXIgd3JpdGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbFdyaXRlcnMoIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMgKQotewotICAgIE00T1NBX0ludDMyIGk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBNNFdSSVRFUl9rVHlwZV9OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+V3JpdGVySW50ZXJmYWNlW2ldLnBHbG9iYWxGY3RzICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5Xcml0ZXJJbnRlcmZhY2VbaV0ucEdsb2JhbEZjdHMpOwotICAgICAgICAgICAgcEMtPldyaXRlckludGVyZmFjZVtpXS5wR2xvYmFsRmN0cyA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggcEMtPldyaXRlckludGVyZmFjZVtpXS5wRGF0YUZjdHMgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocEMtPldyaXRlckludGVyZmFjZVtpXS5wRGF0YUZjdHMpOwotICAgICAgICAgICAgcEMtPldyaXRlckludGVyZmFjZVtpXS5wRGF0YUZjdHMgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcEMtPnBXcml0ZXJHbG9iYWxGY3RzID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFdyaXRlckRhdGFGY3RzID0gTTRPU0FfTlVMTDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsRW5jb2RlcnMoKQotICogQGJyaWVmICAgIFVucmVnaXN0ZXIgdGhlIGVuY29kZXJzCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbEVuY29kZXJzKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDICkKLXsKLSAgICBNNE9TQV9JbnQzMiBpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxFbmNvZGVyczogcEM9MHgleCIsIHBDKTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgTTRFTkNPREVSX2tWaWRlb19OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+cFZpZGVvRW5jb2RlckludGVyZmFjZVtpXSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YkFsbG93RnJlZWluZ09NWENvZGVjSW50ZXJmYWNlICkKLSAgICAgICAgICAgIHsKLQotI2VuZGlmCi0KLSAgICAgICAgICAgICAgICBmcmVlKHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW2ldKTsKLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICAgICAgfQotCi0jZW5kaWYKLQotICAgICAgICAgICAgcEMtPnBWaWRlb0VuY29kZXJJbnRlcmZhY2VbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yICggaSA9IDA7IGkgPCBNNEVOQ09ERVJfa0F1ZGlvX05COyBpKysgKQotICAgIHsKLSAgICAgICAgaWYoIHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW2ldICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iQWxsb3dGcmVlaW5nT01YQ29kZWNJbnRlcmZhY2UgKQotICAgICAgICAgICAgewotCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAvKkRvbid0IGZyZWUgZXh0ZXJuYWwgYXVkaW8gZW5jb2RlcnMgaW50ZXJmYWNlcyovCi0KLSAgICAgICAgICAgICAgICBpZiggTTRPU0FfRkFMU0UgPT0gcEMtPnBBdWRpb0VuY29kZXJGbGFnW2ldICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUocEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbaV0pOwotICAgICAgICAgICAgICAgIH0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICAgICAgfQotCi0jZW5kaWYKLQotICAgICAgICAgICAgcEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMgPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxSZWFkZXJzKCkKLSAqIEBicmllZiAgICBVbnJlZ2lzdGVyIHJlYWRlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxSZWFkZXJzKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDICkKLXsKLSAgICBNNE9TQV9JbnQzMiBpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgTTRSRUFERVJfa01lZGlhVHlwZV9OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+bV9wUmVhZGVyR2xvYmFsSXRUYWJsZVtpXSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+bV9wUmVhZGVyR2xvYmFsSXRUYWJsZVtpXSk7Ci0gICAgICAgICAgICBwQy0+bV9wUmVhZGVyR2xvYmFsSXRUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggcEMtPm1fcFJlYWRlckRhdGFJdFRhYmxlW2ldICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5tX3BSZWFkZXJEYXRhSXRUYWJsZVtpXSk7Ci0gICAgICAgICAgICBwQy0+bV9wUmVhZGVyRGF0YUl0VGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcEMtPm1fdWlOYlJlZ2lzdGVyZWRSZWFkZXJzID0gMDsKLSAgICBwQy0+bV9wUmVhZGVyID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV9wUmVhZGVyRGF0YUl0ID0gTTRPU0FfTlVMTDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsRGVjb2RlcnMoKQotICogQGJyaWVmICAgIFVucmVnaXN0ZXIgdGhlIGRlY29kZXJzCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbERlY29kZXJzKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDICkKLXsKLSAgICBNNE9TQV9JbnQzMiBpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxEZWNvZGVyczogcEM9MHgleCIsIHBDKTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgTTRERUNPREVSX2tWaWRlb1R5cGVfTkI7IGkrKyApCi0gICAgewotICAgICAgICBpZiggcEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbaV0gIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICAgICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJBbGxvd0ZyZWVpbmdPTVhDb2RlY0ludGVyZmFjZSApCi0gICAgICAgICAgICB7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgZnJlZShwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtpXSk7Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgICAgIHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yICggaSA9IDA7IGkgPCBNNEFEX2tUeXBlX05COyBpKysgKQotICAgIHsKLSAgICAgICAgaWYoIHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2ldICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iQWxsb3dGcmVlaW5nT01YQ29kZWNJbnRlcmZhY2UgKQotICAgICAgICAgICAgewotCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAvKkRvbid0IGZyZWUgZXh0ZXJuYWwgYXVkaW8gZGVjb2RlcnMgaW50ZXJmYWNlcyovCi0KLSAgICAgICAgICAgICAgICBpZiggTTRPU0FfRkFMU0UgPT0gcEMtPm1fcEF1ZGlvRGVjb2RlckZsYWdUYWJsZVtpXSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgICAgIHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHBDLT5tX3VpTmJSZWdpc3RlcmVkVmlkZW9EZWMgPSAwOwotICAgIHBDLT5tX3BWaWRlb0RlY29kZXIgPSBNNE9TQV9OVUxMOwotCi0gICAgcEMtPm1fcEF1ZGlvRGVjb2RlciA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudFdyaXRlcigpCi0gKiBAYnJpZWYgICAgU2V0IGN1cnJlbnQgd3JpdGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBtZWRpYVR5cGUgICAgICAgICAgICAoSU4pIE1lZGlhIHR5cGUuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgICAgICAgICAgICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gICAgTTRXQVJfVlNTX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOiAgICBNZWRpYSB0eXBlIG5vdCBzdXBwb3J0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9zZXRDdXJyZW50V3JpdGVyKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIG1lZGlhVHlwZSApCi17Ci0gICAgTTRXUklURVJfT3V0cHV0RmlsZVR5cGUgd3JpdGVyVHlwZTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBzd2l0Y2goIG1lZGlhVHlwZSApCi0gICAgewotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQOgotICAgICAgICAgICAgd3JpdGVyVHlwZSA9IE00V1JJVEVSX2szR1BQOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0ZJTEVfVFlQRSwKLSAgICAgICAgICAgICAgICAiV3JpdGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9GSUxFX1RZUEU7Ci0gICAgfQotCi0gICAgcEMtPnBXcml0ZXJHbG9iYWxGY3RzID0gcEMtPldyaXRlckludGVyZmFjZVt3cml0ZXJUeXBlXS5wR2xvYmFsRmN0czsKLSAgICBwQy0+cFdyaXRlckRhdGFGY3RzID0gcEMtPldyaXRlckludGVyZmFjZVt3cml0ZXJUeXBlXS5wRGF0YUZjdHM7Ci0KLSAgICBpZiggcEMtPnBXcml0ZXJHbG9iYWxGY3RzID09IE00T1NBX05VTEwKLSAgICAgICAgfHwgcEMtPnBXcml0ZXJEYXRhRmN0cyA9PSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNFZTUzNHUFBfRVJSX0lOVkFMSURfRklMRV9UWVBFLAotICAgICAgICAgICAgIldyaXRlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIldyaXRlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9GSUxFX1RZUEU7Ci0gICAgfQotCi0gICAgcEMtPnBXcml0ZXJEYXRhRmN0cy0+cFdyaXRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3NldEN1cnJlbnRWaWRlb0VuY29kZXIoKQotICogQGJyaWVmICAgIFNldCBhIHZpZGVvIGVuY29kZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHBhcmFtICAgIE1lZGlhVHlwZSAgICAgICAgICAgKElOKSBFbmNvZGVyIHR5cGUKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgICAgICAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgICBNNFdBUl9WU1NfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ6ICAgIE1lZGlhIHR5cGUgbm90IHN1cHBvcnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX3NldEN1cnJlbnRWaWRlb0VuY29kZXIoIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfU3RyZWFtVHlwZSBtZWRpYVR5cGUgKQotewotICAgIE00RU5DT0RFUl9Gb3JtYXQgZW5jb2RlclR5cGU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX1RSQUNFM18yKCJNNFZTUzNHUFBfc2V0Q3VycmVudFZpZGVvRW5jb2RlcjogcEM9MHgleCwgbWVkaWFUeXBlPTB4JXgiLAotICAgICAgICBwQywgbWVkaWFUeXBlKTsKLQotICAgIHN3aXRjaCggbWVkaWFUeXBlICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRTWVNfa0gyNjM6Ci0gICAgICAgICAgICBlbmNvZGVyVHlwZSA9IE00RU5DT0RFUl9rSDI2MzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRTWVNfa01QRUdfNDoKLSAgICAgICAgICAgIGVuY29kZXJUeXBlID0gTTRFTkNPREVSX2tNUEVHNDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRTWVNfa0gyNjQ6Ci0gICAgICAgICAgICBlbmNvZGVyVHlwZSA9IE00RU5DT0RFUl9rSDI2NDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwKLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfVklERU9fRk9STUFULAotICAgICAgICAgICAgICAgICJWaWRlbyBlbmNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9WSURFT19GT1JNQVQ7Ci0gICAgfQotCi0gICAgcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzID0gcEMtPnBWaWRlb0VuY29kZXJJbnRlcmZhY2VbZW5jb2RlclR5cGVdOwotICAgIHBDLT5wQ3VycmVudFZpZGVvRW5jb2RlckV4dGVybmFsQVBJID0KLSAgICAgICAgcEMtPnBWaWRlb0VuY29kZXJFeHRlcm5hbEFQSVRhYmxlW2VuY29kZXJUeXBlXTsKLSAgICBwQy0+cEN1cnJlbnRWaWRlb0VuY29kZXJVc2VyRGF0YSA9Ci0gICAgICAgIHBDLT5wVmlkZW9FbmNvZGVyVXNlckRhdGFUYWJsZVtlbmNvZGVyVHlwZV07Ci0KLSAgICBpZiggcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzID09IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsCi0gICAgICAgICAgICBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfVklERU9fRk9STUFULAotICAgICAgICAgICAgIlZpZGVvIGVuY29kZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJWaWRlbyBlbmNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX1ZJREVPX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgU2V0IGFuIGF1ZGlvIGVuY29kZXIKLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgTWVkaWFUeXBlICAgICAgICAoSU4pIEVuY29kZXIgdHlwZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9zZXRDdXJyZW50QXVkaW9FbmNvZGVyKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1N0cmVhbVR5cGUgbWVkaWFUeXBlICkKLXsKLSAgICBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQgZW5jb2RlclR5cGU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX1RSQUNFM18yKCJNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcjogcEM9MHgleCwgbWVkaWFUeXBlPTB4JXgiLAotICAgICAgICBwQywgbWVkaWFUeXBlKTsKLQotICAgIHN3aXRjaCggbWVkaWFUeXBlICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRTWVNfa0FNUjoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcjogZW5jb2RlciB0eXBlIEFNUiIpOwotICAgICAgICAgICAgZW5jb2RlclR5cGUgPSBNNEVOQ09ERVJfa0FNUk5COwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFNZU19rQUFDOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9zZXRDdXJyZW50QXVkaW9FbmNvZGVyOiBlbmNvZGVyIHR5cGUgQUFDIik7Ci0gICAgICAgICAgICBlbmNvZGVyVHlwZSA9IE00RU5DT0RFUl9rQUFDOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsCi0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0FVRElPX0ZPUk1BVCwKLSAgICAgICAgICAgICAgICAiQXVkaW8gZW5jb2RlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfQVVESU9fRk9STUFUOwotICAgIH0KLQotICAgIHBDLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cyA9IHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW2VuY29kZXJUeXBlXTsKLSAgICBwQy0+cEN1cnJlbnRBdWRpb0VuY29kZXJVc2VyRGF0YSA9Ci0gICAgICAgIHBDLT5wQXVkaW9FbmNvZGVyVXNlckRhdGFUYWJsZVtlbmNvZGVyVHlwZV07Ci0KLSAgICBNNE9TQV9UUkFDRTNfMygKLSAgICAgICAgIk00VlNTM0dQUF9zZXRDdXJyZW50QXVkaW9FbmNvZGVyOiBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVsweCV4XT0weCV4LFwKLSAgICAgICAgcEMtPnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzID0gMHgleCIsCi0gICAgICAgIGVuY29kZXJUeXBlLCBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtlbmNvZGVyVHlwZV0sCi0gICAgICAgIHBDLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cyk7Ci0KLSAgICBpZiggcEMtPnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzID09IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsCi0gICAgICAgICAgICBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfQVVESU9fRk9STUFULAotICAgICAgICAgICAgIkF1ZGlvIGVuY29kZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBdWRpbyBlbmNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0FVRElPX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudFJlYWRlcigpCi0gKiBAYnJpZWYgICAgU2V0IGN1cnJlbnQgcmVhZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBtZWRpYVR5cGUgICAgICAgICAgICAoSU4pIE1lZGlhIHR5cGUuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgICAgICAgICAgICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gICAgTTRXQVJfVlNTX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOiAgICBNZWRpYSB0eXBlIG5vdCBzdXBwb3J0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9zZXRDdXJyZW50UmVhZGVyKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIG1lZGlhVHlwZSApCi17Ci0gICAgTTRSRUFERVJfTWVkaWFUeXBlIHJlYWRlclR5cGU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgc3dpdGNoKCBtZWRpYVR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUDoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTVA0OgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NNFY6Ci0gICAgICAgICAgICByZWFkZXJUeXBlID0gTTRSRUFERVJfa01lZGlhVHlwZTNHUFA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BTVI6Ci0gICAgICAgICAgICByZWFkZXJUeXBlID0gTTRSRUFERVJfa01lZGlhVHlwZUFNUjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QMzoKLSAgICAgICAgICAgIHJlYWRlclR5cGUgPSBNNFJFQURFUl9rTWVkaWFUeXBlTVAzOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfUENNOgotICAgICAgICAgICAgcmVhZGVyVHlwZSA9IE00UkVBREVSX2tNZWRpYVR5cGVQQ007Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9GSUxFX1RZUEUsCi0gICAgICAgICAgICAgICAgIlJlYWRlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOVkFMSURfRklMRV9UWVBFOwotICAgIH0KLQotICAgIHBDLT5tX3BSZWFkZXIgPSBwQy0+bV9wUmVhZGVyR2xvYmFsSXRUYWJsZVtyZWFkZXJUeXBlXTsKLSAgICBwQy0+bV9wUmVhZGVyRGF0YUl0ID0gcEMtPm1fcFJlYWRlckRhdGFJdFRhYmxlW3JlYWRlclR5cGVdOwotCi0gICAgaWYoIHBDLT5tX3BSZWFkZXIgPT0gTTRPU0FfTlVMTCB8fCBwQy0+bV9wUmVhZGVyRGF0YUl0ID09IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9GSUxFX1RZUEUsCi0gICAgICAgICAgICAiUmVhZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiUmVhZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9JTlZBTElEX0ZJTEVfVFlQRTsKLSAgICB9Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3NldEN1cnJlbnRWaWRlb0RlY29kZXIoKQotICogQGJyaWVmICAgIFNldCBhIHZpZGVvIGRlY29kZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHBhcmFtICAgIGRlY29kZXJUeXBlICAgICAgICAoSU4pIERlY29kZXIgdHlwZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00V0FSX1ZTU19NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDogICAgTWVkaWEgdHlwZSBub3Qgc3VwcG9ydGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfc2V0Q3VycmVudFZpZGVvRGVjb2RlciggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9TdHJlYW1UeXBlIG1lZGlhVHlwZSApCi17Ci0gICAgTTRERUNPREVSX1ZpZGVvVHlwZSBkZWNvZGVyVHlwZTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfVFJBQ0UzXzIoIk00VlNTM0dQUF9zZXRDdXJyZW50VmlkZW9EZWNvZGVyOiBwQz0weCV4LCBtZWRpYVR5cGU9MHgleCIsCi0gICAgICAgIHBDLCBtZWRpYVR5cGUpOwotCi0gICAgc3dpdGNoKCBtZWRpYVR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0OgotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvSDI2MzoKLSAgICAgICAgICAgIGRlY29kZXJUeXBlID0gTTRERUNPREVSX2tWaWRlb1R5cGVNUEVHNDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2YzoKLSAgICAgICAgICAgIGRlY29kZXJUeXBlID0gTTRERUNPREVSX2tWaWRlb1R5cGVBVkM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVWaWRlb0FSR0I4ODg4OgotICAgICAgICAgICAgZGVjb2RlclR5cGUgPSBNNERFQ09ERVJfa1ZpZGVvVHlwZVlVVjQyMFA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLAotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfVklERU9fRk9STUFULAotICAgICAgICAgICAgICAgICJWaWRlbyBkZWNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfVklERU9fRk9STUFUOwotICAgIH0KLQotICAgIHBDLT5tX3BWaWRlb0RlY29kZXIgPSBwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV07Ci0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0KLSAgICBwQy0+bV9wQ3VycmVudFZpZGVvRGVjb2RlclVzZXJEYXRhID0KLSAgICAgICAgcEMtPm1fcFZpZGVvRGVjb2RlclVzZXJEYXRhVGFibGVbZGVjb2RlclR5cGVdOwotCi0jZW5kaWYgLyogTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTICovCi0KLSAgICBpZiggcEMtPm1fcFZpZGVvRGVjb2RlciA9PSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLAotICAgICAgICAgICAgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9WSURFT19GT1JNQVQsCi0gICAgICAgICAgICAiVmlkZW8gZGVjb2RlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIlZpZGVvIGRlY29kZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX1ZJREVPX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRGVjb2RlcigpCi0gKiBAYnJpZWYgICAgU2V0IGFuIGF1ZGlvIGRlY29kZXIKLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgZGVjb2RlclR5cGUgICAgICAgIChJTikgRGVjb2RlciB0eXBlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX3NldEN1cnJlbnRBdWRpb0RlY29kZXIoIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfU3RyZWFtVHlwZSBtZWRpYVR5cGUgKQotewotICAgIE00QURfVHlwZSBkZWNvZGVyVHlwZTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfVFJBQ0UzXzIoIk00VlNTM0dQUF9zZXRDdXJyZW50QXVkaW9EZWNvZGVyOiBwQz0weCV4LCBtZWRpYVR5cGU9MHgleCIsCi0gICAgICAgIHBDLCBtZWRpYVR5cGUpOwotCi0gICAgc3dpdGNoKCBtZWRpYVR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb0Ftck5hcnJvd0JhbmQ6Ci0gICAgICAgICAgICBkZWNvZGVyVHlwZSA9IE00QURfa1R5cGVBTVJOQjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9BYWM6Ci0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9BYWNBRFRTOgotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjQURJRjoKLSAgICAgICAgICAgIGRlY29kZXJUeXBlID0gTTRBRF9rVHlwZUFBQzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9NcDM6Ci0gICAgICAgICAgICBkZWNvZGVyVHlwZSA9IE00QURfa1R5cGVNUDM7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvUGNtOgotICAgICAgICAgICAgZGVjb2RlclR5cGUgPSBNNEFEX2tUeXBlUENNOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLAotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfQVVESU9fRk9STUFULAotICAgICAgICAgICAgICAgICJBdWRpbyBkZWNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfQVVESU9fRk9STUFUOwotICAgIH0KLQotICAgIHBDLT5tX3BBdWRpb0RlY29kZXIgPSBwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV07Ci0gICAgcEMtPnBDdXJyZW50QXVkaW9EZWNvZGVyVXNlckRhdGEgPQotICAgICAgICBwQy0+cEF1ZGlvRGVjb2RlclVzZXJEYXRhVGFibGVbZGVjb2RlclR5cGVdOwotCi0gICAgaWYoIHBDLT5tX3BBdWRpb0RlY29kZXIgPT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwKLSAgICAgICAgICAgIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfQVVESU9fRk9STUFULAotICAgICAgICAgICAgIkF1ZGlvIGRlY29kZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBdWRpbyBkZWNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9BVURJT19GT1JNQVQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9FZGl0LmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9FZGl0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRmOGI3ZDUuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfRWRpdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQ3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRWU1MzR1BQX0VkaXQuYwotICogQGJyaWVmICAgIFZpZGVvIFN0dWRpbyBTZXJ2aWNlIDNHUFAgZWRpdCBBUEkgaW1wbGVtZW50YXRpb24uCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLS8qKioqKioqKioqKioqKioqLwotLyoqKiBJbmNsdWRlcyAqKiovCi0vKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKLS8qKgotICogT3VyIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJNNFZTUzNHUFBfQVBJLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsVHlwZXMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxGdW5jdGlvbnMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxDb25maWcuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfRXJyb3JDb2Rlcy5oIgotCi0KLS8qKgotICogT1NBTCBoZWFkZXJzICovCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiICAgLyoqPCBPU0FMIG1lbW9yeSBtYW5hZ2VtZW50ICovCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIgICAgLyoqPCBPU0FMIGRlYnVnIG1hbmFnZW1lbnQgKi8KLSNpbmNsdWRlICJNNE9TQV9DaGFyU3Rhci5oIiAvKio8IE9TQUwgc3RyaW5nIG1hbmFnZW1lbnQgKi8KLQotI2lmZGVmIFdJTjMyCi0jaW5jbHVkZSAic3RyaW5nLmgiICAgICAgICAgLyoqPCBmb3Igc3RyY3B5IChEb24ndCB3YW50IHRvIGdldCBkZXBlbmRlbmNpZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggTTRPU0FfU3RyaW5nLi4uKSAqLwotCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgLyogV0lOMzIgKi8KLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLSNpbmNsdWRlICJNNFZEX0VYVEVSTkFMX0ludGVyZmFjZS5oIgotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBTdGF0aWMgbG9jYWwgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBTZXR0aW5nc1Nhbml0eUNoZWNrKAotICAgIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDbGlwICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRUcmFuc2l0aW9uU2V0dGluZ3NTYW5pdHlDaGVjaygKLSAgICBNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzICpwVHJhbnNpdGlvbiApOwotc3RhdGljIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludEZyZWVTZXR0aW5nc0xpc3QoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfRVJSCi1NNFZTUzNHUFBfaW50Q3JlYXRlTVAzT3V0cHV0RmlsZSggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCAqcE91dHB1dEZpbGUgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFN3aXRjaFRvTmV4dENsaXAoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfRVJSCi1NNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2koIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCB1aU1hc3RlckNsaXAgKTsKLXN0YXRpYyBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0QXZlcmFnZVZpZGVvQml0cmF0ZSgKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX0dldFZlcnNpb24oKQotICogQGJyaWVmICAgIEdldCB0aGUgVlNTIDNHUFAgdmVyc2lvbi4KLSAqIEBub3RlICAgIENhbiBiZSBjYWxsZWQgYW55dGltZS4gRG8gbm90IG5lZWQgYW55IGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcFZlcnNpb25JbmZvICAgICAgICAoT1VUKSBQb2ludGVyIHRvIGEgdmVyc2lvbiBpbmZvIHN0cnVjdHVyZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcFZlcnNpb25JbmZvIGlzIE00T1NBX05VTEwgKElmIERlYnVnIExldmVsID49IDIpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfR2V0VmVyc2lvbiggTTRfVmVyc2lvbkluZm8gKnBWZXJzaW9uSW5mbyApCi17Ci0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9HZXRWZXJzaW9uIGNhbGxlZCB3aXRoIHBWZXJzaW9uSW5mbz0weCV4IiwKLSAgICAgICAgcFZlcnNpb25JbmZvKTsKLQotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwVmVyc2lvbkluZm8pLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfR2V0VmVyc2lvbjogcFZlcnNpb25JbmZvIGlzIE00T1NBX05VTEwiKTsKLQotICAgIHBWZXJzaW9uSW5mby0+bV9tYWpvciA9IE00VlNTX1ZFUlNJT05fTUFKT1I7Ci0gICAgcFZlcnNpb25JbmZvLT5tX21pbm9yID0gTTRWU1NfVkVSU0lPTl9NSU5PUjsKLSAgICBwVmVyc2lvbkluZm8tPm1fcmV2aXNpb24gPSBNNFZTU19WRVJTSU9OX1JFVklTSU9OOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0SW5pdCgpCi0gKiBAYnJpZWYgICAgSW5pdGlhbGl6ZXMgdGhlIFZTUyAzR1BQIGVkaXQgb3BlcmF0aW9uIChhbGxvY2F0ZXMgYW4gZXhlY3V0aW9uIGNvbnRleHQpLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChPVVQpIFBvaW50ZXIgb24gdGhlIFZTUyAzR1BQIGVkaXQgY29udGV4dCB0byBhbGxvY2F0ZQotICogQHBhcmFtICAgIHBGaWxlUmVhZFB0ckZjdCAgICAgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSByZWFkZXIgZnVuY3Rpb25zCi0gKiBAcGFyYW0gICBwRmlsZVdyaXRlUHRyRmN0ICAgIChJTikgUG9pbnRlciB0byBPU0FMIGZpbGUgd3JpdGVyIGZ1bmN0aW9ucwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdEluaXQoIE00VlNTM0dQUF9FZGl0Q29udGV4dCAqcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciAqcEZpbGVSZWFkUHRyRmN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciAqcEZpbGVXcml0ZVB0ckZjdCApCi17Ci0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDOwotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMygKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0SW5pdCBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4LCBcCi0gICAgICAgIHBGaWxlUmVhZFB0ckZjdD0weCV4LCBwRmlsZVdyaXRlUHRyRmN0PTB4JXgiLAotICAgICAgICBwQ29udGV4dCwgcEZpbGVSZWFkUHRyRmN0LCBwRmlsZVdyaXRlUHRyRmN0KTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0SW5pdDogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwRmlsZVJlYWRQdHJGY3QpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdEluaXQ6IHBGaWxlUmVhZFB0ckZjdCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBGaWxlV3JpdGVQdHJGY3QpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdEluaXQ6IHBGaWxlV3JpdGVQdHJGY3QgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgKiBBbGxvY2F0ZSB0aGUgVlNTIGNvbnRleHQgYW5kIHJldHVybiBpdCB0byB0aGUgdXNlciAqLwotICAgIHBDID0gKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0Ci0gICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCksCi0gICAgICAgIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikiTTRWU1MzR1BQX0ludGVybmFsQ29udGV4dCIpOwotICAgICpwQ29udGV4dCA9IHBDOwotICAgICAgICAvKiBJbmlhbGl6YXRpb24gb2YgY29udGV4dCBWYXJpYWJsZXMgKi8KLSAgICBtZW1zZXQoKHZvaWQgKilwQywgMCxzaXplb2YoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQpKTsKLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0SW5pdCgpOiB1bmFibGUgdG8gYWxsb2NhdGUgTTRWU1MzR1BQX0ludGVybmFsQ29udGV4dCxcCi0gICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotCi0gICAgLyogSW5pdCB0aGUgY29udGV4dC4gKi8KLSAgICBwQy0+dWlDbGlwTnVtYmVyID0gMDsKLSAgICBwQy0+cENsaXBMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFRyYW5zaXRpb25MaXN0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEVmZmVjdHNMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0MSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmJDbGlwMUFjdGl2ZUZyYW1pbmdFZmZlY3QgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+YkNsaXAyQWN0aXZlRnJhbWluZ0VmZmVjdCA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT51aUN1cnJlbnRDbGlwID0gMDsKLSAgICBwQy0+cEMxID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEMyID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+eXV2MVswXS5wYWNfZGF0YSA9IHBDLT55dXYxWzFdLnBhY19kYXRhID0gcEMtPgotICAgICAgICB5dXYxWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+eXV2MlswXS5wYWNfZGF0YSA9IHBDLT55dXYyWzFdLnBhY19kYXRhID0gcEMtPgotICAgICAgICB5dXYyWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+eXV2M1swXS5wYWNfZGF0YSA9IHBDLT55dXYzWzFdLnBhY19kYXRhID0gcEMtPgotICAgICAgICB5dXYzWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+eXV2NFswXS5wYWNfZGF0YSA9IHBDLT55dXY0WzFdLnBhY19kYXRhID0gcEMtPgotICAgICAgICB5dXY0WzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+YkNsaXAxQXRCZWdpbkN1dCA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5pQ2xpcDFBY3RpdmVFZmZlY3QgPSAwOwotICAgIHBDLT5pQ2xpcDJBY3RpdmVFZmZlY3QgPSAwOwotICAgIHBDLT5iVHJhbnNpdGlvbkVmZmVjdCA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5iU3VwcG9ydFNpbGVuY2UgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qKgotICAgICogSW5pdCBQQy0+ZXdjIG1lbWJlcnMgKi8KLSAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgIHBDLT5ld2MuZElucHV0VmlkQ3RzICA9IDAuMDsKLSAgICBwQy0+ZXdjLmRPdXRwdXRWaWRDdHMgPSAwLjA7Ci0gICAgcEMtPmV3Yy5kQVRvID0gMC4wOwotICAgIHBDLT5ld2MuaU91dHB1dER1cmF0aW9uID0gMDsKLSAgICBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSA9IE00U1lTX2tWaWRlb1Vua25vd247Ci0gICAgcEMtPmV3Yy51aVZpZGVvQml0cmF0ZSA9IDA7Ci0gICAgcEMtPmV3Yy51aVZpZGVvV2lkdGggPSAwOwotICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCA9IDA7Ci0gICAgcEMtPmV3Yy51aVZpZGVvVGltZVNjYWxlID0gMDsKLSAgICBwQy0+ZXdjLmJWaWRlb0RhdGFQYXJ0aXRpb25pbmcgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmV3Yy51aVZpZGVvT3V0cHV0RHNpU2l6ZSA9IDA7Ci0gICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rQXVkaW9Vbmtub3duOwotICAgIHBDLT5ld2MudWlOYkNoYW5uZWxzID0gMTsKLSAgICBwQy0+ZXdjLnVpQXVkaW9CaXRyYXRlID0gMDsKLSAgICBwQy0+ZXdjLnVpU2FtcGxpbmdGcmVxdWVuY3kgPSAwOwotICAgIHBDLT5ld2MucEF1ZGlvT3V0cHV0RHNpID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+ZXdjLnVpQXVkaW9PdXRwdXREc2lTaXplID0gMDsKLSAgICBwQy0+ZXdjLnBBdWRpb0VuY0N0eHQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MucEF1ZGlvRW5jRFNJLmluZm9TaXplID0gMDsKLSAgICBwQy0+ZXdjLnBBdWRpb0VuY0RTSS5wSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmV3Yy51aVNpbGVuY2VQY21TaXplID0gMDsKLSAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSA9IDA7Ci0gICAgcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPSAwOwotICAgIHBDLT5ld2Muc2NhbGVfYXVkaW8gPSAwLjA7Ci0gICAgcEMtPmV3Yy5wRW5jQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmV3Yy5wRHVtbXlBdUJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmV3Yy5pTXBlZzRHb3ZPZmZzZXQgPSAwOwotICAgIHBDLT5ld2MuVnBwRXJyb3IgPSAwOwotICAgIHBDLT5ld2MuZW5jb2RlclN0YXRlID0gTTRWU1MzR1BQX2tOb0VuY29kZXI7Ci0gICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmV3Yy51aVZpZGVvTWF4QXVTaXplID0gMDsKLSAgICBwQy0+ZXdjLnVpQXVkaW9NYXhBdVNpemUgPSAwOwotICAgIC8qKgotICAgICogS2VlcCB0aGUgT1NBTCBmaWxlIGZ1bmN0aW9ucyBwb2ludGVyIHNldCBpbiBvdXIgY29udGV4dCAqLwotICAgIHBDLT5wT3NhRmlsZVJlYWRQdHIgPSBwRmlsZVJlYWRQdHJGY3Q7Ci0gICAgcEMtPnBPc2FGaWxlV3JpdFB0ciA9IHBGaWxlV3JpdGVQdHJGY3Q7Ci0KLSAgICAvKgotICAgICogUmVzZXQgcG9pbnRlcnMgZm9yIG1lZGlhIGFuZCBjb2RlY3MgaW50ZXJmYWNlcyAqLwotCi0gICAgZXJyID0gTTRWU1MzR1BQX2NsZWFySW50ZXJmYWNlVGFibGVzKCZwQy0+U2hlbGxBUEkpOwotICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgLyoKLSAgICAqICBDYWxsIHRoZSBtZWRpYSBhbmQgY29kZWNzIHN1YnNjcmlwdGlvbiBtb2R1bGUgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYygmcEMtPlNoZWxsQVBJKTsKLSAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgIC8qKgotICAgICogVXBkYXRlIG1haW4gc3RhdGUgYXV0b21hdG9uICovCi0gICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfQ1JFQVRFRDsKLSAgICBwQy0+VnN0YXRlID0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9SRUFEX1dSSVRFOwotICAgIHBDLT5Bc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRBdWRpb1N0YXRlX1JFQURfV1JJVEU7Ci0gICAgLyogVGhlIGZsYWcgaXMgc2V0IHRvIGZhbHNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgZXZlcnkgY2xpcCAqLwotICAgIHBDLT5tX2JDbGlwRXh0ZXJuYWxIYXNTdGFydGVkID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBwQy0+YklzTU1TID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBwQy0+aUluT3V0VGltZU9mZnNldCA9IDA7Ci0gICAgcEMtPmJFbmNvZGVUaWxsRW9GID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPm5iQWN0aXZlRWZmZWN0cyA9IDA7Ci0gICAgcEMtPm5iQWN0aXZlRWZmZWN0czEgPSAwOwotICAgIHBDLT5iSXNzZWNvbmRDbGlwID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPm1fYWlyX2NvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2VkaXRJbml0KCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0Q3JlYXRlQ2xpcFNldHRpbmdzKCkKLSAqIEBicmllZiAgICBBbGxvd3MgZmlsbGluZyBhIGNsaXAgc2V0dGluZ3Mgc3RydWN0dXJlIHdpdGggZGVmYXVsdCB2YWx1ZXMKLSAqCi0gKiBAbm90ZSAgICBXQVJOSU5HOiBwQ2xpcFNldHRpbmdzLT5FZmZlY3RzWyBdIHdpbGwgYmUgYWxsb2NhdGVkIGluIHRoaXMgZnVuY3Rpb24uCi0gKiAgICAgICAgICAgICAgICAgICBwQ2xpcFNldHRpbmdzLT5wRmlsZSAgICAgIHdpbGwgYmUgYWxsb2NhdGVkIGluIHRoaXMgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtICAgIHBDbGlwU2V0dGluZ3MgICAgICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIE00VlNTM0dQUF9DbGlwU2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcGFyYW0gICBwRmlsZSAgICAgICAgICAgICAgIChJTikgQ2xpcCBmaWxlIG5hbWUKLSAqIEBwYXJhbSAgIGZpbGVQYXRoU2l6ZSAgICAgICAgKElOKSBDbGlwIHBhdGggc2l6ZSAobmVlZGVkIGZvciBVVEYgMTYgY29udmVyc2lvbikKLSAqIEBwYXJhbSAgICBuYkVmZmVjdHMgICAgICAgICAgIChJTikgTmIgb2YgZWZmZWN0IHNldHRpbmdzIHRvIGFsbG9jYXRlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUgotTTRWU1MzR1BQX2VkaXRDcmVhdGVDbGlwU2V0dGluZ3MoIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDbGlwU2V0dGluZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkICpwRmlsZSwgTTRPU0FfVUludDMyIGZpbGVQYXRoU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IG5iRWZmZWN0cyApCi17Ci0gICAgTTRPU0FfVUludDggdWlGeDsKLQotICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRDcmVhdGVDbGlwU2V0dGluZ3MgY2FsbGVkIHdpdGggcENsaXBTZXR0aW5ncz0weCVwIiwKLSAgICAgICAgcENsaXBTZXR0aW5ncyk7Ci0KLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlciAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ2xpcFNldHRpbmdzKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRDcmVhdGVDbGlwU2V0dGluZ3M6IHBDbGlwU2V0dGluZ3MgaXMgTlVMTCIpOwotCi0gICAgLyoqCi0gICAgKiBTZXQgdGhlIGNsaXAgc2V0dGluZ3MgdG8gZGVmYXVsdCAqLwotICAgIHBDbGlwU2V0dGluZ3MtPnBGaWxlID0gTTRPU0FfTlVMTDsgICAgICAgIC8qKjwgbm8gZmlsZSAqLwotICAgIHBDbGlwU2V0dGluZ3MtPkZpbGVUeXBlID0KLSAgICAgICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX1Vuc3VwcG9ydGVkOyAvKio8IHVuZGVmaW5lZCAqLwotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEZpbGUgKQotICAgIHsKLSAgICAgICAgLy9wQ2xpcFNldHRpbmdzLT5wRmlsZSA9IChNNE9TQV9DaGFyKikgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHN0cmxlbihwRmlsZSkrMSwgTTRWU1MzR1BQLAotICAgICAgICAvLyAicENsaXBTZXR0aW5ncy0+cEZpbGUiKTsKLSAgICAgICAgLypGQjogYWRkIGNsaXAgcGF0aCBzaXplIGJlY2F1c2Ugb2YgdXRmIDE2IGNvbnZlcnNpb24qLwotICAgICAgICBwQ2xpcFNldHRpbmdzLT5wRmlsZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhmaWxlUGF0aFNpemUgKyAxLCBNNFZTUzNHUFAsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJwQ2xpcFNldHRpbmdzLT5wRmlsZSIpOwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDbGlwU2V0dGluZ3MtPnBGaWxlICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q3JlYXRlQ2xpcFNldHRpbmdzIDogRVJST1IgYWxsb2NhdGluZyBmaWxlbmFtZSIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIC8vbWVtY3B5KHBDbGlwU2V0dGluZ3MtPnBGaWxlLCBwRmlsZSwgc3RybGVuKHBGaWxlKSsxKTsKLSAgICAgICAgLypGQjogYWRkIGNsaXAgcGF0aCBzaXplIGJlY2F1c2Ugb2YgdXRmIDE2IGNvbnZlcnNpb24qLwotICAgICAgICBtZW1jcHkoKHZvaWQgKilwQ2xpcFNldHRpbmdzLT5wRmlsZSwgKHZvaWQgKilwRmlsZSwgZmlsZVBhdGhTaXplICsgMSk7Ci0gICAgfQotCi0gICAgLypGQjogYWRkIGZpbGUgcGF0aCBzaXplIHRvIHN1cHBvcnQgVVRGMTYgY29udmVyc2lvbiovCi0gICAgcENsaXBTZXR0aW5ncy0+ZmlsZVBhdGhTaXplID0gZmlsZVBhdGhTaXplICsgMTsKLSAgICAvKiovCi0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuYkFuYWx5c2VkID0gTTRPU0FfRkFMU0U7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuRmlsZVR5cGUgPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLlZlcnNpb25bMF0gPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLlZlcnNpb25bMV0gPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLlZlcnNpb25bMl0gPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uID0gMDsKLQotICAgIHBDbGlwU2V0dGluZ3MtPnVpQmVnaW5DdXRUaW1lID0gMDsgLyoqPCBubyBiZWdpbiBjdXQgKi8KLSAgICBwQ2xpcFNldHRpbmdzLT51aUVuZEN1dFRpbWUgPSAwOyAgIC8qKjwgbm8gZW5kIGN1dCAqLwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLmJTZXRJbWFnZURhdGEgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qKgotICAgICogUmVzZXQgdmlkZW8gY2hhcmFjdGVyaXN0aWNzICovCi0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa05vbmVWaWRlbzsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUNsaXBWaWRlb0R1cmF0aW9uID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZSA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb01heEF1U2l6ZSA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb1dpZHRoID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvSGVpZ2h0ID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvVGltZVNjYWxlID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5mQXZlcmFnZUZyYW1lUmF0ZSA9IDAuMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvUHJvZmlsZSA9Ci0gICAgICAgIE00VklERU9FRElUSU5HX1ZJREVPX1VOS05PV05fUFJPRklMRTsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvTGV2ZWwgPQotICAgICAgICBNNFZJREVPRURJVElOR19WSURFT19VTktOT1dOX0xFVkVMOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLmJNUEVHNGRhdGFQYXJ0aXRpb24gPSBNNE9TQV9GQUxTRTsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5iTVBFRzRydmxjID0gTTRPU0FfRkFMU0U7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuYk1QRUc0cmVzeW5jaE1hcmtlciA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyoqCi0gICAgKiBSZXNldCBhdWRpbyBjaGFyYWN0ZXJpc3RpY3MgKi8KLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpQ2xpcEF1ZGlvRHVyYXRpb24gPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpQXVkaW9CaXRyYXRlID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUF1ZGlvTWF4QXVTaXplID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMgPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kgPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpRXh0ZW5kZWRTYW1wbGluZ0ZyZXF1ZW5jeSA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlEZWNvZGVkUGNtU2l6ZSA9IDA7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9lZGl0U2V0RGVmYXVsdFNldHRpbmdzKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXREdXBsaWNhdGVDbGlwU2V0dGluZ3MoKQotICogQGJyaWVmICAgIER1cGxpY2F0ZXMgYSBjbGlwIHNldHRpbmdzIHN0cnVjdHVyZSwgcGVyZm9ybWluZyBhbGxvY2F0aW9ucyBpZiByZXF1aXJlZAotICoKLSAqIEBwYXJhbSAgICBwQ2xpcFNldHRpbmdzRGVzdCAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzIHN0cnVjdHVyZQotICogQHBhcmFtICAgIHBDbGlwU2V0dGluZ3NPcmlnICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIE00VlNTM0dQUF9DbGlwU2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcGFyYW0gICBiQ29weUVmZmVjdHMgICAgICAgIChJTikgRmxhZyB0byBrbm93IGlmIHdlIGhhdmUgdG8gZHVwbGljYXRlIGVmZmVjdHMKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDbGlwU2V0dGluZ3MgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSCi1NNFZTUzNHUFBfZWRpdER1cGxpY2F0ZUNsaXBTZXR0aW5ncyggTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5nc0Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzT3JpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0Jvb2wgYkNvcHlFZmZlY3RzICkKLXsKLSAgICBNNE9TQV9VSW50OCB1aUZ4OwotCi0gICAgTTRPU0FfVFJBQ0UzXzIoCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdER1cGxpY2F0ZUNsaXBTZXR0aW5ncyBjYWxsZWQgd2l0aCBkZXN0PTB4JXAgc3JjPTB4JXAiLAotICAgICAgICBwQ2xpcFNldHRpbmdzRGVzdCwgcENsaXBTZXR0aW5nc09yaWcpOwotCi0gICAgLyogQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDbGlwU2V0dGluZ3NEZXN0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2VkaXREdXBsaWNhdGVDbGlwU2V0dGluZ3M6IHBDbGlwU2V0dGluZ3NEZXN0IGlzIE5VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBTZXR0aW5nc09yaWcpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdER1cGxpY2F0ZUNsaXBTZXR0aW5nczogcENsaXBTZXR0aW5nc09yaWcgaXMgTlVMTCIpOwotCi0gICAgLyogQ29weSBwbGFpbiBzdHJ1Y3R1cmUgKi8KLSAgICBtZW1jcHkoKHZvaWQgKilwQ2xpcFNldHRpbmdzRGVzdCwKLSAgICAgICAgKHZvaWQgKilwQ2xpcFNldHRpbmdzT3JpZywgc2l6ZW9mKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MpKTsKLQotICAgIC8qIER1cGxpY2F0ZSBmaWxlbmFtZSAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwU2V0dGluZ3NPcmlnLT5wRmlsZSApCi0gICAgewotICAgICAgICAvL3BDbGlwU2V0dGluZ3NEZXN0LT5wRmlsZSA9Ci0gICAgICAgIC8vIChNNE9TQV9DaGFyKikgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHN0cmxlbihwQ2xpcFNldHRpbmdzT3JpZy0+cEZpbGUpKzEsIE00VlNTM0dQUCwKLSAgICAgICAgLy8gInBDbGlwU2V0dGluZ3NEZXN0LT5wRmlsZSIpOwotICAgICAgICAvKkZCOiBjbGlwIHBhdGggc2l6ZSBpcyBuZWVkZWQgZm9yIHV0ZiAxNiBjb252ZXJzaW9uKi8KLSAgICAgICAgLypGQiAyMDA4LzEwLzE2OiBiYWQgYWxsb2NhdGlvbiBzaXplIHdoaWNoIHJhaXNlcyBhIGNyYXNoKi8KLSAgICAgICAgcENsaXBTZXR0aW5nc0Rlc3QtPnBGaWxlID0KLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBDbGlwU2V0dGluZ3NPcmlnLT5maWxlUGF0aFNpemUgKyAxLAotICAgICAgICAgICAgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJwQ2xpcFNldHRpbmdzRGVzdC0+cEZpbGUiKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQ2xpcFNldHRpbmdzRGVzdC0+cEZpbGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXREdXBsaWNhdGVDbGlwU2V0dGluZ3MgOiBFUlJPUiBhbGxvY2F0aW5nIGZpbGVuYW1lIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgLypGQjogY2xpcCBwYXRoIHNpemUgaXMgbmVlZGVkIGZvciB1dGYgMTYgY29udmVyc2lvbiovCi0gICAgICAgIC8vbWVtY3B5KHBDbGlwU2V0dGluZ3NEZXN0LT5wRmlsZSwgcENsaXBTZXR0aW5nc09yaWctPnBGaWxlLAotICAgICAgICAvLyBzdHJsZW4ocENsaXBTZXR0aW5nc09yaWctPnBGaWxlKSsxKTsKLSAgICAgICAgLypGQiAyMDA4LzEwLzE2OiBiYWQgYWxsb2NhdGlvbiBzaXplIHdoaWNoIHJhaXNlcyBhIGNyYXNoKi8KLSAgICAgICAgbWVtY3B5KCh2b2lkICopcENsaXBTZXR0aW5nc0Rlc3QtPnBGaWxlLCAodm9pZCAqKXBDbGlwU2V0dGluZ3NPcmlnLT5wRmlsZSwKLSAgICAgICAgICAgIHBDbGlwU2V0dGluZ3NPcmlnLT5maWxlUGF0aFNpemUvKisxKi8pOwotICAgICAgICAoIChNNE9TQV9DaGFyCi0gICAgICAgICAgICAqKXBDbGlwU2V0dGluZ3NEZXN0LT5wRmlsZSlbcENsaXBTZXR0aW5nc09yaWctPmZpbGVQYXRoU2l6ZV0gPSAnXDAnOwotICAgIH0KLQotICAgIC8qIER1cGxpY2F0ZSBlZmZlY3RzICovCi0gICAgLyogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLQotICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAiTTRWU1MzR1BQX2VkaXREdXBsaWNhdGVDbGlwU2V0dGluZ3MoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdEZyZWVDbGlwU2V0dGluZ3MoKQotICogQGJyaWVmICAgIEZyZWUgdGhlIHBvaW50ZXJzIGFsbG9jYXRlZCBpbiB0aGUgQ2xpcFNldHRpbmcgc3RydWN0dXJlIChwRmlsZSwgRWZmZWN0cykuCi0gKgotICogQHBhcmFtICAgIHBDbGlwU2V0dGluZ3MgICAgICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIE00VlNTM0dQUF9DbGlwU2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdEZyZWVDbGlwU2V0dGluZ3MoCi0gICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5ncyApCi17Ci0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBTZXR0aW5ncyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0RnJlZUNsaXBTZXR0aW5nczogcENsaXBTZXR0aW5ncyBpcyBOVUxMIik7Ci0KLSAgICAvKiBmcmVlIGZpbGVuYW1lICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBTZXR0aW5ncy0+cEZpbGUgKQotICAgIHsKLSAgICAgICAgZnJlZShwQ2xpcFNldHRpbmdzLT5wRmlsZSk7Ci0gICAgICAgIHBDbGlwU2V0dGluZ3MtPnBGaWxlID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKiBmcmVlIGVmZmVjdHMgc2V0dGluZ3MgKi8KLSAgICAvKiAgICBpZihNNE9TQV9OVUxMICE9IHBDbGlwU2V0dGluZ3MtPkVmZmVjdHMpCi0gICAgewotICAgIGZyZWUocENsaXBTZXR0aW5ncy0+RWZmZWN0cyk7Ci0gICAgcENsaXBTZXR0aW5ncy0+RWZmZWN0cyA9IE00T1NBX05VTEw7Ci0gICAgcENsaXBTZXR0aW5ncy0+bmJFZmZlY3RzID0gMDsKLSAgICB9IFJDICovCi0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRPcGVuKCkKLSAqIEBicmllZiAgICAgU2V0IHRoZSBWU1MgaW5wdXQgYW5kIG91dHB1dCBmaWxlcy4KLSAqIEBub3RlICAgICAgSXQgb3BlbnMgdGhlIGlucHV0IGZpbGUsIGJ1dCB0aGUgb3V0cHV0IGZpbGUgbWF5IG5vdCBiZSBjcmVhdGVkIHlldC4KLSAqIEBwYXJhbSAgICAgcENvbnRleHQgICAgICAgICAgIChJTikgVlNTIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgICBwU2V0dGluZ3MgICAgICAgICAgIChJTikgRWRpdCBzZXR0aW5ncwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgIFZTUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRPcGVuKCBNNFZTUzNHUFBfRWRpdENvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FZGl0U2V0dGluZ3MgKnBTZXR0aW5ncyApCi17Ci0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDID0KLSAgICAgICAgKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICopcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX0ludDMyIGk7Ci0gICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgb3V0cHV0RmlsZVR5cGUgPQotICAgICAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfVW5zdXBwb3J0ZWQ7IC8qKjwgM0dQUCBvciBNUDMgKHdlIGRvbid0IGRvIEFNUiBvdXRwdXQpICovCi0gICAgTTRPU0FfVUludDMyIHVpQzFkdXJhdGlvbiwgdWlDMmR1cmF0aW9uOwotCi0gICAgTTRPU0FfVFJBQ0UzXzIoCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW4gY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCwgcFNldHRpbmdzPTB4JXgiLAotICAgICAgICBwQ29udGV4dCwgcFNldHRpbmdzKTsKLQotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwU2V0dGluZ3MpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IHBTZXR0aW5ncyBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBTZXR0aW5ncy0+cENsaXBMaXN0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBwU2V0dGluZ3MtPnBDbGlwTGlzdCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKCggcFNldHRpbmdzLT51aUNsaXBOdW1iZXIgPiAxKQotICAgICAgICAmJiAoTTRPU0FfTlVMTCA9PSBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBpZiggKCBwQy0+U3RhdGUgIT0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfQ1JFQVRFRCkKLSAgICAgICAgJiYgKHBDLT5TdGF0ZSAhPSBNNFZTUzNHUFBfa0VkaXRTdGF0ZV9DTE9TRUQpICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogU3RhdGUgZXJyb3IgKDB4JXgpISBSZXR1cm5pbmcgTTRFUlJfU1RBVEUiLAotICAgICAgICAgICAgcEMtPlN0YXRlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSBhbnkgcHJldmlvdXNseSBhbGxvY2F0ZWQgaW50ZXJuYWwgc2V0dGluZ3MgbGlzdCAqLwotICAgIE00VlNTM0dQUF9pbnRGcmVlU2V0dGluZ3NMaXN0KHBDKTsKLQotICAgIC8qKgotICAgICogQ29weSB0aGUgdXNlciBzZXR0aW5ncyBpbiBvdXIgY29udGV4dCAqLwotICAgIHBDLT51aUNsaXBOdW1iZXIgPSBwU2V0dGluZ3MtPnVpQ2xpcE51bWJlcjsKLQotICAgIC8qKgotICAgICogQ29weSB0aGUgY2xpcCBsaXN0ICovCi0gICAgcEMtPnBDbGlwTGlzdCA9Ci0gICAgICAgIChNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfQ2xpcFNldHRpbmdzKQotICAgICAgICAqIHBDLT51aUNsaXBOdW1iZXIsIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicEMtPnBDbGlwTGlzdCIpOwotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBDbGlwTGlzdCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IHVuYWJsZSB0byBhbGxvY2F0ZSBwQy0+U2V0dGluZ3MucENsaXBMaXN0LFwKLSAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgZm9yICggaSA9IDA7IGkgPCBwU2V0dGluZ3MtPnVpQ2xpcE51bWJlcjsgaSsrICkKLSAgICB7Ci0gICAgICAgIE00VlNTM0dQUF9lZGl0RHVwbGljYXRlQ2xpcFNldHRpbmdzKCYocEMtPnBDbGlwTGlzdFtpXSksCi0gICAgICAgICAgICBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSwgTTRPU0FfVFJVRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb3B5IGVmZmVjdHMgbGlzdCBSQyAqLwotCi0gICAgLypGQiBidWcgZml4IDE5LjAzLjIwMDggaWYgdGhlIG51bWJlciBvZiBlZmZlY3RzIGlzIDAgLT4gY3Jhc2gqLwotICAgIGlmKCBwU2V0dGluZ3MtPm5iRWZmZWN0cyA+IDAgKQotICAgIHsKLSAgICAgICAgcEMtPm5iRWZmZWN0cyA9IHBTZXR0aW5ncy0+bmJFZmZlY3RzOwotICAgICAgICBwQy0+cEVmZmVjdHNMaXN0ID0gKE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncwotICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncykgKiBwQy0+bmJFZmZlY3RzLAotICAgICAgICAgICAgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJwQy0+cEVmZmVjdHNMaXN0Iik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBFZmZlY3RzTGlzdCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IHVuYWJsZSB0byBhbGxvY2F0ZSBwQy0+cEVmZmVjdHNMaXN0LCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgcEMtPm5iRWZmZWN0czsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopICYocEMtPnBFZmZlY3RzTGlzdFtpXSksCi0gICAgICAgICAgICAgICAgKHZvaWQgKikgJihwU2V0dGluZ3MtPkVmZmVjdHNbaV0pLAotICAgICAgICAgICAgICAgIHNpemVvZihNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEFsbG9jYXRlIGFjdGl2ZSBlZmZlY3RzIGxpc3QgUkMgKi8KLSAgICAgICAgcEMtPnBBY3RpdmVFZmZlY3RzTGlzdCA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00T1NBX1VJbnQ4KSAqIHBDLT5uYkVmZmVjdHMsCi0gICAgICAgICAgICBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopInBDLT5wQWN0aXZlRWZmZWN0c0xpc3QiKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0ICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogdW5hYmxlIHRvIGFsbG9jYXRlIHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QsXAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBbGxvY2F0ZSBhY3RpdmUgZWZmZWN0cyBsaXN0ICovCi0gICAgICAgIHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QxID0KLSAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRPU0FfVUludDgpICogcEMtPm5iRWZmZWN0cywKLSAgICAgICAgICAgIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicEMtPnBBY3RpdmVFZmZlY3RzTGlzdCIpOwotICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0MSkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00VlNTM0dQUF9lZGl0T3BlbjogdW5hYmxlIHRvIGFsbG9jYXRlIHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEMtPm5iRWZmZWN0cyA9IDA7Ci0gICAgICAgIHBDLT5uYkFjdGl2ZUVmZmVjdHMgPSAwOwotICAgICAgICBwQy0+bmJBY3RpdmVFZmZlY3RzMSA9IDA7Ci0gICAgICAgIHBDLT5wRWZmZWN0c0xpc3QgPSBNNE9TQV9OVUxMOwotICAgICAgICBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPnBBY3RpdmVFZmZlY3RzTGlzdDEgPSBNNE9TQV9OVUxMOwotICAgICAgICBwQy0+YkNsaXAxQWN0aXZlRnJhbWluZ0VmZmVjdCA9IE00T1NBX0ZBTFNFOwotICAgICAgICBwQy0+YkNsaXAyQWN0aXZlRnJhbWluZ0VmZmVjdCA9IE00T1NBX0ZBTFNFOwotICAgIH0KLQotICAgIC8qKgotICAgICogVGVzdCB0aGUgY2xpcCBhbmFseXNpcyBkYXRhLCBpZiBpdCBpcyBub3QgcHJvdmlkZWQsIGFuYWx5c2UgdGhlIGNsaXBzIGJ5IG91cnNlbHZlcy4gKi8KLSAgICBmb3IgKCBpID0gMDsgaSA8IHBDLT51aUNsaXBOdW1iZXI7IGkrKyApCi0gICAgewotICAgICAgICBpZiggTTRPU0FfRkFMU0UgPT0gcEMtPnBDbGlwTGlzdFtpXS5DbGlwUHJvcGVydGllcy5iQW5hbHlzZWQgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKio8IEFuYWx5c2lzIG5vdCBwcm92aWRlZCBieSB0aGUgaW50ZWdyYXRvciAqLwotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcChwQy0+cENsaXBMaXN0W2ldLnBGaWxlLAotICAgICAgICAgICAgICAgIHBDLT5wQ2xpcExpc3RbaV0uRmlsZVR5cGUsICZwQy0+cENsaXBMaXN0W2ldLkNsaXBQcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgIHBDLT5wT3NhRmlsZVJlYWRQdHIpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBNNFZTUzNHUFBfZWRpdEFuYWx5c2VDbGlwIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGNsaXAgY29tcGF0aWJpbGl0eSAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgcEMtPnVpQ2xpcE51bWJlcjsgaSsrICkKLSAgICB7Ci0gICAgICAgIGlmIChwQy0+cENsaXBMaXN0W2ldLkZpbGVUeXBlICE9TTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4KSB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQ2hlY2sgYWxsIHRoZSBjbGlwcyBhcmUgY29tcGF0aWJsZSB3aXRoIFZTUyAzR1BQICovCi0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2hlY2tDbGlwQ29tcGF0aWJsZVdpdGhWc3NFZGl0aW5nKAotICAgICAgICAgICAgICAgICZwQy0+cENsaXBMaXN0W2ldLkNsaXBQcm9wZXJ0aWVzKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMigKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjpcCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDaGVja0NsaXBDb21wYXRpYmxlV2l0aFZzc0VkaXRpbmcoJWQpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICBpLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayB0aGUgbWFzdGVyIGNsaXAgdmVyc3VzIGFsbCB0aGUgb3RoZXIgb25lcy4KLSAgICAgICAgKGluY2x1ZGluZyBtYXN0ZXIgY2xpcCB3aXRoIGl0c2VsZiwgZWxzZSB2YXJpYWJsZXMgZm9yIG1hc3RlciBjbGlwCi0gICAgICAgIGFyZSBub3QgcHJvcGVybHkgc2V0dGVkKSAqLwotICAgICAgICBpZihwQy0+cENsaXBMaXN0W2ldLkZpbGVUeXBlICE9IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgewotCi0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHkoCi0gICAgICAgICAgICAgICAgJnBDLT5wQ2xpcExpc3RbcFNldHRpbmdzLT51aU1hc3RlckNsaXBdLkNsaXBQcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICZwQy0+cENsaXBMaXN0W2ldLkNsaXBQcm9wZXJ0aWVzKTsKLSAgICAgICAgICAgIC8qIGluIGNhc2Ugb2Ygd2FybmluZyByZWdhcmRpbmcgYXVkaW8gaW5jb21wYXRpYmlsaXR5LAotICAgICAgICAgICAgICAgIGVkaXRpbmcgY29udGludWVzICovCi0gICAgICAgICAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHkgXAotICAgICAgICAgICAgICAgICAgICAgICAgKCVkKSByZXR1cm5zIDB4JXghIiwgaSwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcEMtPnBDbGlwTGlzdFtpXS5DbGlwUHJvcGVydGllcy5iQXVkaW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcCA9Ci0gICAgICAgICAgICAgTTRPU0FfRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyogU2VhcmNoIGF1ZGlvIHRyYWNrcyB0aGF0IGNhbm5vdCBiZSBlZGl0ZWQgOgotICAgICogICAtIGRlbGV0ZSBhbGwgYXVkaW8gZWZmZWN0cyBmb3IgdGhlIGNsaXAKLSAgICAqICAgLSBpZiBtYXN0ZXIgY2xpcCBpcyBlZGl0YWJsZSBsZXQgdGhlIHRyYW5zaXRpb24KLSAgICAoYmFkIHRyYWNrIHdpbGwgYmUgcmVwbGFjZWQgbGF0ZXIgd2l0aCBzaWxlbmNlKQotICAgICogICAtIGlmIG1hc3RlciBjbGlwIGlzIG5vdCBlZGl0YWJsZSBzd2l0Y2ggdG8gYSBkdW1teSB0cmFuc2l0aW9uIChvbmx5IGNvcHkvcGFzdGUpICovCi0gICAgZm9yICggaSA9IDA7IGkgPCBwQy0+dWlDbGlwTnVtYmVyOyBpKysgKQotICAgIHsKLSAgICAgICAgaWYoIE00T1NBX0ZBTFNFID09IHBDLT5wQ2xpcExpc3RbaV0uQ2xpcFByb3BlcnRpZXMuYkF1ZGlvSXNFZGl0YWJsZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1VJbnQ4IHVpRng7Ci0KLSAgICAgICAgICAgIGZvciAoIHVpRnggPSAwOyB1aUZ4IDwgcEMtPm5iRWZmZWN0czsgdWlGeCsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+cEVmZmVjdHNMaXN0W3VpRnhdLkF1ZGlvRWZmZWN0VHlwZQotICAgICAgICAgICAgICAgICAgICA9IE00VlNTM0dQUF9rQXVkaW9FZmZlY3RUeXBlX05vbmU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCAoIGkgPCAocEMtPnVpQ2xpcE51bWJlciAtIDEpKQotICAgICAgICAgICAgICAgICYmIChNNE9TQV9OVUxMICE9IHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldKQotICAgICAgICAgICAgICAgICYmIChNNE9TQV9GQUxTRSA9PSBwQy0+cENsaXBMaXN0W3BTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgdWlNYXN0ZXJDbGlwXS5DbGlwUHJvcGVydGllcy5iQXVkaW9Jc0VkaXRhYmxlKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPkF1ZGlvVHJhbnNpdGlvblR5cGUKLSAgICAgICAgICAgICAgICAgICAgPSBNNFZTUzNHUFBfa0F1ZGlvVHJhbnNpdGlvblR5cGVfTm9uZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogV2UgYWRkIGEgdHJhbnNpdGlvbiBvZiBkdXJhdGlvbiAwIGF0IHRoZSBlbmQgb2YgdGhlIGxhc3QgY2xpcC4KLSAgICAqIEl0IHdpbGwgc3VwcHJlc3MgYSB3aG9sZSBidW5jaCBhIHRlc3QgbGF0dGVyIGluIHRoZSBwcm9jZXNzaW5nLi4uICovCi0gICAgcEMtPnBUcmFuc2l0aW9uTGlzdCA9IChNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzCi0gICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzKQotICAgICAgICAqIChwQy0+dWlDbGlwTnVtYmVyKSwgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJwQy0+cFRyYW5zaXRpb25MaXN0Iik7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cFRyYW5zaXRpb25MaXN0ICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogdW5hYmxlIHRvIGFsbG9jYXRlIHBDLT5TZXR0aW5ncy5wVHJhbnNpdGlvbkxpc3QsXAotICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAvKio8IGNvcHkgdHJhbnNpdGlvbiBzZXR0aW5ncyAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgKHBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyIC0gMSk7IGkrKyApCi0gICAgewotICAgICAgICBtZW1jcHkoKHZvaWQgKikgJihwQy0+cFRyYW5zaXRpb25MaXN0W2ldKSwKLSAgICAgICAgICAgICh2b2lkICopcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0sCi0gICAgICAgICAgICBzaXplb2YoTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncykpOwotICAgIH0KLQotICAgIC8qKjwgV2UgZmlsbCB0aGUgbGFzdCAiZHVtbXkiIHRyYW5zaXRpb24gKi8KLSAgICBwQy0+cFRyYW5zaXRpb25MaXN0W3BDLT51aUNsaXBOdW1iZXIgLSAxXS51aVRyYW5zaXRpb25EdXJhdGlvbiA9IDA7Ci0gICAgcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+dWlDbGlwTnVtYmVyCi0gICAgICAgIC0gMV0uVmlkZW9UcmFuc2l0aW9uVHlwZSA9IE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9Ob25lOwotICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ2xpcE51bWJlcgotICAgICAgICAtIDFdLkF1ZGlvVHJhbnNpdGlvblR5cGUgPSBNNFZTUzNHUFBfa0F1ZGlvVHJhbnNpdGlvblR5cGVfTm9uZTsKLQotICAgIC8qKgotICAgICogQXZvaWQgd2VpcmQgY2xpcCBzZXR0aW5ncyAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgcFNldHRpbmdzLT51aUNsaXBOdW1iZXI7IGkrKyApCi0gICAgewotICAgICAgICBpZiAocEMtPnBDbGlwTGlzdFtpXS5GaWxlVHlwZSAhPU00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgewotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBTZXR0aW5nc1Nhbml0eUNoZWNrKCZwQy0+cENsaXBMaXN0W2ldKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogTTRWU1MzR1BQX2ludENsaXBTZXR0aW5nc1Nhbml0eUNoZWNrIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IChwU2V0dGluZ3MtPnVpQ2xpcE51bWJlciAtIDEpOyBpKysgKQotICAgIHsKLSAgICAgICAgaWYgKHBDLT5wVHJhbnNpdGlvbkxpc3RbaV0udWlUcmFuc2l0aW9uRHVyYXRpb24gIT0gMCkgewotICAgICAgICAgICAgIGlmIChwQy0+cENsaXBMaXN0W2ldLkZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgewotICAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2ldLnVpQmVnaW5DdXRUaW1lID0gMDsKLSAgICAgICAgICAgICAgICAgcEMtPnBDbGlwTGlzdFtpXS51aUVuZEN1dFRpbWUgPQotICAgICAgICAgICAgICAgICAgICAgcEMtPnBUcmFuc2l0aW9uTGlzdFtpXS51aVRyYW5zaXRpb25EdXJhdGlvbjsKLSAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICBpZiAocEMtPnBDbGlwTGlzdFtpKzFdLkZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgewotICAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2krMV0udWlCZWdpbkN1dFRpbWUgPSAwOwotICAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2krMV0udWlFbmRDdXRUaW1lID0KLSAgICAgICAgICAgICAgICAgICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbaV0udWlUcmFuc2l0aW9uRHVyYXRpb247Ci0gICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICAgaWYgKHBDLT5wQ2xpcExpc3RbaV0uRmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4KSB7Ci0gICAgICAgICAgICAgICAgIHBDLT5wQ2xpcExpc3RbaV0udWlFbmRDdXRUaW1lID0KLSAgICAgICAgICAgICAgICAgICAgIHBDLT5wQ2xpcExpc3RbaV0udWlFbmRDdXRUaW1lIC0gcEMtPnBDbGlwTGlzdFtpXS51aUJlZ2luQ3V0VGltZTsKLSAgICAgICAgICAgICAgICAgcEMtPnBDbGlwTGlzdFtpXS51aUJlZ2luQ3V0VGltZSA9IDA7Ci0gICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgaWYgKHBDLT5wQ2xpcExpc3RbaSsxXS5GaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpIHsKLSAgICAgICAgICAgICAgICAgcEMtPnBDbGlwTGlzdFtpKzFdLnVpRW5kQ3V0VGltZSA9Ci0gICAgICAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2krMV0udWlFbmRDdXRUaW1lIC0gcEMtPnBDbGlwTGlzdFtpKzFdLnVpQmVnaW5DdXRUaW1lOwotICAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2krMV0udWlCZWdpbkN1dFRpbWUgPSAwOwotICAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogTWF4aW11bSB0cmFuc2l0aW9uIGR1cmF0aW9uIGJldHdlZW4gY2xpcCBuIGFuZCBjbGlwIG4rMSBpcyB0aGUgZHVyYXRpb24KLSAgICAgICAgKiBvZiB0aGUgc2hvcnRlc3QgY2xpcCAqLwotICAgICAgICBpZiggMCA9PSBwQy0+cENsaXBMaXN0W2ldLnVpRW5kQ3V0VGltZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVpQzFkdXJhdGlvbiA9IHBDLT5wQ2xpcExpc3RbaV0uQ2xpcFByb3BlcnRpZXMudWlDbGlwVmlkZW9EdXJhdGlvbjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKjwgZHVyYXRpb24gb2YgY2xpcCBuIGlzIHRoZSBlbmQgY3V0IHRpbWUgKi8KLSAgICAgICAgICAgIHVpQzFkdXJhdGlvbiA9IHBDLT5wQ2xpcExpc3RbaV0udWlFbmRDdXRUaW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqPCBTdWJzdHJhY3QgYmVnaW4gY3V0ICovCi0gICAgICAgIHVpQzFkdXJhdGlvbiAtPSBwQy0+cENsaXBMaXN0W2ldLnVpQmVnaW5DdXRUaW1lOwotCi0gICAgICAgIC8qKjwgQ2hlY2sgdGhhdCB0aGUgdHJhbnNpdGlvbiBpcyBzaG9ydGVyIHRoYW4gY2xpcCBuICovCi0gICAgICAgIGlmKCBwQy0+cFRyYW5zaXRpb25MaXN0W2ldLnVpVHJhbnNpdGlvbkR1cmF0aW9uID4gdWlDMWR1cmF0aW9uICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPnBUcmFuc2l0aW9uTGlzdFtpXS51aVRyYW5zaXRpb25EdXJhdGlvbiA9IHVpQzFkdXJhdGlvbiAtIDE7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggMCA9PSBwQy0+cENsaXBMaXN0W2kgKyAxXS51aUVuZEN1dFRpbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB1aUMyZHVyYXRpb24gPQotICAgICAgICAgICAgICAgIHBDLT5wQ2xpcExpc3RbaSArIDFdLkNsaXBQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKio8IGR1cmF0aW9uIG9mIGNsaXAgbisxIGlzIHRoZSBlbmQgY3V0IHRpbWUgKi8KLSAgICAgICAgICAgIHVpQzJkdXJhdGlvbiA9IHBDLT5wQ2xpcExpc3RbaSArIDFdLnVpRW5kQ3V0VGltZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKjwgU3Vic3RyYWN0IGJlZ2luIGN1dCAqLwotICAgICAgICB1aUMyZHVyYXRpb24gLT0gcEMtPnBDbGlwTGlzdFtpICsgMV0udWlCZWdpbkN1dFRpbWU7Ci0KLSAgICAgICAgLyoqPCBDaGVjayB0aGF0IHRoZSB0cmFuc2l0aW9uIGlzIHNob3J0ZXIgdGhhbiBjbGlwIG4rMSAqLwotICAgICAgICBpZiggcEMtPnBUcmFuc2l0aW9uTGlzdFtpXS51aVRyYW5zaXRpb25EdXJhdGlvbiA+IHVpQzJkdXJhdGlvbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbaV0udWlUcmFuc2l0aW9uRHVyYXRpb24gPSB1aUMyZHVyYXRpb24gLSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQXZvaWQgd2VpcmQgdHJhbnNpdGlvbiBzZXR0aW5ncyAqLwotICAgICAgICBlcnIgPQotICAgICAgICAgICAgTTRWU1MzR1BQX2ludFRyYW5zaXRpb25TZXR0aW5nc1Nhbml0eUNoZWNrKCZwQy0+cFRyYW5zaXRpb25MaXN0W2ldKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBNNFZTUzNHUFBfaW50Q2xpcFNldHRpbmdzU2FuaXR5Q2hlY2sgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayB0aGF0IHR3byB0cmFuc2l0aW9ucyBhcmUgbm90IG92ZXJsYXBwaW5nCi0gICAgICAgICAgKG5vIG92ZXJsYXBwaW5nIHBvc3NpYmxlIGZvciBmaXJzdCBjbGlwKSAqLwotICAgICAgICBpZiggaSA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVGhlcmUgaXMgYSB0cmFuc2l0aW9uIG92ZXJsYXAgaWYgdGhlIHN1bSBvZiB0aGUgZHVyYXRpb24gb2YKLSAgICAgICAgICAgICAgdHdvIGNvbnNlY3V0aXZlIHRyYW5zaXRpb25zCi0gICAgICAgICAgICAqIGlzIGhpZ2hlciB0aGFuIHRoZSBkdXJhdGlvbiBvZiB0aGUgY2xpcCBpbi1iZXR3ZWVuLiAqLwotICAgICAgICAgICAgaWYoICggcEMtPnBUcmFuc2l0aW9uTGlzdFtpIC0gMV0udWlUcmFuc2l0aW9uRHVyYXRpb24KLSAgICAgICAgICAgICAgICArIHBDLT5wVHJhbnNpdGlvbkxpc3RbaV0udWlUcmFuc2l0aW9uRHVyYXRpb24pID49IHVpQzFkdXJhdGlvbiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IE92ZXJsYXBwaW5nIHRyYW5zaXRpb25zIG9uIGNsaXAgJWQsXAotICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9PVkVSTEFQUElOR19UUkFOU0lUSU9OUyIsCi0gICAgICAgICAgICAgICAgICAgIGkpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX09WRVJMQVBQSU5HX1RSQU5TSVRJT05TOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBPdXRwdXQgY2xpcCBkdXJhdGlvbiAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgcEMtPnVpQ2xpcE51bWJlcjsgaSsrICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENvbXB1dGUgdGhlIHN1bSBvZiB0aGUgY2xpcCBkdXJhdGlvbiAqLwotICAgICAgICBpZiggMCA9PSBwQy0+cENsaXBMaXN0W2ldLnVpRW5kQ3V0VGltZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5ld2MuaU91dHB1dER1cmF0aW9uICs9Ci0gICAgICAgICAgICAgICAgcEMtPgotICAgICAgICAgICAgICAgIHBDbGlwTGlzdFsKLSAgICAgICAgICAgICAgICAgICAgaV0uQ2xpcFByb3BlcnRpZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICB1aUNsaXBWaWRlb0R1cmF0aW9uOyAvKiBPbmx5IHZpZGVvIHRyYWNrIGR1cmF0aW9uIGlzIGltcG9ydGFudCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZvaWQgZGV2aWF0aW9uIGlmIGF1ZGlvIHRyYWNrIGlzIGxvbmdlciAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPmV3Yy5pT3V0cHV0RHVyYXRpb24gKz0KLSAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2ldLnVpRW5kQ3V0VGltZTsgLyoqPCBBZGQgZW5kIGN1dCAqLwotICAgICAgICB9Ci0KLSAgICAgICAgcEMtPmV3Yy5pT3V0cHV0RHVyYXRpb24gLT0KLSAgICAgICAgICAgIHBDLT5wQ2xpcExpc3RbaV0udWlCZWdpbkN1dFRpbWU7IC8qKjwgUmVtb3ZlIGJlZ2luIGN1dCAqLwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFJlbW92ZSB0aGUgZHVyYXRpb24gb2YgdGhlIHRyYW5zaXRpb24gKGl0IGlzIGNvdW50ZWQgdHdpY2UpICovCi0gICAgICAgIHBDLT5ld2MuaU91dHB1dER1cmF0aW9uIC09IHBDLT5wVHJhbnNpdGlvbkxpc3RbaV0udWlUcmFuc2l0aW9uRHVyYXRpb247Ci0gICAgfQotCi0gICAgLyogR2V0IHZpZGVvIHByb3BlcnRpZXMgZnJvbSBvdXRwdXQgcHJvcGVydGllcyAqLwotCi0gICAgLyogR2V0IG91dHB1dCB3aWR0aCBhbmQgaGVpZ2h0ICovCi0gICAgc3dpdGNoKHBDLT54VlNTLm91dHB1dFZpZGVvU2l6ZSkgewotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tTUUNJRjoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gMTI4OwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ID0gOTY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUVFWR0E6Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9XaWR0aCA9IDE2MDsKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCA9IDEyMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRQ0lGOgotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvV2lkdGggPSAxNzY7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQgPSAxNDQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUVZHQToKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gMzIwOwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ID0gMjQwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0NJRjoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gMzUyOwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ID0gMjg4OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1ZHQToKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gNjQwOwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ID0gNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAvKiArUFIgTFY1ODA3ICovCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1dWR0E6Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9XaWR0aCA9IDgwMDsKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCA9IDQ4MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tOVFNDOgotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvV2lkdGggPSA3MjA7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQgPSA0ODA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIC8qIC1QUiBMVjU4MDcgKi8KLSAgICAgICAgICAgIC8qICtDUiBHb29nbGUgKi8KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNjQwXzM2MDoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gNjQwOwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ID0gMzYwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rODU0XzQ4MDoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gTTRFTkNPREVSXzg1NF80ODBfV2lkdGg7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQgPSA0ODA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMjgwXzcyMDoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gMTI4MDsKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCA9IDcyMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMDgwXzcyMDoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gTTRFTkNPREVSXzEwODBfNzIwX1dpZHRoOwotCi0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQgPSA3MjA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rOTYwXzcyMDoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gOTYwOwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ID0gNzIwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazE5MjBfMTA4MDoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gMTkyMDsKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCA9IDEwODg7IC8vIG5lZWQgdG8gYmUgbXVsdGlwbGVzIG9mIDE2Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OiAvKiBJZiBvdXRwdXQgdmlkZW8gc2l6ZSBpcyBub3QgZ2l2ZW4sIHdlIHRha2UgUUNJRiBzaXplICovCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBubyBvdXRwdXQgdmlkZW8gc2l6ZSBnaXZlbiwgZGVmYXVsdCB0byBRQ0lGISIpOwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvV2lkdGggPSAxNzY7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQgPSAxNDQ7Ci0gICAgICAgICAgICBwQy0+eFZTUy5vdXRwdXRWaWRlb1NpemUgPSBNNFZJREVPRURJVElOR19rUUNJRjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHBDLT5ld2MudWlWaWRlb1RpbWVTY2FsZSAgICAgICAgPSAzMDsKLSAgICBwQy0+ZXdjLmJWaWRlb0RhdGFQYXJ0aXRpb25pbmcgID0gMDsKLSAgICAvKiBTZXQgb3V0cHV0IHZpZGVvIHByb2ZpbGUgYW5kIGxldmVsICovCi0gICAgcEMtPmV3Yy5vdXRwdXRWaWRlb1Byb2ZpbGUgPSBwQy0+eFZTUy5vdXRwdXRWaWRlb1Byb2ZpbGU7Ci0gICAgcEMtPmV3Yy5vdXRwdXRWaWRlb0xldmVsID0gcEMtPnhWU1Mub3V0cHV0VmlkZW9MZXZlbDsKLQotICAgIHN3aXRjaChwQy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCkgewotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tIMjYzOgotICAgICAgICAgICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgPSBNNFNZU19rSDI2MzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tNUEVHNDoKLSAgICAgICAgICAgIHBDLT5ld2MuVmlkZW9TdHJlYW1UeXBlID0gTTRTWVNfa01QRUdfNDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tIMjY0OgotICAgICAgICAgICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgPSBNNFNZU19rSDI2NDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgPSBNNFNZU19rVmlkZW9Vbmtub3duOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb3B5IHRoZSBhdWRpbyBwcm9wZXJ0aWVzIG9mIHRoZSBtYXN0ZXIgY2xpcCB0byB0aGUgb3V0cHV0IHByb3BlcnRpZXMgKi8KLSAgICBwQy0+ZXdjLnVpTmJDaGFubmVscyA9Ci0gICAgICAgIHBDLT5wQ2xpcExpc3RbcFNldHRpbmdzLT51aU1hc3RlckNsaXBdLkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVsczsKLSAgICBwQy0+ZXdjLnVpQXVkaW9CaXRyYXRlID0KLSAgICAgICAgcEMtPnBDbGlwTGlzdFtwU2V0dGluZ3MtPnVpTWFzdGVyQ2xpcF0uQ2xpcFByb3BlcnRpZXMudWlBdWRpb0JpdHJhdGU7Ci0gICAgcEMtPmV3Yy51aVNhbXBsaW5nRnJlcXVlbmN5ID0gcEMtPnBDbGlwTGlzdFtwU2V0dGluZ3MtPgotICAgICAgICB1aU1hc3RlckNsaXBdLkNsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3k7Ci0gICAgcEMtPmV3Yy51aVNpbGVuY2VQY21TaXplID0KLSAgICAgICAgcEMtPnBDbGlwTGlzdFtwU2V0dGluZ3MtPnVpTWFzdGVyQ2xpcF0uQ2xpcFByb3BlcnRpZXMudWlEZWNvZGVkUGNtU2l6ZTsKLSAgICBwQy0+ZXdjLnNjYWxlX2F1ZGlvID0gcEMtPmV3Yy51aVNhbXBsaW5nRnJlcXVlbmN5IC8gMTAwMC4wOwotCi0gICAgc3dpdGNoKCBwQy0+cENsaXBMaXN0W3BTZXR0aW5ncy0+dWlNYXN0ZXJDbGlwXS5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQU1SX05COgotICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rQU1SOwotICAgICAgICAgICAgcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0ODsKLSAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkU7Ci0gICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9EVVJBVElPTjsKLSAgICAgICAgICAgIHBDLT5iU3VwcG9ydFNpbGVuY2UgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUNwbHVzOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tlQUFDcGx1czoKLSAgICAgICAgICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0FBQzsKLQotICAgICAgICAgICAgaWYoIHBDLT5ld2MudWlOYkNoYW5uZWxzID09IDEgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OTzsKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSA9IE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05PX1NJWkU7Ci0gICAgICAgICAgICAgICAgcEMtPmJTdXBwb3J0U2lsZW5jZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKU00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU87Ci0gICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPQotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPX1NJWkU7Ci0gICAgICAgICAgICAgICAgcEMtPmJTdXBwb3J0U2lsZW5jZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgMTAyNDsgLyogQUFDIGlzIGFsd2F5cyAxMDI0L0ZyZXEgc2FtcGxlIGR1cmF0aW9uICovCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tNUDM6Ci0gICAgICAgICAgICBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSA9IE00U1lTX2tNUDM7Ci0gICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplID0gMDsKLSAgICAgICAgICAgIHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uID0gMDsKLSAgICAgICAgICAgIC8qIFNwZWNpYWwgY2FzZSwgbXAzIGNvcmUgcmVhZGVyIHJldHVybiBhIHRpbWUgaW4gbXMgKi8KLSAgICAgICAgICAgIHBDLT5ld2Muc2NhbGVfYXVkaW8gPSAxLjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tFVlJDOgotICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rRVZSQzsKLSAgICAgICAgICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPSAwOwotICAgICAgICAgICAgcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPSAxNjA7IC8qIEVWUkMgZnJhbWVzIGFyZSAyMCBtcyBhdCA4MDAwIEh6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWFrZXMgaXQgZWFzaWVyIHRvIGZhY3Rvcml6ZSBhbXIgYW5kIGV2cmMgY29kZSkgKi8KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSA9IE00U1lTX2tBdWRpb1Vua25vd247Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBmb3IgKGk9MDsgaTxwQy0+dWlDbGlwTnVtYmVyOyBpKyspIHsKLSAgICAgICAgaWYgKHBDLT5wQ2xpcExpc3RbaV0uYlRyYW5zY29kaW5nUmVxdWlyZWQgPT0gTTRPU0FfRkFMU0UpIHsKLSAgICAgICAgICAgIC8qKiBJZiBub3QgdHJhbnNjb2RlZCBpbiBBbmFseXNpcyBwaGFzZSwgY2hlY2sKLSAgICAgICAgICAgICAqIGlmIHRyYW5zY29kaW5nIHJlcXVpcmVkIG5vdwotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoKHBDLT5wQ2xpcExpc3RbaV0uQ2xpcFByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlICE9Ci0gICAgICAgICAgICAgICAgICBwQy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCl8fAotICAgICAgICAgICAgICAgICAgKHBDLT5wQ2xpcExpc3RbaV0uQ2xpcFByb3BlcnRpZXMudWlWaWRlb1dpZHRoICE9Ci0gICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvV2lkdGgpIHx8Ci0gICAgICAgICAgICAgICAgICAocEMtPnBDbGlwTGlzdFtpXS5DbGlwUHJvcGVydGllcy51aVZpZGVvSGVpZ2h0ICE9Ci0gICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0KSB8fAotICAgICAgICAgICAgICAgICAgKHBDLT5wQ2xpcExpc3RbaV0uQ2xpcFByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09Ci0gICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa0gyNjQpIHx8Ci0gICAgICAgICAgICAgICAgICAocEMtPnBDbGlwTGlzdFtpXS5DbGlwUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0KLSAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rTVBFRzQgJiYKLSAgICAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2ldLkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9UaW1lU2NhbGUgIT0KLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvVGltZVNjYWxlKSkgewotICAgICAgICAgICAgICAgIHBDLT5wQ2xpcExpc3RbaV0uYlRyYW5zY29kaW5nUmVxdWlyZWQgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyoqIElmIGJUcmFuc2NvZGluZ1JlcXVpcmVkIGlzIHRydWUsIGl0IG1lYW5zIHRoZSBjbGlwIGhhcwotICAgICAgICAgICAgICogYmVlbiB0cmFuc2NvZGVkIGluIEFuYWx5c2lzIHBoYXNlLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwQy0+cENsaXBMaXN0W2ldLmJUcmFuc2NvZGluZ1JlcXVpcmVkID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyoqCi0gICAgKiBXZSBwcm9kdWNlIGEgM2dwcCBmaWxlLCB1bmxlc3MgaXQgaXMgbXAzICovCi0gICAgaWYoIE00VklERU9FRElUSU5HX2tNUDMgPT0gcEMtPgotICAgICAgICBwQ2xpcExpc3RbcFNldHRpbmdzLT51aU1hc3RlckNsaXBdLkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgIG91dHB1dEZpbGVUeXBlID0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QMzsKLSAgICBlbHNlCi0gICAgICAgIG91dHB1dEZpbGVUeXBlID0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFA7Ci0KLSAgICAvKioKLSAgICAqIEJld2FyZSwgYSBudWxsIGR1cmF0aW9uIHdvdWxkIGxlYWQgdG8gYSBkaXZpZGUgYnkgemVybyBlcnJvciAoYmV0dGVyIHNhZmUgdGhhbiBzb3JyeS4uLikgKi8KLSAgICBpZiggMCA9PSBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbiApCi0gICAgewotICAgICAgICBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbiA9IDE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBPcGVuIGZpcnN0IGNsaXAgKi8KLSAgICBwQy0+dWlDdXJyZW50Q2xpcCA9IDA7Ci0KLSAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgIHBDLT5ld2MuZElucHV0VmlkQ3RzICA9IDAuMDsKLSAgICBwQy0+ZXdjLmRPdXRwdXRWaWRDdHMgPSAwLjA7Ci0gICAgcEMtPmV3Yy5kQVRvID0gMC4wOwotCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludFN3aXRjaFRvTmV4dENsaXAocEMpOwotICAgIC8qIFJDOiB0byBrbm93IHdoZW4gYSBmaWxlIGhhcyBiZWVuIHByb2Nlc3NlZCAqLwotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciAmJiBlcnIgIT0gTTRWU1MzR1BQX1dBUl9TV0lUQ0hfQ0xJUCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IE00VlNTM0dQUF9pbnRTd2l0Y2hUb05leHRDbGlwKCkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogRG8gdGhlIHZpZGVvIHN0dWZmIGluIDNHUFAgQXVkaW8vVmlkZW8gY2FzZSAqLwotICAgIGlmKCBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUCA9PSBvdXRwdXRGaWxlVHlwZSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDb21wdXRlIHRoZSBEZWNvZGVyIFNwZWNpZmljIEluZm8gZm9yIHRoZSBvdXRwdXQgdmlkZW8gYW5kIGF1ZGlvIHN0cmVhbXMgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpKHBDLAotICAgICAgICAgICAgcFNldHRpbmdzLT51aU1hc3RlckNsaXApOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IE00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaSgpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ29tcHV0ZSB0aGUgdGltZSBpbmNyZW1lbnQgZm9yIHRoZSB0cmFuc2l0aW9uIGZpbGUgKi8KLSAgICAgICAgc3dpdGNoKCBwU2V0dGluZ3MtPnZpZGVvRnJhbWVSYXRlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNV9GUFM6Ci0gICAgICAgICAgICAgICAgcEMtPmRPdXRwdXRGcmFtZUR1cmF0aW9uID0gMTAwMC4wIC8gNS4wOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s3XzVfRlBTOgotICAgICAgICAgICAgICAgIHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbiA9IDEwMDAuMCAvIDcuNTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTBfRlBTOgotICAgICAgICAgICAgICAgIHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbiA9IDEwMDAuMCAvIDEwLjA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEyXzVfRlBTOgotICAgICAgICAgICAgICAgIHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbiA9IDEwMDAuMCAvIDEyLjU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazE1X0ZQUzoKLSAgICAgICAgICAgICAgICBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb24gPSAxMDAwLjAgLyAxNS4wOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syMF9GUFM6Ci0gICAgICAgICAgICAgICAgcEMtPmRPdXRwdXRGcmFtZUR1cmF0aW9uID0gMTAwMC4wIC8gMjAuMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjVfRlBTOgotICAgICAgICAgICAgICAgIHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbiA9IDEwMDAuMCAvIDI1LjA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazMwX0ZQUzoKLSAgICAgICAgICAgICAgICBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb24gPSAxMDAwLjAgLyAzMC4wOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuKCk6IGludmFsaWQgdmlkZW9GcmFtZVJhdGUgKDB4JXgpLFwKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19FTkNPRElOR19GUkFNRV9SQVRFIiwKLSAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT52aWRlb0ZyYW1lUmF0ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19FTkNPRElOR19GUkFNRV9SQVRFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIE00U1lTX2tNUEVHXzQgPT0gcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlBbHBoYTsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBNUEVHLTQgY2FzZS4KLSAgICAgICAgICAgICogVGltZSBzY2FsZSBvZiB0aGUgdHJhbnNpdGlvbiBlbmNvZGVyIG11c3QgYmUgdGhlIHNhbWUgdGhhbiB0aGUKLSAgICAgICAgICAgICogdGltZXNjYWxlIG9mIHRoZSBpbnB1dCBmaWxlcy4KLSAgICAgICAgICAgICogU28gdGhlIGZyYW1lIGR1cmF0aW9uIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoaXMgdGltZSBzY2FsZSwKLSAgICAgICAgICAgICogYnV0IHdpdGhvdXQgYmVlaW5nIHRvbyBzaG9ydC4KLSAgICAgICAgICAgICogRm9yIHRoYXQsIHdlIG11c3QgY29tcHV0ZSBhbHBoYSAoaW50ZWdlcikgc28gdGhhdDoKLSAgICAgICAgICAgICogICAgICAgICAgICAgKGFscGhhIHggMTAwMCkvRW5jb2RlclRpbWVTY2FsZSA+IE1pbkZyYW1lRHVyYXRpb24KLSAgICAgICAgICAgICoqLwotCi0gICAgICAgICAgICB1aUFscGhhID0gKE00T1NBX1VJbnQzMikoKCBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb24KLSAgICAgICAgICAgICAgICAqIHBDLT5ld2MudWlWaWRlb1RpbWVTY2FsZSkgLyAxMDAwLjAgKyAwLjUpOwotCi0gICAgICAgICAgICBpZiggdWlBbHBoYSA+IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICggdWlBbHBoYSAqIDEwMDAuMCkgLyBwQy0+ZXdjLnVpVmlkZW9UaW1lU2NhbGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggTTRTWVNfa0gyNjMgPT0gcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2goIHBTZXR0aW5ncy0+dmlkZW9GcmFtZVJhdGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEyXzVfRlBTOgotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazIwX0ZQUzoKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syNV9GUFM6Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbigpOiBpbnZhbGlkIHZpZGVvRnJhbWVSYXRlIGZvciBIMjYzLFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0lOVkFMSURfVklERU9fRU5DT0RJTkdfRlJBTUVfUkFURSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9JTlZBTElEX1ZJREVPX0VOQ09ESU5HX0ZSQU1FX1JBVEU7Ci0gICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENyZWF0ZSB0aGUgTVAzIG91dHB1dCBmaWxlICovCi0gICAgaWYoIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NUDMgPT0gb3V0cHV0RmlsZVR5cGUgKQotICAgIHsKLSAgICAgICAgTTRSRUFERVJfQnVmZmVyIG1wM3RhZ0J1ZmZlcjsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENyZWF0ZU1QM091dHB1dEZpbGUocEMsIHBTZXR0aW5ncy0+cE91dHB1dEZpbGUpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IE00VlNTM0dQUF9pbnRDcmVhdGVNUDNPdXRwdXRGaWxlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBUaGUgSUQzdjIgdGFnIGNvdWxkIGJlIGF0IGFueSBwbGFjZSBpbiB0aGUgbXAzIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIFRoZSBtcDMgcmVhZGVyIG9ubHkgY2hlY2tzIGZldyBieXRlcyBpbiB0aGUgYmVnaW5uaW5nIG9mCi0gICAgICAgICAgIHN0cmVhbSB0byBsb29rIGZvciBhIElEM3YyIHRhZyAgKi8KLSAgICAgICAgLyogSXQgbWVhbnMgdGhhdCBpZiB0aGUgSUQzdjIgdGFnIGlzIG5vdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlIHRoZSByZWFkZXIgZG8KLSAgICAgICAgYXMgdGhlcmUgaXMgbm8gdGhlc2UgbWV0YWRhdGEgKi8KLQotICAgICAgICAvKiBSZXRyaWV2ZSB0aGUgZGF0YSBvZiB0aGUgSUQzdjIgVGFnICovCi0gICAgICAgIGVyciA9IHBDLT5wQzEtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0R2V0T3B0aW9uKAotICAgICAgICAgICAgcEMtPnBDMS0+cFJlYWRlckNvbnRleHQsIE00UkVBREVSX2tPcHRpb25JRF9NcDNJZDN2MlRhZywKLSAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmbXAzdGFnQnVmZmVyKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2VkaXRPcGVuOiBNNE1QM1JfZ2V0T3B0aW9uIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBXcml0ZSB0aGUgZGF0YSBvZiB0aGUgSUQzdjIgVGFnIGluIHRoZSBvdXRwdXQgZmlsZSAqLwotICAgICAgICBpZiggMCAhPSBtcDN0YWdCdWZmZXIubV91aUJ1ZmZlclNpemUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBwQy0+cE9zYUZpbGVXcml0UHRyLT53cml0ZURhdGEocEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpbXAzdGFnQnVmZmVyLm1fcERhdGEsIG1wM3RhZ0J1ZmZlci5tX3VpQnVmZmVyU2l6ZSk7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBGcmVlIGJlZm9yZSB0aGUgZXJyb3IgY2hlY2tpbmcgYW55d2F5ICovCi0gICAgICAgICAgICBmcmVlKG1wM3RhZ0J1ZmZlci5tX3BEYXRhKTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEVycm9yIGNoZWNraW5nICovCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBXcml0ZURhdGEoSUQzdjJUYWcpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbXAzdGFnQnVmZmVyLm1fdWlCdWZmZXJTaXplID0gMDsKLSAgICAgICAgICAgIG1wM3RhZ0J1ZmZlci5tX3BEYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAqIENyZWF0ZSB0aGUgM0dQUCBvdXRwdXQgZmlsZSAqLwotICAgIGVsc2UgaWYoIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQID09IG91dHB1dEZpbGVUeXBlICkKLSAgICB7Ci0gICAgICAgIHBDLT5ld2MudWlWaWRlb0JpdHJhdGUgPSBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9CaXRyYXRlOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIDExLzEyLzIwMDggQ1IzMjgzIE1NUyB1c2UgY2FzZSBpbiBWaWRlb0FydGlzdDogU2V0IG1heCBvdXRwdXQgZmlsZSBzaXplIGlmIG5lZWRlZCAqLwotICAgICAgICBpZiggcEMtPmJJc01NUyA9PSBNNE9TQV9UUlVFICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlKCZwQy0+ZXdjLCAmcEMtPlNoZWxsQVBJLAotICAgICAgICAgICAgICAgIHBDLT5wT3NhRmlsZVdyaXRQdHIsIHBTZXR0aW5ncy0+cE91dHB1dEZpbGUsCi0gICAgICAgICAgICAgICAgcEMtPnBPc2FGaWxlUmVhZFB0ciwgcFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSwKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0RmlsZVNpemUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlKCZwQy0+ZXdjLCAmcEMtPlNoZWxsQVBJLAotICAgICAgICAgICAgICAgIHBDLT5wT3NhRmlsZVdyaXRQdHIsIHBTZXR0aW5ncy0+cE91dHB1dEZpbGUsCi0gICAgICAgICAgICAgICAgcEMtPnBPc2FGaWxlUmVhZFB0ciwgcFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSwgMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGUgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAqIERlZmF1bHQgZXJyb3IgY2FzZSAqLwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogaW52YWxpZCBvdXRwdXRGaWxlVHlwZSA9IDB4JXgsXAotICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfT1VUUFVUX0ZJTEVfVFlQRV9FUlJPUiIsCi0gICAgICAgICAgICBvdXRwdXRGaWxlVHlwZSk7Ci0gICAgICAgIHJldHVybgotICAgICAgICAgICAgTTRWU1MzR1BQX0VSUl9PVVRQVVRfRklMRV9UWVBFX0VSUk9SOyAvKio8IHRoaXMgaXMgYW4gaW50ZXJuYWwgZXJyb3IgY29kZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duIHRvIHRoZSB1c2VyICovCi0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJbml0aWFsaXplIHN0YXRlICovCi0gICAgaWYoIE00U1lTX2tNUDMgPT0gcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogSW4gdGhlIE1QMyBjYXNlIHdlIHVzZSBhIHNwZWNpYWwgYXVkaW8gc3RhdGUgKi8KLSAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfTVAzX0pVTVA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFdlIHN0YXJ0IHdpdGggdGhlIHZpZGVvIHByb2Nlc3NpbmcgKi8KLSAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfVklERU87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJbml0aWFsaXplIHN0YXRlLgotICAgICogVGhlIGZpcnN0IGNsaXAgaXMgaW5kZXBlbmRhbnQgdG8gdGhlICJ2aXJ0dWFsIHByZXZpb3VzIGNsaXBzIiwKLSAgICAqIHNvIGl0J3MgbGlrZSBpZiB3ZSB3aGVyZSBpbiBSZWFkL1dyaXRlIG1vZGUgYmVmb3JlIGl0LiAqLwotICAgIHBDLT5Wc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1JFQURfV1JJVEU7Ci0gICAgcEMtPkFzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfUkVBRF9XUklURTsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2VkaXRPcGVuKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0U3RlcCgpCi0gKiBAYnJpZWYgICAgUGVyZm9ybSBvbmUgc3RlcCBvZiBlZGl0aW5nLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICAgcENvbnRleHQgICAgICAgICAgIChJTikgVlNTIDNHUFAgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgIHBQcm9ncmVzcyAgICAgICAgICAoT1VUKSBQcm9ncmVzcyBwZXJjZW50YWdlICgwIHRvIDEwMCkgb2YgdGhlIGVkaXRpbmcgb3BlcmF0aW9uCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgIFZTUyAzR1BQIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9XQVJfRURJVElOR19ET05FOiBFZGl0aW9uIGlzIGRvbmUsIHVzZXIgc2hvdWxkIG5vdyBjYWxsCi0gKiAgICAgICAgICAgIE00VlNTM0dQUF9lZGl0Q2xvc2UoKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRTdGVwKCBNNFZTUzNHUFBfRWRpdENvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4ICpwUHJvZ3Jlc3MgKQotewotICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyA9Ci0gICAgICAgIChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqKXBDb250ZXh0OwotICAgIE00T1NBX1VJbnQzMiB1aVByb2dyZXNzQXVkaW8sIHVpUHJvZ3Jlc3NWaWRlbywgdWlQcm9ncmVzczsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9lZGl0U3RlcCBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4IiwgcENvbnRleHQpOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdFN0ZXA6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFByb2dyZXNzKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRTdGVwOiBwUHJvZ3Jlc3MgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24gYW5kIHNlbGVjdCBjb3JyZWN0IHByb2Nlc3NpbmcgKi8KLSAgICBzd2l0Y2goIHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICBjYXNlIE00VlNTM0dQUF9rRWRpdFN0YXRlX1ZJREVPOgotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW8ocEMpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0VkaXRTdGF0ZV9BVURJTzoKLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvKHBDKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tFZGl0U3RhdGVfTVAzOgotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEVkaXRTdGVwTVAzKHBDKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tFZGl0U3RhdGVfTVAzX0pVTVA6Ci0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50RWRpdEp1bXBNUDMocEMpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdFN0ZXAoKTogaW52YWxpZCBpbnRlcm5hbCBzdGF0ZSAoMHgleCksIHJldHVybmluZyBNNEVSUl9TVEFURSIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ29tcHV0ZSBwcm9ncmVzcy4KLSAgICAqIFdlIGRvIHRoZSBjb21wdXRpbmcgd2l0aCAzMmJpdHMgcHJlY2lzaW9uIGJlY2F1c2UgaW4gc29tZSAodmVyeSkgZXh0cmVtZSBjYXNlLCB3ZSBtYXkgZ2V0Ci0gICAgKiB2YWx1ZXMgaGlnaGVyIHRoYW4gMjU2ICguLi4pICovCi0gICAgdWlQcm9ncmVzc0F1ZGlvID0KLSAgICAgICAgKCAoTTRPU0FfVUludDMyKShwQy0+ZXdjLmRBVG8gKiAxMDApKSAvIHBDLT5ld2MuaU91dHB1dER1cmF0aW9uOwotICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgdWlQcm9ncmVzc1ZpZGVvID0gKChNNE9TQV9VSW50MzIpKHBDLT5ld2MuZElucHV0VmlkQ3RzICogMTAwKSkgLyBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbjsKLQotICAgIHVpUHJvZ3Jlc3MgPSB1aVByb2dyZXNzQXVkaW8gKyB1aVByb2dyZXNzVmlkZW87Ci0KLSAgICBpZiggKCBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSAhPSBNNFNZU19rQXVkaW9Vbmtub3duKQotICAgICAgICAmJiAocEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgIT0gTTRTWVNfa1ZpZGVvVW5rbm93bikgKQotICAgICAgICB1aVByb2dyZXNzIC89IDI7Ci0KLSAgICAvKioKLSAgICAqIFNhbml0eSBjaGVjayAqLwotICAgIGlmKCB1aVByb2dyZXNzID4gMTAwICkKLSAgICB7Ci0gICAgICAgICpwUHJvZ3Jlc3MgPSAxMDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgICpwUHJvZ3Jlc3MgPSAoTTRPU0FfVUludDgpdWlQcm9ncmVzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB0aGUgZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX2VkaXRTdGVwKCk6IHJldHVybmluZyAweCV4IiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENsb3NlKCkKLSAqIEBicmllZiAgICBGaW5pc2ggdGhlIFZTUyBlZGl0IG9wZXJhdGlvbi4KLSAqIEBub3RlICAgIFRoZSBvdXRwdXQgM0dQUCBmaWxlIGlzIHJlYWR5IHRvIGJlIHBsYXllZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgKElOKSBWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgIFZTUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENsb3NlKCBNNFZTUzNHUFBfRWRpdENvbnRleHQgcENvbnRleHQgKQotewotICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyA9Ci0gICAgICAgIChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfRVJSIHJldHVybmVkRXJyb3IgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQzMiBsYXN0Q1RTOwotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9lZGl0Q2xvc2UgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCIsIHBDb250ZXh0KTsKLQotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRDbG9zZTogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24uCi0gICAgKiBJbiAidGhlb3J5Iiwgd2Ugc2hvdWxkIG5vdCBhdXRob3JpemUgY2xvc2luZyBpZiB3ZSBhcmUgaW4gQ1JFQVRFRCBzdGF0ZS4KLSAgICAqIEJ1dCBpbiBwcmFjdGljZSwgaW4gY2FzZSB0aGUgb3BlbmluZyBmYWlsZWQsIGl0IG1heSBoYXZlIGJlZW4gcGFydGlhbGx5IGRvbmUuCi0gICAgKiBJbiB0aGF0IGNhc2Ugd2UgaGF2ZSB0byBmcmVlIHNvbWUgb3BlbmVkIHJlc3NvdXJjZXMgYnkgY2FsbGluZyBDbG9zZS4gKi8KLSAgICBpZiggTTRWU1MzR1BQX2tFZGl0U3RhdGVfQ0xPU0VEID09IHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdENsb3NlOiBXcm9uZyBzdGF0ZSAoMHgleCksIHJldHVybmluZyBNNEVSUl9TVEFURSIsCi0gICAgICAgICAgICBwQy0+U3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBUaGVyZSBtYXkgYmUgYW4gZW5jb2RlciB0byBkZXN0cm95ICovCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludERlc3Ryb3lWaWRlb0VuY29kZXIocEMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2xvc2U6IE00VlNTM0dQUF9lZGl0RGVzdHJveVZpZGVvRW5jb2RlcigpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgLyoqPCBXZSBkbyBub3QgcmV0dXJuIHRoZSBlcnJvciBoZXJlIGJlY2F1c2Ugd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBmcmVlICovCi0gICAgICAgIHJldHVybmVkRXJyb3IgPSBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDbG9zZSB0aGUgb3V0cHV0IGZpbGUgKi8KLSAgICBpZiggTTRTWVNfa01QMyA9PSBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBNUDMgY2FzZSAqLwotICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gcEMtPnBPc2FGaWxlV3JpdFB0ci0+Y2xvc2VXcml0ZShwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0KTsKLSAgICAgICAgICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENsb3NlIHRoZSBvdXRwdXQgM0dQUCBjbGlwLCBpZiBpdCBoYXMgYmVlbiBvcGVuZWQgKi8KLSAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBsYXN0IFZpZGVvIENUUyAqLwotICAgICAgICAgICAgbGFzdENUUyA9IHBDLT5ld2MuaU91dHB1dER1cmF0aW9uOwotCi0gICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNYXhGaWxlRHVyYXRpb24sICZsYXN0Q1RTKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2xvc2U6IFNldE9wdGlvbihNNFdSSVRFUl9rTWF4RmlsZUR1cmF0aW9uKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckdsb2JhbEZjdHMtPnBGY3RDbG9zZVdyaXRlKAotICAgICAgICAgICAgICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRDbG9zZTogcEZjdENsb3NlV3JpdGUoT1VUKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAvKio8IFdlIGRvIG5vdCByZXR1cm4gdGhlIGVycm9yIGhlcmUgYmVjYXVzZSB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUgotICAgICAgICAgICAgICAgICAgICA9PSByZXR1cm5lZEVycm9yICkgLyoqPCB3ZSByZXR1cm4gdGhlIGZpcnN0IGVycm9yIHRoYXQgaGFwcGVuZWQgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybmVkRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIG91dHB1dCB2aWRlbyBEU0ksIGlmIGl0IGhhcyBiZWVuIGNyZWF0ZWQgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+ZXdjLnBWaWRlb091dHB1dERzaSApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpKTsKLSAgICAgICAgcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2kgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgb3V0cHV0IGF1ZGlvIERTSSwgaWYgaXQgaGFzIGJlZW4gY3JlYXRlZCAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5ld2MucEF1ZGlvT3V0cHV0RHNpICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPmV3Yy5wQXVkaW9PdXRwdXREc2kpOwotICAgICAgICBwQy0+ZXdjLnBBdWRpb091dHB1dERzaSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDbG9zZSBjbGlwMSwgaWYgbmVlZGVkICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBDMSApCi0gICAgewotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcENsZWFuVXAocEMtPnBDMSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2xvc2U6IE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChDMSkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgV2UgZG8gbm90IHJldHVybiB0aGUgZXJyb3IgaGVyZSBiZWNhdXNlIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IKLSAgICAgICAgICAgICAgICA9PSByZXR1cm5lZEVycm9yICkgLyoqPCB3ZSByZXR1cm4gdGhlIGZpcnN0IGVycm9yIHRoYXQgaGFwcGVuZWQgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm5lZEVycm9yID0gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBDLT5wQzEgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2xvc2UgY2xpcDIsIGlmIG5lZWRlZCAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wQzIgKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKHBDLT5wQzIpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdENsb3NlOiBNNFZTUzNHUFBfaW50Q2xpcENsZWFuVXAoQzIpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKio8IFdlIGRvIG5vdCByZXR1cm4gdGhlIGVycm9yIGhlcmUgYmVjYXVzZSB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SCi0gICAgICAgICAgICAgICAgPT0gcmV0dXJuZWRFcnJvciApIC8qKjwgd2UgcmV0dXJuIHRoZSBmaXJzdCBlcnJvciB0aGF0IGhhcHBlbmVkICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuZWRFcnJvciA9IGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwQy0+cEMyID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIHRlbXBvcmFyeSBZVVYgcGxhbmVzICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnl1djFbMF0ucGFjX2RhdGEgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+eXV2MVswXS5wYWNfZGF0YSk7Ci0gICAgICAgIHBDLT55dXYxWzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+eXV2MVsxXS5wYWNfZGF0YSApCi0gICAgewotICAgICAgICBmcmVlKHBDLT55dXYxWzFdLnBhY19kYXRhKTsKLSAgICAgICAgcEMtPnl1djFbMV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT55dXYxWzJdLnBhY19kYXRhICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnl1djFbMl0ucGFjX2RhdGEpOwotICAgICAgICBwQy0+eXV2MVsyXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnl1djJbMF0ucGFjX2RhdGEgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+eXV2MlswXS5wYWNfZGF0YSk7Ci0gICAgICAgIHBDLT55dXYyWzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+eXV2MlsxXS5wYWNfZGF0YSApCi0gICAgewotICAgICAgICBmcmVlKHBDLT55dXYyWzFdLnBhY19kYXRhKTsKLSAgICAgICAgcEMtPnl1djJbMV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT55dXYyWzJdLnBhY19kYXRhICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnl1djJbMl0ucGFjX2RhdGEpOwotICAgICAgICBwQy0+eXV2MlsyXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyogUkMgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+eXV2M1swXS5wYWNfZGF0YSApCi0gICAgewotICAgICAgICBmcmVlKHBDLT55dXYzWzBdLnBhY19kYXRhKTsKLSAgICAgICAgcEMtPnl1djNbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT55dXYzWzFdLnBhY19kYXRhICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnl1djNbMV0ucGFjX2RhdGEpOwotICAgICAgICBwQy0+eXV2M1sxXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnl1djNbMl0ucGFjX2RhdGEgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+eXV2M1syXS5wYWNfZGF0YSk7Ci0gICAgICAgIHBDLT55dXYzWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKiBSQyAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT55dXY0WzBdLnBhY19kYXRhICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnl1djRbMF0ucGFjX2RhdGEpOwotICAgICAgICBwQy0+eXV2NFswXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnl1djRbMV0ucGFjX2RhdGEgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+eXV2NFsxXS5wYWNfZGF0YSk7Ci0gICAgICAgIHBDLT55dXY0WzFdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+eXV2NFsyXS5wYWNfZGF0YSApCi0gICAgewotICAgICAgICBmcmVlKHBDLT55dXY0WzJdLnBhY19kYXRhKTsKLSAgICAgICAgcEMtPnl1djRbMl0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogUkMgRnJlZSBlZmZlY3RzIGxpc3QgKi8KLSAgICBpZiggcEMtPnBFZmZlY3RzTGlzdCAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnBFZmZlY3RzTGlzdCk7Ci0gICAgICAgIHBDLT5wRWZmZWN0c0xpc3QgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogUkMgRnJlZSBhY3RpdmUgZWZmZWN0cyBsaXN0ICovCi0gICAgaWYoIHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QgIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QpOwotICAgICAgICBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogIEZyZWUgYWN0aXZlIGVmZmVjdHMgbGlzdCAqLwotICAgIGlmKHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QxICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QxKTsKLSAgICAgICAgcEMtPnBBY3RpdmVFZmZlY3RzTGlzdDEgPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICBpZihwQy0+bV9haXJfY29udGV4dCAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIGZyZWUocEMtPm1fYWlyX2NvbnRleHQpOwotICAgICAgICBwQy0+bV9haXJfY29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIC8qKgotICAgICogVXBkYXRlIHN0YXRlIGF1dG9tYXRvbiAqLwotICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFN0YXRlX0NMT1NFRDsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX2VkaXRDbG9zZSgpOiByZXR1cm5pbmcgMHgleCIsIHJldHVybmVkRXJyb3IpOwotICAgIHJldHVybiByZXR1cm5lZEVycm9yOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENsZWFuVXAoKQotICogQGJyaWVmICAgIEZyZWUgYWxsIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBWU1MgZWRpdCBvcGVyYXRpb24uCi0gKiBAbm90ZSAgICBUaGUgY29udGV4dCBpcyBubyBtb3JlIHZhbGlkIGFmdGVyIHRoaXMgY2FsbAotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRDbGVhblVwKCBNNFZTUzNHUFBfRWRpdENvbnRleHQgcENvbnRleHQgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDID0KLSAgICAgICAgKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICopcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX2VkaXRDbGVhblVwIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgiLCBwQ29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlciAqLwotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDb250ZXh0ICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2xlYW5VcCgpOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMLCByZXR1cm5pbmcgTTRFUlJfUEFSQU1FVEVSIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDbG9zZSwgaWYgbmVlZGVkLgotICAgICogSW4gInRoZW9yeSIsIHdlIHNob3VsZCBub3QgY2xvc2UgaWYgd2UgYXJlIGluIENSRUFURUQgc3RhdGUuCi0gICAgKiBCdXQgaW4gcHJhY3RpY2UsIGluIGNhc2UgdGhlIG9wZW5pbmcgZmFpbGVkLCBpdCBtYXkgaGF2ZSBiZWVuIHBhcnRpYWxseSBkb25lLgotICAgICogSW4gdGhhdCBjYXNlIHdlIGhhdmUgdG8gZnJlZSBzb21lIG9wZW5lZCByZXNzb3VyY2VzIGJ5IGNhbGxpbmcgQ2xvc2UuICovCi0gICAgaWYoIE00VlNTM0dQUF9rRWRpdFN0YXRlX0NMT1NFRCAhPSBwQy0+U3RhdGUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9lZGl0Q2xlYW5VcCgpOiBjYWxsaW5nIE00VlNTM0dQUF9lZGl0Q2xvc2UiKTsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2VkaXRDbG9zZShwQyk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2xlYW5VcCgpOiBNNFZTUzNHUFBfZWRpdENsb3NlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgdmlkZW8gZW5jb2RlciBkdW1teSBBVSAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5ld2MucER1bW15QXVCdWZmZXIgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+ZXdjLnBEdW1teUF1QnVmZmVyKTsKLSAgICAgICAgcEMtPmV3Yy5wRHVtbXlBdUJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBBdWRpbyBlbmNvZGVyIGNvbnRleHQgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+ZXdjLnBBdWRpb0VuY0N0eHQgKQotICAgIHsKLSAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2UoCi0gICAgICAgICAgICBwQy0+ZXdjLnBBdWRpb0VuY0N0eHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdENsZWFuVXA6IHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2UgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4sIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xlYW5VcCgKLSAgICAgICAgICAgIHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2xlYW5VcDogcEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbGVhblVwIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgfQotCi0gICAgICAgIHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBzaGVsbHMgaW50ZXJmYWNlcyAqLwotICAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsV3JpdGVycygmcEMtPlNoZWxsQVBJKTsKLSAgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbEVuY29kZXJzKCZwQy0+U2hlbGxBUEkpOwotICAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsUmVhZGVycygmcEMtPlNoZWxsQVBJKTsKLSAgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbERlY29kZXJzKCZwQy0+U2hlbGxBUEkpOwotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBzZXR0aW5ncyBjb3BpZWQgaW4gdGhlIGludGVybmFsIGNvbnRleHQgKi8KLSAgICBNNFZTUzNHUFBfaW50RnJlZVNldHRpbmdzTGlzdChwQyk7Ci0KLSAgICAvKioKLSAgICAqIEZpbmFsbHksIEZyZWUgY29udGV4dCAqLwotICAgIGZyZWUocEMpOwotICAgIHBDID0gTTRPU0FfTlVMTDsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2VkaXRDbGVhblVwKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLSNpZmRlZiBXSU4zMgotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX0dldEVycm9yTWVzc2FnZSgpCi0gKiBAYnJpZWYgICAgUmV0dXJuIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGdpdmVuIGVycm9yIGNvZGUKLSAqIEBub3RlICAgIFRoZSBpbnB1dCBzdHJpbmcgbXVzdCBiZSBhbHJlYWR5IGFsbG9jYXRlZCAoYW5kIGxvbmcgZW5vdWdoISkKLSAqIEBwYXJhbSAgICBlcnIgICAgICAgICAgICAgICAgKElOKSBFcnJvciBjb2RlIHRvIGdldCB0aGUgZGVzY3JpcHRpb24gZnJvbQotICogQHBhcmFtICAgIHNNZXNzYWdlICAgICAgICAoSU4vT1VUKSBBbGxvY2F0ZWQgc3RyaW5nIGluIHdoaWNoIHRoZSBkZXNjcmlwdGlvbiB3aWxsIGJlIGNvcGllZAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgSW5wdXQgZXJyb3IgaXMgZnJvbSB0aGUgVlNTM0dQUCBtb2R1bGUKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOklucHV0IGVycm9yIGlzIG5vdCBmcm9tIHRoZSBWU1MzR1BQIG1vZHVsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLU00T1NBX0VSUiBNNFZTUzNHUFBfR2V0RXJyb3JNZXNzYWdlKCBNNE9TQV9FUlIgZXJyLCBNNE9TQV9DaGFyICpzTWVzc2FnZSApCi17Ci0gICAgc3dpdGNoKCBlcnIgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9XQVJfRURJVElOR19ET05FIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9XQVJfRU5EX09GX0FVRElPX01JWElORzoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9XQVJfRU5EX09GX0FVRElPX01JWElORyIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfV0FSX0VORF9PRl9FWFRSQUNUX1BJQ1RVUkU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfV0FSX0VORF9PRl9FWFRSQUNUX1BJQ1RVUkUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0ZJTEVfVFlQRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5WQUxJRF9GSUxFX1RZUEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0VGRkVDVF9LSU5EOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9JTlZBTElEX0VGRkVDVF9LSU5EIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19FRkZFQ1RfVFlQRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19FRkZFQ1RfVFlQRSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQVVESU9fRUZGRUNUX1RZUEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0lOVkFMSURfQVVESU9fRUZGRUNUX1RZUEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTlZBTElEX1ZJREVPX1RSQU5TSVRJT05fVFlQRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19UUkFOU0lUSU9OX1RZUEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0FVRElPX1RSQU5TSVRJT05fVFlQRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5WQUxJRF9BVURJT19UUkFOU0lUSU9OX1RZUEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTlZBTElEX1ZJREVPX0VOQ09ESU5HX0ZSQU1FX1JBVEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0lOVkFMSURfVklERU9fRU5DT0RJTkdfRlJBTUVfUkFURSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0VYVEVSTkFMX0VGRkVDVF9OVUxMOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9FWFRFUk5BTF9FRkZFQ1RfTlVMTCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0VYVEVSTkFMX1RSQU5TSVRJT05fTlVMTDoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfRVhURVJOQUxfVFJBTlNJVElPTl9OVUxMIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0RVUkFUSU9OOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9CRUdJTl9DVVRfTEFSR0VSX1RIQU5fRFVSQVRJT04iKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9CRUdJTl9DVVRfTEFSR0VSX1RIQU5fRU5EX0NVVDoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0VORF9DVVQiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9PVkVSTEFQUElOR19UUkFOU0lUSU9OUzoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfT1ZFUkxBUFBJTkdfVFJBTlNJVElPTlMiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTlZBTElEXzNHUFBfRklMRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5WQUxJRF8zR1BQX0ZJTEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9WSURFT19GT1JNQVQ6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX1ZJREVPX0ZPUk1BVCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX0FVRElPX0ZPUk1BVDoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfQVVESU9fRk9STUFUIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfQU1SX0VESVRJTkdfVU5TVVBQT1JURUQ6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0FNUl9FRElUSU5HX1VOU1VQUE9SVEVEIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfSU5QVVRfVklERU9fQVVfVE9PX0xBUkdFOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9JTlBVVF9WSURFT19BVV9UT09fTEFSR0UiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTlBVVF9BVURJT19BVV9UT09fTEFSR0U6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0FVX1RPT19MQVJHRSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0NPUlJVUFRFRF9BVToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5QVVRfQVVESU9fQ09SUlVQVEVEX0FVIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfRU5DT0RFUl9BQ0NFU19VTklUX0VSUk9SOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9FTkNPREVSX0FDQ0VTX1VOSVRfRVJST1IiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX1ZJREVPX0ZPUk1BVDoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9WSURFT19GT1JNQVQiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0gyNjNfUFJPRklMRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9IMjYzX1BST0ZJTEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX01QRUc0X1BST0ZJTEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfTVBFRzRfUFJPRklMRSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfTVBFRzRfUlZMQzoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9NUEVHNF9SVkxDIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9BVURJT19GT1JNQVQ6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfQVVESU9fRk9STUFUIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfRURJVElOR19OT19TVVBQT1JURURfU1RSRUFNX0lOX0ZJTEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9FUlJfRURJVElOR19OT19TVVBQT1JURURfU1RSRUFNX0lOX0ZJTEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9FRElUSU5HX05PX1NVUFBPUlRFRF9WSURFT19TVFJFQU1fSU5fRklMRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX0VSUl9FRElUSU5HX05PX1NVUFBPUlRFRF9WSURFT19TVFJFQU1fSU5fRklMRSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQ0xJUF9BTkFMWVNJU19WRVJTSU9OOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9JTlZBTElEX0NMSVBfQU5BTFlTSVNfVkVSU0lPTiIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19GT1JNQVQ6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19GT1JNQVQiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fRlJBTUVfU0laRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX0ZSQU1FX1NJWkUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fVElNRV9TQ0FMRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX1RJTUVfU0NBTEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fREFUQV9QQVJUSVRJT05JTkc6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX0RBVEFfUEFSVElUSU9OSU5HIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfTVAzX0FTU0VNQkxZOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9NUDNfQVNTRU1CTFkiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX1dBUl9JTkNPTVBBVElCTEVfQVVESU9fU1RSRUFNX1RZUEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfV0FSX0lOQ09NUEFUSUJMRV9BVURJT19TVFJFQU1fVFlQRSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfV0FSX0lOQ09NUEFUSUJMRV9BVURJT19OQl9PRl9DSEFOTkVMUzoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9XQVJfSU5DT01QQVRJQkxFX0FVRElPX05CX09GX0NIQU5ORUxTIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9XQVJfSU5DT01QQVRJQkxFX0FVRElPX1NBTVBMSU5HX0ZSRVFVRU5DWToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX1dBUl9JTkNPTVBBVElCTEVfQVVESU9fU0FNUExJTkdfRlJFUVVFTkNZIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfTk9fU1VQUE9SVEVEX1NUUkVBTV9JTl9GSUxFOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9OT19TVVBQT1JURURfU1RSRUFNX0lOX0ZJTEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9BRERWT0xVTUVfRVFVQUxTX1pFUk86Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0FERFZPTFVNRV9FUVVBTFNfWkVSTyIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0FERENUU19ISUdIRVJfVEhBTl9WSURFT19EVVJBVElPTjoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfQUREQ1RTX0hJR0hFUl9USEFOX1ZJREVPX0RVUkFUSU9OIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfVU5ERUZJTkVEX0FVRElPX1RSQUNLX0ZJTEVfRk9STUFUOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9VTkRFRklORURfQVVESU9fVFJBQ0tfRklMRV9GT1JNQVQiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9BRERFRF9BVURJT19TVFJFQU06Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0FEREVEX0FVRElPX1NUUkVBTSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0FVRElPX01JWElOR19VTlNVUFBPUlRFRDoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfQVVESU9fTUlYSU5HX1VOU1VQUE9SVEVEIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfRkVBVFVSRV9VTlNVUFBPUlRFRF9XSVRIX0FVRElPX1RSQUNLOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfRVJSX0ZFQVRVUkVfVU5TVVBQT1JURURfV0lUSF9BVURJT19UUkFDSyIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0FVRElPX0NBTk5PVF9CRV9NSVhFRDoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfQVVESU9fQ0FOTk9UX0JFX01JWEVEIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfSU5QVVRfQ0xJUF9JU19OT1RfQV8zR1BQOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9JTlBVVF9DTElQX0lTX05PVF9BXzNHUFAiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9CRUdJTkxPT1BfSElHSEVSX0VORExPT1A6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0JFR0lOTE9PUF9ISUdIRVJfRU5ETE9PUCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0gyNjNfUFJPRklMRV9OT1RfU1VQUE9SVEVEOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9IMjYzX1BST0ZJTEVfTk9UX1NVUFBPUlRFRCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX05PX1NVUFBPUlRFRF9WSURFT19TVFJFQU1fSU5fRklMRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfTk9fU1VQUE9SVEVEX1ZJREVPX1NUUkVBTV9JTl9GSUxFIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OiAvKio8IE5vdCBhIFZTUzNHUFAgZXJyb3IgKi8KLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIiIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLSNlbmRpZiAvKiBXSU4zMiAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKiAgIFNUQVRJQyBGVU5DVElPTlMgICAqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwU2V0dGluZ3NTYW5pdHlDaGVjaygpCi0gKiBAYnJpZWYgICAgU2ltcGxpZnkgdGhlIGdpdmVuIGNsaXAgc2V0dGluZ3MKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gbWF5IG1vZGlmeSB0aGUgZ2l2ZW4gc3RydWN0dXJlCi0gKiBAcGFyYW0gICBwQ2xpcCAgICAoSU4vT1VUKSBDbGlwIHNldHRpbmdzCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX0VSUl9FWFRFUk5BTF9FRkZFQ1RfTlVMTDoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwU2V0dGluZ3NTYW5pdHlDaGVjaygKLSAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcCApCi17Ci0gICAgTTRPU0FfVUludDggdWlGeDsKLSAgICBNNE9TQV9VSW50MzIKLSAgICAgICAgdWlDbGlwQWN0dWFsRHVyYXRpb247IC8qKjwgdGhlIGNsaXAgZHVyYXRpb24gb25jZSB0aGUgY3V0cyBhcmUgZG9uZSAqLwotICAgIE00T1NBX1VJbnQzMiB1aUR1cmF0aW9uOwotICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyAqcEZ4OwotCi0gICAgLyoqCi0gICAgKiBJZiBiZWdpbiBjdXQgaXMgdG9vIGZhciwgcmV0dXJuIGFuIGVycm9yICovCi0gICAgdWlEdXJhdGlvbiA9IHBDbGlwLT5DbGlwUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbjsKLQotICAgIGlmKCBwQ2xpcC0+dWlCZWdpbkN1dFRpbWUgPiB1aUR1cmF0aW9uICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwU2V0dGluZ3NTYW5pdHlDaGVjazogJWQgPiAlZCxcCi0gICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9CRUdJTl9DVVRfTEFSR0VSX1RIQU5fRFVSQVRJT04iLAotICAgICAgICAgICAgcENsaXAtPnVpQmVnaW5DdXRUaW1lLCB1aUR1cmF0aW9uKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0RVUkFUSU9OOwotICAgIH0KLQotICAgIC8qKgotICAgICogSWYgZW5kIGN1dCBpcyB0b28gZmFyLCBzZXQgdG8gemVybyAoaXQgbWVhbnMgbm8gZW5kIGN1dCkgKi8KLSAgICBpZiggcENsaXAtPnVpRW5kQ3V0VGltZSA+IHVpRHVyYXRpb24gKQotICAgIHsKLSAgICAgICAgcENsaXAtPnVpRW5kQ3V0VGltZSA9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb21wdXRlIGFjdHVhbCBjbGlwIGR1cmF0aW9uIChvbmNlIGN1dHMgYXJlIGRvbmUpICovCi0gICAgaWYoIDAgPT0gcENsaXAtPnVpRW5kQ3V0VGltZSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBObyBlbmQgY3V0ICovCi0gICAgICAgIHVpQ2xpcEFjdHVhbER1cmF0aW9uID0gdWlEdXJhdGlvbiAtIHBDbGlwLT51aUJlZ2luQ3V0VGltZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYoIHBDbGlwLT51aUJlZ2luQ3V0VGltZSA+PSBwQ2xpcC0+dWlFbmRDdXRUaW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzIoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwU2V0dGluZ3NTYW5pdHlDaGVjazogJWQgPiAlZCxcCi0gICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0VORF9DVVQiLAotICAgICAgICAgICAgICAgIHBDbGlwLT51aUJlZ2luQ3V0VGltZSwgcENsaXAtPnVpRW5kQ3V0VGltZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9CRUdJTl9DVVRfTEFSR0VSX1RIQU5fRU5EX0NVVDsKLSAgICAgICAgfQotICAgICAgICB1aUNsaXBBY3R1YWxEdXJhdGlvbiA9IHBDbGlwLT51aUVuZEN1dFRpbWUgLSBwQ2xpcC0+dWlCZWdpbkN1dFRpbWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRUcmFuc2l0aW9uU2V0dGluZ3NTYW5pdHlDaGVjaygpCi0gKiBAYnJpZWYgICAgU2ltcGxpZnkgdGhlIGdpdmVuIHRyYW5zaXRpb24gc2V0dGluZ3MKLSAqIEBub3RlICAgICBUaGlzIGZ1bmN0aW9uIG1heSBtb2RpZnkgdGhlIGdpdmVuIHN0cnVjdHVyZQotICogQHBhcmFtICAgIHBUcmFuc2l0aW9uICAgIChJTi9PVVQpIFRyYW5zaXRpb24gc2V0dGluZ3MKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNFZTUzNHUFBfRVJSX0VYVEVSTkFMX1RSQU5TSVRJT05fTlVMTDoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50VHJhbnNpdGlvblNldHRpbmdzU2FuaXR5Q2hlY2soCi0gICAgTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncyAqcFRyYW5zaXRpb24gKQotewotICAgIC8qKgotICAgICogTm8gdHJhbnNpdGlvbiAqLwotICAgIGlmKCAwID09IHBUcmFuc2l0aW9uLT51aVRyYW5zaXRpb25EdXJhdGlvbiApCi0gICAgewotICAgICAgICBwVHJhbnNpdGlvbi0+VmlkZW9UcmFuc2l0aW9uVHlwZSA9IE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9Ob25lOwotICAgICAgICBwVHJhbnNpdGlvbi0+QXVkaW9UcmFuc2l0aW9uVHlwZSA9IE00VlNTM0dQUF9rQXVkaW9UcmFuc2l0aW9uVHlwZV9Ob25lOwotICAgIH0KLSAgICBlbHNlIGlmKCAoIE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9Ob25lCi0gICAgICAgID09IHBUcmFuc2l0aW9uLT5WaWRlb1RyYW5zaXRpb25UeXBlKQotICAgICAgICAmJiAoTTRWU1MzR1BQX2tBdWRpb1RyYW5zaXRpb25UeXBlX05vbmUKLSAgICAgICAgPT0gcFRyYW5zaXRpb24tPkF1ZGlvVHJhbnNpdGlvblR5cGUpICkKLSAgICB7Ci0gICAgICAgIHBUcmFuc2l0aW9uLT51aVRyYW5zaXRpb25EdXJhdGlvbiA9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBleHRlcm5hbCB0cmFuc2l0aW9uIGZ1bmN0aW9uIGlzIHNldCAqLwotICAgIGlmKCAoIHBUcmFuc2l0aW9uLT5WaWRlb1RyYW5zaXRpb25UeXBlCi0gICAgICAgID49IE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9FeHRlcm5hbCkKLSAgICAgICAgJiYgKE00T1NBX05VTEwgPT0gcFRyYW5zaXRpb24tPkV4dFZpZGVvVHJhbnNpdGlvbkZjdCkgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfRVhURVJOQUxfVFJBTlNJVElPTl9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogU2V0IG1pbmltYWwgdHJhbnNpdGlvbiBkdXJhdGlvbiAqLwotICAgIGlmKCAoIHBUcmFuc2l0aW9uLT51aVRyYW5zaXRpb25EdXJhdGlvbiA+IDApCi0gICAgICAgICYmIChwVHJhbnNpdGlvbi0+dWlUcmFuc2l0aW9uRHVyYXRpb24KLSAgICAgICAgPCBNNFZTUzNHUFBfTUlOSU1BTF9UUkFOU0lUSU9OX0RVUkFUSU9OKSApCi0gICAgewotICAgICAgICBwVHJhbnNpdGlvbi0+dWlUcmFuc2l0aW9uRHVyYXRpb24gPQotICAgICAgICAgICAgTTRWU1MzR1BQX01JTklNQUxfVFJBTlNJVElPTl9EVVJBVElPTjsKLSAgICB9Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRGcmVlU2V0dGluZ3NMaXN0KCkKLSAqIEBicmllZiAgICBGcmVlIHRoZSBzZXR0aW5ncyBjb3BpZWQgaW4gdGhlIGludGVybmFsIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBDICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50RnJlZVNldHRpbmdzTGlzdCgKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKQotewotICAgIE00T1NBX1VJbnQzMiBpOwotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBzZXR0aW5ncyBsaXN0ICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBDbGlwTGlzdCApCi0gICAgewotICAgICAgICBmb3IgKCBpID0gMDsgaSA8IHBDLT51aUNsaXBOdW1iZXI7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00VlNTM0dQUF9lZGl0RnJlZUNsaXBTZXR0aW5ncygmKHBDLT5wQ2xpcExpc3RbaV0pKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZyZWUocEMtPnBDbGlwTGlzdCk7Ci0gICAgICAgIHBDLT5wQ2xpcExpc3QgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgdHJhbnNpdGlvbiBsaXN0ICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBUcmFuc2l0aW9uTGlzdCApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wVHJhbnNpdGlvbkxpc3QpOwotICAgICAgICBwQy0+cFRyYW5zaXRpb25MaXN0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci19Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q3JlYXRlTVAzT3V0cHV0RmlsZSgpCi0gKiBAYnJpZWYgICAgICAgIENyZWF0ZXMgYW5kIHByZXBhcmUgdGhlIG91dHB1dCBNUCBmaWxlCi0gKiBAcGFyYW0gICBwQyAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUgotTTRWU1MzR1BQX2ludENyZWF0ZU1QM091dHB1dEZpbGUoIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQgKnBPdXRwdXRGaWxlICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgZXJyID0KLSAgICAgICAgcEMtPnBPc2FGaWxlV3JpdFB0ci0+b3BlbldyaXRlKCZwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LCBwT3V0cHV0RmlsZSwKLSAgICAgICAgTTRPU0Ffa0ZpbGVXcml0ZSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZU1QM091dHB1dEZpbGU6IFdyaXRlT3BlbiByZXR1cm5zIDB4JXghIiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZSgpCi0gKiBAYnJpZWYgICBDcmVhdGVzIGFuZCBwcmVwYXJlIHRoZSBvdXRwdXQgTVAzIGZpbGUKLSAqIEBub3RlICAgIENyZWF0ZXMgdGhlIHdyaXRlciwgQ3JlYXRlcyB0aGUgb3V0cHV0IGZpbGUsIEFkZHMgdGhlIHN0cmVhbXMsCi0gICAgICAgICAgIFJlYWRpZXMgdGhlIHdyaXRpbmcgcHJvY2VzcwotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUgotTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlKCBNNFZTUzNHUFBfRW5jb2RlV3JpdGVDb250ZXh0ICpwQ19ld2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQ19TaGVsbEFQSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciAqcE9zYUZpbGVXcml0UHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQgKnBPdXRwdXRGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciAqcE9zYUZpbGVSZWFkUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQgKnBUZW1wRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgbWF4T3V0cHV0RmlsZVNpemUgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfVUludDMyIHVpVmVyc2lvbjsKLSAgICBNNFNZU19TdHJlYW1JRFZhbHVlIHRlbXA7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigKLSAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZSBjYWxsZWQgd2l0aCBwQ19ld2M9MHgleCwgcE91dHB1dEZpbGU9MHgleCIsCi0gICAgICAgIHBDX2V3YywgcE91dHB1dEZpbGUpOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENfZXdjKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlOiBwQ19ld2MgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwT3V0cHV0RmlsZSksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZTogcE91dHB1dEZpbGUgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyogU2V0IHdyaXRlciAqLwotICAgIGVyciA9Ci0gICAgICAgIE00VlNTM0dQUF9zZXRDdXJyZW50V3JpdGVyKHBDX1NoZWxsQVBJLCBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUCk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAvKioKLSAgICAqIENyZWF0ZSB0aGUgb3V0cHV0IGZpbGUgKi8KLSAgICBlcnIgPSBwQ19TaGVsbEFQSS0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RPcGVuKCZwQ19ld2MtPnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICBwT3V0cHV0RmlsZSwgcE9zYUZpbGVXcml0UHRyLCBwVGVtcEZpbGUsIHBPc2FGaWxlUmVhZFB0cik7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlOiBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdE9wZW4gcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogU2V0IHRoZSBzaWduYXR1cmUgb3B0aW9uIG9mIHRoZSB3cml0ZXIgKi8KLSAgICBlcnIgPQotICAgICAgICBwQ19TaGVsbEFQSS0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24ocENfZXdjLT5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgTTRXUklURVJfa0VtYmVkZGVkU3RyaW5nLCAoTTRPU0FfRGF0YU9wdGlvbikiTlhQLVNXIDogVlNTICAgICIpOwotCi0gICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpICYmICgoKE00T1NBX1VJbnQzMilNNEVSUl9CQURfT1BUSU9OX0lEKQotICAgICAgICAhPSBlcnIpICkgLyogdGhpcyBvcHRpb24gbWF5IG5vdCBiZSBpbXBsZW1lbnRlZCBieSBzb21lIHdyaXRlcnMgKi8KLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZTpcCi0gICAgICAgICAgICBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihNNFdSSVRFUl9rRW1iZWRkZWRTdHJpbmcpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKjExLzEyLzIwMDggQ1IzMjgzIE1NUyB1c2UgY2FzZSBmb3IgVmlkZW9BcnRpc3Q6Ci0gICAgU2V0IHRoZSBtYXggb3V0cHV0IGZpbGUgc2l6ZSBvcHRpb24gaW4gdGhlIHdyaXRlciBzbyB0aGF0IHRoZSBvdXRwdXQgZmlsZSB3aWxsIGJlCi0gICAgc21hbGxlciB0aGFuIHRoZSBnaXZlbiBmaWxlIHNpemUgbGltaXRhdGlvbiovCi0gICAgaWYoIG1heE91dHB1dEZpbGVTaXplID4gMCApCi0gICAgewotICAgICAgICBlcnIgPSBwQ19TaGVsbEFQSS0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICBwQ19ld2MtPnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgTTRXUklURVJfa01heEZpbGVTaXplLCAmbWF4T3V0cHV0RmlsZVNpemUpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGU6XAotICAgICAgICAgICAgICAgIHdyaXRlciBzZXQgb3B0aW9uIE00V1JJVEVSX2tNYXhGaWxlU2l6ZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBTZXQgdGhlIHZlcnNpb24gb3B0aW9uIG9mIHRoZSB3cml0ZXIgKi8KLSAgICB1aVZlcnNpb24gPQotICAgICAgICAoTTRWSURFT0VESVRJTkdfVkVSU0lPTl9NQUpPUiAqIDEwMCArIE00VklERU9FRElUSU5HX1ZFUlNJT05fTUlOT1IgKiAxMAotICAgICAgICArIE00VklERU9FRElUSU5HX1ZFUlNJT05fUkVWSVNJT04pOwotICAgIGVyciA9Ci0gICAgICAgIHBDX1NoZWxsQVBJLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihwQ19ld2MtPnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICBNNFdSSVRFUl9rRW1iZWRkZWRWZXJzaW9uLCAoTTRPU0FfRGF0YU9wdGlvbikgJnVpVmVyc2lvbik7Ci0KLSAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikgJiYgKCgoTTRPU0FfVUludDMyKU00RVJSX0JBRF9PUFRJT05fSUQpCi0gICAgICAgICE9IGVycikgKSAvKiB0aGlzIG9wdGlvbiBtYXkgbm90IGJlIGltcGxlbWVudGVkIGJ5IHNvbWUgd3JpdGVycyAqLwotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlOlwKLSAgICAgICAgICAgIHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKE00V1JJVEVSX2tFbWJlZGRlZFZlcnNpb24pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiggTTRTWVNfa1ZpZGVvVW5rbm93biAhPSBwQ19ld2MtPlZpZGVvU3RyZWFtVHlwZSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBTZXQgdGhlIHZpZGVvIHN0cmVhbSBwcm9wZXJ0aWVzICovCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLmhlaWdodCA9IHBDX2V3Yy0+dWlWaWRlb0hlaWdodDsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8ud2lkdGggPSBwQ19ld2MtPnVpVmlkZW9XaWR0aDsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uZnBzID0KLSAgICAgICAgICAgIDAuMDsgLyoqPCBOb3QgdXNlZCBieSB0aGUgc2hlbGwvY29yZSB3cml0ZXIgKi8KLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uSGVhZGVyLnBCdWYgPQotICAgICAgICAgICAgcENfZXdjLT5wVmlkZW9PdXRwdXREc2k7IC8qKjwgUHJldmlvdXNseSBjb21wdXRlZCBvdXRwdXQgRFNJICovCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLkhlYWRlci5TaXplID0gcENfZXdjLT4KLSAgICAgICAgICAgIHVpVmlkZW9PdXRwdXREc2lTaXplOyAvKio8IFByZXZpb3VzbHkgY29tcHV0ZWQgb3V0cHV0IERTSSBzaXplICovCi0KLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbS5zdHJlYW1UeXBlID0gcENfZXdjLT5WaWRlb1N0cmVhbVR5cGU7Ci0KLSAgICAgICAgc3dpdGNoKCBwQ19ld2MtPlZpZGVvU3RyZWFtVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRTWVNfa01QRUdfNDoKLSAgICAgICAgICAgIGNhc2UgTTRTWVNfa0gyNjM6Ci0gICAgICAgICAgICBjYXNlIE00U1lTX2tIMjY0OgotICAgICAgICAgICAgICAgIC8qKjwgV2UgSEFWRSB0byBwdXQgYSB2YWx1ZSBoZXJlLi4uICovCi0gICAgICAgICAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbS5hdmVyYWdlQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDX2V3Yy0+dWlWaWRlb0JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbS5tYXhCaXRyYXRlID0gcENfZXdjLT51aVZpZGVvQml0cmF0ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZTogdW5rbm93biBpbnB1dCB2aWRlbyBmb3JtYXQgKDB4JXgpLFwKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfVklERU9fRk9STUFUISIsCi0gICAgICAgICAgICAgICAgICAgIHBDX2V3Yy0+VmlkZW9TdHJlYW1UeXBlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9WSURFT19GT1JNQVQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwQ19ld2MtPldyaXRlclZpZGVvU3RyZWFtLnN0cmVhbUlEID0gTTRWU1MzR1BQX1dSSVRFUl9WSURFT19TVFJFQU1fSUQ7Ci0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW0udGltZVNjYWxlID0KLSAgICAgICAgICAgIDA7IC8qKjwgTm90IHVzZWQgYnkgdGhlIHNoZWxsL2NvcmUgd3JpdGVyICovCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW0ucHJvZmlsZUxldmVsID0KLSAgICAgICAgICAgIDA7IC8qKjwgTm90IHVzZWQgYnkgdGhlIHNoZWxsL2NvcmUgd3JpdGVyICovCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW0uZHVyYXRpb24gPQotICAgICAgICAgICAgMDsgLyoqPCBOb3QgdXNlZCBieSB0aGUgc2hlbGwvY29yZSB3cml0ZXIgKi8KLQotICAgICAgICBwQ19ld2MtPldyaXRlclZpZGVvU3RyZWFtLmRlY29kZXJTcGVjaWZpY0luZm9TaXplID0KLSAgICAgICAgICAgIHNpemVvZihNNFdSSVRFUl9TdHJlYW1WaWRlb0luZm9zKTsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbS5kZWNvZGVyU3BlY2lmaWNJbmZvID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpICYocENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8pOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEFkZCB0aGUgdmlkZW8gc3RyZWFtICovCi0gICAgICAgIGVyciA9IHBDX1NoZWxsQVBJLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdEFkZFN0cmVhbSgKLSAgICAgICAgICAgIHBDX2V3Yy0+cDNncFdyaXRlckNvbnRleHQsICZwQ19ld2MtPldyaXRlclZpZGVvU3RyZWFtKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlOlwKLSAgICAgICAgICAgICAgICBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdEFkZFN0cmVhbSh2aWRlbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBVcGRhdGUgQVUgcHJvcGVydGllcyBmb3IgdmlkZW8gc3RyZWFtICovCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9BVS5hdHRyaWJ1dGUgPSBBVV9SQVA7Ci0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9BVS5DVFMgPSAwOwotICAgICAgICBwQ19ld2MtPldyaXRlclZpZGVvQVUuRFRTID0gMDsgICAgLyoqIFJlc2V0IHRpbWUgKi8KLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb0FVLmZyYWcgPSBNNE9TQV9OVUxMOwotICAgICAgICBwQ19ld2MtPldyaXRlclZpZGVvQVUubmJGcmFnID0gMDsgLyoqIE5vIGZyYWdtZW50ICovCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9BVS5zaXplID0gMDsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb0FVLmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb0FVLnN0cmVhbSA9ICYocENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbSk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogU2V0IHRoZSB3cml0ZXIgbWF4IHZpZGVvIEFVIHNpemUgKi8KLSAgICAgICAgcENfZXdjLT51aVZpZGVvTWF4QXVTaXplID0gKE00T1NBX1VJbnQzMikoMS41RgotICAgICAgICAgICAgKihNNE9TQV9GbG9hdCkocENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8ud2lkdGgKLSAgICAgICAgICAgICogcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uaGVpZ2h0KQotICAgICAgICAgICAgKiBNNFZTUzNHUFBfVklERU9fTUlOX0NPTVBSRVNTSU9OX1JBVElPKTsKLSAgICAgICAgdGVtcC5zdHJlYW1JRCA9IE00VlNTM0dQUF9XUklURVJfVklERU9fU1RSRUFNX0lEOwotICAgICAgICB0ZW1wLnZhbHVlID0gcENfZXdjLT51aVZpZGVvTWF4QXVTaXplOwotICAgICAgICBlcnIgPSBwQ19TaGVsbEFQSS0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICBwQ19ld2MtPnAzZ3BXcml0ZXJDb250ZXh0LCAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNYXhBVVNpemUsCi0gICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJnRlbXApOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGU6XAotICAgICAgICAgICAgICAgIHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKE00V1JJVEVSX2tNYXhBVVNpemUsIHZpZGVvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIFNldCB0aGUgd3JpdGVyIG1heCB2aWRlbyBjaHVuayBzaXplICovCi0gICAgICAgIHRlbXAuc3RyZWFtSUQgPSBNNFZTUzNHUFBfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRDsKLSAgICAgICAgdGVtcC52YWx1ZSA9IChNNE9TQV9VSW50MzIpKHBDX2V3Yy0+dWlWaWRlb01heEF1U2l6ZSBcCi0gICAgICAgICAgICAqIE00VlNTM0dQUF9WSURFT19BVV9TSVpFX1RPX0NIVU5DS19TSVpFX1JBVElPKTsgLyoqPCBmcm9tIG1heCBBVSBzaXplIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXggQ2h1bmNrIHNpemUgKi8KLSAgICAgICAgZXJyID0gcENfU2hlbGxBUEktPnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKAotICAgICAgICAgICAgcENfZXdjLT5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIChNNE9TQV9VSW50MzIpTTRXUklURVJfa01heENodW5ja1NpemUsCi0gICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJnRlbXApOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGU6XAotICAgICAgICAgICAgICAgIHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKE00V1JJVEVSX2tNYXhBVVNpemUsIHZpZGVvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKCBNNFNZU19rQXVkaW9Vbmtub3duICE9IHBDX2V3Yy0+QXVkaW9TdHJlYW1UeXBlICkKLSAgICB7Ci0gICAgICAgIE00V1JJVEVSX1N0cmVhbUF1ZGlvSW5mb3Mgc3RyZWFtQXVkaW9JbmZvOwotCi0gICAgICAgIHN0cmVhbUF1ZGlvSW5mby5uYlNhbXBsZXNQZXJTZWMgPSAwOyAvKio8IHVudXNlZCBieSBvdXIgc2hlbGwgd3JpdGVyICovCi0gICAgICAgIHN0cmVhbUF1ZGlvSW5mby5uYkJpdHNQZXJTYW1wbGUgPSAwOyAvKio8IHVudXNlZCBieSBvdXIgc2hlbGwgd3JpdGVyICovCi0gICAgICAgIHN0cmVhbUF1ZGlvSW5mby5uYkNoYW5uZWxzID0gMTsgICAgICAvKio8IHVudXNlZCBieSBvdXIgc2hlbGwgd3JpdGVyICovCi0KLSAgICAgICAgaWYoIHBDX2V3Yy0+cEF1ZGlvT3V0cHV0RHNpICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBJZiB3ZSBjb3B5IHRoZSBzdHJlYW0gZnJvbSB0aGUgaW5wdXQsIHdlIGNvcHkgaXRzIERTSSAqLwotICAgICAgICAgICAgc3RyZWFtQXVkaW9JbmZvLkhlYWRlci5TaXplID0gcENfZXdjLT51aUF1ZGlvT3V0cHV0RHNpU2l6ZTsKLSAgICAgICAgICAgIHN0cmVhbUF1ZGlvSW5mby5IZWFkZXIucEJ1ZiA9IHBDX2V3Yy0+cEF1ZGlvT3V0cHV0RHNpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogV3JpdGVyIHdpbGwgcHV0IGEgZGVmYXVsdCBEU0kgKi8KLSAgICAgICAgICAgIHN0cmVhbUF1ZGlvSW5mby5IZWFkZXIuU2l6ZSA9IDA7Ci0gICAgICAgICAgICBzdHJlYW1BdWRpb0luZm8uSGVhZGVyLnBCdWYgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1JRCA9IE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lEOwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtLnN0cmVhbVR5cGUgPSBwQ19ld2MtPkF1ZGlvU3RyZWFtVHlwZTsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb1N0cmVhbS5kdXJhdGlvbiA9Ci0gICAgICAgICAgICAwOyAvKio8IE5vdCB1c2VkIGJ5IHRoZSBzaGVsbC9jb3JlIHdyaXRlciAqLwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtLnByb2ZpbGVMZXZlbCA9Ci0gICAgICAgICAgICAwOyAvKio8IE5vdCB1c2VkIGJ5IHRoZSBzaGVsbC9jb3JlIHdyaXRlciAqLwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtSW5mby5uYlNhbXBsZXNQZXJTZWMgPQotICAgICAgICAgICAgcENfZXdjLT51aVNhbXBsaW5nRnJlcXVlbmN5OwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtLnRpbWVTY2FsZSA9IHBDX2V3Yy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb1N0cmVhbUluZm8ubmJDaGFubmVscyA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDE2KXBDX2V3Yy0+dWlOYkNoYW5uZWxzOwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtSW5mby5uYkJpdHNQZXJTYW1wbGUgPQotICAgICAgICAgICAgMDsgLyoqPCBOb3QgdXNlZCBieSB0aGUgc2hlbGwvY29yZSB3cml0ZXIgKi8KLQotICAgICAgICAvKioKLSAgICAgICAgKiBBZGQgdGhlIGF1ZGlvIHN0cmVhbSAqLwotICAgICAgICBzd2l0Y2goIHBDX2V3Yy0+QXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFNZU19rQU1SOgotICAgICAgICAgICAgICAgIHBDX2V3Yy0+V3JpdGVyQXVkaW9TdHJlYW0uYXZlcmFnZUJpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAwOyAvKio8IEl0IGlzIG5vdCB1c2VkIGJ5IHRoZSBzaGVsbCwgdGhlIERTSSBpcyB0YWtlbiBpbnRvIGFjY291bnQgaW5zdGVhZCAqLwotICAgICAgICAgICAgICAgIHBDX2V3Yy0+V3JpdGVyQXVkaW9TdHJlYW0ubWF4Qml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIDA7IC8qKjwgTm90IHVzZWQgYnkgdGhlIHNoZWxsL2NvcmUgd3JpdGVyICovCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRTWVNfa0FBQzoKLSAgICAgICAgICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtLmF2ZXJhZ2VCaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgcENfZXdjLT51aUF1ZGlvQml0cmF0ZTsKLSAgICAgICAgICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtLm1heEJpdHJhdGUgPSBwQ19ld2MtPnVpQXVkaW9CaXRyYXRlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00U1lTX2tFVlJDOgotICAgICAgICAgICAgICAgIHBDX2V3Yy0+V3JpdGVyQXVkaW9TdHJlYW0uYXZlcmFnZUJpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAwOyAvKio8IEl0IGlzIG5vdCB1c2VkIGJ5IHRoZSBzaGVsbCwgdGhlIERTSSBpcyB0YWtlbiBpbnRvIGFjY291bnQgaW5zdGVhZCAqLwotICAgICAgICAgICAgICAgIHBDX2V3Yy0+V3JpdGVyQXVkaW9TdHJlYW0ubWF4Qml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIDA7IC8qKjwgTm90IHVzZWQgYnkgdGhlIHNoZWxsL2NvcmUgd3JpdGVyICovCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRTWVNfa01QMzogLyoqPCB0aGVyZSBjYW4ndCBiZSBNUDMgdHJhY2sgaW4gM0dQUCBmaWxlIC0+IGVycm9yICovCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlOiB1bmtub3duIG91dHB1dCBhdWRpbyBmb3JtYXQgKDB4JXgpLFwKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfQVVESU9fRk9STUFUISIsCi0gICAgICAgICAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9TdHJlYW1UeXBlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9BVURJT19GT1JNQVQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBPdXIgd3JpdGVyIHNoZWxsIGludGVyZmFjZSBpcyBhIGxpdHRsZSB0cmlja3k6IHdlIHB1dCBNNFdSSVRFUl9TdHJlYW1BdWRpb0luZm9zCi0gICAgICAgIGluIHRoZSBEU0kgcG9pbnRlci4uLiAqLwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtLmRlY29kZXJTcGVjaWZpY0luZm8gPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMikgJnN0cmVhbUF1ZGlvSW5mbzsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBMaW5rIHRoZSBBVSBhbmQgdGhlIHN0cmVhbSAqLwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvQVUuc3RyZWFtID0gJihwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtKTsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb0FVLnNpemUgPSAwOwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvQVUuQ1RTID0KLSAgICAgICAgICAgIC1wQ19ld2MtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsgLyoqIFJlc2V0IHRpbWUgKi8KLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb0FVLkRUUyA9IDA7Ci0gICAgICAgIHBDX2V3Yy0+V3JpdGVyQXVkaW9BVS5hdHRyaWJ1dGUgPSAwOwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvQVUubmJGcmFnID0gMDsgLyoqIE5vIGZyYWdtZW50ICovCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyQXVkaW9BVS5mcmFnID0gTTRPU0FfTlVMTDsKLQotICAgICAgICBlcnIgPSBwQ19TaGVsbEFQSS0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RBZGRTdHJlYW0oCi0gICAgICAgICAgICBwQ19ld2MtPnAzZ3BXcml0ZXJDb250ZXh0LCAmcENfZXdjLT5Xcml0ZXJBdWRpb1N0cmVhbSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZTpcCi0gICAgICAgICAgICAgICAgcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RBZGRTdHJlYW0oYXVkaW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogU2V0IHRoZSB3cml0ZXIgbWF4IGF1ZGlvIEFVIHNpemUgKi8KLSAgICAgICAgcENfZXdjLT51aUF1ZGlvTWF4QXVTaXplID0gTTRWU1MzR1BQX0FVRElPX01BWF9BVV9TSVpFOwotICAgICAgICB0ZW1wLnN0cmVhbUlEID0gTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQ7Ci0gICAgICAgIHRlbXAudmFsdWUgPSBwQ19ld2MtPnVpQXVkaW9NYXhBdVNpemU7Ci0gICAgICAgIGVyciA9IHBDX1NoZWxsQVBJLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbigKLSAgICAgICAgICAgIHBDX2V3Yy0+cDNncFdyaXRlckNvbnRleHQsIChNNE9TQV9VSW50MzIpTTRXUklURVJfa01heEFVU2l6ZSwKLSAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmdGVtcCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZTpcCi0gICAgICAgICAgICAgICAgcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oTTRXUklURVJfa01heEFVU2l6ZSwgYXVkaW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogU2V0IHRoZSB3cml0ZXIgbWF4IGF1ZGlvIGNodW5jayBzaXplICovCi0gICAgICAgIHRlbXAuc3RyZWFtSUQgPSBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRDsKLSAgICAgICAgdGVtcC52YWx1ZSA9IE00VlNTM0dQUF9BVURJT19NQVhfQ0hVTkNLX1NJWkU7Ci0gICAgICAgIGVyciA9IHBDX1NoZWxsQVBJLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbigKLSAgICAgICAgICAgIHBDX2V3Yy0+cDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNYXhDaHVuY2tTaXplLAotICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZ0ZW1wKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlOlwKLSAgICAgICAgICAgICAgICBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihNNFdSSVRFUl9rTWF4QVVTaXplLCBhdWRpbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEFsbCBzdHJlYW1zIGFkZGVkLCB3ZSdyZSBub3cgcmVhZHkgdG8gd3JpdGUgKi8KLSAgICBlcnIgPSBwQ19TaGVsbEFQSS0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTdGFydFdyaXRpbmcoCi0gICAgICAgIHBDX2V3Yy0+cDNncFdyaXRlckNvbnRleHQpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZTpcCi0gICAgICAgICAgICBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFN0YXJ0V3JpdGluZygpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZSgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpKCkKLSAqIEBicmllZiAgICBHZW5lcmF0ZSBhIEgyNjMgb3IgTVBFRy00IGRlY29kZXIgc3BlY2lmaWMgaW5mbyBjb21wYXRpYmxlIHdpdGggYWxsIGlucHV0IHZpZGVvCi0gKiAgICAgICAgICAgIHRyYWNrcy4gQ29weSBhdWRpbyBkc2kgZnJvbSBtYXN0ZXIgY2xpcC4KLSAqIEBwYXJhbSAgIHBDICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSCi1NNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2koIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCB1aU1hc3RlckNsaXAgKQotewotICAgIE00T1NBX0ludDMyIGlSZXN5bmNoTWFya2VyRHNpSW5kZXg7Ci0gICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUZvckRzaTsKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwOwotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0gICAgTTRERUNPREVSX01QRUc0X0RlY29kZXJDb25maWdJbmZvIERlY0NvbmZpZ0luZm87Ci0gICAgTTRERUNPREVSX1ZpZGVvU2l6ZSBkdW1teVNpemU7Ci0gICAgTTRPU0FfQm9vbCBiR2V0RFNpRnJvbUVuY29kZXIgPSBNNE9TQV9GQUxTRTsKLQotICAgIE00RU5DT0RFUl9IZWFkZXIgKmVuY0hlYWRlcjsKLSAgICBNNFNZU19TdHJlYW1JRG1lbUFkZHIgc3RyZWFtSGVhZGVyOwotCi0gICAgcFN0cmVhbUZvckRzaSA9IE00T1NBX05VTEw7Ci0gICAgcENsaXAgPSBNNE9TQV9OVUxMOwotCi0gICAgLyoqCi0gICAgKiBIMjYzIGNhc2UgKi8KLSAgICBpZiggTTRTWVNfa0gyNjMgPT0gcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogSDI2MyBvdXRwdXQgRFNJIGlzIGFsd2F5cyA3IGJ5dGVzICovCi0gICAgICAgIHBDLT5ld2MudWlWaWRlb091dHB1dERzaVNpemUgPSA3OwotICAgICAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaSA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBDLT5ld2MudWlWaWRlb091dHB1dERzaVNpemUsCi0gICAgICAgICAgICBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopInBDLT5ld2MucFZpZGVvT3V0cHV0RHNpIChIMjYzKSIpOwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaSgpOlwKLSAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgcFZpZGVvT3V0cHV0RHNpIChIMjYzKSwgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiAoV2Ugb3ZlcnJpZGUgdGhlIGlucHV0IHZlbmRvciBpbmZvLgotICAgICAgICAqIEF0IGxlYXN0IHdlIGtub3cgdGhhdCBub3RoaW5nIHNwZWNpYWwgd2lsbCBiZSB0cmllZCB3aXRoIFBITFAtc3RhbXBlZAotICAgICAgICAgIGVkaXRlZCBzdHJlYW1zLi4uKSAqLwotICAgICAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaVswXSA9ICdQJzsKLSAgICAgICAgcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2lbMV0gPSAnSCc7Ci0gICAgICAgIHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpWzJdID0gJ0wnOwotICAgICAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaVszXSA9ICdQJzsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBEZWNvZGVyIHZlcnNpb24gaXMgMCAqLwotICAgICAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaVs0XSA9IDA7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogTGV2ZWwgaXMgdGhlIHNpeHRoIGJ5dGUgaW4gdGhlIERTSSAqLwotICAgICAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaVs1XSA9IHBDLT54VlNTLm91dHB1dFZpZGVvTGV2ZWw7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogUHJvZmlsZSBpcyB0aGUgc2V2ZW50aCBieXRlIGluIHRoZSBEU0kqLwotICAgICAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaVs2XSA9IHBDLT54VlNTLm91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIE1QRUctNCBjYXNlICovCi0gICAgZWxzZSBpZiggTTRTWVNfa01QRUdfNCA9PSBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSB8fAotICAgICAgICBNNFNZU19rSDI2NCA9PSBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSkgewotCi0gICAgICAgIC8qIEZvciBNUEVHNCBhbmQgSC4yNjQgZW5jb2RlciBjYXNlCi0gICAgICAgICogRmV0Y2ggdGhlIERTSSBmcm9tIHRoZSBzaGVsbCB2aWRlbyBlbmNvZGVyLCBhbmQgZmVlZCBpdCB0byB0aGUgd3JpdGVyIGJlZm9yZQotICAgICAgICBjbG9zaW5nIGl0LiAqLwotCi0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaTogZ2V0IERTSSBmb3IgSDI2NCBzdHJlYW0iKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+ZXdjLnBFbmNDb250ZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaTogcEMtPmV3Yy5wRW5jQ29udGV4dCBpcyBOVUxMIik7Ci0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyKHBDKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaTpcCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXIgcmV0dXJuZWQgZXJyb3IgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+ZXdjLnBFbmNDb250ZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0R2V0T3B0aW9uKAotICAgICAgICAgICAgICAgIHBDLT5ld2MucEVuY0NvbnRleHQsIE00RU5DT0RFUl9rT3B0aW9uSURfRW5jb2RlckhlYWRlciwKLSAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJmVuY0hlYWRlcik7Ci0KLSAgICAgICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSB8fCAoTTRPU0FfTlVMTCA9PSBlbmNIZWFkZXItPnBCdWYpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaTpcCi0gICAgICAgICAgICAgICAgICAgIGZhaWxlZCB0byBnZXQgdGhlIGVuY29kZXIgaGVhZGVyIChlcnIgMHgleCkiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpOiBlbmNIZWFkZXItPnBCdWY9MHgleCwgc2l6ZT0weCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZW5jSGVhZGVyLT5wQnVmLCBlbmNIZWFkZXItPlNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpOlwKLSAgICAgICAgICAgICAgICAgICAgIHNlbmQgRFNJIGZvciB2aWRlbyBzdHJlYW0gdG8gM0dQIHdyaXRlciIpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBBbGxvY2F0ZSBhbmQgY29weSB0aGUgbmV3IERTSSAqLwotICAgICAgICAgICAgICAgIHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhlbmNIZWFkZXItPlNpemUsIE00VlNTM0dQUCwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikicEMtPmV3Yy5wVmlkZW9PdXRwdXREc2kgKEgyNjQpIik7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+ZXdjLnBWaWRlb091dHB1dERzaSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2koKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIHBWaWRlb091dHB1dERzaSwgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvT3V0cHV0RHNpU2l6ZSA9IChNNE9TQV9VSW50MTYpZW5jSGVhZGVyLT5TaXplOwotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5ld2MucFZpZGVvT3V0cHV0RHNpLCAodm9pZCAqKWVuY0hlYWRlci0+cEJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgZW5jSGVhZGVyLT5TaXplKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludERlc3Ryb3lWaWRlb0VuY29kZXIocEMpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpOlwKLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludERlc3Ryb3lWaWRlb0VuY29kZXIgcmV0dXJuZWQgZXJyb3IgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpOlwKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLnBFbmNDb250ZXh0IGlzIE5VTEwsIGNhbm5vdCBnZXQgdGhlIERTSSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcFN0cmVhbUZvckRzaSA9IE00T1NBX05VTEw7Ci0gICAgcENsaXAgPSBNNE9TQV9OVUxMOwotCi0gICAgLyogQ29tcHV0ZSBBdWRpbyBEU0kgKi8KLSAgICBpZiggTTRTWVNfa0F1ZGlvVW5rbm93biAhPSBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgewotICAgICAgICBpZiggdWlNYXN0ZXJDbGlwID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDbGlwIGlzIGFscmVhZHkgb3BlbmVkICovCi0gICAgICAgICAgICBwU3RyZWFtRm9yRHNpID0gJihwQy0+cEMxLT5wQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBXZSBjYW4gdXNlIHRoZSBmYXN0IG9wZW4gbW9kZSB0byBnZXQgdGhlIERTSSAqLwotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBJbml0KCZwQ2xpcCwgcEMtPnBPc2FGaWxlUmVhZFB0cik7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2k6XAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcEluaXQoKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLQotICAgICAgICAgICAgICAgIGlmKCBwQ2xpcCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChwQ2xpcCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwT3BlbihwQ2xpcCwgJnBDLT5wQ2xpcExpc3RbdWlNYXN0ZXJDbGlwXSwKLSAgICAgICAgICAgICAgICBNNE9TQV9GQUxTRSwgTTRPU0FfVFJVRSwgTTRPU0FfVFJVRSk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2k6XAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcENsZWFuVXAocENsaXApOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBTdHJlYW1Gb3JEc2kgPSAmKHBDbGlwLT5wQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEFsbG9jYXRlIGFuZCBjb3B5IHRoZSBuZXcgRFNJICovCi0gICAgICAgIHBDLT5ld2MucEF1ZGlvT3V0cHV0RHNpID0gKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgIHBTdHJlYW1Gb3JEc2ktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopInBDLT5ld2MucEF1ZGlvT3V0cHV0RHNpIik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPmV3Yy5wQXVkaW9PdXRwdXREc2kgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpKCk6XAotICAgICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBwQXVkaW9PdXRwdXREc2ksIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIHBDLT5ld2MudWlBdWRpb091dHB1dERzaVNpemUgPQotICAgICAgICAgICAgKE00T1NBX1VJbnQxNilwU3RyZWFtRm9yRHNpLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplOwotICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+ZXdjLnBBdWRpb091dHB1dERzaSwKLSAgICAgICAgICAgICh2b2lkICopcFN0cmVhbUZvckRzaS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb091dHB1dERzaVNpemUpOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIElmIGEgY2xpcCBoYXMgYmVlbiB0ZW1wb3JhcmlseSBvcGVuZWQgdG8gZ2V0IGl0cyBEU0ksIGNsb3NlIGl0ICovCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKHBDbGlwKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaTpcCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcCgpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICJNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2koKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFN3aXRjaFRvTmV4dENsaXAoKQotICogQGJyaWVmICAgIFN3aXRjaCBmcm9tIHRoZSBjdXJyZW50IGNsaXAgdG8gdGhlIG5leHQgb25lCi0gKiBAcGFyYW0gICBwQyAgICAgICAgICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRTd2l0Y2hUb05leHRDbGlwKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wQzEgKQotICAgIHsKLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWUpIHsKLSAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVswXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEpIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzFdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVsyXS5wYWNfZGF0YSkgewotICAgICAgICAgICAgICAgIGZyZWUocEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgIHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZyZWUocEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWUpOwotICAgICAgICAgICAgcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWUgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAqIENsb3NlIHRoZSBjdXJyZW50IGZpcnN0IGNsaXAgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKHBDLT5wQzEpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50U3dpdGNoVG9OZXh0Q2xpcDogTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKEMxKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqICBpbmNyZW1lbnQgY2xpcCBjb3VudGVyICovCi0gICAgICAgIHBDLT51aUN1cnJlbnRDbGlwKys7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiB3ZSByZWFjaGVkIHRoZSBsYXN0IGNsaXAgKi8KLSAgICBpZiggcEMtPnVpQ3VycmVudENsaXAgPj0gcEMtPnVpQ2xpcE51bWJlciApCi0gICAgewotICAgICAgICBwQy0+cEMxID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfRklOSVNIRUQ7Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludFN3aXRjaFRvTmV4dENsaXA6XAotICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBDbG9zZShDMSkgcmV0dXJucyBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORSIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJZiB0aGUgbmV4dCBjbGlwIGhhcyBhbHJlYWR5IGJlIG9wZW5lZCwgc2V0IGl0IGFzIGZpcnN0IGNsaXAgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cEMyICkKLSAgICB7Ci0gICAgICAgIHBDLT5wQzEgPSBwQy0+cEMyOwotICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5wQzItPm1fcFByZVJlc2l6ZUZyYW1lKSB7Ci0gICAgICAgICAgICBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZSA9IHBDLT5wQzItPm1fcFByZVJlc2l6ZUZyYW1lOwotICAgICAgICB9Ci0gICAgICAgIHBDLT5wQzIgPSBNNE9TQV9OVUxMOwotICAgICAgICBwQy0+YkNsaXAxQWN0aXZlRnJhbWluZ0VmZmVjdCA9IHBDLT5iQ2xpcDJBY3RpdmVGcmFtaW5nRWZmZWN0OwotICAgICAgICBwQy0+YkNsaXAyQWN0aXZlRnJhbWluZ0VmZmVjdCA9IE00T1NBX0ZBTFNFOwotICAgIH0KLSAgICAvKioKLSAgICAqIGVsc2Ugb3BlbiBpdCAqLwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRPcGVuQ2xpcChwQywgJnBDLT5wQzEsCi0gICAgICAgICAgICAmcEMtPnBDbGlwTGlzdFtwQy0+dWlDdXJyZW50Q2xpcF0pOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50U3dpdGNoVG9OZXh0Q2xpcDogTTRWU1MzR1BQX2ludE9wZW5DbGlwKCkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBJZiB0aGUgc2Vjb25kIGNsaXAgaGFzIG5vdCBiZWVuIG9wZW5lZCB5ZXQsCi0gICAgICAgICAgdGhhdCBtZWFucyB0aGF0IHRoZXJlIGhhcyBiZWVuIG5vIHRyYW5zaXRpb24uCi0gICAgICAgICogU28gYm90aCBvdXRwdXQgdmlkZW8gYW5kIGF1ZGlvIHRpbWVzIGFyZSBPSy4KLSAgICAgICAgKiBTbyB3ZSBjYW4gc2V0IGJvdGggdmlkZW8yIGFuZCBhdWRpbyBvZmZzZXRzICovCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogQWRkIGN1cnJlbnQgdmlkZW8gb3V0cHV0IENUUyB0byB0aGUgY2xpcCB2aWRlbyBvZmZzZXQgKi8KLQotICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICBwQy0+cEMxLT5pVm9mZnNldCArPSAoTTRPU0FfVUludDMyKXBDLT5ld2MuZElucHV0VmlkQ3RzOwotICAgICAgICAvKioKLSAgICAgICAgKiBBZGQgY3VycmVudCBhdWRpbyBvdXRwdXQgQ1RTIHRvIHRoZSBjbGlwIGF1ZGlvIG9mZnNldCAqLwotICAgICAgICBwQy0+cEMxLT5pQW9mZnNldCArPQotICAgICAgICAgICAgKE00T1NBX1VJbnQzMikocEMtPmV3Yy5kQVRvICogcEMtPmV3Yy5zY2FsZV9hdWRpbyArIDAuNSk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogMjAwNS0wMy0yNDogQnVnRml4IGZvciBhdWRpby12aWRlbyBzeW5jaHJvOgotICAgICAgICAqIFRoZXJlIG1heSBiZSBhIHBvcnRpb24gb2YgdGhlIGR1cmF0aW9uIG9mIGFuIGF1ZGlvIEFVIG9mIGRlc3luY2hybyBhdCBlYWNoIGFzc2VtYmx5LgotICAgICAgICAqIEl0IGxlYWRzIHRvIGFuIGF1ZGlibGUgZGVzeW5jaHJvIHdoZW4gdGhlcmUgYXJlIGEgbG90IG9mIGNsaXBzIGFzc2VtYmxlZC4KLSAgICAgICAgKiBUaGlzIGJ1ZyBmaXggYWxsb3dzIHRvIHJlc3luY2ggdGhlIGF1ZGlvIHRyYWNrIHdoZW4gdGhlIGRlbHRhIGlzIGhpZ2hlcgotICAgICAgICAqIHRoYW4gb25lIGF1ZGlvIEFVIGR1cmF0aW9uLgotICAgICAgICAqIFdlIFN0ZXAgb25lIEFVIGluIHRoZSBzZWNvbmQgY2xpcCBhbmQgd2UgY2hhbmdlIHRoZSBhdWRpbyBvZmZzZXQgYWNjb3JkaW5nbHkuICovCi0gICAgICAgIGlmKCAoIHBDLT5wQzEtPmlBb2Zmc2V0Ci0gICAgICAgICAgICAtIChNNE9TQV9JbnQzMikocEMtPnBDMS0+aVZvZmZzZXQgKnBDLT5wQzEtPnNjYWxlX2F1ZGlvICsgMC41KSkKLSAgICAgICAgPiBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBBZHZhbmNlIG9uZSBBTVIgZnJhbWUgKi8KLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKHBDLT5wQzEpOwotCi0gICAgICAgICAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFN3aXRjaFRvTmV4dENsaXA6XAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFVwZGF0ZSBhdWRpbyBvZmZzZXQgYWNjb3JkaW5nbHkqLwotICAgICAgICAgICAgcEMtPnBDMS0+aUFvZmZzZXQgLT0gcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb247Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEluaXQgc3RhcnRpbmcgc3RhdGUgZm9yIHRoaXMgY2xpcCBwcm9jZXNzaW5nICovCi0gICAgaWYoIE00U1lTX2tNUDMgPT0gcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogSW4gdGhlIE1QMyBjYXNlIHdlIHVzZSBhIHNwZWNpYWwgYXVkaW8gc3RhdGUgKi8KLSAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfTVAzX0pVTVA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFdlIHN0YXJ0IHdpdGggdGhlIHZpZGVvIHByb2Nlc3NpbmcgKi8KLSAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfVklERU87Ci0KLSAgICAgICAgaWYoIHBDLT5Wc3RhdGUgIT0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9UUkFOU0lUSU9OICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogaWYgbm90IGEgdHJhbnNpdGlvbiB0aGVuIHJlc2V0IHByZXZpb3VzIHZpZGVvIHN0YXRlICovCi0gICAgICAgICAgICBwQy0+VnN0YXRlID0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9SRUFEX1dSSVRFOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qIFRoZSBmbGFncyBhcmUgc2V0IHRvIGZhbHNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgZXZlcnkgY2xpcCAqLwotICAgIHBDLT5tX2JDbGlwRXh0ZXJuYWxIYXNTdGFydGVkID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPmJFbmNvZGVUaWxsRW9GID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRTd2l0Y2hUb05leHRDbGlwKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgLyogUkM6IHRvIGtub3cgd2hlbiBhIGZpbGUgaGFzIGJlZW4gcHJvY2Vzc2VkICovCi0gICAgcmV0dXJuIE00VlNTM0dQUF9XQVJfU1dJVENIX0NMSVA7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZWaWRlbygpCi0gKiBAYnJpZWYgICAgRG8gd2hhdCB0byBkbyB3aGVuIHRoZSBlbmQgb2YgYSBjbGlwIHZpZGVvIHRyYWNrIGlzIHJlYWNoZWQKLSAqIEBub3RlICAgIElmIHRoZXJlIGlzIGF1ZGlvIG9uIHRoZSBjdXJyZW50IGNsaXAsIHByb2Nlc3MgaXQsIGVsc2Ugc3dpdGNoIHRvIHRoZSBuZXh0IGNsaXAKLSAqIEBwYXJhbSAgIHBDICAgICAgICAgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mVmlkZW8oIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIC8qKgotICAgICogVmlkZW8gaXMgZG9uZSBmb3IgdGhpcyBjbGlwLCBub3cgd2UgZG8gdGhlIGF1ZGlvICovCi0gICAgaWYoIE00U1lTX2tBdWRpb1Vua25vd24gIT0gcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfQVVESU87Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENsaXAgZG9uZSwgZG8gdGhlIG5leHQgb25lICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRTd2l0Y2hUb05leHRDbGlwKHBDKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZlZpZGVvOiBNNFZTUzNHUFBfaW50U3dpdGNoVG9OZXh0Q2xpcCgpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZWaWRlbygpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mQXVkaW8oKQotICogQGJyaWVmICAgIERvIHdoYXQgdG8gZG8gd2hlbiB0aGUgZW5kIG9mIGEgY2xpcCBhdWRpbyB0cmFjayBpcyByZWFjaGVkCi0gKiBAcGFyYW0gICBwQyAgICAgICAgICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZkF1ZGlvKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICAvKioKLSAgICAqIENsaXAgZG9uZSwgZG8gdGhlIG5leHQgb25lICovCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludFN3aXRjaFRvTmV4dENsaXAocEMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZBdWRpbzogTTRWU1MzR1BQX2ludFN3aXRjaFRvTmV4dENsaXAoKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFN0YXJ0IHdpdGggdGhlIHZpZGVvICovCi0gICAgaWYoIE00U1lTX2tWaWRlb1Vua25vd24gIT0gcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfVklERU87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mQXVkaW8oKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludE9wZW5DbGlwKCkKLSAqIEBicmllZiAgICBPcGVuIG5leHQgY2xpcAotICogQHBhcmFtICAgcEMgICAgICAgICAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRPcGVuQ2xpcCggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKiogaENsaXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDbGlwU2V0dGluZ3MgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcDsgLyoqPCBzaG9ydGN1dCAqLwotICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwQ2xpcFByb3BlcnRpZXMgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX0ludDMyIGlDdHM7Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMSgiTTRWU1MzR1BQX2ludE9wZW5DbGlwOiBcIiVzXCIiLAotICAgICAgICAoTTRPU0FfQ2hhciAqKXBDbGlwU2V0dGluZ3MtPnBGaWxlKTsKLQotICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwSW5pdChoQ2xpcCwgcEMtPnBPc2FGaWxlUmVhZFB0cik7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludE9wZW5DbGlwOiBNNFZTUzNHUFBfaW50Q2xpcEluaXQoKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0KLSAgICAgICAgaWYoICpoQ2xpcCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKCpoQ2xpcCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFNldCBzaG9ydGN1dCAqLwotICAgIHBDbGlwID0gKmhDbGlwOwotCi0gICAgaWYgKHBDbGlwU2V0dGluZ3MtPkZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCApIHsKLSAgICAgICAgcENsaXBQcm9wZXJ0aWVzID0gJnBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzOwotICAgICAgICBwQ2xpcC0+cFNldHRpbmdzID0gcENsaXBTZXR0aW5nczsKLSAgICAgICAgcENsaXAtPmlFbmRUaW1lID0gcENsaXBTZXR0aW5ncy0+dWlFbmRDdXRUaW1lOwotICAgIH0KLQotICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwT3BlbihwQ2xpcCwgcENsaXBTZXR0aW5ncywKLSAgICAgICAgICAgICAgTTRPU0FfRkFMU0UsIE00T1NBX0ZBTFNFLCBNNE9TQV9GQUxTRSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50T3BlbkNsaXA6IFwKLSAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwT3BlbigpIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcENsZWFuVXAocENsaXApOwotICAgICAgICAqaENsaXAgPSBNNE9TQV9OVUxMOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmIChwQ2xpcFNldHRpbmdzLT5GaWxlVHlwZSAhPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODggKSB7Ci0gICAgICAgIHBDbGlwUHJvcGVydGllcyA9ICZwQ2xpcC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENvcHkgY29tbW9uICdzaWxlbmNlIGZyYW1lIHN0dWZmJyB0byBDbGlwQ29udGV4dCAqLwotICAgIHBDbGlwLT51aVNpbGVuY2VQY21TaXplID0gcEMtPmV3Yy51aVNpbGVuY2VQY21TaXplOwotICAgIHBDbGlwLT5wU2lsZW5jZUZyYW1lRGF0YSA9IHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGE7Ci0gICAgcENsaXAtPnVpU2lsZW5jZUZyYW1lU2l6ZSA9IHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplOwotICAgIHBDbGlwLT5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPSBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLSAgICBwQ2xpcC0+c2NhbGVfYXVkaW8gPSBwQy0+ZXdjLnNjYWxlX2F1ZGlvOwotCi0gICAgcENsaXAtPmlBdWRpb0ZyYW1lQ3RzID0gLXBDbGlwLT5pU2lsZW5jZUZyYW1lRHVyYXRpb247IC8qIFJlc2V0IHRpbWUgKi8KLQotICAgIC8qKgotICAgICogSWYgdGhlIGF1ZGlvIHRyYWNrIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIG91dHB1dCBhdWRpbyBmb3JtYXQsCi0gICAgKiB3ZSByZW1vdmUgaXQuIFNvIGl0IHdpbGwgYmUgcmVwbGFjZWQgYnkgc2lsZW5jZSAqLwotICAgIGlmKCBNNE9TQV9GQUxTRSA9PSBwQ2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwICkKLSAgICB7Ci0gICAgICAgIE00VlNTM0dQUF9pbnRDbGlwRGVsZXRlQXVkaW9UcmFjayhwQ2xpcCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBY3R1YWwgYmVnaW4gY3V0ICovCi0gICAgaWYoIDAgPT0gcENsaXBTZXR0aW5ncy0+dWlCZWdpbkN1dFRpbWUgKQotICAgIHsKLSAgICAgICAgcENsaXAtPmlWb2Zmc2V0ID0gMDsKLSAgICAgICAgcENsaXAtPmlBb2Zmc2V0ID0gMDsKLSAgICAgICAgcENsaXAtPmlBY3R1YWxWaWRlb0JlZ2luQ3V0ID0gMDsKLSAgICAgICAgcENsaXAtPmlBY3R1YWxBdWRpb0JlZ2luQ3V0ID0gMDsKLSAgICB9Ci0gICAgZWxzZSBpZihwQ2xpcFNldHRpbmdzLT5GaWxlVHlwZSAhPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpIHsKLSAgICAgICAgaWYoIE00U1lTX2tWaWRlb1Vua25vd24gIT0gcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogSnVtcCB0aGUgdmlkZW8gdG8gdGhlIHRhcmdldCBiZWdpbiBjdXQgdG8gZ2V0IHRoZSBhY3R1YWwgYmVnaW4gY3V0IHZhbHVlICovCi0gICAgICAgICAgICBwQ2xpcC0+aUFjdHVhbFZpZGVvQmVnaW5DdXQgPQotICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMilwQ2xpcFNldHRpbmdzLT51aUJlZ2luQ3V0VGltZTsKLSAgICAgICAgICAgIGlDdHMgPSBwQ2xpcC0+aUFjdHVhbFZpZGVvQmVnaW5DdXQ7Ci0KLSAgICAgICAgICAgIGVyciA9IHBDbGlwLT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdEp1bXAocENsaXAtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcENsaXAtPnBWaWRlb1N0cmVhbSwgJmlDdHMpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludE9wZW5DbGlwOiBtX3BGY3RKdW1wKFYpIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBVcGRhdGUgY2xpcCBvZmZzZXQgd2l0aCB0aGUgdmlkZW8gYmVnaW4gY3V0ICovCi0gICAgICAgICAgICBwQ2xpcC0+aVZvZmZzZXQgPSAtcENsaXAtPmlBY3R1YWxWaWRlb0JlZ2luQ3V0OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIE00U1lTX2tBdWRpb1Vua25vd24gIT0gcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogSnVtcCB0aGUgYXVkaW8gdG8gdGhlIHZpZGVvIGFjdHVhbCBiZWdpbiBjdXQgKi8KLSAgICAgICAgICAgIGlmKCBNNFZJREVPRURJVElOR19rTVAzICE9IHBDbGlwUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQ2xpcC0+aUFjdHVhbEF1ZGlvQmVnaW5DdXQgPSBwQ2xpcC0+aUFjdHVhbFZpZGVvQmVnaW5DdXQ7Ci0gICAgICAgICAgICAgICAgaUN0cyA9IChNNE9TQV9JbnQzMikocENsaXAtPmlBY3R1YWxBdWRpb0JlZ2luQ3V0Ci0gICAgICAgICAgICAgICAgICAgICogcENsaXAtPnNjYWxlX2F1ZGlvICsgMC41KTsKLQotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQocENsaXAsICZpQ3RzKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50T3BlbkNsaXA6IE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQoQSkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFVwZGF0ZSBjbGlwIG9mZnNldCB3aXRoIHRoZSBhdWRpbyBiZWdpbiBjdXQgKi8KLSAgICAgICAgICAgICAgICBwQ2xpcC0+aUFvZmZzZXQgPSAtaUN0czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEZvciB0aGUgTVAzLCB0aGUganVtcCBpcyBub3QgZG9uZSBiZWNhdXNlIG9mIHRoZSBWQlIsCi0gICAgICAgICAgICAgICAgICBpdCBjb3VsZCBiZSBub3QgZW5vdWdoIGFjY3VyYXRlICovCi0gICAgICAgICAgICAgICAgcENsaXAtPmlBY3R1YWxBdWRpb0JlZ2luQ3V0ID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKXBDbGlwU2V0dGluZ3MtPnVpQmVnaW5DdXRUaW1lOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYoIE00U1lTX2tWaWRlb1Vua25vd24gIT0gcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgaWYgKChwQ2xpcFNldHRpbmdzLT5GaWxlVHlwZSAhPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODggKSkgewotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogUmVhZCB0aGUgZmlyc3QgVmlkZW8gQVUgb2YgdGhlIGNsaXAgKi8KLSAgICAgICAgICAgIGVyciA9IHBDbGlwLT5TaGVsbEFQSS5tX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdSgKLSAgICAgICAgICAgICAgICBwQ2xpcC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQ2xpcC0+cFZpZGVvU3RyZWFtLCAmcENsaXAtPlZpZGVvQVUpOwotCi0gICAgICAgICAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogSWYgd2UgKGFscmVhZHkhKSByZWFjaCB0aGUgZW5kIG9mIHRoZSBjbGlwLCB3ZSBmaWx0ZXIgdGhlIGVycm9yLgotICAgICAgICAgICAgICAgICogSXQgd2lsbCBiZSBjb3JyZWN0bHkgbWFuYWdlZCBhdCB0aGUgZmlyc3Qgc3RlcC4gKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50T3BlbkNsaXA6IFwKLSAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUoKSByZXR1cm5zIDB4JXghIiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvV2lkdGggID0gcENsaXBQcm9wZXJ0aWVzLT51aVN0aWxsUGljV2lkdGg7Ci0gICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9IZWlnaHQgPSBwQ2xpcFByb3BlcnRpZXMtPnVpU3RpbGxQaWNIZWlnaHQ7Ci0gICAgICAgIH0KLSAgICAgICAgLyogc3RhdGUgY2hlY2sgbm90IHRvIGFsbG9jYXRlIGJ1ZmZlciBkdXJpbmcgc2F2ZSBzdGFydCAqLwotCi0KLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgLyogVmlkZW8gcmVzaXplIG1hbmFnZW1lbnQgICAqLwotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAvKioKLSAgICAgICAgKiBJZiB0aGUgaW5wdXQgY2xpcCBpcyBhIHJvdGF0ZSB2aWRlbyBvciB0aGUgb3V0cHV0IHJlc29sdXRpb24gaXMgZGlmZmVyZW50Ci0gICAgICAgICogZnJvbSB0aGUgaW5wdXQgcmVzb2x1dGlvbiwgdGhlbiB0aGUgdmlkZW8gZnJhbWUgbmVlZHMgdG8gYmUgcm90YXRlZAotICAgICAgICAqIG9yIHJlc2l6ZWQsIGZvcmNlIHRvIHJlc2l6ZSBtb2RlICovCi0gICAgICAgIGlmICgoKE00T1NBX1VJbnQzMilwQy0+ZXdjLnVpVmlkZW9XaWR0aCAhPQotICAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9XaWR0aCkgfHwKLSAgICAgICAgICAgICgoTTRPU0FfVUludDMyKXBDLT5ld2MudWlWaWRlb0hlaWdodCAhPQotICAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9IZWlnaHQpIHx8Ci0gICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnZpZGVvUm90YXRpb25EZWdyZWVzICE9IDApIHsKLQotICAgICAgICAgICAgaWYgKHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBBbGxvY2F0ZSB0aGUgaW50ZXJtZWRpYXRlIHZpZGVvIHBsYW5lIHRoYXQgd2lsbAotICAgICAgICAgICAgICAgICAgcmVjZWl2ZSB0aGUgZGVjb2RlZCBpbWFnZSBiZWZvcmUgcmVzaXppbmcgKi8KLSAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWUgPQotICAgICAgICAgICAgICAgICAoTTRWSUZJX0ltYWdlUGxhbmUqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgIDMqc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwgTTRWU1MzR1BQLAotICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikicFByZVJlc2l6ZUZyYW1lIik7Ci0gICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19pbnRQcmVwYXJlVmlkZW9FbmNvZGVyKCk6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBtX3BQcmVSZXNpemVGcmFtZSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVsyXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEFsbG9jYXRlIHRoZSBZIHBsYW5lICovCi0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfd2lkdGggID0KLSAgICAgICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvV2lkdGg7Ci0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfaGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvSGVpZ2h0OwotICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVswXS51X3N0cmlkZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVswXS51X3dpZHRoOwotCi0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhID0KLSAgICAgICAgICAgICAgICAgKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jICgKLSAgICAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMF0udV9zdHJpZGUgKiBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMF0udV9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgTTRNQ1MsIChNNE9TQV9DaGFyICopIm1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhIik7Ci0gICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19pbnRQcmVwYXJlVmlkZW9FbmNvZGVyKCk6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBtX3BQcmVSZXNpemVGcmFtZVswXS5wYWNfZGF0YSIpOwotICAgICAgICAgICAgICAgICAgICBmcmVlKHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEFsbG9jYXRlIHRoZSBVIHBsYW5lICovCi0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzFdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzFdLnVfd2lkdGggID0KLSAgICAgICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfd2lkdGggPj4gMTsKLSAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMV0udV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMF0udV9oZWlnaHQgPj4gMTsKLSAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMV0udV9zdHJpZGUgPQotICAgICAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMV0udV93aWR0aDsKLQotICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSA9Ci0gICAgICAgICAgICAgICAgIChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyAoCi0gICAgICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzFdLnVfc3RyaWRlICogcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzFdLnVfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgIE00TUNTLCAoTTRPU0FfQ2hhciAqKSJtX3BQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSIpOwotICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSkgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcigpOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgbV9wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEiKTsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMF0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICBmcmVlKHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEFsbG9jYXRlIHRoZSBWIHBsYW5lICovCi0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzJdLnVfd2lkdGggPQotICAgICAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMV0udV93aWR0aDsKLSAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMl0udV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMV0udV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzJdLnVfc3RyaWRlID0KLSAgICAgICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzJdLnVfd2lkdGg7Ci0KLSAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEgPQotICAgICAgICAgICAgICAgICAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MgKAotICAgICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVsyXS51X3N0cmlkZSAqIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVsyXS51X2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICBNNE1DUywgKE00T1NBX0NoYXIgKikibV9wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEiKTsKLSAgICAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXIoKTogXAotICAgICAgICAgICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIG1fcFByZVJlc2l6ZUZyYW1lWzJdLnBhY19kYXRhIik7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUocENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICBmcmVlKHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBUaGUgdmlkZW8gaXMgY3VycmVudGx5IGluIHJlYWRpbmcgbW9kZSAqLwotICAgICAgICBwQ2xpcC0+VnN0YXR1cyA9IE00VlNTM0dQUF9rQ2xpcFN0YXR1c19SRUFEOwotICAgIH0KLQotICAgIGlmKCAoIE00U1lTX2tBdWRpb1Vua25vd24gIT0gcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUpCi0gICAgICAgICYmIChNNFZJREVPRURJVElOR19rTVAzICE9IHBDbGlwUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlKSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBSZWFkIHRoZSBmaXJzdCBBdWRpbyBBVSBvZiB0aGUgY2xpcCAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShwQ2xpcCk7Ci0KLSAgICAgICAgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRPcGVuQ2xpcDogTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBUaGUgYXVkaW8gaXMgY3VycmVudGx5IGluIHJlYWRpbmcgbW9kZSAqLwotICAgICAgICBwQ2xpcC0+QXN0YXR1cyA9IE00VlNTM0dQUF9rQ2xpcFN0YXR1c19SRUFEOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludE9wZW5DbGlwKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICBNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dEF2ZXJhZ2VWaWRlb0JpdHJhdGUoKQotICogQGJyaWVmICAgIEF2ZXJhZ2UgYml0cmF0ZSBvZiB0aGUgb3V0cHV0IGZpbGUsIGNvbXB1dGVkIGZyb20gaW5wdXQgYml0cmF0ZXMsCi0gKiAgICAgICAgICBkdXJhdGlvbnMsIHRyYW5zaXRpb25zIGFuZCBjdXRzLgotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0QXZlcmFnZVZpZGVvQml0cmF0ZSgKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKQotewotICAgIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDU18wLCAqcENTXzEsICpwQ1NfMjsKLSAgICBNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzICpwVDAsICpwVDI7Ci0gICAgTTRPU0FfSW50MzIgaTsKLQotICAgIE00T1NBX1VJbnQzMiB0MF9kdXJhdGlvbiwgdDJfZHVyYXRpb247Ci0gICAgTTRPU0FfVUludDMyIHQwX2JpdHJhdGUsIHQyX2JpdHJhdGU7Ci0gICAgTTRPU0FfVUludDMyIGMxX2R1cmF0aW9uOwotCi0gICAgTTRPU0FfVUludDMyIHRvdGFsX2R1cmF0aW9uOwotICAgIE00T1NBX1VJbnQzMiB0b3RhbF9iaXRzdW07Ci0KLSAgICB0b3RhbF9kdXJhdGlvbiA9IDA7Ci0gICAgdG90YWxfYml0c3VtID0gMDsKLQotICAgIC8qIExvb3Agb24gdGhlIG51bWJlciBvZiBjbGlwcyAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgcEMtPnVpQ2xpcE51bWJlcjsgaSsrICkKLSAgICB7Ci0gICAgICAgIHBDU18xID0gJnBDLT5wQ2xpcExpc3RbaV07Ci0KLSAgICAgICAgdDBfZHVyYXRpb24gPSAwOwotICAgICAgICB0MF9iaXRyYXRlID0gcENTXzEtPkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9CaXRyYXRlOwotICAgICAgICB0Ml9kdXJhdGlvbiA9IDA7Ci0gICAgICAgIHQyX2JpdHJhdGUgPSBwQ1NfMS0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGU7Ci0KLSAgICAgICAgLyogVHJhbnNpdGlvbiB3aXRoIHRoZSBwcmV2aW91cyBjbGlwICovCi0gICAgICAgIGlmKCBpID4gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDU18wID0gJnBDLT5wQ2xpcExpc3RbaSAtIDFdOwotICAgICAgICAgICAgcFQwID0gJnBDLT5wVHJhbnNpdGlvbkxpc3RbaSAtIDFdOwotCi0gICAgICAgICAgICBpZiggcFQwLT5WaWRlb1RyYW5zaXRpb25UeXBlCi0gICAgICAgICAgICAgICAgIT0gTTRWU1MzR1BQX2tWaWRlb1RyYW5zaXRpb25UeXBlX05vbmUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHQwX2R1cmF0aW9uID0gcFQwLT51aVRyYW5zaXRpb25EdXJhdGlvbjsKLQotICAgICAgICAgICAgICAgIGlmKCBwQ1NfMC0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGUgPiB0MF9iaXRyYXRlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHQwX2JpdHJhdGUgPSBwQ1NfMC0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogVHJhbnNpdGlvbiB3aXRoIHRoZSBuZXh0IGNsaXAgKi8KLSAgICAgICAgaWYoIGkgPCBwQy0+dWlDbGlwTnVtYmVyIC0gMSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDU18yID0gJnBDLT5wQ2xpcExpc3RbaSArIDFdOwotICAgICAgICAgICAgcFQyID0gJnBDLT5wVHJhbnNpdGlvbkxpc3RbaV07Ci0KLSAgICAgICAgICAgIGlmKCBwVDItPlZpZGVvVHJhbnNpdGlvblR5cGUKLSAgICAgICAgICAgICAgICAhPSBNNFZTUzNHUFBfa1ZpZGVvVHJhbnNpdGlvblR5cGVfTm9uZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdDJfZHVyYXRpb24gPSBwVDItPnVpVHJhbnNpdGlvbkR1cmF0aW9uOwotCi0gICAgICAgICAgICAgICAgaWYoIHBDU18yLT5DbGlwUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZSA+IHQyX2JpdHJhdGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdDJfYml0cmF0ZSA9IHBDU18yLT5DbGlwUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDaGVjayBmb3IgY3V0IHRpbWVzICovCi0gICAgICAgIGlmKCBwQ1NfMS0+dWlFbmRDdXRUaW1lID4gMCApCi0gICAgICAgICAgICBjMV9kdXJhdGlvbiA9IHBDU18xLT51aUVuZEN1dFRpbWU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGMxX2R1cmF0aW9uID0gcENTXzEtPkNsaXBQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0KLSAgICAgICAgaWYoIHBDU18xLT51aUJlZ2luQ3V0VGltZSA+IDAgKQotICAgICAgICAgICAgYzFfZHVyYXRpb24gLT0gcENTXzEtPnVpQmVnaW5DdXRUaW1lOwotCi0gICAgICAgIGMxX2R1cmF0aW9uIC09IHQwX2R1cmF0aW9uICsgdDJfZHVyYXRpb247Ci0KLSAgICAgICAgLyogQ29tcHV0ZSBiaXRzdW0gYW5kIGR1cmF0aW9uICovCi0gICAgICAgIHRvdGFsX2R1cmF0aW9uICs9IGMxX2R1cmF0aW9uICsgdDBfZHVyYXRpb24gLyAyICsgdDJfZHVyYXRpb24gLyAyOwotCi0gICAgICAgIHRvdGFsX2JpdHN1bSArPQotICAgICAgICAgICAgYzFfZHVyYXRpb24gKiAocENTXzEtPkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9CaXRyYXRlIC8gMTAwMCkKLSAgICAgICAgICAgICsgKHQwX2JpdHJhdGUgLyAxMDAwKSAqIHQwX2R1cmF0aW9uIC8gMgotICAgICAgICAgICAgKyAodDJfYml0cmF0ZSAvIDEwMDApICogdDJfZHVyYXRpb24gLyAyOwotICAgIH0KLQotICAgIHBDLT5ld2MudWlWaWRlb0JpdHJhdGUgPSAoIHRvdGFsX2JpdHN1bSAvIHRvdGFsX2R1cmF0aW9uKSAqIDEwMDA7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0VkaXRBdWRpby5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfRWRpdEF1ZGlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc0Njg4M2QuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfRWRpdEF1ZGlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFZTUzNHUFBfRWRpdEF1ZGlvLmMKLSAqIEBicmllZiAgICBWaWRlbyBTdHVkaW8gU2VydmljZSAzR1BQIGVkaXQgQVBJIGltcGxlbWVudGF0aW9uLgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0vKioqKioqKioqKioqKioqKi8KLS8qKiogSW5jbHVkZXMgKioqLwotLyoqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0vKioKLSAqIE91ciBoZWFkZXIgKi8KLSNpbmNsdWRlICJNNFZTUzNHUFBfQVBJLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsVHlwZXMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxGdW5jdGlvbnMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxDb25maWcuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfRXJyb3JDb2Rlcy5oIgotCi0vKioKLSAqIE9TQUwgaGVhZGVycyAqLwotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIiAvKio8IE9TQUwgbWVtb3J5IG1hbmFnZW1lbnQgKi8KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIiAgLyoqPCBPU0FMIGRlYnVnIG1hbmFnZW1lbnQgKi8KLQotI2RlZmluZSBQV1JfRlhQX0ZSQUNUX01BWCAgICAgICAgICAgICgzMjc2OCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFN0YXRpYyBsb2NhbCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2hlY2tBdWRpb01vZGUoIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcEMgKTsKLXN0YXRpYyBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRDaGVja0F1ZGlvRWZmZWN0cyggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcEMsIE00T1NBX1VJbnQ4IHVpQ2xpcE51bWJlciApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXBwbHlBdWRpb0VmZmVjdCggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBDLCBNNE9TQV9VSW50OCB1aUNsaXAxb3JDbGlwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MTYgKnBQQ01kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlQQ01zaXplICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb1RyYW5zaXRpb24oIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBDLCBNNE9TQV9JbnQxNiAqcFBDTWRhdGExLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDE2ICpwUENNZGF0YTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpUENNc2l6ZSApOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdEp1bXBNUDMoKQotICogQGJyaWVmICAgIE9uZSBzdGVwIG9mIGp1bXBpbmcgcHJvY2Vzc2luZyBmb3IgdGhlIE1QMyBjbGlwLgotICogQG5vdGUgICAgT24gb25lIHN0ZXAsIHRoZSBqdW1wIG9mIHNldmVyYWwgQVUgaXMgZG9uZQotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdEp1bXBNUDMoIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwID0gcEMtPnBDMTsgLyoqPCBzaG9ydGN1dCAqLwotICAgIE00T1NBX0ludDMyIEp1bXBDdHM7Ci0KLSAgICBKdW1wQ3RzID0gcENsaXAtPmlBY3R1YWxBdWRpb0JlZ2luQ3V0OwotCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdChwQ2xpcCwgJkp1bXBDdHMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRPcGVuQ2xpcDogTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdChBKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYoIEp1bXBDdHMgPj0gcENsaXAtPmlBY3R1YWxBdWRpb0JlZ2luQ3V0ICkKLSAgICB7Ci0gICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFN0YXRlX01QMzsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBVcGRhdGUgY2xpcCBvZmZzZXQgd2l0aCB0aGUgYXVkaW8gYmVnaW4gY3V0ICovCi0gICAgICAgIHBDbGlwLT5pQW9mZnNldCA9IC1KdW1wQ3RzOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFRoZSBhdWRpbyBpcyBjdXJyZW50bHkgaW4gcmVhZGluZyBtb2RlICovCi0gICAgICAgIHBDbGlwLT5Bc3RhdHVzID0gTTRWU1MzR1BQX2tDbGlwU3RhdHVzX1JFQUQ7Ci0gICAgfQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdFN0ZXBNUDMoKQotICogQGJyaWVmICAgIE9uZSBzdGVwIG9mIGF1ZGlvIHByb2Nlc3NpbmcgZm9yIHRoZSBNUDMgY2xpcAotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdFN0ZXBNUDMoIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwID0gcEMtPnBDMTsgLyoqPCBzaG9ydGN1dCAqLwotCi0gICAgLyoqCi0gICAgKiBDb3B5IHRoZSBpbnB1dCBBVSB0byB0aGUgb3V0cHV0IEFVICovCi0gICAgZXJyID0gcEMtPnBPc2FGaWxlV3JpdFB0ci0+d3JpdGVEYXRhKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIHBDbGlwLT5wQXVkaW9GcmFtZVB0ciwgKE00T1NBX1VJbnQzMilwQ2xpcC0+dWlBdWRpb0ZyYW1lU2l6ZSk7Ci0KLSAgICAvKioKLSAgICAqIFJlYWQgdGhlIG5leHQgYXVkaW8gZnJhbWUgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShwQ2xpcCk7Ci0KLSAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwTVAzOiBSRUFEX1dSSVRFOlwKLSAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lIHJldHVybnMgMHgleCEiLCAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBVcGRhdGUgY3VycmVudCB0aW1lICh0bz10YytUKSAqLwotICAgICAgICBwQy0+ZXdjLmRBVG8gPQotICAgICAgICAgICAgKCBwQ2xpcC0+aUF1ZGlvRnJhbWVDdHMgKyBwQ2xpcC0+aUFvZmZzZXQpIC8gcENsaXAtPnNjYWxlX2F1ZGlvOwotCi0gICAgICAgIGlmKCAoTTRPU0FfSW50MzIpKHBDbGlwLT5pQXVkaW9GcmFtZUN0cyAvIHBDbGlwLT5zY2FsZV9hdWRpbyArIDAuNSkKLSAgICAgICAgICAgID49IHBDbGlwLT5pRW5kVGltZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00UkVBREVSX0J1ZmZlciBtcDN0YWdCdWZmZXI7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBUaGUgZHVyYXRpb24gaXMgYmV0dGVyIHJlc3BlY3RlZCBpZiB0aGUgZmlyc3QgQVUgYW5kIGxhc3QgQVUgYXJlIGJvdGggYWJvdmUKLSAgICAgICAgICAgIHRoZSBjdXQgdGltZSAqLwotICAgICAgICAgICAgZXJyID0gcEMtPnBPc2FGaWxlV3JpdFB0ci0+d3JpdGVEYXRhKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgcENsaXAtPnBBdWRpb0ZyYW1lUHRyLAotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpcENsaXAtPnVpQXVkaW9GcmFtZVNpemUpOwotCi0gICAgICAgICAgICAvKiBUaGUgSUQzdjEgdGFnIGlzIGFsd2F5cyBhdCB0aGUgZW5kIG9mIHRoZSBtcDMgZmlsZSBzbyB0aGUgZW5kIG9mIHRoZSBjdXR0aW5nCi0gICAgICAgICAgICBwcm9jZXNzIGlzIHdhaXRlZCAqLwotICAgICAgICAgICAgLyogYmVmb3JlIHdyaXRpbmcgdGhlIG1ldGFkYXRhIGluIHRoZSBvdXRwdXQgZmlsZSovCi0KLSAgICAgICAgICAgIC8qIFJldHJpZXZlIHRoZSBkYXRhIG9mIHRoZSBJRDN2MSBUYWcgKi8KLSAgICAgICAgICAgIGVyciA9IHBDbGlwLT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdEdldE9wdGlvbigKLSAgICAgICAgICAgICAgICBwQ2xpcC0+cFJlYWRlckNvbnRleHQsIE00UkVBREVSX2tPcHRpb25JRF9NcDNJZDN2MVRhZywKLSAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJm1wM3RhZ0J1ZmZlcik7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBNUDM6IE00TVAzUl9nZXRPcHRpb24gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBXcml0ZSB0aGUgZGF0YSBvZiB0aGUgSUQzdjEgVGFnIGluIHRoZSBvdXRwdXQgZmlsZSAqLwotICAgICAgICAgICAgaWYoIDAgIT0gbXAzdGFnQnVmZmVyLm1fdWlCdWZmZXJTaXplICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+cE9zYUZpbGVXcml0UHRyLT53cml0ZURhdGEocEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KW1wM3RhZ0J1ZmZlci5tX3BEYXRhLCBtcDN0YWdCdWZmZXIubV91aUJ1ZmZlclNpemUpOwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogRnJlZSBiZWZvcmUgdGhlIGVycm9yIGNoZWNraW5nIGFueXdheSAqLwotICAgICAgICAgICAgICAgIGZyZWUobXAzdGFnQnVmZmVyLm1fcERhdGEpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBFcnJvciBjaGVja2luZyAqLwotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBNUDM6XAotICAgICAgICAgICAgICAgICAgICAgICAgcE9zYUZpbGVXcml0UHRyLT53cml0ZURhdGEoSUQzdjFUYWcpIHJldHVybnMgMHgleCIsICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbXAzdGFnQnVmZmVyLm1fdWlCdWZmZXJTaXplID0gMDsKLSAgICAgICAgICAgICAgICBtcDN0YWdCdWZmZXIubV9wRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIFRoZSBFbmQgQ3V0IGhhcyBiZWVuIHJlYWNoZWQgKi8KLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZBdWRpbyhwQyk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBNUDMgOiBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mQXVkaW8gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYoICggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIpICYmIChNNE9TQV9GQUxTRQotICAgICAgICAgICAgPT0gcEMtPmJTdXBwb3J0U2lsZW5jZSkgKSAvKio8IFJlYWNoZWQgZW5kIG9mIGNsaXAgKi8KLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZkF1ZGlvKAotICAgICAgICAgICAgICAgIHBDKTsgLyoqPCBDbGlwIGRvbmUsIGRvIHRoZSBuZXh0IG9uZSAqLwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwTVAzOiBSRUFEX1dSSVRFOlwKLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZkF1ZGlvIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEVkaXRTdGVwTVAzOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW8oKQotICogQGJyaWVmICAgIE9uZSBzdGVwIG9mIGF1ZGlvIHByb2Nlc3NpbmcKLSAqIEBwYXJhbSAgIHBDICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW8oIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBpbnQzMl90IGF1VGltZVN0YW1wID0gLTE7Ci0KLSAgICBNNEVOQ09ERVJfQXVkaW9CdWZmZXIgcEVuY0luQnVmZmVyOyAgLyoqPCBFbmNvZGVyIGlucHV0IGJ1ZmZlciBmb3IgYXBpICovCi0gICAgTTRFTkNPREVSX0F1ZGlvQnVmZmVyIHBFbmNPdXRCdWZmZXI7IC8qKjwgRW5jb2RlciBvdXRwdXQgYnVmZmVyIGZvciBhcGkgKi8KLSAgICBNNE9TQV9UaW1lCi0gICAgICAgIGZyYW1lVGltZURlbHRhOyAvKio8IER1cmF0aW9uIG9mIHRoZSBlbmNvZGVkICh0aGVuIHdyaXR0ZW4pIGRhdGEgKi8KLSAgICBNNE9TQV9Cb29sIGJTdG9wQXVkaW87Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIHdlIHJlYWNoZWQgZW5kIGN1dCAqLwotICAgIGlmKCAoIHBDLT5ld2MuZEFUbyAtIHBDLT5wQzEtPmlBb2Zmc2V0IC8gcEMtPnBDMS0+c2NhbGVfYXVkaW8gKyAwLjUpCi0gICAgICAgID49IHBDLT5wQzEtPmlFbmRUaW1lICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEF1ZGlvIGlzIGRvbmUgZm9yIHRoaXMgY2xpcCAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mQXVkaW8ocEMpOwotCi0gICAgICAgIC8qIFJDOiB0byBrbm93IHdoZW4gYSBmaWxlIGhhcyBiZWVuIHByb2Nlc3NlZCAqLwotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgJiYgZXJyICE9IE00VlNTM0dQUF9XQVJfU1dJVENIX0NMSVAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IE00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZBdWRpbyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2hlY2sgQXVkaW8gTW9kZSwgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IG91dHB1dCBDVFMgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2hlY2tBdWRpb01vZGUoCi0gICAgICAgIHBDKTsgLyoqPCBUaGlzIGZ1bmN0aW9uIGNoYW5nZSB0aGUgcEMtPkFzdGF0ZSB2YXJpYWJsZSEgKi8KLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogTTRWU1MzR1BQX2ludENoZWNrQXVkaW9Nb2RlIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTJfMygiICBBVURJTyBzdGVwIDogZEFUbyA9ICVmICBzdGF0ZSA9ICVkICBvZmZzZXQgPSAlbGQiLAotICAgICAgICBwQy0+ZXdjLmRBVG8sIHBDLT5Bc3RhdGUsIHBDLT5wQzEtPmlBb2Zmc2V0KTsKLQotICAgIGJTdG9wQXVkaW8gPSBNNE9TQV9GQUxTRTsKLQotICAgIHN3aXRjaCggcEMtPkFzdGF0ZSApCi0gICAgewotICAgICAgICAgICAgLyogX19fX19fX19fX19fX19fX18gKi8KLSAgICAgICAgICAgIC8qfCAgICAgICAgICAgICAgICAgfCovCi0gICAgICAgICAgICAvKnwgUkVBRF9XUklURSBNT0RFIHwqLwotICAgICAgICAgICAgLyp8X19fX19fX19fX19fX19fX198Ki8KLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfUkVBRF9XUklURToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW8gUkVBRF9XUklURSIpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBHZXQgdGhlIG91dHB1dCBBVSB0byB3cml0ZSBpbnRvICovCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELAotICAgICAgICAgICAgICAgICAgICAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzpcCi0gICAgICAgICAgICAgICAgICAgICAgICBSRUFEX1dSSVRFOiBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIENvbXB1dGUgb3V0cHV0IGF1ZGlvIENUUyAqLwotICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5DVFMgPQotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5pQXVkaW9GcmFtZUN0cyArIHBDLT5wQzEtPmlBb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBCWlpaIGJ1ZyBmaXggKHJlYWQtd3JpdGUgY2FzZSk6Ci0gICAgICAgICAgICAgICAgKiBSZXBsYWNlIHRoZSBmaXJzdCBBTVIgQVUgb2YgdGhlIHN0cmVhbSB3aXRoIGEgc2lsZW5jZSBBVS4KLSAgICAgICAgICAgICAgICAqIEl0IHJlbW92ZXMgYW5ub3lpbmcgIkJaWloiIGF1ZGlvIGdsaXRjaC4KLSAgICAgICAgICAgICAgICAqIEl0IGlzIG5vdCBuZWVkZWQgaWYgdGhlcmUgaXMgYSBiZWdpbiBjdXQuCi0gICAgICAgICAgICAgICAgKiBJdCBpcyBub3QgbmVlZGVkIGZvciB0aGUgZmlyc3QgY2xpcC4KLSAgICAgICAgICAgICAgICAqIEJlY2F1c2Ugb2YgYW5vdGhlciBidWdmaXggKDIwMDUtMDMtMjQpLCB0aGUgZmlyc3QgQVUgd3JpdHRlbiBtYXkgYmUKLSAgICAgICAgICAgICAgICAqIHRoZSBzZWNvbmQgb25lIHdoaWNoIENUUyBpcyAyMC4gSGVuY2UgdGhlIGN0czwyMSB0ZXN0LgotICAgICAgICAgICAgICAgICogKHRoZSBCWlpaIGVmZmVjdCBvY2N1cnMgZXZlbiB3aXRoIHRoZSBzZWNvbmQgQVUhKSAqLwotICAgICAgICAgICAgICAgIGlmKCAoIE00T1NBX0ZBTFNFID09IHBDLT5wQzEtPmJGaXJzdEF1V3JpdHRlbikKLSAgICAgICAgICAgICAgICAgICAgJiYgKDAgIT0gcEMtPnVpQ3VycmVudENsaXApICYmIChwQy0+cEMxLT5pQXVkaW9GcmFtZUN0cwotICAgICAgICAgICAgICAgICAgICA8IChwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiArIDEpKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBDb3B5IGEgc2lsZW5jZSBBVSB0byB0aGUgb3V0cHV0ICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplID0gcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemU7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSwgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUpOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiQSAjIyMjIHNpbGVuY2UgQVUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggKE00T1NBX1VJbnQzMilwQy0+cEMxLT51aUF1ZGlvRnJhbWVTaXplCi0gICAgICAgICAgICAgICAgICAgIDwgcEMtPmV3Yy51aUF1ZGlvTWF4QXVTaXplICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIENvcHkgdGhlIGlucHV0IEFVIHRvIHRoZSBvdXRwdXQgQVUgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMilwQy0+cEMxLT51aUF1ZGlvRnJhbWVTaXplOwotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+ZXdjLldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5wQzEtPnBBdWRpb0ZyYW1lUHRyLCBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBSRUFEX1dSSVRFOiBBVSBzaXplIGdyZWF0ZXIgdGhhbiBNYXhBdVNpemUgXAotICAgICAgICAgICAgICAgICAgICAgICAgKCVkPiVkKSEgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5QVVRfQVVESU9fQVVfVE9PX0xBUkdFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnVpQXVkaW9GcmFtZVNpemUsIHBDLT5ld2MudWlBdWRpb01heEF1U2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0FVX1RPT19MQVJHRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFRoaXMgYm9vbGVhbiBpcyBvbmx5IHVzZWQgdG8gZml4IHRoZSBCWlogYnVnLi4uICovCi0gICAgICAgICAgICAgICAgcEMtPnBDMS0+YkZpcnN0QXVXcml0dGVuID0gTTRPU0FfVFJVRTsKLQotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8yKCJCIC0tLS0gd3JpdGUgOiBjdHMgID0gJWxkIFsgMHgleCBdIiwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTIC8gcEMtPmV3Yy5zY2FsZV9hdWRpbyksCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplKTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogV3JpdGUgdGhlIEFVICovCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVSgKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwgTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsCi0gICAgICAgICAgICAgICAgICAgICZwQy0+ZXdjLldyaXRlckF1ZGlvQVUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qMTEvMTIvMjAwOCBDUiAzMjgzIE1NUyB1c2UgY2FzZSBmb3IgVmlkZW9BcnRpc3QKLSAgICAgICAgICAgICAgICAgICAgdGhlIHdhcm5pbmcgTTRXQVJfV1JJVEVSX1NUT1BfUkVRIGlzIHJldHVybmVkIHdoZW4gdGhlIHRhcmdldGVkIG91dHB1dCBmaWxlCi0gICAgICAgICAgICAgICAgICAgIHNpemUgaXMgcmVhY2hlZAotICAgICAgICAgICAgICAgICAgICBUaGUgZWRpdGluZyBpcyB0aGVuIGZpbmlzaGVkLAotICAgICAgICAgICAgICAgICAgICAgdGhlIHdhcm5pbmcgTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkUgaXMgcmV0dXJuZWQqLwotICAgICAgICAgICAgICAgICAgICBpZiggTTRXQVJfV1JJVEVSX1NUT1BfUkVRID09IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogRmlsZSB3YXMgY3V0IHRvIGF2b2lkIG92ZXJzaXplIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQURfV1JJVEU6IHBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQXVkaW8gaXMgbm93IGluIHJlYWQgbW9kZSAodGhlcmUgbWF5IGJlIGEgImlmKHN0YXR1cyE9UkVBRCkiIGhlcmUsCi0gICAgICAgICAgICAgICAgYnV0IGl0IGlzIHJlbW92ZWQgZm9yIG9wdGltaXphdGlvbikgKi8KLSAgICAgICAgICAgICAgICBwQy0+cEMxLT5Bc3RhdHVzID0gTTRWU1MzR1BQX2tDbGlwU3RhdHVzX1JFQUQ7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFJlYWQgdGhlIG5leHQgYXVkaW8gZnJhbWUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShwQy0+cEMxKTsKLQotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8zKCJDIC4uLi4gcmVhZCAgOiBjdHMgID0gJS4wZiArICUuMGYgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5pQXVkaW9GcmFtZUN0cyAvIHBDLT5wQzEtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5pQW9mZnNldCAvIHBDLT5wQzEtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT51aUF1ZGlvRnJhbWVTaXplKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogUkVBRF9XUklURTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFVwZGF0ZSBjdXJyZW50IHRpbWUgKHRvPXRjK1QpICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuZEFUbyA9ICggcEMtPnBDMS0+aUF1ZGlvRnJhbWVDdHMgKyBwQy0+cEMxLT5pQW9mZnNldCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC8gcEMtPnBDMS0+c2NhbGVfYXVkaW87Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoICggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoTTRPU0FfRkFMU0UgPT0gcEMtPmJTdXBwb3J0U2lsZW5jZSkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogSWYgb3V0cHV0IGlzIG90aGVyIHRoYW4gQU1SIG9yIEFBQwotICAgICAgICAgICAgICAgICAgICAgICAgKGkuZS4gRVZSQyx3ZSBjYW4ndCB3cml0ZSBzaWxlbmNlIGludG8gaXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFNvIHdlIHNpbXBseSBlbmQgaGVyZS4qLwotICAgICAgICAgICAgICAgICAgICAgICAgYlN0b3BBdWRpbyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLyogX19fX19fX19fX19fX19fX19fX18gKi8KLSAgICAgICAgICAgIC8qfCAgICAgICAgICAgICAgICAgICAgfCovCi0gICAgICAgICAgICAvKnwgREVDT0RFX0VOQ09ERSBNT0RFIHwqLwotICAgICAgICAgICAgLyp8X19fX19fX19fX19fX19fX19fX198Ki8KLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfREVDT0RFX0VOQ09ERToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW8gREVDT0RFX0VOQ09ERSIpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBHZXQgdGhlIG91dHB1dCBBVSB0byB3cml0ZSBpbnRvICovCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELAotICAgICAgICAgICAgICAgICAgICAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogREVDT0RFX0VOQ09ERTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIElmIHdlIHdlcmUgcmVhZGluZyB0aGUgY2xpcCwgd2UgbXVzdCBqdW1wIGEgZmV3IEFVIGJhY2t3YXJkIHRvIGRlY29kZS9lbmNvZGUKLSAgICAgICAgICAgICAgICAod2l0aG91dCB3cml0aW5nIHJlc3VsdCkgZnJvbSB0aGF0IHBvaW50LiAqLwotICAgICAgICAgICAgICAgIGlmKCBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfUkVBRCA9PSBwQy0+cEMxLT5Bc3RhdHVzICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIGlUYXJnZXRDdHMsIGlDdXJyZW50Q3RzOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAwCi0gICAgICAgICAgICAgICAgICAgICAgICAhPSBwQy0+cEMxLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlBdWRpb0ZyYW1lQ3RzICkgLyoqPGRvbid0IHRyeSB0byBwcmUtZGVjb2RlIGlmIGNsaXAgaXMgYXQgaXRzIGJlZ2lubmluZy4gKi8KLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIEp1bXAgYSBmZXcgQVVzIGJhY2t3YXJkICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpQ3VycmVudEN0cyA9IHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzOwotICAgICAgICAgICAgICAgICAgICAgICAgaVRhcmdldEN0cyA9IGlDdXJyZW50Q3RzIC0gTTRWU1MzR1BQX05CX0FVX1BSRUZFVENICi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGlUYXJnZXRDdHMgPCAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpVGFyZ2V0Q3RzID0gMDsgLyoqPCBTYW5pdHkgY2hlY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdChwQy0+cEMxLCAmaVRhcmdldEN0cyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogREVDT0RFX0VOQ09ERS1wcmVmZXRjaDpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMSk7IC8qKjwgcmVhZCBBVSB3aGVyZSB3ZSBqdW1wZWQgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzMoIkQgLi4uLiByZWFkICA6IGN0cyAgPSAlLjBmICsgJS4wZiBbIDB4JXggXSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+aUF1ZGlvRnJhbWVDdHMgLyBwQy0+cEMxLT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5pQW9mZnNldCAvIHBDLT5wQzEtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnVpQXVkaW9GcmFtZVNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IERFQ09ERV9FTkNPREUtcHJlZmV0Y2g6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShhKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogRGVjb2RlL2VuY29kZSB1cCB0byB0aGUgd2FudGVkIHBvc2l0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSggcEMtPnBDMS0+aUF1ZGlvRnJhbWVDdHMgPCBpQ3VycmVudEN0cyApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZShwQy0+cEMxKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogREVDT0RFX0VOQ09ERS1wcmVmZXRjaDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW01vbm9dIG9yIFtTdGVyZW8gaW50ZXJsZWF2ZWRdIDogYWxsIGlzIGluIG9uZSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyWzBdID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyWzFdID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVsxXSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaW1lIGluIG1zIGZyb20gZGF0YSBzaXplLCBiZWNhdXNlIGl0IGlzIFBDTTE2IHNhbXBsZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVRpbWVEZWx0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdIC8gc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIHBDLT5ld2MudWlOYkNoYW5uZWxzOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBQcmVwYXJlIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jT3V0QnVmZmVyLnBUYWJsZUJ1ZmZlclswXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwQy0+ZXdjLldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJFICoqKiogcHJlLWVuY29kZSIpOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qT01YIEF1ZGlvIGRlY29kZXIgdXNlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIE9NWCBBdWRpbyBkZWMgc2hlbGwgZG9lcyBpbnRlcm5hbCBidWZmZXJpbmcgYW5kIGhlbmNlIGRvZXMgbm90IHJldHVybgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgUENNIGJ1ZmZlciBmb3IgZXZlcnkgZGVjb2RlU3RlcCBjYWxsLioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFNvIFBDTSBidWZmZXIgc2l6ZXMgbWlnaHQgYmUgMC4gSW4gdGhpcyBjYXNlIGRvbm90IGNhbGwgZW5jb2RlIFN0ZXAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIDAgIT0gcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBFbmNvZGUgdGhlIFBDTSBhdWRpbyAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+U2hlbGxBUEkucEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGVwKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wQXVkaW9FbmNDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBFbmNJbkJ1ZmZlciwgJnBFbmNPdXRCdWZmZXIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKE00V0FSX05PX01PUkVfQVUgIT0gZXJyKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbygpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0ZXAgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvL2lmKDAgIT0gcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0pCi0KLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBBdWRpb0ZyYW1lUHRyID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aW1lc3RhbXAgb2YgbGFzdCByZWFkIEFVCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RHZXRPcHRpb25BdWRpb0RlYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cEF1ZGlvRGVjQ3R4dCwgTTRBRF9rT3B0aW9uSURfQXVDVFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmYXVUaW1lU3RhbXApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF1VGltZVN0YW1wID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZCBhdWRpbyB0aW1lc3RhbXAgcmV0dXJuZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00V0FSX0lOVkFMSURfVElNRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5pQXVkaW9GcmFtZUN0cyA9IGF1VGltZVN0YW1wOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBBdWRpbyBpcyBub3cgT0sgZm9yIGRlY29kaW5nICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPkFzdGF0dXMgPSBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfREVDT0RFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogRGVjb2RlIHRoZSBpbnB1dCBhdWRpbyAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUocEMtPnBDMSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IERFQ09ERV9FTkNPREU6XAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwQy0+cEMxLT5wQXVkaW9GcmFtZVB0ciA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgICAgICAvLyBHZXQgdGltZXN0YW1wIG9mIGxhc3QgcmVhZCBBVQotICAgICAgICAgICAgICAgIHBDLT5wQzEtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0R2V0T3B0aW9uQXVkaW9EZWMoCi0gICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBBdWRpb0RlY0N0eHQsIE00QURfa09wdGlvbklEX0F1Q1RTLAotICAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJmF1VGltZVN0YW1wKTsKLQotICAgICAgICAgICAgICAgIGlmIChhdVRpbWVTdGFtcCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IGludmFsaWQgYXVkaW8gXAotICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wIHJldHVybmVkIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFdBUl9JTlZBTElEX1RJTUU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcEMtPnBDMS0+aUF1ZGlvRnJhbWVDdHMgPSBhdVRpbWVTdGFtcDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQXBwbHkgdGhlIGVmZmVjdCAqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+aUNsaXAxQWN0aXZlRWZmZWN0ID49IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFwcGx5QXVkaW9FZmZlY3QocEMsIDEsIChNNE9TQV9JbnQxNgotICAgICAgICAgICAgICAgICAgICAgICAgKilwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IERFQ09ERV9FTkNPREU6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRFbmRBdWRpb0VmZmVjdCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBDb21wdXRlIG91dHB1dCBhdWRpbyBDVFMgKi8KLSAgICAgICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTID0KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+aUF1ZGlvRnJhbWVDdHMgKyBwQy0+cEMxLT5pQW9mZnNldDsKLQotICAgICAgICAgICAgICAgIC8qIE1heSBoYXBwZW4gd2l0aCBjb3JydXB0ZWQgaW5wdXQgZmlsZXMgKHdoaWNoIGhhdmUgc3R0cyBlbnRyaWVzIG5vdAotICAgICAgICAgICAgICAgIG11bHRpcGxlIG9mIFNpbGVuY2VGcmFtZUR1cmF0aW9uKSAqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTIDwgMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEJaWlogYnVnIGZpeCAoZGVjb2RlLWVuY29kZSBjYXNlKToKLSAgICAgICAgICAgICAgICAqIChZZXMsIHRoZSBCenogYnVnIG1heSBhbHNvIG9jY3VyIHdoZW4gd2UgcmUtZW5jb2RlLiBJdCBkb2Vzbid0Ci0gICAgICAgICAgICAgICAgKiAgb2NjdXIgYXQgdGhlIGRlY29kZSBiZWZvcmUgdGhlIGVuY29kZSwgYnV0IGF0IHRoZSBwbGF5YmFjayEpCi0gICAgICAgICAgICAgICAgKiBSZXBsYWNlIHRoZSBmaXJzdCBBTVIgQVUgb2YgdGhlIGVuY29kZWQgc3RyZWFtIHdpdGggYSBzaWxlbmNlIEFVLgotICAgICAgICAgICAgICAgICogSXQgcmVtb3ZlcyBhbm5veWluZyAiQlpaWiIgYXVkaW8gZ2xpdGNoLgotICAgICAgICAgICAgICAgICogSXQgaXMgbm90IG5lZWRlZCBpZiB0aGVyZSBpcyBhIGJlZ2luIGN1dC4KLSAgICAgICAgICAgICAgICAqIEl0IGlzIG5vdCBuZWVkZWQgZm9yIHRoZSBmaXJzdCBjbGlwLgotICAgICAgICAgICAgICAgICogQmVjYXVzZSBvZiBhbm90aGVyIGJ1Z2ZpeCAoMjAwNS0wMy0yNCksIHRoZSBmaXJzdCBBVSB3cml0dGVuIG1heSBiZQotICAgICAgICAgICAgICAgICogdGhlIHNlY29uZCBvbmUgd2hpY2ggQ1RTIGlzIDIwLiBIZW5jZSB0aGUgY3RzPDIxIHRlc3QuCi0gICAgICAgICAgICAgICAgKiAodGhlIEJaWlogZWZmZWN0IG9jY3VycyBldmVuIHdpdGggdGhlIHNlY29uZCBBVSEpICovCi0gICAgICAgICAgICAgICAgaWYoICggTTRPU0FfRkFMU0UgPT0gcEMtPnBDMS0+YkZpcnN0QXVXcml0dGVuKQotICAgICAgICAgICAgICAgICAgICAmJiAoMCAhPSBwQy0+dWlDdXJyZW50Q2xpcCkgJiYgKHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzCi0gICAgICAgICAgICAgICAgICAgIDwgKHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uICsgMSkpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIENvcHkgYSBzaWxlbmNlIEFNUiBBVSB0byB0aGUgb3V0cHV0ICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplID0gcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemU7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSwgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUpOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiRyAjIyMjIHNpbGVuY2UgQVUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogRW5jb2RlIHRoZSBmaWx0ZXJlZCBQQ00gYXVkaW8gZGlyZWN0bHkgaW50byB0aGUgb3V0cHV0IEFVICovCi0KLSAgICAgICAgICAgICAgICAgICAgLyogW01vbm9dIG9yIFtTdGVyZW8gaW50ZXJsZWF2ZWRdIDogYWxsIGlzIGluIG9uZSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclswXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzOwotICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0gICAgICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMV0gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVsxXSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogVGltZSBpbiBtcyBmcm9tIGRhdGEgc2l6ZSwgYmVjYXVzZSBpdCBpcyBQQ00xNiBzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgICAgIGZyYW1lVGltZURlbHRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdIC8gc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICAgICAgICAgLyBwQy0+ZXdjLnVpTmJDaGFubmVsczsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBQcmVwYXJlIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJbMF0gPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzczsKLSAgICAgICAgICAgICAgICAgICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdID0gMDsKLQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiSCArKysrIGVuY29kZSBBVSIpOwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0gICAgICAgICAgICAgICAgICAgIC8qT01YIEF1ZGlvIGRlY29kZXIgdXNlZC4KLSAgICAgICAgICAgICAgICAgICAgKiBPTVggQXVkaW8gZGVjIHNoZWxsIGRvZXMgaW50ZXJuYWwgYnVmZmVyaW5nIGFuZCBoZW5jZSBkb2VzIG5vdCByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgYSBQQ00gYnVmZmVyIGZvciBldmVyeSBkZWNvZGVTdGVwIGNhbGwuKgotICAgICAgICAgICAgICAgICAgICAqIFNvIFBDTSBidWZmZXIgc2l6ZXMgbWlnaHQgYmUgMC4gSW4gdGhpcyBjYXNlIGRvbm90IGNhbGwgZW5jb2RlIFN0ZXAqLwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAwICE9IHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdICkKLSAgICAgICAgICAgICAgICAgICAgewotCi0jZW5kaWYKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIEVuY29kZSB0aGUgUENNIGF1ZGlvICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0ZXAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wQXVkaW9FbmNDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRW5jSW5CdWZmZXIsICZwRW5jT3V0QnVmZmVyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpICYmIChNNFdBUl9OT19NT1JFX0FVICE9IGVycikgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW8oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RlcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0jZW5kaWYKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBTZXQgQVUgc2l6ZSAqLwotCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplID0gcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWwotICAgICAgICAgICAgICAgICAgICAgICAgMF07IC8qKjwgR2V0IHRoZSBzaXplIG9mIGVuY29kZWQgZGF0YSAqLwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogVGhpcyBib29sZWFuIGlzIG9ubHkgdXNlZCB0byBmaXggdGhlIEJaWiBidWcuLi4gKi8KLSAgICAgICAgICAgICAgICBwQy0+cEMxLT5iRmlyc3RBdVdyaXR0ZW4gPSBNNE9TQV9UUlVFOwotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzIoIkkgLS0tLSB3cml0ZSA6IGN0cyAgPSAlbGQgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5DVFMgLyBwQy0+ZXdjLnNjYWxlX2F1ZGlvKSwKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBXcml0ZSB0aGUgQVUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKAotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LCBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwKLSAgICAgICAgICAgICAgICAgICAgJnBDLT5ld2MuV3JpdGVyQXVkaW9BVSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoxMS8xMi8yMDA4IENSIDMyODMgTU1TIHVzZSBjYXNlIGZvciBWaWRlb0FydGlzdAotICAgICAgICAgICAgICAgICAgICB0aGUgd2FybmluZyBNNFdBUl9XUklURVJfU1RPUF9SRVEgaXMgcmV0dXJuZWQgd2hlbiB0aGUgdGFyZ2V0ZWQgb3V0cHV0IGZpbGUKLSAgICAgICAgICAgICAgICAgICAgIHNpemUgaXMgcmVhY2hlZAotICAgICAgICAgICAgICAgICAgICBUaGUgZWRpdGluZyBpcyB0aGVuIGZpbmlzaGVkLAotICAgICAgICAgICAgICAgICAgICAgdGhlIHdhcm5pbmcgTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkUgaXMgcmV0dXJuZWQqLwotICAgICAgICAgICAgICAgICAgICBpZiggTTRXQVJfV1JJVEVSX1NUT1BfUkVRID09IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogRmlsZSB3YXMgY3V0IHRvIGF2b2lkIG92ZXJzaXplIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IERFQ09ERV9FTkNPREU6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogUmVhZCB0aGUgbmV4dCBhdWRpbyBmcmFtZSAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKHBDLT5wQzEpOwotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzMoIkogLi4uLiByZWFkICA6IGN0cyAgPSAlLjBmICsgJS4wZiBbIDB4JXggXSIsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzIC8gcEMtPnBDMS0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmlBb2Zmc2V0IC8gcEMtPnBDMS0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnVpQXVkaW9GcmFtZVNpemUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBERUNPREVfRU5DT0RFOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogVXBkYXRlIGN1cnJlbnQgdGltZSAodG89dGMrVCkgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5kQVRvID0gKCBwQy0+cEMxLT5pQXVkaW9GcmFtZUN0cyArIHBDLT5wQzEtPmlBb2Zmc2V0KQotICAgICAgICAgICAgICAgICAgICAgICAgLyBwQy0+cEMxLT5zY2FsZV9hdWRpbzsKLQotICAgICAgICAgICAgICAgICAgICBpZiggKCBNNFdBUl9OT19NT1JFX0FVID09IGVycikKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChNNE9TQV9GQUxTRSA9PSBwQy0+YlN1cHBvcnRTaWxlbmNlKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBJZiBvdXRwdXQgaXMgb3RoZXIgdGhhbiBBTVIgb3IgQUFDCi0gICAgICAgICAgICAgICAgICAgICAgICAoaS5lLiBFVlJDLHdlIGNhbid0IHdyaXRlIHNpbGVuY2UgaW50byBpdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICogU28gd2Ugc2ltcGx5IGVuZCBoZXJlLiovCi0gICAgICAgICAgICAgICAgICAgICAgICBiU3RvcEF1ZGlvID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKiBfX19fX19fX19fX19fX19fXyAqLwotICAgICAgICAgICAgLyp8ICAgICAgICAgICAgICAgICB8Ki8KLSAgICAgICAgICAgIC8qfCBUUkFOU0lUSU9OIE1PREUgfCovCi0gICAgICAgICAgICAvKnxfX19fX19fX19fX19fX19fX3wqLwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tFZGl0QXVkaW9TdGF0ZV9UUkFOU0lUSU9OOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbyBUUkFOU0lUSU9OIik7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEdldCB0aGUgb3V0cHV0IEFVIHRvIHdyaXRlIGludG8gKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVSgKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwgTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsCi0gICAgICAgICAgICAgICAgICAgICZwQy0+ZXdjLldyaXRlckF1ZGlvQVUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBUUkFOU0lUSU9OOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogSWYgd2Ugd2VyZSByZWFkaW5nIHRoZSBjbGlwLCB3ZSBtdXN0IGp1bXAgYSBmZXcgQVUgYmFja3dhcmQgdG8gZGVjb2RlL2VuY29kZQotICAgICAgICAgICAgICAgICh3aXRob3V0IHdyaXRpbmcgcmVzdWx0KSBmcm9tIHRoYXQgcG9pbnQuICovCi0gICAgICAgICAgICAgICAgaWYoIE00VlNTM0dQUF9rQ2xpcFN0YXR1c19SRUFEID09IHBDLT5wQzEtPkFzdGF0dXMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgaVRhcmdldEN0cywgaUN1cnJlbnRDdHM7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIDAKLSAgICAgICAgICAgICAgICAgICAgICAgICE9IHBDLT5wQzEtPgotICAgICAgICAgICAgICAgICAgICAgICAgaUF1ZGlvRnJhbWVDdHMgKSAvKio8ZG9uJ3QgdHJ5IHRvIHByZS1kZWNvZGUgaWYgY2xpcCBpcyBhdCBpdHMgYmVnaW5uaW5nLiovCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBKdW1wIGEgZmV3IEFVcyBiYWNrd2FyZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaUN1cnJlbnRDdHMgPSBwQy0+cEMxLT5pQXVkaW9GcmFtZUN0czsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlUYXJnZXRDdHMgPSBpQ3VycmVudEN0cyAtIE00VlNTM0dQUF9OQl9BVV9QUkVGRVRDSAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb247Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBpVGFyZ2V0Q3RzIDwgMCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaVRhcmdldEN0cyA9IDA7IC8qKjwgU2FuaXR5IGNoZWNrICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQocEMtPnBDMSwgJmlUYXJnZXRDdHMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IFRSQU5TSVRJT04tcHJlZmV0Y2g6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcEp1bXBBdWRpb0F0IHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEpOyAvKio8IHJlYWQgQVUgd2hlcmUgd2UganVtcGVkICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8zKCJLIC4uLi4gcmVhZCAgOiBjdHMgID0gJS4wZiArICUuMGYgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzIC8gcEMtPnBDMS0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+aUFvZmZzZXQgLyBwQy0+cEMxLT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT51aUF1ZGlvRnJhbWVTaXplKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBUUkFOU0lUSU9OLXByZWZldGNoOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoYSkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIERlY29kZS9lbmNvZGUgdXAgdG8gdGhlIHdhbnRlZCBwb3NpdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoIHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzIDwgaUN1cnJlbnRDdHMgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUocEMtPnBDMSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IFRSQU5TSVRJT04tcHJlZmV0Y2g6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW01vbm9dIG9yIFtTdGVyZW8gaW50ZXJsZWF2ZWRdIDogYWxsIGlzIGluIG9uZSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyWzBdID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyWzFdID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVsxXSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaW1lIGluIG1zIGZyb20gZGF0YSBzaXplLCBiZWNhdXNlIGl0IGlzIFBDTTE2IHNhbXBsZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVRpbWVEZWx0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdIC8gc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIHBDLT5ld2MudWlOYkNoYW5uZWxzOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBQcmVwYXJlIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jT3V0QnVmZmVyLnBUYWJsZUJ1ZmZlclswXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwQy0+ZXdjLldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJMICoqKiogcHJlLWVuY29kZSIpOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qT01YIEF1ZGlvIGRlY29kZXIgdXNlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIE9NWCBBdWRpbyBkZWMgc2hlbGwgZG9lcyBpbnRlcm5hbCBidWZmZXJpbmcgYW5kIGhlbmNlIGRvZXMgbm90IHJldHVybgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgUENNIGJ1ZmZlciBmb3IgZXZlcnkgZGVjb2RlU3RlcCBjYWxsLioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFNvIFBDTSBidWZmZXIgc2l6ZXMgbWlnaHQgYmUgMC4gSW4gdGhpcyBjYXNlIGRvbm90IGNhbGwgZW5jb2RlIFN0ZXAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIDAgIT0gcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEVuY29kZSB0aGUgUENNIGF1ZGlvICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5TaGVsbEFQSS5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0ZXAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBBdWRpb0VuY0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEVuY0luQnVmZmVyLCAmcEVuY091dEJ1ZmZlcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoTTRXQVJfTk9fTU9SRV9BVSAhPSBlcnIpICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RlcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocEMtPnBDMSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk0gLi4uLiByZWFkICA6IGN0cyAgPSAlLjBmICsgJS4wZiBbIDB4JXggXSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzIC8gcEMtPnBDMS0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmlBb2Zmc2V0IC8gcEMtPnBDMS0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnVpQXVkaW9GcmFtZVNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBUUkFOU0lUSU9OLXByZWZldGNoOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKGIpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBBdWRpbyBpcyBub3cgT0sgZm9yIGRlY29kaW5nICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPkFzdGF0dXMgPSBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfREVDT0RFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogRGVjb2RlIHRoZSBmaXJzdCBpbnB1dCBhdWRpbyAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUocEMtPnBDMSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IFRSQU5TSVRJT046XAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZShDMSkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBEZWNvZGUgdGhlIHNlY29uZCBpbnB1dCBhdWRpbyAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUocEMtPnBDMik7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IFRSQU5TSVRJT046XAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZShDMikgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBDaGVjayBib3RoIGNsaXBzIGRlY29kZWQgdGhlIHNhbWUgYW1vdW50IG9mIFBDTSBzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5wQzEtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZQotICAgICAgICAgICAgICAgICAgICAhPSBwQy0+cEMyLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzIoCi0gICAgICAgICAgICAgICAgICAgICAgICAiRVJSIDogQXVkaW9UcmFuc2l0aW9uOiBib3RoIGNsaXBzIEFVIG11c3QgaGF2ZSB0aGUgc2FtZSBkZWNvZGVkXAotICAgICAgICAgICAgICAgICAgICAgICAgUENNIHNpemUhIHBjMSBzaXplPTB4JXgsIHBDMiBzaXplID0gMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMyLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUpOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotICAgICAgICAgICAgICAgICAgICAvKk9NWCBBdWRpbyBkZWNvZGVyIHVzZWQuCi0gICAgICAgICAgICAgICAgICAgICogT01YIEF1ZGlvIGRlYyBzaGVsbCBkb2VzIGludGVybmFsIGJ1ZmZlcmluZyBhbmQgaGVuY2UgZG9lcyBub3QgcmV0dXJuCi0gICAgICAgICAgICAgICAgICAgIGEgUENNIGJ1ZmZlciBmb3IgZXZlcnkgZGVjb2RlU3RlcCBjYWxsLioKLSAgICAgICAgICAgICAgICAgICAgKiBTbyBQQ00gYnVmZmVyIHNpemVzIG1pZ2h0IGJlIDAgb3IgZGlmZmVyZW50IGZvciBjbGlwMSBhbmQgY2xpcDIuCi0gICAgICAgICAgICAgICAgICAgICogU28gbm8gbmVlZCB0byByZXR1cm4gZXJyb3IgaW4gdGhpcyBjYXNlICovCi0KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzIoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86ICwgcGMxIEF1ZEJ1ZmYgc2l6ZT0weCV4LFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwQzIgQXVkQnVmZiBzaXplID0gMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMyLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUpOwotCi0jZWxzZQotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0FVRElPX0RFQ09ERURfUENNX1NJWkVfSVNTVUU7Ci0KLSNlbmRpZiAvLyBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQXBwbHkgdGhlIGF1ZGlvIGVmZmVjdCBvbiBjbGlwMSAqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+aUNsaXAxQWN0aXZlRWZmZWN0ID49IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFwcGx5QXVkaW9FZmZlY3QocEMsIDEsIChNNE9TQV9JbnQxNgotICAgICAgICAgICAgICAgICAgICAgICAgKilwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IFRSQU5TSVRJT046XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBcHBseUF1ZGlvRWZmZWN0KEMxKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBBcHBseSB0aGUgYXVkaW8gZWZmZWN0IG9uIGNsaXAyICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5pQ2xpcDJBY3RpdmVFZmZlY3QgPj0gMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXBwbHlBdWRpb0VmZmVjdChwQywgMiwgKE00T1NBX0ludDE2Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKXBDLT5wQzItPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMyLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogVFJBTlNJVElPTjpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEFwcGx5QXVkaW9FZmZlY3QoQzIpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEFwcGx5IHRoZSB0cmFuc2l0aW9uIGVmZmVjdCAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb1RyYW5zaXRpb24ocEMsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQxNiAqKXBDLT5wQzEtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQxNiAqKXBDLT5wQzItPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IFRSQU5TSVRJT046XAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvVHJhbnNpdGlvbiByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBbTW9ub10gb3IgW1N0ZXJlbyBpbnRlcmxlYXZlZF0gOiBhbGwgaXMgaW4gb25lIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMF0gPQotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzOwotICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdID0KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplOwotICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMV0gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzFdID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIFRpbWUgaW4gbXMgZnJvbSBkYXRhIHNpemUsIGJlY2F1c2UgaXQgaXMgUENNMTYgc2FtcGxlcyAqLwotICAgICAgICAgICAgICAgIGZyYW1lVGltZURlbHRhID0gcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gLyBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgICAgIC8gcEMtPmV3Yy51aU5iQ2hhbm5lbHM7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFByZXBhcmUgb3V0cHV0IGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyWzBdID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzczsKLSAgICAgICAgICAgICAgICBwRW5jT3V0QnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gPSAwOwotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIk4gKioqKiBibGVuZCBBVXMiKTsKLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotICAgICAgICAgICAgICAgIC8qT01YIEF1ZGlvIGRlY29kZXIgdXNlZC4KLSAgICAgICAgICAgICAgICAqIE9NWCBBdWRpbyBkZWMgc2hlbGwgZG9lcyBpbnRlcm5hbCBidWZmZXJpbmcgYW5kIGhlbmNlIGRvZXMgbm90IHJldHVybgotICAgICAgICAgICAgICAgIGEgUENNIGJ1ZmZlciBmb3IgZXZlcnkgZGVjb2RlU3RlcCBjYWxsLioKLSAgICAgICAgICAgICAgICAqIFNvIFBDTSBidWZmZXIgc2l6ZXMgbWlnaHQgYmUgMC4gSW4gdGhpcyBjYXNlIGRvbm90IGNhbGwgZW5jb2RlIFN0ZXAqLwotCi0gICAgICAgICAgICAgICAgaWYoIDAgIT0gcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gKQotICAgICAgICAgICAgICAgIHsKLQotI2VuZGlmCi0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogRW5jb2RlIHRoZSBQQ00gYXVkaW8gKi8KLQotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGVwKAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wQXVkaW9FbmNDdHh0LCAmcEVuY0luQnVmZmVyLCAmcEVuY091dEJ1ZmZlcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpICYmIChNNFdBUl9OT19NT1JFX0FVICE9IGVycikgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW8oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGVwIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICAgICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFNldCBBVSBjdHMgYW5kIHNpemUgKi8KLQotICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplID0gcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWwotICAgICAgICAgICAgICAgICAgICAwXTsgLyoqPCBHZXQgdGhlIHNpemUgb2YgZW5jb2RlZCBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5DVFMgKz0gZnJhbWVUaW1lRGVsdGE7Ci0KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzIoIk8gLS0tLSB3cml0ZSA6IGN0cyAgPSAlbGQgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTIC8gcEMtPmV3Yy5zY2FsZV9hdWRpbyksCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogV3JpdGUgdGhlIEFVICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUoCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LCBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwQy0+ZXdjLldyaXRlckF1ZGlvQVUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qMTEvMTIvMjAwOCBDUiAzMjgzIE1NUyB1c2UgY2FzZSBmb3IgVmlkZW9BcnRpc3QKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB3YXJuaW5nIE00V0FSX1dSSVRFUl9TVE9QX1JFUSBpcyByZXR1cm5lZCB3aGVuIHRoZSB0YXJnZXRlZCBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIHNpemUgaXMgcmVhY2hlZAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGVkaXRpbmcgaXMgdGhlbiBmaW5pc2hlZCx0aGUgd2FybmluZyBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORQotICAgICAgICAgICAgICAgICAgICAgICAgaXMgcmV0dXJuZWQqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00V0FSX1dSSVRFUl9TVE9QX1JFUSA9PSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IEZpbGUgd2FzIGN1dCB0byBhdm9pZCBvdmVyc2l6ZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBUUkFOU0lUSU9OOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBSZWFkIHRoZSBuZXh0IGF1ZGlvIGZyYW1lICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKHBDLT5wQzEpOwotCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8zKCJQIC4uLi4gcmVhZCAgOiBjdHMgID0gJS4wZiArICUuMGYgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+aUF1ZGlvRnJhbWVDdHMgLyBwQy0+cEMxLT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmlBb2Zmc2V0IC8gcEMtPnBDMS0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT51aUF1ZGlvRnJhbWVTaXplKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IFRSQU5TSVRJT046XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKEMxKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUiBzZWNvbmRhcnlFcnJvcjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFVwZGF0ZSBjdXJyZW50IHRpbWUgKHRvPXRjK1QpICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmRBVG8gPSAoIHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzICsgcEMtPnBDMS0+aUFvZmZzZXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBwQy0+cEMxLT5zY2FsZV9hdWRpbzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFJlYWQgdGhlIG5leHQgYXVkaW8gZnJhbWUgaW4gdGhlIHNlY29uZCBjbGlwICovCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlFcnJvciA9IE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKHBDLT5wQzIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygiUSAuLi4uIHJlYWQgIDogY3RzICA9ICUuMGYgKyAlLjBmIFsgMHgleCBdIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMyLT5pQXVkaW9GcmFtZUN0cyAvIHBDLT5wQzItPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzItPmlBb2Zmc2V0IC8gcEMtPnBDMi0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMi0+dWlBdWRpb0ZyYW1lU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNE9TQV9FUlJfSVNfRVJST1Ioc2Vjb25kYXJ5RXJyb3IpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBUUkFOU0lUSU9OOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoQzIpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlFcnJvcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoICggKCBNNFdBUl9OT19NT1JFX0FVID09IGVycikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoTTRXQVJfTk9fTU9SRV9BVSA9PSBzZWNvbmRhcnlFcnJvcikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKE00T1NBX0ZBTFNFID09IHBDLT5iU3VwcG9ydFNpbGVuY2UpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIElmIG91dHB1dCBpcyBvdGhlciB0aGFuIEFNUiBvciBBQUMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpLmUuIEVWUkMsd2UgY2FuJ3Qgd3JpdGUgc2lsZW5jZSBpbnRvIGl0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogU28gd2Ugc2ltcGx5IGVuZCBoZXJlLiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYlN0b3BBdWRpbyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKiBfX19fX19fX19fX18gKi8KLSAgICAgICAgICAgIC8qfCAgICAgICAgICAgIHwqLwotICAgICAgICAgICAgLyp8IEVSUk9SIENBU0UgfCovCi0gICAgICAgICAgICAvKnxfX19fX19fX19fX198Ki8KLQotICAgICAgICBkZWZhdWx0OgotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IGludmFsaWQgaW50ZXJuYWwgc3RhdGUgKDB4JXgpLCBcCi0gICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5URVJOQUxfU1RBVEUiLAotICAgICAgICAgICAgICAgIHBDLT5Bc3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5URVJOQUxfU1RBVEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiB3ZSBhcmUgZm9yY2VkIHRvIHN0b3AgYXVkaW8gKi8KLSAgICBpZiggTTRPU0FfVFJVRSA9PSBiU3RvcEF1ZGlvICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEF1ZGlvIGlzIGRvbmUgZm9yIHRoaXMgY2xpcCAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mQXVkaW8ocEMpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZkF1ZGlvIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2hlY2tBdWRpb01vZGUoKQotICogQGJyaWVmICAgIENoZWNrIHdoaWNoIGF1ZGlvIHByb2Nlc3MgbW9kZSB3ZSBtdXN0IHVzZSwgZGVwZW5kaW5nIG9uIHRoZSBvdXRwdXQgQ1RTLgotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENoZWNrQXVkaW9Nb2RlKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIGNvbnN0IE00T1NBX0ludDMyIFREID0gcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+Ci0gICAgICAgIHVpQ3VycmVudENsaXBdLnVpVHJhbnNpdGlvbkR1cmF0aW9uOyAvKio8IFRyYW5zaXRpb24gZHVyYXRpb24gKi8KLQotICAgIGNvbnN0IE00VlNTM0dQUF9FZGl0QXVkaW9TdGF0ZSBwcmV2aW91c0FzdGF0ZSA9IHBDLT5Bc3RhdGU7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIENsaXAxIGlzIG9uIGl0cyBiZWdpbiBjdXQsIG9yIGluIGl0cyBiZWdpbiBlZmZlY3Qgb3IgZW5kIGVmZmVjdCB6b25lICovCi0gICAgTTRWU1MzR1BQX2ludENoZWNrQXVkaW9FZmZlY3RzKHBDLCAxKTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaWYgd2UgYXJlIGluIHRoZSB0cmFuc2l0aW9uIHdpdGggbmV4dCBjbGlwICovCi0gICAgaWYoICggVEQgPiAwKSAmJiAoKE00T1NBX0ludDMyKShwQy0+ZXdjLmRBVG8gLSBwQy0+cEMxLT5pQW9mZnNldAotICAgICAgICAvIHBDLT5wQzEtPnNjYWxlX2F1ZGlvICsgMC41KSA+PSAocEMtPnBDMS0+aUVuZFRpbWUgLSBURCkpICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFdlIGFyZSBpbiBhIHRyYW5zaXRpb24gKi8KLSAgICAgICAgcEMtPkFzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfVFJBTlNJVElPTjsKLSAgICAgICAgcEMtPmJUcmFuc2l0aW9uRWZmZWN0ID0gTTRPU0FfVFJVRTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBEbyB3ZSBlbnRlciB0aGUgdHJhbnNpdGlvbiBzZWN0aW9uID8gKi8KLSAgICAgICAgaWYoIE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfVFJBTlNJVElPTiAhPSBwcmV2aW91c0FzdGF0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBPcGVuIHNlY29uZCBjbGlwIGZvciB0cmFuc2l0aW9uLCBpZiBub3QgeWV0IG9wZW5lZCAqLwotICAgICAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBDMiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludE9wZW5DbGlwKHBDLCAmcEMtPnBDMiwKLSAgICAgICAgICAgICAgICAgICAgJnBDLT5wQ2xpcExpc3RbcEMtPnVpQ3VycmVudENsaXAgKyAxXSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrQXVkaW9Nb2RlOiBNNFZTUzNHUFBfaW50T3BlbkNsaXAoKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBJbiBjYXNlIG9mIHNob3J0IHRyYW5zaXRpb24gYW5kIGJhZCBsdWNrICguLi4pLCB0aGVyZSBtYXkgYmUgbm8gdmlkZW8gQVUKLSAgICAgICAgICAgICAgICAqIGluIHRoZSB0cmFuc2l0aW9uLiBJbiB0aGF0IGNhc2UsIHRoZSBzZWNvbmQgY2xpcCBoYXMgbm90IGJlZW4gb3BlbmVkLgotICAgICAgICAgICAgICAgICogU28gd2UgbXVzdCB1cGRhdGUgdGhlIHZpZGVvIG9mZnNldCBoZXJlLiAqLwotICAgICAgICAgICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgICAgICAgICAgLyoqPCBBZGQgY3VycmVudCB2aWRlbyBvdXRwdXQgQ1RTIHRvIHRoZSBjbGlwIG9mZnNldCAqLwotICAgICAgICAgICAgICAgIHBDLT5wQzItPmlWb2Zmc2V0ICs9IChNNE9TQV9VSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBBZGQgY3VycmVudCBhdWRpbyBvdXRwdXQgQ1RTIHRvIHRoZSBjbGlwIG9mZnNldAotICAgICAgICAgICAgKiAodmlkZW8gb2Zmc2V0IGhhcyBhbHJlYWR5IGJlZW4gc2V0IHdoZW4gZG9pbmcgdGhlIHZpZGVvIHRyYW5zaXRpb24pICovCi0gICAgICAgICAgICBwQy0+cEMyLT5pQW9mZnNldCArPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKHBDLT5ld2MuZEFUbyAqIHBDLT5ld2Muc2NhbGVfYXVkaW8gKyAwLjUpOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogMjAwNS0wMy0yNDogQnVnRml4IGZvciBhdWRpby12aWRlbyBzeW5jaHJvOgotICAgICAgICAgICAgKiBUaGVyZSBtYXkgYmUgYSBwb3J0aW9uIG9mIHRoZSBkdXJhdGlvbiBvZiBhbiBhdWRpbyBBVSBvZiBkZXN5bmNocm8gYXQgZWFjaCBhc3NlbWJseS4KLSAgICAgICAgICAgICogSXQgbGVhZHMgdG8gYW4gYXVkaWJsZSBkZXN5bmNocm8gd2hlbiB0aGVyZSBhcmUgYSBsb3Qgb2YgY2xpcHMgYXNzZW1ibGVkLgotICAgICAgICAgICAgKiBUaGlzIGJ1ZyBmaXggYWxsb3dzIHRvIHJlc3luY2ggdGhlIGF1ZGlvIHRyYWNrIHdoZW4gdGhlIGRlbHRhIGlzIGhpZ2hlcgotICAgICAgICAgICAgKiB0aGFuIG9uZSBhdWRpbyBBVSBkdXJhdGlvbi4KLSAgICAgICAgICAgICogV2UgU3RlcCBvbmUgQVUgaW4gdGhlIHNlY29uZCBjbGlwIGFuZCB3ZSBjaGFuZ2UgdGhlIGF1ZGlvIG9mZnNldCBhY2NvcmRpbmdseS4gKi8KLSAgICAgICAgICAgIGlmKCAoIHBDLT5wQzItPmlBb2Zmc2V0Ci0gICAgICAgICAgICAgICAgLSAoTTRPU0FfSW50MzIpKHBDLT5wQzItPmlWb2Zmc2V0ICpwQy0+cEMyLT5zY2FsZV9hdWRpbyArIDAuNSkpCi0gICAgICAgICAgICAgICAgICAgID4gcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQWR2YW5jZSBvbmUgQU1SIGZyYW1lICovCi0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocEMtPnBDMik7Ci0KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygiWiAuLi4uIHJlYWQgIDogY3RzICA9ICUuMGYgKyAlLjBmIFsgMHgleCBdIiwKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMi0+aUF1ZGlvRnJhbWVDdHMgLyBwQy0+cEMyLT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMi0+aUFvZmZzZXQgLyBwQy0+cEMyLT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMi0+dWlBdWRpb0ZyYW1lU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrQXVkaW9Nb2RlOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBVcGRhdGUgYXVkaW8gb2Zmc2V0IGFjY29yZGluZ2x5Ki8KLSAgICAgICAgICAgICAgICBwQy0+cEMyLT5pQW9mZnNldCAtPSBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIGJlZ2luIGFuZCBlbmQgZWZmZWN0cyBmb3IgY2xpcDIgKi8KLSAgICAgICAgTTRWU1MzR1BQX2ludENoZWNrQXVkaW9FZmZlY3RzKHBDLCAyKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogV2UgYXJlIG5vdCBpbiBhIHRyYW5zaXRpb24gKi8KLSAgICAgICAgcEMtPmJUcmFuc2l0aW9uRWZmZWN0ID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgaWYgY3VycmVudCBtb2RlIGlzIFJlYWQvV3JpdGUgb3IgRGVjb2RlL0VuY29kZSAqLwotICAgICAgICBpZiggcEMtPmlDbGlwMUFjdGl2ZUVmZmVjdCA+PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPkFzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfREVDT0RFX0VOQ09ERTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5Bc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRBdWRpb1N0YXRlX1JFQURfV1JJVEU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIHdlIGNyZWF0ZS9kZXN0cm95IGFuIGVuY29kZXIgKi8KLSAgICBpZiggKCBNNFZTUzNHUFBfa0VkaXRBdWRpb1N0YXRlX1JFQURfV1JJVEUgPT0gcHJldmlvdXNBc3RhdGUpCi0gICAgICAgICYmIC8qKjwgcmVhZCBtb2RlICovCi0gICAgICAgIChNNFZTUzNHUFBfa0VkaXRBdWRpb1N0YXRlX1JFQURfV1JJVEUgIT0gcEMtPkFzdGF0ZSkgKSAvKio8IGVuY29kZSBtb2RlICovCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgdWlBdWRpb0JpdHJhdGU7Ci0KLSAgICAgICAgLyogQ29tcHV0ZSBtYXggYml0cmF0ZSBkZXBlbmRpbmcgb24gaW5wdXQgZmlsZXMgYml0cmF0ZXMgYW5kIHRyYW5zaXRpb25zICovCi0gICAgICAgIGlmKCBwQy0+QXN0YXRlID09IE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfVFJBTlNJVElPTiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIE1heCBvZiB0aGUgdHdvIGJsZW5kZWQgZmlsZXMgKi8KLSAgICAgICAgICAgIGlmKCBwQy0+cEMxLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpQXVkaW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgPiBwQy0+cEMyLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpQXVkaW9CaXRyYXRlICkKLSAgICAgICAgICAgICAgICB1aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgcEMtPnBDMS0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB1aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgcEMtPnBDMi0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFNhbWUgYXMgaW5wdXQgZmlsZSAqLwotICAgICAgICAgICAgdWlBdWRpb0JpdHJhdGUgPSBwQy0+cEMxLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpQXVkaW9CaXRyYXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ3JlYXRlIHRoZSBlbmNvZGVyICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDcmVhdGVBdWRpb0VuY29kZXIoJnBDLT5ld2MsICZwQy0+U2hlbGxBUEksCi0gICAgICAgICAgICB1aUF1ZGlvQml0cmF0ZSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDaGVja0F1ZGlvTW9kZTogTTRWU1MzR1BQX2ludFJlc2V0QXVkaW9FbmNvZGVyKCkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRDaGVja0F1ZGlvTW9kZSgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludENoZWNrQXVkaW9FZmZlY3RzKCkKLSAqIEBicmllZiAgICBDaGVjayB3aGljaCBhdWRpbyBlZmZlY3QgbXVzdCBiZSBhcHBsaWVkIGF0IHRoZSBjdXJyZW50IHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludENoZWNrQXVkaW9FZmZlY3RzKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwQywgTTRPU0FfVUludDggdWlDbGlwTnVtYmVyICkKLXsKLSAgICBNNE9TQV9VSW50OCB1aUNsaXBJbmRleDsKLSAgICBNNE9TQV9VSW50OCB1aUZ4SW5kZXg7Ci0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcDsKLSAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MgKnBGeDsKLSAgICBNNE9TQV9JbnQzMiBCQywgRUM7Ci0gICAgTTRPU0FfSW50OCAqcGlDbGlwQWN0aXZlRWZmZWN0OwotICAgIE00T1NBX0ludDMyIHQ7Ci0KLSAgICBpZiggMSA9PSB1aUNsaXBOdW1iZXIgKQotICAgIHsKLSAgICAgICAgdWlDbGlwSW5kZXggPSBwQy0+dWlDdXJyZW50Q2xpcDsKLSAgICAgICAgcENsaXAgPSBwQy0+cEMxOwotICAgICAgICBwaUNsaXBBY3RpdmVFZmZlY3QgPSAmKHBDLT5pQ2xpcDFBY3RpdmVFZmZlY3QpOwotICAgIH0KLSAgICBlbHNlIC8qKjwgKDIgPT0gdWlDbGlwTnVtYmVyKSAqLwotICAgIHsKLSAgICAgICAgdWlDbGlwSW5kZXggPSBwQy0+dWlDdXJyZW50Q2xpcCArIDE7Ci0gICAgICAgIHBDbGlwID0gcEMtPnBDMjsKLSAgICAgICAgcGlDbGlwQWN0aXZlRWZmZWN0ID0gJihwQy0+aUNsaXAyQWN0aXZlRWZmZWN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFNob3J0Y3V0cyBmb3IgY29kZSByZWFkYWJpbGl0eSAqLwotICAgIEJDID0gcENsaXAtPmlBY3R1YWxBdWRpb0JlZ2luQ3V0OwotICAgIEVDID0gcENsaXAtPmlFbmRUaW1lOwotCi0gICAgLyoqCi0gICAgQ2hhbmdlIHRoZSBhYnNvbHV0IHRpbWUgdG8gY2xpcCByZWxhdGVkIHRpbWUKLSAgICAgUkMgdCA9IChNNE9TQV9JbnQzMikocEMtPmV3Yy5kQVRvIC0gcENsaXAtPmlBb2Zmc2V0L3BDbGlwLT5zY2FsZV9hdWRpbyArIDAuNSk7Ci0gICAgPCByb3VuZGluZyAqLzsKLSAgICB0ID0gKE00T1NBX0ludDMyKShwQy0+ZXdjLmRBVG8vKi0gcENsaXAtPmlBb2Zmc2V0L3BDbGlwLT5zY2FsZV9hdWRpbyovCi0gICAgICAgICsgMC41KTsgLyoqPCByb3VuZGluZyAqLwotICAgIDsKLQotICAgIC8qKgotICAgICogRGVmYXVsdDogbm8gZWZmZWN0IGFjdGl2ZSAqLwotICAgICpwaUNsaXBBY3RpdmVFZmZlY3QgPSAtMTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgdGhlIHRocmVlIGVmZmVjdHMgKi8KLSAgICAvLyBSQyAgICBmb3IgKHVpRnhJbmRleD0wOyB1aUZ4SW5kZXg8cEMtPnBDbGlwTGlzdFt1aUNsaXBJbmRleF0ubmJFZmZlY3RzOyB1aUZ4SW5kZXgrKykKLSAgICBmb3IgKCB1aUZ4SW5kZXggPSAwOyB1aUZ4SW5kZXggPCBwQy0+bmJFZmZlY3RzOyB1aUZ4SW5kZXgrKyApCi0gICAgewotICAgICAgICAvKiogU2hvcnRjdXQsIHJldmVyc2Ugb3JkZXIgYmVjYXVzZSBvZiBwcmlvcml0eSBiZXR3ZWVuIGVmZmVjdHMKLSAgICAgICAgKCBFbmRFZmZlY3QgYWx3YXlzIGNsZWFuICkgKi8KLSAgICAgICAgcEZ4ID0gJihwQy0+cEVmZmVjdHNMaXN0W3BDLT5uYkVmZmVjdHMgLSAxIC0gdWlGeEluZGV4XSk7Ci0KLSAgICAgICAgaWYoIE00VlNTM0dQUF9rQXVkaW9FZmZlY3RUeXBlX05vbmUgIT0gcEZ4LT5BdWRpb0VmZmVjdFR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQ2hlY2sgaWYgdGhlcmUgaXMgYWN0dWFsbHkgYSB2aWRlbyBlZmZlY3QgKi8KLSAgICAgICAgICAgIGlmKCAoIHQgPj0gKE00T1NBX0ludDMyKSgvKkJDICsqL3BGeC0+dWlTdGFydFRpbWUpKQotICAgICAgICAgICAgICAgICYmIC8qKjwgQXJlIHdlIGFmdGVyIHRoZSBzdGFydCB0aW1lIG9mIHRoZSBlZmZlY3Q/ICovCi0gICAgICAgICAgICAgICAgKHQgPCAoTTRPU0FfSW50MzIpKC8qQkMgKyovcEZ4LT51aVN0YXJ0VGltZSArIHBGeC0+Ci0gICAgICAgICAgICAgICAgdWlEdXJhdGlvbikpICkgLyoqPCBBcmUgd2UgaW50byB0aGUgZWZmZWN0IGR1cmF0aW9uPyAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogU2V0IHRoZSBhY3RpdmUgZWZmZWN0ICovCi0gICAgICAgICAgICAgICAgKnBpQ2xpcEFjdGl2ZUVmZmVjdCA9IHBDLT5uYkVmZmVjdHMgLSAxIC0gdWlGeEluZGV4OwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBUaGUgZmlyc3QgZWZmZWN0IGhhcyB0aGUgaGlnaGVzdCBwcmlvcml0eSwgdGhlbiB0aGUgc2Vjb25kIG9uZSwKLSAgICAgICAgICAgICAgICAgIHRoZW4gdGhlIHRoaXJzIG9uZS4KLSAgICAgICAgICAgICAgICAqIEhlbmNlLCBhcyBzb29uIGFzIHdlIGZvdW5kIGFuIGFjdGl2ZSBlZmZlY3QsIHdlIGNhbiBnZXQgb3V0IG9mIHRoaXMgbG9vcCAqLwotICAgICAgICAgICAgICAgIHVpRnhJbmRleCA9IHBDLT5uYkVmZmVjdHM7IC8qKiBnZXQgb3V0IG9mIHRoZSBmb3IgbG9vcCAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEJ1Z2ZpeDogVGhlIGR1cmF0aW9uIG9mIHRoZSBlbmQgZWZmZWN0IGhhcyBiZWVuIHNldCBhY2NvcmRpbmcgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgYW5ub3VuY2VkIGNsaXAgZHVyYXRpb24uCi0gICAgICAgICAgICAqIElmIHRoZSBhbm5vdW5jZWQgZHVyYXRpb24gaXMgc21hbGxlciB0aGFuIHRoZSByZWFsIG9uZSwgdGhlIGVuZCBlZmZlY3QKLSAgICAgICAgICAgICAgICAgICAgICB3b24ndCBiZSBhcHBsaWVkIGF0Ci0gICAgICAgICAgICAqIHRoZSB2ZXJ5IGVuZCBvZiB0aGUgY2xpcC4gVG8gc29sdmUgdGhpcyBpc3N1ZSB3ZSBmb3JjZSB0aGUgZW5kIGVmZmVjdC4gKi8KLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXBwbHlBdWRpb0VmZmVjdCgpCi0gKiBAYnJpZWYgICAgQXBwbHkgYXVkaW8gZWZmZWN0IHRvIHBQQ01kYXRhCi0gKiBAcGFyYW0gICBwQyAgICAgICAgICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgdWlDbGlwMW9yQ2xpcDIgICAgKElOL09VVCkgMSBmb3IgZmlyc3QgY2xpcCwgMiBmb3Igc2Vjb25kIGNsaXAKLSAqIEBwYXJhbSAgICBwUENNZGF0YSAgICAoSU4vT1VUKSBJbnB1dCBhbmQgT3V0cHV0IFBDTSBhdWRpbyBkYXRhCi0gKiBAcGFyYW0gICAgdWlQQ01zaXplICAgIChJTikgICAgIFNpemUgb2YgcFBDTWRhdGEKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBcHBseUF1ZGlvRWZmZWN0KCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcEMsIE00T1NBX1VJbnQ4IHVpQ2xpcDFvckNsaXAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQxNiAqcFBDTWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVBDTXNpemUgKQotewotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXA7Ci0gICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5nczsKLSAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MgKnBGeDsKLSAgICBNNE9TQV9JbnQzMgotICAgICAgICBpMzJzYW1wbGU7IC8qKjwgd2Ugd2lsbCBjYXN0IGVhY2ggSW50MTYgc2FtcGxlIGludG8gdGhpcyBJbnQzMiB2YXJpYWJsZSAqLwotICAgIE00T1NBX0ludDMyIGlQb3M7Ci0gICAgTTRPU0FfSW50MzIgaUR1cjsKLQotICAgIE00T1NBX0RFQlVHX0lGMigoIDEgIT0gdWlDbGlwMW9yQ2xpcDIpICYmICgyICE9IHVpQ2xpcDFvckNsaXAyKSwKLSAgICAgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2ludEJlZ2luQXVkaW9FZmZlY3Q6IHVpQ2xpcDFvckNsaXAyIGludmFsaWQiKTsKLQotICAgIGlmKCAxID09IHVpQ2xpcDFvckNsaXAyICkKLSAgICB7Ci0gICAgICAgIHBDbGlwID0gcEMtPnBDMTsKLSAgICAgICAgcENsaXBTZXR0aW5ncyA9ICYocEMtPnBDbGlwTGlzdFtwQy0+Ci0gICAgICAgICAgICB1aUN1cnJlbnRDbGlwXSk7IC8qKjwgR2V0IGEgc2hvcnRjdXQgdG8gdGhlIGNsaXAgc2V0dGluZ3MgKi8KLSAgICAgICAgLy8gUkMgICAgICAgIHBGeCA9ICYocENsaXBTZXR0aW5ncy0+RWZmZWN0c1twQy0+aUNsaXAxQWN0aXZlRWZmZWN0XSk7LyoqPCBHZXQgYSBzaG9ydGN1dAotICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgYWN0aXZlIGVmZmVjdCAqLwotICAgICAgICBwRnggPSAmKHBDLT4KLSAgICAgICAgICAgIHBFZmZlY3RzTGlzdFtwQy0+Ci0gICAgICAgICAgICBpQ2xpcDFBY3RpdmVFZmZlY3RdKTsgLyoqPCBHZXQgYSBzaG9ydGN1dCB0byB0aGUgYWN0aXZlIGVmZmVjdCAqLwotICAgICAgICBNNE9TQV9ERUJVR19JRjIoKCBwQy0+aUNsaXAxQWN0aXZlRWZmZWN0IDwgMCkKLSAgICAgICAgICAgIHx8IChwQy0+aUNsaXAxQWN0aXZlRWZmZWN0ID4gMiksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXBwbHlBdWRpb0VmZmVjdDogaUNsaXAxQWN0aXZlRWZmZWN0IGludmFsaWQiKTsKLSAgICB9Ci0gICAgZWxzZSAvKio8IGlmICgyPT11aUNsaXAxb3JDbGlwMikgKi8KLSAgICB7Ci0gICAgICAgIHBDbGlwID0gcEMtPnBDMjsKLSAgICAgICAgcENsaXBTZXR0aW5ncyA9ICYocEMtPnBDbGlwTGlzdFtwQy0+dWlDdXJyZW50Q2xpcAotICAgICAgICAgICAgKyAxXSk7IC8qKjwgR2V0IGEgc2hvcnRjdXQgdG8gdGhlIGNsaXAgc2V0dGluZ3MgKi8KLSAgICAgICAgLy8gUkMgICAgICAgIHBGeCA9ICYocENsaXBTZXR0aW5ncy0+RWZmZWN0c1twQy0+aUNsaXAyQWN0aXZlRWZmZWN0XSk7LyoqPCBHZXQgYSBzaG9ydGN1dAotICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgYWN0aXZlIGVmZmVjdCAqLwotICAgICAgICBwRnggPSAmKHBDLT4KLSAgICAgICAgICAgIHBFZmZlY3RzTGlzdFtwQy0+Ci0gICAgICAgICAgICBpQ2xpcDJBY3RpdmVFZmZlY3RdKTsgLyoqPCBHZXQgYSBzaG9ydGN1dCB0byB0aGUgYWN0aXZlIGVmZmVjdCAqLwotICAgICAgICBNNE9TQV9ERUJVR19JRjIoKCBwQy0+aUNsaXAyQWN0aXZlRWZmZWN0IDwgMCkKLSAgICAgICAgICAgIHx8IChwQy0+aUNsaXAyQWN0aXZlRWZmZWN0ID4gMiksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXBwbHlBdWRpb0VmZmVjdDogaUNsaXAyQWN0aXZlRWZmZWN0IGludmFsaWQiKTsKLSAgICB9Ci0KLSAgICBpRHVyID0gKE00T1NBX0ludDMyKXBGeC0+dWlEdXJhdGlvbjsKLQotICAgIC8qKgotICAgICogQ29tcHV0ZSBob3cgZmFyIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZWZmZWN0IHdlIGFyZSwgaW4gY2xpcC1iYXNlIHRpbWUuCi0gICAgKiBJdCBpcyBkb25lIHdpdGggaW50ZWdlcnMgYmVjYXVzZSB0aGUgb2Zmc2V0IGFuZCBiZWdpbiBjdXQgaGF2ZSBiZWVuIHJvdW5kZWQgYWxyZWFkeS4gKi8KLSAgICBpUG9zID0KLSAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLmRBVG8gKyAwLjUgLSBwQ2xpcC0+aUFvZmZzZXQgLyBwQ2xpcC0+c2NhbGVfYXVkaW8pCi0gICAgICAgIC0gcENsaXAtPmlBY3R1YWxBdWRpb0JlZ2luQ3V0IC0gcEZ4LT51aVN0YXJ0VGltZTsKLQotICAgIC8qKgotICAgICogU2FuaXR5IGNoZWNrICovCi0gICAgaWYoIGlQb3MgPiBpRHVyICkKLSAgICB7Ci0gICAgICAgIGlQb3MgPSBpRHVyOwotICAgIH0KLSAgICBlbHNlIGlmKCBpUG9zIDwgMCApCi0gICAgewotICAgICAgICBpUG9zID0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEF0IHRoaXMgcG9pbnQsIGlQb3MgaXMgdGhlIGVmZmVjdCBwcm9ncmVzcywgaW4gYSAwIHRvIGlEdXIgYmFzZSAqLwotICAgIHN3aXRjaCggcEZ4LT5BdWRpb0VmZmVjdFR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvRWZmZWN0VHlwZV9GYWRlSW46Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBPcmlnaW5hbCBzYW1wbGVzIGFyZSBzaWduZWQgMTZiaXRzLgotICAgICAgICAgICAgKiBXZSBjb252ZXJ0IGl0IHRvIHNpZ25lZCAzMmJpdHMgYW5kIG11bHRpcGx5IGl0IGJ5IGlQb3MuCi0gICAgICAgICAgICAqIFNvIHdlIG11c3QgYXNzdXJlIHRoYXQgaVBvcyBpcyBub3QgaGlnaGVyIHRoYXQgMTZiaXRzIG1heC4KLSAgICAgICAgICAgICogaVBvcyBtYXggdmFsdWUgaXMgaUR1ciwgc28gd2UgdGVzdCBpRHVyLiAqLwotICAgICAgICAgICAgd2hpbGUoIGlEdXIgPiBQV1JfRlhQX0ZSQUNUX01BWCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaUR1ciA+Pj0KLSAgICAgICAgICAgICAgICAgICAgMjsgLyoqPCBkaXZpZGUgYnkgMiB3b3VsZCBiZSBtb3JlIGxvZ2ljYWwgKGluc3RlYWQgb2YgNCksCi0gICAgICAgICAgICAgICAgICAgICAgIGJ1dCB3ZSBoYXZlIGVub3VnaCBkeW5hbWljLi4pICovCi0gICAgICAgICAgICAgICAgaVBvcyA+Pj0gMjsgLyoqPCBpZGVtICovCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBGcm9tIGJ1ZmZlciBzaXplIChieXRlcykgdG8gbnVtYmVyIG9mIHNhbXBsZSAoaW50MTYpOiBkaXZpZGUgYnkgdHdvICovCi0gICAgICAgICAgICB1aVBDTXNpemUgPj49IDE7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBMb29wIG9uIHNhbXBsZXMgKi8KLSAgICAgICAgICAgIHdoaWxlKCB1aVBDTXNpemUtLSA+IDAgKSAvKio8IGRlY3JlbWVudGluZyB0byBvcHRpbWl6ZSAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkzMnNhbXBsZSA9ICpwUENNZGF0YTsKLSAgICAgICAgICAgICAgICBpMzJzYW1wbGUgKj0gaVBvczsKLSAgICAgICAgICAgICAgICBpMzJzYW1wbGUgLz0gaUR1cjsKLSAgICAgICAgICAgICAgICAqcFBDTWRhdGErKyA9IChNNE9TQV9JbnQxNilpMzJzYW1wbGU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tBdWRpb0VmZmVjdFR5cGVfRmFkZU91dDoKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIHN3aXRjaCBmcm9tIDAtPkR1ciB0byBEdXItPjAgaW4gb3JkZXIgdG8gZG8gZmFkZU9VVCBpbnN0ZWFkIG9mIGZhZGVJTiAqLwotICAgICAgICAgICAgaVBvcyA9IGlEdXIgLSBpUG9zOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogT3JpZ2luYWwgc2FtcGxlcyBhcmUgc2lnbmVkIDE2Yml0cy4KLSAgICAgICAgICAgICogV2UgY29udmVydCBpdCB0byBzaWduZWQgMzJiaXRzIGFuZCBtdWx0aXBseSBpdCBieSBpUG9zLgotICAgICAgICAgICAgKiBTbyB3ZSBtdXN0IGFzc3VyZSB0aGF0IGlQb3MgaXMgbm90IGhpZ2hlciB0aGF0IDE2Yml0cyBtYXguCi0gICAgICAgICAgICAqIGlQb3MgbWF4IHZhbHVlIGlzIGlEdXIsIHNvIHdlIHRlc3QgaUR1ci4gKi8KLSAgICAgICAgICAgIHdoaWxlKCBpRHVyID4gUFdSX0ZYUF9GUkFDVF9NQVggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlEdXIgPj49Ci0gICAgICAgICAgICAgICAgICAgIDI7IC8qKjwgZGl2aWRlIGJ5IDIgd291bGQgYmUgbW9yZSBsb2dpY2FsIChpbnN0ZWFkIG9mIDQpLAotICAgICAgICAgICAgICAgICAgICAgICBidXQgd2UgaGF2ZSBlbm91Z2ggZHluYW1pYy4uKSAqLwotICAgICAgICAgICAgICAgIGlQb3MgPj49IDI7IC8qKjwgaWRlbSAqLwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogRnJvbSBidWZmZXIgc2l6ZSAoYnl0ZXMpIHRvIG51bWJlciBvZiBzYW1wbGUgKGludDE2KTogZGl2aWRlIGJ5IHR3byAqLwotICAgICAgICAgICAgdWlQQ01zaXplID4+PSAxOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogTG9vcCBvbiBzYW1wbGVzLCBhcHBseSB0aGUgZmFkZSBmYWN0b3Igb24gZWFjaCAqLwotICAgICAgICAgICAgd2hpbGUoIHVpUENNc2l6ZS0tID4gMCApIC8qKjwgZGVjcmVtZW50aW5nIGNvdW50ZXIgdG8gb3B0aW1pemUgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpMzJzYW1wbGUgPSAqcFBDTWRhdGE7Ci0gICAgICAgICAgICAgICAgaTMyc2FtcGxlICo9IGlQb3M7Ci0gICAgICAgICAgICAgICAgaTMyc2FtcGxlIC89IGlEdXI7Ci0gICAgICAgICAgICAgICAgKnBQQ01kYXRhKysgPSAoTTRPU0FfSW50MTYpaTMyc2FtcGxlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBcHBseUF1ZGlvRWZmZWN0OiB1bmtub3duIGF1ZGlvIGVmZmVjdCB0eXBlICgweCV4KSxcCi0gICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9BVURJT19FRkZFQ1RfVFlQRSIsCi0gICAgICAgICAgICAgICAgcEZ4LT5BdWRpb0VmZmVjdFR5cGUpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9BVURJT19FRkZFQ1RfVFlQRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqICAgIFJldHVybiAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50QXBwbHlBdWRpb0VmZmVjdDogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvVHJhbnNpdGlvbigpCi0gKiBAYnJpZWYgICAgQXBwbHkgdHJhbnNpdGlvbiBlZmZlY3QgdG8gdHdvIFBDTSBidWZmZXIKLSAqIEBub3RlICAgIFRoZSByZXN1bHQgb2YgdGhlIHRyYW5zaXRpb24gaXMgcHV0IGluIHRoZSBmaXJzdCBidWZmZXIuCi0gKiAgICAgICAgICBJIGtub3cgaXQncyBub3QgYmVhdXRpZnVsLCBidXQgaXQgZml0cyBteSBjdXJyZW50IG5lZWRzLCBhbmQgaXQncyBlZmZpY2llbnQhCi0gKiAgICAgICAgICBTbyB3aHkgYm90aGVyIHdpdGggYSB0aGlyZCBvdXRwdXQgYnVmZmVyPwotICogQHBhcmFtICAgcEMgICAgICAgICAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICBwUENNZGF0YTEgICAgKElOL09VVCkgRmlyc3QgaW5wdXQgYW5kIE91dHB1dCBQQ00gYXVkaW8gZGF0YQotICogQHBhcmFtICAgIHBQQ01kYXRhMiAgICAoSU4pIFNlY29uZCBpbnB1dCBQQ00gYXVkaW8gZGF0YQotICogQHBhcmFtICAgIHVpUENNc2l6ZSAgICAoSU4pIFNpemUgb2YgYm90aCBQQ00gYnVmZmVycwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgICAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvVHJhbnNpdGlvbiggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcEMsIE00T1NBX0ludDE2ICpwUENNZGF0YTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MTYgKnBQQ01kYXRhMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlQQ01zaXplICkKLXsKLSAgICBNNE9TQV9JbnQzMiBpMzJzYW1wbGUxLAotICAgICAgICBpMzJzYW1wbGUyOyAvKio8IHdlIHdpbGwgY2FzdCBlYWNoIEludDE2IHNhbXBsZSBpbnRvIHRoaXMgSW50MzIgdmFyaWFibGUgKi8KLSAgICBNNE9TQV9JbnQzMiBpUG9zMSwgaVBvczI7Ci0gICAgTTRPU0FfSW50MzIgaUR1ciA9IChNNE9TQV9JbnQzMilwQy0+Ci0gICAgICAgIHBUcmFuc2l0aW9uTGlzdFtwQy0+dWlDdXJyZW50Q2xpcF0udWlUcmFuc2l0aW9uRHVyYXRpb247Ci0KLSAgICAvKioKLSAgICAqIENvbXB1dGUgaG93IGZhciBmcm9tIHRoZSBlbmQgY3V0IHdlIGFyZSwgaW4gY2xpcC1iYXNlIHRpbWUuCi0gICAgKiBJdCBpcyBkb25lIHdpdGggaW50ZWdlcnMgYmVjYXVzZSB0aGUgb2Zmc2V0IGFuZCBiZWdpbiBjdXQgaGF2ZSBiZWVuIHJvdW5kZWQgYWxyZWFkeS4gKi8KLSAgICBpUG9zMSA9IHBDLT5wQzEtPmlFbmRUaW1lIC0gKE00T1NBX0ludDMyKShwQy0+ZXdjLmRBVG8KLSAgICAgICAgKyAwLjUgLSBwQy0+cEMxLT5pQW9mZnNldCAvIHBDLT5wQzEtPnNjYWxlX2F1ZGlvKTsKLQotICAgIC8qKgotICAgICogU2FuaXR5IGNoZWNrICovCi0gICAgaWYoIGlQb3MxID4gaUR1ciApCi0gICAgewotICAgICAgICBpUG9zMSA9IGlEdXI7Ci0gICAgfQotICAgIGVsc2UgaWYoIGlQb3MxIDwgMCApCi0gICAgewotICAgICAgICBpUG9zMSA9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBQb3NpdGlvbiBvZiBzZWNvbmQgY2xpcCBpbiB0aGUgdHJhbnNpdGlvbiAqLwotICAgIGlQb3MyID0gaUR1ciAtIGlQb3MxOwotCi0gICAgLyoqCi0gICAgKiBBdCB0aGlzIHBvaW50LCBpUG9zMiBpcyB0aGUgdHJhbnNpdGlvbiBwcm9ncmVzcywgaW4gYSAwIHRvIGlEdXIgYmFzZS4KLSAgICAqIGlQb3MxIGlzIHRoZSB0cmFuc2l0aW9uIHByb2dyZXNzLCBpbiBhIGlEVXIgdG8gMCBiYXNlLiAqLwotICAgIHN3aXRjaCggcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+dWlDdXJyZW50Q2xpcF0uQXVkaW9UcmFuc2l0aW9uVHlwZSApCi0gICAgewotICAgICAgICBjYXNlIE00VlNTM0dQUF9rQXVkaW9UcmFuc2l0aW9uVHlwZV9Dcm9zc0ZhZGU6Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBPcmlnaW5hbCBzYW1wbGVzIGFyZSBzaWduZWQgMTZiaXRzLgotICAgICAgICAgICAgKiBXZSBjb252ZXJ0IGl0IHRvIHNpZ25lZCAzMmJpdHMgYW5kIG11bHRpcGx5IGl0IGJ5IGlQb3MuCi0gICAgICAgICAgICAqIFNvIHdlIG11c3QgYXNzdXJlIHRoYXQgaVBvcyBpcyBub3QgaGlnaGVyIHRoYXQgMTZiaXRzIG1heC4KLSAgICAgICAgICAgICogaVBvcyBtYXggdmFsdWUgaXMgaUR1ciwgc28gd2UgdGVzdCBpRHVyLiAqLwotICAgICAgICAgICAgd2hpbGUoIGlEdXIgPiBQV1JfRlhQX0ZSQUNUX01BWCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaUR1ciA+Pj0KLSAgICAgICAgICAgICAgICAgICAgMjsgLyoqPCBkaXZpZGUgYnkgMiB3b3VsZCBiZSBtb3JlIGxvZ2ljYWwgKGluc3RlYWQgb2YgNCksCi0gICAgICAgICAgICAgICAgICAgICAgIGJ1dCB3ZSBoYXZlIGVub3VnaCBkeW5hbWljLi4pICovCi0gICAgICAgICAgICAgICAgaVBvczEgPj49IDI7IC8qKjwgaWRlbSAqLwotICAgICAgICAgICAgICAgIGlQb3MyID4+PSAyOyAvKio8IGlkZW0gKi8KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEZyb20gYnVmZmVyIHNpemUgKGJ5dGVzKSB0byBudW1iZXIgb2Ygc2FtcGxlIChpbnQxNik6IGRpdmlkZSBieSB0d28gKi8KLSAgICAgICAgICAgIHVpUENNc2l6ZSA+Pj0gMTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIExvb3Agb24gc2FtcGxlcywgYXBwbHkgdGhlIGZhZGUgZmFjdG9yIG9uIGVhY2ggKi8KLSAgICAgICAgICAgIHdoaWxlKCB1aVBDTXNpemUtLSA+IDAgKSAvKio8IGRlY3JlbWVudGluZyBjb3VudGVyIHRvIG9wdGltaXplICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaTMyc2FtcGxlMSA9ICpwUENNZGF0YTE7IC8qKjwgR2V0IGNsaXAxIHNhbXBsZSAqLwotICAgICAgICAgICAgICAgIGkzMnNhbXBsZTEgKj0gaVBvczE7ICAgICAvKio8IG11bHRpcGx5IGJ5IGZhZGUgbnVtZXJhdG9yICovCi0gICAgICAgICAgICAgICAgaTMyc2FtcGxlMSAvPSBpRHVyOyAgICAgIC8qKjwgZGl2aWRlIGJ5IGZhZGUgZGVub21pbmF0b3IgKi8KLQotICAgICAgICAgICAgICAgIGkzMnNhbXBsZTIgPSAqcFBDTWRhdGEyOyAvKio8IEdldCBjbGlwMiBzYW1wbGUgKi8KLSAgICAgICAgICAgICAgICBpMzJzYW1wbGUyICo9IGlQb3MyOyAgICAgLyoqPCBtdWx0aXBseSBieSBmYWRlIG51bWVyYXRvciAqLwotICAgICAgICAgICAgICAgIGkzMnNhbXBsZTIgLz0gaUR1cjsgICAgICAvKio8IGRpdmlkZSBieSBmYWRlIGRlbm9taW5hdG9yICovCi0KLSAgICAgICAgICAgICAgICAqcFBDTWRhdGExKysgPSAoTTRPU0FfSW50MTYpKGkzMnNhbXBsZTEKLSAgICAgICAgICAgICAgICAgICAgKyBpMzJzYW1wbGUyKTsgLyoqPCBtaXggdGhlIHR3byBzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgcFBDTWRhdGEyKys7IC8qKjwgZG9uJ3QgZm9yZ2V0IHRvIGluY3JlbWVudCB0aGUgc2Vjb25kIGJ1ZmZlciAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvVHJhbnNpdGlvblR5cGVfTm9uZToKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBUaGlzIGlzIGEgc3R1cGlkLW5vbiBvcHRpbWl6ZWQgdmVyc2lvbiBvZiB0aGUgTm9uZSB0cmFuc2l0aW9uLi4uCi0gICAgICAgICAgICAqIFdlIGNvcHkgdGhlIFBDTSBmcmFtZXMgKi8KLSAgICAgICAgICAgIGlmKCBpUG9zMSA8IChpRHVyID4+IDEpICkgLyoqPCBzZWNvbmQgaGFsZiBvZiB0cmFuc2l0aW9uICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBDb3B5IHRoZSBpbnB1dCBQQ00gdG8gdGhlIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwUENNZGF0YTEsCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopcFBDTWRhdGEyLCB1aVBDTXNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIHRoZSBvdXRwdXQgbXVzdCBiZSBwdXQgaW4gdGhlIGZpcnN0IGJ1ZmZlci4KLSAgICAgICAgICAgICogRm9yIHRoZSBmaXJzdCBoYWxmIG9mIHRoZSBub24tdHJhbnNpdGlvbiBpdCdzIGFscmVhZHkgdGhlIGNhc2UhCi0gICAgICAgICAgICAqIFNvIHdlIGhhdmUgbm90aGluZyB0byBkbyBoZXJlLi4uCi0gICAgICAgICAgICAqLwotCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb1RyYW5zaXRpb246IHVua25vd24gdHJhbnNpdGlvbiB0eXBlICgweCV4KSxcCi0gICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9BVURJT19UUkFOU0lUSU9OX1RZUEUiLAotICAgICAgICAgICAgICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ3VycmVudENsaXBdLkF1ZGlvVHJhbnNpdGlvblR5cGUpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9BVURJT19UUkFOU0lUSU9OX1RZUEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiAgICBSZXR1cm4gKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEF1ZGlvVHJhbnNpdGlvbjogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENyZWF0ZUF1ZGlvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgUmVzZXQgdGhlIGF1ZGlvIGVuY29kZXIgKENyZWF0ZSBpdCBpZiBuZWVkZWQpCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENyZWF0ZUF1ZGlvRW5jb2RlciggTTRWU1MzR1BQX0VuY29kZVdyaXRlQ29udGV4dCAqcENfZXdjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQ19TaGVsbEFQSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aUF1ZGlvQml0cmF0ZSApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIC8qKgotICAgICogSWYgYW4gZW5jb2RlciBhbHJlYWR5IGV4aXN0LCB3ZSBkZXN0cm95IGl0ICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcENfZXdjLT5wQXVkaW9FbmNDdHh0ICkKLSAgICB7Ci0gICAgICAgIGVyciA9IHBDX1NoZWxsQVBJLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlKAotICAgICAgICAgICAgcENfZXdjLT5wQXVkaW9FbmNDdHh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFJlc2V0QXVkaW9FbmNvZGVyOiBwQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IHBDX1NoZWxsQVBJLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsZWFuVXAoCi0gICAgICAgICAgICBwQ19ld2MtPnBBdWRpb0VuY0N0eHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50UmVzZXRBdWRpb0VuY29kZXI6XAotICAgICAgICAgICAgICAgIHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xlYW5VcCByZXR1cm5zIDB4JXgiLCAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4sIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgcENfZXdjLT5wQXVkaW9FbmNDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENyZWF0ZXMgYSBuZXcgZW5jb2RlciAgKi8KLSAgICBzd2l0Y2goIHBDX2V3Yy0+QXVkaW9TdHJlYW1UeXBlICkKLSAgICB7Ci0gICAgICAgICAgICAvL0VWUkMKLSAgICAgICAgICAgIC8vICAgICAgICBjYXNlIE00U1lTX2tFVlJDOgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX3NldEN1cnJlbnRBdWRpb0VuY29kZXIoJnBDLT5TaGVsbEFQSSwKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb1N0cmVhbVR5cGUpOwotICAgICAgICAgICAgLy8gICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID0gTTRFTkNPREVSX2tFVlJDOwotICAgICAgICAgICAgLy8gICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rODAwMEh6OwotICAgICAgICAgICAgLy8gICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gPSBNNEVOQ09ERVJfa01vbm87Ci0gICAgICAgICAgICAvLyAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuQml0cmF0ZSA9IE00VlNTM0dQUF9FVlJDX0RFRkFVTFRfQklUUkFURTsKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFNZU19rQU1SOgotCi0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcihwQ19TaGVsbEFQSSwKLSAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvU3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0FNUk5COwotICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazgwMDBIejsKLSAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuQ2hhbm5lbE51bSA9IE00RU5DT0RFUl9rTW9ubzsKLSAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuQml0cmF0ZSA9IE00VlNTM0dQUF9BTVJfREVGQVVMVF9CSVRSQVRFOwotICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BbXJTSUQgPSBNNEVOQ09ERVJfa0Ftck5vU0lEOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFNZU19rQUFDOgotCi0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcihwQ19TaGVsbEFQSSwKLSAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvU3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0FBQzsKLQotICAgICAgICAgICAgc3dpdGNoKCBwQ19ld2MtPnVpU2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgODAwMDoKLSAgICAgICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazgwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIDE2MDAwOgotICAgICAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMTYwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIDIyMDUwOgotICAgICAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMjIwNTBIejsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIDI0MDAwOgotICAgICAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMjQwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIDMyMDAwOgotICAgICAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMzIwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIDQ0MTAwOgotICAgICAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rNDQxMDBIejsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIDQ4MDAwOgotICAgICAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rNDgwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlQXVkaW9FbmNvZGVyOiBpbnZhbGlkIGlucHV0IEFBQyBzYW1wbGluZyBmcmVxdWVuY3lcCi0gICAgICAgICAgICAgICAgICAgICAgICAoJWQgSHopLCByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9BVURJT19ERUNPREVSX0lOSVRfRkFJTEVEIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDX2V3Yy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0FVRElPX0RFQ09ERVJfSU5JVF9GQUlMRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gPSAocENfZXdjLT51aU5iQ2hhbm5lbHMgPT0gMSkKLSAgICAgICAgICAgICAgICA/IE00RU5DT0RFUl9rTW9ubyA6IE00RU5DT0RFUl9rU3RlcmVvOwotICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5SZWd1bGF0aW9uID0KLSAgICAgICAgICAgICAgICBNNEVOQ09ERVJfa0FhY1JlZ3VsTm9uZTsgLy9NNEVOQ09ERVJfa0FhY0JpdFJlc2Vydm9pcgotICAgICAgICAgICAgLyogdW51c2VkICovCi0gICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFhY1BhcmFtLmJJUyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5iTVMgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuU3BlY2lmUGFyYW0uQWFjUGFyYW0uYlBOUyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5iVE5TID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAvKiBUT0RPIGNoYW5nZSBpbnRvIGhpZ2hzcGVlZCBhc2FwICovCi0gICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFhY1BhcmFtLmJIaWdoU3BlZWQgPQotICAgICAgICAgICAgICAgIE00T1NBX0ZBTFNFOwotCi0gICAgICAgICAgICAvKiBRdWFudGlmeSB2YWx1ZSAoY2VpbCBvbmUpICovCi0gICAgICAgICAgICBpZiggdWlBdWRpb0JpdHJhdGUgPD0gMTYwMDAgKQotICAgICAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuQml0cmF0ZSA9IDE2MDAwOwotCi0gICAgICAgICAgICBlbHNlIGlmKCB1aUF1ZGlvQml0cmF0ZSA8PSAyNDAwMCApCi0gICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5CaXRyYXRlID0gMjQwMDA7Ci0KLSAgICAgICAgICAgIGVsc2UgaWYoIHVpQXVkaW9CaXRyYXRlIDw9IDMyMDAwICkKLSAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkJpdHJhdGUgPSAzMjAwMDsKLQotICAgICAgICAgICAgZWxzZSBpZiggdWlBdWRpb0JpdHJhdGUgPD0gNDgwMDAgKQotICAgICAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuQml0cmF0ZSA9IDQ4MDAwOwotCi0gICAgICAgICAgICBlbHNlIGlmKCB1aUF1ZGlvQml0cmF0ZSA8PSA2NDAwMCApCi0gICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5CaXRyYXRlID0gNjQwMDA7Ci0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkJpdHJhdGUgPSA5NjAwMDsKLQotICAgICAgICAgICAgLyogU3BlY2lhbCByZXF1aXJlbWVudCBvZiBvdXIgZW5jb2RlciAqLwotICAgICAgICAgICAgaWYoICggcENfZXdjLT51aU5iQ2hhbm5lbHMgPT0gMikKLSAgICAgICAgICAgICAgICAmJiAocENfZXdjLT5BdWRpb0VuY1BhcmFtcy5CaXRyYXRlIDwgMzIwMDApICkKLSAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkJpdHJhdGUgPSAzMjAwMDsKLQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50UmVzZXRBdWRpb0VuY29kZXI6IFVuZGVmaW5lZCBvdXRwdXQgYXVkaW8gZm9ybWF0ICglZCksXAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfQVVESU9fRk9STUFUIiwKLSAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvU3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0FVRElPX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICAvKiBJbml0aWFsaXNlIHRoZSBhdWRpbyBlbmNvZGVyICovCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgIk00VlNTM0dQUF9pbnRSZXNldEF1ZGlvRW5jb2RlcjpcCi0gICAgICAgIHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0SW5pdCBjYWxsZWQgd2l0aCB1c2VyZGF0YSAweCV4IiwKLSAgICAgICAgcENfU2hlbGxBUEktPnBDdXJyZW50QXVkaW9FbmNvZGVyVXNlckRhdGEpOwotICAgIGVyciA9IHBDX1NoZWxsQVBJLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEluaXQoJnBDX2V3Yy0+cEF1ZGlvRW5jQ3R4dCwKLSAgICAgICAgcENfU2hlbGxBUEktPnBDdXJyZW50QXVkaW9FbmNvZGVyVXNlckRhdGEpOwotCi0jZWxzZQotCi0gICAgZXJyID0gcENfU2hlbGxBUEktPnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0SW5pdCgmcENfZXdjLT5wQXVkaW9FbmNDdHh0LAotICAgICAgICBNNE9TQV9OVUxMIC8qIG5vIEhXIGVuY29kZXIgKi8pOwotCi0jZW5kaWYKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50UmVzZXRBdWRpb0VuY29kZXI6IHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0SW5pdCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKiBPcGVuIHRoZSBhdWRpbyBlbmNvZGVyICovCi0gICAgZXJyID0gcENfU2hlbGxBUEktPnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0T3BlbihwQ19ld2MtPnBBdWRpb0VuY0N0eHQsCi0gICAgICAgICZwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLCAmcENfZXdjLT5wQXVkaW9FbmNEU0ksCi0gICAgICAgIE00T1NBX05VTEwgLyogbm8gZ3JhYmJpbmcgKi8pOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRSZXNldEF1ZGlvRW5jb2RlcjogcEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RPcGVuIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludFJlc2V0QXVkaW9FbmNvZGVyOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfRWRpdFZpZGVvLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9FZGl0VmlkZW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjE5ZjQxMi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9FZGl0VmlkZW8uYworKysgL2Rldi9udWxsCkBAIC0xLDM5NTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00VlNTM0dQUF9FZGl0VmlkZW8uYwotICogQGJyaWVmICAgIFZpZGVvIFN0dWRpbyBTZXJ2aWNlIDNHUFAgZWRpdCBBUEkgaW1wbGVtZW50YXRpb24uCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0jdW5kZWYgTTRPU0FfVFJBQ0VfTEVWRUwKLSNkZWZpbmUgTTRPU0FfVFJBQ0VfTEVWRUwgMQotCi0vKioqKioqKioqKioqKioqKi8KLS8qKiogSW5jbHVkZXMgKioqLwotLyoqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0vKioKLSAqIE91ciBoZWFkZXIgKi8KLSNpbmNsdWRlICJNNFZTUzNHUFBfQVBJLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsVHlwZXMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxGdW5jdGlvbnMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxDb25maWcuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfRXJyb3JDb2Rlcy5oIgotCi0vLyBTdGFnZUZyaWdodCBlbmNvZGVycyByZXF1aXJlICUxNiByZXNvbHV0aW9uCi0jaW5jbHVkZSAiTTRFTkNPREVSX2NvbW1vbi5oIgotLyoqCi0gKiBPU0FMIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIgLyoqPCBPU0FMIG1lbW9yeSBtYW5hZ2VtZW50ICovCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIgIC8qKjwgT1NBTCBkZWJ1ZyBtYW5hZ2VtZW50ICovCi0KLS8qKgotICogY29tcG9uZW50IGluY2x1ZGVzICovCi0jaW5jbHVkZSAiTTRWRkxfdHJhbnNpdGlvbi5oIiAvKio8IHZpZGVvIGVmZmVjdHMgKi8KLQotLypmb3IgdHJhbnNpdGlvbiBiZWhhdmlvdXIqLwotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlICJNNEFJUl9BUEkuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfRXh0ZW5kZWRfQVBJLmgiCi0vKiogRGV0ZXJtaW5lIGFic29sdXRlIHZhbHVlIG9mIGEuICovCi0jZGVmaW5lIE00eFZTU19BQlMoYSkgKCAoIChhKSA8ICgwKSApID8gKC0oYSkpIDogKGEpICkKLSNkZWZpbmUgWV9QTEFORV9CT1JERVJfVkFMVUUgICAgMHgwMAotI2RlZmluZSBVX1BMQU5FX0JPUkRFUl9WQUxVRSAgICAweDgwCi0jZGVmaW5lIFZfUExBTkVfQk9SREVSX1ZBTFVFICAgIDB4ODAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFN0YXRpYyBsb2NhbCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDaGVja1ZpZGVvTW9kZSgKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9Wb2lkCi1NNFZTUzNHUFBfaW50Q2hlY2tWaWRlb0VmZmVjdHMoIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCB1aUNsaXBOdW1iZXIgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9FZmZlY3QoCi0gICAgICAgICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCwgTTRPU0FfQm9vbCBiU2tpcEZyYW1pbmdFZmZlY3QpOwotCi1zdGF0aWMgTTRPU0FfRVJSCi1NNFZTUzNHUFBfaW50VmlkZW9UcmFuc2l0aW9uKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQgKTsKLQotc3RhdGljIE00T1NBX1ZvaWQKLU00VlNTM0dQUF9pbnRVcGRhdGVUaW1lSW5mbyggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQgKnBBVSApOwotc3RhdGljIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludFNldEgyNjNUaW1lQ291bnRlciggTTRPU0FfTWVtQWRkcjggcEF1RGF0YUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggdWlDdHMgKTsKLXN0YXRpYyBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRTZXRNUEVHNEdvdiggTTRPU0FfTWVtQWRkcjggcEF1RGF0YUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlDdHNTZWMgKTsKLXN0YXRpYyBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRHZXRNUEVHNEdvdiggTTRPU0FfTWVtQWRkcjggcEF1RGF0YUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgKnBDdHNTZWMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVdpZHRoLCBNNE9TQV9VSW50MzIgdWlIZWlnaHQgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAoCi0gICAgICAgICAgTTRPU0FfVm9pZCogcEZpbGVJbiwgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRQdHIsCi0gICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbWFnZVBsYW5lcywKLSAgICAgICAgICBNNE9TQV9VSW50MzIgd2lkdGgsTTRPU0FfVUludDMyIGhlaWdodCk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBcHBseVJlbmRlcmluZ01vZGUoCi0gICAgICAgICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgIE00eFZTU19NZWRpYVJlbmRlcmluZyByZW5kZXJpbmdNb2RlLAotICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwSW5wbGFuZSwKLSAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcE91dHBsYW5lKTsKLQotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50U2V0WXV2NDIwUGxhbmVGcm9tQVJHQjg4OCAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCogcENsaXBDdHh0KTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFJlbmRlckZyYW1lV2l0aEVmZmVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCogcENsaXBDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfTWVkaWFUaW1lIHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQm9vbCBiSXNDbGlwMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUmVzaXplUGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lTm9SZXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Um90YXRlVmlkZW8oTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgcm90YXRpb25EZWdyZWUpOwotCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRTZXRZVVY0MjBQbGFuZShNNFZJRklfSW1hZ2VQbGFuZSogcGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHdpZHRoLCBNNE9TQV9VSW50MzIgaGVpZ2h0KTsKLQotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXBwbHlWaWRlb092ZXJsYXkgKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvKCkKLSAqIEBicmllZiAgICBPbmUgc3RlcCBvZiB2aWRlbyBwcm9jZXNzaW5nCi0gKiBAcGFyYW0gICBwQyAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfSW50MzIgaUN0cywgaU5leHRDdHM7Ci0gICAgTTRFTkNPREVSX0ZyYW1lTW9kZSBGcmFtZU1vZGU7Ci0gICAgTTRPU0FfQm9vbCBiU2tpcEZyYW1lOwotICAgIE00T1NBX1VJbnQxNiBvZmZzZXQ7Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBpZiB3ZSByZWFjaGVkIGVuZCBjdXQuIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcKLSAgICAgKiB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgKi8KLSAgICBpZiAoICgoTTRPU0FfSW50MzIpKHBDLT5ld2MuZElucHV0VmlkQ3RzKSAtIHBDLT5wQzEtPmlWb2Zmc2V0Ci0gICAgICAgICsgcEMtPmlJbk91dFRpbWVPZmZzZXQpID49IHBDLT5wQzEtPmlFbmRUaW1lICkKLSAgICB7Ci0gICAgICAgIC8qIFJlLWFkanVzdCB2aWRlbyB0byBwcmVjaXNlIGN1dCB0aW1lICovCi0gICAgICAgIHBDLT5pSW5PdXRUaW1lT2Zmc2V0ID0gKChNNE9TQV9JbnQzMikocEMtPmV3Yy5kSW5wdXRWaWRDdHMpKQotICAgICAgICAgICAgLSBwQy0+cEMxLT5pVm9mZnNldCArIHBDLT5pSW5PdXRUaW1lT2Zmc2V0IC0gcEMtPnBDMS0+aUVuZFRpbWU7Ci0gICAgICAgIGlmICggcEMtPmlJbk91dFRpbWVPZmZzZXQgPCAwICkgewotICAgICAgICAgICAgcEMtPmlJbk91dFRpbWVPZmZzZXQgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogVmlkZW8gaXMgZG9uZSBmb3IgdGhpcyBjbGlwICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZWaWRlbyhwQyk7Ci0KLSAgICAgICAgLyogUkM6IHRvIGtub3cgd2hlbiBhIGZpbGUgaGFzIGJlZW4gcHJvY2Vzc2VkICovCi0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVyciAmJiBlcnIgIT0gTTRWU1MzR1BQX1dBUl9TV0lUQ0hfQ0xJUCkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mVmlkZW8gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKiBEb24ndCBjaGFuZ2UgdGhlIHN0YXRlcyBpZiB3ZSBhcmUgaW4gZGVjb2RlVXBUbygpICovCi0gICAgaWYgKCAoTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERV9VUF9UTyAhPSBwQy0+cEMxLT5Wc3RhdHVzKQotICAgICAgICAmJiAoKCBwQy0+cEMyID09IE00T1NBX05VTEwpCi0gICAgICAgIHx8IChNNFZTUzNHUFBfa0NsaXBTdGF0dXNfREVDT0RFX1VQX1RPICE9IHBDLT5wQzItPlZzdGF0dXMpKSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayBWaWRlbyBNb2RlLCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgb3V0cHV0IENUUyAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2hlY2tWaWRlb01vZGUoCi0gICAgICAgICAgICBwQyk7IC8qKjwgVGhpcyBmdW5jdGlvbiBjaGFuZ2UgdGhlIHBDLT5Wc3RhdGUgdmFyaWFibGUhICovCi0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IE00VlNTM0dQUF9pbnRDaGVja1ZpZGVvTW9kZSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgc3dpdGNoKCBwQy0+VnN0YXRlICkKLSAgICB7Ci0gICAgICAgIC8qIF9fX19fX19fX19fX19fX19fICovCi0gICAgICAgIC8qfCAgICAgICAgICAgICAgICAgfCovCi0gICAgICAgIC8qfCBSRUFEX1dSSVRFIE1PREUgfCovCi0gICAgICAgIC8qfF9fX19fX19fX19fX19fX19ffCovCi0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1JFQURfV1JJVEU6Ci0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9BRlRFUl9DVVQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvIFJFQURfV1JJVEUiKTsKLQotICAgICAgICAgICAgICAgIGJTa2lwRnJhbWUgPSBNNE9TQV9GQUxTRTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogSWYgd2Ugd2VyZSBkZWNvZGluZyB0aGUgY2xpcCwgd2UgbXVzdCBqdW1wIHRvIGJlIHN1cmUKLSAgICAgICAgICAgICAgICAqIHRvIGdldCB0byB0aGUgZ29vZCBwb3NpdGlvbi4gKi8KLSAgICAgICAgICAgICAgICBpZiggTTRWU1MzR1BQX2tDbGlwU3RhdHVzX1JFQUQgIT0gcEMtPnBDMS0+VnN0YXR1cyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBKdW1wIHRvIHRhcmdldCB2aWRlbyB0aW1lICh0YyA9IHRvLVQpICovCi0gICAgICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgICAgICBpQ3RzID0gKE00T1NBX0ludDMyKShwQy0+ZXdjLmRJbnB1dFZpZEN0cykgLSBwQy0+cEMxLT5pVm9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPnBDMS0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RKdW1wKAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wQzEtPnBWaWRlb1N0cmVhbSwgJmlDdHMpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBRF9XUklURTogbV9wUmVhZGVyLT5tX3BGY3RKdW1wKFYxKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQzEtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wQzEtPnBWaWRlb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwQy0+cEMxLT5WaWRlb0FVKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikgJiYgKE00V0FSX05PX01PUkVfQVUgIT0gZXJyKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBRF9XUklURTogbV9wUmVhZGVyLT5tX3BGY3RHZXROZXh0QXUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygiQSAuLi4uIHJlYWQgIDogY3RzICA9ICUuMGYgKyAlbGQgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+VmlkZW9BVS5tX0NUUywgcEMtPnBDMS0+aVZvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5WaWRlb0FVLm1fc2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBmcmFtZSBoYXMgYmVlbiBhbHJlYWR5IHdyaXR0ZW4gaW4gQkVHSU4gQ1VUIHN0ZXAgLT4gc2tpcCBpdCAqLwotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPnBDMS0+VmlkZW9BVS5tX0NUUyA9PSBpQ3RzCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBwQy0+cEMxLT5pVmlkZW9SZW5kZXJDdHMgPj0gaUN0cyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJTa2lwRnJhbWUgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogVGhpcyBmcmFtZSBoYXMgYmVlbiBhbHJlYWR5IHdyaXR0ZW4gaW4gQkVHSU4gQ1VUIHN0ZXAgLT4gc2tpcCBpdCAqLwotICAgICAgICAgICAgICAgIGlmKCAoIHBDLT5Wc3RhdGUgPT0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9BRlRFUl9DVVQpCi0gICAgICAgICAgICAgICAgICAgICYmIChwQy0+cEMxLT5WaWRlb0FVLm1fQ1RTCi0gICAgICAgICAgICAgICAgICAgICsgcEMtPnBDMS0+aVZvZmZzZXQgPD0gcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLkNUUykgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYlNraXBGcmFtZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBSZW1lbWJlciB0aGUgY2xpcCByZWFkaW5nIHN0YXRlICovCi0gICAgICAgICAgICAgICAgcEMtPnBDMS0+VnN0YXR1cyA9IE00VlNTM0dQUF9rQ2xpcFN0YXR1c19SRUFEOwotICAgICAgICAgICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgICAgICAgICAgLy8gUm91bmRpbmcgaXMgdG8gY29tcGVuc2F0ZSByZWFkZXIgaW1wcmVjaXNpb24gKG1fQ1RTIGlzIGFjdHVhbGx5IGFuIGludGVnZXIpCi0gICAgICAgICAgICAgICAgaUN0cyA9ICgoTTRPU0FfSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHMpIC0gcEMtPnBDMS0+aVZvZmZzZXQgLSAxOwotICAgICAgICAgICAgICAgIGlOZXh0Q3RzID0gaUN0cyArICgoTTRPU0FfSW50MzIpcEMtPmRPdXRwdXRGcmFtZUR1cmF0aW9uKSArIDE7Ci0gICAgICAgICAgICAgICAgLyogQXZvaWQgdG8gd3JpdGUgYSBsYXN0IGZyYW1lIG9mIGR1cmF0aW9uIDAgKi8KLSAgICAgICAgICAgICAgICBpZiggaU5leHRDdHMgPiBwQy0+cEMxLT5pRW5kVGltZSApCi0gICAgICAgICAgICAgICAgICAgIGlOZXh0Q3RzID0gcEMtPnBDMS0+aUVuZFRpbWU7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIElmIHRoZSBBVSBpcyBnb29kIHRvIGJlIHdyaXR0ZW4sIHdyaXRlIGl0LCBlbHNlIGp1c3Qgc2tpcCBpdCAqLwotICAgICAgICAgICAgICAgIGlmKCAoIE00T1NBX0ZBTFNFID09IGJTa2lwRnJhbWUpCi0gICAgICAgICAgICAgICAgICAgICYmICgoIHBDLT5wQzEtPlZpZGVvQVUubV9DVFMgPj0gaUN0cykKLSAgICAgICAgICAgICAgICAgICAgJiYgKHBDLT5wQzEtPlZpZGVvQVUubV9DVFMgPCBpTmV4dEN0cykKLSAgICAgICAgICAgICAgICAgICAgJiYgKHBDLT5wQzEtPlZpZGVvQVUubV9zaXplID4gMCkpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEdldCB0aGUgb3V0cHV0IEFVIHRvIHdyaXRlIGludG8gKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX1dSSVRFUl9WSURFT19TVFJFQU1fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAmcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IFJFQURfV1JJVEU6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoVmlkZW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogQ29weSB0aGUgaW5wdXQgQVUgdG8gdGhlIG91dHB1dCBBVSAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLldyaXRlclZpZGVvQVUuYXR0cmlidXRlID0gcEMtPnBDMS0+VmlkZW9BVS5tX2F0dHJpYnV0ZTsKLSAgICAgICAgICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLkNUUyA9IChNNE9TQV9UaW1lKXBDLT5wQzEtPlZpZGVvQVUubV9DVFMgKwotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1RpbWUpcEMtPnBDMS0+aVZvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuZElucHV0VmlkQ3RzICs9IHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgLyogZm9yIGguMjY0IHN0cmVhbSBkbyBub3QgcmVhZCB0aGUgMXN0IDQgYnl0ZXMgYXMgdGhleSBhcmUgaGVhZGVyCi0gICAgICAgICAgICAgICAgICAgICBpbmRpY2F0b3JzICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+cEMxLT5wVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2YyApCi0gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSA0OwotCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyVmlkZW9BVS5zaXplID0gcEMtPnBDMS0+VmlkZW9BVS5tX3NpemUgLSBvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+ZXdjLldyaXRlclZpZGVvQVUuc2l6ZSA+IHBDLT5ld2MudWlWaWRlb01heEF1U2l6ZSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogUkVBRF9XUklURTogQVUgc2l6ZSBncmVhdGVyIHRoYW5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heEF1U2l6ZSAoJWQ+JWQpISByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9JTlBVVF9WSURFT19BVV9UT09fTEFSR0UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyVmlkZW9BVS5zaXplLCBwQy0+ZXdjLnVpVmlkZW9NYXhBdVNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5QVVRfVklERU9fQVVfVE9PX0xBUkdFOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikocEMtPnBDMS0+VmlkZW9BVS5tX2RhdGFBZGRyZXNzICsgb2Zmc2V0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChwQy0+ZXdjLldyaXRlclZpZGVvQVUuc2l6ZSkpOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFVwZGF0ZSB0aW1lIGluZm8gZm9yIHRoZSBDb3VudGVyIFRpbWUgU3lzdGVtIHRvIGJlIGVxdWFsIHRvIHRoZSBiaXQKLSAgICAgICAgICAgICAgICAgICAgLXN0cmVhbSB0aW1lKi8KLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludFVwZGF0ZVRpbWVJbmZvKHBDLCAmcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVKTsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzIoIkIgLS0tLSB3cml0ZSA6IGN0cyAgPSAlbHUgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLkNUUywgcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLnNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFdyaXRlIHRoZSBBVSAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9XUklURVJfVklERU9fU1RSRUFNX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgJnBDLT5ld2MuV3JpdGVyVmlkZW9BVSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlIHdhcm5pbmcgTTRXQVJfV1JJVEVSX1NUT1BfUkVRIGlzIHJldHVybmVkIHdoZW4gdGhlIHRhcmdldGVkIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgc2l6ZSBpcyByZWFjaGVkCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgZWRpdGluZyBpcyB0aGVuIGZpbmlzaGVkLCB0aGUgd2FybmluZyBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORQotICAgICAgICAgICAgICAgICAgICAgICAgaXMgcmV0dXJuZWQqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00V0FSX1dSSVRFUl9TVE9QX1JFUSA9PSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IEZpbGUgd2FzIGN1dCB0byBhdm9pZCBvdmVyc2l6ZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBSRUFEX1dSSVRFOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKFZpZGVvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogUmVhZCBuZXh0IEFVIGZvciBuZXh0IHN0ZXAgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPnBDMS0+U2hlbGxBUEkubV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUoCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBDMS0+cFZpZGVvU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgJnBDLT5wQzEtPlZpZGVvQVUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSAmJiAoTTRXQVJfTk9fTU9SRV9BVSAhPSBlcnIpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBSRUFEX1dSSVRFOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8zKCJDIC4uLi4gcmVhZCAgOiBjdHMgID0gJS4wZiArICVsZCBbIDB4JXggXSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5WaWRlb0FVLm1fQ1RTLCBwQy0+cEMxLT5pVm9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPlZpZGVvQVUubV9zaXplKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogRGVjaWRlIHdldGhlciB0byByZWFkIG9yIHRvIGluY3JlbWVudCB0aW1lIGluY3JlbWVudCAqLwotICAgICAgICAgICAgICAgICAgICBpZiggKCBwQy0+cEMxLT5WaWRlb0FVLm1fc2l6ZSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHBDLT5wQzEtPlZpZGVvQVUubV9DVFMgPj0gaU5leHRDdHMpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLypJbmNyZW1lbnQgdGltZSBieSB0aGUgZW5jb2RpbmcgcGVyaW9kIChOT19NT1JFX0FVIG9yIHJlYWRlciBpbiBhZHZhbmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuZElucHV0VmlkQ3RzICs9IHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogU3dpdGNoIChmcm9tIEFGVEVSX0NVVCkgdG8gbm9ybWFsIG1vZGUgYmVjYXVzZSB0aW1lIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBubyBtb3JlIGZyb3plbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPlZzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfUkVBRF9XUklURTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluIG90aGVyIGNhc2VzIChyZWFkZXIgbGF0ZSksIGp1c3QgbGV0IHRoZSByZWFkZXIgY2F0Y2ggdXAKLSAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmRWVG8gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQzEtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBDMS0+cFZpZGVvU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQy0+cEMxLT5WaWRlb0FVKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpICYmIChNNFdBUl9OT19NT1JFX0FVICE9IGVycikgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IFJFQURfV1JJVEU6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygiRCAuLi4uIHJlYWQgIDogY3RzICA9ICUuMGYgKyAlbGQgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPlZpZGVvQVUubV9DVFMsIHBDLT5wQzEtPmlWb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPlZpZGVvQVUubV9zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKiBfX19fX19fX19fX19fX19fX19fXyAqLwotICAgICAgICAgICAgLyp8ICAgICAgICAgICAgICAgICAgICB8Ki8KLSAgICAgICAgICAgIC8qfCBERUNPREVfRU5DT0RFIE1PREUgfCovCi0gICAgICAgICAgICAvKnwgICBCRUdJTl9DVVQgTU9ERSAgIHwqLwotICAgICAgICAgICAgLyp8X19fX19fX19fX19fX19fX19fX198Ki8KLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfREVDT0RFX0VOQ09ERToKLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0JFR0lOX0NVVDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvIERFQ09ERV9FTkNPREUgLyBCRUdJTl9DVVQiKTsKLQotICAgICAgICAgICAgaWYgKChwQy0+cEMxLT5wU2V0dGluZ3MtPkZpbGVUeXBlID09Ci0gICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpICYmCi0gICAgICAgICAgICAgICAgKE00T1NBX0ZBTFNFID09Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuYlNldEltYWdlRGF0YSkpIHsKLQotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRTZXRZdXY0MjBQbGFuZUZyb21BUkdCODg4KHBDLCBwQy0+cEMxKTsKLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKSB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBERUNPREVfRU5DT0RFOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRTZXRZdXY0MjBQbGFuZUZyb21BUkdCODg4IGVycj0leCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogRGVjb2RlIHRoZSB2aWRlbyB1cCB0byB0aGUgdGFyZ2V0IHRpbWUKLSAgICAgICAgICAgICAgICAod2lsbCBqdW1wIHRvIHRoZSBwcmV2aW91cyBSQVAgaWYgbmVlZGVkICkgKi8KLSAgICAgICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlVmlkZW9VcFRvQ3RzKHBDLT5wQzEsIChNNE9TQV9JbnQzMilwQy0+ZXdjLmRJbnB1dFZpZEN0cyk7Ci0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBERUNPREVfRU5DT0RFOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnREZWNvZGVWaWRlb1VwVG9DdHMgcmV0dXJucyBlcnI9MHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIElmIHRoZSBkZWNvZGluZyBpcyBub3QgY29tcGxldGVkLCBkbyBvbmUgbW9yZSBzdGVwIHdpdGggdGltZSBmcm96ZW4gKi8KLSAgICAgICAgICAgICAgICBpZiggTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERV9VUF9UTyA9PSBwQy0+cEMxLT5Wc3RhdHVzICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogUmVzZXQgdGhlIHZpZGVvIHByZS1wcm9jZXNzaW5nIGVycm9yIGJlZm9yZSBjYWxsaW5nIHRoZSBlbmNvZGVyICovCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IE00Tk9fRVJST1I7Ci0KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiRSArKysrIGVuY29kZSBBVSIpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBFbmNvZGUgdGhlIGZyYW1lKHJlbmRlcmluZyxmaWx0ZXJpbmcgYW5kIHdyaXRpbmcgd2lsbCBiZSBkb25lCi0gICAgICAgICAgICAgICAgIGluIGVuY29kZXIgY2FsbGJhY2tzKSovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5Wc3RhdGUgPT0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9CRUdJTl9DVVQgKQotICAgICAgICAgICAgICAgICAgICBGcmFtZU1vZGUgPSBNNEVOQ09ERVJfa0lGcmFtZTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIEZyYW1lTW9kZSA9IE00RU5DT0RFUl9rTm9ybWFsRnJhbWU7Ci0KLSAgICAgICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEVuY29kZShwQy0+ZXdjLnBFbmNDb250ZXh0LCBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgIHBDLT5ld2MuZElucHV0VmlkQ3RzLCBGcmFtZU1vZGUpOwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQ2hlY2sgaWYgd2UgaGFkIGEgVlBQIGVycm9yLi4uICovCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gcEMtPmV3Yy5WcHBFcnJvciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogREVDT0RFX0VOQ09ERTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEVuY29kZSwgcmV0dXJuaW5nIFZwcEVycj0weCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IpOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNFdBUl9WSURFT1JFTkRFUkVSX05PX05FV19GUkFNRSAhPSBwQy0+ZXdjLlZwcEVycm9yICkKLSAgICAgICAgICAgICAgICAgICAgewotI2VuZGlmIC8vTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwQy0+ZXdjLlZwcEVycm9yOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgICAgICAgICAgICAgIH0KLQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL000VlNTX1NVUFBPUlRfT01YX0NPREVDUwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCBNNE5PX0VSUk9SICE9IGVyciApIC8qKjwgLi4ub3IgYW4gZW5jb2RlciBlcnJvciAqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoICgoTTRPU0FfVUludDMyKU00RVJSX0FMTE9DKSA9PSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IERFQ09ERV9FTkNPREU6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0VOQ09ERVJfQUNDRVNfVU5JVF9FUlJPUiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfRU5DT0RFUl9BQ0NFU19VTklUX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIHRoZSB3YXJuaW5nIE00V0FSX1dSSVRFUl9TVE9QX1JFUSBpcyByZXR1cm5lZCB3aGVuIHRoZSB0YXJnZXRlZCBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgZmlsZSBzaXplIGlzIHJlYWNoZWQKLSAgICAgICAgICAgICAgICAgICAgVGhlIGVkaXRpbmcgaXMgdGhlbiBmaW5pc2hlZCwgdGhlIHdhcm5pbmcgTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkUKLSAgICAgICAgICAgICAgICAgICAgaXMgcmV0dXJuZWQqLwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBNNFdBUl9XUklURVJfU1RPUF9SRVEgPT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBGaWxlIHdhcyBjdXQgdG8gYXZvaWQgb3ZlcnNpemUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogREVDT0RFX0VOQ09ERTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RFbmNvZGUgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogSW5jcmVtZW50IHRpbWUgYnkgdGhlIGVuY29kaW5nIHBlcmlvZCAoZm9yIGJlZ2luIGN1dCwgZG8gbm90IGluY3JlbWVudCB0byBub3QKLSAgICAgICAgICAgICAgICBsb29zZSBQLWZyYW1lcykgKi8KLSAgICAgICAgICAgICAgICBpZiggTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9ERUNPREVfRU5DT0RFID09IHBDLT5Wc3RhdGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5kSW5wdXRWaWRDdHMgKz0gcEMtPmRPdXRwdXRGcmFtZUR1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKiBfX19fX19fX19fX19fX19fXyAqLwotICAgICAgICAgICAgLyp8ICAgICAgICAgICAgICAgICB8Ki8KLSAgICAgICAgICAgIC8qfCBUUkFOU0lUSU9OIE1PREUgfCovCi0gICAgICAgICAgICAvKnxfX19fX19fX19fX19fX19fX3wqLwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9UUkFOU0lUSU9OOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbyBUUkFOU0lUSU9OIik7Ci0KLSAgICAgICAgICAgICAgICAvKiBEb24ndCBkZWNvZGUgbW9yZSB0aGFuIG5lZWRlZCAqLwotICAgICAgICAgICAgICAgIGlmKCAhKCggTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERV9VUF9UTyAhPSBwQy0+cEMxLT5Wc3RhdHVzKQotICAgICAgICAgICAgICAgICAgICAmJiAoTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERV9VUF9UTyA9PSBwQy0+cEMyLT5Wc3RhdHVzKSkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogRGVjb2RlIHRoZSBjbGlwMSB2aWRlbyB1cCB0byB0aGUgdGFyZ2V0IHRpbWUKLSAgICAgICAgICAgICAgICAgICAgKHdpbGwganVtcCB0byB0aGUgcHJldmlvdXMgUkFQIGlmIG5lZWRlZCAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoKHBDLT5wQzEtPnBTZXR0aW5ncy0+RmlsZVR5cGUgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4KSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ZBTFNFID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5iU2V0SW1hZ2VEYXRhKSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50U2V0WXV2NDIwUGxhbmVGcm9tQVJHQjg4OChwQywgcEMtPnBDMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogVFJBTlNJVElPTjpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRTZXRZdXY0MjBQbGFuZUZyb21BUkdCODg4IGVycj0leCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcERlY29kZVZpZGVvVXBUb0N0cyhwQy0+cEMxLAotICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMilwQy0+ZXdjLmRJbnB1dFZpZEN0cyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogVFJBTlNJVElPTjpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludERlY29kZVZpZGVvVXBUb0N0cyhDMSkgcmV0dXJucyBlcnI9MHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKiBJZiB0aGUgZGVjb2RpbmcgaXMgbm90IGNvbXBsZXRlZCwgZG8gb25lIG1vcmUgc3RlcCB3aXRoIHRpbWUgZnJvemVuICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfREVDT0RFX1VQX1RPID09IHBDLT5wQzEtPlZzdGF0dXMgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIERvbid0IGRlY29kZSBtb3JlIHRoYW4gbmVlZGVkICovCi0gICAgICAgICAgICAgICAgaWYoICEoKCBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfREVDT0RFX1VQX1RPICE9IHBDLT5wQzItPlZzdGF0dXMpCi0gICAgICAgICAgICAgICAgICAgICYmIChNNFZTUzNHUFBfa0NsaXBTdGF0dXNfREVDT0RFX1VQX1RPID09IHBDLT5wQzEtPlZzdGF0dXMpKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBEZWNvZGUgdGhlIGNsaXAyIHZpZGVvIHVwIHRvIHRoZSB0YXJnZXQgdGltZQotICAgICAgICAgICAgICAgICAgICAgICAgKHdpbGwganVtcCB0byB0aGUgcHJldmlvdXMgUkFQIGlmIG5lZWRlZCkgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKChwQy0+cEMyLT5wU2V0dGluZ3MtPkZpbGVUeXBlID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9GQUxTRSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMyLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLmJTZXRJbWFnZURhdGEpKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRTZXRZdXY0MjBQbGFuZUZyb21BUkdCODg4KHBDLCBwQy0+cEMyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBUUkFOU0lUSU9OOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludFNldFl1djQyMFBsYW5lRnJvbUFSR0I4ODggZXJyPSV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBEZWNvZGVWaWRlb1VwVG9DdHMocEMtPnBDMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHMpOwotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IFRSQU5TSVRJT046XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnREZWNvZGVWaWRlb1VwVG9DdHMoQzIpIHJldHVybnMgZXJyPTB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogSWYgdGhlIGRlY29kaW5nIGlzIG5vdCBjb21wbGV0ZWQsIGRvIG9uZSBtb3JlIHN0ZXAgd2l0aCB0aW1lIGZyb3plbiAqLwotICAgICAgICAgICAgICAgICAgICBpZiggTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERV9VUF9UTyA9PSBwQy0+cEMyLT5Wc3RhdHVzICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFJlc2V0IHRoZSB2aWRlbyBwcmUtcHJvY2Vzc2luZyBlcnJvciBiZWZvcmUgY2FsbGluZyB0aGUgZW5jb2RlciAqLwotICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBNNE5PX0VSUk9SOwotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIkYgKioqKiBibGVuZCBBVXMiKTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogRW5jb2RlIHRoZSBmcmFtZSAocmVuZGVyaW5nLCBmaWx0ZXJpbmcgYW5kIHdyaXRpbmcgd2lsbCBiZSBkb25lCi0gICAgICAgICAgICAgICAgaW4gZW5jb2RlciBjYWxsYmFja3MgKi8KLSAgICAgICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEVuY29kZShwQy0+ZXdjLnBFbmNDb250ZXh0LCBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmRJbnB1dFZpZEN0cywgTTRFTkNPREVSX2tOb3JtYWxGcmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIElmIGVuY29kZSByZXR1cm5zIGEgcHJvY2VzcyBmcmFtZSBlcnJvciwgaXQgaXMgbGlrZWx5IHRvIGJlIGEgVlBQIGVycm9yICovCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gcEMtPmV3Yy5WcHBFcnJvciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogVFJBTlNJVElPTjpcCi0gICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEVuY29kZSwgcmV0dXJuaW5nIFZwcEVycj0weCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IpOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNFdBUl9WSURFT1JFTkRFUkVSX05PX05FV19GUkFNRSAhPSBwQy0+ZXdjLlZwcEVycm9yICkKLSAgICAgICAgICAgICAgICAgICAgewotCi0jZW5kaWYgLy9NNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBDLT5ld2MuVnBwRXJyb3I7Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0jZW5kaWYgLy9NNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKSAvKio8IC4uLm9yIGFuIGVuY29kZXIgZXJyb3IgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCAoKE00T1NBX1VJbnQzMilNNEVSUl9BTExPQykgPT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBUUkFOU0lUSU9OOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9FTkNPREVSX0FDQ0VTX1VOSVRfRVJST1IiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0VOQ09ERVJfQUNDRVNfVU5JVF9FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIHRoZSB3YXJuaW5nIE00V0FSX1dSSVRFUl9TVE9QX1JFUSBpcyByZXR1cm5lZCB3aGVuIHRoZSB0YXJnZXRlZCBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgIGZpbGUgc2l6ZSBpcyByZWFjaGVkCi0gICAgICAgICAgICAgICAgICAgIFRoZSBlZGl0aW5nIGlzIHRoZW4gZmluaXNoZWQsIHRoZSB3YXJuaW5nIE00VlNTM0dQUF9XQVJfRURJVElOR19ET05FIGlzCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCovCi0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIE00V0FSX1dSSVRFUl9TVE9QX1JFUSA9PSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IEZpbGUgd2FzIGN1dCB0byBhdm9pZCBvdmVyc2l6ZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9XQVJfRURJVElOR19ET05FOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBUUkFOU0lUSU9OOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEVuY29kZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBJbmNyZW1lbnQgdGltZSBieSB0aGUgZW5jb2RpbmcgcGVyaW9kICovCi0gICAgICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLmRJbnB1dFZpZEN0cyArPSBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLyogX19fX19fX19fX19fICovCi0gICAgICAgICAgICAvKnwgICAgICAgICAgICB8Ki8KLSAgICAgICAgICAgIC8qfCBFUlJPUiBDQVNFIHwqLwotICAgICAgICAgICAgLyp8X19fX19fX19fX19ffCovCi0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogaW52YWxpZCBpbnRlcm5hbCBzdGF0ZSAoMHgleCksXAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0lOVEVSTkFMX1NUQVRFIiwKLSAgICAgICAgICAgICAgICBwQy0+VnN0YXRlKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOVEVSTkFMX1NUQVRFOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDaGVja1ZpZGVvTW9kZSgpCi0gKiBAYnJpZWYgICAgQ2hlY2sgd2hpY2ggdmlkZW8gcHJvY2VzcyBtb2RlIHdlIG11c3QgdXNlLCBkZXBlbmRpbmcgb24gdGhlIG91dHB1dCBDVFMuCi0gKiBAcGFyYW0gICBwQyAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2hlY2tWaWRlb01vZGUoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgY29uc3QgTTRPU0FfSW50MzIgIHQgPSAoTTRPU0FfSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHM7Ci0gICAgLyoqPCBUcmFuc2l0aW9uIGR1cmF0aW9uICovCi0gICAgY29uc3QgTTRPU0FfSW50MzIgVEQgPSBwQy0+cFRyYW5zaXRpb25MaXN0W3BDLT51aUN1cnJlbnRDbGlwXS51aVRyYW5zaXRpb25EdXJhdGlvbjsKLQotICAgIE00T1NBX0ludDMyIGlUbXA7Ci0KLSAgICBjb25zdCBNNFZTUzNHUFBfRWRpdFZpZGVvU3RhdGUgcHJldmlvdXNWc3RhdGUgPSBwQy0+VnN0YXRlOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiBDbGlwMSBpcyBvbiBpdHMgYmVnaW4gY3V0LCBvciBpbiBhbiBlZmZlY3Qgem9uZSAqLwotICAgIE00VlNTM0dQUF9pbnRDaGVja1ZpZGVvRWZmZWN0cyhwQywgMSk7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIHdlIGFyZSBpbiB0aGUgdHJhbnNpdGlvbiB3aXRoIG5leHQgY2xpcCAqLwotICAgIGlmKCAoIFREID4gMCkgJiYgKCggdCAtIHBDLT5wQzEtPmlWb2Zmc2V0KSA+PSAocEMtPnBDMS0+aUVuZFRpbWUgLSBURCkpICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFdlIGFyZSBpbiBhIHRyYW5zaXRpb24gKi8KLSAgICAgICAgcEMtPlZzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfVFJBTlNJVElPTjsKLSAgICAgICAgcEMtPmJUcmFuc2l0aW9uRWZmZWN0ID0gTTRPU0FfVFJVRTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBPcGVuIHNlY29uZCBjbGlwIGZvciB0cmFuc2l0aW9uLCBpZiBub3QgeWV0IG9wZW5lZCAqLwotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cEMyICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPnBDMS0+YkdldFl1dkRhdGFGcm9tRGVjb2RlciA9IE00T1NBX1RSVUU7Ci0KLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRPcGVuQ2xpcChwQywgJnBDLT5wQzIsCi0gICAgICAgICAgICAgICAgJnBDLT5wQ2xpcExpc3RbcEMtPnVpQ3VycmVudENsaXAgKyAxXSk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2hlY2tWaWRlb01vZGU6IE00VlNTM0dQUF9lZGl0T3BlbkNsaXAgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEFkZCBjdXJyZW50IHZpZGVvIG91dHB1dCBDVFMgdG8gdGhlIGNsaXAgb2Zmc2V0Ci0gICAgICAgICAgICAqIChhdWRpbyBvdXRwdXQgQ1RTIGlzIG5vdCB5ZXQgYXQgdGhlIHRyYW5zaXRpb24sIHNvIGF1ZGlvCi0gICAgICAgICAgICAqICBvZmZzZXQgY2FuJ3QgYmUgdXBkYXRlZCB5ZXQpLiAqLwotICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgIHBDLT5wQzItPmlWb2Zmc2V0ICs9IChNNE9TQV9VSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHM7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAyMDA1LTAzLTI0OiBCdWdGaXggZm9yIGF1ZGlvLXZpZGVvIHN5bmNocm86Ci0gICAgICAgICAgICAqIFVwZGF0ZSB0cmFuc2l0aW9uIGR1cmF0aW9uIGR1ZSB0byB0aGUgYWN0dWFsIHZpZGVvIHRyYW5zaXRpb24gYmVnaW5uaW5nIHRpbWUuCi0gICAgICAgICAgICAqIEl0IHdpbGwgYXZvaWQgZGVzeW5jaHJvbml6YXRpb24gd2hlbiBkb2luZyB0aGUgYXVkaW8gdHJhbnNpdGlvbi4gKi8KLSAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgIGlUbXAgPSAoKE00T1NBX0ludDMyKXBDLT5ld2MuZElucHV0VmlkQ3RzKVwKLSAgICAgICAgICAgICAtIChwQy0+cEMxLT5pRW5kVGltZSAtIFREICsgcEMtPnBDMS0+aVZvZmZzZXQpOwotICAgICAgICAgICAgaWYgKGlUbXAgPCAoTTRPU0FfSW50MzIpcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+dWlDdXJyZW50Q2xpcF0udWlUcmFuc2l0aW9uRHVyYXRpb24pCi0gICAgICAgICAgICAvKio8IFRlc3QgaW4gY2FzZSBvZiBhIHZlcnkgc2hvcnQgdHJhbnNpdGlvbiAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPgotICAgICAgICAgICAgICAgICAgICB1aUN1cnJlbnRDbGlwXS51aVRyYW5zaXRpb25EdXJhdGlvbiAtPSBpVG1wOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBEb24ndCBmb3JnZXQgdG8gYWxzbyBjb3JyZWN0IHRoZSB0b3RhbCBkdXJhdGlvbiB1c2VkIGZvciB0aGUgcHJvZ3Jlc3MgYmFyCi0gICAgICAgICAgICAgICAgKiAoaXQgd2FzIGNvbXB1dGVkIHdpdGggdGhlIG9yaWdpbmFsIHRyYW5zaXRpb24gZHVyYXRpb24pLiAqLwotICAgICAgICAgICAgICAgIHBDLT5ld2MuaU91dHB1dER1cmF0aW9uICs9IGlUbXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKio8IE5vICJlbHNlIiBoZXJlIGJlY2F1c2UgaXQncyBoYXJkIHByZWRpY3QgdGhlIGVmZmVjdCBvZiAwIGR1cmF0aW9uIHRyYW5zaXRpb24uLi4qLwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgZWZmZWN0cyBmb3IgY2xpcDIgKi8KLSAgICAgICAgTTRWU1MzR1BQX2ludENoZWNrVmlkZW9FZmZlY3RzKHBDLCAyKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogV2UgYXJlIG5vdCBpbiBhIHRyYW5zaXRpb24gKi8KLSAgICAgICAgcEMtPmJUcmFuc2l0aW9uRWZmZWN0ID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAgICAgLyogSWYgdGhlcmUgaXMgYW4gZWZmZWN0IHdlIGdvIHRvIGRlY29kZS9lbmNvZGUgbW9kZSAqLwotICAgICAgICBpZigocEMtPm5iQWN0aXZlRWZmZWN0cyA+IDApIHx8IChwQy0+bmJBY3RpdmVFZmZlY3RzMSA+IDApIHx8Ci0gICAgICAgICAgICAocEMtPnBDMS0+cFNldHRpbmdzLT5GaWxlVHlwZSA9PQotICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgfHwKLSAgICAgICAgICAgIChwQy0+cEMxLT5wU2V0dGluZ3MtPmJUcmFuc2NvZGluZ1JlcXVpcmVkID09IE00T1NBX1RSVUUpKSB7Ci0gICAgICAgICAgICBwQy0+VnN0YXRlID0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9ERUNPREVfRU5DT0RFOwotICAgICAgICB9Ci0gICAgICAgIC8qIFdlIGRvIGEgYmVnaW4gY3V0LCBleGNlcHQgaWYgYWxyZWFkeSBkb25lICh0aW1lIGlzIG5vdCBwcm9ncmVzc2luZyBiZWNhdXNlIHdlIHdhbnQKLSAgICAgICAgdG8gY2F0Y2ggYWxsIFAtZnJhbWVzIGFmdGVyIHRoZSBjdXQpICovCi0gICAgICAgIGVsc2UgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJDbGlwMUF0QmVnaW5DdXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihwQy0+cEMxLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rSDI2NCkgewotICAgICAgICAgICAgICAgIHBDLT5Wc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0RFQ09ERV9FTkNPREU7Ci0gICAgICAgICAgICAgICAgcEMtPmJFbmNvZGVUaWxsRW9GID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiggKCBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0JFR0lOX0NVVCA9PSBwcmV2aW91c1ZzdGF0ZSkKLSAgICAgICAgICAgICAgICB8fCAoTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9BRlRFUl9DVVQgPT0gcHJldmlvdXNWc3RhdGUpICkgewotICAgICAgICAgICAgICAgIHBDLT5Wc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0FGVEVSX0NVVDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcEMtPlZzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfQkVHSU5fQ1VUOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qIEVsc2Ugd2UgYXJlIGluIGRlZmF1bHQgY29weS9wYXN0ZSBtb2RlICovCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYoICggTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9CRUdJTl9DVVQgPT0gcHJldmlvdXNWc3RhdGUpCi0gICAgICAgICAgICAgICAgfHwgKE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfQUZURVJfQ1VUID09IHByZXZpb3VzVnN0YXRlKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEMtPlZzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfQUZURVJfQ1VUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggcEMtPmJJc01NUyA9PSBNNE9TQV9UUlVFICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgY3VycmVudEJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAgICAgICAgICAgICAvKiBEbyB3ZSBuZWVkIHRvIHJlZW5jb2RlIHRoZSB2aWRlbyB0byBkb3duZ3JhZGUgdGhlIGJpdHJhdGUgb3Igbm90ID8gKi8KLSAgICAgICAgICAgICAgICAvKiBMZXQncyBjb21wdXRlIHRoZSBjaXJyZW50IGJpdHJhdGUgb2YgdGhlIGN1cnJlbnQgZWRpdGVkIGNsaXAgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+cEMxLT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdEdldE9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIE00UkVBREVSX2tPcHRpb25JRF9CaXRyYXRlLCAmY3VycmVudEJpdHJhdGUpOwotCi0gICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDaGVja1ZpZGVvTW9kZTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBFcnJvciB3aGVuIGdldHRpbmcgbmV4dCBiaXRyYXRlIG9mIGVkaXRlZCBjbGlwOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogUmVtb3ZlIGF1ZGlvIGJpdHJhdGUgKi8KLSAgICAgICAgICAgICAgICBjdXJyZW50Qml0cmF0ZSAtPSAxMjIwMDsKLQotICAgICAgICAgICAgICAgIC8qIFRlc3QgaWYgd2UgZ28gaW50byBjb3B5L3Bhc3RlIG1vZGUgb3IgaW50byBkZWNvZGUvZW5jb2RlIG1vZGUgKi8KLSAgICAgICAgICAgICAgICBpZiggY3VycmVudEJpdHJhdGUgPiBwQy0+dWlNTVNWaWRlb0JpdHJhdGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPlZzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfREVDT0RFX0VOQ09ERTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPlZzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfUkVBRF9XUklURTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCEoKHBDLT5tX2JDbGlwRXh0ZXJuYWxIYXNTdGFydGVkID09IE00T1NBX1RSVUUpICYmCi0gICAgICAgICAgICAgICAgICAgIChwQy0+VnN0YXRlID09IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfREVDT0RFX0VOQ09ERSkpICYmCi0gICAgICAgICAgICAgICAgICAgIHBDLT5iRW5jb2RlVGlsbEVvRiA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBUZXN0IGlmIHdlIGdvIGludG8gY29weS9wYXN0ZSBtb2RlIG9yIGludG8gZGVjb2RlL2VuY29kZSBtb2RlCi0gICAgICAgICAgICAgICAgICogSWYgYW4gZXh0ZXJuYWwgZWZmZWN0IGhhcyBiZWVuIGFwcGxpZWQgb24gdGhlIGN1cnJlbnQgY2xpcAotICAgICAgICAgICAgICAgICAqIHRoZW4gY29udGludWUgdG8gYmUgaW4gZGVjb2RlL2VuY29kZSBtb2RlIHRpbGwgZW5kIG9mCi0gICAgICAgICAgICAgICAgICogY2xpcCB0byBhdm9pZCBILjI2NCBkaXN0b3J0aW9uLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHBDLT5Wc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1JFQURfV1JJVEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIHdlIGNyZWF0ZSBhbiBlbmNvZGVyICovCi0gICAgaWYoICggKCBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1JFQURfV1JJVEUgPT0gcHJldmlvdXNWc3RhdGUpCi0gICAgICAgIHx8IChNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0FGVEVSX0NVVAotICAgICAgICA9PSBwcmV2aW91c1ZzdGF0ZSkpIC8qKjwgcmVhZCBtb2RlICovCi0gICAgICAgICYmICgoIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfREVDT0RFX0VOQ09ERSA9PSBwQy0+VnN0YXRlKQotICAgICAgICB8fCAoTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9CRUdJTl9DVVQgPT0gcEMtPlZzdGF0ZSkKLSAgICAgICAgfHwgKE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfVFJBTlNJVElPTgotICAgICAgICA9PSBwQy0+VnN0YXRlKSkgLyoqPCBlbmNvZGUgbW9kZSAqLwotICAgICAgICAmJiBwQy0+YklzTU1TID09IE00T1NBX0ZBTFNFICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENyZWF0ZSB0aGUgZW5jb2RlciwgaWYgbm90IGNyZWF0ZWQgYWxyZWFkeSovCi0gICAgICAgIGlmIChwQy0+ZXdjLmVuY29kZXJTdGF0ZSA9PSBNNFZTUzNHUFBfa05vRW5jb2RlcikgewotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENyZWF0ZVZpZGVvRW5jb2RlcihwQyk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2hlY2tWaWRlb01vZGU6IE00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXIgXAotICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyAweCV4ISIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmKCBwQy0+YklzTU1TID09IE00T1NBX1RSVUUgJiYgcEMtPmV3Yy5wRW5jQ29udGV4dCA9PSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENyZWF0ZSB0aGUgZW5jb2RlciAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyKHBDKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrVmlkZW9Nb2RlOiBNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBXaGVuIHdlIGdvIGZyb20gZmlsdGVyaW5nIHRvIHJlYWQvd3JpdGUsIHdlIG11c3QgYWN0IGxpa2UgYSBiZWdpbiBjdXQsCi0gICAgKiBiZWNhdXNlIHRoZSBsYXN0IGZpbHRlcmVkIGltYWdlIG1heSBiZSBkaWZmZXJlbnQgdGhhbiB0aGUgb3JpZ2luYWwgaW1hZ2UuICovCi0gICAgZWxzZSBpZiggKCAoIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfREVDT0RFX0VOQ09ERSA9PSBwcmV2aW91c1ZzdGF0ZSkKLSAgICAgICAgfHwgKE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfVFJBTlNJVElPTgotICAgICAgICA9PSBwcmV2aW91c1ZzdGF0ZSkpIC8qKjwgZW5jb2RlIG1vZGUgKi8KLSAgICAgICAgJiYgKE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfUkVBRF9XUklURSA9PSBwQy0+VnN0YXRlKSAvKio8IHJlYWQgbW9kZSAqLwotICAgICAgICAmJiAocEMtPmJFbmNvZGVUaWxsRW9GID09IE00T1NBX0ZBTFNFKSApCi0gICAgewotICAgICAgICBwQy0+VnN0YXRlID0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9CRUdJTl9DVVQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiB3ZSBkZXN0cm95IGFuIGVuY29kZXIgKi8KLSAgICBlbHNlIGlmKCAoICggTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9ERUNPREVfRU5DT0RFID09IHByZXZpb3VzVnN0YXRlKQotICAgICAgICB8fCAoTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9CRUdJTl9DVVQgPT0gcHJldmlvdXNWc3RhdGUpCi0gICAgICAgIHx8IChNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1RSQU5TSVRJT04KLSAgICAgICAgPT0gcHJldmlvdXNWc3RhdGUpKSAvKio8IGVuY29kZSBtb2RlICovCi0gICAgICAgICYmICgoIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfUkVBRF9XUklURSA9PSBwQy0+VnN0YXRlKQotICAgICAgICB8fCAoTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9BRlRFUl9DVVQKLSAgICAgICAgPT0gcEMtPlZzdGF0ZSkpIC8qKjwgcmVhZCBtb2RlICovCi0gICAgICAgICYmIHBDLT5iSXNNTVMgPT0gTTRPU0FfRkFMU0UgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogRGVzdHJveSB0aGUgcHJldmlvdXNseSBjcmVhdGVkIGVuY29kZXIgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludERlc3Ryb3lWaWRlb0VuY29kZXIocEMpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2hlY2tWaWRlb01vZGU6IE00VlNTM0dQUF9pbnREZXN0cm95VmlkZW9FbmNvZGVyIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50Q2hlY2tWaWRlb01vZGU6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50U3RhcnRBVSgpCi0gKiBAYnJpZWYgICAgU3RhcnRBVSB3cml0ZXItbGlrZSBpbnRlcmZhY2UgdXNlZCBmb3IgdGhlIFZTUyAzR1BQIG9ubHkKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6IChJTikgSXQgaXMgdGhlIFZTUyAzR1BQIGNvbnRleHQgaW4gb3VyIGNhc2UKLSAqIEBwYXJhbSAgICBzdHJlYW1JRDogKElOKSBJZCBvZiB0aGUgc3RyZWFtIHRvIHdoaWNoIHRoZSBBY2Nlc3MgVW5pdCBpcyByZWxhdGVkLgotICogQHBhcmFtICAgIHBBVTogICAgICAoSU4vT1VUKSBBY2Nlc3MgVW5pdCB0byBiZSBwcmVwYXJlZC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRTdGFydEFVKCBNNFdSSVRFUl9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlELCBNNFNZU19BY2Nlc3NVbml0ICpwQVUgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfVUludDMyIHVpTWF4QXVTaXplOwotCi0gICAgLyoqCi0gICAgKiBHaXZlbiBjb250ZXh0IGlzIGFjdHVhbGx5IHRoZSBWU1MzR1BQIGNvbnRleHQgKi8KLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgPQotICAgICAgICAoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKilwQ29udGV4dDsKLQotICAgIC8qKgotICAgICogR2V0IHRoZSBvdXRwdXQgQVUgdG8gd3JpdGUgaW50byAqLwotICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00VlNTM0dQUF9XUklURVJfVklERU9fU1RSRUFNX0lELCBwQVUpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRTdGFydEFVOiBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKFZpZGVvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiAgICBSZXR1cm4gKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludFN0YXJ0QVU6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50UHJvY2Vzc0FVKCkKLSAqIEBicmllZiAgICBQcm9jZXNzQVUgd3JpdGVyLWxpa2UgaW50ZXJmYWNlIHVzZWQgZm9yIHRoZSBWU1MgM0dQUCBvbmx5Ci0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0OiAoSU4pIEl0IGlzIHRoZSBWU1MgM0dQUCBjb250ZXh0IGluIG91ciBjYXNlCi0gKiBAcGFyYW0gICAgc3RyZWFtSUQ6IChJTikgSWQgb2YgdGhlIHN0cmVhbSB0byB3aGljaCB0aGUgQWNjZXNzIFVuaXQgaXMgcmVsYXRlZC4KLSAqIEBwYXJhbSAgICBwQVU6ICAgICAgKElOL09VVCkgQWNjZXNzIFVuaXQgdG8gYmUgd3JpdHRlbgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludFByb2Nlc3NBVSggTTRXUklURVJfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlELCBNNFNZU19BY2Nlc3NVbml0ICpwQVUgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICAvKioKLSAgICAqIEdpdmVuIGNvbnRleHQgaXMgYWN0dWFsbHkgdGhlIFZTUzNHUFAgY29udGV4dCAqLwotICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyA9Ci0gICAgICAgIChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqKXBDb250ZXh0OwotCi0gICAgLyoqCi0gICAgKiBGaXggdGhlIGVuY29kZWQgQVUgdGltZSAqLwotICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgcEMtPmV3Yy5kT3V0cHV0VmlkQ3RzID0gcEFVLT5DVFM7Ci0gICAgLyoqCi0gICAgKiBVcGRhdGUgdGltZSBpbmZvIGZvciB0aGUgQ291bnRlciBUaW1lIFN5c3RlbSB0byBiZSBlcXVhbCB0byB0aGUgYml0LXN0cmVhbSB0aW1lICovCi0gICAgTTRWU1MzR1BQX2ludFVwZGF0ZVRpbWVJbmZvKHBDLCBwQVUpOwotCi0gICAgLyoqCi0gICAgKiBXcml0ZSB0aGUgQVUgKi8KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00VlNTM0dQUF9XUklURVJfVklERU9fU1RSRUFNX0lELCBwQVUpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRQcm9jZXNzQVU6IHBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVShWaWRlbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogICAgUmV0dXJuICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRQcm9jZXNzQVU6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRWUFAoKQotICogQGJyaWVmICAgIFdlIGltcGxlbWVudCBvdXIgb3duIFZpZGVvUHJlUHJvY2Vzc2luZyBmdW5jdGlvbgotICogQG5vdGUgICAgSXQgaXMgY2FsbGVkIGJ5IHRoZSB2aWRlbyBlbmNvZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOKSBWUFAgY29udGV4dCwgd2hpY2ggYWN0dWFsbHkgaXMgdGhlIFZTUyAzR1BQIGNvbnRleHQgaW4gb3VyIGNhc2UKLSAqIEBwYXJhbSAgICBwUGxhbmVJbiAgICAoSU4pCi0gKiBAcGFyYW0gICAgcFBsYW5lT3V0ICAgIChJTi9PVVQpIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgMyBwbGFuZXMgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIG91dHB1dAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVVWNDIwIGltYWdlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50VlBQKCBNNFZQUF9Db250ZXh0IHBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0ICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNF9NZWRpYVRpbWUgdHM7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBUbXAgPSBNNE9TQV9OVUxMOwotICAgIE00VklGSV9JbWFnZVBsYW5lICpwTGFzdERlY29kZWRGcmFtZSA9IE00T1NBX05VTEwgOwotICAgIE00VklGSV9JbWFnZVBsYW5lICpwRGVjb2RlclJlbmRlckZyYW1lID0gTTRPU0FfTlVMTDsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSBwVGVtcDFbM10scFRlbXAyWzNdOwotICAgIE00VklGSV9JbWFnZVBsYW5lIHBUZW1wUGxhbmVDbGlwMVszXSxwVGVtcFBsYW5lQ2xpcDJbM107Ci0gICAgTTRPU0FfVUludDMyICBpID0gMCwgeXV2RnJhbWVXaWR0aCA9IDAsIHl1dkZyYW1lSGVpZ2h0ID0gMDsKLSAgICBNNE9TQV9Cb29sIGJTa2lwRnJhbWVFZmZlY3QgPSBNNE9TQV9GQUxTRTsKLSAgICAvKioKLSAgICAqIFZQUCBjb250ZXh0IGlzIGFjdHVhbGx5IHRoZSBWU1MzR1BQIGNvbnRleHQgKi8KLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgPQotICAgICAgICAoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKilwQ29udGV4dDsKLQotICAgIG1lbXNldCgodm9pZCAqKXBUZW1wMSwgMCwgMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpKTsKLSAgICBtZW1zZXQoKHZvaWQgKilwVGVtcDIsIDAsIDMqc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSk7Ci0gICAgbWVtc2V0KCh2b2lkICopcFRlbXBQbGFuZUNsaXAxLCAwLCAzKnNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSkpOwotICAgIG1lbXNldCgodm9pZCAqKXBUZW1wUGxhbmVDbGlwMiwgMCwgMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpKTsKLQotICAgIC8qKgotICAgICogUmVzZXQgVlBQIGVycm9yIHJlbWVtYmVyZWQgaW4gY29udGV4dCAqLwotICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBNNE5PX0VSUk9SOwotCi0gICAgLyoqCi0gICAgKiBBdCB0aGUgZW5kIG9mIHRoZSBlZGl0aW5nLCB3ZSBtYXkgYmUgY2FsbGVkIHdoZW4gbm8gbW9yZSBjbGlwIGlzIGxvYWRlZC4KLSAgICAqIChiZWNhdXNlIHRvIGNsb3NlIHRoZSBlbmNvZGVyIHByb3Blcmx5IGl0IG11c3QgYmUgc3RlcHBlZCBvbmUgb3IgdHdpY2UuLi4pICovCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBDMSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBXZSBtdXN0IGZpbGwgdGhlIGlucHV0IG9mIHRoZSBlbmNvZGVyIHdpdGggYSBkdW1teSBpbWFnZSwgYmVjYXVzZQotICAgICAgICAqIGVuY29kaW5nIG5vaXNlIGxlYWRzIHRvIGEgaHVnZSB2aWRlbyBBVSwgYW5kIHRodXMgYSB3cml0ZXIgYnVmZmVyIG92ZXJmbG93LiAqLwotICAgICAgICBtZW1zZXQoKHZvaWQgKilwUGxhbmVPdXRbMF0ucGFjX2RhdGEsMCwKLSAgICAgICAgICAgIHBQbGFuZU91dFswXS51X3N0cmlkZSAqIHBQbGFuZU91dFswXS51X2hlaWdodCk7Ci0gICAgICAgIG1lbXNldCgodm9pZCAqKXBQbGFuZU91dFsxXS5wYWNfZGF0YSwwLAotICAgICAgICAgICAgcFBsYW5lT3V0WzFdLnVfc3RyaWRlICogcFBsYW5lT3V0WzFdLnVfaGVpZ2h0KTsKLSAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lT3V0WzJdLnBhY19kYXRhLDAsCi0gICAgICAgICAgICBwUGxhbmVPdXRbMl0udV9zdHJpZGUgKiBwUGxhbmVPdXRbMl0udV9oZWlnaHQpOwotCi0gICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50VlBQOiByZXR1cm5pbmcgTTROT19FUlJPUiAoYWJvcnQpIik7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgIC8qKgotICAgICoqKioqKioqKioqKioqKiogVHJhbnNpdGlvbiBjYXNlICoqKioqKioqKioqKioqKiovCi0gICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJUcmFuc2l0aW9uRWZmZWN0ICkKLSAgICB7Ci0KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKHBUZW1wMSwgcEMtPmV3Yy51aVZpZGVvV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQpOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAoMSkgcmV0dXJucyAweCV4LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiIsIGVycik7Ci0gICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7IC8qKjwgUmV0dXJuIG5vIGVycm9yIHRvIHRoZSBlbmNvZGVyIGNvcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZWxzZSBpdCBtYXkgbGVhayBpbiBzb21lIHNpdHVhdGlvbnMuLi4pICovCi0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAocFRlbXAyLCBwQy0+ZXdjLnVpVmlkZW9XaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRWUFA6IE00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMCgyKSByZXR1cm5zIDB4JXgsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE5PX0VSUk9SIiwgZXJyKTsKLSAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsgLyoqPCBSZXR1cm4gbm8gZXJyb3IgdG8gdGhlIGVuY29kZXIgY29yZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsc2UgaXQgbWF5IGxlYWsgaW4gc29tZSBzaXR1YXRpb25zLi4uKSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKHBDLT55dXYxLCBwQy0+ZXdjLnVpVmlkZW9XaWR0aCwKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCk7Ci0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50VlBQOiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAoMykgcmV0dXJucyAweCV4LFwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICBNNE5PX0VSUk9SOyAvKio8IFJldHVybiBubyBlcnJvciB0byB0aGUgZW5jb2RlciBjb3JlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsc2UgaXQgbWF5IGxlYWsgaW4gc29tZSBzaXR1YXRpb25zLi4uKSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKHBDLT55dXYyLCBwQy0+ZXdjLnVpVmlkZW9XaWR0aCwKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCk7Ci0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50VlBQOiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAoNCkgcmV0dXJucyAweCV4LFwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICBNNE5PX0VSUk9SOyAvKio8IFJldHVybiBubyBlcnJvciB0byB0aGUgZW5jb2RlciBjb3JlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsc2UgaXQgbWF5IGxlYWsgaW4gc29tZSBzaXR1YXRpb25zLi4uKSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKHBDLT55dXYzLCBwQy0+ZXdjLnVpVmlkZW9XaWR0aCwKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCk7Ci0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50VlBQOiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAoMykgcmV0dXJucyAweCV4LFwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICBNNE5PX0VSUk9SOyAvKio8IFJldHVybiBubyBlcnJvciB0byB0aGUgZW5jb2RlciBjb3JlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsc2UgaXQgbWF5IGxlYWsgaW4gc29tZSBzaXR1YXRpb25zLi4uKSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ29tcHV0ZSB0aGUgdGltZSBpbiB0aGUgY2xpcDEgYmFzZTogdHMgPSB0byAtIE9mZnNldCAqLwotICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICB0cyA9IHBDLT5ld2MuZElucHV0VmlkQ3RzIC0gcEMtPnBDMS0+aVZvZmZzZXQ7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogUmVuZGVyIENsaXAxICovCi0gICAgICAgIGlmKCBwQy0+cEMxLT5pc1JlbmRlckR1cCA9PSBNNE9TQV9GQUxTRSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRSZW5kZXJGcmFtZVdpdGhFZmZlY3QocEMsIHBDLT5wQzEsIHRzLCBNNE9TQV9UUlVFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBQbGFuZUNsaXAxLCBwVGVtcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXQpOwotICAgICAgICAgICAgaWYgKChNNE5PX0VSUk9SICE9IGVycikgJiYKLSAgICAgICAgICAgICAgICAgKE00V0FSX1ZJREVPUkVOREVSRVJfTk9fTkVXX0ZSQU1FICE9IGVycikpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFZQUDogXAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50UmVuZGVyRnJhbWVXaXRoRWZmZWN0IHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAvKiogUmV0dXJuIG5vIGVycm9yIHRvIHRoZSBlbmNvZGVyIGNvcmUKLSAgICAgICAgICAgICAgICAgICogZWxzZSBpdCBtYXkgbGVhayBpbiBzb21lIHNpdHVhdGlvbnMuKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoKHBDLT5wQzEtPmlzUmVuZGVyRHVwID09IE00T1NBX1RSVUUpIHx8Ci0gICAgICAgICAgICAgKE00V0FSX1ZJREVPUkVOREVSRVJfTk9fTkVXX0ZSQU1FID09IGVycikpIHsKLSAgICAgICAgICAgIHBUbXAgPSBwQy0+eXV2MTsKLSAgICAgICAgICAgIGlmIChwQy0+cEMxLT5sYXN0RGVjb2RlZFBsYW5lICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgICAgICAvKiBDb3B5IGxhc3QgZGVjb2RlZCBwbGFuZSB0byBvdXRwdXQgcGxhbmUgKi8KLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwVG1wWzBdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5wQzEtPmxhc3REZWNvZGVkUGxhbmVbMF0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgIChwVG1wWzBdLnVfaGVpZ2h0ICogcFRtcFswXS51X3dpZHRoKSk7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFRtcFsxXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+cEMxLT5sYXN0RGVjb2RlZFBsYW5lWzFdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAocFRtcFsxXS51X2hlaWdodCAqIHBUbXBbMV0udV93aWR0aCkpOwotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBUbXBbMl0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZVsyXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKHBUbXBbMl0udV9oZWlnaHQgKiBwVG1wWzJdLnVfd2lkdGgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX0VSUl9OT19WQUxJRF9WSURfRlJBTUU7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzMoIkNhbiBub3QgZmluZCBhbiBpbnB1dCBmcmFtZS4gU2V0IGVycm9yIDB4JXggaW4gJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgZXJyLCBfX0ZJTEVfXywgX19MSU5FX18pOwotICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQy0+cEMxLT5sYXN0RGVjb2RlZFBsYW5lID0gcFRtcDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENvbXB1dGUgdGhlIHRpbWUgaW4gdGhlIGNsaXAyIGJhc2U6IHRzID0gdG8gLSBPZmZzZXQgKi8KLSAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgdHMgPSBwQy0+ZXdjLmRJbnB1dFZpZEN0cyAtIHBDLT5wQzItPmlWb2Zmc2V0OwotICAgICAgICAvKioKLSAgICAgICAgKiBSZW5kZXIgQ2xpcDIgKi8KLSAgICAgICAgaWYoIHBDLT5wQzItPmlzUmVuZGVyRHVwID09IE00T1NBX0ZBTFNFICkKLSAgICAgICAgewotCi0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50UmVuZGVyRnJhbWVXaXRoRWZmZWN0KHBDLCBwQy0+cEMyLCB0cywgTTRPU0FfRkFMU0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFBsYW5lQ2xpcDIsIHBUZW1wMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dCk7Ci0gICAgICAgICAgICBpZiAoKE00Tk9fRVJST1IgIT0gZXJyKSAmJgotICAgICAgICAgICAgICAgICAoTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUUgIT0gZXJyKSkgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBcCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRSZW5kZXJGcmFtZVdpdGhFZmZlY3QgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgIC8qKiBSZXR1cm4gbm8gZXJyb3IgdG8gdGhlIGVuY29kZXIgY29yZQotICAgICAgICAgICAgICAgICAgKiBlbHNlIGl0IG1heSBsZWFrIGluIHNvbWUgc2l0dWF0aW9ucy4qLwotICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICgocEMtPnBDMi0+aXNSZW5kZXJEdXAgPT0gTTRPU0FfVFJVRSkgfHwKLSAgICAgICAgICAgICAoTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUUgPT0gZXJyKSkgewotICAgICAgICAgICAgcFRtcCA9IHBDLT55dXYyOwotICAgICAgICAgICAgaWYgKHBDLT5wQzItPmxhc3REZWNvZGVkUGxhbmUgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgIC8qIENvcHkgbGFzdCBkZWNvZGVkIHBsYW5lIHRvIG91dHB1dCBwbGFuZSAqLwotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBUbXBbMF0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPnBDMi0+bGFzdERlY29kZWRQbGFuZVswXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKHBUbXBbMF0udV9oZWlnaHQgKiBwVG1wWzBdLnVfd2lkdGgpKTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwVG1wWzFdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5wQzItPmxhc3REZWNvZGVkUGxhbmVbMV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgIChwVG1wWzFdLnVfaGVpZ2h0ICogcFRtcFsxXS51X3dpZHRoKSk7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFRtcFsyXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+cEMyLT5sYXN0RGVjb2RlZFBsYW5lWzJdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAocFRtcFsyXS51X2hlaWdodCAqIHBUbXBbMl0udV93aWR0aCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfRVJSX05PX1ZBTElEX1ZJRF9GUkFNRTsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMygiQ2FuIG5vdCBmaW5kIGFuIGlucHV0IGZyYW1lLiBTZXQgZXJyb3IgMHgleCBpbiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICBlcnIsIF9fRklMRV9fLCBfX0xJTkVfXyk7Ci0gICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBDLT5wQzItPmxhc3REZWNvZGVkUGxhbmUgPSBwVG1wOwotICAgICAgICB9Ci0KLQotICAgICAgICBwVG1wID0gcFBsYW5lT3V0OwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50VmlkZW9UcmFuc2l0aW9uKHBDLCBwVG1wKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFZQUDogTTRWU1MzR1BQX2ludFZpZGVvVHJhbnNpdGlvbiByZXR1cm5zIDB4JXgsXAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE5PX0VSUk9SIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgIHJldHVybiAgTTROT19FUlJPUjsgLyoqPCBSZXR1cm4gbm8gZXJyb3IgdG8gdGhlIGVuY29kZXIgY29yZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZWxzZSBpdCBtYXkgbGVhayBpbiBzb21lIHNpdHVhdGlvbnMuLi4pICovCi0gICAgICAgIH0KLSAgICAgICAgZm9yIChpPTA7IGkgPCAzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHBUZW1wUGxhbmVDbGlwMltpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShwVGVtcFBsYW5lQ2xpcDJbaV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgIHBUZW1wUGxhbmVDbGlwMltpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKHBUZW1wUGxhbmVDbGlwMVtpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShwVGVtcFBsYW5lQ2xpcDFbaV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgIHBUZW1wUGxhbmVDbGlwMVtpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwVGVtcDJbaV0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgIGZyZWUocFRlbXAyW2ldLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICBwVGVtcDJbaV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocFRlbXAxW2ldLnBhY19kYXRhICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBUZW1wMVtpXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgcFRlbXAxW2ldLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAqKioqKioqKioqKioqKioqIE5vIFRyYW5zaXRpb24gY2FzZSAqKioqKioqKioqKioqKioqLwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50VlBQOiBOTyB0cmFuc2l0aW9uIGNhc2UiKTsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ29tcHV0ZSB0aGUgdGltZSBpbiB0aGUgY2xpcCBiYXNlOiB0cyA9IHRvIC0gT2Zmc2V0ICovCi0gICAgICAgIHRzID0gcEMtPmV3Yy5kSW5wdXRWaWRDdHMgLSBwQy0+cEMxLT5pVm9mZnNldDsKLSAgICAgICAgcEMtPmJJc3NlY29uZENsaXAgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgLyoqCi0gICAgICAgICogUmVuZGVyICovCi0gICAgICAgIGlmIChwQy0+cEMxLT5pc1JlbmRlckR1cCA9PSBNNE9TQV9GQUxTRSkgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRWUFA6IHJlbmRlcmR1cCBmYWxzZSIpOwotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICAgQ2hlY2sgaWYgcmVzaXppbmcgaXMgbmVlZGVkICovCi0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZSkgewotICAgICAgICAgICAgICAgIGlmICgocEMtPnBDMS0+cFNldHRpbmdzLT5GaWxlVHlwZSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChwQy0+bmJBY3RpdmVFZmZlY3RzID09IDApICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAocEMtPnBDMS0+YkdldFl1dkRhdGFGcm9tRGVjb2RlciA9PSBNNE9TQV9GQUxTRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPnBDMS0+U2hlbGxBUEkubV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5wVmlEZWNDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX2tPcHRpb25JRF9FbmFibGVZdXZXaXRoRWZmZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pTTRPU0FfVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQzEtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0UmVuZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBWaURlY0N0eHQsICZ0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXQsIE00T1NBX1RSVUUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBDLT5wQzEtPnBTZXR0aW5ncy0+RmlsZVR5cGUgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQzEtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBWaURlY0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX2tPcHRpb25JRF9FbmFibGVZdXZXaXRoRWZmZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKU00T1NBX0ZBTFNFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiA9PSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQzEtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0UmVuZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBWaURlY0N0eHQsICZ0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZSwgTTRPU0FfVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BGY3RSZW5kZXIoKSByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBDLT5wQzEtPnBTZXR0aW5ncy0+RmlsZVR5cGUgIT0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoMCAhPSBwQy0+cEMxLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnZpZGVvUm90YXRpb25EZWdyZWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBTYXZlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdW4tcm90YXRlZCBmcmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgeXV2RnJhbWVXaWR0aCA9IHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB5dXZGcmFtZUhlaWdodCA9IHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludFJvdGF0ZVZpZGVvKHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnZpZGVvUm90YXRpb25EZWdyZWVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0ZVZpZGVvKCkgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHBDLT5uYkFjdGl2ZUVmZmVjdHMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmJHZXRZdXZEYXRhRnJvbURlY29kZXIgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBJZiB3ZSBkbyBtb2RpZnkgdGhlIGltYWdlLCB3ZSBuZWVkIGFuIGludGVybWVkaWF0ZQotICAgICAgICAgICAgICAgICAgICAqIGltYWdlIHBsYW5lICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMChwVGVtcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMF0udV93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVswXS51X2hlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRWUFA6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogSWYgdmlkZW8gZnJhbWUgbmVlZCB0byBiZSByZXNpemVkLCB0aGVuIGFwcGx5IHRoZSBvdmVybGF5IGFmdGVyCi0gICAgICAgICAgICAgICAgICAgICAqIHRoZSBmcmFtZSB3YXMgcmVuZGVyZWQgd2l0aCByZW5kZXJpbmcgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICogSGVyZSBza2lwIHRoZSBmcmFtaW5nKG92ZXJsYXkpIGVmZmVjdCB3aGVuIGFwcGx5aW5nIHZpZGVvIEVmZmVjdC4gKi8KLSAgICAgICAgICAgICAgICAgICAgYlNraXBGcmFtZUVmZmVjdCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0KHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lLCBwVGVtcDEsIGJTa2lwRnJhbWVFZmZlY3QpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9FZmZlY3QoKSBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lPSBwVGVtcDE7Ci0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lID0gcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIFByZXBhcmUgb3ZlcmxheSB0ZW1wb3JhcnkgYnVmZmVyIGlmIG92ZXJsYXkgZXhpc3QgKi8KLSAgICAgICAgICAgICAgICBpZiAocEMtPmJDbGlwMUFjdGl2ZUZyYW1pbmdFZmZlY3QpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKHBUZW1wMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dFswXS51X3dpZHRoLCBwUGxhbmVPdXRbMF0udV9oZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgMHgleCwgcmV0dXJuaW5nIE00Tk9fRVJST1IiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBUbXAgPSBwVGVtcDI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcFRtcCA9IHBQbGFuZU91dDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBEbyByZW5kZXJpbmcgbW9kZS4gKi8KLSAgICAgICAgICAgICAgICBpZiAoKHBDLT5wQzEtPmJHZXRZdXZEYXRhRnJvbURlY29kZXIgPT0gTTRPU0FfVFJVRSkgfHwKLSAgICAgICAgICAgICAgICAgICAgKHBDLT5wQzEtPnBTZXR0aW5ncy0+RmlsZVR5cGUgIT0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkpIHsKLQotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXBwbHlSZW5kZXJpbmdNb2RlKHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cFNldHRpbmdzLT54VlNTLk1lZGlhUmVuZGVyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlY29kZXJSZW5kZXJGcmFtZSwgcFRtcCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRWUFA6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXBwbHlSZW5kZXJpbmdNb2RlKSBlcnJvciAweCV4ICIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBBcHBseSBvdmVybGF5IGlmIG92ZXJsYXkgaXMgZXhpc3QgKi8KLSAgICAgICAgICAgICAgICBpZiAocEMtPmJDbGlwMUFjdGl2ZUZyYW1pbmdFZmZlY3QpIHsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXJSZW5kZXJGcmFtZSA9IHBUbXA7Ci0gICAgICAgICAgICAgICAgICAgIHBUbXAgPSBwUGxhbmVPdXQ7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBcHBseVZpZGVvT3ZlcmxheShwQywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyUmVuZGVyRnJhbWUsIHBUbXApOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9PdmVybGF5KSBlcnJvciAweCV4ICIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoKHBDLT5wQzEtPnBTZXR0aW5ncy0+RmlsZVR5cGUgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKHBDLT5uYkFjdGl2ZUVmZmVjdHMgPT0gMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKHBDLT5wQzEtPmJHZXRZdXZEYXRhRnJvbURlY29kZXIgPT0gTTRPU0FfVFJVRSkpIHsKLQotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+cEMxLT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBWaURlY0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfa09wdGlvbklEX1l1dldpdGhFZmZlY3ROb25Db250aWd1b3VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pcFRtcCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmJHZXRZdXZEYXRhRnJvbURlY29kZXIgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBSZXNldCBvcmlnaW5hbCB3aWR0aCBhbmQgaGVpZ2h0IGZvciByZXNpemUgZnJhbWUgcGxhbmUKLSAgICAgICAgICAgICAgICBpZiAoMCAhPSBwQy0+cEMxLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnZpZGVvUm90YXRpb25EZWdyZWVzICYmCi0gICAgICAgICAgICAgICAgICAgIDE4MCAhPSBwQy0+cEMxLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnZpZGVvUm90YXRpb25EZWdyZWVzKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludFNldFlVVjQyMFBsYW5lKHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2RnJhbWVXaWR0aCwgeXV2RnJhbWVIZWlnaHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludFZQUDogTk8gcmVzaXplIHJlcXVpcmVkIik7Ci0gICAgICAgICAgICAgICAgaWYgKHBDLT5uYkFjdGl2ZUVmZmVjdHMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKiBJZiB3ZSBkbyBtb2RpZnkgdGhlIGltYWdlLCB3ZSBuZWVkIGFuCi0gICAgICAgICAgICAgICAgICAgICAqIGludGVybWVkaWF0ZSBpbWFnZSBwbGFuZSAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAocFRlbXAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lID0gcFRlbXAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXJSZW5kZXJGcmFtZSA9IHBQbGFuZU91dDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwVG1wID0gcFBsYW5lT3V0OwotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQzEtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0UmVuZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5wVmlEZWNDdHh0LCAmdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyUmVuZGVyRnJhbWUsIE00T1NBX1RSVUUpOwotICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocEMtPm5iQWN0aXZlRWZmZWN0cyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLyogSGVyZSB3ZSBkbyBub3Qgc2tpcCB0aGUgb3ZlcmxheSBlZmZlY3Qgc2luY2UKLSAgICAgICAgICAgICAgICAgICAgICogb3ZlcmxheSBhbmQgdmlkZW8gZnJhbWUgYXJlIGJvdGggb2Ygc2FtZSByZXNvbHV0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIGJTa2lwRnJhbWVFZmZlY3QgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9FZmZlY3QocEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lLHBQbGFuZU91dCxiU2tpcEZyYW1lRWZmZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZSA9IHBUbXA7Ci0gICAgICAgICAgICBwQy0+cEMxLT5pVmlkZW9SZW5kZXJDdHMgPSAoTTRPU0FfSW50MzIpdHM7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50VlBQOiByZW5kZXJkdXAgdHJ1ZSIpOwotCi0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZSkgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQ29weSBsYXN0IGRlY29kZWQgcGxhbmUgdG8gb3V0cHV0IHBsYW5lICovCi0gICAgICAgICAgICAgICAgaWYgKHBDLT5wQzEtPmxhc3REZWNvZGVkUGxhbmUgIT0gTTRPU0FfTlVMTCkgewotCi0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+cEMxLT5sYXN0RGVjb2RlZFBsYW5lWzBdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfaGVpZ2h0ICogXAotICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfd2lkdGgpKTsKLQotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZVsxXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVsxXS51X2hlaWdodCAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVsxXS51X3dpZHRoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5wQzEtPmxhc3REZWNvZGVkUGxhbmVbMl0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAocEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMl0udV9oZWlnaHQgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMl0udV93aWR0aCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9FUlJfTk9fVkFMSURfVklEX0ZSQU1FOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMygiQ2FuIG5vdCBmaW5kIGFuIGlucHV0IGZyYW1lLiBTZXQgZXJyb3IgMHgleCBpbiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciwgX19GSUxFX18sIF9fTElORV9fKTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYocEMtPm5iQWN0aXZlRWZmZWN0cyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogSWYgd2UgZG8gbW9kaWZ5IHRoZSBpbWFnZSwgd2UgbmVlZCBhbgotICAgICAgICAgICAgICAgICAgICAqIGludGVybWVkaWF0ZSBpbWFnZSBwbGFuZSAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAocFRlbXAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMF0udV93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogSWYgdmlkZW8gZnJhbWUgbmVlZCB0byBiZSByZXNpemVkLCB0aGVuIGFwcGx5IHRoZSBvdmVybGF5IGFmdGVyCi0gICAgICAgICAgICAgICAgICAgICAqIHRoZSBmcmFtZSB3YXMgcmVuZGVyZWQgd2l0aCByZW5kZXJpbmcgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICogSGVyZSBza2lwIHRoZSBmcmFtaW5nKG92ZXJsYXkpIGVmZmVjdCB3aGVuIGFwcGx5aW5nIHZpZGVvIEVmZmVjdC4gKi8KLSAgICAgICAgICAgICAgICAgICAgYlNraXBGcmFtZUVmZmVjdCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0KHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWUscFRlbXAxLCBiU2tpcEZyYW1lRWZmZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXJSZW5kZXJGcmFtZT0gcFRlbXAxOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyUmVuZGVyRnJhbWUgPSBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogUHJlcGFyZSBvdmVybGF5IHRlbXBvcmFyeSBidWZmZXIgaWYgb3ZlcmxheSBleGlzdCAqLwotICAgICAgICAgICAgICAgIGlmIChwQy0+YkNsaXAxQWN0aXZlRnJhbWluZ0VmZmVjdCkgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAoCi0gICAgICAgICAgICAgICAgICAgICAgICBwVGVtcDIsIHBDLT5ld2MudWlWaWRlb1dpZHRoLCBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgMHgleCwgcmV0dXJuaW5nIE00Tk9fRVJST1IiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBUbXAgPSBwVGVtcDI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcFRtcCA9IHBQbGFuZU91dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogRG8gcmVuZGVyaW5nIG1vZGUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXBwbHlSZW5kZXJpbmdNb2RlKHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5wU2V0dGluZ3MtPnhWU1MuTWVkaWFSZW5kZXJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyUmVuZGVyRnJhbWUsIHBUbXApOwotICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogQXBwbHkgb3ZlcmxheSBpZiBvdmVybGF5IGlzIGV4aXN0ICovCi0gICAgICAgICAgICAgICAgcFRtcCA9IHBQbGFuZU91dDsKLSAgICAgICAgICAgICAgICBpZiAocEMtPmJDbGlwMUFjdGl2ZUZyYW1pbmdFZmZlY3QpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9PdmVybGF5KHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAyLCBwVG1wKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFZQUDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBcHBseVJlbmRlcmluZ01vZGUpIGVycm9yIDB4JXggIiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAocFRlbXAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9XaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIENvcHkgbGFzdCBkZWNvZGVkIHBsYW5lIHRvIG91dHB1dCBwbGFuZSAqLwotICAgICAgICAgICAgICAgIGlmIChwQy0+cEMxLT5sYXN0RGVjb2RlZFBsYW5lICE9IE00T1NBX05VTEwgJiYKLSAgICAgICAgICAgICAgICAgICAgcExhc3REZWNvZGVkRnJhbWUgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwTGFzdERlY29kZWRGcmFtZVswXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZVswXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChwTGFzdERlY29kZWRGcmFtZVswXS51X2hlaWdodCAqIHBMYXN0RGVjb2RlZEZyYW1lWzBdLnVfd2lkdGgpKTsKLQotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwTGFzdERlY29kZWRGcmFtZVsxXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZVsxXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChwTGFzdERlY29kZWRGcmFtZVsxXS51X2hlaWdodCAqIHBMYXN0RGVjb2RlZEZyYW1lWzFdLnVfd2lkdGgpKTsKLQotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwTGFzdERlY29kZWRGcmFtZVsyXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZVsyXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChwTGFzdERlY29kZWRGcmFtZVsyXS51X2hlaWdodCAqIHBMYXN0RGVjb2RlZEZyYW1lWzJdLnVfd2lkdGgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfRVJSX05PX1ZBTElEX1ZJRF9GUkFNRTsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzMoIkNhbiBub3QgZmluZCBhbiBpbnB1dCBmcmFtZS4gU2V0IGVycm9yIDB4JXggaW4gJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIsIF9fRklMRV9fLCBfX0xJTkVfXyk7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBUbXAgPSBwUGxhbmVPdXQ7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBDaGVjayBpZiB0aGVyZSBpcyBhIGVmZmVjdCAqLwotICAgICAgICAgICAgICAgIGlmKHBDLT5uYkFjdGl2ZUVmZmVjdHMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIEhlcmUgd2UgZG8gbm90IHNraXAgdGhlIG92ZXJsYXkgZWZmZWN0IHNpbmNlCi0gICAgICAgICAgICAgICAgICAgICAqIG92ZXJsYXkgYW5kIHZpZGVvIGFyZSBib3RoIG9mIHNhbWUgcmVzb2x1dGlvbiAqLwotICAgICAgICAgICAgICAgICAgICBiU2tpcEZyYW1lRWZmZWN0ID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0KHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExhc3REZWNvZGVkRnJhbWUsIHBUbXAsYlNraXBGcmFtZUVmZmVjdCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZSA9IHBUbXA7Ci0gICAgICAgIH0KLQotICAgICAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX2ludFZQUDogUmVuZGVyZWQgYXQgQ1RTICUuM2YiLCB0cyk7Ci0KLSAgICAgICAgZm9yIChpPTA7IGk8MzsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAocFRlbXAxW2ldLnBhY19kYXRhICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBUZW1wMVtpXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgcFRlbXAxW2ldLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmb3IgKGk9MDsgaTwzOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChwVGVtcDJbaV0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgIGZyZWUocFRlbXAyW2ldLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICBwVGVtcDJbaV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiAgICBSZXR1cm4gKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludFZQUDogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBcHBseVZpZGVvT3ZlcmxheSgpCi0gKiBAYnJpZWYgICAgQXBwbHkgdmlkZW8gb3ZlcmxheSBmcm9tIHBQbGFuZUluIHRvIHBQbGFuZU91dAotICogQHBhcmFtICAgIHBDICAgICAgICAgICAgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcElucHV0UGxhbmVzICAgIChJTikgSW5wdXQgcmF3IFlVVjQyMCBpbWFnZQotICogQHBhcmFtICAgIHBPdXRwdXRQbGFuZXMgICAoSU4vT1VUKSBPdXRwdXQgcmF3IFlVVjQyMCBpbWFnZQotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIKLU00VlNTM0dQUF9pbnRBcHBseVZpZGVvT3ZlcmxheSAoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkgewotCi0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcDsKLSAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MgKnBGeDsKLSAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyBleHRQcm9ncmVzczsKLSAgICBNNE9TQV9Eb3VibGUgVmlkZW9FZmZlY3RUaW1lOwotICAgIE00T1NBX0RvdWJsZSBQZXJjZW50YWdlRG9uZTsKLSAgICBNNE9TQV9VSW50OCBOdW1BY3RpdmVFZmZlY3RzID0wOwotICAgIE00T1NBX1VJbnQzMiBDdHMgPSAwOwotICAgIE00T1NBX0ludDMyIG5leHRFZmZlY3RUaW1lOwotICAgIE00T1NBX0ludDMyIHRtcDsKLSAgICBNNE9TQV9VSW50OCBpOwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBwQ2xpcCA9IHBDLT5wQzE7Ci0gICAgaWYgKHBDLT5iSXNzZWNvbmRDbGlwID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgTnVtQWN0aXZlRWZmZWN0cyA9IHBDLT5uYkFjdGl2ZUVmZmVjdHMxOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIE51bUFjdGl2ZUVmZmVjdHMgPSBwQy0+bmJBY3RpdmVFZmZlY3RzOwotICAgIH0KLSAgICBmb3IgKGk9MDsgaTxOdW1BY3RpdmVFZmZlY3RzOyBpKyspIHsKLSAgICAgICAgaWYgKHBDLT5iSXNzZWNvbmRDbGlwID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgICAgIHBGeCA9ICYocEMtPnBFZmZlY3RzTGlzdFtwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0MVtpXV0pOwotICAgICAgICAgICAgLyogQ29tcHV0ZSBob3cgZmFyIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZWZmZWN0IHdlIGFyZSwgaW4gY2xpcC1iYXNlIHRpbWUuICovCi0gICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgVmlkZW9FZmZlY3RUaW1lID0gKChNNE9TQV9JbnQzMilwQy0+ZXdjLmRJbnB1dFZpZEN0cykgKwotICAgICAgICAgICAgICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ3VycmVudENsaXBdLnVpVHJhbnNpdGlvbkR1cmF0aW9uIC0gcEZ4LT51aVN0YXJ0VGltZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBGeCA9ICYocEMtPnBFZmZlY3RzTGlzdFtwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0W2ldXSk7Ci0gICAgICAgICAgICAvKiBDb21wdXRlIGhvdyBmYXIgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBlZmZlY3Qgd2UgYXJlLCBpbiBjbGlwLWJhc2UgdGltZS4gKi8KLSAgICAgICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgICAgICBWaWRlb0VmZmVjdFRpbWUgPSAoKE00T1NBX0ludDMyKXBDLT5ld2MuZElucHV0VmlkQ3RzKSAtIHBGeC0+dWlTdGFydFRpbWU7Ci0gICAgICAgIH0KLSAgICAgICAgLyogRG8gdGhlIGZyYW1pbmcob3ZlcmxheSkgZWZmZWN0IG9ubHksCi0gICAgICAgICAqIHNraXAgb3RoZXIgY29sb3IgZWZmZWN0IHdoaWNoIGhhZCBiZWVuIGFwcGxpZWQgKi8KLSAgICAgICAgaWYgKHBGeC0+eFZTUy5wRnJhbWluZ0J1ZmZlciA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFRvIGNhbGN1bGF0ZSAlLCBzdWJzdHJhY3QgdGltZUluY3JlbWVudCBiZWNhdXNlIGVmZmVjdCBzaG91bGQgZmluaXNoCi0gICAgICAgICAqIG9uIHRoZSBsYXN0IGZyYW1lIHdoaWNoIGlzIHByZXNlbnRlZCBmcm9tIENUUyA9IGVvZi10aW1lSW5jcmVtZW50IHRpbGwgQ1RTID0gZW9mICovCi0gICAgICAgIFBlcmNlbnRhZ2VEb25lID0gVmlkZW9FZmZlY3RUaW1lIC8gKChNNE9TQV9GbG9hdClwRngtPnVpRHVyYXRpb24pOwotCi0gICAgICAgIGlmIChQZXJjZW50YWdlRG9uZSA8IDAuMCkgewotICAgICAgICAgICAgUGVyY2VudGFnZURvbmUgPSAwLjA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKFBlcmNlbnRhZ2VEb25lID4gMS4wKSB7Ci0gICAgICAgICAgICBQZXJjZW50YWdlRG9uZSA9IDEuMDsKLSAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgKiBDb21wdXRlIHdoZXJlIHdlIGFyZSBpbiB0aGUgZWZmZWN0IChzY2FsZSBpcyAwLT4xMDAwKSAqLwotICAgICAgICB0bXAgPSAoTTRPU0FfSW50MzIpKFBlcmNlbnRhZ2VEb25lICogMTAwMCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogU2V0IHRoZSBwcm9ncmVzcyBpbmZvIHByb3ZpZGVkIHRvIHRoZSBleHRlcm5hbCBmdW5jdGlvbiAqLwotICAgICAgICBleHRQcm9ncmVzcy51aVByb2dyZXNzID0gKE00T1NBX1VJbnQzMil0bXA7Ci0gICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgIGV4dFByb2dyZXNzLnVpT3V0cHV0VGltZSA9IChNNE9TQV9VSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHM7Ci0gICAgICAgIGV4dFByb2dyZXNzLnVpQ2xpcFRpbWUgPSBleHRQcm9ncmVzcy51aU91dHB1dFRpbWUgLSBwQ2xpcC0+aVZvZmZzZXQ7Ci0gICAgICAgIGV4dFByb2dyZXNzLmJJc0xhc3QgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgbmV4dEVmZmVjdFRpbWUgPSAoTTRPU0FfSW50MzIpKHBDLT5ld2MuZElucHV0VmlkQ3RzIFwKLSAgICAgICAgICAgICsgcEMtPmRPdXRwdXRGcmFtZUR1cmF0aW9uKTsKLSAgICAgICAgaWYgKG5leHRFZmZlY3RUaW1lID49IChNNE9TQV9JbnQzMikocEZ4LT51aVN0YXJ0VGltZSArIHBGeC0+dWlEdXJhdGlvbikpIHsKLSAgICAgICAgICAgIGV4dFByb2dyZXNzLmJJc0xhc3QgPSBNNE9TQV9UUlVFOwotICAgICAgICB9Ci0gICAgICAgIGVyciA9IHBGeC0+RXh0VmlkZW9FZmZlY3RGY3QocEZ4LT5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0LAotICAgICAgICAgICAgcFBsYW5lSW4sIHBQbGFuZU91dCwgJmV4dFByb2dyZXNzLAotICAgICAgICAgICAgcEZ4LT5WaWRlb0VmZmVjdFR5cGUgLSBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9FeHRlcm5hbCk7Ci0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9PdmVybGF5OiBcCi0gICAgICAgICAgICAgICAgRXh0ZXJuYWwgdmlkZW8gZWZmZWN0IGZ1bmN0aW9uIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiAgICBSZXR1cm4gKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9PdmVybGF5OiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9FZmZlY3QoKQotICogQGJyaWVmICAgIEFwcGx5IHZpZGVvIGVmZmVjdCBmcm9tIHBQbGFuZUluIHRvIHBQbGFuZU91dAotICogQHBhcmFtICAgcEMgICAgICAgICAgICAgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICB1aUNsaXAxb3JDbGlwMiAgICAoSU4vT1VUKSAxIGZvciBmaXJzdCBjbGlwLCAyIGZvciBzZWNvbmQgY2xpcAotICogQHBhcmFtICAgIHBJbnB1dFBsYW5lcyAgICAoSU4pIElucHV0IHJhdyBZVVY0MjAgaW1hZ2UKLSAqIEBwYXJhbSAgICBwT3V0cHV0UGxhbmVzICAgIChJTi9PVVQpIE91dHB1dCByYXcgWVVWNDIwIGltYWdlCi0gKiBAcGFyYW0gICAgYlNraXBGcmFtaW5nRWZmZWN0IChJTikgc2tpcCBmcmFtaW5nIGVmZmVjdCBmbGFnCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUgotTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9FZmZlY3QgKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQsCi0gICAgTTRPU0FfQm9vbCBiU2tpcEZyYW1pbmdFZmZlY3QpIHsKLQotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwOwotICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyAqcEZ4OwotICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzIGV4dFByb2dyZXNzOwotCi0gICAgTTRPU0FfRG91YmxlIFZpZGVvRWZmZWN0VGltZTsKLSAgICBNNE9TQV9Eb3VibGUgUGVyY2VudGFnZURvbmU7Ci0gICAgTTRPU0FfSW50MzIgdG1wOwotCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZVRlbXBJbjsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lVGVtcE91dDsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAgcFRlbXBZdXZQbGFuZVszXTsKLSAgICBNNE9TQV9VSW50OCBpOwotICAgIE00T1NBX1VJbnQ4IE51bUFjdGl2ZUVmZmVjdHMgPTA7Ci0KLQotICAgIHBDbGlwID0gcEMtPnBDMTsKLSAgICBpZiAocEMtPmJJc3NlY29uZENsaXAgPT0gTTRPU0FfVFJVRSkKLSAgICB7Ci0gICAgICAgIE51bUFjdGl2ZUVmZmVjdHMgPSBwQy0+bmJBY3RpdmVFZmZlY3RzMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTnVtQWN0aXZlRWZmZWN0cyA9IHBDLT5uYkFjdGl2ZUVmZmVjdHM7Ci0gICAgfQotCi0gICAgbWVtc2V0KCh2b2lkICopcFRlbXBZdXZQbGFuZSwgMCwgMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpKTsKLQotICAgIC8qKgotICAgICogQWxsb2NhdGUgdGVtcG9yYXJ5IHBsYW5lIGlmIG5lZWRlZCBSQyAqLwotICAgIGlmIChOdW1BY3RpdmVFZmZlY3RzID4gMSkgewotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAocFRlbXBZdXZQbGFuZSwgcFBsYW5lT3V0LT51X3dpZHRoLAotICAgICAgICAgICAgICAgICAgcFBsYW5lT3V0LT51X2hlaWdodCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0OiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAoNCkgcmV0dXJucyAweCV4LFwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICBNNE5PX0VSUk9SOyAvKio8IFJldHVybiBubyBlcnJvciB0byB0aGUgZW5jb2RlciBjb3JlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsc2UgaXQgbWF5IGxlYWsgaW4gc29tZSBzaXR1YXRpb25zLi4uKSAqLwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKE51bUFjdGl2ZUVmZmVjdHMgICUgMiA9PSAwKQotICAgIHsKLSAgICAgICAgcFBsYW5lVGVtcEluID0gcFBsYW5lSW47Ci0gICAgICAgIHBQbGFuZVRlbXBPdXQgPSBwVGVtcFl1dlBsYW5lOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwUGxhbmVUZW1wSW4gPSBwUGxhbmVJbjsKLSAgICAgICAgcFBsYW5lVGVtcE91dCA9IHBQbGFuZU91dDsKLSAgICB9Ci0KLSAgICBmb3IgKGk9MDsgaTxOdW1BY3RpdmVFZmZlY3RzOyBpKyspCi0gICAgewotICAgICAgICBpZiAocEMtPmJJc3NlY29uZENsaXAgPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgewotCi0KLSAgICAgICAgICAgIHBGeCA9ICYocEMtPnBFZmZlY3RzTGlzdFtwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0MVtpXV0pOwotICAgICAgICAgICAgLyogQ29tcHV0ZSBob3cgZmFyIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZWZmZWN0IHdlIGFyZSwgaW4gY2xpcC1iYXNlIHRpbWUuICovCi0gICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgVmlkZW9FZmZlY3RUaW1lID0gKChNNE9TQV9JbnQzMilwQy0+ZXdjLmRJbnB1dFZpZEN0cykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+dWlDdXJyZW50Q2xpcF0uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aVRyYW5zaXRpb25EdXJhdGlvbi0gcEZ4LT51aVN0YXJ0VGltZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBGeCA9ICYocEMtPnBFZmZlY3RzTGlzdFtwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0W2ldXSk7Ci0gICAgICAgICAgICAvKiBDb21wdXRlIGhvdyBmYXIgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBlZmZlY3Qgd2UgYXJlLCBpbiBjbGlwLWJhc2UgdGltZS4gKi8KLSAgICAgICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgICAgICBWaWRlb0VmZmVjdFRpbWUgPSAoKE00T1NBX0ludDMyKXBDLT5ld2MuZElucHV0VmlkQ3RzKSAtIHBGeC0+dWlTdGFydFRpbWU7Ci0gICAgICAgIH0KLQotCi0KLSAgICAgICAgLyogVG8gY2FsY3VsYXRlICUsIHN1YnN0cmFjdCB0aW1lSW5jcmVtZW50IGJlY2F1c2UgZWZmZWN0IHNob3VsZCBmaW5pc2ggb24gdGhlIGxhc3QgZnJhbWUqLwotICAgICAgICAvKiB3aGljaCBpcyBwcmVzZW50ZWQgZnJvbSBDVFMgPSBlb2YtdGltZUluY3JlbWVudCB0aWxsIENUUyA9IGVvZiAqLwotICAgICAgICBQZXJjZW50YWdlRG9uZSA9IFZpZGVvRWZmZWN0VGltZQotICAgICAgICAgICAgLyAoKE00T1NBX0Zsb2F0KXBGeC0+dWlEdXJhdGlvbi8qLSBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb24qLyk7Ci0KLSAgICAgICAgaWYoIFBlcmNlbnRhZ2VEb25lIDwgMC4wICkKLSAgICAgICAgICAgIFBlcmNlbnRhZ2VEb25lID0gMC4wOwotCi0gICAgICAgIGlmKCBQZXJjZW50YWdlRG9uZSA+IDEuMCApCi0gICAgICAgICAgICBQZXJjZW50YWdlRG9uZSA9IDEuMDsKLQotICAgICAgICBzd2l0Y2goIHBGeC0+VmlkZW9FZmZlY3RUeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9GYWRlRnJvbUJsYWNrOgotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQ29tcHV0ZSB3aGVyZSB3ZSBhcmUgaW4gdGhlIGVmZmVjdCAoc2NhbGUgaXMgMC0+MTAyNCkuICovCi0gICAgICAgICAgICAgICAgdG1wID0gKE00T1NBX0ludDMyKShQZXJjZW50YWdlRG9uZSAqIDEwMjQpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBBcHBseSB0aGUgZGFya2VuaW5nIGVmZmVjdCAqLwotICAgICAgICAgICAgICAgIGVyciA9Ci0gICAgICAgICAgICAgICAgICAgIE00VkZMX21vZGlmeUx1bWFXaXRoU2NhbGUoKE00VmlDb21JbWFnZVBsYW5lICopcFBsYW5lVGVtcEluLAotICAgICAgICAgICAgICAgICAgICAoTTRWaUNvbUltYWdlUGxhbmUgKilwUGxhbmVUZW1wT3V0LCB0bXAsIE00T1NBX05VTEwpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0OlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VkZMX21vZGlmeUx1bWFXaXRoU2NhbGUgcmV0dXJucyBlcnJvciAweCV4LFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0xVTUFfRklMVEVSX0VSUk9SIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0xVTUFfRklMVEVSX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9GYWRlVG9CbGFjazoKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIENvbXB1dGUgd2hlcmUgd2UgYXJlIGluIHRoZSBlZmZlY3QgKHNjYWxlIGlzIDAtPjEwMjQpICovCi0gICAgICAgICAgICAgICAgdG1wID0gKE00T1NBX0ludDMyKSgoIDEuMCAtIFBlcmNlbnRhZ2VEb25lKSAqIDEwMjQpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBBcHBseSB0aGUgZGFya2VuaW5nIGVmZmVjdCAqLwotICAgICAgICAgICAgICAgIGVyciA9Ci0gICAgICAgICAgICAgICAgICAgIE00VkZMX21vZGlmeUx1bWFXaXRoU2NhbGUoKE00VmlDb21JbWFnZVBsYW5lICopcFBsYW5lVGVtcEluLAotICAgICAgICAgICAgICAgICAgICAoTTRWaUNvbUltYWdlUGxhbmUgKilwUGxhbmVUZW1wT3V0LCB0bXAsIE00T1NBX05VTEwpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0OlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VkZMX21vZGlmeUx1bWFXaXRoU2NhbGUgcmV0dXJucyBlcnJvciAweCV4LFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0xVTUFfRklMVEVSX0VSUk9SIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0xVTUFfRklMVEVSX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBpZiggcEZ4LT5WaWRlb0VmZmVjdFR5cGUKLSAgICAgICAgICAgICAgICAgICAgPj0gTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRXh0ZXJuYWwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIEN0cyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIG5leHRFZmZlY3RUaW1lOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIENvbXB1dGUgd2hlcmUgd2UgYXJlIGluIHRoZSBlZmZlY3QgKHNjYWxlIGlzIDAtPjEwMDApICovCi0gICAgICAgICAgICAgICAgICAgIHRtcCA9IChNNE9TQV9JbnQzMikoUGVyY2VudGFnZURvbmUgKiAxMDAwKTsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBTZXQgdGhlIHByb2dyZXNzIGluZm8gcHJvdmlkZWQgdG8gdGhlIGV4dGVybmFsIGZ1bmN0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIGV4dFByb2dyZXNzLnVpUHJvZ3Jlc3MgPSAoTTRPU0FfVUludDMyKXRtcDsKLSAgICAgICAgICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgICAgICAgICAgZXh0UHJvZ3Jlc3MudWlPdXRwdXRUaW1lID0gKE00T1NBX1VJbnQzMilwQy0+ZXdjLmRJbnB1dFZpZEN0czsKLSAgICAgICAgICAgICAgICAgICAgZXh0UHJvZ3Jlc3MudWlDbGlwVGltZSA9IGV4dFByb2dyZXNzLnVpT3V0cHV0VGltZSAtIHBDbGlwLT5pVm9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgZXh0UHJvZ3Jlc3MuYklzTGFzdCA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgICAgICAgICBuZXh0RWZmZWN0VGltZSA9IChNNE9TQV9JbnQzMikocEMtPmV3Yy5kSW5wdXRWaWRDdHMgXAotICAgICAgICAgICAgICAgICAgICAgICAgKyBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICBpZihuZXh0RWZmZWN0VGltZSA+PSAoTTRPU0FfSW50MzIpKHBGeC0+dWlTdGFydFRpbWUgKyBwRngtPnVpRHVyYXRpb24pKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHRQcm9ncmVzcy5iSXNMYXN0ID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvKiBIZXJlIHNraXAgdGhlIGZyYW1pbmcgZWZmZWN0LAotICAgICAgICAgICAgICAgICAgICAgKiBkbyB0aGUgZnJhbWluZyBlZmZlY3QgYWZ0ZXIgYXBwbHkgcmVuZGVyaW5nIG1vZGUgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKChwRngtPnhWU1MucEZyYW1pbmdCdWZmZXIgIT0gTTRPU0FfTlVMTCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGJTa2lwRnJhbWluZ0VmZmVjdCA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkocFBsYW5lVGVtcE91dFswXS5wYWNfZGF0YSwgcFBsYW5lVGVtcEluWzBdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZVRlbXBJblswXS51X2hlaWdodCAqIHBQbGFuZVRlbXBJblswXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShwUGxhbmVUZW1wT3V0WzFdLnBhY19kYXRhLCBwUGxhbmVUZW1wSW5bMV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBsYW5lVGVtcEluWzFdLnVfaGVpZ2h0ICogcFBsYW5lVGVtcEluWzFdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHBQbGFuZVRlbXBPdXRbMl0ucGFjX2RhdGEsIHBQbGFuZVRlbXBJblsyXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmVUZW1wSW5bMl0udV9oZWlnaHQgKiBwUGxhbmVUZW1wSW5bMl0udV93aWR0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHBGeC0+RXh0VmlkZW9FZmZlY3RGY3QocEZ4LT5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZVRlbXBJbiwgcFBsYW5lVGVtcE91dCwgJmV4dFByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGeC0+VmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9FeHRlcm5hbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0OiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWwgdmlkZW8gZWZmZWN0IGZ1bmN0aW9uIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXBwbHlWaWRlb0VmZmVjdDogdW5rbm93biBlZmZlY3QgdHlwZSAoMHgleCksXAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19FRkZFQ1RfVFlQRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwRngtPlZpZGVvRWZmZWN0VHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOVkFMSURfVklERU9fRUZGRUNUX1RZUEU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAqIFJDIFVwZGF0ZXMgcFRlbXBQbGFuZUluIGFuZCBwVGVtcFBsYW5lT3V0IGRlcGVuZGluZyBvbiBjdXJyZW50IGVmZmVjdCAqLwotICAgICAgICBpZiAoKChpICUgMiA9PSAwKSAmJiAoTnVtQWN0aXZlRWZmZWN0cyAgJSAyID09IDApKQotICAgICAgICAgICAgfHwgKChpICUgMiAhPSAwKSAmJiAoTnVtQWN0aXZlRWZmZWN0cyAlIDIgIT0gMCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwUGxhbmVUZW1wSW4gPSBwVGVtcFl1dlBsYW5lOwotICAgICAgICAgICAgcFBsYW5lVGVtcE91dCA9IHBQbGFuZU91dDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBQbGFuZVRlbXBJbiA9IHBQbGFuZU91dDsKLSAgICAgICAgICAgIHBQbGFuZVRlbXBPdXQgPSBwVGVtcFl1dlBsYW5lOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yKGk9MDsgaTwzOyBpKyspIHsKLSAgICAgICAgaWYocFRlbXBZdXZQbGFuZVtpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICBmcmVlKHBUZW1wWXV2UGxhbmVbaV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgcFRlbXBZdXZQbGFuZVtpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqICAgIFJldHVybiAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50QXBwbHlWaWRlb0VmZmVjdDogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFZpZGVvVHJhbnNpdGlvbigpCi0gKiBAYnJpZWYgICAgQXBwbHkgdmlkZW8gdHJhbnNpdGlvbiBlZmZlY3QgcEMxK3BDMi0+cFBsYW5lT3V0Ci0gKiBAcGFyYW0gICBwQyAgICAgICAgICAgICAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICBwT3V0cHV0UGxhbmVzICAgIChJTi9PVVQpIE91dHB1dCByYXcgWVVWNDIwIGltYWdlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUgotTTRWU1MzR1BQX2ludFZpZGVvVHJhbnNpdGlvbiggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0ICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX0ludDMyIGlQcm9ncmVzczsKLSAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyBleHRQcm9ncmVzczsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lOwotICAgIE00T1NBX0ludDMyIGk7Ci0gICAgY29uc3QgTTRPU0FfSW50MzIgaUR1ciA9IChNNE9TQV9JbnQzMilwQy0+Ci0gICAgICAgIHBUcmFuc2l0aW9uTGlzdFtwQy0+dWlDdXJyZW50Q2xpcF0udWlUcmFuc2l0aW9uRHVyYXRpb247Ci0KLSAgICAvKioKLSAgICAqIENvbXB1dGUgaG93IGZhciBmcm9tIHRoZSBlbmQgY3V0IHdlIGFyZSwgaW4gY2xpcC1iYXNlIHRpbWUuCi0gICAgKiBJdCBpcyBkb25lIHdpdGggaW50ZWdlcnMgYmVjYXVzZSB0aGUgb2Zmc2V0IGFuZCBiZWdpbiBjdXQgaGF2ZSBiZWVuIHJvdW5kZWQgYWxyZWFkeS4gKi8KLSAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgIGlQcm9ncmVzcyA9IChNNE9TQV9JbnQzMikoKE00T1NBX0RvdWJsZSlwQy0+cEMxLT5pRW5kVGltZSkgLSBwQy0+ZXdjLmRJbnB1dFZpZEN0cyArCi0gICAgICAgICgoTTRPU0FfRG91YmxlKXBDLT5wQzEtPmlWb2Zmc2V0KTsKLSAgICAvKioKLSAgICAqIFdlIG11c3QgcmVtb3ZlIHRoZSBkdXJhdGlvbiBvZiBvbmUgZnJhbWUsIGVsc2Ugd2Ugd291bGQgYWxtb3N0IG5ldmVyIHJlYWNoIHRoZSBlbmQKLSAgICAqIChJdCdzIGtpbmQgb2YgYSAicGlsZSBhbmQgaW50ZXJ2YWxzIiBpc3N1ZSkuICovCi0gICAgaVByb2dyZXNzIC09IChNNE9TQV9JbnQzMilwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb247Ci0KLSAgICBpZiggaVByb2dyZXNzIDwgMCApIC8qKjwgU2FuaXR5IGNoZWNrcyAqLwotICAgIHsKLSAgICAgICAgaVByb2dyZXNzID0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENvbXB1dGUgd2hlcmUgd2UgYXJlIGluIHRoZSB0cmFuc2l0aW9uLCBvbiBhIGJhc2UgMTAwMCAqLwotICAgIGlQcm9ncmVzcyA9ICggKCBpRHVyIC0gaVByb2dyZXNzKSAqIDEwMDApIC8gaUR1cjsKLQotICAgIC8qKgotICAgICogU2FuaXR5IGNoZWNrcyAqLwotICAgIGlmKCBpUHJvZ3Jlc3MgPCAwICkKLSAgICB7Ci0gICAgICAgIGlQcm9ncmVzcyA9IDA7Ci0gICAgfQotICAgIGVsc2UgaWYoIGlQcm9ncmVzcyA+IDEwMDAgKQotICAgIHsKLSAgICAgICAgaVByb2dyZXNzID0gMTAwMDsKLSAgICB9Ci0KLSAgICBzd2l0Y2goIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ3VycmVudENsaXBdLlRyYW5zaXRpb25CZWhhdmlvdXIgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfVHJhbnNpdGlvbkJlaGF2aW91cl9TcGVlZFVwOgotICAgICAgICAgICAgaVByb2dyZXNzID0gKCBpUHJvZ3Jlc3MgKiBpUHJvZ3Jlc3MpIC8gMTAwMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX1RyYW5zaXRpb25CZWhhdmlvdXJfTGluZWFyOgotICAgICAgICAgICAgLypkbyBub3RoaW5nKi8KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX1RyYW5zaXRpb25CZWhhdmlvdXJfU3BlZWREb3duOgotICAgICAgICAgICAgaVByb2dyZXNzID0gKE00T1NBX0ludDMyKShzcXJ0KGlQcm9ncmVzcyAqIDEwMDApKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX1RyYW5zaXRpb25CZWhhdmlvdXJfU2xvd01pZGRsZToKLSAgICAgICAgICAgIGlmKCBpUHJvZ3Jlc3MgPCA1MDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlQcm9ncmVzcyA9IChNNE9TQV9JbnQzMikoc3FydChpUHJvZ3Jlc3MgKiA1MDApKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpUHJvZ3Jlc3MgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKCggKCAoIGlQcm9ncmVzcyAtIDUwMCkgKiAoaVByb2dyZXNzIC0gNTAwKSkKLSAgICAgICAgICAgICAgICAgICAgLyA1MDApICsgNTAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX1RyYW5zaXRpb25CZWhhdmlvdXJfRmFzdE1pZGRsZToKLSAgICAgICAgICAgIGlmKCBpUHJvZ3Jlc3MgPCA1MDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlQcm9ncmVzcyA9IChNNE9TQV9JbnQzMikoKCBpUHJvZ3Jlc3MgKiBpUHJvZ3Jlc3MpIC8gNTAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpUHJvZ3Jlc3MgPSAoTTRPU0FfSW50MzIpKHNxcnQoKCBpUHJvZ3Jlc3MgLSA1MDApICogNTAwKSArIDUwMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLypkbyBub3RoaW5nKi8KLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHN3aXRjaCggcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+dWlDdXJyZW50Q2xpcF0uVmlkZW9UcmFuc2l0aW9uVHlwZSApCi0gICAgewotICAgICAgICBjYXNlIE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9Dcm9zc0ZhZGU6Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQXBwbHkgdGhlIHRyYW5zaXRpb24gZWZmZWN0ICovCi0gICAgICAgICAgICBlcnIgPSBNNFZJRklfSW1hZ2VCbGVuZGluZ29uWVVWNDIwKE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgKE00VmlDb21JbWFnZVBsYW5lICopcEMtPnl1djEsCi0gICAgICAgICAgICAgICAgKE00VmlDb21JbWFnZVBsYW5lICopcEMtPnl1djIsCi0gICAgICAgICAgICAgICAgKE00VmlDb21JbWFnZVBsYW5lICopcFBsYW5lT3V0LCBpUHJvZ3Jlc3MpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFZpZGVvVHJhbnNpdGlvbjpcCi0gICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VCbGVuZGluZ29uWVVWNDIwIHJldHVybnMgZXJyb3IgMHgleCxcCi0gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX1RSQU5TSVRJT05fRklMVEVSX0VSUk9SIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9UUkFOU0lUSU9OX0ZJTFRFUl9FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tWaWRlb1RyYW5zaXRpb25UeXBlX05vbmU6Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVGhpcyBpcyBhIHN0dXBpZC1ub24gb3B0aW1pemVkIHZlcnNpb24gb2YgdGhlIE5vbmUgdHJhbnNpdGlvbi4uLgotICAgICAgICAgICAgKiBXZSBjb3B5IHRoZSBZVVYgZnJhbWUgKi8KLSAgICAgICAgICAgIGlmKCBpUHJvZ3Jlc3MgPCA1MDAgKSAvKio8IGZpcnN0IGhhbGYgb2YgdHJhbnNpdGlvbiAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBQbGFuZSA9IHBDLT55dXYxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSAvKio8IHNlY29uZCBoYWxmIG9mIHRyYW5zaXRpb24gKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwUGxhbmUgPSBwQy0+eXV2MjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBDb3B5IHRoZSBpbnB1dCBZVVYgZnJhbWVzICovCi0gICAgICAgICAgICBpID0gMzsKLQotICAgICAgICAgICAgd2hpbGUoIGktLSA+IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBQbGFuZU91dFtpXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgKHZvaWQgKilwUGxhbmVbaV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dFtpXS51X3N0cmlkZSAqIHBQbGFuZU91dFtpXS51X2hlaWdodCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaWYoIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ3VycmVudENsaXBdLlZpZGVvVHJhbnNpdGlvblR5cGUKLSAgICAgICAgICAgICAgICA+PSBNNFZTUzNHUFBfa1ZpZGVvVHJhbnNpdGlvblR5cGVfRXh0ZXJuYWwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogU2V0IHRoZSBwcm9ncmVzcyBpbmZvIHByb3ZpZGVkIHRvIHRoZSBleHRlcm5hbCBmdW5jdGlvbiAqLwotICAgICAgICAgICAgICAgIGV4dFByb2dyZXNzLnVpUHJvZ3Jlc3MgPSAoTTRPU0FfVUludDMyKWlQcm9ncmVzczsKLSAgICAgICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgICAgIGV4dFByb2dyZXNzLnVpT3V0cHV0VGltZSA9IChNNE9TQV9VSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHM7Ci0gICAgICAgICAgICAgICAgZXh0UHJvZ3Jlc3MudWlDbGlwVGltZSA9IGV4dFByb2dyZXNzLnVpT3V0cHV0VGltZSAtIHBDLT5wQzEtPmlWb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+Ci0gICAgICAgICAgICAgICAgICAgIHVpQ3VycmVudENsaXBdLkV4dFZpZGVvVHJhbnNpdGlvbkZjdCgKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+Ci0gICAgICAgICAgICAgICAgICAgIHVpQ3VycmVudENsaXBdLnBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0LAotICAgICAgICAgICAgICAgICAgICBwQy0+eXV2MSwgcEMtPnl1djIsIHBQbGFuZU91dCwgJmV4dFByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICBwQy0+cFRyYW5zaXRpb25MaXN0W3BDLT4KLSAgICAgICAgICAgICAgICAgICAgdWlDdXJyZW50Q2xpcF0uVmlkZW9UcmFuc2l0aW9uVHlwZQotICAgICAgICAgICAgICAgICAgICAtIE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9FeHRlcm5hbCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFZpZGVvVHJhbnNpdGlvbjpcCi0gICAgICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbCB2aWRlbyB0cmFuc2l0aW9uIGZ1bmN0aW9uIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50VmlkZW9UcmFuc2l0aW9uOiB1bmtub3duIHRyYW5zaXRpb24gdHlwZSAoMHgleCksXAotICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9JTlZBTElEX1ZJREVPX1RSQU5TSVRJT05fVFlQRSIsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ3VycmVudENsaXBdLlZpZGVvVHJhbnNpdGlvblR5cGUpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOVkFMSURfVklERU9fVFJBTlNJVElPTl9UWVBFOwotICAgICAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogICAgUmV0dXJuICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRWaWRlb1RyYW5zaXRpb246IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50VXBkYXRlVGltZUluZm8oKQotICogQGJyaWVmICAgIFVwZGF0ZSBiaXQgc3RyZWFtIHRpbWUgaW5mbyBieSBDb3VudGVyIFRpbWUgU3lzdGVtIHRvIGJlIGNvbXBsaWFudCB3aXRoCi0gKiAgICAgICAgICBwbGF5ZXJzIHVzaW5nIGJpdCBzdHJlYW0gdGltZSBpbmZvCi0gKiBAbm90ZSAgICBIMjYzIHVzZXMgYW4gYWJzb2x1dGUgdGltZSBjb3VudGVyIHVubGlrZSBNUEVHNCB3aGljaCB1c2VzIEdyb3VwIE9mIFZvcHMKLSAqICAgICAgICAgIChHT1YsIHNlZSB0aGUgc3RhbmRhcmQpCi0gKiBAcGFyYW0gICBwQyAgICAgICAgICAgICAgICAgICAgKElOL09VVCkgcmV0dXJucyB0aW1lIHVwZGF0ZWQgdmlkZW8gQVUsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG9mZnNldCBiZXR3ZWVuIHN5c3RlbSBhbmQgdmlkZW8gdGltZSAoTVBFRzQgb25seSkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IGNsaXAgKE1QRUc0IG9ubHkpCi0gKiBAcmV0dXJuICAgIG5vdGhpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX1ZvaWQKLU00VlNTM0dQUF9pbnRVcGRhdGVUaW1lSW5mbyggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQgKnBBVSApCi17Ci0gICAgTTRPU0FfVUludDggdWlUbXA7Ci0gICAgTTRPU0FfVUludDMyIHVpQ3RzID0gMDsKLSAgICBNNE9TQV9NZW1BZGRyOCBwVG1wOwotICAgIE00T1NBX1VJbnQzMiB1aUFkZDsKLSAgICBNNE9TQV9VSW50MzIgdWlDdXJyR292OwotICAgIE00T1NBX0ludDggaURpZmY7Ci0KLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCA9IHBDLT5wQzE7Ci0gICAgTTRPU0FfSW50MzIgKnBPZmZzZXQgPSAmKHBDLT5ld2MuaU1wZWc0R292T2Zmc2V0KTsKLQotICAgIC8qKgotICAgICogU2V0IEgyNjMgdGltZSBjb3VudGVyIGZyb20gc3lzdGVtIHRpbWUgKi8KLSAgICBpZiggTTRTWVNfa0gyNjMgPT0gcEFVLT5zdHJlYW0tPnN0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgdWlUbXAgPSAoTTRPU0FfVUludDgpKChNNE9TQV9VSW50MzIpKCAoIHBBVS0+Q1RTICogMzApIC8gMTAwMSArIDAuNSkKLSAgICAgICAgICAgICUgTTRWU1MzR1BQX0VESVRfSDI2M19NT0RVTE9fVElNRSk7Ci0gICAgICAgIE00VlNTM0dQUF9pbnRTZXRIMjYzVGltZUNvdW50ZXIoKE00T1NBX01lbUFkZHI4KShwQVUtPmRhdGFBZGRyZXNzKSwKLSAgICAgICAgICAgIHVpVG1wKTsKLSAgICB9Ci0gICAgLyoKLSAgICAqIFNldCBNUEVHNCBHT1YgdGltZSBjb3VudGVyIHJlZ2FyZGluZyB2aWRlbyBhbmQgc3lzdGVtIHRpbWUgKi8KLSAgICBlbHNlIGlmKCBNNFNZU19rTVBFR180ID09IHBBVS0+c3RyZWFtLT5zdHJlYW1UeXBlICkKLSAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICogSWYgR09WLgotICAgICAgICAqIGJld2FyZSBvZiBsaXR0bGUvYmlnIGVuZGlhbiEgKi8KLSAgICAgICAgLyogY29ycmVjdGlvbjogcmVhZCA4IGJpdHMgYmxvY2sgaW5zdGVhZCBvZiBvbmUgMzIgYml0cyBibG9jayAqLwotICAgICAgICBNNE9TQV9VSW50OCAqdGVtcDggPSAoTTRPU0FfVUludDggKikocEFVLT5kYXRhQWRkcmVzcyk7Ci0gICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wMzIgPSAwOwotCi0gICAgICAgIHRlbXAzMiA9ICggMHgwMDAwMDBmZiAmIChNNE9TQV9VSW50MzIpKCp0ZW1wOCkpCi0gICAgICAgICAgICArICgweDAwMDBmZjAwICYgKChNNE9TQV9VSW50MzIpKCoodGVtcDggKyAxKSkpIDw8IDgpCi0gICAgICAgICAgICArICgweDAwZmYwMDAwICYgKChNNE9TQV9VSW50MzIpKCoodGVtcDggKyAyKSkpIDw8IDE2KQotICAgICAgICAgICAgKyAoMHhmZjAwMDAwMCAmICgoTTRPU0FfVUludDMyKSgqKHRlbXA4ICsgMykpKSA8PCAyNCk7Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UzXzIoIlJDOiBUZW1wMzI6IDB4JXgsIGRhdGFBZGRyZXNzOiAweCV4XG4iLCB0ZW1wMzIsCi0gICAgICAgICAgICAqKHBBVS0+ZGF0YUFkZHJlc3MpKTsKLQotICAgICAgICBpZiggTTRWU1MzR1BQX0VESVRfR09WX0hFQURFUiA9PSB0ZW1wMzIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwVG1wID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpKHBBVS0+ZGF0YUFkZHJlc3MKLSAgICAgICAgICAgICAgICArIDEpOyAvKio8IEp1bXAgdG8gdGhlIHRpbWUgY29kZSAoanVzdCBhZnRlciB0aGUgMzIgYml0cyBoZWFkZXIpICovCi0gICAgICAgICAgICB1aUFkZCA9IChNNE9TQV9VSW50MzIpKHBBVS0+Q1RTKSsoICpwT2Zmc2V0KTsKLQotICAgICAgICAgICAgc3dpdGNoKCBwQ2xpcEN0eHQtPmJNcGVnNEdvdlN0YXRlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIE00T1NBX0ZBTFNFOiAvKjwgSU5JVCAqLwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiB2aWRlbyB0aW1lID0gY2VpbCAoc3lzdGVtIHRpbWUgKyBvZmZzZXQpICovCi0gICAgICAgICAgICAgICAgICAgICAgICB1aUN0cyA9ICggdWlBZGQgKyA5OTkpIC8gMTAwMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogb2Zmc2V0IHVwZGF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKCAqcE9mZnNldCkgKz0gKCggdWlDdHMgKiAxMDAwKSAtIHVpQWRkKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogU2F2ZSB2YWx1ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+dWlNcGVnNFByZXZHb3ZWYWx1ZVNldCA9IHVpQ3RzOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBTdGF0ZSB0byAnZmlyc3QnICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPmJNcGVnNEdvdlN0YXRlID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRPU0FfVFJVRTogLyo8IFVQREFURSAqLwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgY3VycmVudCBHb3YgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRHZXRNUEVHNEdvdihwVG1wLCAmdWlDdXJyR292KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogdmlkZW8gdGltZSA9IGZsb29yIG9yIGNlaWwgKHN5c3RlbSB0aW1lICsgb2Zmc2V0KSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgdWlDdHMgPSAodWlBZGQgLyAxMDAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlEaWZmID0gKE00T1NBX0ludDgpKHVpQ3VyckdvdgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcENsaXBDdHh0LT51aU1wZWc0UHJldkdvdlZhbHVlR2V0IC0gdWlDdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBDbGlwQ3R4dC0+dWlNcGVnNFByZXZHb3ZWYWx1ZVNldCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNlaWxpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBpRGlmZiA+IDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpQ3RzICs9IChNNE9TQV9VSW50MzIpKGlEaWZmKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9mZnNldCB1cGRhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICpwT2Zmc2V0KSArPSAoKCB1aUN0cyAqIDEwMDApIC0gdWlBZGQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBTYXZlIHZhbHVlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT51aU1wZWc0UHJldkdvdlZhbHVlR2V0ID0gdWlDdXJyR292OwotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT51aU1wZWc0UHJldkdvdlZhbHVlU2V0ID0gdWlDdHM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE00VlNTM0dQUF9pbnRTZXRNUEVHNEdvdihwVG1wLCB1aUN0cyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludENoZWNrVmlkZW9FZmZlY3RzKCkKLSAqIEBicmllZiAgICBDaGVjayB3aGljaCB2aWRlbyBlZmZlY3QgbXVzdCBiZSBhcHBsaWVkIGF0IHRoZSBjdXJyZW50IHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX1ZvaWQKLU00VlNTM0dQUF9pbnRDaGVja1ZpZGVvRWZmZWN0cyggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IHVpQ2xpcE51bWJlciApCi17Ci0gICAgTTRPU0FfVUludDggdWlDbGlwSW5kZXg7Ci0gICAgTTRPU0FfVUludDggdWlGeEluZGV4LCBpOwotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXA7Ci0gICAgTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzICpwRng7Ci0gICAgTTRPU0FfSW50MzIgT2ZmLCBCQywgRUM7Ci0gICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICBNNE9TQV9JbnQzMiB0ID0gKE00T1NBX0ludDMyKXBDLT5ld2MuZElucHV0VmlkQ3RzOwotCi0gICAgdWlDbGlwSW5kZXggPSBwQy0+dWlDdXJyZW50Q2xpcDsKLSAgICBpZiAodWlDbGlwTnVtYmVyID09IDEpIHsKLSAgICAgICAgcENsaXAgPSBwQy0+cEMxOwotICAgICAgICBwQy0+YkNsaXAxQWN0aXZlRnJhbWluZ0VmZmVjdCA9IE00T1NBX0ZBTFNFOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBDbGlwID0gcEMtPnBDMjsKLSAgICAgICAgcEMtPmJDbGlwMkFjdGl2ZUZyYW1pbmdFZmZlY3QgPSBNNE9TQV9GQUxTRTsKLSAgICB9Ci0gICAgLyoqCi0gICAgKiBTaG9ydGN1dHMgZm9yIGNvZGUgcmVhZGFiaWxpdHkgKi8KLSAgICBPZmYgPSBwQ2xpcC0+aVZvZmZzZXQ7Ci0gICAgQkMgPSBwQ2xpcC0+aUFjdHVhbFZpZGVvQmVnaW5DdXQ7Ci0gICAgRUMgPSBwQ2xpcC0+aUVuZFRpbWU7Ci0KLSAgICBpID0gMDsKLQotICAgIGZvciAoIHVpRnhJbmRleCA9IDA7IHVpRnhJbmRleCA8IHBDLT5uYkVmZmVjdHM7IHVpRnhJbmRleCsrICkKLSAgICB7Ci0gICAgICAgIC8qKiBTaG9ydGN1dCwgcmV2ZXJzZSBvcmRlciBiZWNhdXNlIG9mIHByaW9yaXR5IGJldHdlZW4gZWZmZWN0cyhFbmRFZmZlY3QgYWx3YXlzIGNsZWFuICkqLwotICAgICAgICBwRnggPSAmKHBDLT5wRWZmZWN0c0xpc3RbcEMtPm5iRWZmZWN0cyAtIDEgLSB1aUZ4SW5kZXhdKTsKLQotICAgICAgICBpZiggTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfTm9uZSAhPSBwRngtPlZpZGVvRWZmZWN0VHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBDaGVjayBpZiB0aGVyZSBpcyBhY3R1YWxseSBhIHZpZGVvIGVmZmVjdCAqLwotCi0gICAgICAgICAgICAgaWYodWlDbGlwTnVtYmVyID09MSkKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqPCBBcmUgd2UgYWZ0ZXIgdGhlIHN0YXJ0IHRpbWUgb2YgdGhlIGVmZmVjdD8KLSAgICAgICAgICAgICAgICAgKiBvciBBcmUgd2UgaW50byB0aGUgZWZmZWN0IGR1cmF0aW9uPwotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmICggKHQgPj0gKE00T1NBX0ludDMyKShwRngtPnVpU3RhcnRUaW1lKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgKHQgPD0gKE00T1NBX0ludDMyKShwRngtPnVpU3RhcnRUaW1lICsgcEZ4LT51aUR1cmF0aW9uKSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiBTZXQgdGhlIGFjdGl2ZSBlZmZlY3QocykgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBBY3RpdmVFZmZlY3RzTGlzdFtpXSA9IHBDLT5uYkVmZmVjdHMtMS11aUZ4SW5kZXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIFVwZGF0ZSBjb3VudGVyIG9mIGFjdGl2ZSBlZmZlY3RzICovCi0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBGeC0+eFZTUy5wRnJhbWluZ0J1ZmZlciAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+YkNsaXAxQWN0aXZlRnJhbWluZ0VmZmVjdCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICogRm9yIGFsbCBleHRlcm5hbCBlZmZlY3RzIHNldCB0aGlzIGZsYWcgdG8gdHJ1ZS4gKi8KLSAgICAgICAgICAgICAgICAgICAgaWYocEZ4LT5WaWRlb0VmZmVjdFR5cGUgPiBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9FeHRlcm5hbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fYkNsaXBFeHRlcm5hbEhhc1N0YXJ0ZWQgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqPCBBcmUgd2UgaW50byB0aGUgZWZmZWN0IGR1cmF0aW9uPyAqLwotICAgICAgICAgICAgICAgIGlmICggKChNNE9TQV9JbnQzMikodCArIHBDLT5wVHJhbnNpdGlvbkxpc3RbdWlDbGlwSW5kZXhdLnVpVHJhbnNpdGlvbkR1cmF0aW9uKQotICAgICAgICAgICAgICAgICAgICA+PSAoTTRPU0FfSW50MzIpKHBGeC0+dWlTdGFydFRpbWUpKQotICAgICAgICAgICAgICAgICAgICAmJiAoIChNNE9TQV9JbnQzMikodCArIHBDLT5wVHJhbnNpdGlvbkxpc3RbdWlDbGlwSW5kZXhdLnVpVHJhbnNpdGlvbkR1cmF0aW9uKQotICAgICAgICAgICAgICAgICAgICA8PSAoTTRPU0FfSW50MzIpKHBGeC0+dWlTdGFydFRpbWUgKyBwRngtPnVpRHVyYXRpb24pKSApIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIFNldCB0aGUgYWN0aXZlIGVmZmVjdChzKSAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0MVtpXSA9IHBDLT5uYkVmZmVjdHMtMS11aUZ4SW5kZXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIFVwZGF0ZSBjb3VudGVyIG9mIGFjdGl2ZSBlZmZlY3RzICovCi0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBGeC0+eFZTUy5wRnJhbWluZ0J1ZmZlciAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+YkNsaXAyQWN0aXZlRnJhbWluZ0VmZmVjdCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIEZvciBhbGwgZXh0ZXJuYWwgZWZmZWN0cyBzZXQgdGhpcyBmbGFnIHRvIHRydWUuICovCi0gICAgICAgICAgICAgICAgICAgIGlmKHBGeC0+VmlkZW9FZmZlY3RUeXBlID4gTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRXh0ZXJuYWwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX2JDbGlwRXh0ZXJuYWxIYXNTdGFydGVkID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiBUaGUgdGhpcmQgZWZmZWN0IGhhcyB0aGUgaGlnaGVzdCBwcmlvcml0eSwgdGhlbiB0aGUgc2Vjb25kIG9uZSwgdGhlbiB0aGUgZmlyc3Qgb25lLgotICAgICAgICAgICAgICAgICAgICAgKiBIZW5jZSwgYXMgc29vbiBhcyB3ZSBmb3VuZCBhbiBhY3RpdmUgZWZmZWN0LCB3ZSBjYW4gZ2V0IG91dCBvZiB0aGlzIGxvb3AgKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTRWSURFT0VESVRJTkdfa0gyNjQgIT0KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUpIHsKLQotICAgICAgICAgICAgICAgICAgICAvLyBGb3IgTXBlZzQgYW5kIEgyNjMgY2xpcHMsIGZ1bGwgZGVjb2RlIGVuY29kZSBub3QgcmVxdWlyZWQKLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fYkNsaXBFeHRlcm5hbEhhc1N0YXJ0ZWQgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZigxPT11aUNsaXBOdW1iZXIpCi0gICAgewotICAgIC8qKgotICAgICAqIFNhdmUgbnVtYmVyIG9mIGFjdGl2ZSBlZmZlY3RzICovCi0gICAgICAgIHBDLT5uYkFjdGl2ZUVmZmVjdHMgPSBpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwQy0+bmJBY3RpdmVFZmZlY3RzMSA9IGk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGFuZ2UgdGhlIGFic29sdXQgdGltZSB0byBjbGlwIHJlbGF0ZWQgdGltZSAqLwotICAgIHQgLT0gT2ZmOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiB3ZSBhcmUgb24gdGhlIGJlZ2luIGN1dCAoZm9yIGNsaXAxIG9ubHkpICovCi0gICAgaWYoICggMCAhPSBCQykgJiYgKHQgPT0gQkMpICYmICgxID09IHVpQ2xpcE51bWJlcikgKQotICAgIHsKLSAgICAgICAgcEMtPmJDbGlwMUF0QmVnaW5DdXQgPSBNNE9TQV9UUlVFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwQy0+YkNsaXAxQXRCZWdpbkN1dCA9IE00T1NBX0ZBTFNFOwotICAgIH0KLQotICAgIHJldHVybjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENyZWF0ZVZpZGVvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgQ3JlYXRlcyB0aGUgdmlkZW8gZW5jb2RlcgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXIoIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNEVOQ09ERVJfQWR2YW5jZWRQYXJhbXMgRW5jUGFyYW1zOwotCi0gICAgLyoqCi0gICAgKiBTaW11bGF0ZSBhIHdyaXRlciBpbnRlcmZhY2Ugd2l0aCBvdXIgc3BlY2lmaWMgZnVuY3Rpb24gKi8KLSAgICBwQy0+ZXdjLk91cldyaXRlckRhdGFJbnRlcmZhY2UucFByb2Nlc3NBVSA9Ci0gICAgICAgIE00VlNTM0dQUF9pbnRQcm9jZXNzQVU7IC8qKjwgVGhpcyBmdW5jdGlvbiBpcyBWU1MgM0dQUCBzcGVjaWZpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IGl0IGZvbGxvdyB0aGUgd3JpdGVyIGludGVyZmFjZSAqLwotICAgIHBDLT5ld2MuT3VyV3JpdGVyRGF0YUludGVyZmFjZS5wU3RhcnRBVSA9Ci0gICAgICAgIE00VlNTM0dQUF9pbnRTdGFydEFVOyAvKio8IFRoaXMgZnVuY3Rpb24gaXMgVlNTIDNHUFAgc3BlY2lmaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXQgaXQgZm9sbG93IHRoZSB3cml0ZXIgaW50ZXJmYWNlICovCi0gICAgcEMtPmV3Yy5PdXJXcml0ZXJEYXRhSW50ZXJmYWNlLnBXcml0ZXJDb250ZXh0ID0KLSAgICAgICAgKE00V1JJVEVSX0NvbnRleHQpCi0gICAgICAgIHBDOyAvKio8IFdlIGdpdmUgdGhlIGludGVybmFsIGNvbnRleHQgYXMgd3JpdGVyIGNvbnRleHQgKi8KLQotICAgIC8qKgotICAgICogR2V0IHRoZSBlbmNvZGVyIGludGVyZmFjZSwgaWYgbm90IGFscmVhZHkgZG9uZSAqLwotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cyApCi0gICAgewotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfc2V0Q3VycmVudFZpZGVvRW5jb2RlcigmcEMtPlNoZWxsQVBJLAotICAgICAgICAgICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUpOwotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyOiBzZXRDdXJyZW50RW5jb2RlciByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBTZXQgZW5jb2RlciBzaGVsbCBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byBWU1Mgc2V0dGluZ3MgKi8KLQotICAgIC8qIENvbW1vbiBwYXJhbWV0ZXJzICovCi0gICAgRW5jUGFyYW1zLklucHV0Rm9ybWF0ID0gTTRFTkNPREVSX2tJWVVWNDIwOwotICAgIEVuY1BhcmFtcy5GcmFtZVdpZHRoID0gcEMtPmV3Yy51aVZpZGVvV2lkdGg7Ci0gICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gcEMtPmV3Yy51aVZpZGVvSGVpZ2h0OwotICAgIEVuY1BhcmFtcy51aVRpbWVTY2FsZSA9IHBDLT5ld2MudWlWaWRlb1RpbWVTY2FsZTsKLQotICAgIGlmKCBwQy0+YklzTU1TID09IE00T1NBX0ZBTFNFICkKLSAgICB7Ci0gICAgICAgIC8qIE5vIHN0cmljdCByZWd1bGF0aW9uIGluIHZpZGVvIGVkaXRvciAqLwotICAgICAgICAvKiBCZWNhdXNlIG9mIHRoZSBlZmZlY3RzIGFuZCB0cmFuc2l0aW9ucyB3ZSBzaG91bGQgYWxsb3cgbW9yZSBmbGV4aWJpbGl0eSAqLwotICAgICAgICAvKiBBbHNvIGl0IHByZXZlbnRzIHRvIGRyb3AgaW1wb3J0YW50IGZyYW1lcyAod2l0aCBhIGJhZCByZXN1bHQgb24gc2hlZHVsaW5nIGFuZAotICAgICAgICBibG9jayBlZmZldGNzKSAqLwotICAgICAgICBFbmNQYXJhbXMuYkludGVybmFsUmVndWxhdGlvbiA9IE00T1NBX0ZBTFNFOwotICAgICAgICAvLyBWYXJpYWJsZSBmcmFtZXJhdGUgaXMgbm90IHN1cHBvcnRlZCBieSBTdGFnZUZyaWdodCBlbmNvZGVycwotICAgICAgICBFbmNQYXJhbXMuRnJhbWVSYXRlID0gTTRFTkNPREVSX2szMF9GUFM7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIEluIGNhc2Ugb2YgTU1TIG1vZGUsIHdlIG5lZWQgdG8gZW5hYmxlIGJpdHJhdGUgcmVndWxhdGlvbiB0byBiZSBzdXJlICovCi0gICAgICAgIC8qIHRvIHJlYWNoIHRoZSB0YXJnZXRlZCBvdXRwdXQgZmlsZSBzaXplICovCi0gICAgICAgIEVuY1BhcmFtcy5iSW50ZXJuYWxSZWd1bGF0aW9uID0gTTRPU0FfVFJVRTsKLSAgICAgICAgRW5jUGFyYW1zLkZyYW1lUmF0ZSA9IHBDLT5NTVN2aWRlb0ZyYW1lcmF0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIE90aGVyIGVuY29kZXIgc2V0dGluZ3MgKGRlZmF1bHRzKSAqLwotICAgIEVuY1BhcmFtcy51aUhvcml6b250YWxTZWFyY2hSYW5nZSA9IDA7ICAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgIEVuY1BhcmFtcy51aVZlcnRpY2FsU2VhcmNoUmFuZ2UgPSAwOyAgICAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgIEVuY1BhcmFtcy5iRXJyb3JSZXNpbGllbmNlID0gTTRPU0FfRkFMU0U7ICAvKiBubyBlcnJvciByZXNpbGllbmNlICovCi0gICAgRW5jUGFyYW1zLnVpSVZvcFBlcmlvZCA9IDA7ICAgICAgICAgICAgICAgIC8qIHVzZSBkZWZhdWx0ICovCi0gICAgRW5jUGFyYW1zLnVpTW90aW9uRXN0aW1hdGlvblRvb2xzID0gMDsgICAgIC8qIE00Vl9NT1RJT05fRVNUX1RPT0xTX0FMTCAqLwotICAgIEVuY1BhcmFtcy5iQWNQcmVkaWN0aW9uID0gTTRPU0FfVFJVRTsgICAgICAvKiB1c2UgQUMgcHJlZGljdGlvbiAqLwotICAgIEVuY1BhcmFtcy51aVN0YXJ0aW5nUXVhbnRpemVyVmFsdWUgPSAxMDsgICAvKiBpbml0aWFsIFFQID0gMTAgKi8KLSAgICBFbmNQYXJhbXMuYkRhdGFQYXJ0aXRpb25pbmcgPSBNNE9TQV9GQUxTRTsgLyogbm8gZGF0YSBwYXJ0aXRpb25pbmcgKi8KLQotICAgIC8qKgotICAgICogU2V0IHRoZSB2aWRlbyBwcm9maWxlIGFuZCBsZXZlbCAqLwotICAgIEVuY1BhcmFtcy52aWRlb1Byb2ZpbGUgPSBwQy0+ZXdjLm91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICBFbmNQYXJhbXMudmlkZW9MZXZlbD0gcEMtPmV3Yy5vdXRwdXRWaWRlb0xldmVsOwotCi0gICAgc3dpdGNoICggcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFNZU19rSDI2MzoKLQotICAgICAgICAgICAgRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rSDI2MzsKLQotICAgICAgICAgICAgRW5jUGFyYW1zLnVpU3RhcnRpbmdRdWFudGl6ZXJWYWx1ZSA9IDEwOwotICAgICAgICAgICAgRW5jUGFyYW1zLnVpUmF0ZUZhY3RvciA9IDE7IC8qIGRlZmF1bHQgKi8KLQotICAgICAgICAgICAgRW5jUGFyYW1zLmJFcnJvclJlc2lsaWVuY2UgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5iRGF0YVBhcnRpdGlvbmluZyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFNZU19rTVBFR180OgotCi0gICAgICAgICAgICBFbmNQYXJhbXMuRm9ybWF0ID0gTTRFTkNPREVSX2tNUEVHNDsKLQotICAgICAgICAgICAgRW5jUGFyYW1zLnVpU3RhcnRpbmdRdWFudGl6ZXJWYWx1ZSA9IDg7Ci0gICAgICAgICAgICBFbmNQYXJhbXMudWlSYXRlRmFjdG9yID0gKE00T1NBX1VJbnQ4KSgoIHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbgotICAgICAgICAgICAgICAgICogcEMtPmV3Yy51aVZpZGVvVGltZVNjYWxlKSAvIDEwMDAuMCArIDAuNSk7Ci0KLSAgICAgICAgICAgIGlmKCBFbmNQYXJhbXMudWlSYXRlRmFjdG9yID09IDAgKQotICAgICAgICAgICAgICAgIEVuY1BhcmFtcy51aVJhdGVGYWN0b3IgPSAxOyAvKiBkZWZhdWx0ICovCi0KLSAgICAgICAgICAgIGlmKCBNNE9TQV9GQUxTRSA9PSBwQy0+ZXdjLmJWaWRlb0RhdGFQYXJ0aXRpb25pbmcgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEVuY1BhcmFtcy5iRXJyb3JSZXNpbGllbmNlID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgRW5jUGFyYW1zLmJEYXRhUGFydGl0aW9uaW5nID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRW5jUGFyYW1zLmJFcnJvclJlc2lsaWVuY2UgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIEVuY1BhcmFtcy5iRGF0YVBhcnRpdGlvbmluZyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00U1lTX2tIMjY0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXI6IE00U1lTX0gyNjQiKTsKLQotICAgICAgICAgICAgRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rSDI2NDsKLQotICAgICAgICAgICAgRW5jUGFyYW1zLnVpU3RhcnRpbmdRdWFudGl6ZXJWYWx1ZSA9IDEwOwotICAgICAgICAgICAgRW5jUGFyYW1zLnVpUmF0ZUZhY3RvciA9IDE7IC8qIGRlZmF1bHQgKi8KLQotICAgICAgICAgICAgRW5jUGFyYW1zLmJFcnJvclJlc2lsaWVuY2UgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5iRGF0YVBhcnRpdGlvbmluZyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgLy9FbmNQYXJhbXMuRnJhbWVSYXRlID0gTTRWSURFT0VESVRJTkdfazVfRlBTOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyOiBVbmtub3duIHZpZGVvU3RyZWFtVHlwZSAweCV4IiwKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX1ZJREVPX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICBpZiggcEMtPmJJc01NUyA9PSBNNE9TQV9GQUxTRSApCi0gICAgewotICAgICAgICBFbmNQYXJhbXMuQml0cmF0ZSA9IHBDLT54VlNTLm91dHB1dFZpZGVvQml0cmF0ZTsKLQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBFbmNQYXJhbXMuQml0cmF0ZSA9IHBDLT51aU1NU1ZpZGVvQml0cmF0ZTsgLyogUkMgKi8KLSAgICAgICAgRW5jUGFyYW1zLnVpVGltZVNjYWxlID0gMDsgLyogV2UgbGV0IHRoZSBlbmNvZGVyIGNob29zZSB0aGUgdGltZXNjYWxlICovCi0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UxXzAoIk00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXI6IGNhbGxpbmcgZW5jb2RlciBwRmN0SW5pdCIpOwotICAgIC8qKgotICAgICogSW5pdCB0aGUgdmlkZW8gZW5jb2RlciAoYWR2YW5jZWQgc2V0dGluZ3MgdmVyc2lvbiBvZiB0aGUgZW5jb2RlciBPcGVuIGZ1bmN0aW9uKSAqLwotICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEluaXQoJnBDLT5ld2MucEVuY0NvbnRleHQsCi0gICAgICAgICZwQy0+ZXdjLk91cldyaXRlckRhdGFJbnRlcmZhY2UsIE00VlNTM0dQUF9pbnRWUFAsIHBDLAotICAgICAgICBwQy0+U2hlbGxBUEkucEN1cnJlbnRWaWRlb0VuY29kZXJFeHRlcm5hbEFQSSwKLSAgICAgICAgcEMtPlNoZWxsQVBJLnBDdXJyZW50VmlkZW9FbmNvZGVyVXNlckRhdGEpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXI6IHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0SW5pdCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBwQy0+ZXdjLmVuY29kZXJTdGF0ZSA9IE00VlNTM0dQUF9rRW5jb2RlckNsb3NlZDsKLSAgICBNNE9TQV9UUkFDRTFfMCgiTTRWU1MzR1BQX2ludENyZWF0ZVZpZGVvRW5jb2RlcjogY2FsbGluZyBlbmNvZGVyIHBGY3RPcGVuIik7Ci0KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RPcGVuKHBDLT5ld2MucEVuY0NvbnRleHQsCi0gICAgICAgICZwQy0+ZXdjLldyaXRlclZpZGVvQVUsICZFbmNQYXJhbXMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXI6IHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0T3BlbiByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBwQy0+ZXdjLmVuY29kZXJTdGF0ZSA9IE00VlNTM0dQUF9rRW5jb2RlclN0b3BwZWQ7Ci0gICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyOiBjYWxsaW5nIGVuY29kZXIgcEZjdFN0YXJ0Iik7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGFydCApCi0gICAgewotICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGFydCgKLSAgICAgICAgICAgIHBDLT5ld2MucEVuY0NvbnRleHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyOiBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0YXJ0IHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwQy0+ZXdjLmVuY29kZXJTdGF0ZSA9IE00VlNTM0dQUF9rRW5jb2RlclJ1bm5pbmc7Ci0KLSAgICAvKioKLSAgICAqICAgIFJldHVybiAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50RGVzdHJveVZpZGVvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgRGVzdHJveSB0aGUgdmlkZW8gZW5jb2RlcgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnREZXN0cm95VmlkZW9FbmNvZGVyKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPmV3Yy5wRW5jQ29udGV4dCApCi0gICAgewotICAgICAgICBpZiggTTRWU1MzR1BQX2tFbmNvZGVyUnVubmluZyA9PSBwQy0+ZXdjLmVuY29kZXJTdGF0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdG9wICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0b3AoCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucEVuY0NvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnREZXN0cm95VmlkZW9FbmNvZGVyOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RvcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgLyogV2VsbC4uLiBob3cgdGhlIGhlY2sgZG8geW91IGhhbmRsZSBhIGZhaWxlZCBjbGVhbnVwPyAqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcEMtPmV3Yy5lbmNvZGVyU3RhdGUgPSBNNFZTUzNHUFBfa0VuY29kZXJTdG9wcGVkOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogSGFzIHRoZSBlbmNvZGVyIGFjdHVhbGx5IGJlZW4gb3BlbmVkPyBEb24ndCBjbG9zZSBpdCBpZiB0aGF0J3Mgbm90IHRoZSBjYXNlLiAqLwotICAgICAgICBpZiggTTRWU1MzR1BQX2tFbmNvZGVyU3RvcHBlZCA9PSBwQy0+ZXdjLmVuY29kZXJTdGF0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlKAotICAgICAgICAgICAgICAgIHBDLT5ld2MucEVuY0NvbnRleHQpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludERlc3Ryb3lWaWRlb0VuY29kZXI6XAotICAgICAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgLyogV2VsbC4uLiBob3cgdGhlIGhlY2sgZG8geW91IGhhbmRsZSBhIGZhaWxlZCBjbGVhbnVwPyAqLwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwQy0+ZXdjLmVuY29kZXJTdGF0ZSA9IE00VlNTM0dQUF9rRW5jb2RlckNsb3NlZDsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsZWFudXAoCi0gICAgICAgICAgICBwQy0+ZXdjLnBFbmNDb250ZXh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludERlc3Ryb3lWaWRlb0VuY29kZXI6XAotICAgICAgICAgICAgICAgIHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xlYW51cCByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBXZSBkbyBub3QgcmV0dXJuIHRoZSBlcnJvciBoZXJlIGJlY2F1c2Ugd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBmcmVlICovCi0gICAgICAgIH0KLQotICAgICAgICBwQy0+ZXdjLmVuY29kZXJTdGF0ZSA9IE00VlNTM0dQUF9rTm9FbmNvZGVyOwotICAgICAgICAvKioKLSAgICAgICAgKiBSZXNldCB2YXJpYWJsZSAqLwotICAgICAgICBwQy0+ZXdjLnBFbmNDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX2ludERlc3Ryb3lWaWRlb0VuY29kZXI6IHJldHVybmluZyAweCV4IiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludFNldEgyNjNUaW1lQ291bnRlcigpCi0gKiBAYnJpZWYgICAgTW9kaWZ5IHRoZSB0aW1lIGNvdW50ZXIgb2YgdGhlIGdpdmVuIEgyNjMgdmlkZW8gQVUKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcEF1RGF0YUJ1ZmZlciAgICAoSU4vT1VUKSBIMjYzIFZpZGVvIEFVIHRvIG1vZGlmeQotICogQHBhcmFtICAgIHVpQ3RzICAgICAgICAgICAgKElOKSAgICAgTmV3IHRpbWUgY291bnRlciB2YWx1ZQotICogQHJldHVybiAgICBub3RoaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRTZXRIMjYzVGltZUNvdW50ZXIoIE00T1NBX01lbUFkZHI4IHBBdURhdGFCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IHVpQ3RzICkKLXsKLSAgICAvKgotICAgICogIFRoZSBIMjYzIHRpbWUgY291bnRlciBpcyA4IGJpdHMgbG9jYXRlZCBvbiB0aGUgIngiIGJlbG93OgotICAgICoKLSAgICAqICAgfC0tLS0tLS0tfC0tLS0tLS0tfC0tLS0tLS0tfC0tLS0tLS0tfAotICAgICogICAgPz8/Pz8/Pz8gPz8/Pz8/Pz8gPz8/Pz8/eHggeHh4eHh4Pz8KLSAgICAqLwotCi0gICAgLyoqCi0gICAgKiBXcml0ZSB0aGUgMiBiaXRzIG9uIHRoZSB0aGlyZCBieXRlICovCi0gICAgcEF1RGF0YUJ1ZmZlclsyXSA9ICggcEF1RGF0YUJ1ZmZlclsyXSAmIDB4RkMpIHwgKCggdWlDdHMgPj4gNikgJiAweDMpOwotCi0gICAgLyoqCi0gICAgKiBXcml0ZSB0aGUgNiBiaXRzIG9uIHRoZSBmb3VydGggYnl0ZSAqLwotICAgIHBBdURhdGFCdWZmZXJbM10gPSAoICggdWlDdHMgPDwgMikgJiAweEZDKSB8IChwQXVEYXRhQnVmZmVyWzNdICYgMHgzKTsKLQotICAgIHJldHVybjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRTZXRNUEVHNEdvdigpCi0gKiBAYnJpZWYgICAgTW9kaWZ5IHRoZSB0aW1lIGluZm8gZnJvbSBHcm91cCBPZiBWT1AgdmlkZW8gQVUKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcEF1RGF0YUJ1ZmZlciAgICAoSU4pICAgIE1QRUc0IFZpZGVvIEFVIHRvIG1vZGlmeQotICogQHBhcmFtICAgIHVpQ3RzU2VjICAgICAgICAgICAgKElOKSAgICAgTmV3IEdPViB0aW1lIGluZm8gaW4gc2Vjb25kIHVuaXQKLSAqIEByZXR1cm4gICAgbm90aGluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50U2V0TVBFRzRHb3YoIE00T1NBX01lbUFkZHI4IHBBdURhdGFCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpQ3RzU2VjICkKLXsKLSAgICAvKgotICAgICogIFRoZSBNUEVHLTQgdGltZSBjb2RlIGxlbmd0aCBpcyAxOCBiaXRzOgotICAgICoKLSAgICAqICAgICBoaCAgICAgbW0gICAgbWFya2VyICAgIHNzCi0gICAgKiAgICB4eHh4eHx4eHggeHh4ICAgICAxICAgIHh4eHggeHggPz8/Pz8/Ci0gICAgKiAgIHwtLS0tLSAtLS18LS0tICAgICAtICAgIC0tLS18LS0gLS0tLS0tfAotICAgICovCi0gICAgTTRPU0FfVUludDggdWlIaDsKLSAgICBNNE9TQV9VSW50OCB1aU1tOwotICAgIE00T1NBX1VJbnQ4IHVpU3M7Ci0gICAgTTRPU0FfVUludDggdWlUbXA7Ci0KLSAgICAvKioKLSAgICAqIFdyaXRlIHRoZSAyIGxhc3QgYml0cyBzcyAqLwotICAgIHVpU3MgPSAoTTRPU0FfVUludDgpKHVpQ3RzU2VjICUgNjApOyAvKio8IG1vZHVsbyBwYXJ0ICovCi0gICAgcEF1RGF0YUJ1ZmZlclsyXSA9ICgoICggdWlTcyAmIDB4MDMpIDw8IDYpIHwgKHBBdURhdGFCdWZmZXJbMl0gJiAweDNGKSk7Ci0KLSAgICBpZiggdWlDdHNTZWMgPCA2MCApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBXcml0ZSB0aGUgMyBsYXN0IGJpdHMgb2YgbW0sIHRoZSBtYXJrZXIgYml0ICgweDEwICovCi0gICAgICAgIHBBdURhdGFCdWZmZXJbMV0gPSAoKCAweDEwKSB8ICh1aVNzID4+IDIpKTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBXcml0ZSB0aGUgNSBiaXRzIG9mIGhoIGFuZCAzIG9mIG1tIChvdXQgb2YgNikgKi8KLSAgICAgICAgcEF1RGF0YUJ1ZmZlclswXSA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFdyaXRlIHRoZSAzIGxhc3QgYml0cyBvZiBtbSwgdGhlIG1hcmtlciBiaXQgKDB4MTAgKi8KLSAgICAgICAgdWlUbXAgPSAoTTRPU0FfVUludDgpKHVpQ3RzU2VjIC8gNjApOyAvKio8IGludGVnZXIgcGFydCAqLwotICAgICAgICB1aU1tID0gKE00T1NBX1VJbnQ4KSh1aVRtcCAlIDYwKTsKLSAgICAgICAgcEF1RGF0YUJ1ZmZlclsxXSA9ICgoIHVpTW0gPDwgNSkgfCAoMHgxMCkgfCAodWlTcyA+PiAyKSk7Ci0KLSAgICAgICAgaWYoIHVpVG1wIDwgNjAgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogV3JpdGUgdGhlIDUgYml0cyBvZiBoaCBhbmQgMyBvZiBtbSAob3V0IG9mIDYpICovCi0gICAgICAgICAgICBwQXVEYXRhQnVmZmVyWzBdID0gKCh1aU1tID4+IDMpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBXcml0ZSB0aGUgNSBiaXRzIG9mIGhoIGFuZCAzIG9mIG1tIChvdXQgb2YgNikgKi8KLSAgICAgICAgICAgIHVpSGggPSAoTTRPU0FfVUludDgpKHVpVG1wIC8gNjApOwotICAgICAgICAgICAgcEF1RGF0YUJ1ZmZlclswXSA9ICgoIHVpSGggPDwgMykgfCAodWlNbSA+PiAzKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludEdldE1QRUc0R292KCkKLSAqIEBicmllZiAgICBHZXQgdGhlIHRpbWUgaW5mbyBmcm9tIEdyb3VwIE9mIFZPUCB2aWRlbyBBVQotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQXVEYXRhQnVmZmVyICAgIChJTikgICAgTVBFRzQgVmlkZW8gQVUgdG8gbW9kaWZ5Ci0gKiBAcGFyYW0gICAgcEN0c1NlYyAgICAgICAgICAgIChPVVQpICAgIEN1cnJlbnQgR09WIHRpbWUgaW5mbyBpbiBzZWNvbmQgdW5pdAotICogQHJldHVybiAgICBub3RoaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRHZXRNUEVHNEdvdiggTTRPU0FfTWVtQWRkcjggcEF1RGF0YUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgKnBDdHNTZWMgKQotewotICAgIC8qCi0gICAgKiAgVGhlIE1QRUctNCB0aW1lIGNvZGUgbGVuZ3RoIGlzIDE4IGJpdHM6Ci0gICAgKgotICAgICogICAgIGhoICAgICBtbSAgICBtYXJrZXIgICAgc3MKLSAgICAqICAgIHh4eHh4fHh4eCB4eHggICAgIDEgICAgeHh4eCB4eCA/Pz8/Pz8KLSAgICAqICAgfC0tLS0tIC0tLXwtLS0gICAgIC0gICAgLS0tLXwtLSAtLS0tLS18Ci0gICAgKi8KLSAgICBNNE9TQV9VSW50OCB1aUhoOwotICAgIE00T1NBX1VJbnQ4IHVpTW07Ci0gICAgTTRPU0FfVUludDggdWlTczsKLSAgICBNNE9TQV9VSW50OCB1aVRtcDsKLSAgICBNNE9TQV9VSW50MzIgdWlDdHNTZWM7Ci0KLSAgICAvKioKLSAgICAqIFJlYWQgc3MgKi8KLSAgICB1aVNzID0gKCggcEF1RGF0YUJ1ZmZlclsyXSAmIDB4QzApID4+IDYpOwotICAgIHVpVG1wID0gKCggcEF1RGF0YUJ1ZmZlclsxXSAmIDB4MEYpIDw8IDIpOwotICAgIHVpQ3RzU2VjID0gdWlTcyArIHVpVG1wOwotCi0gICAgLyoqCi0gICAgKiBSZWFkIG1tICovCi0gICAgdWlNbSA9ICgoIHBBdURhdGFCdWZmZXJbMV0gJiAweEUwKSA+PiA1KTsKLSAgICB1aVRtcCA9ICgoIHBBdURhdGFCdWZmZXJbMF0gJiAweDA3KSA8PCAzKTsKLSAgICB1aU1tID0gdWlNbSArIHVpVG1wOwotICAgIHVpQ3RzU2VjID0gKCB1aU1tICogNjApICsgdWlDdHNTZWM7Ci0KLSAgICAvKioKLSAgICAqIFJlYWQgaGggKi8KLSAgICB1aUhoID0gKCggcEF1RGF0YUJ1ZmZlclswXSAmIDB4RjgpID4+IDMpOwotCi0gICAgaWYoIHVpSGggKQotICAgIHsKLSAgICAgICAgdWlDdHNTZWMgPSAoIHVpSGggKiAzNjAwKSArIHVpQ3RzU2VjOwotICAgIH0KLQotICAgIC8qCi0gICAgKiBpbiBzZWMgKi8KLSAgICAqcEN0c1NlYyA9IHVpQ3RzU2VjOwotCi0gICAgcmV0dXJuOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAoKQotICogQGJyaWVmICAgIEFsbG9jYXRlIHRoZSB0aHJlZSBZVVYgNDoyOjAgcGxhbmVzCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBQbGFuZXMgICAgKElOL09VVCkgdmFsaWQgcG9pbnRlciB0byAzIE00VklGSV9JbWFnZVBsYW5lIHN0cnVjdHVyZXMKLSAqIEBwYXJhbSAgICB1aVdpZHRoICAgIChJTikgICAgIEltYWdlIHdpZHRoCi0gKiBAcGFyYW0gICAgdWlIZWlnaHQoSU4pICAgICBJbWFnZSBoZWlnaHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAoIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpV2lkdGgsIE00T1NBX1VJbnQzMiB1aUhlaWdodCApCi17Ci0gICAgaWYgKHBQbGFuZXMgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwOiBJbnZhbGlkIHBQbGFuZXMgcG9pbnRlciIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLSAgICAvKiBpZiB0aGUgYnVmZmVyIGlzIG5vdCBOVUxMIGFuZCBzYW1lIHNpemUgd2l0aCB0YXJnZXQgc2l6ZSwKLSAgICAgKiBkbyBub3QgbWFsbG9jIGFnYWluKi8KLSAgICBpZiAocFBsYW5lc1swXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMICYmCi0gICAgICAgIHBQbGFuZXNbMF0udV93aWR0aCA9PSB1aVdpZHRoICYmCi0gICAgICAgIHBQbGFuZXNbMF0udV9oZWlnaHQgPT0gdWlIZWlnaHQpIHsKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotCi0gICAgcFBsYW5lc1swXS51X3dpZHRoID0gdWlXaWR0aDsKLSAgICBwUGxhbmVzWzBdLnVfaGVpZ2h0ID0gdWlIZWlnaHQ7Ci0gICAgcFBsYW5lc1swXS51X3N0cmlkZSA9IHVpV2lkdGg7Ci0gICAgcFBsYW5lc1swXS51X3RvcGxlZnQgPSAwOwotCi0gICAgaWYgKHBQbGFuZXNbMF0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICBmcmVlKHBQbGFuZXNbMF0ucGFjX2RhdGEpOwotICAgICAgICBwUGxhbmVzWzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgcFBsYW5lc1swXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocFBsYW5lc1swXS51X3N0cmlkZQotICAgICAgICAqIHBQbGFuZXNbMF0udV9oZWlnaHQsIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicFBsYW5lc1swXS5wYWNfZGF0YSIpOwotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcFBsYW5lc1swXS5wYWNfZGF0YSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjA6IHVuYWJsZSB0byBhbGxvY2F0ZSBwUGxhbmVzWzBdLnBhY19kYXRhLFwKLSAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgcFBsYW5lc1sxXS51X3dpZHRoID0gcFBsYW5lc1swXS51X3dpZHRoID4+IDE7Ci0gICAgcFBsYW5lc1sxXS51X2hlaWdodCA9IHBQbGFuZXNbMF0udV9oZWlnaHQgPj4gMTsKLSAgICBwUGxhbmVzWzFdLnVfc3RyaWRlID0gcFBsYW5lc1sxXS51X3dpZHRoOwotICAgIHBQbGFuZXNbMV0udV90b3BsZWZ0ID0gMDsKLSAgICBpZiAocFBsYW5lc1sxXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIGZyZWUocFBsYW5lc1sxXS5wYWNfZGF0YSk7Ci0gICAgICAgIHBQbGFuZXNbMV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICBwUGxhbmVzWzFdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwUGxhbmVzWzFdLnVfc3RyaWRlCi0gICAgICAgICogcFBsYW5lc1sxXS51X2hlaWdodCwgTTRWU1MzR1BQLChNNE9TQV9DaGFyICopICJwUGxhbmVzWzFdLnBhY19kYXRhIik7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwUGxhbmVzWzFdLnBhY19kYXRhICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMDogdW5hYmxlIHRvIGFsbG9jYXRlIHBQbGFuZXNbMV0ucGFjX2RhdGEsXAotICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgIGZyZWUoKHZvaWQgKilwUGxhbmVzWzBdLnBhY19kYXRhKTsKLSAgICAgICAgcFBsYW5lc1swXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICBwUGxhbmVzWzJdLnVfd2lkdGggPSBwUGxhbmVzWzFdLnVfd2lkdGg7Ci0gICAgcFBsYW5lc1syXS51X2hlaWdodCA9IHBQbGFuZXNbMV0udV9oZWlnaHQ7Ci0gICAgcFBsYW5lc1syXS51X3N0cmlkZSA9IHBQbGFuZXNbMl0udV93aWR0aDsKLSAgICBwUGxhbmVzWzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgaWYgKHBQbGFuZXNbMl0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICBmcmVlKHBQbGFuZXNbMl0ucGFjX2RhdGEpOwotICAgICAgICBwUGxhbmVzWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgcFBsYW5lc1syXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocFBsYW5lc1syXS51X3N0cmlkZQotICAgICAgICAqIHBQbGFuZXNbMl0udV9oZWlnaHQsIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicFBsYW5lc1syXS5wYWNfZGF0YSIpOwotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcFBsYW5lc1syXS5wYWNfZGF0YSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjA6IHVuYWJsZSB0byBhbGxvY2F0ZSBwUGxhbmVzWzJdLnBhY19kYXRhLFwKLSAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICBmcmVlKCh2b2lkICopcFBsYW5lc1swXS5wYWNfZGF0YSk7Ci0gICAgICAgIGZyZWUoKHZvaWQgKilwUGxhbmVzWzFdLnBhY19kYXRhKTsKLSAgICAgICAgcFBsYW5lc1swXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBQbGFuZXNbMV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgbWVtc2V0KCh2b2lkICopcFBsYW5lc1swXS5wYWNfZGF0YSwgMCwgcFBsYW5lc1swXS51X3N0cmlkZSpwUGxhbmVzWzBdLnVfaGVpZ2h0KTsKLSAgICBtZW1zZXQoKHZvaWQgKilwUGxhbmVzWzFdLnBhY19kYXRhLCAwLCBwUGxhbmVzWzFdLnVfc3RyaWRlKnBQbGFuZXNbMV0udV9oZWlnaHQpOwotICAgIG1lbXNldCgodm9pZCAqKXBQbGFuZXNbMl0ucGFjX2RhdGEsIDAsIHBQbGFuZXNbMl0udV9zdHJpZGUqcFBsYW5lc1syXS51X2hlaWdodCk7Ci0gICAgLyoqCi0gICAgKiAgICBSZXR1cm4gKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAoTTRPU0FfVm9pZCogcEZpbGVJbiwKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVSZWFkUHRyLAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbWFnZVBsYW5lcywKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB3aWR0aCwKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBoZWlnaHQpOwotKiBAYnJpZWYgICAgSXQgQ292ZXJ0cyBhbmQgcmVzaXplcyBhIEFSR0I4ODg4IGltYWdlIHRvIFlVVjQyMAotKiBAbm90ZQotKiBAcGFyYW0gICAgcEZpbGVJbiAgICAgICAgIChJTikgVGhlIEFSR0I4ODggaW5wdXQgZmlsZQotKiBAcGFyYW0gICAgcEZpbGVSZWFkUHRyICAgIChJTikgUG9pbnRlciBvbiBmaWxlc3lzdGVtIGZ1bmN0aW9ucwotKiBAcGFyYW0gICAgcEltYWdlUGxhbmVzICAgIChJTi9PVVQpIFBvaW50ZXIgb24gWVVWNDIwIG91dHB1dCBwbGFuZXMgYWxsb2NhdGVkIGJ5IHRoZSB1c2VyLgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSR0I4ODg4IGltYWdlICB3aWxsIGJlIGNvbnZlcnRlZCBhbmQgcmVzaXplZCB0byBvdXRwdXQKLSogICAgICAgICAgICAgICAgICAgICAgICAgICBZVVY0MjAgcGxhbmUgc2l6ZQotKiBAcGFyYW0gd2lkdGggICAgICAgKElOKSB3aWR0aCBvZiB0aGUgQVJHQjg4ODgKLSogQHBhcmFtIGhlaWdodCAgICAgIChJTikgaGVpZ2h0IG9mIHRoZSBBUkdCODg4OAotKiBAcmV0dXJuICAgTTROT19FUlJPUjogTm8gZXJyb3IKLSogQHJldHVybiAgIE00RVJSX0FMTE9DOiBtZW1vcnkgZXJyb3IKLSogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwKE00T1NBX1ZvaWQqIHBGaWxlSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwSW1hZ2VQbGFuZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgd2lkdGgsTTRPU0FfVUludDMyIGhlaWdodCkgewotICAgIE00T1NBX0NvbnRleHQgcEFSR0JJbjsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSByZ2JQbGFuZTEgLHJnYlBsYW5lMjsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVTaXplX2FyZ2IgPSB3aWR0aCAqIGhlaWdodCAqIDQ7Ci0gICAgTTRPU0FfVUludDMyIGZyYW1lU2l6ZV9yZ2I4ODggPSB3aWR0aCAqIGhlaWdodCAqIDM7Ci0gICAgTTRPU0FfVUludDMyIGkgPSAwLGo9IDA7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNE9TQV9VSW50OCAqcEFyZ2JQbGFuZSA9Ci0gICAgICAgIChNNE9TQV9VSW50OCopIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhmcmFtZVNpemVfYXJnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyKikiYXJnYiBkYXRhIik7Ci0gICAgaWYgKHBBcmdiUGxhbmUgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRWU1MzR1BQX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjA6IFwKLSAgICAgICAgICAgIEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEFSR0IgcGxhbmUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8qIEdldCBmaWxlIHNpemUgKi8KLSAgICBlcnIgPSBwRmlsZVJlYWRQdHItPm9wZW5SZWFkKCZwQVJHQkluLCBwRmlsZUluLCBNNE9TQV9rRmlsZVJlYWQpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTRWU1MzR1BQX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgOiBcCi0gICAgICAgICAgICBDYW4gbm90IG9wZW4gaW5wdXQgQVJHQjg4ODggZmlsZSAlcywgZXJyb3I6IDB4JXhcbiIscEZpbGVJbiwgZXJyKTsKLSAgICAgICAgZnJlZShwQXJnYlBsYW5lKTsKLSAgICAgICAgcEFyZ2JQbGFuZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICB9Ci0KLSAgICBlcnIgPSBwRmlsZVJlYWRQdHItPnJlYWREYXRhKHBBUkdCSW4sKE00T1NBX01lbUFkZHI4KXBBcmdiUGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJhbWVTaXplX2FyZ2IpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTRWU1MzR1BQX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgXAotICAgICAgICAgICAgQ2FuIG5vdCByZWFkIEFSR0I4ODg4IGZpbGUgJXMsIGVycm9yOiAweCV4XG4iLHBGaWxlSW4sIGVycik7Ci0gICAgICAgIHBGaWxlUmVhZFB0ci0+Y2xvc2VSZWFkKHBBUkdCSW4pOwotICAgICAgICBmcmVlKHBBcmdiUGxhbmUpOwotICAgICAgICBwQXJnYlBsYW5lID0gTTRPU0FfTlVMTDsKLSAgICAgICAgZ290byBjbGVhbnVwOwotICAgIH0KLQotICAgIGVyciA9IHBGaWxlUmVhZFB0ci0+Y2xvc2VSZWFkKHBBUkdCSW4pOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNFZTUzNHUFBfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCBcCi0gICAgICAgICAgICBDYW4gbm90IGNsb3NlIEFSR0I4ODg4ICBmaWxlICVzLCBlcnJvcjogMHgleFxuIixwRmlsZUluLCBlcnIpOwotICAgICAgICBmcmVlKHBBcmdiUGxhbmUpOwotICAgICAgICBwQXJnYlBsYW5lID0gTTRPU0FfTlVMTDsKLSAgICAgICAgZ290byBjbGVhbnVwOwotICAgIH0KLQotICAgIHJnYlBsYW5lMS5wYWNfZGF0YSA9Ci0gICAgICAgIChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhmcmFtZVNpemVfcmdiODg4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciopIlJHQjg4OCBwbGFuZTEiKTsKLSAgICBpZihyZ2JQbGFuZTEucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRWU1MzR1BQX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgXAotICAgICAgICAgICAgRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcmdiIHBsYW5lMSIpOwotICAgICAgICBmcmVlKHBBcmdiUGxhbmUpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgcmdiUGxhbmUxLnVfaGVpZ2h0ID0gaGVpZ2h0OwotICAgIHJnYlBsYW5lMS51X3dpZHRoID0gd2lkdGg7Ci0gICAgcmdiUGxhbmUxLnVfc3RyaWRlID0gd2lkdGgqMzsKLSAgICByZ2JQbGFuZTEudV90b3BsZWZ0ID0gMDsKLQotCi0gICAgLyoqIFJlbW92ZSB0aGUgYWxwaGEgY2hhbm5lbCAqLwotICAgIGZvciAoaT0wLCBqID0gMDsgaSA8IGZyYW1lU2l6ZV9hcmdiOyBpKyspIHsKLSAgICAgICAgaWYgKChpICUgNCkgPT0gMCkgY29udGludWU7Ci0gICAgICAgIHJnYlBsYW5lMS5wYWNfZGF0YVtqXSA9IHBBcmdiUGxhbmVbaV07Ci0gICAgICAgIGorKzsKLSAgICB9Ci0gICAgZnJlZShwQXJnYlBsYW5lKTsKLQotICAgIC8qKgotICAgICAqIENoZWNrIGlmIHJlc2l6aW5nIGlzIHJlcXVpcmVkIHdpdGggY29sb3IgY29udmVyc2lvbiAqLwotICAgIGlmKHdpZHRoICE9IHBJbWFnZVBsYW5lcy0+dV93aWR0aCB8fCBoZWlnaHQgIT0gcEltYWdlUGxhbmVzLT51X2hlaWdodCkgewotCi0gICAgICAgIGZyYW1lU2l6ZV9yZ2I4ODggPSBwSW1hZ2VQbGFuZXMtPnVfd2lkdGggKiBwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0ICogMzsKLSAgICAgICAgcmdiUGxhbmUyLnBhY19kYXRhID0KLSAgICAgICAgICAgIChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhmcmFtZVNpemVfcmdiODg4LCBNNFZTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJyZ2IgUGxhbmUyIik7Ci0gICAgICAgIGlmKHJnYlBsYW5lMi5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcmdiIHBsYW5lMiIpOwotICAgICAgICAgICAgZnJlZShyZ2JQbGFuZTEucGFjX2RhdGEpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIHJnYlBsYW5lMi51X2hlaWdodCA9ICBwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0OwotICAgICAgICByZ2JQbGFuZTIudV93aWR0aCA9IHBJbWFnZVBsYW5lcy0+dV93aWR0aDsKLSAgICAgICAgcmdiUGxhbmUyLnVfc3RyaWRlID0gcEltYWdlUGxhbmVzLT51X3dpZHRoKjM7Ci0gICAgICAgIHJnYlBsYW5lMi51X3RvcGxlZnQgPSAwOwotCi0gICAgICAgIC8qIFJlc2l6aW5nICovCi0gICAgICAgIGVyciA9IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjg4OHRvUkdCODg4KE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZ2JQbGFuZTEsICZyZ2JQbGFuZTIpOwotICAgICAgICBmcmVlKHJnYlBsYW5lMS5wYWNfZGF0YSk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiZXJyb3IgcmVzaXppbmcgUkdCODg4IHRvIFJHQjg4ODogMHgleFxuIiwgZXJyKTsKLSAgICAgICAgICAgIGZyZWUocmdiUGxhbmUyLnBhY19kYXRhKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKkNvbnZlcnRpbmcgUmVzaXplZCBSR0I4ODggdG8gWVVWNDIwICovCi0gICAgICAgIGVyciA9IE00VklGSV9SR0I4ODh0b1lVVjQyMChNNE9TQV9OVUxMLCAmcmdiUGxhbmUyLCBwSW1hZ2VQbGFuZXMpOwotICAgICAgICBmcmVlKHJnYlBsYW5lMi5wYWNfZGF0YSk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiZXJyb3IgY29udmVydGluZyBmcm9tIFJHQjg4OCB0byBZVVY6IDB4JXhcbiIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZXJyID0gTTRWSUZJX1JHQjg4OHRvWVVWNDIwKE00T1NBX05VTEwsICZyZ2JQbGFuZTEsIHBJbWFnZVBsYW5lcyk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiZXJyb3Igd2hlbiBjb252ZXJ0aW5nIGZyb20gUkdCIHRvIFlVVjogMHgleFxuIiwgZXJyKTsKLSAgICAgICAgfQotICAgICAgICBmcmVlKHJnYlBsYW5lMS5wYWNfZGF0YSk7Ci0gICAgfQotY2xlYW51cDoKLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgZXhpdCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXBwbHlSZW5kZXJpbmdNb2RlKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19NZWRpYVJlbmRlcmluZyByZW5kZXJpbmdNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbnBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBPdXRwbGFuZSkgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRBSVJfUGFyYW1zIGFpclBhcmFtczsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSBwSW1hZ2VQbGFuZXNUZW1wWzNdOwotICAgIE00T1NBX1VJbnQzMiBpID0gMDsKLQotICAgIGlmIChyZW5kZXJpbmdNb2RlID09IE00eFZTU19rQmxhY2tCb3JkZXJzKSB7Ci0gICAgICAgIG1lbXNldCgodm9pZCAqKXBPdXRwbGFuZVswXS5wYWNfZGF0YSwgWV9QTEFORV9CT1JERVJfVkFMVUUsCi0gICAgICAgICAgICAgICAocE91dHBsYW5lWzBdLnVfaGVpZ2h0KnBPdXRwbGFuZVswXS51X3N0cmlkZSkpOwotICAgICAgICBtZW1zZXQoKHZvaWQgKilwT3V0cGxhbmVbMV0ucGFjX2RhdGEsIFVfUExBTkVfQk9SREVSX1ZBTFVFLAotICAgICAgICAgICAgICAgKHBPdXRwbGFuZVsxXS51X2hlaWdodCpwT3V0cGxhbmVbMV0udV9zdHJpZGUpKTsKLSAgICAgICAgbWVtc2V0KCh2b2lkICopcE91dHBsYW5lWzJdLnBhY19kYXRhLCBWX1BMQU5FX0JPUkRFUl9WQUxVRSwKLSAgICAgICAgICAgICAgIChwT3V0cGxhbmVbMl0udV9oZWlnaHQqcE91dHBsYW5lWzJdLnVfc3RyaWRlKSk7Ci0gICAgfQotCi0gICAgaWYgKHJlbmRlcmluZ01vZGUgPT0gTTR4VlNTX2tSZXNpemluZykgewotICAgICAgICAvKioKLSAgICAgICAgKiBDYWxsIHRoZSByZXNpemUgZmlsdGVyLgotICAgICAgICAqIEZyb20gdGhlIGludGVybWVkaWF0ZSBmcmFtZSB0byB0aGUgZW5jb2RlciBpbWFnZSBwbGFuZSAqLwotICAgICAgICBlcnIgPSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMChNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5wbGFuZSwgcE91dHBsYW5lKTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEFwcGx5UmVuZGVyaW5nTW9kZTogXAotICAgICAgICAgICAgICAgIE00VmlGaWxSZXNpemVCaWxpbmVhcllVVjQyMHRvWVVWNDIwIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVUZW1wID0gTTRPU0FfTlVMTDsKLSAgICAgICAgTTRPU0FfVUludDgqIHBPdXRQbGFuZVkgPQotICAgICAgICAgICAgcE91dHBsYW5lWzBdLnBhY19kYXRhICsgcE91dHBsYW5lWzBdLnVfdG9wbGVmdDsKLSAgICAgICAgTTRPU0FfVUludDgqIHBPdXRQbGFuZVUgPQotICAgICAgICAgICAgcE91dHBsYW5lWzFdLnBhY19kYXRhICsgcE91dHBsYW5lWzFdLnVfdG9wbGVmdDsKLSAgICAgICAgTTRPU0FfVUludDgqIHBPdXRQbGFuZVYgPQotICAgICAgICAgICAgcE91dHBsYW5lWzJdLnBhY19kYXRhICsgcE91dHBsYW5lWzJdLnVfdG9wbGVmdDsKLSAgICAgICAgTTRPU0FfVUludDgqIHBJblBsYW5lWSA9IE00T1NBX05VTEw7Ci0gICAgICAgIE00T1NBX1VJbnQ4KiBwSW5QbGFuZVUgPSBNNE9TQV9OVUxMOwotICAgICAgICBNNE9TQV9VSW50OCogcEluUGxhbmVWID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAvKiBUbyBrZWVwIG1lZGlhIGFzcGVjdCByYXRpbyovCi0gICAgICAgIC8qIEluaXRpYWxpemUgQUlSIFBhcmFtcyovCi0gICAgICAgIGFpclBhcmFtcy5tX2lucHV0Q29vcmQubV94ID0gMDsKLSAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgPSAwOwotICAgICAgICBhaXJQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSBwSW5wbGFuZS0+dV9oZWlnaHQ7Ci0gICAgICAgIGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0gcElucGxhbmUtPnVfd2lkdGg7Ci0gICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IHBPdXRwbGFuZS0+dV93aWR0aDsKLSAgICAgICAgYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IHBPdXRwbGFuZS0+dV9oZWlnaHQ7Ci0gICAgICAgIGFpclBhcmFtcy5tX2JPdXRwdXRTdHJpcGUgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgYWlyUGFyYW1zLm1fb3V0cHV0T3JpZW50YXRpb24gPSBNNENPTU1PTl9rT3JpZW50YXRpb25Ub3BMZWZ0OwotCi0gICAgICAgIC8qKgotICAgICAgICBNZWRpYSByZW5kZXJpbmc6IEJsYWNrIGJvcmRlcnMqLwotICAgICAgICBpZiAocmVuZGVyaW5nTW9kZSA9PSBNNHhWU1Nfa0JsYWNrQm9yZGVycykgewotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoID0gcE91dHBsYW5lWzBdLnVfd2lkdGg7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0ID0gcE91dHBsYW5lWzBdLnVfaGVpZ2h0OwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3N0cmlkZSA9IHBPdXRwbGFuZVswXS51X3dpZHRoOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3RvcGxlZnQgPSAwOwotCi0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfd2lkdGggPSBwT3V0cGxhbmVbMV0udV93aWR0aDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHQgPSBwT3V0cGxhbmVbMV0udV9oZWlnaHQ7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfc3RyaWRlID0gcE91dHBsYW5lWzFdLnVfd2lkdGg7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfdG9wbGVmdCA9IDA7Ci0KLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aCA9IHBPdXRwbGFuZVsyXS51X3dpZHRoOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodCA9IHBPdXRwbGFuZVsyXS51X2hlaWdodDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV9zdHJpZGUgPSBwT3V0cGxhbmVbMl0udV93aWR0aDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV90b3BsZWZ0ID0gMDsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBBbGxvY2F0ZXMgcGxhbiBpbiBsb2NhbCBpbWFnZSBwbGFuZSBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0ucGFjX2RhdGEgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfd2lkdGggKiBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJwSW1hZ2VQbGFuZVRlbXAgWSIpIDsKLSAgICAgICAgICAgIGlmIChwSW1hZ2VQbGFuZXNUZW1wWzBdLnBhY19kYXRhID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRWU1MzR1BQX2ludEFwcGx5UmVuZGVyaW5nTW9kZTogQWxsb2MgRXJyb3IiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnBhY19kYXRhID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3dpZHRoICogcEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikicEltYWdlUGxhbmVUZW1wIFUiKSA7Ci0gICAgICAgICAgICBpZiAocEltYWdlUGxhbmVzVGVtcFsxXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00VlNTM0dQUF9pbnRBcHBseVJlbmRlcmluZ01vZGU6IEFsbG9jIEVycm9yIik7Ci0gICAgICAgICAgICAgICAgZnJlZShwSW1hZ2VQbGFuZXNUZW1wWzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnBhY19kYXRhID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3dpZHRoICogcEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikicEltYWdlUGxhbmVUZW1wIFYiKSA7Ci0gICAgICAgICAgICBpZiAocEltYWdlUGxhbmVzVGVtcFsyXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00VlNTM0dQUF9pbnRBcHBseVJlbmRlcmluZ01vZGU6IEFsbG9jIEVycm9yIik7Ci0gICAgICAgICAgICAgICAgZnJlZShwSW1hZ2VQbGFuZXNUZW1wWzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICBmcmVlKHBJbWFnZVBsYW5lc1RlbXBbMV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcEluUGxhbmVZID0gcEltYWdlUGxhbmVzVGVtcFswXS5wYWNfZGF0YSA7Ci0gICAgICAgICAgICBwSW5QbGFuZVUgPSBwSW1hZ2VQbGFuZXNUZW1wWzFdLnBhY19kYXRhIDsKLSAgICAgICAgICAgIHBJblBsYW5lViA9IHBJbWFnZVBsYW5lc1RlbXBbMl0ucGFjX2RhdGEgOwotCi0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwSW1hZ2VQbGFuZXNUZW1wWzBdLnBhY19kYXRhLCBZX1BMQU5FX0JPUkRFUl9WQUxVRSwKLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzVGVtcFswXS51X2hlaWdodCpwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwSW1hZ2VQbGFuZXNUZW1wWzFdLnBhY19kYXRhLCBVX1BMQU5FX0JPUkRFUl9WQUxVRSwKLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCpwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwSW1hZ2VQbGFuZXNUZW1wWzJdLnBhY19kYXRhLCBWX1BMQU5FX0JPUkRFUl9WQUxVRSwKLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodCpwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfc3RyaWRlKSk7Ci0KLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiBoZWlnaHQgPQotICAgICAgICAgICAgICAgIChwSW5wbGFuZS0+dV9oZWlnaHQgKiBwT3V0cGxhbmUtPnVfd2lkdGgpIC9wSW5wbGFuZS0+dV93aWR0aDsKLQotICAgICAgICAgICAgaWYgKGhlaWdodCA8PSBwT3V0cGxhbmUtPnVfaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogQmxhY2sgYm9yZGVycyB3aWxsIGJlIG9uIHRoZSB0b3AgYW5kIHRoZSBib3R0b20gc2lkZSAqLwotICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IHBPdXRwbGFuZS0+dV93aWR0aDsKLSAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gaGVpZ2h0OwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIE51bWJlciBvZiBsaW5lcyBhdCB0aGUgdG9wICovCi0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMF0udV9oZWlnaHQgLQotICAgICAgICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpPj4xKSkgKgotICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X2hlaWdodCA9IGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHQgLQotICAgICAgICAgICAgICAgICAgICAgKGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpKSk+PjEpICoKLSAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjE7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQgLQotICAgICAgICAgICAgICAgICAgICAgKGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpKSk+PjEpICoKLSAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIEJsYWNrIGJvcmRlcnMgd2lsbCBiZSBvbiB0aGUgbGVmdCBhbmQgcmlnaHQgc2lkZSAqLwotICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSBwT3V0cGxhbmUtPnVfaGVpZ2h0OwotICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKChwSW5wbGFuZS0+dV93aWR0aCAqIHBPdXRwbGFuZS0+dV9oZWlnaHQpL3BJbnBsYW5lLT51X2hlaWdodCk7Ci0KLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgIChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoIC0KLSAgICAgICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCk+PjEpKTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfd2lkdGggPSBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMV0udV93aWR0aCAtCi0gICAgICAgICAgICAgICAgICAgICAoYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfd2lkdGggPSBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjE7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aCAtCi0gICAgICAgICAgICAgICAgICAgICAoYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfd2lkdGggPSBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogV2lkdGggYW5kIGhlaWdodCBoYXZlIHRvIGJlIGV2ZW4gKi8KLSAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgKGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAoYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICBhaXJQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgKGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgIGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgKGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfd2lkdGggPQotICAgICAgICAgICAgICAgIChwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3dpZHRoID0KLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzVGVtcFsxXS51X3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzVGVtcFswXS51X2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfaGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodD4+MSk8PDE7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQ2hlY2sgdGhhdCB2YWx1ZXMgYXJlIGNvaGVyZW50ICovCi0gICAgICAgICAgICBpZiAoYWlyUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID09Ci0gICAgICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCkgewotICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhaXJQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGgpIHsKLSAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFBsYW5lVGVtcCA9IHBJbWFnZVBsYW5lc1RlbXA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogTWVkaWEgcmVuZGVyaW5nOiBDcm9wcGluZyovCi0gICAgICAgIGlmIChyZW5kZXJpbmdNb2RlID09IE00eFZTU19rQ3JvcHBpbmcpIHsKLSAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSBwT3V0cGxhbmUtPnVfaGVpZ2h0OwotICAgICAgICAgICAgYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gcE91dHBsYW5lLT51X3dpZHRoOwotICAgICAgICAgICAgaWYgKChhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ICoKLSAgICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpL2FpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA8Ci0gICAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAvKiBIZWlnaHQgd2lsbCBiZSBjcm9wcGVkICovCi0gICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgKgotICAgICAgICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpL2FpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgKGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKChNNE9TQV9JbnQzMikoKHBJbnBsYW5lLT51X2hlaWdodCAtCi0gICAgICAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpKT4+MSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8qIFdpZHRoIHdpbGwgYmUgY3JvcHBlZCAqLwotICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCAqCi0gICAgICAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpL2FpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpOwotICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgKGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMikoKE00T1NBX0ludDMyKSgocElucGxhbmUtPnVfd2lkdGggLQotICAgICAgICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpKT4+MSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwUGxhbmVUZW1wID0gcE91dHBsYW5lOwotICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAqIENhbGwgQUlSIGZ1bmN0aW9ucyAqLwotICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQy0+bV9haXJfY29udGV4dCkgewotICAgICAgICAgICAgZXJyID0gTTRBSVJfY3JlYXRlKCZwQy0+bV9haXJfY29udGV4dCwgTTRBSVJfa1lVVjQyMFApOwotICAgICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEFwcGx5UmVuZGVyaW5nTW9kZTogXAotICAgICAgICAgICAgICAgICAgICBNNEFJUl9jcmVhdGUgcmV0dXJuZWQgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgZ290byBjbGVhblVwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRBSVJfY29uZmlndXJlKHBDLT5tX2Fpcl9jb250ZXh0LCAmYWlyUGFyYW1zKTsKLSAgICAgICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEFwcGx5UmVuZGVyaW5nTW9kZTogXAotICAgICAgICAgICAgICAgIEVycm9yIHdoZW4gY29uZmlndXJpbmcgQUlSOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIE00QUlSX2NsZWFuVXAocEMtPm1fYWlyX2NvbnRleHQpOwotICAgICAgICAgICAgZ290byBjbGVhblVwOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRBSVJfZ2V0KHBDLT5tX2Fpcl9jb250ZXh0LCBwSW5wbGFuZSwgcFBsYW5lVGVtcCk7Ci0gICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRBcHBseVJlbmRlcmluZ01vZGU6IFwKLSAgICAgICAgICAgICAgICBFcnJvciB3aGVuIGdldHRpbmcgQUlSIHBsYW5lOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIE00QUlSX2NsZWFuVXAocEMtPm1fYWlyX2NvbnRleHQpOwotICAgICAgICAgICAgZ290byBjbGVhblVwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlbmRlcmluZ01vZGUgPT0gTTR4VlNTX2tCbGFja0JvcmRlcnMpIHsKLSAgICAgICAgICAgIGZvciAoaT0wOyBpPHBPdXRwbGFuZVswXS51X2hlaWdodDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcE91dFBsYW5lWSwgKHZvaWQgKilwSW5QbGFuZVksCi0gICAgICAgICAgICAgICAgICAgICAgICBwT3V0cGxhbmVbMF0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgcEluUGxhbmVZICs9IHBPdXRwbGFuZVswXS51X3dpZHRoOwotICAgICAgICAgICAgICAgIHBPdXRQbGFuZVkgKz0gcE91dHBsYW5lWzBdLnVfc3RyaWRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpPTA7IGk8cE91dHBsYW5lWzFdLnVfaGVpZ2h0OyBpKyspIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwT3V0UGxhbmVVLCAodm9pZCAqKXBJblBsYW5lVSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRwbGFuZVsxXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICBwSW5QbGFuZVUgKz0gcE91dHBsYW5lWzFdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgcE91dFBsYW5lVSArPSBwT3V0cGxhbmVbMV0udV9zdHJpZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGk9MDsgaTxwT3V0cGxhbmVbMl0udV9oZWlnaHQ7IGkrKykgewotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBPdXRQbGFuZVYsICh2b2lkICopcEluUGxhbmVWLAotICAgICAgICAgICAgICAgICAgICAgICAgcE91dHBsYW5lWzJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgIHBJblBsYW5lViArPSBwT3V0cGxhbmVbMl0udV93aWR0aDsKLSAgICAgICAgICAgICAgICBwT3V0UGxhbmVWICs9IHBPdXRwbGFuZVsyXS51X3N0cmlkZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLWNsZWFuVXA6Ci0gICAgaWYgKHJlbmRlcmluZ01vZGUgPT0gTTR4VlNTX2tCbGFja0JvcmRlcnMpIHsKLSAgICAgICAgZm9yIChpPTA7IGk8MzsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAocEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludFNldFl1djQyMFBsYW5lRnJvbUFSR0I4ODggKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQqIHBDbGlwQ3R4dCkgewotCi0gICAgTTRPU0FfRVJSIGVycj0gTTROT19FUlJPUjsKLQotICAgIC8vIEFsbG9jYXRlIG1lbW9yeSBmb3IgWVVWIHBsYW5lCi0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXYgPQotICAgICAoTTRWSUZJX0ltYWdlUGxhbmUqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpLCBNNFZTLAotICAgICAgICAoTTRPU0FfQ2hhciopInBQbGFuZVl1diIpOwotCi0gICAgaWYgKHBDbGlwQ3R4dC0+cFBsYW5lWXV2ID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnVfaGVpZ2h0ID0KLSAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpU3RpbGxQaWNIZWlnaHQ7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMF0udV93aWR0aCA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVN0aWxsUGljV2lkdGg7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMF0udV9zdHJpZGUgPSBwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS51X3dpZHRoOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnVfdG9wbGVmdCA9IDA7Ci0KLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS5wYWNfZGF0YSA9Ci0gICAgIChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnVfaGVpZ2h0ICogcENsaXBDdHh0LT5wUGxhbmVZdXZbMF0udV93aWR0aCAqIDEuNSwKLSAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyKikiaW1hZ2VDbGlwIFlVViBkYXRhIik7Ci0gICAgaWYgKHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnBhY19kYXRhID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPnBQbGFuZVl1dik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlsxXS51X2hlaWdodCA9IHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnVfaGVpZ2h0ID4+MTsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlsxXS51X3dpZHRoID0gcENsaXBDdHh0LT5wUGxhbmVZdXZbMF0udV93aWR0aCA+PiAxOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzFdLnVfc3RyaWRlID0gcENsaXBDdHh0LT5wUGxhbmVZdXZbMV0udV93aWR0aDsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlsxXS51X3RvcGxlZnQgPSAwOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzFdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopKAotICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS5wYWNfZGF0YSArCi0gICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS51X2hlaWdodCAqIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnVfd2lkdGgpOwotCi0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMl0udV9oZWlnaHQgPSBwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS51X2hlaWdodCA+PjE7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMl0udV93aWR0aCA9IHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnVfd2lkdGggPj4gMTsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlsyXS51X3N0cmlkZSA9IHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzJdLnVfd2lkdGg7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMl0udV90b3BsZWZ0ID0gMDsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlsyXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKSgKLSAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMV0ucGFjX2RhdGEgKwotICAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMV0udV9oZWlnaHQgKiBwQ2xpcEN0eHQtPnBQbGFuZVl1dlsxXS51X3dpZHRoKTsKLQotICAgIGVyciA9IE00VlNTM0dQUF9pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwICgKLSAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPnBGaWxlLAotICAgICAgICBwQy0+cE9zYUZpbGVSZWFkUHRyLAotICAgICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1diwKLSAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpU3RpbGxQaWNXaWR0aCwKLSAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpU3RpbGxQaWNIZWlnaHQpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnBhY19kYXRhKTsKLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPnBQbGFuZVl1dik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLy8gU2V0IHRoZSBZVVYgZGF0YSB0byB0aGUgZGVjb2RlciB1c2luZyBzZXRvcHRpb24KLSAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uICgKLSAgICAgICAgcENsaXBDdHh0LT5wVmlEZWNDdHh0LAotICAgICAgICBNNERFQ09ERVJfa09wdGlvbklEX0RlY1l1dkRhdGEsCi0gICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKXBDbGlwQ3R4dC0+cFBsYW5lWXV2KTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS5wYWNfZGF0YSk7Ci0gICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXYpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5iU2V0SW1hZ2VEYXRhID0gTTRPU0FfVFJVRTsKLQotICAgIC8vIEFsbG9jYXRlIFl1diBwbGFuZSB3aXRoIGVmZmVjdAotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdCA9Ci0gICAgIChNNFZJRklfSW1hZ2VQbGFuZSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpLCBNNFZTLAotICAgICAgICAgKE00T1NBX0NoYXIqKSJwUGxhbmVZdXZXaXRoRWZmZWN0Iik7Ci0gICAgaWYgKHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdCA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXZbMF0ucGFjX2RhdGEpOwotICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+cFBsYW5lWXV2KTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS51X2hlaWdodCA9IHBDLT5ld2MudWlWaWRlb0hlaWdodDsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMF0udV93aWR0aCA9IHBDLT5ld2MudWlWaWRlb1dpZHRoOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS51X3N0cmlkZSA9IHBDLT5ld2MudWlWaWRlb1dpZHRoOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS51X3RvcGxlZnQgPSAwOwotCi0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzBdLnBhY19kYXRhID0KLSAgICAgKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ICogcEMtPmV3Yy51aVZpZGVvV2lkdGggKiAxLjUsCi0gICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciopImltYWdlQ2xpcCBZVVYgZGF0YSIpOwotICAgIGlmIChwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMF0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnBhY19kYXRhKTsKLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPnBQbGFuZVl1dik7Ci0gICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0KTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsxXS51X2hlaWdodCA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS51X2hlaWdodCA+PjE7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzFdLnVfd2lkdGggPQotICAgICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMF0udV93aWR0aCA+PiAxOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsxXS51X3N0cmlkZSA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsxXS51X3dpZHRoOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsxXS51X3RvcGxlZnQgPSAwOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsxXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKSgKLSAgICAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzBdLnBhY19kYXRhICsKLSAgICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS51X2hlaWdodCAqIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS51X3dpZHRoKTsKLQotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsyXS51X2hlaWdodCA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS51X2hlaWdodCA+PjE7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzJdLnVfd2lkdGggPQotICAgICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMF0udV93aWR0aCA+PiAxOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsyXS51X3N0cmlkZSA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsyXS51X3dpZHRoOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsyXS51X3RvcGxlZnQgPSAwOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsyXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKSgKLSAgICAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzFdLnBhY19kYXRhICsKLSAgICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsxXS51X2hlaWdodCAqIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsxXS51X3dpZHRoKTsKLQotICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb24oCi0gICAgICAgIHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCwgTTRERUNPREVSX2tPcHRpb25JRF9ZdXZXaXRoRWZmZWN0Q29udGlndW91cywKLSAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0KTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS5wYWNfZGF0YSk7Ci0gICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXYpOwotICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50UmVuZGVyRnJhbWVXaXRoRWZmZWN0KE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCogcENsaXBDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfTWVkaWFUaW1lIHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQm9vbCBiSXNDbGlwMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUmVzaXplUGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lTm9SZXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9VSW50OCBudW1FZmZlY3RzID0gMDsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcERlY29kZXJSZW5kZXJGcmFtZSA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfVUludDMyIHl1dkZyYW1lV2lkdGggPSAwLCB5dXZGcmFtZUhlaWdodCA9IDA7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBUbXAgPSBNNE9TQV9OVUxMOwotICAgIE00VklGSV9JbWFnZVBsYW5lIHBUZW1wWzNdOwotICAgIE00T1NBX1VJbnQ4IGkgPSAwOwotICAgIE00T1NBX0Jvb2wgYlNraXBGcmFtaW5nRWZmZWN0ID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBtZW1zZXQoKHZvaWQgKilwVGVtcCwgMCwgMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpKTsKLSAgICAvKiBSZXNpemUgb3Igcm90YXRlIGNhc2UgKi8KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPm1fcFByZVJlc2l6ZUZyYW1lKSB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIElmIHdlIGRvIG1vZGlmeSB0aGUgaW1hZ2UsIHdlIG5lZWQgYW4gaW50ZXJtZWRpYXRlIGltYWdlIHBsYW5lICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMChwUmVzaXplUGxhbmUsCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfd2lkdGgsCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfaGVpZ2h0KTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFJlbmRlckZyYW1lV2l0aEVmZmVjdDogXAotICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMCByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgocENsaXBDdHh0LT5wU2V0dGluZ3MtPkZpbGVUeXBlID09Ci0gICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgJiYKLSAgICAgICAgICAgIChwQy0+bmJBY3RpdmVFZmZlY3RzID09IDApICYmCi0gICAgICAgICAgICAocENsaXBDdHh0LT5iR2V0WXV2RGF0YUZyb21EZWNvZGVyID09IE00T1NBX0ZBTFNFKSkgewotCi0gICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfa09wdGlvbklEX0VuYWJsZVl1dldpdGhFZmZlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pTTRPU0FfVFJVRSk7Ci0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiA9PSBlcnIpIHsKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0UmVuZGVyKAotICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaURlY0N0eHQsICZ0cywKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0LCBNNE9TQV9UUlVFKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSA9PQotICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaURlY0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9rT3B0aW9uSURfRW5hYmxlWXV2V2l0aEVmZmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pTTRPU0FfRkFMU0UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgPT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdFJlbmRlcigKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlEZWNDdHh0LCAmdHMsCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+bV9wUHJlUmVzaXplRnJhbWUsIE00T1NBX1RSVUUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFJlbmRlckZyYW1lV2l0aEVmZmVjdDogXAotICAgICAgICAgICAgICAgIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSAhPQotICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgewotICAgICAgICAgICAgaWYgKDAgIT0gcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnZpZGVvUm90YXRpb25EZWdyZWVzKSB7Ci0gICAgICAgICAgICAgICAgLy8gU2F2ZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHVuLXJvdGF0ZWQgZnJhbWUKLSAgICAgICAgICAgICAgICB5dXZGcmFtZVdpZHRoID0gcENsaXBDdHh0LT5tX3BQcmVSZXNpemVGcmFtZVswXS51X3dpZHRoOwotICAgICAgICAgICAgICAgIHl1dkZyYW1lSGVpZ2h0ID0gcENsaXBDdHh0LT5tX3BQcmVSZXNpemVGcmFtZVswXS51X2hlaWdodDsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Um90YXRlVmlkZW8ocENsaXBDdHh0LT5tX3BQcmVSZXNpemVGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnZpZGVvUm90YXRpb25EZWdyZWVzKTsKLSAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRSZW5kZXJGcmFtZVdpdGhFZmZlY3Q6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0ZVZpZGVvKCkgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogU2V0IHRoZSBuZXcgdmlkZW8gc2l6ZSBmb3IgdGVtcG9yYXJ5IGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRTZXRZVVY0MjBQbGFuZShwUmVzaXplUGxhbmUsCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+bV9wUHJlUmVzaXplRnJhbWVbMF0udV93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5tX3BQcmVSZXNpemVGcmFtZVswXS51X2hlaWdodCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYklzQ2xpcDEgPT0gTTRPU0FfVFJVRSkgewotICAgICAgICAgICAgcEMtPmJJc3NlY29uZENsaXAgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIG51bUVmZmVjdHMgPSBwQy0+bmJBY3RpdmVFZmZlY3RzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbnVtRWZmZWN0cyA9IHBDLT5uYkFjdGl2ZUVmZmVjdHMxOwotICAgICAgICAgICAgcEMtPmJJc3NlY29uZENsaXAgPSBNNE9TQV9UUlVFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBudW1FZmZlY3RzID4gMCkgewotICAgICAgICAgICAgcENsaXBDdHh0LT5iR2V0WXV2RGF0YUZyb21EZWNvZGVyID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIC8qIElmIHZpZGVvIGZyYW1lIG5lZWQgdG8gYmUgcmVzaXplZCBvciByb3RhdGVkLAotICAgICAgICAgICAgICogdGhlbiBhcHBseSB0aGUgb3ZlcmxheSBhZnRlciB0aGUgZnJhbWUgd2FzIHJlbmRlcmVkIHdpdGggcmVuZGVyaW5nIG1vZGUuCi0gICAgICAgICAgICAgKiBIZXJlIHNraXAgdGhlIGZyYW1pbmcob3ZlcmxheSkgZWZmZWN0IHdoZW4gYXBwbHlpbmcgdmlkZW8gRWZmZWN0LiAqLwotICAgICAgICAgICAgYlNraXBGcmFtaW5nRWZmZWN0ID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0KHBDLAotICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+bV9wUHJlUmVzaXplRnJhbWUsIHBSZXNpemVQbGFuZSwgYlNraXBGcmFtaW5nRWZmZWN0KTsKLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50UmVuZGVyRnJhbWVXaXRoRWZmZWN0OiBcCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0KCkgZXJyIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lPSBwUmVzaXplUGxhbmU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lID0gcENsaXBDdHh0LT5tX3BQcmVSZXNpemVGcmFtZTsKLSAgICAgICAgfQotICAgICAgICAvKiBEbyByZW5kZXJpbmcgbW9kZSAqLwotICAgICAgICBpZiAoKHBDbGlwQ3R4dC0+YkdldFl1dkRhdGFGcm9tRGVjb2RlciA9PSBNNE9TQV9UUlVFKSB8fAotICAgICAgICAgICAgKHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSAhPQotICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkpIHsKLSAgICAgICAgICAgIGlmIChiSXNDbGlwMSA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBDLT5iQ2xpcDFBY3RpdmVGcmFtaW5nRWZmZWN0ID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKHBUZW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dFswXS51X3dpZHRoLCBwUGxhbmVPdXRbMF0udV9oZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBUbXAgPSBwVGVtcDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwVG1wID0gcEMtPnl1djE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBcHBseVJlbmRlcmluZ01vZGUgKHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPnhWU1MuTWVkaWFSZW5kZXJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lLHBUbXApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAocEMtPmJDbGlwMkFjdGl2ZUZyYW1pbmdFZmZlY3QgPT0gTTRPU0FfVFJVRSkgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAocFRlbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBsYW5lT3V0WzBdLnVfd2lkdGgsIHBQbGFuZU91dFswXS51X2hlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRWUFA6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcFRtcCA9IHBUZW1wOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBUbXAgPSBwQy0+eXV2MjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFwcGx5UmVuZGVyaW5nTW9kZSAocEMsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+eFZTUy5NZWRpYVJlbmRlcmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyUmVuZGVyRnJhbWUscFRtcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFJlbmRlckZyYW1lV2l0aEVmZmVjdDogXAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXBwbHlSZW5kZXJpbmdNb2RlIGVycm9yIDB4JXggIiwgZXJyKTsKLSAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTwzOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBUZW1wW2ldLnBhY19kYXRhICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFRlbXBbaV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBbaV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBBcHBseSBvdmVybGF5IGlmIG92ZXJsYXkgZXhpc3QqLwotICAgICAgICAgICAgaWYgKGJJc0NsaXAxID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgICAgICAgICBpZiAocEMtPmJDbGlwMUFjdGl2ZUZyYW1pbmdFZmZlY3QgPT0gTTRPU0FfVFJVRSkgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXBwbHlWaWRlb092ZXJsYXkocEMsCi0gICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwgcEMtPnl1djEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPmxhc3REZWNvZGVkUGxhbmUgPSBwQy0+eXV2MTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBDLT5iQ2xpcDJBY3RpdmVGcmFtaW5nRWZmZWN0ID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9PdmVybGF5KHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsIHBDLT55dXYyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5sYXN0RGVjb2RlZFBsYW5lID0gcEMtPnl1djI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFZQUDogXAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXBwbHlWaWRlb092ZXJsYXkpIGVycm9yIDB4JXggIiwgZXJyKTsKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPDM7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAocFRlbXBbaV0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwVGVtcFtpXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFtpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPmxhc3REZWNvZGVkUGxhbmUgPSBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3Q7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZnJlZSB0aGUgdGVtcCBidWZmZXIKLSAgICAgICAgZm9yIChpPTA7IGk8MzsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAocFRlbXBbaV0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgIGZyZWUocFRlbXBbaV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgIHBUZW1wW2ldLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICgocENsaXBDdHh0LT5wU2V0dGluZ3MtPkZpbGVUeXBlID09Ci0gICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgJiYKLSAgICAgICAgICAgICAocEMtPm5iQWN0aXZlRWZmZWN0cyA9PSAwKSAmJgotICAgICAgICAgICAgIChwQ2xpcEN0eHQtPmJHZXRZdXZEYXRhRnJvbURlY29kZXIgPT0gTTRPU0FfVFJVRSkpIHsKLSAgICAgICAgICAgIGlmIChiSXNDbGlwMSA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlEZWNDdHh0LAotICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfa09wdGlvbklEX1l1dldpdGhFZmZlY3ROb25Db250aWd1b3VzLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbilwQy0+eXV2MSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX2tPcHRpb25JRF9ZdXZXaXRoRWZmZWN0Tm9uQ29udGlndW91cywKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pcEMtPnl1djIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRSZW5kZXJGcmFtZVdpdGhFZmZlY3Q6IFwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCBkZWNvZGVyIHNldE9wdGlvbiBlcnJvciAweCV4ICIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+YkdldFl1dkRhdGFGcm9tRGVjb2RlciA9IE00T1NBX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVzZXQgb3JpZ2luYWwgd2lkdGggYW5kIGhlaWdodCBmb3IgcmVzaXplIGZyYW1lIHBsYW5lCi0gICAgICAgIGlmICgwICE9IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy52aWRlb1JvdGF0aW9uRGVncmVlcyAmJgotICAgICAgICAgICAgMTgwICE9IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy52aWRlb1JvdGF0aW9uRGVncmVlcykgewotCi0gICAgICAgICAgICBNNFZTUzNHUFBfaW50U2V0WVVWNDIwUGxhbmUocENsaXBDdHh0LT5tX3BQcmVSZXNpemVGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXZGcmFtZVdpZHRoLCB5dXZGcmFtZUhlaWdodCk7Ci0gICAgICAgIH0KLQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIE5vIHJvdGF0ZSBvciBubyByZXNpemUgY2FzZSovCi0gICAgICAgIGlmIChiSXNDbGlwMSA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgICAgICBudW1FZmZlY3RzID0gcEMtPm5iQWN0aXZlRWZmZWN0czsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG51bUVmZmVjdHMgPSBwQy0+bmJBY3RpdmVFZmZlY3RzMTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKG51bUVmZmVjdHMgPiAwKSB7Ci0gICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0UmVuZGVyKAotICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCwgJnRzLCBwUGxhbmVOb1Jlc2l6ZSwgTTRPU0FfVFJVRSk7Ci0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFJlbmRlckZyYW1lV2l0aEVmZmVjdDogXAotICAgICAgICAgICAgICAgICAgICBSZW5kZXIgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBiU2tpcEZyYW1pbmdFZmZlY3QgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIGlmIChiSXNDbGlwMSA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgICAgICAgICAgcEMtPmJJc3NlY29uZENsaXAgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXBwbHlWaWRlb0VmZmVjdChwQywgcFBsYW5lTm9SZXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnl1djEsIGJTa2lwRnJhbWluZ0VmZmVjdCk7Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5sYXN0RGVjb2RlZFBsYW5lID0gcEMtPnl1djE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBDLT5iSXNzZWNvbmRDbGlwID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXBwbHlWaWRlb0VmZmVjdChwQywgcFBsYW5lTm9SZXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnl1djIsIGJTa2lwRnJhbWluZ0VmZmVjdCk7Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5sYXN0RGVjb2RlZFBsYW5lID0gcEMtPnl1djI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50UmVuZGVyRnJhbWVXaXRoRWZmZWN0OiBcCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0IGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgIGlmIChiSXNDbGlwMSA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgICAgICAgICAgcFRtcCA9IHBDLT55dXYxOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwVG1wID0gcEMtPnl1djI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0UmVuZGVyKAotICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCwgJnRzLCBwVG1wLCBNNE9TQV9UUlVFKTsKLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50UmVuZGVyRnJhbWVXaXRoRWZmZWN0OiBcCi0gICAgICAgICAgICAgICAgICAgIFJlbmRlciByZXR1cm5zIGVycm9yIDB4JXgsIiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcENsaXBDdHh0LT5sYXN0RGVjb2RlZFBsYW5lID0gcFRtcDsKLSAgICAgICAgfQotICAgICAgICBwQ2xpcEN0eHQtPmlWaWRlb1JlbmRlckN0cyA9IChNNE9TQV9JbnQzMil0czsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludFJvdGF0ZVZpZGVvKE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHJvdGF0aW9uRGVncmVlKSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSBvdXRQbGFuZVszXTsKLQotICAgIGlmIChyb3RhdGlvbkRlZ3JlZSAhPSAxODApIHsKLSAgICAgICAgLy8gU3dhcCB3aWR0aCBhbmQgaGVpZ2h0IG9mIGluIHBsYW5lCi0gICAgICAgIG91dFBsYW5lWzBdLnVfd2lkdGggPSBwUGxhbmVJblswXS51X2hlaWdodDsKLSAgICAgICAgb3V0UGxhbmVbMF0udV9oZWlnaHQgPSBwUGxhbmVJblswXS51X3dpZHRoOwotICAgICAgICBvdXRQbGFuZVswXS51X3N0cmlkZSA9IG91dFBsYW5lWzBdLnVfd2lkdGg7Ci0gICAgICAgIG91dFBsYW5lWzBdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgIG91dFBsYW5lWzBdLnBhY19kYXRhID0gKE00T1NBX1VJbnQ4ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgKG91dFBsYW5lWzBdLnVfc3RyaWRlKm91dFBsYW5lWzBdLnVfaGVpZ2h0KSwgTTRWUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyKikoIm91dCBZIHBsYW5lIGZvciByb3RhdGlvbiIpKTsKLSAgICAgICAgaWYgKG91dFBsYW5lWzBdLnBhY19kYXRhID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIG91dFBsYW5lWzFdLnVfd2lkdGggPSBwUGxhbmVJblswXS51X2hlaWdodC8yOwotICAgICAgICBvdXRQbGFuZVsxXS51X2hlaWdodCA9IHBQbGFuZUluWzBdLnVfd2lkdGgvMjsKLSAgICAgICAgb3V0UGxhbmVbMV0udV9zdHJpZGUgPSBvdXRQbGFuZVsxXS51X3dpZHRoOwotICAgICAgICBvdXRQbGFuZVsxXS51X3RvcGxlZnQgPSAwOwotICAgICAgICBvdXRQbGFuZVsxXS5wYWNfZGF0YSA9IChNNE9TQV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgIChvdXRQbGFuZVsxXS51X3N0cmlkZSpvdXRQbGFuZVsxXS51X2hlaWdodCksIE00VlMsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciopKCJvdXQgVSBwbGFuZSBmb3Igcm90YXRpb24iKSk7Ci0gICAgICAgIGlmIChvdXRQbGFuZVsxXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICBmcmVlKCh2b2lkICopb3V0UGxhbmVbMF0ucGFjX2RhdGEpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgb3V0UGxhbmVbMl0udV93aWR0aCA9IHBQbGFuZUluWzBdLnVfaGVpZ2h0LzI7Ci0gICAgICAgIG91dFBsYW5lWzJdLnVfaGVpZ2h0ID0gcFBsYW5lSW5bMF0udV93aWR0aC8yOwotICAgICAgICBvdXRQbGFuZVsyXS51X3N0cmlkZSA9IG91dFBsYW5lWzJdLnVfd2lkdGg7Ci0gICAgICAgIG91dFBsYW5lWzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgIG91dFBsYW5lWzJdLnBhY19kYXRhID0gKE00T1NBX1VJbnQ4ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgKG91dFBsYW5lWzJdLnVfc3RyaWRlKm91dFBsYW5lWzJdLnVfaGVpZ2h0KSwgTTRWUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyKikoIm91dCBWIHBsYW5lIGZvciByb3RhdGlvbiIpKTsKLSAgICAgICAgaWYgKG91dFBsYW5lWzJdLnBhY19kYXRhID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgIGZyZWUoKHZvaWQgKilvdXRQbGFuZVswXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICBmcmVlKCh2b2lkICopb3V0UGxhbmVbMV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3dpdGNoKHJvdGF0aW9uRGVncmVlKSB7Ci0gICAgICAgIGNhc2UgOTA6Ci0gICAgICAgICAgICBNNFZJRklfUm90YXRlOTBSaWdodFlVVjQyMHRvWVVWNDIwKE00T1NBX05VTEwsIHBQbGFuZUluLCBvdXRQbGFuZSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDE4MDoKLSAgICAgICAgICAgIC8vIEluIHBsYW5lIHJvdGF0aW9uLCBzbyBwbGFuZU91dCA9IHBsYW5lSW4KLSAgICAgICAgICAgIE00VklGSV9Sb3RhdGUxODBZVVY0MjB0b1lVVjQyMChNNE9TQV9OVUxMLCBwUGxhbmVJbiwgcFBsYW5lSW4pOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAyNzA6Ci0gICAgICAgICAgICBNNFZJRklfUm90YXRlOTBMZWZ0WVVWNDIwdG9ZVVY0MjAoTTRPU0FfTlVMTCwgcFBsYW5lSW4sIG91dFBsYW5lKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiaW52YWxpZCByb3RhdGlvbiBwYXJhbSAlZCIsIChpbnQpcm90YXRpb25EZWdyZWUpOwotICAgICAgICAgICAgZXJyID0gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKHJvdGF0aW9uRGVncmVlICE9IDE4MCkgewotICAgICAgICBtZW1zZXQoKHZvaWQgKilwUGxhbmVJblswXS5wYWNfZGF0YSwgMCwKLSAgICAgICAgICAgIChwUGxhbmVJblswXS51X3dpZHRoKnBQbGFuZUluWzBdLnVfaGVpZ2h0KSk7Ci0gICAgICAgIG1lbXNldCgodm9pZCAqKXBQbGFuZUluWzFdLnBhY19kYXRhLCAwLAotICAgICAgICAgICAgKHBQbGFuZUluWzFdLnVfd2lkdGgqcFBsYW5lSW5bMV0udV9oZWlnaHQpKTsKLSAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lSW5bMl0ucGFjX2RhdGEsIDAsCi0gICAgICAgICAgICAocFBsYW5lSW5bMl0udV93aWR0aCpwUGxhbmVJblsyXS51X2hlaWdodCkpOwotICAgICAgICAvLyBDb3B5IFksIFUgYW5kIFYgcGxhbmVzCi0gICAgICAgIG1lbWNweSgodm9pZCAqKXBQbGFuZUluWzBdLnBhY19kYXRhLCAodm9pZCAqKW91dFBsYW5lWzBdLnBhY19kYXRhLAotICAgICAgICAgICAgKHBQbGFuZUluWzBdLnVfd2lkdGgqcFBsYW5lSW5bMF0udV9oZWlnaHQpKTsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopcFBsYW5lSW5bMV0ucGFjX2RhdGEsICh2b2lkICopb3V0UGxhbmVbMV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAocFBsYW5lSW5bMV0udV93aWR0aCpwUGxhbmVJblsxXS51X2hlaWdodCkpOwotICAgICAgICBtZW1jcHkoKHZvaWQgKilwUGxhbmVJblsyXS5wYWNfZGF0YSwgKHZvaWQgKilvdXRQbGFuZVsyXS5wYWNfZGF0YSwKLSAgICAgICAgICAgIChwUGxhbmVJblsyXS51X3dpZHRoKnBQbGFuZUluWzJdLnVfaGVpZ2h0KSk7Ci0KLSAgICAgICAgZnJlZSgodm9pZCAqKW91dFBsYW5lWzBdLnBhY19kYXRhKTsKLSAgICAgICAgZnJlZSgodm9pZCAqKW91dFBsYW5lWzFdLnBhY19kYXRhKTsKLSAgICAgICAgZnJlZSgodm9pZCAqKW91dFBsYW5lWzJdLnBhY19kYXRhKTsKLQotICAgICAgICAvLyBTd2FwIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBpbiBwbGFuZQotICAgICAgICB1aW50MzJfdCB0ZW1wID0gMDsKLSAgICAgICAgdGVtcCA9IHBQbGFuZUluWzBdLnVfd2lkdGg7Ci0gICAgICAgIHBQbGFuZUluWzBdLnVfd2lkdGggPSBwUGxhbmVJblswXS51X2hlaWdodDsKLSAgICAgICAgcFBsYW5lSW5bMF0udV9oZWlnaHQgPSB0ZW1wOwotICAgICAgICBwUGxhbmVJblswXS51X3N0cmlkZSA9IHBQbGFuZUluWzBdLnVfd2lkdGg7Ci0KLSAgICAgICAgdGVtcCA9IHBQbGFuZUluWzFdLnVfd2lkdGg7Ci0gICAgICAgIHBQbGFuZUluWzFdLnVfd2lkdGggPSBwUGxhbmVJblsxXS51X2hlaWdodDsKLSAgICAgICAgcFBsYW5lSW5bMV0udV9oZWlnaHQgPSB0ZW1wOwotICAgICAgICBwUGxhbmVJblsxXS51X3N0cmlkZSA9IHBQbGFuZUluWzFdLnVfd2lkdGg7Ci0KLSAgICAgICAgdGVtcCA9IHBQbGFuZUluWzJdLnVfd2lkdGg7Ci0gICAgICAgIHBQbGFuZUluWzJdLnVfd2lkdGggPSBwUGxhbmVJblsyXS51X2hlaWdodDsKLSAgICAgICAgcFBsYW5lSW5bMl0udV9oZWlnaHQgPSB0ZW1wOwotICAgICAgICBwUGxhbmVJblsyXS51X3N0cmlkZSA9IHBQbGFuZUluWzJdLnVfd2lkdGg7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRTZXRZVVY0MjBQbGFuZShNNFZJRklfSW1hZ2VQbGFuZSogcGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHdpZHRoLCBNNE9TQV9VSW50MzIgaGVpZ2h0KSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIGlmIChwbGFuZUluID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk5VTEwgaW4gcGxhbmUsIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgcGxhbmVJblswXS51X3dpZHRoID0gd2lkdGg7Ci0gICAgcGxhbmVJblswXS51X2hlaWdodCA9IGhlaWdodDsKLSAgICBwbGFuZUluWzBdLnVfc3RyaWRlID0gcGxhbmVJblswXS51X3dpZHRoOwotCi0gICAgcGxhbmVJblsxXS51X3dpZHRoID0gd2lkdGgvMjsKLSAgICBwbGFuZUluWzFdLnVfaGVpZ2h0ID0gaGVpZ2h0LzI7Ci0gICAgcGxhbmVJblsxXS51X3N0cmlkZSA9IHBsYW5lSW5bMV0udV93aWR0aDsKLQotICAgIHBsYW5lSW5bMl0udV93aWR0aCA9IHdpZHRoLzI7Ci0gICAgcGxhbmVJblsyXS51X2hlaWdodCA9IGhlaWdodC8yOwotICAgIHBsYW5lSW5bMl0udV9zdHJpZGUgPSBwbGFuZUluWzFdLnVfd2lkdGg7Ci0KLSAgICByZXR1cm4gZXJyOwotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfTWVkaWFBbmRDb2RlY1N1YnNjcmlwdGlvbi5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfTWVkaWFBbmRDb2RlY1N1YnNjcmlwdGlvbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMzBmNzA1Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNTdWJzY3JpcHRpb24uYworKysgL2Rldi9udWxsCkBAIC0xLDQ2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNTdWJzY3JpcHRpb24uYwotICogQGJyaWVmICAgIE1lZGlhIHJlYWRlcnMgYW5kIGNvZGVjcyBzdWJzY3JpcHRpb24KLSAqIEBub3RlICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBzdWJzY3JpcHRpb24gb2Ygc3VwcG9ydGVkIG1lZGlhCi0gKiAgICAgICAgICAgIHJlYWRlcnMgYW5kIGRlY29kZXJzIGZvciB0aGUgVlNTLiBQb3RlbnRpYWwgc3VwcG9ydCBjYW4KLSAqICAgICAgICAgICAgYmUgYWN0aXZhdGVkIG9yIGRlLWFjdGl2YXRlZAotICogICAgICAgICAgICB1c2luZyBjb21waWxhdGlvbiBmbGFncyBzZXQgaW4gdGhlIHByb2plY3RzIHNldHRpbmdzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotCi0KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbFR5cGVzLmgiICAgICAgICAgICAgICAgIC8qKjwgSW5jbHVkZSBmb3IgVlNTIHNwZWNpZmljIHR5cGVzICovCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsRnVuY3Rpb25zLmgiICAgICAgICAgICAgLyoqPCBSZWdpc3RyYXRpb24gbW9kdWxlICovCi0KLS8qIF9fX19fX19fX19fX19fX19fX19fX19fICovCi0vKnwgICAgICAgICAgICAgICAgICAgICAgIHwqLwotLyp8ICByZWFkZXIgc3Vic2NyaXB0aW9uICB8Ki8KLS8qfF9fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLS8qIFJlYWRlciByZWdpc3RyYXRpb24gOiBhdCBsZWFzdCBvbmUgcmVhZGVyIG11c3QgYmUgZGVmaW5lZCAqLwotI2lmbmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl8zR1AKLSNpZm5kZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfQU1SCi0jaWZuZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSX01QMwotI2lmbmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl9QQ00KLSNpZm5kZWYgTTRWU1NfU1VQUE9SVF9BVURFQ19OVUxMCi0jZXJyb3IgIm5vIHJlYWRlciByZWdpc3RlcmVkIgotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfQVVERUNfTlVMTCAqLwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfUkVBREVSX1BDTSAqLwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfUkVBREVSX01QMyAqLwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfUkVBREVSX0FNUiAqLwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfUkVBREVSXzNHUCAqLwotCi0vKiBUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBNUEVHNCBkZWNvZGVyICovCi0jaWYgIWRlZmluZWQoTTRWU1NfU1VQUE9SVF9WSURFQ18zR1ApICYmICFkZWZpbmVkKE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUykKLSNlcnJvciAiV2FpdCwgd2hhdD8iCi0vKiAiSGV5LCB0aGlzIGlzIHRoZSBWU1MzR1BQIHNwZWFraW5nLiBQcmF5IHRlbGwsIGhvdyB0aGUgaGVjayBkbyB5b3UgZXhwZWN0IG1lIHRvIGJlIGFibGUgdG8gZG8KLWFueSBlZGl0aW5nIHdpdGhvdXQgYSBidWlsdC1pbiB2aWRlbyBkZWNvZGVyLCBub3IgdGhlIHBvc3NpYmlsaXR5IHRvIHJlY2VpdmUgYW4gZXh0ZXJuYWwgb25lPyEKLVNlcmlvdXNseSwgSSdkIGxvdmUgdG8ga25vdy4iICovCi0jZW5kaWYKLQotLyogSW5jbHVkZSBmaWxlcyBmb3IgZWFjaCByZWFkZXIgdG8gc3Vic2NyaWJlICovCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfM0dQCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3IzZ3BSZWFkZXIuaCIKLSNlbmRpZgotI2lmZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSX0FNUgotI2luY2x1ZGUgIk00UkVBREVSX0Ftci5oIgotI2VuZGlmCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfTVAzCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JNcDNSZWFkZXIuaCIKLSNlbmRpZgotI2lmZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSX1BDTQotI2luY2x1ZGUgIk00UkVBREVSX1BjbS5oIgotI2VuZGlmCi0KLQotLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCi0vKnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLS8qfCAgYXVkaW8gZGVjb2RlciBzdWJzY3JpcHRpb24gIHwqLwotLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLSNpbmNsdWRlICJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlci5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyLmgiCi0jaW5jbHVkZSAiTTRERUNPREVSX051bGwuaCIKLSNpZmRlZiBNNFZTU19TVVBQT1JUX0FVREVDX05VTEwKLSNpbmNsdWRlICJNNEFEX051bGwuaCIKLSNlbmRpZgotCi0vKiBfX19fX19fX19fX19fX19fX19fX19fXyAqLwotLyp8ICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLS8qfCAgd3JpdGVyIHN1YnNjcmlwdGlvbiAgfCovCi0vKnxfX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0vKiBXcml0ZXIgcmVnaXN0cmF0aW9uIDogYXQgbGVhc3Qgb25lIHdyaXRlciBtdXN0IGJlIGRlZmluZWQgKi8KLS8vI2lmbmRlZiBNNFZTU19TVVBQT1JUX1dSSVRFUl9BTVIKLSNpZm5kZWYgTTRWU1NfU1VQUE9SVF9XUklURVJfM0dQUAotI2Vycm9yICJubyB3cml0ZXIgcmVnaXN0ZXJlZCIKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1dSSVRFUl8zR1BQICovCi0vLyNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1dSSVRFUl9BTVIgKi8KLQotLyogSW5jbHVkZSBmaWxlcyBmb3IgZWFjaCB3cml0ZXIgdG8gc3Vic2NyaWJlICovCi0vLyNpZmRlZiBNNFZTU19TVVBQT1JUX1dSSVRFUl9BTVIKLS8qZXh0ZXJuIE00T1NBX0VSUiBNNFdSSVRFUl9BTVJfZ2V0SW50ZXJmYWNlcyggTTRXUklURVJfT3V0cHV0RmlsZVR5cGUqIFR5cGUsCi1NNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqKiBTcmNHbG9iYWxJbnRlcmZhY2UsCi1NNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiogU3JjRGF0YUludGVyZmFjZSk7Ki8KLS8vI2VuZGlmCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9XUklURVJfM0dQUAotZXh0ZXJuIE00T1NBX0VSUiBNNFdSSVRFUl8zR1BfZ2V0SW50ZXJmYWNlcyggTTRXUklURVJfT3V0cHV0RmlsZVR5cGUqIFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSoqIFNyY0dsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSoqIFNyY0RhdGFJbnRlcmZhY2UpOwotI2VuZGlmCi0KLS8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0vKnwgIHZpZGVvIGVuY29kZXIgc3Vic2NyaXB0aW9uICB8Ki8KLS8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotI2luY2x1ZGUgIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXIuaCIKLQotCi0vKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi8KLS8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotLyp8ICBhdWRpbyBlbmNvZGVyIHN1YnNjcmlwdGlvbiAgfCovCi0vKnxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotCi0jZGVmaW5lIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKHJldHZhbCwgcG9pbnRlcikgaWYgKChwb2ludGVyKSA9PSBNNE9TQV9OVUxMKVwKLSAgICByZXR1cm4gKChNNE9TQV9FUlIpKHJldHZhbCkpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfU3Vic2NyaWJlTWVkaWFBbmRDb2RlYygpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiByZWdpc3RlcnMgdGhlIHJlYWRlciwgZGVjb2RlcnMsIHdyaXRlcnMgYW5kIGVuY29kZXJzCi0gKiAgICAgICAgICBpbiB0aGUgVlNTLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgIHBDb250ZXh0IGlzIE5VTEwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjKE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcENvbnRleHQpCi17Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNFJFQURFUl9NZWRpYVR5cGUgICAgICAgICAgcmVhZGVyTWVkaWFUeXBlOwotICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSogICBwUmVhZGVyR2xvYmFsSW50ZXJmYWNlOwotICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UqICAgICBwUmVhZGVyRGF0YUludGVyZmFjZTsKLQotICAgIE00V1JJVEVSX091dHB1dEZpbGVUeXBlICAgICB3cml0ZXJNZWRpYVR5cGU7Ci0gICAgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlKiAgIHBXcml0ZXJHbG9iYWxJbnRlcmZhY2U7Ci0gICAgTTRXUklURVJfRGF0YUludGVyZmFjZSogICAgIHBXcml0ZXJEYXRhSW50ZXJmYWNlOwotCi0gICAgTTRBRF9UeXBlICAgICAgICAgICAgICAgICAgIGF1ZGlvRGVjb2RlclR5cGU7Ci0gICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0ICAgICAgIGF1ZGlvQ29kZWNUeXBlOwotICAgIE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZSogcEF1ZGlvQ29kZWNJbnRlcmZhY2U7Ci0gICAgTTRBRF9JbnRlcmZhY2UqICAgICAgICAgICAgIHBBdWRpb0RlY29kZXJJbnRlcmZhY2U7Ci0KLSAgICBNNERFQ09ERVJfVmlkZW9UeXBlICAgICAgICAgdmlkZW9EZWNvZGVyVHlwZTsKLSAgICBNNEVOQ09ERVJfRm9ybWF0ICAgICAgICAgICAgdmlkZW9Db2RlY1R5cGU7Ci0gICAgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSogIHBWaWRlb0NvZGVjSW50ZXJmYWNlOwotICAgIE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSogICBwVmlkZW9EZWNvZGVySW50ZXJmYWNlOwotCi0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfUEFSQU1FVEVSLCBwQ29udGV4dCk7Ci0KLSAgICAvKiBfX19fX19fX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgICAgICAgfCovCi0gICAgLyp8ICByZWFkZXIgc3Vic2NyaXB0aW9uICB8Ki8KLSAgICAvKnxfX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0gICAgLyogLS0tIDNHUCAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSXzNHUAotICAgIGVyciA9IFZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldEludGVyZmFjZSggJnJlYWRlck1lZGlhVHlwZSwgJnBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAmcFJlYWRlckRhdGFJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl8zR1AgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyUmVhZGVyKCBwQ29udGV4dCwgcmVhZGVyTWVkaWFUeXBlLCBwUmVhZGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICBwUmVhZGVyRGF0YUludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciAzR1AgcmVhZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9SRUFERVJfM0dQICovCi0KLSAgICAvKiAtLS0gQU1SIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfQU1SCi0gICAgZXJyID0gTTRSRUFERVJfQU1SX2dldEludGVyZmFjZXMoICZyZWFkZXJNZWRpYVR5cGUsICZwUmVhZGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAmcFJlYWRlckRhdGFJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9BTVIgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyUmVhZGVyKCBwQ29udGV4dCwgcmVhZGVyTWVkaWFUeXBlLCBwUmVhZGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICBwUmVhZGVyRGF0YUludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBBTVIgcmVhZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9SRUFERVJfQU1SICovCi0KLSAgICAvKiAtLS0gTVAzIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfTVAzCi0gICAgZXJyID0gVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0SW50ZXJmYWNlKCAmcmVhZGVyTWVkaWFUeXBlLCAmcFJlYWRlckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICZwUmVhZGVyRGF0YUludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX01QMyBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNFZTUzNHUFBfcmVnaXN0ZXJSZWFkZXIoIHBDb250ZXh0LCByZWFkZXJNZWRpYVR5cGUsIHBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgIHBSZWFkZXJEYXRhSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAiTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIE1QMyByZWFkZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1JFQURFUl9NUDMgKi8KLQotICAgIC8qIC0tLSBQQ00gLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl9QQ00KLSAgICBlcnIgPSBNNFJFQURFUl9QQ01fZ2V0SW50ZXJmYWNlcyggJnJlYWRlck1lZGlhVHlwZSwgJnBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICZwUmVhZGVyRGF0YUludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX1BDTSBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNFZTUzNHUFBfcmVnaXN0ZXJSZWFkZXIoIHBDb250ZXh0LCByZWFkZXJNZWRpYVR5cGUsIHBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgIHBSZWFkZXJEYXRhSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAiTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIFBDTSByZWFkZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1JFQURFUl9QQ00gKi8KLQotICAgIC8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCAgdmlkZW8gZGVjb2RlciBzdWJzY3JpcHRpb24gIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0gICAgLyogLS0tIE1QRUc0ICYgSDI2MyAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfVklERUNfM0dQCi0gICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0SW50ZXJmYWNlX01QRUc0KCZ2aWRlb0RlY29kZXJUeXBlLCAoTTRPU0FfVm9pZCAqKSZwVmlkZW9EZWNvZGVySW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRERUNPREVSX01QRUc0IGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRGVjb2RlciggcENvbnRleHQsIHZpZGVvRGVjb2RlclR5cGUsIHBWaWRlb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgTVBFRzQgZGVjb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfVklERUNfM0dQICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX1ZJREVPX0FWQwotICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldEludGVyZmFjZV9IMjY0KCZ2aWRlb0RlY29kZXJUeXBlLCAoTTRPU0FfVm9pZCAqKSZwVmlkZW9EZWNvZGVySW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRERUNPREVSX0gyNjQgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyVmlkZW9EZWNvZGVyKCBwQ29udGV4dCwgdmlkZW9EZWNvZGVyVHlwZSwgcFZpZGVvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBIMjY0IGRlY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1ZJREVDXzNHUCAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9WSURFQ19OVUxMCi0gICAgZXJyID0gTTRERUNPREVSX05VTExfZ2V0SW50ZXJmYWNlKAotICAgICAgICAgICAgICAmdmlkZW9EZWNvZGVyVHlwZSwgJnBWaWRlb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRWRCBOVUxMIERlY29kZXIgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyVmlkZW9EZWNvZGVyKAotICAgICAgICAgICAgICBwQ29udGV4dCwgdmlkZW9EZWNvZGVyVHlwZSwgcFZpZGVvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBcCi0gICAgICAgIGNhbid0IHJlZ2lzdGVyIHZpZGVvIE5VTEwgZGVjb2RlciIpOwotI2VuZGlmCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCi0gICAgLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0gICAgLyp8ICBhdWRpbyBkZWNvZGVyIHN1YnNjcmlwdGlvbiAgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLSAgICAvKiAtLS0gQU1STkIgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0FVREVDX0FNUk5CCi0gICAgZXJyID0gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlX0FNUk5CKCZhdWRpb0RlY29kZXJUeXBlLCAmcEF1ZGlvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00IEFNUk5CIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRGVjb2RlciggcENvbnRleHQsIGF1ZGlvRGVjb2RlclR5cGUsIHBBdWRpb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgQU1STkIgZGVjb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfQVVERUNfQU1STkIgKi8KLQotICAgIC8qIC0tLSBBQUMgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0FVREVDX0FBQwotICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZV9BQUMoJmF1ZGlvRGVjb2RlclR5cGUsICZwQXVkaW9EZWNvZGVySW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTQgQUFDIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRGVjb2RlciggcENvbnRleHQsIGF1ZGlvRGVjb2RlclR5cGUsIHBBdWRpb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgQUFDIGRlY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX0FVREVDX0FBQyAqLwotCi0gICAgLyogLS0tIE1QMyAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfQVVERUNfTVAzCi0gICAgZXJyID0gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlX01QMygmYXVkaW9EZWNvZGVyVHlwZSwgJnBBdWRpb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNCBNUDMgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyQXVkaW9EZWNvZGVyKCBwQ29udGV4dCwgYXVkaW9EZWNvZGVyVHlwZSwgcEF1ZGlvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBNUDMgZGVjb2RlciIpOwotI2VuZGlmICAvKiBNNFZTU19TVVBQT1JUX0FVREVDX01QMyAqLwotCi0KLSAgICAvKiAtLS0gTlVMTCAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfQVVERUNfTlVMTAotICAgIGVyciA9IE00QURfTlVMTF9nZXRJbnRlcmZhY2UoICZhdWRpb0RlY29kZXJUeXBlLCAmcEF1ZGlvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00QUQgTlVMTCBEZWNvZGVyIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRGVjb2RlciggcENvbnRleHQsIGF1ZGlvRGVjb2RlclR5cGUsIHBBdWRpb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgRVZSQyBkZWNvZGVyIik7Ci0jZW5kaWYgIC8qIE00VlNTX1NVUFBPUlRfQVVERUNfTlVMTCAqLwotCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCAgd3JpdGVyIHN1YnNjcmlwdGlvbiAgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotCi0gICAgLyogLS0tIDNHUFAgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX1dSSVRFUl8zR1BQCi0gICAgLyogcmV0cmlldmVzIHRoZSAzR1BQIHdyaXRlciBtZWRpYSB0eXBlIGFuZCBwb2ludGVyIHRvIGZ1bmN0aW9ucyovCi0gICAgZXJyID0gTTRXUklURVJfM0dQX2dldEludGVyZmFjZXMoICZ3cml0ZXJNZWRpYVR5cGUsICZwV3JpdGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAmcFdyaXRlckRhdGFJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFdSSVRFUl8zR1AgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyV3JpdGVyKCBwQ29udGV4dCwgd3JpdGVyTWVkaWFUeXBlLCBwV3JpdGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICBwV3JpdGVyRGF0YUludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciAzR1BQIHdyaXRlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfV1JJVEVSXzNHUFAgKi8KLQotICAgIC8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCAgdmlkZW8gZW5jb2RlciBzdWJzY3JpcHRpb24gIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0gICAgLyogLS0tIE1QRUc0IC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX01QRUc0Ci0gICAgLyogcmV0cmlldmVzIHRoZSBNUEVHNCBlbmNvZGVyIHR5cGUgYW5kIHBvaW50ZXIgdG8gZnVuY3Rpb25zKi8KLSAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfTVBFRzQoJnZpZGVvQ29kZWNUeXBlLCAmcFZpZGVvQ29kZWNJbnRlcmZhY2UsCi0gICAgICAgICBNNEVOQ09ERVJfT1BFTl9BRFZBTkNFRCk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TVA0RV9NUEVHNCBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0VuY29kZXIoIHBDb250ZXh0LCB2aWRlb0NvZGVjVHlwZSwgcFZpZGVvQ29kZWNJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgdmlkZW8gTVBFRzQgZW5jb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9NUEVHNCAqLwotCi0gICAgLyogLS0tIEgyNjMgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfTVBFRzQKLSAgICAvKiByZXRyaWV2ZXMgdGhlIEgyNjMgZW5jb2RlciB0eXBlIGFuZCBwb2ludGVyIHRvIGZ1bmN0aW9ucyovCi0gICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0gyNjMoJnZpZGVvQ29kZWNUeXBlLCAmcFZpZGVvQ29kZWNJbnRlcmZhY2UsCi0gICAgICAgICBNNEVOQ09ERVJfT1BFTl9BRFZBTkNFRCk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TVA0RV9IMjYzIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRW5jb2RlciggcENvbnRleHQsIHZpZGVvQ29kZWNUeXBlLCBwVmlkZW9Db2RlY0ludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciB2aWRlbyBIMjYzIGVuY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfTVBFRzQgKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BVkMKLSAgICAvKiByZXRyaWV2ZXMgdGhlIEgyNjQgZW5jb2RlciB0eXBlIGFuZCBwb2ludGVyIHRvIGZ1bmN0aW9ucyovCi0gICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0gyNjQoJnZpZGVvQ29kZWNUeXBlLCAmcFZpZGVvQ29kZWNJbnRlcmZhY2UsCi0gICAgICAgICBNNEVOQ09ERVJfT1BFTl9BRFZBTkNFRCk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBNNEgyNjRFIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRW5jb2RlciggcENvbnRleHQsIHZpZGVvQ29kZWNUeXBlLCBwVmlkZW9Db2RlY0ludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciB2aWRlbyBIMjY0IGVuY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfQVZDICovCi0KLSAgICAvKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLSAgICAvKnwgIGF1ZGlvIGVuY29kZXIgc3Vic2NyaXB0aW9uICB8Ki8KLSAgICAvKnxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotICAgIC8qIC0tLSBBTVIgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfQU1SCi0gICAgLyogcmV0cmlldmVzIHRoZSBBTVIgZW5jb2RlciB0eXBlIGFuZCBwb2ludGVyIHRvIGZ1bmN0aW9ucyovCi0gICAgZXJyID0gVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0FNUk5CKCZhdWRpb0NvZGVjVHlwZSwgJnBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRBTVIgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKCBwQ29udGV4dCwgYXVkaW9Db2RlY1R5cGUsIHBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAiTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIGF1ZGlvIEFNUiBlbmNvZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FNUiAqLwotCi0gICAgLyogLS0tIEFBQyAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BQUMKLSAgICAvKiByZXRyaWV2ZXMgdGhlIEFBQyBlbmNvZGVyIHR5cGUgYW5kIHBvaW50ZXIgdG8gZnVuY3Rpb25zKi8KLSAgICBlcnIgPSBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfQUFDKCZhdWRpb0NvZGVjVHlwZSwgJnBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRBQUMgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKCBwQ29udGV4dCwgYXVkaW9Db2RlY1R5cGUsIHBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAiTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIGF1ZGlvIEFBQyBlbmNvZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FBQyAqLwotCi0gICAgLyogLS0tIEVWUkMgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfRVZSQwotICAgIC8qIHJldHJpZXZlcyB0aGUgRVZSQyBlbmNvZGVyIHR5cGUgYW5kIHBvaW50ZXIgdG8gZnVuY3Rpb25zKi8KLSAgICBlcnIgPSBNNEVWUkNfZ2V0SW50ZXJmYWNlcyggJmF1ZGlvQ29kZWNUeXBlLCAmcEF1ZGlvQ29kZWNJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNEVWUkMgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKCBwQ29udGV4dCwgYXVkaW9Db2RlY1R5cGUsIHBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAiTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIGF1ZGlvIEVWUkMgZW5jb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9FVlJDICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLSAgICBwQ29udGV4dC0+YkFsbG93RnJlZWluZ09NWENvZGVjSW50ZXJmYWNlID0gTTRPU0FfVFJVRTsgICAvKiB3aGVuIE5YUCBTVyBjb2RlY3MgYXJlIHJlZ2lzdGVyZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVuIGFsbG93IHVucmVnaXN0cmF0aW9uKi8KLSNlbmRpZgotCi0KLSAgICByZXR1cm4gZXJyOwotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000eFZTU19BUEkuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTR4VlNTX0FQSS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZjU0MTBiLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTR4VlNTX0FQSS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjM2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTR4VlNTX0FQSS5jCi0gKiBAYnJpZWYgICAgQVBJIG9mIGVYdGVuZGVkIFZpZGVvIFN0dWRpbyBTZXJ2aWNlIChWaWRlbyBTdHVkaW8gMi4xKQotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0vKioKLSAqIE9TQUwgbWFpbiB0eXBlcyBhbmQgZXJyb3JzICoqKi8KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlUmVhZGVyLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVdyaXRlci5oIgotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotI2luY2x1ZGUgIk00T1NBX0NoYXJTdGFyLmgiCi0vLyBTdGFnZUZyaWdodCBlbmNvZGVycyByZXF1aXJlICUxNiByZXNvbHV0aW9uCi0jaW5jbHVkZSAiTTRFTkNPREVSX2NvbW1vbi5oIgotI2luY2x1ZGUgIk00REVDT0RFUl9Db21tb24uaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlci5oIgotCi0vKioKLSAqIFZTUyAzR1BQIEFQSSBkZWZpbml0aW9uICovCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0Vycm9yQ29kZXMuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioKLUJlZ2luIG9mIHhWU1MgQVBJCi0gKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJNNHhWU1NfQVBJLmgiCi0jaW5jbHVkZSAiTTR4VlNTX0ludGVybmFsLmgiCi0KLS8qIFJDOiB0byBkZWxldGUgdW5lY2Vzc2FyeSB0ZW1wIGZpbGVzIG9uIHRoZSBmbHkgKi8KLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxUeXBlcy5oIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX0luaXQoTTRPU0FfQ29udGV4dCogcENvbnRleHQsIE00eFZTU19Jbml0UGFyYW1zKiBwUGFyYW1zKQotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSB4VlNTCi0gKiBAbm90ZSAgICAgICAgSW5pdGlhbGl6ZXMgdGhlIHhWU1MgZWRpdCBvcGVyYXRpb24gKGFsbG9jYXRlcyBhbiBleGVjdXRpb24gY29udGV4dCkuCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKE9VVCkgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQgdG8gYWxsb2NhdGUKLSAqIEBwYXJhbSAgICBwYXJhbXMgICAgICAgICAgICAgICAgKElOKSBQYXJhbWV0ZXJzIG1hbmRhdG9yeSBmb3IgeFZTUwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLU00T1NBX0VSUiBNNHhWU1NfSW5pdCggTTRPU0FfQ29udGV4dCAqcENvbnRleHQsIE00eFZTU19Jbml0UGFyYW1zICpwUGFyYW1zICkKLXsKLSAgICBNNHhWU1NfQ29udGV4dCAqeFZTU19jb250ZXh0OwotICAgIE00T1NBX1VJbnQzMiBsZW5ndGggPSAwLCBpOwotCi0gICAgaWYoIHBQYXJhbXMgPT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiUGFyYW1ldGVyIHN0cnVjdHVyZSBmb3IgTTR4VlNTX0luaXQgZnVuY3Rpb24gaXMgTlVMTCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmKCBwUGFyYW1zLT5wRmlsZVJlYWRQdHIgPT0gTTRPU0FfTlVMTAotICAgICAgICB8fCBwUGFyYW1zLT5wRmlsZVdyaXRlUHRyID09IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAicEZpbGVSZWFkUHRyIG9yIHBGaWxlV3JpdGVQdHIgaW4gTTR4VlNTX0luaXRQYXJhbXMgc3RydWN0dXJlIGlzIE5VTEwiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19Db250ZXh0KSwgTTRWUywKLSAgICAgICAgKE00T1NBX0NoYXIgKikiQ29udGV4dCBvZiB0aGUgeFZTUyBsYXllciIpOwotCi0gICAgaWYoIHhWU1NfY29udGV4dCA9PSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19Jbml0Iik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAvKiBJbml0aWFsaXplIGZpbGUgcmVhZC93cml0ZSBmdW5jdGlvbnMgcG9pbnRlcnMgKi8KLSAgICB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0ciA9IHBQYXJhbXMtPnBGaWxlUmVhZFB0cjsKLSAgICB4VlNTX2NvbnRleHQtPnBGaWxlV3JpdGVQdHIgPSBwUGFyYW1zLT5wRmlsZVdyaXRlUHRyOwotCi0gICAgLypVVEYgQ29udmVyc2lvbiBzdXBwb3J0OiBjb3B5IGNvbnZlcnNpb24gZnVuY3Rpb25zIHBvaW50ZXJzIGFuZCBhbGxvY2F0ZSB0aGUgdGVtcG9yYXJ5Ci0gICAgIGJ1ZmZlciovCi0gICAgaWYoIHBQYXJhbXMtPnBDb252RnJvbVVURjhGY3QgIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBpZiggcFBhcmFtcy0+cENvbnZUb1VURjhGY3QgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCA9Ci0gICAgICAgICAgICAgICAgcFBhcmFtcy0+cENvbnZGcm9tVVRGOEZjdDsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZUb1VURjhGY3QgPQotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBDb252VG9VVEY4RmN0OwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5tX1RlbXBPdXRDb252ZXJzaW9uU2l6ZSA9Ci0gICAgICAgICAgICAgICAgVVRGX0NPTlZFUlNJT05fQlVGRkVSX1NJWkU7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoVVRGX0NPTlZFUlNJT05fQlVGRkVSX1NJWkUKLSAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VSW50OCksCi0gICAgICAgICAgICAgICAgTTRWQSwgKE00T1NBX0NoYXIgKikiTTR4VlNTX0luaXQ6IFVURiBjb252ZXJzaW9uIGJ1ZmZlciIpOwotCi0gICAgICAgICAgICBpZiggTTRPU0FfTlVMTAotICAgICAgICAgICAgICAgID09IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfSW5pdCIpOwotICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wVGVtcFBhdGgpOwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTR4VlNTX0luaXQ6IG9uZSBVVEYgY29udmVyc2lvbiBwb2ludGVyIGlzIG51bGwgYW5kIHRoZSBvdGhlclwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBudWxsIik7Ci0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFRlbXBQYXRoKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCA9IE00T1NBX05VTEw7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZUb1VURjhGY3QgPSBNNE9TQV9OVUxMOwotICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0Lm1fVGVtcE91dENvbnZlcnNpb25TaXplID0gMDsKLSAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIgPQotICAgICAgICAgICAgTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggcFBhcmFtcy0+cFRlbXBQYXRoICE9IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgLypObyBuZWVkIHRvIGNvbnZlcnQgaW50byBVVEY4IGFzIGFsbCBpbnB1dCBvZiB4VlNTIGFyZSBpbiBVVEY4Ci0gICAgICAgICh0aGUgY29udmVyc2lvbiBjdXN0b21lciBmb3JtYXQgaW50byBVVEY4Ci0gICAgICAgIGlzIGRvbmUgaW4gVkEvVkFMKSovCi0gICAgICAgIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoID0KLSAgICAgICAgICAgIChNNE9TQV9Wb2lkICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHN0cmxlbihwUGFyYW1zLT5wVGVtcFBhdGgpICsgMSwKLSAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopInhWU1MgUGF0aCBmb3IgdGVtcG9yYXJ5IGZpbGVzIik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfSW5pdCIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXhWU1NfY29udGV4dC0+cFRlbXBQYXRoLCAodm9pZCAqKXBQYXJhbXMtPnBUZW1wUGF0aCwKLSAgICAgICAgICAgIHN0cmxlbihwUGFyYW1zLT5wVGVtcFBhdGgpICsgMSk7Ci0gICAgICAgIC8qIFRPRE86IENoZWNrIHRoYXQgbm8gcHJldmlvdXMgeFZTUyB0ZW1wb3JhcnkgZmlsZXMgYXJlIHByZXNlbnQgPyAqLwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiUGF0aCBmb3IgdGVtcG9yYXJ5IGZpbGVzIGlzIE5VTEwiKTsKLSAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQpOwotICAgICAgICB4VlNTX2NvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzID0KLSAgICAgICAgKE00VlNTM0dQUF9FZGl0U2V0dGluZ3MgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9FZGl0U2V0dGluZ3MpLAotICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJDb3B5IG9mIFZTUyBzdHJ1Y3R1cmUiKTsKLQotICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncyA9PSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19Jbml0Iik7Ci0gICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wVGVtcFBhdGgpOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCA9IE00T1NBX05VTEw7Ci0gICAgICAgIGZyZWUoeFZTU19jb250ZXh0KTsKLSAgICAgICAgeFZTU19jb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8qIEluaXRpYWxpemUgcG9pbnRlcnMgaW4gcFNldHRpbmdzICovCi0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHMgPSBNNE9TQV9OVUxMOyAvKiBSQyAqLwotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayA9IE00T1NBX05VTEw7Ci0KLSAgICAvKiBUaGlzIGlzIHVzZWQgdG8ga25vdyBpZiB0aGUgdXNlciBoYXMgYWRkZWQgb3IgcmVtb3ZlZCBzb21lIG1lZGlhcyAqLwotICAgIHhWU1NfY29udGV4dC0+cHJldmlvdXNDbGlwTnVtYmVyID0gMDsKLQotICAgIC8qICJTdGF0ZSBtYWNoaW5lIiAqLwotICAgIHhWU1NfY29udGV4dC0+ZWRpdGluZ1N0ZXAgPSAwOwotICAgIHhWU1NfY29udGV4dC0+YW5hbHlzZVN0ZXAgPSAwOwotCi0gICAgeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSA9IE00T1NBX05VTEw7Ci0KLSAgICAvKiBJbml0aWFsaXplIFB0bzNHUFAgYW5kIE1DUyBsaXN0cyAqLwotICAgIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QgPSBNNE9TQV9OVUxMOwotICAgIHhWU1NfY29udGV4dC0+cFBUbzNHUFBwYXJhbXNMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICB4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtcyA9IE00T1NBX05VTEw7Ci0gICAgeFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcyA9IE00T1NBX05VTEw7Ci0KLSAgICB4VlNTX2NvbnRleHQtPnRlbXBGaWxlSW5kZXggPSAwOwotCi0gICAgeFZTU19jb250ZXh0LT50YXJnZXRlZEJpdHJhdGUgPSAwOwotCi0gICAgeFZTU19jb250ZXh0LT50YXJnZXRlZFRpbWVzY2FsZSA9IDA7Ci0KLSAgICB4VlNTX2NvbnRleHQtPnBBdWRpb01peENvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIHhWU1NfY29udGV4dC0+cEF1ZGlvTWl4U2V0dGluZ3MgPSBNNE9TQV9OVUxMOwotCi0gICAgLypGQjogaW5pdGlhbGl6ZSB0byBhdm9pZCBjcmFzaCB3aGVuIGVycm9yIGR1cmluZyB0aGUgZWRpdGluZyovCi0gICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncyA9IE00T1NBX05VTEw7Ci0KLSAgICAvKiBJbml0aWFsaXplIHN0YXRlIGlmIGFsbCBpbml0aWFsaXphdGlvbnMgYXJlIGNvcnJlY3RzICovCi0gICAgeFZTU19jb250ZXh0LT5tX3N0YXRlID0gTTR4VlNTX2tTdGF0ZUluaXRpYWxpemVkOwotCi0gICAgLyogaW5pdGlhbGl6ZSBNQ1MgY29udGV4dCovCi0gICAgeFZTU19jb250ZXh0LT5wTUNTX0N0eHQgPSBNNE9TQV9OVUxMOwotCi0gICAgKnBDb250ZXh0ID0geFZTU19jb250ZXh0OwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19SZWR1Y2VUcmFuc2NvZGUKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBjaGFuZ2VzIHRoZSBnaXZlbiBlZGl0aW5nIHN0cnVjdHVyZSBpbiBvcmRlciB0bwotICogICAgICAgICAgICAgICAgbWluaW1pemUgdGhlIHRyYW5zY29kaW5nIHRpbWUuCi0gKiBAbm90ZSAgICAgICAgVGhlIHhWU1MgYW5hbHlzZXMgdGhpcyBzdHJ1Y3R1cmUsIGFuZCBpZiBuZWVkZWQsIGNoYW5nZXMgdGhlCi0gKiAgICAgICAgICAgICAgICBvdXRwdXQgcGFyYW1ldGVycyAoVmlkZW8gY29kZWMsIHZpZGVvIHNpemUsIGF1ZGlvIGNvZGVjLAotICogICAgICAgICAgICAgICAgYXVkaW8gbmIgb2YgY2hhbm5lbHMpIHRvIG1pbmltaXplIHRoZSB0cmFuc2NvZGluZyB0aW1lLgotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChPVVQpIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0IHRvIGFsbG9jYXRlCi0gKiBAcGFyYW0gICAgcFNldHRpbmdzICAgICAgICAgICAgKElOKSBFZGl0aW9uIHNldHRpbmdzIChhbGxvY2F0ZWQgYnkgdGhlIHVzZXIpCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICBNZW1vcnkgYWxsb2NhdGlvbiBoYXMgZmFpbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19SZWR1Y2VUcmFuc2NvZGUoIE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRWRpdFNldHRpbmdzICpwU2V0dGluZ3MgKQotewotICAgIE00eFZTU19Db250ZXh0ICp4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyBmaWxlUHJvcGVydGllczsKLSAgICBNNE9TQV9VSW50OCBpLCBqOwotICAgIE00T1NBX0Jvb2wgYkF1ZGlvVHJhbnNpdGlvbiA9IE00T1NBX0ZBTFNFOwotICAgIE00T1NBX0Jvb2wgYklzQkdNUmVwbGFjZSA9IE00T1NBX0ZBTFNFOwotICAgIE00T1NBX0Jvb2wgYkZvdW5kOwotICAgIE00T1NBX1VJbnQzMiB2aWRlb0NvbmZpZ1s5XSA9Ci0gICAgewotICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCi0gICAgfTsKLSAgICAvKiogSW5kZXggPC0+IFZpZGVvIGNvbmZpZyAqKi8KLSAgICAvKiAwOiAgICAgICAgSDI2MyAgU1FDSUYgICAgICAgICovCi0gICAgLyogMTogICAgICAgIEgyNjMgIFFDSUYgICAgICAgICovCi0gICAgLyogMjogICAgICAgIEgyNjMgIENJRiAgICAgICAgKi8KLSAgICAvKiAzOiAgICAgICAgTVBFRzQgU1FDSUYgICAgICAgICovCi0gICAgLyogNDogICAgICAgIE1QRUc0IFFRVkdBICAgICAgICAqLwotICAgIC8qIDU6ICAgICAgICBNUEVHNCBRQ0lGICAgICAgICAqLwotICAgIC8qIDY6ICAgICAgICBNUEVHNCBRVkdBICAgICAgICAqLwotICAgIC8qIDc6ICAgICAgICBNUEVHNCBDSUYgICAgICAgICovCi0gICAgLyogODogICAgICAgIE1QRUc0IFZHQSAgICAgICAgKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBNNE9TQV9VSW50MzIgYXVkaW9Db25maWdbM10gPQotICAgIHsKLSAgICAgICAgMCwgMCwgMAotICAgIH07Ci0gICAgLyoqIEluZGV4IDwtPiBBdWRpbyBjb25maWcgKiovCi0gICAgLyogMDogICAgQU1SICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIDE6ICAgIEFBQyAgICAxNmtIeiBtb25vICAgICAgICAqLwotICAgIC8qIDI6ICAgIEFBQyAxNmtIeiBzdGVyZW8gICAgKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIC8qIENoZWNrIHN0YXRlICovCi0gICAgaWYoIHhWU1NfY29udGV4dC0+bV9zdGF0ZSAhPSBNNHhWU1Nfa1N0YXRlSW5pdGlhbGl6ZWQgXAotICAgICAgICAmJiB4VlNTX2NvbnRleHQtPm1fc3RhdGUgIT0gTTR4VlNTX2tTdGF0ZU9wZW5lZCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJCYWQgc3RhdGUgd2hlbiBjYWxsaW5nIE00eFZTU19SZWR1Y2VUcmFuc2NvZGUgZnVuY3Rpb24hIFN0YXRlIGlzICVkIiwKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBudW1iZXIgb2YgY2xpcHMgKi8KLSAgICBpZiggcFNldHRpbmdzLT51aUNsaXBOdW1iZXIgPT0gMCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiVGhlIG51bWJlciBvZiBpbnB1dCBjbGlwIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgISIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIC8qIENoZWNrIGlmIHRoZXJlIGlzIGEgYmFja2dyb3VuZCBtdXNpYywgYW5kIGlmIGl0cyBhdWRpbyB3aWxsIHJlcGxhY2UgaW5wdXQgY2xpcCBhdWRpbyAqLwotICAgIGlmKCBwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgaWYoIHBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnVpQWRkVm9sdW1lID09IDEwMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJJc0JHTVJlcGxhY2UgPSBNNE9TQV9UUlVFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogUGFyc2UgYWxsIGNsaXBzLCBhbmQgZ2l2ZSBvY2N1cmVuY2VzIG9mIGVhY2ggY29tYmluYXRpb24gKi8KLSAgICBmb3IgKCBpID0gMDsgaSA8IHBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyOyBpKysgKQotICAgIHsKLSAgICAgICAgLyogV2UgaWdub3JlIEpQRyBpbnB1dCBmaWxlcyBhcyB0aGV5IGFyZSBhbHdheXMgdHJhbnNjb2RlZCAqLwotICAgICAgICBpZiggcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPkZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCovCi0gICAgICAgICAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGU7Ci0gICAgICAgICAgICBNNE9TQV9VSW50MzIgQ29udmVydGVkU2l6ZSA9IDA7Ci0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QKLSAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAmQ29udmVydGVkU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19SZWR1Y2VUcmFuc2NvZGU6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBFbmQgb2YgdGhlIHV0ZiBjb252ZXJzaW9uLCBub3cgdXNlIHRoZSBjb252ZXJ0ZWQgcGF0aCovCi0gICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxHZXRQcm9wZXJ0aWVzKHhWU1NfY29udGV4dCwgcERlY29kZWRQYXRoLAotICAgICAgICAgICAgICAgICZmaWxlUHJvcGVydGllcyk7Ci0KLSAgICAgICAgICAgIC8vZXJyID0gTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyh4VlNTX2NvbnRleHQsIHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSwKLSAgICAgICAgICAgIC8vICAgICAmZmlsZVByb3BlcnRpZXMpOwotICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00eFZTU19zZW5kQ29tbWFuZDogTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyByZXR1cm5lZCAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAvKiBUT0RPOiBUcmFuc2xhdGUgZXJyb3IgY29kZSBvZiBNQ1MgdG8gYW4geFZTUyBlcnJvciBjb2RlID8gKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBDaGVjayBiZXN0IHZpZGVvIHNldHRpbmdzICovCi0gICAgICAgICAgICBpZiggZmlsZVByb3BlcnRpZXMudWlWaWRlb1dpZHRoID09IDEyOAotICAgICAgICAgICAgICAgICYmIGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9IZWlnaHQgPT0gOTYgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0gyNjMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmlkZW9Db25maWdbMF0gKz0gZmlsZVByb3BlcnRpZXMudWlDbGlwVmlkZW9EdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggKCBmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa01QRUc0KSBcCi0gICAgICAgICAgICAgICAgICAgIHx8IChmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0gyNjQpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZpZGVvQ29uZmlnWzNdICs9IGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggZmlsZVByb3BlcnRpZXMudWlWaWRlb1dpZHRoID09IDE2MAotICAgICAgICAgICAgICAgICYmIGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9IZWlnaHQgPT0gMTIwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggKCBmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa01QRUc0KSBcCi0gICAgICAgICAgICAgICAgICAgIHx8IChmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0gyNjQpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZpZGVvQ29uZmlnWzRdICs9IGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggZmlsZVByb3BlcnRpZXMudWlWaWRlb1dpZHRoID09IDE3NgotICAgICAgICAgICAgICAgICYmIGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9IZWlnaHQgPT0gMTQ0ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tIMjYzICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZpZGVvQ29uZmlnWzFdICs9IGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoICggZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlCi0gICAgICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tNUEVHNCkgXAotICAgICAgICAgICAgICAgICAgICB8fCAoZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tIMjY0KSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2aWRlb0NvbmZpZ1s1XSArPSBmaWxlUHJvcGVydGllcy51aUNsaXBWaWRlb0R1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9XaWR0aCA9PSAzMjAKLSAgICAgICAgICAgICAgICAmJiBmaWxlUHJvcGVydGllcy51aVZpZGVvSGVpZ2h0ID09IDI0MCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICggZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tNUEVHNCkgXAotICAgICAgICAgICAgICAgICAgICB8fCAoZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tIMjY0KSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2aWRlb0NvbmZpZ1s2XSArPSBmaWxlUHJvcGVydGllcy51aUNsaXBWaWRlb0R1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9XaWR0aCA9PSAzNTIKLSAgICAgICAgICAgICAgICAmJiBmaWxlUHJvcGVydGllcy51aVZpZGVvSGVpZ2h0ID09IDI4OCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rSDI2MyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2aWRlb0NvbmZpZ1syXSArPSBmaWxlUHJvcGVydGllcy51aUNsaXBWaWRlb0R1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCAoIGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZQotICAgICAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rTVBFRzQpIFwKLSAgICAgICAgICAgICAgICAgICAgfHwgKGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rSDI2NCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmlkZW9Db25maWdbN10gKz0gZmlsZVByb3BlcnRpZXMudWlDbGlwVmlkZW9EdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBmaWxlUHJvcGVydGllcy51aVZpZGVvV2lkdGggPT0gNjQwCi0gICAgICAgICAgICAgICAgJiYgZmlsZVByb3BlcnRpZXMudWlWaWRlb0hlaWdodCA9PSA0ODAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAoIGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rTVBFRzQpIFwKLSAgICAgICAgICAgICAgICAgICAgfHwgKGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rSDI2NCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmlkZW9Db25maWdbOF0gKz0gZmlsZVByb3BlcnRpZXMudWlDbGlwVmlkZW9EdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIElmIHRoZXJlIGlzIGEgQkdNIHRoYXQgcmVwbGFjZXMgZXhpc3RpbmcgYXVkaW8gdHJhY2ssIHdlIGRvIG5vdCBjYXJlIGFib3V0Ci0gICAgICAgICAgICBhdWRpbyB0cmFjayBhcyBpdCB3aWxsIGJlIHJlcGxhY2VkICovCi0gICAgICAgICAgICAvKiBJZiBub3QsIHdlIHRyeSB0byBtaW5pbWl6ZSBhdWRpbyByZWVuY29kaW5nICovCi0gICAgICAgICAgICBpZiggYklzQkdNUmVwbGFjZSA9PSBNNE9TQV9GQUxTRSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIGZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rQUFDICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBmaWxlUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ID09IDE2MDAwICYmIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyA9PSAxICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Db25maWdbMV0gKz0gZmlsZVByb3BlcnRpZXMudWlDbGlwQXVkaW9EdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBmaWxlUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ID09IDE2MDAwICYmIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyA9PSAyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Db25maWdbMl0gKz0gZmlsZVByb3BlcnRpZXMudWlDbGlwQXVkaW9EdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0FNUl9OQiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhdWRpb0NvbmZpZ1swXSArPSBmaWxlUHJvcGVydGllcy51aUNsaXBBdWRpb0R1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIEZpbmQgYmVzdCBvdXRwdXQgdmlkZW8gZm9ybWF0ICh0aGUgbW9zdCBvY2N1cmluZyBjb21iaW5hdGlvbikgKi8KLSAgICBqID0gMDsKLSAgICBiRm91bmQgPSBNNE9TQV9GQUxTRTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgOTsgaSsrICkKLSAgICB7Ci0gICAgICAgIGlmKCB2aWRlb0NvbmZpZ1tpXSA+PSB2aWRlb0NvbmZpZ1tqXSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGogPSBpOwotICAgICAgICAgICAgYkZvdW5kID0gTTRPU0FfVFJVRTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKCBiRm91bmQgKQotICAgIHsKLSAgICAgICAgc3dpdGNoKCBqICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCA9IE00VklERU9FRElUSU5HX2tIMjYzOwotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1NpemUgPSBNNFZJREVPRURJVElOR19rU1FDSUY7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQgPSBNNFZJREVPRURJVElOR19rSDI2MzsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplID0gTTRWSURFT0VESVRJTkdfa1FDSUY7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQgPSBNNFZJREVPRURJVElOR19rSDI2MzsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplID0gTTRWSURFT0VESVRJTkdfa0NJRjsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCA9Ci0gICAgICAgICAgICAgICAgICAgIChmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa01QRUc0KQotICAgICAgICAgICAgICAgICAgICA/IE00VklERU9FRElUSU5HX2tNUEVHNCA6IE00VklERU9FRElUSU5HX2tIMjY0OwotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1NpemUgPSBNNFZJREVPRURJVElOR19rU1FDSUY7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQgPQotICAgICAgICAgICAgICAgICAgICAoZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tNUEVHNCkKLSAgICAgICAgICAgICAgICAgICAgPyBNNFZJREVPRURJVElOR19rTVBFRzQgOiBNNFZJREVPRURJVElOR19rSDI2NDsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplID0gTTRWSURFT0VESVRJTkdfa1FRVkdBOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0ID0KLSAgICAgICAgICAgICAgICAgICAgKGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rTVBFRzQpCi0gICAgICAgICAgICAgICAgICAgID8gTTRWSURFT0VESVRJTkdfa01QRUc0IDogTTRWSURFT0VESVRJTkdfa0gyNjQ7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZSA9IE00VklERU9FRElUSU5HX2tRQ0lGOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0ID0KLSAgICAgICAgICAgICAgICAgICAgKGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rTVBFRzQpCi0gICAgICAgICAgICAgICAgICAgID8gTTRWSURFT0VESVRJTkdfa01QRUc0IDogTTRWSURFT0VESVRJTkdfa0gyNjQ7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZSA9IE00VklERU9FRElUSU5HX2tRVkdBOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0ID0KLSAgICAgICAgICAgICAgICAgICAgKGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rTVBFRzQpCi0gICAgICAgICAgICAgICAgICAgID8gTTRWSURFT0VESVRJTkdfa01QRUc0IDogTTRWSURFT0VESVRJTkdfa0gyNjQ7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZSA9IE00VklERU9FRElUSU5HX2tDSUY7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQgPQotICAgICAgICAgICAgICAgICAgICAoZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tNUEVHNCkKLSAgICAgICAgICAgICAgICAgICAgPyBNNFZJREVPRURJVElOR19rTVBFRzQgOiBNNFZJREVPRURJVElOR19rSDI2NDsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplID0gTTRWSURFT0VESVRJTkdfa1ZHQTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIEZpbmQgYmVzdCBvdXRwdXQgYXVkaW8gZm9ybWF0ICh0aGUgbW9zdCBvY2N1cmluZyBjb21iaW5hdGlvbikgKi8KLSAgICBqID0gMDsKLSAgICBiRm91bmQgPSBNNE9TQV9GQUxTRTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgMzsgaSsrICkKLSAgICB7Ci0gICAgICAgIGlmKCBhdWRpb0NvbmZpZ1tpXSA+PSBhdWRpb0NvbmZpZ1tqXSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGogPSBpOwotICAgICAgICAgICAgYkZvdW5kID0gTTRPU0FfVFJVRTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKCBiRm91bmQgKQotICAgIHsKLSAgICAgICAgc3dpdGNoKCBqICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdCA9IE00VklERU9FRElUSU5HX2tBTVJfTkI7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm8gPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0ID0gTTRWSURFT0VESVRJTkdfa0FBQzsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQgPSBNNFZJREVPRURJVElOR19rQUFDOwotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5iQXVkaW9Nb25vID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19TZW5kQ29tbWFuZChNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FZGl0U2V0dGluZ3MqIHBTZXR0aW5ncykKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBnaXZlcyB0byB0aGUgeFZTUyBhbiBlZGl0aW5nIHN0cnVjdHVyZQotICogQG5vdGUgICAgICAgIFRoZSB4VlNTIGFuYWx5c2VzIHRoaXMgc3RydWN0dXJlLCBhbmQgcHJlcGFyZSBlZGl0aW9uCi0gKiAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFmdGVyIE00eFZTU19Jbml0LCBhZnRlcgotICogICAgICAgICAgICAgICAgTTR4VlNTX0Nsb3NlQ29tbWFuZCwgb3IgYWZ0ZXIgTTR4VlNTX1ByZXZpZXdTdG9wLgotICogICAgICAgICAgICAgICAgQWZ0ZXIgdGhpcyBmdW5jdGlvbiwgdGhlIHVzZXIgbXVzdCBjYWxsIE00eFZTU19TdGVwIHVudGlsCi0gKiAgICAgICAgICAgICAgICBpdCByZXR1cm5zIGFub3RoZXIgZXJyb3IgdGhhbiBNNE5PX0VSUk9SLgotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICBwU2V0dGluZ3MgICAgICAgICAgICAoSU4pIEVkaXRpb24gc2V0dGluZ3MgKGFsbG9jYXRlZCBieSB0aGUgdXNlcikKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBub3QgYmUgY2FsbGVkIGF0IHRoaXMgdGltZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX1NlbmRDb21tYW5kKCBNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRWRpdFNldHRpbmdzICpwU2V0dGluZ3MgKQotewotICAgIE00eFZTU19Db250ZXh0ICp4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNE9TQV9VSW50OCBpLCBqOwotICAgIE00T1NBX1VJbnQ4IG5iT2ZTYW1lQ2xpcCA9IDA7Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9Cb29sIGlzTmV3QkdNID0gTTRPU0FfVFJVRTsKLSAgICBNNHhWU1NfUHRvM0dQUF9wYXJhbXMgKnBQdG8zR1BQX2xhc3QgPSBNNE9TQV9OVUxMOwotICAgIE00eFZTU19NQ1NfcGFyYW1zICpwTUNTX2xhc3QgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX1VJbnQzMiB3aWR0aCwgaGVpZ2h0LCBzYW1wbGluZ0ZyZXE7Ci0gICAgTTRPU0FfQm9vbCBiSXNUcmFuc2NvZGluZyA9IE00T1NBX0ZBTFNFOwotICAgIE00T1NBX0ludDMyIHRvdGFsRHVyYXRpb247Ci0gICAgTTRPU0FfVUludDMyIG91dHB1dFNhbXBsaW5nRnJlcXVlbmN5ID0gMDsKLSAgICBNNE9TQV9VSW50MzIgbGVuZ3RoID0gMDsKLSAgICBNNE9TQV9JbnQ4IG1hc3RlckNsaXAgPSAtMTsKLQotICAgIGkgPSAwOwotICAgIC8qIENoZWNrIHN0YXRlICovCi0gICAgaWYoIHhWU1NfY29udGV4dC0+bV9zdGF0ZSAhPSBNNHhWU1Nfa1N0YXRlSW5pdGlhbGl6ZWQgXAotICAgICAgICAmJiB4VlNTX2NvbnRleHQtPm1fc3RhdGUgIT0gTTR4VlNTX2tTdGF0ZU9wZW5lZCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJCYWQgc3RhdGUgd2hlbiBjYWxsaW5nIE00eFZTU19TZW5kQ29tbWFuZCBmdW5jdGlvbiEgU3RhdGUgaXMgJWQiLAotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5tX3N0YXRlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qIFN0YXRlIGlzIGJhY2sgdG8gaW5pdGlhbGl6ZWQgdG8gYWxsb3cgY2FsbCBvZiBjbGVhbnVwIGZ1bmN0aW9uIGluIGNhc2Ugb2YgZXJyb3IgKi8KLSAgICB4VlNTX2NvbnRleHQtPm1fc3RhdGUgPSBNNHhWU1Nfa1N0YXRlSW5pdGlhbGl6ZWQ7Ci0KLSAgICAvKiBDaGVjayBpZiBhIHByZXZpb3VzIHNlbmRDb21tYW5kIGhhcyBiZWVuIGNhbGxlZCAqLwotICAgIGlmKCB4VlNTX2NvbnRleHQtPnByZXZpb3VzQ2xpcE51bWJlciAhPSAwICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiBwQ21wUmVzdWx0ID0gMDsKLQotICAgICAgICAvKiBDb21wYXJlIEJHTSBpbnB1dCAqLwotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwgXAotICAgICAgICAgICAgJiYgcFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgcENtcFJlc3VsdCA9IHN0cmNtcCgoY29uc3QgY2hhciAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUsCi0gICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKilwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSk7Ci0KLSAgICAgICAgICAgIGlmKCBwQ21wUmVzdWx0ID09IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIGF1ZGlvIG91dHB1dCBwYXJhbWV0ZXJzIGhhdmUgY2hhbmdlZCAqLwotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdCA9PQotICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubwotICAgICAgICAgICAgICAgICAgICA9PSBwU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBJdCBtZWFucyB0aGF0IEJHTSBpcyB0aGUgc2FtZSBhcyBiZWZvcmUsIHNvLCBubyBuZWVkIHRvIHJlZGVjb2RlIGl0ICovCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIkJHTSBpcyB0aGUgc2FtZSBhcyBiZWZvcmUsIG5vdGhpbmcgdG8gZGVjb2RlIik7Ci0gICAgICAgICAgICAgICAgICAgIGlzTmV3QkdNID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFdlIG5lZWQgdG8gdW5hbGxvY2F0ZSBQQ00gcHJldmlldyBmaWxlIHBhdGggaW4gaW50ZXJuYWwgY29udGV4dCAqLwotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cGNtUHJldmlld0ZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFdlIG5lZWQgdG8gdW5hbGxvY2F0ZSBQQ00gcHJldmlldyBmaWxlIHBhdGggaW4gaW50ZXJuYWwgY29udGV4dCAqLwotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ2hlY2sgaWYgb3V0cHV0IHNldHRpbmdzIGhhdmUgY2hhbmdlZCAqLwotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplCi0gICAgICAgICAgICAhPSBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplCi0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdAotICAgICAgICAgICAgIT0gcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0Ci0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1Byb2ZpbGUKLSAgICAgICAgICAgICE9IHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1Byb2ZpbGUKLSAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvTGV2ZWwKLSAgICAgICAgICAgICE9IHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0xldmVsCi0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdAotICAgICAgICAgICAgIT0gcFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5iQXVkaW9Nb25vCi0gICAgICAgICAgICAhPSBwU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubwotICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9TYW1wbEZyZXEKLSAgICAgICAgICAgICE9IHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb1NhbXBsRnJlcSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIElmIGl0IGlzIHRoZSBjYXNlLCB3ZSBjYW4ndCByZXVzZSBhbHJlYWR5IHRyYW5zY29kZWQvY29udmVydGVkIGZpbGVzICovCi0gICAgICAgICAgICAvKiBzbywgd2UgZGVsZXRlIHRoZXNlIGZpbGVzIGFuZCByZW1vdmUgdGhlbSBmcm9tIGNoYWluZWQgbGlzdCAqLwotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFBUbzNHUFBwYXJhbXNMaXN0ICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00eFZTU19QdG8zR1BQX3BhcmFtcyAqcFBhcmFtcyA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFBUbzNHUFBwYXJhbXNMaXN0OwotICAgICAgICAgICAgICAgIE00eFZTU19QdG8zR1BQX3BhcmFtcyAqcFBhcmFtc19zYXV2OwotCi0gICAgICAgICAgICAgICAgd2hpbGUoIHBQYXJhbXMgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+cEZpbGVJbiAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zLT5wRmlsZUluKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlSW4gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBGaWxlT3V0ICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxldGUgdGVtcG9yYXJ5IGZpbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZSgoY29uc3QgY2hhciAqKXBQYXJhbXMtPnBGaWxlT3V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtcy0+cEZpbGVPdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVPdXQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBGaWxlVGVtcCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsZXRlIHRlbXBvcmFyeSBmaWxlICovCi0jaWZkZWYgTTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRQotCi0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKilwUGFyYW1zLT5wRmlsZVRlbXApOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zLT5wRmlsZVRlbXApOwotCi0jZW5kaWYgLypNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVUZW1wID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3NhdXYgPSBwUGFyYW1zOwotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zID0gcFBhcmFtcy0+cE5leHQ7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtc19zYXV2KTsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtc19zYXV2ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wUFRvM0dQUHBhcmFtc0xpc3QgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNHhWU1NfTUNTX3BhcmFtcyAqcFBhcmFtcyA9IHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3Q7Ci0gICAgICAgICAgICAgICAgTTR4VlNTX01DU19wYXJhbXMgKnBQYXJhbXNfc2F1djsKLSAgICAgICAgICAgICAgICBNNHhWU1NfTUNTX3BhcmFtcyAqcFBhcmFtc19iZ20gPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgd2hpbGUoIHBQYXJhbXMgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBIZXJlLCB3ZSBkbyBub3QgZGVsZXRlIEJHTSAqLwotICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+aXNCR00gIT0gTTRPU0FfVFJVRSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zLT5wRmlsZUluICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtcy0+cEZpbGVJbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVJbiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zLT5wRmlsZU91dCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxldGUgdGVtcG9yYXJ5IGZpbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKilwUGFyYW1zLT5wRmlsZU91dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zLT5wRmlsZU91dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVPdXQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+cEZpbGVUZW1wICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGV0ZSB0ZW1wb3JhcnkgZmlsZSAqLwotI2lmZGVmIE00eFZTU19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZSgoY29uc3QgY2hhciAqKXBQYXJhbXMtPnBGaWxlVGVtcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zLT5wRmlsZVRlbXApOwotCi0jZW5kaWYgLypNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlVGVtcCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3NhdXYgPSBwUGFyYW1zOwotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyA9IHBQYXJhbXMtPnBOZXh0OwotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zX3NhdXYpOwotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc19zYXV2ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfYmdtID0gcFBhcmFtczsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMgPSBwUGFyYW1zLT5wTmV4dDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qUFIgUDRNRTAwMDAzMTgyIGluaXRpYWxpemUgdGhpcyBwb2ludGVyIGJlY2F1c2UgdGhlIGZvbGxvd2luZyBwYXJhbXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgd2lsbCBiZSBkZWFsbG9jYXRlZCovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcyAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcFBhcmFtcy0+aXNCR00gIT0gTTRPU0FfVFJVRSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc19iZ20tPnBOZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0ID0gcFBhcmFtc19iZ207Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBNYXliZSBuZWVkIHRvIGltcGxlbWVudCBmcmFtZXJhdGUgY2hhbmdpbmcgKi8KLSAgICAgICAgICAgIC8veFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnZpZGVvRnJhbWVSYXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogVW5hbGxvY2F0ZSBwcmV2aW91cyB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncyBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgTTR4VlNTX2ZyZWVTZXR0aW5ncyh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncyk7Ci0KLSAgICAgICAgLypVbmFsbG9jYXRlIG91dHB1dCBmaWxlIHBhdGgqLwotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aU91dHB1dFBhdGhTaXplID0gMDsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICBDbGlwcyByZWdpc3RlcmluZwotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAvKiBDb3B5IHNldHRpbmdzIGZyb20gdXNlciBnaXZlbiBzdHJ1Y3R1cmUgdG8gb3VyICJsb2NhbCIgc3RydWN0dXJlICovCi0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQgPQotICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQ7Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Qcm9maWxlID0KLSAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0xldmVsID0KLSAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvTGV2ZWw7Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplID0KLSAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZTsKLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdCA9Ci0gICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdDsKLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5iQXVkaW9Nb25vID0gcFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm87Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9TYW1wbEZyZXEgPQotICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9TYW1wbEZyZXE7Ci0gICAgLyp4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUgPSBwU2V0dGluZ3MtPnBPdXRwdXRGaWxlOyovCi0gICAgLypGQjogVkFMIENSIFA0TUUwMDAwMzA3NgotICAgIFRoZSBvdXRwdXQgdmlkZW8gYW5kIGF1ZGlvIGJpdHJhdGUgYXJlIGdpdmVuIGJ5IHRoZSB1c2VyIGluIHRoZSBlZGl0aW9uIHNldHRpbmdzIHN0cnVjdHVyZSovCi0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9CaXRyYXRlID0KLSAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvQml0cmF0ZTsKLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9CaXRyYXRlOwotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5QVFZvbExldmVsID0gcFNldHRpbmdzLT5QVFZvbExldmVsOwotCi0gICAgLypGQjogYnVnIGZpeCBpZiB0aGUgb3V0cHV0IHBhdGggaXMgZ2l2ZW4gaW4gTTR4VlNTX3NlbmRDb21tYW5kKi8KLQotICAgIGlmKCBwU2V0dGluZ3MtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwKLSAgICAgICAgJiYgcFNldHRpbmdzLT51aU91dHB1dFBhdGhTaXplID4gMCApCi0gICAgewotICAgICAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBwU2V0dGluZ3MtPnBPdXRwdXRGaWxlOwotICAgICAgICAvKkFzIGFsbCBpbnB1dHMgb2YgdGhlIHhWU1MgYXJlIGluIFVURjgsIGNvbnZlcnQgdGhlIG91dHB1dCBmaWxlIHBhdGggaW50byB0aGUKLSAgICAgICAgY3VzdG9tZXIgZm9ybWF0Ki8KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilwU2V0dGluZ3MtPnBPdXRwdXRGaWxlLAotICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsICZsZW5ndGgpOwotCi0gICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfU2VuZENvbW1hbmQ6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICBwU2V0dGluZ3MtPnVpT3V0cHV0UGF0aFNpemUgPSBsZW5ndGg7Ci0gICAgICAgIH0KLQotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUgPSAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyBcCi0gICAgICAgICAgICAocFNldHRpbmdzLT51aU91dHB1dFBhdGhTaXplICsgMSwgTTRWUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopIm91dHB1dCBmaWxlIHBhdGgiKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAvKiovCi0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgbWVtY3B5KCh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlLAotICAgICAgICAgICAgKHZvaWQgKilwRGVjb2RlZFBhdGgsIHBTZXR0aW5ncy0+dWlPdXRwdXRQYXRoU2l6ZSArIDEpOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlPdXRwdXRQYXRoU2l6ZSA9IHBTZXR0aW5ncy0+dWlPdXRwdXRQYXRoU2l6ZTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpT3V0cHV0UGF0aFNpemUgPSAwOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlID0gcFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZTsKLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyID0gcFNldHRpbmdzLT51aUNsaXBOdW1iZXI7Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnZpZGVvRnJhbWVSYXRlID0gcFNldHRpbmdzLT52aWRlb0ZyYW1lUmF0ZTsKLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlNYXN0ZXJDbGlwID0KLSAgICAgICAgMDsgLyogV2l0aCBWU1MgMi4wLCB0aGlzIG5ldyBwYXJhbSBpcyBtYW5kYXRvcnkgKi8KLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wVGV4dFJlbmRlcmluZ0ZjdCA9Ci0gICAgICAgIHBTZXR0aW5ncy0+eFZTUy5wVGV4dFJlbmRlcmluZ0ZjdDsgLyogQ1IgdGV4dCBoYW5kbGluZyAqLwotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEZpbGVTaXplID0KLSAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dEZpbGVTaXplOwotCi0gICAgaWYoIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRGaWxlU2l6ZSAhPSAwIFwKLSAgICAgICAgJiYgcFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0ICE9IE00VklERU9FRElUSU5HX2tBTVJfTkIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19TZW5kQ29tbWFuZDogSW1wb3NzaWJsZSB0byBsaW1pdCBmaWxlXAotICAgICAgICAgICAgICAgICAgICAgICBzaXplIHdpdGggb3RoZXIgYXVkaW8gb3V0cHV0IHRoYW4gQUFDIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotICAgIHhWU1NfY29udGV4dC0+bmJTdGVwVG90YWwgPSAwOwotICAgIHhWU1NfY29udGV4dC0+Y3VycmVudFN0ZXAgPSAwOwotCi0gICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0ICE9IE00VklERU9FRElUSU5HX2tNUEVHNAotICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdAotICAgICAgICAhPSBNNFZJREVPRURJVElOR19rSDI2MwotICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdAotICAgICAgICAhPSBNNFZJREVPRURJVElOR19rSDI2NCApCi0gICAgewotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCA9Ci0gICAgICAgICAgICBNNFZJREVPRURJVElOR19rTm9uZVZpZGVvOwotICAgIH0KLQotICAgIC8qIEdldCBvdXRwdXQgd2lkdGgvaGVpZ2h0ICovCi0gICAgc3dpdGNoKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1NpemUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rU1FDSUY6Ci0gICAgICAgICAgICB3aWR0aCA9IDEyODsKLSAgICAgICAgICAgIGhlaWdodCA9IDk2OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUVFWR0E6Ci0gICAgICAgICAgICB3aWR0aCA9IDE2MDsKLSAgICAgICAgICAgIGhlaWdodCA9IDEyMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FDSUY6Ci0gICAgICAgICAgICB3aWR0aCA9IDE3NjsKLSAgICAgICAgICAgIGhlaWdodCA9IDE0NDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FWR0E6Ci0gICAgICAgICAgICB3aWR0aCA9IDMyMDsKLSAgICAgICAgICAgIGhlaWdodCA9IDI0MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0NJRjoKLSAgICAgICAgICAgIHdpZHRoID0gMzUyOwotICAgICAgICAgICAgaGVpZ2h0ID0gMjg4OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rVkdBOgotICAgICAgICAgICAgd2lkdGggPSA2NDA7Ci0gICAgICAgICAgICBoZWlnaHQgPSA0ODA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIC8qICtQUiBMVjU4MDcgKi8KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rV1ZHQToKLSAgICAgICAgICAgIHdpZHRoID0gODAwOwotICAgICAgICAgICAgaGVpZ2h0ID0gNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTlRTQzoKLSAgICAgICAgICAgIHdpZHRoID0gNzIwOwotICAgICAgICAgICAgaGVpZ2h0ID0gNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAvKiAtUFIgTFY1ODA3ICovCi0gICAgICAgICAgICAvKiArQ1IgR29vZ2xlICovCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazY0MF8zNjA6Ci0gICAgICAgICAgICB3aWR0aCA9IDY0MDsKLSAgICAgICAgICAgIGhlaWdodCA9IDM2MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazg1NF80ODA6Ci0KLSAgICAgICAgICAgIC8vIFN0YWdlRnJpZ2h0IGVuY29kZXJzIHJlcXVpcmUgJTE2IHJlc29sdXRpb24KLQotICAgICAgICAgICAgd2lkdGggPSBNNEVOQ09ERVJfODU0XzQ4MF9XaWR0aDsKLQotICAgICAgICAgICAgaGVpZ2h0ID0gNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTI4MF83MjA6Ci0gICAgICAgICAgICB3aWR0aCA9IDEyODA7Ci0gICAgICAgICAgICBoZWlnaHQgPSA3MjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMDgwXzcyMDoKLSAgICAgICAgICAgIC8vIFN0YWdlRnJpZ2h0IGVuY29kZXJzIHJlcXVpcmUgJTE2IHJlc29sdXRpb24KLSAgICAgICAgICAgIHdpZHRoID0gTTRFTkNPREVSXzEwODBfNzIwX1dpZHRoOwotICAgICAgICAgICAgaGVpZ2h0ID0gNzIwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rOTYwXzcyMDoKLSAgICAgICAgICAgIHdpZHRoID0gOTYwOwotICAgICAgICAgICAgaGVpZ2h0ID0gNzIwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTkyMF8xMDgwOgotICAgICAgICAgICAgd2lkdGggPSAxOTIwOwotICAgICAgICAgICAgaGVpZ2h0ID0gTTRFTkNPREVSXzE5MjBfMTA4MF9IZWlnaHQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLyogLUNSIEdvb2dsZSAqLwotICAgICAgICBkZWZhdWx0OiAvKiBJZiBvdXRwdXQgdmlkZW8gc2l6ZSBpcyBub3QgZ2l2ZW4sIHdlIHRha2UgUUNJRiBzaXplICovCi0gICAgICAgICAgICB3aWR0aCA9IDE3NjsKLSAgICAgICAgICAgIGhlaWdodCA9IDE0NDsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZSA9Ci0gICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa1FDSUY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKiBHZXQgb3V0cHV0IFNhbXBsaW5nIGZyZXF1ZW5jeSAqLwotICAgIHN3aXRjaCggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9TYW1wbEZyZXEgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rODAwMF9BU0Y6Ci0gICAgICAgICAgICBzYW1wbGluZ0ZyZXEgPSA4MDAwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTYwMDBfQVNGOgotICAgICAgICAgICAgc2FtcGxpbmdGcmVxID0gMTYwMDA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syMjA1MF9BU0Y6Ci0gICAgICAgICAgICBzYW1wbGluZ0ZyZXEgPSAyMjA1MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazI0MDAwX0FTRjoKLSAgICAgICAgICAgIHNhbXBsaW5nRnJlcSA9IDI0MDAwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMzIwMDBfQVNGOgotICAgICAgICAgICAgc2FtcGxpbmdGcmVxID0gMzIwMDA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s0NDEwMF9BU0Y6Ci0gICAgICAgICAgICBzYW1wbGluZ0ZyZXEgPSA0NDEwMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazQ4MDAwX0FTRjoKLSAgICAgICAgICAgIHNhbXBsaW5nRnJlcSA9IDQ4MDAwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRGVmYXVsdF9BU0Y6Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rQU1SX05CICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYW1wbGluZ0ZyZXEgPSA4MDAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rQUFDICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYW1wbGluZ0ZyZXEgPSAxNjAwMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYW1wbGluZ0ZyZXEgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLyogQWxsb2NhdGUgY2xpcC90cmFuc2l0aW9ucyBpZiBjbGlwIG51bWJlciBpcyBub3QgbnVsbCAuLi4gKi8KLSAgICBpZiggMCA8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aUNsaXBOdW1iZXIgKQotICAgIHsKLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3QgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUoKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3QpKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3QgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3QgPQotICAgICAgICAgICAgKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKiogKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyBcCi0gICAgICAgICAgICAoc2l6ZW9mKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKikqeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlciwKLSAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopInhWU1MsIGNvcHkgb2YgcENsaXBMaXN0Iik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3QgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICAvKiBTZXQgY2xpcCBsaXN0IHRvIE5VTEwgKi8KLSAgICAgICAgbWVtc2V0KCh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdCwwLAotICAgICAgICAgICAgc2l6ZW9mKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKikKLSAgICAgICAgICAgICp4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlciA+IDEgKQotICAgICAgICB7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ID0KLSAgICAgICAgICAgICAgICAoTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncyAqKiApIFwKLSAgICAgICAgICAgICAgICBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MgKikgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICooeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlciAtIDEpLCBNNFZTLCAoTTRPU0FfQ2hhciAqKSBcCi0gICAgICAgICAgICAgICAgInhWU1MsIGNvcHkgb2YgcFRyYW5zaXRpb25MaXN0Iik7Ci0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogU2V0IHRyYW5zaXRpb24gbGlzdCB0byBOVUxMICovCi0gICAgICAgICAgICBtZW1zZXQoCi0gICAgICAgICAgICAgICAgKHZvaWQgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0LDAsCi0gICAgICAgICAgICAgICAgc2l6ZW9mKE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MgKikKLSAgICAgICAgICAgICAgICAqKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aUNsaXBOdW1iZXIgLSAxKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKiBlbHNlLCB0aGVyZSBpcyBhIHBiIGluIHRoZSBpbnB1dCBzZXR0aW5ncyBzdHJ1Y3R1cmUgKi8KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTm8gY2xpcCBpbiB0aGlzIHNldHRpbmdzIGxpc3QgISEiKTsKLSAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgIC8qKi8KLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICAvKiBSQyBBbGxvY2F0ZSBlZmZlY3RzIHNldHRpbmdzICovCi0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPm5iRWZmZWN0cyA9IHBTZXR0aW5ncy0+bmJFZmZlY3RzOwotCi0gICAgaWYoIDAgPCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+bmJFZmZlY3RzICkKLSAgICB7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzID0KLSAgICAgICAgICAgIChNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MgXAotICAgICAgICAgICAgKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5uYkVmZmVjdHMgKiBzaXplb2YoTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzKSwKLSAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopImVmZmVjdHMgc2V0dGluZ3MiKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHMgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICAvKkZCIGJ1ZyBmaXggMTkuMDMuMjAwODogdGhlc2UgcG9pbnRlcnMgd2VyZSBub3QgaW5pdGlhbGl6ZWQgLT4gY3Jhc2ggd2hlbiBmcmVlKi8KLSAgICAgICAgZm9yICggaSA9IDA7IGkgPCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+bmJFZmZlY3RzOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBGcmFtaW5nRmlsZVBhdGggPQotICAgICAgICAgICAgICAgIE00T1NBX05VTEw7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyID0KLSAgICAgICAgICAgICAgICBNNE9TQV9OVUxMOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wVGV4dEJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgLyoqLwotICAgIH0KLQotICAgIGlmKCB4VlNTX2NvbnRleHQtPnRhcmdldGVkVGltZXNjYWxlID09IDAgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIHBUYXJnZXRlZFRpbWVTY2FsZSA9IDA7Ci0KLSAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsR2V0VGFyZ2V0ZWRUaW1lU2NhbGUoeFZTU19jb250ZXh0LCBwU2V0dGluZ3MsCi0gICAgICAgICAgICAmcFRhcmdldGVkVGltZVNjYWxlKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgfHwgcFRhcmdldGVkVGltZVNjYWxlID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxHZXRUYXJnZXRlZFRpbWVTY2FsZVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmVkIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgeFZTU19jb250ZXh0LT50YXJnZXRlZFRpbWVzY2FsZSA9IHBUYXJnZXRlZFRpbWVTY2FsZTsKLSAgICB9Ci0KLSAgICAvKiBJbml0aWFsaXplIHRvdGFsIGR1cmF0aW9uIHZhcmlhYmxlICovCi0gICAgdG90YWxEdXJhdGlvbiA9IDA7Ci0KLSAgICAvKiBQYXJzaW5nIGxpc3Qgb2YgY2xpcHMgZ2l2ZW4gYnkgYXBwbGljYXRpb24sIGFuZCBwcmVwYXJlIGFuYWx5emluZyAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlcjsgaSsrICkKLSAgICB7Ci0gICAgICAgIC8qIEFsbG9jYXRlIGN1cnJlbnQgY2xpcCAqLwotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldID0KLSAgICAgICAgICAgIChNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jIFwKLSAgICAgICAgICAgIChzaXplb2YoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyksIE00VlMsIChNNE9TQV9DaGFyICopImNsaXAgc2V0dGluZ3MiKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ29weSBjbGlwIHNldHRpbmdzIGZyb20gZ2l2ZW4gc3RydWN0dXJlIHRvIG91ciB4VlNTX2NvbnRleHQgc3RydWN0dXJlICovCi0gICAgICAgIGVyciA9Ci0gICAgICAgICAgICBNNHhWU1NfRHVwbGljYXRlQ2xpcFNldHRpbmdzKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0sCi0gICAgICAgICAgICBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSwgTTRPU0FfVFJVRSk7Ci0KLSAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00eFZTU19TZW5kQ29tbWFuZDogTTR4VlNTX0R1cGxpY2F0ZUNsaXBTZXR0aW5ncyByZXR1cm4gZXJyb3IgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAvKiovCi0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+YlRyYW5zY29kaW5nUmVxdWlyZWQgPQotICAgICAgICAgICAgTTRPU0FfRkFMU0U7Ci0KLSAgICAgICAgLyogQmVjYXVzZSB0aGVyZSBpcyAxIGxlc3MgdHJhbnNpdGlvbiB0aGFuIGNsaXAgbnVtYmVyICovCi0gICAgICAgIGlmKCBpIDwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlciAtIDEgKQotICAgICAgICB7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldID0KLSAgICAgICAgICAgICAgICAoTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncwotICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzKSwKLSAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJ0cmFuc2l0aW9uIHNldHRpbmdzIik7Ci0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtZW1jcHkoCi0gICAgICAgICAgICAgICAgKHZvaWQgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLAotICAgICAgICAgICAgICAgICh2b2lkICopcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0sCi0gICAgICAgICAgICAgICAgc2l6ZW9mKE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MpKTsKLSAgICAgICAgICAgIC8qIEluaXRpYWxpemUgZXh0ZXJuYWwgZWZmZWN0IGNvbnRleHQgdG8gTlVMTCwgdG8ga25vdyBpZiBpbnB1dCBqcGcgaGFzIGFscmVhZHkgYmVlbgotICAgICAgICAgICAgZGVjb2RlZCBvciBub3QgKi8KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPgotICAgICAgICAgICAgICAgIHBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0ID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgc3dpdGNoKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT5WaWRlb1RyYW5zaXRpb25UeXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogSWYgdHJhbnNpdGlvbiB0eXBlIGlzIGFscGhhIG1hZ2ljLCB3ZSBuZWVkIHRvIGRlY29kZSBpbnB1dCBmaWxlICovCi0gICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvVHJhbnNpdGlvblR5cGVfQWxwaGFNYWdpYzoKLSAgICAgICAgICAgICAgICAgICAgLyogQWxsb2NhdGUgb3VyIGFscGhhIG1hZ2ljIHNldHRpbmdzIHN0cnVjdHVyZSB0byBoYXZlIGEgY29weSBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgcHJvdmlkZWQgb25lICovCi0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPiAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00eFZTU19BbHBoYU1hZ2ljU2V0dGluZ3MgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MgXAotICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVvZihNNHhWU1NfQWxwaGFNYWdpY1NldHRpbmdzKSwgTTRWUywKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIklucHV0IEFscGhhIG1hZ2ljIHNldHRpbmdzIHN0cnVjdHVyZSIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4gXAotICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncyA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIENvcHkgZGF0YSBmcm9tIHRoZSBwcm92aWRlZCBhbHBoYSBtYWdpYyBzZXR0aW5ncyBzdHJ1Y3R1cmUgdG91IG91cgotICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT4gXAotICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPiBcCi0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE00eFZTU19BbHBoYU1hZ2ljU2V0dGluZ3MpKTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZSBvdXIgYWxwaGEgbWFnaWMgaW5wdXQgZmlsZW5hbWUgKi8KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhRmlsZVBhdGggPSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICAoc3RybGVuKHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4gXAotICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+cEFscGhhRmlsZVBhdGgpCi0gICAgICAgICAgICAgICAgICAgICAgICArIDEpLCBNNFZTLCAoTTRPU0FfQ2hhciAqKSJBbHBoYSBtYWdpYyBmaWxlIHBhdGgiKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPnBBbHBoYUZpbGVQYXRoCi0gICAgICAgICAgICAgICAgICAgICAgICA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIENvcHkgZGF0YSBmcm9tIHRoZSBwcm92aWRlZCBhbHBoYSBtYWdpYyBmaWxlbmFtZSB0byBvdXIgKi8KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfY2hyTkNvcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhRmlsZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYUZpbGVQYXRoLCBzdHJsZW4oCi0gICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYUZpbGVQYXRoKSArIDEpOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFBhcnNlIGFsbCB0cmFuc2l0aW9uIHRvIGtub3cgaWYgdGhlIGlucHV0IGpwZyBoYXMgYWxyZWFkeSBiZWVuIGRlY29kZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgZm9yICggaiA9IDA7IGogPCBpOyBqKysgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFuc2l0aW9uTGlzdFtqXS0+VmlkZW9UcmFuc2l0aW9uVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE00eFZTU19rVmlkZW9UcmFuc2l0aW9uVHlwZV9BbHBoYU1hZ2ljICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgcENtcFJlc3VsdCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENtcFJlc3VsdCA9IHN0cmNtcCgoY29uc3QgY2hhciAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYUZpbGVQYXRoLCAoY29uc3QgY2hhciAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2pdLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3BlY2lmaWMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYU1hZ2ljU2V0dGluZ3MtPnBBbHBoYUZpbGVQYXRoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwQ21wUmVzdWx0ID09IDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFscGhhU2V0dGluZ3M7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFTZXR0aW5ncyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbHBoYSBtYWdpYyBzZXR0aW5ncyBzdHJ1Y3R1cmUgMSIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBhbHBoYVNldHRpbmdzID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYVNldHRpbmdzLT5wUGxhbmUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzICopKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2pdLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0KSktPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBsYW5lOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3RbaV0tPnhWU1MudHJhbnNpdGlvblNwZWNpZmljLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhTWFnaWNTZXR0aW5ncy0+YmxlbmRpbmdQZXJjZW50ID4gMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblNwZWNpZmljLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhTWFnaWNTZXR0aW5ncy0+YmxlbmRpbmdQZXJjZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSAxMDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYVNldHRpbmdzLT5ibGVuZGluZ3RocmVzaG9sZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TcGVjaWZpYy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWxwaGFNYWdpY1NldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZGluZ1BlcmNlbnQpICogMjU1IC8gMjAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFTZXR0aW5ncy0+YmxlbmRpbmd0aHJlc2hvbGQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhU2V0dGluZ3MtPmlzcmV2ZXJzZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3BlY2lmaWMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWxwaGFNYWdpY1NldHRpbmdzLT5pc3JldmVyc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEl0IG1lYW5zIHRoYXQgdGhlIGlucHV0IGpwZyBmaWxlIGZvciBhbHBoYSBtYWdpYyBoYXMgYWxyZWFkeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVlbiBkZWNvZGVkIC0+IG5vIG5lZGQgdG8gZGVjb2RlIGl0IGFnYWluICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBhbHBoYVNldHRpbmdzLT5ibGVuZGluZ3RocmVzaG9sZCA9PSAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFuc2l0aW9uTGlzdFtpXS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmlkZW9UcmFuc2l0aW9uRmN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfQWxwaGFNYWdpYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3RbaV0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZpZGVvVHJhbnNpdGlvbkZjdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX0FscGhhTWFnaWNCbGVuZGluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0ID0gYWxwaGFTZXR0aW5nczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogSWYgdGhlIGpwZyBoYXMgbm90IGJlZW4gZGVjb2RlZCB5ZXQgLi4uICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3RbaV0tPnBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0Ci0gICAgICAgICAgICAgICAgICAgICAgICA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKm91dHB1dFBsYW5lOwotICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncyAqYWxwaGFTZXR0aW5nczsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qVVRGIGNvbnZlcnNpb24gc3VwcG9ydCovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKlRvIHN1cHBvcnQgQVJHQjg4ODggOiBnZXQgdGhlIHdpZHRoIGFuZCBoZWlnaHQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB3aWR0aF9BUkdCODg4ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT53aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBoZWlnaHRfQVJHQjg4OCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+aGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBUcmFuc2l0aW9uTGlzdE00eFZTU19TZW5kQ29tbWFuZCB3aWR0aCBTdGF0ZSBpcyAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhfQVJHQjg4OCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFRyYW5zaXRpb25MaXN0TTR4VlNTX1NlbmRDb21tYW5kIGhlaWdodCEgU3RhdGUgaXMgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodF9BUkdCODg4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFsbG9jYXRlIG91dHB1dCBwbGFuZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmUgPSAoTTRWSUZJX0ltYWdlUGxhbmUgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoMwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwgTTRWUywgKE00T1NBX0NoYXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPdXRwdXQgcGxhbmUgZm9yIEFscGhhIG1hZ2ljIHRyYW5zaXRpb24iKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIG91dHB1dFBsYW5lID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMF0udV93aWR0aCA9IHdpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMF0udV9oZWlnaHQgPSBoZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQbGFuZVswXS51X3RvcGxlZnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMF0udV9zdHJpZGUgPSB3aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lWzBdLnBhY19kYXRhID0gKE00VklGSV9VSW50OAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKCggd2lkdGggKiBoZWlnaHQgKiAzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICopCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbG9jIGZvciB0aGUgQWxwaGEgbWFnaWMgcGFjX2RhdGEgb3V0cHV0IFlVViIpOwotICAgICAgICAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggb3V0cHV0UGxhbmVbMF0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShvdXRwdXRQbGFuZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lWzFdLnVfd2lkdGggPSB3aWR0aCA+PiAxOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMV0udV9oZWlnaHQgPSBoZWlnaHQgPj4gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lWzFdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQbGFuZVsxXS51X3N0cmlkZSA9IHdpZHRoID4+IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQbGFuZVsxXS5wYWNfZGF0YSA9IG91dHB1dFBsYW5lWzBdLnBhY19kYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBvdXRwdXRQbGFuZVswXS51X3dpZHRoICogb3V0cHV0UGxhbmVbMF0udV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQbGFuZVsyXS51X3dpZHRoID0gd2lkdGggPj4gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lWzJdLnVfaGVpZ2h0ID0gaGVpZ2h0ID4+IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQbGFuZVsyXS51X3RvcGxlZnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMl0udV9zdHJpZGUgPSB3aWR0aCA+PiAxOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMl0ucGFjX2RhdGEgPSBvdXRwdXRQbGFuZVsxXS5wYWNfZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgb3V0cHV0UGxhbmVbMV0udV93aWR0aCAqIG91dHB1dFBsYW5lWzFdLnVfaGVpZ2h0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYUZpbGVQYXRoOwotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgJiYgeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcE91dENvbnZlcnNpb25CdWZmZXIgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFuc2l0aW9uTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblNwZWNpZmljLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWxwaGFNYWdpY1NldHRpbmdzLT5wQWxwaGFGaWxlUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IHBDb252RnJvbVVURjhGY3QgcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgRW5kIG9mIHRoZSBjb252ZXJzaW9uLCB1c2UgdGhlIGRlY29kZWQgcGF0aCovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKlRvIHN1cHBvcnQgQVJHQjg4ODggOiBjb252ZXJ0ICsgcmVzaXppbmcgZnJvbSBBUkdCODg4OCB0byB5dXY0MjAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlY29kZWRQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEZpbGVSZWFkUHRyLCBvdXRwdXRQbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aF9BUkdCODg4LCBoZWlnaHRfQVJHQjg4OCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShvdXRwdXRQbGFuZVswXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUob3V0cHV0UGxhbmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TZW5kQ29tbWFuZDogZXJyb3Igd2hlbiBkZWNvZGluZyBhbHBoYSBtYWdpYyBKUEVHOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZSBhbHBoYSBzZXR0aW5ncyBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhU2V0dGluZ3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICopIkFscGhhIG1hZ2ljIHNldHRpbmdzIHN0cnVjdHVyZSAyIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBhbHBoYVNldHRpbmdzID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhU2V0dGluZ3MtPnBQbGFuZSA9IG91dHB1dFBsYW5lOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRpbmdQZXJjZW50ID4gMCAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZGluZ1BlcmNlbnQgPD0gMTAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYVNldHRpbmdzLT5ibGVuZGluZ3RocmVzaG9sZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRpbmdQZXJjZW50KSAqIDI1NSAvIDIwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYVNldHRpbmdzLT5ibGVuZGluZ3RocmVzaG9sZCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYVNldHRpbmdzLT5pc3JldmVyc2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzcmV2ZXJzZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGFscGhhU2V0dGluZ3MtPmJsZW5kaW5ndGhyZXNob2xkID09IDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRWaWRlb1RyYW5zaXRpb25GY3QgPSBNNHhWU1NfQWxwaGFNYWdpYzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmlkZW9UcmFuc2l0aW9uRmN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX0FscGhhTWFnaWNCbGVuZGluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0ID0gYWxwaGFTZXR0aW5nczsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvVHJhbnNpdGlvblR5cGVfU2xpZGVUcmFuc2l0aW9uOgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxfU2xpZGVUcmFuc2l0aW9uU2V0dGluZ3MgKnNsaWRlU2V0dGluZ3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzbGlkZVNldHRpbmdzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX2ludGVybmFsX1NsaWRlVHJhbnNpdGlvblNldHRpbmdzICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihNNHhWU1NfaW50ZXJuYWxfU2xpZGVUcmFuc2l0aW9uU2V0dGluZ3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKikiSW50ZXJuYWwgc2xpZGUgdHJhbnNpdGlvbiBzZXR0aW5ncyIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBzbGlkZVNldHRpbmdzICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBKdXN0IGNvcHkgdGhlIGxvbmUgcGFyYW1ldGVyIGZyb20gdGhlIGlucHV0IHNldHRpbmdzIHRvIHRoZSBpbnRlcm5hbAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNsaWRlU2V0dGluZ3MtPmRpcmVjdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPnhWU1MudHJhbnNpdGlvblNwZWNpZmljLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTbGlkZVRyYW5zaXRpb25TZXR0aW5ncy0+ZGlyZWN0aW9uOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBuZWVkIHRvIGtlZXAgb3VyIGNvcHkgb2YgdGhlIHNldHRpbmdzLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucFNsaWRlVHJhbnNpdGlvblNldHRpbmdzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmlkZW9UcmFuc2l0aW9uRmN0ID0gJk00eFZTU19TbGlkZVRyYW5zaXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCA9IHNsaWRlU2V0dGluZ3M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9UcmFuc2l0aW9uVHlwZV9GYWRlQmxhY2s6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZpZGVvVHJhbnNpdGlvbkZjdCA9ICZNNHhWU1NfRmFkZUJsYWNrVHJhbnNpdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb1RyYW5zaXRpb25UeXBlX0V4dGVybmFsOgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRWaWRlb1RyYW5zaXRpb25GY3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT5FeHRWaWRlb1RyYW5zaXRpb25GY3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0OwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlkZW9UcmFuc2l0aW9uVHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2tWaWRlb1RyYW5zaXRpb25UeXBlX0V4dGVybmFsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfSAvLyBzd2l0Y2gKLQotICAgICAgICAgICAgLyogVXBkYXRlIHRvdGFsX2R1cmF0aW9uIHdpdGggdHJhbnNpdGlvbiBkdXJhdGlvbiAqLwotICAgICAgICAgICAgdG90YWxEdXJhdGlvbiAtPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT51aVRyYW5zaXRpb25EdXJhdGlvbjsKLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPkZpbGVUeXBlCi0gICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODggKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihNNE9TQV9UUlVFID09Ci0gICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy5pc1Bhblpvb20pIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9DaGFyIG91dF9pbWdbTTRYVlNTX01BWF9QQVRIX0xFTl07Ci0gICAgICAgICAgICAgICAgTTRPU0FfQ2hhciBvdXRfaW1nX3RtcFtNNFhWU1NfTUFYX1BBVEhfTEVOXTsKLSAgICAgICAgICAgICAgICBNNHhWU1NfUHRvM0dQUF9wYXJhbXMgKnBQYXJhbXMgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQgcEFSR0JGaWxlSW47Ci0gICAgICAgICAgICAgICAgLypVVEYgY29udmVyc2lvbiBzdXBwb3J0Ki8KLSAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGU7Ci0KLSAgICAgICAgICAgICAgICAvKiBQYXJzZSBQdG8zR1BQIHBhcmFtcyBjaGFpbmVkIGxpc3QgdG8ga25vdyBpZiBpbnB1dCBmaWxlIGhhcyBhbHJlYWR5IGJlZW4KLSAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgKi8KLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wUFRvM0dQUHBhcmFtc0xpc3QgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgcENtcFJlc3VsdCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyA9IHhWU1NfY29udGV4dC0+cFBUbzNHUFBwYXJhbXNMaXN0OwotICAgICAgICAgICAgICAgICAgICAvKiBXZSBwYXJzZSBhbGwgUHRvM2dwcCBQYXJhbSBjaGFpbmVkIGxpc3QgKi8KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUoIHBQYXJhbXMgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDbXBSZXN1bHQgPSBzdHJjbXAoKGNvbnN0IGNoYXIgKilwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKilwUGFyYW1zLT5wRmlsZUluKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBDbXBSZXN1bHQgPT0gMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlFbmRDdXRUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gcFBhcmFtcy0+ZHVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy51aUR1cmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gcFBhcmFtcy0+ZHVyYXRpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuTWVkaWFSZW5kZXJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBwUGFyYW1zLT5NZWRpYVJlbmRlcmluZyApCi0KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVwbGFjZSBKUEcgZmlsZW5hbWUgd2l0aCBleGlzdGluZyAzR1AgZmlsZW5hbWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHJlcGxhY2VBUkdCXzNHUDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlIG5lZWQgdG8gdXBkYXRlIHRoaXMgdmFyaWFibGUsIGluIGNhc2Ugc29tZSBwaWN0dXJlcyBoYXZlIGJlZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZCBiZXR3ZWVuIHR3byAqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogY2FsbHMgdG8gTTR4VlNTX3NlbmRDb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwUHRvM0dQUF9sYXN0ID0gcFBhcmFtczsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMgPSBwUGFyYW1zLT5wTmV4dDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIENvbnN0cnVjdCBvdXRwdXQgdGVtcG9yYXJ5IDNHUCBmaWxlbmFtZSAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00T1NBX2NoclNQcmludGYob3V0X2ltZywgTTRYVlNTX01BWF9QQVRIX0xFTiAtIDEsIChNNE9TQV9DaGFyICopIiVzaW1nJWQuM2dwIiwKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wVGVtcFBhdGgsIHhWU1NfY29udGV4dC0+dGVtcEZpbGVJbmRleCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkVycm9yIGluIE00T1NBX2NoclNQcmludGY6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICNpZmRlZiBNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFCi0KLSAgICAgICAgICAgICAgICBlcnIgPSBNNE9TQV9jaHJTUHJpbnRmKG91dF9pbWdfdG1wLCBNNFhWU1NfTUFYX1BBVEhfTEVOIC0gMSwgIiVzaW1nJWQudG1wIiwKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wVGVtcFBhdGgsIHhWU1NfY29udGV4dC0+dGVtcEZpbGVJbmRleCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkVycm9yIGluIE00T1NBX2NoclNQcmludGY6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICNlbmRpZiAvKk00eFZTU19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UqLwotCi0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT50ZW1wRmlsZUluZGV4Kys7Ci0KLSAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZSBsYXN0IGVsZW1lbnQgUHRvM0dQUCBwYXJhbXMgc3RydWN0dXJlICovCi0gICAgICAgICAgICAgICAgcFBhcmFtcyA9IChNNHhWU1NfUHRvM0dQUF9wYXJhbXMKLSAgICAgICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19QdG8zR1BQX3BhcmFtcyksCi0gICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopIkVsZW1lbnQgb2YgUHRvM0dQUCBQYXJhbXMiKTsKLQotICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX3NlbmRDb21tYW5kOiBQcm9ibGVtIHdoZW4gYWxsb2NhdGluZyBvbmUgZWxlbWVudCBQdG8zR1BQIFBhcmFtcyIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZXMgcGZpbGV4eHggbWVtYmVycyBvZiBwUGFyYW1zIHRvIGJlIGFibGUgdG8gZnJlZSB0aGVtIGNvcnJlY3RseSAqLwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlSW4gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlT3V0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRmlsZVRlbXAgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBOZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5NZWRpYVJlbmRlcmluZyA9IE00eFZTU19rUmVzaXppbmc7Ci0KLSAgICAgICAgICAgICAgICAvKlRvIHN1cHBvcnQgQVJHQjg4ODggOmdldCB0aGUgd2lkdGggYW5kIGhlaWdodCAqLwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPmhlaWdodCA9IHBTZXR0aW5ncy0+cENsaXBMaXN0WwotICAgICAgICAgICAgICAgICAgICBpXS0+Q2xpcFByb3BlcnRpZXMudWlTdGlsbFBpY0hlaWdodDsgLy9BUkdCX0hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+d2lkdGggPSBwU2V0dGluZ3MtPnBDbGlwTGlzdFsKLSAgICAgICAgICAgICAgICAgICAgICAgIGldLT5DbGlwUHJvcGVydGllcy51aVN0aWxsUGljV2lkdGg7IC8vQVJHQl9XaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKCJDTElQIE00eFZTU19TZW5kQ29tbWFuZCBBUkdCODg4OCBIID0gJWQiLCBwUGFyYW1zLT5oZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoIkNMSVAgTTR4VlNTX1NlbmRDb21tYW5kIEFSR0I4ODg4IFcgPSAlZCIsIHBQYXJhbXMtPndpZHRoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFBUbzNHUFBwYXJhbXNMaXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRPU0FfTlVMTCApIC8qIE1lYW5zIGl0IGlzIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBsaXN0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgeFZTUyBjb250ZXh0IHdpdGggdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGxpc3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBQVG8zR1BQcGFyYW1zTGlzdCA9IHBQYXJhbXM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYXZlIHRoaXMgZWxlbWVudCBpbiBjYXNlIG9mIG90aGVyIGZpbGUgdG8gY29udmVydCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQdG8zR1BQX2xhc3QgPSBwUGFyYW1zOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBuZXh0IHBvaW50ZXIgb2YgdGhlIHByZXZpb3VzIGxhc3QgZWxlbWVudCBvZiB0aGUgY2hhaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHRvM0dQUF9sYXN0LT5wTmV4dCA9IHBQYXJhbXM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgc2F2ZSBvZiBsYXN0IGVsZW1lbnQgb2YgdGhlIGNoYWluICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFB0bzNHUFBfbGFzdCA9IHBQYXJhbXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbGwgdGhlIGxhc3QgTTR4VlNTX1B0bzNHUFBfcGFyYW1zIGVsZW1lbnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmR1cmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiBkdXJhdGlvbiBpcyBmaWxsZWQsIGxldCdzIHVzZSBpdCBpbnN0ZWFkIG9mIEVuZEN1dFRpbWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLnVpRHVyYXRpb24gIT0gMCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+ZHVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLnVpRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPklucHV0RmlsZVR5cGUgPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODg7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gc3RybGVuKHBEZWNvZGVkUGF0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwgKE00T1NBX1ZvaWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW5ndGgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TZW5kQ29tbWFuZDogcENvbnZGcm9tVVRGOEZjdCByZXR1cm5zIGVycjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVJbiA9IChNNE9TQV9Wb2lkICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGxlbmd0aCArIDEsIE00VlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiUHRvM0dQUCBQYXJhbXM6IGZpbGUgaW4iKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBGaWxlSW4gPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwUGFyYW1zLT5wRmlsZUluLCAodm9pZCAqKXBEZWNvZGVkUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGVuZ3RoICsgMSkpOyAvKiBDb3B5IGlucHV0IGZpbGUgcGF0aCAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayB0aGF0IEpQRyBmaWxlIGlzIHByZXNlbnQgb24gdGhlIEZTIChQNE1FMDAwMDI5NzQpIGJ5IGp1c3Qgb3BlbmluZwotICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBjbG9zaW5nIGl0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEZpbGVSZWFkUHRyLT5vcGVuUmVhZCgmcEFSR0JGaWxlSW4sIHBEZWNvZGVkUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9rRmlsZVJlYWQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKCJDYW4ndCBvcGVuIGlucHV0IGpwZyBmaWxlICVzLCBlcnJvcjogMHgleFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlY29kZWRQYXRoLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHhWU1NfY29udGV4dC0+cEZpbGVSZWFkUHRyLT5jbG9zZVJlYWQocEFSR0JGaWxlSW4pOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKCJDYW4ndCBjbG9zZSBpbnB1dCBqcGcgZmlsZSAlcywgZXJyb3I6IDB4JXhcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IG91dF9pbWc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgJiYgeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjgoeFZTU19jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKW91dF9pbWcsIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IHBDb252RnJvbVVURjhGY3QgcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlT3V0ID0gKE00T1NBX1ZvaWQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKGxlbmd0aCArIDEpLCBNNFZTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIlB0bzNHUFAgUGFyYW1zOiBmaWxlIG91dCIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+cEZpbGVPdXQgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwUGFyYW1zLT5wRmlsZU91dCwgKHZvaWQgKilwRGVjb2RlZFBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxlbmd0aCArIDEpKTsgLyogQ29weSBvdXRwdXQgZmlsZSBwYXRoICovCi0KLSAgICAjaWZkZWYgTTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPSBvdXRfaW1nX3RtcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IHN0cmxlbihwRGVjb2RlZFBhdGgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCAmJiB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopb3V0X2ltZ190bXAsIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlVGVtcCA9IChNNE9TQV9Wb2lkICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKChsZW5ndGggKyAxKSwgTTRWUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJQdG8zR1BQIFBhcmFtczogZmlsZSB0ZW1wIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zLT5wRmlsZVRlbXAgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwUGFyYW1zLT5wRmlsZVRlbXAsICh2b2lkICopcERlY29kZWRQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsZW5ndGggKyAxKSk7IC8qIENvcHkgdGVtcG9yYXJ5IGZpbGUgcGF0aCAqLwotCi0gICAgI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgIC8qTTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRSovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbGwgUGFuQW5kWm9vbSBzZXR0aW5ncyBpZiBuZWVkZWQgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00T1NBX1RSVUUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLmlzUGFuWm9vbSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+aXNQYW5ab29tID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy5pc1Bhblpvb207Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgdGhhdCBQYW4gJiBab29tIHBhcmFtZXRlcnMgYXJlIGNvcnJlY3RzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuUGFuWm9vbVhhID4gMTAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLlBhblpvb21YYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSAwIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WGEgPiAxMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WWEgPiAxMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuUGFuWm9vbVhiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4gMTAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLlBhblpvb21YYgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSAwIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WGIgPiAxMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WWIgPiAxMDAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPlBhblpvb21YYSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuUGFuWm9vbVhhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtpXS0+eFZTUy5QYW5ab29tVG9wbGVmdFhhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtpXS0+eFZTUy5QYW5ab29tVG9wbGVmdFlhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPlBhblpvb21YYiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuUGFuWm9vbVhiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtpXS0+eFZTUy5QYW5ab29tVG9wbGVmdFhiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtpXS0+eFZTUy5QYW5ab29tVG9wbGVmdFliOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmlzUGFuWm9vbSA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLyorIFBSIE5vOiBibHJueHBzdyMyMjMqLwotICAgICAgICAgICAgICAgICAgICAgICAgLypJbnRpYWxpemluZyB0aGUgVmlkZW8gRnJhbWUgUmF0ZSBhcyBpdCBtYXkgbm90IGJlIGludGlhbGl6ZWQqLwotICAgICAgICAgICAgICAgICAgICAgICAgLypPdGhlciBjaGFuZ2VzIG1hZGUgaXMgQCBNNHhWU1NfSW50ZXJuYWwuYyBAIGxpbmUgMTUxOCBpbgotICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsU3RhcnRDb252ZXJ0UGljdHVyZVRvM2dwKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnZpZGVvRnJhbWVSYXRlICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2szMF9GUFM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmZyYW1lcmF0ZSA9IDMzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazI1X0ZQUzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+ZnJhbWVyYXRlID0gNDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjBfRlBTOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5mcmFtZXJhdGUgPSA1MDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxNV9GUFM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmZyYW1lcmF0ZSA9IDY2OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEyXzVfRlBTOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5mcmFtZXJhdGUgPSA4MDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMF9GUFM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmZyYW1lcmF0ZSA9IDEwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s3XzVfRlBTOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5mcmFtZXJhdGUgPSAxMzM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNV9GUFM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmZyYW1lcmF0ZSA9IDIwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKk1ha2luZyBEZWZhdWx0IEZyYW1lIFJhdGUgQCAxNSBGUFMqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5mcmFtZXJhdGUgPSA2NjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKi1QUiBObzogYmxybnhwc3cjMjIzKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLk1lZGlhUmVuZGVyaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTR4VlNTX2tDcm9wcGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSZW5kZXJpbmcgPT0gTTR4VlNTX2tCbGFja0JvcmRlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUmVuZGVyaW5nID09IE00eFZTU19rUmVzaXppbmcgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk1lZGlhUmVuZGVyaW5nID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy5NZWRpYVJlbmRlcmluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+cE5leHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+aXNDcmVhdGVkID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPm5iU3RlcFRvdGFsKys7Ci0gICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCBiVHJhbnNjb2RpbmdSZXF1aXJlZCB0byBUUlVFIHRvIGluZGljYXRlIHRoZSBrZW5idXJuIHZpZGVvIGhhcwotICAgICAgICAgICAgICAgICAgICAgICAgKiBiZWVuIGdlbmVyYXRlZCBpbiBhbmFseXNpcyBwaGFzZSwgYW5kIGRvZXMgbm90IG5lZWQgdG8gYmUgdGFuc2NvZGVkIGFnYWluCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGluIHNhdmluZyBwaGFzZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+YlRyYW5zY29kaW5nUmVxdWlyZWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJVRTsKLQotICAgIHJlcGxhY2VBUkdCXzNHUDoKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB0b3RhbCBkdXJhdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxEdXJhdGlvbiArPSBwUGFyYW1zLT5kdXJhdGlvbjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVwbGFjaW5nIGluIFZTUyBzdHJ1Y3R1cmUgdGhlIEpQRyBmaWxlIGJ5IHRoZSAzZ3AgZmlsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+RmlsZVR5cGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byBVVEY4LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPSBwUGFyYW1zLT5wRmlsZU91dDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZUb1VURjhGY3QgIT0gTTRPU0FfTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopcFBhcmFtcy0+cEZpbGVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IE00eFZTU19pbnRlcm5hbENvbnZlcnRUb1VURjggcmV0dXJucyBlcnI6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4JXgiLGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUgPSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKGxlbmd0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgMSksIE00VlMsIChNNE9TQV9DaGFyICopInhWU1MgZmlsZSBwYXRoIG9mIEFSR0IgdG8gM2dwIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcERlY29kZWRQYXRoLCAobGVuZ3RoICsgMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgLypGQjogYWRkIGZpbGUgcGF0aCBzaXplIGJlY2F1c2Ugb2YgVVRGMTYgY29udmVyc2lvbiovCi0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5maWxlUGF0aFNpemUgPSBsZW5ndGgrMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIDNHUCBpbnB1dCBmaWxlIHR5cGUgY2FzZQotICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5GaWxlVHlwZQotICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFAKLSAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPkZpbGVUeXBlCi0gICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTVA0Ci0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5GaWxlVHlwZQotICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX000ViApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qVVRGIGNvbnZlcnNpb24gc3VwcG9ydCovCi0gICAgICAgICAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAvKiBOZWVkIHRvIGNhbGwgTUNTIGluIGNhc2UgM0dQIHZpZGVvL2F1ZGlvIHR5cGVzIGFyZSBub3QgY29tcGF0aWJsZQotICAgICAgICAgICAgKEgyNjMvTVBFRzQgb3IgQU1STkIvQUFDKSAqLwotICAgICAgICAgICAgLyogPT4gTmVlZCB0byBmaWxsIE1DU19QYXJhbXMgc3RydWN0dXJlIHdpdGggdGhlIHJpZ2h0IHBhcmFtZXRlcnMgISAqLwotICAgICAgICAgICAgLyogTmVlZCBhbHNvIHRvIHBhcnNlIE1DUyBwYXJhbXMgc3RydWN0IHRvIGNoZWNrIGlmIGZpbGUgaGFzIGFscmVhZHkgYmVlbiB0cmFuc2NvZGVkICovCi0KLSAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzIGZpbGVQcm9wZXJ0aWVzOwotICAgICAgICAgICAgTTR4VlNTX01DU19wYXJhbXMgKnBQYXJhbXM7Ci0gICAgICAgICAgICBNNE9TQV9Cb29sIGF1ZGlvSXNEaWZmZXJlbnQgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIE00T1NBX0Jvb2wgdmlkZW9Jc0RpZmZlcmVudCA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgTTRPU0FfQm9vbCBiQXVkaW9Nb25vOwotICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBmaWxlIHByb3BlcnRpZXMgc3RydWN0dXJlICovCi0KLSAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKSAmZmlsZVByb3BlcnRpZXMsMCwKLSAgICAgICAgICAgICAgICBzaXplb2YoTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMpKTsKLQotICAgICAgICAgICAgLy9maWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvOwotCi0gICAgICAgICAgICAvKiBQcmV2ZW50IGZyb20gYmFkIGluaXRpYWxpemluZyBvZiBwZXJjZW50YWdlIGN1dCB0aW1lICovCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy51aUVuZEN1dFBlcmNlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA+IDEwMCB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpQmVnaW5DdXRQZXJjZW50ID4gMTAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBUaGVzZSBwZXJjZW50YWdlIGN1dCB0aW1lIGhhdmUgcHJvYmFibHkgbm90IGJlZW4gaW5pdGlhbGl6ZWQgKi8KLSAgICAgICAgICAgICAgICAvKiBMZXQncyBub3QgdXNlIHRoZW0gYnkgc2V0dGluZyB0aGVtIHRvIDAgKi8KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLnVpRW5kQ3V0UGVyY2VudCA9IDA7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy51aUJlZ2luQ3V0UGVyY2VudCA9Ci0gICAgICAgICAgICAgICAgICAgIDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlOwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0Ci0gICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCAmJiB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsIChNNE9TQV9Wb2lkCi0gICAgICAgICAgICAgICAgICAgICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbEdldFByb3BlcnRpZXMoeFZTU19jb250ZXh0LCBwRGVjb2RlZFBhdGgsCi0gICAgICAgICAgICAgICAgJmZpbGVQcm9wZXJ0aWVzKTsKLQotICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00eFZTU19zZW5kQ29tbWFuZDogTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyByZXR1cm5lZCAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAvKiBUT0RPOiBUcmFuc2xhdGUgZXJyb3IgY29kZSBvZiBNQ1MgdG8gYW4geFZTUyBlcnJvciBjb2RlICovCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogUGFyc2UgTUNTIHBhcmFtcyBjaGFpbmVkIGxpc3QgdG8ga25vdyBpZiBpbnB1dCBmaWxlIGhhcyBhbHJlYWR5IGJlZW4gY29udmVydGVkICovCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgcENtcFJlc3VsdCA9IDA7Ci0KLSAgICAgICAgICAgICAgICBwUGFyYW1zID0geFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdDsKLSAgICAgICAgICAgICAgICAvKiBXZSBwYXJzZSBhbGwgTUNTIFBhcmFtIGNoYWluZWQgbGlzdCAqLwotICAgICAgICAgICAgICAgIHdoaWxlKCBwUGFyYW1zICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIFVURjgsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0gcFBhcmFtcy0+cEZpbGVJbjsKLQotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udlRvVVRGOEZjdAotICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCAmJiB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilwUGFyYW1zLT5wRmlsZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcE91dENvbnZlcnNpb25CdWZmZXIsICZsZW5ndGgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0VG9VVEY4IHJldHVybnMgZXJyOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgICAgICAgICAgICAgcENtcFJlc3VsdCA9IHN0cmNtcCgoY29uc3QgY2hhciAqKXBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopcERlY29kZWRQYXRoKTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBJZiBpbnB1dCBmaWxlbmFtZXMgYXJlIHRoZSBzYW1lLCBhbmQgaWYgdGhpcyBpcyBub3QgYSBCR00sIHdlIGNhbiByZXVzZQotICAgICAgICAgICAgICAgICAgICB0aGUgdHJhbnNjb2RlZCBmaWxlICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwQ21wUmVzdWx0ID09IDAgJiYgcFBhcmFtcy0+aXNCR00gPT0gTTRPU0FfRkFMU0UKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHBQYXJhbXMtPkJlZ2luQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAgICAgPT0gcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAocFBhcmFtcy0+RW5kQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAgICAgPT0gcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgcFBhcmFtcy0+RW5kQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAgICAgPT0gcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICArIHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLnVpRHVyYXRpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy5NZWRpYVJlbmRlcmluZwotICAgICAgICAgICAgICAgICAgICAgICAgPT0gcFBhcmFtcy0+TWVkaWFSZW5kZXJpbmcgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlBZGRWb2x1bWUgPT0gMTAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChwUGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rTnVsbEF1ZGlvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHBQYXJhbXMtPk91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbyApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXBsYWNlIDNHUCBmaWxlbmFtZSB3aXRoIHRyYW5zY29kZWQgM0dQIGZpbGVuYW1lICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gcmVwbGFjZTNHUF8zR1A7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggKCBwUGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tOdWxsQXVkaW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgcFBhcmFtcy0+T3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXBsYWNlIDNHUCBmaWxlbmFtZSB3aXRoIHRyYW5zY29kZWQgM0dQIGZpbGVuYW1lICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byByZXBsYWNlM0dQXzNHUDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIFdlIG5lZWQgdG8gdXBkYXRlIHRoaXMgdmFyaWFibGUsIGluIGNhc2Ugc29tZSAzR1AgZmlsZXMgaGF2ZSBiZWVuIGFkZGVkCi0gICAgICAgICAgICAgICAgICAgIGJldHdlZW4gdHdvICovCi0gICAgICAgICAgICAgICAgICAgIC8qIGNhbGxzIHRvIE00eFZTU19zZW5kQ29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBwTUNTX2xhc3QgPSBwUGFyYW1zOwotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zID0gcFBhcmFtcy0+cE5leHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBJZiB3ZSBoYXZlIHBlcmNlbnRhZ2UgaW5mb3JtYXRpb24gbGV0J3MgdXNlIGl0Li4uICovCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy51aUVuZEN1dFBlcmNlbnQgIT0gMAotICAgICAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MudWlCZWdpbkN1dFBlcmNlbnQKLSAgICAgICAgICAgICAgICAhPSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBJZiBwZXJjZW50YWdlIGluZm9ybWF0aW9uIGFyZSBub3QgY29ycmVjdCBhbmQgaWYgZHVyYXRpb24gZmllbGQgaXMgbm90IGZpbGxlZCAqLwotICAgICAgICAgICAgICAgIGlmKCAoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgIHVpRW5kQ3V0UGVyY2VudAotICAgICAgICAgICAgICAgICAgICA8PSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICB1aUJlZ2luQ3V0UGVyY2VudCkKLSAgICAgICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy51aUR1cmF0aW9uCi0gICAgICAgICAgICAgICAgICAgID09IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX3NlbmRDb21tYW5kOiBCYWQgcGVyY2VudGFnZSBmb3IgYmVnaW4gYW5kIGVuZCBjdXQgdGltZSAhIik7Ci0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIFdlIHRyYW5zZm9ybSB0aGUgcGVyY2VudGFnZSBpbnRvIGFic29sdXRlIHRpbWUgKi8KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICA9IChNNE9TQV9VSW50MzIpKAotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICB1aUJlZ2luQ3V0UGVyY2VudAotICAgICAgICAgICAgICAgICAgICAqIGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uIC8gMTAwKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgPSAoTTRPU0FfVUludDMyKSgKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgdWlFbmRDdXRQZXJjZW50Ci0gICAgICAgICAgICAgICAgICAgICogZmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb24gLyAxMDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogLi4uT3RoZXJ3aXNlLCB3ZSB1c2UgYWJzb2x1dGUgdGltZS4gKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBJZiBlbmRDdXRUaW1lID09IDAsIGl0IG1lYW5zIGFsbCB0aGUgZmlsZSBpcyB0YWtlbi4gTGV0J3MgY2hhbmdlIHRvIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgZHVyYXRpb24sIHRvIGFjY3VyYXRlIHByZXZpZXcuICovCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZSA9PSAwCi0gICAgICAgICAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICA+IGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIElmIGR1cmF0aW9uIGZpZWxkIGlzIGZpbGxlZCwgaXQgaGFzIHByaW9yaXR5IG9uIG90aGVyIGZpZWxkcyBvbiBFbmRDdXRUaW1lLAotICAgICAgICAgICAgIHNvIGxldCdzIHVzZSBpdCAqLwotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MudWlEdXJhdGlvbiAhPSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAreFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy51aUR1cmF0aW9uOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICA+IGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIElmIG91dHB1dCB2aWRlbyBmb3JtYXQgaXMgbm90IHNldCwgd2UgdGFrZSB2aWRlbyBmb3JtYXQgb2YgdGhlIGZpcnN0IDNHUCB2aWRlbyAqLwotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0Ci0gICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa05vbmVWaWRlbyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy94VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCA9IGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZTsKLSAgICAgICAgICAgICAgICAvL000T1NBX1RSQUNFMl8xKCJPdXRwdXQgdmlkZW8gZm9ybWF0IGlzIG5vdCBzZXQsIHNldCBpdCB0byBjdXJyZW50IGNsaXA6ICVkIiwKLSAgICAgICAgICAgICAgICAvLyB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCk7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICJPdXRwdXQgdmlkZW8gZm9ybWF0IGlzIG5vdCBzZXQsIGFuIGVycm9yIHBhcmFtZXRlciBpcyByZXR1cm5lZC4iKTsKLSAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL3hWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0ID0gZmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlOwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8xKAotICAgICAgICAgICAgICAgICAgICAiT3V0cHV0IGF1ZGlvIGZvcm1hdCBpcyBub3Qgc2V0IC0+IHJlbW92ZSBhdWRpbyB0cmFjayBvZiBjbGlwOiAlZCIsCi0gICAgICAgICAgICAgICAgICAgIGkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggZmlsZVByb3BlcnRpZXMudWlOYkNoYW5uZWxzID09IDEgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJBdWRpb01vbm8gPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJBdWRpb01vbm8gPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIGZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICAgICAgICAgICE9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICAgICAgfHwgKGZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rQUFDCi0gICAgICAgICAgICAgICAgJiYgKGZpbGVQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kgIT0gc2FtcGxpbmdGcmVxCi0gICAgICAgICAgICAgICAgfHwgYkF1ZGlvTW9ubwotICAgICAgICAgICAgICAgICE9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm8pKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXVkaW9Jc0RpZmZlcmVudCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgLyogSWYgd2Ugd2FudCB0byByZXBsYWNlIGF1ZGlvLCB0aGVyZSBpcyBubyBuZWVkIHRvIHRyYW5zY29kZSBhdWRpbyAqLwotICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogdGVtcCBmaXggOlBUIHZvbHVtZSBub3QgaGVyYWQgaW4gdGhlIHNlY29uZCBjbGlwICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCAvKihwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUFkZFZvbHVtZSA9PSAxMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEZpbGVTaXplID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCovCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tOb25lQXVkaW8gKSAvKjExLzEyLzIwMDggQ1IgMzI4MyBWQUwgZm9yIHRoZSBNTVMKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZSBjYXNlLCB3ZSBuZWVkIHRvIHRyYW5zY29kZSBleGNlcHQgdGhlIG1lZGlhIHdpdGhvdXQgYXVkaW8qLwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdWRpb0lzRGlmZmVyZW50ID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggZmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tOb25lQXVkaW8gKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9Jc0RpZmZlcmVudCA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIEhlcmUgY2hlY2sgdGhlIGNsaXAgdmlkZW8gcHJvZmlsZSBhbmQgbGV2ZWwsIGlmIGl0IGV4Y2VlZHMKLSAgICAgICAgICAgICAqIHRoZSBwcm9maWxlIGFuZCBsZXZlbCBvZiBleHBvcnQgZmlsZSwgdGhlbiB0aGUgZmlsZSBuZWVkcwotICAgICAgICAgICAgICogdG8gYmUgdHJhbnNjb2RlZChkbyBub3QgZG8gY29tcHJlc3MgZG9tYWluIHRyaW0pLgotICAgICAgICAgICAgICogQWxzbyBmb3IgTVBFRzQgZm9tYXJ0LCBhbHdheXMgZG8gdHJhbnNjb2Rpbmcgc2luY2UgSFcgZW5jb2RlcgotICAgICAgICAgICAgICogbWF5IHVzZSBkaWZmZXJlbnQgdGltZSBzY2FsZSB2YWx1ZSB0aGFuIHRoZSBpbnB1dCBjbGlwKi8KLSAgICAgICAgICAgaWYgKChmaWxlUHJvcGVydGllcy51aVZpZGVvUHJvZmlsZSA+Ci0gICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1Byb2ZpbGUpIHx8Ci0gICAgICAgICAgICAgICAgKGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9MZXZlbCA+Ci0gICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0xldmVsKSB8fAotICAgICAgICAgICAgICAgIChmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa01QRUc0KSkgewotICAgICAgICAgICAgICAgLyogU2V0IGJUcmFuc2NvZGluZ1JlcXVpcmVkIHRvIFRSVUUgdG8gaW5kaWNhdGUgdGhlIHZpZGVvIHdpbGwgYmUKLSAgICAgICAgICAgICAgICAqIHRyYW5zY29kZWQgaW4gTUNTLiAqLwotICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+YlRyYW5zY29kaW5nUmVxdWlyZWQgPQotICAgICAgICAgICAgICAgICAgIE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICB2aWRlb0lzRGlmZmVyZW50ID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggdmlkZW9Jc0RpZmZlcmVudCA9PSBNNE9TQV9UUlVFIHx8IGF1ZGlvSXNEaWZmZXJlbnQgPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9DaGFyIG91dF8zZ3BbTTRYVlNTX01BWF9QQVRIX0xFTl07Ci0gICAgICAgICAgICAgICAgTTRPU0FfQ2hhciBvdXRfM2dwX3RtcFtNNFhWU1NfTUFYX1BBVEhfTEVOXTsKLQotICAgICAgICAgICAgICAgIC8qIENvbnN0cnVjdCBvdXRwdXQgdGVtcG9yYXJ5IDNHUCBmaWxlbmFtZSAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00T1NBX2NoclNQcmludGYob3V0XzNncCwgTTRYVlNTX01BWF9QQVRIX0xFTiAtIDEsIChNNE9TQV9DaGFyICopIiVzdmlkJWQuM2dwIiwKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wVGVtcFBhdGgsIHhWU1NfY29udGV4dC0+dGVtcEZpbGVJbmRleCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkVycm9yIGluIE00T1NBX2NoclNQcmludGY6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotI2lmZGVmIE00eFZTU19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UKLQotICAgICAgICAgICAgICAgIGVyciA9IE00T1NBX2NoclNQcmludGYob3V0XzNncF90bXAsIE00WFZTU19NQVhfUEFUSF9MRU4gLSAxLCAiJXN2aWQlZC50bXAiLAotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCwgeFZTU19jb250ZXh0LT50ZW1wRmlsZUluZGV4KTsKLQotICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiRXJyb3IgaW4gTTRPU0FfY2hyU1ByaW50ZjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0jZW5kaWYgLypNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFKi8KLQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+dGVtcEZpbGVJbmRleCsrOwotCi0gICAgICAgICAgICAgICAgcFBhcmFtcyA9Ci0gICAgICAgICAgICAgICAgICAgIChNNHhWU1NfTUNTX3BhcmFtcyAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX01DU19wYXJhbXMpLAotICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJFbGVtZW50IG9mIE1DUyBQYXJhbXMgKGZvciAzR1ApIik7Ci0KLSAgICAgICAgICAgICAgICBpZiggcFBhcmFtcyA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19zZW5kQ29tbWFuZDogUHJvYmxlbSB3aGVuIGFsbG9jYXRpbmcgb25lIGVsZW1lbnQgTUNTIFBhcmFtcyIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBQYXJhbXMtPk1lZGlhUmVuZGVyaW5nID0gTTR4VlNTX2tSZXNpemluZzsKLSAgICAgICAgICAgICAgICBwUGFyYW1zLT52aWRlb2NsaXBudW1iZXIgPSBpOyAvLyBJbmRpY2F0ZXMgdmlkZW8gY2xpcCBpbmRleAotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QKLSAgICAgICAgICAgICAgICAgICAgPT0gTTRPU0FfTlVMTCApIC8qIE1lYW5zIGl0IGlzIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBsaXN0ICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIHRoZSB4VlNTIGNvbnRleHQgd2l0aCB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgbGlzdCAqLwotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0ID0gcFBhcmFtczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIG5leHQgcG9pbnRlciBvZiB0aGUgcHJldmlvdXMgbGFzdCBlbGVtZW50IG9mIHRoZSBjaGFpbiAqLwotICAgICAgICAgICAgICAgICAgICBwTUNTX2xhc3QtPnBOZXh0ID0gcFBhcmFtczsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBTYXZlIHRoaXMgZWxlbWVudCBpbiBjYXNlIG9mIG90aGVyIGZpbGUgdG8gY29udmVydCAqLwotICAgICAgICAgICAgICAgIHBNQ1NfbGFzdCA9IHBQYXJhbXM7Ci0KLSAgICAgICAgICAgICAgICAvKiBGaWxsIHRoZSBsYXN0IE00eFZTU19NQ1NfcGFyYW1zIGVsZW1lbnQgKi8KLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5JbnB1dEZpbGVUeXBlID0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFA7Ci0gICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0RmlsZVR5cGUgPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUDsKLQotICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvVGltZXNjYWxlID0geFZTU19jb250ZXh0LT50YXJnZXRlZFRpbWVzY2FsZTsKLQotICAgICAgICAgICAgICAgIC8qIFdlIGRvIG5vdCBuZWVkIHRvIHJlZW5jb2RlIHZpZGVvIGlmIGl0cyBwYXJhbWV0ZXJzIGRvIG5vdCBkaWZmZXIgKi8KLSAgICAgICAgICAgICAgICAvKiBmcm9tIG91dHB1dCBzZXR0aW5ncyBwYXJhbWV0ZXJzICovCi0gICAgICAgICAgICAgICAgaWYoIHZpZGVvSXNEaWZmZXJlbnQgPT0gTTRPU0FfVFJVRSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0Zvcm1hdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdDsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+b3V0cHV0VmlkZW9Qcm9maWxlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+b3V0cHV0VmlkZW9MZXZlbCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0xldmVsOwotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lUmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dmlkZW9GcmFtZVJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZTsKLQotICAgICAgICAgICAgICAgICAgICAvKkZCOiBWQUwgQ1IgUDRNRTAwMDAzMDc2Ci0gICAgICAgICAgICAgICAgICAgIFRoZSBvdXRwdXQgdmlkZW8gYml0cmF0ZSBpcyBub3cgZGlyZWN0bHkgZ2l2ZW4gYnkgdGhlIHVzZXIgaW4gdGhlIGVkaXRpb24KLSAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3Mgc3RydWN0dXJlIElmIHRoZSBiaXRyYXRlIGdpdmVuIGJ5IHRoZSB1c2VyIGlzIGlycmVsZXZhbnQKLSAgICAgICAgICAgICAgICAgICAgKHRoZSBNQ1MgbWluaW11bSBhbmQgbWF4aW11bSB2aWRlbyBiaXRyYXRlIGFyZSB1c2VkKSwKLSAgICAgICAgICAgICAgICAgICAgdGhlIG91dHB1dCB2aWRlbyBiaXRyYXRlIGlzIGhhcmRjb2RlZCBhY2NvcmRpbmcgdG8gdGhlIG91dHB1dCB2aWRlbyBzaXplKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgPj0gTTRWSURFT0VESVRJTkdfazE2X0tCUFMKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgPD0gTTRWSURFT0VESVRJTkdfazhfTUJQUyApIC8qKyBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvQml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tTUUNJRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2s0OF9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FRVkdBOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazY0X0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUUNJRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2sxMjhfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRVkdBOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazM4NF9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0NJRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2szODRfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tWR0E6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rNTEyX0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogLyogU2hvdWxkIG5vdCBoYXBwZW4gISEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2s2NF9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5vdXRwdXRWaWRlb1Byb2ZpbGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Qcm9maWxlOwotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5vdXRwdXRWaWRlb0xldmVsID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvTGV2ZWw7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0ID0gTTRWSURFT0VESVRJTkdfa051bGxWaWRlbzsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazE1X0ZQUzsgLyogTXVzdCBiZSBzZXQsIG90aGVyd2lzZSwgTUNTIHJldHVybnMgYW4gZXJyb3IgKi8KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiggYXVkaW9Jc0RpZmZlcmVudCA9PSBNNE9TQV9UUlVFICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvRm9ybWF0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0OwotCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tOb25lQXVkaW86Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FNUl9OQjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rMTJfMl9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmJBdWRpb01vbm8gPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvU2FtcGxpbmdGcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRGVmYXVsdF9BU0Y7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FBQzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qRkI6IFZBTCBDUiBQNE1FMDAwMDMwNzYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG91dHB1dCBhdWRpbyBiaXRyYXRlIGluIHRoZSBBQUMgY2FzZSBpcyBub3cgZGlyZWN0bHkgZ2l2ZW4gYnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHVzZXIgaW4gdGhlIGVkaXRpb24gc2V0dGluZ3Mgc3RydWN0dXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBiaXRyYXRlIGdpdmVuIGJ5IHRoZSB1c2VyIGlzIGlycmVsZXZhbnQgb3IgdW5kZWZpbmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGUgTUNTIG1pbmltdW0gYW5kIG1heGltdW0gYXVkaW8gYml0cmF0ZSBhcmUgdXNlZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvdXRwdXQgYXVkaW8gYml0cmF0ZSBpcyBoYXJkIGNvZGVkIGFjY29yZGluZyB0byB0aGUgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIHNhbXBsaW5nIGZyZXF1ZW5jeSovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypDaGVjayBpZiB0aGUgYXVkaW8gYml0cmF0ZSBpcyBjb3JyZWN0bHkgZGVmaW5lZCovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypNb25vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DUyB2YWx1ZXMgZm9yIEFBQyBNb25vIGFyZSBtaW46IDE2a2JwcyBhbmQgbWF4OiAxOTIga2JwcyovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID49IE00VklERU9FRElUSU5HX2sxNl9LQlBTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLm91dHB1dEF1ZGlvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD0gTTRWSURFT0VESVRJTkdfazE5Ml9LQlBTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5iQXVkaW9Nb25vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNNE9TQV9UUlVFICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy5vdXRwdXRBdWRpb0JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypTdGVyZW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTIHZhbHVlcyBmb3IgQUFDIE1vbm8gYXJlIG1pbjogMzJrYnBzIGFuZCBtYXg6IDE5MiBrYnBzKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy5vdXRwdXRBdWRpb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID49IE00VklERU9FRElUSU5HX2szMl9LQlBTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLm91dHB1dEF1ZGlvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD0gTTRWSURFT0VESVRJTkdfazE5Ml9LQlBTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5iQXVkaW9Nb25vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNNE9TQV9GQUxTRSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1Mub3V0cHV0QXVkaW9CaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgYXVkaW8gYml0cmF0ZSBpcyBoYXJkIGNvZGVkIGFjY29yZGluZyB0byB0aGUgb3V0cHV0IGF1ZGlvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZyBmcmVxdWVuY3kqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1Mub3V0cHV0QXVkaW9TYW1wbEZyZXEgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazE2MDAwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2syNF9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazIyMDUwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syNDAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rMzJfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2szMjAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rNDhfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s0NDEwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNDgwMDBfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazY0X0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2s2NF9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNNE9TQV9GQUxTRSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IGJpdHJhdGUgaGF2ZSB0byBiZSBkb3VibGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9CaXRyYXRlICs9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvQml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmJBdWRpb01vbm8gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy5vdXRwdXRBdWRpb1NhbXBsRnJlcQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfazgwMDBfQVNGICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJldmVudCBmcm9tIHVuYWxsb3dlZCBzYW1wbGluZyBmcmVxdWVuY2llcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa0RlZmF1bHRfQVNGOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1Mub3V0cHV0QXVkaW9TYW1wbEZyZXE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAvKiBTaG91bGQgbm90IGhhcHBlbiAhISAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvRm9ybWF0ID0gTTRWSURFT0VESVRJTkdfa0FNUl9OQjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rMTJfMl9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmJBdWRpb01vbm8gPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvU2FtcGxpbmdGcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRGVmYXVsdF9BU0Y7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvRm9ybWF0ID0gTTRWSURFT0VESVRJTkdfa051bGxBdWRpbzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlOwotICAgICAgICAgICAgICAgIGxlbmd0aCA9IHN0cmxlbihwRGVjb2RlZFBhdGgpOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtpXS0+cEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlSW4gPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygobGVuZ3RoICsgMSksIE00VlMsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk1DUyAzR1AgUGFyYW1zOiBmaWxlIGluIik7Ci0KLSAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+cEZpbGVJbiA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBQYXJhbXMtPnBGaWxlSW4sICh2b2lkICopcERlY29kZWRQYXRoLAotICAgICAgICAgICAgICAgICAgICAobGVuZ3RoICsgMSkpOyAvKiBDb3B5IGlucHV0IGZpbGUgcGF0aCAqLwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPSBvdXRfM2dwOwotICAgICAgICAgICAgICAgIGxlbmd0aCA9IHN0cmxlbihwRGVjb2RlZFBhdGgpOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKW91dF8zZ3AsIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICZsZW5ndGgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0geFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEVuZCBvZiB0aGUgVVRGIGNvbnZlcnNpb24sIHVzZSB0aGUgY29udmVydGVkIGZpbGUgcGF0aCovCi0gICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVPdXQgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygobGVuZ3RoICsgMSksIE00VlMsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk1DUyAzR1AgUGFyYW1zOiBmaWxlIG91dCIpOwotCi0gICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBGaWxlT3V0ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFBhcmFtcy0+cEZpbGVPdXQsICh2b2lkICopcERlY29kZWRQYXRoLAotICAgICAgICAgICAgICAgICAgICAobGVuZ3RoICsgMSkpOyAvKiBDb3B5IG91dHB1dCBmaWxlIHBhdGggKi8KLQotI2lmZGVmIE00eFZTU19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotCi0gICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0gb3V0XzNncF90bXA7Ci0gICAgICAgICAgICAgICAgbGVuZ3RoID0gc3RybGVuKHBEZWNvZGVkUGF0aCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0Ci0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgJiYgeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopb3V0XzNncF90bXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlVGVtcCA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKChsZW5ndGggKyAxKSwgTTRWUywKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTUNTIDNHUCBQYXJhbXM6IGZpbGUgdGVtcCIpOwotCi0gICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBGaWxlVGVtcCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBQYXJhbXMtPnBGaWxlVGVtcCwgKHZvaWQgKilwRGVjb2RlZFBhdGgsCi0gICAgICAgICAgICAgICAgICAgIChsZW5ndGggKyAxKSk7IC8qIENvcHkgdGVtcG9yYXJ5IGZpbGUgcGF0aCAqLwotCi0jZWxzZQotCi0gICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVUZW1wID0gTTRPU0FfTlVMTDsKLQotI2VuZGlmIC8qTTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRSovCi0KLSAgICAgICAgICAgICAgICAvKkZCIDIwMDgvMTAvMjAga2VlcCBtZWRpYSBhc3BlY3QgcmF0aW8sIGFkZCBtZWRpYSByZW5kZXJpbmcgcGFyYW1ldGVyKi8KLQotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLk1lZGlhUmVuZGVyaW5nCi0gICAgICAgICAgICAgICAgICAgID09IE00eFZTU19rQ3JvcHBpbmcKLSAgICAgICAgICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSZW5kZXJpbmcgPT0gTTR4VlNTX2tCbGFja0JvcmRlcnMKLSAgICAgICAgICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSZW5kZXJpbmcgPT0gTTR4VlNTX2tSZXNpemluZyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5NZWRpYVJlbmRlcmluZyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSZW5kZXJpbmc7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLypGQjogdHJhbnNjb2RpbmcgcGVyIHBhcnRzKi8KLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5CZWdpbkN1dFRpbWUgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZTsKLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5FbmRDdXRUaW1lID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlFbmRDdXRUaW1lOwotCi0gICAgICAgICAgICAgICAgcFBhcmFtcy0+cE5leHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPmlzQkdNID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgcFBhcmFtcy0+aXNDcmVhdGVkID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5uYlN0ZXBUb3RhbCsrOwotICAgICAgICAgICAgICAgIGJJc1RyYW5zY29kaW5nID0gTTRPU0FfVFJVRTsKLQotcmVwbGFjZTNHUF8zR1A6Ci0gICAgICAgICAgICAgICAgLyogVXBkYXRlIHRvdGFsIGR1cmF0aW9uICovCi0gICAgICAgICAgICAgICAgdG90YWxEdXJhdGlvbiArPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgLSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZTsKLQotICAgICAgICAgICAgICAgIC8qIFJlcGxhY2luZyBpbiBWU1Mgc3RydWN0dXJlIHRoZSBvcmlnaW5hbCAzR1AgZmlsZSBieSB0aGUgdHJhbnNjb2RlZCAzR1AgZmlsZSAqLwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPkZpbGVUeXBlID0KLSAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFA7Ci0KLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0gcFBhcmFtcy0+cEZpbGVPdXQ7Ci0KLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udlRvVVRGOEZjdAotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRUb1VURjgoeFZTU19jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilwUGFyYW1zLT5wRmlsZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICZsZW5ndGgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IE00eFZTU19pbnRlcm5hbENvbnZlcnRUb1VURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IHN0cmxlbihwRGVjb2RlZFBhdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEVuZCBvZiB0aGUgVVRGIGNvbnZlcnNpb24sIHVzZSB0aGUgY29udmVydGVkIGZpbGUgcGF0aCovCi0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUgPSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgIChsZW5ndGggKyAxKSwKLSAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikieFZTUyBmaWxlIHBhdGggb2YgM2dwIHRvIDNncCIpOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopcERlY29kZWRQYXRoLCAobGVuZ3RoICsgMSkpOwotICAgICAgICAgICAgICAgIC8qRkI6IGFkZCBmaWxlIHBhdGggc2l6ZSBiZWNhdXNlIG9mIFVURiAxNiBjb252ZXJzaW9uKi8KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5maWxlUGF0aFNpemUgPSBsZW5ndGgrMTsKLQotICAgICAgICAgICAgICAgIC8qIFdlIGRlZmluZSBtYXN0ZXIgY2xpcCBhcyBmaXJzdCAzR1AgaW5wdXQgY2xpcCAqLwotICAgICAgICAgICAgICAgIC8qaWYoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpTWFzdGVyQ2xpcCA9PSAwICYmIGZpbGVQcm9wZXJ0aWVzLgotICAgICAgICAgICAgICAgIEF1ZGlvU3RyZWFtVHlwZSAhPSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlNYXN0ZXJDbGlwID0gaTsKLSAgICAgICAgICAgICAgICB9Ki8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdG90YWwgZHVyYXRpb24gKi8KLSAgICAgICAgICAgICAgICB0b3RhbER1cmF0aW9uICs9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAtIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogV2UgZGVmaW5lIG1hc3RlciBjbGlwIGFzIGZpcnN0IDNHUCBpbnB1dCBjbGlwICovCi0gICAgICAgICAgICBpZiggbWFzdGVyQ2xpcCA9PSAtMQotICAgICAgICAgICAgICAgICYmIGZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSAhPSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtYXN0ZXJDbGlwID0gaTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlNYXN0ZXJDbGlwID0gaTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICBPdGhlciBpbnB1dCBmaWxlIHR5cGUgY2FzZQotICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkJhZCBmaWxlIHR5cGUgYXMgaW5wdXQgY2xpcCIpOwotICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgKiBQYXJzZSBhbGwgZWZmZWN0cyB0byBtYWtlIHNvbWUgYWRqdXN0bWVudCBmb3IgZnJhbWluZywgKgotICAgICogdGV4dCBhbmQgdG8gdHJhbnNmb3JtIHJlbGF0aXZlIHRpbWUgaW50byBhYnNvbHV0ZSB0aW1lICoKLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIGZvciAoIGogPSAwOyBqIDwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPm5iRWZmZWN0czsgaisrICkKLSAgICB7Ci0gICAgICAgIC8qIENvcHkgZWZmZWN0IHRvICJsb2NhbCIgc3RydWN0dXJlICovCi0gICAgICAgIG1lbWNweSgodm9pZCAqKSAmKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdKSwKLSAgICAgICAgICAgICh2b2lkICopICYocFNldHRpbmdzLT5FZmZlY3RzW2pdKSwKLSAgICAgICAgICAgIHNpemVvZihNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MpKTsKLQotICAgICAgICAvKiBQcmV2ZW50IGZyb20gYmFkIGluaXRpYWxpemluZyBvZiBlZmZlY3QgcGVyY2VudGFnZSB0aW1lICovCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpRHVyYXRpb25QZXJjZW50ID4gMTAwCi0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpU3RhcnRQZXJjZW50ID4gMTAwICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogVGhlc2UgcGVyY2VudGFnZSB0aW1lIGhhdmUgcHJvYmFibHkgbm90IGJlZW4gaW5pdGlhbGl6ZWQgKi8KLSAgICAgICAgICAgIC8qIExldCdzIG5vdCB1c2UgdGhlbSBieSBzZXR0aW5nIHRoZW0gdG8gMCAqLwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aUR1cmF0aW9uUGVyY2VudCA9IDA7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpU3RhcnRQZXJjZW50ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIElmIHdlIGhhdmUgcGVyY2VudGFnZSBpbmZvcm1hdGlvbiBsZXQncyB1c2UgaXQuLi4gT3RoZXJ3aXNlLCB3ZSB1c2UgYWJzb2x1dGUgdGltZS4gKi8KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlEdXJhdGlvblBlcmNlbnQgIT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnVpU3RhcnRUaW1lID0gKE00T1NBX1VJbnQzMikodG90YWxEdXJhdGlvbgotICAgICAgICAgICAgICAgICogeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aVN0YXJ0UGVyY2VudAotICAgICAgICAgICAgICAgIC8gMTAwKTsKLSAgICAgICAgICAgIC8qIFRoZSBwZXJjZW50YWdlIG9mIGVmZmVjdCBkdXJhdGlvbiBpcyBiYXNlZCBvbiB0aGUgZHVyYXRpb24gb2YgdGhlIGNsaXAgLQotICAgICAgICAgICAgc3RhcnQgdGltZSAqLwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIEVmZmVjdHNbal0udWlEdXJhdGlvbiA9IChNNE9TQV9VSW50MzIpKHRvdGFsRHVyYXRpb24KLSAgICAgICAgICAgICAgICAqIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlEdXJhdGlvblBlcmNlbnQKLSAgICAgICAgICAgICAgICAvIDEwMCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBJZiB0aGVyZSBpcyBhIGZyYW1pbmcgZWZmZWN0LCB3ZSBuZWVkIHRvIGFsbG9jYXRlIGZyYW1pbmcgZWZmZWN0IHN0cnVjdHVyZSAqLwotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICA9PSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GcmFtaW5nICkKLSAgICAgICAgewotI2lmZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi0KLSAgICAgICAgICAgIE00eFZTU19GcmFtaW5nQ29udGV4dCAqZnJhbWluZ0N0eDsKLSAgICAgICAgICAgIC8qVVRGIGNvbnZlcnNpb24gc3VwcG9ydCovCi0gICAgICAgICAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotCi0jZWxzZQotCi0gICAgICAgICAgICBNNHhWU1NfRnJhbWluZ1N0cnVjdCAqZnJhbWluZ0N0eDsKLQotI2VuZGlmIC8qREVDT0RFX0dJRl9PTl9TQVZJTkcqLwotCi0gICAgICAgICAgICBNNE9TQV9DaGFyICpwRXh0MiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nQnVmZmVyOwotICAgICAgICAgICAgTTRPU0FfSW50MzIgcmVzdWx0MSwgcmVzdWx0MjsKLQotICAgICAgICAgICAgLyogQ29weSBmcmFtaW5nIGZpbGUgcGF0aCAqLwotICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nRmlsZVBhdGggIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MucEZyYW1pbmdGaWxlUGF0aCA9IE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgc3RybGVuKHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nRmlsZVBhdGgpCi0gICAgICAgICAgICAgICAgICAgICsgMSwgTTRWUywgKE00T1NBX0NoYXIgKikiTG9jYWwgRnJhbWluZyBmaWxlIHBhdGgiKTsKLQotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nRmlsZVBhdGgKLSAgICAgICAgICAgICAgICAgICAgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoLCBzdHJsZW4oCi0gICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nRmlsZVBhdGgpICsgMSk7Ci0KLSAgICAgICAgICAgICAgICBwRXh0MiA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MucEZyYW1pbmdGaWxlUGF0aDsKLSAgICAgICAgICAgIH0KLQotI2lmZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi0KLSAgICAgICAgICAgIGZyYW1pbmdDdHggPSAoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Ci0gICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19GcmFtaW5nQ29udGV4dCksCi0gICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiQ29udGV4dCBvZiB0aGUgZnJhbWluZyBlZmZlY3QiKTsKLQotICAgICAgICAgICAgaWYoIGZyYW1pbmdDdHggPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eF9sYXN0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPnBTUFNDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPm91dHB1dFZpZGVvU2l6ZSA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplOwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+dG9wbGVmdF94ID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRvcGxlZnRfeDsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPnRvcGxlZnRfeSA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50b3BsZWZ0X3k7Ci0gICAgICAgICAgICBmcmFtaW5nQ3R4LT5iRWZmZWN0UmVzaXplID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLmJSZXNpemU7Ci0gICAgICAgICAgICBmcmFtaW5nQ3R4LT5wRWZmZWN0RmlsZVBhdGggPQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MucEZyYW1pbmdGaWxlUGF0aDsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPnBGaWxlUmVhZFB0ciA9IHhWU1NfY29udGV4dC0+cEZpbGVSZWFkUHRyOwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+cEZpbGVXcml0ZVB0ciA9IHhWU1NfY29udGV4dC0+cEZpbGVXcml0ZVB0cjsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPmVmZmVjdER1cmF0aW9uID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS51aUR1cmF0aW9uOwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+Yl9Jc0ZpbGVHaWYgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+Yl9hbmltYXRlZCA9IE00T1NBX0ZBTFNFOwotCi0gICAgICAgICAgICAvKiBPdXRwdXQgcmF0aW8gZm9yIHRoZSBlZmZlY3QgaXMgc3RvcmVkIGluIHVpRmlmdGllc091dEZyYW1lUmF0ZSBwYXJhbWV0ZXJzIG9mIHRoZQotICAgICAgICAgICAgZXh0ZW5kZWQgeFZTUyBlZmZlY3RzIHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlGaWZ0aWVzT3V0RnJhbWVSYXRlCi0gICAgICAgICAgICAgICAgIT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+ZnJhbWVEdXJhdGlvblJhdGlvID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0Zsb2F0KSgoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgRWZmZWN0c1tqXS54VlNTLnVpRmlmdGllc091dEZyYW1lUmF0ZSkgLyAxMDAwLjApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmZyYW1lRHVyYXRpb25SYXRpbyA9IDEuMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLypBbHBoYSBibGVuZGluZyovCi0gICAgICAgICAgICAvKkNoZWNrIGlmIHRoZSBhbHBoYSBibGVuZGluZyBwYXJhbWV0ZXJzIGFyZSBjb3JyZWN0cyovCi0gICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZUluVGltZSA+IDEwMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZUluVGltZSA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlT3V0VGltZSA+IDEwMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWUgPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRW5kID4gMTAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdFbmQgPSAxMDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdNaWRkbGUgPiAxMDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ01pZGRsZSA9IDEwMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ1N0YXJ0ID4gMTAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdTdGFydCA9IDEwMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVJblRpbWUgPiAwCi0gICAgICAgICAgICAgICAgfHwgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWUgPiAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKkFsbG9jYXRlIHRoZSBhbHBoYSBibGVuZGluZyBzdHJ1Y3R1cmUqLwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QgPQotICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX2ludGVybmFsRWZmZWN0c0FscGhhQmxlbmRpbmcgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgIHNpemVvZihNNHhWU1NfaW50ZXJuYWxFZmZlY3RzQWxwaGFCbGVuZGluZyksCi0gICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopImFscGhhIGJsZW5kaW5nIHN0cnVjdHVyZSIpOwotCi0gICAgICAgICAgICAgICAgaWYoIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLypGaWxsIHRoZSBhbHBoYSBibGVuZGluZyBzdHJ1Y3R1cmUqLwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZUluVGltZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVJblRpbWU7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlT3V0VGltZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVPdXRUaW1lOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZW5kID0KLSAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRW5kOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fbWlkZGxlID0KLSAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nTWlkZGxlOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fc3RhcnQgPQotICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdTdGFydDsKLQotICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlSW5UaW1lCi0gICAgICAgICAgICAgICAgICAgICsgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgID4gMTAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZU91dFRpbWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgMTAwIC0gZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlSW5UaW1lOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotICAgICAgICAgICAgcERlY29kZWRQYXRoID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nRmlsZVBhdGg7Ci0gICAgICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLQotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAotICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgJiYgeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIKLSAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjgoeFZTU19jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgRWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nRmlsZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+cEVmZmVjdEZpbGVQYXRoID0gTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGxlbmd0aCArIDEsIE00VlMsCi0gICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTG9jYWwgRnJhbWluZyBmaWxlIHBhdGgiKTsKLQotICAgICAgICAgICAgaWYoIGZyYW1pbmdDdHgtPnBFZmZlY3RGaWxlUGF0aCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKWZyYW1pbmdDdHgtPnBFZmZlY3RGaWxlUGF0aCwKLSAgICAgICAgICAgICAgICAodm9pZCAqKXBEZWNvZGVkUGF0aCwgbGVuZ3RoICsgMSk7Ci0KLSAgICAgICAgICAgIC8qIFNhdmUgZnJhbWluZyBzdHJ1Y3R1cmUgYXNzb2NpYXRlZCB3aXRoIGNvcnJlc3BvbmRpbmcgZWZmZWN0ICovCi0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0ID0KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4OwotCi0jZWxzZQotCi0gICAgICAgICAgICBmcmFtaW5nQ3R4ID0gKE00eFZTU19GcmFtaW5nU3RydWN0Ci0gICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19GcmFtaW5nU3RydWN0KSwKLSAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJDb250ZXh0IG9mIHRoZSBmcmFtaW5nIGVmZmVjdCIpOwotCi0gICAgICAgICAgICBpZiggZnJhbWluZ0N0eCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZnJhbWluZ0N0eC0+dG9wbGVmdF94ID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRvcGxlZnRfeDsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPnRvcGxlZnRfeSA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50b3BsZWZ0X3k7Ci0KLSAgICAgICAgICAgIC8qIEJ1Z0ZpeCAxLjIuMDogTGVhayB3aGVuIGRlY29kaW5nIGVycm9yICovCi0gICAgICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+cE5leHQgPSBmcmFtaW5nQ3R4OwotICAgICAgICAgICAgLyogU2F2ZSBmcmFtaW5nIHN0cnVjdHVyZSBhc3NvY2lhdGVkIHdpdGggY29ycmVzcG9uZGluZyBlZmZlY3QgKi8KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHg7Ci0KLSNlbmRpZiAvKkRFQ09ERV9HSUZfT05fU0FWSU5HKi8KLQotICAgICAgICAgICAgaWYoIHBFeHQyICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIERlY29kZSB0aGUgaW1hZ2UgYXNzb2NpYXRlZCB0byB0aGUgZWZmZWN0LCBhbmQgZmlsbCBmcmFtaW5nIHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgICAgIHBFeHQyICs9IChzdHJsZW4oKGNvbnN0IGNoYXIgKilwRXh0MikgLSA0KTsKLQotICAgICAgICAgICAgICAgIHJlc3VsdDEgPSBzdHJjbXAoKGNvbnN0IGNoYXIgKilwRXh0MiwoY29uc3QgY2hhciAqKSIucmdiIik7Ci0gICAgICAgICAgICAgICAgcmVzdWx0MiA9IHN0cmNtcCgoY29uc3QgY2hhciAqKXBFeHQyLChjb25zdCBjaGFyICopIi5SR0IiKTsKLQotICAgICAgICAgICAgICAgIGlmKCAwID09IHJlc3VsdDEgfHwgMCA9PSByZXN1bHQyICkKLSAgICAgICAgICAgICAgICB7Ci0jaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLQotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QKLSAgICAgICAgICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNHhWU1NfRnJhbWluZ1N0cnVjdCksCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTLAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIKLSAgICAgICAgICAgICAgICAgICAgICAgICopCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX2ludGVybmFsRGVjb2RlR0lGOiBDb250ZXh0IG9mIHRoZSBmcmFtaW5nIGVmZmVjdCIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPOiBUcmFuc2xhdGUgZXJyb3IgY29kZSBvZiBTUFMgdG8gYW4geFZTUyBlcnJvciBjb2RlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+cEN1cnJlbnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTlVMTDsgLyogT25seSB1c2VkIGJ5IHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBjaGFpbiAqLwotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+cHJldmlvdXNDbGlwVGltZSA9IC0xOwotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1l1diA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPnRvcGxlZnRfeCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRvcGxlZnRfeDsKLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPnRvcGxlZnRfeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRvcGxlZnRfeTsKLSAgICAgICAgICAgICAgICAgICAgLypUbyBzdXBwb3J0IEFSR0I4ODg4IDogZ2V0IHRoZSB3aWR0aCBhbmQgaGVpZ2h0ICovCi0KLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPndpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1Mud2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJGUkFNTUlORyBCRUZPUkUgTTR4VlNTX1NlbmRDb21tYW5kICAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+d2lkdGgpOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiRlJBTU1JTkcgQkVGT1JFIE00eFZTU19TZW5kQ29tbWFuZCAgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPmhlaWdodCk7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAmKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKCJGUkFNSU5HIFdJRFRIIEJFRk9SRSBNNHhWU1NfU2VuZENvbW1hbmQgICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT53aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKCJGUkFNSU5HIEhFSUdIVCBCRUZPUkUgTTR4VlNTX1NlbmRDb21tYW5kICAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+aGVpZ2h0KTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxEZWNvZGVQTkcgcmV0dXJuZWQgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRPRE86IFRyYW5zbGF0ZSBlcnJvciBjb2RlIG9mIFNQUyB0byBhbiB4VlNTIGVycm9yIGNvZGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IE5vdCBzdXBwb3J0ZWQgc3RpbGwgcGljdHVyZSBmb3JtYXQgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIHBQbGFuZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSNpZmRlZiBERUNPREVfR0lGX09OX1NBVklORwotCi0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHggPSAoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QKLSAgICAgICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19GcmFtaW5nU3RydWN0KSwKLSAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiQ29udGV4dCBvZiB0aGUgZnJhbWluZyBlZmZlY3QiKTsKLQotICAgICAgICAgICAgICAgIGlmKCBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPnRvcGxlZnRfeCA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudG9wbGVmdF94OwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT50b3BsZWZ0X3kgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRvcGxlZnRfeTsKLQotICAgICAgICAgICAgICAgIC8qIEJ1Z0ZpeCAxLjIuMDogTGVhayB3aGVuIGRlY29kaW5nIGVycm9yICovCi0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+cE5leHQgPSBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+cEN1cnJlbnQgPSBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+ZHVyYXRpb24gPSAwOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5wcmV2aW91c0NsaXBUaW1lID0gLTE7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nQnVmZmVyOwotICAgICAgICAgICAgICAgIC8qIEZvcmNlIGlucHV0IFJHQiBidWZmZXIgdG8gZXZlbiBzaXplIHRvIGF2b2lkIGVycm9ycyBpbiBZVVYgY29udmVyc2lvbiAqLwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGggJiB+MTsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQgJiB+MTsKLSAgICAgICAgICAgICAgICAvKiBJbnB1dCBSR0IgcGxhbmUgaXMgcHJvdmlkZWQsIGxldCdzIGNvbnZlcnQgaXQgdG8gWVVWNDIwLCBhbmQgdXBkYXRlIGZyYW1pbmcKLSAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgICovCi0gICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4KTsKLQotI2Vsc2UKLQotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nQnVmZmVyOwotICAgICAgICAgICAgICAgIC8qIEZvcmNlIGlucHV0IFJHQiBidWZmZXIgdG8gZXZlbiBzaXplIHRvIGF2b2lkIGVycm9ycyBpbiBZVVYgY29udmVyc2lvbiAqLwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IudV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IudV93aWR0aCAmIH4xOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IudV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLnVfaGVpZ2h0ICYgfjE7Ci0gICAgICAgICAgICAgICAgLyogSW5wdXQgUkdCIHBsYW5lIGlzIHByb3ZpZGVkLCBsZXQncyBjb252ZXJ0IGl0IHRvIFlVVjQyMCwgYW5kIHVwZGF0ZSBmcmFtaW5nCi0gICAgICAgICAgICAgICAgIHN0cnVjdHVyZSAgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVYoZnJhbWluZ0N0eCk7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19zZW5kQ29tbWFuZDogZXJyb3Igd2hlbiBjb252ZXJ0aW5nIFJHQiB0byBZVVY6IDB3JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNHhWU1Nfc2VuZENvbW1hbmQ6IE5vIGlucHV0IGltYWdlL3BsYW5lIHByb3ZpZGVkIGZvciBmcmFtaW5nIGVmZmVjdC4iKTsKLSAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLyogQ1I6IEFkZCB0ZXh0IGhhbmRsaW5nIHdpdGggZXh0ZXJuYWwgdGV4dCBpbnRlcmZhY2UgKi8KLSAgICAgICAgLyogSWYgZWZmZWN0IHR5cGUgaXMgdGV4dCwgd2UgY2FsbCBleHRlcm5hbCB0ZXh0IGZ1bmN0aW9uIHRvIGdldCBSR0IgNTY1IGJ1ZmZlciAqLwotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICA9PSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9UZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogQ2FsbCB0aGUgZm9udCBlbmdpbmUgZnVuY3Rpb24gcG9pbnRlciB0byBnZXQgUkdCNTY1IGJ1ZmZlciAqLwotICAgICAgICAgICAgLyogV2UgdHJhbnNmb3JtIHRleHQgZWZmZWN0IGludG8gZnJhbWluZyBlZmZlY3QgZnJvbSBidWZmZXIgKi8KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wVGV4dFJlbmRlcmluZ0ZjdCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKkZCOiBhZGQgVVRGIGNvbnZlcnRpb24gZm9yIHRleHQgYnVmZmVyKi8KLSAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotI2lmZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi0KLSAgICAgICAgICAgICAgICBNNHhWU1NfRnJhbWluZ0NvbnRleHQgKmZyYW1pbmdDdHg7Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgICAgICBNNHhWU1NfRnJhbWluZ1N0cnVjdCAqZnJhbWluZ0N0eDsKLQotI2VuZGlmIC8qREVDT0RFX0dJRl9PTl9TQVZJTkcqLwotCi0jaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLQotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHggPSAoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNHhWU1NfRnJhbWluZ0NvbnRleHQpLAotICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJDb250ZXh0IG9mIHRoZSBmcmFtaW5nIGVmZmVjdCIpOwotCi0gICAgICAgICAgICAgICAgaWYoIGZyYW1pbmdDdHggPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHhfbGFzdCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+cFNQU0NvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPm91dHB1dFZpZGVvU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZTsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT50b3BsZWZ0X3ggPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRvcGxlZnRfeDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT50b3BsZWZ0X3kgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRvcGxlZnRfeTsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5iRWZmZWN0UmVzaXplID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5iUmVzaXplOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPnBFZmZlY3RGaWxlUGF0aCA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MucEZyYW1pbmdGaWxlUGF0aDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5wRmlsZVJlYWRQdHIgPSB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0cjsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5wRmlsZVdyaXRlUHRyID0geFZTU19jb250ZXh0LT5wRmlsZVdyaXRlUHRyOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmVmZmVjdER1cmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0udWlEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5iX0lzRmlsZUdpZiA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmJfYW5pbWF0ZWQgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0ID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgICAgIC8qIFNhdmUgZnJhbWluZyBzdHJ1Y3R1cmUgYXNzb2NpYXRlZCB3aXRoIGNvcnJlc3BvbmRpbmcgZWZmZWN0ICovCi0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ucEV4dFZpZGVvRWZmZWN0RmN0Q3R4dCA9Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHg7Ci0KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCA9IChNNHhWU1NfRnJhbWluZ1N0cnVjdAotICAgICAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QpLAotICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJDb250ZXh0IG9mIHRoZSBmcmFtaW5nIGVmZmVjdCIpOwotCi0gICAgICAgICAgICAgICAgaWYoIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+dG9wbGVmdF94ID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50b3BsZWZ0X3g7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPnRvcGxlZnRfeSA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudG9wbGVmdF95OwotCi0gICAgICAgICAgICAgICAgLyogQnVnRml4IDEuMi4wOiBMZWFrIHdoZW4gZGVjb2RpbmcgZXJyb3IgKi8KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5wTmV4dCA9IGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4OwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5wQ3VycmVudCA9IGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4OwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5kdXJhdGlvbiA9IDA7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPnByZXZpb3VzQ2xpcFRpbWUgPSAtMTsKLQotICAgICAgICAgICAgICAgIC8qQWxwaGEgYmxlbmRpbmcqLwotICAgICAgICAgICAgICAgIC8qQ2hlY2sgaWYgdGhlIGFscGhhIGJsZW5kaW5nIHBhcmFtZXRlcnMgYXJlIGNvcnJlY3RzKi8KLSAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZUluVGltZSA+IDEwMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlSW5UaW1lID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWUgPiAxMDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWUgPSAwOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdFbmQgPiAxMDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRW5kID0gMTAwOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdNaWRkbGUgPiAxMDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nTWlkZGxlID0gMTAwOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdTdGFydCA+IDEwMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdTdGFydCA9IDEwMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZUluVGltZSA+IDAKLSAgICAgICAgICAgICAgICAgICAgfHwgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgPiAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qQWxsb2NhdGUgdGhlIGFscGhhIGJsZW5kaW5nIHN0cnVjdHVyZSovCi0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00eFZTU19pbnRlcm5hbEVmZmVjdHNBbHBoYUJsZW5kaW5nICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE00eFZTU19pbnRlcm5hbEVmZmVjdHNBbHBoYUJsZW5kaW5nKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopImFscGhhIGJsZW5kaW5nIHN0cnVjdHVyZSIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qRmlsbCB0aGUgYWxwaGEgYmxlbmRpbmcgc3RydWN0dXJlKi8KLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlSW5UaW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVJblRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZU91dFRpbWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZW5kID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0VuZDsKLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9taWRkbGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nTWlkZGxlOwotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0LT5tX3N0YXJ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ1N0YXJ0OwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlSW5UaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICArIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVPdXRUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPiAxMDAgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVPdXRUaW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAgLSBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVJblRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0jZWxzZQotCi0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eCA9IChNNHhWU1NfRnJhbWluZ1N0cnVjdAotICAgICAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QpLAotICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhcgotICAgICAgICAgICAgICAgICAgICAqKSJDb250ZXh0IG9mIHRoZSBmcmFtaW5nIGVmZmVjdCAoZm9yIHRleHQpIik7Ci0KLSAgICAgICAgICAgICAgICBpZiggZnJhbWluZ0N0eCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+dG9wbGVmdF94ID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50b3BsZWZ0X3g7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+dG9wbGVmdF95ID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50b3BsZWZ0X3k7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYiA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgICAgICAvKiBCdWdGaXggMS4yLjA6IExlYWsgd2hlbiBkZWNvZGluZyBlcnJvciAqLwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPnBOZXh0ID0gZnJhbWluZ0N0eDsKLQotI2VuZGlmCi0gICAgICAgICAgICAgICAgLyogU2F2ZSBmcmFtaW5nIHN0cnVjdHVyZSBhc3NvY2lhdGVkIHdpdGggY29ycmVzcG9uZGluZyBlZmZlY3QgKi8KLQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4OwotCi0gICAgICAgICAgICAgICAgLyogRkI6IGNoYW5nZXMgZm9yIFZpZGVvIEFydGlzdDogbWVtY29weSBwVGV4dEJ1ZmZlciBzbyB0aGF0IGl0IGNhbiBiZSBjaGFuZ2VkCi0gICAgICAgICAgICAgICAgYWZ0ZXIgYSBjb21wbGV0ZSBhbmFseXNpcyovCi0gICAgICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBUZXh0QnVmZmVyID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19TZW5kQ29tbWFuZDogcFRleHRCdWZmZXIgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKkNvbnZlcnQgdGV4dCBidWZmZXIgaW50byBjdXN0b21lciBmb3JtYXQgYmVmb3JlIGJlaW5nIHVzZWQqLwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0gcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MucFRleHRCdWZmZXI7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50ZXh0QnVmZmVyU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRleHRCdWZmZXJTaXplOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MucFRleHRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudGV4dEJ1ZmZlclNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEVuZCBvZiB0aGUgVVRGIGNvbnZlcnNpb24sIHVzZSB0aGUgY29udmVydGVkIGZpbGUgcGF0aCovCi0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy5wVGV4dEJ1ZmZlciA9IE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50ZXh0QnVmZmVyU2l6ZSArIDEsCi0gICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopIkxvY2FsIHRleHQgYnVmZmVyIGVmZmVjdCIpOwotCi0gICAgICAgICAgICAgICAgLy94VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBUZXh0QnVmZmVyID0KLSAgICAgICAgICAgICAgICAvLyBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc3RybGVuKHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBUZXh0QnVmZmVyKSsxLAotICAgICAgICAgICAgICAgIC8vIE00VlMsICJMb2NhbCB0ZXh0IGJ1ZmZlciBlZmZlY3QiKTsKLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wVGV4dEJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBUZXh0QnVmZmVyICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdCi0gICAgICAgICAgICAgICAgICAgIC8vLnhWU1MucFRleHRCdWZmZXIsIChNNE9TQV9NZW1BZGRyOClwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wVGV4dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgLy8gc3RybGVuKHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBUZXh0QnVmZmVyKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgRWZmZWN0c1tqXS54VlNTLnBUZXh0QnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwRGVjb2RlZFBhdGgsIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy50ZXh0QnVmZmVyU2l6ZSArIDEpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qQWxsb2NhdGUgdGhlIHRleHQgUkdCIGJ1ZmZlciovCi0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgPQotICAgICAgICAgICAgICAgICAgICAoTTRWSUZJX0ltYWdlUGxhbmUgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwKLSAgICAgICAgICAgICAgICAgICAgTTRWUywKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiUkdCIHN0cnVjdHVyZSBmb3IgdGhlIHRleHQgZWZmZWN0Iik7Ci0KLSAgICAgICAgICAgICAgICBpZiggZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpVGV4dEJ1ZmZlcldpZHRoCi0gICAgICAgICAgICAgICAgICAgID09IDAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MudWlUZXh0QnVmZmVySGVpZ2h0ID09IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiB0ZXh0IHBsYW5lIHdpZHRoIGFuZCBoZWlnaHQgYXJlIG5vdCBkZWZpbmVkIik7Ci0gICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIEFsbG9jYXRlIGlucHV0IFJHQiB0ZXh0IGJ1ZmZlciBhbmQgZm9yY2UgaXQgdG8gZXZlbiBzaXplIHRvIGF2b2lkIGVycm9ycyBpbgotICAgICAgICAgICAgICAgICBZVVYgY29udmVyc2lvbiAqLwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MudWlUZXh0QnVmZmVyV2lkdGggJiB+MTsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy51aVRleHRCdWZmZXJIZWlnaHQgJiB+MTsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9zdHJpZGUgPQotICAgICAgICAgICAgICAgICAgICAyICogZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnBhY19kYXRhID0KLSAgICAgICAgICAgICAgICAgICAgKE00VklGSV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICogZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJUZXh0IFJHQiBwbGFuZS0+cGFjX2RhdGEiKTsKLQotICAgICAgICAgICAgICAgIGlmKCBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+cGFjX2RhdGEKLSAgICAgICAgICAgICAgICAgICAgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLQotI2lmZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi0gICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgIC8qIENhbGwgdGV4dCByZW5kZXJpbmcgZnVuY3Rpb24gKi8KLQotICAgICAgICAgICAgICAgIGVyciA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBUZXh0UmVuZGVyaW5nRmN0KAotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBSZW5kZXJpbmdEYXRhLAotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy5wVGV4dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MudGV4dEJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICYoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IpKTsKLQotICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiVGV4dCByZW5kZXJpbmcgZXh0ZXJuYWwgZnVuY3Rpb24gZmFpbGVkXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogQ2hlY2sgdGhhdCBSR0IgYnVmZmVyIGlzIHNldCAqLwotICAgICAgICAgICAgICAgIGlmKCBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYiA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIlRleHQgcmVuZGVyaW5nIGZ1bmN0aW9uIGRpZCBub3Qgc2V0IFJHQiBidWZmZXIgY29ycmVjdGx5ICEiKTsKLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogQ29udmVydCBSR0IgcGxhbmUgdG8gWVVWNDIwIGFuZCB1cGRhdGUgZnJhbWluZyBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVYoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgpOwotCi0gICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19zZW5kQ29tbWFuZDogZXJyb3Igd2hlbiBjb252ZXJ0aW5nIFJHQiB0byBZVVY6IDB3JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0jZWxzZQotICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAvKiBDYWxsIHRleHQgcmVuZGVyaW5nIGZ1bmN0aW9uICovCi0KLSAgICAgICAgICAgICAgICBlcnIgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wVGV4dFJlbmRlcmluZ0ZjdCgKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wUmVuZGVyaW5nRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MucFRleHRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgRWZmZWN0c1tqXS54VlNTLnRleHRCdWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAmKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IpKTsKLQotICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiVGV4dCByZW5kZXJpbmcgZXh0ZXJuYWwgZnVuY3Rpb24gZmFpbGVkXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogQ2hlY2sgdGhhdCBSR0IgYnVmZmVyIGlzIHNldCAqLwotICAgICAgICAgICAgICAgIGlmKCBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiVGV4dCByZW5kZXJpbmcgZnVuY3Rpb24gZGlkIG5vdCBzZXQgUkdCIGJ1ZmZlciBjb3JyZWN0bHkgISIpOwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBDb252ZXJ0IFJHQiBwbGFuZSB0byBZVVY0MjAgYW5kIHVwZGF0ZSBmcmFtaW5nIHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVVihmcmFtaW5nQ3R4KTsKLQotICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1Nfc2VuZENvbW1hbmQ6IGVycm9yIHdoZW4gY29udmVydGluZyBSR0IgdG8gWVVWOiAwdyV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotI2VuZGlmIC8qREVDT0RFX0dJRl9PTl9TQVZJTkcqLwotCi0gICAgICAgICAgICAgICAgLyogQ2hhbmdlIGludGVybmFsbHkgZWZmZWN0IHR5cGUgZnJvbSAidGV4dCIgdG8gZnJhbWluZyAqLwotCi0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlID0KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRnJhbWluZzsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLmJSZXNpemUgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00eFZTU19zZW5kQ29tbWFuZDogTm8gdGV4dCByZW5kZXJpbmcgZnVuY3Rpb24gc2V0ICEhIik7Ci0gICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgdG8gc3RvcmUgdGhlIGRhdGEgbmVlZGVkIGJ5IHRoZSBGaWZ0aWVzIGVmZmVjdCAqLwotICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUKLSAgICAgICAgICAgID09IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZpZnRpZXMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNHhWU1NfRmlmdGllc1N0cnVjdCAqZmlmdGllc0N0eDsKLQotICAgICAgICAgICAgLyogQ2hlY2sgdGhlIGV4cGVjdGVkIGZyYW1lIHJhdGUgZm9yIHRoZSBmaWZ0aWVzIGVmZmVjdCAobXVzdCBiZSBhYm92ZSAwKSAqLwotICAgICAgICAgICAgaWYoIDAgPT0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy51aUZpZnRpZXNPdXRGcmFtZVJhdGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiVGhlIGZyYW1lIHJhdGUgZm9yIHRoZSBmaWZ0aWVzIGVmZmVjdCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwICEiKTsKLSAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaWZ0aWVzQ3R4ID0gKE00eFZTU19GaWZ0aWVzU3RydWN0Ci0gICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19GaWZ0aWVzU3RydWN0KSwKLSAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJDb250ZXh0IG9mIHRoZSBmaWZ0aWVzIGVmZmVjdCIpOwotCi0gICAgICAgICAgICBpZiggZmlmdGllc0N0eCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmlmdGllc0N0eC0+cHJldmlvdXNDbGlwVGltZSA9IC0xOwotICAgICAgICAgICAgZmlmdGllc0N0eC0+ZmlmdGllc0VmZmVjdER1cmF0aW9uID0gMTAwMCAvIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MudWlGaWZ0aWVzT3V0RnJhbWVSYXRlOwotICAgICAgICAgICAgZmlmdGllc0N0eC0+c2hpZnRSYW5kb21WYWx1ZSA9IDA7Ci0gICAgICAgICAgICBmaWZ0aWVzQ3R4LT5zdHJpcGVSYW5kb21WYWx1ZSA9IDA7Ci0KLSAgICAgICAgICAgIC8qIFNhdmUgdGhlIHN0cnVjdHVyZSBhc3NvY2lhdGVkIHdpdGggY29ycmVzcG9uZGluZyBlZmZlY3QgKi8KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgIGZpZnRpZXNDdHg7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIHRvIHN0b3JlIHRoZSBkYXRhIG5lZWRlZCBieSB0aGUgQ29sb3IgZWZmZWN0ICovCi0gICAgICAgIGVsc2UgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQ29sb3JSR0IxNgotICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICA9PSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9CbGFja0FuZFdoaXRlCi0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUKLSAgICAgICAgICAgID09IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1BpbmsKLSAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JlZW4KLSAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfU2VwaWEKLSAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfTmVnYXRpdmUKLSAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JhZGllbnQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNHhWU1NfQ29sb3JTdHJ1Y3QgKkNvbG9yQ3R4OwotCi0gICAgICAgICAgICBDb2xvckN0eCA9Ci0gICAgICAgICAgICAgICAgKE00eFZTU19Db2xvclN0cnVjdCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX0NvbG9yU3RydWN0KSwKLSAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJDb250ZXh0IG9mIHRoZSBjb2xvciBlZmZlY3QiKTsKLQotICAgICAgICAgICAgaWYoIENvbG9yQ3R4ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDb2xvckN0eC0+Y29sb3JFZmZlY3RUeXBlID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGU7Ci0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUKLSAgICAgICAgICAgICAgICA9PSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9Db2xvclJHQjE2Ci0gICAgICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICAgICAgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JhZGllbnQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbG9yQ3R4LT5yZ2IxNkNvbG9yRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlSZ2IxNklucHV0Q29sb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29sb3JDdHgtPnJnYjE2Q29sb3JEYXRhID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogU2F2ZSB0aGUgc3RydWN0dXJlIGFzc29jaWF0ZWQgd2l0aCBjb3JyZXNwb25kaW5nIGVmZmVjdCAqLwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ucEV4dFZpZGVvRWZmZWN0RmN0Q3R4dCA9Ci0gICAgICAgICAgICAgICAgQ29sb3JDdHg7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIEJhY2tncm91bmQgbXVzaWMgcmVnaXN0ZXJpbmcKLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIGlmKCBwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwgJiYgaXNOZXdCR00gPT0gTTRPU0FfVFJVRSApCi0gICAgewotI2lmZGVmIFBSRVZJRVdfRU5BQkxFRAotCi0gICAgICAgIE00eFZTU19NQ1NfcGFyYW1zICpwUGFyYW1zOwotICAgICAgICBNNE9TQV9DaGFyICpvdXRfcGNtOwotICAgICAgICAvKlVURiBjb252ZXJzaW9uIHN1cHBvcnQqLwotICAgICAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotCi0jZW5kaWYKLQotICAgICAgICAvKiBXZSBzYXZlIG91dHB1dCBmaWxlIHBvaW50ZXIsIGJlY2F1c2Ugd2Ugd2lsbCBuZWVkIHRvIHVzZSBpdCB3aGVuIHNhdmluZyBhdWRpbyBtaXhlZAotICAgICAgICAgZmlsZSAobGFzdCBzYXZlIHN0ZXApICovCi0KLSAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wVGVtcG9yYXJ5RmlsZSA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZTsKLQotICAgICAgICAvKiBJZiBhIHByZXZpb3VzIEJHTSBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQsIGRlbGV0ZSBpdCAqLwotICAgICAgICAvKiBIZXJlIGNhbiBiZSBpbXBsZW1lbnRlZCB0ZXN0IHRvIGtub3cgaWYgdGhlIHNhbWUgQkdNIGlzIHJlZ2lzdGVyZWQgKi8KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPgotICAgICAgICAgICAgICAgICAgICBwRmlsZSk7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQWxsb2NhdGUgQkdNICovCi0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayA9Ci0gICAgICAgICAgICAoTTR4VlNTX0JHTVNldHRpbmdzICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNHhWU1NfQkdNU2V0dGluZ3MpLCBNNFZTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikieFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrIik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENvcHkgaW5wdXQgc3RydWN0dXJlIHRvIG91ciBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgbWVtY3B5KCh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLAotICAgICAgICAgICAgKHZvaWQgKilwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLAotICAgICAgICAgICAgc2l6ZW9mKE00eFZTU19CR01TZXR0aW5ncykpOwotICAgICAgICAvKiBBbGxvY2F0ZSBmaWxlIG5hbWUsIGFuZCBjb3B5IGZpbGUgbmFtZSBidWZmZXIgdG8gb3VyIHN0cnVjdHVyZSAqLwotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlID0KLSAgICAgICAgICAgIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygoc3RybGVuKHBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlKQotICAgICAgICAgICAgKyAxKSwgTTRWUywgKE00T1NBX0NoYXIgKikieFZTUyBCR00gZmlsZSBwYXRoIik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgbWVtY3B5KCh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSwKLSAgICAgICAgICAgICh2b2lkICopcFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUsCi0gICAgICAgICAgICBzdHJsZW4ocFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUpICsgMSk7Ci0KLSNpZmRlZiBQUkVWSUVXX0VOQUJMRUQKLSAgICAgICAgLyogRGVjb2RlIEJHTSB0cmFjayB0byBwY20gb3V0cHV0IGZpbGUgKi8KLQotICAgICAgICBwUGFyYW1zID0KLSAgICAgICAgICAgIChNNHhWU1NfTUNTX3BhcmFtcyAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX01DU19wYXJhbXMpLCBNNFZTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiRWxlbWVudCBvZiBNQ1MgUGFyYW1zIChmb3IgQkdNKSIpOwotCi0gICAgICAgIGlmKCBwUGFyYW1zID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNHhWU1Nfc2VuZENvbW1hbmQ6IFByb2JsZW0gd2hlbiBhbGxvY2F0aW5nIG9uZSBlbGVtZW50IE1DUyBQYXJhbXMiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEluaXRpYWxpemUgdGhlIHBvaW50ZXJzIGluIGNhc2Ugb2YgcHJvYmxlbSAoUFIgMjI3MykgKi8KLSAgICAgICAgcFBhcmFtcy0+cEZpbGVJbiA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBQYXJhbXMtPnBGaWxlT3V0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcFBhcmFtcy0+cEZpbGVUZW1wID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcFBhcmFtcy0+cE5leHQgPSBNNE9TQV9OVUxMOwotICAgICAgICBwUGFyYW1zLT5CZWdpbkN1dFRpbWUgPSAwOwotICAgICAgICBwUGFyYW1zLT5FbmRDdXRUaW1lID0gMDsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdAotICAgICAgICAgICAgPT0gTTRPU0FfTlVMTCApIC8qIE1lYW5zIGl0IGlzIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBsaXN0ICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIHhWU1MgY29udGV4dCB3aXRoIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBsaXN0ICovCi0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0ID0gcFBhcmFtczsKLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTTR4VlNTX01DU19wYXJhbXMgKnBQYXJhbXNfdGVtcCA9IHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3Q7Ci0gICAgICAgICAgICBNNHhWU1NfTUNTX3BhcmFtcyAqcFBhcmFtc19wcmV2ID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgLyogUGFyc2UgTUNTIHBhcmFtcyBjaGFpbmVkIGxpc3QgdG8gZmluZCBhbmQgZGVsZXRlIEJHTSBlbGVtZW50ICovCi0gICAgICAgICAgICB3aGlsZSggcFBhcmFtc190ZW1wICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zX3RlbXAtPmlzQkdNID09IE00T1NBX1RSVUUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogUmVtb3ZlIHRoaXMgZWxlbWVudCAqLwotICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtc190ZW1wLT5wRmlsZUluICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXNfdGVtcC0+cEZpbGVJbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3RlbXAtPnBGaWxlSW4gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXNfdGVtcC0+cEZpbGVPdXQgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlbW92ZSBQQ00gdGVtcG9yYXJ5IGZpbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZSgoY29uc3QgY2hhciAqKXBQYXJhbXNfdGVtcC0+cEZpbGVPdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zX3RlbXAtPnBGaWxlT3V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfdGVtcC0+cEZpbGVPdXQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIENoYWluIHByZXZpb3VzIGVsZW1lbnQgd2l0aCBuZXh0IGVsZW1lbnQgPSByZW1vdmUgQkdNIGNoYWluZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0IGVsZW1lbnQgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXNfcHJldiAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc19wcmV2LT5wTmV4dCA9IHBQYXJhbXNfdGVtcC0+cE5leHQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogSWYgY3VycmVudCBwb2ludGVyIGlzIHRoZSBmaXJzdCBvZiB0aGUgY2hhaW5lZCBsaXN0IGFuZCBuZXh0IHBvaW50ZXIgb2YKLSAgICAgICAgICAgICAgICAgICAgdGhlIGNoYWluZWQgbGlzdCBpcyBOVUxMICovCi0gICAgICAgICAgICAgICAgICAgIC8qIGl0IG1lYW5zIHRoYXQgdGhlcmUgd2FzIG9ubHkgb25lIGVsZW1lbnQgaW4gdGhlIGxpc3QgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogPT4gd2UgcHV0IHRoZSBjb250ZXh0IHZhcmlhYmxlIHRvIE5VTEwgdG8gcmVhZmZlY3QgdGhlIGZpcnN0IGNoYWluZWQgbGlzdAotICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCAqLwotICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtc190ZW1wID09IHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHBQYXJhbXNfdGVtcC0+cE5leHQgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIEluIHRoYXQgY2FzZSwgQkdNIHBvaW50ZXIgaXMgdGhlIGZpcnN0IG9uZSwgYnV0IHRoZXJlIGFyZSBvdGhlcnMgZWxlbWVudHMKLSAgICAgICAgICAgICAgICAgICAgIGFmdGVyIGl0ICovCi0gICAgICAgICAgICAgICAgICAgIC8qIFNvLCB3ZSBuZWVkIHRvIGNoYW5nZSBmaXJzdCBjaGFpbmVkIGxpc3QgZWxlbWVudCAqLwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBwUGFyYW1zX3RlbXAtPnBOZXh0ICE9IE00T1NBX05VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHBQYXJhbXNfcHJldiA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdCA9IHBQYXJhbXNfdGVtcC0+cE5leHQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtc190ZW1wLT5wTmV4dCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc19wcmV2ID0gcFBhcmFtc190ZW1wLT5wTmV4dDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtc190ZW1wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfdGVtcCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3RlbXAgPSBwUGFyYW1zX3ByZXY7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXNfdGVtcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3RlbXAgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfcHJldiA9IHBQYXJhbXNfdGVtcDsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtc190ZW1wID0gcFBhcmFtc190ZW1wLT5wTmV4dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBXZSBuZWVkIHRvIGluaXRpYWxpemUgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgY2hhaW5lZCBsaXN0IHRvIGJlIGFibGUgdG8gYWRkIG5ldwotICAgICAgICAgICAgIEJHTSBlbGVtZW50ICovCi0gICAgICAgICAgICBwTUNTX2xhc3QgPSBwUGFyYW1zX3ByZXY7Ci0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIEluIHRoYXQgY2FzZSwgaXQgbWVhbnMgdGhhdCB0aGVyZSB3YXMgb25seSBvbmUgZWxlbWVudCBpbiB0aGUgY2hhaW5lZCBsaXN0ICovCi0gICAgICAgICAgICAgICAgLyogU28sIHdlIG5lZWQgdG8gc2F2ZSB0aGUgbmV3IHBhcmFtcyovCi0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdCA9IHBQYXJhbXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogVXBkYXRlIG5leHQgcG9pbnRlciBvZiB0aGUgcHJldmlvdXMgbGFzdCBlbGVtZW50IG9mIHRoZSBjaGFpbiAqLwotICAgICAgICAgICAgICAgIHBNQ1NfbGFzdC0+cE5leHQgPSBwUGFyYW1zOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICAvKiBGaWxsIHRoZSBsYXN0IE00eFZTU19NQ1NfcGFyYW1zIGVsZW1lbnQgKi8KLSAgICAgICAgcFBhcmFtcy0+SW5wdXRGaWxlVHlwZSA9Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPkZpbGVUeXBlOwotICAgICAgICBwUGFyYW1zLT5PdXRwdXRGaWxlVHlwZSA9IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9QQ007Ci0gICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0ID0gTTRWSURFT0VESVRJTkdfa05vbmVWaWRlbzsKLSAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUgPSBNNFZJREVPRURJVElOR19rUUNJRjsKLSAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVJhdGUgPSBNNFZJREVPRURJVElOR19rMTVfRlBTOwotCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdAotICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0FBQyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvRm9ybWF0ID0gTTRWSURFT0VESVRJTkdfa0FBQzsKLSAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvU2FtcGxpbmdGcmVxdWVuY3kgPSBNNFZJREVPRURJVElOR19rRGVmYXVsdF9BU0Y7Ci0KLSAgICAgICAgICAgIC8qRkI6IFZBTCBDUiBQNE1FMDAwMDMwNzYKLSAgICAgICAgICAgIFRoZSBvdXRwdXQgYXVkaW8gYml0cmF0ZSBpbiB0aGUgQUFDIGNhc2UgaXMgbm93IGRpcmVjdGx5IGdpdmVuIGJ5IHRoZSB1c2VyKi8KLSAgICAgICAgICAgIC8qQ2hlY2sgaWYgdGhlIGF1ZGlvIGJpdHJhdGUgaXMgY29ycmVjdGx5IGRlZmluZWQqLwotICAgICAgICAgICAgLypNb25vCi0gICAgICAgICAgICBNQ1MgdmFsdWVzIGZvciBBQUMgTW9ubyBhcmUgbWluOiAxNmticHMgYW5kIG1heDogMTkyIGticHMqLwotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvQml0cmF0ZQotICAgICAgICAgICAgICAgID49IE00VklERU9FRElUSU5HX2sxNl9LQlBTCi0gICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgPD0gTTRWSURFT0VESVRJTkdfazE5Ml9LQlBTCi0gICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubyA9PSBNNE9TQV9UUlVFICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0JpdHJhdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKlN0ZXJlbwotICAgICAgICAgICAgTUNTIHZhbHVlcyBmb3IgQUFDIE1vbm8gYXJlIG1pbjogMzJrYnBzIGFuZCBtYXg6IDE5MiBrYnBzKi8KLSAgICAgICAgICAgIGVsc2UgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvQml0cmF0ZQotICAgICAgICAgICAgICAgID49IE00VklERU9FRElUSU5HX2szMl9LQlBTCi0gICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgPD0gTTRWSURFT0VESVRJTkdfazE5Ml9LQlBTCi0gICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubyA9PSBNNE9TQV9GQUxTRSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9CaXRyYXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IE00VklERU9FRElUSU5HX2szMl9LQlBTOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFBhcmFtcy0+YkF1ZGlvTW9ubyA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm87Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdCA9IE00VklERU9FRElUSU5HX2tBTVJfTkI7Ci0gICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb1NhbXBsaW5nRnJlcXVlbmN5ID0gTTRWSURFT0VESVRJTkdfa0RlZmF1bHRfQVNGOwotICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0gTTRWSURFT0VESVRJTkdfazEyXzJfS0JQUzsKLSAgICAgICAgICAgIHBQYXJhbXMtPmJBdWRpb01vbm8gPSBNNE9TQV9UUlVFOwotICAgICAgICB9Ci0gICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9IE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlOwotCi0gICAgICAgIC8qIFByZXBhcmUgb3V0cHV0IGZpbGVuYW1lICovCi0gICAgICAgIC8qIDIxIGlzIHRoZSBzaXplIG9mICJwcmV2aWV3XzE2MDAwXzIucGNtIiArIFwwICovCi0gICAgICAgIG91dF9wY20gPQotICAgICAgICAgICAgKE00T1NBX0NoYXIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc3RybGVuKHhWU1NfY29udGV4dC0+cFRlbXBQYXRoKQotICAgICAgICAgICAgKyAyMSwgTTRWUywgKE00T1NBX0NoYXIgKikiVGVtcCBjaGFyKiBmb3IgcGNtUHJldmlld0ZpbGUiKTsKLQotICAgICAgICBpZiggb3V0X3BjbSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfSW5pdCIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ29weSB0ZW1wb3JhcnkgcGF0aCB0byBmaW5hbCBwcmV2aWV3IHBhdGggc3RyaW5nICovCi0gICAgICAgIE00T1NBX2Nock5Db3B5KG91dF9wY20sIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoLAotICAgICAgICAgICAgc3RybGVuKHhWU1NfY29udGV4dC0+cFRlbXBQYXRoKSArIDEpOwotCi0gICAgICAgIC8qIERlcGVuZGluZyBvZiB0aGUgb3V0cHV0IHNhbXBsZSBmcmVxdWVuY3kgYW5kIG5iIG9mIGNoYW5uZWxzLCB3ZSBjb25zdHJ1Y3QgcHJldmlldwotICAgICAgICBvdXRwdXQgZmlsZW5hbWUgKi8KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rQUFDICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogQ29uc3RydWN0IG91dHB1dCB0ZW1wb3JhcnkgUENNIGZpbGVuYW1lICovCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubyA9PSBNNE9TQV9UUlVFICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdHJuY2F0KChjaGFyICopb3V0X3BjbSwgKGNvbnN0IGNoYXIgKikicHJldmlld18xNjAwMF8xLnBjbVwwIiwKLSAgICAgICAgICAgICAgICAgICAgMjApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cm5jYXQoKGNoYXIgKilvdXRfcGNtLCAoY29uc3QgY2hhciAqKSJwcmV2aWV3XzE2MDAwXzIucGNtXDAiLAotICAgICAgICAgICAgICAgICAgICAyMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tBTVJfTkIgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDb25zdHJ1Y3Qgb3V0cHV0IHRlbXBvcmFyeSBQQ00gZmlsZW5hbWUgKi8KLSAgICAgICAgICAgIHN0cm5jYXQoKGNoYXIgKilvdXRfcGNtLCAoY29uc3QgY2hhciAqKSJwcmV2aWV3XzA4MDAwXzEucGNtXDAiLCAyMCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggb3V0X3BjbSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKG91dF9wY20pOwotICAgICAgICAgICAgICAgIG91dF9wY20gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQmFkIGF1ZGlvIG91dHB1dCBmb3JtYXQgXG4iKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgIH0KLQotICAgICAgICB4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlID0gb3V0X3BjbTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgcERlY29kZWRQYXRoID0gb3V0X3BjbTsKLSAgICAgICAgbGVuZ3RoID0gc3RybGVuKHBEZWNvZGVkUGF0aCk7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilvdXRfcGNtLCAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TZW5kQ29tbWFuZDogTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4IHJldHVybnMgZXJyOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhsZW5ndGggKyAxLCBNNFZTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikicGNtUHJldmlld0ZpbGUiKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICBmcmVlKG91dF9wY20pOwotICAgICAgICAgICAgb3V0X3BjbSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXhWU1NfY29udGV4dC0+cGNtUHJldmlld0ZpbGUsICh2b2lkICopcERlY29kZWRQYXRoLCBsZW5ndGggKyAxKTsKLQotICAgICAgICAvKiBGcmVlIHRlbXBvcmFyeSBvdXRwdXQgZmlsZW5hbWUgKi8KLSAgICAgICAgaWYoIG91dF9wY20gIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUob3V0X3BjbSk7Ci0gICAgICAgICAgICBvdXRfcGNtID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIHBQYXJhbXMtPnBGaWxlT3V0ID0gTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKChsZW5ndGggKyAxKSwgTTRWUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk1DUyBCR00gUGFyYW1zOiBmaWxlIG91dCIpOwotCi0gICAgICAgIGlmKCBwUGFyYW1zLT5wRmlsZU91dCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBwUGFyYW1zLT5wRmlsZVRlbXAgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIG1lbWNweSgodm9pZCAqKXBQYXJhbXMtPnBGaWxlT3V0LCh2b2lkICopIHhWU1NfY29udGV4dC0+cGNtUHJldmlld0ZpbGUsCi0gICAgICAgICAgICAobGVuZ3RoICsgMSkpOyAvKiBDb3B5IG91dHB1dCBmaWxlIHBhdGggKi8KLQotICAgICAgICAvKioKLSAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLQotICAgICAgICBwRGVjb2RlZFBhdGggPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlOwotICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0ICE9IE00T1NBX05VTEwKLSAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+Ci0gICAgICAgICAgICAgICAgcEZpbGUsIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsICZsZW5ndGgpOwotCi0gICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICBwUGFyYW1zLT5wRmlsZUluID0gKE00T1NBX1ZvaWQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKGxlbmd0aCArIDEpLCBNNFZTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTUNTIEJHTSBQYXJhbXM6IGZpbGUgaW4iKTsKLQotICAgICAgICBpZiggcFBhcmFtcy0+cEZpbGVJbiA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkoKHZvaWQgKilwUGFyYW1zLT5wRmlsZUluLCAodm9pZCAqKXBEZWNvZGVkUGF0aCwKLSAgICAgICAgICAgIChsZW5ndGggKyAxKSk7IC8qIENvcHkgaW5wdXQgZmlsZSBwYXRoICovCi0KLSAgICAgICAgcFBhcmFtcy0+aXNCR00gPSBNNE9TQV9UUlVFOwotICAgICAgICBwUGFyYW1zLT5pc0NyZWF0ZWQgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5uYlN0ZXBUb3RhbCsrOwotICAgICAgICBiSXNUcmFuc2NvZGluZyA9IE00T1NBX1RSVUU7Ci0jZW5kaWYgLyogUFJFVklFV19FTkFCTEVEICovCi0KLSAgICB9Ci0gICAgZWxzZSBpZiggcFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMCi0gICAgICAgICYmIGlzTmV3QkdNID09IE00T1NBX0ZBTFNFICkKLSAgICB7Ci0jaWZkZWYgUFJFVklFV19FTkFCTEVECi0gICAgICAgIC8qIEJHTSBpcyB0aGUgc2FtZSBhcyBwcmV2aW91c2x5LCBubyBuZWVkIHRvIHJlZGVjb2RlIGF1ZGlvICovCi0gICAgICAgIC8qIE5lZWQgdG8gdXBkYXRlIE1DUyBwYXJhbXMgY2hhaW5lZCBsaXN0LCB0byBzaWduYWwgTTR4VlNTX3N0ZXAgZnVuY3Rpb24gdG8gc2tpcAotICAgICAgICBCR00gZGVjb2RpbmcgKi8KLQotICAgICAgICBNNHhWU1NfTUNTX3BhcmFtcyAqcFBhcmFtc190ZW1wID0geFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdDsKLSAgICAgICAgTTR4VlNTX01DU19wYXJhbXMgKnBQYXJhbXNfcHJldiA9IE00T1NBX05VTEw7Ci0KLSNlbmRpZiAvKiBQUkVWSUVXX0VOQUJMRUQgKi8KLSAgICAgICAgLyogV2Ugc2F2ZSBvdXRwdXQgZmlsZSBwb2ludGVyLCBiZWNhdXNlIHdlIHdpbGwgbmVlZCB0byB1c2UgaXQgd2hlbiBzYXZpbmcgYXVkaW8KLSAgICAgICAgIG1peGVkIGZpbGUgKGxhc3Qgc2F2ZSBzdGVwKSAqLwotCi0gICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGU7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFRlbXBvcmFyeUZpbGUgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGU7Ci0KLSAgICAgICAgLyogUmUtd3JpdGUgQkdNIHNldHRpbmdzIGluIGNhc2UgdGhleSBoYXZlIGNoYW5nZWQgYmV0d2VlbiB0d28gc2VuZENvbW1hbmQgKi8KLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUFkZEN0cyA9Ci0gICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUFkZEN0czsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUFkZFZvbHVtZSA9Ci0gICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUFkZFZvbHVtZTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUJlZ2luTG9vcCA9Ci0gICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUJlZ2luTG9vcDsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUVuZExvb3AgPQotICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlFbmRMb29wOwotCi0jaWZkZWYgUFJFVklFV19FTkFCTEVECi0gICAgICAgIC8qIFBhcnNlIE1DUyBwYXJhbXMgY2hhaW5lZCBsaXN0IHRvIGZpbmQgYW5kIGRlbGV0ZSBCR00gZWxlbWVudCAqLwotCi0gICAgICAgIHdoaWxlKCBwUGFyYW1zX3RlbXAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBwUGFyYW1zX3RlbXAtPmlzQkdNID09IE00T1NBX1RSVUUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBQYXJhbXNfdGVtcC0+aXNDcmVhdGVkID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBQYXJhbXNfcHJldiA9IHBQYXJhbXNfdGVtcDsKLSAgICAgICAgICAgIHBQYXJhbXNfdGVtcCA9IHBQYXJhbXNfdGVtcC0+cE5leHQ7Ci0gICAgICAgIH0KLQotI2VuZGlmIC8qIFBSRVZJRVdfRU5BQkxFRCAqLwotCi0gICAgICAgIE00T1NBX1RSQUNFMl8wKCJNNHhWU1NfU2VuZENvbW1hbmQgaGFzIGJlZW4gcmVjYWxsZWQsIEJHTSBpcyB0aGUgc2FtZSIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTm8gQkdNIGluIHRoaXMgeFZTUyBjb21tYW5kIik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotI2lmZGVmIFBSRVZJRVdfRU5BQkxFRAotICAgICAgICAgICAgLyogTmVlZCB0byByZW1vdmUgTUNTIHByZXZpb3VzIHBhcmFtcyBjaGFpbmVkIGxpc3QgKi8KLQotICAgICAgICAgICAgTTR4VlNTX01DU19wYXJhbXMgKnBQYXJhbXNfdGVtcCA9IHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3Q7Ci0gICAgICAgICAgICBNNHhWU1NfTUNTX3BhcmFtcyAqcFBhcmFtc19wcmV2ID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgLyogUGFyc2UgTUNTIHBhcmFtcyBjaGFpbmVkIGxpc3QgdG8gZmluZCBhbmQgZGVsZXRlIEJHTSBlbGVtZW50ICovCi0gICAgICAgICAgICB3aGlsZSggcFBhcmFtc190ZW1wICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zX3RlbXAtPmlzQkdNID09IE00T1NBX1RSVUUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogUmVtb3ZlIHRoaXMgZWxlbWVudCAqLwotICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtc190ZW1wLT5wRmlsZUluICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXNfdGVtcC0+cEZpbGVJbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3RlbXAtPnBGaWxlSW4gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXNfdGVtcC0+cEZpbGVPdXQgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtc190ZW1wLT5wRmlsZU91dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3RlbXAtPnBGaWxlT3V0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvKiBDaGFpbiBwcmV2aW91cyBlbGVtZW50IHdpdGggbmV4dCBlbGVtZW50ICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zX3ByZXYgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfcHJldi0+cE5leHQgPSBwUGFyYW1zX3RlbXAtPnBOZXh0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIElmIGN1cnJlbnQgcG9pbnRlciBpcyB0aGUgZmlyc3Qgb2YgdGhlIGNoYWluZWQgbGlzdCBhbmQgbmV4dCBwb2ludGVyCi0gICAgICAgICAgICAgICAgICAgICBvZiB0aGUgY2hhaW5lZCBsaXN0IGlzIE5VTEwgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogaXQgbWVhbnMgdGhhdCB0aGVyZSB3YXMgb25seSBvbmUgZWxlbWVudCBpbiB0aGUgbGlzdCAqLwotICAgICAgICAgICAgICAgICAgICAvKiA9PiB3ZSBwdXQgdGhlIGNvbnRleHQgdmFyaWFibGUgdG8gTlVMTCAqLwotICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtc190ZW1wID09IHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHBQYXJhbXNfdGVtcC0+cE5leHQgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtc190ZW1wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIEluIHRoYXQgY2FzZSwgQkdNIHBvaW50ZXIgaXMgdGhlIGZpcnN0IG9uZSwgYnV0IHRoZXJlIGFyZSBvdGhlcnMKLSAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzIGFmdGVyIGl0ICovCi0gICAgICAgICAgICAgICAgICAgIC8qIFNvLCB3ZSBuZWVkIHRvIGNoYW5nZSBmaXJzdCBjaGFpbmVkIGxpc3QgZWxlbWVudCAqLwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBwUGFyYW1zX3RlbXAtPnBOZXh0ICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0ID0gcFBhcmFtc190ZW1wLT5wTmV4dDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtc190ZW1wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfdGVtcCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogSW4gYWxsIG90aGVyIGNhc2VzLCBub3RoaW5nIGVsc2UgdG8gZG8gZXhjZXB0IGZyZWVpbmcgdGhlIGNoYWluZWQKLSAgICAgICAgICAgICAgICAgICAgbGlzdCBlbGVtZW50ICovCi0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zX3RlbXApOwotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc190ZW1wID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcFBhcmFtc19wcmV2ID0gcFBhcmFtc190ZW1wOwotICAgICAgICAgICAgICAgIHBQYXJhbXNfdGVtcCA9IHBQYXJhbXNfdGVtcC0+cE5leHQ7Ci0gICAgICAgICAgICB9Ci0KLSNlbmRpZiAvKiBQUkVWSUVXX0VOQUJMRUQgKi8KLSAgICAgICAgICAgIC8qIEhlcmUsIHdlIHVuYWxsb2NhdGUgYWxsIEJHTSBjb21wb25lbnRzIGFuZCBwdXQgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgeFZTUy5wQkdNdHJhY2sgdG8gTlVMTCAqLwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlCi0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQ2hhbmdlZCB0byBiZSBhYmxlIHRvIG1peCB3aXRoIHZpZGVvIG9ubHkgZmlsZXMgLT4gaW4gY2FzZSBubyBtYXN0ZXIgY2xpcCBpcyBmb3VuZAotICAgIChpLmUgb25seSBKUEcgaW5wdXQgb3IgdmlkZW8gb25seSBpbnB1dCkgKi8KLSAgICAvKiBhbmQgaWYgdGhlcmUgaXMgYSBCR00sIHdlIGZvcmNlIHRoZSBhZGRlZCB2b2x1bWUgdG8gMTAwIChpLmUgcmVwbGFjZSBhdWRpbykgKi8KLQotICAgIGlmKCBtYXN0ZXJDbGlwID09IC0xCi0gICAgICAgICYmIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIC8qIEluIHRoYXQgY2FzZSwgaXQgbWVhbnMgdGhhdCBubyBpbnB1dCAzR1AgZmlsZSBoYXMgYSB2aWRlbyB0cmFjay4KLSAgICAgICAgVGhlcmVmb3JlLCBpZiBhIG1peGluZyBpcyBhc2tlZCwgaXQgd2lsbCBmYWlsLiBUaHVzLCB3ZSBmb3JjZSByZXBsYWNlIGF1ZGlvLiAqLwotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnVpQWRkVm9sdW1lID0gMTAwOwotICAgIH0KLQotICAgIC8qIFNhdmUgY2xpcCBudW1iZXIgdG8ga25vdyBpZiBhIE00eFZTU19zZW5kQ29tbWFuZCBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCAqLwotICAgIHhWU1NfY29udGV4dC0+cHJldmlvdXNDbGlwTnVtYmVyID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlcjsKLQotICAgIC8qIENoYW5nZSBzdGF0ZSAqLwotICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSA9IE00eFZTU19rU3RhdGVBbmFseXppbmc7Ci0KLSAgICAvKiBJbiBjYXNlIG9mIE1NUyB1c2UgY2FzZSwgd2UgY29tcHV0ZSBoZXJlIHRoZSBtYXggdmlkZW8gYml0cmF0ZSAqLwotICAgIC8qIEluIGNhc2Ugb2YgdG9vIGxvdyBiaXRyYXRlLCBhIHNwZWNpZmljIHdhcm5pbmcgaXMgcmV0dXJuZWQgKi8KLSAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0RmlsZVNpemUgIT0gMCAmJiB0b3RhbER1cmF0aW9uID4gMCApCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgdGFyZ2V0ZWRCaXRyYXRlID0gMDsKLSAgICAgICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgZmlsZVByb3BlcnRpZXM7Ci0gICAgICAgIE00T1NBX0RvdWJsZSByYXRpbzsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUFkZFZvbHVtZQotICAgICAgICAgICAgICAgID09IDEwMCApIC8qIFdlIGFyZSBpbiAicmVwbGFjZSBhdWRpbyBtb2RlLCBuZWVkIHRvIGNoZWNrIHRoZSBmaWxldHlwZSAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPkZpbGVUeXBlCi0gICAgICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQgKnBEZWNvZGVkUGF0aDsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlOwotICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjgoeFZTU19jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MucEJHTXRyYWNrLT5wRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1NlbmRDb21tYW5kOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0geFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyh4VlNTX2NvbnRleHQsIHBEZWNvZGVkUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlUHJvcGVydGllcyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBCR00gdHJhY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgLyplcnIgPSBNNHhWU1NfaW50ZXJuYWxHZXRQcm9wZXJ0aWVzKHhWU1NfY29udGV4dCwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICB4VlNTLnBCR010cmFjay0+cEZpbGUsICZmaWxlUHJvcGVydGllcyk7Ki8KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19zZW5kQ29tbWFuZDogTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyByZXR1cm5lZCBhbiBlcnJvcjpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICE9IE00VklERU9FRElUSU5HX2tBTVJfTkIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX3NlbmRDb21tYW5kOiBJbXBvc3NpYmxlIHRvIHVzZSBNTVMgbW9kZSB3aXRoIEJHTSAhPSBBTVItTkIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5GaWxlVHlwZQotICAgICAgICAgICAgICAgICAgICAhPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQU1SCi0gICAgICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+RmlsZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QMyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTR4VlNTX3NlbmRDb21tYW5kOiBCYWQgaW5wdXQgQkdNIGZpbGUiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDb21wdXRlIHRhcmdldGVkIGJpdHJhdGUsIHdpdGggOCUgbWFyZ2luIChtb292KSAqLwotICAgICAgICBpZiggdG90YWxEdXJhdGlvbiA+IDEwMDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0YXJnZXRlZEJpdHJhdGUgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKCggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0RmlsZVNpemUKLSAgICAgICAgICAgICAgICAqIDggKiAwLjg0KSAvICh0b3RhbER1cmF0aW9uIC8gMTAwMCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdGFyZ2V0ZWRCaXRyYXRlID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFJlbW92ZSBhdWRpbyBiaXRyYXRlICovCi0gICAgICAgIGlmKCB0YXJnZXRlZEJpdHJhdGUgPj0gMTIyMDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0YXJnZXRlZEJpdHJhdGUgLT0gMTIyMDA7IC8qIE9ubHkgQU1SIGlzIHN1cHBvcnRlZCBpbiBNTVMgY2FzZSAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdGFyZ2V0ZWRCaXRyYXRlID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENvbXB1dGUgYW4gaW5kaWNhdG9yIG9mICJjb21wbGV4aXR5IiBkZXBlbmRpbmcgb24gbmIgb2Ygc2VxdWVuY2VzIGFuZCB0b3RhbCBkdXJhdGlvbiAqLwotICAgICAgICAvKiBUaGUgaGlnaGVzdCBpcyB0aGUgbnVtYmVyIG9mIHNlcXVlbmNlcywgdGhlIG1vcmUgdGhlcmUgYXJlIHNvbWUgSSBmcmFtZXMgKi8KLSAgICAgICAgLyogSW4gdGhhdCBjYXNlLCBpdCBpcyBuZWNlc3NhcnkgdG8gcmVkdWNlIHRoZSB0YXJnZXQgYml0cmF0ZSAqLwotICAgICAgICByYXRpbyA9Ci0gICAgICAgICAgICAoTTRPU0FfRG91YmxlKSgoTTRPU0FfRG91YmxlKSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyCi0gICAgICAgICAgICAqIDEwMDAwMCkgLyAoTTRPU0FfRG91YmxlKSh0b3RhbER1cmF0aW9uKSk7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8zKAotICAgICAgICAgICAgIlJhdGlvIGNsaXBfbmIvZHVyYXRpb24gPSAlZlxuVGFyZ2V0ZWQgYml0cmF0ZSA9ICVkXG5Ub3RhbCBkdXJhdGlvbjogJWQiLAotICAgICAgICAgICAgKE00T1NBX0RvdWJsZSkoKE00T1NBX0RvdWJsZSkoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlcgotICAgICAgICAgICAgKiAxMDAwMDApIC8gKE00T1NBX0RvdWJsZSkodG90YWxEdXJhdGlvbikpLAotICAgICAgICAgICAgdGFyZ2V0ZWRCaXRyYXRlLCB0b3RhbER1cmF0aW9uKTsKLQotICAgICAgICBpZiggcmF0aW8gPiA1MCAmJiByYXRpbyA8PSA3NSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEl0IG1lYW5zIHRoYXQgdGhlcmUgaXMgYSBwb3RlbnRpYWwgcmlzayBvZiBoYXZpbmcgYSBoaWdoZXIgZmlsZSBzaXplCi0gICAgICAgICAgICB0aGFuIHNwZWNpZmllZCAqLwotICAgICAgICAgICAgdGFyZ2V0ZWRCaXRyYXRlIC09IChNNE9TQV9VSW50MzIpKHRhcmdldGVkQml0cmF0ZSAqIDAuMSk7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMigKLSAgICAgICAgICAgICAgICAiTmV3IGJpdHJhdGUxICEhXG5SYXRpbyBjbGlwX25iL2R1cmF0aW9uID0gJWZcblRhcmdldGVkIGJpdHJhdGUgPSAlZCIsCi0gICAgICAgICAgICAgICAgcmF0aW8sIHRhcmdldGVkQml0cmF0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggcmF0aW8gPiA3NSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRhcmdldGVkQml0cmF0ZSAtPSAoTTRPU0FfVUludDMyKSh0YXJnZXRlZEJpdHJhdGUgKiAwLjE1KTsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8yKAotICAgICAgICAgICAgICAgICJOZXcgYml0cmF0ZTIgISFcblJhdGlvIGNsaXBfbmIvZHVyYXRpb24gPSAlZlxuVGFyZ2V0ZWQgYml0cmF0ZSA9ICVkIiwKLSAgICAgICAgICAgICAgICByYXRpbywgdGFyZ2V0ZWRCaXRyYXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qQ1IgMzI4MyBNTVMgdXNlIGNhc2UgZm9yIFZBTDoKLSAgICAgICAgRGVjcmVhc2UgdGhlIG91dHB1dCBmaWxlIHNpemUgdG8ga2VlcCBhIG1hcmdpbiBvZiA1JQotICAgICAgICBUaGUgd3JpdGVyIHdpbGwgc3RvcCB3aGVuIHRoZSB0YXJnZXRlZCBvdXRwdXQgZmlsZSBzaXplIHdpbGwgYmUgcmVhY2hlZCovCi0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEZpbGVTaXplIC09Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRGaWxlU2l6ZSAqIDAuMDUpOwotCi0gICAgICAgIHN3aXRjaCggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rU1FDSUY6Ci0gICAgICAgICAgICAgICAgaWYoIHRhcmdldGVkQml0cmF0ZSA8IDMyMDAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+dGFyZ2V0ZWRCaXRyYXRlID0gMzIwMDA7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX09VVFBVVEZJTEVTSVpFX0VYQ0VFRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FRVkdBOgotICAgICAgICAgICAgICAgIGlmKCB0YXJnZXRlZEJpdHJhdGUgPCAzMjAwMCApICAgICAgICAgICAgICAvKjQ4MDAwKSovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnRhcmdldGVkQml0cmF0ZSA9IDMyMDAwOyAvKjQ4MDAwOyovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX09VVFBVVEZJTEVTSVpFX0VYQ0VFRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FDSUY6Ci0gICAgICAgICAgICAgICAgaWYoIHRhcmdldGVkQml0cmF0ZSA8IDQ4MDAwICkgICAgICAgICAgICAgIC8qNjQwMDApKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+dGFyZ2V0ZWRCaXRyYXRlID0gNDgwMDA7IC8qNjQwMDA7Ki8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9XQVJfT1VUUFVURklMRVNJWkVfRVhDRUVEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUVZHQToKLSAgICAgICAgICAgICAgICBpZiggdGFyZ2V0ZWRCaXRyYXRlIDwgNjQwMDAgKSAgICAgICAgICAgICAgLyoxMjgwMDApKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+dGFyZ2V0ZWRCaXRyYXRlID0gNjQwMDA7IC8qMTI4MDAwOyovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX09VVFBVVEZJTEVTSVpFX0VYQ0VFRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0NJRjoKLSAgICAgICAgICAgICAgICBpZiggdGFyZ2V0ZWRCaXRyYXRlIDwgMTI4MDAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+dGFyZ2V0ZWRCaXRyYXRlID0gMTI4MDAwOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9PVVRQVVRGSUxFU0laRV9FWENFRUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tWR0E6Ci0gICAgICAgICAgICAgICAgaWYoIHRhcmdldGVkQml0cmF0ZSA8IDE5MjAwMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnRhcmdldGVkQml0cmF0ZSA9IDE5MjAwMDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9XQVJfT1VUUFVURklMRVNJWkVfRVhDRUVEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAvKiBDYW5ub3QgaGFwcGVuICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNHhWU1Nfc2VuZENvbW1hbmQ6IEVycm9yIGluIG91dHB1dCBmaWxlU2l6ZSAhIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICB4VlNTX2NvbnRleHQtPnRhcmdldGVkQml0cmF0ZSA9IChNNE9TQV9VSW50MzIpdGFyZ2V0ZWRCaXRyYXRlOwotICAgIH0KLQotICAgIGlmKCBiSXNUcmFuc2NvZGluZyApCi0gICAgewotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9UUkFOU0NPRElOR19ORUNFU1NBUlk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19TYXZlU3RhcnQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfQ2hhciogcEZpbGVQYXRoKQotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIHByZXBhcmUgdGhlIHNhdmUKLSAqIEBub3RlICAgICAgICBUaGUgeFZTUyBjcmVhdGUgM0dQIGVkaXRlZCBmaW5hbCBmaWxlCi0gKiAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIG9uY2UgTTR4VlNTX1N0ZXAgaGFzIHJldHVybmVkCi0gKiAgICAgICAgICAgICAgICBNNFZTUzNHUFBfV0FSX0FOQUxZWklOR19ET05FCi0gKiAgICAgICAgICAgICAgICBBZnRlciB0aGlzIGZ1bmN0aW9uLCB0aGUgdXNlciBtdXN0IGNhbGwgTTR4VlNTX1N0ZXAgdW50aWwKLSAqICAgICAgICAgICAgICAgIGl0IHJldHVybnMgYW5vdGhlciBlcnJvciB0aGFuIE00Tk9fRVJST1IuCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgIHBGaWxlUGF0aCAgICAgICAgICAgIChJTikgSWYgdGhlIHVzZXIgd2FudHMgdG8gcHJvdmlkZSBhIGRpZmZlcmVudAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBmaWxlbmFtZSwgZWxzZSBjYW4gYmUgTlVMTCAoYWxsb2NhdGVkIGJ5IHRoZSB1c2VyKQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfU2F2ZVN0YXJ0KCBNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9Wb2lkICpwRmlsZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgZmlsZVBhdGhTaXplICkKLXsKLSAgICBNNHhWU1NfQ29udGV4dCAqeFZTU19jb250ZXh0ID0gKE00eFZTU19Db250ZXh0ICopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIC8qQWRkIGZvciBVVEYgY29udmVyc2lvbjogY29weSB0aGUgcFNldHRpbmdzIHN0cnVjdHVyZSBpbnRvIGEgbmV3IHBDdXJyZW50RWRpdFNldHRpbmdzKi8KLSAgICBNNFZTUzNHUFBfRWRpdFNldHRpbmdzICpwRWRpdFNhdmluZ1NldHRpbmdzID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9VSW50OCBpLCBqOwotICAgIE00T1NBX1VJbnQzMiBvZmZzZXQgPSAwOwotICAgIE00T1NBX1VJbnQ4IG5iRWZmZWN0cyA9IDA7Ci0gICAgLypvbmx5IGZvciBVVEYgY29udmVyc2lvbiBzdXBwb3J0Ki8KLSAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX1VJbnQzMiBsZW5ndGggPSAwOwotICAgIC8qKi8KLQotICAgIC8qIENoZWNrIHN0YXRlICovCi0gICAgaWYoIHhWU1NfY29udGV4dC0+bV9zdGF0ZSAhPSBNNHhWU1Nfa1N0YXRlT3BlbmVkICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIkJhZCBzdGF0ZSB3aGVuIGNhbGxpbmcgTTR4VlNTX1NhdmVTdGFydCBmdW5jdGlvbiEgU3RhdGUgaXMgJWQiLAotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5tX3N0YXRlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qIFJDOiB0byB0ZW1wb3JhcnkgaGFuZGxlIGNoYW5naW5nIG9mIG91dHB1dCBmaWxlcGF0aCAqLwotICAgIC8qIFRPIEJFIENIQU5HRUQgQ0xFQU5MWSBXSVRIIEEgTUFMTE9DL01FTUNQWSAhISEhICovCi0gICAgaWYoIHBGaWxlUGF0aCAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qaXQgbWVhbnMgdGhhdCBwT3V0cHV0RmlsZSBoYXMgYmVlbiBhbGxvY2F0ZWQgaW4gTTR4VlNTX3NlbmRDb21tYW5kKCkqLwotICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aU91dHB1dFBhdGhTaXplID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHBEZWNvZGVkUGF0aCA9IHBGaWxlUGF0aDsKLSAgICAgICAgLypBcyBhbGwgaW5wdXRzIG9mIHRoZSB4VlNTIGFyZSBpbiBVVEY4LCBjb252ZXJ0IHRoZSBvdXRwdXQgZmlsZSBwYXRoIGludG8gdGhlIGN1c3RvbWVyCi0gICAgICAgICBmb3JtYXQqLwotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0ICE9IE00T1NBX05VTEwKLSAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXBGaWxlUGF0aCwgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwgJmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2F2ZVN0YXJ0OiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgZmlsZVBhdGhTaXplID0gbGVuZ3RoOwotICAgICAgICB9Ci0KLSAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhmaWxlUGF0aFNpemUgKyAxLCBNNFZTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTTR4VlNTX1NhdmVTdGFydDogb3V0cHV0IGZpbGUiKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NhdmVTdGFydCIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUsICh2b2lkICopcERlY29kZWRQYXRoLCBmaWxlUGF0aFNpemUgKyAxKTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZVtmaWxlUGF0aFNpemVdID0gJ1wwJzsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlID0geFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpT3V0cHV0UGF0aFNpemUgPSBmaWxlUGF0aFNpemU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKioqLwotCi0gICAgLypGQjogQWRkIGZvciBVVEYgY29udmVyc2lvbjogY29weSB0aGUgcFNldHRpbmdzIHN0cnVjdHVyZSBpbnRvIGEgbmV3IHBDdXJyZW50RWRpdFNldHRpbmdzKi8KLSAgICAvKkl0IGlzIHRoZSBzYW1lIHByaW5jaXBsZSBhcyBpbiB0aGUgUHJldmlld1N0YXJ0KCkqLwotICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MgPQotICAgICAgICAoTTRWU1MzR1BQX0VkaXRTZXR0aW5ncyAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRWU1MzR1BQX0VkaXRTZXR0aW5ncyksCi0gICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopIlNhdmluZywgY29weSBvZiBWU1Mgc3RydWN0dXJlIik7Ci0KLSAgICBpZiggcEVkaXRTYXZpbmdTZXR0aW5ncyA9PSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TYXZlU3RhcnQiKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAvKiBDb3B5IHNldHRpbmdzIGZyb20gaW5wdXQgc3RydWN0dXJlICovCi0gICAgbWVtY3B5KCh2b2lkICopICYocEVkaXRTYXZpbmdTZXR0aW5ncy0+eFZTUyksCi0gICAgICAgICh2b2lkICopICYoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MpLAotICAgICAgICBzaXplb2YoTTR4VlNTX0VkaXRTZXR0aW5ncykpOwotCi0gICAgLyogSW5pdGlhbGl6ZSBwRWRpdFNhdmluZ1NldHRpbmdzIHN0cnVjdHVyZSAqLwotICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrID0gTTRPU0FfTlVMTDsKLQotICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnZpZGVvRnJhbWVSYXRlID0KLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnZpZGVvRnJhbWVSYXRlOwotICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnVpQ2xpcE51bWJlciA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aUNsaXBOdW1iZXI7Ci0gICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+dWlNYXN0ZXJDbGlwID0KLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpTWFzdGVyQ2xpcDsgLyogVlNTMi4wIG1hbmRhdG9yeSBwYXJhbWV0ZXIgKi8KLQotICAgIC8qIEFsbG9jYXRlIHNhdmluZ1NldHRpbmdzLnBDbGlwTGlzdC9wVHJhbnNpdGlvbnMgc3RydWN0dXJlICovCi0gICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+cENsaXBMaXN0ID0gKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKgotICAgICAgICAqIClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKikKLSAgICAgICAgKnBFZGl0U2F2aW5nU2V0dGluZ3MtPnVpQ2xpcE51bWJlciwKLSAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikieFZTUywgc2F2aW5nICwgY29weSBvZiBwQ2xpcExpc3QiKTsKLQotICAgIGlmKCBwRWRpdFNhdmluZ1NldHRpbmdzLT5wQ2xpcExpc3QgPT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2F2ZVN0YXJ0Iik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgaWYoIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnVpQ2xpcE51bWJlciA+IDEgKQotICAgIHsKLSAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ID0gKE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MgKgotICAgICAgICAgICAgKiApTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzICopCi0gICAgICAgICAgICAqKHBFZGl0U2F2aW5nU2V0dGluZ3MtPnVpQ2xpcE51bWJlciAtIDEpLAotICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikieFZTUywgc2F2aW5nLCBjb3B5IG9mIHBUcmFuc2l0aW9uTGlzdCIpOwotCi0gICAgICAgIGlmKCBwRWRpdFNhdmluZ1NldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TYXZlU3RhcnQiKTsKLQotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwRWRpdFNhdmluZ1NldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGZvciAoIGkgPSAwOyBpIDwgcEVkaXRTYXZpbmdTZXR0aW5ncy0+dWlDbGlwTnVtYmVyOyBpKysgKQotICAgIHsKLSAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+cENsaXBMaXN0W2ldID0gKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MKLSAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfQ2xpcFNldHRpbmdzKSwKLSAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopInNhdmluZyBjbGlwIHNldHRpbmdzIik7Ci0KLSAgICAgICAgaWYoIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NhdmVTdGFydCIpOwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIGkgPCBwRWRpdFNhdmluZ1NldHRpbmdzLT51aUNsaXBOdW1iZXIKLSAgICAgICAgICAgIC0gMSApIC8qIEJlY2F1c2UgdGhlcmUgaXMgMSBsZXNzIHRyYW5zaXRpb24gdGhhbiBjbGlwIG51bWJlciAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBwRWRpdFNhdmluZ1NldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0gPQotICAgICAgICAgICAgICAgIChNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzCi0gICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MpLAotICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopInNhdmluZyB0cmFuc2l0aW9uIHNldHRpbmdzIik7Ci0KLSAgICAgICAgICAgIGlmKCBwRWRpdFNhdmluZ1NldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0gPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NhdmVTdGFydCIpOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yICggaSA9IDA7IGkgPCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyOyBpKysgKQotICAgIHsKLSAgICAgICAgLy8gQWRkIE1QNCBmaWxlIHN1cHBvcnQKLQotICAgICAgICBpZiggKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5GaWxlVHlwZQotICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFApCi0gICAgICAgICAgICB8fCAoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+RmlsZVR5cGUKLSAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NUDQpCi0gICAgICAgICAgICB8fCAoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+RmlsZVR5cGUKLSAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NNFYpCi0gICAgICAgICAgICB8fCAoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+RmlsZVR5cGUKLSAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkpCi0KLSAgICAgICAgewotICAgICAgICAgICAgLyogQ29weSBkYXRhIGZyb20gZ2l2ZW4gc3RydWN0dXJlIHRvIG91ciBzYXZpbmcgc3RydWN0dXJlICovCi0gICAgICAgICAgICBNNHhWU1NfRHVwbGljYXRlQ2xpcFNldHRpbmdzKHBFZGl0U2F2aW5nU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSwKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLAotICAgICAgICAgICAgICAgIE00T1NBX0ZBTFNFIC8qIHJlbW92ZSBlZmZlY3RzICovKTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotICAgICAgICAgICAgcERlY29kZWRQYXRoID0gcEVkaXRTYXZpbmdTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZTsKLSAgICAgICAgICAgIGxlbmd0aCA9IHN0cmxlbihwRGVjb2RlZFBhdGgpOwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0Ci0gICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCAmJiB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9Ci0gICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsIChNNE9TQV9Wb2lkCi0gICAgICAgICAgICAgICAgICAgICopcEVkaXRTYXZpbmdTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICZsZW5ndGgpOwotCi0gICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TYXZlU3RhcnQ6IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0geFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgICAgIGZyZWUoCi0gICAgICAgICAgICAgICAgICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUpOwotICAgICAgICAgICAgICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUgPSAoTTRPU0FfVm9pZAotICAgICAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygobGVuZ3RoICsgMSksCi0gICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopInNhdmluZyB0cmFuc2l0aW9uIHNldHRpbmdzIik7Ci0KLSAgICAgICAgICAgICAgICBpZiggcEVkaXRTYXZpbmdTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TYXZlU3RhcnQiKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEVkaXRTYXZpbmdTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwRGVjb2RlZFBhdGgsIGxlbmd0aCArIDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLypGQjogYWRkIGZpbGUgcGF0aCBzaXplIGJlY2F1c2Ugb2YgVVRGIDE2IGNvbnZlcnNpb24qLwotICAgICAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5maWxlUGF0aFNpemUgPSBsZW5ndGgrMTsKLQotICAgICAgICAgICAgaWYoIGkKLSAgICAgICAgICAgICAgICA8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aUNsaXBOdW1iZXIKLSAgICAgICAgICAgICAgICAtIDEgKSAvKiBCZWNhdXNlIHRoZXJlIGlzIDEgbGVzcyB0cmFuc2l0aW9uIHRoYW4gY2xpcCBudW1iZXIgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopcEVkaXRTYXZpbmdTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLAotICAgICAgICAgICAgICAgICAgICBzaXplb2YoTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00eFZTU19TYXZlU3RhcnQ6IEVycm9yIHdoZW4gcGFyc2luZyB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldOlwKLSAgICAgICAgICAgICAgICAgQmFkIGZpbGUgdHlwZSIpOwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIENvdW50IHRoZSBudW1iZXIgb2YgdmlkZW8gZWZmZWN0cywgdXNlZCB0byBrbm93IGhvdyBtdWNoIG1lbW9yeSBpcyBuZWVkZWQgdG8gYWxsb2NhdGUqLwotICAgIC8qIEZCIDIwMDgvMTAvMTU6IHJlbW92ZWQgOiBub3QgY29tcGF0aWJsZSB3aXRoIE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX05vbmUKLSAgICBmb3Ioaj0wO2o8eFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPm5iRWZmZWN0cztqKyspCi0gICAgewotICAgIGlmKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZSAhPSBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9Ob25lKQotICAgIHsKLSAgICBuYkVmZmVjdHMrKzsKLSAgICB9Ci0gICAgfSovCi0gICAgbmJFZmZlY3RzID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPm5iRWZmZWN0czsKLQotICAgIC8qIEFsbG9jYXRlIGVmZmVjdHMgc2F2aW5nIHN0cnVjdHVyZSB3aXRoIGNvcnJlY3QgbnVtYmVyIG9mIGVmZmVjdHMgKi8KLSAgICBpZiggbmJFZmZlY3RzICE9IDAgKQotICAgIHsKLSAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+RWZmZWN0cyA9Ci0gICAgICAgICAgICAoTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKG5iRWZmZWN0cwotICAgICAgICAgICAgKiBzaXplb2YoTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzKSwgTTRWUywgKE00T1NBX0NoYXIKLSAgICAgICAgICAgICopIlNhdmluZyBzZXR0aW5ncywgZWZmZWN0cyB0YWJsZSBvZiBzdHJ1Y3R1cmUgc2V0dGluZ3MiKTsKLQotICAgICAgICBpZiggcEVkaXRTYXZpbmdTZXR0aW5ncy0+RWZmZWN0cyA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NhdmVTdGFydCIpOwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogSnVzdCBjb3B5IGVmZmVjdCBzdHJ1Y3R1cmUgdG8gc2F2aW5nIHN0cnVjdHVyZSwgYXMgZWZmZWN0cyB0aW1lIGFyZSBub3cgKi8KLSAgICAgICAgLyogcmVsYXRpdmUgdG8gb3V0cHV0IGNsaXAgdGltZSovCi0gICAgICAgIG1lbWNweSgodm9pZCAqKXBFZGl0U2F2aW5nU2V0dGluZ3MtPkVmZmVjdHMsCi0gICAgICAgICAgICAodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzLAotICAgICAgICAgICAgbmJFZmZlY3RzICogc2l6ZW9mKE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncykpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwRWRpdFNhdmluZ1NldHRpbmdzLT5FZmZlY3RzID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+bmJFZmZlY3RzID0gMDsKLSAgICB9Ci0gICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+bmJFZmZlY3RzID0gbmJFZmZlY3RzOwotCi0gICAgaWYoIHBGaWxlUGF0aCAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnBPdXRwdXRGaWxlID0gcEZpbGVQYXRoOwotICAgIH0KLQotICAgIC8qIFNhdmUgcG9pbnRlciBvZiBzYXZpbmcgdmlkZW8gZWRpdG9yIHRvIHVzZSBpbiBzdGVwIGZ1bmN0aW9uICovCi0gICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncyA9IHBFZGl0U2F2aW5nU2V0dGluZ3M7Ci0KLSAgICAvKiBDaGFuZ2Ugb3V0cHV0IGZpbGUgbmFtZSB0byB0ZW1wb3Jhcnkgb3V0cHV0IGZpbGUgbmFtZSwgYmVjYXVzZSBmaW5hbCBmaWxlIHdpbGwgYmUKLSAgICAgZ2VuZXJhdGVkIGJ5IGF1ZGlvIG1peGVyICovCi0gICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0KLSAgICAgICAgTTRPU0FfQ2hhciBvdXRfM2dwW000WFZTU19NQVhfUEFUSF9MRU5dOwotICAgICAgICBNNE9TQV9DaGFyIG91dF8zZ3BfdG1wW000WFZTU19NQVhfUEFUSF9MRU5dOwotCi0gICAgICAgIC8qKi8KLSAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgPQotICAgICAgICAgICAgKE00eFZTU19CR01TZXR0aW5ncyAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX0JHTVNldHRpbmdzKSwgTTRWUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyCi0gICAgICAgICAgICAqKSJTYXZpbmcgc2V0dGluZ3MsIGVmZmVjdHMgdGFibGUgb2Ygc3RydWN0dXJlIHNldHRpbmdzIik7Ci0KLSAgICAgICAgaWYoIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2F2ZVN0YXJ0Iik7Ci0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBKdXN0IGNvcHkgZWZmZWN0IHN0cnVjdHVyZSB0byBzYXZpbmcgc3RydWN0dXJlLCBhcyBlZmZlY3RzIHRpbWUgYXJlIG5vdyAqLwotICAgICAgICAvKiByZWxhdGl2ZSB0byBvdXRwdXQgY2xpcCB0aW1lKi8KLSAgICAgICAgbWVtY3B5KCh2b2lkICopcEVkaXRTYXZpbmdTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2ssCi0gICAgICAgICAgICAodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjaywKLSAgICAgICAgICAgIHNpemVvZihNNHhWU1NfQkdNU2V0dGluZ3MpKTsKLQotICAgICAgICAvKiBBbGxvY2F0ZSBmaWxlIG5hbWUsIGFuZCBjb3B5IGZpbGUgbmFtZSBidWZmZXIgdG8gb3VyIHN0cnVjdHVyZSAqLwotICAgICAgICBwRWRpdFNhdmluZ1NldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgPSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAoc3RybGVuKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUpCi0gICAgICAgICAgICArIDEpLAotICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiU2F2aW5nIHN0cnVjdCB4VlNTIEJHTSBmaWxlIHBhdGgiKTsKLQotICAgICAgICBpZiggcEVkaXRTYXZpbmdTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TYXZlU3RhcnQiKTsKLQotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkoKHZvaWQgKilwRWRpdFNhdmluZ1NldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUsCi0gICAgICAgICAgICAodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUsCi0gICAgICAgICAgICBzdHJsZW4oeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSkKLSAgICAgICAgICAgICsgMSk7Ci0KLSAgICAgICAgLypDb3B5IEJHTSB0cmFjayBmaWxlIHBhdGgqLwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFVURiBjb252ZXJzaW9uKi8KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilwRWRpdFNhdmluZ1NldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUsCi0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwgJmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2F2ZVN0YXJ0OiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0KLSAgICAgICAgICAgIGZyZWUocEVkaXRTYXZpbmdTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlKTsKLSAgICAgICAgICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MobGVuZ3RoICsgMSwgTTRWUywgKE00T1NBX0NoYXIKLSAgICAgICAgICAgICAgICAqKSJNNHhWU1NfU2F2ZVN0YXJ0OiBUZW1wIGZpbGVuYW1lIGluIGNhc2Ugb2YgQkdNIik7Ci0KLSAgICAgICAgICAgIGlmKCBwRWRpdFNhdmluZ1NldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NhdmVTdGFydCIpOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEVkaXRTYXZpbmdTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlLAotICAgICAgICAgICAgICAgICh2b2lkICopcERlY29kZWRQYXRoLCBsZW5ndGggKyAxKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKi8KLQotICAgICAgICBNNE9TQV9jaHJOQ29weShvdXRfM2dwLCB4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCwgTTRYVlNTX01BWF9QQVRIX0xFTiAtIDEpOwotICAgICAgICBNNE9TQV9jaHJOQ29weShvdXRfM2dwX3RtcCwgeFZTU19jb250ZXh0LT5wVGVtcFBhdGgsIE00WFZTU19NQVhfUEFUSF9MRU4gLSAxKTsKLQotICAgICAgICAvKiBDb25zdHJ1Y3Qgb3V0cHV0IHRlbXBvcmFyeSAzR1AgZmlsZW5hbWUgKi8KLSAgICAgICAgc3RybmNhdCgoY2hhciAqKW91dF8zZ3AsIChjb25zdCBjaGFyICopInNhdmV0ZW1wLjNncFwwIiwgMTMpOwotICAgICAgICBzdHJuY2F0KChjaGFyICopb3V0XzNncF90bXAsIChjb25zdCBjaGFyICopInNhdmV0ZW1wLnRtcFwwIiwgMTMpOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotICAgICAgICBwRGVjb2RlZFBhdGggPSBvdXRfM2dwOwotICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0ICE9IE00T1NBX05VTEwKLSAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKW91dF8zZ3AsIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsICZsZW5ndGgpOwotCi0gICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NhdmVTdGFydDogTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4IHJldHVybnMgZXJyOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLQotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cE91dHB1dEZpbGUgPQotICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MobGVuZ3RoICsgMSwgTTRWUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk00eFZTU19TYXZlU3RhcnQ6IFRlbXAgZmlsZW5hbWUgaW4gY2FzZSBvZiBCR00iKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cE91dHB1dEZpbGUgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TYXZlU3RhcnQiKTsKLQotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkoKHZvaWQgKil4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSwKLSAgICAgICAgICAgICh2b2lkICopcERlY29kZWRQYXRoLCBsZW5ndGggKyAxKTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+dWlPdXRwdXRQYXRoU2l6ZSA9IGxlbmd0aCArIDE7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgIHBEZWNvZGVkUGF0aCA9IG91dF8zZ3BfdG1wOwotICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0ICE9IE00T1NBX05VTEwKLSAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKW91dF8zZ3BfdG1wLCAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TYXZlU3RhcnQ6IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0KLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcERlY29kZWRQYXRoID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEVuZCBvZiB0aGUgVVRGIGNvbnZlcnNpb24sIHVzZSB0aGUgY29udmVydGVkIGZpbGUgcGF0aCovCi0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlID0KLSAgICAgICAgICAgIChNNE9TQV9Wb2lkICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGxlbmd0aCArIDEsIE00VlMsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJNNHhWU1NfU2F2ZVN0YXJ0OiBUZW1wb3JhcnkgZmlsZSIpOwotCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NhdmVTdGFydCIpOwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlLAotICAgICAgICAgICAgKHZvaWQgKilwRGVjb2RlZFBhdGgsIGxlbmd0aCArIDEpOwotCi0gICAgICAgIC8qIFB1dCBuYiBvZiBzdGVwIGZvciBwcm9ncmVzc2lvbiBtb25pdG9yaW5nIHRvIDIsIGJlY2F1c2UgYXVkaW8gbWl4aW5nIGlzIG5lZWRlZCAqLwotICAgICAgICB4VlNTX2NvbnRleHQtPm5iU3RlcFRvdGFsID0gMjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cE91dHB1dEZpbGUgPQotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIC8qIFB1dCBuYiBvZiBzdGVwIGZvciBwcm9ncmVzc2lvbiBtb25pdG9yaW5nIHRvIDEsIGJlY2F1c2Ugbm8gYXVkaW8gbWl4aW5nIGlzIG5lZWRlZCAqLwotICAgICAgICB4VlNTX2NvbnRleHQtPm5iU3RlcFRvdGFsID0gMTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqKiovCi0KLSAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUVkaXRlZEZpbGUoeFZTU19jb250ZXh0KTsKLQotICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNHhWU1NfU2F2ZVN0YXJ0OiBNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUVkaXRlZEZpbGUgcmV0dXJuZWQgYW4gZXJyb3I6IDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLQotICAgICAgICAvKiovCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgcE91dHB1dEZpbGUpOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUgIT0gTTRPU0FfTlVMTAotICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIHBUZW1wb3JhcnlGaWxlKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgLyogVE9ETzogVHJhbnNsYXRlIGVycm9yIGNvZGUgb2YgVlNTIHRvIGFuIHhWU1MgZXJyb3IgY29kZSAqLwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qIFJlaW5pdGlhbGl6ZSBjdXJyZW50IHN0ZXAgbnVtYmVyIGZvciBwcm9ncmVzc2lvbiBtb25pdG9yaW5nICovCi0gICAgeFZTU19jb250ZXh0LT5jdXJyZW50U3RlcCA9IDA7Ci0KLSAgICAvKiBDaGFuZ2UgeFZTUyBzdGF0ZSAqLwotICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSA9IE00eFZTU19rU3RhdGVTYXZpbmc7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19TYXZlU3RvcChNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIHVuYWxsb2NhdGUgc2F2ZSByZXNzb3VyY2VzIGFuZCBjaGFuZ2UgeFZTUwotICogICAgICAgICAgICAgICAgaW50ZXJuYWwgc3RhdGUuCi0gKiBAbm90ZSAgICAgICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBvbmNlIE00eFZTU19TdGVwIGhhcyByZXR1cm5lZAotICogICAgICAgICAgICAgICAgTTRWU1MzR1BQX1dBUl9TQVZJTkdfRE9ORQotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfU2F2ZVN0b3AoIE00T1NBX0NvbnRleHQgcENvbnRleHQgKQotewotICAgIE00eFZTU19Db250ZXh0ICp4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIC8qIENoZWNrIHN0YXRlICovCi0gICAgaWYoIHhWU1NfY29udGV4dC0+bV9zdGF0ZSAhPSBNNHhWU1Nfa1N0YXRlU2F2aW5nICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIkJhZCBzdGF0ZSB3aGVuIGNhbGxpbmcgTTR4VlNTX1NhdmVTdG9wIGZ1bmN0aW9uISBTdGF0ZSBpcyAlZCIsCi0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPm1fc3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyogRnJlZSBzYXZpbmcgc3RydWN0dXJlcyAqLwotICAgIE00eFZTU19pbnRlcm5hbEZyZWVTYXZpbmcoeFZTU19jb250ZXh0KTsKLQotICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyogQ2hhbmdlIHhWU1Mgc3RhdGUgKi8KLSAgICB4VlNTX2NvbnRleHQtPm1fc3RhdGUgPSBNNHhWU1Nfa1N0YXRlU2F2ZWQ7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19TdGVwKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1VJbnQ4ICpwUHJvZ3Jlc3MpCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gZXhlY3V0ZXMgZGlmZmVyZW50cyB0YXNrcywgZGVwZW5kaW5nIG9mIHhWU1MKLSAqICAgICAgICAgICAgICAgIGludGVybmFsIHN0YXRlLgotICogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb246Ci0gKiAgICAgICAgICAgICAgICAgICAgLSBhbmFseXNlcyBlZGl0aW5nIHN0cnVjdHVyZSBpZiBjYWxsZWQgYWZ0ZXIgTTR4VlNTX1NlbmRDb21tYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgLSBnZW5lcmF0ZXMgcHJldmlldyBmaWxlIGlmIGNhbGxlZCBhZnRlciBNNHhWU1NfUHJldmlld1N0YXJ0Ci0gKiAgICAgICAgICAgICAgICAgICAgLSBnZW5lcmF0ZXMgZmluYWwgZWRpdGVkIGZpbGUgaWYgY2FsbGVkIGFmdGVyIE00eFZTU19TYXZlU3RhcnQKLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAgICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcFByb2dyZXNzICAgICAgICAgICAgICAgICAgICAgICAgKElOL09VVCkgUG9pbnRlciBvbiBhbiBpbnRlZ2VyIGdpdmluZyBhCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MgaW5kaWNhdGlvbiAoYmV0d2VlbiAwLTEwMCkKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgICAgICAgICBObyBlcnJvciwgdGhlIHVzZXIgbXVzdCBjYWxsIE00eFZTU19TdGVwIGFnYWluCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX1dBUl9QUkVWSUVXX1JFQURZOiAgICBQcmV2aWV3IGZpbGUgaXMgZ2VuZXJhdGVkCi0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9XQVJfU0FWSU5HX0RPTkU6ICAgICAgICBGaW5hbCBlZGl0ZWQgZmlsZSBpcyBnZW5lcmF0ZWQKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX1dBUl9BTkFMWVpJTkdfRE9ORTogICAgQW5hbHlzZSBpcyBkb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfU3RlcCggTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVUludDggKnBQcm9ncmVzcyApCi17Ci0gICAgTTR4VlNTX0NvbnRleHQgKnhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCAqKXBDb250ZXh0OwotICAgIE00VlNTM0dQUF9FZGl0Q29udGV4dCBwVnNzQ3R4dCA9IHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0Q29udGV4dDsKLSAgICBNNFZTUzNHUFBfQXVkaW9NaXhpbmdDb250ZXh0IHBBdWRpb01peGluZ0N0eHQgPQotICAgICAgICB4VlNTX2NvbnRleHQtPnBBdWRpb01peENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfVUludDggdWlQcm9ncmVzcyA9IDA7Ci0KLSAgICBzd2l0Y2goIHhWU1NfY29udGV4dC0+bV9zdGF0ZSApCi0gICAgewotICAgICAgICBjYXNlIE00eFZTU19rU3RhdGVTYXZpbmc6Ci0gICAgICAgIC8vY2FzZSBNNHhWU1Nfa1N0YXRlR2VuZXJhdGluZ1ByZXZpZXc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+ZWRpdGluZ1N0ZXAKLSAgICAgICAgICAgICAgICAgICAgPT0gTTR4VlNTX2tNaWNyb1N0YXRlRWRpdGluZyApIC8qIFZTUyAtPiBjcmVhdGluZyBlZmZlY3RzLCB0cmFuc2l0aW9ucyAuLi4gKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFJDOiB0byBkZWxldGUgdW5lY2Vzc2FyeSB0ZW1wIGZpbGVzIG9uIHRoZSBmbHkgKi8KLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBWU1NDb250ZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqKXBWc3NDdHh0OwotCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9lZGl0U3RlcChwVnNzQ3R4dCwgJnVpUHJvZ3Jlc3MpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAoIGVyciAhPSBNNE5PX0VSUk9SKSAmJiAoZXJyICE9IE00VlNTM0dQUF9XQVJfRURJVElOR19ET05FKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGVyciAhPSBNNFZTUzNHUFBfV0FSX1NXSVRDSF9DTElQKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU3RlcDogTTRWU1MzR1BQX2VkaXRTdGVwIHJldHVybmVkIDB4JXhcbiIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfZWRpdENsZWFuVXAocFZzc0N0eHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETyA/IDogVHJhbnNsYXRlIGVycm9yIGNvZGUgb2YgVlNTIHRvIGFuIHhWU1MgZXJyb3IgY29kZSA/ICovCi0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdENvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIFJDOiB0byBkZWxldGUgdW5lY2Vzc2FyeSB0ZW1wIGZpbGVzIG9uIHRoZSBmbHkgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciA9PSBNNFZTUzNHUFBfV0FSX1NXSVRDSF9DTElQICkKLSAgICAgICAgICAgICAgICAgICAgewotI2lmbmRlZiBET19OT1RfUkVNT1ZFX1RFTVBfRklMRVMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEl0IG1lYW5zIHdlIGNhbiBkZWxldGUgdGhlIHRlbXBvcmFyeSBmaWxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBGaXJzdCBzdGVwLCBjaGVjayB0aGUgdGVtcCBmaWxlIGlzIG5vdCB1c2Ugc29tZXdoZXJlIGVsc2UgYWZ0ZXIgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBjbXBSZXN1bHQgPSAtMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yICggaSA9IHBWU1NDb250ZXh0LT51aUN1cnJlbnRDbGlwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPCBwVlNTQ29udGV4dC0+dWlDbGlwTnVtYmVyOyBpKysgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwVlNTQ29udGV4dC0+cENsaXBMaXN0W3BWU1NDb250ZXh0LT51aUN1cnJlbnRDbGlwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMV0uZmlsZVBhdGhTaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IHBWU1NDb250ZXh0LT5wQ2xpcExpc3RbaV0uZmlsZVBhdGhTaXplICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtcFJlc3VsdCA9IG1lbWNtcCgodm9pZCAqKXBWU1NDb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtwVlNTQ29udGV4dC0+dWlDdXJyZW50Q2xpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxXS5wRmlsZSwgKHZvaWQgKilwVlNTQ29udGV4dC0+cENsaXBMaXN0W2ldLnBGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZTU0NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBMaXN0W3BWU1NDb250ZXh0LT51aUN1cnJlbnRDbGlwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDFdLmZpbGVQYXRoU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGNtcFJlc3VsdCA9PSAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSXQgbWVhbnMgd2UgZm91bmQgYSBjb3JyZXNwb25kaW5nIGZpbGUsIHdlIGRvIG5vdCBkZWxldGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgdGVtcG9yYXJ5IGZpbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggY21wUmVzdWx0ICE9IDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBDb252ZXJ0ZWRTaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyICp0b3RvOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgKnBUbXBTdHI7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb252ZXJ0IHJlc3VsdCBpbiBVVEY4IHRvIGNoZWNrIGlmIHdlIGNhbiBkZWxldGUgaXQgb3Igbm90ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZUb1VURjhGY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCAmJiB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXBWU1NDb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtwVlNTQ29udGV4dC0+dWlDdXJyZW50Q2xpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxXS5wRmlsZSwgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcE91dENvbnZlcnNpb25CdWZmZXIsICZDb252ZXJ0ZWRTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90byA9IChNNE9TQV9DaGFyICopc3Ryc3RyKChjb25zdCBjaGFyICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKil4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUbXBTdHIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90byA9IChNNE9TQV9DaGFyICopc3Ryc3RyKChjb25zdCBjaGFyICopcFZTU0NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBMaXN0W3BWU1NDb250ZXh0LT51aUN1cnJlbnRDbGlwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDFdLnBGaWxlLCAoY29uc3QgY2hhciAqKXhWU1NfY29udGV4dC0+cFRlbXBQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRtcFN0ciA9IHBWU1NDb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtwVlNTQ29udGV4dC0+dWlDdXJyZW50Q2xpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxXS5wRmlsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggdG90byAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFzIHRlbXBvcmFyeSBmaWxlcyBjYW4gYmUgaW1nWFhYLjNncCBvciB2aWRYWFguM2dwICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUbXBTdHIgKz0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJsZW4oKGNvbnN0IGNoYXIgKilwVG1wU3RyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxMCk7IC8qIEJlY2F1c2UgdGVtcG9yYXJ5IGZpbGVzIGhhdmUgYSBsZW5ndGggYXQgbW9zdCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAgYnl0ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90byA9IChNNE9TQV9DaGFyICopc3Ryc3RyKChjb25zdCBjaGFyICopcFRtcFN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopImltZyIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0b3RvICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RvID0gKE00T1NBX0NoYXIgKilzdHJzdHIoKGNvbnN0IGNoYXIgKilwVG1wU3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopInZpZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVycgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTROT19FUlJPUiApIC8qIEl0IG1lYW5zIHRoZSBmaWxlIGlzIGEgdGVtcG9yYXJ5IGZpbGUsIHdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gZGVsZXRlIGl0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZSgoY29uc3QgY2hhciAqKXBWU1NDb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcExpc3RbcFZTU0NvbnRleHQtPnVpQ3VycmVudENsaXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDFdLnBGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotI2VuZGlmIC8qIERPX05PVF9SRU1PVkVfVEVNUF9GSUxFUyovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciA9PSBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+Y3VycmVudFN0ZXArKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFA0TUUwMDAwMzI3NjogV2hlbiBhIHN0ZXAgaXMgY29tcGxldGUsIGluY3JlbWVudCBjdXJyZW50U3RlcCBhbmQgcmVzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpUHJvZ3Jlc3MgdW5sZXNzIHByb2dyZXNzIHdvdWxkIGJlIHdyb25nICovCi0gICAgICAgICAgICAgICAgICAgICAgICB1aVByb2dyZXNzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENsb3NlRWRpdGVkRmlsZSh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogRml4IGZvciAgYmxybnhwc3cjMjM0LS0tPiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyID09ICgoTTRPU0FfVUludDMyKU00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTikgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTRVJSX05PX01PUkVfU1BBQ0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX2ludGVybmFsQ2xvc2VFZGl0ZWRGaWxlIHJldHVybmVkIGFuIGVycm9yOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLyo8LS0tLSBGaXggZm9yICBibHJueHBzdyMyMzQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+ZWRpdGluZ1N0ZXAgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1Nfa01pY3JvU3RhdGVBdWRpb01peGluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPcGVuIEF1ZGlvIG1peGluZyBjb21wb25lbnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUF1ZGlvTWl4RmlsZSh4VlNTX2NvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19pbnRlcm5hbEdlbmVyYXRlQXVkaW9NaXhGaWxlIHJldHVybmVkIGFuIGVycm9yOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRPRE8gPyA6IFRyYW5zbGF0ZSBlcnJvciBjb2RlIG9mIFZTUyB0byBhbiB4VlNTIGVycm9yIGNvZGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZF9zdGVwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX1dBUl9TQVZJTkdfRE9ORTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZF9zdGVwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5lZGl0aW5nU3RlcAotICAgICAgICAgICAgICAgICAgICA9PSBNNHhWU1Nfa01pY3JvU3RhdGVBdWRpb01peGluZyApIC8qIEF1ZGlvIG1peGluZzogbWl4L3JlcGxhY2UgYXVkaW8gdHJhY2sKLSAgICAgICAgICAgICAgICAgICAgd2l0aCBnaXZlbiBCR00gKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9hdWRpb01peGluZ1N0ZXAocEF1ZGlvTWl4aW5nQ3R4dCwgJnVpUHJvZ3Jlc3MpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAoIGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGVyciAhPSBNNFZTUzNHUFBfV0FSX0VORF9PRl9BVURJT19NSVhJTkcpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ01haW46IE00VlNTM0dQUF9hdWRpb01peGluZ1N0ZXAgcmV0dXJuZWQgMHgleFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETyA/IDogVHJhbnNsYXRlIGVycm9yIGNvZGUgb2YgVlNTIHRvIGFuIHhWU1MgZXJyb3IgY29kZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgPT0gTTRWU1MzR1BQX1dBUl9FTkRfT0ZfQVVESU9fTUlYSU5HICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5jdXJyZW50U3RlcCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogUDRNRTAwMDAzMjc2OiBXaGVuIGEgc3RlcCBpcyBjb21wbGV0ZSwgaW5jcmVtZW50IGN1cnJlbnRTdGVwIGFuZCByZXNldAotICAgICAgICAgICAgICAgICAgICAgICAgdWlQcm9ncmVzcyB1bmxlc3MgcHJvZ3Jlc3Mgd291bGQgYmUgd3JvbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHVpUHJvZ3Jlc3MgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ2xvc2VBdWRpb01peGVkRmlsZSh4VlNTX2NvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX2ludGVybmFsQ2xvc2VBdWRpb01peGVkRmlsZSByZXR1cm5lZCBhbiBlcnJvcjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETyA/IDogVHJhbnNsYXRlIGVycm9yIGNvZGUgb2YgVlNTIHRvIGFuIHhWU1MgZXJyb3IgY29kZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfV0FSX1NBVklOR19ET05FOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kX3N0ZXA7Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQmFkIHN0YXRlIGluIHN0ZXAgZnVuY3Rpb24gISIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1N0YXRlQW5hbHl6aW5nOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPmFuYWx5c2VTdGVwCi0gICAgICAgICAgICAgICAgICAgID09IE00eFZTU19rTWljcm9TdGF0ZUFuYWx5c2VQdG8zR1BQICkgLyogUHRvM0dQUCwgYW5hbHlzaW5nIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtcyA9PSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBQVG8zR1BQcGFyYW1zTGlzdCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBUbzNHUFBwYXJhbXNMaXN0OyAvKiBDdXJyZW50IFB0bzNHUFAgUGFyYW1ldGVyIGlzIHRoZSBmaXJzdCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGxpc3QgKi8KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtcyAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBQVG8zR1BQcGFyYW1zTGlzdCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFBUbzNHUFBjdXJyZW50UGFyYW1zLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsgLyogQ3VycmVudCBQdG8zR1BQIFBhcmFtZXRlciBpcyB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBsaXN0ICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE00T1NBX05VTEwgKSAvKiBJdCBtZWFucyB0aGVyZSBpcyBubyBuZXh0IGltYWdlIHRvIGNvbnZlcnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZSBzdGVwIHRvIE1DUyBwaGFzZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+YW5hbHlzZVN0ZXAgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1Nfa01pY3JvU3RhdGVBbmFseXplTUNTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlbmRfc3RlcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPnBQVG8zR1BQcGFyYW1zTGlzdCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5hbmFseXNlU3RlcCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2tNaWNyb1N0YXRlQW5hbHl6ZU1DUzsgLyogQ2hhbmdlIEFuYWx5emluZyBtaWNybyBzdGF0ZSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1MgcGhhc2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZF9zdGVwOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgdGhpcyBmaWxlIGhhcyB0byBiZSBjb252ZXJ0ZWQgb3Igbm90ICovCi0gICAgICAgICAgICAgICAgICAgIC8qIElmIG5vdCwgd2UganVzdCByZXR1cm4gTTROT19FUlJPUiwgYW5kIGdvIHRvIG5leHQgZmlsZSAqLwotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMtPmlzQ3JlYXRlZAotICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRPU0FfRkFMU0UgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBPcGVuaW5nIFB0bzNHUFAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbFN0YXJ0Q29udmVydFBpY3R1cmVUbzNncCh4VlNTX2NvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfU3RlcDogTTR4VlNTX2ludGVybmFsU3RhcnRDb252ZXJ0UGljdHVyZVRvM2dwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCBlcnJvcjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETyA/IDogVHJhbnNsYXRlIGVycm9yIGNvZGUgb2YgVlNTIHRvIGFuIHhWU1MgZXJyb3IgY29kZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5hbmFseXNlU3RlcCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2tNaWNyb1N0YXRlQ29udmVydFB0bzNHUFA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5hbmFseXNlU3RlcAotICAgICAgICAgICAgICAgICAgICA9PSBNNHhWU1Nfa01pY3JvU3RhdGVDb252ZXJ0UHRvM0dQUCApIC8qIFB0bzNHUFAsIGNvbnZlcnRpbmcgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00UFRPM0dQUF9TdGVwKHhWU1NfY29udGV4dC0+cE00UFRPM0dQUF9DdHh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyogdXBkYXRlIHByb2dyZXNzIGJhciAqLwotICAgICAgICAgICAgICAgICAgICBpZih4VlNTX2NvbnRleHQtPnBDYWxsQmFja0N0eHQtPm1fTmJJbWFnZSA+IDEpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpUHJvZ3Jlc3MgPSAoeFZTU19jb250ZXh0LT5wQ2FsbEJhY2tDdHh0LT5tX0ltYWdlQ291bnRlciAqIDEwMCkgLyAoeFZTU19jb250ZXh0LT5wQ2FsbEJhY2tDdHh0LT5tX05iSW1hZ2UgLTEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoICggZXJyICE9IE00Tk9fRVJST1IpICYmIChlcnIKLSAgICAgICAgICAgICAgICAgICAgICAgICE9ICgoTTRPU0FfVUludDMyKU00UFRPM0dQUF9XQVJfRU5EX09GX1BST0NFU1NJTkcpKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRPIEJFIENIRUNLRUQgTk8gTEVBS1MgICEhISEhICovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1N0ZXA6IE00UFRPM0dQUF9TdGVwIHJldHVybmVkIDB4JXhcbiIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPID8gOiBUcmFuc2xhdGUgZXJyb3IgY29kZSBvZiBWU1MgdG8gYW4geFZTUyBlcnJvciBjb2RlICovCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIGVycgotICAgICAgICAgICAgICAgICAgICAgICAgPT0gKChNNE9TQV9VSW50MzIpTTRQVE8zR1BQX1dBUl9FTkRfT0ZfUFJPQ0VTU0lORykgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPmN1cnJlbnRTdGVwKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBQNE1FMDAwMDMyNzY6IFdoZW4gYSBzdGVwIGlzIGNvbXBsZXRlLCBpbmNyZW1lbnQgY3VycmVudFN0ZXAgYW5kIHJlc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgdWlQcm9ncmVzcyB1bmxlc3MgcHJvZ3Jlc3Mgd291bGQgYmUgd3JvbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHVpUHJvZ3Jlc3MgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5hbmFseXNlU3RlcCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2tNaWNyb1N0YXRlQW5hbHlzZVB0bzNHUFA7IC8qIFdlIGdvIGJhY2sgdG8gYW5hbHl6ZSBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gc2VlIGlmIHRoZXJlIGlzIGEgbmV4dCBmaWxlIHRvIGNvbnZlcnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJDICEhISEhISEhICovCi0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtcy0+aXNDcmVhdGVkID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUlVFOyAvKiBUbyBhdm9pZCByZWNvbnZlcnRpbmcgaXQgaWYgYW5vdGhlciBTZW5kQ29tbWFuZCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsU3RvcENvbnZlcnRQaWN0dXJlVG8zZ3AoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qU1M6Ymxybnhwc3cjICAyMzQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRFUlJfRklMRV9JTlZBTElEX1BPU0lUSU9OKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTRVJSX05PX01PUkVfU1BBQ0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19TdGVwOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxTdG9wQ29udmVydFBpY3R1cmVUbzNncCByZXR1cm5lZCAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPID8gOiBUcmFuc2xhdGUgZXJyb3IgY29kZSBvZiBWU1MgdG8gYW4geFZTUyBlcnJvciBjb2RlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPmFuYWx5c2VTdGVwCi0gICAgICAgICAgICAgICAgICAgID09Ci0gICAgICAgICAgICAgICAgICAgIE00eFZTU19rTWljcm9TdGF0ZUFuYWx5emVNQ1MgKSAvKiBNQ1M6IGFuYWx5emluZyBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcyA9PSBNNE9TQV9OVUxMIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMgPSB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNQ1NwYXJhbXNMaXN0OyAvKiBDdXJyZW50IE1DUyBQYXJhbWV0ZXIgaXMgdGhlIGZpcnN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgb2YgdGhlIGxpc3QgKi8KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zICE9IE00T1NBX05VTEwgXAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7IC8qIEN1cnJlbnQgTUNTIFBhcmFtZXRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBsaXN0ICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEl0IG1lYW5zIHRoZXJlIGlzIG5vIG5leHQgaW1hZ2UgdG8gY29udmVydCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+YW5hbHlzZVN0ZXAgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1Nfa01pY3JvU3RhdGVBbmFseXNlUHRvM0dQUDsgLyogUmVpbml0IEFuYWx5emluZyBtaWNybyBzdGF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19rU3RhdGVPcGVuZWQ7IC8qIENoYW5nZSB4VlNTIHN0YXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX1dBUl9BTkFMWVpJTkdfRE9ORTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZF9zdGVwOyAvKiBFbmQgb2YgQW5hbHlzaXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPmFuYWx5c2VTdGVwID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1Nfa01pY3JvU3RhdGVBbmFseXNlUHRvM0dQUDsgLyogUmVpbml0IEFuYWx5emluZyBtaWNybyBzdGF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5tX3N0YXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1Nfa1N0YXRlT3BlbmVkOyAvKiBDaGFuZ2UgeFZTUyBzdGF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX1dBUl9BTkFMWVpJTkdfRE9ORTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kX3N0ZXA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogRW5kIG9mIEFuYWx5c2lzICovCi0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiB0aGlzIGZpbGUgaGFzIHRvIGJlIHRyYW5zY29kZWQgb3Igbm90ICovCi0gICAgICAgICAgICAgICAgICAgIC8qIElmIG5vdCwgd2UganVzdCByZXR1cm4gTTROT19FUlJPUiwgYW5kIGdvIHRvIG5leHQgZmlsZSAqLwotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+aXNDcmVhdGVkID09IE00T1NBX0ZBTFNFICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogT3BlbmluZyBNQ1MgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiByb3RhdGlvbkRlZ3JlZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxTdGFydFRyYW5zY29kaW5nKHhWU1NfY29udGV4dCwgJnJvdGF0aW9uRGVncmVlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1N0ZXA6IE00eFZTU19pbnRlcm5hbFN0YXJ0VHJhbnNjb2RpbmcgcmV0dXJuZWRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5kZXggPSB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT52aWRlb2NsaXBudW1iZXI7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBjdXRzIGFyZSBkb25lIGluIHRoZSBNQ1MsIHNvIHdlIG5lZWQgdG8gcmVwbGFjZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJlZ2luQ3V0VGltZSBhbmQgZW5kQ3V0VGltZSB0byBrZWVwIHRoZSBlbnRpcmUgdmlkZW8qLwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpbmRleF0tPnVpQmVnaW5DdXRUaW1lID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaW5kZXhdLT51aUVuZEN1dFRpbWUgPSAwOwotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfU3RlcDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbFN0YXJ0VHJhbnNjb2RpbmcgcmV0dXJuZWQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOyBNQ1MgY29udGV4dDogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NfQ3R4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPmFuYWx5c2VTdGVwID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1Nfa01pY3JvU3RhdGVUcmFuc2NvZGVNQ1M7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldGFpbiByb3RhdGlvbiBpbmZvIG9mIHRyaW1tZWQgLyB0cmFuc2NvZGVkIGZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaW5kZXhdLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudmlkZW9Sb3RhdGlvbkRlZ3JlZXMgPSByb3RhdGlvbkRlZ3JlZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPmFuYWx5c2VTdGVwCi0gICAgICAgICAgICAgICAgICAgID09IE00eFZTU19rTWljcm9TdGF0ZVRyYW5zY29kZU1DUyApCi0gICAgICAgICAgICAgICAgICAgIC8qIE1DUzogdHJhbnNjb2RpbmcgZmlsZSAqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRNQ1Nfc3RlcCh4VlNTX2NvbnRleHQtPnBNQ1NfQ3R4dCwgJnVpUHJvZ3Jlc3MpOwotICAgICAgICAgICAgICAgICAgICAvKlNTOmJscm54cHN3IyAgMjM0ICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRNQ1NfRVJSX05PTU9SRV9TUEFDRSkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NFUlJfTk9fTU9SRV9TUEFDRTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAoIGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGVyciAhPSBNNE1DU19XQVJfVFJBTlNDT0RJTkdfRE9ORSkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBUTyBCRSBDSEVDS0VEIE5PIExFQUtTICAhISEhISAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19TdGVwOiBNNE1DU19zdGVwIHJldHVybmVkIDB4JXhcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRPRE8gPyA6IFRyYW5zbGF0ZSBlcnJvciBjb2RlIG9mIE1DUyB0byBhbiB4VlNTIGVycm9yIGNvZGUgPyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBlcnIgPT0gTTRNQ1NfV0FSX1RSQU5TQ09ESU5HX0RPTkUgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPmN1cnJlbnRTdGVwKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBQNE1FMDAwMDMyNzY6IFdoZW4gYSBzdGVwIGlzIGNvbXBsZXRlLCBpbmNyZW1lbnQgY3VycmVudFN0ZXAgYW5kIHJlc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICB1aVByb2dyZXNzIHVubGVzcyBwcm9ncmVzcyB3b3VsZCBiZSB3cm9uZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgdWlQcm9ncmVzcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPmFuYWx5c2VTdGVwID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1Nfa01pY3JvU3RhdGVBbmFseXplTUNTOyAvKiBXZSBnbyBiYWNrIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5hbHl6ZSBwYXJhbWV0ZXJzIHRvIHNlZSBpZiB0aGVyZSBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIG5leHQgZmlsZSB0byB0cmFuc2NvZGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJDICEhISEhISEhISovCi0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5pc0NyZWF0ZWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSVUU7IC8qIFRvIGF2b2lkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb252ZXJ0aW5nIGl0IGlmIGFub3RoZXIgU2VuZENvbW1hbmQgaXMgY2FsbGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxTdG9wVHJhbnNjb2RpbmcoeFZTU19jb250ZXh0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1N0ZXA6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbFN0b3BUcmFuc2NvZGluZyByZXR1cm5lZCAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPID8gOiBUcmFuc2xhdGUgZXJyb3IgY29kZSBvZiBNQ1MgdG8gYW4geFZTUyBlcnJvciBjb2RlID8gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJCYWQgbWljcm8gc3RhdGUgaW4gYW5hbHl6aW5nIHN0YXRlIikKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIkJhZCBzdGF0ZSB3aGVuIGNhbGxpbmcgTTR4VlNTX1N0ZXAgZnVuY3Rpb24hIFN0YXRlIGlzICVkIiwKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPm1fc3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotZW5kX3N0ZXA6Ci0gICAgLyogQ29tcHV0ZSBwcm9ncmVzc2lvbiAqLwotICAgIGlmKCB4VlNTX2NvbnRleHQtPm5iU3RlcFRvdGFsICE9IDAgKQotICAgIHsKLSAgICAgICAgKnBQcm9ncmVzcyA9IChNNE9TQV9VSW50OCkoKCAoIHhWU1NfY29udGV4dC0+Y3VycmVudFN0ZXAgKiAxMDApIFwKLSAgICAgICAgICAgIC8gKHhWU1NfY29udGV4dC0+bmJTdGVwVG90YWwpKQotICAgICAgICAgICAgKyAodWlQcm9ncmVzcyAvICh4VlNTX2NvbnRleHQtPm5iU3RlcFRvdGFsKSkpOwotCi0gICAgICAgIGlmKCAqcFByb2dyZXNzID4gMTAwICkKLSAgICAgICAgewotICAgICAgICAgICAgKnBQcm9ncmVzcyA9IDEwMDsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAqcFByb2dyZXNzID0gMTAwOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfQ2xvc2VDb21tYW5kKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gZGVsZXRlcyBjdXJyZW50IGVkaXRpbmcgcHJvZmlsZSwgdW5hbGxvY2F0ZQotICogICAgICAgICAgICAgICAgcmVzc291cmNlcyBhbmQgY2hhbmdlIHhWU1MgaW50ZXJuYWwgc3RhdGUuCi0gKiBAbm90ZSAgICAgICAgQWZ0ZXIgdGhpcyBmdW5jdGlvbiwgdGhlIHVzZXIgY2FuIGNhbGwgYSBuZXcgTTR4VlNTX1NlbmRDb21tYW5kCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19DbG9zZUNvbW1hbmQoIE00T1NBX0NvbnRleHQgcENvbnRleHQgKQotewotICAgIE00eFZTU19Db250ZXh0ICp4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIC8qIENoZWNrIHN0YXRlICovCi0gICAgLyogRGVwZW5kaW5nIG9mIHRoZSBzdGF0ZSwgZGlmZmVyZW50cyB0aGluZ3MgaGF2ZSB0byBiZSBkb25lICovCi0gICAgc3dpdGNoKCB4VlNTX2NvbnRleHQtPm1fc3RhdGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNHhWU1Nfa1N0YXRlT3BlbmVkOgotICAgICAgICAgICAgLyogTm90aGluZyB0byBkbyBoZXJlICovCi0gICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxGcmVlU2F2aW5nKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rU3RhdGVTYXZpbmc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+ZWRpdGluZ1N0ZXAgPT0gTTR4VlNTX2tNaWNyb1N0YXRlRWRpdGluZyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDbG9zZUVkaXRlZEZpbGUoeFZTU19jb250ZXh0KTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBGaXggZm9yIGJscm54cHN3IzIzNC0tLS0+Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRFUlJfRklMRV9JTlZBTElEX1BPU0lUSU9OKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTRVJSX05PX01PUkVfU1BBQ0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX0Nsb3NlQ29tbWFuZDpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxDbG9zZUVkaXRlZEZpbGUgcmV0dXJuZWQgYW4gZXJyb3I6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSBhcmUgcmV0YWluaW5nIGVycm9yIGhlcmUgYW5kIHJldHVybmluZyBlcnJvciAgaW4gdGhlIGVuZCBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICBhcyB0byBhdmlvZCBtZW1vcnkgbGVhayovCi0gICAgICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5lZGl0aW5nU3RlcAotICAgICAgICAgICAgICAgICAgICA9PSBNNHhWU1Nfa01pY3JvU3RhdGVBdWRpb01peGluZyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDbG9zZUF1ZGlvTWl4ZWRGaWxlKHhWU1NfY29udGV4dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogRml4IGZvciBibHJueHBzdyMyMzQtLS0tPiovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyID09ICgoTTRPU0FfVUludDMyKU00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTikgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU0VSUl9OT19NT1JFX1NQQUNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19DbG9zZUNvbW1hbmQ6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsQ2xvc2VBdWRpb01peGVkRmlsZSByZXR1cm5lZCBhbiBlcnJvcjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSBhcmUgcmV0YWluaW5nIGVycm9yIGhlcmUgYW5kIHJldHVybmluZyBlcnJvciAgaW4gdGhlIGVuZCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZ1bmN0aW9uICBhcyB0byBhdmlvZCBtZW1vcnkgbGVhayovCi0gICAgICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiA8LS0tLUZpeCBmb3IgYmxybnhwc3cjMjM0Ki8KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxGcmVlU2F2aW5nKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgLyogV2UgZnJlZSB0aGlzIHBvaW50ZXIgb25seSBpZiBhIEJHTSB0cmFjayBpcyBwcmVzZW50LCBiZWNhdXNlIGluIHRoYXQgY2FzZSwKLSAgICAgICAgICAgICAgICB0aGlzIHBvaW50ZXIgb3ducyB0byB1cyAqLwotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgIT0gTTRPU0FfTlVMTCApIHsKLSAgICAgICAgICAgICAgICAgICAgLyppZihNNE9TQV9OVUxMICE9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0qLwotICAgICAgICAgICAgICAgICAgICAvKmlmKE00T1NBX05VTEwgIT0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfSovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1N0YXRlU2F2ZWQ6Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rU3RhdGVBbmFseXppbmc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+YW5hbHlzZVN0ZXAgPT0gTTR4VlNTX2tNaWNyb1N0YXRlQ29udmVydFB0bzNHUFAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBQdG8zR1BQIG1vZHVsZSAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxTdG9wQ29udmVydFBpY3R1cmVUbzNncCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAvKiBGaXggZm9yIGJscm54cHN3IzIzNC0tLS0+Ki8KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciA9PSAoKE00T1NBX1VJbnQzMilNNEVSUl9GSUxFX0lOVkFMSURfUE9TSVRJT04pICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NFUlJfTk9fTU9SRV9TUEFDRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfU3RlcDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsU3RvcENvbnZlcnRQaWN0dXJlVG8zZ3AgcmV0dXJuZWQgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSBhcmUgcmV0YWluaW5nIGVycm9yIGhlcmUgYW5kIHJldHVybmluZyBlcnJvciAgaW4gdGhlIGVuZCBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICBhcyB0byBhdmlvZCBtZW1vcnkgbGVhayovCi0gICAgICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogPC0tLS0tRml4IGZvciBibHJueHBzdyMyMzQ+Ki8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5hbmFseXNlU3RlcAotICAgICAgICAgICAgICAgICAgICA9PSBNNHhWU1Nfa01pY3JvU3RhdGVUcmFuc2NvZGVNQ1MgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBNQ1MgbW9kdWxlICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00TUNTX2Fib3J0KHhWU1NfY29udGV4dC0+cE1DU19DdHh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyogRml4IGZvciBibHJueHBzdyMyMzQtLS0tPiovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRFUlJfRklMRV9JTlZBTElEX1BPU0lUSU9OKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTRVJSX05PX01PUkVfU1BBQ0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1N0ZXA6IE00TUNTX2Fib3J0IHJldHVybmVkIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSBhcmUgcmV0YWluaW5nIGVycm9yIGhlcmUgYW5kIHJldHVybmluZyBlcnJvciAgaW4gdGhlIGVuZCBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICBhcyB0byBhdmlvZCBtZW1vcnkgbGVhayovCi0gICAgICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogPC0tLUZpeCBmb3IgYmxybnhwc3cjMjM0Ki8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIkJhZCBzdGF0ZSB3aGVuIGNhbGxpbmcgTTR4VlNTX0Nsb3NlQ29tbWFuZCBmdW5jdGlvbiEgU3RhdGUgaXMgJWQiLAotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLQotICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSA9IE00eFZTU19rU3RhdGVJbml0aWFsaXplZDsgLyogQ2hhbmdlIHhWU1Mgc3RhdGUgKi8KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfQ2xlYW5VcChNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIGRlbGV0ZXMgYWxsIHhWU1MgcmVzc291cmNlcwotICogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgTTR4VlNTX0Nsb3NlQ29tbWFuZC4KLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBub3QgYmUgY2FsbGVkIGF0IHRoaXMgdGltZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX0NsZWFuVXAoIE00T1NBX0NvbnRleHQgcENvbnRleHQgKQotewotICAgIE00eFZTU19Db250ZXh0ICp4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNE9TQV9UUkFDRTNfMCgiTTR4VlNTX0NsZWFuVXA6ZW50ZXJpbmciKTsKLQotICAgIC8qIENoZWNrIHN0YXRlICovCi0gICAgaWYoIHhWU1NfY29udGV4dC0+bV9zdGF0ZSAhPSBNNHhWU1Nfa1N0YXRlSW5pdGlhbGl6ZWQgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoXAotICAgICAgICAgICAgIkJhZCBzdGF0ZSB3aGVuIGNhbGxpbmcgTTR4VlNTX0NsZWFuVXAgZnVuY3Rpb24hIFN0YXRlIGlzICVkIixcCi0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPm1fc3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBVVEYgY29udmVyc2lvbjogZnJlZSB0ZW1wb3JhcnkgYnVmZmVyKi8KLSAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIKLSAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIpOwotICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciA9Ci0gICAgICAgICAgICBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGZyZWUoeFZTU19jb250ZXh0LT5wVGVtcFBhdGgpOwotICAgIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoID0gTTRPU0FfTlVMTDsKLQotICAgIGZyZWUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MpOwotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzID0gTTRPU0FfTlVMTDsKLQotICAgIGZyZWUoeFZTU19jb250ZXh0KTsKLSAgICB4VlNTX2NvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX1RSQUNFM18wKCJNNHhWU1NfQ2xlYW5VcDpsZWF2aW5nICIpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19HZXRWZXJzaW9uKE00X1ZlcnNpb25JbmZvICpwVmVyc2lvbikKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBnZXQgdGhlIHZlcnNpb24gb2YgdGhlIFZpZGVvIFN0dWRpbyAyLjEKLSAqCi0gKiBAcGFyYW0gICAgcFZlcnNpb24gICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHZlcnNpb24gaW5mbyBzdHJ1Y3QKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX0dldFZlcnNpb24oIE00X1ZlcnNpb25JbmZvICpwVmVyc2lvbiApCi17Ci0gICAgLyogSnVzdCB1c2VkIGZvciBhIGdyZXAgaW4gY29kZSAqLwotICAgIC8qIENIQU5HRV9WRVJTSU9OX0hFUkUgKi8KLSAgICBzdGF0aWMgY29uc3QgTTRPU0FfQ2hhciBjVmVyc2lvblsyNl0gPSAiTlhQU1dfVmlkZW9TdHVkaW8yMV8xXzNfMCI7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwVmVyc2lvbiApCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIHBWZXJzaW9uLT5tX21ham9yID0gTTRfeFZTU19NQUpPUjsKLSAgICBwVmVyc2lvbi0+bV9taW5vciA9IE00X3hWU1NfTUlOT1I7Ci0gICAgcFZlcnNpb24tPm1fcmV2aXNpb24gPSBNNF94VlNTX1JFVklTSU9OOwotICAgIHBWZXJzaW9uLT5tX3N0cnVjdFNpemUgPSBzaXplb2YoTTRfVmVyc2lvbkluZm8pOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00eFZTU19DcmVhdGVDbGlwU2V0dGluZ3MoKQotICogQGJyaWVmICAgIEFsbG93cyBmaWxsaW5nIGEgY2xpcCBzZXR0aW5ncyBzdHJ1Y3R1cmUgd2l0aCBkZWZhdWx0IHZhbHVlcwotICoKLSAqIEBub3RlICAgIFdBUk5JTkc6IHBDbGlwU2V0dGluZ3MtPkVmZmVjdHNbIF0gd2lsbCBiZSBhbGxvY2F0ZWQgaW4gdGhpcyBmdW5jdGlvbi4KLSAqICAgICAgICAgICAgICAgICAgIHBDbGlwU2V0dGluZ3MtPnBGaWxlICAgICAgd2lsbCBiZSBhbGxvY2F0ZWQgaW4gdGhpcyBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gICAgcENsaXBTZXR0aW5ncyAgICAgICAgKElOKSBQb2ludGVyIHRvIGEgdmFsaWQgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyBzdHJ1Y3R1cmUKLSAqIEBwYXJhbSAgIHBGaWxlICAgICAgICAgICAgICAgKElOKSBDbGlwIGZpbGUgbmFtZQotICogQHBhcmFtICAgZmlsZVBhdGhTaXplICAgICAgICAoSU4pIFNpemUgb2YgdGhlIGNsaXAgcGF0aCAobmVlZGVkIGZvciB0aGUgVVRGMTYgY29udmVyc2lvbikKLSAqIEBwYXJhbSAgICBuYkVmZmVjdHMgICAgICAgICAgIChJTikgTmIgb2YgZWZmZWN0IHNldHRpbmdzIHRvIGFsbG9jYXRlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfQ3JlYXRlQ2xpcFNldHRpbmdzKCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCAqcEZpbGUsIE00T1NBX1VJbnQzMiBmaWxlUGF0aFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggbmJFZmZlY3RzICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIE00T1NBX1RSQUNFM18xKCJNNHhWU1NfQ3JlYXRlQ2xpcFNldHRpbmdzIGNhbGxlZCB3aXRoIHBDbGlwU2V0dGluZ3M9MHglcCIsCi0gICAgICAgIHBDbGlwU2V0dGluZ3MpOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBTZXR0aW5ncyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00eFZTU19DcmVhdGVDbGlwU2V0dGluZ3M6IHBDbGlwU2V0dGluZ3MgaXMgTlVMTCIpOwotCi0gICAgLyogQ3JlYXRlIGluaGVyaXRlZCBWU1MzR1BQIHN0dWZmICovCi0gICAgLyplcnIgPSBNNFZTUzNHUFBfZWRpdENyZWF0ZUNsaXBTZXR0aW5ncyhwQ2xpcFNldHRpbmdzLCBwRmlsZSxuYkVmZmVjdHMpOyovCi0gICAgLypGQjogYWRkIGNsaXAgcGF0aCBzaXplIChuZWVkZWQgZm9yIFVURiAxNiBjb252ZXJzaW9uKSovCi0gICAgZXJyID0gTTRWU1MzR1BQX2VkaXRDcmVhdGVDbGlwU2V0dGluZ3MocENsaXBTZXR0aW5ncywgcEZpbGUsIGZpbGVQYXRoU2l6ZSwKLSAgICAgICAgbmJFZmZlY3RzKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX0NyZWF0ZUNsaXBTZXR0aW5ncyA6XAotICAgICAgICAgICAgICAgICAgICAgICBFUlJPUiBpbiBNNFZTUzNHUFBfZWRpdENyZWF0ZUNsaXBTZXR0aW5ncyA9IDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qIFNldCB0aGUgY2xpcCBzZXR0aW5ncyB0byBkZWZhdWx0ICovCi0gICAgcENsaXBTZXR0aW5ncy0+eFZTUy51aUJlZ2luQ3V0UGVyY2VudCA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+eFZTUy51aUVuZEN1dFBlcmNlbnQgPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPnhWU1MudWlEdXJhdGlvbiA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+eFZTUy5pc1Bhblpvb20gPSBNNE9TQV9GQUxTRTsKLSAgICBwQ2xpcFNldHRpbmdzLT54VlNTLlBhblpvb21Ub3BsZWZ0WGEgPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPnhWU1MuUGFuWm9vbVRvcGxlZnRZYSA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+eFZTUy5QYW5ab29tVG9wbGVmdFhiID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT54VlNTLlBhblpvb21Ub3BsZWZ0WWIgPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPnhWU1MuUGFuWm9vbVhhID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT54VlNTLlBhblpvb21YYiA9IDA7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00eFZTU19DcmVhdGVDbGlwU2V0dGluZ3MoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNHhWU1NfRHVwbGljYXRlQ2xpcFNldHRpbmdzKCkKLSAqIEBicmllZiAgICBEdXBsaWNhdGVzIGEgY2xpcCBzZXR0aW5ncyBzdHJ1Y3R1cmUsIHBlcmZvcm1pbmcgYWxsb2NhdGlvbnMgaWYgcmVxdWlyZWQKLSAqCi0gKiBAcGFyYW0gICAgcENsaXBTZXR0aW5nc0Rlc3QgICAgKElOKSBQb2ludGVyIHRvIGEgdmFsaWQgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyBzdHJ1Y3R1cmUKLSAqIEBwYXJhbSAgICBwQ2xpcFNldHRpbmdzT3JpZyAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzIHN0cnVjdHVyZQotICogQHBhcmFtICAgYkNvcHlFZmZlY3RzICAgICAgICAoSU4pIEZsYWcgdG8ga25vdyBpZiB3ZSBoYXZlIHRvIGR1cGxpY2F0ZSBlZmZlY3RzCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfRHVwbGljYXRlQ2xpcFNldHRpbmdzKCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcENsaXBTZXR0aW5nc0Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzT3JpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Cb29sIGJDb3B5RWZmZWN0cyApCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigKLSAgICAgICAgIk00eFZTU19EdXBsaWNhdGVDbGlwU2V0dGluZ3MgY2FsbGVkIHdpdGggZGVzdD0weCVwIHNyYz0weCVwIiwKLSAgICAgICAgcENsaXBTZXR0aW5nc0Rlc3QsIHBDbGlwU2V0dGluZ3NPcmlnKTsKLQotICAgIC8qIENoZWNrIGlucHV0IHBhcmFtZXRlciAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ2xpcFNldHRpbmdzRGVzdCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00eFZTU19EdXBsaWNhdGVDbGlwU2V0dGluZ3M6IHBDbGlwU2V0dGluZ3NEZXN0IGlzIE5VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBTZXR0aW5nc09yaWcpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNHhWU1NfRHVwbGljYXRlQ2xpcFNldHRpbmdzOiBwQ2xpcFNldHRpbmdzT3JpZyBpcyBOVUxMIik7Ci0KLSAgICAvKiBDYWxsIGluaGVyaXRlZCBWU1MzR1BQIGR1cGxpY2F0aW9uICovCi0gICAgZXJyID0gTTRWU1MzR1BQX2VkaXREdXBsaWNhdGVDbGlwU2V0dGluZ3MocENsaXBTZXR0aW5nc0Rlc3QsCi0gICAgICAgIHBDbGlwU2V0dGluZ3NPcmlnLCBiQ29weUVmZmVjdHMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfQ3JlYXRlQ2xpcFNldHRpbmdzIDpcCi0gICAgICAgICAgICAgICAgICAgICAgIEVSUk9SIGluIE00VlNTM0dQUF9lZGl0RHVwbGljYXRlQ2xpcFNldHRpbmdzID0gMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTR4VlNTX0R1cGxpY2F0ZUNsaXBTZXR0aW5ncygpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00eFZTU19GcmVlQ2xpcFNldHRpbmdzKCkKLSAqIEBicmllZiAgICBGcmVlIHRoZSBwb2ludGVycyBhbGxvY2F0ZWQgaW4gdGhlIENsaXBTZXR0aW5nIHN0cnVjdHVyZSAocEZpbGUsIEVmZmVjdHMsIC4uLikuCi0gKgotICogQHBhcmFtICAgIHBDbGlwU2V0dGluZ3MgICAgICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIE00VlNTM0dQUF9DbGlwU2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfRnJlZUNsaXBTZXR0aW5ncyggTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5ncyApCi17Ci0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBTZXR0aW5ncyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00eFZTU19GcmVlQ2xpcFNldHRpbmdzOiBwQ2xpcFNldHRpbmdzIGlzIE5VTEwiKTsKLQotICAgIC8qIEZyZWUgaW5oZXJpdGVkIFZTUzNHUFAgc3R1ZmYgKi8KLSAgICBNNFZTUzNHUFBfZWRpdEZyZWVDbGlwU2V0dGluZ3MocENsaXBTZXR0aW5ncyk7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19nZXRNQ1NDb250ZXh0KE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX0NvbnRleHQqIG1jc0NvbnRleHQpCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgTUNTIGNvbnRleHQgd2l0aGluIHRoZSB4VlNTIGludGVybmFsIGNvbnRleHQKLSAqIEBub3RlICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgVlNTIHN0YXRlIGhhcyBtb3ZlZCB0byBhbmFseXppbmcgc3RhdGUgb3IKLSAqIGJleW9uZAotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICBtY3NDb250ZXh0ICAgICAgICAoT1VUKSBQb2ludGVyIHRvIHBvaW50ZXIgb2YgbWNzIGNvbnRleHQgdG8gcmV0dXJuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfZ2V0TUNTQ29udGV4dCggTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0ICptY3NDb250ZXh0ICkKLXsKLSAgICBNNHhWU1NfQ29udGV4dCAqeFZTU19jb250ZXh0ID0gKE00eFZTU19Db250ZXh0ICopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlciAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00eFZTU19nZXRNQ1NDb250ZXh0OiBwQ29udGV4dCBpcyBOVUxMIik7Ci0KLSAgICBpZiggeFZTU19jb250ZXh0LT5tX3N0YXRlID09IE00eFZTU19rU3RhdGVJbml0aWFsaXplZCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2dldE1DU0NvbnRleHQ6IEJhZCBzdGF0ZSEgU3RhdGUgaXMgJWQiLFwKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAqbWNzQ29udGV4dCA9IHhWU1NfY29udGV4dC0+cE1DU19DdHh0OwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19nZXRWU1MzR1BQQ29udGV4dChNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0KiBtY3NDb250ZXh0KQotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIFZTUzNHUFAgY29udGV4dCB3aXRoaW4gdGhlIHhWU1MgaW50ZXJuYWwgY29udGV4dAotICogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgb25seSBhZnRlciBWU1Mgc3RhdGUgaGFzIG1vdmVkIHRvIEdlbmVyYXRpbmcgcHJldmlldwotICogICAgICAgICAgICAgIG9yIGJleW9uZAotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgIHZzczNncHBDb250ZXh0ICAgICAgICAoT1VUKSBQb2ludGVyIHRvIHBvaW50ZXIgb2YgdnNzM2dwcCBjb250ZXh0IHRvIHJldHVybgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBub3QgYmUgY2FsbGVkIGF0IHRoaXMgdGltZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2dldFZTUzNHUFBDb250ZXh0KCBNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0ICp2c3MzZ3BwQ29udGV4dCApCi17Ci0gICAgTTR4VlNTX0NvbnRleHQgKnhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCAqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNHhWU1NfZ2V0VlNTM0dQUENvbnRleHQ6IHBDb250ZXh0IGlzIE5VTEwiKTsKLQotICAgIGlmKCB4VlNTX2NvbnRleHQtPm1fc3RhdGUgPCBNNHhWU1Nfa1N0YXRlU2F2aW5nICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfZ2V0VlNTM0dQUENvbnRleHQ6IEJhZCBzdGF0ZSEgU3RhdGUgaXMgJWQiLFwKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAqdnNzM2dwcENvbnRleHQgPSB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdENvbnRleHQ7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgTTR4VlNTX2dldFZpZGVvRGVjb2RlckNhcGFiaWxpdGllcyhNNERFQ09ERVJfVmlkZW9EZWNvZGVycyAqKmRlY29kZXJzKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAvLyBDYWxsIHRoZSBkZWNvZGVyIGFwaSBkaXJlY3RseQotICAgIC8vIHRvIGdldCBhbGwgdGhlIHZpZGVvIGRlY29kZXIgY2FwYWJsaXRpZXMuCi0gICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0VmlkZW9EZWNvZGVyc0FuZENhcGFiaWxpdGllcyhkZWNvZGVycyk7Ci0gICAgcmV0dXJuIGVycjsKLX0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTR4VlNTX2ludGVybmFsLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000eFZTU19pbnRlcm5hbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NGE2ZjQwLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTR4VlNTX2ludGVybmFsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0ODg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNHhWU1NfaW50ZXJuYWwuYwotICogQGJyaWVmICAgIEludGVybmFsIGZ1bmN0aW9ucyBvZiBleHRlbmRlZCBWaWRlbyBTdHVkaW8gU2VydmljZSAoVmlkZW8gU3R1ZGlvIDIuMSkKLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX0NoYXJTdGFyLmgiCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0KLSNpbmNsdWRlICJNNFZTUzNHUFBfQVBJLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0Vycm9yQ29kZXMuaCIKLQotI2luY2x1ZGUgIk00eFZTU19BUEkuaCIKLSNpbmNsdWRlICJNNHhWU1NfSW50ZXJuYWwuaCIKLQotLypmb3IgcmdiMTYgY29sb3IgZWZmZWN0Ki8KLSNpbmNsdWRlICJNNFZJRklfRGVmaW5lcy5oIgotI2luY2x1ZGUgIk00VklGSV9DbGlwLmgiCi0KLS8qKgotICogY29tcG9uZW50IGluY2x1ZGVzICovCi0jaW5jbHVkZSAiTTRWRkxfdHJhbnNpdGlvbi5oIiAgICAgICAgICAgIC8qKjwgdmlkZW8gZWZmZWN0cyAqLwotCi0vKiBJbnRlcm5hbCBoZWFkZXIgZmlsZSBvZiBWU1MgaXMgaW5jbHVkZWQgYmVjYXVzZSBvZiBNTVMgdXNlIGNhc2UgKi8KLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxUeXBlcy5oIgotCi0vKkV4aWYgaGVhZGVyIGZpbGVzIHRvIGFkZCBpbWFnZSByZW5kZXJpbmcgc3VwcG9ydCAoY3JvcHBpbmcsIGJsYWNrIGJvcmRlcnMpKi8KLSNpbmNsdWRlICJNNEVYSUZDX0NvbW1vbkFQSS5oIgotLy8gU3RhZ2VGcmlnaHQgZW5jb2RlcnMgcmVxdWlyZSAlMTYgcmVzb2x1dGlvbgotI2luY2x1ZGUgIk00RU5DT0RFUl9jb21tb24uaCIKLQotI2RlZmluZSBUUkFOU1BBUkVOVF9DT0xPUiAweDdFMAotCi0vKiBQcm90b3R5cGUgb2YgTTRWSUZJX3hWU1NfUkdCNTY1dG9ZVVY0MjAgZnVuY3Rpb24gKGF2b2lkIGdyZWVuIGVmZmVjdCBvZiB0cmFuc3BhcmVuY3kgY29sb3IpICovCi1NNFZJRklfVUludDggTTRWSUZJX3hWU1NfUkdCNTY1dG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLQotLypzcGVjaWFsIE1DUyBmdW5jdGlvbiB1c2VkIG9ubHkgaW4gVmlkZW9BcnRpc3QgYW5kIFZpZGVvU3R1ZGlvIHRvIG9wZW4gdGhlIG1lZGlhIGluIHRoZSBub3JtYWwKLSBtb2RlLiBUaGF0IHdheSB0aGUgbWVkaWEgZHVyYXRpb24gaXMgYWNjdXJhdGUqLwotZXh0ZXJuIE00T1NBX0VSUiBNNE1DU19vcGVuX25vcm1hbE1vZGUoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVm9pZCogcEZpbGVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgSW5wdXRGaWxlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcEZpbGVPdXQsIE00T1NBX1ZvaWQqIHBUZW1wRmlsZSk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbFN0YXJ0VHJhbnNjb2RpbmcoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBNQ1MgKDNHUCB0cmFuc2NvZGVyKSB3aXRoIHRoZSBnaXZlbgotICogICAgICAgICAgICAgICAgcGFyYW1ldGVycwotICogQG5vdGUgICAgICAgIFRoZSB0cmFuc2NvZGluZyBwYXJhbWV0ZXJzIGFyZSBnaXZlbiBieSB0aGUgaW50ZXJuYWwgeFZTUyBjb250ZXh0LgotICogICAgICAgICAgICAgICAgVGhpcyBjb250ZXh0IGNvbnRhaW5zIGEgcG9pbnRlciBvbiB0aGUgY3VycmVudCBlbGVtZW50IG9mIHRoZQotICogICAgICAgICAgICAgICAgY2hhaW5lZCBsaXN0IG9mIE1DUyBwYXJhbWV0ZXJzLgotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbFN0YXJ0VHJhbnNjb2RpbmcoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiAqcm90YXRpb25EZWdyZWUpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE1DU19Db250ZXh0IG1jc19jb250ZXh0OwotICAgIE00TUNTX091dHB1dFBhcmFtcyBQYXJhbXM7Ci0gICAgTTRNQ1NfRW5jb2RpbmdQYXJhbXMgUmF0ZXM7Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0gICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgY2xpcFByb3BzOwotCi0gICAgZXJyID0gTTRNQ1NfaW5pdCgmbWNzX2NvbnRleHQsIHhWU1NfY29udGV4dC0+cEZpbGVSZWFkUHRyLCB4VlNTX2NvbnRleHQtPnBGaWxlV3JpdGVQdHIpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkVycm9yIGluIE00TUNTX2luaXQ6IDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGVyciA9IE00TUNTX29wZW4obWNzX2NvbnRleHQsIHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPnBGaWxlSW4sCi0gICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5JbnB1dEZpbGVUeXBlLAotICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPnBGaWxlT3V0LAotICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPnBGaWxlVGVtcCk7Ci0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkVycm9yIGluIE00TUNTX29wZW46IDB4JXgiLCBlcnIpOwotICAgICAgICBNNE1DU19hYm9ydChtY3NfY29udGV4dCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqIEdldCB0aGUgY2xpcCBwcm9wZXJ0aWVzCi0gICAgICovCi0gICAgZXJyID0gTTRNQ1NfZ2V0SW5wdXRGaWxlUHJvcGVydGllcyhtY3NfY29udGV4dCwgJmNsaXBQcm9wcyk7Ci0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJFcnJvciBpbiBNNE1DU19nZXRJbnB1dEZpbGVQcm9wZXJ0aWVzOiAweCV4IiwgZXJyKTsKLSAgICAgICAgTTRNQ1NfYWJvcnQobWNzX2NvbnRleHQpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICAqcm90YXRpb25EZWdyZWUgPSBjbGlwUHJvcHMudmlkZW9Sb3RhdGlvbkRlZ3JlZXM7Ci0KLSAgICAvKioKLSAgICAgKiBGaWxsIE1DUyBwYXJhbWV0ZXJzIHdpdGggdGhlIHBhcmFtZXRlcnMgY29udGFpbmVkIGluIHRoZSBjdXJyZW50IGVsZW1lbnQgb2YgdGhlCi0gICAgICAgTUNTIHBhcmFtZXRlcnMgY2hhaW5lZCBsaXN0ICovCi0gICAgUGFyYW1zLk91dHB1dEZpbGVUeXBlID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+T3V0cHV0RmlsZVR5cGU7Ci0gICAgUGFyYW1zLk91dHB1dFZpZGVvRm9ybWF0ID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+T3V0cHV0VmlkZW9Gb3JtYXQ7Ci0gICAgUGFyYW1zLm91dHB1dFZpZGVvUHJvZmlsZT0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+b3V0cHV0VmlkZW9Qcm9maWxlOwotICAgIFBhcmFtcy5vdXRwdXRWaWRlb0xldmVsID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+b3V0cHV0VmlkZW9MZXZlbDsKLSAgICBQYXJhbXMuT3V0cHV0VmlkZW9GcmFtZVNpemUgPSB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZTsKLSAgICBQYXJhbXMuT3V0cHV0VmlkZW9GcmFtZVJhdGUgPSB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lUmF0ZTsKLSAgICBQYXJhbXMuT3V0cHV0QXVkaW9Gb3JtYXQgPSB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdDsKLSAgICBQYXJhbXMuT3V0cHV0QXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5PdXRwdXRBdWRpb1NhbXBsaW5nRnJlcXVlbmN5OwotICAgIFBhcmFtcy5iQXVkaW9Nb25vID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+YkF1ZGlvTW9ubzsKLSAgICBQYXJhbXMucE91dHB1dFBDTWZpbGUgPSBNNE9TQV9OVUxMOwotICAgIC8qRkIgMjAwOC8xMC8yMDogYWRkIG1lZGlhIHJlbmRlcmluZyBwYXJhbWV0ZXIgdG8ga2VlcCBhc3BlY3QgcmF0aW8qLwotICAgIHN3aXRjaCh4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5NZWRpYVJlbmRlcmluZykKLSAgICB7Ci0gICAgY2FzZSBNNHhWU1Nfa1Jlc2l6aW5nOgotICAgICAgICBQYXJhbXMuTWVkaWFSZW5kZXJpbmcgPSBNNE1DU19rUmVzaXppbmc7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTR4VlNTX2tDcm9wcGluZzoKLSAgICAgICAgUGFyYW1zLk1lZGlhUmVuZGVyaW5nID0gTTRNQ1Nfa0Nyb3BwaW5nOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00eFZTU19rQmxhY2tCb3JkZXJzOgotICAgICAgICBQYXJhbXMuTWVkaWFSZW5kZXJpbmcgPSBNNE1DU19rQmxhY2tCb3JkZXJzOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgLyoqLwotICAgIC8vIG5ldyBwYXJhbXMgYWZ0ZXIgaW50ZWdyYXRpbmcgTUNTIDIuMAotICAgIC8vIFNldCB0aGUgbnVtYmVyIG9mIGF1ZGlvIGVmZmVjdHM7IDAgZm9yIG5vdy4KLSAgICBQYXJhbXMubmJFZmZlY3RzID0gMDsKLQotICAgIC8vIFNldCB0aGUgYXVkaW8gZWZmZWN0OyBudWxsIGZvciBub3cuCi0gICAgUGFyYW1zLnBFZmZlY3RzID0gTlVMTDsKLQotICAgIC8vIFNldCB0aGUgYXVkaW8gZWZmZWN0OyBudWxsIGZvciBub3cuCi0gICAgUGFyYW1zLmJEaXNjYXJkRXhpZiA9IE00T1NBX0ZBTFNFOwotCi0gICAgLy8gU2V0IHRoZSBhdWRpbyBlZmZlY3Q7IG51bGwgZm9yIG5vdy4KLSAgICBQYXJhbXMuYkFkanVzdE9yaWVudGF0aW9uID0gTTRPU0FfRkFMU0U7Ci0gICAgLy8gbmV3IHBhcmFtcyBhZnRlciBpbnRlZ3JhdGluZyBNQ1MgMi4wCi0KLSAgICAvKioKLSAgICAgKiBTZXQgb3V0cHV0IHBhcmFtZXRlcnMgKi8KLSAgICBlcnIgPSBNNE1DU19zZXRPdXRwdXRQYXJhbXMobWNzX2NvbnRleHQsICZQYXJhbXMpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJFcnJvciBpbiBNNE1DU19zZXRPdXRwdXRQYXJhbXM6IDB4JXgiLCBlcnIpOwotICAgICAgICBNNE1DU19hYm9ydChtY3NfY29udGV4dCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgUmF0ZXMuT3V0cHV0VmlkZW9CaXRyYXRlID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlOwotICAgIFJhdGVzLk91dHB1dEF1ZGlvQml0cmF0ZSA9IHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPk91dHB1dEF1ZGlvQml0cmF0ZTsKLSAgICBSYXRlcy5CZWdpbkN1dFRpbWUgPSAwOwotICAgIFJhdGVzLkVuZEN1dFRpbWUgPSAwOwotICAgIFJhdGVzLk91dHB1dEZpbGVTaXplID0gMDsKLQotICAgIC8qRkI6IHRyYW5zY29kaW5nIHBlciBwYXJ0cyovCi0gICAgUmF0ZXMuQmVnaW5DdXRUaW1lID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+QmVnaW5DdXRUaW1lOwotICAgIFJhdGVzLkVuZEN1dFRpbWUgPSB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5FbmRDdXRUaW1lOwotICAgIFJhdGVzLk91dHB1dFZpZGVvVGltZXNjYWxlID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+T3V0cHV0VmlkZW9UaW1lc2NhbGU7Ci0KLSAgICBlcnIgPSBNNE1DU19zZXRFbmNvZGluZ1BhcmFtcyhtY3NfY29udGV4dCwgJlJhdGVzKTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiRXJyb3IgaW4gTTRNQ1Nfc2V0RW5jb2RpbmdQYXJhbXM6IDB4JXgiLCBlcnIpOwotICAgICAgICBNNE1DU19hYm9ydChtY3NfY29udGV4dCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gTTRNQ1NfY2hlY2tQYXJhbXNBbmRTdGFydChtY3NfY29udGV4dCk7Ci0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkVycm9yIGluIE00TUNTX2NoZWNrUGFyYW1zQW5kU3RhcnQ6IDB4JXgiLCBlcnIpOwotICAgICAgICBNNE1DU19hYm9ydChtY3NfY29udGV4dCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2F2ZSBNQ1MgY29udGV4dCB0byBiZSBhYmxlIHRvIGNhbGwgTUNTIHN0ZXAgZnVuY3Rpb24gaW4gTTR4VlNTX3N0ZXAgZnVuY3Rpb24gKi8KLSAgICB4VlNTX2NvbnRleHQtPnBNQ1NfQ3R4dCA9IG1jc19jb250ZXh0OwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxTdG9wVHJhbnNjb2RpbmcoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBjbGVhbnMgdXAgTUNTICgzR1AgdHJhbnNjb2RlcikKLSAqIEBub3RlCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsU3RvcFRyYW5zY29kaW5nKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIGVyciA9IE00TUNTX2Nsb3NlKHhWU1NfY29udGV4dC0+cE1DU19DdHh0KTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsU3RvcFRyYW5zY29kaW5nOiBFcnJvciBpbiBNNE1DU19jbG9zZTogMHgleCIsIGVycik7Ci0gICAgICAgIE00TUNTX2Fib3J0KHhWU1NfY29udGV4dC0+cE1DU19DdHh0KTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGcmVlIHRoaXMgTUNTIGluc3RhbmNlICovCi0gICAgZXJyID0gTTRNQ1NfY2xlYW5VcCh4VlNTX2NvbnRleHQtPnBNQ1NfQ3R4dCk7Ci0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbFN0b3BUcmFuc2NvZGluZzogRXJyb3IgaW4gTTRNQ1NfY2xlYW5VcDogMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgeFZTU19jb250ZXh0LT5wTUNTX0N0eHQgPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwKE00T1NBX1ZvaWQqIHBGaWxlSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVSZWFkUHRyLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcEltYWdlUGxhbmVzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHdpZHRoLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgaGVpZ2h0KTsKLSAqIEBicmllZiAgICBJdCBDb3ZlcnRzIGFuZCByZXNpemVzIGEgQVJHQjg4ODggaW1hZ2UgdG8gWVVWNDIwCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBGaWxlSW4gICAgICAgICAgICAoSU4pIFRoZSBJbWFnZSBpbnB1dCBmaWxlCi0gKiBAcGFyYW0gICAgcEZpbGVSZWFkUHRyICAgIChJTikgUG9pbnRlciBvbiBmaWxlc3lzdGVtIGZ1bmN0aW9ucwotICogQHBhcmFtICAgIHBJbWFnZVBsYW5lcyAgICAoSU4vT1VUKSBQb2ludGVyIG9uIFlVVjQyMCBvdXRwdXQgcGxhbmVzIGFsbG9jYXRlZCBieSB0aGUgdXNlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJHQjg4ODggaW1hZ2UgIHdpbGwgYmUgY29udmVydGVkIGFuZCByZXNpemVkICB0byBvdXRwdXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZVVY0MjAgcGxhbmUgc2l6ZQotICpAcGFyYW0gICAgd2lkdGggICAgICAgIChJTikgd2lkdGggb2YgdGhlIEFSR0I4ODg4Ci0gKkBwYXJhbSAgICBoZWlnaHQgICAgICAgICAgICAoSU4pIGhlaWdodCBvZiB0aGUgQVJHQjg4ODgKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6IG1lbW9yeSBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwKE00T1NBX1ZvaWQqIHBGaWxlSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbWFnZVBsYW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgd2lkdGgsTTRPU0FfVUludDMyIGhlaWdodCkKLXsKLSAgICBNNE9TQV9Db250ZXh0IHBBUkdCSW47Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgcmdiUGxhbmUxICxyZ2JQbGFuZTI7Ci0gICAgTTRPU0FfVUludDMyIGZyYW1lU2l6ZV9hcmdiPSh3aWR0aCAqIGhlaWdodCAqIDQpOwotICAgIE00T1NBX1VJbnQzMiBmcmFtZVNpemUgPSAod2lkdGggKiBoZWlnaHQgKiAzKTsgLy9TaXplIG9mIFJHQjg4OCBkYXRhLgotICAgIE00T1NBX1VJbnQzMiBpID0gMCxqPSAwOwotICAgIE00T1NBX0VSUiBlcnI9TTROT19FUlJPUjsKLQotCi0gICAgTTRPU0FfVUludDggKnBUbXBEYXRhID0gKE00T1NBX1VJbnQ4KikgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGZyYW1lU2l6ZV9hcmdiLAotICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIqKSJJbWFnZSBhcmdiIGRhdGEiKTsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIEVudGVyaW5nIDoiKTsKLSAgICBpZihwVG1wRGF0YSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCA6XAotICAgICAgICAgICAgRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgSW1hZ2UgY2xpcCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIDp3aWR0aCBhbmQgaGVpZ2h0ICVkICVkIiwKLSAgICAgICAgd2lkdGggLGhlaWdodCk7Ci0gICAgLyogR2V0IGZpbGUgc2l6ZSAobWFuZGF0b3J5IGZvciBjaHVuayBkZWNvZGluZykgKi8KLSAgICBlcnIgPSBwRmlsZVJlYWRQdHItPm9wZW5SZWFkKCZwQVJHQkluLCBwRmlsZUluLCBNNE9TQV9rRmlsZVJlYWQpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIDpcCi0gICAgICAgICAgICBDYW4ndCBvcGVuIGlucHV0IEFSR0I4ODg4IGZpbGUgJXMsIGVycm9yOiAweCV4XG4iLHBGaWxlSW4sIGVycik7Ci0gICAgICAgIGZyZWUocFRtcERhdGEpOwotICAgICAgICBwVG1wRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICB9Ci0KLSAgICBlcnIgPSBwRmlsZVJlYWRQdHItPnJlYWREYXRhKHBBUkdCSW4sKE00T1NBX01lbUFkZHI4KXBUbXBEYXRhLCAmZnJhbWVTaXplX2FyZ2IpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIENhbid0IGNsb3NlIEFSR0I4ODg4XAotICAgICAgICAgICAgIGZpbGUgJXMsIGVycm9yOiAweCV4XG4iLHBGaWxlSW4sIGVycik7Ci0gICAgICAgIHBGaWxlUmVhZFB0ci0+Y2xvc2VSZWFkKHBBUkdCSW4pOwotICAgICAgICBmcmVlKHBUbXBEYXRhKTsKLSAgICAgICAgcFRtcERhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgfQotCi0gICAgZXJyID0gcEZpbGVSZWFkUHRyLT5jbG9zZVJlYWQocEFSR0JJbik7Ci0gICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTR4VlNTX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgQ2FuJ3QgY2xvc2UgQVJHQjg4ODggXAotICAgICAgICAgICAgIGZpbGUgJXMsIGVycm9yOiAweCV4XG4iLHBGaWxlSW4sIGVycik7Ci0gICAgICAgIGZyZWUocFRtcERhdGEpOwotICAgICAgICBwVG1wRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICB9Ci0KLSAgICByZ2JQbGFuZTEucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoZnJhbWVTaXplLCBNNFZTLAotICAgICAgICAgKE00T1NBX0NoYXIqKSJJbWFnZSBjbGlwIFJHQjg4OCBkYXRhIik7Ci0gICAgaWYocmdiUGxhbmUxLnBhY19kYXRhID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTR4VlNTX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgXAotICAgICAgICAgICAgRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgSW1hZ2UgY2xpcCIpOwotICAgICAgICBmcmVlKHBUbXBEYXRhKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgICAgICByZ2JQbGFuZTEudV9oZWlnaHQgPSBoZWlnaHQ7Ci0gICAgICAgIHJnYlBsYW5lMS51X3dpZHRoID0gd2lkdGg7Ci0gICAgICAgIHJnYlBsYW5lMS51X3N0cmlkZSA9IHdpZHRoKjM7Ci0gICAgICAgIHJnYlBsYW5lMS51X3RvcGxlZnQgPSAwOwotCi0KLSAgICAvKiogUmVtb3ZlIHRoZSBhbHBoYSBjaGFubmVsICovCi0gICAgZm9yIChpPTAsIGogPSAwOyBpIDwgZnJhbWVTaXplX2FyZ2I7IGkrKykgewotICAgICAgICBpZiAoKGkgJSA0KSA9PSAwKSBjb250aW51ZTsKLSAgICAgICAgcmdiUGxhbmUxLnBhY19kYXRhW2pdID0gcFRtcERhdGFbaV07Ci0gICAgICAgIGorKzsKLSAgICB9Ci0gICAgICAgIGZyZWUocFRtcERhdGEpOwotCi0gICAgLyogVG8gQ2hlY2sgaWYgcmVzaXppbmcgaXMgcmVxdWlyZWQgd2l0aCBjb2xvciBjb252ZXJzaW9uICovCi0gICAgaWYod2lkdGggIT0gcEltYWdlUGxhbmVzLT51X3dpZHRoIHx8IGhlaWdodCAhPSBwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0KQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIFJlc2l6aW5nIDoiKTsKLSAgICAgICAgZnJhbWVTaXplID0gICggcEltYWdlUGxhbmVzLT51X3dpZHRoICogcEltYWdlUGxhbmVzLT51X2hlaWdodCAqIDMpOwotICAgICAgICByZ2JQbGFuZTIucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoZnJhbWVTaXplLCBNNFZTLAotICAgICAgICAgICAgIChNNE9TQV9DaGFyKikiSW1hZ2UgY2xpcCBSR0I4ODggZGF0YSIpOwotICAgICAgICBpZihyZ2JQbGFuZTIucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEltYWdlIGNsaXAiKTsKLSAgICAgICAgICAgIGZyZWUocFRtcERhdGEpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgICAgICByZ2JQbGFuZTIudV9oZWlnaHQgPSAgcEltYWdlUGxhbmVzLT51X2hlaWdodDsKLSAgICAgICAgICAgIHJnYlBsYW5lMi51X3dpZHRoID0gcEltYWdlUGxhbmVzLT51X3dpZHRoOwotICAgICAgICAgICAgcmdiUGxhbmUyLnVfc3RyaWRlID0gcEltYWdlUGxhbmVzLT51X3dpZHRoKjM7Ci0gICAgICAgICAgICByZ2JQbGFuZTIudV90b3BsZWZ0ID0gMDsKLQotICAgICAgICAvKiBSZXNpemluZyBSR0I4ODggdG8gUkdCODg4ICovCi0gICAgICAgIGVyciA9IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjg4OHRvUkdCODg4KE00T1NBX05VTEwsICZyZ2JQbGFuZTEsICZyZ2JQbGFuZTIpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoImVycm9yIHdoZW4gY29udmVydGluZyBmcm9tIFJlc2l6ZSBSR0I4ODggdG8gUkdCODg4OiAweCV4XG4iLCBlcnIpOwotICAgICAgICAgICAgZnJlZShyZ2JQbGFuZTIucGFjX2RhdGEpOwotICAgICAgICAgICAgZnJlZShyZ2JQbGFuZTEucGFjX2RhdGEpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICAvKkNvbnZlcnRpbmcgUmVzaXplZCBSR0I4ODggdG8gWVVWNDIwICovCi0gICAgICAgIGVyciA9IE00VklGSV9SR0I4ODh0b1lVVjQyMChNNE9TQV9OVUxMLCAmcmdiUGxhbmUyLCBwSW1hZ2VQbGFuZXMpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoImVycm9yIHdoZW4gY29udmVydGluZyBmcm9tIFJHQjg4OCB0byBZVVY6IDB4JXhcbiIsIGVycik7Ci0gICAgICAgICAgICBmcmVlKHJnYlBsYW5lMi5wYWNfZGF0YSk7Ci0gICAgICAgICAgICBmcmVlKHJnYlBsYW5lMS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgICAgICBmcmVlKHJnYlBsYW5lMi5wYWNfZGF0YSk7Ci0gICAgICAgICAgICBmcmVlKHJnYlBsYW5lMS5wYWNfZGF0YSk7Ci0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJSR0IgdG8gWVVWIGRvbmUiKTsKLQotCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCBOTyAgUmVzaXppbmcgOiIpOwotICAgICAgICBlcnIgPSBNNFZJRklfUkdCODg4dG9ZVVY0MjAoTTRPU0FfTlVMTCwgJnJnYlBsYW5lMSwgcEltYWdlUGxhbmVzKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJlcnJvciB3aGVuIGNvbnZlcnRpbmcgZnJvbSBSR0IgdG8gWVVWOiAweCV4XG4iLCBlcnIpOwotICAgICAgICB9Ci0gICAgICAgICAgICBmcmVlKHJnYlBsYW5lMS5wYWNfZGF0YSk7Ci0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJSR0IgdG8gWVVWIGRvbmUiKTsKLSAgICB9Ci1jbGVhbnVwOgotICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCBsZWF2aW5nIDoiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4ODh0b1lVVjQyMChNNE9TQV9Wb2lkKiBwRmlsZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZFB0ciwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbWFnZVBsYW5lcywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB3aWR0aCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGhlaWdodCk7Ci0gKiBAYnJpZWYgICAgSXQgQ292ZXJ0cyBhIEFSR0I4ODg4IGltYWdlIHRvIFlVVjQyMAotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwRmlsZUluICAgICAgICAgICAgKElOKSBUaGUgSW1hZ2UgaW5wdXQgZmlsZQotICogQHBhcmFtICAgIHBGaWxlUmVhZFB0ciAgICAoSU4pIFBvaW50ZXIgb24gZmlsZXN5c3RlbSBmdW5jdGlvbnMKLSAqIEBwYXJhbSAgICBwSW1hZ2VQbGFuZXMgICAgKElOL09VVCkgUG9pbnRlciBvbiBZVVY0MjAgb3V0cHV0IHBsYW5lcyBhbGxvY2F0ZWQgYnkgdGhlIHVzZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSR0I4ODg4IGltYWdlICB3aWxsIGJlIGNvbnZlcnRlZCBhbmQgcmVzaXplZCAgdG8gb3V0cHV0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBZVVY0MjAgcGxhbmUgc2l6ZQotICogQHBhcmFtICAgIHdpZHRoICAgICAgICAoSU4pIHdpZHRoIG9mIHRoZSBBUkdCODg4OAotICogQHBhcmFtICAgIGhlaWdodCAgICAgICAgICAgIChJTikgaGVpZ2h0IG9mIHRoZSBBUkdCODg4OAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogbWVtb3J5IGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODg4dG9ZVVY0MjAoTTRPU0FfVm9pZCogcEZpbGVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSoqIHBJbWFnZVBsYW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgd2lkdGgsTTRPU0FfVUludDMyIGhlaWdodCkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqeXV2UGxhbmUgPSBNNE9TQV9OVUxMOwotCi0gICAgeXV2UGxhbmUgPSAoTTRWSUZJX0ltYWdlUGxhbmUqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygzKnNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSksCi0gICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIqKSJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVY6IE91dHB1dCBwbGFuZSBZVVYiKTsKLSAgICBpZih5dXZQbGFuZSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCA6XAotICAgICAgICAgICAgRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgSW1hZ2UgY2xpcCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIHl1dlBsYW5lWzBdLnVfaGVpZ2h0ID0gaGVpZ2h0OwotICAgIHl1dlBsYW5lWzBdLnVfd2lkdGggPSB3aWR0aDsKLSAgICB5dXZQbGFuZVswXS51X3N0cmlkZSA9IHdpZHRoOwotICAgIHl1dlBsYW5lWzBdLnVfdG9wbGVmdCA9IDA7Ci0gICAgeXV2UGxhbmVbMF0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoeXV2UGxhbmVbMF0udV9oZWlnaHQgXAotICAgICAgICAqIHl1dlBsYW5lWzBdLnVfd2lkdGggKiAxLjUsIE00VlMsIChNNE9TQV9DaGFyKikiaW1hZ2VDbGlwIFlVViBkYXRhIik7Ci0KLSAgICB5dXZQbGFuZVsxXS51X2hlaWdodCA9IHl1dlBsYW5lWzBdLnVfaGVpZ2h0ID4+MTsKLSAgICB5dXZQbGFuZVsxXS51X3dpZHRoID0geXV2UGxhbmVbMF0udV93aWR0aCA+PiAxOwotICAgIHl1dlBsYW5lWzFdLnVfc3RyaWRlID0geXV2UGxhbmVbMV0udV93aWR0aDsKLSAgICB5dXZQbGFuZVsxXS51X3RvcGxlZnQgPSAwOwotICAgIHl1dlBsYW5lWzFdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopKHl1dlBsYW5lWzBdLnBhY19kYXRhICsgeXV2UGxhbmVbMF0udV9oZWlnaHQgXAotICAgICAgICAqIHl1dlBsYW5lWzBdLnVfd2lkdGgpOwotCi0gICAgeXV2UGxhbmVbMl0udV9oZWlnaHQgPSB5dXZQbGFuZVswXS51X2hlaWdodCA+PjE7Ci0gICAgeXV2UGxhbmVbMl0udV93aWR0aCA9IHl1dlBsYW5lWzBdLnVfd2lkdGggPj4gMTsKLSAgICB5dXZQbGFuZVsyXS51X3N0cmlkZSA9IHl1dlBsYW5lWzJdLnVfd2lkdGg7Ci0gICAgeXV2UGxhbmVbMl0udV90b3BsZWZ0ID0gMDsKLSAgICB5dXZQbGFuZVsyXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKSh5dXZQbGFuZVsxXS5wYWNfZGF0YSArIHl1dlBsYW5lWzFdLnVfaGVpZ2h0IFwKLSAgICAgICAgKiB5dXZQbGFuZVsxXS51X3dpZHRoKTsKLSAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCggcEZpbGVJbixwRmlsZVJlYWRQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2UGxhbmUsIHdpZHRoLCBoZWlnaHQpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIHJldHVybiBlcnJvcjogMHgleFxuIiwgZXJyKTsKLSAgICAgICAgZnJlZSh5dXZQbGFuZSk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgICAgICpwSW1hZ2VQbGFuZXMgPSB5dXZQbGFuZTsKLQotICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4ODh0b1lVVjQyMCA6TGVhdmluZyIpOwotICAgIHJldHVybiBlcnI7Ci0KLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdCAoTTRPU0FfVm9pZCogcFBpY3R1cmVDdHh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbWFnZVBsYW5lcywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiogcFBpY3R1cmVEdXJhdGlvbik7Ci0gKiBAYnJpZWYgICAgSXQgZmVlZHMgdGhlIFBUTzNHUFAgd2l0aCBZVVY0MjAgcGljdHVyZXMuCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIGlzIGdpdmVuIHRvIHRoZSBQVE8zR1BQIGluIHRoZSBNNFBUTzNHUFBfUGFyYW1zIHN0cnVjdHVyZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgVGhlIGludGVncmF0b3Igb3duIGNvbnRleHQKLSAqIEBwYXJhbSAgICBwSW1hZ2VQbGFuZXMoSU4vT1VUKSBQb2ludGVyIHRvIGFuIGFycmF5IG9mIHRocmVlIHZhbGlkIGltYWdlIHBsYW5lcwotICogQHBhcmFtICAgIHBQaWN0dXJlRHVyYXRpb24oT1VUKSBEdXJhdGlvbiBvZiB0aGUgcmV0dXJuZWQgcGljdHVyZQotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRQVE8zR1BQX1dBUl9MQVNUX1BJQ1RVUkU6IFRoZSByZXR1cm5lZCBpbWFnZSBpcyB0aGUgbGFzdCBvbmUKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdChNNE9TQV9Wb2lkKiBwUGljdHVyZUN0eHQsIE00VklGSV9JbWFnZVBsYW5lKiBwSW1hZ2VQbGFuZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRG91YmxlKiBwUGljdHVyZUR1cmF0aW9uKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQ4ICAgIGxhc3RfZnJhbWVfZmxhZyA9IDA7Ci0gICAgTTR4VlNTX1BpY3R1cmVDYWxsYmFja0N0eHQqIHBDID0gKE00eFZTU19QaWN0dXJlQ2FsbGJhY2tDdHh0KikgKHBQaWN0dXJlQ3R4dCk7Ci0KLSAgICAvKlVzZWQgZm9yIHBhbiZ6b29tKi8KLSAgICBNNE9TQV9VSW50OCB0ZW1wUGFuem9vbVhhID0gMDsKLSAgICBNNE9TQV9VSW50OCB0ZW1wUGFuem9vbVhiID0gMDsKLSAgICBNNEFJUl9QYXJhbXMgUGFyYW1zOwotICAgIC8qKi8KLQotICAgIC8qVXNlZCBmb3IgY3JvcHBpbmcgYW5kIGJsYWNrIGJvcmRlcnMqLwotICAgIE00T1NBX0NvbnRleHQgICAgcFBpY3R1cmVDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gICAgcGljdHVyZVNpemUgPSAwIDsKLSAgICBNNE9TQV9VSW50OCogICAgcGljdHVyZUJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgLy9NNEVYSUZDX0NvbnRleHQgcEV4aWZDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBNNEVYSUZDX0Jhc2ljVGFncyBwQmFzaWNUYWdzOwotICAgIE00VklGSV9JbWFnZVBsYW5lIHBJbWFnZVBsYW5lczEgPSBwSW1hZ2VQbGFuZXNbMF07Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgcEltYWdlUGxhbmVzMiA9IHBJbWFnZVBsYW5lc1sxXTsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSBwSW1hZ2VQbGFuZXMzID0gcEltYWdlUGxhbmVzWzJdOwotICAgIC8qKi8KLQotICAgIC8qKgotICAgICAqIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEw9PXBQaWN0dXJlQ3R4dCksICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdDogcFBpY3R1cmVDdHh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEw9PXBJbWFnZVBsYW5lcyksICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdDogcEltYWdlUGxhbmVzIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEw9PXBQaWN0dXJlRHVyYXRpb24pLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdDogcFBpY3R1cmVEdXJhdGlvbiBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3QgOkVudGVyaW5nIik7Ci0gICAgLypQUiBQNE1FMDAwMDMxODEgSW4gY2FzZSB0aGUgaW1hZ2UgbnVtYmVyIGlzIDAsIHBhbiZ6b29tIGNhbiBub3QgYmUgdXNlZCovCi0gICAgaWYoTTRPU0FfVFJVRSA9PSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+aXNQYW5ab29tICYmIHBDLT5tX05iSW1hZ2UgPT0gMCkKLSAgICB7Ci0gICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5pc1Bhblpvb20gPSBNNE9TQV9GQUxTRTsKLSAgICB9Ci0KLSAgICAvKklmIG5vIGNyb3BwaW5nL2JsYWNrIGJvcmRlcnMgb3IgcGFuJnpvb20sIGp1c3QgZGVjb2RlIGFuZCByZXNpemUgdGhlIHBpY3R1cmUqLwotICAgIGlmKHBDLT5tX21lZGlhUmVuZGVyaW5nID09IE00eFZTU19rUmVzaXppbmcgJiYgTTRPU0FfRkFMU0UgPT0gcEMtPm1fcFB0bzNHUFBwYXJhbXMtPmlzUGFuWm9vbSkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDb252ZXJ0IGFuZCByZXNpemUgaW5wdXQgQVJHQjg4ODggZmlsZSB0byBZVVY0MjAgKi8KLSAgICAgICAgLypUbyBzdXBwb3J0IEFSR0I4ODg4IDogKi8KLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3QgMTogd2lkdGggYW5kIGhlZ2h0ICVkICVkIiwKLSAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT53aWR0aCxwQy0+bV9wUHRvM0dQUHBhcmFtcy0+aGVpZ2h0KTsKLSAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAocEMtPm1fRmlsZUluLAotICAgICAgICAgICAgIHBDLT5tX3BGaWxlUmVhZFB0ciwgcEltYWdlUGxhbmVzLHBDLT5tX3BQdG8zR1BQcGFyYW1zLT53aWR0aCwKLSAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+aGVpZ2h0KTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OiBFcnJvciB3aGVuIGRlY29kaW5nIEpQRUc6IDB4JXhcbiIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qSW4gY2FzZSBvZiBjcm9wcGluZywgYmxhY2sgYm9yZGVycyBvciBwYW4mem9vbSwgY2FsbCB0aGUgRVhJRiByZWFkZXIgYW5kIHRoZSBBSVIqLwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDb21wdXRlcyByYXRpb3MgKi8KLSAgICAgICAgaWYocEMtPm1fcERlY29kZWRQbGFuZSA9PSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIENvbnZlcnQgaW5wdXQgQVJHQjg4ODggZmlsZSB0byBZVVY0MjAgKi8KLSAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdCAyOiB3aWR0aCBhbmQgaGVnaHQgJWQgJWQiLAotICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT53aWR0aCxwQy0+bV9wUHRvM0dQUHBhcmFtcy0+aGVpZ2h0KTsKLSAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4OHRvWVVWNDIwKHBDLT5tX0ZpbGVJbiwgcEMtPm1fcEZpbGVSZWFkUHRyLAotICAgICAgICAgICAgICAgICYocEMtPm1fcERlY29kZWRQbGFuZSkscEMtPm1fcFB0bzNHUFBwYXJhbXMtPndpZHRoLHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5oZWlnaHQpOwotICAgICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6IEVycm9yIHdoZW4gZGVjb2RpbmcgSlBFRzogMHgleFxuIiwgZXJyKTsKLSAgICAgICAgICAgICAgICBpZihwQy0+bV9wRGVjb2RlZFBsYW5lICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBZVVY0MjAgcGxhbmFyIGlzIHJldHVybmVkIGJ1dCBhbGxvY2F0aW9uIGlzIG1hZGUgb25seSBvbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAoY29udGlnb3VzIHBsYW5lcyBpbiBtZW1vcnkpICovCi0gICAgICAgICAgICAgICAgICAgIGlmKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnBhY19kYXRhICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocEMtPm1fcERlY29kZWRQbGFuZS0+cGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUocEMtPm1fcERlY29kZWRQbGFuZSk7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BEZWNvZGVkUGxhbmUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLypJbml0aWFsaXplIEFJUiBQYXJhbXMqLwotICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9IDA7Ci0gICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95ID0gMDsKLSAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQ7Ci0gICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0gcEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aDsKLSAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gcEltYWdlUGxhbmVzLT51X3dpZHRoOwotICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gcEltYWdlUGxhbmVzLT51X2hlaWdodDsKLSAgICAgICAgUGFyYW1zLm1fYk91dHB1dFN0cmlwZSA9IE00T1NBX0ZBTFNFOwotICAgICAgICBQYXJhbXMubV9vdXRwdXRPcmllbnRhdGlvbiA9IE00Q09NTU9OX2tPcmllbnRhdGlvblRvcExlZnQ7Ci0KLSAgICAgICAgLypJbml0aWFsaXplIEV4aWYgcGFyYW1zIHN0cnVjdHVyZSovCi0gICAgICAgIHBCYXNpY1RhZ3Mub3JpZW50YXRpb24gPSBNNENPTU1PTl9rT3JpZW50YXRpb25Vbmtub3duOwotCi0gICAgICAgIC8qKgotICAgICAgICBQYW4mem9vbSBwYXJhbXMqLwotICAgICAgICBpZihNNE9TQV9UUlVFID09IHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5pc1Bhblpvb20pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qU2F2ZSByYXRpbyB2YWx1ZXMsIHRoZXkgY2FuIGJlIHJldXNlZCBpZiB0aGUgbmV3IHJhdGlvcyBhcmUgMCovCi0gICAgICAgICAgICB0ZW1wUGFuem9vbVhhID0gKE00T1NBX1VJbnQ4KXBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGE7Ci0gICAgICAgICAgICB0ZW1wUGFuem9vbVhiID0gKE00T1NBX1VJbnQ4KXBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGI7Ci0gICAgICAgICAgICAvKkNoZWNrIHRoYXQgdGhlIHJhdGlvIGlzIG5vdCAwKi8KLSAgICAgICAgICAgIC8qQ2hlY2sgKGEpIHBhcmFtZXRlcnMqLwotICAgICAgICAgICAgaWYocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IG1heFJhdGlvID0gMDsKLSAgICAgICAgICAgICAgICBpZihwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYSA+PQotICAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKlRoZSByYXRpbyBpcyAwLCB0aGF0IG1lYW5zIHRoZSBhcmVhIG9mIHRoZSBwaWN0dXJlIGRlZmluZWQgd2l0aCAoYSkKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyBpcyBiaWdnZXIgdGhhbiB0aGUgaW1hZ2Ugc2l6ZSovCi0gICAgICAgICAgICAgICAgICAgIGlmKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhhICsgdGVtcFBhbnpvb21YYSA+IDEwMDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIG92ZXJzaXplIGlzIG1heFJhdGlvKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIG1heFJhdGlvID0gcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGEgKyB0ZW1wUGFuem9vbVhhIC0gMTAwMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKlRoZSByYXRpbyBpcyAwLCB0aGF0IG1lYW5zIHRoZSBhcmVhIG9mIHRoZSBwaWN0dXJlIGRlZmluZWQgd2l0aCAoYSkKLSAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgaXMgYmlnZ2VyIHRoYW4gdGhlIGltYWdlIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBpZihwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYSArIHRlbXBQYW56b29tWGEgPiAxMDAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBvdmVyc2l6ZSBpcyBtYXhSYXRpbyovCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXhSYXRpbyA9IHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhICsgdGVtcFBhbnpvb21YYSAtIDEwMDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLypNb2RpZnkgdGhlIChhKSBwYXJhbWV0ZXJzOiovCi0gICAgICAgICAgICAgICAgaWYocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGEgPj0gbWF4UmF0aW8pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKlRoZSAoYSkgdG9wbGVmdCBwYXJhbWV0ZXJzIGNhbiBiZSBtb3ZlZCB0byBrZWVwIHRoZSBzYW1lIGFyZWEgc2l6ZSovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhhIC09IG1heFJhdGlvOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKk1vdmUgdGhlIChhKSB0b3BsZWZ0IHBhcmFtZXRlciB0byAwIGJ1dCB0aGUgcmF0aW8gd2lsbCBiZSBhbHNvIGZ1cnRoZXIKLSAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgdG8gbWF0Y2ggdGhlIGltYWdlIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhID49IG1heFJhdGlvKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypUaGUgKGEpIHRvcGxlZnQgcGFyYW1ldGVycyBjYW4gYmUgbW92ZWQgdG8ga2VlcCB0aGUgc2FtZSBhcmVhIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYSAtPSBtYXhSYXRpbzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypNb3ZlIHRoZSAoYSkgdG9wbGVmdCBwYXJhbWV0ZXIgdG8gMCBidXQgdGhlIHJhdGlvIHdpbGwgYmUgYWxzbyBmdXJ0aGVyCi0gICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCB0byBtYXRjaCB0aGUgaW1hZ2Ugc2l6ZSovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLypUaGUgbmV3IHJhdGlvIGlzIHRoZSBvcmlnaW5hbCBvbmUqLwotICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGEgPSB0ZW1wUGFuem9vbVhhOwotICAgICAgICAgICAgICAgIGlmKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGEgKyBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYSA+IDEwMDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKkNoYW5nZSB0aGUgcmF0aW8gaWYgdGhlIGFyZWEgb2YgdGhlIHBpY3R1cmUgZGVmaW5lZCB3aXRoIChhKSBwYXJhbWV0ZXJzIGlzCi0gICAgICAgICAgICAgICAgICAgIGJpZ2dlciB0aGFuIHRoZSBpbWFnZSBzaXplKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYSA9IDEwMDAgLSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYSArIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhID4gMTAwMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qQ2hhbmdlIHRoZSByYXRpbyBpZiB0aGUgYXJlYSBvZiB0aGUgcGljdHVyZSBkZWZpbmVkIHdpdGggKGEpIHBhcmFtZXRlcnMgaXMKLSAgICAgICAgICAgICAgICAgICAgYmlnZ2VyIHRoYW4gdGhlIGltYWdlIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhID0gMTAwMCAtIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qQ2hlY2sgKGIpIHBhcmFtZXRlcnMqLwotICAgICAgICAgICAgaWYocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYiA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IG1heFJhdGlvID0gMDsKLSAgICAgICAgICAgICAgICBpZihwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYiA+PQotICAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKlRoZSByYXRpbyBpcyAwLCB0aGF0IG1lYW5zIHRoZSBhcmVhIG9mIHRoZSBwaWN0dXJlIGRlZmluZWQgd2l0aCAoYikKLSAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgaXMgYmlnZ2VyIHRoYW4gdGhlIGltYWdlIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBpZihwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYiArIHRlbXBQYW56b29tWGIgPiAxMDAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBvdmVyc2l6ZSBpcyBtYXhSYXRpbyovCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXhSYXRpbyA9IHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhiICsgdGVtcFBhbnpvb21YYiAtIDEwMDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypUaGUgcmF0aW8gaXMgMCwgdGhhdCBtZWFucyB0aGUgYXJlYSBvZiB0aGUgcGljdHVyZSBkZWZpbmVkIHdpdGggKGIpCi0gICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIGlzIGJpZ2dlciB0aGFuIHRoZSBpbWFnZSBzaXplKi8KLSAgICAgICAgICAgICAgICAgICAgaWYocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWIgKyB0ZW1wUGFuem9vbVhiID4gMTAwMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgb3ZlcnNpemUgaXMgbWF4UmF0aW8qLwotICAgICAgICAgICAgICAgICAgICAgICAgbWF4UmF0aW8gPSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYiArIHRlbXBQYW56b29tWGIgLSAxMDAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qTW9kaWZ5IHRoZSAoYikgcGFyYW1ldGVyczoqLwotICAgICAgICAgICAgICAgIGlmKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhiID49IG1heFJhdGlvKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypUaGUgKGIpIHRvcGxlZnQgcGFyYW1ldGVycyBjYW4gYmUgbW92ZWQgdG8ga2VlcCB0aGUgc2FtZSBhcmVhIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYiAtPSBtYXhSYXRpbzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypNb3ZlIHRoZSAoYikgdG9wbGVmdCBwYXJhbWV0ZXIgdG8gMCBidXQgdGhlIHJhdGlvIHdpbGwgYmUgYWxzbyBmdXJ0aGVyCi0gICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCB0byBtYXRjaCB0aGUgaW1hZ2Ugc2l6ZSovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhiID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWIgPj0gbWF4UmF0aW8pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKlRoZSAoYikgdG9wbGVmdCBwYXJhbWV0ZXJzIGNhbiBiZSBtb3ZlZCB0byBrZWVwIHRoZSBzYW1lIGFyZWEgc2l6ZSovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFliIC09IG1heFJhdGlvOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKk1vdmUgdGhlIChiKSB0b3BsZWZ0IHBhcmFtZXRlciB0byAwIGJ1dCB0aGUgcmF0aW8gd2lsbCBiZSBhbHNvIGZ1cnRoZXIKLSAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgdG8gbWF0Y2ggdGhlIGltYWdlIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYiA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qVGhlIG5ldyByYXRpbyBpcyB0aGUgb3JpZ2luYWwgb25lKi8KLSAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhiID0gdGVtcFBhbnpvb21YYjsKLSAgICAgICAgICAgICAgICBpZihwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhiICsgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGIgPiAxMDAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypDaGFuZ2UgdGhlIHJhdGlvIGlmIHRoZSBhcmVhIG9mIHRoZSBwaWN0dXJlIGRlZmluZWQgd2l0aCAoYikgcGFyYW1ldGVycyBpcwotICAgICAgICAgICAgICAgICAgICBiaWdnZXIgdGhhbiB0aGUgaW1hZ2Ugc2l6ZSovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGIgPSAxMDAwIC0gcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGIgKyBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYiA+IDEwMDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKkNoYW5nZSB0aGUgcmF0aW8gaWYgdGhlIGFyZWEgb2YgdGhlIHBpY3R1cmUgZGVmaW5lZCB3aXRoIChiKSBwYXJhbWV0ZXJzIGlzCi0gICAgICAgICAgICAgICAgICAgIGJpZ2dlciB0aGFuIHRoZSBpbWFnZSBzaXplKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYiA9IDEwMDAgLSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQ29tcHV0ZXMgQUlSIHBhcmFtZXRlcnMgKi8KLS8qICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9IChNNE9TQV9VSW50MzIpKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggKgotICAgICAgICAgICAgKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhhICsKLSAgICAgICAgICAgIChNNE9TQV9JbnQxNikoKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhiIFwKLSAgICAgICAgICAgICAgICAtIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhhKSAqCi0gICAgICAgICAgICBwQy0+bV9JbWFnZUNvdW50ZXIpIC8gKE00T1NBX0RvdWJsZSlwQy0+bV9OYkltYWdlKSkgLyAxMDA7Ci0gICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95ID0gKE00T1NBX1VJbnQzMikocEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQgKgotICAgICAgICAgICAgKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhICsKLSAgICAgICAgICAgIChNNE9TQV9JbnQxNikoKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFliXAotICAgICAgICAgICAgICAgICAtIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhKSAqCi0gICAgICAgICAgICBwQy0+bV9JbWFnZUNvdW50ZXIpIC8gKE00T1NBX0RvdWJsZSlwQy0+bV9OYkltYWdlKSkgLyAxMDA7Ci0KLSAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSAoTTRPU0FfVUludDMyKShwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoICoKLSAgICAgICAgICAgIChwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhICsKLSAgICAgICAgICAgIChNNE9TQV9JbnQxNikoKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGIgLSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhKSAqCi0gICAgICAgICAgICBwQy0+bV9JbWFnZUNvdW50ZXIpIC8gKE00T1NBX0RvdWJsZSlwQy0+bV9OYkltYWdlKSkgLyAxMDA7Ci0KLSAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gIChNNE9TQV9VSW50MzIpKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0ICoKLSAgICAgICAgICAgIChwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhICsKLSAgICAgICAgICAgIChNNE9TQV9JbnQxNikoKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGIgLSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhKSAqCi0gICAgICAgICAgICBwQy0+bV9JbWFnZUNvdW50ZXIpIC8gKE00T1NBX0RvdWJsZSlwQy0+bV9OYkltYWdlKSkgLyAxMDA7Ci0gKi8KLSAgICAgICAgICAgIC8vIEluc3RlYWQgb2YgdXNpbmcgcEMtPm1fTmJJbWFnZSB3ZSBoYXZlIHRvIHVzZSAocEMtPm1fTmJJbWFnZS0xKSBhcyBwQy0+bV9JbWFnZUNvdW50ZXIKLSAgICAgICAgICAgIC8vIHdpbGwgYmUgeC0xIG1heCBmb3IgeCBuby4gb2YgZnJhbWVzCi0gICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9IChNNE9TQV9VSW50MzIpKCgoKE00T1NBX0RvdWJsZSlwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoICoKLSAgICAgICAgICAgICAgICAocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGEgKwotICAgICAgICAgICAgICAgIChNNE9TQV9Eb3VibGUpKChNNE9TQV9Eb3VibGUpKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhiXAotICAgICAgICAgICAgICAgICAgICAgLSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYSkgKgotICAgICAgICAgICAgICAgIHBDLT5tX0ltYWdlQ291bnRlcikgLyAoTTRPU0FfRG91YmxlKXBDLT5tX05iSW1hZ2UtMSkpIC8gMTAwMCkpOwotICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgPQotICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgoKChNNE9TQV9Eb3VibGUpcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQgKgotICAgICAgICAgICAgICAgIChwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYSArCi0gICAgICAgICAgICAgICAgKE00T1NBX0RvdWJsZSkoKE00T1NBX0RvdWJsZSkocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWJcCi0gICAgICAgICAgICAgICAgICAgICAtIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhKSAqCi0gICAgICAgICAgICAgICAgcEMtPm1fSW1hZ2VDb3VudGVyKSAvIChNNE9TQV9Eb3VibGUpcEMtPm1fTmJJbWFnZS0xKSkgLyAxMDAwKSk7Ci0KLSAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0KLSAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKCgoTTRPU0FfRG91YmxlKXBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggKgotICAgICAgICAgICAgICAgIChwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhICsKLSAgICAgICAgICAgICAgICAoTTRPU0FfRG91YmxlKSgoTTRPU0FfRG91YmxlKShwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhiXAotICAgICAgICAgICAgICAgICAgICAgLSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhKSAqCi0gICAgICAgICAgICAgICAgcEMtPm1fSW1hZ2VDb3VudGVyKSAvIChNNE9TQV9Eb3VibGUpcEMtPm1fTmJJbWFnZS0xKSkgLyAxMDAwKSk7Ci0KLSAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKCgoKE00T1NBX0RvdWJsZSlwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCAqCi0gICAgICAgICAgICAgICAgKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGEgKwotICAgICAgICAgICAgICAgIChNNE9TQV9Eb3VibGUpKChNNE9TQV9Eb3VibGUpKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGIgXAotICAgICAgICAgICAgICAgICAgICAtIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGEpICoKLSAgICAgICAgICAgICAgICBwQy0+bV9JbWFnZUNvdW50ZXIpIC8gKE00T1NBX0RvdWJsZSlwQy0+bV9OYkltYWdlLTEpKSAvIDEwMDApKTsKLQotICAgICAgICAgICAgaWYoKFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoICsgUGFyYW1zLm1faW5wdXRDb29yZC5tX3gpXAotICAgICAgICAgICAgICAgICA+IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoIFwKLSAgICAgICAgICAgICAgICAgICAgLSBQYXJhbXMubV9pbnB1dENvb3JkLm1feDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoKFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCArIFBhcmFtcy5tX2lucHV0Q29vcmQubV95KVwKLSAgICAgICAgICAgICAgICAgPiBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgIC0gUGFyYW1zLm1faW5wdXRDb29yZC5tX3k7Ci0gICAgICAgICAgICB9Ci0KLQotCi0gICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IChQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSAoUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0Pj4xKTw8MTsKLSAgICAgICAgfQotCi0KLQotICAgIC8qKgotICAgICAgICBQaWN0dXJlIHJlbmRlcmluZzogQmxhY2sgYm9yZGVycyovCi0KLSAgICAgICAgaWYocEMtPm1fbWVkaWFSZW5kZXJpbmcgPT0gTTR4VlNTX2tCbGFja0JvcmRlcnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBJbWFnZVBsYW5lc1swXS5wYWNfZGF0YSxZX1BMQU5FX0JPUkRFUl9WQUxVRSwKLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzWzBdLnVfaGVpZ2h0KnBJbWFnZVBsYW5lc1swXS51X3N0cmlkZSkpOwotICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcEltYWdlUGxhbmVzWzFdLnBhY19kYXRhLFVfUExBTkVfQk9SREVSX1ZBTFVFLAotICAgICAgICAgICAgICAgIChwSW1hZ2VQbGFuZXNbMV0udV9oZWlnaHQqcEltYWdlUGxhbmVzWzFdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwSW1hZ2VQbGFuZXNbMl0ucGFjX2RhdGEsVl9QTEFORV9CT1JERVJfVkFMVUUsCi0gICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lc1syXS51X2hlaWdodCpwSW1hZ2VQbGFuZXNbMl0udV9zdHJpZGUpKTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICBGaXJzdCB3aXRob3V0IHBhbiZ6b29tKi8KLSAgICAgICAgICAgIGlmKE00T1NBX0ZBTFNFID09IHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5pc1Bhblpvb20pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoKHBCYXNpY1RhZ3Mub3JpZW50YXRpb24pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Vbmtub3duOgotICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRPcmllbnRhdGlvbiA9IE00Q09NTU9OX2tPcmllbnRhdGlvblRvcExlZnQ7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Ub3BMZWZ0OgotICAgICAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uVG9wUmlnaHQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Cb3R0b21SaWdodDoKLSAgICAgICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkJvdHRvbUxlZnQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmKChNNE9TQV9VSW50MzIpKChwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCAqIHBJbWFnZVBsYW5lcy0+dV93aWR0aClcCi0gICAgICAgICAgICAgICAgICAgICAgICAgL3BDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGgpIDw9IHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLy9QYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPCBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyppdCBpcyBoZWlnaHQgc28gYmxhY2sgYm9yZGVycyB3aWxsIGJlIG9uIHRoZSB0b3AgYW5kIG9uIHRoZSBib3R0b20gc2lkZSovCi0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSBwSW1hZ2VQbGFuZXMtPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwSW1hZ2VQbGFuZXMtPnVfd2lkdGgpIC9wQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qbnVtYmVyIG9mIGxpbmVzIGF0IHRoZSB0b3AqLwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzBdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMF0udV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1QYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0KT4+MSkpKnBJbWFnZVBsYW5lc1swXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X2hlaWdodCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMV0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMV0udV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSkpKT4+MSkqcEltYWdlUGxhbmVzWzFdLnVfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1syXS51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xKSkpPj4xKSpwSW1hZ2VQbGFuZXNbMl0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMl0udV9oZWlnaHQgPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyppdCBpcyB3aWR0aCBzbyBibGFjayBib3JkZXJzIHdpbGwgYmUgb24gdGhlIGxlZnQgYW5kIHJpZ2h0IHNpZGUqLwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgocEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcEltYWdlUGxhbmVzLT51X2hlaWdodCkgL3BDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzBdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMF0udV93aWR0aFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCk+PjEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzFdLnVfd2lkdGhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1sxXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xOwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzJdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzJdLnVfd2lkdGhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uTGVmdFRvcDoKLSAgICAgICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkxlZnRCb3R0b206Ci0gICAgICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25SaWdodFRvcDoKLSAgICAgICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblJpZ2h0Qm90dG9tOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYoKE00T1NBX1VJbnQzMikoKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggKiBwSW1hZ2VQbGFuZXMtPnVfd2lkdGgpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQpIDwgcEltYWdlUGxhbmVzLT51X2hlaWdodCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9QYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPiBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKml0IGlzIGhlaWdodCBzbyBibGFjayBib3JkZXJzIHdpbGwgYmUgb24gdGhlIHRvcCBhbmQgb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJvdHRvbSBzaWRlKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gcEltYWdlUGxhbmVzLT51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgocEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBJbWFnZVBsYW5lcy0+dV93aWR0aCkgL3BDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm51bWJlciBvZiBsaW5lcyBhdCB0aGUgdG9wKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzBdLnVfaGVpZ2h0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCkpPj4xKSpwSW1hZ2VQbGFuZXNbMF0udV9zdHJpZGUpKzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzBdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1sxXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMV0udV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MSkpKT4+MSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBJbWFnZVBsYW5lc1sxXS51X3N0cmlkZSkrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMV0udV9oZWlnaHQgPSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzJdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1syXS51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcEltYWdlUGxhbmVzWzJdLnVfc3RyaWRlKSsxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X2hlaWdodCA9IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKml0IGlzIHdpZHRoIHNvIGJsYWNrIGJvcmRlcnMgd2lsbCBiZSBvbiB0aGUgbGVmdCBhbmQgcmlnaHQgc2lkZSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gcEltYWdlUGxhbmVzLT51X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKChwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQpIC9wQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzBdLnVfd2lkdGhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCkpPj4xKSkrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMV0udV93aWR0aFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSkpKT4+MSkpKzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzJdLnVfd2lkdGhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpKSk+PjEpKSsxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgIFNlY29uZGx5IHdpdGggcGFuJnpvb20qLwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN3aXRjaChwQmFzaWNUYWdzLm9yaWVudGF0aW9uKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uVW5rbm93bjoKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0T3JpZW50YXRpb24gPSBNNENPTU1PTl9rT3JpZW50YXRpb25Ub3BMZWZ0OwotICAgICAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uVG9wTGVmdDoKLSAgICAgICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblRvcFJpZ2h0OgotICAgICAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uQm90dG9tUmlnaHQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Cb3R0b21MZWZ0OgotICAgICAgICAgICAgICAgICAgICAvKk5PIFJPVEFUSU9OKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoKE00T1NBX1VJbnQzMikoKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0ICogcEltYWdlUGxhbmVzLT51X3dpZHRoKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAvcEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aCkgPD0gcEltYWdlUGxhbmVzLT51X2hlaWdodCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA8IFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKkJsYWNrIGJvcmRlcnMgd2lsbCBiZSBvbiB0aGUgdG9wIGFuZCBib3R0b20gb2YgdGhlIG91dHB1dCB2aWRlbyovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKk1heGltdW0gb3V0cHV0IGhlaWdodCBpZiB0aGUgaW5wdXQgaW1hZ2UgYXNwZWN0IHJhdGlvIGlzIGtlcHQgYW5kIGlmCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGUgb3V0cHV0IHdpZHRoIGlzIHRoZSBzY3JlZW4gd2lkdGgqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBPdXRwdXRTaXplSGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgocEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBJbWFnZVBsYW5lcy0+dV93aWR0aCkgL3BDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBJbnB1dFNpemVIZWlnaHRNYXggPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBGaW5hbElucHV0SGVpZ2h0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIG91dHB1dCB3aWR0aCBpcyB0aGUgc2NyZWVuIHdpZHRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IHBJbWFnZVBsYW5lcy0+dV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBPdXRwdXRTaXplSGVpZ2h0ID0gKHRlbXBPdXRwdXRTaXplSGVpZ2h0Pj4xKTw8MTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLypNYXhpbXVtIGlucHV0IGhlaWdodCBhY2NvcmRpbmcgdG8gdGhlIG1heGltdW0gb3V0cHV0IGhlaWdodAotICAgICAgICAgICAgICAgICAgICAgICAgKHByb3BvcnRpb25hbCB0byB0aGUgbWF4aW11bSBvdXRwdXQgaGVpZ2h0KSovCi0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4ID0gKHBJbWFnZVBsYW5lcy0+dV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKlBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkvdGVtcE91dHB1dFNpemVIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4ID0gKHRlbXBJbnB1dFNpemVIZWlnaHRNYXg+PjEpPDwxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKkNoZWNrIGlmIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGlucHV0IGhlaWdodCBpcyBjb250YWluZWQgaW50byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0IGltYWdlIGhlaWdodCovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZih0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4IDw9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIG1heGltdW0gcG9zc2libGUgaW5wdXQgaGVpZ2h0IGlzIGNvbnRhaW5lZCBpbiB0aGUgaW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBtZWFucyBubyBibGFjayBib3JkZXJzLCB0aGUgaW5wdXQgcGFuIHpvb20gYXJlYSB3aWxsIGJlIGV4dGVuZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCB0aGUgaW5wdXQgQUlSIGhlaWdodCB3aWxsIGJlIHRoZSBtYXhpbXVtIHBvc3NpYmxlKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoKHRlbXBJbnB1dFNpemVIZWlnaHRNYXggLSBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpPj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw9IFBhcmFtcy5tX2lucHV0Q29vcmQubV95Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICgodGVtcElucHV0U2l6ZUhlaWdodE1heCAtIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0IC0oUGFyYW1zLm1faW5wdXRDb29yZC5tX3lcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIGlucHV0IHBhbiB6b29tIGFyZWEgY2FuIGJlIGV4dGVuZGVkIHN5bW1ldHJpY2FsbHkgb24gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcCBhbmQgYm90dG9tIHNpZGUqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSAtPSAoKHRlbXBJbnB1dFNpemVIZWlnaHRNYXggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpPj4xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihQYXJhbXMubV9pbnB1dENvb3JkLm1feSA8IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX2lucHV0Q29vcmQubV95ICsgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlcmUgaXMgbm90IGVub3VnaCBwbGFjZSBhYm92ZSB0aGUgaW5wdXQgcGFuIHpvb20gYXJlYSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmQgaXQgc3ltbWV0cmljYWxseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gZXh0ZW5kIGl0IHRvIHRoZSBtYXhpbXVtIG9uIHRoZSB0b3AqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlcmUgaXMgbm90IGVub3VnaCBwbGFjZSBiZWxvdyB0aGUgaW5wdXQgcGFuIHpvb20gYXJlYSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmQgaXQgc3ltbWV0cmljYWxseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gZXh0ZW5kIGl0IHRvIHRoZSBtYXhpbXVtIG9uIHRoZSBib3R0b20qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSA9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gdGVtcElucHV0U2l6ZUhlaWdodE1heDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgaW5wdXQgaGVpZ2h0IG9mIHRoZSBBSVIgaXMgdGhlIG1heGltdW0gcG9zc2libGUgaGVpZ2h0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSB0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIG1heGltdW0gcG9zc2libGUgaW5wdXQgaGVpZ2h0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgaW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBtZWFucyBibGFjayBib3JkZXJzIGFyZSBuZWNlc3NhcnkgdG8ga2VlcCBhc3BlY3QgcmF0aW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgaW5wdXQgaGVpZ2h0IG9mIHRoZSBBSVIgaXMgYWxsIHRoZSBpbnB1dCBpbWFnZSBoZWlnaHQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGVtcE91dHB1dFNpemVIZWlnaHQqcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL1BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzBdLnVfaGVpZ2h0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpPj4xKSkqcEltYWdlUGxhbmVzWzBdLnVfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X2hlaWdodCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1sxXS51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSkpKT4+MSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBJbWFnZVBsYW5lc1sxXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMl0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1syXS51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSkpKT4+MSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBJbWFnZVBsYW5lc1syXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzJdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qQmxhY2sgYm9yZGVycyB3aWxsIGJlIG9uIHRoZSBsZWZ0IGFuZCByaWdodCBzaWRlIG9mIHRoZSBvdXRwdXQgdmlkZW8qLwotICAgICAgICAgICAgICAgICAgICAgICAgLypNYXhpbXVtIG91dHB1dCB3aWR0aCBpZiB0aGUgaW5wdXQgaW1hZ2UgYXNwZWN0IHJhdGlvIGlzIGtlcHQgYW5kIGlmIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBoZWlnaHQgaXMgdGhlIHNjcmVlbiBoZWlnaHQqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBPdXRwdXRTaXplV2lkdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgocEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcEltYWdlUGxhbmVzLT51X2hlaWdodCkgL3BDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wSW5wdXRTaXplV2lkdGhNYXggPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBGaW5hbElucHV0V2lkdGggPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgb3V0cHV0IGhlaWdodCBpcyB0aGUgc2NyZWVuIGhlaWdodCovCi0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gcEltYWdlUGxhbmVzLT51X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBPdXRwdXRTaXplV2lkdGggPSAodGVtcE91dHB1dFNpemVXaWR0aD4+MSk8PDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qTWF4aW11bSBpbnB1dCB3aWR0aCBhY2NvcmRpbmcgdG8gdGhlIG1heGltdW0gb3V0cHV0IHdpZHRoCi0gICAgICAgICAgICAgICAgICAgICAgICAocHJvcG9ydGlvbmFsIHRvIHRoZSBtYXhpbXVtIG91dHB1dCB3aWR0aCkqLwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcElucHV0U2l6ZVdpZHRoTWF4ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lcy0+dV93aWR0aCpQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aClcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC90ZW1wT3V0cHV0U2l6ZVdpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcElucHV0U2l6ZVdpZHRoTWF4ID0gKHRlbXBJbnB1dFNpemVXaWR0aE1heD4+MSk8PDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qQ2hlY2sgaWYgdGhlIG1heGltdW0gcG9zc2libGUgaW5wdXQgd2lkdGggaXMgY29udGFpbmVkIGludG8gdGhlIGlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2Ugd2lkdGgqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYodGVtcElucHV0U2l6ZVdpZHRoTWF4IDw9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgbWF4aW11bSBwb3NzaWJsZSBpbnB1dCB3aWR0aCBpcyBjb250YWluZWQgaW4gdGhlIGlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2Ugd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBtZWFucyBubyBibGFjayBib3JkZXJzLCB0aGUgaW5wdXQgcGFuIHpvb20gYXJlYSB3aWxsIGJlIGV4dGVuZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCB0aGUgaW5wdXQgQUlSIHdpZHRoIHdpbGwgYmUgdGhlIG1heGltdW0gcG9zc2libGUqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgodGVtcElucHV0U2l6ZVdpZHRoTWF4IC0gUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpPj4xKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw9IFBhcmFtcy5tX2lucHV0Q29vcmQubV94Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICgodGVtcElucHV0U2l6ZVdpZHRoTWF4IC0gUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpPj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoIC0oUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgaW5wdXQgcGFuIHpvb20gYXJlYSBjYW4gYmUgZXh0ZW5kZWQgc3ltbWV0cmljYWxseSBvbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCBhbmQgbGVmdCBzaWRlKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggLT0gKCh0ZW1wSW5wdXRTaXplV2lkdGhNYXhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCk+PjEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKFBhcmFtcy5tX2lucHV0Q29vcmQubV94IDwgcEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9pbnB1dENvb3JkLm1feCArIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlcmUgaXMgbm90IGVub3VnaCBwbGFjZSBhYm92ZSB0aGUgaW5wdXQgcGFuIHpvb20gYXJlYSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kIGl0IHN5bW1ldHJpY2FsbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIGV4dGVuZCBpdCB0byB0aGUgbWF4aW11bSBvbiB0aGUgbGVmdCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV94ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGVyZSBpcyBub3QgZW5vdWdoIHBsYWNlIGJlbG93IHRoZSBpbnB1dCBwYW4gem9vbSBhcmVhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBleHRlbmQgaXQgc3ltbWV0cmljYWxseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gZXh0ZW5kIGl0IHRvIHRoZSBtYXhpbXVtIG9uIHRoZSByaWdodCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV94ID0gcEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHRlbXBJbnB1dFNpemVXaWR0aE1heDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgaW5wdXQgd2lkdGggb2YgdGhlIEFJUiBpcyB0aGUgbWF4aW11bSBwb3NzaWJsZSB3aWR0aCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSB0ZW1wSW5wdXRTaXplV2lkdGhNYXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgbWF4aW11bSBwb3NzaWJsZSBpbnB1dCB3aWR0aCBpcyBncmVhdGVyIHRoYW4gdGhlIGlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2Ugd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBtZWFucyBibGFjayBib3JkZXJzIGFyZSBuZWNlc3NhcnkgdG8ga2VlcCBhc3BlY3QgcmF0aW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgaW5wdXQgd2lkdGggb2YgdGhlIEFJUiBpcyBhbGwgdGhlIGlucHV0IGltYWdlIHdpZHRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ZW1wT3V0cHV0U2l6ZVdpZHRoKnBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGgpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL1BhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IChQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV94ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzBdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1swXS51X3dpZHRoXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCk+PjEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMV0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzFdLnVfd2lkdGhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MSkpKT4+MSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzJdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1syXS51X3dpZHRoXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjEpKSk+PjEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uTGVmdFRvcDoKLSAgICAgICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkxlZnRCb3R0b206Ci0gICAgICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25SaWdodFRvcDoKLSAgICAgICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblJpZ2h0Qm90dG9tOgotICAgICAgICAgICAgICAgICAgICAvKlJPVEFUSU9OKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoKE00T1NBX1VJbnQzMikoKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggKiBwSW1hZ2VQbGFuZXMtPnVfd2lkdGgpXAotICAgICAgICAgICAgICAgICAgICAgICAgIC9wQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCkgPCBwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0KQotICAgICAgICAgICAgICAgICAgICAgICAgIC8vUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID4gUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qQmxhY2sgYm9yZGVycyB3aWxsIGJlIG9uIHRoZSBsZWZ0IGFuZCByaWdodCBzaWRlIG9mIHRoZSBvdXRwdXQgdmlkZW8qLwotICAgICAgICAgICAgICAgICAgICAgICAgLypNYXhpbXVtIG91dHB1dCBoZWlnaHQgaWYgdGhlIGlucHV0IGltYWdlIGFzcGVjdCByYXRpbyBpcyBrZXB0IGFuZCBpZgotICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG91dHB1dCBoZWlnaHQgaXMgdGhlIHNjcmVlbiB3aWR0aCovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdGVtcE91dHB1dFNpemVIZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggKiBwSW1hZ2VQbGFuZXMtPnVfd2lkdGgpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBJbnB1dFNpemVIZWlnaHRNYXggPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBGaW5hbElucHV0SGVpZ2h0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIG91dHB1dCB3aWR0aCBpcyB0aGUgc2NyZWVuIGhlaWdodCovCi0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gcEltYWdlUGxhbmVzLT51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPSBwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcE91dHB1dFNpemVIZWlnaHQgPSAodGVtcE91dHB1dFNpemVIZWlnaHQ+PjEpPDwxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKk1heGltdW0gaW5wdXQgaGVpZ2h0IGFjY29yZGluZyB0byB0aGUgbWF4aW11bSBvdXRwdXQgaGVpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9wb3J0aW9uYWwgdG8gdGhlIG1heGltdW0gb3V0cHV0IGhlaWdodCkqLwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcElucHV0U2l6ZUhlaWdodE1heCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQqUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvdGVtcE91dHB1dFNpemVIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4ID0gKHRlbXBJbnB1dFNpemVIZWlnaHRNYXg+PjEpPDwxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKkNoZWNrIGlmIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGlucHV0IGhlaWdodCBpcyBjb250YWluZWQgaW50byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgaW1hZ2Ugd2lkdGggKHJvdGF0aW9uIGluY2x1ZGVkKSovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZih0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4IDw9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgbWF4aW11bSBwb3NzaWJsZSBpbnB1dCBoZWlnaHQgaXMgY29udGFpbmVkIGluIHRoZSBpbnB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlIHdpZHRoIChyb3RhdGlvbiBpbmNsdWRlZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBtZWFucyBubyBibGFjayBib3JkZXJzLCB0aGUgaW5wdXQgcGFuIHpvb20gYXJlYSB3aWxsIGJlIGV4dGVuZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCB0aGUgaW5wdXQgQUlSIHdpZHRoIHdpbGwgYmUgdGhlIG1heGltdW0gcG9zc2libGUqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgodGVtcElucHV0U2l6ZUhlaWdodE1heCAtIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKT4+MSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSBQYXJhbXMubV9pbnB1dENvb3JkLm1feAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKHRlbXBJbnB1dFNpemVIZWlnaHRNYXggLSBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggLShQYXJhbXMubV9pbnB1dENvb3JkLm1feCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBpbnB1dCBwYW4gem9vbSBhcmVhIGNhbiBiZSBleHRlbmRlZCBzeW1tZXRyaWNhbGx5IG9uIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgYW5kIGxlZnQgc2lkZSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV94IC09ICgodGVtcElucHV0U2l6ZUhlaWdodE1heCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKT4+MSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggPCBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX2lucHV0Q29vcmQubV94ICsgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGVyZSBpcyBub3QgZW5vdWdoIHBsYWNlIG9uIHRoZSBsZWZ0IG9mIHRoZSBpbnB1dCBwYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbSBhcmVhIHRvIGV4dGVuZCBpdCBzeW1tZXRyaWNhbGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyBleHRlbmQgaXQgdG8gdGhlIG1heGltdW0gb24gdGhlIGxlZnQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlcmUgaXMgbm90IGVub3VnaCBwbGFjZSBvbiB0aGUgcmlnaHQgb2YgdGhlIGlucHV0IHBhbiB6b29tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmVhIHRvIGV4dGVuZCBpdCBzeW1tZXRyaWNhbGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyBleHRlbmQgaXQgdG8gdGhlIG1heGltdW0gb24gdGhlIHJpZ2h0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggLSB0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBpbnB1dCB3aWR0aCBvZiB0aGUgQUlSIGlzIHRoZSBtYXhpbXVtIHBvc3NpYmxlIHdpZHRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IHRlbXBJbnB1dFNpemVIZWlnaHRNYXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgbWF4aW11bSBwb3NzaWJsZSBpbnB1dCBoZWlnaHQgaXMgZ3JlYXRlciB0aGFuIHRoZSBpbnB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlIHdpZHRoIChyb3RhdGlvbiBpbmNsdWRlZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBtZWFucyBibGFjayBib3JkZXJzIGFyZSBuZWNlc3NhcnkgdG8ga2VlcCBhc3BlY3QgcmF0aW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgaW5wdXQgd2lkdGggb2YgdGhlIEFJUiBpcyBhbGwgdGhlIGlucHV0IGltYWdlIHdpZHRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ZW1wT3V0cHV0U2l6ZUhlaWdodCpwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL1BhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IChQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV94ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzBdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1swXS51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1QYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGgpKT4+MSkqcEltYWdlUGxhbmVzWzBdLnVfc3RyaWRlKSsxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X2hlaWdodCA9IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMV0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMV0udV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwSW1hZ2VQbGFuZXNbMV0udV9zdHJpZGUpKzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1syXS51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjEpKSk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBJbWFnZVBsYW5lc1syXS51X3N0cmlkZSkrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMl0udV9oZWlnaHQgPSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKkJsYWNrIGJvcmRlcnMgd2lsbCBiZSBvbiB0aGUgdG9wIGFuZCBib3R0b20gb2YgdGhlIG91dHB1dCB2aWRlbyovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKk1heGltdW0gb3V0cHV0IHdpZHRoIGlmIHRoZSBpbnB1dCBpbWFnZSBhc3BlY3QgcmF0aW8gaXMga2VwdCBhbmQgaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgb3V0cHV0IHdpZHRoIGlzIHRoZSBzY3JlZW4gaGVpZ2h0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wT3V0cHV0U2l6ZVdpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKChwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCAqIHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvcEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdGVtcElucHV0U2l6ZVdpZHRoTWF4ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wRmluYWxJbnB1dFdpZHRoID0gMCwgdGVtcEZpbmFsT3V0cHV0V2lkdGggPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgb3V0cHV0IGhlaWdodCBpcyB0aGUgc2NyZWVuIHdpZHRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0PSBwSW1hZ2VQbGFuZXMtPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wT3V0cHV0U2l6ZVdpZHRoID0gKHRlbXBPdXRwdXRTaXplV2lkdGg+PjEpPDwxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKk1heGltdW0gaW5wdXQgd2lkdGggYWNjb3JkaW5nIHRvIHRoZSBtYXhpbXVtIG91dHB1dCB3aWR0aAotICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9wb3J0aW9uYWwgdG8gdGhlIG1heGltdW0gb3V0cHV0IHdpZHRoKSovCi0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wSW5wdXRTaXplV2lkdGhNYXggPQotICAgICAgICAgICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lcy0+dV93aWR0aCpQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpL3RlbXBPdXRwdXRTaXplV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wSW5wdXRTaXplV2lkdGhNYXggPSAodGVtcElucHV0U2l6ZVdpZHRoTWF4Pj4xKTw8MTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLypDaGVjayBpZiB0aGUgbWF4aW11bSBwb3NzaWJsZSBpbnB1dCB3aWR0aCBpcyBjb250YWluZWQgaW50byB0aGUgaW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSBoZWlnaHQgKHJvdGF0aW9uIGluY2x1ZGVkKSovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZih0ZW1wSW5wdXRTaXplV2lkdGhNYXggPD0gcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgbWF4aW11bSBwb3NzaWJsZSBpbnB1dCB3aWR0aCBpcyBjb250YWluZWQgaW4gdGhlIGlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlIGhlaWdodCAocm90YXRpb24gaW5jbHVkZWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgbWVhbnMgbm8gYmxhY2sgYm9yZGVycywgdGhlIGlucHV0IHBhbiB6b29tIGFyZWEgd2lsbCBiZSBleHRlbmRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgdGhlIGlucHV0IEFJUiBoZWlnaHQgd2lsbCBiZSB0aGUgbWF4aW11bSBwb3NzaWJsZSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKCh0ZW1wSW5wdXRTaXplV2lkdGhNYXggLSBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpPj4xKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw9IFBhcmFtcy5tX2lucHV0Q29vcmQubV95Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICgodGVtcElucHV0U2l6ZVdpZHRoTWF4IC0gUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KT4+MSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD0gcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQgLShQYXJhbXMubV9pbnB1dENvb3JkLm1feSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgaW5wdXQgcGFuIHpvb20gYXJlYSBjYW4gYmUgZXh0ZW5kZWQgc3ltbWV0cmljYWxseSBvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmlnaHQgYW5kIGxlZnQgc2lkZSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95IC09ICgodGVtcElucHV0U2l6ZVdpZHRoTWF4IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KT4+MSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgPCBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9pbnB1dENvb3JkLm1feSArIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRoZXJlIGlzIG5vdCBlbm91Z2ggcGxhY2Ugb24gdGhlIHRvcCBvZiB0aGUgaW5wdXQgcGFuIHpvb20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlYSB0byBleHRlbmQgaXQgc3ltbWV0cmljYWxseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gZXh0ZW5kIGl0IHRvIHRoZSBtYXhpbXVtIG9uIHRoZSB0b3AqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlcmUgaXMgbm90IGVub3VnaCBwbGFjZSBvbiB0aGUgYm90dG9tIG9mIHRoZSBpbnB1dCBwYW4gem9vbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlYSB0byBleHRlbmQgaXQgc3ltbWV0cmljYWxseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gZXh0ZW5kIGl0IHRvIHRoZSBtYXhpbXVtIG9uIHRoZSBib3R0b20qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSA9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gdGVtcElucHV0U2l6ZVdpZHRoTWF4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBpbnB1dCBoZWlnaHQgb2YgdGhlIEFJUiBpcyB0aGUgbWF4aW11bSBwb3NzaWJsZSBoZWlnaHQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9IHRlbXBJbnB1dFNpemVXaWR0aE1heDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBtYXhpbXVtIHBvc3NpYmxlIGlucHV0IHdpZHRoIGlzIGdyZWF0ZXIgdGhhbiB0aGUgaW5wdXRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlIGhlaWdodCAocm90YXRpb24gaW5jbHVkZWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgbWVhbnMgYmxhY2sgYm9yZGVycyBhcmUgbmVjZXNzYXJ5IHRvIGtlZXAgYXNwZWN0IHJhdGlvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGlucHV0IGhlaWdodCBvZiB0aGUgQUlSIGlzIGFsbCB0aGUgaW5wdXQgaW1hZ2UgaGVpZ2h0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRlbXBPdXRwdXRTaXplV2lkdGgqcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL1BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzBdLnVfd2lkdGhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCkpPj4xKSkrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1sxXS51X3dpZHRoXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xKSkpPj4xKSkrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMV0udV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzJdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMl0udV93aWR0aFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSkpKT4+MSkpKzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzJdLnVfd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLypXaWR0aCBhbmQgaGVpZ2h0IGhhdmUgdG8gYmUgZXZlbiovCi0gICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSAoUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSAoUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IChQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSAoUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0Pj4xKTw8MTsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X3dpZHRoID0gKHBJbWFnZVBsYW5lc1swXS51X3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1sxXS51X3dpZHRoID0gKHBJbWFnZVBsYW5lc1sxXS51X3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3dpZHRoID0gKHBJbWFnZVBsYW5lc1syXS51X3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X2hlaWdodCA9IChwSW1hZ2VQbGFuZXNbMF0udV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfaGVpZ2h0ID0gKHBJbWFnZVBsYW5lc1sxXS51X2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMl0udV9oZWlnaHQgPSAocEltYWdlUGxhbmVzWzJdLnVfaGVpZ2h0Pj4xKTw8MTsKLQotICAgICAgICAgICAgLypDaGVjayB0aGF0IHZhbHVlcyBhcmUgY29oZXJlbnQqLwotICAgICAgICAgICAgaWYoUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID09IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID09IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgIFBpY3R1cmUgcmVuZGVyaW5nOiBSZXNpemluZyBhbmQgQ3JvcHBpbmcqLwotICAgICAgICBpZihwQy0+bV9tZWRpYVJlbmRlcmluZyAhPSBNNHhWU1Nfa0JsYWNrQm9yZGVycykKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoKHBCYXNpY1RhZ3Mub3JpZW50YXRpb24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Vbmtub3duOgotICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dE9yaWVudGF0aW9uID0gTTRDT01NT05fa09yaWVudGF0aW9uVG9wTGVmdDsKLSAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uVG9wTGVmdDoKLSAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uVG9wUmlnaHQ6Ci0gICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkJvdHRvbVJpZ2h0OgotICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Cb3R0b21MZWZ0OgotICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSBwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0OwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IHBJbWFnZVBsYW5lcy0+dV93aWR0aDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uTGVmdFRvcDoKLSAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uTGVmdEJvdHRvbToKLSAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uUmlnaHRUb3A6Ci0gICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblJpZ2h0Qm90dG9tOgotICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSBwSW1hZ2VQbGFuZXMtPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gcEltYWdlUGxhbmVzLT51X2hlaWdodDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICBQaWN0dXJlIHJlbmRlcmluZzogQ3JvcHBpbmcqLwotICAgICAgICBpZihwQy0+bV9tZWRpYVJlbmRlcmluZyA9PSBNNHhWU1Nfa0Nyb3BwaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZigoUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCAqIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKVwKLSAgICAgICAgICAgICAgICAgL1BhcmFtcy5tX291dHB1dFNpemUubV93aWR0aDxQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBIZWlnaHQgPSBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgLypoZWlnaHQgd2lsbCBiZSBjcm9wcGVkKi8KLSAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSAgKE00T1NBX1VJbnQzMikoKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgXAotICAgICAgICAgICAgICAgICAgICAqIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKSAvUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoKTsKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSAgKFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fcFB0bzNHUFBwYXJhbXMtPmlzUGFuWm9vbSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95ID0gKE00T1NBX0ludDMyKSgoTTRPU0FfSW50MzIpXAotICAgICAgICAgICAgICAgICAgICAgICAgKChwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCAtIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkpPj4xKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgKz0gKE00T1NBX0ludDMyKSgoTTRPU0FfSW50MzIpXAotICAgICAgICAgICAgICAgICAgICAgICAgKCh0ZW1wSGVpZ2h0IC0gUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSk+PjEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdGVtcFdpZHRoPSBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aDsKLSAgICAgICAgICAgICAgICAvKndpZHRoIHdpbGwgYmUgY3JvcHBlZCovCi0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSAgKE00T1NBX1VJbnQzMikoKFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCBcCi0gICAgICAgICAgICAgICAgICAgICogUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSAvUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCk7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSAgKFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgICAgICBpZihNNE9TQV9GQUxTRSA9PSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+aXNQYW5ab29tKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggPSAoTTRPU0FfSW50MzIpKChNNE9TQV9JbnQzMilcCi0gICAgICAgICAgICAgICAgICAgICAgICAoKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggLSBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkpPj4xKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggKz0gKE00T1NBX0ludDMyKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICgoKE00T1NBX0ludDMyKSh0ZW1wV2lkdGggLSBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkpPj4xKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGwgQUlSIGZ1bmN0aW9ucyAqLwotICAgICAgICBpZihNNE9TQV9OVUxMID09IHBDLT5tX2Fpcl9jb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNEFJUl9jcmVhdGUoJnBDLT5tX2Fpcl9jb250ZXh0LCBNNEFJUl9rWVVWNDIwUCk7Ci0gICAgICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBDLT5tX3BEZWNvZGVkUGxhbmVbMF0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgIGZyZWUocEMtPm1fcERlY29kZWRQbGFuZSk7Ci0gICAgICAgICAgICAgICAgcEMtPm1fcERlY29kZWRQbGFuZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6XAotICAgICAgICAgICAgICAgICAgICAgRXJyb3Igd2hlbiBpbml0aWFsaXppbmcgQUlSOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRBSVJfY29uZmlndXJlKHBDLT5tX2Fpcl9jb250ZXh0LCAmUGFyYW1zKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OlwKLSAgICAgICAgICAgICAgICAgRXJyb3Igd2hlbiBjb25maWd1cmluZyBBSVI6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgTTRBSVJfY2xlYW5VcChwQy0+bV9haXJfY29udGV4dCk7Ci0gICAgICAgICAgICBmcmVlKHBDLT5tX3BEZWNvZGVkUGxhbmVbMF0ucGFjX2RhdGEpOwotICAgICAgICAgICAgZnJlZShwQy0+bV9wRGVjb2RlZFBsYW5lKTsKLSAgICAgICAgICAgIHBDLT5tX3BEZWNvZGVkUGxhbmUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IE00QUlSX2dldChwQy0+bV9haXJfY29udGV4dCwgcEMtPm1fcERlY29kZWRQbGFuZSwgcEltYWdlUGxhbmVzKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OiBFcnJvciB3aGVuIGdldHRpbmcgQUlSIHBsYW5lOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIE00QUlSX2NsZWFuVXAocEMtPm1fYWlyX2NvbnRleHQpOwotICAgICAgICAgICAgZnJlZShwQy0+bV9wRGVjb2RlZFBsYW5lWzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgIGZyZWUocEMtPm1fcERlY29kZWRQbGFuZSk7Ci0gICAgICAgICAgICBwQy0+bV9wRGVjb2RlZFBsYW5lID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgcEltYWdlUGxhbmVzWzBdID0gcEltYWdlUGxhbmVzMTsKLSAgICAgICAgcEltYWdlUGxhbmVzWzFdID0gcEltYWdlUGxhbmVzMjsKLSAgICAgICAgcEltYWdlUGxhbmVzWzJdID0gcEltYWdlUGxhbmVzMzsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEluY3JlbWVudCB0aGUgaW1hZ2UgY291bnRlciAqLwotICAgIHBDLT5tX0ltYWdlQ291bnRlcisrOwotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgZW5kIG9mIHNlcXVlbmNlICovCi0gICAgbGFzdF9mcmFtZV9mbGFnICAgID0gKHBDLT5tX0ltYWdlQ291bnRlciA+PSBwQy0+bV9OYkltYWdlKTsKLQotICAgIC8qKgotICAgICAqIEtlZXAgdGhlIHBpY3R1cmUgZHVyYXRpb24gKi8KLSAgICAqcFBpY3R1cmVEdXJhdGlvbiA9IHBDLT5tX3RpbWVEdXJhdGlvbjsKLQotICAgIGlmICgxID09IGxhc3RfZnJhbWVfZmxhZykKLSAgICB7Ci0gICAgICAgIGlmKE00T1NBX05VTEwgIT0gcEMtPm1fYWlyX2NvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00QUlSX2NsZWFuVXAocEMtPm1fYWlyX2NvbnRleHQpOwotICAgICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6IEVycm9yIHdoZW4gY2xlYW5pbmcgQUlSOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmKE00T1NBX05VTEwgIT0gcEMtPm1fcERlY29kZWRQbGFuZSkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+bV9wRGVjb2RlZFBsYW5lWzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgIGZyZWUocEMtPm1fcERlY29kZWRQbGFuZSk7Ci0gICAgICAgICAgICBwQy0+bV9wRGVjb2RlZFBsYW5lID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTTRQVE8zR1BQX1dBUl9MQVNUX1BJQ1RVUkU7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6IExlYXZpbmcgIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbFN0YXJ0Q29udmVydFBpY3R1cmVUbzNncChNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgUHRvM0dQUCB3aXRoIHRoZSBnaXZlbiBwYXJhbWV0ZXJzCi0gKiBAbm90ZSAgICBUaGUgIlBpY3R1cmVzIHRvIDNHUFAiIHBhcmFtZXRlcnMgYXJlIGdpdmVuIGJ5IHRoZSBpbnRlcm5hbCB4VlNTCi0gKiAgICAgICAgICAgIGNvbnRleHQuIFRoaXMgY29udGV4dCBjb250YWlucyBhIHBvaW50ZXIgb24gdGhlIGN1cnJlbnQgZWxlbWVudAotICogICAgICAgICAgICBvZiB0aGUgY2hhaW5lZCBsaXN0IG9mIFB0bzNHUFAgcGFyYW1ldGVycy4KLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNFBUTzNHUFBfV0FSX0xBU1RfUElDVFVSRTogVGhlIHJldHVybmVkIGltYWdlIGlzIHRoZSBsYXN0IG9uZQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxTdGFydENvbnZlcnRQaWN0dXJlVG8zZ3AoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qIERlZmluaXRpb25zIHRvIGdlbmVyYXRlIGR1bW15IEFNUiBmaWxlIHVzZWQgdG8gYWRkIEFNUiBzaWxlbmNlIGluIGZpbGVzIGdlbmVyYXRlZAotICAgICBieSBQdG8zR1BQICovCi0gICAgI2RlZmluZSBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkUgICAgIDEzCi0gICAgLyogVGhpcyBjb25zdGFudCBpcyBkZWZpbmVkIGluIE00VlNTM0dQUF9JbnRlcm5hbENvbmZpZy5oICovCi0gICAgZXh0ZXJuIGNvbnN0IE00T1NBX1VJbnQ4XAotICAgICAgICAgTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OFtNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkVdOwotCi0gICAgLyogQU1SIHNpbGVudCBmcmFtZSB1c2VkIHRvIGNvbXB1dGUgZHVtbXkgQU1SIHNpbGVuY2UgZmlsZSAqLwotICAgICNkZWZpbmUgTTRWU1MzR1BQX0FNUl9IRUFERVJfU0laRSA2Ci0gICAgY29uc3QgTTRPU0FfVUludDggTTRWU1MzR1BQX0FNUl9IRUFERVJbTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFXSA9Ci0gICAgeyAweDIzLCAweDIxLCAweDQxLCAweDRkLCAweDUyLCAweDBhIH07Ci0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIE00eFZTU19Db250ZXh0KiB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRQVE8zR1BQX0NvbnRleHQgcE00UFRPM0dQUF9DdHh0ID0gTTRPU0FfTlVMTDsKLSAgICBNNFBUTzNHUFBfUGFyYW1zIFBhcmFtczsKLSAgICAgTTR4VlNTX1BpY3R1cmVDYWxsYmFja0N0eHQqICAgIHBDYWxsQmFja0N0eHQ7Ci0gICAgTTRPU0FfQm9vbCBjbXBSZXN1bHQ9TTRPU0FfRkFMU0U7Ci0gICAgTTRPU0FfQ29udGV4dCBwRHVtbXlBTVJGaWxlOwotICAgIE00T1NBX0NoYXIgb3V0X2FtcltNNFhWU1NfTUFYX1BBVEhfTEVOXTsKLSAgICAvKlVURiBjb252ZXJzaW9uIHN1cHBvcnQqLwotICAgIE00T1NBX0NoYXIqIHBEZWNvZGVkUGF0aCA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBNNFBUTzNHUFAgaW5zdGFuY2UgKi8KLSAgICBlcnIgPSBNNFBUTzNHUFBfSW5pdCggJnBNNFBUTzNHUFBfQ3R4dCwgeFZTU19jb250ZXh0LT5wRmlsZVJlYWRQdHIsCi0gICAgICAgICB4VlNTX2NvbnRleHQtPnBGaWxlV3JpdGVQdHIpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxTdGFydENvbnZlcnRQaWN0dXJlVG8zZ3AgcmV0dXJuZWQgJWxkXG4iLGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcENhbGxCYWNrQ3R4dCA9IChNNHhWU1NfUGljdHVyZUNhbGxiYWNrQ3R4dCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNHhWU1NfUGljdHVyZUNhbGxiYWNrQ3R4dCksCi0gICAgICAgICBNNFZTLChNNE9TQV9DaGFyICopICJQdG8zZ3BwIGNhbGxiYWNrIHN0cnVjdCIpOwotICAgIGlmKHBDYWxsQmFja0N0eHQgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19pbnRlcm5hbFN0YXJ0Q29udmVydFBpY3R1cmVUbzNncCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgUGFyYW1zLk91dHB1dFZpZGVvRnJhbWVTaXplID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplOwotICAgIFBhcmFtcy5PdXRwdXRWaWRlb0Zvcm1hdCA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0OwotICAgIFBhcmFtcy52aWRlb1Byb2ZpbGUgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1Byb2ZpbGU7Ci0gICAgUGFyYW1zLnZpZGVvTGV2ZWwgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0xldmVsOwotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGUgImR1bW15IiBhbXIgZmlsZSBjb250YWluaW5nIHNpbGVuY2UgaW4gdGVtcG9yYXJ5IGZvbGRlciAqLwotICAgIE00T1NBX2Nock5Db3B5KG91dF9hbXIsIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoLCBNNFhWU1NfTUFYX1BBVEhfTEVOIC0gMSk7Ci0gICAgc3RybmNhdCgoY2hhciAqKW91dF9hbXIsIChjb25zdCBjaGFyICopImR1bW15LmFtclwwIiwgMTApOwotCi0gICAgLyoqCi0gICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgdGhlIHRlbXBvcmFyeSBwYXRoIGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCovCi0gICAgcERlY29kZWRQYXRoID0gb3V0X2FtcjsKLQotICAgIGlmKHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIGxlbmd0aCA9IDA7Ci0gICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsIChNNE9TQV9Wb2lkKikgb3V0X2FtciwKLSAgICAgICAgICAgICAoTTRPU0FfVm9pZCopIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxTdGFydENvbnZlcnRQaWN0dXJlVG8zZ3A6XAotICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICogRW5kIG9mIHRoZSBjb252ZXJzaW9uLCBub3cgdXNlIHRoZSBjb252ZXJ0ZWQgcGF0aCovCi0KLSAgICBlcnIgPSB4VlNTX2NvbnRleHQtPnBGaWxlV3JpdGVQdHItPm9wZW5Xcml0ZSgmcER1bW15QU1SRmlsZSwgcERlY29kZWRQYXRoLCBNNE9TQV9rRmlsZVdyaXRlKTsKLQotICAgIC8qQ29tbWVudGVkIGJlY2F1c2Ugb2YgdGhlIHVzZSBvZiB0aGUgVVRGIGNvbnZlcnNpb24gc2VlIGFib3ZlKi8KLS8qICAgIGVyciA9IHhWU1NfY29udGV4dC0+cEZpbGVXcml0ZVB0ci0+b3BlbldyaXRlKCZwRHVtbXlBTVJGaWxlLCBvdXRfYW1yLCBNNE9TQV9rRmlsZVdyaXRlKTsKLSAqLwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRQaWN0dXJlVG8zZ3A6IENhbid0IG9wZW4gb3V0cHV0IGR1bW15IGFtciBmaWxlICVzLFwKLSAgICAgICAgICAgICBlcnJvcjogMHgleFxuIixvdXRfYW1yLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGVyciA9ICB4VlNTX2NvbnRleHQtPnBGaWxlV3JpdGVQdHItPndyaXRlRGF0YShwRHVtbXlBTVJGaWxlLAotICAgICAgICAoTTRPU0FfSW50OCopTTRWU1MzR1BQX0FNUl9IRUFERVIsIE00VlNTM0dQUF9BTVJfSEVBREVSX1NJWkUpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRQaWN0dXJlVG8zZ3A6IENhbid0IHdyaXRlIG91dHB1dCBkdW1teSBhbXIgZmlsZSAlcyxcCi0gICAgICAgICAgICAgZXJyb3I6IDB4JXhcbiIsb3V0X2FtciwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSAgeFZTU19jb250ZXh0LT5wRmlsZVdyaXRlUHRyLT53cml0ZURhdGEocER1bW15QU1SRmlsZSwKLSAgICAgICAgIChNNE9TQV9JbnQ4KilNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4LCBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkUpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRQaWN0dXJlVG8zZ3A6IFwKLSAgICAgICAgICAgIENhbid0IHdyaXRlIG91dHB1dCBkdW1teSBhbXIgZmlsZSAlcywgZXJyb3I6IDB4JXhcbiIsb3V0X2FtciwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSAgeFZTU19jb250ZXh0LT5wRmlsZVdyaXRlUHRyLT5jbG9zZVdyaXRlKHBEdW1teUFNUkZpbGUpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRQaWN0dXJlVG8zZ3A6IFwKLSAgICAgICAgICAgIENhbid0IGNsb3NlIG91dHB1dCBkdW1teSBhbXIgZmlsZSAlcywgZXJyb3I6IDB4JXhcbiIsb3V0X2FtciwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaWxsIHBhcmFtZXRlcnMgZm9yIFB0bzNHUFAgd2l0aCB0aGUgcGFyYW1ldGVycyBjb250YWluZWQgaW4gdGhlIGN1cnJlbnQgZWxlbWVudCBvZiB0aGUKLSAgICAgKiBQdG8zR1BQIHBhcmFtZXRlcnMgY2hhaW5lZCBsaXN0IGFuZCB3aXRoIGRlZmF1bHQgcGFyYW1ldGVycyAqLwotLyorIE5ldyBFbmNvZGVyIGJpdHJhdGVzICovCi0gICAgaWYoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9CaXRyYXRlID09IDApIHsKLSAgICAgICAgUGFyYW1zLk91dHB1dFZpZGVvQml0cmF0ZSAgICA9IE00VklERU9FRElUSU5HX2tWQVJJQUJMRV9LQlBTOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgICBQYXJhbXMuT3V0cHV0VmlkZW9CaXRyYXRlID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9CaXRyYXRlOwotICAgIH0KLSAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsU3RhcnRDb252ZXJ0UGljVG8zR1A6IHZpZGVvIGJpdHJhdGUgPSAlZCIsCi0gICAgICAgIFBhcmFtcy5PdXRwdXRWaWRlb0JpdHJhdGUpOwotLyotIE5ldyBFbmNvZGVyIGJpdHJhdGVzICovCi0gICAgUGFyYW1zLk91dHB1dEZpbGVNYXhTaXplICAgID0gTTRQVE8zR1BQX2tVTkxJTUlURUQ7Ci0gICAgUGFyYW1zLnBQaWN0dXJlQ2FsbGJhY2tGY3QgICAgPSBNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OwotICAgIFBhcmFtcy5wUGljdHVyZUNhbGxiYWNrQ3R4dCAgICA9IHBDYWxsQmFja0N0eHQ7Ci0gICAgLypGQjogY2hhbmdlIHRvIHVzZSB0aGUgY29udmVydGVkIHBhdGggKFVURiBjb252ZXJzaW9uKSBzZWUgdGhlIGNvbnZlcnNpb24gYWJvdmUqLwotICAgIC8qRml4IDotIEFkZGluZyBBdWRpbyBUcmFjayBpbiBJbWFnZSBhcyBpbnB1dCA6QXVkaW9UYXJja0ZpbGUgU2V0dGluZyB0byBOVUxMICovCi0gICAgUGFyYW1zLnBJbnB1dEF1ZGlvVHJhY2tGaWxlICAgID0gTTRPU0FfTlVMTDsvLyhNNE9TQV9Wb2lkKilwRGVjb2RlZFBhdGg7Ly9vdXRfYW1yOwotICAgIFBhcmFtcy5BdWRpb1BhZGRpbmdNb2RlICAgICAgICA9IE00UFRPM0dQUF9rQXVkaW9QYWRkaW5nTW9kZV9Mb29wOwotICAgIFBhcmFtcy5BdWRpb0ZpbGVGb3JtYXQgICAgICAgID0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FNUjsKLSAgICBQYXJhbXMucE91dHB1dDNncHBGaWxlICAgICAgICA9IHhWU1NfY29udGV4dC0+cFBUbzNHUFBjdXJyZW50UGFyYW1zLT5wRmlsZU91dDsKLSAgICBQYXJhbXMucFRlbXBvcmFyeUZpbGUgICAgICAgID0geFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMtPnBGaWxlVGVtcDsKLSAgICAvKitQUiBObzogIGJscm54cHN3IzIyMyovCi0gICAgLypJbmNyZWFzaW5nIGZyZXF1ZW5jeSBvZiBGcmFtZSwgY2FsY3VsYXRpbmcgTm9zIG9mIEZyYW1lID0gZHVyYXRpb24gL0ZQUyAqLwotICAgIC8qT3RoZXIgY2hhbmdlcyBtYWRlIGlzIEAgTTR4VlNTX0FQSS5jIEAgbGluZSAzODQxIGluIE00eFZTU19TZW5kQ29tbWFuZCovCi0gICAgLypJZiBjYXNlIGNoZWNrIGZvciBQYW5ab29tIHJlbW92ZWQgKi8KLSAgICBQYXJhbXMuTmJWaWRlb0ZyYW1lcyAgICAgICAgICAgID0gKE00T1NBX1VJbnQzMikKLSAgICAgICAgKHhWU1NfY29udGV4dC0+cFBUbzNHUFBjdXJyZW50UGFyYW1zLT5kdXJhdGlvbiBcCi0gICAgICAgICAgICAvIHhWU1NfY29udGV4dC0+cFBUbzNHUFBjdXJyZW50UGFyYW1zLT5mcmFtZXJhdGUpOyAvKiAqLwotICAgIHBDYWxsQmFja0N0eHQtPm1fdGltZUR1cmF0aW9uICAgID0geFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMtPmZyYW1lcmF0ZTsKLSAgICAvKi1QUiBObzogIGJscm54cHN3IzIyMyovCi0gICAgcENhbGxCYWNrQ3R4dC0+bV9JbWFnZUNvdW50ZXIgICAgPSAwOwotICAgIHBDYWxsQmFja0N0eHQtPm1fRmlsZUluICAgICAgICAgICAgPSB4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtcy0+cEZpbGVJbjsKLSAgICBwQ2FsbEJhY2tDdHh0LT5tX05iSW1hZ2UgICAgICAgID0gUGFyYW1zLk5iVmlkZW9GcmFtZXM7Ci0gICAgcENhbGxCYWNrQ3R4dC0+bV9wRmlsZVJlYWRQdHIgICAgPSB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0cjsKLSAgICBwQ2FsbEJhY2tDdHh0LT5tX3BEZWNvZGVkUGxhbmUgICAgPSBNNE9TQV9OVUxMOwotICAgIHBDYWxsQmFja0N0eHQtPm1fcFB0bzNHUFBwYXJhbXMgICAgPSB4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtczsKLSAgICBwQ2FsbEJhY2tDdHh0LT5tX2Fpcl9jb250ZXh0ICAgID0gTTRPU0FfTlVMTDsKLSAgICBwQ2FsbEJhY2tDdHh0LT5tX21lZGlhUmVuZGVyaW5nID0geFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMtPk1lZGlhUmVuZGVyaW5nOwotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBpbnB1dCBhbmQgb3V0cHV0IGZpbGVzICovCi0gICAgZXJyID0gTTRQVE8zR1BQX09wZW4ocE00UFRPM0dQUF9DdHh0LCAmUGFyYW1zKTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX09wZW4gcmV0dXJuZWQ6IDB4JXhcbiIsZXJyKTsKLSAgICAgICAgaWYocENhbGxCYWNrQ3R4dCAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDYWxsQmFja0N0eHQpOwotICAgICAgICAgICAgcENhbGxCYWNrQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgTTRQVE8zR1BQX0NsZWFuVXAocE00UFRPM0dQUF9DdHh0KTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlIGNvbnRleHQgdG8gYmUgYWJsZSB0byBjYWxsIFB0bzNHUFAgc3RlcCBmdW5jdGlvbiBpbiBNNHhWU1Nfc3RlcCBmdW5jdGlvbiAqLwotICAgIHhWU1NfY29udGV4dC0+cE00UFRPM0dQUF9DdHh0ID0gcE00UFRPM0dQUF9DdHh0OwotICAgIHhWU1NfY29udGV4dC0+cENhbGxCYWNrQ3R4dCA9IHBDYWxsQmFja0N0eHQ7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsU3RvcENvbnZlcnRQaWN0dXJlVG8zZ3AoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGNsZWFucyB1cCBQdG8zR1BQCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgVGhlIGludGVncmF0b3Igb3duIGNvbnRleHQKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbFN0b3BDb252ZXJ0UGljdHVyZVRvM2dwKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9DaGFyIG91dF9hbXJbTTRYVlNTX01BWF9QQVRIX0xFTl07Ci0gICAgLypVVEYgY29udmVyc2lvbiBzdXBwb3J0Ki8KLSAgICBNNE9TQV9DaGFyKiBwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBQVE8zR1BQIGNhbGxiYWNrIGNvbnRleHQgKi8KLSAgICBpZihNNE9TQV9OVUxMICE9IHhWU1NfY29udGV4dC0+cENhbGxCYWNrQ3R4dCkKLSAgICB7Ci0gICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQ2FsbEJhY2tDdHh0KTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ2FsbEJhY2tDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5hbGl6ZSB0aGUgb3V0cHV0IGZpbGUgKi8KLSAgICBlcnIgPSBNNFBUTzNHUFBfQ2xvc2UoeFZTU19jb250ZXh0LT5wTTRQVE8zR1BQX0N0eHQpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfQ2xvc2UgcmV0dXJuZWQgMHgleFxuIixlcnIpOwotICAgICAgICBNNFBUTzNHUFBfQ2xlYW5VcCh4VlNTX2NvbnRleHQtPnBNNFBUTzNHUFBfQ3R4dCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRnJlZSB0aGlzIE00UFRPM0dQUCBpbnN0YW5jZSAqLwotICAgIGVyciA9IE00UFRPM0dQUF9DbGVhblVwKHhWU1NfY29udGV4dC0+cE00UFRPM0dQUF9DdHh0KTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX0NsZWFuVXAgcmV0dXJuZWQgMHgleFxuIixlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZSBkdW1teS5hbXIgZmlsZSAqLwotICAgIE00T1NBX2Nock5Db3B5KG91dF9hbXIsIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoLCBNNFhWU1NfTUFYX1BBVEhfTEVOIC0gMSk7Ci0gICAgc3RybmNhdCgoY2hhciAqKW91dF9hbXIsIChjb25zdCBjaGFyICopImR1bW15LmFtclwwIiwgMTApOwotCi0gICAgLyoqCi0gICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgdGhlIHRlbXBvcmFyeSBwYXRoIGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCovCi0gICAgcERlY29kZWRQYXRoID0gb3V0X2FtcjsKLQotICAgIGlmKHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIGxlbmd0aCA9IDA7Ci0gICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsIChNNE9TQV9Wb2lkKikgb3V0X2FtciwKLSAgICAgICAgICAgICAoTTRPU0FfVm9pZCopIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxTdG9wQ29udmVydFBpY3R1cmVUbzNncDpcCi0gICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgcERlY29kZWRQYXRoID0geFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgfQotICAgIC8qKgotICAgICogRW5kIG9mIHRoZSBjb252ZXJzaW9uLCBub3cgdXNlIHRoZSBkZWNvZGVkIHBhdGgqLwotICAgIHJlbW92ZSgoY29uc3QgY2hhciAqKXBEZWNvZGVkUGF0aCk7Ci0KLSAgICAvKkNvbW1lbnRlZCBiZWNhdXNlIG9mIHRoZSB1c2Ugb2YgdGhlIFVURiBjb252ZXJzaW9uKi8KLS8qICAgIHJlbW92ZShvdXRfYW1yKTsKLSAqLwotCi0gICAgeFZTU19jb250ZXh0LT5wTTRQVE8zR1BQX0N0eHQgPSBNNE9TQV9OVUxMOwotICAgIHhWU1NfY29udGV4dC0+cENhbGxCYWNrQ3R4dCA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVVihNNHhWU1NfRnJhbWluZ1N0cnVjdCogZnJhbWluZ0N0eCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGFuIFJHQjU2NSBwbGFuZSB0byBZVVY0MjAgcGxhbmFyCi0gKiBAbm90ZSAgICBJdCBpcyB1c2VkIG9ubHkgZm9yIGZyYW1pbmcgZWZmZWN0Ci0gKiAgICAgICAgICAgIEl0IGFsbG9jYXRlcyBvdXRwdXQgWVVWIHBsYW5lcwotICogQHBhcmFtICAgIGZyYW1pbmdDdHggICAgKElOKSBUaGUgZnJhbWluZyBzdHJ1Y3QgY29udGFpbmluZyBpbnB1dCBSR0I1NjUgcGxhbmUKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6IEFsbG9jYXRpb24gZXJyb3IgKG5vIG1vcmUgbWVtb3J5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWKE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4KQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICAvKioKLSAgICAgKiBBbGxvY2F0ZSBvdXRwdXQgWVVWIHBsYW5lcyAqLwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSAoTTRWSUZJX0ltYWdlUGxhbmUqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygzKnNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSksCi0gICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVY6IE91dHB1dCBwbGFuZSBZVVYiKTsKLSAgICBpZihmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVYiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfd2lkdGggPSBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9oZWlnaHQgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X2hlaWdodDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfdG9wbGVmdCA9IDA7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3N0cmlkZSA9IGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGg7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSA9Ci0gICAgICAgICAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV93aWR0aFwKLSAgICAgICAgICAgICpmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0KjMpPj4xLCBNNFZTLCAoTTRPU0FfQ2hhciAqKVwKLSAgICAgICAgICAgICAgICAiQWxsb2MgZm9yIHRoZSBDb252ZXJ0aW9uIG91dHB1dCBZVVYiKTs7Ci0gICAgaWYoZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3dpZHRoID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGgpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV9oZWlnaHQgPSAoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV90b3BsZWZ0ID0gMDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfc3RyaWRlID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGgpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0ucGFjX2RhdGEgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhIFwKLSAgICAgICAgKyBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfd2lkdGggKiBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0OwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV93aWR0aCA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfaGVpZ2h0ID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0KT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS51X3N0cmlkZSA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnBhY19kYXRhID0gZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS5wYWNfZGF0YSBcCi0gICAgICAgICsgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3dpZHRoICogZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X2hlaWdodDsKLQotICAgIC8qKgotICAgICAqIENvbnZlcnQgaW5wdXQgUkdCIDU2NSB0byBZVVYgNDIwIHRvIGJlIGFibGUgdG8gbWVyZ2UgaXQgd2l0aCBvdXRwdXQgdmlkZW8gaW4gZnJhbWluZwotICAgICAgZWZmZWN0ICovCi0gICAgZXJyID0gTTRWSUZJX3hWU1NfUkdCNTY1dG9ZVVY0MjAoTTRPU0FfTlVMTCwgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYiwgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dik7Ci0gICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWOlwKLSAgICAgICAgICAgICBlcnJvciB3aGVuIGNvbnZlcnRpbmcgZnJvbSBSR0IgdG8gWVVWOiAweCV4XG4iLCBlcnIpOwotICAgIH0KLQotICAgIGZyYW1pbmdDdHgtPmR1cmF0aW9uID0gMDsKLSAgICBmcmFtaW5nQ3R4LT5wcmV2aW91c0NsaXBUaW1lID0gLTE7Ci0gICAgZnJhbWluZ0N0eC0+cHJldmlld09mZnNldENsaXBUaW1lID0gLTE7Ci0KLSAgICAvKioKLSAgICAgKiBPbmx5IG9uZSBlbGVtZW50IGluIHRoZSBjaGFpbmVkIGxpc3QgKG5vIGFuaW1hdGVkIGltYWdlIHdpdGggUkdCIGJ1ZmZlci4uLikgKi8KLSAgICBmcmFtaW5nQ3R4LT5wQ3VycmVudCA9IGZyYW1pbmdDdHg7Ci0gICAgZnJhbWluZ0N0eC0+cE5leHQgPSBmcmFtaW5nQ3R4OwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxTZXRQbGFuZVRyYW5zcGFyZW50KE00T1NBX1VJbnQ4KiBwbGFuZUluLCBNNE9TQV9VSW50MzIgc2l6ZSkKLXsKLSAgICBNNE9TQV9VSW50MzIgaTsKLSAgICBNNE9TQV9VSW50OCogcGxhbmUgPSBwbGFuZUluOwotICAgIE00T1NBX1VJbnQ4IHRyYW5zcGFyZW50MSA9IChNNE9TQV9VSW50OCkoKFRSQU5TUEFSRU5UX0NPTE9SICYgMHhGRjAwKT4+OCk7Ci0gICAgTTRPU0FfVUludDggdHJhbnNwYXJlbnQyID0gKE00T1NBX1VJbnQ4KVRSQU5TUEFSRU5UX0NPTE9SOwotCi0gICAgZm9yKGk9MDsgaTwoc2l6ZT4+MSk7IGkrKykKLSAgICB7Ci0gICAgICAgICpwbGFuZSsrID0gdHJhbnNwYXJlbnQxOwotICAgICAgICAqcGxhbmUrKyA9IHRyYW5zcGFyZW50MjsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydEFSQkc4ODh0b1lVVjQyMF9GcmFtbWluZ0VmZmVjdChNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MqIHBFZmZlY3QsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSBPdXRwdXRWaWRlb1Jlc29sdXRpb24pCi0gKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gY29udmVydHMgQVJHQjg4ODggaW5wdXQgZmlsZSAgdG8gWVVWNDIwIHdoZW51c2VkIGZvciBmcmFtbWluZyBlZmZlY3QKLSAqIEBub3RlICAgIFRoZSBpbnB1dCBBUkdCODg4OCBmaWxlIHBhdGggaXMgY29udGFpbmVkIGluIHRoZSBwRWZmZWN0IHN0cnVjdHVyZQotICogICAgICAgICAgICBJZiB0aGUgQVJHQjg4ODggbXVzdCBiZSByZXNpemVkIHRvIGZpdCBvdXRwdXQgdmlkZW8gc2l6ZSwgdGhpcyBmdW5jdGlvbgotICogICAgICAgICAgICB3aWxsIGRvIGl0LgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgVGhlIGludGVncmF0b3Igb3duIGNvbnRleHQKLSAqIEBwYXJhbSAgICBwRWZmZWN0ICAgICAgICAoSU4pIFRoZSBlZmZlY3Qgc3RydWN0dXJlIGNvbnRhaW5pbmcgYWxsIGluZm9ybWF0aW9ucyBvbgotICogICAgICAgICAgICAgICAgICAgICAgICB0aGUgZmlsZSB0byBkZWNvZGUsIHJlc2l6aW5nIC4uLgotICogQHBhcmFtICAgIGZyYW1pbmdDdHggICAgKElOL09VVCkgU3RydWN0dXJlIGluIHdoaWNoIHRoZSBvdXRwdXQgUkdCIHdpbGwgYmUgc3RvcmVkCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiBBbGxvY2F0aW9uIGVycm9yIChubyBtb3JlIG1lbW9yeSkKLSAqIEByZXR1cm4gICAgTTRFUlJfRklMRV9OT1RfRk9VTkQ6IEZpbGUgbm90IGZvdW5kLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3QoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyogcEVmZmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZVNpemVcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRWaWRlb1Jlc29sdXRpb24pCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfQ29udGV4dCBwQVJHQkluOwotICAgIE00T1NBX1VJbnQzMiBmaWxlX3NpemU7Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfVUludDMyIHdpZHRoLCBoZWlnaHQsIHdpZHRoX291dCwgaGVpZ2h0X291dDsKLSAgICBNNE9TQV9Wb2lkKiBwRmlsZSA9IHBFZmZlY3QtPnhWU1MucEZyYW1pbmdGaWxlUGF0aDsKLSAgICBNNE9TQV9VSW50OCB0cmFuc3BhcmVudDEgPSAoTTRPU0FfVUludDgpKChUUkFOU1BBUkVOVF9DT0xPUiAmIDB4RkYwMCk+PjgpOwotICAgIE00T1NBX1VJbnQ4IHRyYW5zcGFyZW50MiA9IChNNE9TQV9VSW50OClUUkFOU1BBUkVOVF9DT0xPUjsKLSAgICAvKlVURiBjb252ZXJzaW9uIHN1cHBvcnQqLwotICAgIE00T1NBX0NoYXIqIHBEZWNvZGVkUGF0aCA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfVUludDMyIGkgPSAwLGogPSAwOwotICAgIE00VklGSV9JbWFnZVBsYW5lIHJnYlBsYW5lOwotICAgIE00T1NBX1VJbnQzMiBmcmFtZVNpemVfYXJnYj0oZnJhbWluZ0N0eC0+d2lkdGggKiBmcmFtaW5nQ3R4LT5oZWlnaHQgKiA0KTsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVTaXplOwotICAgIE00T1NBX1VJbnQzMiB0ZW1wQWxwaGFQZXJjZW50ID0gMDsKLSAgICBNNFZJRklfVUludDgqIFRlbXBQYWNEYXRhID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9VSW50MTYgKnB0ciA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfVUludDMyIHogPSAwOwotCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3Q6IEVudGVyaW5nICIpOwotCi0gICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3Qgd2lkdGggYW5kIGhlaWdodCAlZCAlZCAiLAotICAgICAgICBmcmFtaW5nQ3R4LT53aWR0aCxmcmFtaW5nQ3R4LT5oZWlnaHQpOwotCi0gICAgTTRPU0FfVUludDggKnBUbXBEYXRhID0gKE00T1NBX1VJbnQ4KikgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGZyYW1lU2l6ZV9hcmdiLCBNNFZTLCAoTTRPU0FfQ2hhciopXAotICAgICAgICAiSW1hZ2UgYXJnYiBkYXRhIik7Ci0gICAgaWYocFRtcERhdGEgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgSW1hZ2UgY2xpcCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IHRoZSBmaWxlIHBhdGggaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0Ki8KLSAgICBwRGVjb2RlZFBhdGggPSBwRmlsZTsKLQotICAgIGlmKHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIGxlbmd0aCA9IDA7Ci0gICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsIChNNE9TQV9Wb2lkKikgcEZpbGUsCi0gICAgICAgICAgICAgKE00T1NBX1ZvaWQqKSB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwgJmxlbmd0aCk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsRGVjb2RlUE5HOlwKLSAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4IHJldHVybnMgZXJyOiAweCV4IixlcnIpOwotICAgICAgICAgICAgZnJlZShwVG1wRGF0YSk7Ci0gICAgICAgICAgICBwVG1wRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICogRW5kIG9mIHRoZSBjb252ZXJzaW9uLCBub3cgdXNlIHRoZSBkZWNvZGVkIHBhdGgqLwotCi0gICAgIC8qIE9wZW4gaW5wdXQgQVJHQjg4ODggZmlsZSBhbmQgc3RvcmUgaXQgaW50byBtZW1vcnkgKi8KLSAgICBlcnIgPSB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0ci0+b3BlblJlYWQoJnBBUkdCSW4sIHBEZWNvZGVkUGF0aCwgTTRPU0Ffa0ZpbGVSZWFkKTsKLQotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIkNhbid0IG9wZW4gaW5wdXQgQVJHQjg4ODggZmlsZSAlcywgZXJyb3I6IDB4JXhcbiIscEZpbGUsIGVycik7Ci0gICAgICAgIGZyZWUocFRtcERhdGEpOwotICAgICAgICBwVG1wRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0geFZTU19jb250ZXh0LT5wRmlsZVJlYWRQdHItPnJlYWREYXRhKHBBUkdCSW4sKE00T1NBX01lbUFkZHI4KXBUbXBEYXRhLCAmZnJhbWVTaXplX2FyZ2IpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wRmlsZVJlYWRQdHItPmNsb3NlUmVhZChwQVJHQkluKTsKLSAgICAgICAgZnJlZShwVG1wRGF0YSk7Ci0gICAgICAgIHBUbXBEYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLQotICAgIGVyciA9ICB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0ci0+Y2xvc2VSZWFkKHBBUkdCSW4pOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIkNhbid0IGNsb3NlIGlucHV0IHBuZyBmaWxlICVzLCBlcnJvcjogMHgleFxuIixwRmlsZSwgZXJyKTsKLSAgICAgICAgZnJlZShwVG1wRGF0YSk7Ci0gICAgICAgIHBUbXBEYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLQotICAgIHJnYlBsYW5lLnVfaGVpZ2h0ID0gZnJhbWluZ0N0eC0+aGVpZ2h0OwotICAgIHJnYlBsYW5lLnVfd2lkdGggPSBmcmFtaW5nQ3R4LT53aWR0aDsKLSAgICByZ2JQbGFuZS51X3N0cmlkZSA9IHJnYlBsYW5lLnVfd2lkdGgqMzsKLSAgICByZ2JQbGFuZS51X3RvcGxlZnQgPSAwOwotCi0gICAgZnJhbWVTaXplID0gKHJnYlBsYW5lLnVfd2lkdGggKiByZ2JQbGFuZS51X2hlaWdodCAqIDMpOyAvL1NpemUgb2YgUkdCODg4IGRhdGEKLSAgICByZ2JQbGFuZS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygoKGZyYW1lU2l6ZSkrICgyICogZnJhbWluZ0N0eC0+d2lkdGgpKSwKLSAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyKikiSW1hZ2UgY2xpcCBSR0I4ODggZGF0YSIpOwotICAgIGlmKHJnYlBsYW5lLnBhY19kYXRhID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgSW1hZ2UgY2xpcCIpOwotICAgICAgICBmcmVlKHBUbXBEYXRhKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4OHRvWVVWNDIwX0ZyYW1taW5nRWZmZWN0OlwKLSAgICAgICAgICBSZW1vdmUgdGhlIGFscGhhIGNoYW5uZWwgICIpOwotCi0gICAgLyogcHJlbXVsdGlwbGllZCBhbHBoYSAlIG9uIFJHQiAqLwotICAgIGZvciAoaT0wLCBqID0gMDsgaSA8IGZyYW1lU2l6ZV9hcmdiOyBpICs9IDQpIHsKLSAgICAgICAgLyogdGhpcyBpcyBhbHBoYSB2YWx1ZSAqLwotICAgICAgICBpZiAoKGkgJSA0KSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICB0ZW1wQWxwaGFQZXJjZW50ID0gcFRtcERhdGFbaV07Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBSICovCi0gICAgICAgIHJnYlBsYW5lLnBhY19kYXRhW2pdID0gcFRtcERhdGFbaSsxXTsKLSAgICAgICAgaisrOwotCi0gICAgICAgIC8qIEcgKi8KLSAgICAgICAgaWYgKHRlbXBBbHBoYVBlcmNlbnQgPiAwKSB7Ci0gICAgICAgICAgICByZ2JQbGFuZS5wYWNfZGF0YVtqXSA9IHBUbXBEYXRhW2krMl07Ci0gICAgICAgICAgICBqKys7Ci0gICAgICAgIH0gZWxzZSB7LyogSW4gY2FzZSBvZiBhbHBoYSB2YWx1ZSAwLCBtYWtlIEdSRUVOIHRvIDI1NSAqLwotICAgICAgICAgICAgcmdiUGxhbmUucGFjX2RhdGFbal0gPSAyNTU7IC8vcFRtcERhdGFbaSsyXTsKLSAgICAgICAgICAgIGorKzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEIgKi8KLSAgICAgICAgcmdiUGxhbmUucGFjX2RhdGFbal0gPSBwVG1wRGF0YVtpKzNdOwotICAgICAgICBqKys7Ci0gICAgfQotCi0gICAgZnJlZShwVG1wRGF0YSk7Ci0gICAgcFRtcERhdGEgPSBNNE9TQV9OVUxMOwotCi0gICAgLyogY29udmVydCBSR0I4ODggdG8gUkdCNTY1ICovCi0KLSAgICAvKiBhbGxvY2F0ZSB0ZW1wIFJHQiA1NjUgYnVmZmVyICovCi0gICAgVGVtcFBhY0RhdGEgPSAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoZnJhbWVTaXplICsKLSAgICAgICAgICAgICAgICAgICAgICAgKDQgKiAoZnJhbWluZ0N0eC0+d2lkdGggKyBmcmFtaW5nQ3R4LT5oZWlnaHQgKyAxKSksCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciopIkltYWdlIGNsaXAgUkdCNTY1IGRhdGEiKTsKLSAgICBpZiAoVGVtcFBhY0RhdGEgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgSW1hZ2UgY2xpcCBSR0I1NjUgZGF0YSIpOwotICAgICAgICBmcmVlKHJnYlBsYW5lLnBhY19kYXRhKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHB0ciA9IChNNE9TQV9VSW50MTYgKilUZW1wUGFjRGF0YTsKLSAgICB6ID0gMDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBqIDsgaSArPSAzKQotICAgIHsKLSAgICAgICAgcHRyW3orK10gPSBQQUNLX1JHQjU2NSgwLCAgIHJnYlBsYW5lLnBhY19kYXRhW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiUGxhbmUucGFjX2RhdGFbaSsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYlBsYW5lLnBhY19kYXRhW2krMl0pOwotICAgIH0KLQotICAgIC8qIGZyZWUgdGhlIFJCRzg4OCBhbmQgYXNzaWduIFJHQjU2NSAqLwotICAgIGZyZWUocmdiUGxhbmUucGFjX2RhdGEpOwotICAgIHJnYlBsYW5lLnBhY19kYXRhID0gVGVtcFBhY0RhdGE7Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBpZiBvdXRwdXQgc2l6ZXMgYXJlIG9kZCAqLwotICAgIGlmKHJnYlBsYW5lLnVfaGVpZ2h0ICUgMiAhPSAwKQotICAgIHsKLSAgICAgICAgTTRWSUZJX1VJbnQ4KiBvdXRwdXRfcGFjX2RhdGEgPSByZ2JQbGFuZS5wYWNfZGF0YTsKLSAgICAgICAgTTRPU0FfVUludDMyIGk7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4OHRvWVVWNDIwX0ZyYW1taW5nRWZmZWN0OlwKLSAgICAgICAgICAgICBvdXRwdXQgaGVpZ2h0IGlzIG9kZCAgIik7Ci0gICAgICAgIG91dHB1dF9wYWNfZGF0YSArPXJnYlBsYW5lLnVfd2lkdGggKiByZ2JQbGFuZS51X2hlaWdodCoyOwotCi0gICAgICAgIGZvcihpPTA7aTxyZ2JQbGFuZS51X3dpZHRoO2krKykKLSAgICAgICAgewotICAgICAgICAgICAgKm91dHB1dF9wYWNfZGF0YSsrID0gdHJhbnNwYXJlbnQxOwotICAgICAgICAgICAgKm91dHB1dF9wYWNfZGF0YSsrID0gdHJhbnNwYXJlbnQyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdlIGp1c3QgYWRkIGEgd2hpdGUgbGluZSB0byB0aGUgUE5HIHRoYXQgd2lsbCBiZSB0cmFuc3BhcmVudCAqLwotICAgICAgICByZ2JQbGFuZS51X2hlaWdodCsrOwotICAgIH0KLSAgICBpZihyZ2JQbGFuZS51X3dpZHRoICUgMiAhPSAwKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdlIGFkZCBhIG5ldyBjb2x1bW4gb2Ygd2hpdGUgKD10cmFuc3BhcmVudCksIGJ1dCB3ZSBuZWVkIHRvIHBhcnNlIGFsbCBSR0IgbGluZXMgLi4uICovCi0gICAgICAgIE00T1NBX1VJbnQzMiBpOwotICAgICAgICBNNFZJRklfVUludDgqIG5ld1JHQnBhY19kYXRhOwotICAgICAgICBNNFZJRklfVUludDgqIG91dHB1dF9wYWNfZGF0YSwgKmlucHV0X3BhY19kYXRhOwotCi0gICAgICAgIHJnYlBsYW5lLnVfd2lkdGgrKzsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3Q6IFwKLSAgICAgICAgICAgICBvdXRwdXQgd2lkdGggaXMgb2RkICAiKTsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdlIG5lZWQgdG8gYWxsb2NhdGUgYSBuZXcgUkdCIG91dHB1dCBidWZmZXIgaW4gd2hpY2ggYWxsIGRlY29kZWQgZGF0YQotICAgICAgICAgICsgd2hpdGUgbGluZSB3aWxsIGJlIGNvcGllZCAqLwotICAgICAgICBuZXdSR0JwYWNfZGF0YSA9IChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhyZ2JQbGFuZS51X2hlaWdodCpyZ2JQbGFuZS51X3dpZHRoKjJcCi0gICAgICAgICAgICAqc2l6ZW9mKE00VklGSV9VSW50OCksIE00VlMsIChNNE9TQV9DaGFyICopIk5ldyBGcmFtaW5nIEdJRiBPdXRwdXQgcGFjX2RhdGEgUkdCIik7Ci0KLSAgICAgICAgaWYobmV3UkdCcGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gXAotICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3QiKTsKLSAgICAgICAgICAgIGZyZWUocmdiUGxhbmUucGFjX2RhdGEpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgb3V0cHV0X3BhY19kYXRhPSBuZXdSR0JwYWNfZGF0YTsKLSAgICAgICAgaW5wdXRfcGFjX2RhdGEgPSByZ2JQbGFuZS5wYWNfZGF0YTsKLQotICAgICAgICBmb3IoaT0wO2k8cmdiUGxhbmUudV9oZWlnaHQ7aSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilvdXRwdXRfcGFjX2RhdGEsICh2b2lkICopaW5wdXRfcGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgIChyZ2JQbGFuZS51X3dpZHRoLTEpKjIpOwotCi0gICAgICAgICAgICBvdXRwdXRfcGFjX2RhdGEgKz0gKChyZ2JQbGFuZS51X3dpZHRoLTEpKjIpOwotICAgICAgICAgICAgLyogUHV0IHRoZSBwaXhlbCB0byB0cmFuc3BhcmVuY3kgY29sb3IgKi8KLSAgICAgICAgICAgICpvdXRwdXRfcGFjX2RhdGErKyA9IHRyYW5zcGFyZW50MTsKLSAgICAgICAgICAgICpvdXRwdXRfcGFjX2RhdGErKyA9IHRyYW5zcGFyZW50MjsKLQotICAgICAgICAgICAgaW5wdXRfcGFjX2RhdGEgKz0gKChyZ2JQbGFuZS51X3dpZHRoLTEpKjIpOwotICAgICAgICB9Ci0gICAgICAgIGZyZWUocmdiUGxhbmUucGFjX2RhdGEpOwotICAgICAgICByZ2JQbGFuZS5wYWNfZGF0YSA9IG5ld1JHQnBhY19kYXRhOwotICAgIH0KLQotICAgIC8qIHJlc2V0IHN0cmlkZSAqLwotICAgIHJnYlBsYW5lLnVfc3RyaWRlID0gcmdiUGxhbmUudV93aWR0aCoyOwotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSBjaGFpbmVkIGxpc3QgcGFyYW1ldGVycyAqLwotICAgIGZyYW1pbmdDdHgtPmR1cmF0aW9uID0gMDsKLSAgICBmcmFtaW5nQ3R4LT5wcmV2aW91c0NsaXBUaW1lID0gLTE7Ci0gICAgZnJhbWluZ0N0eC0+cHJldmlld09mZnNldENsaXBUaW1lID0gLTE7Ci0KLSAgICAvKioKLSAgICAgKiBPbmx5IG9uZSBlbGVtZW50IGluIHRoZSBjaGFpbmVkIGxpc3QgKG5vIGFuaW1hdGVkIGltYWdlIC4uLikgKi8KLSAgICBmcmFtaW5nQ3R4LT5wQ3VycmVudCA9IGZyYW1pbmdDdHg7Ci0gICAgZnJhbWluZ0N0eC0+cE5leHQgPSBmcmFtaW5nQ3R4OwotCi0gICAgLyoqCi0gICAgICogR2V0IG91dHB1dCB3aWR0aC9oZWlnaHQgKi8KLSAgICAgc3dpdGNoKE91dHB1dFZpZGVvUmVzb2x1dGlvbikKLSAgICAvL3N3aXRjaCh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1NpemUpCi0gICAgewotICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1NRQ0lGOgotICAgICAgICB3aWR0aF9vdXQgPSAxMjg7Ci0gICAgICAgIGhlaWdodF9vdXQgPSA5NjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFZJREVPRURJVElOR19rUVFWR0E6Ci0gICAgICAgIHdpZHRoX291dCA9IDE2MDsKLSAgICAgICAgaGVpZ2h0X291dCA9IDEyMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFZJREVPRURJVElOR19rUUNJRjoKLSAgICAgICAgd2lkdGhfb3V0ID0gMTc2OwotICAgICAgICBoZWlnaHRfb3V0ID0gMTQ0OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00VklERU9FRElUSU5HX2tRVkdBOgotICAgICAgICB3aWR0aF9vdXQgPSAzMjA7Ci0gICAgICAgIGhlaWdodF9vdXQgPSAyNDA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0NJRjoKLSAgICAgICAgd2lkdGhfb3V0ID0gMzUyOwotICAgICAgICBoZWlnaHRfb3V0ID0gMjg4OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00VklERU9FRElUSU5HX2tWR0E6Ci0gICAgICAgIHdpZHRoX291dCA9IDY0MDsKLSAgICAgICAgaGVpZ2h0X291dCA9IDQ4MDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFZJREVPRURJVElOR19rV1ZHQToKLSAgICAgICAgd2lkdGhfb3V0ID0gODAwOwotICAgICAgICBoZWlnaHRfb3V0ID0gNDgwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00VklERU9FRElUSU5HX2tOVFNDOgotICAgICAgICB3aWR0aF9vdXQgPSA3MjA7Ci0gICAgICAgIGhlaWdodF9vdXQgPSA0ODA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazY0MF8zNjA6Ci0gICAgICAgIHdpZHRoX291dCA9IDY0MDsKLSAgICAgICAgaGVpZ2h0X291dCA9IDM2MDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFZJREVPRURJVElOR19rODU0XzQ4MDoKLSAgICAgICAgLy8gU3RhZ2VGcmlnaHQgZW5jb2RlcnMgcmVxdWlyZSAlMTYgcmVzb2x1dGlvbgotICAgICAgICB3aWR0aF9vdXQgPSBNNEVOQ09ERVJfODU0XzQ4MF9XaWR0aDsKLSAgICAgICAgaGVpZ2h0X291dCA9IDQ4MDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFZJREVPRURJVElOR19rMTI4MF83MjA6Ci0gICAgICAgIHdpZHRoX291dCA9IDEyODA7Ci0gICAgICAgIGhlaWdodF9vdXQgPSA3MjA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEwODBfNzIwOgotICAgICAgICAvLyBTdGFnZUZyaWdodCBlbmNvZGVycyByZXF1aXJlICUxNiByZXNvbHV0aW9uCi0gICAgICAgIHdpZHRoX291dCA9IE00RU5DT0RFUl8xMDgwXzcyMF9XaWR0aDsKLSAgICAgICAgaGVpZ2h0X291dCA9IDcyMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFZJREVPRURJVElOR19rOTYwXzcyMDoKLSAgICAgICAgd2lkdGhfb3V0ID0gOTYwOwotICAgICAgICBoZWlnaHRfb3V0ID0gNzIwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00VklERU9FRElUSU5HX2sxOTIwXzEwODA6Ci0gICAgICAgIHdpZHRoX291dCA9IDE5MjA7Ci0gICAgICAgIGhlaWdodF9vdXQgPSBNNEVOQ09ERVJfMTkyMF8xMDgwX0hlaWdodDsKLSAgICAgICAgYnJlYWs7Ci0gICAgLyoqCi0gICAgICogSWYgb3V0cHV0IHZpZGVvIHNpemUgaXMgbm90IGdpdmVuLCB3ZSB0YWtlIFFDSUYgc2l6ZSwKLSAgICAgKiBzaG91bGQgbm90IGhhcHBlbiwgYmVjYXVzZSBhbHJlYWR5IGRvbmUgaW4gTTR4VlNTX3NlbmRDb21tYW5kICovCi0gICAgZGVmYXVsdDoKLSAgICAgICAgd2lkdGhfb3V0ID0gMTc2OwotICAgICAgICBoZWlnaHRfb3V0ID0gMTQ0OwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbGxvY2F0ZSBvdXRwdXQgcGxhbmVzIHN0cnVjdHVyZXMgKi8KLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiID0gKE00VklGSV9JbWFnZVBsYW5lKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwgTTRWUywKLSAgICAgICAgIChNNE9TQV9DaGFyICopIkZyYW1pbmcgT3V0cHV0IHBsYW5lIFJHQiIpOwotICAgIGlmKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3QiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBSZXNpemUgUkdCIGlmIG5lZWRlZCAqLwotICAgIGlmKChwRWZmZWN0LT54VlNTLmJSZXNpemUpICYmCi0gICAgICAgICAocmdiUGxhbmUudV93aWR0aCAhPSB3aWR0aF9vdXQgfHwgcmdiUGxhbmUudV9oZWlnaHQgIT0gaGVpZ2h0X291dCkpCi0gICAgewotICAgICAgICB3aWR0aCA9IHdpZHRoX291dDsKLSAgICAgICAgaGVpZ2h0ID0gaGVpZ2h0X291dDsKLQotICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODh0b1lVVjQyMF9GcmFtbWluZ0VmZmVjdDogXAotICAgICAgICAgICAgIE5ldyBXaWR0aCBhbmQgaGVpZ2h0ICVkICVkICAiLHdpZHRoLGhlaWdodCk7Ci0KLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQgPSBoZWlnaHRfb3V0OwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoID0gd2lkdGhfb3V0OwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3N0cmlkZSA9IGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGgqMjsKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV90b3BsZWZ0ID0gMDsKLQotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSA9Ci0gICAgICAgICAgICAgKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0KmZyYW1pbmdDdHgtPlwKLSAgICAgICAgICAgICAgICBGcmFtaW5nUmdiLT51X3dpZHRoKjIqc2l6ZW9mKE00VklGSV9VSW50OCksIE00VlMsCi0gICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJGcmFtaW5nIE91dHB1dCBwYWNfZGF0YSBSR0IiKTsKLQotICAgICAgICBpZihmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBcCi0gICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODh0b1lVVjQyMF9GcmFtbWluZ0VmZmVjdCIpOwotICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiKTsKLSAgICAgICAgICAgIGZyZWUocmdiUGxhbmUucGFjX2RhdGEpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3Q6ICBSZXNpemluZyBOZWVkZWQgIik7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4OHRvWVVWNDIwX0ZyYW1taW5nRWZmZWN0OlwKLSAgICAgICAgICAgICAgcmdiUGxhbmUudV9oZWlnaHQgJiByZ2JQbGFuZS51X3dpZHRoICVkICVkIixyZ2JQbGFuZS51X2hlaWdodCxyZ2JQbGFuZS51X3dpZHRoKTsKLQotICAgICAgICAvL2VyciA9IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjg4OHRvUkdCODg4KE00T1NBX05VTEwsICZyZ2JQbGFuZSxmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiKTsKLSAgICAgICAgZXJyID0gTTRWSUZJX1Jlc2l6ZUJpbGluZWFyUkdCNTY1dG9SR0I1NjUoTTRPU0FfTlVMTCwgJnJnYlBsYW5lLGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IpOwotCi0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODh0b1lVVjQyMF9GcmFtbWluZ0VmZmVjdCA6XAotICAgICAgICAgICAgICAgIHdoZW4gcmVzaXppbmcgUkdCIHBsYW5lOiAweCV4XG4iLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHJnYlBsYW5lLnBhY19kYXRhICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocmdiUGxhbmUucGFjX2RhdGEpOwotICAgICAgICAgICAgcmdiUGxhbmUucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3Q6XAotICAgICAgICAgICAgICBSZXNpemluZyBOb3QgTmVlZGVkICIpOwotCi0gICAgICAgIHdpZHRoID0gcmdiUGxhbmUudV93aWR0aDsKLSAgICAgICAgaGVpZ2h0ID0gcmdiUGxhbmUudV9oZWlnaHQ7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0ID0gaGVpZ2h0OwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoID0gd2lkdGg7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfc3RyaWRlID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aCoyOwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3RvcGxlZnQgPSAwOwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSA9IHJnYlBsYW5lLnBhY19kYXRhOwotICAgIH0KLQotCi0gICAgaWYocEVmZmVjdC0+eFZTUy5iUmVzaXplKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEZvcmNlIHRvcGxlZnQgdG8gMCBmb3IgcHVyZSBmcmFtaW5nIGVmZmVjdCAqLwotICAgICAgICBmcmFtaW5nQ3R4LT50b3BsZWZ0X3ggPSAwOwotICAgICAgICBmcmFtaW5nQ3R4LT50b3BsZWZ0X3kgPSAwOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ29udmVydCAgUkdCIG91dHB1dCB0byBZVVYgNDIwIHRvIGJlIGFibGUgdG8gbWVyZ2UgaXQgd2l0aCBvdXRwdXQgdmlkZW8gaW4gZnJhbWluZwotICAgICBlZmZlY3QgKi8KLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID0gKE00VklGSV9JbWFnZVBsYW5lKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpLCBNNFZTLAotICAgICAgICAgKE00T1NBX0NoYXIgKikiRnJhbWluZyBPdXRwdXQgcGxhbmUgWVVWIik7Ci0gICAgaWYoZnJhbWluZ0N0eC0+RnJhbWluZ1l1diA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODh0b1lVVjQyMF9GcmFtbWluZ0VmZmVjdCIpOwotICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnBhY19kYXRhKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8vIEFsbG9jIGZvciBZLCBVIGFuZCBWIHBsYW5lcwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV93aWR0aCA9ICgod2lkdGgrMSk+PjEpPDwxOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9oZWlnaHQgPSAoKGhlaWdodCsxKT4+MSk8PDE7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3RvcGxlZnQgPSAwOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9zdHJpZGUgPSAoKHdpZHRoKzEpPj4xKTw8MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jCi0gICAgICAgICgoZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3dpZHRoKmZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9oZWlnaHQpLCBNNFZTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiQWxsb2MgZm9yIHRoZSBvdXRwdXQgWSIpOwotICAgIGlmKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3QiKTsKLSAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2KTsKLSAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3dpZHRoID0gKCgod2lkdGgrMSk+PjEpPDwxKT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfaGVpZ2h0ID0gKCgoaGVpZ2h0KzEpPj4xKTw8MSk+PjE7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3RvcGxlZnQgPSAwOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV9zdHJpZGUgPSAoKCh3aWR0aCsxKT4+MSk8PDEpPj4xOwotCi0KLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfd2lkdGggKiBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfaGVpZ2h0LCBNNFZTLAotICAgICAgICAoTTRPU0FfQ2hhciAqKSJBbGxvYyBmb3IgdGhlIG91dHB1dCBVIik7Ci0gICAgaWYgKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEpOwotICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYpOwotICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnBhY19kYXRhKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV93aWR0aCA9ICgoKHdpZHRoKzEpPj4xKTw8MSk+PjE7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS51X2hlaWdodCA9ICgoKGhlaWdodCsxKT4+MSk8PDEpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV90b3BsZWZ0ID0gMDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfc3RyaWRlID0gKCgod2lkdGgrMSk+PjEpPDwxKT4+MTsKLQotCi0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS51X3dpZHRoICogZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X2hlaWdodCwgTTRWUywKLSAgICAgICAgKE00T1NBX0NoYXIgKikiQWxsb2MgZm9yIHRoZSAgb3V0cHV0IFYiKTsKLSAgICBpZiAoZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS5wYWNfZGF0YSk7Ci0gICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSk7Ci0gICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+RnJhbWluZ1l1dik7Ci0gICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+cGFjX2RhdGEpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3Q6XAotICAgICAgICBjb252ZXJ0IFJHQiB0byBZVVYgIik7Ci0KLSAgICAvL2VyciA9IE00VklGSV9SR0I4ODh0b1lVVjQyMChNNE9TQV9OVUxMLCBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLCAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dik7Ci0gICAgZXJyID0gTTRWSUZJX1JHQjU2NXRvWVVWNDIwKE00T1NBX05VTEwsIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IsICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2KTsKLQotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJTUFMgcG5nOiBlcnJvciB3aGVuIGNvbnZlcnRpbmcgZnJvbSBSR0IgdG8gWVVWOiAweCV4XG4iLCBlcnIpOwotICAgIH0KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODh0b1lVVjQyMF9GcmFtbWluZ0VmZmVjdDogIExlYXZpbmcgIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbEdlbmVyYXRlRWRpdGVkRmlsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHByZXBhcmVzIFZTUyBmb3IgZWRpdGluZwotICogQG5vdGUgICAgSXQgYWxzbyBzZXQgc3BlY2lhbCB4VlNTIGVmZmVjdCBhcyBleHRlcm5hbCBlZmZlY3RzIGZvciB0aGUgVlNTCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOKSBUaGUgaW50ZWdyYXRvciBvd24gY29udGV4dAotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogQWxsb2NhdGlvbiBlcnJvciAobm8gbW9yZSBtZW1vcnkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUVkaXRlZEZpbGUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNHhWU1NfQ29udGV4dCogeFZTU19jb250ZXh0ID0gKE00eFZTU19Db250ZXh0KilwQ29udGV4dDsKLSAgICBNNFZTUzNHUFBfRWRpdENvbnRleHQgcFZzc0N0eHQ7Ci0gICAgTTRPU0FfVUludDMyIGksajsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgVlNTIDNHUFAgZWRpdGlvbiBpbnN0YW5jZSAqLwotICAgIGVyciA9IE00VlNTM0dQUF9lZGl0SW5pdCggJnBWc3NDdHh0LCB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0ciwgeFZTU19jb250ZXh0LT5wRmlsZVdyaXRlUHRyKTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsR2VuZXJhdGVFZGl0ZWRGaWxlOiBNNFZTUzNHUFBfZWRpdEluaXQgcmV0dXJuZWQgMHgleFxuIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIE00VlNTM0dQUF9lZGl0Q2xlYW5VcChwVnNzQ3R4dCk7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXQgdGhlIFZTUyBjb250ZXh0IHRvIE5VTEwgKi8KLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAgICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQqIHBWU1NDb250ZXh0ID0KLSAgICAgICAgICAgIChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCopcFZzc0N0eHQ7Ci0gICAgICAgIHBWU1NDb250ZXh0LT54VlNTLm91dHB1dFZpZGVvRm9ybWF0ID0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0OwotICAgICAgICBwVlNTQ29udGV4dC0+eFZTUy5vdXRwdXRWaWRlb1NpemUgPQotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplIDsKLSAgICAgICAgcFZTU0NvbnRleHQtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQgPQotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQ7Ci0gICAgICAgIHBWU1NDb250ZXh0LT54VlNTLm91dHB1dEF1ZGlvU2FtcGxGcmVxID0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvU2FtcGxGcmVxOwotICAgICAgICBwVlNTQ29udGV4dC0+eFZTUy5vdXRwdXRWaWRlb0JpdHJhdGUgPQotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9CaXRyYXRlIDsKLSAgICAgICAgcFZTU0NvbnRleHQtPnhWU1Mub3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvQml0cmF0ZSA7Ci0gICAgICAgIHBWU1NDb250ZXh0LT54VlNTLmJBdWRpb01vbm8gPQotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubzsKLSAgICAgICAgcFZTU0NvbnRleHQtPnhWU1Mub3V0cHV0VmlkZW9Qcm9maWxlID0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICAgICAgcFZTU0NvbnRleHQtPnhWU1Mub3V0cHV0VmlkZW9MZXZlbCA9Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0xldmVsOwotICAgIC8qIEluIGNhc2Ugb2YgTU1TIHVzZSBjYXNlLCB3ZSBmaWxsIGRpcmVjdGx5IGludG8gdGhlIFZTUyBjb250ZXh0IHRoZSB0YXJnZXRlZCBiaXRyYXRlICovCi0gICAgaWYoeFZTU19jb250ZXh0LT50YXJnZXRlZEJpdHJhdGUgIT0gMCkKLSAgICB7Ci0gICAgICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0KiBwVlNTQ29udGV4dCA9IChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCopcFZzc0N0eHQ7Ci0KLSAgICAgICAgcFZTU0NvbnRleHQtPmJJc01NUyA9IE00T1NBX1RSVUU7Ci0gICAgICAgIHBWU1NDb250ZXh0LT51aU1NU1ZpZGVvQml0cmF0ZSA9IHhWU1NfY29udGV4dC0+dGFyZ2V0ZWRCaXRyYXRlOwotICAgICAgICBwVlNTQ29udGV4dC0+TU1TdmlkZW9GcmFtZXJhdGUgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dmlkZW9GcmFtZVJhdGU7Ci0gICAgfQotCi0gICAgLypXYXJuaW5nOiBzaW5jZSB0aGUgYWRkaW5nIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgcFNldHRpbmdzIGhhcyBiZWVuIGNoYW5nZWQgaW4gdGhlIG5leHQKLSAgICBwYXJ0IGluICBwQ3VycmVudEVkaXRTZXR0aW5ncyAodGhlcmUgaXMgYSBzcGVjaWZpYyBjdXJyZW50IGVkaXRpbmcgc3RydWN0dXJlIGZvciB0aGUgc2F2aW5nLAotICAgICBhcyBmb3IgdGhlIHByZXZpZXcpKi8KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZXh0ZXJuYWwgdmlkZW8gZWZmZWN0IGZ1bmN0aW9ucywgZm9yIHNhdmluZyBtb2RlICh0byBiZSBtb3ZlZCB0bwotICAgICAgTTR4VlNTX3NhdmVTdGFydCgpID8pKi8KLSAgICBmb3IgKGk9MDsgaTx4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT51aUNsaXBOdW1iZXI7IGkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoaj0wOyBqPHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPm5iRWZmZWN0czsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQmxhY2tBbmRXaGl0ZSA9PQotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5FeHRWaWRlb0VmZmVjdEZjdCA9Ci0gICAgICAgICAgICAgICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Q29sb3I7Ci0gICAgICAgICAgICAgICAgLy94VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0ID0KLSAgICAgICAgICAgICAgICAvLyAoTTRPU0FfVm9pZCopTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQmxhY2tBbmRXaGl0ZTsKLSAgICAgICAgICAgICAgICAvKmNvbW1lbnRlZCBGQiovCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogV2UgZG8gbm90IG5lZWQgdG8gc2V0IHRoZSBjb2xvciBjb250ZXh0LCBpdCBpcyBhbHJlYWR5IHNldAotICAgICAgICAgICAgICAgICBkdXJpbmcgc2VuZENvbW1hbmQgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9QaW5rID09Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5FeHRWaWRlb0VmZmVjdEZjdCA9Ci0gICAgICAgICAgICAgICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Q29sb3I7Ci0gICAgICAgICAgICAgICAgLy94VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0ID0KLSAgICAgICAgICAgICAgICAvLyAoTTRPU0FfVm9pZCopTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfUGluazsgLyoqPCB3ZSBkb24ndAotICAgICAgICAgICAgICAgIC8vIHVzZSBhbnkgZnVuY3Rpb24gY29udGV4dCAqLwotICAgICAgICAgICAgICAgIC8qY29tbWVudGVkIEZCKi8KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBXZSBkbyBub3QgbmVlZCB0byBzZXQgdGhlIGNvbG9yIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICBpdCBpcyBhbHJlYWR5IHNldCBkdXJpbmcgc2VuZENvbW1hbmQgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9HcmVlbiA9PQotICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLkV4dFZpZGVvRWZmZWN0RmN0ID0KLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RDb2xvcjsKLSAgICAgICAgICAgICAgICAvL3hWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgICAgICAvLyAoTTRPU0FfVm9pZCopTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JlZW47Ci0gICAgICAgICAgICAgICAgICAgICAvKio8IHdlIGRvbid0IHVzZSBhbnkgZnVuY3Rpb24gY29udGV4dCAqLwotICAgICAgICAgICAgICAgIC8qY29tbWVudGVkIEZCKi8KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBXZSBkbyBub3QgbmVlZCB0byBzZXQgdGhlIGNvbG9yIGNvbnRleHQsIGl0IGlzIGFscmVhZHkgc2V0IGR1cmluZwotICAgICAgICAgICAgICAgICAgc2VuZENvbW1hbmQgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9TZXBpYSA9PQotICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLkV4dFZpZGVvRWZmZWN0RmN0ID0KLSAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RDb2xvcjsKLSAgICAgICAgICAgICAgICAvL3hWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgIC8vIChNNE9TQV9Wb2lkKilNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9TZXBpYTsKLSAgICAgICAgICAgICAgICAvKio8IHdlIGRvbid0IHVzZSBhbnkgZnVuY3Rpb24gY29udGV4dCAqLwotICAgICAgICAgICAgICAgIC8qY29tbWVudGVkIEZCKi8KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBXZSBkbyBub3QgbmVlZCB0byBzZXQgdGhlIGNvbG9yIGNvbnRleHQsIGl0IGlzIGFscmVhZHkgc2V0IGR1cmluZwotICAgICAgICAgICAgICAgICBzZW5kQ29tbWFuZCBmdW5jdGlvbiAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZpZnRpZXMgPT0KLSAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLkV4dFZpZGVvRWZmZWN0RmN0ID0KLSAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGaWZ0aWVzOwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFdlIGRvIG5vdCBuZWVkIHRvIHNldCB0aGUgZnJhbWluZyBjb250ZXh0LCBpdCBpcyBhbHJlYWR5IHNldCBkdXJpbmcKLSAgICAgICAgICAgICAgICAgc2VuZENvbW1hbmQgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9OZWdhdGl2ZSA9PQotICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHNbal0uRXh0VmlkZW9FZmZlY3RGY3QgPQotICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdENvbG9yOwotICAgICAgICAgICAgICAgIC8veFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ucEV4dFZpZGVvRWZmZWN0RmN0Q3R4dCA9Ci0gICAgICAgICAgICAgICAgLy8gKE00T1NBX1ZvaWQqKU00eFZTU19rVmlkZW9FZmZlY3RUeXBlX05lZ2F0aXZlOwotICAgICAgICAgICAgICAgICAvKio8IHdlIGRvbid0IHVzZSBhbnkgZnVuY3Rpb24gY29udGV4dCAqLwotICAgICAgICAgICAgICAgIC8qY29tbWVudGVkIEZCKi8KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBXZSBkbyBub3QgbmVlZCB0byBzZXQgdGhlIGNvbG9yIGNvbnRleHQsIGl0IGlzIGFscmVhZHkgc2V0IGR1cmluZwotICAgICAgICAgICAgICAgICAgc2VuZENvbW1hbmQgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GcmFtaW5nID09Ci0gICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5FeHRWaWRlb0VmZmVjdEZjdCA9Ci0gICAgICAgICAgICAgICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RnJhbWluZzsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBXZSBkbyBub3QgbmVlZCB0byBzZXQgdGhlIGZyYW1pbmcgY29udGV4dCwgaXQgaXMgYWxyZWFkeSBzZXQgZHVyaW5nCi0gICAgICAgICAgICAgICAgIHNlbmRDb21tYW5kIGZ1bmN0aW9uICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfWm9vbUluID09Ci0gICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHNbal0uRXh0VmlkZW9FZmZlY3RGY3QgPQotICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdFpvb207Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0ID0KLSAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQqKU00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1pvb21JbjsgLyoqPCB3ZSBkb24ndCB1c2UgYW55Ci0gICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNvbnRleHQgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9ab29tT3V0ID09Ci0gICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5FeHRWaWRlb0VmZmVjdEZjdCA9Ci0gICAgICAgICAgICAgICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Wm9vbTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCopTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfWm9vbU91dDsgLyoqPCB3ZSBkb24ndCB1c2UgYW55Ci0gICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNvbnRleHQgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9Db2xvclJHQjE2ID09Ci0gICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5FeHRWaWRlb0VmZmVjdEZjdCA9Ci0gICAgICAgICAgICAgICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Q29sb3I7Ci0gICAgICAgICAgICAgICAgLy94VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0ID0KLSAgICAgICAgICAgICAgICAvLyAoTTRPU0FfVm9pZCopTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQ29sb3JSR0IxNjsKLSAgICAgICAgICAgICAgICAvKio8IHdlIGRvbid0IHVzZSBhbnkgZnVuY3Rpb24gY29udGV4dCAqLwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFdlIGRvIG5vdCBuZWVkIHRvIHNldCB0aGUgY29sb3IgY29udGV4dCwgaXQgaXMgYWxyZWFkeSBzZXQgZHVyaW5nCi0gICAgICAgICAgICAgICAgIHNlbmRDb21tYW5kIGZ1bmN0aW9uICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JhZGllbnQgPT0KLSAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLkV4dFZpZGVvRWZmZWN0RmN0ID0KLSAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RDb2xvcjsKLSAgICAgICAgICAgICAgICAvL3hWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgIC8vIChNNE9TQV9Wb2lkKilNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9Db2xvclJHQjE2OwotICAgICAgICAgICAgICAgIC8qKjwgd2UgZG9uJ3QgdXNlIGFueSBmdW5jdGlvbiBjb250ZXh0ICovCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogV2UgZG8gbm90IG5lZWQgdG8gc2V0IHRoZSBjb2xvciBjb250ZXh0LCBpdCBpcyBhbHJlYWR5IHNldCBkdXJpbmcKLSAgICAgICAgICAgICAgICAgc2VuZENvbW1hbmQgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3BlbiB0aGUgVlNTIDNHUFAgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfZWRpdE9wZW4ocFZzc0N0eHQsIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUVkaXRlZEZpbGU6XAotICAgICAgICAgICAgIE00VlNTM0dQUF9lZGl0T3BlbiByZXR1cm5lZCAweCV4XG4iLGVycik7Ci0gICAgICAgIE00VlNTM0dQUF9lZGl0Q2xlYW5VcChwVnNzQ3R4dCk7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXQgdGhlIFZTUyBjb250ZXh0IHRvIE5VTEwgKi8KLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlIFZTUyBjb250ZXh0IHRvIGJlIGFibGUgdG8gY2xvc2UgLyBmcmVlIFZTUyBsYXRlciAqLwotICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0Q29udGV4dCA9IHBWc3NDdHh0OwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDbG9zZUVkaXRlZEZpbGUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBjbGVhbnMgdXAgVlNTCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgVGhlIGludGVncmF0b3Igb3duIGNvbnRleHQKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENsb3NlRWRpdGVkRmlsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00eFZTU19Db250ZXh0KiB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQqKXBDb250ZXh0OwotICAgIE00VlNTM0dQUF9FZGl0Q29udGV4dCBwVnNzQ3R4dCA9IHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0Q29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgaWYoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRDb250ZXh0ICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2xvc2UgdGhlIFZTUyAzR1BQICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9lZGl0Q2xvc2UocFZzc0N0eHQpOwotICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxDbG9zZUVkaXRlZEZpbGU6XAotICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfZWRpdENsb3NlIHJldHVybmVkIDB4JXhcbiIsZXJyKTsKLSAgICAgICAgICAgIE00VlNTM0dQUF9lZGl0Q2xlYW5VcChwVnNzQ3R4dCk7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFNldCB0aGUgVlNTIGNvbnRleHQgdG8gTlVMTCAqLwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogRnJlZSB0aGlzIFZTUzNHUFAgZWRpdGlvbiBpbnN0YW5jZSAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfZWRpdENsZWFuVXAocFZzc0N0eHQpOwotICAgICAgICAvKioKLSAgICAgICAgICogU2V0IHRoZSBWU1MgY29udGV4dCB0byBOVUxMICovCi0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0Q29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbENsb3NlRWRpdGVkRmlsZTogXAotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9lZGl0Q2xlYW5VcCByZXR1cm5lZCAweCV4XG4iLGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUF1ZGlvTWl4RmlsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHByZXBhcmVzIFZTUyBmb3IgYXVkaW8gbWl4aW5nCi0gKiBAbm90ZSAgICBJdCB0YWtlcyBpdHMgcGFyYW1ldGVycyBmcm9tIHRoZSBCR00gc2V0dGluZ3MgaW4gdGhlIHhWU1MgaW50ZXJuYWwgY29udGV4dAotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgVGhlIGludGVncmF0b3Igb3duIGNvbnRleHQKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6IEFsbG9jYXRpb24gZXJyb3IgKG5vIG1vcmUgbWVtb3J5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0vKioqCi0gKiBGQjogdGhlIGZ1bmN0aW9uIGhhcyBiZWVuIG1vZGlmaWVkIHNpbmNlIHRoZSBzdHJ1Y3R1cmUgdXNlZCBmb3IgdGhlIHNhdmluZyBpcyBub3cgdGhlCi0gKiAgcEN1cnJlbnRFZGl0U2V0dGluZ3MgYW5kIG5vdCB0aGUgcFNldHRpbmdzCi0gKiBUaGlzIGNoYW5nZSBoYXMgYmVlbiBhZGRlZCBmb3IgdGhlIFVURiBzdXBwb3J0Ci0gKiBBbGwgdGhlICJ4VlNTX2NvbnRleHQtPnBTZXR0aW5ncyIgaGFzIGJlZW4gcmVwbGFjZWQgYnkgInhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MiCi0gKioqLwotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbEdlbmVyYXRlQXVkaW9NaXhGaWxlKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRWU1MzR1BQX0F1ZGlvTWl4aW5nU2V0dGluZ3MqIHBBdWRpb01peFNldHRpbmdzOwotICAgIE00VlNTM0dQUF9BdWRpb01peGluZ0NvbnRleHQgcEF1ZGlvTWl4aW5nQ3R4dDsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzIGZpbGVQcm9wZXJ0aWVzOwotCi0gICAgLyoqCi0gICAgICogQWxsb2NhdGUgYXVkaW8gbWl4aW5nIHNldHRpbmdzIHN0cnVjdHVyZSBhbmQgZmlsbCBpdCB3aXRoIEJHTSBwYXJhbWV0ZXJzICovCi0gICAgcEF1ZGlvTWl4U2V0dGluZ3MgPSAoTTRWU1MzR1BQX0F1ZGlvTWl4aW5nU2V0dGluZ3MqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYwotICAgICAgICAoc2l6ZW9mKE00VlNTM0dQUF9BdWRpb01peGluZ1NldHRpbmdzKSwgTTRWUywgKE00T1NBX0NoYXIgKikicEF1ZGlvTWl4U2V0dGluZ3MiKTsKLSAgICBpZihwQXVkaW9NaXhTZXR0aW5ncyA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX2ludGVybmFsR2VuZXJhdGVBdWRpb01peEZpbGUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5GaWxlVHlwZSA9PQotICAgICAgICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFApCi0gICAgewotICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxHZXRQcm9wZXJ0aWVzKChNNE9TQV9Db250ZXh0KXhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAoTTRPU0FfQ2hhciopeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlLAotICAgICAgICAgICAgICAgICAmZmlsZVByb3BlcnRpZXMpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbEdlbmVyYXRlQXVkaW9NaXhGaWxlOlwKLSAgICAgICAgICAgICAgICAgaW1wb3NzaWJsZSB0byByZXRyaWV2ZSBhdWRpbyBCR00gcHJvcGVydGllcyAtPlwKLSAgICAgICAgICAgICAgICAgICAgIHJlZW5jb2RpbmcgYXVkaW8gYmFja2dyb3VuZCBtdXNpYyIsIGVycik7Ci0gICAgICAgICAgICBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPQotICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0KzE7Ci0gICAgICAgICAgICAgICAgICAvKiBUbyBmb3JjZSBCR00gZW5jb2RpbmcgKi8KLSAgICAgICAgfQotICAgIH0KLQotICAgIHBBdWRpb01peFNldHRpbmdzLT5iUmVtb3ZlT3JpZ2luYWwgPSBNNE9TQV9GQUxTRTsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+QWRkZWRBdWRpb0ZpbGVUeXBlID0KLSAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPkZpbGVUeXBlOwotICAgIHBBdWRpb01peFNldHRpbmdzLT5wQWRkZWRBdWRpb1RyYWNrRmlsZSA9Ci0gICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZTsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+dWlBZGRWb2x1bWUgPQotICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlBZGRWb2x1bWU7Ci0KLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+b3V0cHV0QXVkaW9Gb3JtYXQgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdDsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+b3V0cHV0QVNGID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9TYW1wbEZyZXE7Ci0gICAgcEF1ZGlvTWl4U2V0dGluZ3MtPm91dHB1dEF1ZGlvQml0cmF0ZSA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvQml0cmF0ZTsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlTYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+dWlOdW1DaGFubmVscyA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlOdW1DaGFubmVsczsKLQotICAgIHBBdWRpb01peFNldHRpbmdzLT5iX0R1Y2tpbmdOZWVkZWVkID0KLSAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPmJfRHVja2luZ05lZWRlZWQ7Ci0gICAgcEF1ZGlvTWl4U2V0dGluZ3MtPmZCVFZvbExldmVsID0KLSAgICAgKE00T1NBX0Zsb2F0ICl4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlBZGRWb2x1bWUvMTAwOwotICAgIHBBdWRpb01peFNldHRpbmdzLT5JbkR1Y2tpbmdfdGhyZXNob2xkID0KLSAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPkluRHVja2luZ190aHJlc2hvbGQ7Ci0gICAgcEF1ZGlvTWl4U2V0dGluZ3MtPkluRHVja2luZ19sb3dWb2x1bWUgPQotICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+bG93Vm9sdW1lLzEwMDsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+ZlBUVm9sTGV2ZWwgPQotICAgICAoTTRPU0FfRmxvYXQpeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPlBUVm9sTGV2ZWwvMTAwOwotICAgIHBBdWRpb01peFNldHRpbmdzLT5iTG9vcCA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+Ykxvb3A7Ci0KLSAgICBpZih4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5iQXVkaW9Nb25vKQotICAgIHsKLSAgICAgICAgcEF1ZGlvTWl4U2V0dGluZ3MtPm91dHB1dE5CQ2hhbm5lbHMgPSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwQXVkaW9NaXhTZXR0aW5ncy0+b3V0cHV0TkJDaGFubmVscyA9IDI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmlsbCBhdWRpbyBtaXggc2V0dGluZ3Mgd2l0aCBCR00gcGFyYW1ldGVycyAqLwotICAgIHBBdWRpb01peFNldHRpbmdzLT51aUJlZ2luTG9vcCA9Ci0gICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUJlZ2luTG9vcDsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+dWlFbmRMb29wID0KLSAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnVpRW5kTG9vcDsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+dWlBZGRDdHMgPQotICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlBZGRDdHM7Ci0KLSAgICAvKioKLSAgICAgKiBPdXRwdXQgZmlsZSBvZiB0aGUgYXVkaW8gbWl4ZXIgd2lsbCBiZSBmaW5hbCBmaWxlIChhdWRpbyBtaXhpbmcgaXMgdGhlIGxhc3Qgc3RlcCkgKi8KLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+cE91dHB1dENsaXBGaWxlID0geFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZTsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUgPSB4VlNTX2NvbnRleHQtPnBUZW1wb3JhcnlGaWxlOwotCi0gICAgLyoqCi0gICAgICogSW5wdXQgZmlsZSBvZiB0aGUgYXVkaW8gbWl4ZXIgaXMgYSB0ZW1wb3JhcnkgZmlsZSBjb250YWluaW5nIGFsbCBhdWRpby92aWRlbyBlZGl0aW9ucyAqLwotICAgIHBBdWRpb01peFNldHRpbmdzLT5wT3JpZ2luYWxDbGlwRmlsZSA9IHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBPdXRwdXRGaWxlOwotCi0gICAgLyoqCi0gICAgICogU2F2ZSBhdWRpbyBtaXhpbmcgc2V0dGluZ3MgcG9pbnRlciB0byBiZSBhYmxlIHRvIGZyZWUgaXQgaW4KLSAgICAgTTR4VlNTX2ludGVybmFsQ2xvc2VBdWRpb01peGVkRmlsZSBmdW5jdGlvbiAqLwotICAgIHhWU1NfY29udGV4dC0+cEF1ZGlvTWl4U2V0dGluZ3MgPSBwQXVkaW9NaXhTZXR0aW5nczsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIFZTUyAzR1BQIGF1ZGlvIG1peGluZyBpbnN0YW5jZSAqLwotICAgIGVyciA9IE00VlNTM0dQUF9hdWRpb01peGluZ0luaXQoJnBBdWRpb01peGluZ0N0eHQsIHBBdWRpb01peFNldHRpbmdzLAotICAgICAgICAgeFZTU19jb250ZXh0LT5wRmlsZVJlYWRQdHIsIHhWU1NfY29udGV4dC0+cEZpbGVXcml0ZVB0cik7Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlIGF1ZGlvIG1peGluZyBjb250ZXh0IHRvIGJlIGFibGUgdG8gY2FsbCBhdWRpbyBtaXhpbmcgc3RlcCBmdW5jdGlvbiBpbgotICAgICAgTTR4VlNTX3N0ZXAgZnVuY3Rpb24gKi8KLSAgICB4VlNTX2NvbnRleHQtPnBBdWRpb01peENvbnRleHQgPSBwQXVkaW9NaXhpbmdDdHh0OwotCi0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbEdlbmVyYXRlQXVkaW9NaXhGaWxlOlwKLSAgICAgICAgICAgICBNNFZTUzNHUFBfYXVkaW9NaXhpbmdJbml0IHJldHVybmVkIDB4JXhcbiIsZXJyKTsKLSAgICAgICAgLy9NNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwKHBBdWRpb01peGluZ0N0eHQpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ2xvc2VBdWRpb01peGVkRmlsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGNsZWFucyB1cCBWU1MgZm9yIGF1ZGlvIG1peGluZwotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDbG9zZUF1ZGlvTWl4ZWRGaWxlKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIC8qKgotICAgICAqIEZyZWUgdGhpcyBWU1MzR1BQIGF1ZGlvIG1peGluZyBpbnN0YW5jZSAqLwotICAgIGlmKHhWU1NfY29udGV4dC0+cEF1ZGlvTWl4Q29udGV4dCAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcCh4VlNTX2NvbnRleHQtPnBBdWRpb01peENvbnRleHQpOwotICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxDbG9zZUF1ZGlvTWl4ZWRGaWxlOlwKLSAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcCByZXR1cm5lZCAweCV4XG4iLGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRnJlZSBWU1MgYXVkaW8gbWl4aW5nIHNldHRpbmdzICovCi0gICAgaWYoeFZTU19jb250ZXh0LT5wQXVkaW9NaXhTZXR0aW5ncyAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBBdWRpb01peFNldHRpbmdzKTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wQXVkaW9NaXhTZXR0aW5ncyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxGcmVlUHJldmlldyhNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGNsZWFucyB1cCBwcmV2aWV3IGVkaXRpb24gc3RydWN0dXJlIHVzZWQgdG8gZ2VuZXJhdGUKLSAqICAgICAgICAgICAgcHJldmlldy4zZ3AgZmlsZSBnaXZlbiB0byB0aGUgVlBTCi0gKiBAbm90ZSAgICBJdCBhbHNvIGZyZWUgdGhlIHByZXZpZXcgc3RydWN0dXJlIGdpdmVuIHRvIHRoZSBWUFMKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxGcmVlUHJldmlldyhNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00eFZTU19Db250ZXh0KiB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX1VJbnQ4IGk7Ci0KLSAgICAvKioKLSAgICAgKiBGcmVlIGNsaXAvdHJhbnNpdGlvbiBzZXR0aW5ncyAqLwotICAgIGZvcihpPTA7IGk8eFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+dWlDbGlwTnVtYmVyOyBpKyspCi0gICAgewotICAgICAgICBNNHhWU1NfRnJlZUNsaXBTZXR0aW5ncyh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wQ2xpcExpc3RbaV0pOwotCi0gICAgICAgIGZyZWUoKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBDbGlwTGlzdFtpXSkpOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wQ2xpcExpc3RbaV0gPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBCZWNhdXNlIHRoZXJlIGlzIDEgbGVzcyB0cmFuc2l0aW9uIHRoYW4gY2xpcCBudW1iZXIgKi8KLSAgICAgICAgaWYoaSAhPSB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT51aUNsaXBOdW1iZXItMSkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZSgoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldKSk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRnJlZSBjbGlwL3RyYW5zaXRpb24gbGlzdCAqLwotICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBDbGlwTGlzdCAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZnJlZSgoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cENsaXBMaXN0KSk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBDbGlwTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZnJlZSgoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0KSk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRnJlZSBvdXRwdXQgcHJldmlldyBmaWxlIHBhdGggKi8KLSAgICBpZih4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGcmVlIHRlbXBvcmFyeSBwcmV2aWV3IGZpbGUgcGF0aCAqLwotICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKil4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSk7Ci0gICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUpOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRnJlZSAibG9jYWwiIEJHTSBzZXR0aW5ncyAqLwotICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBpZih4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUpOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrKTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZyZWUgY3VycmVudCBlZGl0IHNldHRpbmdzIHN0cnVjdHVyZSAqLwotICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncyk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZyZWUgcHJldmlldyBlZmZlY3RzIGdpdmVuIHRvIGFwcGxpY2F0aW9uICovCi0gICAgaWYoTTRPU0FfTlVMTCAhPSB4VlNTX2NvbnRleHQtPnBQcmV2aWV3U2V0dGluZ3MtPkVmZmVjdHMpCi0gICAgewotICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFByZXZpZXdTZXR0aW5ncy0+RWZmZWN0cyk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFByZXZpZXdTZXR0aW5ncy0+RWZmZWN0cyA9IE00T1NBX05VTEw7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFByZXZpZXdTZXR0aW5ncy0+bmJFZmZlY3RzID0gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsRnJlZVNhdmluZyhNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGNsZWFucyB1cCBzYXZpbmcgZWRpdGlvbiBzdHJ1Y3R1cmUgdXNlZCB0byBnZW5lcmF0ZQotICogICAgICAgICAgICBvdXRwdXQuM2dwIGZpbGUgZ2l2ZW4gdG8gdGhlIFZQUwotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxGcmVlU2F2aW5nKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfVUludDggaTsKLQotICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBGcmVlIGNsaXAvdHJhbnNpdGlvbiBzZXR0aW5ncyAqLwotICAgICAgICBmb3IoaT0wOyBpPHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnVpQ2xpcE51bWJlcjsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNHhWU1NfRnJlZUNsaXBTZXR0aW5ncyh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wQ2xpcExpc3RbaV0pOwotCi0gICAgICAgICAgICBmcmVlKCh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wQ2xpcExpc3RbaV0pKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBDbGlwTGlzdFtpXSA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQmVjYXVzZSB0aGVyZSBpcyAxIGxlc3MgdHJhbnNpdGlvbiB0aGFuIGNsaXAgbnVtYmVyICovCi0gICAgICAgICAgICBpZihpICE9IHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnVpQ2xpcE51bWJlci0xKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUoXAotICAgICAgICAgICAgICAgICAgICAoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldKSk7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBGcmVlIGNsaXAvdHJhbnNpdGlvbiBsaXN0ICovCi0gICAgICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBDbGlwTGlzdCAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKCh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wQ2xpcExpc3QpKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBDbGlwTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUoKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCkpOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHMgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZSgoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0cykpOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0cyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5uYkVmZmVjdHMgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEZyZWUgb3V0cHV0IHNhdmluZyBmaWxlIHBhdGggKi8KLSAgICAgICAgaWYoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKil4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZih4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogRnJlZSB0ZW1wb3Jhcnkgc2F2aW5nIGZpbGUgcGF0aCAqLwotICAgICAgICBpZih4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKil4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSk7Ci0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBGcmVlICJsb2NhbCIgQkdNIHNldHRpbmdzICovCi0gICAgICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjayk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjayA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogRnJlZSBjdXJyZW50IGVkaXQgc2V0dGluZ3Mgc3RydWN0dXJlICovCi0gICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncyk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfZnJlZVNldHRpbmdzKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi0gKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gY2xlYW5zIHVwIGFuIE00VlNTM0dQUF9FZGl0U2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBTZXR0aW5ncyAgICAoSU4pIFBvaW50ZXIgb24gTTRWU1MzR1BQX0VkaXRTZXR0aW5ncyBzdHJ1Y3R1cmUgdG8gZnJlZQotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2ZyZWVTZXR0aW5ncyhNNFZTUzNHUFBfRWRpdFNldHRpbmdzKiBwU2V0dGluZ3MpCi17Ci0gICAgTTRPU0FfVUludDggaSxqOwotCi0gICAgLyoqCi0gICAgICogRm9yIGVhY2ggY2xpcCAuLi4gKi8KLSAgICBmb3IoaT0wOyBpPHBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyOyBpKyspCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogLi4uIGZyZWUgY2xpcCBzZXR0aW5ncyAqLwotICAgICAgICBpZihwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNHhWU1NfRnJlZUNsaXBTZXR0aW5ncyhwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSk7Ci0KLSAgICAgICAgICAgIGZyZWUoKHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldKSk7Ci0gICAgICAgICAgICBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogLi4uIGZyZWUgdHJhbnNpdGlvbiBzZXR0aW5ncyAqLwotICAgICAgICBpZihpIDwgcFNldHRpbmdzLT51aUNsaXBOdW1iZXItMSkgLyogQmVjYXVzZSB0aGVyZSBpcyAxIGxlc3MgdHJhbnNpdGlvbiB0aGFuIGNsaXAgbnVtYmVyICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+VmlkZW9UcmFuc2l0aW9uVHlwZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb1RyYW5zaXRpb25UeXBlX0FscGhhTWFnaWM6Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICogSW4gY2FzZSBvZiBBbHBoYSBNYWdpYyB0cmFuc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzb21lIGV4dHJhIHBhcmFtZXRlcnMgbmVlZCB0byBiZSBmcmVlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYocFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPnBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoKCgoTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncyopXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+cEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQpLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmUtPnBhY19kYXRhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzKilwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLT5wRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCktPnBQbGFuZS0+cGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSgoKChNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzKilcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCktPnBQbGFuZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncyopcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV1cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+cEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQpLT5wUGxhbmUgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSgocFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+cEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGo9aSsxO2o8cFNldHRpbmdzLT51aUNsaXBOdW1iZXItMTtqKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtqXSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtqXS0+VmlkZW9UcmFuc2l0aW9uVHlwZSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19rVmlkZW9UcmFuc2l0aW9uVHlwZV9BbHBoYU1hZ2ljKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBwQ21wUmVzdWx0PTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENtcFJlc3VsdCA9IHN0cmNtcCgoY29uc3QgY2hhciAqKXBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYUZpbGVQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKilwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtqXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhRmlsZVBhdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBDbXBSZXN1bHQgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgZXh0cmEgaW50ZXJuYWwgYWxwaGEgbWFnaWMgc3RydWN0dXJlIGFuZCBwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgdG8gTlVMTCB0byBhdm9pZCByZWZyZWVpbmcgaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSgocFNldHRpbmdzLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3Rbal0tPnBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2pdLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWxwaGFGaWxlUGF0aCAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwU2V0dGluZ3MtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhRmlsZVBhdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYUZpbGVQYXRoID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvVHJhbnNpdGlvblR5cGVfU2xpZGVUcmFuc2l0aW9uOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wU2xpZGVUcmFuc2l0aW9uU2V0dGluZ3MpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wU2xpZGVUcmFuc2l0aW9uU2V0dGluZ3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBTbGlkZVRyYW5zaXRpb25TZXR0aW5ncyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+cEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKChwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT5wRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIEZyZWUgdHJhbnNpdGlvbiBzZXR0aW5ncyBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICBmcmVlKChwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXSkpOwotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZyZWUgY2xpcCBsaXN0ICovCi0gICAgaWYocFNldHRpbmdzLT5wQ2xpcExpc3QgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIGZyZWUoKHBTZXR0aW5ncy0+cENsaXBMaXN0KSk7Ci0gICAgICAgIHBTZXR0aW5ncy0+cENsaXBMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGcmVlIHRyYW5zaXRpb24gbGlzdCAqLwotICAgIGlmKHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBmcmVlKChwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCkpOwotICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUkM6IEZyZWUgZWZmZWN0cyBsaXN0ICovCi0gICAgaWYocFNldHRpbmdzLT5FZmZlY3RzICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBmb3IoaT0wOyBpPHBTZXR0aW5ncy0+bmJFZmZlY3RzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogRm9yIGVhY2ggY2xpcCwgZnJlZSBmcmFtaW5nIHN0cnVjdHVyZSBpZiBuZWVkZWQgKi8KLSAgICAgICAgICAgIGlmKHBTZXR0aW5ncy0+RWZmZWN0c1tpXS5WaWRlb0VmZmVjdFR5cGUgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRnJhbWluZwotICAgICAgICAgICAgICAgIHx8IHBTZXR0aW5ncy0+RWZmZWN0c1tpXS5WaWRlb0VmZmVjdFR5cGUgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfVGV4dCkKLSAgICAgICAgICAgIHsKLSNpZmRlZiBERUNPREVfR0lGX09OX1NBVklORwotICAgICAgICAgICAgICAgIE00eFZTU19GcmFtaW5nQ29udGV4dCogZnJhbWluZ0N0eCA9IHBTZXR0aW5ncy0+RWZmZWN0c1tpXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0OwotI2Vsc2UKLSAgICAgICAgICAgICAgICBNNHhWU1NfRnJhbWluZ1N0cnVjdCogZnJhbWluZ0N0eCA9IHBTZXR0aW5ncy0+RWZmZWN0c1tpXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0OwotICAgICAgICAgICAgICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4X3NhdmU7Ci0gICAgICAgICAgICAgICAgTTR4VlNTX0ZyYW1pbmczMTAyU3RydWN0KiBmcmFtaW5nQ3R4X2ZpcnN0ID0gZnJhbWluZ0N0eDsKLSNlbmRpZgotCi0jaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLSAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4ICE9IE00T1NBX05VTEwpIC8qIEJ1Z2ZpeCAxLjIuMDogY3Jhc2gsIHRyeWluZyB0byBmcmVlIG5vbiBleGlzdGFudAotICAgICAgICAgICAgICAgICBwb2ludGVyICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1pbmdSZ2ItPnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1l1diAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWluZ1l1dlswXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtaW5nWXV2WzFdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1pbmdZdXZbMl0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nWXV2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1l1diA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eF9sYXN0ICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QtPkZyYW1pbmdSZ2IgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWluZ1JnYi0+cGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QtPkZyYW1pbmdSZ2ItPnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWluZ1JnYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHhfbGFzdC0+RnJhbWluZ1JnYiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eF9sYXN0LT5GcmFtaW5nWXV2ICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eF9sYXN0LT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1pbmdZdXZbMF0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHhfbGFzdC0+RnJhbWluZ1l1dik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHhfbGFzdC0+RnJhbWluZ1l1diA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHhfbGFzdCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWluZ0N0eC0+cEVmZmVjdEZpbGVQYXRoICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+cEVmZmVjdEZpbGVQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPnBFZmZlY3RGaWxlUGF0aCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLypJbiBjYXNlIHRoZXJlIGFyZSBzdGlsbCBhbGxvY2F0ZWQqLwotICAgICAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4LT5wU1BTQ29udGV4dCAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vICAgIE00U1BTX2Rlc3Ryb3koZnJhbWluZ0N0eC0+cFNQU0NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+cFNQU0NvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qQWxwaGEgYmxlbmRpbmcgc3RydWN0dXJlKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdCAgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4KTsKLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWluZ0N0eCAhPSBNNE9TQV9OVUxMKSAvKiBCdWdmaXggMS4yLjA6IGNyYXNoLCB0cnlpbmcgdG8gZnJlZSBub24KLSAgICAgICAgICAgICAgICAgICAgZXhpc3RhbnQgcG9pbnRlciAqLwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+cGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eF9zYXZlID0gZnJhbWluZ0N0eC0+cE5leHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4ID0gZnJhbWluZ0N0eF9zYXZlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLypGQjogYnVnIGZpeCBQNE1FMDAwMDMwMDIqLwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IHdoaWxlKGZyYW1pbmdDdHhfZmlyc3QgIT0gZnJhbWluZ0N0eCk7Ci0jZW5kaWYKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZpZnRpZXMgPT0gcFNldHRpbmdzLT5FZmZlY3RzW2ldLlZpZGVvRWZmZWN0VHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBGcmVlIEZpZnRpZXMgY29udGV4dCAqLwotICAgICAgICAgICAgICAgIE00eFZTU19GaWZ0aWVzU3RydWN0KiBGaWZ0aWVzQ3R4ID0gcFNldHRpbmdzLT5FZmZlY3RzW2ldLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQ7Ci0KLSAgICAgICAgICAgICAgICBpZihGaWZ0aWVzQ3R4ICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKEZpZnRpZXNDdHgpOwotICAgICAgICAgICAgICAgICAgICBGaWZ0aWVzQ3R4ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0NvbG9yUkdCMTYgPT0gcFNldHRpbmdzLT5FZmZlY3RzW2ldLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgICAgIHx8IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0JsYWNrQW5kV2hpdGUgPT0gcFNldHRpbmdzLT5FZmZlY3RzW2ldLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgICAgIHx8IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1BpbmsgPT0gcFNldHRpbmdzLT5FZmZlY3RzW2ldLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgICAgIHx8IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyZWVuID09IHBTZXR0aW5ncy0+RWZmZWN0c1tpXS5WaWRlb0VmZmVjdFR5cGUKLSAgICAgICAgICAgICAgICB8fCBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9TZXBpYSA9PSBwU2V0dGluZ3MtPkVmZmVjdHNbaV0uVmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICAgICAgfHwgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfTmVnYXRpdmU9PSBwU2V0dGluZ3MtPkVmZmVjdHNbaV0uVmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICAgICAgfHwgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JhZGllbnQ9PSBwU2V0dGluZ3MtPkVmZmVjdHNbaV0uVmlkZW9FZmZlY3RUeXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIEZyZWUgQ29sb3IgY29udGV4dCAqLwotICAgICAgICAgICAgICAgIE00eFZTU19Db2xvclN0cnVjdCogQ29sb3JDdHggPSBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ucEV4dFZpZGVvRWZmZWN0RmN0Q3R4dDsKLQotICAgICAgICAgICAgICAgIGlmKENvbG9yQ3R4ICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKENvbG9yQ3R4KTsKLSAgICAgICAgICAgICAgICAgICAgQ29sb3JDdHggPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogRnJlZSBzaW1wbGUgZmllbGRzICovCi0gICAgICAgICAgICBpZihwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZShwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoKTsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZShwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlcik7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYocFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucFRleHRCdWZmZXIgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBUZXh0QnVmZmVyKTsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wVGV4dEJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZnJlZShwU2V0dGluZ3MtPkVmZmVjdHMpOwotICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHMgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgTTR4VlNTX2ZyZWVDb21tYW5kKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0vLyAgICBNNE9TQV9VSW50OCBpLGo7Ci0KLSAgICAvKiBGcmVlICJsb2NhbCIgQkdNIHNldHRpbmdzICovCi0gICAgaWYoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBpZih4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgTTR4VlNTX2ZyZWVTZXR0aW5ncyh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncyk7Ci0KLSAgICBpZih4VlNTX2NvbnRleHQtPnBQVG8zR1BQcGFyYW1zTGlzdCAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTR4VlNTX1B0bzNHUFBfcGFyYW1zKiBwUGFyYW1zID0geFZTU19jb250ZXh0LT5wUFRvM0dQUHBhcmFtc0xpc3Q7Ci0gICAgICAgIE00eFZTU19QdG8zR1BQX3BhcmFtcyogcFBhcmFtc19zYXV2OwotCi0gICAgICAgIHdoaWxlKHBQYXJhbXMgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYocFBhcmFtcy0+cEZpbGVJbiAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtcy0+cEZpbGVJbik7Ci0gICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVJbiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihwUGFyYW1zLT5wRmlsZU91dCAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIERlbGV0ZSB0ZW1wb3JhcnkgZmlsZSAqLwotICAgICAgICAgICAgICAgIHJlbW92ZSgoY29uc3QgY2hhciAqKXBQYXJhbXMtPnBGaWxlT3V0KTsKLSAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXMtPnBGaWxlT3V0KTsKLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRmlsZU91dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihwUGFyYW1zLT5wRmlsZVRlbXAgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBEZWxldGUgdGVtcG9yYXJ5IGZpbGUgKi8KLSNpZmRlZiBNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFCi0gICAgICAgICAgICAgICAgcmVtb3ZlKChjb25zdCBjaGFyICopcFBhcmFtcy0+cEZpbGVUZW1wKTsKLSAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXMtPnBGaWxlVGVtcCk7Ci0jZW5kaWYvKk00eFZTU19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UqLwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlVGVtcCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwUGFyYW1zX3NhdXYgPSBwUGFyYW1zOwotICAgICAgICAgICAgcFBhcmFtcyA9IHBQYXJhbXMtPnBOZXh0OwotICAgICAgICAgICAgZnJlZShwUGFyYW1zX3NhdXYpOwotICAgICAgICAgICAgcFBhcmFtc19zYXV2ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00eFZTU19NQ1NfcGFyYW1zKiBwUGFyYW1zID0geFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdDsKLSAgICAgICAgTTR4VlNTX01DU19wYXJhbXMqIHBQYXJhbXNfc2F1djsKLQotICAgICAgICB3aGlsZShwUGFyYW1zICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHBQYXJhbXMtPnBGaWxlSW4gIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXMtPnBGaWxlSW4pOwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlSW4gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYocFBhcmFtcy0+cEZpbGVPdXQgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBEZWxldGUgdGVtcG9yYXJ5IGZpbGUgKi8KLSAgICAgICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKilwUGFyYW1zLT5wRmlsZU91dCk7Ci0gICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zLT5wRmlsZU91dCk7Ci0gICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVPdXQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYocFBhcmFtcy0+cEZpbGVUZW1wICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogRGVsZXRlIHRlbXBvcmFyeSBmaWxlICovCi0jaWZkZWYgTTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRQotICAgICAgICAgICAgICAgIHJlbW92ZSgoY29uc3QgY2hhciAqKXBQYXJhbXMtPnBGaWxlVGVtcCk7Ci0gICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zLT5wRmlsZVRlbXApOwotI2VuZGlmLypNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFKi8KLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRmlsZVRlbXAgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFBhcmFtc19zYXV2ID0gcFBhcmFtczsKLSAgICAgICAgICAgIHBQYXJhbXMgPSBwUGFyYW1zLT5wTmV4dDsKLSAgICAgICAgICAgIGZyZWUocFBhcmFtc19zYXV2KTsKLSAgICAgICAgICAgIHBQYXJhbXNfc2F1diA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZih4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cGNtUHJldmlld0ZpbGUpOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgaWYoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwKLSAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUpOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKiBSZWluaXQgYWxsIGNvbnRleHQgdmFyaWFibGVzICovCi0gICAgeFZTU19jb250ZXh0LT5wcmV2aW91c0NsaXBOdW1iZXIgPSAwOwotICAgIHhWU1NfY29udGV4dC0+ZWRpdGluZ1N0ZXAgPSBNNHhWU1Nfa01pY3JvU3RhdGVFZGl0aW5nOwotICAgIHhWU1NfY29udGV4dC0+YW5hbHlzZVN0ZXAgPSBNNHhWU1Nfa01pY3JvU3RhdGVBbmFseXNlUHRvM0dQUDsKLSAgICB4VlNTX2NvbnRleHQtPnBQVG8zR1BQcGFyYW1zTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgeFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMgPSBNNE9TQV9OVUxMOwotICAgIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QgPSBNNE9TQV9OVUxMOwotICAgIHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMgPSBNNE9TQV9OVUxMOwotICAgIHhWU1NfY29udGV4dC0+dGVtcEZpbGVJbmRleCA9IDA7Ci0gICAgeFZTU19jb250ZXh0LT50YXJnZXRlZFRpbWVzY2FsZSA9IDA7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbEdldFByb3BlcnRpZXMoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogcEZpbGUsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwRmlsZVByb3BlcnRpZXMpCi0gKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gcmV0cmlldmUgcHJvcGVydGllcyBvZiBhbiBpbnB1dCAzR1AgZmlsZSB1c2luZyBNQ1MKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgIChJTikgVGhlIGludGVncmF0b3Igb3duIGNvbnRleHQKLSAqIEBwYXJhbSAgICBwRmlsZSAgICAgICAgICAgIChJTikgM0dQIGZpbGUgdG8gYW5hbHlzZQotICogQHBhcmFtICAgIHBGaWxlUHJvcGVydGllcyAgICAoSU4vT1VUKSBQb2ludGVyIG9uIGEgc3RydWN0dXJlIHRoYXQgd2lsbCBjb250YWluCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgM0dQIGZpbGUgcHJvcGVydGllcwotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyhNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9DaGFyKiBwRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwRmlsZVByb3BlcnRpZXMpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE1DU19Db250ZXh0IG1jc19jb250ZXh0OwotCi0gICAgZXJyID0gTTRNQ1NfaW5pdCgmbWNzX2NvbnRleHQsIHhWU1NfY29udGV4dC0+cEZpbGVSZWFkUHRyLCB4VlNTX2NvbnRleHQtPnBGaWxlV3JpdGVQdHIpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbEdldFByb3BlcnRpZXM6IEVycm9yIGluIE00TUNTX2luaXQ6IDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qb3BlbiB0aGUgTUNTIGluIHRoZSAibm9ybWFsIG9wZW5pbmciIG1vZGUgdG8gcmV0cmlldmUgdGhlIGV4YWN0IGR1cmF0aW9uKi8KLSAgICBlcnIgPSBNNE1DU19vcGVuX25vcm1hbE1vZGUobWNzX2NvbnRleHQsIHBGaWxlLCBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUCwKLSAgICAgICAgTTRPU0FfTlVMTCwgTTRPU0FfTlVMTCk7Ci0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbEdldFByb3BlcnRpZXM6IEVycm9yIGluIE00TUNTX29wZW46IDB4JXgiLCBlcnIpOwotICAgICAgICBNNE1DU19hYm9ydChtY3NfY29udGV4dCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gTTRNQ1NfZ2V0SW5wdXRGaWxlUHJvcGVydGllcyhtY3NfY29udGV4dCwgcEZpbGVQcm9wZXJ0aWVzKTsKLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJFcnJvciBpbiBNNE1DU19nZXRJbnB1dEZpbGVQcm9wZXJ0aWVzOiAweCV4IiwgZXJyKTsKLSAgICAgICAgTTRNQ1NfYWJvcnQobWNzX2NvbnRleHQpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGVyciA9IE00TUNTX2Fib3J0KG1jc19jb250ZXh0KTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllczogRXJyb3IgaW4gTTRNQ1NfYWJvcnQ6IDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxHZXRUYXJnZXRlZFRpbWVTY2FsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHBUYXJnZXRlZFRpbWVTY2FsZSkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiByZXRyaWV2ZSB0YXJnZXRlZCB0aW1lIHNjYWxlCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSAgICBUaGUgaW50ZWdyYXRvciBvd24gY29udGV4dAotICogQHBhcmFtICAgIHBUYXJnZXRlZFRpbWVTY2FsZSAgICAoT1VUKSAgICBUYXJnZXRlZCB0aW1lIHNjYWxlCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxHZXRUYXJnZXRlZFRpbWVTY2FsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FZGl0U2V0dGluZ3MqIHBTZXR0aW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiBwVGFyZ2V0ZWRUaW1lU2NhbGUpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9VSW50MzIgdG90YWxEdXJhdGlvbiA9IDA7Ci0gICAgTTRPU0FfVUludDggaSA9IDA7Ci0gICAgTTRPU0FfVUludDMyIHRlbXBUaW1lU2NhbGUgPSAwLCB0ZW1wRHVyYXRpb24gPSAwOwotCi0gICAgZm9yKGk9MDtpPHBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyO2krKykKLSAgICB7Ci0gICAgICAgIC8qc2VhcmNoIHRpbWVzY2FsZSBvbmx5IGluIG1wZWc0IGNhc2UqLwotICAgICAgICBpZihwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFAKLSAgICAgICAgICAgIHx8IHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5GaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTVA0Ci0gICAgICAgICAgICB8fCBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX000VikKLSAgICAgICAgewotICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgZmlsZVByb3BlcnRpZXM7Ci0KLSAgICAgICAgICAgIC8qVVRGIGNvbnZlcnNpb24gc3VwcG9ydCovCi0gICAgICAgICAgICBNNE9TQV9DaGFyKiBwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgICAgICBwRGVjb2RlZFBhdGggPSBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGU7Ci0KLSAgICAgICAgICAgIGlmKHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZUb1VURjhGY3QgIT0gTTRPU0FfTlVMTAotICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGxlbmd0aCA9IDA7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkKikgcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQqKSB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX0luaXQ6XAotICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbENvbnZlcnRUb1VURjggcmV0dXJucyBlcnI6IDB4JXgiLGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKkVuZCBvZiB0aGUgY29udmVyc2lvbjogdXNlIHRoZSBkZWNvZGVkIHBhdGgqLwotICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyh4VlNTX2NvbnRleHQsIHBEZWNvZGVkUGF0aCwgJmZpbGVQcm9wZXJ0aWVzKTsKLQotICAgICAgICAgICAgLypnZXQgaW5wdXQgZmlsZSBwcm9wZXJ0aWVzKi8KLSAgICAgICAgICAgIC8qZXJyID0gTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyh4VlNTX2NvbnRleHQsIHBTZXR0aW5ncy0+XAotICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtpXS0+cEZpbGUsICZmaWxlUHJvcGVydGllcyk7Ki8KLSAgICAgICAgICAgIGlmKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxHZXRUYXJnZXRlZFRpbWVTY2FsZTpcCi0gICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxHZXRQcm9wZXJ0aWVzIHJldHVybmVkOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tNUEVHNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlFbmRDdXRUaW1lID4gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHRlbXBEdXJhdGlvbiA8IChwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlFbmRDdXRUaW1lIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIC0gcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFRpbWVTY2FsZSA9IGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9UaW1lU2NhbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wRHVyYXRpb24gPSAocFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlCZWdpbkN1dFRpbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHRlbXBEdXJhdGlvbiA8IChmaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvblwKLSAgICAgICAgICAgICAgICAgICAgICAgICAtIHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBUaW1lU2NhbGUgPSBmaWxlUHJvcGVydGllcy51aVZpZGVvVGltZVNjYWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcER1cmF0aW9uID0gKGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYocFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPkZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkKLSAgICAgICAgewotICAgICAgICAgICAgLyp0aGUgdGltZXNjYWxlIGlzIDMwIGZvciBQVE8zR1AqLwotICAgICAgICAgICAgKnBUYXJnZXRlZFRpbWVTY2FsZSA9IDMwOwotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKHRlbXBUaW1lU2NhbGUgPj0gMzApLypEZWZpbmUgYSBtaW5pbXVtIHRpbWUgc2NhbGUsIG90aGVyd2lzZSBpZiB0aGUgdGltZXNjYWxlIGlzIG5vdAotICAgIGVub3VnaCwgdGhlcmUgd2lsbCBiZSBhbiBpbmZpbml0ZSBsb29wIGluIHRoZSBzaGVsbCBlbmNvZGVyKi8KLSAgICB7Ci0gICAgICAgICpwVGFyZ2V0ZWRUaW1lU2NhbGUgPSB0ZW1wVGltZVNjYWxlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAqcFRhcmdldGVkVGltZVNjYWxlID0gMzA7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RDb2xvcihNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBhcHBseSBhIGNvbG9yIGVmZmVjdCBvbiBhbiBpbnB1dCBZVVY0MjAgcGxhbmFyIGZyYW1lCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBGdW5jdGlvbkNvbnRleHQoSU4pIENvbnRhaW5zIHdoaWNoIGNvbG9yIHRvIGFwcGx5IChub3QgdmVyeSBjbGVhbiAuLi4pCi0gKiBAcGFyYW0gICAgUGxhbmVJbiAgICAgICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIFBsYW5lT3V0ICAgICAgICAoSU4vT1VUKSBPdXRwdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIHBQcm9ncmVzcyAgICAgICAgKElOL09VVCkgUHJvZ3Jlc3MgaW5kaWNhdGlvbiAoMC0xMDApCi0gKiBAcGFyYW0gICAgdWlFZmZlY3RLaW5kICAgIChJTikgVW51c2VkCi0gKgotICogQHJldHVybiAgICBNNFZJRklfT0s6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdENvbG9yKE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kKQotewotICAgIE00VklGSV9JbnQzMiBwbGFuZV9udW1iZXI7Ci0gICAgTTRWSUZJX1VJbnQzMiBpLGo7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2J1Zl9zcmMsICpwX2J1Zl9kZXN0OwotICAgIE00eFZTU19Db2xvclN0cnVjdCogQ29sb3JDb250ZXh0ID0gKE00eFZTU19Db2xvclN0cnVjdCopcEZ1bmN0aW9uQ29udGV4dDsKLQotICAgIGZvciAocGxhbmVfbnVtYmVyID0gMDsgcGxhbmVfbnVtYmVyIDwgMzsgcGxhbmVfbnVtYmVyKyspCi0gICAgewotICAgICAgICBwX2J1Zl9zcmMgPSAmKFBsYW5lSW5bcGxhbmVfbnVtYmVyXS5wYWNfZGF0YVtQbGFuZUluW3BsYW5lX251bWJlcl0udV90b3BsZWZ0XSk7Ci0gICAgICAgIHBfYnVmX2Rlc3QgPSAmKFBsYW5lT3V0W3BsYW5lX251bWJlcl0ucGFjX2RhdGFbUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3RvcGxlZnRdKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9oZWlnaHQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBDaHJvbWluYW5jZSAqLwotICAgICAgICAgICAgaWYocGxhbmVfbnVtYmVyPT0xIHx8IHBsYW5lX251bWJlcj09MikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL3N3aXRjaCAoKE00T1NBX1VJbnQzMilwRnVuY3Rpb25Db250ZXh0KQotICAgICAgICAgICAgICAgIC8vIGNvbW1lbnRlZCBiZWNhdXNlIGEgc3RydWN0dXJlIGZvciB0aGUgZWZmZWN0cyBjb250ZXh0IGV4aXN0Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChDb2xvckNvbnRleHQtPmNvbG9yRWZmZWN0VHlwZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQmxhY2tBbmRXaGl0ZToKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsMTI4LAotICAgICAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1Bpbms6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2J1Zl9kZXN0LDI1NSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9HcmVlbjoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9TZXBpYToKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBsYW5lX251bWJlcj09MSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2J1Zl9kZXN0LDExNywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsMTM5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9OZWdhdGl2ZToKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfYnVmX2Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwX2J1Zl9zcmMgLFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0NvbG9yUkdCMTY6Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDE2IHIgPSAwLGcgPSAwLGIgPSAwLHkgPSAwLHUgPSAwLHYgPSAwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypmaXJzdCBnZXQgdGhlIHIsIGcsIGIqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAoQ29sb3JDb250ZXh0LT5yZ2IxNkNvbG9yRGF0YSAmICAweDAwMWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcgPSAoQ29sb3JDb250ZXh0LT5yZ2IxNkNvbG9yRGF0YSAmICAweDA3ZTApPj41OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSAoQ29sb3JDb250ZXh0LT5yZ2IxNkNvbG9yRGF0YSAmICAweGY4MDApPj4xMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qa2VlcCB5LCBidXQgcmVwbGFjZSB1IGFuZCB2Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwbGFuZV9udW1iZXI9PTEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRoZW4gY29udmVydCB0byB1Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA9IFUxNihyLCBnLCBiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwoTTRPU0FfVUludDgpdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocGxhbmVfbnVtYmVyPT0yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0aGVuIGNvbnZlcnQgdG8gdiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBWMTYociwgZywgYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsIChNNE9TQV9VSW50OCl2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyYWRpZW50OgotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiByID0gMCxnID0gMCxiID0gMCx5ID0gMCx1ID0gMCx2ID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qZmlyc3QgZ2V0IHRoZSByLCBnLCBiKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gKENvbG9yQ29udGV4dC0+cmdiMTZDb2xvckRhdGEgJiAgMHgwMDFmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnID0gKENvbG9yQ29udGV4dC0+cmdiMTZDb2xvckRhdGEgJiAgMHgwN2UwKT4+NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gKENvbG9yQ29udGV4dC0+cmdiMTZDb2xvckRhdGEgJiAgMHhmODAwKT4+MTE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmZvciBjb2xvciBncmFkYXRpb24qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAoTTRPU0FfVUludDE2KSggYiAtICgoYippKS9QbGFuZUluW3BsYW5lX251bWJlcl0udV9oZWlnaHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnID0gKE00T1NBX1VJbnQxNikoZyAtICgoZyppKS9QbGFuZUluW3BsYW5lX251bWJlcl0udV9oZWlnaHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gKE00T1NBX1VJbnQxNikociAtICgocippKS9QbGFuZUluW3BsYW5lX251bWJlcl0udV9oZWlnaHQpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qa2VlcCB5LCBidXQgcmVwbGFjZSB1IGFuZCB2Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwbGFuZV9udW1iZXI9PTEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRoZW4gY29udmVydCB0byB1Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA9IFUxNihyLCBnLCBiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwoTTRPU0FfVUludDgpdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocGxhbmVfbnVtYmVyPT0yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0aGVuIGNvbnZlcnQgdG8gdiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBWMTYociwgZywgYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsKE00T1NBX1VJbnQ4KXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBMdW1pbmFuY2UgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL3N3aXRjaCAoKE00T1NBX1VJbnQzMilwRnVuY3Rpb25Db250ZXh0KQotICAgICAgICAgICAgICAgIC8vIGNvbW1lbnRlZCBiZWNhdXNlIGEgc3RydWN0dXJlIGZvciB0aGUgZWZmZWN0cyBjb250ZXh0IGV4aXN0Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChDb2xvckNvbnRleHQtPmNvbG9yRWZmZWN0VHlwZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9OZWdhdGl2ZToKLSAgICAgICAgICAgICAgICAgICAgZm9yKGo9MDtqPFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aDtqKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zl9kZXN0W2pdID0gMjU1IC0gcF9idWZfc3JjW2pdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfYnVmX2Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBfYnVmX3NyYyAsUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcF9idWZfc3JjICs9IFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3N0cmlkZTsKLSAgICAgICAgICAgIHBfYnVmX2Rlc3QgKz0gUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3N0cmlkZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RnJhbWluZyhNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBhZGQgYSBmaXhlZCBvciBhbmltYXRlZCBpbWFnZSBvbiBhbiBpbnB1dCBZVVY0MjAgcGxhbmFyIGZyYW1lCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBGdW5jdGlvbkNvbnRleHQoSU4pIENvbnRhaW5zIHdoaWNoIGNvbG9yIHRvIGFwcGx5IChub3QgdmVyeSBjbGVhbiAuLi4pCi0gKiBAcGFyYW0gICAgUGxhbmVJbiAgICAgICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIFBsYW5lT3V0ICAgICAgICAoSU4vT1VUKSBPdXRwdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIHBQcm9ncmVzcyAgICAgICAgKElOL09VVCkgUHJvZ3Jlc3MgaW5kaWNhdGlvbiAoMC0xMDApCi0gKiBAcGFyYW0gICAgdWlFZmZlY3RLaW5kICAgIChJTikgVW51c2VkCi0gKgotICogQHJldHVybiAgICBNNFZJRklfT0s6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZyYW1pbmcoIE00T1NBX1ZvaWQgKnVzZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJblszXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kICkKLXsKLSAgICBNNFZJRklfVUludDMyIHgseTsKLQotICAgIE00VklGSV9VSW50OCAqcF9pbl9ZID0gUGxhbmVJblswXS5wYWNfZGF0YTsKLSAgICBNNFZJRklfVUludDggKnBfaW5fVSA9IFBsYW5lSW5bMV0ucGFjX2RhdGE7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2luX1YgPSBQbGFuZUluWzJdLnBhY19kYXRhOwotCi0gICAgTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QqIEZyYW1pbmcgPSBNNE9TQV9OVUxMOwotICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiBjdXJyZW50RnJhbWluZyA9IE00T1NBX05VTEw7Ci0gICAgTTRWSUZJX1VJbnQ4ICpGcmFtaW5nUkdCID0gTTRPU0FfTlVMTDsKLQotICAgIE00VklGSV9VSW50OCAqcF9vdXQwOwotICAgIE00VklGSV9VSW50OCAqcF9vdXQxOwotICAgIE00VklGSV9VSW50OCAqcF9vdXQyOwotCi0gICAgTTRWSUZJX1VJbnQzMiB0b3BsZWZ0WzJdOwotCi0gICAgTTRPU0FfVUludDggdHJhbnNwYXJlbnQxID0gKE00T1NBX1VJbnQ4KSgoVFJBTlNQQVJFTlRfQ09MT1IgJiAweEZGMDApPj44KTsKLSAgICBNNE9TQV9VSW50OCB0cmFuc3BhcmVudDIgPSAoTTRPU0FfVUludDgpVFJBTlNQQVJFTlRfQ09MT1I7Ci0KLSNpZm5kZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLSAgICBGcmFtaW5nID0gKE00eFZTU19GcmFtaW5nU3RydWN0ICopdXNlckRhdGE7Ci0gICAgY3VycmVudEZyYW1pbmcgPSAoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QgKilGcmFtaW5nLT5wQ3VycmVudDsKLSAgICBGcmFtaW5nUkdCID0gRnJhbWluZy0+RnJhbWluZ1JnYi0+cGFjX2RhdGE7Ci0jZW5kaWYgLypERUNPREVfR0lGX09OX1NBVklORyovCi0KLSAgICAvKkZCKi8KLSNpZmRlZiBERUNPREVfR0lGX09OX1NBVklORwotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgRnJhbWluZyA9IChNNHhWU1NfRnJhbWluZ1N0cnVjdCAqKSgoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Kil1c2VyRGF0YSktPmFGcmFtaW5nQ3R4OwotICAgIGN1cnJlbnRGcmFtaW5nID0gKE00eFZTU19GcmFtaW5nU3RydWN0ICopRnJhbWluZzsKLSAgICBGcmFtaW5nUkdCID0gRnJhbWluZy0+RnJhbWluZ1JnYi0+cGFjX2RhdGE7Ci0jZW5kaWYgLypERUNPREVfR0lGX09OX1NBVklORyovCi0gICAgLyplbmQgRkIqLwotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSBpbnB1dCAvIG91dHB1dCBwbGFuZSBwb2ludGVycyAqLwotICAgIHBfaW5fWSArPSBQbGFuZUluWzBdLnVfdG9wbGVmdDsKLSAgICBwX2luX1UgKz0gUGxhbmVJblsxXS51X3RvcGxlZnQ7Ci0gICAgcF9pbl9WICs9IFBsYW5lSW5bMl0udV90b3BsZWZ0OwotCi0gICAgcF9vdXQwID0gUGxhbmVPdXRbMF0ucGFjX2RhdGE7Ci0gICAgcF9vdXQxID0gUGxhbmVPdXRbMV0ucGFjX2RhdGE7Ci0gICAgcF9vdXQyID0gUGxhbmVPdXRbMl0ucGFjX2RhdGE7Ci0KLSAgICAvKioKLSAgICAgKiBEZXBlbmRpbmcgb24gdGltZSwgaW5pdGlhbGl6ZSBGcmFtaW5nIGZyYW1lIHRvIHVzZSAqLwotICAgIGlmKEZyYW1pbmctPnByZXZpb3VzQ2xpcFRpbWUgPT0gLTEpCi0gICAgewotICAgICAgICBGcmFtaW5nLT5wcmV2aW91c0NsaXBUaW1lID0gcFByb2dyZXNzLT51aU91dHB1dFRpbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgdGhlIGN1cnJlbnQgY2xpcCB0aW1lIGhhcyByZWFjaCB0aGUgZHVyYXRpb24gb2Ygb25lIGZyYW1lIG9mIHRoZSBmcmFtaW5nIHBpY3R1cmUKLSAgICAgKiB3ZSBuZWVkIHRvIHN0ZXAgdG8gbmV4dCBmcmFtaW5nIHBpY3R1cmUgKi8KLQotICAgIEZyYW1pbmctPnByZXZpb3VzQ2xpcFRpbWUgPSBwUHJvZ3Jlc3MtPnVpT3V0cHV0VGltZTsKLSAgICBGcmFtaW5nUkdCID0gY3VycmVudEZyYW1pbmctPkZyYW1pbmdSZ2ItPnBhY19kYXRhOwotICAgIHRvcGxlZnRbMF0gPSBjdXJyZW50RnJhbWluZy0+dG9wbGVmdF94OwotICAgIHRvcGxlZnRbMV0gPSBjdXJyZW50RnJhbWluZy0+dG9wbGVmdF95OwotCi0gICAgZm9yKCB4PTAgO3ggPCBQbGFuZUluWzBdLnVfaGVpZ2h0IDsgeCsrKQotICAgIHsKLSAgICAgICAgZm9yKCB5PTAgO3kgPCBQbGFuZUluWzBdLnVfd2lkdGggOyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVG8gaGFuZGxlIGZyYW1pbmcgd2l0aCBpbnB1dCBzaXplICE9IG91dHB1dCBzaXplCi0gICAgICAgICAgICAgKiBGcmFtaW5nIGlzIGFwcGx5ZWQgaWYgY29vcmRpbmF0ZXMgbWF0Y2hlcyBiZXR3ZWVuIGZyYW1pbmcvdG9wbGVmdCBhbmQgaW5wdXQgcGxhbmUgKi8KLSAgICAgICAgICAgIGlmKCB5IDwgKHRvcGxlZnRbMF0gKyBjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlswXS51X3dpZHRoKSAgJiYKLSAgICAgICAgICAgICAgICB5ID49IHRvcGxlZnRbMF0gJiYKLSAgICAgICAgICAgICAgICB4IDwgKHRvcGxlZnRbMV0gKyBjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlswXS51X2hlaWdodCkgJiYKLSAgICAgICAgICAgICAgICB4ID49IHRvcGxlZnRbMV0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLypBbHBoYSBibGVuZGluZyBzdXBwb3J0Ki8KLSAgICAgICAgICAgICAgICBNNE9TQV9GbG9hdCBhbHBoYUJsZW5kaW5nID0gMTsKLSAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxFZmZlY3RzQWxwaGFCbGVuZGluZyogIGFscGhhQmxlbmRpbmdTdHJ1Y3QgPVwKLSAgICAgICAgICAgICAgICAgKE00eFZTU19pbnRlcm5hbEVmZmVjdHNBbHBoYUJsZW5kaW5nKilcCi0gICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Kil1c2VyRGF0YSktPmFscGhhQmxlbmRpbmdTdHJ1Y3Q7Ci0KLSAgICAgICAgICAgICAgICBpZihhbHBoYUJsZW5kaW5nU3RydWN0ICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgXAotICAgICAgICAgICAgICAgICAgICA8IChNNE9TQV9VSW50MzIpKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZUluVGltZSoxMCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZUluVGltZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyA9IGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fc3RhcnQgLyAxMDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhQmxlbmRpbmcgPSAoKE00T1NBX0Zsb2F0KShhbHBoYUJsZW5kaW5nU3RydWN0LT5tX21pZGRsZVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBhbHBoYUJsZW5kaW5nU3RydWN0LT5tX3N0YXJ0KVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBQcm9ncmVzcy0+dWlQcm9ncmVzcy8oYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlSW5UaW1lKjEwKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyArPSBhbHBoYUJsZW5kaW5nU3RydWN0LT5tX3N0YXJ0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhQmxlbmRpbmcgLz0gMTAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYocFByb2dyZXNzLT51aVByb2dyZXNzID49IChNNE9TQV9VSW50MzIpKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPlwKLSAgICAgICAgICAgICAgICAgICAgbV9mYWRlSW5UaW1lKjEwKSAmJiBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgPCAxMDAwXAotICAgICAgICAgICAgICAgICAgICAgLSAoTTRPU0FfVUludDMyKShhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVPdXRUaW1lKjEwKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyA9IChNNE9TQV9GbG9hdClcCi0gICAgICAgICAgICAgICAgICAgICAgICAoKE00T1NBX0Zsb2F0KWFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fbWlkZGxlLzEwMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgPj0gMTAwMCAtIChNNE9TQV9VSW50MzIpXAotICAgICAgICAgICAgICAgICAgICAoYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlT3V0VGltZSoxMCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZU91dFRpbWUgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhQmxlbmRpbmcgPSBhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2VuZCAvIDEwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyA9ICgoTTRPU0FfRmxvYXQpKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fbWlkZGxlIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZW5kKSkqKDEwMDAgLSBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8oYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlT3V0VGltZSoxMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyArPSBhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2VuZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYUJsZW5kaW5nIC89IDEwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiovCi0KLSAgICAgICAgICAgICAgICBpZigoKihGcmFtaW5nUkdCKT09dHJhbnNwYXJlbnQxKSAmJiAoKihGcmFtaW5nUkdCKzEpPT10cmFuc3BhcmVudDIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKiggcF9vdXQwK3kreCpQbGFuZU91dFswXS51X3N0cmlkZSk9KCoocF9pbl9ZK3kreCpQbGFuZUluWzBdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICAgICAgICAgICooIHBfb3V0MSsoeT4+MSkrKHg+PjEpKlBsYW5lT3V0WzFdLnVfc3RyaWRlKT0KLSAgICAgICAgICAgICAgICAgICAgICAgICgqKHBfaW5fVSsoeT4+MSkrKHg+PjEpKlBsYW5lSW5bMV0udV9zdHJpZGUpKTsKLSAgICAgICAgICAgICAgICAgICAgKiggcF9vdXQyKyh5Pj4xKSsoeD4+MSkqUGxhbmVPdXRbMl0udV9zdHJpZGUpPQotICAgICAgICAgICAgICAgICAgICAgICAgKCoocF9pbl9WKyh5Pj4xKSsoeD4+MSkqUGxhbmVJblsyXS51X3N0cmlkZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDAreSt4KlBsYW5lT3V0WzBdLnVfc3RyaWRlKT0KLSAgICAgICAgICAgICAgICAgICAgICAgICgqKGN1cnJlbnRGcmFtaW5nLT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhKyh5LXRvcGxlZnRbMF0pXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsoeC10b3BsZWZ0WzFdKSpjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlswXS51X3N0cmlkZSkpKmFscGhhQmxlbmRpbmc7Ci0gICAgICAgICAgICAgICAgICAgICooIHBfb3V0MCt5K3gqUGxhbmVPdXRbMF0udV9zdHJpZGUpKz0KLSAgICAgICAgICAgICAgICAgICAgICAgICgqKHBfaW5fWSt5K3gqUGxhbmVJblswXS51X3N0cmlkZSkpKigxLWFscGhhQmxlbmRpbmcpOwotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDErKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsxXS51X3N0cmlkZSk9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKihjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlsxXS5wYWNfZGF0YSsoKHktdG9wbGVmdFswXSk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsoKHgtdG9wbGVmdFsxXSk+PjEpKmN1cnJlbnRGcmFtaW5nLT5GcmFtaW5nWXV2WzFdLnVfc3RyaWRlKSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbHBoYUJsZW5kaW5nOwotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDErKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsxXS51X3N0cmlkZSkrPQotICAgICAgICAgICAgICAgICAgICAgICAgKCoocF9pbl9VKyh5Pj4xKSsoeD4+MSkqUGxhbmVJblsxXS51X3N0cmlkZSkpKigxLWFscGhhQmxlbmRpbmcpOwotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDIrKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsyXS51X3N0cmlkZSk9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKihjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlsyXS5wYWNfZGF0YSsoKHktdG9wbGVmdFswXSk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsoKHgtdG9wbGVmdFsxXSk+PjEpKmN1cnJlbnRGcmFtaW5nLT5GcmFtaW5nWXV2WzJdLnVfc3RyaWRlKSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbHBoYUJsZW5kaW5nOwotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDIrKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsyXS51X3N0cmlkZSkrPQotICAgICAgICAgICAgICAgICAgICAgICAgKCoocF9pbl9WKyh5Pj4xKSsoeD4+MSkqUGxhbmVJblsyXS51X3N0cmlkZSkpKigxLWFscGhhQmxlbmRpbmcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiggUGxhbmVJblswXS51X3dpZHRoIDwgKHRvcGxlZnRbMF0gKyBjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlswXS51X3dpZHRoKSAmJgotICAgICAgICAgICAgICAgICAgICB5ID09IFBsYW5lSW5bMF0udV93aWR0aC0xKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRnJhbWluZ1JHQiA9IEZyYW1pbmdSR0IgKyAyIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICogKHRvcGxlZnRbMF0gKyBjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlswXS51X3dpZHRoIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFBsYW5lSW5bMF0udV93aWR0aCArIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBGcmFtaW5nUkdCID0gRnJhbWluZ1JHQiArIDI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBKdXN0IGNvcHkgaW5wdXQgcGxhbmUgdG8gb3V0cHV0IHBsYW5lICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKiggcF9vdXQwK3kreCpQbGFuZU91dFswXS51X3N0cmlkZSk9KihwX2luX1kreSt4KlBsYW5lSW5bMF0udV9zdHJpZGUpOwotICAgICAgICAgICAgICAgICooIHBfb3V0MSsoeT4+MSkrKHg+PjEpKlBsYW5lT3V0WzFdLnVfc3RyaWRlKT0KLSAgICAgICAgICAgICAgICAgICAgKihwX2luX1UrKHk+PjEpKyh4Pj4xKSpQbGFuZUluWzFdLnVfc3RyaWRlKTsKLSAgICAgICAgICAgICAgICAqKCBwX291dDIrKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsyXS51X3N0cmlkZSk9Ci0gICAgICAgICAgICAgICAgICAgICoocF9pbl9WKyh5Pj4xKSsoeD4+MSkqUGxhbmVJblsyXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGaWZ0aWVzKE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kKQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIG1ha2UgYSB2aWRlbyBsb29rIGFzIGlmIGl0IHdhcyB0YWtlbiBpbiB0aGUgZmlmdGllcwotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwVXNlckRhdGEgICAgICAgKElOKSBDb250ZXh0Ci0gKiBAcGFyYW0gICAgcFBsYW5lSW4gICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIHBQbGFuZU91dCAgICAgICAgKElOL09VVCkgT3V0cHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBwUHJvZ3Jlc3MgICAgICAgIChJTi9PVVQpIFByb2dyZXNzIGluZGljYXRpb24gKDAtMTAwKQotICogQHBhcmFtICAgIHVpRWZmZWN0S2luZCAgICAoSU4pIFVudXNlZAotICoKLSAqIEByZXR1cm4gICAgTTRWSUZJX09LOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIHBGaWZ0aWVzRGF0YSwgcFBsYW5lT3V0IG9yIHBQcm9ncmVzcyBhcmUgTlVMTCAoREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RmlmdGllcyggTTRPU0FfVm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kICkKLXsKLSAgICBNNFZJRklfVUludDMyIHgsIHksIHhTaGlmdDsKLSAgICBNNFZJRklfVUludDggKnBJblkgPSBwUGxhbmVJblswXS5wYWNfZGF0YTsKLSAgICBNNFZJRklfVUludDggKnBPdXRZLCAqcEluWWJlZ2luOwotICAgIE00VklGSV9VSW50OCAqcEluQ3IsKiBwT3V0Q3I7Ci0gICAgTTRWSUZJX0ludDMyIHBsYW5lX251bWJlcjsKLQotICAgIC8qIEludGVybmFsIGNvbnRleHQqLwotICAgIE00eFZTU19GaWZ0aWVzU3RydWN0KiBwX0ZpZnRpZXNEYXRhID0gKE00eFZTU19GaWZ0aWVzU3RydWN0ICopcFVzZXJEYXRhOwotCi0gICAgLyogQ2hlY2sgdGhlIGlucHV0cyAoZGVidWcgb25seSkgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKHBfRmlmdGllc0RhdGEgPT0gTTRPU0FfTlVMTCksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgInhWU1M6IHBfRmlmdGllc0RhdGEgaXMgTTRPU0FfTlVMTCBpbiBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZpZnRpZXMiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKHBQbGFuZU91dCA9PSBNNE9TQV9OVUxMKSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAieFZTUzogcF9QbGFuZU91dCBpcyBNNE9TQV9OVUxMIGluIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RmlmdGllcyIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocFByb2dyZXNzID09IE00T1NBX05VTEwpLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgInhWU1M6IHBfUHJvZ3Jlc3MgaXMgTTRPU0FfTlVMTCBpbiBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZpZnRpZXMiKTsKLQotICAgIC8qIEluaXRpYWxpemUgaW5wdXQgLyBvdXRwdXQgcGxhbmUgcG9pbnRlcnMgKi8KLSAgICBwSW5ZICs9IHBQbGFuZUluWzBdLnVfdG9wbGVmdDsKLSAgICBwT3V0WSA9IHBQbGFuZU91dFswXS5wYWNfZGF0YTsKLSAgICBwSW5ZYmVnaW4gID0gcEluWTsKLQotICAgIC8qIEluaXRpYWxpemUgdGhlIHJhbmRvbSAqLwotICAgIGlmKHBfRmlmdGllc0RhdGEtPnByZXZpb3VzQ2xpcFRpbWUgPCAwKQotICAgIHsKLSAgICAgICAgTTRPU0FfcmFuZEluaXQoKTsKLSAgICAgICAgTTRPU0FfcmFuZCgoTTRPU0FfSW50MzIgKikmKHBfRmlmdGllc0RhdGEtPnNoaWZ0UmFuZG9tVmFsdWUpLCAocFBsYW5lSW5bMF0udV9oZWlnaHQpID4+IDQpOwotICAgICAgICBNNE9TQV9yYW5kKChNNE9TQV9JbnQzMiAqKSYocF9GaWZ0aWVzRGF0YS0+c3RyaXBlUmFuZG9tVmFsdWUpLCAocFBsYW5lSW5bMF0udV93aWR0aCk8PCAyKTsKLSAgICAgICAgcF9GaWZ0aWVzRGF0YS0+cHJldmlvdXNDbGlwVGltZSA9IHBQcm9ncmVzcy0+dWlPdXRwdXRUaW1lOwotICAgIH0KLQotICAgIC8qIENob29zZSByYW5kb20gdmFsdWVzIGlmIHdlIGhhdmUgcmVhY2hlZCB0aGUgZHVyYXRpb24gb2YgYSBwYXJ0aWFsIGVmZmVjdCAqLwotICAgIGVsc2UgaWYoIChwUHJvZ3Jlc3MtPnVpT3V0cHV0VGltZSAtIHBfRmlmdGllc0RhdGEtPnByZXZpb3VzQ2xpcFRpbWUpXAotICAgICAgICAgPiBwX0ZpZnRpZXNEYXRhLT5maWZ0aWVzRWZmZWN0RHVyYXRpb24pCi0gICAgewotICAgICAgICBNNE9TQV9yYW5kKChNNE9TQV9JbnQzMiAqKSYocF9GaWZ0aWVzRGF0YS0+c2hpZnRSYW5kb21WYWx1ZSksIChwUGxhbmVJblswXS51X2hlaWdodCkgPj4gNCk7Ci0gICAgICAgIE00T1NBX3JhbmQoKE00T1NBX0ludDMyICopJihwX0ZpZnRpZXNEYXRhLT5zdHJpcGVSYW5kb21WYWx1ZSksIChwUGxhbmVJblswXS51X3dpZHRoKTw8IDIpOwotICAgICAgICBwX0ZpZnRpZXNEYXRhLT5wcmV2aW91c0NsaXBUaW1lID0gcFByb2dyZXNzLT51aU91dHB1dFRpbWU7Ci0gICAgfQotCi0gICAgLyogUHV0IGluIFNlcGlhIHRoZSBjaHJvbWluYW5jZSAqLwotICAgIGZvciAocGxhbmVfbnVtYmVyID0gMTsgcGxhbmVfbnVtYmVyIDwgMzsgcGxhbmVfbnVtYmVyKyspCi0gICAgewotICAgICAgICBwSW5DciAgPSBwUGxhbmVJbltwbGFuZV9udW1iZXJdLnBhY19kYXRhICArIHBQbGFuZUluW3BsYW5lX251bWJlcl0udV90b3BsZWZ0OwotICAgICAgICBwT3V0Q3IgPSBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS5wYWNfZGF0YSArIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfdG9wbGVmdDsKLQotICAgICAgICBmb3IgKHggPSAwOyB4IDwgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9oZWlnaHQ7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKDEgPT0gcGxhbmVfbnVtYmVyKQotICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBPdXRDciwgMTE3LHBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7IC8qIFUgdmFsdWUgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwT3V0Q3IsIDEzOSxwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOyAvKiBWIHZhbHVlICovCi0KLSAgICAgICAgICAgIHBJbkNyICArPSBwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfc3RyaWRlOwotICAgICAgICAgICAgcE91dENyICs9IHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfc3RyaWRlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQ29tcHV0ZSB0aGUgbmV3IHBpeGVscyB2YWx1ZXMgKi8KLSAgICBmb3IoIHggPSAwIDsgeCA8IHBQbGFuZUluWzBdLnVfaGVpZ2h0IDsgeCsrKQotICAgIHsKLSAgICAgICAgTTRWSUZJX1VJbnQ4ICpwX291dFl0bXAsICpwX2luWXRtcDsKLQotICAgICAgICAvKiBDb21wdXRlIHRoZSB4U2hpZnQgKHJhbmRvbSB2YWx1ZSkgKi8KLSAgICAgICAgaWYgKDAgPT0gKHBfRmlmdGllc0RhdGEtPnNoaWZ0UmFuZG9tVmFsdWUgJSA1ICkpCi0gICAgICAgICAgICB4U2hpZnQgPSAoeCArIHBfRmlmdGllc0RhdGEtPnNoaWZ0UmFuZG9tVmFsdWUgKSAlIChwUGxhbmVJblswXS51X2hlaWdodCAtIDEpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB4U2hpZnQgPSAoeCArIChwUGxhbmVJblswXS51X2hlaWdodCAtIHBfRmlmdGllc0RhdGEtPnNoaWZ0UmFuZG9tVmFsdWUpICkgXAotICAgICAgICAgICAgICAgICUgKHBQbGFuZUluWzBdLnVfaGVpZ2h0IC0gMSk7Ci0KLSAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgcG9pbnRlcnMgKi8KLSAgICAgICAgcF9vdXRZdG1wID0gcE91dFkgKyAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHlTaGlmdCBvZiAxIHBpeGVsICovCi0gICAgICAgIHBfaW5ZdG1wICA9IHBJblliZWdpbiArICh4U2hpZnQgKiBwUGxhbmVJblswXS51X3N0cmlkZSk7ICAvKiBBcHBseSB0aGUgeFNoaWZ0ICovCi0KLSAgICAgICAgZm9yKCB5ID0gMCA7IHkgPCBwUGxhbmVJblswXS51X3dpZHRoIDsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBTZXQgWSB2YWx1ZSAqLwotICAgICAgICAgICAgaWYgKHhTaGlmdCA+IChwUGxhbmVJblswXS51X2hlaWdodCAtIDQpKQotICAgICAgICAgICAgICAgICpwX291dFl0bXAgPSA0MDsgICAgICAgIC8qIEFkZCBzb21lIGhvcml6b250YWwgYmxhY2sgbGluZXMgYmV0d2VlbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0d28gcGFydHMgb2YgdGhlIGltYWdlICovCi0gICAgICAgICAgICBlbHNlIGlmICggeSA9PSBwX0ZpZnRpZXNEYXRhLT5zdHJpcGVSYW5kb21WYWx1ZSkKLSAgICAgICAgICAgICAgICAqcF9vdXRZdG1wID0gOTA7ICAgICAgICAvKiBBZGQgYSByYW5kb20gdmVydGljYWwgbGluZSBmb3IgdGhlIGJ1bGsgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAqcF9vdXRZdG1wID0gKnBfaW5ZdG1wOwotCi0KLSAgICAgICAgICAgIC8qIEdvIHRvIHRoZSBuZXh0IHBpeGVsICovCi0gICAgICAgICAgICBwX291dFl0bXArKzsKLSAgICAgICAgICAgIHBfaW5ZdG1wKys7Ci0KLSAgICAgICAgICAgIC8qIFJlc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSBmb3IgdGhlIGxhc3QgcGl4ZWwqLwotICAgICAgICAgICAgaWYgKHkgPT0gKHBQbGFuZUluWzBdLnVfd2lkdGggLSAyKSkKLSAgICAgICAgICAgICAgICBwX291dFl0bXAgPSBwT3V0WTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEdvIHRvIHRoZSBuZXh0IGxpbmUgKi8KLSAgICAgICAgcE91dFkgKz0gcFBsYW5lT3V0WzBdLnVfc3RyaWRlOwotICAgIH0KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Wm9vbSggKQotICogQGJyaWVmICAgIFpvb20gaW4vb3V0IHZpZGVvIGVmZmVjdCBmdW5jdGlvbnMuCi0gKiBAbm90ZSAgICBUaGUgZXh0ZXJuYWwgdmlkZW8gZnVuY3Rpb24gaXMgdXNlZCBvbmx5IGlmIFZpZGVvRWZmZWN0VHlwZSBpcyBzZXQgdG8KLSAqIE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX1pvb21JbiBvciBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9ab29tT3V0LgotICoKLSAqIEBwYXJhbSAgIHBGdW5jdGlvbkNvbnRleHQgICAgKElOKSBUaGUgZnVuY3Rpb24gY29udGV4dCwgcHJldmlvdXNseSBzZXQgYnkgdGhlIGludGVncmF0b3IKLSAqIEBwYXJhbSAgICBwSW5wdXRQbGFuZXMgICAgICAgIChJTikgSW5wdXQgWVVWNDIwIGltYWdlOiBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHRocmVlIHZhbGlkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlIHBsYW5lcyAoWSwgVSBhbmQgVikKLSAqIEBwYXJhbSAgICBwT3V0cHV0UGxhbmVzICAgICAgICAoSU4vT1VUKSBPdXRwdXQgKGZpbHRlcmVkKSBZVVY0MjAgaW1hZ2U6IHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVlIHZhbGlkIGltYWdlIHBsYW5lcyAoWSwgVSBhbmQgVikKLSAqIEBwYXJhbSAgICBwUHJvZ3Jlc3MgICAgICAgICAgICAoSU4pIFNldCBvZiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmlkZW8gdHJhbnNpdGlvbiBwcm9ncmVzcy4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3Rab29tKAotICAgIE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBJbnB1dFBsYW5lcywKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcE91dHB1dFBsYW5lcywKLSAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgIE00T1NBX1VJbnQzMiB1aUVmZmVjdEtpbmQKLSkKLXsKLSAgICBNNE9TQV9VSW50MzIgYm94V2lkdGg7Ci0gICAgTTRPU0FfVUludDMyIGJveEhlaWdodDsKLSAgICBNNE9TQV9VSW50MzIgYm94UG9zWDsKLSAgICBNNE9TQV9VSW50MzIgYm94UG9zWTsKLSAgICBNNE9TQV9VSW50MzIgcmF0aW8gPSAwOwotICAgIC8qICAqIDEuMTg5MjA3IGJldHdlZW4gcmF0aW8gKi8KLSAgICAvKiB6b29tIGJldHdlZW4geDEgYW5kIHgxNiAqLwotICAgIE00T1NBX1VJbnQzMiByYXRpb3RhYlsxN10gPXsxMDI0LDEyMTgsMTQ0OCwxNzIyLDIwNDgsMjQzNSwyODk2LDM0NDQsNDA5Niw0ODcxLDU3OTMsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2ODg5LDgxOTIsOTc0MiwxMTU4NSwxMzc3NywxNjM4NH07Ci0gICAgTTRPU0FfVUludDMyIGlrOwotCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgYm94UGxhbmVbM107Ci0KLSAgICBpZihNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9ab29tT3V0ID09IChNNE9TQV9VSW50MzIpcEZ1bmN0aW9uQ29udGV4dCkKLSAgICB7Ci0gICAgICAgIC8vcmF0aW8gPSAxNiAtICgxNSAqIHBQcm9ncmVzcy0+dWlQcm9ncmVzcykvMTAwMDsKLSAgICAgICAgcmF0aW8gPSAxNiAtIHBQcm9ncmVzcy0+dWlQcm9ncmVzcyAvIDY2IDsKLSAgICB9Ci0gICAgZWxzZSBpZihNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9ab29tSW4gPT0gKE00T1NBX1VJbnQzMilwRnVuY3Rpb25Db250ZXh0KQotICAgIHsKLSAgICAgICAgLy9yYXRpbyA9IDEgKyAoMTUgKiBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MpLzEwMDA7Ci0gICAgICAgIHJhdGlvID0gMSArIHBQcm9ncmVzcy0+dWlQcm9ncmVzcyAvIDY2IDsKLSAgICB9Ci0KLSAgICBmb3IoaWs9MDtpazwzO2lrKyspewotCi0gICAgICAgIGJveFBsYW5lW2lrXS51X3N0cmlkZSA9IHBJbnB1dFBsYW5lc1tpa10udV9zdHJpZGU7Ci0gICAgICAgIGJveFBsYW5lW2lrXS5wYWNfZGF0YSA9IHBJbnB1dFBsYW5lc1tpa10ucGFjX2RhdGE7Ci0KLSAgICAgICAgYm94SGVpZ2h0ID0gKCBwSW5wdXRQbGFuZXNbaWtdLnVfaGVpZ2h0IDw8IDEwICkgLyByYXRpb3RhYltyYXRpb107Ci0gICAgICAgIGJveFdpZHRoID0gKCBwSW5wdXRQbGFuZXNbaWtdLnVfd2lkdGggPDwgMTAgKSAvIHJhdGlvdGFiW3JhdGlvXTsKLSAgICAgICAgYm94UGxhbmVbaWtdLnVfaGVpZ2h0ID0gKGJveEhlaWdodCkmKH4xKTsKLSAgICAgICAgYm94UGxhbmVbaWtdLnVfd2lkdGggPSAoYm94V2lkdGgpJih+MSk7Ci0KLSAgICAgICAgYm94UG9zWSA9IChwSW5wdXRQbGFuZXNbaWtdLnVfaGVpZ2h0ID4+IDEpIC0gKGJveFBsYW5lW2lrXS51X2hlaWdodCA+PiAxKTsKLSAgICAgICAgYm94UG9zWCA9IChwSW5wdXRQbGFuZXNbaWtdLnVfd2lkdGggPj4gMSkgLSAoYm94UGxhbmVbaWtdLnVfd2lkdGggPj4gMSk7Ci0gICAgICAgIGJveFBsYW5lW2lrXS51X3RvcGxlZnQgPSBib3hQb3NZICogYm94UGxhbmVbaWtdLnVfc3RyaWRlICsgYm94UG9zWDsKLSAgICB9Ci0KLSAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMChNNE9TQV9OVUxMLCAoTTRWSUZJX0ltYWdlUGxhbmUqKSZib3hQbGFuZSwgcE91dHB1dFBsYW5lcyk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gKi8KLSAgICByZXR1cm4oTTROT19FUlJPUik7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19BbHBoYU1hZ2ljKCBNNE9TQV9Wb2lkICp1c2VyRGF0YSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJbjFbM10sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4yWzNdLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVRyYW5zaXRpb25LaW5kKQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGFwcGx5IGEgY29sb3IgZWZmZWN0IG9uIGFuIGlucHV0IFlVVjQyMCBwbGFuYXIgZnJhbWUKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgdXNlckRhdGEgICAgICAgIChJTikgQ29udGFpbnMgYSBwb2ludGVyIG9uIGEgc2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcGFyYW0gICAgUGxhbmVJbjEgICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hciBmcm9tIHZpZGVvIDEKLSAqIEBwYXJhbSAgICBQbGFuZUluMiAgICAgICAgKElOKSBJbnB1dCBZVVY0MjAgcGxhbmFyIGZyb20gdmlkZW8gMgotICogQHBhcmFtICAgIFBsYW5lT3V0ICAgICAgICAoSU4vT1VUKSBPdXRwdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIHBQcm9ncmVzcyAgICAgICAgKElOL09VVCkgUHJvZ3Jlc3MgaW5kaWNhdGlvbiAoMC0xMDApCi0gKiBAcGFyYW0gICAgdWlUcmFuc2l0aW9uS2luZChJTikgVW51c2VkCi0gKgotICogQHJldHVybiAgICBNNFZJRklfT0s6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfQWxwaGFNYWdpYyggTTRPU0FfVm9pZCAqdXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4xWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluMlszXSwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLCBNNE9TQV9VSW50MzIgdWlUcmFuc2l0aW9uS2luZCkKLXsKLQotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzKiBhbHBoYUNvbnRleHQ7Ci0gICAgTTRWSUZJX0ludDMyIGFscGhhUHJvZ3Jlc3NMZXZlbDsKLQotICAgIE00VklGSV9JbWFnZVBsYW5lKiBwbGFuZXN3YXA7Ci0gICAgTTRWSUZJX1VJbnQzMiB4LHk7Ci0KLSAgICBNNFZJRklfVUludDggKnBfb3V0MDsKLSAgICBNNFZJRklfVUludDggKnBfb3V0MTsKLSAgICBNNFZJRklfVUludDggKnBfb3V0MjsKLSAgICBNNFZJRklfVUludDggKmFscGhhTWFzazsKLSAgICAvKiAiT2xkIGltYWdlIiAqLwotICAgIE00VklGSV9VSW50OCAqcF9pbjFfWTsKLSAgICBNNFZJRklfVUludDggKnBfaW4xX1U7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2luMV9WOwotICAgIC8qICJOZXcgaW1hZ2UiICovCi0gICAgTTRWSUZJX1VJbnQ4ICpwX2luMl9ZOwotICAgIE00VklGSV9VSW50OCAqcF9pbjJfVTsKLSAgICBNNFZJRklfVUludDggKnBfaW4yX1Y7Ci0KLSAgICBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgYWxwaGFDb250ZXh0ID0gKE00eFZTU19pbnRlcm5hbF9BbHBoYU1hZ2ljU2V0dGluZ3MqKXVzZXJEYXRhOwotCi0gICAgYWxwaGFQcm9ncmVzc0xldmVsID0gKHBQcm9ncmVzcy0+dWlQcm9ncmVzcyAqIDEyOCkvMTAwMDsKLQotICAgIGlmKCBhbHBoYUNvbnRleHQtPmlzcmV2ZXJzZSAhPSBNNE9TQV9GQUxTRSkKLSAgICB7Ci0gICAgICAgIGFscGhhUHJvZ3Jlc3NMZXZlbCA9IDEyOCAtIGFscGhhUHJvZ3Jlc3NMZXZlbDsKLSAgICAgICAgcGxhbmVzd2FwID0gUGxhbmVJbjE7Ci0gICAgICAgIFBsYW5lSW4xID0gUGxhbmVJbjI7Ci0gICAgICAgIFBsYW5lSW4yID0gcGxhbmVzd2FwOwotICAgIH0KLQotICAgIHBfb3V0MCA9IFBsYW5lT3V0WzBdLnBhY19kYXRhOwotICAgIHBfb3V0MSA9IFBsYW5lT3V0WzFdLnBhY19kYXRhOwotICAgIHBfb3V0MiA9IFBsYW5lT3V0WzJdLnBhY19kYXRhOwotCi0gICAgYWxwaGFNYXNrID0gYWxwaGFDb250ZXh0LT5wUGxhbmUtPnBhY19kYXRhOwotCi0gICAgLyogIk9sZCBpbWFnZSIgKi8KLSAgICBwX2luMV9ZID0gUGxhbmVJbjFbMF0ucGFjX2RhdGE7Ci0gICAgcF9pbjFfVSA9IFBsYW5lSW4xWzFdLnBhY19kYXRhOwotICAgIHBfaW4xX1YgPSBQbGFuZUluMVsyXS5wYWNfZGF0YTsKLSAgICAvKiAiTmV3IGltYWdlIiAqLwotICAgIHBfaW4yX1kgPSBQbGFuZUluMlswXS5wYWNfZGF0YTsKLSAgICBwX2luMl9VID0gUGxhbmVJbjJbMV0ucGFjX2RhdGE7Ci0gICAgcF9pbjJfViA9IFBsYW5lSW4yWzJdLnBhY19kYXRhOwotCi0gICAgIC8qKgotICAgICAqIEZvciBlYWNoIGNvbHVtbiAuLi4gKi8KLSAgICBmb3IoIHk9MDsgeTxQbGFuZU91dC0+dV9oZWlnaHQ7IHkrKyApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogLi4uIGFuZCBlYWNoIHJvdyBvZiB0aGUgYWxwaGEgbWFzayAqLwotICAgICAgICBmb3IoIHg9MDsgeDxQbGFuZU91dC0+dV93aWR0aDsgeCsrICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBJZiB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgcGl4ZWwgb2YgdGhlIGFscGhhIG1hc2sgaXMgPiB0byB0aGUgY3VycmVudCB0aW1lCi0gICAgICAgICAgICAgKiAoIGN1cnJlbnQgdGltZSBpcyBub3JtYWxpemVkIG9uIFswLTI1NV0gKSAqLwotICAgICAgICAgICAgaWYoIGFscGhhUHJvZ3Jlc3NMZXZlbCA8IGFscGhhTWFza1t4K3kqUGxhbmVPdXQtPnVfd2lkdGhdICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBXZSBrZWVwICJvbGQgaW1hZ2UiIGluIG91dHB1dCBwbGFuZSAqLwotICAgICAgICAgICAgICAgICooIHBfb3V0MCt4K3kqUGxhbmVPdXRbMF0udV9zdHJpZGUpPSoocF9pbjFfWSt4K3kqUGxhbmVJbjFbMF0udV9zdHJpZGUpOwotICAgICAgICAgICAgICAgICooIHBfb3V0MSsoeD4+MSkrKHk+PjEpKlBsYW5lT3V0WzFdLnVfc3RyaWRlKT0KLSAgICAgICAgICAgICAgICAgICAgKihwX2luMV9VKyh4Pj4xKSsoeT4+MSkqUGxhbmVJbjFbMV0udV9zdHJpZGUpOwotICAgICAgICAgICAgICAgICooIHBfb3V0MisoeD4+MSkrKHk+PjEpKlBsYW5lT3V0WzJdLnVfc3RyaWRlKT0KLSAgICAgICAgICAgICAgICAgICAgKihwX2luMV9WKyh4Pj4xKSsoeT4+MSkqUGxhbmVJbjFbMl0udV9zdHJpZGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFdlIHRha2UgIm5ldyBpbWFnZSIgaW4gb3V0cHV0IHBsYW5lICovCi0gICAgICAgICAgICAgICAgKiggcF9vdXQwK3greSpQbGFuZU91dFswXS51X3N0cmlkZSk9KihwX2luMl9ZK3greSpQbGFuZUluMlswXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgKiggcF9vdXQxKyh4Pj4xKSsoeT4+MSkqUGxhbmVPdXRbMV0udV9zdHJpZGUpPQotICAgICAgICAgICAgICAgICAgICAqKHBfaW4yX1UrKHg+PjEpKyh5Pj4xKSpQbGFuZUluMlsxXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgKiggcF9vdXQyKyh4Pj4xKSsoeT4+MSkqUGxhbmVPdXRbMl0udV9zdHJpZGUpPQotICAgICAgICAgICAgICAgICAgICAqKHBfaW4yX1YrKHg+PjEpKyh5Pj4xKSpQbGFuZUluMlsyXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4oZXJyKTsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTR4VlNTX0FscGhhTWFnaWNCbGVuZGluZyggTTRPU0FfVm9pZCAqdXNlckRhdGEsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4xWzNdLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluMlszXSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlUcmFuc2l0aW9uS2luZCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBhcHBseSBhIGNvbG9yIGVmZmVjdCBvbiBhbiBpbnB1dCBZVVY0MjAgcGxhbmFyIGZyYW1lCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHVzZXJEYXRhICAgICAgICAoSU4pIENvbnRhaW5zIGEgcG9pbnRlciBvbiBhIHNldHRpbmdzIHN0cnVjdHVyZQotICogQHBhcmFtICAgIFBsYW5lSW4xICAgICAgICAoSU4pIElucHV0IFlVVjQyMCBwbGFuYXIgZnJvbSB2aWRlbyAxCi0gKiBAcGFyYW0gICAgUGxhbmVJbjIgICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hciBmcm9tIHZpZGVvIDIKLSAqIEBwYXJhbSAgICBQbGFuZU91dCAgICAgICAgKElOL09VVCkgT3V0cHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBwUHJvZ3Jlc3MgICAgICAgIChJTi9PVVQpIFByb2dyZXNzIGluZGljYXRpb24gKDAtMTAwKQotICogQHBhcmFtICAgIHVpVHJhbnNpdGlvbktpbmQoSU4pIFVudXNlZAotICoKLSAqIEByZXR1cm4gICAgTTRWSUZJX09LOiAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX0FscGhhTWFnaWNCbGVuZGluZyggTTRPU0FfVm9pZCAqdXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4xWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4yWzNdLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlUcmFuc2l0aW9uS2luZCkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncyogYWxwaGFDb250ZXh0OwotICAgIE00VklGSV9JbnQzMiBhbHBoYVByb2dyZXNzTGV2ZWw7Ci0gICAgTTRWSUZJX0ludDMyIGFscGhhQmxlbmRMZXZlbE1pbjsKLSAgICBNNFZJRklfSW50MzIgYWxwaGFCbGVuZExldmVsTWF4OwotICAgIE00VklGSV9JbnQzMiBhbHBoYUJsZW5kUmFuZ2U7Ci0KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSogcGxhbmVzd2FwOwotICAgIE00VklGSV9VSW50MzIgeCx5OwotICAgIE00VklGSV9JbnQzMiBhbHBoYU1hc2tWYWx1ZTsKLQotICAgIE00VklGSV9VSW50OCAqcF9vdXQwOwotICAgIE00VklGSV9VSW50OCAqcF9vdXQxOwotICAgIE00VklGSV9VSW50OCAqcF9vdXQyOwotICAgIE00VklGSV9VSW50OCAqYWxwaGFNYXNrOwotICAgIC8qICJPbGQgaW1hZ2UiICovCi0gICAgTTRWSUZJX1VJbnQ4ICpwX2luMV9ZOwotICAgIE00VklGSV9VSW50OCAqcF9pbjFfVTsKLSAgICBNNFZJRklfVUludDggKnBfaW4xX1Y7Ci0gICAgLyogIk5ldyBpbWFnZSIgKi8KLSAgICBNNFZJRklfVUludDggKnBfaW4yX1k7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2luMl9VOwotICAgIE00VklGSV9VSW50OCAqcF9pbjJfVjsKLQotCi0gICAgZXJyID0gTTROT19FUlJPUjsKLQotICAgIGFscGhhQ29udGV4dCA9IChNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzKil1c2VyRGF0YTsKLQotICAgIGFscGhhUHJvZ3Jlc3NMZXZlbCA9IChwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgKiAxMjgpLzEwMDA7Ci0KLSAgICBpZiggYWxwaGFDb250ZXh0LT5pc3JldmVyc2UgIT0gTTRPU0FfRkFMU0UpCi0gICAgewotICAgICAgICBhbHBoYVByb2dyZXNzTGV2ZWwgPSAxMjggLSBhbHBoYVByb2dyZXNzTGV2ZWw7Ci0gICAgICAgIHBsYW5lc3dhcCA9IFBsYW5lSW4xOwotICAgICAgICBQbGFuZUluMSA9IFBsYW5lSW4yOwotICAgICAgICBQbGFuZUluMiA9IHBsYW5lc3dhcDsKLSAgICB9Ci0KLSAgICBhbHBoYUJsZW5kTGV2ZWxNaW4gPSBhbHBoYVByb2dyZXNzTGV2ZWwtYWxwaGFDb250ZXh0LT5ibGVuZGluZ3RocmVzaG9sZDsKLQotICAgIGFscGhhQmxlbmRMZXZlbE1heCA9IGFscGhhUHJvZ3Jlc3NMZXZlbCthbHBoYUNvbnRleHQtPmJsZW5kaW5ndGhyZXNob2xkOwotCi0gICAgYWxwaGFCbGVuZFJhbmdlID0gKGFscGhhQ29udGV4dC0+YmxlbmRpbmd0aHJlc2hvbGQpKjI7Ci0KLSAgICBwX291dDAgPSBQbGFuZU91dFswXS5wYWNfZGF0YTsKLSAgICBwX291dDEgPSBQbGFuZU91dFsxXS5wYWNfZGF0YTsKLSAgICBwX291dDIgPSBQbGFuZU91dFsyXS5wYWNfZGF0YTsKLQotICAgIGFscGhhTWFzayA9IGFscGhhQ29udGV4dC0+cFBsYW5lLT5wYWNfZGF0YTsKLQotICAgIC8qICJPbGQgaW1hZ2UiICovCi0gICAgcF9pbjFfWSA9IFBsYW5lSW4xWzBdLnBhY19kYXRhOwotICAgIHBfaW4xX1UgPSBQbGFuZUluMVsxXS5wYWNfZGF0YTsKLSAgICBwX2luMV9WID0gUGxhbmVJbjFbMl0ucGFjX2RhdGE7Ci0gICAgLyogIk5ldyBpbWFnZSIgKi8KLSAgICBwX2luMl9ZID0gUGxhbmVJbjJbMF0ucGFjX2RhdGE7Ci0gICAgcF9pbjJfVSA9IFBsYW5lSW4yWzFdLnBhY19kYXRhOwotICAgIHBfaW4yX1YgPSBQbGFuZUluMlsyXS5wYWNfZGF0YTsKLQotICAgIC8qIGFwcGx5IEFscGhhIE1hZ2ljIG9uIGVhY2ggcGl4ZWwgKi8KLSAgICAgICBmb3IoIHk9MDsgeTxQbGFuZU91dC0+dV9oZWlnaHQ7IHkrKyApCi0gICAgewotICAgICAgICBmb3IoIHg9MDsgeDxQbGFuZU91dC0+dV93aWR0aDsgeCsrICkKLSAgICAgICAgewotICAgICAgICAgICAgYWxwaGFNYXNrVmFsdWUgPSBhbHBoYU1hc2tbeCt5KlBsYW5lT3V0LT51X3dpZHRoXTsKLSAgICAgICAgICAgIGlmKCBhbHBoYUJsZW5kTGV2ZWxNYXggPCBhbHBoYU1hc2tWYWx1ZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogV2Uga2VlcCAib2xkIGltYWdlIiBpbiBvdXRwdXQgcGxhbmUgKi8KLSAgICAgICAgICAgICAgICAqKCBwX291dDAreCt5KlBsYW5lT3V0WzBdLnVfc3RyaWRlKT0qKHBfaW4xX1kreCt5KlBsYW5lSW4xWzBdLnVfc3RyaWRlKTsKLSAgICAgICAgICAgICAgICAqKCBwX291dDErKHg+PjEpKyh5Pj4xKSpQbGFuZU91dFsxXS51X3N0cmlkZSk9Ci0gICAgICAgICAgICAgICAgICAgICoocF9pbjFfVSsoeD4+MSkrKHk+PjEpKlBsYW5lSW4xWzFdLnVfc3RyaWRlKTsKLSAgICAgICAgICAgICAgICAqKCBwX291dDIrKHg+PjEpKyh5Pj4xKSpQbGFuZU91dFsyXS51X3N0cmlkZSk9Ci0gICAgICAgICAgICAgICAgICAgICoocF9pbjFfVisoeD4+MSkrKHk+PjEpKlBsYW5lSW4xWzJdLnVfc3RyaWRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIChhbHBoYUJsZW5kTGV2ZWxNaW4gPCBhbHBoYU1hc2tWYWx1ZSkmJgotICAgICAgICAgICAgICAgICAgICAoYWxwaGFNYXNrVmFsdWUgPD0gYWxwaGFCbGVuZExldmVsTWF4ICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFdlIGJsZW5kICJvbGQgYW5kIG5ldyBpbWFnZSIgaW4gb3V0cHV0IHBsYW5lICovCi0gICAgICAgICAgICAgICAgKiggcF9vdXQwK3greSpQbGFuZU91dFswXS51X3N0cmlkZSk9KE00VklGSV9VSW50OCkKLSAgICAgICAgICAgICAgICAgICAgKCggKGFscGhhTWFza1ZhbHVlLWFscGhhQmxlbmRMZXZlbE1pbikqKCAqKHBfaW4xX1kreCt5KlBsYW5lSW4xWzBdLnVfc3RyaWRlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICsoYWxwaGFCbGVuZExldmVsTWF4LWFscGhhTWFza1ZhbHVlKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKCAqKHBfaW4yX1kreCt5KlBsYW5lSW4yWzBdLnVfc3RyaWRlKSkgKS9hbHBoYUJsZW5kUmFuZ2UgKTsKLQotICAgICAgICAgICAgICAgICooIHBfb3V0MSsoeD4+MSkrKHk+PjEpKlBsYW5lT3V0WzFdLnVfc3RyaWRlKT0oTTRWSUZJX1VJbnQ4KVwKLSAgICAgICAgICAgICAgICAgICAgKCggKGFscGhhTWFza1ZhbHVlLWFscGhhQmxlbmRMZXZlbE1pbikqKCAqKHBfaW4xX1UrKHg+PjEpKyh5Pj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICpQbGFuZUluMVsxXS51X3N0cmlkZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyhhbHBoYUJsZW5kTGV2ZWxNYXgtYWxwaGFNYXNrVmFsdWUpKiggKihwX2luMl9VKyh4Pj4xKSsoeT4+MSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpQbGFuZUluMlsxXS51X3N0cmlkZSkpICkvYWxwaGFCbGVuZFJhbmdlICk7Ci0KLSAgICAgICAgICAgICAgICAqKCBwX291dDIrKHg+PjEpKyh5Pj4xKSpQbGFuZU91dFsyXS51X3N0cmlkZSk9Ci0gICAgICAgICAgICAgICAgICAgIChNNFZJRklfVUludDgpKCggKGFscGhhTWFza1ZhbHVlLWFscGhhQmxlbmRMZXZlbE1pbilcCi0gICAgICAgICAgICAgICAgICAgICAgICAqKCAqKHBfaW4xX1YrKHg+PjEpKyh5Pj4xKSpQbGFuZUluMVsyXS51X3N0cmlkZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsoYWxwaGFCbGVuZExldmVsTWF4LWFscGhhTWFza1ZhbHVlKSooICoocF9pbjJfVisoeD4+MSkrKHk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlBsYW5lSW4yWzJdLnVfc3RyaWRlKSkgKS9hbHBoYUJsZW5kUmFuZ2UgKTsKLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFdlIHRha2UgIm5ldyBpbWFnZSIgaW4gb3V0cHV0IHBsYW5lICovCi0gICAgICAgICAgICAgICAgKiggcF9vdXQwK3greSpQbGFuZU91dFswXS51X3N0cmlkZSk9KihwX2luMl9ZK3greSpQbGFuZUluMlswXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgKiggcF9vdXQxKyh4Pj4xKSsoeT4+MSkqUGxhbmVPdXRbMV0udV9zdHJpZGUpPQotICAgICAgICAgICAgICAgICAgICAqKHBfaW4yX1UrKHg+PjEpKyh5Pj4xKSpQbGFuZUluMlsxXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgKiggcF9vdXQyKyh4Pj4xKSsoeT4+MSkqUGxhbmVPdXRbMl0udV9zdHJpZGUpPQotICAgICAgICAgICAgICAgICAgICAqKHBfaW4yX1YrKHg+PjEpKyh5Pj4xKSpQbGFuZUluMlsyXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4oZXJyKTsKLX0KLQotI2RlZmluZSBNNFhYWF9TYW1wbGVBZGRyZXNzKHBsYW5lLCB4LCB5KSAgKCAocGxhbmUpLnBhY19kYXRhICsgKHBsYW5lKS51X3RvcGxlZnQgKyAoeSlcCi0gICAgICogKHBsYW5lKS51X3N0cmlkZSArICh4KSApCi0KLXN0YXRpYyB2b2lkIE00WFhYX0NvcHlQbGFuZShNNFZJRklfSW1hZ2VQbGFuZSogZGVzdCwgTTRWSUZJX0ltYWdlUGxhbmUqIHNvdXJjZSkKLXsKLSAgICBNNE9TQV9VSW50MzIgICAgaGVpZ2h0LCB3aWR0aCwgc291cmNlU3RyaWRlLCBkZXN0U3RyaWRlLCB5OwotICAgIE00T1NBX01lbUFkZHI4ICAgIHNvdXJjZVdhbGssIGRlc3RXYWxrOwotCi0gICAgLyogY2FjaGUgdGhlIHZhcnMgdXNlZCBpbiB0aGUgbG9vcCBzbyBhcyB0byBhdm9pZCB0aGVtIGJlaW5nIHJlcGVhdGVkbHkgZmV0Y2hlZCBhbmQKLSAgICAgcmVjb21wdXRlZCBmcm9tIG1lbW9yeS4gKi8KLSAgICBoZWlnaHQgPSBkZXN0LT51X2hlaWdodDsKLSAgICB3aWR0aCA9IGRlc3QtPnVfd2lkdGg7Ci0KLSAgICBzb3VyY2VXYWxrID0gKE00T1NBX01lbUFkZHI4KU00WFhYX1NhbXBsZUFkZHJlc3MoKnNvdXJjZSwgMCwgMCk7Ci0gICAgc291cmNlU3RyaWRlID0gc291cmNlLT51X3N0cmlkZTsKLQotICAgIGRlc3RXYWxrID0gKE00T1NBX01lbUFkZHI4KU00WFhYX1NhbXBsZUFkZHJlc3MoKmRlc3QsIDAsIDApOwotICAgIGRlc3RTdHJpZGUgPSBkZXN0LT51X3N0cmlkZTsKLQotICAgIGZvciAoeT0wOyB5PGhlaWdodDsgeSsrKQotICAgIHsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopZGVzdFdhbGssICh2b2lkICopc291cmNlV2Fsaywgd2lkdGgpOwotICAgICAgICBkZXN0V2FsayArPSBkZXN0U3RyaWRlOwotICAgICAgICBzb3VyY2VXYWxrICs9IHNvdXJjZVN0cmlkZTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBNNE9TQV9FUlIgTTR4VlNTX1ZlcnRpY2FsU2xpZGVUcmFuc2l0aW9uKE00VklGSV9JbWFnZVBsYW5lKiB0b3BQbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBib3R0b21QbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiAgICBzaGlmdFVWKQotewotICAgIE00T1NBX1VJbnQzMiBpOwotCi0gICAgLyogRG8gdGhyZWUgbG9vcHMsIG9uZSBmb3IgZWFjaCBwbGFuZSB0eXBlLCBpbiBvcmRlciB0byBhdm9pZCBoYXZpbmcgdG9vIG1hbnkgYnVmZmVycwotICAgICJob3QiIGF0IHRoZSBzYW1lIHRpbWUgKGJldHRlciBmb3IgY2FjaGUpLiAqLwotICAgIGZvciAoaT0wOyBpPDM7IGkrKykKLSAgICB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiAgICB0b3BQYXJ0SGVpZ2h0LCBib3R0b21QYXJ0SGVpZ2h0LCB3aWR0aCwgc291cmNlU3RyaWRlLCBkZXN0U3RyaWRlLCB5OwotICAgICAgICBNNE9TQV9NZW1BZGRyOCAgICBzb3VyY2VXYWxrLCBkZXN0V2FsazsKLQotICAgICAgICAvKiBjYWNoZSB0aGUgdmFycyB1c2VkIGluIHRoZSBsb29wIHNvIGFzIHRvIGF2b2lkIHRoZW0gYmVpbmcgcmVwZWF0ZWRseSBmZXRjaGVkIGFuZAotICAgICAgICAgcmVjb21wdXRlZCBmcm9tIG1lbW9yeS4gKi8KLSAgICAgICAgaWYgKDAgPT0gaSkgLyogWSBwbGFuZSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBib3R0b21QYXJ0SGVpZ2h0ID0gMipzaGlmdFVWOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLyogVSBhbmQgViBwbGFuZXMgKi8KLSAgICAgICAgewotICAgICAgICAgICAgYm90dG9tUGFydEhlaWdodCA9IHNoaWZ0VVY7Ci0gICAgICAgIH0KLSAgICAgICAgdG9wUGFydEhlaWdodCA9IFBsYW5lT3V0W2ldLnVfaGVpZ2h0IC0gYm90dG9tUGFydEhlaWdodDsKLSAgICAgICAgd2lkdGggPSBQbGFuZU91dFtpXS51X3dpZHRoOwotCi0gICAgICAgIHNvdXJjZVdhbGsgPSAoTTRPU0FfTWVtQWRkcjgpTTRYWFhfU2FtcGxlQWRkcmVzcyh0b3BQbGFuZVtpXSwgMCwgYm90dG9tUGFydEhlaWdodCk7Ci0gICAgICAgIHNvdXJjZVN0cmlkZSA9IHRvcFBsYW5lW2ldLnVfc3RyaWRlOwotCi0gICAgICAgIGRlc3RXYWxrID0gKE00T1NBX01lbUFkZHI4KU00WFhYX1NhbXBsZUFkZHJlc3MoUGxhbmVPdXRbaV0sIDAsIDApOwotICAgICAgICBkZXN0U3RyaWRlID0gUGxhbmVPdXRbaV0udV9zdHJpZGU7Ci0KLSAgICAgICAgLyogRmlyc3QgdGhlIHBhcnQgZnJvbSB0aGUgdG9wIHNvdXJjZSBjbGlwIGZyYW1lLiAqLwotICAgICAgICBmb3IgKHk9MDsgeTx0b3BQYXJ0SGVpZ2h0OyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKWRlc3RXYWxrLCAodm9pZCAqKXNvdXJjZVdhbGssIHdpZHRoKTsKLSAgICAgICAgICAgIGRlc3RXYWxrICs9IGRlc3RTdHJpZGU7Ci0gICAgICAgICAgICBzb3VyY2VXYWxrICs9IHNvdXJjZVN0cmlkZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGFuZCBub3cgY2hhbmdlIHRoZSB2YXJzIHRvIGNvcHkgdGhlIHBhcnQgZnJvbSB0aGUgYm90dG9tIHNvdXJjZSBjbGlwIGZyYW1lLiAqLwotICAgICAgICBzb3VyY2VXYWxrID0gKE00T1NBX01lbUFkZHI4KU00WFhYX1NhbXBsZUFkZHJlc3MoYm90dG9tUGxhbmVbaV0sIDAsIDApOwotICAgICAgICBzb3VyY2VTdHJpZGUgPSBib3R0b21QbGFuZVtpXS51X3N0cmlkZTsKLQotICAgICAgICAvKiBkZXN0V2FsayBpcyBhbHJlYWR5IGF0IE00WFhYX1NhbXBsZUFkZHJlc3MoUGxhbmVPdXRbaV0sIDAsIHRvcFBhcnRIZWlnaHQpICovCi0KLSAgICAgICAgZm9yICh5PTA7IHk8Ym90dG9tUGFydEhlaWdodDsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilkZXN0V2FsaywgKHZvaWQgKilzb3VyY2VXYWxrLCB3aWR0aCk7Ci0gICAgICAgICAgICBkZXN0V2FsayArPSBkZXN0U3RyaWRlOwotICAgICAgICAgICAgc291cmNlV2FsayArPSBzb3VyY2VTdHJpZGU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLXN0YXRpYyBNNE9TQV9FUlIgTTR4VlNTX0hvcml6b250YWxTbGlkZVRyYW5zaXRpb24oTTRWSUZJX0ltYWdlUGxhbmUqIGxlZnRQbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHJpZ2h0UGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyICAgIHNoaWZ0VVYpCi17Ci0gICAgTTRPU0FfVUludDMyIGksIHk7Ci0gICAgLyogSWYgd2Ugc2hpZnRlZCBieSBleGFjdGx5IDAsIG9yIGJ5IHRoZSB3aWR0aCBvZiB0aGUgdGFyZ2V0IGltYWdlLCB0aGVuIHdlIHdvdWxkIGdldCB0aGUgbGVmdAotICAgIGZyYW1lIG9yIHRoZSByaWdodCBmcmFtZSwgcmVzcGVjdGl2ZWx5LiBUaGVzZSBjYXNlcyBhcmVuJ3QgaGFuZGxlZCB0b28gd2VsbCBieSB0aGUgZ2VuZXJhbAotICAgIGhhbmRsaW5nLCBzaW5jZSB0aGV5IHJlc3VsdCBpbiAwLXNpemUgbWVtY29waWVzLCBzbyBtaWdodCBhcyB3ZWxsIHBhcnRpY3VsYXJpemUgdGhlbS4gKi8KLQotICAgIGlmICgwID09IHNoaWZ0VVYpICAgIC8qIG91dHB1dCBsZWZ0IGZyYW1lICovCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwOyBpPDM7IGkrKykgLyogZm9yIGVhY2ggWVVWIHBsYW5lICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00WFhYX0NvcHlQbGFuZSgmKFBsYW5lT3V0W2ldKSwgJihsZWZ0UGxhbmVbaV0pKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgIGlmIChQbGFuZU91dFsxXS51X3dpZHRoID09IHNoaWZ0VVYpIC8qIG91dHB1dCByaWdodCBmcmFtZSAqLwotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaTwzOyBpKyspIC8qIGZvciBlYWNoIFlVViBwbGFuZSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBNNFhYWF9Db3B5UGxhbmUoJihQbGFuZU91dFtpXSksICYocmlnaHRQbGFuZVtpXSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotCi0KLSAgICAvKiBEbyB0aHJlZSBsb29wcywgb25lIGZvciBlYWNoIHBsYW5lIHR5cGUsIGluIG9yZGVyIHRvIGF2b2lkIGhhdmluZyB0b28gbWFueSBidWZmZXJzCi0gICAgImhvdCIgYXQgdGhlIHNhbWUgdGltZSAoYmV0dGVyIGZvciBjYWNoZSkuICovCi0gICAgZm9yIChpPTA7IGk8MzsgaSsrKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyICAgIGhlaWdodCwgbGVmdFBhcnRXaWR0aCwgcmlnaHRQYXJ0V2lkdGg7Ci0gICAgICAgIE00T1NBX1VJbnQzMiAgICBsZWZ0U3RyaWRlLCAgICByaWdodFN0cmlkZSwgICAgZGVzdFN0cmlkZTsKLSAgICAgICAgTTRPU0FfTWVtQWRkcjggICAgbGVmdFdhbGssICAgIHJpZ2h0V2FsaywgICAgZGVzdFdhbGtMZWZ0LCBkZXN0V2Fsa1JpZ2h0OwotCi0gICAgICAgIC8qIGNhY2hlIHRoZSB2YXJzIHVzZWQgaW4gdGhlIGxvb3Agc28gYXMgdG8gYXZvaWQgdGhlbSBiZWluZyByZXBlYXRlZGx5IGZldGNoZWQKLSAgICAgICAgYW5kIHJlY29tcHV0ZWQgZnJvbSBtZW1vcnkuICovCi0gICAgICAgIGhlaWdodCA9IFBsYW5lT3V0W2ldLnVfaGVpZ2h0OwotCi0gICAgICAgIGlmICgwID09IGkpIC8qIFkgcGxhbmUgKi8KLSAgICAgICAgewotICAgICAgICAgICAgcmlnaHRQYXJ0V2lkdGggPSAyKnNoaWZ0VVY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAvKiBVIGFuZCBWIHBsYW5lcyAqLwotICAgICAgICB7Ci0gICAgICAgICAgICByaWdodFBhcnRXaWR0aCA9IHNoaWZ0VVY7Ci0gICAgICAgIH0KLSAgICAgICAgbGVmdFBhcnRXaWR0aCA9IFBsYW5lT3V0W2ldLnVfd2lkdGggLSByaWdodFBhcnRXaWR0aDsKLQotICAgICAgICBsZWZ0V2FsayA9IChNNE9TQV9NZW1BZGRyOClNNFhYWF9TYW1wbGVBZGRyZXNzKGxlZnRQbGFuZVtpXSwgcmlnaHRQYXJ0V2lkdGgsIDApOwotICAgICAgICBsZWZ0U3RyaWRlID0gbGVmdFBsYW5lW2ldLnVfc3RyaWRlOwotCi0gICAgICAgIHJpZ2h0V2FsayA9IChNNE9TQV9NZW1BZGRyOClNNFhYWF9TYW1wbGVBZGRyZXNzKHJpZ2h0UGxhbmVbaV0sIDAsIDApOwotICAgICAgICByaWdodFN0cmlkZSA9IHJpZ2h0UGxhbmVbaV0udV9zdHJpZGU7Ci0KLSAgICAgICAgZGVzdFdhbGtMZWZ0ID0gKE00T1NBX01lbUFkZHI4KU00WFhYX1NhbXBsZUFkZHJlc3MoUGxhbmVPdXRbaV0sIDAsIDApOwotICAgICAgICBkZXN0V2Fsa1JpZ2h0ID0gKE00T1NBX01lbUFkZHI4KU00WFhYX1NhbXBsZUFkZHJlc3MoUGxhbmVPdXRbaV0sIGxlZnRQYXJ0V2lkdGgsIDApOwotICAgICAgICBkZXN0U3RyaWRlID0gUGxhbmVPdXRbaV0udV9zdHJpZGU7Ci0KLSAgICAgICAgZm9yICh5PTA7IHk8aGVpZ2h0OyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKWRlc3RXYWxrTGVmdCwgKHZvaWQgKilsZWZ0V2FsaywgbGVmdFBhcnRXaWR0aCk7Ci0gICAgICAgICAgICBsZWZ0V2FsayArPSBsZWZ0U3RyaWRlOwotCi0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilkZXN0V2Fsa1JpZ2h0LCAodm9pZCAqKXJpZ2h0V2FsaywgcmlnaHRQYXJ0V2lkdGgpOwotICAgICAgICAgICAgcmlnaHRXYWxrICs9IHJpZ2h0U3RyaWRlOwotCi0gICAgICAgICAgICBkZXN0V2Fsa0xlZnQgKz0gZGVzdFN0cmlkZTsKLSAgICAgICAgICAgIGRlc3RXYWxrUmlnaHQgKz0gZGVzdFN0cmlkZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLU00T1NBX0VSUiBNNHhWU1NfU2xpZGVUcmFuc2l0aW9uKCBNNE9TQV9Wb2lkICp1c2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJbjFbM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJbjJbM10sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVRyYW5zaXRpb25LaW5kKQotewotICAgIE00eFZTU19pbnRlcm5hbF9TbGlkZVRyYW5zaXRpb25TZXR0aW5ncyogc2V0dGluZ3MgPQotICAgICAgICAgKE00eFZTU19pbnRlcm5hbF9TbGlkZVRyYW5zaXRpb25TZXR0aW5ncyopdXNlckRhdGE7Ci0gICAgTTRPU0FfVUludDMyICAgIHNoaWZ0VVY7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMCgiaW5zaWRlIE00eFZTU19TbGlkZVRyYW5zaXRpb24iKTsKLSAgICBpZiAoKE00eFZTU19TbGlkZVRyYW5zaXRpb25fUmlnaHRPdXRMZWZ0SW4gPT0gc2V0dGluZ3MtPmRpcmVjdGlvbikKLSAgICAgICAgfHwgKE00eFZTU19TbGlkZVRyYW5zaXRpb25fTGVmdE91dFJpZ2h0SW4gPT0gc2V0dGluZ3MtPmRpcmVjdGlvbikgKQotICAgIHsKLSAgICAgICAgLyogaG9yaXpvbnRhbCBzbGlkZSAqLwotICAgICAgICBzaGlmdFVWID0gKChQbGFuZU91dFsxXSkudV93aWR0aCAqIHBQcm9ncmVzcy0+dWlQcm9ncmVzcykvMTAwMDsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19TbGlkZVRyYW5zaXRpb24gdXBwZXI6IHNoaWZ0VVYgPSAlZCxwcm9ncmVzcyA9ICVkIiwKLSAgICAgICAgICAgIHNoaWZ0VVYscFByb2dyZXNzLT51aVByb2dyZXNzICk7Ci0gICAgICAgIGlmIChNNHhWU1NfU2xpZGVUcmFuc2l0aW9uX1JpZ2h0T3V0TGVmdEluID09IHNldHRpbmdzLT5kaXJlY3Rpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFB1dCB0aGUgcHJldmlvdXMgY2xpcCBmcmFtZSByaWdodCwgdGhlIG5leHQgY2xpcCBmcmFtZSBsZWZ0LCBhbmQgcmV2ZXJzZSBzaGlmdFVWCi0gICAgICAgICAgICAoc2luY2UgaXQncyBhIHNoaWZ0IGZyb20gdGhlIGxlZnQgZnJhbWUpIHNvIHRoYXQgd2Ugc3RhcnQgb3V0IG9uIHRoZSByaWdodAotICAgICAgICAgICAgKGkuZS4gbm90IGxlZnQpIGZyYW1lLCBpdAotICAgICAgICAgICAgYmVpbmcgZnJvbSB0aGUgcHJldmlvdXMgY2xpcC4gKi8KLSAgICAgICAgICAgIHJldHVybiBNNHhWU1NfSG9yaXpvbnRhbFNsaWRlVHJhbnNpdGlvbihQbGFuZUluMiwgUGxhbmVJbjEsIFBsYW5lT3V0LAotICAgICAgICAgICAgICAgICAoUGxhbmVPdXRbMV0pLnVfd2lkdGggLSBzaGlmdFVWKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIC8qIExlZnQgb3V0LCByaWdodCBpbiovCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNHhWU1NfSG9yaXpvbnRhbFNsaWRlVHJhbnNpdGlvbihQbGFuZUluMSwgUGxhbmVJbjIsIFBsYW5lT3V0LCBzaGlmdFVWKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiB2ZXJ0aWNhbCBzbGlkZSAqLwotICAgICAgICBzaGlmdFVWID0gKChQbGFuZU91dFsxXSkudV9oZWlnaHQgKiBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MpLzEwMDA7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNHhWU1NfU2xpZGVUcmFuc2l0aW9uIGJvdHRvbTogc2hpZnRVViA9ICVkLHByb2dyZXNzID0gJWQiLHNoaWZ0VVYsCi0gICAgICAgICAgICBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgKTsKLSAgICAgICAgaWYgKE00eFZTU19TbGlkZVRyYW5zaXRpb25fVG9wT3V0Qm90dG9tSW4gPT0gc2V0dGluZ3MtPmRpcmVjdGlvbikKLSAgICAgICAgewotICAgICAgICAgICAgLyogUHV0IHRoZSBwcmV2aW91cyBjbGlwIGZyYW1lIHRvcCwgdGhlIG5leHQgY2xpcCBmcmFtZSBib3R0b20uICovCi0gICAgICAgICAgICByZXR1cm4gTTR4VlNTX1ZlcnRpY2FsU2xpZGVUcmFuc2l0aW9uKFBsYW5lSW4xLCBQbGFuZUluMiwgUGxhbmVPdXQsIHNoaWZ0VVYpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLyogQm90dG9tIG91dCwgdG9wIGluICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNHhWU1NfVmVydGljYWxTbGlkZVRyYW5zaXRpb24oUGxhbmVJbjIsIFBsYW5lSW4xLCBQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAoUGxhbmVPdXRbMV0pLnVfaGVpZ2h0IC0gc2hpZnRVVik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBOb3RlOiBpdCBtaWdodCBiZSB3b3J0aHdoaWxlIHRvIGRvIHNvbWUgcGFyYW1ldGVyIGNoZWNraW5nLCBzZWUgaWYgZGltZW5zaW9ucyBtYXRjaCwgZXRjLiwKLSAgICBhdCBsZWFzdCBpbiBkZWJ1ZyBtb2RlLiAqLwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19GYWRlQmxhY2tUcmFuc2l0aW9uKE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kKQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGFwcGx5IGEgZmFkZSB0byBibGFjayBhbmQgdGhlbiBhIGZhZGUgZnJvbSBibGFjawotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwRnVuY3Rpb25Db250ZXh0KElOKSBDb250YWlucyB3aGljaCBjb2xvciB0byBhcHBseSAobm90IHZlcnkgY2xlYW4gLi4uKQotICogQHBhcmFtICAgIFBsYW5lSW4gICAgICAgICAgICAoSU4pIElucHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBQbGFuZU91dCAgICAgICAgKElOL09VVCkgT3V0cHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBwUHJvZ3Jlc3MgICAgICAgIChJTi9PVVQpIFByb2dyZXNzIGluZGljYXRpb24gKDAtMTAwKQotICogQHBhcmFtICAgIHVpRWZmZWN0S2luZCAgICAoSU4pIFVudXNlZAotICoKLSAqIEByZXR1cm4gICAgTTRWSUZJX09LOiAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX0ZhZGVCbGFja1RyYW5zaXRpb24oTTRPU0FfVm9pZCAqdXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4xWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4yWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVRyYW5zaXRpb25LaW5kKQotewotICAgIE00T1NBX0ludDMyIHRtcCA9IDA7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLQotICAgIGlmKChwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MpIDwgNTAwKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbXB1dGUgd2hlcmUgd2UgYXJlIGluIHRoZSBlZmZlY3QgKHNjYWxlIGlzIDAtPjEwMjQpICovCi0gICAgICAgIHRtcCA9IChNNE9TQV9JbnQzMikoKDEuMCAtICgoTTRPU0FfRmxvYXQpKHBQcm9ncmVzcy0+dWlQcm9ncmVzcyoyKS8xMDAwKSkgKiAxMDI0ICk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFwcGx5IHRoZSBkYXJrZW5pbmcgZWZmZWN0ICovCi0gICAgICAgIGVyciA9IE00VkZMX21vZGlmeUx1bWFXaXRoU2NhbGUoIChNNFZpQ29tSW1hZ2VQbGFuZSopUGxhbmVJbjEsCi0gICAgICAgICAgICAgKE00VmlDb21JbWFnZVBsYW5lKilQbGFuZU91dCwgdG1wLCBNNE9TQV9OVUxMKTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX0ZhZGVCbGFja1RyYW5zaXRpb246IE00VkZMX21vZGlmeUx1bWFXaXRoU2NhbGUgcmV0dXJuc1wKLSAgICAgICAgICAgICAgICAgZXJyb3IgMHgleCwgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfTFVNQV9GSUxURVJfRVJST1IiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfTFVNQV9GSUxURVJfRVJST1I7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbXB1dGUgd2hlcmUgd2UgYXJlIGluIHRoZSBlZmZlY3QgKHNjYWxlIGlzIDAtPjEwMjQpLiAqLwotICAgICAgICB0bXAgPSAoTTRPU0FfSW50MzIpKCAoKChNNE9TQV9GbG9hdCkoKChwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MtNTAwKSoyKSkvMTAwMCkpICogMTAyNCApOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBcHBseSB0aGUgZGFya2VuaW5nIGVmZmVjdCAqLwotICAgICAgICBlcnIgPSBNNFZGTF9tb2RpZnlMdW1hV2l0aFNjYWxlKChNNFZpQ29tSW1hZ2VQbGFuZSopUGxhbmVJbjIsCi0gICAgICAgICAgICAgKE00VmlDb21JbWFnZVBsYW5lKilQbGFuZU91dCwgdG1wLCBNNE9TQV9OVUxMKTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX0ZhZGVCbGFja1RyYW5zaXRpb246XAotICAgICAgICAgICAgICAgICBNNFZGTF9tb2RpZnlMdW1hV2l0aFNjYWxlIHJldHVybnMgZXJyb3IgMHgleCxcCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9MVU1BX0ZJTFRFUl9FUlJPUiIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9MVU1BX0ZJTFRFUl9FUlJPUjsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcmV0dXJuIE00VklGSV9PSzsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGOChNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBCdWZmZXJJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwQnVmZmVyT3V0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiogY29udmVydGVkU2l6ZSkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0IGZyb20gdGhlIGN1c3RvbWVyIGZvcm1hdCB0byBVVEY4Ci0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAoSU4pICAgIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcEJ1ZmZlckluICAgICAgICAoSU4pICAgIEJ1ZmZlciB0byBjb252ZXJ0Ci0gKiBAcGFyYW0gICAgcEJ1ZmZlck91dCAgICAgICAgKE9VVCkgICAgQ29udmVydGVkIGJ1ZmZlcgotICogQHBhcmFtICAgIGNvbnZlcnRlZFNpemUgICAgKE9VVCkgICAgU2l6ZSBvZiB0aGUgY29udmVydGVkIGJ1ZmZlcgotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGOChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwQnVmZmVySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwQnVmZmVyT3V0LCBNNE9TQV9VSW50MzIqIGNvbnZlcnRlZFNpemUpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIHBCdWZmZXJPdXQgPSBwQnVmZmVySW47Ci0gICAgaWYoeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udlRvVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICYmIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgQ29udmVydGVkU2l6ZSA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQubV9UZW1wT3V0Q29udmVyc2lvblNpemU7Ci0KLSAgICAgICAgbWVtc2V0KCh2b2lkICopeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsMAotICAgICAgICAgICAgLChNNE9TQV9VSW50MzIpeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5tX1RlbXBPdXRDb252ZXJzaW9uU2l6ZSk7Ci0KLSAgICAgICAgZXJyID0geFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udlRvVVRGOEZjdCgoTTRPU0FfVm9pZCopcEJ1ZmZlckluLAotICAgICAgICAgICAgKE00T1NBX1VJbnQ4Kil4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiopJkNvbnZlcnRlZFNpemUpOwotICAgICAgICBpZihlcnIgPT0gTTR4VlNTV0FSX0JVRkZFUl9PVVRfVE9PX1NNQUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMSgiTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGODogcENvbnZUb1VURjhGY3QgcmV0dXJuIDB4JXgiLGVycik7Ci0KLSAgICAgICAgICAgIC8qZnJlZSB0b28gc21hbGwgYnVmZmVyKi8KLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5cCi0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyKTsKLQotICAgICAgICAgICAgLypyZS1hbGxvY2F0ZSB0aGUgYnVmZmVyKi8KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyICAgID0KLSAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhDb252ZXJ0ZWRTaXplKnNpemVvZihNNE9TQV9VSW50OCksIE00VkEsCi0gICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0VG9VVEY4OiBVVEYgY29udmVyc2lvbiBidWZmZXIiKTsKLSAgICAgICAgICAgIGlmKE00T1NBX05VTEwgPT0geFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGOCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQubV9UZW1wT3V0Q29udmVyc2lvblNpemUgPSBDb252ZXJ0ZWRTaXplOwotCi0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKil4VlNTX2NvbnRleHQtPlwKLSAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsMCwoTTRPU0FfVUludDMyKXhWU1NfY29udGV4dC0+XAotICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5tX1RlbXBPdXRDb252ZXJzaW9uU2l6ZSk7Ci0KLSAgICAgICAgICAgIGVyciA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZUb1VURjhGY3QoKE00T1NBX1ZvaWQqKXBCdWZmZXJJbiwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCopeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIqKSZDb252ZXJ0ZWRTaXplKTsKLSAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0VG9VVEY4OiBwQ29udlRvVVRGOEZjdCByZXR1cm4gMHgleCIsZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0VG9VVEY4OiBwQ29udlRvVVRGOEZjdCByZXR1cm4gMHgleCIsZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgLypkZWNvZGVkIHBhdGgqLwotICAgICAgICBwQnVmZmVyT3V0ID0geFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICgqY29udmVydGVkU2l6ZSkgPSBDb252ZXJ0ZWRTaXplOwotICAgIH0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KE00T1NBX0NvbnRleHQgcENvbnRleHQpCi0gKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gY29udmVydCBmcm9tIFVURjggdG8gdGhlIGN1c3RvbWVyIGZvcm1hdAotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcEJ1ZmZlckluICAgICAgICAoSU4pICAgIEJ1ZmZlciB0byBjb252ZXJ0Ci0gKiBAcGFyYW0gICAgcEJ1ZmZlck91dCAgICAgICAgKE9VVCkgICAgQ29udmVydGVkIGJ1ZmZlcgotICogQHBhcmFtICAgIGNvbnZlcnRlZFNpemUgICAgKE9VVCkgICAgU2l6ZSBvZiB0aGUgY29udmVydGVkIGJ1ZmZlcgotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1ZvaWQqIHBCdWZmZXJJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwQnVmZmVyT3V0LCBNNE9TQV9VSW50MzIqIGNvbnZlcnRlZFNpemUpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIHBCdWZmZXJPdXQgPSBwQnVmZmVySW47Ci0gICAgaWYoeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0ICE9IE00T1NBX05VTEwKLSAgICAgICAgJiYgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiBDb252ZXJ0ZWRTaXplID0geFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5tX1RlbXBPdXRDb252ZXJzaW9uU2l6ZTsKLQotICAgICAgICBtZW1zZXQoKHZvaWQgKil4VlNTX2NvbnRleHQtPlwKLSAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwwLChNNE9TQV9VSW50MzIpeFZTU19jb250ZXh0LT5cCi0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQubV9UZW1wT3V0Q29udmVyc2lvblNpemUpOwotCi0gICAgICAgIGVyciA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdFwKLSAgICAgICAgICAgICgoTTRPU0FfVm9pZCopcEJ1ZmZlckluLChNNE9TQV9VSW50OCopeFZTU19jb250ZXh0LT5cCi0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAoTTRPU0FfVUludDMyKikmQ29udmVydGVkU2l6ZSk7Ci0gICAgICAgIGlmKGVyciA9PSBNNHhWU1NXQVJfQlVGRkVSX09VVF9UT09fU01BTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8xKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjg6IHBDb252RnJvbVVURjhGY3QgcmV0dXJuIDB4JXgiLGVycik7Ci0KLSAgICAgICAgICAgIC8qZnJlZSB0b28gc21hbGwgYnVmZmVyKi8KLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5cCi0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyKTsKLQotICAgICAgICAgICAgLypyZS1hbGxvY2F0ZSB0aGUgYnVmZmVyKi8KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyICAgID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKENvbnZlcnRlZFNpemUqc2l6ZW9mKE00T1NBX1VJbnQ4KSwgTTRWQSwKLSAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGODogVVRGIGNvbnZlcnNpb24gYnVmZmVyIik7Ci0gICAgICAgICAgICBpZihNNE9TQV9OVUxMID09IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQubV9UZW1wT3V0Q29udmVyc2lvblNpemUgPSBDb252ZXJ0ZWRTaXplOwotCi0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKil4VlNTX2NvbnRleHQtPlwKLSAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsMCwoTTRPU0FfVUludDMyKXhWU1NfY29udGV4dC0+XAotICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5tX1RlbXBPdXRDb252ZXJzaW9uU2l6ZSk7Ci0KLSAgICAgICAgICAgIGVyciA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCgoTTRPU0FfVm9pZCopcEJ1ZmZlckluLAotICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkKil4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIqKSZDb252ZXJ0ZWRTaXplKTsKLSAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjg6IHBDb252RnJvbVVURjhGY3QgcmV0dXJuIDB4JXgiLGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4OiBwQ29udkZyb21VVEY4RmN0IHJldHVybiAweCV4IixlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICAvKmRlY29kZWQgcGF0aCovCi0gICAgICAgIHBCdWZmZXJPdXQgPSB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgKCpjb252ZXJ0ZWRTaXplKSA9IENvbnZlcnRlZFNpemU7Ci0gICAgfQotCi0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9OT1RJQ0UgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzViMWVmYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0KLSAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9WaWRlb0VkaXRvclJlc2FtcGxlci5jcHAgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL1ZpZGVvRWRpdG9yUmVzYW1wbGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTEyOWMzYy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL1ZpZGVvRWRpdG9yUmVzYW1wbGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfTkRFQlVHIDEKLSNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSAiQXVkaW9NaXhlci5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yUmVzYW1wbGVyLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IFZpZGVvRWRpdG9yUmVzYW1wbGVyIDogcHVibGljIEF1ZGlvQnVmZmVyUHJvdmlkZXIgewotCi0gICAgcHVibGljOgotCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dEJ1ZmZlcihCdWZmZXIqIGJ1ZmZlciwgaW50NjRfdCBwdHMpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUJ1ZmZlcihCdWZmZXIqIGJ1ZmZlcik7Ci0KLSAgICBlbnVtIHsgLy9TYW1wbGluZyBmcmVxCi0gICAgIGtGcmVxODAwMEh6ID0gODAwMCwKLSAgICAga0ZyZXExMTAyNUh6ID0gMTEwMjUsCi0gICAgIGtGcmVxMTIwMDBIeiA9IDEyMDAwLAotICAgICBrRnJlcTE2MDAwSHogPSAxNjAwMCwKLSAgICAga0ZyZXEyMjA1MEh6ID0gMjIwNTAsCi0gICAgIGtGcmVxMjQwMDBIeiA9IDI0MDAwLAotICAgICBrRnJlcTMyMDAwSHogPSAzMjAwMCwKLSAgICAga0ZyZXE0NDEwMCA9IDQ0MTAwLAotICAgICBrRnJlcTQ4MDAwID0gNDgwMDAsCi0gICAgfTsKLQotICAgIEF1ZGlvUmVzYW1wbGVyICptUmVzYW1wbGVyOwotICAgIGludDE2X3QqIG1JbnB1dDsKLSAgICBpbnQgbmJDaGFubmVsczsKLSAgICBpbnQgbmJTYW1wbGVzOwotICAgIE00T1NBX0ludDMyIG91dFNhbXBsaW5nUmF0ZTsKLSAgICBNNE9TQV9JbnQzMiBpblNhbXBsaW5nUmF0ZTsKLQotICAgIGludDE2X3QgKm1UbXBJbkJ1ZmZlcjsKLX07Ci0KLSNkZWZpbmUgTUFYX1NBTVBMRURVUkFUSU9OX0ZPUl9DT05WRVJUSU9OIDQwIC8vbXMKLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JSZXNhbXBsZXI6OmdldE5leHRCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyICpwQnVmZmVyLCBpbnQ2NF90IHB0cykgewotCi0gICAgdWludDMyX3QgZGF0YVNpemUgPSBwQnVmZmVyLT5mcmFtZUNvdW50ICogdGhpcy0+bmJDaGFubmVscyAqIHNpemVvZihpbnQxNl90KTsKLSAgICBtVG1wSW5CdWZmZXIgPSAoaW50MTZfdCopbWFsbG9jKGRhdGFTaXplKTsKLSAgICBtZW1jcHkobVRtcEluQnVmZmVyLCB0aGlzLT5tSW5wdXQsIGRhdGFTaXplKTsKLSAgICBwQnVmZmVyLT5yYXcgPSAodm9pZCopbVRtcEluQnVmZmVyOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIFZpZGVvRWRpdG9yUmVzYW1wbGVyOjpyZWxlYXNlQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciAqcEJ1ZmZlcikgewotCi0gICAgaWYocEJ1ZmZlci0+cmF3ICE9IE5VTEwpIHsKLSAgICAgICAgZnJlZShwQnVmZmVyLT5yYXcpOwotICAgICAgICBwQnVmZmVyLT5yYXcgPSBOVUxMOwotICAgICAgICBtVG1wSW5CdWZmZXIgPSBOVUxMOwotICAgIH0KLSAgICBwQnVmZmVyLT5mcmFtZUNvdW50ID0gMDsKLX0KLQotZXh0ZXJuICJDIiB7Ci0KLU00T1NBX0NvbnRleHQgIExWQXVkaW9SZXNhbXBsZXJDcmVhdGUoTTRPU0FfSW50MzIgYml0RGVwdGgsIE00T1NBX0ludDMyIGluQ2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIHNhbXBsZVJhdGUsIE00T1NBX0ludDMyIHF1YWxpdHkpIHsKLQotICAgIFZpZGVvRWRpdG9yUmVzYW1wbGVyICpjb250ZXh0ID0gbmV3IFZpZGVvRWRpdG9yUmVzYW1wbGVyKCk7Ci0gICAgY29udGV4dC0+bVJlc2FtcGxlciA9IEF1ZGlvUmVzYW1wbGVyOjpjcmVhdGUoCi0gICAgICAgIGJpdERlcHRoLCBpbkNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSk7Ci0gICAgaWYgKGNvbnRleHQtPm1SZXNhbXBsZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgY29udGV4dC0+bVJlc2FtcGxlci0+c2V0U2FtcGxlUmF0ZShhbmRyb2lkOjpWaWRlb0VkaXRvclJlc2FtcGxlcjo6a0ZyZXEzMjAwMEh6KTsKLSAgICBjb250ZXh0LT5tUmVzYW1wbGVyLT5zZXRWb2x1bWUoMHgxMDAwLCAweDEwMDApOwotICAgIGNvbnRleHQtPm5iQ2hhbm5lbHMgPSBpbkNoYW5uZWxDb3VudDsKLSAgICBjb250ZXh0LT5vdXRTYW1wbGluZ1JhdGUgPSBzYW1wbGVSYXRlOwotICAgIGNvbnRleHQtPm1JbnB1dCA9IE5VTEw7Ci0gICAgY29udGV4dC0+bVRtcEluQnVmZmVyID0gTlVMTDsKLQotICAgIHJldHVybiAoKE00T1NBX0NvbnRleHQgKWNvbnRleHQpOwotfQotCi0KLXZvaWQgTFZBdWRpb3NldFNhbXBsZVJhdGUoTTRPU0FfQ29udGV4dCByZXNhbXBsZXJDb250ZXh0LCBNNE9TQV9JbnQzMiBpblNhbXBsZVJhdGUpIHsKLQotICAgIFZpZGVvRWRpdG9yUmVzYW1wbGVyICpjb250ZXh0ID0KLSAgICAgIChWaWRlb0VkaXRvclJlc2FtcGxlciAqKXJlc2FtcGxlckNvbnRleHQ7Ci0gICAgY29udGV4dC0+bVJlc2FtcGxlci0+c2V0U2FtcGxlUmF0ZShpblNhbXBsZVJhdGUpOwotICAgIC8qCi0gICAgICogbmJTYW1wbGVzIGlzIGNhbGN1bGF0ZWQgZm9yIDQwbXMgd29ydGggb2YgZGF0YTtoZW5jZSBzYW1wbGUgcmF0ZQotICAgICAqIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBuYlNhbXBsZXMKLSAgICAgKi8KLSAgICBjb250ZXh0LT5pblNhbXBsaW5nUmF0ZSA9IGluU2FtcGxlUmF0ZTsKLSAgICAvLyBBbGxvY2F0ZSBidWZmZXIgZm9yIG1heGltdW0gYWxsb3dlZCBudW1iZXIgb2Ygc2FtcGxlcy4KLSAgICBjb250ZXh0LT5tSW5wdXQgPSAoaW50MTZfdCopbWFsbG9jKCAoaW5TYW1wbGVSYXRlICogTUFYX1NBTVBMRURVUkFUSU9OX0ZPUl9DT05WRVJUSU9OICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+bmJDaGFubmVscyAqIHNpemVvZihpbnQxNl90KSkgLyAxMDAwKTsKLX0KLQotdm9pZCBMVkF1ZGlvc2V0Vm9sdW1lKE00T1NBX0NvbnRleHQgcmVzYW1wbGVyQ29udGV4dCwgTTRPU0FfSW50MTYgbGVmdCwgTTRPU0FfSW50MTYgcmlnaHQpIHsKLQotICAgIFZpZGVvRWRpdG9yUmVzYW1wbGVyICpjb250ZXh0ID0KLSAgICAgICAoVmlkZW9FZGl0b3JSZXNhbXBsZXIgKilyZXNhbXBsZXJDb250ZXh0OwotICAgIGNvbnRleHQtPm1SZXNhbXBsZXItPnNldFZvbHVtZShsZWZ0LHJpZ2h0KTsKLX0KLQotdm9pZCBMVkRlc3Ryb3koTTRPU0FfQ29udGV4dCByZXNhbXBsZXJDb250ZXh0KSB7Ci0KLSAgICBWaWRlb0VkaXRvclJlc2FtcGxlciAqY29udGV4dCA9Ci0gICAgICAgKFZpZGVvRWRpdG9yUmVzYW1wbGVyICopcmVzYW1wbGVyQ29udGV4dDsKLQotICAgIGlmIChjb250ZXh0LT5tVG1wSW5CdWZmZXIgIT0gTlVMTCkgewotICAgICAgICBmcmVlKGNvbnRleHQtPm1UbXBJbkJ1ZmZlcik7Ci0gICAgICAgIGNvbnRleHQtPm1UbXBJbkJ1ZmZlciA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKGNvbnRleHQtPm1JbnB1dCAhPSBOVUxMKSB7Ci0gICAgICAgIGZyZWUoY29udGV4dC0+bUlucHV0KTsKLSAgICAgICAgY29udGV4dC0+bUlucHV0ID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoY29udGV4dC0+bVJlc2FtcGxlciAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBjb250ZXh0LT5tUmVzYW1wbGVyOwotICAgICAgICBjb250ZXh0LT5tUmVzYW1wbGVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoY29udGV4dCAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBjb250ZXh0OwotICAgICAgICBjb250ZXh0ID0gTlVMTDsKLSAgICB9Ci19Ci0KLXZvaWQgTFZBdWRpb3Jlc2FtcGxlX0xvd1F1YWxpdHkoTTRPU0FfSW50MTYqIG91dCwgTTRPU0FfSW50MTYqIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIG91dEZyYW1lQ291bnQsIE00T1NBX0NvbnRleHQgcmVzYW1wbGVyQ29udGV4dCkgewotCi0gICAgVmlkZW9FZGl0b3JSZXNhbXBsZXIgKmNvbnRleHQgPQotICAgICAgKFZpZGVvRWRpdG9yUmVzYW1wbGVyICopcmVzYW1wbGVyQ29udGV4dDsKLSAgICBpbnQzMl90ICpwVG1wQnVmZmVyID0gTlVMTDsKLQotICAgIGNvbnRleHQtPm5iU2FtcGxlcyA9IChjb250ZXh0LT5pblNhbXBsaW5nUmF0ZSAqIG91dEZyYW1lQ291bnQpIC8gY29udGV4dC0+b3V0U2FtcGxpbmdSYXRlOwotICAgIG1lbWNweShjb250ZXh0LT5tSW5wdXQsaW5wdXQsKGNvbnRleHQtPm5iU2FtcGxlcyAqIGNvbnRleHQtPm5iQ2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCkpKTsKLQotICAgIC8qCi0gICAgIFNSQyBtb2R1bGUgYWx3YXlzIGdpdmVzIHN0ZXJlbyBvdXRwdXQsIGhlbmNlIDIgZm9yIHN0ZXJlbyBhdWRpbwotICAgICovCi0gICAgcFRtcEJ1ZmZlciA9IChpbnQzMl90KiltYWxsb2Mob3V0RnJhbWVDb3VudCAqIDIgKiBzaXplb2YoaW50MzJfdCkpOwotICAgIG1lbXNldChwVG1wQnVmZmVyLCAweDAwLCBvdXRGcmFtZUNvdW50ICogMiAqIHNpemVvZihpbnQzMl90KSk7Ci0KLSAgICBjb250ZXh0LT5tUmVzYW1wbGVyLT5yZXNhbXBsZSgoaW50MzJfdCAqKXBUbXBCdWZmZXIsCi0gICAgICAgKHNpemVfdClvdXRGcmFtZUNvdW50LCAoVmlkZW9FZGl0b3JSZXNhbXBsZXIgKilyZXNhbXBsZXJDb250ZXh0KTsKLSAgICAvLyBDb252ZXJ0IGJhY2sgdG8gMTYgYml0cwotICAgIGRpdGhlckFuZENsYW1wKChpbnQzMl90KilvdXQsIHBUbXBCdWZmZXIsIG91dEZyYW1lQ291bnQpOwotICAgIGZyZWUocFRtcEJ1ZmZlcik7Ci0gICAgcFRtcEJ1ZmZlciA9IE5VTEw7Ci19Ci0KLX0KLQotfSAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvQW5kcm9pZC5tayBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MDUzZTdkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotaW5jbHVkZSAkKGNhbGwgYWxsLXN1YmRpci1tYWtlZmlsZXMpCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yM2dwUmVhZGVyLmggYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yM2dwUmVhZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdhOWEwMTIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvcjNncFJlYWRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICBWaWRlb0VkaXRvcjNncFJlYWRlci5jcHAKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCAzR1AgUmVhZGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBWSURFT0VESVRPUl8zR1BSRUFERVJfSAotI2RlZmluZSBWSURFT0VESVRPUl8zR1BSRUFERVJfSAotCi0jaW5jbHVkZSAiTTRSRUFERVJfQ29tbW9uLmgiCi0KLU00T1NBX0VSUiBWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRJbnRlcmZhY2UoCi0gICAgICAgIE00UkVBREVSX01lZGlhVHlwZSAqcE1lZGlhVHlwZSwKLSAgICAgICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlICoqcFJkckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSAqKnBSZHJEYXRhSW50ZXJmYWNlKTsKLQotI2VuZGlmIC8qIFZJREVPRURJVE9SXzNHUFJFQURFUl9IICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JBdWRpb0RlY29kZXIuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JBdWRpb0RlY29kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGQzYjgwMS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAZmlsZSAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyLmNwcAotKiBAYnJpZWYgIFN0YWdlRnJpZ2h0IHNoZWxsIEF1ZGlvIERlY29kZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIFZJREVPRURJVE9SX0FVRElPREVDT0RFUl9ICi0jZGVmaW5lIFZJREVPRURJVE9SX0FVRElPREVDT0RFUl9ICi0KLSNpbmNsdWRlICJNNEFEX0NvbW1vbi5oIgotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlX0FBQyhNNEFEX1R5cGUqIHBEZWNvZGVyVHlwZSwKLSAgICAgICAgTTRBRF9JbnRlcmZhY2UqKiBwRGVjb2RlckludGVyZmFjZSk7Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRJbnRlcmZhY2VfQU1STkIoTTRBRF9UeXBlKiBwRGVjb2RlclR5cGUsCi0gICAgICAgIE00QURfSW50ZXJmYWNlKiogcERlY29kZXJJbnRlcmZhY2UpOwotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlX0FNUldCKE00QURfVHlwZSogcERlY29kZXJUeXBlLAotICAgICAgICBNNEFEX0ludGVyZmFjZSoqIHBEZWNvZGVySW50ZXJmYWNlKTsKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZV9NUDMoTTRBRF9UeXBlKiBwRGVjb2RlclR5cGUsCi0gICAgICAgIE00QURfSW50ZXJmYWNlKiogcERlY29kZXJJbnRlcmZhY2UpOwotCi0jZW5kaWYgLyogVklERU9FRElUT1JfQVVESU9ERUNPREVSX0ggKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JBdWRpb0VuY29kZXIuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JBdWRpb0VuY29kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjRmNmIwNC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAZmlsZSAgIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyLmNwcAotKiBAYnJpZWYgIFN0YWdlRnJpZ2h0IHNoZWxsIEF1ZGlvIEVuY29kZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIFZJREVPRURJVE9SX0FVRElPRU5DT0RFUl9ICi0jZGVmaW5lIFZJREVPRURJVE9SX0FVRElPRU5DT0RFUl9ICi0KLSNpbmNsdWRlICJNNE9TQV9Db3JlSUQuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNEVOQ09ERVJfQXVkaW9Db21tb24uaCIKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZV9BQUMoCi0gICAgICAgIE00RU5DT0RFUl9BdWRpb0Zvcm1hdCogcEZvcm1hdCwKLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlKiogcEVuY29kZXJJbnRlcmZhY2UpOwotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0FNUk5CKAotICAgICAgICBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQqIHBGb3JtYXQsCi0gICAgICAgIE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZSoqIHBFbmNvZGVySW50ZXJmYWNlKTsKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZV9NUDMoCi0gICAgICAgIE00RU5DT0RFUl9BdWRpb0Zvcm1hdCogcEZvcm1hdCwKLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlKiogcEVuY29kZXJJbnRlcmZhY2UpOwotCi0jZW5kaWYgLyogVklERU9FRElUT1JfQVVESU9FTkNPREVSX0ggKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JCdWZmZXIuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JCdWZmZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2FmZjZhNy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yQnVmZmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICBWaWRlb0VkaXRvckJ1ZmZlci5jCi0qIEBicmllZiAgU3RhZ2VGcmlnaHQgc2hlbGwgQnVmZmVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiAgIFZJREVPRURJVE9SX0JVRkZFUl9ICi0jZGVmaW5lICAgVklERU9FRElUT1JfQlVGRkVSX0gKLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9DaGFyU3Rhci5oIgotI2luY2x1ZGUgIk00X1V0aWxzLmgiCi0KLSNpbmNsdWRlICJMVl9NYWNyb3MuaCIKLQotLyotLS0gQ29yZSBpZCBmb3IgVklERU9FRElUT1IgQnVmZmVyIGFsbG9jYXRpb25zICAtLS0qLwotI2RlZmluZSBWSURFT0VESVRPUl9CVUZGRVJfRVhURVJOQUwgMHgwMTJGCi0KLS8qIC0tLS0tIGVycm9ycyAgLS0tLS0qLwotI2RlZmluZSBNNEVSUl9OT19CVUZGRVJfQVZBSUxBQkxFIFwKLSAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixWSURFT0VESVRPUl9CVUZGRVJfRVhURVJOQUwsMHgwMDAwMDEpCi0jZGVmaW5lIE00RVJSX05PX0JVRkZFUl9NQVRDSCBcCi0gICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsVklERU9FRElUT1JfQlVGRkVSX0VYVEVSTkFMLDB4MDAwMDAyKQotCi10eXBlZGVmIGVudW0gewotICAgIFZJREVPRURJVE9SX0JVRkZFUl9rRW1wdHkgPSAwLAotICAgIFZJREVPRURJVE9SX0JVRkZFUl9rRmlsbGVkLAotfSBWSURFT0VESVRPUl9CVUZGRVJfU3RhdGU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogU3RydWN0dXJlICAgIExWT01YX0JVRkZFUl9CdWZmZXIKLSAqIEBicmllZiAgICAgICBPbmUgT01YIEJ1ZmZlciBhbmQgZGF0YSByZWxhdGVkIHRvIGl0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE00T1NBX1ZvaWQqIHBEYXRhOyAgICAgICAgICAgICAgLyoqPCBQb2ludGVyIHRvIHRoZSBkYXRhKi8KLSAgICBNNE9TQV9VSW50MzIgc2l6ZTsKLSAgICBWSURFT0VESVRPUl9CVUZGRVJfU3RhdGUgc3RhdGU7IC8qKjwgQnVmZmVyIHN0YXRlICovCi0gICAgTTRPU0FfVUludDMyIGlkeDsgICAgICAgICAgICAgICAvKio8IEluZGV4IG9mIHRoZSBidWZmZXIgaW5zaWRlIHRoZSBwb29sICovCi0gICAgTTRfTWVkaWFUaW1lICAgIGJ1ZmZDVFM7ICAgICAgICAvKio8IFRpbWUgc3RhbXAgb2YgdGhlIGJ1ZmZlciAqLwotfSBWSURFT0VESVRPUl9CVUZGRVJfQnVmZmVyOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFN0cnVjdHVyZSAgICBMVk9NWF9CVUZGRVJfUG9vbAotICogQGJyaWVmICAgICAgIFN0cnVjdHVyZSB0byBtYW5hZ2UgYnVmZmVycwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBWSURFT0VESVRPUl9CVUZGRVJfQnVmZmVyKiBwTlhQQnVmZmVyOwotICAgIE00T1NBX1VJbnQzMiBOQjsKLSAgICBNNE9TQV9DaGFyKiBwb29sTmFtZTsKLX0gVklERU9FRElUT1JfQlVGRkVSX1Bvb2w7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotewotI2VuZGlmIC8vX19jcGx1c3BsdXMKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gTTRPU0FfRVJSIFZJREVPRURJVE9SX0JVRkZFUl9hbGxvY2F0ZVBvb2woVklERU9FRElUT1JfQlVGRkVSX1Bvb2wqKiBwcG9vbCwKLSAqICAgICAgICAgTTRPU0FfVUludDMyIG5iQnVmZmVycykKLSAqIEBicmllZiAgIEFsbG9jYXRlIGEgcG9vbCBvZiBuYkJ1ZmZlcnMgYnVmZmVycwotICoKLSAqIEBwYXJhbSAgIHBwb29sICAgICAgOiBJTiBUaGUgYnVmZmVyIHBvb2wgdG8gY3JlYXRlCi0gKiBAcGFyYW0gICBuYkJ1ZmZlcnMgIDogSU4gVGhlIG51bWJlciBvZiBidWZmZXJzIGluIHRoZSBwb29sCi0gKiBAcGFyYW0gICBwb29sTmFtZSAgIDogSU4gYSBuYW1lIGdpdmVuIHRvIHRoZSBwb29sCi0gKiBAcmV0dXJuICBFcnJvciBjb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZJREVPRURJVE9SX0JVRkZFUl9hbGxvY2F0ZVBvb2woVklERU9FRElUT1JfQlVGRkVSX1Bvb2wqKiBwcG9vbCwKLSAgICAgICAgTTRPU0FfVUludDMyIG5iQnVmZmVycywgTTRPU0FfQ2hhciogcG9vbE5hbWUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBNNE9TQV9FUlIgVklERU9FRElUT1JfQlVGRkVSX2ZyZWVQb29sKExWT01YX0JVRkZFUl9Qb29sKiBwcG9vbCkKLSAqIEBicmllZiAgIERlYWxsb2NhdGUgYSBidWZmZXIgcG9vbAotICoKLSAqIEBwYXJhbSAgIHBwb29sICAgICAgOiBJTiBUaGUgYnVmZmVyIHBvb2wgdG8gZnJlZQotICogQHJldHVybiAgRXJyb3IgY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWSURFT0VESVRPUl9CVUZGRVJfZnJlZVBvb2woVklERU9FRElUT1JfQlVGRkVSX1Bvb2wqIHBwb29sKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gTTRPU0FfRVJSIFZJREVPRURJVE9SX0JVRkZFUl9nZXRCdWZmZXIoVklERU9FRElUT1JfQlVGRkVSX1Bvb2wqIHBwb29sLAotICogICAgICAgICBWSURFT0VESVRPUl9CVUZGRVJfQnVmZmVyKiogcE5YUEJ1ZmZlcikKLSAqIEBicmllZiAgIFJldHVybnMgYSBidWZmZXIgaW4gYSBnaXZlbiBzdGF0ZQotICoKLSAqIEBwYXJhbSAgIHBwb29sICAgICAgOiBJTiBUaGUgYnVmZmVyIHBvb2wKLSAqIEBwYXJhbSAgIGRlc2lyZWRTdGF0ZSA6IElOIFRoZSBidWZmZXIgc3RhdGUKLSAqIEBwYXJhbSAgIHBOWFBCdWZmZXIgOiBJTiBUaGUgc2VsZWN0ZWQgYnVmZmVyCi0gKiBAcmV0dXJuICBFcnJvciBjb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZJREVPRURJVE9SX0JVRkZFUl9nZXRCdWZmZXIoVklERU9FRElUT1JfQlVGRkVSX1Bvb2wqIHBwb29sLAotICAgICAgICBWSURFT0VESVRPUl9CVUZGRVJfU3RhdGUgZGVzaXJlZFN0YXRlLAotICAgICAgICBWSURFT0VESVRPUl9CVUZGRVJfQnVmZmVyKiogcE5YUEJ1ZmZlcik7Ci0KLQotTTRPU0FfRVJSIFZJREVPRURJVE9SX0JVRkZFUl9pbml0UG9vbEJ1ZmZlcnMoVklERU9FRElUT1JfQlVGRkVSX1Bvb2wqIHBwb29sLAotICAgICAgICBNNE9TQV9VSW50MzIgbFNpemUpOwotCi1NNE9TQV9FUlIgVklERU9FRElUT1JfQlVGRkVSX2dldE9sZGVzdEJ1ZmZlcihWSURFT0VESVRPUl9CVUZGRVJfUG9vbCAqcG9vbCwKLSAgICAgICAgVklERU9FRElUT1JfQlVGRkVSX1N0YXRlIGRlc2lyZWRTdGF0ZSwKLSAgICAgICAgVklERU9FRElUT1JfQlVGRkVSX0J1ZmZlcioqIHBOWFBCdWZmZXIpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvL19fY3BsdXNwbHVzCi0jZW5kaWYgLypWSURFT0VESVRPUl9CVUZGRVJfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JNYWluLmggYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yTWFpbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YzNiNTE3Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JNYWluLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfX1ZJREVPX0VESVRPUl9BUElfSF9fCi0jZGVmaW5lIF9fVklERU9fRURJVE9SX0FQSV9IX18KLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0KLXR5cGVkZWYgZW51bQotewotICAgIE1TR19UWVBFX1BST0dSRVNTX0lORElDQVRJT04sICAgICAvLyBQbGF5YmFjayBwcm9ncmVzcyBpbmRpY2F0aW9uIGV2ZW50Ci0gICAgTVNHX1RZUEVfUExBWUVSX0VSUk9SLCAgICAgICAgICAgIC8vIFBsYXliYWNrIGVycm9yCi0gICAgTVNHX1RZUEVfUFJFVklFV19FTkQsICAgICAgICAgICAgIC8vIFByZXZpZXcgb2YgY2xpcHMgaXMgY29tcGxldGUKLSAgICBNU0dfVFlQRV9PVkVSTEFZX1VQREFURSwgICAgICAgICAgLy8gdXBkYXRlIG92ZXJsYXkgZHVyaW5nIHByZXZpZXcKLSAgICBNU0dfVFlQRV9PVkVSTEFZX0NMRUFSLCAgICAgICAgICAgLy8gY2xlYXIgdGhlIG92ZXJsYXkKLX0gcHJvZ3Jlc3NfY2FsbGJhY2tfbXNnX3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBpbnQgb3ZlcmxheVNldHRpbmdzSW5kZXg7Ci0gICAgaW50IGNsaXBJbmRleDsKLX0gVmlkZW9FZGl0b3JDdXJyZXRFZGl0SW5mbzsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9Wb2lkICAgICAqcEZpbGU7ICAgICAgICAgICAgICAgICAgIC8qKiBQQ00gZmlsZSBwYXRoICovCi0gICAgTTRPU0FfQm9vbCAgICAgYlJlbW92ZU9yaWdpbmFsOyAgICAgICAgICAvKiogSWYgdHJ1ZSwgdGhlIG9yaWdpbmFsIGF1ZGlvIHRyYWNrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IHRha2VuIGludG8gYWNjb3VudCAqLwotICAgIE00T1NBX1VJbnQzMiAgIHVpTmJDaGFubmVsczsgICAgICAgICAgICAvKiogTnVtYmVyIG9mIGNoYW5uZWxzICgxPW1vbm8sIDI9c3RlcmVvKSBvZiBCR00gY2xpcCovCi0gICAgTTRPU0FfVUludDMyICAgdWlTYW1wbGluZ0ZyZXF1ZW5jeTsgICAgIC8qKiBTYW1wbGluZyBhdWRpbyBmcmVxdWVuY3kgKDgwMDAgZm9yIGFtciwgMTYwMDAgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vcmUgZm9yIGFhYykgb2YgQkdNIGNsaXAqLwotICAgIE00T1NBX1VJbnQzMiAgIHVpRXh0ZW5kZWRTYW1wbGluZ0ZyZXF1ZW5jeTsgLyoqIEV4dGVuZGVkIGZyZXF1ZW5jeSBmb3IgQUFDKywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVBQUMrIHN0cmVhbXMgb2YgQkdNIGNsaXAqLwotICAgIE00T1NBX1VJbnQzMiAgIHVpQWRkQ3RzOyAgICAgICAgICAgICAgICAvKiogVGltZSwgaW4gbWlsbGlzZWNvbmRzLCBhdCB3aGljaCB0aGUgYWRkZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIHRyYWNrIGlzIGluc2VydGVkICovCi0gICAgTTRPU0FfVUludDMyICAgdWlBZGRWb2x1bWU7ICAgICAgICAgICAgIC8qKiBWb2x1bWUsIGluIHBlcmNlbnRhZ2UsIG9mIHRoZSBhZGRlZCBhdWRpbyB0cmFjayAqLwotICAgIE00T1NBX1VJbnQzMiAgIGJlZ2luQ3V0TXM7Ci0gICAgTTRPU0FfVUludDMyICAgZW5kQ3V0TXM7Ci0gICAgTTRPU0FfSW50MzIgICAgZmlsZVR5cGU7Ci0gICAgTTRPU0FfQm9vbCAgICAgYkxvb3A7ICAgICAgICAgICAgICAgICAgIC8qKiBMb29waW5nIG9uL29mZiAqKi8KLSAgICAvKiBBdWRpbyBkdWNraW5nICovCi0gICAgTTRPU0FfVUludDMyICAgdWlJbkR1Y2tpbmdfdGhyZXNob2xkOyAgIC8qKiBUaHJlc2hvbGQgdmFsdWUgYXQgd2hpY2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQgbXVzaWMgc2hhbGwgZHVjayAqLwotICAgIE00T1NBX1VJbnQzMiAgIHVpSW5EdWNraW5nX2xvd1ZvbHVtZTsgICAvKiogbG93ZXIgdGhlIGJhY2tncm91bmQgdHJhY2sgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZmFjdG9yIG9mIGN1cnJlbnQgbGV2ZWwgKi8KLSAgICBNNE9TQV9Cb29sICAgICBiSW5EdWNraW5nX2VuYWJsZTsgICAgICAgLyoqIGVuYWJsZSBkdWNraW5nICovCi0gICAgTTRPU0FfVUludDMyICAgdWlCVENoYW5uZWxDb3VudDsgICAgICAgIC8qKiBjaGFubmVsIGNvdW50IGZvciBCVCAqLwotICAgIE00T1NBX1ZvaWQgICAgICpwUENNRmlsZVBhdGg7Ci19IE00eFZTU19BdWRpb01peGluZ1NldHRpbmdzOwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1ZvaWQgICAgICAqcEJ1ZmZlcjsgICAgICAgICAgICAvKiBZVVY0MjAgYnVmZmVyIG9mIGZyYW1lIHRvIGJlIHJlbmRlcmVkKi8KLSAgICBNNE9TQV9VSW50MzIgICAgdGltZU1zOyAgICAgICAgICAgIC8qIHRpbWUgc3RhbXAgb2YgdGhlIGZyYW1lIHRvIGJlIHJlbmRlcmVkKi8KLSAgICBNNE9TQV9VSW50MzIgICAgdWlTdXJmYWNlV2lkdGg7ICAgIC8qIFN1cmZhY2UgZGlzcGxheSB3aWR0aCovCi0gICAgTTRPU0FfVUludDMyICAgIHVpU3VyZmFjZUhlaWdodDsgICAgLyogU3VyZmFjZSBkaXNwbGF5IGhlaWdodCovCi0gICAgTTRPU0FfVUludDMyICAgIHVpRnJhbWVXaWR0aDsgICAgICAgIC8qIEZyYW1lIHdpZHRoKi8KLSAgICBNNE9TQV9VSW50MzIgICAgdWlGcmFtZUhlaWdodDsgICAgICAgIC8qIEZyYW1lIGhlaWdodCovCi0gICAgTTRPU0FfQm9vbCAgICAgIGJBcHBseUVmZmVjdDsgICAgICAgIC8qIEFwcGx5IHZpZGVvIGVmZmVjdHMgYmVmb3JlIHJlbmRlciovCi0gICAgTTRPU0FfVUludDMyICAgIGNsaXBCZWdpbkN1dFRpbWU7ICAvKiBDbGlwIGJlZ2luIGN1dCB0aW1lIHJlbGF0aXZlIHRvIHN0b3J5Ym9hcmQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgY2xpcEVuZEN1dFRpbWU7ICAgIC8qIENsaXAgZW5kIGN1dCB0aW1lIHJlbGF0aXZlIHRvIHN0b3J5Ym9hcmQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgdmlkZW9Sb3RhdGlvbkRlZ3JlZTsgLyogVmlkZW8gcm90YXRpb24gZGVncmVlICovCi0KLX0gVmlkZW9FZGl0b3JfcmVuZGVyUHJldmlld0ZyYW1lU3RyOwotI2VuZGlmIC8qX19WSURFT19FRElUT1JfQVBJX0hfXyovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yTXAzUmVhZGVyLmggYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yTXAzUmVhZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDViM2JlNDAuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvck1wM1JlYWRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICBWaWRlb0VkaXRvck1wM1JlYWRlci5jcHAKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCBNUDMgUmVhZGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBWSURFT0VESVRPUl9NUDNSRUFERVJfSAotI2RlZmluZSBWSURFT0VESVRPUl9NUDNSRUFERVJfSAotCi0jaW5jbHVkZSAiTTRSRUFERVJfQ29tbW9uLmgiCi0KLU00T1NBX0VSUiBWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXRJbnRlcmZhY2UoCi0gICAgICAgIE00UkVBREVSX01lZGlhVHlwZSAqcE1lZGlhVHlwZSwKLSAgICAgICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlICoqcFJkckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSAqKnBSZHJEYXRhSW50ZXJmYWNlKTsKLQotI2VuZGlmIC8qIFZJREVPRURJVE9SX01QM1JFQURFUl9IICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yVXRpbHMuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JVdGlscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMjFiMjFkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JVdGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBmaWxlICAgVmlkZW9FZGl0b3JVdGlscy5jcHAKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCBVdGlsaXRpZXMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIEFORFJPSURfVVRJTFNfSF8KLSNkZWZpbmUgQU5EUk9JRF9VVElMU19IXwotCi0vKioqKioqKioqKioqKioqKioqKgotICogICAgIEhFQURFUlMgICAgICoKLSAqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLQotI2luY2x1ZGUgInV0aWxzL0xvZy5oIgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBWSURFT0VESVRPUl9DSEVDSyh0ZXN0LCBlcnJDb2RlKQotICogQG5vdGUgVGhpcyBtYWNybyBkaXNwbGF5cyBhbiBlcnJvciBtZXNzYWdlIGFuZCBnb2VzIHRvIGZ1bmN0aW9uIGNsZWFuVXAgbGFiZWwKLSAqICAgICAgIGlmIHRoZSB0ZXN0IGZhaWxzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotI2RlZmluZSBWSURFT0VESVRPUl9DSEVDSyh0ZXN0LCBlcnJDb2RlKSBcCi17IFwKLSAgICBpZiggISh0ZXN0KSApIHsgXAotICAgICAgICBBTE9HVigiISEhICVzIChMJWQpIGNoZWNrIGZhaWxlZCA6ICIgI3Rlc3QgIiwgeWllbGRzIGVycm9yIDB4JS44eCIsIFwKLSAgICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgZXJyQ29kZSk7IFwKLSAgICAgICAgZXJyID0gKGVyckNvZGUpOyBcCi0gICAgICAgIGdvdG8gY2xlYW5VcDsgXAotICAgIH0gXAotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBTQUZFX0ZSRUUocCkKLSAqIEBub3RlIFRoaXMgbWFjcm8gY2FsbHMgZnJlZSBhbmQgbWFrZXMgc3VyZSB0aGUgcG9pbnRlciBpcyBzZXQgdG8gTlVMTC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLSNkZWZpbmUgU0FGRV9GUkVFKHApIFwKLXsgXAotICAgIGlmKE00T1NBX05VTEwgIT0gKHApKSB7IFwKLSAgICAgICAgZnJlZSgocCkpIDsgXAotICAgICAgICAocCkgPSBNNE9TQV9OVUxMIDsgXAotICAgIH0gXAotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBTQUZFX01BTExPQyhwLCB0eXBlLCBjb3VudCwgY29tbWVudCkKLSAqIEBub3RlIFRoaXMgbWFjcm8gYWxsb2NhdGVzIGEgYnVmZmVyLCBjaGVja3MgZm9yIHN1Y2Nlc3MgYW5kIGZpbGxzIHRoZSBidWZmZXIKLSAqICAgICAgIHdpdGggMC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLSNkZWZpbmUgU0FGRV9NQUxMT0MocCwgdHlwZSwgY291bnQsIGNvbW1lbnQpIFwKLXsgXAotICAgIChwKSA9ICh0eXBlKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKHR5cGUpKihjb3VudCksIDB4RkYsKE00T1NBX0NoYXIqKWNvbW1lbnQpO1wKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IChwKSwgTTRFUlJfQUxMT0MpOyBcCi0gICAgbWVtc2V0KCh2b2lkICopKHApLCAwLHNpemVvZih0eXBlKSooY291bnQpKTsgXAotfQotCi0KLSAgICAvKioqKioqKioqKioqKioqKioqKioKLSAgICAgKiAgICBVVElMSVRJRVMgICAgICoKLSAgICAgKioqKioqKioqKioqKioqKioqKiovCi0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIERJU1BMQVkgTUVUQURBVEEgQ09OVEVOVCAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIGRpc3BsYXlNZXRhRGF0YShjb25zdCBzcDxNZXRhRGF0YT4gbWV0YSk7Ci0KLS8vIEJ1aWxkIHRoZSBBVkMgY29kZWMgc3BjaWZpYyBpbmZvIGZyb20gdGhlIFN0YWdlRnJpZ2h0IGVuY29kZXJzIG91dHB1dAotc3RhdHVzX3QgYnVpbGRBVkNDb2RlY1NwZWNpZmljRGF0YSh1aW50OF90ICoqb3V0cHV0RGF0YSwgc2l6ZV90ICpvdXRwdXRTaXplLAotICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSwgTWV0YURhdGEgKnBhcmFtKTsKLQotfS8vbmFtZXNwYWNlIGFuZHJvaWQKLQotCi0jZW5kaWYgLy9BTkRST0lEX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyLmggYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFlZWEzYTYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvclZpZGVvRGVjb2Rlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlci5jcHAKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCB2aWRlbyBkZWNvZGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBWSURFT0VESVRPUl9WSURFT0RFQ09ERVJfSAotI2RlZmluZSBWSURFT0VESVRPUl9WSURFT0RFQ09ERVJfSAotCi0jaW5jbHVkZSAiTTRERUNPREVSX0NvbW1vbi5oIgotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0SW50ZXJmYWNlX01QRUc0KAotICAgICAgICBNNERFQ09ERVJfVmlkZW9UeXBlICpwRGVjb2RlclR5cGUsCi0gICAgICAgIE00T1NBX0NvbnRleHQgKnBEZWNvZGVySW50ZXJmYWNlKTsKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldEludGVyZmFjZV9IMjY0KAotICAgICAgICBNNERFQ09ERVJfVmlkZW9UeXBlICpwRGVjb2RlclR5cGUsCi0gICAgICAgIE00T1NBX0NvbnRleHQgKnBEZWNvZGVySW50ZXJmYWNlKTsKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldFNvZnR3YXJlSW50ZXJmYWNlX01QRUc0KAotICAgICAgICBNNERFQ09ERVJfVmlkZW9UeXBlICpwRGVjb2RlclR5cGUsCi0gICAgICAgIE00T1NBX0NvbnRleHQgKnBEZWNJbnRlcmZhY2UpOwotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0U29mdHdhcmVJbnRlcmZhY2VfSDI2NCgKLSAgICAgICAgTTRERUNPREVSX1ZpZGVvVHlwZSAqcERlY29kZXJUeXBlLAotICAgICAgICBNNE9TQV9Db250ZXh0ICpwRGVjSW50ZXJmYWNlKTsKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldFZpZGVvRGVjb2RlcnNBbmRDYXBhYmlsaXRpZXMoCi0gICAgTTRERUNPREVSX1ZpZGVvRGVjb2RlcnMqKiBkZWNvZGVycyk7Ci0KLSNlbmRpZiAvLyBWSURFT0VESVRPUl9WSURFT0RFQ09ERVJfSApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9pbnRlcm5hbC5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9pbnRlcm5hbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NzYyNjQzLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfaW50ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBmaWxlICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfSW50ZXJuYWwuaAotKiBAYnJpZWYgIFN0YWdlRnJpZ2h0IHNoZWxsIHZpZGVvIGRlY29kZXIgaW50ZXJuYWwgaGVhZGVyIGZpbGUqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00X0NvbW1vbi5oIgotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotCi0jaW5jbHVkZSAiTTREQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00UkVBREVSX0NvbW1vbi5oIgotI2luY2x1ZGUgIk00VklGSV9GaWx0ZXJzQVBJLmgiCi0jaW5jbHVkZSAiTTRUT09MX1ZlcnNpb25JbmZvLmgiCi0jaW5jbHVkZSAiTTRERUNPREVSX0NvbW1vbi5oIgotI2luY2x1ZGUgIk00T1NBX1NlbWFwaG9yZS5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yQnVmZmVyLmgiCi0jaW5jbHVkZSAiTTRWRF9Ub29scy5oIgotI2luY2x1ZGUgIkk0MjBDb2xvckNvbnZlcnRlci5oIgotCi0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvcmVjdC5oPgotI2luY2x1ZGUgPE9NWF9WaWRlby5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDbGllbnQuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotCi0jZGVmaW5lIFZJREVPRURJVE9SX1ZJREVDX1NIRUxMX1ZFUl9NQUpPUiAgICAgMAotI2RlZmluZSBWSURFT0VESVRPUl9WSURFQ19TSEVMTF9WRVJfTUlOT1IgICAgIDAKLSNkZWZpbmUgVklERU9FRElUT1JfVklERUNfU0hFTExfVkVSX1JFVklTSU9OICAxCi0KLS8qIEVSUk9SUyAqLwotI2RlZmluZSBNNEVSUl9TRl9ERUNPREVSX1JTUkNfRkFJTCBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgMHhGRiwgMHgwMDAxKQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gICAgVklERU9FRElUT1Jfa01wZWc0VmlkZW9EZWMsCi0gICAgVklERU9FRElUT1Jfa0gyNjNWaWRlb0RlYywKLSAgICBWSURFT0VESVRPUl9rSDI2NFZpZGVvRGVjCi19IFZJREVPRURJVE9SX0NvZGVjVHlwZTsKLQotCi0vKnR5cGVkZWYgc3RydWN0ewotICAgIE00T1NBX1VJbnQzMiBzdHJlYW1fYnl0ZTsKLSAgICBNNE9TQV9VSW50MzIgc3RyZWFtX2luZGV4OwotICAgIE00T1NBX01lbUFkZHI4IGluOwotCi19IFZJREVPRURJVE9SX1ZJREVPX0JpdHN0cmVhbV9jdHh0OyovCi0KLXR5cGVkZWYgTTRWU19CaXRzdHJlYW1fY3R4dCBWSURFT0VESVRPUl9WSURFT19CaXRzdHJlYW1fY3R4dDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCi0gICAgLyoqIFN0YWdlZnJpZ3RoIHBhcmFtcyAqLwotICAgIE9NWENsaWVudCAgICAgICAgICAgICAgIG1DbGllbnQ7IC8qKjwgT01YIENsaWVudCBzZXNzaW9uIGluc3RhbmNlLiAqLwotICAgIHNwPE1lZGlhU291cmNlPiAgICAgICAgIG1WaWRlb0RlY29kZXI7IC8qKjwgU3RhZ2VmcmlnaHQgZGVjb2RlciBpbnN0YW5jZSAqLwotICAgIHNwPE1lZGlhU291cmNlPiAgICAgICAgIG1SZWFkZXJTb3VyY2U7IC8qKjwgUmVhZGVyIGFjY2VzcyA+ICovCi0KLSAgICAvKiBSRUFERVIgKi8KLSAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKm1fcFJlYWRlckdsb2JhbDsKLSAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICAqbV9wUmVhZGVyOwotICAgIE00X0FjY2Vzc1VuaXQgICAgICAgICAgICptX3BOZXh0QWNjZXNzVW5pdFRvRGVjb2RlOwotCi0gICAgLyogU1RSRUFNIFBBUkFNUyAqLwotICAgIE00X1ZpZGVvU3RyZWFtSGFuZGxlciogIG1fcFZpZGVvU3RyZWFtaGFuZGxlcjsKLQotICAgIC8qIFVzZXIgZmlsdGVyIHBhcmFtcy4gKi8KLSAgICBNNFZJRklfUGxhbkNvbnZlcnRlckZ1bmN0aW9uVHlwZSAqbV9wRmlsdGVyOwotICAgIE00T1NBX1ZvaWQgICAgICAgICAgICAgICptX3BGaWx0ZXJVc2VyRGF0YTsKLQotICAgIE00X01lZGlhVGltZSAgICAgICAgICAgIG1fbGFzdERlY29kZWRDVFM7Ci0gICAgTTRfTWVkaWFUaW1lICAgICAgICAgICAgbV9sYXN0UmVuZGVyQ3RzOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgIG1SZWFjaGVkRU9TOwotICAgIFZJREVPRURJVE9SX0NvZGVjVHlwZSAgIG1EZWNvZGVyVHlwZTsKLSAgICBNNERFQ09ERVJfVmlkZW9TaXplICAgICBtX1ZpZGVvU2l6ZTsKLSAgICBNNERFQ09ERVJfTVBFRzRfRGVjb2RlckNvbmZpZ0luZm8gbV9EY2k7IC8qKjwgRGVjb2RlciBDb25maWcgaW5mbyAqLwotICAgIFZJREVPRURJVE9SX0JVRkZFUl9Qb29sICptX3BEZWNCdWZmZXJQb29sOyAvKio8IERlY29kZWQgYnVmZmVyIHBvb2wgKi8KLSAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSAgICBkZWNPdXB1dENvbG9yRm9ybWF0OwotCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbU5iSW5wdXRGcmFtZXM7Ci0gICAgTTRPU0FfRG91YmxlICAgICAgICAgICAgbUZpcnN0SW5wdXRDdHM7Ci0gICAgTTRPU0FfRG91YmxlICAgICAgICAgICAgbUxhc3RJbnB1dEN0czsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBtTmJSZW5kZXJlZEZyYW1lczsKLSAgICBNNE9TQV9Eb3VibGUgICAgICAgICAgICBtRmlyc3RSZW5kZXJlZEN0czsKLSAgICBNNE9TQV9Eb3VibGUgICAgICAgICAgICBtTGFzdFJlbmRlcmVkQ3RzOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1OYk91dHB1dEZyYW1lczsKLSAgICBNNE9TQV9Eb3VibGUgICAgICAgICAgICBtRmlyc3RPdXRwdXRDdHM7Ci0gICAgTTRPU0FfRG91YmxlICAgICAgICAgICAgbUxhc3RPdXRwdXRDdHM7Ci0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgbUdpdmVuV2lkdGgsIG1HaXZlbkhlaWdodDsgLy9Vc2VkIGluIGNhc2Ugb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0lORk9fRk9STUFUX0NIQU5HRUQKLSAgICBBUmVjdCAgICAgICAgICAgICAgICAgICBtQ3JvcFJlY3Q7ICAvLyBUaGVzZSBhcmUgb2J0YWluZWQgZnJvbSBrS2V5Q3JvcFJlY3QuCi0gICAgSTQyMENvbG9yQ29udmVydGVyKiAgICAgbUk0MjBDb2xvckNvbnZlcnRlcjsKLQotICAgIC8vIFRpbWUgaW50ZXJ2YWwgYmV0d2VlbiB0d28gY29uc2VxdXRpdmUvbmVpZ2hib3JpbmcgdmlkZW8gZnJhbWVzLgotICAgIE00X01lZGlhVGltZSAgICAgICAgICAgIG1GcmFtZUludGVydmFsTXM7Ci0KLX0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dDsKLQotfSAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyLmggYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZkNTE1NGYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvclZpZGVvRW5jb2Rlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlci5jcHAKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCB2aWRlbyBlbmNvZGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBWSURFT0VESVRPUl9WSURFT0VOQ09ERVJfSAotI2RlZmluZSBWSURFT0VESVRPUl9WSURFT0VOQ09ERVJfSAotCi0jaW5jbHVkZSAiTTRFTkNPREVSX2NvbW1vbi5oIgotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0gyNjMoTTRFTkNPREVSX0Zvcm1hdCogcEZvcm1hdCwKLSAgICAgICAgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSoqIHBFbmNvZGVySW50ZXJmYWNlLCBNNEVOQ09ERVJfT3Blbk1vZGUgbW9kZSk7Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfTVBFRzQoTTRFTkNPREVSX0Zvcm1hdCogcEZvcm1hdCwKLSAgICAgICAgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSoqIHBFbmNvZGVySW50ZXJmYWNlLCBNNEVOQ09ERVJfT3Blbk1vZGUgbW9kZSk7Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfSDI2NChNNEVOQ09ERVJfRm9ybWF0KiBwRm9ybWF0LAotICAgICAgICBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlKiogcEVuY29kZXJJbnRlcmZhY2UsIE00RU5DT0RFUl9PcGVuTW9kZSBtb2RlKTsKLQotI2VuZGlmIC8vVklERU9FRElUT1JfVklERU9FTkNPREVSX0gKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvQW5kcm9pZC5tayBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTMwYjg1ZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0gICAgTWVkaWFCdWZmZXJQdWxsZXIuY3BwIFwKLSAgICBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlci5jcHAgXAotICAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyLmNwcCBcCi0gICAgVmlkZW9FZGl0b3JNcDNSZWFkZXIuY3BwIFwKLSAgICBWaWRlb0VkaXRvcjNncFJlYWRlci5jcHAgXAotICAgIFZpZGVvRWRpdG9yVXRpbHMuY3BwIFwKLSAgICBWaWRlb0VkaXRvckJ1ZmZlci5jIFwKLSAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlci5jcHAgXAotICAgIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyLmNwcAotCi1MT0NBTF9DX0lOQ0xVREVTICs9IFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwIFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgY29yZWNnIGdyYXBoaWNzKSBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvbHZwcCBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvZWRpdG9yIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4Ci0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gICAgIFwKLSAgICBsaWJjdXRpbHMgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJ1dGlscyAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJtZWRpYSAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJiaW5kZXIgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJzdGFnZWZyaWdodCAgICAgICAgICAgIFwKLSAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKLSAgICBsaWJzdGFnZWZyaWdodF9vbXggICAgICAgIFwKLSAgICBsaWJndWkgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJ2aWRlb2VkaXRvcl9vc2FsICAgICAgIFwKLSAgICBsaWJ2aWRlb2VkaXRvcnBsYXllciAgICAgIFwKLQotTE9DQUxfQ0ZMQUdTICs9IFwKLQotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCi0gICAgbGlic3RhZ2VmcmlnaHRfY29sb3JfY29udmVyc2lvbgotCi0KLUxPQ0FMX01PRFVMRTo9IGxpYnZpZGVvZWRpdG9yX3N0YWdlZnJpZ2h0c2hlbGxzCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLWluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9NZWRpYUJ1ZmZlclB1bGxlci5jcHAgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL01lZGlhQnVmZmVyUHVsbGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNjODI2OC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL01lZGlhQnVmZmVyUHVsbGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJNZWRpYUJ1ZmZlclB1bGxlciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlICJNZWRpYUJ1ZmZlclB1bGxlci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLQotTWVkaWFCdWZmZXJQdWxsZXI6Ok1lZGlhQnVmZmVyUHVsbGVyKGNvbnN0IHNwPE1lZGlhU291cmNlPiYgc291cmNlKQotICAgIDogbVNvdXJjZShzb3VyY2UpLAotICAgICAgbUFza1RvU3RhcnQoZmFsc2UpLAotICAgICAgbUFza1RvU3RvcChmYWxzZSksCi0gICAgICBtQWNxdWlyZVN0b3BwZWQoZmFsc2UpLAotICAgICAgbVJlbGVhc2VTdG9wcGVkKGZhbHNlKSwKLSAgICAgIG1Tb3VyY2VFcnJvcihPSykgewotCi0gICAgYW5kcm9pZENyZWF0ZVRocmVhZChhY3F1aXJlVGhyZWFkU3RhcnQsIHRoaXMpOwotICAgIGFuZHJvaWRDcmVhdGVUaHJlYWQocmVsZWFzZVRocmVhZFN0YXJ0LCB0aGlzKTsKLX0KLQotTWVkaWFCdWZmZXJQdWxsZXI6On5NZWRpYUJ1ZmZlclB1bGxlcigpIHsKLSAgICBzdG9wKCk7Ci19Ci0KLWJvb2wgTWVkaWFCdWZmZXJQdWxsZXI6Omhhc01lZGlhU291cmNlUmV0dXJuZWRFcnJvcigpIGNvbnN0IHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOwotICAgIHJldHVybiAoKG1Tb3VyY2VFcnJvciAhPSBPSykgPyB0cnVlIDogZmFsc2UpOwotfQotdm9pZCBNZWRpYUJ1ZmZlclB1bGxlcjo6c3RhcnQoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKLSAgICBtQXNrVG9TdGFydCA9IHRydWU7Ci0gICAgbUFjcXVpcmVDb25kLnNpZ25hbCgpOwotICAgIG1SZWxlYXNlQ29uZC5zaWduYWwoKTsKLX0KLQotdm9pZCBNZWRpYUJ1ZmZlclB1bGxlcjo6c3RvcCgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOwotICAgIG1Bc2tUb1N0b3AgPSB0cnVlOwotICAgIG1BY3F1aXJlQ29uZC5zaWduYWwoKTsKLSAgICBtUmVsZWFzZUNvbmQuc2lnbmFsKCk7Ci0gICAgd2hpbGUgKCFtQWNxdWlyZVN0b3BwZWQgfHwgIW1SZWxlYXNlU3RvcHBlZCkgewotICAgICAgICBtVXNlckNvbmQud2FpdChtTG9jayk7Ci0gICAgfQotCi0gICAgLy8gUmVsZWFzZSByZW1haW5pbmcgYnVmZmVycwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUJ1ZmZlcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbUJ1ZmZlcnMuaXRlbUF0KGkpLT5yZWxlYXNlKCk7Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUmVsZWFzZUJ1ZmZlcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbVJlbGVhc2VCdWZmZXJzLml0ZW1BdChpKS0+cmVsZWFzZSgpOwotICAgIH0KLQotICAgIG1CdWZmZXJzLmNsZWFyKCk7Ci0gICAgbVJlbGVhc2VCdWZmZXJzLmNsZWFyKCk7Ci19Ci0KLU1lZGlhQnVmZmVyKiBNZWRpYUJ1ZmZlclB1bGxlcjo6Z2V0QnVmZmVyTm9uQmxvY2tpbmcoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKLSAgICBpZiAobUJ1ZmZlcnMuZW1wdHkoKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9IGVsc2UgewotICAgICAgICBNZWRpYUJ1ZmZlciogYiA9IG1CdWZmZXJzLml0ZW1BdCgwKTsKLSAgICAgICAgbUJ1ZmZlcnMucmVtb3ZlQXQoMCk7Ci0gICAgICAgIHJldHVybiBiOwotICAgIH0KLX0KLQotTWVkaWFCdWZmZXIqIE1lZGlhQnVmZmVyUHVsbGVyOjpnZXRCdWZmZXJCbG9ja2luZygpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOwotICAgIHdoaWxlIChtQnVmZmVycy5lbXB0eSgpICYmICFtQWNxdWlyZVN0b3BwZWQpIHsKLSAgICAgICAgbVVzZXJDb25kLndhaXQobUxvY2spOwotICAgIH0KLQotICAgIGlmIChtQnVmZmVycy5lbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIE1lZGlhQnVmZmVyKiBiID0gbUJ1ZmZlcnMuaXRlbUF0KDApOwotICAgICAgICBtQnVmZmVycy5yZW1vdmVBdCgwKTsKLSAgICAgICAgcmV0dXJuIGI7Ci0gICAgfQotfQotCi12b2lkIE1lZGlhQnVmZmVyUHVsbGVyOjpwdXRCdWZmZXIoTWVkaWFCdWZmZXIqIGJ1ZmZlcikgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7Ci0gICAgbVJlbGVhc2VCdWZmZXJzLnB1c2goYnVmZmVyKTsKLSAgICBtUmVsZWFzZUNvbmQuc2lnbmFsKCk7Ci19Ci0KLWludCBNZWRpYUJ1ZmZlclB1bGxlcjo6YWNxdWlyZVRocmVhZFN0YXJ0KHZvaWQqIGFyZykgewotICAgIE1lZGlhQnVmZmVyUHVsbGVyKiBzZWxmID0gKE1lZGlhQnVmZmVyUHVsbGVyKilhcmc7Ci0gICAgc2VsZi0+YWNxdWlyZVRocmVhZEZ1bmMoKTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IE1lZGlhQnVmZmVyUHVsbGVyOjpyZWxlYXNlVGhyZWFkU3RhcnQodm9pZCogYXJnKSB7Ci0gICAgTWVkaWFCdWZmZXJQdWxsZXIqIHNlbGYgPSAoTWVkaWFCdWZmZXJQdWxsZXIqKWFyZzsKLSAgICBzZWxmLT5yZWxlYXNlVGhyZWFkRnVuYygpOwotICAgIHJldHVybiAwOwotfQotCi12b2lkIE1lZGlhQnVmZmVyUHVsbGVyOjphY3F1aXJlVGhyZWFkRnVuYygpIHsKLSAgICBtTG9jay5sb2NrKCk7Ci0KLSAgICAvLyBXYWl0IGZvciB0aGUgc3RhcnQgc2lnbmFsCi0gICAgd2hpbGUgKCFtQXNrVG9TdGFydCAmJiAhbUFza1RvU3RvcCkgewotICAgICAgICBtQWNxdWlyZUNvbmQud2FpdChtTG9jayk7Ci0gICAgfQotCi0gICAgLy8gTG9vcCB1bnRpbCB3ZSBhcmUgYXNrZWQgdG8gc3RvcCwgb3IgdGhlcmUgaXMgbm90aGluZyBtb3JlIHRvIHJlYWQKLSAgICB3aGlsZSAoIW1Bc2tUb1N0b3ApIHsKLSAgICAgICAgTWVkaWFCdWZmZXIqIHBCdWZmZXI7Ci0gICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBtU291cmNlLT5yZWFkKCZwQnVmZmVyLCBOVUxMKTsKLSAgICAgICAgbUxvY2subG9jaygpOwotICAgICAgICBtU291cmNlRXJyb3IgPSByZXN1bHQ7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gT0spIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIG1CdWZmZXJzLnB1c2gocEJ1ZmZlcik7Ci0gICAgICAgIG1Vc2VyQ29uZC5zaWduYWwoKTsKLSAgICB9Ci0KLSAgICBtQWNxdWlyZVN0b3BwZWQgPSB0cnVlOwotICAgIG1Vc2VyQ29uZC5zaWduYWwoKTsKLSAgICBtTG9jay51bmxvY2soKTsKLX0KLQotdm9pZCBNZWRpYUJ1ZmZlclB1bGxlcjo6cmVsZWFzZVRocmVhZEZ1bmMoKSB7Ci0gICAgbUxvY2subG9jaygpOwotCi0gICAgLy8gV2FpdCBmb3IgdGhlIHN0YXJ0IHNpZ25hbAotICAgIHdoaWxlICghbUFza1RvU3RhcnQgJiYgIW1Bc2tUb1N0b3ApIHsKLSAgICAgICAgbVJlbGVhc2VDb25kLndhaXQobUxvY2spOwotICAgIH0KLQotICAgIC8vIExvb3AgdW50aWwgd2UgYXJlIGFza2VkIHRvIHN0b3AKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBpZiAobVJlbGVhc2VCdWZmZXJzLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIGlmIChtQXNrVG9TdG9wKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1SZWxlYXNlQ29uZC53YWl0KG1Mb2NrKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBNZWRpYUJ1ZmZlciogcEJ1ZmZlciA9IG1SZWxlYXNlQnVmZmVycy5pdGVtQXQoMCk7Ci0gICAgICAgIG1SZWxlYXNlQnVmZmVycy5yZW1vdmVBdCgwKTsKLSAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgIHBCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbUxvY2subG9jaygpOwotICAgIH0KLQotICAgIG1SZWxlYXNlU3RvcHBlZCA9IHRydWU7Ci0gICAgbVVzZXJDb25kLnNpZ25hbCgpOwotICAgIG1Mb2NrLnVubG9jaygpOwotfQotCi19OyAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvTWVkaWFCdWZmZXJQdWxsZXIuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvTWVkaWFCdWZmZXJQdWxsZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ3MmE1My4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL01lZGlhQnVmZmVyUHVsbGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfTUVESUFfQlVGRkVSX1BVTExFUl9ICi0jZGVmaW5lIF9NRURJQV9CVUZGRVJfUFVMTEVSX0gKLQotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBNZWRpYVNvdXJjZTsKLXN0cnVjdCBNZWRpYUJ1ZmZlcjsKLQotLyoKLSAqIEFuIG9iamVjdCBvZiB0aGlzIGNsYXNzIGNhbiBwdWxsIGEgbGlzdCBvZiBtZWRpYSBidWZmZXJzCi0gKiBmcm9tIGEgTWVkaWFTb3VyY2UgcmVwZWF0ZWRseS4gVGhlIHVzZXIgY2FuIHRoZW4gZ2V0IHRoZQotICogYnVmZmVycyBmcm9tIHRoYXQgbGlzdC4KLSAqLwotc3RydWN0IE1lZGlhQnVmZmVyUHVsbGVyIHsKLXB1YmxpYzoKLSAgICBNZWRpYUJ1ZmZlclB1bGxlcihjb25zdCBzcDxNZWRpYVNvdXJjZT4mIHNvdXJjZSk7Ci0gICAgfk1lZGlhQnVmZmVyUHVsbGVyKCk7Ci0KLSAgICAvLyBTdGFydCB0byBidWlsZCB1cCB0aGUgbGlzdCBvZiB0aGUgYnVmZmVycy4KLSAgICB2b2lkIHN0YXJ0KCk7Ci0KLSAgICAvLyBSZWxlYXNlIHRoZSBsaXN0IG9mIHRoZSBhdmFpbGFibGUgYnVmZmVycywgYW5kIHN0b3AKLSAgICAvLyBwdWxsaW5nIGJ1ZmZlcnMgZnJvbSB0aGUgTWVkaWFTb3VyY2UuCi0gICAgdm9pZCBzdG9wKCk7Ci0KLSAgICAvLyBHZXQgYSBidWZmZXIgZnJvbSB0aGUgbGlzdC4gSWYgdGhlcmUgaXMgbm8gYnVmZmVyIGF2YWlsYWJsZQotICAgIC8vIGF0IHRoZSB0aW1lIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgTlVMTCBpcyByZXR1cm5lZC4KLSAgICBNZWRpYUJ1ZmZlciogZ2V0QnVmZmVyQmxvY2tpbmcoKTsKLQotICAgIC8vIEdldCBhIGJ1ZmZlciBmcm9tIHRoZSBsaXN0LiBJZiB0aGVyZSBpcyBubyBidWZmZXIgYXZhaWxhYmxlCi0gICAgLy8gYXQgdGhlIHRpbWUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBpdCBibG9ja3Mgd2FpdGluZyBmb3IKLSAgICAvLyBhIGJ1ZmZlciB0byBiZWNvbWUgYXZhaWxhYmxlIG9yIHVudGlsIHN0b3AoKSBpcyBjYWxsZWQuCi0gICAgTWVkaWFCdWZmZXIqIGdldEJ1ZmZlck5vbkJsb2NraW5nKCk7Ci0KLSAgICAvLyBBZGQgYSBidWZmZXIgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBhdmFpbGFibGUgbWVkaWEgYnVmZmVycwotICAgIHZvaWQgcHV0QnVmZmVyKE1lZGlhQnVmZmVyKiBidWZmZXIpOwotCi0gICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgc291cmNlIHJldHVybmVkIGFuIGVycm9yIG9yIG5vdC4KLSAgICBib29sIGhhc01lZGlhU291cmNlUmV0dXJuZWRFcnJvcigpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIHN0YXRpYyBpbnQgYWNxdWlyZVRocmVhZFN0YXJ0KHZvaWQqIGFyZyk7Ci0gICAgdm9pZCBhY3F1aXJlVGhyZWFkRnVuYygpOwotCi0gICAgc3RhdGljIGludCByZWxlYXNlVGhyZWFkU3RhcnQodm9pZCogYXJnKTsKLSAgICB2b2lkIHJlbGVhc2VUaHJlYWRGdW5jKCk7Ci0KLSAgICBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKLSAgICBWZWN0b3I8TWVkaWFCdWZmZXIqPiBtQnVmZmVyczsKLSAgICBWZWN0b3I8TWVkaWFCdWZmZXIqPiBtUmVsZWFzZUJ1ZmZlcnM7Ci0KLSAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwotICAgIENvbmRpdGlvbiBtVXNlckNvbmQ7ICAgICAvLyBmb3IgdGhlIHVzZXIgb2YgdGhpcyBjbGFzcwotICAgIENvbmRpdGlvbiBtQWNxdWlyZUNvbmQ7ICAvLyBmb3IgdGhlIGFjcXVpcmUgdGhyZWFkCi0gICAgQ29uZGl0aW9uIG1SZWxlYXNlQ29uZDsgIC8vIGZvciB0aGUgcmVsZWFzZSB0aHJlYWQKLQotICAgIGJvb2wgbUFza1RvU3RhcnQ7ICAgICAgLy8gQXNrcyB0aGUgdGhyZWFkcyB0byBzdGFydAotICAgIGJvb2wgbUFza1RvU3RvcDsgICAgICAgLy8gQXNrcyB0aGUgdGhyZWFkcyB0byBzdG9wCi0gICAgYm9vbCBtQWNxdWlyZVN0b3BwZWQ7ICAvLyBUaGUgYWNxdWlyZSB0aHJlYWQgaGFzIHN0b3BwZWQKLSAgICBib29sIG1SZWxlYXNlU3RvcHBlZDsgIC8vIFRoZSByZWxlYXNlIHRocmVhZCBoYXMgc3RvcHBlZAotICAgIHN0YXR1c190IG1Tb3VyY2VFcnJvcjsgLy8gRXJyb3IgcmV0dXJuZWQgYnkgTWVkaWFTb3VyY2UgcmVhZAotCi0gICAgLy8gRG9uJ3QgY2FsbCBtZSEKLSAgICBNZWRpYUJ1ZmZlclB1bGxlcihjb25zdCBNZWRpYUJ1ZmZlclB1bGxlciYpOwotICAgIE1lZGlhQnVmZmVyUHVsbGVyJiBvcGVyYXRvcj0oY29uc3QgTWVkaWFCdWZmZXJQdWxsZXImKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gX01FRElBX0JVRkZFUl9QVUxMRVJfSApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9OT1RJQ0UgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzViMWVmYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0KLSAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvcjNncFJlYWRlci5jcHAgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yM2dwUmVhZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTljZjllYy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yM2dwUmVhZGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIwMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICBWaWRlb0VkaXRvcjNncFJlYWRlci5jcHAKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCAzR1AgUmVhZGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jZGVmaW5lIExPR19OREVCVUcgMQotI2RlZmluZSBMT0dfVEFHICJWSURFT0VESVRPUl8zR1BSRUFERVIiCi0KLS8qKgotICogSEVBREVSUwotICoKLSAqLwotI2RlZmluZSBWSURFT0VESVRPUl9CSVRTVFJFQU1fUEFSU0VSCi0KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yM2dwUmVhZGVyLmgiCi0jaW5jbHVkZSAiTTRTWVNfQWNjZXNzVW5pdC5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVXRpbHMuaCIKLSNpbmNsdWRlICJNNFJFQURFUl8zZ3BDb20uaCIKLSNpbmNsdWRlICJNNF9Db21tb24uaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlV3JpdGVyLmgiCi0KLSNpZmRlZiBWSURFT0VESVRPUl9CSVRTVFJFQU1fUEFSU0VSCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNF9VdGlscy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlICJFU0RTLmgiCi0jaW5jbHVkZSAidXRpbHMvTG9nLmgiCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotCi0vKioKLSAqIFNPVVJDRSBDTEFTUwotICovCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vKioKLSAqIEVOR0lORSBJTlRFUkZBQ0UKLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIEFycmF5IG9mIEFNUiBOQi9XQiBiaXRyYXRlcwotICogQG5vdGUgICAgQXJyYXkgdG8gbWF0Y2ggdGhlIG1vZGUgYW5kIHRoZSBiaXQgcmF0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLWNvbnN0IE00T1NBX1VJbnQzMiBWaWRlb0VkaXRvcjNncFJlYWRlcl9BbXJCaXRSYXRlIFsyIC8qIDhrSHogLyAxNmtIeiAgICAgKi9dCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbOSAvKiB0aGUgYml0cmF0ZSBtb2RlICovXSA9Ci17Ci0gICAgezQ3NTAsIDUxNTAsIDU5MDAsICA2NzAwLCAgNzQwMCwgIDc5NTAsICAxMDIwMCwgMTIyMDAsIDB9LAotICAgIHs2NjAwLCA4ODUwLCAxMjY1MCwgMTQyNTAsIDE1ODUwLCAxODI1MCwgMTk4NTAsIDIzMDUwLCAyMzg1MH0KLX07Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSBWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0Ci0gKiBAYnJpZWY6VGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgY29udGV4dCBvZiB0aGUgU3RhZ2VGcmlnaHQgM0dQIHNoZWxsIFJlYWRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgc3A8RGF0YVNvdXJjZT4gICAgICAgICAgICAgIG1EYXRhU291cmNlOwotICAgIHNwPE1lZGlhRXh0cmFjdG9yPiAgICAgICAgICBtRXh0cmFjdG9yOwotICAgIHNwPE1lZGlhU291cmNlPiAgICAgICAgICAgICBtQXVkaW9Tb3VyY2U7Ci0gICAgc3A8TWVkaWFTb3VyY2U+ICAgICAgICAgICAgIG1WaWRlb1NvdXJjZTsKLSAgICBNNF9TdHJlYW1IYW5kbGVyKiAgICAgICAgICAgbUF1ZGlvU3RyZWFtSGFuZGxlcjsKLSAgICBNNF9TdHJlYW1IYW5kbGVyKiAgICAgICAgICAgbVZpZGVvU3RyZWFtSGFuZGxlcjsKLSAgICBNNFNZU19BY2Nlc3NVbml0ICAgICAgICAgICAgbUF1ZGlvQXU7Ci0gICAgTTRTWVNfQWNjZXNzVW5pdCAgICAgICAgICAgIG1WaWRlb0F1OwotICAgIE00T1NBX1RpbWUgICAgICAgICAgICAgICAgICBtTWF4RHVyYXRpb247Ci0gICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgIG1GaWxlU2l6ZTsKLSAgICBNNF9TdHJlYW1UeXBlICAgICAgICAgICAgICAgbVN0cmVhbVR5cGU7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIG1TdHJlYW1JZDsKLSAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgbVRyYWNrczsKLSAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgbUN1cnJUcmFjazsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgbUF1ZGlvU2Vla2luZzsKLSAgICBNNE9TQV9UaW1lICAgICAgICAgICAgICAgICAgbUF1ZGlvU2Vla1RpbWU7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgIG1WaWRlb1NlZWtpbmc7Ci0gICAgTTRPU0FfVGltZSAgICAgICAgICAgICAgICAgIG1WaWRlb1NlZWtUaW1lOwotCi19IFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQ7Ci0KLSNpZmRlZiBWSURFT0VESVRPUl9CSVRTVFJFQU1fUEFSU0VSCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJDb250ZXh0Ci0gKiBAYnJpZWYgICAgICAgSW50ZXJuYWwgQml0U3RyZWFtUGFyc2VyIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTTRPU0FfVUludDMyKiAgIG1QYml0U3RyZWFtOyAgIC8qKjwgYml0c3RyZWFtIHBvaW50ZXIgKDMyYml0cyBhbGlnbmVkKSAqLwotICAgIE00T1NBX0ludDMyICAgICBtU2l6ZTsgICAgICAgICAvKio8IGJpdHN0cmVhbSBzaXplIGluIGJ5dGVzICovCi0gICAgTTRPU0FfSW50MzIgICAgIG1JbmRleDsgICAgICAgIC8qKjwgYnl0ZSBpbmRleCAqLwotICAgIE00T1NBX0ludDMyICAgICBtQml0SW5kZXg7ICAgICAvKio8IGJpdCBpbmRleCAqLwotICAgIE00T1NBX0ludDMyICAgICBtU3RydWN0U2l6ZTsgICAvKio8IHNpemUgb2Ygc3RydWN0dXJlICovCi19IFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIEFsbG9jYXRlcyB0aGUgY29udGV4dCBhbmQgaW5pdGlhbGl6ZXMgaW50ZXJuYWwgZGF0YS4KLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgIChPVVQpICBQb2ludGVyIHRvIHRoZSBCaXRTdHJlYW1QYXJzZXIgY29udGV4dCB0byBjcmVhdGUuCi0gKiBAcGFyYW0gICBiaXRTdHJlYW0gICBBIHBvaW50ZXIgdG8gdGhlIGJpdHN0cmVhbQotICogQHBhcmFtICAgc2l6ZSAgICAgICAgVGhlIHNpemUgb2YgdGhlIGJpdHN0cmVhbSBpbiBieXRlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1zdGF0aWMgdm9pZCBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJJbml0KHZvaWQqKiBwQ29udGV4dCwKLSAgICAgICAgdm9pZCogcEJpdFN0cmVhbSwgTTRPU0FfSW50MzIgc2l6ZSkgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQqIHBTdHJlYW1Db250ZXh0OwotCi0gICAgKnBDb250ZXh0PU00T1NBX05VTEw7Ci0gICAgcFN0cmVhbUNvbnRleHQgPSAoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ29udGV4dCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICBzaXplb2YoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ29udGV4dCksIE00UkVBREVSXzNHUCwKLSAgICAgICAgICAgIChNNE9TQV9DaGFyKikiM0dQIEJpdFN0cmVhbVBhcnNlciBDb250ZXh0Iik7Ci0gICAgaWYgKE00T1NBX05VTEwgPT0gcFN0cmVhbUNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBwU3RyZWFtQ29udGV4dC0+bVBiaXRTdHJlYW09KE00T1NBX1VJbnQzMiopcEJpdFN0cmVhbTsKLSAgICBwU3RyZWFtQ29udGV4dC0+bVNpemU9c2l6ZTsKLSAgICBwU3RyZWFtQ29udGV4dC0+bUluZGV4PTA7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1CaXRJbmRleD0wOwotICAgIHBTdHJlYW1Db250ZXh0LT5tU3RydWN0U2l6ZSA9Ci0gICAgICAgIHNpemVvZihWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJDb250ZXh0KTsKLQotICAgICpwQ29udGV4dD1wU3RyZWFtQ29udGV4dDsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIENsZWFuIHVwIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgIChJTi9PVVQpICBCaXRTdHJlYW1QYXJzZXIgY29udGV4dC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotc3RhdGljIHZvaWQgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ2xlYW5VcCh2b2lkKiBwQ29udGV4dCkgewotICAgIGZyZWUoKE00T1NBX0ludDMyKilwQ29udGV4dCk7Ci19Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgUmVhZCB0aGUgbmV4dCA8bGVuZ3RoPiBiaXRzIGluIHRoZSBiaXRzdHJlYW0uCi0gKiBAbm90ZSAgICBUaGUgZnVuY3Rpb24gZG9lcyBub3QgdXBkYXRlIHRoZSBiaXRzdHJlYW0gcG9pbnRlci4KLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgIChJTi9PVVQpIEJpdFN0cmVhbVBhcnNlciBjb250ZXh0LgotICogQHBhcmFtICAgbGVuZ3RoICAgICAgKElOKSBUaGUgbnVtYmVyIG9mIGJpdHMgdG8gZXh0cmFjdCBmcm9tIHRoZSBiaXRzdHJlYW0KLSAqIEByZXR1cm4gIHRoZSByZWFkIGJpdHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXN0YXRpYyBNNE9TQV9VSW50MzIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyU2hvd0JpdHModm9pZCogcENvbnRleHQsCi0gICAgICAgIE00T1NBX0ludDMyIGxlbmd0aCkgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQqIHBTdHJlYW1Db250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQqKXBDb250ZXh0OwotCi0gICAgTTRPU0FfVUludDMyIHVfbWFzazsKLSAgICBNNE9TQV9VSW50MzIgcmV0dmFsOwotICAgIE00T1NBX0ludDMyIGlfb3ZmOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMPT1wU3RyZWFtQ29udGV4dCksIDAsCi0gICAgICAgICJWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJTaG93Qml0czppbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgcmV0dmFsPShNNE9TQV9VSW50MzIpR0VUX01FTU9SWTMyKHBTdHJlYW1Db250ZXh0LT5cCi0gICAgICAgIG1QYml0U3RyZWFtWyBwU3RyZWFtQ29udGV4dC0+bUluZGV4IF0pOwotICAgIGlfb3ZmID0gcFN0cmVhbUNvbnRleHQtPm1CaXRJbmRleCArIGxlbmd0aCAtIDMyOwotICAgIHVfbWFzayA9IChsZW5ndGggPj0gMzIpID8gMHhmZmZmZmZmZjogKDEgPDwgbGVuZ3RoKSAtIDE7Ci0KLSAgICAvKiBkbyB3ZSBoYXZlIGVub3VnaCBiaXRzIGF2YWlsYmxlIGluIHRoZSBjdXJyZW50IHdvcmQoMzJiaXRzKSovCi0gICAgaWYgKGlfb3ZmIDw9IDApIHsKLSAgICAgICAgcmV0dmFsPShyZXR2YWwgPj4gKC0gaV9vdmYpKSAmIHVfbWFzazsKLSAgICB9IGVsc2UgewotICAgICAgICBNNE9TQV9VSW50MzIgdV9uZXh0d29yZCA9IChNNE9TQV9VSW50MzIpR0VUX01FTU9SWTMyKAotICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1QYml0U3RyZWFtWyBwU3RyZWFtQ29udGV4dC0+bUluZGV4ICsgMSBdKTsKLSAgICAgICAgTTRPU0FfVUludDMyIHVfbXNiX21hc2ssIHVfbXNiX3ZhbHVlLCB1X2xzYl9tYXNrLCB1X2xzYl92YWx1ZTsKLQotICAgICAgICB1X21zYl9tYXNrID0gKCgxIDw8ICgzMiAtIHBTdHJlYW1Db250ZXh0LT5tQml0SW5kZXgpKSAtIDEpIDw8IGlfb3ZmOwotICAgICAgICB1X21zYl92YWx1ZSA9IHJldHZhbCA8PCBpX292ZjsKLSAgICAgICAgdV9sc2JfbWFzayA9ICgxIDw8IGlfb3ZmKSAtIDE7Ci0gICAgICAgIHVfbHNiX3ZhbHVlID0gdV9uZXh0d29yZCA+PiAoMzIgLSBpX292Zik7Ci0gICAgICAgIHJldHZhbD0gKHVfbXNiX3ZhbHVlICYgdV9tc2JfbWFzayApIHwgKHVfbHNiX3ZhbHVlICYgdV9sc2JfbWFzayk7Ci0gICAgfQotICAgIC8qIHJldHVybiB0aGUgYml0cy4uLiovCi0gICAgcmV0dXJuIHJldHZhbDsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgSW5jcmVtZW50IHRoZSBiaXRzdHJlYW0gcG9pbnRlciBvZiA8bGVuZ3RoPiBiaXRzLgotICogQHBhcmFtICAgcENvbnRleHQgICAgKElOL09VVCkgQml0U3RyZWFtUGFyc2VyIGNvbnRleHQuCi0gKiBAcGFyYW0gICBsZW5ndGggICAgICAoSU4pIFRoZSBudW1iZXIgb2YgYml0IHRvIHNoaWZ0IHRoZSBiaXRzdHJlYW0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1zdGF0aWMgdm9pZCBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHModm9pZCogcENvbnRleHQsCi0gICAgICAgIE00T1NBX0ludDMyIGxlbmd0aCkgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQqIHBTdHJlYW1Db250ZXh0PSgKLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfSW50MzIgdmFsOwotCi0gICAgaWYgKE00T1NBX05VTEwgPT0gcFN0cmVhbUNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICB2YWw9cFN0cmVhbUNvbnRleHQtPm1CaXRJbmRleCArIGxlbmd0aDsKLSAgICAvKiB1cGRhdGUgdGhlIGJpdHMuLi4qLwotICAgIHBTdHJlYW1Db250ZXh0LT5tQml0SW5kZXggKz0gbGVuZ3RoOwotCi0gICAgaWYgKHZhbCAtIDMyID49IDApIHsKLSAgICAgICAgLyogdXBkYXRlIHRoZSBiaXRzLi4uKi8KLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1CaXRJbmRleCAtPSAzMjsKLSAgICAgICAgLyogdXBkYXRlIHRoZSB3b3JkcyovCi0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tSW5kZXgrKzsKLSAgICB9Ci19Ci0KLXN0YXRpYyBNNE9TQV9VSW50MzIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyR2V0Qml0cygKLSAgICAgICAgdm9pZCogcENvbnRleHQsTTRPU0FfSW50MzIgYml0UG9zLCBNNE9TQV9JbnQzMiBiaXRMZW5ndGgpIHsKLSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJDb250ZXh0KiBwU3RyZWFtQ29udGV4dCA9Ci0gICAgICAgIChWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJDb250ZXh0KilwQ29udGV4dDsKLQotICAgIE00T1NBX0ludDMyIGJpdExvY2F0aW9uLCBiaXRJbmRleDsKLSAgICBNNE9TQV9VSW50MzIgcmV0dmFsPTA7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEw9PXBTdHJlYW1Db250ZXh0KSwgMCwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckdldEJpdHM6IGludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICAvKiBjb21wdXRlcyB0aGUgd29yZCBsb2NhdGlvbiovCi0gICAgYml0TG9jYXRpb249Yml0UG9zLzMyOwotICAgIGJpdEluZGV4PShiaXRQb3MpICUgMzI7Ci0KLSAgICBpZiAoYml0TG9jYXRpb24gPCBwU3RyZWFtQ29udGV4dC0+bVNpemUpIHsKLSAgICAgICAgTTRPU0FfVUludDMyIHVfbWFzazsKLSAgICAgICAgTTRPU0FfSW50MzIgaV9vdmYgPSBiaXRJbmRleCArIGJpdExlbmd0aCAtIDMyOwotICAgICAgICByZXR2YWw9KE00T1NBX1VJbnQzMilHRVRfTUVNT1JZMzIoCi0gICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+bVBiaXRTdHJlYW1bIGJpdExvY2F0aW9uIF0pOwotCi0gICAgICAgIHVfbWFzayA9IChiaXRMZW5ndGggPj0gMzIpID8gMHhmZmZmZmZmZjogKDEgPDwgYml0TGVuZ3RoKSAtIDE7Ci0KLSAgICAgICAgaWYgKGlfb3ZmIDw9IDApIHsKLSAgICAgICAgICAgIHJldHZhbD0ocmV0dmFsID4+ICgtIGlfb3ZmKSkgJiB1X21hc2s7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBNNE9TQV9VSW50MzIgdV9uZXh0d29yZCA9IChNNE9TQV9VSW50MzIpR0VUX01FTU9SWTMyKAotICAgICAgICAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5tUGJpdFN0cmVhbVsgYml0TG9jYXRpb24gKyAxIF0pOwotICAgICAgICAgICAgTTRPU0FfVUludDMyIHVfbXNiX21hc2ssIHVfbXNiX3ZhbHVlLCB1X2xzYl9tYXNrLCB1X2xzYl92YWx1ZTsKLQotICAgICAgICAgICAgdV9tc2JfbWFzayA9ICgoMSA8PCAoMzIgLSBiaXRJbmRleCkpIC0gMSkgPDwgaV9vdmY7Ci0gICAgICAgICAgICB1X21zYl92YWx1ZSA9IHJldHZhbCA8PCBpX292ZjsKLSAgICAgICAgICAgIHVfbHNiX21hc2sgPSAoMSA8PCBpX292ZikgLSAxOwotICAgICAgICAgICAgdV9sc2JfdmFsdWUgPSB1X25leHR3b3JkID4+ICgzMiAtIGlfb3ZmKTsKLSAgICAgICAgICAgIHJldHZhbD0gKHVfbXNiX3ZhbHVlICYgdV9tc2JfbWFzayApIHwgKHVfbHNiX3ZhbHVlICYgdV9sc2JfbWFzayk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIHZvaWQgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyUmVzdGFydCh2b2lkKiBwQ29udGV4dCkgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQqIHBTdHJlYW1Db250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQqKXBDb250ZXh0OwotCi0gICAgaWYgKE00T1NBX05VTEwgPT0gcFN0cmVhbUNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvKiByZXNldHMgdGhlIGJpdHN0cmVhbSBwb2ludGVycyovCi0gICAgcFN0cmVhbUNvbnRleHQtPm1JbmRleD0wOwotICAgIHBTdHJlYW1Db250ZXh0LT5tQml0SW5kZXg9MDsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgR2V0IGEgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIHBvaW50ZWQgYnkgdGhlIGJpdHN0cmVhbSBwb2ludGVyLgotICogQG5vdGUgICBJdCBzaG91bGQgYmUgdXNlZCBjYXJlZnVsbHkgYXMgdGhlIHBvaW50ZXIgaXMgaW4gdGhlIGJpdHN0cmVhbSBpdHNlbGYKLSAqICAgICAgICAgYW5kIG5vIGNvcHkgaXMgbWFkZS4KLSAqIEBwYXJhbSAgcENvbnRleHQgICAgKElOL09VVCkgIEJpdFN0cmVhbVBhcnNlciBjb250ZXh0LgotICogQHJldHVybiBQb2ludGVyIHRvIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIHRoZSBiaXRzdHJlYW0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotc3RhdGljIE00T1NBX1VJbnQ4KiAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfR2V0Q3VycmVudGJpdFN0cmVhbVBvaW50ZXIoCi0gICAgICAgIHZvaWQqIHBDb250ZXh0KSB7Ci0gICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ29udGV4dCogcFN0cmVhbUNvbnRleHQgPQotICAgICAgICAoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMPT1wU3RyZWFtQ29udGV4dCksIDAsICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgcmV0dXJuIChNNE9TQV9VSW50OCopKChNNE9TQV9VSW50OCopcFN0cmVhbUNvbnRleHQtPm1QYml0U3RyZWFtICsgXAotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bUluZGV4ICogc2l6ZW9mKE00T1NBX1VJbnQzMikgKyBcCi0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tQml0SW5kZXgvOCkgOwotfQotCi1zdGF0aWMgTTRPU0FfSW50MzIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyR2V0U2l6ZSh2b2lkKiBwQ29udGV4dCkgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQqIHBTdHJlYW1Db250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTD09cFN0cmVhbUNvbnRleHQpLCAwLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIHJldHVybiBwU3RyZWFtQ29udGV4dC0+bVNpemU7Ci19Ci0KLQotc3RhdGljIHZvaWQgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfTVBFRzRCaXRTdHJlYW1QYXJzZXJJbml0KHZvaWQqKiBwQ29udGV4dCwKLSAgICAgICAgdm9pZCogcEJpdFN0cmVhbSwgTTRPU0FfSW50MzIgc2l6ZSkgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckluaXQocENvbnRleHQsIHBCaXRTdHJlYW0sIHNpemUpOwotfQotc3RhdGljIE00T1NBX0ludDMyIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0dldE1wZWdMZW5ndGhGcm9tSW50ZWdlcih2b2lkKiBwQ29udGV4dCwKLSAgICAgICAgTTRPU0FfVUludDMyIHZhbCkgewotICAgIE00T1NBX1VJbnQzMiBsZW5ndGg9MDsKLSAgICBNNE9TQV9VSW50MzIgbnVtQnl0ZXM9MDsKLSAgICBNNE9TQV9VSW50MzIgYj0wOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMPT1wQ29udGV4dCksIDAsICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgLyogdGhlIGxlbmd0aCBpcyBlbmNvZGVkIGFzIGEgc2VxdWVuY2Ugb2YgYnl0ZXMuIFRoZSBoaWdoZXN0IGJpdCBpcyB1c2VkCi0gICAgdG8gaW5kaWNhdGUgdGhhdCB0aGUgbGVuZ3RoIGNvbnRpbnVlcyBvbiB0aGUgbmV4dCBieXRlLgotCi0gICAgVGhlIGxlbmd0aCBjYW4gYmU6IDB4ODAgMHg4MCAweDgwIDB4MjIKLSAgICBvZiBqdXN0ICAgICAgICAgICAgMHgyMiAoaGlnaGVzdCBiaXQgbm90IHNldCkKLQotICAgICovCi0KLSAgICBkbyB7Ci0gICAgICAgIGI9KHZhbCAmICgoMHhmZik8PCAoOCAqIG51bUJ5dGVzKSkpPj4gKDggKiBudW1CeXRlcyk7Ci0gICAgICAgIGxlbmd0aD0obGVuZ3RoIDw8IDcpIHwgKGIgJiAweDdmKTsKLSAgICAgICAgbnVtQnl0ZXMrKzsKLSAgICB9IHdoaWxlICgoYiAmIDB4ODApICYmIG51bUJ5dGVzIDwgNCk7Ci0KLSAgICByZXR1cm4gbGVuZ3RoOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgIERlY29kZSBhbiBNUEVHNCBTeXN0ZW1zIGRlc2NyaXB0b3Igc2l6ZSBmcm9tIGFuIGVuY29kZWQgU0RMIHNpemUgZGF0YQotICogQG5vdGUgICBUaGUgdmFsdWUgaXMgcmVhZCBmcm9tIHRoZSBjdXJyZW50IGJpdHN0cmVhbSBsb2NhdGlvbi4KLSAqIEBwYXJhbSAgcENvbnRleHQgICAgKElOL09VVCkgIEJpdFN0cmVhbVBhcnNlciBjb250ZXh0LgotICogQHJldHVybiBTaXplIGluIGEgaHVtYW4gcmVhZGFibGUgZm9ybQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1zdGF0aWMgTTRPU0FfSW50MzIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfR2V0TXBlZ0xlbmd0aEZyb21TdHJlYW0odm9pZCogcENvbnRleHQpewotICAgIE00T1NBX1VJbnQzMiBsZW5ndGg9MDsKLSAgICBNNE9TQV9VSW50MzIgbnVtQnl0ZXM9MDsKLSAgICBNNE9TQV9VSW50MzIgYj0wOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMPT1wQ29udGV4dCksIDAsICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgLyogdGhlIGxlbmd0aCBpcyBlbmNvZGVkIGFzIGEgc2VxdWVuY2Ugb2YgYnl0ZXMuIFRoZSBoaWdoZXN0IGJpdCBpcyB1c2VkCi0gICAgdG8gaW5kaWNhdGUgdGhhdCB0aGUgbGVuZ3RoIGNvbnRpbnVlcyBvbiB0aGUgbmV4dCBieXRlLgotCi0gICAgVGhlIGxlbmd0aCBjYW4gYmU6IDB4ODAgMHg4MCAweDgwIDB4MjIKLSAgICBvZiBqdXN0ICAgICAgICAgICAgMHgyMiAoaGlnaGVzdCBiaXQgbm90IHNldCkKLSAgICAqLwotCi0gICAgZG8gewotICAgICAgICBiPVZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlclNob3dCaXRzKHBDb250ZXh0LCA4KTsKLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyRmx1c2hCaXRzKHBDb250ZXh0LCA4KTsKLSAgICAgICAgbGVuZ3RoPShsZW5ndGggPDwgNykgfCAoYiAmIDB4N2YpOwotICAgICAgICBudW1CeXRlcysrOwotICAgIH0gd2hpbGUgKChiICYgMHg4MCkgJiYgbnVtQnl0ZXMgPCA0KTsKLQotICAgIHJldHVybiBsZW5ndGg7Ci19Ci0jZW5kaWYgLyogVklERU9FRElUT1JfQklUU1RSRUFNX1BBUlNFUiAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgM2dwIHJlYWRlcgotICogQG5vdGUgICAgYWxsb2NhdGVzIHRoZSBjb250ZXh0Ci0gKgotICogQHBhcmFtICAgcENvbnRleHQ6ICAgICAgIChPVVQpICAgcG9pbnRlciBvbiBhIHJlYWRlciBjb250ZXh0Ci0gKgotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DICAgICAgICAgICAgIGEgbWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgdmFsaWQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yM2dwUmVhZGVyX2NyZWF0ZShNNE9TQV9Db250ZXh0ICpwQ29udGV4dCkgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQqIHBDID0gTlVMTDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0ICwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9jcmVhdGUgYmVnaW4iKTsKLQotICAgIC8qIENvbnRleHQgYWxsb2NhdGlvbiAmIGluaXRpYWxpemF0aW9uICovCi0gICAgU0FGRV9NQUxMT0MocEMsIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQsIDEsICJWaWRlb0VkaXRvcjNncFJlYWRlciIpOwotCi0gICAgbWVtc2V0KHBDLCBzaXplb2YoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCksIDApOwotCi0gICAgcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXIgID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bUF1ZGlvQXUuZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyICA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm1WaWRlb0F1LmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLQotICAgIHBDLT5tQXVkaW9TZWVraW5nID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPm1BdWRpb1NlZWtUaW1lID0gMDsKLQotICAgIHBDLT5tVmlkZW9TZWVraW5nID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPm1WaWRlb1NlZWtUaW1lID0gMDsKLQotICAgIHBDLT5tTWF4RHVyYXRpb24gPSAwOwotCi0gICAgKnBDb250ZXh0PXBDOwotCi1jbGVhblVwOgotICAgIGlmICggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9jcmVhdGUgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfY3JlYXRlIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfY3JlYXRlIGVuZCAiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiAgICBkZXN0cm95IHRoZSBpbnN0YW5jZSBvZiB0aGUgM2dwIHJlYWRlcgotKiBAbm90ZSBhZnRlciB0aGlzIGNhbGwgdGhlIGNvbnRleHQgaXMgaW52YWxpZAotKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0qIEByZXR1cm4gICBNNE5PX0VSUk9SICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgcENvbnRleHQgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZGVzdHJveShNNE9TQV9Db250ZXh0IHBDb250ZXh0KSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCogcEMgPSBNNE9TQV9OVUxMOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2Rlc3Ryb3kgYmVnaW4iKTsKLQotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgcEMgPSAoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBTQUZFX0ZSRUUocEMtPm1BdWRpb0F1LmRhdGFBZGRyZXNzKTsKLSAgICBwQy0+bUF1ZGlvQXUuZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIFNBRkVfRlJFRShwQy0+bVZpZGVvQXUuZGF0YUFkZHJlc3MpOwotICAgIHBDLT5tVmlkZW9BdS5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgU0FGRV9GUkVFKHBDKTsKLSAgICBwQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZGVzdHJveSBubyBlcnJvciIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZGVzdHJveSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZGVzdHJveSBlbmQgIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgIG9wZW4gdGhlIHJlYWRlciBhbmQgaW5pdGlhbGl6ZXMgaXRzIGNyZWF0ZWQgaW5zdGFuY2UKLSogQG5vdGUgICAgIHRoaXMgZnVuY3Rpb24gb3BlbiB0aGUgbWVkaWEgZmlsZQotKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotKiBAcGFyYW0gICAgcEZpbGVEZXNjcmlwdG9yOiAgICAoSU4pICAgIFBvaW50ZXIgdG8gcHJvcHJpZXRhcnkgZGF0YSBpZGVudGlmeWluZwotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtZWRpYSB0byBvcGVuCi0qIEByZXR1cm4gICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgICB0aGUgY29udGV4dCBpcyBOVUxMCi0qIEByZXR1cm4gICBNNEVSUl9VTlNVUFBPUlRFRF9NRURJQV9UWVBFCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1lZGlhIGlzIERSTSBwcm90ZWN0ZWQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yM2dwUmVhZGVyX29wZW4oTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgTTRPU0FfVm9pZCogcEZpbGVEZXNjcmlwdG9yKSB7Ci0gICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCogcEMgPSAoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfb3BlbiBzdGFydCAiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfb3BlbjogaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEZpbGVEZXNjcmlwdG9yKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfb3BlbjogaW52YWxpZCBwb2ludGVyIHBGaWxlRGVzY3JpcHRvciIpOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX29wZW4gRGF0YXNvdXJjZSBzdGFydCAlcyIsCi0gICAgICAgIChjaGFyKilwRmlsZURlc2NyaXB0b3IpOwotICAgIC8vcEMtPm1EYXRhU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSSgoY2hhciopcEZpbGVEZXNjcmlwdG9yKTsKLSAgICBwQy0+bURhdGFTb3VyY2UgPSBuZXcgRmlsZVNvdXJjZSAoKGNoYXIqKXBGaWxlRGVzY3JpcHRvcik7Ci0KLSAgICBpZiAocEMtPm1EYXRhU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX29wZW4gRGF0YXNvdXJjZSBlcnJvciIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIHBDLT5tRXh0cmFjdG9yID0gTWVkaWFFeHRyYWN0b3I6OkNyZWF0ZShwQy0+bURhdGFTb3VyY2UsCi0gICAgICAgIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHNCk7Ci0KLSAgICBpZiAocEMtPm1FeHRyYWN0b3IgPT0gTlVMTCkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfb3BlbiBleHRyYWN0b3IgZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpbnQzMl90IGlzRFJNUHJvdGVjdGVkID0gMDsKLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IHBDLT5tRXh0cmFjdG9yLT5nZXRNZXRhRGF0YSgpOwotICAgIG1ldGEtPmZpbmRJbnQzMihrS2V5SXNEUk0sICZpc0RSTVByb3RlY3RlZCk7Ci0gICAgaWYgKGlzRFJNUHJvdGVjdGVkKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9vcGVuIGVycm9yIC0gRFJNIFByb3RlY3RlZCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfVU5TVVBQT1JURURfTUVESUFfVFlQRTsKLSAgICB9Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfb3BlbiBlbmQgIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgIGNsb3NlIHRoZSByZWFkZXIKLSogQG5vdGUgICAgIGNsb3NlIHRoZSAzR1AgZmlsZQotKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0qIEByZXR1cm4gICBNNE5PX0VSUk9SICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgdGhlIGNvbnRleHQgaXMgTlVMTAotKiBAcmV0dXJuICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWaWRlb0VkaXRvcjNncFJlYWRlcl9jbG9zZShNNE9TQV9Db250ZXh0IGNvbnRleHQpIHsKLSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0ICpwQyA9IChWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00UkVBREVSX0F1ZGlvU2JyVXNlcmRhdGEgKnBBdWRpb1NiclVzZXJEYXRhOwotICAgIE00X0FjY2Vzc1VuaXQgKnBBVTsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9jbG9zZSBiZWdpbiIpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfY2xvc2U6IGludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBpZiAocEMtPm1BdWRpb1N0cmVhbUhhbmRsZXIpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2Nsb3NlIEF1ZGlvIik7Ci0KLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fcERlY29kZXJTcGVjaWZpY0luZm8pIHsKLSAgICAgICAgICAgIGZyZWUocEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPlwKLSAgICAgICAgICAgICAgICBtX3BEZWNvZGVyU3BlY2lmaWNJbmZvKTsKLSAgICAgICAgICAgIHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMDsKLSAgICAgICAgICAgIHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgoTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgPT0gcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICYmIChNNE9TQV9OVUxMICE9IHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3BVc2VyRGF0YSkpIHsKLSAgICAgICAgICAgIHBBdWRpb1NiclVzZXJEYXRhID0gKE00UkVBREVSX0F1ZGlvU2JyVXNlcmRhdGEqKShcCi0gICAgICAgICAgICAgICAgcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fcFVzZXJEYXRhKTsKLQotICAgICAgICAgICAgcEFVID0gKE00X0FjY2Vzc1VuaXQqKXBBdWRpb1NiclVzZXJEYXRhLT5tX3BGaXJzdEFVOwotICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcEFVKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShwQVUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQXVkaW9TYnJVc2VyRGF0YS0+bV9wQWFjRGVjb2RlclVzZXJDb25maWcpIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBBdWRpb1NiclVzZXJEYXRhLT5cCi0gICAgICAgICAgICAgICAgICAgIG1fcEFhY0RlY29kZXJVc2VyQ29uZmlnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZyZWUocEF1ZGlvU2JyVXNlckRhdGEpOwotICAgICAgICAgICAgcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fcFVzZXJEYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwQy0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9wRVNEU0luZm8gIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgZnJlZShwQy0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9wRVNEU0luZm8pOwotICAgICAgICAgICAgcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fcEVTRFNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX0VTRFNJbmZvU2l6ZSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgLyogRmluYWxseSBkZXN0cm95IHRoZSBzdHJlYW0gaGFuZGxlciAqLwotICAgICAgICBmcmVlKHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyKTsKLSAgICAgICAgcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXIgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIHBDLT5tQXVkaW9Tb3VyY2UtPnN0b3AoKTsKLSAgICAgICAgcEMtPm1BdWRpb1NvdXJjZS5jbGVhcigpOwotICAgIH0KLSAgICBpZiAocEMtPm1WaWRlb1N0cmVhbUhhbmRsZXIpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2Nsb3NlIFZpZGVvICIpOwotCi0gICAgICAgIGlmKE00T1NBX05VTEwgIT0gcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXItPm1fcERlY29kZXJTcGVjaWZpY0luZm8pIHsKLSAgICAgICAgICAgIGZyZWUocEMtPm1WaWRlb1N0cmVhbUhhbmRsZXItPlwKLSAgICAgICAgICAgICAgICBtX3BEZWNvZGVyU3BlY2lmaWNJbmZvKTsKLSAgICAgICAgICAgIHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMDsKLSAgICAgICAgICAgIHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKE00T1NBX05VTEwgIT0gcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXItPm1fcEgyNjREZWNvZGVyU3BlY2lmaWNJbmZvKSB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5cCi0gICAgICAgICAgICAgICAgbV9wSDI2NERlY29kZXJTcGVjaWZpY0luZm8pOwotICAgICAgICAgICAgcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXItPm1fSDI2NGRlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMDsKLSAgICAgICAgICAgIHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5tX3BIMjY0RGVjb2RlclNwZWNpZmljSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+bV9wRVNEU0luZm8gIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgZnJlZShwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+bV9wRVNEU0luZm8pOwotICAgICAgICAgICAgcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXItPm1fcEVTRFNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5tX0VTRFNJbmZvU2l6ZSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBGaW5hbGx5IGRlc3Ryb3kgdGhlIHN0cmVhbSBoYW5kbGVyICovCi0gICAgICAgIGZyZWUocEMtPm1WaWRlb1N0cmVhbUhhbmRsZXIpOwotICAgICAgICBwQy0+bVZpZGVvU3RyZWFtSGFuZGxlciA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgcEMtPm1WaWRlb1NvdXJjZS0+c3RvcCgpOwotICAgICAgICBwQy0+bVZpZGVvU291cmNlLmNsZWFyKCk7Ci0gICAgfQotICAgIHBDLT5tRXh0cmFjdG9yLmNsZWFyKCk7Ci0gICAgcEMtPm1EYXRhU291cmNlLmNsZWFyKCk7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfY2xvc2UgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgIGdldCBhbiBvcHRpb24gZnJvbSB0aGUgM2dwIHJlYWRlcgotKiBAbm90ZSAgICAgaXQgYWxsb3dzIHRoZSBjYWxsZXIgdG8gcmV0cmlldmUgYSBwcm9wZXJ0eSB2YWx1ZToKLSoKLSogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotKiBAcGFyYW0gICAgb3B0aW9uSWQ6ICAgICAgIChJTikgICAgaW5kaWNhdGVzIHRoZSBvcHRpb24gdG8gZ2V0Ci0qIEBwYXJhbSAgICBwVmFsdWU6ICAgICAgICAgKE9VVCkgICBwb2ludGVyIHRvIHN0cnVjdHVyZSBvciB2YWx1ZSAoYWxsb2NhdGVkCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSB1c2VyKSB3aGVyZSBvcHRpb24gaXMgc3RvcmVkCi0qCi0qIEByZXR1cm4gICBNNE5PX0VSUk9SICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJuICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotKiBAcmV0dXJuICAgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgd2hlbiB0aGUgb3B0aW9uIElEIGlzIG5vdCBhIHZhbGlkIG9uZQotKiBAcmV0dXJuICAgTTRFUlJfVklERU9fTk9UX0gyNjMgICAgTm8gdmlkZW8gc3RyZWFtIEgyNjMgaW4gZmlsZS4KLSogQHJldHVybiAgIE00RVJSX05PX1ZJREVPX1NUUkVBTV9SRVRSSUVWRURfWUVUCi0qICAgICAgICAgICBGdW5jdGlvbiAzZ3BSZWFkZXJfZ2V0TmV4dFN0cmVhbUhhbmRsZXIgbXVzdCBiZSBjYWxsZWQgYmVmb3JlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsIE00T1NBX0RhdGFPcHRpb24gcFZhbHVlKSB7Ci0gICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCogcEMgPSAoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRPcHRpb24gYmVnaW4gJWQiLCBvcHRpb25JZCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwVmFsdWUpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRPcHRpb246IGludmFsaWQgcG9pbnRlciBvbiB2YWx1ZSIpOwotCi0gICAgc3dpdGNoIChvcHRpb25JZCkgewotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0R1cmF0aW9uOgotICAgICAgICB7Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uIGR1cmF0aW9uICVkIixwQy0+bU1heER1cmF0aW9uKTsKLSAgICAgICAgICAgICooTTRPU0FfVGltZSopcFZhbHVlID0gcEMtPm1NYXhEdXJhdGlvbjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9WZXJzaW9uOgotICAgICAgICAvKiBub3QgdXNlZCAqLwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uOiBNNFJFQURFUl9rT3B0aW9uSURfVmVyc2lvbiIpOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0NvcHlyaWdodDoKLSAgICAgICAgLyogbm90IHVzZWQgKi8KLSAgICAgICAgQUxPR1YoIj4+Pj4+Pj4gICBNNFJFQURFUl9rT3B0aW9uSURfQ29weXJpZ2h0Iik7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfQ3JlYXRpb25UaW1lOgotICAgICAgICAvKiBub3QgdXNlZCAqLwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uIE00UkVBREVSX2tPcHRpb25JRF9DcmVhdGlvblRpbWUiKTsKLSAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0JpdHJhdGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiogcEJpdHJhdGUgPSAoTTRPU0FfVUludDMyKilwVmFsdWU7Ci0KLSAgICAgICAgICAgIGlmIChwQy0+bU1heER1cmF0aW9uICE9IDApIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWkzMlRtcCA9IChNNE9TQV9VSW50MzIpcEMtPm1NYXhEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAqcEJpdHJhdGUgPSAoTTRPU0FfVUludDMyKShwQy0+bUZpbGVTaXplICogODAwMC4wIC8gcEMtPm1NYXhEdXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uIGJpdHJhdGUgJWxkIiwgKnBCaXRyYXRlKTsKLSAgICAgICAgfQotICAgIGJyZWFrOwotICAgIGNhc2UgTTRSRUFERVJfM0dQX2tPcHRpb25JRF9IMjYzUHJvcGVydGllczoKLSAgICAgICAgewotICAgICAgICAgICAgaWYoTTRPU0FfTlVMTCA9PSBwQy0+bVZpZGVvU3RyZWFtSGFuZGxlcikgewotICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRPcHRpb24gbm8gdmlkZW9TdHJlYW0gcmV0cmlldmVkIik7Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9OT19WSURFT19TVFJFQU1fUkVUUklFVkVEX1lFVDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKChNNERBX1N0cmVhbVR5cGVWaWRlb0gyNjMgIT0gcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXItPlwKLSAgICAgICAgICAgICAgICBtX3N0cmVhbVR5cGUpIHx8IChwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+XAotICAgICAgICAgICAgICAgIG1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPCA3KSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRPcHRpb24gRFNJIFNpemUgJWQiLAotICAgICAgICAgICAgICAgICAgICBwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9WSURFT19OT1RfSDI2MzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogTUFHSUNBTCBpbiB0aGUgZGVjb2RlciBjb25maSBIMjYzOiB0aGUgN3RoIGJ5dGUgaXMgdGhlIHByb2ZpbGUKLSAgICAgICAgICAgICAqIG51bWJlciwgNnRoIGJ5dGUgaXMgdGhlIGxldmVsIG51bWJlciAqLwotICAgICAgICAgICAgKChNNFJFQURFUl8zR1BfSDI2M1Byb3BlcnRpZXMgKilwVmFsdWUpLT51aVByb2ZpbGUgPQotICAgICAgICAgICAgICAgIHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvWzZdOwotICAgICAgICAgICAgKChNNFJFQURFUl8zR1BfSDI2M1Byb3BlcnRpZXMgKilwVmFsdWUpLT51aUxldmVsID0KLSAgICAgICAgICAgICAgICBwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+bV9wRGVjb2RlclNwZWNpZmljSW5mb1s1XTsKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRPcHRpb24gTTRSRUFERVJfM0dQX2tPcHRpb25JRF9cCi0gICAgICAgICAgICBIMjYzUHJvcGVydGllcyBlbmQiKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00UkVBREVSXzNHUF9rT3B0aW9uSURfUHVycGxlTGFic0RybToKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyT3B0aW9uIE00UkVBREVSXzNHUF9rT3B0aW9uSURfUHVycGxlTGFic0RybSIpOwotICAgICAgICAvKiBub3QgdXNlZCAqLwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0dldE51bWJlck9mQXVkaW9BdToKLSAgICAgICAgLyogbm90IHVzZWQgKi8KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVPcHRpb24gTTRSRUFERVJfa09wdGlvbklEX0dldE51bWJlck9mQXVkaW9BdSIpOwotICAgIGJyZWFrOwotCi0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfR2V0TnVtYmVyT2ZWaWRlb0F1OgotICAgICAgICAvKiBub3QgdXNlZCAqLwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uIDpHZXROdW1iZXJPZlZpZGVvQXUiKTsKLSAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0dldE1ldGFkYXRhOgotICAgICAgICAvKiBub3QgdXNlZCAqLwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uIE00UkVBREVSX2tPcHRpb25JRF9HZXRNZXRhZGF0YSIpOwotICAgIGJyZWFrOwotCi0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfM2dwRnR5cEJveDoKLSAgICAgICAgLyogdXNlZCBvbmx5IGZvciBTRU1DICovCi0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRPcHRpb24gTTRSRUFERVJfa09wdGlvbklEXzNncEZ0eXBCb3giKTsKLSAgICAgICAgZXJyID0gTTRFUlJfQkFEX09QVElPTl9JRDsgLy9jaGVjayB0aGlzCi0gICAgICAgIGJyZWFrOwotCi0jaWZkZWYgT1BUSU9OSURfR0VUX05FWFRfVklERU9fQ1RTCi0gICAgY2FzZSBNNFJFQURFUl8zR1Bfa09wdGlvbklEX2dldE5leHRWaWRlb0NUUzoKLSAgICAgICAgLyogbm90IHVzZWQgKi8KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE9wdGlvbjogZ2V0TmV4dFZpZGVvQ1RTIik7Ci0gICAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgZGVmYXVsdDoKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRFUlJfQkFEX09QVElPTl9JRDsKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRPcHRpb24gTTRFUlJfQkFEX09QVElPTl9JRCIpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uIGVuZDogb3B0aW9uSUQ6IHgleCIsIG9wdGlvbklkKTsKLSAgICByZXR1cm4gZXJyOwotfQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgIHNldCBhbiBvcHRpb24gb24gdGhlIDNncCByZWFkZXIKLSogQG5vdGUgTm8gb3B0aW9uIGNhbiBiZSBzZXQgeWV0LgotKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0qIEBwYXJhbSAgICBvcHRpb25JZDogICAgICAgKElOKSAgICBpbmRpY2F0ZXMgdGhlIG9wdGlvbiB0byBzZXQKLSogQHBhcmFtICAgIHBWYWx1ZTogICAgICAgICAoSU4pICAgIHBvaW50ZXIgdG8gc3RydWN0dXJlIG9yIHZhbHVlIChhbGxvY2F0ZWQKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHVzZXIpIHdoZXJlIG9wdGlvbiBpcyBzdG9yZWQKLSogQHJldHVybiAgIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm4gICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0qIEByZXR1cm4gICBNNEVSUl9CQURfT1BUSU9OX0lEICAgICB3aGVuIHRoZSBvcHRpb24gSUQgaXMgbm90IGEgdmFsaWQgb25lCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfc2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsIE00T1NBX0RhdGFPcHRpb24gcFZhbHVlKSB7Ci0gICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCogcEMgPSAoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwVmFsdWUpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIHZhbHVlIHBvaW50ZXIiKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9zZXRPcHRpb24gYmVnaW4gJWQiLG9wdGlvbklkKTsKLQotICAgIHN3aXRjaChvcHRpb25JZCkgewotICAgICAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9TZXRPc2FGaWxlUmVhZGVyRmN0c1B0cjoKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBzdGF0aWNfY2FzdDxNNE9TQV9PcHRpb25JRD4oTTRSRUFERVJfM0dQX2tPcHRpb25JRF9BdWRpb09ubHkpOgotICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIHN0YXRpY19jYXN0PE00T1NBX09wdGlvbklEPihNNFJFQURFUl8zR1Bfa09wdGlvbklEX1ZpZGVvT25seSk6Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2Ugc3RhdGljX2Nhc3Q8TTRPU0FfT3B0aW9uSUQ+KE00UkVBREVSXzNHUF9rT3B0aW9uSURfRmFzdE9wZW5Nb2RlKToKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBzdGF0aWNfY2FzdDxNNE9TQV9PcHRpb25JRD4oTTRSRUFERVJfa09wdGlvbklEX01heE1ldGFkYXRhU2l6ZSk6Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9zZXRPcHRpb246IHJldHVybnMgTTRFUlJfQkFEX09QVElPTl9JRCIpOwotICAgICAgICAgICAgZXJyID0gTTRFUlJfQkFEX09QVElPTl9JRDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX3NldE9wdGlvbiBlbmQgIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgZmlsbCB0aGUgYWNjZXNzIHVuaXQgc3RydWN0dXJlIHdpdGggaW5pdGlhbGl6YXRpb24gdmFsdWVzCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgICAgICAgKElOKSAgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICBwU3RyZWFtSGFuZGxlcjogKElOKSAgICAgcG9pbnRlciB0byB0aGUgc3RyZWFtIGhhbmRsZXIgdG8gd2hpY2gKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYWNjZXNzIHVuaXQgd2lsbCBiZSBhc3NvY2lhdGVkCi0gKiBAcGFyYW0gICBwQWNjZXNzVW5pdDogICAgKElOL09VVCkgcG9pbnRlciB0byB0aGUgYWNjZXNzIHVuaXQgKGFsbG9jYXRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBjYWxsZXIpIHRvIGluaXRpYWxpemUKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWaWRlb0VkaXRvcjNncFJlYWRlcl9maWxsQXVTdHJ1Y3QoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwgTTRfQWNjZXNzVW5pdCAqcEFjY2Vzc1VuaXQpIHsKLSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0KiBwQyA9IChWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI9IE00Tk9fRVJST1I7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDID09IDApLCAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvcjNncFJlYWRlcl9maWxsQXVTdHJ1Y3Q6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2ZpbGxBdVN0cnVjIGludmFsaWQgcG9pbnRlciB0byBNNF9TdHJlYW1IYW5kbGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwQWNjZXNzVW5pdCA9PSAwKSwgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZmlsbEF1U3RydWN0OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfQWNjZXNzVW5pdCIpOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2ZpbGxBdVN0cnVjdCBiZWdpbiIpOwotCi0gICAgLyogSW5pdGlhbGl6ZSBwQWNjZXNzVW5pdCBzdHJ1Y3R1cmUgKi8KLSAgICBwQWNjZXNzVW5pdC0+bV9zaXplICAgICAgICAgPSAwOwotICAgIHBBY2Nlc3NVbml0LT5tX0NUUyAgICAgICAgICA9IDA7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fRFRTICAgICAgICAgID0gMDsKLSAgICBwQWNjZXNzVW5pdC0+bV9hdHRyaWJ1dGUgICAgPSAwOwotICAgIHBBY2Nlc3NVbml0LT5tX2RhdGFBZGRyZXNzICA9IE00T1NBX05VTEw7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fbWF4c2l6ZSAgICAgID0gcFN0cmVhbUhhbmRsZXItPm1fbWF4QVVTaXplOwotICAgIHBBY2Nlc3NVbml0LT5tX3N0cmVhbUlEICAgICA9IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkOwotICAgIHBBY2Nlc3NVbml0LT5tX3N0cnVjdFNpemUgICA9IHNpemVvZihNNF9BY2Nlc3NVbml0KTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9maWxsQXVTdHJ1Y3QgZW5kIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgIGp1bXAgaW50byB0aGUgc3RyZWFtIGF0IHRoZSBzcGVjaWZpZWQgdGltZQotKiBAbm90ZQotKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyICAoSU4pICAgdGhlIHN0cmVhbSBoYW5kbGVyIG9mIHRoZSBzdHJlYW0gdG8gbWFrZSBqdW1wCi0qIEBwYXJhbSAgICBwVGltZSAgICAgICAgICAgKEkvTylJTiAgdGhlIHRpbWUgdG8ganVtcCB0byAoaW4gbXMpCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVVQgdGhlIHRpbWUgdG8gd2hpY2ggdGhlIHN0cmVhbSByZWFsbHkganVtcGVkCi0qIEByZXR1cm4gICBNNE5PX0VSUk9SICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVIgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfanVtcChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLCBNNE9TQV9JbnQzMiogcFRpbWUpIHsKLSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0KiBwQyA9IChWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBBdTsKLSAgICBNNE9TQV9UaW1lIHRpbWU2NDsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgocEMgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2p1bXA6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2p1bXA6IGludmFsaWQgcG9pbnRlciB0byBNNF9TdHJlYW1IYW5kbGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwVGltZSA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfanVtcDogaW52YWxpZCB0aW1lIHBvaW50ZXIiKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9qdW1wIGJlZ2luIik7Ci0KLSAgICBpZiAoKnBUaW1lID09IChwU3RyZWFtSGFuZGxlci0+bV9kdXJhdGlvbikpIHsKLSAgICAgICAgKnBUaW1lIC09IDE7Ci0gICAgfQotICAgIHRpbWU2NCA9IChNNE9TQV9UaW1lKSpwVGltZTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9qdW1wIHRpbWUgdXMgJWxkICIsIHRpbWU2NCk7Ci0KLSAgICBpZiAoKHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyICE9IE00T1NBX05VTEwpICYmCi0gICAgICAgICAgICAocFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQgPT0gcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQpKQotICAgICAgICAgICAgewotICAgICAgICBwQXUgPSAmcEMtPm1BdWRpb0F1OwotICAgICAgICBwQXUtPkNUUyA9IHRpbWU2NDsKLSAgICAgICAgcEF1LT5EVFMgPSB0aW1lNjQ7Ci0KLSAgICAgICAgdGltZTY0ID0gdGltZTY0ICogMTAwMDsgLyogQ29udmVydCB0aGUgdGltZSBpbnRvIG1pY3JvIHNlYyAqLwotICAgICAgICBwQy0+bUF1ZGlvU2Vla2luZyA9IE00T1NBX1RSVUU7Ci0gICAgICAgIHBDLT5tQXVkaW9TZWVrVGltZSA9IHRpbWU2NDsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2p1bXAgQVVESU8gdGltZSB1cyAlbGQgIiwgdGltZTY0KTsKLSAgICB9IGVsc2UgaWYgKChwQy0+bVZpZGVvU3RyZWFtSGFuZGxlciAhPSBNNE9TQV9OVUxMKSAmJgotICAgICAgICAgICAgKHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkID09IHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgcEF1ID0gJnBDLT5tVmlkZW9BdTsKLSAgICAgICAgcEF1LT5DVFMgPSB0aW1lNjQ7Ci0gICAgICAgIHBBdS0+RFRTID0gdGltZTY0OwotCi0gICAgICAgIHRpbWU2NCA9IHRpbWU2NCAqIDEwMDA7IC8qIENvbnZlcnQgdGhlIHRpbWUgaW50byBtaWNybyBzZWMgKi8KLSAgICAgICAgcEMtPm1WaWRlb1NlZWtpbmcgPSBNNE9TQV9UUlVFOwotICAgICAgICBwQy0+bVZpZGVvU2Vla1RpbWUgPSB0aW1lNjQ7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9qdW1wIFZJREVPIHRpbWUgdXMgJWxkICIsIHRpbWU2NCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2p1bXAgcGFzc2VkIFN0cmVhbUhhbmRsZXIgaXMgbm90IGtub3duXG4iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0gICAgdGltZTY0ID0gdGltZTY0IC8gMTAwMDsgLyogQ29udmVydCB0aGUgdGltZSBpbnRvIG1pbGxpIHNlYyAqLwotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9qdW1wIHRpbWUgbXMgYmVmb3JlIHNlZWtzZXQgJWxkICIsIHRpbWU2NCk7Ci0KLSAgICAqcFRpbWUgPSAoTTRPU0FfSW50MzIpdGltZTY0OwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2p1bXAgZW5kIik7Ci0gICAgZXJyID0gTTROT19FUlJPUjsKLSAgICByZXR1cm4gZXJyOwotfQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgICAgcmVzZXQgdGhlIHN0cmVhbSwgdGhhdCBpcyBzZWVrIGl0IHRvIGJlZ2lubmluZyBhbmQgbWFrZSBpdCByZWFkeQotKiBAbm90ZQotKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0qIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlciAgKElOKSAgICBUaGUgc3RyZWFtIGhhbmRsZXIgb2YgdGhlIHN0cmVhbSB0byByZXNldAotKiBAcmV0dXJuICAgTTROT19FUlJPUiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfcmVzZXQoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlcikgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQqIHBDID0gKFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSWRBcnJheVsyXTsKLSAgICBNNFNZU19BY2Nlc3NVbml0KiBwQXU7Ci0gICAgTTRPU0FfVGltZSB0aW1lNjQgPSAwOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQyA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfcmVzZXQ6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX3Jlc2V0OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfU3RyZWFtSGFuZGxlciIpOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX3Jlc2V0IGJlZ2luIik7Ci0KLSAgICBpZiAocFN0cmVhbUhhbmRsZXIgPT0gKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyKSB7Ci0gICAgICAgIHBBdSA9ICZwQy0+bUF1ZGlvQXU7Ci0gICAgfSBlbHNlIGlmIChwU3RyZWFtSGFuZGxlciA9PSAoTTRfU3RyZWFtSGFuZGxlciopcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXIpIHsKLSAgICAgICAgcEF1ID0gJnBDLT5tVmlkZW9BdTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfcmVzZXQgcGFzc2VkIFN0cmVhbUhhbmRsZXIgaXMgbm90IGtub3duXG4iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBwQXUtPkNUUyA9IHRpbWU2NDsKLSAgICBwQXUtPkRUUyA9IHRpbWU2NDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9yZXNldCBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiAgR2V0cyBhbiBhY2Nlc3MgdW5pdCAoQVUpIGZyb20gdGhlIHN0cmVhbSBoYW5kbGVyIHNvdXJjZS4KLSogQG5vdGUgICBBbiBBVSBpcyB0aGUgc21hbGxlc3QgcG9zc2libGUgYW1vdW50IG9mIGRhdGEgdG8gYmUgZGVjb2RlZCBieSBkZWNvZGVyCi0qCi0qIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyICAoSU4pIFRoZSBzdHJlYW0gaGFuZGxlciBvZiB0aGUgc3RyZWFtIHRvIG1ha2UganVtcAotKiBAcGFyYW0gICAgcEFjY2Vzc1VuaXQgICAgIChJTykgUG9pbnRlciB0byBhY2Nlc3MgdW5pdCB0byBmaWxsIHdpdGggcmVhZCBkYXRhCi0qIEByZXR1cm4gICBNNE5PX0VSUk9SICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0qIEByZXR1cm5zICBNNEVSUl9BTExPQyAgICAgICAgICBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKLSogQHJldHVybnMgIE00V0FSX05PX01PUkVfQVUgICAgIHRoZXJlIGFyZSBubyBtb3JlIGFjY2VzcyB1bml0IGluIHRoZSBzdHJlYW0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRBdShNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLCBNNF9BY2Nlc3NVbml0ICpwQWNjZXNzVW5pdCkgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQqIHBDPShWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBBdTsKLSAgICBpbnQ2NF90IHRlbXBUaW1lNjQgPSAwOwotICAgIE1lZGlhQnVmZmVyICptTWVkaWFCdWZmZXIgPSBOVUxMOwotICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyBvcHRpb25zOwotICAgIE00T1NBX0Jvb2wgZmxhZyA9IE00T1NBX0ZBTFNFOwotICAgIHN0YXR1c190IGVycm9yOwotICAgIGludDMyX3QgaTMyVG1wID0gMDsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoIHBDPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRBdTogaW52YWxpZCBjb250ZXh0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlciA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfU3RyZWFtSGFuZGxlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocEFjY2Vzc1VuaXQgPT0gMCksICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRBdTogaW52YWxpZCBwb2ludGVyIHRvIE00X0FjY2Vzc1VuaXQiKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0QXUgYmVnaW4iKTsKLQotICAgIGlmIChwU3RyZWFtSGFuZGxlciA9PSAoTTRfU3RyZWFtSGFuZGxlciopcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXIpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRBdSBhdWRpbyBzdHJlYW0iKTsKLSAgICAgICAgcEF1ID0gJnBDLT5tQXVkaW9BdTsKLSAgICAgICAgaWYgKHBDLT5tQXVkaW9TZWVraW5nID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0QXUgYXVkaW8gc2VlayB0aW1lOiAlbGQiLAotICAgICAgICAgICAgICAgIHBDLT5tQXVkaW9TZWVrVGltZSk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFNlZWtUbyhwQy0+bUF1ZGlvU2Vla1RpbWUpOwotICAgICAgICAgICAgcEMtPm1BdWRpb1NvdXJjZS0+cmVhZCgmbU1lZGlhQnVmZmVyLCAmb3B0aW9ucyk7Ci0KLSAgICAgICAgICAgIG1NZWRpYUJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwKLSAgICAgICAgICAgICAgICAoaW50NjRfdCopJnRlbXBUaW1lNjQpOwotICAgICAgICAgICAgb3B0aW9ucy5jbGVhclNlZWtUbygpOwotICAgICAgICAgICAgcEMtPm1BdWRpb1NlZWtpbmcgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIGZsYWcgPSBNNE9TQV9UUlVFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRBdSBhdWRpbyBubyBzZWVrOiIpOwotICAgICAgICAgICAgcEMtPm1BdWRpb1NvdXJjZS0+cmVhZCgmbU1lZGlhQnVmZmVyLCAmb3B0aW9ucyk7Ci0gICAgICAgICAgICBpZiAobU1lZGlhQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtTWVkaWFCdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsCi0gICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KikmdGVtcFRpbWU2NCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHBTdHJlYW1IYW5kbGVyID09IChNNF9TdHJlYW1IYW5kbGVyKilwQy0+bVZpZGVvU3RyZWFtSGFuZGxlcikgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1IHZpZGVvIHN0ZXJhbSAiKTsKLSAgICAgICAgcEF1ID0gJnBDLT5tVmlkZW9BdTsKLSAgICAgICAgaWYocEMtPm1WaWRlb1NlZWtpbmcgPT0gTTRPU0FfVFJVRSkgewotICAgICAgICAgICAgZmxhZyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1IHNlZWs6ICVsZCIscEMtPm1WaWRlb1NlZWtUaW1lKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKHBDLT5tVmlkZW9TZWVrVGltZSwKLSAgICAgICAgICAgICAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQyk7Ci0gICAgICAgICAgICBkbwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChtTWVkaWFCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1IGZyZWUgdGhlIE1lZGlhQnVmZmVyIik7Ci0gICAgICAgICAgICAgICAgICAgIG1NZWRpYUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnJvciA9IHBDLT5tVmlkZW9Tb3VyY2UtPnJlYWQoJm1NZWRpYUJ1ZmZlciwgJm9wdGlvbnMpOwotICAgICAgICAgICAgICAgIEFMT0dWKCJWRTNncFJlYWRlcl9nZXROZXh0QXUgTWVkaWFCdWZmZXIgJXggLCBlcnJvciAlZCIsCi0gICAgICAgICAgICAgICAgICAgIG1NZWRpYUJ1ZmZlciwgZXJyb3IpOwotICAgICAgICAgICAgICAgIGlmIChtTWVkaWFCdWZmZXIgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtTWVkaWFCdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50MzIoa0tleUlzU3luY0ZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgJmkzMlRtcCkgJiYgaTMyVG1wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlNZTkMgRlJBTUUgRk9VTkQtLSVkIiwgaTMyVG1wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBBdS0+YXR0cmlidXRlID0gQVVfUkFQOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcEF1LT5hdHRyaWJ1dGUgPSBBVV9QX0ZyYW1lOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1NZWRpYUJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KikmdGVtcFRpbWU2NCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wdGlvbnMuY2xlYXJTZWVrVG8oKTsKLSAgICAgICAgICAgIH0gd2hpbGUodGVtcFRpbWU2NCA8IHBDLT5tVmlkZW9TZWVrVGltZSk7Ci0KLSAgICAgICAgICAgIEFMT0dWKCJWRTNncFJlYWRlcl9nZXROZXh0QXU6IHZpZGVvICB0aW1lIHdpdGggc2VlayAgPSAlbGxkOiIsCi0gICAgICAgICAgICAgICAgdGVtcFRpbWU2NCk7Ci0gICAgICAgICAgICBwQy0+bVZpZGVvU2Vla2luZyA9IE00T1NBX0ZBTFNFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRBdSB2aWRlbyBubyBzZWVrOiIpOwotICAgICAgICAgICAgcEMtPm1WaWRlb1NvdXJjZS0+cmVhZCgmbU1lZGlhQnVmZmVyLCAmb3B0aW9ucyk7Ci0KLSAgICAgICAgICAgIGlmKG1NZWRpYUJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1NZWRpYUJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQzMihrS2V5SXNTeW5jRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICZpMzJUbXApICYmIGkzMlRtcCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiU1lOQyBGUkFNRSBGT1VORC0tJWQiLCBpMzJUbXApOwotICAgICAgICAgICAgICAgICAgICBwQXUtPmF0dHJpYnV0ZSA9IEFVX1JBUDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBBdS0+YXR0cmlidXRlID0gQVVfUF9GcmFtZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbU1lZGlhQnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLAotICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCopJnRlbXBUaW1lNjQpOwotICAgICAgICAgICAgICAgIEFMT0dWKCJWRTNncFJlYWRlcl9nZXROZXh0QXU6IHZpZGVvIG5vIHNlZWsgdGltZSA9ICVsbGQ6IiwKLSAgICAgICAgICAgICAgICAgICAgdGVtcFRpbWU2NCk7Ci0gICAgICAgICAgICB9ZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlZFM2dwUmVhZGVyX2dldE5leHRBdTp2aWRlbyBubyBzZWVrIHRpbWUgYnVmZmVyIGlzIE5VTEwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0QXUgTTRFUlJfUEFSQU1FVEVSIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYgKG1NZWRpYUJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIGlmKCAocEF1LT5kYXRhQWRkcmVzcyA9PSBOVUxMKSB8fCAgKHBBdS0+c2l6ZSA8IFwKLSAgICAgICAgICAgIG1NZWRpYUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpKSB7Ci0gICAgICAgICAgICBpZihwQXUtPmRhdGFBZGRyZXNzICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBmcmVlKChNNE9TQV9JbnQzMiopcEF1LT5kYXRhQWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgcEF1LT5kYXRhQWRkcmVzcyA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiQnVmZmVyIGxlbmdodCA9ICVkICwlZCIsKG1NZWRpYUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgK1wKLSAgICAgICAgICAgICAgICAzKSAmIH4weDMsKG1NZWRpYUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpKTsKLQotICAgICAgICAgICAgcEF1LT5kYXRhQWRkcmVzcyA9IChNNE9TQV9JbnQzMiopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgIChtTWVkaWFCdWZmZXItPnJhbmdlX2xlbmd0aCgpICsgMykgJiB+MHgzLE00UkVBREVSXzNHUCwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJwQWNjZXNzVW5pdC0+bV9kYXRhQWRkcmVzcyIgKTsKLSAgICAgICAgICAgIGlmKHBBdS0+ZGF0YUFkZHJlc3MgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0QXUgbWFsbG9jIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwQXUtPnNpemUgPSBtTWVkaWFCdWZmZXItPnJhbmdlX2xlbmd0aCgpOwotCi0gICAgICAgIG1lbWNweSgodm9pZCAqKXBBdS0+ZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAodm9pZCAqKSgoY29uc3QgY2hhciAqKW1NZWRpYUJ1ZmZlci0+ZGF0YSgpICsgbU1lZGlhQnVmZmVyLT5yYW5nZV9vZmZzZXQoKSksCi0gICAgICAgICAgICBtTWVkaWFCdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLQotICAgICAgICBpZiggKHBTdHJlYW1IYW5kbGVyID09IChNNF9TdHJlYW1IYW5kbGVyKilwQy0+bVZpZGVvU3RyZWFtSGFuZGxlcikgICYmCi0gICAgICAgICAgICAocFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSA9PSBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0QXZjKSApIHsKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiBzaXplID0gbU1lZGlhQnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKLSAgICAgICAgICAgIE00T1NBX1VJbnQ4ICpsYnVmZmVyOwotCi0gICAgICAgICAgICBsYnVmZmVyID0gKE00T1NBX1VJbnQ4ICopIHBBdS0+ZGF0YUFkZHJlc3M7Ci0gICAgICAgICAgICBBTE9HVigicEFjY2Vzc1VuaXQtPm1fZGF0YUFkZHJlc3Mgc2l6ZSA9ICV4IixzaXplKTsKLQotICAgICAgICAgICAgbGJ1ZmZlclswXSA9IChzaXplID4+IDI0KSAmIDB4RkY7Ci0gICAgICAgICAgICBsYnVmZmVyWzFdID0gKHNpemUgPj4gMTYpICYgMHhGRjsKLSAgICAgICAgICAgIGxidWZmZXJbMl0gPSAoc2l6ZSA+PiA4KSAmIDB4RkY7Ci0gICAgICAgICAgICBsYnVmZmVyWzNdID0gKHNpemUpICYgMHhGRjsKLSAgICAgICAgfQotCi0gICAgICAgIHBBdS0+Q1RTID0gdGVtcFRpbWU2NDsKLQotICAgICAgICBwQXUtPkNUUyA9IHBBdS0+Q1RTIC8gMTAwMDsgLy9jb252ZXJ0aW5nIHRoZSBtaWNyb3NlYyB0byBtaWxsaXNlYwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1IENUUyA9ICVsZCIscEF1LT5DVFMpOwotCi0gICAgICAgIHBBdS0+RFRTICA9IHBBdS0+Q1RTOwotICAgICAgICBpZiAocFN0cmVhbUhhbmRsZXIgPT0gKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyKSB7Ci0gICAgICAgICAgICBwQXUtPmF0dHJpYnV0ZSA9IE00U1lTX2tGcmFnQXR0ck9rOwotICAgICAgICB9Ci0gICAgICAgIG1NZWRpYUJ1ZmZlci0+cmVsZWFzZSgpOwotCi0gICAgICAgIHBBY2Nlc3NVbml0LT5tX2RhdGFBZGRyZXNzID0gKE00T1NBX0ludDgqKSBwQXUtPmRhdGFBZGRyZXNzOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9zaXplID0gcEF1LT5zaXplOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9tYXhzaXplID0gcEF1LT5zaXplOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9DVFMgPSBwQXUtPkNUUzsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fRFRTID0gcEF1LT5EVFM7Ci0gICAgICAgIHBBY2Nlc3NVbml0LT5tX2F0dHJpYnV0ZSA9IHBBdS0+YXR0cmlidXRlOwotCi0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRBdTogTTRXQVJfTk9fTU9SRV9BVSAoRU9TKSByZWFjaGVkIik7Ci0gICAgICAgIHBBY2Nlc3NVbml0LT5tX3NpemUgPSAwOwotICAgICAgICBlcnIgPSBNNFdBUl9OT19NT1JFX0FVOwotICAgIH0KLSAgICBvcHRpb25zLmNsZWFyU2Vla1RvKCk7Ci0KLSAgICBwQXUtPm5iRnJhZyA9IDA7Ci0gICAgbU1lZGlhQnVmZmVyID0gTlVMTDsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1IGVuZCAiKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBTcGxpdCB0aGUgQVZDIERTSSBpbiBpdHMgZGlmZmVyZW50IGNvbXBvbmVudHMgYW5kIHdyaXRlIGl0IGluCi0gKiAgICAgICAgICBPTkUgbWVtb3J5IGJ1ZmZlcgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBTdHJlYW1IYW5kbGVyOiAgICAgICAgIChJTi9PVVQpIFRoZSBNUEVHNC1BVkMgc3RyZWFtCi0gKiBAcGFyYW0gICBwRGVjb2RlckNvbmZpZ0xvY2FsOiAgICAoSU4pIFRoZSBEU0kgYnVmZmVyCi0gKiBAcGFyYW0gICBkZWNvZGVyQ29uZmlnU2l6ZUxvY2FsOiAoSU4pIFRoZSBEU0kgYnVmZmVyIHNpemUKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBFUlJfRklMRV9TWU5UQVhfRVJST1IgICBwRGVjb2RlckNvbmZpZ0xvY2FsIGlzIE5VTEwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotc3RhdGljIE00T1NBX0VSUiBWaWRlb0VkaXRvcjNncFJlYWRlcl9BbmFseXNlQXZjRHNpKAotICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwgTTRPU0FfSW50MzIqIHBEZWNvZGVyQ29uZmlnTG9jYWwsCi0gICAgICAgIE00T1NBX0ludDMyIGRlY29kZXJDb25maWdTaXplTG9jYWwpIHsKLSAgICBzdHJ1Y3QgX2F2Y1NwZWNpZmljSW5mbyAqcEF2Y1NwZWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9VSW50MzIgdWlTcGVjSW5mb1NpemU7Ci0gICAgTTRPU0FfQ29udGV4dCBwQml0UGFyc2VyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfTWVtQWRkcjggcFBvczsKLQotICAgIC8qKgotICAgICAqIEZpcnN0IHBhcnNpbmcgdG8gZ2V0IHRoZSB0b3RhbCBhbGxvY2F0aW9uIHNpemUgKHdlIG11c3Qgbm90IGRvCi0gICAgICogbXVsdGlwbGUgbWFsbG9jLCBidXQgb25seSBvbmUgaW5zdGVhZCkgKi8KLSAgICB7Ci0gICAgICAgIE00T1NBX0ludDMyIHZhbDsKLSAgICAgICAgTTRPU0FfVUludDMyIGksajsKLSAgICAgICAgTTRPU0FfVUludDggbmFsVW5pdExlbmd0aDsKLSAgICAgICAgTTRPU0FfVUludDggIG51bU9mU2VxdWVuY2VQYXJhbWV0ZXJTZXRzOwotICAgICAgICBNNE9TQV9VSW50MzIgdWlUb3RhbFNpemVPZlNQUyA9IDA7Ci0gICAgICAgIE00T1NBX1VJbnQ4ICBudW1PZlBpY3R1cmVQYXJhbWV0ZXJTZXRzOwotICAgICAgICBNNE9TQV9VSW50MzIgdWlUb3RhbFNpemVPZlBQUyA9IDA7Ci0gICAgICAgIE00T1NBX1VJbnQzMiB1aVNpemU7Ci0gICAgICAgIHN0cnVjdCBfYXZjU3BlY2lmaWNJbmZvIGF2Y1NwSWY7Ci0KLSAgICAgICAgYXZjU3BJZi5tX25hbFVuaXRMZW5ndGggPSAwOwotCi0gICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBEZWNvZGVyQ29uZmlnTG9jYWwpIHsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9SRUFERVIzR1BfREVDT0RFUl9DT05GSUdfRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9NUEVHNEJpdFN0cmVhbVBhcnNlckluaXQoJnBCaXRQYXJzZXJDb250ZXh0LAotICAgICAgICAgICAgcERlY29kZXJDb25maWdMb2NhbCwgZGVjb2RlckNvbmZpZ1NpemVMb2NhbCk7Ci0KLSAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gcEJpdFBhcnNlckNvbnRleHQpIHsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cyhwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4IGJpdHMgLS0gY29uZmlndXJhdGlvbiB2ZXJzaW9uICovCi0gICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cyhwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4IGJpdHMgLS0gYXZjIHByb2ZpbGUgaW5kaWNhdGlvbiovCi0gICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cyhwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4IGJpdHMgLS0gcHJvZmlsZSBjb21wYXRpYmlsaXR5ICovCi0gICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cyhwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4IGJpdHMgLS0gYXZjIGxldmVsIGluZGljYXRpb24qLwotICAgICAgICB2YWw9VmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyU2hvd0JpdHMocEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgICAgICAgICAgICAvKiA2IGJpdHMgcmVzZXJ2ZWQgMTExMTExYiAyIGJpdHMgbGVuZ3RoIFNpemUgbWludXMgb25lKi8KLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyRmx1c2hCaXRzKHBCaXRQYXJzZXJDb250ZXh0LCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1fbmFsVW5pdExlbmd0aCAqLwotCi0gICAgICAgIG5hbFVuaXRMZW5ndGggPSAoTTRPU0FfVUludDgpKCh2YWwgJiAweDAzKSArIDEpOy8qMGIxMTExMTEwMCovCi0gICAgICAgIGlmIChuYWxVbml0TGVuZ3RoID4gNCkgewotICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSAwOwotICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fcERlY29kZXJTcGVjaWZpY0luZm8gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ2xlYW5VcChwQml0UGFyc2VyQ29udGV4dCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFNQUyB0YWJsZSAqLwotICAgICAgICAgICAgdmFsPVZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlclNob3dCaXRzKHBCaXRQYXJzZXJDb250ZXh0LAotICAgICAgICAgICAgOCk7LyogMyBiaXRzLXJlc2VydmVkIDExMWItNSBiaXRzIG51bWJlciBvZiBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0Ki8KLSAgICAgICAgICAgIG51bU9mU2VxdWVuY2VQYXJhbWV0ZXJTZXRzID0gdmFsICYgMHgxRjsKLSAgICAgICAgICAgIC8qMUYgaW5zdGVhZCBvZiBFMCovIC8qMGIxMTEwMDAwMCovIC8qTnVtYmVyIG9mIHNlcSBwYXJhbWV0ZXIgc2V0cyovCi0gICAgICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMocEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBudW1PZlNlcXVlbmNlUGFyYW1ldGVyU2V0czsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogR2V0IHRoZSBzaXplIG9mIHRoaXMgZWxlbWVudCAqLwotICAgICAgICAgICAgICAgIHVpU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyU2hvd0JpdHMoCi0gICAgICAgICAgICAgICAgICAgIHBCaXRQYXJzZXJDb250ZXh0LCAxNik7Ci0gICAgICAgICAgICAgICAgdWlUb3RhbFNpemVPZlNQUyArPSB1aVNpemU7Ci0gICAgICAgICAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyRmx1c2hCaXRzKAotICAgICAgICAgICAgICAgICAgICBwQml0UGFyc2VyQ29udGV4dCwgMTYpOwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqUmVhZCB0aGUgZWxlbWVudChkb250IGtlZXAgaXQsIHdlIG9ubHkgd2FudCBzaXplIHJpZ2h0IG5vdykgKi8KLSAgICAgICAgICAgICAgICBmb3IgKGo9MDsgajx1aVNpemU7IGorKykgewotICAgICAgICAgICAgICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMoCi0gICAgICAgICAgICAgICAgICAgICAgICBwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFNQUyB0YWJsZSAqLwotICAgICAgICAgICAgbnVtT2ZQaWN0dXJlUGFyYW1ldGVyU2V0cz0oTTRPU0FfVUludDgpXAotICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlclNob3dCaXRzKHBCaXRQYXJzZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICA4KTsKLSAgICAgICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cyhwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICBmb3IgKGk9MDsgaSA8IG51bU9mUGljdHVyZVBhcmFtZXRlclNldHM7IGkrKykgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIEdldCB0aGUgc2l6ZSBvZiB0aGlzIGVsZW1lbnQgKi8KLSAgICAgICAgICAgICAgICB1aVNpemUgPSAoTTRPU0FfVUludDMyKQotICAgICAgICAgICAgICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJTaG93Qml0cygKLSAgICAgICAgICAgICAgICAgICAgcEJpdFBhcnNlckNvbnRleHQsIDE2KTsKLSAgICAgICAgICAgICAgICB1aVRvdGFsU2l6ZU9mUFBTICs9IHVpU2l6ZTsKLSAgICAgICAgICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMoCi0gICAgICAgICAgICAgICAgICAgIHBCaXRQYXJzZXJDb250ZXh0LCAxNik7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICpSZWFkIHRoZSBlbGVtZW50KGRvbnQga2VlcCBpdCx3ZSBvbmx5IHdhbnQgc2l6ZSByaWdodCBub3cpKi8KLSAgICAgICAgICAgICAgICBmb3IgKGo9MDsgajx1aVNpemU7IGorKykgewotICAgICAgICAgICAgICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMoCi0gICAgICAgICAgICAgICAgICAgICAgICBwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIENvbXB1dGUgdGhlIHNpemUgb2YgdGhlIGZ1bGwgYnVmZmVyICovCi0gICAgICAgICAgICB1aVNwZWNJbmZvU2l6ZSA9IHNpemVvZihzdHJ1Y3QgX2F2Y1NwZWNpZmljSW5mbykgKwotICAgICAgICAgICAgICAgICAgICAgbnVtT2ZTZXF1ZW5jZVBhcmFtZXRlclNldHMgKiBzaXplb2Yoc3RydWN0IF9wYXJhbWV0ZXJTZXQpCi0gICAgICAgICAgICAgICAgICAgICArIC8qKjwgc2l6ZSBvZiB0aGUgdGFibGUgb2YgU1BTIGVsZW1lbnRzICovCi0gICAgICAgICAgICAgICAgICAgICBudW1PZlBpY3R1cmVQYXJhbWV0ZXJTZXRzICAqIHNpemVvZihzdHJ1Y3QgX3BhcmFtZXRlclNldCkKLSAgICAgICAgICAgICAgICAgICAgICsgLyoqPCBzaXplIG9mIHRoZSB0YWJsZSBvZiBQUFMgZWxlbWVudHMgKi8KLSAgICAgICAgICAgICAgICAgICAgIHVpVG90YWxTaXplT2ZTUFMgKwotICAgICAgICAgICAgICAgICAgICAgdWlUb3RhbFNpemVPZlBQUzsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQWxsb2NhdGUgdGhlIGJ1ZmZlciAqLwotICAgICAgICAgICAgcEF2Y1NwZWNJbmZvID0oc3RydWN0IF9hdmNTcGVjaWZpY0luZm8qKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyh1aVNwZWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICBNNFJFQURFUl8zR1AsIChNNE9TQV9DaGFyKikiTVBFRy00IEFWQyBEZWNvZGVyU3BlY2lmaWMiKTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBBdmNTcGVjSW5mbykgewotICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNsZWFuVXAocEJpdFBhcnNlckNvbnRleHQpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBTZXQgdGhlIHBvaW50ZXJzIHRvIHRoZSBjb3JyZWN0IHBhcnQgb2YgdGhlIGJ1ZmZlciAqLwotICAgICAgICAgICAgcEF2Y1NwZWNJbmZvLT5tX25hbFVuaXRMZW5ndGggPSBuYWxVbml0TGVuZ3RoOwotICAgICAgICAgICAgcEF2Y1NwZWNJbmZvLT5tX251bU9mU2VxdWVuY2VQYXJhbWV0ZXJTZXRzID0KLSAgICAgICAgICAgICAgICBudW1PZlNlcXVlbmNlUGFyYW1ldGVyU2V0czsKLSAgICAgICAgICAgIHBBdmNTcGVjSW5mby0+bV9udW1PZlBpY3R1cmVQYXJhbWV0ZXJTZXRzICA9Ci0gICAgICAgICAgICAgICAgbnVtT2ZQaWN0dXJlUGFyYW1ldGVyU2V0czsKLQotICAgICAgICAgICAgLyogV2UgcGxhY2UgdGhlIFNQUyBwYXJhbSBzZXRzIHRhYmxlIGFmdGVyIG1fcFBpY3R1cmVQYXJhbWV0ZXJTZXQgKi8KLSAgICAgICAgICAgIHBBdmNTcGVjSW5mby0+bV9wU2VxdWVuY2VQYXJhbWV0ZXJTZXQ9IChzdHJ1Y3QgX3BhcmFtZXRlclNldCopKAotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOCkoJnBBdmNTcGVjSW5mby0+bV9wUGljdHVyZVBhcmFtZXRlclNldCkgKwotICAgICAgICAgICAgICAgIHNpemVvZihwQXZjU3BlY0luZm8tPm1fcFBpY3R1cmVQYXJhbWV0ZXJTZXQpKTsKLSAgICAgICAgICAgIC8qV2UgcGxhY2UgdGhlIFBQUyBwYXJhbSBzZXRzIHRhYmxlIGFmdGVyIHRoZSBTUFMgcGFyYW0gc2V0cyB0YWJsZSovCi0gICAgICAgICAgICBwQXZjU3BlY0luZm8tPm1fcFBpY3R1cmVQYXJhbWV0ZXJTZXQgPSAoc3RydWN0IF9wYXJhbWV0ZXJTZXQqKSgKLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpKHBBdmNTcGVjSW5mby0+bV9wU2VxdWVuY2VQYXJhbWV0ZXJTZXQpICsKLSAgICAgICAgICAgICAgICAobnVtT2ZTZXF1ZW5jZVBhcmFtZXRlclNldHMgKiBzaXplb2Yoc3RydWN0IF9wYXJhbWV0ZXJTZXQpKSk7Ci0gICAgICAgICAgICAvKio8IFRoZSBkYXRhIHdpbGwgYmUgcGxhY2VkIGFmdGVyIHRoZSBQUFMgcGFyYW0gc2V0cyB0YWJsZSAqLwotICAgICAgICAgICAgcFBvcyA9IChNNE9TQV9NZW1BZGRyOClwQXZjU3BlY0luZm8tPm1fcFBpY3R1cmVQYXJhbWV0ZXJTZXQgKwotICAgICAgICAgICAgICAgIChudW1PZlBpY3R1cmVQYXJhbWV0ZXJTZXRzICogc2l6ZW9mKHN0cnVjdCBfcGFyYW1ldGVyU2V0KSk7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogcmVzZXQgdGhlIGJpdCBwYXJzZXIgKi8KLSAgICAgICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNsZWFuVXAocEJpdFBhcnNlckNvbnRleHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2Vjb25kIHBhcnNpbmcgdG8gY29weSB0aGUgZGF0YSAqLwotICAgIGlmIChNNE9TQV9OVUxMICE9IHBBdmNTcGVjSW5mbykgewotICAgICAgICBNNE9TQV9JbnQzMiBpLGo7Ci0KLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfTVBFRzRCaXRTdHJlYW1QYXJzZXJJbml0KCZwQml0UGFyc2VyQ29udGV4dCwKLSAgICAgICAgICAgIHBEZWNvZGVyQ29uZmlnTG9jYWwsIGRlY29kZXJDb25maWdTaXplTG9jYWwpOwotCi0gICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBCaXRQYXJzZXJDb250ZXh0KSB7Ci0gICAgICAgICAgICBmcmVlKHBBdmNTcGVjSW5mbyk7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMocEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgLyogOCBiaXRzIC0tIGNvbmZpZ3VyYXRpb24gdmVyc2lvbiAqLwotICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMocEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgLyogOCBiaXRzIC0tIGF2YyBwcm9maWxlIGluZGljYXRpb24qLwotICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMocEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgLyogOCBiaXRzIC0tIHByb2ZpbGUgY29tcGF0aWJpbGl0eSAqLwotICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMocEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgLyogOCBiaXRzIC0tIGF2YyBsZXZlbCBpbmRpY2F0aW9uKi8KLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyRmx1c2hCaXRzKHBCaXRQYXJzZXJDb250ZXh0LCA4KTsKLSAgICAgICAgICAgIC8qIG1fbmFsVW5pdExlbmd0aCAqLwotICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMocEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAvKiAzIGJpdHMgLS0gcmVzZXJ2ZWQgMTExYiAtLSA1IGJpdHMgbnVtYmVyIG9mIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQqLwotCi0gICAgICAgIGZvciAoaT0wOyBpIDwgcEF2Y1NwZWNJbmZvLT5tX251bU9mU2VxdWVuY2VQYXJhbWV0ZXJTZXRzOyBpKyspIHsKLSAgICAgICAgICAgIHBBdmNTcGVjSW5mby0+bV9wU2VxdWVuY2VQYXJhbWV0ZXJTZXRbaV0ubV9sZW5ndGggPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MTYpVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyU2hvd0JpdHMoCi0gICAgICAgICAgICAgICAgcEJpdFBhcnNlckNvbnRleHQsIDE2KTsKLSAgICAgICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cyhwQml0UGFyc2VyQ29udGV4dCwxNik7Ci0KLSAgICAgICAgICAgIHBBdmNTcGVjSW5mby0+bV9wU2VxdWVuY2VQYXJhbWV0ZXJTZXRbaV0ubV9wUGFyYW1ldGVyU2V0VW5pdCA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KilwUG9zOyAgLyoqPCBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgICAgICAgICAgIHBQb3MgKz0gcEF2Y1NwZWNJbmZvLT5tX3BTZXF1ZW5jZVBhcmFtZXRlclNldFtpXS5tX2xlbmd0aDsKLSAgICAgICAgICAgICAgICAvKio8IGluY3JlbWVudCB0aGUgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICAgICAgICAgICAgZm9yIChqPTA7IGo8cEF2Y1NwZWNJbmZvLT5tX3BTZXF1ZW5jZVBhcmFtZXRlclNldFtpXS5tX2xlbmd0aDtqKyspewotICAgICAgICAgICAgICAgIHBBdmNTcGVjSW5mby0+bV9wU2VxdWVuY2VQYXJhbWV0ZXJTZXRbaV0ubV9wUGFyYW1ldGVyU2V0VW5pdFtqXT0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KVZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlclNob3dCaXRzKAotICAgICAgICAgICAgICAgICAgICBwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyRmx1c2hCaXRzKAotICAgICAgICAgICAgICAgICAgICBwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMocEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgLyogbnVtYmVyIG9mIHDDrmN0dXJlIHBhcmFtZXRlciBzZXQqLwotCi0gICAgICAgIGZvciAoaT0wOyBpIDwgcEF2Y1NwZWNJbmZvLT5tX251bU9mUGljdHVyZVBhcmFtZXRlclNldHM7IGkrKykgewotICAgICAgICAgICAgcEF2Y1NwZWNJbmZvLT5tX3BQaWN0dXJlUGFyYW1ldGVyU2V0W2ldLm1fbGVuZ3RoID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDE2KVZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlclNob3dCaXRzKAotICAgICAgICAgICAgICAgIHBCaXRQYXJzZXJDb250ZXh0LCAxNik7Ci0gICAgICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMocEJpdFBhcnNlckNvbnRleHQsMTYpOwotCi0gICAgICAgICAgICBwQXZjU3BlY0luZm8tPm1fcFBpY3R1cmVQYXJhbWV0ZXJTZXRbaV0ubV9wUGFyYW1ldGVyU2V0VW5pdCA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KilwUG9zOyAgIC8qKjwgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gICAgICAgICAgICBwUG9zICs9IHBBdmNTcGVjSW5mby0+bV9wUGljdHVyZVBhcmFtZXRlclNldFtpXS5tX2xlbmd0aDsKLSAgICAgICAgICAgICAgICAvKio8IGluY3JlbWVudCB0aGUgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICAgICAgICAgICAgZm9yIChqPTA7IGo8cEF2Y1NwZWNJbmZvLT5tX3BQaWN0dXJlUGFyYW1ldGVyU2V0W2ldLm1fbGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICBwQXZjU3BlY0luZm8tPm1fcFBpY3R1cmVQYXJhbWV0ZXJTZXRbaV0ubV9wUGFyYW1ldGVyU2V0VW5pdFtqXSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OClWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJTaG93Qml0cygKLSAgICAgICAgICAgICAgICAgICAgcEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cygKLSAgICAgICAgICAgICAgICAgICAgcEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNsZWFuVXAocEJpdFBhcnNlckNvbnRleHQpOwotICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IHVpU3BlY0luZm9TaXplOwotICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyA9IChNNE9TQV9VSW50OCopcEF2Y1NwZWNJbmZvOwotICAgIH0KLSAgICBwU3RyZWFtSGFuZGxlci0+bV9IMjY0ZGVjb2RlclNwZWNpZmljSW5mb1NpemUgID0gIGRlY29kZXJDb25maWdTaXplTG9jYWw7Ci0gICAgcFN0cmVhbUhhbmRsZXItPm1fcEgyNjREZWNvZGVyU3BlY2lmaWNJbmZvICA9IChNNE9TQV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICBkZWNvZGVyQ29uZmlnU2l6ZUxvY2FsLCBNNFJFQURFUl8zR1AsCi0gICAgICAgIChNNE9TQV9DaGFyKikiTVBFRy00IEFWQyBEZWNvZGVyU3BlY2lmaWMiKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwU3RyZWFtSGFuZGxlci0+bV9wSDI2NERlY29kZXJTcGVjaWZpY0luZm8pIHsKLSAgICAgICAgZ290byBjbGVhbnVwOwotICAgIH0KLQotICAgIG1lbWNweSgodm9pZCAqICkgcFN0cmVhbUhhbmRsZXItPm1fcEgyNjREZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAodm9pZCAqIClwRGVjb2RlckNvbmZpZ0xvY2FsLAotICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9IMjY0ZGVjb2RlclNwZWNpZmljSW5mb1NpemUpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotY2xlYW51cDoKLSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJDbGVhblVwKHBCaXRQYXJzZXJDb250ZXh0KTsKLSAgICByZXR1cm4gTTRFUlJfUkVBREVSM0dQX0RFQ09ERVJfQ09ORklHX0VSUk9SOwotfQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgICAgR2V0IHRoZSBuZXh0IHN0cmVhbSBmb3VuZCBpbiB0aGUgM2dwIGZpbGUKLSogQG5vdGUKLSogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotKiBAcGFyYW0gICAgcE1lZGlhRmFtaWx5OiBPVVQpICAgcG9pbnRlciB0byBhIHVzZXIgYWxsb2NhdGVkCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9NZWRpYUZhbWlseSB0aGF0IHdpbGwgYmUgZmlsbGVkCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSBtZWRpYSBmYW1pbHkgb2YgdGhlIGZvdW5kIHN0cmVhbQotKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXI6KE9VVCkgcG9pbnRlciB0byBTdHJlYW1IYW5kbGVyIHRoYXQgd2lsbCBiZSBhbGxvY2F0ZWQKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBmaWxsZWQgd2l0aCB0aGUgZm91bmQgc3RyZWFtIGRlc2NyaXB0aW9uCi0qIEByZXR1cm4gICBNNE5PX0VSUk9SICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJuICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotKiBAcmV0dXJuICAgTTRXQVJfTk9fTU9SRV9TVFJFQU0gICAgbm8gbW9yZSBhdmFpbGFibGUgc3RyZWFtIGluIHRoZSBtZWRpYQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dFN0cmVhbUhhbmRsZXIoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICBNNFJFQURFUl9NZWRpYUZhbWlseSAqcE1lZGlhRmFtaWx5LAotICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICoqcFN0cmVhbUhhbmRsZXIpIHsKLSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0KiBwQz0oVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFNZU19TdHJlYW1JRCBzdHJlYW1JZEFycmF5WzJdOwotICAgIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uIHN0cmVhbURlc2M7Ci0gICAgTTRfQXVkaW9TdHJlYW1IYW5kbGVyKiBwQXVkaW9TdHJlYW1IYW5kbGVyOwotICAgIE00X1ZpZGVvU3RyZWFtSGFuZGxlciogcFZpZGVvU3RyZWFtSGFuZGxlcjsKLSAgICBNNE9TQV9JbnQ4ICpEZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9JbnQzMiBkZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9MCwgbWF4QVVTaXplID0gMDsKLQotICAgIE00X1N0cmVhbVR5cGUgc3RyZWFtVHlwZSA9IE00REFfU3RyZWFtVHlwZVVua25vd247Ci0gICAgTTRPU0FfVUludDggdGVtcCwgaSwgdHJhY2tDb3VudDsKLSAgICBNNE9TQV9Cb29sIGhhdmVBdWRpbyA9IE00T1NBX0ZBTFNFOwotICAgIE00T1NBX0Jvb2wgaGF2ZVZpZGVvID0gTTRPU0FfRkFMU0U7Ci0gICAgc3A8TWV0YURhdGE+IG1ldGEgID0gTlVMTDsKLSAgICBpbnQ2NF90IER1cmF0aW9uID0gMDsKLSAgICBNNE9TQV9VSW50OCogRGVjb2RlclNwZWNpZmljID0gTTRPU0FfTlVMTCA7Ci0gICAgdWludDMyX3QgdHlwZTsKLSAgICBjb25zdCB2b2lkICpkYXRhOwotICAgIHNpemVfdCBzaXplOwotICAgIGNvbnN0IHZvaWQgKmNvZGVjX3NwZWNpZmljX2RhdGE7Ci0gICAgc2l6ZV90IGNvZGVjX3NwZWNpZmljX2RhdGFfc2l6ZTsKLSAgICBNNE9TQV9JbnQzMiAgcHRlbXBUaW1lOwotICAgIE00T1NBX0ludDMyICBhdmdGUFM9MDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0U3RyZWFtSGFuZGxlciBiZWdpbiIpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQyA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dFN0cmVhbUhhbmRsZXI6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocE1lZGlhRmFtaWx5ICAgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImdldE5leHRTdHJlYW1IYW5kbGVyOiBpbnZhbGlkIHBvaW50ZXIgdG8gTWVkaWFGYW1pbHkiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBTdHJlYW1IYW5kbGVyID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJnZXROZXh0U3RyZWFtSGFuZGxlcjogaW52YWxpZCBwb2ludGVyIHRvIFN0cmVhbUhhbmRsZXIiKTsKLQotICAgIHRyYWNrQ291bnQgPSBwQy0+bUV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKLSAgICB0ZW1wID0gcEMtPm1DdXJyVHJhY2s7Ci0KLSAgICBpZih0ZW1wID49IHRyYWNrQ291bnQpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRTdHJlYW1IYW5kbGVyIGVycm9yID0gJWQiLAotICAgICAgICAgICAgTTRXQVJfTk9fTU9SRV9TVFJFQU0pOwotICAgICAgICByZXR1cm4gKE00V0FSX05PX01PUkVfU1RSRUFNKTsKLSAgICB9IGVsc2UgewotICAgICAgICBjb25zdCBjaGFyICptaW1lOwotICAgICAgICBtZXRhID0gcEMtPm1FeHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEodGVtcCk7Ci0gICAgICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKLQotICAgICAgICBpZiAoIWhhdmVWaWRlbyAmJiAhc3RybmNhc2VjbXAobWltZSwgInZpZGVvLyIsIDYpKSB7Ci0gICAgICAgICAgICBwQy0+bVZpZGVvU291cmNlID0gcEMtPm1FeHRyYWN0b3ItPmdldFRyYWNrKHRlbXApOwotICAgICAgICAgICAgcEMtPm1WaWRlb1NvdXJjZS0+c3RhcnQoKTsKLQotICAgICAgICAgICAgKnBNZWRpYUZhbWlseSA9IE00UkVBREVSX2tNZWRpYUZhbWlseVZpZGVvOwotICAgICAgICAgICAgaGF2ZVZpZGVvID0gdHJ1ZTsKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0U3RyZWFtSGFuZGxlciBnZXRUcmFjayBjYWxsZWQiKTsKLSAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpKSB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmM7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMpKSB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IE00REFfU3RyZWFtVHlwZVZpZGVvSDI2MzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpKSB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlckdldE5leHRTdHJlYW1IYW5kbGVyIHN0cmVhbVR5cGVOT05FIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dFN0cmVhbUhhbmRsZXI6IHN0cmVhbSB0eXBlOiAlZCAiLAotICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUpOwotCi0gICAgICAgICAgICBpZihzdHJlYW1UeXBlICE9IE00REFfU3RyZWFtVHlwZVVua25vd24pIHsKLSAgICAgICAgICAgICAgICBwQy0+bVN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOwotICAgICAgICAgICAgICAgIHBDLT5tU3RyZWFtSWQgPSBwQy0+bUN1cnJUcmFjazsKLQotICAgICAgICAgICAgICAgIHBWaWRlb1N0cmVhbUhhbmRsZXIgPSAoTTRfVmlkZW9TdHJlYW1IYW5kbGVyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MKLSAgICAgICAgICAgICAgICAgICAgKHNpemVvZihNNF9WaWRlb1N0cmVhbUhhbmRsZXIpLCBNNFJFQURFUl8zR1AsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikiTTRfVmlkZW9TdHJlYW1IYW5kbGVyIik7Ci0gICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gcFZpZGVvU3RyZWFtSGFuZGxlcikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBWaWRlb1N0cmVhbUhhbmRsZXItPm1fc3RydWN0U2l6ZT1zaXplb2YoTTRfVmlkZW9TdHJlYW1IYW5kbGVyKTsKLQotICAgICAgICAgICAgICAgIG1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsCi0gICAgICAgICAgICAgICAgICAgIChpbnQzMl90KikmKHBWaWRlb1N0cmVhbUhhbmRsZXItPm1fdmlkZW9XaWR0aCkpOwotICAgICAgICAgICAgICAgIG1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAoaW50MzJfdCopJihwVmlkZW9TdHJlYW1IYW5kbGVyLT5tX3ZpZGVvSGVpZ2h0KSk7Ci0KLSAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKSAgPSAoTTRfU3RyZWFtSGFuZGxlciopKHBWaWRlb1N0cmVhbUhhbmRsZXIpOwotICAgICAgICAgICAgICAgIG1ldGEtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sIChpbnQ2NF90KikmKER1cmF0aW9uKSk7Ci0gICAgICAgICAgICAgICAgKCgqcFN0cmVhbUhhbmRsZXIpLT5tX2R1cmF0aW9uKSA9IChpbnQzMl90KSgoRHVyYXRpb24pLzEwMDApOyAvLyBjb252ZXJzaW9uIHRvIG1TCi0gICAgICAgICAgICAgICAgcEMtPm1NYXhEdXJhdGlvbiA9ICgoKnBTdHJlYW1IYW5kbGVyKS0+bV9kdXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgaWYgKHBDLT5tTWF4RHVyYXRpb24gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiVmlkZW8gaXMgdG9vIHNob3J0OiAlbGxkIFVzIiwgRHVyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICBkZWxldGUgcFZpZGVvU3RyZWFtSGFuZGxlcjsKLSAgICAgICAgICAgICAgICAgICAgcFZpZGVvU3RyZWFtSGFuZGxlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0U3RyZWFtSGFuZGxlciBtX2R1cmF0aW9uICVkIiwKLSAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZHVyYXRpb24pOwotCi0gICAgICAgICAgICAgICAgb2ZmNjRfdCBmaWxlU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgcEMtPm1EYXRhU291cmNlLT5nZXRTaXplKCZmaWxlU2l6ZSk7Ci0gICAgICAgICAgICAgICAgcEMtPm1GaWxlU2l6ZSAgPSBmaWxlU2l6ZTsKLQotICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0U3RyZWFtSGFuZGxlciBtX2ZpbGVTaXplICVkIiwKLSAgICAgICAgICAgICAgICAgICAgcEMtPm1GaWxlU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBtZXRhLT5maW5kSW50MzIoa0tleU1heElucHV0U2l6ZSwgKGludDMyX3QqKSYobWF4QVVTaXplKSk7Ci0gICAgICAgICAgICAgICAgaWYobWF4QVVTaXplID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbWF4QVVTaXplID0gNzAwMDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX21heEFVU2l6ZSA9IG1heEFVU2l6ZTsKLSAgICAgICAgICAgICAgICBBTE9HVigiPDw8PDw8PDw8PCAgIHZpZGVvOiBtTWF4QVVTaXplIGZyb20gTVA0IGV4dHJhY3RvcjogJWQiLAotICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9tYXhBVVNpemUpOwotCi0gICAgICAgICAgICAgICAgKChNNF9TdHJlYW1IYW5kbGVyKilwVmlkZW9TdHJlYW1IYW5kbGVyKS0+bV9hdmVyYWdlQml0UmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAocEMtPm1GaWxlU2l6ZSAqIDgwMDApL3BDLT5tTWF4RHVyYXRpb247Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRTdHJlYW1IYW5kbGVyIG1fYXZlcmFnZUJpdHJhdGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAoKE00X1N0cmVhbUhhbmRsZXIqKXBWaWRlb1N0cmVhbUhhbmRsZXIpLT5tX2F2ZXJhZ2VCaXRSYXRlKTsKLQotCi0gICAgICAgICAgICAgICAgbWV0YS0+ZmluZEludDMyKGtLZXlGcmFtZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgIChpbnQzMl90KikmKGF2Z0ZQUykpOwotICAgICAgICAgICAgICAgIEFMT0dWKCI8PDw8PDw8PDw8ICAgdmlkZW86IEF2ZXJhZ2UgRlBTIGZyb20gTVA0IGV4dHJhY3RvcjogJWQiLAotICAgICAgICAgICAgICAgICAgICBhdmdGUFMpOwotCi0gICAgICAgICAgICAgICAgcFZpZGVvU3RyZWFtSGFuZGxlci0+bV9hdmVyYWdlRnJhbWVSYXRlID0oTTRPU0FfRmxvYXQpIGF2Z0ZQUzsKLSAgICAgICAgICAgICAgICBBTE9HVigiPDw8PDw8PDw8PCAgIHZpZGVvOiBBdmVyYWdlIEZQUyBmcm9tIE1QNCBleHRyYWN0b3IgaW4gRkxPQVQ6ICVmIiwKLSAgICAgICAgICAgICAgICAgICAgcFZpZGVvU3RyZWFtSGFuZGxlci0+bV9hdmVyYWdlRnJhbWVSYXRlKTsKLQotICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgdmlkZW8gcm90YXRpb24gZGVncmVlCi0gICAgICAgICAgICAgICAgaW50MzJfdCByb3RhdGlvbkRlZ3JlZTsKLSAgICAgICAgICAgICAgICBpZighbWV0YS0+ZmluZEludDMyKGtLZXlSb3RhdGlvbiwgJnJvdGF0aW9uRGVncmVlKSkgewotICAgICAgICAgICAgICAgICAgICByb3RhdGlvbkRlZ3JlZSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBWaWRlb1N0cmVhbUhhbmRsZXItPnZpZGVvUm90YXRpb25EZWdyZWVzID0gcm90YXRpb25EZWdyZWU7Ci0KLSAgICAgICAgICAgICAgICBwQy0+bVZpZGVvU3RyZWFtSGFuZGxlciA9Ci0gICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyKikocFZpZGVvU3RyZWFtSGFuZGxlcik7Ci0KLSAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIERTSSBpbmZvICovCi0gICAgICAgICAgICAgICAgaWYoTTREQV9TdHJlYW1UeXBlVmlkZW9IMjYzID09IHN0cmVhbVR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlEMjYzLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSBzaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgqcFN0cmVhbUhhbmRsZXIpLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVyU3BlY2lmaWMgPSAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSXzNHUCwoTTRPU0FfQ2hhciopIkgyNjMgRFNJIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gRGVjb2RlclNwZWNpZmljKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopRGVjb2RlclNwZWNpZmljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWRhdGEsIHNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb2RlclNwZWNpZmljOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcERlY29kZXJTcGVjaWZpY0luZm8gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BFU0RTSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9FU0RTSW5mb1NpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcEgyNjREZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX0gyNjRkZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiVkVfZ2V0TmV4dFN0cmVhbUhhbmRsZXI6IEgyNjMgZHNpIG5vdCBmb3VuZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcERlY29kZXJTcGVjaWZpY0luZm8gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fSDI2NGRlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BIMjY0RGVjb2RlclNwZWNpZmljSW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BFU0RTSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9FU0RTSW5mb1NpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2YyA9PSBzdHJlYW1UeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKG1ldGEtPmZpbmREYXRhKGtLZXlBVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSBzaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlY29kZXJTcGVjaWZpY0luZm9TaXplICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVyU3BlY2lmaWNJbmZvID0gKE00T1NBX0ludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlclNwZWNpZmljSW5mb1NpemUsIE00UkVBREVSXzNHUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJIMjY0IERlY29kZXJTcGVjaWZpYyIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBEZWNvZGVyU3BlY2lmaWNJbmZvKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncF9nZXROZXh0U3RyZWFtIGlzIE5VTEwgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilkYXRhLCBkZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJEU0kgU2l6ZSAlZCIsIGRlY29kZXJTcGVjaWZpY0luZm9TaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wRVNEU0luZm8gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9FU0RTSW5mb1NpemUgPSAwOwotCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IFZpZGVvRWRpdG9yM2dwUmVhZGVyX0FuYWx5c2VBdmNEc2koKnBTdHJlYW1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIqKURlY29kZXJTcGVjaWZpY0luZm8sIGRlY29kZXJTcGVjaWZpY0luZm9TaXplKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImRlY3NpemUgJWQsIGgyNjRkZWNzaXplICVkOiAlZCIsICgqcFN0cmVhbUhhbmRsZXIpLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICBtX2RlY29kZXJTcGVjaWZpY0luZm9TaXplLCAoKnBTdHJlYW1IYW5kbGVyKS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgbV9IMjY0ZGVjb2RlclNwZWNpZmljSW5mb1NpemUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKE00T1NBX05VTEwgIT0gRGVjb2RlclNwZWNpZmljSW5mbykgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShEZWNvZGVyU3BlY2lmaWNJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIERlY29kZXJTcGVjaWZpY0luZm8gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmKCAoTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNCA9PSBzdHJlYW1UeXBlKSApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlFU0RTLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgRVNEUyBlc2RzKChjb25zdCBjaGFyICopZGF0YSwgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShlc2RzLkluaXRDaGVjaygpLCAoc3RhdHVzX3QpT0spOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9FU0RTSW5mb1NpemUgPSBzaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcEVTRFNJbmZvID0gKE00T1NBX1VJbnQ4KilcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKCpwU3RyZWFtSGFuZGxlciktPm1fRVNEU0luZm9TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfM0dQLCAoTTRPU0FfQ2hhciopIk00ViBEZWNvZGVyU3BlY2lmaWMiICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wRVNEU0luZm8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKikoKnBTdHJlYW1IYW5kbGVyKS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEVTRFNJbmZvLCAodm9pZCAqKWRhdGEsIHNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBlc2RzLmdldENvZGVjU3BlY2lmaWNJbmZvKCZjb2RlY19zcGVjaWZpY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlY19zcGVjaWZpY19kYXRhX3NpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlZFIE1QNCBkc2lzaXplOiAlZCwgJXgiLCBjb2RlY19zcGVjaWZpY19kYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY2lmaWNfZGF0YSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY19zcGVjaWZpY19kYXRhX3NpemU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29kZXJTcGVjaWZpYyA9IChNNE9TQV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfM0dQLCAoTTRPU0FfQ2hhciopIiBEZWNvZGVyU3BlY2lmaWMiICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gRGVjb2RlclNwZWNpZmljKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopRGVjb2RlclNwZWNpZmljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWNvZGVjX3NwZWNpZmljX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjX3NwZWNpZmljX2RhdGFfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcERlY29kZXJTcGVjaWZpY0luZm8gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVyU3BlY2lmaWM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wSDI2NERlY29kZXJTcGVjaWZpY0luZm8gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9IMjY0ZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRTdHJlYW0gTk8gdmlkZW8gc3RyZWFtIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9SRUFERVJfVU5LTk9XTl9TVFJFQU1fVFlQRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dFN0cmVhbSBOTyB2aWRlbyBzdHJlYW0iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUkVBREVSX1VOS05PV05fU1RSRUFNX1RZUEU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIGlmICghaGF2ZUF1ZGlvICYmICFzdHJuY2FzZWNtcChtaW1lLCAiYXVkaW8vIiwgNikpIHsKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0U3RyZWFtIGF1ZGlvIGdldFRyYWNrIGNhbGxlZCIpOwotICAgICAgICAgICAgcEMtPm1BdWRpb1NvdXJjZSA9IHBDLT5tRXh0cmFjdG9yLT5nZXRUcmFjayhwQy0+bUN1cnJUcmFjayk7Ci0gICAgICAgICAgICBwQy0+bUF1ZGlvU291cmNlLT5zdGFydCgpOwotICAgICAgICAgICAgKnBNZWRpYUZhbWlseSA9IE00UkVBREVSX2tNZWRpYUZhbWlseUF1ZGlvOwotCi0gICAgICAgICAgICBpZighc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIpKSB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZDsKLSAgICAgICAgICAgIH0gZWxzZSBpZighc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IpKSB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yV2lkZUJhbmQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQykpIHsKLSAgICAgICAgICAgICAgICBzdHJlYW1UeXBlID0gTTREQV9TdHJlYW1UeXBlQXVkaW9BYWM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0U3RyZWEgc3RyZWFtdHlwZSBVbmtub3duICIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoc3RyZWFtVHlwZSAhPSBNNERBX1N0cmVhbVR5cGVVbmtub3duKSB7Ci0gICAgICAgICAgICAgICAgcEMtPm1TdHJlYW1UeXBlID0gc3RyZWFtVHlwZTsKLSAgICAgICAgICAgICAgICBwQy0+bVN0cmVhbUlkID0gcEMtPm1DdXJyVHJhY2s7Ci0KLSAgICAgICAgICAgICAgICBBTE9HVigiVkUgc3RyZWFtdHlwZSAlZCAsaWQgJWQiLCAgc3RyZWFtVHlwZSwgcEMtPm1DdXJyVHJhY2spOwotCi0gICAgICAgICAgICAgICAgcEF1ZGlvU3RyZWFtSGFuZGxlciA9IChNNF9BdWRpb1N0cmVhbUhhbmRsZXIqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYwotICAgICAgICAgICAgICAgICAgICAoc2l6ZW9mKE00X0F1ZGlvU3RyZWFtSGFuZGxlciksIE00UkVBREVSXzNHUCwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJNNF9BdWRpb1N0cmVhbUhhbmRsZXIiKTsKLSAgICAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQXVkaW9TdHJlYW1IYW5kbGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9zdHJ1Y3RTaXplPXNpemVvZihNNF9BdWRpb1N0cmVhbUhhbmRsZXIpOwotICAgICAgICAgICAgICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fYnl0ZVNhbXBsZVNpemUgICA9IDA7Ci0gICAgICAgICAgICAgICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9uYkNoYW5uZWxzICAgICAgID0gMDsKLSAgICAgICAgICAgICAgICBwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3NhbXBsaW5nRnJlcXVlbmN5PSAwOwotICAgICAgICAgICAgICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fYnl0ZUZyYW1lTGVuZ3RoICA9IDA7Ci0KLSAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKSA9IChNNF9TdHJlYW1IYW5kbGVyKikocEF1ZGlvU3RyZWFtSGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXIgPQotICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciopKHBBdWRpb1N0cmVhbUhhbmRsZXIpOwotICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX2F2ZXJhZ2VCaXRSYXRlID0gMDsKLSAgICAgICAgICAgICAgICBoYXZlQXVkaW8gPSB0cnVlOwotICAgICAgICAgICAgICAgIHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyPShNNF9TdHJlYW1IYW5kbGVyKilwQXVkaW9TdHJlYW1IYW5kbGVyOwotICAgICAgICAgICAgICAgIHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3BFU0RTSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fRVNEU0luZm9TaXplID0gMDsKLQotICAgICAgICAgICAgICAgIG1ldGEtPmZpbmRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCAoaW50MzJfdCopJihtYXhBVVNpemUpKTsKLSAgICAgICAgICAgICAgICBpZihtYXhBVVNpemUgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtYXhBVVNpemUgPSA3MDAwMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fbWF4QVVTaXplID0gbWF4QVVTaXplOwotICAgICAgICAgICAgICAgIEFMT0dWKCJWRSBBdWRpbyBtTWF4QVVTaXplIGZyb20gTVA0IGV4dHJhY3RvcjogJWQiLCBtYXhBVVNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoKE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZCA9PSBzdHJlYW1UeXBlKSB8fAotICAgICAgICAgICAgICAgIChNNERBX1N0cmVhbVR5cGVBdWRpb0FtcldpZGVCYW5kID09IHN0cmVhbVR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGZyZXFJbmRleCA9IDA7IC8qKjwgQU1SIE5CICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIG1vZGVTZXQ7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGk7Ci0gICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCBwQml0UGFyc2VyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgICAgICBpZihNNERBX1N0cmVhbVR5cGVBdWRpb0FtcldpZGVCYW5kID09IHN0cmVhbVR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlcUluZGV4ID0gMTsgLyoqPCBBTVIgV0IgKi8KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobWV0YS0+ZmluZERhdGEoa0tleUVTRFMsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEVTRFMgZXNkcygoY29uc3QgY2hhciAqKWRhdGEsIHNpemUpOwotICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShlc2RzLkluaXRDaGVjaygpLCAoc3RhdHVzX3QpT0spOwotCi0gICAgICAgICAgICAgICAgICAgIGVzZHMuZ2V0Q29kZWNTcGVjaWZpY0luZm8oJmNvZGVjX3NwZWNpZmljX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAmY29kZWNfc3BlY2lmaWNfZGF0YV9zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY2lmaWNfZGF0YV9zaXplOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgoKnBTdHJlYW1IYW5kbGVyKS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVyU3BlY2lmaWMgPSAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl8zR1AsIChNNE9TQV9DaGFyKikiQU1SIERlY29kZXJTcGVjaWZpYyIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IERlY29kZXJTcGVjaWZpYykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKURlY29kZXJTcGVjaWZpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWNvZGVjX3NwZWNpZmljX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY2lmaWNfZGF0YV9zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVyU3BlY2lmaWM7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9VQ2hhciBBbXJEc2lbXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB7J1AnLCdIJywnTCcsJ1AnLDB4MDAsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDEsfTsKLSAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSA5OwotICAgICAgICAgICAgICAgICAgICBEZWNvZGVyU3BlY2lmaWMgPSAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfM0dQLCAoTTRPU0FfQ2hhciopIlBITFAgRGVjb2RlclNwZWNpZmljIiApOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBEZWNvZGVyU3BlY2lmaWMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZihmcmVxSW5kZXggPT0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBbXJEc2lbOF0gPSAweDAxOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgQW1yRHNpWzhdID0gMHgwMjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGk8IDk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgRGVjb2RlclNwZWNpZmljW2ldID0gQW1yRHNpW2ldOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0gRGVjb2RlclNwZWNpZmljOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9hdmVyYWdlQml0UmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0FtckJpdFJhdGVbZnJlcUluZGV4XVs3XTsKLSAgICAgICAgICAgIH0gZWxzZSBpZigoTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgPT0gc3RyZWFtVHlwZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAobWV0YS0+ZmluZERhdGEoa0tleUVTRFMsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEVTRFMgZXNkcygoY29uc3QgY2hhciAqKWRhdGEsIHNpemUpOwotICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShlc2RzLkluaXRDaGVjaygpLCAoc3RhdHVzX3QpT0spOwotCi0gICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX0VTRFNJbmZvU2l6ZSA9IHNpemU7Ci0gICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BFU0RTSW5mbyA9IChNNE9TQV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fRVNEU0luZm9TaXplLCBNNFJFQURFUl8zR1AsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopIkFBQyBEZWNvZGVyU3BlY2lmaWMiICk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09ICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BFU0RTSW5mbykgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKSgqcFN0cmVhbUhhbmRsZXIpLT5tX3BFU0RTSW5mbywKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilkYXRhLCBzaXplKTsKLSAgICAgICAgICAgICAgICAgICAgZXNkcy5nZXRDb2RlY1NwZWNpZmljSW5mbygmY29kZWNfc3BlY2lmaWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlY19zcGVjaWZpY19kYXRhX3NpemUpOwotCi0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJWRWRzaSAlZCwleCIsY29kZWNfc3BlY2lmaWNfZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY2lmaWNfZGF0YSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY2lmaWNfZGF0YV9zaXplOwotICAgICAgICAgICAgICAgICAgICBpZiAoKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgRGVjb2RlclNwZWNpZmljID0gKE00T1NBX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfM0dQLCAoTTRPU0FfQ2hhciopIkFBQyBEZWNvZGVyU3BlY2lmaWMiICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBEZWNvZGVyU3BlY2lmaWMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilEZWNvZGVyU3BlY2lmaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiljb2RlY19zcGVjaWZpY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjX3NwZWNpZmljX2RhdGFfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb2RlclNwZWNpZmljOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcERlY29kZXJTcGVjaWZpY0luZm8gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dFN0cmVhbSBtU3RyZWFtVHlwZTogbm9uZSAiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUkVBREVSX1VOS05PV05fU1RSRUFNX1RZUEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVigiVkUgbm9hdWRpby12aWRlbyBzdHJlYW06cEMtPm1DdXJyVHJhY2sgPSAlZCAiLHBDLT5tQ3VyclRyYWNrKTsKLSAgICAgICAgICAgIHBDLT5tQ3VyclRyYWNrKys7IC8vSW5jcmVtZW50IGN1cnJlbnQgdHJhY2sgdG8gZ2V0IHRoZSBuZXh0IHRyYWNrCi0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUkVBREVSX1VOS05PV05fU1RSRUFNX1RZUEU7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoIlZFIFN0cmVhbVR5cGU6ICVkLCBzdHJlbWhhbmRsZXIgJXgiLHN0cmVhbVR5cGUsICpwU3RyZWFtSGFuZGxlciApOwotICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9zdHJlYW1UeXBlID0gc3RyZWFtVHlwZTsKLSAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fc3RyZWFtSWQgICA9IHBDLT5tU3RyZWFtSWQ7Ci0gICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BVc2VyRGF0YSAgPSBNNE9TQV9OVUxMOwotICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9zdHJ1Y3RTaXplID0gc2l6ZW9mKE00X1N0cmVhbUhhbmRsZXIpOwotICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9iU3RyZWFtSXNPSyA9IE00T1NBX1RSVUU7Ci0KLSAgICAgICAgbWV0YS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwKLSAgICAgICAgICAgIChpbnQ2NF90KikmKER1cmF0aW9uKSk7Ci0KLSAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZHVyYXRpb24gPSAoaW50MzJfdCkoRHVyYXRpb24gLyAxMDAwKTsKLQotICAgICAgICBwQy0+bU1heER1cmF0aW9uID0gKCgqcFN0cmVhbUhhbmRsZXIpLT5tX2R1cmF0aW9uKTsKLSAgICAgICAgQUxPR1YoIlZFIHN0ciBkdXJhdGlvbiBkdXJhdGlvbjogJWQgIiwgKCpwU3RyZWFtSGFuZGxlciktPm1fZHVyYXRpb24pOwotCi0gICAgICAgIC8qIEluIEFBQyBjYXNlOiBQdXQgdGhlIGZpcnN0IEFVIGluIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fcFVzZXJEYXRhCi0gICAgICAgICAqc2luY2UgZGVjb2RlciBoYXMgdG8ga25vdyBpZiBzdHJlYW0gY29udGFpbnMgU0JSIGRhdGEoSW1wbGljaXQgc2lnKSAqLwotICAgICAgICBpZihNNERBX1N0cmVhbVR5cGVBdWRpb0FhYyA9PSAoKnBTdHJlYW1IYW5kbGVyKS0+bV9zdHJlYW1UeXBlKSB7Ci0gICAgICAgICAgICBNNFJFQURFUl9BdWRpb1NiclVzZXJkYXRhKiAgcEF1ZGlvU2JyVXNlcmRhdGE7Ci0KLSAgICAgICAgICAgIHBBdWRpb1NiclVzZXJkYXRhID0gKE00UkVBREVSX0F1ZGlvU2JyVXNlcmRhdGEqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICBzaXplb2YoTTRSRUFERVJfQXVkaW9TYnJVc2VyZGF0YSksTTRSRUFERVJfM0dQLAotICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikiTTRSRUFERVJfQXVkaW9TYnJVc2VyZGF0YSIpOwotICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gcEF1ZGlvU2JyVXNlcmRhdGEpIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICBnb3RvIEVycm9yOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcFVzZXJEYXRhID0gcEF1ZGlvU2JyVXNlcmRhdGE7Ci0gICAgICAgICAgICBwQXVkaW9TYnJVc2VyZGF0YS0+bV9iSXNTYnJFbmFibGVkID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAgICAgICAgIHBBdWRpb1NiclVzZXJkYXRhLT5tX3BGaXJzdEFVID0gKE00X0FjY2Vzc1VuaXQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICBzaXplb2YoTTRfQWNjZXNzVW5pdCksTTRSRUFERVJfM0dQLCAoTTRPU0FfQ2hhciopIjFzdCBBQUMgQVUiKTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBBdWRpb1NiclVzZXJkYXRhLT5tX3BGaXJzdEFVKSB7Ci0gICAgICAgICAgICAgICAgcEF1ZGlvU2JyVXNlcmRhdGEtPm1fcEFhY0RlY29kZXJVc2VyQ29uZmlnID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICBnb3RvIEVycm9yOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEF1ZGlvU2JyVXNlcmRhdGEtPm1fcEFhY0RlY29kZXJVc2VyQ29uZmlnID0gKE00X0FhY0RlY29kZXJDb25maWcqKVwKLSAgICAgICAgICAgICAgICBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00X0FhY0RlY29kZXJDb25maWcpLE00UkVBREVSXzNHUCwKLSAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopIm1fcEFhY0RlY29kZXJVc2VyQ29uZmlnIik7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQXVkaW9TYnJVc2VyZGF0YS0+bV9wQWFjRGVjb2RlclVzZXJDb25maWcpIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICBnb3RvIEVycm9yOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmKE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjID09ICgqcFN0cmVhbUhhbmRsZXIpLT5tX3N0cmVhbVR5cGUpIHsKLSAgICAgICAgICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogcEF1ZGlvU3RyZWFtSGFuZGxlciA9Ci0gICAgICAgICAgICAgICAgKE00X0F1ZGlvU3RyZWFtSGFuZGxlciopKCpwU3RyZWFtSGFuZGxlcik7Ci0gICAgICAgICAgICBNNFJFQURFUl9BdWRpb1NiclVzZXJkYXRhKiBwVXNlckRhdGEgPSAoTTRSRUFERVJfQXVkaW9TYnJVc2VyZGF0YSopXAotICAgICAgICAgICAgICAgIChwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2Jhc2ljUHJvcGVydGllcy5tX3BVc2VyRGF0YSk7Ci0KLSAgICAgICAgICAgIGVyciA9IFZpZGVvRWRpdG9yM2dwUmVhZGVyX2ZpbGxBdVN0cnVjdChwQywgKCpwU3RyZWFtSGFuZGxlciksCi0gICAgICAgICAgICAgICAgKE00X0FjY2Vzc1VuaXQqKXBVc2VyRGF0YS0+bV9wRmlyc3RBVSk7Ci0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICBnb3RvIEVycm9yOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZXJyID0gVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1KHBDLCAoKnBTdHJlYW1IYW5kbGVyKSwKLSAgICAgICAgICAgICAgICAoTTRfQWNjZXNzVW5pdCopcFVzZXJEYXRhLT5tX3BGaXJzdEFVKTsKLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIDEuICJNNFdBUl9OT19NT1JFX0FVID09IGVyciIgaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgbm8gbW9yZQotICAgICAgICAgICAgICogYWNjZXNzIHVuaXQgZnJvbSB0aGUgY3VycmVudCB0cmFjay4gSW4gb3RoZXIgd29yZHMsIHRoZXJlCi0gICAgICAgICAgICAgKiBpcyBvbmx5IGEgc2luZ2xlIGFjY2VzcyB1bml0IGZyb20gdGhlIGN1cnJlbnQgdHJhY2ssIGFuZAotICAgICAgICAgICAgICogdGhlIHBhcnNpbmcgb2YgdGhpcyB0cmFjayBoYXMgcmVhY2hlZCBFT1MuIFRoZSByZWFzb24gd2h5Ci0gICAgICAgICAgICAgKiB0aGUgZmlyc3QgYWNjZXNzIHVuaXQgbmVlZHMgdG8gYmUgcGFyc2VkIGhlcmUgaXMgYmVjYXVzZSBmb3IKLSAgICAgICAgICAgICAqIHNvbWUgYXVkaW8gY29kZWMgKGxpa2UgQUFDKSwgdGhlIHZlcnkgZmlyc3QgYWNjZXNzIHVuaXQKLSAgICAgICAgICAgICAqIG11c3QgYmUgZGVjb2RlZCBiZWZvcmUgaXRzIGNvbmZpZ3VyYXRpb24vZW5jb2RpbmcgcGFyYW1ldGVycwotICAgICAgICAgICAgICogKHN1Y2ggYXMgIyBvZiBjaGFubmVscyBhbmQgc2FtcGxlIHJhdGUpIGNhbiBiZSBjb3JyZWN0bHkKLSAgICAgICAgICAgICAqIGRldGVybWluZWQuCi0gICAgICAgICAgICAgKgotICAgICAgICAgICAgICogMi4gInRyYWNrQ291bnQgPiBwQy0+bUN1cnJUcmFjayIgaW5kaWNhdGVzIHRoYXQgdGhlcmUgYXJlIG90aGVyCi0gICAgICAgICAgICAgKiB0cmFja3MgdG8gYmUgcGFyc2VkLCBpbiBhZGRpdGlvbiB0byB0aGUgY3VycmVudCB0cmFjay4KLSAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgKiBXaGVuIGJvdGggY29uZGl0aW9ucyAxICYgMiBob2xkLCBvdGhlciB0cmFja3Mgc2hvdWxkIGJlCi0gICAgICAgICAgICAgKiBwYXJzZWQuIFRodXMsIHdlIHNob3VsZCBub3QgYmFpbCBvdXQuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChNNFdBUl9OT19NT1JFX0FVID09IGVyciAmJiB0cmFja0NvdW50ID4gcEMtPm1DdXJyVHJhY2spIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICBnb3RvIEVycm9yOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZXJyID0gVmlkZW9FZGl0b3IzZ3BSZWFkZXJfcmVzZXQocEMsICgqcFN0cmVhbUhhbmRsZXIpKTsKLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcEMtPm1DdXJyVHJhY2srKzsgLy9JbmNyZW1lbnQgdGhlIGN1cnJlbnQgdHJhY2sgdG8gZ2V0IG5leHQgdHJhY2sKLSAgICBBTE9HVigicEMtPm1DdXJyVHJhY2sgPSAlZCIscEMtPm1DdXJyVHJhY2spOwotCi0gICAgaWYgKCFoYXZlQXVkaW8gJiYgIWhhdmVWaWRlbykgewotICAgICAgICAqcE1lZGlhRmFtaWx5PU00UkVBREVSX2tNZWRpYUZhbWlseVVua25vd247Ci0gICAgICAgIHJldHVybiBNNEVSUl9SRUFERVJfVU5LTk9XTl9TVFJFQU1fVFlQRTsKLSAgICB9Ci1FcnJvcjoKLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dFN0cmVhbUhhbmRsZXIgZW5kIGVycm9yID0gJWQiLGVycik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldFByZXZSYXBUaW1lKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwgTTRPU0FfSW50MzIqIHBUaW1lKQotewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQgKnBDID0gKFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTWVkaWFCdWZmZXIgKm1NZWRpYUJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIG9wdGlvbnM7Ci0gICAgTTRPU0FfVGltZSB0aW1lNjQ7Ci0gICAgaW50NjRfdCB0ZW1wVGltZTY0ID0gMDsKLSAgICBzdGF0dXNfdCBlcnJvcjsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRQcmV2UmFwVGltZSBiZWdpbiIpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQyA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0UHJldlJhcFRpbWU6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldFByZXZSYXBUaW1lIGludmFsaWQgcG9pbnRlciB0byBTdHJlYW1IYW5kbGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwVGltZSA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0UHJldlJhcFRpbWU6IGludmFsaWQgdGltZSBwb2ludGVyIik7Ci0gICAgaWYgKCpwVGltZSA9PSAocFN0cmVhbUhhbmRsZXItPm1fZHVyYXRpb24pKSB7Ci0gICAgICAgICpwVGltZSAtPSAxOwotICAgIH0KLQotICAgIHRpbWU2NCA9IChNNE9TQV9UaW1lKSpwVGltZSAqIDEwMDA7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0UHJldlJhcFRpbWUgc2VlayB0aW1lOiAlbGQiLHRpbWU2NCk7Ci0gICAgb3B0aW9ucy5zZXRTZWVrVG8odGltZTY0LCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQyk7Ci0gICAgZXJyb3IgPSBwQy0+bVZpZGVvU291cmNlLT5yZWFkKCZtTWVkaWFCdWZmZXIsICZvcHRpb25zKTsKLSAgICBpZiAoZXJyb3IgIT0gT0spIHsKLSAgICAgICAgLy9DYW4gbm90IGdldCB0aGUgcHJldmlvdXMgU3luYy4KLSAgICAgICAgLy9NdXN0IGJlIGVuZCBvZiBzdHJlYW0uCi0gICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX0FVOwotICAgIH0KLQotICAgIG1NZWRpYUJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgKGludDY0X3QqKSZ0ZW1wVGltZTY0KTsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0UHJldlJhcFRpbWUgcmVhZCB0aW1lICVsZCwgJXgiLCB0ZW1wVGltZTY0LAotICAgICAgICBtTWVkaWFCdWZmZXIpOwotCi0gICAgKnBUaW1lID0gKE00T1NBX0ludDMyKSh0ZW1wVGltZTY0IC8gMTAwMCk7Ci0KLSAgICBpZihtTWVkaWFCdWZmZXIgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICBBTE9HVigiIG1NZWRpYUJ1ZmZlciBzaXplID0gJWQgbGVuZ3RoICVkIiwgbU1lZGlhQnVmZmVyLT5zaXplKCksCi0gICAgICAgICAgICBtTWVkaWFCdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLSAgICAgICAgbU1lZGlhQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1NZWRpYUJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIG9wdGlvbnMuY2xlYXJTZWVrVG8oKTsKLQotICAgIGlmKGVycm9yICE9IE9LKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRQcmV2UmFwVGltZSBlbmQgXAotICAgICAgICAgICAgTTRXQVJfUkVBREVSX0lORk9STUFUSU9OX05PVF9QUkVTRU5UIik7Ci0gICAgICAgIHJldHVybiBNNFdBUl9SRUFERVJfSU5GT1JNQVRJT05fTk9UX1BSRVNFTlQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldFByZXZSYXBUaW1lIGVuZDogZXJyICV4IiwgZXJyKTsKLSAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci19Ci0KLWV4dGVybiAiQyIgewotTTRPU0FfRVJSIFZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldEludGVyZmFjZShNNFJFQURFUl9NZWRpYVR5cGUgKnBNZWRpYVR5cGUsCi0gICAgICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSAqKnBSZHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKipwUmRyRGF0YUludGVyZmFjZSkgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBNZWRpYVR5cGUsICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBSZHJHbG9iYWxJbnRlcmZhY2UsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwUmRyRGF0YUludGVyZmFjZSwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRJbnRlcmZhY2UgYmVnaW4iKTsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0SW50ZXJmYWNlICVkIDB4JXggMHgleCIsICpwTWVkaWFUeXBlLAotICAgICAgICAqcFJkckdsb2JhbEludGVyZmFjZSwqcFJkckRhdGFJbnRlcmZhY2UpOwotCi0gICAgU0FGRV9NQUxMT0MoKnBSZHJHbG9iYWxJbnRlcmZhY2UsIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSwgMSwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldEludGVyZmFjZSIpOwotICAgIFNBRkVfTUFMTE9DKCpwUmRyRGF0YUludGVyZmFjZSwgTTRSRUFERVJfRGF0YUludGVyZmFjZSwgMSwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldEludGVyZmFjZSIpOwotCi0gICAgKnBNZWRpYVR5cGUgPSBNNFJFQURFUl9rTWVkaWFUeXBlM0dQUDsKLQotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdENyZWF0ZSAgICAgICA9IFZpZGVvRWRpdG9yM2dwUmVhZGVyX2NyZWF0ZTsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3REZXN0cm95ICAgICAgPSBWaWRlb0VkaXRvcjNncFJlYWRlcl9kZXN0cm95OwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdE9wZW4gICAgICAgICA9IFZpZGVvRWRpdG9yM2dwUmVhZGVyX29wZW47Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0Q2xvc2UgICAgICAgID0gVmlkZW9FZGl0b3IzZ3BSZWFkZXJfY2xvc2U7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0R2V0T3B0aW9uICAgID0gVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdFNldE9wdGlvbiAgICA9IFZpZGVvRWRpdG9yM2dwUmVhZGVyX3NldE9wdGlvbjsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RHZXROZXh0U3RyZWFtID0KLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dFN0cmVhbUhhbmRsZXI7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0RmlsbEF1U3RydWN0ID0KLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZmlsbEF1U3RydWN0OwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdFN0YXJ0ICAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0U3RvcCAgICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RKdW1wICAgICAgICAgPSBWaWRlb0VkaXRvcjNncFJlYWRlcl9qdW1wOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdFJlc2V0ICAgICAgICA9IFZpZGVvRWRpdG9yM2dwUmVhZGVyX3Jlc2V0OwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdEdldFByZXZSYXBUaW1lID0KLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0UHJldlJhcFRpbWU7Ci0gICAgKCpwUmRyRGF0YUludGVyZmFjZSktPm1fcEZjdEdldE5leHRBdSAgICAgID0gVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1OwotICAgICgqcFJkckRhdGFJbnRlcmZhY2UpLT5tX3JlYWRlckNvbnRleHQgICAgICA9IE00T1NBX05VTEw7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0SW50ZXJmYWNlIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgU0FGRV9GUkVFKCpwUmRyR2xvYmFsSW50ZXJmYWNlKTsKLSAgICAgICAgU0FGRV9GUkVFKCpwUmRyRGF0YUludGVyZmFjZSk7Ci0KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldEludGVyZmFjZSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldEludGVyZmFjZSBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi19ICAvKiBleHRlcm4gIkMiICovCi0KLX0gIC8qIG5hbWVzcGFjZSBhbmRyb2lkICovCi0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvckF1ZGlvRGVjb2Rlci5jcHAgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTRjN2VhMS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDk5MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAZmlsZSAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyLmNwcAotKiBAYnJpZWYgIFN0YWdlRnJpZ2h0IHNoZWxsIEF1ZGlvIERlY29kZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNkZWZpbmUgTE9HX05ERUJVRyAxCi0jZGVmaW5lIExPR19UQUcgIlZJREVPRURJVE9SX0FVRElPREVDT0RFUiIKLQotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXIuaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvclV0aWxzLmgiCi0jaW5jbHVkZSAiTTRNQ1NfSW50ZXJuYWxUeXBlcy5oIgotCi0jaW5jbHVkZSAidXRpbHMvTG9nLmgiCi0jaW5jbHVkZSAidXRpbHMvVmVjdG9yLmgiCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaD4KLQotLyoqKioqKioqKioqKioqKioqKioqCi0gKiAgIERFRklOSVRJT05TICAgICoKLSAqKioqKioqKioqKioqKioqKioqKi8KLS8vIFZlcnNpb24KLSNkZWZpbmUgVklERU9FRElUT1JfQVVESU9fREVDT0RFUl9WRVJTSU9OX01BSk9SIDEKLSNkZWZpbmUgVklERU9FRElUT1JfQVVESU9fREVDT0RFUl9WRVJTSU9OX01JTk9SIDAKLSNkZWZpbmUgVklERU9FRElUT1JfQVVESU9fREVDT0RFUl9WRVJTSU9OX1JFViAgIDAKLQotLy8gRm9yY2UgdXNpbmcgc29mdHdhcmUgZGVjb2RlciBhcyBlbmdpbmUgZG9lcyBub3Qgc3VwcG9ydCBwcmVmZXRjaAotI2RlZmluZSBWSURFT0VESVRPUl9GT1JDRUNPREVDIGtTb2Z0d2FyZUNvZGVjc09ubHkKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UgewotICAgIHB1YmxpYzoKLSAgICAgICAgc3RhdGljIHNwPFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlPiBDcmVhdGUoCi0gICAgICAgICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+JiBmb3JtYXQsIHZvaWQgKmRlY29kZXJTaGVsbENvbnRleHQpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMgPSBOVUxMKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoTWVkaWFCdWZmZXIgKipidWZmZXIsCi0gICAgICAgIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBzdG9yZUJ1ZmZlcihNZWRpYUJ1ZmZlciAqYnVmZmVyKTsKLQotICAgIHByb3RlY3RlZDoKLSAgICAgICAgdmlydHVhbCB+VmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2UoKTsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGVudW0gU3RhdGUgewotICAgICAgICAgICAgQ1JFQVRFRCwKLSAgICAgICAgICAgIFNUQVJURUQsCi0gICAgICAgICAgICBFUlJPUgotICAgICAgICB9OwotICAgICAgICBWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZShjb25zdCBzcDxNZXRhRGF0YT4mIGZvcm1hdCwKLSAgICAgICAgIHZvaWQgKmRlY29kZXJTaGVsbENvbnRleHQpOwotICAgICAgICBzcDxNZXRhRGF0YT4gbUZvcm1hdDsKLSAgICAgICAgVmVjdG9yPE1lZGlhQnVmZmVyKj4gbUJ1ZmZlcnM7Ci0gICAgICAgIE11dGV4IG1Mb2NrOyAgLy8gcHJvdGVjdHMgbUJ1ZmZlcnMKLSAgICAgICAgYm9vbCBtSXNFT1M7Ci0gICAgICAgIFN0YXRlIG1TdGF0ZTsKLSAgICAgICAgdm9pZCogbURlY1NoZWxsQ29udGV4dDsKLSAgICAgICAgLy8gRG9uJ3QgY2FsbCBtZS4KLSAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2UoY29uc3QgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2UmKTsKLSAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2UmIG9wZXJhdG9yPSgKLSAgICAgICAgICAgIGNvbnN0IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlICYpOwotfTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dAotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGNvbnRleHQgb2YgdGhlIFN0YWdlRnJpZ2h0IGF1ZGlvIGRlY29kZXIKLSAqICAgICAgICAgICBzaGVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE00QURfVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgbURlY29kZXJUeXBlOwotICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogICAgICAgICAgICAgbUF1ZGlvU3RyZWFtSGFuZGxlcjsKLSAgICBzcDxWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZT4gIG1EZWNvZGVyU291cmNlOwotICAgIE9NWENsaWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgbUNsaWVudDsKLSAgICBzcDxNZWRpYVNvdXJjZT4gICAgICAgICAgICAgICAgICAgIG1EZWNvZGVyOwotICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5iT3V0cHV0Q2hhbm5lbHM7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmJJbnB1dEZyYW1lczsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYk91dHB1dEZyYW1lczsKLSAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICAqbV9wUmVhZGVyOwotICAgIE00X0FjY2Vzc1VuaXQqIG1fcE5leHRBY2Nlc3NVbml0VG9EZWNvZGU7Ci0gICAgTTRPU0FfRVJSIHJlYWRlckVyckNvZGU7Ci0gICAgaW50MzJfdCB0aW1lU3RhbXBNczsKLQotfSBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9Db250ZXh0OwotCi1zcDxWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZT4gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OkNyZWF0ZSgKLSAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+JiBmb3JtYXQsIHZvaWQgKmRlY29kZXJTaGVsbENvbnRleHQpIHsKLQotICAgIHNwPFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlPiBhU291cmNlID0KLSAgICAgICAgbmV3IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlKGZvcm1hdCwgZGVjb2RlclNoZWxsQ29udGV4dCk7Ci0KLSAgICByZXR1cm4gYVNvdXJjZTsKLX0KLQotVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlKAotICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4mIGZvcm1hdCwgdm9pZCogZGVjb2RlclNoZWxsQ29udGV4dCk6Ci0gICAgICAgIG1Gb3JtYXQoZm9ybWF0KSwKLSAgICAgICAgbUlzRU9TKGZhbHNlKSwKLSAgICAgICAgbVN0YXRlKENSRUFURUQpLAotICAgICAgICBtRGVjU2hlbGxDb250ZXh0KGRlY29kZXJTaGVsbENvbnRleHQpIHsKLX0KLQotVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6On5WaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZSgpIHsKLQotICAgIGlmKCBTVEFSVEVEID09IG1TdGF0ZSApIHsKLSAgICAgICAgc3RvcCgpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICptZXRhKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0KLSAgICBpZiggQ1JFQVRFRCAhPSBtU3RhdGUgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZTo6c3RhcnQ6IGludmFsaWQgc3RhdGUgJWQiLCBtU3RhdGUpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICBtU3RhdGUgPSBTVEFSVEVEOwotCi1jbGVhblVwOgotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZTo6c3RhcnQgRU5EICgweCV4KSIsIGVycik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OnN0b3AoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZTo6c3RvcCBiZWdpbiIpOwotCi0gICAgaWYoIFNUQVJURUQgIT0gbVN0YXRlICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OnN0b3A6IGludmFsaWQgc3RhdGUgJWQiLCBtU3RhdGUpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICBpZiAoIW1CdWZmZXJzLmVtcHR5KCkpIHsKLSAgICAgICAgaW50IG4gPSBtQnVmZmVycy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgICAgICBtQnVmZmVycy5pdGVtQXQoaSktPnJlbGVhc2UoKTsKLSAgICAgICAgfQotICAgICAgICBBTE9HVygiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OnN0b3AgOiAlZCBidWZmZXIgcmVtYWluZWQiLCBuKTsKLSAgICAgICAgbUJ1ZmZlcnMuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBtU3RhdGUgPSBDUkVBVEVEOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlOjpzdG9wIEVORCAoMHgleCkiLCBlcnIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLXNwPE1ldGFEYXRhPiBWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZTo6Z2V0Rm9ybWF0KCkgewotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlOjpnZXRGb3JtYXQiKTsKLSAgICByZXR1cm4gbUZvcm1hdDsKLX0KLQotc3RhdGljIE1lZGlhQnVmZmVyKiByZWFkQnVmZmVyRnJvbVJlYWRlcigKLSAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCogcERlY0NvbnRleHQpIHsKLSAgICBNNE9TQV9FUlIgbGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRfQWNjZXNzVW5pdCogcEFjY2Vzc1VuaXQgPSBwRGVjQ29udGV4dC0+bV9wTmV4dEFjY2Vzc1VuaXRUb0RlY29kZTsKLQotICAgIC8vIEdldCBuZXh0IEFVIGZyb20gcmVhZGVyLgotICAgIGxlcnIgPSBwRGVjQ29udGV4dC0+bV9wUmVhZGVyLT5tX3BGY3RHZXROZXh0QXUoCi0gICAgICAgICAgICAgICBwRGVjQ29udGV4dC0+bV9wUmVhZGVyLT5tX3JlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciopcERlY0NvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXIsCi0gICAgICAgICAgICAgICBwQWNjZXNzVW5pdCk7Ci0KLSAgICBpZiAobGVyciA9PSBNNFdBUl9OT19NT1JFX0FVKSB7Ci0gICAgICAgIEFMT0dWKCJyZWFkQnVmZmVyRnJvbVJlYWRlciA6IEVPUyIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBwRGVjQ29udGV4dC0+dGltZVN0YW1wTXMgPSBwQWNjZXNzVW5pdC0+bV9DVFM7Ci0KLSAgICBNZWRpYUJ1ZmZlciogbmV3QnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKChzaXplX3QpcEFjY2Vzc1VuaXQtPm1fc2l6ZSk7Ci0gICAgbWVtY3B5KCh2b2lkICopKChNNE9TQV9JbnQ4KiluZXdCdWZmZXItPmRhdGEoKSArIG5ld0J1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkpLAotICAgICAgICAodm9pZCAqKXBBY2Nlc3NVbml0LT5tX2RhdGFBZGRyZXNzLCBwQWNjZXNzVW5pdC0+bV9zaXplKTsKLSAgICBuZXdCdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgKHBBY2Nlc3NVbml0LT5tX0NUUyAqIDEwMDBMTCkpOwotICAgIHJldHVybiBuZXdCdWZmZXI7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlOjpyZWFkKE1lZGlhQnVmZmVyICoqYnVmZmVyLAotICAgICAgICBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7Ci0gICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIHJlYWRPcHRpb25zOwotCi0gICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCogcERlY0NvbnRleHQgPQotICAgICAoVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCAqKW1EZWNTaGVsbENvbnRleHQ7Ci0KLSAgICBpZiAoIFNUQVJURUQgIT0gbVN0YXRlICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OnJlYWQgaW52YWxpZCBzdGF0ZSAlZCIsIG1TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIC8vIEdldCBhIGJ1ZmZlciBmcm9tIHRoZSByZWFkZXIgaWYgd2UgZG9uJ3QgaGF2ZSBhbnkKLSAgICBpZihtQnVmZmVycy5lbXB0eSgpKSB7Ci0gICAgICAgIE1lZGlhQnVmZmVyKiBuZXdCdWZmZXIgPSByZWFkQnVmZmVyRnJvbVJlYWRlcihwRGVjQ29udGV4dCk7Ci0gICAgICAgIGlmICghbmV3QnVmZmVyKSB7Ci0gICAgICAgICAgICAqYnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgIHBEZWNDb250ZXh0LT5yZWFkZXJFcnJDb2RlID0gTTRXQVJfTk9fTU9SRV9BVTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgICAgICB9Ci0gICAgICAgIG1CdWZmZXJzLnB1c2gobmV3QnVmZmVyKTsKLSAgICB9Ci0gICAgKmJ1ZmZlciA9IG1CdWZmZXJzLml0ZW1BdCgwKTsKLSAgICBtQnVmZmVycy5yZW1vdmVBdCgwKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZTo6c3RvcmVCdWZmZXIoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCogcERlY0NvbnRleHQgPQotICAgICAoVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCAqKW1EZWNTaGVsbENvbnRleHQ7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OnN0b3JlQnVmZmVyIGJlZ2luIik7Ci0KLSAgICAvLyBJZiB0aGUgdXNlciBkaWRuJ3QgZ2l2ZSB1cyBhIGJ1ZmZlciwgZ2V0IGl0IGZyb20gdGhlIHJlYWRlci4KLSAgICBpZihidWZmZXIgPT0gTlVMTCkgewotICAgICAgICBNZWRpYUJ1ZmZlciogbmV3QnVmZmVyID0gcmVhZEJ1ZmZlckZyb21SZWFkZXIocERlY0NvbnRleHQpOwotICAgICAgICBpZiAoIW5ld0J1ZmZlcikgewotICAgICAgICAgICAgcERlY0NvbnRleHQtPnJlYWRlckVyckNvZGUgPSBNNFdBUl9OT19NT1JFX0FVOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGJ1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICB9Ci0KLSAgICBtQnVmZmVycy5wdXNoKGJ1ZmZlcik7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlOjpzdG9yZUJ1ZmZlciBFTkQiKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgIFRPT0xTICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKi8KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEJpdHMoTTRPU0FfSW50OCogcERhdGEsCi0gICAgICAgIE00T1NBX1VJbnQzMiBkYXRhU2l6ZSwgTTRPU0FfVUludDggbmJCaXRzLCBNNE9TQV9JbnQzMiogcFJlc3VsdCwKLSAgICAgICAgTTRPU0FfVUludDMyKiBwT2Zmc2V0KSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9VSW50MzIgc3RhcnRCeXRlID0gMDsKLSAgICBNNE9TQV9VSW50MzIgc3RhcnRCaXQgPSAwOwotICAgIE00T1NBX1VJbnQzMiBlbmRCeXRlID0gMDsKLSAgICBNNE9TQV9VSW50MzIgZW5kQml0ID0gMDsKLSAgICBNNE9TQV9VSW50MzIgY3VycmVudEJ5dGUgPSAwOwotICAgIE00T1NBX1VJbnQzMiByZXN1bHQgPSAwOwotICAgIE00T1NBX1VJbnQzMiB1aTMyVG1wID0gMDsKLSAgICBNNE9TQV9VSW50MzIgdWkzMk1hc2sgPSAwOwotCi0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcERhdGEsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwT2Zmc2V0LCBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKDMyID49IG5iQml0cywgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSygoKnBPZmZzZXQgKyBuYkJpdHMpIDw9IDgqZGF0YVNpemUsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0Qml0cyBiZWdpbiIpOwotCi0gICAgc3RhcnRCeXRlICAgPSAoKnBPZmZzZXQpID4+IDM7Ci0gICAgZW5kQnl0ZSAgICAgPSAoKnBPZmZzZXQgKyBuYkJpdHMpID4+IDM7Ci0gICAgc3RhcnRCaXQgICAgPSAoKnBPZmZzZXQpICUgODsKLSAgICBlbmRCaXQgICAgICA9ICgqcE9mZnNldCArIG5iQml0cykgJSA4OwotICAgIGN1cnJlbnRCeXRlID0gc3RhcnRCeXRlOwotCi0gICAgLy8gRXh0cmFjdCB0aGUgcmVxdWVzdGVkIG51bmJlciBvZiBiaXRzIGZyb20gbWVtb3J5Ci0gICAgd2hpbGUoIGN1cnJlbnRCeXRlIDw9IGVuZEJ5dGUpIHsKLSAgICAgICAgdWkzMk1hc2sgPSAweDAwMDAwMEZGOwotICAgICAgICBpZiggY3VycmVudEJ5dGUgPT0gc3RhcnRCeXRlICkgewotICAgICAgICAgICAgdWkzMk1hc2sgPj49IHN0YXJ0Qml0OwotICAgICAgICB9Ci0gICAgICAgIHVpMzJUbXAgPSB1aTMyTWFzayAmICgoTTRPU0FfVUludDMyKXBEYXRhW2N1cnJlbnRCeXRlXSk7Ci0gICAgICAgIGlmKCBjdXJyZW50Qnl0ZSA9PSBlbmRCeXRlICkgewotICAgICAgICAgICAgdWkzMlRtcCA+Pj0gKDgtZW5kQml0KTsKLSAgICAgICAgICAgIHJlc3VsdCA8PD0gZW5kQml0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzdWx0IDw8PSA4OwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdCB8PSB1aTMyVG1wOwotICAgICAgICBjdXJyZW50Qnl0ZSsrOwotICAgIH0KLQotICAgICpwUmVzdWx0ID0gcmVzdWx0OwotICAgICpwT2Zmc2V0ICs9IG5iQml0czsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRCaXRzIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEJpdHMgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRCaXRzIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotI2RlZmluZSBGUkVRX1RBQkxFX1NJWkUgMTYKLWNvbnN0IE00T1NBX1VJbnQzMiBBRF9BQUNfRlJFUV9UQUJMRVtGUkVRX1RBQkxFX1NJWkVdID0KLSAgICB7OTYwMDAsIDg4MjAwLCA2NDAwMCwgNDgwMDAsIDQ0MTAwLAotICAgIDMyMDAwLCAyNDAwMCwgMjIwNTAsIDE2MDAwLCAxMjAwMCwgMTEwMjUsIDgwMDAsIDczNTAsIDAsIDAsIDB9OwotCi0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9wYXJzZV9BQUNfRFNJKE00T1NBX0ludDgqIHBEU0ksCi0gICAgICAgIE00T1NBX1VJbnQzMiBkc2lTaXplLCBBQUNfREVDX1NUUkVBTV9QUk9QUyogcFByb3BlcnRpZXMpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQzMiBvZmZzZXQgPSAwOwotICAgIE00T1NBX0ludDMyIHJlc3VsdCA9IDA7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfcGFyc2VfQUFDX0RTSSBiZWdpbiIpOwotCi0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcERTSSwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBQcm9wZXJ0aWVzLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgLy8gR2V0IHRoZSBvYmplY3QgdHlwZQotICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEJpdHMocERTSSwgZHNpU2l6ZSwgNSwgJnJlc3VsdCwgJm9mZnNldCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0gICAgc3dpdGNoKCByZXN1bHQgKSB7Ci0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIC8qIEF1ZGlvIE9iamVjdCBUeXBlIGlzIDIgKEFBQyBMb3cgQ29tcGxleGl0eSkgKi8KLSAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5hUFNQcmVzZW50ICA9IDA7Ci0gICAgICAgICAgICBwUHJvcGVydGllcy0+YVNCUlByZXNlbnQgPSAwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgIC8qIEF1ZGlvIE9iamVjdCBUeXBlIGlzIDUgKFNwZWN0cmFsIEJhbmQgUmVwbGljYXRpb24pICovCi0gICAgICAgICAgICBwUHJvcGVydGllcy0+YVBTUHJlc2VudCAgPSAwOwotICAgICAgICAgICAgcFByb3BlcnRpZXMtPmFTQlJQcmVzZW50ID0gMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI5OgotICAgICAgICAgICAgLyogQXVkaW8gT2JqZWN0IFR5cGUgaXMgMjkgKFBhcmFtZXRyaWMgU3RlcmVvKSAqLwotICAgICAgICAgICAgcFByb3BlcnRpZXMtPmFQU1ByZXNlbnQgID0gMTsKLSAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5hU0JSUHJlc2VudCA9IDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dWKCJwYXJzZV9BQUNfRFNJIEVSUk9SIDogb2JqZWN0IHR5cGUgJWQgaXMgbm90IHN1cHBvcnRlZCIsCi0gICAgICAgICAgICAgICAgcmVzdWx0KTsKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKCEiaW52YWxpZCBBQUMgb2JqZWN0IHR5cGUiLCBNNEVSUl9CQURfT1BUSU9OX0lEKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBwUHJvcGVydGllcy0+YUF1ZGlvT2JqZWN0VHlwZSA9IChNNE9TQV9JbnQzMilyZXN1bHQ7Ci0KLSAgICAvLyBHZXQgdGhlIGZyZXF1ZW5jeSBpbmRleAotICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEJpdHMocERTSSwgZHNpU2l6ZSwgNCwgJnJlc3VsdCwgJm9mZnNldCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soKDAgPD0gcmVzdWx0KSAmJiAoRlJFUV9UQUJMRV9TSVpFID4gcmVzdWx0KSwKLSAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBwUHJvcGVydGllcy0+YVNhbXBGcmVxID0gQURfQUFDX0ZSRVFfVEFCTEVbcmVzdWx0XTsKLSAgICBwUHJvcGVydGllcy0+YUV4dGVuc2lvblNhbXBGcmVxID0gMDsKLQotICAgIC8vIEdldCB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCi0gICAgZXJyID0gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0Qml0cyhwRFNJLCBkc2lTaXplLCA0LCAmcmVzdWx0LCAmb2Zmc2V0KTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLSAgICBwUHJvcGVydGllcy0+YU51bUNoYW4gPSAoTTRPU0FfVUludDMyKXJlc3VsdDsKLQotICAgIC8vIFNldCB0aGUgbWF4IFBDTSBzYW1wbGVzIHBlciBjaGFubmVsCi0gICAgcFByb3BlcnRpZXMtPmFNYXhQQ01TYW1wbGVzUGVyQ2ggPSAocFByb3BlcnRpZXMtPmFTQlJQcmVzZW50KSA/IDIwNDggOiAxMDI0OwotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3BhcnNlX0FBQ19EU0kgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfcGFyc2VfQUFDX0RTSSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3BhcnNlX0FBQ19EU0kgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqCi0gKiBFTkdJTkUgSU5URVJGQUNFICoKLSAqKioqKioqKioqKioqKioqKioqKi8KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2Rlc3Ryb3koTTRBRF9Db250ZXh0IHBDb250ZXh0KSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCogcERlY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9kZXN0cm95IGJlZ2luIik7Ci0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRGVjb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICAvLyBTdG9wIHRoZSBncmFwaAotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBEZWNvZGVyQ29udGV4dC0+bURlY29kZXIuZ2V0KCkgKSB7Ci0gICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bURlY29kZXItPnN0b3AoKTsKLSAgICB9Ci0KLSAgICAvLyBEZXN0cm95IHRoZSBncmFwaAotICAgIHBEZWNvZGVyQ29udGV4dC0+bURlY29kZXJTb3VyY2UuY2xlYXIoKTsKLSAgICBwRGVjb2RlckNvbnRleHQtPm1EZWNvZGVyLmNsZWFyKCk7Ci0gICAgcERlY29kZXJDb250ZXh0LT5tQ2xpZW50LmRpc2Nvbm5lY3QoKTsKLQotICAgIFNBRkVfRlJFRShwRGVjb2RlckNvbnRleHQpOwotICAgIHBDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZGVzdHJveSA6IERPTkUiKTsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9kZXN0cm95IG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2Rlc3Ryb3kgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9kZXN0cm95IDogZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2NyZWF0ZShNNEFEX1R5cGUgZGVjb2RlclR5cGUsCi0gICAgICAgIE00QURfQ29udGV4dCogcENvbnRleHQsIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgIHZvaWQqIHBVc2VyRGF0YSkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX0NvbnRleHQqIHBEZWNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgQUFDX0RFQ19TVFJFQU1fUFJPUFMgYWFjUHJvcGVydGllczsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBPSzsKLSAgICBzcDxNZXRhRGF0YT4gZGVjb2Rlck1ldGFEYXRhID0gTlVMTDsKLSAgICBjb25zdCBjaGFyKiBtaW1lID0gTlVMTDsKLSAgICB1aW50MzJfdCBjb2RlY0ZsYWdzID0gMDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9jcmVhdGUgYmVnaW46IGRlY29kZXJUeXBlICVkIiwgZGVjb2RlclR5cGUpOwotCi0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwU3RyZWFtSGFuZGxlciwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIC8vIENvbnRleHQgYWxsb2NhdGlvbiAmIGluaXRpYWxpemF0aW9uCi0gICAgU0FGRV9NQUxMT0MocERlY29kZXJDb250ZXh0LCBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9Db250ZXh0LCAxLAotICAgICAgICAiQXVkaW9EZWNvZGVyIik7Ci0gICAgcERlY29kZXJDb250ZXh0LT5tRGVjb2RlclR5cGUgPSBkZWNvZGVyVHlwZTsKLSAgICBwRGVjb2RlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXIgPSBwU3RyZWFtSGFuZGxlcjsKLQotICAgIHBEZWNvZGVyQ29udGV4dC0+bU5iSW5wdXRGcmFtZXMgID0gMDsKLSAgICBwRGVjb2RlckNvbnRleHQtPm1OYk91dHB1dEZyYW1lcyA9IDA7Ci0gICAgcERlY29kZXJDb250ZXh0LT5yZWFkZXJFcnJDb2RlID0gTTROT19FUlJPUjsKLSAgICBwRGVjb2RlckNvbnRleHQtPnRpbWVTdGFtcE1zID0gLTE7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfY3JlYXRlIDogbWF4QVVTaXplICVkIiwKLSAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSk7Ci0KLSAgICAvLyBDcmVhdGUgdGhlIG1ldGEgZGF0YSBmb3IgdGhlIGRlY29kZXIKLSAgICBkZWNvZGVyTWV0YURhdGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgc3dpdGNoKCBwRGVjb2RlckNvbnRleHQtPm1EZWNvZGVyVHlwZSApIHsKLSAgICAgICAgY2FzZSBNNEFEX2tUeXBlQU1STkI6Ci0gICAgICAgICAgICAvLyBTdGFnZUZyaWdodCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBtaW1lID0gTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05COwotICAgICAgICAgICAgLy8gRW5naW5lIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9ieXRlRnJhbWVMZW5ndGggPSAxNjA7Ci0gICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZQotICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVTYW1wbGVTaXplID0gMjsKLSAgICAgICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA9IDgwMDA7Ci0gICAgICAgICAgICBwRGVjb2RlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fbmJDaGFubmVscyA9IDE7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00QURfa1R5cGVBTVJXQjoKLSAgICAgICAgICAgIC8vIFN0YWdlRnJpZ2h0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgIG1pbWUgPSBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0I7Ci0KLSAgICAgICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9ieXRlRnJhbWVMZW5ndGggPSAxNjA7Ci0gICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZQotICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVTYW1wbGVTaXplID0gMjsKLSAgICAgICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA9IDE2MDAwOwotICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX25iQ2hhbm5lbHMgPSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNEFEX2tUeXBlQUFDOgotICAgICAgICAgICAgLy8gUmVqZWN0IEFEVFMgJiBBRElGIChvciBhbnkgaW5jb3JyZWN0IHR5cGUpCi0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNERBX1N0cmVhbVR5cGVBdWRpb0FhYyA9PQotICAgICAgICAgICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+XAotICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSxNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgICAgICAgICAvLyBTdGFnZUZyaWdodCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBtaW1lID0gTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDOwotCi0gICAgICAgICAgICBkZWNvZGVyTWV0YURhdGEtPnNldERhdGEoa0tleUVTRFMsIGtUeXBlRVNEUywKLSAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9iYXNpY1Byb3BlcnRpZXMubV9wRVNEU0luZm8sCi0gICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fYmFzaWNQcm9wZXJ0aWVzLm1fRVNEU0luZm9TaXplKTsKLQotICAgICAgICAgICAgLy8gRW5naW5lIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIC8vIFJldHJpZXZlIHNhbXBsaW5nIGZyZXF1ZW5jeSBhbmQgbnVtYmVyIG9mIGNoYW5uZWxzIGZyb20gdGhlIERTSQotICAgICAgICAgICAgZXJyID0gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfcGFyc2VfQUFDX0RTSSgKLSAgICAgICAgICAgICAgICAoTTRPU0FfSW50OCopcFN0cmVhbUhhbmRsZXItPm1fYmFzaWNQcm9wZXJ0aWVzLlwKLSAgICAgICAgICAgICAgICAgICAgbV9wRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAmYWFjUHJvcGVydGllcyk7Ci0KLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVGcmFtZUxlbmd0aCA9IDEwMjQ7Ci0gICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZQotICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVTYW1wbGVTaXplID0gMjsKLSAgICAgICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgYWFjUHJvcGVydGllcy5hU2FtcEZyZXE7Ci0gICAgICAgICAgICBwRGVjb2RlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fbmJDaGFubmVscyA9Ci0gICAgICAgICAgICAgICAgYWFjUHJvcGVydGllcy5hTnVtQ2hhbjsKLQotICAgICAgICAgICAgLy8gQ29weSB0aGUgc3RyZWFtIHByb3BlcnRpZXMgaW50byB1c2VyZGF0YQotICAgICAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcFVzZXJEYXRhICkgewotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBVc2VyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmYWFjUHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEFBQ19ERUNfU1RSRUFNX1BST1BTKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00QURfa1R5cGVNUDM6Ci0gICAgICAgICAgICAvLyBTdGFnZUZyaWdodCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBtaW1lID0gTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyghIkF1ZGlvRGVjb2Rlcl9vcGVuIDogaW5jb3JyZWN0IGlucHV0IGZvcm1hdCIsCi0gICAgICAgICAgICAgICAgTTRFUlJfU1RBVEUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRlY29kZXJNZXRhRGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIG1pbWUpOwotICAgIGRlY29kZXJNZXRhRGF0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsCi0gICAgICAgIChpbnQzMl90KXBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSk7Ci0gICAgZGVjb2Rlck1ldGFEYXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LAotICAgICAgICBwRGVjb2RlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fbmJDaGFubmVscyk7Ci0gICAgZGVjb2Rlck1ldGFEYXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sCi0gICAgICAgIChpbnQ2NF90KXBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+XAotICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX2R1cmF0aW9uKTsKLQotICAgIC8vIENyZWF0ZSB0aGUgZGVjb2RlciBzb3VyY2UKLSAgICBwRGVjb2RlckNvbnRleHQtPm1EZWNvZGVyU291cmNlID0gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OkNyZWF0ZSgKLSAgICAgICAgZGVjb2Rlck1ldGFEYXRhLCAodm9pZCAqKXBEZWNvZGVyQ29udGV4dCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTlVMTCAhPSBwRGVjb2RlckNvbnRleHQtPm1EZWNvZGVyU291cmNlLmdldCgpLAotICAgICAgICBNNEVSUl9TVEFURSk7Ci0KLSAgICAvLyBDb25uZWN0IHRvIHRoZSBPTVggY2xpZW50Ci0gICAgcmVzdWx0ID0gcERlY29kZXJDb250ZXh0LT5tQ2xpZW50LmNvbm5lY3QoKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhPSyA9PSByZXN1bHQsIE00RVJSX1NUQVRFKTsKLQotICAgIC8vIENyZWF0ZSB0aGUgT01YIGNvZGVjCi0jaWZkZWYgVklERU9FRElUT1JfRk9SQ0VDT0RFQwotICAgIGNvZGVjRmxhZ3MgfD0gT01YQ29kZWM6OlZJREVPRURJVE9SX0ZPUkNFQ09ERUM7Ci0jZW5kaWYgLyogVklERU9FRElUT1JfRk9SQ0VDT0RFQyAqLwotCi0gICAgcERlY29kZXJDb250ZXh0LT5tRGVjb2RlciA9IE9NWENvZGVjOjpDcmVhdGUocERlY29kZXJDb250ZXh0LT5cCi0gICAgICAgIG1DbGllbnQuaW50ZXJmYWNlKCksCi0gICAgICAgIGRlY29kZXJNZXRhRGF0YSwgZmFsc2UsIHBEZWNvZGVyQ29udGV4dC0+bURlY29kZXJTb3VyY2UsIE5VTEwsCi0gICAgICAgICAgICBjb2RlY0ZsYWdzKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhOVUxMICE9IHBEZWNvZGVyQ29udGV4dC0+bURlY29kZXIuZ2V0KCksIE00RVJSX1NUQVRFKTsKLQotICAgIC8vIEdldCB0aGUgb3V0cHV0IGNoYW5uZWxzLCB0aGUgZGVjb2RlciBtaWdodCBvdmVyd3JpdGUgdGhlIGlucHV0IG1ldGFkYXRhCi0gICAgcERlY29kZXJDb250ZXh0LT5tRGVjb2Rlci0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LAotICAgICAgICAmcERlY29kZXJDb250ZXh0LT5tTmJPdXRwdXRDaGFubmVscyk7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2NyZWF0ZSA6IG91dHB1dCBjaGFuICVkIiwKLSAgICAgICAgcERlY29kZXJDb250ZXh0LT5tTmJPdXRwdXRDaGFubmVscyk7Ci0KLSAgICAvLyBTdGFydCB0aGUgZGVjb2RlcgotICAgIHJlc3VsdCA9IHBEZWNvZGVyQ29udGV4dC0+bURlY29kZXItPnN0YXJ0KCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soT0sgPT0gcmVzdWx0LCBNNEVSUl9TVEFURSk7Ci0KLSAgICAqcENvbnRleHQgPSBwRGVjb2RlckNvbnRleHQ7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2NyZWF0ZSA6IERPTkUiKTsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9jcmVhdGUgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9kZXN0cm95KHBEZWNvZGVyQ29udGV4dCk7Ci0gICAgICAgICpwQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9jcmVhdGUgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9jcmVhdGVfQUFDKE00QURfQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogcFN0cmVhbUhhbmRsZXIsIHZvaWQqIHBVc2VyRGF0YSkgewotCi0gICAgcmV0dXJuIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2NyZWF0ZSgKLSAgICAgICAgTTRBRF9rVHlwZUFBQywgcENvbnRleHQsIHBTdHJlYW1IYW5kbGVyLHBVc2VyRGF0YSk7Ci19Ci0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2NyZWF0ZV9BTVJOQihNNEFEX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICBNNF9BdWRpb1N0cmVhbUhhbmRsZXIqIHBTdHJlYW1IYW5kbGVyLCB2b2lkKiBwVXNlckRhdGEpIHsKLQotICAgIHJldHVybiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9jcmVhdGUoCi0gICAgICAgIE00QURfa1R5cGVBTVJOQiwgcENvbnRleHQsIHBTdHJlYW1IYW5kbGVyLCBwVXNlckRhdGEpOwotfQotCi0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9jcmVhdGVfQU1SV0IoTTRBRF9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgTTRfQXVkaW9TdHJlYW1IYW5kbGVyKiBwU3RyZWFtSGFuZGxlciwgdm9pZCogcFVzZXJEYXRhKSB7Ci0KLSAgICByZXR1cm4gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfY3JlYXRlKAotICAgICAgICBNNEFEX2tUeXBlQU1SV0IsIHBDb250ZXh0LCBwU3RyZWFtSGFuZGxlciwgcFVzZXJEYXRhKTsKLX0KLQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfY3JlYXRlX01QMyhNNEFEX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICBNNF9BdWRpb1N0cmVhbUhhbmRsZXIqIHBTdHJlYW1IYW5kbGVyLCB2b2lkKiBwVXNlckRhdGEpIHsKLQotICAgIHJldHVybiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9jcmVhdGUoCi0gICAgICAgIE00QURfa1R5cGVNUDMsIHBDb250ZXh0LCBwU3RyZWFtSGFuZGxlciwgcFVzZXJEYXRhKTsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlcigKLSAgICAgICAgTTRBRF9Db250ZXh0IHBDb250ZXh0LCBNNEFEX0J1ZmZlciogcElucHV0QnVmZmVyKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCogcERlY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBNZWRpYUJ1ZmZlciogYnVmZmVyID0gTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIgYmVnaW4iKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotCi0gICAgcERlY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcElucHV0QnVmZmVyICkgewotICAgICAgICBidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoKHNpemVfdClwSW5wdXRCdWZmZXItPm1fYnVmZmVyU2l6ZSk7Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKSgoTTRPU0FfSW50OCopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpKSwKLSAgICAgICAgICAgICh2b2lkICopcElucHV0QnVmZmVyLT5tX2RhdGFBZGRyZXNzLCBwSW5wdXRCdWZmZXItPm1fYnVmZmVyU2l6ZSk7Ci0gICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCBwSW5wdXRCdWZmZXItPm1fdGltZVN0YW1wVXMpOwotICAgIH0KLSAgICBwRGVjb2RlckNvbnRleHQtPm1EZWNvZGVyU291cmNlLT5zdG9yZUJ1ZmZlcihidWZmZXIpOwotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlciBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIoTTRBRF9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBNZWRpYUJ1ZmZlciogYnVmZmVyLCBNNEFEX0J1ZmZlciogcE91cHV0QnVmZmVyKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCogcERlY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBpbnQzMl90IGkzMlRtcCA9IDA7Ci0gICAgaW50NjRfdCBpNjRUbXAgPSAwOwotICAgIHN0YXR1c190IHJlc3VsdCA9IE9LOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgYmVnaW4iKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IGJ1ZmZlciwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBPdXB1dEJ1ZmZlciwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIHBEZWNvZGVyQ29udGV4dCA9IChWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLQotICAgIC8vIFByb2Nlc3MgdGhlIHJldHVybmVkIGRhdGEKLSAgICBpZiggMCA9PSBidWZmZXItPnJhbmdlX2xlbmd0aCgpICkgewotICAgICAgICAvLyBEZWNvZGVyIGhhcyBubyBkYXRhIHlldCwgbm90aGluZyB1bnVzdWFsCi0gICAgICAgIGdvdG8gY2xlYW5VcDsKLSAgICB9Ci0KLSAgICBwRGVjb2RlckNvbnRleHQtPm1OYk91dHB1dEZyYW1lcysrOwotCi0gICAgaWYoIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9uYkNoYW5uZWxzID09Ci0gICAgICAgIChNNE9TQV9VSW50MzIpcERlY29kZXJDb250ZXh0LT5tTmJPdXRwdXRDaGFubmVscyApIHsKLSAgICAgICAgLy8gSnVzdCBjb3B5IHRoZSBQQ01zCi0gICAgICAgIHBPdXB1dEJ1ZmZlci0+bV9idWZmZXJTaXplID0gKE00T1NBX1VJbnQzMilidWZmZXItPnJhbmdlX2xlbmd0aCgpOwotICAgICAgICBtZW1jcHkoKHZvaWQgKilwT3VwdXRCdWZmZXItPm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAodm9pZCAqKSgoKE00T1NBX01lbUFkZHI4KWJ1ZmZlci0+ZGF0YSgpKStidWZmZXItPnJhbmdlX29mZnNldCgpKSwKLSAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwotICAgIH0gZWxzZSBpZiggcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX25iQ2hhbm5lbHMgPAotICAgICAgICAoTTRPU0FfVUludDMyKXBEZWNvZGVyQ29udGV4dC0+bU5iT3V0cHV0Q2hhbm5lbHMgKSB7Ci0gICAgICAgIC8vIFRoZSBkZWNvZGVyIGZvcmNlcyBzdGVyZW8gb3V0cHV0LCBkb3duc2FtcGxlCi0gICAgICAgIHBPdXB1dEJ1ZmZlci0+bV9idWZmZXJTaXplID0gKE00T1NBX1VJbnQzMikoYnVmZmVyLT5yYW5nZV9sZW5ndGgoKS8yKTsKLSAgICAgICAgTTRPU0FfSW50MTYqIHBEYXRhSW4gID0gKChNNE9TQV9JbnQxNiopYnVmZmVyLT5kYXRhKCkpICsKLSAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7Ci0gICAgICAgIE00T1NBX0ludDE2KiBwRGF0YU91dCA9IChNNE9TQV9JbnQxNiopcE91cHV0QnVmZmVyLT5tX2RhdGFBZGRyZXNzOwotICAgICAgICBNNE9TQV9JbnQxNiogcERhdGFFbmQgPSBwRGF0YUluICsgXAotICAgICAgICAgICAgKGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkvc2l6ZW9mKE00T1NBX0ludDE2KSk7Ci0gICAgICAgIHdoaWxlKCBwRGF0YUluIDwgcERhdGFFbmQgKSB7Ci0gICAgICAgICAgICAqcERhdGFPdXQgPSAqcERhdGFJbjsKLSAgICAgICAgICAgIHBEYXRhSW4rPTI7Ci0gICAgICAgICAgICBwRGF0YU91dCsrOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gVGhlIGRlY29kZXIgZm9yY2VzIG1vbm8gb3V0cHV0LCBub3Qgc3VwcG9ydGVkCi0gICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX0ZBTFNFLCBNNEVSUl9QQVJBTUVURVIpOwotICAgIH0KLQotY2xlYW5VcDoKLSAgICAvLyBSZWxlYXNlIHRoZSBidWZmZXIKLSAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcE91cHV0QnVmZmVyLT5tX2J1ZmZlclNpemUgPSAwOwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlciBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3N0ZXAoTTRBRF9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBNNEFEX0J1ZmZlciogcElucHV0QnVmZmVyLCBNNEFEX0J1ZmZlciogcE91dHB1dEJ1ZmZlciwKLSAgICAgICAgTTRPU0FfQm9vbCBiSnVtcCkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX0NvbnRleHQqIHBEZWNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gT0s7Ci0gICAgTWVkaWFCdWZmZXIqIG91dHB1dEJ1ZmZlciA9IE5VTEw7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfc3RlcCBiZWdpbiIpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgcERlY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotICAgIHBEZWNvZGVyQ29udGV4dC0+bU5iSW5wdXRGcmFtZXMrKzsKLQotICAgIC8vIFB1c2ggdGhlIGlucHV0IGJ1ZmZlciB0byB0aGUgZGVjb2RlciBzb3VyY2UKLSAgICBlcnIgPSBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIocERlY29kZXJDb250ZXh0LAotICAgICAgICBwSW5wdXRCdWZmZXIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotCi0gICAgLy8gUmVhZAotICAgIHJlc3VsdCA9IHBEZWNvZGVyQ29udGV4dC0+bURlY29kZXItPnJlYWQoJm91dHB1dEJ1ZmZlciwgTlVMTCk7Ci0gICAgaWYgKElORk9fRk9STUFUX0NIQU5HRUQgPT0gcmVzdWx0KSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9zdGVwOiBBdWRpbyBkZWNvZGVyIFwKLSAgICAgICAgIHJldHVybmVkIElORk9fRk9STUFUX0NIQU5HRUQiKTsKLSAgICAgICAgQ0hFQ0sob3V0cHV0QnVmZmVyID09IE5VTEwpOwotICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IHBEZWNvZGVyQ29udGV4dC0+bURlY29kZXItPmdldEZvcm1hdCgpOwotICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudDsKLQotICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVSYXRlKSk7Ci0gICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmY2hhbm5lbENvdW50KSk7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9zdGVwOiBzYW1wbGluZ0ZyZXEgPSAlZCIsIHNhbXBsZVJhdGUpOwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfc3RlcDogY2hhbm5lbENudCA9ICVkIiwgY2hhbm5lbENvdW50KTsKLSAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3NhbXBsaW5nRnJlcXVlbmN5ID0KLSAgICAgICAgICh1aW50MzJfdClzYW1wbGVSYXRlOwotICAgICAgICBwRGVjb2RlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fbmJDaGFubmVscyA9Ci0gICAgICAgICAodWludDMyX3QpY2hhbm5lbENvdW50OwotICAgICAgICBwRGVjb2RlckNvbnRleHQtPm1OYk91dHB1dENoYW5uZWxzID0gY2hhbm5lbENvdW50OwotCi0gICAgICAgIHJldHVybiBNNFdBUl9JTkZPX0ZPUk1BVF9DSEFOR0U7Ci0gICAgfSBlbHNlIGlmIChFUlJPUl9FTkRfT0ZfU1RSRUFNID09IHJlc3VsdCkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfc3RlcDogQXVkaW8gZGVjb2RlciBcCi0gICAgICAgICByZXR1cm5lZCBFUlJPUl9FTkRfT0ZfU1RSRUFNIik7Ci0gICAgICAgIHBEZWNvZGVyQ29udGV4dC0+cmVhZGVyRXJyQ29kZSA9IE00V0FSX05PX01PUkVfQVU7Ci0gICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX0FVOwotICAgIH0gZWxzZSBpZiAoT0sgIT0gcmVzdWx0KSB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvLyBDb252ZXJ0IHRoZSBQQ00gYnVmZmVyCi0gICAgZXJyID0gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlcihwRGVjb2RlckNvbnRleHQsCi0gICAgICAgIG91dHB1dEJ1ZmZlciwgcE91dHB1dEJ1ZmZlcik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfc3RlcCBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9zdGVwIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfc3RlcCBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0VmVyc2lvbihNNF9WZXJzaW9uSW5mbyogcFZlcnNpb25JbmZvKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0VmVyc2lvbiBiZWdpbiIpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBWZXJzaW9uSW5mbywgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIHBWZXJzaW9uSW5mby0+bV9tYWpvciAgICAgID0gVklERU9FRElUT1JfQVVESU9fREVDT0RFUl9WRVJTSU9OX01BSk9SOwotICAgIHBWZXJzaW9uSW5mby0+bV9taW5vciAgICAgID0gVklERU9FRElUT1JfQVVESU9fREVDT0RFUl9WRVJTSU9OX01JTk9SOwotICAgIHBWZXJzaW9uSW5mby0+bV9yZXZpc2lvbiAgID0gVklERU9FRElUT1JfQVVESU9fREVDT0RFUl9WRVJTSU9OX1JFVjsKLSAgICBwVmVyc2lvbkluZm8tPm1fc3RydWN0U2l6ZSA9IHNpemVvZihNNF9WZXJzaW9uSW5mbyk7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0VmVyc2lvbiBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRWZXJzaW9uIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0VmVyc2lvbiBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfc2V0T3B0aW9uKE00QURfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgTTRPU0FfVUludDMyIG9wdGlvbklELCBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9Db250ZXh0KiBwRGVjb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3NldE9wdGlvbiBiZWdpbiAweCVYIiwgb3B0aW9uSUQpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgcERlY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotCi0gICAgc3dpdGNoKCBvcHRpb25JRCApIHsKLSAgICAgICAgY2FzZSBzdGF0aWNfY2FzdDxNNE9TQV9VSW50MzI+KE00QURfa09wdGlvbklEX1VzZXJQYXJhbSk6Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJzZXRPcHRpb24gVXNlclBhcmFtIGlzIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgIGVyciA9IE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRBRF9rT3B0aW9uSURfM2dwUmVhZGVySW50ZXJmYWNlOgotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyc2V0T3B0aW9uIDNncFJlYWRlckludGVyZmFjZSIpOwotICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tX3BSZWFkZXIgPQotICAgICAgICAgICAgIChNNFJFQURFUl9EYXRhSW50ZXJmYWNlICopb3B0aW9uVmFsdWU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00QURfa09wdGlvbklEX0F1ZGlvQVU6Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJzZXRPcHRpb24gQXVkaW9BVSIpOwotICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tX3BOZXh0QWNjZXNzVW5pdFRvRGVjb2RlID0KLSAgICAgICAgICAgICAoTTRfQWNjZXNzVW5pdCAqKW9wdGlvblZhbHVlOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9zZXRPcHRpb24gIHVuc3VwcG9ydGVkIG9wdGlvbklkIDB4JVgiLAotICAgICAgICAgICAgICAgIG9wdGlvbklEKTsKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX0ZBTFNFLCBNNEVSUl9CQURfT1BUSU9OX0lEKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotY2xlYW5VcDoKLSAgICBpZiggKChNNE9TQV9VSW50MzIpTTROT19FUlJPUiA9PSBlcnIpIHx8ICgoTTRPU0FfVUludDMyKU00RVJSX05PVF9JTVBMRU1FTlRFRCA9PSBlcnIpICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfc2V0T3B0aW9uIGVycm9yIDB4JVgiLCBlcnIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9zZXRPcHRpb24gRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9zZXRPcHRpb24gZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldE9wdGlvbihNNEFEX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgIE00T1NBX1VJbnQzMiBvcHRpb25JRCwgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSkgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCogcERlY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRPcHRpb24gYmVnaW46IG9wdGlvbklEIDB4JVgiLCBvcHRpb25JRCk7Ci0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRGVjb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBzd2l0Y2goIG9wdGlvbklEICkgewotCi0gICAgICAgIGNhc2UgTTRBRF9rT3B0aW9uSURfR2V0QXVkaW9BVUVyckNvZGU6Ci0gICAgICAgICAgICAqKHVpbnQzMl90ICopb3B0aW9uVmFsdWUgPSBwRGVjb2RlckNvbnRleHQtPnJlYWRlckVyckNvZGU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00QURfa09wdGlvbklEX0F1ZGlvTmJDaGFubmVsczoKLSAgICAgICAgICAgICoodWludDMyX3QgKilvcHRpb25WYWx1ZSA9Ci0gICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX25iQ2hhbm5lbHM7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00QURfa09wdGlvbklEX0F1ZGlvU2FtcEZyZXF1ZW5jeToKLSAgICAgICAgICAgICoodWludDMyX3QgKilvcHRpb25WYWx1ZSA9Ci0gICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3NhbXBsaW5nRnJlcXVlbmN5OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNEFEX2tPcHRpb25JRF9BdUNUUzoKLSAgICAgICAgICAgICoodWludDMyX3QgKilvcHRpb25WYWx1ZSA9IHBEZWNvZGVyQ29udGV4dC0+dGltZVN0YW1wTXM7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldE9wdGlvbiB1bnN1cHBvcnRlZCBvcHRpb25JZCAweCVYIiwKLSAgICAgICAgICAgICAgICBvcHRpb25JRCk7Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9GQUxTRSwgTTRFUlJfQkFEX09QVElPTl9JRCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0T3B0aW9uIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldE9wdGlvbiBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldE9wdGlvbiBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlKE00QURfVHlwZSBkZWNvZGVyVHlwZSwKLSAgICAgICAgTTRBRF9UeXBlKiBwRGVjb2RlclR5cGUsIE00QURfSW50ZXJmYWNlKiogcERlY29kZXJJbnRlcmZhY2UpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcERlY29kZXJUeXBlLCBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcERlY29kZXJJbnRlcmZhY2UsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlIGJlZ2luICVkIDB4JXggMHgleCIsCi0gICAgICAgIGRlY29kZXJUeXBlLCBwRGVjb2RlclR5cGUsIHBEZWNvZGVySW50ZXJmYWNlKTsKLQotICAgIFNBRkVfTUFMTE9DKCpwRGVjb2RlckludGVyZmFjZSwgTTRBRF9JbnRlcmZhY2UsIDEsCi0gICAgICAgICJWaWRlb0VkaXRvckF1ZGlvRGVjb2RlciIpOwotCi0gICAgKnBEZWNvZGVyVHlwZSA9IGRlY29kZXJUeXBlOwotCi0gICAgc3dpdGNoKCBkZWNvZGVyVHlwZSApIHsKLSAgICAgICAgY2FzZSBNNEFEX2tUeXBlQU1STkI6Ci0gICAgICAgICAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0Q3JlYXRlQXVkaW9EZWMgPQotICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2NyZWF0ZV9BTVJOQjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00QURfa1R5cGVBTVJXQjoKLSAgICAgICAgICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RDcmVhdGVBdWRpb0RlYyA9Ci0gICAgICAgICAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfY3JlYXRlX0FNUldCOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRBRF9rVHlwZUFBQzoKLSAgICAgICAgICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RDcmVhdGVBdWRpb0RlYyA9Ci0gICAgICAgICAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfY3JlYXRlX0FBQzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00QURfa1R5cGVNUDM6Ci0gICAgICAgICAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0Q3JlYXRlQXVkaW9EZWMgPQotICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2NyZWF0ZV9NUDM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dWKCJWRUFEX2dldEludGVyZmFjZSBFUlJPUjogdW5zdXBwb3J0ZWQgdHlwZSAlZCIsIGRlY29kZXJUeXBlKTsKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX0ZBTFNFLCBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdERlc3Ryb3lBdWRpb0RlYyAgID0KLSAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZGVzdHJveTsKLSAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0UmVzZXRBdWRpb0RlYyAgICAgPSBNNE9TQV9OVUxMOwotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RTdGFydEF1ZGlvRGVjICAgICA9IE00T1NBX05VTEw7Ci0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdFN0ZXBBdWRpb0RlYyAgICAgID0KLSAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfc3RlcDsKLSAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0R2V0VmVyc2lvbkF1ZGlvRGVjID0KLSAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0VmVyc2lvbjsKLSAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0U2V0T3B0aW9uQXVkaW9EZWMgPQotICAgICAgICBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9zZXRPcHRpb247Ci0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdEdldE9wdGlvbkF1ZGlvRGVjID0KLSAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0T3B0aW9uOwotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZSBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICpwRGVjb2RlckludGVyZmFjZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRJbnRlcmZhY2UgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRJbnRlcmZhY2UgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotCi1leHRlcm4gIkMiIHsKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZV9BQUMoTTRBRF9UeXBlKiBwRGVjb2RlclR5cGUsCi0gICAgICAgIE00QURfSW50ZXJmYWNlKiogcERlY29kZXJJbnRlcmZhY2UpIHsKLSAgICBBTE9HVigiVEVTVDogQUFDIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZSBubyBlcnJvciIpOwotICAgIHJldHVybiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRJbnRlcmZhY2UoCi0gICAgICAgIE00QURfa1R5cGVBQUMsIHBEZWNvZGVyVHlwZSwgcERlY29kZXJJbnRlcmZhY2UpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlX0FNUk5CKE00QURfVHlwZSogcERlY29kZXJUeXBlLAotICAgICAgICBNNEFEX0ludGVyZmFjZSoqIHBEZWNvZGVySW50ZXJmYWNlKSB7Ci0gICAgQUxPR1YoIlRFU1Q6IEFNUiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRJbnRlcmZhY2Ugbm8gZXJyb3IiKTsKLSAgICByZXR1cm4gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlKAotICAgICAgICBNNEFEX2tUeXBlQU1STkIsIHBEZWNvZGVyVHlwZSwgcERlY29kZXJJbnRlcmZhY2UpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlX0FNUldCKE00QURfVHlwZSogcERlY29kZXJUeXBlLAotICAgICAgICBNNEFEX0ludGVyZmFjZSoqIHBEZWNvZGVySW50ZXJmYWNlKSB7Ci0KLSAgICByZXR1cm4gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlKAotICAgICAgICBNNEFEX2tUeXBlQU1SV0IsIHBEZWNvZGVyVHlwZSwgcERlY29kZXJJbnRlcmZhY2UpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlX01QMyhNNEFEX1R5cGUqIHBEZWNvZGVyVHlwZSwKLSAgICAgICAgTTRBRF9JbnRlcmZhY2UqKiBwRGVjb2RlckludGVyZmFjZSkgewotCi0gICAgcmV0dXJuIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZSgKLSAgICAgICAgTTRBRF9rVHlwZU1QMywgcERlY29kZXJUeXBlLCBwRGVjb2RlckludGVyZmFjZSk7Ci19Ci0KLX0gIC8vIGV4dGVybiAiQyIKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3JBdWRpb0VuY29kZXIuY3BwIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvckF1ZGlvRW5jb2Rlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE5MWYzZWUuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvckF1ZGlvRW5jb2Rlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlci5jcHAKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCBBdWRpbyBFbmNvZGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jZGVmaW5lIExPR19OREVCVUcgMQotI2RlZmluZSBMT0dfVEFHICJWSURFT0VESVRPUl9BVURJT0VOQ09ERVIiCi0KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JVdGlscy5oIgotCi0jaW5jbHVkZSAidXRpbHMvTG9nLmgiCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaD4KLQotLyoqKiBERUZJTklUSU9OUyAqKiovCi0vLyBGb3JjZSB1c2luZyBzb2Z0d2FyZSBlbmNvZGVyIGFzIGVuZ2luZSBkb2VzIG5vdCBzdXBwb3J0IHByZWZldGNoCi0jZGVmaW5lIFZJREVPRURJVE9SX0ZPUkNFQ09ERUMga1NvZnR3YXJlQ29kZWNzT25seQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1zdHJ1Y3QgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UgewotICAgIHB1YmxpYzoKLSAgICAgICAgc3RhdGljIHNwPFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlPiBDcmVhdGUoCi0gICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJmZvcm1hdCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLSAgICAgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZChNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwKLSAgICAgICAgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKLSAgICAgICAgdmlydHVhbCBpbnQzMl90IHN0b3JlQnVmZmVyKE1lZGlhQnVmZmVyICpidWZmZXIpOwotCi0gICAgcHJvdGVjdGVkOgotICAgICAgICB2aXJ0dWFsIH5WaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZSgpOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgc3RydWN0IE1lZGlhQnVmZmVyQ2hhaW4gewotICAgICAgICAgICAgTWVkaWFCdWZmZXIqIGJ1ZmZlcjsKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQ2hhaW4qIG5leHRMaW5rOwotICAgICAgICB9OwotICAgICAgICBlbnVtIFN0YXRlIHsKLSAgICAgICAgICAgIENSRUFURUQsCi0gICAgICAgICAgICBTVEFSVEVELAotICAgICAgICAgICAgRVJST1IKLSAgICAgICAgfTsKLQotICAgICAgICBNZWRpYUJ1ZmZlckNoYWluKiBtRmlyc3RCdWZmZXJMaW5rOwotICAgICAgICBNZWRpYUJ1ZmZlckNoYWluKiBtTGFzdEJ1ZmZlckxpbms7Ci0gICAgICAgIGludDMyX3QgbU5iQnVmZmVyOwotICAgICAgICBTdGF0ZSBtU3RhdGU7Ci0gICAgICAgIHNwPE1ldGFEYXRhPiBtRW5jRm9ybWF0OwotCi0gICAgICAgIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlKGNvbnN0IHNwPE1ldGFEYXRhPiAmZm9ybWF0KTsKLQotICAgICAgICAvLyBEb24ndCBjYWxsIG1lLgotICAgICAgICBWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZShjb25zdCBWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZSYpOwotICAgICAgICBWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZSYgb3BlcmF0b3I9KAotICAgICAgICAgICAgY29uc3QgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2UmKTsKLX07Ci0KLXNwPFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlPiBWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6Q3JlYXRlKAotICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmZm9ybWF0KSB7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OkNyZWF0ZSIpOwotICAgIHNwPFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlPiBhU291cmNlID0KLSAgICAgICAgbmV3IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlKGZvcm1hdCk7Ci0KLSAgICByZXR1cm4gYVNvdXJjZTsKLX0KLQotVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlKAotICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmZm9ybWF0KToKLSAgICAgICAgbUZpcnN0QnVmZmVyTGluayhOVUxMKSwKLSAgICAgICAgbUxhc3RCdWZmZXJMaW5rKE5VTEwpLAotICAgICAgICBtTmJCdWZmZXIoMCksCi0gICAgICAgIG1TdGF0ZShDUkVBVEVEKSwKLSAgICAgICAgbUVuY0Zvcm1hdChmb3JtYXQpIHsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlIik7Ci19Ci0KLQotVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6On5WaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZSgpIHsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6On5WaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZSIpOwotCi0gICAgaWYoIFNUQVJURUQgPT0gbVN0YXRlICkgewotICAgICAgICBzdG9wKCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6c3RhcnQoTWV0YURhdGEgKm1ldGEpIHsKLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6c3RhcnQiKTsKLQotICAgIGlmKCBDUkVBVEVEICE9IG1TdGF0ZSApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlOjpzdGFydCBFUlJPUiA6IGludmFsaWQgc3RhdGUgJWQiLAotICAgICAgICAgICAgbVN0YXRlKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgbVN0YXRlID0gU1RBUlRFRDsKLQotY2xlYW5VcDoKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OnN0YXJ0IEVORCAoMHgleCkiLCBlcnIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlOjpzdG9wKCkgewotICAgIHN0YXR1c190IGVyciA9IE9LOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlOjpzdG9wIik7Ci0KLSAgICBpZiggU1RBUlRFRCAhPSBtU3RhdGUgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6c3RvcCBFUlJPUjogaW52YWxpZCBzdGF0ZSAlZCIsCi0gICAgICAgICAgICBtU3RhdGUpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICBpbnQzMl90IGkgPSAwOwotICAgIE1lZGlhQnVmZmVyQ2hhaW4qIHRtcExpbmsgPSBOVUxMOwotICAgIHdoaWxlKCBtRmlyc3RCdWZmZXJMaW5rICkgewotICAgICAgICBpKys7Ci0gICAgICAgIHRtcExpbmsgPSBtRmlyc3RCdWZmZXJMaW5rOwotICAgICAgICBtRmlyc3RCdWZmZXJMaW5rID0gbUZpcnN0QnVmZmVyTGluay0+bmV4dExpbms7Ci0gICAgICAgIGRlbGV0ZSB0bXBMaW5rOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OnN0b3AgOiAlZCBidWZmZXIgcmVtYWluZWQiLCBpKTsKLSAgICBtRmlyc3RCdWZmZXJMaW5rID0gTlVMTDsKLSAgICBtTGFzdEJ1ZmZlckxpbmsgPSBOVUxMOwotCi0gICAgbVN0YXRlID0gQ1JFQVRFRDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6c3RvcCBFTkQgKDB4JXgpIiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1zcDxNZXRhRGF0YT4gVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OmdldEZvcm1hdCgpIHsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OmdldEZvcm1hdCIpOwotICAgIHJldHVybiBtRW5jRm9ybWF0OwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6cmVhZChNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwKLSAgICAgICAgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLSAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgcmVhZE9wdGlvbnM7Ci0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0gICAgTWVkaWFCdWZmZXJDaGFpbiogdG1wTGluayA9IE5VTEw7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OnJlYWQiKTsKLQotICAgIGlmICggU1RBUlRFRCAhPSBtU3RhdGUgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6cmVhZCBFUlJPUiA6IGludmFsaWQgc3RhdGUgJWQiLAotICAgICAgICAgICAgbVN0YXRlKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgaWYoIE5VTEwgPT0gbUZpcnN0QnVmZmVyTGluayApIHsKLSAgICAgICAgKmJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6cmVhZCA6IEVPUyIpOwotICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICB9Ci0gICAgKmJ1ZmZlciA9IG1GaXJzdEJ1ZmZlckxpbmstPmJ1ZmZlcjsKLQotICAgIHRtcExpbmsgPSBtRmlyc3RCdWZmZXJMaW5rOwotICAgIG1GaXJzdEJ1ZmZlckxpbmsgPSBtRmlyc3RCdWZmZXJMaW5rLT5uZXh0TGluazsKLSAgICBpZiggTlVMTCA9PSBtRmlyc3RCdWZmZXJMaW5rICkgewotICAgICAgICBtTGFzdEJ1ZmZlckxpbmsgPSBOVUxMOwotICAgIH0KLSAgICBkZWxldGUgdG1wTGluazsKLSAgICBtTmJCdWZmZXItLTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6cmVhZCBFTkQgKDB4JXgpIiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1pbnQzMl90IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlOjpzdG9yZUJ1ZmZlcihNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OnN0b3JlQnVmZmVyIik7Ci0KLSAgICBNZWRpYUJ1ZmZlckNoYWluKiBuZXdMaW5rID0gbmV3IE1lZGlhQnVmZmVyQ2hhaW47Ci0gICAgbmV3TGluay0+YnVmZmVyID0gYnVmZmVyOwotICAgIG5ld0xpbmstPm5leHRMaW5rID0gTlVMTDsKLSAgICBpZiggTlVMTCAhPSBtTGFzdEJ1ZmZlckxpbmsgKSB7Ci0gICAgICAgIG1MYXN0QnVmZmVyTGluay0+bmV4dExpbmsgPSBuZXdMaW5rOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1GaXJzdEJ1ZmZlckxpbmsgPSBuZXdMaW5rOwotICAgIH0KLSAgICBtTGFzdEJ1ZmZlckxpbmsgPSBuZXdMaW5rOwotICAgIG1OYkJ1ZmZlcisrOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlOjpzdG9yZUJ1ZmZlciBFTkQiKTsKLSAgICByZXR1cm4gbU5iQnVmZmVyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioKLSAqIEVOR0lORSBJTlRFUkZBQ0UgKgotICoqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfQ29udGV4dAotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGNvbnRleHQgb2YgdGhlIFN0YWdlRnJpZ2h0IGF1ZGlvCi0gKiAgICAgICAgICAgZW5jb2RlciBzaGVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQgICAgICAgICAgICAgbUZvcm1hdDsKLSAgICBNNEVOQ09ERVJfQXVkaW9QYXJhbXMqICAgICAgICAgICAgbUNvZGVjUGFyYW1zOwotICAgIE00RU5DT0RFUl9BdWRpb0RlY1NwZWNpZmljSW5mbyAgICBtRFNJOwotICAgIHNwPFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlPiBtRW5jb2RlclNvdXJjZTsKLSAgICBPTVhDbGllbnQgICAgICAgICAgICAgICAgICAgICAgICAgbUNsaWVudDsKLSAgICBzcDxNZWRpYVNvdXJjZT4gICAgICAgICAgICAgICAgICAgbUVuY29kZXI7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYklucHV0RnJhbWVzOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICBtTmJPdXRwdXRGcmFtZXM7Ci0gICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GaXJzdE91dHB1dEN0czsKLSAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RPdXRwdXRDdHM7Ci19IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX0NvbnRleHQ7Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9jbGVhbnVwKE00T1NBX0NvbnRleHQgcENvbnRleHQpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfY2xlYW51cCBiZWdpbiIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgcEVuY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotCi0gICAgU0FGRV9GUkVFKHBFbmNvZGVyQ29udGV4dC0+bURTSS5wSW5mbyk7Ci0gICAgU0FGRV9GUkVFKHBFbmNvZGVyQ29udGV4dCk7Ci0gICAgcENvbnRleHQgPSBNNE9TQV9OVUxMOwotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2NsZWFudXAgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfY2xlYW51cCBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2NsZWFudXAgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2luaXQoTTRFTkNPREVSX0F1ZGlvRm9ybWF0IGZvcm1hdCwKLSAgICAgICAgTTRPU0FfQ29udGV4dCogcENvbnRleHQsIE00T1NBX1ZvaWQqIHBVc2VyRGF0YSkgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIEFMT0dWKCIgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfaW5pdCBiZWdpbjogZm9ybWF0ICVkIiwgZm9ybWF0KTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgU0FGRV9NQUxMT0MocEVuY29kZXJDb250ZXh0LCBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9Db250ZXh0LCAxLAotICAgICAgICAiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXIiKTsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1Gb3JtYXQgPSBmb3JtYXQ7Ci0KLSAgICAqcENvbnRleHQgPSBwRW5jb2RlckNvbnRleHQ7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfaW5pdCBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2NsZWFudXAocEVuY29kZXJDb250ZXh0KTsKLSAgICAgICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2luaXQgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9pbml0IGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9pbml0X0FBQyhNNE9TQV9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgTTRPU0FfVm9pZCogcFVzZXJEYXRhKSB7Ci0gICAgcmV0dXJuIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2luaXQoTTRFTkNPREVSX2tBQUMsIHBDb250ZXh0LCBwVXNlckRhdGEpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfaW5pdF9BTVJOQihNNE9TQV9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgTTRPU0FfVm9pZCogcFVzZXJEYXRhKSB7Ci0gICAgcmV0dXJuIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2luaXQoTTRFTkNPREVSX2tBTVJOQiwgcENvbnRleHQsIHBVc2VyRGF0YSk7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9pbml0X01QMyhNNE9TQV9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgTTRPU0FfVm9pZCogcFVzZXJEYXRhKSB7Ci0gICAgcmV0dXJuIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2luaXQoTTRFTkNPREVSX2tNUDMsIHBDb250ZXh0LCBwVXNlckRhdGEpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfY2xvc2UoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9jbG9zZSBiZWdpbiIpOwotCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBTQUZFX0ZSRUUocEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMpOwotCi0gICAgcEVuY29kZXJDb250ZXh0LT5tRW5jb2Rlci0+c3RvcCgpOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXIuY2xlYXIoKTsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1DbGllbnQuZGlzY29ubmVjdCgpOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXJTb3VyY2UuY2xlYXIoKTsKLQotICAgIEFMT0dWKCJBdWRpb0VuY29kZXJfY2xvc2U6SU4gJWQgZnJhbWVzLE9VVCAlZCBmcmFtZXMgZnJvbSAlbGxkIHRvICVsbGQiLAotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1OYklucHV0RnJhbWVzLAotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1OYk91dHB1dEZyYW1lcywgcEVuY29kZXJDb250ZXh0LT5tRmlyc3RPdXRwdXRDdHMsCi0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUxhc3RPdXRwdXRDdHMpOwotCi0gICAgaWYoIHBFbmNvZGVyQ29udGV4dC0+bU5iSW5wdXRGcmFtZXMgIT0gcEVuY29kZXJDb250ZXh0LT5tTmJJbnB1dEZyYW1lcyApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2Nsb3NlOnNvbWUgZnJhbWVzIHdlcmUgbm90IGVuY29kZWQgJWQgJWQiLAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tTmJJbnB1dEZyYW1lcywgcEVuY29kZXJDb250ZXh0LT5tTmJJbnB1dEZyYW1lcyk7Ci0gICAgfQotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2Nsb3NlIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2Nsb3NlIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfY2xvc2UgYmVnaW4gZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX29wZW4oTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvUGFyYW1zICpwUGFyYW1zLCBNNEVOQ09ERVJfQXVkaW9EZWNTcGVjaWZpY0luZm8gKnBEU0ksCi0gICAgICAgIE00T1NBX0NvbnRleHQgcEdyYWJiZXJDb250ZXh0KSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9Db250ZXh0KiBwRW5jb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIHN0YXR1c190IHJlc3VsdCA9IE9LOwotICAgIHNwPE1ldGFEYXRhPiBlbmNvZGVyTWV0YWRhdGEgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIqIG1pbWUgPSBOVUxMOwotICAgIGludDMyX3QgaU5iQ2hhbm5lbCA9IDA7Ci0gICAgdWludDMyX3QgY29kZWNGbGFncyA9IDA7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfb3BlbiBiZWdpbiIpOwotCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBQYXJhbXMsICBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcERTSSwgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgcERTSS0+cEluZm8gPSBNNE9TQV9OVUxMOwotICAgIHBEU0ktPmluZm9TaXplID0gMDsKLQotICAgIHBFbmNvZGVyQ29udGV4dC0+bU5iSW5wdXRGcmFtZXMgID0gMDsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1OYk91dHB1dEZyYW1lcyA9IDA7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tRmlyc3RPdXRwdXRDdHMgPSAtMTsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1MYXN0T3V0cHV0Q3RzICA9IC0xOwotCi0gICAgLy8gQWxsb2NhdGUgJiBpbml0aWFsaXplIHRoZSBlbmNvZGluZyBwYXJhbWV0ZXJzCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX29wZW4gOiBwYXJhbXMgRj0lZCBDTj0lZCBCUj0lZCBGPSVkIiwKLSAgICAgICAgcFBhcmFtcy0+RnJlcXVlbmN5LCBwUGFyYW1zLT5DaGFubmVsTnVtLCBwUGFyYW1zLT5CaXRyYXRlLAotICAgICAgICBwUGFyYW1zLT5Gb3JtYXQpOwotICAgIFNBRkVfTUFMTE9DKHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLCBNNEVOQ09ERVJfQXVkaW9QYXJhbXMsIDEsCi0gICAgICAgICJWSURFT0VESVRPUiBDb2RlY1BhcmFtcyIpOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmVxdWVuY3kgID0gcFBhcmFtcy0+RnJlcXVlbmN5OwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5DaGFubmVsTnVtID0gcFBhcmFtcy0+Q2hhbm5lbE51bTsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+Qml0cmF0ZSAgICA9IHBQYXJhbXMtPkJpdHJhdGU7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZvcm1hdCAgICAgPSBwUGFyYW1zLT5Gb3JtYXQ7Ci0KLSAgICAvLyBDaGVjayBvdXRwdXQgZm9ybWF0IGNvbnNpc3RlbmN5Ci0gICAgVklERU9FRElUT1JfQ0hFQ0socEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZvcm1hdCA9PQotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1Gb3JtYXQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICAvKioKLSAgICAgKiBTdGFnZUZyaWdodCBncmFwaCBidWlsZGluZwotICAgICAqLwotICAgIC8vIENyZWF0ZSB0aGUgbWV0YSBkYXRhIGZvciB0aGUgZW5jb2RlcgotICAgIGVuY29kZXJNZXRhZGF0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICBzd2l0Y2goIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5Gb3JtYXQgKSB7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tBQUM6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1pbWUgPSBNRURJQV9NSU1FVFlQRV9BVURJT19BQUM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIE00RU5DT0RFUl9rQU1STkI6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1pbWUgPSBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyghIkF1ZGlvRW5jb2Rlcl9vcGVuIDogaW5jb3JyZWN0IGlucHV0IGZvcm1hdCIsCi0gICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZW5jb2Rlck1ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgbWltZSk7Ci0gICAgZW5jb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwKLSAgICAgICAgKGludDMyX3QpcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZyZXF1ZW5jeSk7Ci0gICAgZW5jb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5Qml0UmF0ZSwKLSAgICAgICAgKGludDMyX3QpcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkJpdHJhdGUpOwotCi0gICAgc3dpdGNoKCBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+Q2hhbm5lbE51bSApIHsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa01vbm86Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlOYkNoYW5uZWwgPSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa1N0ZXJlbzoKLSAgICAgICAgewotICAgICAgICAgICAgaU5iQ2hhbm5lbCA9IDI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyghIkF1ZGlvRW5jb2Rlcl9vcGVuIDogaW5jb3JyZWN0IGNoYW5uZWwgbnVtYmVyIiwKLSAgICAgICAgICAgICAgICBNNEVSUl9TVEFURSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbmNvZGVyTWV0YWRhdGEtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIGlOYkNoYW5uZWwpOwotCi0gICAgLy8gQ3JlYXRlIHRoZSBlbmNvZGVyIHNvdXJjZQotICAgIHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXJTb3VyY2UgPSBWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6Q3JlYXRlKAotICAgICAgICBlbmNvZGVyTWV0YWRhdGEpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE5VTEwgIT0gcEVuY29kZXJDb250ZXh0LT5tRW5jb2RlclNvdXJjZS5nZXQoKSwKLSAgICAgICAgTTRFUlJfU1RBVEUpOwotCi0gICAgLy8gQ29ubmVjdCB0byB0aGUgT01YIGNsaWVudAotICAgIHJlc3VsdCA9IHBFbmNvZGVyQ29udGV4dC0+bUNsaWVudC5jb25uZWN0KCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soT0sgPT0gcmVzdWx0LCBNNEVSUl9TVEFURSk7Ci0KLSAgICAvLyBDcmVhdGUgdGhlIE9NWCBjb2RlYwotI2lmZGVmIFZJREVPRURJVE9SX0ZPUkNFQ09ERUMKLSAgICBjb2RlY0ZsYWdzIHw9IE9NWENvZGVjOjpWSURFT0VESVRPUl9GT1JDRUNPREVDOwotI2VuZGlmIC8qIFZJREVPRURJVE9SX0ZPUkNFQ09ERUMgKi8KLSAgICAvLyBGSVhNRToKLSAgICAvLyBXZSBhcmUgbW92aW5nIGF3YXkgdG8gdXNlIHNvZnR3YXJlIEFBQ0VuY29kZXIgYW5kIGluc3RlYWQgdXNlIE9NWC1iYXNlZAotICAgIC8vIHNvZnR3YXJlIEFBQyBhdWRpbyBlbmNvZGVyLiBXZSB3YW50IHRvIHVzZSBBQUNFbmNvZGVyIGZvciBub3cuIEFmdGVyIHdlCi0gICAgLy8gZml4IHRoZSBpbnRlcmZhY2UgaXNzdWUgd2l0aCB0aGUgT01YLWJhc2VkIEFBQyBhdWRpbyBlbmNvZGVyLCB3ZSBzaG91bGQKLSAgICAvLyB0aGVuIHNldCB0aGUgY29tcG9uZW50IG5hbWUgYmFjayB0byBOVUxMIHRvIGFsbG93IHRoZSBzeXN0ZW0gdG8gcGljayB1cAotICAgIC8vIHRoZSByaWdodCBBQUMgYXVkaW8gZW5jb2Rlci4KLSAgICBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyID0gT01YQ29kZWM6OkNyZWF0ZSgKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUNsaWVudC5pbnRlcmZhY2UoKSwgZW5jb2Rlck1ldGFkYXRhLCB0cnVlLAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tRW5jb2RlclNvdXJjZSwgIkFBQ0VuY29kZXIiIC8qIGNvbXBvbmVudCBuYW1lICovLAotICAgICAgICAgICAgY29kZWNGbGFncyk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTlVMTCAhPSBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyLmdldCgpLCBNNEVSUl9TVEFURSk7Ci0KLSAgICAvLyBTdGFydCB0aGUgZ3JhcGgKLSAgICByZXN1bHQgPSBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyLT5zdGFydCgpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE9LID09IHJlc3VsdCwgTTRFUlJfU1RBVEUpOwotCi0gICAgLy8gR2V0IEFBQyBEU0ksIHRoaXMgY29kZSBjYW4gb25seSB3b3JrIHdpdGggc29mdHdhcmUgZW5jb2RlcgotICAgIGlmKCBNNEVOQ09ERVJfa0FBQyA9PSBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+Rm9ybWF0ICkgewotICAgICAgICBpbnQzMl90ICAgICAgaXNDb2RlY0NvbmZpZyA9IDA7Ci0gICAgICAgIE1lZGlhQnVmZmVyKiBidWZmZXIgICAgICAgID0gTlVMTDsKLQotICAgICAgICAvLyBSZWFkIG9uY2UgdG8gZ2V0IHRoZSBEU0kKLSAgICAgICAgcmVzdWx0ID0gcEVuY29kZXJDb250ZXh0LT5tRW5jb2Rlci0+cmVhZCgmYnVmZmVyLCBOVUxMKTsKLSAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soT0sgPT0gcmVzdWx0LCBNNEVSUl9TVEFURSk7Ci0gICAgICAgIFZJREVPRURJVE9SX0NIRUNLKGJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQzMihrS2V5SXNDb2RlY0NvbmZpZywKLSAgICAgICAgICAgICZpc0NvZGVjQ29uZmlnKSAmJiBpc0NvZGVjQ29uZmlnLCBNNEVSUl9TVEFURSk7Ci0KLSAgICAgICAgLy8gU2F2ZSB0aGUgRFNJCi0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bURTSS5pbmZvU2l6ZSA9IChNNE9TQV9VSW50MzIpYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKLSAgICAgICAgU0FGRV9NQUxMT0MocEVuY29kZXJDb250ZXh0LT5tRFNJLnBJbmZvLCBNNE9TQV9JbnQ4LAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tRFNJLmluZm9TaXplLCAiRW5jb2RlciBoZWFkZXIiKTsKLQotICAgICAgICBtZW1jcHkoKHZvaWQgKilwRW5jb2RlckNvbnRleHQtPm1EU0kucEluZm8sCi0gICAgICAgICAgICAodm9pZCAqKSgoTTRPU0FfTWVtQWRkcjgpKGJ1ZmZlci0+ZGF0YSgpKStidWZmZXItPnJhbmdlX29mZnNldCgpKSwKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bURTSS5pbmZvU2l6ZSk7Ci0KLSAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICpwRFNJID0gcEVuY29kZXJDb250ZXh0LT5tRFNJOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfb3BlbiA6IERPTkUiKTsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9vcGVuIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfY2xvc2UocEVuY29kZXJDb250ZXh0KTsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX29wZW4gRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9vcGVuIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvQnVmZmVyKiBwSW5CdWZmZXIpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfSW50OCogcERhdGEgPSBNNE9TQV9OVUxMOwotICAgIE1lZGlhQnVmZmVyKiBidWZmZXIgPSBOVUxMOwotICAgIGludDMyX3QgbmJCdWZmZXIgPSAwOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlciBiZWdpbiIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBzd2l0Y2goIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5DaGFubmVsTnVtICkgewotICAgICAgICBjYXNlIE00RU5DT0RFUl9rTW9ubzoKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa1N0ZXJlbzoKLSAgICAgICAgICAgIC8vIExldCB0aGUgTWVkaWFCdWZmZXIgb3duIHRoZSBkYXRhIHNvIHdlIGRvbid0IGhhdmUgdG8gZnJlZSBpdAotICAgICAgICAgICAgYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKChzaXplX3QpcEluQnVmZmVyLT5wVGFibGVCdWZmZXJTaXplWzBdKTsKLSAgICAgICAgICAgIHBEYXRhID0gKE00T1NBX0ludDgqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBEYXRhLCAodm9pZCAqKXBJbkJ1ZmZlci0+cFRhYmxlQnVmZmVyWzBdLAotICAgICAgICAgICAgICAgIHBJbkJ1ZmZlci0+cFRhYmxlQnVmZmVyU2l6ZVswXSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dWKCJWRUFFX3Byb2Nlc3NJbnB1dEJ1ZmZlciB1bnN1cHBvcnRlZCBjaGFubmVsIGNvbmZpZ3VyYXRpb24gJWQiLAotICAgICAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5DaGFubmVsTnVtKTsKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX0ZBTFNFLCBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlciA6IHN0b3JlICVkIGJ5dGVzIiwKLSAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7Ci0gICAgLy8gUHVzaCB0aGUgYnVmZmVyIHRvIHRoZSBzb3VyY2UKLSAgICBuYkJ1ZmZlciA9IHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXJTb3VyY2UtPnN0b3JlQnVmZmVyKGJ1ZmZlcik7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfcHJvY2Vzc0lucHV0QnVmZmVyIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYoIE5VTEwgIT0gYnVmZmVyICkgewotICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlciBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlciBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlcihNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBNZWRpYUJ1ZmZlciogYnVmZmVyLCBNNEVOQ09ERVJfQXVkaW9CdWZmZXIqIHBPdXRCdWZmZXIpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfVUludDMyIEN0cyA9IDA7Ci0gICAgaW50MzJfdCBpMzJUbXAgPSAwOwotICAgIGludDY0X3QgaTY0VG1wID0gMDsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBPSzsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyIGJlZ2luIik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgICBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gYnVmZmVyLCAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBPdXRCdWZmZXIsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICAvLyBQcm9jZXNzIHRoZSByZXR1cm5lZCBBVQotICAgIGlmKCAwID09IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgKSB7Ci0gICAgICAgIC8vIEVuY29kZXIgaGFzIG5vIGRhdGEgeWV0LCBub3RoaW5nIHVudXN1YWwKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgOiBidWZmZXIgaXMgZW1wdHkiKTsKLSAgICAgICAgcE91dEJ1ZmZlci0+cFRhYmxlQnVmZmVyU2l6ZVswXSA9IDA7Ci0gICAgICAgIGdvdG8gY2xlYW5VcDsKLSAgICB9Ci0gICAgaWYoIGJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQzMihrS2V5SXNDb2RlY0NvbmZpZywgJmkzMlRtcCkgJiYgaTMyVG1wICkgewotICAgICAgICAvKiBUaGlzIHNob3VsZCBub3QgaGFwcGVuIHdpdGggc29mdHdhcmUgZW5jb2RlciwKLSAgICAgICAgICogRFNJIHdhcyByZXRyaWV2ZWQgYmVmb3JlaGFuZCAqLwotICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9GQUxTRSwgTTRFUlJfU1RBVEUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIENoZWNrIHRoZSBDVFMKLSAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soYnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmaTY0VG1wKSwKLSAgICAgICAgICAgIE00RVJSX1NUQVRFKTsKLSAgICAgICAgQ3RzID0gKE00T1NBX0ludDMyKShpNjRUbXAvMTAwMCk7Ci0KLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tTmJPdXRwdXRGcmFtZXMrKzsKLSAgICAgICAgaWYoIDAgPiBwRW5jb2RlckNvbnRleHQtPm1GaXJzdE91dHB1dEN0cyApIHsKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUZpcnN0T3V0cHV0Q3RzID0gaTY0VG1wOwotICAgICAgICB9Ci0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUxhc3RPdXRwdXRDdHMgPSBpNjRUbXA7Ci0KLSAgICAgICAgLy8gRm9ybWF0IHRoZSBBVQotICAgICAgICBtZW1jcHkoKHZvaWQgKilwT3V0QnVmZmVyLT5wVGFibGVCdWZmZXJbMF0sCi0gICAgICAgICAgICAodm9pZCAqKSgoTTRPU0FfTWVtQWRkcjgpKGJ1ZmZlci0+ZGF0YSgpKStidWZmZXItPnJhbmdlX29mZnNldCgpKSwKLSAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwotICAgICAgICBwT3V0QnVmZmVyLT5wVGFibGVCdWZmZXJTaXplWzBdID0gKE00T1NBX1VJbnQzMilidWZmZXItPnJhbmdlX2xlbmd0aCgpOwotICAgIH0KLQotY2xlYW5VcDoKLSAgICAvLyBSZWxlYXNlIHRoZSBidWZmZXIKLSAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9zdGVwKE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgIE00RU5DT0RFUl9BdWRpb0J1ZmZlciogcEluQnVmZmVyLCBNNEVOQ09ERVJfQXVkaW9CdWZmZXIqIHBPdXRCdWZmZXIpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9Db250ZXh0KiBwRW5jb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIHN0YXR1c190IHJlc3VsdCA9IE9LOwotICAgIE1lZGlhQnVmZmVyKiBidWZmZXIgPSBOVUxMOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3N0ZXAgYmVnaW4iKTsKLQotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBJbkJ1ZmZlciwgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwT3V0QnVmZmVyLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgcEVuY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotICAgIHBFbmNvZGVyQ29udGV4dC0+bU5iSW5wdXRGcmFtZXMrKzsKLQotICAgIC8vIFB1c2ggdGhlIGlucHV0IGJ1ZmZlciB0byB0aGUgZW5jb2RlciBzb3VyY2UKLSAgICBlcnIgPSBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIocEVuY29kZXJDb250ZXh0LHBJbkJ1ZmZlcik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0KLSAgICAvLyBSZWFkCi0gICAgcmVzdWx0ID0gcEVuY29kZXJDb250ZXh0LT5tRW5jb2Rlci0+cmVhZCgmYnVmZmVyLCBOVUxMKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhPSyA9PSByZXN1bHQsIE00RVJSX1NUQVRFKTsKLQotICAgIC8vIFByb3ZpZGUgdGhlIGVuY29kZWQgQVUgdG8gdGhlIHdyaXRlcgotICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIocEVuY29kZXJDb250ZXh0LCBidWZmZXIsCi0gICAgICAgIHBPdXRCdWZmZXIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3N0ZXAgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfc3RlcCBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3N0ZXAgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldE9wdGlvbihNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JRCwgTTRPU0FfRGF0YU9wdGlvbiogb3B0aW9uVmFsdWUpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9Db250ZXh0KiBwRW5jb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldE9wdGlvbiBiZWdpbiBvcHRpb25JRCAweCVYIiwgb3B0aW9uSUQpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBzd2l0Y2goIG9wdGlvbklEICkgewotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldE9wdGlvbjogdW5zdXBwb3J0ZWQgb3B0aW9uSWQgMHglWCIsCi0gICAgICAgICAgICAgICAgb3B0aW9uSUQpOwotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfRkFMU0UsIE00RVJSX0JBRF9PUFRJT05fSUQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldE9wdGlvbiBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRPcHRpb24gRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRPcHRpb24gZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZSgKLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0IGZvcm1hdCwgTTRFTkNPREVSX0F1ZGlvRm9ybWF0KiBwRm9ybWF0LAotICAgICAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UqKiBwRW5jb2RlckludGVyZmFjZSkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcEZvcm1hdCwgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwRW5jb2RlckludGVyZmFjZSwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2UgMHgleCAweCV4IixwRm9ybWF0LAotICAgICAgICBwRW5jb2RlckludGVyZmFjZSk7Ci0gICAgU0FGRV9NQUxMT0MoKnBFbmNvZGVySW50ZXJmYWNlLCBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UsIDEsCi0gICAgICAgICJBdWRpb0VuY29kZXIiKTsKLQotICAgICpwRm9ybWF0ID0gZm9ybWF0OwotCi0gICAgc3dpdGNoKCBmb3JtYXQgKSB7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tBQUM6Ci0gICAgICAgIHsKLSAgICAgICAgICAgICgqcEVuY29kZXJJbnRlcmZhY2UpLT5wRmN0SW5pdCA9IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2luaXRfQUFDOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa0FNUk5COgotICAgICAgICB7Ci0gICAgICAgICAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdEluaXQgPSBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9pbml0X0FNUk5COwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa01QMzoKLSAgICAgICAgewotICAgICAgICAgICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RJbml0ID0gVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfaW5pdF9NUDM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0SW50ZXJmYWNlOiB1bnN1cHBvcnRlZCBmb3JtYXQgJWQiLAotICAgICAgICAgICAgICAgIGZvcm1hdCk7Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9GQUxTRSwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RDbGVhblVwICAgICAgPSBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9jbGVhbnVwOwotICAgICgqcEVuY29kZXJJbnRlcmZhY2UpLT5wRmN0T3BlbiAgICAgICAgID0gVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfb3BlbjsKLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdENsb3NlICAgICAgICA9IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2Nsb3NlOwotICAgICgqcEVuY29kZXJJbnRlcmZhY2UpLT5wRmN0U3RlcCAgICAgICAgID0gVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfc3RlcDsKLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdEdldE9wdGlvbiAgICA9IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldE9wdGlvbjsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2Ugbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICAqcEVuY29kZXJJbnRlcmZhY2UgPSBNNE9TQV9OVUxMOwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0SW50ZXJmYWNlIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotZXh0ZXJuICJDIiB7Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfQUFDKAotICAgICAgICBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQqIHBGb3JtYXQsCi0gICAgICAgIE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZSoqIHBFbmNvZGVySW50ZXJmYWNlKSB7Ci0gICAgcmV0dXJuIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZSgKLSAgICAgICAgTTRFTkNPREVSX2tBQUMsIHBGb3JtYXQsIHBFbmNvZGVySW50ZXJmYWNlKTsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZV9BTVJOQigKLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0KiBwRm9ybWF0LAotICAgICAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UqKiBwRW5jb2RlckludGVyZmFjZSkgewotCi0gICAgcmV0dXJuIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZSgKLSAgICAgICAgTTRFTkNPREVSX2tBTVJOQiwgcEZvcm1hdCwgcEVuY29kZXJJbnRlcmZhY2UpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0SW50ZXJmYWNlX01QMygKLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0KiBwRm9ybWF0LAotICAgICAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UqKiBwRW5jb2RlckludGVyZmFjZSkgewotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfTVAzIG5vIGVycm9yIik7Ci0KLSAgICByZXR1cm4gVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0SW50ZXJmYWNlKAotICAgICAgICBNNEVOQ09ERVJfa01QMywgcEZvcm1hdCwgcEVuY29kZXJJbnRlcmZhY2UpOwotfQotCi19ICAvLyBleHRlcm4gIkMiCi0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yQnVmZmVyLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yQnVmZmVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY0Y2ZhN2MuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvckJ1ZmZlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBmaWxlICAgVmlkZW9FZGl0b3JCdWZmZXIuYwotKiBAYnJpZWYgIFN0YWdlRnJpZ2h0IHNoZWxsIEJ1ZmZlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSN1bmRlZiBNNE9TQV9UUkFDRV9MRVZFTAotI2RlZmluZSBNNE9TQV9UUkFDRV9MRVZFTCAxCi0KLSNpbmNsdWRlICJWaWRlb0VkaXRvckJ1ZmZlci5oIgotI2luY2x1ZGUgInV0aWxzL0xvZy5oIgotCi0jZGVmaW5lIFZJREVPRURJVE9SX0JVRkZFUE9PTF9NQVhfTkFNRV9TSVpFIDQwCi0KLSNkZWZpbmUgVklERU9FRElUT1JfU0FGRV9GUkVFKHApIFwKLXsgXAotICAgIGlmKE00T1NBX05VTEwgIT0gcCkgXAotICAgIHsgXAotICAgICAgICBmcmVlKHApOyBcCi0gICAgICAgIHAgPSBNNE9TQV9OVUxMOyBcCi0gICAgfSBcCi19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIE00T1NBX0VSUiBWSURFT0VESVRPUl9CVUZGRVJfYWxsb2NhdGVQb29sKFZJREVPRURJVE9SX0JVRkZFUl9Qb29sKiogcHBvb2wsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIG5iQnVmZmVycykKLSAqIEBicmllZiAgIEFsbG9jYXRlIGEgcG9vbCBvZiBuYkJ1ZmZlcnMgYnVmZmVycwotICoKLSAqIEBwYXJhbSAgIHBwb29sICAgICAgOiBJTiBUaGUgYnVmZmVyIHBvb2wgdG8gY3JlYXRlCi0gKiBAcGFyYW0gICBuYkJ1ZmZlcnMgIDogSU4gVGhlIG51bWJlciBvZiBidWZmZXJzIGluIHRoZSBwb29sCi0gKiBAcGFyYW0gICBwb29sTmFtZSAgIDogSU4gYSBuYW1lIGdpdmVuIHRvIHRoZSBwb29sCi0gKiBAcmV0dXJuICBFcnJvciBjb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZJREVPRURJVE9SX0JVRkZFUl9hbGxvY2F0ZVBvb2woVklERU9FRElUT1JfQlVGRkVSX1Bvb2wqKiBwcG9vbCwKLSAgICAgICAgTTRPU0FfVUludDMyIG5iQnVmZmVycywgTTRPU0FfQ2hhciogcG9vbE5hbWUpCi17Ci0gICAgTTRPU0FfRVJSIGxlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZJREVPRURJVE9SX0JVRkZFUl9Qb29sKiBwb29sOwotICAgIE00T1NBX1VJbnQzMiBpbmRleDsKLQotICAgIEFMT0dWKCJWSURFT0VESVRPUl9CVUZGRVJfYWxsb2NhdGVQb29sIDogcHBvb2wgPSAweCV4IG5iQnVmZmVycyA9ICVkICIsCi0gICAgICAgIHBwb29sLCBuYkJ1ZmZlcnMpOwotCi0gICAgcG9vbCA9IE00T1NBX05VTEw7Ci0gICAgcG9vbCA9IChWSURFT0VESVRPUl9CVUZGRVJfUG9vbCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgc2l6ZW9mKFZJREVPRURJVE9SX0JVRkZFUl9Qb29sKSwgVklERU9FRElUT1JfQlVGRkVSX0VYVEVSTkFMLAotICAgICAgICAgICAgKE00T1NBX0NoYXIqKSgiVklERU9FRElUT1JfQlVGRkVSX2FsbG9jYXRlUG9vbDogcG9vbCIpKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwb29sKQotICAgIHsKLSAgICAgICAgbGVyciA9IE00RVJSX0FMTE9DOwotICAgICAgICBnb3RvIFZJREVPRURJVE9SX0JVRkZFUl9hbGxvY2F0ZVBvb2xfQ2xlYW51cDsKLSAgICB9Ci0KLSAgICBBTE9HVigiVklERU9FRElUT1JfQlVGRkVSX2FsbG9jYXRlUG9vbCA6IEFsbG9jYXRpbmcgUG9vbCBidWZmZXJzIik7Ci0gICAgcG9vbC0+cE5YUEJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgcG9vbC0+cE5YUEJ1ZmZlciA9IChWSURFT0VESVRPUl9CVUZGRVJfQnVmZmVyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFZJREVPRURJVE9SX0JVRkZFUl9CdWZmZXIpKm5iQnVmZmVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWSURFT0VESVRPUl9CVUZGRVJfRVhURVJOQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSgiQlVGRkVSX2FsbG9jYXRlUG9vbDogcE5YUEJ1ZmZlciIpKTsKLSAgICBpZihNNE9TQV9OVUxMID09IHBvb2wtPnBOWFBCdWZmZXIpCi0gICAgewotICAgICAgICBsZXJyID0gTTRFUlJfQUxMT0M7Ci0gICAgICAgIGdvdG8gVklERU9FRElUT1JfQlVGRkVSX2FsbG9jYXRlUG9vbF9DbGVhbnVwOwotICAgIH0KLQotICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG5iQnVmZmVyczsgaW5kZXgrKykKLSAgICB7Ci0gICAgICAgIHBvb2wtPnBOWFBCdWZmZXJbaW5kZXhdLnBEYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBBTE9HVigiVklERU9FRElUT1JfQlVGRkVSX2FsbG9jYXRlUG9vbCA6IEFsbG9jYXRpbmcgUG9vbCBuYW1lIGJ1ZmZlciIpOwotICAgIHBvb2wtPnBvb2xOYW1lID0gTTRPU0FfTlVMTDsKLSAgICBwb29sLT5wb29sTmFtZSA9IChNNE9TQV9DaGFyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgIFZJREVPRURJVE9SX0JVRkZFUE9PTF9NQVhfTkFNRV9TSVpFLFZJREVPRURJVE9SX0JVRkZFUl9FWFRFUk5BTCwKLSAgICAgICAgKE00T1NBX0NoYXIqKSgiVklERU9FRElUT1JfQlVGRkVSX2FsbG9jYXRlUG9vbDogcG9vbG5hbWUiKSk7Ci0gICAgaWYocG9vbC0+cG9vbE5hbWUgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIGxlcnIgPSBNNEVSUl9BTExPQzsKLSAgICAgICAgZ290byBWSURFT0VESVRPUl9CVUZGRVJfYWxsb2NhdGVQb29sX0NsZWFudXA7Ci0gICAgfQotCi0gICAgQUxPR1YoIlZJREVPRURJVE9SX0JVRkZFUl9hbGxvY2F0ZVBvb2wgOiBBc3NpZ25pbmcgUG9vbCBuYW1lIGJ1ZmZlciIpOwotCi0gICAgbWVtc2V0KCh2b2lkICopcG9vbC0+cG9vbE5hbWUsIDAsVklERU9FRElUT1JfQlVGRkVQT09MX01BWF9OQU1FX1NJWkUpOwotICAgIG1lbWNweSgodm9pZCAqKXBvb2wtPnBvb2xOYW1lLCAodm9pZCAqKXBvb2xOYW1lLAotICAgICAgICBWSURFT0VESVRPUl9CVUZGRVBPT0xfTUFYX05BTUVfU0laRS0xKTsKLQotICAgIHBvb2wtPk5CID0gbmJCdWZmZXJzOwotCi1WSURFT0VESVRPUl9CVUZGRVJfYWxsb2NhdGVQb29sX0NsZWFudXA6Ci0gICAgaWYoTTROT19FUlJPUiAhPSBsZXJyKQotICAgIHsKLSAgICAgICAgVklERU9FRElUT1JfU0FGRV9GUkVFKHBvb2wtPnBOWFBCdWZmZXIpOwotICAgICAgICBWSURFT0VESVRPUl9TQUZFX0ZSRUUocG9vbC0+cG9vbE5hbWUpOwotICAgICAgICBWSURFT0VESVRPUl9TQUZFX0ZSRUUocG9vbCk7Ci0gICAgfQotICAgICpwcG9vbCA9IHBvb2w7Ci0gICAgQUxPR1YoIlZJREVPRURJVE9SX0JVRkZFUl9hbGxvY2F0ZVBvb2wgRU5EIik7Ci0KLSAgICByZXR1cm4gbGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gTTRPU0FfRVJSIFZJREVPRURJVE9SX0JVRkZFUl9mcmVlUG9vbChWSURFT0VESVRPUl9CVUZGRVJfUG9vbCogcHBvb2wpCi0gKiBAYnJpZWYgICBEZWFsbG9jYXRlIGEgYnVmZmVyIHBvb2wKLSAqCi0gKiBAcGFyYW0gICBwcG9vbCAgICAgIDogSU4gVGhlIGJ1ZmZlciBwb29sIHRvIGZyZWUKLSAqIEByZXR1cm4gIEVycm9yIGNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVklERU9FRElUT1JfQlVGRkVSX2ZyZWVQb29sKFZJREVPRURJVE9SX0JVRkZFUl9Qb29sKiBwcG9vbCkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX1VJbnQzMiAgaiA9IDA7Ci0KLSAgICBBTE9HVigiVklERU9FRElUT1JfQlVGRkVSX2ZyZWVQb29sIDogcHBvb2wgPSAweCV4IiwgcHBvb2wpOwotCi0gICAgZXJyID0gTTROT19FUlJPUjsKLQotICAgIGZvciAoaiA9IDA7IGogPCBwcG9vbC0+TkI7IGorKykKLSAgICB7Ci0gICAgICAgIGlmKE00T1NBX05VTEwgIT0gcHBvb2wtPnBOWFBCdWZmZXJbal0ucERhdGEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocHBvb2wtPnBOWFBCdWZmZXJbal0ucERhdGEpOwotICAgICAgICAgICAgcHBvb2wtPnBOWFBCdWZmZXJbal0ucERhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYocHBvb2wgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIFNBRkVfRlJFRShwcG9vbC0+cE5YUEJ1ZmZlcik7Ci0gICAgICAgIFNBRkVfRlJFRShwcG9vbC0+cG9vbE5hbWUpOwotICAgICAgICBTQUZFX0ZSRUUocHBvb2wpOwotICAgIH0KLQotICAgIHJldHVybihlcnIpOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBNNE9TQV9FUlIgVklERU9FRElUT1JfQlVGRkVSX2dldEJ1ZmZlcihWSURFT0VESVRPUl9CVUZGRVJfUG9vbCogcHBvb2wsCi0gKiAgICAgICAgIFZJREVPRURJVE9SX0JVRkZFUl9CdWZmZXIqKiBwTlhQQnVmZmVyKQotICogQGJyaWVmICAgUmV0dXJucyBhIGJ1ZmZlciBpbiBhIGdpdmVuIHN0YXRlCi0gKgotICogQHBhcmFtICAgcHBvb2wgICAgICA6IElOIFRoZSBidWZmZXIgcG9vbAotICogQHBhcmFtICAgZGVzaXJlZFN0YXRlIDogSU4gVGhlIGJ1ZmZlciBzdGF0ZQotICogQHBhcmFtICAgcE5YUEJ1ZmZlciA6IElOIFRoZSBzZWxlY3RlZCBidWZmZXIKLSAqIEByZXR1cm4gIEVycm9yIGNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVklERU9FRElUT1JfQlVGRkVSX2dldEJ1ZmZlcihWSURFT0VESVRPUl9CVUZGRVJfUG9vbCogcHBvb2wsCi0gICAgICAgIFZJREVPRURJVE9SX0JVRkZFUl9TdGF0ZSBkZXNpcmVkU3RhdGUsCi0gICAgICAgIFZJREVPRURJVE9SX0JVRkZFUl9CdWZmZXIqKiBwTlhQQnVmZmVyKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX0Jvb2wgYkZvdW5kID0gTTRPU0FfRkFMU0U7Ci0gICAgTTRPU0FfVUludDMyIGksIGlidWY7Ci0KLSAgICBBTE9HVigiVklERU9FRElUT1JfQlVGRkVSX2dldEJ1ZmZlciBmcm9tICVzIGluIHN0YXRlPSVkIiwKLSAgICAgICAgcHBvb2wtPnBvb2xOYW1lLCBkZXNpcmVkU3RhdGUpOwotCi0gICAgaWJ1ZiA9IDA7Ci0KLSAgICBmb3IgKGk9MDsgaSA8IHBwb29sLT5OQjsgaSsrKQotICAgIHsKLSAgICAgICAgYkZvdW5kID0gKHBwb29sLT5wTlhQQnVmZmVyW2ldLnN0YXRlID09IGRlc2lyZWRTdGF0ZSk7Ci0gICAgICAgIGlmIChiRm91bmQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlidWYgPSBpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZighYkZvdW5kKQotICAgIHsKLSAgICAgICAgQUxPR1YoIlZJREVPRURJVE9SX0JVRkZFUl9nZXRCdWZmZXIgTm8gYnVmZmVyIGF2YWlsYWJsZSBpbiBzdGF0ZSAlZCIsCi0gICAgICAgICAgICBkZXNpcmVkU3RhdGUpOwotICAgICAgICAqcE5YUEJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgICAgIHJldHVybiBNNEVSUl9OT19CVUZGRVJfQVZBSUxBQkxFOwotICAgIH0KLQotICAgIC8qIGNhc2Ugd2hlcmUgYSBidWZmZXIgaGFzIGJlZW4gZm91bmQgKi8KLSAgICAqcE5YUEJ1ZmZlciA9ICYocHBvb2wtPnBOWFBCdWZmZXJbaWJ1Zl0pOwotCi0gICAgQUxPR1YoIlZJREVPRURJVE9SX0JVRkZFUl9nZXRCdWZmZXI6IGlkeCA9ICVkIiwgaWJ1Zik7Ci0KLSAgICByZXR1cm4oZXJyKTsKLX0KLQotTTRPU0FfRVJSIFZJREVPRURJVE9SX0JVRkZFUl9pbml0UG9vbEJ1ZmZlcnMoVklERU9FRElUT1JfQlVGRkVSX1Bvb2wqIHBvb2wsCi0gICAgTTRPU0FfVUludDMyIGxTaXplKQotewotICAgIE00T1NBX0VSUiAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9VSW50MzIgIGluZGV4LCBqOwotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSBhbGwgdGhlIGJ1ZmZlcnMgaW4gdGhlIHBvb2wgKi8KLSAgICBmb3IoaW5kZXggPSAwOyBpbmRleCA8IHBvb2wtPk5COyBpbmRleCsrKQotICAgIHsKLSAgICAgICAgcG9vbC0+cE5YUEJ1ZmZlcltpbmRleF0ucERhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICBwb29sLT5wTlhQQnVmZmVyW2luZGV4XS5wRGF0YSA9IChNNE9TQV9Wb2lkKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICBsU2l6ZSwgVklERU9FRElUT1JfQlVGRkVSX0VYVEVSTkFMLAotICAgICAgICAgICAgKE00T1NBX0NoYXIqKSgiQlVGRkVSX2luaXRQb29sQnVmZmVyczogQnVmZmVyIGRhdGEiKSk7Ci0gICAgICAgIGlmKE00T1NBX05VTEwgPT0gcG9vbC0+cE5YUEJ1ZmZlcltpbmRleF0ucERhdGEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBpbmRleDsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKE00T1NBX05VTEwgIT0gcG9vbC0+cE5YUEJ1ZmZlcltqXS5wRGF0YSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUocG9vbC0+cE5YUEJ1ZmZlcltqXS5wRGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIHBvb2wtPnBOWFBCdWZmZXJbal0ucERhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVyciA9IE00RVJSX0FMTE9DOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBwb29sLT5wTlhQQnVmZmVyW2luZGV4XS5zaXplID0gMDsKLSAgICAgICAgcG9vbC0+cE5YUEJ1ZmZlcltpbmRleF0uc3RhdGUgPSBWSURFT0VESVRPUl9CVUZGRVJfa0VtcHR5OwotICAgICAgICBwb29sLT5wTlhQQnVmZmVyW2luZGV4XS5pZHggPSBpbmRleDsKLSAgICAgICAgcG9vbC0+cE5YUEJ1ZmZlcltpbmRleF0uYnVmZkNUUyA9IC0xOwotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVklERU9FRElUT1JfQlVGRkVSX2dldE9sZGVzdEJ1ZmZlcihWSURFT0VESVRPUl9CVUZGRVJfUG9vbCAqcG9vbCwKLSAgICAgICAgVklERU9FRElUT1JfQlVGRkVSX1N0YXRlIGRlc2lyZWRTdGF0ZSwKLSAgICAgICAgVklERU9FRElUT1JfQlVGRkVSX0J1ZmZlcioqIHBOWFBCdWZmZXIpCi17Ci0gICAgTTRPU0FfRVJSICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQzMiAgaW5kZXgsIGo7Ci0gICAgTTRfTWVkaWFUaW1lICBjYW5kaWRhdGVUaW1lU3RhbXAgPSAoTTRfTWVkaWFUaW1lKTB4N2ZmZmZmZjsKLSAgICBNNE9TQV9Cb29sICAgIGJGb3VuZCA9IE00T1NBX0ZBTFNFOwotCi0gICAgKnBOWFBCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIGZvcihpbmRleCA9IDA7IGluZGV4PCBwb29sLT5OQjsgaW5kZXgrKykKLSAgICB7Ci0gICAgICAgIGlmKHBvb2wtPnBOWFBCdWZmZXJbaW5kZXhdLnN0YXRlID09IGRlc2lyZWRTdGF0ZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYocG9vbC0+cE5YUEJ1ZmZlcltpbmRleF0uYnVmZkNUUyA8PSBjYW5kaWRhdGVUaW1lU3RhbXApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYkZvdW5kID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBjYW5kaWRhdGVUaW1lU3RhbXAgPSBwb29sLT5wTlhQQnVmZmVyW2luZGV4XS5idWZmQ1RTOwotICAgICAgICAgICAgICAgICAgICAqcE5YUEJ1ZmZlciA9ICYocG9vbC0+cE5YUEJ1ZmZlcltpbmRleF0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmKE00T1NBX0ZBTFNFID09IGJGb3VuZCkKLSAgICB7Ci0gICAgICAgIEFMT0dWKCJWSURFT0VESVRPUl9CVUZGRVJfZ2V0T2xkZXN0QnVmZmVyIFdBUk5JTkcgbm8gYnVmZmVyIGF2YWlsYWJsZSIpOwotICAgICAgICBlcnIgPSBNNEVSUl9OT19CVUZGRVJfQVZBSUxBQkxFOwotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvck1wM1JlYWRlci5jcHAgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yTXAzUmVhZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWY1M2M1NC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yTXAzUmVhZGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDgwMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAZmlsZSAgIFZpZGVvRWRpdG9yTXAzUmVhZGVyLmNwcAotKiBAYnJpZWYgIFN0YWdlRnJpZ2h0IHNoZWxsIE1QMyBSZWFkZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jZGVmaW5lIExPR19OREVCVUcgMQotI2RlZmluZSBMT0dfVEFHICJWSURFT0VESVRPUl9NUDNSRUFERVIiCi0KLS8qKgotICogSEVBREVSUwotICoKLSAqLwotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRTWVNfQWNjZXNzVW5pdC5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yTXAzUmVhZGVyLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JVdGlscy5oIgotCi0jaW5jbHVkZSAidXRpbHMvTG9nLmgiCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotCi0vKioKLSAqIFNPVVJDRSBDTEFTUwotICovCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8qKgotICogRU5HSU5FIElOVEVSRkFDRQotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dAotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGNvbnRleHQgb2YgdGhlIFNGIE1QMyByZWFkZXIgc2hlbGwuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHNwPERhdGFTb3VyY2U+ICAgICAgICAgICAgICBtRGF0YVNvdXJjZTsKLSAgICBzcDxNZWRpYUV4dHJhY3Rvcj4gICAgICAgICAgbUV4dHJhY3RvcjsKLSAgICBzcDxNZWRpYVNvdXJjZT4gICAgICAgICAgICAgbU1lZGlhU291cmNlOwotICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogICAgICBtQXVkaW9TdHJlYW1IYW5kbGVyOwotICAgIE00U1lTX0FjY2Vzc1VuaXQgICAgICAgICAgICBtQXVkaW9BdTsKLSAgICBNNE9TQV9UaW1lICAgICAgICAgICAgICAgICAgbU1heER1cmF0aW9uOwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICBtU3RyZWFtTnVtYmVyOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICBtU2Vla2luZzsKLSAgICBNNE9TQV9UaW1lICAgICAgICAgICAgICAgICAgbVNlZWtUaW1lOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBtRXh0cmFjdG9yRmxhZ3M7Ci19IFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIE1QMyByZWFkZXIKLSAqIEBub3RlICAgICBhbGxvY2F0ZXMgdGhlIGNvbnRleHQKLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgICAoT1VUKSAgICBwb2ludGVyIG9uIGEgcmVhZGVyIGNvbnRleHQKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DICAgICAgICAgICAgICAgIGEgbWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCB2YWxpZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JNcDNSZWFkZXJfY3JlYXRlKE00T1NBX0NvbnRleHQgKnBDb250ZXh0KSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCAqcFJlYWRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9jcmVhdGUgYmVnaW4iKTsKLQotICAgIC8qIENvbnRleHQgYWxsb2NhdGlvbiAmIGluaXRpYWxpemF0aW9uICovCi0gICAgU0FGRV9NQUxMT0MocFJlYWRlckNvbnRleHQsIFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQsIDEsCi0gICAgICAgICJWaWRlb0VkaXRvck1wM1JlYWRlciIpOwotCi0gICAgcFJlYWRlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXIgID0gTTRPU0FfTlVMTDsKLSAgICBwUmVhZGVyQ29udGV4dC0+bUF1ZGlvQXUuZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIHBSZWFkZXJDb250ZXh0LT5tTWF4RHVyYXRpb24gPSAwOwotICAgICpwQ29udGV4dCA9IHBSZWFkZXJDb250ZXh0OwotCi1jbGVhblVwOgotICAgIGlmIChNNE5PX0VSUk9SID09IGVycikgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfY3JlYXRlIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2NyZWF0ZSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2NyZWF0ZSBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgIGRlc3Ryb3kgdGhlIGluc3RhbmNlIG9mIHRoZSBNUDMgcmVhZGVyCi0gKiBAbm90ZSAgICAgIGFmdGVyIHRoaXMgY2FsbCB0aGUgY29udGV4dCBpcyBpbnZhbGlkCi0gKiBAcGFyYW0gICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBUaGUgaW5wdXQgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZpZGVvRWRpdG9yTXAzUmVhZGVyX2Rlc3Ryb3koTTRPU0FfQ29udGV4dCBwQ29udGV4dCkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQgKnBSZWFkZXJDb250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQqKXBDb250ZXh0OwotCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwUmVhZGVyQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZGVzdHJveSBiZWdpbiIpOwotCi0gICAgU0FGRV9GUkVFKHBSZWFkZXJDb250ZXh0KTsKLWNsZWFuVXA6Ci0gICAgaWYgKE00Tk9fRVJST1IgPT0gZXJyKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9kZXN0cm95IG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2Rlc3Ryb3kgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9kZXN0cm95IGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBvcGVuIHRoZSByZWFkZXIgYW5kIGluaXRpYWxpemVzIGl0cyBjcmVhdGVkIGluc3RhbmNlCi0gKiBAbm90ZSAgICB0aGlzIGZ1bmN0aW9uIG9wZW5zIHRoZSBNUDMgZmlsZQotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwRmlsZURlc2NyaXB0b3I6ICAgIChJTikgICAgUG9pbnRlciB0byBwcm9wcmlldGFyeSBkYXRhIGlkZW50aWZ5aW5nCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtZWRpYSB0byBvcGVuCi0KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgICAgICB0aGUgY29udGV4dCBpcyBOVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICBNNEVSUl9VTlNVUFBPUlRFRF9NRURJQV9UWVBFICAgdGhlIG1lZGlhIGlzIERSTSBwcm90ZWN0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JNcDNSZWFkZXJfb3BlbihNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgIE00T1NBX1ZvaWQqIHBGaWxlRGVzY3JpcHRvcil7Ci0gICAgVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCAqcFJlYWRlckNvbnRleHQgPQotICAgIChWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX29wZW4gYmVnaW4iKTsKLSAgICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcFJlYWRlckNvbnRleHQpLCAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfb3BlbjogaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEZpbGVEZXNjcmlwdG9yKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfb3BlbjogaW52YWxpZCBwb2ludGVyIHBGaWxlRGVzY3JpcHRvciIpOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX29wZW4gRGF0YXNvdXJjZSBzdGFydCAlcyIsCi0gICAgICAgIChjaGFyKilwRmlsZURlc2NyaXB0b3IpOwotICAgIHBSZWFkZXJDb250ZXh0LT5tRGF0YVNvdXJjZSA9IG5ldyBGaWxlU291cmNlICgoY2hhciopcEZpbGVEZXNjcmlwdG9yKTsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfb3BlbiBEYXRhc291cmNlIGVuZCIpOwotCi0gICAgaWYgKHBSZWFkZXJDb250ZXh0LT5tRGF0YVNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9vcGVuIERhdGFzb3VyY2UgZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX29wZW4gZXh0cmFjdG9yIHN0YXJ0Iik7Ci0gICAgcFJlYWRlckNvbnRleHQtPm1FeHRyYWN0b3IgPSBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlKAotICAgICAgICBwUmVhZGVyQ29udGV4dC0+bURhdGFTb3VyY2UsTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRyk7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX29wZW4gZXh0cmFjdG9yIGVuZCIpOwotCi0gICAgaWYgKHBSZWFkZXJDb250ZXh0LT5tRXh0cmFjdG9yID09IE5VTEwpICAgIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX29wZW4gZXh0cmFjdG9yIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLSAgICBwUmVhZGVyQ29udGV4dC0+bVN0cmVhbU51bWJlciA9IDA7Ci0KLSAgICBpbnQzMl90IGlzRFJNUHJvdGVjdGVkID0gMDsKLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IHBSZWFkZXJDb250ZXh0LT5tRXh0cmFjdG9yLT5nZXRNZXRhRGF0YSgpOwotICAgIG1ldGEtPmZpbmRJbnQzMihrS2V5SXNEUk0sICZpc0RSTVByb3RlY3RlZCk7Ci0gICAgaWYgKGlzRFJNUHJvdGVjdGVkKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9vcGVuIGVycm9yIC0gRFJNIFByb3RlY3RlZCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfVU5TVVBQT1JURURfTUVESUFfVFlQRTsKLSAgICB9Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfb3BlbiBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBjbG9zZSB0aGUgcmVhZGVyCi0gKiBAbm90ZSAgICB0aGlzIGZ1bmN0aW9uIGNsb3NlcyB0aGUgTVAzIHJlYWRlcgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgdGhlIGNvbnRleHQgaXMgTlVMTAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZpZGVvRWRpdG9yTXAzUmVhZGVyX2Nsb3NlKE00T1NBX0NvbnRleHQgY29udGV4dCkgewotICAgIFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQgKnBSZWFkZXJDb250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfY2xvc2UgYmVnaW4iKTsKLSAgICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBSZWFkZXJDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2Nsb3NlOiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgaWYgKHBSZWFkZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcFJlYWRlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPlwKLSAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbykgewotICAgICAgICAgICAgZnJlZShwUmVhZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+XAotICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm8pOwotICAgICAgICAgICAgcFJlYWRlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fYmFzaWNQcm9wZXJ0aWVzLlwKLSAgICAgICAgICAgICAgICBtX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMDsKLSAgICAgICAgICAgIHBSZWFkZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2Jhc2ljUHJvcGVydGllcy5cCi0gICAgICAgICAgICAgICAgbV9wRGVjb2RlclNwZWNpZmljSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBGaW5hbGx5IGRlc3Ryb3kgdGhlIHN0cmVhbSBoYW5kbGVyICovCi0gICAgICAgIGZyZWUocFJlYWRlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXIpOwotICAgICAgICBwUmVhZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlciA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgaWYgKHBSZWFkZXJDb250ZXh0LT5tQXVkaW9BdS5kYXRhQWRkcmVzcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBmcmVlKHBSZWFkZXJDb250ZXh0LT5tQXVkaW9BdS5kYXRhQWRkcmVzcyk7Ci0gICAgICAgICAgICBwUmVhZGVyQ29udGV4dC0+bUF1ZGlvQXUuZGF0YUFkZHJlc3MgPSBOVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcFJlYWRlckNvbnRleHQtPm1NZWRpYVNvdXJjZS0+c3RvcCgpOwotICAgIHBSZWFkZXJDb250ZXh0LT5tTWVkaWFTb3VyY2UuY2xlYXIoKTsKLSAgICBwUmVhZGVyQ29udGV4dC0+bUV4dHJhY3Rvci5jbGVhcigpOwotICAgIHBSZWFkZXJDb250ZXh0LT5tRGF0YVNvdXJjZS5jbGVhcigpOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2Nsb3NlIGVuZCAiKTsKLSAgICByZXR1cm4gZXJyOwotfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgZ2V0IGFuIG9wdGlvbiB2YWx1ZSBmcm9tIHRoZSByZWFkZXIKLSAqIEBub3RlCi0gKiAgICAgICAgICBpdCBhbGxvd3MgdGhlIGNhbGxlciB0byByZXRyaWV2ZSBhIHByb3BlcnR5IHZhbHVlOgotICoKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBvcHRpb25JZDogICAgICAgKElOKSAgICBpbmRpY2F0ZXMgdGhlIG9wdGlvbiB0byBnZXQKLSAqIEBwYXJhbSAgICBwVmFsdWU6ICAgICAgICAgKE9VVCkgICBwb2ludGVyIHRvIHN0cnVjdHVyZSBvciB2YWx1ZSAoYWxsb2NhdGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdXNlcikgd2hlcmUgb3B0aW9uIGlzIHN0b3JlZAotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybiAgICBNNEVSUl9CQURfT1BUSU9OX0lEICAgIHdoZW4gdGhlIG9wdGlvbiBJRCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JZCwgTTRPU0FfRGF0YU9wdGlvbiBwVmFsdWUpIHsKLSAgICBWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0ICpwUmVhZGVyQ29udGV4dCA9Ci0gICAgICAgIChWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE9wdGlvbiBiZWdpbjogb3B0aW9uSWQ9ICVkICIsKGludClvcHRpb25JZCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcFJlYWRlckNvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIHZhbHVlIHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcFZhbHVlKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCB2YWx1ZSBwb2ludGVyIik7Ci0KLSAgICBzd2l0Y2gob3B0aW9uSWQpIHsKLSAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9EdXJhdGlvbjoKLSAgICAgICAgewotICAgICAgICAgICAgQUxPR1YoIk1wM1JlYWRlciBkdXJhdGlvbj0lbGQiLHBSZWFkZXJDb250ZXh0LT5tTWF4RHVyYXRpb24pOwotICAgICAgICAgICAgKihNNE9TQV9UaW1lKilwVmFsdWUgPSBwUmVhZGVyQ29udGV4dC0+bU1heER1cmF0aW9uOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfQml0cmF0ZToKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVUludDMyKiBwQml0cmF0ZSA9IChNNE9TQV9VSW50MzIqKXBWYWx1ZTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMICE9IHBSZWFkZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyKSB7Ci0gICAgICAgICAgICAgICAgKnBCaXRyYXRlID0gcFJlYWRlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPlwKLSAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9hdmVyYWdlQml0UmF0ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcEJpdHJhdGUgPSAwOwotICAgICAgICAgICAgICAgIGVyciA9IE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX01wM0lkM3YxVGFnOgotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX01wM0lkM3YyVGFnOgotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0dldE1ldGFkYXRhOgotICAgICAgICBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgICB7Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0T3B0aW9uOiAgTTRFUlJfQkFEX09QVElPTl9JRCIpOwotICAgICAgICAgICAgZXJyID0gTTRFUlJfQkFEX09QVElPTl9JRDsKLSAgICAgICAgfQotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0T3B0aW9uIGVuZCAiKTsKLSAgICByZXR1cm4gZXJyOwotfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBzZXQgYW4gb3B0aW9uIHZhbHVlIG9mIHRoZSByZWFkZXIKLSAqIEBub3RlCi0gKiAgICAgICAgICBpdCBhbGxvd3MgdGhlIGNhbGxlciB0byBzZXQgYSBwcm9wZXJ0eSB2YWx1ZToKLSAqCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgICAoSU4pICAgICAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgIG9wdGlvbklkOiAgIChJTikgICAgICAgIElkZW50aWZpZXIgaW5kaWNhdGluZyB0aGUgb3B0aW9uIHRvIHNldAotICogQHBhcmFtICAgcFZhbHVlOiAgICAgKElOKSAgICAgICAgUG9pbnRlciB0byBzdHJ1Y3R1cmUgb3IgdmFsdWUgKGFsbG9jYXRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdXNlcikgd2hlcmUgb3B0aW9uIGlzIHN0b3JlZAotICoKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgIFRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9CQURfT1BUSU9OX0lEICAgICBUaGUgb3B0aW9uIElEIGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgTTRFUlJfU1RBVEUgICAgICAgICAgICAgU3RhdGUgYXV0b21hdG9uIGlzIG5vdCBhcHBsaWVkCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBUaGUgb3B0aW9uIHBhcmFtZXRlciBpcyBpbnZhbGlkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZpZGVvRWRpdG9yTXAzUmVhZGVyX3NldE9wdGlvbihNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgIE00T1NBX09wdGlvbklEIG9wdGlvbklkLCBNNE9TQV9EYXRhT3B0aW9uIHBWYWx1ZSkgewotICAgIFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQgKnBSZWFkZXJDb250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCBiZWdpbjogb3B0aW9uSWQ6ICVkIFZhbHVlOiAlZCAiLAotICAgICAgICAoaW50KW9wdGlvbklkLChpbnQpcFZhbHVlKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwUmVhZGVyQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBWYWx1ZSksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgdmFsdWUgcG9pbnRlciIpOwotCi0gICAgc3dpdGNoKG9wdGlvbklkKSB7Ci0gICAgICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX1NldE9zYUZpbGVSZWFkZXJGY3RzUHRyOgotICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgfQotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCBlbmQgIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGp1bXAgaW50byB0aGUgc3RyZWFtIGF0IHRoZSBzcGVjaWZpZWQgdGltZQotICogQG5vdGUKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgIChJTikgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlcihJTikgICBzdHJlYW0gZGVzY3JpcHRpb24gb2YgdGhlIHN0cmVhbSB0byBtYWtlIGp1bXAKLSAqIEBwYXJhbSAgICBwVGltZSAgICAgICAgIChJL08pSU46dGhlIHRpbWUgdG8ganVtcCB0byAoaW4gbXMpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVDogdGhlIHRpbWUgdG8gd2hpY2ggdGhlIHN0cmVhbSByZWFsbHkganVtcGVkCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWaWRlb0VkaXRvck1wM1JlYWRlcl9qdW1wKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsIE00T1NBX0ludDMyKiBwVGltZSkgewotICAgIFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQgKnBSZWFkZXJDb250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSWRBcnJheVsyXTsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFNZU19BY2Nlc3NVbml0KiBwQXU7Ci0gICAgTTRPU0FfVGltZSB0aW1lNjQgPSAoTTRPU0FfVGltZSkqcFRpbWU7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfanVtcCBiZWdpbiIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFJlYWRlckNvbnRleHQgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2p1bXA6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2p1bXA6IGludmFsaWQgcG9pbnRlciB0byBNNF9TdHJlYW1IYW5kbGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwVGltZSA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfanVtcDogaW52YWxpZCB0aW1lIHBvaW50ZXIiKTsKLQotICAgIGlmKHBTdHJlYW1IYW5kbGVyID09IChNNF9TdHJlYW1IYW5kbGVyKilwUmVhZGVyQ29udGV4dC0+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+bV9wRmN0R2V0TmV4dEF1ICAgICAgPSBWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0QXU7Ci0gICAgKCpwUmRyRGF0YUludGVyZmFjZSktPm1fcmVhZGVyQ29udGV4dCAgICAgID0gTTRPU0FfTlVMTDsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKQotICAgIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldEludGVyZmFjZSBubyBlcnJvciIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBTQUZFX0ZSRUUoKnBSZHJHbG9iYWxJbnRlcmZhY2UpOwotICAgICAgICBTQUZFX0ZSRUUoKnBSZHJEYXRhSW50ZXJmYWNlKTsKLQotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0SW50ZXJmYWNlIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0SW50ZXJmYWNlOiBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotfSAgLyogZXh0ZXJuICJDIiAqLwotfSAgLyogbmFtZXNwYWNlIGFuZHJvaWQgKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3JVdGlscy5jcHAgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yVXRpbHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YTcyMzdkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3JVdGlscy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAZmlsZSAgIFZpZGVvRWRpdG9yVXRpbHMuY3BwCi0qIEBicmllZiAgU3RhZ2VGcmlnaHQgc2hlbGwgVXRpbGl0aWVzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiU0ZfdXRpbHMiCi0jaW5jbHVkZSAidXRpbHMvTG9nLmgiCi0KLSNpbmNsdWRlICJWaWRlb0VkaXRvclV0aWxzLmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaD4KLQotLyogQW5kcm9pZCBpbmNsdWRlcyovCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8bWVtb3J5Lmg+Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qICBERUJVRyBMRVZFTCBTRVRVUCAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgTE9HMSBBTE9HRSAgICAvKkVSUk9SUyBMb2dnaW5nKi8KLSNkZWZpbmUgTE9HMiBBTE9HSSAgICAvKldBUk5JTkcgTG9nZ2luZyovCi0jZGVmaW5lIExPRzMgLy9BTE9HViAgLypDT01NRU5UUyBMb2dnaW5nKi8KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi12b2lkIGRpc3BsYXlNZXRhRGF0YShjb25zdCBzcDxNZXRhRGF0YT4gbWV0YSkgewotCi0gICAgY29uc3QgY2hhciogY2hhckRhdGE7Ci0gICAgaW50MzJfdCBpbnQzMkRhdGE7Ci0gICAgaW50NjRfdCBpbnQ2NERhdGE7Ci0gICAgdWludDMyX3QgdHlwZTsKLSAgICBjb25zdCB2b2lkKiBkYXRhOwotICAgIHZvaWQqIHB0cjsKLSAgICBzaXplX3Qgc2l6ZTsKLQotICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZjaGFyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlNSU1FVHlwZSAlcyIsIGNoYXJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5V2lkdGggJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5SGVpZ2h0ICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5SUZyYW1lc0ludGVydmFsLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUlGcmFtZXNJbnRlcnZhbCAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleVN0cmlkZSwgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlTdHJpZGUgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlTbGljZUhlaWdodCwgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlTbGljZUhlaWdodCAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlDaGFubmVsQ291bnQgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVNhbXBsZVJhdGUgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlCaXRSYXRlLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUJpdFJhdGUgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZERhdGEoa0tleUVTRFMsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5RVNEUyB0eXBlPSVkIHNpemU9JWQiLCB0eXBlLCBzaXplKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlBVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUFWQ0MgZGF0YT0weCVYIHR5cGU9JWQgc2l6ZT0lZCIsCi0gICAgICAgICAgICAqKCh1bnNpZ25lZCBpbnQqKWRhdGEpLCB0eXBlLCBzaXplKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlWb3JiaXNJbmZvLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVZvcmJpc0luZm8gdHlwZT0lZCBzaXplPSVkIiwgdHlwZSwgc2l6ZSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kRGF0YShrS2V5Vm9yYmlzQm9va3MsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5Vm9yYmlzQm9va3MgdHlwZT0lZCBzaXplPSVkIiwgdHlwZSwgc2l6ZSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleVdhbnRzTkFMRnJhZ21lbnRzLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVdhbnRzTkFMRnJhZ21lbnRzICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5SXNTeW5jRnJhbWUsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5SXNTeW5jRnJhbWUgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlJc0NvZGVjQ29uZmlnLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUlzQ29kZWNDb25maWcgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDY0KGtLZXlUaW1lLCAmaW50NjREYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVRpbWUgJWxsZCIsIGludDY0RGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUR1cmF0aW9uLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUR1cmF0aW9uICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5Q29sb3JGb3JtYXQsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5Q29sb3JGb3JtYXQgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZFBvaW50ZXIoa0tleVBsYXRmb3JtUHJpdmF0ZSwgJnB0cikpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlQbGF0Zm9ybVByaXZhdGUgcG9pbnRlcj0weCV4IiwgKGludDMyX3QpIHB0cik7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5RGVjb2RlckNvbXBvbmVudCwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleURlY29kZXJDb21wb25lbnQgJXMiLCBjaGFyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUJ1ZmZlcklELCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUJ1ZmZlcklEICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleU1heElucHV0U2l6ZSAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50NjQoa0tleVRodW1ibmFpbFRpbWUsICZpbnQ2NERhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5VGh1bWJuYWlsVGltZSAlbGxkIiwgaW50NjREYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlBbGJ1bSwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUFsYnVtICVzIiwgY2hhckRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleUFydGlzdCwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUFydGlzdCAlcyIsIGNoYXJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlBbGJ1bUFydGlzdCwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUFsYnVtQXJ0aXN0ICVzIiwgY2hhckRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleUNvbXBvc2VyLCAmY2hhckRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5Q29tcG9zZXIgJXMiLCBjaGFyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5R2VucmUsICZjaGFyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlHZW5yZSAlcyIsIGNoYXJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlUaXRsZSwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVRpdGxlICVzIiwgY2hhckRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleVllYXIsICZjaGFyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlZZWFyICVzIiwgY2hhckRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZERhdGEoa0tleUFsYnVtQXJ0LCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUFsYnVtQXJ0IHR5cGU9JWQgc2l6ZT0lZCIsIHR5cGUsIHNpemUpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleUFsYnVtQXJ0TUlNRSwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUFsYnVtQXJ0TUlNRSAlcyIsIGNoYXJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlBdXRob3IsICZjaGFyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlBdXRob3IgJXMiLCBjaGFyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5Q0RUcmFja051bWJlciwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUNEVHJhY2tOdW1iZXIgJXMiLCBjaGFyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5RGlzY051bWJlciwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleURpc2NOdW1iZXIgJXMiLCBjaGFyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5RGF0ZSwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleURhdGUgJXMiLCBjaGFyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5V3JpdGVyLCAmY2hhckRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5V3JpdGVyICVzIiwgY2hhckRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlUaW1lU2NhbGUsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5VGltZVNjYWxlICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5VmlkZW9Qcm9maWxlLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVZpZGVvUHJvZmlsZSAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleVZpZGVvTGV2ZWwsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5VmlkZW9MZXZlbCAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleTY0Qml0RmlsZU9mZnNldCwgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXk2NEJpdEZpbGVPZmZzZXQgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlGaWxlVHlwZSwgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlGaWxlVHlwZSAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50NjQoa0tleVRyYWNrVGltZVN0YXR1cywgJmludDY0RGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlUcmFja1RpbWVTdGF0dXMgJWxsZCIsIGludDY0RGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleVJlYWxUaW1lUmVjb3JkaW5nLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVJlYWxUaW1lUmVjb3JkaW5nICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci19Ci0KLS8qKgotICogVGhpcyBjb2RlIHdhcyBleHRyYWN0ZWQgZnJvbSBTdGFnZUZyaWdodCBNUEVHNCB3cml0ZXIKLSAqIElzIGlzIHVzZWQgdG8gcGFyc2UgYW5kIGZvcm1hdCB0aGUgQVZDIGNvZGVjIHNwZWNpZmljIGluZm8gcmVjZWl2ZWQKLSAqIGZyb20gU3RhZ2VGcmlnaHQgZW5jb2RlcnMKLSAqLwotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga05hbFVuaXRUeXBlU2VxUGFyYW1TZXQgPSAweDA3Owotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga05hbFVuaXRUeXBlUGljUGFyYW1TZXQgPSAweDA4Owotc3RydWN0IEFWQ1BhcmFtU2V0IHsKLSAgICBBVkNQYXJhbVNldCh1aW50MTZfdCBsZW5ndGgsIGNvbnN0IHVpbnQ4X3QgKmRhdGEpCi0gICAgICAgIDogbUxlbmd0aChsZW5ndGgpLCBtRGF0YShkYXRhKSB7fQotCi0gICAgdWludDE2X3QgbUxlbmd0aDsKLSAgICBjb25zdCB1aW50OF90ICptRGF0YTsKLX07Ci1zdHJ1Y3QgQVZDQ29kZWNTcGVjaWZpY0NvbnRleHQgewotICAgIExpc3Q8QVZDUGFyYW1TZXQ+IG1TZXFQYXJhbVNldHM7Ci0gICAgTGlzdDxBVkNQYXJhbVNldD4gbVBpY1BhcmFtU2V0czsKLSAgICB1aW50OF90IG1Qcm9maWxlSWRjOwotICAgIHVpbnQ4X3QgbVByb2ZpbGVDb21wYXRpYmxlOwotICAgIHVpbnQ4X3QgbUxldmVsSWRjOwotfTsKLQotY29uc3QgdWludDhfdCAqcGFyc2VQYXJhbVNldChBVkNDb2RlY1NwZWNpZmljQ29udGV4dCogcEMsCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBsZW5ndGgsIGludCB0eXBlLCBzaXplX3QgKnBhcmFtU2V0TGVuKSB7Ci0gICAgQ0hFQ0sodHlwZSA9PSBrTmFsVW5pdFR5cGVTZXFQYXJhbVNldCB8fAotICAgICAgICAgIHR5cGUgPT0ga05hbFVuaXRUeXBlUGljUGFyYW1TZXQpOwotCi0gICAgc2l6ZV90IGJ5dGVzTGVmdCA9IGxlbmd0aDsKLSAgICB3aGlsZSAoYnl0ZXNMZWZ0ID4gNCAgJiYKLSAgICAgICAgICAgIG1lbWNtcCgiXHgwMFx4MDBceDAwXHgwMSIsICZkYXRhW2xlbmd0aCAtIGJ5dGVzTGVmdF0sIDQpKSB7Ci0gICAgICAgIC0tYnl0ZXNMZWZ0OwotICAgIH0KLSAgICBpZiAoYnl0ZXNMZWZ0IDw9IDQpIHsKLSAgICAgICAgYnl0ZXNMZWZ0ID0gMDsgLy8gTGFzdCBwYXJhbWV0ZXIgc2V0Ci0gICAgfQotICAgIGNvbnN0IHVpbnQ4X3QgKm5leHRTdGFydENvZGUgPSAmZGF0YVtsZW5ndGggLSBieXRlc0xlZnRdOwotICAgICpwYXJhbVNldExlbiA9IG5leHRTdGFydENvZGUgLSBkYXRhOwotICAgIGlmICgqcGFyYW1TZXRMZW4gPT0gMCkgewotICAgICAgICBBTE9HRSgiUGFyYW0gc2V0IGlzIG1hbGZvcm1lZCwgc2luY2UgaXRzIGxlbmd0aCBpcyAwIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIEFWQ1BhcmFtU2V0IHBhcmFtU2V0KCpwYXJhbVNldExlbiwgZGF0YSk7Ci0gICAgaWYgKHR5cGUgPT0ga05hbFVuaXRUeXBlU2VxUGFyYW1TZXQpIHsKLSAgICAgICAgaWYgKCpwYXJhbVNldExlbiA8IDQpIHsKLSAgICAgICAgICAgIEFMT0dFKCJTZXEgcGFyYW1ldGVyIHNldCBtYWxmb3JtZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwQy0+bVNlcVBhcmFtU2V0cy5lbXB0eSgpKSB7Ci0gICAgICAgICAgICBwQy0+bVByb2ZpbGVJZGMgPSBkYXRhWzFdOwotICAgICAgICAgICAgcEMtPm1Qcm9maWxlQ29tcGF0aWJsZSA9IGRhdGFbMl07Ci0gICAgICAgICAgICBwQy0+bUxldmVsSWRjID0gZGF0YVszXTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChwQy0+bVByb2ZpbGVJZGMgIT0gZGF0YVsxXSB8fAotICAgICAgICAgICAgICAgIHBDLT5tUHJvZmlsZUNvbXBhdGlibGUgIT0gZGF0YVsyXSB8fAotICAgICAgICAgICAgICAgIHBDLT5tTGV2ZWxJZGMgIT0gZGF0YVszXSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJJbmNvbnNpc3RlbnQgcHJvZmlsZS9sZXZlbCBmb3VuZCBpbiBzZXEgcGFyYW1ldGVyIHNldHMiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwQy0+bVNlcVBhcmFtU2V0cy5wdXNoX2JhY2socGFyYW1TZXQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBDLT5tUGljUGFyYW1TZXRzLnB1c2hfYmFjayhwYXJhbVNldCk7Ci0gICAgfQotICAgIHJldHVybiBuZXh0U3RhcnRDb2RlOwotfQotCi1zdGF0dXNfdCBidWlsZEFWQ0NvZGVjU3BlY2lmaWNEYXRhKHVpbnQ4X3QgKipwT3V0cHV0RGF0YSwgc2l6ZV90ICpwT3V0cHV0U2l6ZSwKLSAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUsIE1ldGFEYXRhICpwYXJhbSkKLXsKLSAgICAvL0FMT0dWKCJidWlsZEFWQ0NvZGVjU3BlY2lmaWNEYXRhIik7Ci0KLSAgICBpZiAoIChwT3V0cHV0RGF0YSA9PSBOVUxMKSB8fCAocE91dHB1dFNpemUgPT0gTlVMTCkgKSB7Ci0gICAgICAgIEFMT0dFKCJvdXRwdXQgaXMgaW52YWxpZCIpOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGlmICgqcE91dHB1dERhdGEgIT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiQWxyZWFkeSBoYXZlIGNvZGVjIHNwZWNpZmljIGRhdGEiKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBpZiAoc2l6ZSA8IDQpIHsKLSAgICAgICAgQUxPR0UoIkNvZGVjIHNwZWNpZmljIGRhdGEgbGVuZ3RoIHRvbyBzaG9ydDogJWQiLCBzaXplKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICAvLyBEYXRhIGlzIGluIHRoZSBmb3JtIG9mIEFWQ0NvZGVjU3BlY2lmaWNEYXRhCi0gICAgaWYgKG1lbWNtcCgiXHgwMFx4MDBceDAwXHgwMSIsIGRhdGEsIDQpKSB7Ci0gICAgICAgIC8vIDIgYnl0ZXMgZm9yIGVhY2ggb2YgdGhlIHBhcmFtZXRlciBzZXQgbGVuZ3RoIGZpZWxkCi0gICAgICAgIC8vIHBsdXMgdGhlIDcgYnl0ZXMgZm9yIHRoZSBoZWFkZXIKLSAgICAgICAgaWYgKHNpemUgPCA0ICsgNykgewotICAgICAgICAgICAgQUxPR0UoIkNvZGVjIHNwZWNpZmljIGRhdGEgbGVuZ3RoIHRvbyBzaG9ydDogJWQiLCBzaXplKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICAqcE91dHB1dFNpemUgPSBzaXplOwotICAgICAgICAqcE91dHB1dERhdGEgPSAodWludDhfdCopbWFsbG9jKHNpemUpOwotICAgICAgICBtZW1jcHkoKnBPdXRwdXREYXRhLCBkYXRhLCBzaXplKTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIEFWQ0NvZGVjU3BlY2lmaWNDb250ZXh0IGN0eDsKLSAgICB1aW50OF90ICpvdXRwdXREYXRhID0gTlVMTDsKLSAgICBzaXplX3Qgb3V0cHV0U2l6ZSA9IDA7Ci0KLSAgICAvLyBDaGVjayBpZiB0aGUgZGF0YSBpcyB2YWxpZAotICAgIHVpbnQ4X3QgdHlwZSA9IGtOYWxVbml0VHlwZVNlcVBhcmFtU2V0OwotICAgIGJvb2wgZ290U3BzID0gZmFsc2U7Ci0gICAgYm9vbCBnb3RQcHMgPSBmYWxzZTsKLSAgICBjb25zdCB1aW50OF90ICp0bXAgPSBkYXRhOwotICAgIGNvbnN0IHVpbnQ4X3QgKm5leHRTdGFydENvZGUgPSBkYXRhOwotICAgIHNpemVfdCBieXRlc0xlZnQgPSBzaXplOwotICAgIHNpemVfdCBwYXJhbVNldExlbiA9IDA7Ci0gICAgb3V0cHV0U2l6ZSA9IDA7Ci0gICAgd2hpbGUgKGJ5dGVzTGVmdCA+IDQgJiYgIW1lbWNtcCgiXHgwMFx4MDBceDAwXHgwMSIsIHRtcCwgNCkpIHsKLSAgICAgICAgdHlwZSA9ICgqKHRtcCArIDQpKSAmIDB4MUY7Ci0gICAgICAgIGlmICh0eXBlID09IGtOYWxVbml0VHlwZVNlcVBhcmFtU2V0KSB7Ci0gICAgICAgICAgICBpZiAoZ290UHBzKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIlNQUyBtdXN0IGNvbWUgYmVmb3JlIFBQUyIpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWdvdFNwcykgewotICAgICAgICAgICAgICAgIGdvdFNwcyA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuZXh0U3RhcnRDb2RlID0gcGFyc2VQYXJhbVNldCgmY3R4LCB0bXAgKyA0LCBieXRlc0xlZnQgLSA0LCB0eXBlLAotICAgICAgICAgICAgICAgICZwYXJhbVNldExlbik7Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBrTmFsVW5pdFR5cGVQaWNQYXJhbVNldCkgewotICAgICAgICAgICAgaWYgKCFnb3RTcHMpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiU1BTIG11c3QgY29tZSBiZWZvcmUgUFBTIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghZ290UHBzKSB7Ci0gICAgICAgICAgICAgICAgZ290UHBzID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5leHRTdGFydENvZGUgPSBwYXJzZVBhcmFtU2V0KCZjdHgsIHRtcCArIDQsIGJ5dGVzTGVmdCAtIDQsIHR5cGUsCi0gICAgICAgICAgICAgICAgJnBhcmFtU2V0TGVuKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJPbmx5IFNQUyBhbmQgUFBTIE5hbCB1bml0cyBhcmUgZXhwZWN0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobmV4dFN0YXJ0Q29kZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTW92ZSBvbiB0byBmaW5kIHRoZSBuZXh0IHBhcmFtZXRlciBzZXQKLSAgICAgICAgYnl0ZXNMZWZ0IC09IG5leHRTdGFydENvZGUgLSB0bXA7Ci0gICAgICAgIHRtcCA9IG5leHRTdGFydENvZGU7Ci0gICAgICAgIG91dHB1dFNpemUgKz0gKDIgKyBwYXJhbVNldExlbik7Ci0gICAgfQotCi0gICAgewotICAgICAgICAvLyBDaGVjayBvbiB0aGUgbnVtYmVyIG9mIHNlcSBwYXJhbWV0ZXIgc2V0cwotICAgICAgICBzaXplX3QgblNlcVBhcmFtU2V0cyA9IGN0eC5tU2VxUGFyYW1TZXRzLnNpemUoKTsKLSAgICAgICAgaWYgKG5TZXFQYXJhbVNldHMgPT0gMCkgewotICAgICAgICAgICAgQUxPR0UoIkNvdW5kIG5vdCBmaW5kIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQiKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoblNlcVBhcmFtU2V0cyA+IDB4MUYpIHsKLSAgICAgICAgICAgIEFMT0dFKCJUb28gbWFueSBzZXEgcGFyYW1ldGVyIHNldHMgKCVkKSBmb3VuZCIsIG5TZXFQYXJhbVNldHMpOwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHsKLSAgICAgICAgLy8gQ2hlY2sgb24gdGhlIG51bWJlciBvZiBwaWMgcGFyYW1ldGVyIHNldHMKLSAgICAgICAgc2l6ZV90IG5QaWNQYXJhbVNldHMgPSBjdHgubVBpY1BhcmFtU2V0cy5zaXplKCk7Ci0gICAgICAgIGlmIChuUGljUGFyYW1TZXRzID09IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJDb3VuZCBub3QgZmluZCBwaWN0dXJlIHBhcmFtZXRlciBzZXQiKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5QaWNQYXJhbVNldHMgPiAweEZGKSB7Ci0gICAgICAgICAgICBBTE9HRSgiVG9vIG1hbnkgcGljIHBhcmFtZXRlciBzZXRzICglZCkgZm91bmQiLCBuUGljUGFyYW1TZXRzKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBJU08gMTQ0OTYtMTU6IEFWQyBmaWxlIGZvcm1hdAotICAgIG91dHB1dFNpemUgKz0gNzsgIC8vIDcgbW9yZSBieXRlcyBpbiB0aGUgaGVhZGVyCi0gICAgb3V0cHV0RGF0YSA9ICh1aW50OF90ICopbWFsbG9jKG91dHB1dFNpemUpOwotICAgIHVpbnQ4X3QgKmhlYWRlciA9IG91dHB1dERhdGE7Ci0gICAgaGVhZGVyWzBdID0gMTsgICAgICAgICAgICAgICAgICAgICAvLyB2ZXJzaW9uCi0gICAgaGVhZGVyWzFdID0gY3R4Lm1Qcm9maWxlSWRjOyAgICAgICAgICAgLy8gcHJvZmlsZSBpbmRpY2F0aW9uCi0gICAgaGVhZGVyWzJdID0gY3R4Lm1Qcm9maWxlQ29tcGF0aWJsZTsgICAgLy8gcHJvZmlsZSBjb21wYXRpYmlsaXR5Ci0gICAgaGVhZGVyWzNdID0gY3R4Lm1MZXZlbElkYzsKLQotICAgIC8vIDYtYml0ICcxMTExMTEnIGZvbGxvd2VkIGJ5IDItYml0IHRvIGxlbmd0aFNpemVNaW51dXNPbmUKLSAgICBpbnQzMl90IHVzZTJCeXRlTmFsTGVuZ3RoID0gMDsKLSAgICBpZiAocGFyYW0gJiYKLSAgICAgICAgcGFyYW0tPmZpbmRJbnQzMihrS2V5MkJ5dGVOYWxMZW5ndGgsICZ1c2UyQnl0ZU5hbExlbmd0aCkgJiYKLSAgICAgICAgdXNlMkJ5dGVOYWxMZW5ndGgpIHsKLSAgICAgICAgaGVhZGVyWzRdID0gMHhmYyB8IDE7ICAvLyBsZW5ndGggc2l6ZSA9PSAyIGJ5dGVzCi0gICAgfSBlbHNlIHsKLSAgICAgICAgaGVhZGVyWzRdID0gMHhmYyB8IDM7ICAvLyBsZW5ndGggc2l6ZSA9PSA0IGJ5dGVzCi0gICAgfQotCi0gICAgLy8gMy1iaXQgJzExMScgZm9sbG93ZWQgYnkgNS1iaXQgbnVtU2VxdWVuY2VQYXJhbWV0ZXJTZXRzCi0gICAgaW50IG5TZXF1ZW5jZVBhcmFtU2V0cyA9IGN0eC5tU2VxUGFyYW1TZXRzLnNpemUoKTsKLSAgICBoZWFkZXJbNV0gPSAweGUwIHwgblNlcXVlbmNlUGFyYW1TZXRzOwotICAgIGhlYWRlciArPSA2OwotICAgIGZvciAoTGlzdDxBVkNQYXJhbVNldD46Oml0ZXJhdG9yIGl0ID0gY3R4Lm1TZXFQYXJhbVNldHMuYmVnaW4oKTsKLSAgICAgICAgIGl0ICE9IGN0eC5tU2VxUGFyYW1TZXRzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIC8vIDE2LWJpdCBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0IGxlbmd0aAotICAgICAgICB1aW50MTZfdCBzZXFQYXJhbVNldExlbmd0aCA9IGl0LT5tTGVuZ3RoOwotICAgICAgICBoZWFkZXJbMF0gPSBzZXFQYXJhbVNldExlbmd0aCA+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+bV9wRmN0U2V0T3B0aW9uID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfc2V0T3B0aW9uOwotICAgIHBEZWNvZGVySW50ZXJmYWNlLT5tX3BGY3REZWNvZGUgICAgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZWNvZGU7Ci0gICAgcERlY29kZXJJbnRlcmZhY2UtPm1fcEZjdFJlbmRlciAgICA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX3JlbmRlcjsKLQotICAgICpwRGVjSW50ZXJmYWNlID0gKE00T1NBX0NvbnRleHQpcERlY29kZXJJbnRlcmZhY2U7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci1leHRlcm4gIkMiIHsKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldEludGVyZmFjZV9NUEVHNCgKLSAgICAgICAgTTRERUNPREVSX1ZpZGVvVHlwZSAqcERlY29kZXJUeXBlLCBNNE9TQV9Db250ZXh0ICpwRGVjSW50ZXJmYWNlKSB7Ci0gICAgcmV0dXJuIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldEludGVyZmFjZShNNERFQ09ERVJfa1ZpZGVvVHlwZU1QRUc0LAotICAgICAgICBwRGVjb2RlclR5cGUsIHBEZWNJbnRlcmZhY2UpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0SW50ZXJmYWNlX0gyNjQoCi0gICAgICAgIE00REVDT0RFUl9WaWRlb1R5cGUgKnBEZWNvZGVyVHlwZSwgTTRPU0FfQ29udGV4dCAqcERlY0ludGVyZmFjZSkgewotICAgIHJldHVybiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRJbnRlcmZhY2UoTTRERUNPREVSX2tWaWRlb1R5cGVBVkMsCi0gICAgICAgIHBEZWNvZGVyVHlwZSwgcERlY0ludGVyZmFjZSk7Ci0KLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldFNvZnR3YXJlSW50ZXJmYWNlX01QRUc0KAotICAgICAgICBNNERFQ09ERVJfVmlkZW9UeXBlICpwRGVjb2RlclR5cGUsIE00T1NBX0NvbnRleHQgKnBEZWNJbnRlcmZhY2UpIHsKLSAgICByZXR1cm4gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0U29mdHdhcmVJbnRlcmZhY2UoTTRERUNPREVSX2tWaWRlb1R5cGVNUEVHNCwKLSAgICAgICAgcERlY29kZXJUeXBlLCBwRGVjSW50ZXJmYWNlKTsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldFNvZnR3YXJlSW50ZXJmYWNlX0gyNjQoCi0gICAgICAgIE00REVDT0RFUl9WaWRlb1R5cGUgKnBEZWNvZGVyVHlwZSwgTTRPU0FfQ29udGV4dCAqcERlY0ludGVyZmFjZSkgewotICAgIHJldHVybiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRTb2Z0d2FyZUludGVyZmFjZShNNERFQ09ERVJfa1ZpZGVvVHlwZUFWQywKLSAgICAgICAgcERlY29kZXJUeXBlLCBwRGVjSW50ZXJmYWNlKTsKLQotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0VmlkZW9EZWNvZGVyc0FuZENhcGFiaWxpdGllcygKLSAgICBNNERFQ09ERVJfVmlkZW9EZWNvZGVycyoqIGRlY29kZXJzKSB7Ci0gICAgcmV0dXJuIHF1ZXJ5VmlkZW9EZWNvZGVyQ2FwYWJpbGl0aWVzKGRlY29kZXJzKTsKLX0KLQotfSAgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvclZpZGVvRW5jb2Rlci5jcHAgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDc4NzY4MC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEzMDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlci5jcHAKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCB2aWRlbyBlbmNvZGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2RlZmluZSBMT0dfTkRFQlVHIDEKLSNkZWZpbmUgTE9HX1RBRyAiVklERU9FRElUT1JfVklERU9FTkNPREVSIgotCi0vKioqKioqKioqKioqKioqKioqKgotICogICAgIEhFQURFUlMgICAgICoKLSAqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRTWVNfQWNjZXNzVW5pdC5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JVdGlscy5oIgotI2luY2x1ZGUgIk1lZGlhQnVmZmVyUHVsbGVyLmgiCi0jaW5jbHVkZSA8STQyMENvbG9yQ29udmVydGVyLmg+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+cmFuZ2VfbGVuZ3RoKCkgKSB7Ci0gICAgICAgIC8vIEVuY29kZXIgaGFzIG5vIGRhdGEgeWV0LCBub3RoaW5nIHVudXN1YWwKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgOiBidWZmZXIgaXMgZW1wdHkiKTsKLSAgICAgICAgZ290byBjbGVhblVwOwotICAgIH0KLSAgICBWSURFT0VESVRPUl9DSEVDSygwID09ICgoTTRPU0FfVUludDMyKWJ1ZmZlci0+ZGF0YSgpKSU0LCBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKGJ1ZmZlci0+bWV0YV9kYXRhKCkuZ2V0KCksIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgaWYgKCBidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50MzIoa0tleUlzQ29kZWNDb25maWcsICZpMzJUbXApICYmIGkzMlRtcCApewotICAgICAgICB7ICAgLy8gRGlzcGxheSB0aGUgRFNJCi0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlciBEU0kgJWQiLAotICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwotICAgICAgICAgICAgdWludDhfdCogdG1wID0gKHVpbnQ4X3QqKShidWZmZXItPmRhdGEoKSk7Ci0gICAgICAgICAgICBmb3IoIHVpbnQzMl90IGk9MDsgaTxidWZmZXItPnJhbmdlX2xlbmd0aCgpOyBpKysgKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIkRTSSBbJWRdICUuMlgiLCBpLCB0bXBbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gQ2hlY2sgdGhlIENUUwotICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZpNjRUbXApLAotICAgICAgICAgICAgTTRFUlJfU1RBVEUpOwotCi0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bU5iT3V0cHV0RnJhbWVzKys7Ci0gICAgICAgIGlmICggMCA+IHBFbmNvZGVyQ29udGV4dC0+bUZpcnN0T3V0cHV0Q3RzICkgewotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tRmlyc3RPdXRwdXRDdHMgPSBpNjRUbXA7Ci0gICAgICAgIH0KLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tTGFzdE91dHB1dEN0cyA9IGk2NFRtcDsKLQotICAgICAgICBDdHMgPSAoTTRPU0FfSW50MzIpKGk2NFRtcC8xMDAwKTsKLSAgICAgICAgQUxPR1YoIltUU19DSEVDS10gVkkvRU5DIFdSSVRFIGZyYW1lICVkIEAgJWxsZCAtPiAlZCAobGFzdCAlZCkiLAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tTmJPdXRwdXRGcmFtZXMsIGk2NFRtcCwgQ3RzLAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tTGFzdENUUyk7Ci0gICAgICAgIGlmICggQ3RzIDwgcEVuY29kZXJDb250ZXh0LT5tTGFzdENUUyApIHsKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VuY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlciBXQVJOSU5HIDogQ3RzIGlzIGdvaW5nICIKLSAgICAgICAgICAgICJiYWNrd2FyZHMgJWQgPCAlZCIsIEN0cywgcEVuY29kZXJDb250ZXh0LT5tTGFzdENUUyk7Ci0gICAgICAgICAgICBnb3RvIGNsZWFuVXA7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgOiAlZCAlZCIsCi0gICAgICAgICAgICBDdHMsIHBFbmNvZGVyQ29udGV4dC0+bUxhc3RDVFMpOwotCi0gICAgICAgIC8vIFJldHJpZXZlIHRoZSBBVSBjb250YWluZXIKLSAgICAgICAgZXJyID0gcEVuY29kZXJDb250ZXh0LT5tV3JpdGVyRGF0YUludGVyZmFjZS0+cFN0YXJ0QVUoCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1Xcml0ZXJEYXRhSW50ZXJmYWNlLT5wV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPnN0cmVhbS0+c3RyZWFtSUQsCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0KTsKLSAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0KLSAgICAgICAgLy8gRm9ybWF0IHRoZSBBVQotICAgICAgICBWSURFT0VESVRPUl9DSEVDSygKLSAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPD0gcEVuY29kZXJDb250ZXh0LT5tQWNjZXNzVW5pdC0+c2l6ZSwKLSAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgIC8vIFJlbW92ZSBIMjY0IEFVIHN0YXJ0IGNvZGUKLSAgICAgICAgaWYgKCBNNEVOQ09ERVJfa0gyNjQgPT0gcEVuY29kZXJDb250ZXh0LT5tRm9ybWF0ICkgewotICAgICAgICAgICAgaWYgKCFtZW1jbXAoKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIFwKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwgIlx4MDBceDAwXHgwMFx4MDEiLCA0KSApIHsKLSAgICAgICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZShidWZmZXItPnJhbmdlX29mZnNldCgpICsgNCwKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSAtIDQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCAoTTRFTkNPREVSX2tIMjY0ID09IHBFbmNvZGVyQ29udGV4dC0+bUZvcm1hdCkgJiYKLSAgICAgICAgICAgIChNNE9TQV9OVUxMICE9IHBFbmNvZGVyQ29udGV4dC0+bUgyNjROQUxVUG9zdFByb2Nlc3NGY3QpICkgewotICAgICAgICAvLyBIMjY0IHRyaW1taW5nIGNhc2UsIE5BTFUgcG9zdCBwcm9jZXNzaW5nIGlzIG5lZWRlZAotICAgICAgICBNNE9TQV9JbnQzMiBvdXRwdXRTaXplID0gcEVuY29kZXJDb250ZXh0LT5tQWNjZXNzVW5pdC0+c2l6ZTsKLSAgICAgICAgZXJyID0gcEVuY29kZXJDb250ZXh0LT5tSDI2NE5BTFVQb3N0UHJvY2Vzc0ZjdCgKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUgyNjROQUxVUG9zdFByb2Nlc3NDdHgsCi0gICAgICAgICAgICAoTTRPU0FfVUludDgqKWJ1ZmZlci0+ZGF0YSgpK2J1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCi0gICAgICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpLAotICAgICAgICAgICAgKE00T1NBX1VJbnQ4KilwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0LT5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICZvdXRwdXRTaXplKTsKLSAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPnNpemUgPSAoTTRPU0FfVUludDMyKW91dHB1dFNpemU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUaGUgQVUgY2FuIGp1c3QgYmUgY29waWVkCi0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0LT5cCi0gICAgICAgICAgICAgICAgZGF0YUFkZHJlc3MsICh2b2lkICopKChNNE9TQV9NZW1BZGRyOCkoYnVmZmVyLT5kYXRhKCkpK2J1ZmZlci0+XAotICAgICAgICAgICAgICAgIHJhbmdlX29mZnNldCgpKSwgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7Ci0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0LT5zaXplID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKWJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIGJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQzMihrS2V5SXNTeW5jRnJhbWUsJmkzMlRtcCkgJiYgaTMyVG1wKXsKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPmF0dHJpYnV0ZSA9IEFVX1JBUDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPmF0dHJpYnV0ZSA9IEFVX1BfRnJhbWU7Ci0gICAgICAgIH0KLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tTGFzdENUUyA9IEN0czsKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tQWNjZXNzVW5pdC0+Q1RTID0gQ3RzOwotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0LT5EVFMgPSBDdHM7Ci0KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXI6IEFVIEAgMHglWCAweCVYICVkICVkIiwKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgKnBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tQWNjZXNzVW5pdC0+c2l6ZSwKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPkNUUyk7Ci0KLSAgICAgICAgLy8gV3JpdGUgdGhlIEFVCi0gICAgICAgIGVyciA9IHBFbmNvZGVyQ29udGV4dC0+bVdyaXRlckRhdGFJbnRlcmZhY2UtPnBQcm9jZXNzQVUoCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1Xcml0ZXJEYXRhSW50ZXJmYWNlLT5wV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPnN0cmVhbS0+c3RyZWFtSUQsCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0KTsKLSAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0gICAgfQotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBTQUZFX0ZSRUUocEVuY29kZXJDb250ZXh0LT5tSGVhZGVyLnBCdWYpOwotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1IZWFkZXIuU2l6ZSA9IDA7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlciBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZW5jb2RlKE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcEluUGxhbmUsIE00T1NBX0RvdWJsZSBDdHMsCi0gICAgICAgIE00RU5DT0RFUl9GcmFtZU1vZGUgRnJhbWVNb2RlKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBPSzsKLSAgICBNZWRpYUJ1ZmZlciogb3V0cHV0QnVmZmVyID0gTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9lbmNvZGUgMHglWCAlZiAlZCIsIHBJblBsYW5lLCBDdHMsIEZyYW1lTW9kZSk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIHBFbmNvZGVyQ29udGV4dCA9IChWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLSAgICBpZiAoIFNUQVJURUQgPT0gcEVuY29kZXJDb250ZXh0LT5tU3RhdGUgKSB7Ci0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlID0gQlVGRkVSSU5HOwotICAgIH0KLSAgICBWSURFT0VESVRPUl9DSEVDSygKLSAgICAgICAgKEJVRkZFUklORyB8IFJFQURJTkcpICYgcEVuY29kZXJDb250ZXh0LT5tU3RhdGUsIE00RVJSX1NUQVRFKTsKLQotICAgIHBFbmNvZGVyQ29udGV4dC0+bU5iSW5wdXRGcmFtZXMrKzsKLSAgICBpZiAoIDAgPiBwRW5jb2RlckNvbnRleHQtPm1GaXJzdElucHV0Q3RzICkgewotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1GaXJzdElucHV0Q3RzID0gQ3RzOwotICAgIH0KLSAgICBwRW5jb2RlckNvbnRleHQtPm1MYXN0SW5wdXRDdHMgPSBDdHM7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZW5jb2RlIDB4JVggJWQgJWYgKCVkKSIsIHBJblBsYW5lLCBGcmFtZU1vZGUsCi0gICAgICAgIEN0cywgcEVuY29kZXJDb250ZXh0LT5tTGFzdENUUyk7Ci0KLSAgICAvLyBQdXNoIHRoZSBpbnB1dCBidWZmZXIgdG8gdGhlIGVuY29kZXIgc291cmNlCi0gICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc0lucHV0QnVmZmVyKHBFbmNvZGVyQ29udGV4dCwgQ3RzLAotICAgICAgICBNNE9TQV9GQUxTRSk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0KLSAgICAvLyBOb3RpZnkgdGhlIHNvdXJjZSBpbiBjYXNlIG9mIEVPUwotICAgIGlmICggTTRFTkNPREVSX2tMYXN0RnJhbWUgPT0gRnJhbWVNb2RlICkgewotICAgICAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIoCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQsIDAsIE00T1NBX1RSVUUpOwotICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLSAgICB9Ci0KLSAgICBpZiAoIEJVRkZFUklORyA9PSBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSApIHsKLSAgICAgICAgLy8gUHJlZmV0Y2ggaXMgY29tcGxldGUsIHN0YXJ0IHJlYWRpbmcKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tU3RhdGUgPSBSRUFESU5HOwotICAgIH0KLSAgICAvLyBSZWFkCi0gICAgd2hpbGUgKDEpICB7Ci0gICAgICAgIE1lZGlhQnVmZmVyICpvdXRwdXRCdWZmZXIgPQotICAgICAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bVB1bGxlci0+Z2V0QnVmZmVyTm9uQmxvY2tpbmcoKTsKLQotICAgICAgICBpZiAob3V0cHV0QnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIGludDMyX3QgWVVWQnVmZmVyTnVtYmVyID0KLSAgICAgICAgICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tRW5jb2RlclNvdXJjZS0+Z2V0TnVtYmVyT2ZCdWZmZXJzSW5RdWV1ZSgpOwotICAgICAgICAgICAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIGNvbmZpZ3VyZWQgbWF4aW11bSBudW1iZXIgb2YgcHJlZmV0Y2ggWVVWIGZyYW1lcyBpcwotICAgICAgICAgICAgICogbm90IGV4Y2VlZGVkLiBUaGlzIGlzIHRvIGxpbWl0IHRoZSBhbW91bnQgb2YgbWVtb3J5IHVzYWdlIG9mIHZpZGVvIGVkaXRvciBlbmdpbmUuCi0gICAgICAgICAgICAgKiBUaGUgdmFsdWUgb2YgbWF4aW11bSBwcmVmZXRjaCBZdXYgZnJhbWVzIGlzIGRlZmluZWQgaW4gbWVkaWFfcHJvZmlsZXMueG1sICovCi0gICAgICAgICAgICBpZiAoKFlVVkJ1ZmZlck51bWJlciA8IHBFbmNvZGVyQ29udGV4dC0+bU1heFByZWZldGNoRnJhbWVzKSB8fAotICAgICAgICAgICAgICAgIChwRW5jb2RlckNvbnRleHQtPm1QdWxsZXItPmhhc01lZGlhU291cmNlUmV0dXJuZWRFcnJvcigpCi0gICAgICAgICAgICAgICAgICAgID09IHRydWUpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBQcm92aWRlIHRoZSBlbmNvZGVkIEFVIHRvIHRoZSB3cml0ZXIKLSAgICAgICAgICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIocEVuY29kZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlcik7Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLQotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tUHVsbGVyLT5wdXRCdWZmZXIob3V0cHV0QnVmZmVyKTsKLSAgICAgICAgfQotICAgIH0KLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9lbmNvZGUgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZW5jb2RlIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZW5jb2RlIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zdGFydChNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCkgewotICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgICAgIGVyciAgICAgICAgICAgICA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICAgICByZXN1bHQgICAgICAgICAgPSBPSzsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zdGFydCBiZWdpbiIpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgcEVuY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotICAgIFZJREVPRURJVE9SX0NIRUNLKE9QRU5FRCA9PSBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSwgTTRFUlJfU1RBVEUpOwotCi0gICAgcEVuY29kZXJDb250ZXh0LT5tTmJJbnB1dEZyYW1lcyAgPSAwOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUZpcnN0SW5wdXRDdHMgID0gLTEuMDsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1MYXN0SW5wdXRDdHMgICA9IC0xLjA7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tTmJPdXRwdXRGcmFtZXMgPSAwOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUZpcnN0T3V0cHV0Q3RzID0gLTE7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tTGFzdE91dHB1dEN0cyAgPSAtMTsKLQotICAgIHJlc3VsdCA9IHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXItPnN0YXJ0KCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soT0sgPT0gcmVzdWx0LCBNNEVSUl9TVEFURSk7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQtPm1QdWxsZXItPnN0YXJ0KCk7Ci0KLSAgICAvLyBTZXQgdGhlIG5ldyBzdGF0ZQotICAgIHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlID0gU1RBUlRFRDsKLQotY2xlYW5VcDoKLSAgICBpZiAoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc3RhcnQgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc3RhcnQgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zdGFydCBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc3RvcChNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgTWVkaWFCdWZmZXIqIG91dHB1dEJ1ZmZlciA9IE5VTEw7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gT0s7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc3RvcCBiZWdpbiIpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotICAgIHBFbmNvZGVyQ29udGV4dCA9IChWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLQotICAgIC8vIFNlbmQgRU9TIGFnYWluIHRvIG1ha2Ugc3VyZSB0aGUgc291cmNlIGRvZXNuJ3QgYmxvY2suCi0gICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc0lucHV0QnVmZmVyKHBFbmNvZGVyQ29udGV4dCwgMCwKLSAgICAgICAgTTRPU0FfVFJVRSk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0KLSAgICAvLyBQcm9jZXNzIHRoZSByZW1haW5pbmcgYnVmZmVycyBpZiBuZWNlc3NhcnkKLSAgICBpZiAoIChCVUZGRVJJTkcgfCBSRUFESU5HKSAmIHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlICkgewotICAgICAgICB3aGlsZSAoMSkgIHsKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyICpvdXRwdXRCdWZmZXIgPQotICAgICAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bVB1bGxlci0+Z2V0QnVmZmVyQmxvY2tpbmcoKTsKLQotICAgICAgICAgICAgaWYgKG91dHB1dEJ1ZmZlciA9PSBOVUxMKSBicmVhazsKLQotICAgICAgICAgICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlcigKLSAgICAgICAgICAgICAgICBwRW5jb2RlckNvbnRleHQsIG91dHB1dEJ1ZmZlcik7Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLQotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tUHVsbGVyLT5wdXRCdWZmZXIob3V0cHV0QnVmZmVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlID0gU1RBUlRFRDsKLSAgICB9Ci0KLSAgICAvLyBTdG9wIHRoZSBncmFwaCBtb2R1bGUgaWYgbmVjZXNzYXJ5Ci0gICAgaWYgKCBTVEFSVEVEID09IHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlICkgewotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1QdWxsZXItPnN0b3AoKTsKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tRW5jb2Rlci0+c3RvcCgpOwotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSA9IE9QRU5FRDsKLSAgICB9Ci0KLSAgICBpZiAocEVuY29kZXJDb250ZXh0LT5tTmJJbnB1dEZyYW1lcyAhPSBwRW5jb2RlckNvbnRleHQtPm1OYk91dHB1dEZyYW1lcykgewotICAgICAgICBBTE9HVygiU29tZSBmcmFtZXMgd2VyZSBub3QgZW5jb2RlZDogaW5wdXQoJWQpICE9IG91dHB1dCglZCkiLAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tTmJJbnB1dEZyYW1lcywgcEVuY29kZXJDb250ZXh0LT5tTmJPdXRwdXRGcmFtZXMpOwotICAgIH0KLQotY2xlYW5VcDoKLSAgICBpZiAoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc3RvcCBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zdG9wIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc3RvcCBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcmVndWxCaXRSYXRlKE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0KSB7Ci0gICAgQUxPR1coInJlZ3VsQml0UmF0ZSBpcyBub3QgaW1wbGVtZW50ZWQiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3NldE9wdGlvbihNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgTTRPU0FfVUludDMyIG9wdGlvbklELCBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zZXRPcHRpb24gc3RhcnQgb3B0aW9uSUQgMHglWCIsIG9wdGlvbklEKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIHBFbmNvZGVyQ29udGV4dCA9IChWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLQotICAgIHN3aXRjaCggb3B0aW9uSUQgKSB7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tPcHRpb25JRF9TZXRIMjY0UHJvY2Vzc05BTFVmY3RzUHRyOgotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tSDI2NE5BTFVQb3N0UHJvY2Vzc0ZjdCA9Ci0gICAgICAgICAgICAgICAgKEgyNjRNQ1NfUHJvY2Vzc0VuY29kZWROQUxVX2ZjdCopb3B0aW9uVmFsdWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa09wdGlvbklEX0gyNjRQcm9jZXNzTkFMVUNvbnRleHQ6Ci0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1IMjY0TkFMVVBvc3RQcm9jZXNzQ3R4ID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfQ29udGV4dClvcHRpb25WYWx1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3NldE9wdGlvbjogdW5zdXBwb3J0ZWQgb3B0aW9uSWQgMHglWCIsCi0gICAgICAgICAgICAgICAgb3B0aW9uSUQpOwotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfRkFMU0UsIE00RVJSX0JBRF9PUFRJT05fSUQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi1jbGVhblVwOgotICAgIGlmICggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zZXRPcHRpb24gbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc2V0T3B0aW9uIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc2V0T3B0aW9uIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRPcHRpb24oTTRFTkNPREVSX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgIE00T1NBX1VJbnQzMiBvcHRpb25JRCwgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0T3B0aW9uIGJlZ2luIG9wdGluSWQgMHglWCIsIG9wdGlvbklEKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBzd2l0Y2goIG9wdGlvbklEICkgewotICAgICAgICBjYXNlIE00RU5DT0RFUl9rT3B0aW9uSURfRW5jb2RlckhlYWRlcjoKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKAotICAgICAgICAgICAgICAgICAgICBNNE9TQV9OVUxMICE9IHBFbmNvZGVyQ29udGV4dC0+bUhlYWRlci5wQnVmLCBNNEVSUl9TVEFURSk7Ci0gICAgICAgICAgICAqKE00RU5DT0RFUl9IZWFkZXIqKilvcHRpb25WYWx1ZSA9ICYocEVuY29kZXJDb250ZXh0LT5tSGVhZGVyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldE9wdGlvbjogdW5zdXBwb3J0ZWQgb3B0aW9uSWQgMHglWCIsCi0gICAgICAgICAgICAgICAgb3B0aW9uSUQpOwotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfRkFMU0UsIE00RVJSX0JBRF9PUFRJT05fSUQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi1jbGVhblVwOgotICAgIGlmICggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRPcHRpb24gbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0T3B0aW9uIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlKE00RU5DT0RFUl9Gb3JtYXQgZm9ybWF0LAotICAgICAgICBNNEVOQ09ERVJfRm9ybWF0KiBwRm9ybWF0LAotICAgICAgICBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlKiogcEVuY29kZXJJbnRlcmZhY2UsIE00RU5DT0RFUl9PcGVuTW9kZSBtb2RlKXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBGb3JtYXQsICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcEVuY29kZXJJbnRlcmZhY2UsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlIGJlZ2luIDB4JXggMHgleCAlZCIsIHBGb3JtYXQsCi0gICAgICAgIHBFbmNvZGVySW50ZXJmYWNlLCBtb2RlKTsKLQotICAgIFNBRkVfTUFMTE9DKCpwRW5jb2RlckludGVyZmFjZSwgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSwgMSwKLSAgICAgICAgIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyIik7Ci0KLSAgICAqcEZvcm1hdCA9IGZvcm1hdDsKLQotICAgIHN3aXRjaCggZm9ybWF0ICkgewotICAgICAgICBjYXNlIE00RU5DT0RFUl9rSDI2MzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdEluaXQgPQotICAgICAgICAgICAgICAgICAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9pbml0X0gyNjM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tNUEVHNDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdEluaXQgPQotICAgICAgICAgICAgICAgICAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9pbml0X01QRUc0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE00RU5DT0RFUl9rSDI2NDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdEluaXQgPQotICAgICAgICAgICAgICAgICAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9pbml0X0gyNjQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlIDogdW5zdXBwb3J0ZWQgZm9ybWF0ICVkIiwKLSAgICAgICAgICAgICAgICBmb3JtYXQpOwotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfRkFMU0UsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdE9wZW4gICAgICAgICA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX29wZW47Ci0gICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RTdGFydCAgICAgICAgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zdGFydDsKLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdFN0b3AgICAgICAgICA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3N0b3A7Ci0gICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RQYXVzZSAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgICgqcEVuY29kZXJJbnRlcmZhY2UpLT5wRmN0UmVzdW1lICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdENsb3NlICAgICAgICA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2Nsb3NlOwotICAgICgqcEVuY29kZXJJbnRlcmZhY2UpLT5wRmN0Q2xlYW51cCAgICAgID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfY2xlYW51cDsKLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdFJlZ3VsQml0UmF0ZSA9Ci0gICAgICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3JlZ3VsQml0UmF0ZTsKLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdEVuY29kZSAgICAgICA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2VuY29kZTsKLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdFNldE9wdGlvbiAgICA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3NldE9wdGlvbjsKLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdEdldE9wdGlvbiAgICA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldE9wdGlvbjsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2Ugbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICAqcEVuY29kZXJJbnRlcmZhY2UgPSBNNE9TQV9OVUxMOwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi1leHRlcm4gIkMiIHsKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZV9IMjYzKE00RU5DT0RFUl9Gb3JtYXQqIHBGb3JtYXQsCi0gICAgICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UqKiBwRW5jb2RlckludGVyZmFjZSwgTTRFTkNPREVSX09wZW5Nb2RlIG1vZGUpewotICAgIHJldHVybiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2UoTTRFTkNPREVSX2tIMjYzLCBwRm9ybWF0LAotICAgICAgICAgICAgcEVuY29kZXJJbnRlcmZhY2UsIG1vZGUpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX01QRUc0KE00RU5DT0RFUl9Gb3JtYXQqIHBGb3JtYXQsCi0gICAgICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UqKiBwRW5jb2RlckludGVyZmFjZSwgTTRFTkNPREVSX09wZW5Nb2RlIG1vZGUpewotICAgIHJldHVybiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2UoTTRFTkNPREVSX2tNUEVHNCwgcEZvcm1hdCwKLSAgICAgICAgICAgcEVuY29kZXJJbnRlcmZhY2UsIG1vZGUpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0gyNjQoTTRFTkNPREVSX0Zvcm1hdCogcEZvcm1hdCwKLSAgICAgICAgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSoqIHBFbmNvZGVySW50ZXJmYWNlLCBNNEVOQ09ERVJfT3Blbk1vZGUgbW9kZSl7Ci0gICAgcmV0dXJuIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZShNNEVOQ09ERVJfa0gyNjQsIHBGb3JtYXQsCi0gICAgICAgICAgIHBFbmNvZGVySW50ZXJmYWNlLCBtb2RlKTsKLQotfQotCi19ICAvLyBleHRlcm4gIkMiCi0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9BbmRyb2lkLm1rIGIvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTJkMjExMS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0jaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLSNpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCi1pbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9BbmRyb2lkLm1rIGIvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg1YTUzMGMuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotIwotIyBsaWJ2aWRlb2ZpbHRlcnMKLSMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRTo9IGxpYnZpZGVvZWRpdG9yX3ZpZGVvZmlsdGVycwotCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICBcCi0gICAgICBNNFZJRklfQkdSNTY1dG9ZVVY0MjAuYyBcCi0gICAgICBNNFZJRklfUmVzaXplUkdCODg4dG9SR0I4ODguYyBcCi0gICAgICBNNFZJRklfUmVzaXplUkdCNTY1dG9SR0I1NjUuYyBcCi0gICAgICBNNFZJRklfQ2xpcC5jIFwKLSAgICAgIE00VklGSV9SZXNpemVZVVZ0b0JHUjU2NS5jIFwKLSAgICAgIE00VklGSV9SR0I4ODh0b1lVVjQyMC5jIFwKLSAgICAgIE00VklGSV9SR0I1NjV0b1lVVjQyMC5jIFwKLSAgICAgIE00VkZMX3RyYW5zaXRpb24uYwotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJjdXRpbHMgXAotICAgIGxpYnV0aWxzIFwKLSAgICBsaWJ2aWRlb2VkaXRvcl9vc2FsIFwKLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKLQotIyBBbGwgb2YgdGhlIHNoYXJlZCBsaWJyYXJpZXMgd2UgbGluayBhZ2FpbnN0LgotTE9DQUxfTERMSUJTIDo9IFwKLSAgICAtbHB0aHJlYWQgLWxkbAotCi1MT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWRkxfdHJhbnNpdGlvbi5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VkZMX3RyYW5zaXRpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmE1ZTBiNi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWRkxfdHJhbnNpdGlvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgTTRUUkFOX3RyYW5zaXRpb24uYwotICogQGJyaWVmCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKioKLSAqIE9TQUwgKG1lbXNldCBhbmQgbWVtY3B5KSAqKiovCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0KLSNpbmNsdWRlICJNNFZGTF90cmFuc2l0aW9uLmgiCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2lmZGVmIExJVFRMRV9FTkRJQU4KLSNkZWZpbmUgTTRWRkxfU1dBUF9TSE9SVChhKSBhID0gKChhICYgMHhGRikgPDwgOCkgfCAoKGEgJiAweEZGMDApID4+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+IDE2KSAqICh1MzJfc3RyaWRlX2luW1ZQbGFuZV0pOwotICAgICAgICAgICAgdTMyX3lfYWNjdW1fVSAmPSAweGZmZmY7Ci0gICAgICAgIH0KLQotICAgICAgICBwdTMyX3JnYl9kYXRhX3N0YXJ0ICs9IHUzMl9zdHJpZGVfb3V0OwotCi0gICAgfSAgIC8qIEVuZCBvZiB2ZXJ0aWNhbCBzY2FubmluZyAqLwotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL05PVElDRSBiL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9OT1RJQ0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YjFlZmEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0KLSAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29tbW9uX3RpbWUvdXRpbHMuY3BwIGIvbWVkaWEvY29tbW9uX3RpbWUvdXRpbHMuY3BwCmluZGV4IDY1MzkxNzEuLjkxY2YyZmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvbW1vbl90aW1lL3V0aWxzLmNwcAorKysgYi9tZWRpYS9jb21tb25fdGltZS91dGlscy5jcHAKQEAgLTU5LDcgKzU5LDcgQEAKIH0KIAogdm9pZCBkZXNlcmlhbGl6ZVNvY2thZGRyKGNvbnN0IFBhcmNlbCogcCwgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UqIGFkZHIpIHsKLSAgICBtZW1zZXQoYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKKyAgICBtZW1zZXQoYWRkciwgMCwgc2l6ZW9mKCphZGRyKSk7CiAKICAgICBhZGRyLT5zc19mYW1pbHkgPSBwLT5yZWFkSW50MzIoKTsKICAgICBzd2l0Y2goYWRkci0+c3NfZmFtaWx5KSB7CmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvQW5kcm9pZC5tayBiL21lZGlhL2ltZ191dGlscy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZDAwYmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE1IEBACisjIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2luY2x1ZGUgJChjYWxsIGFsbC1zdWJkaXItbWFrZWZpbGVzKQpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0J5dGVBcnJheU91dHB1dC5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0J5dGVBcnJheU91dHB1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNzM5NzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvQnl0ZUFycmF5T3V0cHV0LmgKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTUdfVVRJTFNfQllURV9BUlJBWV9PVVRQVVRfSAorI2RlZmluZSBJTUdfVVRJTFNfQllURV9BUlJBWV9PVVRQVVRfSAorCisjaW5jbHVkZSA8aW1nX3V0aWxzL091dHB1dC5oPgorCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyB0aGF0IGFjY3VtdWxhdGVzIHdyaXR0ZW4gYnl0ZXMgaW50byBhIGJ1ZmZlci4KKyAqLworY2xhc3MgQU5EUk9JRF9BUEkgQnl0ZUFycmF5T3V0cHV0IDogcHVibGljIE91dHB1dCB7CisgICAgcHVibGljOgorCisgICAgICAgIEJ5dGVBcnJheU91dHB1dCgpOworCisgICAgICAgIHZpcnR1YWwgfkJ5dGVBcnJheU91dHB1dCgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBPcGVuIHRoaXMgQnl0ZUFycmF5T3V0cHV0LgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbigpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBXcml0ZSBieXRlcyBmcm9tIHRoZSBnaXZlbiBidWZmZXIuICBUaGUgbnVtYmVyIG9mIGJ5dGVzIGdpdmVuIGluIHRoZSBjb3VudAorICAgICAgICAgKiBhcmd1bWVudCB3aWxsIGJlIHdyaXR0ZW4uICBCeXRlcyB3aWxsIGJlIHdyaXR0ZW4gZnJvbSB0aGUgZ2l2ZW4gYnVmZmVyIHN0YXJ0aW5nCisgICAgICAgICAqIGF0IHRoZSBpbmRleCBnaXZlbiBpbiB0aGUgb2Zmc2V0IGFyZ3VtZW50LgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDbG9zZSB0aGlzIEJ5dGVBcnJheU91dHB1dC4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBjdXJyZW50IHNpemUgb2YgdGhlIGFycmF5IG9mIGJ5dGVzIHdyaXR0ZW4uCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHNpemVfdCBnZXRTaXplKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBwb2ludGVyIHRvIGFycmF5IG9mIGJ5dGVzIHdyaXR0ZW4uICBJdCBpcyBub3QgdmFsaWQgdG8gdXNlIHRoaXMgcG9pbnRlciBpZgorICAgICAgICAgKiBvcGVuLCB3cml0ZSwgb3IgY2xvc2UgaXMgY2FsbGVkIGFmdGVyIHRoaXMgbWV0aG9kLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBjb25zdCB1aW50OF90KiBnZXRBcnJheSgpIGNvbnN0OworCisgICAgcHJvdGVjdGVkOgorICAgICAgICBWZWN0b3I8dWludDhfdD4gbUJ5dGVBcnJheTsKK307CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCisKKyNlbmRpZiAvKklNR19VVElMU19CWVRFX0FSUkFZX09VVFBVVF9IKi8KZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9EbmdVdGlscy5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0RuZ1V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM4OWIwMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9EbmdVdGlscy5oCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElNR19VVElMU19ETkdfVVRJTFNfSAorI2RlZmluZSBJTUdfVVRJTFNfRE5HX1VUSUxTX0gKKworI2luY2x1ZGUgPGltZ191dGlscy9CeXRlQXJyYXlPdXRwdXQuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvRW5kaWFuVXRpbHMuaD4KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworI2RlZmluZSBORUxFTVMoeCkgKChpbnQpIChzaXplb2YoeCkgLyBzaXplb2YoKHgpWzBdKSkpCisKKy8qKgorICogVXRpbGl0eSBjbGFzcyBmb3IgYnVpbGRpbmcgdmFsdWVzIGZvciB0aGUgT3Bjb2RlTGlzdCB0YWdzIHNwZWNpZmllZAorICogaW4gdGhlIEFkb2JlIERORyAxLjQgc3BlYy4KKyAqLworY2xhc3MgQU5EUk9JRF9BUEkgT3Bjb2RlTGlzdEJ1aWxkZXIgOiBwdWJsaWMgTGlnaHRSZWZCYXNlPE9wY29kZUxpc3RCdWlsZGVyPiB7CisgICAgcHVibGljOgorICAgICAgICBlbnVtIENmYUxheW91dCB7CisgICAgICAgICAgICBDRkFfUkdHQiA9IDAsCisgICAgICAgICAgICBDRkFfR1JCRywKKyAgICAgICAgICAgIENGQV9HQlJHLAorICAgICAgICAgICAgQ0ZBX0JHR1IsCisgICAgICAgIH07CisKKyAgICAgICAgT3Bjb2RlTGlzdEJ1aWxkZXIoKTsKKyAgICAgICAgdmlydHVhbCB+T3Bjb2RlTGlzdEJ1aWxkZXIoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSB0b3RhbCBzaXplIG9mIHRoaXMgb3Bjb2RlIGxpc3QgaW4gYnl0ZXMuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHNpemVfdCBnZXRTaXplKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgbnVtYmVyIG9mIG9wY29kZXMgZGVmaW5lZCBpbiB0aGlzIGxpc3QuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldENvdW50KCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdyaXRlIHRoZSBvcGNvZGUgbGlzdCBpbnRvIHRoZSBnaXZlbiBidWZmZXIuICBUaGlzIGJ1ZmZlcgorICAgICAgICAgKiBtdXN0IGJlIGFibGUgdG8gaG9sZCBhdCBsZWFzdCBhcyBtYW55IGVsZW1lbnRzIGFzIHJldHVybmVkCisgICAgICAgICAqIGJ5IGNhbGxpbmcgdGhlIGdldFNpemUoKSBtZXRob2QuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBidWlsZE9wTGlzdCgvKm91dCovIHVpbnQ4X3QqIGJ1ZikgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBHYWluTWFwIG9wY29kZShzKSBmb3IgdGhlIGdpdmVuIG1ldGFkYXRhIHBhcmFtZXRlcnMuICBUaGUgZ2l2ZW4KKyAgICAgICAgICogQ0ZBIGxheW91dCBtdXN0IG1hdGNoIHRoZSBsYXlvdXQgb2YgdGhlIHNoYWRpbmcgbWFwIHBhc3NlZCBpbnRvIHRoZQorICAgICAgICAgKiBsZW5zU2hhZGluZ01hcCBwYXJhbWV0ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRHYWluTWFwc0Zvck1ldGFkYXRhKHVpbnQzMl90IGxzbVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbHNtSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlQXJlYVRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlQXJlYUJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFSaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENmYUxheW91dCBjZmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogbGVuc1NoYWRpbmdNYXApOworCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBhIEdhaW5NYXAgb3Bjb2RlIHdpdGggdGhlIGdpdmVuIGZpZWxkcy4gIFRoZSBtYXBHYWlucyBhcnJheQorICAgICAgICAgKiBtdXN0IGhhdmUgbWFwUG9pbnRzViAqIG1hcFBvaW50c0ggKiBtYXBQbGFuZXMgZWxlbWVudHMuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRHYWluTWFwKHVpbnQzMl90IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBsYW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGxhbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgcm93UGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2xQaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1hcFBvaW50c1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXBQb2ludHNILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG1hcFNwYWNpbmdWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG1hcFNwYWNpbmdILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG1hcE9yaWdpblYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgbWFwT3JpZ2luSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1hcFBsYW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBtYXBHYWlucyk7CisKKyAgICAgICAgLy8gVE9ETzogQWRkIG90aGVyIE9wY29kZSBtZXRob2RzCisgICAgcHJvdGVjdGVkOgorICAgICAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgRkxBR19PUFRJT05BTCA9IDB4MXU7CisgICAgICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBGTEFHX09QVElPTkFMX0ZPUl9QUkVWSUVXID0gMHgydTsKKworICAgICAgICBlbnVtIHsKKyAgICAgICAgICAgIEdBSU5fTUFQX0lEID0gOSwKKyAgICAgICAgICAgIExTTV9SX0lORCA9IDAsCisgICAgICAgICAgICBMU01fR0VfSU5EID0gMSwKKyAgICAgICAgICAgIExTTV9HT19JTkQgPSAyLAorICAgICAgICAgICAgTFNNX0JfSU5EID0gMywKKyAgICAgICAgfTsKKworICAgICAgICB1aW50MzJfdCBtQ291bnQ7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dCBtT3BMaXN0OworICAgICAgICBFbmRpYW5PdXRwdXQgbUVuZGlhbk91dDsKKworfTsKKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KKworI2VuZGlmIC8qSU1HX1VUSUxTX0ROR19VVElMU19IKi8KZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9FbmRpYW5VdGlscy5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0VuZGlhblV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk5YmUxYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9FbmRpYW5VdGlscy5oCkBAIC0wLDAgKzEsMjUwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElNR19VVElMU19FTkRJQU5fVVRJTFMKKyNkZWZpbmUgSU1HX1VUSUxTX0VORElBTl9VVElMUworCisjaW5jbHVkZSA8aW1nX3V0aWxzL091dHB1dC5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8ZW5kaWFuLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCisvKioKKyAqIEVuZGlhbm5lc3MgdHlwZXMgc3VwcG9ydGVkLgorICovCitlbnVtIEFORFJPSURfQVBJIEVuZGlhbm5lc3MgeworICAgIFVOREVGSU5FRF9FTkRJQU4sIC8vIERlZmF1bHQgZW5kaWFubmVzcyB3aWxsIGJlIHVzZWQuCisgICAgQklHLAorICAgIExJVFRMRQorfTsKKworLyoqCisgKiBDb252ZXJ0IGZyb20gdGhlIG5hdGl2ZSBkZXZpY2UgZW5kaWFubmVzcyB0byBiaWcgZW5kaWFuLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorVCBjb252ZXJ0VG9CaWdFbmRpYW4oVCBpbik7CisKKy8qKgorICogQ29udmVydCBmcm9tIHRoZSBuYXRpdmUgZGV2aWNlIGVuZGlhbm5lc3MgdG8gbGl0dGxlIGVuZGlhbi4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK1QgY29udmVydFRvTGl0dGxlRW5kaWFuKFQgaW4pOworCisvKioKKyAqIEEgdXRpbGl0eSBjbGFzcyBmb3Igd3JpdGluZyB0byBhbiBPdXRwdXQgd2l0aCB0aGUgZ2l2ZW4gZW5kaWFubmVzcy4KKyAqLworY2xhc3MgQU5EUk9JRF9BUEkgRW5kaWFuT3V0cHV0IDogcHVibGljIE91dHB1dCB7CisgICAgcHVibGljOgorICAgICAgICAvKioKKyAgICAgICAgICogV3JhcCB0aGUgZ2l2ZW4gT3V0cHV0LiAgQ2FsbGluZyB3cml0ZSBtZXRob2RzIHdpbGwgcmVzdWx0IGluCisgICAgICAgICAqIHdyaXRlcyB0byB0aGlzIG91dHB1dC4KKyAgICAgICAgICovCisgICAgICAgIEVuZGlhbk91dHB1dChPdXRwdXQqIG91dCwgRW5kaWFubmVzcyBlbmQ9TElUVExFKTsKKworICAgICAgICB2aXJ0dWFsIH5FbmRpYW5PdXRwdXQoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbCBvcGVuIG9uIHRoZSB3cmFwcGVkIG91dHB1dC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbigpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsIGNsb3NlIG9uIHRoZSB3cmFwcGVkIG91dHB1dC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2UoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBlbmRpYW5uZXNzIHRvIHVzZSB3aGVuIHdyaXRpbmcuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0RW5kaWFubmVzcyhFbmRpYW5uZXNzIGVuZCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgY3VycmVudGx5IGNvbmZpZ3VyZWQgZW5kaWFubmVzcy4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgRW5kaWFubmVzcyBnZXRFbmRpYW5uZXNzKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgY3VycmVudCBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBieSB0aGlzIEVuZGlhbk91dHB1dC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0Q3VycmVudE9mZnNldCgpIGNvbnN0OworCisKKyAgICAgICAgLy8gVE9ETzogc3dpdGNoIHdyaXRlIG1ldGhvZHMgdG8gdWludDMyX3QgaW5zdGVhZCBvZiBzaXplX3QsCisgICAgICAgIC8vIHRoZSBtYXggc2l6ZSBvZiBhIFRJRkYgZmlsZXMgaXMgYm91bmRlZAorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZm9sbG93aW5nIG1ldGhvZHMgd2lsbCB3cml0ZSBlbGVtZW50cyBmcm9tIGdpdmVuIGlucHV0IGJ1ZmZlciB0byB0aGUgb3V0cHV0LgorICAgICAgICAgKiBDb3VudCBlbGVtZW50cyBpbiB0aGUgYnVmZmVyIHdpbGwgYmUgd3JpdHRlbiB3aXRoIHRoZSBlbmRpYW5uZXNzIHNldCBmb3IgdGhpcworICAgICAgICAgKiBFbmRpYW5PdXRwdXQuICBJZiB0aGUgZ2l2ZW4gb2Zmc2V0IGlzIGdyZWF0ZXIgdGhhbiB6ZXJvLCB0aGF0IG1hbnkgZWxlbWVudHMgd2lsbAorICAgICAgICAgKiBiZSBza2lwcGVkIGluIHRoZSBidWZmZXIgYmVmb3JlIHdyaXRpbmcuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBjb3VudCk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCBpbnQ4X3QqIGJ1Ziwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNvdW50KTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IHVpbnQxNl90KiBidWYsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBjb3VudCk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCBpbnQxNl90KiBidWYsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBjb3VudCk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCB1aW50MzJfdCogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3QgaW50MzJfdCogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3QgdWludDY0X3QqIGJ1Ziwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNvdW50KTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IGludDY0X3QqIGJ1Ziwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNvdW50KTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IGZsb2F0KiBidWYsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBjb3VudCk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCBkb3VibGUqIGJ1Ziwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNvdW50KTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgaW5saW5lIHN0YXR1c190IHdyaXRlSGVscGVyKGNvbnN0IFQqIGJ1Ziwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNvdW50KTsKKworICAgICAgICB1aW50MzJfdCBtT2Zmc2V0OworICAgICAgICBPdXRwdXQqIG1PdXRwdXQ7CisgICAgICAgIEVuZGlhbm5lc3MgbUVuZGlhbjsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitpbmxpbmUgc3RhdHVzX3QgRW5kaWFuT3V0cHV0Ojp3cml0ZUhlbHBlcihjb25zdCBUKiBidWYsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBjb3VudCkgeworICAgIGFzc2VydChvZmZzZXQgPD0gY291bnQpOworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIHNpemVfdCBzaXplID0gc2l6ZW9mKFQpOworICAgIHN3aXRjaChtRW5kaWFuKSB7CisgICAgICAgIGNhc2UgQklHOiB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gb2Zmc2V0OyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgIFQgdG1wID0gY29udmVydFRvQmlnRW5kaWFuPFQ+KGJ1ZltvZmZzZXQgKyBpXSk7CisgICAgICAgICAgICAgICAgaWYgKChyZXMgPSBtT3V0cHV0LT53cml0ZShyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPigmdG1wKSwgMCwgc2l6ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtT2Zmc2V0ICs9IHNpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIExJVFRMRTogeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IG9mZnNldDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICBUIHRtcCA9IGNvbnZlcnRUb0xpdHRsZUVuZGlhbjxUPihidWZbb2Zmc2V0ICsgaV0pOworICAgICAgICAgICAgICAgIGlmICgocmVzID0gbU91dHB1dC0+d3JpdGUocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJnRtcCksIDAsIHNpemUpKQorICAgICAgICAgICAgICAgICAgICAgICAgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbU9mZnNldCArPSBzaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgdWludDhfdCBjb252ZXJ0VG9CaWdFbmRpYW4odWludDhfdCBpbikgeworICAgIHJldHVybiBpbjsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIGludDhfdCBjb252ZXJ0VG9CaWdFbmRpYW4oaW50OF90IGluKSB7CisgICAgcmV0dXJuIGluOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgdWludDE2X3QgY29udmVydFRvQmlnRW5kaWFuKHVpbnQxNl90IGluKSB7CisgICAgcmV0dXJuIGh0b2JlMTYoaW4pOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgaW50MTZfdCBjb252ZXJ0VG9CaWdFbmRpYW4oaW50MTZfdCBpbikgeworICAgIHJldHVybiBodG9iZTE2KGluKTsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIHVpbnQzMl90IGNvbnZlcnRUb0JpZ0VuZGlhbih1aW50MzJfdCBpbikgeworICAgIHJldHVybiBodG9iZTMyKGluKTsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIGludDMyX3QgY29udmVydFRvQmlnRW5kaWFuKGludDMyX3QgaW4pIHsKKyAgICByZXR1cm4gaHRvYmUzMihpbik7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSB1aW50NjRfdCBjb252ZXJ0VG9CaWdFbmRpYW4odWludDY0X3QgaW4pIHsKKyAgICByZXR1cm4gaHRvYmU2NChpbik7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSBpbnQ2NF90IGNvbnZlcnRUb0JpZ0VuZGlhbihpbnQ2NF90IGluKSB7CisgICAgcmV0dXJuIGh0b2JlNjQoaW4pOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgdWludDhfdCBjb252ZXJ0VG9MaXR0bGVFbmRpYW4odWludDhfdCBpbikgeworICAgIHJldHVybiBpbjsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIGludDhfdCBjb252ZXJ0VG9MaXR0bGVFbmRpYW4oaW50OF90IGluKSB7CisgICAgcmV0dXJuIGluOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgdWludDE2X3QgY29udmVydFRvTGl0dGxlRW5kaWFuKHVpbnQxNl90IGluKSB7CisgICAgcmV0dXJuIGh0b2xlMTYoaW4pOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgaW50MTZfdCBjb252ZXJ0VG9MaXR0bGVFbmRpYW4oaW50MTZfdCBpbikgeworICAgIHJldHVybiBodG9sZTE2KGluKTsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIHVpbnQzMl90IGNvbnZlcnRUb0xpdHRsZUVuZGlhbih1aW50MzJfdCBpbikgeworICAgIHJldHVybiBodG9sZTMyKGluKTsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIGludDMyX3QgY29udmVydFRvTGl0dGxlRW5kaWFuKGludDMyX3QgaW4pIHsKKyAgICByZXR1cm4gaHRvbGUzMihpbik7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSB1aW50NjRfdCBjb252ZXJ0VG9MaXR0bGVFbmRpYW4odWludDY0X3QgaW4pIHsKKyAgICByZXR1cm4gaHRvbGU2NChpbik7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSBpbnQ2NF90IGNvbnZlcnRUb0xpdHRsZUVuZGlhbihpbnQ2NF90IGluKSB7CisgICAgcmV0dXJuIGh0b2xlNjQoaW4pOworfQorCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLworCisjZW5kaWYgLypJTUdfVVRJTFNfRU5ESUFOX1VUSUxTKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0ZpbGVJbnB1dC5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0ZpbGVJbnB1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNGYyMmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvRmlsZUlucHV0LmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTUdfVVRJTFNfRklMRV9JTlBVVF9ICisjZGVmaW5lIElNR19VVElMU19GSUxFX0lOUFVUX0gKKworI2luY2x1ZGUgPGltZ191dGlscy9JbnB1dC5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgZm9yIHJlYWRpbmcgZnJvbSBhIGZpbGUuCisgKi8KK2NsYXNzIEFORFJPSURfQVBJIEZpbGVJbnB1dCA6IHB1YmxpYyBJbnB1dCB7CisgICAgcHVibGljOgorICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGEgZmlsZSBpbnB1dCBmb3IgdGhlIGdpdmVuIHBhdGguCisgICAgICAgICAqLworICAgICAgICBGaWxlSW5wdXQoU3RyaW5nOCBwYXRoKTsKKworICAgICAgICB2aXJ0dWFsIH5GaWxlSW5wdXQoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogT3BlbiBhIGZpbGUgZGVzY3JpcHRvciB0byB0aGUgcGF0aCBnaXZlbiBpbiB0aGUgY29uc3RydWN0b3IuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlYWQgYnl0ZXMgZnJvbSB0aGUgZmlsZSBpbnRvIHRoZSBnaXZlbiBidWZmZXIuICBBdCBtb3N0LCB0aGUgbnVtYmVyCisgICAgICAgICAqIG9mIGJ5dGVzIGdpdmVuIGluIHRoZSBjb3VudCBhcmd1bWVudCB3aWxsIGJlIHJlYWQuICBCeXRlcyB3aWxsIGJlIHdyaXR0ZW4KKyAgICAgICAgICogaW50byB0aGUgZ2l2ZW4gYnVmZmVyIHN0YXJ0aW5nIGF0IHRoZSBpbmRleCBnaXZlbiBpbiB0aGUgb2Zmc2V0IGFyZ3VtZW50LgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgTk9UX0VOT1VHSF9EQVRBIGlmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuICBJZiBhbgorICAgICAgICAgKiBlcnJvciBoYXMgb2NjdXJyZWQsIHRoaXMgd2lsbCByZXR1cm4gYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG90aGVyIHRoYW4gTk9UX0VOT1VHSF9EQVRBLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzc2l6ZV90IHJlYWQodWludDhfdCogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDbG9zZSB0aGUgZmlsZSBkZXNjcmlwdG9yIHRvIHRoZSBwYXRoIGdpdmVuIGluIHRoZSBjb25zdHJ1Y3Rvci4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlKCk7CisgICAgcHJpdmF0ZToKKyAgICAgICAgRklMRSAqbUZwOworICAgICAgICBTdHJpbmc4IG1QYXRoOworICAgICAgICBib29sIG1PcGVuOworfTsKKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KKworCisjZW5kaWYgLypJTUdfVVRJTFNfSU5QVVRfSCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvRmlsZU91dHB1dC5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0ZpbGVPdXRwdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDViZTI3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0ZpbGVPdXRwdXQuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElNR19VVElMU19GSUxFX09VVFBVVF9ICisjZGVmaW5lIElNR19VVElMU19GSUxFX09VVFBVVF9ICisKKyNpbmNsdWRlIDxpbWdfdXRpbHMvT3V0cHV0Lmg+CisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCitjbGFzcyBBTkRST0lEX0FQSSBGaWxlT3V0cHV0IDogcHVibGljIE91dHB1dCB7CisgICAgcHVibGljOgorICAgICAgICBGaWxlT3V0cHV0KFN0cmluZzggcGF0aCk7CisgICAgICAgIHZpcnR1YWwgfkZpbGVPdXRwdXQoKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuKCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlKCk7CisgICAgcHJpdmF0ZToKKyAgICAgICAgRklMRSAqbUZwOworICAgICAgICBTdHJpbmc4IG1QYXRoOworICAgICAgICBib29sIG1PcGVuOworfTsKKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KKworI2VuZGlmIC8qSU1HX1VUSUxTX0ZJTEVfT1VUUFVUX0gqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0lucHV0LmggYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvSW5wdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTAzNjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0lucHV0LmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTUdfVVRJTFNfSU5QVVRfSAorI2RlZmluZSBJTUdfVVRJTFNfSU5QVVRfSAorCisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgdXNlZCBhcyBhIHNvdXJjZSBvZiBieXRlcy4KKyAqLworY2xhc3MgQU5EUk9JRF9BUEkgSW5wdXQgeworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB+SW5wdXQoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogT3BlbiB0aGlzIElucHV0LgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbigpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZWFkIGJ5dGVzIGludG8gdGhlIGdpdmVuIGJ1ZmZlci4gIEF0IG1vc3QsIHRoZSBudW1iZXIgb2YgYnl0ZXMgZ2l2ZW4gaW4gdGhlCisgICAgICAgICAqIGNvdW50IGFyZ3VtZW50IHdpbGwgYmUgcmVhZC4gIEJ5dGVzIHdpbGwgYmUgd3JpdHRlbiBpbnRvIHRoZSBnaXZlbiBidWZmZXIgc3RhcnRpbmcKKyAgICAgICAgICogYXQgdGhlIGluZGV4IGdpdmVuIGluIHRoZSBvZmZzZXQgYXJndW1lbnQuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLCBvciBOT1RfRU5PVUdIX0RBVEEgaWYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4gIElmIGFuCisgICAgICAgICAqIGVycm9yIGhhcyBvY2N1cnJlZCwgdGhpcyB3aWxsIHJldHVybiBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXIgdGhhbiBOT1RfRU5PVUdIX0RBVEEuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZCh1aW50OF90KiBidWYsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBjb3VudCkgPSAwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTa2lwcyBieXRlcyBpbiB0aGUgaW5wdXQuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBza2lwcGVkLCBvciBOT1RfRU5PVUdIX0RBVEEgaWYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4gIElmIGFuCisgICAgICAgICAqIGVycm9yIGhhcyBvY2N1cnJlZCwgdGhpcyB3aWxsIHJldHVybiBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXIgdGhhbiBOT1RfRU5PVUdIX0RBVEEuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHNzaXplX3Qgc2tpcChzaXplX3QgY291bnQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDbG9zZSB0aGUgSW5wdXQuICBJdCBpcyBub3QgdmFsaWQgdG8gY2FsbCBvcGVuIG9uIGEgcHJldmlvdXNseSBjbG9zZWQgSW5wdXQuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZSgpOworfTsKKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KKworCisjZW5kaWYgLypJTUdfVVRJTFNfSU5QVVRfSCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvT3JkZXJhYmxlLmggYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvT3JkZXJhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcyNTNhNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9PcmRlcmFibGUuaApAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElNR19VVElMU19PUkRFUkFCTEUKKyNkZWZpbmUgSU1HX1VUSUxTX09SREVSQUJMRQorCisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCisjZGVmaW5lIENPTVBBUkVfREVGKG9wKSBcCitpbmxpbmUgYm9vbCBvcGVyYXRvciBvcCAoY29uc3QgT3JkZXJhYmxlJiBvcmRlcmFibGUpIGNvbnN0OworCisvKioKKyAqIFN1YmNsYXNzZXMgb2YgT3JkZXJhYmxlIGNhbiBiZSBjb21wYXJlZCBhbmQgc29ydGVkLiAgVGhpcyBpcworICogaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBjcmVhdGUgc29ydGVkIGFycmF5cyBvZiBUSUZGIGVudHJpZXMKKyAqIGFuZCBJRkRzLgorICovCitjbGFzcyBBTkRST0lEX0FQSSBPcmRlcmFibGUgIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgfk9yZGVyYWJsZSgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb21wYXJpc29uIG9wZXJhdG90b3JzIGFyZSBiYXNlZCBvbiB0aGUgdmFsdWUgcmV0dXJuZWQKKyAgICAgICAgICogZnJvbSB0aGlzIG1ldGhvZC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0Q29tcGFyYWJsZVZhbHVlKCkgY29uc3QgPSAwOworCisgICAgICAgIENPTVBBUkVfREVGKD4pCisgICAgICAgIENPTVBBUkVfREVGKDwpCisgICAgICAgIENPTVBBUkVfREVGKD49KQorICAgICAgICBDT01QQVJFX0RFRig8PSkKKyAgICAgICAgQ09NUEFSRV9ERUYoPT0pCisgICAgICAgIENPTVBBUkVfREVGKCE9KQorfTsKKworI3VuZGVmIENPTVBBUkVfREVGCisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCisKKyNlbmRpZiAvKklNR19VVElMU19PUkRFUkFCTEUqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL091dHB1dC5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL091dHB1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZmFlMjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvT3V0cHV0LmgKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTUdfVVRJTFNfT1VUUFVUX0gKKyNkZWZpbmUgSU1HX1VUSUxTX09VVFBVVF9ICisKKyNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyB1c2VkIHRvIG91dHB1dCBieXRlcy4KKyAqLworY2xhc3MgQU5EUk9JRF9BUEkgT3V0cHV0IHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgfk91dHB1dCgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBPcGVuIHRoaXMgT3V0cHV0LgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbigpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBXcml0ZSBieXRlcyBmcm9tIHRoZSBnaXZlbiBidWZmZXIuICBUaGUgbnVtYmVyIG9mIGJ5dGVzIGdpdmVuIGluIHRoZSBjb3VudAorICAgICAgICAgKiBhcmd1bWVudCB3aWxsIGJlIHdyaXR0ZW4uICBCeXRlcyB3aWxsIGJlIHdyaXR0ZW4gZnJvbSB0aGUgZ2l2ZW4gYnVmZmVyIHN0YXJ0aW5nCisgICAgICAgICAqIGF0IHRoZSBpbmRleCBnaXZlbiBpbiB0aGUgb2Zmc2V0IGFyZ3VtZW50LgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpID0gMDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2xvc2UgdGhpcyBPdXRwdXQuICBJdCBpcyBub3QgdmFsaWQgdG8gY2FsbCBvcGVuIG9uIGEgcHJldmlvdXNseSBjbG9zZWQgT3V0cHV0LgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2UoKTsKK307CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCisKKyNlbmRpZiAvKklNR19VVElMU19PVVRQVVRfSCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvUGFpci5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1BhaXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjUxY2FjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1BhaXIuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElNR19VVElMU19QQUlSX0gKKyNkZWZpbmUgSU1HX1VUSUxTX1BBSVJfSAorCisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCisvKioKKyAqIEdlbmVyaWMgcGFpciB1dGlsaXR5IGNsYXNzLiAgTm90aGluZyBzcGVjaWFsIGhlcmUuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEYsIHR5cGVuYW1lIFM+CitjbGFzcyBBTkRST0lEX0FQSSBQYWlyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIEYgZmlyc3Q7CisgICAgICAgIFMgc2Vjb25kOworCisgICAgICAgIFBhaXIoKSB7fQorCisgICAgICAgIFBhaXIoY29uc3QgUGFpciYgbykgOiBmaXJzdChvLmZpcnN0KSwgc2Vjb25kKG8uc2Vjb25kKSB7fQorCisgICAgICAgIFBhaXIoY29uc3QgRiYgZiwgY29uc3QgUyYgcykgOiBmaXJzdChmKSwgc2Vjb25kKHMpIHt9Cit9OworCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLworCisjZW5kaWYgLypJTUdfVVRJTFNfUEFJUl9IKi8KZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9Tb3J0ZWRFbnRyeVZlY3Rvci5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1NvcnRlZEVudHJ5VmVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA1OWE4MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9Tb3J0ZWRFbnRyeVZlY3Rvci5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU1HX1VUSUxTX1NPUlRFRF9FTlRSWV9WRUNUT1JfSAorI2RlZmluZSBJTUdfVVRJTFNfU09SVEVEX0VOVFJZX1ZFQ1RPUl9ICisKKyNpbmNsdWRlIDxpbWdfdXRpbHMvVGlmZkVudHJ5Lmg+CisKKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCisvKioKKyAqIFN1YmNsYXNzIG9mIFNvcnRlZFZlY3RvciB0aGF0IGhhcyBiZWVuIGV4dGVuZGVkIHRvCisgKiBkbyBjb21wYXJpc29ucy9sb29rdXBzIGJhc2VkIG9uIHRoZSB0YWcgSUQgb2YgdGhlIGVudHJpZXMuCisgKi8KK2NsYXNzIFNvcnRlZEVudHJ5VmVjdG9yIDogcHVibGljIFNvcnRlZFZlY3RvcjxzcDxUaWZmRW50cnk+ID4geworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB+U29ydGVkRW50cnlWZWN0b3IoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGVudHJ5IHdpdGggdGhlIGdpdmVuIHRhZyBJRCwgb3IKKyAgICAgICAgICogLTEgaWYgbm9uZSBleGlzdHMuCisgICAgICAgICAqLworICAgICAgICBzc2l6ZV90IGluZGV4T2ZUYWcodWludDE2X3QgdGFnKSBjb25zdDsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbXBhcmUgdGFnIElELgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBpbnQgZG9fY29tcGFyZShjb25zdCB2b2lkKiBsaHMsIGNvbnN0IHZvaWQqIHJocykgY29uc3Q7Cit9OworCisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCisKKyNlbmRpZiAvKklNR19VVElMU19TT1JURURfRU5UUllfVkVDVE9SX0gqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1N0cmlwU291cmNlLmggYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvU3RyaXBTb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWM2YjYwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1N0cmlwU291cmNlLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTUdfVVRJTFNfU1RSSVBfU09VUkNFX0gKKyNkZWZpbmUgSU1HX1VUSUxTX1NUUklQX1NPVVJDRV9ICisKKyNpbmNsdWRlIDxpbWdfdXRpbHMvT3V0cHV0Lmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworLyoqCisgKiBUaGlzIGNsYXNzIGFjdHMgYXMgYSBkYXRhIHNvdXJjZSBmb3Igc3RyaXBzIHNldCBpbiBhIFRpZmZJZmQuCisgKi8KK2NsYXNzIEFORFJPSURfQVBJIFN0cmlwU291cmNlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgflN0cmlwU291cmNlKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdyaXRlIGNvdW50IGJ5dGVzIHRvIHRoZSBzdHJlYW0uCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZVRvU3RyZWFtKE91dHB1dCYgc3RyZWFtLCB1aW50MzJfdCBjb3VudCkgPSAwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdGhlIHNvdXJjZSBJRkQuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldElmZCgpIGNvbnN0ID0gMDsKK307CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCisKKyNlbmRpZiAvKklNR19VVElMU19TVFJJUF9TT1VSQ0VfSCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvVGFnRGVmaW5pdGlvbnMuaCBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9UYWdEZWZpbml0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YTc0ODAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvVGFnRGVmaW5pdGlvbnMuaApAQCAtMCwwICsxLDEzOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU1HX1VUSUxTX1RJRkZfVEFHX0RFRklOSVRJT05fSAorI2RlZmluZSBJTUdfVVRJTFNfVElGRl9UQUdfREVGSU5JVElPTl9ICisKKyNpbmNsdWRlIDxpbWdfdXRpbHMvVGlmZkVudHJ5Lmg+CisjaW5jbHVkZSA8aW1nX3V0aWxzL091dHB1dC5oPgorI2luY2x1ZGUgPGltZ191dGlscy9UaWZmSGVscGVycy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworLyoqCisgKiBUYWcgZGVmaW5pdGlvbnMgY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCBzdGFuZGFyZCBUSUZGIGNvbXBhdGlibGUgdGFncy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgVGFnRGVmaW5pdGlvbiB7CisgICAgLy8gVGhlIHRhZyBuYW1lLgorICAgIGNvbnN0IGNoYXIqIHRhZ05hbWU7CisgICAgLy8gVGhlIHNwZWNpZmllZCB0YWcgSUQuCisgICAgY29uc3QgdWludDE2X3QgdGFnSWQ7CisgICAgLy8gVGhlIGRlZmF1bHQgdHlwZSBmb3IgdGhpcyB0YWcuICBUaGlzIG11c3QgYmUgYSB2YWxpZCBUSUZGIHR5cGUuCisgICAgY29uc3QgVGFnVHlwZSBkZWZhdWx0VHlwZTsKKyAgICAvLyBUaGUgZGVmYXVsdCBJbWFnZSBGaWxlIERpcmVjdG9yeSAoSUZEKSBmb3IgdGhpcyB0YWcuCisgICAgY29uc3QgdWludDMyX3QgZGVmYXVsdElmZDsKKyAgICAvLyBUaGUgdmFsaWQgY291bnQgZm9yIHRoaXMgdGFnLCBvciAwIGlmIHRoZSBjb3VudCBpcyBub3QgZml4ZWQuCisgICAgY29uc3QgdWludDMyX3QgZml4ZWRDb3VudDsKKyAgICAvLyBUaGUgZW5kaWFubmVzcyBvZiB0aGUgdGFnIHZhbHVlLCBvciBVTkRFRklORURfRU5ESUFOIGlmIHRoZXJlIGlzIG5vIGZpeGVkIGVuZGlhbgorICAgIGNvbnN0IEVuZGlhbm5lc3MgZml4ZWRFbmRpYW47Cit9IFRhZ0RlZmluaXRpb25fdDsKKworLyoqCisgKiBDb252ZW5pZW5jZSBkZWZpbmVzIGZvciB0YWcgaWRzLgorICovCitlbnVtIHsKKyAgICBUQUdfUkFXVE9QUkVWSUVXR0FJTiA9IDB4QzdBOHUsCisgICAgVEFHX05FV1JBV0lNQUdFRElHRVNUID0gMHhDN0E3dSwKKyAgICBUQUdfT1JJR0lOQUxERUZBVUxUQ1JPUFNJWkUgPSAweEM3OTN1LAorICAgIFRBR19PUklHSU5BTEJFU1RRVUFMSVRZRklOQUxTSVpFID0gMHhDNzkydSwKKyAgICBUQUdfT1JJR0lOQUxERUZBVUxURklOQUxTSVpFID0gMHhDNzkxdSwKKyAgICBUQUdfUFJPRklMRUhVRVNBVE1BUEVOQ09ESU5HID0gMHhDN0EzdSwKKyAgICBUQUdfUFJPRklMRUxPT0tUQUJMRUVOQ09ESU5HID0gMHhDN0E0dSwKKyAgICBUQUdfQkFTRUxJTkVFWFBPU1VSRU9GRlNFVCA9IDB4QzdBNXUsCisgICAgVEFHX0RFRkFVTFRCTEFDS1JFTkRFUiA9IDB4QzdBNnUsCisgICAgVEFHX0RFRkFVTFRVU0VSQ1JPUCA9IDB4QzdCNXUsCisgICAgVEFHX05PSVNFUFJPRklMRSA9IDB4Qzc2MXUsCisgICAgVEFHX09QQ09ERUxJU1QzID0gMHhDNzRFdSwKKyAgICBUQUdfT1BDT0RFTElTVDIgPSAweEM3NDF1LAorICAgIFRBR19PUENPREVMSVNUMSA9IDB4Qzc0MHUsCisgICAgVEFHX1BST0ZJTEVMT09LVEFCTEVEQVRBID0gMHhDNzI2dSwKKyAgICBUQUdfUFJPRklMRUxPT0tUQUJMRURJTVMgPSAweEM3MjV1LAorICAgIFRBR19ST1dJTlRFUkxFQVZFRkFDVE9SID0gMHhDNzFGdSwKKyAgICBUQUdfU1VCVElMRUJMT0NLU0laRSA9IDB4QzcxRXUsCisgICAgVEFHX09SSUdJTkFMUkFXRklMRURJR0VTVCA9IDB4QzcxRHUsCisgICAgVEFHX1JBV0lNQUdFRElHRVNUID0gMHhDNzFDdSwKKyAgICBUQUdfUFJFVklFV0RBVEVUSU1FID0gMHhDNzFCdSwKKyAgICBUQUdfUFJFVklFV0NPTE9SU1BBQ0UgPSAweEM3MUF1LAorICAgIFRBR19QUkVWSUVXU0VUVElOR1NESUdFU1QgPSAweEM3MTl1LAorICAgIFRBR19QUkVWSUVXU0VUVElOR1NOQU1FID0gMHhDNzE4dSwKKyAgICBUQUdfUFJFVklFV0FQUExJQ0FUSU9OVkVSU0lPTiA9IDB4QzcxN3UsCisgICAgVEFHX1BSRVZJRVdBUFBMSUNBVElPTk5BTUUgPSAweEM3MTZ1LAorICAgIFRBR19GT1JXQVJETUFUUklYMiA9IDB4QzcxNXUsCisgICAgVEFHX0ZPUldBUkRNQVRSSVgxID0gMHhDNzE0dSwKKyAgICBUQUdfUFJPRklMRUNPUFlSSUdIVCA9IDB4QzZGRXUsCisgICAgVEFHX1BST0ZJTEVFTUJFRFBPTElDWSA9IDB4QzZGRHUsCisgICAgVEFHX1BST0ZJTEVUT05FQ1VSVkUgPSAweEM2RkN1LAorICAgIFRBR19QUk9GSUxFSFVFU0FUTUFQREFUQTIgPSAweEM2RkJ1LAorICAgIFRBR19QUk9GSUxFSFVFU0FUTUFQREFUQTEgPSAweEM2RkF1LAorICAgIFRBR19QUk9GSUxFSFVFU0FUTUFQRElNUyA9IDB4QzZGOXUsCisgICAgVEFHX1BST0ZJTEVOQU1FID0gMHhDNkY4dSwKKyAgICBUQUdfTk9JU0VSRURVQ1RJT05BUFBMSUVEID0gMHhDNkY3dSwKKyAgICBUQUdfQVNTSE9UUFJPRklMRU5BTUUgPSAweEM2RjZ1LAorICAgIFRBR19FWFRSQUNBTUVSQVBST0ZJTEVTID0gMHhDNkY1dSwKKyAgICBUQUdfUFJPRklMRUNBTElCUkFUSU9OU0lHTkFUVVJFID0gMHhDNkY0dSwKKyAgICBUQUdfQ0FNRVJBQ0FMSUJSQVRJT05TSUdOQVRVUkUgPSAweEM2RjN1LAorICAgIFRBR19DT0xPUklNRVRSSUNSRUZFUkVOQ0UgPSAweEM2QkZ1LAorICAgIFRBR19DVVJSRU5UUFJFUFJPRklMRU1BVFJJWCA9IDB4QzY5MnUsCisgICAgVEFHX0NVUlJFTlRJQ0NQUk9GSUxFID0gMHhDNjkxdSwKKyAgICBUQUdfQVNTSE9UUFJFUFJPRklMRU1BVFJJWCA9IDB4QzY5MHUsCisgICAgVEFHX0FTU0hPVElDQ1BST0ZJTEUgPSAweEM2OEZ1LAorICAgIFRBR19NQVNLRURBUkVBUyA9IDB4QzY4RXUsCisgICAgVEFHX0FDVElWRUFSRUEgPSAweEM2OER1LAorICAgIFRBR19PUklHSU5BTFJBV0ZJTEVEQVRBID0gMHhDNjhDdSwKKyAgICBUQUdfT1JJR0lOQUxSQVdGSUxFTkFNRSA9IDB4QzY4QnUsCisgICAgVEFHX1JBV0RBVEFVTklRVUVJRCA9IDB4QzY1RHUsCisgICAgVEFHX01BS0VSTk9URVNBRkVUWSA9IDB4QzYzNXUsCisgICAgVEFHX0ROR1BSSVZBVEVEQVRBID0gMHhDNjM0dSwKKyAgICBUQUdfU0hBRE9XU0NBTEUgPSAweEM2MzN1LAorICAgIFRBR19BTlRJQUxJQVNTVFJFTkdUSCA9IDB4QzYzMnUsCisgICAgVEFHX0NIUk9NQUJMVVJSQURJVVMgPSAweEM2MzF1LAorICAgIFRBR19MRU5TSU5GTyA9IDB4QzYzMHUsCisgICAgVEFHX0NBTUVSQVNFUklBTE5VTUJFUiA9IDB4QzYyRnUsCisgICAgVEFHX0xJTkVBUlJFU1BPTlNFTElNSVQgPSAweEM2MkV1LAorICAgIFRBR19CQVlFUkdSRUVOU1BMSVQgPSAweEM2MkR1LAorICAgIFRBR19CQVNFTElORVNIQVJQTkVTUyA9IDB4QzYyQ3UsCisgICAgVEFHX0JBU0VMSU5FTk9JU0UgPSAweEM2MkJ1LAorICAgIFRBR19CQVNFTElORUVYUE9TVVJFID0gMHhDNjJBdSwKKyAgICBUQUdfQVNTSE9UV0hJVEVYWSA9IDB4QzYyOXUsCisgICAgVEFHX0FTU0hPVE5FVVRSQUwgPSAweEM2Mjh1LAorICAgIFRBR19BTkFMT0dCQUxBTkNFID0gMHhDNjI3dSwKKyAgICBUQUdfUkVEVUNUSU9OTUFUUklYMiA9IDB4QzYyNnUsCisgICAgVEFHX1JFRFVDVElPTk1BVFJJWDEgPSAweEM2MjV1LAorICAgIFRBR19DQU1FUkFDQUxJQlJBVElPTjIgPSAweEM2MjR1LAorICAgIFRBR19DQU1FUkFDQUxJQlJBVElPTjEgPSAweEM2MjN1LAorICAgIFRBR19DT0xPUk1BVFJJWDIgPSAweEM2MjJ1LAorICAgIFRBR19DT0xPUk1BVFJJWDEgPSAweEM2MjF1LAorICAgIFRBR19DQUxJQlJBVElPTklMTFVNSU5BTlQyID0gMHhDNjVCdSwKKyAgICBUQUdfQ0FMSUJSQVRJT05JTExVTUlOQU5UMSA9IDB4QzY1QXUsCisgICAgVEFHX0RFRkFVTFRDUk9QU0laRSA9IDB4QzYyMHUsCisgICAgVEFHX0RFRkFVTFRDUk9QT1JJR0lOID0gMHhDNjFGdSwKKyAgICBUQUdfQkVTVFFVQUxJVFlTQ0FMRSA9IDB4QzY1Q3UsCisgICAgVEFHX0RFRkFVTFRTQ0FMRSA9IDB4QzYxRXUsCisgICAgVEFHX1dISVRFTEVWRUwgPSAweEM2MUR1LAorICAgIFRBR19CTEFDS0xFVkVMREVMVEFWID0gMHhDNjFDdSwKKyAgICBUQUdfQkxBQ0tMRVZFTERFTFRBSCA9IDB4QzYxQnUsCisgICAgVEFHX0JMQUNLTEVWRUwgPSAweEM2MUF1LAorICAgIFRBR19CTEFDS0xFVkVMUkVQRUFURElNID0gMHhDNjE5dSwKKyAgICBUQUdfTElORUFSSVpBVElPTlRBQkxFID0gMHhDNjE4dSwKKyAgICBUQUdfQ0ZBTEFZT1VUID0gMHhDNjE3dSwKKyAgICBUQUdfQ0ZBUExBTkVDT0xPUiA9IDB4QzYxNnUsCisgICAgVEFHX0xPQ0FMSVpFRENBTUVSQU1PREVMID0gMHhDNjE1dSwKKyAgICBUQUdfVU5JUVVFQ0FNRVJBTU9ERUwgPSAweEM2MTR1LAorICAgIFRBR19ETkdCQUNLV0FSRFZFUlNJT04gPSAweEM2MTN1LAorICAgIFRBR19ETkdWRVJTSU9OID0gMHhDNjEydSwKKyAgICBUQUdfU1VCRklMRVRZUEUgPSAweDAwRkZ1LAorICAgIFRBR19ZUkVTT0xVVElPTiA9IDB4MDExQnUsCisgICAgVEFHX1hSRVNPTFVUSU9OID0gMHgwMTFBdSwKKyAgICBUQUdfVEhSRVNISE9MRElORyA9IDB4MDEwN3UsCisgICAgVEFHX1NUUklQT0ZGU0VUUyA9IDB4MDExMXUsCisgICAgVEFHX1NUUklQQllURUNPVU5UUyA9IDB4MDExN3UsCisgICAgVEFHX1NPRlRXQVJFID0gMHgwMTMxdSwKKyAgICBUQUdfU0FNUExFU1BFUlBJWEVMID0gMHgwMTE1dSwKKyAgICBUQUdfUk9XU1BFUlNUUklQID0gMHgwMTE2dSwKKyAgICBUQUdfUkVTT0xVVElPTlVOSVQgPSAweDAxMjh1LAorICAgIFRBR19QTEFOQVJDT05GSUdVUkFUSU9OID0gMHgwMTFDdSwKKyAgICBUQUdfUEhPVE9NRVRSSUNJTlRFUlBSRVRBVElPTiA9IDB4MDEwNnUsCisgICAgVEFHX09SSUVOVEFUSU9OID0gMHgwMTEydSwKKyAgICBUQUdfTkVXU1VCRklMRVRZUEUgPSAweDAwRkV1LAorICAgIFRBR19NT0RFTCA9IDB4MDExMHUsCisgICAgVEFHX01JTlNBTVBMRVZBTFVFID0gMHgwMTE4dSwKKyAgICBUQUdfTUFYU0FNUExFVkFMVUUgPSAweDAxMTl1LAorICAgIFRBR19NQUtFID0gMHgwMTBGdSwKKyAgICBUQUdfSU1BR0VXSURUSCA9IDB4MDEwMHUsCisgICAgVEFHX0lNQUdFTEVOR1RIID0gMHgwMTAxdSwKKyAgICBUQUdfSU1BR0VERVNDUklQVElPTiA9IDB4MDEwRXUsCisgICAgVEFHX0hPU1RDT01QVVRFUiA9IDB4MDEzQ3UsCisgICAgVEFHX0dSQVlSRVNQT05TRVVOSVQgPSAweDAxMjJ1LAorICAgIFRBR19HUkFZUkVTUE9OU0VDVVJWRSA9IDB4MDEyM3UsCisgICAgVEFHX0ZSRUVPRkZTRVRTID0gMHgwMTIwdSwKKyAgICBUQUdfRlJFRUJZVEVDT1VOVFMgPSAweDAxMjF1LAorICAgIFRBR19GSUxMT1JERVIgPSAweDAxMEF1LAorICAgIFRBR19FWFRSQVNBTVBMRVMgPSAweDAxNTJ1LAorICAgIFRBR19EQVRFVElNRSA9IDB4MDEzMnUsCisgICAgVEFHX0NPUFlSSUdIVCA9IDB4ODI5OHUsCisgICAgVEFHX0NPTVBSRVNTSU9OID0gMHgwMTAzdSwKKyAgICBUQUdfQ09MT1JNQVAgPSAweDAxNDB1LAorICAgIFRBR19DRUxMV0lEVEggPSAweDAxMDh1LAorICAgIFRBR19DRUxMTEVOR1RIID0gMHgwMTA5dSwKKyAgICBUQUdfQklUU1BFUlNBTVBMRSA9IDB4MDEwMnUsCisgICAgVEFHX0FSVElTVCA9IDB4MDEzQnUsCisgICAgVEFHX0VYSUZWRVJTSU9OID0gMHg5MDAwdSwKKyAgICBUQUdfQ0ZBUkVQRUFUUEFUVEVSTkRJTSA9IDB4ODI4RHUsCisgICAgVEFHX0RBVEVUSU1FT1JJR0lOQUwgPSAweDkwMDN1LAorICAgIFRBR19DRkFQQVRURVJOID0gMHg4MjhFdSwKKyAgICBUQUdfU1VCSUZEUyA9IDB4MDE0QXUsCisgICAgVEFHX1RJRkZFUFNUQU5EQVJESUQgPSAweDkyMTZ1LAorICAgIFRBR19FWFBPU1VSRVRJTUUgPSAweDgyOUF1LAorICAgIFRBR19JU09TUEVFRFJBVElOR1MgPSAweDg4Mjd1LAorICAgIFRBR19GT0NBTExFTkdUSCA9IDB4OTIwQXUsCisgICAgVEFHX0ZOVU1CRVIgPSAweDgyOUR1LAorICAgIFRBR19HUFNJTkZPID0gMHg4ODI1dSwKKyAgICBUQUdfR1BTVkVSU0lPTklEID0gMHgwdSwKKyAgICBUQUdfR1BTTEFUSVRVREVSRUYgPSAweDF1LAorICAgIFRBR19HUFNMQVRJVFVERSA9IDB4MnUsCisgICAgVEFHX0dQU0xPTkdJVFVERVJFRiA9IDB4M3UsCisgICAgVEFHX0dQU0xPTkdJVFVERSA9IDB4NHUsCisgICAgVEFHX0dQU1RJTUVTVEFNUCA9IDB4N3UsCisgICAgVEFHX0dQU0RBVEVTVEFNUCA9IDB4MDAxRHUsCit9OworCisvKioKKyAqIFRJRkZfRVBfVEFHX0RFRklOSVRJT05TIGNvbnRhaW5zIHRhZ3MgZGVmaW5lZCBpbiB0aGUgVElGRiBFUCBzcGVjCisgKi8KK2NvbnN0IFRhZ0RlZmluaXRpb25fdCBUSUZGX0VQX1RBR19ERUZJTklUSU9OU1tdID0gIHsKKyAgICB7IC8vIFBob3RvbWV0cmljSW50ZXJwcmV0YXRpb24KKyAgICAgICAgIlBob3RvbWV0cmljSW50ZXJwcmV0YXRpb24iLAorICAgICAgICAweDAxMDZ1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gU3ViSWZkcworICAgICAgICAiU3ViSWZkcyIsCisgICAgICAgIDB4MDE0QXUsCisgICAgICAgIExPTkcsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIENGQVBhdHRlcm4KKyAgICAgICAgIkNGQVBhdHRlcm4iLAorICAgICAgICAweDgyOEV1LAorICAgICAgICBCWVRFLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDRkFSZXBlYXRQYXR0ZXJuRGltCisgICAgICAgICJDRkFSZXBlYXRQYXR0ZXJuRGltIiwKKyAgICAgICAgMHg4MjhEdSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIElGRF8wLAorICAgICAgICAyLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIERhdGVUaW1lT3JpZ2luYWwKKyAgICAgICAgIkRhdGVUaW1lT3JpZ2luYWwiLAorICAgICAgICAweDkwMDN1LAorICAgICAgICBBU0NJSSwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDIwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFRpZmYvRVBTdGFuZGFyZElECisgICAgICAgICJUaWZmIiwKKyAgICAgICAgMHg5MjE2dSwKKyAgICAgICAgQllURSwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDQsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gRXhwb3N1cmVUaW1lCisgICAgICAgICJFeHBvc3VyZVRpbWUiLAorICAgICAgICAweDgyOUF1LAorICAgICAgICBSQVRJT05BTCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gSVNPU3BlZWRSYXRpbmdzCisgICAgICAgICJJU09TcGVlZFJhdGluZ3MiLAorICAgICAgICAweDg4Mjd1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gRm9jYWxMZW5ndGgKKyAgICAgICAgIkZvY2FsTGVuZ3RoIiwKKyAgICAgICAgMHg5MjBBdSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEZOdW1iZXIKKyAgICAgICAgIkZOdW1iZXIiLAorICAgICAgICAweDgyOUR1LAorICAgICAgICBSQVRJT05BTCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gR1BTSW5mbworICAgICAgICAiR1BTSW5mbyIsCisgICAgICAgIDB4ODgyNXUsCisgICAgICAgIExPTkcsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEdQU1ZlcnNpb25JRAorICAgICAgICAiR1BTVmVyc2lvbklEIiwKKyAgICAgICAgMHgwdSwKKyAgICAgICAgQllURSwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDQsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gR1BTTGF0aXR1ZGVSZWYKKyAgICAgICAgIkdQU0xhdGl0dWRlUmVmIiwKKyAgICAgICAgMHgxdSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIElGRF8wLAorICAgICAgICAyLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEdQU0xhdGl0dWRlCisgICAgICAgICJHUFNMYXRpdHVkZSIsCisgICAgICAgIDB4MnUsCisgICAgICAgIFJBVElPTkFMLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMywKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBHUFNMb25naXR1ZGVSZWYKKyAgICAgICAgIkdQU0xvbmdpdHVkZVJlZiIsCisgICAgICAgIDB4M3UsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMiwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBHUFNMb25naXR1ZGUKKyAgICAgICAgIkdQU0xvbmdpdHVkZSIsCisgICAgICAgIDB4NHUsCisgICAgICAgIFJBVElPTkFMLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMywKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBHUFNUaW1lU3RhbXAKKyAgICAgICAgIkdQU1RpbWVTdGFtcCIsCisgICAgICAgIDB4N3UsCisgICAgICAgIFJBVElPTkFMLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMywKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgLypUT0RPOiBSZW1haW5pbmcgVElGRiBFUCB0YWdzKi8KK307CisKKy8qKgorICogRVhJRl8yXzNfVEFHX0RFRklOSVRJT05TIGNvbnRhaW5zIHRhZ3MgZGVmaW5lZCBpbiB0aGUgSmVpdGEgRVhJRiAyLjMgc3BlYworICovCitjb25zdCBUYWdEZWZpbml0aW9uX3QgRVhJRl8yXzNfVEFHX0RFRklOSVRJT05TW10gPSB7CisgICAgeyAvLyBFeGlmVmVyc2lvbgorICAgICAgICAiRXhpZlZlcnNpb24iLAorICAgICAgICAweDkwMDB1LAorICAgICAgICBVTkRFRklORUQsCisgICAgICAgIElGRF8wLAorICAgICAgICA0LAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEdQU0RhdGVTdGFtcAorICAgICAgICAiR1BTRGF0ZVN0YW1wIiwKKyAgICAgICAgMHgwMDFEdSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIElGRF8wLAorICAgICAgICAxMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgLypUT0RPOiBSZW1haW5pbmcgRVhJRiAyLjMgdGFncyovCit9OworCisvKioKKyAqIFRJRkZfNl9UQUdfREVGSU5JVElPTlMgY29udGFpbnMgdGFncyBkZWZpbmVkIGluIHRoZSBUSUZGIDYuMCBzcGVjCisgKi8KK2NvbnN0IFRhZ0RlZmluaXRpb25fdCBUSUZGXzZfVEFHX0RFRklOSVRJT05TW10gPSB7CisgICAgeyAvLyBTdWJGaWxlVHlwZQorICAgICAgICAiU3ViRmlsZVR5cGUiLAorICAgICAgICAweDAwRkZ1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQXJ0aXN0CisgICAgICAgICJBcnRpc3QiLAorICAgICAgICAweDAxM0J1LAorICAgICAgICBBU0NJSSwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQml0c1BlclNhbXBsZQorICAgICAgICAiQml0c1BlclNhbXBsZSIsCisgICAgICAgIDB4MDEwMnUsCisgICAgICAgIFNIT1JULAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDZWxsTGVuZ3RoCisgICAgICAgICJDZWxsTGVuZ3RoIiwKKyAgICAgICAgMHgwMTA5dSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIENlbGxXaWR0aAorICAgICAgICAiQ2VsbFdpZHRoIiwKKyAgICAgICAgMHgwMTA4dSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIENvbG9yTWFwCisgICAgICAgICJDb2xvck1hcCIsCisgICAgICAgIDB4MDE0MHUsCisgICAgICAgIFNIT1JULAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDb21wcmVzc2lvbgorICAgICAgICAiQ29tcHJlc3Npb24iLAorICAgICAgICAweDAxMDN1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQ29weXJpZ2h0CisgICAgICAgICJDb3B5cmlnaHQiLAorICAgICAgICAweDgyOTh1LAorICAgICAgICBBU0NJSSwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gRGF0ZVRpbWUKKyAgICAgICAgIkRhdGVUaW1lIiwKKyAgICAgICAgMHgwMTMydSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIElGRF8wLAorICAgICAgICAyMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBFeHRyYVNhbXBsZXMKKyAgICAgICAgIkV4dHJhU2FtcGxlcyIsCisgICAgICAgIDB4MDE1MnUsCisgICAgICAgIFNIT1JULAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBGaWxsT3JkZXIKKyAgICAgICAgIkZpbGxPcmRlciIsCisgICAgICAgIDB4MDEwQXUsCisgICAgICAgIFNIT1JULAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBGcmVlQnl0ZUNvdW50cworICAgICAgICAiRnJlZUJ5dGVDb3VudHMiLAorICAgICAgICAweDAxMjF1LAorICAgICAgICBMT05HLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBGcmVlT2Zmc2V0cworICAgICAgICAiRnJlZU9mZnNldHMiLAorICAgICAgICAweDAxMjB1LAorICAgICAgICBMT05HLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBHcmF5UmVzcG9uc2VDdXJ2ZQorICAgICAgICAiR3JheVJlc3BvbnNlQ3VydmUiLAorICAgICAgICAweDAxMjN1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gR3JheVJlc3BvbnNlVW5pdAorICAgICAgICAiR3JheVJlc3BvbnNlVW5pdCIsCisgICAgICAgIDB4MDEyMnUsCisgICAgICAgIFNIT1JULAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBIb3N0Q29tcHV0ZXIKKyAgICAgICAgIkhvc3RDb21wdXRlciIsCisgICAgICAgIDB4MDEzQ3UsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBJbWFnZURlc2NyaXB0aW9uCisgICAgICAgICJJbWFnZURlc2NyaXB0aW9uIiwKKyAgICAgICAgMHgwMTBFdSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEltYWdlTGVuZ3RoCisgICAgICAgICJJbWFnZUxlbmd0aCIsCisgICAgICAgIDB4MDEwMXUsCisgICAgICAgIExPTkcsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEltYWdlV2lkdGgKKyAgICAgICAgIkltYWdlV2lkdGgiLAorICAgICAgICAweDAxMDB1LAorICAgICAgICBMT05HLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBNYWtlCisgICAgICAgICJNYWtlIiwKKyAgICAgICAgMHgwMTBGdSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIE1heFNhbXBsZVZhbHVlCisgICAgICAgICJNYXhTYW1wbGVWYWx1ZSIsCisgICAgICAgIDB4MDExOXUsCisgICAgICAgIFNIT1JULAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBNaW5TYW1wbGVWYWx1ZQorICAgICAgICAiTWluU2FtcGxlVmFsdWUiLAorICAgICAgICAweDAxMTh1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gTW9kZWwKKyAgICAgICAgIk1vZGVsIiwKKyAgICAgICAgMHgwMTEwdSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIE5ld1N1YmZpbGVUeXBlCisgICAgICAgICJOZXdTdWJmaWxlVHlwZSIsCisgICAgICAgIDB4MDBGRXUsCisgICAgICAgIExPTkcsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIE9yaWVudGF0aW9uCisgICAgICAgICJPcmllbnRhdGlvbiIsCisgICAgICAgIDB4MDExMnUsCisgICAgICAgIFNIT1JULAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBQaG90b01ldHJpY0ludGVycHJldGF0aW9uCisgICAgICAgICJQaG90b01ldHJpY0ludGVycHJldGF0aW9uIiwKKyAgICAgICAgMHgwMTA2dSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFBsYW5hckNvbmZpZ3VyYXRpb24KKyAgICAgICAgIlBsYW5hckNvbmZpZ3VyYXRpb24iLAorICAgICAgICAweDAxMUN1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUmVzb2x1dGlvblVuaXQKKyAgICAgICAgIlJlc29sdXRpb25Vbml0IiwKKyAgICAgICAgMHgwMTI4dSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFJvd3NQZXJTdHJpcAorICAgICAgICAiUm93c1BlclN0cmlwIiwKKyAgICAgICAgMHgwMTE2dSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gU2FtcGxlc1BlclBpeGVsCisgICAgICAgICJTYW1wbGVzUGVyUGl4ZWwiLAorICAgICAgICAweDAxMTV1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gU29mdHdhcmUKKyAgICAgICAgIlNvZnR3YXJlIiwKKyAgICAgICAgMHgwMTMxdSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFN0cmlwQnl0ZUNvdW50cworICAgICAgICAiU3RyaXBCeXRlQ291bnRzIiwKKyAgICAgICAgMHgwMTE3dSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gU3RyaXBPZmZzZXRzCisgICAgICAgICJTdHJpcE9mZnNldHMiLAorICAgICAgICAweDAxMTF1LAorICAgICAgICBMT05HLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBTdWJmaWxlVHlwZQorICAgICAgICAiU3ViZmlsZVR5cGUiLAorICAgICAgICAweDAwRkZ1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gVGhyZXNoaG9sZGluZworICAgICAgICAiVGhyZXNoaG9sZGluZyIsCisgICAgICAgIDB4MDEwN3UsCisgICAgICAgIFNIT1JULAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBYUmVzb2x1dGlvbgorICAgICAgICAiWFJlc29sdXRpb24iLAorICAgICAgICAweDAxMUF1LAorICAgICAgICBSQVRJT05BTCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gWVJlc29sdXRpb24KKyAgICAgICAgIllSZXNvbHV0aW9uIiwKKyAgICAgICAgMHgwMTFCdSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKK307CisKKy8qKgorICogRE5HX1RBR19ERUZJTklUSU9OUyBjb250YWlucyB0YWdzIGRlZmluZWQgaW4gdGhlIERORyAxLjQgc3BlYworICovCitjb25zdCBUYWdEZWZpbml0aW9uX3QgRE5HX1RBR19ERUZJTklUSU9OU1tdID0geworICAgIHsgLy8gRE5HVmVyc2lvbgorICAgICAgICAiRE5HVmVyc2lvbiIsCisgICAgICAgIDB4QzYxMnUsCisgICAgICAgIEJZVEUsCisgICAgICAgIElGRF8wLAorICAgICAgICA0LAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEROR0JhY2t3YXJkVmVyc2lvbgorICAgICAgICAiRE5HQmFja3dhcmRWZXJzaW9uIiwKKyAgICAgICAgMHhDNjEzdSwKKyAgICAgICAgQllURSwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDQsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gVW5pcXVlQ2FtZXJhTW9kZWwKKyAgICAgICAgIlVuaXF1ZUNhbWVyYU1vZGVsIiwKKyAgICAgICAgMHhDNjE0dSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIExvY2FsaXplZENhbWVyYU1vZGVsCisgICAgICAgICJMb2NhbGl6ZWRDYW1lcmFNb2RlbCIsCisgICAgICAgIDB4QzYxNXUsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDRkFQbGFuZUNvbG9yCisgICAgICAgICJDRkFQbGFuZUNvbG9yIiwKKyAgICAgICAgMHhDNjE2dSwKKyAgICAgICAgQllURSwKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDRkFMYXlvdXQKKyAgICAgICAgIkNGQUxheW91dCIsCisgICAgICAgIDB4QzYxN3UsCisgICAgICAgIFNIT1JULAorICAgICAgICBSQVdfSUZELAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIExpbmVhcml6YXRpb25UYWJsZQorICAgICAgICAiTGluZWFyaXphdGlvblRhYmxlIiwKKyAgICAgICAgMHhDNjE4dSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQmxhY2tMZXZlbFJlcGVhdERpbQorICAgICAgICAiQmxhY2tMZXZlbFJlcGVhdERpbSIsCisgICAgICAgIDB4QzYxOXUsCisgICAgICAgIFNIT1JULAorICAgICAgICBSQVdfSUZELAorICAgICAgICAyLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEJsYWNrTGV2ZWwKKyAgICAgICAgIkJsYWNrTGV2ZWwiLAorICAgICAgICAweEM2MUF1LAorICAgICAgICBMT05HLAorICAgICAgICBSQVdfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEJsYWNrTGV2ZWxEZWx0YUgKKyAgICAgICAgIkJsYWNrTGV2ZWxEZWx0YUgiLAorICAgICAgICAweEM2MUJ1LAorICAgICAgICBTUkFUSU9OQUwsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQmxhY2tMZXZlbERlbHRhVgorICAgICAgICAiQmxhY2tMZXZlbERlbHRhViIsCisgICAgICAgIDB4QzYxQ3UsCisgICAgICAgIFNSQVRJT05BTCwKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBXaGl0ZUxldmVsCisgICAgICAgICJXaGl0ZUxldmVsIiwKKyAgICAgICAgMHhDNjFEdSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBEZWZhdWx0U2NhbGUKKyAgICAgICAgIkRlZmF1bHRTY2FsZSIsCisgICAgICAgIDB4QzYxRXUsCisgICAgICAgIFJBVElPTkFMLAorICAgICAgICBSQVdfSUZELAorICAgICAgICAyLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEJlc3RRdWFsaXR5U2NhbGUKKyAgICAgICAgIkJlc3RRdWFsaXR5U2NhbGUiLAorICAgICAgICAweEM2NUN1LAorICAgICAgICBSQVRJT05BTCwKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBEZWZhdWx0Q3JvcE9yaWdpbgorICAgICAgICAiRGVmYXVsdENyb3BPcmlnaW4iLAorICAgICAgICAweEM2MUZ1LAorICAgICAgICBMT05HLAorICAgICAgICBSQVdfSUZELAorICAgICAgICAyLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIERlZmF1bHRDcm9wU2l6ZQorICAgICAgICAiRGVmYXVsdENyb3BTaXplIiwKKyAgICAgICAgMHhDNjIwdSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgMiwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDYWxpYnJhdGlvbklsbHVtaW5hbnQxCisgICAgICAgICJDYWxpYnJhdGlvbklsbHVtaW5hbnQxIiwKKyAgICAgICAgMHhDNjVBdSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIENhbGlicmF0aW9uSWxsdW1pbmFudDIKKyAgICAgICAgIkNhbGlicmF0aW9uSWxsdW1pbmFudDIiLAorICAgICAgICAweEM2NUJ1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgUFJPRklMRV9JRkQsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQ29sb3JNYXRyaXgxCisgICAgICAgICJDb2xvck1hdHJpeDEiLAorICAgICAgICAweEM2MjF1LAorICAgICAgICBTUkFUSU9OQUwsCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIENvbG9yTWF0cml4MgorICAgICAgICAiQ29sb3JNYXRyaXgyIiwKKyAgICAgICAgMHhDNjIydSwKKyAgICAgICAgU1JBVElPTkFMLAorICAgICAgICBQUk9GSUxFX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDYW1lcmFDYWxpYnJhdGlvbjEKKyAgICAgICAgIkNhbWVyYUNhbGlicmF0aW9uMSIsCisgICAgICAgIDB4QzYyM3UsCisgICAgICAgIFNSQVRJT05BTCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQ2FtZXJhQ2FsaWJyYXRpb24yCisgICAgICAgICJDYW1lcmFDYWxpYnJhdGlvbjIiLAorICAgICAgICAweEM2MjR1LAorICAgICAgICBTUkFUSU9OQUwsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFJlZHVjdGlvbk1hdHJpeDEKKyAgICAgICAgIlJlZHVjdGlvbk1hdHJpeDEiLAorICAgICAgICAweEM2MjV1LAorICAgICAgICBTUkFUSU9OQUwsCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFJlZHVjdGlvbk1hdHJpeDIKKyAgICAgICAgIlJlZHVjdGlvbk1hdHJpeDIiLAorICAgICAgICAweEM2MjZ1LAorICAgICAgICBTUkFUSU9OQUwsCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEFuYWxvZ0JhbGFuY2UKKyAgICAgICAgIkFuYWxvZ0JhbGFuY2UiLAorICAgICAgICAweEM2Mjd1LAorICAgICAgICBSQVRJT05BTCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQXNTaG90TmV1dHJhbAorICAgICAgICAiQXNTaG90TmV1dHJhbCIsCisgICAgICAgIDB4QzYyOHUsCisgICAgICAgIFJBVElPTkFMLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBBc1Nob3RXaGl0ZVhZCisgICAgICAgICJBc1Nob3RXaGl0ZVhZIiwKKyAgICAgICAgMHhDNjI5dSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIElGRF8wLAorICAgICAgICAyLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEJhc2VsaW5lRXhwb3N1cmUKKyAgICAgICAgIkJhc2VsaW5lRXhwb3N1cmUiLAorICAgICAgICAweEM2MkF1LAorICAgICAgICBTUkFUSU9OQUwsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEJhc2VsaW5lTm9pc2UKKyAgICAgICAgIkJhc2VsaW5lTm9pc2UiLAorICAgICAgICAweEM2MkJ1LAorICAgICAgICBSQVRJT05BTCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQmFzZWxpbmVTaGFycG5lc3MKKyAgICAgICAgIkJhc2VsaW5lU2hhcnBuZXNzIiwKKyAgICAgICAgMHhDNjJDdSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEJheWVyR3JlZW5TcGxpdAorICAgICAgICAiQmF5ZXJHcmVlblNwbGl0IiwKKyAgICAgICAgMHhDNjJEdSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBMaW5lYXJSZXNwb25zZUxpbWl0CisgICAgICAgICJMaW5lYXJSZXNwb25zZUxpbWl0IiwKKyAgICAgICAgMHhDNjJFdSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIENhbWVyYVNlcmlhbE51bWJlcgorICAgICAgICAiQ2FtZXJhU2VyaWFsTnVtYmVyIiwKKyAgICAgICAgMHhDNjJGdSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIExlbnNJbmZvCisgICAgICAgICJMZW5zSW5mbyIsCisgICAgICAgIDB4QzYzMHUsCisgICAgICAgIFJBVElPTkFMLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgNCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDaHJvbWFCbHVyUmFkaXVzCisgICAgICAgICJDaHJvbWFCbHVyUmFkaXVzIiwKKyAgICAgICAgMHhDNjMxdSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQW50aUFsaWFzU3RyZW5ndGgKKyAgICAgICAgIkFudGlBbGlhc1N0cmVuZ3RoIiwKKyAgICAgICAgMHhDNjMydSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gU2hhZG93U2NhbGUKKyAgICAgICAgIlNoYWRvd1NjYWxlIiwKKyAgICAgICAgMHhDNjMzdSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEROR1ByaXZhdGVEYXRhCisgICAgICAgICJETkdQcml2YXRlRGF0YSIsCisgICAgICAgIDB4QzYzNHUsCisgICAgICAgIEJZVEUsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIE1ha2VyTm90ZVNhZmV0eQorICAgICAgICAiTWFrZXJOb3RlU2FmZXR5IiwKKyAgICAgICAgMHhDNjM1dSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFJhd0RhdGFVbmlxdWVJRAorICAgICAgICAiUmF3RGF0YVVuaXF1ZUlEIiwKKyAgICAgICAgMHhDNjVEdSwKKyAgICAgICAgQllURSwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDE2LAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIE9yaWdpbmFsUmF3RmlsZU5hbWUKKyAgICAgICAgIk9yaWdpbmFsUmF3RmlsZU5hbWUiLAorICAgICAgICAweEM2OEJ1LAorICAgICAgICBBU0NJSSwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gT3JpZ2luYWxSYXdGaWxlRGF0YQorICAgICAgICAiT3JpZ2luYWxSYXdGaWxlRGF0YSIsCisgICAgICAgIDB4QzY4Q3UsCisgICAgICAgIFVOREVGSU5FRCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIEJJRworICAgIH0sCisgICAgeyAvLyBBY3RpdmVBcmVhCisgICAgICAgICJBY3RpdmVBcmVhIiwKKyAgICAgICAgMHhDNjhEdSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgNCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBNYXNrZWRBcmVhcworICAgICAgICAiTWFza2VkQXJlYXMiLAorICAgICAgICAweEM2OEV1LAorICAgICAgICBMT05HLAorICAgICAgICBSQVdfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEFzU2hvdElDQ1Byb2ZpbGUKKyAgICAgICAgIkFzU2hvdElDQ1Byb2ZpbGUiLAorICAgICAgICAweEM2OEZ1LAorICAgICAgICBVTkRFRklORUQsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEFzU2hvdFByZVByb2ZpbGVNYXRyaXgKKyAgICAgICAgIkFzU2hvdFByZVByb2ZpbGVNYXRyaXgiLAorICAgICAgICAweEM2OTB1LAorICAgICAgICBTUkFUSU9OQUwsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEN1cnJlbnRJQ0NQcm9maWxlCisgICAgICAgICJDdXJyZW50SUNDUHJvZmlsZSIsCisgICAgICAgIDB4QzY5MXUsCisgICAgICAgIFVOREVGSU5FRCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQ3VycmVudElDQ1Byb2ZpbGUKKyAgICAgICAgIkN1cnJlbnRJQ0NQcm9maWxlIiwKKyAgICAgICAgMHhDNjkxdSwKKyAgICAgICAgVU5ERUZJTkVELAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDdXJyZW50UHJlUHJvZmlsZU1hdHJpeAorICAgICAgICAiQ3VycmVudFByZVByb2ZpbGVNYXRyaXgiLAorICAgICAgICAweEM2OTJ1LAorICAgICAgICBTUkFUSU9OQUwsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIENvbG9yaW1ldHJpY1JlZmVyZW5jZQorICAgICAgICAiQ29sb3JpbWV0cmljUmVmZXJlbmNlIiwKKyAgICAgICAgMHhDNkJGdSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIENhbWVyYUNhbGlicmF0aW9uU2lnbmF0dXJlCisgICAgICAgICJDYW1lcmFDYWxpYnJhdGlvblNpZ25hdHVyZSIsCisgICAgICAgIDB4QzZGM3UsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBQcm9maWxlQ2FsaWJyYXRpb25TaWduYXR1cmUKKyAgICAgICAgIlByb2ZpbGVDYWxpYnJhdGlvblNpZ25hdHVyZSIsCisgICAgICAgIDB4QzZGNHUsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBQUk9GSUxFX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBFeHRyYUNhbWVyYVByb2ZpbGVzCisgICAgICAgICJFeHRyYUNhbWVyYVByb2ZpbGVzIiwKKyAgICAgICAgMHhDNkY1dSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQXNTaG90UHJvZmlsZU5hbWUKKyAgICAgICAgIkFzU2hvdFByb2ZpbGVOYW1lIiwKKyAgICAgICAgMHhDNkY2dSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIE5vaXNlUmVkdWN0aW9uQXBwbGllZAorICAgICAgICAiTm9pc2VSZWR1Y3Rpb25BcHBsaWVkIiwKKyAgICAgICAgMHhDNkY3dSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUHJvZmlsZU5hbWUKKyAgICAgICAgIlByb2ZpbGVOYW1lIiwKKyAgICAgICAgMHhDNkY4dSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFByb2ZpbGVIdWVTYXRNYXBEaW1zCisgICAgICAgICJQcm9maWxlSHVlU2F0TWFwRGltcyIsCisgICAgICAgIDB4QzZGOXUsCisgICAgICAgIExPTkcsCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAzLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFByb2ZpbGVIdWVTYXRNYXBEYXRhMQorICAgICAgICAiUHJvZmlsZUh1ZVNhdE1hcERhdGExIiwKKyAgICAgICAgMHhDNkZBdSwKKyAgICAgICAgRkxPQVQsCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFByb2ZpbGVIdWVTYXRNYXBEYXRhMgorICAgICAgICAiUHJvZmlsZUh1ZVNhdE1hcERhdGEyIiwKKyAgICAgICAgMHhDNkZCdSwKKyAgICAgICAgRkxPQVQsCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFByb2ZpbGVUb25lQ3VydmUKKyAgICAgICAgIlByb2ZpbGVUb25lQ3VydmUiLAorICAgICAgICAweEM2RkN1LAorICAgICAgICBGTE9BVCwKKyAgICAgICAgUFJPRklMRV9JRkQsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUHJvZmlsZUVtYmVkUG9saWN5CisgICAgICAgICJQcm9maWxlRW1iZWRQb2xpY3kiLAorICAgICAgICAweEM2RkR1LAorICAgICAgICBMT05HLAorICAgICAgICBQUk9GSUxFX0lGRCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBQcm9maWxlQ29weXJpZ2h0CisgICAgICAgICJQcm9maWxlQ29weXJpZ2h0IiwKKyAgICAgICAgMHhDNkZFdSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEZvcndhcmRNYXRyaXgxCisgICAgICAgICJGb3J3YXJkTWF0cml4MSIsCisgICAgICAgIDB4QzcxNHUsCisgICAgICAgIFNSQVRJT05BTCwKKyAgICAgICAgUFJPRklMRV9JRkQsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gRm9yd2FyZE1hdHJpeDIKKyAgICAgICAgIkZvcndhcmRNYXRyaXgyIiwKKyAgICAgICAgMHhDNzE1dSwKKyAgICAgICAgU1JBVElPTkFMLAorICAgICAgICBQUk9GSUxFX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBQcmV2aWV3QXBwbGljYXRpb25OYW1lCisgICAgICAgICJQcmV2aWV3QXBwbGljYXRpb25OYW1lIiwKKyAgICAgICAgMHhDNzE2dSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIFBSRVZJRVdfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFByZXZpZXdBcHBsaWNhdGlvblZlcnNpb24KKyAgICAgICAgIlByZXZpZXdBcHBsaWNhdGlvblZlcnNpb24iLAorICAgICAgICAweEM3MTd1LAorICAgICAgICBBU0NJSSwKKyAgICAgICAgUFJFVklFV19JRkQsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUHJldmlld1NldHRpbmdzTmFtZQorICAgICAgICAiUHJldmlld1NldHRpbmdzTmFtZSIsCisgICAgICAgIDB4QzcxOHUsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBQUkVWSUVXX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBQcmV2aWV3U2V0dGluZ3NEaWdlc3QKKyAgICAgICAgIlByZXZpZXdTZXR0aW5nc0RpZ2VzdCIsCisgICAgICAgIDB4QzcxOXUsCisgICAgICAgIEJZVEUsCisgICAgICAgIFBSRVZJRVdfSUZELAorICAgICAgICAxNiwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBQcmV2aWV3Q29sb3JTcGFjZQorICAgICAgICAiUHJldmlld0NvbG9yU3BhY2UiLAorICAgICAgICAweEM3MUF1LAorICAgICAgICBMT05HLAorICAgICAgICBQUkVWSUVXX0lGRCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBQcmV2aWV3RGF0ZVRpbWUKKyAgICAgICAgIlByZXZpZXdEYXRlVGltZSIsCisgICAgICAgIDB4QzcxQnUsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBQUkVWSUVXX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBSYXdJbWFnZURpZ2VzdAorICAgICAgICAiUmF3SW1hZ2VEaWdlc3QiLAorICAgICAgICAweEM3MUN1LAorICAgICAgICBCWVRFLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMTYsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gT3JpZ2luYWxSYXdGaWxlRGlnZXN0CisgICAgICAgICJPcmlnaW5hbFJhd0ZpbGVEaWdlc3QiLAorICAgICAgICAweEM3MUR1LAorICAgICAgICBCWVRFLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMTYsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gU3ViVGlsZUJsb2NrU2l6ZQorICAgICAgICAiU3ViVGlsZUJsb2NrU2l6ZSIsCisgICAgICAgIDB4QzcxRXUsCisgICAgICAgIExPTkcsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDIsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUm93SW50ZXJsZWF2ZUZhY3RvcgorICAgICAgICAiUm93SW50ZXJsZWF2ZUZhY3RvciIsCisgICAgICAgIDB4QzcxRnUsCisgICAgICAgIExPTkcsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUHJvZmlsZUxvb2tUYWJsZURpbXMKKyAgICAgICAgIlByb2ZpbGVMb29rVGFibGVEaW1zIiwKKyAgICAgICAgMHhDNzI1dSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgUFJPRklMRV9JRkQsCisgICAgICAgIDMsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUHJvZmlsZUxvb2tUYWJsZURhdGEKKyAgICAgICAgIlByb2ZpbGVMb29rVGFibGVEYXRhIiwKKyAgICAgICAgMHhDNzI2dSwKKyAgICAgICAgRkxPQVQsCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIE9wY29kZUxpc3QxCisgICAgICAgICJPcGNvZGVMaXN0MSIsCisgICAgICAgIDB4Qzc0MHUsCisgICAgICAgIFVOREVGSU5FRCwKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgQklHCisgICAgfSwKKyAgICB7IC8vIE9wY29kZUxpc3QyCisgICAgICAgICJPcGNvZGVMaXN0MiIsCisgICAgICAgIDB4Qzc0MXUsCisgICAgICAgIFVOREVGSU5FRCwKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgQklHCisgICAgfSwKKyAgICB7IC8vIE9wY29kZUxpc3QzCisgICAgICAgICJPcGNvZGVMaXN0MyIsCisgICAgICAgIDB4Qzc0RXUsCisgICAgICAgIFVOREVGSU5FRCwKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgQklHCisgICAgfSwKKyAgICB7IC8vIE5vaXNlUHJvZmlsZQorICAgICAgICAiTm9pc2VQcm9maWxlIiwKKyAgICAgICAgMHhDNzYxdSwKKyAgICAgICAgRE9VQkxFLAorICAgICAgICBSQVdfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIERlZmF1bHRVc2VyQ3JvcAorICAgICAgICAiRGVmYXVsdFVzZXJDcm9wIiwKKyAgICAgICAgMHhDN0I1dSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDQsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gRGVmYXVsdEJsYWNrUmVuZGVyCisgICAgICAgICJEZWZhdWx0QmxhY2tSZW5kZXIiLAorICAgICAgICAweEM3QTZ1LAorICAgICAgICBMT05HLAorICAgICAgICBQUk9GSUxFX0lGRCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBCYXNlbGluZUV4cG9zdXJlT2Zmc2V0CisgICAgICAgICJCYXNlbGluZUV4cG9zdXJlT2Zmc2V0IiwKKyAgICAgICAgMHhDN0E1dSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFByb2ZpbGVMb29rVGFibGVFbmNvZGluZworICAgICAgICAiUHJvZmlsZUxvb2tUYWJsZUVuY29kaW5nIiwKKyAgICAgICAgMHhDN0E0dSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgUFJPRklMRV9JRkQsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUHJvZmlsZUh1ZVNhdE1hcEVuY29kaW5nCisgICAgICAgICJQcm9maWxlSHVlU2F0TWFwRW5jb2RpbmciLAorICAgICAgICAweEM3QTN1LAorICAgICAgICBMT05HLAorICAgICAgICBQUk9GSUxFX0lGRCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBPcmlnaW5hbERlZmF1bHRGaW5hbFNpemUKKyAgICAgICAgIk9yaWdpbmFsRGVmYXVsdEZpbmFsU2l6ZSIsCisgICAgICAgIDB4Qzc5MXUsCisgICAgICAgIExPTkcsCisgICAgICAgIElGRF8wLAorICAgICAgICAyLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIE9yaWdpbmFsQmVzdFF1YWxpdHlGaW5hbFNpemUKKyAgICAgICAgIk9yaWdpbmFsQmVzdFF1YWxpdHlGaW5hbFNpemUiLAorICAgICAgICAweEM3OTJ1LAorICAgICAgICBMT05HLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMiwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBPcmlnaW5hbERlZmF1bHRDcm9wU2l6ZQorICAgICAgICAiT3JpZ2luYWxEZWZhdWx0Q3JvcFNpemUiLAorICAgICAgICAweEM3OTN1LAorICAgICAgICBMT05HLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMiwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBOZXdSYXdJbWFnZURpZ2VzdAorICAgICAgICAiTmV3UmF3SW1hZ2VEaWdlc3QiLAorICAgICAgICAweEM3QTd1LAorICAgICAgICBCWVRFLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMTYsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUmF3VG9QcmV2aWV3R2FpbgorICAgICAgICAiUmF3VG9QcmV2aWV3R2FpbiIsCisgICAgICAgIDB4QzdBOHUsCisgICAgICAgIERPVUJMRSwKKyAgICAgICAgUFJFVklFV19JRkQsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorfTsKKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KKworI2VuZGlmIC8qSU1HX1VUSUxTX1RJRkZfVEFHX0RFRklOSVRJT05fSCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvVGlmZkVudHJ5LmggYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvVGlmZkVudHJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ2NzJiMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9UaWZmRW50cnkuaApAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTUdfVVRJTFNfVElGRl9FTlRSWQorI2RlZmluZSBJTUdfVVRJTFNfVElGRl9FTlRSWQorCisjaW5jbHVkZSA8aW1nX3V0aWxzL1RpZmZXcml0YWJsZS5oPgorI2luY2x1ZGUgPGltZ191dGlscy9UaWZmSGVscGVycy5oPgorI2luY2x1ZGUgPGltZ191dGlscy9FbmRpYW5VdGlscy5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworI2RlZmluZSBDT01QQVJFX0RFRihvcCkgXAoraW5saW5lIGJvb2wgb3BlcmF0b3Igb3AgKGNvbnN0IFRpZmZFbnRyeSYgZW50cnkpIGNvbnN0OworCisvKioKKyAqIFRoaXMgY2xhc3MgaG9sZHMgYSBzaW5nbGUgVElGRiBJRkQgZW50cnkuCisgKgorICogU3ViY2xhc3NlcyBhcmUgZXhwZWN0ZWQgdG8gc3VwcG9ydCBhc3NpZ25tZW50IGFuZCBjb3B5aW5nIG9wZXJhdGlvbnMuCisgKi8KK2NsYXNzIEFORFJPSURfQVBJIFRpZmZFbnRyeSA6IHB1YmxpYyBUaWZmV3JpdGFibGUgeworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB+VGlmZkVudHJ5KCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdyaXRlIHRoZSAxMi1ieXRlIElGRCBlbnRyeSB0byB0aGUgb3V0cHV0LiBUaGUgZ2l2ZW4gb2Zmc2V0IHdpbGwgYmUKKyAgICAgICAgICogc2V0IGFzIHRoZSB0YWcgdmFsdWUgaWYgdGhlIHNpemUgb2YgdGhlIHRhZyB2YWx1ZSBleGNlZWRzIHRoZSBtYXgKKyAgICAgICAgICogc2l6ZSBmb3IgdGhlIFRJRkYgVmFsdWUgZmllbGQgKDQgYnl0ZXMpLCBhbmQgc2hvdWxkIGJlIHdvcmQgYWxpZ25lZC4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGVUYWdJbmZvKHVpbnQzMl90IG9mZnNldCwgLypvdXQqL0VuZGlhbk91dHB1dCogb3V0KSBjb25zdCA9IDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgY291bnQgc2V0IGZvciB0aGlzIGVudHJ5LiBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBUSUZGIENvdW50CisgICAgICAgICAqIGZpZWxkLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRDb3VudCgpIGNvbnN0ID0gMDsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSB0YWcgaWQgc2V0IGZvciB0aGlzIGVudHJ5LiBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBUSUZGIFRhZworICAgICAgICAgKiBmaWVsZC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgdWludDE2X3QgZ2V0VGFnKCkgY29uc3QgPSAwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIHR5cGUgc2V0IGZvciB0aGlzIGVudHJ5LiAgVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgVElGRiBUeXBlCisgICAgICAgICAqIGZpZWxkLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBUYWdUeXBlIGdldFR5cGUoKSBjb25zdCA9IDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgZGVmaW5lZCBlbmRpYW5uZXNzIGZvciB0aGlzIGVudHJ5LiAgSWYgdGhpcyBpcyBkZWZpbmVkLAorICAgICAgICAgKiB0aGUgdGFnIHZhbHVlIHdpbGwgYmUgd3JpdHRlbiB3aXRoIHRoZSBnaXZlbiBieXRlIG9yZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBFbmRpYW5uZXNzIGdldEVuZGlhbm5lc3MoKSBjb25zdCA9IDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoaXMgZW50cnkuICBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBUSUZGIFZhbHVlCisgICAgICAgICAqIGZpZWxkLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE5VTEwgaWYgdGhlIHZhbHVlIGlzIE5VTEwsIG9yIGlmIHRoZSB0eXBlIHVzZWQgZG9lcyBub3QKKyAgICAgICAgICogbWF0Y2ggdGhlIHR5cGUgb2YgdGhpcyB0YWcuCisgICAgICAgICAqLworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBjb25zdCBUKiBnZXREYXRhKCkgY29uc3Q7CisKKyAgICAgICAgdmlydHVhbCBTdHJpbmc4IHRvU3RyaW5nKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZvcmNlIHRoZSB0eXBlIHVzZWQgaGVyZSB0byBiZSBhIHZhbGlkIFRJRkYgdHlwZS4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBOVUxMIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBOVUxMLCBvciBpZiB0aGUgdHlwZSBnaXZlbiBkb2VzCisgICAgICAgICAqIG5vdCBtYXRjaCB0aGUgdHlwZSBvZiB0aGUgdmFsdWUgZ2l2ZW4uCisgICAgICAgICAqLworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBzdGF0aWMgY29uc3QgVCogZm9yY2VWYWxpZFR5cGUoVGFnVHlwZSB0eXBlLCBjb25zdCBUKiB2YWx1ZSk7CisKKyAgICAgICAgdmlydHVhbCBjb25zdCB2b2lkKiBnZXREYXRhSGVscGVyKCkgY29uc3QgPSAwOworCisgICAgICAgIENPTVBBUkVfREVGKD4pCisgICAgICAgIENPTVBBUkVfREVGKDwpCisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIGVudW0geworICAgICAgICAgICAgTUFYX1BSSU5UX1NUUklOR19MRU5HVEggPSAyNTYKKyAgICAgICAgfTsKK307CisKKyNkZWZpbmUgQ09NUEFSRShvcCkgXAorYm9vbCBUaWZmRW50cnk6Om9wZXJhdG9yIG9wIChjb25zdCBUaWZmRW50cnkmIGVudHJ5KSBjb25zdCB7IFwKKyAgICByZXR1cm4gZ2V0Q29tcGFyYWJsZVZhbHVlKCkgb3AgZW50cnkuZ2V0Q29tcGFyYWJsZVZhbHVlKCk7IFwKK30KKworQ09NUEFSRSg+KQorQ09NUEFSRSg8KQorCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citjb25zdCBUKiBUaWZmRW50cnk6OmdldERhdGEoKSBjb25zdCB7CisgICAgY29uc3QgVCogdmFsdWUgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFQqPihnZXREYXRhSGVscGVyKCkpOworICAgIHJldHVybiBmb3JjZVZhbGlkVHlwZTxUPihnZXRUeXBlKCksIHZhbHVlKTsKK30KKworI3VuZGVmIENPTVBBUkUKKyN1bmRlZiBDT01QQVJFX0RFRgorCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLworCisjZW5kaWYgLypJTUdfVVRJTFNfVElGRl9FTlRSWSovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvVGlmZkVudHJ5SW1wbC5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1RpZmZFbnRyeUltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWNjYjVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1RpZmZFbnRyeUltcGwuaApAQCAtMCwwICsxLDIxOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTUdfVVRJTFNfVElGRl9FTlRSWV9JTVBMCisjZGVmaW5lIElNR19VVElMU19USUZGX0VOVFJZX0lNUEwKKworI2luY2x1ZGUgPGltZ191dGlscy9UaWZmSWZkLmg+CisjaW5jbHVkZSA8aW1nX3V0aWxzL1RpZmZFbnRyeS5oPgorI2luY2x1ZGUgPGltZ191dGlscy9UaWZmSGVscGVycy5oPgorI2luY2x1ZGUgPGltZ191dGlscy9PdXRwdXQuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvRW5kaWFuVXRpbHMuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBUaWZmRW50cnlJbXBsIDogcHVibGljIFRpZmZFbnRyeSB7CisgICAgcHVibGljOgorICAgICAgICBUaWZmRW50cnlJbXBsKHVpbnQxNl90IHRhZywgVGFnVHlwZSB0eXBlLCB1aW50MzJfdCBjb3VudCwgRW5kaWFubmVzcyBlbmQsIGNvbnN0IFQqIGRhdGEpOworICAgICAgICB2aXJ0dWFsIH5UaWZmRW50cnlJbXBsKCk7CisKKyAgICAgICAgc3RhdHVzX3Qgd3JpdGVEYXRhKHVpbnQzMl90IG9mZnNldCwgLypvdXQqL0VuZGlhbk91dHB1dCogb3V0KSBjb25zdDsKKyAgICAgICAgc3RhdHVzX3Qgd3JpdGVUYWdJbmZvKHVpbnQzMl90IG9mZnNldCwgLypvdXQqL0VuZGlhbk91dHB1dCogb3V0KSBjb25zdDsKKworICAgICAgICB1aW50MzJfdCBnZXRDb3VudCgpIGNvbnN0OworICAgICAgICB1aW50MTZfdCBnZXRUYWcoKSBjb25zdDsKKyAgICAgICAgVGFnVHlwZSBnZXRUeXBlKCkgY29uc3Q7CisgICAgICAgIEVuZGlhbm5lc3MgZ2V0RW5kaWFubmVzcygpIGNvbnN0OworICAgICAgICBzaXplX3QgZ2V0U2l6ZSgpIGNvbnN0OworICAgICAgICB1aW50MzJfdCBnZXRDb21wYXJhYmxlVmFsdWUoKSBjb25zdDsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgY29uc3Qgdm9pZCogZ2V0RGF0YUhlbHBlcigpIGNvbnN0OworICAgICAgICB1aW50MzJfdCBnZXRBY3R1YWxTaXplKCkgY29uc3Q7CisKKyAgICAgICAgdWludDE2X3QgbVRhZzsKKyAgICAgICAgdWludDE2X3QgbVR5cGU7CisgICAgICAgIHVpbnQzMl90IG1Db3VudDsKKyAgICAgICAgRW5kaWFubmVzcyBtRW5kOworICAgICAgICBWZWN0b3I8VD4gbURhdGE7CisKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitUaWZmRW50cnlJbXBsPFQ+OjpUaWZmRW50cnlJbXBsKHVpbnQxNl90IHRhZywgVGFnVHlwZSB0eXBlLCB1aW50MzJfdCBjb3VudCwgRW5kaWFubmVzcyBlbmQsCisgICAgICAgIGNvbnN0IFQqIGRhdGEpCisgICAgICAgIDogbVRhZyh0YWcpLCBtVHlwZShzdGF0aWNfY2FzdDx1aW50MTZfdD4odHlwZSkpLCBtQ291bnQoY291bnQpLCBtRW5kKGVuZCkgeworICAgIGNvdW50ID0gKHR5cGUgPT0gUkFUSU9OQUwgfHwgdHlwZSA9PSBTUkFUSU9OQUwpID8gY291bnQgKiAyIDogY291bnQ7CisgICAgc3NpemVfdCBpbmRleCA9IG1EYXRhLmFwcGVuZEFycmF5KGRhdGEsIGNvdW50KTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGluZGV4IDwgMCwgIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgdmVjdG9yIGZvciBkYXRhLiIsIF9fRlVOQ1RJT05fXyk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitUaWZmRW50cnlJbXBsPFQ+Ojp+VGlmZkVudHJ5SW1wbCgpIHt9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit1aW50MzJfdCBUaWZmRW50cnlJbXBsPFQ+OjpnZXRDb3VudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUNvdW50OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgordWludDE2X3QgVGlmZkVudHJ5SW1wbDxUPjo6Z2V0VGFnKCkgY29uc3QgeworICAgIHJldHVybiBtVGFnOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorVGFnVHlwZSBUaWZmRW50cnlJbXBsPFQ+OjpnZXRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxUYWdUeXBlPihtVHlwZSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citjb25zdCB2b2lkKiBUaWZmRW50cnlJbXBsPFQ+OjpnZXREYXRhSGVscGVyKCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihtRGF0YS5hcnJheSgpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3NpemVfdCBUaWZmRW50cnlJbXBsPFQ+OjpnZXRTaXplKCkgY29uc3QgeworICAgIHVpbnQzMl90IHRvdGFsID0gZ2V0QWN0dWFsU2l6ZSgpOworICAgIFdPUkRfQUxJR04odG90YWwpCisgICAgcmV0dXJuICh0b3RhbCA8PSBPRkZTRVRfU0laRSkgPyAwIDogdG90YWw7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit1aW50MzJfdCBUaWZmRW50cnlJbXBsPFQ+OjpnZXRBY3R1YWxTaXplKCkgY29uc3QgeworICAgIHVpbnQzMl90IHRvdGFsID0gc2l6ZW9mKFQpICogbUNvdW50OworICAgIGlmIChnZXRUeXBlKCkgPT0gUkFUSU9OQUwgfHwgZ2V0VHlwZSgpID09IFNSQVRJT05BTCkgeworICAgICAgICAvLyAyIGludHMgc3RvcmVkIGZvciBlYWNoIHJhdGlvbmFsLCBtdWx0aXBseSBieSAyCisgICAgICAgIHRvdGFsIDw8PSAxOworICAgIH0KKyAgICByZXR1cm4gdG90YWw7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitFbmRpYW5uZXNzIFRpZmZFbnRyeUltcGw8VD46OmdldEVuZGlhbm5lc3MoKSBjb25zdCB7CisgICAgcmV0dXJuIG1FbmQ7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit1aW50MzJfdCBUaWZmRW50cnlJbXBsPFQ+OjpnZXRDb21wYXJhYmxlVmFsdWUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1UYWc7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGF0dXNfdCBUaWZmRW50cnlJbXBsPFQ+Ojp3cml0ZVRhZ0luZm8odWludDMyX3Qgb2Zmc2V0LCAvKm91dCovRW5kaWFuT3V0cHV0KiBvdXQpIGNvbnN0IHsKKyAgICBhc3NlcnQoKG9mZnNldCAlIFRJRkZfV09SRF9TSVpFKSA9PSAwKTsKKyAgICBzdGF0dXNfdCByZXQgPSBPSzsKKyAgICBCQUlMX09OX0ZBSUwob3V0LT53cml0ZSgmbVRhZywgMCwgMSksIHJldCk7CisgICAgQkFJTF9PTl9GQUlMKG91dC0+d3JpdGUoJm1UeXBlLCAwLCAxKSwgcmV0KTsKKyAgICBCQUlMX09OX0ZBSUwob3V0LT53cml0ZSgmbUNvdW50LCAwLCAxKSwgcmV0KTsKKworICAgIHVpbnQzMl90IGRhdGFTaXplID0gZ2V0QWN0dWFsU2l6ZSgpOworICAgIGlmIChkYXRhU2l6ZSA+IE9GRlNFVF9TSVpFKSB7CisgICAgICAgIEJBSUxfT05fRkFJTChvdXQtPndyaXRlKCZvZmZzZXQsIDAsIDEpLCByZXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHVpbnQzMl90IGNvdW50ID0gbUNvdW50OworICAgICAgICBpZiAoZ2V0VHlwZSgpID09IFJBVElPTkFMIHx8IGdldFR5cGUoKSA9PSBTUkFUSU9OQUwpIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogUmF0aW9uYWxzIGFyZSBzdG9yZWQgYXMgYW4gYXJyYXkgb2YgaW50cy4gIEVhY2gKKyAgICAgICAgICAgICAqIHJhdGlvbmFsIGlzIHJlcHJlc2VudGVkIGJ5IDIgaW50cy4gIFRvIHJlY292ZXIgdGhlCisgICAgICAgICAgICAgKiBzaXplIG9mIHRoZSBhcnJheSBoZXJlLCBtdWx0aXBseSB0aGUgY291bnQgYnkgMi4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgY291bnQgPDw9IDE7CisgICAgICAgIH0KKyAgICAgICAgQkFJTF9PTl9GQUlMKG91dC0+d3JpdGUobURhdGEuYXJyYXkoKSwgMCwgY291bnQpLCByZXQpOworICAgICAgICBaRVJPX1RJTExfV09SRChvdXQsIGRhdGFTaXplLCByZXQpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RhdHVzX3QgVGlmZkVudHJ5SW1wbDxUPjo6d3JpdGVEYXRhKHVpbnQzMl90IG9mZnNldCwgRW5kaWFuT3V0cHV0KiBvdXQpIGNvbnN0IHsKKyAgICBzdGF0dXNfdCByZXQgPSBPSzsKKworICAgIC8vIFNvbWUgdGFncyBoYXZlIGZpeGVkLWVuZGlhbiB2YWx1ZSBvdXRwdXQKKyAgICBFbmRpYW5uZXNzIHRtcCA9IFVOREVGSU5FRF9FTkRJQU47CisgICAgaWYgKG1FbmQgIT0gVU5ERUZJTkVEX0VORElBTikgeworICAgICAgICB0bXAgPSBvdXQtPmdldEVuZGlhbm5lc3MoKTsKKyAgICAgICAgb3V0LT5zZXRFbmRpYW5uZXNzKG1FbmQpOworICAgIH0KKworICAgIHVpbnQzMl90IGNvdW50ID0gbUNvdW50OworICAgIGlmIChnZXRUeXBlKCkgPT0gUkFUSU9OQUwgfHwgZ2V0VHlwZSgpID09IFNSQVRJT05BTCkgeworICAgICAgICAvKioKKyAgICAgICAgICogUmF0aW9uYWxzIGFyZSBzdG9yZWQgYXMgYW4gYXJyYXkgb2YgaW50cy4gIEVhY2gKKyAgICAgICAgICogcmF0aW9uYWwgaXMgcmVwcmVzZW50ZWQgYnkgMiBpbnRzLiAgVG8gcmVjb3ZlciB0aGUKKyAgICAgICAgICogc2l6ZSBvZiB0aGUgYXJyYXkgaGVyZSwgbXVsdGlwbHkgdGhlIGNvdW50IGJ5IDIuCisgICAgICAgICAqLworICAgICAgICBjb3VudCA8PD0gMTsKKyAgICB9CisKKyAgICBCQUlMX09OX0ZBSUwob3V0LT53cml0ZShtRGF0YS5hcnJheSgpLCAwLCBjb3VudCksIHJldCk7CisKKyAgICBpZiAobUVuZCAhPSBVTkRFRklORURfRU5ESUFOKSB7CisgICAgICAgIG91dC0+c2V0RW5kaWFubmVzcyh0bXApOworICAgIH0KKworICAgIC8vIFdyaXRlIHRvIG5leHQgd29yZCBhbGlnbm1lbnQKKyAgICBaRVJPX1RJTExfV09SRChvdXQsIHNpemVvZihUKSAqIGNvdW50LCByZXQpOworICAgIHJldHVybiByZXQ7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSBzdGF0dXNfdCBUaWZmRW50cnlJbXBsPHNwPFRpZmZJZmQ+ID46OndyaXRlVGFnSW5mbyh1aW50MzJfdCBvZmZzZXQsCisgICAgICAgIC8qb3V0Ki9FbmRpYW5PdXRwdXQqIG91dCkgY29uc3QgeworICAgIGFzc2VydCgob2Zmc2V0ICUgVElGRl9XT1JEX1NJWkUpID09IDApOworICAgIHN0YXR1c190IHJldCA9IE9LOworICAgIEJBSUxfT05fRkFJTChvdXQtPndyaXRlKCZtVGFnLCAwLCAxKSwgcmV0KTsKKyAgICBCQUlMX09OX0ZBSUwob3V0LT53cml0ZSgmbVR5cGUsIDAsIDEpLCByZXQpOworICAgIEJBSUxfT05fRkFJTChvdXQtPndyaXRlKCZtQ291bnQsIDAsIDEpLCByZXQpOworCisgICAgQkFJTF9PTl9GQUlMKG91dC0+d3JpdGUoJm9mZnNldCwgMCwgMSksIHJldCk7CisgICAgcmV0dXJuIHJldDsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIHVpbnQzMl90IFRpZmZFbnRyeUltcGw8c3A8VGlmZklmZD4gPjo6Z2V0QWN0dWFsU2l6ZSgpIGNvbnN0IHsKKyAgICB1aW50MzJfdCB0b3RhbCA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRGF0YS5zaXplKCk7ICsraSkgeworICAgICAgICB0b3RhbCArPSBtRGF0YVtpXS0+Z2V0U2l6ZSgpOworICAgIH0KKyAgICByZXR1cm4gdG90YWw7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSBzdGF0dXNfdCBUaWZmRW50cnlJbXBsPHNwPFRpZmZJZmQ+ID46OndyaXRlRGF0YSh1aW50MzJfdCBvZmZzZXQsIEVuZGlhbk91dHB1dCogb3V0KSBjb25zdCB7CisgICAgc3RhdHVzX3QgcmV0ID0gT0s7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1Db3VudDsgKytpKSB7CisgICAgICAgIEJBSUxfT05fRkFJTChtRGF0YVtpXS0+d3JpdGVEYXRhKG9mZnNldCwgb3V0KSwgcmV0KTsKKyAgICAgICAgb2Zmc2V0ICs9IG1EYXRhW2ldLT5nZXRTaXplKCk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCisKKyNlbmRpZiAvKklNR19VVElMU19USUZGX0VOVFJZX0lNUEwqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9UaWZmSGVscGVycy5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1RpZmZIZWxwZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk2OWU0ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9UaWZmSGVscGVycy5oCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElNR19VVElMU19USUZGX0hFTFBFUlNfSAorI2RlZmluZSBJTUdfVVRJTFNfVElGRl9IRUxQRVJTX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworY29uc3QgdWludDhfdCBaRVJPX1dPUkRbXSA9IHswLCAwLCAwLCAwfTsKKworI2RlZmluZSBCQUlMX09OX0ZBSUwoeCwgZmxhZykgXAorICAgIGlmICgoZmxhZyA9ICh4KSkgIT0gT0spIHJldHVybiBmbGFnOworCisjZGVmaW5lIEJZVEVTX1RJTExfV09SRChpbmRleCkgXAorICAgICgoVElGRl9XT1JEX1NJWkUgLSAoKGluZGV4KSAlIFRJRkZfV09SRF9TSVpFKSkgJSBUSUZGX1dPUkRfU0laRSkKKworI2RlZmluZSBXT1JEX0FMSUdOKGNvdW50KSBcCisgICAgY291bnQgKz0gQllURVNfVElMTF9XT1JEKGNvdW50KTsKKworI2RlZmluZSBaRVJPX1RJTExfV09SRChvdXRwdXQsIGluZGV4LCByZXQpIFwKKyAgICB7IFwKKyAgICAgICAgc2l6ZV90IHJlbWFpbmluZyA9IEJZVEVTX1RJTExfV09SRChpbmRleCk7IFwKKyAgICAgICAgaWYgKHJlbWFpbmluZyA+IDApIHsgXAorICAgICAgICAgICAgQkFJTF9PTl9GQUlMKChvdXRwdXQpLT53cml0ZShaRVJPX1dPUkQsIDAsIHJlbWFpbmluZyksIHJldCk7IFwKKyAgICAgICAgfSBcCisgICAgfQorCisvKioKKyAqIEJhc2ljIFRJRkYgaGVhZGVyIGNvbnN0YW50cy4KKyAqLworZW51bSB7CisgICAgQkFEX09GRlNFVCA9IDAsCisgICAgVElGRl9XT1JEX1NJWkUgPSA0LCAvLyBTaXplIGluIGJ5dGVzCisgICAgSUZEX0hFQURFUl9TSVpFID0gMiwgLy8gU2l6ZSBpbiBieXRlcworICAgIElGRF9GT09URVJfU0laRSA9IDQsIC8vIFNpemUgaW4gYnl0ZXMKKyAgICBUSUZGX0VOVFJZX1NJWkUgPSAxMiwgLy8gU2l6ZSBpbiBieXRlcworICAgIE1BWF9JRkRfRU5UUklFUyA9IFVJTlQxNl9NQVgsCisgICAgRklMRV9IRUFERVJfU0laRSA9IDgsIC8vIFNpemUgaW4gYnl0ZXMKKyAgICBFTkRJQU5fTUFSS0VSX1NJWkUgPSAyLCAvLyBTaXplIGluIGJ5dGVzCisgICAgVElGRl9NQVJLRVJfU0laRSA9IDIsIC8vIFNpemUgaW4gYnl0ZXMKKyAgICBPRkZTRVRfTUFSS0VSX1NJWkUgPSA0LCAvLyBTaXplIGluIGJ5dGVzCisgICAgVElGRl9GSUxFX01BUktFUiA9IDQyLAorICAgIEJJR19FTkRJQU5fTUFSS0VSID0gMHg0RDREdSwKKyAgICBMSVRUTEVfRU5ESUFOX01BUktFUiA9IDB4NDk0OXUKK307CisKKy8qKgorICogQ29uc3RhbnRzIGZvciB0aGUgVElGRiB0YWcgdHlwZXMuCisgKi8KK2VudW0gVGFnVHlwZSB7CisgICAgVU5LTk9XTl9UQUdUWVBFID0gMCwKKyAgICBCWVRFPTEsCisgICAgQVNDSUksCisgICAgU0hPUlQsCisgICAgTE9ORywKKyAgICBSQVRJT05BTCwKKyAgICBTQllURSwKKyAgICBVTkRFRklORUQsCisgICAgU1NIT1JULAorICAgIFNMT05HLAorICAgIFNSQVRJT05BTCwKKyAgICBGTE9BVCwKKyAgICBET1VCTEUKK307CisKKy8qKgorICogU2l6ZXMgb2YgdGhlIFRJRkYgZW50cnkgZmllbGRzIChpbiBieXRlcykuCisgKi8KK2VudW0geworICAgIFRBR19TSVpFID0gMiwKKyAgICBUWVBFX1NJWkUgPSAyLAorICAgIENPVU5UX1NJWkUgPSA0LAorICAgIE9GRlNFVF9TSVpFID0gNAorfTsKKworLyoqCisgKiBDb252ZW5pZW5jZSBJRkQgaWQgY29uc3RhbnRzLgorICovCitlbnVtIHsKKyAgICBJRkRfMCA9IDAsCisgICAgUkFXX0lGRCwKKyAgICBQUk9GSUxFX0lGRCwKKyAgICBQUkVWSUVXX0lGRAorfTsKKworaW5saW5lIHNpemVfdCBnZXRUeXBlU2l6ZShUYWdUeXBlIHR5cGUpIHsKKyAgICBzd2l0Y2godHlwZSkgeworICAgICAgICBjYXNlIFVOREVGSU5FRDoKKyAgICAgICAgY2FzZSBBU0NJSToKKyAgICAgICAgY2FzZSBCWVRFOgorICAgICAgICBjYXNlIFNCWVRFOgorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGNhc2UgU0hPUlQ6CisgICAgICAgIGNhc2UgU1NIT1JUOgorICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIGNhc2UgTE9ORzoKKyAgICAgICAgY2FzZSBTTE9ORzoKKyAgICAgICAgY2FzZSBGTE9BVDoKKyAgICAgICAgICAgIHJldHVybiA0OworICAgICAgICBjYXNlIFJBVElPTkFMOgorICAgICAgICBjYXNlIFNSQVRJT05BTDoKKyAgICAgICAgY2FzZSBET1VCTEU6CisgICAgICAgICAgICByZXR1cm4gODsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworaW5saW5lIHVpbnQzMl90IGNhbGN1bGF0ZUlmZFNpemUoc2l6ZV90IG51bWJlck9mRW50cmllcykgeworICAgIHJldHVybiBJRkRfSEVBREVSX1NJWkUgKyBJRkRfRk9PVEVSX1NJWkUgKyBUSUZGX0VOVFJZX1NJWkUgKiBudW1iZXJPZkVudHJpZXM7Cit9CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCisKKyNlbmRpZiAvKklNR19VVElMU19USUZGX0hFTFBFUlNfSCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvVGlmZklmZC5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1RpZmZJZmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWI1YzlhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1RpZmZJZmQuaApAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTUdfVVRJTFNfVElGRl9JRkRfSAorI2RlZmluZSBJTUdfVVRJTFNfVElGRl9JRkRfSAorCisjaW5jbHVkZSA8aW1nX3V0aWxzL1RpZmZXcml0YWJsZS5oPgorI2luY2x1ZGUgPGltZ191dGlscy9UaWZmRW50cnkuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvT3V0cHV0Lmg+CisjaW5jbHVkZSA8aW1nX3V0aWxzL1NvcnRlZEVudHJ5VmVjdG9yLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworLyoqCisgKiBUaGlzIGNsYXNzIGhvbGRzIGEgc2luZ2xlIFRJRkYgSW1hZ2UgRmlsZSBEaXJlY3RvcnkgKElGRCkgc3RydWN0dXJlLgorICoKKyAqIFRoaXMgbWFwcyB0byB0aGUgVElGRiBJRkQgc3RydWN0dXJlIHRoYXQgaXMgbG9naWNhbGx5IGNvbXBvc2VkIG9mOgorICogLSBBIDItYnl0ZSBmaWVsZCBsaXN0aW5nIHRoZSBudW1iZXIgb2YgZW50cmllcy4KKyAqIC0gQSBsaXN0IG9mIDEyLWJ5dGUgVElGRiBlbnRyaWVzLgorICogLSBBIDQtYnl0ZSBvZmZzZXQgdG8gdGhlIG5leHQgSUZELgorICovCitjbGFzcyBBTkRST0lEX0FQSSBUaWZmSWZkIDogcHVibGljIFRpZmZXcml0YWJsZSB7CisgICAgcHVibGljOgorICAgICAgICBUaWZmSWZkKHVpbnQzMl90IGlmZElkKTsKKyAgICAgICAgdmlydHVhbCB+VGlmZklmZCgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgYSBUaWZmRW50cnkgdG8gdGhpcyBJRkQgb3IgcmVwbGFjZSBhbiBleGlzdGluZyBlbnRyeSB3aXRoIHRoZQorICAgICAgICAgKiBzYW1lIHRhZyBJRC4gIE5vIHZhbGlkYXRpb24gaXMgZG9uZS4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkRW50cnkoY29uc3Qgc3A8VGlmZkVudHJ5PiYgZW50cnkpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIHBvaW50ZXIgdG8gdGhlIG5leHQgSUZELiAgVGhpcyBpcyB1c2VkIHRvIGNyZWF0ZSBhIGxpbmtlZAorICAgICAgICAgKiBsaXN0IG9mIElGRHMgYXMgZGVmaW5lZCBieSB0aGUgVElGRiA2LjAgc3BlYy4sIGFuZCBpcyBub3QgaW5jbHVkZWQKKyAgICAgICAgICogd2hlbiBjYWxjdWxhdGluZyB0aGUgc2l6ZSBvZiBJRkQgYW5kIGVudHJpZXMgZm9yIHRoZSBnZXRTaXplKCkKKyAgICAgICAgICogbWV0aG9kICh1bmxpa2UgU3ViSUZEcykuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0TmV4dElmZChjb25zdCBzcDxUaWZmSWZkPiYgaWZkKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBwb2ludGVyIHRvIHRoZSBuZXh0IElGRCwgb3IgTlVMTCBpZiBub25lIGV4aXN0cy4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3A8VGlmZklmZD4gZ2V0TmV4dElmZCgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBXcml0ZSB0aGUgSUZEIGRhdGEuICBUaGlzIGluY2x1ZGVzIHRoZSBJRkQgaGVhZGVyLCBlbnRyaWVzLCBmb290ZXIsCisgICAgICAgICAqIGFuZCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXMgZm9yIGVhY2ggZW50cnkgKHJlY3Vyc2l2ZWx5IGluY2x1ZGluZworICAgICAgICAgKiBzdWItSUZEcykuICBUaGUgd3JpdHRlbiBhbW91bnQgc2hvdWxkIGVuZCBvbiBhIHdvcmQgYm91bmRhcnksIGFuZAorICAgICAgICAgKiB0aGUgZ2l2ZW4gb2Zmc2V0IHNob3VsZCBiZSB3b3JkIGFsaWduZWQuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlRGF0YSh1aW50MzJfdCBvZmZzZXQsIC8qb3V0Ki9FbmRpYW5PdXRwdXQqIG91dCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgc2l6ZSBvZiB0aGUgSUZELiBUaGlzIGluY2x1ZGVzIHRoZSBJRkQgaGVhZGVyLCBlbnRyaWVzLCBmb290ZXIsCisgICAgICAgICAqIGFuZCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXMgZm9yIGVhY2ggZW50cnkgKHJlY3Vyc2l2ZWx5IGluY2x1ZGluZworICAgICAgICAgKiBhbnkgc3ViLUlGRHMpLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzaXplX3QgZ2V0U2l6ZSgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIGlkIG9mIHRoaXMgSUZELgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRJZCgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgYW4gZW50cnkgd2l0aCB0aGUgZ2l2ZW4gdGFnIElELgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIGEgc3Ryb25nIHBvaW50ZXIgdG8gdGhlIGVudHJ5IGlmIGl0IGV4aXN0cywgb3IgYW4gZW1wdHkgc3Ryb25nCisgICAgICAgICAqIHBvaW50ZXIuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHNwPFRpZmZFbnRyeT4gZ2V0RW50cnkodWludDE2X3QgdGFnKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmVtb3ZlIHRoZSBlbnRyeSB3aXRoIHRoZSBnaXZlbiB0YWcgSUQgaWYgaXQgZXhpc3RzLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCB2b2lkIHJlbW92ZUVudHJ5KHVpbnQxNl90IHRhZyk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byB2YWxpZGF0ZSBhbmQgc2V0IHN0cmlwLXJlbGF0ZWQgaW1hZ2UgdGFncy4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyBzZXRzIGFsbCBzdHJpcCByZWxhdGVkIHRhZ3MsIGJ1dCBsZWF2ZXMgb2Zmc2V0IHZhbHVlcyB1bml0aWFsaXplZC4KKyAgICAgICAgICogc2V0U3RyaXBPZmZzZXRzIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIGRlc2lyZWQgb2Zmc2V0IGJlZm9yZSB3cml0aW5nLgorICAgICAgICAgKiBUaGUgc3RyaXAgdGFnIHZhbHVlcyBhcmUgY2FsY3VsYXRlZCBmcm9tIHRoZSBleGlzdGluZyB0YWdzIGZvciBpbWFnZQorICAgICAgICAgKiBkaW1lbnNpb25zIGFuZCBwaXhlbCB0eXBlIHNldCBpbiB0aGUgSUZELgorICAgICAgICAgKgorICAgICAgICAgKiBEb2VzIG5vdCBoYW5kbGUgcGxhbmFyIGltYWdlIGNvbmZpZ3VyYXRpb25zIChQbGFuYXJDb25maWd1cmF0aW9uICE9IDEpLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgdmFsaWRhdGVBbmRTZXRTdHJpcFRhZ3MoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHZhbGlkYXRlQW5kU2V0U3RyaXBUYWdzIGhhcyBiZWVuIGNhbGxlZCwgYnV0IG5vdCBzZXRTdHJpcE9mZnNldHMuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIGJvb2wgdW5pbml0aWFsaXplZE9mZnNldHMoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHNldCBiZWdpbm5pbmcgb2Zmc2V0IGZvciBzdHJpcHMuCisgICAgICAgICAqCisgICAgICAgICAqIENhbGwgdGhpcyB0byB1cGRhdGUgdGhlIHN0cmlwIG9mZnNldHMgYmVmb3JlIGNhbGxpbmcgd3JpdGVEYXRhLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyaXBPZmZzZXQodWludDMyX3Qgb2Zmc2V0KTsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSB0b3RhbCBzaXplIG9mIHRoZSBzdHJpcHMgaW4gYnl0ZXMuCisgICAgICAgICAqCisgICAgICAgICAqIFRoaXMgc3VtcyB0aGUgYnl0ZSBjb3VudCBhdCBlYWNoIHN0cmlwIG9mZnNldCwgYW5kIHJldHVybnMKKyAgICAgICAgICogdGhlIHRvdGFsIGNvdW50IG9mIGJ5dGVzIHN0b3JlZCBpbiBzdHJpcHMgZm9yIHRoaXMgSUZELgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJpcFNpemUoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IGEgZm9ybWF0dGVkIHN0cmluZyByZXByZXNlbnRpbmcgdGhpcyBJRkQuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIFN0cmluZzggdG9TdHJpbmcoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUHJpbnQgYSBmb3JtYXR0ZWQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGlzIElGRCB0byBsb2djYXQuCisgICAgICAgICAqLworICAgICAgICB2b2lkIGxvZygpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdmFsdWUgdXNlZCB0byBkZXRlcm1pbmUgc29ydCBvcmRlci4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0Q29tcGFyYWJsZVZhbHVlKCkgY29uc3Q7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgY2hlY2tBbmRHZXRPZmZzZXQodWludDMyX3Qgb2Zmc2V0KSBjb25zdDsKKyAgICAgICAgU29ydGVkRW50cnlWZWN0b3IgbUVudHJpZXM7CisgICAgICAgIHNwPFRpZmZJZmQ+IG1OZXh0SWZkOworICAgICAgICB1aW50MzJfdCBtSWZkSWQ7CisgICAgICAgIGJvb2wgbVN0cmlwT2Zmc2V0c0luaXRpYWxpemVkOworfTsKKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KKworI2VuZGlmIC8qSU1HX1VUSUxTX1RJRkZfSUZEX0gqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1RpZmZXcml0YWJsZS5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1RpZmZXcml0YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MmNlY2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvVGlmZldyaXRhYmxlLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTUdfVVRJTFNfVElGRl9XUklUQUJMRQorI2RlZmluZSBJTUdfVVRJTFNfVElGRl9XUklUQUJMRQorCisjaW5jbHVkZSA8aW1nX3V0aWxzL09yZGVyYWJsZS5oPgorI2luY2x1ZGUgPGltZ191dGlscy9FbmRpYW5VdGlscy5oPgorI2luY2x1ZGUgPGltZ191dGlscy9PdXRwdXQuaD4KKworI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CisKKy8qKgorICogVGlmZldyaXRhYmxlIHN1YmNsYXNzZXMgcmVwcmVzZW50IFRJRkYgbWV0YWRhdGEgb2JqZWN0cyB0aGF0IGNhbiBiZSB3cml0dGVuCisgKiB0byBhbiBFbmRpYW5PdXRwdXQgb2JqZWN0LiAgVGhpcyBpcyB1c2VkIGZvciBUSUZGIGVudHJpZXMgYW5kIElGRHMuCisgKi8KK2NsYXNzIEFORFJPSURfQVBJIFRpZmZXcml0YWJsZSA6IHB1YmxpYyBPcmRlcmFibGUsIHB1YmxpYyBMaWdodFJlZkJhc2U8VGlmZldyaXRhYmxlPiB7CisgICAgcHVibGljOgorICAgICAgICBUaWZmV3JpdGFibGUoKTsKKyAgICAgICAgdmlydHVhbCB+VGlmZldyaXRhYmxlKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdyaXRlIHRoZSBkYXRhIHRvIHRoZSBvdXRwdXQuIFRoZSBnaXZlbiBvZmZzZXQgaXMgdXNlZCB0byBjYWxjdWxhdGUKKyAgICAgICAgICogdGhlIGhlYWRlciBvZmZzZXQgZm9yIHZhbHVlcyB3cml0dGVuLiAgVGhlIG9mZnNldCBpcyBkZWZpbmVkCisgICAgICAgICAqIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIFRJRkYgaGVhZGVyLCBhbmQgaXMgd29yZCBhbGlnbmVkLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZURhdGEodWludDMyX3Qgb2Zmc2V0LCAvKm91dCovRW5kaWFuT3V0cHV0KiBvdXQpIGNvbnN0ID0gMDsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBzaXplIG9mIHRoZSBkYXRhIHRvIHdyaXRlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzaXplX3QgZ2V0U2l6ZSgpIGNvbnN0ID0gMDsKKworfTsKKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KKworI2VuZGlmIC8qSU1HX1VUSUxTX1RJRkZfV1JJVEFCTEUqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1RpZmZXcml0ZXIuaCBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9UaWZmV3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdhZjIzOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9UaWZmV3JpdGVyLmgKQEAgLTAsMCArMSwzMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU1HX1VUSUxTX1RJRkZfV1JJVEVSX0gKKyNkZWZpbmUgSU1HX1VUSUxTX1RJRkZfV1JJVEVSX0gKKworI2luY2x1ZGUgPGltZ191dGlscy9FbmRpYW5VdGlscy5oPgorI2luY2x1ZGUgPGltZ191dGlscy9TdHJpcFNvdXJjZS5oPgorI2luY2x1ZGUgPGltZ191dGlscy9UaWZmRW50cnlJbXBsLmg+CisjaW5jbHVkZSA8aW1nX3V0aWxzL1RhZ0RlZmluaXRpb25zLmg+CisjaW5jbHVkZSA8aW1nX3V0aWxzL1RpZmZJZmQuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCitjbGFzcyBUaWZmRW50cnk7CitjbGFzcyBUaWZmSWZkOworY2xhc3MgT3V0cHV0OworCisvKioKKyAqIFRoaXMgY2xhc3MgaG9sZHMgYSBjb2xsZWN0aW9uIG9mIFRJRkYgSUZEcyB0aGF0IGNhbiBiZSB3cml0dGVuIGFzIGEKKyAqIGNvbXBsZXRlIERORyBmaWxlIGhlYWRlci4KKyAqCisgKiBUaGlzIG1hcHMgdG8gdGhlIFRJRkYgaGVhZGVyIHN0cnVjdHVyZSB0aGF0IGlzIGxvZ2ljYWxseSBjb21wb3NlZCBvZjoKKyAqIC0gQW4gOC1ieXRlIGZpbGUgaGVhZGVyIGNvbnRhaW5pbmcgYW4gZW5kaWFubmVzcyBpbmRpY2F0b3IsIHRoZSBUSUZGCisgKiAgIGZpbGUgbWFya2VyLCBhbmQgdGhlIG9mZnNldCB0byB0aGUgZmlyc3QgSUZELgorICogLSBBIGxpc3Qgb2YgVElGRiBJRkQgc3RydWN0dXJlcy4KKyAqLworY2xhc3MgQU5EUk9JRF9BUEkgVGlmZldyaXRlciA6IHB1YmxpYyBMaWdodFJlZkJhc2U8VGlmZldyaXRlcj4geworICAgIHB1YmxpYzoKKyAgICAgICAgZW51bSBTdWJJZmRUeXBlIHsKKyAgICAgICAgICAgIFNVQklGRCA9IDAsCisgICAgICAgICAgICBHUFNJTkZPCisgICAgICAgIH07CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdHMgYSBUaWZmV3JpdGVyIHdpdGggdGhlIGRlZmF1bHQgdGFnIG1hcHBpbmdzLiBUaGlzIGVuYWJsZXMKKyAgICAgICAgICogYWxsIG9mIHRoZSB0YWdzIGRlZmluZWQgaW4gVGFnRGVmaW5pdGlvbnMuaCwgYW5kIHVzZXMgdGhlIGZvbGxvd2luZworICAgICAgICAgKiBtYXBwaW5nIHByZWNlZGVuY2UgdG8gcmVzb2x2ZSBjb2xsaXNpb25zOgorICAgICAgICAgKiAoaGlnaGVzdCBwcmVjZWRlbmNlKSBUSUZGL0VQID4gRE5HID4gRVhJRiAyLjMgPiBUSUZGIDYuMAorICAgICAgICAgKi8KKyAgICAgICAgVGlmZldyaXRlcigpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgVGlmZldyaXRlciB3aXRoIHRoZSBnaXZlbiB0YWcgbWFwcGluZ3MuICBUaGUgbWFwcGluZworICAgICAgICAgKiBwcmVjZWRlbmNlIHdpbGwgYmUgaW4gdGhlIG9yZGVyIHRoYXQgdGhlIGRlZmluaXRpb24gbWFwcyBhcmUgZ2l2ZW4sCisgICAgICAgICAqIHdoZXJlIHRoZSBsb3dlciBpbmRleCBtYXAgZ2V0cyBwcmVjZWRlbmNlLgorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHdpdGggdXNlci1kZWZpbmVkIGRlZmluaXRpb25zLCBvciBkZWZpbml0aW9ucyBmb3JtCisgICAgICAgICAqIFRhZ0RlZmluaXRpb25zLmgKKyAgICAgICAgICoKKyAgICAgICAgICogVGhlIGVuYWJsZWREZWZpbml0aW9ucyBtYXBwaW5nIG9iamVjdCBpcyBvd25lZCBieSB0aGUgY2FsbGVyLCBhbmQgbXVzdAorICAgICAgICAgKiBzdGF5IGFsaXZlIGZvciB0aGUgbGlmZXNwYW4gb2YgdGhlIGNvbnN0cnVjdGVkIFRpZmZXcml0ZXIgb2JqZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgVGlmZldyaXRlcihLZXllZFZlY3Rvcjx1aW50MTZfdCwgY29uc3QgVGFnRGVmaW5pdGlvbl90Kj4qIGVuYWJsZWREZWZpbml0aW9ucywKKyAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKTsKKworICAgICAgICB2aXJ0dWFsIH5UaWZmV3JpdGVyKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdyaXRlIGEgVElGRiBoZWFkZXIgY29udGFpbmluZyBlYWNoIElGRCBzZXQuICBUaGlzIHdpbGwgcmVjdXJzaXZlbHkKKyAgICAgICAgICogd3JpdGUgYWxsIFN1YklGRHMgYW5kIHRhZ3MuCisgICAgICAgICAqCisgICAgICAgICAqIEFueSBTdHJpcFNvdXJjZXMgcGFzc2VkIGluIHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgb3V0cHV0IGFzIGltYWdlIHN0cmlwcworICAgICAgICAgKiBhdCB0aGUgYXBwcm9wcmlhdGUgb2ZmZXN0cy4gIFRoZSBTdHJpcEJ5dGVDb3VudHMsIFJvd3NQZXJTdHJpcCwgYW5kCisgICAgICAgICAqIFN0cmlwT2Zmc2V0cyB0YWdzIG11c3QgYmUgc2V0IHRvIHVzZSB0aGlzLiAgVG8gc2V0IHRoZXNlIHRhZ3MgaW4gYQorICAgICAgICAgKiBnaXZlbiBJRkQsIHVzZSB0aGUgYWRkU3RyaXAgbWV0aG9kLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShPdXRwdXQqIG91dCwgU3RyaXBTb3VyY2UqKiBzb3VyY2VzLCBzaXplX3Qgc291cmNlc0NvdW50LAorICAgICAgICAgICAgICAgIEVuZGlhbm5lc3MgZW5kID0gTElUVExFKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogV3JpdGUgYSBUSUZGIGhlYWRlciBjb250YWluaW5nIGVhY2ggSUZEIHNldC4gIFRoaXMgd2lsbCByZWN1cnNpdmVseQorICAgICAgICAgKiB3cml0ZSBhbGwgU3ViSUZEcyBhbmQgdGFncy4KKyAgICAgICAgICoKKyAgICAgICAgICogSW1hZ2UgZGF0YSBmb3Igc3RyaXBzIG9yIHRpbGVzIG11c3QgYmUgd3JpdHRlbiBzZXBhcmF0ZWx5IGF0IHRoZQorICAgICAgICAgKiBhcHByb3ByaWF0ZSBvZmZzZXRzLiAgVGhlc2Ugb2Zmc2V0cyBtdXN0IG5vdCBmYWxsIHdpdGhpbiB0aGUgZmlsZQorICAgICAgICAgKiBoZWFkZXIgd3JpdHRlbiB0aGlzIHdheS4gIFRoZSBzaXplIG9mIHRoZSBoZWFkZXIgd3JpdHRlbiBpcyBnaXZlbgorICAgICAgICAgKiBieSB0aGUgZ2V0VG90YWxTaXplKCkgbWV0aG9kLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShPdXRwdXQqIG91dCwgRW5kaWFubmVzcyBlbmQgPSBMSVRUTEUpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIHRvdGFsIHNpemUgaW4gYnl0ZXMgb2YgdGhlIFRJRkYgaGVhZGVyLiAgVGhpcyBpbmNsdWRlcyBhbGwKKyAgICAgICAgICogSUZEcywgdGFncywgYW5kIHZhbHVlcyBzZXQgZm9yIHRoaXMgVGlmZldyaXRlci4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0VG90YWxTaXplKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBhbiBlbnRyeSB0byB0aGUgSUZEIHdpdGggdGhlIGdpdmVuIElELgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLiBWYWxpZAorICAgICAgICAgKiBlcnJvciBjb2RlcyBmb3IgdGhpcyBtZXRob2QgYXJlOgorICAgICAgICAgKiAtIEJBRF9JTkRFWCAtIFRoZSBnaXZlbiB0YWcgZG9lc24ndCBleGlzdC4KKyAgICAgICAgICogLSBCQURfVkFMVUUgLSBUaGUgZ2l2ZW4gY291bnQgZG9lc24ndCBtYXRjaCB0aGUgcmVxdWlyZWQgY291bnQgZm9yCisgICAgICAgICAqICAgICAgICAgICAgICAgdGhpcyB0YWcuCisgICAgICAgICAqIC0gQkFEX1RZUEUgIC0gVGhlIHR5cGUgb2YgdGhlIGdpdmVuIGRhdGEgaXNuJ3QgY29tcGF0aWJsZSB3aXRoIHRoZQorICAgICAgICAgKiAgICAgICAgICAgICAgIHR5cGUgcmVxdWlyZWQgZm9yIHRoaXMgdGFnLgorICAgICAgICAgKiAtIE5BTUVfTk9UX0ZPVU5EIC0gTm8gaWZkIGV4aXN0cyB3aXRoIHRoZSBnaXZlbiBJRC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkRW50cnkoY29uc3Qgc3A8VGlmZkVudHJ5PiYgZW50cnksIHVpbnQzMl90IGlmZCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJ1aWxkIGFuIGVudHJ5IGZvciBhIGtub3duIHRhZyBhbmQgYWRkIGl0IHRvIHRoZSBJRkQgd2l0aCB0aGUgZ2l2ZW4gSUQuCisgICAgICAgICAqIFRoaXMgdGFnIG11c3QgYmUgZGVmaW5lZCBpbiBvbmUgb2YgdGhlIGRlZmluaXRpb24gdmVjdG9ycyB0aGlzIFRJRkYgd3JpdGVyCisgICAgICAgICAqIHdhcyBjb25zdHJ1Y3RlZCB3aXRoLiBUaGUgY291bnQgYW5kIHR5cGUgYXJlIHZhbGlkYXRlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4gVmFsaWQKKyAgICAgICAgICogZXJyb3IgY29kZXMgZm9yIHRoaXMgbWV0aG9kIGFyZToKKyAgICAgICAgICogLSBCQURfSU5ERVggLSBUaGUgZ2l2ZW4gdGFnIGRvZXNuJ3QgZXhpc3QuCisgICAgICAgICAqIC0gQkFEX1ZBTFVFIC0gVGhlIGdpdmVuIGNvdW50IGRvZXNuJ3QgbWF0Y2ggdGhlIHJlcXVpcmVkIGNvdW50IGZvcgorICAgICAgICAgKiAgICAgICAgICAgICAgIHRoaXMgdGFnLgorICAgICAgICAgKiAtIEJBRF9UWVBFICAtIFRoZSB0eXBlIG9mIHRoZSBnaXZlbiBkYXRhIGlzbid0IGNvbXBhdGlibGUgd2l0aCB0aGUKKyAgICAgICAgICogICAgICAgICAgICAgICB0eXBlIHJlcXVpcmVkIGZvciB0aGlzIHRhZy4KKyAgICAgICAgICogLSBOQU1FX05PVF9GT1VORCAtIE5vIGlmZCBleGlzdHMgd2l0aCB0aGUgZ2l2ZW4gSUQuCisgICAgICAgICAqLworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBzdGF0dXNfdCBhZGRFbnRyeSh1aW50MTZfdCB0YWcsIHVpbnQzMl90IGNvdW50LCBjb25zdCBUKiBkYXRhLCB1aW50MzJfdCBpZmQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBCdWlsZCBhbiBlbnRyeSBmb3IgYSBrbm93biB0YWcuICBUaGlzIHRhZyBtdXN0IGJlIG9uZSBvZiB0aGUgdGFncworICAgICAgICAgKiBkZWZpbmVkIGluIG9uZSBvZiB0aGUgZGVmaW5pdGlvbiB2ZWN0b3JzIHRoaXMgVElGRiB3cml0ZXIgd2FzIGNvbnN0cnVjdGVkCisgICAgICAgICAqIHdpdGguIFRoZSBjb3VudCBhbmQgdHlwZSBhcmUgdmFsaWRhdGVkLiBJZiB0aGlzIHN1Y2NlZWRzLCB0aGUgcmVzdWx0aW5nCisgICAgICAgICAqIGVudHJ5IHdpbGwgYmUgcGxhY2VkIGluIHRoZSBvdXRFbnRyeSBwb2ludGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLiBWYWxpZAorICAgICAgICAgKiBlcnJvciBjb2RlcyBmb3IgdGhpcyBtZXRob2QgYXJlOgorICAgICAgICAgKiAtIEJBRF9JTkRFWCAtIFRoZSBnaXZlbiB0YWcgZG9lc24ndCBleGlzdC4KKyAgICAgICAgICogLSBCQURfVkFMVUUgLSBUaGUgZ2l2ZW4gY291bnQgZG9lc24ndCBtYXRjaCB0aGUgcmVxdWlyZWQgY291bnQgZm9yCisgICAgICAgICAqICAgICAgICAgICAgICAgdGhpcyB0YWcuCisgICAgICAgICAqIC0gQkFEX1RZUEUgIC0gVGhlIHR5cGUgb2YgdGhlIGdpdmVuIGRhdGEgaXNuJ3QgY29tcGF0aWJsZSB3aXRoIHRoZQorICAgICAgICAgKiAgICAgICAgICAgICAgIHR5cGUgcmVxdWlyZWQgZm9yIHRoaXMgdGFnLgorICAgICAgICAgKi8KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgc3RhdHVzX3QgYnVpbGRFbnRyeSh1aW50MTZfdCB0YWcsIHVpbnQzMl90IGNvdW50LCBjb25zdCBUKiBkYXRhLAorICAgICAgICAgICAgICAgICAgLypvdXQqL3NwPFRpZmZFbnRyeT4qIG91dEVudHJ5KSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gc2V0IHRoZSBzdHJpcCByZWxhdGVkIHRhZ3MgZm9yIGEgZ2l2ZW4gSUZELgorICAgICAgICAgKgorICAgICAgICAgKiBDYWxsIHRoaXMgYmVmb3JlIHVzaW5nIGEgU3RyaXBTb3VyY2UgYXMgYW4gaW5wdXQgdG8gd3JpdGUuCisgICAgICAgICAqIFRoZSBmb2xsb3dpbmcgdGFncyBtdXN0IGJlIHNldCBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZDoKKyAgICAgICAgICogLSBJbWFnZVdpZHRoCisgICAgICAgICAqIC0gSW1hZ2VMZW5ndGgKKyAgICAgICAgICogLSBTYW1wbGVzUGVyUGl4ZWwKKyAgICAgICAgICogLSBCaXRzUGVyU2FtcGxlCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTdHJpcCh1aW50MzJfdCBpZmQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdGhlIFRJRkYgZW50cnkgd2l0aCB0aGUgZ2l2ZW4gdGFnIElEIGluIHRoZSBJRkQgd2l0aCB0aGUgZ2l2ZW4gSUQsCisgICAgICAgICAqIG9yIGFuIGVtcHR5IHBvaW50ZXIgaWYgbm9uZSBleGlzdHMuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHNwPFRpZmZFbnRyeT4gZ2V0RW50cnkodWludDE2X3QgdGFnLCB1aW50MzJfdCBpZmQpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZW1vdmUgdGhlIFRJRkYgZW50cnkgd2l0aCB0aGUgZ2l2ZW4gdGFnIElEIGluIHRoZSBnaXZlbiBJRkQgaWYgaXQgZXhpc3RzLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCB2b2lkIHJlbW92ZUVudHJ5KHVpbnQxNl90IHRhZywgdWludDMyX3QgaWZkKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGFuIGVtcHR5IElGRCB3aXRoIHRoZSBnaXZlbiBJRCBhbmQgYWRkIGl0IHRvIHRoZSBlbmQgb2YgdGhlCisgICAgICAgICAqIGxpc3Qgb2YgSUZEcy4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkSWZkKHVpbnQzMl90IGlmZCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhbiBlbXB0eSBJRkQgd2l0aCB0aGUgZ2l2ZW4gSUQgYW5kIGFkZCBpdCBhcyBhIFN1YklmZCBvZiB0aGUKKyAgICAgICAgICogcGFyZW50IElGRC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU3ViSWZkKHVpbnQzMl90IHBhcmVudElmZCwgdWludDMyX3QgaWZkLCBTdWJJZmRUeXBlIHR5cGUgPSBTVUJJRkQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHR5cGUgZm9yIHRoZSBnaXZlbiB0YWcgSUQuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIFRhZ1R5cGUgZ2V0RGVmYXVsdFR5cGUodWludDE2X3QgdGFnKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCBjb3VudCBmb3IgYSBnaXZlbiB0YWcgSUQsIG9yIDAgaWYgdGhpcworICAgICAgICAgKiB0YWcgbm9ybWFsbHkgaGFzIGEgdmFyaWFibGUgY291bnQuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldERlZmF1bHRDb3VudCh1aW50MTZfdCB0YWcpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgYW4gSUZEIHdpdGggdGhlIGdpdmVuIElEIGV4aXN0cy4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgYm9vbCBoYXNJZmQodWludDMyX3QgaWZkKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIGEgZGVmaW5pdGlvbiBleGlzdCBmb3IgdGhlIGdpdmVuIHRhZyBJRC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgYm9vbCBjaGVja0lmRGVmaW5lZCh1aW50MTZfdCB0YWcpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSB0YWcgaWYgYSBkZWZpbml0aW9uIGV4aXN0cyBmb3IgdGhlIGdpdmVuIHRhZworICAgICAgICAgKiBJRCwgb3IgbnVsbCBpZiBubyBkZWZpbml0aW9uIGV4aXN0cy4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgY29uc3QgY2hhciogZ2V0VGFnTmFtZSh1aW50MTZfdCB0YWcpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBQcmludCB0aGUgY3VycmVudGx5IGNvbmZpZ3VyZWQgSUZEcyBhbmQgZW50cmllcyB0byBsb2djYXQuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHZvaWQgbG9nKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJ1aWxkIGFuIGVudHJ5LiAgTm8gdmFsaWRhdGlvbiBpcyBkb25lLgorICAgICAgICAgKgorICAgICAgICAgKiBXQVJOSU5HOiBVc2luZyB0aGlzIG1ldGhvZCBjYW4gcmVzdWx0IGluIGNyZWF0aW5nIHBvb3JseSBmb3JtYXR0ZWQKKyAgICAgICAgICogVElGRiBmaWxlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBhIFRpZmZFbnRyeSB3aXRoIHRoZSBnaXZlbiB0YWcsIHR5cGUsIGNvdW50LCBlbmRpYW5uZXNzLAorICAgICAgICAgKiBhbmQgZGF0YS4KKyAgICAgICAgICovCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIHN0YXRpYyBzcDxUaWZmRW50cnk+IHVuY2hlY2tlZEJ1aWxkRW50cnkodWludDE2X3QgdGFnLCBUYWdUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb3VudCwgRW5kaWFubmVzcyBlbmQsIGNvbnN0IFQqIGRhdGEpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGJ1aWxkIGF0YWctdG8tZGVmaW5pdGlvbiBtYXBwaW5nIGZyb20gYSBnaXZlbgorICAgICAgICAgKiBhcnJheSBvZiB0YWcgZGVmaW5pdGlvbnMuCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgS2V5ZWRWZWN0b3I8dWludDE2X3QsIGNvbnN0IFRhZ0RlZmluaXRpb25fdCo+IGJ1aWxkVGFnTWFwKAorICAgICAgICAgICAgICAgICAgY29uc3QgVGFnRGVmaW5pdGlvbl90KiBkZWZpbml0aW9ucywgc2l6ZV90IGxlbmd0aCk7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIGVudW0geworICAgICAgICAgICAgREVGQVVMVF9OVU1fVEFHX01BUFMgPSA0LAorICAgICAgICB9OworCisgICAgICAgIHNwPFRpZmZJZmQ+IGZpbmRMYXN0SWZkKCk7CisgICAgICAgIHN0YXR1c190IHdyaXRlRmlsZUhlYWRlcihFbmRpYW5PdXRwdXQmIG91dCk7CisgICAgICAgIGNvbnN0IFRhZ0RlZmluaXRpb25fdCogbG9va3VwRGVmaW5pdGlvbih1aW50MTZfdCB0YWcpIGNvbnN0OworICAgICAgICBzdGF0dXNfdCBjYWxjdWxhdGVPZmZzZXRzKCk7CisKKyAgICAgICAgc3A8VGlmZklmZD4gbUlmZDsKKyAgICAgICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIHNwPFRpZmZJZmQ+ID4gbU5hbWVkSWZkczsKKyAgICAgICAgS2V5ZWRWZWN0b3I8dWludDE2X3QsIGNvbnN0IFRhZ0RlZmluaXRpb25fdCo+KiBtVGFnTWFwczsKKyAgICAgICAgc2l6ZV90IG1OdW1UYWdNYXBzOworCisgICAgICAgIHN0YXRpYyBLZXllZFZlY3Rvcjx1aW50MTZfdCwgY29uc3QgVGFnRGVmaW5pdGlvbl90Kj4gc1RhZ01hcHNbXTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGF0dXNfdCBUaWZmV3JpdGVyOjpidWlsZEVudHJ5KHVpbnQxNl90IHRhZywgdWludDMyX3QgY291bnQsIGNvbnN0IFQqIGRhdGEsCisgICAgICAgICAgICAgICAgICAvKm91dCovc3A8VGlmZkVudHJ5Piogb3V0RW50cnkpIGNvbnN0IHsKKyAgICBjb25zdCBUYWdEZWZpbml0aW9uX3QqIGRlZmluaXRpb24gPSBsb29rdXBEZWZpbml0aW9uKHRhZyk7CisKKyAgICBpZiAoZGVmaW5pdGlvbiA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogTm8gc3VjaCB0YWcgZXhpc3RzIGZvciBpZCAleC4iLCBfX0ZVTkNUSU9OX18sIHRhZyk7CisgICAgICAgIHJldHVybiBCQURfSU5ERVg7CisgICAgfQorCisgICAgdWludDMyX3QgZml4ZWRDb3VudCA9IGRlZmluaXRpb24tPmZpeGVkQ291bnQ7CisgICAgaWYgKGZpeGVkQ291bnQgPiAwICYmIGZpeGVkQ291bnQgIT0gY291bnQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGNvdW50ICVkIGZvciB0YWcgJXggKGV4cGVjdHMgJWQpLiIsIF9fRlVOQ1RJT05fXywgY291bnQsIHRhZywKKyAgICAgICAgICAgICAgICBmaXhlZENvdW50KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBUYWdUeXBlIGZpeGVkVHlwZSA9IGRlZmluaXRpb24tPmRlZmF1bHRUeXBlOworICAgIGlmIChUaWZmRW50cnk6OmZvcmNlVmFsaWRUeXBlKGZpeGVkVHlwZSwgZGF0YSkgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgdHlwZSB1c2VkIGZvciB0YWcgdmFsdWUgZm9yIHRhZyAleC4iLCBfX0ZVTkNUSU9OX18sIHRhZyk7CisgICAgICAgIHJldHVybiBCQURfVFlQRTsKKyAgICB9CisKKyAgICAqb3V0RW50cnkgPSBuZXcgVGlmZkVudHJ5SW1wbDxUPih0YWcsIGZpeGVkVHlwZSwgY291bnQsCisgICAgICAgIGRlZmluaXRpb24tPmZpeGVkRW5kaWFuLCBkYXRhKTsKKworICAgIHJldHVybiBPSzsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0YXR1c190IFRpZmZXcml0ZXI6OmFkZEVudHJ5KHVpbnQxNl90IHRhZywgdWludDMyX3QgY291bnQsIGNvbnN0IFQqIGRhdGEsIHVpbnQzMl90IGlmZCkgeworICAgIHNwPFRpZmZFbnRyeT4gb3V0RW50cnk7CisKKyAgICBzdGF0dXNfdCByZXQgPSBidWlsZEVudHJ5PFQ+KHRhZywgY291bnQsIGRhdGEsICZvdXRFbnRyeSk7CisgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBidWlsZCBlbnRyeSBmb3IgdGFnICV4LiIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gYWRkRW50cnkob3V0RW50cnksIGlmZCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzcDxUaWZmRW50cnk+IFRpZmZXcml0ZXI6OnVuY2hlY2tlZEJ1aWxkRW50cnkodWludDE2X3QgdGFnLCBUYWdUeXBlIHR5cGUsIHVpbnQzMl90IGNvdW50LAorICAgICAgICBFbmRpYW5uZXNzIGVuZCwgY29uc3QgVCogZGF0YSkgeworICAgIFRpZmZFbnRyeUltcGw8VD4qIGVudHJ5ID0gbmV3IFRpZmZFbnRyeUltcGw8VD4odGFnLCB0eXBlLCBjb3VudCwgZW5kLCBkYXRhKTsKKyAgICByZXR1cm4gc3A8VGlmZkVudHJ5PihlbnRyeSk7Cit9CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCisKKworI2VuZGlmIC8qSU1HX1VUSUxTX1RJRkZfV1JJVEVSX0gqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL3NyYy9BbmRyb2lkLm1rIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNzQ4NDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL0FuZHJvaWQubWsKQEAgLTAsMCArMSw2MiBAQAorIyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICBFbmRpYW5VdGlscy5jcHAgXAorICBGaWxlSW5wdXQuY3BwIFwKKyAgRmlsZU91dHB1dC5jcHAgXAorICBTb3J0ZWRFbnRyeVZlY3Rvci5jcHAgXAorICBJbnB1dC5jcHAgXAorICBPdXRwdXQuY3BwIFwKKyAgT3JkZXJhYmxlLmNwcCBcCisgIFRpZmZJZmQuY3BwIFwKKyAgVGlmZldyaXRhYmxlLmNwcCBcCisgIFRpZmZXcml0ZXIuY3BwIFwKKyAgVGlmZkVudHJ5LmNwcCBcCisgIFRpZmZFbnRyeUltcGwuY3BwIFwKKyAgQnl0ZUFycmF5T3V0cHV0LmNwcCBcCisgIERuZ1V0aWxzLmNwcCBcCisgIFN0cmlwU291cmNlLmNwcCBcCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICBsaWJleHBhdCBcCisgIGxpYnV0aWxzIFwKKyAgbGliY3V0aWxzIFwKKyAgbGliY2FtZXJhX21ldGFkYXRhIFwKKyAgbGliY2FtZXJhX2NsaWVudAorCitMT0NBTF9DX0lOQ0xVREVTICs9IFwKKyAgJChMT0NBTF9QQVRIKS8uLi9pbmNsdWRlIFwKKyAgc3lzdGVtL21lZGlhL2NhbWVyYS9pbmNsdWRlCisKK0xPQ0FMX0NGTEFHUyArPSBcCisgIC1XYWxsIFwKKyAgLVdleHRyYSBcCisgIC1XZXJyb3IgXAorICAtZnZpc2liaWxpdHk9aGlkZGVuCisKK2lmbmVxICgkKGZpbHRlciB1c2VyZGVidWcgZW5nLCQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpKSwpCisgICAgIyBFbmFibGUgYXNzZXJ0KCkgaW4gZW5nIGJ1aWxkcworICAgIExPQ0FMX0NGTEFHUyArPSAtVU5ERUJVRyAtRExPR19OREVCVUc9MQorZW5kaWYKKworTE9DQUxfRVhQT1JUX0NfSU5DTFVERV9ESVJTIDo9ICQoTE9DQUxfUEFUSCkvLi4vaW5jbHVkZQorCitMT0NBTF9NT0RVTEUgOj0gbGliaW1nX3V0aWxzCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9zcmMvQnl0ZUFycmF5T3V0cHV0LmNwcCBiL21lZGlhL2ltZ191dGlscy9zcmMvQnl0ZUFycmF5T3V0cHV0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjJkMjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9CeXRlQXJyYXlPdXRwdXQuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxpbWdfdXRpbHMvQnl0ZUFycmF5T3V0cHV0Lmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CisKK0J5dGVBcnJheU91dHB1dDo6Qnl0ZUFycmF5T3V0cHV0KCkge30KKworQnl0ZUFycmF5T3V0cHV0Ojp+Qnl0ZUFycmF5T3V0cHV0KCkge30KKworc3RhdHVzX3QgQnl0ZUFycmF5T3V0cHV0OjpvcGVuKCkgeworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQnl0ZUFycmF5T3V0cHV0Ojp3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBjb3VudCkgeworICAgIGlmIChtQnl0ZUFycmF5LmFwcGVuZEFycmF5KGJ1ZiArIG9mZnNldCwgY291bnQpIDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSB0byBCeXRlQXJyYXlPdXRwdXQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBCeXRlQXJyYXlPdXRwdXQ6OmNsb3NlKCkgeworICAgIG1CeXRlQXJyYXkuY2xlYXIoKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3NpemVfdCBCeXRlQXJyYXlPdXRwdXQ6OmdldFNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1CeXRlQXJyYXkuc2l6ZSgpOworfQorCitjb25zdCB1aW50OF90KiBCeXRlQXJyYXlPdXRwdXQ6OmdldEFycmF5KCkgY29uc3QgeworICAgIHJldHVybiBtQnl0ZUFycmF5LmFycmF5KCk7Cit9CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvc3JjL0RuZ1V0aWxzLmNwcCBiL21lZGlhL2ltZ191dGlscy9zcmMvRG5nVXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzYjRhMzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL0RuZ1V0aWxzLmNwcApAQCAtMCwwICsxLDI4MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGltZ191dGlscy9EbmdVdGlscy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworT3Bjb2RlTGlzdEJ1aWxkZXI6Ok9wY29kZUxpc3RCdWlsZGVyKCkgOiBtQ291bnQoMCksIG1PcExpc3QoKSwgbUVuZGlhbk91dCgmbU9wTGlzdCwgQklHKSB7CisgICAgaWYobUVuZGlhbk91dC5vcGVuKCkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBPcGVuIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgIH0KK30KKworT3Bjb2RlTGlzdEJ1aWxkZXI6On5PcGNvZGVMaXN0QnVpbGRlcigpIHsKKyAgICBpZihtRW5kaWFuT3V0LmNsb3NlKCkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDbG9zZSBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICB9Cit9CisKK3NpemVfdCBPcGNvZGVMaXN0QnVpbGRlcjo6Z2V0U2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbU9wTGlzdC5nZXRTaXplKCkgKyBzaXplb2YobUNvdW50KTsKK30KKwordWludDMyX3QgT3Bjb2RlTGlzdEJ1aWxkZXI6OmdldENvdW50KCkgY29uc3QgeworICAgIHJldHVybiBtQ291bnQ7Cit9CisKK3N0YXR1c190IE9wY29kZUxpc3RCdWlsZGVyOjpidWlsZE9wTGlzdCh1aW50OF90KiBidWYpIGNvbnN0IHsKKyAgICB1aW50MzJfdCBjb3VudCA9IGNvbnZlcnRUb0JpZ0VuZGlhbihtQ291bnQpOworICAgIG1lbWNweShidWYsICZjb3VudCwgc2l6ZW9mKGNvdW50KSk7CisgICAgbWVtY3B5KGJ1ZiArIHNpemVvZihjb3VudCksIG1PcExpc3QuZ2V0QXJyYXkoKSwgbU9wTGlzdC5nZXRTaXplKCkpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgT3Bjb2RlTGlzdEJ1aWxkZXI6OmFkZEdhaW5NYXBzRm9yTWV0YWRhdGEodWludDMyX3QgbHNtV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsc21IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhVG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlQXJlYUxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhQm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlQXJlYVJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2ZhTGF5b3V0IGNmYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBsZW5zU2hhZGluZ01hcCkgeworICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFXaWR0aCA9IGFjdGl2ZUFyZWFSaWdodCAtIGFjdGl2ZUFyZWFMZWZ0OworICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFIZWlnaHQgPSBhY3RpdmVBcmVhQm90dG9tIC0gYWN0aXZlQXJlYVRvcDsKKyAgICBkb3VibGUgc3BhY2luZ1YgPSAxLjAgLyBsc21IZWlnaHQ7CisgICAgZG91YmxlIHNwYWNpbmdIID0gMS4wIC8gbHNtV2lkdGg7CisKKyAgICBmbG9hdCByZWRNYXBbbHNtV2lkdGggKiBsc21IZWlnaHRdOworICAgIGZsb2F0IGdyZWVuRXZlbk1hcFtsc21XaWR0aCAqIGxzbUhlaWdodF07CisgICAgZmxvYXQgZ3JlZW5PZGRNYXBbbHNtV2lkdGggKiBsc21IZWlnaHRdOworICAgIGZsb2F0IGJsdWVNYXBbbHNtV2lkdGggKiBsc21IZWlnaHRdOworCisgICAgc2l6ZV90IGxzbU1hcFNpemUgPSBsc21XaWR0aCAqIGxzbUhlaWdodCAqIDQ7CisKKyAgICAvLyBTcGxpdCBsZW5zIHNoYWRpbmcgbWFwIGNoYW5uZWxzIGludG8gc2VwYXJhdGUgYXJyYXlzCisgICAgc2l6ZV90IGogPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbHNtTWFwU2l6ZTsgaSArPSA0LCArK2opIHsKKyAgICAgICAgcmVkTWFwW2pdID0gbGVuc1NoYWRpbmdNYXBbaSArIExTTV9SX0lORF07CisgICAgICAgIGdyZWVuRXZlbk1hcFtqXSA9IGxlbnNTaGFkaW5nTWFwW2kgKyBMU01fR0VfSU5EXTsKKyAgICAgICAgZ3JlZW5PZGRNYXBbal0gPSBsZW5zU2hhZGluZ01hcFtpICsgTFNNX0dPX0lORF07CisgICAgICAgIGJsdWVNYXBbal0gPSBsZW5zU2hhZGluZ01hcFtpICsgTFNNX0JfSU5EXTsKKyAgICB9CisKKyAgICB1aW50MzJfdCByZWRUb3AgPSAwOworICAgIHVpbnQzMl90IHJlZExlZnQgPSAwOworICAgIHVpbnQzMl90IGdyZWVuRXZlblRvcCA9IDA7CisgICAgdWludDMyX3QgZ3JlZW5FdmVuTGVmdCA9IDE7CisgICAgdWludDMyX3QgZ3JlZW5PZGRUb3AgPSAxOworICAgIHVpbnQzMl90IGdyZWVuT2RkTGVmdCA9IDA7CisgICAgdWludDMyX3QgYmx1ZVRvcCA9IDE7CisgICAgdWludDMyX3QgYmx1ZUxlZnQgPSAxOworCisgICAgc3dpdGNoKGNmYSkgeworICAgICAgICBjYXNlIENGQV9SR0dCOgorICAgICAgICAgICAgcmVkVG9wID0gMDsKKyAgICAgICAgICAgIHJlZExlZnQgPSAwOworICAgICAgICAgICAgZ3JlZW5FdmVuVG9wID0gMDsKKyAgICAgICAgICAgIGdyZWVuRXZlbkxlZnQgPSAxOworICAgICAgICAgICAgZ3JlZW5PZGRUb3AgPSAxOworICAgICAgICAgICAgZ3JlZW5PZGRMZWZ0ID0gMDsKKyAgICAgICAgICAgIGJsdWVUb3AgPSAxOworICAgICAgICAgICAgYmx1ZUxlZnQgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0ZBX0dSQkc6CisgICAgICAgICAgICByZWRUb3AgPSAwOworICAgICAgICAgICAgcmVkTGVmdCA9IDE7CisgICAgICAgICAgICBncmVlbkV2ZW5Ub3AgPSAwOworICAgICAgICAgICAgZ3JlZW5FdmVuTGVmdCA9IDA7CisgICAgICAgICAgICBncmVlbk9kZFRvcCA9IDE7CisgICAgICAgICAgICBncmVlbk9kZExlZnQgPSAxOworICAgICAgICAgICAgYmx1ZVRvcCA9IDE7CisgICAgICAgICAgICBibHVlTGVmdCA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDRkFfR0JSRzoKKyAgICAgICAgICAgIHJlZFRvcCA9IDE7CisgICAgICAgICAgICByZWRMZWZ0ID0gMDsKKyAgICAgICAgICAgIGdyZWVuRXZlblRvcCA9IDA7CisgICAgICAgICAgICBncmVlbkV2ZW5MZWZ0ID0gMDsKKyAgICAgICAgICAgIGdyZWVuT2RkVG9wID0gMTsKKyAgICAgICAgICAgIGdyZWVuT2RkTGVmdCA9IDE7CisgICAgICAgICAgICBibHVlVG9wID0gMDsKKyAgICAgICAgICAgIGJsdWVMZWZ0ID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENGQV9CR0dSOgorICAgICAgICAgICAgcmVkVG9wID0gMTsKKyAgICAgICAgICAgIHJlZExlZnQgPSAxOworICAgICAgICAgICAgZ3JlZW5FdmVuVG9wID0gMDsKKyAgICAgICAgICAgIGdyZWVuRXZlbkxlZnQgPSAxOworICAgICAgICAgICAgZ3JlZW5PZGRUb3AgPSAxOworICAgICAgICAgICAgZ3JlZW5PZGRMZWZ0ID0gMDsKKyAgICAgICAgICAgIGJsdWVUb3AgPSAwOworICAgICAgICAgICAgYmx1ZUxlZnQgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVua25vd24gQ0ZBIGxheW91dCAlZCIsIF9fRlVOQ1RJT05fXywgY2ZhKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyID0gYWRkR2Fpbk1hcCgvKnRvcCovcmVkVG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypsZWZ0Ki9yZWRMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypib3R0b20qL2FjdGl2ZUFyZWFIZWlnaHQgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypyaWdodCovYWN0aXZlQXJlYVdpZHRoIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qcGxhbmUqLzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnBsYW5lcyovMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qcm93UGl0Y2gqLzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmNvbFBpdGNoKi8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXBQb2ludHNWKi9sc21IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1hcFBvaW50c0gqL2xzbVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXBTcGFjaW5nViovc3BhY2luZ1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1hcFNwYWNpbmdIKi9zcGFjaW5nSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWFwT3JpZ2luViovMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWFwT3JpZ2luSCovMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWFwUGxhbmVzKi8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXBHYWlucyovcmVkTWFwKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgZXJyID0gYWRkR2Fpbk1hcCgvKnRvcCovZ3JlZW5FdmVuVG9wLAorICAgICAgICAgICAgICAgICAgICAgLypsZWZ0Ki9ncmVlbkV2ZW5MZWZ0LAorICAgICAgICAgICAgICAgICAgICAgLypib3R0b20qL2FjdGl2ZUFyZWFIZWlnaHQgLSAxLAorICAgICAgICAgICAgICAgICAgICAgLypyaWdodCovYWN0aXZlQXJlYVdpZHRoIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgIC8qcGxhbmUqLzAsCisgICAgICAgICAgICAgICAgICAgICAvKnBsYW5lcyovMSwKKyAgICAgICAgICAgICAgICAgICAgIC8qcm93UGl0Y2gqLzIsCisgICAgICAgICAgICAgICAgICAgICAvKmNvbFBpdGNoKi8yLAorICAgICAgICAgICAgICAgICAgICAgLyptYXBQb2ludHNWKi9sc21IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAvKm1hcFBvaW50c0gqL2xzbVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgLyptYXBTcGFjaW5nViovc3BhY2luZ1YsCisgICAgICAgICAgICAgICAgICAgICAvKm1hcFNwYWNpbmdIKi9zcGFjaW5nSCwKKyAgICAgICAgICAgICAgICAgICAgIC8qbWFwT3JpZ2luViovMCwKKyAgICAgICAgICAgICAgICAgICAgIC8qbWFwT3JpZ2luSCovMCwKKyAgICAgICAgICAgICAgICAgICAgIC8qbWFwUGxhbmVzKi8xLAorICAgICAgICAgICAgICAgICAgICAgLyptYXBHYWlucyovZ3JlZW5FdmVuTWFwKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgZXJyID0gYWRkR2Fpbk1hcCgvKnRvcCovZ3JlZW5PZGRUb3AsCisgICAgICAgICAgICAgICAgICAgICAvKmxlZnQqL2dyZWVuT2RkTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgIC8qYm90dG9tKi9hY3RpdmVBcmVhSGVpZ2h0IC0gMSwKKyAgICAgICAgICAgICAgICAgICAgIC8qcmlnaHQqL2FjdGl2ZUFyZWFXaWR0aCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAvKnBsYW5lKi8wLAorICAgICAgICAgICAgICAgICAgICAgLypwbGFuZXMqLzEsCisgICAgICAgICAgICAgICAgICAgICAvKnJvd1BpdGNoKi8yLAorICAgICAgICAgICAgICAgICAgICAgLypjb2xQaXRjaCovMiwKKyAgICAgICAgICAgICAgICAgICAgIC8qbWFwUG9pbnRzViovbHNtSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgLyptYXBQb2ludHNIKi9sc21XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgIC8qbWFwU3BhY2luZ1YqL3NwYWNpbmdWLAorICAgICAgICAgICAgICAgICAgICAgLyptYXBTcGFjaW5nSCovc3BhY2luZ0gsCisgICAgICAgICAgICAgICAgICAgICAvKm1hcE9yaWdpblYqLzAsCisgICAgICAgICAgICAgICAgICAgICAvKm1hcE9yaWdpbkgqLzAsCisgICAgICAgICAgICAgICAgICAgICAvKm1hcFBsYW5lcyovMSwKKyAgICAgICAgICAgICAgICAgICAgIC8qbWFwR2FpbnMqL2dyZWVuT2RkTWFwKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgZXJyID0gYWRkR2Fpbk1hcCgvKnRvcCovYmx1ZVRvcCwKKyAgICAgICAgICAgICAgICAgICAgIC8qbGVmdCovYmx1ZUxlZnQsCisgICAgICAgICAgICAgICAgICAgICAvKmJvdHRvbSovYWN0aXZlQXJlYUhlaWdodCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAvKnJpZ2h0Ki9hY3RpdmVBcmVhV2lkdGggLSAxLAorICAgICAgICAgICAgICAgICAgICAgLypwbGFuZSovMCwKKyAgICAgICAgICAgICAgICAgICAgIC8qcGxhbmVzKi8xLAorICAgICAgICAgICAgICAgICAgICAgLypyb3dQaXRjaCovMiwKKyAgICAgICAgICAgICAgICAgICAgIC8qY29sUGl0Y2gqLzIsCisgICAgICAgICAgICAgICAgICAgICAvKm1hcFBvaW50c1YqL2xzbUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgIC8qbWFwUG9pbnRzSCovbHNtV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAvKm1hcFNwYWNpbmdWKi9zcGFjaW5nViwKKyAgICAgICAgICAgICAgICAgICAgIC8qbWFwU3BhY2luZ0gqL3NwYWNpbmdILAorICAgICAgICAgICAgICAgICAgICAgLyptYXBPcmlnaW5WKi8wLAorICAgICAgICAgICAgICAgICAgICAgLyptYXBPcmlnaW5IKi8wLAorICAgICAgICAgICAgICAgICAgICAgLyptYXBQbGFuZXMqLzEsCisgICAgICAgICAgICAgICAgICAgICAvKm1hcEdhaW5zKi9ibHVlTWFwKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBPcGNvZGVMaXN0QnVpbGRlcjo6YWRkR2Fpbk1hcCh1aW50MzJfdCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwbGFuZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBsYW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJvd1BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29sUGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXBQb2ludHNWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWFwUG9pbnRzSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBtYXBTcGFjaW5nViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBtYXBTcGFjaW5nSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBtYXBPcmlnaW5WLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG1hcE9yaWdpbkgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXBQbGFuZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogbWFwR2FpbnMpIHsKKworICAgIHVpbnQzMl90IG9wY29kZUlkID0gR0FJTl9NQVBfSUQ7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBtRW5kaWFuT3V0LndyaXRlKCZvcGNvZGVJZCwgMCwgMSk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIHVpbnQ4X3QgdmVyc2lvbltdID0gezEsIDMsIDAsIDB9OworICAgIGVyciA9IG1FbmRpYW5PdXQud3JpdGUodmVyc2lvbiwgMCwgTkVMRU1TKHZlcnNpb24pKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgLy8gRG8gbm90IGluY2x1ZGUgb3B0aW9uYWwgZmxhZyBmb3IgcHJldmlldywgYXMgdGhpcyBjYW4gaGF2ZSBhIGxhcmdlIGVmZmVjdCBvbiB0aGUgb3V0cHV0LgorICAgIHVpbnQzMl90IGZsYWdzID0gRkxBR19PUFRJT05BTDsKKworICAgIGVyciA9IG1FbmRpYW5PdXQud3JpdGUoJmZsYWdzLCAwLCAxKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgY29uc3QgdWludDMyX3QgTlVNQkVSX0lOVF9BUkdTID0gMTE7CisgICAgY29uc3QgdWludDMyX3QgTlVNQkVSX0RPVUJMRV9BUkdTID0gNDsKKworICAgIHVpbnQzMl90IHRvdGFsU2l6ZSA9IE5VTUJFUl9JTlRfQVJHUyAqIHNpemVvZih1aW50MzJfdCkgKyBOVU1CRVJfRE9VQkxFX0FSR1MgKiBzaXplb2YoZG91YmxlKSArCisgICAgICAgICAgICBtYXBQb2ludHNWICogbWFwUG9pbnRzSCAqIG1hcFBsYW5lcyAqIHNpemVvZihmbG9hdCk7CisKKyAgICBlcnIgPSBtRW5kaWFuT3V0LndyaXRlKCZ0b3RhbFNpemUsIDAsIDEpOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICAvLyBCYXRjaCB3cml0ZXMgYXMgbXVjaCBhcyBwb3NzaWJsZQorICAgIHVpbnQzMl90IHNldHRpbmdzMVtdID0geyB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd1BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbFBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcFBvaW50c1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwUG9pbnRzSCB9OworCisgICAgZXJyID0gbUVuZGlhbk91dC53cml0ZShzZXR0aW5nczEsIDAsIE5FTEVNUyhzZXR0aW5nczEpKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgZG91YmxlIHNldHRpbmdzMltdID0geyBtYXBTcGFjaW5nViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwU3BhY2luZ0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcE9yaWdpblYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcE9yaWdpbkggfTsKKworICAgIGVyciA9IG1FbmRpYW5PdXQud3JpdGUoc2V0dGluZ3MyLCAwLCBORUxFTVMoc2V0dGluZ3MyKSk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIGVyciA9IG1FbmRpYW5PdXQud3JpdGUoJm1hcFBsYW5lcywgMCwgMSk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIGVyciA9IG1FbmRpYW5PdXQud3JpdGUobWFwR2FpbnMsIDAsIG1hcFBvaW50c1YgKiBtYXBQb2ludHNIICogbWFwUGxhbmVzKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgbUNvdW50Kys7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvc3JjL0VuZGlhblV0aWxzLmNwcCBiL21lZGlhL2ltZ191dGlscy9zcmMvRW5kaWFuVXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ODFjYmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL0VuZGlhblV0aWxzLmNwcApAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8aW1nX3V0aWxzL0VuZGlhblV0aWxzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCitFbmRpYW5PdXRwdXQ6OkVuZGlhbk91dHB1dChPdXRwdXQqIG91dCwgRW5kaWFubmVzcyBlbmQpCisgICAgICAgIDogbU9mZnNldCgwKSwgbU91dHB1dChvdXQpLCBtRW5kaWFuKGVuZCkge30KKworRW5kaWFuT3V0cHV0Ojp+RW5kaWFuT3V0cHV0KCkge30KKworc3RhdHVzX3QgRW5kaWFuT3V0cHV0OjpvcGVuKCkgeworICAgIG1PZmZzZXQgPSAwOworICAgIHJldHVybiBtT3V0cHV0LT5vcGVuKCk7Cit9CisKK3N0YXR1c190IEVuZGlhbk91dHB1dDo6Y2xvc2UoKSB7CisgICAgcmV0dXJuIG1PdXRwdXQtPmNsb3NlKCk7Cit9CisKK3ZvaWQgRW5kaWFuT3V0cHV0OjpzZXRFbmRpYW5uZXNzKEVuZGlhbm5lc3MgZW5kKSB7CisgICAgbUVuZGlhbiA9IGVuZDsKK30KKwordWludDMyX3QgRW5kaWFuT3V0cHV0OjpnZXRDdXJyZW50T2Zmc2V0KCkgY29uc3QgeworICAgIHJldHVybiBtT2Zmc2V0OworfQorCitFbmRpYW5uZXNzIEVuZGlhbk91dHB1dDo6Z2V0RW5kaWFubmVzcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUVuZGlhbjsKK30KKworc3RhdHVzX3QgRW5kaWFuT3V0cHV0Ojp3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBjb3VudCkgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIGlmKChyZXMgPSBtT3V0cHV0LT53cml0ZShidWYsIG9mZnNldCwgY291bnQpKSA9PSBPSykgeworICAgICAgICBtT2Zmc2V0ICs9IGNvdW50OworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0dXNfdCBFbmRpYW5PdXRwdXQ6OndyaXRlKGNvbnN0IGludDhfdCogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpIHsKKyAgICByZXR1cm4gd3JpdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oYnVmKSwgb2Zmc2V0LCBjb3VudCk7Cit9CisKKyNkZWZpbmUgREVGSU5FX1dSSVRFKF90eXBlXykgXAorc3RhdHVzX3QgRW5kaWFuT3V0cHV0Ojp3cml0ZShjb25zdCBfdHlwZV8qIGJ1Ziwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNvdW50KSB7IFwKKyAgICByZXR1cm4gd3JpdGVIZWxwZXI8X3R5cGVfPihidWYsIG9mZnNldCwgY291bnQpOyBcCit9CisKK0RFRklORV9XUklURSh1aW50MTZfdCkKK0RFRklORV9XUklURShpbnQxNl90KQorREVGSU5FX1dSSVRFKHVpbnQzMl90KQorREVGSU5FX1dSSVRFKGludDMyX3QpCitERUZJTkVfV1JJVEUodWludDY0X3QpCitERUZJTkVfV1JJVEUoaW50NjRfdCkKKworc3RhdHVzX3QgRW5kaWFuT3V0cHV0Ojp3cml0ZShjb25zdCBmbG9hdCogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpIHsKKyAgICBhc3NlcnQoc2l6ZW9mKGZsb2F0KSA9PSBzaXplb2YodWludDMyX3QpKTsKKyAgICByZXR1cm4gd3JpdGVIZWxwZXI8dWludDMyX3Q+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QqPihidWYpLCBvZmZzZXQsIGNvdW50KTsKK30KKworc3RhdHVzX3QgRW5kaWFuT3V0cHV0Ojp3cml0ZShjb25zdCBkb3VibGUqIGJ1Ziwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNvdW50KSB7CisgICAgYXNzZXJ0KHNpemVvZihkb3VibGUpID09IHNpemVvZih1aW50NjRfdCkpOworICAgIHJldHVybiB3cml0ZUhlbHBlcjx1aW50NjRfdD4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50NjRfdCo+KGJ1ZiksIG9mZnNldCwgY291bnQpOworfQorCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL3NyYy9GaWxlSW5wdXQuY3BwIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9GaWxlSW5wdXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5OGU3MTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL0ZpbGVJbnB1dC5jcHAKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGltZ191dGlscy9GaWxlSW5wdXQuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworRmlsZUlucHV0OjpGaWxlSW5wdXQoU3RyaW5nOCBwYXRoKSA6IG1GcChOVUxMKSwgbVBhdGgocGF0aCksIG1PcGVuKGZhbHNlKSB7fQorCitGaWxlSW5wdXQ6On5GaWxlSW5wdXQoKSB7CisgICAgaWYgKG1PcGVuKSB7CisgICAgICAgIEFMT0dFKCIlczogRmlsZUlucHV0IGRlc3Ryb3llZCB3aXRob3V0IGNhbGxpbmcgY2xvc2UhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgY2xvc2UoKTsKKyAgICB9CisKK30KKworc3RhdHVzX3QgRmlsZUlucHV0OjpvcGVuKCkgeworICAgIGlmIChtT3BlbikgeworICAgICAgICBBTE9HVygiJXM6IE9wZW4gY2FsbGVkIHdoZW4gZmlsZSAlcyBhbHJlYWR5IG9wZW4uIiwgX19GVU5DVElPTl9fLCBtUGF0aC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgbUZwID0gOjpmb3BlbihtUGF0aCwgInJiIik7CisgICAgaWYgKCFtRnApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3Qgb3BlbiBmaWxlICVzIiwgX19GVU5DVElPTl9fLCBtUGF0aC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIG1PcGVuID0gdHJ1ZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3NzaXplX3QgRmlsZUlucHV0OjpyZWFkKHVpbnQ4X3QqIGJ1Ziwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNvdW50KSB7CisgICAgaWYgKCFtT3BlbikgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCByZWFkIGZpbGUgJXMsIGZpbGUgbm90IG9wZW4uIiwgX19GVU5DVElPTl9fLCBtUGF0aC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc2l6ZV90IGJ5dGVzUmVhZCA9IDo6ZnJlYWQoYnVmICsgb2Zmc2V0LCBzaXplb2YodWludDhfdCksIGNvdW50LCBtRnApOworICAgIGludCBlcnJvciA9IDo6ZmVycm9yKG1GcCk7CisgICAgaWYgKGVycm9yICE9IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvciAlZCBvY2N1cnJlZCB3aGlsZSByZWFkaW5nIGZpbGUgJXMuIiwgX19GVU5DVElPTl9fLCBlcnJvciwgbVBhdGguc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIEVuZCBvZiBmaWxlIHJlYWNoZWQKKyAgICBpZiAoOjpmZW9mKG1GcCkgIT0gMCAmJiBieXRlc1JlYWQgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOworICAgIH0KKworICAgIHJldHVybiBieXRlc1JlYWQ7Cit9CisKK3N0YXR1c190IEZpbGVJbnB1dDo6Y2xvc2UoKSB7CisgICAgaWYoIW1PcGVuKSB7CisgICAgICAgIEFMT0dXKCIlczogQ2xvc2UgY2FsbGVkIHdoZW4gZmlsZSAlcyBhbHJlYWR5IGNsb3NlLiIsIF9fRlVOQ1RJT05fXywgbVBhdGguc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RhdHVzX3QgcmV0ID0gT0s7CisgICAgaWYoOjpmY2xvc2UobUZwKSAhPSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGNsb3NlIGZpbGUgJXMuIiwgX19GVU5DVElPTl9fLCBtUGF0aC5zdHJpbmcoKSk7CisgICAgICAgIHJldCA9IEJBRF9WQUxVRTsKKyAgICB9CisgICAgbU9wZW4gPSBmYWxzZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvc3JjL0ZpbGVPdXRwdXQuY3BwIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9GaWxlT3V0cHV0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTc2M2ZmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9GaWxlT3V0cHV0LmNwcApAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8aW1nX3V0aWxzL0ZpbGVPdXRwdXQuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworRmlsZU91dHB1dDo6RmlsZU91dHB1dChTdHJpbmc4IHBhdGgpIDogbUZwKE5VTEwpLCBtUGF0aChwYXRoKSwgbU9wZW4oZmFsc2UpIHt9CisKK0ZpbGVPdXRwdXQ6On5GaWxlT3V0cHV0KCkgeworICAgIGlmIChtT3BlbikgeworICAgICAgICBBTE9HVygiJXM6IERlc3RydWN0b3IgY2FsbGVkIHdpdGggJXMgc3RpbGwgb3Blbi4iLCBfX0ZVTkNUSU9OX18sIG1QYXRoLnN0cmluZygpKTsKKyAgICAgICAgY2xvc2UoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IEZpbGVPdXRwdXQ6Om9wZW4oKSB7CisgICAgaWYgKG1PcGVuKSB7CisgICAgICAgIEFMT0dXKCIlczogT3BlbiBjYWxsZWQgd2hlbiBmaWxlICVzIGFscmVhZHkgb3Blbi4iLCBfX0ZVTkNUSU9OX18sIG1QYXRoLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICBtRnAgPSA6OmZvcGVuKG1QYXRoLCAid2IiKTsKKyAgICBpZiAoIW1GcCkgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBvcGVuIGZpbGUgJXMiLCBfX0ZVTkNUSU9OX18sIG1QYXRoLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgbU9wZW4gPSB0cnVlOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRmlsZU91dHB1dDo6d3JpdGUoY29uc3QgdWludDhfdCogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpIHsKKyAgICBpZiAoIW1PcGVuKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IHdyaXRlIGZpbGUgJXMsIGZpbGUgbm90IG9wZW4uIiwgX19GVU5DVElPTl9fLCBtUGF0aC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgOjpmd3JpdGUoYnVmICsgb2Zmc2V0LCBzaXplb2YodWludDhfdCksIGNvdW50LCBtRnApOworCisgICAgaW50IGVycm9yID0gOjpmZXJyb3IobUZwKTsKKyAgICBpZiAoZXJyb3IgIT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yICVkIG9jY3VycmVkIHdoaWxlIHdyaXRpbmcgZmlsZSAlcy4iLCBfX0ZVTkNUSU9OX18sIGVycm9yLCBtUGF0aC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRmlsZU91dHB1dDo6Y2xvc2UoKSB7CisgICAgaWYoIW1PcGVuKSB7CisgICAgICAgIEFMT0dXKCIlczogQ2xvc2UgY2FsbGVkIHdoZW4gZmlsZSAlcyBhbHJlYWR5IGNsb3NlLiIsIF9fRlVOQ1RJT05fXywgbVBhdGguc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RhdHVzX3QgcmV0ID0gT0s7CisgICAgaWYoOjpmY2xvc2UobUZwKSAhPSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGNsb3NlIGZpbGUgJXMuIiwgX19GVU5DVElPTl9fLCBtUGF0aC5zdHJpbmcoKSk7CisgICAgICAgIHJldCA9IEJBRF9WQUxVRTsKKyAgICB9CisgICAgbU9wZW4gPSBmYWxzZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvc3JjL0lucHV0LmNwcCBiL21lZGlhL2ltZ191dGlscy9zcmMvSW5wdXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ODIwMTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL0lucHV0LmNwcApAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8aW1nX3V0aWxzL0lucHV0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCitJbnB1dDo6fklucHV0KCkge30KKworc3RhdHVzX3QgSW5wdXQ6Om9wZW4oKSB7IHJldHVybiBPSzsgfQorCitzdGF0dXNfdCBJbnB1dDo6Y2xvc2UoKSB7IHJldHVybiBPSzsgfQorCitzc2l6ZV90IElucHV0Ojpza2lwKHNpemVfdCBjb3VudCkgeworICAgIGNvbnN0IHNpemVfdCBTS0lQX0JVRl9TSVpFID0gMTAyNDsKKyAgICB1aW50OF90IHNraXBCdWZbU0tJUF9CVUZfU0laRV07CisKKyAgICBzaXplX3QgcmVtYWluaW5nID0gY291bnQ7CisgICAgd2hpbGUgKHJlbWFpbmluZyA+IDApIHsKKyAgICAgICAgc2l6ZV90IGFtdCA9IChTS0lQX0JVRl9TSVpFID4gcmVtYWluaW5nKSA/IHJlbWFpbmluZyA6IFNLSVBfQlVGX1NJWkU7CisgICAgICAgIHNzaXplX3QgcmV0ID0gcmVhZChza2lwQnVmLCAwLCBhbXQpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgaWYocmV0ID09IE5PVF9FTk9VR0hfREFUQSkgeworICAgICAgICAgICAgICAgIC8vIEVuZCBvZiBmaWxlIGVuY291bnRlcmVkCisgICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA9PSBjb3VudCkgeworICAgICAgICAgICAgICAgICAgICAvLyBSZWFkIG5vIGJ5dGVzLCByZXR1cm4gRU9GCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gUmV0dXJuIG51bSBieXRlcyByZWFkCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb3VudCAtIHJlbWFpbmluZzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBSZXR1cm4gZXJyb3IgY29kZS4KKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgcmVtYWluaW5nIC09IHJldDsKKyAgICB9CisgICAgcmV0dXJuIGNvdW50OworfQorCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLworCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvc3JjL09yZGVyYWJsZS5jcHAgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL09yZGVyYWJsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAwZjEyMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9zcmMvT3JkZXJhYmxlLmNwcApAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8aW1nX3V0aWxzL09yZGVyYWJsZS5oPgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCisjZGVmaW5lIENPTVBBUkUob3ApIFwKK2Jvb2wgT3JkZXJhYmxlOjpvcGVyYXRvciBvcCAoY29uc3QgT3JkZXJhYmxlJiBvcmRlcmFibGUpIGNvbnN0IHsgXAorICAgIHJldHVybiBnZXRDb21wYXJhYmxlVmFsdWUoKSBvcCBvcmRlcmFibGUuZ2V0Q29tcGFyYWJsZVZhbHVlKCk7IFwKK30KKworQ09NUEFSRSg+KQorQ09NUEFSRSg8KQorQ09NUEFSRSg+PSkKK0NPTVBBUkUoPD0pCitDT01QQVJFKD09KQorQ09NUEFSRSghPSkKKworT3JkZXJhYmxlOjp+T3JkZXJhYmxlKCkge30KKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCBiL21lZGlhL2ltZ191dGlscy9zcmMvT3V0cHV0LmNwcApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggNjYlCmNvcHkgZnJvbSBsaWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKY29weSB0byBtZWRpYS9pbWdfdXRpbHMvc3JjL091dHB1dC5jcHAKaW5kZXggMTNjYWM2ZC4uMGUzOTViOQotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKKysrIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9PdXRwdXQuY3BwCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCwxMyArMTQsMTUgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpZm5kZWYgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19ICi0jZGVmaW5lIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSAogCi0vKiAtLS0tLSBNYWluIGZlYXR1cmVzIC0tLS0tICovCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlc19NQ1MuaCIgLyogVHJhbnNjb2RlciAqLworI2luY2x1ZGUgPGltZ191dGlscy9PdXRwdXQuaD4KIAotLyogLS0tLS0gQWRkLW9ucyAtLS0tLSAqLworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CiAKLSNlbmRpZiAvKiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0ggKi8KK091dHB1dDo6fk91dHB1dCgpIHt9CitzdGF0dXNfdCBPdXRwdXQ6Om9wZW4oKSB7IHJldHVybiBPSzsgfQorc3RhdHVzX3QgT3V0cHV0OjpjbG9zZSgpIHsgcmV0dXJuIE9LOyB9CiAKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvc3JjL1NvcnRlZEVudHJ5VmVjdG9yLmNwcCBiL21lZGlhL2ltZ191dGlscy9zcmMvU29ydGVkRW50cnlWZWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZTFmYTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL1NvcnRlZEVudHJ5VmVjdG9yLmNwcApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8aW1nX3V0aWxzL1NvcnRlZEVudHJ5VmVjdG9yLmg+CisKKyNpbmNsdWRlIDx1dGlscy9UeXBlSGVscGVycy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworU29ydGVkRW50cnlWZWN0b3I6On5Tb3J0ZWRFbnRyeVZlY3RvcigpIHt9CisKK3NzaXplX3QgU29ydGVkRW50cnlWZWN0b3I6OmluZGV4T2ZUYWcodWludDE2X3QgdGFnKSBjb25zdCB7CisgICAgLy8gVE9ETzogVXNlIGJpbmFyeSBzZWFyY2ggaGVyZS4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgKytpKSB7CisgICAgICAgIGlmIChpdGVtQXQoaSktPmdldFRhZygpID09IHRhZykgeworICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCitpbnQgU29ydGVkRW50cnlWZWN0b3I6OmRvX2NvbXBhcmUoY29uc3Qgdm9pZCogbGhzLCBjb25zdCB2b2lkKiByaHMpIGNvbnN0IHsKKyAgICBjb25zdCBzcDxUaWZmRW50cnk+KiBsRW50cnkgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHNwPFRpZmZFbnRyeT4qPihsaHMpOworICAgIGNvbnN0IHNwPFRpZmZFbnRyeT4qIHJFbnRyeSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc3A8VGlmZkVudHJ5Pio+KHJocyk7CisgICAgcmV0dXJuIGNvbXBhcmVfdHlwZSgqKmxFbnRyeSwgKipyRW50cnkpOworfQorCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9TdHJpcFNvdXJjZS5jcHAKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApzaW1pbGFyaXR5IGluZGV4IDY2JQpjb3B5IGZyb20gbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oCmNvcHkgdG8gbWVkaWEvaW1nX3V0aWxzL3NyYy9TdHJpcFNvdXJjZS5jcHAKaW5kZXggMTNjYWM2ZC4uNTdiNjA4MgotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKKysrIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9TdHJpcFNvdXJjZS5jcHAKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDEzICsxNCwxMiBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2lmbmRlZiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0gKLSNkZWZpbmUgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19ICisjaW5jbHVkZSA8aW1nX3V0aWxzL1N0cmlwU291cmNlLmg+CiAKLS8qIC0tLS0tIE1haW4gZmVhdHVyZXMgLS0tLS0gKi8KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzX01DUy5oIiAvKiBUcmFuc2NvZGVyICovCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKIAotLyogLS0tLS0gQWRkLW9ucyAtLS0tLSAqLworU3RyaXBTb3VyY2U6On5TdHJpcFNvdXJjZSgpIHt9CiAKLSNlbmRpZiAvKiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0ggKi8KLQorfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9zcmMvVGlmZkVudHJ5LmNwcCBiL21lZGlhL2ltZ191dGlscy9zcmMvVGlmZkVudHJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjIwZTM2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9UaWZmRW50cnkuY3BwCkBAIC0wLDAgKzEsMjM0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8aW1nX3V0aWxzL1RpZmZJZmQuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvVGlmZkhlbHBlcnMuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvVGlmZkVudHJ5Lmg+CisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCitUaWZmRW50cnk6On5UaWZmRW50cnkoKSB7fQorCisvKioKKyAqIFNwZWNpYWxpemUgZm9yIGVhY2ggdmFsaWQgdHlwZSwgaW5jbHVkaW5nIHN1Yi1JRkRzLgorICoKKyAqIFZhbHVlcyB3aXRoIHR5cGVzIG90aGVyIHRoYW4gdGhlIG9uZXMgZ2l2ZW4gaGVyZSBzaG91bGQgbm90IGNvbXBpbGUuCisgKi8KKwordGVtcGxhdGU8PgorY29uc3Qgc3A8VGlmZklmZD4qIFRpZmZFbnRyeTo6Zm9yY2VWYWxpZFR5cGU8c3A8VGlmZklmZD4gPihUYWdUeXBlIHR5cGUsIGNvbnN0IHNwPFRpZmZJZmQ+KiB2YWx1ZSkgeworICAgIGlmICh0eXBlID09IExPTkcpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKyAgICBBTE9HRSgiJXM6IFZhbHVlIG9mIHR5cGUgJ2lmZCcgaXMgbm90IHZhbGlkIGZvciB0YWcgd2l0aCBUSUZGIHR5cGUgJWQuIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdHlwZSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3RlbXBsYXRlPD4KK2NvbnN0IHVpbnQ4X3QqIFRpZmZFbnRyeTo6Zm9yY2VWYWxpZFR5cGU8dWludDhfdD4oVGFnVHlwZSB0eXBlLCBjb25zdCB1aW50OF90KiB2YWx1ZSkgeworICAgIGlmICh0eXBlID09IEJZVEUgfHwgdHlwZSA9PSBBU0NJSSB8fCB0eXBlID09IFVOREVGSU5FRCkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIEFMT0dFKCIlczogVmFsdWUgb2YgdHlwZSAndWludDhfdCcgaXMgbm90IHZhbGlkIGZvciB0YWcgd2l0aCBUSUZGIHR5cGUgJWQuIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdHlwZSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3RlbXBsYXRlPD4KK2NvbnN0IGludDhfdCogVGlmZkVudHJ5Ojpmb3JjZVZhbGlkVHlwZTxpbnQ4X3Q+KFRhZ1R5cGUgdHlwZSwgY29uc3QgaW50OF90KiB2YWx1ZSkgeworICAgIGlmICh0eXBlID09IFNCWVRFIHx8IHR5cGUgPT0gQVNDSUkgfHwgdHlwZSA9PSBVTkRFRklORUQpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKyAgICBBTE9HRSgiJXM6IFZhbHVlIG9mIHR5cGUgJ2ludDhfdCcgaXMgbm90IHZhbGlkIGZvciB0YWcgd2l0aCBUSUZGIHR5cGUgJWQuIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdHlwZSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3RlbXBsYXRlPD4KK2NvbnN0IHVpbnQxNl90KiBUaWZmRW50cnk6OmZvcmNlVmFsaWRUeXBlPHVpbnQxNl90PihUYWdUeXBlIHR5cGUsIGNvbnN0IHVpbnQxNl90KiB2YWx1ZSkgeworICAgIGlmICh0eXBlID09IFNIT1JUKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisgICAgQUxPR0UoIiVzOiBWYWx1ZSBvZiB0eXBlICd1aW50MTZfdCcgaXMgbm90IHZhbGlkIGZvciB0YWcgd2l0aCBUSUZGIHR5cGUgJWQuIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdHlwZSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3RlbXBsYXRlPD4KK2NvbnN0IGludDE2X3QqIFRpZmZFbnRyeTo6Zm9yY2VWYWxpZFR5cGU8aW50MTZfdD4oVGFnVHlwZSB0eXBlLCBjb25zdCBpbnQxNl90KiB2YWx1ZSkgeworICAgIGlmICh0eXBlID09IFNTSE9SVCkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIEFMT0dFKCIlczogVmFsdWUgb2YgdHlwZSAnaW50MTZfdCcgaXMgbm90IHZhbGlkIGZvciB0YWcgd2l0aCBUSUZGIHR5cGUgJWQuIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdHlwZSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3RlbXBsYXRlPD4KK2NvbnN0IHVpbnQzMl90KiBUaWZmRW50cnk6OmZvcmNlVmFsaWRUeXBlPHVpbnQzMl90PihUYWdUeXBlIHR5cGUsIGNvbnN0IHVpbnQzMl90KiB2YWx1ZSkgeworICAgIGlmICh0eXBlID09IExPTkcgfHwgdHlwZSA9PSBSQVRJT05BTCkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIEFMT0dFKCIlczogVmFsdWUgb2YgdHlwZSAndWludDMyX3QnIGlzIG5vdCB2YWxpZCBmb3IgdGFnIHdpdGggVElGRiB0eXBlICVkLiIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHR5cGUpOworICAgIHJldHVybiBOVUxMOworfQorCit0ZW1wbGF0ZTw+Citjb25zdCBpbnQzMl90KiBUaWZmRW50cnk6OmZvcmNlVmFsaWRUeXBlPGludDMyX3Q+KFRhZ1R5cGUgdHlwZSwgY29uc3QgaW50MzJfdCogdmFsdWUpIHsKKyAgICBpZiAodHlwZSA9PSBTTE9ORyB8fCB0eXBlID09IFNSQVRJT05BTCkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIEFMT0dFKCIlczogVmFsdWUgb2YgdHlwZSAnaW50MzJfdCcgaXMgbm90IHZhbGlkIGZvciB0YWcgd2l0aCBUSUZGIHR5cGUgJWQuIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdHlwZSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3RlbXBsYXRlPD4KK2NvbnN0IGRvdWJsZSogVGlmZkVudHJ5Ojpmb3JjZVZhbGlkVHlwZTxkb3VibGU+KFRhZ1R5cGUgdHlwZSwgY29uc3QgZG91YmxlKiB2YWx1ZSkgeworICAgIGlmICh0eXBlID09IERPVUJMRSkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIEFMT0dFKCIlczogVmFsdWUgb2YgdHlwZSAnZG91YmxlJyBpcyBub3QgdmFsaWQgZm9yIHRhZyB3aXRoIFRJRkYgdHlwZSAlZC4iLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCB0eXBlKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKwordGVtcGxhdGU8PgorY29uc3QgZmxvYXQqIFRpZmZFbnRyeTo6Zm9yY2VWYWxpZFR5cGU8ZmxvYXQ+KFRhZ1R5cGUgdHlwZSwgY29uc3QgZmxvYXQqIHZhbHVlKSB7CisgICAgaWYgKHR5cGUgPT0gRkxPQVQpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKyAgICBBTE9HRSgiJXM6IFZhbHVlIG9mIHR5cGUgJ2Zsb2F0JyBpcyBub3QgdmFsaWQgZm9yIHRhZyB3aXRoIFRJRkYgdHlwZSAlZC4iLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCB0eXBlKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworU3RyaW5nOCBUaWZmRW50cnk6OnRvU3RyaW5nKCkgY29uc3QgeworICAgIFN0cmluZzggb3V0cHV0OworICAgIHVpbnQzMl90IGNvdW50ID0gZ2V0Q291bnQoKTsKKyAgICBvdXRwdXQuYXBwZW5kRm9ybWF0KCJbaWQ6ICV4LCB0eXBlOiAlZCwgY291bnQ6ICV1LCB2YWx1ZTogJyIsIGdldFRhZygpLCBnZXRUeXBlKCksIGNvdW50KTsKKworICAgIHNpemVfdCBjYXBwZWRDb3VudCA9IGNvdW50OworICAgIGlmIChjb3VudCA+IE1BWF9QUklOVF9TVFJJTkdfTEVOR1RIKSB7CisgICAgICAgIGNhcHBlZENvdW50ID0gTUFYX1BSSU5UX1NUUklOR19MRU5HVEg7CisgICAgfQorCisgICAgVGFnVHlwZSB0eXBlID0gZ2V0VHlwZSgpOworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIFVOREVGSU5FRDoKKyAgICAgICAgY2FzZSBCWVRFOiB7CisgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0eXBlZF9kYXRhID0gZ2V0RGF0YTx1aW50OF90PigpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXBwZWRDb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZEZvcm1hdCgiJXUgIiwgdHlwZWRfZGF0YVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEFTQ0lJOiB7CisgICAgICAgICAgICBjb25zdCBjaGFyKiB0eXBlZF9kYXRhID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oZ2V0RGF0YTx1aW50OF90PigpKTsKKyAgICAgICAgICAgIHNpemVfdCBsZW4gPSBjb3VudDsKKyAgICAgICAgICAgIGlmIChjb3VudCA+IE1BWF9QUklOVF9TVFJJTkdfTEVOR1RIKSB7CisgICAgICAgICAgICAgICAgIGxlbiA9IE1BWF9QUklOVF9TVFJJTkdfTEVOR1RIOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCh0eXBlZF9kYXRhLCBsZW4pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBTSE9SVDogeworICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIHR5cGVkX2RhdGEgPSBnZXREYXRhPHVpbnQxNl90PigpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXBwZWRDb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZEZvcm1hdCgiJXUgIiwgdHlwZWRfZGF0YVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIExPTkc6IHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiB0eXBlZF9kYXRhID0gZ2V0RGF0YTx1aW50MzJfdD4oKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FwcGVkQ291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmRGb3JtYXQoIiV1ICIsIHR5cGVkX2RhdGFbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBSQVRJT05BTDogeworICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIHR5cGVkX2RhdGEgPSBnZXREYXRhPHVpbnQzMl90PigpOworICAgICAgICAgICAgY2FwcGVkQ291bnQgPDw9IDE7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhcHBlZENvdW50OyBpKz0yKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZEZvcm1hdCgiJXUvJXUgIiwgdHlwZWRfZGF0YVtpXSwgdHlwZWRfZGF0YVtpICsgMV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBTQllURTogeworICAgICAgICAgICAgY29uc3QgaW50OF90KiB0eXBlZF9kYXRhID0gZ2V0RGF0YTxpbnQ4X3Q+KCk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhcHBlZENvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kRm9ybWF0KCIlZCAiLCB0eXBlZF9kYXRhW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgU1NIT1JUOiB7CisgICAgICAgICAgICBjb25zdCBpbnQxNl90KiB0eXBlZF9kYXRhID0gZ2V0RGF0YTxpbnQxNl90PigpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXBwZWRDb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZEZvcm1hdCgiJWQgIiwgdHlwZWRfZGF0YVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFNMT05HOiB7CisgICAgICAgICAgICBjb25zdCBpbnQzMl90KiB0eXBlZF9kYXRhID0gZ2V0RGF0YTxpbnQzMl90PigpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXBwZWRDb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZEZvcm1hdCgiJWQgIiwgdHlwZWRfZGF0YVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFNSQVRJT05BTDogeworICAgICAgICAgICAgY29uc3QgaW50MzJfdCogdHlwZWRfZGF0YSA9IGdldERhdGE8aW50MzJfdD4oKTsKKyAgICAgICAgICAgIGNhcHBlZENvdW50IDw8PSAxOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXBwZWRDb3VudDsgaSs9MikgeworICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmRGb3JtYXQoIiVkLyVkICIsIHR5cGVkX2RhdGFbaV0sIHR5cGVkX2RhdGFbaSArIDFdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRkxPQVQ6IHsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0KiB0eXBlZF9kYXRhID0gZ2V0RGF0YTxmbG9hdD4oKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FwcGVkQ291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmRGb3JtYXQoIiVmICIsIHR5cGVkX2RhdGFbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBET1VCTEU6IHsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogdHlwZWRfZGF0YSA9IGdldERhdGE8ZG91YmxlPigpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXBwZWRDb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZEZvcm1hdCgiJWYgIiwgdHlwZWRfZGF0YVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJ1bmtub3duIHR5cGUgIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjb3VudCA+IE1BWF9QUklOVF9TVFJJTkdfTEVOR1RIKSB7CisgICAgICAgIG91dHB1dC5hcHBlbmQoIi4uLiIpOworICAgIH0KKyAgICBvdXRwdXQuYXBwZW5kKCInXSIpOworICAgIHJldHVybiBvdXRwdXQ7Cit9CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmggYi9tZWRpYS9pbWdfdXRpbHMvc3JjL1RpZmZFbnRyeUltcGwuY3BwCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCA2NiUKY29weSBmcm9tIGxpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaApjb3B5IHRvIG1lZGlhL2ltZ191dGlscy9zcmMvVGlmZkVudHJ5SW1wbC5jcHAKaW5kZXggMTNjYWM2ZC4uMjU3YzI2NgotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKKysrIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9UaWZmRW50cnlJbXBsLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTQsMTMgKzE0LDEyIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaWZuZGVmIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSAotI2RlZmluZSBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0gKKyNpbmNsdWRlIDxpbWdfdXRpbHMvVGlmZkVudHJ5SW1wbC5oPgogCi0vKiAtLS0tLSBNYWluIGZlYXR1cmVzIC0tLS0tICovCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlc19NQ1MuaCIgLyogVHJhbnNjb2RlciAqLworI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCi0vKiAtLS0tLSBBZGQtb25zIC0tLS0tICovCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKIAotI2VuZGlmIC8qIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSCAqLwotCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL3NyYy9UaWZmSWZkLmNwcCBiL21lZGlhL2ltZ191dGlscy9zcmMvVGlmZklmZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZiMDBjYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9zcmMvVGlmZklmZC5jcHAKQEAgLTAsMCArMSwzODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiVGlmZklmZCIKKworI2luY2x1ZGUgPGltZ191dGlscy9UYWdEZWZpbml0aW9ucy5oPgorI2luY2x1ZGUgPGltZ191dGlscy9UaWZmSGVscGVycy5oPgorI2luY2x1ZGUgPGltZ191dGlscy9UaWZmSWZkLmg+CisjaW5jbHVkZSA8aW1nX3V0aWxzL1RpZmZXcml0ZXIuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworVGlmZklmZDo6VGlmZklmZCh1aW50MzJfdCBpZmRJZCkKKyAgICAgICAgOiBtTmV4dElmZCgpLCBtSWZkSWQoaWZkSWQpLCBtU3RyaXBPZmZzZXRzSW5pdGlhbGl6ZWQoZmFsc2UpIHt9CisKK1RpZmZJZmQ6On5UaWZmSWZkKCkge30KKworc3RhdHVzX3QgVGlmZklmZDo6YWRkRW50cnkoY29uc3Qgc3A8VGlmZkVudHJ5PiYgZW50cnkpIHsKKyAgICBzaXplX3Qgc2l6ZSA9IG1FbnRyaWVzLnNpemUoKTsKKyAgICBpZiAoc2l6ZSA+PSBNQVhfSUZEX0VOVFJJRVMpIHsKKyAgICAgICAgQUxPR1coIiVzOiBGYWlsZWQgdG8gYWRkIGVudHJ5IGZvciB0YWcgMHgleCB0byBJRkQgJXUsIHRvbyBtYW55IGVudHJpZXMgaW4gSUZEISIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBlbnRyeS0+Z2V0VGFnKCksIG1JZmRJZCk7CisgICAgICAgIHJldHVybiBCQURfSU5ERVg7CisgICAgfQorCisgICAgaWYgKG1FbnRyaWVzLmFkZChlbnRyeSkgPCAwKSB7CisgICAgICAgIEFMT0dXKCIlczogRmFpbGVkIHRvIGFkZCBlbnRyeSBmb3IgdGFnIDB4JXggdG8gaWZkICV1LiIsIF9fRlVOQ1RJT05fXywgZW50cnktPmdldFRhZygpLAorICAgICAgICAgICAgICAgIG1JZmRJZCk7CisgICAgICAgIHJldHVybiBCQURfSU5ERVg7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3A8VGlmZkVudHJ5PiBUaWZmSWZkOjpnZXRFbnRyeSh1aW50MTZfdCB0YWcpIGNvbnN0IHsKKyAgICBzc2l6ZV90IGluZGV4ID0gbUVudHJpZXMuaW5kZXhPZlRhZyh0YWcpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coIiVzOiBObyBlbnRyeSBmb3IgdGFnIDB4JXggaW4gaWZkICV1LiIsIF9fRlVOQ1RJT05fXywgdGFnLCBtSWZkSWQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIG1FbnRyaWVzW2luZGV4XTsKK30KKwordm9pZCBUaWZmSWZkOjpyZW1vdmVFbnRyeSh1aW50MTZfdCB0YWcpIHsKKyAgICBzc2l6ZV90IGluZGV4ID0gbUVudHJpZXMuaW5kZXhPZlRhZyh0YWcpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIG1FbnRyaWVzLnJlbW92ZUF0KGluZGV4KTsKKyAgICB9Cit9CisKKwordm9pZCBUaWZmSWZkOjpzZXROZXh0SWZkKGNvbnN0IHNwPFRpZmZJZmQ+JiBpZmQpIHsKKyAgICBtTmV4dElmZCA9IGlmZDsKK30KKworc3A8VGlmZklmZD4gVGlmZklmZDo6Z2V0TmV4dElmZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbU5leHRJZmQ7Cit9CisKK3VpbnQzMl90IFRpZmZJZmQ6OmNoZWNrQW5kR2V0T2Zmc2V0KHVpbnQzMl90IG9mZnNldCkgY29uc3QgeworICAgIHNpemVfdCBzaXplID0gbUVudHJpZXMuc2l6ZSgpOworCisgICAgaWYgKHNpemUgPiBNQVhfSUZEX0VOVFJJRVMpIHsKKyAgICAgICAgQUxPR1coIiVzOiBDb3VsZCBub3QgY2FsY3VsYXRlIElGRCBvZmZzZXRzLCBJRkQgJXUgY29udGFpbnMgdG9vIG1hbnkgZW50cmllcy4iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlmZElkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9PRkZTRVQ7CisgICAgfQorCisgICAgaWYgKHNpemUgPD0gMCkgeworICAgICAgICBBTE9HVygiJXM6IENvdWxkIG5vdCBjYWxjdWxhdGUgSUZEIG9mZnNldHMsIElGRCAldSBjb250YWlucyBubyBlbnRyaWVzLiIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBtSWZkSWQpOworICAgICAgICByZXR1cm4gQkFEX09GRlNFVDsKKyAgICB9CisKKyAgICBpZiAob2Zmc2V0ID09IEJBRF9PRkZTRVQpIHsKKyAgICAgICAgQUxPR1coIiVzOiBDb3VsZCBub3QgY2FsY3VsYXRlIElGRCBvZmZzZXRzLCBJRkQgJXUgaGFkIGEgYmFkIGluaXRpYWwgb2Zmc2V0LiIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWZkSWQpOworICAgICAgICByZXR1cm4gQkFEX09GRlNFVDsKKyAgICB9CisKKyAgICB1aW50MzJfdCBpZmRTaXplID0gY2FsY3VsYXRlSWZkU2l6ZShzaXplKTsKKyAgICBXT1JEX0FMSUdOKGlmZFNpemUpOworICAgIHJldHVybiBvZmZzZXQgKyBpZmRTaXplOworfQorCitzdGF0dXNfdCBUaWZmSWZkOjp3cml0ZURhdGEodWludDMyX3Qgb2Zmc2V0LCAvKm91dCovRW5kaWFuT3V0cHV0KiBvdXQpIGNvbnN0IHsKKyAgICBhc3NlcnQoKG9mZnNldCAlIFRJRkZfV09SRF9TSVpFKSA9PSAwKTsKKyAgICBzdGF0dXNfdCByZXQgPSBPSzsKKworICAgIEFMT0dWKCIlczogSUZEICV1IHdyaXR0ZW4gdG8gb2Zmc2V0ICV1IiwgX19GVU5DVElPTl9fLCBtSWZkSWQsIG9mZnNldCApOworICAgIHVpbnQzMl90IHZhbHVlT2Zmc2V0ID0gY2hlY2tBbmRHZXRPZmZzZXQob2Zmc2V0KTsKKyAgICBpZiAodmFsdWVPZmZzZXQgPT0gMCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNpemVfdCBzaXplID0gbUVudHJpZXMuc2l6ZSgpOworCisgICAgLy8gV3JpdGVyIElGRCBoZWFkZXIgKDIgYnl0ZXMsIG51bWJlciBvZiBlbnRyaWVzKS4KKyAgICB1aW50MTZfdCBoZWFkZXIgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oc2l6ZSk7CisgICAgQkFJTF9PTl9GQUlMKG91dC0+d3JpdGUoJmhlYWRlciwgMCwgMSksIHJldCk7CisKKyAgICAvLyBXcml0ZSB0YWcgZW50cmllcworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICAgIEJBSUxfT05fRkFJTChtRW50cmllc1tpXS0+d3JpdGVUYWdJbmZvKHZhbHVlT2Zmc2V0LCBvdXQpLCByZXQpOworICAgICAgICB2YWx1ZU9mZnNldCArPSBtRW50cmllc1tpXS0+Z2V0U2l6ZSgpOworICAgIH0KKworICAgIC8vIFdyaXRlciBJRkQgZm9vdGVyICg0IGJ5dGVzLCBvZmZzZXQgdG8gbmV4dCBJRkQpLgorICAgIHVpbnQzMl90IGZvb3RlciA9IChtTmV4dElmZCAhPSBOVUxMKSA/IG9mZnNldCArIGdldFNpemUoKSA6IDA7CisgICAgQkFJTF9PTl9GQUlMKG91dC0+d3JpdGUoJmZvb3RlciwgMCwgMSksIHJldCk7CisKKyAgICBhc3NlcnQob3V0LT5nZXRDdXJyZW50T2Zmc2V0KCkgPT0gb2Zmc2V0ICsgY2FsY3VsYXRlSWZkU2l6ZShzaXplKSk7CisKKyAgICAvLyBXcml0ZSB6ZXJvZXMgdGlsbCB3b3JkIGFsaWduZWQKKyAgICBaRVJPX1RJTExfV09SRChvdXQsIGNhbGN1bGF0ZUlmZFNpemUoc2l6ZSksIHJldCk7CisKKyAgICAvLyBXcml0ZSB2YWx1ZXMgZm9yIGVhY2ggdGFnIGVudHJ5CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgc2l6ZV90IGxhc3QgPSBvdXQtPmdldEN1cnJlbnRPZmZzZXQoKTsKKyAgICAgICAgLy8gT25seSB3cml0ZSB2YWx1ZXMgdGhhdCBhcmUgdG9vIGxhcmdlIHRvIGZpdCBpbiB0aGUgMTItYnl0ZSBUSUZGIGVudHJ5CisgICAgICAgIGlmIChtRW50cmllc1tpXS0+Z2V0U2l6ZSgpID4gT0ZGU0VUX1NJWkUpIHsKKyAgICAgICAgICAgIEJBSUxfT05fRkFJTChtRW50cmllc1tpXS0+d3JpdGVEYXRhKG91dC0+Z2V0Q3VycmVudE9mZnNldCgpLCBvdXQpLCByZXQpOworICAgICAgICB9CisgICAgICAgIHNpemVfdCBuZXh0ID0gb3V0LT5nZXRDdXJyZW50T2Zmc2V0KCk7CisgICAgICAgIHNpemVfdCBkaWZmID0gKG5leHQgLSBsYXN0KTsKKyAgICAgICAgc2l6ZV90IGFjdHVhbCA9IG1FbnRyaWVzW2ldLT5nZXRTaXplKCk7CisgICAgICAgIGlmIChkaWZmICE9IGFjdHVhbCkgeworICAgICAgICAgICAgQUxPR1coIlNpemVzIGRvIG5vdCBtYXRjaCBmb3IgdGFnICV4LiBFeHBlY3RlZCAlenUsIHJlY2VpdmVkICV6dSIsCisgICAgICAgICAgICAgICAgICAgIG1FbnRyaWVzW2ldLT5nZXRUYWcoKSwgYWN0dWFsLCBkaWZmKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGFzc2VydChvdXQtPmdldEN1cnJlbnRPZmZzZXQoKSA9PSBvZmZzZXQgKyBnZXRTaXplKCkpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc2l6ZV90IFRpZmZJZmQ6OmdldFNpemUoKSBjb25zdCB7CisgICAgc2l6ZV90IHNpemUgPSBtRW50cmllcy5zaXplKCk7CisgICAgdWludDMyX3QgdG90YWwgPSBjYWxjdWxhdGVJZmRTaXplKHNpemUpOworICAgIFdPUkRfQUxJR04odG90YWwpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICAgIHRvdGFsICs9IG1FbnRyaWVzW2ldLT5nZXRTaXplKCk7CisgICAgfQorICAgIHJldHVybiB0b3RhbDsKK30KKwordWludDMyX3QgVGlmZklmZDo6Z2V0SWQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JZmRJZDsKK30KKwordWludDMyX3QgVGlmZklmZDo6Z2V0Q29tcGFyYWJsZVZhbHVlKCkgY29uc3QgeworICAgIHJldHVybiBtSWZkSWQ7Cit9CisKK3N0YXR1c190IFRpZmZJZmQ6OnZhbGlkYXRlQW5kU2V0U3RyaXBUYWdzKCkgeworICAgIHNwPFRpZmZFbnRyeT4gd2lkdGhFbnRyeSA9IGdldEVudHJ5KFRBR19JTUFHRVdJRFRIKTsKKyAgICBpZiAod2lkdGhFbnRyeSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogSUZEICV1IGRvZXNuJ3QgaGF2ZSBhIEltYWdlV2lkdGggdGFnIHNldCIsIF9fRlVOQ1RJT05fXywgbUlmZElkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzcDxUaWZmRW50cnk+IGhlaWdodEVudHJ5ID0gZ2V0RW50cnkoVEFHX0lNQUdFTEVOR1RIKTsKKyAgICBpZiAoaGVpZ2h0RW50cnkgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IElGRCAldSBkb2Vzbid0IGhhdmUgYSBJbWFnZUxlbmd0aCB0YWcgc2V0IiwgX19GVU5DVElPTl9fLCBtSWZkSWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNwPFRpZmZFbnRyeT4gc2FtcGxlc0VudHJ5ID0gZ2V0RW50cnkoVEFHX1NBTVBMRVNQRVJQSVhFTCk7CisgICAgaWYgKHNhbXBsZXNFbnRyeSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogSUZEICV1IGRvZXNuJ3QgaGF2ZSBhIFNhbXBsZXNQZXJQaXhlbCB0YWcgc2V0IiwgX19GVU5DVElPTl9fLCBtSWZkSWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNwPFRpZmZFbnRyeT4gYml0c0VudHJ5ID0gZ2V0RW50cnkoVEFHX0JJVFNQRVJTQU1QTEUpOworICAgIGlmIChiaXRzRW50cnkgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IElGRCAldSBkb2Vzbid0IGhhdmUgYSBCaXRzUGVyU2FtcGxlIHRhZyBzZXQiLCBfX0ZVTkNUSU9OX18sIG1JZmRJZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgdWludDMyX3Qgd2lkdGggPSAqKHdpZHRoRW50cnktPmdldERhdGE8dWludDMyX3Q+KCkpOworICAgIHVpbnQzMl90IGhlaWdodCA9ICooaGVpZ2h0RW50cnktPmdldERhdGE8dWludDMyX3Q+KCkpOworICAgIHVpbnQxNl90IGJpdHNQZXJTYW1wbGUgPSAqKGJpdHNFbnRyeS0+Z2V0RGF0YTx1aW50MTZfdD4oKSk7CisgICAgdWludDE2X3Qgc2FtcGxlc1BlclBpeGVsID0gKihzYW1wbGVzRW50cnktPmdldERhdGE8dWludDE2X3Q+KCkpOworCisgICAgaWYgKChiaXRzUGVyU2FtcGxlICUgOCkgIT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IEJpdHNQZXJTYW1wbGUgJWQgaW4gSUZEICV1IGlzIG5vdCBieXRlLWFsaWduZWQuIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIGJpdHNQZXJTYW1wbGUsIG1JZmRJZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgdWludDMyX3QgYnl0ZXNQZXJTYW1wbGUgPSBiaXRzUGVyU2FtcGxlIC8gODsKKworICAgIC8vIENob29zZSBzdHJpcCBzaXplIGFzIGNsb3NlIHRvIDhrYiBhcyBwb3NzaWJsZSB3aXRob3V0IHNwbGl0dGluZyByb3dzLgorICAgIC8vIElmIHRoZSByb3cgbGVuZ3RoIGlzID44a2IsIGVhY2ggc3RyaXAgd2lsbCBvbmx5IGNvbnRhaW4gYSBzaW5nbGUgcm93LgorICAgIGNvbnN0IHVpbnQzMl90IHJvd0xlbmd0aEJ5dGVzID0gYnl0ZXNQZXJTYW1wbGUgKiBzYW1wbGVzUGVyUGl4ZWwgKiB3aWR0aDsKKyAgICBjb25zdCB1aW50MzJfdCBpZGVhbENodW5rU2l6ZSA9ICgxIDw8IDEzKTsgLy8gOGtiCisgICAgdWludDMyX3Qgcm93c1BlckNodW5rID0gaWRlYWxDaHVua1NpemUgLyByb3dMZW5ndGhCeXRlczsKKyAgICByb3dzUGVyQ2h1bmsgPSAocm93c1BlckNodW5rID09IDApID8gMSA6IHJvd3NQZXJDaHVuazsKKyAgICBjb25zdCB1aW50MzJfdCBhY3R1YWxDaHVua1NpemUgPSByb3dMZW5ndGhCeXRlcyAqIHJvd3NQZXJDaHVuazsKKworICAgIGNvbnN0IHVpbnQzMl90IGxhc3RDaHVua1Jvd3MgPSBoZWlnaHQgJSByb3dzUGVyQ2h1bms7CisgICAgY29uc3QgdWludDMyX3QgbGFzdENodW5rU2l6ZSA9IGxhc3RDaHVua1Jvd3MgKiByb3dMZW5ndGhCeXRlczsKKworICAgIGlmIChhY3R1YWxDaHVua1NpemUgPiAvKm1heCBzdHJpcCBzaXplIGZvciBUSUZGL0VQKi82NTUzNikgeworICAgICAgICBBTE9HRSgiJXM6IFN0cmlwIGxlbmd0aCB0b28gbG9uZy4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNpemVfdCBudW1TdHJpcHMgPSBoZWlnaHQgLyByb3dzUGVyQ2h1bms7CisKKyAgICAvLyBBZGQgYW5vdGhlciBzdHJpcCBmb3IgdGhlIGluY29tcGxldGUgY2h1bmsuCisgICAgaWYgKGxhc3RDaHVua1Jvd3MgPiAwKSB7CisgICAgICAgIG51bVN0cmlwcyArPSAxOworICAgIH0KKworICAgIC8vIFB1dCBlYWNoIHJvdyBpbiBpdCdzIG93biBzdHJpcAorICAgIHVpbnQzMl90IHJvd3NQZXJTdHJpcFZhbCA9IHJvd3NQZXJDaHVuazsKKyAgICBzcDxUaWZmRW50cnk+IHJvd3NQZXJTdHJpcCA9IFRpZmZXcml0ZXI6OnVuY2hlY2tlZEJ1aWxkRW50cnkoVEFHX1JPV1NQRVJTVFJJUCwgTE9ORywgMSwKKyAgICAgICAgICAgIFVOREVGSU5FRF9FTkRJQU4sICZyb3dzUGVyU3RyaXBWYWwpOworCisgICAgaWYgKHJvd3NQZXJTdHJpcCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IGJ1aWxkIGVudHJ5IGZvciBSb3dzUGVyU3RyaXAgdGFnLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgVmVjdG9yPHVpbnQzMl90PiBieXRlQ291bnRzOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TdHJpcHM7ICsraSkgeworICAgICAgICBpZiAobGFzdENodW5rUm93cyA+IDAgJiYgaSA9PSAobnVtU3RyaXBzIC0gMSkpIHsKKyAgICAgICAgICAgIGJ5dGVDb3VudHMuYWRkKGxhc3RDaHVua1NpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnl0ZUNvdW50cy5hZGQoYWN0dWFsQ2h1bmtTaXplKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFNldCBieXRlIGNvdW50cyBmb3IgZWFjaCBzdHJpcAorICAgIHNwPFRpZmZFbnRyeT4gc3RyaXBCeXRlQ291bnRzID0gVGlmZldyaXRlcjo6dW5jaGVja2VkQnVpbGRFbnRyeShUQUdfU1RSSVBCWVRFQ09VTlRTLCBMT05HLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG51bVN0cmlwcyksIFVOREVGSU5FRF9FTkRJQU4sIGJ5dGVDb3VudHMuYXJyYXkoKSk7CisKKyAgICBpZiAoc3RyaXBCeXRlQ291bnRzID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgYnVpbGQgZW50cnkgZm9yIFN0cmlwQnl0ZUNvdW50cyB0YWcuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBWZWN0b3I8dWludDMyX3Q+IHN0cmlwT2Zmc2V0c1ZlY3RvcjsKKyAgICBzdHJpcE9mZnNldHNWZWN0b3IucmVzaXplKG51bVN0cmlwcyk7CisKKyAgICAvLyBTZXQgdW5pbml0aWFsaXplZCBvZmZzZXRzCisgICAgc3A8VGlmZkVudHJ5PiBzdHJpcE9mZnNldHMgPSBUaWZmV3JpdGVyOjp1bmNoZWNrZWRCdWlsZEVudHJ5KFRBR19TVFJJUE9GRlNFVFMsIExPTkcsCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4obnVtU3RyaXBzKSwgVU5ERUZJTkVEX0VORElBTiwgc3RyaXBPZmZzZXRzVmVjdG9yLmFycmF5KCkpOworCisgICAgaWYgKHN0cmlwT2Zmc2V0cyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IGJ1aWxkIGVudHJ5IGZvciBTdHJpcE9mZnNldHMgdGFnLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYoYWRkRW50cnkoc3RyaXBCeXRlQ291bnRzKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBhZGQgZW50cnkgZm9yIFN0cmlwQnl0ZUNvdW50cyB0byBJRkQgJXUiLCBfX0ZVTkNUSU9OX18sIG1JZmRJZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYoYWRkRW50cnkocm93c1BlclN0cmlwKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBhZGQgZW50cnkgZm9yIFN0cmlwQnl0ZUNvdW50cyB0byBJRkQgJXUiLCBfX0ZVTkNUSU9OX18sIG1JZmRJZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYoYWRkRW50cnkoc3RyaXBPZmZzZXRzKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBhZGQgZW50cnkgZm9yIFN0cmlwQnl0ZUNvdW50cyB0byBJRkQgJXUiLCBfX0ZVTkNUSU9OX18sIG1JZmRJZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgbVN0cmlwT2Zmc2V0c0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgVGlmZklmZDo6dW5pbml0aWFsaXplZE9mZnNldHMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1TdHJpcE9mZnNldHNJbml0aWFsaXplZDsKK30KKworc3RhdHVzX3QgVGlmZklmZDo6c2V0U3RyaXBPZmZzZXQodWludDMyX3Qgb2Zmc2V0KSB7CisKKyAgICAvLyBHZXQgb2xkIG9mZnNldHMgYW5kIGJ5dGVjb3VudHMKKyAgICBzcDxUaWZmRW50cnk+IG9sZE9mZnNldHMgPSBnZXRFbnRyeShUQUdfU1RSSVBPRkZTRVRTKTsKKyAgICBpZiAob2xkT2Zmc2V0cyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogSUZEICV1IGRvZXMgbm90IGNvbnRhaW4gU3RyaXBPZmZzZXRzIGVudHJ5LiIsIF9fRlVOQ1RJT05fXywgbUlmZElkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzcDxUaWZmRW50cnk+IHN0cmlwQnl0ZUNvdW50cyA9IGdldEVudHJ5KFRBR19TVFJJUEJZVEVDT1VOVFMpOworICAgIGlmIChzdHJpcEJ5dGVDb3VudHMgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IElGRCAldSBkb2VzIG5vdCBjb250YWluIFN0cmlwQnl0ZUNvdW50cyBlbnRyeS4iLCBfX0ZVTkNUSU9OX18sIG1JZmRJZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgdWludDMyX3Qgb2Zmc2V0c0NvdW50ID0gb2xkT2Zmc2V0cy0+Z2V0Q291bnQoKTsKKyAgICB1aW50MzJfdCBieXRlQ291bnQgPSBzdHJpcEJ5dGVDb3VudHMtPmdldENvdW50KCk7CisgICAgaWYgKG9mZnNldHNDb3VudCAhPSBieXRlQ291bnQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBTdHJpcE9mZnNldHMgY291bnQgKCV1KSBkb2Vzbid0IG1hdGNoIFN0cmlwQnl0ZUNvdW50cyBjb3VudCAoJXUpIGluIElGRCAldSIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG9mZnNldHNDb3VudCwgYnl0ZUNvdW50LCBtSWZkSWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGNvbnN0IHVpbnQzMl90KiBzdHJpcEJ5dGVDb3VudHNBcnJheSA9IHN0cmlwQnl0ZUNvdW50cy0+Z2V0RGF0YTx1aW50MzJfdD4oKTsKKworICAgIHNpemVfdCBudW1TdHJpcHMgPSBvZmZzZXRzQ291bnQ7CisKKyAgICBWZWN0b3I8dWludDMyX3Q+IHN0cmlwT2Zmc2V0czsKKworICAgIC8vIENhbGN1bGF0ZSB1cGRhdGVkIGJ5dGUgb2Zmc2V0cworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU3RyaXBzOyArK2kpIHsKKyAgICAgICAgc3RyaXBPZmZzZXRzLmFkZChvZmZzZXQpOworICAgICAgICBvZmZzZXQgKz0gc3RyaXBCeXRlQ291bnRzQXJyYXlbaV07CisgICAgfQorCisgICAgc3A8VGlmZkVudHJ5PiBuZXdPZmZzZXRzID0gVGlmZldyaXRlcjo6dW5jaGVja2VkQnVpbGRFbnRyeShUQUdfU1RSSVBPRkZTRVRTLCBMT05HLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG51bVN0cmlwcyksIFVOREVGSU5FRF9FTkRJQU4sIHN0cmlwT2Zmc2V0cy5hcnJheSgpKTsKKworICAgIGlmIChuZXdPZmZzZXRzID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsdCBub3QgYnVpbGQgdXBkYXRlZCBvZmZzZXRzIGVudHJ5IGluIElGRCAldSIsIF9fRlVOQ1RJT05fXywgbUlmZElkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAoYWRkRW50cnkobmV3T2Zmc2V0cykgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gYWRkIHVwZGF0ZWQgb2Zmc2V0cyBlbnRyeSBpbiBJRkQgJXUiLCBfX0ZVTkNUSU9OX18sIG1JZmRJZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwordWludDMyX3QgVGlmZklmZDo6Z2V0U3RyaXBTaXplKCkgY29uc3QgeworICAgIHNwPFRpZmZFbnRyeT4gc3RyaXBCeXRlQ291bnRzID0gZ2V0RW50cnkoVEFHX1NUUklQQllURUNPVU5UUyk7CisgICAgaWYgKHN0cmlwQnl0ZUNvdW50cyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogSUZEICV1IGRvZXMgbm90IGNvbnRhaW4gU3RyaXBCeXRlQ291bnRzIGVudHJ5LiIsIF9fRlVOQ1RJT05fXywgbUlmZElkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBjb3VudCA9IHN0cmlwQnl0ZUNvdW50cy0+Z2V0Q291bnQoKTsKKyAgICBjb25zdCB1aW50MzJfdCogYnl0ZUNvdW50cyA9IHN0cmlwQnl0ZUNvdW50cy0+Z2V0RGF0YTx1aW50MzJfdD4oKTsKKworICAgIHVpbnQzMl90IHRvdGFsID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0YXRpY19jYXN0PHNpemVfdD4oY291bnQpOyArK2kpIHsKKyAgICAgICAgdG90YWwgKz0gYnl0ZUNvdW50c1tpXTsKKyAgICB9CisgICAgcmV0dXJuIHRvdGFsOworfQorCitTdHJpbmc4IFRpZmZJZmQ6OnRvU3RyaW5nKCkgY29uc3QgeworICAgIHNpemVfdCBzID0gbUVudHJpZXMuc2l6ZSgpOworICAgIFN0cmluZzggb3V0cHV0OworICAgIG91dHB1dC5hcHBlbmRGb3JtYXQoIltpZmQ6ICV4LCBudW1fZW50cmllczogJXp1LCBlbnRyaWVzOlxuIiwgZ2V0SWQoKSwgcyk7CisgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IG1FbnRyaWVzLnNpemUoKTsgKytpKSB7CisgICAgICAgIG91dHB1dC5hcHBlbmQoIlx0Iik7CisgICAgICAgIG91dHB1dC5hcHBlbmQobUVudHJpZXNbaV0tPnRvU3RyaW5nKCkpOworICAgICAgICBvdXRwdXQuYXBwZW5kKCJcbiIpOworICAgIH0KKyAgICBvdXRwdXQuYXBwZW5kKCIsIG5leHRfaWZkOiAleF0iLCAoKG1OZXh0SWZkICE9IE5VTEwpID8gbU5leHRJZmQtPmdldElkKCkgOiAwKSk7CisgICAgcmV0dXJuIG91dHB1dDsKK30KKwordm9pZCBUaWZmSWZkOjpsb2coKSBjb25zdCB7CisgICAgc2l6ZV90IHMgPSBtRW50cmllcy5zaXplKCk7CisgICAgQUxPR0koIltpZmQ6ICV4LCBudW1fZW50cmllczogJXp1LCBlbnRyaWVzOlxuIiwgZ2V0SWQoKSwgcyk7CisgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IHM7ICsraSkgeworICAgICAgICBBTE9HSSgiXHQlcyIsIG1FbnRyaWVzW2ldLT50b1N0cmluZygpLnN0cmluZygpKTsKKyAgICB9CisgICAgQUxPR0koIiwgbmV4dF9pZmQ6ICV4XSIsICgobU5leHRJZmQgIT0gTlVMTCkgPyBtTmV4dElmZC0+Z2V0SWQoKSA6IDApKTsKK30KKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCBiL21lZGlhL2ltZ191dGlscy9zcmMvVGlmZldyaXRhYmxlLmNwcApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggNjQlCmNvcHkgZnJvbSBsaWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKY29weSB0byBtZWRpYS9pbWdfdXRpbHMvc3JjL1RpZmZXcml0YWJsZS5jcHAKaW5kZXggMTNjYWM2ZC4uZjhkN2RlNwotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKKysrIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9UaWZmV3JpdGFibGUuY3BwCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCwxMyArMTQsMTggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpZm5kZWYgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19ICi0jZGVmaW5lIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSAogCi0vKiAtLS0tLSBNYWluIGZlYXR1cmVzIC0tLS0tICovCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlc19NQ1MuaCIgLyogVHJhbnNjb2RlciAqLworI2luY2x1ZGUgPGltZ191dGlscy9UaWZmV3JpdGFibGUuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvVGlmZkhlbHBlcnMuaD4KIAotLyogLS0tLS0gQWRkLW9ucyAtLS0tLSAqLworI2luY2x1ZGUgPGFzc2VydC5oPgogCi0jZW5kaWYgLyogTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19IICovCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKIAorVGlmZldyaXRhYmxlOjpUaWZmV3JpdGFibGUoKSB7fQorCitUaWZmV3JpdGFibGU6On5UaWZmV3JpdGFibGUoKSB7fQorCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL3NyYy9UaWZmV3JpdGVyLmNwcCBiL21lZGlhL2ltZ191dGlscy9zcmMvVGlmZldyaXRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM0MTczNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9zcmMvVGlmZldyaXRlci5jcHAKQEAgLTAsMCArMSwzOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiVGlmZldyaXRlciIKKworI2luY2x1ZGUgPGltZ191dGlscy9UaWZmSGVscGVycy5oPgorI2luY2x1ZGUgPGltZ191dGlscy9UaWZmV3JpdGVyLmg+CisjaW5jbHVkZSA8aW1nX3V0aWxzL1RhZ0RlZmluaXRpb25zLmg+CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CisKK0tleWVkVmVjdG9yPHVpbnQxNl90LCBjb25zdCBUYWdEZWZpbml0aW9uX3QqPiBUaWZmV3JpdGVyOjpidWlsZFRhZ01hcCgKKyAgICAgICAgICAgIGNvbnN0IFRhZ0RlZmluaXRpb25fdCogZGVmaW5pdGlvbnMsIHNpemVfdCBsZW5ndGgpIHsKKyAgICBLZXllZFZlY3Rvcjx1aW50MTZfdCwgY29uc3QgVGFnRGVmaW5pdGlvbl90Kj4gbWFwOworICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgICBtYXAuYWRkKGRlZmluaXRpb25zW2ldLnRhZ0lkLCBkZWZpbml0aW9ucyArIGkpOworICAgIH0KKyAgICByZXR1cm4gbWFwOworfQorCisjZGVmaW5lIENPTVBBUkUob3ApIFwKK2Jvb2wgT3JkZXJhYmxlOjpvcGVyYXRvciBvcCAoY29uc3QgT3JkZXJhYmxlJiBvcmRlcmFibGUpIGNvbnN0IHsgXAorICAgIHJldHVybiBnZXRDb21wYXJhYmxlVmFsdWUoKSBvcCBvcmRlcmFibGUuZ2V0Q29tcGFyYWJsZVZhbHVlKCk7IFwKK30KKworI2RlZmluZSBBUlJBWV9TSVpFKGFycmF5KSBcCisgICAgKHNpemVvZihhcnJheSkgLyBzaXplb2YoYXJyYXlbMF0pKQorCitLZXllZFZlY3Rvcjx1aW50MTZfdCwgY29uc3QgVGFnRGVmaW5pdGlvbl90Kj4gVGlmZldyaXRlcjo6c1RhZ01hcHNbXSA9IHsKKyAgICBidWlsZFRhZ01hcChUSUZGX0VQX1RBR19ERUZJTklUSU9OUywgQVJSQVlfU0laRShUSUZGX0VQX1RBR19ERUZJTklUSU9OUykpLAorICAgIGJ1aWxkVGFnTWFwKEROR19UQUdfREVGSU5JVElPTlMsIEFSUkFZX1NJWkUoRE5HX1RBR19ERUZJTklUSU9OUykpLAorICAgIGJ1aWxkVGFnTWFwKEVYSUZfMl8zX1RBR19ERUZJTklUSU9OUywgQVJSQVlfU0laRShFWElGXzJfM19UQUdfREVGSU5JVElPTlMpKSwKKyAgICBidWlsZFRhZ01hcChUSUZGXzZfVEFHX0RFRklOSVRJT05TLCBBUlJBWV9TSVpFKFRJRkZfNl9UQUdfREVGSU5JVElPTlMpKQorfTsKKworVGlmZldyaXRlcjo6VGlmZldyaXRlcigpIDogbVRhZ01hcHMoc1RhZ01hcHMpLCBtTnVtVGFnTWFwcyhERUZBVUxUX05VTV9UQUdfTUFQUykge30KKworVGlmZldyaXRlcjo6VGlmZldyaXRlcihLZXllZFZlY3Rvcjx1aW50MTZfdCwgY29uc3QgVGFnRGVmaW5pdGlvbl90Kj4qIGVuYWJsZWREZWZpbml0aW9ucywKKyAgICAgICAgc2l6ZV90IGxlbmd0aCkgOiBtVGFnTWFwcyhlbmFibGVkRGVmaW5pdGlvbnMpLCBtTnVtVGFnTWFwcyhsZW5ndGgpIHt9CisKK1RpZmZXcml0ZXI6On5UaWZmV3JpdGVyKCkge30KKworc3RhdHVzX3QgVGlmZldyaXRlcjo6d3JpdGUoT3V0cHV0KiBvdXQsIFN0cmlwU291cmNlKiogc291cmNlcywgc2l6ZV90IHNvdXJjZXNDb3VudCwKKyAgICAgICAgRW5kaWFubmVzcyBlbmQpIHsKKyAgICBzdGF0dXNfdCByZXQgPSBPSzsKKyAgICBFbmRpYW5PdXRwdXQgZW5kT3V0KG91dCwgZW5kKTsKKworICAgIGlmIChtSWZkID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUaWZmIGhlYWRlciBpcyBlbXB0eS4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHVpbnQzMl90IHRvdGFsU2l6ZSA9IGdldFRvdGFsU2l6ZSgpOworCisgICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIHVpbnQzMl90PiBvZmZzZXRWZWN0b3I7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OYW1lZElmZHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKG1OYW1lZElmZHNbaV0tPnVuaW5pdGlhbGl6ZWRPZmZzZXRzKCkpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHN0cmlwU2l6ZSA9IG1OYW1lZElmZHNbaV0tPmdldFN0cmlwU2l6ZSgpOworICAgICAgICAgICAgaWYgKG1OYW1lZElmZHNbaV0tPnNldFN0cmlwT2Zmc2V0KHRvdGFsU2l6ZSkgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBzZXQgc3RyaXAgb2Zmc2V0cy4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0b3RhbFNpemUgKz0gc3RyaXBTaXplOworICAgICAgICAgICAgV09SRF9BTElHTih0b3RhbFNpemUpOworICAgICAgICAgICAgb2Zmc2V0VmVjdG9yLmFkZChtTmFtZWRJZmRzLmtleUF0KGkpLCB0b3RhbFNpemUpOworICAgICAgICB9CisgICAgfQorCisgICAgc2l6ZV90IG9mZlZlY1NpemUgPSBvZmZzZXRWZWN0b3Iuc2l6ZSgpOworICAgIGlmIChvZmZWZWNTaXplICE9IHNvdXJjZXNDb3VudCkgeworICAgICAgICBBTE9HRSgiJXM6IE1pc21hdGNoIGJldHdlZW4gbnVtYmVyIG9mIElGRHMgd2l0aCB1bmluaXRpYWxpemVkIHN0cmlwcyAoJXp1KSBhbmQiCisgICAgICAgICAgICAgICAgIiBzb3VyY2VzICglenUpLiIsIF9fRlVOQ1RJT05fXywgb2ZmVmVjU2l6ZSwgc291cmNlc0NvdW50KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBCQUlMX09OX0ZBSUwod3JpdGVGaWxlSGVhZGVyKGVuZE91dCksIHJldCk7CisKKyAgICB1aW50MzJfdCBvZmZzZXQgPSBGSUxFX0hFQURFUl9TSVpFOworICAgIHNwPFRpZmZJZmQ+IGlmZCA9IG1JZmQ7CisgICAgd2hpbGUoaWZkICE9IE5VTEwpIHsKKyAgICAgICAgQkFJTF9PTl9GQUlMKGlmZC0+d3JpdGVEYXRhKG9mZnNldCwgJmVuZE91dCksIHJldCk7CisgICAgICAgIG9mZnNldCArPSBpZmQtPmdldFNpemUoKTsKKyAgICAgICAgaWZkID0gaWZkLT5nZXROZXh0SWZkKCk7CisgICAgfQorCisgICAgaWYgKExPR19OREVCVUcgPT0gMCkgeworICAgICAgICBsb2coKTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG9mZlZlY1NpemU7ICsraSkgeworICAgICAgICB1aW50MzJfdCBpZmRLZXkgPSBvZmZzZXRWZWN0b3Iua2V5QXQoaSk7CisgICAgICAgIHVpbnQzMl90IG5leHRPZmZzZXQgPSBvZmZzZXRWZWN0b3JbaV07CisgICAgICAgIHVpbnQzMl90IHNpemVUb1dyaXRlID0gbU5hbWVkSWZkc1tpZmRLZXldLT5nZXRTdHJpcFNpemUoKTsKKyAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHNvdXJjZXNDb3VudDsgKytqKSB7CisgICAgICAgICAgICBpZiAoc291cmNlc1tqXS0+Z2V0SWZkKCkgPT0gaWZkS2V5KSB7CisgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBzb3VyY2VzW2ldLT53cml0ZVRvU3RyZWFtKGVuZE91dCwgc2l6ZVRvV3JpdGUpKSAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCB3cml0ZSB0byBzdHJlYW0sIHJlY2VpdmVkICVkLiIsIF9fRlVOQ1RJT05fXywgcmV0KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgWkVST19USUxMX1dPUkQoJmVuZE91dCwgc2l6ZVRvV3JpdGUsIHJldCk7CisgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogTm8gc3RyZWFtIGZvciBieXRlIHN0cmlwcyBmb3IgSUZEICV1IiwgX19GVU5DVElPTl9fLCBpZmRLZXkpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQobmV4dE9mZnNldCA9PSBlbmRPdXQuZ2V0Q3VycmVudE9mZnNldCgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0dXNfdCBUaWZmV3JpdGVyOjp3cml0ZShPdXRwdXQqIG91dCwgRW5kaWFubmVzcyBlbmQpIHsKKyAgICBzdGF0dXNfdCByZXQgPSBPSzsKKyAgICBFbmRpYW5PdXRwdXQgZW5kT3V0KG91dCwgZW5kKTsKKworICAgIGlmIChtSWZkID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUaWZmIGhlYWRlciBpcyBlbXB0eS4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBCQUlMX09OX0ZBSUwod3JpdGVGaWxlSGVhZGVyKGVuZE91dCksIHJldCk7CisKKyAgICB1aW50MzJfdCBvZmZzZXQgPSBGSUxFX0hFQURFUl9TSVpFOworICAgIHNwPFRpZmZJZmQ+IGlmZCA9IG1JZmQ7CisgICAgd2hpbGUoaWZkICE9IE5VTEwpIHsKKyAgICAgICAgQkFJTF9PTl9GQUlMKGlmZC0+d3JpdGVEYXRhKG9mZnNldCwgJmVuZE91dCksIHJldCk7CisgICAgICAgIG9mZnNldCArPSBpZmQtPmdldFNpemUoKTsKKyAgICAgICAgaWZkID0gaWZkLT5nZXROZXh0SWZkKCk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKKworY29uc3QgVGFnRGVmaW5pdGlvbl90KiBUaWZmV3JpdGVyOjpsb29rdXBEZWZpbml0aW9uKHVpbnQxNl90IHRhZykgY29uc3QgeworICAgIGNvbnN0IFRhZ0RlZmluaXRpb25fdCogZGVmaW5pdGlvbiA9IE5VTEw7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTnVtVGFnTWFwczsgKytpKSB7CisgICAgICAgIHNzaXplX3QgaW5kZXggPSBtVGFnTWFwc1tpXS5pbmRleE9mS2V5KHRhZyk7CisgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICBkZWZpbml0aW9uID0gbVRhZ01hcHNbaV1baW5kZXhdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZGVmaW5pdGlvbiA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogTm8gZGVmaW5pdGlvbiBleGlzdHMgZm9yIHRhZyB3aXRoIGlkICV4LiIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICB9CisgICAgcmV0dXJuIGRlZmluaXRpb247Cit9CisKK3NwPFRpZmZFbnRyeT4gVGlmZldyaXRlcjo6Z2V0RW50cnkodWludDE2X3QgdGFnLCB1aW50MzJfdCBpZmQpIGNvbnN0IHsKKyAgICBzc2l6ZV90IGluZGV4ID0gbU5hbWVkSWZkcy5pbmRleE9mS2V5KGlmZCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6IE5vIElGRCAlZCBzZXQgZm9yIHRoaXMgd3JpdGVyLiIsIF9fRlVOQ1RJT05fXywgaWZkKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBtTmFtZWRJZmRzW2luZGV4XS0+Z2V0RW50cnkodGFnKTsKK30KKwordm9pZCBUaWZmV3JpdGVyOjpyZW1vdmVFbnRyeSh1aW50MTZfdCB0YWcsIHVpbnQzMl90IGlmZCkgeworICAgIHNzaXplX3QgaW5kZXggPSBtTmFtZWRJZmRzLmluZGV4T2ZLZXkoaWZkKTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBtTmFtZWRJZmRzW2luZGV4XS0+cmVtb3ZlRW50cnkodGFnKTsKKyAgICB9Cit9CisKK3N0YXR1c190IFRpZmZXcml0ZXI6OmFkZEVudHJ5KGNvbnN0IHNwPFRpZmZFbnRyeT4mIGVudHJ5LCB1aW50MzJfdCBpZmQpIHsKKyAgICB1aW50MTZfdCB0YWcgPSBlbnRyeS0+Z2V0VGFnKCk7CisKKyAgICBjb25zdCBUYWdEZWZpbml0aW9uX3QqIGRlZmluaXRpb24gPSBsb29rdXBEZWZpbml0aW9uKHRhZyk7CisKKyAgICBpZiAoZGVmaW5pdGlvbiA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogTm8gZGVmaW5pdGlvbiBleGlzdHMgZm9yIHRhZyAweCV4LiIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKKyAgICB9CisKKyAgICBzc2l6ZV90IGluZGV4ID0gbU5hbWVkSWZkcy5pbmRleE9mS2V5KGlmZCk7CisKKyAgICAvLyBBZGQgYSBuZXcgSUZEIGlmIG5lY2Vzc2FyeQorICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyBJRkQgJXUgZXhpc3RzLiIsIF9fRlVOQ1RJT05fXywgaWZkKTsKKyAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgIH0KKworICAgIHNwPFRpZmZJZmQ+IHNlbGVjdGVkSWZkICA9IG1OYW1lZElmZHNbaW5kZXhdOworICAgIHJldHVybiBzZWxlY3RlZElmZC0+YWRkRW50cnkoZW50cnkpOworfQorCitzdGF0dXNfdCBUaWZmV3JpdGVyOjphZGRTdHJpcCh1aW50MzJfdCBpZmQpIHsKKyAgICBzc2l6ZV90IGluZGV4ID0gbU5hbWVkSWZkcy5pbmRleE9mS2V5KGlmZCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6IElmZCAldSBkb2Vzbid0IGV4aXN0LCBjYW5ub3QgYWRkIHN0cmlwIGVudHJpZXMuIiwgX19GVU5DVElPTl9fLCBpZmQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzcDxUaWZmSWZkPiBzZWxlY3RlZCA9IG1OYW1lZElmZHNbaW5kZXhdOworICAgIHJldHVybiBzZWxlY3RlZC0+dmFsaWRhdGVBbmRTZXRTdHJpcFRhZ3MoKTsKK30KKworc3RhdHVzX3QgVGlmZldyaXRlcjo6YWRkSWZkKHVpbnQzMl90IGlmZCkgeworICAgIHNzaXplX3QgaW5kZXggPSBtTmFtZWRJZmRzLmluZGV4T2ZLZXkoaWZkKTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IElmZCB3aXRoIElEIDB4JXggYWxyZWFkeSBleGlzdHMuIiwgX19GVU5DVElPTl9fLCBpZmQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNwPFRpZmZJZmQ+IG5ld0lmZCA9IG5ldyBUaWZmSWZkKGlmZCk7CisgICAgaWYgKG1JZmQgPT0gTlVMTCkgeworICAgICAgICBtSWZkID0gbmV3SWZkOworICAgIH0gZWxzZSB7CisgICAgICAgIHNwPFRpZmZJZmQ+IGxhc3QgPSBmaW5kTGFzdElmZCgpOworICAgICAgICBsYXN0LT5zZXROZXh0SWZkKG5ld0lmZCk7CisgICAgfQorCisgICAgaWYobU5hbWVkSWZkcy5hZGQoaWZkLCBuZXdJZmQpIDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBhZGQgbmV3IElGRCAweCV4LiIsIF9fRlVOQ1RJT05fXywgaWZkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFRpZmZXcml0ZXI6OmFkZFN1YklmZCh1aW50MzJfdCBwYXJlbnRJZmQsIHVpbnQzMl90IGlmZCwgU3ViSWZkVHlwZSB0eXBlKSB7CisgICAgc3NpemVfdCBpbmRleCA9IG1OYW1lZElmZHMuaW5kZXhPZktleShpZmQpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogSWZkIHdpdGggSUQgMHgleCBhbHJlYWR5IGV4aXN0cy4iLCBfX0ZVTkNUSU9OX18sIGlmZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3NpemVfdCBwYXJlbnRJbmRleCA9IG1OYW1lZElmZHMuaW5kZXhPZktleShwYXJlbnRJZmQpOworICAgIGlmIChwYXJlbnRJbmRleCA8IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBQYXJlbnQgSUZEIHdpdGggSUQgMHgleCBkb2VzIG5vdCBleGlzdC4iLCBfX0ZVTkNUSU9OX18sIHBhcmVudElmZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3A8VGlmZklmZD4gcGFyZW50ID0gbU5hbWVkSWZkc1twYXJlbnRJbmRleF07CisgICAgc3A8VGlmZklmZD4gbmV3SWZkID0gbmV3IFRpZmZJZmQoaWZkKTsKKworICAgIHVpbnQxNl90IHN1YklmZFRhZzsKKyAgICBpZiAodHlwZSA9PSBTVUJJRkQpIHsKKyAgICAgICAgc3ViSWZkVGFnID0gVEFHX1NVQklGRFM7CisgICAgfSBlbHNlIGlmICh0eXBlID09IEdQU0lORk8pIHsKKyAgICAgICAgc3ViSWZkVGFnID0gVEFHX0dQU0lORk87CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmtub3duIFN1YklGRCB0eXBlICVkLiIsIF9fRlVOQ1RJT05fXywgdHlwZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3A8VGlmZkVudHJ5PiBzdWJJZmRzID0gcGFyZW50LT5nZXRFbnRyeShzdWJJZmRUYWcpOworICAgIGlmIChzdWJJZmRzID09IE5VTEwpIHsKKyAgICAgICAgaWYgKGJ1aWxkRW50cnkoc3ViSWZkVGFnLCAxLCAmbmV3SWZkLCAmc3ViSWZkcykgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBidWlsZCBTdWJJZmQgZW50cnkgaW4gSUZEIDB4JXguIiwgX19GVU5DVElPTl9fLCBwYXJlbnRJZmQpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmICh0eXBlID09IEdQU0lORk8pIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGFkZCBHUFNJbmZvIFN1YklGRCB0byBJRkQgJXUsIG9uZSBhbHJlYWR5IGV4aXN0cy4iLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIGlmZCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgVmVjdG9yPHNwPFRpZmZJZmQ+ID4gc3ViSWZkTGlzdDsKKyAgICAgICAgY29uc3Qgc3A8VGlmZklmZD4qIG9sZElmZEFycmF5ID0gc3ViSWZkcy0+Z2V0RGF0YTxzcDxUaWZmSWZkPiA+KCk7CisgICAgICAgIGlmIChzdWJJZmRMaXN0LmFwcGVuZEFycmF5KG9sZElmZEFycmF5LCBzdWJJZmRzLT5nZXRDb3VudCgpKSA8IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGJ1aWxkIFN1YklmZCBlbnRyeSBpbiBJRkQgMHgleC4iLCBfX0ZVTkNUSU9OX18sIHBhcmVudElmZCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN1YklmZExpc3QuYWRkKG5ld0lmZCkgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBidWlsZCBTdWJJZmQgZW50cnkgaW4gSUZEIDB4JXguIiwgX19GVU5DVElPTl9fLCBwYXJlbnRJZmQpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQzMl90IGNvdW50ID0gc3ViSWZkTGlzdC5zaXplKCk7CisgICAgICAgIGlmIChidWlsZEVudHJ5KHN1YklmZFRhZywgY291bnQsIHN1YklmZExpc3QuYXJyYXkoKSwgJnN1YklmZHMpIDwgMCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gYnVpbGQgU3ViSWZkIGVudHJ5IGluIElGRCAweCV4LiIsIF9fRlVOQ1RJT05fXywgcGFyZW50SWZkKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocGFyZW50LT5hZGRFbnRyeShzdWJJZmRzKSA8IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gYWRkIFN1YklmZCBlbnRyeSBpbiBJRkQgMHgleC4iLCBfX0ZVTkNUSU9OX18sIHBhcmVudElmZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYobU5hbWVkSWZkcy5hZGQoaWZkLCBuZXdJZmQpIDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBhZGQgbmV3IElGRCAweCV4LiIsIF9fRlVOQ1RJT05fXywgaWZkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK1RhZ1R5cGUgVGlmZldyaXRlcjo6Z2V0RGVmYXVsdFR5cGUodWludDE2X3QgdGFnKSBjb25zdCB7CisgICAgY29uc3QgVGFnRGVmaW5pdGlvbl90KiBkZWZpbml0aW9uID0gbG9va3VwRGVmaW5pdGlvbih0YWcpOworICAgIGlmIChkZWZpbml0aW9uID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgZmluZCBkZWZpbml0aW9uIGZvciB0YWcgJXgiLCBfX0ZVTkNUSU9OX18sIHRhZyk7CisgICAgICAgIHJldHVybiBVTktOT1dOX1RBR1RZUEU7CisgICAgfQorICAgIHJldHVybiBkZWZpbml0aW9uLT5kZWZhdWx0VHlwZTsKK30KKwordWludDMyX3QgVGlmZldyaXRlcjo6Z2V0RGVmYXVsdENvdW50KHVpbnQxNl90IHRhZykgY29uc3QgeworICAgIGNvbnN0IFRhZ0RlZmluaXRpb25fdCogZGVmaW5pdGlvbiA9IGxvb2t1cERlZmluaXRpb24odGFnKTsKKyAgICBpZiAoZGVmaW5pdGlvbiA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IGZpbmQgZGVmaW5pdGlvbiBmb3IgdGFnICV4IiwgX19GVU5DVElPTl9fLCB0YWcpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIGRlZmluaXRpb24tPmZpeGVkQ291bnQ7Cit9CisKK2Jvb2wgVGlmZldyaXRlcjo6aGFzSWZkKHVpbnQzMl90IGlmZCkgY29uc3QgeworICAgIHNzaXplX3QgaW5kZXggPSBtTmFtZWRJZmRzLmluZGV4T2ZLZXkoaWZkKTsKKyAgICByZXR1cm4gaW5kZXggPj0gMDsKK30KKworYm9vbCBUaWZmV3JpdGVyOjpjaGVja0lmRGVmaW5lZCh1aW50MTZfdCB0YWcpIGNvbnN0IHsKKyAgICByZXR1cm4gbG9va3VwRGVmaW5pdGlvbih0YWcpICE9IE5VTEw7Cit9CisKK2NvbnN0IGNoYXIqIFRpZmZXcml0ZXI6OmdldFRhZ05hbWUodWludDE2X3QgdGFnKSBjb25zdCB7CisgICAgY29uc3QgVGFnRGVmaW5pdGlvbl90KiBkZWZpbml0aW9uID0gbG9va3VwRGVmaW5pdGlvbih0YWcpOworICAgIGlmIChkZWZpbml0aW9uID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBkZWZpbml0aW9uLT50YWdOYW1lOworfQorCitzcDxUaWZmSWZkPiBUaWZmV3JpdGVyOjpmaW5kTGFzdElmZCgpIHsKKyAgICBzcDxUaWZmSWZkPiBpZmQgPSBtSWZkOworICAgIHdoaWxlKGlmZCAhPSBOVUxMKSB7CisgICAgICAgIHNwPFRpZmZJZmQ+IG5leHRJZmQgPSBpZmQtPmdldE5leHRJZmQoKTsKKyAgICAgICAgaWYgKG5leHRJZmQgPT0gTlVMTCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWZkID0gbmV4dElmZDsKKyAgICB9CisgICAgcmV0dXJuIGlmZDsKK30KKworc3RhdHVzX3QgVGlmZldyaXRlcjo6d3JpdGVGaWxlSGVhZGVyKEVuZGlhbk91dHB1dCYgb3V0KSB7CisgICAgc3RhdHVzX3QgcmV0ID0gT0s7CisgICAgdWludDE2X3QgZW5kTWFya2VyID0gKG91dC5nZXRFbmRpYW5uZXNzKCkgPT0gQklHKSA/IEJJR19FTkRJQU5fTUFSS0VSIDogTElUVExFX0VORElBTl9NQVJLRVI7CisgICAgQkFJTF9PTl9GQUlMKG91dC53cml0ZSgmZW5kTWFya2VyLCAwLCAxKSwgcmV0KTsKKworICAgIHVpbnQxNl90IHRpZmZNYXJrZXIgPSBUSUZGX0ZJTEVfTUFSS0VSOworICAgIEJBSUxfT05fRkFJTChvdXQud3JpdGUoJnRpZmZNYXJrZXIsIDAsIDEpLCByZXQpOworCisgICAgdWludDMyX3Qgb2Zmc2V0TWFya2VyID0gRklMRV9IRUFERVJfU0laRTsKKyAgICBCQUlMX09OX0ZBSUwob3V0LndyaXRlKCZvZmZzZXRNYXJrZXIsIDAsIDEpLCByZXQpOworICAgIHJldHVybiByZXQ7Cit9CisKK3VpbnQzMl90IFRpZmZXcml0ZXI6OmdldFRvdGFsU2l6ZSgpIGNvbnN0IHsKKyAgICB1aW50MzJfdCB0b3RhbFNpemUgPSBGSUxFX0hFQURFUl9TSVpFOworICAgIHNwPFRpZmZJZmQ+IGlmZCA9IG1JZmQ7CisgICAgd2hpbGUoaWZkICE9IE5VTEwpIHsKKyAgICAgICAgdG90YWxTaXplICs9IGlmZC0+Z2V0U2l6ZSgpOworICAgICAgICBpZmQgPSBpZmQtPmdldE5leHRJZmQoKTsKKyAgICB9CisgICAgcmV0dXJuIHRvdGFsU2l6ZTsKK30KKwordm9pZCBUaWZmV3JpdGVyOjpsb2coKSBjb25zdCB7CisgICAgQUxPR0koIiVzOiBUaWZmV3JpdGVyOiIsIF9fRlVOQ1RJT05fXyk7CisgICAgc2l6ZV90IGxlbmd0aCA9IG1OYW1lZElmZHMuc2l6ZSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgbU5hbWVkSWZkc1tpXS0+bG9nKCk7CisgICAgfQorfQorCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliY3B1c3RhdHMvQW5kcm9pZC5tayBiL21lZGlhL2xpYmNwdXN0YXRzL0FuZHJvaWQubWsKaW5kZXggYjUwNjM1My4uZWUyODNhNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliY3B1c3RhdHMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJjcHVzdGF0cy9BbmRyb2lkLm1rCkBAIC0xLDQgKzEsNCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCiAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCkBAIC04LDQgKzgsNiBAQAogCiBMT0NBTF9NT0RVTEUgOj0gbGliY3B1c3RhdHMKIAorTE9DQUxfQ0ZMQUdTIDo9IC1zdGQ9Z251KysxMSAtV2Vycm9yCisKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmNwcCBiL21lZGlhL2xpYmNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmNwcAppbmRleCA2Mzc0MDJhLi5jZmRjYjUxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJjcHVzdGF0cy9UaHJlYWRDcHVVc2FnZS5jcHAKKysrIGIvbWVkaWEvbGliY3B1c3RhdHMvVGhyZWFkQ3B1VXNhZ2UuY3BwCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8dGltZS5oPgogCi0jaW5jbHVkZSA8dXRpbHMvRGVidWcuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPGNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmg+CkBAIC0yMTgsNyArMjE3LDcgQEAKICNkZWZpbmUgRlJFUV9TSVpFIDY0CiAgICAgICAgICAgICBjaGFyIGZyZXFfcGF0aFtGUkVRX1NJWkVdOwogI2RlZmluZSBGUkVRX0RJR0lUIDI3Ci0gICAgICAgICAgICBDT01QSUxFX1RJTUVfQVNTRVJUX0ZVTkNUSU9OX1NDT1BFKE1BWF9DUFUgPD0gMTApOworICAgICAgICAgICAgc3RhdGljX2Fzc2VydChNQVhfQ1BVIDw9IDEwLCAiTUFYX0NQVSB0b28gbGFyZ2UiKTsKICNkZWZpbmUgRlJFUV9QQVRIICIvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHU/L2NwdWZyZXEvc2NhbGluZ19jdXJfZnJlcSIKICAgICAgICAgICAgIHN0cmxjcHkoZnJlcV9wYXRoLCBGUkVRX1BBVEgsIHNpemVvZihmcmVxX3BhdGgpKTsKICAgICAgICAgICAgIGZyZXFfcGF0aFtGUkVRX0RJR0lUXSA9IGNwdU51bSArICcwJzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9BbmRyb2lkLm1rIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0FuZHJvaWQubWsKaW5kZXggMmJiNmRiZS4uZTBjYThhZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0FuZHJvaWQubWsKQEAgLTE1LDE2ICsxNSwxMCBAQAogCiBMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBzb3VuZGZ4CiAKLWlmZXEgKCQoVEFSR0VUX09TKS0kKFRBUkdFVF9TSU1VTEFUT1IpLGxpbnV4LXRydWUpCi1MT0NBTF9MRExJQlMgKz0gLWxkbAotZW5kaWYKLQogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpIFwKIAkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpCiAKLUxPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCi0KIExPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmMgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5jCmluZGV4IGQ4NGJjYTYuLjRhNDEwMzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguYwpAQCAtMTYsNyArMTYsOCBAQAogCiAjZGVmaW5lIExPR19UQUcgIkVmZmVjdERvd25taXgiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN0ZGJvb2wuaD4KQEAgLTI5LDI1ICszMCwxMyBAQAogCiAjZGVmaW5lIE1JTlVTXzNfREJfSU5fUTE5XzEyIDI4OTYgLy8gLTNkQiA9IDAuNzA3ICogMl4xMiA9IDI4OTYKIAorLy8gc3Vic2V0IG9mIHBvc3NpYmxlIGF1ZGlvX2NoYW5uZWxfbWFza190IHZhbHVlcywgYW5kIEFVRElPX0NIQU5ORUxfT1VUXyogcmVuYW1lZCB0byBDSEFOTkVMX01BU0tfKgogdHlwZWRlZiBlbnVtIHsKLSAgICBDSEFOTkVMX01BU0tfU1VSUk9VTkQgPSBBVURJT19DSEFOTkVMX09VVF9TVVJST1VORCwKLSAgICBDSEFOTkVMX01BU0tfUVVBRF9CQUNLID0gQVVESU9fQ0hBTk5FTF9PVVRfUVVBRCwKLSAgICAvLyBsaWtlIEFVRElPX0NIQU5ORUxfT1VUX1FVQUQgd2l0aCAqX1NJREVfKiBpbnN0ZWFkIG9mICpfQkFDS18qLCBzYW1lIGNoYW5uZWwgb3JkZXIKLSAgICBDSEFOTkVMX01BU0tfUVVBRF9TSURFID0KLSAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0xFRlQgfAotICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfUklHSFQgfAotICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfU0lERV9MRUZUIHwKLSAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX1NJREVfUklHSFQsCi0gICAgQ0hBTk5FTF9NQVNLXzVQT0lOVDFfQkFDSyA9IEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsCi0gICAgLy8gbGlrZSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxIHdpdGggKl9TSURFXyogaW5zdGVhZCBvZiAqX0JBQ0tfKiwgc2FtZSBjaGFubmVsIG9yZGVyCi0gICAgQ0hBTk5FTF9NQVNLXzVQT0lOVDFfU0lERSA9Ci0gICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9MRUZUIHwKLSAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX1JJR0hUIHwKLSAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0NFTlRFUiB8Ci0gICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZIHwKLSAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX1NJREVfTEVGVCB8Ci0gICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9TSURFX1JJR0hULAotICAgIENIQU5ORUxfTUFTS183UE9JTlQxX1NJREVfQkFDSyA9IEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEsCisgICAgQ0hBTk5FTF9NQVNLX1FVQURfQkFDSyA9IEFVRElPX0NIQU5ORUxfT1VUX1FVQURfQkFDSywKKyAgICBDSEFOTkVMX01BU0tfUVVBRF9TSURFID0gQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9TSURFLAorICAgIENIQU5ORUxfTUFTS181UE9JTlQxX0JBQ0sgPSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX0JBQ0ssCisgICAgQ0hBTk5FTF9NQVNLXzVQT0lOVDFfU0lERSA9IEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfU0lERSwKKyAgICBDSEFOTkVMX01BU0tfN1BPSU5UMSA9IEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEsCiB9IGRvd25taXhfaW5wdXRfY2hhbm5lbF9tYXNrX3Q7CiAKIC8vIGVmZmVjdF9oYW5kbGVfdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIGRvd25taXggZWZmZWN0CkBAIC05OSw3ICs4OCw3IEBACiAvLyBzdHJpY3RseSBmb3IgdGVzdGluZywgbG9ncyB0aGUgaW5kaWNlcyBvZiB0aGUgY2hhbm5lbHMgZm9yIGEgZ2l2ZW4gbWFzaywKIC8vIHVzZXMgdGhlIHNhbWUgY29kZSBhcyBEb3dubWl4X2ZvbGRHZW5lcmljKCkKIHZvaWQgRG93bm1peF90ZXN0SW5kZXhDb21wdXRhdGlvbih1aW50MzJfdCBtYXNrKSB7Ci0gICAgQUxPR0koIlRlc3RpbmcgaW5kZXggY29tcHV0YXRpb24gZm9yIDB4JXg6IiwgbWFzayk7CisgICAgQUxPR0koIlRlc3RpbmcgaW5kZXggY29tcHV0YXRpb24gZm9yIDB4JSIgUFJJeDMyICI6IiwgbWFzayk7CiAgICAgLy8gY2hlY2sgYWdhaW5zdCB1bnN1cHBvcnRlZCBjaGFubmVscwogICAgIGlmIChtYXNrICYga1Vuc3VwcG9ydGVkKSB7CiAgICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBjaGFubmVscyAodG9wIG9yIGZyb250IGxlZnQvcmlnaHQgb2YgY2VudGVyKSIpOwpAQCAtMTI5LDcgKzExOCw3IEBACiAgICAgICAgIGhhc0JhY2tzID0gdHJ1ZTsKICAgICB9CiAKLSAgICBjb25zdCBpbnQgbnVtQ2hhbiA9IHBvcGNvdW50KG1hc2spOworICAgIGNvbnN0IGludCBudW1DaGFuID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1hc2spOwogICAgIGNvbnN0IGJvb2wgaGFzRkMgPSAoKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9DRU5URVIpID09IEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0NFTlRFUik7CiAgICAgY29uc3QgYm9vbCBoYXNMRkUgPQogICAgICAgICAgICAgKChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfTE9XX0ZSRVFVRU5DWSkgPT0gQVVESU9fQ0hBTk5FTF9PVVRfTE9XX0ZSRVFVRU5DWSk7CkBAIC0yMjAsNyArMjA5LDcgQEAKIAogICAgICpwSGFuZGxlID0gKGVmZmVjdF9oYW5kbGVfdCkgbW9kdWxlOwogCi0gICAgQUxPR1YoIkRvd25taXhMaWJfQ3JlYXRlKCkgJXAgLCBzaXplICVkIiwgbW9kdWxlLCBzaXplb2YoZG93bm1peF9tb2R1bGVfdCkpOworICAgIEFMT0dWKCJEb3dubWl4TGliX0NyZWF0ZSgpICVwICwgc2l6ZSAlenUiLCBtb2R1bGUsIHNpemVvZihkb3dubWl4X21vZHVsZV90KSk7CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTI1NCw3ICsyNDMsNyBAQAogICAgICAgICBBTE9HVigiRG93bm1peExpYl9HZXREZXNjcmlwdG9yKCkgaT0lZCIsIGkpOwogICAgICAgICBpZiAobWVtY21wKHV1aWQsICZnRGVzY3JpcHRvcnNbaV0tPnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgewogICAgICAgICAgICAgbWVtY3B5KHBEZXNjcmlwdG9yLCBnRGVzY3JpcHRvcnNbaV0sIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7Ci0gICAgICAgICAgICBBTE9HVigiRWZmZWN0R2V0RGVzY3JpcHRvciAtIFVVSUQgbWF0Y2hlZCBkb3dubWl4IHR5cGUgJWQsIFVVSUQgPSAleCIsCisgICAgICAgICAgICBBTE9HVigiRWZmZWN0R2V0RGVzY3JpcHRvciAtIFVVSUQgbWF0Y2hlZCBkb3dubWl4IHR5cGUgJWQsIFVVSUQgPSAlIiBQUkl4MzIsCiAgICAgICAgICAgICAgICAgIGksIGdEZXNjcmlwdG9yc1tpXS0+dXVpZC50aW1lTG93KTsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CkBAIC0zMjgsNyArMzE3LDcgQEAKICAgICAgICAgICAvLyBieXBhc3MgdGhlIG9wdGltaXplZCBkb3dubWl4IHJvdXRpbmVzIGZvciB0aGUgY29tbW9uIGZvcm1hdHMKICAgICAgICAgICBpZiAoIURvd25taXhfZm9sZEdlbmVyaWMoCiAgICAgICAgICAgICAgICAgICBkb3dubWl4SW5wdXRDaGFubmVsTWFzaywgcFNyYywgcERzdCwgbnVtRnJhbWVzLCBhY2N1bXVsYXRlKSkgewotICAgICAgICAgICAgICBBTE9HRSgiTXVsdGljaGFubmVsIGNvbmZpZ3VyYXRpb24gMHgleCBpcyBub3Qgc3VwcG9ydGVkIiwgZG93bm1peElucHV0Q2hhbm5lbE1hc2spOworICAgICAgICAgICAgICBBTE9HRSgiTXVsdGljaGFubmVsIGNvbmZpZ3VyYXRpb24gMHglIiBQUkl4MzIgIiBpcyBub3Qgc3VwcG9ydGVkIiwgZG93bm1peElucHV0Q2hhbm5lbE1hc2spOwogICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICB9CiAgICAgICAgICAgYnJlYWs7CkBAIC0zMzksMjAgKzMyOCwxNyBAQAogICAgICAgICBjYXNlIENIQU5ORUxfTUFTS19RVUFEX1NJREU6CiAgICAgICAgICAgICBEb3dubWl4X2ZvbGRGcm9tUXVhZChwU3JjLCBwRHN0LCBudW1GcmFtZXMsIGFjY3VtdWxhdGUpOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0hBTk5FTF9NQVNLX1NVUlJPVU5EOgotICAgICAgICAgICAgRG93bm1peF9mb2xkRnJvbVN1cnJvdW5kKHBTcmMsIHBEc3QsIG51bUZyYW1lcywgYWNjdW11bGF0ZSk7Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBDSEFOTkVMX01BU0tfNVBPSU5UMV9CQUNLOgogICAgICAgICBjYXNlIENIQU5ORUxfTUFTS181UE9JTlQxX1NJREU6CiAgICAgICAgICAgICBEb3dubWl4X2ZvbGRGcm9tNVBvaW50MShwU3JjLCBwRHN0LCBudW1GcmFtZXMsIGFjY3VtdWxhdGUpOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0hBTk5FTF9NQVNLXzdQT0lOVDFfU0lERV9CQUNLOgorICAgICAgICBjYXNlIENIQU5ORUxfTUFTS183UE9JTlQxOgogICAgICAgICAgICAgRG93bm1peF9mb2xkRnJvbTdQb2ludDEocFNyYywgcERzdCwgbnVtRnJhbWVzLCBhY2N1bXVsYXRlKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgaWYgKCFEb3dubWl4X2ZvbGRHZW5lcmljKAogICAgICAgICAgICAgICAgICAgICBkb3dubWl4SW5wdXRDaGFubmVsTWFzaywgcFNyYywgcERzdCwgbnVtRnJhbWVzLCBhY2N1bXVsYXRlKSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJNdWx0aWNoYW5uZWwgY29uZmlndXJhdGlvbiAweCV4IGlzIG5vdCBzdXBwb3J0ZWQiLCBkb3dubWl4SW5wdXRDaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgQUxPR0UoIk11bHRpY2hhbm5lbCBjb25maWd1cmF0aW9uIDB4JSIgUFJJeDMyICIgaXMgbm90IHN1cHBvcnRlZCIsIGRvd25taXhJbnB1dENoYW5uZWxNYXNrKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwpAQCAtMzgwLDcgKzM2Niw3IEBACiAKICAgICBwRG93bm1peGVyID0gKGRvd25taXhfb2JqZWN0X3QqKSAmcER3bU1vZHVsZS0+Y29udGV4dDsKIAotICAgIEFMT0dWKCJEb3dubWl4X0NvbW1hbmQgY29tbWFuZCAlZCBjbWRTaXplICVkIixjbWRDb2RlLCBjbWRTaXplKTsKKyAgICBBTE9HVigiRG93bm1peF9Db21tYW5kIGNvbW1hbmQgJSIgUFJJdTMyICIgY21kU2l6ZSAlIiBQUkl1MzIsIGNtZENvZGUsIGNtZFNpemUpOwogCiAgICAgc3dpdGNoIChjbWRDb2RlKSB7CiAgICAgY2FzZSBFRkZFQ1RfQ01EX0lOSVQ6CkBAIC00MDQsNyArMzkwLDcgQEAKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIEVGRkVDVF9DTURfR0VUX1BBUkFNOgotICAgICAgICBBTE9HVigiRG93bm1peF9Db21tYW5kIEVGRkVDVF9DTURfR0VUX1BBUkFNIHBDbWREYXRhICVwLCAqcmVwbHlTaXplICVkLCBwUmVwbHlEYXRhOiAlcCIsCisgICAgICAgIEFMT0dWKCJEb3dubWl4X0NvbW1hbmQgRUZGRUNUX0NNRF9HRVRfUEFSQU0gcENtZERhdGEgJXAsICpyZXBseVNpemUgJSIgUFJJdTMyICIsIHBSZXBseURhdGE6ICVwIiwKICAgICAgICAgICAgICAgICBwQ21kRGF0YSwgKnJlcGx5U2l6ZSwgcFJlcGx5RGF0YSk7CiAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgPCAoaW50KShzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKSB8fAogICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fApAQCAtNDEzLDcgKzM5OSw3IEBACiAgICAgICAgIH0KICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnJlcCA9IChlZmZlY3RfcGFyYW1fdCAqKSBwUmVwbHlEYXRhOwogICAgICAgICBtZW1jcHkocFJlcGx5RGF0YSwgcENtZERhdGEsIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpOwotICAgICAgICBBTE9HVigiRG93bm1peF9Db21tYW5kIEVGRkVDVF9DTURfR0VUX1BBUkFNIHBhcmFtICVkLCByZXBseVNpemUgJWQiLAorICAgICAgICBBTE9HVigiRG93bm1peF9Db21tYW5kIEVGRkVDVF9DTURfR0VUX1BBUkFNIHBhcmFtICUiIFBSSWQzMiAiLCByZXBseVNpemUgJSIgUFJJdTMyLAogICAgICAgICAgICAgICAgICooaW50MzJfdCAqKXJlcC0+ZGF0YSwgcmVwLT52c2l6ZSk7CiAgICAgICAgIHJlcC0+c3RhdHVzID0gRG93bm1peF9nZXRQYXJhbWV0ZXIocERvd25taXhlciwgKihpbnQzMl90ICopcmVwLT5kYXRhLCAmcmVwLT52c2l6ZSwKICAgICAgICAgICAgICAgICByZXAtPmRhdGEgKyBzaXplb2YoaW50MzJfdCkpOwpAQCAtNDIxLDggKzQwNyw4IEBACiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9QQVJBTToKLSAgICAgICAgQUxPR1YoIkRvd25taXhfQ29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9QQVJBTSBjbWRTaXplICVkIHBDbWREYXRhICVwLCAqcmVwbHlTaXplICVkLCAiIFwKLSAgICAgICAgICAgICAgICAicFJlcGx5RGF0YSAlcCIsIGNtZFNpemUsIHBDbWREYXRhLCAqcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKKyAgICAgICAgQUxPR1YoIkRvd25taXhfQ29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9QQVJBTSBjbWRTaXplICVkIHBDbWREYXRhICVwLCAqcmVwbHlTaXplICUiIFBSSXUzMgorICAgICAgICAgICAgICAgICIsIHBSZXBseURhdGEgJXAiLCBjbWRTaXplLCBwQ21kRGF0YSwgKnJlcGx5U2l6ZSwgcFJlcGx5RGF0YSk7CiAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IChjbWRTaXplIDwgKGludCkoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSkpCiAgICAgICAgICAgICAgICAgfHwgcFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gKGludClzaXplb2YoaW50MzJfdCkpIHsKICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwpAQCAtNDcxLDcgKzQ1Nyw3IEBACiAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgfQogICAgICAgICAvLyBGSVhNRSBjaGFuZ2UgdHlwZSBpZiBwbGF5aW5nIG9uIGhlYWRzZXQgdnMgc3BlYWtlcgotICAgICAgICBBTE9HVigiRG93bm1peF9Db21tYW5kIEVGRkVDVF9DTURfU0VUX0RFVklDRTogMHglMDh4IiwgKih1aW50MzJfdCAqKXBDbWREYXRhKTsKKyAgICAgICAgQUxPR1YoIkRvd25taXhfQ29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9ERVZJQ0U6IDB4JTA4IiBQUkl4MzIsICoodWludDMyX3QgKilwQ21kRGF0YSk7CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9WT0xVTUU6IHsKQEAgLTQ5MSw3ICs0NzcsNyBAQAogICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplICE9IChpbnQpc2l6ZW9mKHVpbnQzMl90KSkgewogICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgIH0KLSAgICAgICAgQUxPR1YoIkRvd25taXhfQ29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9BVURJT19NT0RFOiAlZCIsICoodWludDMyX3QgKilwQ21kRGF0YSk7CisgICAgICAgIEFMT0dWKCJEb3dubWl4X0NvbW1hbmQgRUZGRUNUX0NNRF9TRVRfQVVESU9fTU9ERTogJSIgUFJJdTMyLCAqKHVpbnQzMl90ICopcENtZERhdGEpOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfQ09ORklHX1JFVkVSU0U6CkBAIC01MDAsNyArNDg2LDcgQEAKICAgICAgICAgYnJlYWs7CiAKICAgICBkZWZhdWx0OgotICAgICAgICBBTE9HVygiRG93bm1peF9Db21tYW5kIGludmFsaWQgY29tbWFuZCAlZCIsY21kQ29kZSk7CisgICAgICAgIEFMT0dXKCJEb3dubWl4X0NvbW1hbmQgaW52YWxpZCBjb21tYW5kICUiIFBSSXUzMiwgY21kQ29kZSk7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIApAQCAtNjI5LDcgKzYxNSw5IEBACiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAotICAgIG1lbWNweSgmcER3bU1vZHVsZS0+Y29uZmlnLCBwQ29uZmlnLCBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSk7CisgICAgaWYgKCZwRHdtTW9kdWxlLT5jb25maWcgIT0gcENvbmZpZykgeworICAgICAgICBtZW1jcHkoJnBEd21Nb2R1bGUtPmNvbmZpZywgcENvbmZpZywgc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkpOworICAgIH0KIAogICAgIGlmIChpbml0KSB7CiAgICAgICAgIHBEb3dubWl4ZXItPnR5cGUgPSBET1dOTUlYX1RZUEVfRk9MRDsKQEAgLTY0MSw3ICs2MjksOCBAQAogICAgICAgICAgICAgQUxPR0UoIkRvd25taXhfQ29uZmlndXJlIGVycm9yOiBpbnB1dCBjaGFubmVsIG1hc2sgY2FuJ3QgYmUgMCIpOwogICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgIH0KLSAgICAgICAgcERvd25taXhlci0+aW5wdXRfY2hhbm5lbF9jb3VudCA9IHBvcGNvdW50KHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKTsKKyAgICAgICAgcERvd25taXhlci0+aW5wdXRfY2hhbm5lbF9jb3VudCA9CisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKTsKICAgICB9CiAKICAgICBEb3dubWl4X1Jlc2V0KHBEb3dubWl4ZXIsIGluaXQpOwpAQCAtNjk3LDMxICs2ODYsMzEgQEAKICAqCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwotaW50IERvd25taXhfc2V0UGFyYW1ldGVyKGRvd25taXhfb2JqZWN0X3QgKnBEb3dubWl4ZXIsIGludDMyX3QgcGFyYW0sIHNpemVfdCBzaXplLCB2b2lkICpwVmFsdWUpIHsKK2ludCBEb3dubWl4X3NldFBhcmFtZXRlcihkb3dubWl4X29iamVjdF90ICpwRG93bm1peGVyLCBpbnQzMl90IHBhcmFtLCB1aW50MzJfdCBzaXplLCB2b2lkICpwVmFsdWUpIHsKIAogICAgIGludDE2X3QgdmFsdWUxNjsKLSAgICBBTE9HVigiRG93bm1peF9zZXRQYXJhbWV0ZXIsIGNvbnRleHQgJXAsIHBhcmFtICVkLCB2YWx1ZTE2ICVkLCB2YWx1ZTMyICVkIiwKKyAgICBBTE9HVigiRG93bm1peF9zZXRQYXJhbWV0ZXIsIGNvbnRleHQgJXAsIHBhcmFtICUiIFBSSWQzMiAiLCB2YWx1ZTE2ICUiIFBSSWQxNiAiLCB2YWx1ZTMyICUiIFBSSWQzMiwKICAgICAgICAgICAgIHBEb3dubWl4ZXIsIHBhcmFtLCAqKGludDE2X3QgKilwVmFsdWUsICooaW50MzJfdCAqKXBWYWx1ZSk7CiAKICAgICBzd2l0Y2ggKHBhcmFtKSB7CiAKICAgICAgIGNhc2UgRE9XTk1JWF9QQVJBTV9UWVBFOgogICAgICAgICBpZiAoc2l6ZSAhPSBzaXplb2YoZG93bm1peF90eXBlX3QpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRG93bm1peF9zZXRQYXJhbWV0ZXIoRE9XTk1JWF9QQVJBTV9UWVBFKSBpbnZhbGlkIHNpemUgJWQsIHNob3VsZCBiZSAlZCIsCisgICAgICAgICAgICBBTE9HRSgiRG93bm1peF9zZXRQYXJhbWV0ZXIoRE9XTk1JWF9QQVJBTV9UWVBFKSBpbnZhbGlkIHNpemUgJSIgUFJJdTMyICIsIHNob3VsZCBiZSAlenUiLAogICAgICAgICAgICAgICAgICAgICBzaXplLCBzaXplb2YoZG93bm1peF90eXBlX3QpKTsKICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICB9CiAgICAgICAgIHZhbHVlMTYgPSAqKGludDE2X3QgKilwVmFsdWU7Ci0gICAgICAgIEFMT0dWKCJzZXQgRE9XTk1JWF9QQVJBTV9UWVBFLCB0eXBlICVkIiwgdmFsdWUxNik7CisgICAgICAgIEFMT0dWKCJzZXQgRE9XTk1JWF9QQVJBTV9UWVBFLCB0eXBlICUiIFBSSWQxNiwgdmFsdWUxNik7CiAgICAgICAgIGlmICghKCh2YWx1ZTE2ID4gRE9XTk1JWF9UWVBFX0lOVkFMSUQpICYmICh2YWx1ZTE2IDw9IERPV05NSVhfVFlQRV9MQVNUKSkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJEb3dubWl4X3NldFBhcmFtZXRlciBpbnZhbGlkIERPV05NSVhfUEFSQU1fVFlQRSB2YWx1ZSAlZCIsIHZhbHVlMTYpOworICAgICAgICAgICAgQUxPR0UoIkRvd25taXhfc2V0UGFyYW1ldGVyIGludmFsaWQgRE9XTk1JWF9QQVJBTV9UWVBFIHZhbHVlICUiIFBSSWQxNiwgdmFsdWUxNik7CiAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHBEb3dubWl4ZXItPnR5cGUgPSAoZG93bm1peF90eXBlX3QpIHZhbHVlMTY7CiAgICAgICAgIGJyZWFrOwogCiAgICAgICBkZWZhdWx0OgotICAgICAgICBBTE9HRSgiRG93bm1peF9zZXRQYXJhbWV0ZXIgdW5rbm93biBwYXJhbWV0ZXIgJWQiLCBwYXJhbSk7CisgICAgICAgIEFMT0dFKCJEb3dubWl4X3NldFBhcmFtZXRlciB1bmtub3duIHBhcmFtZXRlciAlIiBQUklkMzIsIHBhcmFtKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogfQpAQCAtNzUzLDI0ICs3NDIsMjQgQEAKICAqCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwotaW50IERvd25taXhfZ2V0UGFyYW1ldGVyKGRvd25taXhfb2JqZWN0X3QgKnBEb3dubWl4ZXIsIGludDMyX3QgcGFyYW0sIHNpemVfdCAqcFNpemUsIHZvaWQgKnBWYWx1ZSkgeworaW50IERvd25taXhfZ2V0UGFyYW1ldGVyKGRvd25taXhfb2JqZWN0X3QgKnBEb3dubWl4ZXIsIGludDMyX3QgcGFyYW0sIHVpbnQzMl90ICpwU2l6ZSwgdm9pZCAqcFZhbHVlKSB7CiAgICAgaW50MTZfdCAqcFZhbHVlMTY7CiAKICAgICBzd2l0Y2ggKHBhcmFtKSB7CiAKICAgICBjYXNlIERPV05NSVhfUEFSQU1fVFlQRToKICAgICAgIGlmICgqcFNpemUgPCBzaXplb2YoaW50MTZfdCkpIHsKLSAgICAgICAgICBBTE9HRSgiRG93bm1peF9nZXRQYXJhbWV0ZXIgaW52YWxpZCBwYXJhbWV0ZXIgc2l6ZSAlZCBmb3IgRE9XTk1JWF9QQVJBTV9UWVBFIiwgKnBTaXplKTsKKyAgICAgICAgICBBTE9HRSgiRG93bm1peF9nZXRQYXJhbWV0ZXIgaW52YWxpZCBwYXJhbWV0ZXIgc2l6ZSAlIiBQUkl1MzIgIiBmb3IgRE9XTk1JWF9QQVJBTV9UWVBFIiwgKnBTaXplKTsKICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgIH0KICAgICAgIHBWYWx1ZTE2ID0gKGludDE2X3QgKilwVmFsdWU7CiAgICAgICAqcFZhbHVlMTYgPSAoaW50MTZfdCkgcERvd25taXhlci0+dHlwZTsKICAgICAgICpwU2l6ZSA9IHNpemVvZihpbnQxNl90KTsKLSAgICAgIEFMT0dWKCJEb3dubWl4X2dldFBhcmFtZXRlciBET1dOTUlYX1BBUkFNX1RZUEUgaXMgJWQiLCAqcFZhbHVlMTYpOworICAgICAgQUxPR1YoIkRvd25taXhfZ2V0UGFyYW1ldGVyIERPV05NSVhfUEFSQU1fVFlQRSBpcyAlIiBQUklkMTYsICpwVmFsdWUxNik7CiAgICAgICBicmVhazsKIAogICAgIGRlZmF1bHQ6Ci0gICAgICBBTE9HRSgiRG93bm1peF9nZXRQYXJhbWV0ZXIgdW5rbm93biBwYXJhbWV0ZXIgJWQiLCBwYXJhbSk7CisgICAgICBBTE9HRSgiRG93bm1peF9nZXRQYXJhbWV0ZXIgdW5rbm93biBwYXJhbWV0ZXIgJSIgUFJJZDE2LCBwYXJhbSk7CiAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKQEAgLTgyNSw2NSArODE0LDYgQEAKIAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIERvd25taXhfZm9sZEZyb21TdXJyb3VuZCgpCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIFB1cnBvc2U6Ci0gKiBkb3dubWl4IGEgInN1cnJvdW5kIHNvdW5kIiAobW9ubyByZWFyKSBzaWduYWwgdG8gc3RlcmVvCi0gKgotICogSW5wdXRzOgotICogIHBTcmMgICAgICAgc3Vycm91bmQgc2lnbmFsIHRvIGRvd25taXgKLSAqICBudW1GcmFtZXMgIHRoZSBudW1iZXIgb2Ygc3Vycm91bmQgZnJhbWVzIHRvIGRvd25taXgKLSAqICBhY2N1bXVsYXRlIHdoZXRoZXIgdG8gbWl4ICh3aGVuIHRydWUpIHRoZSByZXN1bHQgb2YgdGhlIGRvd25taXggd2l0aCB0aGUgY29udGVudHMgb2YgcERzdCwKLSAqICAgICAgICAgICAgICAgb3Igb3ZlcndyaXRlIHBEc3QgKHdoZW4gZmFsc2UpCi0gKgotICogT3V0cHV0czoKLSAqICBwRHN0ICAgICAgIGRvd25taXhlZCBzdGVyZW8gYXVkaW8gc2FtcGxlcwotICoKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi12b2lkIERvd25taXhfZm9sZEZyb21TdXJyb3VuZChpbnQxNl90ICpwU3JjLCBpbnQxNl90KnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSkgewotICAgIGludDMyX3QgbHQsIHJ0LCBjZW50ZXJQbHVzUmVhckNvbnRyaWI7IC8vIHNhbXBsZXMgaW4gUTE5LjEyIGZvcm1hdAotICAgIC8vIHNhbXBsZSBhdCBpbmRleCAwIGlzIEZMCi0gICAgLy8gc2FtcGxlIGF0IGluZGV4IDEgaXMgRlIKLSAgICAvLyBzYW1wbGUgYXQgaW5kZXggMiBpcyBGQwotICAgIC8vIHNhbXBsZSBhdCBpbmRleCAzIGlzIFJDCi0gICAgLy8gY29kZSBpcyBtb3N0bHkgZHVwbGljYXRlZCBiZXR3ZWVuIHRoZSB0d28gdmFsdWVzIG9mIGFjY3VtdWxhdGUgdG8gYXZvaWQgcmVwZWF0aW5nIHRoZSB0ZXN0Ci0gICAgLy8gZm9yIGV2ZXJ5IHNhbXBsZQotICAgIGlmIChhY2N1bXVsYXRlKSB7Ci0gICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKLSAgICAgICAgICAgIC8vIGNlbnRlclBsdXNSZWFyQ29udHJpYiA9IEZDKC0zZEIpICsgUkMoLTNkQikKLSAgICAgICAgICAgIGNlbnRlclBsdXNSZWFyQ29udHJpYiA9IChwU3JjWzJdICogTUlOVVNfM19EQl9JTl9RMTlfMTIpICsgKHBTcmNbM10gKiBNSU5VU18zX0RCX0lOX1ExOV8xMik7Ci0gICAgICAgICAgICAvLyBGTCArIGNlbnRlclBsdXNSZWFyQ29udHJpYgotICAgICAgICAgICAgbHQgPSAocFNyY1swXSA8PCAxMikgKyBjZW50ZXJQbHVzUmVhckNvbnRyaWI7Ci0gICAgICAgICAgICAvLyBGUiArIGNlbnRlclBsdXNSZWFyQ29udHJpYgotICAgICAgICAgICAgcnQgPSAocFNyY1sxXSA8PCAxMikgKyBjZW50ZXJQbHVzUmVhckNvbnRyaWI7Ci0gICAgICAgICAgICAvLyBhY2N1bXVsYXRlIGluIGRlc3RpbmF0aW9uCi0gICAgICAgICAgICBwRHN0WzBdID0gY2xhbXAxNihwRHN0WzBdICsgKGx0ID4+IDEzKSk7Ci0gICAgICAgICAgICBwRHN0WzFdID0gY2xhbXAxNihwRHN0WzFdICsgKHJ0ID4+IDEzKSk7Ci0gICAgICAgICAgICBwU3JjICs9IDQ7Ci0gICAgICAgICAgICBwRHN0ICs9IDI7Ci0gICAgICAgICAgICBudW1GcmFtZXMtLTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7IC8vIHNhbWUgY29kZSBhcyBhYm92ZSBidXQgd2l0aG91dCBhZGRpbmcgYW5kIGNsYW1waW5nIHBEc3RbaV0gdG8gaXRzZWxmCi0gICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKLSAgICAgICAgICAgIC8vIGNlbnRlclBsdXNSZWFyQ29udHJpYiA9IEZDKC0zZEIpICsgUkMoLTNkQikKLSAgICAgICAgICAgIGNlbnRlclBsdXNSZWFyQ29udHJpYiA9IChwU3JjWzJdICogTUlOVVNfM19EQl9JTl9RMTlfMTIpICsgKHBTcmNbM10gKiBNSU5VU18zX0RCX0lOX1ExOV8xMik7Ci0gICAgICAgICAgICAvLyBGTCArIGNlbnRlclBsdXNSZWFyQ29udHJpYgotICAgICAgICAgICAgbHQgPSAocFNyY1swXSA8PCAxMikgKyBjZW50ZXJQbHVzUmVhckNvbnRyaWI7Ci0gICAgICAgICAgICAvLyBGUiArIGNlbnRlclBsdXNSZWFyQ29udHJpYgotICAgICAgICAgICAgcnQgPSAocFNyY1sxXSA8PCAxMikgKyBjZW50ZXJQbHVzUmVhckNvbnRyaWI7Ci0gICAgICAgICAgICAvLyBzdG9yZSBpbiBkZXN0aW5hdGlvbgotICAgICAgICAgICAgcERzdFswXSA9IGNsYW1wMTYobHQgPj4gMTMpOyAvLyBkaWZmZXJzIGZyb20gd2hlbiBhY2N1bXVsYXRlIGlzIHRydWUgYWJvdmUKLSAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcDE2KHJ0ID4+IDEzKTsgLy8gZGlmZmVycyBmcm9tIHdoZW4gYWNjdW11bGF0ZSBpcyB0cnVlIGFib3ZlCi0gICAgICAgICAgICBwU3JjICs9IDQ7Ci0gICAgICAgICAgICBwRHN0ICs9IDI7Ci0gICAgICAgICAgICBudW1GcmFtZXMtLTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIERvd25taXhfZm9sZEZyb201UG9pbnQxKCkKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogUHVycG9zZToKQEAgLTEwNjgsNyArOTk4LDcgQEAKICAgICAgICAgaGFzQmFja3MgPSB0cnVlOwogICAgIH0KIAotICAgIGNvbnN0IGludCBudW1DaGFuID0gcG9wY291bnQobWFzayk7CisgICAgY29uc3QgaW50IG51bUNoYW4gPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobWFzayk7CiAgICAgY29uc3QgYm9vbCBoYXNGQyA9ICgobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0NFTlRFUikgPT0gQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfQ0VOVEVSKTsKICAgICBjb25zdCBib29sIGhhc0xGRSA9CiAgICAgICAgICAgICAoKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZKSA9PSBBVURJT19DSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmggYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5oCmluZGV4IGNiNmI5NTcuLjIzOTlhYmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguaApAQCAtOTMsMTEgKzkzLDEwIEBACiBpbnQgRG93bm1peF9Jbml0KGRvd25taXhfbW9kdWxlX3QgKnBEd21Nb2R1bGUpOwogaW50IERvd25taXhfQ29uZmlndXJlKGRvd25taXhfbW9kdWxlX3QgKnBEd21Nb2R1bGUsIGVmZmVjdF9jb25maWdfdCAqcENvbmZpZywgYm9vbCBpbml0KTsKIGludCBEb3dubWl4X1Jlc2V0KGRvd25taXhfb2JqZWN0X3QgKnBEb3dubWl4ZXIsIGJvb2wgaW5pdCk7Ci1pbnQgRG93bm1peF9zZXRQYXJhbWV0ZXIoZG93bm1peF9vYmplY3RfdCAqcERvd25taXhlciwgaW50MzJfdCBwYXJhbSwgc2l6ZV90IHNpemUsIHZvaWQgKnBWYWx1ZSk7Ci1pbnQgRG93bm1peF9nZXRQYXJhbWV0ZXIoZG93bm1peF9vYmplY3RfdCAqcERvd25taXhlciwgaW50MzJfdCBwYXJhbSwgc2l6ZV90ICpwU2l6ZSwgdm9pZCAqcFZhbHVlKTsKK2ludCBEb3dubWl4X3NldFBhcmFtZXRlcihkb3dubWl4X29iamVjdF90ICpwRG93bm1peGVyLCBpbnQzMl90IHBhcmFtLCB1aW50MzJfdCBzaXplLCB2b2lkICpwVmFsdWUpOworaW50IERvd25taXhfZ2V0UGFyYW1ldGVyKGRvd25taXhfb2JqZWN0X3QgKnBEb3dubWl4ZXIsIGludDMyX3QgcGFyYW0sIHVpbnQzMl90ICpwU2l6ZSwgdm9pZCAqcFZhbHVlKTsKIAogdm9pZCBEb3dubWl4X2ZvbGRGcm9tUXVhZChpbnQxNl90ICpwU3JjLCBpbnQxNl90KnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSk7Ci12b2lkIERvd25taXhfZm9sZEZyb21TdXJyb3VuZChpbnQxNl90ICpwU3JjLCBpbnQxNl90KnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSk7CiB2b2lkIERvd25taXhfZm9sZEZyb201UG9pbnQxKGludDE2X3QgKnBTcmMsIGludDE2X3QqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKTsKIHZvaWQgRG93bm1peF9mb2xkRnJvbTdQb2ludDEoaW50MTZfdCAqcFNyYywgaW50MTZfdCpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpOwogYm9vbCBEb3dubWl4X2ZvbGRHZW5lcmljKApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0FuZHJvaWQubWsgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvQW5kcm9pZC5tawppbmRleCA2MGE2Y2U1Li5hOTMyYWY3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvQW5kcm9pZC5tawpAQCAtOSw3ICs5LDYgQEAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogCWxpYmN1dGlscyBsaWJsb2cKIAotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX1NIQVJFRF9MSUJSQVJJRVMpCiBMT0NBTF9NT0RVTEU6PSBsaWJlZmZlY3RzCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfSW5pdC5jCmluZGV4IDMyYzRjZTAuLjM1ZTViYzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0luaXQuYwpAQCAtMTc4LDcgKzE3OCw3IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcmV0dXJuKExWREJFX05VTExBRERSRVNTKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoKExWTV9VSU5UMzIpcE1lbW9yeVRhYmxlLT5SZWdpb25baV0ucEJhc2VBZGRyZXNzICUgcE1lbW9yeVRhYmxlLT5SZWdpb25baV0uQWxpZ25tZW50KSE9MCl7CisgICAgICAgICAgICBpZiAoKCh1aW50cHRyX3QpcE1lbW9yeVRhYmxlLT5SZWdpb25baV0ucEJhc2VBZGRyZXNzICUgcE1lbW9yeVRhYmxlLT5SZWdpb25baV0uQWxpZ25tZW50KSE9MCl7CiAgICAgICAgICAgICAgICAgcmV0dXJuKExWREJFX0FMSUdOTUVOVEVSUk9SKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1Byb2Nlc3MuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmMKaW5kZXggNzk0MjcxYi4uZjVhMDFmMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1Byb2Nlc3MuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJvY2Vzcy5jCkBAIC05OSw3ICs5OSw3IEBACiAgICAgICAgIC8qCiAgICAgICAgICAqIENoZWNrIHRoZSBidWZmZXIgYWxpZ25tZW50CiAgICAgICAgICAqLwotICAgICAgICBpZigoKChMVk1fVUlOVDMyKXBJbkRhdGEgJSA0KSAhPSAwKSB8fCAoKChMVk1fVUlOVDMyKXBPdXREYXRhICUgNCkgIT0gMCkpCisgICAgICAgIGlmKCgoKHVpbnRwdHJfdClwSW5EYXRhICUgNCkgIT0gMCkgfHwgKCgodWludHB0cl90KXBPdXREYXRhICUgNCkgIT0gMCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybihMVk1fQUxJR05NRU5URVJST1IpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9JbnN0QWxsb2MuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0luc3RBbGxvYy5oCmluZGV4IGM2OTU0ZjIuLjdmNzI1ZjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0luc3RBbGxvYy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0luc3RBbGxvYy5oCkBAIC0yOSw3ICsyOSw3IEBACiB0eXBlZGVmIHN0cnVjdAogewogICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgIFRvdGFsU2l6ZTsgICAgICAvKiAgQWNjdW11bGF0aXZlIHRvdGFsIG1lbW9yeSBzaXplICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgcE5leHRNZW1iZXI7ICAgIC8qICBQb2ludGVyIHRvIHRoZSBuZXh0IGluc3RhbmNlIG1lbWJlciB0byBiZSBhbGxvY2F0ZWQgKi8KKyAgICB1aW50cHRyX3QgICAgICAgICAgICAgICBwTmV4dE1lbWJlcjsgICAgLyogIFBvaW50ZXIgdG8gdGhlIG5leHQgaW5zdGFuY2UgbWVtYmVyIHRvIGJlIGFsbG9jYXRlZCAqLwogfSAgIElOU1RfQUxMT0M7CiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1R5cGVzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaAppbmRleCA4MTY1NWRkLi4wYzZmYjI1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaApAQCAtMjksNiArMjksNyBAQAogZXh0ZXJuICJDIiB7CiAjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KIAorI2luY2x1ZGUgPHN0ZGludC5oPgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtODUsMTQgKzg2LDE0IEBACiAKIHR5cGVkZWYgICAgIGNoYXIgICAgICAgICAgICAgICAgTFZNX0NIQVI7ICAgICAgICAgICAvKiBBU0NJSSBjaGFyYWN0ZXIgKi8KIAotdHlwZWRlZiAgICAgY2hhciAgICAgICAgICAgICAgICBMVk1fSU5UODsgICAgICAgICAgIC8qIFNpZ25lZCA4LWJpdCB3b3JkICovCi10eXBlZGVmICAgICB1bnNpZ25lZCBjaGFyICAgICAgIExWTV9VSU5UODsgICAgICAgICAgLyogVW5zaWduZWQgOC1iaXQgd29yZCAqLwordHlwZWRlZiAgICAgaW50OF90ICAgICAgICAgICAgICBMVk1fSU5UODsgICAgICAgICAgIC8qIFNpZ25lZCA4LWJpdCB3b3JkICovCit0eXBlZGVmICAgICB1aW50OF90ICAgICAgICAgICAgIExWTV9VSU5UODsgICAgICAgICAgLyogVW5zaWduZWQgOC1iaXQgd29yZCAqLwogCi10eXBlZGVmICAgICBzaG9ydCAgICAgICAgICAgICAgIExWTV9JTlQxNjsgICAgICAgICAgLyogU2lnbmVkIDE2LWJpdCB3b3JkICovCi10eXBlZGVmICAgICB1bnNpZ25lZCBzaG9ydCAgICAgIExWTV9VSU5UMTY7ICAgICAgICAgLyogVW5zaWduZWQgMTYtYml0IHdvcmQgKi8KK3R5cGVkZWYgICAgIGludDE2X3QgICAgICAgICAgICAgTFZNX0lOVDE2OyAgICAgICAgICAvKiBTaWduZWQgMTYtYml0IHdvcmQgKi8KK3R5cGVkZWYgICAgIHVpbnQxNl90ICAgICAgICAgICAgTFZNX1VJTlQxNjsgICAgICAgICAvKiBVbnNpZ25lZCAxNi1iaXQgd29yZCAqLwogCi10eXBlZGVmICAgICBsb25nICAgICAgICAgICAgICAgIExWTV9JTlQzMjsgICAgICAgICAgLyogU2lnbmVkIDMyLWJpdCB3b3JkICovCi10eXBlZGVmICAgICB1bnNpZ25lZCBsb25nICAgICAgIExWTV9VSU5UMzI7ICAgICAgICAgLyogVW5zaWduZWQgMzItYml0IHdvcmQgKi8KK3R5cGVkZWYgICAgIGludDMyX3QgICAgICAgICAgICAgTFZNX0lOVDMyOyAgICAgICAgICAvKiBTaWduZWQgMzItYml0IHdvcmQgKi8KK3R5cGVkZWYgICAgIHVpbnQzMl90ICAgICAgICAgICAgTFZNX1VJTlQzMjsgICAgICAgICAvKiBVbnNpZ25lZCAzMi1iaXQgd29yZCAqLwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSW5zdEFsbG9jLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9JbnN0QWxsb2MuYwppbmRleCA0ODFkZjg0Li5hODlhNWMzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9JbnN0QWxsb2MuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9JbnN0QWxsb2MuYwpAQCAtMzAsNyArMzAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICpTdGFydEFkZHIgKQogewogICAgIHBtcy0+VG90YWxTaXplID0gMzsKLSAgICBwbXMtPnBOZXh0TWVtYmVyID0gKExWTV9VSU5UMzIpKCgoTFZNX1VJTlQzMilTdGFydEFkZHIgKyAzKSAmIDB4RkZGRkZGRkMpOy8qIFRoaXMgY29kZSB3aWxsIGZhaWwgaWYgdGhlIHBsYXRmb3JtIGFkZHJlc3Mgc3BhY2UgaXMgbW9yZSB0aGFuIDMyLWJpdHMqLworICAgIHBtcy0+cE5leHRNZW1iZXIgPSAoKCh1aW50cHRyX3QpU3RhcnRBZGRyICsgMykgJiAodWludHB0cl90KX4zKTsKIH0KIAogCkBAIC01MSw3ICs1MSw3IEBACiAgICAgdm9pZCAqTmV3TWVtYmVyQWRkcmVzczsgLyogVmFyaWFibGUgdG8gdGVtcG9yYXJpbHkgc3RvcmUgdGhlIHJldHVybiB2YWx1ZSAqLwogICAgIE5ld01lbWJlckFkZHJlc3MgPSAodm9pZCopcG1zLT5wTmV4dE1lbWJlcjsKIAotICAgIFNpemUgPSAoKFNpemUgKyAzKSAmIDB4RkZGRkZGRkMpOyAvKiBDZWlsIHRoZSBzaXplIHRvIGEgbXVsdGlwbGUgb2YgZm91ciAqLworICAgIFNpemUgPSAoKFNpemUgKyAzKSAmIChMVk1fVUlOVDMyKX4zKTsgLyogQ2VpbCB0aGUgc2l6ZSB0byBhIG11bHRpcGxlIG9mIGZvdXIgKi8KIAogICAgIHBtcy0+VG90YWxTaXplICs9IFNpemU7CiAgICAgcG1zLT5wTmV4dE1lbWJlciArPSBTaXplOwpAQCAtODQsMzAgKzg0LDMwIEBACiB2b2lkICAgIEluc3RBbGxvY19Jbml0QWxsKCBJTlNUX0FMTE9DICAgICAgICAgICAgICAgICAgICAgICpwbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTWVtb3J5VGFibGVfc3QgICAgICAgICAgICAgKnBNZW1vcnlUYWJsZSkKIHsKLSAgICBMVk1fVUlOVDMyIFN0YXJ0QWRkcjsKKyAgICB1aW50cHRyX3QgU3RhcnRBZGRyOwogCi0gICAgU3RhcnRBZGRyID0gKExWTV9VSU5UMzIpcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5wQmFzZUFkZHJlc3M7CisgICAgU3RhcnRBZGRyID0gKHVpbnRwdHJfdClwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLnBCYXNlQWRkcmVzczsKIAogICAgIHBtc1swXS5Ub3RhbFNpemUgPSAzOwotICAgIHBtc1swXS5wTmV4dE1lbWJlciA9IChMVk1fVUlOVDMyKSgoKExWTV9VSU5UMzIpU3RhcnRBZGRyICsgMykgJiAweEZGRkZGRkZDKTsKKyAgICBwbXNbMF0ucE5leHRNZW1iZXIgPSAoKFN0YXJ0QWRkciArIDMpICYgKHVpbnRwdHJfdCl+Myk7CiAKIAotICAgIFN0YXJ0QWRkciA9IChMVk1fVUlOVDMyKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzOworICAgIFN0YXJ0QWRkciA9ICh1aW50cHRyX3QpcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3M7CiAKICAgICBwbXNbMV0uVG90YWxTaXplID0gMzsKLSAgICBwbXNbMV0ucE5leHRNZW1iZXIgPSAoTFZNX1VJTlQzMikoKChMVk1fVUlOVDMyKVN0YXJ0QWRkciArIDMpICYgMHhGRkZGRkZGQyk7CisgICAgcG1zWzFdLnBOZXh0TWVtYmVyID0gKChTdGFydEFkZHIgKyAzKSAmICh1aW50cHRyX3QpfjMpOwogCiAKLSAgICBTdGFydEFkZHIgPSAoTFZNX1VJTlQzMilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzczsKKyAgICBTdGFydEFkZHIgPSAodWludHB0cl90KXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzOwogCiAgICAgcG1zWzJdLlRvdGFsU2l6ZSA9IDM7Ci0gICAgcG1zWzJdLnBOZXh0TWVtYmVyID0gKExWTV9VSU5UMzIpKCgoTFZNX1VJTlQzMilTdGFydEFkZHIgKyAzKSAmIDB4RkZGRkZGRkMpOworICAgIHBtc1syXS5wTmV4dE1lbWJlciA9ICgoU3RhcnRBZGRyICsgMykgJiAodWludHB0cl90KX4zKTsKIAogCi0gICAgU3RhcnRBZGRyID0gKExWTV9VSU5UMzIpcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1RFTVBPUkFSWV9GQVNUXS5wQmFzZUFkZHJlc3M7CisgICAgU3RhcnRBZGRyID0gKHVpbnRwdHJfdClwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzczsKIAogICAgIHBtc1szXS5Ub3RhbFNpemUgPSAzOwotICAgIHBtc1szXS5wTmV4dE1lbWJlciA9IChMVk1fVUlOVDMyKSgoKExWTV9VSU5UMzIpU3RhcnRBZGRyICsgMykgJiAweEZGRkZGRkZDKTsKKyAgICBwbXNbM10ucE5leHRNZW1iZXIgPSAoKFN0YXJ0QWRkciArIDMpICYgKHVpbnRwdHJfdCl+Myk7CiAKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfSW5pdC5jCmluZGV4IGM0NzY3YTguLmUwMWMxYzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Jbml0LmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlICJMVkVRTkIuaCIKICNpbmNsdWRlICJMVkVRTkJfUHJpdmF0ZS5oIgogI2luY2x1ZGUgIkluc3RBbGxvYy5oIgorI2luY2x1ZGUgPHN0cmluZy5oPiAvKiBGb3IgbWVtc2V0ICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcm9jZXNzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcm9jZXNzLmMKaW5kZXggYWMzYzc0MC4uNThmNThlZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJvY2Vzcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1Byb2Nlc3MuYwpAQCAtNzcsNyArNzcsNyBAQAogICAgIH0KIAogICAgIC8qIENoZWNrIGlmIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEgYnVmZmVycyBhcmUgMzItYml0IGFsaWduZWQgKi8KLSAgICBpZiAoKCgoTFZNX0lOVDMyKXBJbkRhdGEgJSA0KSAhPSAwKSB8fCAoKChMVk1fSU5UMzIpcE91dERhdGEgJSA0KSAhPSAwKSkKKyAgICBpZiAoKCgodWludHB0cl90KXBJbkRhdGEgJSA0KSAhPSAwKSB8fCAoKCh1aW50cHRyX3QpcE91dERhdGEgJSA0KSAhPSAwKSkKICAgICB7CiAgICAgICAgIHJldHVybiBMVkVRTkJfQUxJR05NRU5URVJST1I7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAKaW5kZXggODlkOTczYS4uZWE3MmU2OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwCkBAIC0xOSwxMSArMTksMTMgQEAKICNkZWZpbmUgQVJSQVlfU0laRShhcnJheSkgKHNpemVvZiBhcnJheSAvIHNpemVvZiBhcnJheVswXSkKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAotI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KICNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPG5ldz4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxuZXc+CisKKyNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CiAjaW5jbHVkZSAiRWZmZWN0QnVuZGxlLmgiCiAKIApAQCAtMTM4LDIyICsxNDAsMjIgQEAKIGludCAgQmFzc0Jvb3N0X3NldFBhcmFtZXRlciAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIHZvaWQgKnBQYXJhbSwgdm9pZCAqcFZhbHVlKTsKIGludCAgQmFzc0Jvb3N0X2dldFBhcmFtZXRlciAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAqcFZhbHVlU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqcFZhbHVlKTsKIGludCAgVmlydHVhbGl6ZXJfc2V0UGFyYW1ldGVyICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIHZvaWQgKnBQYXJhbSwgdm9pZCAqcFZhbHVlKTsKIGludCAgVmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAqcFZhbHVlU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqcFZhbHVlKTsKIGludCAgRXF1YWxpemVyX3NldFBhcmFtZXRlciAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIHZvaWQgKnBQYXJhbSwgdm9pZCAqcFZhbHVlKTsKIGludCAgRXF1YWxpemVyX2dldFBhcmFtZXRlciAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAqcFZhbHVlU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFZhbHVlKTsKIGludCAgVm9sdW1lX3NldFBhcmFtZXRlciAgICAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIHZvaWQgKnBQYXJhbSwgdm9pZCAqcFZhbHVlKTsKIGludCAgVm9sdW1lX2dldFBhcmFtZXRlciAgICAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAqcFZhbHVlU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFZhbHVlKTsKIGludCBFZmZlY3Rfc2V0RW5hYmxlZChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgYm9vbCBlbmFibGVkKTsKIApAQCAtMTYxLDcgKzE2Myw3IEBACiAKIGV4dGVybiAiQyIgaW50IEVmZmVjdENyZWF0ZShjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgaW9JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIGlvSWQgX191bnVzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2hhbmRsZV90ICAqcEhhbmRsZSl7CiAgICAgaW50IHJldCA9IDA7CiAgICAgaW50IHNlc3Npb25ObzsKQEAgLTIyMSw2ICsyMjMsOCBAQAogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc1RlbXBEaXNhYmxlZCAgICAgICAgPSBMVk1fRkFMU0U7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgICAgICA9IExWTV9GQUxTRTsKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyVGVtcERpc2FibGVkID0gTFZNX0ZBTFNFOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5uT3V0cHV0RGV2aWNlICAgICAgICAgICAgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+blZpcnR1YWxpemVyRm9yY2VkRGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkICAgICA9IDA7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQgICAgICA9IDA7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZpcnN0Vm9sdW1lICAgICAgICAgICAgICA9IExWTV9UUlVFOwpAQCAtNTYwLDExICs1NjQsMTIgQEAKICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzID0gbWFsbG9jKE1lbVRhYi5SZWdpb25baV0uU2l6ZSk7CiAKICAgICAgICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyA9PSBMVk1fTlVMTCl7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDpMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBGYWlsZWQgdG8gYWxsb2NhdGUgJWxkIGJ5dGVzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgcmVnaW9uICV1XG4iLCBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGkgKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOkx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZCB0byBhbGxvY2F0ZSAlIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgZm9yIHJlZ2lvbiAldVxuIiwgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpICk7CiAgICAgICAgICAgICAgICAgYk1hbGxvY0ZhaWx1cmUgPSBMVk1fVFJVRTsKICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIEFMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIGFsbG9jYXRlZCAlbGQgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcFxuIiwKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBhbGxvY2F0ZWQgJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNTc2LDExICs1ODEsMTEgQEAKICAgICBpZihiTWFsbG9jRmFpbHVyZSA9PSBMVk1fVFJVRSl7CiAgICAgICAgIGZvciAoaW50IGk9MDsgaTxMVk1fTlJfTUVNT1JZX1JFR0lPTlM7IGkrKyl7CiAgICAgICAgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPT0gTFZNX05VTEwpewotICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkIHRvIGFsbG9jYXRlICVsZCBieXRlcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHJlZ2lvbiAldSBOb3QgZnJlZWluZ1xuIiwgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpICk7CisgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDpMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBGYWlsZWQgdG8gYWxsb2NhdGUgJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzIGZvciByZWdpb24gJXUgTm90IGZyZWVpbmdcbiIsIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSApOwogICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDpMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBGYWlsZWQ6IGJ1dCBhbGxvY2F0ZWQgJWxkIGJ5dGVzICIKLSAgICAgICAgICAgICAgICAgICAgICJmb3IgcmVnaW9uICV1IGF0ICVwLSBmcmVlXG4iLAorICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkOiBidXQgYWxsb2NhdGVkICUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwLSBmcmVlXG4iLAogICAgICAgICAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgZnJlZShNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CiAgICAgICAgICAgICB9CkBAIC04ODksMTYgKzg5NCwxNiBAQAogICAgIGZvciAoaW50IGk9MDsgaTxMVk1fTlJfTUVNT1JZX1JFR0lPTlM7IGkrKyl7CiAgICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLlNpemUgIT0gMCl7CiAgICAgICAgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgIT0gTlVMTCl7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlx0THZtRWZmZWN0X2ZyZWUgLSBTVEFSVCBmcmVlaW5nICVsZCBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAorICAgICAgICAgICAgICAgIEFMT0dWKCJcdEx2bUVmZmVjdF9mcmVlIC0gU1RBUlQgZnJlZWluZyAlIiBQUkl1MzIgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CiAKICAgICAgICAgICAgICAgICBmcmVlKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKIAotICAgICAgICAgICAgICAgIEFMT0dWKCJcdEx2bUVmZmVjdF9mcmVlIC0gRU5EICAgZnJlZWluZyAlbGQgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcFxuIiwKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRMdm1FZmZlY3RfZnJlZSAtIEVORCAgIGZyZWVpbmcgJSIgUFJJdTMyICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwogICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogTHZtRWZmZWN0X2ZyZWUgLSB0cnlpbmcgdG8gZnJlZSB3aXRoIE5VTEwgcG9pbnRlciAlbGQgYnl0ZXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgImZvciByZWdpb24gJXUgYXQgJXAgRVJST1JcbiIsCisgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogTHZtRWZmZWN0X2ZyZWUgLSB0cnlpbmcgdG8gZnJlZSB3aXRoIE5VTEwgcG9pbnRlciAlIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcCBFUlJPUlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xMTYzLDYgKzExNjgsMTc3IEBACiAgICAgLy9BTE9HVigiXHRWaXJ0dWFsaXplclNldFN0cmVuZ3RoIFN1Y2Nlc2Z1bGx5IGNhbGxlZCBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnNcblxuIik7CiB9ICAgIC8qIGVuZCBzZXRTdHJlbmd0aCAqLwogCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZpcnR1YWxpemVySXNEZXZpY2VTdXBwb3J0ZWQoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8gQ2hlY2sgaWYgYW4gYXVkaW8gZGV2aWNlIHR5cGUgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb24KKy8vCisvLyBJbnB1dHM6CisvLyAgZGV2aWNlVHlwZSAgIHRoZSB0eXBlIG9mIGRldmljZSB0aGF0IGFmZmVjdHMgdGhlIHByb2Nlc3NpbmcgKGUuZy4gZm9yIGJpbmF1cmFsIHZzIHRyYW5zYXVyYWwpCisvLyBPdXRwdXQ6CisvLyAgLUVJTlZBTCAgICAgIGlmIHRoZSBjb25maWd1cmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgb3IgaXQgaXMgdW5rbm93bgorLy8gIDAgICAgICAgICAgICBpZiB0aGUgY29uZmlndXJhdGlvbiBpcyBzdXBwb3J0ZWQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW50IFZpcnR1YWxpemVySXNEZXZpY2VTdXBwb3J0ZWQoYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUpIHsKKyAgICBzd2l0Y2ggKGRldmljZVR5cGUpIHsKKyAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFNFVDoKKyAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FOgorICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTOgorICAgICAgICByZXR1cm4gMDsKKyAgICBkZWZhdWx0IDoKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZpcnR1YWxpemVySXNDb25maWd1cmF0aW9uU3VwcG9ydGVkKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZToKKy8vIENoZWNrIGlmIGEgY2hhbm5lbCBtYXNrICsgYXVkaW8gZGV2aWNlIHR5cGUgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb24KKy8vCisvLyBJbnB1dHM6CisvLyAgY2hhbm5lbE1hc2sgIHRoZSBjaGFubmVsIG1hc2sgb2YgdGhlIGlucHV0IHRvIHZpcnR1YWxpemUKKy8vICBkZXZpY2VUeXBlICAgdGhlIHR5cGUgb2YgZGV2aWNlIHRoYXQgYWZmZWN0cyB0aGUgcHJvY2Vzc2luZyAoZS5nLiBmb3IgYmluYXVyYWwgdnMgdHJhbnNhdXJhbCkKKy8vIE91dHB1dDoKKy8vICAtRUlOVkFMICAgICAgaWYgdGhlIGNvbmZpZ3VyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBvciBpdCBpcyB1bmtub3duCisvLyAgMCAgICAgICAgICAgIGlmIHRoZSBjb25maWd1cmF0aW9uIGlzIHN1cHBvcnRlZAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQgVmlydHVhbGl6ZXJJc0NvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlKSB7CisgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKTsKKyAgICBpZiAoKGNoYW5uZWxDb3VudCA9PSAwKSB8fCAoY2hhbm5lbENvdW50ID4gMikpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgcmV0dXJuIFZpcnR1YWxpemVySXNEZXZpY2VTdXBwb3J0ZWQoZGV2aWNlVHlwZSk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVmlydHVhbGl6ZXJGb3JjZVZpcnR1YWxpemF0aW9uTW9kZSgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBGb3JjZSB0aGUgdmlydHVhbGl6YXRpb24gbW9kZSB0byB0aGF0IG9mIHRoZSBnaXZlbiBhdWRpbyBkZXZpY2UKKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQgICAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8gIGZvcmNlZERldmljZSB0aGUgdHlwZSBvZiBkZXZpY2Ugd2hvc2UgdmlydHVhbGl6YXRpb24gbW9kZSB3ZSdsbCBhbHdheXMgdXNlCisvLyBPdXRwdXQ6CisvLyAgLUVJTlZBTCAgICAgIGlmIHRoZSBkZXZpY2UgaXMgbm90IHN1cHBvcnRlZCBvciBpcyB1bmtub3duCisvLyAgMCAgICAgICAgICAgIGlmIHRoZSBkZXZpY2UgaXMgc3VwcG9ydGVkIGFuZCB0aGUgdmlydHVhbGl6YXRpb24gbW9kZSBmb3JjZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ludCBWaXJ0dWFsaXplckZvcmNlVmlydHVhbGl6YXRpb25Nb2RlKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCBhdWRpb19kZXZpY2VzX3QgZm9yY2VkRGV2aWNlKSB7CisgICAgQUxPR1YoIlZpcnR1YWxpemVyRm9yY2VWaXJ0dWFsaXphdGlvbk1vZGU6IGZvcmNlZERldj0weCV4IGVuYWJsZWQ9JWQgdG1wRGlzYWJsZWQ9JWQiLAorICAgICAgICAgICAgZm9yY2VkRGV2aWNlLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkLAorICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyVGVtcERpc2FibGVkKTsKKyAgICBpbnQgc3RhdHVzID0gMDsKKyAgICBib29sIHVzZVZpcnR1YWxpemVyID0gZmFsc2U7CisKKyAgICBpZiAoVmlydHVhbGl6ZXJJc0RldmljZVN1cHBvcnRlZChmb3JjZWREZXZpY2UpICE9IDApIHsKKyAgICAgICAgLy8gZm9yY2VkIGRldmljZSBpcyBub3Qgc3VwcG9ydGVkLCBtYWtlIGl0IGJlaGF2ZSBhcyBhIHJlc2V0IG9mIGZvcmNlZCBtb2RlCisgICAgICAgIGZvcmNlZERldmljZSA9IEFVRElPX0RFVklDRV9OT05FOworICAgICAgICAvLyBidXQgcmV0dXJuIGFuIGVycm9yCisgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgfQorCisgICAgaWYgKGZvcmNlZERldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAvLyBkaXNhYmxpbmcgZm9yY2VkIHZpcnR1YWxpemF0aW9uIG1vZGU6CisgICAgICAgIC8vIHZlcmlmeSB3aGV0aGVyIHRoZSB2aXJ0dWFsaXphdGlvbiBzaG91bGQgYmUgZW5hYmxlZCBvciBkaXNhYmxlZAorICAgICAgICBpZiAoVmlydHVhbGl6ZXJJc0RldmljZVN1cHBvcnRlZChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5uT3V0cHV0RGV2aWNlKSA9PSAwKSB7CisgICAgICAgICAgICB1c2VWaXJ0dWFsaXplciA9IChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkID09IExWTV9UUlVFKTsKKyAgICAgICAgfQorICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5uVmlydHVhbGl6ZXJGb3JjZWREZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBmb3JjaW5nIHZpcnR1YWxpemF0aW9uIG1vZGU6IGhlcmUgd2UgYWxyZWFkeSBrbm93IHRoZSBkZXZpY2UgaXMgc3VwcG9ydGVkCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPm5WaXJ0dWFsaXplckZvcmNlZERldmljZSA9IEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FOworICAgICAgICAvLyBvbmx5IGVuYWJsZSBmb3IgYSBzdXBwb3J0ZWQgbW9kZSwgd2hlbiB0aGUgZWZmZWN0IGlzIGVuYWJsZWQKKyAgICAgICAgdXNlVmlydHVhbGl6ZXIgPSAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCA9PSBMVk1fVFJVRSk7CisgICAgfQorCisgICAgaWYgKHVzZVZpcnR1YWxpemVyKSB7CisgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQgPT0gTFZNX1RSVUUpIHsKKyAgICAgICAgICAgIEFMT0dWKCJcdFZpcnR1YWxpemVyRm9yY2VWaXJ0dWFsaXphdGlvbk1vZGUgcmUtZW5hYmxlIExWTV9WSVJUVUFMSVpFUiIpOworICAgICAgICAgICAgYW5kcm9pZDo6THZtRWZmZWN0X2VuYWJsZShwQ29udGV4dCk7CisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQgPSBMVk1fRkFMU0U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVigiXHRWaXJ0dWFsaXplckZvcmNlVmlydHVhbGl6YXRpb25Nb2RlIGxlYXZpbmcgTFZNX1ZJUlRVQUxJWkVSIGVuYWJsZWQiKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQgPT0gTFZNX0ZBTFNFKSB7CisgICAgICAgICAgICBBTE9HVigiXHRWaXJ0dWFsaXplckZvcmNlVmlydHVhbGl6YXRpb25Nb2RlIGRpc2FibGUgTFZNX1ZJUlRVQUxJWkVSIik7CisgICAgICAgICAgICBhbmRyb2lkOjpMdm1FZmZlY3RfZGlzYWJsZShwQ29udGV4dCk7CisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQgPSBMVk1fVFJVRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dWKCJcdFZpcnR1YWxpemVyRm9yY2VWaXJ0dWFsaXphdGlvbk1vZGUgbGVhdmluZyBMVk1fVklSVFVBTElaRVIgZGlzYWJsZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCJcdGFmdGVyIFZpcnR1YWxpemVyRm9yY2VWaXJ0dWFsaXphdGlvbk1vZGU6IGVuYWJsZWQ9JWQgdG1wRGlzYWJsZWQ9JWQiLAorICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCwKKyAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplclRlbXBEaXNhYmxlZCk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWaXJ0dWFsaXplckdldFNwZWFrZXJBbmdsZXMoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8gR2V0IHRoZSB2aXJ0dWFsIHNwZWFrZXIgYW5nbGVzIGZvciBhIGNoYW5uZWwgbWFzayArIGF1ZGlvIGRldmljZSB0eXBlCisvLyBjb25maWd1cmF0aW9uIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gYmUgc3VwcG9ydGVkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb24KKy8vCisvLyBJbnB1dHM6CisvLyAgY2hhbm5lbE1hc2s6ICAgdGhlIGNoYW5uZWwgbWFzayBvZiB0aGUgaW5wdXQgdG8gdmlydHVhbGl6ZQorLy8gIGRldmljZVR5cGUgICAgIHRoZSB0eXBlIG9mIGRldmljZSB0aGF0IGFmZmVjdHMgdGhlIHByb2Nlc3NpbmcgKGUuZy4gZm9yIGJpbmF1cmFsIHZzIHRyYW5zYXVyYWwpCisvLyBJbnB1dC9PdXRwdXQ6CisvLyAgcFNwZWFrZXJBbmdsZXMgdGhlIGFycmF5IG9mIGludGVnZXIgd2hlcmUgZWFjaCBzcGVha2VyIGFuZ2xlIGlzIHdyaXR0ZW4gYXMgYSB0cmlwbGV0IGluIHRoZQorLy8gICAgICAgICAgICAgICAgIGZvbGxvd2luZyBmb3JtYXQ6CisvLyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBhIGJpdCBtYXNrIHdpdGggYSBzaW5nbGUgdmFsdWUgc2VsZWN0ZWQgZm9yIGVhY2ggc3BlYWtlciwgZm9sbG93aW5nCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29udmVudGlvbiBvZiB0aGUgYXVkaW9fY2hhbm5lbF9tYXNrX3QgdHlwZQorLy8gICAgICAgICAgICAgICAgICAgIGludDMyX3QgYSB2YWx1ZSBpbiBkZWdyZWVzIGV4cHJlc3NpbmcgdGhlIHNwZWFrZXIgYXppbXV0aCwgd2hlcmUgMCBpcyBpbiBmcm9udAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHVzZXIsIDE4MCBiZWhpbmQsIC05MCB0byB0aGUgbGVmdCwgOTAgdG8gdGhlIHJpZ2h0IG9mIHRoZSB1c2VyCisvLyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBhIHZhbHVlIGluIGRlZ3JlZXMgZXhwcmVzc2luZyB0aGUgc3BlYWtlciBlbGV2YXRpb24sIHdoZXJlIDAgaXMgdGhlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3Jpem9udGFsIHBsYW5lLCArOTAgaXMgZGlyZWN0bHkgYWJvdmUgdGhlIHVzZXIsIC05MCBiZWxvdworLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCBWaXJ0dWFsaXplckdldFNwZWFrZXJBbmdsZXMoYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgX191bnVzZWQsCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlIF9fdW51c2VkLCBpbnQzMl90ICpwU3BlYWtlckFuZ2xlcykgeworICAgIC8vIHRoZSBjaGFubmVsIGNvdW50IGlzIGd1YXJhbnRlZWQgdG8gYmUgMSBvciAyCisgICAgLy8gdGhlIGRldmljZSBpcyBndWFyYW50ZWVkIHRvIGJlIG9mIHR5cGUgaGVhZHBob25lCisgICAgLy8gdGhpcyB2aXJ0dWFsaXplciBpcyBhbHdheXMgMmluIHdpdGggc3BlYWtlcnMgYXQgLTkwIGFuZCA5MGRlZyBvZiBhemltdXRoLCAwZGVnIG9mIGVsZXZhdGlvbgorICAgICpwU3BlYWtlckFuZ2xlcysrID0gKGludDMyX3QpIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0xFRlQ7CisgICAgKnBTcGVha2VyQW5nbGVzKysgPSAtOTA7IC8vIGF6aW11dGgKKyAgICAqcFNwZWFrZXJBbmdsZXMrKyA9IDA7ICAgLy8gZWxldmF0aW9uCisgICAgKnBTcGVha2VyQW5nbGVzKysgPSAoaW50MzJfdCkgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfUklHSFQ7CisgICAgKnBTcGVha2VyQW5nbGVzKysgPSA5MDsgIC8vIGF6aW11dGgKKyAgICAqcFNwZWFrZXJBbmdsZXMgICA9IDA7ICAgLy8gZWxldmF0aW9uCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVmlydHVhbGl6ZXJHZXRWaXJ0dWFsaXphdGlvbk1vZGUoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8gUmV0cmlldmUgdGhlIGN1cnJlbnQgZGV2aWNlIHdob3NlIHByb2Nlc3NpbmcgbW9kZSBpcyB1c2VkIGJ5IHRoaXMgZWZmZWN0CisvLworLy8gT3V0cHV0OgorLy8gICBBVURJT19ERVZJQ0VfTk9ORSBpZiB0aGUgZWZmZWN0IGlzIG5vdCB2aXJ0dWFsaXppbmcKKy8vICAgb3IgdGhlIGRldmljZSB0eXBlIGlmIHRoZSBlZmZlY3QgaXMgdmlydHVhbGl6aW5nCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2F1ZGlvX2RldmljZXNfdCBWaXJ0dWFsaXplckdldFZpcnR1YWxpemF0aW9uTW9kZShFZmZlY3RDb250ZXh0ICpwQ29udGV4dCkgeworICAgIGF1ZGlvX2RldmljZXNfdCB2aXJ0RGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgaWYgKChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkID09IExWTV9UUlVFKQorICAgICAgICAgICAgJiYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplclRlbXBEaXNhYmxlZCA9PSBMVk1fRkFMU0UpKSB7CisgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5uVmlydHVhbGl6ZXJGb3JjZWREZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgIC8vIHZpcnR1YWxpemF0aW9uIG1vZGUgaXMgZm9yY2VkLCByZXR1cm4gdGhhdCBkZXZpY2UKKyAgICAgICAgICAgIHZpcnREZXZpY2UgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5uVmlydHVhbGl6ZXJGb3JjZWREZXZpY2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBubyBmb3JjZWQgbW9kZSwgcmV0dXJuIHRoZSBjdXJyZW50IGRldmljZQorICAgICAgICAgICAgdmlydERldmljZSA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPm5PdXRwdXREZXZpY2U7CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1YoIlZpcnR1YWxpemVyR2V0VmlydHVhbGl6YXRpb25Nb2RlKCkgcmV0dXJuaW5nIDB4JXgiLCB2aXJ0RGV2aWNlKTsKKyAgICByZXR1cm4gdmlydERldmljZTsKK30KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBFcXVhbGl6ZXJMaW1pdEJhbmRMZXZlbHMoKQpAQCAtMTM1Nyw3ICsxNTMzLDcgQEAKIC8vICBwTG93OiAgICAgICBsb3dlciBiYW5kIHJhbmdlCiAvLyAgcExvdzogICAgICAgdXBwZXIgYmFuZCByYW5nZQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1pbnQzMl90IEVxdWFsaXplckdldEJhbmRGcmVxUmFuZ2UoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIGludDMyX3QgYmFuZCwgdWludDMyX3QgKnBMb3csCitpbnQzMl90IEVxdWFsaXplckdldEJhbmRGcmVxUmFuZ2UoRWZmZWN0Q29udGV4dCAqcENvbnRleHQgX191bnVzZWQsIGludDMyX3QgYmFuZCwgdWludDMyX3QgKnBMb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBIaSl7CiAgICAgKnBMb3cgPSBiYW5kRnJlcVJhbmdlW2JhbmRdWzBdOwogICAgICpwSGkgID0gYmFuZEZyZXFSYW5nZVtiYW5kXVsxXTsKQEAgLTEzODEsNyArMTU1Nyw3IEBACiAvLyAgcExvdzogICAgICAgbG93ZXIgYmFuZCByYW5nZQogLy8gIHBMb3c6ICAgICAgIHVwcGVyIGJhbmQgcmFuZ2UKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaW50MzJfdCBFcXVhbGl6ZXJHZXRCYW5kKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCB1aW50MzJfdCB0YXJnZXRGcmVxKXsKK2ludDMyX3QgRXF1YWxpemVyR2V0QmFuZChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCBfX3VudXNlZCwgdWludDMyX3QgdGFyZ2V0RnJlcSl7CiAgICAgaW50IGJhbmQgPSAwOwogCiAgICAgaWYodGFyZ2V0RnJlcSA8IGJhbmRGcmVxUmFuZ2VbMF1bMF0pewpAQCAtMTc1OCw3ICsxOTM0LDcgQEAKIAogaW50IEJhc3NCb29zdF9nZXRQYXJhbWV0ZXIoRWZmZWN0Q29udGV4dCAgICAgKnBDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICpwVmFsdWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgKnBWYWx1ZVNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAqcFZhbHVlKXsKICAgICBpbnQgc3RhdHVzID0gMDsKICAgICBpbnQzMl90ICpwUGFyYW1UZW1wID0gKGludDMyX3QgKilwUGFyYW07CkBAIC0xODc2LDEyICsyMDUyLDExIEBACiAKIGludCBWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIoRWZmZWN0Q29udGV4dCAgICAgICAgKnBDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAqcFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgKnBWYWx1ZVNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICpwVmFsdWUpewogICAgIGludCBzdGF0dXMgPSAwOwogICAgIGludDMyX3QgKnBQYXJhbVRlbXAgPSAoaW50MzJfdCAqKXBQYXJhbTsKICAgICBpbnQzMl90IHBhcmFtID0gKnBQYXJhbVRlbXArKzsKLSAgICBpbnQzMl90IHBhcmFtMjsKICAgICBjaGFyICpuYW1lOwogCiAgICAgLy9BTE9HVigiXHRWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIgc3RhcnQiKTsKQEAgLTE5MDEsNyArMjA3NiwxNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YoaW50MTZfdCk7CiAgICAgICAgICAgICBicmVhazsKLQorICAgICAgICBjYXNlIFZJUlRVQUxJWkVSX1BBUkFNX1ZJUlRVQUxfU1BFQUtFUl9BTkdMRVM6CisgICAgICAgICAgICAvLyByZXR1cm4gdmFsdWUgc2l6ZSBjYW4gb25seSBiZSBpbnRlcnByZXRlZCBhcyByZWxhdGl2ZSB0byBpbnB1dCB2YWx1ZSwKKyAgICAgICAgICAgIC8vIGRlZmVycmluZyB2YWxpZGl0eSBjaGVjayB0byBiZWxvdworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVklSVFVBTElaRVJfUEFSQU1fVklSVFVBTElaQVRJT05fTU9ERToKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YodWludDMyX3QpKXsKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBWYWx1ZVNpemUgJWQiLCpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogVmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwYXJhbSAlZCIsIHBhcmFtKTsKICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwpAQCAtMTkyMiwxMyArMjEwNywzNiBAQAogICAgICAgICAgICAgLy8gICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSk7CiAgICAgICAgICAgICBicmVhazsKIAorICAgICAgICBjYXNlIFZJUlRVQUxJWkVSX1BBUkFNX1ZJUlRVQUxfU1BFQUtFUl9BTkdMRVM6IHsKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gKGF1ZGlvX2NoYW5uZWxfbWFza190KSAqcFBhcmFtVGVtcCsrOworICAgICAgICAgICAgY29uc3QgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUgPSAoYXVkaW9fZGV2aWNlc190KSAqcFBhcmFtVGVtcDsKKyAgICAgICAgICAgIHVpbnQzMl90IG5iQ2hhbm5lbHMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spOworICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgMyAqIG5iQ2hhbm5lbHMgKiBzaXplb2YoaW50MzJfdCkpeworICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFZpcnR1YWxpemVyX2dldFBhcmFtZXRlcigpIGludmFsaWQgcFZhbHVlU2l6ZSAlZCIsKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gdmVyaWZ5IHRoZSBjb25maWd1cmF0aW9uIGlzIHN1cHBvcnRlZAorICAgICAgICAgICAgc3RhdHVzID0gVmlydHVhbGl6ZXJJc0NvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoY2hhbm5lbE1hc2ssIGRldmljZVR5cGUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIlZJUlRVQUxJWkVSX1BBUkFNX1ZJUlRVQUxfU1BFQUtFUl9BTkdMRVMgc3VwcG9ydHMgbWFzaz0weCV4IGRldmljZT0weCV4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBkZXZpY2VUeXBlKTsKKyAgICAgICAgICAgICAgICAvLyBjb25maWd1cmF0aW9uIGlzIHN1cHBvcnRlZCwgZ2V0IHRoZSBhbmdsZXMKKyAgICAgICAgICAgICAgICBWaXJ0dWFsaXplckdldFNwZWFrZXJBbmdsZXMoY2hhbm5lbE1hc2ssIGRldmljZVR5cGUsIChpbnQzMl90ICopcFZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVklSVFVBTElaRVJfUEFSQU1fVklSVFVBTElaQVRJT05fTU9ERToKKyAgICAgICAgICAgICoodWludDMyX3QgKilwVmFsdWUgID0gKHVpbnQzMl90KSBWaXJ0dWFsaXplckdldFZpcnR1YWxpemF0aW9uTW9kZShwQ29udGV4dCk7CisgICAgICAgICAgICBicmVhazsKKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogVmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwYXJhbSAlZCIsIHBhcmFtKTsKICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICAvL0FMT0dWKCJcdFZpcnR1YWxpemVyX2dldFBhcmFtZXRlciBlbmQiKTsKKyAgICBBTE9HVigiXHRWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIgZW5kIHJldHVybmluZyBzdGF0dXM9JWQiLCBzdGF0dXMpOwogICAgIHJldHVybiBzdGF0dXM7CiB9IC8qIGVuZCBWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIgKi8KIApAQCAtMTk2Myw2ICsyMTcxLDE1IEBACiAgICAgICAgICAgICBWaXJ0dWFsaXplclNldFN0cmVuZ3RoKHBDb250ZXh0LCAoaW50MzJfdClzdHJlbmd0aCk7CiAgICAgICAgICAgICAvL0FMT0dWKCJcdFZpcnR1YWxpemVyX3NldFBhcmFtZXRlcigpIENhbGxlZCBwVmlydHVhbGl6ZXItPnNldFN0cmVuZ3RoIik7CiAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVklSVFVBTElaRVJfUEFSQU1fRk9SQ0VfVklSVFVBTElaQVRJT05fTU9ERTogeworICAgICAgICAgICAgY29uc3QgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUgPSAqKGF1ZGlvX2RldmljZXNfdCAqKSBwVmFsdWU7CisgICAgICAgICAgICBzdGF0dXMgPSBWaXJ0dWFsaXplckZvcmNlVmlydHVhbGl6YXRpb25Nb2RlKHBDb250ZXh0LCBkZXZpY2VUeXBlKTsKKyAgICAgICAgICAgIC8vQUxPR1YoIlZJUlRVQUxJWkVSX1BBUkFNX0ZPUkNFX1ZJUlRVQUxJWkFUSU9OX01PREUgZGV2aWNlPTB4JXggcmVzdWx0PSVkIiwKKyAgICAgICAgICAgIC8vICAgICAgICBkZXZpY2VUeXBlLCBzdGF0dXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFZpcnR1YWxpemVyX3NldFBhcmFtZXRlcigpIGludmFsaWQgcGFyYW0gJWQiLCBwYXJhbSk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTE5OTQsNyArMjIxMSw3IEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIGludCBFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKEVmZmVjdENvbnRleHQgICAgICpwQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICpwVmFsdWVTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgKnBWYWx1ZSl7CiAgICAgaW50IHN0YXR1cyA9IDA7CiAgICAgaW50IGJNdXRlID0gMDsKQEAgLTIyNTIsNyArMjQ2OSw3IEBACiAKIGludCBWb2x1bWVfZ2V0UGFyYW1ldGVyKEVmZmVjdENvbnRleHQgICAgICpwQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICpwVmFsdWVTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgKnBWYWx1ZSl7CiAgICAgaW50IHN0YXR1cyA9IDA7CiAgICAgaW50IGJNdXRlID0gMDsKQEAgLTI4MzAsNyArMzA0Nyw3IEBACiAgICAgICAgICAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCl7CiAgICAgICAgICAgICAgICAgcC0+c3RhdHVzID0gYW5kcm9pZDo6QmFzc0Jvb3N0X2dldFBhcmFtZXRlcihwQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90ICAqKSZwLT52c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwLT52c2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEgKyB2b2Zmc2V0KTsKICAgICAgICAgICAgICAgICAvL0FMT0dWKCJcdEJhc3NCb29zdF9jb21tYW5kIEVGRkVDVF9DTURfR0VUX1BBUkFNICIKICAgICAgICAgICAgICAgICAvLyAgICAgICAgIipwQ21kRGF0YSAlZCwgKnJlcGx5U2l6ZSAlZCwgKnBSZXBseURhdGEgJWQgIiwKQEAgLTI4NDEsOCArMzA1OCw4IEBACiAKICAgICAgICAgICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WSVJUVUFMSVpFUil7CiAgICAgICAgICAgICAgICAgcC0+c3RhdHVzID0gYW5kcm9pZDo6VmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyKHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcC0+ZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90ICAqKSZwLT52c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcC0+dnNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEgKyB2b2Zmc2V0KTsKIAogICAgICAgICAgICAgICAgIC8vQUxPR1YoIlx0VmlydHVhbGl6ZXJfY29tbWFuZCBFRkZFQ1RfQ01EX0dFVF9QQVJBTSAiCkBAIC0yODcwLDcgKzMwODcsNyBAQAogICAgICAgICAgICAgICAgIC8vQUxPR1YoIlx0Vm9sdW1lX2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0dFVF9QQVJBTSBzdGFydCIpOwogICAgICAgICAgICAgICAgIHAtPnN0YXR1cyA9IGFuZHJvaWQ6OlZvbHVtZV9nZXRQYXJhbWV0ZXIocENvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXAtPmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90ICAqKSZwLT52c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwLT52c2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEgKyB2b2Zmc2V0KTsKIAogICAgICAgICAgICAgICAgIC8vQUxPR1YoIlx0Vm9sdW1lX2NvbW1hbmQgRUZGRUNUX0NNRF9HRVRfUEFSQU0gIgpAQCAtMjkxOCw2ICszMTM1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSArIHAtPnBzaXplKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WSVJUVUFMSVpFUil7CisgICAgICAgICAgICAgIC8vIFdhcm5pbmcgdGhpcyBsb2cgd2lsbCBmYWlsIHRvIHByb3Blcmx5IHJlYWQgYW4gaW50MzJfdCB2YWx1ZSwgYXNzdW1lcyBpbnQxNl90CiAgICAgICAgICAgICAgIC8vQUxPR1YoIlx0VmlydHVhbGl6ZXJfY29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9QQVJBTSBwYXJhbSAlZCwgKnJlcGx5U2l6ZSAlZCwgdmFsdWUgJWQiLAogICAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQzMl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpKSwKICAgICAgICAgICAgICAgLy8gICAgICAgICpyZXBseVNpemUsCkBAIC0zMDIzLDYgKzMyNDEsNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB1aW50MzJfdCBkZXZpY2UgPSAqKHVpbnQzMl90ICopcENtZERhdGE7CisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5uT3V0cHV0RGV2aWNlID0gKGF1ZGlvX2RldmljZXNfdCkgZGV2aWNlOwogCiAgICAgICAgICAgICBpZiAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0JBU1NfQk9PU1QpIHsKICAgICAgICAgICAgICAgICBpZigoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUikgfHwKQEAgLTMwNTgsMzcgKzMyNzcsMzggQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZJUlRVQUxJWkVSKSB7Ci0gICAgICAgICAgICAgICAgaWYoKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVCl8fAotICAgICAgICAgICAgICAgICAgICAgICAgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVIpKXsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlx0RUZGRUNUX0NNRF9TRVRfREVWSUNFIGRldmljZSBpcyBpbnZhbGlkIGZvciBMVk1fVklSVFVBTElaRVIgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QgKilwQ21kRGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSB0ZW1wb3JhcnkgZGlzYWJsZSBMVk1fVklSVFVBTElaRVIiKTsKKyAgICAgICAgICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+blZpcnR1YWxpemVyRm9yY2VkRGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgY2FzZSB1bmxlc3MgY29uZmlndXJhdGlvbiBpcyBmb3JjZWQKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFuZHJvaWQ6OlZpcnR1YWxpemVySXNEZXZpY2VTdXBwb3J0ZWQoZGV2aWNlKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UgZGV2aWNlIGlzIGludmFsaWQgZm9yIExWTV9WSVJUVUFMSVpFUiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooaW50MzJfdCAqKXBDbWREYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSB0ZW1wb3JhcnkgZGlzYWJsZSBMVk1fVklSVFVBTElaRVIiKTsKIAotICAgICAgICAgICAgICAgICAgICAvL0lmIGEgZGV2aWNlIGRvZXNudCBzdXBwb3J0IHZpcnR1YWxpemVyIHRoZSBlZmZlY3QgbXVzdCBiZSB0ZW1wb3JhcmlseSBkaXNhYmxlZAotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZWZmZWN0IG11c3Qgc3RpbGwgcmVwb3J0IGl0cyBvcmlnaW5hbCBzdGF0ZSBhcyB0aGlzIGNhbiBvbmx5IGJlIGNoYW5nZWQKLSAgICAgICAgICAgICAgICAgICAgLy8gYnkgdGhlIEVOQUJMRS9ESVNBQkxFIGNvbW1hbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vSWYgYSBkZXZpY2UgZG9lc250IHN1cHBvcnQgdmlydHVhbGl6ZXIgdGhlIGVmZmVjdCBtdXN0IGJlIHRlbXBvcmFyaWx5CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXNhYmxlZCB0aGUgZWZmZWN0IG11c3Qgc3RpbGwgcmVwb3J0IGl0cyBvcmlnaW5hbCBzdGF0ZSBhcyB0aGlzIGNhbgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSBiZSBjaGFuZ2VkIGJ5IHRoZSBFTkFCTEUvRElTQUJMRSBjb21tYW5kCiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgPT0gTFZNX1RSVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSBkaXNhYmxlIExWTV9WSVJUVUFMSVpFUiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QgKilwQ21kRGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpMdm1FZmZlY3RfZGlzYWJsZShwQ29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCA9PSBMVk1fVFJVRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSBkaXNhYmxlIExWTV9WSVJUVUFMSVpFUiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QgKilwQ21kRGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6THZtRWZmZWN0X2Rpc2FibGUocENvbnRleHQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyVGVtcERpc2FibGVkID0gTFZNX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UgZGV2aWNlIGlzIHZhbGlkIGZvciBMVk1fVklSVFVBTElaRVIgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QgKilwQ21kRGF0YSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGEgZGV2aWNlIHN1cHBvcnRzIHZpcnR1YWxpemVyIGFuZCB0aGUgZWZmZWN0IGhhcyBiZWVuIHRlbXBvcmFyaWx5CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXNhYmxlZCBwcmV2aW91c2x5IHRoZW4gcmUtZW5hYmxlIGl0CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgPT0gTFZNX1RSVUUpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSByZS1lbmFibGUgTFZNX1ZJUlRVQUxJWkVSICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooaW50MzJfdCAqKXBDbWREYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpMdm1FZmZlY3RfZW5hYmxlKHBDb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplclRlbXBEaXNhYmxlZCA9IExWTV9GQUxTRTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQgPSBMVk1fVFJVRTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UgZGV2aWNlIGlzIHZhbGlkIGZvciBMVk1fVklSVFVBTElaRVIgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QgKilwQ21kRGF0YSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgYSBkZXZpY2Ugc3VwcG9ydHMgdmlydHVhbGl6ZXIgYW5kIHRoZSBlZmZlY3QgaGFzIGJlZW4gdGVtcG9yYXJpbHkgZGlzYWJsZWQKLSAgICAgICAgICAgICAgICAgICAgLy8gcHJldmlvdXNseSB0aGVuIHJlLWVuYWJsZSBpdAotCi0gICAgICAgICAgICAgICAgICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgPT0gTFZNX1RSVUUpewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlx0RUZGRUNUX0NNRF9TRVRfREVWSUNFIHJlLWVuYWJsZSBMVk1fVklSVFVBTElaRVIgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQzMl90ICopcENtZERhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6THZtRWZmZWN0X2VuYWJsZShwQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyVGVtcERpc2FibGVkID0gTFZNX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IC8vIGVsc2UgdmlydHVhbGl6YXRpb24gbW9kZSBpcyBmb3JjZWQgdG8gYSBjZXJ0YWluIGRldmljZSwgbm90aGluZyB0byBkbwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UgZW5kIik7CiAgICAgICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmgKaW5kZXggMzMwYmIzMi4uNDIwZjk3MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmgKQEAgLTczLDYgKzczLDggQEAKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJCYXNzVGVtcERpc2FibGVkOyAgICAgICAgLyogRmxhZyBmb3IgQmFzcyB0byBiZSByZS1lbmFibGVkICovCiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVmlydHVhbGl6ZXJFbmFibGVkOyAgICAgIC8qIEZsYWcgZm9yIFZpcnR1YWxpemVyICovCiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQ7IC8qIEZsYWcgZm9yIGVmZmVjdCB0byBiZSByZS1lbmFibGVkICovCisgICAgYXVkaW9fZGV2aWNlc190ICAgICAgICAgICAgICAgICBuT3V0cHV0RGV2aWNlOyAgICAgICAgICAgIC8qIE91dHB1dCBkZXZpY2UgZm9yIHRoZSBlZmZlY3QgKi8KKyAgICBhdWRpb19kZXZpY2VzX3QgICAgICAgICAgICAgICAgIG5WaXJ0dWFsaXplckZvcmNlZERldmljZTsgLyogRm9yY2VkIGRldmljZSB2aXJ0dWFsaXphdGlvbiBtb2RlKi8KICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlckVmZmVjdHNFbmFibGVkOyAgICAgLyogRWZmZWN0cyBpbiB0aGlzIHNlc3Npb24gKi8KICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlckVmZmVjdHNDYWxsZWQ7ICAgICAgLyogRWZmZWN0cyBjYWxsZWQgc28gZmFyICovCiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFZvbHVtZTsgICAgICAgICAgICAgIC8qIE5vIHNtb290aGluZyBvbiBmaXJzdCBWb2wgY2hhbmdlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcAppbmRleCBhNzk2ZDJmLi40ZGM4YjQ1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAKQEAgLTE5LDExICsxOSwxMyBAQAogI2RlZmluZSBBUlJBWV9TSVpFKGFycmF5KSAoc2l6ZW9mIGFycmF5IC8gc2l6ZW9mIGFycmF5WzBdKQogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCi0jaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgogI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bmV3PgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPG5ldz4KKworI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KICNpbmNsdWRlICJFZmZlY3RSZXZlcmIuaCIKIC8vIGZyb20gUmV2ZXJiL2xpYgogI2luY2x1ZGUgIkxWUkVWLmgiCkBAIC0xODEsNyArMTgzLDcgQEAKIGludCAgUmV2ZXJiX3NldFBhcmFtZXRlciAgICAoUmV2ZXJiQ29udGV4dCAqcENvbnRleHQsIHZvaWQgKnBQYXJhbSwgdm9pZCAqcFZhbHVlKTsKIGludCAgUmV2ZXJiX2dldFBhcmFtZXRlciAgICAoUmV2ZXJiQ29udGV4dCAqcENvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAqcFZhbHVlU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFZhbHVlKTsKIGludCBSZXZlcmJfTG9hZFByZXNldCAgICAgICAoUmV2ZXJiQ29udGV4dCAgICpwQ29udGV4dCk7CiAKQEAgLTI2OSw3ICsyNzEsNyBAQAogICAgIHBDb250ZXh0LT5JbkZyYW1lczMyICA9IChMVk1fSU5UMzIgKiltYWxsb2MoTFZSRVZfTUFYX0ZSQU1FX1NJWkUgKiBzaXplb2YoTFZNX0lOVDMyKSAqIDIpOwogICAgIHBDb250ZXh0LT5PdXRGcmFtZXMzMiA9IChMVk1fSU5UMzIgKiltYWxsb2MoTFZSRVZfTUFYX0ZSQU1FX1NJWkUgKiBzaXplb2YoTFZNX0lOVDMyKSAqIDIpOwogCi0gICAgQUxPR1YoIlx0RWZmZWN0Q3JlYXRlICVwLCBzaXplICVkIiwgcENvbnRleHQsIHNpemVvZihSZXZlcmJDb250ZXh0KSk7CisgICAgQUxPR1YoIlx0RWZmZWN0Q3JlYXRlICVwLCBzaXplICV6dSIsIHBDb250ZXh0LCBzaXplb2YoUmV2ZXJiQ29udGV4dCkpOwogICAgIEFMT0dWKCJcdEVmZmVjdENyZWF0ZSBlbmRcbiIpOwogICAgIHJldHVybiAwOwogfSAvKiBlbmQgRWZmZWN0Q3JlYXRlICovCkBAIC01NzAsMTUgKzU3MiwxNSBAQAogICAgIGZvciAoaW50IGk9MDsgaTxMVk1fTlJfTUVNT1JZX1JFR0lPTlM7IGkrKyl7CiAgICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLlNpemUgIT0gMCl7CiAgICAgICAgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgIT0gTlVMTCl7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlx0ZnJlZSgpIC0gU1RBUlQgZnJlZWluZyAlbGQgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcFxuIiwKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRmcmVlKCkgLSBTVEFSVCBmcmVlaW5nICUiIFBSSXUzMiAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKIAogICAgICAgICAgICAgICAgIGZyZWUoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwogCi0gICAgICAgICAgICAgICAgQUxPR1YoIlx0ZnJlZSgpIC0gRU5EICAgZnJlZWluZyAlbGQgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcFxuIiwKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRmcmVlKCkgLSBFTkQgICBmcmVlaW5nICUiIFBSSXUzMiAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IGZyZWUoKSAtIHRyeWluZyB0byBmcmVlIHdpdGggTlVMTCBwb2ludGVyICVsZCBieXRlcyAiCisgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogZnJlZSgpIC0gdHJ5aW5nIHRvIGZyZWUgd2l0aCBOVUxMIHBvaW50ZXIgJSIgUFJJdTMyICIgYnl0ZXMgIgogICAgICAgICAgICAgICAgICAgICAgICAgImZvciByZWdpb24gJXUgYXQgJXAgRVJST1JcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKICAgICAgICAgICAgIH0KQEAgLTc3MSwxMSArNzczLDEyIEBACiAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyA9IG1hbGxvYyhNZW1UYWIuUmVnaW9uW2ldLlNpemUpOwogCiAgICAgICAgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPT0gTFZNX05VTEwpewotICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWUkVWX0VSUk9SIDpSZXZlcmJfaW5pdCBDcmVhdGVJbnN0YW5jZSBGYWlsZWQgdG8gYWxsb2NhdGUgJWxkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJieXRlcyBmb3IgcmVnaW9uICV1XG4iLCBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGkgKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRMVlJFVl9FUlJPUiA6UmV2ZXJiX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkIHRvIGFsbG9jYXRlICUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1XG4iLCBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGkgKTsKICAgICAgICAgICAgICAgICBiTWFsbG9jRmFpbHVyZSA9IExWTV9UUlVFOwogICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlx0UmV2ZXJiX2luaXQgQ3JlYXRlSW5zdGFuY2UgYWxsb2NhdGUgJWxkIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCisgICAgICAgICAgICAgICAgQUxPR1YoIlx0UmV2ZXJiX2luaXQgQ3JlYXRlSW5zdGFuY2UgYWxsb2NhdGUgJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNzg3LDExICs3OTAsMTEgQEAKICAgICBpZihiTWFsbG9jRmFpbHVyZSA9PSBMVk1fVFJVRSl7CiAgICAgICAgIGZvciAoaW50IGk9MDsgaTxMVk1fTlJfTUVNT1JZX1JFR0lPTlM7IGkrKyl7CiAgICAgICAgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPT0gTFZNX05VTEwpewotICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6UmV2ZXJiX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkIHRvIGFsbG9jYXRlICVsZCBieXRlcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHJlZ2lvbiAldSAtIE5vdCBmcmVlaW5nXG4iLCBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGkgKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOlJldmVyYl9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZCB0byBhbGxvY2F0ZSAlIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSAtIE5vdCBmcmVlaW5nXG4iLCBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGkgKTsKICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6UmV2ZXJiX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkOiBidXQgYWxsb2NhdGVkICVsZCBieXRlcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHJlZ2lvbiAldSBhdCAlcC0gZnJlZVxuIiwKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOlJldmVyYl9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZDogYnV0IGFsbG9jYXRlZCAlIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcC0gZnJlZVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwogICAgICAgICAgICAgICAgIGZyZWUoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwogICAgICAgICAgICAgfQpAQCAtMTUzNCw3ICsxNTM3LDcgQEAKIAogaW50IFJldmVyYl9nZXRQYXJhbWV0ZXIoUmV2ZXJiQ29udGV4dCAqcENvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICpwVmFsdWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAqcFZhbHVlU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBWYWx1ZSl7CiAgICAgaW50IHN0YXR1cyA9IDA7CiAgICAgaW50MzJfdCAqcFBhcmFtVGVtcCA9IChpbnQzMl90ICopcFBhcmFtOwpAQCAtMTk3NCw3ICsxOTc3LDcgQEAKIAogICAgICAgICAgICAgcC0+c3RhdHVzID0gYW5kcm9pZDo6UmV2ZXJiX2dldFBhcmFtZXRlcihwQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcC0+ZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QgICopJnAtPnZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwLT52c2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhICsgdm9mZnNldCk7CiAKICAgICAgICAgICAgICpyZXBseVNpemUgPSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgdm9mZnNldCArIHAtPnZzaXplOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL0FuZHJvaWQubWsgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvQW5kcm9pZC5tawppbmRleCA5ZThjYjgzLi5lYTNjNTlkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvQW5kcm9pZC5tawpAQCAtMjQsMTIgKzI0LDcgQEAKICAgICBsaWJ1dGlscyBcCiAgICAgbGlibG9nCiAKLWlmZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKLUxPQ0FMX0xETElCUyArPSAtbGRsCi1lbHNlCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmRsCi1lbmRpZgotCiBMT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbgogCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvUHJlUHJvY2Vzc2luZy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvUHJlUHJvY2Vzc2luZy5jcHAKaW5kZXggYmU0ZmE3ZS4uNmRkNDQzOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL1ByZVByb2Nlc3NpbmcuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9QcmVQcm9jZXNzaW5nLmNwcApAQCAtNzcsNyArNzcsNyBAQAogICAgIHZvaWQgKCogZW5hYmxlKShwcmVwcm9jX2VmZmVjdF90ICpmeCk7CiAgICAgdm9pZCAoKiBkaXNhYmxlKShwcmVwcm9jX2VmZmVjdF90ICpmeCk7CiAgICAgaW50ICgqIHNldF9wYXJhbWV0ZXIpKHByZXByb2NfZWZmZWN0X3QgKmZ4LCB2b2lkICpwYXJhbSwgdm9pZCAqdmFsdWUpOwotICAgIGludCAoKiBnZXRfcGFyYW1ldGVyKShwcmVwcm9jX2VmZmVjdF90ICpmeCwgdm9pZCAqcGFyYW0sIHNpemVfdCAqc2l6ZSwgdm9pZCAqdmFsdWUpOworICAgIGludCAoKiBnZXRfcGFyYW1ldGVyKShwcmVwcm9jX2VmZmVjdF90ICpmeCwgdm9pZCAqcGFyYW0sIHVpbnQzMl90ICpzaXplLCB2b2lkICp2YWx1ZSk7CiAgICAgaW50ICgqIHNldF9kZXZpY2UpKHByZXByb2NfZWZmZWN0X3QgKmZ4LCB1aW50MzJfdCBkZXZpY2UpOwogfTsKIApAQCAtMjkxLDcgKzI5MSw3IEBACiAKIGludCBBZ2NHZXRQYXJhbWV0ZXIocHJlcHJvY19lZmZlY3RfdCAqZWZmZWN0LAogICAgICAgICAgICAgICAgICAgICB2b2lkICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgIHNpemVfdCAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBWYWx1ZVNpemUsCiAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBWYWx1ZSkKIHsKICAgICBpbnQgc3RhdHVzID0gMDsKQEAgLTQ1Miw5ICs0NTIsOSBAQAogICAgIHJldHVybiAwOwogfQogCi1pbnQgQWVjR2V0UGFyYW1ldGVyKHByZXByb2NfZWZmZWN0X3QgICAgICplZmZlY3QsCitpbnQgQWVjR2V0UGFyYW1ldGVyKHByZXByb2NfZWZmZWN0X3QgICplZmZlY3QsCiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICpwVmFsdWVTaXplLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAqcFZhbHVlU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgKnBWYWx1ZSkKIHsKICAgICBpbnQgc3RhdHVzID0gMDsKQEAgLTg4MSw4ICs4ODEsOCBAQAogaW50IFNlc3Npb25fU2V0Q29uZmlnKHByZXByb2Nfc2Vzc2lvbl90ICpzZXNzaW9uLCBlZmZlY3RfY29uZmlnX3QgKmNvbmZpZykKIHsKICAgICB1aW50MzJfdCBzcjsKLSAgICB1aW50MzJfdCBpbkNubCA9IHBvcGNvdW50KGNvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMpOwotICAgIHVpbnQzMl90IG91dENubCA9IHBvcGNvdW50KGNvbmZpZy0+b3V0cHV0Q2ZnLmNoYW5uZWxzKTsKKyAgICB1aW50MzJfdCBpbkNubCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKTsKKyAgICB1aW50MzJfdCBvdXRDbmwgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY29uZmlnLT5vdXRwdXRDZmcuY2hhbm5lbHMpOwogCiAgICAgaWYgKGNvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlICE9IGNvbmZpZy0+b3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSB8fAogICAgICAgICBjb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBjb25maWctPm91dHB1dENmZy5mb3JtYXQgfHwKQEAgLTEwMzcsNyArMTAzNyw3IEBACiAgICAgICAgICAgICBjb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgewogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9Ci0gICAgdWludDMyX3QgaW5DbmwgPSBwb3Bjb3VudChjb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKTsKKyAgICB1aW50MzJfdCBpbkNubCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKTsKICAgICBpbnQgc3RhdHVzID0gc2Vzc2lvbi0+YXBtLT5zZXRfbnVtX3JldmVyc2VfY2hhbm5lbHMoaW5DbmwpOwogICAgIGlmIChzdGF0dXMgPCAwKSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwpAQCAtMTIzNSw4ICsxMjM1LDggQEAKICAgICAgICAgICAgIGlmIChzZXNzaW9uLT5mcmFtZXNJbiA8IHNlc3Npb24tPmZyYW1lQ291bnQpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNpemVfdCBmckluID0gc2Vzc2lvbi0+ZnJhbWVzSW47Ci0gICAgICAgICAgICBzaXplX3QgZnJPdXQgPSBzZXNzaW9uLT5hcG1GcmFtZUNvdW50OworICAgICAgICAgICAgc3B4X3VpbnQzMl90IGZySW4gPSBzZXNzaW9uLT5mcmFtZXNJbjsKKyAgICAgICAgICAgIHNweF91aW50MzJfdCBmck91dCA9IHNlc3Npb24tPmFwbUZyYW1lQ291bnQ7CiAgICAgICAgICAgICBpZiAoc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQgPT0gMSkgewogICAgICAgICAgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9wcm9jZXNzX2ludChzZXNzaW9uLT5pblJlc2FtcGxlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKQEAgLTEyOTIsOCArMTI5Miw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoc2Vzc2lvbi0+b3V0UmVzYW1wbGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHNpemVfdCBmckluID0gc2Vzc2lvbi0+YXBtRnJhbWVDb3VudDsKLSAgICAgICAgICAgIHNpemVfdCBmck91dCA9IHNlc3Npb24tPmZyYW1lQ291bnQ7CisgICAgICAgICAgICBzcHhfdWludDMyX3QgZnJJbiA9IHNlc3Npb24tPmFwbUZyYW1lQ291bnQ7CisgICAgICAgICAgICBzcHhfdWludDMyX3QgZnJPdXQgPSBzZXNzaW9uLT5mcmFtZUNvdW50OwogICAgICAgICAgICAgaWYgKHNlc3Npb24tPmluQ2hhbm5lbENvdW50ID09IDEpIHsKICAgICAgICAgICAgICAgICBzcGVleF9yZXNhbXBsZXJfcHJvY2Vzc19pbnQoc2Vzc2lvbi0+b3V0UmVzYW1wbGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKQEAgLTE0NTYsNyArMTQ1Niw3IEBACiAKICAgICAgICAgICAgIGlmIChlZmZlY3QtPm9wcy0+Z2V0X3BhcmFtZXRlcikgewogICAgICAgICAgICAgICAgIHAtPnN0YXR1cyA9IGVmZmVjdC0+b3BzLT5nZXRfcGFyYW1ldGVyKGVmZmVjdCwgcC0+ZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90ICAqKSZwLT52c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcC0+dnNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSArIHZvZmZzZXQpOwogICAgICAgICAgICAgICAgICpyZXBseVNpemUgPSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgdm9mZnNldCArIHAtPnZzaXplOwogICAgICAgICAgICAgfQpAQCAtMTc1Nyw4ICsxNzU3LDggQEAKICAgICAgICAgICAgIGlmIChzZXNzaW9uLT5mcmFtZXNSZXYgPCBzZXNzaW9uLT5mcmFtZUNvdW50KSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzaXplX3QgZnJJbiA9IHNlc3Npb24tPmZyYW1lc1JldjsKLSAgICAgICAgICAgIHNpemVfdCBmck91dCA9IHNlc3Npb24tPmFwbUZyYW1lQ291bnQ7CisgICAgICAgICAgICBzcHhfdWludDMyX3QgZnJJbiA9IHNlc3Npb24tPmZyYW1lc1JldjsKKyAgICAgICAgICAgIHNweF91aW50MzJfdCBmck91dCA9IHNlc3Npb24tPmFwbUZyYW1lQ291bnQ7CiAgICAgICAgICAgICBpZiAoc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQgPT0gMSkgewogICAgICAgICAgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9wcm9jZXNzX2ludChzZXNzaW9uLT5yZXZSZXNhbXBsZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdEVxdWFsaXplci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdEVxdWFsaXplci5jcHAKaW5kZXggOGQwMDIwNi4uM2NiMTNmMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RFcXVhbGl6ZXIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0RXF1YWxpemVyLmNwcApAQCAtMTE1LDcgKzExNSw3IEBACiAKIGludCBFcXVhbGl6ZXJfaW5pdChFcXVhbGl6ZXJDb250ZXh0ICpwQ29udGV4dCk7CiBpbnQgRXF1YWxpemVyX3NldENvbmZpZyhFcXVhbGl6ZXJDb250ZXh0ICpwQ29udGV4dCwgZWZmZWN0X2NvbmZpZ190ICpwQ29uZmlnKTsKLWludCBFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKEF1ZGlvRXF1YWxpemVyICogcEVxdWFsaXplciwgaW50MzJfdCAqcFBhcmFtLCBzaXplX3QgKnBWYWx1ZVNpemUsIHZvaWQgKnBWYWx1ZSk7CitpbnQgRXF1YWxpemVyX2dldFBhcmFtZXRlcihBdWRpb0VxdWFsaXplciAqIHBFcXVhbGl6ZXIsIGludDMyX3QgKnBQYXJhbSwgdWludDMyX3QgKnBWYWx1ZVNpemUsIHZvaWQgKnBWYWx1ZSk7CiBpbnQgRXF1YWxpemVyX3NldFBhcmFtZXRlcihBdWRpb0VxdWFsaXplciAqIHBFcXVhbGl6ZXIsIGludDMyX3QgKnBQYXJhbSwgdm9pZCAqcFZhbHVlKTsKIAogCkBAIC0zNjAsNyArMzYwLDcgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotaW50IEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoQXVkaW9FcXVhbGl6ZXIgKiBwRXF1YWxpemVyLCBpbnQzMl90ICpwUGFyYW0sIHNpemVfdCAqcFZhbHVlU2l6ZSwgdm9pZCAqcFZhbHVlKQoraW50IEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoQXVkaW9FcXVhbGl6ZXIgKiBwRXF1YWxpemVyLCBpbnQzMl90ICpwUGFyYW0sIHVpbnQzMl90ICpwVmFsdWVTaXplLCB2b2lkICpwVmFsdWUpCiB7CiAgICAgaW50IHN0YXR1cyA9IDA7CiAgICAgaW50MzJfdCBwYXJhbSA9ICpwUGFyYW0rKzsKQEAgLTY2Miw4ICs2NjIsOCBAQAogICAgICAgICBFcXVhbGl6ZXJfc2V0Q29uZmlnKHBDb250ZXh0LCAmcENvbnRleHQtPmNvbmZpZyk7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgRUZGRUNUX0NNRF9HRVRfUEFSQU06IHsKLSAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSA8IChpbnQpKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpIHx8Ci0gICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSA8IChpbnQpIChzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKSkgeworICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplIDwgKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpIHx8CisgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSA8IChzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKSkgewogICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgIH0KICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnAgPSAoZWZmZWN0X3BhcmFtX3QgKilwQ21kRGF0YTsKQEAgLTY4Miw3ICs2ODIsNyBAQAogICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfUEFSQU06IHsKICAgICAgICAgQUxPR1YoIkVxdWFsaXplcl9jb21tYW5kIEVGRkVDVF9DTURfU0VUX1BBUkFNIGNtZFNpemUgJWQgcENtZERhdGEgJXAsICpyZXBseVNpemUgJWQsIHBSZXBseURhdGEgJXAiLAogICAgICAgICAgICAgIGNtZFNpemUsIHBDbWREYXRhLCAqcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKLSAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSA8IChpbnQpKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpIHx8CisgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgPCAoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSkgfHwKICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSkgewogICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0UmV2ZXJiLmMgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdFJldmVyYi5jCmluZGV4IGMzN2YzOTIuLmYwNTZkMTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0UmV2ZXJiLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RSZXZlcmIuYwpAQCAtNzUwLDcgKzc1MCw3IEBACiAgKgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KLWludCBSZXZlcmJfZ2V0UGFyYW1ldGVyKHJldmVyYl9vYmplY3RfdCAqcFJldmVyYiwgaW50MzJfdCBwYXJhbSwgc2l6ZV90ICpwU2l6ZSwKK2ludCBSZXZlcmJfZ2V0UGFyYW1ldGVyKHJldmVyYl9vYmplY3RfdCAqcFJldmVyYiwgaW50MzJfdCBwYXJhbSwgdWludDMyX3QgKnBTaXplLAogICAgICAgICB2b2lkICpwVmFsdWUpIHsKICAgICBpbnQzMl90ICpwVmFsdWUzMjsKICAgICBpbnQxNl90ICpwVmFsdWUxNjsKQEAgLTc1OCw3ICs3NTgsNyBAQAogICAgIGludDMyX3QgaTsKICAgICBpbnQzMl90IHRlbXA7CiAgICAgaW50MzJfdCB0ZW1wMjsKLSAgICBzaXplX3Qgc2l6ZTsKKyAgICB1aW50MzJfdCBzaXplOwogCiAgICAgaWYgKHBSZXZlcmItPm1fUHJlc2V0KSB7CiAgICAgICAgIGlmIChwYXJhbSAhPSBSRVZFUkJfUEFSQU1fUFJFU0VUIHx8ICpwU2l6ZSA8IHNpemVvZihpbnQxNl90KSkgewpAQCAtMTAzMyw3ICsxMDMzLDcgQEAKICAqCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwotaW50IFJldmVyYl9zZXRQYXJhbWV0ZXIocmV2ZXJiX29iamVjdF90ICpwUmV2ZXJiLCBpbnQzMl90IHBhcmFtLCBzaXplX3Qgc2l6ZSwKK2ludCBSZXZlcmJfc2V0UGFyYW1ldGVyKHJldmVyYl9vYmplY3RfdCAqcFJldmVyYiwgaW50MzJfdCBwYXJhbSwgdWludDMyX3Qgc2l6ZSwKICAgICAgICAgdm9pZCAqcFZhbHVlKSB7CiAgICAgaW50MzJfdCB2YWx1ZTMyOwogICAgIGludDE2X3QgdmFsdWUxNjsKQEAgLTEwNDQsNyArMTA0NCw3IEBACiAgICAgcmV2ZXJiX3ByZXNldF90ICpwUHJlc2V0OwogICAgIGludCBtYXhTYW1wbGVzOwogICAgIGludDMyX3QgYXZlcmFnZURlbGF5OwotICAgIHNpemVfdCBwYXJhbVNpemU7CisgICAgdWludDMyX3QgcGFyYW1TaXplOwogCiAgICAgQUxPR1YoIlJldmVyYl9zZXRQYXJhbWV0ZXIsIGNvbnRleHQgJXAsIHBhcmFtICVkLCB2YWx1ZTE2ICVkLCB2YWx1ZTMyICVkIiwKICAgICAgICAgICAgIHBSZXZlcmIsIHBhcmFtLCAqKGludDE2X3QgKilwVmFsdWUsICooaW50MzJfdCAqKXBWYWx1ZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdFJldmVyYi5oIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RSZXZlcmIuaAppbmRleCBlNTI0OGZlLi43NTZjNWVhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdFJldmVyYi5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0UmV2ZXJiLmgKQEAgLTMzMCw4ICszMzAsOCBAQAogdm9pZCBSZXZlcmJfZ2V0Q29uZmlnKHJldmVyYl9tb2R1bGVfdCAqcFJ2Yk1vZHVsZSwgZWZmZWN0X2NvbmZpZ190ICpwQ29uZmlnKTsKIHZvaWQgUmV2ZXJiX1Jlc2V0KHJldmVyYl9vYmplY3RfdCAqcFJldmVyYiwgYm9vbCBpbml0KTsKIAotaW50IFJldmVyYl9zZXRQYXJhbWV0ZXIgKHJldmVyYl9vYmplY3RfdCAqcFJldmVyYiwgaW50MzJfdCBwYXJhbSwgc2l6ZV90IHNpemUsIHZvaWQgKnBWYWx1ZSk7Ci1pbnQgUmV2ZXJiX2dldFBhcmFtZXRlcihyZXZlcmJfb2JqZWN0X3QgKnBSZXZlcmIsIGludDMyX3QgcGFyYW0sIHNpemVfdCAqcFNpemUsIHZvaWQgKnBWYWx1ZSk7CitpbnQgUmV2ZXJiX3NldFBhcmFtZXRlciAocmV2ZXJiX29iamVjdF90ICpwUmV2ZXJiLCBpbnQzMl90IHBhcmFtLCB1aW50MzJfdCBzaXplLCB2b2lkICpwVmFsdWUpOworaW50IFJldmVyYl9nZXRQYXJhbWV0ZXIocmV2ZXJiX29iamVjdF90ICpwUmV2ZXJiLCBpbnQzMl90IHBhcmFtLCB1aW50MzJfdCAqcFNpemUsIHZvaWQgKnBWYWx1ZSk7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogUmV2ZXJiVXBkYXRlWGZhZGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9BbmRyb2lkLm1rIGIvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsKaW5kZXggZGQyZDMwNi4uYzkyYzU0MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsKQEAgLTE3LDcgKzE3LDYgQEAKIExPQ0FMX01PRFVMRTo9IGxpYnZpc3VhbGl6ZXIKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0JJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGdyYXBoaWNzIGNvcmVjZykgXAogCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby1lZmZlY3RzKQogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9FZmZlY3RWaXN1YWxpemVyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9FZmZlY3RWaXN1YWxpemVyLmNwcAppbmRleCA0YjMxOGMwLi4wYzMxMGM1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvRWZmZWN0VmlzdWFsaXplci5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0VmZmVjdFZpc3VhbGl6ZXIuY3BwCkBAIC0xNiw4ICsxNiw5IEBACiAKICNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0VmlzdWFsaXplciIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgogI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8bmV3PgpAQCAtMjA2LDcgKzIwNyw4IEBACiAgICAgcENvbnRleHQtPm1TY2FsaW5nTW9kZSA9IFZJU1VBTElaRVJfU0NBTElOR19NT0RFX05PUk1BTElaRUQ7CiAKICAgICAvLyBtZWFzdXJlbWVudCBpbml0aWFsaXphdGlvbgotICAgIHBDb250ZXh0LT5tQ2hhbm5lbENvdW50ID0gcG9wY291bnQocENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuY2hhbm5lbHMpOworICAgIHBDb250ZXh0LT5tQ2hhbm5lbENvdW50ID0KKyAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5jaGFubmVscyk7CiAgICAgcENvbnRleHQtPm1NZWFzdXJlbWVudE1vZGUgPSBNRUFTVVJFTUVOVF9NT0RFX05PTkU7CiAgICAgcENvbnRleHQtPm1NZWFzdXJlbWVudFdpbmRvd1NpemVJbkJ1ZmZlcnMgPSBNRUFTVVJFTUVOVF9XSU5ET1dfTUFYX1NJWkVfSU5fQlVGRkVSUzsKICAgICBwQ29udGV4dC0+bU1lYXN1cmVtZW50QnVmZmVySWR4ID0gMDsKQEAgLTIyNiw4ICsyMjgsOCBAQAogLy8KIAogaW50IFZpc3VhbGl6ZXJMaWJfQ3JlYXRlKGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpb0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgLypzZXNzaW9uSWQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IC8qaW9JZCovLAogICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9oYW5kbGVfdCAqcEhhbmRsZSkgewogICAgIGludCByZXQ7CiAgICAgaW50IGk7CkBAIC00MTgsNyArNDIwLDcgQEAKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCi0vLyAgICBBTE9HVigiVmlzdWFsaXplcl9jb21tYW5kIGNvbW1hbmQgJWQgY21kU2l6ZSAlZCIsY21kQ29kZSwgY21kU2l6ZSk7CisvLyAgICBBTE9HVigiVmlzdWFsaXplcl9jb21tYW5kIGNvbW1hbmQgJSIgUFJJdTMyICIgY21kU2l6ZSAlIiBQUkl1MzIsIGNtZENvZGUsIGNtZFNpemUpOwogCiAgICAgc3dpdGNoIChjbWRDb2RlKSB7CiAgICAgY2FzZSBFRkZFQ1RfQ01EX0lOSVQ6CkBAIC00ODQsMTkgKzQ4NiwxOSBAQAogICAgICAgICB9CiAgICAgICAgIHN3aXRjaCAoKih1aW50MzJfdCAqKXAtPmRhdGEpIHsKICAgICAgICAgY2FzZSBWSVNVQUxJWkVSX1BBUkFNX0NBUFRVUkVfU0laRToKLSAgICAgICAgICAgIEFMT0dWKCJnZXQgbUNhcHR1cmVTaXplID0gJWQiLCBwQ29udGV4dC0+bUNhcHR1cmVTaXplKTsKKyAgICAgICAgICAgIEFMT0dWKCJnZXQgbUNhcHR1cmVTaXplID0gJSIgUFJJdTMyLCBwQ29udGV4dC0+bUNhcHR1cmVTaXplKTsKICAgICAgICAgICAgICooKHVpbnQzMl90ICopcC0+ZGF0YSArIDEpID0gcENvbnRleHQtPm1DYXB0dXJlU2l6ZTsKICAgICAgICAgICAgIHAtPnZzaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKICAgICAgICAgICAgICpyZXBseVNpemUgKz0gc2l6ZW9mKHVpbnQzMl90KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFZJU1VBTElaRVJfUEFSQU1fU0NBTElOR19NT0RFOgotICAgICAgICAgICAgQUxPR1YoImdldCBtU2NhbGluZ01vZGUgPSAlZCIsIHBDb250ZXh0LT5tU2NhbGluZ01vZGUpOworICAgICAgICAgICAgQUxPR1YoImdldCBtU2NhbGluZ01vZGUgPSAlIiBQUkl1MzIsIHBDb250ZXh0LT5tU2NhbGluZ01vZGUpOwogICAgICAgICAgICAgKigodWludDMyX3QgKilwLT5kYXRhICsgMSkgPSBwQ29udGV4dC0+bVNjYWxpbmdNb2RlOwogICAgICAgICAgICAgcC0+dnNpemUgPSBzaXplb2YodWludDMyX3QpOwogICAgICAgICAgICAgKnJlcGx5U2l6ZSArPSBzaXplb2YodWludDMyX3QpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgVklTVUFMSVpFUl9QQVJBTV9NRUFTVVJFTUVOVF9NT0RFOgotICAgICAgICAgICAgQUxPR1YoImdldCBtTWVhc3VyZW1lbnRNb2RlID0gJWQiLCBwQ29udGV4dC0+bU1lYXN1cmVtZW50TW9kZSk7CisgICAgICAgICAgICBBTE9HVigiZ2V0IG1NZWFzdXJlbWVudE1vZGUgPSAlIiBQUkl1MzIsIHBDb250ZXh0LT5tTWVhc3VyZW1lbnRNb2RlKTsKICAgICAgICAgICAgICooKHVpbnQzMl90ICopcC0+ZGF0YSArIDEpID0gcENvbnRleHQtPm1NZWFzdXJlbWVudE1vZGU7CiAgICAgICAgICAgICBwLT52c2l6ZSA9IHNpemVvZih1aW50MzJfdCk7CiAgICAgICAgICAgICAqcmVwbHlTaXplICs9IHNpemVvZih1aW50MzJfdCk7CkBAIC01MjAsMTkgKzUyMiwxOSBAQAogICAgICAgICBzd2l0Y2ggKCoodWludDMyX3QgKilwLT5kYXRhKSB7CiAgICAgICAgIGNhc2UgVklTVUFMSVpFUl9QQVJBTV9DQVBUVVJFX1NJWkU6CiAgICAgICAgICAgICBwQ29udGV4dC0+bUNhcHR1cmVTaXplID0gKigodWludDMyX3QgKilwLT5kYXRhICsgMSk7Ci0gICAgICAgICAgICBBTE9HVigic2V0IG1DYXB0dXJlU2l6ZSA9ICVkIiwgcENvbnRleHQtPm1DYXB0dXJlU2l6ZSk7CisgICAgICAgICAgICBBTE9HVigic2V0IG1DYXB0dXJlU2l6ZSA9ICUiIFBSSXUzMiwgcENvbnRleHQtPm1DYXB0dXJlU2l6ZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBWSVNVQUxJWkVSX1BBUkFNX1NDQUxJTkdfTU9ERToKICAgICAgICAgICAgIHBDb250ZXh0LT5tU2NhbGluZ01vZGUgPSAqKCh1aW50MzJfdCAqKXAtPmRhdGEgKyAxKTsKLSAgICAgICAgICAgIEFMT0dWKCJzZXQgbVNjYWxpbmdNb2RlID0gJWQiLCBwQ29udGV4dC0+bVNjYWxpbmdNb2RlKTsKKyAgICAgICAgICAgIEFMT0dWKCJzZXQgbVNjYWxpbmdNb2RlID0gJSIgUFJJdTMyLCBwQ29udGV4dC0+bVNjYWxpbmdNb2RlKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFZJU1VBTElaRVJfUEFSQU1fTEFURU5DWToKICAgICAgICAgICAgIHBDb250ZXh0LT5tTGF0ZW5jeSA9ICooKHVpbnQzMl90ICopcC0+ZGF0YSArIDEpOwotICAgICAgICAgICAgQUxPR1YoInNldCBtTGF0ZW5jeSA9ICVkIiwgcENvbnRleHQtPm1MYXRlbmN5KTsKKyAgICAgICAgICAgIEFMT0dWKCJzZXQgbUxhdGVuY3kgPSAlIiBQUkl1MzIsIHBDb250ZXh0LT5tTGF0ZW5jeSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBWSVNVQUxJWkVSX1BBUkFNX01FQVNVUkVNRU5UX01PREU6CiAgICAgICAgICAgICBwQ29udGV4dC0+bU1lYXN1cmVtZW50TW9kZSA9ICooKHVpbnQzMl90ICopcC0+ZGF0YSArIDEpOwotICAgICAgICAgICAgQUxPR1YoInNldCBtTWVhc3VyZW1lbnRNb2RlID0gJWQiLCBwQ29udGV4dC0+bU1lYXN1cmVtZW50TW9kZSk7CisgICAgICAgICAgICBBTE9HVigic2V0IG1NZWFzdXJlbWVudE1vZGUgPSAlIiBQUkl1MzIsIHBDb250ZXh0LT5tTWVhc3VyZW1lbnRNb2RlKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgKihpbnQzMl90ICopcFJlcGx5RGF0YSA9IC1FSU5WQUw7CkBAIC01NTIsNDkgKzU1NCw0OSBAQAogICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHBDb250ZXh0LT5tU3RhdGUgPT0gVklTVUFMSVpFUl9TVEFURV9BQ1RJVkUpIHsKLSAgICAgICAgICAgIGludDMyX3QgbGF0ZW5jeU1zID0gcENvbnRleHQtPm1MYXRlbmN5OwogICAgICAgICAgICAgY29uc3QgdWludDMyX3QgZGVsdGFNcyA9IFZpc3VhbGl6ZXJfZ2V0RGVsdGFUaW1lTXNGcm9tVXBkYXRlZFRpbWUocENvbnRleHQpOwotICAgICAgICAgICAgbGF0ZW5jeU1zIC09IGRlbHRhTXM7Ci0gICAgICAgICAgICBpZiAobGF0ZW5jeU1zIDwgMCkgewotICAgICAgICAgICAgICAgIGxhdGVuY3lNcyA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb25zdCB1aW50MzJfdCBkZWx0YVNtcGwgPSBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgKiBsYXRlbmN5TXMgLyAxMDAwOwotCi0gICAgICAgICAgICBpbnQzMl90IGNhcHR1cmVQb2ludCA9IHBDb250ZXh0LT5tQ2FwdHVyZUlkeCAtIHBDb250ZXh0LT5tQ2FwdHVyZVNpemUgLSBkZWx0YVNtcGw7Ci0gICAgICAgICAgICBpbnQzMl90IGNhcHR1cmVTaXplID0gcENvbnRleHQtPm1DYXB0dXJlU2l6ZTsKLSAgICAgICAgICAgIGlmIChjYXB0dXJlUG9pbnQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCBzaXplID0gLWNhcHR1cmVQb2ludDsKLSAgICAgICAgICAgICAgICBpZiAoc2l6ZSA+IGNhcHR1cmVTaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNpemUgPSBjYXB0dXJlU2l6ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWVtY3B5KHBSZXBseURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5tQ2FwdHVyZUJ1ZiArIENBUFRVUkVfQlVGX1NJWkUgKyBjYXB0dXJlUG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIHNpemUpOwotICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPSAoY2hhciAqKXBSZXBseURhdGEgKyBzaXplOwotICAgICAgICAgICAgICAgIGNhcHR1cmVTaXplIC09IHNpemU7Ci0gICAgICAgICAgICAgICAgY2FwdHVyZVBvaW50ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1lbWNweShwUmVwbHlEYXRhLAotICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5tQ2FwdHVyZUJ1ZiArIGNhcHR1cmVQb2ludCwKLSAgICAgICAgICAgICAgICAgICBjYXB0dXJlU2l6ZSk7Ci0KIAogICAgICAgICAgICAgLy8gaWYgYXVkaW8gZnJhbWV3b3JrIGhhcyBzdG9wcGVkIHBsYXlpbmcgYXVkaW8gYWx0aG91Z2ggdGhlIGVmZmVjdCBpcyBzdGlsbAogICAgICAgICAgICAgLy8gYWN0aXZlIHdlIG11c3QgY2xlYXIgdGhlIGNhcHR1cmUgYnVmZmVyIHRvIHJldHVybiBzaWxlbmNlCiAgICAgICAgICAgICBpZiAoKHBDb250ZXh0LT5tTGFzdENhcHR1cmVJZHggPT0gcENvbnRleHQtPm1DYXB0dXJlSWR4KSAmJgotICAgICAgICAgICAgICAgICAgICAocENvbnRleHQtPm1CdWZmZXJVcGRhdGVUaW1lLnR2X3NlYyAhPSAwKSkgewotICAgICAgICAgICAgICAgIGlmIChkZWx0YU1zID4gTUFYX1NUQUxMX1RJTUVfTVMpIHsKKyAgICAgICAgICAgICAgICAgICAgKHBDb250ZXh0LT5tQnVmZmVyVXBkYXRlVGltZS50dl9zZWMgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKGRlbHRhTXMgPiBNQVhfU1RBTExfVElNRV9NUykpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNhcHR1cmUgZ29pbmcgdG8gaWRsZSIpOwogICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+bUJ1ZmZlclVwZGF0ZVRpbWUudHZfc2VjID0gMDsKLSAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHBSZXBseURhdGEsIDB4ODAsIHBDb250ZXh0LT5tQ2FwdHVyZVNpemUpOworICAgICAgICAgICAgICAgICAgICBtZW1zZXQocFJlcGx5RGF0YSwgMHg4MCwgY2FwdHVyZVNpemUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGxhdGVuY3lNcyA9IHBDb250ZXh0LT5tTGF0ZW5jeTsKKyAgICAgICAgICAgICAgICBsYXRlbmN5TXMgLT0gZGVsdGFNczsKKyAgICAgICAgICAgICAgICBpZiAobGF0ZW5jeU1zIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBsYXRlbmN5TXMgPSAwOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBkZWx0YVNtcGwgPQorICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgKiBsYXRlbmN5TXMgLyAxMDAwOworICAgICAgICAgICAgICAgIGludDMyX3QgY2FwdHVyZVBvaW50ID0gcENvbnRleHQtPm1DYXB0dXJlSWR4IC0gY2FwdHVyZVNpemUgLSBkZWx0YVNtcGw7CisKKyAgICAgICAgICAgICAgICBpZiAoY2FwdHVyZVBvaW50IDwgMCkgeworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplID0gLWNhcHR1cmVQb2ludDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPiBjYXB0dXJlU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGNhcHR1cmVTaXplOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShwUmVwbHlEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPm1DYXB0dXJlQnVmICsgQ0FQVFVSRV9CVUZfU0laRSArIGNhcHR1cmVQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOworICAgICAgICAgICAgICAgICAgICBwUmVwbHlEYXRhID0gKGNoYXIgKilwUmVwbHlEYXRhICsgc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVNpemUgLT0gc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVBvaW50ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVtY3B5KHBSZXBseURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5tQ2FwdHVyZUJ1ZiArIGNhcHR1cmVQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVNpemUpOwogICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBwQ29udGV4dC0+bUxhc3RDYXB0dXJlSWR4ID0gcENvbnRleHQtPm1DYXB0dXJlSWR4OwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWVtc2V0KHBSZXBseURhdGEsIDB4ODAsIHBDb250ZXh0LT5tQ2FwdHVyZVNpemUpOworICAgICAgICAgICAgbWVtc2V0KHBSZXBseURhdGEsIDB4ODAsIGNhcHR1cmVTaXplKTsKICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOworCisgICAgICAgIH0gYnJlYWs7CiAKICAgICBjYXNlIFZJU1VBTElaRVJfQ01EX01FQVNVUkU6IHsKICAgICAgICAgdWludDE2X3QgcGVha1UxNiA9IDA7CkBAIC02MDQsNyArNjA2LDcgQEAKICAgICAgICAgLy8gbWVhc3VyZW1lbnRzIGFyZW4ndCByZWxldmFudCBhbnltb3JlIGFuZCBzaG91bGRuJ3QgYmlhcyB0aGUgbmV3IG9uZSkKICAgICAgICAgY29uc3QgaW50MzJfdCBkZWxheU1zID0gVmlzdWFsaXplcl9nZXREZWx0YVRpbWVNc0Zyb21VcGRhdGVkVGltZShwQ29udGV4dCk7CiAgICAgICAgIGlmIChkZWxheU1zID4gRElTQ0FSRF9NRUFTVVJFTUVOVFNfVElNRV9NUykgewotICAgICAgICAgICAgQUxPR1YoIkRpc2NhcmRpbmcgbWVhc3VyZW1lbnRzLCBsYXN0IG1lYXN1cmVtZW50IGlzICVkbXMgb2xkIiwgZGVsYXlNcyk7CisgICAgICAgICAgICBBTE9HVigiRGlzY2FyZGluZyBtZWFzdXJlbWVudHMsIGxhc3QgbWVhc3VyZW1lbnQgaXMgJSIgUFJJZDMyICJtcyBvbGQiLCBkZWxheU1zKTsKICAgICAgICAgICAgIGZvciAodWludDMyX3QgaT0wIDsgaTxwQ29udGV4dC0+bU1lYXN1cmVtZW50V2luZG93U2l6ZUluQnVmZmVycyA7IGkrKykgewogICAgICAgICAgICAgICAgIHBDb250ZXh0LT5tUGFzdE1lYXN1cmVtZW50c1tpXS5tSXNWYWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIHBDb250ZXh0LT5tUGFzdE1lYXN1cmVtZW50c1tpXS5tUGVha1UxNiA9IDA7CkBAIC02MzgsMTQgKzY0MCwxNCBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcEludFJlcGx5RGF0YVtNRUFTVVJFTUVOVF9JRFhfUEVBS10gPSAoaW50MzJfdCkgKDIwMDAgKiBsb2cxMChwZWFrVTE2IC8gMzI3NjcuMGYpKTsKICAgICAgICAgfQotICAgICAgICBBTE9HVigiVklTVUFMSVpFUl9DTURfTUVBU1VSRSBwZWFrPSVkICglZG1CKSwgcm1zPSUuMWYgKCVkbUIpIiwKKyAgICAgICAgQUxPR1YoIlZJU1VBTElaRVJfQ01EX01FQVNVUkUgcGVhaz0lIiBQUkl1MTYgIiAoJSIgUFJJZDMyICJtQiksIHJtcz0lLjFmICglIiBQUklkMzIgIm1CKSIsCiAgICAgICAgICAgICAgICAgcGVha1UxNiwgcEludFJlcGx5RGF0YVtNRUFTVVJFTUVOVF9JRFhfUEVBS10sCiAgICAgICAgICAgICAgICAgcm1zLCBwSW50UmVwbHlEYXRhW01FQVNVUkVNRU5UX0lEWF9STVNdKTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKIAogICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dXKCJWaXN1YWxpemVyX2NvbW1hbmQgaW52YWxpZCBjb21tYW5kICVkIixjbWRDb2RlKTsKKyAgICAgICAgQUxPR1coIlZpc3VhbGl6ZXJfY29tbWFuZCBpbnZhbGlkIGNvbW1hbmQgJSIgUFJJdTMyLCBjbWRDb2RlKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLm1rIGIvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5tawppbmRleCA2ZGJjYTUxLi5iMWZiYjVjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQubWsKQEAgLTI1LDYgKzI1LDkgQEAKICAgICBBdWRpb1JlY29yZC5jcHAgXAogICAgIEF1ZGlvU3lzdGVtLmNwcCBcCiAgICAgbWVkaWFwbGF5ZXIuY3BwIFwKKyAgICBJTWVkaWFDb2RlY0xpc3QuY3BwIFwKKyAgICBJTWVkaWFIVFRQQ29ubmVjdGlvbi5jcHAgXAorICAgIElNZWRpYUhUVFBTZXJ2aWNlLmNwcCBcCiAgICAgSU1lZGlhTG9nU2VydmljZS5jcHAgXAogICAgIElNZWRpYVBsYXllclNlcnZpY2UuY3BwIFwKICAgICBJTWVkaWFQbGF5ZXJDbGllbnQuY3BwIFwKQEAgLTM0LDYgKzM3LDcgQEAKICAgICBJUmVtb3RlRGlzcGxheS5jcHAgXAogICAgIElSZW1vdGVEaXNwbGF5Q2xpZW50LmNwcCBcCiAgICAgSVN0cmVhbVNvdXJjZS5jcHAgXAorICAgIE1lZGlhQ29kZWNJbmZvLmNwcCBcCiAgICAgTWVkaWFVdGlscy5jcHAgXAogICAgIE1ldGFkYXRhLmNwcCBcCiAgICAgbWVkaWFyZWNvcmRlci5jcHAgXApAQCAtNDMsOSArNDcsMTAgQEAKICAgICBKZXRQbGF5ZXIuY3BwIFwKICAgICBJT01YLmNwcCBcCiAgICAgSUF1ZGlvUG9saWN5U2VydmljZS5jcHAgXAorICAgIElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuY3BwIFwKICAgICBNZWRpYVNjYW5uZXIuY3BwIFwKICAgICBNZWRpYVNjYW5uZXJDbGllbnQuY3BwIFwKLSAgICBhdXRvZGV0ZWN0LmNwcCBcCisgICAgQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvci5jcHAgXAogICAgIElNZWRpYURlYXRoTm90aWZpZXIuY3BwIFwKICAgICBNZWRpYVByb2ZpbGVzLmNwcCBcCiAgICAgSUVmZmVjdC5jcHAgXApAQCAtNTksMjYgKzY0LDM2IEBACiAKIExPQ0FMX1NSQ19GSUxFUyArPSAuLi9saWJuYmFpby9yb3VuZHVwLmMKIAotIyBmb3IgPGN1dGlscy9hdG9taWMtaW5saW5lLmg+Ci1MT0NBTF9DRkxBR1MgKz0gLURBTkRST0lEX1NNUD0kKGlmICQoZmluZHN0cmluZyB0cnVlLCQoVEFSR0VUX0NQVV9TTVApKSwxLDApCi1MT0NBTF9TUkNfRklMRVMgKz0gU2luZ2xlU3RhdGVRdWV1ZS5jcHAKLUxPQ0FMX0NGTEFHUyArPSAtRFNJTkdMRV9TVEFURV9RVUVVRV9JTlNUQU5USUFUSU9OUz0nIlNpbmdsZVN0YXRlUXVldWVJbnN0YW50aWF0aW9ucy5jcHAiJwotIyBDb25zaWRlciBhIHNlcGFyYXRlIGEgbGlicmFyeSBmb3IgU2luZ2xlU3RhdGVRdWV1ZUluc3RhbnRpYXRpb25zLgotCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJ1aSBsaWJsb2cgbGliY3V0aWxzIGxpYnV0aWxzIGxpYmJpbmRlciBsaWJzb25pdm94IGxpYmljdXVjIGxpYmV4cGF0IFwKKwlsaWJ1aSBsaWJsb2cgbGliY3V0aWxzIGxpYnV0aWxzIGxpYmJpbmRlciBsaWJzb25pdm94IGxpYmljdXVjIGxpYmljdWkxOG4gbGliZXhwYXQgXAogICAgICAgICBsaWJjYW1lcmFfY2xpZW50IGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAotICAgICAgICBsaWJndWkgbGliZGwgbGliYXVkaW91dGlscworICAgICAgICBsaWJndWkgbGliZGwgbGliYXVkaW91dGlscyBsaWJuYmFpbwogCi1MT0NBTF9XSE9MRV9TVEFUSUNfTElCUkFSWSA6PSBsaWJtZWRpYV9oZWxwZXIKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgKz0gbGliaW5zdGFudHNzcQorCitMT0NBTF9XSE9MRV9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYm1lZGlhX2hlbHBlcgogCiBMT0NBTF9NT0RVTEU6PSBsaWJtZWRpYQogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgZ3JhcGhpY3MgY29yZWNnKSBcCiAgICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCi0gICAgZXh0ZXJuYWwvaWN1NGMvY29tbW9uIFwKKyAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9pbmNsdWRlL21lZGlhLyBcCisgICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAorICAgICQoVE9QKS9leHRlcm5hbC9pY3UvaWN1NGMvc291cmNlL2NvbW1vbiBcCisgICAgJChUT1ApL2V4dGVybmFsL2ljdS9pY3U0Yy9zb3VyY2UvaTE4biBcCiAgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpIFwKICAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKKyMgZm9yIDxjdXRpbHMvYXRvbWljLWlubGluZS5oPgorTE9DQUxfQ0ZMQUdTICs9IC1EQU5EUk9JRF9TTVA9JChpZiAkKGZpbmRzdHJpbmcgdHJ1ZSwkKFRBUkdFVF9DUFVfU01QKSksMSwwKQorTE9DQUxfU1JDX0ZJTEVTICs9IFNpbmdsZVN0YXRlUXVldWUuY3BwCitMT0NBTF9DRkxBR1MgKz0gLURTSU5HTEVfU1RBVEVfUVVFVUVfSU5TVEFOVElBVElPTlM9JyJTaW5nbGVTdGF0ZVF1ZXVlSW5zdGFudGlhdGlvbnMuY3BwIicKKworTE9DQUxfTU9EVUxFIDo9IGxpYmluc3RhbnRzc3EKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvRWZmZWN0LmNwcCBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvRWZmZWN0LmNwcAppbmRleCA4ZGZmZmIzLi4wZDVkN2U0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BdWRpb0VmZmVjdC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9FZmZlY3QuY3BwCkBAIC0xNDUsMTUgKzE0NSwxOSBAQAogICAgICAgICByZXR1cm4gbVN0YXR1czsKICAgICB9CiAKLSAgICBtSUVmZmVjdCA9IGlFZmZlY3Q7CiAgICAgbUNibGtNZW1vcnkgPSBjYmxrOwogICAgIG1DYmxrID0gc3RhdGljX2Nhc3Q8ZWZmZWN0X3BhcmFtX2NibGtfdCo+KGNibGstPnBvaW50ZXIoKSk7CiAgICAgaW50IGJ1Zk9mZnNldCA9ICgoc2l6ZW9mKGVmZmVjdF9wYXJhbV9jYmxrX3QpIC0gMSkgLyBzaXplb2YoaW50KSArIDEpICogc2l6ZW9mKGludCk7CiAgICAgbUNibGstPmJ1ZmZlciA9ICh1aW50OF90ICopbUNibGsgKyBidWZPZmZzZXQ7CiAKICAgICBpRWZmZWN0LT5hc0JpbmRlcigpLT5saW5rVG9EZWF0aChtSUVmZmVjdENsaWVudCk7Ci0gICAgQUxPR1YoInNldCgpICVwIE9LIGVmZmVjdDogJXMgaWQ6ICVkIHN0YXR1cyAlZCBlbmFibGVkICVkIiwgdGhpcywgbURlc2NyaXB0b3IubmFtZSwgbUlkLAotICAgICAgICAgICAgbVN0YXR1cywgbUVuYWJsZWQpOworICAgIG1DbGllbnRQaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgQUxPR1YoInNldCgpICVwIE9LIGVmZmVjdDogJXMgaWQ6ICVkIHN0YXR1cyAlZCBlbmFibGVkICVkIHBpZCAlZCIsIHRoaXMsIG1EZXNjcmlwdG9yLm5hbWUsIG1JZCwKKyAgICAgICAgICAgIG1TdGF0dXMsIG1FbmFibGVkLCBtQ2xpZW50UGlkKTsKKworICAgIGlmIChtU2Vzc2lvbklkID4gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKSB7CisgICAgICAgIEF1ZGlvU3lzdGVtOjphY3F1aXJlQXVkaW9TZXNzaW9uSWQobVNlc3Npb25JZCwgbUNsaWVudFBpZCk7CisgICAgfQogCiAgICAgcmV0dXJuIG1TdGF0dXM7CiB9CkBAIC0xNjQsNiArMTY4LDkgQEAKICAgICBBTE9HVigiRGVzdHJ1Y3RvciAlcCIsIHRoaXMpOwogCiAgICAgaWYgKG1TdGF0dXMgPT0gTk9fRVJST1IgfHwgbVN0YXR1cyA9PSBBTFJFQURZX0VYSVNUUykgeworICAgICAgICBpZiAobVNlc3Npb25JZCA+IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCkgeworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChtU2Vzc2lvbklkLCBtQ2xpZW50UGlkKTsKKyAgICAgICAgfQogICAgICAgICBpZiAobUlFZmZlY3QgIT0gTlVMTCkgewogICAgICAgICAgICAgbUlFZmZlY3QtPmRpc2Nvbm5lY3QoKTsKICAgICAgICAgICAgIG1JRWZmZWN0LT5hc0JpbmRlcigpLT51bmxpbmtUb0RlYXRoKG1JRWZmZWN0Q2xpZW50KTsKQEAgLTM4MCw5ICszODcsOSBAQAogfQogCiB2b2lkIEF1ZGlvRWZmZWN0Ojpjb21tYW5kRXhlY3V0ZWQodWludDMyX3QgY21kQ29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNtZFNpemUgX191bnVzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY21kRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZXBseVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVwbHlTaXplIF9fdW51c2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlcGx5RGF0YSkKIHsKICAgICBpZiAoY21kRGF0YSA9PSBOVUxMIHx8IHJlcGx5RGF0YSA9PSBOVUxMKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BdWRpb1JlY29yZC5jcHAgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1JlY29yZC5jcHAKaW5kZXggY2NiYzVhMy4uOWU3YmE4OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQXVkaW9SZWNvcmQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvUmVjb3JkLmNwcApAQCAtMTgsNyArMTgsOSBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJBdWRpb1JlY29yZCIKIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisKICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1JlY29yZC5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgpAQCAtNDEsMzcgKzQzLDMwIEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgLy8gZGVmYXVsdCB0byAwIGluIGNhc2Ugb2YgZXJyb3IKLSAgICAqZnJhbWVDb3VudCA9IDA7Ci0KLSAgICBzaXplX3Qgc2l6ZSA9IDA7CisgICAgc2l6ZV90IHNpemU7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldElucHV0QnVmZmVyU2l6ZShzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCAmc2l6ZSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiQXVkaW9TeXN0ZW0gY291bGQgbm90IHF1ZXJ5IHRoZSBpbnB1dCBidWZmZXIgc2l6ZTsgc3RhdHVzICVkIiwgc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIEFMT0dFKCJBdWRpb1N5c3RlbSBjb3VsZCBub3QgcXVlcnkgdGhlIGlucHV0IGJ1ZmZlciBzaXplIGZvciBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCAiCisgICAgICAgICAgICAgICJjaGFubmVsTWFzayAlI3g7IHN0YXR1cyAlZCIsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCi0gICAgaWYgKHNpemUgPT0gMCkgewotICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgY29uZmlndXJhdGlvbjogc2FtcGxlUmF0ZSAldSwgZm9ybWF0ICVkLCBjaGFubmVsTWFzayAlI3giLAorICAgIC8vIFdlIGRvdWJsZSB0aGUgc2l6ZSBvZiBpbnB1dCBidWZmZXIgZm9yIHBpbmcgcG9uZyB1c2Ugb2YgcmVjb3JkIGJ1ZmZlci4KKyAgICAvLyBBc3N1bWVzIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KQorICAgIGlmICgoKmZyYW1lQ291bnQgPSAoc2l6ZSAqIDIpIC8gKGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGNoYW5uZWxNYXNrKSAqCisgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCkpKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBjb25maWd1cmF0aW9uOiBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAlI3giLAogICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzayk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgLy8gV2UgZG91YmxlIHRoZSBzaXplIG9mIGlucHV0IGJ1ZmZlciBmb3IgcGluZyBwb25nIHVzZSBvZiByZWNvcmQgYnVmZmVyLgotICAgIHNpemUgPDw9IDE7Ci0KLSAgICAvLyBBc3N1bWVzIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KQotICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IHBvcGNvdW50KGNoYW5uZWxNYXNrKTsKLSAgICBzaXplIC89IGNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KTsKLQotICAgICpmcmFtZUNvdW50ID0gc2l6ZTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBBdWRpb1JlY29yZDo6QXVkaW9SZWNvcmQoKQotICAgIDogbVN0YXR1cyhOT19JTklUKSwgbVNlc3Npb25JZCgwKSwKKyAgICA6IG1TdGF0dXMoTk9fSU5JVCksIG1TZXNzaW9uSWQoQVVESU9fU0VTU0lPTl9BTExPQ0FURSksCiAgICAgICBtUHJldmlvdXNQcmlvcml0eShBTkRST0lEX1BSSU9SSVRZX05PUk1BTCksIG1QcmV2aW91c1NjaGVkdWxpbmdHcm91cChTUF9ERUZBVUxUKQogewogfQpAQCAtODEsMjAgKzc2LDIwIEBACiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgIGludCBmcmFtZUNvdW50LAorICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgY2FsbGJhY2tfdCBjYmYsCiAgICAgICAgIHZvaWQqIHVzZXIsCi0gICAgICAgIGludCBub3RpZmljYXRpb25GcmFtZXMsCisgICAgICAgIHVpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgaW50IHNlc3Npb25JZCwKICAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUsCiAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpCi0gICAgOiBtU3RhdHVzKE5PX0lOSVQpLCBtU2Vzc2lvbklkKDApLAorICAgIDogbVN0YXR1cyhOT19JTklUKSwgbVNlc3Npb25JZChBVURJT19TRVNTSU9OX0FMTE9DQVRFKSwKICAgICAgIG1QcmV2aW91c1ByaW9yaXR5KEFORFJPSURfUFJJT1JJVFlfTk9STUFMKSwKICAgICAgIG1QcmV2aW91c1NjaGVkdWxpbmdHcm91cChTUF9ERUZBVUxUKSwKICAgICAgIG1Qcm94eShOVUxMKQogewogICAgIG1TdGF0dXMgPSBzZXQoaW5wdXRTb3VyY2UsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIGNiZiwgdXNlciwKLSAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lcywgZmFsc2UgLyp0aHJlYWRDYW5DYWxsSmF2YSovLCBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSk7CisgICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZXMsIGZhbHNlIC8qdGhyZWFkQ2FuQ2FsbEphdmEqLywgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUsIGZsYWdzKTsKIH0KIAogQXVkaW9SZWNvcmQ6On5BdWRpb1JlY29yZCgpCkBAIC0xMTAsMTIgKzEwNSwxMiBAQAogICAgICAgICAgICAgbUF1ZGlvUmVjb3JkVGhyZWFkLT5yZXF1ZXN0RXhpdEFuZFdhaXQoKTsKICAgICAgICAgICAgIG1BdWRpb1JlY29yZFRocmVhZC5jbGVhcigpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChtQXVkaW9SZWNvcmQgIT0gMCkgewotICAgICAgICAgICAgbUF1ZGlvUmVjb3JkLT5hc0JpbmRlcigpLT51bmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCB0aGlzKTsKLSAgICAgICAgICAgIG1BdWRpb1JlY29yZC5jbGVhcigpOwotICAgICAgICB9CisgICAgICAgIG1BdWRpb1JlY29yZC0+YXNCaW5kZXIoKS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgdGhpcyk7CisgICAgICAgIG1BdWRpb1JlY29yZC5jbGVhcigpOworICAgICAgICBtQ2Jsa01lbW9yeS5jbGVhcigpOworICAgICAgICBtQnVmZmVyTWVtb3J5LmNsZWFyKCk7CiAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKLSAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChtU2Vzc2lvbklkKTsKKyAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChtU2Vzc2lvbklkLCAtMSk7CiAgICAgfQogfQogCkBAIC0xMjQsMTUgKzExOSwyMCBAQAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICBpbnQgZnJhbWVDb3VudEludCwKKyAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgIGNhbGxiYWNrX3QgY2JmLAogICAgICAgICB2b2lkKiB1c2VyLAotICAgICAgICBpbnQgbm90aWZpY2F0aW9uRnJhbWVzLAorICAgICAgICB1aW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMsCiAgICAgICAgIGJvb2wgdGhyZWFkQ2FuQ2FsbEphdmEsCiAgICAgICAgIGludCBzZXNzaW9uSWQsCiAgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlLAogICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKQogeworICAgIEFMT0dWKCJzZXQoKTogaW5wdXRTb3VyY2UgJWQsIHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrICUjeCwgZnJhbWVDb3VudCAlenUsICIKKyAgICAgICAgICAibm90aWZpY2F0aW9uRnJhbWVzICV1LCBzZXNzaW9uSWQgJWQsIHRyYW5zZmVyVHlwZSAlZCwgZmxhZ3MgJSN4IiwKKyAgICAgICAgICBpbnB1dFNvdXJjZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgbm90aWZpY2F0aW9uRnJhbWVzLAorICAgICAgICAgIHNlc3Npb25JZCwgdHJhbnNmZXJUeXBlLCBmbGFncyk7CisKICAgICBzd2l0Y2ggKHRyYW5zZmVyVHlwZSkgewogICAgIGNhc2UgVFJBTlNGRVJfREVGQVVMVDoKICAgICAgICAgaWYgKGNiZiA9PSBOVUxMIHx8IHRocmVhZENhbkNhbGxKYXZhKSB7CkBAIC0xNTYsMjMgKzE1NiwxNSBAQAogICAgIH0KICAgICBtVHJhbnNmZXIgPSB0cmFuc2ZlclR5cGU7CiAKLSAgICAvLyBGSVhNRSAiaW50IiBoZXJlIGlzIGxlZ2FjeSBhbmQgd2lsbCBiZSByZXBsYWNlZCBieSBzaXplX3QgbGF0ZXIKLSAgICBpZiAoZnJhbWVDb3VudEludCA8IDApIHsKLSAgICAgICAgQUxPR0UoIkludmFsaWQgZnJhbWUgY291bnQgJWQiLCBmcmFtZUNvdW50SW50KTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgc2l6ZV90IGZyYW1lQ291bnQgPSBmcmFtZUNvdW50SW50OwotCi0gICAgQUxPR1YoInNldCgpOiBzYW1wbGVSYXRlICV1LCBjaGFubmVsTWFzayAlI3gsIGZyYW1lQ291bnQgJXUiLCBzYW1wbGVSYXRlLCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgIGZyYW1lQ291bnQpOwotCiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogCisgICAgLy8gaW52YXJpYW50IHRoYXQgbUF1ZGlvUmVjb3JkICE9IDAgaXMgdHJ1ZSBvbmx5IGFmdGVyIHNldCgpIHJldHVybnMgc3VjY2Vzc2Z1bGx5CiAgICAgaWYgKG1BdWRpb1JlY29yZCAhPSAwKSB7CiAgICAgICAgIEFMT0dFKCJUcmFjayBhbHJlYWR5IGluIHVzZSIpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCisgICAgLy8gaGFuZGxlIGRlZmF1bHQgdmFsdWVzIGZpcnN0LgogICAgIGlmIChpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfREVGQVVMVCkgewogICAgICAgICBpbnB1dFNvdXJjZSA9IEFVRElPX1NPVVJDRV9NSUM7CiAgICAgfQpAQCAtMTkxLDEyICsxODMsMTIgQEAKIAogICAgIC8vIHZhbGlkYXRlIHBhcmFtZXRlcnMKICAgICBpZiAoIWF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChmb3JtYXQpKSB7Ci0gICAgICAgIEFMT0dFKCJJbnZhbGlkIGZvcm1hdCAlZCIsIGZvcm1hdCk7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIGZvcm1hdCAlI3giLCBmb3JtYXQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICAvLyBUZW1wb3JhcnkgcmVzdHJpY3Rpb246IEF1ZGlvRmxpbmdlciBjdXJyZW50bHkgc3VwcG9ydHMgMTYtYml0IFBDTSBvbmx5CiAgICAgaWYgKGZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgewotICAgICAgICBBTE9HRSgiRm9ybWF0ICVkIGlzIG5vdCBzdXBwb3J0ZWQiLCBmb3JtYXQpOworICAgICAgICBBTE9HRSgiRm9ybWF0ICUjeCBpcyBub3Qgc3VwcG9ydGVkIiwgZm9ybWF0KTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgbUZvcm1hdCA9IGZvcm1hdDsKQEAgLTIwNiw2MSArMTk4LDUwIEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIG1DaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrOwotICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IHBvcGNvdW50KGNoYW5uZWxNYXNrKTsKKyAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjaGFubmVsTWFzayk7CiAgICAgbUNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudDsKIAotICAgIC8vIEFzc3VtZXMgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpLCBlbHNlIHNpemVvZih1aW50OF90KQotICAgIG1GcmFtZVNpemUgPSBjaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCk7Ci0KLSAgICAvLyB2YWxpZGF0ZSBmcmFtZWNvdW50Ci0gICAgc2l6ZV90IG1pbkZyYW1lQ291bnQgPSAwOwotICAgIHN0YXR1c190IHN0YXR1cyA9IEF1ZGlvUmVjb3JkOjpnZXRNaW5GcmFtZUNvdW50KCZtaW5GcmFtZUNvdW50LAotICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzayk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiZ2V0TWluRnJhbWVDb3VudCgpIGZhaWxlZDsgc3RhdHVzICVkIiwgc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICBpZiAoYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7CisgICAgICAgIG1GcmFtZVNpemUgPSBjaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUZyYW1lU2l6ZSA9IHNpemVvZih1aW50OF90KTsKICAgICB9Ci0gICAgQUxPR1YoIkF1ZGlvUmVjb3JkOjpzZXQoKSBtaW5GcmFtZUNvdW50ID0gJWQiLCBtaW5GcmFtZUNvdW50KTsKIAotICAgIGlmIChmcmFtZUNvdW50ID09IDApIHsKLSAgICAgICAgZnJhbWVDb3VudCA9IG1pbkZyYW1lQ291bnQ7Ci0gICAgfSBlbHNlIGlmIChmcmFtZUNvdW50IDwgbWluRnJhbWVDb3VudCkgewotICAgICAgICBBTE9HRSgiZnJhbWVDb3VudCAldSA8IG1pbkZyYW1lQ291bnQgJXUiLCBmcmFtZUNvdW50LCBtaW5GcmFtZUNvdW50KTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgbUZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworICAgIC8vIG1GcmFtZUNvdW50IGlzIGluaXRpYWxpemVkIGluIG9wZW5SZWNvcmRfbAorICAgIG1SZXFGcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKIAogICAgIG1Ob3RpZmljYXRpb25GcmFtZXNSZXEgPSBub3RpZmljYXRpb25GcmFtZXM7Ci0gICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9IDA7CisgICAgLy8gbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCBpcyBpbml0aWFsaXplZCBpbiBvcGVuUmVjb3JkX2wKIAotICAgIGlmIChzZXNzaW9uSWQgPT0gMCApIHsKLSAgICAgICAgbVNlc3Npb25JZCA9IEF1ZGlvU3lzdGVtOjpuZXdBdWRpb1Nlc3Npb25JZCgpOworICAgIGlmIChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSkgeworICAgICAgICBtU2Vzc2lvbklkID0gQXVkaW9TeXN0ZW06Om5ld0F1ZGlvVW5pcXVlSWQoKTsKICAgICB9IGVsc2UgewogICAgICAgICBtU2Vzc2lvbklkID0gc2Vzc2lvbklkOwogICAgIH0KICAgICBBTE9HVigic2V0KCk6IG1TZXNzaW9uSWQgJWQiLCBtU2Vzc2lvbklkKTsKIAogICAgIG1GbGFncyA9IGZsYWdzOwotCi0gICAgLy8gY3JlYXRlIHRoZSBJQXVkaW9SZWNvcmQKLSAgICBzdGF0dXMgPSBvcGVuUmVjb3JkX2woMCAvKmVwb2NoKi8pOwotICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9CisgICAgbUNiZiA9IGNiZjsKIAogICAgIGlmIChjYmYgIT0gTlVMTCkgewogICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQgPSBuZXcgQXVkaW9SZWNvcmRUaHJlYWQoKnRoaXMsIHRocmVhZENhbkNhbGxKYXZhKTsKICAgICAgICAgbUF1ZGlvUmVjb3JkVGhyZWFkLT5ydW4oIkF1ZGlvUmVjb3JkIiwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7CiAgICAgfQogCisgICAgLy8gY3JlYXRlIHRoZSBJQXVkaW9SZWNvcmQKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBvcGVuUmVjb3JkX2woMCAvKmVwb2NoKi8pOworCisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICBpZiAobUF1ZGlvUmVjb3JkVGhyZWFkICE9IDApIHsKKyAgICAgICAgICAgIG1BdWRpb1JlY29yZFRocmVhZC0+cmVxdWVzdEV4aXQoKTsgICAvLyBzZWUgY29tbWVudCBpbiBBdWRpb1JlY29yZC5oCisgICAgICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQtPnJlcXVlc3RFeGl0QW5kV2FpdCgpOworICAgICAgICAgICAgbUF1ZGlvUmVjb3JkVGhyZWFkLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKICAgICBtU3RhdHVzID0gTk9fRVJST1I7Ci0KLSAgICAvLyBVcGRhdGUgYnVmZmVyIHNpemUgaW4gY2FzZSBpdCBoYXMgYmVlbiBsaW1pdGVkIGJ5IEF1ZGlvRmxpbmdlciBkdXJpbmcgdHJhY2sgY3JlYXRpb24KLSAgICBtRnJhbWVDb3VudCA9IG1DYmxrLT5mcmFtZUNvdW50XzsKLQogICAgIG1BY3RpdmUgPSBmYWxzZTsKLSAgICBtQ2JmID0gY2JmOwotICAgIG1SZWZyZXNoUmVtYWluaW5nID0gdHJ1ZTsKICAgICBtVXNlckRhdGEgPSB1c2VyOwogICAgIC8vIFRPRE86IGFkZCBhdWRpbyBoYXJkd2FyZSBpbnB1dCBsYXRlbmN5IGhlcmUKICAgICBtTGF0ZW5jeSA9ICgxMDAwKm1GcmFtZUNvdW50KSAvIHNhbXBsZVJhdGU7CkBAIC0yNjgsNyArMjQ5LDcgQEAKICAgICBtTWFya2VyUmVhY2hlZCA9IGZhbHNlOwogICAgIG1OZXdQb3NpdGlvbiA9IDA7CiAgICAgbVVwZGF0ZVBlcmlvZCA9IDA7Ci0gICAgQXVkaW9TeXN0ZW06OmFjcXVpcmVBdWRpb1Nlc3Npb25JZChtU2Vzc2lvbklkKTsKKyAgICBBdWRpb1N5c3RlbTo6YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKG1TZXNzaW9uSWQsIC0xKTsKICAgICBtU2VxdWVuY2UgPSAxOwogICAgIG1PYnNlcnZlZFNlcXVlbmNlID0gbVNlcXVlbmNlOwogICAgIG1Jbk92ZXJydW4gPSBmYWxzZTsKQEAgLTI4OSw2ICsyNzAsOSBAQAogCiAgICAgLy8gcmVzZXQgY3VycmVudCBwb3NpdGlvbiBhcyBzZWVuIGJ5IGNsaWVudCB0byAwCiAgICAgbVByb3h5LT5zZXRFcG9jaChtUHJveHktPmdldEVwb2NoKCkgLSBtUHJveHktPmdldFBvc2l0aW9uKCkpOworICAgIC8vIGZvcmNlIHJlZnJlc2ggb2YgcmVtYWluaW5nIGZyYW1lcyBieSBwcm9jZXNzQXVkaW9CdWZmZXIoKSBhcyBsYXN0CisgICAgLy8gcmVhZCBiZWZvcmUgc3RvcCBjb3VsZCBiZSBwYXJ0aWFsLgorICAgIG1SZWZyZXNoUmVtYWluaW5nID0gdHJ1ZTsKIAogICAgIG1OZXdQb3NpdGlvbiA9IG1Qcm94eS0+Z2V0UG9zaXRpb24oKSArIG1VcGRhdGVQZXJpb2Q7CiAgICAgaW50MzJfdCBmbGFncyA9IGFuZHJvaWRfYXRvbWljX2FjcXVpcmVfbG9hZCgmbUNibGstPm1GbGFncyk7CkBAIC0zNTIsNiArMzM2LDcgQEAKIAogc3RhdHVzX3QgQXVkaW9SZWNvcmQ6OnNldE1hcmtlclBvc2l0aW9uKHVpbnQzMl90IG1hcmtlcikKIHsKKyAgICAvLyBUaGUgb25seSBwdXJwb3NlIG9mIHNldHRpbmcgbWFya2VyIHBvc2l0aW9uIGlzIHRvIGdldCBhIGNhbGxiYWNrCiAgICAgaWYgKG1DYmYgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQpAQCAtMzc3LDYgKzM2Miw3IEBACiAKIHN0YXR1c190IEF1ZGlvUmVjb3JkOjpzZXRQb3NpdGlvblVwZGF0ZVBlcmlvZCh1aW50MzJfdCB1cGRhdGVQZXJpb2QpCiB7CisgICAgLy8gVGhlIG9ubHkgcHVycG9zZSBvZiBzZXR0aW5nIHBvc2l0aW9uIHVwZGF0ZSBwZXJpb2QgaXMgdG8gZ2V0IGEgY2FsbGJhY2sKICAgICBpZiAobUNiZiA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CkBAIC00MTIsNyArMzk4LDcgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXVuc2lnbmVkIGludCBBdWRpb1JlY29yZDo6Z2V0SW5wdXRGcmFtZXNMb3N0KCkgY29uc3QKK3VpbnQzMl90IEF1ZGlvUmVjb3JkOjpnZXRJbnB1dEZyYW1lc0xvc3QoKSBjb25zdAogewogICAgIC8vIG5vIG5lZWQgdG8gY2hlY2sgbUFjdGl2ZSwgYmVjYXVzZSBpZiBpbmFjdGl2ZSB0aGlzIHdpbGwgcmV0dXJuIDAsIHdoaWNoIGlzIHdoYXQgd2Ugd2FudAogICAgIHJldHVybiBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRGcmFtZXNMb3N0KGdldElucHV0KCkpOwpAQCAtNDMwLDU2ICs0MTYsNzkgQEAKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogCi0gICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCB0cmFja0ZsYWdzID0gSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfREVGQVVMVDsKLSAgICBwaWRfdCB0aWQgPSAtMTsKKyAgICAvLyBGYXN0IHRyYWNrcyBtdXN0IGJlIGF0IHRoZSBwcmltYXJ5IF9vdXRwdXRfIFtzaWNdIHNhbXBsaW5nIHJhdGUsCisgICAgLy8gYmVjYXVzZSB0aGVyZSBpcyBjdXJyZW50bHkgbm8gY29uY2VwdCBvZiBhIHByaW1hcnkgaW5wdXQgc2FtcGxpbmcgcmF0ZQorICAgIHVpbnQzMl90IGFmU2FtcGxlUmF0ZSA9IEF1ZGlvU3lzdGVtOjpnZXRQcmltYXJ5T3V0cHV0U2FtcGxpbmdSYXRlKCk7CisgICAgaWYgKGFmU2FtcGxlUmF0ZSA9PSAwKSB7CisgICAgICAgIEFMT0dXKCJnZXRQcmltYXJ5T3V0cHV0U2FtcGxpbmdSYXRlIGZhaWxlZCIpOworICAgIH0KIAogICAgIC8vIENsaWVudCBjYW4gb25seSBleHByZXNzIGEgcHJlZmVyZW5jZSBmb3IgRkFTVC4gIFNlcnZlciB3aWxsIHBlcmZvcm0gYWRkaXRpb25hbCB0ZXN0cy4KLSAgICAvLyBUaGUgb25seSBzdXBwb3J0ZWQgdXNlIGNhc2UgZm9yIEZBU1QgaXMgY2FsbGJhY2sgdHJhbnNmZXIgbW9kZS4KKyAgICBpZiAoKG1GbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkgJiYgISgKKyAgICAgICAgICAgIC8vIHVzZSBjYXNlOiBjYWxsYmFjayB0cmFuc2ZlciBtb2RlCisgICAgICAgICAgICAobVRyYW5zZmVyID09IFRSQU5TRkVSX0NBTExCQUNLKSAmJgorICAgICAgICAgICAgLy8gbWF0Y2hpbmcgc2FtcGxlIHJhdGUKKyAgICAgICAgICAgIChtU2FtcGxlUmF0ZSA9PSBhZlNhbXBsZVJhdGUpKSkgeworICAgICAgICBBTE9HVygiQVVESU9fSU5QVVRfRkxBR19GQVNUIGRlbmllZCBieSBjbGllbnQiKTsKKyAgICAgICAgLy8gb25jZSBkZW5pZWQsIGRvIG5vdCByZXF1ZXN0IGFnYWluIGlmIElBdWRpb1JlY29yZCBpcyByZS1jcmVhdGVkCisgICAgICAgIG1GbGFncyA9IChhdWRpb19pbnB1dF9mbGFnc190KSAobUZsYWdzICYgfkFVRElPX0lOUFVUX0ZMQUdfRkFTVCk7CisgICAgfQorCisgICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCB0cmFja0ZsYWdzID0gSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfREVGQVVMVDsKKworICAgIHBpZF90IHRpZCA9IC0xOwogICAgIGlmIChtRmxhZ3MgJiBBVURJT19JTlBVVF9GTEFHX0ZBU1QpIHsKLSAgICAgICAgaWYgKChtVHJhbnNmZXIgIT0gVFJBTlNGRVJfQ0FMTEJBQ0spIHx8IChtQXVkaW9SZWNvcmRUaHJlYWQgPT0gMCkpIHsKLSAgICAgICAgICAgIEFMT0dXKCJBVURJT19JTlBVVF9GTEFHX0ZBU1QgZGVuaWVkIGJ5IGNsaWVudCIpOwotICAgICAgICAgICAgLy8gb25jZSBkZW5pZWQsIGRvIG5vdCByZXF1ZXN0IGFnYWluIGlmIElBdWRpb1JlY29yZCBpcyByZS1jcmVhdGVkCi0gICAgICAgICAgICBtRmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkgKG1GbGFncyAmIH5BVURJT19JTlBVVF9GTEFHX0ZBU1QpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHJhY2tGbGFncyB8PSBJQXVkaW9GbGluZ2VyOjpUUkFDS19GQVNUOworICAgICAgICB0cmFja0ZsYWdzIHw9IElBdWRpb0ZsaW5nZXI6OlRSQUNLX0ZBU1Q7CisgICAgICAgIGlmIChtQXVkaW9SZWNvcmRUaHJlYWQgIT0gMCkgewogICAgICAgICAgICAgdGlkID0gbUF1ZGlvUmVjb3JkVGhyZWFkLT5nZXRUaWQoKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSBtTm90aWZpY2F0aW9uRnJhbWVzUmVxOwotCi0gICAgaWYgKCEobUZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19GQVNUKSkgewotICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBhcHBsaWNhdGlvbiBpcyBub3RpZmllZCB3aXRoIHN1ZmZpY2llbnQgbWFyZ2luIGJlZm9yZSBvdmVycnVuCi0gICAgICAgIGlmIChtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID09IDAgfHwgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA+IG1GcmFtZUNvdW50LzIpIHsKLSAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSBtRnJhbWVDb3VudC8yOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBBdWRpb1N5c3RlbTo6Z2V0SW5wdXQobUlucHV0U291cmNlLCBtU2FtcGxlUmF0ZSwgbUZvcm1hdCwKLSAgICAgICAgICAgIG1DaGFubmVsTWFzaywgbVNlc3Npb25JZCk7Ci0gICAgaWYgKGlucHV0ID09IDApIHsKLSAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgYXVkaW8gaW5wdXQgZm9yIHJlY29yZCBzb3VyY2UgJWQiLCBtSW5wdXRTb3VyY2UpOworICAgICAgICAgICAgbUNoYW5uZWxNYXNrLCBtU2Vzc2lvbklkLCBtRmxhZ3MpOworICAgIGlmIChpbnB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBhdWRpbyBpbnB1dCBmb3IgcmVjb3JkIHNvdXJjZSAlZCwgc2FtcGxlIHJhdGUgJXUsIGZvcm1hdCAlI3gsICIKKyAgICAgICAgICAgICAgImNoYW5uZWwgbWFzayAlI3gsIHNlc3Npb24gJWQsIGZsYWdzICUjeCIsCisgICAgICAgICAgICAgIG1JbnB1dFNvdXJjZSwgbVNhbXBsZVJhdGUsIG1Gb3JtYXQsIG1DaGFubmVsTWFzaywgbVNlc3Npb25JZCwgbUZsYWdzKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CisgICAgeworICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgYSByZWZlcmVuY2UgdG8gYW4gSS9PIGhhbmRsZSBhbmQgaGF2ZSBub3QgeWV0IGhhbmRlZCBpdCBvZmYgdG8gQXVkaW9GbGluZ2VyLAorICAgIC8vIHdlIG11c3QgcmVsZWFzZSBpdCBvdXJzZWx2ZXMgaWYgYW55dGhpbmcgZ29lcyB3cm9uZy4KIAorICAgIHNpemVfdCBmcmFtZUNvdW50ID0gbVJlcUZyYW1lQ291bnQ7CisgICAgc2l6ZV90IHRlbXAgPSBmcmFtZUNvdW50OyAgIC8vIHRlbXAgbWF5IGJlIHJlcGxhY2VkIGJ5IGEgcmV2aXNlZCB2YWx1ZSBvZiBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgd2Ugd2lsbCBzdGlsbCBuZWVkIHRoZSBvcmlnaW5hbCB2YWx1ZSBhbHNvCiAgICAgaW50IG9yaWdpbmFsU2Vzc2lvbklkID0gbVNlc3Npb25JZDsKKworICAgIC8vIFRoZSBub3RpZmljYXRpb24gZnJhbWUgY291bnQgaXMgdGhlIHBlcmlvZCBiZXR3ZWVuIGNhbGxiYWNrcywgYXMgc3VnZ2VzdGVkIGJ5IHRoZSBzZXJ2ZXIuCisgICAgc2l6ZV90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IG1Ob3RpZmljYXRpb25GcmFtZXNSZXE7CisKKyAgICBzcDxJTWVtb3J5PiBpTWVtOyAgICAgICAgICAgLy8gZm9yIGNibGsKKyAgICBzcDxJTWVtb3J5PiBidWZmZXJNZW07CiAgICAgc3A8SUF1ZGlvUmVjb3JkPiByZWNvcmQgPSBhdWRpb0ZsaW5nZXItPm9wZW5SZWNvcmQoaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsIG1Gb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFja0ZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm90aWZpY2F0aW9uRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlNZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyTWVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMpOwotICAgIEFMT0dFX0lGKG9yaWdpbmFsU2Vzc2lvbklkICE9IDAgJiYgbVNlc3Npb25JZCAhPSBvcmlnaW5hbFNlc3Npb25JZCwKKyAgICBBTE9HRV9JRihvcmlnaW5hbFNlc3Npb25JZCAhPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFICYmIG1TZXNzaW9uSWQgIT0gb3JpZ2luYWxTZXNzaW9uSWQsCiAgICAgICAgICAgICAic2Vzc2lvbiBJRCBjaGFuZ2VkIGZyb20gJWQgdG8gJWQiLCBvcmlnaW5hbFNlc3Npb25JZCwgbVNlc3Npb25JZCk7CiAKLSAgICBpZiAocmVjb3JkID09IDAgfHwgc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICBBTE9HRSgiQXVkaW9GbGluZ2VyIGNvdWxkIG5vdCBjcmVhdGUgcmVjb3JkIHRyYWNrLCBzdGF0dXM6ICVkIiwgc3RhdHVzKTsKLSAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VJbnB1dChpbnB1dCk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIGdvdG8gcmVsZWFzZTsKICAgICB9Ci0gICAgc3A8SU1lbW9yeT4gaU1lbSA9IHJlY29yZC0+Z2V0Q2JsaygpOworICAgIEFMT0dfQVNTRVJUKHJlY29yZCAhPSAwKTsKKworICAgIC8vIEF1ZGlvRmxpbmdlciBub3cgb3ducyB0aGUgcmVmZXJlbmNlIHRvIHRoZSBJL08gaGFuZGxlLAorICAgIC8vIHNvIHdlIGFyZSBubyBsb25nZXIgcmVzcG9uc2libGUgZm9yIHJlbGVhc2luZyBpdC4KKwogICAgIGlmIChpTWVtID09IDApIHsKICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgY29udHJvbCBibG9jayIpOwogICAgICAgICByZXR1cm4gTk9fSU5JVDsKQEAgLTQ4OSwzNyArNDk4LDY3IEBACiAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2sgcG9pbnRlciIpOwogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CisgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gc3RhdGljX2Nhc3Q8YXVkaW9fdHJhY2tfY2Jsa190Kj4oaU1lbVBvaW50ZXIpOworCisgICAgLy8gU3RhcnRpbmcgYWRkcmVzcyBvZiBidWZmZXJzIGluIHNoYXJlZCBtZW1vcnkuCisgICAgLy8gVGhlIGJ1ZmZlcnMgYXJlIGVpdGhlciBpbW1lZGlhdGVseSBhZnRlciB0aGUgY29udHJvbCBibG9jaywKKyAgICAvLyBvciBpbiBhIHNlcGFyYXRlIGFyZWEgYXQgZGlzY3JldGlvbiBvZiBzZXJ2ZXIuCisgICAgdm9pZCAqYnVmZmVyczsKKyAgICBpZiAoYnVmZmVyTWVtID09IDApIHsKKyAgICAgICAgYnVmZmVycyA9IGNibGsgKyAxOworICAgIH0gZWxzZSB7CisgICAgICAgIGJ1ZmZlcnMgPSBidWZmZXJNZW0tPnBvaW50ZXIoKTsKKyAgICAgICAgaWYgKGJ1ZmZlcnMgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgYnVmZmVyIHBvaW50ZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gaW52YXJpYW50IHRoYXQgbUF1ZGlvUmVjb3JkICE9IDAgaXMgdHJ1ZSBvbmx5IGFmdGVyIHNldCgpIHJldHVybnMgc3VjY2Vzc2Z1bGx5CiAgICAgaWYgKG1BdWRpb1JlY29yZCAhPSAwKSB7CiAgICAgICAgIG1BdWRpb1JlY29yZC0+YXNCaW5kZXIoKS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgdGhpcyk7CiAgICAgICAgIG1EZWF0aE5vdGlmaWVyLmNsZWFyKCk7CiAgICAgfQotICAgIG1JbnB1dCA9IGlucHV0OwogICAgIG1BdWRpb1JlY29yZCA9IHJlY29yZDsKICAgICBtQ2Jsa01lbW9yeSA9IGlNZW07Ci0gICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gc3RhdGljX2Nhc3Q8YXVkaW9fdHJhY2tfY2Jsa190Kj4oaU1lbVBvaW50ZXIpOworICAgIG1CdWZmZXJNZW1vcnkgPSBidWZmZXJNZW07CisgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOworCiAgICAgbUNibGsgPSBjYmxrOwotICAgIC8vIEZJWE1FIG1pc3NpbmcgZmFzdCB0cmFjayBmcmFtZUNvdW50IGxvZ2ljCisgICAgLy8gbm90ZSB0aGF0IHRlbXAgaXMgdGhlIChwb3NzaWJseSByZXZpc2VkKSB2YWx1ZSBvZiBmcmFtZUNvdW50CisgICAgaWYgKHRlbXAgPCBmcmFtZUNvdW50IHx8IChmcmFtZUNvdW50ID09IDAgJiYgdGVtcCA9PSAwKSkgeworICAgICAgICBBTE9HVygiUmVxdWVzdGVkIGZyYW1lQ291bnQgJXp1IGJ1dCByZWNlaXZlZCBmcmFtZUNvdW50ICV6dSIsIGZyYW1lQ291bnQsIHRlbXApOworICAgIH0KKyAgICBmcmFtZUNvdW50ID0gdGVtcDsKKwogICAgIG1Bd2FpdEJvb3N0ID0gZmFsc2U7CiAgICAgaWYgKG1GbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkgewogICAgICAgICBpZiAodHJhY2tGbGFncyAmIElBdWRpb0ZsaW5nZXI6OlRSQUNLX0ZBU1QpIHsKLSAgICAgICAgICAgIEFMT0dWKCJBVURJT19JTlBVVF9GTEFHX0ZBU1Qgc3VjY2Vzc2Z1bDsgZnJhbWVDb3VudCAldSIsIG1GcmFtZUNvdW50KTsKKyAgICAgICAgICAgIEFMT0dWKCJBVURJT19JTlBVVF9GTEFHX0ZBU1Qgc3VjY2Vzc2Z1bDsgZnJhbWVDb3VudCAlenUiLCBmcmFtZUNvdW50KTsKICAgICAgICAgICAgIG1Bd2FpdEJvb3N0ID0gdHJ1ZTsKLSAgICAgICAgICAgIC8vIGRvdWJsZS1idWZmZXJpbmcgaXMgbm90IHJlcXVpcmVkIGZvciBmYXN0IHRyYWNrcywgZHVlIHRvIHRpZ2h0ZXIgc2NoZWR1bGluZwotICAgICAgICAgICAgaWYgKG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPT0gMCB8fCBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID4gbUZyYW1lQ291bnQpIHsKLSAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID0gbUZyYW1lQ291bnQ7Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVigiQVVESU9fSU5QVVRfRkxBR19GQVNUIGRlbmllZCBieSBzZXJ2ZXI7IGZyYW1lQ291bnQgJXUiLCBtRnJhbWVDb3VudCk7CisgICAgICAgICAgICBBTE9HVigiQVVESU9fSU5QVVRfRkxBR19GQVNUIGRlbmllZCBieSBzZXJ2ZXI7IGZyYW1lQ291bnQgJXp1IiwgZnJhbWVDb3VudCk7CiAgICAgICAgICAgICAvLyBvbmNlIGRlbmllZCwgZG8gbm90IHJlcXVlc3QgYWdhaW4gaWYgSUF1ZGlvUmVjb3JkIGlzIHJlLWNyZWF0ZWQKICAgICAgICAgICAgIG1GbGFncyA9IChhdWRpb19pbnB1dF9mbGFnc190KSAobUZsYWdzICYgfkFVRElPX0lOUFVUX0ZMQUdfRkFTVCk7Ci0gICAgICAgICAgICBpZiAobU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9PSAwIHx8IG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPiBtRnJhbWVDb3VudC8yKSB7Ci0gICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9IG1GcmFtZUNvdW50LzI7Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBzdGFydGluZyBhZGRyZXNzIG9mIGJ1ZmZlcnMgaW4gc2hhcmVkIG1lbW9yeQotICAgIHZvaWQgKmJ1ZmZlcnMgPSAoY2hhciopY2JsayArIHNpemVvZihhdWRpb190cmFja19jYmxrX3QpOworICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGFwcGxpY2F0aW9uIGlzIG5vdGlmaWVkIHdpdGggc3VmZmljaWVudCBtYXJnaW4gYmVmb3JlIG92ZXJydW4KKyAgICBpZiAobm90aWZpY2F0aW9uRnJhbWVzID09IDAgfHwgbm90aWZpY2F0aW9uRnJhbWVzID4gZnJhbWVDb3VudCkgeworICAgICAgICBBTE9HVygiUmVjZWl2ZWQgbm90aWZpY2F0aW9uRnJhbWVzICV6dSBmb3IgZnJhbWVDb3VudCAlenUiLCBub3RpZmljYXRpb25GcmFtZXMsIGZyYW1lQ291bnQpOworICAgIH0KKyAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID0gbm90aWZpY2F0aW9uRnJhbWVzOworCisgICAgLy8gV2UgcmV0YWluIGEgY29weSBvZiB0aGUgSS9PIGhhbmRsZSwgYnV0IGRvbid0IG93biB0aGUgcmVmZXJlbmNlCisgICAgbUlucHV0ID0gaW5wdXQ7CisgICAgbVJlZnJlc2hSZW1haW5pbmcgPSB0cnVlOworCisgICAgbUZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworICAgIC8vIElmIElBdWRpb1JlY29yZCBpcyByZS1jcmVhdGVkLCBkb24ndCBsZXQgdGhlIHJlcXVlc3RlZCBmcmFtZUNvdW50CisgICAgLy8gZGVjcmVhc2UuICBUaGlzIGNhbiBjb25mdXNlIGNsaWVudHMgdGhhdCBjYWNoZSBmcmFtZUNvdW50KCkuCisgICAgaWYgKGZyYW1lQ291bnQgPiBtUmVxRnJhbWVDb3VudCkgeworICAgICAgICBtUmVxRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CisgICAgfQogCiAgICAgLy8gdXBkYXRlIHByb3h5CiAgICAgbVByb3h5ID0gbmV3IEF1ZGlvUmVjb3JkQ2xpZW50UHJveHkoY2JsaywgYnVmZmVycywgbUZyYW1lQ291bnQsIG1GcmFtZVNpemUpOwpAQCAtNTMwLDYgKzU2OSwxNCBAQAogICAgIG1BdWRpb1JlY29yZC0+YXNCaW5kZXIoKS0+bGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIsIHRoaXMpOwogCiAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworcmVsZWFzZToKKyAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUlucHV0KGlucHV0LCAoYXVkaW9fc2Vzc2lvbl90KW1TZXNzaW9uSWQpOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogc3RhdHVzX3QgQXVkaW9SZWNvcmQ6Om9idGFpbkJ1ZmZlcihCdWZmZXIqIGF1ZGlvQnVmZmVyLCBpbnQzMl90IHdhaXRDb3VudCkKQEAgLTU4MCw2ICs2MjcsNyBAQAogICAgICAgICAvLyBrZWVwIHRoZW0gZnJvbSBnb2luZyBhd2F5IGlmIGFub3RoZXIgdGhyZWFkIHJlLWNyZWF0ZXMgdGhlIHRyYWNrIGR1cmluZyBvYnRhaW5CdWZmZXIoKQogICAgICAgICBzcDxBdWRpb1JlY29yZENsaWVudFByb3h5PiBwcm94eTsKICAgICAgICAgc3A8SU1lbW9yeT4gaU1lbTsKKyAgICAgICAgc3A8SU1lbW9yeT4gYnVmZmVyTWVtOwogICAgICAgICB7CiAgICAgICAgICAgICAvLyBzdGFydCBvZiBsb2NrIHNjb3BlCiAgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CkBAIC01OTEsNiArNjM5LDkgQEAKICAgICAgICAgICAgICAgICBpZiAobmV3U2VxdWVuY2UgPT0gb2xkU2VxdWVuY2UpIHsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gcmVzdG9yZVJlY29yZF9sKCJvYnRhaW5CdWZmZXIiKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLm1GcmFtZUNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5tUmF3ID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5tTm9uQ29udGlnID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtNjAwLDYgKzY1MSw3IEBACiAgICAgICAgICAgICAvLyBLZWVwIHRoZSBleHRyYSByZWZlcmVuY2VzCiAgICAgICAgICAgICBwcm94eSA9IG1Qcm94eTsKICAgICAgICAgICAgIGlNZW0gPSBtQ2Jsa01lbW9yeTsKKyAgICAgICAgICAgIGJ1ZmZlck1lbSA9IG1CdWZmZXJNZW1vcnk7CiAKICAgICAgICAgICAgIC8vIE5vbi1ibG9ja2luZyBpZiB0cmFjayBpcyBzdG9wcGVkCiAgICAgICAgICAgICBpZiAoIW1BY3RpdmUpIHsKQEAgLTY2MCw3ICs3MTIsNyBAQAogICAgIGlmIChzc2l6ZV90KHVzZXJTaXplKSA8IDAgfHwgKGJ1ZmZlciA9PSBOVUxMICYmIHVzZXJTaXplICE9IDApKSB7CiAgICAgICAgIC8vIHNhbml0eS1jaGVjay4gdXNlciBpcyBtb3N0LWxpa2VseSBwYXNzaW5nIGFuIGVycm9yIGNvZGUsIGFuZCBpdCB3b3VsZAogICAgICAgICAvLyBtYWtlIHRoZSByZXR1cm4gdmFsdWUgYW1iaWd1b3VzIChhY3R1YWxTaXplIHZzIGVycm9yKS4KLSAgICAgICAgQUxPR0UoIkF1ZGlvUmVjb3JkOjpyZWFkKGJ1ZmZlcj0lcCwgc2l6ZT0ldSAoJWQpIiwgYnVmZmVyLCB1c2VyU2l6ZSwgdXNlclNpemUpOworICAgICAgICBBTE9HRSgiQXVkaW9SZWNvcmQ6OnJlYWQoYnVmZmVyPSVwLCBzaXplPSV6dSAoJXp1KSIsIGJ1ZmZlciwgdXNlclNpemUsIHVzZXJTaXplKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKQEAgLTY5Miw3ICs3NDQsNyBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLW5zZWNzX3QgQXVkaW9SZWNvcmQ6OnByb2Nlc3NBdWRpb0J1ZmZlcihjb25zdCBzcDxBdWRpb1JlY29yZFRocmVhZD4mIHRocmVhZCkKK25zZWNzX3QgQXVkaW9SZWNvcmQ6OnByb2Nlc3NBdWRpb0J1ZmZlcigpCiB7CiAgICAgbUxvY2subG9jaygpOwogICAgIGlmIChtQXdhaXRCb29zdCkgewpAQCAtNzYwLDE3ICs4MTIsMTcgQEAKICAgICB9CiAKICAgICAvLyBDYWNoZSBvdGhlciBmaWVsZHMgdGhhdCB3aWxsIGJlIG5lZWRlZCBzb29uCi0gICAgc2l6ZV90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IG1Ob3RpZmljYXRpb25GcmFtZXNBY3Q7CisgICAgdWludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gbU5vdGlmaWNhdGlvbkZyYW1lc0FjdDsKICAgICBpZiAobVJlZnJlc2hSZW1haW5pbmcpIHsKICAgICAgICAgbVJlZnJlc2hSZW1haW5pbmcgPSBmYWxzZTsKICAgICAgICAgbVJlbWFpbmluZ0ZyYW1lcyA9IG5vdGlmaWNhdGlvbkZyYW1lczsKICAgICAgICAgbVJldHJ5T25QYXJ0aWFsQnVmZmVyID0gZmFsc2U7CiAgICAgfQogICAgIHNpemVfdCBtaXNhbGlnbm1lbnQgPSBtUHJveHktPmdldE1pc2FsaWdubWVudCgpOwotICAgIGludDMyX3Qgc2VxdWVuY2UgPSBtU2VxdWVuY2U7CisgICAgdWludDMyX3Qgc2VxdWVuY2UgPSBtU2VxdWVuY2U7CiAKICAgICAvLyBUaGVzZSBmaWVsZHMgZG9uJ3QgbmVlZCB0byBiZSBjYWNoZWQsIGJlY2F1c2UgdGhleSBhcmUgYXNzaWduZWQgb25seSBieSBzZXQoKToKLSAgICAvLyAgICAgIG1UcmFuc2ZlciwgbUNiZiwgbVVzZXJEYXRhLCBtU2FtcGxlUmF0ZQorICAgIC8vICAgICAgbVRyYW5zZmVyLCBtQ2JmLCBtVXNlckRhdGEsIG1TYW1wbGVSYXRlLCBtRnJhbWVTaXplCiAKICAgICBtTG9jay51bmxvY2soKTsKIApAQCAtODQxLDExICs4OTMsMTEgQEAKICAgICAgICAgc2l6ZV90IG5vbkNvbnRpZzsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gb2J0YWluQnVmZmVyKCZhdWRpb0J1ZmZlciwgcmVxdWVzdGVkLCBOVUxMLCAmbm9uQ29udGlnKTsKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigoZXJyICE9IE5PX0VSUk9SKSAhPSAoYXVkaW9CdWZmZXIuZnJhbWVDb3VudCA9PSAwKSwKLSAgICAgICAgICAgICAgICAib2J0YWluQnVmZmVyKCkgZXJyPSVkIGZyYW1lQ291bnQ9JXUiLCBlcnIsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgICJvYnRhaW5CdWZmZXIoKSBlcnI9JWQgZnJhbWVDb3VudD0lenUiLCBlcnIsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQpOwogICAgICAgICByZXF1ZXN0ZWQgPSAmQ2xpZW50UHJveHk6OmtOb25CbG9ja2luZzsKICAgICAgICAgc2l6ZV90IGF2YWlsID0gYXVkaW9CdWZmZXIuZnJhbWVDb3VudCArIG5vbkNvbnRpZzsKLSAgICAgICAgQUxPR1YoIm9idGFpbkJ1ZmZlcigldSkgcmV0dXJuZWQgJXUgPSAldSArICV1IiwKLSAgICAgICAgICAgICAgICBtUmVtYWluaW5nRnJhbWVzLCBhdmFpbCwgYXVkaW9CdWZmZXIuZnJhbWVDb3VudCwgbm9uQ29udGlnKTsKKyAgICAgICAgQUxPR1YoIm9idGFpbkJ1ZmZlcigldSkgcmV0dXJuZWQgJXp1ID0gJXp1ICsgJXp1IGVyciAlZCIsCisgICAgICAgICAgICAgICAgbVJlbWFpbmluZ0ZyYW1lcywgYXZhaWwsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQsIG5vbkNvbnRpZywgZXJyKTsKICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgaWYgKGVyciA9PSBUSU1FRF9PVVQgfHwgZXJyID09IFdPVUxEX0JMT0NLIHx8IGVyciA9PSAtRUlOVFIpIHsKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTg3Miw4ICs5MjQsOCBAQAogCiAgICAgICAgIC8vIFNhbml0eSBjaGVjayBvbiByZXR1cm5lZCBzaXplCiAgICAgICAgIGlmIChzc2l6ZV90KHJlYWRTaXplKSA8IDAgfHwgcmVhZFNpemUgPiByZXFTaXplKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRVZFTlRfTU9SRV9EQVRBIHJlcXVlc3RlZCAldSBieXRlcyBidXQgY2FsbGJhY2sgcmV0dXJuZWQgJWQgYnl0ZXMiLAotICAgICAgICAgICAgICAgICAgICByZXFTaXplLCAoaW50KSByZWFkU2l6ZSk7CisgICAgICAgICAgICBBTE9HRSgiRVZFTlRfTU9SRV9EQVRBIHJlcXVlc3RlZCAlenUgYnl0ZXMgYnV0IGNhbGxiYWNrIHJldHVybmVkICV6ZCBieXRlcyIsCisgICAgICAgICAgICAgICAgICAgIHJlcVNpemUsIHNzaXplX3QocmVhZFNpemUpKTsKICAgICAgICAgICAgIHJldHVybiBOU19ORVZFUjsKICAgICAgICAgfQogCkBAIC05MzIsNyArOTg0LDcgQEAKICAgICBzdGF0dXNfdCByZXN1bHQ7CiAKICAgICAvLyBpZiB0aGUgbmV3IElBdWRpb1JlY29yZCBpcyBjcmVhdGVkLCBvcGVuUmVjb3JkX2woKSB3aWxsIG1vZGlmeSB0aGUKLSAgICAvLyBmb2xsb3dpbmcgbWVtYmVyIHZhcmlhYmxlczogbUF1ZGlvUmVjb3JkLCBtQ2Jsa01lbW9yeSBhbmQgbUNibGsuCisgICAgLy8gZm9sbG93aW5nIG1lbWJlciB2YXJpYWJsZXM6IG1BdWRpb1JlY29yZCwgbUNibGtNZW1vcnksIG1DYmxrLCBtQnVmZmVyTWVtb3J5LgogICAgIC8vIEl0IHdpbGwgYWxzbyBkZWxldGUgdGhlIHN0cm9uZyByZWZlcmVuY2VzIG9uIHByZXZpb3VzIElBdWRpb1JlY29yZCBhbmQgSU1lbW9yeQogICAgIHNpemVfdCBwb3NpdGlvbiA9IG1Qcm94eS0+Z2V0UG9zaXRpb24oKTsKICAgICBtTmV3UG9zaXRpb24gPSBwb3NpdGlvbiArIG1VcGRhdGVQZXJpb2Q7CkBAIC05NTQsNyArMTAwNiw3IEBACiAKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotdm9pZCBBdWRpb1JlY29yZDo6RGVhdGhOb3RpZmllcjo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKQordm9pZCBBdWRpb1JlY29yZDo6RGVhdGhOb3RpZmllcjo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKQogewogICAgIHNwPEF1ZGlvUmVjb3JkPiBhdWRpb1JlY29yZCA9IG1BdWRpb1JlY29yZC5wcm9tb3RlKCk7CiAgICAgaWYgKGF1ZGlvUmVjb3JkICE9IDApIHsKQEAgLTk2Niw3ICsxMDE4LDggQEAKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogQXVkaW9SZWNvcmQ6OkF1ZGlvUmVjb3JkVGhyZWFkOjpBdWRpb1JlY29yZFRocmVhZChBdWRpb1JlY29yZCYgcmVjZWl2ZXIsIGJvb2wgYkNhbkNhbGxKYXZhKQotICAgIDogVGhyZWFkKGJDYW5DYWxsSmF2YSksIG1SZWNlaXZlcihyZWNlaXZlciksIG1QYXVzZWQodHJ1ZSksIG1QYXVzZWRJbnQoZmFsc2UpLCBtUGF1c2VkTnMoMExMKQorICAgIDogVGhyZWFkKGJDYW5DYWxsSmF2YSksIG1SZWNlaXZlcihyZWNlaXZlciksIG1QYXVzZWQodHJ1ZSksIG1QYXVzZWRJbnQoZmFsc2UpLCBtUGF1c2VkTnMoMExMKSwKKyAgICAgIG1JZ25vcmVOZXh0UGF1c2VkSW50KGZhbHNlKQogewogfQogCkBAIC05ODMsNiArMTAzNiwxMCBAQAogICAgICAgICAgICAgLy8gY2FsbGVyIHdpbGwgY2hlY2sgZm9yIGV4aXRQZW5kaW5nKCkKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CisgICAgICAgIGlmIChtSWdub3JlTmV4dFBhdXNlZEludCkgeworICAgICAgICAgICAgbUlnbm9yZU5leHRQYXVzZWRJbnQgPSBmYWxzZTsKKyAgICAgICAgICAgIG1QYXVzZWRJbnQgPSBmYWxzZTsKKyAgICAgICAgfQogICAgICAgICBpZiAobVBhdXNlZEludCkgewogICAgICAgICAgICAgaWYgKG1QYXVzZWROcyA+IDApIHsKICAgICAgICAgICAgICAgICAodm9pZCkgbU15Q29uZC53YWl0UmVsYXRpdmUobU15TG9jaywgbVBhdXNlZE5zKTsKQEAgLTk5Myw3ICsxMDUwLDcgQEAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQotICAgIG5zZWNzX3QgbnMgPSAgbVJlY2VpdmVyLnByb2Nlc3NBdWRpb0J1ZmZlcih0aGlzKTsKKyAgICBuc2Vjc190IG5zID0gIG1SZWNlaXZlci5wcm9jZXNzQXVkaW9CdWZmZXIoKTsKICAgICBzd2l0Y2ggKG5zKSB7CiAgICAgY2FzZSAwOgogICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTEwMDcsNyArMTA2NCw3IEBACiAgICAgICAgIG5zID0gMTAwMDAwMDAwMExMOwogICAgICAgICAvLyBmYWxsIHRocm91Z2gKICAgICBkZWZhdWx0OgotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG5zIDwgMCwgInByb2Nlc3NBdWRpb0J1ZmZlcigpIHJldHVybmVkICVsbGQiLCBucyk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobnMgPCAwLCAicHJvY2Vzc0F1ZGlvQnVmZmVyKCkgcmV0dXJuZWQgJSIgUFJJZDY0LCBucyk7CiAgICAgICAgIHBhdXNlSW50ZXJuYWwobnMpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CkBAIC0xMDE3LDEyICsxMDc0LDcgQEAKIHsKICAgICAvLyBtdXN0IGJlIGluIHRoaXMgb3JkZXIgdG8gYXZvaWQgYSByYWNlIGNvbmRpdGlvbgogICAgIFRocmVhZDo6cmVxdWVzdEV4aXQoKTsKLSAgICBBdXRvTXV0ZXggX2wobU15TG9jayk7Ci0gICAgaWYgKG1QYXVzZWQgfHwgbVBhdXNlZEludCkgewotICAgICAgICBtUGF1c2VkID0gZmFsc2U7Ci0gICAgICAgIG1QYXVzZWRJbnQgPSBmYWxzZTsKLSAgICAgICAgbU15Q29uZC5zaWduYWwoKTsKLSAgICB9CisgICAgcmVzdW1lKCk7CiB9CiAKIHZvaWQgQXVkaW9SZWNvcmQ6OkF1ZGlvUmVjb3JkVGhyZWFkOjpwYXVzZSgpCkBAIC0xMDM0LDYgKzEwODYsNyBAQAogdm9pZCBBdWRpb1JlY29yZDo6QXVkaW9SZWNvcmRUaHJlYWQ6OnJlc3VtZSgpCiB7CiAgICAgQXV0b011dGV4IF9sKG1NeUxvY2spOworICAgIG1JZ25vcmVOZXh0UGF1c2VkSW50ID0gdHJ1ZTsKICAgICBpZiAobVBhdXNlZCB8fCBtUGF1c2VkSW50KSB7CiAgICAgICAgIG1QYXVzZWQgPSBmYWxzZTsKICAgICAgICAgbVBhdXNlZEludCA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQXVkaW9TeXN0ZW0uY3BwIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9TeXN0ZW0uY3BwCmluZGV4IDgwMzNjMmMuLmRkYTM2NTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvU3lzdGVtLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1N5c3RlbS5jcHAKQEAgLTM1LDE2ICszNSwxNyBAQAogc3A8SUF1ZGlvRmxpbmdlcj4gQXVkaW9TeXN0ZW06OmdBdWRpb0ZsaW5nZXI7CiBzcDxBdWRpb1N5c3RlbTo6QXVkaW9GbGluZ2VyQ2xpZW50PiBBdWRpb1N5c3RlbTo6Z0F1ZGlvRmxpbmdlckNsaWVudDsKIGF1ZGlvX2Vycm9yX2NhbGxiYWNrIEF1ZGlvU3lzdGVtOjpnQXVkaW9FcnJvckNhbGxiYWNrID0gTlVMTDsKLS8vIENhY2hlZCB2YWx1ZXMKIAotRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90LCBBdWRpb1N5c3RlbTo6T3V0cHV0RGVzY3JpcHRvciAqPiBBdWRpb1N5c3RlbTo6Z091dHB1dHMoMCk7CisvLyBDYWNoZWQgdmFsdWVzIGZvciBvdXRwdXQgaGFuZGxlcworRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90LCBBdWRpb1N5c3RlbTo6T3V0cHV0RGVzY3JpcHRvciAqPiBBdWRpb1N5c3RlbTo6Z091dHB1dHMoTlVMTCk7CiAKIC8vIENhY2hlZCB2YWx1ZXMgZm9yIHJlY29yZGluZyBxdWVyaWVzLCBhbGwgcHJvdGVjdGVkIGJ5IGdMb2NrCi11aW50MzJfdCBBdWRpb1N5c3RlbTo6Z1ByZXZJblNhbXBsaW5nUmF0ZSA9IDE2MDAwOwotYXVkaW9fZm9ybWF0X3QgQXVkaW9TeXN0ZW06OmdQcmV2SW5Gb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKLWF1ZGlvX2NoYW5uZWxfbWFza190IEF1ZGlvU3lzdGVtOjpnUHJldkluQ2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX0lOX01PTk87Ci1zaXplX3QgQXVkaW9TeXN0ZW06OmdJbkJ1ZmZTaXplID0gMDsKK3VpbnQzMl90IEF1ZGlvU3lzdGVtOjpnUHJldkluU2FtcGxpbmdSYXRlOworYXVkaW9fZm9ybWF0X3QgQXVkaW9TeXN0ZW06OmdQcmV2SW5Gb3JtYXQ7CithdWRpb19jaGFubmVsX21hc2tfdCBBdWRpb1N5c3RlbTo6Z1ByZXZJbkNoYW5uZWxNYXNrOworc2l6ZV90IEF1ZGlvU3lzdGVtOjpnSW5CdWZmU2l6ZSA9IDA7ICAgIC8vIHplcm8gaW5kaWNhdGVzIGNhY2hlIGlzIGludmFsaWQKIAorc3A8QXVkaW9TeXN0ZW06OkF1ZGlvUG9ydENhbGxiYWNrPiBBdWRpb1N5c3RlbTo6Z0F1ZGlvUG9ydENhbGxiYWNrOwogCiAvLyBlc3RhYmxpc2ggYmluZGVyIGludGVyZmFjZSB0byBBdWRpb0ZsaW5nZXIgc2VydmljZQogY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpCkBAIC04NCwxMyArODUsMTUgQEAKICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjptdXRlTWljcm9waG9uZShib29sIHN0YXRlKSB7CitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6bXV0ZU1pY3JvcGhvbmUoYm9vbCBzdGF0ZSkKK3sKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIHJldHVybiBhZi0+c2V0TWljTXV0ZShzdGF0ZSk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjppc01pY3JvcGhvbmVNdXRlZChib29sKiBzdGF0ZSkgeworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmlzTWljcm9waG9uZU11dGVkKGJvb2wqIHN0YXRlKQorewogICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwogICAgIGlmIChhZiA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgKnN0YXRlID0gYWYtPmdldE1pY011dGUoKTsKQEAgLTE3NSwxMyArMTc4LDE1IEBACiAgICAgcmV0dXJuIGFmLT5zZXRNb2RlKG1vZGUpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycykgeworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpCit7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICByZXR1cm4gYWYtPnNldFBhcmFtZXRlcnMoaW9IYW5kbGUsIGtleVZhbHVlUGFpcnMpOwogfQogCi1TdHJpbmc4IEF1ZGlvU3lzdGVtOjpnZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlzKSB7CitTdHJpbmc4IEF1ZGlvU3lzdGVtOjpnZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlzKQorewogICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwogICAgIFN0cmluZzggcmVzdWx0ID0gU3RyaW5nOCgiIik7CiAgICAgaWYgKGFmID09IDApIHJldHVybiByZXN1bHQ7CkBAIC0xOTAsNiArMTk1LDE2IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAorc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycykKK3sKKyAgICByZXR1cm4gc2V0UGFyYW1ldGVycyhBVURJT19JT19IQU5ETEVfTk9ORSwga2V5VmFsdWVQYWlycyk7Cit9CisKK1N0cmluZzggQXVkaW9TeXN0ZW06OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cykKK3sKKyAgICByZXR1cm4gZ2V0UGFyYW1ldGVycyhBVURJT19JT19IQU5ETEVfTk9ORSwga2V5cyk7Cit9CisKIC8vIGNvbnZlcnQgdm9sdW1lIHN0ZXBzIHRvIG5hdHVyYWwgbG9nIHNjYWxlCiAKIC8vIGNoYW5nZSB0aGlzIHZhbHVlIHRvIGNoYW5nZSB2b2x1bWUgc2NhbGluZwpAQCAtMjI3LDExICsyNDIsMjMgQEAKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KIAotICAgIHJldHVybiBnZXRTYW1wbGluZ1JhdGUob3V0cHV0LCBzdHJlYW1UeXBlLCBzYW1wbGluZ1JhdGUpOworICAgIHJldHVybiBnZXRTYW1wbGluZ1JhdGUob3V0cHV0LCBzYW1wbGluZ1JhdGUpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0U2FtcGxpbmdSYXRlRm9yQXR0cih1aW50MzJfdCogc2FtcGxpbmdSYXRlLAorICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIpCit7CisgICAgaWYgKGF0dHIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBnZXRPdXRwdXRGb3JBdHRyKGF0dHIpOworICAgIGlmIChvdXRwdXQgPT0gMCkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIHJldHVybiBnZXRTYW1wbGluZ1JhdGUob3V0cHV0LCBzYW1wbGluZ1JhdGUpOwogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0U2FtcGxpbmdSYXRlKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogc2FtcGxpbmdSYXRlKQogewogICAgIE91dHB1dERlc2NyaXB0b3IgKm91dHB1dERlc2M7CkBAIC0yNDksOSArMjc2LDEyIEBACiAgICAgICAgICpzYW1wbGluZ1JhdGUgPSBvdXRwdXREZXNjLT5zYW1wbGluZ1JhdGU7CiAgICAgICAgIGdMb2NrLnVubG9jaygpOwogICAgIH0KKyAgICBpZiAoKnNhbXBsaW5nUmF0ZSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJBdWRpb1N5c3RlbTo6Z2V0U2FtcGxpbmdSYXRlIGZhaWxlZCBmb3Igb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CiAKLSAgICBBTE9HVigiZ2V0U2FtcGxpbmdSYXRlKCkgc3RyZWFtVHlwZSAlZCwgb3V0cHV0ICVkLCBzYW1wbGluZyByYXRlICV1Iiwgc3RyZWFtVHlwZSwgb3V0cHV0LAotICAgICAgICAgICAgKnNhbXBsaW5nUmF0ZSk7CisgICAgQUxPR1YoImdldFNhbXBsaW5nUmF0ZSgpIG91dHB1dCAlZCwgc2FtcGxpbmcgcmF0ZSAldSIsIG91dHB1dCwgKnNhbXBsaW5nUmF0ZSk7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC0yNjUsMTUgKzI5NSwxNCBAQAogICAgIH0KIAogICAgIG91dHB1dCA9IGdldE91dHB1dChzdHJlYW1UeXBlKTsKLSAgICBpZiAob3V0cHV0ID09IDApIHsKKyAgICBpZiAob3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CiAKLSAgICByZXR1cm4gZ2V0RnJhbWVDb3VudChvdXRwdXQsIHN0cmVhbVR5cGUsIGZyYW1lQ291bnQpOworICAgIHJldHVybiBnZXRGcmFtZUNvdW50KG91dHB1dCwgZnJhbWVDb3VudCk7CiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRGcmFtZUNvdW50KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogZnJhbWVDb3VudCkKIHsKICAgICBPdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjOwpAQCAtMjg5LDkgKzMxOCwxMiBAQAogICAgICAgICAqZnJhbWVDb3VudCA9IG91dHB1dERlc2MtPmZyYW1lQ291bnQ7CiAgICAgICAgIGdMb2NrLnVubG9jaygpOwogICAgIH0KKyAgICBpZiAoKmZyYW1lQ291bnQgPT0gMCkgeworICAgICAgICBBTE9HRSgiQXVkaW9TeXN0ZW06OmdldEZyYW1lQ291bnQgZmFpbGVkIGZvciBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KIAotICAgIEFMT0dWKCJnZXRGcmFtZUNvdW50KCkgc3RyZWFtVHlwZSAlZCwgb3V0cHV0ICVkLCBmcmFtZUNvdW50ICVkIiwgc3RyZWFtVHlwZSwgb3V0cHV0LAotICAgICAgICAgICAgKmZyYW1lQ291bnQpOworICAgIEFMT0dWKCJnZXRGcmFtZUNvdW50KCkgb3V0cHV0ICVkLCBmcmFtZUNvdW50ICV6dSIsIG91dHB1dCwgKmZyYW1lQ291bnQpOwogCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtMzA1LDE1ICszMzcsMTQgQEAKICAgICB9CiAKICAgICBvdXRwdXQgPSBnZXRPdXRwdXQoc3RyZWFtVHlwZSk7Ci0gICAgaWYgKG91dHB1dCA9PSAwKSB7CisgICAgaWYgKG91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQogCi0gICAgcmV0dXJuIGdldExhdGVuY3kob3V0cHV0LCBzdHJlYW1UeXBlLCBsYXRlbmN5KTsKKyAgICByZXR1cm4gZ2V0TGF0ZW5jeShvdXRwdXQsIGxhdGVuY3kpOwogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0TGF0ZW5jeShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogbGF0ZW5jeSkKIHsKICAgICBPdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjOwpAQCAtMzMwLDcgKzM2MSw3IEBACiAgICAgICAgIGdMb2NrLnVubG9jaygpOwogICAgIH0KIAotICAgIEFMT0dWKCJnZXRMYXRlbmN5KCkgc3RyZWFtVHlwZSAlZCwgb3V0cHV0ICVkLCBsYXRlbmN5ICVkIiwgc3RyZWFtVHlwZSwgb3V0cHV0LCAqbGF0ZW5jeSk7CisgICAgQUxPR1YoImdldExhdGVuY3koKSBvdXRwdXQgJWQsIGxhdGVuY3kgJWQiLCBvdXRwdXQsICpsYXRlbmN5KTsKIAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTM0OSw2ICszODAsMTIgQEAKICAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICAgICAgfQogICAgICAgICBpbkJ1ZmZTaXplID0gYWYtPmdldElucHV0QnVmZmVyU2l6ZShzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgaWYgKGluQnVmZlNpemUgPT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIkF1ZGlvU3lzdGVtOjpnZXRJbnB1dEJ1ZmZlclNpemUgZmFpbGVkIHNhbXBsZVJhdGUgJWQgZm9ybWF0ICUjeCBjaGFubmVsTWFzayAleCIsCisgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2spOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICAvLyBBIGJlbmlnbiByYWNlIGlzIHBvc3NpYmxlIGhlcmU6IHdlIGNvdWxkIG92ZXJ3cml0ZSBhIGZyZXNoZXIgY2FjaGUgZW50cnkKICAgICAgICAgZ0xvY2subG9jaygpOwogICAgICAgICAvLyBzYXZlIHRoZSByZXF1ZXN0IHBhcmFtcwogICAgICAgICBnUHJldkluU2FtcGxpbmdSYXRlID0gc2FtcGxlUmF0ZTsKQEAgLTM3MCw1NiArNDA3LDYwIEBACiAgICAgcmV0dXJuIGFmLT5zZXRWb2ljZVZvbHVtZSh2YWx1ZSk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRSZW5kZXJQb3NpdGlvbihhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIHNpemVfdCAqaGFsRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqZHNwRnJhbWVzLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRSZW5kZXJQb3NpdGlvbihhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIHVpbnQzMl90ICpoYWxGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmRzcEZyYW1lcykKIHsKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogCi0gICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fREVGQVVMVCkgewotICAgICAgICBzdHJlYW0gPSBBVURJT19TVFJFQU1fTVVTSUM7Ci0gICAgfQotCi0gICAgaWYgKG91dHB1dCA9PSAwKSB7Ci0gICAgICAgIG91dHB1dCA9IGdldE91dHB1dChzdHJlYW0pOwotICAgIH0KLQogICAgIHJldHVybiBhZi0+Z2V0UmVuZGVyUG9zaXRpb24oaGFsRnJhbWVzLCBkc3BGcmFtZXMsIG91dHB1dCk7CiB9CiAKLXNpemVfdCBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRGcmFtZXNMb3N0KGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKSB7Cit1aW50MzJfdCBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRGcmFtZXNMb3N0KGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKQorewogICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIHVuc2lnbmVkIGludCByZXN1bHQgPSAwOworICAgIHVpbnQzMl90IHJlc3VsdCA9IDA7CiAgICAgaWYgKGFmID09IDApIHJldHVybiByZXN1bHQ7Ci0gICAgaWYgKGlvSGFuZGxlID09IDApIHJldHVybiByZXN1bHQ7CisgICAgaWYgKGlvSGFuZGxlID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSByZXR1cm4gcmVzdWx0OwogCiAgICAgcmVzdWx0ID0gYWYtPmdldElucHV0RnJhbWVzTG9zdChpb0hhbmRsZSk7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotaW50IEF1ZGlvU3lzdGVtOjpuZXdBdWRpb1Nlc3Npb25JZCgpIHsKK2F1ZGlvX3VuaXF1ZV9pZF90IEF1ZGlvU3lzdGVtOjpuZXdBdWRpb1VuaXF1ZUlkKCkKK3sKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKLSAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIGFmLT5uZXdBdWRpb1Nlc3Npb25JZCgpOworICAgIGlmIChhZiA9PSAwKSByZXR1cm4gQVVESU9fVU5JUVVFX0lEX0FMTE9DQVRFOworICAgIHJldHVybiBhZi0+bmV3QXVkaW9VbmlxdWVJZCgpOwogfQogCi12b2lkIEF1ZGlvU3lzdGVtOjphY3F1aXJlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbikgewordm9pZCBBdWRpb1N5c3RlbTo6YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKGludCBhdWRpb1Nlc3Npb24sIHBpZF90IHBpZCkKK3sKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBpZiAoYWYgIT0gMCkgewotICAgICAgICBhZi0+YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKGF1ZGlvU2Vzc2lvbik7CisgICAgICAgIGFmLT5hY3F1aXJlQXVkaW9TZXNzaW9uSWQoYXVkaW9TZXNzaW9uLCBwaWQpOwogICAgIH0KIH0KIAotdm9pZCBBdWRpb1N5c3RlbTo6cmVsZWFzZUF1ZGlvU2Vzc2lvbklkKGludCBhdWRpb1Nlc3Npb24pIHsKK3ZvaWQgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uLCBwaWRfdCBwaWQpCit7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmICE9IDApIHsKLSAgICAgICAgYWYtPnJlbGVhc2VBdWRpb1Nlc3Npb25JZChhdWRpb1Nlc3Npb24pOworICAgICAgICBhZi0+cmVsZWFzZUF1ZGlvU2Vzc2lvbklkKGF1ZGlvU2Vzc2lvbiwgcGlkKTsKICAgICB9CiB9CiAKK2F1ZGlvX2h3X3N5bmNfdCBBdWRpb1N5c3RlbTo6Z2V0QXVkaW9Id1N5bmNGb3JTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHJldHVybiBBVURJT19IV19TWU5DX0lOVkFMSUQ7CisgICAgcmV0dXJuIGFmLT5nZXRBdWRpb0h3U3luY0ZvclNlc3Npb24oc2Vzc2lvbklkKTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXZvaWQgQXVkaW9TeXN0ZW06OkF1ZGlvRmxpbmdlckNsaWVudDo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKSB7Cit2b2lkIEF1ZGlvU3lzdGVtOjpBdWRpb0ZsaW5nZXJDbGllbnQ6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyBfX3VudXNlZCkKK3sKICAgICBNdXRleDo6QXV0b2xvY2sgX2woQXVkaW9TeXN0ZW06OmdMb2NrKTsKIAogICAgIEF1ZGlvU3lzdGVtOjpnQXVkaW9GbGluZ2VyLmNsZWFyKCk7CkBAIC00MzgsNyArNDc5LDcgQEAKICAgICBjb25zdCBPdXRwdXREZXNjcmlwdG9yICpkZXNjOwogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtOwogCi0gICAgaWYgKGlvSGFuZGxlID09IDApIHJldHVybjsKKyAgICBpZiAoaW9IYW5kbGUgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHJldHVybjsKIAogICAgIE11dGV4OjpBdXRvbG9jayBfbChBdWRpb1N5c3RlbTo6Z0xvY2spOwogCkBAIC00NTUsNyArNDk2LDcgQEAKIAogICAgICAgICBPdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjID0gIG5ldyBPdXRwdXREZXNjcmlwdG9yKCpkZXNjKTsKICAgICAgICAgZ091dHB1dHMuYWRkKGlvSGFuZGxlLCBvdXRwdXREZXNjKTsKLSAgICAgICAgQUxPR1YoImlvQ29uZmlnQ2hhbmdlZCgpIG5ldyBvdXRwdXQgc2FtcGxpbmdSYXRlICV1LCBmb3JtYXQgJWQgY2hhbm5lbCBtYXNrICUjeCBmcmFtZUNvdW50ICV1ICIKKyAgICAgICAgQUxPR1YoImlvQ29uZmlnQ2hhbmdlZCgpIG5ldyBvdXRwdXQgc2FtcGxpbmdSYXRlICV1LCBmb3JtYXQgJSN4IGNoYW5uZWwgbWFzayAlI3ggZnJhbWVDb3VudCAlenUgIgogICAgICAgICAgICAgICAgICJsYXRlbmN5ICVkIiwKICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5zYW1wbGluZ1JhdGUsIG91dHB1dERlc2MtPmZvcm1hdCwgb3V0cHV0RGVzYy0+Y2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+ZnJhbWVDb3VudCwgb3V0cHV0RGVzYy0+bGF0ZW5jeSk7CkBAIC00NzksOCArNTIwLDggQEAKICAgICAgICAgaWYgKHBhcmFtMiA9PSBOVUxMKSBicmVhazsKICAgICAgICAgZGVzYyA9IChjb25zdCBPdXRwdXREZXNjcmlwdG9yICopcGFyYW0yOwogCi0gICAgICAgIEFMT0dWKCJpb0NvbmZpZ0NoYW5nZWQoKSBuZXcgY29uZmlnIGZvciBvdXRwdXQgJWQgc2FtcGxpbmdSYXRlICV1LCBmb3JtYXQgJWQgY2hhbm5lbCBtYXNrICUjeCAiCi0gICAgICAgICAgICAgICAgImZyYW1lQ291bnQgJWQgbGF0ZW5jeSAlZCIsCisgICAgICAgIEFMT0dWKCJpb0NvbmZpZ0NoYW5nZWQoKSBuZXcgY29uZmlnIGZvciBvdXRwdXQgJWQgc2FtcGxpbmdSYXRlICV1LCBmb3JtYXQgJSN4IGNoYW5uZWwgbWFzayAlI3ggIgorICAgICAgICAgICAgICAgICJmcmFtZUNvdW50ICV6dSBsYXRlbmN5ICVkIiwKICAgICAgICAgICAgICAgICBpb0hhbmRsZSwgZGVzYy0+c2FtcGxpbmdSYXRlLCBkZXNjLT5mb3JtYXQsCiAgICAgICAgICAgICAgICAgZGVzYy0+Y2hhbm5lbE1hc2ssIGRlc2MtPmZyYW1lQ291bnQsIGRlc2MtPmxhdGVuY3kpOwogICAgICAgICBPdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjID0gZ091dHB1dHMudmFsdWVBdChpbmRleCk7CkBAIC00OTYsMTIgKzUzNywxNSBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb1N5c3RlbTo6c2V0RXJyb3JDYWxsYmFjayhhdWRpb19lcnJvcl9jYWxsYmFjayBjYikgewordm9pZCBBdWRpb1N5c3RlbTo6c2V0RXJyb3JDYWxsYmFjayhhdWRpb19lcnJvcl9jYWxsYmFjayBjYikKK3sKICAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2spOwogICAgIGdBdWRpb0Vycm9yQ2FsbGJhY2sgPSBjYjsKIH0KIAotYm9vbCBBdWRpb1N5c3RlbTo6cm91dGVkVG9BMmRwT3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkgeworCitib29sIEF1ZGlvU3lzdGVtOjpyb3V0ZWRUb0EyZHBPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKQorewogICAgIHN3aXRjaCAoc3RyZWFtVHlwZSkgewogICAgIGNhc2UgQVVESU9fU1RSRUFNX01VU0lDOgogICAgIGNhc2UgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEw6CkBAIC01MzksNyArNTgzLDEyIEBACiAgICAgICAgIGJpbmRlci0+bGlua1RvRGVhdGgoZ0F1ZGlvUG9saWN5U2VydmljZUNsaWVudCk7CiAgICAgICAgIGdBdWRpb1BvbGljeVNlcnZpY2UgPSBpbnRlcmZhY2VfY2FzdDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPihiaW5kZXIpOwogICAgICAgICBnTG9jay51bmxvY2soKTsKKyAgICAgICAgLy8gUmVnaXN0ZXJpbmcgdGhlIGNsaWVudCB0YWtlcyB0aGUgQXVkaW9Qb2xpY3lTZXJ2aWNlIGxvY2suCisgICAgICAgIC8vIERvbid0IGhvbGQgdGhlIEF1ZGlvU3lzdGVtIGxvY2sgYXQgdGhlIHNhbWUgdGltZS4KKyAgICAgICAgZ0F1ZGlvUG9saWN5U2VydmljZS0+cmVnaXN0ZXJDbGllbnQoZ0F1ZGlvUG9saWN5U2VydmljZUNsaWVudCk7CiAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVGhlcmUgZXhpc3RzIGEgYmVuaWduIHJhY2UgY29uZGl0aW9uIHdoZXJlIGdBdWRpb1BvbGljeVNlcnZpY2UKKyAgICAgICAgLy8gaXMgc2V0LCBidXQgZ0F1ZGlvUG9saWN5U2VydmljZUNsaWVudCBpcyBub3QgeWV0IHJlZ2lzdGVyZWQuCiAgICAgICAgIGdMb2NrLnVubG9jaygpOwogICAgIH0KICAgICByZXR1cm4gZ0F1ZGlvUG9saWN5U2VydmljZTsKQEAgLTYwOCw2ICs2NTcsMTkgQEAKICAgICByZXR1cm4gYXBzLT5nZXRPdXRwdXQoc3RyZWFtLCBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZsYWdzLCBvZmZsb2FkSW5mbyk7CiB9CiAKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCit7CisgICAgaWYgKGF0dHIgPT0gTlVMTCkgcmV0dXJuIDA7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiAwOworICAgIHJldHVybiBhcHMtPmdldE91dHB1dEZvckF0dHIoYXR0ciwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmbGFncywgb2ZmbG9hZEluZm8pOworfQorCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKQpAQCAtNjM3LDMyICs2OTksMzYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gMDsKLSAgICByZXR1cm4gYXBzLT5nZXRJbnB1dChpbnB1dFNvdXJjZSwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBzZXNzaW9uSWQpOworICAgIHJldHVybiBhcHMtPmdldElucHV0KGlucHV0U291cmNlLCBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIHNlc3Npb25JZCwgZmxhZ3MpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICByZXR1cm4gYXBzLT5zdGFydElucHV0KGlucHV0KTsKKyAgICByZXR1cm4gYXBzLT5zdGFydElucHV0KGlucHV0LCBzZXNzaW9uKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgcmV0dXJuIGFwcy0+c3RvcElucHV0KGlucHV0KTsKKyAgICByZXR1cm4gYXBzLT5zdG9wSW5wdXQoaW5wdXQsIHNlc3Npb24pOwogfQogCi12b2lkIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpCit2b2lkIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybjsKLSAgICBhcHMtPnJlbGVhc2VJbnB1dChpbnB1dCk7CisgICAgYXBzLT5yZWxlYXNlSW5wdXQoaW5wdXQsIHNlc3Npb24pOwogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6aW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKQEAgLTcwMiwxNCArNzY4LDE1IEBACiBhdWRpb19kZXZpY2VzX3QgQXVkaW9TeXN0ZW06OmdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKLSAgICBpZiAoYXBzID09IDApIHJldHVybiAoYXVkaW9fZGV2aWNlc190KTA7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7CiAgICAgcmV0dXJuIGFwcy0+Z2V0RGV2aWNlc0ZvclN0cmVhbShzdHJlYW0pOwogfQogCiBhdWRpb19pb19oYW5kbGVfdCBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0Rm9yRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKLSAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAvLyBGSVhNRSBjaGFuZ2UgcmV0dXJuIHR5cGUgdG8gc3RhdHVzX3QsIGFuZCByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQgaGVyZQorICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgIHJldHVybiBhcHMtPmdldE91dHB1dEZvckVmZmVjdChkZXNjKTsKIH0KIApAQCAtODAyLDEzICs4NjksMTEyIEBACiAgICAgcmV0dXJuIGFwcy0+aXNPZmZsb2FkU3VwcG9ydGVkKGluZm8pOwogfQogCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6bGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5saXN0QXVkaW9Qb3J0cyhyb2xlLCB0eXBlLCBudW1fcG9ydHMsIHBvcnRzLCBnZW5lcmF0aW9uKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPmdldEF1ZGlvUG9ydChwb3J0KTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPmNyZWF0ZUF1ZGlvUGF0Y2gocGF0Y2gsIGhhbmRsZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5yZWxlYXNlQXVkaW9QYXRjaChoYW5kbGUpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6bGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5saXN0QXVkaW9QYXRjaGVzKG51bV9wYXRjaGVzLCBwYXRjaGVzLCBnZW5lcmF0aW9uKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPnNldEF1ZGlvUG9ydENvbmZpZyhjb25maWcpOworfQorCit2b2lkIEF1ZGlvU3lzdGVtOjpzZXRBdWRpb1BvcnRDYWxsYmFjayhzcDxBdWRpb1BvcnRDYWxsYmFjaz4gY2FsbEJhY2spCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrKTsKKyAgICBnQXVkaW9Qb3J0Q2FsbGJhY2sgPSBjYWxsQmFjazsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFwcy0+YWNxdWlyZVNvdW5kVHJpZ2dlclNlc3Npb24oc2Vzc2lvbiwgaW9IYW5kbGUsIGRldmljZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpyZWxlYXNlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPnJlbGVhc2VTb3VuZFRyaWdnZXJTZXNzaW9uKHNlc3Npb24pOworfQorCithdWRpb19tb2RlX3QgQXVkaW9TeXN0ZW06OmdldFBob25lU3RhdGUoKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gQVVESU9fTU9ERV9JTlZBTElEOworICAgIHJldHVybiBhcHMtPmdldFBob25lU3RhdGUoKTsKK30KKworCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotdm9pZCBBdWRpb1N5c3RlbTo6QXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2woQXVkaW9TeXN0ZW06OmdMb2NrKTsKK3ZvaWQgQXVkaW9TeXN0ZW06OkF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9jayk7CisgICAgaWYgKGdBdWRpb1BvcnRDYWxsYmFjayAhPSAwKSB7CisgICAgICAgIGdBdWRpb1BvcnRDYWxsYmFjay0+b25TZXJ2aWNlRGllZCgpOworICAgIH0KICAgICBBdWRpb1N5c3RlbTo6Z0F1ZGlvUG9saWN5U2VydmljZS5jbGVhcigpOwogCiAgICAgQUxPR1coIkF1ZGlvUG9saWN5U2VydmljZSBzZXJ2ZXIgZGllZCEiKTsKIH0KIAordm9pZCBBdWRpb1N5c3RlbTo6QXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9jayk7CisgICAgaWYgKGdBdWRpb1BvcnRDYWxsYmFjayAhPSAwKSB7CisgICAgICAgIGdBdWRpb1BvcnRDYWxsYmFjay0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6Om9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9jayk7CisgICAgaWYgKGdBdWRpb1BvcnRDYWxsYmFjayAhPSAwKSB7CisgICAgICAgIGdBdWRpb1BvcnRDYWxsYmFjay0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworICAgIH0KK30KKwogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvVHJhY2suY3BwIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9UcmFjay5jcHAKaW5kZXggZTI5MDYyNy4uMGE4OWZiYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQXVkaW9UcmFjay5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9UcmFjay5jcHAKQEAgLTE1LDE3ICsxNSwyMCBAQAogKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwogCi0KIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiQXVkaW9UcmFjayIKIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bWF0aC5oPgogI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorCiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVHJhY2suaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaD4KICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9GbGluZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KIAogI2RlZmluZSBXQUlUX1BFUklPRF9NUyAgICAgICAgICAgICAgICAgIDEwCiAjZGVmaW5lIFdBSVRfU1RSRUFNX0VORF9USU1FT1VUX1NFQyAgICAgMTIwCkBAIC0zNCw2ICszNywxOSBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKK3N0YXRpYyBpbnQ2NF90IGNvbnZlcnRUaW1lc3BlY1RvVXMoY29uc3Qgc3RydWN0IHRpbWVzcGVjICZ0dikKK3sKKyAgICByZXR1cm4gdHYudHZfc2VjICogMTAwMDAwMGxsICsgdHYudHZfbnNlYyAvIDEwMDA7Cit9CisKKy8vIGN1cnJlbnQgbW9ub3RvbmljIHRpbWUgaW4gbWljcm9zZWNvbmRzLgorc3RhdGljIGludDY0X3QgZ2V0Tm93VXMoKQoreworICAgIHN0cnVjdCB0aW1lc3BlYyB0djsKKyAgICAodm9pZCkgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0dik7CisgICAgcmV0dXJuIGNvbnZlcnRUaW1lc3BlY1RvVXModHYpOworfQorCiAvLyBzdGF0aWMKIHN0YXR1c190IEF1ZGlvVHJhY2s6OmdldE1pbkZyYW1lQ291bnQoCiAgICAgICAgIHNpemVfdCogZnJhbWVDb3VudCwKQEAgLTQ0LDkgKzYwLDYgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICAvLyBkZWZhdWx0IHRvIDAgaW4gY2FzZSBvZiBlcnJvcgotICAgICpmcmFtZUNvdW50ID0gMDsKLQogICAgIC8vIEZJWE1FIG1lcmdlIHdpdGggc2ltaWxhciBjb2RlIGluIGNyZWF0ZVRyYWNrX2woKSwgZXhjZXB0IHdlJ3JlIG1pc3NpbmcKICAgICAvLyAgICAgICBzb21lIGluZm9ybWF0aW9uIGhlcmUgdGhhdCBpcyBhdmFpbGFibGUgaW4gY3JlYXRlVHJhY2tfbCgpOgogICAgIC8vICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dApAQCAtNTQsMTYgKzY3LDI2IEBACiAgICAgLy8gICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sKICAgICAvLyAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncwogICAgIHVpbnQzMl90IGFmU2FtcGxlUmF0ZTsKLSAgICBpZiAoQXVkaW9TeXN0ZW06OmdldE91dHB1dFNhbXBsaW5nUmF0ZSgmYWZTYW1wbGVSYXRlLCBzdHJlYW1UeXBlKSAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldE91dHB1dFNhbXBsaW5nUmF0ZSgmYWZTYW1wbGVSYXRlLCBzdHJlYW1UeXBlKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gcXVlcnkgb3V0cHV0IHNhbXBsZSByYXRlIGZvciBzdHJlYW0gdHlwZSAlZDsgc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgICBzdHJlYW1UeXBlLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KICAgICBzaXplX3QgYWZGcmFtZUNvdW50OwotICAgIGlmIChBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0RnJhbWVDb3VudCgmYWZGcmFtZUNvdW50LCBzdHJlYW1UeXBlKSAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0RnJhbWVDb3VudCgmYWZGcmFtZUNvdW50LCBzdHJlYW1UeXBlKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gcXVlcnkgb3V0cHV0IGZyYW1lIGNvdW50IGZvciBzdHJlYW0gdHlwZSAlZDsgc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgICBzdHJlYW1UeXBlLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KICAgICB1aW50MzJfdCBhZkxhdGVuY3k7Ci0gICAgaWYgKEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRMYXRlbmN5KCZhZkxhdGVuY3ksIHN0cmVhbVR5cGUpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRMYXRlbmN5KCZhZkxhdGVuY3ksIHN0cmVhbVR5cGUpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBxdWVyeSBvdXRwdXQgbGF0ZW5jeSBmb3Igc3RyZWFtIHR5cGUgJWQ7IHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKICAgICAvLyBFbnN1cmUgdGhhdCBidWZmZXIgZGVwdGggY292ZXJzIGF0IGxlYXN0IGF1ZGlvIGhhcmR3YXJlIGxhdGVuY3kKQEAgLTczLDggKzk2LDE1IEBACiAgICAgfQogCiAgICAgKmZyYW1lQ291bnQgPSAoc2FtcGxlUmF0ZSA9PSAwKSA/IGFmRnJhbWVDb3VudCAqIG1pbkJ1ZkNvdW50IDoKLSAgICAgICAgICAgIGFmRnJhbWVDb3VudCAqIG1pbkJ1ZkNvdW50ICogc2FtcGxlUmF0ZSAvIGFmU2FtcGxlUmF0ZTsKLSAgICBBTE9HVigiZ2V0TWluRnJhbWVDb3VudD0lZDogYWZGcmFtZUNvdW50PSVkLCBtaW5CdWZDb3VudD0lZCwgYWZTYW1wbGVSYXRlPSVkLCBhZkxhdGVuY3k9JWQiLAorICAgICAgICAgICAgYWZGcmFtZUNvdW50ICogbWluQnVmQ291bnQgKiB1aW50NjRfdChzYW1wbGVSYXRlKSAvIGFmU2FtcGxlUmF0ZTsKKyAgICAvLyBUaGUgZm9ybXVsYSBhYm92ZSBzaG91bGQgYWx3YXlzIHByb2R1Y2UgYSBub24temVybyB2YWx1ZSwgYnV0IHJldHVybiBhbiBlcnJvcgorICAgIC8vIGluIHRoZSB1bmxpa2VseSBldmVudCB0aGF0IGl0IGRvZXMgbm90LCBhcyB0aGF0J3MgcGFydCBvZiB0aGUgQVBJIGNvbnRyYWN0LgorICAgIGlmICgqZnJhbWVDb3VudCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJBdWRpb1RyYWNrOjpnZXRNaW5GcmFtZUNvdW50IGZhaWxlZCBmb3Igc3RyZWFtVHlwZSAlZCwgc2FtcGxlUmF0ZSAlZCIsCisgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dWKCJnZXRNaW5GcmFtZUNvdW50PSV6dTogYWZGcmFtZUNvdW50PSV6dSwgbWluQnVmQ291bnQ9JWQsIGFmU2FtcGxlUmF0ZT0lZCwgYWZMYXRlbmN5PSVkIiwKICAgICAgICAgICAgICpmcmFtZUNvdW50LCBhZkZyYW1lQ291bnQsIG1pbkJ1ZkNvdW50LCBhZlNhbXBsZVJhdGUsIGFmTGF0ZW5jeSk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtODgsNiArMTE4LDEwIEBACiAgICAgICBtUHJldmlvdXNTY2hlZHVsaW5nR3JvdXAoU1BfREVGQVVMVCksCiAgICAgICBtUGF1c2VkUG9zaXRpb24oMCkKIHsKKyAgICBtQXR0cmlidXRlcy5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTjsKKyAgICBtQXR0cmlidXRlcy51c2FnZSA9IEFVRElPX1VTQUdFX1VOS05PV047CisgICAgbUF0dHJpYnV0ZXMuZmxhZ3MgPSAweDA7CisgICAgc3RyY3B5KG1BdHRyaWJ1dGVzLnRhZ3MsICIiKTsKIH0KIAogQXVkaW9UcmFjazo6QXVkaW9UcmFjaygKQEAgLTk1LDE1ICsxMjksMTcgQEAKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgaW50IGZyYW1lQ291bnQsCisgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgY2FsbGJhY2tfdCBjYmYsCiAgICAgICAgIHZvaWQqIHVzZXIsCi0gICAgICAgIGludCBub3RpZmljYXRpb25GcmFtZXMsCisgICAgICAgIHVpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgaW50IHNlc3Npb25JZCwKICAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUsCiAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbywKLSAgICAgICAgaW50IHVpZCkKKyAgICAgICAgaW50IHVpZCwKKyAgICAgICAgcGlkX3QgcGlkLAorICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzKQogICAgIDogbVN0YXR1cyhOT19JTklUKSwKICAgICAgIG1Jc1RpbWVkKGZhbHNlKSwKICAgICAgIG1QcmV2aW91c1ByaW9yaXR5KEFORFJPSURfUFJJT1JJVFlfTk9STUFMKSwKQEAgLTExMyw3ICsxNDksNyBAQAogICAgIG1TdGF0dXMgPSBzZXQoc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywKICAgICAgICAgICAgIGZyYW1lQ291bnQsIGZsYWdzLCBjYmYsIHVzZXIsIG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgICAgIDAgLypzaGFyZWRCdWZmZXIqLywgZmFsc2UgLyp0aHJlYWRDYW5DYWxsSmF2YSovLCBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSwKLSAgICAgICAgICAgIG9mZmxvYWRJbmZvLCB1aWQpOworICAgICAgICAgICAgb2ZmbG9hZEluZm8sIHVpZCwgcGlkLCBwQXR0cmlidXRlcyk7CiB9CiAKIEF1ZGlvVHJhY2s6OkF1ZGlvVHJhY2soCkBAIC0xMjUsMTEgKzE2MSwxMyBAQAogICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgY2FsbGJhY2tfdCBjYmYsCiAgICAgICAgIHZvaWQqIHVzZXIsCi0gICAgICAgIGludCBub3RpZmljYXRpb25GcmFtZXMsCisgICAgICAgIHVpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgaW50IHNlc3Npb25JZCwKICAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUsCiAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbywKLSAgICAgICAgaW50IHVpZCkKKyAgICAgICAgaW50IHVpZCwKKyAgICAgICAgcGlkX3QgcGlkLAorICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzKQogICAgIDogbVN0YXR1cyhOT19JTklUKSwKICAgICAgIG1Jc1RpbWVkKGZhbHNlKSwKICAgICAgIG1QcmV2aW91c1ByaW9yaXR5KEFORFJPSURfUFJJT1JJVFlfTk9STUFMKSwKQEAgLTEzOCw3ICsxNzYsOCBAQAogewogICAgIG1TdGF0dXMgPSBzZXQoc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywKICAgICAgICAgICAgIDAgLypmcmFtZUNvdW50Ki8sIGZsYWdzLCBjYmYsIHVzZXIsIG5vdGlmaWNhdGlvbkZyYW1lcywKLSAgICAgICAgICAgIHNoYXJlZEJ1ZmZlciwgZmFsc2UgLyp0aHJlYWRDYW5DYWxsSmF2YSovLCBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSwgb2ZmbG9hZEluZm8sIHVpZCk7CisgICAgICAgICAgICBzaGFyZWRCdWZmZXIsIGZhbHNlIC8qdGhyZWFkQ2FuQ2FsbEphdmEqLywgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUsIG9mZmxvYWRJbmZvLAorICAgICAgICAgICAgdWlkLCBwaWQsIHBBdHRyaWJ1dGVzKTsKIH0KIAogQXVkaW9UcmFjazo6fkF1ZGlvVHJhY2soKQpAQCAtMTU2LDggKzE5NSwxMiBAQAogICAgICAgICB9CiAgICAgICAgIG1BdWRpb1RyYWNrLT5hc0JpbmRlcigpLT51bmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCB0aGlzKTsKICAgICAgICAgbUF1ZGlvVHJhY2suY2xlYXIoKTsKKyAgICAgICAgbUNibGtNZW1vcnkuY2xlYXIoKTsKKyAgICAgICAgbVNoYXJlZEJ1ZmZlci5jbGVhcigpOwogICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobVNlc3Npb25JZCk7CisgICAgICAgIEFMT0dWKCJ+QXVkaW9UcmFjaywgcmVsZWFzaW5nIHNlc3Npb24gaWQgZnJvbSAlZCBvbiBiZWhhbGYgb2YgJWQiLAorICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwgbUNsaWVudFBpZCk7CisgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobVNlc3Npb25JZCwgbUNsaWVudFBpZCk7CiAgICAgfQogfQogCkBAIC0xNjYsMTggKzIwOSwyNSBAQAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICBpbnQgZnJhbWVDb3VudEludCwKKyAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICBjYWxsYmFja190IGNiZiwKICAgICAgICAgdm9pZCogdXNlciwKLSAgICAgICAgaW50IG5vdGlmaWNhdGlvbkZyYW1lcywKKyAgICAgICAgdWludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzLAogICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAogICAgICAgICBib29sIHRocmVhZENhbkNhbGxKYXZhLAogICAgICAgICBpbnQgc2Vzc2lvbklkLAogICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZSwKICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvLAotICAgICAgICBpbnQgdWlkKQorICAgICAgICBpbnQgdWlkLAorICAgICAgICBwaWRfdCBwaWQsCisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMpCiB7CisgICAgQUxPR1YoInNldCgpOiBzdHJlYW1UeXBlICVkLCBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAlI3gsIGZyYW1lQ291bnQgJXp1LCAiCisgICAgICAgICAgImZsYWdzICMleCwgbm90aWZpY2F0aW9uRnJhbWVzICV1LCBzZXNzaW9uSWQgJWQsIHRyYW5zZmVyVHlwZSAlZCIsCisgICAgICAgICAgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgZmxhZ3MsIG5vdGlmaWNhdGlvbkZyYW1lcywKKyAgICAgICAgICBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSk7CisKICAgICBzd2l0Y2ggKHRyYW5zZmVyVHlwZSkgewogICAgIGNhc2UgVFJBTlNGRVJfREVGQVVMVDoKICAgICAgICAgaWYgKHNoYXJlZEJ1ZmZlciAhPSAwKSB7CkBAIC0yMTEsMTkgKzI2MSwxMyBAQAogICAgICAgICBBTE9HRSgiSW52YWxpZCB0cmFuc2ZlciB0eXBlICVkIiwgdHJhbnNmZXJUeXBlKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CisgICAgbVNoYXJlZEJ1ZmZlciA9IHNoYXJlZEJ1ZmZlcjsKICAgICBtVHJhbnNmZXIgPSB0cmFuc2ZlclR5cGU7CiAKLSAgICAvLyBGSVhNRSAiaW50IiBoZXJlIGlzIGxlZ2FjeSBhbmQgd2lsbCBiZSByZXBsYWNlZCBieSBzaXplX3QgbGF0ZXIKLSAgICBpZiAoZnJhbWVDb3VudEludCA8IDApIHsKLSAgICAgICAgQUxPR0UoIkludmFsaWQgZnJhbWUgY291bnQgJWQiLCBmcmFtZUNvdW50SW50KTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgc2l6ZV90IGZyYW1lQ291bnQgPSBmcmFtZUNvdW50SW50OwotCiAgICAgQUxPR1ZfSUYoc2hhcmVkQnVmZmVyICE9IDAsICJzaGFyZWRCdWZmZXI6ICVwLCBzaXplOiAlZCIsIHNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpLAogICAgICAgICAgICAgc2hhcmVkQnVmZmVyLT5zaXplKCkpOwogCi0gICAgQUxPR1YoInNldCgpIHN0cmVhbVR5cGUgJWQgZnJhbWVDb3VudCAldSBmbGFncyAlMDR4Iiwgc3RyZWFtVHlwZSwgZnJhbWVDb3VudCwgZmxhZ3MpOworICAgIEFMT0dWKCJzZXQoKSBzdHJlYW1UeXBlICVkIGZyYW1lQ291bnQgJXp1IGZsYWdzICUwNHgiLCBzdHJlYW1UeXBlLCBmcmFtZUNvdW50LCBmbGFncyk7CiAKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAKQEAgLTIzMywxOSArMjc3LDM5IEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBtT3V0cHV0ID0gMDsKLQogICAgIC8vIGhhbmRsZSBkZWZhdWx0IHZhbHVlcyBmaXJzdC4KICAgICBpZiAoc3RyZWFtVHlwZSA9PSBBVURJT19TVFJFQU1fREVGQVVMVCkgewogICAgICAgICBzdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX01VU0lDOwogICAgIH0KIAotICAgIGlmIChzYW1wbGVSYXRlID09IDApIHsKLSAgICAgICAgdWludDMyX3QgYWZTYW1wbGVSYXRlOwotICAgICAgICBpZiAoQXVkaW9TeXN0ZW06OmdldE91dHB1dFNhbXBsaW5nUmF0ZSgmYWZTYW1wbGVSYXRlLCBzdHJlYW1UeXBlKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgaWYgKHBBdHRyaWJ1dGVzID09IE5VTEwpIHsKKyAgICAgICAgaWYgKHVpbnQzMl90KHN0cmVhbVR5cGUpID49IEFVRElPX1NUUkVBTV9DTlQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIHN0cmVhbSB0eXBlICVkIiwgc3RyZWFtVHlwZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9Ci0gICAgICAgIHNhbXBsZVJhdGUgPSBhZlNhbXBsZVJhdGU7CisgICAgICAgIHNldEF0dHJpYnV0ZXNGcm9tU3RyZWFtVHlwZShzdHJlYW1UeXBlKTsKKyAgICAgICAgbVN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghaXNWYWxpZEF0dHJpYnV0ZXMocEF0dHJpYnV0ZXMpKSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBhdHRyaWJ1dGVzOiB1c2FnZT0lZCBjb250ZW50PSVkIGZsYWdzPTB4JXggdGFncz1bJXNdIiwKKyAgICAgICAgICAgICAgICBwQXR0cmlidXRlcy0+dXNhZ2UsIHBBdHRyaWJ1dGVzLT5jb250ZW50X3R5cGUsIHBBdHRyaWJ1dGVzLT5mbGFncywKKyAgICAgICAgICAgICAgICBwQXR0cmlidXRlcy0+dGFncyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gc3RyZWFtIHR5cGUgc2hvdWxkbid0IGJlIGxvb2tlZCBhdCwgdGhpcyB0cmFjayBoYXMgYXVkaW8gYXR0cmlidXRlcworICAgICAgICBtZW1jcHkoJm1BdHRyaWJ1dGVzLCBwQXR0cmlidXRlcywgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICBzZXRTdHJlYW1UeXBlRnJvbUF0dHJpYnV0ZXMobUF0dHJpYnV0ZXMpOworICAgICAgICBBTE9HVigiQnVpbGRpbmcgQXVkaW9UcmFjayB3aXRoIGF0dHJpYnV0ZXM6IHVzYWdlPSVkIGNvbnRlbnQ9JWQgZmxhZ3M9MHgleCB0YWdzPVslc10iLAorICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVzLnVzYWdlLCBtQXR0cmlidXRlcy5jb250ZW50X3R5cGUsIG1BdHRyaWJ1dGVzLmZsYWdzLCBtQXR0cmlidXRlcy50YWdzKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKHNhbXBsZVJhdGUgPT0gMCkgeworICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0U2FtcGxpbmdSYXRlRm9yQXR0cigmc2FtcGxlUmF0ZSwgJm1BdHRyaWJ1dGVzKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgb3V0cHV0IHNhbXBsZSByYXRlIGZvciBzdHJlYW0gdHlwZSAlZDsgc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgICAgICAgbVN0cmVhbVR5cGUsIHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CiAgICAgfQogICAgIG1TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKIApAQCAtMjUzLDE1ICszMTcsMjEgQEAKICAgICBpZiAoZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CiAgICAgICAgIGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgIH0KLSAgICBpZiAoY2hhbm5lbE1hc2sgPT0gMCkgewotICAgICAgICBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKLSAgICB9CiAKICAgICAvLyB2YWxpZGF0ZSBwYXJhbWV0ZXJzCiAgICAgaWYgKCFhdWRpb19pc192YWxpZF9mb3JtYXQoZm9ybWF0KSkgewotICAgICAgICBBTE9HRSgiSW52YWxpZCBmb3JtYXQgJWQiLCBmb3JtYXQpOworICAgICAgICBBTE9HRSgiSW52YWxpZCBmb3JtYXQgJSN4IiwgZm9ybWF0KTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CisgICAgbUZvcm1hdCA9IGZvcm1hdDsKKworICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2NoYW5uZWwoY2hhbm5lbE1hc2spKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIGNoYW5uZWwgbWFzayAlI3giLCBjaGFubmVsTWFzayk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIG1DaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrOworICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzayk7CisgICAgbUNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudDsKIAogICAgIC8vIEF1ZGlvRmxpbmdlciBkb2VzIG5vdCBjdXJyZW50bHkgc3VwcG9ydCA4LWJpdCBkYXRhIGluIHNoYXJlZCBtZW1vcnkKICAgICBpZiAoZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQgJiYgc2hhcmVkQnVmZmVyICE9IDApIHsKQEAgLTI4MSw1MCArMzUxLDU2IEBACiAgICAgICAgICAgICAgICAgKChmbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgJiB+QVVESU9fT1VUUFVUX0ZMQUdfRkFTVCk7CiAgICAgfQogICAgIC8vIG9ubHkgYWxsb3cgZGVlcCBidWZmZXJpbmcgZm9yIG11c2ljIHN0cmVhbSB0eXBlCi0gICAgaWYgKHN0cmVhbVR5cGUgIT0gQVVESU9fU1RSRUFNX01VU0lDKSB7CisgICAgaWYgKG1TdHJlYW1UeXBlICE9IEFVRElPX1NUUkVBTV9NVVNJQykgewogICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoZmxhZ3MgJn5BVURJT19PVVRQVVRfRkxBR19ERUVQX0JVRkZFUik7CiAgICAgfQogCi0gICAgaWYgKCFhdWRpb19pc19vdXRwdXRfY2hhbm5lbChjaGFubmVsTWFzaykpIHsKLSAgICAgICAgQUxPR0UoIkludmFsaWQgY2hhbm5lbCBtYXNrICUjeCIsIGNoYW5uZWxNYXNrKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgbUNoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2s7Ci0gICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gcG9wY291bnQoY2hhbm5lbE1hc2spOwotICAgIG1DaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQ7Ci0KLSAgICBpZiAoYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7Ci0gICAgICAgIG1GcmFtZVNpemUgPSBjaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCk7Ci0gICAgICAgIG1GcmFtZVNpemVBRiA9IGNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KTsKKyAgICBpZiAoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpIHsKKyAgICAgICAgaWYgKGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSkgeworICAgICAgICAgICAgbUZyYW1lU2l6ZSA9IGNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1GcmFtZVNpemUgPSBzaXplb2YodWludDhfdCk7CisgICAgICAgIH0KKyAgICAgICAgbUZyYW1lU2l6ZUFGID0gbUZyYW1lU2l6ZTsKICAgICB9IGVsc2UgewotICAgICAgICBtRnJhbWVTaXplID0gc2l6ZW9mKHVpbnQ4X3QpOwotICAgICAgICBtRnJhbWVTaXplQUYgPSBzaXplb2YodWludDhfdCk7CisgICAgICAgIEFMT0dfQVNTRVJUKGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSk7CisgICAgICAgIG1GcmFtZVNpemUgPSBjaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCk7CisgICAgICAgIG1GcmFtZVNpemVBRiA9IGNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoCisgICAgICAgICAgICAgICAgZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQgPyBBVURJT19GT1JNQVRfUENNXzE2X0JJVCA6IGZvcm1hdCk7CisgICAgICAgIC8vIGNyZWF0ZVRyYWNrIHdpbGwgcmV0dXJuIGFuIGVycm9yIGlmIFBDTSBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZCBieSBzZXJ2ZXIsCisgICAgICAgIC8vIHNvIG5vIG5lZWQgdG8gY2hlY2sgZm9yIHNwZWNpZmljIFBDTSBmb3JtYXRzIGhlcmUKICAgICB9CiAKLSAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZmxvYWRJbmZvKTsKLQotICAgIGlmIChvdXRwdXQgPT0gMCkgewotICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBhdWRpbyBvdXRwdXQgZm9yIHN0cmVhbSB0eXBlICVkIiwgc3RyZWFtVHlwZSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgLy8gTWFrZSBjb3B5IG9mIGlucHV0IHBhcmFtZXRlciBvZmZsb2FkSW5mbyBzbyB0aGF0IGluIHRoZSBmdXR1cmU6CisgICAgLy8gIChhKSBjcmVhdGVUcmFja19sIGRvZXNuJ3QgbmVlZCBpdCBhcyBhbiBpbnB1dCBwYXJhbWV0ZXIKKyAgICAvLyAgKGIpIHdlIGNhbiBzdXBwb3J0IHJlLWNyZWF0aW9uIG9mIG9mZmxvYWRlZCB0cmFja3MKKyAgICBpZiAob2ZmbG9hZEluZm8gIT0gTlVMTCkgeworICAgICAgICBtT2ZmbG9hZEluZm9Db3B5ID0gKm9mZmxvYWRJbmZvOworICAgICAgICBtT2ZmbG9hZEluZm8gPSAmbU9mZmxvYWRJbmZvQ29weTsKKyAgICB9IGVsc2UgeworICAgICAgICBtT2ZmbG9hZEluZm8gPSBOVUxMOwogICAgIH0KIAotICAgIG1Wb2x1bWVbTEVGVF0gPSAxLjBmOwotICAgIG1Wb2x1bWVbUklHSFRdID0gMS4wZjsKKyAgICBtVm9sdW1lW0FVRElPX0lOVEVSTEVBVkVfTEVGVF0gPSAxLjBmOworICAgIG1Wb2x1bWVbQVVESU9fSU5URVJMRUFWRV9SSUdIVF0gPSAxLjBmOwogICAgIG1TZW5kTGV2ZWwgPSAwLjBmOwotICAgIG1GcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyAgICAvLyBtRnJhbWVDb3VudCBpcyBpbml0aWFsaXplZCBpbiBjcmVhdGVUcmFja19sCiAgICAgbVJlcUZyYW1lQ291bnQgPSBmcmFtZUNvdW50OwogICAgIG1Ob3RpZmljYXRpb25GcmFtZXNSZXEgPSBub3RpZmljYXRpb25GcmFtZXM7CiAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9IDA7CiAgICAgbVNlc3Npb25JZCA9IHNlc3Npb25JZDsKLSAgICBpZiAodWlkID09IC0xIHx8IChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkgIT0gZ2V0cGlkKCkpKSB7CisgICAgaW50IGNhbGxpbmdwaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IG15cGlkID0gZ2V0cGlkKCk7CisgICAgaWYgKHVpZCA9PSAtMSB8fCAoY2FsbGluZ3BpZCAhPSBteXBpZCkpIHsKICAgICAgICAgbUNsaWVudFVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKICAgICB9IGVsc2UgewogICAgICAgICBtQ2xpZW50VWlkID0gdWlkOwogICAgIH0KKyAgICBpZiAocGlkID09IC0xIHx8IChjYWxsaW5ncGlkICE9IG15cGlkKSkgeworICAgICAgICBtQ2xpZW50UGlkID0gY2FsbGluZ3BpZDsKKyAgICB9IGVsc2UgeworICAgICAgICBtQ2xpZW50UGlkID0gcGlkOworICAgIH0KICAgICBtQXV4RWZmZWN0SWQgPSAwOwogICAgIG1GbGFncyA9IGZsYWdzOwogICAgIG1DYmYgPSBjYmY7CkBAIC0zMzUsMTQgKzQxMSw3IEBACiAgICAgfQogCiAgICAgLy8gY3JlYXRlIHRoZSBJQXVkaW9UcmFjawotICAgIHN0YXR1c190IHN0YXR1cyA9IGNyZWF0ZVRyYWNrX2woc3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKmVwb2NoKi8pOworICAgIHN0YXR1cyA9IGNyZWF0ZVRyYWNrX2woKTsKIAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgaWYgKG1BdWRpb1RyYWNrVGhyZWFkICE9IDApIHsKQEAgLTM1MCwxNyArNDE5LDEwIEBACiAgICAgICAgICAgICBtQXVkaW9UcmFja1RocmVhZC0+cmVxdWVzdEV4aXRBbmRXYWl0KCk7CiAgICAgICAgICAgICBtQXVkaW9UcmFja1RocmVhZC5jbGVhcigpOwogICAgICAgICB9Ci0gICAgICAgIC8vVXNlIG9mIGRpcmVjdCBhbmQgb2ZmbG9hZGVkIG91dHB1dCBzdHJlYW1zIGlzIHJlZiBjb3VudGVkIGJ5IGF1ZGlvIHBvbGljeSBtYW5hZ2VyLgotICAgICAgICAvLyBBcyBnZXRPdXRwdXQgd2FzIGNhbGxlZCBhYm92ZSBhbmQgcmVzdWx0ZWQgaW4gYW4gb3V0cHV0IHN0cmVhbSB0byBiZSBvcGVuZWQsCi0gICAgICAgIC8vIHdlIG5lZWQgdG8gcmVsZWFzZSBpdC4KLSAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQob3V0cHV0KTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKICAgICBtU3RhdHVzID0gTk9fRVJST1I7Ci0gICAgbVN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOwotICAgIG1Gb3JtYXQgPSBmb3JtYXQ7Ci0gICAgbVNoYXJlZEJ1ZmZlciA9IHNoYXJlZEJ1ZmZlcjsKICAgICBtU3RhdGUgPSBTVEFURV9TVE9QUEVEOwogICAgIG1Vc2VyRGF0YSA9IHVzZXI7CiAgICAgbUxvb3BQZXJpb2QgPSAwOwpAQCAtMzY4LDExICs0MzAsMTQgQEAKICAgICBtTWFya2VyUmVhY2hlZCA9IGZhbHNlOwogICAgIG1OZXdQb3NpdGlvbiA9IDA7CiAgICAgbVVwZGF0ZVBlcmlvZCA9IDA7Ci0gICAgQXVkaW9TeXN0ZW06OmFjcXVpcmVBdWRpb1Nlc3Npb25JZChtU2Vzc2lvbklkKTsKKyAgICBtU2VydmVyID0gMDsKKyAgICBtUG9zaXRpb24gPSAwOworICAgIG1SZWxlYXNlZCA9IDA7CisgICAgbVN0YXJ0VXMgPSAwOworICAgIEF1ZGlvU3lzdGVtOjphY3F1aXJlQXVkaW9TZXNzaW9uSWQobVNlc3Npb25JZCwgbUNsaWVudFBpZCk7CiAgICAgbVNlcXVlbmNlID0gMTsKICAgICBtT2JzZXJ2ZWRTZXF1ZW5jZSA9IG1TZXF1ZW5jZTsKICAgICBtSW5VbmRlcnJ1biA9IGZhbHNlOwotICAgIG1PdXRwdXQgPSBvdXRwdXQ7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC0zOTUsMTQgKzQ2MCwyMSBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0FDVElWRTsKICAgICB9CisgICAgKHZvaWQpIHVwZGF0ZUFuZEdldFBvc2l0aW9uX2woKTsKICAgICBpZiAocHJldmlvdXNTdGF0ZSA9PSBTVEFURV9TVE9QUEVEIHx8IHByZXZpb3VzU3RhdGUgPT0gU1RBVEVfRkxVU0hFRCkgewogICAgICAgICAvLyByZXNldCBjdXJyZW50IHBvc2l0aW9uIGFzIHNlZW4gYnkgY2xpZW50IHRvIDAKLSAgICAgICAgbVByb3h5LT5zZXRFcG9jaChtUHJveHktPmdldEVwb2NoKCkgLSBtUHJveHktPmdldFBvc2l0aW9uKCkpOworICAgICAgICBtUG9zaXRpb24gPSAwOworICAgICAgICAvLyBGb3Igb2ZmbG9hZGVkIHRyYWNrcywgd2UgZG9uJ3Qga25vdyBpZiB0aGUgaGFyZHdhcmUgY291bnRlcnMgYXJlIHJlYWxseSB6ZXJvIGhlcmUsCisgICAgICAgIC8vIHNpbmNlIHRoZSBmbHVzaCBpcyBhc3luY2hyb25vdXMgYW5kIHN0b3AgbWF5IG5vdCBmdWxseSBkcmFpbi4KKyAgICAgICAgLy8gV2Ugc2F2ZSB0aGUgdGltZSB3aGVuIHRoZSB0cmFjayBpcyBzdGFydGVkIHRvIGxhdGVyIHZlcmlmeSB3aGV0aGVyCisgICAgICAgIC8vIHRoZSBjb3VudGVycyBhcmUgcmVhbGlzdGljIChpLmUuIHN0YXJ0IGZyb20gemVybyBhZnRlciB0aGlzIHRpbWUpLgorICAgICAgICBtU3RhcnRVcyA9IGdldE5vd1VzKCk7CisKICAgICAgICAgLy8gZm9yY2UgcmVmcmVzaCBvZiByZW1haW5pbmcgZnJhbWVzIGJ5IHByb2Nlc3NBdWRpb0J1ZmZlcigpIGFzIGxhc3QKICAgICAgICAgLy8gd3JpdGUgYmVmb3JlIHN0b3AgY291bGQgYmUgcGFydGlhbC4KICAgICAgICAgbVJlZnJlc2hSZW1haW5pbmcgPSB0cnVlOwogICAgIH0KLSAgICBtTmV3UG9zaXRpb24gPSBtUHJveHktPmdldFBvc2l0aW9uKCkgKyBtVXBkYXRlUGVyaW9kOworICAgIG1OZXdQb3NpdGlvbiA9IG1Qb3NpdGlvbiArIG1VcGRhdGVQZXJpb2Q7CiAgICAgaW50MzJfdCBmbGFncyA9IGFuZHJvaWRfYXRvbWljX2FuZCh+Q0JMS19ESVNBQkxFRCwgJm1DYmxrLT5tRmxhZ3MpOwogCiAgICAgc3A8QXVkaW9UcmFja1RocmVhZD4gdCA9IG1BdWRpb1RyYWNrVGhyZWFkOwpAQCAtNDQ4LDE1ICs1MjAsMTUgQEAKIHZvaWQgQXVkaW9UcmFjazo6c3RvcCgpCiB7CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIC8vIEZJWE1FIHBhdXNlIHRoZW4gc3RvcCBzaG91bGQgbm90IGJlIGEgbm9wCi0gICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9BQ1RJVkUpIHsKKyAgICBpZiAobVN0YXRlICE9IFNUQVRFX0FDVElWRSAmJiBtU3RhdGUgIT0gU1RBVEVfUEFVU0VEKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBpZiAoaXNPZmZsb2FkZWQoKSkgeworICAgIGlmIChpc09mZmxvYWRlZF9sKCkpIHsKICAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBJTkc7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRDsKKyAgICAgICAgbVJlbGVhc2VkID0gMDsKICAgICB9CiAKICAgICBtUHJveHktPmludGVycnVwdCgpOwpAQCAtNDc1LDcgKzU0Nyw3IEBACiAKICAgICBzcDxBdWRpb1RyYWNrVGhyZWFkPiB0ID0gbUF1ZGlvVHJhY2tUaHJlYWQ7CiAgICAgaWYgKHQgIT0gMCkgewotICAgICAgICBpZiAoIWlzT2ZmbG9hZGVkKCkpIHsKKyAgICAgICAgaWYgKCFpc09mZmxvYWRlZF9sKCkpIHsKICAgICAgICAgICAgIHQtPnBhdXNlKCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewpAQCAtNTEzLDcgKzU4NSw4IEBACiAgICAgbVJlZnJlc2hSZW1haW5pbmcgPSB0cnVlOwogCiAgICAgbVN0YXRlID0gU1RBVEVfRkxVU0hFRDsKLSAgICBpZiAoaXNPZmZsb2FkZWQoKSkgeworICAgIG1SZWxlYXNlZCA9IDA7CisgICAgaWYgKGlzT2ZmbG9hZGVkX2woKSkgewogICAgICAgICBtUHJveHktPmludGVycnVwdCgpOwogICAgIH0KICAgICBtUHJveHktPmZsdXNoKCk7CkBAIC01MzMsMTEgKzYwNiwyMCBAQAogICAgIG1Qcm94eS0+aW50ZXJydXB0KCk7CiAgICAgbUF1ZGlvVHJhY2stPnBhdXNlKCk7CiAKLSAgICBpZiAoaXNPZmZsb2FkZWQoKSkgewotICAgICAgICBpZiAobU91dHB1dCAhPSAwKSB7CisgICAgaWYgKGlzT2ZmbG9hZGVkX2woKSkgeworICAgICAgICBpZiAobU91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgLy8gQW4gb2ZmbG9hZCBvdXRwdXQgY2FuIGJlIHJlLXVzZWQgYmV0d2VlbiB0d28gYXVkaW8gdHJhY2tzIGhhdmluZworICAgICAgICAgICAgLy8gdGhlIHNhbWUgY29uZmlndXJhdGlvbi4gQSB0aW1lc3RhbXAgcXVlcnkgZm9yIGEgcGF1c2VkIHRyYWNrCisgICAgICAgICAgICAvLyB3aGlsZSB0aGUgb3RoZXIgaXMgcnVubmluZyB3b3VsZCByZXR1cm4gYW4gaW5jb3JyZWN0IHRpbWUuCisgICAgICAgICAgICAvLyBUbyBmaXggdGhpcywgY2FjaGUgdGhlIHBsYXliYWNrIHBvc2l0aW9uIG9uIGEgcGF1c2UoKSBhbmQgcmV0dXJuCisgICAgICAgICAgICAvLyB0aGlzIHRpbWUgd2hlbiByZXF1ZXN0ZWQgdW50aWwgdGhlIHRyYWNrIGlzIHJlc3VtZWQuCisKKyAgICAgICAgICAgIC8vIE9mZmxvYWRUaHJlYWQgc2VuZHMgSEFMIHBhdXNlIGluIGl0cyB0aHJlYWRMb29wLiBUaW1lIHNhdmVkCisgICAgICAgICAgICAvLyBoZXJlIGNhbiBiZSBzbGlnaHRseSBvZmYuCisKKyAgICAgICAgICAgIC8vIFRPRE86IGNoZWNrIHJldHVybiBjb2RlIGZvciBnZXRSZW5kZXJQb3NpdGlvbi4KKwogICAgICAgICAgICAgdWludDMyX3QgaGFsRnJhbWVzOwotICAgICAgICAgICAgLy8gT2ZmbG9hZFRocmVhZCBzZW5kcyBIQUwgcGF1c2UgaW4gaXRzIHRocmVhZExvb3AuLiB0aW1lIHNhdmVkCi0gICAgICAgICAgICAvLyBoZXJlIGNhbiBiZSBzbGlnaHRseSBvZmYKICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpnZXRSZW5kZXJQb3NpdGlvbihtT3V0cHV0LCAmaGFsRnJhbWVzLCAmbVBhdXNlZFBvc2l0aW9uKTsKICAgICAgICAgICAgIEFMT0dWKCJBdWRpb1RyYWNrOjpwYXVzZSBmb3Igb2ZmbG9hZCwgY2FjaGUgY3VycmVudCBwb3NpdGlvbiAldSIsIG1QYXVzZWRQb3NpdGlvbik7CiAgICAgICAgIH0KQEAgLTU0NiwxNyArNjI4LDE5IEBACiAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkKIHsKLSAgICBpZiAobGVmdCA8IDAuMGYgfHwgbGVmdCA+IDEuMGYgfHwgcmlnaHQgPCAwLjBmIHx8IHJpZ2h0ID4gMS4wZikgeworICAgIC8vIFRoaXMgZHVwbGljYXRlcyBhIHRlc3QgYnkgQXVkaW9UcmFjayBKTkksIGJ1dCB0aGF0IGlzIG5vdCB0aGUgb25seSBjYWxsZXIKKyAgICBpZiAoaXNuYW5mKGxlZnQpIHx8IGxlZnQgPCBHQUlOX0ZMT0FUX1pFUk8gfHwgbGVmdCA+IEdBSU5fRkxPQVRfVU5JVFkgfHwKKyAgICAgICAgICAgIGlzbmFuZihyaWdodCkgfHwgcmlnaHQgPCBHQUlOX0ZMT0FUX1pFUk8gfHwgcmlnaHQgPiBHQUlOX0ZMT0FUX1VOSVRZKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIG1Wb2x1bWVbTEVGVF0gPSBsZWZ0OwotICAgIG1Wb2x1bWVbUklHSFRdID0gcmlnaHQ7CisgICAgbVZvbHVtZVtBVURJT19JTlRFUkxFQVZFX0xFRlRdID0gbGVmdDsKKyAgICBtVm9sdW1lW0FVRElPX0lOVEVSTEVBVkVfUklHSFRdID0gcmlnaHQ7CiAKLSAgICBtUHJveHktPnNldFZvbHVtZUxSKCh1aW50MzJfdCh1aW50MTZfdChyaWdodCAqIDB4MTAwMCkpIDw8IDE2KSB8IHVpbnQxNl90KGxlZnQgKiAweDEwMDApKTsKKyAgICBtUHJveHktPnNldFZvbHVtZUxSKGdhaW5fbWluaWZsb2F0X3BhY2soZ2Fpbl9mcm9tX2Zsb2F0KGxlZnQpLCBnYWluX2Zyb21fZmxvYXQocmlnaHQpKSk7CiAKLSAgICBpZiAoaXNPZmZsb2FkZWQoKSkgeworICAgIGlmIChpc09mZmxvYWRlZF9sKCkpIHsKICAgICAgICAgbUF1ZGlvVHJhY2stPnNpZ25hbCgpOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC01NjksNyArNjUzLDggQEAKIAogc3RhdHVzX3QgQXVkaW9UcmFjazo6c2V0QXV4RWZmZWN0U2VuZExldmVsKGZsb2F0IGxldmVsKQogewotICAgIGlmIChsZXZlbCA8IDAuMGYgfHwgbGV2ZWwgPiAxLjBmKSB7CisgICAgLy8gVGhpcyBkdXBsaWNhdGVzIGEgdGVzdCBieSBBdWRpb1RyYWNrIEpOSSwgYnV0IHRoYXQgaXMgbm90IHRoZSBvbmx5IGNhbGxlcgorICAgIGlmIChpc25hbmYobGV2ZWwpIHx8IGxldmVsIDwgR0FJTl9GTE9BVF9aRVJPIHx8IGxldmVsID4gR0FJTl9GTE9BVF9VTklUWSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIApAQCAtNTg5LDE2ICs2NzQsMTUgQEAKIAogc3RhdHVzX3QgQXVkaW9UcmFjazo6c2V0U2FtcGxlUmF0ZSh1aW50MzJfdCByYXRlKQogewotICAgIGlmIChtSXNUaW1lZCB8fCBpc09mZmxvYWRlZCgpKSB7CisgICAgaWYgKG1Jc1RpbWVkIHx8IGlzT2ZmbG9hZGVkT3JEaXJlY3QoKSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCiAgICAgdWludDMyX3QgYWZTYW1wbGluZ1JhdGU7Ci0gICAgaWYgKEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRTYW1wbGluZ1JhdGUoJmFmU2FtcGxpbmdSYXRlLCBtU3RyZWFtVHlwZSkgIT0gTk9fRVJST1IpIHsKKyAgICBpZiAoQXVkaW9TeXN0ZW06OmdldE91dHB1dFNhbXBsaW5nUmF0ZUZvckF0dHIoJmFmU2FtcGxpbmdSYXRlLCAmbUF0dHJpYnV0ZXMpICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICAvLyBSZXNhbXBsZXIgaW1wbGVtZW50YXRpb24gbGltaXRzIGlucHV0IHNhbXBsaW5nIHJhdGUgdG8gMiB4IG91dHB1dCBzYW1wbGluZyByYXRlLgotICAgIGlmIChyYXRlID09IDAgfHwgcmF0ZSA+IGFmU2FtcGxpbmdSYXRlKjIgKSB7CisgICAgaWYgKHJhdGUgPT0gMCB8fCByYXRlID4gYWZTYW1wbGluZ1JhdGUgKiBBVURJT19SRVNBTVBMRVJfRE9XTl9SQVRJT19NQVgpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKQEAgLTYyMCwxMCArNzA0LDEwIEBACiAgICAgLy8gc2FtcGxlIHJhdGUgY2FuIGJlIHVwZGF0ZWQgZHVyaW5nIHBsYXliYWNrIGJ5IHRoZSBvZmZsb2FkZWQgZGVjb2RlciBzbyB3ZSBuZWVkIHRvCiAgICAgLy8gcXVlcnkgdGhlIEhBTCBhbmQgdXBkYXRlIGlmIG5lZWRlZC4KIC8vIEZJWE1FIHVzZSBQcm94eSByZXR1cm4gY2hhbm5lbCB0byB1cGRhdGUgdGhlIHJhdGUgZnJvbSBzZXJ2ZXIgYW5kIGF2b2lkIHBvbGxpbmcgaGVyZQotICAgIGlmIChpc09mZmxvYWRlZCgpKSB7Ci0gICAgICAgIGlmIChtT3V0cHV0ICE9IDApIHsKKyAgICBpZiAoaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkpIHsKKyAgICAgICAgaWYgKG1PdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSAwOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldFNhbXBsaW5nUmF0ZShtT3V0cHV0LCBtU3RyZWFtVHlwZSwgJnNhbXBsZVJhdGUpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldFNhbXBsaW5nUmF0ZShtT3V0cHV0LCAmc2FtcGxlUmF0ZSk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOwogICAgICAgICAgICAgfQpAQCAtNjM0LDcgKzcxOCw3IEBACiAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnNldExvb3AodWludDMyX3QgbG9vcFN0YXJ0LCB1aW50MzJfdCBsb29wRW5kLCBpbnQgbG9vcENvdW50KQogewotICAgIGlmIChtU2hhcmVkQnVmZmVyID09IDAgfHwgbUlzVGltZWQgfHwgaXNPZmZsb2FkZWQoKSkgeworICAgIGlmIChtU2hhcmVkQnVmZmVyID09IDAgfHwgbUlzVGltZWQgfHwgaXNPZmZsb2FkZWRPckRpcmVjdCgpKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKQEAgLTY2MCw3ICs3NDQsNyBAQAogewogICAgIC8vIEZJWE1FIElmIHNldHRpbmcgYSBsb29wIGFsc28gc2V0cyBwb3NpdGlvbiB0byBzdGFydCBvZiBsb29wLCB0aGVuCiAgICAgLy8gICAgICAgdGhpcyBpcyBjb3JyZWN0LiAgT3RoZXJ3aXNlIGl0IHNob3VsZCBiZSByZW1vdmVkLgotICAgIG1OZXdQb3NpdGlvbiA9IG1Qcm94eS0+Z2V0UG9zaXRpb24oKSArIG1VcGRhdGVQZXJpb2Q7CisgICAgbU5ld1Bvc2l0aW9uID0gdXBkYXRlQW5kR2V0UG9zaXRpb25fbCgpICsgbVVwZGF0ZVBlcmlvZDsKICAgICBtTG9vcFBlcmlvZCA9IGxvb3BDb3VudCAhPSAwID8gbG9vcEVuZCAtIGxvb3BTdGFydCA6IDA7CiAgICAgbVN0YXRpY1Byb3h5LT5zZXRMb29wKGxvb3BTdGFydCwgbG9vcEVuZCwgbG9vcENvdW50KTsKIH0KQEAgLTY2OCw3ICs3NTIsNyBAQAogc3RhdHVzX3QgQXVkaW9UcmFjazo6c2V0TWFya2VyUG9zaXRpb24odWludDMyX3QgbWFya2VyKQogewogICAgIC8vIFRoZSBvbmx5IHB1cnBvc2Ugb2Ygc2V0dGluZyBtYXJrZXIgcG9zaXRpb24gaXMgdG8gZ2V0IGEgY2FsbGJhY2sKLSAgICBpZiAobUNiZiA9PSBOVUxMIHx8IGlzT2ZmbG9hZGVkKCkpIHsKKyAgICBpZiAobUNiZiA9PSBOVUxMIHx8IGlzT2ZmbG9hZGVkT3JEaXJlY3QoKSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCkBAIC02ODEsNyArNzY1LDcgQEAKIAogc3RhdHVzX3QgQXVkaW9UcmFjazo6Z2V0TWFya2VyUG9zaXRpb24odWludDMyX3QgKm1hcmtlcikgY29uc3QKIHsKLSAgICBpZiAoaXNPZmZsb2FkZWQoKSkgeworICAgIGlmIChpc09mZmxvYWRlZE9yRGlyZWN0KCkpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICBpZiAobWFya2VyID09IE5VTEwpIHsKQEAgLTY5NywxOSArNzgxLDIwIEBACiBzdGF0dXNfdCBBdWRpb1RyYWNrOjpzZXRQb3NpdGlvblVwZGF0ZVBlcmlvZCh1aW50MzJfdCB1cGRhdGVQZXJpb2QpCiB7CiAgICAgLy8gVGhlIG9ubHkgcHVycG9zZSBvZiBzZXR0aW5nIHBvc2l0aW9uIHVwZGF0ZSBwZXJpb2QgaXMgdG8gZ2V0IGEgY2FsbGJhY2sKLSAgICBpZiAobUNiZiA9PSBOVUxMIHx8IGlzT2ZmbG9hZGVkKCkpIHsKKyAgICBpZiAobUNiZiA9PSBOVUxMIHx8IGlzT2ZmbG9hZGVkT3JEaXJlY3QoKSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIG1OZXdQb3NpdGlvbiA9IG1Qcm94eS0+Z2V0UG9zaXRpb24oKSArIHVwZGF0ZVBlcmlvZDsKKyAgICBtTmV3UG9zaXRpb24gPSB1cGRhdGVBbmRHZXRQb3NpdGlvbl9sKCkgKyB1cGRhdGVQZXJpb2Q7CiAgICAgbVVwZGF0ZVBlcmlvZCA9IHVwZGF0ZVBlcmlvZDsKKwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogc3RhdHVzX3QgQXVkaW9UcmFjazo6Z2V0UG9zaXRpb25VcGRhdGVQZXJpb2QodWludDMyX3QgKnVwZGF0ZVBlcmlvZCkgY29uc3QKIHsKLSAgICBpZiAoaXNPZmZsb2FkZWQoKSkgeworICAgIGlmIChpc09mZmxvYWRlZE9yRGlyZWN0KCkpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICBpZiAodXBkYXRlUGVyaW9kID09IE5VTEwpIHsKQEAgLTcyNCw3ICs4MDksNyBAQAogCiBzdGF0dXNfdCBBdWRpb1RyYWNrOjpzZXRQb3NpdGlvbih1aW50MzJfdCBwb3NpdGlvbikKIHsKLSAgICBpZiAobVNoYXJlZEJ1ZmZlciA9PSAwIHx8IG1Jc1RpbWVkIHx8IGlzT2ZmbG9hZGVkKCkpIHsKKyAgICBpZiAobVNoYXJlZEJ1ZmZlciA9PSAwIHx8IG1Jc1RpbWVkIHx8IGlzT2ZmbG9hZGVkT3JEaXJlY3QoKSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIGlmIChwb3NpdGlvbiA+IG1GcmFtZUNvdW50KSB7CkBAIC03NDEsNyArODI2LDcgQEAKICAgICBpZiAobVN0YXRlID09IFNUQVRFX0FDVElWRSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIG1OZXdQb3NpdGlvbiA9IG1Qcm94eS0+Z2V0UG9zaXRpb24oKSArIG1VcGRhdGVQZXJpb2Q7CisgICAgbU5ld1Bvc2l0aW9uID0gdXBkYXRlQW5kR2V0UG9zaXRpb25fbCgpICsgbVVwZGF0ZVBlcmlvZDsKICAgICBtTG9vcFBlcmlvZCA9IDA7CiAgICAgLy8gRklYTUUgQ2hlY2sgd2hldGhlciBsb29wcyBhbmQgc2V0dGluZyBwb3NpdGlvbiBhcmUgaW5jb21wYXRpYmxlIGluIG9sZCBjb2RlLgogICAgIC8vIElmIHdlIHVzZSBzZXRMb29wIGZvciBib3RoIHB1cnBvc2VzIHdlIGxvc2UgdGhlIGNhcGFiaWxpdHkgdG8gc2V0IHRoZSBwb3NpdGlvbiB3aGlsZSBsb29waW5nLgpAQCAtNzUwLDM2ICs4MzUsMzggQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvVHJhY2s6OmdldFBvc2l0aW9uKHVpbnQzMl90ICpwb3NpdGlvbikgY29uc3QKK3N0YXR1c190IEF1ZGlvVHJhY2s6OmdldFBvc2l0aW9uKHVpbnQzMl90ICpwb3NpdGlvbikKIHsKICAgICBpZiAocG9zaXRpb24gPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICBpZiAoaXNPZmZsb2FkZWQoKSkgeworICAgIGlmIChpc09mZmxvYWRlZE9yRGlyZWN0X2woKSkgewogICAgICAgICB1aW50MzJfdCBkc3BGcmFtZXMgPSAwOwogCi0gICAgICAgIGlmICgobVN0YXRlID09IFNUQVRFX1BBVVNFRCkgfHwgKG1TdGF0ZSA9PSBTVEFURV9QQVVTRURfU1RPUFBJTkcpKSB7CisgICAgICAgIGlmIChpc09mZmxvYWRlZF9sKCkgJiYgKChtU3RhdGUgPT0gU1RBVEVfUEFVU0VEKSB8fCAobVN0YXRlID09IFNUQVRFX1BBVVNFRF9TVE9QUElORykpKSB7CiAgICAgICAgICAgICBBTE9HVigiZ2V0UG9zaXRpb24gY2FsbGVkIGluIHBhdXNlZCBzdGF0ZSwgcmV0dXJuIGNhY2hlZCBwb3NpdGlvbiAldSIsIG1QYXVzZWRQb3NpdGlvbik7CiAgICAgICAgICAgICAqcG9zaXRpb24gPSBtUGF1c2VkUG9zaXRpb247CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobU91dHB1dCAhPSAwKSB7CisgICAgICAgIGlmIChtT3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgICAgICB1aW50MzJfdCBoYWxGcmFtZXM7CiAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6Z2V0UmVuZGVyUG9zaXRpb24obU91dHB1dCwgJmhhbEZyYW1lcywgJmRzcEZyYW1lcyk7CiAgICAgICAgIH0KKyAgICAgICAgLy8gRklYTUU6IGRzcEZyYW1lcyBtYXkgbm90IGJlIHplcm8gaW4gKG1TdGF0ZSA9PSBTVEFURV9TVE9QUEVEIHx8IG1TdGF0ZSA9PSBTVEFURV9GTFVTSEVEKQorICAgICAgICAvLyBkdWUgdG8gaGFyZHdhcmUgbGF0ZW5jeS4gV2UgbGVhdmUgdGhpcyBiZWhhdmlvciBmb3Igbm93LgogICAgICAgICAqcG9zaXRpb24gPSBkc3BGcmFtZXM7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gSUF1ZGlvVHJhY2s6OnN0b3AoKSBpc24ndCBzeW5jaHJvbm91czsgd2UgZG9uJ3Qga25vdyB3aGVuIHByZXNlbnRhdGlvbiBjb21wbGV0ZXMKLSAgICAgICAgKnBvc2l0aW9uID0gKG1TdGF0ZSA9PSBTVEFURV9TVE9QUEVEIHx8IG1TdGF0ZSA9PSBTVEFURV9GTFVTSEVEKSA/IDAgOgotICAgICAgICAgICAgICAgIG1Qcm94eS0+Z2V0UG9zaXRpb24oKTsKKyAgICAgICAgKnBvc2l0aW9uID0gKG1TdGF0ZSA9PSBTVEFURV9TVE9QUEVEIHx8IG1TdGF0ZSA9PSBTVEFURV9GTFVTSEVEKSA/CisgICAgICAgICAgICAgICAgMCA6IHVwZGF0ZUFuZEdldFBvc2l0aW9uX2woKTsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBBdWRpb1RyYWNrOjpnZXRCdWZmZXJQb3NpdGlvbihzaXplX3QgKnBvc2l0aW9uKQorc3RhdHVzX3QgQXVkaW9UcmFjazo6Z2V0QnVmZmVyUG9zaXRpb24odWludDMyX3QgKnBvc2l0aW9uKQogewogICAgIGlmIChtU2hhcmVkQnVmZmVyID09IDAgfHwgbUlzVGltZWQpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtNzk1LDcgKzg4Miw3IEBACiAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnJlbG9hZCgpCiB7Ci0gICAgaWYgKG1TaGFyZWRCdWZmZXIgPT0gMCB8fCBtSXNUaW1lZCB8fCBpc09mZmxvYWRlZCgpKSB7CisgICAgaWYgKG1TaGFyZWRCdWZmZXIgPT0gMCB8fCBtSXNUaW1lZCB8fCBpc09mZmxvYWRlZE9yRGlyZWN0KCkpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIApAQCAtODEyLDIzICs4OTksMTIgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLWF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvVHJhY2s6OmdldE91dHB1dCgpCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1RyYWNrOjpnZXRPdXRwdXQoKSBjb25zdAogewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKICAgICByZXR1cm4gbU91dHB1dDsKIH0KIAotLy8gbXVzdCBiZSBjYWxsZWQgd2l0aCBtTG9jayBoZWxkCi1hdWRpb19pb19oYW5kbGVfdCBBdWRpb1RyYWNrOjpnZXRPdXRwdXRfbCgpCi17Ci0gICAgaWYgKG1PdXRwdXQpIHsKLSAgICAgICAgcmV0dXJuIG1PdXRwdXQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXQobVN0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBtRm9ybWF0LCBtQ2hhbm5lbE1hc2ssIG1GbGFncyk7Ci0gICAgfQotfQotCiBzdGF0dXNfdCBBdWRpb1RyYWNrOjphdHRhY2hBdXhFZmZlY3QoaW50IGVmZmVjdElkKQogewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKQEAgLTg0MiwxNSArOTE4LDcgQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogLy8gbXVzdCBiZSBjYWxsZWQgd2l0aCBtTG9jayBoZWxkCi1zdGF0dXNfdCBBdWRpb1RyYWNrOjpjcmVhdGVUcmFja19sKAotICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCi0gICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCi0gICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgIHNpemVfdCBlcG9jaCkKK3N0YXR1c190IEF1ZGlvVHJhY2s6OmNyZWF0ZVRyYWNrX2woKQogewogICAgIHN0YXR1c190IHN0YXR1czsKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CkBAIC04NTksNDEgKzkyNyw1NCBAQAogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0Rm9yQXR0cigmbUF0dHJpYnV0ZXMsIG1TYW1wbGVSYXRlLCBtRm9ybWF0LAorICAgICAgICAgICAgbUNoYW5uZWxNYXNrLCBtRmxhZ3MsIG1PZmZsb2FkSW5mbyk7CisgICAgaWYgKG91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBhdWRpbyBvdXRwdXQgZm9yIHN0cmVhbSB0eXBlICVkLCB1c2FnZSAlZCwgc2FtcGxlIHJhdGUgJXUsIGZvcm1hdCAlI3gsIgorICAgICAgICAgICAgICAiIGNoYW5uZWwgbWFzayAlI3gsIGZsYWdzICUjeCIsCisgICAgICAgICAgICAgIG1TdHJlYW1UeXBlLCBtQXR0cmlidXRlcy51c2FnZSwgbVNhbXBsZVJhdGUsIG1Gb3JtYXQsIG1DaGFubmVsTWFzaywgbUZsYWdzKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgeworICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgYSByZWZlcmVuY2UgdG8gYW4gSS9PIGhhbmRsZSBhbmQgaGF2ZSBub3QgeWV0IGhhbmRlZCBpdCBvZmYgdG8gQXVkaW9GbGluZ2VyLAorICAgIC8vIHdlIG11c3QgcmVsZWFzZSBpdCBvdXJzZWx2ZXMgaWYgYW55dGhpbmcgZ29lcyB3cm9uZy4KKwogICAgIC8vIE5vdCBhbGwgb2YgdGhlc2UgdmFsdWVzIGFyZSBuZWVkZWQgdW5kZXIgYWxsIGNvbmRpdGlvbnMsIGJ1dCBpdCBpcyBlYXNpZXIgdG8gZ2V0IHRoZW0gYWxsCiAKICAgICB1aW50MzJfdCBhZkxhdGVuY3k7Ci0gICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldExhdGVuY3kob3V0cHV0LCBzdHJlYW1UeXBlLCAmYWZMYXRlbmN5KTsKKyAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0TGF0ZW5jeShvdXRwdXQsICZhZkxhdGVuY3kpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR0UoImdldExhdGVuY3koJWQpIGZhaWxlZCBzdGF0dXMgJWQiLCBvdXRwdXQsIHN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICBnb3RvIHJlbGVhc2U7CiAgICAgfQogCiAgICAgc2l6ZV90IGFmRnJhbWVDb3VudDsKLSAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0RnJhbWVDb3VudChvdXRwdXQsIHN0cmVhbVR5cGUsICZhZkZyYW1lQ291bnQpOworICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRGcmFtZUNvdW50KG91dHB1dCwgJmFmRnJhbWVDb3VudCk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiZ2V0RnJhbWVDb3VudChvdXRwdXQ9JWQsIHN0cmVhbVR5cGU9JWQpIHN0YXR1cyAlZCIsIG91dHB1dCwgc3RyZWFtVHlwZSwgc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIEFMT0dFKCJnZXRGcmFtZUNvdW50KG91dHB1dD0lZCkgc3RhdHVzICVkIiwgb3V0cHV0LCBzdGF0dXMpOworICAgICAgICBnb3RvIHJlbGVhc2U7CiAgICAgfQogCiAgICAgdWludDMyX3QgYWZTYW1wbGVSYXRlOwotICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRTYW1wbGluZ1JhdGUob3V0cHV0LCBzdHJlYW1UeXBlLCAmYWZTYW1wbGVSYXRlKTsKKyAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0U2FtcGxpbmdSYXRlKG91dHB1dCwgJmFmU2FtcGxlUmF0ZSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiZ2V0U2FtcGxpbmdSYXRlKG91dHB1dD0lZCwgc3RyZWFtVHlwZT0lZCkgc3RhdHVzICVkIiwgb3V0cHV0LCBzdHJlYW1UeXBlLCBzdGF0dXMpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgQUxPR0UoImdldFNhbXBsaW5nUmF0ZShvdXRwdXQ9JWQpIHN0YXR1cyAlZCIsIG91dHB1dCwgc3RhdHVzKTsKKyAgICAgICAgZ290byByZWxlYXNlOwogICAgIH0KIAogICAgIC8vIENsaWVudCBkZWNpZGVzIHdoZXRoZXIgdGhlIHRyYWNrIGlzIFRJTUVEIChzZWUgYmVsb3cpLCBidXQgY2FuIG9ubHkgZXhwcmVzcyBhIHByZWZlcmVuY2UKICAgICAvLyBmb3IgRkFTVC4gIFNlcnZlciB3aWxsIHBlcmZvcm0gYWRkaXRpb25hbCB0ZXN0cy4KLSAgICBpZiAoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkgJiYgISgKKyAgICBpZiAoKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpICYmICEoKAogICAgICAgICAgICAgLy8gZWl0aGVyIG9mIHRoZXNlIHVzZSBjYXNlczoKICAgICAgICAgICAgIC8vIHVzZSBjYXNlIDE6IHNoYXJlZCBidWZmZXIKLSAgICAgICAgICAgIChzaGFyZWRCdWZmZXIgIT0gMCkgfHwKLSAgICAgICAgICAgIC8vIHVzZSBjYXNlIDI6IGNhbGxiYWNrIGhhbmRsZXIKLSAgICAgICAgICAgIChtQ2JmICE9IE5VTEwpKSkgeworICAgICAgICAgICAgKG1TaGFyZWRCdWZmZXIgIT0gMCkgfHwKKyAgICAgICAgICAgIC8vIHVzZSBjYXNlIDI6IGNhbGxiYWNrIHRyYW5zZmVyIG1vZGUKKyAgICAgICAgICAgIChtVHJhbnNmZXIgPT0gVFJBTlNGRVJfQ0FMTEJBQ0spKSAmJgorICAgICAgICAgICAgLy8gbWF0Y2hpbmcgc2FtcGxlIHJhdGUKKyAgICAgICAgICAgIChtU2FtcGxlUmF0ZSA9PSBhZlNhbXBsZVJhdGUpKSkgewogICAgICAgICBBTE9HVygiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBkZW5pZWQgYnkgY2xpZW50Iik7CiAgICAgICAgIC8vIG9uY2UgZGVuaWVkLCBkbyBub3QgcmVxdWVzdCBhZ2FpbiBpZiBJQXVkaW9UcmFjayBpcyByZS1jcmVhdGVkCi0gICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSAoZmxhZ3MgJiB+QVVESU9fT1VUUFVUX0ZMQUdfRkFTVCk7Ci0gICAgICAgIG1GbGFncyA9IGZsYWdzOworICAgICAgICBtRmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpIChtRmxhZ3MgJiB+QVVESU9fT1VUUFVUX0ZMQUdfRkFTVCk7CiAgICAgfQogICAgIEFMT0dWKCJjcmVhdGVUcmFja19sKCkgb3V0cHV0ICVkIGFmTGF0ZW5jeSAlZCIsIG91dHB1dCwgYWZMYXRlbmN5KTsKIApAQCAtOTA0LDY0ICs5ODUsNzAgQEAKICAgICAvLyAgbiA9IDMgICBub3JtYWwgdHJhY2ssIHdpdGggc2FtcGxlIHJhdGUgY29udmVyc2lvbgogICAgIC8vICAgICAgICAgIChwZXNzaW1pc3RpYzsgc29tZSBub24tMToxIGNvbnZlcnNpb24gcmF0aW9zIGRvbid0IGFjdHVhbGx5IG5lZWQgdHJpcGxlLWJ1ZmZlcmluZykKICAgICAvLyAgbiA+IDMgICB2ZXJ5IGhpZ2ggbGF0ZW5jeSBvciB2ZXJ5IHNtYWxsIG5vdGlmaWNhdGlvbiBpbnRlcnZhbDsgbkJ1ZmZlcmluZyBpcyBpZ25vcmVkCi0gICAgY29uc3QgdWludDMyX3QgbkJ1ZmZlcmluZyA9IChzYW1wbGVSYXRlID09IGFmU2FtcGxlUmF0ZSkgPyAyIDogMzsKKyAgICBjb25zdCB1aW50MzJfdCBuQnVmZmVyaW5nID0gKG1TYW1wbGVSYXRlID09IGFmU2FtcGxlUmF0ZSkgPyAyIDogMzsKIAogICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSBtTm90aWZpY2F0aW9uRnJhbWVzUmVxOwogCi0gICAgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpIHsKKyAgICBzaXplX3QgZnJhbWVDb3VudCA9IG1SZXFGcmFtZUNvdW50OworICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSkgewogCi0gICAgICAgIGlmIChzaGFyZWRCdWZmZXIgIT0gMCkgeworICAgICAgICBpZiAobVNoYXJlZEJ1ZmZlciAhPSAwKSB7CiAgICAgICAgICAgICAvLyBTYW1lIGNvbW1lbnQgYXMgYmVsb3cgYWJvdXQgaWdub3JpbmcgZnJhbWVDb3VudCBwYXJhbWV0ZXIgZm9yIHNldCgpCi0gICAgICAgICAgICBmcmFtZUNvdW50ID0gc2hhcmVkQnVmZmVyLT5zaXplKCk7CisgICAgICAgICAgICBmcmFtZUNvdW50ID0gbVNoYXJlZEJ1ZmZlci0+c2l6ZSgpOwogICAgICAgICB9IGVsc2UgaWYgKGZyYW1lQ291bnQgPT0gMCkgewogICAgICAgICAgICAgZnJhbWVDb3VudCA9IGFmRnJhbWVDb3VudDsKICAgICAgICAgfQogICAgICAgICBpZiAobU5vdGlmaWNhdGlvbkZyYW1lc0FjdCAhPSBmcmFtZUNvdW50KSB7CiAgICAgICAgICAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID0gZnJhbWVDb3VudDsKICAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoc2hhcmVkQnVmZmVyICE9IDApIHsKKyAgICB9IGVsc2UgaWYgKG1TaGFyZWRCdWZmZXIgIT0gMCkgewogCiAgICAgICAgIC8vIEVuc3VyZSB0aGF0IGJ1ZmZlciBhbGlnbm1lbnQgbWF0Y2hlcyBjaGFubmVsIGNvdW50CiAgICAgICAgIC8vIDgtYml0IGRhdGEgaW4gc2hhcmVkIG1lbW9yeSBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBieSBBdWRpb0ZsaW5nZXIKLSAgICAgICAgc2l6ZV90IGFsaWdubWVudCA9IC8qIGZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzhfQklUID8gMSA6ICovIDI7CisgICAgICAgIHNpemVfdCBhbGlnbm1lbnQgPSBhdWRpb19ieXRlc19wZXJfc2FtcGxlKAorICAgICAgICAgICAgICAgIG1Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV84X0JJVCA/IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIDogbUZvcm1hdCk7CisgICAgICAgIGlmIChhbGlnbm1lbnQgJiAxKSB7CisgICAgICAgICAgICBhbGlnbm1lbnQgPSAxOworICAgICAgICB9CiAgICAgICAgIGlmIChtQ2hhbm5lbENvdW50ID4gMSkgewogICAgICAgICAgICAgLy8gTW9yZSB0aGFuIDIgY2hhbm5lbHMgZG9lcyBub3QgcmVxdWlyZSBzdHJvbmdlciBhbGlnbm1lbnQgdGhhbiBzdGVyZW8KICAgICAgICAgICAgIGFsaWdubWVudCA8PD0gMTsKICAgICAgICAgfQotICAgICAgICBpZiAoKChzaXplX3Qpc2hhcmVkQnVmZmVyLT5wb2ludGVyKCkgJiAoYWxpZ25tZW50IC0gMSkpICE9IDApIHsKKyAgICAgICAgaWYgKCgodWludHB0cl90KW1TaGFyZWRCdWZmZXItPnBvaW50ZXIoKSAmIChhbGlnbm1lbnQgLSAxKSkgIT0gMCkgewogICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgYnVmZmVyIGFsaWdubWVudDogYWRkcmVzcyAlcCwgY2hhbm5lbCBjb3VudCAldSIsCi0gICAgICAgICAgICAgICAgICAgIHNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpLCBtQ2hhbm5lbENvdW50KTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIG1TaGFyZWRCdWZmZXItPnBvaW50ZXIoKSwgbUNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICBnb3RvIHJlbGVhc2U7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBXaGVuIGluaXRpYWxpemluZyBhIHNoYXJlZCBidWZmZXIgQXVkaW9UcmFjayB2aWEgY29uc3RydWN0b3JzLAogICAgICAgICAvLyB0aGVyZSdzIG5vIGZyYW1lQ291bnQgcGFyYW1ldGVyLgogICAgICAgICAvLyBCdXQgd2hlbiBpbml0aWFsaXppbmcgYSBzaGFyZWQgYnVmZmVyIEF1ZGlvVHJhY2sgdmlhIHNldCgpLAogICAgICAgICAvLyB0aGVyZSBfaXNfIGEgZnJhbWVDb3VudCBwYXJhbWV0ZXIuICBXZSBzaWxlbnRseSBpZ25vcmUgaXQuCi0gICAgICAgIGZyYW1lQ291bnQgPSBzaGFyZWRCdWZmZXItPnNpemUoKS9tQ2hhbm5lbENvdW50L3NpemVvZihpbnQxNl90KTsKKyAgICAgICAgZnJhbWVDb3VudCA9IG1TaGFyZWRCdWZmZXItPnNpemUoKSAvIG1GcmFtZVNpemVBRjsKIAotICAgIH0gZWxzZSBpZiAoIShmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpKSB7CisgICAgfSBlbHNlIGlmICghKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpKSB7CiAKICAgICAgICAgLy8gRklYTUUgbW92ZSB0aGVzZSBjYWxjdWxhdGlvbnMgYW5kIGFzc29jaWF0ZWQgY2hlY2tzIHRvIHNlcnZlcgogCiAgICAgICAgIC8vIEVuc3VyZSB0aGF0IGJ1ZmZlciBkZXB0aCBjb3ZlcnMgYXQgbGVhc3QgYXVkaW8gaGFyZHdhcmUgbGF0ZW5jeQogICAgICAgICB1aW50MzJfdCBtaW5CdWZDb3VudCA9IGFmTGF0ZW5jeSAvICgoMTAwMCAqIGFmRnJhbWVDb3VudCkvYWZTYW1wbGVSYXRlKTsKLSAgICAgICAgQUxPR1YoImFmRnJhbWVDb3VudD0lZCwgbWluQnVmQ291bnQ9JWQsIGFmU2FtcGxlUmF0ZT0ldSwgYWZMYXRlbmN5PSVkIiwKKyAgICAgICAgQUxPR1YoImFmRnJhbWVDb3VudD0lenUsIG1pbkJ1ZkNvdW50PSVkLCBhZlNhbXBsZVJhdGU9JXUsIGFmTGF0ZW5jeT0lZCIsCiAgICAgICAgICAgICAgICAgYWZGcmFtZUNvdW50LCBtaW5CdWZDb3VudCwgYWZTYW1wbGVSYXRlLCBhZkxhdGVuY3kpOwogICAgICAgICBpZiAobWluQnVmQ291bnQgPD0gbkJ1ZmZlcmluZykgewogICAgICAgICAgICAgbWluQnVmQ291bnQgPSBuQnVmZmVyaW5nOwogICAgICAgICB9CiAKLSAgICAgICAgc2l6ZV90IG1pbkZyYW1lQ291bnQgPSAoYWZGcmFtZUNvdW50KnNhbXBsZVJhdGUqbWluQnVmQ291bnQpL2FmU2FtcGxlUmF0ZTsKLSAgICAgICAgQUxPR1YoIm1pbkZyYW1lQ291bnQ6ICV1LCBhZkZyYW1lQ291bnQ9JWQsIG1pbkJ1ZkNvdW50PSVkLCBzYW1wbGVSYXRlPSV1LCBhZlNhbXBsZVJhdGU9JXUiCisgICAgICAgIHNpemVfdCBtaW5GcmFtZUNvdW50ID0gYWZGcmFtZUNvdW50ICogbWluQnVmQ291bnQgKiB1aW50NjRfdChtU2FtcGxlUmF0ZSkgLyBhZlNhbXBsZVJhdGU7CisgICAgICAgIEFMT0dWKCJtaW5GcmFtZUNvdW50OiAlenUsIGFmRnJhbWVDb3VudD0lenUsIG1pbkJ1ZkNvdW50PSVkLCBzYW1wbGVSYXRlPSV1LCBhZlNhbXBsZVJhdGU9JXUiCiAgICAgICAgICAgICAgICAgIiwgYWZMYXRlbmN5PSVkIiwKLSAgICAgICAgICAgICAgICBtaW5GcmFtZUNvdW50LCBhZkZyYW1lQ291bnQsIG1pbkJ1ZkNvdW50LCBzYW1wbGVSYXRlLCBhZlNhbXBsZVJhdGUsIGFmTGF0ZW5jeSk7CisgICAgICAgICAgICAgICAgbWluRnJhbWVDb3VudCwgYWZGcmFtZUNvdW50LCBtaW5CdWZDb3VudCwgbVNhbXBsZVJhdGUsIGFmU2FtcGxlUmF0ZSwgYWZMYXRlbmN5KTsKIAogICAgICAgICBpZiAoZnJhbWVDb3VudCA9PSAwKSB7CiAgICAgICAgICAgICBmcmFtZUNvdW50ID0gbWluRnJhbWVDb3VudDsKICAgICAgICAgfSBlbHNlIGlmIChmcmFtZUNvdW50IDwgbWluRnJhbWVDb3VudCkgewogICAgICAgICAgICAgLy8gbm90IEFMT0dXIGJlY2F1c2UgaXQgaGFwcGVucyBhbGwgdGhlIHRpbWUgd2hlbiBwbGF5aW5nIGtleSBjbGlja3Mgb3ZlciBBMkRQCi0gICAgICAgICAgICBBTE9HVigiTWluaW11bSBidWZmZXIgc2l6ZSBjb3JyZWN0ZWQgZnJvbSAlZCB0byAlZCIsCisgICAgICAgICAgICBBTE9HVigiTWluaW11bSBidWZmZXIgc2l6ZSBjb3JyZWN0ZWQgZnJvbSAlenUgdG8gJXp1IiwKICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIG1pbkZyYW1lQ291bnQpOwogICAgICAgICAgICAgZnJhbWVDb3VudCA9IG1pbkZyYW1lQ291bnQ7CiAgICAgICAgIH0KQEAgLTk4MCw0MiArMTA2Nyw1OCBAQAogICAgIH0KIAogICAgIHBpZF90IHRpZCA9IC0xOwotICAgIGlmIChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpIHsKKyAgICBpZiAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkgewogICAgICAgICB0cmFja0ZsYWdzIHw9IElBdWRpb0ZsaW5nZXI6OlRSQUNLX0ZBU1Q7CiAgICAgICAgIGlmIChtQXVkaW9UcmFja1RocmVhZCAhPSAwKSB7CiAgICAgICAgICAgICB0aWQgPSBtQXVkaW9UcmFja1RocmVhZC0+Z2V0VGlkKCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSB7CisgICAgaWYgKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpIHsKICAgICAgICAgdHJhY2tGbGFncyB8PSBJQXVkaW9GbGluZ2VyOjpUUkFDS19PRkZMT0FEOwogICAgIH0KIAotICAgIHNwPElBdWRpb1RyYWNrPiB0cmFjayA9IGF1ZGlvRmxpbmdlci0+Y3JlYXRlVHJhY2soc3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgaWYgKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgeworICAgICAgICB0cmFja0ZsYWdzIHw9IElBdWRpb0ZsaW5nZXI6OlRSQUNLX0RJUkVDVDsKKyAgICB9CisKKyAgICBzaXplX3QgdGVtcCA9IGZyYW1lQ291bnQ7ICAgLy8gdGVtcCBtYXkgYmUgcmVwbGFjZWQgYnkgYSByZXZpc2VkIHZhbHVlIG9mIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCB3ZSB3aWxsIHN0aWxsIG5lZWQgdGhlIG9yaWdpbmFsIHZhbHVlIGFsc28KKyAgICBzcDxJQXVkaW9UcmFjaz4gdHJhY2sgPSBhdWRpb0ZsaW5nZXItPmNyZWF0ZVRyYWNrKG1TdHJlYW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdWRpb0ZsaW5nZXIgb25seSBzZWVzIDE2LWJpdCBQQ00KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzhfQklUID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgOiBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCA6IG1Gb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhY2tGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TaGFyZWRCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNsaWVudFVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMpOwogCi0gICAgaWYgKHRyYWNrID09IDApIHsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIEFMT0dFKCJBdWRpb0ZsaW5nZXIgY291bGQgbm90IGNyZWF0ZSB0cmFjaywgc3RhdHVzOiAlZCIsIHN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIGdvdG8gcmVsZWFzZTsKICAgICB9CisgICAgQUxPR19BU1NFUlQodHJhY2sgIT0gMCk7CisKKyAgICAvLyBBdWRpb0ZsaW5nZXIgbm93IG93bnMgdGhlIHJlZmVyZW5jZSB0byB0aGUgSS9PIGhhbmRsZSwKKyAgICAvLyBzbyB3ZSBhcmUgbm8gbG9uZ2VyIHJlc3BvbnNpYmxlIGZvciByZWxlYXNpbmcgaXQuCisKICAgICBzcDxJTWVtb3J5PiBpTWVtID0gdHJhY2stPmdldENibGsoKTsKICAgICBpZiAoaU1lbSA9PSAwKSB7CiAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2siKTsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQorICAgIHZvaWQgKmlNZW1Qb2ludGVyID0gaU1lbS0+cG9pbnRlcigpOworICAgIGlmIChpTWVtUG9pbnRlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2sgcG9pbnRlciIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CiAgICAgLy8gaW52YXJpYW50IHRoYXQgbUF1ZGlvVHJhY2sgIT0gMCBpcyB0cnVlIG9ubHkgYWZ0ZXIgc2V0KCkgcmV0dXJucyBzdWNjZXNzZnVsbHkKICAgICBpZiAobUF1ZGlvVHJhY2sgIT0gMCkgewogICAgICAgICBtQXVkaW9UcmFjay0+YXNCaW5kZXIoKS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgdGhpcyk7CkBAIC0xMDIzLDIyICsxMTI2LDI1IEBACiAgICAgfQogICAgIG1BdWRpb1RyYWNrID0gdHJhY2s7CiAgICAgbUNibGtNZW1vcnkgPSBpTWVtOwotICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsayA9IHN0YXRpY19jYXN0PGF1ZGlvX3RyYWNrX2NibGtfdCo+KGlNZW0tPnBvaW50ZXIoKSk7CisgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOworCisgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gc3RhdGljX2Nhc3Q8YXVkaW9fdHJhY2tfY2Jsa190Kj4oaU1lbVBvaW50ZXIpOwogICAgIG1DYmxrID0gY2JsazsKLSAgICBzaXplX3QgdGVtcCA9IGNibGstPmZyYW1lQ291bnRfOworICAgIC8vIG5vdGUgdGhhdCB0ZW1wIGlzIHRoZSAocG9zc2libHkgcmV2aXNlZCkgdmFsdWUgb2YgZnJhbWVDb3VudAogICAgIGlmICh0ZW1wIDwgZnJhbWVDb3VudCB8fCAoZnJhbWVDb3VudCA9PSAwICYmIHRlbXAgPT0gMCkpIHsKICAgICAgICAgLy8gSW4gY3VycmVudCBkZXNpZ24sIEF1ZGlvVHJhY2sgY2xpZW50IGNoZWNrcyBhbmQgZW5zdXJlcyBmcmFtZSBjb3VudCB2YWxpZGl0eSBiZWZvcmUKICAgICAgICAgLy8gcGFzc2luZyBpdCB0byBBdWRpb0ZsaW5nZXIgc28gQXVkaW9GbGluZ2VyIHNob3VsZCBub3QgcmV0dXJuIGEgZGlmZmVyZW50IHZhbHVlIGV4Y2VwdAogICAgICAgICAvLyBmb3IgZmFzdCB0cmFjayBhcyBpdCB1c2VzIGEgc3BlY2lhbCBtZXRob2Qgb2YgYXNzaWduaW5nIGZyYW1lIGNvdW50LgotICAgICAgICBBTE9HVygiUmVxdWVzdGVkIGZyYW1lQ291bnQgJXUgYnV0IHJlY2VpdmVkIGZyYW1lQ291bnQgJXUiLCBmcmFtZUNvdW50LCB0ZW1wKTsKKyAgICAgICAgQUxPR1coIlJlcXVlc3RlZCBmcmFtZUNvdW50ICV6dSBidXQgcmVjZWl2ZWQgZnJhbWVDb3VudCAlenUiLCBmcmFtZUNvdW50LCB0ZW1wKTsKICAgICB9CiAgICAgZnJhbWVDb3VudCA9IHRlbXA7CisKICAgICBtQXdhaXRCb29zdCA9IGZhbHNlOwotICAgIGlmIChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpIHsKKyAgICBpZiAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkgewogICAgICAgICBpZiAodHJhY2tGbGFncyAmIElBdWRpb0ZsaW5nZXI6OlRSQUNLX0ZBU1QpIHsKLSAgICAgICAgICAgIEFMT0dWKCJBVURJT19PVVRQVVRfRkxBR19GQVNUIHN1Y2Nlc3NmdWw7IGZyYW1lQ291bnQgJXUiLCBmcmFtZUNvdW50KTsKKyAgICAgICAgICAgIEFMT0dWKCJBVURJT19PVVRQVVRfRkxBR19GQVNUIHN1Y2Nlc3NmdWw7IGZyYW1lQ291bnQgJXp1IiwgZnJhbWVDb3VudCk7CiAgICAgICAgICAgICBtQXdhaXRCb29zdCA9IHRydWU7Ci0gICAgICAgICAgICBpZiAoc2hhcmVkQnVmZmVyID09IDApIHsKKyAgICAgICAgICAgIGlmIChtU2hhcmVkQnVmZmVyID09IDApIHsKICAgICAgICAgICAgICAgICAvLyBUaGVvcmV0aWNhbGx5IGRvdWJsZS1idWZmZXJpbmcgaXMgbm90IHJlcXVpcmVkIGZvciBmYXN0IHRyYWNrcywKICAgICAgICAgICAgICAgICAvLyBkdWUgdG8gdGlnaHRlciBzY2hlZHVsaW5nLiAgQnV0IGluIHByYWN0aWNlLCB0byBhY2NvbW1vZGF0ZSBrZXJuZWxzIHdpdGgKICAgICAgICAgICAgICAgICAvLyBzY2hlZHVsaW5nIGppdHRlciwgYW5kIGFwcHMgd2l0aCBjb21wdXRhdGlvbiBqaXR0ZXIsIHdlIHVzZSBkb3VibGUtYnVmZmVyaW5nLgpAQCAtMTA0NywyOCArMTE1MywzOSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dWKCJBVURJT19PVVRQVVRfRkxBR19GQVNUIGRlbmllZCBieSBzZXJ2ZXI7IGZyYW1lQ291bnQgJXUiLCBmcmFtZUNvdW50KTsKKyAgICAgICAgICAgIEFMT0dWKCJBVURJT19PVVRQVVRfRkxBR19GQVNUIGRlbmllZCBieSBzZXJ2ZXI7IGZyYW1lQ291bnQgJXp1IiwgZnJhbWVDb3VudCk7CiAgICAgICAgICAgICAvLyBvbmNlIGRlbmllZCwgZG8gbm90IHJlcXVlc3QgYWdhaW4gaWYgSUF1ZGlvVHJhY2sgaXMgcmUtY3JlYXRlZAotICAgICAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpIChmbGFncyAmIH5BVURJT19PVVRQVVRfRkxBR19GQVNUKTsKLSAgICAgICAgICAgIG1GbGFncyA9IGZsYWdzOwotICAgICAgICAgICAgaWYgKHNoYXJlZEJ1ZmZlciA9PSAwKSB7CisgICAgICAgICAgICBtRmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpIChtRmxhZ3MgJiB+QVVESU9fT1VUUFVUX0ZMQUdfRkFTVCk7CisgICAgICAgICAgICBpZiAobVNoYXJlZEJ1ZmZlciA9PSAwKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPT0gMCB8fCBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID4gZnJhbWVDb3VudC9uQnVmZmVyaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSBmcmFtZUNvdW50L25CdWZmZXJpbmc7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIGlmIChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpIHsKKyAgICBpZiAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgewogICAgICAgICBpZiAodHJhY2tGbGFncyAmIElBdWRpb0ZsaW5nZXI6OlRSQUNLX09GRkxPQUQpIHsKICAgICAgICAgICAgIEFMT0dWKCJBVURJT19PVVRQVVRfRkxBR19PRkZMT0FEIHN1Y2Nlc3NmdWwiKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dXKCJBVURJT19PVVRQVVRfRkxBR19PRkZMT0FEIGRlbmllZCBieSBzZXJ2ZXIiKTsKLSAgICAgICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSAoZmxhZ3MgJiB+QVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCk7Ci0gICAgICAgICAgICBtRmxhZ3MgPSBmbGFnczsKLSAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICAgICAgbUZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSAobUZsYWdzICYgfkFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpOworICAgICAgICAgICAgLy8gRklYTUUgVGhpcyBpcyBhIHdhcm5pbmcsIG5vdCBhbiBlcnJvciwgc28gZG9uJ3QgcmV0dXJuIGVycm9yIHN0YXR1cworICAgICAgICAgICAgLy9yZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSB7CisgICAgICAgIGlmICh0cmFja0ZsYWdzICYgSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfRElSRUNUKSB7CisgICAgICAgICAgICBBTE9HVigiQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUIHN1Y2Nlc3NmdWwiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCJBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QgZGVuaWVkIGJ5IHNlcnZlciIpOworICAgICAgICAgICAgbUZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSAobUZsYWdzICYgfkFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CisgICAgICAgICAgICAvLyBGSVhNRSBUaGlzIGlzIGEgd2FybmluZywgbm90IGFuIGVycm9yLCBzbyBkb24ndCByZXR1cm4gZXJyb3Igc3RhdHVzCisgICAgICAgICAgICAvL3JldHVybiBOT19JTklUOwogICAgICAgICB9CiAgICAgfQogCisgICAgLy8gV2UgcmV0YWluIGEgY29weSBvZiB0aGUgSS9PIGhhbmRsZSwgYnV0IGRvbid0IG93biB0aGUgcmVmZXJlbmNlCisgICAgbU91dHB1dCA9IG91dHB1dDsKICAgICBtUmVmcmVzaFJlbWFpbmluZyA9IHRydWU7CiAKICAgICAvLyBTdGFydGluZyBhZGRyZXNzIG9mIGJ1ZmZlcnMgaW4gc2hhcmVkIG1lbW9yeS4gIElmIHRoZXJlIGlzIGEgc2hhcmVkIGJ1ZmZlciwgYnVmZmVycwpAQCAtMTA3NiwxNSArMTE5MywxNiBAQAogICAgIC8vIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjb250cm9sIGJsb2NrLiAgVGhpcyBhZGRyZXNzIGlzIGZvciB0aGUgbWFwcGluZyB3aXRoaW4gY2xpZW50CiAgICAgLy8gYWRkcmVzcyBzcGFjZS4gIEF1ZGlvRmxpbmdlcjo6VHJhY2tCYXNlOjptQnVmZmVyIGlzIGZvciB0aGUgc2VydmVyIGFkZHJlc3Mgc3BhY2UuCiAgICAgdm9pZCogYnVmZmVyczsKLSAgICBpZiAoc2hhcmVkQnVmZmVyID09IDApIHsKKyAgICBpZiAobVNoYXJlZEJ1ZmZlciA9PSAwKSB7CiAgICAgICAgIGJ1ZmZlcnMgPSAoY2hhciopY2JsayArIHNpemVvZihhdWRpb190cmFja19jYmxrX3QpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGJ1ZmZlcnMgPSBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKTsKKyAgICAgICAgYnVmZmVycyA9IG1TaGFyZWRCdWZmZXItPnBvaW50ZXIoKTsKICAgICB9CiAKICAgICBtQXVkaW9UcmFjay0+YXR0YWNoQXV4RWZmZWN0KG1BdXhFZmZlY3RJZCk7CiAgICAgLy8gRklYTUUgZG9uJ3QgYmVsaWV2ZSB0aGlzIGxpZQotICAgIG1MYXRlbmN5ID0gYWZMYXRlbmN5ICsgKDEwMDAqZnJhbWVDb3VudCkgLyBzYW1wbGVSYXRlOworICAgIG1MYXRlbmN5ID0gYWZMYXRlbmN5ICsgKDEwMDAqZnJhbWVDb3VudCkgLyBtU2FtcGxlUmF0ZTsKKwogICAgIG1GcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKICAgICAvLyBJZiBJQXVkaW9UcmFjayBpcyByZS1jcmVhdGVkLCBkb24ndCBsZXQgdGhlIHJlcXVlc3RlZCBmcmFtZUNvdW50CiAgICAgLy8gZGVjcmVhc2UuICBUaGlzIGNhbiBjb25mdXNlIGNsaWVudHMgdGhhdCBjYWNoZSBmcmFtZUNvdW50KCkuCkBAIC0xMDkzLDI0ICsxMjExLDMwIEBACiAgICAgfQogCiAgICAgLy8gdXBkYXRlIHByb3h5Ci0gICAgaWYgKHNoYXJlZEJ1ZmZlciA9PSAwKSB7CisgICAgaWYgKG1TaGFyZWRCdWZmZXIgPT0gMCkgewogICAgICAgICBtU3RhdGljUHJveHkuY2xlYXIoKTsKICAgICAgICAgbVByb3h5ID0gbmV3IEF1ZGlvVHJhY2tDbGllbnRQcm94eShjYmxrLCBidWZmZXJzLCBmcmFtZUNvdW50LCBtRnJhbWVTaXplQUYpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1TdGF0aWNQcm94eSA9IG5ldyBTdGF0aWNBdWRpb1RyYWNrQ2xpZW50UHJveHkoY2JsaywgYnVmZmVycywgZnJhbWVDb3VudCwgbUZyYW1lU2l6ZUFGKTsKICAgICAgICAgbVByb3h5ID0gbVN0YXRpY1Byb3h5OwogICAgIH0KLSAgICBtUHJveHktPnNldFZvbHVtZUxSKCh1aW50MzJfdCh1aW50MTZfdChtVm9sdW1lW1JJR0hUXSAqIDB4MTAwMCkpIDw8IDE2KSB8Ci0gICAgICAgICAgICB1aW50MTZfdChtVm9sdW1lW0xFRlRdICogMHgxMDAwKSk7CisgICAgbVByb3h5LT5zZXRWb2x1bWVMUihHQUlOX01JTklGTE9BVF9QQUNLRURfVU5JVFkpOwogICAgIG1Qcm94eS0+c2V0U2VuZExldmVsKG1TZW5kTGV2ZWwpOwogICAgIG1Qcm94eS0+c2V0U2FtcGxlUmF0ZShtU2FtcGxlUmF0ZSk7Ci0gICAgbVByb3h5LT5zZXRFcG9jaChlcG9jaCk7CiAgICAgbVByb3h5LT5zZXRNaW5pbXVtKG1Ob3RpZmljYXRpb25GcmFtZXNBY3QpOwogCiAgICAgbURlYXRoTm90aWZpZXIgPSBuZXcgRGVhdGhOb3RpZmllcih0aGlzKTsKICAgICBtQXVkaW9UcmFjay0+YXNCaW5kZXIoKS0+bGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIsIHRoaXMpOwogCiAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworcmVsZWFzZToKKyAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChvdXRwdXQpOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogc3RhdHVzX3QgQXVkaW9UcmFjazo6b2J0YWluQnVmZmVyKEJ1ZmZlciogYXVkaW9CdWZmZXIsIGludDMyX3Qgd2FpdENvdW50KQpAQCAtMTIzMSw2ICsxMzU1LDcgQEAKICAgICBidWZmZXIubVJhdyA9IGF1ZGlvQnVmZmVyLT5yYXc7CiAKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgbVJlbGVhc2VkICs9IHN0ZXBDb3VudDsKICAgICBtSW5VbmRlcnJ1biA9IGZhbHNlOwogICAgIG1Qcm94eS0+cmVsZWFzZUJ1ZmZlcigmYnVmZmVyKTsKIApAQCAtMTIzOCw4ICsxMzYzLDcgQEAKICAgICBpZiAobVN0YXRlID09IFNUQVRFX0FDVElWRSkgewogICAgICAgICBhdWRpb190cmFja19jYmxrX3QqIGNibGsgPSBtQ2JsazsKICAgICAgICAgaWYgKGFuZHJvaWRfYXRvbWljX2FuZCh+Q0JMS19ESVNBQkxFRCwgJmNibGstPm1GbGFncykgJiBDQkxLX0RJU0FCTEVEKSB7Ci0gICAgICAgICAgICBBTE9HVygicmVsZWFzZUJ1ZmZlcigpIHRyYWNrICVwIG5hbWU9JXMgZGlzYWJsZWQgZHVlIHRvIHByZXZpb3VzIHVuZGVycnVuLCByZXN0YXJ0aW5nIiwKLSAgICAgICAgICAgICAgICAgICAgdGhpcywgbU5hbWUuc3RyaW5nKCkpOworICAgICAgICAgICAgQUxPR1coInJlbGVhc2VCdWZmZXIoKSB0cmFjayAlcCBkaXNhYmxlZCBkdWUgdG8gcHJldmlvdXMgdW5kZXJydW4sIHJlc3RhcnRpbmciLCB0aGlzKTsKICAgICAgICAgICAgIC8vIEZJWE1FIGlnbm9yaW5nIHN0YXR1cwogICAgICAgICAgICAgbUF1ZGlvVHJhY2stPnN0YXJ0KCk7CiAgICAgICAgIH0KQEAgLTEyNDgsMTYgKzEzNzIsMjYgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1zc2l6ZV90IEF1ZGlvVHJhY2s6OndyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHVzZXJTaXplKQorc3NpemVfdCBBdWRpb1RyYWNrOjp3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCB1c2VyU2l6ZSwgYm9vbCBibG9ja2luZykKIHsKICAgICBpZiAobVRyYW5zZmVyICE9IFRSQU5TRkVSX1NZTkMgfHwgbUlzVGltZWQpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAorICAgIGlmIChpc0RpcmVjdCgpKSB7CisgICAgICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICAgICAgaW50MzJfdCBmbGFncyA9IGFuZHJvaWRfYXRvbWljX2FuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KENCTEtfVU5ERVJSVU4gfCBDQkxLX0xPT1BfQ1lDTEUgfCBDQkxLX0xPT1BfRklOQUwgfCBDQkxLX0JVRkZFUl9FTkQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtQ2Jsay0+bUZsYWdzKTsKKyAgICAgICAgaWYgKGZsYWdzICYgQ0JMS19JTlZBTElEKSB7CisgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgIH0KKyAgICB9CisKICAgICBpZiAoc3NpemVfdCh1c2VyU2l6ZSkgPCAwIHx8IChidWZmZXIgPT0gTlVMTCAmJiB1c2VyU2l6ZSAhPSAwKSkgewogICAgICAgICAvLyBTYW5pdHktY2hlY2s6IHVzZXIgaXMgbW9zdC1saWtlbHkgcGFzc2luZyBhbiBlcnJvciBjb2RlLCBhbmQgaXQgd291bGQKICAgICAgICAgLy8gbWFrZSB0aGUgcmV0dXJuIHZhbHVlIGFtYmlndW91cyAoYWN0dWFsU2l6ZSB2cyBlcnJvcikuCi0gICAgICAgIEFMT0dFKCJBdWRpb1RyYWNrOjp3cml0ZShidWZmZXI9JXAsIHNpemU9JXUgKCVkKSIsIGJ1ZmZlciwgdXNlclNpemUsIHVzZXJTaXplKTsKKyAgICAgICAgQUxPR0UoIkF1ZGlvVHJhY2s6OndyaXRlKGJ1ZmZlcj0lcCwgc2l6ZT0lenUgKCV6ZCkiLCBidWZmZXIsIHVzZXJTaXplLCB1c2VyU2l6ZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCkBAIC0xMjY3LDcgKzE0MDEsOCBAQAogICAgIHdoaWxlICh1c2VyU2l6ZSA+PSBtRnJhbWVTaXplKSB7CiAgICAgICAgIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQgPSB1c2VyU2l6ZSAvIG1GcmFtZVNpemU7CiAKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gb2J0YWluQnVmZmVyKCZhdWRpb0J1ZmZlciwgJkNsaWVudFByb3h5OjprRm9yZXZlcik7CisgICAgICAgIHN0YXR1c190IGVyciA9IG9idGFpbkJ1ZmZlcigmYXVkaW9CdWZmZXIsCisgICAgICAgICAgICAgICAgYmxvY2tpbmcgPyAmQ2xpZW50UHJveHk6OmtGb3JldmVyIDogJkNsaWVudFByb3h5OjprTm9uQmxvY2tpbmcpOwogICAgICAgICBpZiAoZXJyIDwgMCkgewogICAgICAgICAgICAgaWYgKHdyaXR0ZW4gPiAwKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xMzYzLDcgKzE0OTgsNyBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLW5zZWNzX3QgQXVkaW9UcmFjazo6cHJvY2Vzc0F1ZGlvQnVmZmVyKGNvbnN0IHNwPEF1ZGlvVHJhY2tUaHJlYWQ+JiB0aHJlYWQpCituc2Vjc190IEF1ZGlvVHJhY2s6OnByb2Nlc3NBdWRpb0J1ZmZlcigpCiB7CiAgICAgLy8gQ3VycmVudGx5IHRoZSBBdWRpb1RyYWNrIHRocmVhZCBpcyBub3QgY3JlYXRlZCBpZiB0aGVyZSBhcmUgbm8gY2FsbGJhY2tzLgogICAgIC8vIFdvdWxkIGl0IGV2ZXIgbWFrZSBzZW5zZSB0byBydW4gdGhlIHRocmVhZCwgZXZlbiB3aXRob3V0IGNhbGxiYWNrcz8KQEAgLTE0MDEsNyArMTUzNiw3IEBACiAgICAgICAgIC8vIGZvciBvZmZsb2FkZWQgdHJhY2tzIHJlc3RvcmVUcmFja19sKCkgd2lsbCBqdXN0IHVwZGF0ZSB0aGUgc2VxdWVuY2UgYW5kIGNsZWFyCiAgICAgICAgIC8vIEF1ZGlvU3lzdGVtIGNhY2hlLiBXZSBzaG91bGQgbm90IGV4aXQgaGVyZSBidXQgYWZ0ZXIgY2FsbGluZyB0aGUgY2FsbGJhY2sgc28KICAgICAgICAgLy8gdGhhdCB0aGUgdXBwZXIgbGF5ZXJzIGNhbiByZWNyZWF0ZSB0aGUgdHJhY2sKLSAgICAgICAgaWYgKCFpc09mZmxvYWRlZCgpIHx8IChtU2VxdWVuY2UgPT0gbU9ic2VydmVkU2VxdWVuY2UpKSB7CisgICAgICAgIGlmICghaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkgfHwgKG1TZXF1ZW5jZSA9PSBtT2JzZXJ2ZWRTZXF1ZW5jZSkpIHsKICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlc3RvcmVUcmFja19sKCJwcm9jZXNzQXVkaW9CdWZmZXIiKTsKICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICAgICAgLy8gUnVuIGFnYWluIGltbWVkaWF0ZWx5LCBidXQgd2l0aCBhIG5ldyBJQXVkaW9UcmFjawpAQCAtMTQzMyw3ICsxNTY4LDcgQEAKICAgICB9CiAKICAgICAvLyBHZXQgY3VycmVudCBwb3NpdGlvbiBvZiBzZXJ2ZXIKLSAgICBzaXplX3QgcG9zaXRpb24gPSBtUHJveHktPmdldFBvc2l0aW9uKCk7CisgICAgc2l6ZV90IHBvc2l0aW9uID0gdXBkYXRlQW5kR2V0UG9zaXRpb25fbCgpOwogCiAgICAgLy8gTWFuYWdlIG1hcmtlciBjYWxsYmFjawogICAgIGJvb2wgbWFya2VyUmVhY2hlZCA9IGZhbHNlOwpAQCAtMTQ1Niw3ICsxNTkxLDcgQEAKICAgICAvLyBDYWNoZSBvdGhlciBmaWVsZHMgdGhhdCB3aWxsIGJlIG5lZWRlZCBzb29uCiAgICAgdWludDMyX3QgbG9vcFBlcmlvZCA9IG1Mb29wUGVyaW9kOwogICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZTsKLSAgICBzaXplX3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gbU5vdGlmaWNhdGlvbkZyYW1lc0FjdDsKKyAgICB1aW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMgPSBtTm90aWZpY2F0aW9uRnJhbWVzQWN0OwogICAgIGlmIChtUmVmcmVzaFJlbWFpbmluZykgewogICAgICAgICBtUmVmcmVzaFJlbWFpbmluZyA9IGZhbHNlOwogICAgICAgICBtUmVtYWluaW5nRnJhbWVzID0gbm90aWZpY2F0aW9uRnJhbWVzOwpAQCAtMTQ5MSw2ICsxNjI2LDcgQEAKICAgICAgICAgICAgICAgICB3YWl0U3RyZWFtRW5kID0gbVN0YXRlID09IFNUQVRFX1NUT1BQSU5HOwogICAgICAgICAgICAgICAgIGlmICh3YWl0U3RyZWFtRW5kKSB7CiAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRUQ7CisgICAgICAgICAgICAgICAgICAgIG1SZWxlYXNlZCA9IDA7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHdhaXRTdHJlYW1FbmQgJiYgc3RhdHVzICE9IERFQURfT0JKRUNUKSB7CkBAIC0xNTI3LDcgKzE2NjMsNyBAQAogICAgICAgICBtT2JzZXJ2ZWRTZXF1ZW5jZSA9IHNlcXVlbmNlOwogICAgICAgICBtQ2JmKEVWRU5UX05FV19JQVVESU9UUkFDSywgbVVzZXJEYXRhLCBOVUxMKTsKICAgICAgICAgLy8gZm9yIG9mZmxvYWRlZCB0cmFja3MsIGp1c3Qgd2FpdCBmb3IgdGhlIHVwcGVyIGxheWVycyB0byByZWNyZWF0ZSB0aGUgdHJhY2sKLSAgICAgICAgaWYgKGlzT2ZmbG9hZGVkKCkpIHsKKyAgICAgICAgaWYgKGlzT2ZmbG9hZGVkT3JEaXJlY3QoKSkgewogICAgICAgICAgICAgcmV0dXJuIE5TX0lOQUNUSVZFOwogICAgICAgICB9CiAgICAgfQpAQCAtMTU4NSwxMCArMTcyMSwxMCBAQAogICAgICAgICBzaXplX3Qgbm9uQ29udGlnOwogICAgICAgICBzdGF0dXNfdCBlcnIgPSBvYnRhaW5CdWZmZXIoJmF1ZGlvQnVmZmVyLCByZXF1ZXN0ZWQsIE5VTEwsICZub25Db250aWcpOwogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKChlcnIgIT0gTk9fRVJST1IpICE9IChhdWRpb0J1ZmZlci5mcmFtZUNvdW50ID09IDApLAotICAgICAgICAgICAgICAgICJvYnRhaW5CdWZmZXIoKSBlcnI9JWQgZnJhbWVDb3VudD0ldSIsIGVyciwgYXVkaW9CdWZmZXIuZnJhbWVDb3VudCk7CisgICAgICAgICAgICAgICAgIm9idGFpbkJ1ZmZlcigpIGVycj0lZCBmcmFtZUNvdW50PSV6dSIsIGVyciwgYXVkaW9CdWZmZXIuZnJhbWVDb3VudCk7CiAgICAgICAgIHJlcXVlc3RlZCA9ICZDbGllbnRQcm94eTo6a05vbkJsb2NraW5nOwogICAgICAgICBzaXplX3QgYXZhaWwgPSBhdWRpb0J1ZmZlci5mcmFtZUNvdW50ICsgbm9uQ29udGlnOwotICAgICAgICBBTE9HVigib2J0YWluQnVmZmVyKCV1KSByZXR1cm5lZCAldSA9ICV1ICsgJXUgZXJyICVkIiwKKyAgICAgICAgQUxPR1YoIm9idGFpbkJ1ZmZlcigldSkgcmV0dXJuZWQgJXp1ID0gJXp1ICsgJXp1IGVyciAlZCIsCiAgICAgICAgICAgICAgICAgbVJlbWFpbmluZ0ZyYW1lcywgYXZhaWwsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQsIG5vbkNvbnRpZywgZXJyKTsKICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgaWYgKGVyciA9PSBUSU1FRF9PVVQgfHwgZXJyID09IFdPVUxEX0JMT0NLIHx8IGVyciA9PSAtRUlOVFIgfHwKQEAgLTE2MjAsMTIgKzE3NTYsMTEgQEAKICAgICAgICAgc2l6ZV90IHJlcVNpemUgPSBhdWRpb0J1ZmZlci5zaXplOwogICAgICAgICBtQ2JmKEVWRU5UX01PUkVfREFUQSwgbVVzZXJEYXRhLCAmYXVkaW9CdWZmZXIpOwogICAgICAgICBzaXplX3Qgd3JpdHRlblNpemUgPSBhdWRpb0J1ZmZlci5zaXplOwotICAgICAgICBzaXplX3Qgd3JpdHRlbkZyYW1lcyA9IHdyaXR0ZW5TaXplIC8gbUZyYW1lU2l6ZTsKIAogICAgICAgICAvLyBTYW5pdHkgY2hlY2sgb24gcmV0dXJuZWQgc2l6ZQogICAgICAgICBpZiAoc3NpemVfdCh3cml0dGVuU2l6ZSkgPCAwIHx8IHdyaXR0ZW5TaXplID4gcmVxU2l6ZSkgewotICAgICAgICAgICAgQUxPR0UoIkVWRU5UX01PUkVfREFUQSByZXF1ZXN0ZWQgJXUgYnl0ZXMgYnV0IGNhbGxiYWNrIHJldHVybmVkICVkIGJ5dGVzIiwKLSAgICAgICAgICAgICAgICAgICAgcmVxU2l6ZSwgKGludCkgd3JpdHRlblNpemUpOworICAgICAgICAgICAgQUxPR0UoIkVWRU5UX01PUkVfREFUQSByZXF1ZXN0ZWQgJXp1IGJ5dGVzIGJ1dCBjYWxsYmFjayByZXR1cm5lZCAlemQgYnl0ZXMiLAorICAgICAgICAgICAgICAgICAgICByZXFTaXplLCBzc2l6ZV90KHdyaXR0ZW5TaXplKSk7CiAgICAgICAgICAgICByZXR1cm4gTlNfTkVWRVI7CiAgICAgICAgIH0KIApAQCAtMTY4NiwzNyArMTgyMSwzMSBAQAogc3RhdHVzX3QgQXVkaW9UcmFjazo6cmVzdG9yZVRyYWNrX2woY29uc3QgY2hhciAqZnJvbSkKIHsKICAgICBBTE9HVygiZGVhZCBJQXVkaW9UcmFjaywgJXMsIGNyZWF0aW5nIGEgbmV3IG9uZSBmcm9tICVzKCkiLAotICAgICAgICAgIGlzT2ZmbG9hZGVkKCkgPyAiT2ZmbG9hZGVkIiA6ICJQQ00iLCBmcm9tKTsKKyAgICAgICAgICBpc09mZmxvYWRlZE9yRGlyZWN0X2woKSA/ICJPZmZsb2FkZWQgb3IgRGlyZWN0IiA6ICJQQ00iLCBmcm9tKTsKICAgICArK21TZXF1ZW5jZTsKICAgICBzdGF0dXNfdCByZXN1bHQ7CiAKICAgICAvLyByZWZyZXNoIHRoZSBhdWRpbyBjb25maWd1cmF0aW9uIGNhY2hlIGluIHRoaXMgcHJvY2VzcyB0byBtYWtlIHN1cmUgd2UgZ2V0IG5ldwotICAgIC8vIG91dHB1dCBwYXJhbWV0ZXJzIGluIGdldE91dHB1dF9sKCkgYW5kIGNyZWF0ZVRyYWNrX2woKQorICAgIC8vIG91dHB1dCBwYXJhbWV0ZXJzIGluIGNyZWF0ZVRyYWNrX2woKQogICAgIEF1ZGlvU3lzdGVtOjpjbGVhckF1ZGlvQ29uZmlnQ2FjaGUoKTsKIAotICAgIGlmIChpc09mZmxvYWRlZCgpKSB7CisgICAgaWYgKGlzT2ZmbG9hZGVkT3JEaXJlY3RfbCgpKSB7CisgICAgICAgIC8vIEZJWE1FIHJlLWNyZWF0aW9uIG9mIG9mZmxvYWRlZCB0cmFja3MgaXMgbm90IHlldCBpbXBsZW1lbnRlZAogICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CiAgICAgfQogCi0gICAgLy8gZm9yY2UgbmV3IG91dHB1dCBxdWVyeSBmcm9tIGF1ZGlvIHBvbGljeSBtYW5hZ2VyOwotICAgIG1PdXRwdXQgPSAwOwotICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IGdldE91dHB1dF9sKCk7CisgICAgLy8gc2F2ZSB0aGUgb2xkIHN0YXRpYyBidWZmZXIgcG9zaXRpb24KKyAgICBzaXplX3QgYnVmZmVyUG9zaXRpb24gPSBtU3RhdGljUHJveHkgIT0gTlVMTCA/IG1TdGF0aWNQcm94eS0+Z2V0QnVmZmVyUG9zaXRpb24oKSA6IDA7CiAKLSAgICAvLyBpZiB0aGUgbmV3IElBdWRpb1RyYWNrIGlzIGNyZWF0ZWQsIGNyZWF0ZVRyYWNrX2woKSB3aWxsIG1vZGlmeSB0aGUKKyAgICAvLyBJZiBhIG5ldyBJQXVkaW9UcmFjayBpcyBzdWNjZXNzZnVsbHkgY3JlYXRlZCwgY3JlYXRlVHJhY2tfbCgpIHdpbGwgbW9kaWZ5IHRoZQogICAgIC8vIGZvbGxvd2luZyBtZW1iZXIgdmFyaWFibGVzOiBtQXVkaW9UcmFjaywgbUNibGtNZW1vcnkgYW5kIG1DYmxrLgotICAgIC8vIEl0IHdpbGwgYWxzbyBkZWxldGUgdGhlIHN0cm9uZyByZWZlcmVuY2VzIG9uIHByZXZpb3VzIElBdWRpb1RyYWNrIGFuZCBJTWVtb3J5CisgICAgLy8gSXQgd2lsbCBhbHNvIGRlbGV0ZSB0aGUgc3Ryb25nIHJlZmVyZW5jZXMgb24gcHJldmlvdXMgSUF1ZGlvVHJhY2sgYW5kIElNZW1vcnkuCisgICAgLy8gSWYgYSBuZXcgSUF1ZGlvVHJhY2sgY2Fubm90IGJlIGNyZWF0ZWQsIHRoZSBwcmV2aW91cyAoZGVhZCkgaW5zdGFuY2Ugd2lsbCBiZSBsZWZ0IGludGFjdC4KKyAgICByZXN1bHQgPSBjcmVhdGVUcmFja19sKCk7CiAKICAgICAvLyB0YWtlIHRoZSBmcmFtZXMgdGhhdCB3aWxsIGJlIGxvc3QgYnkgdHJhY2sgcmVjcmVhdGlvbiBpbnRvIGFjY291bnQgaW4gc2F2ZWQgcG9zaXRpb24KLSAgICBzaXplX3QgcG9zaXRpb24gPSBtUHJveHktPmdldFBvc2l0aW9uKCkgKyBtUHJveHktPmdldEZyYW1lc0ZpbGxlZCgpOwotICAgIHNpemVfdCBidWZmZXJQb3NpdGlvbiA9IG1TdGF0aWNQcm94eSAhPSBOVUxMID8gbVN0YXRpY1Byb3h5LT5nZXRCdWZmZXJQb3NpdGlvbigpIDogMDsKLSAgICByZXN1bHQgPSBjcmVhdGVUcmFja19sKG1TdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlcUZyYW1lQ291bnQsICAvLyBzbyB0aGF0IGZyYW1lIGNvdW50IG5ldmVyIGdvZXMgZG93bgotICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNoYXJlZEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uIC8qZXBvY2gqLyk7CisgICAgKHZvaWQpIHVwZGF0ZUFuZEdldFBvc2l0aW9uX2woKTsKKyAgICBtUG9zaXRpb24gPSBtUmVsZWFzZWQ7CiAKICAgICBpZiAocmVzdWx0ID09IE5PX0VSUk9SKSB7CiAgICAgICAgIC8vIGNvbnRpbnVlIHBsYXliYWNrIGZyb20gbGFzdCBrbm93biBwb3NpdGlvbiwgYnV0CkBAIC0xNzQ0LDE3ICsxODczLDM1IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewotICAgICAgICAvL1VzZSBvZiBkaXJlY3QgYW5kIG9mZmxvYWRlZCBvdXRwdXQgc3RyZWFtcyBpcyByZWYgY291bnRlZCBieSBhdWRpbyBwb2xpY3kgbWFuYWdlci4KLSAgICAgICAgLy8gQXMgZ2V0T3V0cHV0IHdhcyBjYWxsZWQgYWJvdmUgYW5kIHJlc3VsdGVkIGluIGFuIG91dHB1dCBzdHJlYW0gdG8gYmUgb3BlbmVkLAotICAgICAgICAvLyB3ZSBuZWVkIHRvIHJlbGVhc2UgaXQuCi0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG91dHB1dCk7CiAgICAgICAgIEFMT0dXKCJyZXN0b3JlVHJhY2tfbCgpIGZhaWxlZCBzdGF0dXMgJWQiLCByZXN1bHQpOwogICAgICAgICBtU3RhdGUgPSBTVEFURV9TVE9QUEVEOworICAgICAgICBtUmVsZWFzZWQgPSAwOwogICAgIH0KIAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKK3VpbnQzMl90IEF1ZGlvVHJhY2s6OnVwZGF0ZUFuZEdldFBvc2l0aW9uX2woKQoreworICAgIC8vIFRoaXMgaXMgdGhlIHNvbGUgcGxhY2UgdG8gcmVhZCBzZXJ2ZXIgY29uc3VtZWQgZnJhbWVzCisgICAgdWludDMyX3QgbmV3U2VydmVyID0gbVByb3h5LT5nZXRQb3NpdGlvbigpOworICAgIGludDMyX3QgZGVsdGEgPSBuZXdTZXJ2ZXIgLSBtU2VydmVyOworICAgIG1TZXJ2ZXIgPSBuZXdTZXJ2ZXI7CisgICAgLy8gVE9ETyBUaGVyZSBpcyBjb250cm92ZXJzeSBhYm91dCB3aGV0aGVyIHRoZXJlIGNhbiBiZSAibmVnYXRpdmUgaml0dGVyIiBpbiBzZXJ2ZXIgcG9zaXRpb24uCisgICAgLy8gICAgICBUaGlzIHNob3VsZCBiZSBpbnZlc3RpZ2F0ZWQgZnVydGhlciwgYW5kIGlmIHBvc3NpYmxlLCBpdCBzaG91bGQgYmUgYWRkcmVzc2VkLgorICAgIC8vICAgICAgQSBtb3JlIGRlZmluaXRlIGZhaWx1cmUgbW9kZSBpcyBpbmZyZXF1ZW50IHBvbGxpbmcgYnkgY2xpZW50LgorICAgIC8vICAgICAgT25lIGNvdWxkIGNhbGwgKHZvaWQpZ2V0UG9zaXRpb25fbCgpIGluIHJlbGVhc2VCdWZmZXIoKSwKKyAgICAvLyAgICAgIHNvIG1SZWxlYXNlZCBhbmQgbVBvc2l0aW9uIGFyZSBhbHdheXMgbG9jay1zdGVwIGFzIGJlc3QgcG9zc2libGUuCisgICAgLy8gICAgICBUaGF0IHNob3VsZCBlbnN1cmUgZGVsdGEgbmV2ZXIgZ29lcyBuZWdhdGl2ZSBmb3IgaW5mcmVxdWVudCBwb2xsaW5nCisgICAgLy8gICAgICB1bmxlc3MgdGhlIHNlcnZlciBoYXMgbW9yZSB0aGFuIDJeMzEgZnJhbWVzIGluIGl0cyBidWZmZXIsCisgICAgLy8gICAgICBpbiB3aGljaCBjYXNlIHRoZSB1c2Ugb2YgdWludDMyX3QgZm9yIHRoZXNlIGNvdW50ZXJzIGhhcyBiaWdnZXIgaXNzdWVzLgorICAgIGlmIChkZWx0YSA8IDApIHsKKyAgICAgICAgQUxPR0UoImRldGVjdGVkIGlsbGVnYWwgcmV0cm9ncmFkZSBtb3Rpb24gYnkgdGhlIHNlcnZlcjogbVNlcnZlciBhZHZhbmNlZCBieSAlZCIsIGRlbHRhKTsKKyAgICAgICAgZGVsdGEgPSAwOworICAgIH0KKyAgICByZXR1cm4gbVBvc2l0aW9uICs9ICh1aW50MzJfdCkgZGVsdGE7Cit9CisKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycykKIHsKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CkBAIC0xNzY4LDI2ICsxOTE1LDEyOCBAQAogICAgIGlmIChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0gICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9BQ1RJVkUgJiYgbVN0YXRlICE9IFNUQVRFX1BBVVNFRCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisKKyAgICBzd2l0Y2ggKG1TdGF0ZSkgeworICAgIGNhc2UgU1RBVEVfQUNUSVZFOgorICAgIGNhc2UgU1RBVEVfUEFVU0VEOgorICAgICAgICBicmVhazsgLy8gaGFuZGxlIGJlbG93CisgICAgY2FzZSBTVEFURV9GTFVTSEVEOgorICAgIGNhc2UgU1RBVEVfU1RPUFBFRDoKKyAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOworICAgIGNhc2UgU1RBVEVfU1RPUFBJTkc6CisgICAgY2FzZSBTVEFURV9QQVVTRURfU1RPUFBJTkc6CisgICAgICAgIGlmICghaXNPZmZsb2FkZWRfbCgpKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7IC8vIG9mZmxvYWRlZCB0cmFja3MgaGFuZGxlZCBiZWxvdworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIkludmFsaWQgbVN0YXRlIGluIGdldFRpbWVzdGFtcCgpOiAlZCIsIG1TdGF0ZSk7CisgICAgICAgIGJyZWFrOwogICAgIH0KKworICAgIC8vIFRoZSBwcmVzZW50ZWQgZnJhbWUgY291bnQgbXVzdCBhbHdheXMgbGFnIGJlaGluZCB0aGUgY29uc3VtZWQgZnJhbWUgY291bnQuCisgICAgLy8gVG8gYXZvaWQgYSByYWNlLCByZWFkIHRoZSBwcmVzZW50ZWQgZnJhbWVzIGZpcnN0LiAgVGhpcyBlbnN1cmVzIHRoYXQgcHJlc2VudGVkIDw9IGNvbnN1bWVkLgogICAgIHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb1RyYWNrLT5nZXRUaW1lc3RhbXAodGltZXN0YW1wKTsKLSAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb24gKz0gbVByb3h5LT5nZXRFcG9jaCgpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR1ZfSUYoc3RhdHVzICE9IFdPVUxEX0JMT0NLLCAiZ2V0VGltZXN0YW1wIGVycm9yOiUjeCIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIGlmIChpc09mZmxvYWRlZE9yRGlyZWN0X2woKSkgeworICAgICAgICBpZiAoaXNPZmZsb2FkZWRfbCgpICYmIChtU3RhdGUgPT0gU1RBVEVfUEFVU0VEIHx8IG1TdGF0ZSA9PSBTVEFURV9QQVVTRURfU1RPUFBJTkcpKSB7CisgICAgICAgICAgICAvLyB1c2UgY2FjaGVkIHBhdXNlZCBwb3NpdGlvbiBpbiBjYXNlIGFub3RoZXIgb2ZmbG9hZGVkIHRyYWNrIGlzIHJ1bm5pbmcuCisgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uID0gbVBhdXNlZFBvc2l0aW9uOworICAgICAgICAgICAgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0aW1lc3RhbXAubVRpbWUpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgd2hldGhlciBhIHBlbmRpbmcgZmx1c2ggb3Igc3RvcCBoYXMgY29tcGxldGVkLCBhcyB0aG9zZSBjb21tYW5kcyBtYXkKKyAgICAgICAgLy8gYmUgYXN5bmNocm9ub3VzIG9yIHJldHVybiBuZWFyIGZpbmlzaC4KKyAgICAgICAgaWYgKG1TdGFydFVzICE9IDAgJiYgbVNhbXBsZVJhdGUgIT0gMCkgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludCBrVGltZUppdHRlclVzID0gMTAwMDAwOyAvLyAxMDAgbXMKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgazFTZWNVcyA9IDEwMDAwMDA7CisKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgdGltZU5vdyA9IGdldE5vd1VzKCk7CisKKyAgICAgICAgICAgIGlmICh0aW1lTm93IDwgbVN0YXJ0VXMgKyBrMVNlY1VzKSB7IC8vIHdpdGhpbiBmaXJzdCBzZWNvbmQgb2Ygc3RhcnRpbmcKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IHRpbWVzdGFtcFRpbWVVcyA9IGNvbnZlcnRUaW1lc3BlY1RvVXModGltZXN0YW1wLm1UaW1lKTsKKyAgICAgICAgICAgICAgICBpZiAodGltZXN0YW1wVGltZVVzIDwgbVN0YXJ0VXMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOyAgLy8gc3RhbGUgdGltZXN0YW1wIHRpbWUsIG9jY3VycyBiZWZvcmUgc3RhcnQuCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgZGVsdGFUaW1lVXMgPSB0aW1lc3RhbXBUaW1lVXMgLSBtU3RhcnRVczsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGRlbHRhUG9zaXRpb25CeVVzID0gdGltZXN0YW1wLm1Qb3NpdGlvbiAqIDEwMDAwMDBMTCAvIG1TYW1wbGVSYXRlOworCisgICAgICAgICAgICAgICAgaWYgKGRlbHRhUG9zaXRpb25CeVVzID4gZGVsdGFUaW1lVXMgKyBrVGltZUppdHRlclVzKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBjb3VudGVyIGNhbid0IGNvdW50IGZhc3RlciB0aGFuIHRoZSBzYW1wbGUgcmF0ZQorICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGUgc3RhcnQgdGltZS4gIElmIGdyZWF0ZXIsIHRoZW4gdGhhdCBtZWFucyB3ZSBoYXZlIGZhaWxlZAorICAgICAgICAgICAgICAgICAgICAvLyB0byBjb21wbGV0ZWx5IGZsdXNoIG9yIHN0b3AgdGhlIHByZXZpb3VzIHBsYXlpbmcgdHJhY2suCisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJpbmNvbXBsZXRlIGZsdXNoIG9yIHN0b3A6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZGVsdGFUaW1lVXMoJWxsZCkgZGVsdGFQb3NpdGlvblVzKCVsbGQpIHRzbVBvc2l0aW9uKCV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylkZWx0YVRpbWVVcywgKGxvbmcgbG9uZylkZWx0YVBvc2l0aW9uQnlVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TdGFydFVzID0gMDsgLy8gbm8gbmVlZCB0byBjaGVjayBhZ2Fpbiwgc3RhcnQgdGltZXN0YW1wIGhhcyBlaXRoZXIgZXhwaXJlZCBvciB1bm5lZWRlZC4KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFVwZGF0ZSB0aGUgbWFwcGluZyBiZXR3ZWVuIGxvY2FsIGNvbnN1bWVkIChtUG9zaXRpb24pIGFuZCBzZXJ2ZXIgY29uc3VtZWQgKG1TZXJ2ZXIpCisgICAgICAgICh2b2lkKSB1cGRhdGVBbmRHZXRQb3NpdGlvbl9sKCk7CisgICAgICAgIC8vIFNlcnZlciBjb25zdW1lZCAobVNlcnZlcikgYW5kIHByZXNlbnRlZCBib3RoIHVzZSB0aGUgc2FtZSBzZXJ2ZXIgdGltZSBiYXNlLAorICAgICAgICAvLyBhbmQgc2VydmVyIGNvbnN1bWVkIGlzIGFsd2F5cyA+PSBwcmVzZW50ZWQuCisgICAgICAgIC8vIFRoZSBkZWx0YSBiZXR3ZWVuIHRoZXNlIHJlcHJlc2VudHMgdGhlIG51bWJlciBvZiBmcmFtZXMgaW4gdGhlIGJ1ZmZlciBwaXBlbGluZS4KKyAgICAgICAgLy8gSWYgdGhpcyBkZWx0YSBiZXR3ZWVuIHRoZXNlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgY2xpZW50IHBvc2l0aW9uLCBpdCBtZWFucyB0aGF0CisgICAgICAgIC8vIGFjdHVhbGx5IHByZXNlbnRlZCBpcyBzdGlsbCBzdHVjayBhdCB0aGUgc3RhcnRpbmcgbGluZSAoZmlndXJhdGl2ZWx5IHNwZWFraW5nKSwKKyAgICAgICAgLy8gd2FpdGluZyBmb3IgdGhlIGZpcnN0IGZyYW1lIHRvIGdvIGJ5LiAgU28gd2UgY2FuJ3QgcmVwb3J0IGEgdmFsaWQgdGltZXN0YW1wIHlldC4KKyAgICAgICAgaWYgKCh1aW50MzJfdCkgKG1TZXJ2ZXIgLSB0aW1lc3RhbXAubVBvc2l0aW9uKSA+IG1Qb3NpdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIC8vIENvbnZlcnQgdGltZXN0YW1wIHBvc2l0aW9uIGZyb20gc2VydmVyIHRpbWUgYmFzZSB0byBjbGllbnQgdGltZSBiYXNlLgorICAgICAgICAvLyBUT0RPIFRoZSBmb2xsb3dpbmcgY29kZSBzaG91bGQgd29yayBPSyBub3cgYmVjYXVzZSB0aW1lc3RhbXAubVBvc2l0aW9uIGlzIDMyLWJpdC4KKyAgICAgICAgLy8gQnV0IGlmIHdlIGNoYW5nZSBpdCB0byA2NC1iaXQgdGhlbiB0aGlzIGNvdWxkIGZhaWwuCisgICAgICAgIC8vIElmIChtUG9zaXRpb24gLSBtU2VydmVyKSBjYW4gYmUgbmVnYXRpdmUgdGhlbiBzaG91bGQgdXNlOgorICAgICAgICAvLyAgIChpbnQzMl90KShtUG9zaXRpb24gLSBtU2VydmVyKQorICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uICs9IG1Qb3NpdGlvbiAtIG1TZXJ2ZXI7CisgICAgICAgIC8vIEltbWVkaWF0ZWx5IGFmdGVyIGEgY2FsbCB0byBnZXRQb3NpdGlvbl9sKCksIG1Qb3NpdGlvbiBhbmQKKyAgICAgICAgLy8gbVNlcnZlciBib3RoIHJlcHJlc2VudCB0aGUgc2FtZSBmcmFtZSBwb3NpdGlvbi4gIG1Qb3NpdGlvbiBpcworICAgICAgICAvLyBpbiBjbGllbnQncyBwb2ludCBvZiB2aWV3LCBhbmQgbVNlcnZlciBpcyBpbiBzZXJ2ZXIncyBwb2ludCBvZgorICAgICAgICAvLyB2aWV3LiAgU28gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGVtIGlzIHRoZSAiZnVkZ2UgZmFjdG9yIgorICAgICAgICAvLyBiZXR3ZWVuIGNsaWVudCBhbmQgc2VydmVyIHZpZXdzIGR1ZSB0byBzdG9wKCkgYW5kL29yIG5ldworICAgICAgICAvLyBJQXVkaW9UcmFjay4gIEFuZCB0aW1lc3RhbXAubVBvc2l0aW9uIGlzIGluaXRpYWxseSBpbiBzZXJ2ZXIncworICAgICAgICAvLyBwb2ludCBvZiB2aWV3LCBzbyB3ZSBuZWVkIHRvIGFwcGx5IHRoZSBzYW1lIGZ1ZGdlIGZhY3RvciB0byBpdC4KICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogU3RyaW5nOCBBdWRpb1RyYWNrOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpCiB7Ci0gICAgaWYgKG1PdXRwdXQpIHsKLSAgICAgICAgcmV0dXJuIEF1ZGlvU3lzdGVtOjpnZXRQYXJhbWV0ZXJzKG1PdXRwdXQsIGtleXMpOworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IGdldE91dHB1dCgpOworICAgIGlmIChvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgcmV0dXJuIEF1ZGlvU3lzdGVtOjpnZXRQYXJhbWV0ZXJzKG91dHB1dCwga2V5cyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIFN0cmluZzg6OmVtcHR5KCk7CiAgICAgfQogfQogCi1zdGF0dXNfdCBBdWRpb1RyYWNrOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3QKK2Jvb2wgQXVkaW9UcmFjazo6aXNPZmZsb2FkZWQoKSBjb25zdAoreworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gaXNPZmZsb2FkZWRfbCgpOworfQorCitib29sIEF1ZGlvVHJhY2s6OmlzRGlyZWN0KCkgY29uc3QKK3sKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgcmV0dXJuIGlzRGlyZWN0X2woKTsKK30KKworYm9vbCBBdWRpb1RyYWNrOjppc09mZmxvYWRlZE9yRGlyZWN0KCkgY29uc3QKK3sKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgcmV0dXJuIGlzT2ZmbG9hZGVkT3JEaXJlY3RfbCgpOworfQorCisKK3N0YXR1c190IEF1ZGlvVHJhY2s6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKSBjb25zdAogewogCiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CkBAIC0xNzk2LDkgKzIwNDUsOSBAQAogCiAgICAgcmVzdWx0LmFwcGVuZCgiIEF1ZGlvVHJhY2s6OmR1bXBcbiIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgMjU1LCAiICBzdHJlYW0gdHlwZSglZCksIGxlZnQgLSByaWdodCB2b2x1bWUoJWYsICVmKVxuIiwgbVN0cmVhbVR5cGUsCi0gICAgICAgICAgICBtVm9sdW1lWzBdLCBtVm9sdW1lWzFdKTsKKyAgICAgICAgICAgIG1Wb2x1bWVbQVVESU9fSU5URVJMRUFWRV9MRUZUXSwgbVZvbHVtZVtBVURJT19JTlRFUkxFQVZFX1JJR0hUXSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgMjU1LCAiICBmb3JtYXQoJWQpLCBjaGFubmVsIGNvdW50KCVkKSwgZnJhbWUgY291bnQoJWQpXG4iLCBtRm9ybWF0LAorICAgIHNucHJpbnRmKGJ1ZmZlciwgMjU1LCAiICBmb3JtYXQoJWQpLCBjaGFubmVsIGNvdW50KCVkKSwgZnJhbWUgY291bnQoJXp1KVxuIiwgbUZvcm1hdCwKICAgICAgICAgICAgIG1DaGFubmVsQ291bnQsIG1GcmFtZUNvdW50KTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgIHNhbXBsZSByYXRlKCV1KSwgc3RhdHVzKCVkKVxuIiwgbVNhbXBsZVJhdGUsIG1TdGF0dXMpOwpAQCAtMTgxNSw5ICsyMDY0LDE0NiBAQAogICAgIHJldHVybiBtUHJveHktPmdldFVuZGVycnVuRnJhbWVzKCk7CiB9CiAKK3ZvaWQgQXVkaW9UcmFjazo6c2V0QXR0cmlidXRlc0Zyb21TdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkgeworICAgIG1BdHRyaWJ1dGVzLmZsYWdzID0gMHgwOworCisgICAgc3dpdGNoKHN0cmVhbVR5cGUpIHsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9ERUZBVUxUOgorICAgIGNhc2UgQVVESU9fU1RSRUFNX01VU0lDOgorICAgICAgICBtQXR0cmlidXRlcy5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfTVVTSUM7CisgICAgICAgIG1BdHRyaWJ1dGVzLnVzYWdlID0gQVVESU9fVVNBR0VfTUVESUE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEw6CisgICAgICAgIG1BdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0g7CisgICAgICAgIG1BdHRyaWJ1dGVzLnVzYWdlID0gQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRToKKyAgICAgICAgbUF0dHJpYnV0ZXMuZmxhZ3MgIHw9IEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRDsKKyAgICAgICAgLy8gaW50ZW5kZWQgZmFsbCB0aHJvdWdoLCBhdHRyaWJ1dGVzIGluIGNvbW1vbiB3aXRoIFNUUkVBTV9TWVNURU0KKyAgICBjYXNlIEFVRElPX1NUUkVBTV9TWVNURU06CisgICAgICAgIG1BdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9TT05JRklDQVRJT047CisgICAgICAgIG1BdHRyaWJ1dGVzLnVzYWdlID0gQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT047CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fU1RSRUFNX1JJTkc6CisgICAgICAgIG1BdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9TT05JRklDQVRJT047CisgICAgICAgIG1BdHRyaWJ1dGVzLnVzYWdlID0gQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19TVFJFQU1fQUxBUk06CisgICAgICAgIG1BdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9TT05JRklDQVRJT047CisgICAgICAgIG1BdHRyaWJ1dGVzLnVzYWdlID0gQVVESU9fVVNBR0VfQUxBUk07CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fU1RSRUFNX05PVElGSUNBVElPTjoKKyAgICAgICAgbUF0dHJpYnV0ZXMuY29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NPTklGSUNBVElPTjsKKyAgICAgICAgbUF0dHJpYnV0ZXMudXNhZ2UgPSBBVURJT19VU0FHRV9OT1RJRklDQVRJT047CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ086CisgICAgICAgIG1BdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0g7CisgICAgICAgIG1BdHRyaWJ1dGVzLnVzYWdlID0gQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTjsKKyAgICAgICAgbUF0dHJpYnV0ZXMuZmxhZ3MgfD0gQVVESU9fRkxBR19TQ087CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fU1RSRUFNX0RUTUY6CisgICAgICAgIG1BdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9TT05JRklDQVRJT047CisgICAgICAgIG1BdHRyaWJ1dGVzLnVzYWdlID0gQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9UVFM6CisgICAgICAgIG1BdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0g7CisgICAgICAgIG1BdHRyaWJ1dGVzLnVzYWdlID0gQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HRSgiaW52YWxpZCBzdHJlYW0gdHlwZSAlZCB3aGVuIGNvbnZlcnRpbmcgdG8gYXR0cmlidXRlcyIsIHN0cmVhbVR5cGUpOworICAgIH0KK30KKwordm9pZCBBdWRpb1RyYWNrOjpzZXRTdHJlYW1UeXBlRnJvbUF0dHJpYnV0ZXMoYXVkaW9fYXR0cmlidXRlc190JiBhYSkgeworICAgIC8vIGZsYWdzIHRvIHN0cmVhbSB0eXBlIG1hcHBpbmcKKyAgICBpZiAoKGFhLmZsYWdzICYgQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSA9PSBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQpIHsKKyAgICAgICAgbVN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoKGFhLmZsYWdzICYgQVVESU9fRkxBR19TQ08pID09IEFVRElPX0ZMQUdfU0NPKSB7CisgICAgICAgIG1TdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ087CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyB1c2FnZSB0byBzdHJlYW0gdHlwZSBtYXBwaW5nCisgICAgc3dpdGNoIChhYS51c2FnZSkgeworICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZOgorICAgICAgICAvLyBUT0RPIG9uY2UgQXVkaW9Qb2xpY3lNYW5hZ2VyIGZ1bGx5IHN1cHBvcnRzIGF1ZGlvX2F0dHJpYnV0ZXNfdCwKKyAgICAgICAgLy8gICByZW1vdmUgc3RyZWFtIGNoYW5nZSBiYXNlZCBvbiBwaG9uZSBzdGF0ZQorICAgICAgICBpZiAoQXVkaW9TeXN0ZW06OmdldFBob25lU3RhdGUoKSA9PSBBVURJT19NT0RFX1JJTkdUT05FKSB7CisgICAgICAgICAgICBtU3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9SSU5HOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLy8vIEZBTEwgVEhST1VHSAorICAgIGNhc2UgQVVESU9fVVNBR0VfTUVESUE6CisgICAgY2FzZSBBVURJT19VU0FHRV9HQU1FOgorICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFOgorICAgICAgICBtU3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9NVVNJQzsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT046CisgICAgICAgIG1TdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX1NZU1RFTTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTjoKKyAgICAgICAgbVN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTDsKKyAgICAgICAgcmV0dXJuOworCisgICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkc6CisgICAgICAgIG1TdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX0RUTUY7CisgICAgICAgIHJldHVybjsKKworICAgIGNhc2UgQVVESU9fVVNBR0VfQUxBUk06CisgICAgICAgIG1TdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX0FMQVJNOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FOgorICAgICAgICBtU3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9SSU5HOworICAgICAgICByZXR1cm47CisKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTjoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1Q6CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRDoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVDoKKyAgICAgICAgbVN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OOworICAgICAgICByZXR1cm47CisKKyAgICBjYXNlIEFVRElPX1VTQUdFX1VOS05PV046CisgICAgZGVmYXVsdDoKKyAgICAgICAgbVN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fTVVTSUM7CisgICAgfQorfQorCitib29sIEF1ZGlvVHJhY2s6OmlzVmFsaWRBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqcGFhKSB7CisgICAgLy8gaGFzIGZsYWdzIHRoYXQgbWFwIHRvIGEgc3RyYXRlZ3k/CisgICAgaWYgKChwYWEtPmZsYWdzICYgKEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCB8IEFVRElPX0ZMQUdfU0NPKSkgIT0gMCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBoYXMga25vd24gdXNhZ2U/CisgICAgc3dpdGNoIChwYWEtPnVzYWdlKSB7CisgICAgY2FzZSBBVURJT19VU0FHRV9VTktOT1dOOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTUVESUE6CisgICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OOgorICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HOgorICAgIGNhc2UgQVVESU9fVVNBR0VfQUxBUk06CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT046CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVDoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQ6CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVEOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UOgorICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZOgorICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFOgorICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT046CisgICAgY2FzZSBBVURJT19VU0FHRV9HQU1FOgorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi12b2lkIEF1ZGlvVHJhY2s6OkRlYXRoTm90aWZpZXI6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykKK3ZvaWQgQXVkaW9UcmFjazo6RGVhdGhOb3RpZmllcjo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKQogewogICAgIHNwPEF1ZGlvVHJhY2s+IGF1ZGlvVHJhY2sgPSBtQXVkaW9UcmFjay5wcm9tb3RlKCk7CiAgICAgaWYgKGF1ZGlvVHJhY2sgIT0gMCkgewpAQCAtMTg2MSw3ICsyMjQ3LDEwIEBACiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KLSAgICBuc2Vjc190IG5zID0gbVJlY2VpdmVyLnByb2Nlc3NBdWRpb0J1ZmZlcih0aGlzKTsKKyAgICBpZiAoZXhpdFBlbmRpbmcoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG5zZWNzX3QgbnMgPSBtUmVjZWl2ZXIucHJvY2Vzc0F1ZGlvQnVmZmVyKCk7CiAgICAgc3dpdGNoIChucykgewogICAgIGNhc2UgMDoKICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC0xODc1LDcgKzIyNjQsNyBAQAogICAgICAgICBucyA9IDEwMDAwMDAwMDBMTDsKICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCiAgICAgZGVmYXVsdDoKLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihucyA8IDAsICJwcm9jZXNzQXVkaW9CdWZmZXIoKSByZXR1cm5lZCAlbGxkIiwgbnMpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG5zIDwgMCwgInByb2Nlc3NBdWRpb0J1ZmZlcigpIHJldHVybmVkICUiIFBSSWQ2NCwgbnMpOwogICAgICAgICBwYXVzZUludGVybmFsKG5zKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQXVkaW9UcmFja1NoYXJlZC5jcHAgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmNwcAppbmRleCBjYWE3OTAwLi5lZWMwMjVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmNwcApAQCAtMTksMTUgKzE5LDE1IEBACiAKICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLWV4dGVybiAiQyIgewotI2luY2x1ZGUgIi4uL3ByaXZhdGUvYmlvbmljX2Z1dGV4LmgiCi19CisKKyNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogYXVkaW9fdHJhY2tfY2Jsa190OjphdWRpb190cmFja19jYmxrX3QoKQotICAgIDogbVNlcnZlcigwKSwgZnJhbWVDb3VudF8oMCksIG1GdXRleCgwKSwgbU1pbmltdW0oMCksCi0gICAgbVZvbHVtZUxSKDB4MTAwMDEwMDApLCBtU2FtcGxlUmF0ZSgwKSwgbVNlbmRMZXZlbCgwKSwgbUZsYWdzKDApCisgICAgOiBtU2VydmVyKDApLCBtRnV0ZXgoMCksIG1NaW5pbXVtKDApLAorICAgIG1Wb2x1bWVMUihHQUlOX01JTklGTE9BVF9QQUNLRURfVU5JVFkpLCBtU2FtcGxlUmF0ZSgwKSwgbVNlbmRMZXZlbCgwKSwgbUZsYWdzKDApCiB7CiAgICAgbWVtc2V0KCZ1LCAwLCBzaXplb2YodSkpOwogfQpAQCAtMTM0LDEwICsxMzQsMTcgQEAKICAgICAgICAgc3NpemVfdCBmaWxsZWQgPSByZWFyIC0gZnJvbnQ7CiAgICAgICAgIC8vIHBpcGUgc2hvdWxkIG5vdCBiZSBvdmVyZnVsbAogICAgICAgICBpZiAoISgwIDw9IGZpbGxlZCAmJiAoc2l6ZV90KSBmaWxsZWQgPD0gbUZyYW1lQ291bnQpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiU2hhcmVkIG1lbW9yeSBjb250cm9sIGJsb2NrIGlzIGNvcnJ1cHQgKGZpbGxlZD0lZCk7IHNodXR0aW5nIGRvd24iLCBmaWxsZWQpOwotICAgICAgICAgICAgbUlzU2h1dGRvd24gPSB0cnVlOwotICAgICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKLSAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgaWYgKG1Jc091dCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJTaGFyZWQgbWVtb3J5IGNvbnRyb2wgYmxvY2sgaXMgY29ycnVwdCAoZmlsbGVkPSV6ZCwgbUZyYW1lQ291bnQ9JXp1KTsgIgorICAgICAgICAgICAgICAgICAgICAgICAgInNodXR0aW5nIGRvd24iLCBmaWxsZWQsIG1GcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICBtSXNTaHV0ZG93biA9IHRydWU7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGZvciBpbnB1dCwgc3luYyB1cCBvbiBvdmVycnVuCisgICAgICAgICAgICBmaWxsZWQgPSAwOworICAgICAgICAgICAgY2Jsay0+dS5tU3RyZWFtaW5nLm1Gcm9udCA9IHJlYXI7CisgICAgICAgICAgICAodm9pZCkgYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19PVkVSUlVOLCAmY2Jsay0+bUZsYWdzKTsKICAgICAgICAgfQogICAgICAgICAvLyBkb24ndCBhbGxvdyBmaWxsaW5nIHBpcGUgYmV5b25kIHRoZSBub21pbmFsIHNpemUKICAgICAgICAgc2l6ZV90IGF2YWlsID0gbUlzT3V0ID8gbUZyYW1lQ291bnQgLSBmaWxsZWQgOiBmaWxsZWQ7CkBAIC0yMDAsMTggKzIwNywxOCBAQAogICAgICAgICAgICAgdHMgPSAmcmVtYWluaW5nOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBMT0dfRkFUQUwoIm9idGFpbkJ1ZmZlcigpIHRpbWVvdXQ9JWQiLCB0aW1lb3V0KTsKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIm9idGFpbkJ1ZmZlcigpIHRpbWVvdXQ9JWQiLCB0aW1lb3V0KTsKICAgICAgICAgICAgIHRzID0gTlVMTDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGludDMyX3Qgb2xkID0gYW5kcm9pZF9hdG9taWNfYW5kKH5DQkxLX0ZVVEVYX1dBS0UsICZjYmxrLT5tRnV0ZXgpOwogICAgICAgICBpZiAoIShvbGQgJiBDQkxLX0ZVVEVYX1dBS0UpKSB7Ci0gICAgICAgICAgICBpbnQgcmM7CiAgICAgICAgICAgICBpZiAobWVhc3VyZSAmJiAhYmVmb3JlSXNWYWxpZCkgewogICAgICAgICAgICAgICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmYmVmb3JlKTsKICAgICAgICAgICAgICAgICBiZWZvcmVJc1ZhbGlkID0gdHJ1ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCByZXQgPSBfX2Z1dGV4X3N5c2NhbGw0KCZjYmxrLT5tRnV0ZXgsCisgICAgICAgICAgICBlcnJubyA9IDA7CisgICAgICAgICAgICAodm9pZCkgc3lzY2FsbChfX05SX2Z1dGV4LCAmY2Jsay0+bUZ1dGV4LAogICAgICAgICAgICAgICAgICAgICBtQ2xpZW50SW5TZXJ2ZXIgPyBGVVRFWF9XQUlUX1BSSVZBVEUgOiBGVVRFWF9XQUlULCBvbGQgJiB+Q0JMS19GVVRFWF9XQUtFLCB0cyk7CiAgICAgICAgICAgICAvLyB1cGRhdGUgdG90YWwgZWxhcHNlZCB0aW1lIHNwZW50IHdhaXRpbmcKICAgICAgICAgICAgIGlmIChtZWFzdXJlKSB7CkBAIC0yMzAsMTYgKzIzNywxNiBAQAogICAgICAgICAgICAgICAgIGJlZm9yZSA9IGFmdGVyOwogICAgICAgICAgICAgICAgIGJlZm9yZUlzVmFsaWQgPSB0cnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChyZXQpIHsKLSAgICAgICAgICAgIGNhc2UgMDogICAgICAgICAgICAgLy8gbm9ybWFsIHdha2V1cCBieSBzZXJ2ZXIsIG9yIGJ5IGJpbmRlckRpZWQoKQotICAgICAgICAgICAgY2FzZSAtRVdPVUxEQkxPQ0s6ICAvLyBiZW5pZ24gcmFjZSBjb25kaXRpb24gd2l0aCBzZXJ2ZXIKLSAgICAgICAgICAgIGNhc2UgLUVJTlRSOiAgICAgICAgLy8gd2FpdCB3YXMgaW50ZXJydXB0ZWQgYnkgc2lnbmFsIG9yIG90aGVyIHNwdXJpb3VzIHdha2V1cAotICAgICAgICAgICAgY2FzZSAtRVRJTUVET1VUOiAgICAvLyB0aW1lLW91dCBleHBpcmVkCisgICAgICAgICAgICBzd2l0Y2ggKGVycm5vKSB7CisgICAgICAgICAgICBjYXNlIDA6ICAgICAgICAgICAgLy8gbm9ybWFsIHdha2V1cCBieSBzZXJ2ZXIsIG9yIGJ5IGJpbmRlckRpZWQoKQorICAgICAgICAgICAgY2FzZSBFV09VTERCTE9DSzogIC8vIGJlbmlnbiByYWNlIGNvbmRpdGlvbiB3aXRoIHNlcnZlcgorICAgICAgICAgICAgY2FzZSBFSU5UUjogICAgICAgIC8vIHdhaXQgd2FzIGludGVycnVwdGVkIGJ5IHNpZ25hbCBvciBvdGhlciBzcHVyaW91cyB3YWtldXAKKyAgICAgICAgICAgIGNhc2UgRVRJTUVET1VUOiAgICAvLyB0aW1lLW91dCBleHBpcmVkCiAgICAgICAgICAgICAgICAgLy8gRklYTUUgdGhlc2UgZXJyb3Ivbm9uLTAgc3RhdHVzIGFyZSBiZWluZyBkcm9wcGVkCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIEFMT0dFKCIlcyB1bmV4cGVjdGVkIGVycm9yICVkIiwgX19mdW5jX18sIHJldCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gLXJldDsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBlcnJubzsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXMgdW5leHBlY3RlZCBlcnJvciAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihzdGF0dXMpKTsKICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjk1LDcgKzMwMiw3IEBACiAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gbUNibGs7CiAgICAgaWYgKCEoYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19JTlZBTElELCAmY2Jsay0+bUZsYWdzKSAmIENCTEtfSU5WQUxJRCkpIHsKICAgICAgICAgLy8gaXQgc2VlbXMgdGhhdCBhIEZVVEVYX1dBS0VfUFJJVkFURSB3aWxsIG5vdCB3YWtlIGEgRlVURVhfV0FJVCwgZXZlbiB3aXRoaW4gc2FtZSBwcm9jZXNzCi0gICAgICAgICh2b2lkKSBfX2Z1dGV4X3N5c2NhbGwzKCZjYmxrLT5tRnV0ZXgsIG1DbGllbnRJblNlcnZlciA/IEZVVEVYX1dBS0VfUFJJVkFURSA6IEZVVEVYX1dBS0UsCisgICAgICAgICh2b2lkKSBzeXNjYWxsKF9fTlJfZnV0ZXgsICZjYmxrLT5tRnV0ZXgsIG1DbGllbnRJblNlcnZlciA/IEZVVEVYX1dBS0VfUFJJVkFURSA6IEZVVEVYX1dBS0UsCiAgICAgICAgICAgICAgICAgMSk7CiAgICAgfQogfQpAQCAtMzA0LDcgKzMxMSw3IEBACiB7CiAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gbUNibGs7CiAgICAgaWYgKCEoYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19JTlRFUlJVUFQsICZjYmxrLT5tRmxhZ3MpICYgQ0JMS19JTlRFUlJVUFQpKSB7Ci0gICAgICAgICh2b2lkKSBfX2Z1dGV4X3N5c2NhbGwzKCZjYmxrLT5tRnV0ZXgsIG1DbGllbnRJblNlcnZlciA/IEZVVEVYX1dBS0VfUFJJVkFURSA6IEZVVEVYX1dBS0UsCisgICAgICAgICh2b2lkKSBzeXNjYWxsKF9fTlJfZnV0ZXgsICZjYmxrLT5tRnV0ZXgsIG1DbGllbnRJblNlcnZlciA/IEZVVEVYX1dBS0VfUFJJVkFURSA6IEZVVEVYX1dBS0UsCiAgICAgICAgICAgICAgICAgMSk7CiAgICAgfQogfQpAQCAtMzMxLDcgKzMzOCw3IEBACiAgICAgc3NpemVfdCBmaWxsZWQgPSByZWFyIC0gZnJvbnQ7CiAgICAgLy8gcGlwZSBzaG91bGQgbm90IGJlIG92ZXJmdWxsCiAgICAgaWYgKCEoMCA8PSBmaWxsZWQgJiYgKHNpemVfdCkgZmlsbGVkIDw9IG1GcmFtZUNvdW50KSkgewotICAgICAgICBBTE9HRSgiU2hhcmVkIG1lbW9yeSBjb250cm9sIGJsb2NrIGlzIGNvcnJ1cHQgKGZpbGxlZD0lZCk7IHNodXR0aW5nIGRvd24iLCBmaWxsZWQpOworICAgICAgICBBTE9HRSgiU2hhcmVkIG1lbW9yeSBjb250cm9sIGJsb2NrIGlzIGNvcnJ1cHQgKGZpbGxlZD0lemQpOyBzaHV0dGluZyBkb3duIiwgZmlsbGVkKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIHJldHVybiAoc2l6ZV90KWZpbGxlZDsKQEAgLTQyOSwyNCArNDM2LDI0IEBACiAgICAgICAgICAgICB0cyA9ICZyZW1haW5pbmc7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIExPR19GQVRBTCgid2FpdFN0cmVhbUVuZERvbmUoKSB0aW1lb3V0PSVkIiwgdGltZW91dCk7CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJ3YWl0U3RyZWFtRW5kRG9uZSgpIHRpbWVvdXQ9JWQiLCB0aW1lb3V0KTsKICAgICAgICAgICAgIHRzID0gTlVMTDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGludDMyX3Qgb2xkID0gYW5kcm9pZF9hdG9taWNfYW5kKH5DQkxLX0ZVVEVYX1dBS0UsICZjYmxrLT5tRnV0ZXgpOwogICAgICAgICBpZiAoIShvbGQgJiBDQkxLX0ZVVEVYX1dBS0UpKSB7Ci0gICAgICAgICAgICBpbnQgcmM7Ci0gICAgICAgICAgICBpbnQgcmV0ID0gX19mdXRleF9zeXNjYWxsNCgmY2Jsay0+bUZ1dGV4LAorICAgICAgICAgICAgZXJybm8gPSAwOworICAgICAgICAgICAgKHZvaWQpIHN5c2NhbGwoX19OUl9mdXRleCwgJmNibGstPm1GdXRleCwKICAgICAgICAgICAgICAgICAgICAgbUNsaWVudEluU2VydmVyID8gRlVURVhfV0FJVF9QUklWQVRFIDogRlVURVhfV0FJVCwgb2xkICYgfkNCTEtfRlVURVhfV0FLRSwgdHMpOwotICAgICAgICAgICAgc3dpdGNoIChyZXQpIHsKLSAgICAgICAgICAgIGNhc2UgMDogICAgICAgICAgICAgLy8gbm9ybWFsIHdha2V1cCBieSBzZXJ2ZXIsIG9yIGJ5IGJpbmRlckRpZWQoKQotICAgICAgICAgICAgY2FzZSAtRVdPVUxEQkxPQ0s6ICAvLyBiZW5pZ24gcmFjZSBjb25kaXRpb24gd2l0aCBzZXJ2ZXIKLSAgICAgICAgICAgIGNhc2UgLUVJTlRSOiAgICAgICAgLy8gd2FpdCB3YXMgaW50ZXJydXB0ZWQgYnkgc2lnbmFsIG9yIG90aGVyIHNwdXJpb3VzIHdha2V1cAotICAgICAgICAgICAgY2FzZSAtRVRJTUVET1VUOiAgICAvLyB0aW1lLW91dCBleHBpcmVkCisgICAgICAgICAgICBzd2l0Y2ggKGVycm5vKSB7CisgICAgICAgICAgICBjYXNlIDA6ICAgICAgICAgICAgLy8gbm9ybWFsIHdha2V1cCBieSBzZXJ2ZXIsIG9yIGJ5IGJpbmRlckRpZWQoKQorICAgICAgICAgICAgY2FzZSBFV09VTERCTE9DSzogIC8vIGJlbmlnbiByYWNlIGNvbmRpdGlvbiB3aXRoIHNlcnZlcgorICAgICAgICAgICAgY2FzZSBFSU5UUjogICAgICAgIC8vIHdhaXQgd2FzIGludGVycnVwdGVkIGJ5IHNpZ25hbCBvciBvdGhlciBzcHVyaW91cyB3YWtldXAKKyAgICAgICAgICAgIGNhc2UgRVRJTUVET1VUOiAgICAvLyB0aW1lLW91dCBleHBpcmVkCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIEFMT0dFKCIlcyB1bmV4cGVjdGVkIGVycm9yICVkIiwgX19mdW5jX18sIHJldCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gLXJldDsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBlcnJubzsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXMgdW5leHBlY3RlZCBlcnJvciAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihzdGF0dXMpKTsKICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNDcwLDE0ICs0NzcsMTkgQEAKIAogdm9pZCBTdGF0aWNBdWRpb1RyYWNrQ2xpZW50UHJveHk6OmZsdXNoKCkKIHsKLSAgICBMT0dfRkFUQUwoInN0YXRpYyBmbHVzaCIpOworICAgIExPR19BTFdBWVNfRkFUQUwoInN0YXRpYyBmbHVzaCIpOwogfQogCiB2b2lkIFN0YXRpY0F1ZGlvVHJhY2tDbGllbnRQcm94eTo6c2V0TG9vcChzaXplX3QgbG9vcFN0YXJ0LCBzaXplX3QgbG9vcEVuZCwgaW50IGxvb3BDb3VudCkKIHsKKyAgICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbiBvbiBhIDY0LWJpdCBjbGllbnQKKyAgICBpZiAobG9vcFN0YXJ0ID4gVUlOVDMyX01BWCB8fCBsb29wRW5kID4gVUlOVDMyX01BWCkgeworICAgICAgICAvLyBGSVhNRSBTaG91bGQgcmV0dXJuIGFuIGVycm9yIHN0YXR1cworICAgICAgICByZXR1cm47CisgICAgfQogICAgIFN0YXRpY0F1ZGlvVHJhY2tTdGF0ZSBuZXdTdGF0ZTsKLSAgICBuZXdTdGF0ZS5tTG9vcFN0YXJ0ID0gbG9vcFN0YXJ0OwotICAgIG5ld1N0YXRlLm1Mb29wRW5kID0gbG9vcEVuZDsKKyAgICBuZXdTdGF0ZS5tTG9vcFN0YXJ0ID0gKHVpbnQzMl90KSBsb29wU3RhcnQ7CisgICAgbmV3U3RhdGUubUxvb3BFbmQgPSAodWludDMyX3QpIGxvb3BFbmQ7CiAgICAgbmV3U3RhdGUubUxvb3BDb3VudCA9IGxvb3BDb3VudDsKICAgICBtQnVmZmVyUG9zaXRpb24gPSBsb29wU3RhcnQ7CiAgICAgKHZvaWQpIG1NdXRhdG9yLnB1c2gobmV3U3RhdGUpOwpAQCAtNDg3LDcgKzQ5OSw3IEBACiB7CiAgICAgc2l6ZV90IGJ1ZmZlclBvc2l0aW9uOwogICAgIGlmIChtTXV0YXRvci5hY2soKSkgewotICAgICAgICBidWZmZXJQb3NpdGlvbiA9IG1DYmxrLT51Lm1TdGF0aWMubUJ1ZmZlclBvc2l0aW9uOworICAgICAgICBidWZmZXJQb3NpdGlvbiA9IChzaXplX3QpIG1DYmxrLT51Lm1TdGF0aWMubUJ1ZmZlclBvc2l0aW9uOwogICAgICAgICBpZiAoYnVmZmVyUG9zaXRpb24gPiBtRnJhbWVDb3VudCkgewogICAgICAgICAgICAgYnVmZmVyUG9zaXRpb24gPSBtRnJhbWVDb3VudDsKICAgICAgICAgfQpAQCAtNTMwLDcgKzU0Miw3IEBACiAgICAgICAgICAgICBpZiAoZnJvbnQgIT0gcmVhcikgewogICAgICAgICAgICAgICAgIGludDMyX3Qgb2xkID0gYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19GVVRFWF9XQUtFLCAmY2Jsay0+bUZ1dGV4KTsKICAgICAgICAgICAgICAgICBpZiAoIShvbGQgJiBDQkxLX0ZVVEVYX1dBS0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICh2b2lkKSBfX2Z1dGV4X3N5c2NhbGwzKCZjYmxrLT5tRnV0ZXgsCisgICAgICAgICAgICAgICAgICAgICh2b2lkKSBzeXNjYWxsKF9fTlJfZnV0ZXgsICZjYmxrLT5tRnV0ZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNsaWVudEluU2VydmVyID8gRlVURVhfV0FLRV9QUklWQVRFIDogRlVURVhfV0FLRSwgMSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNTQzLDcgKzU1NSw3IEBACiAgICAgc3NpemVfdCBmaWxsZWQgPSByZWFyIC0gZnJvbnQ7CiAgICAgLy8gcGlwZSBzaG91bGQgbm90IGFscmVhZHkgYmUgb3ZlcmZ1bGwKICAgICBpZiAoISgwIDw9IGZpbGxlZCAmJiAoc2l6ZV90KSBmaWxsZWQgPD0gbUZyYW1lQ291bnQpKSB7Ci0gICAgICAgIEFMT0dFKCJTaGFyZWQgbWVtb3J5IGNvbnRyb2wgYmxvY2sgaXMgY29ycnVwdCAoZmlsbGVkPSVkKTsgc2h1dHRpbmcgZG93biIsIGZpbGxlZCk7CisgICAgICAgIEFMT0dFKCJTaGFyZWQgbWVtb3J5IGNvbnRyb2wgYmxvY2sgaXMgY29ycnVwdCAoZmlsbGVkPSV6ZCk7IHNodXR0aW5nIGRvd24iLCBmaWxsZWQpOwogICAgICAgICBtSXNTaHV0ZG93biA9IHRydWU7CiAgICAgfQogICAgIGlmIChtSXNTaHV0ZG93bikgewpAQCAtNjE2LDEzICs2MjgsMTMgQEAKICAgICAgICAgYW5kcm9pZF9hdG9taWNfcmVsZWFzZV9zdG9yZShzdGVwQ291bnQgKyByZWFyLCAmY2Jsay0+dS5tU3RyZWFtaW5nLm1SZWFyKTsKICAgICB9CiAKLSAgICBtQ2Jsay0+bVNlcnZlciArPSBzdGVwQ291bnQ7CisgICAgY2Jsay0+bVNlcnZlciArPSBzdGVwQ291bnQ7CiAKICAgICBzaXplX3QgaGFsZiA9IG1GcmFtZUNvdW50IC8gMjsKICAgICBpZiAoaGFsZiA9PSAwKSB7CiAgICAgICAgIGhhbGYgPSAxOwogICAgIH0KLSAgICBzaXplX3QgbWluaW11bSA9IGNibGstPm1NaW5pbXVtOworICAgIHNpemVfdCBtaW5pbXVtID0gKHNpemVfdCkgY2Jsay0+bU1pbmltdW07CiAgICAgaWYgKG1pbmltdW0gPT0gMCkgewogICAgICAgICBtaW5pbXVtID0gbUlzT3V0ID8gaGFsZiA6IDE7CiAgICAgfSBlbHNlIGlmIChtaW5pbXVtID4gaGFsZikgewpAQCAtNjMwLDEwICs2NDIsMTAgQEAKICAgICB9CiAgICAgLy8gRklYTUUgQXVkaW9SZWNvcmQgd2FrZXVwIG5lZWRzIHRvIGJlIG9wdGltaXplZDsgaXQgY3VycmVudGx5IHdha2VzIHVwIGNsaWVudCBldmVyeSB0aW1lCiAgICAgaWYgKCFtSXNPdXQgfHwgKG1BdmFpbFRvQ2xpZW50ICsgc3RlcENvdW50ID49IG1pbmltdW0pKSB7Ci0gICAgICAgIEFMT0dWKCJtQXZhaWxUb0NsaWVudD0ldSBzdGVwQ291bnQ9JXUgbWluaW11bT0ldSIsIG1BdmFpbFRvQ2xpZW50LCBzdGVwQ291bnQsIG1pbmltdW0pOworICAgICAgICBBTE9HVigibUF2YWlsVG9DbGllbnQ9JXp1IHN0ZXBDb3VudD0lenUgbWluaW11bT0lenUiLCBtQXZhaWxUb0NsaWVudCwgc3RlcENvdW50LCBtaW5pbXVtKTsKICAgICAgICAgaW50MzJfdCBvbGQgPSBhbmRyb2lkX2F0b21pY19vcihDQkxLX0ZVVEVYX1dBS0UsICZjYmxrLT5tRnV0ZXgpOwogICAgICAgICBpZiAoIShvbGQgJiBDQkxLX0ZVVEVYX1dBS0UpKSB7Ci0gICAgICAgICAgICAodm9pZCkgX19mdXRleF9zeXNjYWxsMygmY2Jsay0+bUZ1dGV4LAorICAgICAgICAgICAgKHZvaWQpIHN5c2NhbGwoX19OUl9mdXRleCwgJmNibGstPm1GdXRleCwKICAgICAgICAgICAgICAgICAgICAgbUNsaWVudEluU2VydmVyID8gRlVURVhfV0FLRV9QUklWQVRFIDogRlVURVhfV0FLRSwgMSk7CiAgICAgICAgIH0KICAgICB9CkBAIC02NjMsNyArNjc1LDcgQEAKICAgICBzc2l6ZV90IGZpbGxlZCA9IHJlYXIgLSBjYmxrLT51Lm1TdHJlYW1pbmcubUZyb250OwogICAgIC8vIHBpcGUgc2hvdWxkIG5vdCBhbHJlYWR5IGJlIG92ZXJmdWxsCiAgICAgaWYgKCEoMCA8PSBmaWxsZWQgJiYgKHNpemVfdCkgZmlsbGVkIDw9IG1GcmFtZUNvdW50KSkgewotICAgICAgICBBTE9HRSgiU2hhcmVkIG1lbW9yeSBjb250cm9sIGJsb2NrIGlzIGNvcnJ1cHQgKGZpbGxlZD0lZCk7IHNodXR0aW5nIGRvd24iLCBmaWxsZWQpOworICAgICAgICBBTE9HRSgiU2hhcmVkIG1lbW9yeSBjb250cm9sIGJsb2NrIGlzIGNvcnJ1cHQgKGZpbGxlZD0lemQpOyBzaHV0dGluZyBkb3duIiwgZmlsbGVkKTsKICAgICAgICAgbUlzU2h1dGRvd24gPSB0cnVlOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CkBAIC02NzQsMTAgKzY4NiwxMSBAQAogfQogCiBib29sICBBdWRpb1RyYWNrU2VydmVyUHJveHk6OnNldFN0cmVhbUVuZERvbmUoKSB7CisgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gbUNibGs7CiAgICAgYm9vbCBvbGQgPQotICAgICAgICAgICAgKGFuZHJvaWRfYXRvbWljX29yKENCTEtfU1RSRUFNX0VORF9ET05FLCAmbUNibGstPm1GbGFncykgJiBDQkxLX1NUUkVBTV9FTkRfRE9ORSkgIT0gMDsKKyAgICAgICAgICAgIChhbmRyb2lkX2F0b21pY19vcihDQkxLX1NUUkVBTV9FTkRfRE9ORSwgJmNibGstPm1GbGFncykgJiBDQkxLX1NUUkVBTV9FTkRfRE9ORSkgIT0gMDsKICAgICBpZiAoIW9sZCkgewotICAgICAgICAodm9pZCkgX19mdXRleF9zeXNjYWxsMygmbUNibGstPm1GdXRleCwgbUNsaWVudEluU2VydmVyID8gRlVURVhfV0FLRV9QUklWQVRFIDogRlVURVhfV0FLRSwKKyAgICAgICAgKHZvaWQpIHN5c2NhbGwoX19OUl9mdXRleCwgJmNibGstPm1GdXRleCwgbUNsaWVudEluU2VydmVyID8gRlVURVhfV0FLRV9QUklWQVRFIDogRlVURVhfV0FLRSwKICAgICAgICAgICAgICAgICAxKTsKICAgICB9CiAgICAgcmV0dXJuIG9sZDsKQEAgLTY4NSwxMCArNjk4LDExIEBACiAKIHZvaWQgQXVkaW9UcmFja1NlcnZlclByb3h5Ojp0YWxseVVuZGVycnVuRnJhbWVzKHVpbnQzMl90IGZyYW1lQ291bnQpCiB7Ci0gICAgbUNibGstPnUubVN0cmVhbWluZy5tVW5kZXJydW5GcmFtZXMgKz0gZnJhbWVDb3VudDsKKyAgICBhdWRpb190cmFja19jYmxrX3QqIGNibGsgPSBtQ2JsazsKKyAgICBjYmxrLT51Lm1TdHJlYW1pbmcubVVuZGVycnVuRnJhbWVzICs9IGZyYW1lQ291bnQ7CiAKICAgICAvLyBGSVhNRSBhbHNvIHdha2UgZnV0ZXggc28gdGhhdCB1bmRlcnJ1biBpcyBub3RpY2VkIG1vcmUgcXVpY2tseQotICAgICh2b2lkKSBhbmRyb2lkX2F0b21pY19vcihDQkxLX1VOREVSUlVOLCAmbUNibGstPm1GbGFncyk7CisgICAgKHZvaWQpIGFuZHJvaWRfYXRvbWljX29yKENCTEtfVU5ERVJSVU4sICZjYmxrLT5tRmxhZ3MpOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTc2MCwxMiArNzc0LDEzIEBACiAgICAgICAgICAgICBtSXNTaHV0ZG93biA9IHRydWU7CiAgICAgICAgICAgICByZXR1cm4gKHNzaXplX3QpIE5PX0lOSVQ7CiAgICAgICAgIH0KLSAgICAgICAgbUNibGstPnUubVN0YXRpYy5tQnVmZmVyUG9zaXRpb24gPSBwb3NpdGlvbjsKKyAgICAgICAgLy8gVGhpcyBtYXkgb3ZlcmZsb3csIGJ1dCBjbGllbnQgaXMgbm90IHN1cHBvc2VkIHRvIHJlbHkgb24gaXQKKyAgICAgICAgbUNibGstPnUubVN0YXRpYy5tQnVmZmVyUG9zaXRpb24gPSAodWludDMyX3QpIHBvc2l0aW9uOwogICAgIH0KICAgICByZXR1cm4gKHNzaXplX3QpIHBvc2l0aW9uOwogfQogCi1zdGF0dXNfdCBTdGF0aWNBdWRpb1RyYWNrU2VydmVyUHJveHk6Om9idGFpbkJ1ZmZlcihCdWZmZXIqIGJ1ZmZlciwgYm9vbCBhY2tGbHVzaCkKK3N0YXR1c190IFN0YXRpY0F1ZGlvVHJhY2tTZXJ2ZXJQcm94eTo6b2J0YWluQnVmZmVyKEJ1ZmZlciogYnVmZmVyLCBib29sIGFja0ZsdXNoIF9fdW51c2VkKQogewogICAgIGlmIChtSXNTaHV0ZG93bikgewogICAgICAgICBidWZmZXItPm1GcmFtZUNvdW50ID0gMDsKQEAgLTgxOSw3ICs4MzQsNyBAQAogICAgIHNpemVfdCBuZXdQb3NpdGlvbiA9IHBvc2l0aW9uICsgc3RlcENvdW50OwogICAgIGludDMyX3Qgc2V0RmxhZ3MgPSAwOwogICAgIGlmICghKHBvc2l0aW9uIDw9IG5ld1Bvc2l0aW9uICYmIG5ld1Bvc2l0aW9uIDw9IG1GcmFtZUNvdW50KSkgewotICAgICAgICBBTE9HVygiJXMgbmV3UG9zaXRpb24gJXUgb3V0c2lkZSBbJXUsICV1XSIsIF9fZnVuY19fLCBuZXdQb3NpdGlvbiwgcG9zaXRpb24sIG1GcmFtZUNvdW50KTsKKyAgICAgICAgQUxPR1coIiVzIG5ld1Bvc2l0aW9uICV6dSBvdXRzaWRlIFslenUsICV6dV0iLCBfX2Z1bmNfXywgbmV3UG9zaXRpb24sIHBvc2l0aW9uLCBtRnJhbWVDb3VudCk7CiAgICAgICAgIG5ld1Bvc2l0aW9uID0gbUZyYW1lQ291bnQ7CiAgICAgfSBlbHNlIGlmIChtU3RhdGUubUxvb3BDb3VudCAhPSAwICYmIG5ld1Bvc2l0aW9uID09IG1TdGF0ZS5tTG9vcEVuZCkgewogICAgICAgICBpZiAobVN0YXRlLm1Mb29wQ291bnQgPT0gLTEgfHwgLS1tU3RhdGUubUxvb3BDb3VudCAhPSAwKSB7CkBAIC04MzYsNyArODUxLDggQEAKICAgICBtUG9zaXRpb24gPSBuZXdQb3NpdGlvbjsKIAogICAgIGNibGstPm1TZXJ2ZXIgKz0gc3RlcENvdW50OwotICAgIGNibGstPnUubVN0YXRpYy5tQnVmZmVyUG9zaXRpb24gPSBuZXdQb3NpdGlvbjsKKyAgICAvLyBUaGlzIG1heSBvdmVyZmxvdywgYnV0IGNsaWVudCBpcyBub3Qgc3VwcG9zZWQgdG8gcmVseSBvbiBpdAorICAgIGNibGstPnUubVN0YXRpYy5tQnVmZmVyUG9zaXRpb24gPSAodWludDMyX3QpIG5ld1Bvc2l0aW9uOwogICAgIGlmIChzZXRGbGFncyAhPSAwKSB7CiAgICAgICAgICh2b2lkKSBhbmRyb2lkX2F0b21pY19vcihzZXRGbGFncywgJmNibGstPm1GbGFncyk7CiAgICAgICAgIC8vIHRoaXMgd291bGQgYmUgYSBnb29kIHBsYWNlIHRvIHdha2UgYSBmdXRleApAQCAtODQ3LDcgKzg2Myw3IEBACiAgICAgYnVmZmVyLT5tTm9uQ29udGlnID0gMDsKIH0KIAotdm9pZCBTdGF0aWNBdWRpb1RyYWNrU2VydmVyUHJveHk6OnRhbGx5VW5kZXJydW5GcmFtZXModWludDMyX3QgZnJhbWVDb3VudCkKK3ZvaWQgU3RhdGljQXVkaW9UcmFja1NlcnZlclByb3h5Ojp0YWxseVVuZGVycnVuRnJhbWVzKHVpbnQzMl90IGZyYW1lQ291bnQgX191bnVzZWQpCiB7CiAgICAgLy8gVW5saWtlIEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eTo6dGFsbHlVbmRlcnJ1bkZyYW1lcygpIHVzZWQgZm9yIHN0cmVhbWluZyB0cmFja3MsCiAgICAgLy8gd2UgZG9uJ3QgaGF2ZSBhIGxvY2F0aW9uIHRvIGNvdW50IHVuZGVycnVuIGZyYW1lcy4gIFRoZSB1bmRlcnJ1biBmcmFtZSBjb3VudGVyCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmNwcCBiL21lZGlhL2xpYm1lZGlhL0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxOTk0ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmNwcApAQCAtMCwwICsxLDQ3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ2hhcmFjdGVyRW5jb2RpbmdEZWN0b3IiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+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+wLCAjMzE4CisgICAgMHhENDVDLCAvLyDtkZwsICMyMzIKKyAgICAweEQ0ODAsIC8vIO2SgCwgIzQ5NworICAgIDB4RDQ4OCwgLy8g7ZKILCAjMTEzCisgICAgMHhENDhELCAvLyDtko0sICM0MjUKKyAgICAweEQ1MDQsIC8vIO2UhCwgIzExMAorICAgIDB4RDUwOCwgLy8g7ZSILCAjNDk4CisgICAgMHhENTBDLCAvLyDtlIwsICMyMTEKKyAgICAweEQ1M0MsIC8vIO2UvCwgIzE2OQorICAgIDB4RDU0NCwgLy8g7ZWELCAjMjk1CisgICAgMHhENTUxLCAvLyDtlZEsICMzNzYKKyAgICAweEQ1NTgsIC8vIO2VmCwgIzcKKyAgICAweEQ1NTksIC8vIO2VmSwgIzEyOQorICAgIDB4RDU1QywgLy8g7ZWcLCAjMTUKKyAgICAweEQ1NjAsIC8vIO2VoCwgIzE0NAorICAgIDB4RDU2OCwgLy8g7ZWoLCAjMTUyCisgICAgMHhENTY5LCAvLyDtlaksICMxMjMKKyAgICAweEQ1NkQsIC8vIO2VrSwgIzI2OAorICAgIDB4RDU3NCwgLy8g7ZW0LCAjMzIKKyAgICAweEQ1ODgsIC8vIO2WiCwgIzE4MAorICAgIDB4RDU4OSwgLy8g7ZaJLCAjMTM1CisgICAgMHhENUE1LCAvLyDtlqUsICMzNDUKKyAgICAweEQ1QzgsIC8vIO2XiCwgIzM5NgorICAgIDB4RDVEOCwgLy8g7ZeYLCAjMzE2CisgICAgMHhENUU0LCAvLyDtl6QsICM0NzQKKyAgICAweEQ2MDQsIC8vIO2YhCwgIzE4NQorICAgIDB4RDYxMSwgLy8g7ZiRLCAjMzE1CisgICAgMHhENjE1LCAvLyDtmJUsICMyNDQKKyAgICAweEQ2MUMsIC8vIO2YnCwgIzQyOAorICAgIDB4RDYzOCwgLy8g7Zi4LCAjMTE3CisgICAgMHhENjNDLCAvLyDtmLwsICMzNTgKKyAgICAweEQ2NDgsIC8vIO2ZiCwgIzMzMAorICAgIDB4RDY0RCwgLy8g7ZmNLCAjMzYzCisgICAgMHhENjU0LCAvLyDtmZQsICM2MworICAgIDB4RDY1NSwgLy8g7ZmVLCAjMTgzCisgICAgMHhENjU4LCAvLyDtmZgsICMyMjQKKyAgICAweEQ2NUMsIC8vIO2ZnCwgIzI3NworICAgIDB4RDY2OSwgLy8g7ZmpLCAjMzUzCisgICAgMHhENjhDLCAvLyDtmowsICM3NAorICAgIDB4RDY4RCwgLy8g7ZqNLCAjNDU4CisgICAgMHhENjlGLCAvLyDtmp8sICM0MDkKKyAgICAweEQ2QTgsIC8vIO2aqCwgIzQwMAorICAgIDB4RDZDNCwgLy8g7ZuELCAjMTc2CisgICAgMHhENkM4LCAvLyDtm4gsICM0ODYKKyAgICAweEQ3MzQsIC8vIO2ctCwgIzM2NQorICAgIDB4RDc1NCwgLy8g7Z2ULCAjNDgwCisgICAgMHhENzZDLCAvLyDtnawsICMzMzQKKyAgICAweEQ3ODgsIC8vIO2eiCwgIzIyOAorICAgIDB4RDc5OCwgLy8g7Z6YLCAjNTAyCit9OworLy8gdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHNhbXBsZSBjb3ZlcmVkIGJ5IHRoZSBhYm92ZSBjaGFyYWN0ZXJzCitzdGF0aWMgY29uc3QgZmxvYXQgZnJlcXVlbnRfa29fY292ZXJhZ2U9MC45NDgxNTcwMjE0NjQxODQ7CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvRmxpbmdlci5jcHAKaW5kZXggOThkM2RlZS4uYWMyZDFjOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvRmxpbmdlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvRmxpbmdlci5jcHAKQEAgLTU4LDcgKzU4LDcgQEAKICAgICBSRVNUT1JFX09VVFBVVCwKICAgICBPUEVOX0lOUFVULAogICAgIENMT1NFX0lOUFVULAotICAgIFNFVF9TVFJFQU1fT1VUUFVULAorICAgIElOVkFMSURBVEVfU1RSRUFNLAogICAgIFNFVF9WT0lDRV9WT0xVTUUsCiAgICAgR0VUX1JFTkRFUl9QT1NJVElPTiwKICAgICBHRVRfSU5QVVRfRlJBTUVTX0xPU1QsCkBAIC03NCw4ICs3NCwxNyBAQAogICAgIEdFVF9QUklNQVJZX09VVFBVVF9TQU1QTElOR19SQVRFLAogICAgIEdFVF9QUklNQVJZX09VVFBVVF9GUkFNRV9DT1VOVCwKICAgICBTRVRfTE9XX1JBTV9ERVZJQ0UsCisgICAgTElTVF9BVURJT19QT1JUUywKKyAgICBHRVRfQVVESU9fUE9SVCwKKyAgICBDUkVBVEVfQVVESU9fUEFUQ0gsCisgICAgUkVMRUFTRV9BVURJT19QQVRDSCwKKyAgICBMSVNUX0FVRElPX1BBVENIRVMsCisgICAgU0VUX0FVRElPX1BPUlRfQ09ORklHLAorICAgIEdFVF9BVURJT19IV19TWU5DCiB9OwogCisjZGVmaW5lIE1BWF9JVEVNU19QRVJfTElTVCAxMDI0CisKIGNsYXNzIEJwQXVkaW9GbGluZ2VyIDogcHVibGljIEJwSW50ZXJmYWNlPElBdWRpb0ZsaW5nZXI+CiB7CiBwdWJsaWM6CkBAIC04OSwxMyArOTgsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqcEZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrX2ZsYWdzX3QgKmZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHRpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgmIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGllbnRVaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpCiAgICAgewpAQCAtMTA2LDkgKzExNCwxMSBAQAogICAgICAgICBkYXRhLndyaXRlSW50MzIoc2FtcGxlUmF0ZSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihmb3JtYXQpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoY2hhbm5lbE1hc2spOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoZnJhbWVDb3VudCk7CisgICAgICAgIHNpemVfdCBmcmFtZUNvdW50ID0gcEZyYW1lQ291bnQgIT0gTlVMTCA/ICpwRnJhbWVDb3VudCA6IDA7CisgICAgICAgIGRhdGEud3JpdGVJbnQ2NChmcmFtZUNvdW50KTsKICAgICAgICAgdHJhY2tfZmxhZ3NfdCBsRmxhZ3MgPSBmbGFncyAhPSBOVUxMID8gKmZsYWdzIDogKHRyYWNrX2ZsYWdzX3QpIFRSQUNLX0RFRkFVTFQ7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihsRmxhZ3MpOworICAgICAgICAvLyBoYXZlU2hhcmVkQnVmZmVyCiAgICAgICAgIGlmIChzaGFyZWRCdWZmZXIgIT0gMCkgewogICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKHRydWUpOwogICAgICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihzaGFyZWRCdWZmZXItPmFzQmluZGVyKCkpOwpAQCAtMTE3LDcgKzEyNyw3IEBACiAgICAgICAgIH0KICAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBvdXRwdXQpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHRpZCk7Ci0gICAgICAgIGludCBsU2Vzc2lvbklkID0gMDsKKyAgICAgICAgaW50IGxTZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFOwogICAgICAgICBpZiAoc2Vzc2lvbklkICE9IE5VTEwpIHsKICAgICAgICAgICAgIGxTZXNzaW9uSWQgPSAqc2Vzc2lvbklkOwogICAgICAgICB9CkBAIC0xMjcsNiArMTM3LDEwIEBACiAgICAgICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2sgZXJyb3I6ICVzIiwgc3RyZXJyb3IoLWxTdGF0dXMpKTsKICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZyYW1lQ291bnQgPSByZXBseS5yZWFkSW50NjQoKTsKKyAgICAgICAgICAgIGlmIChwRnJhbWVDb3VudCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgKnBGcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGxGbGFncyA9IHJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICAgICAgaWYgKGZsYWdzICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAqZmxhZ3MgPSBsRmxhZ3M7CkBAIC0xMzUsMTEgKzE0OSwyMSBAQAogICAgICAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgKnNlc3Npb25JZCA9IGxTZXNzaW9uSWQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBuYW1lID0gcmVwbHkucmVhZFN0cmluZzgoKTsKICAgICAgICAgICAgIGxTdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHRyYWNrID0gaW50ZXJmYWNlX2Nhc3Q8SUF1ZGlvVHJhY2s+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBpZiAobFN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGlmICh0cmFjayA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFjayBzaG91bGQgaGF2ZSByZXR1cm5lZCBhbiBJQXVkaW9UcmFjayIpOworICAgICAgICAgICAgICAgICAgICBsU3RhdHVzID0gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICh0cmFjayAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFjayByZXR1cm5lZCBhbiBJQXVkaW9UcmFjayBidXQgd2l0aCBzdGF0dXMgJWQiLCBsU3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhY2suY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHN0YXR1cykgeworICAgICAgICBpZiAoc3RhdHVzICE9IE5VTEwpIHsKICAgICAgICAgICAgICpzdGF0dXMgPSBsU3RhdHVzOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiB0cmFjazsKQEAgLTE1MCwxMCArMTc0LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnBGcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja19mbGFnc190ICpmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgdGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpub3RpZmljYXRpb25GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElNZW1vcnk+JiBjYmxrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJTWVtb3J5PiYgYnVmZmVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cykKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKQEAgLTE2MywxOSArMTkwLDI3IEBACiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzYW1wbGVSYXRlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGZvcm1hdCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihjaGFubmVsTWFzayk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihmcmFtZUNvdW50KTsKKyAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSBwRnJhbWVDb3VudCAhPSBOVUxMID8gKnBGcmFtZUNvdW50IDogMDsKKyAgICAgICAgZGF0YS53cml0ZUludDY0KGZyYW1lQ291bnQpOwogICAgICAgICB0cmFja19mbGFnc190IGxGbGFncyA9IGZsYWdzICE9IE5VTEwgPyAqZmxhZ3MgOiAodHJhY2tfZmxhZ3NfdCkgVFJBQ0tfREVGQVVMVDsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGxGbGFncyk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgdGlkKTsKLSAgICAgICAgaW50IGxTZXNzaW9uSWQgPSAwOworICAgICAgICBpbnQgbFNlc3Npb25JZCA9IEFVRElPX1NFU1NJT05fQUxMT0NBVEU7CiAgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gTlVMTCkgewogICAgICAgICAgICAgbFNlc3Npb25JZCA9ICpzZXNzaW9uSWQ7CiAgICAgICAgIH0KICAgICAgICAgZGF0YS53cml0ZUludDMyKGxTZXNzaW9uSWQpOworICAgICAgICBkYXRhLndyaXRlSW50NjQobm90aWZpY2F0aW9uRnJhbWVzICE9IE5VTEwgPyAqbm90aWZpY2F0aW9uRnJhbWVzIDogMCk7CisgICAgICAgIGNibGsuY2xlYXIoKTsKKyAgICAgICAgYnVmZmVycy5jbGVhcigpOwogICAgICAgICBzdGF0dXNfdCBsU3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KE9QRU5fUkVDT1JELCBkYXRhLCAmcmVwbHkpOwogICAgICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgQUxPR0UoIm9wZW5SZWNvcmQgZXJyb3I6ICVzIiwgc3RyZXJyb3IoLWxTdGF0dXMpKTsKICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZyYW1lQ291bnQgPSByZXBseS5yZWFkSW50NjQoKTsKKyAgICAgICAgICAgIGlmIChwRnJhbWVDb3VudCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgKnBGcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGxGbGFncyA9IHJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICAgICAgaWYgKGZsYWdzICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAqZmxhZ3MgPSBsRmxhZ3M7CkBAIC0xODQsMjEgKzIxOSw0MiBAQAogICAgICAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgKnNlc3Npb25JZCA9IGxTZXNzaW9uSWQ7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBzaXplX3QgbE5vdGlmaWNhdGlvbkZyYW1lcyA9IChzaXplX3QpIHJlcGx5LnJlYWRJbnQ2NCgpOworICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbkZyYW1lcyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgKm5vdGlmaWNhdGlvbkZyYW1lcyA9IGxOb3RpZmljYXRpb25GcmFtZXM7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBsU3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgICAgICByZWNvcmQgPSBpbnRlcmZhY2VfY2FzdDxJQXVkaW9SZWNvcmQ+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBjYmxrID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIGlmIChjYmxrICE9IDAgJiYgY2Jsay0+cG9pbnRlcigpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBjYmxrLmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWZmZXJzID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIGlmIChidWZmZXJzICE9IDAgJiYgYnVmZmVycy0+cG9pbnRlcigpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBidWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobFN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIGlmIChyZWNvcmQgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICBBTE9HRSgib3BlblJlY29yZCBzaG91bGQgaGF2ZSByZXR1cm5lZCBhbiBJQXVkaW9SZWNvcmQiKTsKICAgICAgICAgICAgICAgICAgICAgbFN0YXR1cyA9IFVOS05PV05fRVJST1I7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjYmxrID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIm9wZW5SZWNvcmQgc2hvdWxkIGhhdmUgcmV0dXJuZWQgYSBjYmxrIik7CisgICAgICAgICAgICAgICAgICAgIGxTdGF0dXMgPSBOT19NRU1PUlk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGJ1ZmZlcnMgaXMgcGVybWl0dGVkIHRvIGJlIDAKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlY29yZCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJvcGVuUmVjb3JkIHJldHVybmVkIGFuIElBdWRpb1JlY29yZCBidXQgd2l0aCBzdGF0dXMgJWQiLCBsU3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgaWYgKHJlY29yZCAhPSAwIHx8IGNibGsgIT0gMCB8fCBidWZmZXJzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIm9wZW5SZWNvcmQgcmV0dXJuZWQgYW4gSUF1ZGlvUmVjb3JkLCBjYmxrLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJvciBidWZmZXJzIGJ1dCB3aXRoIHN0YXR1cyAlZCIsIGxTdGF0dXMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVjb3JkLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgY2Jsay5jbGVhcigpOworICAgICAgICAgICAgICAgIGJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTlVMTCkgewogICAgICAgICAgICAgKnN0YXR1cyA9IGxTdGF0dXM7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlY29yZDsKQEAgLTIyOCw3ICsyODQsNyBAQAogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBvdXRwdXQpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoRlJBTUVfQ09VTlQsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQ2NCgpOwogICAgIH0KIAogICAgIHZpcnR1YWwgdWludDMyX3QgbGF0ZW5jeShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGNvbnN0CkBAIC0zNzgsNTMgKzQzNCw0MyBAQAogICAgICAgICBkYXRhLndyaXRlSW50MzIoZm9ybWF0KTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGNoYW5uZWxNYXNrKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9JTlBVVEJVRkZFUlNJWkUsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQ2NCgpOwogICAgIH0KIAotICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3Qgb3Blbk91dHB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKnBEZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnBGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICpwQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwTGF0ZW5jeU1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3Blbk91dHB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpsYXRlbmN5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKQogICAgIHsKKyAgICAgICAgaWYgKG91dHB1dCA9PSBOVUxMIHx8IGNvbmZpZyA9PSBOVUxMIHx8IGRldmljZXMgPT0gTlVMTCB8fCBsYXRlbmN5TXMgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gcERldmljZXMgIT0gTlVMTCA/ICpwRGV2aWNlcyA6IChhdWRpb19kZXZpY2VzX3QpMDsKLSAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gcFNhbXBsaW5nUmF0ZSAhPSBOVUxMID8gKnBTYW1wbGluZ1JhdGUgOiAwOwotICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBwRm9ybWF0ICE9IE5VTEwgPyAqcEZvcm1hdCA6IEFVRElPX0ZPUk1BVF9ERUZBVUxUOwotICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IHBDaGFubmVsTWFzayAhPSBOVUxMID8KLSAgICAgICAgICAgICAgICAqcENoYW5uZWxNYXNrIDogKGF1ZGlvX2NoYW5uZWxfbWFza190KTA7Ci0gICAgICAgIHVpbnQzMl90IGxhdGVuY3kgPSBwTGF0ZW5jeU1zICE9IE5VTEwgPyAqcExhdGVuY3lNcyA6IDA7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIobW9kdWxlKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGRldmljZXMpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc2FtcGxpbmdSYXRlKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGZvcm1hdCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihjaGFubmVsTWFzayk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihsYXRlbmN5KTsKKyAgICAgICAgZGF0YS53cml0ZShjb25maWcsIHNpemVvZihhdWRpb19jb25maWdfdCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKmRldmljZXMpOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nOChhZGRyZXNzKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBmbGFncyk7Ci0gICAgICAgIGlmIChvZmZsb2FkSW5mbyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoMSk7Ci0gICAgICAgICAgICBkYXRhLndyaXRlKG9mZmxvYWRJbmZvLCBzaXplb2YoYXVkaW9fb2ZmbG9hZF9pbmZvX3QpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KE9QRU5fT1VUUFVULCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAqb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICB9Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChPUEVOX09VVFBVVCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gKGF1ZGlvX2lvX2hhbmRsZV90KSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgQUxPR1YoIm9wZW5PdXRwdXQoKSByZXR1cm5lZCBvdXRwdXQsICVkIiwgb3V0cHV0KTsKLSAgICAgICAgZGV2aWNlcyA9IChhdWRpb19kZXZpY2VzX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGlmIChwRGV2aWNlcyAhPSBOVUxMKSAqcERldmljZXMgPSBkZXZpY2VzOwotICAgICAgICBzYW1wbGluZ1JhdGUgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgaWYgKHBTYW1wbGluZ1JhdGUgIT0gTlVMTCkgKnBTYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGU7Ci0gICAgICAgIGZvcm1hdCA9IChhdWRpb19mb3JtYXRfdCkgcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGlmIChwRm9ybWF0ICE9IE5VTEwpICpwRm9ybWF0ID0gZm9ybWF0OwotICAgICAgICBjaGFubmVsTWFzayA9IChhdWRpb19jaGFubmVsX21hc2tfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgaWYgKHBDaGFubmVsTWFzayAhPSBOVUxMKSAqcENoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2s7Ci0gICAgICAgIGxhdGVuY3kgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgaWYgKHBMYXRlbmN5TXMgIT0gTlVMTCkgKnBMYXRlbmN5TXMgPSBsYXRlbmN5OwotICAgICAgICByZXR1cm4gb3V0cHV0OworICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICpvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgKm91dHB1dCA9IChhdWRpb19pb19oYW5kbGVfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgQUxPR1YoIm9wZW5PdXRwdXQoKSByZXR1cm5lZCBvdXRwdXQsICVkIiwgKm91dHB1dCk7CisgICAgICAgIHJlcGx5LnJlYWQoY29uZmlnLCBzaXplb2YoYXVkaW9fY29uZmlnX3QpKTsKKyAgICAgICAgKmRldmljZXMgPSAoYXVkaW9fZGV2aWNlc190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAqbGF0ZW5jeU1zID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAKICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IG9wZW5EdXBsaWNhdGVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MSwKQEAgLTQ2NSwzNiArNTExLDQwIEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IG9wZW5JbnB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqcERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnBGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKnBDaGFubmVsTWFzaykKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5JbnB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpCiAgICAgeworICAgICAgICBpZiAoaW5wdXQgPT0gTlVMTCB8fCBjb25maWcgPT0gTlVMTCB8fCBkZXZpY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gcERldmljZXMgIT0gTlVMTCA/ICpwRGV2aWNlcyA6IChhdWRpb19kZXZpY2VzX3QpMDsKLSAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gcFNhbXBsaW5nUmF0ZSAhPSBOVUxMID8gKnBTYW1wbGluZ1JhdGUgOiAwOwotICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBwRm9ybWF0ICE9IE5VTEwgPyAqcEZvcm1hdCA6IEFVRElPX0ZPUk1BVF9ERUZBVUxUOwotICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IHBDaGFubmVsTWFzayAhPSBOVUxMID8KLSAgICAgICAgICAgICAgICAqcENoYW5uZWxNYXNrIDogKGF1ZGlvX2NoYW5uZWxfbWFza190KTA7Ci0KICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihtb2R1bGUpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoZGV2aWNlcyk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzYW1wbGluZ1JhdGUpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoZm9ybWF0KTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGNoYW5uZWxNYXNrKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KE9QRU5fSU5QVVQsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gKGF1ZGlvX2lvX2hhbmRsZV90KSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgZGV2aWNlcyA9IChhdWRpb19kZXZpY2VzX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGlmIChwRGV2aWNlcyAhPSBOVUxMKSAqcERldmljZXMgPSBkZXZpY2VzOwotICAgICAgICBzYW1wbGluZ1JhdGUgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgaWYgKHBTYW1wbGluZ1JhdGUgIT0gTlVMTCkgKnBTYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGU7Ci0gICAgICAgIGZvcm1hdCA9IChhdWRpb19mb3JtYXRfdCkgcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGlmIChwRm9ybWF0ICE9IE5VTEwpICpwRm9ybWF0ID0gZm9ybWF0OwotICAgICAgICBjaGFubmVsTWFzayA9IChhdWRpb19jaGFubmVsX21hc2tfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgaWYgKHBDaGFubmVsTWFzayAhPSBOVUxMKSAqcENoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2s7Ci0gICAgICAgIHJldHVybiBpbnB1dDsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKCppbnB1dCk7CisgICAgICAgIGRhdGEud3JpdGUoY29uZmlnLCBzaXplb2YoYXVkaW9fY29uZmlnX3QpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKCpkZXZpY2UpOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nOChhZGRyZXNzKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHNvdXJjZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihmbGFncyk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChPUEVOX0lOUFVULCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAqaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAqaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgKmlucHV0ID0gKGF1ZGlvX2lvX2hhbmRsZV90KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICByZXBseS5yZWFkKGNvbmZpZywgc2l6ZW9mKGF1ZGlvX2NvbmZpZ190KSk7CisgICAgICAgICpkZXZpY2UgPSAoYXVkaW9fZGV2aWNlc190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZUlucHV0KGludCBpbnB1dCkKQEAgLTUwNiwxMyArNTU2LDEyIEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbU91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQorICAgIHZpcnR1YWwgc3RhdHVzX3QgaW52YWxpZGF0ZVN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgc3RyZWFtKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBvdXRwdXQpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1NUUkVBTV9PVVRQVVQsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChJTlZBTElEQVRFX1NUUkVBTSwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIApAQCAtNTI1LDcgKzU3NCw3IEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJlbmRlclBvc2l0aW9uKHNpemVfdCAqaGFsRnJhbWVzLCBzaXplX3QgKmRzcEZyYW1lcywKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpoYWxGcmFtZXMsIHVpbnQzMl90ICpkc3BGcmFtZXMsCiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGNvbnN0CiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CkBAIC01MzUsNTEgKzU4NCw1NiBAQAogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgdWludDMyX3QgdG1wID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpZiAoaGFsRnJhbWVzKSB7CisgICAgICAgICAgICBpZiAoaGFsRnJhbWVzICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAqaGFsRnJhbWVzID0gdG1wOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgdG1wID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpZiAoZHNwRnJhbWVzKSB7CisgICAgICAgICAgICBpZiAoZHNwRnJhbWVzICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAqZHNwRnJhbWVzID0gdG1wOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCi0gICAgdmlydHVhbCBzaXplX3QgZ2V0SW5wdXRGcmFtZXNMb3N0KGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKSBjb25zdAorICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0SW5wdXRGcmFtZXNMb3N0KGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKSBjb25zdAogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBpb0hhbmRsZSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfSU5QVVRfRlJBTUVTX0xPU1QsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9JTlBVVF9GUkFNRVNfTE9TVCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICh1aW50MzJfdCkgcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCi0gICAgdmlydHVhbCBpbnQgbmV3QXVkaW9TZXNzaW9uSWQoKQorICAgIHZpcnR1YWwgYXVkaW9fdW5pcXVlX2lkX3QgbmV3QXVkaW9VbmlxdWVJZCgpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoTkVXX0FVRElPX1NFU1NJT05fSUQsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGludCBpZCA9IDA7CisgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90IGlkID0gQVVESU9fU0VTU0lPTl9BTExPQ0FURTsKICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgaWQgPSByZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gaWQ7CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lkIGFjcXVpcmVBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uKQorICAgIHZpcnR1YWwgdm9pZCBhY3F1aXJlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbiwgaW50IHBpZCkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihhdWRpb1Nlc3Npb24pOworICAgICAgICBkYXRhLndyaXRlSW50MzIocGlkKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEFDUVVJUkVfQVVESU9fU0VTU0lPTl9JRCwgZGF0YSwgJnJlcGx5KTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUF1ZGlvU2Vzc2lvbklkKGludCBhdWRpb1Nlc3Npb24pCisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uLCBpbnQgcGlkKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGF1ZGlvU2Vzc2lvbik7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihwaWQpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVMRUFTRV9BVURJT19TRVNTSU9OX0lELCBkYXRhLCAmcmVwbHkpOwogICAgIH0KIApAQCAtNjU3LDcgKzcxMSw3IEBACiAKICAgICAgICAgaWYgKHBEZXNjID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBlZmZlY3Q7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAqc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC02NzUsNyArNzI5LDcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGxTdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGludCB0bXAgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlmIChpZCkgeworICAgICAgICAgICAgaWYgKGlkICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAqaWQgPSB0bXA7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB0bXAgPSByZXBseS5yZWFkSW50MzIoKTsKQEAgLTY4NSw3ICs3MzksNyBAQAogICAgICAgICAgICAgZWZmZWN0ID0gaW50ZXJmYWNlX2Nhc3Q8SUVmZmVjdD4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKICAgICAgICAgICAgIHJlcGx5LnJlYWQocERlc2MsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHN0YXR1cykgeworICAgICAgICBpZiAoc3RhdHVzICE9IE5VTEwpIHsKICAgICAgICAgICAgICpzdGF0dXMgPSBsU3RhdHVzOwogICAgICAgICB9CiAKQEAgLTcyNiw3ICs3ODAsNyBAQAogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1BSSU1BUllfT1VUUFVUX0ZSQU1FX0NPVU5ULCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50NjQoKTsKICAgICB9CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldExvd1JhbURldmljZShib29sIGlzTG93UmFtRGV2aWNlKQpAQCAtNzM3LDcgKzc5MSwxMTIgQEAKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9MT1dfUkFNX0RFVklDRSwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KLQorICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHModW5zaWduZWQgaW50ICpudW1fcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMpCisgICAgeworICAgICAgICBpZiAobnVtX3BvcnRzID09IE5VTEwgfHwgKm51bV9wb3J0cyA9PSAwIHx8IHBvcnRzID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKCpudW1fcG9ydHMpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoTElTVF9BVURJT19QT1JUUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fAorICAgICAgICAgICAgICAgIChzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgICpudW1fcG9ydHMgPSAodW5zaWduZWQgaW50KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICByZXBseS5yZWFkKHBvcnRzLCAqbnVtX3BvcnRzICogc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0KSk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KQorICAgIHsKKyAgICAgICAgaWYgKHBvcnQgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKHBvcnQsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0FVRElPX1BPUlQsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwKKyAgICAgICAgICAgICAgICAoc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXBseS5yZWFkKHBvcnQsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydCkpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpCisgICAgeworICAgICAgICBpZiAocGF0Y2ggPT0gTlVMTCB8fCBoYW5kbGUgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKHBhdGNoLCBzaXplb2Yoc3RydWN0IGF1ZGlvX3BhdGNoKSk7CisgICAgICAgIGRhdGEud3JpdGUoaGFuZGxlLCBzaXplb2YoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KENSRUFURV9BVURJT19QQVRDSCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fAorICAgICAgICAgICAgICAgIChzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJlcGx5LnJlYWQoaGFuZGxlLCBzaXplb2YoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKCZoYW5kbGUsIHNpemVvZihhdWRpb19wYXRjaF9oYW5kbGVfdCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoUkVMRUFTRV9BVURJT19QQVRDSCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMpCisgICAgeworICAgICAgICBpZiAobnVtX3BhdGNoZXMgPT0gTlVMTCB8fCAqbnVtX3BhdGNoZXMgPT0gMCB8fCBwYXRjaGVzID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKCpudW1fcGF0Y2hlcyk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChMSVNUX0FVRElPX1BBVENIRVMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwKKyAgICAgICAgICAgICAgICAoc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICAqbnVtX3BhdGNoZXMgPSAodW5zaWduZWQgaW50KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICByZXBseS5yZWFkKHBhdGNoZXMsICpudW1fcGF0Y2hlcyAqIHNpemVvZihzdHJ1Y3QgYXVkaW9fcGF0Y2gpKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCisgICAgeworICAgICAgICBpZiAoY29uZmlnID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZShjb25maWcsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9BVURJT19QT1JUX0NPTkZJRywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHZpcnR1YWwgYXVkaW9faHdfc3luY190IGdldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHNlc3Npb25JZCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfQVVESU9fSFdfU1lOQywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIEFVRElPX0hXX1NZTkNfSU5WQUxJRDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGF1ZGlvX2h3X3N5bmNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CiB9OwogCiBJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoQXVkaW9GbGluZ2VyLCAiYW5kcm9pZC5tZWRpYS5JQXVkaW9GbGluZ2VyIik7CkBAIC03NTQsNyArOTEzLDcgQEAKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gKGF1ZGlvX2Zvcm1hdF90KSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSBkYXRhLnJlYWRJbnQ2NCgpOwogICAgICAgICAgICAgdHJhY2tfZmxhZ3NfdCBmbGFncyA9ICh0cmFja19mbGFnc190KSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYm9vbCBoYXZlU2hhcmVkQnVmZmVyID0gZGF0YS5yZWFkSW50MzIoKSAhPSAwOwogICAgICAgICAgICAgc3A8SU1lbW9yeT4gYnVmZmVyOwpAQCAtNzY1LDcgKzkyNCw2IEBACiAgICAgICAgICAgICBwaWRfdCB0aWQgPSAocGlkX3QpIGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGludCBjbGllbnRVaWQgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgU3RyaW5nOCBuYW1lOwogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CiAgICAgICAgICAgICBzcDxJQXVkaW9UcmFjaz4gdHJhY2s7CiAgICAgICAgICAgICBpZiAoKGhhdmVTaGFyZWRCdWZmZXIgJiYgKGJ1ZmZlciA9PSAwKSkgfHwKQEAgLTc3NSwxMiArOTMzLDEzIEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHRyYWNrID0gY3JlYXRlVHJhY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fc3RyZWFtX3R5cGVfdCkgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsICZmbGFncywgYnVmZmVyLCBvdXRwdXQsIHRpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZzZXNzaW9uSWQsIG5hbWUsIGNsaWVudFVpZCwgJnN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgJmZyYW1lQ291bnQsICZmbGFncywgYnVmZmVyLCBvdXRwdXQsIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZzZXNzaW9uSWQsIGNsaWVudFVpZCwgJnN0YXR1cyk7CisgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigodHJhY2sgIT0gMCkgIT0gKHN0YXR1cyA9PSBOT19FUlJPUikpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwbHktPndyaXRlSW50NjQoZnJhbWVDb3VudCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihmbGFncyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXNzaW9uSWQpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlU3RyaW5nOChuYW1lKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIodHJhY2stPmFzQmluZGVyKCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtNzkxLDE4ICs5NTAsMjcgQEAKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gKGF1ZGlvX2Zvcm1hdF90KSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSBkYXRhLnJlYWRJbnQ2NCgpOwogICAgICAgICAgICAgdHJhY2tfZmxhZ3NfdCBmbGFncyA9ICh0cmFja19mbGFnc190KSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgcGlkX3QgdGlkID0gKHBpZF90KSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgaW50IHNlc3Npb25JZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBzaXplX3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gZGF0YS5yZWFkSW50NjQoKTsKKyAgICAgICAgICAgIHNwPElNZW1vcnk+IGNibGs7CisgICAgICAgICAgICBzcDxJTWVtb3J5PiBidWZmZXJzOwogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CiAgICAgICAgICAgICBzcDxJQXVkaW9SZWNvcmQ+IHJlY29yZCA9IG9wZW5SZWNvcmQoaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsICZmbGFncywgdGlkLCAmc2Vzc2lvbklkLCAmc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgJmZyYW1lQ291bnQsICZmbGFncywgdGlkLCAmc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAmbm90aWZpY2F0aW9uRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICBjYmxrLCBidWZmZXJzLCAmc3RhdHVzKTsKICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKHJlY29yZCAhPSAwKSAhPSAoc3RhdHVzID09IE5PX0VSUk9SKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQ2NChmcmFtZUNvdW50KTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGZsYWdzKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNlc3Npb25JZCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQ2NChub3RpZmljYXRpb25GcmFtZXMpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihyZWNvcmQtPmFzQmluZGVyKCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKGNibGstPmFzQmluZGVyKCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKGJ1ZmZlcnMtPmFzQmluZGVyKCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFNBTVBMRV9SQVRFOiB7CkBAIC04MTcsNyArOTg1LDcgQEAKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBGUkFNRV9DT1VOVDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKCBmcmFtZUNvdW50KChhdWRpb19pb19oYW5kbGVfdCkgZGF0YS5yZWFkSW50MzIoKSkgKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDY0KCBmcmFtZUNvdW50KChhdWRpb19pb19oYW5kbGVfdCkgZGF0YS5yZWFkSW50MzIoKSkgKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBMQVRFTkNZOiB7CkBAIC05MTYsMzggKzEwODQsMzEgQEAKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gKGF1ZGlvX2Zvcm1hdF90KSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoIGdldElucHV0QnVmZmVyU2l6ZShzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrKSApOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50NjQoIGdldElucHV0QnVmZmVyU2l6ZShzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrKSApOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIE9QRU5fT1VUUFVUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSA9IChhdWRpb19tb2R1bGVfaGFuZGxlX3QpZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gKGF1ZGlvX2RldmljZXNfdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IChhdWRpb19mb3JtYXRfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gKGF1ZGlvX2NoYW5uZWxfbWFza190KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICB1aW50MzJfdCBsYXRlbmN5ID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYm9vbCBoYXNPZmZsb2FkSW5mbyA9IGRhdGEucmVhZEludDMyKCkgIT0gMDsKLSAgICAgICAgICAgIGF1ZGlvX29mZmxvYWRfaW5mb190IG9mZmxvYWRJbmZvOwotICAgICAgICAgICAgaWYgKGhhc09mZmxvYWRJbmZvKSB7Ci0gICAgICAgICAgICAgICAgZGF0YS5yZWFkKCZvZmZsb2FkSW5mbywgc2l6ZW9mKGF1ZGlvX29mZmxvYWRfaW5mb190KSk7CisgICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSB7fTsKKyAgICAgICAgICAgIGlmIChkYXRhLnJlYWQoJmNvbmZpZywgc2l6ZW9mKGF1ZGlvX2NvbmZpZ190KSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYi8yMzkwNTk1MSIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gb3Blbk91dHB1dChtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNPZmZsb2FkSW5mbyA/ICZvZmZsb2FkSW5mbyA6IE5VTEwpOwotICAgICAgICAgICAgQUxPR1YoIk9QRU5fT1VUUFVUIG91dHB1dCwgJXAiLCBvdXRwdXQpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoKGludDMyX3QpIG91dHB1dCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihkZXZpY2VzKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNhbXBsaW5nUmF0ZSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihmb3JtYXQpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoY2hhbm5lbE1hc2spOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobGF0ZW5jeSk7CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyA9IChhdWRpb19kZXZpY2VzX3QpZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyhkYXRhLnJlYWRTdHJpbmc4KCkpOworICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpIGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICB1aW50MzJfdCBsYXRlbmN5TXMgPSAwOworICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBvcGVuT3V0cHV0KG1vZHVsZSwgJm91dHB1dCwgJmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZXMsIGFkZHJlc3MsICZsYXRlbmN5TXMsIGZsYWdzKTsKKyAgICAgICAgICAgIEFMT0dWKCJPUEVOX09VVFBVVCBvdXRwdXQsICVkIiwgb3V0cHV0KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KXN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoKGludDMyX3Qpb3V0cHV0KTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoJmNvbmZpZywgc2l6ZW9mKGF1ZGlvX2NvbmZpZ190KSk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZGV2aWNlcyk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobGF0ZW5jeU1zKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBPUEVOX0RVUExJQ0FURV9PVVRQVVQ6IHsKQEAgLTk3NSwyMSArMTEzNiwyNCBAQAogICAgICAgICBjYXNlIE9QRU5fSU5QVVQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlID0gKGF1ZGlvX21vZHVsZV9oYW5kbGVfdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMgPSAoYXVkaW9fZGV2aWNlc190KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gKGF1ZGlvX2Zvcm1hdF90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gKGF1ZGlvX2lvX2hhbmRsZV90KWRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSB7fTsKKyAgICAgICAgICAgIGlmIChkYXRhLnJlYWQoJmNvbmZpZywgc2l6ZW9mKGF1ZGlvX2NvbmZpZ190KSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYi8yMzkwNTk1MSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IChhdWRpb19kZXZpY2VzX3QpZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyhkYXRhLnJlYWRTdHJpbmc4KCkpOworICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlID0gKGF1ZGlvX3NvdXJjZV90KWRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpIGRhdGEucmVhZEludDMyKCk7CiAKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gb3BlbklucHV0KG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhbm5lbE1hc2spOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoKGludDMyX3QpIGlucHV0KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGRldmljZXMpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2FtcGxpbmdSYXRlKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGZvcm1hdCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihjaGFubmVsTWFzayk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBvcGVuSW5wdXQobW9kdWxlLCAmaW5wdXQsICZjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZSwgYWRkcmVzcywgc291cmNlLCBmbGFncyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigoaW50MzJfdCkgc3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigoaW50MzJfdCkgaW5wdXQpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZSgmY29uZmlnLCBzaXplb2YoYXVkaW9fY29uZmlnX3QpKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihkZXZpY2UpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIENMT1NFX0lOUFVUOiB7CkBAIC05OTcsMTEgKzExNjEsMTAgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGNsb3NlSW5wdXQoKGF1ZGlvX2lvX2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgU0VUX1NUUkVBTV9PVVRQVVQ6IHsKKyAgICAgICAgY2FzZSBJTlZBTElEQVRFX1NUUkVBTTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSAoYXVkaW9faW9faGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRTdHJlYW1PdXRwdXQoKGF1ZGlvX3N0cmVhbV90eXBlX3QpIHN0cmVhbSwgb3V0cHV0KSk7CisgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IChhdWRpb19zdHJlYW1fdHlwZV90KSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaW52YWxpZGF0ZVN0cmVhbShzdHJlYW0pKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBTRVRfVk9JQ0VfVk9MVU1FOiB7CkBAIC0xMDEzLDggKzExNzYsOCBAQAogICAgICAgICBjYXNlIEdFVF9SRU5ERVJfUE9TSVRJT046IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSAoYXVkaW9faW9faGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBzaXplX3QgaGFsRnJhbWVzID0gMDsKLSAgICAgICAgICAgIHNpemVfdCBkc3BGcmFtZXMgPSAwOworICAgICAgICAgICAgdWludDMyX3QgaGFsRnJhbWVzID0gMDsKKyAgICAgICAgICAgIHVpbnQzMl90IGRzcEZyYW1lcyA9IDA7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRSZW5kZXJQb3NpdGlvbigmaGFsRnJhbWVzLCAmZHNwRnJhbWVzLCBvdXRwdXQpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKQEAgLTEwMjYsMjQgKzExODksMjYgQEAKICAgICAgICAgY2FzZSBHRVRfSU5QVVRfRlJBTUVTX0xPU1Q6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSA9IChhdWRpb19pb19oYW5kbGVfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGdldElucHV0RnJhbWVzTG9zdChpb0hhbmRsZSkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoKGludDMyX3QpIGdldElucHV0RnJhbWVzTG9zdChpb0hhbmRsZSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIE5FV19BVURJT19TRVNTSU9OX0lEOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobmV3QXVkaW9TZXNzaW9uSWQoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihuZXdBdWRpb1VuaXF1ZUlkKCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIEFDUVVJUkVfQVVESU9fU0VTU0lPTl9JRDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb24gPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYWNxdWlyZUF1ZGlvU2Vzc2lvbklkKGF1ZGlvU2Vzc2lvbik7CisgICAgICAgICAgICBpbnQgcGlkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGFjcXVpcmVBdWRpb1Nlc3Npb25JZChhdWRpb1Nlc3Npb24sIHBpZCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgUkVMRUFTRV9BVURJT19TRVNTSU9OX0lEOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgaW50IGF1ZGlvU2Vzc2lvbiA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICByZWxlYXNlQXVkaW9TZXNzaW9uSWQoYXVkaW9TZXNzaW9uKTsKKyAgICAgICAgICAgIGludCBwaWQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgcmVsZWFzZUF1ZGlvU2Vzc2lvbklkKGF1ZGlvU2Vzc2lvbiwgcGlkKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBRVUVSWV9OVU1fRUZGRUNUUzogewpAQCAtMTEyMSw3ICsxMjg2LDcgQEAKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBHRVRfUFJJTUFSWV9PVVRQVVRfRlJBTUVfQ09VTlQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihnZXRQcmltYXJ5T3V0cHV0RnJhbWVDb3VudCgpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDY0KGdldFByaW1hcnlPdXRwdXRGcmFtZUNvdW50KCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFNFVF9MT1dfUkFNX0RFVklDRTogewpAQCAtMTEzMCw2ICsxMjk1LDEwOSBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0TG93UmFtRGV2aWNlKGlzTG93UmFtRGV2aWNlKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgTElTVF9BVURJT19QT1JUUzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1Qb3J0c1JlcSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBpZiAobnVtUG9ydHNSZXEgPiBNQVhfSVRFTVNfUEVSX0xJU1QpIHsKKyAgICAgICAgICAgICAgICBudW1Qb3J0c1JlcSA9IE1BWF9JVEVNU19QRVJfTElTVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1Qb3J0cyA9IG51bVBvcnRzUmVxOworICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnRzID0KKyAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBhdWRpb19wb3J0ICopY2FsbG9jKG51bVBvcnRzUmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGF1ZGlvX3BvcnQpKTsKKyAgICAgICAgICAgIGlmIChwb3J0cyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoTk9fTUVNT1JZKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigwKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBsaXN0QXVkaW9Qb3J0cygmbnVtUG9ydHMsIHBvcnRzKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihudW1Qb3J0cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgaWYgKG51bVBvcnRzUmVxID4gbnVtUG9ydHMpIHsKKyAgICAgICAgICAgICAgICAgICAgbnVtUG9ydHNSZXEgPSBudW1Qb3J0czsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKHBvcnRzLCBudW1Qb3J0c1JlcSAqIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJlZShwb3J0cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgR0VUX0FVRElPX1BPUlQ6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCBwb3J0ID0ge307CisgICAgICAgICAgICBpZiAoZGF0YS5yZWFkKCZwb3J0LCBzaXplb2Yoc3RydWN0IGF1ZGlvX3BvcnQpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJiLzIzOTA1OTUxIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRBdWRpb1BvcnQoJnBvcnQpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoJnBvcnQsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIENSRUFURV9BVURJT19QQVRDSDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDsKKyAgICAgICAgICAgIGRhdGEucmVhZCgmcGF0Y2gsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcGF0Y2gpKTsKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSA9IHt9OworICAgICAgICAgICAgaWYgKGRhdGEucmVhZCgmaGFuZGxlLCBzaXplb2YoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJiLzIzOTA1OTUxIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBjcmVhdGVBdWRpb1BhdGNoKCZwYXRjaCwgJmhhbmRsZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZSgmaGFuZGxlLCBzaXplb2YoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBSRUxFQVNFX0FVRElPX1BBVENIOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlOworICAgICAgICAgICAgZGF0YS5yZWFkKCZoYW5kbGUsIHNpemVvZihhdWRpb19wYXRjaF9oYW5kbGVfdCkpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVsZWFzZUF1ZGlvUGF0Y2goaGFuZGxlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgTElTVF9BVURJT19QQVRDSEVTOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bVBhdGNoZXNSZXEgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgaWYgKG51bVBhdGNoZXNSZXEgPiBNQVhfSVRFTVNfUEVSX0xJU1QpIHsKKyAgICAgICAgICAgICAgICBudW1QYXRjaGVzUmVxID0gTUFYX0lURU1TX1BFUl9MSVNUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bVBhdGNoZXMgPSBudW1QYXRjaGVzUmVxOworICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzID0KKyAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBhdWRpb19wYXRjaCAqKWNhbGxvYyhudW1QYXRjaGVzUmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgYXVkaW9fcGF0Y2gpKTsKKyAgICAgICAgICAgIGlmIChwYXRjaGVzID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihOT19NRU1PUlkpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDApOworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGxpc3RBdWRpb1BhdGNoZXMoJm51bVBhdGNoZXMsIHBhdGNoZXMpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG51bVBhdGNoZXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGlmIChudW1QYXRjaGVzUmVxID4gbnVtUGF0Y2hlcykgeworICAgICAgICAgICAgICAgICAgICBudW1QYXRjaGVzUmVxID0gbnVtUGF0Y2hlczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKHBhdGNoZXMsIG51bVBhdGNoZXNSZXEgKiBzaXplb2Yoc3RydWN0IGF1ZGlvX3BhdGNoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmVlKHBhdGNoZXMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIFNFVF9BVURJT19QT1JUX0NPTkZJRzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBjb25maWc7CisgICAgICAgICAgICBkYXRhLnJlYWQoJmNvbmZpZywgc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZykpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2V0QXVkaW9Qb3J0Q29uZmlnKCZjb25maWcpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBHRVRfQVVESU9fSFdfU1lOQzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGdldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbigoYXVkaW9fc2Vzc2lvbl90KWRhdGEucmVhZEludDMyKCkpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvRmxpbmdlckNsaWVudC5jcHAgYi9tZWRpYS9saWJtZWRpYS9JQXVkaW9GbGluZ2VyQ2xpZW50LmNwcAppbmRleCAzYzBkNGNmLi4xYzI5OWY3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9GbGluZ2VyQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JQXVkaW9GbGluZ2VyQ2xpZW50LmNwcApAQCAtNTUsNyArNTUsNyBAQAogICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKGRlc2MtPnNhbXBsaW5nUmF0ZSk7CiAgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoZGVzYy0+Zm9ybWF0KTsKICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihkZXNjLT5jaGFubmVsTWFzayk7Ci0gICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoZGVzYy0+ZnJhbWVDb3VudCk7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50NjQoZGVzYy0+ZnJhbWVDb3VudCk7CiAgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoZGVzYy0+bGF0ZW5jeSk7CiAgICAgICAgIH0KICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KElPX0NPTkZJR19DSEFOR0VELCBkYXRhLCAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKQEAgLTg1LDcgKzg1LDcgQEAKICAgICAgICAgICAgICAgICBkZXNjLnNhbXBsaW5nUmF0ZSA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICAgICAgZGVzYy5mb3JtYXQgPSAoYXVkaW9fZm9ybWF0X3QpIGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICAgICAgZGVzYy5jaGFubmVsTWFzayA9IChhdWRpb19jaGFubmVsX21hc2tfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgICAgICBkZXNjLmZyYW1lQ291bnQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgICAgIGRlc2MuZnJhbWVDb3VudCA9IGRhdGEucmVhZEludDY0KCk7CiAgICAgICAgICAgICAgICAgZGVzYy5sYXRlbmN5ID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgICAgICBwYXJhbTIgPSAmZGVzYzsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAKaW5kZXggMGRhYjdlMy4uZTg0MDk1NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAKQEAgLTU4LDkgKzU4LDIyIEBACiAgICAgUVVFUllfREVGQVVMVF9QUkVfUFJPQ0VTU0lORywKICAgICBTRVRfRUZGRUNUX0VOQUJMRUQsCiAgICAgSVNfU1RSRUFNX0FDVElWRV9SRU1PVEVMWSwKLSAgICBJU19PRkZMT0FEX1NVUFBPUlRFRAorICAgIElTX09GRkxPQURfU1VQUE9SVEVELAorICAgIExJU1RfQVVESU9fUE9SVFMsCisgICAgR0VUX0FVRElPX1BPUlQsCisgICAgQ1JFQVRFX0FVRElPX1BBVENILAorICAgIFJFTEVBU0VfQVVESU9fUEFUQ0gsCisgICAgTElTVF9BVURJT19QQVRDSEVTLAorICAgIFNFVF9BVURJT19QT1JUX0NPTkZJRywKKyAgICBSRUdJU1RFUl9DTElFTlQsCisgICAgR0VUX09VVFBVVF9GT1JfQVRUUiwKKyAgICBBQ1FVSVJFX1NPVU5EVFJJR0dFUl9TRVNTSU9OLAorICAgIFJFTEVBU0VfU09VTkRUUklHR0VSX1NFU1NJT04sCisgICAgR0VUX1BIT05FX1NUQVRFCiB9OwogCisjZGVmaW5lIE1BWF9JVEVNU19QRVJfTElTVCAxMDI0CisKIGNsYXNzIEJwQXVkaW9Qb2xpY3lTZXJ2aWNlIDogcHVibGljIEJwSW50ZXJmYWNlPElBdWRpb1BvbGljeVNlcnZpY2U+CiB7CiBwdWJsaWM6CkBAIC0xMzgsNiArMTUxLDcgQEAKICAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oZm9ybWF0KSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihjaGFubmVsTWFzayk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KGZsYWdzKSk7CisgICAgICAgIC8vIGhhc09mZmxvYWRJbmZvCiAgICAgICAgIGlmIChvZmZsb2FkSW5mbyA9PSBOVUxMKSB7CiAgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoMCk7CiAgICAgICAgIH0gZWxzZSB7CkBAIC0xNDgsNiArMTYyLDM2IEBACiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8YXVkaW9faW9faGFuZGxlX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQogCisgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXRGb3JBdHRyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykKKyAgICAgICAgeworICAgICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgICAgICBpZiAoYXR0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIldyaXRpbmcgTlVMTCBhdWRpbyBhdHRyaWJ1dGVzIC0gc2hvdWxkbid0IGhhcHBlbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAoYXVkaW9faW9faGFuZGxlX3QpIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkYXRhLndyaXRlKGF0dHIsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzYW1wbGluZ1JhdGUpOworICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oZm9ybWF0KSk7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoY2hhbm5lbE1hc2spOworICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oZmxhZ3MpKTsKKyAgICAgICAgICAgIC8vIGhhc09mZmxvYWRJbmZvCisgICAgICAgICAgICBpZiAob2ZmbG9hZEluZm8gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDEpOworICAgICAgICAgICAgICAgIGRhdGEud3JpdGUob2ZmbG9hZEluZm8sIHNpemVvZihhdWRpb19vZmZsb2FkX2luZm9fdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9PVVRQVVRfRk9SX0FUVFIsIGRhdGEsICZyZXBseSk7CisgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPGF1ZGlvX2lvX2hhbmRsZV90PiAocmVwbHkucmVhZEludDMyKCkpOworICAgICAgICB9CisKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCkBAIC0xODcsNyArMjMxLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvU2Vzc2lvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKQEAgLTE5NiwzMyArMjQxLDQwIEBACiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KGZvcm1hdCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoY2hhbm5lbE1hc2spOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoYXVkaW9TZXNzaW9uKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGZsYWdzKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9JTlBVVCwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxhdWRpb19pb19oYW5kbGVfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihpbnB1dCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihzZXNzaW9uKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNUQVJUX0lOUFVULCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGlucHV0KTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHNlc3Npb24pOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU1RPUF9JTlBVVCwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQorICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihpbnB1dCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihzZXNzaW9uKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFJFTEVBU0VfSU5QVVQsIGRhdGEsICZyZXBseSk7CiAgICAgfQogCkBAIC0zOTAsNyArNDQyLDE4NiBAQAogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZSgmaW5mbywgc2l6ZW9mKGF1ZGlvX29mZmxvYWRfaW5mb190KSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChJU19PRkZMT0FEX1NVUFBPUlRFRCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOyAgICB9CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BvcnRzKGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpudW1fcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pCisgICAgeworICAgICAgICBpZiAobnVtX3BvcnRzID09IE5VTEwgfHwgKCpudW1fcG9ydHMgIT0gMCAmJiBwb3J0cyA9PSBOVUxMKSB8fAorICAgICAgICAgICAgICAgIGdlbmVyYXRpb24gPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICB1bnNpZ25lZCBpbnQgbnVtUG9ydHNSZXEgPSAocG9ydHMgPT0gTlVMTCkgPyAwIDogKm51bV9wb3J0czsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHJvbGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIodHlwZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihudW1Qb3J0c1JlcSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChMSVNUX0FVRElPX1BPUlRTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgICAgICAqbnVtX3BvcnRzID0gKHVuc2lnbmVkIGludClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBpZiAobnVtUG9ydHNSZXEgPiAqbnVtX3BvcnRzKSB7CisgICAgICAgICAgICAgICAgbnVtUG9ydHNSZXEgPSAqbnVtX3BvcnRzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG51bVBvcnRzUmVxID4gMCkgeworICAgICAgICAgICAgICAgIHJlcGx5LnJlYWQocG9ydHMsIG51bVBvcnRzUmVxICogc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqZ2VuZXJhdGlvbiA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpCisgICAgeworICAgICAgICBpZiAocG9ydCA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGUocG9ydCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0KSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfQVVESU9fUE9SVCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fAorICAgICAgICAgICAgICAgIChzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJlcGx5LnJlYWQocG9ydCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0KSk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKQorICAgIHsKKyAgICAgICAgaWYgKHBhdGNoID09IE5VTEwgfHwgaGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZShwYXRjaCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wYXRjaCkpOworICAgICAgICBkYXRhLndyaXRlKGhhbmRsZSwgc2l6ZW9mKGF1ZGlvX3BhdGNoX2hhbmRsZV90KSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChDUkVBVEVfQVVESU9fUEFUQ0gsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwKKyAgICAgICAgICAgICAgICAoc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXBseS5yZWFkKGhhbmRsZSwgc2l6ZW9mKGF1ZGlvX3BhdGNoX2hhbmRsZV90KSk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKCZoYW5kbGUsIHNpemVvZihhdWRpb19wYXRjaF9oYW5kbGVfdCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoUkVMRUFTRV9BVURJT19QQVRDSCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKQorICAgIHsKKyAgICAgICAgaWYgKG51bV9wYXRjaGVzID09IE5VTEwgfHwgKCpudW1fcGF0Y2hlcyAhPSAwICYmIHBhdGNoZXMgPT0gTlVMTCkgfHwKKyAgICAgICAgICAgICAgICBnZW5lcmF0aW9uID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgdW5zaWduZWQgaW50IG51bVBhdGNoZXNSZXEgPSAocGF0Y2hlcyA9PSBOVUxMKSA/IDAgOiAqbnVtX3BhdGNoZXM7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihudW1QYXRjaGVzUmVxKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KExJU1RfQVVESU9fUEFUQ0hFUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAgICAgKm51bV9wYXRjaGVzID0gKHVuc2lnbmVkIGludClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBpZiAobnVtUGF0Y2hlc1JlcSA+ICpudW1fcGF0Y2hlcykgeworICAgICAgICAgICAgICAgIG51bVBhdGNoZXNSZXEgPSAqbnVtX3BhdGNoZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobnVtUGF0Y2hlc1JlcSA+IDApIHsKKyAgICAgICAgICAgICAgICByZXBseS5yZWFkKHBhdGNoZXMsIG51bVBhdGNoZXNSZXEgKiBzaXplb2Yoc3RydWN0IGF1ZGlvX3BhdGNoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqZ2VuZXJhdGlvbiA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCisgICAgeworICAgICAgICBpZiAoY29uZmlnID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZShjb25maWcsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9BVURJT19QT1JUX0NPTkZJRywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyQ2xpZW50KGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+JiBjbGllbnQpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGNsaWVudC0+YXNCaW5kZXIoKSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRUdJU1RFUl9DTElFTlQsIGRhdGEsICZyZXBseSk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBhY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3QgKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UpCisgICAgeworICAgICAgICBpZiAoc2Vzc2lvbiA9PSBOVUxMIHx8IGlvSGFuZGxlID09IE5VTEwgfHwgZGV2aWNlID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEFDUVVJUkVfU09VTkRUUklHR0VSX1NFU1NJT04sIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAqc2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgICAgICAqaW9IYW5kbGUgPSAoYXVkaW9faW9faGFuZGxlX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgICAgICAqZGV2aWNlID0gKGF1ZGlvX2RldmljZXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoc2Vzc2lvbik7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChSRUxFQVNFX1NPVU5EVFJJR0dFUl9TRVNTSU9OLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCisgICAgdmlydHVhbCBhdWRpb19tb2RlX3QgZ2V0UGhvbmVTdGF0ZSgpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1BIT05FX1NUQVRFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTU9ERV9JTlZBTElEOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoYXVkaW9fbW9kZV90KXJlcGx5LnJlYWRJbnQzMigpOworICAgIH0KIH07CiAKIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShBdWRpb1BvbGljeVNlcnZpY2UsICJhbmRyb2lkLm1lZGlhLklBdWRpb1BvbGljeVNlcnZpY2UiKTsKQEAgLTQ3NCwxMyArNzA1LDM4IEBACiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKKyAgICAgICAgY2FzZSBHRVRfT1VUUFVUX0ZPUl9BVFRSOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190ICphdHRyID0gKGF1ZGlvX2F0dHJpYnV0ZXNfdCAqKSBjYWxsb2MoMSwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICAgICAgZGF0YS5yZWFkKGF0dHIsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSAoYXVkaW9fZm9ybWF0X3QpIGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxhdWRpb19vdXRwdXRfZmxhZ3NfdD4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICBib29sIGhhc09mZmxvYWRJbmZvID0gZGF0YS5yZWFkSW50MzIoKSAhPSAwOworICAgICAgICAgICAgYXVkaW9fb2ZmbG9hZF9pbmZvX3Qgb2ZmbG9hZEluZm87CisgICAgICAgICAgICBpZiAoaGFzT2ZmbG9hZEluZm8pIHsKKyAgICAgICAgICAgICAgICBkYXRhLnJlYWQoJm9mZmxvYWRJbmZvLCBzaXplb2YoYXVkaW9fb2ZmbG9hZF9pbmZvX3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IGdldE91dHB1dEZvckF0dHIoYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgaGFzT2ZmbG9hZEluZm8gPyAmb2ZmbG9hZEluZm8gOiBOVUxMKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDxpbnQ+KG91dHB1dCkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworCiAgICAgICAgIGNhc2UgU1RBUlRfT1VUUFVUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc3RhdGljX2Nhc3QgPGF1ZGlvX2lvX2hhbmRsZV90PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxhdWRpb19zdHJlYW1fdHlwZV90PihkYXRhLnJlYWRJbnQzMigpKTsKICAgICAgICAgICAgIGludCBzZXNzaW9uID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RhcnRPdXRwdXQob3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbikpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKQEAgLTQ4OCwxMCArNzQ0LDExIEBACiAgICAgICAgIGNhc2UgU1RPUF9PVVRQVVQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzdGF0aWNfY2FzdCA8YXVkaW9faW9faGFuZGxlX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgdWludDMyX3Qgc3RyZWFtID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPGF1ZGlvX3N0cmVhbV90eXBlX3Q+KGRhdGEucmVhZEludDMyKCkpOwogICAgICAgICAgICAgaW50IHNlc3Npb24gPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdG9wT3V0cHV0KG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24pKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CkBAIC01MTAsMTEgKzc2NywxMyBAQAogICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gKGF1ZGlvX2Zvcm1hdF90KSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgaW50IGF1ZGlvU2Vzc2lvbiA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpIGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IGdldElucHV0KGlucHV0U291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvU2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPGludD4oaW5wdXQpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKQEAgLTUyMiwyMSArNzgxLDI0IEBACiAgICAgICAgIGNhc2UgU1RBUlRfSU5QVVQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IHN0YXRpY19jYXN0IDxhdWRpb19pb19oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0YXJ0SW5wdXQoaW5wdXQpKSk7CisgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IHN0YXRpY19jYXN0IDxhdWRpb19zZXNzaW9uX3Q+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdGFydElucHV0KGlucHV0LCBzZXNzaW9uKSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgIGNhc2UgU1RPUF9JTlBVVDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gc3RhdGljX2Nhc3QgPGF1ZGlvX2lvX2hhbmRsZV90PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RvcElucHV0KGlucHV0KSkpOworICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSBzdGF0aWNfY2FzdCA8YXVkaW9fc2Vzc2lvbl90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RvcElucHV0KGlucHV0LCBzZXNzaW9uKSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgIGNhc2UgUkVMRUFTRV9JTlBVVDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gc3RhdGljX2Nhc3QgPGF1ZGlvX2lvX2hhbmRsZV90PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIHJlbGVhc2VJbnB1dChpbnB1dCk7CisgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IHN0YXRpY19jYXN0IDxhdWRpb19zZXNzaW9uX3Q+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgcmVsZWFzZUlucHV0KGlucHV0LCBzZXNzaW9uKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKIApAQCAtNjM0LDcgKzg5Niw3IEBACiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSAoYXVkaW9fc3RyZWFtX3R5cGVfdCkgZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zID0gKHVpbnQzMl90KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMiggaXNTdHJlYW1BY3RpdmUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpIHN0cmVhbSwgaW5QYXN0TXMpICk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMiggaXNTdHJlYW1BY3RpdmUoc3RyZWFtLCBpblBhc3RNcykgKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKIApAQCAtNjQyLDcgKzkwNCw3IEBACiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSAoYXVkaW9fc3RyZWFtX3R5cGVfdCkgZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zID0gKHVpbnQzMl90KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMiggaXNTdHJlYW1BY3RpdmVSZW1vdGVseSgoYXVkaW9fc3RyZWFtX3R5cGVfdCkgc3RyZWFtLCBpblBhc3RNcykgKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKCBpc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KHN0cmVhbSwgaW5QYXN0TXMpICk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKQEAgLTY4Nyw2ICs5NDksMTU3IEBACiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIExJU1RfQVVESU9fUE9SVFM6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBhdWRpb19wb3J0X3JvbGVfdCByb2xlID0gKGF1ZGlvX3BvcnRfcm9sZV90KWRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlID0gKGF1ZGlvX3BvcnRfdHlwZV90KWRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtUG9ydHNSZXEgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgaWYgKG51bVBvcnRzUmVxID4gTUFYX0lURU1TX1BFUl9MSVNUKSB7CisgICAgICAgICAgICAgICAgbnVtUG9ydHNSZXEgPSBNQVhfSVRFTVNfUEVSX0xJU1Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtUG9ydHMgPSBudW1Qb3J0c1JlcTsKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cyA9CisgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgYXVkaW9fcG9ydCAqKWNhbGxvYyhudW1Qb3J0c1JlcSwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0KSk7CisgICAgICAgICAgICBpZiAocG9ydHMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKE5PX01FTU9SWSk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdW5zaWduZWQgaW50IGdlbmVyYXRpb247CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBsaXN0QXVkaW9Qb3J0cyhyb2xlLCB0eXBlLCAmbnVtUG9ydHMsIHBvcnRzLCAmZ2VuZXJhdGlvbik7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobnVtUG9ydHMpOworCisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgaWYgKG51bVBvcnRzUmVxID4gbnVtUG9ydHMpIHsKKyAgICAgICAgICAgICAgICAgICAgbnVtUG9ydHNSZXEgPSBudW1Qb3J0czsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKHBvcnRzLCBudW1Qb3J0c1JlcSAqIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydCkpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGdlbmVyYXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJlZShwb3J0cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEdFVF9BVURJT19QT1JUOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgcG9ydCA9IHt9OworICAgICAgICAgICAgaWYgKGRhdGEucmVhZCgmcG9ydCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0KSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYi8yMzkxMjIwMiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0QXVkaW9Qb3J0KCZwb3J0KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKCZwb3J0LCBzaXplb2Yoc3RydWN0IGF1ZGlvX3BvcnQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQ1JFQVRFX0FVRElPX1BBVENIOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoOworICAgICAgICAgICAgZGF0YS5yZWFkKCZwYXRjaCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wYXRjaCkpOworICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlID0ge307CisgICAgICAgICAgICBpZiAoZGF0YS5yZWFkKCZoYW5kbGUsIHNpemVvZihhdWRpb19wYXRjaF9oYW5kbGVfdCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImIvMjM5MTIyMDIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLCAmaGFuZGxlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKCZoYW5kbGUsIHNpemVvZihhdWRpb19wYXRjaF9oYW5kbGVfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBSRUxFQVNFX0FVRElPX1BBVENIOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlOworICAgICAgICAgICAgZGF0YS5yZWFkKCZoYW5kbGUsIHNpemVvZihhdWRpb19wYXRjaF9oYW5kbGVfdCkpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVsZWFzZUF1ZGlvUGF0Y2goaGFuZGxlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIExJU1RfQVVESU9fUEFUQ0hFUzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1QYXRjaGVzUmVxID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGlmIChudW1QYXRjaGVzUmVxID4gTUFYX0lURU1TX1BFUl9MSVNUKSB7CisgICAgICAgICAgICAgICAgbnVtUGF0Y2hlc1JlcSA9IE1BWF9JVEVNU19QRVJfTElTVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1QYXRjaGVzID0gbnVtUGF0Y2hlc1JlcTsKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcyA9CisgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgYXVkaW9fcGF0Y2ggKiljYWxsb2MobnVtUGF0Y2hlc1JlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGF1ZGlvX3BhdGNoKSk7CisgICAgICAgICAgICBpZiAocGF0Y2hlcyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoTk9fTUVNT1JZKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigwKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZ2VuZXJhdGlvbjsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGxpc3RBdWRpb1BhdGNoZXMoJm51bVBhdGNoZXMsIHBhdGNoZXMsICZnZW5lcmF0aW9uKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihudW1QYXRjaGVzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBpZiAobnVtUGF0Y2hlc1JlcSA+IG51bVBhdGNoZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgbnVtUGF0Y2hlc1JlcSA9IG51bVBhdGNoZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZShwYXRjaGVzLCBudW1QYXRjaGVzUmVxICogc2l6ZW9mKHN0cnVjdCBhdWRpb19wYXRjaCkpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGdlbmVyYXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJlZShwYXRjaGVzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU0VUX0FVRElPX1BPUlRfQ09ORklHOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIGNvbmZpZzsKKyAgICAgICAgICAgIGRhdGEucmVhZCgmY29uZmlnLCBzaXplb2Yoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnKSk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXRBdWRpb1BvcnRDb25maWcoJmNvbmZpZyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBSRUdJU1RFUl9DTElFTlQ6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiBjbGllbnQgPSBpbnRlcmZhY2VfY2FzdDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PigKKyAgICAgICAgICAgICAgICAgICAgZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgcmVnaXN0ZXJDbGllbnQoY2xpZW50KTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIEFDUVVJUkVfU09VTkRUUklHR0VSX1NFU1NJT046IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiBjbGllbnQgPSBpbnRlcmZhY2VfY2FzdDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PigKKyAgICAgICAgICAgICAgICAgICAgZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSB7fTsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlID0ge307CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0ge307CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbigmc2Vzc2lvbiwgJmlvSGFuZGxlLCAmZGV2aWNlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaW9IYW5kbGUpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGRldmljZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBSRUxFQVNFX1NPVU5EVFJJR0dFUl9TRVNTSU9OOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3A8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4gY2xpZW50ID0gaW50ZXJmYWNlX2Nhc3Q8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4oCisgICAgICAgICAgICAgICAgICAgIGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uID0gKGF1ZGlvX3Nlc3Npb25fdClkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVsZWFzZVNvdW5kVHJpZ2dlclNlc3Npb24oc2Vzc2lvbik7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGNhc2UgR0VUX1BIT05FX1NUQVRFOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoKGludDMyX3QpZ2V0UGhvbmVTdGF0ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmNwcCBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MDIyNzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmNwcApAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitlbnVtIHsKKyAgICBQT1JUX0xJU1RfVVBEQVRFID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKKyAgICBQQVRDSF9MSVNUX1VQREFURQorfTsKKworY2xhc3MgQnBBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgOiBwdWJsaWMgQnBJbnRlcmZhY2U8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4KK3sKK3B1YmxpYzoKKyAgICBCcEF1ZGlvUG9saWN5U2VydmljZUNsaWVudChjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKKyAgICAgICAgOiBCcEludGVyZmFjZTxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PihpbXBsKQorICAgIHsKKyAgICB9CisKKyAgICB2b2lkIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUE9SVF9MSVNUX1VQREFURSwgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7CisgICAgfQorCisgICAgdm9pZCBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChQQVRDSF9MSVNUX1VQREFURSwgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7CisgICAgfQorfTsKKworSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKEF1ZGlvUG9saWN5U2VydmljZUNsaWVudCwgImFuZHJvaWQubWVkaWEuSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCIpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXR1c190IEJuQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpvblRyYW5zYWN0KAorICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCit7CisgICAgc3dpdGNoIChjb2RlKSB7CisgICAgY2FzZSBQT1JUX0xJU1RfVVBEQVRFOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgb25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgY2FzZSBQQVRDSF9MSVNUX1VQREFURTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOworICAgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUmVjb3JkLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb1JlY29yZC5jcHAKaW5kZXggNGE3ZGU2NS4uOGE0YTM4MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUmVjb3JkLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JQXVkaW9SZWNvcmQuY3BwCkBAIC0yOSw3ICsyOSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGVudW0gewotICAgIEdFVF9DQkxLID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKKyAgICBVTlVTRURfV0FTX0dFVF9DQkxLID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKICAgICBTVEFSVCwKICAgICBTVE9QCiB9OwpAQCAtNDIsMTggKzQyLDYgQEAKICAgICB7CiAgICAgfQogCi0gICAgdmlydHVhbCBzcDxJTWVtb3J5PiBnZXRDYmxrKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgc3A8SU1lbW9yeT4gY2JsazsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1JlY29yZDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9DQkxLLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBjYmxrID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2JsazsKLSAgICB9Ci0KICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KGludCAvKkF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QqLyBldmVudCwgaW50IHRyaWdnZXJTZXNzaW9uKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwpAQCAtODYsMTEgKzc0LDYgQEAKICAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQogewogICAgIHN3aXRjaCAoY29kZSkgewotICAgICAgICBjYXNlIEdFVF9DQkxLOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUmVjb3JkLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoZ2V0Q2JsaygpLT5hc0JpbmRlcigpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBTVEFSVDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1JlY29yZCwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgaW50IC8qQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCovIGV2ZW50ID0gZGF0YS5yZWFkSW50MzIoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb1RyYWNrLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb1RyYWNrLmNwcAppbmRleCAzY2Q5Y2ZkLi4yNjViYjFiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9UcmFjay5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvVHJhY2suY3BwCkBAIC02MCw2ICs2MCw5IEBACiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfQ0JMSywgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgY2JsayA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBpZiAoY2JsayAhPSAwICYmIGNibGstPnBvaW50ZXIoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgY2Jsay5jbGVhcigpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBjYmxrOwogICAgIH0KQEAgLTExNSwxMyArMTE4LDE2IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBhbGxvY2F0ZVRpbWVkQnVmZmVyKHNpemVfdCBzaXplLCBzcDxJTWVtb3J5PiogYnVmZmVyKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1RyYWNrOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc2l6ZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQ2NChzaXplKTsKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEFMTE9DQVRFX1RJTUVEX0JVRkZFUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgICpidWZmZXIgPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgICAgIGlmICgqYnVmZmVyICE9IDAgJiYgKCpidWZmZXIpLT5wb2ludGVyKCkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAoKmJ1ZmZlcikuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTIzMiw3ICsyMzgsNyBAQAogICAgICAgICBjYXNlIEFMTE9DQVRFX1RJTUVEX0JVRkZFUjogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1RyYWNrLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBzcDxJTWVtb3J5PiBidWZmZXI7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhbGxvY2F0ZVRpbWVkQnVmZmVyKGRhdGEucmVhZEludDMyKCksICZidWZmZXIpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYWxsb2NhdGVUaW1lZEJ1ZmZlcihkYXRhLnJlYWRJbnQ2NCgpLCAmYnVmZmVyKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKGJ1ZmZlci0+YXNCaW5kZXIoKSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JQ3J5cHRvLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lDcnlwdG8uY3BwCmluZGV4IDkxOGQ3MjUuLjE4MzI1YzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lDcnlwdG8uY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lDcnlwdG8uY3BwCkBAIC0xMzEsNyArMTMxLDcgQEAKICAgICAgICAgZGF0YS53cml0ZShzdWJTYW1wbGVzLCBzaXplb2YoQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUpICogbnVtU3ViU2FtcGxlcyk7CiAKICAgICAgICAgaWYgKHNlY3VyZSkgewotICAgICAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3QpZHN0UHRyKTsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQ2NChzdGF0aWNfY2FzdDx1aW50NjRfdD4ocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGRzdFB0cikpKTsKICAgICAgICAgfQogCiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChERUNSWVBULCBkYXRhLCAmcmVwbHkpOwpAQCAtMjUwLDcgKzI1MCw3IEBACiAKICAgICAgICAgICAgIHZvaWQgKnNlY3VyZUJ1ZmZlcklkLCAqZHN0UHRyOwogICAgICAgICAgICAgaWYgKHNlY3VyZSkgewotICAgICAgICAgICAgICAgIHNlY3VyZUJ1ZmZlcklkID0gKHZvaWQgKilkYXRhLnJlYWRJbnRQdHIoKTsKKyAgICAgICAgICAgICAgICBzZWN1cmVCdWZmZXJJZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqPihzdGF0aWNfY2FzdDx1aW50cHRyX3Q+KGRhdGEucmVhZEludDY0KCkpKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgZHN0UHRyID0gbWFsbG9jKHRvdGFsU2l6ZSk7CiAgICAgICAgICAgICAgICAgbWVtc2V0KGRzdFB0ciwgMCwgdG90YWxTaXplKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lEcm0uY3BwIGIvbWVkaWEvbGlibWVkaWEvSURybS5jcHAKaW5kZXggZjFhNmE5Zi4uMTkwNDgzOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSURybS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSURybS5jcHAKQEAgLTUzLDcgKzUzLDggQEAKICAgICBTSUdOLAogICAgIFNJR05fUlNBLAogICAgIFZFUklGWSwKLSAgICBTRVRfTElTVEVORVIKKyAgICBTRVRfTElTVEVORVIsCisgICAgVU5QUk9WSVNJT05fREVWSUNFCiB9OwogCiBzdHJ1Y3QgQnBEcm0gOiBwdWJsaWMgQnBJbnRlcmZhY2U8SURybT4gewpAQCAtMjI5LDYgKzIzMCwxNSBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCisgICAgdmlydHVhbCBzdGF0dXNfdCB1bnByb3Zpc2lvbkRldmljZSgpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoVU5QUk9WSVNJT05fREVWSUNFLCBkYXRhLCAmcmVwbHkpOworCisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyZVN0b3BzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+ID4gJnNlY3VyZVN0b3BzKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CkBAIC02MTksNiArNjI5LDE0IEBACiAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIFVOUFJPVklTSU9OX0RFVklDRToKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm0sIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IHVucHJvdmlzaW9uRGV2aWNlKCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBHRVRfU0VDVVJFX1NUT1BTOgogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybSwgZGF0YSwgcmVwbHkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSUVmZmVjdC5jcHAgYi9tZWRpYS9saWJtZWRpYS9JRWZmZWN0LmNwcAppbmRleCAxZTU0Y2E4Li44Y2QxNThkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JRWZmZWN0LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JRWZmZWN0LmNwcApAQCAtMTE5LDYgKzExOSw5IEBACiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfQ0JMSywgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgY2JsayA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBpZiAoY2JsayAhPSAwICYmIGNibGstPnBvaW50ZXIoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgY2Jsay5jbGVhcigpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBjYmxrOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYUNvZGVjTGlzdC5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFDb2RlY0xpc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmN2M1Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFDb2RlY0xpc3QuY3BwCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUNvZGVjTGlzdC5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNJbmZvLmg+CisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4gIC8vIGZvciBzdGF0dXNfdAorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2VudW0geworICAgIENSRUFURSA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCisgICAgQ09VTlRfQ09ERUNTLAorICAgIEdFVF9DT0RFQ19JTkZPLAorICAgIEZJTkRfQ09ERUNfQllfVFlQRSwKKyAgICBGSU5EX0NPREVDX0JZX05BTUUsCit9OworCitjbGFzcyBCcE1lZGlhQ29kZWNMaXN0OiBwdWJsaWMgQnBJbnRlcmZhY2U8SU1lZGlhQ29kZWNMaXN0PgoreworcHVibGljOgorICAgIEJwTWVkaWFDb2RlY0xpc3QoY29uc3Qgc3A8SUJpbmRlcj4mIGltcGwpCisgICAgICAgIDogQnBJbnRlcmZhY2U8SU1lZGlhQ29kZWNMaXN0PihpbXBsKQorICAgIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHNpemVfdCBjb3VudENvZGVjcygpIGNvbnN0CisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFDb2RlY0xpc3Q6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChDT1VOVF9DT0RFQ1MsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzaXplX3Q+KHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHNwPE1lZGlhQ29kZWNJbmZvPiBnZXRDb2RlY0luZm8oc2l6ZV90IGluZGV4KSBjb25zdAorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhQ29kZWNMaXN0OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoaW5kZXgpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0NPREVDX0lORk8sIGRhdGEsICZyZXBseSk7CisgICAgICAgIHN0YXR1c190IGVyciA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gTWVkaWFDb2RlY0luZm86OkZyb21QYXJjZWwocmVwbHkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIHNzaXplX3QgZmluZENvZGVjQnlUeXBlKAorICAgICAgICAgICAgY29uc3QgY2hhciAqdHlwZSwgYm9vbCBlbmNvZGVyLCBzaXplX3Qgc3RhcnRJbmRleCA9IDApIGNvbnN0CisgICAgeworICAgICAgICBpZiAoc3RhcnRJbmRleCA+IElOVDMyX01BWCkgeworICAgICAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgICAgICB9CisKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhQ29kZWNMaXN0OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlQ1N0cmluZyh0eXBlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGVuY29kZXIpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhcnRJbmRleCk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChGSU5EX0NPREVDX0JZX1RZUEUsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzc2l6ZV90PihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgfQorCisgICAgdmlydHVhbCBzc2l6ZV90IGZpbmRDb2RlY0J5TmFtZShjb25zdCBjaGFyICpuYW1lKSBjb25zdAorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhQ29kZWNMaXN0OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlQ1N0cmluZyhuYW1lKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEZJTkRfQ09ERUNfQllfTkFNRSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHNzaXplX3Q+KHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICB9Cit9OworCitJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoTWVkaWFDb2RlY0xpc3QsICJhbmRyb2lkLm1lZGlhLklNZWRpYUNvZGVjTGlzdCIpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXR1c190IEJuTWVkaWFDb2RlY0xpc3Q6Om9uVHJhbnNhY3QoCisgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKK3sKKyAgICBzd2l0Y2ggKGNvZGUpIHsKKyAgICAgICAgY2FzZSBDT1VOVF9DT0RFQ1M6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFDb2RlY0xpc3QsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHNpemVfdCBjb3VudCA9IGNvdW50Q29kZWNzKCk7CisgICAgICAgICAgICBpZiAoY291bnQgPiBJTlQzMl9NQVgpIHsKKyAgICAgICAgICAgICAgICBjb3VudCA9IElOVDMyX01BWDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGNvdW50KTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEdFVF9DT0RFQ19JTkZPOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhQ29kZWNMaXN0LCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzaXplX3QgaW5kZXggPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0luZm8+IGluZm8gPSBnZXRDb2RlY0luZm8oaW5kZXgpOworICAgICAgICAgICAgaWYgKGluZm8gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKE9LKTsKKyAgICAgICAgICAgICAgICBpbmZvLT53cml0ZVRvUGFyY2VsKHJlcGx5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoLUVSQU5HRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBGSU5EX0NPREVDX0JZX1RZUEU6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFDb2RlY0xpc3QsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnR5cGUgPSBkYXRhLnJlYWRDU3RyaW5nKCk7CisgICAgICAgICAgICBib29sIGlzRW5jb2RlciA9IHN0YXRpY19jYXN0PGJvb2w+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgc2l6ZV90IHN0YXJ0SW5kZXggPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IGZpbmRDb2RlY0J5VHlwZSh0eXBlLCBpc0VuY29kZXIsIHN0YXJ0SW5kZXgpOworICAgICAgICAgICAgaWYgKGluZGV4ID4gSU5UMzJfTUFYIHx8IGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgIGluZGV4ID0gTkFNRV9OT1RfRk9VTkQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpbmRleCk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBGSU5EX0NPREVDX0JZX05BTUU6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFDb2RlY0xpc3QsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBkYXRhLnJlYWRDU3RyaW5nKCk7CisgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gZmluZENvZGVjQnlOYW1lKG5hbWUpOworICAgICAgICAgICAgaWYgKGluZGV4ID4gSU5UMzJfTUFYIHx8IGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgIGluZGV4ID0gTkFNRV9OT1RfRk9VTkQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpbmRleCk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFEZWF0aE5vdGlmaWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYURlYXRoTm90aWZpZXIuY3BwCmluZGV4IDRhYzBiZTQuLjEwNjIwNWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYURlYXRoTm90aWZpZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYURlYXRoTm90aWZpZXIuY3BwCkBAIC03NSw3ICs3NSw3IEBACiB9CiAKIHZvaWQKLUlNZWRpYURlYXRoTm90aWZpZXI6OkRlYXRoTm90aWZpZXI6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykgeworSU1lZGlhRGVhdGhOb3RpZmllcjo6RGVhdGhOb3RpZmllcjo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKSB7CiAgICAgQUxPR1coIm1lZGlhIHNlcnZlciBkaWVkIik7CiAKICAgICAvLyBOZWVkIHRvIGRvIHRoaXMgd2l0aCB0aGUgbG9jayBoZWxkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFIVFRQQ29ubmVjdGlvbi5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFIVFRQQ29ubmVjdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVhMzcxNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYUhUVFBDb25uZWN0aW9uLmNwcApAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiSU1lZGlhSFRUUENvbm5lY3Rpb24iCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgorCisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitlbnVtIHsKKyAgICBDT05ORUNUID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKKyAgICBESVNDT05ORUNULAorICAgIFJFQURfQVQsCisgICAgR0VUX1NJWkUsCisgICAgR0VUX01JTUVfVFlQRSwKKyAgICBHRVRfVVJJCit9OworCitzdHJ1Y3QgQnBNZWRpYUhUVFBDb25uZWN0aW9uIDogcHVibGljIEJwSW50ZXJmYWNlPElNZWRpYUhUVFBDb25uZWN0aW9uPiB7CisgICAgQnBNZWRpYUhUVFBDb25uZWN0aW9uKGNvbnN0IHNwPElCaW5kZXI+ICZpbXBsKQorICAgICAgICA6IEJwSW50ZXJmYWNlPElNZWRpYUhUVFBDb25uZWN0aW9uPihpbXBsKSB7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGNvbm5lY3QoCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmksIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKAorICAgICAgICAgICAgICAgIElNZWRpYUhUVFBDb25uZWN0aW9uOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIFN0cmluZzE2IHRtcCh1cmkpOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nMTYodG1wKTsKKworICAgICAgICB0bXAgPSBTdHJpbmcxNigiIik7CisgICAgICAgIGlmIChoZWFkZXJzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVhZGVycy0+c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcxNiBrZXkoaGVhZGVycy0+a2V5QXQoaSkuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIFN0cmluZzE2IHZhbChoZWFkZXJzLT52YWx1ZUF0KGkpLnN0cmluZygpKTsKKworICAgICAgICAgICAgICAgIHRtcC5hcHBlbmQoa2V5KTsKKyAgICAgICAgICAgICAgICB0bXAuYXBwZW5kKFN0cmluZzE2KCI6ICIpKTsKKyAgICAgICAgICAgICAgICB0bXAuYXBwZW5kKHZhbCk7CisgICAgICAgICAgICAgICAgdG1wLmFwcGVuZChTdHJpbmcxNigiXHJcbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkYXRhLndyaXRlU3RyaW5nMTYodG1wKTsKKworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQ09OTkVDVCwgZGF0YSwgJnJlcGx5KTsKKworICAgICAgICBpbnQzMl90IGV4Y2VwdGlvbkNvZGUgPSByZXBseS5yZWFkRXhjZXB0aW9uQ29kZSgpOworCisgICAgICAgIGlmIChleGNlcHRpb25Db2RlKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKTsKKyAgICAgICAgbU1lbW9yeSA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KGJpbmRlcik7CisKKyAgICAgICAgcmV0dXJuIG1NZW1vcnkgIT0gTlVMTDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdCgpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oCisgICAgICAgICAgICAgICAgSU1lZGlhSFRUUENvbm5lY3Rpb246OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KERJU0NPTk5FQ1QsIGRhdGEsICZyZXBseSk7CisgICAgfQorCisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbigKKyAgICAgICAgICAgICAgICBJTWVkaWFIVFRQQ29ubmVjdGlvbjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICBkYXRhLndyaXRlSW50NjQob2Zmc2V0KTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHNpemUpOworCisgICAgICAgIHN0YXR1c190IGVyciA9IHJlbW90ZSgpLT50cmFuc2FjdChSRUFEX0FULCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgicmVtb3RlIHJlYWRBdCBmYWlsZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBleGNlcHRpb25Db2RlID0gcmVwbHkucmVhZEV4Y2VwdGlvbkNvZGUoKTsKKworICAgICAgICBpZiAoZXhjZXB0aW9uQ29kZSkgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgbGVuID0gcmVwbHkucmVhZEludDMyKCk7CisKKyAgICAgICAgaWYgKGxlbiA+IHNpemUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZXF1ZXN0ZWQgJXp1LCBnb3QgJXp1Iiwgc2l6ZSwgbGVuKTsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxlbiA+IG1NZW1vcnktPnNpemUoKSkgeworICAgICAgICAgICAgQUxPR0UoImdvdCAlenUsIGJ1dCBtZW1vcnkgaGFzICV6dSIsIGxlbiwgbU1lbW9yeS0+c2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CisgICAgICAgIH0KKworICAgICAgICBtZW1jcHkoYnVmZmVyLCBtTWVtb3J5LT5wb2ludGVyKCksIGxlbik7CisKKyAgICAgICAgcmV0dXJuIGxlbjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIG9mZjY0X3QgZ2V0U2l6ZSgpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oCisgICAgICAgICAgICAgICAgSU1lZGlhSFRUUENvbm5lY3Rpb246OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9TSVpFLCBkYXRhLCAmcmVwbHkpOworCisgICAgICAgIGludDMyX3QgZXhjZXB0aW9uQ29kZSA9IHJlcGx5LnJlYWRFeGNlcHRpb25Db2RlKCk7CisKKyAgICAgICAgaWYgKGV4Y2VwdGlvbkNvZGUpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQ2NCgpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TUlNRVR5cGUoU3RyaW5nOCAqbWltZVR5cGUpIHsKKyAgICAgICAgKm1pbWVUeXBlID0gU3RyaW5nOCgiIik7CisKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oCisgICAgICAgICAgICAgICAgSU1lZGlhSFRUUENvbm5lY3Rpb246OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9NSU1FX1RZUEUsIGRhdGEsICZyZXBseSk7CisKKyAgICAgICAgaW50MzJfdCBleGNlcHRpb25Db2RlID0gcmVwbHkucmVhZEV4Y2VwdGlvbkNvZGUoKTsKKworICAgICAgICBpZiAoZXhjZXB0aW9uQ29kZSkgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICAqbWltZVR5cGUgPSBTdHJpbmc4KHJlcGx5LnJlYWRTdHJpbmcxNigpKTsKKworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRVcmkoU3RyaW5nOCAqdXJpKSB7CisgICAgICAgICp1cmkgPSBTdHJpbmc4KCIiKTsKKworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbigKKyAgICAgICAgICAgICAgICBJTWVkaWFIVFRQQ29ubmVjdGlvbjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1VSSSwgZGF0YSwgJnJlcGx5KTsKKworICAgICAgICBpbnQzMl90IGV4Y2VwdGlvbkNvZGUgPSByZXBseS5yZWFkRXhjZXB0aW9uQ29kZSgpOworCisgICAgICAgIGlmIChleGNlcHRpb25Db2RlKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgICp1cmkgPSBTdHJpbmc4KHJlcGx5LnJlYWRTdHJpbmcxNigpKTsKKworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCitwcml2YXRlOgorICAgIHNwPElNZW1vcnk+IG1NZW1vcnk7Cit9OworCitJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoCisgICAgICAgIE1lZGlhSFRUUENvbm5lY3Rpb24sICJhbmRyb2lkLm1lZGlhLklNZWRpYUhUVFBDb25uZWN0aW9uIik7CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjYwNTgyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuY3BwCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIklNZWRpYUhUVFBTZXJ2aWNlIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KKworI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2VudW0geworICAgIE1BS0VfSFRUUCA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCit9OworCitzdHJ1Y3QgQnBNZWRpYUhUVFBTZXJ2aWNlIDogcHVibGljIEJwSW50ZXJmYWNlPElNZWRpYUhUVFBTZXJ2aWNlPiB7CisgICAgQnBNZWRpYUhUVFBTZXJ2aWNlKGNvbnN0IHNwPElCaW5kZXI+ICZpbXBsKQorICAgICAgICA6IEJwSW50ZXJmYWNlPElNZWRpYUhUVFBTZXJ2aWNlPihpbXBsKSB7CisgICAgfQorCisgICAgdmlydHVhbCBzcDxJTWVkaWFIVFRQQ29ubmVjdGlvbj4gbWFrZUhUVFBDb25uZWN0aW9uKCkgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbigKKyAgICAgICAgICAgICAgICBJTWVkaWFIVFRQU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoTUFLRV9IVFRQLCBkYXRhLCAmcmVwbHkpOworCisgICAgICAgIHN0YXR1c190IGVyciA9IHJlcGx5LnJlYWRJbnQzMigpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGludGVyZmFjZV9jYXN0PElNZWRpYUhUVFBDb25uZWN0aW9uPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgIH0KK307CisKK0lNUExFTUVOVF9NRVRBX0lOVEVSRkFDRSgKKyAgICAgICAgTWVkaWFIVFRQU2VydmljZSwgImFuZHJvaWQubWVkaWEuSU1lZGlhSFRUUFNlcnZpY2UiKTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhTG9nU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFMb2dTZXJ2aWNlLmNwcAppbmRleCAzMzIzOWE3Li44YTY2YzdjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFMb2dTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFMb2dTZXJ2aWNlLmNwcApAQCAtNDMsNyArNDMsNyBAQAogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFMb2dTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKHNoYXJlZC0+YXNCaW5kZXIoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgc2l6ZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQ2NCgoaW50NjRfdCkgc2l6ZSk7CiAgICAgICAgIGRhdGEud3JpdGVDU3RyaW5nKG5hbWUpOwogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoUkVHSVNURVJfV1JJVEVSLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICAvLyBGSVhNRSBpZ25vcmVzIHN0YXR1cwpAQCAtNzEsNyArNzEsNyBAQAogICAgICAgICBjYXNlIFJFR0lTVEVSX1dSSVRFUjogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYUxvZ1NlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIHNwPElNZW1vcnk+IHNoYXJlZCA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICAgICAgICAgIHNpemVfdCBzaXplID0gKHNpemVfdCkgZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHNpemVfdCBzaXplID0gKHNpemVfdCkgZGF0YS5yZWFkSW50NjQoKTsKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBkYXRhLnJlYWRDU3RyaW5nKCk7CiAgICAgICAgICAgICByZWdpc3RlcldyaXRlcihzaGFyZWQsIHNpemUsIG5hbWUpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuY3BwCmluZGV4IGJiMDY2YTAuLjM4ZjcxN2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5jcHAKQEAgLTE1LDkgKzE1LDEyIEBACiAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KQEAgLTg0LDE3ICs4NywyMyBAQAogICAgIH0KIAogICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpzcmNVcmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKQorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnNyY1VybCwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihodHRwU2VydmljZSAhPSBOVUxMKTsKKyAgICAgICAgaWYgKGh0dHBTZXJ2aWNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoaHR0cFNlcnZpY2UtPmFzQmluZGVyKCkpOworICAgICAgICB9CiAgICAgICAgIGRhdGEud3JpdGVDU3RyaW5nKHNyY1VybCk7CiAKICAgICAgICAgaWYgKGhlYWRlcnMgPT0gTlVMTCkgewogICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDApOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gc2VyaWFsaXplIHRoZSBoZWFkZXJzCi0gICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoaGVhZGVycy0+c2l6ZSgpKTsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQ2NChoZWFkZXJzLT5zaXplKCkpOwogICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWFkZXJzLT5zaXplKCk7ICsraSkgewogICAgICAgICAgICAgICAgIGRhdGEud3JpdGVTdHJpbmc4KGhlYWRlcnMtPmtleUF0KGkpKTsKICAgICAgICAgICAgICAgICBkYXRhLndyaXRlU3RyaW5nOChoZWFkZXJzLT52YWx1ZUF0KGkpKTsKQEAgLTExOCw3ICsxMjcsNyBAQAogCiAgICAgc3A8SU1lbW9yeT4gZ2V0RnJhbWVBdFRpbWUoaW50NjRfdCB0aW1lVXMsIGludCBvcHRpb24pCiAgICAgewotICAgICAgICBBTE9HVigiZ2V0VGltZUF0VGltZTogdGltZSglbGxkIHVzKSBhbmQgb3B0aW9uKCVkKSIsIHRpbWVVcywgb3B0aW9uKTsKKyAgICAgICAgQUxPR1YoImdldFRpbWVBdFRpbWU6IHRpbWUoJSIgUFJJZDY0ICIgdXMpIGFuZCBvcHRpb24oJWQpIiwgdGltZVVzLCBvcHRpb24pOwogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFNZXRhZGF0YVJldHJpZXZlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDY0KHRpbWVVcyk7CkBAIC0xOTUsMTggKzIwNCwyNiBAQAogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFNFVF9EQVRBX1NPVVJDRV9VUkw6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFNZXRhZGF0YVJldHJpZXZlciwgZGF0YSwgcmVwbHkpOworCisgICAgICAgICAgICBzcDxJTWVkaWFIVFRQU2VydmljZT4gaHR0cFNlcnZpY2U7CisgICAgICAgICAgICBpZiAoZGF0YS5yZWFkSW50MzIoKSkgeworICAgICAgICAgICAgICAgIGh0dHBTZXJ2aWNlID0KKyAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhSFRUUFNlcnZpY2U+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgY29uc3QgY2hhciogc3JjVXJsID0gZGF0YS5yZWFkQ1N0cmluZygpOwogCiAgICAgICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBoZWFkZXJzOwotICAgICAgICAgICAgaW50MzJfdCBudW1IZWFkZXJzID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtSGVhZGVyczsgKytpKSB7CisgICAgICAgICAgICBzaXplX3QgbnVtSGVhZGVycyA9IChzaXplX3QpIGRhdGEucmVhZEludDY0KCk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUhlYWRlcnM7ICsraSkgewogICAgICAgICAgICAgICAgIFN0cmluZzgga2V5ID0gZGF0YS5yZWFkU3RyaW5nOCgpOwogICAgICAgICAgICAgICAgIFN0cmluZzggdmFsdWUgPSBkYXRhLnJlYWRTdHJpbmc4KCk7CiAgICAgICAgICAgICAgICAgaGVhZGVycy5hZGQoa2V5LCB2YWx1ZSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKAotICAgICAgICAgICAgICAgICAgICBzZXREYXRhU291cmNlKHNyY1VybCwgbnVtSGVhZGVycyA+IDAgPyAmaGVhZGVycyA6IE5VTEwpKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBTZXJ2aWNlLCBzcmNVcmwsIG51bUhlYWRlcnMgPiAwID8gJmhlYWRlcnMgOiBOVUxMKSk7CiAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKQEAgLTIyMiw3ICsyMzksNyBAQAogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYU1ldGFkYXRhUmV0cmlldmVyLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcyA9IGRhdGEucmVhZEludDY0KCk7CiAgICAgICAgICAgICBpbnQgb3B0aW9uID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIEFMT0dWKCJnZXRUaW1lQXRUaW1lOiB0aW1lKCVsbGQgdXMpIGFuZCBvcHRpb24oJWQpIiwgdGltZVVzLCBvcHRpb24pOworICAgICAgICAgICAgQUxPR1YoImdldFRpbWVBdFRpbWU6IHRpbWUoJSIgUFJJZDY0ICIgdXMpIGFuZCBvcHRpb24oJWQpIiwgdGltZVVzLCBvcHRpb24pOwogI2lmbmRlZiBESVNBQkxFX0dST1VQX1NDSEVEVUxFX0hBQ0sKICAgICAgICAgICAgIHNldFNjaGVkUG9saWN5KGRhdGEpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcAppbmRleCAyYTVjN2E3Li5hMjlhN2RlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAKQEAgLTIxLDYgKzIxLDcgQEAKIAogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KIAorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvSVN0cmVhbVNvdXJjZS5oPgogCkBAIC03NSwxMSArNzYsMTcgQEAKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KERJU0NPTk5FQ1QsIGRhdGEsICZyZXBseSk7CiAgICAgfQogCi0gICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShjb25zdCBjaGFyKiB1cmwsCisgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmwsCiAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiogaGVhZGVycykKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGh0dHBTZXJ2aWNlICE9IE5VTEwpOworICAgICAgICBpZiAoaHR0cFNlcnZpY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihodHRwU2VydmljZS0+YXNCaW5kZXIoKSk7CisgICAgICAgIH0KICAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcodXJsKTsKICAgICAgICAgaWYgKGhlYWRlcnMgPT0gTlVMTCkgewogICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDApOwpAQCAtMzU1LDYgKzM2MiwxMyBAQAogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFNFVF9EQVRBX1NPVVJDRV9VUkw6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXIsIGRhdGEsIHJlcGx5KTsKKworICAgICAgICAgICAgc3A8SU1lZGlhSFRUUFNlcnZpY2U+IGh0dHBTZXJ2aWNlOworICAgICAgICAgICAgaWYgKGRhdGEucmVhZEludDMyKCkpIHsKKyAgICAgICAgICAgICAgICBodHRwU2VydmljZSA9CisgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElNZWRpYUhUVFBTZXJ2aWNlPihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVybCA9IGRhdGEucmVhZENTdHJpbmcoKTsKICAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGhlYWRlcnM7CiAgICAgICAgICAgICBpbnQzMl90IG51bUhlYWRlcnMgPSBkYXRhLnJlYWRJbnQzMigpOwpAQCAtMzYzLDcgKzM3Nyw4IEBACiAgICAgICAgICAgICAgICAgU3RyaW5nOCB2YWx1ZSA9IGRhdGEucmVhZFN0cmluZzgoKTsKICAgICAgICAgICAgICAgICBoZWFkZXJzLmFkZChrZXksIHZhbHVlKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldERhdGFTb3VyY2UodXJsLCBudW1IZWFkZXJzID4gMCA/ICZoZWFkZXJzIDogTlVMTCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBTZXJ2aWNlLCB1cmwsIG51bUhlYWRlcnMgPiAwID8gJmhlYWRlcnMgOiBOVUxMKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgU0VUX0RBVEFfU09VUkNFX0ZEOiB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuY3BwCmluZGV4IDNjMjJiNGMuLjJlMDJkMTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuY3BwCkBAIC0yMyw2ICsyMyw4IEBACiAjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgogI2luY2x1ZGUgPG1lZGlhL0lEcm0uaD4KICNpbmNsdWRlIDxtZWRpYS9JSERDUC5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUNvZGVjTGlzdC5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVJlY29yZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgpAQCAtNDgsNyArNTAsNyBAQAogICAgIEFERF9CQVRURVJZX0RBVEEsCiAgICAgUFVMTF9CQVRURVJZX0RBVEEsCiAgICAgTElTVEVOX0ZPUl9SRU1PVEVfRElTUExBWSwKLSAgICBVUERBVEVfUFJPWFlfQ09ORklHLAorICAgIEdFVF9DT0RFQ19MSVNULAogfTsKIAogY2xhc3MgQnBNZWRpYVBsYXllclNlcnZpY2U6IHB1YmxpYyBCcEludGVyZmFjZTxJTWVkaWFQbGF5ZXJTZXJ2aWNlPgpAQCAtODYsMTIgKzg4LDIxIEBACiAgICAgICAgIHJldHVybiBpbnRlcmZhY2VfY2FzdDxJTWVkaWFSZWNvcmRlcj4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGRlY29kZShjb25zdCBjaGFyKiB1cmwsIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwgaW50KiBwTnVtQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwLCBzaXplX3QgKnBTaXplKQorICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVjb2RlKAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVybCwKKyAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgIGludCogcE51bUNoYW5uZWxzLAorICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsCisgICAgICAgICAgICBzaXplX3QgKnBTaXplKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUGxheWVyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGh0dHBTZXJ2aWNlICE9IE5VTEwpOworICAgICAgICBpZiAoaHR0cFNlcnZpY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihodHRwU2VydmljZS0+YXNCaW5kZXIoKSk7CisgICAgICAgIH0KICAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcodXJsKTsKICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihoZWFwLT5hc0JpbmRlcigpKTsKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KERFQ09ERV9VUkwsIGRhdGEsICZyZXBseSk7CkBAIC0xODMsMjMgKzE5NCwxMSBAQAogICAgICAgICByZXR1cm4gaW50ZXJmYWNlX2Nhc3Q8SVJlbW90ZURpc3BsYXk+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCB1cGRhdGVQcm94eUNvbmZpZygKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGludDMyX3QgcG9ydCwgY29uc3QgY2hhciAqZXhjbHVzaW9uTGlzdCkgeworICAgIHZpcnR1YWwgc3A8SU1lZGlhQ29kZWNMaXN0PiBnZXRDb2RlY0xpc3QoKSBjb25zdCB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLQogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUGxheWVyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgaWYgKGhvc3QgPT0gTlVMTCkgewotICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDEpOwotICAgICAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcoaG9zdCk7Ci0gICAgICAgICAgICBkYXRhLndyaXRlSW50MzIocG9ydCk7Ci0gICAgICAgICAgICBkYXRhLndyaXRlQ1N0cmluZyhleGNsdXNpb25MaXN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChVUERBVEVfUFJPWFlfQ09ORklHLCBkYXRhLCAmcmVwbHkpOwotCi0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9DT0RFQ19MSVNULCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXR1cm4gaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhQ29kZWNMaXN0PihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOwogICAgIH0KIH07CiAKQEAgLTIyMiwxMyArMjIxLDI1IEBACiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgREVDT0RFX1VSTDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVBsYXllclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHNwPElNZWRpYUhUVFBTZXJ2aWNlPiBodHRwU2VydmljZTsKKyAgICAgICAgICAgIGlmIChkYXRhLnJlYWRJbnQzMigpKSB7CisgICAgICAgICAgICAgICAgaHR0cFNlcnZpY2UgPQorICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJTWVkaWFIVFRQU2VydmljZT4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgY29uc3QgY2hhciogdXJsID0gZGF0YS5yZWFkQ1N0cmluZygpOwogICAgICAgICAgICAgc3A8SU1lbW9yeUhlYXA+IGhlYXAgPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5SGVhcD4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOwogICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZTsKICAgICAgICAgICAgIGludCBudW1DaGFubmVsczsKICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdDsKICAgICAgICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGVjb2RlKHVybCwgJnNhbXBsZVJhdGUsICZudW1DaGFubmVscywgJmZvcm1hdCwgaGVhcCwgJnNpemUpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgICAgICBkZWNvZGUoaHR0cFNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgIHVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICZudW1DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgJmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgaGVhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzYW1wbGVSYXRlKTsKQEAgLTMxNiwyNCArMzI3LDEyIEBACiAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoZGlzcGxheS0+YXNCaW5kZXIoKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgVVBEQVRFX1BST1hZX0NPTkZJRzoKLSAgICAgICAgeworICAgICAgICBjYXNlIEdFVF9DT0RFQ19MSVNUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyU2VydmljZSwgZGF0YSwgcmVwbHkpOwotCi0gICAgICAgICAgICBjb25zdCBjaGFyICpob3N0ID0gTlVMTDsKLSAgICAgICAgICAgIGludDMyX3QgcG9ydCA9IDA7Ci0gICAgICAgICAgICBjb25zdCBjaGFyICpleGNsdXNpb25MaXN0ID0gTlVMTDsKLQotICAgICAgICAgICAgaWYgKGRhdGEucmVhZEludDMyKCkpIHsKLSAgICAgICAgICAgICAgICBob3N0ID0gZGF0YS5yZWFkQ1N0cmluZygpOwotICAgICAgICAgICAgICAgIHBvcnQgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgICAgIGV4Y2x1c2lvbkxpc3QgPSBkYXRhLnJlYWRDU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHVwZGF0ZVByb3h5Q29uZmlnKGhvc3QsIHBvcnQsIGV4Y2x1c2lvbkxpc3QpKTsKLQotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9CisgICAgICAgICAgICBzcDxJTWVkaWFDb2RlY0xpc3Q+IG1jbCA9IGdldENvZGVjTGlzdCgpOworICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKG1jbC0+YXNCaW5kZXIoKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyLmNwcAppbmRleCA4ZTU4MTYyLi45NWFmMDA2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXIuY3BwCkBAIC0xNyw2ICsxNywxMCBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIklNZWRpYVJlY29yZGVyIgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNpbmNsdWRlIDxjYW1lcmEvSUNhbWVyYS5oPgpAQCAtMjQsOCArMjgsNiBAQAogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVJlY29yZGVyLmg+CiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KICNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMTY3LDcgKzE2OSw3IEBACiAgICAgfQogCiAgICAgc3RhdHVzX3Qgc2V0T3V0cHV0RmlsZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkgewotICAgICAgICBBTE9HVigic2V0T3V0cHV0RmlsZSglZCwgJWxsZCwgJWxsZCkiLCBmZCwgb2Zmc2V0LCBsZW5ndGgpOworICAgICAgICBBTE9HVigic2V0T3V0cHV0RmlsZSglZCwgJSIgUFJJZDY0ICIsICUiIFBSSWQ2NCAiKSIsIGZkLCBvZmZzZXQsIGxlbmd0aCk7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVJlY29yZGVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlRmlsZURlc2NyaXB0b3IoZmQpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAgYi9tZWRpYS9saWJtZWRpYS9JT01YLmNwcAppbmRleCA4ZDhmZTZhLi5lNmU4ZTZkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JT01YLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JT01YLmNwcApAQCAtNTYsNiArNTYsNyBAQAogICAgIEdFVF9HUkFQSElDX0JVRkZFUl9VU0FHRSwKICAgICBTRVRfSU5URVJOQUxfT1BUSU9OLAogICAgIFVQREFURV9HUkFQSElDX0JVRkZFUl9JTl9NRVRBLAorICAgIENPTkZJR1VSRV9WSURFT19UVU5ORUxfTU9ERSwKIH07CiAKIGNsYXNzIEJwT01YIDogcHVibGljIEJwSW50ZXJmYWNlPElPTVg+IHsKQEAgLTY3LDcgKzY4LDcgQEAKICAgICB2aXJ0dWFsIGJvb2wgbGl2ZXNMb2NhbGx5KG5vZGVfaWQgbm9kZSwgcGlkX3QgcGlkKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRQdHIoKGludHB0cl90KW5vZGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpbm9kZSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihwaWQpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoTElWRVNfTE9DQUxMWSwgZGF0YSwgJnJlcGx5KTsKIApAQCAtMTA2LDcgKzEwNyw3IEBACiAKICAgICAgICAgc3RhdHVzX3QgZXJyID0gcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgICpub2RlID0gKHZvaWQqKXJlcGx5LnJlYWRJbnRQdHIoKTsKKyAgICAgICAgICAgICpub2RlID0gKG5vZGVfaWQpcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAqbm9kZSA9IDA7CiAgICAgICAgIH0KQEAgLTExNyw3ICsxMTgsNyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZnJlZU5vZGUobm9kZV9pZCBub2RlKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRQdHIoKGludHB0cl90KW5vZGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpbm9kZSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChGUkVFX05PREUsIGRhdGEsICZyZXBseSk7CiAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwpAQCAtMTI3LDcgKzEyOCw3IEBACiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9DT01NQU5EVFlQRSBjbWQsIE9NWF9TMzIgcGFyYW0pIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3Qpbm9kZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGNtZCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihwYXJhbSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRU5EX0NPTU1BTkQsIGRhdGEsICZyZXBseSk7CkBAIC0xNDAsOSArMTQxLDkgQEAKICAgICAgICAgICAgIHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3Qpbm9kZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGluZGV4KTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNpemUpOworICAgICAgICBkYXRhLndyaXRlSW50NjQoc2l6ZSk7CiAgICAgICAgIGRhdGEud3JpdGUocGFyYW1zLCBzaXplKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9QQVJBTUVURVIsIGRhdGEsICZyZXBseSk7CiAKQEAgLTE2MSw5ICsxNjIsOSBAQAogICAgICAgICAgICAgY29uc3Qgdm9pZCAqcGFyYW1zLCBzaXplX3Qgc2l6ZSkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50UHRyKChpbnRwdHJfdClub2RlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KW5vZGUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoaW5kZXgpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc2l6ZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQ2NChzaXplKTsKICAgICAgICAgZGF0YS53cml0ZShwYXJhbXMsIHNpemUpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1BBUkFNRVRFUiwgZGF0YSwgJnJlcGx5KTsKIApAQCAtMTc1LDkgKzE3Niw5IEBACiAgICAgICAgICAgICB2b2lkICpwYXJhbXMsIHNpemVfdCBzaXplKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRQdHIoKGludHB0cl90KW5vZGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpbm9kZSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihpbmRleCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzaXplKTsKKyAgICAgICAgZGF0YS53cml0ZUludDY0KHNpemUpOwogICAgICAgICBkYXRhLndyaXRlKHBhcmFtcywgc2l6ZSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfQ09ORklHLCBkYXRhLCAmcmVwbHkpOwogCkBAIC0xOTYsOSArMTk3LDkgQEAKICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3Qpbm9kZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGluZGV4KTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNpemUpOworICAgICAgICBkYXRhLndyaXRlSW50NjQoc2l6ZSk7CiAgICAgICAgIGRhdGEud3JpdGUocGFyYW1zLCBzaXplKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9DT05GSUcsIGRhdGEsICZyZXBseSk7CiAKQEAgLTIwOSw3ICsyMTAsNyBAQAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfU1RBVEVUWVBFKiBzdGF0ZSkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50UHRyKChpbnRwdHJfdClub2RlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KW5vZGUpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1NUQVRFLCBkYXRhLCAmcmVwbHkpOwogCiAgICAgICAgICpzdGF0ZSA9IHN0YXRpY19jYXN0PE9NWF9TVEFURVRZUEU+KHJlcGx5LnJlYWRJbnQzMigpKTsKQEAgLTIyMCw3ICsyMjEsNyBAQAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIE9NWF9CT09MIGVuYWJsZSkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50UHRyKChpbnRwdHJfdClub2RlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KW5vZGUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIocG9ydF9pbmRleCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMigodWludDMyX3QpZW5hYmxlKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEVOQUJMRV9HUkFQSElDX0JVRkZFUlMsIGRhdGEsICZyZXBseSk7CkBAIC0yMzMsNyArMjM0LDcgQEAKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBPTVhfVTMyKiB1c2FnZSkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50UHRyKChpbnRwdHJfdClub2RlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KW5vZGUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIocG9ydF9pbmRleCk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfR1JBUEhJQ19CVUZGRVJfVVNBR0UsIGRhdGEsICZyZXBseSk7CiAKQEAgLTI0Nyw3ICsyNDgsNyBAQAogICAgICAgICAgICAgYnVmZmVyX2lkICpidWZmZXIsIE9NWF9CT09MIC8qIGNyb3NzUHJvY2VzcyAqLykgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50UHRyKChpbnRwdHJfdClub2RlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KW5vZGUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIocG9ydF9pbmRleCk7CiAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIocGFyYW1zLT5hc0JpbmRlcigpKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFVTRV9CVUZGRVIsIGRhdGEsICZyZXBseSk7CkBAIC0yNTksNyArMjYwLDcgQEAKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KIAotICAgICAgICAqYnVmZmVyID0gKHZvaWQqKXJlcGx5LnJlYWRJbnRQdHIoKTsKKyAgICAgICAgKmJ1ZmZlciA9IChidWZmZXJfaWQpcmVwbHkucmVhZEludDMyKCk7CiAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CkBAIC0yNzAsNyArMjcxLDcgQEAKICAgICAgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+ICZncmFwaGljQnVmZmVyLCBidWZmZXJfaWQgKmJ1ZmZlcikgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50UHRyKChpbnRwdHJfdClub2RlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KW5vZGUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIocG9ydF9pbmRleCk7CiAgICAgICAgIGRhdGEud3JpdGUoKmdyYXBoaWNCdWZmZXIpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoVVNFX0dSQVBISUNfQlVGRkVSLCBkYXRhLCAmcmVwbHkpOwpAQCAtMjgyLDcgKzI4Myw3IEBACiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAKLSAgICAgICAgKmJ1ZmZlciA9ICh2b2lkKilyZXBseS5yZWFkSW50UHRyKCk7CisgICAgICAgICpidWZmZXIgPSAoYnVmZmVyX2lkKXJlcGx5LnJlYWRJbnQzMigpOwogCiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQpAQCAtMjkyLDEwICsyOTMsMTAgQEAKICAgICAgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+ICZncmFwaGljQnVmZmVyLCBidWZmZXJfaWQgYnVmZmVyKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRQdHIoKGludHB0cl90KW5vZGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpbm9kZSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihwb3J0X2luZGV4KTsKICAgICAgICAgZGF0YS53cml0ZSgqZ3JhcGhpY0J1ZmZlcik7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRQdHIoKGludHB0cl90KWJ1ZmZlcik7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClidWZmZXIpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoVVBEQVRFX0dSQVBISUNfQlVGRkVSX0lOX01FVEEsIGRhdGEsICZyZXBseSk7CiAKICAgICAgICAgc3RhdHVzX3QgZXJyID0gcmVwbHkucmVhZEludDMyKCk7CkBAIC0zMDgsNyArMzA5LDcgQEAKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBzdGF0dXNfdCBlcnI7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50UHRyKChpbnRwdHJfdClub2RlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KW5vZGUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIocG9ydF9pbmRleCk7CiAgICAgICAgIGVyciA9IHJlbW90ZSgpLT50cmFuc2FjdChDUkVBVEVfSU5QVVRfU1VSRkFDRSwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgewpAQCAtMzMxLDcgKzMzMiw3IEBACiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgc3RhdHVzX3QgZXJyOwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3Qpbm9kZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKICAgICAgICAgZXJyID0gcmVtb3RlKCktPnRyYW5zYWN0KFNJR05BTF9FTkRfT0ZfSU5QVVRfU1RSRUFNLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HVygiYmluZGVyIHRyYW5zYWN0aW9uIGZhaWxlZDogJWQiLCBlcnIpOwpAQCAtMzQ1LDcgKzM0Niw3IEBACiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgT01YX0JPT0wgZW5hYmxlKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRQdHIoKGludHB0cl90KW5vZGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpbm9kZSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihwb3J0X2luZGV4KTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKCh1aW50MzJfdCllbmFibGUpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU1RPUkVfTUVUQV9EQVRBX0lOX0JVRkZFUlMsIGRhdGEsICZyZXBseSk7CkBAIC0zNTksNyArMzYwLDcgQEAKICAgICAgICAgICAgIE9NWF9VMzIgbWF4X3dpZHRoLCBPTVhfVTMyIG1heF9oZWlnaHQpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3Qpbm9kZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHBvcnRfaW5kZXgpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpZW5hYmxlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKG1heF93aWR0aCk7CkBAIC0zNzAsMTQgKzM3MSwzMyBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlVmlkZW9UdW5uZWxNb2RlKAorICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgdHVubmVsZWQsCisgICAgICAgICAgICBPTVhfVTMyIGF1ZGlvSHdTeW5jLCBuYXRpdmVfaGFuZGxlX3QgKipzaWRlYmFuZEhhbmRsZSApIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KW5vZGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIocG9ydEluZGV4KTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KXR1bm5lbGVkKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGF1ZGlvSHdTeW5jKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KENPTkZJR1VSRV9WSURFT19UVU5ORUxfTU9ERSwgZGF0YSwgJnJlcGx5KTsKKworICAgICAgICBzdGF0dXNfdCBlcnIgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaWYgKGVyciA9PSBPSyAmJiBzaWRlYmFuZEhhbmRsZSkgeworICAgICAgICAgICAgKnNpZGViYW5kSGFuZGxlID0gKG5hdGl2ZV9oYW5kbGVfdCAqKXJlcGx5LnJlYWROYXRpdmVIYW5kbGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBhbGxvY2F0ZUJ1ZmZlcigKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBzaXplX3Qgc2l6ZSwKICAgICAgICAgICAgIGJ1ZmZlcl9pZCAqYnVmZmVyLCB2b2lkICoqYnVmZmVyX2RhdGEpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3Qpbm9kZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHBvcnRfaW5kZXgpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc2l6ZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQ2NChzaXplKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEFMTE9DX0JVRkZFUiwgZGF0YSwgJnJlcGx5KTsKIAogICAgICAgICBzdGF0dXNfdCBlcnIgPSByZXBseS5yZWFkSW50MzIoKTsKQEAgLTM4Nyw4ICs0MDcsOCBAQAogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogCi0gICAgICAgICpidWZmZXIgPSAodm9pZCAqKXJlcGx5LnJlYWRJbnRQdHIoKTsKLSAgICAgICAgKmJ1ZmZlcl9kYXRhID0gKHZvaWQgKilyZXBseS5yZWFkSW50UHRyKCk7CisgICAgICAgICpidWZmZXIgPSAoYnVmZmVyX2lkKXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAqYnVmZmVyX2RhdGEgPSAodm9pZCAqKXJlcGx5LnJlYWRJbnQ2NCgpOwogCiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQpAQCAtMzk4LDcgKzQxOCw3IEBACiAgICAgICAgICAgICBidWZmZXJfaWQgKmJ1ZmZlciwgT01YX0JPT0wgLyogY3Jvc3NQcm9jZXNzICovKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRQdHIoKGludHB0cl90KW5vZGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpbm9kZSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihwb3J0X2luZGV4KTsKICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihwYXJhbXMtPmFzQmluZGVyKCkpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQUxMT0NfQlVGRkVSX1dJVEhfQkFDS1VQLCBkYXRhLCAmcmVwbHkpOwpAQCAtNDEwLDcgKzQzMCw3IEBACiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAKLSAgICAgICAgKmJ1ZmZlciA9ICh2b2lkKilyZXBseS5yZWFkSW50UHRyKCk7CisgICAgICAgICpidWZmZXIgPSAoYnVmZmVyX2lkKXJlcGx5LnJlYWRJbnQzMigpOwogCiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQpAQCAtNDE5LDkgKzQzOSw5IEBACiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgYnVmZmVyX2lkIGJ1ZmZlcikgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50UHRyKChpbnRwdHJfdClub2RlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KW5vZGUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIocG9ydF9pbmRleCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRQdHIoKGludHB0cl90KWJ1ZmZlcik7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClidWZmZXIpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoRlJFRV9CVUZGRVIsIGRhdGEsICZyZXBseSk7CiAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwpAQCAtNDMwLDggKzQ1MCw4IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBmaWxsQnVmZmVyKG5vZGVfaWQgbm9kZSwgYnVmZmVyX2lkIGJ1ZmZlcikgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50UHRyKChpbnRwdHJfdClub2RlKTsKLSAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3QpYnVmZmVyKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KW5vZGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpYnVmZmVyKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEZJTExfQlVGRkVSLCBkYXRhLCAmcmVwbHkpOwogCiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKQEAgLTQ0NCw4ICs0NjQsOCBAQAogICAgICAgICAgICAgT01YX1UzMiBmbGFncywgT01YX1RJQ0tTIHRpbWVzdGFtcCkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50UHRyKChpbnRwdHJfdClub2RlKTsKLSAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3QpYnVmZmVyKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KW5vZGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpYnVmZmVyKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHJhbmdlX29mZnNldCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihyYW5nZV9sZW5ndGgpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoZmxhZ3MpOwpAQCAtNDYxLDcgKzQ4MSw3IEBACiAgICAgICAgICAgICBPTVhfSU5ERVhUWVBFICppbmRleCkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50UHRyKChpbnRwdHJfdClub2RlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KW5vZGUpOwogICAgICAgICBkYXRhLndyaXRlQ1N0cmluZyhwYXJhbWV0ZXJfbmFtZSk7CiAKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9FWFRFTlNJT05fSU5ERVgsIGRhdGEsICZyZXBseSk7CkBAIC00ODQsOSArNTA0LDkgQEAKICAgICAgICAgICAgIHNpemVfdCBzaXplKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRQdHIoKGludHB0cl90KW5vZGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpbm9kZSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihwb3J0X2luZGV4KTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNpemUpOworICAgICAgICBkYXRhLndyaXRlSW50NjQoc2l6ZSk7CiAgICAgICAgIGRhdGEud3JpdGUob3B0aW9uRGF0YSwgc2l6ZSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMih0eXBlKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9JTlRFUk5BTF9PUFRJT04sIGRhdGEsICZyZXBseSk7CkBAIC01MTEsNyArNTMxLDcgQEAKICAgICAgICAgY2FzZSBMSVZFU19MT0NBTExZOgogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19PTVhfSU5URVJGQUNFKElPTVgsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9ICh2b2lkICopZGF0YS5yZWFkSW50UHRyKCk7CisgICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAobm9kZV9pZClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgcGlkX3QgcGlkID0gKHBpZF90KWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihsaXZlc0xvY2FsbHkobm9kZSwgcGlkKSk7CiAKQEAgLTU1NSw3ICs1NzUsNyBAQAogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gYWxsb2NhdGVOb2RlKG5hbWUsIG9ic2VydmVyLCAmbm9kZSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihlcnIpOwogICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludFB0cigoaW50cHRyX3Qpbm9kZSk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoKGludDMyX3Qpbm9kZSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKQEAgLTU2NSw3ICs1ODUsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19PTVhfSU5URVJGQUNFKElPTVgsIGRhdGEsIHJlcGx5KTsKIAotICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKHZvaWQqKWRhdGEucmVhZEludFB0cigpOworICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKG5vZGVfaWQpZGF0YS5yZWFkSW50MzIoKTsKIAogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZnJlZU5vZGUobm9kZSkpOwogCkBAIC01NzYsNyArNTk2LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7CiAKLSAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9ICh2b2lkKilkYXRhLnJlYWRJbnRQdHIoKTsKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9IChub2RlX2lkKWRhdGEucmVhZEludDMyKCk7CiAKICAgICAgICAgICAgIE9NWF9DT01NQU5EVFlQRSBjbWQgPQogICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PE9NWF9DT01NQU5EVFlQRT4oZGF0YS5yZWFkSW50MzIoKSk7CkBAIC01OTUsMTAgKzYxNSwxMCBAQAogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19PTVhfSU5URVJGQUNFKElPTVgsIGRhdGEsIHJlcGx5KTsKIAotICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKHZvaWQqKWRhdGEucmVhZEludFB0cigpOworICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKG5vZGVfaWQpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXggPSBzdGF0aWNfY2FzdDxPTVhfSU5ERVhUWVBFPihkYXRhLnJlYWRJbnQzMigpKTsKIAotICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBkYXRhLnJlYWRJbnQ2NCgpOwogCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBOT1RfRU5PVUdIX0RBVEE7CiAgICAgICAgICAgICB2b2lkICpwYXJhbXMgPSBOVUxMOwpAQCAtNjg4LDcgKzcwOCw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIENIRUNLX09NWF9JTlRFUkZBQ0UoSU9NWCwgZGF0YSwgcmVwbHkpOwogCi0gICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAodm9pZCopZGF0YS5yZWFkSW50UHRyKCk7CisgICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAobm9kZV9pZClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgT01YX1NUQVRFVFlQRSBzdGF0ZSA9IE9NWF9TdGF0ZUludmFsaWQ7CiAKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGdldFN0YXRlKG5vZGUsICZzdGF0ZSk7CkBAIC03MDIsNyArNzIyLDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7CiAKLSAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9ICh2b2lkKilkYXRhLnJlYWRJbnRQdHIoKTsKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9IChub2RlX2lkKWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXggPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgT01YX0JPT0wgZW5hYmxlID0gKE9NWF9CT09MKWRhdGEucmVhZEludDMyKCk7CiAKQEAgLTcxNiw3ICs3MzYsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19PTVhfSU5URVJGQUNFKElPTVgsIGRhdGEsIHJlcGx5KTsKIAotICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKHZvaWQqKWRhdGEucmVhZEludFB0cigpOworICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKG5vZGVfaWQpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydF9pbmRleCA9IGRhdGEucmVhZEludDMyKCk7CiAKICAgICAgICAgICAgIE9NWF9VMzIgdXNhZ2UgPSAwOwpAQCAtNzMxLDcgKzc1MSw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIENIRUNLX09NWF9JTlRFUkZBQ0UoSU9NWCwgZGF0YSwgcmVwbHkpOwogCi0gICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAodm9pZCopZGF0YS5yZWFkSW50UHRyKCk7CisgICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAobm9kZV9pZClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgT01YX1UzMiBwb3J0X2luZGV4ID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHNwPElNZW1vcnk+IHBhcmFtcyA9CiAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOwpAQCAtNzQyLDcgKzc2Miw3IEBACiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihlcnIpOwogCiAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50UHRyKChpbnRwdHJfdClidWZmZXIpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KWJ1ZmZlcik7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKQEAgLTc1Miw3ICs3NzIsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19PTVhfSU5URVJGQUNFKElPTVgsIGRhdGEsIHJlcGx5KTsKIAotICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKHZvaWQqKWRhdGEucmVhZEludFB0cigpOworICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKG5vZGVfaWQpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydF9pbmRleCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBncmFwaGljQnVmZmVyID0gbmV3IEdyYXBoaWNCdWZmZXIoKTsKICAgICAgICAgICAgIGRhdGEucmVhZCgqZ3JhcGhpY0J1ZmZlcik7CkBAIC03NjMsNyArNzgzLDcgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGVycik7CiAKICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnRQdHIoKGludHB0cl90KWJ1ZmZlcik7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoKGludDMyX3QpYnVmZmVyKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtNzczLDExICs3OTMsMTEgQEAKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7CiAKLSAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9ICh2b2lkKilkYXRhLnJlYWRJbnRQdHIoKTsKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9IChub2RlX2lkKWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXggPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gZ3JhcGhpY0J1ZmZlciA9IG5ldyBHcmFwaGljQnVmZmVyKCk7CiAgICAgICAgICAgICBkYXRhLnJlYWQoKmdyYXBoaWNCdWZmZXIpOwotICAgICAgICAgICAgYnVmZmVyX2lkIGJ1ZmZlciA9ICh2b2lkKilkYXRhLnJlYWRJbnRQdHIoKTsKKyAgICAgICAgICAgIGJ1ZmZlcl9pZCBidWZmZXIgPSAoYnVmZmVyX2lkKWRhdGEucmVhZEludDMyKCk7CiAKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHVwZGF0ZUdyYXBoaWNCdWZmZXJJbk1ldGEoCiAgICAgICAgICAgICAgICAgICAgIG5vZGUsIHBvcnRfaW5kZXgsIGdyYXBoaWNCdWZmZXIsIGJ1ZmZlcik7CkBAIC03OTAsNyArODEwLDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7CiAKLSAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9ICh2b2lkKilkYXRhLnJlYWRJbnRQdHIoKTsKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9IChub2RlX2lkKWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXggPSBkYXRhLnJlYWRJbnQzMigpOwogCiAgICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBidWZmZXJQcm9kdWNlcjsKQEAgLTgxMCw3ICs4MzAsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19PTVhfSU5URVJGQUNFKElPTVgsIGRhdGEsIHJlcGx5KTsKIAotICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKHZvaWQqKWRhdGEucmVhZEludFB0cigpOworICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKG5vZGVfaWQpZGF0YS5yZWFkSW50MzIoKTsKIAogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbShub2RlKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGVycik7CkBAIC04MjIsNyArODQyLDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7CiAKLSAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9ICh2b2lkKilkYXRhLnJlYWRJbnRQdHIoKTsKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9IChub2RlX2lkKWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXggPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgT01YX0JPT0wgZW5hYmxlID0gKE9NWF9CT09MKWRhdGEucmVhZEludDMyKCk7CiAKQEAgLTgzOSw3ICs4NTksNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19PTVhfSU5URVJGQUNFKElPTVgsIGRhdGEsIHJlcGx5KTsKIAotICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKHZvaWQqKWRhdGEucmVhZEludFB0cigpOworICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKG5vZGVfaWQpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydF9pbmRleCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBPTVhfQk9PTCBlbmFibGUgPSAoT01YX0JPT0wpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIE9NWF9VMzIgbWF4X3dpZHRoID0gZGF0YS5yZWFkSW50MzIoKTsKQEAgLTg1MiwxMSArODcyLDMxIEBACiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIENPTkZJR1VSRV9WSURFT19UVU5ORUxfTU9ERToKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7CisKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9IChub2RlX2lkKWRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXggPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgT01YX0JPT0wgdHVubmVsZWQgPSAoT01YX0JPT0wpZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIE9NWF9VMzIgYXVkaW9faHdfc3luYyA9IGRhdGEucmVhZEludDMyKCk7CisKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqc2lkZWJhbmRfaGFuZGxlID0gTlVMTDsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGNvbmZpZ3VyZVZpZGVvVHVubmVsTW9kZSgKKyAgICAgICAgICAgICAgICAgICAgbm9kZSwgcG9ydF9pbmRleCwgdHVubmVsZWQsIGF1ZGlvX2h3X3N5bmMsICZzaWRlYmFuZF9oYW5kbGUpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZXJyKTsKKyAgICAgICAgICAgIGlmKGVyciA9PSBPSyl7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlTmF0aXZlSGFuZGxlKHNpZGViYW5kX2hhbmRsZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgQUxMT0NfQlVGRkVSOgogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19PTVhfSU5URVJGQUNFKElPTVgsIGRhdGEsIHJlcGx5KTsKIAotICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKHZvaWQqKWRhdGEucmVhZEludFB0cigpOworICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKG5vZGVfaWQpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydF9pbmRleCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBpZiAoIWlzU2VjdXJlKG5vZGUpIHx8IHBvcnRfaW5kZXggIT0gMCAvKiBrUG9ydEluZGV4SW5wdXQgKi8pIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiYi8yNDMxMDQyMyIpOwpAQCAtODY0LDcgKzkwNCw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IGRhdGEucmVhZEludDY0KCk7CiAKICAgICAgICAgICAgIGJ1ZmZlcl9pZCBidWZmZXI7CiAgICAgICAgICAgICB2b2lkICpidWZmZXJfZGF0YTsKQEAgLTg3Myw4ICs5MTMsOCBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZXJyKTsKIAogICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludFB0cigoaW50cHRyX3QpYnVmZmVyKTsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnRQdHIoKGludHB0cl90KWJ1ZmZlcl9kYXRhKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigoaW50MzJfdClidWZmZXIpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDY0KCh1aW50cHRyX3QpYnVmZmVyX2RhdGEpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC04ODQsNyArOTI0LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7CiAKLSAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9ICh2b2lkKilkYXRhLnJlYWRJbnRQdHIoKTsKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9IChub2RlX2lkKWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXggPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgc3A8SU1lbW9yeT4gcGFyYW1zID0KICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CkBAIC04OTYsNyArOTM2LDcgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGVycik7CiAKICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnRQdHIoKGludHB0cl90KWJ1ZmZlcik7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoKGludDMyX3QpYnVmZmVyKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtOTA2LDkgKzk0Niw5IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIENIRUNLX09NWF9JTlRFUkZBQ0UoSU9NWCwgZGF0YSwgcmVwbHkpOwogCi0gICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAodm9pZCopZGF0YS5yZWFkSW50UHRyKCk7CisgICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAobm9kZV9pZClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgT01YX1UzMiBwb3J0X2luZGV4ID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGJ1ZmZlcl9pZCBidWZmZXIgPSAodm9pZCopZGF0YS5yZWFkSW50UHRyKCk7CisgICAgICAgICAgICBidWZmZXJfaWQgYnVmZmVyID0gKGJ1ZmZlcl9pZClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZnJlZUJ1ZmZlcihub2RlLCBwb3J0X2luZGV4LCBidWZmZXIpKTsKIAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtOTE4LDggKzk1OCw4IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIENIRUNLX09NWF9JTlRFUkZBQ0UoSU9NWCwgZGF0YSwgcmVwbHkpOwogCi0gICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAodm9pZCopZGF0YS5yZWFkSW50UHRyKCk7Ci0gICAgICAgICAgICBidWZmZXJfaWQgYnVmZmVyID0gKHZvaWQqKWRhdGEucmVhZEludFB0cigpOworICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKG5vZGVfaWQpZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGJ1ZmZlcl9pZCBidWZmZXIgPSAoYnVmZmVyX2lkKWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihmaWxsQnVmZmVyKG5vZGUsIGJ1ZmZlcikpOwogCiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC05MjksOCArOTY5LDggQEAKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7CiAKLSAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9ICh2b2lkKilkYXRhLnJlYWRJbnRQdHIoKTsKLSAgICAgICAgICAgIGJ1ZmZlcl9pZCBidWZmZXIgPSAodm9pZCopZGF0YS5yZWFkSW50UHRyKCk7CisgICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAobm9kZV9pZClkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYnVmZmVyX2lkIGJ1ZmZlciA9IChidWZmZXJfaWQpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIE9NWF9VMzIgcmFuZ2Vfb2Zmc2V0ID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIE9NWF9VMzIgcmFuZ2VfbGVuZ3RoID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIE9NWF9VMzIgZmxhZ3MgPSBkYXRhLnJlYWRJbnQzMigpOwpAQCAtOTQ4LDcgKzk4OCw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIENIRUNLX09NWF9JTlRFUkZBQ0UoSU9NWCwgZGF0YSwgcmVwbHkpOwogCi0gICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAodm9pZCopZGF0YS5yZWFkSW50UHRyKCk7CisgICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAobm9kZV9pZClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgY29uc3QgY2hhciAqcGFyYW1ldGVyX25hbWUgPSBkYXRhLnJlYWRDU3RyaW5nKCk7CiAKICAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXg7CkBAIC05ODEsNiArMTAyMSw4IEBACiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YT2JzZXJ2ZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGUoJm1zZywgc2l6ZW9mKG1zZykpOwogCisgICAgICAgIEFMT0dWKCJvbk1lc3NhZ2Ugd3JpdGluZyBtZXNzYWdlICVkLCBzaXplICV6dSIsIG1zZy50eXBlLCBzaXplb2YobXNnKSk7CisKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KE9CU0VSVkVSX09OX01TRywgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7CiAgICAgfQogfTsKQEAgLTk5Nyw2ICsxMDM5LDggQEAKICAgICAgICAgICAgIG9teF9tZXNzYWdlIG1zZzsKICAgICAgICAgICAgIGRhdGEucmVhZCgmbXNnLCBzaXplb2YobXNnKSk7CiAKKyAgICAgICAgICAgIEFMT0dWKCJvblRyYW5zYWN0IHJlYWRpbmcgbWVzc2FnZSAlZCwgc2l6ZSAlenUiLCBtc2cudHlwZSwgc2l6ZW9mKG1zZykpOworCiAgICAgICAgICAgICAvLyBYWFggQ291bGQgdXNlIHJlYWRJbnBsYWNlIG1heWJlPwogICAgICAgICAgICAgb25NZXNzYWdlKG1zZyk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lTdHJlYW1Tb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvSVN0cmVhbVNvdXJjZS5jcHAKaW5kZXggNjhmZmNhOC4uZmUyY2M2MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSVN0cmVhbVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSVN0cmVhbVNvdXJjZS5jcHAKQEAgLTYyLDcgKzYyLDcgQEAKICAgICB2aXJ0dWFsIHZvaWQgc2V0QnVmZmVycyhjb25zdCBWZWN0b3I8c3A8SU1lbW9yeT4gPiAmYnVmZmVycykgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU3RyZWFtU291cmNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oYnVmZmVycy5zaXplKCkpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDY0KHN0YXRpY19jYXN0PGludDY0X3Q+KGJ1ZmZlcnMuc2l6ZSgpKSk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYnVmZmVycy5zaXplKCk7ICsraSkgewogICAgICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihidWZmZXJzLml0ZW1BdChpKS0+YXNCaW5kZXIoKSk7CiAgICAgICAgIH0KQEAgLTcyLDcgKzcyLDcgQEAKICAgICB2aXJ0dWFsIHZvaWQgb25CdWZmZXJBdmFpbGFibGUoc2l6ZV90IGluZGV4KSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTdHJlYW1Tb3VyY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PihpbmRleCkpOworICAgICAgICBkYXRhLndyaXRlSW50NjQoc3RhdGljX2Nhc3Q8aW50NjRfdD4oaW5kZXgpKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KAogICAgICAgICAgICAgICAgIE9OX0JVRkZFUl9BVkFJTEFCTEUsIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOwogICAgIH0KQEAgLTEwMiw3ICsxMDIsNyBAQAogICAgICAgICBjYXNlIFNFVF9CVUZGRVJTOgogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVN0cmVhbVNvdXJjZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc2l6ZV90IG4gPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgc2l6ZV90IG4gPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGRhdGEucmVhZEludDY0KCkpOwogICAgICAgICAgICAgVmVjdG9yPHNwPElNZW1vcnk+ID4gYnVmZmVyczsKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICAgICAgICAgc3A8SU1lbW9yeT4gbWVtID0KQEAgLTExNyw3ICsxMTcsNyBAQAogICAgICAgICBjYXNlIE9OX0JVRkZFUl9BVkFJTEFCTEU6CiAgICAgICAgIHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU3RyZWFtU291cmNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBvbkJ1ZmZlckF2YWlsYWJsZShzdGF0aWNfY2FzdDxzaXplX3Q+KGRhdGEucmVhZEludDMyKCkpKTsKKyAgICAgICAgICAgIG9uQnVmZmVyQXZhaWxhYmxlKHN0YXRpY19jYXN0PHNpemVfdD4oZGF0YS5yZWFkSW50NjQoKSkpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTQ1LDggKzE0NSw4IEBACiAgICAgdmlydHVhbCB2b2lkIHF1ZXVlQnVmZmVyKHNpemVfdCBpbmRleCwgc2l6ZV90IHNpemUpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVN0cmVhbUxpc3RlbmVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oaW5kZXgpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KHNpemUpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDY0KHN0YXRpY19jYXN0PGludDY0X3Q+KGluZGV4KSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQ2NChzdGF0aWNfY2FzdDxpbnQ2NF90PihzaXplKSk7CiAKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFFVRVVFX0JVRkZFUiwgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7CiAgICAgfQpAQCAtMTc3LDggKzE3Nyw4IEBACiAgICAgICAgIGNhc2UgUVVFVUVfQlVGRkVSOgogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVN0cmVhbUxpc3RlbmVyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzaXplX3QgaW5kZXggPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgc2l6ZV90IGluZGV4ID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihkYXRhLnJlYWRJbnQ2NCgpKTsKKyAgICAgICAgICAgIHNpemVfdCBzaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihkYXRhLnJlYWRJbnQ2NCgpKTsKIAogICAgICAgICAgICAgcXVldWVCdWZmZXIoaW5kZXgsIHNpemUpOwogICAgICAgICAgICAgYnJlYWs7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9KZXRQbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSmV0UGxheWVyLmNwcAppbmRleCBlOTE0YjM0Li5mMGYxODMyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9KZXRQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0pldFBsYXllci5jcHAKQEAgLTkwLDcgKzkwLDcgQEAKICAgICAgICAgICAgIHBMaWJDb25maWctPnNhbXBsZVJhdGUsCiAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChwTGliQ29uZmlnLT5udW1DaGFubmVscyksCi0gICAgICAgICAgICBtVHJhY2tCdWZmZXJTaXplLAorICAgICAgICAgICAgKHNpemVfdCkgbVRyYWNrQnVmZmVyU2l6ZSwKICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUpOwogCiAgICAgLy8gY3JlYXRlIHJlbmRlciBhbmQgcGxheWJhY2sgdGhyZWFkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NZWRpYUNvZGVjSW5mby5jcHAgYi9tZWRpYS9saWJtZWRpYS9NZWRpYUNvZGVjSW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I0YzRlMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL01lZGlhQ29kZWNJbmZvLmNwcApAQCAtMCwwICsxLDI2NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNZWRpYUNvZGVjSW5mbyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNJbmZvLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3ZvaWQgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6Z2V0U3VwcG9ydGVkUHJvZmlsZUxldmVscygKKyAgICAgICAgVmVjdG9yPFByb2ZpbGVMZXZlbD4gKnByb2ZpbGVMZXZlbHMpIGNvbnN0IHsKKyAgICBwcm9maWxlTGV2ZWxzLT5jbGVhcigpOworICAgIHByb2ZpbGVMZXZlbHMtPmFwcGVuZFZlY3RvcihtUHJvZmlsZUxldmVscyk7Cit9CisKK3ZvaWQgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6Z2V0U3VwcG9ydGVkQ29sb3JGb3JtYXRzKAorICAgICAgICBWZWN0b3I8dWludDMyX3Q+ICpjb2xvckZvcm1hdHMpIGNvbnN0IHsKKyAgICBjb2xvckZvcm1hdHMtPmNsZWFyKCk7CisgICAgY29sb3JGb3JtYXRzLT5hcHBlbmRWZWN0b3IobUNvbG9yRm9ybWF0cyk7Cit9CisKK3VpbnQzMl90IE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OmdldEZsYWdzKCkgY29uc3QgeworICAgIHJldHVybiBtRmxhZ3M7Cit9CisKK2NvbnN0IHNwPEFNZXNzYWdlPiBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjpnZXREZXRhaWxzKCkgY29uc3QgeworICAgIHJldHVybiBtRGV0YWlsczsKK30KKworTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6Q2FwYWJpbGl0aWVzKCkKKyAgOiBtRmxhZ3MoMCkgeworICAgIG1EZXRhaWxzID0gbmV3IEFNZXNzYWdlOworfQorCisvLyBzdGF0aWMKK3NwPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM+IE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OkZyb21QYXJjZWwoCisgICAgICAgIGNvbnN0IFBhcmNlbCAmcGFyY2VsKSB7CisgICAgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4gY2FwcyA9IG5ldyBDYXBhYmlsaXRpZXMoKTsKKyAgICBzaXplX3Qgc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4ocGFyY2VsLnJlYWRJbnQzMigpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBQcm9maWxlTGV2ZWwgcHJvZmlsZUxldmVsOworICAgICAgICBwcm9maWxlTGV2ZWwubVByb2ZpbGUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocGFyY2VsLnJlYWRJbnQzMigpKTsKKyAgICAgICAgcHJvZmlsZUxldmVsLm1MZXZlbCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihwYXJjZWwucmVhZEludDMyKCkpOworICAgICAgICBpZiAoY2FwcyAhPSBOVUxMKSB7CisgICAgICAgICAgICBjYXBzLT5tUHJvZmlsZUxldmVscy5wdXNoX2JhY2socHJvZmlsZUxldmVsKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihwYXJjZWwucmVhZEludDMyKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIHVpbnQzMl90IGNvbG9yID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHBhcmNlbC5yZWFkSW50MzIoKSk7CisgICAgICAgIGlmIChjYXBzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGNhcHMtPm1Db2xvckZvcm1hdHMucHVzaF9iYWNrKGNvbG9yKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB1aW50MzJfdCBmbGFncyA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihwYXJjZWwucmVhZEludDMyKCkpOworICAgIHNwPEFNZXNzYWdlPiBkZXRhaWxzID0gQU1lc3NhZ2U6OkZyb21QYXJjZWwocGFyY2VsKTsKKyAgICBpZiAoY2FwcyAhPSBOVUxMKSB7CisgICAgICAgIGNhcHMtPm1GbGFncyA9IGZsYWdzOworICAgICAgICBjYXBzLT5tRGV0YWlscyA9IGRldGFpbHM7CisgICAgfQorICAgIHJldHVybiBjYXBzOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdCB7CisgICAgQ0hFQ0tfTEUobVByb2ZpbGVMZXZlbHMuc2l6ZSgpLCBJTlQzMl9NQVgpOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtUHJvZmlsZUxldmVscy5zaXplKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVByb2ZpbGVMZXZlbHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKG1Qcm9maWxlTGV2ZWxzLml0ZW1BdChpKS5tUHJvZmlsZSk7CisgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtUHJvZmlsZUxldmVscy5pdGVtQXQoaSkubUxldmVsKTsKKyAgICB9CisgICAgQ0hFQ0tfTEUobUNvbG9yRm9ybWF0cy5zaXplKCksIElOVDMyX01BWCk7CisgICAgcGFyY2VsLT53cml0ZUludDMyKG1Db2xvckZvcm1hdHMuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db2xvckZvcm1hdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKG1Db2xvckZvcm1hdHMuaXRlbUF0KGkpKTsKKyAgICB9CisgICAgcGFyY2VsLT53cml0ZUludDMyKG1GbGFncyk7CisgICAgbURldGFpbHMtPndyaXRlVG9QYXJjZWwocGFyY2VsKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgTWVkaWFDb2RlY0luZm86OmlzRW5jb2RlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gbUlzRW5jb2RlcjsKK30KKworYm9vbCBNZWRpYUNvZGVjSW5mbzo6aGFzUXVpcmsoY29uc3QgY2hhciAqbmFtZSkgY29uc3QgeworICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBtUXVpcmtzLnNpemUoKTsgaXgrKykgeworICAgICAgICBpZiAobVF1aXJrcy5pdGVtQXQoaXgpLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBNZWRpYUNvZGVjSW5mbzo6Z2V0U3VwcG9ydGVkTWltZXMoVmVjdG9yPEFTdHJpbmc+ICptaW1lcykgY29uc3QgeworICAgIG1pbWVzLT5jbGVhcigpOworICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBtQ2Fwcy5zaXplKCk7IGl4KyspIHsKKyAgICAgICAgbWltZXMtPnB1c2hfYmFjayhtQ2Fwcy5rZXlBdChpeCkpOworICAgIH0KK30KKworY29uc3Qgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4KK01lZGlhQ29kZWNJbmZvOjpnZXRDYXBhYmlsaXRpZXNGb3IoY29uc3QgY2hhciAqbWltZSkgY29uc3QgeworICAgIHNzaXplX3QgaXggPSBnZXRDYXBhYmlsaXR5SW5kZXgobWltZSk7CisgICAgaWYgKGl4ID49IDApIHsKKyAgICAgICAgcmV0dXJuIG1DYXBzLnZhbHVlQXQoaXgpOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworY29uc3QgY2hhciAqTWVkaWFDb2RlY0luZm86OmdldENvZGVjTmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbU5hbWUuY19zdHIoKTsKK30KKworLy8gc3RhdGljCitzcDxNZWRpYUNvZGVjSW5mbz4gTWVkaWFDb2RlY0luZm86OkZyb21QYXJjZWwoY29uc3QgUGFyY2VsICZwYXJjZWwpIHsKKyAgICBBU3RyaW5nIG5hbWUgPSBBU3RyaW5nOjpGcm9tUGFyY2VsKHBhcmNlbCk7CisgICAgYm9vbCBpc0VuY29kZXIgPSBzdGF0aWNfY2FzdDxib29sPihwYXJjZWwucmVhZEludDMyKCkpOworICAgIHNwPE1lZGlhQ29kZWNJbmZvPiBpbmZvID0gbmV3IE1lZGlhQ29kZWNJbmZvKG5hbWUsIGlzRW5jb2RlciwgTlVMTCk7CisgICAgc2l6ZV90IHNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHBhcmNlbC5yZWFkSW50MzIoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgQVN0cmluZyBxdWlyayA9IEFTdHJpbmc6OkZyb21QYXJjZWwocGFyY2VsKTsKKyAgICAgICAgaWYgKGluZm8gIT0gTlVMTCkgeworICAgICAgICAgICAgaW5mby0+bVF1aXJrcy5wdXNoX2JhY2socXVpcmspOworICAgICAgICB9CisgICAgfQorICAgIHNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHBhcmNlbC5yZWFkSW50MzIoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgQVN0cmluZyBtaW1lID0gQVN0cmluZzo6RnJvbVBhcmNlbChwYXJjZWwpOworICAgICAgICBzcDxDYXBhYmlsaXRpZXM+IGNhcHMgPSBDYXBhYmlsaXRpZXM6OkZyb21QYXJjZWwocGFyY2VsKTsKKyAgICAgICAgaWYgKGluZm8gIT0gTlVMTCkgeworICAgICAgICAgICAgaW5mby0+bUNhcHMuYWRkKG1pbWUsIGNhcHMpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbmZvOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjSW5mbzo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3QgeworICAgIG1OYW1lLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKKyAgICBwYXJjZWwtPndyaXRlSW50MzIobUlzRW5jb2Rlcik7CisgICAgcGFyY2VsLT53cml0ZUludDMyKG1RdWlya3Muc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1RdWlya3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbVF1aXJrcy5pdGVtQXQoaSkud3JpdGVUb1BhcmNlbChwYXJjZWwpOworICAgIH0KKyAgICBwYXJjZWwtPndyaXRlSW50MzIobUNhcHMuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DYXBzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1DYXBzLmtleUF0KGkpLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKKyAgICAgICAgbUNhcHMudmFsdWVBdChpKS0+d3JpdGVUb1BhcmNlbChwYXJjZWwpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3NzaXplX3QgTWVkaWFDb2RlY0luZm86OmdldENhcGFiaWxpdHlJbmRleChjb25zdCBjaGFyICptaW1lKSBjb25zdCB7CisgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IG1DYXBzLnNpemUoKTsgaXgrKykgeworICAgICAgICBpZiAobUNhcHMua2V5QXQoaXgpLmVxdWFsc0lnbm9yZUNhc2UobWltZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBpeDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKK01lZGlhQ29kZWNJbmZvOjpNZWRpYUNvZGVjSW5mbyhBU3RyaW5nIG5hbWUsIGJvb2wgZW5jb2RlciwgY29uc3QgY2hhciAqbWltZSkKKyAgICA6IG1OYW1lKG5hbWUpLAorICAgICAgbUlzRW5jb2RlcihlbmNvZGVyKSwKKyAgICAgIG1IYXNTb2xlTWltZShmYWxzZSkgeworICAgIGlmIChtaW1lICE9IE5VTEwpIHsKKyAgICAgICAgYWRkTWltZShtaW1lKTsKKyAgICAgICAgbUhhc1NvbGVNaW1lID0gdHJ1ZTsKKyAgICB9Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWNJbmZvOjphZGRNaW1lKGNvbnN0IGNoYXIgKm1pbWUpIHsKKyAgICBpZiAobUhhc1NvbGVNaW1lKSB7CisgICAgICAgIEFMT0dFKCJDb2RlYyAnJXMnIGFscmVhZHkgaGFkIGl0cyB0eXBlIHNwZWNpZmllZCIsIG1OYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgc3NpemVfdCBpeCA9IGdldENhcGFiaWxpdHlJbmRleChtaW1lKTsKKyAgICBpZiAoaXggPj0gMCkgeworICAgICAgICBtQ3VycmVudENhcHMgPSBtQ2Fwcy52YWx1ZUF0KGl4KTsKKyAgICB9IGVsc2UgeworICAgICAgICBtQ3VycmVudENhcHMgPSBuZXcgQ2FwYWJpbGl0aWVzKCk7CisgICAgICAgIG1DYXBzLmFkZChBU3RyaW5nKG1pbWUpLCBtQ3VycmVudENhcHMpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTWVkaWFDb2RlY0luZm86OnJlbW92ZU1pbWUoY29uc3QgY2hhciAqbWltZSkgeworICAgIHNzaXplX3QgaXggPSBnZXRDYXBhYmlsaXR5SW5kZXgobWltZSk7CisgICAgaWYgKGl4ID49IDApIHsKKyAgICAgICAgbUNhcHMucmVtb3ZlSXRlbXNBdChpeCk7CisgICAgICAgIC8vIG1DdXJyZW50Q2FwcyB3aWxsIGJlIHJlbW92ZWQgd2hlbiBjb21wbGV0ZWQKKyAgICB9Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWNJbmZvOjppbml0aWFsaXplQ2FwYWJpbGl0aWVzKGNvbnN0IENvZGVjQ2FwYWJpbGl0aWVzICZjYXBzKSB7CisgICAgbUN1cnJlbnRDYXBzLT5tUHJvZmlsZUxldmVscy5jbGVhcigpOworICAgIG1DdXJyZW50Q2Fwcy0+bUNvbG9yRm9ybWF0cy5jbGVhcigpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXBzLm1Qcm9maWxlTGV2ZWxzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGNvbnN0IENvZGVjUHJvZmlsZUxldmVsICZzcmMgPSBjYXBzLm1Qcm9maWxlTGV2ZWxzLml0ZW1BdChpKTsKKworICAgICAgICBQcm9maWxlTGV2ZWwgcHJvZmlsZUxldmVsOworICAgICAgICBwcm9maWxlTGV2ZWwubVByb2ZpbGUgPSBzcmMubVByb2ZpbGU7CisgICAgICAgIHByb2ZpbGVMZXZlbC5tTGV2ZWwgPSBzcmMubUxldmVsOworICAgICAgICBtQ3VycmVudENhcHMtPm1Qcm9maWxlTGV2ZWxzLnB1c2hfYmFjayhwcm9maWxlTGV2ZWwpOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2Fwcy5tQ29sb3JGb3JtYXRzLnNpemUoKTsgKytpKSB7CisgICAgICAgIG1DdXJyZW50Q2Fwcy0+bUNvbG9yRm9ybWF0cy5wdXNoX2JhY2soY2Fwcy5tQ29sb3JGb3JtYXRzLml0ZW1BdChpKSk7CisgICAgfQorCisgICAgbUN1cnJlbnRDYXBzLT5tRmxhZ3MgPSBjYXBzLm1GbGFnczsKKyAgICBtQ3VycmVudENhcHMtPm1EZXRhaWxzID0gbmV3IEFNZXNzYWdlOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIE1lZGlhQ29kZWNJbmZvOjphZGRRdWlyayhjb25zdCBjaGFyICpuYW1lKSB7CisgICAgaWYgKCFoYXNRdWlyayhuYW1lKSkgeworICAgICAgICBtUXVpcmtzLnB1c2gobmFtZSk7CisgICAgfQorfQorCit2b2lkIE1lZGlhQ29kZWNJbmZvOjpjb21wbGV0ZSgpIHsKKyAgICBtQ3VycmVudENhcHMgPSBOVUxMOworfQorCit2b2lkIE1lZGlhQ29kZWNJbmZvOjphZGREZXRhaWwoY29uc3QgQVN0cmluZyAma2V5LCBjb25zdCBBU3RyaW5nICZ2YWx1ZSkgeworICAgIG1DdXJyZW50Q2Fwcy0+bURldGFpbHMtPnNldFN0cmluZyhrZXkuY19zdHIoKSwgdmFsdWUuY19zdHIoKSk7Cit9CisKK3ZvaWQgTWVkaWFDb2RlY0luZm86OmFkZEZlYXR1cmUoY29uc3QgQVN0cmluZyAma2V5LCBpbnQzMl90IHZhbHVlKSB7CisgICAgQVN0cmluZyB0YWcgPSAiZmVhdHVyZS0iOworICAgIHRhZy5hcHBlbmQoa2V5KTsKKyAgICBtQ3VycmVudENhcHMtPm1EZXRhaWxzLT5zZXRJbnQzMih0YWcuY19zdHIoKSwgdmFsdWUpOworfQorCit2b2lkIE1lZGlhQ29kZWNJbmZvOjphZGRGZWF0dXJlKGNvbnN0IEFTdHJpbmcgJmtleSwgY29uc3QgY2hhciAqdmFsdWUpIHsKKyAgICBBU3RyaW5nIHRhZyA9ICJmZWF0dXJlLSI7CisgICAgdGFnLmFwcGVuZChrZXkpOworICAgIG1DdXJyZW50Q2Fwcy0+bURldGFpbHMtPnNldFN0cmluZyh0YWcuY19zdHIoKSwgdmFsdWUpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVByb2ZpbGVzLmNwcAppbmRleCA4MzE5Y2Q3Li5lMmU2MDQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9NZWRpYVByb2ZpbGVzLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVByb2ZpbGVzLmNwcApAQCAtNjksNiArNjksNyBAQAogICAgIHsiNDgwcCIsIENBTUNPUkRFUl9RVUFMSVRZXzQ4MFB9LAogICAgIHsiNzIwcCIsIENBTUNPUkRFUl9RVUFMSVRZXzcyMFB9LAogICAgIHsiMTA4MHAiLCBDQU1DT1JERVJfUVVBTElUWV8xMDgwUH0sCisgICAgeyIyMTYwcCIsIENBTUNPUkRFUl9RVUFMSVRZXzIxNjBQfSwKICAgICB7InF2Z2EiLCBDQU1DT1JERVJfUVVBTElUWV9RVkdBfSwKIAogICAgIHsidGltZWxhcHNlbG93IiwgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfTE9XfSwKQEAgLTc4LDExICs3OSwyNSBAQAogICAgIHsidGltZWxhcHNlNDgwcCIsIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfNDgwUH0sCiAgICAgeyJ0aW1lbGFwc2U3MjBwIiwgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV83MjBQfSwKICAgICB7InRpbWVsYXBzZTEwODBwIiwgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV8xMDgwUH0sCisgICAgeyJ0aW1lbGFwc2UyMTYwcCIsIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfMjE2MFB9LAogICAgIHsidGltZWxhcHNlcXZnYSIsIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfUVZHQX0sCisKKyAgICB7ImhpZ2hzcGVlZGxvdyIsICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEX0xPV30sCisgICAgeyJoaWdoc3BlZWRoaWdoIiwgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF9ISUdIfSwKKyAgICB7ImhpZ2hzcGVlZDQ4MHAiLCBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEXzQ4MFB9LAorICAgIHsiaGlnaHNwZWVkNzIwcCIsIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfNzIwUH0sCisgICAgeyJoaWdoc3BlZWQxMDgwcCIsIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfMTA4MFB9LAorICAgIHsiaGlnaHNwZWVkMjE2MHAiLCBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEXzIxNjBQfSwKIH07CiAKKyNpZiBMT0dfTkRFQlVHCisjZGVmaW5lIFVOVVNFRCBfX3VudXNlZAorI2Vsc2UKKyNkZWZpbmUgVU5VU0VECisjZW5kaWYKKwogLypzdGF0aWMqLyB2b2lkCi1NZWRpYVByb2ZpbGVzOjpsb2dWaWRlb0NvZGVjKGNvbnN0IE1lZGlhUHJvZmlsZXM6OlZpZGVvQ29kZWMmIGNvZGVjKQorTWVkaWFQcm9maWxlczo6bG9nVmlkZW9Db2RlYyhjb25zdCBNZWRpYVByb2ZpbGVzOjpWaWRlb0NvZGVjJiBjb2RlYyBVTlVTRUQpCiB7CiAgICAgQUxPR1YoInZpZGVvIGNvZGVjOiIpOwogICAgIEFMT0dWKCJjb2RlYyA9ICVkIiwgY29kZWMubUNvZGVjKTsKQEAgLTkzLDcgKzEwOCw3IEBACiB9CiAKIC8qc3RhdGljKi8gdm9pZAotTWVkaWFQcm9maWxlczo6bG9nQXVkaW9Db2RlYyhjb25zdCBNZWRpYVByb2ZpbGVzOjpBdWRpb0NvZGVjJiBjb2RlYykKK01lZGlhUHJvZmlsZXM6OmxvZ0F1ZGlvQ29kZWMoY29uc3QgTWVkaWFQcm9maWxlczo6QXVkaW9Db2RlYyYgY29kZWMgVU5VU0VEKQogewogICAgIEFMT0dWKCJhdWRpbyBjb2RlYzoiKTsKICAgICBBTE9HVigiY29kZWMgPSAlZCIsIGNvZGVjLm1Db2RlYyk7CkBAIC0xMDMsNyArMTE4LDcgQEAKIH0KIAogLypzdGF0aWMqLyB2b2lkCi1NZWRpYVByb2ZpbGVzOjpsb2dWaWRlb0VuY29kZXJDYXAoY29uc3QgTWVkaWFQcm9maWxlczo6VmlkZW9FbmNvZGVyQ2FwJiBjYXApCitNZWRpYVByb2ZpbGVzOjpsb2dWaWRlb0VuY29kZXJDYXAoY29uc3QgTWVkaWFQcm9maWxlczo6VmlkZW9FbmNvZGVyQ2FwJiBjYXAgVU5VU0VEKQogewogICAgIEFMT0dWKCJ2aWRlbyBlbmNvZGVyIGNhcDoiKTsKICAgICBBTE9HVigiY29kZWMgPSAlZCIsIGNhcC5tQ29kZWMpOwpAQCAtMTE0LDcgKzEyOSw3IEBACiB9CiAKIC8qc3RhdGljKi8gdm9pZAotTWVkaWFQcm9maWxlczo6bG9nQXVkaW9FbmNvZGVyQ2FwKGNvbnN0IE1lZGlhUHJvZmlsZXM6OkF1ZGlvRW5jb2RlckNhcCYgY2FwKQorTWVkaWFQcm9maWxlczo6bG9nQXVkaW9FbmNvZGVyQ2FwKGNvbnN0IE1lZGlhUHJvZmlsZXM6OkF1ZGlvRW5jb2RlckNhcCYgY2FwIFVOVVNFRCkKIHsKICAgICBBTE9HVigiYXVkaW8gZW5jb2RlciBjYXA6Iik7CiAgICAgQUxPR1YoImNvZGVjID0gJWQiLCBjYXAubUNvZGVjKTsKQEAgLTEyNCwyMSArMTM5LDIxIEBACiB9CiAKIC8qc3RhdGljKi8gdm9pZAotTWVkaWFQcm9maWxlczo6bG9nVmlkZW9EZWNvZGVyQ2FwKGNvbnN0IE1lZGlhUHJvZmlsZXM6OlZpZGVvRGVjb2RlckNhcCYgY2FwKQorTWVkaWFQcm9maWxlczo6bG9nVmlkZW9EZWNvZGVyQ2FwKGNvbnN0IE1lZGlhUHJvZmlsZXM6OlZpZGVvRGVjb2RlckNhcCYgY2FwIFVOVVNFRCkKIHsKICAgICBBTE9HVigidmlkZW8gZGVjb2RlciBjYXA6Iik7CiAgICAgQUxPR1YoImNvZGVjID0gJWQiLCBjYXAubUNvZGVjKTsKIH0KIAogLypzdGF0aWMqLyB2b2lkCi1NZWRpYVByb2ZpbGVzOjpsb2dBdWRpb0RlY29kZXJDYXAoY29uc3QgTWVkaWFQcm9maWxlczo6QXVkaW9EZWNvZGVyQ2FwJiBjYXApCitNZWRpYVByb2ZpbGVzOjpsb2dBdWRpb0RlY29kZXJDYXAoY29uc3QgTWVkaWFQcm9maWxlczo6QXVkaW9EZWNvZGVyQ2FwJiBjYXAgVU5VU0VEKQogewogICAgIEFMT0dWKCJhdWRpbyBjb2RlYyBjYXA6Iik7CiAgICAgQUxPR1YoImNvZGVjID0gJWQiLCBjYXAubUNvZGVjKTsKIH0KIAogLypzdGF0aWMqLyB2b2lkCi1NZWRpYVByb2ZpbGVzOjpsb2dWaWRlb0VkaXRvckNhcChjb25zdCBNZWRpYVByb2ZpbGVzOjpWaWRlb0VkaXRvckNhcCYgY2FwKQorTWVkaWFQcm9maWxlczo6bG9nVmlkZW9FZGl0b3JDYXAoY29uc3QgTWVkaWFQcm9maWxlczo6VmlkZW9FZGl0b3JDYXAmIGNhcCBVTlVTRUQpCiB7CiAgICAgQUxPR1YoInZpZGVvZWRpdG9yIGNhcDoiKTsKICAgICBBTE9HVigibU1heElucHV0RnJhbWVXaWR0aCA9ICVkIiwgY2FwLm1NYXhJbnB1dEZyYW1lV2lkdGgpOwpAQCAtNDY2LDggKzQ4MSwxMyBAQAogICAgICAgICAgICBxdWFsaXR5IDw9IENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfTElTVF9FTkQ7CiB9CiAKK3N0YXRpYyBib29sIGlzSGlnaFNwZWVkUHJvZmlsZShjYW1jb3JkZXJfcXVhbGl0eSBxdWFsaXR5KSB7CisgICAgcmV0dXJuIHF1YWxpdHkgPj0gQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF9MSVNUX1NUQVJUICYmCisgICAgICAgICAgIHF1YWxpdHkgPD0gQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF9MSVNUX0VORDsKK30KKwogdm9pZCBNZWRpYVByb2ZpbGVzOjppbml0UmVxdWlyZWRQcm9maWxlUmVmcyhjb25zdCBWZWN0b3I8aW50PiYgY2FtZXJhSWRzKSB7Ci0gICAgQUxPR1YoIk51bWJlciBvZiBjYW1lcmEgaWRzOiAlZCIsIGNhbWVyYUlkcy5zaXplKCkpOworICAgIEFMT0dWKCJOdW1iZXIgb2YgY2FtZXJhIGlkczogJXp1IiwgY2FtZXJhSWRzLnNpemUoKSk7CiAgICAgQ0hFQ0soY2FtZXJhSWRzLnNpemUoKSA+IDApOwogICAgIG1SZXF1aXJlZFByb2ZpbGVSZWZzID0gbmV3IFJlcXVpcmVkUHJvZmlsZXNbY2FtZXJhSWRzLnNpemUoKV07CiAgICAgZm9yIChzaXplX3QgaSA9IDAsIG4gPSBjYW1lcmFJZHMuc2l6ZSgpOyBpIDwgbjsgKytpKSB7CkBAIC01MTMsMTQgKzUzMywxNyBAQAogICAgICAgICBjYW1jb3JkZXJfcXVhbGl0eSByZWZRdWFsaXR5OwogICAgICAgICBWaWRlb0NvZGVjICpjb2RlYyA9IE5VTEw7CiAKLSAgICAgICAgLy8gQ2hlY2sgaGlnaCBhbmQgbG93IGZyb20gZWl0aGVyIGNhbWNvcmRlciBwcm9maWxlIG9yIHRpbWVsYXBzZSBwcm9maWxlCi0gICAgICAgIC8vIGJ1dCBub3QgYm90aC4gRGVmYXVsdCwgY2hlY2sgY2FtY29yZGVyIHByb2ZpbGUKKyAgICAgICAgLy8gQ2hlY2sgaGlnaCBhbmQgbG93IGZyb20gZWl0aGVyIGNhbWNvcmRlciBwcm9maWxlLCB0aW1lbGFwc2UgcHJvZmlsZQorICAgICAgICAvLyBvciBoaWdoIHNwZWVkIHByb2ZpbGUsIGJ1dCBub3QgYWxsIG9mIHRoZW0uIERlZmF1bHQsIGNoZWNrIGNhbWNvcmRlciBwcm9maWxlCiAgICAgICAgIHNpemVfdCBqID0gMDsKICAgICAgICAgc2l6ZV90IG8gPSAyOwogICAgICAgICBpZiAoaXNUaW1lbGFwc2VQcm9maWxlKHF1YWxpdHkpKSB7CiAgICAgICAgICAgICAvLyBDaGVjayB0aW1lbGFwc2UgcHJvZmlsZSBpbnN0ZWFkLgogICAgICAgICAgICAgaiA9IDI7CiAgICAgICAgICAgICBvID0ga051bVJlcXVpcmVkUHJvZmlsZXM7CisgICAgICAgIH0gZWxzZSBpZiAoaXNIaWdoU3BlZWRQcm9maWxlKHF1YWxpdHkpKSB7CisgICAgICAgICAgICAvLyBTa2lwIHRoZSBjaGVjayBmb3IgaGlnaCBzcGVlZCBwcm9maWxlLgorICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBNdXN0IGJlIGNhbWNvcmRlciBwcm9maWxlLgogICAgICAgICAgICAgQ0hFQ0soaXNDYW1jb3JkZXJQcm9maWxlKHF1YWxpdHkpKTsKQEAgLTU5NCwxNCArNjE3LDE0IEBACiAKICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBnZXRDYW1jb3JkZXJQcm9maWxlSW5kZXgoY2FtZXJhSWQsIHByb2ZpbGUtPm1RdWFsaXR5KTsKICAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlByb2ZpbGUgcXVhbGl0eSAlZCBmb3IgY2FtZXJhICVkIGFscmVhZHkgZXhpc3RzIiwKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlByb2ZpbGUgcXVhbGl0eSAlZCBmb3IgY2FtZXJhICV6dSBhbHJlYWR5IGV4aXN0cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tUXVhbGl0eSwgY2FtZXJhSWQpOwogICAgICAgICAgICAgICAgICAgICBDSEVDSyhpbmRleCA9PSByZWZJbmRleCk7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIEluc2VydCB0aGUgbmV3IHByb2ZpbGUKLSAgICAgICAgICAgICAgICBBTE9HVigiQWRkIGEgcHJvZmlsZTogcXVhbGl0eSAlZD0+JWQgZm9yIGNhbWVyYSAlZCIsCisgICAgICAgICAgICAgICAgQUxPR1YoIkFkZCBhIHByb2ZpbGU6IHF1YWxpdHkgJWQ9PiVkIGZvciBjYW1lcmEgJXp1IiwKICAgICAgICAgICAgICAgICAgICAgICAgIG1DYW1jb3JkZXJQcm9maWxlc1tpbmZvLT5tUmVmUHJvZmlsZUluZGV4XS0+bVF1YWxpdHksCiAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tUXVhbGl0eSwgY2FtZXJhSWQpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NZWRpYVNjYW5uZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyLmNwcAppbmRleCAyOGI1YWE3Li5kY2JiNzY5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9NZWRpYVNjYW5uZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lci5jcHAKQEAgLTIzNyw0ICsyMzcsMjQgQEAKICAgICByZXR1cm4gTUVESUFfU0NBTl9SRVNVTFRfT0s7CiB9CiAKK01lZGlhQWxidW1BcnQgKk1lZGlhQWxidW1BcnQ6OmNsb25lKCkgeworICAgIHNpemVfdCBieXRlX3NpemUgPSB0aGlzLT5zaXplKCkgKyBzaXplb2YoTWVkaWFBbGJ1bUFydCk7CisgICAgTWVkaWFBbGJ1bUFydCAqcmVzdWx0ID0gcmVpbnRlcnByZXRfY2FzdDxNZWRpYUFsYnVtQXJ0ICo+KG1hbGxvYyhieXRlX3NpemUpKTsKKyAgICByZXN1bHQtPm1TaXplID0gdGhpcy0+c2l6ZSgpOworICAgIG1lbWNweSgmcmVzdWx0LT5tRGF0YVswXSwgJnRoaXMtPm1EYXRhWzBdLCB0aGlzLT5zaXplKCkpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgTWVkaWFBbGJ1bUFydDo6aW5pdChNZWRpYUFsYnVtQXJ0ICppbnN0YW5jZSwgaW50MzJfdCBkYXRhU2l6ZSwgY29uc3Qgdm9pZCAqZGF0YSkgeworICAgIGluc3RhbmNlLT5tU2l6ZSA9IGRhdGFTaXplOworICAgIG1lbWNweSgmaW5zdGFuY2UtPm1EYXRhWzBdLCBkYXRhLCBkYXRhU2l6ZSk7Cit9CisKK01lZGlhQWxidW1BcnQgKk1lZGlhQWxidW1BcnQ6OmZyb21EYXRhKGludDMyX3QgZGF0YVNpemUsIGNvbnN0IHZvaWQqIGRhdGEpIHsKKyAgICBzaXplX3QgYnl0ZV9zaXplID0gc2l6ZW9mKE1lZGlhQWxidW1BcnQpICsgZGF0YVNpemU7CisgICAgTWVkaWFBbGJ1bUFydCAqcmVzdWx0ID0gcmVpbnRlcnByZXRfY2FzdDxNZWRpYUFsYnVtQXJ0ICo+KG1hbGxvYyhieXRlX3NpemUpKTsKKyAgICBpbml0KHJlc3VsdCwgZGF0YVNpemUsIGRhdGEpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NZWRpYVNjYW5uZXJDbGllbnQuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyQ2xpZW50LmNwcAppbmRleCA5M2E0YTRjLi45ZjgwM2NiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9NZWRpYVNjYW5uZXJDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lckNsaWVudC5jcHAKQEAgLTE0LDIxNyArMTQsMzggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFTY2FubmVyQ2xpZW50IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFzY2FubmVyLmg+CiAKKyNpbmNsdWRlICJDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmgiCiAjaW5jbHVkZSAiU3RyaW5nQXJyYXkuaCIKIAotI2luY2x1ZGUgImF1dG9kZXRlY3QuaCIKLSNpbmNsdWRlICJ1bmljb2RlL3VjbnYuaCIKLSNpbmNsdWRlICJ1bmljb2RlL3VzdHJpbmcuaCIKLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1NZWRpYVNjYW5uZXJDbGllbnQ6Ok1lZGlhU2Nhbm5lckNsaWVudCgpCi0gICAgOiAgIG1OYW1lcyhOVUxMKSwKLSAgICAgICAgbVZhbHVlcyhOVUxMKSwKLSAgICAgICAgbUxvY2FsZUVuY29kaW5nKGtFbmNvZGluZ05vbmUpCi17CitNZWRpYVNjYW5uZXJDbGllbnQ6Ok1lZGlhU2Nhbm5lckNsaWVudCgpIHsKIH0KIAotTWVkaWFTY2FubmVyQ2xpZW50Ojp+TWVkaWFTY2FubmVyQ2xpZW50KCkKLXsKLSAgICBkZWxldGUgbU5hbWVzOwotICAgIGRlbGV0ZSBtVmFsdWVzOworTWVkaWFTY2FubmVyQ2xpZW50Ojp+TWVkaWFTY2FubmVyQ2xpZW50KCkgewogfQogCiB2b2lkIE1lZGlhU2Nhbm5lckNsaWVudDo6c2V0TG9jYWxlKGNvbnN0IGNoYXIqIGxvY2FsZSkKIHsKLSAgICBpZiAoIWxvY2FsZSkgcmV0dXJuOwotCi0gICAgaWYgKCFzdHJuY21wKGxvY2FsZSwgImphIiwgMikpCi0gICAgICAgIG1Mb2NhbGVFbmNvZGluZyA9IGtFbmNvZGluZ1NoaWZ0SklTOwotICAgIGVsc2UgaWYgKCFzdHJuY21wKGxvY2FsZSwgImtvIiwgMikpCi0gICAgICAgIG1Mb2NhbGVFbmNvZGluZyA9IGtFbmNvZGluZ0VVQ0tSOwotICAgIGVsc2UgaWYgKCFzdHJuY21wKGxvY2FsZSwgInpoIiwgMikpIHsKLSAgICAgICAgaWYgKCFzdHJjbXAobG9jYWxlLCAiemhfQ04iKSkgewotICAgICAgICAgICAgLy8gc2ltcGxpZmllZCBjaGluZXNlIGZvciBtYWlubGFuZCBDaGluYQotICAgICAgICAgICAgbUxvY2FsZUVuY29kaW5nID0ga0VuY29kaW5nR0JLOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gYXNzdW1lIHRyYWRpdGlvbmFsIGZvciBub24tbWFpbmxhbmQgQ2hpbmVzZSBsb2NhbGVzIChUYWl3YW4sIEhvbmcgS29uZywgU2luZ2Fwb3JlKQotICAgICAgICAgICAgbUxvY2FsZUVuY29kaW5nID0ga0VuY29kaW5nQmlnNTsKLSAgICAgICAgfQotICAgIH0KKyAgICBtTG9jYWxlID0gbG9jYWxlOyAvLyBub3QgY3VycmVudGx5IHVzZWQKIH0KIAotdm9pZCBNZWRpYVNjYW5uZXJDbGllbnQ6OmJlZ2luRmlsZSgpCi17Ci0gICAgbU5hbWVzID0gbmV3IFN0cmluZ0FycmF5OwotICAgIG1WYWx1ZXMgPSBuZXcgU3RyaW5nQXJyYXk7Cit2b2lkIE1lZGlhU2Nhbm5lckNsaWVudDo6YmVnaW5GaWxlKCkgewogfQogCiBzdGF0dXNfdCBNZWRpYVNjYW5uZXJDbGllbnQ6OmFkZFN0cmluZ1RhZyhjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2YWx1ZSkKIHsKLSAgICBpZiAobUxvY2FsZUVuY29kaW5nICE9IGtFbmNvZGluZ05vbmUpIHsKLSAgICAgICAgLy8gZG9uJ3QgYm90aGVyIGNhY2hpbmcgc3RyaW5ncyB0aGF0IGFyZSBhbGwgQVNDSUkuCi0gICAgICAgIC8vIGNhbGwgaGFuZGxlU3RyaW5nVGFnIGRpcmVjdGx5IGluc3RlYWQuCi0gICAgICAgIC8vIGNoZWNrIHRvIHNlZSBpZiB2YWx1ZSAod2hpY2ggc2hvdWxkIGJlIHV0ZjgpIGhhcyBhbnkgbm9uLUFTQ0lJIGNoYXJhY3RlcnMKLSAgICAgICAgYm9vbCBub25Bc2NpaSA9IGZhbHNlOwotICAgICAgICBjb25zdCBjaGFyKiBjaHAgPSB2YWx1ZTsKLSAgICAgICAgY2hhciBjaDsKLSAgICAgICAgd2hpbGUgKChjaCA9ICpjaHArKykpIHsKLSAgICAgICAgICAgIGlmIChjaCAmIDB4ODApIHsKLSAgICAgICAgICAgICAgICBub25Bc2NpaSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobm9uQXNjaWkpIHsKLSAgICAgICAgICAgIC8vIHNhdmUgdGhlIHN0cmluZ3MgZm9yIGxhdGVyIHNvIHRoZXkgY2FuIGJlIHVzZWQgZm9yIG5hdGl2ZSBlbmNvZGluZyBkZXRlY3Rpb24KLSAgICAgICAgICAgIG1OYW1lcy0+cHVzaF9iYWNrKG5hbWUpOwotICAgICAgICAgICAgbVZhbHVlcy0+cHVzaF9iYWNrKHZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotICAgICAgICAvLyBlbHNlIGZhbGwgdGhyb3VnaAotICAgIH0KLQotICAgIC8vIGF1dG9kZXRlY3Rpb24gaXMgbm90IG5lY2Vzc2FyeSwgc28gbm8gbmVlZCB0byBjYWNoZSB0aGUgdmFsdWVzCi0gICAgLy8gcGFzcyBkaXJlY3RseSB0byB0aGUgY2xpZW50IGluc3RlYWQKLSAgICByZXR1cm4gaGFuZGxlU3RyaW5nVGFnKG5hbWUsIHZhbHVlKTsKKyAgICBoYW5kbGVTdHJpbmdUYWcobmFtZSwgdmFsdWUpOworICAgIHJldHVybiBPSzsKIH0KIAotc3RhdGljIHVpbnQzMl90IHBvc3NpYmxlRW5jb2RpbmdzKGNvbnN0IGNoYXIqIHMpCi17Ci0gICAgdWludDMyX3QgcmVzdWx0ID0ga0VuY29kaW5nQWxsOwotICAgIC8vIGlmIHMgY29udGFpbnMgYSBuYXRpdmUgZW5jb2RpbmcsIHRoZW4gaXQgd2FzIG1pc3Rha2VubHkgZW5jb2RlZCBpbiB1dGY4IGFzIGlmIGl0IHdlcmUgbGF0aW4tMQotICAgIC8vIHNvIHdlIG5lZWQgdG8gcmV2ZXJzZSB0aGUgbGF0aW4tMSAtPiB1dGY4IGNvbnZlcnNpb24gdG8gZ2V0IHRoZSBuYXRpdmUgY2hhcnMgYmFjawotICAgIHVpbnQ4X3QgY2gxLCBjaDI7Ci0gICAgdWludDhfdCogY2hwID0gKHVpbnQ4X3QgKilzOwotCi0gICAgd2hpbGUgKChjaDEgPSAqY2hwKyspKSB7Ci0gICAgICAgIGlmIChjaDEgJiAweDgwKSB7Ci0gICAgICAgICAgICBjaDIgPSAqY2hwKys7Ci0gICAgICAgICAgICBjaDEgPSAoKGNoMSA8PCA2KSAmIDB4QzApIHwgKGNoMiAmIDB4M0YpOwotICAgICAgICAgICAgLy8gY2gxIGlzIG5vdyB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgcG90ZW50aWFsIG5hdGl2ZSBjaGFyCi0KLSAgICAgICAgICAgIGNoMiA9ICpjaHArKzsKLSAgICAgICAgICAgIGlmIChjaDIgJiAweDgwKQotICAgICAgICAgICAgICAgIGNoMiA9ICgoY2gyIDw8IDYpICYgMHhDMCkgfCAoKmNocCsrICYgMHgzRik7Ci0gICAgICAgICAgICAvLyBjaDIgaXMgbm93IHRoZSBzZWNvbmQgYnl0ZSBvZiB0aGUgcG90ZW50aWFsIG5hdGl2ZSBjaGFyCi0gICAgICAgICAgICBpbnQgY2ggPSAoaW50KWNoMSA8PCA4IHwgKGludCljaDI7Ci0gICAgICAgICAgICByZXN1bHQgJj0gZmluZFBvc3NpYmxlRW5jb2RpbmdzKGNoKTsKLSAgICAgICAgfQotICAgICAgICAvLyBlbHNlIEFTQ0lJIGNoYXJhY3Rlciwgd2hpY2ggY291bGQgYmUgYW55dGhpbmcKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi12b2lkIE1lZGlhU2Nhbm5lckNsaWVudDo6Y29udmVydFZhbHVlcyh1aW50MzJfdCBlbmNvZGluZykKLXsKLSAgICBjb25zdCBjaGFyKiBlbmMgPSBOVUxMOwotICAgIHN3aXRjaCAoZW5jb2RpbmcpIHsKLSAgICAgICAgY2FzZSBrRW5jb2RpbmdTaGlmdEpJUzoKLSAgICAgICAgICAgIGVuYyA9ICJzaGlmdC1qaXMiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2Uga0VuY29kaW5nR0JLOgotICAgICAgICAgICAgZW5jID0gImdiayI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBrRW5jb2RpbmdCaWc1OgotICAgICAgICAgICAgZW5jID0gIkJpZzUiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2Uga0VuY29kaW5nRVVDS1I6Ci0gICAgICAgICAgICBlbmMgPSAiRVVDLUtSIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmIChlbmMpIHsKLSAgICAgICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7Ci0KLSAgICAgICAgVUNvbnZlcnRlciAqY29udiA9IHVjbnZfb3BlbihlbmMsICZzdGF0dXMpOwotICAgICAgICBpZiAoVV9GQUlMVVJFKHN0YXR1cykpIHsKLSAgICAgICAgICAgIEFMT0dFKCJjb3VsZCBub3QgY3JlYXRlIFVDb252ZXJ0ZXIgZm9yICVzIiwgZW5jKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBVQ29udmVydGVyICp1dGY4Q29udiA9IHVjbnZfb3BlbigiVVRGLTgiLCAmc3RhdHVzKTsKLSAgICAgICAgaWYgKFVfRkFJTFVSRShzdGF0dXMpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiY291bGQgbm90IGNyZWF0ZSBVQ29udmVydGVyIGZvciBVVEYtOCIpOwotICAgICAgICAgICAgdWNudl9jbG9zZShjb252KTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGZvciBlYWNoIHZhbHVlIHN0cmluZywgY29udmVydCBmcm9tIG5hdGl2ZSBlbmNvZGluZyB0byBVVEYtOAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OYW1lcy0+c2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIC8vIGZpcnN0IHdlIG5lZWQgdG8gdW50YW5nbGUgdGhlIHV0ZjggYW5kIGNvbnZlcnQgaXQgYmFjayB0byB0aGUgb3JpZ2luYWwgYnl0ZXMKLSAgICAgICAgICAgIC8vIHNpbmNlIHdlIGFyZSByZWR1Y2luZyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcsIHdlIGNhbiBkbyB0aGlzIGluIHBsYWNlCi0gICAgICAgICAgICB1aW50OF90KiBzcmMgPSAodWludDhfdCAqKW1WYWx1ZXMtPmdldEVudHJ5KGkpOwotICAgICAgICAgICAgaW50IGxlbiA9IHN0cmxlbigoY2hhciAqKXNyYyk7Ci0gICAgICAgICAgICB1aW50OF90KiBkZXN0ID0gc3JjOwotCi0gICAgICAgICAgICB1aW50OF90IHVjaDsKLSAgICAgICAgICAgIHdoaWxlICgodWNoID0gKnNyYysrKSkgewotICAgICAgICAgICAgICAgIGlmICh1Y2ggJiAweDgwKQotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKCh1Y2ggPDwgNikgJiAweEMwKSB8ICgqc3JjKysgJiAweDNGKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSB1Y2g7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAqZGVzdCA9IDA7Ci0KLSAgICAgICAgICAgIC8vIG5vdyBjb252ZXJ0IGZyb20gbmF0aXZlIGVuY29kaW5nIHRvIFVURi04Ci0gICAgICAgICAgICBjb25zdCBjaGFyKiBzb3VyY2UgPSBtVmFsdWVzLT5nZXRFbnRyeShpKTsKLSAgICAgICAgICAgIGludCB0YXJnZXRMZW5ndGggPSBsZW4gKiAzICsgMTsKLSAgICAgICAgICAgIGNoYXIqIGJ1ZmZlciA9IG5ldyBjaGFyW3RhcmdldExlbmd0aF07Ci0gICAgICAgICAgICAvLyBkb24ndCBub3JtYWxseSBjaGVjayBmb3IgTlVMTCwgYnV0IGluIHRoaXMgY2FzZSB0YXJnZXRMZW5ndGggbWF5IGJlIGxhcmdlCi0gICAgICAgICAgICBpZiAoIWJ1ZmZlcikKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNoYXIqIHRhcmdldCA9IGJ1ZmZlcjsKLQotICAgICAgICAgICAgdWNudl9jb252ZXJ0RXgodXRmOENvbnYsIGNvbnYsICZ0YXJnZXQsIHRhcmdldCArIHRhcmdldExlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgJnNvdXJjZSwgKGNvbnN0IGNoYXIgKilkZXN0LCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBUUlVFLCBUUlVFLCAmc3RhdHVzKTsKLSAgICAgICAgICAgIGlmIChVX0ZBSUxVUkUoc3RhdHVzKSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJ1Y252X2NvbnZlcnRFeCBmYWlsZWQ6ICVkIiwgc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBtVmFsdWVzLT5zZXRFbnRyeShpLCAiPz8/Iik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHplcm8gdGVybWluYXRlCi0gICAgICAgICAgICAgICAgKnRhcmdldCA9IDA7Ci0gICAgICAgICAgICAgICAgbVZhbHVlcy0+c2V0RW50cnkoaSwgYnVmZmVyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVsZXRlW10gYnVmZmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgdWNudl9jbG9zZShjb252KTsKLSAgICAgICAgdWNudl9jbG9zZSh1dGY4Q29udik7Ci0gICAgfQotfQotCi12b2lkIE1lZGlhU2Nhbm5lckNsaWVudDo6ZW5kRmlsZSgpCi17Ci0gICAgaWYgKG1Mb2NhbGVFbmNvZGluZyAhPSBrRW5jb2RpbmdOb25lKSB7Ci0gICAgICAgIGludCBzaXplID0gbU5hbWVzLT5zaXplKCk7Ci0gICAgICAgIHVpbnQzMl90IGVuY29kaW5nID0ga0VuY29kaW5nQWxsOwotCi0gICAgICAgIC8vIGNvbXB1dGUgYSBiaXQgbWFzayBjb250YWluaW5nIGFsbCBwb3NzaWJsZSBlbmNvZGluZ3MKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTmFtZXMtPnNpemUoKTsgaSsrKQotICAgICAgICAgICAgZW5jb2RpbmcgJj0gcG9zc2libGVFbmNvZGluZ3MobVZhbHVlcy0+Z2V0RW50cnkoaSkpOwotCi0gICAgICAgIC8vIGlmIHRoZSBsb2NhbGUgZW5jb2RpbmcgbWF0Y2hlcywgdGhlbiBhc3N1bWUgd2UgaGF2ZSBhIG5hdGl2ZSBlbmNvZGluZy4KLSAgICAgICAgaWYgKGVuY29kaW5nICYgbUxvY2FsZUVuY29kaW5nKQotICAgICAgICAgICAgY29udmVydFZhbHVlcyhtTG9jYWxlRW5jb2RpbmcpOwotCi0gICAgICAgIC8vIGZpbmFsbHksIHB1c2ggYWxsIG5hbWUvdmFsdWUgcGFpcnMgdG8gdGhlIGNsaWVudAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OYW1lcy0+c2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGhhbmRsZVN0cmluZ1RhZyhtTmFtZXMtPmdldEVudHJ5KGkpLCBtVmFsdWVzLT5nZXRFbnRyeShpKSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gZWxzZSBhZGRTdHJpbmdUYWcoKSBoYXMgZG9uZSBhbGwgdGhlIHdvcmsgc28gd2UgaGF2ZSBub3RoaW5nIHRvIGRvCi0KLSAgICBkZWxldGUgbU5hbWVzOwotICAgIGRlbGV0ZSBtVmFsdWVzOwotICAgIG1OYW1lcyA9IE5VTEw7Ci0gICAgbVZhbHVlcyA9IE5VTEw7Cit2b2lkIE1lZGlhU2Nhbm5lckNsaWVudDo6ZW5kRmlsZSgpIHsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01lZGlhVXRpbHMuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFVdGlscy5jcHAKaW5kZXggODNiOGFmMy4uYTAyY2E2NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFVdGlscy5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFVdGlscy5jcHAKQEAgLTE0LDEzICsxNCw2IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vLyBmb3IgcHJvcGVydHkgZnVuY3Rpb25zIGJlbG93Ci0jZGVmaW5lIF9fU1RESU5UX0xJTUlUUwotI2luY2x1ZGUgPHN0ZGludC5oPgotI2RlZmluZSBfX1NURENfRk9STUFUX01BQ1JPUwotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0KLQogI2RlZmluZSBMT0dfVEFHICJNZWRpYVV0aWxzIgogI2RlZmluZSBMT0dfTkRFQlVHIDAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KQEAgLTMzLDQ5ICsyNiw2IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotLy8gZm9sbG93aW5nIHByb3BlcnR5IGZ1bmN0aW9ucyBib3Jyb3dlZCBmcm9tIGxtcCBwcm9wZXJ0aWVzLmMKLXN0YXRpYyBpbnRtYXhfdCBwcm9wZXJ0eV9nZXRfaW1heChjb25zdCBjaGFyICprZXksIGludG1heF90IGxvd2VyX2JvdW5kLCBpbnRtYXhfdCB1cHBlcl9ib3VuZCwKLSAgICAgICAgaW50bWF4X3QgZGVmYXVsdF92YWx1ZSkgewotICAgIGlmICgha2V5KSB7Ci0gICAgICAgIHJldHVybiBkZWZhdWx0X3ZhbHVlOwotICAgIH0KLQotICAgIGludG1heF90IHJlc3VsdCA9IGRlZmF1bHRfdmFsdWU7Ci0gICAgY2hhciBidWZbUFJPUEVSVFlfVkFMVUVfTUFYXSA9IHsnXDAnLH07Ci0gICAgY2hhciAqZW5kID0gTlVMTDsKLQotICAgIGludCBsZW4gPSBwcm9wZXJ0eV9nZXQoa2V5LCBidWYsICIiKTsKLSAgICBpZiAobGVuID4gMCkgewotICAgICAgICBpbnQgdG1wID0gZXJybm87Ci0gICAgICAgIGVycm5vID0gMDsKLQotICAgICAgICAvLyBJbmZlciBiYXNlIGF1dG9tYXRpY2FsbHkKLSAgICAgICAgcmVzdWx0ID0gc3RydG9pbWF4KGJ1ZiwgJmVuZCwgLypiYXNlKi8wKTsKLSAgICAgICAgaWYgKChyZXN1bHQgPT0gSU5UTUFYX01JTiB8fCByZXN1bHQgPT0gSU5UTUFYX01BWCkgJiYgZXJybm8gPT0gRVJBTkdFKSB7Ci0gICAgICAgICAgICAvLyBPdmVyIG9yIHVuZGVyZmxvdwotICAgICAgICAgICAgcmVzdWx0ID0gZGVmYXVsdF92YWx1ZTsKLSAgICAgICAgICAgIEFMT0dWKCIlcyglcywlIiBQUklkTUFYICIpIC0gb3ZlcmZsb3ciLCBfX0ZVTkNUSU9OX18sIGtleSwgZGVmYXVsdF92YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocmVzdWx0IDwgbG93ZXJfYm91bmQgfHwgcmVzdWx0ID4gdXBwZXJfYm91bmQpIHsKLSAgICAgICAgICAgIC8vIE91dCBvZiByYW5nZSBvZiByZXF1ZXN0ZWQgYm91bmRzCi0gICAgICAgICAgICByZXN1bHQgPSBkZWZhdWx0X3ZhbHVlOwotICAgICAgICAgICAgQUxPR1YoIiVzKCVzLCUiIFBSSWRNQVggIikgLSBvdXQgb2YgcmFuZ2UiLCBfX0ZVTkNUSU9OX18sIGtleSwgZGVmYXVsdF92YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZW5kID09IGJ1ZikgewotICAgICAgICAgICAgLy8gTnVtZXJpYyBjb252ZXJzaW9uIGZhaWxlZAotICAgICAgICAgICAgcmVzdWx0ID0gZGVmYXVsdF92YWx1ZTsKLSAgICAgICAgICAgIEFMT0dWKCIlcyglcywlIiBQUklkTUFYICIpIC0gbnVtZXJpYyBjb252ZXJzaW9uIGZhaWxlZCIsCi0gICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywga2V5LCBkZWZhdWx0X3ZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGVycm5vID0gdG1wOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBpbnQ2NF90IHByb3BlcnR5X2dldF9pbnQ2NChjb25zdCBjaGFyICprZXksIGludDY0X3QgZGVmYXVsdF92YWx1ZSkgewotICAgIHJldHVybiAoaW50NjRfdClwcm9wZXJ0eV9nZXRfaW1heChrZXksIElOVDY0X01JTiwgSU5UNjRfTUFYLCBkZWZhdWx0X3ZhbHVlKTsKLX0KLQogdm9pZCBsaW1pdFByb2Nlc3NNZW1vcnkoCiAgICAgY29uc3QgY2hhciAqcHJvcGVydHksCiAgICAgc2l6ZV90IG51bWJlck9mQnl0ZXMsCkBAIC0xMjEsNSArNzEsNCBAQAogCiB9CiAKLQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVtb3J5TGVha1RyYWNrVXRpbC5jcHAgYi9tZWRpYS9saWJtZWRpYS9NZW1vcnlMZWFrVHJhY2tVdGlsLmNwcAppbmRleCBmMDA0Y2E0Li42NmY3MTYxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9NZW1vcnlMZWFrVHJhY2tVdGlsLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NZW1vcnlMZWFrVHJhY2tVdGlsLmNwcApAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPG1lZGlhL01lbW9yeUxlYWtUcmFja1V0aWwuaD4KIAogI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL1NvdW5kUG9vbC5jcHAgYi9tZWRpYS9saWJtZWRpYS9Tb3VuZFBvb2wuY3BwCmluZGV4IGEyYjVlMzAuLjI5YWQ3ZWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL1NvdW5kUG9vbC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvU291bmRQb29sLmNwcApAQCAtMTYsMTQgKzE2LDE5IEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiU291bmRQb29sIgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjZGVmaW5lIFVTRV9TSEFSRURfTUVNX0JVRkZFUgogCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFwbGF5ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9Tb3VuZFBvb2wuaD4KICNpbmNsdWRlICJTb3VuZFBvb2xUaHJlYWQuaCIKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZAogewpAQCAtMzUsMTAgKzQwLDEwIEBACiBzaXplX3Qga0RlZmF1bHRIZWFwU2l6ZSA9IDEwMjQgKiAxMDI0OyAvLyAxTUIKIAogCi1Tb3VuZFBvb2w6OlNvdW5kUG9vbChpbnQgbWF4Q2hhbm5lbHMsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwgaW50IHNyY1F1YWxpdHkpCitTb3VuZFBvb2w6OlNvdW5kUG9vbChpbnQgbWF4Q2hhbm5lbHMsIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMpCiB7Ci0gICAgQUxPR1YoIlNvdW5kUG9vbCBjb25zdHJ1Y3RvcjogbWF4Q2hhbm5lbHM9JWQsIHN0cmVhbVR5cGU9JWQsIHNyY1F1YWxpdHk9JWQiLAotICAgICAgICAgICAgbWF4Q2hhbm5lbHMsIHN0cmVhbVR5cGUsIHNyY1F1YWxpdHkpOworICAgIEFMT0dWKCJTb3VuZFBvb2wgY29uc3RydWN0b3I6IG1heENoYW5uZWxzPSVkLCBhdHRyLnVzYWdlPSVkLCBhdHRyLmZsYWdzPTB4JXgsIGF0dHIudGFncz0lcyIsCisgICAgICAgICAgICBtYXhDaGFubmVscywgcEF0dHJpYnV0ZXMtPnVzYWdlLCBwQXR0cmlidXRlcy0+ZmxhZ3MsIHBBdHRyaWJ1dGVzLT50YWdzKTsKIAogICAgIC8vIGNoZWNrIGxpbWl0cwogICAgIG1NYXhDaGFubmVscyA9IG1heENoYW5uZWxzOwpAQCAtNTIsOCArNTcsNyBAQAogCiAgICAgbVF1aXQgPSBmYWxzZTsKICAgICBtRGVjb2RlVGhyZWFkID0gMDsKLSAgICBtU3RyZWFtVHlwZSA9IHN0cmVhbVR5cGU7Ci0gICAgbVNyY1F1YWxpdHkgPSBzcmNRdWFsaXR5OworICAgIG1lbWNweSgmbUF0dHJpYnV0ZXMsIHBBdHRyaWJ1dGVzLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CiAgICAgbUFsbG9jYXRlZCA9IDA7CiAgICAgbU5leHRTYW1wbGVJRCA9IDA7CiAgICAgbU5leHRDaGFubmVsSUQgPSAwOwpAQCAtMjEwLDcgKzIxNCw3IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLWludCBTb3VuZFBvb2w6OmxvYWQoY29uc3QgY2hhciogcGF0aCwgaW50IHByaW9yaXR5KQoraW50IFNvdW5kUG9vbDo6bG9hZChjb25zdCBjaGFyKiBwYXRoLCBpbnQgcHJpb3JpdHkgX191bnVzZWQpCiB7CiAgICAgQUxPR1YoImxvYWQ6IHBhdGg9JXMsIHByaW9yaXR5PSVkIiwgcGF0aCwgcHJpb3JpdHkpOwogICAgIGludCBzYW1wbGVJRDsKQEAgLTIzMCw5ICsyMzQsOSBAQAogICAgIHJldHVybiBzYW1wbGVJRDsKIH0KIAotaW50IFNvdW5kUG9vbDo6bG9hZChpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCwgaW50IHByaW9yaXR5KQoraW50IFNvdW5kUG9vbDo6bG9hZChpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCwgaW50IHByaW9yaXR5IF9fdW51c2VkKQogewotICAgIEFMT0dWKCJsb2FkOiBmZD0lZCwgb2Zmc2V0PSVsbGQsIGxlbmd0aD0lbGxkLCBwcmlvcml0eT0lZCIsCisgICAgQUxPR1YoImxvYWQ6IGZkPSVkLCBvZmZzZXQ9JSIgUFJJZDY0ICIsIGxlbmd0aD0lIiBQUklkNjQgIiwgcHJpb3JpdHk9JWQiLAogICAgICAgICAgICAgZmQsIG9mZnNldCwgbGVuZ3RoLCBwcmlvcml0eSk7CiAgICAgaW50IHNhbXBsZUlEOwogICAgIHsKQEAgLTQ4NCw3ICs0ODgsOCBAQAogICAgIG1GZCA9IGR1cChmZCk7CiAgICAgbU9mZnNldCA9IG9mZnNldDsKICAgICBtTGVuZ3RoID0gbGVuZ3RoOwotICAgIEFMT0dWKCJjcmVhdGUgc2FtcGxlSUQ9JWQsIGZkPSVkLCBvZmZzZXQ9JWxsZCwgbGVuZ3RoPSVsbGQiLCBtU2FtcGxlSUQsIG1GZCwgbUxlbmd0aCwgbU9mZnNldCk7CisgICAgQUxPR1YoImNyZWF0ZSBzYW1wbGVJRD0lZCwgZmQ9JWQsIG9mZnNldD0lIiBQUklkNjQgIiBsZW5ndGg9JSIgUFJJZDY0LAorICAgICAgICBtU2FtcGxlSUQsIG1GZCwgbUxlbmd0aCwgbU9mZnNldCk7CiB9CiAKIHZvaWQgU2FtcGxlOjppbml0KCkKQEAgLTUxOSw3ICs1MjQsMTQgQEAKIAogICAgIEFMT0dWKCJTdGFydCBkZWNvZGUiKTsKICAgICBpZiAobVVybCkgewotICAgICAgICBzdGF0dXMgPSBNZWRpYVBsYXllcjo6ZGVjb2RlKG1VcmwsICZzYW1wbGVSYXRlLCAmbnVtQ2hhbm5lbHMsICZmb3JtYXQsIG1IZWFwLCAmbVNpemUpOworICAgICAgICBzdGF0dXMgPSBNZWRpYVBsYXllcjo6ZGVjb2RlKAorICAgICAgICAgICAgICAgIE5VTEwgLyogaHR0cFNlcnZpY2UgKi8sCisgICAgICAgICAgICAgICAgbVVybCwKKyAgICAgICAgICAgICAgICAmc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAmbnVtQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgJmZvcm1hdCwKKyAgICAgICAgICAgICAgICBtSGVhcCwKKyAgICAgICAgICAgICAgICAmbVNpemUpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHN0YXR1cyA9IE1lZGlhUGxheWVyOjpkZWNvZGUobUZkLCBtT2Zmc2V0LCBtTGVuZ3RoLCAmc2FtcGxlUmF0ZSwgJm51bUNoYW5uZWxzLCAmZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFwLCAmbVNpemUpOwpAQCAtNTMxLDcgKzU0Myw3IEBACiAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gbG9hZCBzYW1wbGU6ICVzIiwgbVVybCk7CiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQotICAgIEFMT0dWKCJwb2ludGVyID0gJXAsIHNpemUgPSAldSwgc2FtcGxlUmF0ZSA9ICV1LCBudW1DaGFubmVscyA9ICVkIiwKKyAgICBBTE9HVigicG9pbnRlciA9ICVwLCBzaXplID0gJXp1LCBzYW1wbGVSYXRlID0gJXUsIG51bUNoYW5uZWxzID0gJWQiLAogICAgICAgICAgIG1IZWFwLT5nZXRCYXNlKCksIG1TaXplLCBzYW1wbGVSYXRlLCBudW1DaGFubmVscyk7CiAKICAgICBpZiAoc2FtcGxlUmF0ZSA+IGtNYXhTYW1wbGVSYXRlKSB7CkBAIC01OTEsNyArNjAzLDcgQEAKICAgICAgICAgLy8gaW5pdGlhbGl6ZSB0cmFjawogICAgICAgICBzaXplX3QgYWZGcmFtZUNvdW50OwogICAgICAgICB1aW50MzJfdCBhZlNhbXBsZVJhdGU7Ci0gICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSA9IG1Tb3VuZFBvb2wtPnN0cmVhbVR5cGUoKTsKKyAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlID0gYXVkaW9fYXR0cmlidXRlc190b19zdHJlYW1fdHlwZShtU291bmRQb29sLT5hdHRyaWJ1dGVzKCkpOwogICAgICAgICBpZiAoQXVkaW9TeXN0ZW06OmdldE91dHB1dEZyYW1lQ291bnQoJmFmRnJhbWVDb3VudCwgc3RyZWFtVHlwZSkgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIGFmRnJhbWVDb3VudCA9IGtEZWZhdWx0RnJhbWVDb3VudDsKICAgICAgICAgfQpAQCAtNjAyLDcgKzYxNCw3IEBACiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSB1aW50MzJfdChmbG9hdChzYW1wbGUtPnNhbXBsZVJhdGUoKSkgKiByYXRlICsgMC41KTsKICAgICAgICAgdWludDMyX3QgdG90YWxGcmFtZXMgPSAoa0RlZmF1bHRCdWZmZXJDb3VudCAqIGFmRnJhbWVDb3VudCAqIHNhbXBsZVJhdGUpIC8gYWZTYW1wbGVSYXRlOwogICAgICAgICB1aW50MzJfdCBidWZmZXJGcmFtZXMgPSAodG90YWxGcmFtZXMgKyAoa0RlZmF1bHRCdWZmZXJDb3VudCAtIDEpKSAvIGtEZWZhdWx0QnVmZmVyQ291bnQ7Ci0gICAgICAgIHVpbnQzMl90IGZyYW1lQ291bnQgPSAwOworICAgICAgICBzaXplX3QgZnJhbWVDb3VudCA9IDA7CiAKICAgICAgICAgaWYgKGxvb3ApIHsKICAgICAgICAgICAgIGZyYW1lQ291bnQgPSBzYW1wbGUtPnNpemUoKS9udW1DaGFubmVscy8KQEAgLTYyMywxNiArNjM1LDE1IEBACiAgICAgICAgIC8vIHdyb25nIGF1ZGlvIGF1ZGlvIGJ1ZmZlciBzaXplICAobUF1ZGlvQnVmZmVyU2l6ZSkKICAgICAgICAgdW5zaWduZWQgbG9uZyB0b2dnbGUgPSBtVG9nZ2xlIF4gMTsKICAgICAgICAgdm9pZCAqdXNlckRhdGEgPSAodm9pZCAqKSgodW5zaWduZWQgbG9uZyl0aGlzIHwgdG9nZ2xlKTsKLSAgICAgICAgdWludDMyX3QgY2hhbm5lbHMgPSAobnVtQ2hhbm5lbHMgPT0gMikgPwotICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyA6IEFVRElPX0NIQU5ORUxfT1VUX01PTk87CisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KG51bUNoYW5uZWxzKTsKIAogICAgICAgICAvLyBkbyBub3QgY3JlYXRlIGEgbmV3IGF1ZGlvIHRyYWNrIGlmIGN1cnJlbnQgdHJhY2sgaXMgY29tcGF0aWJsZSB3aXRoIHNhbXBsZSBwYXJhbWV0ZXJzCiAjaWZkZWYgVVNFX1NIQVJFRF9NRU1fQlVGRkVSCiAgICAgICAgIG5ld1RyYWNrID0gbmV3IEF1ZGlvVHJhY2soc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgc2FtcGxlLT5mb3JtYXQoKSwKLSAgICAgICAgICAgICAgICBjaGFubmVscywgc2FtcGxlLT5nZXRJTWVtb3J5KCksIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QsIGNhbGxiYWNrLCB1c2VyRGF0YSk7CisgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIHNhbXBsZS0+Z2V0SU1lbW9yeSgpLCBBVURJT19PVVRQVVRfRkxBR19GQVNULCBjYWxsYmFjaywgdXNlckRhdGEpOwogI2Vsc2UKICAgICAgICAgbmV3VHJhY2sgPSBuZXcgQXVkaW9UcmFjayhzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBzYW1wbGUtPmZvcm1hdCgpLAotICAgICAgICAgICAgICAgIGNoYW5uZWxzLCBmcmFtZUNvdW50LCBBVURJT19PVVRQVVRfRkxBR19GQVNULCBjYWxsYmFjaywgdXNlckRhdGEsCisgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QsIGNhbGxiYWNrLCB1c2VyRGF0YSwKICAgICAgICAgICAgICAgICBidWZmZXJGcmFtZXMpOwogI2VuZGlmCiAgICAgICAgIG9sZFRyYWNrID0gbUF1ZGlvVHJhY2s7CkBAIC03NTMsNyArNzY0LDggQEAKICAgICAgICAgICAgICAgICAgICAgY291bnQgPSBiLT5zaXplOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtZW1jcHkocSwgcCwgY291bnQpOwotLy8gICAgICAgICAgICAgIEFMT0dWKCJmaWxsOiBxPSVwLCBwPSVwLCBtUG9zPSV1LCBiLT5zaXplPSV1LCBjb3VudD0lZCIsIHEsIHAsIG1Qb3MsIGItPnNpemUsIGNvdW50KTsKKy8vICAgICAgICAgICAgICBBTE9HVigiZmlsbDogcT0lcCwgcD0lcCwgbVBvcz0ldSwgYi0+c2l6ZT0ldSwgY291bnQ9JWQiLCBxLCBwLCBtUG9zLCBiLT5zaXplLAorLy8gICAgICAgICAgICAgICAgICAgICAgY291bnQpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChtUG9zIDwgbUF1ZGlvQnVmZmVyU2l6ZSkgewogICAgICAgICAgICAgICAgIGNvdW50ID0gbUF1ZGlvQnVmZmVyU2l6ZSAtIG1Qb3M7CiAgICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gYi0+c2l6ZSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvVG9uZUdlbmVyYXRvci5jcHAgYi9tZWRpYS9saWJtZWRpYS9Ub25lR2VuZXJhdG9yLmNwcAppbmRleCBhZGVmM2JlLi42MWI2ZDM2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9Ub25lR2VuZXJhdG9yLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9Ub25lR2VuZXJhdG9yLmNwcApAQCAtMTA1Nyw3ICsxMDU3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAvLyBub3RpZmljYXRpb25GcmFtZXMKICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAvLyBzaGFyZWRCdWZmZXIKICAgICAgICAgICAgICAgICAgICAgICBtVGhyZWFkQ2FuQ2FsbEphdmEsCi0gICAgICAgICAgICAgICAgICAgICAgMCwgICAgLy8gc2Vzc2lvbklkCisgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU0VTU0lPTl9BTExPQ0FURSwKICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1RyYWNrOjpUUkFOU0ZFUl9DQUxMQkFDSyk7CiAKICAgICBpZiAobXBBdWRpb1RyYWNrLT5pbml0Q2hlY2soKSAhPSBOT19FUlJPUikgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvYXV0b2RldGVjdC5jcHAgYi9tZWRpYS9saWJtZWRpYS9hdXRvZGV0ZWN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1YzNiMi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYS9hdXRvZGV0ZWN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDg4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImF1dG9kZXRlY3QuaCIKLQotc3RydWN0IENoYXJSYW5nZSB7Ci0gICAgdWludDE2X3QgZmlyc3Q7Ci0gICAgdWludDE2X3QgbGFzdDsKLX07Ci0KLSNkZWZpbmUgQVJSQVlfU0laRSh4KSAgIChzaXplb2YoeCkgLyBzaXplb2YoKngpKQotCi0vLyBnZW5lcmF0ZWQgZnJvbSBodHRwOi8vdW5pY29kZS5vcmcvUHVibGljL01BUFBJTkdTL1ZFTkRPUlMvTUlDU0ZUL1dJTkRPV1MvQ1A5MzIuVFhUCi1zdGF0aWMgY29uc3QgQ2hhclJhbmdlIGtTaGlmdEpJU1Jhbmdlc1tdID0gewotICAgIHsgMHg4MTQwLCAweDgxN0UgfSwKLSAgICB7IDB4ODE4MCwgMHg4MUFDIH0sCi0gICAgeyAweDgxQjgsIDB4ODFCRiB9LAotICAgIHsgMHg4MUM4LCAweDgxQ0UgfSwKLSAgICB7IDB4ODFEQSwgMHg4MUU4IH0sCi0gICAgeyAweDgxRjAsIDB4ODFGNyB9LAotICAgIHsgMHg4MUZDLCAweDgxRkMgfSwKLSAgICB7IDB4ODI0RiwgMHg4MjU4IH0sCi0gICAgeyAweDgyNjAsIDB4ODI3OSB9LAotICAgIHsgMHg4MjgxLCAweDgyOUEgfSwKLSAgICB7IDB4ODI5RiwgMHg4MkYxIH0sCi0gICAgeyAweDgzNDAsIDB4ODM3RSB9LAotICAgIHsgMHg4MzgwLCAweDgzOTYgfSwKLSAgICB7IDB4ODM5RiwgMHg4M0I2IH0sCi0gICAgeyAweDgzQkYsIDB4ODNENiB9LAotICAgIHsgMHg4NDQwLCAweDg0NjAgfSwKLSAgICB7IDB4ODQ3MCwgMHg4NDdFIH0sCi0gICAgeyAweDg0ODAsIDB4ODQ5MSB9LAotICAgIHsgMHg4NDlGLCAweDg0QkUgfSwKLSAgICB7IDB4ODc0MCwgMHg4NzVEIH0sCi0gICAgeyAweDg3NUYsIDB4ODc3NSB9LAotICAgIHsgMHg4NzdFLCAweDg3N0UgfSwKLSAgICB7IDB4ODc4MCwgMHg4NzlDIH0sCi0gICAgeyAweDg4OUYsIDB4ODhGQyB9LAotICAgIHsgMHg4OTQwLCAweDg5N0UgfSwKLSAgICB7IDB4ODk4MCwgMHg4OUZDIH0sCi0gICAgeyAweDhBNDAsIDB4OEE3RSB9LAotICAgIHsgMHg4QTgwLCAweDhBRkMgfSwKLSAgICB7IDB4OEI0MCwgMHg4QjdFIH0sCi0gICAgeyAweDhCODAsIDB4OEJGQyB9LAotICAgIHsgMHg4QzQwLCAweDhDN0UgfSwKLSAgICB7IDB4OEM4MCwgMHg4Q0ZDIH0sCi0gICAgeyAweDhENDAsIDB4OEQ3RSB9LAotICAgIHsgMHg4RDgwLCAweDhERkMgfSwKLSAgICB7IDB4OEU0MCwgMHg4RTdFIH0sCi0gICAgeyAweDhFODAsIDB4OEVGQyB9LAotICAgIHsgMHg4RjQwLCAweDhGN0UgfSwKLSAgICB7IDB4OEY4MCwgMHg4RkZDIH0sCi0gICAgeyAweDkwNDAsIDB4OTA3RSB9LAotICAgIHsgMHg5MDgwLCAweDkwRkMgfSwKLSAgICB7IDB4OTE0MCwgMHg5MTdFIH0sCi0gICAgeyAweDkxODAsIDB4OTFGQyB9LAotICAgIHsgMHg5MjQwLCAweDkyN0UgfSwKLSAgICB7IDB4OTI4MCwgMHg5MkZDIH0sCi0gICAgeyAweDkzNDAsIDB4OTM3RSB9LAotICAgIHsgMHg5MzgwLCAweDkzRkMgfSwKLSAgICB7IDB4OTQ0MCwgMHg5NDdFIH0sCi0gICAgeyAweDk0ODAsIDB4OTRGQyB9LAotICAgIHsgMHg5NTQwLCAweDk1N0UgfSwKLSAgICB7IDB4OTU4MCwgMHg5NUZDIH0sCi0gICAgeyAweDk2NDAsIDB4OTY3RSB9LAotICAgIHsgMHg5NjgwLCAweDk2RkMgfSwKLSAgICB7IDB4OTc0MCwgMHg5NzdFIH0sCi0gICAgeyAweDk3ODAsIDB4OTdGQyB9LAotICAgIHsgMHg5ODQwLCAweDk4NzIgfSwKLSAgICB7IDB4OTg5RiwgMHg5OEZDIH0sCi0gICAgeyAweDk5NDAsIDB4OTk3RSB9LAotICAgIHsgMHg5OTgwLCAweDk5RkMgfSwKLSAgICB7IDB4OUE0MCwgMHg5QTdFIH0sCi0gICAgeyAweDlBODAsIDB4OUFGQyB9LAotICAgIHsgMHg5QjQwLCAweDlCN0UgfSwKLSAgICB7IDB4OUI4MCwgMHg5QkZDIH0sCi0gICAgeyAweDlDNDAsIDB4OUM3RSB9LAotICAgIHsgMHg5QzgwLCAweDlDRkMgfSwKLSAgICB7IDB4OUQ0MCwgMHg5RDdFIH0sCi0gICAgeyAweDlEODAsIDB4OURGQyB9LAotICAgIHsgMHg5RTQwLCAweDlFN0UgfSwKLSAgICB7IDB4OUU4MCwgMHg5RUZDIH0sCi0gICAgeyAweDlGNDAsIDB4OUY3RSB9LAotICAgIHsgMHg5RjgwLCAweDlGRkMgfSwKLSAgICB7IDB4RTA0MCwgMHhFMDdFIH0sCi0gICAgeyAweEUwODAsIDB4RTBGQyB9LAotICAgIHsgMHhFMTQwLCAweEUxN0UgfSwKLSAgICB7IDB4RTE4MCwgMHhFMUZDIH0sCi0gICAgeyAweEUyNDAsIDB4RTI3RSB9LAotICAgIHsgMHhFMjgwLCAweEUyRkMgfSwKLSAgICB7IDB4RTM0MCwgMHhFMzdFIH0sCi0gICAgeyAweEUzODAsIDB4RTNGQyB9LAotICAgIHsgMHhFNDQwLCAweEU0N0UgfSwKLSAgICB7IDB4RTQ4MCwgMHhFNEZDIH0sCi0gICAgeyAweEU1NDAsIDB4RTU3RSB9LAotICAgIHsgMHhFNTgwLCAweEU1RkMgfSwKLSAgICB7IDB4RTY0MCwgMHhFNjdFIH0sCi0gICAgeyAweEU2ODAsIDB4RTZGQyB9LAotICAgIHsgMHhFNzQwLCAweEU3N0UgfSwKLSAgICB7IDB4RTc4MCwgMHhFN0ZDIH0sCi0gICAgeyAweEU4NDAsIDB4RTg3RSB9LAotICAgIHsgMHhFODgwLCAweEU4RkMgfSwKLSAgICB7IDB4RTk0MCwgMHhFOTdFIH0sCi0gICAgeyAweEU5ODAsIDB4RTlGQyB9LAotICAgIHsgMHhFQTQwLCAweEVBN0UgfSwKLSAgICB7IDB4RUE4MCwgMHhFQUE0IH0sCi0gICAgeyAweEVENDAsIDB4RUQ3RSB9LAotICAgIHsgMHhFRDgwLCAweEVERkMgfSwKLSAgICB7IDB4RUU0MCwgMHhFRTdFIH0sCi0gICAgeyAweEVFODAsIDB4RUVFQyB9LAotICAgIHsgMHhFRUVGLCAweEVFRkMgfSwKLSAgICB7IDB4RkE0MCwgMHhGQTdFIH0sCi0gICAgeyAweEZBODAsIDB4RkFGQyB9LAotICAgIHsgMHhGQjQwLCAweEZCN0UgfSwKLSAgICB7IDB4RkI4MCwgMHhGQkZDIH0sCi0gICAgeyAweEZDNDAsIDB4RkM0QiB9LAotfTsKLQotLy8gZ2VuZXJhdGVkIGZyb20gaHR0cDovL3VuaWNvZGUub3JnL1B1YmxpYy9NQVBQSU5HUy9WRU5ET1JTL01JQ1NGVC9XSU5ET1dTL0NQOTM2LlRYVAotc3RhdGljIGNvbnN0IENoYXJSYW5nZSBrR0JLUmFuZ2VzW10gPSB7Ci0gICAgeyAweDgxNDAsIDB4ODE3RSB9LAotICAgIHsgMHg4MTgwLCAweDgxRkUgfSwKLSAgICB7IDB4ODI0MCwgMHg4MjdFIH0sCi0gICAgeyAweDgyODAsIDB4ODJGRSB9LAotICAgIHsgMHg4MzQwLCAweDgzN0UgfSwKLSAgICB7IDB4ODM4MCwgMHg4M0ZFIH0sCi0gICAgeyAweDg0NDAsIDB4ODQ3RSB9LAotICAgIHsgMHg4NDgwLCAweDg0RkUgfSwKLSAgICB7IDB4ODU0MCwgMHg4NTdFIH0sCi0gICAgeyAweDg1ODAsIDB4ODVGRSB9LAotICAgIHsgMHg4NjQwLCAweDg2N0UgfSwKLSAgICB7IDB4ODY4MCwgMHg4NkZFIH0sCi0gICAgeyAweDg3NDAsIDB4ODc3RSB9LAotICAgIHsgMHg4NzgwLCAweDg3RkUgfSwKLSAgICB7IDB4ODg0MCwgMHg4ODdFIH0sCi0gICAgeyAweDg4ODAsIDB4ODhGRSB9LAotICAgIHsgMHg4OTQwLCAweDg5N0UgfSwKLSAgICB7IDB4ODk4MCwgMHg4OUZFIH0sCi0gICAgeyAweDhBNDAsIDB4OEE3RSB9LAotICAgIHsgMHg4QTgwLCAweDhBRkUgfSwKLSAgICB7IDB4OEI0MCwgMHg4QjdFIH0sCi0gICAgeyAweDhCODAsIDB4OEJGRSB9LAotICAgIHsgMHg4QzQwLCAweDhDN0UgfSwKLSAgICB7IDB4OEM4MCwgMHg4Q0ZFIH0sCi0gICAgeyAweDhENDAsIDB4OEQ3RSB9LAotICAgIHsgMHg4RDgwLCAweDhERkUgfSwKLSAgICB7IDB4OEU0MCwgMHg4RTdFIH0sCi0gICAgeyAweDhFODAsIDB4OEVGRSB9LAotICAgIHsgMHg4RjQwLCAweDhGN0UgfSwKLSAgICB7IDB4OEY4MCwgMHg4RkZFIH0sCi0gICAgeyAweDkwNDAsIDB4OTA3RSB9LAotICAgIHsgMHg5MDgwLCAweDkwRkUgfSwKLSAgICB7IDB4OTE0MCwgMHg5MTdFIH0sCi0gICAgeyAweDkxODAsIDB4OTFGRSB9LAotICAgIHsgMHg5MjQwLCAweDkyN0UgfSwKLSAgICB7IDB4OTI4MCwgMHg5MkZFIH0sCi0gICAgeyAweDkzNDAsIDB4OTM3RSB9LAotICAgIHsgMHg5MzgwLCAweDkzRkUgfSwKLSAgICB7IDB4OTQ0MCwgMHg5NDdFIH0sCi0gICAgeyAweDk0ODAsIDB4OTRGRSB9LAotICAgIHsgMHg5NTQwLCAweDk1N0UgfSwKLSAgICB7IDB4OTU4MCwgMHg5NUZFIH0sCi0gICAgeyAweDk2NDAsIDB4OTY3RSB9LAotICAgIHsgMHg5NjgwLCAweDk2RkUgfSwKLSAgICB7IDB4OTc0MCwgMHg5NzdFIH0sCi0gICAgeyAweDk3ODAsIDB4OTdGRSB9LAotICAgIHsgMHg5ODQwLCAweDk4N0UgfSwKLSAgICB7IDB4OTg4MCwgMHg5OEZFIH0sCi0gICAgeyAweDk5NDAsIDB4OTk3RSB9LAotICAgIHsgMHg5OTgwLCAweDk5RkUgfSwKLSAgICB7IDB4OUE0MCwgMHg5QTdFIH0sCi0gICAgeyAweDlBODAsIDB4OUFGRSB9LAotICAgIHsgMHg5QjQwLCAweDlCN0UgfSwKLSAgICB7IDB4OUI4MCwgMHg5QkZFIH0sCi0gICAgeyAweDlDNDAsIDB4OUM3RSB9LAotICAgIHsgMHg5QzgwLCAweDlDRkUgfSwKLSAgICB7IDB4OUQ0MCwgMHg5RDdFIH0sCi0gICAgeyAweDlEODAsIDB4OURGRSB9LAotICAgIHsgMHg5RTQwLCAweDlFN0UgfSwKLSAgICB7IDB4OUU4MCwgMHg5RUZFIH0sCi0gICAgeyAweDlGNDAsIDB4OUY3RSB9LAotICAgIHsgMHg5RjgwLCAweDlGRkUgfSwKLSAgICB7IDB4QTA0MCwgMHhBMDdFIH0sCi0gICAgeyAweEEwODAsIDB4QTBGRSB9LAotICAgIHsgMHhBMUExLCAweEExRkUgfSwKLSAgICB7IDB4QTJBMSwgMHhBMkFBIH0sCi0gICAgeyAweEEyQjEsIDB4QTJFMiB9LAotICAgIHsgMHhBMkU1LCAweEEyRUUgfSwKLSAgICB7IDB4QTJGMSwgMHhBMkZDIH0sCi0gICAgeyAweEEzQTEsIDB4QTNGRSB9LAotICAgIHsgMHhBNEExLCAweEE0RjMgfSwKLSAgICB7IDB4QTVBMSwgMHhBNUY2IH0sCi0gICAgeyAweEE2QTEsIDB4QTZCOCB9LAotICAgIHsgMHhBNkMxLCAweEE2RDggfSwKLSAgICB7IDB4QTZFMCwgMHhBNkVCIH0sCi0gICAgeyAweEE2RUUsIDB4QTZGMiB9LAotICAgIHsgMHhBNkY0LCAweEE2RjUgfSwKLSAgICB7IDB4QTdBMSwgMHhBN0MxIH0sCi0gICAgeyAweEE3RDEsIDB4QTdGMSB9LAotICAgIHsgMHhBODQwLCAweEE4N0UgfSwKLSAgICB7IDB4QTg4MCwgMHhBODk1IH0sCi0gICAgeyAweEE4QTEsIDB4QThCQiB9LAotICAgIHsgMHhBOEJELCAweEE4QkUgfSwKLSAgICB7IDB4QThDMCwgMHhBOEMwIH0sCi0gICAgeyAweEE4QzUsIDB4QThFOSB9LAotICAgIHsgMHhBOTQwLCAweEE5NTcgfSwKLSAgICB7IDB4QTk1OSwgMHhBOTVBIH0sCi0gICAgeyAweEE5NUMsIDB4QTk1QyB9LAotICAgIHsgMHhBOTYwLCAweEE5N0UgfSwKLSAgICB7IDB4QTk4MCwgMHhBOTg4IH0sCi0gICAgeyAweEE5OTYsIDB4QTk5NiB9LAotICAgIHsgMHhBOUE0LCAweEE5RUYgfSwKLSAgICB7IDB4QUE0MCwgMHhBQTdFIH0sCi0gICAgeyAweEFBODAsIDB4QUFBMCB9LAotICAgIHsgMHhBQjQwLCAweEFCN0UgfSwKLSAgICB7IDB4QUI4MCwgMHhBQkEwIH0sCi0gICAgeyAweEFDNDAsIDB4QUM3RSB9LAotICAgIHsgMHhBQzgwLCAweEFDQTAgfSwKLSAgICB7IDB4QUQ0MCwgMHhBRDdFIH0sCi0gICAgeyAweEFEODAsIDB4QURBMCB9LAotICAgIHsgMHhBRTQwLCAweEFFN0UgfSwKLSAgICB7IDB4QUU4MCwgMHhBRUEwIH0sCi0gICAgeyAweEFGNDAsIDB4QUY3RSB9LAotICAgIHsgMHhBRjgwLCAweEFGQTAgfSwKLSAgICB7IDB4QjA0MCwgMHhCMDdFIH0sCi0gICAgeyAweEIwODAsIDB4QjBGRSB9LAotICAgIHsgMHhCMTQwLCAweEIxN0UgfSwKLSAgICB7IDB4QjE4MCwgMHhCMUZFIH0sCi0gICAgeyAweEIyNDAsIDB4QjI3RSB9LAotICAgIHsgMHhCMjgwLCAweEIyRkUgfSwKLSAgICB7IDB4QjM0MCwgMHhCMzdFIH0sCi0gICAgeyAweEIzODAsIDB4QjNGRSB9LAotICAgIHsgMHhCNDQwLCAweEI0N0UgfSwKLSAgICB7IDB4QjQ4MCwgMHhCNEZFIH0sCi0gICAgeyAweEI1NDAsIDB4QjU3RSB9LAotICAgIHsgMHhCNTgwLCAweEI1RkUgfSwKLSAgICB7IDB4QjY0MCwgMHhCNjdFIH0sCi0gICAgeyAweEI2ODAsIDB4QjZGRSB9LAotICAgIHsgMHhCNzQwLCAweEI3N0UgfSwKLSAgICB7IDB4Qjc4MCwgMHhCN0ZFIH0sCi0gICAgeyAweEI4NDAsIDB4Qjg3RSB9LAotICAgIHsgMHhCODgwLCAweEI4RkUgfSwKLSAgICB7IDB4Qjk0MCwgMHhCOTdFIH0sCi0gICAgeyAweEI5ODAsIDB4QjlGRSB9LAotICAgIHsgMHhCQTQwLCAweEJBN0UgfSwKLSAgICB7IDB4QkE4MCwgMHhCQUZFIH0sCi0gICAgeyAweEJCNDAsIDB4QkI3RSB9LAotICAgIHsgMHhCQjgwLCAweEJCRkUgfSwKLSAgICB7IDB4QkM0MCwgMHhCQzdFIH0sCi0gICAgeyAweEJDODAsIDB4QkNGRSB9LAotICAgIHsgMHhCRDQwLCAweEJEN0UgfSwKLSAgICB7IDB4QkQ4MCwgMHhCREZFIH0sCi0gICAgeyAweEJFNDAsIDB4QkU3RSB9LAotICAgIHsgMHhCRTgwLCAweEJFRkUgfSwKLSAgICB7IDB4QkY0MCwgMHhCRjdFIH0sCi0gICAgeyAweEJGODAsIDB4QkZGRSB9LAotICAgIHsgMHhDMDQwLCAweEMwN0UgfSwKLSAgICB7IDB4QzA4MCwgMHhDMEZFIH0sCi0gICAgeyAweEMxNDAsIDB4QzE3RSB9LAotICAgIHsgMHhDMTgwLCAweEMxRkUgfSwKLSAgICB7IDB4QzI0MCwgMHhDMjdFIH0sCi0gICAgeyAweEMyODAsIDB4QzJGRSB9LAotICAgIHsgMHhDMzQwLCAweEMzN0UgfSwKLSAgICB7IDB4QzM4MCwgMHhDM0ZFIH0sCi0gICAgeyAweEM0NDAsIDB4QzQ3RSB9LAotICAgIHsgMHhDNDgwLCAweEM0RkUgfSwKLSAgICB7IDB4QzU0MCwgMHhDNTdFIH0sCi0gICAgeyAweEM1ODAsIDB4QzVGRSB9LAotICAgIHsgMHhDNjQwLCAweEM2N0UgfSwKLSAgICB7IDB4QzY4MCwgMHhDNkZFIH0sCi0gICAgeyAweEM3NDAsIDB4Qzc3RSB9LAotICAgIHsgMHhDNzgwLCAweEM3RkUgfSwKLSAgICB7IDB4Qzg0MCwgMHhDODdFIH0sCi0gICAgeyAweEM4ODAsIDB4QzhGRSB9LAotICAgIHsgMHhDOTQwLCAweEM5N0UgfSwKLSAgICB7IDB4Qzk4MCwgMHhDOUZFIH0sCi0gICAgeyAweENBNDAsIDB4Q0E3RSB9LAotICAgIHsgMHhDQTgwLCAweENBRkUgfSwKLSAgICB7IDB4Q0I0MCwgMHhDQjdFIH0sCi0gICAgeyAweENCODAsIDB4Q0JGRSB9LAotICAgIHsgMHhDQzQwLCAweENDN0UgfSwKLSAgICB7IDB4Q0M4MCwgMHhDQ0ZFIH0sCi0gICAgeyAweENENDAsIDB4Q0Q3RSB9LAotICAgIHsgMHhDRDgwLCAweENERkUgfSwKLSAgICB7IDB4Q0U0MCwgMHhDRTdFIH0sCi0gICAgeyAweENFODAsIDB4Q0VGRSB9LAotICAgIHsgMHhDRjQwLCAweENGN0UgfSwKLSAgICB7IDB4Q0Y4MCwgMHhDRkZFIH0sCi0gICAgeyAweEQwNDAsIDB4RDA3RSB9LAotICAgIHsgMHhEMDgwLCAweEQwRkUgfSwKLSAgICB7IDB4RDE0MCwgMHhEMTdFIH0sCi0gICAgeyAweEQxODAsIDB4RDFGRSB9LAotICAgIHsgMHhEMjQwLCAweEQyN0UgfSwKLSAgICB7IDB4RDI4MCwgMHhEMkZFIH0sCi0gICAgeyAweEQzNDAsIDB4RDM3RSB9LAotICAgIHsgMHhEMzgwLCAweEQzRkUgfSwKLSAgICB7IDB4RDQ0MCwgMHhENDdFIH0sCi0gICAgeyAweEQ0ODAsIDB4RDRGRSB9LAotICAgIHsgMHhENTQwLCAweEQ1N0UgfSwKLSAgICB7IDB4RDU4MCwgMHhENUZFIH0sCi0gICAgeyAweEQ2NDAsIDB4RDY3RSB9LAotICAgIHsgMHhENjgwLCAweEQ2RkUgfSwKLSAgICB7IDB4RDc0MCwgMHhENzdFIH0sCi0gICAgeyAweEQ3ODAsIDB4RDdGOSB9LAotICAgIHsgMHhEODQwLCAweEQ4N0UgfSwKLSAgICB7IDB4RDg4MCwgMHhEOEZFIH0sCi0gICAgeyAweEQ5NDAsIDB4RDk3RSB9LAotICAgIHsgMHhEOTgwLCAweEQ5RkUgfSwKLSAgICB7IDB4REE0MCwgMHhEQTdFIH0sCi0gICAgeyAweERBODAsIDB4REFGRSB9LAotICAgIHsgMHhEQjQwLCAweERCN0UgfSwKLSAgICB7IDB4REI4MCwgMHhEQkZFIH0sCi0gICAgeyAweERDNDAsIDB4REM3RSB9LAotICAgIHsgMHhEQzgwLCAweERDRkUgfSwKLSAgICB7IDB4REQ0MCwgMHhERDdFIH0sCi0gICAgeyAweEREODAsIDB4RERGRSB9LAotICAgIHsgMHhERTQwLCAweERFN0UgfSwKLSAgICB7IDB4REU4MCwgMHhERUZFIH0sCi0gICAgeyAweERGNDAsIDB4REY3RSB9LAotICAgIHsgMHhERjgwLCAweERGRkUgfSwKLSAgICB7IDB4RTA0MCwgMHhFMDdFIH0sCi0gICAgeyAweEUwODAsIDB4RTBGRSB9LAotICAgIHsgMHhFMTQwLCAweEUxN0UgfSwKLSAgICB7IDB4RTE4MCwgMHhFMUZFIH0sCi0gICAgeyAweEUyNDAsIDB4RTI3RSB9LAotICAgIHsgMHhFMjgwLCAweEUyRkUgfSwKLSAgICB7IDB4RTM0MCwgMHhFMzdFIH0sCi0gICAgeyAweEUzODAsIDB4RTNGRSB9LAotICAgIHsgMHhFNDQwLCAweEU0N0UgfSwKLSAgICB7IDB4RTQ4MCwgMHhFNEZFIH0sCi0gICAgeyAweEU1NDAsIDB4RTU3RSB9LAotICAgIHsgMHhFNTgwLCAweEU1RkUgfSwKLSAgICB7IDB4RTY0MCwgMHhFNjdFIH0sCi0gICAgeyAweEU2ODAsIDB4RTZGRSB9LAotICAgIHsgMHhFNzQwLCAweEU3N0UgfSwKLSAgICB7IDB4RTc4MCwgMHhFN0ZFIH0sCi0gICAgeyAweEU4NDAsIDB4RTg3RSB9LAotICAgIHsgMHhFODgwLCAweEU4RkUgfSwKLSAgICB7IDB4RTk0MCwgMHhFOTdFIH0sCi0gICAgeyAweEU5ODAsIDB4RTlGRSB9LAotICAgIHsgMHhFQTQwLCAweEVBN0UgfSwKLSAgICB7IDB4RUE4MCwgMHhFQUZFIH0sCi0gICAgeyAweEVCNDAsIDB4RUI3RSB9LAotICAgIHsgMHhFQjgwLCAweEVCRkUgfSwKLSAgICB7IDB4RUM0MCwgMHhFQzdFIH0sCi0gICAgeyAweEVDODAsIDB4RUNGRSB9LAotICAgIHsgMHhFRDQwLCAweEVEN0UgfSwKLSAgICB7IDB4RUQ4MCwgMHhFREZFIH0sCi0gICAgeyAweEVFNDAsIDB4RUU3RSB9LAotICAgIHsgMHhFRTgwLCAweEVFRkUgfSwKLSAgICB7IDB4RUY0MCwgMHhFRjdFIH0sCi0gICAgeyAweEVGODAsIDB4RUZGRSB9LAotICAgIHsgMHhGMDQwLCAweEYwN0UgfSwKLSAgICB7IDB4RjA4MCwgMHhGMEZFIH0sCi0gICAgeyAweEYxNDAsIDB4RjE3RSB9LAotICAgIHsgMHhGMTgwLCAweEYxRkUgfSwKLSAgICB7IDB4RjI0MCwgMHhGMjdFIH0sCi0gICAgeyAweEYyODAsIDB4RjJGRSB9LAotICAgIHsgMHhGMzQwLCAweEYzN0UgfSwKLSAgICB7IDB4RjM4MCwgMHhGM0ZFIH0sCi0gICAgeyAweEY0NDAsIDB4RjQ3RSB9LAotICAgIHsgMHhGNDgwLCAweEY0RkUgfSwKLSAgICB7IDB4RjU0MCwgMHhGNTdFIH0sCi0gICAgeyAweEY1ODAsIDB4RjVGRSB9LAotICAgIHsgMHhGNjQwLCAweEY2N0UgfSwKLSAgICB7IDB4RjY4MCwgMHhGNkZFIH0sCi0gICAgeyAweEY3NDAsIDB4Rjc3RSB9LAotICAgIHsgMHhGNzgwLCAweEY3RkUgfSwKLSAgICB7IDB4Rjg0MCwgMHhGODdFIH0sCi0gICAgeyAweEY4ODAsIDB4RjhBMCB9LAotICAgIHsgMHhGOTQwLCAweEY5N0UgfSwKLSAgICB7IDB4Rjk4MCwgMHhGOUEwIH0sCi0gICAgeyAweEZBNDAsIDB4RkE3RSB9LAotICAgIHsgMHhGQTgwLCAweEZBQTAgfSwKLSAgICB7IDB4RkI0MCwgMHhGQjdFIH0sCi0gICAgeyAweEZCODAsIDB4RkJBMCB9LAotICAgIHsgMHhGQzQwLCAweEZDN0UgfSwKLSAgICB7IDB4RkM4MCwgMHhGQ0EwIH0sCi0gICAgeyAweEZENDAsIDB4RkQ3RSB9LAotICAgIHsgMHhGRDgwLCAweEZEQTAgfSwKLSAgICB7IDB4RkU0MCwgMHhGRTRGIH0sCi19OwotCi0vLyBnZW5lcmF0ZWQgZnJvbSBodHRwOi8vdW5pY29kZS5vcmcvUHVibGljL01BUFBJTkdTL1ZFTkRPUlMvTUlDU0ZUL1dJTkRPV1MvQ1A5NDkuVFhUCi1zdGF0aWMgY29uc3QgQ2hhclJhbmdlIGtFVUNLUlJhbmdlc1tdID0gewotICAgIHsgMHg4MTQxLCAweDgxNUEgfSwKLSAgICB7IDB4ODE2MSwgMHg4MTdBIH0sCi0gICAgeyAweDgxODEsIDB4ODFGRSB9LAotICAgIHsgMHg4MjQxLCAweDgyNUEgfSwKLSAgICB7IDB4ODI2MSwgMHg4MjdBIH0sCi0gICAgeyAweDgyODEsIDB4ODJGRSB9LAotICAgIHsgMHg4MzQxLCAweDgzNUEgfSwKLSAgICB7IDB4ODM2MSwgMHg4MzdBIH0sCi0gICAgeyAweDgzODEsIDB4ODNGRSB9LAotICAgIHsgMHg4NDQxLCAweDg0NUEgfSwKLSAgICB7IDB4ODQ2MSwgMHg4NDdBIH0sCi0gICAgeyAweDg0ODEsIDB4ODRGRSB9LAotICAgIHsgMHg4NTQxLCAweDg1NUEgfSwKLSAgICB7IDB4ODU2MSwgMHg4NTdBIH0sCi0gICAgeyAweDg1ODEsIDB4ODVGRSB9LAotICAgIHsgMHg4NjQxLCAweDg2NUEgfSwKLSAgICB7IDB4ODY2MSwgMHg4NjdBIH0sCi0gICAgeyAweDg2ODEsIDB4ODZGRSB9LAotICAgIHsgMHg4NzQxLCAweDg3NUEgfSwKLSAgICB7IDB4ODc2MSwgMHg4NzdBIH0sCi0gICAgeyAweDg3ODEsIDB4ODdGRSB9LAotICAgIHsgMHg4ODQxLCAweDg4NUEgfSwKLSAgICB7IDB4ODg2MSwgMHg4ODdBIH0sCi0gICAgeyAweDg4ODEsIDB4ODhGRSB9LAotICAgIHsgMHg4OTQxLCAweDg5NUEgfSwKLSAgICB7IDB4ODk2MSwgMHg4OTdBIH0sCi0gICAgeyAweDg5ODEsIDB4ODlGRSB9LAotICAgIHsgMHg4QTQxLCAweDhBNUEgfSwKLSAgICB7IDB4OEE2MSwgMHg4QTdBIH0sCi0gICAgeyAweDhBODEsIDB4OEFGRSB9LAotICAgIHsgMHg4QjQxLCAweDhCNUEgfSwKLSAgICB7IDB4OEI2MSwgMHg4QjdBIH0sCi0gICAgeyAweDhCODEsIDB4OEJGRSB9LAotICAgIHsgMHg4QzQxLCAweDhDNUEgfSwKLSAgICB7IDB4OEM2MSwgMHg4QzdBIH0sCi0gICAgeyAweDhDODEsIDB4OENGRSB9LAotICAgIHsgMHg4RDQxLCAweDhENUEgfSwKLSAgICB7IDB4OEQ2MSwgMHg4RDdBIH0sCi0gICAgeyAweDhEODEsIDB4OERGRSB9LAotICAgIHsgMHg4RTQxLCAweDhFNUEgfSwKLSAgICB7IDB4OEU2MSwgMHg4RTdBIH0sCi0gICAgeyAweDhFODEsIDB4OEVGRSB9LAotICAgIHsgMHg4RjQxLCAweDhGNUEgfSwKLSAgICB7IDB4OEY2MSwgMHg4RjdBIH0sCi0gICAgeyAweDhGODEsIDB4OEZGRSB9LAotICAgIHsgMHg5MDQxLCAweDkwNUEgfSwKLSAgICB7IDB4OTA2MSwgMHg5MDdBIH0sCi0gICAgeyAweDkwODEsIDB4OTBGRSB9LAotICAgIHsgMHg5MTQxLCAweDkxNUEgfSwKLSAgICB7IDB4OTE2MSwgMHg5MTdBIH0sCi0gICAgeyAweDkxODEsIDB4OTFGRSB9LAotICAgIHsgMHg5MjQxLCAweDkyNUEgfSwKLSAgICB7IDB4OTI2MSwgMHg5MjdBIH0sCi0gICAgeyAweDkyODEsIDB4OTJGRSB9LAotICAgIHsgMHg5MzQxLCAweDkzNUEgfSwKLSAgICB7IDB4OTM2MSwgMHg5MzdBIH0sCi0gICAgeyAweDkzODEsIDB4OTNGRSB9LAotICAgIHsgMHg5NDQxLCAweDk0NUEgfSwKLSAgICB7IDB4OTQ2MSwgMHg5NDdBIH0sCi0gICAgeyAweDk0ODEsIDB4OTRGRSB9LAotICAgIHsgMHg5NTQxLCAweDk1NUEgfSwKLSAgICB7IDB4OTU2MSwgMHg5NTdBIH0sCi0gICAgeyAweDk1ODEsIDB4OTVGRSB9LAotICAgIHsgMHg5NjQxLCAweDk2NUEgfSwKLSAgICB7IDB4OTY2MSwgMHg5NjdBIH0sCi0gICAgeyAweDk2ODEsIDB4OTZGRSB9LAotICAgIHsgMHg5NzQxLCAweDk3NUEgfSwKLSAgICB7IDB4OTc2MSwgMHg5NzdBIH0sCi0gICAgeyAweDk3ODEsIDB4OTdGRSB9LAotICAgIHsgMHg5ODQxLCAweDk4NUEgfSwKLSAgICB7IDB4OTg2MSwgMHg5ODdBIH0sCi0gICAgeyAweDk4ODEsIDB4OThGRSB9LAotICAgIHsgMHg5OTQxLCAweDk5NUEgfSwKLSAgICB7IDB4OTk2MSwgMHg5OTdBIH0sCi0gICAgeyAweDk5ODEsIDB4OTlGRSB9LAotICAgIHsgMHg5QTQxLCAweDlBNUEgfSwKLSAgICB7IDB4OUE2MSwgMHg5QTdBIH0sCi0gICAgeyAweDlBODEsIDB4OUFGRSB9LAotICAgIHsgMHg5QjQxLCAweDlCNUEgfSwKLSAgICB7IDB4OUI2MSwgMHg5QjdBIH0sCi0gICAgeyAweDlCODEsIDB4OUJGRSB9LAotICAgIHsgMHg5QzQxLCAweDlDNUEgfSwKLSAgICB7IDB4OUM2MSwgMHg5QzdBIH0sCi0gICAgeyAweDlDODEsIDB4OUNGRSB9LAotICAgIHsgMHg5RDQxLCAweDlENUEgfSwKLSAgICB7IDB4OUQ2MSwgMHg5RDdBIH0sCi0gICAgeyAweDlEODEsIDB4OURGRSB9LAotICAgIHsgMHg5RTQxLCAweDlFNUEgfSwKLSAgICB7IDB4OUU2MSwgMHg5RTdBIH0sCi0gICAgeyAweDlFODEsIDB4OUVGRSB9LAotICAgIHsgMHg5RjQxLCAweDlGNUEgfSwKLSAgICB7IDB4OUY2MSwgMHg5RjdBIH0sCi0gICAgeyAweDlGODEsIDB4OUZGRSB9LAotICAgIHsgMHhBMDQxLCAweEEwNUEgfSwKLSAgICB7IDB4QTA2MSwgMHhBMDdBIH0sCi0gICAgeyAweEEwODEsIDB4QTBGRSB9LAotICAgIHsgMHhBMTQxLCAweEExNUEgfSwKLSAgICB7IDB4QTE2MSwgMHhBMTdBIH0sCi0gICAgeyAweEExODEsIDB4QTFGRSB9LAotICAgIHsgMHhBMjQxLCAweEEyNUEgfSwKLSAgICB7IDB4QTI2MSwgMHhBMjdBIH0sCi0gICAgeyAweEEyODEsIDB4QTJFNyB9LAotICAgIHsgMHhBMzQxLCAweEEzNUEgfSwKLSAgICB7IDB4QTM2MSwgMHhBMzdBIH0sCi0gICAgeyAweEEzODEsIDB4QTNGRSB9LAotICAgIHsgMHhBNDQxLCAweEE0NUEgfSwKLSAgICB7IDB4QTQ2MSwgMHhBNDdBIH0sCi0gICAgeyAweEE0ODEsIDB4QTRGRSB9LAotICAgIHsgMHhBNTQxLCAweEE1NUEgfSwKLSAgICB7IDB4QTU2MSwgMHhBNTdBIH0sCi0gICAgeyAweEE1ODEsIDB4QTVBQSB9LAotICAgIHsgMHhBNUIwLCAweEE1QjkgfSwKLSAgICB7IDB4QTVDMSwgMHhBNUQ4IH0sCi0gICAgeyAweEE1RTEsIDB4QTVGOCB9LAotICAgIHsgMHhBNjQxLCAweEE2NUEgfSwKLSAgICB7IDB4QTY2MSwgMHhBNjdBIH0sCi0gICAgeyAweEE2ODEsIDB4QTZFNCB9LAotICAgIHsgMHhBNzQxLCAweEE3NUEgfSwKLSAgICB7IDB4QTc2MSwgMHhBNzdBIH0sCi0gICAgeyAweEE3ODEsIDB4QTdFRiB9LAotICAgIHsgMHhBODQxLCAweEE4NUEgfSwKLSAgICB7IDB4QTg2MSwgMHhBODdBIH0sCi0gICAgeyAweEE4ODEsIDB4QThBNCB9LAotICAgIHsgMHhBOEE2LCAweEE4QTYgfSwKLSAgICB7IDB4QThBOCwgMHhBOEFGIH0sCi0gICAgeyAweEE4QjEsIDB4QThGRSB9LAotICAgIHsgMHhBOTQxLCAweEE5NUEgfSwKLSAgICB7IDB4QTk2MSwgMHhBOTdBIH0sCi0gICAgeyAweEE5ODEsIDB4QTlGRSB9LAotICAgIHsgMHhBQTQxLCAweEFBNUEgfSwKLSAgICB7IDB4QUE2MSwgMHhBQTdBIH0sCi0gICAgeyAweEFBODEsIDB4QUFGMyB9LAotICAgIHsgMHhBQjQxLCAweEFCNUEgfSwKLSAgICB7IDB4QUI2MSwgMHhBQjdBIH0sCi0gICAgeyAweEFCODEsIDB4QUJGNiB9LAotICAgIHsgMHhBQzQxLCAweEFDNUEgfSwKLSAgICB7IDB4QUM2MSwgMHhBQzdBIH0sCi0gICAgeyAweEFDODEsIDB4QUNDMSB9LAotICAgIHsgMHhBQ0QxLCAweEFDRjEgfSwKLSAgICB7IDB4QUQ0MSwgMHhBRDVBIH0sCi0gICAgeyAweEFENjEsIDB4QUQ3QSB9LAotICAgIHsgMHhBRDgxLCAweEFEQTAgfSwKLSAgICB7IDB4QUU0MSwgMHhBRTVBIH0sCi0gICAgeyAweEFFNjEsIDB4QUU3QSB9LAotICAgIHsgMHhBRTgxLCAweEFFQTAgfSwKLSAgICB7IDB4QUY0MSwgMHhBRjVBIH0sCi0gICAgeyAweEFGNjEsIDB4QUY3QSB9LAotICAgIHsgMHhBRjgxLCAweEFGQTAgfSwKLSAgICB7IDB4QjA0MSwgMHhCMDVBIH0sCi0gICAgeyAweEIwNjEsIDB4QjA3QSB9LAotICAgIHsgMHhCMDgxLCAweEIwRkUgfSwKLSAgICB7IDB4QjE0MSwgMHhCMTVBIH0sCi0gICAgeyAweEIxNjEsIDB4QjE3QSB9LAotICAgIHsgMHhCMTgxLCAweEIxRkUgfSwKLSAgICB7IDB4QjI0MSwgMHhCMjVBIH0sCi0gICAgeyAweEIyNjEsIDB4QjI3QSB9LAotICAgIHsgMHhCMjgxLCAweEIyRkUgfSwKLSAgICB7IDB4QjM0MSwgMHhCMzVBIH0sCi0gICAgeyAweEIzNjEsIDB4QjM3QSB9LAotICAgIHsgMHhCMzgxLCAweEIzRkUgfSwKLSAgICB7IDB4QjQ0MSwgMHhCNDVBIH0sCi0gICAgeyAweEI0NjEsIDB4QjQ3QSB9LAotICAgIHsgMHhCNDgxLCAweEI0RkUgfSwKLSAgICB7IDB4QjU0MSwgMHhCNTVBIH0sCi0gICAgeyAweEI1NjEsIDB4QjU3QSB9LAotICAgIHsgMHhCNTgxLCAweEI1RkUgfSwKLSAgICB7IDB4QjY0MSwgMHhCNjVBIH0sCi0gICAgeyAweEI2NjEsIDB4QjY3QSB9LAotICAgIHsgMHhCNjgxLCAweEI2RkUgfSwKLSAgICB7IDB4Qjc0MSwgMHhCNzVBIH0sCi0gICAgeyAweEI3NjEsIDB4Qjc3QSB9LAotICAgIHsgMHhCNzgxLCAweEI3RkUgfSwKLSAgICB7IDB4Qjg0MSwgMHhCODVBIH0sCi0gICAgeyAweEI4NjEsIDB4Qjg3QSB9LAotICAgIHsgMHhCODgxLCAweEI4RkUgfSwKLSAgICB7IDB4Qjk0MSwgMHhCOTVBIH0sCi0gICAgeyAweEI5NjEsIDB4Qjk3QSB9LAotICAgIHsgMHhCOTgxLCAweEI5RkUgfSwKLSAgICB7IDB4QkE0MSwgMHhCQTVBIH0sCi0gICAgeyAweEJBNjEsIDB4QkE3QSB9LAotICAgIHsgMHhCQTgxLCAweEJBRkUgfSwKLSAgICB7IDB4QkI0MSwgMHhCQjVBIH0sCi0gICAgeyAweEJCNjEsIDB4QkI3QSB9LAotICAgIHsgMHhCQjgxLCAweEJCRkUgfSwKLSAgICB7IDB4QkM0MSwgMHhCQzVBIH0sCi0gICAgeyAweEJDNjEsIDB4QkM3QSB9LAotICAgIHsgMHhCQzgxLCAweEJDRkUgfSwKLSAgICB7IDB4QkQ0MSwgMHhCRDVBIH0sCi0gICAgeyAweEJENjEsIDB4QkQ3QSB9LAotICAgIHsgMHhCRDgxLCAweEJERkUgfSwKLSAgICB7IDB4QkU0MSwgMHhCRTVBIH0sCi0gICAgeyAweEJFNjEsIDB4QkU3QSB9LAotICAgIHsgMHhCRTgxLCAweEJFRkUgfSwKLSAgICB7IDB4QkY0MSwgMHhCRjVBIH0sCi0gICAgeyAweEJGNjEsIDB4QkY3QSB9LAotICAgIHsgMHhCRjgxLCAweEJGRkUgfSwKLSAgICB7IDB4QzA0MSwgMHhDMDVBIH0sCi0gICAgeyAweEMwNjEsIDB4QzA3QSB9LAotICAgIHsgMHhDMDgxLCAweEMwRkUgfSwKLSAgICB7IDB4QzE0MSwgMHhDMTVBIH0sCi0gICAgeyAweEMxNjEsIDB4QzE3QSB9LAotICAgIHsgMHhDMTgxLCAweEMxRkUgfSwKLSAgICB7IDB4QzI0MSwgMHhDMjVBIH0sCi0gICAgeyAweEMyNjEsIDB4QzI3QSB9LAotICAgIHsgMHhDMjgxLCAweEMyRkUgfSwKLSAgICB7IDB4QzM0MSwgMHhDMzVBIH0sCi0gICAgeyAweEMzNjEsIDB4QzM3QSB9LAotICAgIHsgMHhDMzgxLCAweEMzRkUgfSwKLSAgICB7IDB4QzQ0MSwgMHhDNDVBIH0sCi0gICAgeyAweEM0NjEsIDB4QzQ3QSB9LAotICAgIHsgMHhDNDgxLCAweEM0RkUgfSwKLSAgICB7IDB4QzU0MSwgMHhDNTVBIH0sCi0gICAgeyAweEM1NjEsIDB4QzU3QSB9LAotICAgIHsgMHhDNTgxLCAweEM1RkUgfSwKLSAgICB7IDB4QzY0MSwgMHhDNjUyIH0sCi0gICAgeyAweEM2QTEsIDB4QzZGRSB9LAotICAgIHsgMHhDN0ExLCAweEM3RkUgfSwKLSAgICB7IDB4QzhBMSwgMHhDOEZFIH0sCi0gICAgeyAweENBQTEsIDB4Q0FGRSB9LAotICAgIHsgMHhDQkExLCAweENCRkUgfSwKLSAgICB7IDB4Q0NBMSwgMHhDQ0ZFIH0sCi0gICAgeyAweENEQTEsIDB4Q0RGRSB9LAotICAgIHsgMHhDRUExLCAweENFRkUgfSwKLSAgICB7IDB4Q0ZBMSwgMHhDRkZFIH0sCi0gICAgeyAweEQwQTEsIDB4RDBGRSB9LAotICAgIHsgMHhEMUExLCAweEQxRkUgfSwKLSAgICB7IDB4RDJBMSwgMHhEMkZFIH0sCi0gICAgeyAweEQzQTEsIDB4RDNGRSB9LAotICAgIHsgMHhENEExLCAweEQ0RkUgfSwKLSAgICB7IDB4RDVBMSwgMHhENUZFIH0sCi0gICAgeyAweEQ2QTEsIDB4RDZGRSB9LAotICAgIHsgMHhEN0ExLCAweEQ3RkUgfSwKLSAgICB7IDB4RDhBMSwgMHhEOEZFIH0sCi0gICAgeyAweEQ5QTEsIDB4RDlGRSB9LAotICAgIHsgMHhEQUExLCAweERBRkUgfSwKLSAgICB7IDB4REJBMSwgMHhEQkZFIH0sCi0gICAgeyAweERDQTEsIDB4RENGRSB9LAotICAgIHsgMHhEREExLCAweERERkUgfSwKLSAgICB7IDB4REVBMSwgMHhERUZFIH0sCi0gICAgeyAweERGQTEsIDB4REZGRSB9LAotICAgIHsgMHhFMEExLCAweEUwRkUgfSwKLSAgICB7IDB4RTFBMSwgMHhFMUZFIH0sCi0gICAgeyAweEUyQTEsIDB4RTJGRSB9LAotICAgIHsgMHhFM0ExLCAweEUzRkUgfSwKLSAgICB7IDB4RTRBMSwgMHhFNEZFIH0sCi0gICAgeyAweEU1QTEsIDB4RTVGRSB9LAotICAgIHsgMHhFNkExLCAweEU2RkUgfSwKLSAgICB7IDB4RTdBMSwgMHhFN0ZFIH0sCi0gICAgeyAweEU4QTEsIDB4RThGRSB9LAotICAgIHsgMHhFOUExLCAweEU5RkUgfSwKLSAgICB7IDB4RUFBMSwgMHhFQUZFIH0sCi0gICAgeyAweEVCQTEsIDB4RUJGRSB9LAotICAgIHsgMHhFQ0ExLCAweEVDRkUgfSwKLSAgICB7IDB4RURBMSwgMHhFREZFIH0sCi0gICAgeyAweEVFQTEsIDB4RUVGRSB9LAotICAgIHsgMHhFRkExLCAweEVGRkUgfSwKLSAgICB7IDB4RjBBMSwgMHhGMEZFIH0sCi0gICAgeyAweEYxQTEsIDB4RjFGRSB9LAotICAgIHsgMHhGMkExLCAweEYyRkUgfSwKLSAgICB7IDB4RjNBMSwgMHhGM0ZFIH0sCi0gICAgeyAweEY0QTEsIDB4RjRGRSB9LAotICAgIHsgMHhGNUExLCAweEY1RkUgfSwKLSAgICB7IDB4RjZBMSwgMHhGNkZFIH0sCi0gICAgeyAweEY3QTEsIDB4RjdGRSB9LAotICAgIHsgMHhGOEExLCAweEY4RkUgfSwKLSAgICB7IDB4RjlBMSwgMHhGOUZFIH0sCi0gICAgeyAweEZBQTEsIDB4RkFGRSB9LAotICAgIHsgMHhGQkExLCAweEZCRkUgfSwKLSAgICB7IDB4RkNBMSwgMHhGQ0ZFIH0sCi0gICAgeyAweEZEQTEsIDB4RkRGRSB9LAotfTsKLQotLy8gZ2VuZXJhdGVkIGZyb20gaHR0cDovL3VuaWNvZGUub3JnL1B1YmxpYy9NQVBQSU5HUy9WRU5ET1JTL01JQ1NGVC9XSU5ET1dTL0NQOTUwLlRYVAotc3RhdGljIGNvbnN0IENoYXJSYW5nZSBrQmlnNVJhbmdlc1tdID0gewotICAgIHsgMHhBMTQwLCAweEExN0UgfSwKLSAgICB7IDB4QTFBMSwgMHhBMUZFIH0sCi0gICAgeyAweEEyNDAsIDB4QTI3RSB9LAotICAgIHsgMHhBMkExLCAweEEyRkUgfSwKLSAgICB7IDB4QTM0MCwgMHhBMzdFIH0sCi0gICAgeyAweEEzQTEsIDB4QTNCRiB9LAotICAgIHsgMHhBM0UxLCAweEEzRTEgfSwKLSAgICB7IDB4QTQ0MCwgMHhBNDdFIH0sCi0gICAgeyAweEE0QTEsIDB4QTRGRSB9LAotICAgIHsgMHhBNTQwLCAweEE1N0UgfSwKLSAgICB7IDB4QTVBMSwgMHhBNUZFIH0sCi0gICAgeyAweEE2NDAsIDB4QTY3RSB9LAotICAgIHsgMHhBNkExLCAweEE2RkUgfSwKLSAgICB7IDB4QTc0MCwgMHhBNzdFIH0sCi0gICAgeyAweEE3QTEsIDB4QTdGRSB9LAotICAgIHsgMHhBODQwLCAweEE4N0UgfSwKLSAgICB7IDB4QThBMSwgMHhBOEZFIH0sCi0gICAgeyAweEE5NDAsIDB4QTk3RSB9LAotICAgIHsgMHhBOUExLCAweEE5RkUgfSwKLSAgICB7IDB4QUE0MCwgMHhBQTdFIH0sCi0gICAgeyAweEFBQTEsIDB4QUFGRSB9LAotICAgIHsgMHhBQjQwLCAweEFCN0UgfSwKLSAgICB7IDB4QUJBMSwgMHhBQkZFIH0sCi0gICAgeyAweEFDNDAsIDB4QUM3RSB9LAotICAgIHsgMHhBQ0ExLCAweEFDRkUgfSwKLSAgICB7IDB4QUQ0MCwgMHhBRDdFIH0sCi0gICAgeyAweEFEQTEsIDB4QURGRSB9LAotICAgIHsgMHhBRTQwLCAweEFFN0UgfSwKLSAgICB7IDB4QUVBMSwgMHhBRUZFIH0sCi0gICAgeyAweEFGNDAsIDB4QUY3RSB9LAotICAgIHsgMHhBRkExLCAweEFGRkUgfSwKLSAgICB7IDB4QjA0MCwgMHhCMDdFIH0sCi0gICAgeyAweEIwQTEsIDB4QjBGRSB9LAotICAgIHsgMHhCMTQwLCAweEIxN0UgfSwKLSAgICB7IDB4QjFBMSwgMHhCMUZFIH0sCi0gICAgeyAweEIyNDAsIDB4QjI3RSB9LAotICAgIHsgMHhCMkExLCAweEIyRkUgfSwKLSAgICB7IDB4QjM0MCwgMHhCMzdFIH0sCi0gICAgeyAweEIzQTEsIDB4QjNGRSB9LAotICAgIHsgMHhCNDQwLCAweEI0N0UgfSwKLSAgICB7IDB4QjRBMSwgMHhCNEZFIH0sCi0gICAgeyAweEI1NDAsIDB4QjU3RSB9LAotICAgIHsgMHhCNUExLCAweEI1RkUgfSwKLSAgICB7IDB4QjY0MCwgMHhCNjdFIH0sCi0gICAgeyAweEI2QTEsIDB4QjZGRSB9LAotICAgIHsgMHhCNzQwLCAweEI3N0UgfSwKLSAgICB7IDB4QjdBMSwgMHhCN0ZFIH0sCi0gICAgeyAweEI4NDAsIDB4Qjg3RSB9LAotICAgIHsgMHhCOEExLCAweEI4RkUgfSwKLSAgICB7IDB4Qjk0MCwgMHhCOTdFIH0sCi0gICAgeyAweEI5QTEsIDB4QjlGRSB9LAotICAgIHsgMHhCQTQwLCAweEJBN0UgfSwKLSAgICB7IDB4QkFBMSwgMHhCQUZFIH0sCi0gICAgeyAweEJCNDAsIDB4QkI3RSB9LAotICAgIHsgMHhCQkExLCAweEJCRkUgfSwKLSAgICB7IDB4QkM0MCwgMHhCQzdFIH0sCi0gICAgeyAweEJDQTEsIDB4QkNGRSB9LAotICAgIHsgMHhCRDQwLCAweEJEN0UgfSwKLSAgICB7IDB4QkRBMSwgMHhCREZFIH0sCi0gICAgeyAweEJFNDAsIDB4QkU3RSB9LAotICAgIHsgMHhCRUExLCAweEJFRkUgfSwKLSAgICB7IDB4QkY0MCwgMHhCRjdFIH0sCi0gICAgeyAweEJGQTEsIDB4QkZGRSB9LAotICAgIHsgMHhDMDQwLCAweEMwN0UgfSwKLSAgICB7IDB4QzBBMSwgMHhDMEZFIH0sCi0gICAgeyAweEMxNDAsIDB4QzE3RSB9LAotICAgIHsgMHhDMUExLCAweEMxRkUgfSwKLSAgICB7IDB4QzI0MCwgMHhDMjdFIH0sCi0gICAgeyAweEMyQTEsIDB4QzJGRSB9LAotICAgIHsgMHhDMzQwLCAweEMzN0UgfSwKLSAgICB7IDB4QzNBMSwgMHhDM0ZFIH0sCi0gICAgeyAweEM0NDAsIDB4QzQ3RSB9LAotICAgIHsgMHhDNEExLCAweEM0RkUgfSwKLSAgICB7IDB4QzU0MCwgMHhDNTdFIH0sCi0gICAgeyAweEM1QTEsIDB4QzVGRSB9LAotICAgIHsgMHhDNjQwLCAweEM2N0UgfSwKLSAgICB7IDB4Qzk0MCwgMHhDOTdFIH0sCi0gICAgeyAweEM5QTEsIDB4QzlGRSB9LAotICAgIHsgMHhDQTQwLCAweENBN0UgfSwKLSAgICB7IDB4Q0FBMSwgMHhDQUZFIH0sCi0gICAgeyAweENCNDAsIDB4Q0I3RSB9LAotICAgIHsgMHhDQkExLCAweENCRkUgfSwKLSAgICB7IDB4Q0M0MCwgMHhDQzdFIH0sCi0gICAgeyAweENDQTEsIDB4Q0NGRSB9LAotICAgIHsgMHhDRDQwLCAweENEN0UgfSwKLSAgICB7IDB4Q0RBMSwgMHhDREZFIH0sCi0gICAgeyAweENFNDAsIDB4Q0U3RSB9LAotICAgIHsgMHhDRUExLCAweENFRkUgfSwKLSAgICB7IDB4Q0Y0MCwgMHhDRjdFIH0sCi0gICAgeyAweENGQTEsIDB4Q0ZGRSB9LAotICAgIHsgMHhEMDQwLCAweEQwN0UgfSwKLSAgICB7IDB4RDBBMSwgMHhEMEZFIH0sCi0gICAgeyAweEQxNDAsIDB4RDE3RSB9LAotICAgIHsgMHhEMUExLCAweEQxRkUgfSwKLSAgICB7IDB4RDI0MCwgMHhEMjdFIH0sCi0gICAgeyAweEQyQTEsIDB4RDJGRSB9LAotICAgIHsgMHhEMzQwLCAweEQzN0UgfSwKLSAgICB7IDB4RDNBMSwgMHhEM0ZFIH0sCi0gICAgeyAweEQ0NDAsIDB4RDQ3RSB9LAotICAgIHsgMHhENEExLCAweEQ0RkUgfSwKLSAgICB7IDB4RDU0MCwgMHhENTdFIH0sCi0gICAgeyAweEQ1QTEsIDB4RDVGRSB9LAotICAgIHsgMHhENjQwLCAweEQ2N0UgfSwKLSAgICB7IDB4RDZBMSwgMHhENkZFIH0sCi0gICAgeyAweEQ3NDAsIDB4RDc3RSB9LAotICAgIHsgMHhEN0ExLCAweEQ3RkUgfSwKLSAgICB7IDB4RDg0MCwgMHhEODdFIH0sCi0gICAgeyAweEQ4QTEsIDB4RDhGRSB9LAotICAgIHsgMHhEOTQwLCAweEQ5N0UgfSwKLSAgICB7IDB4RDlBMSwgMHhEOUZFIH0sCi0gICAgeyAweERBNDAsIDB4REE3RSB9LAotICAgIHsgMHhEQUExLCAweERBRkUgfSwKLSAgICB7IDB4REI0MCwgMHhEQjdFIH0sCi0gICAgeyAweERCQTEsIDB4REJGRSB9LAotICAgIHsgMHhEQzQwLCAweERDN0UgfSwKLSAgICB7IDB4RENBMSwgMHhEQ0ZFIH0sCi0gICAgeyAweERENDAsIDB4REQ3RSB9LAotICAgIHsgMHhEREExLCAweERERkUgfSwKLSAgICB7IDB4REU0MCwgMHhERTdFIH0sCi0gICAgeyAweERFQTEsIDB4REVGRSB9LAotICAgIHsgMHhERjQwLCAweERGN0UgfSwKLSAgICB7IDB4REZBMSwgMHhERkZFIH0sCi0gICAgeyAweEUwNDAsIDB4RTA3RSB9LAotICAgIHsgMHhFMEExLCAweEUwRkUgfSwKLSAgICB7IDB4RTE0MCwgMHhFMTdFIH0sCi0gICAgeyAweEUxQTEsIDB4RTFGRSB9LAotICAgIHsgMHhFMjQwLCAweEUyN0UgfSwKLSAgICB7IDB4RTJBMSwgMHhFMkZFIH0sCi0gICAgeyAweEUzNDAsIDB4RTM3RSB9LAotICAgIHsgMHhFM0ExLCAweEUzRkUgfSwKLSAgICB7IDB4RTQ0MCwgMHhFNDdFIH0sCi0gICAgeyAweEU0QTEsIDB4RTRGRSB9LAotICAgIHsgMHhFNTQwLCAweEU1N0UgfSwKLSAgICB7IDB4RTVBMSwgMHhFNUZFIH0sCi0gICAgeyAweEU2NDAsIDB4RTY3RSB9LAotICAgIHsgMHhFNkExLCAweEU2RkUgfSwKLSAgICB7IDB4RTc0MCwgMHhFNzdFIH0sCi0gICAgeyAweEU3QTEsIDB4RTdGRSB9LAotICAgIHsgMHhFODQwLCAweEU4N0UgfSwKLSAgICB7IDB4RThBMSwgMHhFOEZFIH0sCi0gICAgeyAweEU5NDAsIDB4RTk3RSB9LAotICAgIHsgMHhFOUExLCAweEU5RkUgfSwKLSAgICB7IDB4RUE0MCwgMHhFQTdFIH0sCi0gICAgeyAweEVBQTEsIDB4RUFGRSB9LAotICAgIHsgMHhFQjQwLCAweEVCN0UgfSwKLSAgICB7IDB4RUJBMSwgMHhFQkZFIH0sCi0gICAgeyAweEVDNDAsIDB4RUM3RSB9LAotICAgIHsgMHhFQ0ExLCAweEVDRkUgfSwKLSAgICB7IDB4RUQ0MCwgMHhFRDdFIH0sCi0gICAgeyAweEVEQTEsIDB4RURGRSB9LAotICAgIHsgMHhFRTQwLCAweEVFN0UgfSwKLSAgICB7IDB4RUVBMSwgMHhFRUZFIH0sCi0gICAgeyAweEVGNDAsIDB4RUY3RSB9LAotICAgIHsgMHhFRkExLCAweEVGRkUgfSwKLSAgICB7IDB4RjA0MCwgMHhGMDdFIH0sCi0gICAgeyAweEYwQTEsIDB4RjBGRSB9LAotICAgIHsgMHhGMTQwLCAweEYxN0UgfSwKLSAgICB7IDB4RjFBMSwgMHhGMUZFIH0sCi0gICAgeyAweEYyNDAsIDB4RjI3RSB9LAotICAgIHsgMHhGMkExLCAweEYyRkUgfSwKLSAgICB7IDB4RjM0MCwgMHhGMzdFIH0sCi0gICAgeyAweEYzQTEsIDB4RjNGRSB9LAotICAgIHsgMHhGNDQwLCAweEY0N0UgfSwKLSAgICB7IDB4RjRBMSwgMHhGNEZFIH0sCi0gICAgeyAweEY1NDAsIDB4RjU3RSB9LAotICAgIHsgMHhGNUExLCAweEY1RkUgfSwKLSAgICB7IDB4RjY0MCwgMHhGNjdFIH0sCi0gICAgeyAweEY2QTEsIDB4RjZGRSB9LAotICAgIHsgMHhGNzQwLCAweEY3N0UgfSwKLSAgICB7IDB4RjdBMSwgMHhGN0ZFIH0sCi0gICAgeyAweEY4NDAsIDB4Rjg3RSB9LAotICAgIHsgMHhGOEExLCAweEY4RkUgfSwKLSAgICB7IDB4Rjk0MCwgMHhGOTdFIH0sCi0gICAgeyAweEY5QTEsIDB4RjlGRSB9LAotfTsKLQotc3RhdGljIGJvb2wgY2hhck1hdGNoZXNFbmNvZGluZyhpbnQgY2gsIGNvbnN0IENoYXJSYW5nZSogZW5jb2RpbmdSYW5nZXMsIGludCByYW5nZUNvdW50KSB7Ci0gICAgLy8gVXNlIGJpbmFyeSBzZWFyY2ggdG8gc2VlIGlmIHRoZSBjaGFyYWN0ZXIgaXMgY29udGFpbmVkIGluIHRoZSBlbmNvZGluZwotICAgIGludCBsb3cgPSAwOwotICAgIGludCBoaWdoID0gcmFuZ2VDb3VudDsKLQotICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7Ci0gICAgICAgIGludCBpID0gKGxvdyArIGhpZ2gpIC8gMjsKLSAgICAgICAgY29uc3QgQ2hhclJhbmdlKiByYW5nZSA9ICZlbmNvZGluZ1Jhbmdlc1tpXTsKLSAgICAgICAgaWYgKGNoID49IHJhbmdlLT5maXJzdCAmJiBjaCA8PSByYW5nZS0+bGFzdCkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoY2ggPiByYW5nZS0+bGFzdCkKLSAgICAgICAgICAgIGxvdyA9IGkgKyAxOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBoaWdoID0gaTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWV4dGVybiB1aW50MzJfdCBmaW5kUG9zc2libGVFbmNvZGluZ3MoaW50IGNoKQotewotICAgIC8vIEFTQ0lJIG1hdGNoZXMgZXZlcnl0aGluZwotICAgIGlmIChjaCA8IDI1NikgcmV0dXJuIGtFbmNvZGluZ0FsbDsKLQotICAgIGludCByZXN1bHQgPSBrRW5jb2RpbmdOb25lOwotCi0gICAgaWYgKGNoYXJNYXRjaGVzRW5jb2RpbmcoY2gsIGtTaGlmdEpJU1JhbmdlcywgQVJSQVlfU0laRShrU2hpZnRKSVNSYW5nZXMpKSkKLSAgICAgICAgcmVzdWx0IHw9IGtFbmNvZGluZ1NoaWZ0SklTOwotICAgIGlmIChjaGFyTWF0Y2hlc0VuY29kaW5nKGNoLCBrR0JLUmFuZ2VzLCBBUlJBWV9TSVpFKGtHQktSYW5nZXMpKSkKLSAgICAgICAgcmVzdWx0IHw9IGtFbmNvZGluZ0dCSzsKLSAgICBpZiAoY2hhck1hdGNoZXNFbmNvZGluZyhjaCwga0JpZzVSYW5nZXMsIEFSUkFZX1NJWkUoa0JpZzVSYW5nZXMpKSkKLSAgICAgICAgcmVzdWx0IHw9IGtFbmNvZGluZ0JpZzU7Ci0gICAgaWYgKGNoYXJNYXRjaGVzRW5jb2RpbmcoY2gsIGtFVUNLUlJhbmdlcywgQVJSQVlfU0laRShrRVVDS1JSYW5nZXMpKSkKLSAgICAgICAgcmVzdWx0IHw9IGtFbmNvZGluZ0VVQ0tSOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2F1dG9kZXRlY3QuaCBiL21lZGlhL2xpYm1lZGlhL2F1dG9kZXRlY3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY3NWRiMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYS9hdXRvZGV0ZWN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBVVRPREVURUNUX0gKLSNkZWZpbmUgQVVUT0RFVEVDVF9ICi0KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotCi0vLyBmbGFncyB1c2VkIGZvciBuYXRpdmUgZW5jb2RpbmcgZGV0ZWN0aW9uCi1lbnVtIHsKLSAgICBrRW5jb2RpbmdOb25lICAgICAgICAgICAgICAgPSAwLAotICAgIGtFbmNvZGluZ1NoaWZ0SklTICAgICAgICAgICA9ICgxIDw8IDApLAotICAgIGtFbmNvZGluZ0dCSyAgICAgICAgICAgICAgICA9ICgxIDw8IDEpLAotICAgIGtFbmNvZGluZ0JpZzUgICAgICAgICAgICAgICA9ICgxIDw8IDIpLAotICAgIGtFbmNvZGluZ0VVQ0tSICAgICAgICAgICAgICA9ICgxIDw8IDMpLAotCi0gICAga0VuY29kaW5nQWxsICAgICAgICAgICAgICAgID0gKGtFbmNvZGluZ1NoaWZ0SklTIHwga0VuY29kaW5nR0JLIHwga0VuY29kaW5nQmlnNSB8IGtFbmNvZGluZ0VVQ0tSKSwKLX07Ci0KLQotLy8gcmV0dXJucyBhIGJpdGZpZWxkIGNvbnRhaW5pbmcgdGhlIHBvc3NpYmxlIG5hdGl2ZSBlbmNvZGluZ3MgZm9yIHRoZSBnaXZlbiBjaGFyYWN0ZXIKLWV4dGVybiB1aW50MzJfdCBmaW5kUG9zc2libGVFbmNvZGluZ3MoaW50IGNoKTsKLQotI2VuZGlmIC8vIEFVVE9ERVRFQ1RfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmNwcAppbmRleCAwODU3NDYxLi42N2Q0MTM5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmNwcApAQCAtMTgsOSArMTgsMTIgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiTWVkaWFNZXRhZGF0YVJldHJpZXZlciIKIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPGRsZmNuLmg+CkBAIC05Myw3ICs5Niw5IEBACiB9CiAKIHN0YXR1c190IE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI6OnNldERhdGFTb3VyY2UoCi0gICAgICAgIGNvbnN0IGNoYXIgKnNyY1VybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpCisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIgKnNyY1VybCwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpCiB7CiAgICAgQUxPR1YoInNldERhdGFTb3VyY2UiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtMTA2LDEyICsxMTEsMTIgQEAKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogICAgIEFMT0dWKCJkYXRhIHNvdXJjZSAoJXMpIiwgc3JjVXJsKTsKLSAgICByZXR1cm4gbVJldHJpZXZlci0+c2V0RGF0YVNvdXJjZShzcmNVcmwsIGhlYWRlcnMpOworICAgIHJldHVybiBtUmV0cmlldmVyLT5zZXREYXRhU291cmNlKGh0dHBTZXJ2aWNlLCBzcmNVcmwsIGhlYWRlcnMpOwogfQogCiBzdGF0dXNfdCBNZWRpYU1ldGFkYXRhUmV0cmlldmVyOjpzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKQogewotICAgIEFMT0dWKCJzZXREYXRhU291cmNlKCVkLCAlbGxkLCAlbGxkKSIsIGZkLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgQUxPR1YoInNldERhdGFTb3VyY2UoJWQsICUiIFBSSWQ2NCAiLCAlIiBQUklkNjQgIikiLCBmZCwgb2Zmc2V0LCBsZW5ndGgpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1SZXRyaWV2ZXIgPT0gMCkgewogICAgICAgICBBTE9HRSgicmV0cmlldmVyIGlzIG5vdCBpbml0aWFsaXplZCIpOwpAQCAtMTI2LDcgKzEzMSw3IEBACiAKIHNwPElNZW1vcnk+IE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI6OmdldEZyYW1lQXRUaW1lKGludDY0X3QgdGltZVVzLCBpbnQgb3B0aW9uKQogewotICAgIEFMT0dWKCJnZXRGcmFtZUF0VGltZTogdGltZSglbGxkIHVzKSBvcHRpb24oJWQpIiwgdGltZVVzLCBvcHRpb24pOworICAgIEFMT0dWKCJnZXRGcmFtZUF0VGltZTogdGltZSglIiBQUklkNjQgIiB1cykgb3B0aW9uKCVkKSIsIHRpbWVVcywgb3B0aW9uKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChtUmV0cmlldmVyID09IDApIHsKICAgICAgICAgQUxPR0UoInJldHJpZXZlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKQEAgLTE1Nyw3ICsxNjIsNyBAQAogICAgIHJldHVybiBtUmV0cmlldmVyLT5leHRyYWN0QWxidW1BcnQoKTsKIH0KIAotdm9pZCBNZWRpYU1ldGFkYXRhUmV0cmlldmVyOjpEZWF0aE5vdGlmaWVyOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pIHsKK3ZvaWQgTWVkaWFNZXRhZGF0YVJldHJpZXZlcjo6RGVhdGhOb3RpZmllcjo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soTWVkaWFNZXRhZGF0YVJldHJpZXZlcjo6c1NlcnZpY2VMb2NrKTsKICAgICBNZWRpYU1ldGFkYXRhUmV0cmlldmVyOjpzU2VydmljZS5jbGVhcigpOwogICAgIEFMT0dXKCJNZWRpYU1ldGFkYXRhUmV0cmlldmVyIHNlcnZlciBkaWVkISIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIuY3BwCmluZGV4IDM3MGJkMmQuLjM1N2VmODUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAKQEAgLTE3LDEyICsxNywxNCBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIk1lZGlhUGxheWVyIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgpAQCAtNDgsNiArNTAsNyBAQAogICAgIG1MaXN0ZW5lciA9IE5VTEw7CiAgICAgbUNvb2tpZSA9IE5VTEw7CiAgICAgbVN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fTVVTSUM7CisgICAgbUF1ZGlvQXR0cmlidXRlc1BhcmNlbCA9IE5VTEw7CiAgICAgbUN1cnJlbnRQb3NpdGlvbiA9IC0xOwogICAgIG1TZWVrUG9zaXRpb24gPSAtMTsKICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSX0lETEU7CkBAIC01Nyw4ICs2MCw4IEBACiAgICAgbUxlZnRWb2x1bWUgPSBtUmlnaHRWb2x1bWUgPSAxLjA7CiAgICAgbVZpZGVvV2lkdGggPSBtVmlkZW9IZWlnaHQgPSAwOwogICAgIG1Mb2NrVGhyZWFkSWQgPSAwOwotICAgIG1BdWRpb1Nlc3Npb25JZCA9IEF1ZGlvU3lzdGVtOjpuZXdBdWRpb1Nlc3Npb25JZCgpOwotICAgIEF1ZGlvU3lzdGVtOjphY3F1aXJlQXVkaW9TZXNzaW9uSWQobUF1ZGlvU2Vzc2lvbklkKTsKKyAgICBtQXVkaW9TZXNzaW9uSWQgPSBBdWRpb1N5c3RlbTo6bmV3QXVkaW9VbmlxdWVJZCgpOworICAgIEF1ZGlvU3lzdGVtOjphY3F1aXJlQXVkaW9TZXNzaW9uSWQobUF1ZGlvU2Vzc2lvbklkLCAtMSk7CiAgICAgbVNlbmRMZXZlbCA9IDA7CiAgICAgbVJldHJhbnNtaXRFbmRwb2ludFZhbGlkID0gZmFsc2U7CiB9CkBAIC02Niw3ICs2OSwxMSBAQAogTWVkaWFQbGF5ZXI6On5NZWRpYVBsYXllcigpCiB7CiAgICAgQUxPR1YoImRlc3RydWN0b3IiKTsKLSAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUF1ZGlvU2Vzc2lvbklkKG1BdWRpb1Nlc3Npb25JZCk7CisgICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbUF1ZGlvQXR0cmlidXRlc1BhcmNlbDsKKyAgICAgICAgbUF1ZGlvQXR0cmlidXRlc1BhcmNlbCA9IE5VTEw7CisgICAgfQorICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobUF1ZGlvU2Vzc2lvbklkLCAtMSk7CiAgICAgZGlzY29ubmVjdCgpOwogICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKIH0KQEAgLTEzNiw2ICsxNDMsNyBAQAogfQogCiBzdGF0dXNfdCBNZWRpYVBsYXllcjo6c2V0RGF0YVNvdXJjZSgKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykKIHsKICAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglcykiLCB1cmwpOwpAQCAtMTQ1LDcgKzE1Myw3IEBACiAgICAgICAgIGlmIChzZXJ2aWNlICE9IDApIHsKICAgICAgICAgICAgIHNwPElNZWRpYVBsYXllcj4gcGxheWVyKHNlcnZpY2UtPmNyZWF0ZSh0aGlzLCBtQXVkaW9TZXNzaW9uSWQpKTsKICAgICAgICAgICAgIGlmICgoTk9fRVJST1IgIT0gZG9TZXRSZXRyYW5zbWl0RW5kcG9pbnQocGxheWVyKSkgfHwKLSAgICAgICAgICAgICAgICAoTk9fRVJST1IgIT0gcGxheWVyLT5zZXREYXRhU291cmNlKHVybCwgaGVhZGVycykpKSB7CisgICAgICAgICAgICAgICAgKE5PX0VSUk9SICE9IHBsYXllci0+c2V0RGF0YVNvdXJjZShodHRwU2VydmljZSwgdXJsLCBoZWFkZXJzKSkpIHsKICAgICAgICAgICAgICAgICBwbGF5ZXIuY2xlYXIoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVyciA9IGF0dGFjaE5ld1BsYXllcihwbGF5ZXIpOwpAQCAtMTU2LDcgKzE2NCw3IEBACiAKIHN0YXR1c190IE1lZGlhUGxheWVyOjpzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKQogewotICAgIEFMT0dWKCJzZXREYXRhU291cmNlKCVkLCAlbGxkLCAlbGxkKSIsIGZkLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgQUxPR1YoInNldERhdGFTb3VyY2UoJWQsICUiIFBSSWQ2NCAiLCAlIiBQUklkNjQgIikiLCBmZCwgb2Zmc2V0LCBsZW5ndGgpOwogICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CiAgICAgY29uc3Qgc3A8SU1lZGlhUGxheWVyU2VydmljZT4gc2VydmljZShnZXRNZWRpYVBsYXllclNlcnZpY2UoKSk7CiAgICAgaWYgKHNlcnZpY2UgIT0gMCkgewpAQCAtMTkzLDcgKzIwMSw3IEBACiAgICAgICAgICAgICAobUN1cnJlbnRTdGF0ZSAhPSBNRURJQV9QTEFZRVJfU1RBVEVfRVJST1IpICYmCiAgICAgICAgICAgICAoKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVJfSURMRSkgIT0gTUVESUFfUExBWUVSX0lETEUpOwogICAgIGlmICgobVBsYXllciAhPSBOVUxMKSAmJiBoYXNCZWVuSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgQUxPR1YoImludm9rZSAlZCIsIHJlcXVlc3QuZGF0YVNpemUoKSk7CisgICAgICAgIEFMT0dWKCJpbnZva2UgJXp1IiwgcmVxdWVzdC5kYXRhU2l6ZSgpKTsKICAgICAgICAgcmV0dXJuICBtUGxheWVyLT5pbnZva2UocmVxdWVzdCwgcmVwbHkpOwogICAgIH0KICAgICBBTE9HRSgiaW52b2tlIGZhaWxlZDogd3Jvbmcgc3RhdGUgJVgiLCBtQ3VycmVudFN0YXRlKTsKQEAgLTIzNCw2ICsyNDIsOSBAQAogewogICAgIGlmICggKG1QbGF5ZXIgIT0gMCkgJiYgKCBtQ3VycmVudFN0YXRlICYgKCBNRURJQV9QTEFZRVJfSU5JVElBTElaRUQgfCBNRURJQV9QTEFZRVJfU1RPUFBFRCkgKSApIHsKICAgICAgICAgbVBsYXllci0+c2V0QXVkaW9TdHJlYW1UeXBlKG1TdHJlYW1UeXBlKTsKKyAgICAgICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgIT0gTlVMTCkgeworICAgICAgICAgICAgbVBsYXllci0+c2V0UGFyYW1ldGVyKEtFWV9QQVJBTUVURVJfQVVESU9fQVRUUklCVVRFUywgKm1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwpOworICAgICAgICB9CiAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVJfUFJFUEFSSU5HOwogICAgICAgICByZXR1cm4gbVBsYXllci0+cHJlcGFyZUFzeW5jKCk7CiAgICAgfQpAQCAtMjgwLDE2ICsyOTEsMjEgQEAKIHN0YXR1c190IE1lZGlhUGxheWVyOjpzdGFydCgpCiB7CiAgICAgQUxPR1YoInN0YXJ0Iik7CisKKyAgICBzdGF0dXNfdCByZXQgPSBOT19FUlJPUjsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSX1NUQVJURUQpCi0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICBpZiAoIChtUGxheWVyICE9IDApICYmICggbUN1cnJlbnRTdGF0ZSAmICggTUVESUFfUExBWUVSX1BSRVBBUkVEIHwKKworICAgIG1Mb2NrVGhyZWFkSWQgPSBnZXRUaHJlYWRJZCgpOworCisgICAgaWYgKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVJfU1RBUlRFRCkgeworICAgICAgICByZXQgPSBOT19FUlJPUjsKKyAgICB9IGVsc2UgaWYgKCAobVBsYXllciAhPSAwKSAmJiAoIG1DdXJyZW50U3RhdGUgJiAoIE1FRElBX1BMQVlFUl9QUkVQQVJFRCB8CiAgICAgICAgICAgICAgICAgICAgIE1FRElBX1BMQVlFUl9QTEFZQkFDS19DT01QTEVURSB8IE1FRElBX1BMQVlFUl9QQVVTRUQgKSApICkgewogICAgICAgICBtUGxheWVyLT5zZXRMb29waW5nKG1Mb29wKTsKICAgICAgICAgbVBsYXllci0+c2V0Vm9sdW1lKG1MZWZ0Vm9sdW1lLCBtUmlnaHRWb2x1bWUpOwogICAgICAgICBtUGxheWVyLT5zZXRBdXhFZmZlY3RTZW5kTGV2ZWwobVNlbmRMZXZlbCk7CiAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVJfU1RBUlRFRDsKLSAgICAgICAgc3RhdHVzX3QgcmV0ID0gbVBsYXllci0+c3RhcnQoKTsKKyAgICAgICAgcmV0ID0gbVBsYXllci0+c3RhcnQoKTsKICAgICAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUl9TVEFURV9FUlJPUjsKICAgICAgICAgfSBlbHNlIHsKQEAgLTI5NywxMCArMzEzLDE0IEBACiAgICAgICAgICAgICAgICAgQUxPR1YoInBsYXliYWNrIGNvbXBsZXRlZCBpbW1lZGlhdGVseSBmb2xsb3dpbmcgc3RhcnQoKSIpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoInN0YXJ0IGNhbGxlZCBpbiBzdGF0ZSAlZCIsIG1DdXJyZW50U3RhdGUpOworICAgICAgICByZXQgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0gICAgQUxPR0UoInN0YXJ0IGNhbGxlZCBpbiBzdGF0ZSAlZCIsIG1DdXJyZW50U3RhdGUpOwotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKworICAgIG1Mb2NrVGhyZWFkSWQgPSAwOworCisgICAgcmV0dXJuIHJldDsKIH0KIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OnN0b3AoKQpAQCAtNTMwLDYgKzU1MCwxNCBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OmdldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90ICp0eXBlKQoreworICAgIEFMT0dWKCJnZXRBdWRpb1N0cmVhbVR5cGUiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICp0eXBlID0gbVN0cmVhbVR5cGU7CisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBNZWRpYVBsYXllcjo6c2V0TG9vcGluZyhpbnQgbG9vcCkKIHsKICAgICBBTE9HVigiTWVkaWFQbGF5ZXI6OnNldExvb3BpbmciKTsKQEAgLTU3NSw4ICs2MDMsOCBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBpZiAoc2Vzc2lvbklkICE9IG1BdWRpb1Nlc3Npb25JZCkgewotICAgICAgICBBdWRpb1N5c3RlbTo6YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKHNlc3Npb25JZCk7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobUF1ZGlvU2Vzc2lvbklkKTsKKyAgICAgICAgQXVkaW9TeXN0ZW06OmFjcXVpcmVBdWRpb1Nlc3Npb25JZChzZXNzaW9uSWQsIC0xKTsKKyAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChtQXVkaW9TZXNzaW9uSWQsIC0xKTsKICAgICAgICAgbUF1ZGlvU2Vzc2lvbklkID0gc2Vzc2lvbklkOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC02MTMsMTUgKzY0MSw0NiBAQAogICAgIHJldHVybiBtUGxheWVyLT5hdHRhY2hBdXhFZmZlY3QoZWZmZWN0SWQpOwogfQogCisvLyBhbHdheXMgY2FsbCB3aXRoIGxvY2sgaGVsZAorc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OmNoZWNrU3RhdGVGb3JLZXlTZXRfbChpbnQga2V5KQoreworICAgIHN3aXRjaChrZXkpIHsKKyAgICBjYXNlIEtFWV9QQVJBTUVURVJfQVVESU9fQVRUUklCVVRFUzoKKyAgICAgICAgaWYgKG1DdXJyZW50U3RhdGUgJiAoIE1FRElBX1BMQVlFUl9QUkVQQVJFRCB8IE1FRElBX1BMQVlFUl9TVEFSVEVEIHwKKyAgICAgICAgICAgICAgICBNRURJQV9QTEFZRVJfUEFVU0VEIHwgTUVESUFfUExBWUVSX1BMQVlCQUNLX0NPTVBMRVRFKSApIHsKKyAgICAgICAgICAgIC8vIENhbid0IGNoYW5nZSB0aGUgYXVkaW8gYXR0cmlidXRlcyBhZnRlciBwcmVwYXJlCisgICAgICAgICAgICBBTE9HRSgidHJ5aW5nIHRvIHNldCBhdWRpbyBhdHRyaWJ1dGVzIGNhbGxlZCBpbiBzdGF0ZSAlZCIsIG1DdXJyZW50U3RhdGUpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIC8vIHBhcmFtZXRlciBkb2Vzbid0IHJlcXVpcmUgcGxheWVyIHN0YXRlIGNoZWNrCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IE1lZGlhUGxheWVyOjpzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsJiByZXF1ZXN0KQogewogICAgIEFMT0dWKCJNZWRpYVBsYXllcjo6c2V0UGFyYW1ldGVyKCVkKSIsIGtleSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAoY2hlY2tTdGF0ZUZvcktleVNldF9sKGtleSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KICAgICBpZiAobVBsYXllciAhPSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAgbVBsYXllci0+c2V0UGFyYW1ldGVyKGtleSwgcmVxdWVzdCk7CiAgICAgfQotICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXI6IG5vIGFjdGl2ZSBwbGF5ZXIiKTsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgc3dpdGNoIChrZXkpIHsKKyAgICBjYXNlIEtFWV9QQVJBTUVURVJfQVVESU9fQVRUUklCVVRFUzoKKyAgICAgICAgLy8gbm8gcGxheWVyLCBzYXZlIHRoZSBtYXJzaGFsbGVkIGF1ZGlvIGF0dHJpYnV0ZXMKKyAgICAgICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgIT0gTlVMTCkgeyBkZWxldGUgbUF1ZGlvQXR0cmlidXRlc1BhcmNlbDsgfTsKKyAgICAgICAgbUF1ZGlvQXR0cmlidXRlc1BhcmNlbCA9IG5ldyBQYXJjZWwoKTsKKyAgICAgICAgbUF1ZGlvQXR0cmlidXRlc1BhcmNlbC0+YXBwZW5kRnJvbSgmcmVxdWVzdCwgMCwgcmVxdWVzdC5kYXRhU2l6ZSgpKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXI6IG5vIGFjdGl2ZSBwbGF5ZXIiKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KIH0KIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OmdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KQpAQCAtNjU0LDcgKzcxMyw3IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgbWVtc2V0KCZtUmV0cmFuc21pdEVuZHBvaW50LCAwLCBzaXplb2YoJm1SZXRyYW5zbWl0RW5kcG9pbnQpKTsKKyAgICBtZW1zZXQoJm1SZXRyYW5zbWl0RW5kcG9pbnQsIDAsIHNpemVvZihtUmV0cmFuc21pdEVuZHBvaW50KSk7CiAgICAgbVJldHJhbnNtaXRFbmRwb2ludC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKICAgICBtUmV0cmFuc21pdEVuZHBvaW50LnNpbl9hZGRyICAgPSBzYWRkcjsKICAgICBtUmV0cmFuc21pdEVuZHBvaW50LnNpbl9wb3J0ICAgPSBodG9ucyhwb3J0KTsKQEAgLTY3Myw4ICs3MzIsOCBAQAogICAgIC8vIHJ1bm5pbmcgaW4gdGhlIHNhbWUgcHJvY2VzcyBhcyB0aGUgbWVkaWEgc2VydmVyLiBJbiB0aGF0IGNhc2UsCiAgICAgLy8gdGhpcyB3aWxsIGRlYWRsb2NrLgogICAgIC8vCi0gICAgLy8gVGhlIHRocmVhZElkIGhhY2sgYmVsb3cgd29ya3MgYXJvdW5kIHRoaXMgZm9yIHRoZSBjYXJlIG9mIHByZXBhcmUKLSAgICAvLyBhbmQgc2Vla1RvIHdpdGhpbiB0aGUgc2FtZSBwcm9jZXNzLgorICAgIC8vIFRoZSB0aHJlYWRJZCBoYWNrIGJlbG93IHdvcmtzIGFyb3VuZCB0aGlzIGZvciB0aGUgY2FyZSBvZiBwcmVwYXJlLAorICAgIC8vIHNlZWtUbyBhbmQgc3RhcnQgd2l0aGluIHRoZSBzYW1lIHByb2Nlc3MuCiAgICAgLy8gRklYTUU6IFJlbWVtYmVyLCB0aGlzIGlzIGEgaGFjaywgaXQncyBub3QgZXZlbiBhIGhhY2sgdGhhdCBpcyBhcHBsaWVkCiAgICAgLy8gY29uc2lzdGVudGx5IGZvciBhbGwgdXNlLWNhc2VzLCB0aGlzIG5lZWRzIHRvIGJlIHJldmlzaXRlZC4KICAgICBpZiAobUxvY2tUaHJlYWRJZCAhPSBnZXRUaHJlYWRJZCgpKSB7CkBAIC03NzYsMTUgKzgzNSwyMCBAQAogICAgIH0KIH0KIAotLypzdGF0aWMqLyBzdGF0dXNfdCBNZWRpYVBsYXllcjo6ZGVjb2RlKGNvbnN0IGNoYXIqIHVybCwgdWludDMyX3QgKnBTYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogcE51bUNoYW5uZWxzLCBhdWRpb19mb3JtYXRfdCogcEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsIHNpemVfdCAqcFNpemUpCisvKnN0YXRpYyovIHN0YXR1c190IE1lZGlhUGxheWVyOjpkZWNvZGUoCisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIqIHVybCwKKyAgICAgICAgdWludDMyX3QgKnBTYW1wbGVSYXRlLAorICAgICAgICBpbnQqIHBOdW1DaGFubmVscywKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCisgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwKKyAgICAgICAgc2l6ZV90ICpwU2l6ZSkKIHsKICAgICBBTE9HVigiZGVjb2RlKCVzKSIsIHVybCk7CiAgICAgc3RhdHVzX3Qgc3RhdHVzOwogICAgIGNvbnN0IHNwPElNZWRpYVBsYXllclNlcnZpY2U+IHNlcnZpY2UgPSBnZXRNZWRpYVBsYXllclNlcnZpY2UoKTsKICAgICBpZiAoc2VydmljZSAhPSAwKSB7Ci0gICAgICAgIHN0YXR1cyA9IHNlcnZpY2UtPmRlY29kZSh1cmwsIHBTYW1wbGVSYXRlLCBwTnVtQ2hhbm5lbHMsIHBGb3JtYXQsIGhlYXAsIHBTaXplKTsKKyAgICAgICAgc3RhdHVzID0gc2VydmljZS0+ZGVjb2RlKGh0dHBTZXJ2aWNlLCB1cmwsIHBTYW1wbGVSYXRlLCBwTnVtQ2hhbm5lbHMsIHBGb3JtYXQsIGhlYXAsIHBTaXplKTsKICAgICB9IGVsc2UgewogICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGxvY2F0ZSBtZWRpYSBzZXJ2aWNlIik7CiAgICAgICAgIHN0YXR1cyA9IERFQURfT0JKRUNUOwpAQCAtODA0LDcgKzg2OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwLCBzaXplX3QgKnBTaXplKQogewotICAgIEFMT0dWKCJkZWNvZGUoJWQsICVsbGQsICVsbGQpIiwgZmQsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICBBTE9HVigiZGVjb2RlKCVkLCAlIiBQUklkNjQgIiwgJSIgUFJJZDY0ICIpIiwgZmQsIG9mZnNldCwgbGVuZ3RoKTsKICAgICBzdGF0dXNfdCBzdGF0dXM7CiAgICAgY29uc3Qgc3A8SU1lZGlhUGxheWVyU2VydmljZT4gc2VydmljZSA9IGdldE1lZGlhUGxheWVyU2VydmljZSgpOwogICAgIGlmIChzZXJ2aWNlICE9IDApIHsKQEAgLTgzMiwxNSArODk2LDQgQEAKICAgICByZXR1cm4gbVBsYXllci0+c2V0TmV4dFBsYXllcihuZXh0ID09IE5VTEwgPyBOVUxMIDogbmV4dC0+bVBsYXllcik7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyOjp1cGRhdGVQcm94eUNvbmZpZygKLSAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgaW50MzJfdCBwb3J0LCBjb25zdCBjaGFyICpleGNsdXNpb25MaXN0KSB7Ci0gICAgY29uc3Qgc3A8SU1lZGlhUGxheWVyU2VydmljZT4gc2VydmljZSA9IGdldE1lZGlhUGxheWVyU2VydmljZSgpOwotCi0gICAgaWYgKHNlcnZpY2UgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gc2VydmljZS0+dXBkYXRlUHJveHlDb25maWcoaG9zdCwgcG9ydCwgZXhjbHVzaW9uTGlzdCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXJlY29yZGVyLmNwcAppbmRleCAwNGNmNjBiLi44ODhlZjY2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9tZWRpYXJlY29yZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXJlY29yZGVyLmNwcApAQCAtMTcsNiArMTcsOSBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIk1lZGlhUmVjb3JkZXIiCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFyZWNvcmRlci5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KQEAgLTE4Myw4ICsxODYsMTEgQEAKICAgICAgICAgQUxPR0UoInNldE91dHB1dEZvcm1hdCBjYWxsZWQgaW4gYW4gaW52YWxpZCBzdGF0ZTogJWQiLCBtQ3VycmVudFN0YXRlKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICBpZiAobUlzVmlkZW9Tb3VyY2VTZXQgJiYgb2YgPj0gT1VUUFVUX0ZPUk1BVF9BVURJT19PTkxZX1NUQVJUICYmIG9mICE9IE9VVFBVVF9GT1JNQVRfUlRQX0FWUCAmJiBvZiAhPSBPVVRQVVRfRk9STUFUX01QRUcyVFMpIHsgLy9maXJzdCBub24tdmlkZW8gb3V0cHV0IGZvcm1hdAotICAgICAgICBBTE9HRSgib3V0cHV0IGZvcm1hdCAoJWQpIGlzIG1lYW50IGZvciBhdWRpbyByZWNvcmRpbmcgb25seSBhbmQgaW5jb21wYXRpYmxlIHdpdGggdmlkZW8gcmVjb3JkaW5nIiwgb2YpOworICAgIGlmIChtSXNWaWRlb1NvdXJjZVNldAorICAgICAgICAgICAgJiYgb2YgPj0gT1VUUFVUX0ZPUk1BVF9BVURJT19PTkxZX1NUQVJUIC8vZmlyc3Qgbm9uLXZpZGVvIG91dHB1dCBmb3JtYXQKKyAgICAgICAgICAgICYmIG9mIDwgT1VUUFVUX0ZPUk1BVF9BVURJT19PTkxZX0VORCkgeworICAgICAgICBBTE9HRSgib3V0cHV0IGZvcm1hdCAoJWQpIGlzIG1lYW50IGZvciBhdWRpbyByZWNvcmRpbmcgb25seSIKKyAgICAgICAgICAgICAgIiBhbmQgaW5jb21wYXRpYmxlIHdpdGggdmlkZW8gcmVjb3JkaW5nIiwgb2YpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCkBAIC0yODYsNyArMjkyLDcgQEAKIAogc3RhdHVzX3QgTWVkaWFSZWNvcmRlcjo6c2V0T3V0cHV0RmlsZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkKIHsKLSAgICBBTE9HVigic2V0T3V0cHV0RmlsZSglZCwgJWxsZCwgJWxsZCkiLCBmZCwgb2Zmc2V0LCBsZW5ndGgpOworICAgIEFMT0dWKCJzZXRPdXRwdXRGaWxlKCVkLCAlIiBQUklkNjQgIiwgJSIgUFJJZDY0ICIpIiwgZmQsIG9mZnNldCwgbGVuZ3RoKTsKICAgICBpZiAobU1lZGlhUmVjb3JkZXIgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgibWVkaWEgcmVjb3JkZXIgaXMgbm90IGluaXRpYWxpemVkIHlldCIpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5tayBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLm1rCmluZGV4IDhmMjE2MzIuLjJjZjU3MTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLm1rCkBAIC0yMiwxMSArMjIsMTQgQEAKICAgICBTdGFnZWZyaWdodFBsYXllci5jcHAgICAgICAgXAogICAgIFN0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwICAgICBcCiAgICAgVGVzdFBsYXllclN0dWIuY3BwICAgICAgICAgIFwKKyAgICBWaWRlb0ZyYW1lU2NoZWR1bGVyLmNwcCAgICAgXAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9ICAgICAgIFwKICAgICBsaWJiaW5kZXIgICAgICAgICAgICAgICAgICAgXAogICAgIGxpYmNhbWVyYV9jbGllbnQgICAgICAgICAgICBcCisgICAgbGliY3J5cHRvICAgICAgICAgICAgICAgICAgIFwKICAgICBsaWJjdXRpbHMgICAgICAgICAgICAgICAgICAgXAorICAgIGxpYmRybWZyYW1ld29yayAgICAgICAgICAgICBcCiAgICAgbGlibG9nICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBsaWJkbCAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGxpYmd1aSAgICAgICAgICAgICAgICAgICAgICBcCkBAIC00NSwxNSArNDgsMTcgQEAKICAgICBsaWJzdGFnZWZyaWdodF9ydHNwICAgICAgICAgXAogCiBMT0NBTF9DX0lOQ0xVREVTIDo9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgZ3JhcGhpY3MgY29yZWNnKSAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgICAgICAgICAgICAgICBcCiAgICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcCAgICAgICAgICAgICAgICAgIFwKICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkgICAgICAgICAgXAorICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0gICAgICAgICAgICAgICAgICBcCiAgICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCAgICAgICAgICAgICAgICAgIFwKICAgICAkKFRPUCkvZXh0ZXJuYWwvdHJlbW9sby9UcmVtb2xvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCiBMT0NBTF9NT0RVTEU6PSBsaWJtZWRpYXBsYXllcnNlcnZpY2UKIAorTE9DQUxfMzJfQklUX09OTFkgOj0gdHJ1ZQorCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCiAKIGluY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9Ecm0uY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RybS5jcHAKaW5kZXggZDUwMDM3Zi4uZDIyMjMxNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RybS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RybS5jcHAKQEAgLTQxNyw2ICs0MTcsMjMgQEAKICAgICByZXR1cm4gbVBsdWdpbi0+cHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlKHJlc3BvbnNlLCBjZXJ0aWZpY2F0ZSwgd3JhcHBlZEtleSk7CiB9CiAKK3N0YXR1c190IERybTo6dW5wcm92aXNpb25EZXZpY2UoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIGlmIChtUGx1Z2luID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgaWYgKCFjaGVja1Blcm1pc3Npb24oImFuZHJvaWQucGVybWlzc2lvbi5SRU1PVkVfRFJNX0NFUlRJRklDQVRFUyIpKSB7CisgICAgICAgIHJldHVybiAtRVBFUk07CisgICAgfQorCisgICAgcmV0dXJuIG1QbHVnaW4tPnVucHJvdmlzaW9uRGV2aWNlKCk7Cit9CiAKIHN0YXR1c190IERybTo6Z2V0U2VjdXJlU3RvcHMoTGlzdDxWZWN0b3I8dWludDhfdD4gPiAmc2VjdXJlU3RvcHMpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RybS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RybS5oCmluZGV4IDNkNGIwZmMuLjllMjNlMmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9Ecm0uaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvRHJtLmgKQEAgLTc1LDYgKzc1LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJmNlcnRpZmljYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmd3JhcHBlZEtleSk7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IHVucHJvdmlzaW9uRGV2aWNlKCk7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyZVN0b3BzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+ID4gJnNlY3VyZVN0b3BzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZVNlY3VyZVN0b3BzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NSZWxlYXNlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9IRENQLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9IRENQLmNwcAppbmRleCBjMmFjMWEzLi5hZmUzOTM2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvSERDUC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0hEQ1AuY3BwCkBAIC0xMDcsMTEgKzEwNyw3IEBACiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KIAotICAgIC8vIFRPLURPOgotICAgIC8vIE9ubHkgc3VwcG9ydCBIRENQX0NBUFNfRU5DUllQVCAoYnl0ZS1hcnJheSB0byBieXRlLWFycmF5KSBmb3Igbm93LgotICAgIC8vIHVzZSBtSERDUE1vZHVsZS0+Z2V0Q2FwcygpIHdoZW4gdGhlIEhEQ1AgbGlicmFyaWVzIGdldCB1cGRhdGVkLgotICAgIC8vcmV0dXJuIG1IRENQTW9kdWxlLT5nZXRDYXBzKCk7Ci0gICAgcmV0dXJuIEhEQ1BNb2R1bGU6OkhEQ1BfQ0FQU19FTkNSWVBUOworICAgIHJldHVybiBtSERDUE1vZHVsZS0+Z2V0Q2FwcygpOwogfQogCiBzdGF0dXNfdCBIRENQOjplbmNyeXB0KApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyRmFjdG9yeS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJGYWN0b3J5LmNwcAppbmRleCA5MGFlZDM5Li4zZTBmYzBkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJGYWN0b3J5LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJGYWN0b3J5LmNwcApAQCAtNjAsMTQgKzYwLDIwIEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1wbGF5ZXJfdHlwZSBNZWRpYVBsYXllckZhY3Rvcnk6OmdldERlZmF1bHRQbGF5ZXJUeXBlKCkgeworc3RhdGljIHBsYXllcl90eXBlIGdldERlZmF1bHRQbGF5ZXJUeXBlKCkgewogICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICBpZiAocHJvcGVydHlfZ2V0KCJtZWRpYS5zdGFnZWZyaWdodC51c2UtbnVwbGF5ZXIiLCB2YWx1ZSwgTlVMTCkKKyAgICBpZiAocHJvcGVydHlfZ2V0KCJtZWRpYS5zdGFnZWZyaWdodC51c2UtYXdlc29tZSIsIHZhbHVlLCBOVUxMKQogICAgICAgICAgICAgJiYgKCFzdHJjbXAoIjEiLCB2YWx1ZSkgfHwgIXN0cmNhc2VjbXAoInRydWUiLCB2YWx1ZSkpKSB7Ci0gICAgICAgIHJldHVybiBOVV9QTEFZRVI7CisgICAgICAgIHJldHVybiBTVEFHRUZSSUdIVF9QTEFZRVI7CiAgICAgfQogCi0gICAgcmV0dXJuIFNUQUdFRlJJR0hUX1BMQVlFUjsKKyAgICAvLyBUT0RPOiByZW1vdmUgdGhpcyBFWFBFUklNRU5UQUwgZGV2ZWxvcGVyIHNldHRpbmdzIHByb3BlcnR5CisgICAgaWYgKHByb3BlcnR5X2dldCgicGVyc2lzdC5zeXMubWVkaWEudXNlLWF3ZXNvbWUiLCB2YWx1ZSwgTlVMTCkKKyAgICAgICAgICAgICYmICFzdHJjYXNlY21wKCJ0cnVlIiwgdmFsdWUpKSB7CisgICAgICAgIHJldHVybiBTVEFHRUZSSUdIVF9QTEFZRVI7CisgICAgfQorCisgICAgcmV0dXJuIE5VX1BMQVlFUjsKIH0KIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXJGYWN0b3J5OjpyZWdpc3RlckZhY3RvcnkoSUZhY3RvcnkqIGZhY3RvcnksCkBAIC0xNzAsMjEgKzE3NiwyNCBAQAogY2xhc3MgU3RhZ2VmcmlnaHRQbGF5ZXJGYWN0b3J5IDoKICAgICBwdWJsaWMgTWVkaWFQbGF5ZXJGYWN0b3J5OjpJRmFjdG9yeSB7CiAgIHB1YmxpYzoKLSAgICB2aXJ0dWFsIGZsb2F0IHNjb3JlRmFjdG9yeShjb25zdCBzcDxJTWVkaWFQbGF5ZXI+JiBjbGllbnQsCisgICAgdmlydHVhbCBmbG9hdCBzY29yZUZhY3RvcnkoY29uc3Qgc3A8SU1lZGlhUGxheWVyPiYgLypjbGllbnQqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY3VyU2NvcmUpIHsKLSAgICAgICAgY2hhciBidWZbMjBdOwotICAgICAgICBsc2VlayhmZCwgb2Zmc2V0LCBTRUVLX1NFVCk7Ci0gICAgICAgIHJlYWQoZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwotICAgICAgICBsc2VlayhmZCwgb2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAvKmxlbmd0aCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IC8qY3VyU2NvcmUqLykgeworICAgICAgICBpZiAoZ2V0RGVmYXVsdFBsYXllclR5cGUoKQorICAgICAgICAgICAgICAgID09IFNUQUdFRlJJR0hUX1BMQVlFUikgeworICAgICAgICAgICAgY2hhciBidWZbMjBdOworICAgICAgICAgICAgbHNlZWsoZmQsIG9mZnNldCwgU0VFS19TRVQpOworICAgICAgICAgICAgcmVhZChmZCwgYnVmLCBzaXplb2YoYnVmKSk7CisgICAgICAgICAgICBsc2VlayhmZCwgb2Zmc2V0LCBTRUVLX1NFVCk7CiAKLSAgICAgICAgbG9uZyBpZGVudCA9ICooKGxvbmcqKWJ1Zik7CisgICAgICAgICAgICB1aW50MzJfdCBpZGVudCA9ICooKHVpbnQzMl90KilidWYpOwogCi0gICAgICAgIC8vIE9nZyB2b3JiaXM/Ci0gICAgICAgIGlmIChpZGVudCA9PSAweDUzNjc2NzRmKSAvLyAnT2dnUycKLSAgICAgICAgICAgIHJldHVybiAxLjA7CisgICAgICAgICAgICAvLyBPZ2cgdm9yYmlzPworICAgICAgICAgICAgaWYgKGlkZW50ID09IDB4NTM2NzY3NGYpIC8vICdPZ2dTJworICAgICAgICAgICAgICAgIHJldHVybiAxLjA7CisgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gMC4wOwogICAgIH0KQEAgLTE5Nyw3ICsyMDYsNyBAQAogCiBjbGFzcyBOdVBsYXllckZhY3RvcnkgOiBwdWJsaWMgTWVkaWFQbGF5ZXJGYWN0b3J5OjpJRmFjdG9yeSB7CiAgIHB1YmxpYzoKLSAgICB2aXJ0dWFsIGZsb2F0IHNjb3JlRmFjdG9yeShjb25zdCBzcDxJTWVkaWFQbGF5ZXI+JiBjbGllbnQsCisgICAgdmlydHVhbCBmbG9hdCBzY29yZUZhY3RvcnkoY29uc3Qgc3A8SU1lZGlhUGxheWVyPiYgLypjbGllbnQqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY3VyU2NvcmUpIHsKICAgICAgICAgc3RhdGljIGNvbnN0IGZsb2F0IGtPdXJTY29yZSA9IDAuODsKQEAgLTIyOSw5ICsyMzgsOSBAQAogICAgICAgICByZXR1cm4gMC4wOwogICAgIH0KIAotICAgIHZpcnR1YWwgZmxvYXQgc2NvcmVGYWN0b3J5KGNvbnN0IHNwPElNZWRpYVBsYXllcj4mIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJU3RyZWFtU291cmNlPiAmc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGN1clNjb3JlKSB7CisgICAgdmlydHVhbCBmbG9hdCBzY29yZUZhY3RvcnkoY29uc3Qgc3A8SU1lZGlhUGxheWVyPiYgLypjbGllbnQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJU3RyZWFtU291cmNlPiYgLypzb3VyY2UqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAvKmN1clNjb3JlKi8pIHsKICAgICAgICAgcmV0dXJuIDEuMDsKICAgICB9CiAKQEAgLTI0Myw3ICsyNTIsNyBAQAogCiBjbGFzcyBTb25pdm94UGxheWVyRmFjdG9yeSA6IHB1YmxpYyBNZWRpYVBsYXllckZhY3Rvcnk6OklGYWN0b3J5IHsKICAgcHVibGljOgotICAgIHZpcnR1YWwgZmxvYXQgc2NvcmVGYWN0b3J5KGNvbnN0IHNwPElNZWRpYVBsYXllcj4mIGNsaWVudCwKKyAgICB2aXJ0dWFsIGZsb2F0IHNjb3JlRmFjdG9yeShjb25zdCBzcDxJTWVkaWFQbGF5ZXI+JiAvKmNsaWVudCovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBjdXJTY29yZSkgewogICAgICAgICBzdGF0aWMgY29uc3QgZmxvYXQga091clNjb3JlID0gMC40OwpAQCAtMjc0LDcgKzI4Myw3IEBACiAgICAgICAgIHJldHVybiAwLjA7CiAgICAgfQogCi0gICAgdmlydHVhbCBmbG9hdCBzY29yZUZhY3RvcnkoY29uc3Qgc3A8SU1lZGlhUGxheWVyPiYgY2xpZW50LAorICAgIHZpcnR1YWwgZmxvYXQgc2NvcmVGYWN0b3J5KGNvbnN0IHNwPElNZWRpYVBsYXllcj4mIC8qY2xpZW50Ki8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgbGVuZ3RoLApAQCAtMzEyLDkgKzMyMSw5IEBACiAKIGNsYXNzIFRlc3RQbGF5ZXJGYWN0b3J5IDogcHVibGljIE1lZGlhUGxheWVyRmFjdG9yeTo6SUZhY3RvcnkgewogICBwdWJsaWM6Ci0gICAgdmlydHVhbCBmbG9hdCBzY29yZUZhY3RvcnkoY29uc3Qgc3A8SU1lZGlhUGxheWVyPiYgY2xpZW50LAorICAgIHZpcnR1YWwgZmxvYXQgc2NvcmVGYWN0b3J5KGNvbnN0IHNwPElNZWRpYVBsYXllcj4mIC8qY2xpZW50Ki8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdXJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGN1clNjb3JlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgLypjdXJTY29yZSovKSB7CiAgICAgICAgIGlmIChUZXN0UGxheWVyU3R1Yjo6Y2FuQmVVc2VkKHVybCkpIHsKICAgICAgICAgICAgIHJldHVybiAxLjA7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllckZhY3RvcnkuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllckZhY3RvcnkuaAppbmRleCBmZTg5NzJiLi41NWZmOTE4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJGYWN0b3J5LmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyRmFjdG9yeS5oCkBAIC0yOSwxOSArMjksMTkgQEAKICAgICAgIHB1YmxpYzoKICAgICAgICAgdmlydHVhbCB+SUZhY3RvcnkoKSB7IH0KIAotICAgICAgICB2aXJ0dWFsIGZsb2F0IHNjb3JlRmFjdG9yeShjb25zdCBzcDxJTWVkaWFQbGF5ZXI+JiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVybCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY3VyU2NvcmUpIHsgcmV0dXJuIDAuMDsgfQorICAgICAgICB2aXJ0dWFsIGZsb2F0IHNjb3JlRmFjdG9yeShjb25zdCBzcDxJTWVkaWFQbGF5ZXI+JiAvKmNsaWVudCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAvKnVybCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAvKmN1clNjb3JlKi8pIHsgcmV0dXJuIDAuMDsgfQogCi0gICAgICAgIHZpcnR1YWwgZmxvYXQgc2NvcmVGYWN0b3J5KGNvbnN0IHNwPElNZWRpYVBsYXllcj4mIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGN1clNjb3JlKSB7IHJldHVybiAwLjA7IH0KKyAgICAgICAgdmlydHVhbCBmbG9hdCBzY29yZUZhY3RvcnkoY29uc3Qgc3A8SU1lZGlhUGxheWVyPiYgLypjbGllbnQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qZmQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAvKm9mZnNldCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IC8qbGVuZ3RoKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IC8qY3VyU2NvcmUqLykgeyByZXR1cm4gMC4wOyB9CiAKLSAgICAgICAgdmlydHVhbCBmbG9hdCBzY29yZUZhY3RvcnkoY29uc3Qgc3A8SU1lZGlhUGxheWVyPiYgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJU3RyZWFtU291cmNlPiAmc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBjdXJTY29yZSkgeyByZXR1cm4gMC4wOyB9CisgICAgICAgIHZpcnR1YWwgZmxvYXQgc2NvcmVGYWN0b3J5KGNvbnN0IHNwPElNZWRpYVBsYXllcj4mIC8qY2xpZW50Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElTdHJlYW1Tb3VyY2U+ICYvKnNvdXJjZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAvKmN1clNjb3JlKi8pIHsgcmV0dXJuIDAuMDsgfQogCiAgICAgICAgIHZpcnR1YWwgc3A8TWVkaWFQbGF5ZXJCYXNlPiBjcmVhdGVQbGF5ZXIoKSA9IDA7CiAgICAgfTsKQEAgLTcxLDcgKzcxLDYgQEAKIAogICAgIHN0YXRpYyBzdGF0dXNfdCByZWdpc3RlckZhY3RvcnlfbChJRmFjdG9yeSogZmFjdG9yeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyX3R5cGUgdHlwZSk7Ci0gICAgc3RhdGljIHBsYXllcl90eXBlIGdldERlZmF1bHRQbGF5ZXJUeXBlKCk7CiAKICAgICBzdGF0aWMgTXV0ZXggICAgICAgc0xvY2s7CiAgICAgc3RhdGljIHRGYWN0b3J5TWFwIHNGYWN0b3J5TWFwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAppbmRleCBjM2RiYzFiLi4yYjQ0OTUwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcApAQCAtMzQsNiArMzQsNyBAQAogCiAjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgogCisjaW5jbHVkZSA8YmluZGVyL0lCYXR0ZXJ5U3RhdHMuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeUhlYXBCYXNlLmg+CkBAIC00Miw4ICs0MywxMCBAQAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPiAgLy8gZm9yIHN0YXR1c190CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHV0aWxzL1N5c3RlbUNsb2NrLmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lSZW1vdGVEaXNwbGF5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSVJlbW90ZURpc3BsYXlDbGllbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oPgpAQCAtNTIsNiArNTUsNyBAQAogI2luY2x1ZGUgPG1lZGlhL01ldGFkYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgogI2luY2x1ZGUgPG1lZGlhL01lbW9yeUxlYWtUcmFja1V0aWwuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpAQCAtMTg1LDYgKzE4OSw2NCBAQAogfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQogCiAKK25hbWVzcGFjZSB7Cit1c2luZyBhbmRyb2lkOjpQYXJjZWw7Cit1c2luZyBhbmRyb2lkOjpTdHJpbmcxNjsKKworLy8gbWFyc2hhbGxpbmcgdGFnIGluZGljYXRpbmcgZmxhdHRlbmVkIHV0ZjE2IHRhZ3MKKy8vIGtlZXAgaW4gc3luYyB3aXRoIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzLmphdmEKK2NvbnN0IGludDMyX3Qga0F1ZGlvQXR0cmlidXRlc01hcnNoYWxsVGFnRmxhdHRlblRhZ3MgPSAxOworCisvLyBBdWRpbyBhdHRyaWJ1dGVzIGZvcm1hdCBpbiBhIHBhcmNlbDoKKy8vCisvLyAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisvLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworLy8gfCAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisvLyB8ICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50X3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKy8vIHwgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisvLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworLy8gfCAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisvLyB8ICAgICAgICAgICAgICAgICAgICAgICBrQXVkaW9BdHRyaWJ1dGVzTWFyc2hhbGxUYWdGbGF0dGVuVGFncyAgfCAvLyBpZ25vcmUgdGFncyBpZiBub3QgZm91bmQKKy8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisvLyB8ICAgICAgICAgICAgICAgICAgICAgICBmbGF0dGVuZWQgdGFncyBpbiBVVEYxNiAgICAgICAgICAgICAgICAgfAorLy8gfCAgICAgICAgICAgICAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisvLworLy8gQHBhcmFtIHAgUGFyY2VsIHRoYXQgY29udGFpbnMgYXVkaW8gYXR0cmlidXRlcy4KKy8vIEBwYXJhbVtvdXRdIGF0dHJpYnV0ZXMgT24gZXhpdCBwb2ludHMgdG8gYW4gaW5pdGlhbGl6ZWQgYXVkaW9fYXR0cmlidXRlc190IHN0cnVjdHVyZQorLy8gQHBhcmFtW291dF0gc3RhdHVzIE9uIGV4aXQgY29udGFpbnMgdGhlIHN0YXR1cyBjb2RlIHRvIGJlIHJldHVybmVkLgordm9pZCB1bm1hcnNoYWxsQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IFBhcmNlbCYgcGFyY2VsLCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMpCit7CisgICAgYXR0cmlidXRlcy0+dXNhZ2UgPSAoYXVkaW9fdXNhZ2VfdCkgcGFyY2VsLnJlYWRJbnQzMigpOworICAgIGF0dHJpYnV0ZXMtPmNvbnRlbnRfdHlwZSA9IChhdWRpb19jb250ZW50X3R5cGVfdCkgcGFyY2VsLnJlYWRJbnQzMigpOworICAgIGF0dHJpYnV0ZXMtPnNvdXJjZSA9IChhdWRpb19zb3VyY2VfdCkgcGFyY2VsLnJlYWRJbnQzMigpOworICAgIGF0dHJpYnV0ZXMtPmZsYWdzID0gKGF1ZGlvX2ZsYWdzX21hc2tfdCkgcGFyY2VsLnJlYWRJbnQzMigpOworICAgIGNvbnN0IGJvb2wgaGFzRmxhdHRlbmVkVGFnID0gKHBhcmNlbC5yZWFkSW50MzIoKSA9PSBrQXVkaW9BdHRyaWJ1dGVzTWFyc2hhbGxUYWdGbGF0dGVuVGFncyk7CisgICAgaWYgKGhhc0ZsYXR0ZW5lZFRhZykgeworICAgICAgICAvLyB0aGUgdGFncyBhcmUgVVRGMTYsIGNvbnZlcnQgdG8gVVRGOAorICAgICAgICBTdHJpbmcxNiB0YWdzID0gcGFyY2VsLnJlYWRTdHJpbmcxNigpOworICAgICAgICBzc2l6ZV90IHJlYWxUYWdTaXplID0gdXRmMTZfdG9fdXRmOF9sZW5ndGgodGFncy5zdHJpbmcoKSwgdGFncy5zaXplKCkpOworICAgICAgICBpZiAocmVhbFRhZ1NpemUgPD0gMCkgeworICAgICAgICAgICAgc3RyY3B5KGF0dHJpYnV0ZXMtPnRhZ3MsICIiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGNvcHkgdGhlIGZsYXR0ZW5lZCBzdHJpbmcgaW50byB0aGUgYXR0cmlidXRlcyBhcyB0aGUgZGVzdGluYXRpb24gZm9yIHRoZSBjb252ZXJzaW9uOgorICAgICAgICAgICAgLy8gY29weWluZyBhcnJheSBzaXplIC0xLCBhcnJheSBmb3IgdGFncyB3YXMgY2FsbG9jJ2QsIG5vIG5lZWQgdG8gTlVMTC10ZXJtaW5hdGUgaXQKKyAgICAgICAgICAgIHNpemVfdCB0YWdTaXplID0gcmVhbFRhZ1NpemUgPiBBVURJT19BVFRSSUJVVEVTX1RBR1NfTUFYX1NJWkUgLSAxID8KKyAgICAgICAgICAgICAgICAgICAgQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFIC0gMSA6IHJlYWxUYWdTaXplOworICAgICAgICAgICAgdXRmMTZfdG9fdXRmOCh0YWdzLnN0cmluZygpLCB0YWdTaXplLCBhdHRyaWJ1dGVzLT50YWdzLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXR0cmlidXRlcy0+dGFncykgLyBzaXplb2YoYXR0cmlidXRlcy0+dGFnc1swXSkpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoInVubWFyc2hhbGxBdWRpb0F0dHJpYnV0ZXMoKSByZWNlaXZlZCB1bmZsYXR0ZW5lZCB0YWdzLCBpZ25vcmluZyB0YWcgdmFsdWVzIik7CisgICAgICAgIHN0cmNweShhdHRyaWJ1dGVzLT50YWdzLCAiIik7CisgICAgfQorfQorfSAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdGF0aWMgYm9vbCBjaGVja1Blcm1pc3Npb24oY29uc3QgY2hhciogcGVybWlzc2lvblN0cmluZykgewpAQCAtMjIwLDYgKzI4MiwyMCBAQAogICAgIC8vIHNwZWFrZXIgaXMgb24gYnkgZGVmYXVsdAogICAgIG1CYXR0ZXJ5QXVkaW8uZGV2aWNlT25bU1BFQUtFUl0gPSAxOwogCisgICAgLy8gcmVzZXQgYmF0dGVyeSBzdGF0cworICAgIC8vIGlmIHRoZSBtZWRpYXNlcnZlciBoYXMgY3Jhc2hlZCwgYmF0dGVyeSBzdGF0cyBjb3VsZCBiZSBsZWZ0CisgICAgLy8gaW4gYmFkIHN0YXRlLCByZXNldCB0aGUgc3RhdGUgdXBvbiBzZXJ2aWNlIHN0YXJ0LgorICAgIGNvbnN0IHNwPElTZXJ2aWNlTWFuYWdlcj4gc20oZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCkpOworICAgIGlmIChzbSAhPSBOVUxMKSB7CisgICAgICAgIGNvbnN0IFN0cmluZzE2IG5hbWUoImJhdHRlcnlzdGF0cyIpOworICAgICAgICBzcDxJQmF0dGVyeVN0YXRzPiBiYXR0ZXJ5U3RhdHMgPQorICAgICAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElCYXR0ZXJ5U3RhdHM+KHNtLT5nZXRTZXJ2aWNlKG5hbWUpKTsKKyAgICAgICAgaWYgKGJhdHRlcnlTdGF0cyAhPSBOVUxMKSB7CisgICAgICAgICAgICBiYXR0ZXJ5U3RhdHMtPm5vdGVSZXNldFZpZGVvKCk7CisgICAgICAgICAgICBiYXR0ZXJ5U3RhdHMtPm5vdGVSZXNldEF1ZGlvKCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBNZWRpYVBsYXllckZhY3Rvcnk6OnJlZ2lzdGVyQnVpbHRpbkZhY3RvcmllcygpOwogfQogCkBAIC0yNzUsNiArMzUxLDEwIEBACiAgICAgcmV0dXJuIGM7CiB9CiAKK3NwPElNZWRpYUNvZGVjTGlzdD4gTWVkaWFQbGF5ZXJTZXJ2aWNlOjpnZXRDb2RlY0xpc3QoKSBjb25zdCB7CisgICAgcmV0dXJuIE1lZGlhQ29kZWNMaXN0OjpnZXRMb2NhbEluc3RhbmNlKCk7Cit9CisKIHNwPElPTVg+IE1lZGlhUGxheWVyU2VydmljZTo6Z2V0T01YKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKQEAgLTMwNiwxMiArMzg2LDcgQEAKICAgICByZXR1cm4gbmV3IFJlbW90ZURpc3BsYXkoY2xpZW50LCBpZmFjZS5zdHJpbmcoKSk7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6dXBkYXRlUHJveHlDb25maWcoCi0gICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGludDMyX3QgcG9ydCwgY29uc3QgY2hhciAqZXhjbHVzaW9uTGlzdCkgewotICAgIHJldHVybiBIVFRQQmFzZTo6VXBkYXRlUHJveHlDb25maWcoaG9zdCwgcG9ydCwgZXhjbHVzaW9uTGlzdCk7Ci19Ci0KLXN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9DYWNoZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0CitzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvQ2FjaGU6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiAvKmFyZ3MqLykgY29uc3QKIHsKICAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKQEAgLTMxOSw3ICszOTQsNyBAQAogCiAgICAgcmVzdWx0LmFwcGVuZCgiIEF1ZGlvQ2FjaGVcbiIpOwogICAgIGlmIChtSGVhcCAhPSAwKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgMjU1LCAiICBoZWFwIGJhc2UoJXApLCBzaXplKCVkKSwgZmxhZ3MoJWQpXG4iLAorICAgICAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgaGVhcCBiYXNlKCVwKSwgc2l6ZSglenUpLCBmbGFncyglZClcbiIsCiAgICAgICAgICAgICAgICAgbUhlYXAtPmdldEJhc2UoKSwgbUhlYXAtPmdldFNpemUoKSwgbUhlYXAtPmdldEZsYWdzKCkpOwogICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgfQpAQCAtNTE4LDYgKzU5Myw3IEBACiAgICAgbUF1ZGlvU2Vzc2lvbklkID0gYXVkaW9TZXNzaW9uSWQ7CiAgICAgbVVJRCA9IHVpZDsKICAgICBtUmV0cmFuc21pdEVuZHBvaW50VmFsaWQgPSBmYWxzZTsKKyAgICBtQXVkaW9BdHRyaWJ1dGVzID0gTlVMTDsKIAogI2lmIENBTExCQUNLX0FOVEFHT05JWkVSCiAgICAgQUxPR0QoImNyZWF0ZSBBbnRhZ29uaXplciIpOwpAQCAtNTMyLDYgKzYwOCw5IEBACiAgICAgd3A8Q2xpZW50PiBjbGllbnQodGhpcyk7CiAgICAgZGlzY29ubmVjdCgpOwogICAgIG1TZXJ2aWNlLT5yZW1vdmVDbGllbnQoY2xpZW50KTsKKyAgICBpZiAobUF1ZGlvQXR0cmlidXRlcyAhPSBOVUxMKSB7CisgICAgICAgIGZyZWUobUF1ZGlvQXR0cmlidXRlcyk7CisgICAgfQogfQogCiB2b2lkIE1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50OjpkaXNjb25uZWN0KCkKQEAgLTU5Niw3ICs2NzUsOCBAQAogICAgIH0KIAogICAgIGlmICghcC0+aGFyZHdhcmVPdXRwdXQoKSkgewotICAgICAgICBtQXVkaW9PdXRwdXQgPSBuZXcgQXVkaW9PdXRwdXQobUF1ZGlvU2Vzc2lvbklkLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpOworICAgICAgICBtQXVkaW9PdXRwdXQgPSBuZXcgQXVkaW9PdXRwdXQobUF1ZGlvU2Vzc2lvbklkLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCksCisgICAgICAgICAgICAgICAgbVBpZCwgbUF1ZGlvQXR0cmlidXRlcyk7CiAgICAgICAgIHN0YXRpY19jYXN0PE1lZGlhUGxheWVySW50ZXJmYWNlKj4ocC5nZXQoKSktPnNldEF1ZGlvU2luayhtQXVkaW9PdXRwdXQpOwogICAgIH0KIApAQCAtNjI4LDcgKzcwOCw5IEBACiB9CiAKIHN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50OjpzZXREYXRhU291cmNlKAotICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKQorICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKQogewogICAgIEFMT0dWKCJzZXREYXRhU291cmNlKCVzKSIsIHVybCk7CiAgICAgaWYgKHVybCA9PSBOVUxMKQpAQCAtNjYzLDcgKzc0NSw3IEBACiAgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICAgICAgfQogCi0gICAgICAgIHNldERhdGFTb3VyY2VfcG9zdChwLCBwLT5zZXREYXRhU291cmNlKHVybCwgaGVhZGVycykpOworICAgICAgICBzZXREYXRhU291cmNlX3Bvc3QocCwgcC0+c2V0RGF0YVNvdXJjZShodHRwU2VydmljZSwgdXJsLCBoZWFkZXJzKSk7CiAgICAgICAgIHJldHVybiBtU3RhdHVzOwogICAgIH0KIH0KQEAgLTY4MCw4ICs3NjIsOCBAQAogCiAgICAgQUxPR1YoInN0X2RldiAgPSAlbGx1Iiwgc2Iuc3RfZGV2KTsKICAgICBBTE9HVigic3RfbW9kZSA9ICV1Iiwgc2Iuc3RfbW9kZSk7Ci0gICAgQUxPR1YoInN0X3VpZCAgPSAlbHUiLCBzYi5zdF91aWQpOwotICAgIEFMT0dWKCJzdF9naWQgID0gJWx1Iiwgc2Iuc3RfZ2lkKTsKKyAgICBBTE9HVigic3RfdWlkICA9ICVsdSIsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KHNiLnN0X3VpZCkpOworICAgIEFMT0dWKCJzdF9naWQgID0gJWx1Iiwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oc2Iuc3RfZ2lkKSk7CiAgICAgQUxPR1YoInN0X3NpemUgPSAlbGx1Iiwgc2Iuc3Rfc2l6ZSk7CiAKICAgICBpZiAob2Zmc2V0ID49IHNiLnN0X3NpemUpIHsKQEAgLTgxMCw3ICs4OTIsNyBAQAogfQogCiBzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6Z2V0TWV0YWRhdGEoCi0gICAgICAgIGJvb2wgdXBkYXRlX29ubHksIGJvb2wgYXBwbHlfZmlsdGVyLCBQYXJjZWwgKnJlcGx5KQorICAgICAgICBib29sIHVwZGF0ZV9vbmx5LCBib29sIC8qYXBwbHlfZmlsdGVyKi8sIFBhcmNlbCAqcmVwbHkpCiB7CiAgICAgc3A8TWVkaWFQbGF5ZXJCYXNlPiBwbGF5ZXIgPSBnZXRQbGF5ZXIoKTsKICAgICBpZiAocGxheWVyID09IDApIHJldHVybiBVTktOT1dOX0VSUk9SOwpAQCAtOTc5LDYgKzEwNjEsMjIgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3N0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50OjpzZXRBdWRpb0F0dHJpYnV0ZXNfbChjb25zdCBQYXJjZWwgJnBhcmNlbCkKK3sKKyAgICBpZiAobUF1ZGlvQXR0cmlidXRlcyAhPSBOVUxMKSB7IGZyZWUobUF1ZGlvQXR0cmlidXRlcyk7IH0KKyAgICBtQXVkaW9BdHRyaWJ1dGVzID0gKGF1ZGlvX2F0dHJpYnV0ZXNfdCAqKSBjYWxsb2MoMSwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgIHVubWFyc2hhbGxBdWRpb0F0dHJpYnV0ZXMocGFyY2VsLCBtQXVkaW9BdHRyaWJ1dGVzKTsKKworICAgIEFMT0dWKCJzZXRBdWRpb0F0dHJpYnV0ZXNfbCgpIHVzYWdlPSVkIGNvbnRlbnQ9JWQgZmxhZ3M9MHgleCB0YWdzPSVzIiwKKyAgICAgICAgICAgIG1BdWRpb0F0dHJpYnV0ZXMtPnVzYWdlLCBtQXVkaW9BdHRyaWJ1dGVzLT5jb250ZW50X3R5cGUsIG1BdWRpb0F0dHJpYnV0ZXMtPmZsYWdzLAorICAgICAgICAgICAgbUF1ZGlvQXR0cmlidXRlcy0+dGFncyk7CisKKyAgICBpZiAobUF1ZGlvT3V0cHV0ICE9IDApIHsKKyAgICAgICAgbUF1ZGlvT3V0cHV0LT5zZXRBdWRpb0F0dHJpYnV0ZXMobUF1ZGlvQXR0cmlidXRlcyk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKwogc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OnNldExvb3BpbmcoaW50IGxvb3ApCiB7CiAgICAgQUxPR1YoIlslZF0gc2V0TG9vcGluZyglZCkiLCBtQ29ubklkLCBsb29wKTsKQEAgLTEwMjcsOSArMTEyNSwxNyBAQAogCiBzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6c2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCAmcmVxdWVzdCkgewogICAgIEFMT0dWKCJbJWRdIHNldFBhcmFtZXRlciglZCkiLCBtQ29ubklkLCBrZXkpOwotICAgIHNwPE1lZGlhUGxheWVyQmFzZT4gcCA9IGdldFBsYXllcigpOwotICAgIGlmIChwID09IDApIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIHJldHVybiBwLT5zZXRQYXJhbWV0ZXIoa2V5LCByZXF1ZXN0KTsKKyAgICBzd2l0Y2ggKGtleSkgeworICAgIGNhc2UgS0VZX1BBUkFNRVRFUl9BVURJT19BVFRSSUJVVEVTOgorICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgICAgICByZXR1cm4gc2V0QXVkaW9BdHRyaWJ1dGVzX2wocmVxdWVzdCk7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAgIHNwPE1lZGlhUGxheWVyQmFzZT4gcCA9IGdldFBsYXllcigpOworICAgICAgICBpZiAocCA9PSAwKSB7IHJldHVybiBVTktOT1dOX0VSUk9SOyB9CisgICAgICAgIHJldHVybiBwLT5zZXRQYXJhbWV0ZXIoa2V5LCByZXF1ZXN0KTsKKyAgICB9CiB9CiAKIHN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50OjpnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSkgewpAQCAtMTE4Niw5ICsxMjkyLDE0IEBACiB9CiAjZW5kaWYKIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpkZWNvZGUoY29uc3QgY2hhciogdXJsLCB1aW50MzJfdCAqcFNhbXBsZVJhdGUsIGludCogcE51bUNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsIHNpemVfdCAqcFNpemUpCitzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OmRlY29kZSgKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgY29uc3QgY2hhciogdXJsLAorICAgICAgICB1aW50MzJfdCAqcFNhbXBsZVJhdGUsCisgICAgICAgIGludCogcE51bUNoYW5uZWxzLAorICAgICAgICBhdWRpb19mb3JtYXRfdCogcEZvcm1hdCwKKyAgICAgICAgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwLAorICAgICAgICBzaXplX3QgKnBTaXplKQogewogICAgIEFMT0dWKCJkZWNvZGUoJXMpIiwgdXJsKTsKICAgICBzcDxNZWRpYVBsYXllckJhc2U+IHBsYXllcjsKQEAgLTEyMTYsNyArMTMyNyw3IEBACiAgICAgc3RhdGljX2Nhc3Q8TWVkaWFQbGF5ZXJJbnRlcmZhY2UqPihwbGF5ZXIuZ2V0KCkpLT5zZXRBdWRpb1NpbmsoY2FjaGUpOwogCiAgICAgLy8gc2V0IGRhdGEgc291cmNlCi0gICAgaWYgKHBsYXllci0+c2V0RGF0YVNvdXJjZSh1cmwpICE9IE5PX0VSUk9SKSBnb3RvIEV4aXQ7CisgICAgaWYgKHBsYXllci0+c2V0RGF0YVNvdXJjZShodHRwU2VydmljZSwgdXJsKSAhPSBOT19FUlJPUikgZ290byBFeGl0OwogCiAgICAgQUxPR1YoInByZXBhcmUiKTsKICAgICBwbGF5ZXItPnByZXBhcmVBc3luYygpOwpAQCAtMTMwNiwxMyArMTQxNywxNSBAQAogCiAjdW5kZWYgTE9HX1RBRwogI2RlZmluZSBMT0dfVEFHICJBdWRpb1NpbmsiCi1NZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpBdWRpb091dHB1dChpbnQgc2Vzc2lvbklkLCBpbnQgdWlkKQorTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6QXVkaW9PdXRwdXQoaW50IHNlc3Npb25JZCwgaW50IHVpZCwgaW50IHBpZCwKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBhdHRyKQogICAgIDogbUNhbGxiYWNrKE5VTEwpLAogICAgICAgbUNhbGxiYWNrQ29va2llKE5VTEwpLAogICAgICAgbUNhbGxiYWNrRGF0YShOVUxMKSwKICAgICAgIG1CeXRlc1dyaXR0ZW4oMCksCiAgICAgICBtU2Vzc2lvbklkKHNlc3Npb25JZCksCiAgICAgICBtVWlkKHVpZCksCisgICAgICBtUGlkKHBpZCksCiAgICAgICBtRmxhZ3MoQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSkgewogICAgIEFMT0dWKCJBdWRpb091dHB1dCglZCkiLCBzZXNzaW9uSWQpOwogICAgIG1TdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX01VU0lDOwpAQCAtMTMyNCw2ICsxNDM3LDcgQEAKICAgICBtQXV4RWZmZWN0SWQgPSAwOwogICAgIG1TZW5kTGV2ZWwgPSAwLjA7CiAgICAgc2V0TWluQnVmZmVyQ291bnQoKTsKKyAgICBtQXR0cmlidXRlcyA9IGF0dHI7CiB9CiAKIE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6On5BdWRpb091dHB1dCgpCkBAIC0xMzk0LDYgKzE1MDgsMTIgQEAKICAgICByZXR1cm4gbVRyYWNrLT5nZXRQb3NpdGlvbihwb3NpdGlvbik7CiB9CiAKK3N0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OmdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCAmdHMpIGNvbnN0Cit7CisgICAgaWYgKG1UcmFjayA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gbVRyYWNrLT5nZXRUaW1lc3RhbXAodHMpOworfQorCiBzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpnZXRGcmFtZXNXcml0dGVuKHVpbnQzMl90ICpmcmFtZXN3cml0dGVuKSBjb25zdAogewogICAgIGlmIChtVHJhY2sgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CkBAIC0xNDEzLDYgKzE1MzMsMTAgQEAKICAgICByZXR1cm4gbVRyYWNrLT5nZXRQYXJhbWV0ZXJzKGtleXMpOwogfQogCit2b2lkIE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OnNldEF1ZGlvQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKiBhdHRyaWJ1dGVzKSB7CisgICAgbUF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzOworfQorCiB2b2lkIE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OmRlbGV0ZVJlY3ljbGVkVHJhY2soKQogewogICAgIEFMT0dWKCJkZWxldGVSZWN5Y2xlZFRyYWNrIik7CkBAIC0xNDYwLDcgKzE1ODQsNyBAQAogICAgICAgICAgICAgICAgIGZvcm1hdCwgYnVmZmVyQ291bnQsIG1TZXNzaW9uSWQsIGZsYWdzKTsKICAgICB1aW50MzJfdCBhZlNhbXBsZVJhdGU7CiAgICAgc2l6ZV90IGFmRnJhbWVDb3VudDsKLSAgICB1aW50MzJfdCBmcmFtZUNvdW50OworICAgIHNpemVfdCBmcmFtZUNvdW50OwogCiAgICAgLy8gb2ZmbG9hZGluZyBpcyBvbmx5IHN1cHBvcnRlZCBpbiBjYWxsYmFjayBtb2RlIGZvciBub3cuCiAgICAgLy8gb2ZmbG9hZEluZm8gbXVzdCBiZSBwcmVzZW50IGlmIG9mZmxvYWQgZmxhZyBpcyBzZXQKQEAgLTE1NjEsNyArMTY4NSw5IEBACiAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVHJhY2s6OlRSQU5TRkVSX0NBTExCQUNLLAogICAgICAgICAgICAgICAgICAgICBvZmZsb2FkSW5mbywKLSAgICAgICAgICAgICAgICAgICAgbVVpZCk7CisgICAgICAgICAgICAgICAgICAgIG1VaWQsCisgICAgICAgICAgICAgICAgICAgIG1QaWQsCisgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVzKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHQgPSBuZXcgQXVkaW9UcmFjaygKICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbVR5cGUsCkBAIC0xNTc2LDEzICsxNzAyLDE5IEBACiAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVHJhY2s6OlRSQU5TRkVSX0RFRkFVTFQsCiAgICAgICAgICAgICAgICAgICAgIE5VTEwsIC8vIG9mZmxvYWQgaW5mbwotICAgICAgICAgICAgICAgICAgICBtVWlkKTsKKyAgICAgICAgICAgICAgICAgICAgbVVpZCwKKyAgICAgICAgICAgICAgICAgICAgbVBpZCwKKyAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnV0ZXMpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKCh0ID09IDApIHx8ICh0LT5pbml0Q2hlY2soKSAhPSBOT19FUlJPUikpIHsKICAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gY3JlYXRlIGF1ZGlvIHRyYWNrIik7CiAgICAgICAgICAgICBkZWxldGUgbmV3Y2JkOwogICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBzdWNjZXNzZnVsIEF1ZGlvVHJhY2sgaW5pdGlhbGl6YXRpb24gaW1wbGllcyBhIGxlZ2FjeSBzdHJlYW0gdHlwZSB3YXMgZ2VuZXJhdGVkCisgICAgICAgICAgICAvLyBmcm9tIHRoZSBhdWRpbyBhdHRyaWJ1dGVzCisgICAgICAgICAgICBtU3RyZWFtVHlwZSA9IHQtPnN0cmVhbVR5cGUoKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTY4MiwxMiArMTgxNCwxNCBAQAogCiBzc2l6ZV90IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OndyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpCiB7Ci0gICAgTE9HX0ZBVEFMX0lGKG1DYWxsYmFjayAhPSBOVUxMLCAiRG9uJ3QgY2FsbCB3cml0ZSBpZiBzdXBwbHlpbmcgYSBjYWxsYmFjay4iKTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1DYWxsYmFjayAhPSBOVUxMLCAiRG9uJ3QgY2FsbCB3cml0ZSBpZiBzdXBwbHlpbmcgYSBjYWxsYmFjay4iKTsKIAogICAgIC8vQUxPR1YoIndyaXRlKCVwLCAldSkiLCBidWZmZXIsIHNpemUpOwogICAgIGlmIChtVHJhY2sgIT0gMCkgewogICAgICAgICBzc2l6ZV90IHJldCA9IG1UcmFjay0+d3JpdGUoYnVmZmVyLCBzaXplKTsKLSAgICAgICAgbUJ5dGVzV3JpdHRlbiArPSByZXQ7CisgICAgICAgIGlmIChyZXQgPj0gMCkgeworICAgICAgICAgICAgbUJ5dGVzV3JpdHRlbiArPSByZXQ7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAgICAgcmV0dXJuIE5PX0lOSVQ7CkBAIC0xNzg3LDcgKzE5MjEsOCBAQAogICAgICAgICAgICAgICAgIG1lLCBidWZmZXItPnJhdywgYnVmZmVyLT5zaXplLCBtZS0+bUNhbGxiYWNrQ29va2llLAogICAgICAgICAgICAgICAgIENCX0VWRU5UX0ZJTExfQlVGRkVSKTsKIAotICAgICAgICBpZiAoYWN0dWFsU2l6ZSA9PSAwICYmIGJ1ZmZlci0+c2l6ZSA+IDAgJiYgbWUtPm1OZXh0T3V0cHV0ID09IE5VTEwpIHsKKyAgICAgICAgaWYgKChtZS0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgPT0gMCAmJgorICAgICAgICAgICAgYWN0dWFsU2l6ZSA9PSAwICYmIGJ1ZmZlci0+c2l6ZSA+IDAgJiYgbWUtPm1OZXh0T3V0cHV0ID09IE5VTEwpIHsKICAgICAgICAgICAgIC8vIFdlJ3ZlIHJlYWNoZWQgRU9TIGJ1dCB0aGUgYXVkaW8gdHJhY2sgaXMgbm90IHN0b3BwZWQgeWV0LAogICAgICAgICAgICAgLy8ga2VlcCBwbGF5aW5nIHNpbGVuY2UuCiAKQEAgLTE4MzMsNyArMTk2OCw3IEBACiAjZGVmaW5lIExPR19UQUcgIkF1ZGlvQ2FjaGUiCiBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvQ2FjaGU6OkF1ZGlvQ2FjaGUoY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwKSA6CiAgICAgbUhlYXAoaGVhcCksIG1DaGFubmVsQ291bnQoMCksIG1GcmFtZUNvdW50KDEwMjQpLCBtU2FtcGxlUmF0ZSgwKSwgbVNpemUoMCksCi0gICAgbUVycm9yKE5PX0VSUk9SKSwgIG1Db21tYW5kQ29tcGxldGUoZmFsc2UpCisgICAgbUZyYW1lU2l6ZSgxKSwgbUVycm9yKE5PX0VSUk9SKSwgIG1Db21tYW5kQ29tcGxldGUoZmFsc2UpCiB7CiB9CiAKQEAgLTE4NTAsMTQgKzE5ODUsMjMgQEAKIHN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9DYWNoZTo6Z2V0UG9zaXRpb24odWludDMyX3QgKnBvc2l0aW9uKSBjb25zdAogewogICAgIGlmIChwb3NpdGlvbiA9PSAwKSByZXR1cm4gQkFEX1ZBTFVFOwotICAgICpwb3NpdGlvbiA9IG1TaXplOworICAgICpwb3NpdGlvbiA9IG1TaXplIC8gbUZyYW1lU2l6ZTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9DYWNoZTo6Z2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wICZ0cykgY29uc3QKK3sKKyAgICB0cy5tUG9zaXRpb24gPSBtU2l6ZSAvIG1GcmFtZVNpemU7CisgICAgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7CisgICAgdHMubVRpbWUudHZfc2VjID0gbm93IC8gMTAwMDAwMDAwMExMOworICAgIHRzLm1UaW1lLnR2X25zZWMgPSBub3cgLSAoMTAwMDAwMDAwMExMICogdHMubVRpbWUudHZfc2VjKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIHN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9DYWNoZTo6Z2V0RnJhbWVzV3JpdHRlbih1aW50MzJfdCAqd3JpdHRlbikgY29uc3QKIHsKICAgICBpZiAod3JpdHRlbiA9PSAwKSByZXR1cm4gQkFEX1ZBTFVFOwotICAgICp3cml0dGVuID0gbVNpemU7CisgICAgKndyaXR0ZW4gPSBtU2l6ZSAvIG1GcmFtZVNpemU7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCkBAIC0xOTE5LDYgKzIwNjMsOCBAQAogCiAgICAgaWYgKGFjdHVhbFNpemUgPiAwKSB7CiAgICAgICAgIHNpbmstPndyaXRlKG1CdWZmZXIsIGFjdHVhbFNpemUpOworICAgICAgICAvLyBDb3VsZCByZXR1cm4gZmFsc2Ugb24gc2luay0+d3JpdGUoKSBlcnJvciBvciBzaG9ydCBjb3VudC4KKyAgICAgICAgLy8gTm90IG5lY2Vzc2FyaWx5IGFwcHJvcHJpYXRlIGJ1dCB3b3VsZCB3b3JrIGZvciBBdWRpb0NhY2hlIGJlaGF2aW9yLgogICAgIH0KIAogICAgIHJldHVybiB0cnVlOwpAQCAtMTkyOSw4ICsyMDc1LDggQEAKIHN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9DYWNoZTo6b3BlbigKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50IGNoYW5uZWxDb3VudCwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50IGJ1ZmZlckNvdW50LAotICAgICAgICBBdWRpb0NhbGxiYWNrIGNiLCB2b2lkICpjb29raWUsIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCisgICAgICAgIEF1ZGlvQ2FsbGJhY2sgY2IsIHZvaWQgKmNvb2tpZSwgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgLypmbGFncyovLAorICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCogLypvZmZsb2FkSW5mbyovKQogewogICAgIEFMT0dWKCJvcGVuKCV1LCAlZCwgMHgleCwgJWQsICVkKSIsIHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCwgY2hhbm5lbE1hc2ssIGZvcm1hdCwgYnVmZmVyQ291bnQpOwogICAgIGlmIChtSGVhcC0+Z2V0SGVhcElEKCkgPCAwKSB7CkBAIC0xOTQxLDYgKzIwODcsOSBAQAogICAgIG1DaGFubmVsQ291bnQgPSAodWludDE2X3QpY2hhbm5lbENvdW50OwogICAgIG1Gb3JtYXQgPSBmb3JtYXQ7CiAgICAgbU1zZWNzUGVyRnJhbWUgPSAxLmUzIC8gKGZsb2F0KSBzYW1wbGVSYXRlOworICAgIG1GcmFtZVNpemUgPSAgYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KQorICAgICAgICAgICAgPyBtQ2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShtRm9ybWF0KSA6IDE7CisgICAgbUZyYW1lQ291bnQgPSBtSGVhcC0+Z2V0U2l6ZSgpIC8gbUZyYW1lU2l6ZTsKIAogICAgIGlmIChjYiAhPSBOVUxMKSB7CiAgICAgICAgIG1DYWxsYmFja1RocmVhZCA9IG5ldyBDYWxsYmFja1RocmVhZCh0aGlzLCBjYiwgY29va2llKTsKQEAgLTE5NzAsMTIgKzIxMTksMjYgQEAKICAgICBpZiAocCA9PSBOVUxMKSByZXR1cm4gTk9fSU5JVDsKICAgICBwICs9IG1TaXplOwogICAgIEFMT0dWKCJtZW1jcHkoJXAsICVwLCAldSkiLCBwLCBidWZmZXIsIHNpemUpOwotICAgIGlmIChtU2l6ZSArIHNpemUgPiBtSGVhcC0+Z2V0U2l6ZSgpKSB7CisKKyAgICBib29sIG92ZXJmbG93ID0gbVNpemUgKyBzaXplID4gbUhlYXAtPmdldFNpemUoKTsKKyAgICBpZiAob3ZlcmZsb3cpIHsKICAgICAgICAgQUxPR0UoIkhlYXAgc2l6ZSBvdmVyZmxvdyEgcmVxIHNpemU6ICVkLCBtYXggc2l6ZTogJWQiLCAobVNpemUgKyBzaXplKSwgbUhlYXAtPmdldFNpemUoKSk7CiAgICAgICAgIHNpemUgPSBtSGVhcC0+Z2V0U2l6ZSgpIC0gbVNpemU7CiAgICAgfQorICAgIHNpemUgLT0gc2l6ZSAlIG1GcmFtZVNpemU7IC8vIGNvbnN1bWUgb25seSBpbnRlZ3JhbCBhbW91bnRzIG9mIGZyYW1lIHNpemUKICAgICBtZW1jcHkocCwgYnVmZmVyLCBzaXplKTsKICAgICBtU2l6ZSArPSBzaXplOworCisgICAgaWYgKG92ZXJmbG93KSB7CisgICAgICAgIC8vIFNpZ25hbCBoZWFwIGZpbGxlZCBoZXJlIChsYXN0IGZyYW1lIG1heSBiZSB0cnVuY2F0ZWQpLgorICAgICAgICAvLyBBZnRlciB0aGlzIHBvaW50LCBubyBtb3JlIGRhdGEgc2hvdWxkIGJlIHdyaXR0ZW4gYXMgdGhlCisgICAgICAgIC8vIGhlYXAgaXMgZmlsbGVkIGFuZCB0aGUgQXVkaW9DYWNoZSBzaG91bGQgYmUgZWZmZWN0aXZlbHkKKyAgICAgICAgLy8gaW1tdXRhYmxlIHdpdGggcmVzcGVjdCB0byBmdXR1cmUgd3JpdGVzLgorICAgICAgICAvLworICAgICAgICAvLyBJdCBpcyB0aHVzIHNhZmUgZm9yIGFub3RoZXIgdGhyZWFkIHRvIHJlYWQgdGhlIEF1ZGlvQ2FjaGUuCisgICAgICAgIG1Db21tYW5kQ29tcGxldGUgPSB0cnVlOworICAgICAgICBtU2lnbmFsLnNpZ25hbCgpOworICAgIH0KICAgICByZXR1cm4gc2l6ZTsKIH0KIApAQCAtMTk5Nyw3ICsyMTYwLDcgQEAKIH0KIAogdm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvQ2FjaGU6Om5vdGlmeSgKLSAgICAgICAgdm9pZCogY29va2llLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqb2JqKQorICAgICAgICB2b2lkKiBjb29raWUsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsKiAvKm9iaiovKQogewogICAgIEFMT0dWKCJub3RpZnkoJXAsICVkLCAlZCwgJWQpIiwgY29va2llLCBtc2csIGV4dDEsIGV4dDIpOwogICAgIEF1ZGlvQ2FjaGUqIHAgPSBzdGF0aWNfY2FzdDxBdWRpb0NhY2hlKj4oY29va2llKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaAppbmRleCA1NWJmM2NkLi45ZWYyMTgwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oCkBAIC03Miw3ICs3Miw4IEBACiAgICAgICAgIGNsYXNzIENhbGxiYWNrRGF0YTsKIAogICAgICBwdWJsaWM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvT3V0cHV0KGludCBzZXNzaW9uSWQsIGludCB1aWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb091dHB1dChpbnQgc2Vzc2lvbklkLCBpbnQgdWlkLCBpbnQgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqIGF0dHIpOwogICAgICAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+QXVkaW9PdXRwdXQoKTsKIAogICAgICAgICB2aXJ0dWFsIGJvb2wgICAgICAgICAgICByZWFkeSgpIGNvbnN0IHsgcmV0dXJuIG1UcmFjayAhPSAwOyB9CkBAIC04NCw2ICs4NSw3IEBACiAgICAgICAgIHZpcnR1YWwgdWludDMyX3QgICAgICAgIGxhdGVuY3koKSBjb25zdDsKICAgICAgICAgdmlydHVhbCBmbG9hdCAgICAgICAgICAgbXNlY3NQZXJGcmFtZSgpIGNvbnN0OwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBnZXRQb3NpdGlvbih1aW50MzJfdCAqcG9zaXRpb24pIGNvbnN0OworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAgJnRzKSBjb25zdDsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0RnJhbWVzV3JpdHRlbih1aW50MzJfdCAqZnJhbWVzd3JpdHRlbikgY29uc3Q7CiAgICAgICAgIHZpcnR1YWwgaW50ICAgICAgICAgICAgIGdldFNlc3Npb25JZCgpIGNvbnN0OwogICAgICAgICB2aXJ0dWFsIHVpbnQzMl90ICAgICAgICBnZXRTYW1wbGVSYXRlKCkgY29uc3Q7CkBAIC0xMDQsNiArMTA2LDcgQEAKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgc2V0QXVkaW9TdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOyB9CiAgICAgICAgIHZpcnR1YWwgYXVkaW9fc3RyZWFtX3R5cGVfdCBnZXRBdWRpb1N0cmVhbVR5cGUoKSBjb25zdCB7IHJldHVybiBtU3RyZWFtVHlwZTsgfQorICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBzZXRBdWRpb0F0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICogYXR0cmlidXRlcyk7CiAKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgc2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0UGxheWJhY2tSYXRlUGVybWlsbGUoaW50MzJfdCByYXRlUGVybWlsbGUpOwpAQCAtMTMzLDYgKzEzNiw3IEBACiAgICAgICAgIENhbGxiYWNrRGF0YSAqICAgICAgICAgIG1DYWxsYmFja0RhdGE7CiAgICAgICAgIHVpbnQ2NF90ICAgICAgICAgICAgICAgIG1CeXRlc1dyaXR0ZW47CiAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgICAgIG1TdHJlYW1UeXBlOworICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKm1BdHRyaWJ1dGVzOwogICAgICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtTGVmdFZvbHVtZTsKICAgICAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbVJpZ2h0Vm9sdW1lOwogICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBtUGxheWJhY2tSYXRlUGVybWlsbGU7CkBAIC0xNDAsNiArMTQ0LDcgQEAKICAgICAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbU1zZWNzUGVyRnJhbWU7CiAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQ7CiAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1VaWQ7CisgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1QaWQ7CiAgICAgICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1TZW5kTGV2ZWw7CiAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1BdXhFZmZlY3RJZDsKICAgICAgICAgc3RhdGljIGJvb2wgICAgICAgICAgICAgbUlzT25FbXVsYXRvcjsKQEAgLTE5MCwxMCArMTk1LDExIEBACiAgICAgICAgIHZpcnR1YWwgc3NpemVfdCAgICAgICAgIGJ1ZmZlclNpemUoKSBjb25zdCB7IHJldHVybiBmcmFtZVNpemUoKSAqIG1GcmFtZUNvdW50OyB9CiAgICAgICAgIHZpcnR1YWwgc3NpemVfdCAgICAgICAgIGZyYW1lQ291bnQoKSBjb25zdCB7IHJldHVybiBtRnJhbWVDb3VudDsgfQogICAgICAgICB2aXJ0dWFsIHNzaXplX3QgICAgICAgICBjaGFubmVsQ291bnQoKSBjb25zdCB7IHJldHVybiAoc3NpemVfdCltQ2hhbm5lbENvdW50OyB9Ci0gICAgICAgIHZpcnR1YWwgc3NpemVfdCAgICAgICAgIGZyYW1lU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHNzaXplX3QobUNoYW5uZWxDb3VudCAqICgobUZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCk/c2l6ZW9mKGludDE2X3QpOnNpemVvZih1X2ludDhfdCkpKTsgfQorICAgICAgICB2aXJ0dWFsIHNzaXplX3QgICAgICAgICBmcmFtZVNpemUoKSBjb25zdCB7IHJldHVybiAoc3NpemVfdCltRnJhbWVTaXplOyB9CiAgICAgICAgIHZpcnR1YWwgdWludDMyX3QgICAgICAgIGxhdGVuY3koKSBjb25zdDsKICAgICAgICAgdmlydHVhbCBmbG9hdCAgICAgICAgICAgbXNlY3NQZXJGcmFtZSgpIGNvbnN0OwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBnZXRQb3NpdGlvbih1aW50MzJfdCAqcG9zaXRpb24pIGNvbnN0OworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAgJnRzKSBjb25zdDsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0RnJhbWVzV3JpdHRlbih1aW50MzJfdCAqZnJhbWVzd3JpdHRlbikgY29uc3Q7CiAgICAgICAgIHZpcnR1YWwgaW50ICAgICAgICAgICAgIGdldFNlc3Npb25JZCgpIGNvbnN0OwogICAgICAgICB2aXJ0dWFsIHVpbnQzMl90ICAgICAgICBnZXRTYW1wbGVSYXRlKCkgY29uc3Q7CkBAIC0yMTEsMTIgKzIxNywxMiBAQAogICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBmbHVzaCgpIHt9CiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIHBhdXNlKCkge30KICAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgY2xvc2UoKSB7fQotICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBzZXRBdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKSB7fQorICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBzZXRBdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlIF9fdW51c2VkKSB7fQogICAgICAgICAgICAgICAgIC8vIHN0cmVhbSB0eXBlIGlzIG5vdCB1c2VkIGZvciBBdWRpb0NhY2hlCiAgICAgICAgIHZpcnR1YWwgYXVkaW9fc3RyZWFtX3R5cGVfdCBnZXRBdWRpb1N0cmVhbVR5cGUoKSBjb25zdCB7IHJldHVybiBBVURJT19TVFJFQU1fREVGQVVMVDsgfQogCi0gICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkge30KLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0UGxheWJhY2tSYXRlUGVybWlsbGUoaW50MzJfdCByYXRlUGVybWlsbGUpIHsgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOyB9CisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIHNldFZvbHVtZShmbG9hdCBsZWZ0IF9fdW51c2VkLCBmbG9hdCByaWdodCBfX3VudXNlZCkge30KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0UGxheWJhY2tSYXRlUGVybWlsbGUoaW50MzJfdCByYXRlUGVybWlsbGUgX191bnVzZWQpIHsgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOyB9CiAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgIHNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiBtU2FtcGxlUmF0ZTsgfQogICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICBmb3JtYXQoKSBjb25zdCB7IHJldHVybiBtRm9ybWF0OyB9CiAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgIHNpemUoKSBjb25zdCB7IHJldHVybiBtU2l6ZTsgfQpAQCAtMjQwLDYgKzI0Niw3IEBACiAgICAgICAgIHNzaXplX3QgICAgICAgICAgICAgbUZyYW1lQ291bnQ7CiAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgbVNhbXBsZVJhdGU7CiAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgbVNpemU7CisgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgbUZyYW1lU2l6ZTsKICAgICAgICAgaW50ICAgICAgICAgICAgICAgICBtRXJyb3I7CiAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgbUNvbW1hbmRDb21wbGV0ZTsKIApAQCAtMjU2LDEzICsyNjMsMjAgQEAKIAogICAgIHZpcnR1YWwgc3A8SU1lZGlhUGxheWVyPiAgICBjcmVhdGUoY29uc3Qgc3A8SU1lZGlhUGxheWVyQ2xpZW50PiYgY2xpZW50LCBpbnQgYXVkaW9TZXNzaW9uSWQpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgIGRlY29kZShjb25zdCBjaGFyKiB1cmwsIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwgaW50KiBwTnVtQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCogcEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwgc2l6ZV90ICpwU2l6ZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgIGRlY29kZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmwsCisgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsZVJhdGUsCisgICAgICAgICAgICBpbnQqIHBOdW1DaGFubmVscywKKyAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90KiBwRm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwLAorICAgICAgICAgICAgc2l6ZV90ICpwU2l6ZSk7CisKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICAgZGVjb2RlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGVSYXRlLCBpbnQqIHBOdW1DaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90KiBwRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwLCBzaXplX3QgKnBTaXplKTsKKyAgICB2aXJ0dWFsIHNwPElNZWRpYUNvZGVjTGlzdD4gZ2V0Q29kZWNMaXN0KCkgY29uc3Q7CiAgICAgdmlydHVhbCBzcDxJT01YPiAgICAgICAgICAgIGdldE9NWCgpOwogICAgIHZpcnR1YWwgc3A8SUNyeXB0bz4gICAgICAgICBtYWtlQ3J5cHRvKCk7CiAgICAgdmlydHVhbCBzcDxJRHJtPiAgICAgICAgICAgIG1ha2VEcm0oKTsKQEAgLTI3Miw5ICsyODYsNiBAQAogICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgaWZhY2UpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICB1cGRhdGVQcm94eUNvbmZpZygKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGludDMyX3QgcG9ydCwgY29uc3QgY2hhciAqZXhjbHVzaW9uTGlzdCk7Ci0KICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgcmVtb3ZlQ2xpZW50KHdwPENsaWVudD4gY2xpZW50KTsKICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgaGFzQ2xpZW50KHdwPENsaWVudD4gY2xpZW50KTsKIApAQCAtMzU3LDYgKzM2OCw3IEBACiAgICAgICAgIHNwPE1lZGlhUGxheWVyQmFzZT4gICAgIGNyZWF0ZVBsYXllcihwbGF5ZXJfdHlwZSBwbGF5ZXJUeXBlKTsKIAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXREYXRhU291cmNlKAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKIApAQCAtNDA2LDYgKzQxOCw4IEBACiAgICAgICAgIC8vIERpc2Nvbm5lY3QgZnJvbSB0aGUgY3VycmVudGx5IGNvbm5lY3RlZCBBTmF0aXZlV2luZG93LgogICAgICAgICB2b2lkIGRpc2Nvbm5lY3ROYXRpdmVXaW5kb3coKTsKIAorICAgICAgICBzdGF0dXNfdCBzZXRBdWRpb0F0dHJpYnV0ZXNfbChjb25zdCBQYXJjZWwgJnJlcXVlc3QpOworCiAgICAgICAgIG11dGFibGUgICAgIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICBtTG9jazsKICAgICAgICAgICAgICAgICAgICAgc3A8TWVkaWFQbGF5ZXJCYXNlPiAgICAgICAgIG1QbGF5ZXI7CiAgICAgICAgICAgICAgICAgICAgIHNwPE1lZGlhUGxheWVyU2VydmljZT4gICAgICBtU2VydmljZTsKQEAgLTQxNiw2ICs0MzAsNyBAQAogICAgICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbUxvb3A7CiAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICBtQ29ubklkOwogICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvU2Vzc2lvbklkOworICAgICAgICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgKiAgICAgICAgbUF1ZGlvQXR0cmlidXRlczsKICAgICAgICAgICAgICAgICAgICAgdWlkX3QgICAgICAgICAgICAgICAgICAgICAgIG1VSUQ7CiAgICAgICAgICAgICAgICAgICAgIHNwPEFOYXRpdmVXaW5kb3c+ICAgICAgICAgICBtQ29ubmVjdGVkV2luZG93OwogICAgICAgICAgICAgICAgICAgICBzcDxJQmluZGVyPiAgICAgICAgICAgICAgICAgbUNvbm5lY3RlZFdpbmRvd0JpbmRlcjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcAppbmRleCBhOTgyMGUwLi4xOTRhYmJiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwCkBAIC05NSw3ICs5NSw4IEBACiBzdGF0dXNfdCBNZWRpYVJlY29yZGVyQ2xpZW50OjpzZXRWaWRlb1NvdXJjZShpbnQgdnMpCiB7CiAgICAgQUxPR1YoInNldFZpZGVvU291cmNlKCVkKSIsIHZzKTsKLSAgICBpZiAoIWNoZWNrUGVybWlzc2lvbihjYW1lcmFQZXJtaXNzaW9uKSkgeworICAgIC8vIENoZWNrIGNhbWVyYSBwZXJtaXNzaW9uIGZvciBzb3VyY2VzIG90aGVyIHRoYW4gU1VSRkFDRQorICAgIGlmICh2cyAhPSBWSURFT19TT1VSQ0VfU1VSRkFDRSAmJiAhY2hlY2tQZXJtaXNzaW9uKGNhbWVyYVBlcm1pc3Npb24pKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZXRhZGF0YVJldHJpZXZlckNsaWVudC5jcHAKaW5kZXggN2U5MDkyNC4uYWE1OGIzNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuY3BwCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeUhlYXBCYXNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFNZXRhZGF0YVJldHJpZXZlckludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9WaWRlb0ZyYW1lLmg+CkBAIC01Niw3ICs1Nyw3IEBACiAgICAgZGlzY29ubmVjdCgpOwogfQogCi1zdGF0dXNfdCBNZXRhZGF0YVJldHJpZXZlckNsaWVudDo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0CitzdGF0dXNfdCBNZXRhZGF0YVJldHJpZXZlckNsaWVudDo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIC8qYXJncyovKSBjb25zdAogewogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwogICAgIGNoYXIgYnVmZmVyW1NJWkVdOwpAQCAtMTA2LDcgKzEwNyw5IEBACiB9CiAKIHN0YXR1c190IE1ldGFkYXRhUmV0cmlldmVyQ2xpZW50OjpzZXREYXRhU291cmNlKAotICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKQorICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKQogewogICAgIEFMT0dWKCJzZXREYXRhU291cmNlKCVzKSIsIHVybCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwpAQCAtMTI3LDcgKzEzMCw3IEBACiAgICAgQUxPR1YoInBsYXllciB0eXBlID0gJWQiLCBwbGF5ZXJUeXBlKTsKICAgICBzcDxNZWRpYU1ldGFkYXRhUmV0cmlldmVyQmFzZT4gcCA9IGNyZWF0ZVJldHJpZXZlcihwbGF5ZXJUeXBlKTsKICAgICBpZiAocCA9PSBOVUxMKSByZXR1cm4gTk9fSU5JVDsKLSAgICBzdGF0dXNfdCByZXQgPSBwLT5zZXREYXRhU291cmNlKHVybCwgaGVhZGVycyk7CisgICAgc3RhdHVzX3QgcmV0ID0gcC0+c2V0RGF0YVNvdXJjZShodHRwU2VydmljZSwgdXJsLCBoZWFkZXJzKTsKICAgICBpZiAocmV0ID09IE5PX0VSUk9SKSBtUmV0cmlldmVyID0gcDsKICAgICByZXR1cm4gcmV0OwogfQpAQCAtMTQ0LDggKzE0Nyw4IEBACiAgICAgfQogICAgIEFMT0dWKCJzdF9kZXYgID0gJWxsdSIsIHNiLnN0X2Rldik7CiAgICAgQUxPR1YoInN0X21vZGUgPSAldSIsIHNiLnN0X21vZGUpOwotICAgIEFMT0dWKCJzdF91aWQgID0gJWx1Iiwgc2Iuc3RfdWlkKTsKLSAgICBBTE9HVigic3RfZ2lkICA9ICVsdSIsIHNiLnN0X2dpZCk7CisgICAgQUxPR1YoInN0X3VpZCAgPSAlbHUiLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihzYi5zdF91aWQpKTsKKyAgICBBTE9HVigic3RfZ2lkICA9ICVsdSIsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KHNiLnN0X2dpZCkpOwogICAgIEFMT0dWKCJzdF9zaXplID0gJWxsdSIsIHNiLnN0X3NpemUpOwogCiAgICAgaWYgKG9mZnNldCA+PSBzYi5zdF9zaXplKSB7CkBAIC0yMzEsNyArMjM0LDcgQEAKICAgICAgICAgQUxPR0UoImZhaWxlZCB0byBleHRyYWN0IGFuIGFsYnVtIGFydCIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgc2l6ZV90IHNpemUgPSBzaXplb2YoTWVkaWFBbGJ1bUFydCkgKyBhbGJ1bUFydC0+bVNpemU7CisgICAgc2l6ZV90IHNpemUgPSBzaXplb2YoTWVkaWFBbGJ1bUFydCkgKyBhbGJ1bUFydC0+c2l6ZSgpOwogICAgIHNwPE1lbW9yeUhlYXBCYXNlPiBoZWFwID0gbmV3IE1lbW9yeUhlYXBCYXNlKHNpemUsIDAsICJNZXRhZGF0YVJldHJpZXZlckNsaWVudCIpOwogICAgIGlmIChoZWFwID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoImZhaWxlZCB0byBjcmVhdGUgTWVtb3J5RGVhbGVyIG9iamVjdCIpOwpAQCAtMjQ0LDExICsyNDcsOSBAQAogICAgICAgICBkZWxldGUgYWxidW1BcnQ7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBNZWRpYUFsYnVtQXJ0ICphbGJ1bUFydENvcHkgPSBzdGF0aWNfY2FzdDxNZWRpYUFsYnVtQXJ0ICo+KG1BbGJ1bUFydC0+cG9pbnRlcigpKTsKLSAgICBhbGJ1bUFydENvcHktPm1TaXplID0gYWxidW1BcnQtPm1TaXplOwotICAgIGFsYnVtQXJ0Q29weS0+bURhdGEgPSAodWludDhfdCAqKWFsYnVtQXJ0Q29weSArIHNpemVvZihNZWRpYUFsYnVtQXJ0KTsKLSAgICBtZW1jcHkoYWxidW1BcnRDb3B5LT5tRGF0YSwgYWxidW1BcnQtPm1EYXRhLCBhbGJ1bUFydC0+bVNpemUpOwotICAgIGRlbGV0ZSBhbGJ1bUFydDsgIC8vIEZpeCBtZW1vcnkgbGVha2FnZQorICAgIE1lZGlhQWxidW1BcnQ6OmluaXQoKE1lZGlhQWxidW1BcnQgKikgbUFsYnVtQXJ0LT5wb2ludGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICBhbGJ1bUFydC0+c2l6ZSgpLCBhbGJ1bUFydC0+ZGF0YSgpKTsKKyAgICBkZWxldGUgYWxidW1BcnQ7ICAvLyBXZSd2ZSB0YWtlbiBvdXIgY29weS4KICAgICByZXR1cm4gbUFsYnVtQXJ0OwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZXRhZGF0YVJldHJpZXZlckNsaWVudC5oCmluZGV4IGYwOGY5MzMuLjlkM2ZiZTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZXRhZGF0YVJldHJpZXZlckNsaWVudC5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZXRhZGF0YVJldHJpZXZlckNsaWVudC5oCkBAIC0zMCw2ICszMCw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RydWN0IElNZWRpYUhUVFBTZXJ2aWNlOwogY2xhc3MgSU1lZGlhUGxheWVyU2VydmljZTsKIGNsYXNzIE1lbW9yeURlYWxlcjsKIApAQCAtNDMsNyArNDQsOSBAQAogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgZGlzY29ubmVjdCgpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgICAgICBzZXREYXRhU291cmNlKAotICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgICAgICBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKICAgICB2aXJ0dWFsIHNwPElNZW1vcnk+ICAgICAgICAgICAgIGdldEZyYW1lQXRUaW1lKGludDY0X3QgdGltZVVzLCBpbnQgb3B0aW9uKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpRmlsZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaUZpbGUuY3BwCmluZGV4IDBhNmFhOTAuLjc0OWVmOTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpRmlsZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlGaWxlLmNwcApAQCAtMTE0LDcgKzExNCw5IEBACiB9CiAKIHN0YXR1c190IE1pZGlGaWxlOjpzZXREYXRhU291cmNlKAotICAgICAgICBjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqKSB7CisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmIC8qaHR0cFNlcnZpY2UqLywKKyAgICAgICAgY29uc3QgY2hhciogcGF0aCwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKikgewogICAgIEFMT0dWKCJNaWRpRmlsZTo6c2V0RGF0YVNvdXJjZSB1cmw9JXMiLCBwYXRoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaUZpbGUuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpRmlsZS5oCmluZGV4IDI0ZDU5YjQuLjgyZTRlODggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpRmlsZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpRmlsZS5oCkBAIC0zMiwxMSArMzIsMTMgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGluaXRDaGVjaygpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXREYXRhU291cmNlKAotICAgICAgICAgICAgY29uc3QgY2hhciogcGF0aCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOworICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhdGgsCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0VmlkZW9TdXJmYWNlVGV4dHVyZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGJ1ZmZlclByb2R1Y2VyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgLypidWZmZXJQcm9kdWNlciovKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIFVOS05PV05fRVJST1I7IH0KICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHByZXBhcmUoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHByZXBhcmVBc3luYygpOwpAQCAtNTEsMTMgKzUzLDEzIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICByZXNldCgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0TG9vcGluZyhpbnQgbG9vcCk7CiAgICAgdmlydHVhbCBwbGF5ZXJfdHlwZSBwbGF5ZXJUeXBlKCkgeyByZXR1cm4gU09OSVZPWF9QTEFZRVI7IH0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGludm9rZShjb25zdCBQYXJjZWwmIHJlcXVlc3QsIFBhcmNlbCAqcmVwbHkpIHsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGludm9rZShjb25zdCBQYXJjZWwmIC8qcmVxdWVzdCovLCBQYXJjZWwqIC8qcmVwbHkqLykgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCAmcmVxdWVzdCkgeworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0UGFyYW1ldGVyKGludCAvKmtleSovLCBjb25zdCBQYXJjZWwgJi8qcmVxdWVzdCovKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSkgeworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0UGFyYW1ldGVyKGludCAvKmtleSovLCBQYXJjZWwqIC8qcmVwbHkqLykgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaU1ldGFkYXRhUmV0cmlldmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpTWV0YWRhdGFSZXRyaWV2ZXIuY3BwCmluZGV4IDQ2NTIwOWYuLmYzY2Y2ZWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpTWV0YWRhdGFSZXRyaWV2ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpTWV0YWRhdGFSZXRyaWV2ZXIuY3BwCkBAIC0yMiw2ICsyMiw4IEBACiAjaW5jbHVkZSAiTWlkaU1ldGFkYXRhUmV0cmlldmVyLmgiCiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5oPgogCisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdGF0aWMgc3RhdHVzX3QgRVJST1JfTk9UX09QRU4gPSAtMTsKQEAgLTM2LDcgKzM4LDkgQEAKIH0KIAogc3RhdHVzX3QgTWlkaU1ldGFkYXRhUmV0cmlldmVyOjpzZXREYXRhU291cmNlKAotICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKQorICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKQogewogICAgIEFMT0dWKCJzZXREYXRhU291cmNlOiAlcyIsIHVybD8gdXJsOiAiTlVMTCBwb2ludGVyIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwpAQCAtNDQsNyArNDgsNyBAQAogICAgIGlmIChtTWlkaVBsYXllciA9PSAwKSB7CiAgICAgICAgIG1NaWRpUGxheWVyID0gbmV3IE1pZGlGaWxlKCk7CiAgICAgfQotICAgIHJldHVybiBtTWlkaVBsYXllci0+c2V0RGF0YVNvdXJjZSh1cmwsIGhlYWRlcnMpOworICAgIHJldHVybiBtTWlkaVBsYXllci0+c2V0RGF0YVNvdXJjZShodHRwU2VydmljZSwgdXJsLCBoZWFkZXJzKTsKIH0KIAogc3RhdHVzX3QgTWlkaU1ldGFkYXRhUmV0cmlldmVyOjpzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlNZXRhZGF0YVJldHJpZXZlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlNZXRhZGF0YVJldHJpZXZlci5oCmluZGV4IDRjZWU0MmQuLmI4MjE0ZWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpTWV0YWRhdGFSZXRyaWV2ZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaU1ldGFkYXRhUmV0cmlldmVyLmgKQEAgLTMyLDcgKzMyLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfk1pZGlNZXRhZGF0YVJldHJpZXZlcigpIHt9CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICAgICAgIHNldERhdGFTb3VyY2UoCi0gICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICAgICAgIHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwogICAgIHZpcnR1YWwgY29uc3QgY2hhciogICAgICAgICAgICAgZXh0cmFjdE1ldGFkYXRhKGludCBrZXlDb2RlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuY3BwCmluZGV4IGRlNjFkOWIuLmIzN2FlZTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmNwcApAQCAtNTQsOCArNTQsMTAgQEAKIH0KIAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRQbGF5ZXI6OnNldERhdGFTb3VyY2UoCi0gICAgICAgIGNvbnN0IGNoYXIgKnVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKLSAgICByZXR1cm4gbVBsYXllci0+c2V0RGF0YVNvdXJjZSh1cmwsIGhlYWRlcnMpOworICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CisgICAgcmV0dXJuIG1QbGF5ZXItPnNldERhdGFTb3VyY2UoaHR0cFNlcnZpY2UsIHVybCwgaGVhZGVycyk7CiB9CiAKIC8vIFdhcm5pbmc6IFRoZSBmaWxlZGVzY3JpcHRvciBwYXNzZWQgaW50byB0aGlzIG1ldGhvZCB3aWxsIG9ubHkgYmUgdmFsaWQgdW50aWwKQEAgLTE4Nyw3ICsxODksNyBAQAogfQogCiBzdGF0dXNfdCBTdGFnZWZyaWdodFBsYXllcjo6Z2V0TWV0YWRhdGEoCi0gICAgICAgIGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyJiBpZHMsIFBhcmNlbCAqcmVjb3JkcykgeworICAgICAgICBjb25zdCBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciYgLyogaWRzICovLCBQYXJjZWwgKnJlY29yZHMpIHsKICAgICB1c2luZyBtZWRpYTo6TWV0YWRhdGE7CiAKICAgICB1aW50MzJfdCBmbGFncyA9IG1QbGF5ZXItPmZsYWdzKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5oCmluZGV4IDYwMDk0NWUuLmU2YzMwZmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5oCkBAIC0zNCw3ICszNCw5IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRVSUQodWlkX3QgdWlkKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZSgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOworICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcAppbmRleCBmOWQ5MDIwLi5jYWRkNjkxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwCkBAIC0xNiwxNiArMTYsMjEgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJTdGFnZWZyaWdodFJlY29yZGVyIgorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKKyNpbmNsdWRlICJXZWJtV3JpdGVyLmgiCiAjaW5jbHVkZSAiU3RhZ2VmcmlnaHRSZWNvcmRlci5oIgogCiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogCiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0F1ZGlvLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BTVJXcml0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BQUNXcml0ZXIuaD4KQEAgLTM1LDEzICs0MCwxMiBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ2xpZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVByb2ZpbGVzLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0lDYW1lcmEuaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oPgotI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CiAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KQEAgLTcxLDggKzc1LDcgQEAKICAgICAgIG1BdWRpb1NvdXJjZShBVURJT19TT1VSQ0VfQ05UKSwKICAgICAgIG1WaWRlb1NvdXJjZShWSURFT19TT1VSQ0VfTElTVF9FTkQpLAogICAgICAgbUNhcHR1cmVUaW1lTGFwc2UoZmFsc2UpLAotICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAotICAgICAgbVN1cmZhY2VNZWRpYVNvdXJjZShOVUxMKSB7CisgICAgICBtU3RhcnRlZChmYWxzZSkgewogCiAgICAgQUxPR1YoIkNvbnN0cnVjdG9yIik7CiAgICAgcmVzZXQoKTsKQEAgLTgxLDEwICs4NCwxOSBAQAogU3RhZ2VmcmlnaHRSZWNvcmRlcjo6flN0YWdlZnJpZ2h0UmVjb3JkZXIoKSB7CiAgICAgQUxPR1YoIkRlc3RydWN0b3IiKTsKICAgICBzdG9wKCk7CisKKyAgICBpZiAobUxvb3BlciAhPSBOVUxMKSB7CisgICAgICAgIG1Mb29wZXItPnN0b3AoKTsKKyAgICB9CiB9CiAKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OmluaXQoKSB7CiAgICAgQUxPR1YoImluaXQiKTsKKworICAgIG1Mb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICBtTG9vcGVyLT5zZXROYW1lKCJyZWNvcmRlcl9sb29wZXIiKTsKKyAgICBtTG9vcGVyLT5zdGFydCgpOworCiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC05Myw3ICsxMDUsNyBAQAogLy8gd2hpbGUgZW5jb2RpbmcgR0wgRnJhbWVzCiBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBTdGFnZWZyaWdodFJlY29yZGVyOjpxdWVyeVN1cmZhY2VNZWRpYVNvdXJjZSgpIGNvbnN0IHsKICAgICBBTE9HVigiR2V0IFN1cmZhY2VNZWRpYVNvdXJjZSIpOwotICAgIHJldHVybiBtU3VyZmFjZU1lZGlhU291cmNlLT5nZXRCdWZmZXJRdWV1ZSgpOworICAgIHJldHVybiBtR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwogfQogCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRBdWRpb1NvdXJjZShhdWRpb19zb3VyY2VfdCBhcykgewpAQCAtMTcyLDExICsxODQsNyBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIGlmICh2ZSA9PSBWSURFT19FTkNPREVSX0RFRkFVTFQpIHsKLSAgICAgICAgbVZpZGVvRW5jb2RlciA9IFZJREVPX0VOQ09ERVJfSDI2MzsKLSAgICB9IGVsc2UgewotICAgICAgICBtVmlkZW9FbmNvZGVyID0gdmU7Ci0gICAgfQorICAgIG1WaWRlb0VuY29kZXIgPSB2ZTsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTIzMyw3ICsyNDEsNyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0T3V0cHV0RmlsZShjb25zdCBjaGFyICpwYXRoKSB7CitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRPdXRwdXRGaWxlKGNvbnN0IGNoYXIgKiAvKiBwYXRoICovKSB7CiAgICAgQUxPR0UoInNldE91dHB1dEZpbGUoY29uc3QgY2hhciopIG11c3Qgbm90IGJlIGNhbGxlZCIpOwogICAgIC8vIFdlIGRvbid0IGFjdHVhbGx5IHN1cHBvcnQgdGhpcyBhdCBhbGwsIGFzIHRoZSBtZWRpYV9zZXJ2ZXIgcHJvY2VzcwogICAgIC8vIG5vIGxvbmdlciBoYXMgcGVybWlzc2lvbnMgdG8gY3JlYXRlIGZpbGVzLgpAQCAtNjgwLDEwICs2ODgsMTAgQEAKICAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbVRpbWVMYXBzZUVuYWJsZSh0aW1lTGFwc2VFbmFibGUpOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChrZXkgPT0gInRpbWUtYmV0d2Vlbi10aW1lLWxhcHNlLWZyYW1lLWNhcHR1cmUiKSB7Ci0gICAgICAgIGludDY0X3QgdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVNczsKLSAgICAgICAgaWYgKHNhZmVfc3RydG9pNjQodmFsdWUuc3RyaW5nKCksICZ0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZU1zKSkgeworICAgICAgICBpbnQ2NF90IHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXM7CisgICAgICAgIGlmIChzYWZlX3N0cnRvaTY0KHZhbHVlLnN0cmluZygpLCAmdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcykpIHsKICAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlKAotICAgICAgICAgICAgICAgICAgICAxMDAwTEwgKiB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZU1zKTsKKyAgICAgICAgICAgICAgICAgICAgdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcyk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBBTE9HRSgic2V0UGFyYW1ldGVyOiBmYWlsZWQgdG8gZmluZCBrZXkgJXMiLCBrZXkuc3RyaW5nKCkpOwpAQCAtNzM4LDE5ICs3NDYsMTUgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnByZXBhcmUoKSB7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzdGFydCgpIHsKLSAgICBDSEVDS19HRShtT3V0cHV0RmQsIDApOworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6cHJlcGFyZUludGVybmFsKCkgeworICAgIEFMT0dWKCJwcmVwYXJlIik7CisgICAgaWYgKG1PdXRwdXRGZCA8IDApIHsKKyAgICAgICAgQUxPR0UoIk91dHB1dCBmaWxlIGRlc2NyaXB0b3IgaXMgaW52YWxpZCIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQogCiAgICAgLy8gR2V0IFVJRCBoZXJlIGZvciBwZXJtaXNzaW9uIGNoZWNraW5nCiAgICAgbUNsaWVudFVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKLSAgICBpZiAobVdyaXRlciAhPSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJGaWxlIHdyaXRlciBpcyBub3QgYXZhaWFsYmxlIik7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KIAogICAgIHN0YXR1c190IHN0YXR1cyA9IE9LOwogCkBAIC03NTgsMjUgKzc2MiwyNiBAQAogICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfREVGQVVMVDoKICAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX1RIUkVFX0dQUDoKICAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX01QRUdfNDoKLSAgICAgICAgICAgIHN0YXR1cyA9IHN0YXJ0TVBFRzRSZWNvcmRpbmcoKTsKKyAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX1dFQk06CisgICAgICAgICAgICBzdGF0dXMgPSBzZXR1cE1QRUc0b3JXRUJNUmVjb3JkaW5nKCk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfQU1SX05COgogICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfQU1SX1dCOgotICAgICAgICAgICAgc3RhdHVzID0gc3RhcnRBTVJSZWNvcmRpbmcoKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IHNldHVwQU1SUmVjb3JkaW5nKCk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfQUFDX0FESUY6CiAgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9BQUNfQURUUzoKLSAgICAgICAgICAgIHN0YXR1cyA9IHN0YXJ0QUFDUmVjb3JkaW5nKCk7CisgICAgICAgICAgICBzdGF0dXMgPSBzZXR1cEFBQ1JlY29yZGluZygpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX1JUUF9BVlA6Ci0gICAgICAgICAgICBzdGF0dXMgPSBzdGFydFJUUFJlY29yZGluZygpOworICAgICAgICAgICAgc3RhdHVzID0gc2V0dXBSVFBSZWNvcmRpbmcoKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9NUEVHMlRTOgotICAgICAgICAgICAgc3RhdHVzID0gc3RhcnRNUEVHMlRTUmVjb3JkaW5nKCk7CisgICAgICAgICAgICBzdGF0dXMgPSBzZXR1cE1QRUcyVFNSZWNvcmRpbmcoKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6CkBAIC03ODUsNiArNzkwLDc3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpwcmVwYXJlKCkgeworICAgIGlmIChtVmlkZW9Tb3VyY2UgPT0gVklERU9fU09VUkNFX1NVUkZBQ0UpIHsKKyAgICAgICAgcmV0dXJuIHByZXBhcmVJbnRlcm5hbCgpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnN0YXJ0KCkgeworICAgIEFMT0dWKCJzdGFydCIpOworICAgIGlmIChtT3V0cHV0RmQgPCAwKSB7CisgICAgICAgIEFMT0dFKCJPdXRwdXQgZmlsZSBkZXNjcmlwdG9yIGlzIGludmFsaWQiKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHN0YXR1c190IHN0YXR1cyA9IE9LOworCisgICAgaWYgKG1WaWRlb1NvdXJjZSAhPSBWSURFT19TT1VSQ0VfU1VSRkFDRSkgeworICAgICAgICBzdGF0dXMgPSBwcmVwYXJlSW50ZXJuYWwoKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtV3JpdGVyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIkZpbGUgd3JpdGVyIGlzIG5vdCBhdmFpYWxibGUiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgc3dpdGNoIChtT3V0cHV0Rm9ybWF0KSB7CisgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9ERUZBVUxUOgorICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfVEhSRUVfR1BQOgorICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfTVBFR180OgorICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfV0VCTToKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbCBpc01QRUc0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChtT3V0cHV0Rm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfV0VCTSkgeworICAgICAgICAgICAgICAgIGlzTVBFRzQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOworICAgICAgICAgICAgc2V0dXBNUEVHNG9yV0VCTU1ldGFEYXRhKCZtZXRhKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1Xcml0ZXItPnN0YXJ0KG1ldGEuZ2V0KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfQU1SX05COgorICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfQU1SX1dCOgorICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfQUFDX0FESUY6CisgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9BQUNfQURUUzoKKyAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX1JUUF9BVlA6CisgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9NUEVHMlRTOgorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBtV3JpdGVyLT5zdGFydCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgb3V0cHV0IGZpbGUgZm9ybWF0OiAlZCIsIG1PdXRwdXRGb3JtYXQpOworICAgICAgICAgICAgc3RhdHVzID0gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICBtV3JpdGVyLmNsZWFyKCk7CisgICAgICAgIG1Xcml0ZXIgPSBOVUxMOworICAgIH0KKwogICAgIGlmICgoc3RhdHVzID09IE9LKSAmJiAoIW1TdGFydGVkKSkgewogICAgICAgICBtU3RhcnRlZCA9IHRydWU7CiAKQEAgLTgxNiw1OCArODkyLDU4IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIHNwPE1ldGFEYXRhPiBlbmNNZXRhID0gbmV3IE1ldGFEYXRhOworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBuZXcgQU1lc3NhZ2U7CiAgICAgY29uc3QgY2hhciAqbWltZTsKICAgICBzd2l0Y2ggKG1BdWRpb0VuY29kZXIpIHsKICAgICAgICAgY2FzZSBBVURJT19FTkNPREVSX0FNUl9OQjoKICAgICAgICAgY2FzZSBBVURJT19FTkNPREVSX0RFRkFVTFQ6Ci0gICAgICAgICAgICBtaW1lID0gTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05COworICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQVVESU9fRU5DT0RFUl9BTVJfV0I6Ci0gICAgICAgICAgICBtaW1lID0gTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCOworICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQVVESU9fRU5DT0RFUl9BQUM6Ci0gICAgICAgICAgICBtaW1lID0gTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDOwotICAgICAgICAgICAgZW5jTWV0YS0+c2V0SW50MzIoa0tleUFBQ1Byb2ZpbGUsIE9NWF9BVURJT19BQUNPYmplY3RMQyk7CisgICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyk7CisgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJhYWMtcHJvZmlsZSIsIE9NWF9BVURJT19BQUNPYmplY3RMQyk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBVURJT19FTkNPREVSX0hFX0FBQzoKLSAgICAgICAgICAgIG1pbWUgPSBNRURJQV9NSU1FVFlQRV9BVURJT19BQUM7Ci0gICAgICAgICAgICBlbmNNZXRhLT5zZXRJbnQzMihrS2V5QUFDUHJvZmlsZSwgT01YX0FVRElPX0FBQ09iamVjdEhFKTsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImFhYy1wcm9maWxlIiwgT01YX0FVRElPX0FBQ09iamVjdEhFKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFVRElPX0VOQ09ERVJfQUFDX0VMRDoKLSAgICAgICAgICAgIG1pbWUgPSBNRURJQV9NSU1FVFlQRV9BVURJT19BQUM7Ci0gICAgICAgICAgICBlbmNNZXRhLT5zZXRJbnQzMihrS2V5QUFDUHJvZmlsZSwgT01YX0FVRElPX0FBQ09iamVjdEVMRCk7CisgICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyk7CisgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJhYWMtcHJvZmlsZSIsIE9NWF9BVURJT19BQUNPYmplY3RFTEQpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIEFMT0dFKCJVbmtub3duIGF1ZGlvIGVuY29kZXI6ICVkIiwgbUF1ZGlvRW5jb2Rlcik7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgZW5jTWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIG1pbWUpOwogCiAgICAgaW50MzJfdCBtYXhJbnB1dFNpemU7CiAgICAgQ0hFQ0soYXVkaW9Tb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kSW50MzIoCiAgICAgICAgICAgICAgICAga0tleU1heElucHV0U2l6ZSwgJm1heElucHV0U2l6ZSkpOwogCi0gICAgZW5jTWV0YS0+c2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgbWF4SW5wdXRTaXplKTsKLSAgICBlbmNNZXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBtQXVkaW9DaGFubmVscyk7Ci0gICAgZW5jTWV0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIG1TYW1wbGVSYXRlKTsKLSAgICBlbmNNZXRhLT5zZXRJbnQzMihrS2V5Qml0UmF0ZSwgbUF1ZGlvQml0UmF0ZSk7CisgICAgZm9ybWF0LT5zZXRJbnQzMigibWF4LWlucHV0LXNpemUiLCBtYXhJbnB1dFNpemUpOworICAgIGZvcm1hdC0+c2V0SW50MzIoImNoYW5uZWwtY291bnQiLCBtQXVkaW9DaGFubmVscyk7CisgICAgZm9ybWF0LT5zZXRJbnQzMigic2FtcGxlLXJhdGUiLCBtU2FtcGxlUmF0ZSk7CisgICAgZm9ybWF0LT5zZXRJbnQzMigiYml0cmF0ZSIsIG1BdWRpb0JpdFJhdGUpOwogICAgIGlmIChtQXVkaW9UaW1lU2NhbGUgPiAwKSB7Ci0gICAgICAgIGVuY01ldGEtPnNldEludDMyKGtLZXlUaW1lU2NhbGUsIG1BdWRpb1RpbWVTY2FsZSk7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInRpbWUtc2NhbGUiLCBtQXVkaW9UaW1lU2NhbGUpOwogICAgIH0KIAotICAgIE9NWENsaWVudCBjbGllbnQ7Ci0gICAgQ0hFQ0tfRVEoY2xpZW50LmNvbm5lY3QoKSwgKHN0YXR1c190KU9LKTsKICAgICBzcDxNZWRpYVNvdXJjZT4gYXVkaW9FbmNvZGVyID0KLSAgICAgICAgT01YQ29kZWM6OkNyZWF0ZShjbGllbnQuaW50ZXJmYWNlKCksIGVuY01ldGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBjcmVhdGVFbmNvZGVyICovLCBhdWRpb1NvdXJjZSk7CisgICAgICAgICAgICBNZWRpYUNvZGVjU291cmNlOjpDcmVhdGUobUxvb3BlciwgZm9ybWF0LCBhdWRpb1NvdXJjZSk7CiAgICAgbUF1ZGlvU291cmNlTm9kZSA9IGF1ZGlvU291cmNlOwogCisgICAgaWYgKGF1ZGlvRW5jb2RlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIGF1ZGlvIGVuY29kZXIiKTsKKyAgICB9CisKICAgICByZXR1cm4gYXVkaW9FbmNvZGVyOwogfQogCi1zdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzdGFydEFBQ1JlY29yZGluZygpIHsKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwQUFDUmVjb3JkaW5nKCkgewogICAgIC8vIEZJWE1FOgogICAgIC8vIEFkZCBzdXBwb3J0IGZvciBPVVRQVVRfRk9STUFUX0FBQ19BRElGCiAgICAgQ0hFQ0tfRVEobU91dHB1dEZvcm1hdCwgT1VUUFVUX0ZPUk1BVF9BQUNfQURUUyk7CkBAIC04NzgsMTYgKzk1NCwxMCBAQAogICAgIENIRUNLKG1BdWRpb1NvdXJjZSAhPSBBVURJT19TT1VSQ0VfQ05UKTsKIAogICAgIG1Xcml0ZXIgPSBuZXcgQUFDV3JpdGVyKG1PdXRwdXRGZCk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RhcnRSYXdBdWRpb1JlY29yZGluZygpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgbVdyaXRlci5jbGVhcigpOwotICAgICAgICBtV3JpdGVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3RhdHVzOworICAgIHJldHVybiBzZXR1cFJhd0F1ZGlvUmVjb3JkaW5nKCk7CiB9CiAKLXN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnN0YXJ0QU1SUmVjb3JkaW5nKCkgeworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBBTVJSZWNvcmRpbmcoKSB7CiAgICAgQ0hFQ0sobU91dHB1dEZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX0FNUl9OQiB8fAogICAgICAgICAgIG1PdXRwdXRGb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9BTVJfV0IpOwogCkBAIC05MDcsMTUgKzk3NywxMCBAQAogICAgIH0KIAogICAgIG1Xcml0ZXIgPSBuZXcgQU1SV3JpdGVyKG1PdXRwdXRGZCk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RhcnRSYXdBdWRpb1JlY29yZGluZygpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgbVdyaXRlci5jbGVhcigpOwotICAgICAgICBtV3JpdGVyID0gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKKyAgICByZXR1cm4gc2V0dXBSYXdBdWRpb1JlY29yZGluZygpOwogfQogCi1zdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzdGFydFJhd0F1ZGlvUmVjb3JkaW5nKCkgeworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBSYXdBdWRpb1JlY29yZGluZygpIHsKICAgICBpZiAobUF1ZGlvU291cmNlID49IEFVRElPX1NPVVJDRV9DTlQpIHsKICAgICAgICAgQUxPR0UoIkludmFsaWQgYXVkaW8gc291cmNlOiAlZCIsIG1BdWRpb1NvdXJjZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CkBAIC05NDEsMTIgKzEwMDYsMTEgQEAKICAgICAgICAgbVdyaXRlci0+c2V0TWF4RmlsZVNpemUobU1heEZpbGVTaXplQnl0ZXMpOwogICAgIH0KICAgICBtV3JpdGVyLT5zZXRMaXN0ZW5lcihtTGlzdGVuZXIpOwotICAgIG1Xcml0ZXItPnN0YXJ0KCk7CiAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnN0YXJ0UlRQUmVjb3JkaW5nKCkgeworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBSVFBSZWNvcmRpbmcoKSB7CiAgICAgQ0hFQ0tfRVEobU91dHB1dEZvcm1hdCwgT1VUUFVUX0ZPUk1BVF9SVFBfQVZQKTsKIAogICAgIGlmICgobUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9DTlQKQEAgLTk2Niw2ICsxMDMwLDcgQEAKICAgICBpZiAobUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9DTlQpIHsKICAgICAgICAgc291cmNlID0gY3JlYXRlQXVkaW9Tb3VyY2UoKTsKICAgICB9IGVsc2UgeworICAgICAgICBzZXREZWZhdWx0VmlkZW9FbmNvZGVySWZOZWNlc3NhcnkoKTsKIAogICAgICAgICBzcDxNZWRpYVNvdXJjZT4gbWVkaWFTb3VyY2U7CiAgICAgICAgIHN0YXR1c190IGVyciA9IHNldHVwTWVkaWFTb3VyY2UoJm1lZGlhU291cmNlKTsKQEAgLTk3Myw3ICsxMDM4LDcgQEAKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KIAotICAgICAgICBlcnIgPSBzZXR1cFZpZGVvRW5jb2RlcihtZWRpYVNvdXJjZSwgbVZpZGVvQml0UmF0ZSwgJnNvdXJjZSk7CisgICAgICAgIGVyciA9IHNldHVwVmlkZW9FbmNvZGVyKG1lZGlhU291cmNlLCAmc291cmNlKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQpAQCAtOTgzLDEwICsxMDQ4LDEwIEBACiAgICAgbVdyaXRlci0+YWRkU291cmNlKHNvdXJjZSk7CiAgICAgbVdyaXRlci0+c2V0TGlzdGVuZXIobUxpc3RlbmVyKTsKIAotICAgIHJldHVybiBtV3JpdGVyLT5zdGFydCgpOworICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c3RhcnRNUEVHMlRTUmVjb3JkaW5nKCkgeworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBNUEVHMlRTUmVjb3JkaW5nKCkgewogICAgIENIRUNLX0VRKG1PdXRwdXRGb3JtYXQsIE9VVFBVVF9GT1JNQVRfTVBFRzJUUyk7CiAKICAgICBzcDxNZWRpYVdyaXRlcj4gd3JpdGVyID0gbmV3IE1QRUcyVFNXcml0ZXIobU91dHB1dEZkKTsKQEAgLTEwMDcsNiArMTA3Miw3IEBACiAKICAgICBpZiAobVZpZGVvU291cmNlIDwgVklERU9fU09VUkNFX0xJU1RfRU5EKSB7CiAgICAgICAgIGlmIChtVmlkZW9FbmNvZGVyICE9IFZJREVPX0VOQ09ERVJfSDI2NCkgeworICAgICAgICAgICAgQUxPR0UoIk1QRUcyVFMgcmVjb3JkaW5nIG9ubHkgc3VwcG9ydHMgSC4yNjQgZW5jb2RpbmchIik7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgICAgIH0KIApAQCAtMTAxNyw3ICsxMDgzLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHNwPE1lZGlhU291cmNlPiBlbmNvZGVyOwotICAgICAgICBlcnIgPSBzZXR1cFZpZGVvRW5jb2RlcihtZWRpYVNvdXJjZSwgbVZpZGVvQml0UmF0ZSwgJmVuY29kZXIpOworICAgICAgICBlcnIgPSBzZXR1cFZpZGVvRW5jb2RlcihtZWRpYVNvdXJjZSwgJmVuY29kZXIpOwogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIHJldHVybiBlcnI7CkBAIC0xMDM2LDExICsxMTAyLDE3IEBACiAKICAgICBtV3JpdGVyID0gd3JpdGVyOwogCi0gICAgcmV0dXJuIG1Xcml0ZXItPnN0YXJ0KCk7CisgICAgcmV0dXJuIE9LOwogfQogCiB2b2lkIFN0YWdlZnJpZ2h0UmVjb3JkZXI6OmNsaXBWaWRlb0ZyYW1lUmF0ZSgpIHsKICAgICBBTE9HVigiY2xpcFZpZGVvRnJhbWVSYXRlOiBlbmNvZGVyICVkIiwgbVZpZGVvRW5jb2Rlcik7CisgICAgaWYgKG1GcmFtZVJhdGUgPT0gLTEpIHsKKyAgICAgICAgbUZyYW1lUmF0ZSA9IG1FbmNvZGVyUHJvZmlsZXMtPmdldENhbWNvcmRlclByb2ZpbGVQYXJhbUJ5TmFtZSgKKyAgICAgICAgICAgICAgICAidmlkLmZwcyIsIG1DYW1lcmFJZCwgQ0FNQ09SREVSX1FVQUxJVFlfTE9XKTsKKyAgICAgICAgQUxPR1coIlVzaW5nIGRlZmF1bHQgdmlkZW8gZnBzICVkIiwgbUZyYW1lUmF0ZSk7CisgICAgfQorCiAgICAgaW50IG1pbkZyYW1lUmF0ZSA9IG1FbmNvZGVyUHJvZmlsZXMtPmdldFZpZGVvRW5jb2RlclBhcmFtQnlOYW1lKAogICAgICAgICAgICAgICAgICAgICAgICAgImVuYy52aWQuZnBzLm1pbiIsIG1WaWRlb0VuY29kZXIpOwogICAgIGludCBtYXhGcmFtZVJhdGUgPSBtRW5jb2RlclByb2ZpbGVzLT5nZXRWaWRlb0VuY29kZXJQYXJhbUJ5TmFtZSgKQEAgLTExMDAsNiArMTE3Miw3IEBACiAgICAgICAgICAgICBjbGllbnQuaW50ZXJmYWNlKCksCiAgICAgICAgICAgICAobVZpZGVvRW5jb2RlciA9PSBWSURFT19FTkNPREVSX0gyNjMgPyBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzIDoKICAgICAgICAgICAgICBtVmlkZW9FbmNvZGVyID09IFZJREVPX0VOQ09ERVJfTVBFR180X1NQID8gTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQgOgorICAgICAgICAgICAgIG1WaWRlb0VuY29kZXIgPT0gVklERU9fRU5DT0RFUl9WUDggPyBNRURJQV9NSU1FVFlQRV9WSURFT19WUDggOgogICAgICAgICAgICAgIG1WaWRlb0VuY29kZXIgPT0gVklERU9fRU5DT0RFUl9IMjY0ID8gTUVESUFfTUlNRVRZUEVfVklERU9fQVZDIDogIiIpLAogICAgICAgICAgICAgZmFsc2UgLyogZGVjb2RlciAqLywgdHJ1ZSAvKiBod0NvZGVjICovLCAmY29kZWNzKTsKICAgICAqc3VwcG9ydHNDYW1lcmFTb3VyY2VNZXRhRGF0YU1vZGUgPSBjb2RlY3Muc2l6ZSgpID4gMDsKQEAgLTExNzIsNiArMTI0NSwzMSBAQAogICAgICAgICBpZiAodmlkZW9Db2RlYyA9PSBWSURFT19FTkNPREVSX0gyNjQpIHsKICAgICAgICAgICAgIEFMT0dJKCJGb3JjZSB0byB1c2UgQVZDIGJhc2VsaW5lIHByb2ZpbGUiKTsKICAgICAgICAgICAgIHNldFBhcmFtVmlkZW9FbmNvZGVyUHJvZmlsZShPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lKTsKKyAgICAgICAgICAgIC8vIHNldCAwIGZvciBpbnZhbGlkIGxldmVscyAtIHRoaXMgd2lsbCBiZSByZWplY3RlZCBieSB0aGUKKyAgICAgICAgICAgIC8vIGNvZGVjIGlmIGl0IGNhbm5vdCBoYW5kbGUgaXQgZHVyaW5nIGNvbmZpZ3VyZQorICAgICAgICAgICAgc2V0UGFyYW1WaWRlb0VuY29kZXJMZXZlbChBQ29kZWM6OmdldEFWQ0xldmVsRm9yKAorICAgICAgICAgICAgICAgICAgICB2aWRlb0ZyYW1lV2lkdGgsIHZpZGVvRnJhbWVIZWlnaHQsIHZpZGVvRnJhbWVSYXRlLCB2aWRlb0JpdFJhdGUpKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXREZWZhdWx0VmlkZW9FbmNvZGVySWZOZWNlc3NhcnkoKSB7CisgICAgaWYgKG1WaWRlb0VuY29kZXIgPT0gVklERU9fRU5DT0RFUl9ERUZBVUxUKSB7CisgICAgICAgIGlmIChtT3V0cHV0Rm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfV0VCTSkgeworICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBWUDggZm9yIFdFQk0gcmVjb3JkaW5nCisgICAgICAgICAgICBtVmlkZW9FbmNvZGVyID0gVklERU9fRU5DT0RFUl9WUDg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBwaWNrIHRoZSBkZWZhdWx0IGVuY29kZXIgZm9yIENBTUNPUkRFUl9RVUFMSVRZX0xPVworICAgICAgICAgICAgaW50IHZpZGVvQ29kZWMgPSBtRW5jb2RlclByb2ZpbGVzLT5nZXRDYW1jb3JkZXJQcm9maWxlUGFyYW1CeU5hbWUoCisgICAgICAgICAgICAgICAgICAgICJ2aWQuY29kZWMiLCBtQ2FtZXJhSWQsIENBTUNPUkRFUl9RVUFMSVRZX0xPVyk7CisKKyAgICAgICAgICAgIGlmICh2aWRlb0NvZGVjID4gVklERU9fRU5DT0RFUl9ERUZBVUxUICYmCisgICAgICAgICAgICAgICAgdmlkZW9Db2RlYyA8IFZJREVPX0VOQ09ERVJfTElTVF9FTkQpIHsKKyAgICAgICAgICAgICAgICBtVmlkZW9FbmNvZGVyID0gKHZpZGVvX2VuY29kZXIpdmlkZW9Db2RlYzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBILjI2NCBpZiBjYW1jb3JkZXIgcHJvZmlsZSBub3QgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgbVZpZGVvRW5jb2RlciA9IFZJREVPX0VOQ09ERVJfSDI2NDsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KQEAgLTEyNzcsNDkgKzEzNzUsMTQgQEAKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KICAgICAgICAgKm1lZGlhU291cmNlID0gY2FtZXJhU291cmNlOwotICAgIH0gZWxzZSBpZiAobVZpZGVvU291cmNlID09IFZJREVPX1NPVVJDRV9HUkFMTE9DX0JVRkZFUikgewotICAgICAgICAvLyBJZiB1c2luZyBHUkFsbG9jIGJ1ZmZlcnMsIHNldHVwIHN1cmZhY2VtZWRpYXNvdXJjZS4KLSAgICAgICAgLy8gTGF0ZXIgYSBoYW5kbGUgdG8gdGhhdCB3aWxsIGJlIHBhc3NlZAotICAgICAgICAvLyB0byB0aGUgY2xpZW50IHNpZGUgd2hlbiBxdWVyaWVkCi0gICAgICAgIHN0YXR1c190IGVyciA9IHNldHVwU3VyZmFjZU1lZGlhU291cmNlKCk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgKm1lZGlhU291cmNlID0gbVN1cmZhY2VNZWRpYVNvdXJjZTsKKyAgICB9IGVsc2UgaWYgKG1WaWRlb1NvdXJjZSA9PSBWSURFT19TT1VSQ0VfU1VSRkFDRSkgeworICAgICAgICAqbWVkaWFTb3VyY2UgPSBOVUxMOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgcmV0dXJuIE9LOwogfQogCi0vLyBzZXR1cFN1cmZhY2VNZWRpYVNvdXJjZSBjcmVhdGVzIGEgc291cmNlIHdpdGggdGhlIGdpdmVuCi0vLyB3aWR0aCBhbmQgaGVpZ2h0IGFuZCBmcmFtZXJhdGUuCi0vLyBUT0RPOiBUaGlzIGNvdWxkIGdvIGluIGEgc3RhdGljIGZ1bmN0aW9uIGluc2lkZSBTdXJmYWNlTWVkaWFTb3VyY2UKLS8vIHNpbWlsYXIgdG8gdGhhdCBpbiBDYW1lcmFTb3VyY2UKLXN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwU3VyZmFjZU1lZGlhU291cmNlKCkgewotICAgIHN0YXR1c190IGVyciA9IE9LOwotICAgIG1TdXJmYWNlTWVkaWFTb3VyY2UgPSBuZXcgU3VyZmFjZU1lZGlhU291cmNlKG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOwotICAgIGlmIChtU3VyZmFjZU1lZGlhU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotCi0gICAgaWYgKG1GcmFtZVJhdGUgPT0gLTEpIHsKLSAgICAgICAgaW50MzJfdCBmcmFtZVJhdGUgPSAwOwotICAgICAgICBDSEVDSyAobVN1cmZhY2VNZWRpYVNvdXJjZS0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQzMigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5RnJhbWVSYXRlLCAmZnJhbWVSYXRlKSk7Ci0gICAgICAgIEFMT0dJKCJGcmFtZSByYXRlIGlzIG5vdCBleHBsaWNpdGx5IHNldC4gVXNlIHRoZSBjdXJyZW50IGZyYW1lICIKLSAgICAgICAgICAgICAicmF0ZSAoJWQgZnBzKSIsIGZyYW1lUmF0ZSk7Ci0gICAgICAgIG1GcmFtZVJhdGUgPSBmcmFtZVJhdGU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZXJyID0gbVN1cmZhY2VNZWRpYVNvdXJjZS0+c2V0RnJhbWVSYXRlKG1GcmFtZVJhdGUpOwotICAgIH0KLSAgICBDSEVDSyhtRnJhbWVSYXRlICE9IC0xKTsKLQotICAgIG1Jc01ldGFEYXRhU3RvcmVkSW5WaWRlb0J1ZmZlcnMgPQotICAgICAgICBtU3VyZmFjZU1lZGlhU291cmNlLT5pc01ldGFEYXRhU3RvcmVkSW5WaWRlb0J1ZmZlcnMoKTsKLSAgICByZXR1cm4gZXJyOwotfQotCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cENhbWVyYVNvdXJjZSgKICAgICAgICAgc3A8Q2FtZXJhU291cmNlPiAqY2FtZXJhU291cmNlKSB7CiAgICAgc3RhdHVzX3QgZXJyID0gT0s7CkBAIC0xMzgzLDI1ICsxNDQ2LDI2IEBACiAKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwVmlkZW9FbmNvZGVyKAogICAgICAgICBzcDxNZWRpYVNvdXJjZT4gY2FtZXJhU291cmNlLAotICAgICAgICBpbnQzMl90IHZpZGVvQml0UmF0ZSwKICAgICAgICAgc3A8TWVkaWFTb3VyY2U+ICpzb3VyY2UpIHsKICAgICBzb3VyY2UtPmNsZWFyKCk7CiAKLSAgICBzcDxNZXRhRGF0YT4gZW5jX21ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlCaXRSYXRlLCB2aWRlb0JpdFJhdGUpOwotICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5RnJhbWVSYXRlLCBtRnJhbWVSYXRlKTsKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbmV3IEFNZXNzYWdlKCk7CiAKICAgICBzd2l0Y2ggKG1WaWRlb0VuY29kZXIpIHsKICAgICAgICAgY2FzZSBWSURFT19FTkNPREVSX0gyNjM6Ci0gICAgICAgICAgICBlbmNfbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMpOworICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgVklERU9fRU5DT0RFUl9NUEVHXzRfU1A6Ci0gICAgICAgICAgICBlbmNfbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KTsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBWSURFT19FTkNPREVSX0gyNjQ6Ci0gICAgICAgICAgICBlbmNfbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CisgICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFZJREVPX0VOQ09ERVJfVlA4OgorICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9WSURFT19WUDgpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgZGVmYXVsdDoKQEAgLTE0MDksNTkgKzE0NzMsODAgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gY2FtZXJhU291cmNlLT5nZXRGb3JtYXQoKTsKKyAgICBpZiAoY2FtZXJhU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBjYW1lcmFTb3VyY2UtPmdldEZvcm1hdCgpOwogCi0gICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIHNsaWNlSGVpZ2h0LCBjb2xvckZvcm1hdDsKLSAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmd2lkdGgpKTsKLSAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJmhlaWdodCkpOwotICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5U3RyaWRlLCAmc3RyaWRlKSk7Ci0gICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlTbGljZUhlaWdodCwgJnNsaWNlSGVpZ2h0KSk7Ci0gICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlDb2xvckZvcm1hdCwgJmNvbG9yRm9ybWF0KSk7CisgICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCBzbGljZUhlaWdodCwgY29sb3JGb3JtYXQ7CisgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ3aWR0aCkpOworICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJmhlaWdodCkpOworICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVN0cmlkZSwgJnN0cmlkZSkpOworICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVNsaWNlSGVpZ2h0LCAmc2xpY2VIZWlnaHQpKTsKKyAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlDb2xvckZvcm1hdCwgJmNvbG9yRm9ybWF0KSk7CiAKLSAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleVdpZHRoLCB3aWR0aCk7Ci0gICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGhlaWdodCk7Ci0gICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlJRnJhbWVzSW50ZXJ2YWwsIG1JRnJhbWVzSW50ZXJ2YWxTZWMpOwotICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5U3RyaWRlLCBzdHJpZGUpOwotICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5U2xpY2VIZWlnaHQsIHNsaWNlSGVpZ2h0KTsKLSAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleUNvbG9yRm9ybWF0LCBjb2xvckZvcm1hdCk7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoIndpZHRoIiwgd2lkdGgpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJoZWlnaHQiLCBoZWlnaHQpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJzdHJpZGUiLCBzdHJpZGUpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJzbGljZS1oZWlnaHQiLCBzbGljZUhlaWdodCk7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImNvbG9yLWZvcm1hdCIsIGNvbG9yRm9ybWF0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJ3aWR0aCIsIG1WaWRlb1dpZHRoKTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiaGVpZ2h0IiwgbVZpZGVvSGVpZ2h0KTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigic3RyaWRlIiwgbVZpZGVvV2lkdGgpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJzbGljZS1oZWlnaHQiLCBtVmlkZW9XaWR0aCk7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImNvbG9yLWZvcm1hdCIsIE9NWF9DT0xPUl9Gb3JtYXRBbmRyb2lkT3BhcXVlKTsKKworICAgICAgICAvLyBzZXQgdXAgdGltZSBsYXBzZS9zbG93IG1vdGlvbiBmb3Igc3VyZmFjZSBzb3VyY2UKKyAgICAgICAgaWYgKG1DYXB0dXJlVGltZUxhcHNlKSB7CisgICAgICAgICAgICBpZiAobVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMgPD0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzIHZhbHVlOiAlbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3JtYXQtPnNldEludDY0KCJ0aW1lLWxhcHNlIiwKKyAgICAgICAgICAgICAgICAgICAgbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9ybWF0LT5zZXRJbnQzMigiYml0cmF0ZSIsIG1WaWRlb0JpdFJhdGUpOworICAgIGZvcm1hdC0+c2V0SW50MzIoImZyYW1lLXJhdGUiLCBtRnJhbWVSYXRlKTsKKyAgICBmb3JtYXQtPnNldEludDMyKCJpLWZyYW1lLWludGVydmFsIiwgbUlGcmFtZXNJbnRlcnZhbFNlYyk7CisKICAgICBpZiAobVZpZGVvVGltZVNjYWxlID4gMCkgewotICAgICAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleVRpbWVTY2FsZSwgbVZpZGVvVGltZVNjYWxlKTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigidGltZS1zY2FsZSIsIG1WaWRlb1RpbWVTY2FsZSk7CiAgICAgfQogICAgIGlmIChtVmlkZW9FbmNvZGVyUHJvZmlsZSAhPSAtMSkgewotICAgICAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleVZpZGVvUHJvZmlsZSwgbVZpZGVvRW5jb2RlclByb2ZpbGUpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJwcm9maWxlIiwgbVZpZGVvRW5jb2RlclByb2ZpbGUpOwogICAgIH0KICAgICBpZiAobVZpZGVvRW5jb2RlckxldmVsICE9IC0xKSB7Ci0gICAgICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5VmlkZW9MZXZlbCwgbVZpZGVvRW5jb2RlckxldmVsKTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigibGV2ZWwiLCBtVmlkZW9FbmNvZGVyTGV2ZWwpOwogICAgIH0KIAotICAgIE9NWENsaWVudCBjbGllbnQ7Ci0gICAgQ0hFQ0tfRVEoY2xpZW50LmNvbm5lY3QoKSwgKHN0YXR1c190KU9LKTsKLQotICAgIHVpbnQzMl90IGVuY29kZXJfZmxhZ3MgPSAwOworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKICAgICBpZiAobUlzTWV0YURhdGFTdG9yZWRJblZpZGVvQnVmZmVycykgewotICAgICAgICBlbmNvZGVyX2ZsYWdzIHw9IE9NWENvZGVjOjprU3RvcmVNZXRhRGF0YUluVmlkZW9CdWZmZXJzOworICAgICAgICBmbGFncyB8PSBNZWRpYUNvZGVjU291cmNlOjpGTEFHX1VTRV9NRVRBREFUQV9JTlBVVDsKICAgICB9CiAKLSAgICAvLyBEbyBub3Qgd2FpdCBmb3IgYWxsIHRoZSBpbnB1dCBidWZmZXJzIHRvIGJlY29tZSBhdmFpbGFibGUuCi0gICAgLy8gVGhpcyBnaXZlIHRpbWVsYXBzZSB2aWRlbyByZWNvcmRpbmcgZmFzdGVyIHJlc3BvbnNlIGluCi0gICAgLy8gcmVjZWl2aW5nIG91dHB1dCBmcm9tIHZpZGVvIGVuY29kZXIgY29tcG9uZW50LgotICAgIGlmIChtQ2FwdHVyZVRpbWVMYXBzZSkgewotICAgICAgICBlbmNvZGVyX2ZsYWdzIHw9IE9NWENvZGVjOjprT25seVN1Ym1pdE9uZUlucHV0QnVmZmVyQXRPbmVUaW1lOworICAgIGlmIChjYW1lcmFTb3VyY2UgPT0gTlVMTCkgeworICAgICAgICBmbGFncyB8PSBNZWRpYUNvZGVjU291cmNlOjpGTEFHX1VTRV9TVVJGQUNFX0lOUFVUOwogICAgIH0KIAotICAgIHNwPE1lZGlhU291cmNlPiBlbmNvZGVyID0gT01YQ29kZWM6OkNyZWF0ZSgKLSAgICAgICAgICAgIGNsaWVudC5pbnRlcmZhY2UoKSwgZW5jX21ldGEsCi0gICAgICAgICAgICB0cnVlIC8qIGNyZWF0ZUVuY29kZXIgKi8sIGNhbWVyYVNvdXJjZSwKLSAgICAgICAgICAgIE5VTEwsIGVuY29kZXJfZmxhZ3MpOworICAgIHNwPE1lZGlhQ29kZWNTb3VyY2U+IGVuY29kZXIgPQorICAgICAgICAgICAgTWVkaWFDb2RlY1NvdXJjZTo6Q3JlYXRlKG1Mb29wZXIsIGZvcm1hdCwgY2FtZXJhU291cmNlLCBmbGFncyk7CiAgICAgaWYgKGVuY29kZXIgPT0gTlVMTCkgewotICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGNyZWF0ZSB0aGUgZW5jb2RlciIpOworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSB2aWRlbyBlbmNvZGVyIik7CiAgICAgICAgIC8vIFdoZW4gdGhlIGVuY29kZXIgZmFpbHMgdG8gYmUgY3JlYXRlZCwgd2UgbmVlZAogICAgICAgICAvLyByZWxlYXNlIHRoZSBjYW1lcmEgc291cmNlIGR1ZSB0byB0aGUgY2FtZXJhJ3MgbG9jawogICAgICAgICAvLyBhbmQgdW5sb2NrIG1lY2hhbmlzbS4KLSAgICAgICAgY2FtZXJhU291cmNlLT5zdG9wKCk7CisgICAgICAgIGlmIChjYW1lcmFTb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgY2FtZXJhU291cmNlLT5zdG9wKCk7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogCisgICAgaWYgKGNhbWVyYVNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIG1HcmFwaGljQnVmZmVyUHJvZHVjZXIgPSBlbmNvZGVyLT5nZXRHcmFwaGljQnVmZmVyUHJvZHVjZXIoKTsKKyAgICB9CisKICAgICAqc291cmNlID0gZW5jb2RlcjsKIAogICAgIHJldHVybiBPSzsKQEAgLTE0OTUsMTggKzE1ODAsMjAgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwTVBFRzRSZWNvcmRpbmcoCi0gICAgICAgIGludCBvdXRwdXRGZCwKLSAgICAgICAgaW50MzJfdCB2aWRlb1dpZHRoLCBpbnQzMl90IHZpZGVvSGVpZ2h0LAotICAgICAgICBpbnQzMl90IHZpZGVvQml0UmF0ZSwKLSAgICAgICAgaW50MzJfdCAqdG90YWxCaXRSYXRlLAotICAgICAgICBzcDxNZWRpYVdyaXRlcj4gKm1lZGlhV3JpdGVyKSB7Ci0gICAgbWVkaWFXcml0ZXItPmNsZWFyKCk7Ci0gICAgKnRvdGFsQml0UmF0ZSA9IDA7CitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cE1QRUc0b3JXRUJNUmVjb3JkaW5nKCkgeworICAgIG1Xcml0ZXIuY2xlYXIoKTsKKyAgICBtVG90YWxCaXRSYXRlID0gMDsKKwogICAgIHN0YXR1c190IGVyciA9IE9LOwotICAgIHNwPE1lZGlhV3JpdGVyPiB3cml0ZXIgPSBuZXcgTVBFRzRXcml0ZXIob3V0cHV0RmQpOworICAgIHNwPE1lZGlhV3JpdGVyPiB3cml0ZXI7CisgICAgaWYgKG1PdXRwdXRGb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9XRUJNKSB7CisgICAgICAgIHdyaXRlciA9IG5ldyBXZWJtV3JpdGVyKG1PdXRwdXRGZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgd3JpdGVyID0gbmV3IE1QRUc0V3JpdGVyKG1PdXRwdXRGZCk7CisgICAgfQogCiAgICAgaWYgKG1WaWRlb1NvdXJjZSA8IFZJREVPX1NPVVJDRV9MSVNUX0VORCkgeworICAgICAgICBzZXREZWZhdWx0VmlkZW9FbmNvZGVySWZOZWNlc3NhcnkoKTsKIAogICAgICAgICBzcDxNZWRpYVNvdXJjZT4gbWVkaWFTb3VyY2U7CiAgICAgICAgIGVyciA9IHNldHVwTWVkaWFTb3VyY2UoJm1lZGlhU291cmNlKTsKQEAgLTE1MTUsMzEgKzE2MDIsMzQgQEAKICAgICAgICAgfQogCiAgICAgICAgIHNwPE1lZGlhU291cmNlPiBlbmNvZGVyOwotICAgICAgICBlcnIgPSBzZXR1cFZpZGVvRW5jb2RlcihtZWRpYVNvdXJjZSwgdmlkZW9CaXRSYXRlLCAmZW5jb2Rlcik7CisgICAgICAgIGVyciA9IHNldHVwVmlkZW9FbmNvZGVyKG1lZGlhU291cmNlLCAmZW5jb2Rlcik7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KIAogICAgICAgICB3cml0ZXItPmFkZFNvdXJjZShlbmNvZGVyKTsKLSAgICAgICAgKnRvdGFsQml0UmF0ZSArPSB2aWRlb0JpdFJhdGU7CisgICAgICAgIG1Ub3RhbEJpdFJhdGUgKz0gbVZpZGVvQml0UmF0ZTsKICAgICB9CiAKLSAgICAvLyBBdWRpbyBzb3VyY2UgaXMgYWRkZWQgYXQgdGhlIGVuZCBpZiBpdCBleGlzdHMuCi0gICAgLy8gVGhpcyBoZWxwIG1ha2Ugc3VyZSB0aGF0IHRoZSAicmVjb2RpbmciIHNvdW5kIGlzIHN1cHByZXNzZWQgZm9yCi0gICAgLy8gY2FtY29yZGVyIGFwcGxpY2F0aW9ucyBpbiB0aGUgcmVjb3JkZWQgZmlsZXMuCi0gICAgaWYgKCFtQ2FwdHVyZVRpbWVMYXBzZSAmJiAobUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9DTlQpKSB7Ci0gICAgICAgIGVyciA9IHNldHVwQXVkaW9FbmNvZGVyKHdyaXRlcik7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7Ci0gICAgICAgICp0b3RhbEJpdFJhdGUgKz0gbUF1ZGlvQml0UmF0ZTsKLSAgICB9CisgICAgaWYgKG1PdXRwdXRGb3JtYXQgIT0gT1VUUFVUX0ZPUk1BVF9XRUJNKSB7CisgICAgICAgIC8vIEF1ZGlvIHNvdXJjZSBpcyBhZGRlZCBhdCB0aGUgZW5kIGlmIGl0IGV4aXN0cy4KKyAgICAgICAgLy8gVGhpcyBoZWxwIG1ha2Ugc3VyZSB0aGF0IHRoZSAicmVjb2RpbmciIHNvdW5kIGlzIHN1cHByZXNzZWQgZm9yCisgICAgICAgIC8vIGNhbWNvcmRlciBhcHBsaWNhdGlvbnMgaW4gdGhlIHJlY29yZGVkIGZpbGVzLgorICAgICAgICAvLyBUT0RPIEF1ZGlvIHNvdXJjZSBpcyBjdXJyZW50bHkgdW5zdXBwb3J0ZWQgZm9yIHdlYm0gb3V0cHV0OyB2b3JiaXMgZW5jb2RlciBuZWVkZWQuCisgICAgICAgIGlmICghbUNhcHR1cmVUaW1lTGFwc2UgJiYgKG1BdWRpb1NvdXJjZSAhPSBBVURJT19TT1VSQ0VfQ05UKSkgeworICAgICAgICAgICAgZXJyID0gc2V0dXBBdWRpb0VuY29kZXIod3JpdGVyKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisgICAgICAgICAgICBtVG90YWxCaXRSYXRlICs9IG1BdWRpb0JpdFJhdGU7CisgICAgICAgIH0KIAotICAgIGlmIChtSW50ZXJsZWF2ZUR1cmF0aW9uVXMgPiAwKSB7Ci0gICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TVBFRzRXcml0ZXIgKj4od3JpdGVyLmdldCgpKS0+Ci0gICAgICAgICAgICBzZXRJbnRlcmxlYXZlRHVyYXRpb24obUludGVybGVhdmVEdXJhdGlvblVzKTsKLSAgICB9Ci0gICAgaWYgKG1Mb25naXR1ZGV4MTAwMDAgPiAtMzYwMDAwMCAmJiBtTGF0aXR1ZGV4MTAwMDAgPiAtMzYwMDAwMCkgewotICAgICAgICByZWludGVycHJldF9jYXN0PE1QRUc0V3JpdGVyICo+KHdyaXRlci5nZXQoKSktPgotICAgICAgICAgICAgc2V0R2VvRGF0YShtTGF0aXR1ZGV4MTAwMDAsIG1Mb25naXR1ZGV4MTAwMDApOworICAgICAgICBpZiAobUludGVybGVhdmVEdXJhdGlvblVzID4gMCkgeworICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxNUEVHNFdyaXRlciAqPih3cml0ZXIuZ2V0KCkpLT4KKyAgICAgICAgICAgICAgICBzZXRJbnRlcmxlYXZlRHVyYXRpb24obUludGVybGVhdmVEdXJhdGlvblVzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUxvbmdpdHVkZXgxMDAwMCA+IC0zNjAwMDAwICYmIG1MYXRpdHVkZXgxMDAwMCA+IC0zNjAwMDAwKSB7CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PE1QRUc0V3JpdGVyICo+KHdyaXRlci5nZXQoKSktPgorICAgICAgICAgICAgICAgIHNldEdlb0RhdGEobUxhdGl0dWRleDEwMDAwLCBtTG9uZ2l0dWRleDEwMDAwKTsKKyAgICAgICAgfQogICAgIH0KICAgICBpZiAobU1heEZpbGVEdXJhdGlvblVzICE9IDApIHsKICAgICAgICAgd3JpdGVyLT5zZXRNYXhGaWxlRHVyYXRpb24obU1heEZpbGVEdXJhdGlvblVzKTsKQEAgLTE1NDcsNTQgKzE2MzcsMzkgQEAKICAgICBpZiAobU1heEZpbGVTaXplQnl0ZXMgIT0gMCkgewogICAgICAgICB3cml0ZXItPnNldE1heEZpbGVTaXplKG1NYXhGaWxlU2l6ZUJ5dGVzKTsKICAgICB9Ci0KLSAgICBtU3RhcnRUaW1lT2Zmc2V0TXMgPSBtRW5jb2RlclByb2ZpbGVzLT5nZXRTdGFydFRpbWVPZmZzZXRNcyhtQ2FtZXJhSWQpOworICAgIGlmIChtVmlkZW9Tb3VyY2UgPT0gVklERU9fU09VUkNFX0RFRkFVTFQKKyAgICAgICAgICAgIHx8IG1WaWRlb1NvdXJjZSA9PSBWSURFT19TT1VSQ0VfQ0FNRVJBKSB7CisgICAgICAgIG1TdGFydFRpbWVPZmZzZXRNcyA9IG1FbmNvZGVyUHJvZmlsZXMtPmdldFN0YXJ0VGltZU9mZnNldE1zKG1DYW1lcmFJZCk7CisgICAgfSBlbHNlIGlmIChtVmlkZW9Tb3VyY2UgPT0gVklERU9fU09VUkNFX1NVUkZBQ0UpIHsKKyAgICAgICAgLy8gc3VyZmFjZSBzb3VyY2UgZG9lc24ndCBuZWVkIGxhcmdlIGluaXRpYWwgZGVsYXkKKyAgICAgICAgbVN0YXJ0VGltZU9mZnNldE1zID0gMjAwOworICAgIH0KICAgICBpZiAobVN0YXJ0VGltZU9mZnNldE1zID4gMCkgewotICAgICAgICByZWludGVycHJldF9jYXN0PE1QRUc0V3JpdGVyICo+KHdyaXRlci5nZXQoKSktPgotICAgICAgICAgICAgc2V0U3RhcnRUaW1lT2Zmc2V0TXMobVN0YXJ0VGltZU9mZnNldE1zKTsKKyAgICAgICAgd3JpdGVyLT5zZXRTdGFydFRpbWVPZmZzZXRNcyhtU3RhcnRUaW1lT2Zmc2V0TXMpOwogICAgIH0KIAogICAgIHdyaXRlci0+c2V0TGlzdGVuZXIobUxpc3RlbmVyKTsKLSAgICAqbWVkaWFXcml0ZXIgPSB3cml0ZXI7CisgICAgbVdyaXRlciA9IHdyaXRlcjsKICAgICByZXR1cm4gT0s7CiB9CiAKLXZvaWQgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBNUEVHNE1ldGFEYXRhKGludDY0X3Qgc3RhcnRUaW1lVXMsIGludDMyX3QgdG90YWxCaXRSYXRlLAotICAgICAgICBzcDxNZXRhRGF0YT4gKm1ldGEpIHsKK3ZvaWQgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBNUEVHNG9yV0VCTU1ldGFEYXRhKHNwPE1ldGFEYXRhPiAqbWV0YSkgeworICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSBzeXN0ZW1UaW1lKCkgLyAxMDAwOwogICAgICgqbWV0YSktPnNldEludDY0KGtLZXlUaW1lLCBzdGFydFRpbWVVcyk7CiAgICAgKCptZXRhKS0+c2V0SW50MzIoa0tleUZpbGVUeXBlLCBtT3V0cHV0Rm9ybWF0KTsKLSAgICAoKm1ldGEpLT5zZXRJbnQzMihrS2V5Qml0UmF0ZSwgdG90YWxCaXRSYXRlKTsKLSAgICAoKm1ldGEpLT5zZXRJbnQzMihrS2V5NjRCaXRGaWxlT2Zmc2V0LCBtVXNlNjRCaXRGaWxlT2Zmc2V0KTsKKyAgICAoKm1ldGEpLT5zZXRJbnQzMihrS2V5Qml0UmF0ZSwgbVRvdGFsQml0UmF0ZSk7CiAgICAgaWYgKG1Nb3ZpZVRpbWVTY2FsZSA+IDApIHsKICAgICAgICAgKCptZXRhKS0+c2V0SW50MzIoa0tleVRpbWVTY2FsZSwgbU1vdmllVGltZVNjYWxlKTsKICAgICB9Ci0gICAgaWYgKG1UcmFja0V2ZXJ5VGltZUR1cmF0aW9uVXMgPiAwKSB7Ci0gICAgICAgICgqbWV0YSktPnNldEludDY0KGtLZXlUcmFja1RpbWVTdGF0dXMsIG1UcmFja0V2ZXJ5VGltZUR1cmF0aW9uVXMpOworICAgIGlmIChtT3V0cHV0Rm9ybWF0ICE9IE9VVFBVVF9GT1JNQVRfV0VCTSkgeworICAgICAgICAoKm1ldGEpLT5zZXRJbnQzMihrS2V5NjRCaXRGaWxlT2Zmc2V0LCBtVXNlNjRCaXRGaWxlT2Zmc2V0KTsKKyAgICAgICAgaWYgKG1UcmFja0V2ZXJ5VGltZUR1cmF0aW9uVXMgPiAwKSB7CisgICAgICAgICAgICAoKm1ldGEpLT5zZXRJbnQ2NChrS2V5VHJhY2tUaW1lU3RhdHVzLCBtVHJhY2tFdmVyeVRpbWVEdXJhdGlvblVzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVJvdGF0aW9uRGVncmVlcyAhPSAwKSB7CisgICAgICAgICAgICAoKm1ldGEpLT5zZXRJbnQzMihrS2V5Um90YXRpb24sIG1Sb3RhdGlvbkRlZ3JlZXMpOworICAgICAgICB9CiAgICAgfQotICAgIGlmIChtUm90YXRpb25EZWdyZWVzICE9IDApIHsKLSAgICAgICAgKCptZXRhKS0+c2V0SW50MzIoa0tleVJvdGF0aW9uLCBtUm90YXRpb25EZWdyZWVzKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnN0YXJ0TVBFRzRSZWNvcmRpbmcoKSB7Ci0gICAgaW50MzJfdCB0b3RhbEJpdFJhdGU7Ci0gICAgc3RhdHVzX3QgZXJyID0gc2V0dXBNUEVHNFJlY29yZGluZygKLSAgICAgICAgICAgIG1PdXRwdXRGZCwgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCwKLSAgICAgICAgICAgIG1WaWRlb0JpdFJhdGUsICZ0b3RhbEJpdFJhdGUsICZtV3JpdGVyKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IHN5c3RlbVRpbWUoKSAvIDEwMDA7Ci0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgc2V0dXBNUEVHNE1ldGFEYXRhKHN0YXJ0VGltZVVzLCB0b3RhbEJpdFJhdGUsICZtZXRhKTsKLQotICAgIGVyciA9IG1Xcml0ZXItPnN0YXJ0KG1ldGEuZ2V0KCkpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnBhdXNlKCkgewpAQCAtMTYzNiw2ICsxNzExLDggQEAKICAgICAgICAgbVdyaXRlci5jbGVhcigpOwogICAgIH0KIAorICAgIG1HcmFwaGljQnVmZmVyUHJvZHVjZXIuY2xlYXIoKTsKKwogICAgIGlmIChtT3V0cHV0RmQgPj0gMCkgewogICAgICAgICA6OmNsb3NlKG1PdXRwdXRGZCk7CiAgICAgICAgIG1PdXRwdXRGZCA9IC0xOwpAQCAtMTY1NSw3ICsxNzMyLDYgQEAKICAgICAgICAgYWRkQmF0dGVyeURhdGEocGFyYW1zKTsKICAgICB9CiAKLQogICAgIHJldHVybiBlcnI7CiB9CiAKQEAgLTE2NzcsNyArMTc1Myw3IEBACiAgICAgLy8gRGVmYXVsdCBwYXJhbWV0ZXJzCiAgICAgbU91dHB1dEZvcm1hdCAgPSBPVVRQVVRfRk9STUFUX1RIUkVFX0dQUDsKICAgICBtQXVkaW9FbmNvZGVyICA9IEFVRElPX0VOQ09ERVJfQU1SX05COwotICAgIG1WaWRlb0VuY29kZXIgID0gVklERU9fRU5DT0RFUl9IMjYzOworICAgIG1WaWRlb0VuY29kZXIgID0gVklERU9fRU5DT0RFUl9ERUZBVUxUOwogICAgIG1WaWRlb1dpZHRoICAgID0gMTc2OwogICAgIG1WaWRlb0hlaWdodCAgID0gMTQ0OwogICAgIG1GcmFtZVJhdGUgICAgID0gLTE7CkBAIC0xNzA3LDYgKzE3ODMsNyBAQAogICAgIG1Sb3RhdGlvbkRlZ3JlZXMgPSAwOwogICAgIG1MYXRpdHVkZXgxMDAwMCA9IC0zNjAwMDAwOwogICAgIG1Mb25naXR1ZGV4MTAwMDAgPSAtMzYwMDAwMDsKKyAgICBtVG90YWxCaXRSYXRlID0gMDsKIAogICAgIG1PdXRwdXRGZCA9IC0xOwogCkBAIC0xNzQ3LDE1ICsxODI0LDE1IEBACiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgRmlsZSBmb3JtYXQ6ICVkXG4iLCBtT3V0cHV0Rm9ybWF0KTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBNYXggZmlsZSBzaXplIChieXRlcyk6ICVsbGRcbiIsIG1NYXhGaWxlU2l6ZUJ5dGVzKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIE1heCBmaWxlIHNpemUgKGJ5dGVzKTogJSIgUFJJZDY0ICJcbiIsIG1NYXhGaWxlU2l6ZUJ5dGVzKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBNYXggZmlsZSBkdXJhdGlvbiAodXMpOiAlbGxkXG4iLCBtTWF4RmlsZUR1cmF0aW9uVXMpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgTWF4IGZpbGUgZHVyYXRpb24gKHVzKTogJSIgUFJJZDY0ICJcbiIsIG1NYXhGaWxlRHVyYXRpb25Vcyk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgRmlsZSBvZmZzZXQgbGVuZ3RoIChiaXRzKTogJWRcbiIsIG1Vc2U2NEJpdEZpbGVPZmZzZXQ/IDY0OiAzMik7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgSW50ZXJsZWF2ZSBkdXJhdGlvbiAodXMpOiAlZFxuIiwgbUludGVybGVhdmVEdXJhdGlvblVzKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBQcm9ncmVzcyBub3RpZmljYXRpb246ICVsbGQgdXNcbiIsIG1UcmFja0V2ZXJ5VGltZUR1cmF0aW9uVXMpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgUHJvZ3Jlc3Mgbm90aWZpY2F0aW9uOiAlIiBQUklkNjQgIiB1c1xuIiwgbVRyYWNrRXZlcnlUaW1lRHVyYXRpb25Vcyk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgIEF1ZGlvXG4iKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaAppbmRleCAzMWYwOWUwLi41NGMzOGQzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmgKQEAgLTM3LDYgKzM3LDcgQEAKIGNsYXNzIE1lZGlhUHJvZmlsZXM7CiBjbGFzcyBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwogY2xhc3MgU3VyZmFjZU1lZGlhU291cmNlOworY2xhc3MgQUxvb3BlcjsKIAogc3RydWN0IFN0YWdlZnJpZ2h0UmVjb3JkZXIgOiBwdWJsaWMgTWVkaWFSZWNvcmRlckJhc2UgewogICAgIFN0YWdlZnJpZ2h0UmVjb3JkZXIoKTsKQEAgLTEwNiw2ICsxMDcsNyBAQAogICAgIGludDMyX3QgbUxhdGl0dWRleDEwMDAwOwogICAgIGludDMyX3QgbUxvbmdpdHVkZXgxMDAwMDsKICAgICBpbnQzMl90IG1TdGFydFRpbWVPZmZzZXRNczsKKyAgICBpbnQzMl90IG1Ub3RhbEJpdFJhdGU7CiAKICAgICBib29sIG1DYXB0dXJlVGltZUxhcHNlOwogICAgIGludDY0X3QgbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXM7CkBAIC0xMjIsMjIgKzEyNCwxNyBAQAogICAgIC8vIEFuIDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBwb2ludGVyCiAgICAgLy8gd2lsbCBiZSBzZW50IHRvIHRoZSBjbGllbnQgc2lkZSB1c2luZyB3aGljaCB0aGUKICAgICAvLyBmcmFtZSBidWZmZXJzIHdpbGwgYmUgcXVldWVkIGFuZCBkZXF1ZXVlZAotICAgIHNwPFN1cmZhY2VNZWRpYVNvdXJjZT4gbVN1cmZhY2VNZWRpYVNvdXJjZTsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CiAKLSAgICBzdGF0dXNfdCBzZXR1cE1QRUc0UmVjb3JkaW5nKAotICAgICAgICBpbnQgb3V0cHV0RmQsCi0gICAgICAgIGludDMyX3QgdmlkZW9XaWR0aCwgaW50MzJfdCB2aWRlb0hlaWdodCwKLSAgICAgICAgaW50MzJfdCB2aWRlb0JpdFJhdGUsCi0gICAgICAgIGludDMyX3QgKnRvdGFsQml0UmF0ZSwKLSAgICAgICAgc3A8TWVkaWFXcml0ZXI+ICptZWRpYVdyaXRlcik7Ci0gICAgdm9pZCBzZXR1cE1QRUc0TWV0YURhdGEoaW50NjRfdCBzdGFydFRpbWVVcywgaW50MzJfdCB0b3RhbEJpdFJhdGUsCi0gICAgICAgIHNwPE1ldGFEYXRhPiAqbWV0YSk7Ci0gICAgc3RhdHVzX3Qgc3RhcnRNUEVHNFJlY29yZGluZygpOwotICAgIHN0YXR1c190IHN0YXJ0QU1SUmVjb3JkaW5nKCk7Ci0gICAgc3RhdHVzX3Qgc3RhcnRBQUNSZWNvcmRpbmcoKTsKLSAgICBzdGF0dXNfdCBzdGFydFJhd0F1ZGlvUmVjb3JkaW5nKCk7Ci0gICAgc3RhdHVzX3Qgc3RhcnRSVFBSZWNvcmRpbmcoKTsKLSAgICBzdGF0dXNfdCBzdGFydE1QRUcyVFNSZWNvcmRpbmcoKTsKKyAgICBzdGF0dXNfdCBwcmVwYXJlSW50ZXJuYWwoKTsKKyAgICBzdGF0dXNfdCBzZXR1cE1QRUc0b3JXRUJNUmVjb3JkaW5nKCk7CisgICAgdm9pZCBzZXR1cE1QRUc0b3JXRUJNTWV0YURhdGEoc3A8TWV0YURhdGE+ICptZXRhKTsKKyAgICBzdGF0dXNfdCBzZXR1cEFNUlJlY29yZGluZygpOworICAgIHN0YXR1c190IHNldHVwQUFDUmVjb3JkaW5nKCk7CisgICAgc3RhdHVzX3Qgc2V0dXBSYXdBdWRpb1JlY29yZGluZygpOworICAgIHN0YXR1c190IHNldHVwUlRQUmVjb3JkaW5nKCk7CisgICAgc3RhdHVzX3Qgc2V0dXBNUEVHMlRTUmVjb3JkaW5nKCk7CiAgICAgc3A8TWVkaWFTb3VyY2U+IGNyZWF0ZUF1ZGlvU291cmNlKCk7CiAgICAgc3RhdHVzX3QgY2hlY2tWaWRlb0VuY29kZXJDYXBhYmlsaXRpZXMoCiAgICAgICAgICAgICBib29sICpzdXBwb3J0c0NhbWVyYVNvdXJjZU1ldGFEYXRhTW9kZSk7CkBAIC0xNDcsMTQgKzE0NCw4IEBACiAgICAgLy8gZGVwZW5kaW5nIG9uIHRoZSB2aWRlb3NvdXJjZSB0eXBlCiAgICAgc3RhdHVzX3Qgc2V0dXBNZWRpYVNvdXJjZShzcDxNZWRpYVNvdXJjZT4gKm1lZGlhU291cmNlKTsKICAgICBzdGF0dXNfdCBzZXR1cENhbWVyYVNvdXJjZShzcDxDYW1lcmFTb3VyY2U+ICpjYW1lcmFTb3VyY2UpOwotICAgIC8vIHNldHVwIHRoZSBzdXJmYWNlbWVkaWFzb3VyY2UgZm9yIHRoZSBlbmNvZGVyCi0gICAgc3RhdHVzX3Qgc2V0dXBTdXJmYWNlTWVkaWFTb3VyY2UoKTsKLQogICAgIHN0YXR1c190IHNldHVwQXVkaW9FbmNvZGVyKGNvbnN0IHNwPE1lZGlhV3JpdGVyPiYgd3JpdGVyKTsKLSAgICBzdGF0dXNfdCBzZXR1cFZpZGVvRW5jb2RlcigKLSAgICAgICAgICAgIHNwPE1lZGlhU291cmNlPiBjYW1lcmFTb3VyY2UsCi0gICAgICAgICAgICBpbnQzMl90IHZpZGVvQml0UmF0ZSwKLSAgICAgICAgICAgIHNwPE1lZGlhU291cmNlPiAqc291cmNlKTsKKyAgICBzdGF0dXNfdCBzZXR1cFZpZGVvRW5jb2RlcihzcDxNZWRpYVNvdXJjZT4gY2FtZXJhU291cmNlLCBzcDxNZWRpYVNvdXJjZT4gKnNvdXJjZSk7CiAKICAgICAvLyBFbmNvZGluZyBwYXJhbWV0ZXIgaGFuZGxpbmcgdXRpbGl0aWVzCiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1ldGVyKGNvbnN0IFN0cmluZzggJmtleSwgY29uc3QgU3RyaW5nOCAmdmFsdWUpOwpAQCAtMTg3LDYgKzE3OCw3IEBACiAgICAgdm9pZCBjbGlwQXVkaW9TYW1wbGVSYXRlKCk7CiAgICAgdm9pZCBjbGlwTnVtYmVyT2ZBdWRpb0NoYW5uZWxzKCk7CiAgICAgdm9pZCBzZXREZWZhdWx0UHJvZmlsZUlmTmVjZXNzYXJ5KCk7CisgICAgdm9pZCBzZXREZWZhdWx0VmlkZW9FbmNvZGVySWZOZWNlc3NhcnkoKTsKIAogCiAgICAgU3RhZ2VmcmlnaHRSZWNvcmRlcihjb25zdCBTdGFnZWZyaWdodFJlY29yZGVyICYpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1Rlc3RQbGF5ZXJTdHViLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9UZXN0UGxheWVyU3R1Yi5jcHAKaW5kZXggNWQ5NzI4YS4uNTc5NTc3MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1Rlc3RQbGF5ZXJTdHViLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVGVzdFBsYXllclN0dWIuY3BwCkBAIC0xMTMsNyArMTEzLDkgQEAKIC8vIENyZWF0ZSB0aGUgdGVzdCBwbGF5ZXIuCiAvLyBDYWxsIHNldERhdGFTb3VyY2Ugb24gdGhlIHRlc3QgcGxheWVyIHdpdGggdGhlIHVybCBpbiBwYXJhbS4KIHN0YXR1c190IFRlc3RQbGF5ZXJTdHViOjpzZXREYXRhU291cmNlKAotICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKICAgICBpZiAoIWlzVGVzdFVybCh1cmwpIHx8IE5VTEwgIT0gbUhhbmRsZSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQpAQCAtMTYyLDcgKzE2NCw3IEBACiAgICAgfQogCiAgICAgbVBsYXllciA9ICgqbU5ld1BsYXllcikoKTsKLSAgICByZXR1cm4gbVBsYXllci0+c2V0RGF0YVNvdXJjZShtQ29udGVudFVybCwgaGVhZGVycyk7CisgICAgcmV0dXJuIG1QbGF5ZXItPnNldERhdGFTb3VyY2UoaHR0cFNlcnZpY2UsIG1Db250ZW50VXJsLCBoZWFkZXJzKTsKIH0KIAogLy8gSW50ZXJuYWwgY2xlYW51cC4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9UZXN0UGxheWVyU3R1Yi5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1Rlc3RQbGF5ZXJTdHViLmgKaW5kZXggYTM4MDJlYi4uNTViZjJjOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1Rlc3RQbGF5ZXJTdHViLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1Rlc3RQbGF5ZXJTdHViLmgKQEAgLTY2LDcgKzY2LDkgQEAKIAogICAgIC8vIEBwYXJhbSB1cmwgU2hvdWxkIGJlIGEgdGVzdCB1cmwuIFNlZSBjbGFzcyBjb21tZW50LgogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZSgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOworICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVybCwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKIAogICAgIC8vIFRlc3QgcGxheWVyIGZvciBhIGZpbGUgZGVzY3JpcHRvciBzb3VyY2UgaXMgbm90IHN1cHBvcnRlZC4KICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERhdGFTb3VyY2UoaW50LCBpbnQ2NF90LCBpbnQ2NF90KSAgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1ZpZGVvRnJhbWVTY2hlZHVsZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1ZpZGVvRnJhbWVTY2hlZHVsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNWY1ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVmlkZW9GcmFtZVNjaGVkdWxlci5jcHAKQEAgLTAsMCArMSw0ODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlZpZGVvRnJhbWVTY2hlZHVsZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19WSURFTworI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPGd1aS9JU3VyZmFjZUNvbXBvc2VyLmg+CisjaW5jbHVkZSA8dWkvRGlzcGxheVN0YXRJbmZvLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisKKyNpbmNsdWRlICJWaWRlb0ZyYW1lU2NoZWR1bGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGNvbnN0IG5zZWNzX3Qga05hbm9zSW4xcyA9IDEwMDAwMDAwMDA7CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitzdGF0aWMgaW50IGNvbXBhcmUoY29uc3QgVCAqbGhzLCBjb25zdCBUICpyaHMpIHsKKyAgICBpZiAoKmxocyA8ICpyaHMpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0gZWxzZSBpZiAoKmxocyA+ICpyaHMpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3N0YXRpYyBjb25zdCBzaXplX3Qga01pblNhbXBsZXNUb1N0YXJ0UHJpbWUgPSAzOworc3RhdGljIGNvbnN0IHNpemVfdCBrTWluU2FtcGxlc1RvU3RvcFByaW1lID0gVmlkZW9GcmFtZVNjaGVkdWxlcjo6a0hpc3RvcnlTaXplOworc3RhdGljIGNvbnN0IHNpemVfdCBrTWluU2FtcGxlc1RvRXN0aW1hdGVQZXJpb2QgPSAzOworc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4U2FtcGxlc1RvRXN0aW1hdGVQZXJpb2QgPSBWaWRlb0ZyYW1lU2NoZWR1bGVyOjprSGlzdG9yeVNpemU7CisKK3N0YXRpYyBjb25zdCBzaXplX3Qga1ByZWNpc2lvbiA9IDEyOworc3RhdGljIGNvbnN0IHNpemVfdCBrRXJyb3JUaHJlc2hvbGQgPSAoMSA8PCAoa1ByZWNpc2lvbiAqIDIpKSAvIDEwOworc3RhdGljIGNvbnN0IGludDY0X3Qga011bHRpcGxlc1RocmVzaG9sZERpdiA9IDQ7ICAgICAgICAgICAgLy8gMjUlCitzdGF0aWMgY29uc3QgaW50NjRfdCBrUmVGaXRUaHJlc2hvbGREaXYgPSAxMDA7ICAgICAgICAgICAgICAvLyAxJQorc3RhdGljIGNvbnN0IG5zZWNzX3Qga01heEFsbG93ZWRGcmFtZVNraXAgPSBrTmFub3NJbjFzOyAgICAgLy8gMSBzZWMKK3N0YXRpYyBjb25zdCBuc2Vjc190IGtNaW5QZXJpb2QgPSBrTmFub3NJbjFzIC8gMTIwOyAgICAgICAgIC8vIDEyMEh6CitzdGF0aWMgY29uc3QgbnNlY3NfdCBrUmVmaXRSZWZyZXNoUGVyaW9kID0gMTAgKiBrTmFub3NJbjFzOyAvLyAxMCBzZWMKKworVmlkZW9GcmFtZVNjaGVkdWxlcjo6UExMOjpQTEwoKQorICAgIDogbVBlcmlvZCgtMSksCisgICAgICBtUGhhc2UoMCksCisgICAgICBtUHJpbWVkKGZhbHNlKSwKKyAgICAgIG1TYW1wbGVzVXNlZEZvclByaW1pbmcoMCksCisgICAgICBtTGFzdFRpbWUoLTEpLAorICAgICAgbU51bVNhbXBsZXMoMCkgeworfQorCit2b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXI6OlBMTDo6cmVzZXQoZmxvYXQgZnBzKSB7CisgICAgLy90ZXN0KCk7CisKKyAgICBtU2FtcGxlc1VzZWRGb3JQcmltaW5nID0gMDsKKyAgICBtTGFzdFRpbWUgPSAtMTsKKworICAgIC8vIHNldCB1cCBvciByZXNldCB2aWRlbyBQTEwKKyAgICBpZiAoZnBzIDw9IDAuZikgeworICAgICAgICBtUGVyaW9kID0gLTE7CisgICAgICAgIG1QcmltZWQgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigicmVzZXQgYXQgJS4xZiBmcHMiLCBmcHMpOworICAgICAgICBtUGVyaW9kID0gKG5zZWNzX3QpKDFlOSAvIGZwcyArIDAuNSk7CisgICAgICAgIG1QcmltZWQgPSB0cnVlOworICAgIH0KKworICAgIHJlc3RhcnQoKTsKK30KKworLy8gcmVzZXQgUExMIGJ1dCBrZWVwIHByZXZpb3VzIHBlcmlvZCBlc3RpbWF0ZQordm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpQTEw6OnJlc3RhcnQoKSB7CisgICAgbU51bVNhbXBsZXMgPSAwOworICAgIG1QaGFzZSA9IC0xOworfQorCisjaWYgMAorCit2b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXI6OlBMTDo6dGVzdCgpIHsKKyAgICBuc2Vjc190IHBlcmlvZCA9IGtOYW5vc0luMXMgLyA2MDsKKyAgICBtVGltZXNbMF0gPSAwOworICAgIG1UaW1lc1sxXSA9IHBlcmlvZDsKKyAgICBtVGltZXNbMl0gPSBwZXJpb2QgKiAzOworICAgIG1UaW1lc1szXSA9IHBlcmlvZCAqIDQ7CisgICAgbVRpbWVzWzRdID0gcGVyaW9kICogNzsKKyAgICBtVGltZXNbNV0gPSBwZXJpb2QgKiA4OworICAgIG1UaW1lc1s2XSA9IHBlcmlvZCAqIDEwOworICAgIG1UaW1lc1s3XSA9IHBlcmlvZCAqIDEyOworICAgIG1OdW1TYW1wbGVzID0gODsKKyAgICBpbnQ2NF90IGEsIGIsIGVycjsKKyAgICBmaXQoMCwgcGVyaW9kICogMTIgLyA3LCA4LCAmYSwgJmIsICZlcnIpOworICAgIC8vIGEgPSAwLjgoNSkrCisgICAgLy8gYiA9IC0wLjE0MDk3KDIpKworICAgIC8vIGVyciA9IDAuMjc1MDU3OCg3MDMpKworICAgIEFMT0dEKCJhPSVsbGQgKCUuNmYpLCBiPSVsbGQgKCUuNmYpLCBlcnI9JWxsZCAoJS42ZikiLAorICAgICAgICAgICAgKGxvbmcgbG9uZylhLCAoYSAvIChmbG9hdCkoMSA8PCBrUHJlY2lzaW9uKSksCisgICAgICAgICAgICAobG9uZyBsb25nKWIsIChiIC8gKGZsb2F0KSgxIDw8IGtQcmVjaXNpb24pKSwKKyAgICAgICAgICAgIChsb25nIGxvbmcpZXJyLCAoZXJyIC8gKGZsb2F0KSgxIDw8IChrUHJlY2lzaW9uICogMikpKSk7Cit9CisKKyNlbmRpZgorCitib29sIFZpZGVvRnJhbWVTY2hlZHVsZXI6OlBMTDo6Zml0KAorICAgICAgICBuc2Vjc190IHBoYXNlLCBuc2Vjc190IHBlcmlvZCwgc2l6ZV90IG51bVNhbXBsZXNUb1VzZSwKKyAgICAgICAgaW50NjRfdCAqYSwgaW50NjRfdCAqYiwgaW50NjRfdCAqZXJyKSB7CisgICAgaWYgKG51bVNhbXBsZXNUb1VzZSA+IG1OdW1TYW1wbGVzKSB7CisgICAgICAgIG51bVNhbXBsZXNUb1VzZSA9IG1OdW1TYW1wbGVzOworICAgIH0KKworICAgIGludDY0X3Qgc3VtWCA9IDA7CisgICAgaW50NjRfdCBzdW1YWCA9IDA7CisgICAgaW50NjRfdCBzdW1YWSA9IDA7CisgICAgaW50NjRfdCBzdW1ZWSA9IDA7CisgICAgaW50NjRfdCBzdW1ZID0gMDsKKworICAgIGludDY0X3QgeCA9IDA7IC8vIHggdXN1YWxseSBpcyBpbiBbMC4ubnVtU2FtcGxlc1RvVXNlKQorICAgIG5zZWNzX3QgbGFzdFRpbWU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzVG9Vc2U7IGkrKykgeworICAgICAgICBzaXplX3QgaXggPSAobU51bVNhbXBsZXMgLSBudW1TYW1wbGVzVG9Vc2UgKyBpKSAlIGtIaXN0b3J5U2l6ZTsKKyAgICAgICAgbnNlY3NfdCB0aW1lID0gbVRpbWVzW2l4XTsKKyAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICB4ICs9IGRpdlJvdW5kKHRpbWUgLSBsYXN0VGltZSwgcGVyaW9kKTsKKyAgICAgICAgfQorICAgICAgICAvLyB5IGlzIHVzdWFsbHkgaW4gWy1udW1TYW1wbGVzVG9Vc2UuLm51bVNhbXBsZXNUb1VzZStrUmVmaXRSZWZyZXNoUGVyaW9kL2tNaW5QZXJpb2QpIDw8IGtQcmVjaXNpb24KKyAgICAgICAgLy8gICBpZGVhbGx5IGluIFswLi5udW1TYW1wbGVzVG9Vc2UpLCBidXQgc2hpZnRlZCBieSAtbnVtU2FtcGxlc1RvVXNlIGR1cmluZworICAgICAgICAvLyAgIHByaW1pbmcsIGFuZCBwb3NzaWJseSBzaGlmdGVkIGJ5IHVwIHRvIGtSZWZpdFJlZnJlc2hQZXJpb2Qva01pblBlcmlvZAorICAgICAgICAvLyAgIHdoaWxlIHdlIGFyZSBub3QgcmVmaXR0aW5nLgorICAgICAgICBpbnQ2NF90IHkgPSBkaXZSb3VuZCh0aW1lIC0gcGhhc2UsIHBlcmlvZCA+PiBrUHJlY2lzaW9uKTsKKyAgICAgICAgc3VtWCArPSB4OworICAgICAgICBzdW1ZICs9IHk7CisgICAgICAgIHN1bVhYICs9IHggKiB4OworICAgICAgICBzdW1YWSArPSB4ICogeTsKKyAgICAgICAgc3VtWVkgKz0geSAqIHk7CisgICAgICAgIGxhc3RUaW1lID0gdGltZTsKKyAgICB9CisKKyAgICBpbnQ2NF90IGRpdiAgID0gbnVtU2FtcGxlc1RvVXNlICogc3VtWFggLSBzdW1YICogc3VtWDsKKyAgICBpZiAoZGl2ID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGludDY0X3QgYV9ub20gPSBudW1TYW1wbGVzVG9Vc2UgKiBzdW1YWSAtIHN1bVggKiBzdW1ZOworICAgIGludDY0X3QgYl9ub20gPSBzdW1YWCAqIHN1bVkgICAgICAgICAgICAtIHN1bVggKiBzdW1YWTsKKyAgICAqYSA9IGRpdlJvdW5kKGFfbm9tLCBkaXYpOworICAgICpiID0gZGl2Um91bmQoYl9ub20sIGRpdik7CisgICAgLy8gZG9uJ3QgdXNlIGEgYW5kIGIgZGlyZWN0bHkgYXMgdGhlIHJvdW5kaW5nIGVycm9yIGlzIHNpZ25pZmljYW50CisgICAgKmVyciA9IHN1bVlZIC0gZGl2Um91bmQoYV9ub20gKiBzdW1YWSArIGJfbm9tICogc3VtWSwgZGl2KTsKKyAgICBBTE9HVigiZml0dGluZ1slenVdIGE9JWxsZCAoJS42ZiksIGI9JWxsZCAoJS42ZiksIGVycj0lbGxkICglLjZmKSIsCisgICAgICAgICAgICBudW1TYW1wbGVzVG9Vc2UsCisgICAgICAgICAgICAobG9uZyBsb25nKSphLCAgICgqYSAvIChmbG9hdCkoMSA8PCBrUHJlY2lzaW9uKSksCisgICAgICAgICAgICAobG9uZyBsb25nKSpiLCAgICgqYiAvIChmbG9hdCkoMSA8PCBrUHJlY2lzaW9uKSksCisgICAgICAgICAgICAobG9uZyBsb25nKSplcnIsICgqZXJyIC8gKGZsb2F0KSgxIDw8IChrUHJlY2lzaW9uICogMikpKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjo6UExMOjpwcmltZShzaXplX3QgbnVtU2FtcGxlc1RvVXNlKSB7CisgICAgaWYgKG51bVNhbXBsZXNUb1VzZSA+IG1OdW1TYW1wbGVzKSB7CisgICAgICAgIG51bVNhbXBsZXNUb1VzZSA9IG1OdW1TYW1wbGVzOworICAgIH0KKyAgICBDSEVDSyhudW1TYW1wbGVzVG9Vc2UgPj0gMyk7ICAvLyBtdXN0IGhhdmUgYXQgbGVhc3QgMyBzYW1wbGVzCisKKyAgICAvLyBlc3RpbWF0ZSB2aWRlbyBmcmFtZXJhdGUgZnJvbSBkZWx0YXMgYmV0d2VlbiB0aW1lc3RhbXBzLCBhbmQKKyAgICAvLyAybmQgb3JkZXIgZGVsdGFzCisgICAgVmVjdG9yPG5zZWNzX3Q+IGRlbHRhczsKKyAgICBuc2Vjc190IGxhc3RUaW1lLCBmaXJzdFRpbWU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzVG9Vc2U7ICsraSkgeworICAgICAgICBzaXplX3QgaW5kZXggPSAobU51bVNhbXBsZXMgLSBudW1TYW1wbGVzVG9Vc2UgKyBpKSAlIGtIaXN0b3J5U2l6ZTsKKyAgICAgICAgbnNlY3NfdCB0aW1lID0gbVRpbWVzW2luZGV4XTsKKyAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICBpZiAodGltZSAtIGxhc3RUaW1lID4ga01pblBlcmlvZCkgeworICAgICAgICAgICAgICAgIC8vQUxPR1YoImRlbHRhOiAlbGxkIiwgKGxvbmcgbG9uZykodGltZSAtIGxhc3RUaW1lKSk7CisgICAgICAgICAgICAgICAgZGVsdGFzLnB1c2godGltZSAtIGxhc3RUaW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpcnN0VGltZSA9IHRpbWU7CisgICAgICAgIH0KKyAgICAgICAgbGFzdFRpbWUgPSB0aW1lOworICAgIH0KKyAgICBkZWx0YXMuc29ydChjb21wYXJlPG5zZWNzX3Q+KTsKKyAgICBzaXplX3QgbnVtRGVsdGFzID0gZGVsdGFzLnNpemUoKTsKKyAgICBpZiAobnVtRGVsdGFzID4gMSkgeworICAgICAgICBuc2Vjc190IGRlbHRhTWluTGltaXQgPSBtYXgoZGVsdGFzWzBdIC8ga011bHRpcGxlc1RocmVzaG9sZERpdiwga01pblBlcmlvZCk7CisgICAgICAgIG5zZWNzX3QgZGVsdGFNYXhMaW1pdCA9IGRlbHRhc1tudW1EZWx0YXMgLyAyXSAqIGtNdWx0aXBsZXNUaHJlc2hvbGREaXY7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSBudW1EZWx0YXMgLyAyICsgMTsgaSA8IG51bURlbHRhczsgKytpKSB7CisgICAgICAgICAgICBpZiAoZGVsdGFzW2ldID4gZGVsdGFNYXhMaW1pdCkgeworICAgICAgICAgICAgICAgIGRlbHRhcy5yZXNpemUoaSk7CisgICAgICAgICAgICAgICAgbnVtRGVsdGFzID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IG51bURlbHRhczsgKytpKSB7CisgICAgICAgICAgICBuc2Vjc190IGRlbHRhMm5kID0gZGVsdGFzW2ldIC0gZGVsdGFzW2kgLSAxXTsKKyAgICAgICAgICAgIGlmIChkZWx0YTJuZCA+PSBkZWx0YU1pbkxpbWl0KSB7CisgICAgICAgICAgICAgICAgLy9BTE9HVigiZGVsdGEyOiAlbGxkIiwgKGxvbmcgbG9uZykoZGVsdGEybmQpKTsKKyAgICAgICAgICAgICAgICBkZWx0YXMucHVzaChkZWx0YTJuZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB1c2UgdGhlIG9uZSB0aGF0IHlpZWxkcyB0aGUgYmVzdCBtYXRjaAorICAgIGludDY0X3QgYmVzdFNjb3JlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGVsdGFzLnNpemUoKTsgKytpKSB7CisgICAgICAgIG5zZWNzX3QgZGVsdGEgPSBkZWx0YXNbaV07CisgICAgICAgIGludDY0X3Qgc2NvcmUgPSAwOworI2lmIDEKKyAgICAgICAgLy8gc2ltcGxlc3Qgc2NvcmU6IG51bWJlciBvZiBkZWx0YXMgdGhhdCBhcmUgbmVhciBtdWx0aXBsZXMKKyAgICAgICAgc2l6ZV90IG1hdGNoZXMgPSAwOworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGRlbHRhcy5zaXplKCk7ICsraikgeworICAgICAgICAgICAgbnNlY3NfdCBlcnIgPSBwZXJpb2RpY0Vycm9yKGRlbHRhc1tqXSwgZGVsdGEpOworICAgICAgICAgICAgaWYgKGVyciA8IGRlbHRhIC8ga011bHRpcGxlc1RocmVzaG9sZERpdikgeworICAgICAgICAgICAgICAgICsrbWF0Y2hlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzY29yZSA9IG1hdGNoZXM7CisjaWYgMAorICAgICAgICAvLyBjb3VsZCBiZSB3ZWlnaGVkIGJ5IHRoZSAoMSAtIG5vcm1hbGl6ZWQgZXJyb3IpCisgICAgICAgIGlmIChudW1TYW1wbGVzVG9Vc2UgPj0ga01pblNhbXBsZXNUb0VzdGltYXRlUGVyaW9kKSB7CisgICAgICAgICAgICBpbnQ2NF90IGEsIGIsIGVycjsKKyAgICAgICAgICAgIGZpdChmaXJzdFRpbWUsIGRlbHRhLCBudW1TYW1wbGVzVG9Vc2UsICZhLCAmYiwgJmVycik7CisgICAgICAgICAgICBlcnIgPSAoMSA8PCAoMiAqIGtQcmVjaXNpb24pKSAtIGVycjsKKyAgICAgICAgICAgIHNjb3JlICo9IG1heCgwLCBlcnIpOworICAgICAgICB9CisjZW5kaWYKKyNlbHNlCisgICAgICAgIC8vIG9yIHVzZSB0aGUgZXJyb3IgYXMgYSBuZWdhdGl2ZSBzY29yZQorICAgICAgICBpZiAobnVtU2FtcGxlc1RvVXNlID49IGtNaW5TYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCkgeworICAgICAgICAgICAgaW50NjRfdCBhLCBiLCBlcnI7CisgICAgICAgICAgICBmaXQoZmlyc3RUaW1lLCBkZWx0YSwgbnVtU2FtcGxlc1RvVXNlLCAmYSwgJmIsICZlcnIpOworICAgICAgICAgICAgc2NvcmUgPSAtZGVsdGEgKiBlcnI7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBpZiAoaSA9PSAwIHx8IHNjb3JlID4gYmVzdFNjb3JlKSB7CisgICAgICAgICAgICBiZXN0U2NvcmUgPSBzY29yZTsKKyAgICAgICAgICAgIG1QZXJpb2QgPSBkZWx0YTsKKyAgICAgICAgICAgIG1QaGFzZSA9IGZpcnN0VGltZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVigicHJpbWluZ1slenVdIHBoYXNlOiVsbGQgcGVyaW9kOiVsbGQiLCBudW1TYW1wbGVzVG9Vc2UsIG1QaGFzZSwgbVBlcmlvZCk7Cit9CisKK25zZWNzX3QgVmlkZW9GcmFtZVNjaGVkdWxlcjo6UExMOjphZGRTYW1wbGUobnNlY3NfdCB0aW1lKSB7CisgICAgaWYgKG1MYXN0VGltZSA+PSAwCisgICAgICAgICAgICAvLyBpZiB0aW1lIGdvZXMgYmFja3dhcmQsIG9yIHdlIHNraXBwZWQgcmVuZGVyaW5nCisgICAgICAgICAgICAmJiAodGltZSA+IG1MYXN0VGltZSArIGtNYXhBbGxvd2VkRnJhbWVTa2lwIHx8IHRpbWUgPCBtTGFzdFRpbWUpKSB7CisgICAgICAgIHJlc3RhcnQoKTsKKyAgICB9CisKKyAgICBtTGFzdFRpbWUgPSB0aW1lOworICAgIG1UaW1lc1ttTnVtU2FtcGxlcyAlIGtIaXN0b3J5U2l6ZV0gPSB0aW1lOworICAgICsrbU51bVNhbXBsZXM7CisKKyAgICBib29sIGRvRml0ID0gdGltZSA+IG1SZWZpdEF0OworICAgIGlmICgobVBlcmlvZCA8PSAwIHx8ICFtUHJpbWVkKSAmJiBtTnVtU2FtcGxlcyA+PSBrTWluU2FtcGxlc1RvU3RhcnRQcmltZSkgeworICAgICAgICBwcmltZShrTWluU2FtcGxlc1RvU3RvcFByaW1lKTsKKyAgICAgICAgKyttU2FtcGxlc1VzZWRGb3JQcmltaW5nOworICAgICAgICBkb0ZpdCA9IHRydWU7CisgICAgfQorICAgIGlmIChtUGVyaW9kID4gMCAmJiBtTnVtU2FtcGxlcyA+PSBrTWluU2FtcGxlc1RvRXN0aW1hdGVQZXJpb2QpIHsKKyAgICAgICAgaWYgKG1QaGFzZSA8IDApIHsKKyAgICAgICAgICAgIC8vIGluaXRpYWxpemUgcGhhc2UgdG8gdGhlIGN1cnJlbnQgcmVuZGVyIHRpbWUKKyAgICAgICAgICAgIG1QaGFzZSA9IHRpbWU7CisgICAgICAgICAgICBkb0ZpdCA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoIWRvRml0KSB7CisgICAgICAgICAgICBpbnQ2NF90IGVyciA9IHBlcmlvZGljRXJyb3IodGltZSAtIG1QaGFzZSwgbVBlcmlvZCk7CisgICAgICAgICAgICBkb0ZpdCA9IGVyciA+IG1QZXJpb2QgLyBrUmVGaXRUaHJlc2hvbGREaXY7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZG9GaXQpIHsKKyAgICAgICAgICAgIGludDY0X3QgYSwgYiwgZXJyOworICAgICAgICAgICAgaWYgKCFmaXQobVBoYXNlLCBtUGVyaW9kLCBrTWF4U2FtcGxlc1RvRXN0aW1hdGVQZXJpb2QsICZhLCAmYiwgJmVycikpIHsKKyAgICAgICAgICAgICAgICAvLyBzYW1wbGVzIGFyZSBub3Qgc3VpdGFibGUgZm9yIGZpdHRpbmcuICB0aGlzIG1lYW5zIHRoZXkgYXJlCisgICAgICAgICAgICAgICAgLy8gYWxzbyBub3Qgc3VpdGFibGUgZm9yIHByaW1pbmcuCisgICAgICAgICAgICAgICAgQUxPR1YoImNvdWxkIG5vdCBmaXQgLSBrZWVwaW5nIG9sZCBwZXJpb2Q6JWxsZCIsIChsb25nIGxvbmcpbVBlcmlvZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1QZXJpb2Q7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1SZWZpdEF0ID0gdGltZSArIGtSZWZpdFJlZnJlc2hQZXJpb2Q7CisKKyAgICAgICAgICAgIG1QaGFzZSArPSAobVBlcmlvZCAqIGIpID4+IGtQcmVjaXNpb247CisgICAgICAgICAgICBtUGVyaW9kID0gKG1QZXJpb2QgKiBhKSA+PiBrUHJlY2lzaW9uOworICAgICAgICAgICAgQUxPR1YoIm5ldyBwaGFzZTolbGxkIHBlcmlvZDolbGxkIiwgKGxvbmcgbG9uZyltUGhhc2UsIChsb25nIGxvbmcpbVBlcmlvZCk7CisKKyAgICAgICAgICAgIGlmIChlcnIgPCBrRXJyb3JUaHJlc2hvbGQpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1QcmltZWQgJiYgbVNhbXBsZXNVc2VkRm9yUHJpbWluZyA+PSBrTWluU2FtcGxlc1RvU3RvcFByaW1lKSB7CisgICAgICAgICAgICAgICAgICAgIG1QcmltZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVByaW1lZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIG1TYW1wbGVzVXNlZEZvclByaW1pbmcgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBtUGVyaW9kOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lIFNjaGVkdWxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3N0YXRpYyBjb25zdCBuc2Vjc190IGtEZWZhdWx0VnN5bmNQZXJpb2QgPSBrTmFub3NJbjFzIC8gNjA7ICAvLyA2MEh6CitzdGF0aWMgY29uc3QgbnNlY3NfdCBrVnN5bmNSZWZyZXNoUGVyaW9kID0ga05hbm9zSW4xczsgICAgICAgLy8gMSBzZWMKKworVmlkZW9GcmFtZVNjaGVkdWxlcjo6VmlkZW9GcmFtZVNjaGVkdWxlcigpCisgICAgOiBtVnN5bmNUaW1lKDApLAorICAgICAgbVZzeW5jUGVyaW9kKDApLAorICAgICAgbVZzeW5jUmVmcmVzaEF0KDApLAorICAgICAgbUxhc3RWc3luY1RpbWUoLTEpLAorICAgICAgbVRpbWVDb3JyZWN0aW9uKDApIHsKK30KKwordm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjp1cGRhdGVWc3luYygpIHsKKyAgICBtVnN5bmNSZWZyZXNoQXQgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQykgKyBrVnN5bmNSZWZyZXNoUGVyaW9kOworICAgIG1Wc3luY1BlcmlvZCA9IDA7CisgICAgbVZzeW5jVGltZSA9IDA7CisKKyAgICAvLyBUT0RPOiBzY2hlZHVsZSBmcmFtZXMgZm9yIHRoZSBkZXN0aW5hdGlvbiBzdXJmYWNlCisgICAgLy8gRm9yIG5vdywgc3VyZmFjZSBmbGluZ2VyIG9ubHkgc2NoZWR1bGVzIGZyYW1lcyBvbiB0aGUgcHJpbWFyeSBkaXNwbGF5CisgICAgaWYgKG1Db21wb3NlciA9PSBOVUxMKSB7CisgICAgICAgIFN0cmluZzE2IG5hbWUoIlN1cmZhY2VGbGluZ2VyIik7CisgICAgICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKKyAgICAgICAgbUNvbXBvc2VyID0gaW50ZXJmYWNlX2Nhc3Q8SVN1cmZhY2VDb21wb3Nlcj4oc20tPmNoZWNrU2VydmljZShuYW1lKSk7CisgICAgfQorICAgIGlmIChtQ29tcG9zZXIgIT0gTlVMTCkgeworICAgICAgICBEaXNwbGF5U3RhdEluZm8gc3RhdHM7CisgICAgICAgIHN0YXR1c190IHJlcyA9IG1Db21wb3Nlci0+Z2V0RGlzcGxheVN0YXRzKE5VTEwgLyogZGlzcGxheSAqLywgJnN0YXRzKTsKKyAgICAgICAgaWYgKHJlcyA9PSBPSykgeworICAgICAgICAgICAgQUxPR1YoInZzeW5jIHRpbWU6JWxsZCBwZXJpb2Q6JWxsZCIsCisgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpc3RhdHMudnN5bmNUaW1lLCAobG9uZyBsb25nKXN0YXRzLnZzeW5jUGVyaW9kKTsKKyAgICAgICAgICAgIG1Wc3luY1RpbWUgPSBzdGF0cy52c3luY1RpbWU7CisgICAgICAgICAgICBtVnN5bmNQZXJpb2QgPSBzdGF0cy52c3luY1BlcmlvZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCJnZXREaXNwbGF5U3RhdHMgcmV0dXJuZWQgJWQiLCByZXMpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1coImNvdWxkIG5vdCBnZXQgc3VyZmFjZSBtQ29tcG9zZXIgc2VydmljZSIpOworICAgIH0KK30KKwordm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjppbml0KGZsb2F0IHZpZGVvRnBzKSB7CisgICAgdXBkYXRlVnN5bmMoKTsKKworICAgIG1MYXN0VnN5bmNUaW1lID0gLTE7CisgICAgbVRpbWVDb3JyZWN0aW9uID0gMDsKKworICAgIG1QbGwucmVzZXQodmlkZW9GcHMpOworfQorCit2b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXI6OnJlc3RhcnQoKSB7CisgICAgbUxhc3RWc3luY1RpbWUgPSAtMTsKKyAgICBtVGltZUNvcnJlY3Rpb24gPSAwOworCisgICAgbVBsbC5yZXN0YXJ0KCk7Cit9CisKK25zZWNzX3QgVmlkZW9GcmFtZVNjaGVkdWxlcjo6Z2V0VnN5bmNQZXJpb2QoKSB7CisgICAgaWYgKG1Wc3luY1BlcmlvZCA+IDApIHsKKyAgICAgICAgcmV0dXJuIG1Wc3luY1BlcmlvZDsKKyAgICB9CisgICAgcmV0dXJuIGtEZWZhdWx0VnN5bmNQZXJpb2Q7Cit9CisKK25zZWNzX3QgVmlkZW9GcmFtZVNjaGVkdWxlcjo6c2NoZWR1bGUobnNlY3NfdCByZW5kZXJUaW1lKSB7CisgICAgbnNlY3NfdCBvcmlnUmVuZGVyVGltZSA9IHJlbmRlclRpbWU7CisKKyAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKKyAgICBpZiAobm93ID49IG1Wc3luY1JlZnJlc2hBdCkgeworICAgICAgICB1cGRhdGVWc3luYygpOworICAgIH0KKworICAgIC8vIHdpdGhvdXQgVlNZTkMgaW5mbywgdGhlcmUgaXMgbm90aGluZyB0byBkbworICAgIGlmIChtVnN5bmNQZXJpb2QgPT0gMCkgeworICAgICAgICBBTE9HVigibm8gdnN5bmM6IHJlbmRlcj0lbGxkIiwgKGxvbmcgbG9uZylyZW5kZXJUaW1lKTsKKyAgICAgICAgcmV0dXJuIHJlbmRlclRpbWU7CisgICAgfQorCisgICAgLy8gZW5zdXJlIHZzeW5jIHRpbWUgaXMgd2VsbCBiZWZvcmUgKGNvcnJlY3RlZCkgcmVuZGVyIHRpbWUKKyAgICBpZiAobVZzeW5jVGltZSA+IHJlbmRlclRpbWUgLSA0ICogbVZzeW5jUGVyaW9kKSB7CisgICAgICAgIG1Wc3luY1RpbWUgLT0KKyAgICAgICAgICAgICgobVZzeW5jVGltZSAtIHJlbmRlclRpbWUpIC8gbVZzeW5jUGVyaW9kICsgNSkgKiBtVnN5bmNQZXJpb2Q7CisgICAgfQorCisgICAgLy8gVmlkZW8gcHJlc2VudGF0aW9uIHRha2VzIHBsYWNlIGF0IHRoZSBWU1lOQyBfYWZ0ZXJfIHJlbmRlclRpbWUuICBBZGp1c3QgcmVuZGVyVGltZQorICAgIC8vIHNvIHRoaXMgZWZmZWN0aXZlbHkgYmVjb21lcyBhIHJvdW5kaW5nIG9wZXJhdGlvbiAodG8gdGhlIF9jbG9zZXN0XyBWU1lOQy4pCisgICAgcmVuZGVyVGltZSAtPSBtVnN5bmNQZXJpb2QgLyAyOworCisgICAgY29uc3QgbnNlY3NfdCB2aWRlb1BlcmlvZCA9IG1QbGwuYWRkU2FtcGxlKG9yaWdSZW5kZXJUaW1lKTsKKyAgICBpZiAodmlkZW9QZXJpb2QgPiAwKSB7CisgICAgICAgIC8vIFNtb290aCBvdXQgcmVuZGVyaW5nCisgICAgICAgIHNpemVfdCBOID0gMTI7CisgICAgICAgIG5zZWNzX3QgZml2ZVNpeHRoRGV2ID0KKyAgICAgICAgICAgIGFicygoKHZpZGVvUGVyaW9kICogNSArIG1Wc3luY1BlcmlvZCkgJSAobVZzeW5jUGVyaW9kICogNikpIC0gbVZzeW5jUGVyaW9kKQorICAgICAgICAgICAgICAgICAgICAvIChtVnN5bmNQZXJpb2QgLyAxMDApOworICAgICAgICAvLyB1c2UgMjAgc2FtcGxlcyBpZiB3ZSBhcmUgZG9pbmcgNTo2IHJhdGlvICstIDElIChlLmcuIHBsYXlpbmcgNTBIeiBvbiA2MEh6KQorICAgICAgICBpZiAoZml2ZVNpeHRoRGV2IDwgMTIpIHsgIC8qIDEyJSAvIDYgPSAyJSAqLworICAgICAgICAgICAgTiA9IDIwOworICAgICAgICB9CisKKyAgICAgICAgbnNlY3NfdCBvZmZzZXQgPSAwOworICAgICAgICBuc2Vjc190IGVkZ2VSZW1haW5kZXIgPSAwOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8PSBOOyBpKyspIHsKKyAgICAgICAgICAgIG9mZnNldCArPQorICAgICAgICAgICAgICAgIChyZW5kZXJUaW1lICsgbVRpbWVDb3JyZWN0aW9uICsgdmlkZW9QZXJpb2QgKiBpIC0gbVZzeW5jVGltZSkgJSBtVnN5bmNQZXJpb2Q7CisgICAgICAgICAgICBlZGdlUmVtYWluZGVyICs9ICh2aWRlb1BlcmlvZCAqIGkpICUgbVZzeW5jUGVyaW9kOworICAgICAgICB9CisgICAgICAgIG1UaW1lQ29ycmVjdGlvbiArPSBtVnN5bmNQZXJpb2QgLyAyIC0gb2Zmc2V0IC8gTjsKKyAgICAgICAgcmVuZGVyVGltZSArPSBtVGltZUNvcnJlY3Rpb247CisgICAgICAgIG5zZWNzX3QgY29ycmVjdGlvbkxpbWl0ID0gbVZzeW5jUGVyaW9kICogMyAvIDU7CisgICAgICAgIGVkZ2VSZW1haW5kZXIgPSBhYnMoZWRnZVJlbWFpbmRlciAvIE4gLSBtVnN5bmNQZXJpb2QgLyAyKTsKKyAgICAgICAgaWYgKGVkZ2VSZW1haW5kZXIgPD0gbVZzeW5jUGVyaW9kIC8gMykgeworICAgICAgICAgICAgY29ycmVjdGlvbkxpbWl0IC89IDI7CisgICAgICAgIH0KKworICAgICAgICAvLyBlc3RpbWF0ZSBob3cgbWFueSBWU1lOQ3MgYSBmcmFtZSB3aWxsIHNwZW5kIG9uIHRoZSBkaXNwbGF5CisgICAgICAgIG5zZWNzX3QgbmV4dFZzeW5jVGltZSA9CisgICAgICAgICAgICByZW5kZXJUaW1lICsgbVZzeW5jUGVyaW9kIC0gKChyZW5kZXJUaW1lIC0gbVZzeW5jVGltZSkgJSBtVnN5bmNQZXJpb2QpOworICAgICAgICBpZiAobUxhc3RWc3luY1RpbWUgPj0gMCkgeworICAgICAgICAgICAgc2l6ZV90IG1pblZzeW5jc1BlckZyYW1lID0gdmlkZW9QZXJpb2QgLyBtVnN5bmNQZXJpb2Q7CisgICAgICAgICAgICBzaXplX3QgdnN5bmNzRm9yTGFzdEZyYW1lID0gZGl2Um91bmQobmV4dFZzeW5jVGltZSAtIG1MYXN0VnN5bmNUaW1lLCBtVnN5bmNQZXJpb2QpOworICAgICAgICAgICAgYm9vbCB2c3luY3NQZXJGcmFtZUFyZU5lYXJseUNvbnN0YW50ID0KKyAgICAgICAgICAgICAgICBwZXJpb2RpY0Vycm9yKHZpZGVvUGVyaW9kLCBtVnN5bmNQZXJpb2QpIC8gKG1Wc3luY1BlcmlvZCAvIDIwKSA9PSAwOworCisgICAgICAgICAgICBpZiAobVRpbWVDb3JyZWN0aW9uID4gY29ycmVjdGlvbkxpbWl0ICYmCisgICAgICAgICAgICAgICAgICAgICh2c3luY3NQZXJGcmFtZUFyZU5lYXJseUNvbnN0YW50IHx8IHZzeW5jc0Zvckxhc3RGcmFtZSA+IG1pblZzeW5jc1BlckZyYW1lKSkgeworICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBhIFZTWU5DCisgICAgICAgICAgICAgICAgbVRpbWVDb3JyZWN0aW9uIC09IG1Wc3luY1BlcmlvZCAvIDI7CisgICAgICAgICAgICAgICAgcmVuZGVyVGltZSAtPSBtVnN5bmNQZXJpb2QgLyAyOworICAgICAgICAgICAgICAgIG5leHRWc3luY1RpbWUgLT0gbVZzeW5jUGVyaW9kOworICAgICAgICAgICAgICAgIC0tdnN5bmNzRm9yTGFzdEZyYW1lOworICAgICAgICAgICAgfSBlbHNlIGlmIChtVGltZUNvcnJlY3Rpb24gPCAtY29ycmVjdGlvbkxpbWl0ICYmCisgICAgICAgICAgICAgICAgICAgICh2c3luY3NQZXJGcmFtZUFyZU5lYXJseUNvbnN0YW50IHx8IHZzeW5jc0Zvckxhc3RGcmFtZSA9PSBtaW5Wc3luY3NQZXJGcmFtZSkpIHsKKyAgICAgICAgICAgICAgICAvLyBhZGQgYSBWU1lOQworICAgICAgICAgICAgICAgIG1UaW1lQ29ycmVjdGlvbiArPSBtVnN5bmNQZXJpb2QgLyAyOworICAgICAgICAgICAgICAgIHJlbmRlclRpbWUgKz0gbVZzeW5jUGVyaW9kIC8gMjsKKyAgICAgICAgICAgICAgICBuZXh0VnN5bmNUaW1lICs9IG1Wc3luY1BlcmlvZDsKKyAgICAgICAgICAgICAgICArK3ZzeW5jc0Zvckxhc3RGcmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFUUkFDRV9JTlQoIkZSQU1FX1ZTWU5DUyIsIHZzeW5jc0Zvckxhc3RGcmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgbUxhc3RWc3luY1RpbWUgPSBuZXh0VnN5bmNUaW1lOworICAgIH0KKworICAgIC8vIGFsaWduIHJlbmRlcnRpbWUgdG8gdGhlIGNlbnRlciBiZXR3ZWVuIFZTWU5DIGVkZ2VzCisgICAgcmVuZGVyVGltZSAtPSAocmVuZGVyVGltZSAtIG1Wc3luY1RpbWUpICUgbVZzeW5jUGVyaW9kOworICAgIHJlbmRlclRpbWUgKz0gbVZzeW5jUGVyaW9kIC8gMjsKKyAgICBBTE9HVigiYWRqdXN0aW5nIHJlbmRlcjogJWxsZCA9PiAlbGxkIiwgKGxvbmcgbG9uZylvcmlnUmVuZGVyVGltZSwgKGxvbmcgbG9uZylyZW5kZXJUaW1lKTsKKyAgICBBVFJBQ0VfSU5UKCJGUkFNRV9GTElQX0lOKG1zKSIsIChyZW5kZXJUaW1lIC0gbm93KSAvIDEwMDAwMDApOworICAgIHJldHVybiByZW5kZXJUaW1lOworfQorCit2b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXI6OnJlbGVhc2UoKSB7CisgICAgbUNvbXBvc2VyLmNsZWFyKCk7Cit9CisKK1ZpZGVvRnJhbWVTY2hlZHVsZXI6On5WaWRlb0ZyYW1lU2NoZWR1bGVyKCkgeworICAgIHJlbGVhc2UoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVmlkZW9GcmFtZVNjaGVkdWxlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1ZpZGVvRnJhbWVTY2hlZHVsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGIyN2I0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1ZpZGVvRnJhbWVTY2hlZHVsZXIuaApAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFZJREVPX0ZSQU1FX1NDSEVEVUxFUl9IXworI2RlZmluZSBWSURFT19GUkFNRV9TQ0hFRFVMRVJfSF8KKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgSVN1cmZhY2VDb21wb3NlcjsKKworc3RydWN0IFZpZGVvRnJhbWVTY2hlZHVsZXIgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgVmlkZW9GcmFtZVNjaGVkdWxlcigpOworCisgICAgLy8gKHJlKWluaXRpYWxpemUgc2NoZWR1bGVyCisgICAgdm9pZCBpbml0KGZsb2F0IHZpZGVvRnBzID0gLTEpOworICAgIC8vIHVzZSBpbiBjYXNlIG9mIHZpZGVvIHJlbmRlci10aW1lIGRpc2NvbnRpbnVpdHksIGUuZy4gc2VlaworICAgIHZvaWQgcmVzdGFydCgpOworICAgIC8vIGdldCBhZGp1c3RlZCBuYW5vdGltZSBmb3IgYSB2aWRlbyBmcmFtZSByZW5kZXIgYXQgcmVuZGVyVGltZQorICAgIG5zZWNzX3Qgc2NoZWR1bGUobnNlY3NfdCByZW5kZXJUaW1lKTsKKworICAgIC8vIHJldHVybnMgdGhlIHZzeW5jIHBlcmlvZCBmb3IgdGhlIG1haW4gZGlzcGxheQorICAgIG5zZWNzX3QgZ2V0VnN5bmNQZXJpb2QoKTsKKworICAgIHZvaWQgcmVsZWFzZSgpOworCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrSGlzdG9yeVNpemUgPSA4OworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+VmlkZW9GcmFtZVNjaGVkdWxlcigpOworCitwcml2YXRlOgorICAgIHN0cnVjdCBQTEwgeworICAgICAgICBQTEwoKTsKKworICAgICAgICAvLyByZXNldCBQTEwgdG8gbmV3IFBMTAorICAgICAgICB2b2lkIHJlc2V0KGZsb2F0IGZwcyA9IC0xKTsKKyAgICAgICAgLy8ga2VlcCBjdXJyZW50IGVzdGltYXRlLCBidXQgcmVzdGFydCBwaGFzZQorICAgICAgICB2b2lkIHJlc3RhcnQoKTsKKyAgICAgICAgLy8gcmV0dXJucyBwZXJpb2QKKyAgICAgICAgbnNlY3NfdCBhZGRTYW1wbGUobnNlY3NfdCB0aW1lKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIG5zZWNzX3QgbVBlcmlvZDsKKyAgICAgICAgbnNlY3NfdCBtUGhhc2U7CisKKyAgICAgICAgYm9vbCAgICBtUHJpbWVkOyAgICAgICAgLy8gaGF2ZSBhbiBlc3RpbWF0ZSBmb3IgdGhlIHBlcmlvZAorICAgICAgICBzaXplX3QgIG1TYW1wbGVzVXNlZEZvclByaW1pbmc7CisKKyAgICAgICAgbnNlY3NfdCBtTGFzdFRpbWU7ICAgICAgLy8gbGFzdCBpbnB1dCB0aW1lCisgICAgICAgIG5zZWNzX3QgbVJlZml0QXQ7ICAgICAgIC8vIG5leHQgaW5wdXQgdGltZSB0byBmaXQgYXQKKworICAgICAgICBzaXplX3QgIG1OdW1TYW1wbGVzOyAgICAvLyBjYW4gZ28gcGFzdCBrSGlzdG9yeVNpemUKKyAgICAgICAgbnNlY3NfdCBtVGltZXNba0hpc3RvcnlTaXplXTsKKworICAgICAgICB2b2lkIHRlc3QoKTsKKyAgICAgICAgLy8gcmV0dXJucyB3aGV0aGVyIGZpdCB3YXMgc3VjY2Vzc2Z1bAorICAgICAgICBib29sIGZpdChuc2Vjc190IHBoYXNlLCBuc2Vjc190IHBlcmlvZCwgc2l6ZV90IG51bVNhbXBsZXMsCisgICAgICAgICAgICAgICAgaW50NjRfdCAqYSwgaW50NjRfdCAqYiwgaW50NjRfdCAqZXJyKTsKKyAgICAgICAgdm9pZCBwcmltZShzaXplX3QgbnVtU2FtcGxlcyk7CisgICAgfTsKKworICAgIHZvaWQgdXBkYXRlVnN5bmMoKTsKKworICAgIG5zZWNzX3QgbVZzeW5jVGltZTsgICAgICAgIC8vIHZzeW5jIHRpbWluZyBmcm9tIGRpc3BsYXkKKyAgICBuc2Vjc190IG1Wc3luY1BlcmlvZDsKKyAgICBuc2Vjc190IG1Wc3luY1JlZnJlc2hBdDsgICAvLyBuZXh0IHRpbWUgdG8gcmVmcmVzaCB0aW1pbmcgaW5mbworCisgICAgbnNlY3NfdCBtTGFzdFZzeW5jVGltZTsgICAgLy8gZXN0aW1hdGVkIHZzeW5jIHRpbWUgZm9yIGxhc3QgZnJhbWUKKyAgICBuc2Vjc190IG1UaW1lQ29ycmVjdGlvbjsgICAvLyBydW5uaW5nIGFkanVzdG1lbnQKKworICAgIFBMTCBtUGxsOyAgICAgICAgICAgICAgICAgIC8vIFBMTCBmb3IgdmlkZW8gZnJhbWUgcmF0ZSBiYXNlZCBvbiByZW5kZXIgdGltZQorCisgICAgc3A8SVN1cmZhY2VDb21wb3Nlcj4gbUNvbXBvc2VyOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVmlkZW9GcmFtZVNjaGVkdWxlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFZJREVPX0ZSQU1FX1NDSEVEVUxFUl9IXworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvQW5kcm9pZC5tayBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BbmRyb2lkLm1rCmluZGV4IGY5NDZjMWMuLjY3NmMwYTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BbmRyb2lkLm1rCkBAIC02LDE4ICs2LDIwIEBACiAgICAgICAgIEhUVFBMaXZlU291cmNlLmNwcCAgICAgICAgICAgICAgXAogICAgICAgICBOdVBsYXllci5jcHAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgTnVQbGF5ZXJEZWNvZGVyLmNwcCAgICAgICAgICAgICBcCisgICAgICAgIE51UGxheWVyRGVjb2RlclBhc3NUaHJvdWdoLmNwcCAgXAogICAgICAgICBOdVBsYXllckRyaXZlci5jcHAgICAgICAgICAgICAgIFwKICAgICAgICAgTnVQbGF5ZXJSZW5kZXJlci5jcHAgICAgICAgICAgICBcCiAgICAgICAgIE51UGxheWVyU3RyZWFtTGlzdGVuZXIuY3BwICAgICAgXAogICAgICAgICBSVFNQU291cmNlLmNwcCAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgU3RyZWFtaW5nU291cmNlLmNwcCAgICAgICAgICAgICBcCi0gICAgICAgIG1wNC9NUDRTb3VyY2UuY3BwICAgICAgICAgICAgICAgXAogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKIAkkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZSAgICAgICAgICAgIFwKIAkkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlICAgICAgICAgICAgIFwKIAkkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzICAgICAgICAgICAgIFwKIAkkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwICAgICAgICAgICAgICAgIFwKKwkkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQgICAgICAgICAgIFwKKwkkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UgICAgICAgICAgICAgIFwKIAkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKIExPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X251cGxheWVyCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5jcHAKaW5kZXggYjA0ZTdhNi4uNTQwNjgyNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmNwcApAQCAtMTQsMTAgKzE0LDE0IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkdlbmVyaWNTb3VyY2UiCisKICNpbmNsdWRlICJHZW5lcmljU291cmNlLmgiCiAKICNpbmNsdWRlICJBbm90aGVyUGFja2V0U291cmNlLmgiCiAKKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgpAQCAtMjgsNTcgKzMyLDE2MSBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisjaW5jbHVkZSAiLi4vLi4vbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9EUk1FeHRyYWN0b3IuaCIKKyNpbmNsdWRlICIuLi8uLi9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oIgorI2luY2x1ZGUgIi4uLy4uL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvV1ZNRXh0cmFjdG9yLmgiCisjaW5jbHVkZSAiLi4vLi4vbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9IVFRQQmFzZS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpHZW5lcmljU291cmNlKAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgY29uc3QgY2hhciAqdXJsLAotICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKICAgICAgICAgYm9vbCB1aWRWYWxpZCwKICAgICAgICAgdWlkX3QgdWlkKQogICAgIDogU291cmNlKG5vdGlmeSksCisgICAgICBtRmV0Y2hTdWJ0aXRsZURhdGFHZW5lcmF0aW9uKDApLAorICAgICAgbUZldGNoVGltZWRUZXh0RGF0YUdlbmVyYXRpb24oMCksCiAgICAgICBtRHVyYXRpb25VcygwbGwpLAotICAgICAgbUF1ZGlvSXNWb3JiaXMoZmFsc2UpIHsKKyAgICAgIG1BdWRpb0lzVm9yYmlzKGZhbHNlKSwKKyAgICAgIG1Jc1dpZGV2aW5lKGZhbHNlKSwKKyAgICAgIG1VSURWYWxpZCh1aWRWYWxpZCksCisgICAgICBtVUlEKHVpZCksCisgICAgICBtRHJtTWFuYWdlckNsaWVudChOVUxMKSwKKyAgICAgIG1NZXRhRGF0YVNpemUoLTFsbCksCisgICAgICBtQml0cmF0ZSgtMWxsKSwKKyAgICAgIG1Qb2xsQnVmZmVyaW5nR2VuZXJhdGlvbigwKSwKKyAgICAgIG1QZW5kaW5nUmVhZEJ1ZmZlclR5cGVzKDApIHsKKyAgICByZXNldERhdGFTb3VyY2UoKTsKICAgICBEYXRhU291cmNlOjpSZWdpc3RlckRlZmF1bHRTbmlmZmVycygpOwotCi0gICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9Ci0gICAgICAgIERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkodXJsLCBoZWFkZXJzKTsKLSAgICBDSEVDSyhkYXRhU291cmNlICE9IE5VTEwpOwotCi0gICAgaW5pdEZyb21EYXRhU291cmNlKGRhdGFTb3VyY2UpOwogfQogCi1OdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6R2VuZXJpY1NvdXJjZSgKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgIGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKQotICAgIDogU291cmNlKG5vdGlmeSksCi0gICAgICBtRHVyYXRpb25VcygwbGwpLAotICAgICAgbUF1ZGlvSXNWb3JiaXMoZmFsc2UpIHsKLSAgICBEYXRhU291cmNlOjpSZWdpc3RlckRlZmF1bHRTbmlmZmVycygpOwotCi0gICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9IG5ldyBGaWxlU291cmNlKGR1cChmZCksIG9mZnNldCwgbGVuZ3RoKTsKLQotICAgIGluaXRGcm9tRGF0YVNvdXJjZShkYXRhU291cmNlKTsKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnJlc2V0RGF0YVNvdXJjZSgpIHsKKyAgICBtQXVkaW9UaW1lVXMgPSAwOworICAgIG1WaWRlb1RpbWVVcyA9IDA7CisgICAgbUhUVFBTZXJ2aWNlLmNsZWFyKCk7CisgICAgbUh0dHBTb3VyY2UuY2xlYXIoKTsKKyAgICBtVXJpLmNsZWFyKCk7CisgICAgbVVyaUhlYWRlcnMuY2xlYXIoKTsKKyAgICBtRmQgPSAtMTsKKyAgICBtT2Zmc2V0ID0gMDsKKyAgICBtTGVuZ3RoID0gMDsKKyAgICBzZXREcm1QbGF5YmFja1N0YXR1c0lmTmVlZGVkKFBsYXliYWNrOjpTVE9QLCAwKTsKKyAgICBtRGVjcnlwdEhhbmRsZSA9IE5VTEw7CisgICAgbURybU1hbmFnZXJDbGllbnQgPSBOVUxMOworICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgbVN0b3BSZWFkID0gdHJ1ZTsKIH0KIAotdm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6aW5pdEZyb21EYXRhU291cmNlKAotICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmZGF0YVNvdXJjZSkgewotICAgIHNwPE1lZGlhRXh0cmFjdG9yPiBleHRyYWN0b3IgPSBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlKGRhdGFTb3VyY2UpOworc3RhdHVzX3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnNldERhdGFTb3VyY2UoCisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKKyAgICByZXNldERhdGFTb3VyY2UoKTsKIAotICAgIENIRUNLKGV4dHJhY3RvciAhPSBOVUxMKTsKKyAgICBtSFRUUFNlcnZpY2UgPSBodHRwU2VydmljZTsKKyAgICBtVXJpID0gdXJsOwogCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBleHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7ICsraSkgeworICAgIGlmIChoZWFkZXJzKSB7CisgICAgICAgIG1VcmlIZWFkZXJzID0gKmhlYWRlcnM7CisgICAgfQorCisgICAgLy8gZGVsYXkgZGF0YSBzb3VyY2UgY3JlYXRpb24gdG8gcHJlcGFyZUFzeW5jKCkgdG8gYXZvaWQgYmxvY2tpbmcKKyAgICAvLyB0aGUgY2FsbGluZyB0aHJlYWQgaW4gc2V0RGF0YVNvdXJjZSBmb3IgYW55IHNpZ25pZmljYW50IHRpbWUuCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6c2V0RGF0YVNvdXJjZSgKKyAgICAgICAgaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpIHsKKyAgICByZXNldERhdGFTb3VyY2UoKTsKKworICAgIG1GZCA9IGR1cChmZCk7CisgICAgbU9mZnNldCA9IG9mZnNldDsKKyAgICBtTGVuZ3RoID0gbGVuZ3RoOworCisgICAgLy8gZGVsYXkgZGF0YSBzb3VyY2UgY3JlYXRpb24gdG8gcHJlcGFyZUFzeW5jKCkgdG8gYXZvaWQgYmxvY2tpbmcKKyAgICAvLyB0aGUgY2FsbGluZyB0aHJlYWQgaW4gc2V0RGF0YVNvdXJjZSBmb3IgYW55IHNpZ25pZmljYW50IHRpbWUuCisgICAgcmV0dXJuIE9LOworfQorCitzcDxNZXRhRGF0YT4gTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmdldEZpbGVGb3JtYXRNZXRhKCkgY29uc3QgeworICAgIHJldHVybiBtRmlsZU1ldGE7Cit9CisKK3N0YXR1c190IE51UGxheWVyOjpHZW5lcmljU291cmNlOjppbml0RnJvbURhdGFTb3VyY2UoKSB7CisgICAgc3A8TWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvcjsKKworICAgIENIRUNLKG1EYXRhU291cmNlICE9IE5VTEwpOworCisgICAgaWYgKG1Jc1dpZGV2aW5lKSB7CisgICAgICAgIFN0cmluZzggbWltZVR5cGU7CisgICAgICAgIGZsb2F0IGNvbmZpZGVuY2U7CisgICAgICAgIHNwPEFNZXNzYWdlPiBkdW1teTsKKyAgICAgICAgYm9vbCBzdWNjZXNzOworCisgICAgICAgIHN1Y2Nlc3MgPSBTbmlmZldWTShtRGF0YVNvdXJjZSwgJm1pbWVUeXBlLCAmY29uZmlkZW5jZSwgJmR1bW15KTsKKyAgICAgICAgaWYgKCFzdWNjZXNzCisgICAgICAgICAgICAgICAgfHwgc3RyY2FzZWNtcCgKKyAgICAgICAgICAgICAgICAgICAgbWltZVR5cGUuc3RyaW5nKCksIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9XVk0pKSB7CisgICAgICAgICAgICBBTE9HRSgidW5zdXBwb3J0ZWQgd2lkZXZpbmUgbWltZTogJXMiLCBtaW1lVHlwZS5zdHJpbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIG1XVk1FeHRyYWN0b3IgPSBuZXcgV1ZNRXh0cmFjdG9yKG1EYXRhU291cmNlKTsKKyAgICAgICAgbVdWTUV4dHJhY3Rvci0+c2V0QWRhcHRpdmVTdHJlYW1pbmdNb2RlKHRydWUpOworICAgICAgICBpZiAobVVJRFZhbGlkKSB7CisgICAgICAgICAgICBtV1ZNRXh0cmFjdG9yLT5zZXRVSUQobVVJRCk7CisgICAgICAgIH0KKyAgICAgICAgZXh0cmFjdG9yID0gbVdWTUV4dHJhY3RvcjsKKyAgICB9IGVsc2UgeworICAgICAgICBleHRyYWN0b3IgPSBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlKG1EYXRhU291cmNlLAorICAgICAgICAgICAgICAgIG1TbmlmZmVkTUlNRS5lbXB0eSgpID8gTlVMTDogbVNuaWZmZWRNSU1FLmNfc3RyKCkpOworICAgIH0KKworICAgIGlmIChleHRyYWN0b3IgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAoZXh0cmFjdG9yLT5nZXREcm1GbGFnKCkpIHsKKyAgICAgICAgY2hlY2tEcm1TdGF0dXMobURhdGFTb3VyY2UpOworICAgIH0KKworICAgIG1GaWxlTWV0YSA9IGV4dHJhY3Rvci0+Z2V0TWV0YURhdGEoKTsKKyAgICBpZiAobUZpbGVNZXRhICE9IE5VTEwpIHsKKyAgICAgICAgaW50NjRfdCBkdXJhdGlvbjsKKyAgICAgICAgaWYgKG1GaWxlTWV0YS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uKSkgeworICAgICAgICAgICAgbUR1cmF0aW9uVXMgPSBkdXJhdGlvbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludDMyX3QgdG90YWxCaXRyYXRlID0gMDsKKworICAgIHNpemVfdCBudW10cmFja3MgPSBleHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7CisgICAgaWYgKG51bXRyYWNrcyA9PSAwKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtdHJhY2tzOyArK2kpIHsKKyAgICAgICAgc3A8TWVkaWFTb3VyY2U+IHRyYWNrID0gZXh0cmFjdG9yLT5nZXRUcmFjayhpKTsKKyAgICAgICAgaWYgKHRyYWNrID09IE5VTEwpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKICAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBleHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoaSk7CiAKICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKICAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOwogCi0gICAgICAgIHNwPE1lZGlhU291cmNlPiB0cmFjazsKLQorICAgICAgICAvLyBEbyB0aGUgc3RyaW5nIGNvbXBhcmUgaW1tZWRpYXRlbHkgd2l0aCAibWltZSIsCisgICAgICAgIC8vIHdlIGNhbid0IGFzc3VtZSAibWltZSIgd291bGQgc3RheSB2YWxpZCBhZnRlciBhbm90aGVyCisgICAgICAgIC8vIGV4dHJhY3RvciBvcGVyYXRpb24sIHNvbWUgZXh0cmFjdG9ycyBtaWdodCBtb2RpZnkgbWV0YQorICAgICAgICAvLyBkdXJpbmcgZ2V0VHJhY2soKSBhbmQgbWFrZSBpdCBpbnZhbGlkLgogICAgICAgICBpZiAoIXN0cm5jYXNlY21wKG1pbWUsICJhdWRpby8iLCA2KSkgewogICAgICAgICAgICAgaWYgKG1BdWRpb1RyYWNrLm1Tb3VyY2UgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrLm1Tb3VyY2UgPSB0cmFjayA9IGV4dHJhY3Rvci0+Z2V0VHJhY2soaSk7CisgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2subUluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICBtQXVkaW9UcmFjay5tU291cmNlID0gdHJhY2s7CisgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2subVBhY2tldHMgPQorICAgICAgICAgICAgICAgICAgICBuZXcgQW5vdGhlclBhY2tldFNvdXJjZShtQXVkaW9UcmFjay5tU291cmNlLT5nZXRGb3JtYXQoKSk7CiAKICAgICAgICAgICAgICAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTKSkgewogICAgICAgICAgICAgICAgICAgICBtQXVkaW9Jc1ZvcmJpcyA9IHRydWU7CkBAIC04OCwzNyArMTk2LDE3OCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCAidmlkZW8vIiwgNikpIHsKICAgICAgICAgICAgIGlmIChtVmlkZW9UcmFjay5tU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtVmlkZW9UcmFjay5tU291cmNlID0gdHJhY2sgPSBleHRyYWN0b3ItPmdldFRyYWNrKGkpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgICAgICAgICAgbVZpZGVvVHJhY2subUluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICBtVmlkZW9UcmFjay5tU291cmNlID0gdHJhY2s7CisgICAgICAgICAgICAgICAgbVZpZGVvVHJhY2subVBhY2tldHMgPQorICAgICAgICAgICAgICAgICAgICBuZXcgQW5vdGhlclBhY2tldFNvdXJjZShtVmlkZW9UcmFjay5tU291cmNlLT5nZXRGb3JtYXQoKSk7CiAKLSAgICAgICAgaWYgKHRyYWNrICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKLSAgICAgICAgICAgIGlmIChtZXRhLT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb25VcykpIHsKLSAgICAgICAgICAgICAgICBpZiAoZHVyYXRpb25VcyA+IG1EdXJhdGlvblVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EdXJhdGlvblVzID0gZHVyYXRpb25VczsKKyAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgc291cmNlIHJlcXVpcmVzIHNlY3VyZSBidWZmZXJzCisgICAgICAgICAgICAgICAgaW50MzJfdCBzZWN1cmU7CisgICAgICAgICAgICAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5UmVxdWlyZXNTZWN1cmVCdWZmZXJzLCAmc2VjdXJlKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgc2VjdXJlKSB7CisgICAgICAgICAgICAgICAgICAgIG1Jc1dpZGV2aW5lID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1VSURWYWxpZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdG9yLT5zZXRVSUQobVVJRCk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICBtU291cmNlcy5wdXNoKHRyYWNrKTsKKyAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOworICAgICAgICBpZiAobWV0YS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uVXMpKSB7CisgICAgICAgICAgICBpZiAoZHVyYXRpb25VcyA+IG1EdXJhdGlvblVzKSB7CisgICAgICAgICAgICAgICAgbUR1cmF0aW9uVXMgPSBkdXJhdGlvblVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBiaXRyYXRlOworICAgICAgICBpZiAodG90YWxCaXRyYXRlID49IDAgJiYgbWV0YS0+ZmluZEludDMyKGtLZXlCaXRSYXRlLCAmYml0cmF0ZSkpIHsKKyAgICAgICAgICAgIHRvdGFsQml0cmF0ZSArPSBiaXRyYXRlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdG90YWxCaXRyYXRlID0gLTE7CisgICAgICAgIH0KICAgICB9CisKKyAgICBpZiAobVNvdXJjZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgQUxPR0UoImIvMjM3MDU2OTUiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgbUJpdHJhdGUgPSB0b3RhbEJpdHJhdGU7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmNoZWNrRHJtU3RhdHVzKGNvbnN0IHNwPERhdGFTb3VyY2U+JiBkYXRhU291cmNlKSB7CisgICAgZGF0YVNvdXJjZS0+Z2V0RHJtSW5mbyhtRGVjcnlwdEhhbmRsZSwgJm1Ecm1NYW5hZ2VyQ2xpZW50KTsKKyAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTCkgeworICAgICAgICBDSEVDSyhtRHJtTWFuYWdlckNsaWVudCk7CisgICAgICAgIGlmIChSaWdodHNTdGF0dXM6OlJJR0hUU19WQUxJRCAhPSBtRGVjcnlwdEhhbmRsZS0+c3RhdHVzKSB7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gZHVwTm90aWZ5KCk7CisgICAgICAgICAgICBtc2ctPnNldEludDMyKCJ3aGF0Iiwga1doYXREcm1Ob0xpY2Vuc2UpOworICAgICAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ludDY0X3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmdldExhc3RSZWFkUG9zaXRpb24oKSB7CisgICAgaWYgKG1BdWRpb1RyYWNrLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gbUF1ZGlvVGltZVVzOworICAgIH0gZWxzZSBpZiAobVZpZGVvVHJhY2subVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiBtVmlkZW9UaW1lVXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCitzdGF0dXNfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6c2V0QnVmZmVycygKKyAgICAgICAgYm9vbCBhdWRpbywgVmVjdG9yPE1lZGlhQnVmZmVyICo+ICZidWZmZXJzKSB7CisgICAgaWYgKG1Jc1dpZGV2aW5lICYmICFhdWRpbyAmJiBtVmlkZW9UcmFjay5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIG1WaWRlb1RyYWNrLm1Tb3VyY2UtPnNldEJ1ZmZlcnMoYnVmZmVycyk7CisgICAgfQorICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIH0KIAogTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6On5HZW5lcmljU291cmNlKCkgeworICAgIGlmIChtTG9vcGVyICE9IE5VTEwpIHsKKyAgICAgICAgbUxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIoaWQoKSk7CisgICAgICAgIG1Mb29wZXItPnN0b3AoKTsKKyAgICB9CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnByZXBhcmVBc3luYygpIHsKKyAgICBpZiAobUxvb3BlciA9PSBOVUxMKSB7CisgICAgICAgIG1Mb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICAgICAgbUxvb3Blci0+c2V0TmFtZSgiZ2VuZXJpYyIpOworICAgICAgICBtTG9vcGVyLT5zdGFydCgpOworCisgICAgICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcih0aGlzKTsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UHJlcGFyZUFzeW5jLCBpZCgpKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6b25QcmVwYXJlQXN5bmMoKSB7CisgICAgLy8gZGVsYXllZCBkYXRhIHNvdXJjZSBjcmVhdGlvbgorICAgIGlmIChtRGF0YVNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIGlmICghbVVyaS5lbXB0eSgpKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmkgPSBtVXJpLmNfc3RyKCk7CisgICAgICAgICAgICBtSXNXaWRldmluZSA9ICFzdHJuY2FzZWNtcCh1cmksICJ3aWRldmluZTovLyIsIDExKTsKKworICAgICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCgiaHR0cDovLyIsIHVyaSwgNykKKyAgICAgICAgICAgICAgICAgICAgfHwgIXN0cm5jYXNlY21wKCJodHRwczovLyIsIHVyaSwgOCkKKyAgICAgICAgICAgICAgICAgICAgfHwgbUlzV2lkZXZpbmUpIHsKKyAgICAgICAgICAgICAgICBtSHR0cFNvdXJjZSA9IERhdGFTb3VyY2U6OkNyZWF0ZU1lZGlhSFRUUChtSFRUUFNlcnZpY2UpOworICAgICAgICAgICAgICAgIGlmIChtSHR0cFNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIGh0dHAgc291cmNlISIpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlQcmVwYXJlZEFuZENsZWFudXAoVU5LTk9XTl9FUlJPUik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1EYXRhU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSSgKKyAgICAgICAgICAgICAgICAgICBtSFRUUFNlcnZpY2UsIHVyaSwgJm1VcmlIZWFkZXJzLCAmbUNvbnRlbnRUeXBlLAorICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEhUVFBCYXNlICo+KG1IdHRwU291cmNlLmdldCgpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBzZXQgdG8gZmFsc2UgZmlyc3QsIGlmIHRoZSBleHRyYWN0b3IKKyAgICAgICAgICAgIC8vIGNvbWVzIGJhY2sgYXMgc2VjdXJlLCBzZXQgaXQgdG8gdHJ1ZSB0aGVuLgorICAgICAgICAgICAgbUlzV2lkZXZpbmUgPSBmYWxzZTsKKworICAgICAgICAgICAgbURhdGFTb3VyY2UgPSBuZXcgRmlsZVNvdXJjZShtRmQsIG1PZmZzZXQsIG1MZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1EYXRhU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIGRhdGEgc291cmNlISIpOworICAgICAgICAgICAgbm90aWZ5UHJlcGFyZWRBbmRDbGVhbnVwKFVOS05PV05fRVJST1IpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1EYXRhU291cmNlLT5mbGFncygpICYgRGF0YVNvdXJjZTo6a0lzQ2FjaGluZ0RhdGFTb3VyY2UpIHsKKyAgICAgICAgICAgIG1DYWNoZWRTb3VyY2UgPSBzdGF0aWNfY2FzdDxOdUNhY2hlZFNvdXJjZTIgKj4obURhdGFTb3VyY2UuZ2V0KCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Jc1dpZGV2aW5lIHx8IG1DYWNoZWRTb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgc2NoZWR1bGVQb2xsQnVmZmVyaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBjaGVjayBpbml0aWFsIGNhY2hpbmcgc3RhdHVzCisgICAgc3RhdHVzX3QgZXJyID0gcHJlZmlsbENhY2hlSWZOZWNlc3NhcnkoKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIGlmIChlcnIgPT0gLUVBR0FJTikgeworICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFByZXBhcmVBc3luYywgaWQoKSkpLT5wb3N0KDIwMDAwMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHByZWZpbGwgZGF0YSBjYWNoZSEiKTsKKyAgICAgICAgICAgIG5vdGlmeVByZXBhcmVkQW5kQ2xlYW51cChVTktOT1dOX0VSUk9SKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gaW5pdCBleHRyYXRvciBmcm9tIGRhdGEgc291cmNlCisgICAgZXJyID0gaW5pdEZyb21EYXRhU291cmNlKCk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdCBmcm9tIGRhdGEgc291cmNlISIpOworICAgICAgICBub3RpZnlQcmVwYXJlZEFuZENsZWFudXAoZXJyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIGlmIChtVmlkZW9UcmFjay5tU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtVmlkZW9UcmFjay5tU291cmNlLT5nZXRGb3JtYXQoKTsKLQotICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7Ci0gICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ3aWR0aCkpOwotICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJmhlaWdodCkpOwotCi0gICAgICAgIG5vdGlmeVZpZGVvU2l6ZUNoYW5nZWQod2lkdGgsIGhlaWdodCk7CisgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gZG9HZXRGb3JtYXRNZXRhKGZhbHNlIC8qIGF1ZGlvICovKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgZXJyID0gY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKG1ldGEsICZtc2cpOworICAgICAgICBpZihlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIG5vdGlmeVByZXBhcmVkQW5kQ2xlYW51cChlcnIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVZpZGVvU2l6ZUNoYW5nZWQobXNnKTsKICAgICB9CiAKICAgICBub3RpZnlGbGFnc0NoYW5nZWQoCi0gICAgICAgICAgICBGTEFHX0NBTl9QQVVTRQorICAgICAgICAgICAgKG1Jc1dpZGV2aW5lID8gRkxBR19TRUNVUkUgOiAwKQorICAgICAgICAgICAgfCBGTEFHX0NBTl9QQVVTRQogICAgICAgICAgICAgfCBGTEFHX0NBTl9TRUVLX0JBQ0tXQVJECiAgICAgICAgICAgICB8IEZMQUdfQ0FOX1NFRUtfRk9SV0FSRAogICAgICAgICAgICAgfCBGTEFHX0NBTl9TRUVLKTsKQEAgLTEyNiwzMyArMzc1LDQ3MiBAQAogICAgIG5vdGlmeVByZXBhcmVkKCk7CiB9CiAKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6Om5vdGlmeVByZXBhcmVkQW5kQ2xlYW51cChzdGF0dXNfdCBlcnIpIHsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIG1NZXRhRGF0YVNpemUgPSAtMWxsOworICAgICAgICBtQ29udGVudFR5cGUgPSAiIjsKKyAgICAgICAgbVNuaWZmZWRNSU1FID0gIiI7CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPSBtRGF0YVNvdXJjZTsKKyAgICAgICAgICAgIHNwPE51Q2FjaGVkU291cmNlMj4gY2FjaGVkU291cmNlID0gbUNhY2hlZFNvdXJjZTsKKyAgICAgICAgICAgIHNwPERhdGFTb3VyY2U+IGh0dHBTb3VyY2UgPSBtSHR0cFNvdXJjZTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobURpc2Nvbm5lY3RMb2NrKTsKKyAgICAgICAgICAgICAgICBtRGF0YVNvdXJjZS5jbGVhcigpOworICAgICAgICAgICAgICAgIG1EZWNyeXB0SGFuZGxlID0gTlVMTDsKKyAgICAgICAgICAgICAgICBtRHJtTWFuYWdlckNsaWVudCA9IE5VTEw7CisgICAgICAgICAgICAgICAgbUNhY2hlZFNvdXJjZS5jbGVhcigpOworICAgICAgICAgICAgICAgIG1IdHRwU291cmNlLmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjYW5jZWxQb2xsQnVmZmVyaW5nKCk7CisgICAgfQorICAgIG5vdGlmeVByZXBhcmVkKGVycik7Cit9CisKK3N0YXR1c190IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpwcmVmaWxsQ2FjaGVJZk5lY2Vzc2FyeSgpIHsKKyAgICBDSEVDSyhtRGF0YVNvdXJjZSAhPSBOVUxMKTsKKworICAgIGlmIChtQ2FjaGVkU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgLy8gbm8gcHJlZmlsbCBpZiB0aGUgZGF0YSBzb3VyY2UgaXMgbm90IGNhY2hlZAorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgLy8gV2UncmUgbm90IGRvaW5nIHRoaXMgZm9yIHN0cmVhbXMgdGhhdCBhcHBlYXIgdG8gYmUgYXVkaW8tb25seQorICAgIC8vIHN0cmVhbXMgdG8gZW5zdXJlIHRoYXQgZXZlbiBsb3cgYmFuZHdpZHRoIHN0cmVhbXMgc3RhcnQKKyAgICAvLyBwbGF5aW5nIGJhY2sgZmFpcmx5IGluc3RhbnRseS4KKyAgICBpZiAoIXN0cm5jYXNlY21wKG1Db250ZW50VHlwZS5zdHJpbmcoKSwgImF1ZGlvLyIsIDYpKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICAvLyBXZSdyZSBnb2luZyB0byBwcmVmaWxsIHRoZSBjYWNoZSBiZWZvcmUgdHJ5aW5nIHRvIGluc3RhbnRpYXRlCisgICAgLy8gdGhlIGV4dHJhY3RvciBiZWxvdywgYXMgdGhlIGxhdHRlciBpcyBhbiBvcGVyYXRpb24gdGhhdCBvdGhlcndpc2UKKyAgICAvLyBjb3VsZCBibG9jayBvbiB0aGUgZGF0YXNvdXJjZSBmb3IgYSBzaWduaWZpY2FudCBhbW91bnQgb2YgdGltZS4KKyAgICAvLyBEdXJpbmcgdGhhdCB0aW1lIHdlJ2QgYmUgdW5hYmxlIHRvIGFib3J0IHRoZSBwcmVwYXJhdGlvbiBwaGFzZQorICAgIC8vIHdpdGhvdXQgdGhpcyBwcmVmaWxsLgorCisgICAgLy8gSW5pdGlhbGx5IG1ha2Ugc3VyZSB3ZSBoYXZlIGF0IGxlYXN0IDE5MiBLQiBmb3IgdGhlIHNuaWZmCisgICAgLy8gdG8gY29tcGxldGUgd2l0aG91dCBibG9ja2luZy4KKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNaW5CeXRlc0ZvclNuaWZmaW5nID0gMTkyICogMTAyNDsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtEZWZhdWx0TWV0YVNpemUgPSAyMDAwMDA7CisKKyAgICBzdGF0dXNfdCBmaW5hbFN0YXR1czsKKworICAgIHNpemVfdCBjYWNoZWREYXRhUmVtYWluaW5nID0KKyAgICAgICAgICAgIG1DYWNoZWRTb3VyY2UtPmFwcHJveERhdGFSZW1haW5pbmcoJmZpbmFsU3RhdHVzKTsKKworICAgIGlmIChmaW5hbFN0YXR1cyAhPSBPSyB8fCAobU1ldGFEYXRhU2l6ZSA+PSAwCisgICAgICAgICAgICAmJiAob2ZmNjRfdCljYWNoZWREYXRhUmVtYWluaW5nID49IG1NZXRhRGF0YVNpemUpKSB7CisgICAgICAgIEFMT0dWKCJzdG9wIGNhY2hpbmcsIHN0YXR1cyAlZCwgIgorICAgICAgICAgICAgICAgICJtZXRhRGF0YVNpemUgJWxsZCwgY2FjaGVkRGF0YVJlbWFpbmluZyAlenUiLAorICAgICAgICAgICAgICAgIGZpbmFsU3RhdHVzLCBtTWV0YURhdGFTaXplLCBjYWNoZWREYXRhUmVtYWluaW5nKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIEFMT0dWKCJub3cgY2FjaGVkICV6dSBieXRlcyBvZiBkYXRhIiwgY2FjaGVkRGF0YVJlbWFpbmluZyk7CisKKyAgICBpZiAobU1ldGFEYXRhU2l6ZSA8IDAKKyAgICAgICAgICAgICYmIGNhY2hlZERhdGFSZW1haW5pbmcgPj0ga01pbkJ5dGVzRm9yU25pZmZpbmcpIHsKKyAgICAgICAgU3RyaW5nOCB0bXA7CisgICAgICAgIGZsb2F0IGNvbmZpZGVuY2U7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtZXRhOworICAgICAgICBpZiAoIW1DYWNoZWRTb3VyY2UtPnNuaWZmKCZ0bXAsICZjb25maWRlbmNlLCAmbWV0YSkpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgLy8gV2Ugc3VjY2Vzc2Z1bGx5IGlkZW50aWZpZWQgdGhlIGZpbGUncyBleHRyYWN0b3IgdG8KKyAgICAgICAgLy8gYmUsIHJlbWVtYmVyIHRoaXMgbWltZSB0eXBlIHNvIHdlIGRvbid0IGhhdmUgdG8KKyAgICAgICAgLy8gc25pZmYgaXQgYWdhaW4gd2hlbiB3ZSBjYWxsIE1lZGlhRXh0cmFjdG9yOjpDcmVhdGUoKQorICAgICAgICBtU25pZmZlZE1JTUUgPSB0bXAuc3RyaW5nKCk7CisKKyAgICAgICAgaWYgKG1ldGEgPT0gTlVMTAorICAgICAgICAgICAgICAgIHx8ICFtZXRhLT5maW5kSW50NjQoIm1ldGEtZGF0YS1zaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50NjRfdCo+KCZtTWV0YURhdGFTaXplKSkpIHsKKyAgICAgICAgICAgIG1NZXRhRGF0YVNpemUgPSBrRGVmYXVsdE1ldGFTaXplOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1NZXRhRGF0YVNpemUgPCAwbGwpIHsKKyAgICAgICAgICAgIEFMT0dFKCJpbnZhbGlkIG1ldGFEYXRhU2l6ZSA9ICVsbGQgYnl0ZXMiLCBtTWV0YURhdGFTaXplKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIC1FQUdBSU47Cit9CisKIHZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnN0YXJ0KCkgewogICAgIEFMT0dJKCJzdGFydCIpOwogCisgICAgbVN0b3BSZWFkID0gZmFsc2U7CiAgICAgaWYgKG1BdWRpb1RyYWNrLm1Tb3VyY2UgIT0gTlVMTCkgewogICAgICAgICBDSEVDS19FUShtQXVkaW9UcmFjay5tU291cmNlLT5zdGFydCgpLCAoc3RhdHVzX3QpT0spOwogCi0gICAgICAgIG1BdWRpb1RyYWNrLm1QYWNrZXRzID0KLSAgICAgICAgICAgIG5ldyBBbm90aGVyUGFja2V0U291cmNlKG1BdWRpb1RyYWNrLm1Tb3VyY2UtPmdldEZvcm1hdCgpKTsKLQotICAgICAgICByZWFkQnVmZmVyKHRydWUgLyogYXVkaW8gKi8pOworICAgICAgICBwb3N0UmVhZEJ1ZmZlcihNRURJQV9UUkFDS19UWVBFX0FVRElPKTsKICAgICB9CiAKICAgICBpZiAobVZpZGVvVHJhY2subVNvdXJjZSAhPSBOVUxMKSB7CiAgICAgICAgIENIRUNLX0VRKG1WaWRlb1RyYWNrLm1Tb3VyY2UtPnN0YXJ0KCksIChzdGF0dXNfdClPSyk7CiAKLSAgICAgICAgbVZpZGVvVHJhY2subVBhY2tldHMgPQotICAgICAgICAgICAgbmV3IEFub3RoZXJQYWNrZXRTb3VyY2UobVZpZGVvVHJhY2subVNvdXJjZS0+Z2V0Rm9ybWF0KCkpOwotCi0gICAgICAgIHJlYWRCdWZmZXIoZmFsc2UgLyogYXVkaW8gKi8pOworICAgICAgICBwb3N0UmVhZEJ1ZmZlcihNRURJQV9UUkFDS19UWVBFX1ZJREVPKTsKICAgICB9CisKKyAgICBzZXREcm1QbGF5YmFja1N0YXR1c0lmTmVlZGVkKFBsYXliYWNrOjpTVEFSVCwgZ2V0TGFzdFJlYWRQb3NpdGlvbigpIC8gMTAwMCk7CisgICAgbVN0YXJ0ZWQgPSB0cnVlOworfQorCit2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpzdG9wKCkgeworICAgIC8vIG5vdGhpbmcgdG8gZG8sIGp1c3QgYWNjb3VudCBmb3IgRFJNIHBsYXliYWNrIHN0YXR1cworICAgIHNldERybVBsYXliYWNrU3RhdHVzSWZOZWVkZWQoUGxheWJhY2s6OlNUT1AsIDApOworICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgaWYgKG1Jc1dpZGV2aW5lKSB7CisgICAgICAgIC8vIEZvciBhIHdpZGV2aW5lIHNvdXJjZSB3ZSBuZWVkIHRvIHByZXZlbnQgYW55IGZ1cnRoZXIgcmVhZHMuCisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wV2lkZXZpbmUsIGlkKCkpOworICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgICAgICh2b2lkKSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpwYXVzZSgpIHsKKyAgICAvLyBub3RoaW5nIHRvIGRvLCBqdXN0IGFjY291bnQgZm9yIERSTSBwbGF5YmFjayBzdGF0dXMKKyAgICBzZXREcm1QbGF5YmFja1N0YXR1c0lmTmVlZGVkKFBsYXliYWNrOjpQQVVTRSwgMCk7CisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKK30KKwordm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6cmVzdW1lKCkgeworICAgIC8vIG5vdGhpbmcgdG8gZG8sIGp1c3QgYWNjb3VudCBmb3IgRFJNIHBsYXliYWNrIHN0YXR1cworICAgIHNldERybVBsYXliYWNrU3RhdHVzSWZOZWVkZWQoUGxheWJhY2s6OlNUQVJULCBnZXRMYXN0UmVhZFBvc2l0aW9uKCkgLyAxMDAwKTsKKyAgICBtU3RhcnRlZCA9IHRydWU7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmRpc2Nvbm5lY3QoKSB7CisgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSwgaHR0cFNvdXJjZTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGlzY29ubmVjdExvY2spOworICAgICAgICBkYXRhU291cmNlID0gbURhdGFTb3VyY2U7CisgICAgICAgIGh0dHBTb3VyY2UgPSBtSHR0cFNvdXJjZTsKKyAgICB9CisKKyAgICBpZiAoZGF0YVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIC8vIGRpc2Nvbm5lY3QgZGF0YSBzb3VyY2UKKyAgICAgICAgaWYgKGRhdGFTb3VyY2UtPmZsYWdzKCkgJiBEYXRhU291cmNlOjprSXNDYWNoaW5nRGF0YVNvdXJjZSkgeworICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TnVDYWNoZWRTb3VyY2UyICo+KGRhdGFTb3VyY2UuZ2V0KCkpLT5kaXNjb25uZWN0KCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGh0dHBTb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBzdGF0aWNfY2FzdDxIVFRQQmFzZSAqPihodHRwU291cmNlLmdldCgpKS0+ZGlzY29ubmVjdCgpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6c2V0RHJtUGxheWJhY2tTdGF0dXNJZk5lZWRlZChpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pIHsKKyAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTCkgeworICAgICAgICBtRHJtTWFuYWdlckNsaWVudC0+c2V0UGxheWJhY2tTdGF0dXMobURlY3J5cHRIYW5kbGUsIHBsYXliYWNrU3RhdHVzLCBwb3NpdGlvbik7CisgICAgfQorICAgIG1TdWJ0aXRsZVRyYWNrLm1QYWNrZXRzID0gbmV3IEFub3RoZXJQYWNrZXRTb3VyY2UoTlVMTCk7CisgICAgbVRpbWVkVGV4dFRyYWNrLm1QYWNrZXRzID0gbmV3IEFub3RoZXJQYWNrZXRTb3VyY2UoTlVMTCk7CiB9CiAKIHN0YXR1c190IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpmZWVkTW9yZVRTRGF0YSgpIHsKICAgICByZXR1cm4gT0s7CiB9CiAKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnNjaGVkdWxlUG9sbEJ1ZmZlcmluZygpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UG9sbEJ1ZmZlcmluZywgaWQoKSk7CisgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1Qb2xsQnVmZmVyaW5nR2VuZXJhdGlvbik7CisgICAgbXNnLT5wb3N0KDEwMDAwMDBsbCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmNhbmNlbFBvbGxCdWZmZXJpbmcoKSB7CisgICAgKyttUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb247Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6Om5vdGlmeUJ1ZmZlcmluZ1VwZGF0ZShpbnQgcGVyY2VudGFnZSkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBkdXBOb3RpZnkoKTsKKyAgICBtc2ctPnNldEludDMyKCJ3aGF0Iiwga1doYXRCdWZmZXJpbmdVcGRhdGUpOworICAgIG1zZy0+c2V0SW50MzIoInBlcmNlbnRhZ2UiLCBwZXJjZW50YWdlKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6b25Qb2xsQnVmZmVyaW5nKCkgeworICAgIHN0YXR1c190IGZpbmFsU3RhdHVzID0gVU5LTk9XTl9FUlJPUjsKKyAgICBpbnQ2NF90IGNhY2hlZER1cmF0aW9uVXMgPSAwbGw7CisKKyAgICBpZiAobUNhY2hlZFNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIHNpemVfdCBjYWNoZWREYXRhUmVtYWluaW5nID0KKyAgICAgICAgICAgICAgICBtQ2FjaGVkU291cmNlLT5hcHByb3hEYXRhUmVtYWluaW5nKCZmaW5hbFN0YXR1cyk7CisKKyAgICAgICAgaWYgKGZpbmFsU3RhdHVzID09IE9LKSB7CisgICAgICAgICAgICBvZmY2NF90IHNpemU7CisgICAgICAgICAgICBpbnQ2NF90IGJpdHJhdGUgPSAwbGw7CisgICAgICAgICAgICBpZiAobUR1cmF0aW9uVXMgPiAwICYmIG1DYWNoZWRTb3VyY2UtPmdldFNpemUoJnNpemUpID09IE9LKSB7CisgICAgICAgICAgICAgICAgYml0cmF0ZSA9IHNpemUgKiA4MDAwMDAwbGwgLyBtRHVyYXRpb25VczsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUJpdHJhdGUgPiAwKSB7CisgICAgICAgICAgICAgICAgYml0cmF0ZSA9IG1CaXRyYXRlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGJpdHJhdGUgPiAwKSB7CisgICAgICAgICAgICAgICAgY2FjaGVkRHVyYXRpb25VcyA9IGNhY2hlZERhdGFSZW1haW5pbmcgKiA4MDAwMDAwbGwgLyBiaXRyYXRlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIGlmIChtV1ZNRXh0cmFjdG9yICE9IE5VTEwpIHsKKyAgICAgICAgY2FjaGVkRHVyYXRpb25VcworICAgICAgICAgICAgPSBtV1ZNRXh0cmFjdG9yLT5nZXRDYWNoZWREdXJhdGlvblVzKCZmaW5hbFN0YXR1cyk7CisgICAgfQorCisgICAgaWYgKGZpbmFsU3RhdHVzID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgbm90aWZ5QnVmZmVyaW5nVXBkYXRlKDEwMCk7CisgICAgICAgIGNhbmNlbFBvbGxCdWZmZXJpbmcoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAoY2FjaGVkRHVyYXRpb25VcyA+IDBsbCAmJiBtRHVyYXRpb25VcyA+IDBsbCkgeworICAgICAgICBpbnQgcGVyY2VudGFnZSA9IDEwMC4wICogY2FjaGVkRHVyYXRpb25VcyAvIG1EdXJhdGlvblVzOworICAgICAgICBpZiAocGVyY2VudGFnZSA+IDEwMCkgeworICAgICAgICAgICAgcGVyY2VudGFnZSA9IDEwMDsKKyAgICAgICAgfQorCisgICAgICAgIG5vdGlmeUJ1ZmZlcmluZ1VwZGF0ZShwZXJjZW50YWdlKTsKKyAgICB9CisKKyAgICBzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKTsKK30KKworCit2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgIGNhc2Uga1doYXRQcmVwYXJlQXN5bmM6CisgICAgICB7CisgICAgICAgICAgb25QcmVwYXJlQXN5bmMoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2Uga1doYXRGZXRjaFN1YnRpdGxlRGF0YToKKyAgICAgIHsKKyAgICAgICAgICBmZXRjaFRleHREYXRhKGtXaGF0U2VuZFN1YnRpdGxlRGF0YSwgTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRSwKKyAgICAgICAgICAgICAgICAgIG1GZXRjaFN1YnRpdGxlRGF0YUdlbmVyYXRpb24sIG1TdWJ0aXRsZVRyYWNrLm1QYWNrZXRzLCBtc2cpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIGtXaGF0RmV0Y2hUaW1lZFRleHREYXRhOgorICAgICAgeworICAgICAgICAgIGZldGNoVGV4dERhdGEoa1doYXRTZW5kVGltZWRUZXh0RGF0YSwgTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQsCisgICAgICAgICAgICAgICAgICBtRmV0Y2hUaW1lZFRleHREYXRhR2VuZXJhdGlvbiwgbVRpbWVkVGV4dFRyYWNrLm1QYWNrZXRzLCBtc2cpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIGtXaGF0U2VuZFN1YnRpdGxlRGF0YToKKyAgICAgIHsKKyAgICAgICAgICBzZW5kVGV4dERhdGEoa1doYXRTdWJ0aXRsZURhdGEsIE1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEUsCisgICAgICAgICAgICAgICAgICBtRmV0Y2hTdWJ0aXRsZURhdGFHZW5lcmF0aW9uLCBtU3VidGl0bGVUcmFjay5tUGFja2V0cywgbXNnKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBrV2hhdFNlbmRUaW1lZFRleHREYXRhOgorICAgICAgeworICAgICAgICAgIHNlbmRUZXh0RGF0YShrV2hhdFRpbWVkVGV4dERhdGEsIE1FRElBX1RSQUNLX1RZUEVfVElNRURURVhULAorICAgICAgICAgICAgICAgICAgbUZldGNoVGltZWRUZXh0RGF0YUdlbmVyYXRpb24sIG1UaW1lZFRleHRUcmFjay5tUGFja2V0cywgbXNnKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBrV2hhdENoYW5nZUFWU291cmNlOgorICAgICAgeworICAgICAgICAgIGludDMyX3QgdHJhY2tJbmRleDsKKyAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigidHJhY2tJbmRleCIsICZ0cmFja0luZGV4KSk7CisgICAgICAgICAgY29uc3Qgc3A8TWVkaWFTb3VyY2U+IHNvdXJjZSA9IG1Tb3VyY2VzLml0ZW1BdCh0cmFja0luZGV4KTsKKworICAgICAgICAgIFRyYWNrKiB0cmFjazsKKyAgICAgICAgICBjb25zdCBjaGFyICptaW1lOworICAgICAgICAgIG1lZGlhX3RyYWNrX3R5cGUgdHJhY2tUeXBlLCBjb3VudGVycGFydFR5cGU7CisgICAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBzb3VyY2UtPmdldEZvcm1hdCgpOworICAgICAgICAgIG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpOworICAgICAgICAgIGlmICghc3RybmNhc2VjbXAobWltZSwgImF1ZGlvLyIsIDYpKSB7CisgICAgICAgICAgICAgIHRyYWNrID0gJm1BdWRpb1RyYWNrOworICAgICAgICAgICAgICB0cmFja1R5cGUgPSBNRURJQV9UUkFDS19UWVBFX0FVRElPOworICAgICAgICAgICAgICBjb3VudGVycGFydFR5cGUgPSBNRURJQV9UUkFDS19UWVBFX1ZJREVPOzsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBDSEVDSyghc3RybmNhc2VjbXAobWltZSwgInZpZGVvLyIsIDYpKTsKKyAgICAgICAgICAgICAgdHJhY2sgPSAmbVZpZGVvVHJhY2s7CisgICAgICAgICAgICAgIHRyYWNrVHlwZSA9IE1FRElBX1RSQUNLX1RZUEVfVklERU87CisgICAgICAgICAgICAgIGNvdW50ZXJwYXJ0VHlwZSA9IE1FRElBX1RSQUNLX1RZUEVfQVVESU87OworICAgICAgICAgIH0KKworCisgICAgICAgICAgaWYgKHRyYWNrLT5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgdHJhY2stPm1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgdHJhY2stPm1Tb3VyY2UgPSBzb3VyY2U7CisgICAgICAgICAgdHJhY2stPm1Tb3VyY2UtPnN0YXJ0KCk7CisgICAgICAgICAgdHJhY2stPm1JbmRleCA9IHRyYWNrSW5kZXg7CisKKyAgICAgICAgICBzdGF0dXNfdCBhdmFpbDsKKyAgICAgICAgICBpZiAoIXRyYWNrLT5tUGFja2V0cy0+aGFzQnVmZmVyQXZhaWxhYmxlKCZhdmFpbCkpIHsKKyAgICAgICAgICAgICAgLy8gc3luYyBmcm9tIG90aGVyIHNvdXJjZQorICAgICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpbnQ2NF90IHRpbWVVcywgYWN0dWFsVGltZVVzOworICAgICAgICAgIGNvbnN0IGJvb2wgZm9ybWF0Q2hhbmdlID0gdHJ1ZTsKKyAgICAgICAgICBzcDxBTWVzc2FnZT4gbGF0ZXN0TWV0YSA9IHRyYWNrLT5tUGFja2V0cy0+Z2V0TGF0ZXN0RW5xdWV1ZWRNZXRhKCk7CisgICAgICAgICAgQ0hFQ0sobGF0ZXN0TWV0YSAhPSBOVUxMICYmIGxhdGVzdE1ldGEtPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworICAgICAgICAgIHJlYWRCdWZmZXIodHJhY2tUeXBlLCB0aW1lVXMsICZhY3R1YWxUaW1lVXMsIGZvcm1hdENoYW5nZSk7CisgICAgICAgICAgcmVhZEJ1ZmZlcihjb3VudGVycGFydFR5cGUsIC0xLCBOVUxMLCBmb3JtYXRDaGFuZ2UpOworICAgICAgICAgIEFMT0dWKCJ0aW1lVXMgJWxsZCBhY3R1YWxUaW1lVXMgJWxsZCIsIHRpbWVVcywgYWN0dWFsVGltZVVzKTsKKworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBrV2hhdFBvbGxCdWZmZXJpbmc6CisgICAgICB7CisgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOworICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKKyAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiA9PSBtUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb24pIHsKKyAgICAgICAgICAgICAgb25Qb2xsQnVmZmVyaW5nKCk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIGtXaGF0R2V0Rm9ybWF0OgorICAgICAgeworICAgICAgICAgIG9uR2V0Rm9ybWF0TWV0YShtc2cpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIGtXaGF0R2V0U2VsZWN0ZWRUcmFjazoKKyAgICAgIHsKKyAgICAgICAgICBvbkdldFNlbGVjdGVkVHJhY2sobXNnKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBrV2hhdFNlbGVjdFRyYWNrOgorICAgICAgeworICAgICAgICAgIG9uU2VsZWN0VHJhY2sobXNnKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBrV2hhdFNlZWs6CisgICAgICB7CisgICAgICAgICAgb25TZWVrKG1zZyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2Uga1doYXRSZWFkQnVmZmVyOgorICAgICAgeworICAgICAgICAgIG9uUmVhZEJ1ZmZlcihtc2cpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIGtXaGF0U3RvcFdpZGV2aW5lOgorICAgICAgeworICAgICAgICAgIC8vIG1TdG9wUmVhZCBpcyBvbmx5IHVzZWQgZm9yIFdpZGV2aW5lIHRvIHByZXZlbnQgdGhlIHZpZGVvIHNvdXJjZQorICAgICAgICAgIC8vIGZyb20gYmVpbmcgcmVhZCB3aGlsZSB0aGUgYXNzb2NpYXRlZCB2aWRlbyBkZWNvZGVyIGlzIHNodXR0aW5nIGRvd24uCisgICAgICAgICAgbVN0b3BSZWFkID0gdHJ1ZTsKKyAgICAgICAgICBpZiAobVZpZGVvVHJhY2subVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgIG1WaWRlb1RyYWNrLm1QYWNrZXRzLT5jbGVhcigpOworICAgICAgICAgIH0KKyAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgU291cmNlOjpvbk1lc3NhZ2VSZWNlaXZlZChtc2cpOworICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6ZmV0Y2hUZXh0RGF0YSgKKyAgICAgICAgdWludDMyX3Qgc2VuZFdoYXQsCisgICAgICAgIG1lZGlhX3RyYWNrX3R5cGUgdHlwZSwKKyAgICAgICAgaW50MzJfdCBjdXJHZW4sCisgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHBhY2tldHMsCisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cpIHsKKyAgICBpbnQzMl90IG1zZ0dlbmVyYXRpb247CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmbXNnR2VuZXJhdGlvbikpOworICAgIGlmIChtc2dHZW5lcmF0aW9uICE9IGN1ckdlbikgeworICAgICAgICAvLyBzdGFsZQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50MzJfdCBhdmFpbDsKKyAgICBpZiAocGFja2V0cy0+aGFzQnVmZmVyQXZhaWxhYmxlKCZhdmFpbCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDY0X3QgdGltZVVzOworICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CisKKyAgICBpbnQ2NF90IHN1YlRpbWVVczsKKyAgICByZWFkQnVmZmVyKHR5cGUsIHRpbWVVcywgJnN1YlRpbWVVcyk7CisKKyAgICBpbnQ2NF90IGRlbGF5VXMgPSBzdWJUaW1lVXMgLSB0aW1lVXM7CisgICAgaWYgKG1zZy0+d2hhdCgpID09IGtXaGF0RmV0Y2hTdWJ0aXRsZURhdGEpIHsKKyAgICAgICAgY29uc3QgaW50NjRfdCBvbmVTZWNVcyA9IDEwMDAwMDBsbDsKKyAgICAgICAgZGVsYXlVcyAtPSBvbmVTZWNVczsKKyAgICB9CisgICAgc3A8QU1lc3NhZ2U+IG1zZzIgPSBuZXcgQU1lc3NhZ2Uoc2VuZFdoYXQsIGlkKCkpOworICAgIG1zZzItPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbXNnR2VuZXJhdGlvbik7CisgICAgbXNnMi0+cG9zdChkZWxheVVzIDwgMCA/IDAgOiBkZWxheVVzKTsKK30KKwordm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6c2VuZFRleHREYXRhKAorICAgICAgICB1aW50MzJfdCB3aGF0LAorICAgICAgICBtZWRpYV90cmFja190eXBlIHR5cGUsCisgICAgICAgIGludDMyX3QgY3VyR2VuLAorICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBwYWNrZXRzLAorICAgICAgICBzcDxBTWVzc2FnZT4gbXNnKSB7CisgICAgaW50MzJfdCBtc2dHZW5lcmF0aW9uOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJm1zZ0dlbmVyYXRpb24pKTsKKyAgICBpZiAobXNnR2VuZXJhdGlvbiAhPSBjdXJHZW4pIHsKKyAgICAgICAgLy8gc3RhbGUKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDY0X3Qgc3ViVGltZVVzOworICAgIGlmIChwYWNrZXRzLT5uZXh0QnVmZmVyVGltZSgmc3ViVGltZVVzKSAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50NjRfdCBuZXh0U3ViVGltZVVzOworICAgIHJlYWRCdWZmZXIodHlwZSwgLTEsICZuZXh0U3ViVGltZVVzKTsKKworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKKyAgICBzdGF0dXNfdCBkZXF1ZXVlU3RhdHVzID0gcGFja2V0cy0+ZGVxdWV1ZUFjY2Vzc1VuaXQoJmJ1ZmZlcik7CisgICAgaWYgKGRlcXVldWVTdGF0dXMgPT0gT0spIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOworICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwgd2hhdCk7CisgICAgICAgIG5vdGlmeS0+c2V0QnVmZmVyKCJidWZmZXIiLCBidWZmZXIpOworICAgICAgICBub3RpZnktPnBvc3QoKTsKKworICAgICAgICBjb25zdCBpbnQ2NF90IGRlbGF5VXMgPSBuZXh0U3ViVGltZVVzIC0gc3ViVGltZVVzOworICAgICAgICBtc2ctPnBvc3QoZGVsYXlVcyA8IDAgPyAwIDogZGVsYXlVcyk7CisgICAgfQorfQorCiBzcDxNZXRhRGF0YT4gTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmdldEZvcm1hdE1ldGEoYm9vbCBhdWRpbykgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRGb3JtYXQsIGlkKCkpOworICAgIG1zZy0+c2V0SW50MzIoImF1ZGlvIiwgYXVkaW8pOworCisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHZvaWQgKmZvcm1hdDsKKyAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CisgICAgaWYgKGVyciA9PSBPSyAmJiByZXNwb25zZSAhPSBOVUxMKSB7CisgICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kUG9pbnRlcigiZm9ybWF0IiwgJmZvcm1hdCkpOworICAgICAgICByZXR1cm4gKE1ldGFEYXRhICopZm9ybWF0OworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6b25HZXRGb3JtYXRNZXRhKHNwPEFNZXNzYWdlPiBtc2cpIGNvbnN0IHsKKyAgICBpbnQzMl90IGF1ZGlvOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJhdWRpbyIsICZhdWRpbykpOworCisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgIHNwPE1ldGFEYXRhPiBmb3JtYXQgPSBkb0dldEZvcm1hdE1ldGEoYXVkaW8pOworICAgIHJlc3BvbnNlLT5zZXRQb2ludGVyKCJmb3JtYXQiLCBmb3JtYXQuZ2V0KCkpOworCisgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKK30KKworc3A8TWV0YURhdGE+IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpkb0dldEZvcm1hdE1ldGEoYm9vbCBhdWRpbykgY29uc3QgewogICAgIHNwPE1lZGlhU291cmNlPiBzb3VyY2UgPSBhdWRpbyA/IG1BdWRpb1RyYWNrLm1Tb3VyY2UgOiBtVmlkZW9UcmFjay5tU291cmNlOwogCiAgICAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CkBAIC0xNzAsMTQgKzg1OCw1MyBAQAogICAgICAgICByZXR1cm4gLUVXT1VMREJMT0NLOwogICAgIH0KIAorICAgIGlmIChtSXNXaWRldmluZSAmJiAhYXVkaW8pIHsKKyAgICAgICAgLy8gdHJ5IHRvIHJlYWQgYSBidWZmZXIgYXMgd2UgbWF5IG5vdCBoYXZlIGJlZW4gYWJsZSB0byB0aGUgbGFzdCB0aW1lCisgICAgICAgIHBvc3RSZWFkQnVmZmVyKE1FRElBX1RSQUNLX1RZUEVfVklERU8pOworICAgIH0KKwogICAgIHN0YXR1c190IGZpbmFsUmVzdWx0OwogICAgIGlmICghdHJhY2stPm1QYWNrZXRzLT5oYXNCdWZmZXJBdmFpbGFibGUoJmZpbmFsUmVzdWx0KSkgewotICAgICAgICByZXR1cm4gZmluYWxSZXN1bHQgPT0gT0sgPyAtRVdPVUxEQkxPQ0sgOiBmaW5hbFJlc3VsdDsKKyAgICAgICAgcmV0dXJuIChmaW5hbFJlc3VsdCA9PSBPSyA/IC1FV09VTERCTE9DSyA6IGZpbmFsUmVzdWx0KTsKICAgICB9CiAKICAgICBzdGF0dXNfdCByZXN1bHQgPSB0cmFjay0+bVBhY2tldHMtPmRlcXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOwogCi0gICAgcmVhZEJ1ZmZlcihhdWRpbywgLTFsbCk7CisgICAgaWYgKCF0cmFjay0+bVBhY2tldHMtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZmluYWxSZXN1bHQpKSB7CisgICAgICAgIHBvc3RSZWFkQnVmZmVyKGF1ZGlvPyBNRURJQV9UUkFDS19UWVBFX0FVRElPIDogTUVESUFfVFJBQ0tfVFlQRV9WSURFTyk7CisgICAgfQorCisgICAgaWYgKHJlc3VsdCAhPSBPSykgeworICAgICAgICBpZiAobVN1YnRpdGxlVHJhY2subVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBtU3VidGl0bGVUcmFjay5tUGFja2V0cy0+Y2xlYXIoKTsKKyAgICAgICAgICAgIG1GZXRjaFN1YnRpdGxlRGF0YUdlbmVyYXRpb24rKzsKKyAgICAgICAgfQorICAgICAgICBpZiAobVRpbWVkVGV4dFRyYWNrLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgbVRpbWVkVGV4dFRyYWNrLm1QYWNrZXRzLT5jbGVhcigpOworICAgICAgICAgICAgbUZldGNoVGltZWRUZXh0RGF0YUdlbmVyYXRpb24rKzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIGludDY0X3QgdGltZVVzOworICAgIHN0YXR1c190IGVvc1Jlc3VsdDsgLy8gaWdub3JlZAorICAgIENIRUNLKCgqYWNjZXNzVW5pdCktPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CisKKyAgICBpZiAobVN1YnRpdGxlVHJhY2subVNvdXJjZSAhPSBOVUxMCisgICAgICAgICAgICAmJiAhbVN1YnRpdGxlVHJhY2subVBhY2tldHMtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZW9zUmVzdWx0KSkgeworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RmV0Y2hTdWJ0aXRsZURhdGEsIGlkKCkpOworICAgICAgICBtc2ctPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworICAgICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbik7CisgICAgICAgIG1zZy0+cG9zdCgpOworICAgIH0KKworICAgIGlmIChtVGltZWRUZXh0VHJhY2subVNvdXJjZSAhPSBOVUxMCisgICAgICAgICAgICAmJiAhbVRpbWVkVGV4dFRyYWNrLm1QYWNrZXRzLT5oYXNCdWZmZXJBdmFpbGFibGUoJmVvc1Jlc3VsdCkpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEZldGNoVGltZWRUZXh0RGF0YSwgaWQoKSk7CisgICAgICAgIG1zZy0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtRmV0Y2hUaW1lZFRleHREYXRhR2VuZXJhdGlvbik7CisgICAgICAgIG1zZy0+cG9zdCgpOworICAgIH0KIAogICAgIHJldHVybiByZXN1bHQ7CiB9CkBAIC0xODcsMjUgKzkxNCwzODcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3NpemVfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6Z2V0VHJhY2tDb3VudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVNvdXJjZXMuc2l6ZSgpOworfQorCitzcDxBTWVzc2FnZT4gTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmdldFRyYWNrSW5mbyhzaXplX3QgdHJhY2tJbmRleCkgY29uc3QgeworICAgIHNpemVfdCB0cmFja0NvdW50ID0gbVNvdXJjZXMuc2l6ZSgpOworICAgIGlmICh0cmFja0luZGV4ID49IHRyYWNrQ291bnQpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG5ldyBBTWVzc2FnZSgpOworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbVNvdXJjZXMuaXRlbUF0KHRyYWNrSW5kZXgpLT5nZXRGb3JtYXQoKTsKKworICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgQ0hFQ0sobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworCisgICAgaW50MzJfdCB0cmFja1R5cGU7CisgICAgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCAidmlkZW8vIiwgNikpIHsKKyAgICAgICAgdHJhY2tUeXBlID0gTUVESUFfVFJBQ0tfVFlQRV9WSURFTzsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCAiYXVkaW8vIiwgNikpIHsKKyAgICAgICAgdHJhY2tUeXBlID0gTUVESUFfVFJBQ0tfVFlQRV9BVURJTzsKKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1RFWFRfM0dQUCkpIHsKKyAgICAgICAgdHJhY2tUeXBlID0gTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdHJhY2tUeXBlID0gTUVESUFfVFJBQ0tfVFlQRV9VTktOT1dOOworICAgIH0KKyAgICBmb3JtYXQtPnNldEludDMyKCJ0eXBlIiwgdHJhY2tUeXBlKTsKKworICAgIGNvbnN0IGNoYXIgKmxhbmc7CisgICAgaWYgKCFtZXRhLT5maW5kQ1N0cmluZyhrS2V5TWVkaWFMYW5ndWFnZSwgJmxhbmcpKSB7CisgICAgICAgIGxhbmcgPSAidW5kIjsKKyAgICB9CisgICAgZm9ybWF0LT5zZXRTdHJpbmcoImxhbmd1YWdlIiwgbGFuZyk7CisKKyAgICBpZiAodHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEUpIHsKKyAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBtaW1lKTsKKworICAgICAgICBpbnQzMl90IGlzQXV0b3NlbGVjdCA9IDEsIGlzRGVmYXVsdCA9IDAsIGlzRm9yY2VkID0gMDsKKyAgICAgICAgbWV0YS0+ZmluZEludDMyKGtLZXlUcmFja0lzQXV0b3NlbGVjdCwgJmlzQXV0b3NlbGVjdCk7CisgICAgICAgIG1ldGEtPmZpbmRJbnQzMihrS2V5VHJhY2tJc0RlZmF1bHQsICZpc0RlZmF1bHQpOworICAgICAgICBtZXRhLT5maW5kSW50MzIoa0tleVRyYWNrSXNGb3JjZWQsICZpc0ZvcmNlZCk7CisKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiYXV0byIsICEhaXNBdXRvc2VsZWN0KTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiZGVmYXVsdCIsICEhaXNEZWZhdWx0KTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiZm9yY2VkIiwgISFpc0ZvcmNlZCk7CisgICAgfQorCisgICAgcmV0dXJuIGZvcm1hdDsKK30KKworc3NpemVfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6Z2V0U2VsZWN0ZWRUcmFjayhtZWRpYV90cmFja190eXBlIHR5cGUpIGNvbnN0IHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0U2VsZWN0ZWRUcmFjaywgaWQoKSk7CisgICAgbXNnLT5zZXRJbnQzMigidHlwZSIsIHR5cGUpOworCisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIGludDMyX3QgaW5kZXg7CisgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworICAgIGlmIChlcnIgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgeworICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJpbmRleCIsICZpbmRleCkpOworICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6b25HZXRTZWxlY3RlZFRyYWNrKHNwPEFNZXNzYWdlPiBtc2cpIGNvbnN0IHsKKyAgICBpbnQzMl90IHRtcFR5cGU7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInR5cGUiLCAmdG1wVHlwZSkpOworICAgIG1lZGlhX3RyYWNrX3R5cGUgdHlwZSA9IChtZWRpYV90cmFja190eXBlKXRtcFR5cGU7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgc3NpemVfdCBpbmRleCA9IGRvR2V0U2VsZWN0ZWRUcmFjayh0eXBlKTsKKyAgICByZXNwb25zZS0+c2V0SW50MzIoImluZGV4IiwgaW5kZXgpOworCisgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKK30KKworc3NpemVfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6ZG9HZXRTZWxlY3RlZFRyYWNrKG1lZGlhX3RyYWNrX3R5cGUgdHlwZSkgY29uc3QgeworICAgIGNvbnN0IFRyYWNrICp0cmFjayA9IE5VTEw7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBNRURJQV9UUkFDS19UWVBFX1ZJREVPOgorICAgICAgICB0cmFjayA9ICZtVmlkZW9UcmFjazsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNRURJQV9UUkFDS19UWVBFX0FVRElPOgorICAgICAgICB0cmFjayA9ICZtQXVkaW9UcmFjazsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNRURJQV9UUkFDS19UWVBFX1RJTUVEVEVYVDoKKyAgICAgICAgdHJhY2sgPSAmbVRpbWVkVGV4dFRyYWNrOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEU6CisgICAgICAgIHRyYWNrID0gJm1TdWJ0aXRsZVRyYWNrOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAodHJhY2sgIT0gTlVMTCAmJiB0cmFjay0+bVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiB0cmFjay0+bUluZGV4OworICAgIH0KKworICAgIHJldHVybiAtMTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnNlbGVjdFRyYWNrKHNpemVfdCB0cmFja0luZGV4LCBib29sIHNlbGVjdCkgeworICAgIEFMT0dWKCIlcyB0cmFjazogJXp1Iiwgc2VsZWN0ID8gInNlbGVjdCIgOiAiZGVzZWxlY3QiLCB0cmFja0luZGV4KTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VsZWN0VHJhY2ssIGlkKCkpOworICAgIG1zZy0+c2V0SW50MzIoInRyYWNrSW5kZXgiLCB0cmFja0luZGV4KTsKKyAgICBtc2ctPnNldEludDMyKCJzZWxlY3QiLCBzZWxlY3QpOworCisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKKyAgICBpZiAoZXJyID09IE9LICYmIHJlc3BvbnNlICE9IE5VTEwpIHsKKyAgICAgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6Om9uU2VsZWN0VHJhY2soc3A8QU1lc3NhZ2U+IG1zZykgeworICAgIGludDMyX3QgdHJhY2tJbmRleCwgc2VsZWN0OworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ0cmFja0luZGV4IiwgJnRyYWNrSW5kZXgpKTsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigic2VsZWN0IiwgJnNlbGVjdCkpOworCisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgIHN0YXR1c190IGVyciA9IGRvU2VsZWN0VHJhY2sodHJhY2tJbmRleCwgc2VsZWN0KTsKKyAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CisKKyAgICB1aW50MzJfdCByZXBseUlEOworICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKyAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworfQorCitzdGF0dXNfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6ZG9TZWxlY3RUcmFjayhzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBzZWxlY3QpIHsKKyAgICBpZiAodHJhY2tJbmRleCA+PSBtU291cmNlcy5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKKyAgICB9CisKKyAgICBpZiAoIXNlbGVjdCkgeworICAgICAgICBUcmFjayogdHJhY2sgPSBOVUxMOworICAgICAgICBpZiAobVN1YnRpdGxlVHJhY2subVNvdXJjZSAhPSBOVUxMICYmIHRyYWNrSW5kZXggPT0gbVN1YnRpdGxlVHJhY2subUluZGV4KSB7CisgICAgICAgICAgICB0cmFjayA9ICZtU3VidGl0bGVUcmFjazsKKyAgICAgICAgICAgIG1GZXRjaFN1YnRpdGxlRGF0YUdlbmVyYXRpb24rKzsKKyAgICAgICAgfSBlbHNlIGlmIChtVGltZWRUZXh0VHJhY2subVNvdXJjZSAhPSBOVUxMICYmIHRyYWNrSW5kZXggPT0gbVRpbWVkVGV4dFRyYWNrLm1JbmRleCkgeworICAgICAgICAgICAgdHJhY2sgPSAmbVRpbWVkVGV4dFRyYWNrOworICAgICAgICAgICAgbUZldGNoVGltZWRUZXh0RGF0YUdlbmVyYXRpb24rKzsKKyAgICAgICAgfQorICAgICAgICBpZiAodHJhY2sgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIHRyYWNrLT5tU291cmNlLT5zdG9wKCk7CisgICAgICAgIHRyYWNrLT5tU291cmNlID0gTlVMTDsKKyAgICAgICAgdHJhY2stPm1QYWNrZXRzLT5jbGVhcigpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgY29uc3Qgc3A8TWVkaWFTb3VyY2U+IHNvdXJjZSA9IG1Tb3VyY2VzLml0ZW1BdCh0cmFja0luZGV4KTsKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IHNvdXJjZS0+Z2V0Rm9ybWF0KCk7CisgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICBDSEVDSyhtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisgICAgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCAidGV4dC8iLCA1KSkgeworICAgICAgICBib29sIGlzU3VidGl0bGUgPSBzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1RFWFRfM0dQUCk7CisgICAgICAgIFRyYWNrICp0cmFjayA9IGlzU3VidGl0bGUgPyAmbVN1YnRpdGxlVHJhY2sgOiAmbVRpbWVkVGV4dFRyYWNrOworICAgICAgICBpZiAodHJhY2stPm1Tb3VyY2UgIT0gTlVMTCAmJiB0cmFjay0+bUluZGV4ID09IHRyYWNrSW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgICAgICB0cmFjay0+bUluZGV4ID0gdHJhY2tJbmRleDsKKyAgICAgICAgaWYgKHRyYWNrLT5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHRyYWNrLT5tU291cmNlLT5zdG9wKCk7CisgICAgICAgIH0KKyAgICAgICAgdHJhY2stPm1Tb3VyY2UgPSBtU291cmNlcy5pdGVtQXQodHJhY2tJbmRleCk7CisgICAgICAgIHRyYWNrLT5tU291cmNlLT5zdGFydCgpOworICAgICAgICBpZiAodHJhY2stPm1QYWNrZXRzID09IE5VTEwpIHsKKyAgICAgICAgICAgIHRyYWNrLT5tUGFja2V0cyA9IG5ldyBBbm90aGVyUGFja2V0U291cmNlKHRyYWNrLT5tU291cmNlLT5nZXRGb3JtYXQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0cmFjay0+bVBhY2tldHMtPmNsZWFyKCk7CisgICAgICAgICAgICB0cmFjay0+bVBhY2tldHMtPnNldEZvcm1hdCh0cmFjay0+bVNvdXJjZS0+Z2V0Rm9ybWF0KCkpOworCisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNTdWJ0aXRsZSkgeworICAgICAgICAgICAgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbisrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUZldGNoVGltZWRUZXh0RGF0YUdlbmVyYXRpb24rKzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCAiYXVkaW8vIiwgNikgfHwgIXN0cm5jYXNlY21wKG1pbWUsICJ2aWRlby8iLCA2KSkgeworICAgICAgICBib29sIGF1ZGlvID0gIXN0cm5jYXNlY21wKG1pbWUsICJhdWRpby8iLCA2KTsKKyAgICAgICAgVHJhY2sgKnRyYWNrID0gYXVkaW8gPyAmbUF1ZGlvVHJhY2sgOiAmbVZpZGVvVHJhY2s7CisgICAgICAgIGlmICh0cmFjay0+bVNvdXJjZSAhPSBOVUxMICYmIHRyYWNrLT5tSW5kZXggPT0gdHJhY2tJbmRleCkgeworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENoYW5nZUFWU291cmNlLCBpZCgpKTsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigidHJhY2tJbmRleCIsIHRyYWNrSW5kZXgpOworICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKwogc3RhdHVzX3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnNlZWtUbyhpbnQ2NF90IHNlZWtUaW1lVXMpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VlaywgaWQoKSk7CisgICAgbXNnLT5zZXRJbnQ2NCgic2Vla1RpbWVVcyIsIHNlZWtUaW1lVXMpOworCisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKKyAgICBpZiAoZXJyID09IE9LICYmIHJlc3BvbnNlICE9IE5VTEwpIHsKKyAgICAgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6Om9uU2VlayhzcDxBTWVzc2FnZT4gbXNnKSB7CisgICAgaW50NjRfdCBzZWVrVGltZVVzOworICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzZWVrVGltZVVzIiwgJnNlZWtUaW1lVXMpKTsKKworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBkb1NlZWsoc2Vla1RpbWVVcyk7CisgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOworCisgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmRvU2VlayhpbnQ2NF90IHNlZWtUaW1lVXMpIHsKKyAgICAvLyBJZiB0aGUgV2lkZXZpbmUgc291cmNlIGlzIHN0b3BwZWQsIGRvIG5vdCBhdHRlbXB0IHRvIHJlYWQgYW55CisgICAgLy8gbW9yZSBidWZmZXJzLgorICAgIGlmIChtU3RvcFJlYWQpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KICAgICBpZiAobVZpZGVvVHJhY2subVNvdXJjZSAhPSBOVUxMKSB7CiAgICAgICAgIGludDY0X3QgYWN0dWFsVGltZVVzOwotICAgICAgICByZWFkQnVmZmVyKGZhbHNlIC8qIGF1ZGlvICovLCBzZWVrVGltZVVzLCAmYWN0dWFsVGltZVVzKTsKKyAgICAgICAgcmVhZEJ1ZmZlcihNRURJQV9UUkFDS19UWVBFX1ZJREVPLCBzZWVrVGltZVVzLCAmYWN0dWFsVGltZVVzKTsKIAogICAgICAgICBzZWVrVGltZVVzID0gYWN0dWFsVGltZVVzOwogICAgIH0KIAogICAgIGlmIChtQXVkaW9UcmFjay5tU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgcmVhZEJ1ZmZlcih0cnVlIC8qIGF1ZGlvICovLCBzZWVrVGltZVVzKTsKKyAgICAgICAgcmVhZEJ1ZmZlcihNRURJQV9UUkFDS19UWVBFX0FVRElPLCBzZWVrVGltZVVzKTsKICAgICB9CiAKKyAgICBzZXREcm1QbGF5YmFja1N0YXR1c0lmTmVlZGVkKFBsYXliYWNrOjpTVEFSVCwgc2Vla1RpbWVVcyAvIDEwMDApOworICAgIGlmICghbVN0YXJ0ZWQpIHsKKyAgICAgICAgc2V0RHJtUGxheWJhY2tTdGF0dXNJZk5lZWRlZChQbGF5YmFjazo6UEFVU0UsIDApOworICAgIH0KICAgICByZXR1cm4gT0s7CiB9CiAKK3NwPEFCdWZmZXI+IE51UGxheWVyOjpHZW5lcmljU291cmNlOjptZWRpYUJ1ZmZlclRvQUJ1ZmZlcigKKyAgICAgICAgTWVkaWFCdWZmZXIqIG1iLAorICAgICAgICBtZWRpYV90cmFja190eXBlIHRyYWNrVHlwZSwKKyAgICAgICAgaW50NjRfdCAqYWN0dWFsVGltZVVzKSB7CisgICAgYm9vbCBhdWRpbyA9IHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX0FVRElPOworICAgIHNpemVfdCBvdXRMZW5ndGggPSBtYi0+cmFuZ2VfbGVuZ3RoKCk7CisKKyAgICBpZiAoYXVkaW8gJiYgbUF1ZGlvSXNWb3JiaXMpIHsKKyAgICAgICAgb3V0TGVuZ3RoICs9IHNpemVvZihpbnQzMl90KTsKKyAgICB9CisKKyAgICBzcDxBQnVmZmVyPiBhYjsKKyAgICBpZiAobUlzV2lkZXZpbmUgJiYgIWF1ZGlvKSB7CisgICAgICAgIC8vIGRhdGEgaXMgYWxyZWFkeSBwcm92aWRlZCBpbiB0aGUgYnVmZmVyCisgICAgICAgIGFiID0gbmV3IEFCdWZmZXIoTlVMTCwgbWItPnJhbmdlX2xlbmd0aCgpKTsKKyAgICAgICAgbWItPmFkZF9yZWYoKTsKKyAgICAgICAgYWItPnNldE1lZGlhQnVmZmVyQmFzZShtYik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYWIgPSBuZXcgQUJ1ZmZlcihvdXRMZW5ndGgpOworICAgICAgICBtZW1jcHkoYWItPmRhdGEoKSwKKyAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopbWItPmRhdGEoKSArIG1iLT5yYW5nZV9vZmZzZXQoKSwKKyAgICAgICAgICAgICAgIG1iLT5yYW5nZV9sZW5ndGgoKSk7CisgICAgfQorCisgICAgaWYgKGF1ZGlvICYmIG1BdWRpb0lzVm9yYmlzKSB7CisgICAgICAgIGludDMyX3QgbnVtUGFnZVNhbXBsZXM7CisgICAgICAgIGlmICghbWItPm1ldGFfZGF0YSgpLT5maW5kSW50MzIoa0tleVZhbGlkU2FtcGxlcywgJm51bVBhZ2VTYW1wbGVzKSkgeworICAgICAgICAgICAgbnVtUGFnZVNhbXBsZXMgPSAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQ4X3QqIGFiRW5kID0gYWItPmRhdGEoKSArIG1iLT5yYW5nZV9sZW5ndGgoKTsKKyAgICAgICAgbWVtY3B5KGFiRW5kLCAmbnVtUGFnZVNhbXBsZXMsIHNpemVvZihudW1QYWdlU2FtcGxlcykpOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBtZXRhID0gYWItPm1ldGEoKTsKKworICAgIGludDY0X3QgdGltZVVzOworICAgIENIRUNLKG1iLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7CisgICAgbWV0YS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisKKyAgICBpZiAodHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfVElNRURURVhUKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgICAgIENIRUNLKG1UaW1lZFRleHRUcmFjay5tU291cmNlICE9IE5VTEwKKyAgICAgICAgICAgICAgICAmJiBtVGltZWRUZXh0VHJhY2subVNvdXJjZS0+Z2V0Rm9ybWF0KCktPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKyAgICAgICAgbWV0YS0+c2V0U3RyaW5nKCJtaW1lIiwgbWltZSk7CisgICAgfQorCisgICAgaW50NjRfdCBkdXJhdGlvblVzOworICAgIGlmIChtYi0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvblVzKSkgeworICAgICAgICBtZXRhLT5zZXRJbnQ2NCgiZHVyYXRpb25VcyIsIGR1cmF0aW9uVXMpOworICAgIH0KKworICAgIGlmICh0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRSkgeworICAgICAgICBtZXRhLT5zZXRJbnQzMigidHJhY2tJbmRleCIsIG1TdWJ0aXRsZVRyYWNrLm1JbmRleCk7CisgICAgfQorCisgICAgaWYgKGFjdHVhbFRpbWVVcykgeworICAgICAgICAqYWN0dWFsVGltZVVzID0gdGltZVVzOworICAgIH0KKworICAgIG1iLT5yZWxlYXNlKCk7CisgICAgbWIgPSBOVUxMOworCisgICAgcmV0dXJuIGFiOworfQorCit2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpwb3N0UmVhZEJ1ZmZlcihtZWRpYV90cmFja190eXBlIHRyYWNrVHlwZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtUmVhZEJ1ZmZlckxvY2spOworCisgICAgaWYgKChtUGVuZGluZ1JlYWRCdWZmZXJUeXBlcyAmICgxIDw8IHRyYWNrVHlwZSkpID09IDApIHsKKyAgICAgICAgbVBlbmRpbmdSZWFkQnVmZmVyVHlwZXMgfD0gKDEgPDwgdHJhY2tUeXBlKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlYWRCdWZmZXIsIGlkKCkpOworICAgICAgICBtc2ctPnNldEludDMyKCJ0cmFja1R5cGUiLCB0cmFja1R5cGUpOworICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6Om9uUmVhZEJ1ZmZlcihzcDxBTWVzc2FnZT4gbXNnKSB7CisgICAgaW50MzJfdCB0bXBUeXBlOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ0cmFja1R5cGUiLCAmdG1wVHlwZSkpOworICAgIG1lZGlhX3RyYWNrX3R5cGUgdHJhY2tUeXBlID0gKG1lZGlhX3RyYWNrX3R5cGUpdG1wVHlwZTsKKyAgICB7CisgICAgICAgIC8vIG9ubHkgcHJvdGVjdCB0aGUgdmFyaWFibGUgY2hhbmdlLCBhcyByZWFkQnVmZmVyIG1heQorICAgICAgICAvLyB0YWtlIGNvbnNpZGVyYWJsZSB0aW1lLiAgVGhpcyBtYXkgcmVzdWx0IGluIG9uZSBleHRyYQorICAgICAgICAvLyByZWFkIGJlaW5nIHByb2Nlc3NlZCwgYnV0IHRoYXQgaXMgYmVuaWduLgorICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVJlYWRCdWZmZXJMb2NrKTsKKyAgICAgICAgbVBlbmRpbmdSZWFkQnVmZmVyVHlwZXMgJj0gfigxIDw8IHRyYWNrVHlwZSk7CisgICAgfQorICAgIHJlYWRCdWZmZXIodHJhY2tUeXBlKTsKK30KKwogdm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6cmVhZEJ1ZmZlcigKLSAgICAgICAgYm9vbCBhdWRpbywgaW50NjRfdCBzZWVrVGltZVVzLCBpbnQ2NF90ICphY3R1YWxUaW1lVXMpIHsKLSAgICBUcmFjayAqdHJhY2sgPSBhdWRpbyA/ICZtQXVkaW9UcmFjayA6ICZtVmlkZW9UcmFjazsKLSAgICBDSEVDSyh0cmFjay0+bVNvdXJjZSAhPSBOVUxMKTsKKyAgICAgICAgbWVkaWFfdHJhY2tfdHlwZSB0cmFja1R5cGUsIGludDY0X3Qgc2Vla1RpbWVVcywgaW50NjRfdCAqYWN0dWFsVGltZVVzLCBib29sIGZvcm1hdENoYW5nZSkgeworICAgIC8vIERvIG5vdCByZWFkIGRhdGEgaWYgV2lkZXZpbmUgc291cmNlIGlzIHN0b3BwZWQKKyAgICBpZiAobVN0b3BSZWFkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgVHJhY2sgKnRyYWNrOworICAgIHNpemVfdCBtYXhCdWZmZXJzID0gMTsKKyAgICBzd2l0Y2ggKHRyYWNrVHlwZSkgeworICAgICAgICBjYXNlIE1FRElBX1RSQUNLX1RZUEVfVklERU86CisgICAgICAgICAgICB0cmFjayA9ICZtVmlkZW9UcmFjazsKKyAgICAgICAgICAgIGlmIChtSXNXaWRldmluZSkgeworICAgICAgICAgICAgICAgIG1heEJ1ZmZlcnMgPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUVESUFfVFJBQ0tfVFlQRV9BVURJTzoKKyAgICAgICAgICAgIHRyYWNrID0gJm1BdWRpb1RyYWNrOworICAgICAgICAgICAgaWYgKG1Jc1dpZGV2aW5lKSB7CisgICAgICAgICAgICAgICAgbWF4QnVmZmVycyA9IDg7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1heEJ1ZmZlcnMgPSA2NDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEU6CisgICAgICAgICAgICB0cmFjayA9ICZtU3VidGl0bGVUcmFjazsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1FRElBX1RSQUNLX1RZUEVfVElNRURURVhUOgorICAgICAgICAgICAgdHJhY2sgPSAmbVRpbWVkVGV4dFRyYWNrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBUUkVTUEFTUygpOworICAgIH0KKworICAgIGlmICh0cmFjay0+bVNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKICAgICBpZiAoYWN0dWFsVGltZVVzKSB7CiAgICAgICAgICphY3R1YWxUaW1lVXMgPSBzZWVrVGltZVVzOwpAQCAtMjE2LDY0ICsxMzA1LDU2IEBACiAgICAgYm9vbCBzZWVraW5nID0gZmFsc2U7CiAKICAgICBpZiAoc2Vla1RpbWVVcyA+PSAwKSB7Ci0gICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKHNlZWtUaW1lVXMpOworICAgICAgICBvcHRpb25zLnNldFNlZWtUbyhzZWVrVGltZVVzLCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQyk7CiAgICAgICAgIHNlZWtpbmcgPSB0cnVlOwogICAgIH0KIAotICAgIGZvciAoOzspIHsKKyAgICBpZiAobUlzV2lkZXZpbmUgJiYgdHJhY2tUeXBlICE9IE1FRElBX1RSQUNLX1RZUEVfQVVESU8pIHsKKyAgICAgICAgb3B0aW9ucy5zZXROb25CbG9ja2luZygpOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IG51bUJ1ZmZlcnMgPSAwOyBudW1CdWZmZXJzIDwgbWF4QnVmZmVyczsgKSB7CiAgICAgICAgIE1lZGlhQnVmZmVyICptYnVmOwogICAgICAgICBzdGF0dXNfdCBlcnIgPSB0cmFjay0+bVNvdXJjZS0+cmVhZCgmbWJ1ZiwgJm9wdGlvbnMpOwogCiAgICAgICAgIG9wdGlvbnMuY2xlYXJTZWVrVG8oKTsKIAogICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICBzaXplX3Qgb3V0TGVuZ3RoID0gbWJ1Zi0+cmFuZ2VfbGVuZ3RoKCk7Ci0KLSAgICAgICAgICAgIGlmIChhdWRpbyAmJiBtQXVkaW9Jc1ZvcmJpcykgewotICAgICAgICAgICAgICAgIG91dExlbmd0aCArPSBzaXplb2YoaW50MzJfdCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKG91dExlbmd0aCk7Ci0KLSAgICAgICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKW1idWYtPmRhdGEoKSArIG1idWYtPnJhbmdlX29mZnNldCgpLAotICAgICAgICAgICAgICAgICAgIG1idWYtPnJhbmdlX2xlbmd0aCgpKTsKLQotICAgICAgICAgICAgaWYgKGF1ZGlvICYmIG1BdWRpb0lzVm9yYmlzKSB7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCBudW1QYWdlU2FtcGxlczsKLSAgICAgICAgICAgICAgICBpZiAoIW1idWYtPm1ldGFfZGF0YSgpLT5maW5kSW50MzIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleVZhbGlkU2FtcGxlcywgJm51bVBhZ2VTYW1wbGVzKSkgewotICAgICAgICAgICAgICAgICAgICBudW1QYWdlU2FtcGxlcyA9IC0xOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSArIG1idWYtPnJhbmdlX2xlbmd0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAmbnVtUGFnZVNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihudW1QYWdlU2FtcGxlcykpOwotICAgICAgICAgICAgfQotCiAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKICAgICAgICAgICAgIENIRUNLKG1idWYtPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKLQotICAgICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwotCi0gICAgICAgICAgICBpZiAoYWN0dWFsVGltZVVzKSB7Ci0gICAgICAgICAgICAgICAgKmFjdHVhbFRpbWVVcyA9IHRpbWVVczsKKyAgICAgICAgICAgIGlmICh0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9BVURJTykgeworICAgICAgICAgICAgICAgIG1BdWRpb1RpbWVVcyA9IHRpbWVVczsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfVklERU8pIHsKKyAgICAgICAgICAgICAgICBtVmlkZW9UaW1lVXMgPSB0aW1lVXM7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1idWYtPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1idWYgPSBOVUxMOwotCi0gICAgICAgICAgICBpZiAoc2Vla2luZykgewotICAgICAgICAgICAgICAgIHRyYWNrLT5tUGFja2V0cy0+cXVldWVEaXNjb250aW51aXR5KAotICAgICAgICAgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX1NFRUssIE5VTEwpOworICAgICAgICAgICAgLy8gZm9ybWF0Q2hhbmdlICYmIHNlZWtpbmc6IHRyYWNrIHdob3NlIHNvdXJjZSBpcyBjaGFuZ2VkIGR1cmluZyBzZWxlY3Rpb24KKyAgICAgICAgICAgIC8vIGZvcm1hdENoYW5nZSAmJiAhc2Vla2luZzogdHJhY2sgd2hvc2Ugc291cmNlIGlzIG5vdCBjaGFuZ2VkIGR1cmluZyBzZWxlY3Rpb24KKyAgICAgICAgICAgIC8vICFmb3JtYXRDaGFuZ2U6IG5vcm1hbCBzZWVrCisgICAgICAgICAgICBpZiAoKHNlZWtpbmcgfHwgZm9ybWF0Q2hhbmdlKQorICAgICAgICAgICAgICAgICAgICAmJiAodHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfQVVESU8KKyAgICAgICAgICAgICAgICAgICAgfHwgdHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfVklERU8pKSB7CisgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpEaXNjb250aW51aXR5VHlwZSB0eXBlID0gZm9ybWF0Q2hhbmdlCisgICAgICAgICAgICAgICAgICAgICAgICA/IChzZWVraW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX0ZPUk1BVENIQU5HRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9OT05FKQorICAgICAgICAgICAgICAgICAgICAgICAgOiBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfU0VFSzsKKyAgICAgICAgICAgICAgICB0cmFjay0+bVBhY2tldHMtPnF1ZXVlRGlzY29udGludWl0eSggdHlwZSwgTlVMTCwgdHJ1ZSAvKiBkaXNjYXJkICovKTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbWVkaWFCdWZmZXJUb0FCdWZmZXIobWJ1ZiwgdHJhY2tUeXBlLCBhY3R1YWxUaW1lVXMpOwogICAgICAgICAgICAgdHJhY2stPm1QYWNrZXRzLT5xdWV1ZUFjY2Vzc1VuaXQoYnVmZmVyKTsKKyAgICAgICAgICAgIGZvcm1hdENoYW5nZSA9IGZhbHNlOworICAgICAgICAgICAgc2Vla2luZyA9IGZhbHNlOworICAgICAgICAgICAgKytudW1CdWZmZXJzOworICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBXT1VMRF9CTE9DSykgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0gZWxzZSBpZiAoZXJyID09IElORk9fRk9STUFUX0NIQU5HRUQpIHsKICNpZiAwCiAgICAgICAgICAgICB0cmFjay0+bVBhY2tldHMtPnF1ZXVlRGlzY29udGludWl0eSgKLSAgICAgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX0ZPUk1BVENIQU5HRSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9GT1JNQVRDSEFOR0UsCisgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGRpc2NhcmQgKi8pOwogI2VuZGlmCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0cmFjay0+bVBhY2tldHMtPnNpZ25hbEVPUyhlcnIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmgKaW5kZXggMmRhNjgwYy4uMWI2ODI4MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5oCkBAIC0yMyw1OCArMjMsMTc2IEBACiAKICNpbmNsdWRlICJBVFNQYXJzZXIuaCIKIAorI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyLmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorY2xhc3MgRGVjcnlwdEhhbmRsZTsKK2NsYXNzIERybU1hbmFnZXJDbGllbnQ7CiBzdHJ1Y3QgQW5vdGhlclBhY2tldFNvdXJjZTsKIHN0cnVjdCBBUlRTUENvbnRyb2xsZXI7CiBzdHJ1Y3QgRGF0YVNvdXJjZTsKK3N0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKIHN0cnVjdCBNZWRpYVNvdXJjZTsKK2NsYXNzIE1lZGlhQnVmZmVyOworc3RydWN0IE51Q2FjaGVkU291cmNlMjsKK3N0cnVjdCBXVk1FeHRyYWN0b3I7CiAKIHN0cnVjdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZSA6IHB1YmxpYyBOdVBsYXllcjo6U291cmNlIHsKLSAgICBHZW5lcmljU291cmNlKAotICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCi0gICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKLSAgICAgICAgICAgIGJvb2wgdWlkVmFsaWQgPSBmYWxzZSwKLSAgICAgICAgICAgIHVpZF90IHVpZCA9IDApOworICAgIEdlbmVyaWNTb3VyY2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksIGJvb2wgdWlkVmFsaWQsIHVpZF90IHVpZCk7CiAKLSAgICBHZW5lcmljU291cmNlKAotICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgICAgICBpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CisgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CisKKyAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKIAogICAgIHZpcnR1YWwgdm9pZCBwcmVwYXJlQXN5bmMoKTsKIAogICAgIHZpcnR1YWwgdm9pZCBzdGFydCgpOworICAgIHZpcnR1YWwgdm9pZCBzdG9wKCk7CisgICAgdmlydHVhbCB2b2lkIHBhdXNlKCk7CisgICAgdmlydHVhbCB2b2lkIHJlc3VtZSgpOworCisgICAgdmlydHVhbCB2b2lkIGRpc2Nvbm5lY3QoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZmVlZE1vcmVUU0RhdGEoKTsKIAorICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZpbGVGb3JtYXRNZXRhKCkgY29uc3Q7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGRlcXVldWVBY2Nlc3NVbml0KGJvb2wgYXVkaW8sIHNwPEFCdWZmZXI+ICphY2Nlc3NVbml0KTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RHVyYXRpb24oaW50NjRfdCAqZHVyYXRpb25Vcyk7CisgICAgdmlydHVhbCBzaXplX3QgZ2V0VHJhY2tDb3VudCgpIGNvbnN0OworICAgIHZpcnR1YWwgc3A8QU1lc3NhZ2U+IGdldFRyYWNrSW5mbyhzaXplX3QgdHJhY2tJbmRleCkgY29uc3Q7CisgICAgdmlydHVhbCBzc2l6ZV90IGdldFNlbGVjdGVkVHJhY2sobWVkaWFfdHJhY2tfdHlwZSB0eXBlKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNlbGVjdFRyYWNrKHNpemVfdCB0cmFja0luZGV4LCBib29sIHNlbGVjdCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZWVrVG8oaW50NjRfdCBzZWVrVGltZVVzKTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QnVmZmVycyhib29sIGF1ZGlvLCBWZWN0b3I8TWVkaWFCdWZmZXIgKj4gJmJ1ZmZlcnMpOworCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+R2VuZXJpY1NvdXJjZSgpOwogCisgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKwogICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdE1ldGEoYm9vbCBhdWRpbyk7CiAKIHByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtXaGF0UHJlcGFyZUFzeW5jLAorICAgICAgICBrV2hhdEZldGNoU3VidGl0bGVEYXRhLAorICAgICAgICBrV2hhdEZldGNoVGltZWRUZXh0RGF0YSwKKyAgICAgICAga1doYXRTZW5kU3VidGl0bGVEYXRhLAorICAgICAgICBrV2hhdFNlbmRUaW1lZFRleHREYXRhLAorICAgICAgICBrV2hhdENoYW5nZUFWU291cmNlLAorICAgICAgICBrV2hhdFBvbGxCdWZmZXJpbmcsCisgICAgICAgIGtXaGF0R2V0Rm9ybWF0LAorICAgICAgICBrV2hhdEdldFNlbGVjdGVkVHJhY2ssCisgICAgICAgIGtXaGF0U2VsZWN0VHJhY2ssCisgICAgICAgIGtXaGF0U2VlaywKKyAgICAgICAga1doYXRSZWFkQnVmZmVyLAorICAgICAgICBrV2hhdFN0b3BXaWRldmluZSwKKyAgICB9OworCisgICAgVmVjdG9yPHNwPE1lZGlhU291cmNlPiA+IG1Tb3VyY2VzOworCiAgICAgc3RydWN0IFRyYWNrIHsKKyAgICAgICAgc2l6ZV90IG1JbmRleDsKICAgICAgICAgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7CiAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IG1QYWNrZXRzOwogICAgIH07CiAKICAgICBUcmFjayBtQXVkaW9UcmFjazsKKyAgICBpbnQ2NF90IG1BdWRpb1RpbWVVczsKICAgICBUcmFjayBtVmlkZW9UcmFjazsKKyAgICBpbnQ2NF90IG1WaWRlb1RpbWVVczsKKyAgICBUcmFjayBtU3VidGl0bGVUcmFjazsKKyAgICBUcmFjayBtVGltZWRUZXh0VHJhY2s7CiAKKyAgICBpbnQzMl90IG1GZXRjaFN1YnRpdGxlRGF0YUdlbmVyYXRpb247CisgICAgaW50MzJfdCBtRmV0Y2hUaW1lZFRleHREYXRhR2VuZXJhdGlvbjsKICAgICBpbnQ2NF90IG1EdXJhdGlvblVzOwogICAgIGJvb2wgbUF1ZGlvSXNWb3JiaXM7CisgICAgYm9vbCBtSXNXaWRldmluZTsKKyAgICBib29sIG1VSURWYWxpZDsKKyAgICB1aWRfdCBtVUlEOworICAgIHNwPElNZWRpYUhUVFBTZXJ2aWNlPiBtSFRUUFNlcnZpY2U7CisgICAgQVN0cmluZyBtVXJpOworICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1VcmlIZWFkZXJzOworICAgIGludCBtRmQ7CisgICAgaW50NjRfdCBtT2Zmc2V0OworICAgIGludDY0X3QgbUxlbmd0aDsKIAotICAgIHZvaWQgaW5pdEZyb21EYXRhU291cmNlKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZkYXRhU291cmNlKTsKKyAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKKyAgICBzcDxOdUNhY2hlZFNvdXJjZTI+IG1DYWNoZWRTb3VyY2U7CisgICAgc3A8RGF0YVNvdXJjZT4gbUh0dHBTb3VyY2U7CisgICAgc3A8V1ZNRXh0cmFjdG9yPiBtV1ZNRXh0cmFjdG9yOworICAgIHNwPE1ldGFEYXRhPiBtRmlsZU1ldGE7CisgICAgRHJtTWFuYWdlckNsaWVudCAqbURybU1hbmFnZXJDbGllbnQ7CisgICAgc3A8RGVjcnlwdEhhbmRsZT4gbURlY3J5cHRIYW5kbGU7CisgICAgYm9vbCBtU3RhcnRlZDsKKyAgICBib29sIG1TdG9wUmVhZDsKKyAgICBTdHJpbmc4IG1Db250ZW50VHlwZTsKKyAgICBBU3RyaW5nIG1TbmlmZmVkTUlNRTsKKyAgICBvZmY2NF90IG1NZXRhRGF0YVNpemU7CisgICAgaW50NjRfdCBtQml0cmF0ZTsKKyAgICBpbnQzMl90IG1Qb2xsQnVmZmVyaW5nR2VuZXJhdGlvbjsKKyAgICB1aW50MzJfdCBtUGVuZGluZ1JlYWRCdWZmZXJUeXBlczsKKyAgICBtdXRhYmxlIE11dGV4IG1SZWFkQnVmZmVyTG9jazsKKyAgICBtdXRhYmxlIE11dGV4IG1EaXNjb25uZWN0TG9jazsKIAorICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CisKKyAgICB2b2lkIHJlc2V0RGF0YVNvdXJjZSgpOworCisgICAgc3RhdHVzX3QgaW5pdEZyb21EYXRhU291cmNlKCk7CisgICAgdm9pZCBjaGVja0RybVN0YXR1cyhjb25zdCBzcDxEYXRhU291cmNlPiYgZGF0YVNvdXJjZSk7CisgICAgaW50NjRfdCBnZXRMYXN0UmVhZFBvc2l0aW9uKCk7CisgICAgdm9pZCBzZXREcm1QbGF5YmFja1N0YXR1c0lmTmVlZGVkKGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbik7CisKKyAgICBzdGF0dXNfdCBwcmVmaWxsQ2FjaGVJZk5lY2Vzc2FyeSgpOworCisgICAgdm9pZCBub3RpZnlQcmVwYXJlZEFuZENsZWFudXAoc3RhdHVzX3QgZXJyKTsKKworICAgIHZvaWQgb25HZXRGb3JtYXRNZXRhKHNwPEFNZXNzYWdlPiBtc2cpIGNvbnN0OworICAgIHNwPE1ldGFEYXRhPiBkb0dldEZvcm1hdE1ldGEoYm9vbCBhdWRpbykgY29uc3Q7CisKKyAgICB2b2lkIG9uR2V0U2VsZWN0ZWRUcmFjayhzcDxBTWVzc2FnZT4gbXNnKSBjb25zdDsKKyAgICBzc2l6ZV90IGRvR2V0U2VsZWN0ZWRUcmFjayhtZWRpYV90cmFja190eXBlIHR5cGUpIGNvbnN0OworCisgICAgdm9pZCBvblNlbGVjdFRyYWNrKHNwPEFNZXNzYWdlPiBtc2cpOworICAgIHN0YXR1c190IGRvU2VsZWN0VHJhY2soc2l6ZV90IHRyYWNrSW5kZXgsIGJvb2wgc2VsZWN0KTsKKworICAgIHZvaWQgb25TZWVrKHNwPEFNZXNzYWdlPiBtc2cpOworICAgIHN0YXR1c190IGRvU2VlayhpbnQ2NF90IHNlZWtUaW1lVXMpOworCisgICAgdm9pZCBvblByZXBhcmVBc3luYygpOworCisgICAgdm9pZCBmZXRjaFRleHREYXRhKAorICAgICAgICAgICAgdWludDMyX3Qgd2hhdCwgbWVkaWFfdHJhY2tfdHlwZSB0eXBlLAorICAgICAgICAgICAgaW50MzJfdCBjdXJHZW4sIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHBhY2tldHMsIHNwPEFNZXNzYWdlPiBtc2cpOworCisgICAgdm9pZCBzZW5kVGV4dERhdGEoCisgICAgICAgICAgICB1aW50MzJfdCB3aGF0LCBtZWRpYV90cmFja190eXBlIHR5cGUsCisgICAgICAgICAgICBpbnQzMl90IGN1ckdlbiwgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gcGFja2V0cywgc3A8QU1lc3NhZ2U+IG1zZyk7CisKKyAgICBzcDxBQnVmZmVyPiBtZWRpYUJ1ZmZlclRvQUJ1ZmZlcigKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyICptYnVmLAorICAgICAgICAgICAgbWVkaWFfdHJhY2tfdHlwZSB0cmFja1R5cGUsCisgICAgICAgICAgICBpbnQ2NF90ICphY3R1YWxUaW1lVXMgPSBOVUxMKTsKKworICAgIHZvaWQgcG9zdFJlYWRCdWZmZXIobWVkaWFfdHJhY2tfdHlwZSB0cmFja1R5cGUpOworICAgIHZvaWQgb25SZWFkQnVmZmVyKHNwPEFNZXNzYWdlPiBtc2cpOwogICAgIHZvaWQgcmVhZEJ1ZmZlcigKLSAgICAgICAgICAgIGJvb2wgYXVkaW8sCi0gICAgICAgICAgICBpbnQ2NF90IHNlZWtUaW1lVXMgPSAtMWxsLCBpbnQ2NF90ICphY3R1YWxUaW1lVXMgPSBOVUxMKTsKKyAgICAgICAgICAgIG1lZGlhX3RyYWNrX3R5cGUgdHJhY2tUeXBlLAorICAgICAgICAgICAgaW50NjRfdCBzZWVrVGltZVVzID0gLTFsbCwgaW50NjRfdCAqYWN0dWFsVGltZVVzID0gTlVMTCwgYm9vbCBmb3JtYXRDaGFuZ2UgPSBmYWxzZSk7CisKKyAgICB2b2lkIHNjaGVkdWxlUG9sbEJ1ZmZlcmluZygpOworICAgIHZvaWQgY2FuY2VsUG9sbEJ1ZmZlcmluZygpOworICAgIHZvaWQgb25Qb2xsQnVmZmVyaW5nKCk7CisgICAgdm9pZCBub3RpZnlCdWZmZXJpbmdVcGRhdGUoaW50IHBlcmNlbnRhZ2UpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoR2VuZXJpY1NvdXJjZSk7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5jcHAKaW5kZXggZjE3ODJjYy4uYTAwM2M4MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvSFRUUExpdmVTb3VyY2UuY3BwCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSAiTGl2ZURhdGFTb3VyY2UuaCIKICNpbmNsdWRlICJMaXZlU2Vzc2lvbi5oIgogCisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KQEAgLTM0LDEzICszNSwxMiBAQAogCiBOdVBsYXllcjo6SFRUUExpdmVTb3VyY2U6OkhUVFBMaXZlU291cmNlKAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgY29uc3QgY2hhciAqdXJsLAotICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKLSAgICAgICAgYm9vbCB1aWRWYWxpZCwgdWlkX3QgdWlkKQorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykKICAgICA6IFNvdXJjZShub3RpZnkpLAorICAgICAgbUhUVFBTZXJ2aWNlKGh0dHBTZXJ2aWNlKSwKICAgICAgIG1VUkwodXJsKSwKLSAgICAgIG1VSURWYWxpZCh1aWRWYWxpZCksCi0gICAgICBtVUlEKHVpZCksCiAgICAgICBtRmxhZ3MoMCksCiAgICAgICBtRmluYWxSZXN1bHQoT0spLAogICAgICAgbU9mZnNldCgwKSwKQEAgLTYyLDI1ICs2MiwzMSBAQAogTnVQbGF5ZXI6OkhUVFBMaXZlU291cmNlOjp+SFRUUExpdmVTb3VyY2UoKSB7CiAgICAgaWYgKG1MaXZlU2Vzc2lvbiAhPSBOVUxMKSB7CiAgICAgICAgIG1MaXZlU2Vzc2lvbi0+ZGlzY29ubmVjdCgpOwotICAgICAgICBtTGl2ZVNlc3Npb24uY2xlYXIoKTsKIAorICAgICAgICBtTGl2ZUxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIobUxpdmVTZXNzaW9uLT5pZCgpKTsKKyAgICAgICAgbUxpdmVMb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKGlkKCkpOwogICAgICAgICBtTGl2ZUxvb3Blci0+c3RvcCgpOworCisgICAgICAgIG1MaXZlU2Vzc2lvbi5jbGVhcigpOwogICAgICAgICBtTGl2ZUxvb3Blci5jbGVhcigpOwogICAgIH0KIH0KIAogdm9pZCBOdVBsYXllcjo6SFRUUExpdmVTb3VyY2U6OnByZXBhcmVBc3luYygpIHsKLSAgICBtTGl2ZUxvb3BlciA9IG5ldyBBTG9vcGVyOwotICAgIG1MaXZlTG9vcGVyLT5zZXROYW1lKCJodHRwIGxpdmUiKTsKLSAgICBtTGl2ZUxvb3Blci0+c3RhcnQoKTsKKyAgICBpZiAobUxpdmVMb29wZXIgPT0gTlVMTCkgeworICAgICAgICBtTGl2ZUxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgICAgICBtTGl2ZUxvb3Blci0+c2V0TmFtZSgiaHR0cCBsaXZlIik7CisgICAgICAgIG1MaXZlTG9vcGVyLT5zdGFydCgpOworCisgICAgICAgIG1MaXZlTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIodGhpcyk7CisgICAgfQogCiAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFNlc3Npb25Ob3RpZnksIGlkKCkpOwogCiAgICAgbUxpdmVTZXNzaW9uID0gbmV3IExpdmVTZXNzaW9uKAogICAgICAgICAgICAgbm90aWZ5LAogICAgICAgICAgICAgKG1GbGFncyAmIGtGbGFnSW5jb2duaXRvKSA/IExpdmVTZXNzaW9uOjprRmxhZ0luY29nbml0byA6IDAsCi0gICAgICAgICAgICBtVUlEVmFsaWQsCi0gICAgICAgICAgICBtVUlEKTsKKyAgICAgICAgICAgIG1IVFRQU2VydmljZSk7CiAKICAgICBtTGl2ZUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1MaXZlU2Vzc2lvbik7CiAKQEAgLTEyMSw4ICsxMjcsMTIgQEAKICAgICByZXR1cm4gbUxpdmVTZXNzaW9uLT5nZXREdXJhdGlvbihkdXJhdGlvblVzKTsKIH0KIAotc3RhdHVzX3QgTnVQbGF5ZXI6OkhUVFBMaXZlU291cmNlOjpnZXRUcmFja0luZm8oUGFyY2VsICpyZXBseSkgY29uc3QgewotICAgIHJldHVybiBtTGl2ZVNlc3Npb24tPmdldFRyYWNrSW5mbyhyZXBseSk7CitzaXplX3QgTnVQbGF5ZXI6OkhUVFBMaXZlU291cmNlOjpnZXRUcmFja0NvdW50KCkgY29uc3QgeworICAgIHJldHVybiBtTGl2ZVNlc3Npb24tPmdldFRyYWNrQ291bnQoKTsKK30KKworc3A8QU1lc3NhZ2U+IE51UGxheWVyOjpIVFRQTGl2ZVNvdXJjZTo6Z2V0VHJhY2tJbmZvKHNpemVfdCB0cmFja0luZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIG1MaXZlU2Vzc2lvbi0+Z2V0VHJhY2tJbmZvKHRyYWNrSW5kZXgpOwogfQogCiBzdGF0dXNfdCBOdVBsYXllcjo6SFRUUExpdmVTb3VyY2U6OnNlbGVjdFRyYWNrKHNpemVfdCB0cmFja0luZGV4LCBib29sIHNlbGVjdCkgewpAQCAtMTQwLDcgKzE1MCw3IEBACiAgICAgLy8gTGl2ZVNlc3Npb246OnNlbGVjdFRyYWNrIHJldHVybnMgQkFEX1ZBTFVFIHdoZW4gc2VsZWN0aW5nIHRoZSBjdXJyZW50bHkKICAgICAvLyBzZWxlY3RlZCB0cmFjaywgb3IgdW5zZWxlY3RpbmcgYSBub24tc2VsZWN0ZWQgdHJhY2suIEluIHRoaXMgY2FzZSBpdCdzIGFuCiAgICAgLy8gbm8tb3Agc28gd2UgcmV0dXJuIE9LLgotICAgIHJldHVybiAoZXJyID09IE9LIHx8IGVyciA9PSBCQURfVkFMVUUpID8gT0sgOiBlcnI7CisgICAgcmV0dXJuIChlcnIgPT0gT0sgfHwgZXJyID09IEJBRF9WQUxVRSkgPyAoc3RhdHVzX3QpT0sgOiBlcnI7CiB9CiAKIHN0YXR1c190IE51UGxheWVyOjpIVFRQTGl2ZVNvdXJjZTo6c2Vla1RvKGludDY0X3Qgc2Vla1RpbWVVcykgewpAQCAtMjA3LDkgKzIxNyw5IEBACiAgICAgICAgICAgICBpbnQzMl90IGhlaWdodDsKICAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gTlVMTCAmJgogICAgICAgICAgICAgICAgICAgICBmb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpICYmIGZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSkgewotICAgICAgICAgICAgICAgIG5vdGlmeVZpZGVvU2l6ZUNoYW5nZWQod2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgbm90aWZ5VmlkZW9TaXplQ2hhbmdlZChmb3JtYXQpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBub3RpZnlWaWRlb1NpemVDaGFuZ2VkKDAsIDApOworICAgICAgICAgICAgICAgIG5vdGlmeVZpZGVvU2l6ZUNoYW5nZWQoKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSBGTEFHX0NBTl9QQVVTRTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmgKaW5kZXggYmNjM2Y4Yi4uNmI1ZjZhZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmgKQEAgLTI4LDEwICsyOCw5IEBACiBzdHJ1Y3QgTnVQbGF5ZXI6OkhUVFBMaXZlU291cmNlIDogcHVibGljIE51UGxheWVyOjpTb3VyY2UgewogICAgIEhUVFBMaXZlU291cmNlKAogICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAotICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCi0gICAgICAgICAgICBib29sIHVpZFZhbGlkID0gZmFsc2UsCi0gICAgICAgICAgICB1aWRfdCB1aWQgPSAwKTsKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKIAogICAgIHZpcnR1YWwgdm9pZCBwcmVwYXJlQXN5bmMoKTsKICAgICB2aXJ0dWFsIHZvaWQgc3RhcnQoKTsKQEAgLTQxLDcgKzQwLDggQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZmVlZE1vcmVUU0RhdGEoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tJbmZvKFBhcmNlbCAqcmVwbHkpIGNvbnN0OworICAgIHZpcnR1YWwgc2l6ZV90IGdldFRyYWNrQ291bnQoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHNwPEFNZXNzYWdlPiBnZXRUcmFja0luZm8oc2l6ZV90IHRyYWNrSW5kZXgpIGNvbnN0OwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2VsZWN0VHJhY2soc2l6ZV90IHRyYWNrSW5kZXgsIGJvb2wgc2VsZWN0KTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNlZWtUbyhpbnQ2NF90IHNlZWtUaW1lVXMpOwogCkBAIC02MSwxMCArNjEsOSBAQAogICAgICAgICBrV2hhdEZldGNoU3VidGl0bGVEYXRhLAogICAgIH07CiAKKyAgICBzcDxJTWVkaWFIVFRQU2VydmljZT4gbUhUVFBTZXJ2aWNlOwogICAgIEFTdHJpbmcgbVVSTDsKICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtRXh0cmFIZWFkZXJzOwotICAgIGJvb2wgbVVJRFZhbGlkOwotICAgIHVpZF90IG1VSUQ7CiAgICAgdWludDMyX3QgbUZsYWdzOwogICAgIHN0YXR1c190IG1GaW5hbFJlc3VsdDsKICAgICBvZmY2NF90IG1PZmZzZXQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcAppbmRleCAyNWQ1NWEzLi5hNjNhOTQwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5jcHAKQEAgLTIyLDI0ICsyMiwyMiBAQAogCiAjaW5jbHVkZSAiSFRUUExpdmVTb3VyY2UuaCIKICNpbmNsdWRlICJOdVBsYXllckRlY29kZXIuaCIKKyNpbmNsdWRlICJOdVBsYXllckRlY29kZXJQYXNzVGhyb3VnaC5oIgogI2luY2x1ZGUgIk51UGxheWVyRHJpdmVyLmgiCiAjaW5jbHVkZSAiTnVQbGF5ZXJSZW5kZXJlci5oIgogI2luY2x1ZGUgIk51UGxheWVyU291cmNlLmgiCiAjaW5jbHVkZSAiUlRTUFNvdXJjZS5oIgogI2luY2x1ZGUgIlN0cmVhbWluZ1NvdXJjZS5oIgogI2luY2x1ZGUgIkdlbmVyaWNTb3VyY2UuaCIKLSNpbmNsdWRlICJtcDQvTVA0U291cmNlLmgiCisjaW5jbHVkZSAiVGV4dERlc2NyaXB0aW9ucy5oIgogCiAjaW5jbHVkZSAiQVRTUGFyc2VyLmgiCiAKLSNpbmNsdWRlICJTb2Z0d2FyZVJlbmRlcmVyLmgiCi0KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPiAvLyBmb3IgcHJvcGVydHlfZ2V0CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CkBAIC01Miw2ICs1MCwxMCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKKy8vIFRPRE8gb3B0aW1pemUgYnVmZmVyIHNpemUgZm9yIHBvd2VyIGNvbnN1bXB0aW9uCisvLyBUaGUgb2ZmbG9hZCByZWFkIGJ1ZmZlciBzaXplIGlzIDMyIEtCIGJ1dCAyNCBLQiB1c2VzIGxlc3MgcG93ZXIuCitjb25zdCBzaXplX3QgTnVQbGF5ZXI6OmtBZ2dyZWdhdGVCdWZmZXJTaXplQnl0ZXMgPSAyNCAqIDEwMjQ7CisKIHN0cnVjdCBOdVBsYXllcjo6QWN0aW9uIDogcHVibGljIFJlZkJhc2UgewogICAgIEFjdGlvbigpIHt9CiAKQEAgLTYyLDE2ICs2NCwxOCBAQAogfTsKIAogc3RydWN0IE51UGxheWVyOjpTZWVrQWN0aW9uIDogcHVibGljIEFjdGlvbiB7Ci0gICAgU2Vla0FjdGlvbihpbnQ2NF90IHNlZWtUaW1lVXMpCi0gICAgICAgIDogbVNlZWtUaW1lVXMoc2Vla1RpbWVVcykgeworICAgIFNlZWtBY3Rpb24oaW50NjRfdCBzZWVrVGltZVVzLCBib29sIG5lZWROb3RpZnkpCisgICAgICAgIDogbVNlZWtUaW1lVXMoc2Vla1RpbWVVcyksCisgICAgICAgICAgbU5lZWROb3RpZnkobmVlZE5vdGlmeSkgewogICAgIH0KIAogICAgIHZpcnR1YWwgdm9pZCBleGVjdXRlKE51UGxheWVyICpwbGF5ZXIpIHsKLSAgICAgICAgcGxheWVyLT5wZXJmb3JtU2VlayhtU2Vla1RpbWVVcyk7CisgICAgICAgIHBsYXllci0+cGVyZm9ybVNlZWsobVNlZWtUaW1lVXMsIG1OZWVkTm90aWZ5KTsKICAgICB9CiAKIHByaXZhdGU6CiAgICAgaW50NjRfdCBtU2Vla1RpbWVVczsKKyAgICBib29sIG1OZWVkTm90aWZ5OwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2Vla0FjdGlvbik7CiB9OwpAQCAtMTQ4LDIyICsxNTIsMjYgQEAKICAgICA6IG1VSURWYWxpZChmYWxzZSksCiAgICAgICBtU291cmNlRmxhZ3MoMCksCiAgICAgICBtVmlkZW9Jc0FWQyhmYWxzZSksCi0gICAgICBtTmVlZHNTd1JlbmRlcmVyKGZhbHNlKSwKKyAgICAgIG1PZmZsb2FkQXVkaW8oZmFsc2UpLAorICAgICAgbUF1ZGlvRGVjb2RlckdlbmVyYXRpb24oMCksCisgICAgICBtVmlkZW9EZWNvZGVyR2VuZXJhdGlvbigwKSwKKyAgICAgIG1SZW5kZXJlckdlbmVyYXRpb24oMCksCiAgICAgICBtQXVkaW9FT1MoZmFsc2UpLAogICAgICAgbVZpZGVvRU9TKGZhbHNlKSwKICAgICAgIG1TY2FuU291cmNlc1BlbmRpbmcoZmFsc2UpLAogICAgICAgbVNjYW5Tb3VyY2VzR2VuZXJhdGlvbigwKSwKICAgICAgIG1Qb2xsRHVyYXRpb25HZW5lcmF0aW9uKDApLAorICAgICAgbVRpbWVkVGV4dEdlbmVyYXRpb24oMCksCiAgICAgICBtVGltZURpc2NvbnRpbnVpdHlQZW5kaW5nKGZhbHNlKSwKICAgICAgIG1GbHVzaGluZ0F1ZGlvKE5PTkUpLAogICAgICAgbUZsdXNoaW5nVmlkZW8oTk9ORSksCiAgICAgICBtU2tpcFJlbmRlcmluZ0F1ZGlvVW50aWxNZWRpYVRpbWVVcygtMWxsKSwKICAgICAgIG1Ta2lwUmVuZGVyaW5nVmlkZW9VbnRpbE1lZGlhVGltZVVzKC0xbGwpLAotICAgICAgbVZpZGVvTGF0ZUJ5VXMoMGxsKSwKICAgICAgIG1OdW1GcmFtZXNUb3RhbCgwbGwpLAogICAgICAgbU51bUZyYW1lc0Ryb3BwZWQoMGxsKSwKICAgICAgIG1WaWRlb1NjYWxpbmdNb2RlKE5BVElWRV9XSU5ET1dfU0NBTElOR19NT0RFX1NDQUxFX1RPX1dJTkRPVyksCiAgICAgICBtU3RhcnRlZChmYWxzZSkgeworICAgIGNsZWFyRmx1c2hDb21wbGV0ZSgpOwogfQogCiBOdVBsYXllcjo6fk51UGxheWVyKCkgewpAQCAtMTgzLDE0ICsxOTEsNyBAQAogCiAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFNvdXJjZU5vdGlmeSwgaWQoKSk7CiAKLSAgICBjaGFyIHByb3BbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICBpZiAocHJvcGVydHlfZ2V0KCJtZWRpYS5zdGFnZWZyaWdodC51c2UtbXA0c291cmNlIiwgcHJvcCwgTlVMTCkKLSAgICAgICAgICAgICYmICghc3RyY21wKHByb3AsICIxIikgfHwgIXN0cmNhc2VjbXAocHJvcCwgInRydWUiKSkpIHsKLSAgICAgICAgbXNnLT5zZXRPYmplY3QoInNvdXJjZSIsIG5ldyBNUDRTb3VyY2Uobm90aWZ5LCBzb3VyY2UpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtc2ctPnNldE9iamVjdCgic291cmNlIiwgbmV3IFN0cmVhbWluZ1NvdXJjZShub3RpZnksIHNvdXJjZSkpOwotICAgIH0KLQorICAgIG1zZy0+c2V0T2JqZWN0KCJzb3VyY2UiLCBuZXcgU3RyZWFtaW5nU291cmNlKG5vdGlmeSwgc291cmNlKSk7CiAgICAgbXNnLT5wb3N0KCk7CiB9CiAKQEAgLTIxMiw3ICsyMTMsMTAgQEAKIH0KIAogdm9pZCBOdVBsYXllcjo6c2V0RGF0YVNvdXJjZUFzeW5jKAotICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKKwogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXREYXRhU291cmNlLCBpZCgpKTsKICAgICBzaXplX3QgbGVuID0gc3RybGVuKHVybCk7CiAKQEAgLTIyMCwxOCArMjI0LDMxIEBACiAKICAgICBzcDxTb3VyY2U+IHNvdXJjZTsKICAgICBpZiAoSXNIVFRQTGl2ZVVSTCh1cmwpKSB7Ci0gICAgICAgIHNvdXJjZSA9IG5ldyBIVFRQTGl2ZVNvdXJjZShub3RpZnksIHVybCwgaGVhZGVycywgbVVJRFZhbGlkLCBtVUlEKTsKKyAgICAgICAgc291cmNlID0gbmV3IEhUVFBMaXZlU291cmNlKG5vdGlmeSwgaHR0cFNlcnZpY2UsIHVybCwgaGVhZGVycyk7CiAgICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAodXJsLCAicnRzcDovLyIsIDcpKSB7Ci0gICAgICAgIHNvdXJjZSA9IG5ldyBSVFNQU291cmNlKG5vdGlmeSwgdXJsLCBoZWFkZXJzLCBtVUlEVmFsaWQsIG1VSUQpOworICAgICAgICBzb3VyY2UgPSBuZXcgUlRTUFNvdXJjZSgKKyAgICAgICAgICAgICAgICBub3RpZnksIGh0dHBTZXJ2aWNlLCB1cmwsIGhlYWRlcnMsIG1VSURWYWxpZCwgbVVJRCk7CiAgICAgfSBlbHNlIGlmICgoIXN0cm5jYXNlY21wKHVybCwgImh0dHA6Ly8iLCA3KQogICAgICAgICAgICAgICAgIHx8ICFzdHJuY2FzZWNtcCh1cmwsICJodHRwczovLyIsIDgpKQogICAgICAgICAgICAgICAgICAgICAmJiAoKGxlbiA+PSA0ICYmICFzdHJjYXNlY21wKCIuc2RwIiwgJnVybFtsZW4gLSA0XSkpCiAgICAgICAgICAgICAgICAgICAgIHx8IHN0cnN0cih1cmwsICIuc2RwPyIpKSkgewotICAgICAgICBzb3VyY2UgPSBuZXcgUlRTUFNvdXJjZShub3RpZnksIHVybCwgaGVhZGVycywgbVVJRFZhbGlkLCBtVUlELCB0cnVlKTsKKyAgICAgICAgc291cmNlID0gbmV3IFJUU1BTb3VyY2UoCisgICAgICAgICAgICAgICAgbm90aWZ5LCBodHRwU2VydmljZSwgdXJsLCBoZWFkZXJzLCBtVUlEVmFsaWQsIG1VSUQsIHRydWUpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHNvdXJjZSA9IG5ldyBHZW5lcmljU291cmNlKG5vdGlmeSwgdXJsLCBoZWFkZXJzLCBtVUlEVmFsaWQsIG1VSUQpOwotICAgIH0KKyAgICAgICAgc3A8R2VuZXJpY1NvdXJjZT4gZ2VuZXJpY1NvdXJjZSA9CisgICAgICAgICAgICAgICAgbmV3IEdlbmVyaWNTb3VyY2Uobm90aWZ5LCBtVUlEVmFsaWQsIG1VSUQpOworICAgICAgICAvLyBEb24ndCBzZXQgRkxBR19TRUNVUkUgb24gbVNvdXJjZUZsYWdzIGhlcmUgZm9yIHdpZGV2aW5lLgorICAgICAgICAvLyBUaGUgY29ycmVjdCBmbGFncyB3aWxsIGJlIHVwZGF0ZWQgaW4gU291cmNlOjprV2hhdEZsYWdzQ2hhbmdlZAorICAgICAgICAvLyBoYW5kbGVyIHdoZW4gIEdlbmVyaWNTb3VyY2UgaXMgcHJlcGFyZWQuCiAKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gZ2VuZXJpY1NvdXJjZS0+c2V0RGF0YVNvdXJjZShodHRwU2VydmljZSwgdXJsLCBoZWFkZXJzKTsKKworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICBzb3VyY2UgPSBnZW5lcmljU291cmNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgZGF0YSBzb3VyY2UhIik7CisgICAgICAgIH0KKyAgICB9CiAgICAgbXNnLT5zZXRPYmplY3QoInNvdXJjZSIsIHNvdXJjZSk7CiAgICAgbXNnLT5wb3N0KCk7CiB9CkBAIC0yNDEsNyArMjU4LDE2IEBACiAKICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0U291cmNlTm90aWZ5LCBpZCgpKTsKIAotICAgIHNwPFNvdXJjZT4gc291cmNlID0gbmV3IEdlbmVyaWNTb3VyY2Uobm90aWZ5LCBmZCwgb2Zmc2V0LCBsZW5ndGgpOworICAgIHNwPEdlbmVyaWNTb3VyY2U+IHNvdXJjZSA9CisgICAgICAgICAgICBuZXcgR2VuZXJpY1NvdXJjZShub3RpZnksIG1VSURWYWxpZCwgbVVJRCk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBzb3VyY2UtPnNldERhdGFTb3VyY2UoZmQsIG9mZnNldCwgbGVuZ3RoKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgZGF0YSBzb3VyY2UhIik7CisgICAgICAgIHNvdXJjZSA9IE5VTEw7CisgICAgfQorCiAgICAgbXNnLT5zZXRPYmplY3QoInNvdXJjZSIsIHNvdXJjZSk7CiAgICAgbXNnLT5wb3N0KCk7CiB9CkBAIC0yNjAsNyArMjg2LDcgQEAKICAgICAgICAgbXNnLT5zZXRPYmplY3QoCiAgICAgICAgICAgICAgICAgIm5hdGl2ZS13aW5kb3ciLAogICAgICAgICAgICAgICAgIG5ldyBOYXRpdmVXaW5kb3dXcmFwcGVyKAotICAgICAgICAgICAgICAgICAgICBuZXcgU3VyZmFjZShidWZmZXJQcm9kdWNlcikpKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3IFN1cmZhY2UoYnVmZmVyUHJvZHVjZXIsIHRydWUgLyogY29udHJvbGxlZEJ5QXBwICovKSkpOwogICAgIH0KIAogICAgIG1zZy0+cG9zdCgpOwpAQCAtMjg1LDMyICszMTEsNTIgQEAKIH0KIAogdm9pZCBOdVBsYXllcjo6cmVzZXRBc3luYygpIHsKKyAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIC8vIER1cmluZyBhIHJlc2V0LCB0aGUgZGF0YSBzb3VyY2UgbWlnaHQgYmUgdW5yZXNwb25zaXZlIGFscmVhZHksIHdlIG5lZWQgdG8KKyAgICAgICAgLy8gZGlzY29ubmVjdCBleHBsaWNpdGx5IHNvIHRoYXQgcmVhZHMgZXhpdCBwcm9tcHRseS4KKyAgICAgICAgLy8gV2UgY2FuJ3QgcXVldWUgdGhlIGRpc2Nvbm5lY3QgcmVxdWVzdCB0byB0aGUgbG9vcGVyLCBhcyBpdCBtaWdodCBiZQorICAgICAgICAvLyBxdWV1ZWQgYmVoaW5kIGEgc3R1Y2sgcmVhZCBhbmQgbmV2ZXIgZ2V0cyBwcm9jZXNzZWQuCisgICAgICAgIC8vIERvaW5nIGEgZGlzY29ubmVjdCBvdXRzaWRlIHRoZSBsb29wZXIgdG8gYWxsb3dzIHRoZSBwZW5kaW5nIHJlYWRzIHRvIGV4aXQKKyAgICAgICAgLy8gKGVpdGhlciBzdWNjZXNzZnVsbHkgb3Igd2l0aCBlcnJvcikuCisgICAgICAgIG1Tb3VyY2UtPmRpc2Nvbm5lY3QoKTsKKyAgICB9CisKICAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVzZXQsIGlkKCkpKS0+cG9zdCgpOwogfQogCi12b2lkIE51UGxheWVyOjpzZWVrVG9Bc3luYyhpbnQ2NF90IHNlZWtUaW1lVXMpIHsKK3ZvaWQgTnVQbGF5ZXI6OnNlZWtUb0FzeW5jKGludDY0X3Qgc2Vla1RpbWVVcywgYm9vbCBuZWVkTm90aWZ5KSB7CiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlZWssIGlkKCkpOwogICAgIG1zZy0+c2V0SW50NjQoInNlZWtUaW1lVXMiLCBzZWVrVGltZVVzKTsKKyAgICBtc2ctPnNldEludDMyKCJuZWVkTm90aWZ5IiwgbmVlZE5vdGlmeSk7CiAgICAgbXNnLT5wb3N0KCk7CiB9CiAKLS8vIHN0YXRpYwotYm9vbCBOdVBsYXllcjo6SXNGbHVzaGluZ1N0YXRlKEZsdXNoU3RhdHVzIHN0YXRlLCBib29sICpuZWVkU2h1dGRvd24pIHsKLSAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgIGNhc2UgRkxVU0hJTkdfREVDT0RFUjoKLSAgICAgICAgICAgIGlmIChuZWVkU2h1dGRvd24gIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICpuZWVkU2h1dGRvd24gPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwogCi0gICAgICAgIGNhc2UgRkxVU0hJTkdfREVDT0RFUl9TSFVURE9XTjoKLSAgICAgICAgICAgIGlmIChuZWVkU2h1dGRvd24gIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICpuZWVkU2h1dGRvd24gPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Cit2b2lkIE51UGxheWVyOjp3cml0ZVRyYWNrSW5mbygKKyAgICAgICAgUGFyY2VsKiByZXBseSwgY29uc3Qgc3A8QU1lc3NhZ2U+IGZvcm1hdCkgY29uc3QgeworICAgIGludDMyX3QgdHJhY2tUeXBlOworICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJ0eXBlIiwgJnRyYWNrVHlwZSkpOwogCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgQVN0cmluZyBsYW5nOworICAgIENIRUNLKGZvcm1hdC0+ZmluZFN0cmluZygibGFuZ3VhZ2UiLCAmbGFuZykpOworCisgICAgcmVwbHktPndyaXRlSW50MzIoMik7IC8vIHdyaXRlIHNvbWV0aGluZyBub24temVybworICAgIHJlcGx5LT53cml0ZUludDMyKHRyYWNrVHlwZSk7CisgICAgcmVwbHktPndyaXRlU3RyaW5nMTYoU3RyaW5nMTYobGFuZy5jX3N0cigpKSk7CisKKyAgICBpZiAodHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEUpIHsKKyAgICAgICAgQVN0cmluZyBtaW1lOworICAgICAgICBDSEVDSyhmb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOworCisgICAgICAgIGludDMyX3QgaXNBdXRvLCBpc0RlZmF1bHQsIGlzRm9yY2VkOworICAgICAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigiYXV0byIsICZpc0F1dG8pKTsKKyAgICAgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoImRlZmF1bHQiLCAmaXNEZWZhdWx0KSk7CisgICAgICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJmb3JjZWQiLCAmaXNGb3JjZWQpKTsKKworICAgICAgICByZXBseS0+d3JpdGVTdHJpbmcxNihTdHJpbmcxNihtaW1lLmNfc3RyKCkpKTsKKyAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaXNBdXRvKTsKKyAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaXNEZWZhdWx0KTsKKyAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaXNGb3JjZWQpOwogICAgIH0KIH0KIApAQCAtMzIyLDE3ICszNjgsMTkgQEAKIAogICAgICAgICAgICAgQ0hFQ0sobVNvdXJjZSA9PSBOVUxMKTsKIAorICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7CiAgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoInNvdXJjZSIsICZvYmopKTsKLQotICAgICAgICAgICAgbVNvdXJjZSA9IHN0YXRpY19jYXN0PFNvdXJjZSAqPihvYmouZ2V0KCkpOwotCi0gICAgICAgICAgICBsb29wZXIoKS0+cmVnaXN0ZXJIYW5kbGVyKG1Tb3VyY2UpOworICAgICAgICAgICAgaWYgKG9iaiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbVNvdXJjZSA9IHN0YXRpY19jYXN0PFNvdXJjZSAqPihvYmouZ2V0KCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBDSEVDSyhtRHJpdmVyICE9IE5VTEwpOwogICAgICAgICAgICAgc3A8TnVQbGF5ZXJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOwogICAgICAgICAgICAgaWYgKGRyaXZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlTZXREYXRhU291cmNlQ29tcGxldGVkKE9LKTsKKyAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVNldERhdGFTb3VyY2VDb21wbGV0ZWQoZXJyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0zNDgsMTYgKzM5Niw1OCBAQAogICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAorICAgICAgICAgICAgUGFyY2VsKiByZXBseTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFBvaW50ZXIoInJlcGx5IiwgKHZvaWQqKikmcmVwbHkpKTsKKworICAgICAgICAgICAgc2l6ZV90IGluYmFuZFRyYWNrcyA9IDA7CisgICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaW5iYW5kVHJhY2tzID0gbVNvdXJjZS0+Z2V0VHJhY2tDb3VudCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzaXplX3QgY2NUcmFja3MgPSAwOworICAgICAgICAgICAgaWYgKG1DQ0RlY29kZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGNjVHJhY2tzID0gbUNDRGVjb2Rlci0+Z2V0VHJhY2tDb3VudCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB0b3RhbCB0cmFjayBjb3VudAorICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaW5iYW5kVHJhY2tzICsgY2NUcmFja3MpOworCisgICAgICAgICAgICAvLyB3cml0ZSBpbmJhbmQgdHJhY2tzCisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluYmFuZFRyYWNrczsgKytpKSB7CisgICAgICAgICAgICAgICAgd3JpdGVUcmFja0luZm8ocmVwbHksIG1Tb3VyY2UtPmdldFRyYWNrSW5mbyhpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHdyaXRlIENDIHRyYWNrCisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNjVHJhY2tzOyArK2kpIHsKKyAgICAgICAgICAgICAgICB3cml0ZVRyYWNrSW5mbyhyZXBseSwgbUNDRGVjb2Rlci0+Z2V0VHJhY2tJbmZvKGkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdEdldFNlbGVjdGVkVHJhY2s6CisgICAgICAgIHsKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGVyciA9IE9LOworCisgICAgICAgICAgICAgICAgaW50MzJfdCB0eXBlMzI7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInR5cGUiLCAoaW50MzJfdCopJnR5cGUzMikpOworICAgICAgICAgICAgICAgIG1lZGlhX3RyYWNrX3R5cGUgdHlwZSA9IChtZWRpYV90cmFja190eXBlKXR5cGUzMjsKKyAgICAgICAgICAgICAgICBzc2l6ZV90IHNlbGVjdGVkVHJhY2sgPSBtU291cmNlLT5nZXRTZWxlY3RlZFRyYWNrKHR5cGUpOworCiAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseTsKICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJyZXBseSIsICh2b2lkKiopJnJlcGx5KSk7Ci0gICAgICAgICAgICAgICAgZXJyID0gbVNvdXJjZS0+Z2V0VHJhY2tJbmZvKHJlcGx5KTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZWxlY3RlZFRyYWNrKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwogICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOwogCisgICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0zNjcsMTMgKzQ1Nyw0MCBAQAogICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAorICAgICAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXg7CisgICAgICAgICAgICBpbnQzMl90IHNlbGVjdDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFNpemUoInRyYWNrSW5kZXgiLCAmdHJhY2tJbmRleCkpOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInNlbGVjdCIsICZzZWxlY3QpKTsKKwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gSU5WQUxJRF9PUEVSQVRJT047CisKKyAgICAgICAgICAgIHNpemVfdCBpbmJhbmRUcmFja3MgPSAwOwogICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHNpemVfdCB0cmFja0luZGV4OwotICAgICAgICAgICAgICAgIGludDMyX3Qgc2VsZWN0OwotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFNpemUoInRyYWNrSW5kZXgiLCAmdHJhY2tJbmRleCkpOwotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzZWxlY3QiLCAmc2VsZWN0KSk7CisgICAgICAgICAgICAgICAgaW5iYW5kVHJhY2tzID0gbVNvdXJjZS0+Z2V0VHJhY2tDb3VudCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2l6ZV90IGNjVHJhY2tzID0gMDsKKyAgICAgICAgICAgIGlmIChtQ0NEZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBjY1RyYWNrcyA9IG1DQ0RlY29kZXItPmdldFRyYWNrQ291bnQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRyYWNrSW5kZXggPCBpbmJhbmRUcmFja3MpIHsKICAgICAgICAgICAgICAgICBlcnIgPSBtU291cmNlLT5zZWxlY3RUcmFjayh0cmFja0luZGV4LCBzZWxlY3QpOworCisgICAgICAgICAgICAgICAgaWYgKCFzZWxlY3QgJiYgZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdHlwZTsKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGluZm8gPSBtU291cmNlLT5nZXRUcmFja0luZm8odHJhY2tJbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvICE9IE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmZvLT5maW5kSW50MzIoInR5cGUiLCAmdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0eXBlID09IE1FRElBX1RSQUNLX1RZUEVfVElNRURURVhUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICArK21UaW1lZFRleHRHZW5lcmF0aW9uOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0cmFja0luZGV4IC09IGluYmFuZFRyYWNrczsKKworICAgICAgICAgICAgICAgIGlmICh0cmFja0luZGV4IDwgY2NUcmFja3MpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gbUNDRGVjb2Rlci0+c2VsZWN0VHJhY2sodHJhY2tJbmRleCwgc2VsZWN0KTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKQEAgLTQyMSw2ICs1MzgsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PE5hdGl2ZVdpbmRvd1dyYXBwZXIgKj4ob2JqLmdldCgpKSkpOwogCiAgICAgICAgICAgICBpZiAob2JqICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAobVN0YXJ0ZWQgJiYgbVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElzc3VlIGEgc2VlayB0byByZWZyZXNoIHRoZSB2aWRlbyBzY3JlZW4gb25seSBpZiBzdGFydGVkIG90aGVyd2lzZQorICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZXh0cmFjdG9yIG1heSBub3QgeWV0IGJlIHN0YXJ0ZWQgYW5kIHdpbGwgYXNzZXJ0LgorICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdmlkZW8gZGVjb2RlciBpcyBub3Qgc2V0IChwZXJoYXBzIGF1ZGlvIG9ubHkgaW4gdGhpcyBjYXNlKQorICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgcGVyZm9ybSBhIHNlZWsgYXMgaXQgaXMgbm90IG5lZWRlZC4KKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjdXJyZW50UG9zaXRpb25VcyA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmIChnZXRDdXJyZW50UG9zaXRpb24oJmN1cnJlbnRQb3NpdGlvblVzKSA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTZWVrQWN0aW9uKGN1cnJlbnRQb3NpdGlvblVzLCBmYWxzZSAvKiBuZWVkTm90aWZ5ICovKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIG5ldyBzdXJmYWNlIHRleHR1cmUsIGluc3RhbnRpYXRlIGRlY29kZXJzCiAgICAgICAgICAgICAgICAgLy8gYWdhaW4gaWYgcG9zc2libGUuCiAgICAgICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCkBAIC00NDcsMTYgKzU3NiwyNiBAQAogICAgICAgICAgICAgQUxPR1YoImtXaGF0U3RhcnQiKTsKIAogICAgICAgICAgICAgbVZpZGVvSXNBVkMgPSBmYWxzZTsKLSAgICAgICAgICAgIG1OZWVkc1N3UmVuZGVyZXIgPSBmYWxzZTsKKyAgICAgICAgICAgIG1PZmZsb2FkQXVkaW8gPSBmYWxzZTsKICAgICAgICAgICAgIG1BdWRpb0VPUyA9IGZhbHNlOwogICAgICAgICAgICAgbVZpZGVvRU9TID0gZmFsc2U7CiAgICAgICAgICAgICBtU2tpcFJlbmRlcmluZ0F1ZGlvVW50aWxNZWRpYVRpbWVVcyA9IC0xOwogICAgICAgICAgICAgbVNraXBSZW5kZXJpbmdWaWRlb1VudGlsTWVkaWFUaW1lVXMgPSAtMTsKLSAgICAgICAgICAgIG1WaWRlb0xhdGVCeVVzID0gMDsKICAgICAgICAgICAgIG1OdW1GcmFtZXNUb3RhbCA9IDA7CiAgICAgICAgICAgICBtTnVtRnJhbWVzRHJvcHBlZCA9IDA7CiAgICAgICAgICAgICBtU3RhcnRlZCA9IHRydWU7CiAKKyAgICAgICAgICAgIC8qIGluc3RhbnRpYXRlIGRlY29kZXJzIG5vdyBmb3Igc2VjdXJlIHBsYXliYWNrICovCisgICAgICAgICAgICBpZiAobVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX1NFQ1VSRSkgeworICAgICAgICAgICAgICAgIGlmIChtTmF0aXZlV2luZG93ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5zdGFudGlhdGVEZWNvZGVyKGZhbHNlLCAmbVZpZGVvRGVjb2Rlcik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1BdWRpb1NpbmsgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZURlY29kZXIodHJ1ZSwgJm1BdWRpb0RlY29kZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgbVNvdXJjZS0+c3RhcnQoKTsKIAogICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOwpAQCAtNDY1LDEyICs2MDQsMzcgQEAKICAgICAgICAgICAgICAgICBmbGFncyB8PSBSZW5kZXJlcjo6RkxBR19SRUFMX1RJTUU7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1SZW5kZXJlciA9IG5ldyBSZW5kZXJlcigKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvU2luaywKLSAgICAgICAgICAgICAgICAgICAgbmV3IEFNZXNzYWdlKGtXaGF0UmVuZGVyZXJOb3RpZnksIGlkKCkpLAotICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgICAgICAgICBzcDxNZXRhRGF0YT4gYXVkaW9NZXRhID0gbVNvdXJjZS0+Z2V0Rm9ybWF0TWV0YSh0cnVlIC8qIGF1ZGlvICovKTsKKyAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9NVVNJQzsKKyAgICAgICAgICAgIGlmIChtQXVkaW9TaW5rICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBzdHJlYW1UeXBlID0gbUF1ZGlvU2luay0+Z2V0QXVkaW9TdHJlYW1UeXBlKCk7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGxvb3BlcigpLT5yZWdpc3RlckhhbmRsZXIobVJlbmRlcmVyKTsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiB2aWRlb0Zvcm1hdCA9IG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLyk7CisKKyAgICAgICAgICAgIG1PZmZsb2FkQXVkaW8gPQorICAgICAgICAgICAgICAgIGNhbk9mZmxvYWRTdHJlYW0oYXVkaW9NZXRhLCAodmlkZW9Gb3JtYXQgIT0gTlVMTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGlzX3N0cmVhbWluZyAqLywgc3RyZWFtVHlwZSk7CisgICAgICAgICAgICBpZiAobU9mZmxvYWRBdWRpbykgeworICAgICAgICAgICAgICAgIGZsYWdzIHw9IFJlbmRlcmVyOjpGTEFHX09GRkxPQURfQVVESU87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZW5kZXJlck5vdGlmeSwgaWQoKSk7CisgICAgICAgICAgICArK21SZW5kZXJlckdlbmVyYXRpb247CisgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVJlbmRlcmVyR2VuZXJhdGlvbik7CisgICAgICAgICAgICBtUmVuZGVyZXIgPSBuZXcgUmVuZGVyZXIobUF1ZGlvU2luaywgbm90aWZ5LCBmbGFncyk7CisKKyAgICAgICAgICAgIG1SZW5kZXJlckxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgICAgICAgICAgbVJlbmRlcmVyTG9vcGVyLT5zZXROYW1lKCJOdVBsYXllclJlbmRlcmVyIik7CisgICAgICAgICAgICBtUmVuZGVyZXJMb29wZXItPnN0YXJ0KGZhbHNlLCBmYWxzZSwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7CisgICAgICAgICAgICBtUmVuZGVyZXJMb29wZXItPnJlZ2lzdGVySGFuZGxlcihtUmVuZGVyZXIpOworCisgICAgICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IGdldEZpbGVNZXRhKCk7CisgICAgICAgICAgICBpbnQzMl90IHJhdGU7CisgICAgICAgICAgICBpZiAobWV0YSAhPSBOVUxMCisgICAgICAgICAgICAgICAgICAgICYmIG1ldGEtPmZpbmRJbnQzMihrS2V5RnJhbWVSYXRlLCAmcmF0ZSkgJiYgcmF0ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBtUmVuZGVyZXItPnNldFZpZGVvRnJhbWVSYXRlKHJhdGUpOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBwb3N0U2NhblNvdXJjZXMoKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNDkzLDExICs2NTcsMTggQEAKICAgICAgICAgICAgIGJvb2wgbUhhZEFueVNvdXJjZXNCZWZvcmUgPQogICAgICAgICAgICAgICAgIChtQXVkaW9EZWNvZGVyICE9IE5VTEwpIHx8IChtVmlkZW9EZWNvZGVyICE9IE5VTEwpOwogCisgICAgICAgICAgICAvLyBpbml0aWFsaXplIHZpZGVvIGJlZm9yZSBhdWRpbyBiZWNhdXNlIHN1Y2Nlc3NmdWwgaW5pdGlhbGl6YXRpb24gb2YKKyAgICAgICAgICAgIC8vIHZpZGVvIG1heSBjaGFuZ2UgZGVlcCBidWZmZXIgbW9kZSBvZiBhdWRpby4KICAgICAgICAgICAgIGlmIChtTmF0aXZlV2luZG93ICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZURlY29kZXIoZmFsc2UsICZtVmlkZW9EZWNvZGVyKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKG1BdWRpb1NpbmsgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmIChtT2ZmbG9hZEF1ZGlvKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG9wZW4gYXVkaW8gc2luayBlYXJseSB1bmRlciBvZmZsb2FkIG1vZGUuCisgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBtU291cmNlLT5nZXRGb3JtYXQodHJ1ZSAvKmF1ZGlvKi8pOworICAgICAgICAgICAgICAgICAgICBvcGVuQXVkaW9TaW5rKGZvcm1hdCwgdHJ1ZSAvKm9mZmxvYWRPbmx5Ki8pOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZURlY29kZXIodHJ1ZSwgJm1BdWRpb0RlY29kZXIpOwogICAgICAgICAgICAgfQogCkBAIC01MzgsMjQgKzcwOSw0MCBAQAogICAgICAgICB7CiAgICAgICAgICAgICBib29sIGF1ZGlvID0gbXNnLT53aGF0KCkgPT0ga1doYXRBdWRpb05vdGlmeTsKIAotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGNvZGVjUmVxdWVzdDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoImNvZGVjLXJlcXVlc3QiLCAmY29kZWNSZXF1ZXN0KSk7CisgICAgICAgICAgICBpbnQzMl90IGN1cnJlbnREZWNvZGVyR2VuZXJhdGlvbiA9CisgICAgICAgICAgICAgICAgKGF1ZGlvPyBtQXVkaW9EZWNvZGVyR2VuZXJhdGlvbiA6IG1WaWRlb0RlY29kZXJHZW5lcmF0aW9uKTsKKyAgICAgICAgICAgIGludDMyX3QgcmVxdWVzdGVyR2VuZXJhdGlvbiA9IGN1cnJlbnREZWNvZGVyR2VuZXJhdGlvbiAtIDE7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZyZXF1ZXN0ZXJHZW5lcmF0aW9uKSk7CisKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0ZXJHZW5lcmF0aW9uICE9IGN1cnJlbnREZWNvZGVyR2VuZXJhdGlvbikgeworICAgICAgICAgICAgICAgIEFMT0dWKCJnb3QgbWVzc2FnZSBmcm9tIG9sZCAlcyBkZWNvZGVyLCBnZW5lcmF0aW9uKCVkOiVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iLCByZXF1ZXN0ZXJHZW5lcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudERlY29kZXJHZW5lcmF0aW9uKTsKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHk7CisgICAgICAgICAgICAgICAgaWYgKCEobXNnLT5maW5kTWVzc2FnZSgicmVwbHkiLCAmcmVwbHkpKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmVwbHktPnNldEludDMyKCJlcnIiLCBJTkZPX0RJU0NPTlRJTlVJVFkpOworICAgICAgICAgICAgICAgIHJlcGx5LT5wb3N0KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpbnQzMl90IHdoYXQ7Ci0gICAgICAgICAgICBDSEVDSyhjb2RlY1JlcXVlc3QtPmZpbmRJbnQzMigid2hhdCIsICZ3aGF0KSk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigid2hhdCIsICZ3aGF0KSk7CiAKLSAgICAgICAgICAgIGlmICh3aGF0ID09IEFDb2RlYzo6a1doYXRGaWxsVGhpc0J1ZmZlcikgeworICAgICAgICAgICAgaWYgKHdoYXQgPT0gRGVjb2Rlcjo6a1doYXRGaWxsVGhpc0J1ZmZlcikgewogICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGZlZWREZWNvZGVySW5wdXREYXRhKAotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8sIGNvZGVjUmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbywgbXNnKTsKIAogICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gLUVXT1VMREJMT0NLKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtU291cmNlLT5mZWVkTW9yZVRTRGF0YSgpID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtc2ctPnBvc3QoMTAwMDBsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtc2ctPnBvc3QoMTAgKiAxMDAwbGwpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IEFDb2RlYzo6a1doYXRFT1MpIHsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBEZWNvZGVyOjprV2hhdEVPUykgewogICAgICAgICAgICAgICAgIGludDMyX3QgZXJyOwotICAgICAgICAgICAgICAgIENIRUNLKGNvZGVjUmVxdWVzdC0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKIAogICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVigiZ290ICVzIGRlY29kZXIgRU9TIiwgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CkBAIC01NjYsMTcwICs3NTMsOTEgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBtUmVuZGVyZXItPnF1ZXVlRU9TKGF1ZGlvLCBlcnIpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IEFDb2RlYzo6a1doYXRGbHVzaENvbXBsZXRlZCkgewotICAgICAgICAgICAgICAgIGJvb2wgbmVlZFNodXRkb3duOwotCi0gICAgICAgICAgICAgICAgaWYgKGF1ZGlvKSB7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKElzRmx1c2hpbmdTdGF0ZShtRmx1c2hpbmdBdWRpbywgJm5lZWRTaHV0ZG93bikpOwotICAgICAgICAgICAgICAgICAgICBtRmx1c2hpbmdBdWRpbyA9IEZMVVNIRUQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0soSXNGbHVzaGluZ1N0YXRlKG1GbHVzaGluZ1ZpZGVvLCAmbmVlZFNodXRkb3duKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1GbHVzaGluZ1ZpZGVvID0gRkxVU0hFRDsKLQotICAgICAgICAgICAgICAgICAgICBtVmlkZW9MYXRlQnlVcyA9IDA7Ci0gICAgICAgICAgICAgICAgfQotCisgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gRGVjb2Rlcjo6a1doYXRGbHVzaENvbXBsZXRlZCkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJkZWNvZGVyICVzIGZsdXNoIGNvbXBsZXRlZCIsIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOwogCi0gICAgICAgICAgICAgICAgaWYgKG5lZWRTaHV0ZG93bikgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiaW5pdGlhdGluZyAlcyBkZWNvZGVyIHNodXRkb3duIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKLQotICAgICAgICAgICAgICAgICAgICAoYXVkaW8gPyBtQXVkaW9EZWNvZGVyIDogbVZpZGVvRGVjb2RlciktPmluaXRpYXRlU2h1dGRvd24oKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGluZ0F1ZGlvID0gU0hVVFRJTkdfRE9XTl9ERUNPREVSOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoaW5nVmlkZW8gPSBTSFVUVElOR19ET1dOX0RFQ09ERVI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KKyAgICAgICAgICAgICAgICBoYW5kbGVGbHVzaENvbXBsZXRlKGF1ZGlvLCB0cnVlIC8qIGlzRGVjb2RlciAqLyk7CiAgICAgICAgICAgICAgICAgZmluaXNoRmx1c2hJZlBvc3NpYmxlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gQUNvZGVjOjprV2hhdE91dHB1dEZvcm1hdENoYW5nZWQpIHsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBEZWNvZGVyOjprV2hhdE91dHB1dEZvcm1hdENoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoImZvcm1hdCIsICZmb3JtYXQpKTsKKwogICAgICAgICAgICAgICAgIGlmIChhdWRpbykgewotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzOwotICAgICAgICAgICAgICAgICAgICBDSEVDSyhjb2RlY1JlcXVlc3QtPmZpbmRJbnQzMigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoYW5uZWwtY291bnQiLCAmbnVtQ2hhbm5lbHMpKTsKLQotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKGNvZGVjUmVxdWVzdC0+ZmluZEludDMyKCJzYW1wbGUtcmF0ZSIsICZzYW1wbGVSYXRlKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvIG91dHB1dCBmb3JtYXQgY2hhbmdlZCB0byAlZCBIeiwgJWQgY2hhbm5lbHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIG51bUNoYW5uZWxzKTsKLQotICAgICAgICAgICAgICAgICAgICBtQXVkaW9TaW5rLT5jbG9zZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzOwotICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiB3ZSBzaG91bGQgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSB2aWRlbyBkZWNvZGVyCi0gICAgICAgICAgICAgICAgICAgIC8vIGlzIGNyZWF0ZWQgYWZ0ZXIgd2UgcmVjZWl2ZSB0aGUgZm9ybWF0IGNoYW5nZSBpbmRpY2F0aW9uLgotICAgICAgICAgICAgICAgICAgICAvLyBDdXJyZW50IGNvZGUgd2lsbCBqdXN0IG1ha2UgdGhhdCB3ZSBzZWxlY3QgZGVlcCBidWZmZXIKLSAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCB2aWRlbyB3aGljaCBzaG91bGQgbm90IGJlIGEgcHJvYmxlbSBhcyBpdCBzaG91bGQKLSAgICAgICAgICAgICAgICAgICAgLy8gbm90IHByZXZlbnQgZnJvbSBrZWVwaW5nIEEvViBzeW5jLgotICAgICAgICAgICAgICAgICAgICBpZiAobVZpZGVvRGVjb2RlciA9PSBOVUxMICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNvdXJjZS0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uVXMpID09IE9LICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25VcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+IEFVRElPX1NJTktfTUlOX0RFRVBfQlVGRkVSX0RVUkFUSU9OX1VTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFubmVsTWFzazsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFjb2RlY1JlcXVlc3QtPmZpbmRJbnQzMigiY2hhbm5lbC1tYXNrIiwgJmNoYW5uZWxNYXNrKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2sgPSBDSEFOTkVMX01BU0tfVVNFX0NIQU5ORUxfT1JERVI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtQXVkaW9TaW5rLT5vcGVuKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KWNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCAvKiBidWZmZXJDb3VudCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdHVzX3QpT0spOwotICAgICAgICAgICAgICAgICAgICBtQXVkaW9TaW5rLT5zdGFydCgpOwotCi0gICAgICAgICAgICAgICAgICAgIG1SZW5kZXJlci0+c2lnbmFsQXVkaW9TaW5rQ2hhbmdlZCgpOworICAgICAgICAgICAgICAgICAgICBvcGVuQXVkaW9TaW5rKGZvcm1hdCwgZmFsc2UgLypvZmZsb2FkT25seSovKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAvLyB2aWRlbworICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gaW5wdXRGb3JtYXQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLyk7CiAKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBDSEVDSyhjb2RlY1JlcXVlc3QtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpKTsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0soY29kZWNSZXF1ZXN0LT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKTsKLQotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNyb3BMZWZ0LCBjcm9wVG9wLCBjcm9wUmlnaHQsIGNyb3BCb3R0b207Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKGNvZGVjUmVxdWVzdC0+ZmluZFJlY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm9wIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyb3BMZWZ0LCAmY3JvcFRvcCwgJmNyb3BSaWdodCwgJmNyb3BCb3R0b20pKTsKLQotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRpc3BsYXlXaWR0aCA9IGNyb3BSaWdodCAtIGNyb3BMZWZ0ICsgMTsKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkaXNwbGF5SGVpZ2h0ID0gY3JvcEJvdHRvbSAtIGNyb3BUb3AgKyAxOwotCi0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlbyBvdXRwdXQgZm9ybWF0IGNoYW5nZWQgdG8gJWQgeCAlZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIihjcm9wOiAlZCB4ICVkIEAgKCVkLCAlZCkpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5SGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGNyb3BMZWZ0LCBjcm9wVG9wKTsKLQotICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gdmlkZW9JbnB1dEZvcm1hdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIFRha2UgaW50byBhY2NvdW50IHNhbXBsZSBhc3BlY3QgcmF0aW8gaWYgbmVjZXNzYXJ5OgotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhcldpZHRoLCBzYXJIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2aWRlb0lucHV0Rm9ybWF0LT5maW5kSW50MzIoInNhci13aWR0aCIsICZzYXJXaWR0aCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB2aWRlb0lucHV0Rm9ybWF0LT5maW5kSW50MzIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzYXItaGVpZ2h0IiwgJnNhckhlaWdodCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJTYW1wbGUgYXNwZWN0IHJhdGlvICVkIDogJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FyV2lkdGgsIHNhckhlaWdodCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlXaWR0aCA9IChkaXNwbGF5V2lkdGggKiBzYXJXaWR0aCkgLyBzYXJIZWlnaHQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJkaXNwbGF5IGRpbWVuc2lvbnMgJWQgeCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfU0VUX1ZJREVPX1NJWkUsIGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1OZWVkc1N3UmVuZGVyZXIgJiYgbU5hdGl2ZVdpbmRvdyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvbG9yRm9ybWF0OwotICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soY29kZWNSZXF1ZXN0LT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZjb2xvckZvcm1hdCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldFJlY3Qoa0tleUNyb3BSZWN0LCBjcm9wTGVmdCwgY3JvcFRvcCwgY3JvcFJpZ2h0LCBjcm9wQm90dG9tKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlDb2xvckZvcm1hdCwgY29sb3JGb3JtYXQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBtUmVuZGVyZXItPnNldFNvZnRSZW5kZXJlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNvZnR3YXJlUmVuZGVyZXIobU5hdGl2ZVdpbmRvdy0+Z2V0TmF0aXZlV2luZG93KCksIG1ldGEpKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB1cGRhdGVWaWRlb1NpemUoaW5wdXRGb3JtYXQsIGZvcm1hdCk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IEFDb2RlYzo6a1doYXRTaHV0ZG93bkNvbXBsZXRlZCkgeworICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IERlY29kZXI6OmtXaGF0U2h1dGRvd25Db21wbGV0ZWQpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiJXMgc2h1dGRvd24gY29tcGxldGVkIiwgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CiAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvKSB7CiAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0RlY29kZXIuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgKyttQXVkaW9EZWNvZGVyR2VuZXJhdGlvbjsKIAogICAgICAgICAgICAgICAgICAgICBDSEVDS19FUSgoaW50KW1GbHVzaGluZ0F1ZGlvLCAoaW50KVNIVVRUSU5HX0RPV05fREVDT0RFUik7CiAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGluZ0F1ZGlvID0gU0hVVF9ET1dOOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIG1WaWRlb0RlY29kZXIuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgKyttVmlkZW9EZWNvZGVyR2VuZXJhdGlvbjsKIAogICAgICAgICAgICAgICAgICAgICBDSEVDS19FUSgoaW50KW1GbHVzaGluZ1ZpZGVvLCAoaW50KVNIVVRUSU5HX0RPV05fREVDT0RFUik7CiAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGluZ1ZpZGVvID0gU0hVVF9ET1dOOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGZpbmlzaEZsdXNoSWZQb3NzaWJsZSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IEFDb2RlYzo6a1doYXRFcnJvcikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJSZWNlaXZlZCBlcnJvciBmcm9tICVzIGRlY29kZXIsIGFib3J0aW5nIHBsYXliYWNrLiIsCi0gICAgICAgICAgICAgICAgICAgICBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKLQotICAgICAgICAgICAgICAgIG1SZW5kZXJlci0+cXVldWVFT1MoYXVkaW8sIFVOS05PV05fRVJST1IpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IEFDb2RlYzo6a1doYXREcmFpblRoaXNCdWZmZXIpIHsKLSAgICAgICAgICAgICAgICByZW5kZXJCdWZmZXIoYXVkaW8sIGNvZGVjUmVxdWVzdCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gQUNvZGVjOjprV2hhdENvbXBvbmVudEFsbG9jYXRlZCkgewotICAgICAgICAgICAgICAgIGlmICghYXVkaW8pIHsKLSAgICAgICAgICAgICAgICAgICAgQVN0cmluZyBuYW1lOwotICAgICAgICAgICAgICAgICAgICBDSEVDSyhjb2RlY1JlcXVlc3QtPmZpbmRTdHJpbmcoImNvbXBvbmVudE5hbWUiLCAmbmFtZSkpOwotICAgICAgICAgICAgICAgICAgICBtTmVlZHNTd1JlbmRlcmVyID0gbmFtZS5zdGFydHNXaXRoKCJPTVguZ29vZ2xlLiIpOworICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IERlY29kZXI6OmtXaGF0RXJyb3IpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiZXJyIiwgJmVycikgfHwgZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IFVOS05PV05fRVJST1I7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ICE9IEFDb2RlYzo6a1doYXRDb21wb25lbnRDb25maWd1cmVkCi0gICAgICAgICAgICAgICAgICAgICYmIHdoYXQgIT0gQUNvZGVjOjprV2hhdEJ1ZmZlcnNBbGxvY2F0ZWQpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiVW5oYW5kbGVkIGNvZGVjIG5vdGlmaWNhdGlvbiAlZCAnJWMlYyVjJWMnLiIsCisKKyAgICAgICAgICAgICAgICAvLyBEZWNvZGVyIGVycm9ycyBjYW4gYmUgZHVlIHRvIFNvdXJjZSAoZS5nLiBmcm9tIHN0cmVhbWluZyksCisgICAgICAgICAgICAgICAgLy8gb3IgZnJvbSBkZWNvZGluZyBjb3JydXB0ZWQgYml0c3RyZWFtcywgb3IgZnJvbSBvdGhlciBkZWNvZGVyCisgICAgICAgICAgICAgICAgLy8gTWVkaWFDb2RlYyBvcGVyYXRpb25zIChlLmcuIGZyb20gYW4gb25nb2luZyByZXNldCBvciBzZWVrKS4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIFdlIHRyeSB0byBncmFjZWZ1bGx5IHNodXQgZG93biB0aGUgYWZmZWN0ZWQgZGVjb2RlciBpZiBwb3NzaWJsZSwKKyAgICAgICAgICAgICAgICAvLyByYXRoZXIgdGhhbiB0cnlpbmcgdG8gZm9yY2UgdGhlIHNodXRkb3duIHdpdGggc29tZXRoaW5nCisgICAgICAgICAgICAgICAgLy8gc2ltaWxhciB0byBwZXJmb3JtUmVzZXQoKS4gVGhpcyBtZXRob2QgY2FuIGxlYWQgdG8gYSBoYW5nCisgICAgICAgICAgICAgICAgLy8gaWYgTWVkaWFDb2RlYyBmdW5jdGlvbnMgYmxvY2sgYWZ0ZXIgYW4gZXJyb3IsIGJ1dCB0aGV5IHNob3VsZAorICAgICAgICAgICAgICAgIC8vIHR5cGljYWxseSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT04gaW5zdGVhZCBvZiBibG9ja2luZy4KKworICAgICAgICAgICAgICAgIEZsdXNoU3RhdHVzICpmbHVzaGluZyA9IGF1ZGlvID8gJm1GbHVzaGluZ0F1ZGlvIDogJm1GbHVzaGluZ1ZpZGVvOworICAgICAgICAgICAgICAgIEFMT0dFKCJyZWNlaXZlZCBlcnJvciglI3gpIGZyb20gJXMgZGVjb2RlciwgZmx1c2hpbmcoJWQpLCBub3cgc2h1dHRpbmcgZG93biIsCisgICAgICAgICAgICAgICAgICAgICAgICBlcnIsIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIsICpmbHVzaGluZyk7CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCpmbHVzaGluZykgeworICAgICAgICAgICAgICAgICAgICBjYXNlIE5PTkU6CisgICAgICAgICAgICAgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNodXRkb3duRGVjb2RlckFjdGlvbihhdWRpbywgIWF1ZGlvIC8qIHZpZGVvICovKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRGVmZXJyZWRBY3Rpb25zKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGTFVTSElOR19ERUNPREVSOgorICAgICAgICAgICAgICAgICAgICAgICAgKmZsdXNoaW5nID0gRkxVU0hJTkdfREVDT0RFUl9TSFVURE9XTjsgLy8gaW5pdGlhdGUgc2h1dGRvd24gYWZ0ZXIgZmx1c2guCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gV2FpdCBmb3IgZmx1c2ggdG8gY29tcGxldGUuCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRkxVU0hJTkdfREVDT0RFUl9TSFVURE9XTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBXYWl0IGZvciBmbHVzaCB0byBjb21wbGV0ZS4KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTSFVUVElOR19ET1dOX0RFQ09ERVI6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gV2FpdCBmb3Igc2h1dGRvd24gdG8gY29tcGxldGUuCisgICAgICAgICAgICAgICAgICAgIGNhc2UgRkxVU0hFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdpZGV2aW5lIHNvdXJjZSByZWFkcyBtdXN0IHN0b3AgYmVmb3JlIHJlbGVhc2luZyB0aGUgdmlkZW8gZGVjb2Rlci4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXVkaW8gJiYgbVNvdXJjZSAhPSBOVUxMICYmIG1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19TRUNVUkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU291cmNlLT5zdG9wKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBnZXREZWNvZGVyKGF1ZGlvKS0+aW5pdGlhdGVTaHV0ZG93bigpOyAvLyBJbiB0aGUgbWlkZGxlIG9mIGEgc2Vlay4KKyAgICAgICAgICAgICAgICAgICAgICAgICpmbHVzaGluZyA9IFNIVVRUSU5HX0RPV05fREVDT0RFUjsgICAgIC8vIFNodXQgZG93bi4KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNIVVRfRE9XTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaEZsdXNoSWZQb3NzaWJsZSgpOyAgLy8gU2hvdWxkIG5vdCBvY2N1ci4KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgLy8gRmluaXNoIGFueXdheXMuCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX0VSUk9SLCBNRURJQV9FUlJPUl9VTktOT1dOLCBlcnIpOworICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IERlY29kZXI6OmtXaGF0RHJhaW5UaGlzQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgcmVuZGVyQnVmZmVyKGF1ZGlvLCBtc2cpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiVW5oYW5kbGVkIGRlY29kZXIgbm90aWZpY2F0aW9uICVkICclYyVjJWMlYycuIiwKICAgICAgICAgICAgICAgICAgICAgICB3aGF0LAogICAgICAgICAgICAgICAgICAgICAgIHdoYXQgPj4gMjQsCiAgICAgICAgICAgICAgICAgICAgICAgKHdoYXQgPj4gMTYpICYgMHhmZiwKQEAgLTc0Miw2ICs4NTAsMTQgQEAKIAogICAgICAgICBjYXNlIGtXaGF0UmVuZGVyZXJOb3RpZnk6CiAgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgcmVxdWVzdGVyR2VuZXJhdGlvbiA9IG1SZW5kZXJlckdlbmVyYXRpb24gLSAxOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmcmVxdWVzdGVyR2VuZXJhdGlvbikpOworICAgICAgICAgICAgaWYgKHJlcXVlc3RlckdlbmVyYXRpb24gIT0gbVJlbmRlcmVyR2VuZXJhdGlvbikgeworICAgICAgICAgICAgICAgIEFMT0dWKCJnb3QgbWVzc2FnZSBmcm9tIG9sZCByZW5kZXJlciwgZ2VuZXJhdGlvbiglZDolZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVyR2VuZXJhdGlvbiwgbVJlbmRlcmVyR2VuZXJhdGlvbik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpbnQzMl90IHdoYXQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigid2hhdCIsICZ3aGF0KSk7CiAKQEAgLTc3MiwzMSArODg4LDM4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAmJiAobVZpZGVvRU9TIHx8IG1WaWRlb0RlY29kZXIgPT0gTlVMTCkpIHsKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfUExBWUJBQ0tfQ09NUExFVEUsIDAsIDApOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBSZW5kZXJlcjo6a1doYXRQb3NpdGlvbikgewotICAgICAgICAgICAgICAgIGludDY0X3QgcG9zaXRpb25VczsKLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgicG9zaXRpb25VcyIsICZwb3NpdGlvblVzKSk7Ci0KLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidmlkZW9MYXRlQnlVcyIsICZtVmlkZW9MYXRlQnlVcykpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1Ecml2ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBzcDxOdVBsYXllckRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlQb3NpdGlvbihwb3NpdGlvblVzKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlGcmFtZVN0YXRzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtRnJhbWVzVG90YWwsIG1OdW1GcmFtZXNEcm9wcGVkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBSZW5kZXJlcjo6a1doYXRGbHVzaENvbXBsZXRlKSB7CiAgICAgICAgICAgICAgICAgaW50MzJfdCBhdWRpbzsKICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYXVkaW8iLCAmYXVkaW8pKTsKIAogICAgICAgICAgICAgICAgIEFMT0dWKCJyZW5kZXJlciAlcyBmbHVzaCBjb21wbGV0ZWQuIiwgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CisgICAgICAgICAgICAgICAgaGFuZGxlRmx1c2hDb21wbGV0ZShhdWRpbywgZmFsc2UgLyogaXNEZWNvZGVyICovKTsKKyAgICAgICAgICAgICAgICBmaW5pc2hGbHVzaElmUG9zc2libGUoKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBSZW5kZXJlcjo6a1doYXRWaWRlb1JlbmRlcmluZ1N0YXJ0KSB7CiAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfSU5GTywgTUVESUFfSU5GT19SRU5ERVJJTkdfU1RBUlQsIDApOwogICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IFJlbmRlcmVyOjprV2hhdE1lZGlhUmVuZGVyaW5nU3RhcnQpIHsKICAgICAgICAgICAgICAgICBBTE9HVigibWVkaWEgcmVuZGVyaW5nIHN0YXJ0ZWQiKTsKICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9TVEFSVEVELCAwLCAwKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBSZW5kZXJlcjo6a1doYXRBdWRpb09mZmxvYWRUZWFyRG93bikgeworICAgICAgICAgICAgICAgIEFMT0dWKCJUZWFyIGRvd24gYXVkaW8gb2ZmbG9hZCwgZmFsbCBiYWNrIHRvIHMvdyBwYXRoIik7CisgICAgICAgICAgICAgICAgaW50NjRfdCBwb3NpdGlvblVzOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJwb3NpdGlvblVzIiwgJnBvc2l0aW9uVXMpKTsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHJlYXNvbjsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmVhc29uIiwgJnJlYXNvbikpOworICAgICAgICAgICAgICAgIGNsb3NlQXVkaW9TaW5rKCk7CisgICAgICAgICAgICAgICAgbUF1ZGlvRGVjb2Rlci5jbGVhcigpOworICAgICAgICAgICAgICAgICsrbUF1ZGlvRGVjb2RlckdlbmVyYXRpb247CisgICAgICAgICAgICAgICAgbVJlbmRlcmVyLT5mbHVzaCh0cnVlIC8qIGF1ZGlvICovKTsKKyAgICAgICAgICAgICAgICBpZiAobVZpZGVvRGVjb2RlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIG1SZW5kZXJlci0+Zmx1c2goZmFsc2UgLyogYXVkaW8gKi8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtUmVuZGVyZXItPnNpZ25hbERpc2FibGVPZmZsb2FkQXVkaW8oKTsKKyAgICAgICAgICAgICAgICBtT2ZmbG9hZEF1ZGlvID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICBwZXJmb3JtU2Vlayhwb3NpdGlvblVzLCBmYWxzZSAvKiBuZWVkTm90aWZ5ICovKTsKKyAgICAgICAgICAgICAgICBpZiAocmVhc29uID09IFJlbmRlcmVyOjprRHVlVG9FcnJvcikgeworICAgICAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZURlY29kZXIodHJ1ZSAvKiBhdWRpbyAqLywgJm1BdWRpb0RlY29kZXIpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC04MjQsMTQgKzk0NywxOCBAQAogICAgICAgICBjYXNlIGtXaGF0U2VlazoKICAgICAgICAgewogICAgICAgICAgICAgaW50NjRfdCBzZWVrVGltZVVzOworICAgICAgICAgICAgaW50MzJfdCBuZWVkTm90aWZ5OwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInNlZWtUaW1lVXMiLCAmc2Vla1RpbWVVcykpOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoIm5lZWROb3RpZnkiLCAmbmVlZE5vdGlmeSkpOwogCi0gICAgICAgICAgICBBTE9HVigia1doYXRTZWVrIHNlZWtUaW1lVXM9JWxsZCB1cyIsIHNlZWtUaW1lVXMpOworICAgICAgICAgICAgQUxPR1YoImtXaGF0U2VlayBzZWVrVGltZVVzPSVsbGQgdXMsIG5lZWROb3RpZnk9JWQiLAorICAgICAgICAgICAgICAgICAgICBzZWVrVGltZVVzLCBuZWVkTm90aWZ5KTsKIAogICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCiAgICAgICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVBY3Rpb24oJk51UGxheWVyOjpwZXJmb3JtRGVjb2RlckZsdXNoKSk7CiAKLSAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKG5ldyBTZWVrQWN0aW9uKHNlZWtUaW1lVXMpKTsKKyAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICBuZXcgU2Vla0FjdGlvbihzZWVrVGltZVVzLCBuZWVkTm90aWZ5KSk7CiAKICAgICAgICAgICAgIHByb2Nlc3NEZWZlcnJlZEFjdGlvbnMoKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtODM5LDE3ICs5NjYsMzYgQEAKIAogICAgICAgICBjYXNlIGtXaGF0UGF1c2U6CiAgICAgICAgIHsKLSAgICAgICAgICAgIENIRUNLKG1SZW5kZXJlciAhPSBOVUxMKTsKLSAgICAgICAgICAgIG1Tb3VyY2UtPnBhdXNlKCk7Ci0gICAgICAgICAgICBtUmVuZGVyZXItPnBhdXNlKCk7CisgICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbVNvdXJjZS0+cGF1c2UoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coInBhdXNlIGNhbGxlZCB3aGVuIHNvdXJjZSBpcyBnb25lIG9yIG5vdCBzZXQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtUmVuZGVyZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1SZW5kZXJlci0+cGF1c2UoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coInBhdXNlIGNhbGxlZCB3aGVuIHJlbmRlcmVyIGlzIGdvbmUgb3Igbm90IHNldCIpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIGtXaGF0UmVzdW1lOgogICAgICAgICB7Ci0gICAgICAgICAgICBDSEVDSyhtUmVuZGVyZXIgIT0gTlVMTCk7Ci0gICAgICAgICAgICBtU291cmNlLT5yZXN1bWUoKTsKLSAgICAgICAgICAgIG1SZW5kZXJlci0+cmVzdW1lKCk7CisgICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbVNvdXJjZS0+cmVzdW1lKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCJyZXN1bWUgY2FsbGVkIHdoZW4gc291cmNlIGlzIGdvbmUgb3Igbm90IHNldCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gfG1BdWRpb0RlY29kZXJ8IG1heSBoYXZlIGJlZW4gcmVsZWFzZWQgZHVlIHRvIHRoZSBwYXVzZSB0aW1lb3V0LCBzbyByZS1jcmVhdGUgaXQgaWYKKyAgICAgICAgICAgIC8vIG5lZWRlZC4KKyAgICAgICAgICAgIGlmIChhdWRpb0RlY29kZXJTdGlsbE5lZWRlZCgpICYmIG1BdWRpb0RlY29kZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlRGVjb2Rlcih0cnVlIC8qIGF1ZGlvICovLCAmbUF1ZGlvRGVjb2Rlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVJlbmRlcmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtUmVuZGVyZXItPnJlc3VtZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVygicmVzdW1lIGNhbGxlZCB3aGVuIHJlbmRlcmVyIGlzIGdvbmUgb3Igbm90IHNldCIpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtODU5LDM5ICsxMDA1LDk2IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2Uga1doYXRDbG9zZWRDYXB0aW9uTm90aWZ5OgorICAgICAgICB7CisgICAgICAgICAgICBvbkNsb3NlZENhcHRpb25Ob3RpZnkobXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIFRSRVNQQVNTKCk7CiAgICAgICAgICAgICBicmVhazsKICAgICB9CiB9CiAKLXZvaWQgTnVQbGF5ZXI6OmZpbmlzaEZsdXNoSWZQb3NzaWJsZSgpIHsKLSAgICBpZiAobUZsdXNoaW5nQXVkaW8gIT0gRkxVU0hFRCAmJiBtRmx1c2hpbmdBdWRpbyAhPSBTSFVUX0RPV04pIHsKK2Jvb2wgTnVQbGF5ZXI6OmF1ZGlvRGVjb2RlclN0aWxsTmVlZGVkKCkgeworICAgIC8vIEF1ZGlvIGRlY29kZXIgaXMgbm8gbG9uZ2VyIG5lZWRlZCBpZiBpdCdzIGluIHNodXQvc2h1dHRpbmcgZG93biBzdGF0dXMuCisgICAgcmV0dXJuICgobUZsdXNoaW5nQXVkaW8gIT0gU0hVVF9ET1dOKSAmJiAobUZsdXNoaW5nQXVkaW8gIT0gU0hVVFRJTkdfRE9XTl9ERUNPREVSKSk7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OmhhbmRsZUZsdXNoQ29tcGxldGUoYm9vbCBhdWRpbywgYm9vbCBpc0RlY29kZXIpIHsKKyAgICAvLyBXZSB3YWl0IGZvciBib3RoIHRoZSBkZWNvZGVyIGZsdXNoIGFuZCB0aGUgcmVuZGVyZXIgZmx1c2ggdG8gY29tcGxldGUKKyAgICAvLyBiZWZvcmUgZW50ZXJpbmcgZWl0aGVyIHRoZSBGTFVTSEVEIG9yIHRoZSBTSFVUVElOR19ET1dOX0RFQ09ERVIgc3RhdGUuCisKKyAgICBtRmx1c2hDb21wbGV0ZVthdWRpb11baXNEZWNvZGVyXSA9IHRydWU7CisgICAgaWYgKCFtRmx1c2hDb21wbGV0ZVthdWRpb11bIWlzRGVjb2Rlcl0pIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGlmIChtRmx1c2hpbmdWaWRlbyAhPSBGTFVTSEVEICYmIG1GbHVzaGluZ1ZpZGVvICE9IFNIVVRfRE9XTikgeworICAgIEZsdXNoU3RhdHVzICpzdGF0ZSA9IGF1ZGlvID8gJm1GbHVzaGluZ0F1ZGlvIDogJm1GbHVzaGluZ1ZpZGVvOworICAgIHN3aXRjaCAoKnN0YXRlKSB7CisgICAgICAgIGNhc2UgRkxVU0hJTkdfREVDT0RFUjoKKyAgICAgICAgeworICAgICAgICAgICAgKnN0YXRlID0gRkxVU0hFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGTFVTSElOR19ERUNPREVSX1NIVVRET1dOOgorICAgICAgICB7CisgICAgICAgICAgICAqc3RhdGUgPSBTSFVUVElOR19ET1dOX0RFQ09ERVI7CisKKyAgICAgICAgICAgIEFMT0dWKCJpbml0aWF0aW5nICVzIGRlY29kZXIgc2h1dGRvd24iLCBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKKyAgICAgICAgICAgIGlmICghYXVkaW8pIHsKKyAgICAgICAgICAgICAgICAvLyBXaWRldmluZSBzb3VyY2UgcmVhZHMgbXVzdCBzdG9wIGJlZm9yZSByZWxlYXNpbmcgdGhlIHZpZGVvIGRlY29kZXIuCisgICAgICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCAmJiBtU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfU0VDVVJFKSB7CisgICAgICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnZXREZWNvZGVyKGF1ZGlvKS0+aW5pdGlhdGVTaHV0ZG93bigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLy8gZGVjb2RlciBmbHVzaCBjb21wbGV0ZXMgb25seSBvY2N1ciBpbiBhIGZsdXNoaW5nIHN0YXRlLgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihpc0RlY29kZXIsICJkZWNvZGVyIGZsdXNoIGluIGludmFsaWQgc3RhdGUgJWQiLCAqc3RhdGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyOjpmaW5pc2hGbHVzaElmUG9zc2libGUoKSB7CisgICAgaWYgKG1GbHVzaGluZ0F1ZGlvICE9IE5PTkUgJiYgbUZsdXNoaW5nQXVkaW8gIT0gRkxVU0hFRAorICAgICAgICAgICAgJiYgbUZsdXNoaW5nQXVkaW8gIT0gU0hVVF9ET1dOKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobUZsdXNoaW5nVmlkZW8gIT0gTk9ORSAmJiBtRmx1c2hpbmdWaWRlbyAhPSBGTFVTSEVECisgICAgICAgICAgICAmJiBtRmx1c2hpbmdWaWRlbyAhPSBTSFVUX0RPV04pIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIEFMT0dWKCJib3RoIGF1ZGlvIGFuZCB2aWRlbyBhcmUgZmx1c2hlZCBub3cuIik7CiAKKyAgICBtUGVuZGluZ0F1ZGlvQWNjZXNzVW5pdC5jbGVhcigpOworICAgIG1BZ2dyZWdhdGVCdWZmZXIuY2xlYXIoKTsKKwogICAgIGlmIChtVGltZURpc2NvbnRpbnVpdHlQZW5kaW5nKSB7CiAgICAgICAgIG1SZW5kZXJlci0+c2lnbmFsVGltZURpc2NvbnRpbnVpdHkoKTsKICAgICAgICAgbVRpbWVEaXNjb250aW51aXR5UGVuZGluZyA9IGZhbHNlOwogICAgIH0KIAotICAgIGlmIChtQXVkaW9EZWNvZGVyICE9IE5VTEwpIHsKKyAgICBpZiAobUF1ZGlvRGVjb2RlciAhPSBOVUxMICYmIG1GbHVzaGluZ0F1ZGlvID09IEZMVVNIRUQpIHsKICAgICAgICAgbUF1ZGlvRGVjb2Rlci0+c2lnbmFsUmVzdW1lKCk7CiAgICAgfQogCi0gICAgaWYgKG1WaWRlb0RlY29kZXIgIT0gTlVMTCkgeworICAgIGlmIChtVmlkZW9EZWNvZGVyICE9IE5VTEwgJiYgbUZsdXNoaW5nVmlkZW8gPT0gRkxVU0hFRCkgewogICAgICAgICBtVmlkZW9EZWNvZGVyLT5zaWduYWxSZXN1bWUoKTsKICAgICB9CiAKICAgICBtRmx1c2hpbmdBdWRpbyA9IE5PTkU7CiAgICAgbUZsdXNoaW5nVmlkZW8gPSBOT05FOwogCisgICAgY2xlYXJGbHVzaENvbXBsZXRlKCk7CisKICAgICBwcm9jZXNzRGVmZXJyZWRBY3Rpb25zKCk7CiB9CiAKQEAgLTkwNyw2ICsxMTEwLDM4IEBACiAgICAgbVNjYW5Tb3VyY2VzUGVuZGluZyA9IHRydWU7CiB9CiAKK3ZvaWQgTnVQbGF5ZXI6Om9wZW5BdWRpb1NpbmsoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGJvb2wgb2ZmbG9hZE9ubHkpIHsKKyAgICB1aW50MzJfdCBmbGFnczsKKyAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CisgICAgYm9vbCBoYXNWaWRlbyA9IChtVmlkZW9EZWNvZGVyICE9IE5VTEwpOworICAgIC8vIEZJWE1FOiB3ZSBzaG91bGQgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSB2aWRlbyBkZWNvZGVyCisgICAgLy8gaXMgY3JlYXRlZCBhZnRlciB3ZSByZWNlaXZlIHRoZSBmb3JtYXQgY2hhbmdlIGluZGljYXRpb24uCisgICAgLy8gQ3VycmVudCBjb2RlIHdpbGwganVzdCBtYWtlIHRoYXQgd2Ugc2VsZWN0IGRlZXAgYnVmZmVyCisgICAgLy8gd2l0aCB2aWRlbyB3aGljaCBzaG91bGQgbm90IGJlIGEgcHJvYmxlbSBhcyBpdCBzaG91bGQKKyAgICAvLyBub3QgcHJldmVudCBmcm9tIGtlZXBpbmcgQS9WIHN5bmMuCisgICAgaWYgKGhhc1ZpZGVvICYmCisgICAgICAgICAgICBtU291cmNlLT5nZXREdXJhdGlvbigmZHVyYXRpb25VcykgPT0gT0sgJiYKKyAgICAgICAgICAgIGR1cmF0aW9uVXMKKyAgICAgICAgICAgICAgICA+IEFVRElPX1NJTktfTUlOX0RFRVBfQlVGRkVSX0RVUkFUSU9OX1VTKSB7CisgICAgICAgIGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FOworICAgIH0KKworICAgIG1PZmZsb2FkQXVkaW8gPSBtUmVuZGVyZXItPm9wZW5BdWRpb1NpbmsoCisgICAgICAgICAgICBmb3JtYXQsIG9mZmxvYWRPbmx5LCBoYXNWaWRlbywgZmxhZ3MpOworCisgICAgaWYgKG1PZmZsb2FkQXVkaW8pIHsKKyAgICAgICAgc3A8TWV0YURhdGE+IGF1ZGlvTWV0YSA9CisgICAgICAgICAgICAgICAgbVNvdXJjZS0+Z2V0Rm9ybWF0TWV0YSh0cnVlIC8qIGF1ZGlvICovKTsKKyAgICAgICAgc2VuZE1ldGFEYXRhVG9IYWwobUF1ZGlvU2luaywgYXVkaW9NZXRhKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OmNsb3NlQXVkaW9TaW5rKCkgeworICAgIG1SZW5kZXJlci0+Y2xvc2VBdWRpb1NpbmsoKTsKK30KKwogc3RhdHVzX3QgTnVQbGF5ZXI6Omluc3RhbnRpYXRlRGVjb2Rlcihib29sIGF1ZGlvLCBzcDxEZWNvZGVyPiAqZGVjb2RlcikgewogICAgIGlmICgqZGVjb2RlciAhPSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBPSzsKQEAgLTkyMiwxOCArMTE1Nyw1NyBAQAogICAgICAgICBBU3RyaW5nIG1pbWU7CiAgICAgICAgIENIRUNLKGZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSk7CiAgICAgICAgIG1WaWRlb0lzQVZDID0gIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCBtaW1lLmNfc3RyKCkpOworCisgICAgICAgIHNwPEFNZXNzYWdlPiBjY05vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdENsb3NlZENhcHRpb25Ob3RpZnksIGlkKCkpOworICAgICAgICBtQ0NEZWNvZGVyID0gbmV3IENDRGVjb2RlcihjY05vdGlmeSk7CisKKyAgICAgICAgaWYgKG1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19TRUNVUkUpIHsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInNlY3VyZSIsIHRydWUpOworICAgICAgICB9CiAgICAgfQogCi0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9Ci0gICAgICAgIG5ldyBBTWVzc2FnZShhdWRpbyA/IGtXaGF0QXVkaW9Ob3RpZnkgOiBrV2hhdFZpZGVvTm90aWZ5LAotICAgICAgICAgICAgICAgICAgICAgaWQoKSk7CisgICAgaWYgKGF1ZGlvKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRBdWRpb05vdGlmeSwgaWQoKSk7CisgICAgICAgICsrbUF1ZGlvRGVjb2RlckdlbmVyYXRpb247CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtQXVkaW9EZWNvZGVyR2VuZXJhdGlvbik7CiAKLSAgICAqZGVjb2RlciA9IGF1ZGlvID8gbmV3IERlY29kZXIobm90aWZ5KSA6Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBEZWNvZGVyKG5vdGlmeSwgbU5hdGl2ZVdpbmRvdyk7Ci0gICAgbG9vcGVyKCktPnJlZ2lzdGVySGFuZGxlcigqZGVjb2Rlcik7CisgICAgICAgIGlmIChtT2ZmbG9hZEF1ZGlvKSB7CisgICAgICAgICAgICAqZGVjb2RlciA9IG5ldyBEZWNvZGVyUGFzc1Rocm91Z2gobm90aWZ5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpkZWNvZGVyID0gbmV3IERlY29kZXIobm90aWZ5KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRWaWRlb05vdGlmeSwgaWQoKSk7CisgICAgICAgICsrbVZpZGVvRGVjb2RlckdlbmVyYXRpb247CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtVmlkZW9EZWNvZGVyR2VuZXJhdGlvbik7CiAKKyAgICAgICAgKmRlY29kZXIgPSBuZXcgRGVjb2Rlcihub3RpZnksIG1OYXRpdmVXaW5kb3cpOworICAgIH0KKyAgICAoKmRlY29kZXIpLT5pbml0KCk7CiAgICAgKCpkZWNvZGVyKS0+Y29uZmlndXJlKGZvcm1hdCk7CiAKKyAgICAvLyBhbGxvY2F0ZSBidWZmZXJzIHRvIGRlY3J5cHQgd2lkZXZpbmUgc291cmNlIGJ1ZmZlcnMKKyAgICBpZiAoIWF1ZGlvICYmIChtU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfU0VDVVJFKSkgeworICAgICAgICBWZWN0b3I8c3A8QUJ1ZmZlcj4gPiBpbnB1dEJ1ZnM7CisgICAgICAgIENIRUNLX0VRKCgqZGVjb2RlciktPmdldElucHV0QnVmZmVycygmaW5wdXRCdWZzKSwgKHN0YXR1c190KU9LKTsKKworICAgICAgICBWZWN0b3I8TWVkaWFCdWZmZXIgKj4gbWVkaWFCdWZzOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGlucHV0QnVmcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciA9IGlucHV0QnVmc1tpXTsKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyICptYnVmID0gbmV3IE1lZGlhQnVmZmVyKGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CisgICAgICAgICAgICBtZWRpYUJ1ZnMucHVzaChtYnVmKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPnNldEJ1ZmZlcnMoYXVkaW8sIG1lZGlhQnVmcyk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWVkaWFCdWZzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgbWVkaWFCdWZzW2ldLT5yZWxlYXNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZWRpYUJ1ZnMuY2xlYXIoKTsKKyAgICAgICAgICAgIEFMT0dFKCJTZWN1cmUgc291cmNlIGRpZG4ndCBzdXBwb3J0IHNlY3VyZSBtZWRpYUJ1ZnMuIik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQogICAgIHJldHVybiBPSzsKIH0KIApAQCAtOTQxLDggKzEyMTUsOSBAQAogICAgIHNwPEFNZXNzYWdlPiByZXBseTsKICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJyZXBseSIsICZyZXBseSkpOwogCi0gICAgaWYgKChhdWRpbyAmJiBJc0ZsdXNoaW5nU3RhdGUobUZsdXNoaW5nQXVkaW8pKQotICAgICAgICAgICAgfHwgKCFhdWRpbyAmJiBJc0ZsdXNoaW5nU3RhdGUobUZsdXNoaW5nVmlkZW8pKSkgeworICAgIGlmICgoYXVkaW8gJiYgbUZsdXNoaW5nQXVkaW8gIT0gTk9ORSkKKyAgICAgICAgICAgIHx8ICghYXVkaW8gJiYgbUZsdXNoaW5nVmlkZW8gIT0gTk9ORSkKKyAgICAgICAgICAgIHx8IG1Tb3VyY2UgPT0gTlVMTCkgewogICAgICAgICByZXBseS0+c2V0SW50MzIoImVyciIsIElORk9fRElTQ09OVElOVUlUWSk7CiAgICAgICAgIHJlcGx5LT5wb3N0KCk7CiAgICAgICAgIHJldHVybiBPSzsKQEAgLTk1MCwxNCArMTIyNSwzNyBAQAogCiAgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdDsKIAorICAgIC8vIEFnZ3JlZ2F0ZSBzbWFsbGVyIGJ1ZmZlcnMgaW50byBhIGxhcmdlciBidWZmZXIuCisgICAgLy8gVGhlIGdvYWwgaXMgdG8gcmVkdWNlIHBvd2VyIGNvbnN1bXB0aW9uLgorICAgIC8vIE5vdGUgdGhpcyB3aWxsIG5vdCB3b3JrIGlmIHRoZSBkZWNvZGVyIHJlcXVpcmVzIG9uZSBmcmFtZSBwZXIgYnVmZmVyLgorICAgIGJvb2wgZG9CdWZmZXJBZ2dyZWdhdGlvbiA9IChhdWRpbyAmJiBtT2ZmbG9hZEF1ZGlvKTsKKyAgICBib29sIG5lZWRNb3JlRGF0YSA9IGZhbHNlOworCiAgICAgYm9vbCBkcm9wQWNjZXNzVW5pdDsKICAgICBkbyB7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPmRlcXVldWVBY2Nlc3NVbml0KGF1ZGlvLCAmYWNjZXNzVW5pdCk7CisgICAgICAgIHN0YXR1c190IGVycjsKKyAgICAgICAgLy8gRGlkIHdlIHNhdmUgYW4gYWNjZXNzVW5pdCBlYXJsaWVyIGJlY2F1c2Ugb2YgYSBkaXNjb250aW51aXR5PworICAgICAgICBpZiAoYXVkaW8gJiYgKG1QZW5kaW5nQXVkaW9BY2Nlc3NVbml0ICE9IE5VTEwpKSB7CisgICAgICAgICAgICBhY2Nlc3NVbml0ID0gbVBlbmRpbmdBdWRpb0FjY2Vzc1VuaXQ7CisgICAgICAgICAgICBtUGVuZGluZ0F1ZGlvQWNjZXNzVW5pdC5jbGVhcigpOworICAgICAgICAgICAgZXJyID0gbVBlbmRpbmdBdWRpb0VycjsKKyAgICAgICAgICAgIEFMT0dWKCJmZWVkRGVjb2RlcklucHV0RGF0YSgpIHVzZSBtUGVuZGluZ0F1ZGlvQWNjZXNzVW5pdCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXJyID0gbVNvdXJjZS0+ZGVxdWV1ZUFjY2Vzc1VuaXQoYXVkaW8sICZhY2Nlc3NVbml0KTsKKyAgICAgICAgfQogCiAgICAgICAgIGlmIChlcnIgPT0gLUVXT1VMREJMT0NLKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9IGVsc2UgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgaWYgKGVyciA9PSBJTkZPX0RJU0NPTlRJTlVJVFkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZG9CdWZmZXJBZ2dyZWdhdGlvbiAmJiAobUFnZ3JlZ2F0ZUJ1ZmZlciAhPSBOVUxMKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBXZSBhbHJlYWR5IGhhdmUgc29tZSBkYXRhIHNvIHNhdmUgdGhpcyBmb3IgbGF0ZXIuCisgICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nQXVkaW9FcnIgPSBlcnI7CisgICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nQXVkaW9BY2Nlc3NVbml0ID0gYWNjZXNzVW5pdDsKKyAgICAgICAgICAgICAgICAgICAgYWNjZXNzVW5pdC5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiZmVlZERlY29kZXJJbnB1dERhdGEoKSBzYXZlIGRpc2NvbnRpbnVpdHkgZm9yIGxhdGVyIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpbnQzMl90IHR5cGU7CiAgICAgICAgICAgICAgICAgQ0hFQ0soYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHkiLCAmdHlwZSkpOwogCkBAIC0xMDAyLDM0ICsxMzAwLDQ0IEBACiAgICAgICAgICAgICAgICAgbVRpbWVEaXNjb250aW51aXR5UGVuZGluZyA9CiAgICAgICAgICAgICAgICAgICAgIG1UaW1lRGlzY29udGludWl0eVBlbmRpbmcgfHwgdGltZUNoYW5nZTsKIAotICAgICAgICAgICAgICAgIGlmIChmb3JtYXRDaGFuZ2UgfHwgdGltZUNoYW5nZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobUZsdXNoaW5nQXVkaW8gPT0gTk9ORSAmJiBtRmx1c2hpbmdWaWRlbyA9PSBOT05FKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBBbmQgd2UnbGwgcmVzdW1lIHNjYW5uaW5nIHNvdXJjZXMgb25jZSB3ZSdyZSBkb25lCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmbHVzaGluZy4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9mcm9udCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUFjdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZOdVBsYXllcjo6cGVyZm9ybVNjYW5Tb3VyY2VzKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBib29sIHNlYW1sZXNzRm9ybWF0Q2hhbmdlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5ld0Zvcm1hdCA9IG1Tb3VyY2UtPmdldEZvcm1hdChhdWRpbyk7CisgICAgICAgICAgICAgICAgaWYgKGZvcm1hdENoYW5nZSkgeworICAgICAgICAgICAgICAgICAgICBzZWFtbGVzc0Zvcm1hdENoYW5nZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBnZXREZWNvZGVyKGF1ZGlvKS0+c3VwcG9ydHNTZWFtbGVzc0Zvcm1hdENoYW5nZShuZXdGb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAvLyB0cmVhdCBzZWFtbGVzcyBmb3JtYXQgY2hhbmdlIHNlcGFyYXRlbHkKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0Q2hhbmdlID0gIXNlYW1sZXNzRm9ybWF0Q2hhbmdlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBib29sIHNodXRkb3duT3JGbHVzaCA9IGZvcm1hdENoYW5nZSB8fCB0aW1lQ2hhbmdlOwogCi0gICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBuZXdGb3JtYXQgPSBtU291cmNlLT5nZXRGb3JtYXQoYXVkaW8pOwotICAgICAgICAgICAgICAgICAgICBzcDxEZWNvZGVyPiAmZGVjb2RlciA9IGF1ZGlvID8gbUF1ZGlvRGVjb2RlciA6IG1WaWRlb0RlY29kZXI7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmb3JtYXRDaGFuZ2UgJiYgIWRlY29kZXItPnN1cHBvcnRzU2VhbWxlc3NGb3JtYXRDaGFuZ2UobmV3Rm9ybWF0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2hEZWNvZGVyKGF1ZGlvLCAvKiBuZWVkU2h1dGRvd24gPSAqLyB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoRGVjb2RlcihhdWRpbywgLyogbmVlZFNodXRkb3duID0gKi8gZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gT0s7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBXZSB3YW50IHRvIHF1ZXVlIHVwIHNjYW4tc291cmNlcyBvbmx5IG9uY2UgcGVyIGRpc2NvbnRpbnVpdHkuCisgICAgICAgICAgICAgICAgLy8gV2UgY29udHJvbCB0aGlzIGJ5IGRvaW5nIGl0IG9ubHkgaWYgbmVpdGhlciBhdWRpbyBub3IgdmlkZW8gYXJlCisgICAgICAgICAgICAgICAgLy8gZmx1c2hpbmcgb3Igc2h1dHRpbmcgZG93bi4gIChBZnRlciBoYW5kbGluZyAxc3QgZGlzY29udGludWl0eSwgb25lCisgICAgICAgICAgICAgICAgLy8gb2YgdGhlIGZsdXNoaW5nIHN0YXRlcyB3aWxsIG5vdCBiZSBOT05FLikKKyAgICAgICAgICAgICAgICAvLyBObyBuZWVkIHRvIHNjYW4gc291cmNlcyBpZiB0aGlzIGRpc2NvbnRpbnVpdHkgZG9lcyBub3QgcmVzdWx0CisgICAgICAgICAgICAgICAgLy8gaW4gYSBmbHVzaCBvciBzaHV0ZG93biwgYXMgdGhlIGZsdXNoaW5nIHN0YXRlIHdpbGwgc3RheSBOT05FLgorICAgICAgICAgICAgICAgIGlmIChtRmx1c2hpbmdBdWRpbyA9PSBOT05FICYmIG1GbHVzaGluZ1ZpZGVvID09IE5PTkUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHNodXRkb3duT3JGbHVzaCkgeworICAgICAgICAgICAgICAgICAgICAvLyBBbmQgd2UnbGwgcmVzdW1lIHNjYW5uaW5nIHNvdXJjZXMgb25jZSB3ZSdyZSBkb25lCisgICAgICAgICAgICAgICAgICAgIC8vIGZsdXNoaW5nLgorICAgICAgICAgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfZnJvbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUFjdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk51UGxheWVyOjpwZXJmb3JtU2NhblNvdXJjZXMpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZm9ybWF0Q2hhbmdlIC8qIG5vdCBzZWFtbGVzcyAqLykgeworICAgICAgICAgICAgICAgICAgICAvLyBtdXN0IGNoYW5nZSBkZWNvZGVyCisgICAgICAgICAgICAgICAgICAgIGZsdXNoRGVjb2RlcihhdWRpbywgLyogbmVlZFNodXRkb3duID0gKi8gdHJ1ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aW1lQ2hhbmdlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gZmx1c2gKKyAgICAgICAgICAgICAgICAgICAgZmx1c2hEZWNvZGVyKGF1ZGlvLCAvKiBuZWVkU2h1dGRvd24gPSAqLyBmYWxzZSwgbmV3Rm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gT0s7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWFtbGVzc0Zvcm1hdENoYW5nZSkgeworICAgICAgICAgICAgICAgICAgICAvLyByZXVzZSBleGlzdGluZyBkZWNvZGVyIGFuZCBkb24ndCBmbHVzaAorICAgICAgICAgICAgICAgICAgICB1cGRhdGVEZWNvZGVyRm9ybWF0V2l0aG91dEZsdXNoKGF1ZGlvLCBuZXdGb3JtYXQpOworICAgICAgICAgICAgICAgICAgICBlcnIgPSBPSzsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHN0cmVhbSBpcyB1bmFmZmVjdGVkIGJ5IHRoZSBkaXNjb250aW51aXR5Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hpbmdBdWRpbyA9IEZMVVNIRUQ7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hpbmdWaWRlbyA9IEZMVVNIRUQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBmaW5pc2hGbHVzaElmUG9zc2libGUoKTsKLQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVXT1VMREJMT0NLOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTEwNDUsMTMgKzEzNTMsNTggQEAKIAogICAgICAgICBkcm9wQWNjZXNzVW5pdCA9IGZhbHNlOwogICAgICAgICBpZiAoIWF1ZGlvCi0gICAgICAgICAgICAgICAgJiYgbVZpZGVvTGF0ZUJ5VXMgPiAxMDAwMDBsbAorICAgICAgICAgICAgICAgICYmICEobVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX1NFQ1VSRSkKKyAgICAgICAgICAgICAgICAmJiBtUmVuZGVyZXItPmdldFZpZGVvTGF0ZUJ5VXMoKSA+IDEwMDAwMGxsCiAgICAgICAgICAgICAgICAgJiYgbVZpZGVvSXNBVkMKICAgICAgICAgICAgICAgICAmJiAhSXNBVkNSZWZlcmVuY2VGcmFtZShhY2Nlc3NVbml0KSkgewogICAgICAgICAgICAgZHJvcEFjY2Vzc1VuaXQgPSB0cnVlOwogICAgICAgICAgICAgKyttTnVtRnJhbWVzRHJvcHBlZDsKICAgICAgICAgfQotICAgIH0gd2hpbGUgKGRyb3BBY2Nlc3NVbml0KTsKKworICAgICAgICBzaXplX3Qgc21hbGxTaXplID0gYWNjZXNzVW5pdC0+c2l6ZSgpOworICAgICAgICBuZWVkTW9yZURhdGEgPSBmYWxzZTsKKyAgICAgICAgaWYgKGRvQnVmZmVyQWdncmVnYXRpb24gJiYgKG1BZ2dyZWdhdGVCdWZmZXIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAvLyBEb24ndCBib3RoZXIgaWYgb25seSByb29tIGZvciBhIGZldyBzbWFsbCBidWZmZXJzLgorICAgICAgICAgICAgICAgICYmIChzbWFsbFNpemUgPCAoa0FnZ3JlZ2F0ZUJ1ZmZlclNpemVCeXRlcyAvIDMpKSkgeworICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbGFyZ2VyIGJ1ZmZlciBmb3IgY29tYmluaW5nIHNtYWxsZXIgYnVmZmVycyBmcm9tIHRoZSBleHRyYWN0b3IuCisgICAgICAgICAgICBtQWdncmVnYXRlQnVmZmVyID0gbmV3IEFCdWZmZXIoa0FnZ3JlZ2F0ZUJ1ZmZlclNpemVCeXRlcyk7CisgICAgICAgICAgICBtQWdncmVnYXRlQnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsgLy8gc3RhcnQgZW1wdHkKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkb0J1ZmZlckFnZ3JlZ2F0aW9uICYmIChtQWdncmVnYXRlQnVmZmVyICE9IE5VTEwpKSB7CisgICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgICAgIGludDY0X3QgZHVtbXk7CisgICAgICAgICAgICBib29sIHNtYWxsVGltZXN0YW1wVmFsaWQgPSBhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcyk7CisgICAgICAgICAgICBib29sIGJpZ1RpbWVzdGFtcFZhbGlkID0gbUFnZ3JlZ2F0ZUJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZkdW1teSk7CisgICAgICAgICAgICAvLyBXaWxsIHRoZSBzbWFsbGVyIGJ1ZmZlciBmaXQ/CisgICAgICAgICAgICBzaXplX3QgYmlnU2l6ZSA9IG1BZ2dyZWdhdGVCdWZmZXItPnNpemUoKTsKKyAgICAgICAgICAgIHNpemVfdCByb29tTGVmdCA9IG1BZ2dyZWdhdGVCdWZmZXItPmNhcGFjaXR5KCkgLSBiaWdTaXplOworICAgICAgICAgICAgLy8gU2hvdWxkIHdlIHNhdmUgdGhpcyBzbWFsbCBidWZmZXIgZm9yIHRoZSBuZXh0IGJpZyBidWZmZXI/CisgICAgICAgICAgICAvLyBJZiB0aGUgZmlyc3Qgc21hbGwgYnVmZmVyIGRpZCBub3QgaGF2ZSBhIHRpbWVzdGFtcCB0aGVuIHNhdmUKKyAgICAgICAgICAgIC8vIGFueSBidWZmZXIgdGhhdCBkb2VzIGhhdmUgYSB0aW1lc3RhbXAgdW50aWwgdGhlIG5leHQgYmlnIGJ1ZmZlci4KKyAgICAgICAgICAgIGlmICgoc21hbGxTaXplID4gcm9vbUxlZnQpCisgICAgICAgICAgICAgICAgfHwgKCFiaWdUaW1lc3RhbXBWYWxpZCAmJiAoYmlnU2l6ZSA+IDApICYmIHNtYWxsVGltZXN0YW1wVmFsaWQpKSB7CisgICAgICAgICAgICAgICAgbVBlbmRpbmdBdWRpb0VyciA9IGVycjsKKyAgICAgICAgICAgICAgICBtUGVuZGluZ0F1ZGlvQWNjZXNzVW5pdCA9IGFjY2Vzc1VuaXQ7CisgICAgICAgICAgICAgICAgYWNjZXNzVW5pdC5jbGVhcigpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBHcmFiIHRpbWUgZnJvbSBmaXJzdCBzbWFsbCBidWZmZXIgaWYgYXZhaWxhYmxlLgorICAgICAgICAgICAgICAgIGlmICgoYmlnU2l6ZSA9PSAwKSAmJiBzbWFsbFRpbWVzdGFtcFZhbGlkKSB7CisgICAgICAgICAgICAgICAgICAgIG1BZ2dyZWdhdGVCdWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIEFwcGVuZCBzbWFsbCBidWZmZXIgdG8gdGhlIGJpZ2dlciBidWZmZXIuCisgICAgICAgICAgICAgICAgbWVtY3B5KG1BZ2dyZWdhdGVCdWZmZXItPmJhc2UoKSArIGJpZ1NpemUsIGFjY2Vzc1VuaXQtPmRhdGEoKSwgc21hbGxTaXplKTsKKyAgICAgICAgICAgICAgICBiaWdTaXplICs9IHNtYWxsU2l6ZTsKKyAgICAgICAgICAgICAgICBtQWdncmVnYXRlQnVmZmVyLT5zZXRSYW5nZSgwLCBiaWdTaXplKTsKKworICAgICAgICAgICAgICAgIC8vIEtlZXAgbG9vcGluZyB1bnRpbCB3ZSBydW4gb3V0IG9mIHJvb20gaW4gdGhlIG1BZ2dyZWdhdGVCdWZmZXIuCisgICAgICAgICAgICAgICAgbmVlZE1vcmVEYXRhID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgIEFMT0dWKCJmZWVkRGVjb2RlcklucHV0RGF0YSgpIHNtYWxsU2l6ZSA9ICV6dSwgYmlnU2l6ZSA9ICV6dSwgY2FwYWNpdHkgPSAlenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgc21hbGxTaXplLCBiaWdTaXplLCBtQWdncmVnYXRlQnVmZmVyLT5jYXBhY2l0eSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gd2hpbGUgKGRyb3BBY2Nlc3NVbml0IHx8IG5lZWRNb3JlRGF0YSk7CiAKICAgICAvLyBBTE9HVigicmV0dXJuZWQgYSB2YWxpZCBidWZmZXIgb2YgJXMgZGF0YSIsIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOwogCkBAIC0xMDYzLDcgKzE0MTYsMTkgQEAKICAgICAgICAgIG1lZGlhVGltZVVzIC8gMUU2KTsKICNlbmRpZgogCi0gICAgcmVwbHktPnNldEJ1ZmZlcigiYnVmZmVyIiwgYWNjZXNzVW5pdCk7CisgICAgaWYgKCFhdWRpbykgeworICAgICAgICBtQ0NEZWNvZGVyLT5kZWNvZGUoYWNjZXNzVW5pdCk7CisgICAgfQorCisgICAgaWYgKGRvQnVmZmVyQWdncmVnYXRpb24gJiYgKG1BZ2dyZWdhdGVCdWZmZXIgIT0gTlVMTCkpIHsKKyAgICAgICAgQUxPR1YoImZlZWREZWNvZGVySW5wdXREYXRhKCkgcmVwbHkgd2l0aCBhZ2dyZWdhdGVkIGJ1ZmZlciwgJXp1IiwKKyAgICAgICAgICAgICAgICBtQWdncmVnYXRlQnVmZmVyLT5zaXplKCkpOworICAgICAgICByZXBseS0+c2V0QnVmZmVyKCJidWZmZXIiLCBtQWdncmVnYXRlQnVmZmVyKTsKKyAgICAgICAgbUFnZ3JlZ2F0ZUJ1ZmZlci5jbGVhcigpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlcGx5LT5zZXRCdWZmZXIoImJ1ZmZlciIsIGFjY2Vzc1VuaXQpOworICAgIH0KKwogICAgIHJlcGx5LT5wb3N0KCk7CiAKICAgICByZXR1cm4gT0s7CkBAIC0xMDc1LDcgKzE0NDAsOCBAQAogICAgIHNwPEFNZXNzYWdlPiByZXBseTsKICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJyZXBseSIsICZyZXBseSkpOwogCi0gICAgaWYgKElzRmx1c2hpbmdTdGF0ZShhdWRpbyA/IG1GbHVzaGluZ0F1ZGlvIDogbUZsdXNoaW5nVmlkZW8pKSB7CisgICAgaWYgKChhdWRpbyAmJiBtRmx1c2hpbmdBdWRpbyAhPSBOT05FKQorICAgICAgICAgICAgfHwgKCFhdWRpbyAmJiBtRmx1c2hpbmdWaWRlbyAhPSBOT05FKSkgewogICAgICAgICAvLyBXZSdyZSBjdXJyZW50bHkgYXR0ZW1wdGluZyB0byBmbHVzaCB0aGUgZGVjb2RlciwgaW4gb3JkZXIKICAgICAgICAgLy8gdG8gY29tcGxldGUgdGhpcywgdGhlIGRlY29kZXIgd2FudHMgYWxsIGl0cyBidWZmZXJzIGJhY2ssCiAgICAgICAgIC8vIHNvIHdlIGRvbid0IHdhbnQgYW55IG91dHB1dCBidWZmZXJzIGl0IHNlbnQgdXMgKGZyb20gYmVmb3JlCkBAIC0xMDkxLDE0ICsxNDU3LDE1IEBACiAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOwogICAgIENIRUNLKG1zZy0+ZmluZEJ1ZmZlcigiYnVmZmVyIiwgJmJ1ZmZlcikpOwogCisgICAgaW50NjRfdCBtZWRpYVRpbWVVczsKKyAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbWVkaWFUaW1lVXMpKTsKKwogICAgIGludDY0X3QgJnNraXBVbnRpbE1lZGlhVGltZVVzID0KICAgICAgICAgYXVkaW8KICAgICAgICAgICAgID8gbVNraXBSZW5kZXJpbmdBdWRpb1VudGlsTWVkaWFUaW1lVXMKICAgICAgICAgICAgIDogbVNraXBSZW5kZXJpbmdWaWRlb1VudGlsTWVkaWFUaW1lVXM7CiAKICAgICBpZiAoc2tpcFVudGlsTWVkaWFUaW1lVXMgPj0gMCkgewotICAgICAgICBpbnQ2NF90IG1lZGlhVGltZVVzOwotICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbWVkaWFUaW1lVXMpKTsKIAogICAgICAgICBpZiAobWVkaWFUaW1lVXMgPCBza2lwVW50aWxNZWRpYVRpbWVVcykgewogICAgICAgICAgICAgQUxPR1YoImRyb3BwaW5nICVzIGJ1ZmZlciBhdCB0aW1lICVsbGQgYXMgcmVxdWVzdGVkLiIsCkBAIC0xMTEyLDkgKzE0NzksNzkgQEAKICAgICAgICAgc2tpcFVudGlsTWVkaWFUaW1lVXMgPSAtMTsKICAgICB9CiAKKyAgICBpZiAoIWF1ZGlvICYmIG1DQ0RlY29kZXItPmlzU2VsZWN0ZWQoKSkgeworICAgICAgICBtQ0NEZWNvZGVyLT5kaXNwbGF5KG1lZGlhVGltZVVzKTsKKyAgICB9CisKICAgICBtUmVuZGVyZXItPnF1ZXVlQnVmZmVyKGF1ZGlvLCBidWZmZXIsIHJlcGx5KTsKIH0KIAordm9pZCBOdVBsYXllcjo6dXBkYXRlVmlkZW9TaXplKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmlucHV0Rm9ybWF0LAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm91dHB1dEZvcm1hdCkgeworICAgIGlmIChpbnB1dEZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJVbmtub3duIHZpZGVvIHNpemUsIHJlcG9ydGluZyAweDAhIik7CisgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX1NFVF9WSURFT19TSVpFLCAwLCAwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDMyX3QgZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0OworICAgIGludDMyX3QgY3JvcExlZnQsIGNyb3BUb3AsIGNyb3BSaWdodCwgY3JvcEJvdHRvbTsKKworICAgIGlmIChvdXRwdXRGb3JtYXQgIT0gTlVMTCkgeworICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisgICAgICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkpOworICAgICAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpOworCisgICAgICAgIGludDMyX3QgY3JvcExlZnQsIGNyb3BUb3AsIGNyb3BSaWdodCwgY3JvcEJvdHRvbTsKKyAgICAgICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kUmVjdCgKKyAgICAgICAgICAgICAgICAgICAgImNyb3AiLAorICAgICAgICAgICAgICAgICAgICAmY3JvcExlZnQsICZjcm9wVG9wLCAmY3JvcFJpZ2h0LCAmY3JvcEJvdHRvbSkpOworCisgICAgICAgIGRpc3BsYXlXaWR0aCA9IGNyb3BSaWdodCAtIGNyb3BMZWZ0ICsgMTsKKyAgICAgICAgZGlzcGxheUhlaWdodCA9IGNyb3BCb3R0b20gLSBjcm9wVG9wICsgMTsKKworICAgICAgICBBTE9HVigiVmlkZW8gb3V0cHV0IGZvcm1hdCBjaGFuZ2VkIHRvICVkIHggJWQgIgorICAgICAgICAgICAgICIoY3JvcDogJWQgeCAlZCBAICglZCwgJWQpKSIsCisgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICBkaXNwbGF5V2lkdGgsCisgICAgICAgICAgICAgZGlzcGxheUhlaWdodCwKKyAgICAgICAgICAgICBjcm9wTGVmdCwgY3JvcFRvcCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQ0hFQ0soaW5wdXRGb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmZGlzcGxheVdpZHRoKSk7CisgICAgICAgIENIRUNLKGlucHV0Rm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZkaXNwbGF5SGVpZ2h0KSk7CisKKyAgICAgICAgQUxPR1YoIlZpZGVvIGlucHV0IGZvcm1hdCAlZCB4ICVkIiwgZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0KTsKKyAgICB9CisKKyAgICAvLyBUYWtlIGludG8gYWNjb3VudCBzYW1wbGUgYXNwZWN0IHJhdGlvIGlmIG5lY2Vzc2FyeToKKyAgICBpbnQzMl90IHNhcldpZHRoLCBzYXJIZWlnaHQ7CisgICAgaWYgKGlucHV0Rm9ybWF0LT5maW5kSW50MzIoInNhci13aWR0aCIsICZzYXJXaWR0aCkKKyAgICAgICAgICAgICYmIGlucHV0Rm9ybWF0LT5maW5kSW50MzIoInNhci1oZWlnaHQiLCAmc2FySGVpZ2h0KSkgeworICAgICAgICBBTE9HVigiU2FtcGxlIGFzcGVjdCByYXRpbyAlZCA6ICVkIiwgc2FyV2lkdGgsIHNhckhlaWdodCk7CisKKyAgICAgICAgZGlzcGxheVdpZHRoID0gKGRpc3BsYXlXaWR0aCAqIHNhcldpZHRoKSAvIHNhckhlaWdodDsKKworICAgICAgICBBTE9HVigiZGlzcGxheSBkaW1lbnNpb25zICVkIHggJWQiLCBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQpOworICAgIH0KKworICAgIGludDMyX3Qgcm90YXRpb25EZWdyZWVzOworICAgIGlmICghaW5wdXRGb3JtYXQtPmZpbmRJbnQzMigicm90YXRpb24tZGVncmVlcyIsICZyb3RhdGlvbkRlZ3JlZXMpKSB7CisgICAgICAgIHJvdGF0aW9uRGVncmVlcyA9IDA7CisgICAgfQorCisgICAgaWYgKHJvdGF0aW9uRGVncmVlcyA9PSA5MCB8fCByb3RhdGlvbkRlZ3JlZXMgPT0gMjcwKSB7CisgICAgICAgIGludDMyX3QgdG1wID0gZGlzcGxheVdpZHRoOworICAgICAgICBkaXNwbGF5V2lkdGggPSBkaXNwbGF5SGVpZ2h0OworICAgICAgICBkaXNwbGF5SGVpZ2h0ID0gdG1wOworICAgIH0KKworICAgIG5vdGlmeUxpc3RlbmVyKAorICAgICAgICAgICAgTUVESUFfU0VUX1ZJREVPX1NJWkUsCisgICAgICAgICAgICBkaXNwbGF5V2lkdGgsCisgICAgICAgICAgICBkaXNwbGF5SGVpZ2h0KTsKK30KKwogdm9pZCBOdVBsYXllcjo6bm90aWZ5TGlzdGVuZXIoaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKmluKSB7CiAgICAgaWYgKG1Ecml2ZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CkBAIC0xMTI5LDYzICsxNTY2LDcyIEBACiAgICAgZHJpdmVyLT5ub3RpZnlMaXN0ZW5lcihtc2csIGV4dDEsIGV4dDIsIGluKTsKIH0KIAotdm9pZCBOdVBsYXllcjo6Zmx1c2hEZWNvZGVyKGJvb2wgYXVkaW8sIGJvb2wgbmVlZFNodXRkb3duKSB7Cit2b2lkIE51UGxheWVyOjpmbHVzaERlY29kZXIoCisgICAgICAgIGJvb2wgYXVkaW8sIGJvb2wgbmVlZFNodXRkb3duLCBjb25zdCBzcDxBTWVzc2FnZT4gJm5ld0Zvcm1hdCkgewogICAgIEFMT0dWKCJbJXNdIGZsdXNoRGVjb2RlciBuZWVkU2h1dGRvd249JWQiLAogICAgICAgICAgIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIsIG5lZWRTaHV0ZG93bik7CiAKLSAgICBpZiAoKGF1ZGlvICYmIG1BdWRpb0RlY29kZXIgPT0gTlVMTCkgfHwgKCFhdWRpbyAmJiBtVmlkZW9EZWNvZGVyID09IE5VTEwpKSB7CisgICAgY29uc3Qgc3A8RGVjb2Rlcj4gJmRlY29kZXIgPSBnZXREZWNvZGVyKGF1ZGlvKTsKKyAgICBpZiAoZGVjb2RlciA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dJKCJmbHVzaERlY29kZXIgJXMgd2l0aG91dCBkZWNvZGVyIHByZXNlbnQiLAogICAgICAgICAgICAgIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOworICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IGNvbnRpbnVlIHRvIHNjYW4gc291cmNlcyB1bnRpbCB3ZSBmaW5pc2ggZmx1c2hpbmcuCiAgICAgKyttU2NhblNvdXJjZXNHZW5lcmF0aW9uOwogICAgIG1TY2FuU291cmNlc1BlbmRpbmcgPSBmYWxzZTsKIAotICAgIChhdWRpbyA/IG1BdWRpb0RlY29kZXIgOiBtVmlkZW9EZWNvZGVyKS0+c2lnbmFsRmx1c2goKTsKKyAgICBkZWNvZGVyLT5zaWduYWxGbHVzaChuZXdGb3JtYXQpOwogICAgIG1SZW5kZXJlci0+Zmx1c2goYXVkaW8pOwogCiAgICAgRmx1c2hTdGF0dXMgbmV3U3RhdHVzID0KICAgICAgICAgbmVlZFNodXRkb3duID8gRkxVU0hJTkdfREVDT0RFUl9TSFVURE9XTiA6IEZMVVNISU5HX0RFQ09ERVI7CiAKKyAgICBtRmx1c2hDb21wbGV0ZVthdWRpb11bZmFsc2UgLyogaXNEZWNvZGVyICovXSA9IGZhbHNlOworICAgIG1GbHVzaENvbXBsZXRlW2F1ZGlvXVt0cnVlIC8qIGlzRGVjb2RlciAqL10gPSBmYWxzZTsKICAgICBpZiAoYXVkaW8pIHsKLSAgICAgICAgQ0hFQ0sobUZsdXNoaW5nQXVkaW8gPT0gTk9ORQotICAgICAgICAgICAgICAgIHx8IG1GbHVzaGluZ0F1ZGlvID09IEFXQUlUSU5HX0RJU0NPTlRJTlVJVFkpOwotCisgICAgICAgIEFMT0dFX0lGKG1GbHVzaGluZ0F1ZGlvICE9IE5PTkUsCisgICAgICAgICAgICAgICAgImF1ZGlvIGZsdXNoRGVjb2RlcigpIGlzIGNhbGxlZCBpbiBzdGF0ZSAlZCIsIG1GbHVzaGluZ0F1ZGlvKTsKICAgICAgICAgbUZsdXNoaW5nQXVkaW8gPSBuZXdTdGF0dXM7Ci0KLSAgICAgICAgaWYgKG1GbHVzaGluZ1ZpZGVvID09IE5PTkUpIHsKLSAgICAgICAgICAgIG1GbHVzaGluZ1ZpZGVvID0gKG1WaWRlb0RlY29kZXIgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICA/IEFXQUlUSU5HX0RJU0NPTlRJTlVJVFkKLSAgICAgICAgICAgICAgICA6IEZMVVNIRUQ7Ci0gICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBDSEVDSyhtRmx1c2hpbmdWaWRlbyA9PSBOT05FCi0gICAgICAgICAgICAgICAgfHwgbUZsdXNoaW5nVmlkZW8gPT0gQVdBSVRJTkdfRElTQ09OVElOVUlUWSk7Ci0KKyAgICAgICAgQUxPR0VfSUYobUZsdXNoaW5nVmlkZW8gIT0gTk9ORSwKKyAgICAgICAgICAgICAgICAidmlkZW8gZmx1c2hEZWNvZGVyKCkgaXMgY2FsbGVkIGluIHN0YXRlICVkIiwgbUZsdXNoaW5nVmlkZW8pOwogICAgICAgICBtRmx1c2hpbmdWaWRlbyA9IG5ld1N0YXR1czsKIAotICAgICAgICBpZiAobUZsdXNoaW5nQXVkaW8gPT0gTk9ORSkgewotICAgICAgICAgICAgbUZsdXNoaW5nQXVkaW8gPSAobUF1ZGlvRGVjb2RlciAhPSBOVUxMKQotICAgICAgICAgICAgICAgID8gQVdBSVRJTkdfRElTQ09OVElOVUlUWQotICAgICAgICAgICAgICAgIDogRkxVU0hFRDsKKyAgICAgICAgaWYgKG1DQ0RlY29kZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgbUNDRGVjb2Rlci0+Zmx1c2goKTsKICAgICAgICAgfQogICAgIH0KIH0KIAotc3A8QU1lc3NhZ2U+IE51UGxheWVyOjpTb3VyY2U6OmdldEZvcm1hdChib29sIGF1ZGlvKSB7Ci0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBnZXRGb3JtYXRNZXRhKGF1ZGlvKTsKK3ZvaWQgTnVQbGF5ZXI6OnVwZGF0ZURlY29kZXJGb3JtYXRXaXRob3V0Rmx1c2goCisgICAgICAgIGJvb2wgYXVkaW8sIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7CisgICAgQUxPR1YoIlslc10gdXBkYXRlRGVjb2RlckZvcm1hdFdpdGhvdXRGbHVzaCIsIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOwogCi0gICAgaWYgKG1ldGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjb25zdCBzcDxEZWNvZGVyPiAmZGVjb2RlciA9IGdldERlY29kZXIoYXVkaW8pOworICAgIGlmIChkZWNvZGVyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0koInVwZGF0ZURlY29kZXJGb3JtYXRXaXRob3V0Rmx1c2ggJXMgd2l0aG91dCBkZWNvZGVyIHByZXNlbnQiLAorICAgICAgICAgICAgIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOworICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZTsKKyAgICBkZWNvZGVyLT5zaWduYWxVcGRhdGVGb3JtYXQoZm9ybWF0KTsKK30KIAotICAgIGlmKGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZShtZXRhLCAmbXNnKSA9PSBPSykgewotICAgICAgICByZXR1cm4gbXNnOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKK3ZvaWQgTnVQbGF5ZXI6OnF1ZXVlRGVjb2RlclNodXRkb3duKAorICAgICAgICBib29sIGF1ZGlvLCBib29sIHZpZGVvLCBjb25zdCBzcDxBTWVzc2FnZT4gJnJlcGx5KSB7CisgICAgQUxPR0koInF1ZXVlRGVjb2RlclNodXRkb3duIGF1ZGlvPSVkLCB2aWRlbz0lZCIsIGF1ZGlvLCB2aWRlbyk7CisKKyAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgIG5ldyBTaHV0ZG93bkRlY29kZXJBY3Rpb24oYXVkaW8sIHZpZGVvKSk7CisKKyAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgIG5ldyBTaW1wbGVBY3Rpb24oJk51UGxheWVyOjpwZXJmb3JtU2NhblNvdXJjZXMpKTsKKworICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKG5ldyBQb3N0TWVzc2FnZUFjdGlvbihyZXBseSkpOworCisgICAgcHJvY2Vzc0RlZmVycmVkQWN0aW9ucygpOwogfQogCiBzdGF0dXNfdCBOdVBsYXllcjo6c2V0VmlkZW9TY2FsaW5nTW9kZShpbnQzMl90IG1vZGUpIHsKQEAgLTEyMTEsNiArMTY1NywxOSBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKK3N0YXR1c190IE51UGxheWVyOjpnZXRTZWxlY3RlZFRyYWNrKGludDMyX3QgdHlwZSwgUGFyY2VsKiByZXBseSkgY29uc3QgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRTZWxlY3RlZFRyYWNrLCBpZCgpKTsKKyAgICBtc2ctPnNldFBvaW50ZXIoInJlcGx5IiwgcmVwbHkpOworICAgIG1zZy0+c2V0SW50MzIoInR5cGUiLCB0eXBlKTsKKworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CisgICAgaWYgKGVyciA9PSBPSyAmJiByZXNwb25zZSAhPSBOVUxMKSB7CisgICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKwogc3RhdHVzX3QgTnVQbGF5ZXI6OnNlbGVjdFRyYWNrKHNpemVfdCB0cmFja0luZGV4LCBib29sIHNlbGVjdCkgewogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZWxlY3RUcmFjaywgaWQoKSk7CiAgICAgbXNnLT5zZXRTaXplKCJ0cmFja0luZGV4IiwgdHJhY2tJbmRleCk7CkBAIC0xMjE5LDkgKzE2NzgsMzUgQEAKICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CiAgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOwogCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmICghcmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpIHsKKyAgICAgICAgZXJyID0gT0s7CisgICAgfQorCiAgICAgcmV0dXJuIGVycjsKIH0KIAorc3RhdHVzX3QgTnVQbGF5ZXI6OmdldEN1cnJlbnRQb3NpdGlvbihpbnQ2NF90ICptZWRpYVVzKSB7CisgICAgc3A8UmVuZGVyZXI+IHJlbmRlcmVyID0gbVJlbmRlcmVyOworICAgIGlmIChyZW5kZXJlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHJldHVybiByZW5kZXJlci0+Z2V0Q3VycmVudFBvc2l0aW9uKG1lZGlhVXMpOworfQorCit2b2lkIE51UGxheWVyOjpnZXRTdGF0cyhpbnQ2NF90ICpudW1GcmFtZXNUb3RhbCwgaW50NjRfdCAqbnVtRnJhbWVzRHJvcHBlZCkgeworICAgICpudW1GcmFtZXNUb3RhbCA9IG1OdW1GcmFtZXNUb3RhbDsKKyAgICAqbnVtRnJhbWVzRHJvcHBlZCA9IG1OdW1GcmFtZXNEcm9wcGVkOworfQorCitzcDxNZXRhRGF0YT4gTnVQbGF5ZXI6OmdldEZpbGVNZXRhKCkgeworICAgIHJldHVybiBtU291cmNlLT5nZXRGaWxlRm9ybWF0TWV0YSgpOworfQorCiB2b2lkIE51UGxheWVyOjpzY2hlZHVsZVBvbGxEdXJhdGlvbigpIHsKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UG9sbER1cmF0aW9uLCBpZCgpKTsKICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVBvbGxEdXJhdGlvbkdlbmVyYXRpb24pOwpAQCAtMTIzOCwxOCArMTcyMyw2IEBACiAgICAgICAgIC8vIGFuIGludGVybWVkaWF0ZSBzdGF0ZSwgaS5lLiBvbmUgbW9yZSBtb3JlIGRlY29kZXJzIGFyZSBjdXJyZW50bHkKICAgICAgICAgLy8gZmx1c2hpbmcgb3Igc2h1dHRpbmcgZG93bi4KIAotICAgICAgICBpZiAobVJlbmRlcmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIC8vIFRoZXJlJ3MgYW4gZWRnZSBjYXNlIHdoZXJlIHRoZSByZW5kZXJlciBvd25zIGFsbCBvdXRwdXQKLSAgICAgICAgICAgIC8vIGJ1ZmZlcnMgYW5kIGlzIHBhdXNlZCwgdGhlcmVmb3JlIHRoZSBkZWNvZGVyIHdpbGwgbm90IHJlYWQKLSAgICAgICAgICAgIC8vIG1vcmUgaW5wdXQgZGF0YSBhbmQgd2lsbCBuZXZlciBlbmNvdW50ZXIgdGhlIG1hdGNoaW5nCi0gICAgICAgICAgICAvLyBkaXNjb250aW51aXR5LiBUbyBhdm9pZCB0aGlzLCB3ZSByZXN1bWUgdGhlIHJlbmRlcmVyLgotCi0gICAgICAgICAgICBpZiAobUZsdXNoaW5nQXVkaW8gPT0gQVdBSVRJTkdfRElTQ09OVElOVUlUWQotICAgICAgICAgICAgICAgICAgICB8fCBtRmx1c2hpbmdWaWRlbyA9PSBBV0FJVElOR19ESVNDT05USU5VSVRZKSB7Ci0gICAgICAgICAgICAgICAgbVJlbmRlcmVyLT5yZXN1bWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIGlmIChtRmx1c2hpbmdBdWRpbyAhPSBOT05FIHx8IG1GbHVzaGluZ1ZpZGVvICE9IE5PTkUpIHsKICAgICAgICAgICAgIC8vIFdlJ3JlIGN1cnJlbnRseSBmbHVzaGluZywgcG9zdHBvbmUgdGhlIHJlc2V0IHVudGlsIHRoYXQncwogICAgICAgICAgICAgLy8gY29tcGxldGVkLgpAQCAtMTI2NywxOCArMTc0MCwyOSBAQAogICAgIH0KIH0KIAotdm9pZCBOdVBsYXllcjo6cGVyZm9ybVNlZWsoaW50NjRfdCBzZWVrVGltZVVzKSB7Ci0gICAgQUxPR1YoInBlcmZvcm1TZWVrIHNlZWtUaW1lVXM9JWxsZCB1cyAoJS4yZiBzZWNzKSIsCit2b2lkIE51UGxheWVyOjpwZXJmb3JtU2VlayhpbnQ2NF90IHNlZWtUaW1lVXMsIGJvb2wgbmVlZE5vdGlmeSkgeworICAgIEFMT0dWKCJwZXJmb3JtU2VlayBzZWVrVGltZVVzPSVsbGQgdXMgKCUuMmYgc2VjcyksIG5lZWROb3RpZnkoJWQpIiwKICAgICAgICAgICBzZWVrVGltZVVzLAotICAgICAgICAgIHNlZWtUaW1lVXMgLyAxRTYpOworICAgICAgICAgIHNlZWtUaW1lVXMgLyAxRTYsCisgICAgICAgICAgbmVlZE5vdGlmeSk7CiAKKyAgICBpZiAobVNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIC8vIFRoaXMgaGFwcGVucyB3aGVuIHJlc2V0IG9jY3VycyByaWdodCBiZWZvcmUgdGhlIGxvb3AgbW9kZQorICAgICAgICAvLyBhc3luY2hyb25vdXNseSBzZWVrcyB0byB0aGUgc3RhcnQgb2YgdGhlIHN0cmVhbS4KKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtQXVkaW9EZWNvZGVyICE9IE5VTEwgfHwgbVZpZGVvRGVjb2RlciAhPSBOVUxMLAorICAgICAgICAgICAgICAgICJtU291cmNlIGlzIE5VTEwgYW5kIGRlY29kZXJzIG5vdCBOVUxMIGF1ZGlvKCVwKSB2aWRlbyglcCkiLAorICAgICAgICAgICAgICAgIG1BdWRpb0RlY29kZXIuZ2V0KCksIG1WaWRlb0RlY29kZXIuZ2V0KCkpOworICAgICAgICByZXR1cm47CisgICAgfQogICAgIG1Tb3VyY2UtPnNlZWtUbyhzZWVrVGltZVVzKTsKKyAgICArK21UaW1lZFRleHRHZW5lcmF0aW9uOwogCiAgICAgaWYgKG1Ecml2ZXIgIT0gTlVMTCkgewogICAgICAgICBzcDxOdVBsYXllckRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CiAgICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlQb3NpdGlvbihzZWVrVGltZVVzKTsKLSAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5U2Vla0NvbXBsZXRlKCk7CisgICAgICAgICAgICBpZiAobmVlZE5vdGlmeSkgeworICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5U2Vla0NvbXBsZXRlKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEzMTMsMTQgKzE3OTcsNiBAQAogCiAgICAgbVRpbWVEaXNjb250aW51aXR5UGVuZGluZyA9IHRydWU7CiAKLSAgICBpZiAobUZsdXNoaW5nQXVkaW8gPT0gTk9ORSAmJiAoIWF1ZGlvIHx8IG1BdWRpb0RlY29kZXIgPT0gTlVMTCkpIHsKLSAgICAgICAgbUZsdXNoaW5nQXVkaW8gPSBGTFVTSEVEOwotICAgIH0KLQotICAgIGlmIChtRmx1c2hpbmdWaWRlbyA9PSBOT05FICYmICghdmlkZW8gfHwgbVZpZGVvRGVjb2RlciA9PSBOVUxMKSkgewotICAgICAgICBtRmx1c2hpbmdWaWRlbyA9IEZMVVNIRUQ7Ci0gICAgfQotCiAgICAgaWYgKGF1ZGlvICYmIG1BdWRpb0RlY29kZXIgIT0gTlVMTCkgewogICAgICAgICBmbHVzaERlY29kZXIodHJ1ZSAvKiBhdWRpbyAqLywgdHJ1ZSAvKiBuZWVkU2h1dGRvd24gKi8pOwogICAgIH0KQEAgLTEzNDEsMTMgKzE4MTcsMTkgQEAKICAgICArK21TY2FuU291cmNlc0dlbmVyYXRpb247CiAgICAgbVNjYW5Tb3VyY2VzUGVuZGluZyA9IGZhbHNlOwogCisgICAgaWYgKG1SZW5kZXJlckxvb3BlciAhPSBOVUxMKSB7CisgICAgICAgIGlmIChtUmVuZGVyZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgbVJlbmRlcmVyTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtUmVuZGVyZXItPmlkKCkpOworICAgICAgICB9CisgICAgICAgIG1SZW5kZXJlckxvb3Blci0+c3RvcCgpOworICAgICAgICBtUmVuZGVyZXJMb29wZXIuY2xlYXIoKTsKKyAgICB9CiAgICAgbVJlbmRlcmVyLmNsZWFyKCk7CisgICAgKyttUmVuZGVyZXJHZW5lcmF0aW9uOwogCiAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewogICAgICAgICBtU291cmNlLT5zdG9wKCk7CiAKLSAgICAgICAgbG9vcGVyKCktPnVucmVnaXN0ZXJIYW5kbGVyKG1Tb3VyY2UtPmlkKCkpOwotCiAgICAgICAgIG1Tb3VyY2UuY2xlYXIoKTsKICAgICB9CiAKQEAgLTE0MDgsMTYgKzE4OTAsMTUgQEAKIAogICAgICAgICAgICAgc3A8TnVQbGF5ZXJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOwogICAgICAgICAgICAgaWYgKGRyaXZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgLy8gbm90aWZ5IGR1cmF0aW9uIGZpcnN0LCBzbyB0aGF0IGl0J3MgZGVmaW5pdGVseSBzZXQgd2hlbgorICAgICAgICAgICAgICAgIC8vIHRoZSBhcHAgcmVjZWl2ZWQgdGhlICJwcmVwYXJlIGNvbXBsZXRlIiBjYWxsYmFjay4KKyAgICAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CisgICAgICAgICAgICAgICAgaWYgKG1Tb3VyY2UtPmdldER1cmF0aW9uKCZkdXJhdGlvblVzKSA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeUR1cmF0aW9uKGR1cmF0aW9uVXMpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVByZXBhcmVDb21wbGV0ZWQoZXJyKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOwotICAgICAgICAgICAgaWYgKG1Ecml2ZXIgIT0gTlVMTCAmJiBtU291cmNlLT5nZXREdXJhdGlvbigmZHVyYXRpb25VcykgPT0gT0spIHsKLSAgICAgICAgICAgICAgICBzcDxOdVBsYXllckRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRyaXZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5RHVyYXRpb24oZHVyYXRpb25Vcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTQ0NiwxMSArMTkyNywxOSBAQAogCiAgICAgICAgIGNhc2UgU291cmNlOjprV2hhdFZpZGVvU2l6ZUNoYW5nZWQ6CiAgICAgICAgIHsKLSAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkpOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKTsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJmb3JtYXQiLCAmZm9ybWF0KSk7CiAKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX1NFVF9WSURFT19TSVpFLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIHVwZGF0ZVZpZGVvU2l6ZShmb3JtYXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNvdXJjZTo6a1doYXRCdWZmZXJpbmdVcGRhdGU6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgcGVyY2VudGFnZTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJwZXJjZW50YWdlIiwgJnBlcmNlbnRhZ2UpKTsKKworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfQlVGRkVSSU5HX1VQREFURSwgcGVyY2VudGFnZSwgMCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xNDcxLDIxICsxOTYwLDQwIEBACiAgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXI7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRCdWZmZXIoImJ1ZmZlciIsICZidWZmZXIpKTsKIAotICAgICAgICAgICAgaW50MzJfdCB0cmFja0luZGV4OwotICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMsIGR1cmF0aW9uVXM7Ci0gICAgICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJ0cmFja0luZGV4IiwgJnRyYWNrSW5kZXgpKTsKKyAgICAgICAgICAgIHNlbmRTdWJ0aXRsZURhdGEoYnVmZmVyLCAwIC8qIGJhc2VJbmRleCAqLyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU291cmNlOjprV2hhdFRpbWVkVGV4dERhdGE6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKQorICAgICAgICAgICAgICAgICAgICAmJiBnZW5lcmF0aW9uICE9IG1UaW1lZFRleHRHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEJ1ZmZlcigiYnVmZmVyIiwgJmJ1ZmZlcikpOworCisgICAgICAgICAgICBzcDxOdVBsYXllckRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoZHJpdmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IHBvc01zOworICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMsIHBvc1VzOworICAgICAgICAgICAgZHJpdmVyLT5nZXRDdXJyZW50UG9zaXRpb24oJnBvc01zKTsKKyAgICAgICAgICAgIHBvc1VzID0gcG9zTXMgKiAxMDAwOwogICAgICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwotICAgICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgiZHVyYXRpb25VcyIsICZkdXJhdGlvblVzKSk7CiAKLSAgICAgICAgICAgIFBhcmNlbCBpbjsKLSAgICAgICAgICAgIGluLndyaXRlSW50MzIodHJhY2tJbmRleCk7Ci0gICAgICAgICAgICBpbi53cml0ZUludDY0KHRpbWVVcyk7Ci0gICAgICAgICAgICBpbi53cml0ZUludDY0KGR1cmF0aW9uVXMpOwotICAgICAgICAgICAgaW4ud3JpdGVJbnQzMihidWZmZXItPnNpemUoKSk7Ci0gICAgICAgICAgICBpbi53cml0ZUludDMyKGJ1ZmZlci0+c2l6ZSgpKTsKLSAgICAgICAgICAgIGluLndyaXRlKGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7Ci0KLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX1NVQlRJVExFX0RBVEEsIDAsIDAsICZpbik7CisgICAgICAgICAgICBpZiAocG9zVXMgPCB0aW1lVXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKSB7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtVGltZWRUZXh0R2VuZXJhdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1zZy0+cG9zdCh0aW1lVXMgLSBwb3NVcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNlbmRUaW1lZFRleHREYXRhKGJ1ZmZlcik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xNTAyLDEzICsyMDEwLDExMiBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIFNvdXJjZTo6a1doYXREcm1Ob0xpY2Vuc2U6CisgICAgICAgIHsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX0VSUk9SLCBNRURJQV9FUlJPUl9VTktOT1dOLCBFUlJPUl9EUk1fTk9fTElDRU5TRSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBUUkVTUEFTUygpOwogICAgIH0KIH0KIAordm9pZCBOdVBsYXllcjo6b25DbG9zZWRDYXB0aW9uTm90aWZ5KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgaW50MzJfdCB3aGF0OworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ3aGF0IiwgJndoYXQpKTsKKworICAgIHN3aXRjaCAod2hhdCkgeworICAgICAgICBjYXNlIE51UGxheWVyOjpDQ0RlY29kZXI6OmtXaGF0Q2xvc2VkQ2FwdGlvbkRhdGE6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEJ1ZmZlcigiYnVmZmVyIiwgJmJ1ZmZlcikpOworCisgICAgICAgICAgICBzaXplX3QgaW5iYW5kVHJhY2tzID0gMDsKKyAgICAgICAgICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpbmJhbmRUcmFja3MgPSBtU291cmNlLT5nZXRUcmFja0NvdW50KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNlbmRTdWJ0aXRsZURhdGEoYnVmZmVyLCBpbmJhbmRUcmFja3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE51UGxheWVyOjpDQ0RlY29kZXI6OmtXaGF0VHJhY2tBZGRlZDoKKyAgICAgICAgeworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfSU5GTywgTUVESUFfSU5GT19NRVRBREFUQV9VUERBVEUsIDApOworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBUUkVTUEFTUygpOworICAgIH0KKworCit9CisKK3ZvaWQgTnVQbGF5ZXI6OnNlbmRTdWJ0aXRsZURhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciwgaW50MzJfdCBiYXNlSW5kZXgpIHsKKyAgICBpbnQzMl90IHRyYWNrSW5kZXg7CisgICAgaW50NjRfdCB0aW1lVXMsIGR1cmF0aW9uVXM7CisgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigidHJhY2tJbmRleCIsICZ0cmFja0luZGV4KSk7CisgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoImR1cmF0aW9uVXMiLCAmZHVyYXRpb25VcykpOworCisgICAgUGFyY2VsIGluOworICAgIGluLndyaXRlSW50MzIodHJhY2tJbmRleCArIGJhc2VJbmRleCk7CisgICAgaW4ud3JpdGVJbnQ2NCh0aW1lVXMpOworICAgIGluLndyaXRlSW50NjQoZHVyYXRpb25Vcyk7CisgICAgaW4ud3JpdGVJbnQzMihidWZmZXItPnNpemUoKSk7CisgICAgaW4ud3JpdGVJbnQzMihidWZmZXItPnNpemUoKSk7CisgICAgaW4ud3JpdGUoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKKworICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX1NVQlRJVExFX0RBVEEsIDAsIDAsICZpbik7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OnNlbmRUaW1lZFRleHREYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKKyAgICBjb25zdCB2b2lkICpkYXRhOworICAgIHNpemVfdCBzaXplID0gMDsKKyAgICBpbnQ2NF90IHRpbWVVczsKKyAgICBpbnQzMl90IGZsYWcgPSBUZXh0RGVzY3JpcHRpb25zOjpMT0NBTF9ERVNDUklQVElPTlM7CisKKyAgICBBU3RyaW5nIG1pbWU7CisgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOworICAgIENIRUNLKHN0cmNhc2VjbXAobWltZS5jX3N0cigpLCBNRURJQV9NSU1FVFlQRV9URVhUXzNHUFApID09IDApOworCisgICAgZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOworICAgIHNpemUgPSBidWZmZXItPnNpemUoKTsKKworICAgIFBhcmNlbCBwYXJjZWw7CisgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKyAgICAgICAgZmxhZyB8PSBUZXh0RGVzY3JpcHRpb25zOjpJTl9CQU5EX1RFWFRfM0dQUDsKKyAgICAgICAgVGV4dERlc2NyaXB0aW9uczo6Z2V0UGFyY2VsT2ZEZXNjcmlwdGlvbnMoCisgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilkYXRhLCBzaXplLCBmbGFnLCB0aW1lVXMgLyAxMDAwLCAmcGFyY2VsKTsKKyAgICB9CisKKyAgICBpZiAoKHBhcmNlbC5kYXRhU2l6ZSgpID4gMCkpIHsKKyAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfVElNRURfVEVYVCwgMCwgMCwgJnBhcmNlbCk7CisgICAgfSBlbHNlIHsgIC8vIHNlbmQgYW4gZW1wdHkgdGltZWQgdGV4dAorICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9USU1FRF9URVhULCAwLCAwKTsKKyAgICB9Cit9CiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCitzcDxBTWVzc2FnZT4gTnVQbGF5ZXI6OlNvdXJjZTo6Z2V0Rm9ybWF0KGJvb2wgYXVkaW8pIHsKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IGdldEZvcm1hdE1ldGEoYXVkaW8pOworCisgICAgaWYgKG1ldGEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlOworCisgICAgaWYoY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKG1ldGEsICZtc2cpID09IE9LKSB7CisgICAgICAgIHJldHVybiBtc2c7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCiB2b2lkIE51UGxheWVyOjpTb3VyY2U6Om5vdGlmeUZsYWdzQ2hhbmdlZCh1aW50MzJfdCBmbGFncykgewogICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRGbGFnc0NoYW5nZWQpOwpAQCAtMTUxNiwxMSArMjEyMywxMCBAQAogICAgIG5vdGlmeS0+cG9zdCgpOwogfQogCi12b2lkIE51UGxheWVyOjpTb3VyY2U6Om5vdGlmeVZpZGVvU2l6ZUNoYW5nZWQoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpIHsKK3ZvaWQgTnVQbGF5ZXI6OlNvdXJjZTo6bm90aWZ5VmlkZW9TaXplQ2hhbmdlZChjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgewogICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRWaWRlb1NpemVDaGFuZ2VkKTsKLSAgICBub3RpZnktPnNldEludDMyKCJ3aWR0aCIsIHdpZHRoKTsKLSAgICBub3RpZnktPnNldEludDMyKCJoZWlnaHQiLCBoZWlnaHQpOworICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgiZm9ybWF0IiwgZm9ybWF0KTsKICAgICBub3RpZnktPnBvc3QoKTsKIH0KIApAQCAtMTUzMSwyMyArMjEzNyw4IEBACiAgICAgbm90aWZ5LT5wb3N0KCk7CiB9CiAKLXZvaWQgTnVQbGF5ZXI6OlNvdXJjZTo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKK3ZvaWQgTnVQbGF5ZXI6OlNvdXJjZTo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICYgLyogbXNnICovKSB7CiAgICAgVFJFU1BBU1MoKTsKIH0KIAotdm9pZCBOdVBsYXllcjo6cXVldWVEZWNvZGVyU2h1dGRvd24oCi0gICAgICAgIGJvb2wgYXVkaW8sIGJvb2wgdmlkZW8sIGNvbnN0IHNwPEFNZXNzYWdlPiAmcmVwbHkpIHsKLSAgICBBTE9HSSgicXVldWVEZWNvZGVyU2h1dGRvd24gYXVkaW89JWQsIHZpZGVvPSVkIiwgYXVkaW8sIHZpZGVvKTsKLQotICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAotICAgICAgICAgICAgbmV3IFNodXRkb3duRGVjb2RlckFjdGlvbihhdWRpbywgdmlkZW8pKTsKLQotICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAotICAgICAgICAgICAgbmV3IFNpbXBsZUFjdGlvbigmTnVQbGF5ZXI6OnBlcmZvcm1TY2FuU291cmNlcykpOwotCi0gICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2sobmV3IFBvc3RNZXNzYWdlQWN0aW9uKHJlcGx5KSk7Ci0KLSAgICBwcm9jZXNzRGVmZXJyZWRBY3Rpb25zKCk7Ci19Ci0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5oCmluZGV4IDU5MGUxZjIuLmQ2MTIwZDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5oCkBAIC0yNCw3ICsyNCw4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IEFDb2RlYzsKK3N0cnVjdCBBQnVmZmVyOworc3RydWN0IEFNZXNzYWdlOwogc3RydWN0IE1ldGFEYXRhOwogc3RydWN0IE51UGxheWVyRHJpdmVyOwogCkBAIC0zOCw3ICszOSw5IEBACiAgICAgdm9pZCBzZXREYXRhU291cmNlQXN5bmMoY29uc3Qgc3A8SVN0cmVhbVNvdXJjZT4gJnNvdXJjZSk7CiAKICAgICB2b2lkIHNldERhdGFTb3VyY2VBc3luYygKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOworICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKIAogICAgIHZvaWQgc2V0RGF0YVNvdXJjZUFzeW5jKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKIApAQCAtNTYsMTIgKzU5LDIwIEBACiAgICAgLy8gV2lsbCBub3RpZnkgdGhlIGRyaXZlciB0aHJvdWdoICJub3RpZnlSZXNldENvbXBsZXRlIiBvbmNlIGZpbmlzaGVkLgogICAgIHZvaWQgcmVzZXRBc3luYygpOwogCi0gICAgLy8gV2lsbCBub3RpZnkgdGhlIGRyaXZlciB0aHJvdWdoICJub3RpZnlTZWVrQ29tcGxldGUiIG9uY2UgZmluaXNoZWQuCi0gICAgdm9pZCBzZWVrVG9Bc3luYyhpbnQ2NF90IHNlZWtUaW1lVXMpOworICAgIC8vIFdpbGwgbm90aWZ5IHRoZSBkcml2ZXIgdGhyb3VnaCAibm90aWZ5U2Vla0NvbXBsZXRlIiBvbmNlIGZpbmlzaGVkCisgICAgLy8gYW5kIG5lZWROb3RpZnkgaXMgdHJ1ZS4KKyAgICB2b2lkIHNlZWtUb0FzeW5jKGludDY0X3Qgc2Vla1RpbWVVcywgYm9vbCBuZWVkTm90aWZ5ID0gZmFsc2UpOwogCiAgICAgc3RhdHVzX3Qgc2V0VmlkZW9TY2FsaW5nTW9kZShpbnQzMl90IG1vZGUpOwogICAgIHN0YXR1c190IGdldFRyYWNrSW5mbyhQYXJjZWwqIHJlcGx5KSBjb25zdDsKKyAgICBzdGF0dXNfdCBnZXRTZWxlY3RlZFRyYWNrKGludDMyX3QgdHlwZSwgUGFyY2VsKiByZXBseSkgY29uc3Q7CiAgICAgc3RhdHVzX3Qgc2VsZWN0VHJhY2soc2l6ZV90IHRyYWNrSW5kZXgsIGJvb2wgc2VsZWN0KTsKKyAgICBzdGF0dXNfdCBnZXRDdXJyZW50UG9zaXRpb24oaW50NjRfdCAqbWVkaWFVcyk7CisgICAgdm9pZCBnZXRTdGF0cyhpbnQ2NF90ICptTnVtRnJhbWVzVG90YWwsIGludDY0X3QgKm1OdW1GcmFtZXNEcm9wcGVkKTsKKworICAgIHNwPE1ldGFEYXRhPiBnZXRGaWxlTWV0YSgpOworCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrQWdncmVnYXRlQnVmZmVyU2l6ZUJ5dGVzOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TnVQbGF5ZXIoKTsKQEAgLTc0LDYgKzg1LDggQEAKIAogcHJpdmF0ZToKICAgICBzdHJ1Y3QgRGVjb2RlcjsKKyAgICBzdHJ1Y3QgRGVjb2RlclBhc3NUaHJvdWdoOworICAgIHN0cnVjdCBDQ0RlY29kZXI7CiAgICAgc3RydWN0IEdlbmVyaWNTb3VyY2U7CiAgICAgc3RydWN0IEhUVFBMaXZlU291cmNlOwogICAgIHN0cnVjdCBSZW5kZXJlcjsKQEAgLTk2LDYgKzEwOSw3IEBACiAgICAgICAgIGtXaGF0U2NhblNvdXJjZXMgICAgICAgICAgICAgICAgPSAnc2NhbicsCiAgICAgICAgIGtXaGF0VmlkZW9Ob3RpZnkgICAgICAgICAgICAgICAgPSAndmlkTicsCiAgICAgICAgIGtXaGF0QXVkaW9Ob3RpZnkgICAgICAgICAgICAgICAgPSAnYXVkTicsCisgICAgICAgIGtXaGF0Q2xvc2VkQ2FwdGlvbk5vdGlmeSAgICAgICAgPSAnY2FwTicsCiAgICAgICAgIGtXaGF0UmVuZGVyZXJOb3RpZnkgICAgICAgICAgICAgPSAncmVuTicsCiAgICAgICAgIGtXaGF0UmVzZXQgICAgICAgICAgICAgICAgICAgICAgPSAncnNldCcsCiAgICAgICAgIGtXaGF0U2VlayAgICAgICAgICAgICAgICAgICAgICAgPSAnc2VlaycsCkBAIC0xMDQsNiArMTE4LDcgQEAKICAgICAgICAga1doYXRQb2xsRHVyYXRpb24gICAgICAgICAgICAgICA9ICdwb2xEJywKICAgICAgICAga1doYXRTb3VyY2VOb3RpZnkgICAgICAgICAgICAgICA9ICdzcmNOJywKICAgICAgICAga1doYXRHZXRUcmFja0luZm8gICAgICAgICAgICAgICA9ICdnVHJJJywKKyAgICAgICAga1doYXRHZXRTZWxlY3RlZFRyYWNrICAgICAgICAgICA9ICdnU2VsJywKICAgICAgICAga1doYXRTZWxlY3RUcmFjayAgICAgICAgICAgICAgICA9ICdzZWxUJywKICAgICB9OwogCkBAIC0xMTYsOSArMTMxLDE0IEBACiAgICAgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+IG1BdWRpb1Npbms7CiAgICAgc3A8RGVjb2Rlcj4gbVZpZGVvRGVjb2RlcjsKICAgICBib29sIG1WaWRlb0lzQVZDOwotICAgIGJvb2wgbU5lZWRzU3dSZW5kZXJlcjsKKyAgICBib29sIG1PZmZsb2FkQXVkaW87CiAgICAgc3A8RGVjb2Rlcj4gbUF1ZGlvRGVjb2RlcjsKKyAgICBzcDxDQ0RlY29kZXI+IG1DQ0RlY29kZXI7CiAgICAgc3A8UmVuZGVyZXI+IG1SZW5kZXJlcjsKKyAgICBzcDxBTG9vcGVyPiBtUmVuZGVyZXJMb29wZXI7CisgICAgaW50MzJfdCBtQXVkaW9EZWNvZGVyR2VuZXJhdGlvbjsKKyAgICBpbnQzMl90IG1WaWRlb0RlY29kZXJHZW5lcmF0aW9uOworICAgIGludDMyX3QgbVJlbmRlcmVyR2VuZXJhdGlvbjsKIAogICAgIExpc3Q8c3A8QWN0aW9uPiA+IG1EZWZlcnJlZEFjdGlvbnM7CiAKQEAgLTEyOSwxMCArMTQ5LDEwIEBACiAgICAgaW50MzJfdCBtU2NhblNvdXJjZXNHZW5lcmF0aW9uOwogCiAgICAgaW50MzJfdCBtUG9sbER1cmF0aW9uR2VuZXJhdGlvbjsKKyAgICBpbnQzMl90IG1UaW1lZFRleHRHZW5lcmF0aW9uOwogCiAgICAgZW51bSBGbHVzaFN0YXR1cyB7CiAgICAgICAgIE5PTkUsCi0gICAgICAgIEFXQUlUSU5HX0RJU0NPTlRJTlVJVFksCiAgICAgICAgIEZMVVNISU5HX0RFQ09ERVIsCiAgICAgICAgIEZMVVNISU5HX0RFQ09ERVJfU0hVVERPV04sCiAgICAgICAgIFNIVVRUSU5HX0RPV05fREVDT0RFUiwKQEAgLTE0NCwzMSArMTY0LDYwIEBACiAgICAgLy8gbm90aW9uIG9mIHRpbWUgaGFzIGNoYW5nZWQuCiAgICAgYm9vbCBtVGltZURpc2NvbnRpbnVpdHlQZW5kaW5nOwogCisgICAgLy8gU3RhdHVzIG9mIGZsdXNoIHJlc3BvbnNlcyBmcm9tIHRoZSBkZWNvZGVyIGFuZCByZW5kZXJlci4KKyAgICBib29sIG1GbHVzaENvbXBsZXRlWzJdWzJdOworCisgICAgLy8gVXNlZCBieSBmZWVkRGVjb2RlcklucHV0RGF0YSB0byBhZ2dyZWdhdGUgc21hbGwgYnVmZmVycyBpbnRvCisgICAgLy8gb25lIGxhcmdlIGJ1ZmZlci4KKyAgICBzcDxBQnVmZmVyPiBtUGVuZGluZ0F1ZGlvQWNjZXNzVW5pdDsKKyAgICBzdGF0dXNfdCAgICBtUGVuZGluZ0F1ZGlvRXJyOworICAgIHNwPEFCdWZmZXI+IG1BZ2dyZWdhdGVCdWZmZXI7CisKICAgICBGbHVzaFN0YXR1cyBtRmx1c2hpbmdBdWRpbzsKICAgICBGbHVzaFN0YXR1cyBtRmx1c2hpbmdWaWRlbzsKIAogICAgIGludDY0X3QgbVNraXBSZW5kZXJpbmdBdWRpb1VudGlsTWVkaWFUaW1lVXM7CiAgICAgaW50NjRfdCBtU2tpcFJlbmRlcmluZ1ZpZGVvVW50aWxNZWRpYVRpbWVVczsKIAotICAgIGludDY0X3QgbVZpZGVvTGF0ZUJ5VXM7CiAgICAgaW50NjRfdCBtTnVtRnJhbWVzVG90YWwsIG1OdW1GcmFtZXNEcm9wcGVkOwogCiAgICAgaW50MzJfdCBtVmlkZW9TY2FsaW5nTW9kZTsKIAogICAgIGJvb2wgbVN0YXJ0ZWQ7CiAKKyAgICBpbmxpbmUgY29uc3Qgc3A8RGVjb2Rlcj4gJmdldERlY29kZXIoYm9vbCBhdWRpbykgeworICAgICAgICByZXR1cm4gYXVkaW8gPyBtQXVkaW9EZWNvZGVyIDogbVZpZGVvRGVjb2RlcjsKKyAgICB9CisKKyAgICBpbmxpbmUgdm9pZCBjbGVhckZsdXNoQ29tcGxldGUoKSB7CisgICAgICAgIG1GbHVzaENvbXBsZXRlWzBdWzBdID0gZmFsc2U7CisgICAgICAgIG1GbHVzaENvbXBsZXRlWzBdWzFdID0gZmFsc2U7CisgICAgICAgIG1GbHVzaENvbXBsZXRlWzFdWzBdID0gZmFsc2U7CisgICAgICAgIG1GbHVzaENvbXBsZXRlWzFdWzFdID0gZmFsc2U7CisgICAgfQorCisgICAgdm9pZCBvcGVuQXVkaW9TaW5rKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LCBib29sIG9mZmxvYWRPbmx5KTsKKyAgICB2b2lkIGNsb3NlQXVkaW9TaW5rKCk7CisKICAgICBzdGF0dXNfdCBpbnN0YW50aWF0ZURlY29kZXIoYm9vbCBhdWRpbywgc3A8RGVjb2Rlcj4gKmRlY29kZXIpOwogCisgICAgdm9pZCB1cGRhdGVWaWRlb1NpemUoCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmlucHV0Rm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQgPSBOVUxMKTsKKwogICAgIHN0YXR1c190IGZlZWREZWNvZGVySW5wdXREYXRhKGJvb2wgYXVkaW8sIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKICAgICB2b2lkIHJlbmRlckJ1ZmZlcihib29sIGF1ZGlvLCBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAKICAgICB2b2lkIG5vdGlmeUxpc3RlbmVyKGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICppbiA9IE5VTEwpOwogCisgICAgdm9pZCBoYW5kbGVGbHVzaENvbXBsZXRlKGJvb2wgYXVkaW8sIGJvb2wgaXNEZWNvZGVyKTsKICAgICB2b2lkIGZpbmlzaEZsdXNoSWZQb3NzaWJsZSgpOwogCi0gICAgdm9pZCBmbHVzaERlY29kZXIoYm9vbCBhdWRpbywgYm9vbCBuZWVkU2h1dGRvd24pOworICAgIGJvb2wgYXVkaW9EZWNvZGVyU3RpbGxOZWVkZWQoKTsKIAotICAgIHN0YXRpYyBib29sIElzRmx1c2hpbmdTdGF0ZShGbHVzaFN0YXR1cyBzdGF0ZSwgYm9vbCAqbmVlZFNodXRkb3duID0gTlVMTCk7CisgICAgdm9pZCBmbHVzaERlY29kZXIoCisgICAgICAgICAgICBib29sIGF1ZGlvLCBib29sIG5lZWRTaHV0ZG93biwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZuZXdGb3JtYXQgPSBOVUxMKTsKKyAgICB2b2lkIHVwZGF0ZURlY29kZXJGb3JtYXRXaXRob3V0Rmx1c2goYm9vbCBhdWRpbywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpOwogCiAgICAgdm9pZCBwb3N0U2NhblNvdXJjZXMoKTsKIApAQCAtMTc3LDcgKzIyNiw3IEBACiAKICAgICB2b2lkIHByb2Nlc3NEZWZlcnJlZEFjdGlvbnMoKTsKIAotICAgIHZvaWQgcGVyZm9ybVNlZWsoaW50NjRfdCBzZWVrVGltZVVzKTsKKyAgICB2b2lkIHBlcmZvcm1TZWVrKGludDY0X3Qgc2Vla1RpbWVVcywgYm9vbCBuZWVkTm90aWZ5KTsKICAgICB2b2lkIHBlcmZvcm1EZWNvZGVyRmx1c2goKTsKICAgICB2b2lkIHBlcmZvcm1EZWNvZGVyU2h1dGRvd24oYm9vbCBhdWRpbywgYm9vbCB2aWRlbyk7CiAgICAgdm9pZCBwZXJmb3JtUmVzZXQoKTsKQEAgLTE4NSwxMCArMjM0LDE2IEBACiAgICAgdm9pZCBwZXJmb3JtU2V0U3VyZmFjZShjb25zdCBzcDxOYXRpdmVXaW5kb3dXcmFwcGVyPiAmd3JhcHBlcik7CiAKICAgICB2b2lkIG9uU291cmNlTm90aWZ5KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2b2lkIG9uQ2xvc2VkQ2FwdGlvbk5vdGlmeShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAKICAgICB2b2lkIHF1ZXVlRGVjb2RlclNodXRkb3duKAogICAgICAgICAgICAgYm9vbCBhdWRpbywgYm9vbCB2aWRlbywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZyZXBseSk7CiAKKyAgICB2b2lkIHNlbmRTdWJ0aXRsZURhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciwgaW50MzJfdCBiYXNlSW5kZXgpOworICAgIHZvaWQgc2VuZFRpbWVkVGV4dERhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CisKKyAgICB2b2lkIHdyaXRlVHJhY2tJbmZvKFBhcmNlbCogcmVwbHksIGNvbnN0IHNwPEFNZXNzYWdlPiBmb3JtYXQpIGNvbnN0OworCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTnVQbGF5ZXIpOwogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcAppbmRleCAyNDIzZmQ1Li4yN2Y2MTMxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcApAQCAtMTcsMTQgKzE3LDE5IEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIk51UGxheWVyRGVjb2RlciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCiAjaW5jbHVkZSAiTnVQbGF5ZXJEZWNvZGVyLmgiCiAKKyNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zMiw3MCArMzcsNjUxIEBACiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAogICAgICAgICBjb25zdCBzcDxOYXRpdmVXaW5kb3dXcmFwcGVyPiAmbmF0aXZlV2luZG93KQogICAgIDogbU5vdGlmeShub3RpZnkpLAotICAgICAgbU5hdGl2ZVdpbmRvdyhuYXRpdmVXaW5kb3cpIHsKKyAgICAgIG1OYXRpdmVXaW5kb3cobmF0aXZlV2luZG93KSwKKyAgICAgIG1CdWZmZXJHZW5lcmF0aW9uKDApLAorICAgICAgbVBhdXNlZCh0cnVlKSwKKyAgICAgIG1Db21wb25lbnROYW1lKCJkZWNvZGVyIikgeworICAgIC8vIEV2ZXJ5IGRlY29kZXIgaGFzIGl0cyBvd24gbG9vcGVyIGJlY2F1c2UgTWVkaWFDb2RlYyBvcGVyYXRpb25zCisgICAgLy8gYXJlIGJsb2NraW5nLCBidXQgTnVQbGF5ZXIgbmVlZHMgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMuCisgICAgbURlY29kZXJMb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICBtRGVjb2Rlckxvb3Blci0+c2V0TmFtZSgiTlBEZWNvZGVyIik7CisgICAgbURlY29kZXJMb29wZXItPnN0YXJ0KGZhbHNlLCBmYWxzZSwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7CisKKyAgICBtQ29kZWNMb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICBtQ29kZWNMb29wZXItPnNldE5hbWUoIk5QRGVjb2Rlci1DTCIpOworICAgIG1Db2RlY0xvb3Blci0+c3RhcnQoZmFsc2UsIGZhbHNlLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKIH0KIAogTnVQbGF5ZXI6OkRlY29kZXI6On5EZWNvZGVyKCkgeworICAgIG1EZWNvZGVyTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihpZCgpKTsKKyAgICBtRGVjb2Rlckxvb3Blci0+c3RvcCgpOworCisgICAgcmVsZWFzZUFuZFJlc2V0TWVkaWFCdWZmZXJzKCk7CiB9CiAKLXZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6OmNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgeworc3RhdGljCitzdGF0dXNfdCBQb3N0QW5kQXdhaXRSZXNwb25zZSgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIHNwPEFNZXNzYWdlPiAqcmVzcG9uc2UpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKHJlc3BvbnNlKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoISgqcmVzcG9uc2UpLT5maW5kSW50MzIoImVyciIsICZlcnIpKSB7CisgICAgICAgIGVyciA9IE9LOworICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6OnJlbWVtYmVyQ29kZWNTcGVjaWZpY0RhdGEoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKKyAgICBtQ1NEc0ZvckN1cnJlbnRGb3JtYXQuY2xlYXIoKTsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IDsgKytpKSB7CisgICAgICAgIEFTdHJpbmcgdGFnID0gImNzZC0iOworICAgICAgICB0YWcuYXBwZW5kKGkpOworICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXI7CisgICAgICAgIGlmICghZm9ybWF0LT5maW5kQnVmZmVyKHRhZy5jX3N0cigpLCAmYnVmZmVyKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbUNTRHNGb3JDdXJyZW50Rm9ybWF0LnB1c2goYnVmZmVyKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6Om9uQ29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7CiAgICAgQ0hFQ0sobUNvZGVjID09IE5VTEwpOwogCisgICAgKyttQnVmZmVyR2VuZXJhdGlvbjsKKwogICAgIEFTdHJpbmcgbWltZTsKICAgICBDSEVDSyhmb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOwogCi0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeU1zZyA9Ci0gICAgICAgIG5ldyBBTWVzc2FnZShrV2hhdENvZGVjTm90aWZ5LCBpZCgpKTsKKyAgICBzcDxTdXJmYWNlPiBzdXJmYWNlID0gTlVMTDsKKyAgICBpZiAobU5hdGl2ZVdpbmRvdyAhPSBOVUxMKSB7CisgICAgICAgIHN1cmZhY2UgPSBtTmF0aXZlV2luZG93LT5nZXRTdXJmYWNlVGV4dHVyZUNsaWVudCgpOworICAgIH0KIAotICAgIG1DU0RJbmRleCA9IDA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7OyArK2kpIHsKLSAgICAgICAgc3A8QUJ1ZmZlcj4gY3NkOwotICAgICAgICBpZiAoIWZvcm1hdC0+ZmluZEJ1ZmZlcihTdHJpbmdQcmludGYoImNzZC0lZCIsIGkpLmNfc3RyKCksICZjc2QpKSB7CisgICAgbUNvbXBvbmVudE5hbWUgPSBtaW1lOworICAgIG1Db21wb25lbnROYW1lLmFwcGVuZCgiIGRlY29kZXIiKTsKKyAgICBBTE9HVigiWyVzXSBvbkNvbmZpZ3VyZSAoc3VyZmFjZT0lcCkiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBzdXJmYWNlLmdldCgpKTsKKworICAgIG1Db2RlYyA9IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5VHlwZShtQ29kZWNMb29wZXIsIG1pbWUuY19zdHIoKSwgZmFsc2UgLyogZW5jb2RlciAqLyk7CisgICAgaW50MzJfdCBzZWN1cmUgPSAwOworICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMigic2VjdXJlIiwgJnNlY3VyZSkgJiYgc2VjdXJlICE9IDApIHsKKyAgICAgICAgaWYgKG1Db2RlYyAhPSBOVUxMKSB7CisgICAgICAgICAgICBtQ29kZWMtPmdldE5hbWUoJm1Db21wb25lbnROYW1lKTsKKyAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmFwcGVuZCgiLnNlY3VyZSIpOworICAgICAgICAgICAgbUNvZGVjLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBBTE9HSSgiWyVzXSBjcmVhdGluZyIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgbUNvZGVjID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lKAorICAgICAgICAgICAgICAgICAgICBtQ29kZWNMb29wZXIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChtQ29kZWMgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSAlcyVzIGRlY29kZXIiLAorICAgICAgICAgICAgICAgIChzZWN1cmUgPyAic2VjdXJlICIgOiAiIiksIG1pbWUuY19zdHIoKSk7CisgICAgICAgIGhhbmRsZUVycm9yKFVOS05PV05fRVJST1IpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUNvZGVjLT5nZXROYW1lKCZtQ29tcG9uZW50TmFtZSk7CisKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgaWYgKG1OYXRpdmVXaW5kb3cgIT0gTlVMTCkgeworICAgICAgICAvLyBkaXNjb25uZWN0IGZyb20gc3VyZmFjZSBhcyBNZWRpYUNvZGVjIHdpbGwgcmVjb25uZWN0CisgICAgICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfYXBpX2Rpc2Nvbm5lY3QoCisgICAgICAgICAgICAgICAgc3VyZmFjZS5nZXQoKSwgTkFUSVZFX1dJTkRPV19BUElfTUVESUEpOworICAgICAgICAvLyBXZSB0cmVhdCB0aGlzIGFzIGEgd2FybmluZywgYXMgdGhpcyBpcyBhIHByZXBhcmF0b3J5IHN0ZXAuCisgICAgICAgIC8vIENvZGVjIHdpbGwgdHJ5IHRvIGNvbm5lY3QgdG8gdGhlIHN1cmZhY2UsIHdoaWNoIGlzIHdoZXJlCisgICAgICAgIC8vIGFueSBlcnJvciBzaWduYWxpbmcgd2lsbCBvY2N1ci4KKyAgICAgICAgQUxPR1dfSUYoZXJyICE9IE9LLCAiZmFpbGVkIHRvIGRpc2Nvbm5lY3QgZnJvbSBzdXJmYWNlOiAlZCIsIGVycik7CisgICAgfQorICAgIGVyciA9IG1Db2RlYy0+Y29uZmlndXJlKAorICAgICAgICAgICAgZm9ybWF0LCBzdXJmYWNlLCBOVUxMIC8qIGNyeXB0byAqLywgMCAvKiBmbGFncyAqLyk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNvbmZpZ3VyZSAlcyBkZWNvZGVyIChlcnI9JWQpIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKKyAgICAgICAgbUNvZGVjLT5yZWxlYXNlKCk7CisgICAgICAgIG1Db2RlYy5jbGVhcigpOworICAgICAgICBoYW5kbGVFcnJvcihlcnIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHJlbWVtYmVyQ29kZWNTcGVjaWZpY0RhdGEoZm9ybWF0KTsKKworICAgIC8vIHRoZSBmb2xsb3dpbmcgc2hvdWxkIHdvcmsgaW4gY29uZmlndXJlZCBzdGF0ZQorICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywgbUNvZGVjLT5nZXRPdXRwdXRGb3JtYXQoJm1PdXRwdXRGb3JtYXQpKTsKKyAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIG1Db2RlYy0+Z2V0SW5wdXRGb3JtYXQoJm1JbnB1dEZvcm1hdCkpOworCisgICAgZXJyID0gbUNvZGVjLT5zdGFydCgpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzdGFydCAlcyBkZWNvZGVyIChlcnI9JWQpIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKKyAgICAgICAgbUNvZGVjLT5yZWxlYXNlKCk7CisgICAgICAgIG1Db2RlYy5jbGVhcigpOworICAgICAgICBoYW5kbGVFcnJvcihlcnIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gdGhlIGZvbGxvd2luZyBzaG91bGQgd29yayBhZnRlciBzdGFydAorICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywgbUNvZGVjLT5nZXRJbnB1dEJ1ZmZlcnMoJm1JbnB1dEJ1ZmZlcnMpKTsKKyAgICByZWxlYXNlQW5kUmVzZXRNZWRpYUJ1ZmZlcnMoKTsKKyAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIG1Db2RlYy0+Z2V0T3V0cHV0QnVmZmVycygmbU91dHB1dEJ1ZmZlcnMpKTsKKyAgICBBTE9HVigiWyVzXSBnb3QgJXp1IGlucHV0IGFuZCAlenUgb3V0cHV0IGJ1ZmZlcnMiLAorICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlcnMuc2l6ZSgpLAorICAgICAgICAgICAgbU91dHB1dEJ1ZmZlcnMuc2l6ZSgpKTsKKworICAgIHJlcXVlc3RDb2RlY05vdGlmaWNhdGlvbigpOworICAgIG1QYXVzZWQgPSBmYWxzZTsKK30KKwordm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6cmVsZWFzZUFuZFJlc2V0TWVkaWFCdWZmZXJzKCkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1lZGlhQnVmZmVycy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobU1lZGlhQnVmZmVyc1tpXSAhPSBOVUxMKSB7CisgICAgICAgICAgICBtTWVkaWFCdWZmZXJzW2ldLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtTWVkaWFCdWZmZXJzLmVkaXRJdGVtQXQoaSkgPSBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIG1NZWRpYUJ1ZmZlcnMucmVzaXplKG1JbnB1dEJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1NZWRpYUJ1ZmZlcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbU1lZGlhQnVmZmVycy5lZGl0SXRlbUF0KGkpID0gTlVMTDsKKyAgICB9CisgICAgbUlucHV0QnVmZmVySXNEZXF1ZXVlZC5jbGVhcigpOworICAgIG1JbnB1dEJ1ZmZlcklzRGVxdWV1ZWQucmVzaXplKG1JbnB1dEJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dEJ1ZmZlcklzRGVxdWV1ZWQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUlucHV0QnVmZmVySXNEZXF1ZXVlZC5lZGl0SXRlbUF0KGkpID0gZmFsc2U7CisgICAgfQorCisgICAgbVBlbmRpbmdJbnB1dE1lc3NhZ2VzLmNsZWFyKCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6OnJlcXVlc3RDb2RlY05vdGlmaWNhdGlvbigpIHsKKyAgICBpZiAobUNvZGVjICE9IE5VTEwpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKGtXaGF0Q29kZWNOb3RpZnksIGlkKCkpOworICAgICAgICByZXBseS0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtQnVmZmVyR2VuZXJhdGlvbik7CisgICAgICAgIG1Db2RlYy0+cmVxdWVzdEFjdGl2aXR5Tm90aWZpY2F0aW9uKHJlcGx5KTsKKyAgICB9Cit9CisKK2Jvb2wgTnVQbGF5ZXI6OkRlY29kZXI6OmlzU3RhbGVSZXBseShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7CisgICAgcmV0dXJuIGdlbmVyYXRpb24gIT0gbUJ1ZmZlckdlbmVyYXRpb247Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6OmluaXQoKSB7CisgICAgbURlY29kZXJMb29wZXItPnJlZ2lzdGVySGFuZGxlcih0aGlzKTsKK30KKwordm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6Y29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENvbmZpZ3VyZSwgaWQoKSk7CisgICAgbXNnLT5zZXRNZXNzYWdlKCJmb3JtYXQiLCBmb3JtYXQpOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyOjpzaWduYWxVcGRhdGVGb3JtYXQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0VXBkYXRlRm9ybWF0LCBpZCgpKTsKKyAgICBtc2ctPnNldE1lc3NhZ2UoImZvcm1hdCIsIGZvcm1hdCk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK3N0YXR1c190IE51UGxheWVyOjpEZWNvZGVyOjpnZXRJbnB1dEJ1ZmZlcnMoVmVjdG9yPHNwPEFCdWZmZXI+ID4gKmJ1ZmZlcnMpIGNvbnN0IHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0SW5wdXRCdWZmZXJzLCBpZCgpKTsKKyAgICBtc2ctPnNldFBvaW50ZXIoImJ1ZmZlcnMiLCBidWZmZXJzKTsKKworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICByZXR1cm4gUG9zdEFuZEF3YWl0UmVzcG9uc2UobXNnLCAmcmVzcG9uc2UpOworfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyOjpoYW5kbGVFcnJvcihpbnQzMl90IGVycikKK3sKKyAgICAvLyBXZSBjYW5ub3QgaW1tZWRpYXRlbHkgcmVsZWFzZSB0aGUgY29kZWMgZHVlIHRvIGJ1ZmZlcnMgc3RpbGwgb3V0c3RhbmRpbmcKKyAgICAvLyBpbiB0aGUgcmVuZGVyZXIuICBXZSBzaWduYWwgdG8gdGhlIHBsYXllciB0aGUgZXJyb3Igc28gaXQgY2FuIHNodXRkb3duL3JlbGVhc2UgdGhlCisgICAgLy8gZGVjb2RlciBhZnRlciBmbHVzaGluZyBhbmQgaW5jcmVtZW50IHRoZSBnZW5lcmF0aW9uIHRvIGRpc2NhcmQgdW5uZWNlc3NhcnkgbWVzc2FnZXMuCisKKyAgICArK21CdWZmZXJHZW5lcmF0aW9uOworCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEVycm9yKTsKKyAgICBub3RpZnktPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgIG5vdGlmeS0+cG9zdCgpOworfQorCitib29sIE51UGxheWVyOjpEZWNvZGVyOjpoYW5kbGVBbklucHV0QnVmZmVyKCkgeworICAgIHNpemVfdCBidWZmZXJJeCA9IC0xOworICAgIHN0YXR1c190IHJlcyA9IG1Db2RlYy0+ZGVxdWV1ZUlucHV0QnVmZmVyKCZidWZmZXJJeCk7CisgICAgQUxPR1YoIlslc10gZGVxdWV1ZWQgaW5wdXQ6ICVkIiwKKyAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIHJlcyA9PSBPSyA/IChpbnQpYnVmZmVySXggOiByZXMpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgaWYgKHJlcyAhPSAtRUFHQUlOKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGRlcXVldWUgaW5wdXQgYnVmZmVyIGZvciAlcyAoZXJyPSVkKSIsCisgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIHJlcyk7CisgICAgICAgICAgICBoYW5kbGVFcnJvcihyZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBDSEVDS19MVChidWZmZXJJeCwgbUlucHV0QnVmZmVycy5zaXplKCkpOworCisgICAgaWYgKG1NZWRpYUJ1ZmZlcnNbYnVmZmVySXhdICE9IE5VTEwpIHsKKyAgICAgICAgbU1lZGlhQnVmZmVyc1tidWZmZXJJeF0tPnJlbGVhc2UoKTsKKyAgICAgICAgbU1lZGlhQnVmZmVycy5lZGl0SXRlbUF0KGJ1ZmZlckl4KSA9IE5VTEw7CisgICAgfQorICAgIG1JbnB1dEJ1ZmZlcklzRGVxdWV1ZWQuZWRpdEl0ZW1BdChidWZmZXJJeCkgPSB0cnVlOworCisgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKGtXaGF0SW5wdXRCdWZmZXJGaWxsZWQsIGlkKCkpOworICAgIHJlcGx5LT5zZXRTaXplKCJidWZmZXItaXgiLCBidWZmZXJJeCk7CisgICAgcmVwbHktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUJ1ZmZlckdlbmVyYXRpb24pOworCisgICAgaWYgKCFtQ1NEc1RvU3VibWl0LmlzRW1wdHkoKSkgeworICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBtQ1NEc1RvU3VibWl0Lml0ZW1BdCgwKTsKKyAgICAgICAgQUxPR0koIlslc10gcmVzdWJtaXR0aW5nIENTRCIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICByZXBseS0+c2V0QnVmZmVyKCJidWZmZXIiLCBidWZmZXIpOworICAgICAgICBtQ1NEc1RvU3VibWl0LnJlbW92ZUF0KDApOworICAgICAgICBDSEVDSyhvbklucHV0QnVmZmVyRmlsbGVkKHJlcGx5KSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHdoaWxlICghbVBlbmRpbmdJbnB1dE1lc3NhZ2VzLmVtcHR5KCkpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9ICptUGVuZGluZ0lucHV0TWVzc2FnZXMuYmVnaW4oKTsKKyAgICAgICAgaWYgKCFvbklucHV0QnVmZmVyRmlsbGVkKG1zZykpIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0KLSAgICAgICAgbUNTRC5wdXNoKGNzZCk7CisgICAgICAgIG1QZW5kaW5nSW5wdXRNZXNzYWdlcy5lcmFzZShtUGVuZGluZ0lucHV0TWVzc2FnZXMuYmVnaW4oKSk7CiAgICAgfQogCi0gICAgaWYgKG1OYXRpdmVXaW5kb3cgIT0gTlVMTCkgewotICAgICAgICBmb3JtYXQtPnNldE9iamVjdCgibmF0aXZlLXdpbmRvdyIsIG1OYXRpdmVXaW5kb3cpOworICAgIGlmICghbUlucHV0QnVmZmVySXNEZXF1ZXVlZC5lZGl0SXRlbUF0KGJ1ZmZlckl4KSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICAvLyBDdXJyZW50IHZpZGVvIGRlY29kZXJzIGRvIG5vdCByZXR1cm4gZnJvbSBPTVhfRmlsbFRoaXNCdWZmZXIKLSAgICAvLyBxdWlja2x5LCB2aW9sYXRpbmcgdGhlIE9wZW5NQVggc3BlY3MsIHVudGlsIHRoYXQgaXMgcmVtZWRpZWQKLSAgICAvLyB3ZSBuZWVkIHRvIGludmVzdCBpbiBhbiBleHRyYSBsb29wZXIgdG8gZnJlZSB0aGUgbWFpbiBldmVudAotICAgIC8vIHF1ZXVlLgotICAgIGJvb2wgbmVlZERlZGljYXRlZExvb3BlciA9ICFzdHJuY2FzZWNtcChtaW1lLmNfc3RyKCksICJ2aWRlby8iLCA2KTsKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0RmlsbFRoaXNCdWZmZXIpOworICAgIG5vdGlmeS0+c2V0QnVmZmVyKCJidWZmZXIiLCBtSW5wdXRCdWZmZXJzW2J1ZmZlckl4XSk7CisgICAgbm90aWZ5LT5zZXRNZXNzYWdlKCJyZXBseSIsIHJlcGx5KTsKKyAgICBub3RpZnktPnBvc3QoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KIAotICAgIG1Gb3JtYXQgPSBmb3JtYXQ7Ci0gICAgbUNvZGVjID0gbmV3IEFDb2RlYzsKK2Jvb2wgYW5kcm9pZDo6TnVQbGF5ZXI6OkRlY29kZXI6Om9uSW5wdXRCdWZmZXJGaWxsZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzaXplX3QgYnVmZmVySXg7CisgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgiYnVmZmVyLWl4IiwgJmJ1ZmZlckl4KSk7CisgICAgQ0hFQ0tfTFQoYnVmZmVySXgsIG1JbnB1dEJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICBzcDxBQnVmZmVyPiBjb2RlY0J1ZmZlciA9IG1JbnB1dEJ1ZmZlcnNbYnVmZmVySXhdOwogCi0gICAgaWYgKG5lZWREZWRpY2F0ZWRMb29wZXIgJiYgbUNvZGVjTG9vcGVyID09IE5VTEwpIHsKLSAgICAgICAgbUNvZGVjTG9vcGVyID0gbmV3IEFMb29wZXI7Ci0gICAgICAgIG1Db2RlY0xvb3Blci0+c2V0TmFtZSgiTnVQbGF5ZXJEZWNvZGVyIik7Ci0gICAgICAgIG1Db2RlY0xvb3Blci0+c3RhcnQoZmFsc2UsIGZhbHNlLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKKyAgICBzcDxBQnVmZmVyPiBidWZmZXI7CisgICAgYm9vbCBoYXNCdWZmZXIgPSBtc2ctPmZpbmRCdWZmZXIoImJ1ZmZlciIsICZidWZmZXIpOworCisgICAgLy8gaGFuZGxlIHdpZGV2aW5lIGNsYXNzaWMgc291cmNlIC0gdGhhdCBmaWxscyBhbiBhcmJpdHJhcnkgaW5wdXQgYnVmZmVyCisgICAgTWVkaWFCdWZmZXIgKm1lZGlhQnVmZmVyID0gTlVMTDsKKyAgICBpZiAoaGFzQnVmZmVyKSB7CisgICAgICAgIG1lZGlhQnVmZmVyID0gKE1lZGlhQnVmZmVyICopKGJ1ZmZlci0+Z2V0TWVkaWFCdWZmZXJCYXNlKCkpOworICAgICAgICBpZiAobWVkaWFCdWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgLy8gbGlrZWx5IGZpbGxlZCBhbm90aGVyIGJ1ZmZlciB0aGFuIHdlIHJlcXVlc3RlZDogYWRqdXN0IGJ1ZmZlciBpbmRleAorICAgICAgICAgICAgc2l6ZV90IGl4OworICAgICAgICAgICAgZm9yIChpeCA9IDA7IGl4IDwgbUlucHV0QnVmZmVycy5zaXplKCk7IGl4KyspIHsKKyAgICAgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmID0gbUlucHV0QnVmZmVyc1tpeF07CisgICAgICAgICAgICAgICAgaWYgKGJ1Zi0+ZGF0YSgpID09IG1lZGlhQnVmZmVyLT5kYXRhKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGlucHV0IGJ1ZmZlcnMgYXJlIGRlcXVldWVkIG9uIHN0YXJ0LCBoZW5jZSB0aGUgY2hlY2sKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtSW5wdXRCdWZmZXJJc0RlcXVldWVkW2l4XSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gcmVjZWl2ZWQgTWVkaWFCdWZmZXIgZm9yICMlenUgaW5zdGVhZCBvZiAjJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgaXgsIGJ1ZmZlckl4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBUUklDS1k6IG5lZWQgYnVmZmVyIGZvciB0aGUgbWV0YWRhdGEsIHNvIGluc3RlYWQsIHNldAorICAgICAgICAgICAgICAgICAgICAvLyBjb2RlY0J1ZmZlciB0byB0aGUgc2FtZSAodGhvdWdoIGluY29ycmVjdCkgYnVmZmVyIHRvCisgICAgICAgICAgICAgICAgICAgIC8vIGF2b2lkIGEgbWVtY3B5IGludG8gdGhlIGNvZGVjQnVmZmVyCisgICAgICAgICAgICAgICAgICAgIGNvZGVjQnVmZmVyID0gYnVmZmVyOworICAgICAgICAgICAgICAgICAgICBjb2RlY0J1ZmZlci0+c2V0UmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFCdWZmZXItPnJhbmdlX29mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckl4ID0gaXg7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENIRUNLKGl4IDwgbUlucHV0QnVmZmVycy5zaXplKCkpOworICAgICAgICB9CiAgICAgfQogCi0gICAgKG5lZWREZWRpY2F0ZWRMb29wZXIgPyBtQ29kZWNMb29wZXIgOiBsb29wZXIoKSktPnJlZ2lzdGVySGFuZGxlcihtQ29kZWMpOwogCi0gICAgbUNvZGVjLT5zZXROb3RpZmljYXRpb25NZXNzYWdlKG5vdGlmeU1zZyk7Ci0gICAgbUNvZGVjLT5pbml0aWF0ZVNldHVwKGZvcm1hdCk7CisKKyAgICBpZiAoYnVmZmVyID09IE5VTEwgLyogaW5jbHVkZXMgIWhhc0J1ZmZlciAqLykgeworICAgICAgICBpbnQzMl90IHN0cmVhbUVyciA9IEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJlcnIiLCAmc3RyZWFtRXJyKSB8fCAhaGFzQnVmZmVyKTsKKworICAgICAgICBpZiAoc3RyZWFtRXJyID09IE9LKSB7CisgICAgICAgICAgICAvKiBidWZmZXJzIGFyZSByZXR1cm5lZCB0byBob2xkIG9uIHRvICovCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGF0dGVtcHQgdG8gcXVldWUgRU9TCisgICAgICAgIHN0YXR1c190IGVyciA9IG1Db2RlYy0+cXVldWVJbnB1dEJ1ZmZlcigKKyAgICAgICAgICAgICAgICBidWZmZXJJeCwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1MpOworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICBtSW5wdXRCdWZmZXJJc0RlcXVldWVkLmVkaXRJdGVtQXQoYnVmZmVySXgpID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtRXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgIHN0cmVhbUVyciA9IGVycjsKKyAgICAgICAgICAgIC8vIGVyciB3aWxsIG5vdCBiZSBFUlJPUl9FTkRfT0ZfU1RSRUFNCisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RyZWFtRXJyICE9IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgIEFMT0dFKCJTdHJlYW0gZXJyb3IgZm9yICVzIChlcnI9JWQpLCBFT1MgJXMgcXVldWVkIiwKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtRXJyLAorICAgICAgICAgICAgICAgICAgICBlcnIgPT0gT0sgPyAic3VjY2Vzc2Z1bGx5IiA6ICJ1bnN1Y2Nlc3NmdWxseSIpOworICAgICAgICAgICAgaGFuZGxlRXJyb3Ioc3RyZWFtRXJyKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGludDY0X3QgdGltZVVzID0gMDsKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CisKKyAgICAgICAgaW50MzJfdCBlb3MsIGNzZDsKKyAgICAgICAgLy8gd2UgZG8gbm90IGV4cGVjdCBTWU5DRlJBTUUgZm9yIGRlY29kZXIKKyAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImVvcyIsICZlb3MpICYmIGVvcykgeworICAgICAgICAgICAgZmxhZ3MgfD0gTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfRU9TOworICAgICAgICB9IGVsc2UgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImNzZCIsICZjc2QpICYmIGNzZCkgeworICAgICAgICAgICAgZmxhZ3MgfD0gTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfQ09ERUNDT05GSUc7CisgICAgICAgIH0KKworICAgICAgICAvLyBjb3B5IGludG8gY29kZWMgYnVmZmVyCisgICAgICAgIGlmIChidWZmZXIgIT0gY29kZWNCdWZmZXIpIHsKKyAgICAgICAgICAgIENIRUNLX0xFKGJ1ZmZlci0+c2l6ZSgpLCBjb2RlY0J1ZmZlci0+Y2FwYWNpdHkoKSk7CisgICAgICAgICAgICBjb2RlY0J1ZmZlci0+c2V0UmFuZ2UoMCwgYnVmZmVyLT5zaXplKCkpOworICAgICAgICAgICAgbWVtY3B5KGNvZGVjQnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQ29kZWMtPnF1ZXVlSW5wdXRCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJJeCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjQnVmZmVyLT5vZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjQnVmZmVyLT5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lVXMsCisgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIGlmIChtZWRpYUJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbWVkaWFCdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcXVldWUgaW5wdXQgYnVmZmVyIGZvciAlcyAoZXJyPSVkKSIsCisgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CisgICAgICAgICAgICBoYW5kbGVFcnJvcihlcnIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUlucHV0QnVmZmVySXNEZXF1ZXVlZC5lZGl0SXRlbUF0KGJ1ZmZlckl4KSA9IGZhbHNlOworICAgICAgICAgICAgaWYgKG1lZGlhQnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBDSEVDSyhtTWVkaWFCdWZmZXJzW2J1ZmZlckl4XSA9PSBOVUxMKTsKKyAgICAgICAgICAgICAgICBtTWVkaWFCdWZmZXJzLmVkaXRJdGVtQXQoYnVmZmVySXgpID0gbWVkaWFCdWZmZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTnVQbGF5ZXI6OkRlY29kZXI6OmhhbmRsZUFuT3V0cHV0QnVmZmVyKCkgeworICAgIHNpemVfdCBidWZmZXJJeCA9IC0xOworICAgIHNpemVfdCBvZmZzZXQ7CisgICAgc2l6ZV90IHNpemU7CisgICAgaW50NjRfdCB0aW1lVXM7CisgICAgdWludDMyX3QgZmxhZ3M7CisgICAgc3RhdHVzX3QgcmVzID0gbUNvZGVjLT5kZXF1ZXVlT3V0cHV0QnVmZmVyKAorICAgICAgICAgICAgJmJ1ZmZlckl4LCAmb2Zmc2V0LCAmc2l6ZSwgJnRpbWVVcywgJmZsYWdzKTsKKworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR1YoIlslc10gZGVxdWV1ZWQgb3V0cHV0OiAlZCIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksIHJlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIlslc10gZGVxdWV1ZWQgb3V0cHV0OiAlZCAodGltZT0lbGxkIGZsYWdzPSUiIFBSSXUzMiAiKSIsCisgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgKGludClidWZmZXJJeCwgdGltZVVzLCBmbGFncyk7CisgICAgfQorCisgICAgaWYgKHJlcyA9PSBJTkZPX09VVFBVVF9CVUZGRVJTX0NIQU5HRUQpIHsKKyAgICAgICAgcmVzID0gbUNvZGVjLT5nZXRPdXRwdXRCdWZmZXJzKCZtT3V0cHV0QnVmZmVycyk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IG91dHB1dCBidWZmZXJzIGZvciAlcyBhZnRlciBJTkZPIGV2ZW50IChlcnI9JWQpIiwKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgcmVzKTsKKyAgICAgICAgICAgIGhhbmRsZUVycm9yKHJlcyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy8gTnVQbGF5ZXIgaWdub3JlcyB0aGlzCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAocmVzID09IElORk9fRk9STUFUX0NIQU5HRUQpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG5ldyBBTWVzc2FnZSgpOworICAgICAgICByZXMgPSBtQ29kZWMtPmdldE91dHB1dEZvcm1hdCgmZm9ybWF0KTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgb3V0cHV0IGZvcm1hdCBmb3IgJXMgYWZ0ZXIgSU5GTyBldmVudCAoZXJyPSVkKSIsCisgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIHJlcyk7CisgICAgICAgICAgICBoYW5kbGVFcnJvcihyZXMpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRPdXRwdXRGb3JtYXRDaGFuZ2VkKTsKKyAgICAgICAgbm90aWZ5LT5zZXRNZXNzYWdlKCJmb3JtYXQiLCBmb3JtYXQpOworICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChyZXMgPT0gSU5GT19ESVNDT05USU5VSVRZKSB7CisgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgaWYgKHJlcyAhPSAtRUFHQUlOKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGRlcXVldWUgb3V0cHV0IGJ1ZmZlciBmb3IgJXMgKGVycj0lZCkiLAorICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCByZXMpOworICAgICAgICAgICAgaGFuZGxlRXJyb3IocmVzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQ0hFQ0tfTFQoYnVmZmVySXgsIG1PdXRwdXRCdWZmZXJzLnNpemUoKSk7CisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbU91dHB1dEJ1ZmZlcnNbYnVmZmVySXhdOworICAgIGJ1ZmZlci0+c2V0UmFuZ2Uob2Zmc2V0LCBzaXplKTsKKyAgICBidWZmZXItPm1ldGEoKS0+Y2xlYXIoKTsKKyAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisgICAgaWYgKGZsYWdzICYgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfRU9TKSB7CisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiZW9zIiwgdHJ1ZSk7CisgICAgfQorICAgIC8vIHdlIGRvIG5vdCBleHBlY3QgQ09ERUNDT05GSUcgb3IgU1lOQ0ZSQU1FIGZvciBkZWNvZGVyCisKKyAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZW5kZXJCdWZmZXIsIGlkKCkpOworICAgIHJlcGx5LT5zZXRTaXplKCJidWZmZXItaXgiLCBidWZmZXJJeCk7CisgICAgcmVwbHktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUJ1ZmZlckdlbmVyYXRpb24pOworCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdERyYWluVGhpc0J1ZmZlcik7CisgICAgbm90aWZ5LT5zZXRCdWZmZXIoImJ1ZmZlciIsIGJ1ZmZlcik7CisgICAgbm90aWZ5LT5zZXRNZXNzYWdlKCJyZXBseSIsIHJlcGx5KTsKKyAgICBub3RpZnktPnBvc3QoKTsKKworICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBoYW5kbGVkIGFmdGVyIHJlbmRlcmluZyBpcyBjb21wbGV0ZSwKKyAgICAvLyBidXQgUmVuZGVyZXIgbmVlZHMgaXQgbm93CisgICAgaWYgKGZsYWdzICYgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfRU9TKSB7CisgICAgICAgIEFMT0dWKCJxdWV1ZWluZyBlb3MgWyVzXSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEVPUyk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImVyciIsIEVSUk9SX0VORF9PRl9TVFJFQU0pOworICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6Om9uUmVuZGVyQnVmZmVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3RhdHVzX3QgZXJyOworICAgIGludDMyX3QgcmVuZGVyOworICAgIHNpemVfdCBidWZmZXJJeDsKKyAgICBDSEVDSyhtc2ctPmZpbmRTaXplKCJidWZmZXItaXgiLCAmYnVmZmVySXgpKTsKKyAgICBpZiAobXNnLT5maW5kSW50MzIoInJlbmRlciIsICZyZW5kZXIpICYmIHJlbmRlcikgeworICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcE5zOworICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZXN0YW1wTnMiLCAmdGltZXN0YW1wTnMpKTsKKyAgICAgICAgZXJyID0gbUNvZGVjLT5yZW5kZXJPdXRwdXRCdWZmZXJBbmRSZWxlYXNlKGJ1ZmZlckl4LCB0aW1lc3RhbXBOcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZXJyID0gbUNvZGVjLT5yZWxlYXNlT3V0cHV0QnVmZmVyKGJ1ZmZlckl4KTsKKyAgICB9CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHJlbGVhc2Ugb3V0cHV0IGJ1ZmZlciBmb3IgJXMgKGVycj0lZCkiLAorICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CisgICAgICAgIGhhbmRsZUVycm9yKGVycik7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyOjpvbkZsdXNoKCkgeworICAgIHN0YXR1c190IGVyciA9IE9LOworICAgIGlmIChtQ29kZWMgIT0gTlVMTCkgeworICAgICAgICBlcnIgPSBtQ29kZWMtPmZsdXNoKCk7CisgICAgICAgIG1DU0RzVG9TdWJtaXQgPSBtQ1NEc0ZvckN1cnJlbnRGb3JtYXQ7IC8vIGNvcHkgb3BlcmF0b3IKKyAgICAgICAgKyttQnVmZmVyR2VuZXJhdGlvbjsKKyAgICB9CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gZmx1c2ggJXMgKGVycj0lZCkiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOworICAgICAgICBoYW5kbGVFcnJvcihlcnIpOworICAgICAgICAvLyBmaW5pc2ggd2l0aCBwb3N0aW5nIGtXaGF0Rmx1c2hDb21wbGV0ZWQuCisgICAgICAgIC8vIHdlIGF0dGVtcHQgdG8gcmVsZWFzZSB0aGUgYnVmZmVycyBldmVuIGlmIGZsdXNoIGZhaWxzLgorICAgIH0KKyAgICByZWxlYXNlQW5kUmVzZXRNZWRpYUJ1ZmZlcnMoKTsKKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRGbHVzaENvbXBsZXRlZCk7CisgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgbVBhdXNlZCA9IHRydWU7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6Om9uUmVzdW1lKCkgeworICAgIG1QYXVzZWQgPSBmYWxzZTsKK30KKwordm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6b25TaHV0ZG93bigpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICBpZiAobUNvZGVjICE9IE5VTEwpIHsKKyAgICAgICAgZXJyID0gbUNvZGVjLT5yZWxlYXNlKCk7CisgICAgICAgIG1Db2RlYyA9IE5VTEw7CisgICAgICAgICsrbUJ1ZmZlckdlbmVyYXRpb247CisKKyAgICAgICAgaWYgKG1OYXRpdmVXaW5kb3cgIT0gTlVMTCkgeworICAgICAgICAgICAgLy8gcmVjb25uZWN0IHRvIHN1cmZhY2UgYXMgTWVkaWFDb2RlYyBkaXNjb25uZWN0ZWQgZnJvbSBpdAorICAgICAgICAgICAgc3RhdHVzX3QgZXJyb3IgPQorICAgICAgICAgICAgICAgICAgICBuYXRpdmVfd2luZG93X2FwaV9jb25uZWN0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYXRpdmVXaW5kb3ctPmdldE5hdGl2ZVdpbmRvdygpLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfQVBJX01FRElBKTsKKyAgICAgICAgICAgIEFMT0dXX0lGKGVycm9yICE9IE5PX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAiWyVzXSBmYWlsZWQgdG8gY29ubmVjdCB0byBuYXRpdmUgd2luZG93LCBlcnJvcj0lZCIsCisgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycm9yKTsKKyAgICAgICAgfQorICAgICAgICBtQ29tcG9uZW50TmFtZSA9ICJkZWNvZGVyIjsKKyAgICB9CisKKyAgICByZWxlYXNlQW5kUmVzZXRNZWRpYUJ1ZmZlcnMoKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byByZWxlYXNlICVzIChlcnI9JWQpIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKKyAgICAgICAgaGFuZGxlRXJyb3IoZXJyKTsKKyAgICAgICAgLy8gZmluaXNoIHdpdGggcG9zdGluZyBrV2hhdFNodXRkb3duQ29tcGxldGVkLgorICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRTaHV0ZG93bkNvbXBsZXRlZCk7CisgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgbVBhdXNlZCA9IHRydWU7CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgQUxPR1YoIlslc10gb25NZXNzYWdlOiAlcyIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksIG1zZy0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKwogICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdENvbmZpZ3VyZToKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoImZvcm1hdCIsICZmb3JtYXQpKTsKKyAgICAgICAgICAgIG9uQ29uZmlndXJlKGZvcm1hdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRVcGRhdGVGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJmb3JtYXQiLCAmZm9ybWF0KSk7CisgICAgICAgICAgICByZW1lbWJlckNvZGVjU3BlY2lmaWNEYXRhKGZvcm1hdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRHZXRJbnB1dEJ1ZmZlcnM6CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisKKyAgICAgICAgICAgIFZlY3RvcjxzcDxBQnVmZmVyPiA+ICpkc3RCdWZmZXJzOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigiYnVmZmVycyIsICh2b2lkICoqKSZkc3RCdWZmZXJzKSk7CisKKyAgICAgICAgICAgIGRzdEJ1ZmZlcnMtPmNsZWFyKCk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dEJ1ZmZlcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBkc3RCdWZmZXJzLT5wdXNoKG1JbnB1dEJ1ZmZlcnNbaV0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAobmV3IEFNZXNzYWdlKS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIGtXaGF0Q29kZWNOb3RpZnk6CiAgICAgICAgIHsKLSAgICAgICAgICAgIGludDMyX3Qgd2hhdDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ3aGF0IiwgJndoYXQpKTsKKyAgICAgICAgICAgIGlmICghaXNTdGFsZVJlcGx5KG1zZykpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IG51bUlucHV0LCBudW1PdXRwdXQ7CiAKLSAgICAgICAgICAgIGlmICh3aGF0ID09IEFDb2RlYzo6a1doYXRGaWxsVGhpc0J1ZmZlcikgewotICAgICAgICAgICAgICAgIG9uRmlsbFRoaXNCdWZmZXIobXNnKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgiY29kZWMtcmVxdWVzdCIsIG1zZyk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiaW5wdXQtYnVmZmVycyIsICZudW1JbnB1dCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbnVtSW5wdXQgPSBJTlQzMl9NQVg7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigib3V0cHV0LWJ1ZmZlcnMiLCAmbnVtT3V0cHV0KSkgeworICAgICAgICAgICAgICAgICAgICBudW1PdXRwdXQgPSBJTlQzMl9NQVg7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFtUGF1c2VkKSB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChudW1JbnB1dC0tID4gMCAmJiBoYW5kbGVBbklucHV0QnVmZmVyKCkpIHt9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgd2hpbGUgKG51bU91dHB1dC0tID4gMCAmJiBoYW5kbGVBbk91dHB1dEJ1ZmZlcigpKSB7fQogICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXF1ZXN0Q29kZWNOb3RpZmljYXRpb24oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdElucHV0QnVmZmVyRmlsbGVkOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWlzU3RhbGVSZXBseShtc2cpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtUGVuZGluZ0lucHV0TWVzc2FnZXMuZW1wdHkoKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgIW9uSW5wdXRCdWZmZXJGaWxsZWQobXNnKSkgeworICAgICAgICAgICAgICAgICAgICBtUGVuZGluZ0lucHV0TWVzc2FnZXMucHVzaF9iYWNrKG1zZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRSZW5kZXJCdWZmZXI6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghaXNTdGFsZVJlcGx5KG1zZykpIHsKKyAgICAgICAgICAgICAgICBvblJlbmRlckJ1ZmZlcihtc2cpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0Rmx1c2g6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CisgICAgICAgICAgICBpZiAobXNnLT5maW5kTWVzc2FnZSgibmV3LWZvcm1hdCIsICZmb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgcmVtZW1iZXJDb2RlY1NwZWNpZmljRGF0YShmb3JtYXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb25GbHVzaCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0UmVzdW1lOgorICAgICAgICB7CisgICAgICAgICAgICBvblJlc3VtZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0U2h1dGRvd246CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uU2h1dGRvd24oKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTEwNSw0NyArNjkxLDIwIEBACiAgICAgfQogfQogCi12b2lkIE51UGxheWVyOjpEZWNvZGVyOjpvbkZpbGxUaGlzQnVmZmVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IHJlcGx5OwotICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoInJlcGx5IiwgJnJlcGx5KSk7Ci0KLSNpZiAwCi0gICAgc3A8QUJ1ZmZlcj4gb3V0QnVmZmVyOwotICAgIENIRUNLKG1zZy0+ZmluZEJ1ZmZlcigiYnVmZmVyIiwgJm91dEJ1ZmZlcikpOwotI2Vsc2UKLSAgICBzcDxBQnVmZmVyPiBvdXRCdWZmZXI7Ci0jZW5kaWYKLQotICAgIGlmIChtQ1NESW5kZXggPCBtQ1NELnNpemUoKSkgewotICAgICAgICBvdXRCdWZmZXIgPSBtQ1NELmVkaXRJdGVtQXQobUNTREluZGV4KyspOwotICAgICAgICBvdXRCdWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIDApOwotCi0gICAgICAgIHJlcGx5LT5zZXRCdWZmZXIoImJ1ZmZlciIsIG91dEJ1ZmZlcik7Ci0gICAgICAgIHJlcGx5LT5wb3N0KCk7Ci0gICAgICAgIHJldHVybjsKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6OnNpZ25hbEZsdXNoKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEZsdXNoLCBpZCgpKTsKKyAgICBpZiAoZm9ybWF0ICE9IE5VTEwpIHsKKyAgICAgICAgbXNnLT5zZXRNZXNzYWdlKCJuZXctZm9ybWF0IiwgZm9ybWF0KTsKICAgICB9Ci0KLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgbm90aWZ5LT5zZXRNZXNzYWdlKCJjb2RlYy1yZXF1ZXN0IiwgbXNnKTsKLSAgICBub3RpZnktPnBvc3QoKTsKLX0KLQotdm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6c2lnbmFsRmx1c2goKSB7Ci0gICAgaWYgKG1Db2RlYyAhPSBOVUxMKSB7Ci0gICAgICAgIG1Db2RlYy0+c2lnbmFsRmx1c2goKTsKLSAgICB9CisgICAgbXNnLT5wb3N0KCk7CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6OnNpZ25hbFJlc3VtZSgpIHsKLSAgICBpZiAobUNvZGVjICE9IE5VTEwpIHsKLSAgICAgICAgbUNvZGVjLT5zaWduYWxSZXN1bWUoKTsKLSAgICB9CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlc3VtZSwgaWQoKSkpLT5wb3N0KCk7CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6OmluaXRpYXRlU2h1dGRvd24oKSB7Ci0gICAgaWYgKG1Db2RlYyAhPSBOVUxMKSB7Ci0gICAgICAgIG1Db2RlYy0+aW5pdGlhdGVTaHV0ZG93bigpOwotICAgIH0KKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0U2h1dGRvd24sIGlkKCkpKS0+cG9zdCgpOwogfQogCiBib29sIE51UGxheWVyOjpEZWNvZGVyOjpzdXBwb3J0c1NlYW1sZXNzQXVkaW9Gb3JtYXRDaGFuZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZ0YXJnZXRGb3JtYXQpIGNvbnN0IHsKQEAgLTE2MywxNCArNzIyLDE2IEBACiAgICAgICAgIGNvbnN0IGNoYXIgKiBrZXlzW10gPSB7ICJjaGFubmVsLWNvdW50IiwgInNhbXBsZS1yYXRlIiwgImlzLWFkdHMiIH07CiAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgc2l6ZW9mKGtleXMpIC8gc2l6ZW9mKGtleXNbMF0pOyBpKyspIHsKICAgICAgICAgICAgIGludDMyX3Qgb2xkVmFsLCBuZXdWYWw7Ci0gICAgICAgICAgICBpZiAoIW1Gb3JtYXQtPmZpbmRJbnQzMihrZXlzW2ldLCAmb2xkVmFsKSB8fCAhdGFyZ2V0Rm9ybWF0LT5maW5kSW50MzIoa2V5c1tpXSwgJm5ld1ZhbCkKLSAgICAgICAgICAgICAgICAgICAgfHwgb2xkVmFsICE9IG5ld1ZhbCkgeworICAgICAgICAgICAgaWYgKCFtT3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoa2V5c1tpXSwgJm9sZFZhbCkgfHwKKyAgICAgICAgICAgICAgICAgICAgIXRhcmdldEZvcm1hdC0+ZmluZEludDMyKGtleXNbaV0sICZuZXdWYWwpIHx8CisgICAgICAgICAgICAgICAgICAgIG9sZFZhbCAhPSBuZXdWYWwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBzcDxBQnVmZmVyPiBvbGRCdWYsIG5ld0J1ZjsKLSAgICAgICAgaWYgKG1Gb3JtYXQtPmZpbmRCdWZmZXIoImNzZC0wIiwgJm9sZEJ1ZikgJiYgdGFyZ2V0Rm9ybWF0LT5maW5kQnVmZmVyKCJjc2QtMCIsICZuZXdCdWYpKSB7CisgICAgICAgIGlmIChtT3V0cHV0Rm9ybWF0LT5maW5kQnVmZmVyKCJjc2QtMCIsICZvbGRCdWYpICYmCisgICAgICAgICAgICAgICAgdGFyZ2V0Rm9ybWF0LT5maW5kQnVmZmVyKCJjc2QtMCIsICZuZXdCdWYpKSB7CiAgICAgICAgICAgICBpZiAob2xkQnVmLT5zaXplKCkgIT0gbmV3QnVmLT5zaXplKCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CkBAIC0xODEsNyArNzQyLDcgQEAKIH0KIAogYm9vbCBOdVBsYXllcjo6RGVjb2Rlcjo6c3VwcG9ydHNTZWFtbGVzc0Zvcm1hdENoYW5nZShjb25zdCBzcDxBTWVzc2FnZT4gJnRhcmdldEZvcm1hdCkgY29uc3QgewotICAgIGlmIChtRm9ybWF0ID09IE5VTEwpIHsKKyAgICBpZiAobU91dHB1dEZvcm1hdCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKQEAgLTE5MCw3ICs3NTEsNyBAQAogICAgIH0KIAogICAgIEFTdHJpbmcgb2xkTWltZSwgbmV3TWltZTsKLSAgICBpZiAoIW1Gb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmb2xkTWltZSkKKyAgICBpZiAoIW1PdXRwdXRGb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmb2xkTWltZSkKICAgICAgICAgICAgIHx8ICF0YXJnZXRGb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbmV3TWltZSkKICAgICAgICAgICAgIHx8ICEob2xkTWltZSA9PSBuZXdNaW1lKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0yMDEsMTIgKzc2MiwzNDMgQEAKICAgICBpZiAoYXVkaW8pIHsKICAgICAgICAgc2VhbWxlc3MgPSBzdXBwb3J0c1NlYW1sZXNzQXVkaW9Gb3JtYXRDaGFuZ2UodGFyZ2V0Rm9ybWF0KTsKICAgICB9IGVsc2UgewotICAgICAgICBzZWFtbGVzcyA9IG1Db2RlYyAhPSBOVUxMICYmIG1Db2RlYy0+aXNDb25maWd1cmVkRm9yQWRhcHRpdmVQbGF5YmFjaygpOworICAgICAgICBpbnQzMl90IGlzQWRhcHRpdmU7CisgICAgICAgIHNlYW1sZXNzID0gKG1Db2RlYyAhPSBOVUxMICYmCisgICAgICAgICAgICAgICAgbUlucHV0Rm9ybWF0LT5maW5kSW50MzIoImFkYXB0aXZlLXBsYXliYWNrIiwgJmlzQWRhcHRpdmUpICYmCisgICAgICAgICAgICAgICAgaXNBZGFwdGl2ZSk7CiAgICAgfQogCiAgICAgQUxPR1YoIiVzIHNlYW1sZXNzIHN1cHBvcnQgZm9yICVzIiwgc2VhbWxlc3MgPyAieWVzIiA6ICJubyIsIG9sZE1pbWUuY19zdHIoKSk7CiAgICAgcmV0dXJuIHNlYW1sZXNzOwogfQogCitzdHJ1Y3QgQ0NEYXRhIHsKKyAgICBDQ0RhdGEodWludDhfdCB0eXBlLCB1aW50OF90IGRhdGExLCB1aW50OF90IGRhdGEyKQorICAgICAgICA6IG1UeXBlKHR5cGUpLCBtRGF0YTEoZGF0YTEpLCBtRGF0YTIoZGF0YTIpIHsKKyAgICB9CisgICAgYm9vbCBnZXRDaGFubmVsKHNpemVfdCAqY2hhbm5lbCkgY29uc3QgeworICAgICAgICBpZiAobURhdGExID49IDB4MTAgJiYgbURhdGExIDw9IDB4MWYpIHsKKyAgICAgICAgICAgICpjaGFubmVsID0gKG1EYXRhMSA+PSAweDE4ID8gMSA6IDApICsgKG1UeXBlID8gMiA6IDApOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVpbnQ4X3QgbVR5cGU7CisgICAgdWludDhfdCBtRGF0YTE7CisgICAgdWludDhfdCBtRGF0YTI7Cit9OworCitzdGF0aWMgYm9vbCBpc051bGxQYWQoQ0NEYXRhICpjYykgeworICAgIHJldHVybiBjYy0+bURhdGExIDwgMHgxMCAmJiBjYy0+bURhdGEyIDwgMHgxMDsKK30KKworc3RhdGljIHZvaWQgZHVtcEJ5dGVQYWlyKGNvbnN0IHNwPEFCdWZmZXI+ICZjY0J1ZikgeworICAgIHNpemVfdCBvZmZzZXQgPSAwOworICAgIEFTdHJpbmcgb3V0OworCisgICAgd2hpbGUgKG9mZnNldCA8IGNjQnVmLT5zaXplKCkpIHsKKyAgICAgICAgY2hhciB0bXBbMTI4XTsKKworICAgICAgICBDQ0RhdGEgKmNjID0gKENDRGF0YSAqKSAoY2NCdWYtPmRhdGEoKSArIG9mZnNldCk7CisKKyAgICAgICAgaWYgKGlzTnVsbFBhZChjYykpIHsKKyAgICAgICAgICAgIC8vIDEgbnVsbCBwYWQgb3IgWERTIG1ldGFkYXRhLCBpZ25vcmUKKyAgICAgICAgICAgIG9mZnNldCArPSBzaXplb2YoQ0NEYXRhKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNjLT5tRGF0YTEgPj0gMHgyMCAmJiBjYy0+bURhdGExIDw9IDB4N2YpIHsKKyAgICAgICAgICAgIC8vIDIgYmFzaWMgY2hhcnMKKyAgICAgICAgICAgIHNwcmludGYodG1wLCAiWyVkXUJhc2ljOiAlYyAlYyIsIGNjLT5tVHlwZSwgY2MtPm1EYXRhMSwgY2MtPm1EYXRhMik7CisgICAgICAgIH0gZWxzZSBpZiAoKGNjLT5tRGF0YTEgPT0gMHgxMSB8fCBjYy0+bURhdGExID09IDB4MTkpCisgICAgICAgICAgICAgICAgICYmIGNjLT5tRGF0YTIgPj0gMHgzMCAmJiBjYy0+bURhdGEyIDw9IDB4M2YpIHsKKyAgICAgICAgICAgIC8vIDEgc3BlY2lhbCBjaGFyCisgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIlslZF1TcGVjaWFsOiAlMDJ4ICUwMngiLCBjYy0+bVR5cGUsIGNjLT5tRGF0YTEsIGNjLT5tRGF0YTIpOworICAgICAgICB9IGVsc2UgaWYgKChjYy0+bURhdGExID09IDB4MTIgfHwgY2MtPm1EYXRhMSA9PSAweDFBKQorICAgICAgICAgICAgICAgICAmJiBjYy0+bURhdGEyID49IDB4MjAgJiYgY2MtPm1EYXRhMiA8PSAweDNmKXsKKyAgICAgICAgICAgIC8vIDEgU3BhbmlzaC9GcmVuY2ggY2hhcgorICAgICAgICAgICAgc3ByaW50Zih0bXAsICJbJWRdU3BhbmlzaDogJTAyeCAlMDJ4IiwgY2MtPm1UeXBlLCBjYy0+bURhdGExLCBjYy0+bURhdGEyKTsKKyAgICAgICAgfSBlbHNlIGlmICgoY2MtPm1EYXRhMSA9PSAweDEzIHx8IGNjLT5tRGF0YTEgPT0gMHgxQikKKyAgICAgICAgICAgICAgICAgJiYgY2MtPm1EYXRhMiA+PSAweDIwICYmIGNjLT5tRGF0YTIgPD0gMHgzZil7CisgICAgICAgICAgICAvLyAxIFBvcnR1Z3Vlc2UvR2VybWFuL0RhbmlzaCBjaGFyCisgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIlslZF1HZXJtYW46ICUwMnggJTAyeCIsIGNjLT5tVHlwZSwgY2MtPm1EYXRhMSwgY2MtPm1EYXRhMik7CisgICAgICAgIH0gZWxzZSBpZiAoKGNjLT5tRGF0YTEgPT0gMHgxMSB8fCBjYy0+bURhdGExID09IDB4MTkpCisgICAgICAgICAgICAgICAgICYmIGNjLT5tRGF0YTIgPj0gMHgyMCAmJiBjYy0+bURhdGEyIDw9IDB4MmYpeworICAgICAgICAgICAgLy8gTWlkLVJvdyBDb2RlcyAoVGFibGUgNjkpCisgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIlslZF1NaWQtcm93OiAlMDJ4ICUwMngiLCBjYy0+bVR5cGUsIGNjLT5tRGF0YTEsIGNjLT5tRGF0YTIpOworICAgICAgICB9IGVsc2UgaWYgKCgoY2MtPm1EYXRhMSA9PSAweDE0IHx8IGNjLT5tRGF0YTEgPT0gMHgxYykKKyAgICAgICAgICAgICAgICAgICYmIGNjLT5tRGF0YTIgPj0gMHgyMCAmJiBjYy0+bURhdGEyIDw9IDB4MmYpCisgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAgICAgICAgICAgICgoY2MtPm1EYXRhMSA9PSAweDE3IHx8IGNjLT5tRGF0YTEgPT0gMHgxZikKKyAgICAgICAgICAgICAgICAgICYmIGNjLT5tRGF0YTIgPj0gMHgyMSAmJiBjYy0+bURhdGEyIDw9IDB4MjMpKXsKKyAgICAgICAgICAgIC8vIE1pc2MgQ29udHJvbCBDb2RlcyAoVGFibGUgNzApCisgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIlslZF1DdHJsOiAlMDJ4ICUwMngiLCBjYy0+bVR5cGUsIGNjLT5tRGF0YTEsIGNjLT5tRGF0YTIpOworICAgICAgICB9IGVsc2UgaWYgKChjYy0+bURhdGExICYgMHg3MCkgPT0gMHgxMAorICAgICAgICAgICAgICAgICYmIChjYy0+bURhdGEyICYgMHg0MCkgPT0gMHg0MAorICAgICAgICAgICAgICAgICYmICgoY2MtPm1EYXRhMSAmIDB4MDcpIHx8ICEoY2MtPm1EYXRhMiAmIDB4MjApKSApIHsKKyAgICAgICAgICAgIC8vIFByZWFtYmxlIEFkZHJlc3MgQ29kZXMgKFRhYmxlIDcxKQorICAgICAgICAgICAgc3ByaW50Zih0bXAsICJbJWRdUEFDOiAlMDJ4ICUwMngiLCBjYy0+bVR5cGUsIGNjLT5tRGF0YTEsIGNjLT5tRGF0YTIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3ByaW50Zih0bXAsICJbJWRdSW52YWxpZDogJTAyeCAlMDJ4IiwgY2MtPm1UeXBlLCBjYy0+bURhdGExLCBjYy0+bURhdGEyKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvdXQuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgb3V0LmFwcGVuZCgiLCAiKTsKKyAgICAgICAgfQorCisgICAgICAgIG91dC5hcHBlbmQodG1wKTsKKworICAgICAgICBvZmZzZXQgKz0gc2l6ZW9mKENDRGF0YSk7CisgICAgfQorCisgICAgQUxPR0koIiVzIiwgb3V0LmNfc3RyKCkpOworfQorCitOdVBsYXllcjo6Q0NEZWNvZGVyOjpDQ0RlY29kZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpCisgICAgOiBtTm90aWZ5KG5vdGlmeSksCisgICAgICBtQ3VycmVudENoYW5uZWwoMCksCisgICAgICBtU2VsZWN0ZWRUcmFjaygtMSkgeworICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2YobVRyYWNrSW5kaWNlcykvc2l6ZW9mKG1UcmFja0luZGljZXNbMF0pOyArK2kpIHsKKyAgICAgICAgICBtVHJhY2tJbmRpY2VzW2ldID0gLTE7CisgICAgICB9Cit9CisKK3NpemVfdCBOdVBsYXllcjo6Q0NEZWNvZGVyOjpnZXRUcmFja0NvdW50KCkgY29uc3QgeworICAgIHJldHVybiBtRm91bmRDaGFubmVscy5zaXplKCk7Cit9CisKK3NwPEFNZXNzYWdlPiBOdVBsYXllcjo6Q0NEZWNvZGVyOjpnZXRUcmFja0luZm8oc2l6ZV90IGluZGV4KSBjb25zdCB7CisgICAgaWYgKCFpc1RyYWNrVmFsaWQoaW5kZXgpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBuZXcgQU1lc3NhZ2UoKTsKKworICAgIGZvcm1hdC0+c2V0SW50MzIoInR5cGUiLCBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFKTsKKyAgICBmb3JtYXQtPnNldFN0cmluZygibGFuZ3VhZ2UiLCAidW5kIik7CisgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9URVhUX0NFQV82MDgpOworICAgIC8vQ0MxLCBmaWVsZCAwIGNoYW5uZWwgMAorICAgIGJvb2wgaXNEZWZhdWx0QXV0byA9IChtRm91bmRDaGFubmVsc1tpbmRleF0gPT0gMCk7CisgICAgZm9ybWF0LT5zZXRJbnQzMigiYXV0byIsIGlzRGVmYXVsdEF1dG8pOworICAgIGZvcm1hdC0+c2V0SW50MzIoImRlZmF1bHQiLCBpc0RlZmF1bHRBdXRvKTsKKyAgICBmb3JtYXQtPnNldEludDMyKCJmb3JjZWQiLCAwKTsKKworICAgIHJldHVybiBmb3JtYXQ7Cit9CisKK3N0YXR1c190IE51UGxheWVyOjpDQ0RlY29kZXI6OnNlbGVjdFRyYWNrKHNpemVfdCBpbmRleCwgYm9vbCBzZWxlY3QpIHsKKyAgICBpZiAoIWlzVHJhY2tWYWxpZChpbmRleCkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAoc2VsZWN0KSB7CisgICAgICAgIGlmIChtU2VsZWN0ZWRUcmFjayA9PSAoc3NpemVfdClpbmRleCkgeworICAgICAgICAgICAgQUxPR0UoInRyYWNrICV6dSBhbHJlYWR5IHNlbGVjdGVkIiwgaW5kZXgpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigic2VsZWN0ZWQgdHJhY2sgJXp1IiwgaW5kZXgpOworICAgICAgICBtU2VsZWN0ZWRUcmFjayA9IGluZGV4OworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtU2VsZWN0ZWRUcmFjayAhPSAoc3NpemVfdClpbmRleCkgeworICAgICAgICAgICAgQUxPR0UoInRyYWNrICV6dSBpcyBub3Qgc2VsZWN0ZWQiLCBpbmRleCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJ1bnNlbGVjdGVkIHRyYWNrICV6dSIsIGluZGV4KTsKKyAgICAgICAgbVNlbGVjdGVkVHJhY2sgPSAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgTnVQbGF5ZXI6OkNDRGVjb2Rlcjo6aXNTZWxlY3RlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVNlbGVjdGVkVHJhY2sgPj0gMCAmJiBtU2VsZWN0ZWRUcmFjayA8IChpbnQzMl90KSBnZXRUcmFja0NvdW50KCk7Cit9CisKK2Jvb2wgTnVQbGF5ZXI6OkNDRGVjb2Rlcjo6aXNUcmFja1ZhbGlkKHNpemVfdCBpbmRleCkgY29uc3QgeworICAgIHJldHVybiBpbmRleCA8IGdldFRyYWNrQ291bnQoKTsKK30KKworaW50MzJfdCBOdVBsYXllcjo6Q0NEZWNvZGVyOjpnZXRUcmFja0luZGV4KHNpemVfdCBjaGFubmVsKSBjb25zdCB7CisgICAgaWYgKGNoYW5uZWwgPCBzaXplb2YobVRyYWNrSW5kaWNlcykvc2l6ZW9mKG1UcmFja0luZGljZXNbMF0pKSB7CisgICAgICAgIHJldHVybiBtVHJhY2tJbmRpY2VzW2NoYW5uZWxdOworICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKKy8vIHJldHVybnMgdHJ1ZSBpZiBhIG5ldyBDQyB0cmFjayBpcyBmb3VuZAorYm9vbCBOdVBsYXllcjo6Q0NEZWNvZGVyOjpleHRyYWN0RnJvbVNFSShjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCkgeworICAgIGludDY0X3QgdGltZVVzOworICAgIENIRUNLKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CisKKyAgICBzcDxBQnVmZmVyPiBzZWk7CisgICAgaWYgKCFhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRCdWZmZXIoInNlaSIsICZzZWkpIHx8IHNlaSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIHRyYWNrQWRkZWQgPSBmYWxzZTsKKworICAgIE5BTEJpdFJlYWRlciBicihzZWktPmRhdGEoKSArIDEsIHNlaS0+c2l6ZSgpIC0gMSk7CisgICAgLy8gc2VpX21lc3NhZ2UoKQorICAgIHdoaWxlIChici5hdExlYXN0TnVtQml0c0xlZnQoMTYpKSB7IC8vIGF0IGxlYXN0IDE2LWJpdCBmb3Igc2VpX21lc3NhZ2UoKQorICAgICAgICB1aW50MzJfdCBwYXlsb2FkX3R5cGUgPSAwOworICAgICAgICBzaXplX3QgcGF5bG9hZF9zaXplID0gMDsKKyAgICAgICAgdWludDhfdCBsYXN0X2J5dGU7CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgbGFzdF9ieXRlID0gYnIuZ2V0Qml0cyg4KTsKKyAgICAgICAgICAgIHBheWxvYWRfdHlwZSArPSBsYXN0X2J5dGU7CisgICAgICAgIH0gd2hpbGUgKGxhc3RfYnl0ZSA9PSAweEZGKTsKKworICAgICAgICBkbyB7CisgICAgICAgICAgICBsYXN0X2J5dGUgPSBici5nZXRCaXRzKDgpOworICAgICAgICAgICAgcGF5bG9hZF9zaXplICs9IGxhc3RfYnl0ZTsKKyAgICAgICAgfSB3aGlsZSAobGFzdF9ieXRlID09IDB4RkYpOworCisgICAgICAgIC8vIHNlaV9wYXlsb2FkKCkKKyAgICAgICAgaWYgKHBheWxvYWRfdHlwZSA9PSA0KSB7CisgICAgICAgICAgICAvLyB1c2VyX2RhdGFfcmVnaXN0ZXJlZF9pdHVfdF90MzUoKQorCisgICAgICAgICAgICAvLyBBVFNDIEEvNzI6IDYuNC4yCisgICAgICAgICAgICB1aW50OF90IGl0dV90X3QzNV9jb3VudHJ5X2NvZGUgPSBici5nZXRCaXRzKDgpOworICAgICAgICAgICAgdWludDE2X3QgaXR1X3RfdDM1X3Byb3ZpZGVyX2NvZGUgPSBici5nZXRCaXRzKDE2KTsKKyAgICAgICAgICAgIHVpbnQzMl90IHVzZXJfaWRlbnRpZmllciA9IGJyLmdldEJpdHMoMzIpOworICAgICAgICAgICAgdWludDhfdCB1c2VyX2RhdGFfdHlwZV9jb2RlID0gYnIuZ2V0Qml0cyg4KTsKKworICAgICAgICAgICAgcGF5bG9hZF9zaXplIC09IDEgKyAyICsgNCArIDE7CisKKyAgICAgICAgICAgIGlmIChpdHVfdF90MzVfY291bnRyeV9jb2RlID09IDB4QjUKKyAgICAgICAgICAgICAgICAgICAgJiYgaXR1X3RfdDM1X3Byb3ZpZGVyX2NvZGUgPT0gMHgwMDMxCisgICAgICAgICAgICAgICAgICAgICYmIHVzZXJfaWRlbnRpZmllciA9PSAnR0E5NCcKKyAgICAgICAgICAgICAgICAgICAgJiYgdXNlcl9kYXRhX3R5cGVfY29kZSA9PSAweDMpIHsKKyAgICAgICAgICAgICAgICAvLyBNUEVHX2NjX2RhdGEoKQorICAgICAgICAgICAgICAgIC8vIEFUU0MgQS81MyBQYXJ0IDQ6IDYuMi4zLjEKKyAgICAgICAgICAgICAgICBici5za2lwQml0cygxKTsgLy9wcm9jZXNzX2VtX2RhdGFfZmxhZworICAgICAgICAgICAgICAgIGJvb2wgcHJvY2Vzc19jY19kYXRhX2ZsYWcgPSBici5nZXRCaXRzKDEpOworICAgICAgICAgICAgICAgIGJyLnNraXBCaXRzKDEpOyAvL2FkZGl0aW9uYWxfZGF0YV9mbGFnCisgICAgICAgICAgICAgICAgc2l6ZV90IGNjX2NvdW50ID0gYnIuZ2V0Qml0cyg1KTsKKyAgICAgICAgICAgICAgICBici5za2lwQml0cyg4KTsgLy8gZW1fZGF0YTsKKyAgICAgICAgICAgICAgICBwYXlsb2FkX3NpemUgLT0gMjsKKworICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzX2NjX2RhdGFfZmxhZykgeworICAgICAgICAgICAgICAgICAgICBBU3RyaW5nIG91dDsKKworICAgICAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBjY0J1ZiA9IG5ldyBBQnVmZmVyKGNjX2NvdW50ICogc2l6ZW9mKENDRGF0YSkpOworICAgICAgICAgICAgICAgICAgICBjY0J1Zi0+c2V0UmFuZ2UoMCwgMCk7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjY19jb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG1hcmtlciA9IGJyLmdldEJpdHMoNSk7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtYXJrZXIsIDB4MWYpOworCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNjX3ZhbGlkID0gYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2NfdHlwZSA9IGJyLmdldEJpdHMoMik7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgb2RkIHBhcml0eSBiaXQKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2NfZGF0YV8xID0gYnIuZ2V0Qml0cyg4KSAmIDB4N2Y7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNjX2RhdGFfMiA9IGJyLmdldEJpdHMoOCkgJiAweDdmOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2NfdmFsaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGNjX3R5cGUgPT0gMCB8fCBjY190eXBlID09IDEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NEYXRhIGNjKGNjX3R5cGUsIGNjX2RhdGFfMSwgY2NfZGF0YV8yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTnVsbFBhZCgmY2MpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjaGFubmVsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2MuZ2V0Q2hhbm5lbCgmY2hhbm5lbCkgJiYgZ2V0VHJhY2tJbmRleChjaGFubmVsKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFja0luZGljZXNbY2hhbm5lbF0gPSBtRm91bmRDaGFubmVscy5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRm91bmRDaGFubmVscy5wdXNoX2JhY2soY2hhbm5lbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0FkZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoY2NCdWYtPmRhdGEoKSArIGNjQnVmLT5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmY2MsIHNpemVvZihjYykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjY0J1Zi0+c2V0UmFuZ2UoMCwgY2NCdWYtPnNpemUoKSArIHNpemVvZihDQ0RhdGEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcGF5bG9hZF9zaXplIC09IGNjX2NvdW50ICogMzsKKworICAgICAgICAgICAgICAgICAgICBtQ0NNYXAuYWRkKHRpbWVVcywgY2NCdWYpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dWKCJNYWxmb3JtZWQgU0VJIHBheWxvYWQgdHlwZSA0Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVigiVW5zdXBwb3J0ZWQgU0VJIHBheWxvYWQgdHlwZSAlZCIsIHBheWxvYWRfdHlwZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBza2lwcGluZyByZW1haW5pbmcgYml0cyBvZiB0aGlzIHBheWxvYWQKKyAgICAgICAgYnIuc2tpcEJpdHMocGF5bG9hZF9zaXplICogOCk7CisgICAgfQorCisgICAgcmV0dXJuIHRyYWNrQWRkZWQ7Cit9CisKK3NwPEFCdWZmZXI+IE51UGxheWVyOjpDQ0RlY29kZXI6OmZpbHRlckNDQnVmKAorICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmY2NCdWYsIHNpemVfdCBpbmRleCkgeworICAgIHNwPEFCdWZmZXI+IGZpbHRlcmVkQ0NCdWYgPSBuZXcgQUJ1ZmZlcihjY0J1Zi0+c2l6ZSgpKTsKKyAgICBmaWx0ZXJlZENDQnVmLT5zZXRSYW5nZSgwLCAwKTsKKworICAgIHNpemVfdCBjY19jb3VudCA9IGNjQnVmLT5zaXplKCkgLyBzaXplb2YoQ0NEYXRhKTsKKyAgICBjb25zdCBDQ0RhdGEqIGNjX2RhdGEgPSAoY29uc3QgQ0NEYXRhKiljY0J1Zi0+ZGF0YSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2NfY291bnQ7ICsraSkgeworICAgICAgICBzaXplX3QgY2hhbm5lbDsKKyAgICAgICAgaWYgKGNjX2RhdGFbaV0uZ2V0Q2hhbm5lbCgmY2hhbm5lbCkpIHsKKyAgICAgICAgICAgIG1DdXJyZW50Q2hhbm5lbCA9IGNoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1DdXJyZW50Q2hhbm5lbCA9PSBtRm91bmRDaGFubmVsc1tpbmRleF0pIHsKKyAgICAgICAgICAgIG1lbWNweShmaWx0ZXJlZENDQnVmLT5kYXRhKCkgKyBmaWx0ZXJlZENDQnVmLT5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopJmNjX2RhdGFbaV0sIHNpemVvZihDQ0RhdGEpKTsKKyAgICAgICAgICAgIGZpbHRlcmVkQ0NCdWYtPnNldFJhbmdlKDAsIGZpbHRlcmVkQ0NCdWYtPnNpemUoKSArIHNpemVvZihDQ0RhdGEpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmaWx0ZXJlZENDQnVmOworfQorCit2b2lkIE51UGxheWVyOjpDQ0RlY29kZXI6OmRlY29kZShjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCkgeworICAgIGlmIChleHRyYWN0RnJvbVNFSShhY2Nlc3NVbml0KSkgeworICAgICAgICBBTE9HSSgiRm91bmQgQ0VBLTYwOCB0cmFjayIpOworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFRyYWNrQWRkZWQpOworICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICB9CisgICAgLy8gVE9ETzogZXh0cmFjdCBDQyBmcm9tIG90aGVyIHNvdXJjZXMKK30KKwordm9pZCBOdVBsYXllcjo6Q0NEZWNvZGVyOjpkaXNwbGF5KGludDY0X3QgdGltZVVzKSB7CisgICAgaWYgKCFpc1RyYWNrVmFsaWQobVNlbGVjdGVkVHJhY2spKSB7CisgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZmluZCBjdXJyZW50IHRyYWNrKGluZGV4PSVkKSIsIG1TZWxlY3RlZFRyYWNrKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNzaXplX3QgaW5kZXggPSBtQ0NNYXAuaW5kZXhPZktleSh0aW1lVXMpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1YoImNjIGZvciB0aW1lc3RhbXAgJSIgUFJJZDY0ICIgbm90IGZvdW5kIiwgdGltZVVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGNjQnVmID0gZmlsdGVyQ0NCdWYobUNDTWFwLnZhbHVlQXQoaW5kZXgpLCBtU2VsZWN0ZWRUcmFjayk7CisKKyAgICBpZiAoY2NCdWYtPnNpemUoKSA+IDApIHsKKyNpZiAwCisgICAgICAgIGR1bXBCeXRlUGFpcihjY0J1Zik7CisjZW5kaWYKKworICAgICAgICBjY0J1Zi0+bWV0YSgpLT5zZXRJbnQzMigidHJhY2tJbmRleCIsIG1TZWxlY3RlZFRyYWNrKTsKKyAgICAgICAgY2NCdWYtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisgICAgICAgIGNjQnVmLT5tZXRhKCktPnNldEludDY0KCJkdXJhdGlvblVzIiwgMGxsKTsKKworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoIndoYXQiLCBrV2hhdENsb3NlZENhcHRpb25EYXRhKTsKKyAgICAgICAgbXNnLT5zZXRCdWZmZXIoImJ1ZmZlciIsIGNjQnVmKTsKKyAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgfQorCisgICAgLy8gcmVtb3ZlIGFsbCBlbnRyaWVzIGJlZm9yZSB0aW1lVXMKKyAgICBtQ0NNYXAucmVtb3ZlSXRlbXNBdCgwLCBpbmRleCArIDEpOworfQorCit2b2lkIE51UGxheWVyOjpDQ0RlY29kZXI6OmZsdXNoKCkgeworICAgIG1DQ01hcC5jbGVhcigpOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmgKaW5kZXggNzhlYTc0YS4uZGJhM2VlZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuaApAQCAtMjUsMjAgKzI1LDM2IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBQnVmZmVyOworc3RydWN0IE1lZGlhQ29kZWM7CitzdHJ1Y3QgTWVkaWFCdWZmZXI7CiAKIHN0cnVjdCBOdVBsYXllcjo6RGVjb2RlciA6IHB1YmxpYyBBSGFuZGxlciB7CiAgICAgRGVjb2Rlcihjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKICAgICAgICAgICAgIGNvbnN0IHNwPE5hdGl2ZVdpbmRvd1dyYXBwZXI+ICZuYXRpdmVXaW5kb3cgPSBOVUxMKTsKIAotICAgIHZvaWQgY29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKKyAgICB2aXJ0dWFsIHZvaWQgY29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdCgpOwogCi0gICAgdm9pZCBzaWduYWxGbHVzaCgpOwotICAgIHZvaWQgc2lnbmFsUmVzdW1lKCk7Ci0gICAgdm9pZCBpbml0aWF0ZVNodXRkb3duKCk7CisgICAgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXJzKFZlY3RvcjxzcDxBQnVmZmVyPiA+ICpkc3RCdWZmZXJzKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsRmx1c2goY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsVXBkYXRlRm9ybWF0KGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsUmVzdW1lKCk7CisgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlU2h1dGRvd24oKTsKIAotICAgIGJvb2wgc3VwcG9ydHNTZWFtbGVzc0Zvcm1hdENoYW5nZShjb25zdCBzcDxBTWVzc2FnZT4gJnRvKSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydHNTZWFtbGVzc0Zvcm1hdENoYW5nZShjb25zdCBzcDxBTWVzc2FnZT4gJnRvKSBjb25zdDsKKworICAgIGVudW0geworICAgICAgICBrV2hhdEZpbGxUaGlzQnVmZmVyICAgICAgPSAnZmxUQicsCisgICAgICAgIGtXaGF0RHJhaW5UaGlzQnVmZmVyICAgICA9ICdkclRCJywKKyAgICAgICAga1doYXRPdXRwdXRGb3JtYXRDaGFuZ2VkID0gJ2ZtdEMnLAorICAgICAgICBrV2hhdEZsdXNoQ29tcGxldGVkICAgICAgPSAnZmxzQycsCisgICAgICAgIGtXaGF0U2h1dGRvd25Db21wbGV0ZWQgICA9ICdzaERDJywKKyAgICAgICAga1doYXRFT1MgICAgICAgICAgICAgICAgID0gJ2VvcyAnLAorICAgICAgICBrV2hhdEVycm9yICAgICAgICAgICAgICAgPSAnZXJyICcsCisgICAgfTsKIAogcHJvdGVjdGVkOgorCiAgICAgdmlydHVhbCB+RGVjb2RlcigpOwogCiAgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKQEAgLTQ2LDI3ICs2Miw5MCBAQAogcHJpdmF0ZToKICAgICBlbnVtIHsKICAgICAgICAga1doYXRDb2RlY05vdGlmeSAgICAgICAgPSAnY2RjTicsCisgICAgICAgIGtXaGF0Q29uZmlndXJlICAgICAgICAgID0gJ2NvbmYnLAorICAgICAgICBrV2hhdEdldElucHV0QnVmZmVycyAgICA9ICdnSW5CJywKKyAgICAgICAga1doYXRJbnB1dEJ1ZmZlckZpbGxlZCAgPSAnaW5wRicsCisgICAgICAgIGtXaGF0UmVuZGVyQnVmZmVyICAgICAgID0gJ3JuZHInLAorICAgICAgICBrV2hhdEZsdXNoICAgICAgICAgICAgICA9ICdmbHVzJywKKyAgICAgICAga1doYXRTaHV0ZG93biAgICAgICAgICAgPSAnc2h1RCcsCisgICAgICAgIGtXaGF0VXBkYXRlRm9ybWF0ICAgICAgID0gJ3VGbXQnLAogICAgIH07CiAKICAgICBzcDxBTWVzc2FnZT4gbU5vdGlmeTsKICAgICBzcDxOYXRpdmVXaW5kb3dXcmFwcGVyPiBtTmF0aXZlV2luZG93OwogCi0gICAgc3A8QU1lc3NhZ2U+IG1Gb3JtYXQ7Ci0gICAgc3A8QUNvZGVjPiBtQ29kZWM7CisgICAgc3A8QU1lc3NhZ2U+IG1JbnB1dEZvcm1hdDsKKyAgICBzcDxBTWVzc2FnZT4gbU91dHB1dEZvcm1hdDsKKyAgICBzcDxNZWRpYUNvZGVjPiBtQ29kZWM7CiAgICAgc3A8QUxvb3Blcj4gbUNvZGVjTG9vcGVyOworICAgIHNwPEFMb29wZXI+IG1EZWNvZGVyTG9vcGVyOwogCi0gICAgVmVjdG9yPHNwPEFCdWZmZXI+ID4gbUNTRDsKLSAgICBzaXplX3QgbUNTREluZGV4OworICAgIExpc3Q8c3A8QU1lc3NhZ2U+ID4gbVBlbmRpbmdJbnB1dE1lc3NhZ2VzOwogCi0gICAgc3A8QU1lc3NhZ2U+IG1ha2VGb3JtYXQoY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhKTsKKyAgICBWZWN0b3I8c3A8QUJ1ZmZlcj4gPiBtSW5wdXRCdWZmZXJzOworICAgIFZlY3RvcjxzcDxBQnVmZmVyPiA+IG1PdXRwdXRCdWZmZXJzOworICAgIFZlY3RvcjxzcDxBQnVmZmVyPiA+IG1DU0RzRm9yQ3VycmVudEZvcm1hdDsKKyAgICBWZWN0b3I8c3A8QUJ1ZmZlcj4gPiBtQ1NEc1RvU3VibWl0OworICAgIFZlY3Rvcjxib29sPiBtSW5wdXRCdWZmZXJJc0RlcXVldWVkOworICAgIFZlY3RvcjxNZWRpYUJ1ZmZlciAqPiBtTWVkaWFCdWZmZXJzOwogCi0gICAgdm9pZCBvbkZpbGxUaGlzQnVmZmVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2b2lkIGhhbmRsZUVycm9yKGludDMyX3QgZXJyKTsKKyAgICBib29sIGhhbmRsZUFuSW5wdXRCdWZmZXIoKTsKKyAgICBib29sIGhhbmRsZUFuT3V0cHV0QnVmZmVyKCk7CisKKyAgICB2b2lkIHJlbGVhc2VBbmRSZXNldE1lZGlhQnVmZmVycygpOworICAgIHZvaWQgcmVxdWVzdENvZGVjTm90aWZpY2F0aW9uKCk7CisgICAgYm9vbCBpc1N0YWxlUmVwbHkoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworCisgICAgdm9pZCBvbkNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7CisgICAgdm9pZCBvbkZsdXNoKCk7CisgICAgdm9pZCBvblJlc3VtZSgpOworICAgIGJvb2wgb25JbnB1dEJ1ZmZlckZpbGxlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBvblJlbmRlckJ1ZmZlcihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBvblNodXRkb3duKCk7CisKKyAgICBpbnQzMl90IG1CdWZmZXJHZW5lcmF0aW9uOworICAgIGJvb2wgbVBhdXNlZDsKKyAgICBBU3RyaW5nIG1Db21wb25lbnROYW1lOwogCiAgICAgYm9vbCBzdXBwb3J0c1NlYW1sZXNzQXVkaW9Gb3JtYXRDaGFuZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZ0YXJnZXRGb3JtYXQpIGNvbnN0OworICAgIHZvaWQgcmVtZW1iZXJDb2RlY1NwZWNpZmljRGF0YShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEZWNvZGVyKTsKIH07CiAKK3N0cnVjdCBOdVBsYXllcjo6Q0NEZWNvZGVyIDogcHVibGljIFJlZkJhc2UgeworICAgIGVudW0geworICAgICAgICBrV2hhdENsb3NlZENhcHRpb25EYXRhLAorICAgICAgICBrV2hhdFRyYWNrQWRkZWQsCisgICAgfTsKKworICAgIENDRGVjb2Rlcihjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSk7CisKKyAgICBzaXplX3QgZ2V0VHJhY2tDb3VudCgpIGNvbnN0OworICAgIHNwPEFNZXNzYWdlPiBnZXRUcmFja0luZm8oc2l6ZV90IGluZGV4KSBjb25zdDsKKyAgICBzdGF0dXNfdCBzZWxlY3RUcmFjayhzaXplX3QgaW5kZXgsIGJvb2wgc2VsZWN0KTsKKyAgICBib29sIGlzU2VsZWN0ZWQoKSBjb25zdDsKKyAgICB2b2lkIGRlY29kZShjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCk7CisgICAgdm9pZCBkaXNwbGF5KGludDY0X3QgdGltZVVzKTsKKyAgICB2b2lkIGZsdXNoKCk7CisKK3ByaXZhdGU6CisgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7CisgICAgS2V5ZWRWZWN0b3I8aW50NjRfdCwgc3A8QUJ1ZmZlcj4gPiBtQ0NNYXA7CisgICAgc2l6ZV90IG1DdXJyZW50Q2hhbm5lbDsKKyAgICBpbnQzMl90IG1TZWxlY3RlZFRyYWNrOworICAgIGludDMyX3QgbVRyYWNrSW5kaWNlc1s0XTsKKyAgICBWZWN0b3I8c2l6ZV90PiBtRm91bmRDaGFubmVsczsKKworICAgIGJvb2wgaXNUcmFja1ZhbGlkKHNpemVfdCBpbmRleCkgY29uc3Q7CisgICAgaW50MzJfdCBnZXRUcmFja0luZGV4KHNpemVfdCBjaGFubmVsKSBjb25zdDsKKyAgICBib29sIGV4dHJhY3RGcm9tU0VJKGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KTsKKyAgICBzcDxBQnVmZmVyPiBmaWx0ZXJDQ0J1Zihjb25zdCBzcDxBQnVmZmVyPiAmY2NCdWYsIHNpemVfdCBpbmRleCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDQ0RlY29kZXIpOworfTsKKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBOVVBMQVlFUl9ERUNPREVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyUGFzc1Rocm91Z2guY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2RlclBhc3NUaHJvdWdoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2FhY2RkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2RlclBhc3NUaHJvdWdoLmNwcApAQCAtMCwwICsxLDI2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTnVQbGF5ZXJEZWNvZGVyUGFzc1Rocm91Z2giCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgIk51UGxheWVyRGVjb2RlclBhc3NUaHJvdWdoLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhDYWNoZWRCeXRlcyA9IDIwMDAwMDsKKy8vIFRoZSBidWZmZXJzIHdpbGwgY29udGFpbiBhIGJpdCBsZXNzIHRoYW4ga0FnZ3JlZ2F0ZUJ1ZmZlclNpemVCeXRlcy4KKy8vIFNvIHdlIGNhbiBzdGFydCBvZmYgd2l0aCBqdXN0IGVub3VnaCBidWZmZXJzIHRvIGtlZXAgdGhlIGNhY2hlIGZ1bGwuCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhQZW5kaW5nQnVmZmVycyA9IDEgKyAoa01heENhY2hlZEJ5dGVzIC8gTnVQbGF5ZXI6OmtBZ2dyZWdhdGVCdWZmZXJTaXplQnl0ZXMpOworCitOdVBsYXllcjo6RGVjb2RlclBhc3NUaHJvdWdoOjpEZWNvZGVyUGFzc1Rocm91Z2goCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5KQorICAgIDogRGVjb2Rlcihub3RpZnkpLAorICAgICAgbU5vdGlmeShub3RpZnkpLAorICAgICAgbUJ1ZmZlckdlbmVyYXRpb24oMCksCisgICAgICBtUmVhY2hlZEVPUyh0cnVlKSwKKyAgICAgIG1QZW5kaW5nQnVmZmVyc1RvRmlsbCgwKSwKKyAgICAgIG1QZW5kaW5nQnVmZmVyc1RvRHJhaW4oMCksCisgICAgICBtQ2FjaGVkQnl0ZXMoMCksCisgICAgICBtQ29tcG9uZW50TmFtZSgicGFzcyB0aHJvdWdoIGRlY29kZXIiKSB7CisgICAgbURlY29kZXJMb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICBtRGVjb2Rlckxvb3Blci0+c2V0TmFtZSgiTnVQbGF5ZXJEZWNvZGVyUGFzc1Rocm91Z2giKTsKKyAgICBtRGVjb2Rlckxvb3Blci0+c3RhcnQoZmFsc2UsIGZhbHNlLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKK30KKworTnVQbGF5ZXI6OkRlY29kZXJQYXNzVGhyb3VnaDo6fkRlY29kZXJQYXNzVGhyb3VnaCgpIHsKK30KKwordm9pZCBOdVBsYXllcjo6RGVjb2RlclBhc3NUaHJvdWdoOjpjb25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q29uZmlndXJlLCBpZCgpKTsKKyAgICBtc2ctPnNldE1lc3NhZ2UoImZvcm1hdCIsIGZvcm1hdCk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXJQYXNzVGhyb3VnaDo6aW5pdCgpIHsKKyAgICBtRGVjb2Rlckxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKHRoaXMpOworfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyUGFzc1Rocm91Z2g6OnNpZ25hbEZsdXNoKCkgeworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRGbHVzaCwgaWQoKSkpLT5wb3N0KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXJQYXNzVGhyb3VnaDo6c2lnbmFsUmVzdW1lKCkgeworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZXN1bWUsIGlkKCkpKS0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyUGFzc1Rocm91Z2g6OmluaXRpYXRlU2h1dGRvd24oKSB7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFNodXRkb3duLCBpZCgpKSktPnBvc3QoKTsKK30KKworYm9vbCBOdVBsYXllcjo6RGVjb2RlclBhc3NUaHJvdWdoOjpzdXBwb3J0c1NlYW1sZXNzRm9ybWF0Q2hhbmdlKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJiAvKiB0YXJnZXRGb3JtYXQgKi8pIGNvbnN0IHsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBOdVBsYXllcjo6RGVjb2RlclBhc3NUaHJvdWdoOjpvbkNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgeworICAgIEFMT0dWKCJbJXNdIG9uQ29uZmlndXJlIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgbUNhY2hlZEJ5dGVzID0gMDsKKyAgICBtUGVuZGluZ0J1ZmZlcnNUb0ZpbGwgPSAwOworICAgIG1QZW5kaW5nQnVmZmVyc1RvRHJhaW4gPSAwOworICAgIG1SZWFjaGVkRU9TID0gZmFsc2U7CisgICAgKyttQnVmZmVyR2VuZXJhdGlvbjsKKworICAgIHJlcXVlc3RNYXhCdWZmZXJzKCk7CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0T3V0cHV0Rm9ybWF0Q2hhbmdlZCk7CisgICAgbm90aWZ5LT5zZXRNZXNzYWdlKCJmb3JtYXQiLCBmb3JtYXQpOworICAgIG5vdGlmeS0+cG9zdCgpOworfQorCitib29sIE51UGxheWVyOjpEZWNvZGVyUGFzc1Rocm91Z2g6OmlzU3RhbGVSZXBseShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7CisgICAgcmV0dXJuIGdlbmVyYXRpb24gIT0gbUJ1ZmZlckdlbmVyYXRpb247Cit9CisKK2Jvb2wgTnVQbGF5ZXI6OkRlY29kZXJQYXNzVGhyb3VnaDo6cmVxdWVzdEFCdWZmZXIoKSB7CisgICAgaWYgKG1DYWNoZWRCeXRlcyA+PSBrTWF4Q2FjaGVkQnl0ZXMpIHsKKyAgICAgICAgQUxPR1YoIlslc10gbUNhY2hlZEJ5dGVzID0gJXp1IiwKKyAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBtQ2FjaGVkQnl0ZXMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChtUmVhY2hlZEVPUykgeworICAgICAgICBBTE9HVigiWyVzXSByZWFjaGVkIEVPUyIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKGtXaGF0SW5wdXRCdWZmZXJGaWxsZWQsIGlkKCkpOworICAgIHJlcGx5LT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1CdWZmZXJHZW5lcmF0aW9uKTsKKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRGaWxsVGhpc0J1ZmZlcik7CisgICAgbm90aWZ5LT5zZXRNZXNzYWdlKCJyZXBseSIsIHJlcGx5KTsKKyAgICBub3RpZnktPnBvc3QoKTsKKyAgICBtUGVuZGluZ0J1ZmZlcnNUb0ZpbGwrKzsKKyAgICBBTE9HVigicmVxdWVzdEFCdWZmZXI6ICNUb0ZpbGwgPSAlenUsICNUb0RyYWluID0gJXp1IiwgbVBlbmRpbmdCdWZmZXJzVG9GaWxsLAorICAgICAgICAgICAgbVBlbmRpbmdCdWZmZXJzVG9EcmFpbik7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBhbmRyb2lkOjpOdVBsYXllcjo6RGVjb2RlclBhc3NUaHJvdWdoOjpvbklucHV0QnVmZmVyRmlsbGVkKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIC0tbVBlbmRpbmdCdWZmZXJzVG9GaWxsOworICAgIGlmIChtUmVhY2hlZEVPUykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOworICAgIG1zZy0+ZmluZEJ1ZmZlcigiYnVmZmVyIiwgJmJ1ZmZlcik7CisgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIG1SZWFjaGVkRU9TID0gdHJ1ZTsKKworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEVPUyk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImVyciIsIEVSUk9SX0VORF9PRl9TVFJFQU0pOworICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1DYWNoZWRCeXRlcyArPSBidWZmZXItPnNpemUoKTsKKworICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZShrV2hhdEJ1ZmZlckNvbnN1bWVkLCBpZCgpKTsKKyAgICByZXBseS0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtQnVmZmVyR2VuZXJhdGlvbik7CisgICAgcmVwbHktPnNldEludDMyKCJzaXplIiwgYnVmZmVyLT5zaXplKCkpOworCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdERyYWluVGhpc0J1ZmZlcik7CisgICAgbm90aWZ5LT5zZXRCdWZmZXIoImJ1ZmZlciIsIGJ1ZmZlcik7CisgICAgbm90aWZ5LT5zZXRNZXNzYWdlKCJyZXBseSIsIHJlcGx5KTsKKyAgICBub3RpZnktPnBvc3QoKTsKKyAgICArK21QZW5kaW5nQnVmZmVyc1RvRHJhaW47CisgICAgQUxPR1YoIm9uSW5wdXRCdWZmZXJGaWxsZWQ6ICNUb0ZpbGwgPSAlenUsICNUb0RyYWluID0gJXp1LCBjYWNoZWRCeXRlcyA9ICV6dSIsCisgICAgICAgICAgICBtUGVuZGluZ0J1ZmZlcnNUb0ZpbGwsIG1QZW5kaW5nQnVmZmVyc1RvRHJhaW4sIG1DYWNoZWRCeXRlcyk7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXJQYXNzVGhyb3VnaDo6b25CdWZmZXJDb25zdW1lZChpbnQzMl90IHNpemUpIHsKKyAgICAtLW1QZW5kaW5nQnVmZmVyc1RvRHJhaW47CisgICAgbUNhY2hlZEJ5dGVzIC09IHNpemU7CisgICAgQUxPR1YoIm9uQnVmZmVyQ29uc3VtZWQ6ICNUb0ZpbGwgPSAlenUsICNUb0RyYWluID0gJXp1LCBjYWNoZWRCeXRlcyA9ICV6dSIsCisgICAgICAgICAgIG1QZW5kaW5nQnVmZmVyc1RvRmlsbCwgbVBlbmRpbmdCdWZmZXJzVG9EcmFpbiwgbUNhY2hlZEJ5dGVzKTsKKyAgICByZXF1ZXN0QUJ1ZmZlcigpOworfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyUGFzc1Rocm91Z2g6Om9uRmx1c2goKSB7CisgICAgKyttQnVmZmVyR2VuZXJhdGlvbjsKKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRGbHVzaENvbXBsZXRlZCk7CisgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgbVBlbmRpbmdCdWZmZXJzVG9GaWxsID0gMDsKKyAgICBtUGVuZGluZ0J1ZmZlcnNUb0RyYWluID0gMDsKKyAgICBtQ2FjaGVkQnl0ZXMgPSAwOworICAgIG1SZWFjaGVkRU9TID0gZmFsc2U7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXJQYXNzVGhyb3VnaDo6cmVxdWVzdE1heEJ1ZmZlcnMoKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWF4UGVuZGluZ0J1ZmZlcnM7IGkrKykgeworICAgICAgICBpZiAoIXJlcXVlc3RBQnVmZmVyKCkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyUGFzc1Rocm91Z2g6Om9uU2h1dGRvd24oKSB7CisgICAgKyttQnVmZmVyR2VuZXJhdGlvbjsKKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRTaHV0ZG93bkNvbXBsZXRlZCk7CisgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgbVJlYWNoZWRFT1MgPSB0cnVlOworfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyUGFzc1Rocm91Z2g6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgQUxPR1YoIlslc10gb25NZXNzYWdlOiAlcyIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksCisgICAgICAgICAgICBtc2ctPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRDb25maWd1cmU6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJmb3JtYXQiLCAmZm9ybWF0KSk7CisgICAgICAgICAgICBvbkNvbmZpZ3VyZShmb3JtYXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0UmVxdWVzdEFCdWZmZXI6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghaXNTdGFsZVJlcGx5KG1zZykpIHsKKyAgICAgICAgICAgICAgICByZXF1ZXN0QUJ1ZmZlcigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRJbnB1dEJ1ZmZlckZpbGxlZDoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFpc1N0YWxlUmVwbHkobXNnKSkgeworICAgICAgICAgICAgICAgIG9uSW5wdXRCdWZmZXJGaWxsZWQobXNnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdEJ1ZmZlckNvbnN1bWVkOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWlzU3RhbGVSZXBseShtc2cpKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBzaXplOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzaXplIiwgJnNpemUpKTsKKyAgICAgICAgICAgICAgICBvbkJ1ZmZlckNvbnN1bWVkKHNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0Rmx1c2g6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uRmx1c2goKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFJlc3VtZToKKyAgICAgICAgeworICAgICAgICAgICAgcmVxdWVzdE1heEJ1ZmZlcnMoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFNodXRkb3duOgorICAgICAgICB7CisgICAgICAgICAgICBvblNodXRkb3duKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2RlclBhc3NUaHJvdWdoLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyUGFzc1Rocm91Z2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjIwMjU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2RlclBhc3NUaHJvdWdoLmgKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTlVQTEFZRVJfREVDT0RFUl9QQVNTX1RIUk9VR0hfSF8KKworI2RlZmluZSBOVVBMQVlFUl9ERUNPREVSX1BBU1NfVEhST1VHSF9IXworCisjaW5jbHVkZSAiTnVQbGF5ZXIuaCIKKworI2luY2x1ZGUgIk51UGxheWVyRGVjb2Rlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBOdVBsYXllcjo6RGVjb2RlclBhc3NUaHJvdWdoIDogcHVibGljIERlY29kZXIgeworICAgIERlY29kZXJQYXNzVGhyb3VnaChjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSk7CisKKyAgICB2aXJ0dWFsIHZvaWQgY29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdCgpOworCisgICAgdmlydHVhbCB2b2lkIHNpZ25hbEZsdXNoKCk7CisgICAgdmlydHVhbCB2b2lkIHNpZ25hbFJlc3VtZSgpOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZVNodXRkb3duKCk7CisKKyAgICBib29sIHN1cHBvcnRzU2VhbWxlc3NGb3JtYXRDaGFuZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZ0bykgY29uc3Q7CisKK3Byb3RlY3RlZDoKKworICAgIHZpcnR1YWwgfkRlY29kZXJQYXNzVGhyb3VnaCgpOworCisgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRSZXF1ZXN0QUJ1ZmZlciAgICAgPSAncmVxQicsCisgICAgICAgIGtXaGF0Q29uZmlndXJlICAgICAgICAgID0gJ2NvbmYnLAorICAgICAgICBrV2hhdElucHV0QnVmZmVyRmlsbGVkICA9ICdpbnBGJywKKyAgICAgICAga1doYXRCdWZmZXJDb25zdW1lZCAgICAgPSAnYnVmQycsCisgICAgICAgIGtXaGF0Rmx1c2ggICAgICAgICAgICAgID0gJ2ZsdXMnLAorICAgICAgICBrV2hhdFNodXRkb3duICAgICAgICAgICA9ICdzaHVEJywKKyAgICB9OworCisgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7CisgICAgc3A8QUxvb3Blcj4gbURlY29kZXJMb29wZXI7CisKKyAgICAvKiogUmV0dXJucyB0cnVlIGlmIGEgYnVmZmVyIHdhcyByZXF1ZXN0ZWQuCisgICAgICogUmV0dXJucyBmYWxzZSBpZiBhdCBFT1Mgb3IgY2FjaGUgYWxyZWFkeSBmdWxsLgorICAgICAqLworICAgIGJvb2wgcmVxdWVzdEFCdWZmZXIoKTsKKyAgICBib29sIGlzU3RhbGVSZXBseShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKKyAgICB2b2lkIG9uQ29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKKyAgICB2b2lkIG9uRmx1c2goKTsKKyAgICB2b2lkIG9uSW5wdXRCdWZmZXJGaWxsZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZvaWQgb25CdWZmZXJDb25zdW1lZChpbnQzMl90IHNpemUpOworICAgIHZvaWQgcmVxdWVzdE1heEJ1ZmZlcnMoKTsKKyAgICB2b2lkIG9uU2h1dGRvd24oKTsKKworICAgIGludDMyX3QgbUJ1ZmZlckdlbmVyYXRpb247CisgICAgYm9vbCAgICBtUmVhY2hlZEVPUzsKKyAgICAvLyBUT0RPIG1QZW5kaW5nQnVmZmVyc1RvRmlsbCBhbmQgbVBlbmRpbmdCdWZmZXJzVG9EcmFpbiBhcmUgb25seSBmb3IKKyAgICAvLyBkZWJ1Z2dpbmcuIFRoZXkgY2FuIGJlIHJlbW92ZWQgd2hlbiB0aGUgcG93ZXIgaW52ZXN0aWdhdGlvbiBpcyBkb25lLgorICAgIHNpemVfdCAgbVBlbmRpbmdCdWZmZXJzVG9GaWxsOworICAgIHNpemVfdCAgbVBlbmRpbmdCdWZmZXJzVG9EcmFpbjsKKyAgICBzaXplX3QgIG1DYWNoZWRCeXRlczsKKyAgICBBU3RyaW5nIG1Db21wb25lbnROYW1lOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRGVjb2RlclBhc3NUaHJvdWdoKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTlVQTEFZRVJfREVDT0RFUl9QQVNTX1RIUk9VR0hfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwCmluZGV4IDQ3ODM0ZmQuLmFiNDYwNzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmNwcApAQCAtMTYsNiArMTYsNyBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIk51UGxheWVyRHJpdmVyIgorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlICJOdVBsYXllckRyaXZlci5oIgpAQCAtMjUsNyArMjYsOSBAQAogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zNiwxMiArMzksMTQgQEAKICAgICAgIG1TZXRTdXJmYWNlSW5Qcm9ncmVzcyhmYWxzZSksCiAgICAgICBtRHVyYXRpb25VcygtMSksCiAgICAgICBtUG9zaXRpb25VcygtMSksCi0gICAgICBtTnVtRnJhbWVzVG90YWwoMCksCi0gICAgICBtTnVtRnJhbWVzRHJvcHBlZCgwKSwKKyAgICAgIG1TZWVrSW5Qcm9ncmVzcyhmYWxzZSksCiAgICAgICBtTG9vcGVyKG5ldyBBTG9vcGVyKSwKICAgICAgIG1QbGF5ZXJGbGFncygwKSwKICAgICAgIG1BdEVPUyhmYWxzZSksCisgICAgICBtTG9vcGluZyhmYWxzZSksCisgICAgICBtQXV0b0xvb3AoZmFsc2UpLAogICAgICAgbVN0YXJ0dXBTZWVrVGltZVVzKC0xKSB7CisgICAgQUxPR1YoIk51UGxheWVyRHJpdmVyKCVwKSIsIHRoaXMpOwogICAgIG1Mb29wZXItPnNldE5hbWUoIk51UGxheWVyRHJpdmVyIExvb3BlciIpOwogCiAgICAgbUxvb3Blci0+c3RhcnQoCkBAIC01Niw2ICs2MSw3IEBACiB9CiAKIE51UGxheWVyRHJpdmVyOjp+TnVQbGF5ZXJEcml2ZXIoKSB7CisgICAgQUxPR1YoIn5OdVBsYXllckRyaXZlciglcCkiLCB0aGlzKTsKICAgICBtTG9vcGVyLT5zdG9wKCk7CiB9CiAKQEAgLTcwLDcgKzc2LDEwIEBACiB9CiAKIHN0YXR1c190IE51UGxheWVyRHJpdmVyOjpzZXREYXRhU291cmNlKAotICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKKyAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglcCkgdXJsKCVzKSIsIHRoaXMsIHVyaURlYnVnU3RyaW5nKHVybCwgZmFsc2UpLmNfc3RyKCkpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBpZiAobVN0YXRlICE9IFNUQVRFX0lETEUpIHsKQEAgLTc5LDcgKzg4LDcgQEAKIAogICAgIG1TdGF0ZSA9IFNUQVRFX1NFVF9EQVRBU09VUkNFX1BFTkRJTkc7CiAKLSAgICBtUGxheWVyLT5zZXREYXRhU291cmNlQXN5bmModXJsLCBoZWFkZXJzKTsKKyAgICBtUGxheWVyLT5zZXREYXRhU291cmNlQXN5bmMoaHR0cFNlcnZpY2UsIHVybCwgaGVhZGVycyk7CiAKICAgICB3aGlsZSAobVN0YXRlID09IFNUQVRFX1NFVF9EQVRBU09VUkNFX1BFTkRJTkcpIHsKICAgICAgICAgbUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKQEAgLTg5LDYgKzk4LDcgQEAKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OnNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpIHsKKyAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglcCkgZmlsZSglZCkiLCB0aGlzLCBmZCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfSURMRSkgewpAQCAtMTA3LDYgKzExNyw3IEBACiB9CiAKIHN0YXR1c190IE51UGxheWVyRHJpdmVyOjpzZXREYXRhU291cmNlKGNvbnN0IHNwPElTdHJlYW1Tb3VyY2U+ICZzb3VyY2UpIHsKKyAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglcCkgc3RyZWFtIHNvdXJjZSIsIHRoaXMpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBpZiAobVN0YXRlICE9IFNUQVRFX0lETEUpIHsKQEAgLTEyNiw2ICsxMzcsNyBAQAogCiBzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6c2V0VmlkZW9TdXJmYWNlVGV4dHVyZSgKICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gJmJ1ZmZlclByb2R1Y2VyKSB7CisgICAgQUxPR1YoInNldFZpZGVvU3VyZmFjZVRleHR1cmUoJXApIiwgdGhpcyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIGlmIChtU2V0U3VyZmFjZUluUHJvZ3Jlc3MpIHsKQEAgLTE1Myw2ICsxNjUsNyBAQAogfQogCiBzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6cHJlcGFyZSgpIHsKKyAgICBBTE9HVigicHJlcGFyZSglcCkiLCB0aGlzKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIHJldHVybiBwcmVwYXJlX2woKTsKIH0KQEAgLTE3MSwxMiArMTg0LDIzIEBACiAgICAgICAgICAgICAgICAgbUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiAobVN0YXRlID09IFNUQVRFX1BSRVBBUkVEKSA/IE9LIDogVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEOgorICAgICAgICAgICAgLy8gdGhpcyBpcyByZWFsbHkganVzdCBwYXVzZWQuIGhhbmRsZSBhcyBzZWVrIHRvIHN0YXJ0CisgICAgICAgICAgICBtQXRFT1MgPSBmYWxzZTsKKyAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUklORzsKKyAgICAgICAgICAgIG1Jc0FzeW5jUHJlcGFyZSA9IGZhbHNlOworICAgICAgICAgICAgbVBsYXllci0+c2Vla1RvQXN5bmMoMCwgdHJ1ZSAvKiBuZWVkTm90aWZ5ICovKTsKKyAgICAgICAgICAgIHdoaWxlIChtU3RhdGUgPT0gU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSSU5HKSB7CisgICAgICAgICAgICAgICAgbUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAobVN0YXRlID09IFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUkVEKSA/IE9LIDogVU5LTk9XTl9FUlJPUjsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9OwogfQogCiBzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6cHJlcGFyZUFzeW5jKCkgeworICAgIEFMT0dWKCJwcmVwYXJlQXN5bmMoJXApIiwgdGhpcyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIHN3aXRjaCAobVN0YXRlKSB7CkBAIC0xODUsMTIgKzIwOSwyMCBAQAogICAgICAgICAgICAgbUlzQXN5bmNQcmVwYXJlID0gdHJ1ZTsKICAgICAgICAgICAgIG1QbGF5ZXItPnByZXBhcmVBc3luYygpOwogICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRUQ6CisgICAgICAgICAgICAvLyB0aGlzIGlzIHJlYWxseSBqdXN0IHBhdXNlZC4gaGFuZGxlIGFzIHNlZWsgdG8gc3RhcnQKKyAgICAgICAgICAgIG1BdEVPUyA9IGZhbHNlOworICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSSU5HOworICAgICAgICAgICAgbUlzQXN5bmNQcmVwYXJlID0gdHJ1ZTsKKyAgICAgICAgICAgIG1QbGF5ZXItPnNlZWtUb0FzeW5jKDAsIHRydWUgLyogbmVlZE5vdGlmeSAqLyk7CisgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfTsKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OnN0YXJ0KCkgeworICAgIEFMT0dEKCJzdGFydCglcCkiLCB0aGlzKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgc3dpdGNoIChtU3RhdGUpIHsKQEAgLTIxMyw5ICsyNDUsNyBAQAogICAgICAgICAgICAgbVBsYXllci0+c3RhcnQoKTsKIAogICAgICAgICAgICAgaWYgKG1TdGFydHVwU2Vla1RpbWVVcyA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1TdGFydHVwU2Vla1RpbWVVcyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5vdGlmeVNlZWtDb21wbGV0ZSgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKG1TdGFydHVwU2Vla1RpbWVVcyA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgbVBsYXllci0+c2Vla1RvQXN5bmMobVN0YXJ0dXBTZWVrVGltZVVzKTsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTIyNSwxMSArMjU1LDI2IEBACiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIFNUQVRFX1JVTk5JTkc6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtQXRFT1MpIHsKKyAgICAgICAgICAgICAgICBtUGxheWVyLT5zZWVrVG9Bc3luYygwKTsKKyAgICAgICAgICAgICAgICBtQXRFT1MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBtUG9zaXRpb25VcyA9IC0xOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAogICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRDoKKyAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJFRDoKICAgICAgICAgewotICAgICAgICAgICAgbVBsYXllci0+cmVzdW1lKCk7CisgICAgICAgICAgICBpZiAobUF0RU9TKSB7CisgICAgICAgICAgICAgICAgbVBsYXllci0+c2Vla1RvQXN5bmMoMCk7CisgICAgICAgICAgICAgICAgbUF0RU9TID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbVBsYXllci0+cmVzdW1lKCk7CisgICAgICAgICAgICAgICAgbVBvc2l0aW9uVXMgPSAtMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVBsYXllci0+cmVzdW1lKCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0yNDMsNyArMjg4LDMxIEBACiB9CiAKIHN0YXR1c190IE51UGxheWVyRHJpdmVyOjpzdG9wKCkgewotICAgIHJldHVybiBwYXVzZSgpOworICAgIEFMT0dEKCJzdG9wKCVwKSIsIHRoaXMpOworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBzd2l0Y2ggKG1TdGF0ZSkgeworICAgICAgICBjYXNlIFNUQVRFX1JVTk5JTkc6CisgICAgICAgICAgICBtUGxheWVyLT5wYXVzZSgpOworICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisKKyAgICAgICAgY2FzZSBTVEFURV9QQVVTRUQ6CisgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9TVE9QUEVEOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9TVE9QUEVEKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU1RBVEVfUFJFUEFSRUQ6CisgICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRDoKKyAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJJTkc6CisgICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSRUQ6CisgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9TVE9QUEVEOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IE51UGxheWVyRHJpdmVyOjpwYXVzZSgpIHsKQEAgLTI1NSw3ICszMjQsOCBAQAogICAgICAgICAgICAgcmV0dXJuIE9LOwogCiAgICAgICAgIGNhc2UgU1RBVEVfUlVOTklORzoKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX1BBVVNFRCk7CisgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9QQVVTRUQ7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX1BBVVNFRCk7CiAgICAgICAgICAgICBtUGxheWVyLT5wYXVzZSgpOwogICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTI2Myw4ICszMzMsNiBAQAogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIG1TdGF0ZSA9IFNUQVRFX1BBVVNFRDsKLQogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMjczLDYgKzM0MSw3IEBACiB9CiAKIHN0YXR1c190IE51UGxheWVyRHJpdmVyOjpzZWVrVG8oaW50IG1zZWMpIHsKKyAgICBBTE9HRCgic2Vla1RvKCVwKSAlZCBtcyIsIHRoaXMsIG1zZWMpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBpbnQ2NF90IHNlZWtUaW1lVXMgPSBtc2VjICogMTAwMGxsOwpAQCAtMjgxLDYgKzM1MCwxMCBAQAogICAgICAgICBjYXNlIFNUQVRFX1BSRVBBUkVEOgogICAgICAgICB7CiAgICAgICAgICAgICBtU3RhcnR1cFNlZWtUaW1lVXMgPSBzZWVrVGltZVVzOworICAgICAgICAgICAgLy8gcHJldGVuZCB0aGF0IHRoZSBzZWVrIGNvbXBsZXRlZC4gSXQgd2lsbCBhY3R1YWxseSBoYXBwZW4gd2hlbiBzdGFydGluZyBwbGF5YmFjay4KKyAgICAgICAgICAgIC8vIFRPRE86IGFjdHVhbGx5IHBlcmZvcm0gdGhlIHNlZWsgaGVyZSwgc28gdGhlIHBsYXllciBpcyByZWFkeSB0byBnbyBhdCB0aGUgbmV3CisgICAgICAgICAgICAvLyBsb2NhdGlvbgorICAgICAgICAgICAgbm90aWZ5U2Vla0NvbXBsZXRlX2woKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTI4OCw5ICszNjEsMTAgQEAKICAgICAgICAgY2FzZSBTVEFURV9QQVVTRUQ6CiAgICAgICAgIHsKICAgICAgICAgICAgIG1BdEVPUyA9IGZhbHNlOworICAgICAgICAgICAgbVNlZWtJblByb2dyZXNzID0gdHJ1ZTsKICAgICAgICAgICAgIC8vIHNlZWtzIGNhbiB0YWtlIGEgd2hpbGUsIHNvIHdlIGVzc2VudGlhbGx5IHBhdXNlZAotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfUEFVU0VEKTsKLSAgICAgICAgICAgIG1QbGF5ZXItPnNlZWtUb0FzeW5jKHNlZWtUaW1lVXMpOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9QQVVTRUQpOworICAgICAgICAgICAgbVBsYXllci0+c2Vla1RvQXN5bmMoc2Vla1RpbWVVcywgdHJ1ZSAvKiBuZWVkTm90aWZ5ICovKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTI5OCwxOCArMzcyLDI0IEBACiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCisgICAgbVBvc2l0aW9uVXMgPSBzZWVrVGltZVVzOwogICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OmdldEN1cnJlbnRQb3NpdGlvbihpbnQgKm1zZWMpIHsKKyAgICBpbnQ2NF90IHRlbXBVcyA9IDA7CisgICAgc3RhdHVzX3QgcmV0ID0gbVBsYXllci0+Z2V0Q3VycmVudFBvc2l0aW9uKCZ0ZW1wVXMpOworCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtUG9zaXRpb25VcyA8IDApIHsKLSAgICAgICAgKm1zZWMgPSAwOworICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgbVNlZWtJblByb2dyZXNzIGhlcmUgYmVjYXVzZSBtUGxheWVyLT5zZWVrVG9Bc3luYyBpcyBhbiBhc3luYyBjYWxsLCB3aGljaAorICAgIC8vIG1lYW5zIGdldEN1cnJlbnRQb3NpdGlvbiBjYW4gYmUgY2FsbGVkIGJlZm9yZSBzZWVrIGlzIGNvbXBsZXRlZC4gSW93LCByZW5kZXJlciBtYXkgcmV0dXJuIGEKKyAgICAvLyBwb3NpdGlvbiB2YWx1ZSB0aGF0J3MgZGlmZmVyZW50IHRoZSBzZWVrIHRvIHBvc2l0aW9uLgorICAgIGlmIChyZXQgIT0gT0sgfHwgbVNlZWtJblByb2dyZXNzKSB7CisgICAgICAgIHRlbXBVcyA9IChtUG9zaXRpb25VcyA8PSAwKSA/IDAgOiBtUG9zaXRpb25VczsKICAgICB9IGVsc2UgewotICAgICAgICAqbXNlYyA9IChtUG9zaXRpb25VcyArIDUwMGxsKSAvIDEwMDA7CisgICAgICAgIG1Qb3NpdGlvblVzID0gdGVtcFVzOwogICAgIH0KLQorICAgICptc2VjID0gKGludClkaXZSb3VuZCh0ZW1wVXMsIChpbnQ2NF90KSgxMDAwKSk7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0zMjYsNiArNDA2LDcgQEAKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OnJlc2V0KCkgeworICAgIEFMT0dEKCJyZXNldCglcCkiLCB0aGlzKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgc3dpdGNoIChtU3RhdGUpIHsKQEAgLTM0MCw3ICs0MjEsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDSyhtSXNBc3luY1ByZXBhcmUpOwogCi0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9QUkVQQVJFRCk7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX1BSRVBBUkVEKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTM0OCw3ICs0MjksOSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfU1RPUFBFRCk7CisgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9TVE9QUEVEKSB7CisgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfU1RPUFBFRCk7CisgICAgfQogCiAgICAgbVN0YXRlID0gU1RBVEVfUkVTRVRfSU5fUFJPR1JFU1M7CiAgICAgbVBsYXllci0+cmVzZXRBc3luYygpOwpAQCAtMzYwLDEyICs0NDMsMTQgQEAKICAgICBtRHVyYXRpb25VcyA9IC0xOwogICAgIG1Qb3NpdGlvblVzID0gLTE7CiAgICAgbVN0YXJ0dXBTZWVrVGltZVVzID0gLTE7CisgICAgbUxvb3BpbmcgPSBmYWxzZTsKIAogICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OnNldExvb3BpbmcoaW50IGxvb3ApIHsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgbUxvb3BpbmcgPSBsb29wICE9IDA7CisgICAgcmV0dXJuIE9LOwogfQogCiBwbGF5ZXJfdHlwZSBOdVBsYXllckRyaXZlcjo6cGxheWVyVHlwZSgpIHsKQEAgLTQwOSw2ICs0OTQsMTIgQEAKICAgICAgICAgICAgIHJldHVybiBtUGxheWVyLT5zZWxlY3RUcmFjayh0cmFja0luZGV4LCBmYWxzZSAvKiBzZWxlY3QgKi8pOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBJTlZPS0VfSURfR0VUX1NFTEVDVEVEX1RSQUNLOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IHR5cGUgPSByZXF1ZXN0LnJlYWRJbnQzMigpOworICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPmdldFNlbGVjdGVkVHJhY2sodHlwZSwgcmVwbHkpOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtNDE4LDE4ICs1MDksMjAgQEAKIAogdm9pZCBOdVBsYXllckRyaXZlcjo6c2V0QXVkaW9TaW5rKGNvbnN0IHNwPEF1ZGlvU2luaz4gJmF1ZGlvU2luaykgewogICAgIG1QbGF5ZXItPnNldEF1ZGlvU2luayhhdWRpb1NpbmspOworICAgIG1BdWRpb1NpbmsgPSBhdWRpb1Npbms7CiB9CiAKLXN0YXR1c190IE51UGxheWVyRHJpdmVyOjpzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsICZyZXF1ZXN0KSB7CitzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6c2V0UGFyYW1ldGVyKAorICAgICAgICBpbnQgLyoga2V5ICovLCBjb25zdCBQYXJjZWwgJiAvKiByZXF1ZXN0ICovKSB7CiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQogCi1zdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6Z2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCAqcmVwbHkpIHsKK3N0YXR1c190IE51UGxheWVyRHJpdmVyOjpnZXRQYXJhbWV0ZXIoaW50IC8qIGtleSAqLywgUGFyY2VsICogLyogcmVwbHkgKi8pIHsKICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CiAKIHN0YXR1c190IE51UGxheWVyRHJpdmVyOjpnZXRNZXRhZGF0YSgKLSAgICAgICAgY29uc3QgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXImIGlkcywgUGFyY2VsICpyZWNvcmRzKSB7CisgICAgICAgIGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyJiAvKiBpZHMgKi8sIFBhcmNlbCAqcmVjb3JkcykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICB1c2luZyBtZWRpYTo6TWV0YWRhdGE7CkBAIC00NTYsNiArNTQ5LDcgQEAKIH0KIAogdm9pZCBOdVBsYXllckRyaXZlcjo6bm90aWZ5UmVzZXRDb21wbGV0ZSgpIHsKKyAgICBBTE9HRCgibm90aWZ5UmVzZXRDb21wbGV0ZSglcCkiLCB0aGlzKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgQ0hFQ0tfRVEobVN0YXRlLCBTVEFURV9SRVNFVF9JTl9QUk9HUkVTUyk7CkBAIC00NjQsNiArNTU4LDcgQEAKIH0KIAogdm9pZCBOdVBsYXllckRyaXZlcjo6bm90aWZ5U2V0U3VyZmFjZUNvbXBsZXRlKCkgeworICAgIEFMT0dWKCJub3RpZnlTZXRTdXJmYWNlQ29tcGxldGUoJXApIiwgdGhpcyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIENIRUNLKG1TZXRTdXJmYWNlSW5Qcm9ncmVzcyk7CkBAIC00NzcsMzQgKzU3Miw0NSBAQAogICAgIG1EdXJhdGlvblVzID0gZHVyYXRpb25VczsKIH0KIAotdm9pZCBOdVBsYXllckRyaXZlcjo6bm90aWZ5UG9zaXRpb24oaW50NjRfdCBwb3NpdGlvblVzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBtUG9zaXRpb25VcyA9IHBvc2l0aW9uVXM7Ci19Ci0KIHZvaWQgTnVQbGF5ZXJEcml2ZXI6Om5vdGlmeVNlZWtDb21wbGV0ZSgpIHsKLSAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9TRUVLX0NPTVBMRVRFKTsKKyAgICBBTE9HVigibm90aWZ5U2Vla0NvbXBsZXRlKCVwKSIsIHRoaXMpOworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgbVNlZWtJblByb2dyZXNzID0gZmFsc2U7CisgICAgbm90aWZ5U2Vla0NvbXBsZXRlX2woKTsKIH0KIAotdm9pZCBOdVBsYXllckRyaXZlcjo6bm90aWZ5RnJhbWVTdGF0cygKLSAgICAgICAgaW50NjRfdCBudW1GcmFtZXNUb3RhbCwgaW50NjRfdCBudW1GcmFtZXNEcm9wcGVkKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBtTnVtRnJhbWVzVG90YWwgPSBudW1GcmFtZXNUb3RhbDsKLSAgICBtTnVtRnJhbWVzRHJvcHBlZCA9IG51bUZyYW1lc0Ryb3BwZWQ7Cit2b2lkIE51UGxheWVyRHJpdmVyOjpub3RpZnlTZWVrQ29tcGxldGVfbCgpIHsKKyAgICBib29sIHdhc1NlZWtpbmcgPSB0cnVlOworICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSSU5HKSB7CisgICAgICAgIHdhc1NlZWtpbmcgPSBmYWxzZTsKKyAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSRUQ7CisgICAgICAgIG1Db25kaXRpb24uYnJvYWRjYXN0KCk7CisgICAgICAgIGlmICghbUlzQXN5bmNQcmVwYXJlKSB7CisgICAgICAgICAgICAvLyBpZiB3ZSBhcmUgcHJlcGFyaW5nIHN5bmNocm9ub3VzbHksIG5vIG5lZWQgdG8gbm90aWZ5IGxpc3RlbmVyCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBTVEFURV9TVE9QUEVEKSB7CisgICAgICAgIC8vIG5vIG5lZWQgdG8gbm90aWZ5IGxpc3RlbmVyCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbm90aWZ5TGlzdGVuZXJfbCh3YXNTZWVraW5nID8gTUVESUFfU0VFS19DT01QTEVURSA6IE1FRElBX1BSRVBBUkVEKTsKIH0KIAotc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKK3N0YXR1c190IE51UGxheWVyRHJpdmVyOjpkdW1wKAorICAgICAgICBpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJiAvKiBhcmdzICovKSBjb25zdCB7CisgICAgaW50NjRfdCBudW1GcmFtZXNUb3RhbDsKKyAgICBpbnQ2NF90IG51bUZyYW1lc0Ryb3BwZWQ7CisgICAgbVBsYXllci0+Z2V0U3RhdHMoJm51bUZyYW1lc1RvdGFsLCAmbnVtRnJhbWVzRHJvcHBlZCk7CiAKICAgICBGSUxFICpvdXQgPSBmZG9wZW4oZHVwKGZkKSwgInciKTsKIAogICAgIGZwcmludGYob3V0LCAiIE51UGxheWVyXG4iKTsKLSAgICBmcHJpbnRmKG91dCwgIiAgbnVtRnJhbWVzVG90YWwoJWxsZCksIG51bUZyYW1lc0Ryb3BwZWQoJWxsZCksICIKKyAgICBmcHJpbnRmKG91dCwgIiAgbnVtRnJhbWVzVG90YWwoJSIgUFJJZDY0ICIpLCBudW1GcmFtZXNEcm9wcGVkKCUiIFBSSWQ2NCAiKSwgIgogICAgICAgICAgICAgICAgICAicGVyY2VudGFnZURyb3BwZWQoJS4yZilcbiIsCi0gICAgICAgICAgICAgICAgIG1OdW1GcmFtZXNUb3RhbCwKLSAgICAgICAgICAgICAgICAgbU51bUZyYW1lc0Ryb3BwZWQsCi0gICAgICAgICAgICAgICAgIG1OdW1GcmFtZXNUb3RhbCA9PSAwCi0gICAgICAgICAgICAgICAgICAgID8gMC4wIDogKGRvdWJsZSltTnVtRnJhbWVzRHJvcHBlZCAvIG1OdW1GcmFtZXNUb3RhbCk7CisgICAgICAgICAgICAgICAgIG51bUZyYW1lc1RvdGFsLAorICAgICAgICAgICAgICAgICBudW1GcmFtZXNEcm9wcGVkLAorICAgICAgICAgICAgICAgICBudW1GcmFtZXNUb3RhbCA9PSAwCisgICAgICAgICAgICAgICAgICAgID8gMC4wIDogKGRvdWJsZSludW1GcmFtZXNEcm9wcGVkIC8gbnVtRnJhbWVzVG90YWwpOwogCiAgICAgZmNsb3NlKG91dCk7CiAgICAgb3V0ID0gTlVMTDsKQEAgLTUxNCwxMSArNjIwLDQxIEBACiAKIHZvaWQgTnVQbGF5ZXJEcml2ZXI6Om5vdGlmeUxpc3RlbmVyKAogICAgICAgICBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqaW4pIHsKLSAgICBpZiAobXNnID09IE1FRElBX1BMQVlCQUNLX0NPTVBMRVRFIHx8IG1zZyA9PSBNRURJQV9FUlJPUikgewotICAgICAgICBtQXRFT1MgPSB0cnVlOworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgbm90aWZ5TGlzdGVuZXJfbChtc2csIGV4dDEsIGV4dDIsIGluKTsKK30KKwordm9pZCBOdVBsYXllckRyaXZlcjo6bm90aWZ5TGlzdGVuZXJfbCgKKyAgICAgICAgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKmluKSB7CisgICAgc3dpdGNoIChtc2cpIHsKKyAgICAgICAgY2FzZSBNRURJQV9QTEFZQkFDS19DT01QTEVURToKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9SRVNFVF9JTl9QUk9HUkVTUykgeworICAgICAgICAgICAgICAgIGlmIChtTG9vcGluZyB8fCAobUF1dG9Mb29wCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAobUF1ZGlvU2luayA9PSBOVUxMIHx8IG1BdWRpb1NpbmstPnJlYWx0aW1lKCkpKSkgeworICAgICAgICAgICAgICAgICAgICBtUGxheWVyLT5zZWVrVG9Bc3luYygwKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbVBsYXllci0+cGF1c2UoKTsKKyAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9QQVVTRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgTUVESUFfRVJST1I6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1BdEVPUyA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKICAgICB9CiAKKyAgICBtTG9jay51bmxvY2soKTsKICAgICBzZW5kRXZlbnQobXNnLCBleHQxLCBleHQyLCBpbik7CisgICAgbUxvY2subG9jaygpOwogfQogCiB2b2lkIE51UGxheWVyRHJpdmVyOjpub3RpZnlTZXREYXRhU291cmNlQ29tcGxldGVkKHN0YXR1c190IGVycikgewpAQCAtNTQ3LDE1ICs2ODMsMjQgQEAKICAgICBtQXN5bmNSZXN1bHQgPSBlcnI7CiAKICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgIGlmIChtSXNBc3luY1ByZXBhcmUpIHsKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX1BSRVBBUkVEKTsKLSAgICAgICAgfQorICAgICAgICAvLyB1cGRhdGUgc3RhdGUgYmVmb3JlIG5vdGlmeWluZyBjbGllbnQsIHNvIHRoYXQgaWYgY2xpZW50IGNhbGxzIGJhY2sgaW50byBOdVBsYXllckRyaXZlcgorICAgICAgICAvLyBpbiByZXNwb25zZSwgTnVQbGF5ZXJEcml2ZXIgaGFzIHRoZSByaWdodCBzdGF0ZQogICAgICAgICBtU3RhdGUgPSBTVEFURV9QUkVQQVJFRDsKLSAgICB9IGVsc2UgewogICAgICAgICBpZiAobUlzQXN5bmNQcmVwYXJlKSB7Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9FUlJPUiwgTUVESUFfRVJST1JfVU5LTk9XTiwgZXJyKTsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfUFJFUEFSRUQpOwogICAgICAgICB9CisgICAgfSBlbHNlIHsKICAgICAgICAgbVN0YXRlID0gU1RBVEVfVU5QUkVQQVJFRDsKKyAgICAgICAgaWYgKG1Jc0FzeW5jUHJlcGFyZSkgeworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9FUlJPUiwgTUVESUFfRVJST1JfVU5LTk9XTiwgZXJyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbVBsYXllci0+Z2V0RmlsZU1ldGEoKTsKKyAgICBpbnQzMl90IGxvb3A7CisgICAgaWYgKG1ldGEgIT0gTlVMTAorICAgICAgICAgICAgJiYgbWV0YS0+ZmluZEludDMyKGtLZXlBdXRvTG9vcCwgJmxvb3ApICYmIGxvb3AgIT0gMCkgeworICAgICAgICBtQXV0b0xvb3AgPSB0cnVlOwogICAgIH0KIAogICAgIG1Db25kaXRpb24uYnJvYWRjYXN0KCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5oCmluZGV4IDk5ZjcyYTYuLjVjYmE3ZDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5oCkBAIC0zMSw3ICszMSw5IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRVSUQodWlkX3QgdWlkKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZSgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOworICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CiAKQEAgLTY2LDkgKzY4LDggQEAKICAgICB2b2lkIG5vdGlmeVJlc2V0Q29tcGxldGUoKTsKICAgICB2b2lkIG5vdGlmeVNldFN1cmZhY2VDb21wbGV0ZSgpOwogICAgIHZvaWQgbm90aWZ5RHVyYXRpb24oaW50NjRfdCBkdXJhdGlvblVzKTsKLSAgICB2b2lkIG5vdGlmeVBvc2l0aW9uKGludDY0X3QgcG9zaXRpb25Vcyk7CiAgICAgdm9pZCBub3RpZnlTZWVrQ29tcGxldGUoKTsKLSAgICB2b2lkIG5vdGlmeUZyYW1lU3RhdHMoaW50NjRfdCBudW1GcmFtZXNUb3RhbCwgaW50NjRfdCBudW1GcmFtZXNEcm9wcGVkKTsKKyAgICB2b2lkIG5vdGlmeVNlZWtDb21wbGV0ZV9sKCk7CiAgICAgdm9pZCBub3RpZnlMaXN0ZW5lcihpbnQgbXNnLCBpbnQgZXh0MSA9IDAsIGludCBleHQyID0gMCwgY29uc3QgUGFyY2VsICppbiA9IE5VTEwpOwogICAgIHZvaWQgbm90aWZ5RmxhZ3NDaGFuZ2VkKHVpbnQzMl90IGZsYWdzKTsKIApAQCAtODUsNiArODYsOSBAQAogICAgICAgICBTVEFURV9SVU5OSU5HLAogICAgICAgICBTVEFURV9QQVVTRUQsCiAgICAgICAgIFNUQVRFX1JFU0VUX0lOX1BST0dSRVNTLAorICAgICAgICBTVEFURV9TVE9QUEVELCAgICAgICAgICAgICAgICAgIC8vIGVxdWl2YWxlbnQgdG8gUEFVU0VECisgICAgICAgIFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUklORywgICAgLy8gZXF1aXZhbGVudCB0byBQQVVTRUQsIGJ1dCBzZWVraW5nCisgICAgICAgIFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUkVELCAgICAgLy8gZXF1aXZhbGVudCB0byBQQVVTRUQsIGJ1dCBzZWVrIGNvbXBsZXRlCiAgICAgfTsKIAogICAgIG11dGFibGUgTXV0ZXggbUxvY2s7CkBAIC0xMDAsMTkgKzEwNCwyMiBAQAogICAgIGJvb2wgbVNldFN1cmZhY2VJblByb2dyZXNzOwogICAgIGludDY0X3QgbUR1cmF0aW9uVXM7CiAgICAgaW50NjRfdCBtUG9zaXRpb25VczsKLSAgICBpbnQ2NF90IG1OdW1GcmFtZXNUb3RhbDsKLSAgICBpbnQ2NF90IG1OdW1GcmFtZXNEcm9wcGVkOworICAgIGJvb2wgbVNlZWtJblByb2dyZXNzOwogICAgIC8vIDw8PAogCiAgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKICAgICBzcDxOdVBsYXllcj4gbVBsYXllcjsKKyAgICBzcDxBdWRpb1Npbms+IG1BdWRpb1Npbms7CiAgICAgdWludDMyX3QgbVBsYXllckZsYWdzOwogCiAgICAgYm9vbCBtQXRFT1M7CisgICAgYm9vbCBtTG9vcGluZzsKKyAgICBib29sIG1BdXRvTG9vcDsKIAogICAgIGludDY0X3QgbVN0YXJ0dXBTZWVrVGltZVVzOwogCiAgICAgc3RhdHVzX3QgcHJlcGFyZV9sKCk7CisgICAgdm9pZCBub3RpZnlMaXN0ZW5lcl9sKGludCBtc2csIGludCBleHQxID0gMCwgaW50IGV4dDIgPSAwLCBjb25zdCBQYXJjZWwgKmluID0gTlVMTCk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhOdVBsYXllckRyaXZlcik7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwCmluZGV4IGJmNTI3MWUuLjg2Y2UzODUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAKQEAgLTIwLDIzICsyMCw0NCBAQAogCiAjaW5jbHVkZSAiTnVQbGF5ZXJSZW5kZXJlci5oIgogCi0jaW5jbHVkZSAiU29mdHdhcmVSZW5kZXJlci5oIgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorCisjaW5jbHVkZSA8VmlkZW9GcmFtZVNjaGVkdWxlci5oPgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCisvLyBNYXhpbXVtIHRpbWUgaW4gcGF1c2VkIHN0YXRlIHdoZW4gb2ZmbG9hZGluZyBhdWRpbyBkZWNvbXByZXNzaW9uLiBXaGVuIGVsYXBzZWQsIHRoZSBBdWRpb1NpbmsKKy8vIGlzIGNsb3NlZCB0byBhbGxvdyB0aGUgYXVkaW8gRFNQIHRvIHBvd2VyIGRvd24uCitzdGF0aWMgY29uc3QgaW50NjRfdCBrT2ZmbG9hZFBhdXNlTWF4VXMgPSA2MDAwMDAwMGxsOworCiAvLyBzdGF0aWMKIGNvbnN0IGludDY0X3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjprTWluUG9zaXRpb25VcGRhdGVEZWxheVVzID0gMTAwMDAwbGw7CiAKK3N0YXRpYyBib29sIHNGcmFtZUFjY3VyYXRlQVZzeW5jID0gZmFsc2U7CisKK3N0YXRpYyB2b2lkIHJlYWRQcm9wZXJ0aWVzKCkgeworICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBpZiAocHJvcGVydHlfZ2V0KCJwZXJzaXN0LnN5cy5tZWRpYS5hdnN5bmMiLCB2YWx1ZSwgTlVMTCkpIHsKKyAgICAgICAgc0ZyYW1lQWNjdXJhdGVBVnN5bmMgPQorICAgICAgICAgICAgIXN0cmNtcCgiMSIsIHZhbHVlKSB8fCAhc3RyY2FzZWNtcCgidHJ1ZSIsIHZhbHVlKTsKKyAgICB9Cit9CisKIE51UGxheWVyOjpSZW5kZXJlcjo6UmVuZGVyZXIoCiAgICAgICAgIGNvbnN0IHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiAmc2luaywKICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCiAgICAgICAgIHVpbnQzMl90IGZsYWdzKQogICAgIDogbUF1ZGlvU2luayhzaW5rKSwKLSAgICAgIG1Tb2Z0UmVuZGVyZXIoTlVMTCksCiAgICAgICBtTm90aWZ5KG5vdGlmeSksCiAgICAgICBtRmxhZ3MoZmxhZ3MpLAogICAgICAgbU51bUZyYW1lc1dyaXR0ZW4oMCksCkBAIC00NCwyOCArNjUsMzcgQEAKICAgICAgIG1EcmFpblZpZGVvUXVldWVQZW5kaW5nKGZhbHNlKSwKICAgICAgIG1BdWRpb1F1ZXVlR2VuZXJhdGlvbigwKSwKICAgICAgIG1WaWRlb1F1ZXVlR2VuZXJhdGlvbigwKSwKKyAgICAgIG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXMoLTEpLAogICAgICAgbUFuY2hvclRpbWVNZWRpYVVzKC0xKSwKICAgICAgIG1BbmNob3JUaW1lUmVhbFVzKC0xKSwKLSAgICAgIG1GbHVzaGluZ0F1ZGlvKGZhbHNlKSwKLSAgICAgIG1GbHVzaGluZ1ZpZGVvKGZhbHNlKSwKKyAgICAgIG1BbmNob3JOdW1GcmFtZXNXcml0dGVuKC0xKSwKKyAgICAgIG1BbmNob3JNYXhNZWRpYVVzKC0xKSwKKyAgICAgIG1WaWRlb0xhdGVCeVVzKDBsbCksCiAgICAgICBtSGFzQXVkaW8oZmFsc2UpLAogICAgICAgbUhhc1ZpZGVvKGZhbHNlKSwKKyAgICAgIG1QYXVzZVN0YXJ0ZWRUaW1lUmVhbFVzKC0xKSwKKyAgICAgIG1GbHVzaGluZ0F1ZGlvKGZhbHNlKSwKKyAgICAgIG1GbHVzaGluZ1ZpZGVvKGZhbHNlKSwKICAgICAgIG1TeW5jUXVldWVzKGZhbHNlKSwKICAgICAgIG1QYXVzZWQoZmFsc2UpLAorICAgICAgbVZpZGVvU2FtcGxlUmVjZWl2ZWQoZmFsc2UpLAogICAgICAgbVZpZGVvUmVuZGVyaW5nU3RhcnRlZChmYWxzZSksCiAgICAgICBtVmlkZW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb24oMCksCiAgICAgICBtQXVkaW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb24oMCksCi0gICAgICBtTGFzdFBvc2l0aW9uVXBkYXRlVXMoLTFsbCksCi0gICAgICBtVmlkZW9MYXRlQnlVcygwbGwpIHsKKyAgICAgIG1BdWRpb09mZmxvYWRQYXVzZVRpbWVvdXRHZW5lcmF0aW9uKDApLAorICAgICAgbUF1ZGlvT2ZmbG9hZFRvcm5Eb3duKGZhbHNlKSwKKyAgICAgIG1DdXJyZW50T2ZmbG9hZEluZm8oQVVESU9fSU5GT19JTklUSUFMSVpFUiksCisgICAgICBtVG90YWxCdWZmZXJzUXVldWVkKDApLAorICAgICAgbUxhc3RBdWRpb0J1ZmZlckRyYWluZWQoMCkgeworICAgIHJlYWRQcm9wZXJ0aWVzKCk7CiB9CiAKIE51UGxheWVyOjpSZW5kZXJlcjo6flJlbmRlcmVyKCkgewotICAgIGRlbGV0ZSBtU29mdFJlbmRlcmVyOwotfQotCi12b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6c2V0U29mdFJlbmRlcmVyKFNvZnR3YXJlUmVuZGVyZXIgKnNvZnRSZW5kZXJlcikgewotICAgIGRlbGV0ZSBtU29mdFJlbmRlcmVyOwotICAgIG1Tb2Z0UmVuZGVyZXIgPSBzb2Z0UmVuZGVyZXI7CisgICAgaWYgKG9mZmxvYWRpbmdBdWRpbygpKSB7CisgICAgICAgIG1BdWRpb1NpbmstPnN0b3AoKTsKKyAgICAgICAgbUF1ZGlvU2luay0+Zmx1c2goKTsKKyAgICAgICAgbUF1ZGlvU2luay0+Y2xvc2UoKTsKKyAgICB9CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpxdWV1ZUJ1ZmZlcigKQEAgLTkyLDEwICsxMjIsMTQgQEAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtRmx1c2hMb2NrKTsKICAgICAgICAgaWYgKGF1ZGlvKSB7Ci0gICAgICAgICAgICBDSEVDSyghbUZsdXNoaW5nQXVkaW8pOworICAgICAgICAgICAgaWYgKG1GbHVzaGluZ0F1ZGlvKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbUZsdXNoaW5nQXVkaW8gPSB0cnVlOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ0hFQ0soIW1GbHVzaGluZ1ZpZGVvKTsKKyAgICAgICAgICAgIGlmIChtRmx1c2hpbmdWaWRlbykgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1GbHVzaGluZ1ZpZGVvID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KQEAgLTEwNiwxMyArMTQwLDIzIEBACiB9CiAKIHZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpzaWduYWxUaW1lRGlzY29udGludWl0eSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIC8vIENIRUNLKG1BdWRpb1F1ZXVlLmVtcHR5KCkpOwogICAgIC8vIENIRUNLKG1WaWRlb1F1ZXVlLmVtcHR5KCkpOwotICAgIG1BbmNob3JUaW1lTWVkaWFVcyA9IC0xOwotICAgIG1BbmNob3JUaW1lUmVhbFVzID0gLTE7CisgICAgc2V0QXVkaW9GaXJzdEFuY2hvclRpbWUoLTEpOworICAgIHNldEFuY2hvclRpbWUoLTEsIC0xKTsKKyAgICBzZXRWaWRlb0xhdGVCeVVzKDApOwogICAgIG1TeW5jUXVldWVzID0gZmFsc2U7CiB9CiAKK3ZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpzaWduYWxBdWRpb1NpbmtDaGFuZ2VkKCkgeworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRBdWRpb1NpbmtDaGFuZ2VkLCBpZCgpKSktPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnNpZ25hbERpc2FibGVPZmZsb2FkQXVkaW8oKSB7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdERpc2FibGVPZmZsb2FkQXVkaW8sIGlkKCkpKS0+cG9zdCgpOworfQorCiB2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6cGF1c2UoKSB7CiAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFBhdXNlLCBpZCgpKSktPnBvc3QoKTsKIH0KQEAgLTEyMSw4ICsxNjUsMTY4IEBACiAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlc3VtZSwgaWQoKSkpLT5wb3N0KCk7CiB9CiAKK3ZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpzZXRWaWRlb0ZyYW1lUmF0ZShmbG9hdCBmcHMpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0VmlkZW9GcmFtZVJhdGUsIGlkKCkpOworICAgIG1zZy0+c2V0RmxvYXQoImZyYW1lLXJhdGUiLCBmcHMpOworICAgIG1zZy0+cG9zdCgpOworfQorCitzdGF0dXNfdCBOdVBsYXllcjo6UmVuZGVyZXI6OmdldEN1cnJlbnRQb3NpdGlvbihpbnQ2NF90ICptZWRpYVVzKSB7CisgICAgcmV0dXJuIGdldEN1cnJlbnRQb3NpdGlvbihtZWRpYVVzLCBBTG9vcGVyOjpHZXROb3dVcygpKTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjpnZXRDdXJyZW50UG9zaXRpb24oCisgICAgICAgIGludDY0X3QgKm1lZGlhVXMsIGludDY0X3Qgbm93VXMsIGJvb2wgYWxsb3dQYXN0UXVldWVkVmlkZW8pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVRpbWVMb2NrKTsKKyAgICBpZiAoIW1IYXNBdWRpbyAmJiAhbUhhc1ZpZGVvKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIGlmIChtQW5jaG9yVGltZU1lZGlhVXMgPCAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIGludDY0X3QgcG9zaXRpb25VcyA9IChub3dVcyAtIG1BbmNob3JUaW1lUmVhbFVzKSArIG1BbmNob3JUaW1lTWVkaWFVczsKKworICAgIGlmIChtUGF1c2VTdGFydGVkVGltZVJlYWxVcyAhPSAtMSkgeworICAgICAgICBwb3NpdGlvblVzIC09IChub3dVcyAtIG1QYXVzZVN0YXJ0ZWRUaW1lUmVhbFVzKTsKKyAgICB9CisKKyAgICAvLyBsaW1pdCBwb3NpdGlvbiB0byB0aGUgbGFzdCBxdWV1ZWQgbWVkaWEgdGltZSAoZm9yIHZpZGVvIG9ubHkgc3RyZWFtCisgICAgLy8gcG9zaXRpb24gd2lsbCBiZSBkaXNjcmV0ZSBhcyB3ZSBkb24ndCBrbm93IGhvdyBsb25nIGVhY2ggZnJhbWUgbGFzdHMpCisgICAgaWYgKG1BbmNob3JNYXhNZWRpYVVzID49IDAgJiYgIWFsbG93UGFzdFF1ZXVlZFZpZGVvKSB7CisgICAgICAgIGlmIChwb3NpdGlvblVzID4gbUFuY2hvck1heE1lZGlhVXMpIHsKKyAgICAgICAgICAgIHBvc2l0aW9uVXMgPSBtQW5jaG9yTWF4TWVkaWFVczsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwb3NpdGlvblVzIDwgbUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcykgeworICAgICAgICBwb3NpdGlvblVzID0gbUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVczsKKyAgICB9CisKKyAgICAqbWVkaWFVcyA9IChwb3NpdGlvblVzIDw9IDApID8gMCA6IHBvc2l0aW9uVXM7CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6c2V0SGFzTWVkaWEoYm9vbCBhdWRpbykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtVGltZUxvY2spOworICAgIGlmIChhdWRpbykgeworICAgICAgICBtSGFzQXVkaW8gPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIG1IYXNWaWRlbyA9IHRydWU7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6c2V0QXVkaW9GaXJzdEFuY2hvclRpbWUoaW50NjRfdCBtZWRpYVVzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1UaW1lTG9jayk7CisgICAgbUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcyA9IG1lZGlhVXM7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpzZXRBdWRpb0ZpcnN0QW5jaG9yVGltZUlmTmVlZGVkKGludDY0X3QgbWVkaWFVcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtVGltZUxvY2spOworICAgIGlmIChtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzID09IC0xKSB7CisgICAgICAgIG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXMgPSBtZWRpYVVzOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnNldEFuY2hvclRpbWUoCisgICAgICAgIGludDY0X3QgbWVkaWFVcywgaW50NjRfdCByZWFsVXMsIGludDY0X3QgbnVtRnJhbWVzV3JpdHRlbiwgYm9vbCByZXN1bWUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVRpbWVMb2NrKTsKKyAgICBtQW5jaG9yVGltZU1lZGlhVXMgPSBtZWRpYVVzOworICAgIG1BbmNob3JUaW1lUmVhbFVzID0gcmVhbFVzOworICAgIG1BbmNob3JOdW1GcmFtZXNXcml0dGVuID0gbnVtRnJhbWVzV3JpdHRlbjsKKyAgICBpZiAocmVzdW1lKSB7CisgICAgICAgIG1QYXVzZVN0YXJ0ZWRUaW1lUmVhbFVzID0gLTE7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6c2V0VmlkZW9MYXRlQnlVcyhpbnQ2NF90IGxhdGVVcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtVGltZUxvY2spOworICAgIG1WaWRlb0xhdGVCeVVzID0gbGF0ZVVzOworfQorCitpbnQ2NF90IE51UGxheWVyOjpSZW5kZXJlcjo6Z2V0VmlkZW9MYXRlQnlVcygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVRpbWVMb2NrKTsKKyAgICByZXR1cm4gbVZpZGVvTGF0ZUJ5VXM7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpzZXRQYXVzZVN0YXJ0ZWRUaW1lUmVhbFVzKGludDY0X3QgcmVhbFVzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1UaW1lTG9jayk7CisgICAgbVBhdXNlU3RhcnRlZFRpbWVSZWFsVXMgPSByZWFsVXM7Cit9CisKK2Jvb2wgTnVQbGF5ZXI6OlJlbmRlcmVyOjpvcGVuQXVkaW9TaW5rKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgYm9vbCBvZmZsb2FkT25seSwKKyAgICAgICAgYm9vbCBoYXNWaWRlbywKKyAgICAgICAgdWludDMyX3QgZmxhZ3MpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0T3BlbkF1ZGlvU2luaywgaWQoKSk7CisgICAgbXNnLT5zZXRNZXNzYWdlKCJmb3JtYXQiLCBmb3JtYXQpOworICAgIG1zZy0+c2V0SW50MzIoIm9mZmxvYWQtb25seSIsIG9mZmxvYWRPbmx5KTsKKyAgICBtc2ctPnNldEludDMyKCJoYXMtdmlkZW8iLCBoYXNWaWRlbyk7CisgICAgbXNnLT5zZXRJbnQzMigiZmxhZ3MiLCBmbGFncyk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworCisgICAgaW50MzJfdCBvZmZsb2FkOworICAgIENIRUNLKHJlc3BvbnNlLT5maW5kSW50MzIoIm9mZmxvYWQiLCAmb2ZmbG9hZCkpOworICAgIHJldHVybiAob2ZmbG9hZCAhPSAwKTsKK30KKwordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OmNsb3NlQXVkaW9TaW5rKCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDbG9zZUF1ZGlvU2luaywgaWQoKSk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworfQorCiB2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRPcGVuQXVkaW9TaW5rOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgiZm9ybWF0IiwgJmZvcm1hdCkpOworCisgICAgICAgICAgICBpbnQzMl90IG9mZmxvYWRPbmx5OworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoIm9mZmxvYWQtb25seSIsICZvZmZsb2FkT25seSkpOworCisgICAgICAgICAgICBpbnQzMl90IGhhc1ZpZGVvOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImhhcy12aWRlbyIsICZoYXNWaWRlbykpOworCisgICAgICAgICAgICB1aW50MzJfdCBmbGFnczsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJmbGFncyIsIChpbnQzMl90ICopJmZsYWdzKSk7CisKKyAgICAgICAgICAgIGJvb2wgb2ZmbG9hZCA9IG9uT3BlbkF1ZGlvU2luayhmb3JtYXQsIG9mZmxvYWRPbmx5LCBoYXNWaWRlbywgZmxhZ3MpOworCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoIm9mZmxvYWQiLCBvZmZsb2FkKTsKKworICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdENsb3NlQXVkaW9TaW5rOgorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworCisgICAgICAgICAgICBvbkNsb3NlQXVkaW9TaW5rKCk7CisKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRTdG9wQXVkaW9TaW5rOgorICAgICAgICB7CisgICAgICAgICAgICBtQXVkaW9TaW5rLT5zdG9wKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2Uga1doYXREcmFpbkF1ZGlvUXVldWU6CiAgICAgICAgIHsKICAgICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKQEAgLTE0OSw3ICszNTMsMTAgQEAKIAogICAgICAgICAgICAgICAgIC8vIExldCdzIGdpdmUgaXQgbW9yZSBkYXRhIGFmdGVyIGFib3V0IGhhbGYgdGhhdCB0aW1lCiAgICAgICAgICAgICAgICAgLy8gaGFzIGVsYXBzZWQuCi0gICAgICAgICAgICAgICAgcG9zdERyYWluQXVkaW9RdWV1ZShkZWxheVVzIC8gMik7CisgICAgICAgICAgICAgICAgLy8ga1doYXREcmFpbkF1ZGlvUXVldWUgaXMgdXNlZCBmb3Igbm9uLW9mZmxvYWRpbmcgbW9kZSwKKyAgICAgICAgICAgICAgICAvLyBhbmQgbUxvY2sgaXMgdXNlZCBvbmx5IGZvciBvZmZsb2FkaW5nIG1vZGUuIFRoZXJlZm9yZSwKKyAgICAgICAgICAgICAgICAvLyBubyBuZWVkIHRvIGFjcXVpcmUgbUxvY2sgaGVyZS4KKyAgICAgICAgICAgICAgICBwb3N0RHJhaW5BdWRpb1F1ZXVlX2woZGVsYXlVcyAvIDIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTE3MCw2ICszNzcsMTkgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBrV2hhdFBvc3REcmFpblZpZGVvUXVldWU6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKKyAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9IG1WaWRlb1F1ZXVlR2VuZXJhdGlvbikgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtRHJhaW5WaWRlb1F1ZXVlUGVuZGluZyA9IGZhbHNlOworICAgICAgICAgICAgcG9zdERyYWluVmlkZW9RdWV1ZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIGtXaGF0UXVldWVCdWZmZXI6CiAgICAgICAgIHsKICAgICAgICAgICAgIG9uUXVldWVCdWZmZXIobXNnKTsKQEAgLTE5NCw2ICs0MTQsMTIgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBrV2hhdERpc2FibGVPZmZsb2FkQXVkaW86CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uRGlzYWJsZU9mZmxvYWRBdWRpbygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIGtXaGF0UGF1c2U6CiAgICAgICAgIHsKICAgICAgICAgICAgIG9uUGF1c2UoKTsKQEAgLTIwNiwxNCArNDMyLDQxIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2Uga1doYXRTZXRWaWRlb0ZyYW1lUmF0ZToKKyAgICAgICAgeworICAgICAgICAgICAgZmxvYXQgZnBzOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kRmxvYXQoImZyYW1lLXJhdGUiLCAmZnBzKSk7CisgICAgICAgICAgICBvblNldFZpZGVvRnJhbWVSYXRlKGZwcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRBdWRpb09mZmxvYWRUZWFyRG93bjoKKyAgICAgICAgeworICAgICAgICAgICAgb25BdWRpb09mZmxvYWRUZWFyRG93bihrRHVlVG9FcnJvcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRBdWRpb09mZmxvYWRQYXVzZVRpbWVvdXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKKyAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9IG1BdWRpb09mZmxvYWRQYXVzZVRpbWVvdXRHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigiQXVkaW8gT2ZmbG9hZCB0ZWFyIGRvd24gZHVlIHRvIHBhdXNlIHRpbWVvdXQuIik7CisgICAgICAgICAgICBvbkF1ZGlvT2ZmbG9hZFRlYXJEb3duKGtEdWVUb1RpbWVvdXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgVFJFU1BBU1MoKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIH0KIAotdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnBvc3REcmFpbkF1ZGlvUXVldWUoaW50NjRfdCBkZWxheVVzKSB7Ci0gICAgaWYgKG1EcmFpbkF1ZGlvUXVldWVQZW5kaW5nIHx8IG1TeW5jUXVldWVzIHx8IG1QYXVzZWQpIHsKK3ZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpwb3N0RHJhaW5BdWRpb1F1ZXVlX2woaW50NjRfdCBkZWxheVVzKSB7CisgICAgaWYgKG1EcmFpbkF1ZGlvUXVldWVQZW5kaW5nIHx8IG1TeW5jUXVldWVzIHx8IG1QYXVzZWQKKyAgICAgICAgICAgIHx8IG9mZmxvYWRpbmdBdWRpbygpKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTIyNywxMCArNDgwLDYgQEAKICAgICBtc2ctPnBvc3QoZGVsYXlVcyk7CiB9CiAKLXZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpzaWduYWxBdWRpb1NpbmtDaGFuZ2VkKCkgewotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRBdWRpb1NpbmtDaGFuZ2VkLCBpZCgpKSktPnBvc3QoKTsKLX0KLQogdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnByZXBhcmVGb3JNZWRpYVJlbmRlcmluZ1N0YXJ0KCkgewogICAgIG1BdWRpb1JlbmRlcmluZ1N0YXJ0R2VuZXJhdGlvbiA9IG1BdWRpb1F1ZXVlR2VuZXJhdGlvbjsKICAgICBtVmlkZW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb24gPSBtVmlkZW9RdWV1ZUdlbmVyYXRpb247CkBAIC0yNDgsNiArNDk3LDEwMiBAQAogICAgIH0KIH0KIAorLy8gc3RhdGljCitzaXplX3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjpBdWRpb1NpbmtDYWxsYmFjaygKKyAgICAgICAgTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1NpbmsgKiAvKiBhdWRpb1NpbmsgKi8sCisgICAgICAgIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgIHZvaWQgKmNvb2tpZSwKKyAgICAgICAgTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms6OmNiX2V2ZW50X3QgZXZlbnQpIHsKKyAgICBOdVBsYXllcjo6UmVuZGVyZXIgKm1lID0gKE51UGxheWVyOjpSZW5kZXJlciAqKWNvb2tpZTsKKworICAgIHN3aXRjaCAoZXZlbnQpIHsKKyAgICAgICAgY2FzZSBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luazo6Q0JfRVZFTlRfRklMTF9CVUZGRVI6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtZS0+ZmlsbEF1ZGlvQnVmZmVyKGJ1ZmZlciwgc2l6ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms6OkNCX0VWRU5UX1NUUkVBTV9FTkQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1lLT5ub3RpZnlFT1ModHJ1ZSAvKiBhdWRpbyAqLywgRVJST1JfRU5EX09GX1NUUkVBTSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms6OkNCX0VWRU5UX1RFQVJfRE9XTjoKKyAgICAgICAgeworICAgICAgICAgICAgbWUtPm5vdGlmeUF1ZGlvT2ZmbG9hZFRlYXJEb3duKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzaXplX3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjpmaWxsQXVkaW9CdWZmZXIodm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAoIW9mZmxvYWRpbmdBdWRpbygpIHx8IG1QYXVzZWQpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgYm9vbCBoYXNFT1MgPSBmYWxzZTsKKworICAgIHNpemVfdCBzaXplQ29waWVkID0gMDsKKyAgICBib29sIGZpcnN0RW50cnkgPSB0cnVlOworICAgIHdoaWxlIChzaXplQ29waWVkIDwgc2l6ZSAmJiAhbUF1ZGlvUXVldWUuZW1wdHkoKSkgeworICAgICAgICBRdWV1ZUVudHJ5ICplbnRyeSA9ICYqbUF1ZGlvUXVldWUuYmVnaW4oKTsKKworICAgICAgICBpZiAoZW50cnktPm1CdWZmZXIgPT0gTlVMTCkgeyAvLyBFT1MKKyAgICAgICAgICAgIGhhc0VPUyA9IHRydWU7CisgICAgICAgICAgICBtQXVkaW9RdWV1ZS5lcmFzZShtQXVkaW9RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgIGVudHJ5ID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZpcnN0RW50cnkgJiYgZW50cnktPm1PZmZzZXQgPT0gMCkgeworICAgICAgICAgICAgZmlyc3RFbnRyeSA9IGZhbHNlOworICAgICAgICAgICAgaW50NjRfdCBtZWRpYVRpbWVVczsKKyAgICAgICAgICAgIENIRUNLKGVudHJ5LT5tQnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJm1lZGlhVGltZVVzKSk7CisgICAgICAgICAgICBBTE9HVigicmVuZGVyaW5nIGF1ZGlvIGF0IG1lZGlhIHRpbWUgJS4yZiBzZWNzIiwgbWVkaWFUaW1lVXMgLyAxRTYpOworICAgICAgICAgICAgc2V0QXVkaW9GaXJzdEFuY2hvclRpbWVJZk5lZWRlZChtZWRpYVRpbWVVcyk7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgY29weSA9IGVudHJ5LT5tQnVmZmVyLT5zaXplKCkgLSBlbnRyeS0+bU9mZnNldDsKKyAgICAgICAgc2l6ZV90IHNpemVSZW1haW5pbmcgPSBzaXplIC0gc2l6ZUNvcGllZDsKKyAgICAgICAgaWYgKGNvcHkgPiBzaXplUmVtYWluaW5nKSB7CisgICAgICAgICAgICBjb3B5ID0gc2l6ZVJlbWFpbmluZzsKKyAgICAgICAgfQorCisgICAgICAgIG1lbWNweSgoY2hhciAqKWJ1ZmZlciArIHNpemVDb3BpZWQsCisgICAgICAgICAgICAgICBlbnRyeS0+bUJ1ZmZlci0+ZGF0YSgpICsgZW50cnktPm1PZmZzZXQsCisgICAgICAgICAgICAgICBjb3B5KTsKKworICAgICAgICBlbnRyeS0+bU9mZnNldCArPSBjb3B5OworICAgICAgICBpZiAoZW50cnktPm1PZmZzZXQgPT0gZW50cnktPm1CdWZmZXItPnNpemUoKSkgeworICAgICAgICAgICAgZW50cnktPm1Ob3RpZnlDb25zdW1lZC0+cG9zdCgpOworICAgICAgICAgICAgbUF1ZGlvUXVldWUuZXJhc2UobUF1ZGlvUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICBlbnRyeSA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgc2l6ZUNvcGllZCArPSBjb3B5OworICAgICAgICBub3RpZnlJZk1lZGlhUmVuZGVyaW5nU3RhcnRlZCgpOworICAgIH0KKworICAgIGlmIChtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzID49IDApIHsKKyAgICAgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgICAgIHNldEFuY2hvclRpbWUobUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcywgbm93VXMgLSBnZXRQbGF5ZWRPdXRBdWRpb0R1cmF0aW9uVXMobm93VXMpKTsKKyAgICB9CisKKyAgICAvLyB3ZSBkb24ndCBrbm93IGhvdyBtdWNoIGRhdGEgd2UgYXJlIHF1ZXVlaW5nIGZvciBvZmZsb2FkZWQgdHJhY2tzCisgICAgbUFuY2hvck1heE1lZGlhVXMgPSAtMTsKKworICAgIGlmIChoYXNFT1MpIHsKKyAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFN0b3BBdWRpb1NpbmssIGlkKCkpKS0+cG9zdCgpOworICAgIH0KKworICAgIHJldHVybiBzaXplQ29waWVkOworfQorCiBib29sIE51UGxheWVyOjpSZW5kZXJlcjo6b25EcmFpbkF1ZGlvUXVldWUoKSB7CiAgICAgdWludDMyX3QgbnVtRnJhbWVzUGxheWVkOwogICAgIGlmIChtQXVkaW9TaW5rLT5nZXRQb3NpdGlvbigmbnVtRnJhbWVzUGxheWVkKSAhPSBPSykgewpAQCAtMjcyLDEwICs2MTcsMTUgQEAKICAgICB3aGlsZSAobnVtQnl0ZXNBdmFpbGFibGVUb1dyaXRlID4gMCAmJiAhbUF1ZGlvUXVldWUuZW1wdHkoKSkgewogICAgICAgICBRdWV1ZUVudHJ5ICplbnRyeSA9ICYqbUF1ZGlvUXVldWUuYmVnaW4oKTsKIAorICAgICAgICBtTGFzdEF1ZGlvQnVmZmVyRHJhaW5lZCA9IGVudHJ5LT5tQnVmZmVyT3JkaW5hbDsKKwogICAgICAgICBpZiAoZW50cnktPm1CdWZmZXIgPT0gTlVMTCkgewogICAgICAgICAgICAgLy8gRU9TCi0KLSAgICAgICAgICAgIG5vdGlmeUVPUyh0cnVlIC8qIGF1ZGlvICovLCBlbnRyeS0+bUZpbmFsUmVzdWx0KTsKKyAgICAgICAgICAgIGludDY0X3QgcG9zdEVPU0RlbGF5VXMgPSAwOworICAgICAgICAgICAgaWYgKG1BdWRpb1NpbmstPm5lZWRzVHJhaWxpbmdQYWRkaW5nKCkpIHsKKyAgICAgICAgICAgICAgICBwb3N0RU9TRGVsYXlVcyA9IGdldFBlbmRpbmdBdWRpb1BsYXlvdXREdXJhdGlvblVzKEFMb29wZXI6OkdldE5vd1VzKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm90aWZ5RU9TKHRydWUgLyogYXVkaW8gKi8sIGVudHJ5LT5tRmluYWxSZXN1bHQsIHBvc3RFT1NEZWxheVVzKTsKIAogICAgICAgICAgICAgbUF1ZGlvUXVldWUuZXJhc2UobUF1ZGlvUXVldWUuYmVnaW4oKSk7CiAgICAgICAgICAgICBlbnRyeSA9IE5VTEw7CkBAIC0yODUsMjYgKzYzNSw4IEBACiAgICAgICAgIGlmIChlbnRyeS0+bU9mZnNldCA9PSAwKSB7CiAgICAgICAgICAgICBpbnQ2NF90IG1lZGlhVGltZVVzOwogICAgICAgICAgICAgQ0hFQ0soZW50cnktPm1CdWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbWVkaWFUaW1lVXMpKTsKLQogICAgICAgICAgICAgQUxPR1YoInJlbmRlcmluZyBhdWRpbyBhdCBtZWRpYSB0aW1lICUuMmYgc2VjcyIsIG1lZGlhVGltZVVzIC8gMUU2KTsKLQotICAgICAgICAgICAgbUFuY2hvclRpbWVNZWRpYVVzID0gbWVkaWFUaW1lVXM7Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IG51bUZyYW1lc1BsYXllZDsKLSAgICAgICAgICAgIENIRUNLX0VRKG1BdWRpb1NpbmstPmdldFBvc2l0aW9uKCZudW1GcmFtZXNQbGF5ZWQpLCAoc3RhdHVzX3QpT0spOwotCi0gICAgICAgICAgICB1aW50MzJfdCBudW1GcmFtZXNQZW5kaW5nUGxheW91dCA9Ci0gICAgICAgICAgICAgICAgbU51bUZyYW1lc1dyaXR0ZW4gLSBudW1GcmFtZXNQbGF5ZWQ7Ci0KLSAgICAgICAgICAgIGludDY0X3QgcmVhbFRpbWVPZmZzZXRVcyA9Ci0gICAgICAgICAgICAgICAgKG1BdWRpb1NpbmstPmxhdGVuY3koKSAvIDIgIC8qIFhYWCAqLwotICAgICAgICAgICAgICAgICAgICArIG51bUZyYW1lc1BlbmRpbmdQbGF5b3V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAqIG1BdWRpb1NpbmstPm1zZWNzUGVyRnJhbWUoKSkgKiAxMDAwbGw7Ci0KLSAgICAgICAgICAgIC8vIEFMT0dJKCJyZWFsVGltZU9mZnNldFVzID0gJWxsZCB1cyIsIHJlYWxUaW1lT2Zmc2V0VXMpOwotCi0gICAgICAgICAgICBtQW5jaG9yVGltZVJlYWxVcyA9Ci0gICAgICAgICAgICAgICAgQUxvb3Blcjo6R2V0Tm93VXMoKSArIHJlYWxUaW1lT2Zmc2V0VXM7CisgICAgICAgICAgICBvbk5ld0F1ZGlvTWVkaWFUaW1lKG1lZGlhVGltZVVzKTsKICAgICAgICAgfQogCiAgICAgICAgIHNpemVfdCBjb3B5ID0gZW50cnktPm1CdWZmZXItPnNpemUoKSAtIGVudHJ5LT5tT2Zmc2V0OwpAQCAtMzEyLDExICs2NDQsMTMgQEAKICAgICAgICAgICAgIGNvcHkgPSBudW1CeXRlc0F2YWlsYWJsZVRvV3JpdGU7CiAgICAgICAgIH0KIAotICAgICAgICBDSEVDS19FUShtQXVkaW9TaW5rLT53cml0ZSgKLSAgICAgICAgICAgICAgICAgICAgZW50cnktPm1CdWZmZXItPmRhdGEoKSArIGVudHJ5LT5tT2Zmc2V0LCBjb3B5KSwKLSAgICAgICAgICAgICAgICAgKHNzaXplX3QpY29weSk7CisgICAgICAgIHNzaXplX3Qgd3JpdHRlbiA9IG1BdWRpb1NpbmstPndyaXRlKGVudHJ5LT5tQnVmZmVyLT5kYXRhKCkgKyBlbnRyeS0+bU9mZnNldCwgY29weSk7CisgICAgICAgIGlmICh3cml0dGVuIDwgMCkgeworICAgICAgICAgICAgLy8gQW4gZXJyb3IgaW4gQXVkaW9TaW5rIHdyaXRlIGlzIGZhdGFsIGhlcmUuCisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJBdWRpb1Npbmsgd3JpdGUgZXJyb3IoJXpkKSB3aGVuIHdyaXRpbmcgJXp1IGJ5dGVzIiwgd3JpdHRlbiwgY29weSk7CisgICAgICAgIH0KIAotICAgICAgICBlbnRyeS0+bU9mZnNldCArPSBjb3B5OworICAgICAgICBlbnRyeS0+bU9mZnNldCArPSB3cml0dGVuOwogICAgICAgICBpZiAoZW50cnktPm1PZmZzZXQgPT0gZW50cnktPm1CdWZmZXItPnNpemUoKSkgewogICAgICAgICAgICAgZW50cnktPm1Ob3RpZnlDb25zdW1lZC0+cG9zdCgpOwogICAgICAgICAgICAgbUF1ZGlvUXVldWUuZXJhc2UobUF1ZGlvUXVldWUuYmVnaW4oKSk7CkBAIC0zMjQsMjAgKzY1OCw3MyBAQAogICAgICAgICAgICAgZW50cnkgPSBOVUxMOwogICAgICAgICB9CiAKLSAgICAgICAgbnVtQnl0ZXNBdmFpbGFibGVUb1dyaXRlIC09IGNvcHk7Ci0gICAgICAgIHNpemVfdCBjb3BpZWRGcmFtZXMgPSBjb3B5IC8gbUF1ZGlvU2luay0+ZnJhbWVTaXplKCk7CisgICAgICAgIG51bUJ5dGVzQXZhaWxhYmxlVG9Xcml0ZSAtPSB3cml0dGVuOworICAgICAgICBzaXplX3QgY29waWVkRnJhbWVzID0gd3JpdHRlbiAvIG1BdWRpb1NpbmstPmZyYW1lU2l6ZSgpOwogICAgICAgICBtTnVtRnJhbWVzV3JpdHRlbiArPSBjb3BpZWRGcmFtZXM7CiAKICAgICAgICAgbm90aWZ5SWZNZWRpYVJlbmRlcmluZ1N0YXJ0ZWQoKTsKLSAgICB9CiAKLSAgICBub3RpZnlQb3NpdGlvbigpOworICAgICAgICBpZiAod3JpdHRlbiAhPSAoc3NpemVfdCljb3B5KSB7CisgICAgICAgICAgICAvLyBBIHNob3J0IGNvdW50IHdhcyByZWNlaXZlZCBmcm9tIEF1ZGlvU2luazo6d3JpdGUoKQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIEF1ZGlvU2luayB3cml0ZSBzaG91bGQgYmxvY2sgdW50aWwgZXhhY3RseSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFyZSBkZWxpdmVyZWQuCisgICAgICAgICAgICAvLyBCdXQgaXQgbWF5IHJldHVybiB3aXRoIGEgc2hvcnQgY291bnQgKHdpdGhvdXQgYW4gZXJyb3IpIHdoZW46CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gMSkgU2l6ZSB0byBiZSBjb3BpZWQgaXMgbm90IGEgbXVsdGlwbGUgb2YgdGhlIGZyYW1lIHNpemUuIFdlIGNvbnNpZGVyIHRoaXMgZmF0YWwuCisgICAgICAgICAgICAvLyAyKSBBdWRpb1NpbmsgaXMgYW4gQXVkaW9DYWNoZSBmb3IgZGF0YSByZXRyaWV2YWwsIGFuZCB0aGUgQXVkaW9DYWNoZSBpcyBleGNlZWRlZC4KKworICAgICAgICAgICAgLy8gKENhc2UgMSkKKyAgICAgICAgICAgIC8vIE11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgZnJhbWUgc2l6ZS4gIElmIGl0IGlzIG5vdCBhIG11bHRpcGxlIG9mIGEgZnJhbWUgc2l6ZSwgaXQKKyAgICAgICAgICAgIC8vIG5lZWRzIHRvIGZhaWwsIGFzIHdlIHNob3VsZCBub3QgY2Fycnkgb3ZlciBmcmFjdGlvbmFsIGZyYW1lcyBiZXR3ZWVuIGNhbGxzLgorICAgICAgICAgICAgQ0hFQ0tfRVEoY29weSAlIG1BdWRpb1NpbmstPmZyYW1lU2l6ZSgpLCAwKTsKKworICAgICAgICAgICAgLy8gKENhc2UgMikKKyAgICAgICAgICAgIC8vIFJldHVybiBlYXJseSB0byB0aGUgY2FsbGVyLgorICAgICAgICAgICAgLy8gQmV3YXJlIG9mIGNhbGxpbmcgaW1tZWRpYXRlbHkgYWdhaW4gYXMgdGhpcyBtYXkgYnVzeS1sb29wIGlmIHlvdSBhcmUgbm90IGNhcmVmdWwuCisgICAgICAgICAgICBBTE9HVygiQXVkaW9TaW5rIHdyaXRlIHNob3J0IGZyYW1lIGNvdW50ICV6ZCA8ICV6dSIsIHdyaXR0ZW4sIGNvcHkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgbUFuY2hvck1heE1lZGlhVXMgPQorICAgICAgICBtQW5jaG9yVGltZU1lZGlhVXMgKworICAgICAgICAgICAgICAgIChpbnQ2NF90KShtYXgoKGxvbmcgbG9uZyltTnVtRnJhbWVzV3JpdHRlbiAtIG1BbmNob3JOdW1GcmFtZXNXcml0dGVuLCAwTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAqIDEwMDBMTCAqIG1BdWRpb1NpbmstPm1zZWNzUGVyRnJhbWUoKSk7CiAKICAgICByZXR1cm4gIW1BdWRpb1F1ZXVlLmVtcHR5KCk7CiB9CiAKK2ludDY0X3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjpnZXRQZW5kaW5nQXVkaW9QbGF5b3V0RHVyYXRpb25VcyhpbnQ2NF90IG5vd1VzKSB7CisgICAgaW50NjRfdCB3cml0dGVuQXVkaW9EdXJhdGlvblVzID0KKyAgICAgICAgbU51bUZyYW1lc1dyaXR0ZW4gKiAxMDAwTEwgKiBtQXVkaW9TaW5rLT5tc2Vjc1BlckZyYW1lKCk7CisgICAgcmV0dXJuIHdyaXR0ZW5BdWRpb0R1cmF0aW9uVXMgLSBnZXRQbGF5ZWRPdXRBdWRpb0R1cmF0aW9uVXMobm93VXMpOworfQorCitpbnQ2NF90IE51UGxheWVyOjpSZW5kZXJlcjo6Z2V0UmVhbFRpbWVVcyhpbnQ2NF90IG1lZGlhVGltZVVzLCBpbnQ2NF90IG5vd1VzKSB7CisgICAgaW50NjRfdCBjdXJyZW50UG9zaXRpb25VczsKKyAgICBpZiAoZ2V0Q3VycmVudFBvc2l0aW9uKCZjdXJyZW50UG9zaXRpb25Vcywgbm93VXMsIHRydWUgLyogYWxsb3dQYXN0UXVldWVkVmlkZW8gKi8pICE9IE9LKSB7CisgICAgICAgIC8vIElmIGZhaWxlZCB0byBnZXQgY3VycmVudCBwb3NpdGlvbiwgZS5nLiBkdWUgdG8gYXVkaW8gY2xvY2sgaXMgbm90IHJlYWR5LCB0aGVuIGp1c3QKKyAgICAgICAgLy8gcGxheSBvdXQgdmlkZW8gaW1tZWRpYXRlbHkgd2l0aG91dCBkZWxheS4KKyAgICAgICAgcmV0dXJuIG5vd1VzOworICAgIH0KKyAgICByZXR1cm4gKG1lZGlhVGltZVVzIC0gY3VycmVudFBvc2l0aW9uVXMpICsgbm93VXM7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpvbk5ld0F1ZGlvTWVkaWFUaW1lKGludDY0X3QgbWVkaWFUaW1lVXMpIHsKKyAgICAvLyBUUklDS1k6IHZvcmJpcyBkZWNvZGVyIGdlbmVyYXRlcyBtdWx0aXBsZSBmcmFtZXMgd2l0aCB0aGUgc2FtZQorICAgIC8vIHRpbWVzdGFtcCwgc28gb25seSB1cGRhdGUgb24gdGhlIGZpcnN0IGZyYW1lIHdpdGggYSBnaXZlbiB0aW1lc3RhbXAKKyAgICBpZiAobWVkaWFUaW1lVXMgPT0gbUFuY2hvclRpbWVNZWRpYVVzKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2V0QXVkaW9GaXJzdEFuY2hvclRpbWVJZk5lZWRlZChtZWRpYVRpbWVVcyk7CisgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgc2V0QW5jaG9yVGltZSgKKyAgICAgICAgICAgIG1lZGlhVGltZVVzLCBub3dVcyArIGdldFBlbmRpbmdBdWRpb1BsYXlvdXREdXJhdGlvblVzKG5vd1VzKSwgbU51bUZyYW1lc1dyaXR0ZW4pOworfQorCiB2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6cG9zdERyYWluVmlkZW9RdWV1ZSgpIHsKLSAgICBpZiAobURyYWluVmlkZW9RdWV1ZVBlbmRpbmcgfHwgbVN5bmNRdWV1ZXMgfHwgbVBhdXNlZCkgeworICAgIGlmIChtRHJhaW5WaWRlb1F1ZXVlUGVuZGluZworICAgICAgICAgICAgfHwgbVN5bmNRdWV1ZXMKKyAgICAgICAgICAgIHx8IChtUGF1c2VkICYmIG1WaWRlb1NhbXBsZVJlY2VpdmVkKSkgewogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC0zNTAsMzYgKzczNyw2NyBAQAogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXREcmFpblZpZGVvUXVldWUsIGlkKCkpOwogICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtVmlkZW9RdWV1ZUdlbmVyYXRpb24pOwogCi0gICAgaW50NjRfdCBkZWxheVVzOwotCiAgICAgaWYgKGVudHJ5Lm1CdWZmZXIgPT0gTlVMTCkgewogICAgICAgICAvLyBFT1MgZG9lc24ndCBjYXJyeSBhIHRpbWVzdGFtcC4KLSAgICAgICAgZGVsYXlVcyA9IDA7Ci0gICAgfSBlbHNlIGlmIChtRmxhZ3MgJiBGTEFHX1JFQUxfVElNRSkgeworICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICAgICAgbURyYWluVmlkZW9RdWV1ZVBlbmRpbmcgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50NjRfdCBkZWxheVVzOworICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgIGludDY0X3QgcmVhbFRpbWVVczsKKyAgICBpZiAobUZsYWdzICYgRkxBR19SRUFMX1RJTUUpIHsKICAgICAgICAgaW50NjRfdCBtZWRpYVRpbWVVczsKICAgICAgICAgQ0hFQ0soZW50cnkubUJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZtZWRpYVRpbWVVcykpOwotCi0gICAgICAgIGRlbGF5VXMgPSBtZWRpYVRpbWVVcyAtIEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgICAgIHJlYWxUaW1lVXMgPSBtZWRpYVRpbWVVczsKICAgICB9IGVsc2UgewogICAgICAgICBpbnQ2NF90IG1lZGlhVGltZVVzOwogICAgICAgICBDSEVDSyhlbnRyeS5tQnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJm1lZGlhVGltZVVzKSk7CiAKICAgICAgICAgaWYgKG1BbmNob3JUaW1lTWVkaWFVcyA8IDApIHsKLSAgICAgICAgICAgIGRlbGF5VXMgPSAwOwotCi0gICAgICAgICAgICBpZiAoIW1IYXNBdWRpbykgewotICAgICAgICAgICAgICAgIG1BbmNob3JUaW1lTWVkaWFVcyA9IG1lZGlhVGltZVVzOwotICAgICAgICAgICAgICAgIG1BbmNob3JUaW1lUmVhbFVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldEFuY2hvclRpbWUobWVkaWFUaW1lVXMsIG5vd1VzKTsKKyAgICAgICAgICAgIHJlYWxUaW1lVXMgPSBub3dVczsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludDY0X3QgcmVhbFRpbWVVcyA9Ci0gICAgICAgICAgICAgICAgKG1lZGlhVGltZVVzIC0gbUFuY2hvclRpbWVNZWRpYVVzKSArIG1BbmNob3JUaW1lUmVhbFVzOworICAgICAgICAgICAgcmVhbFRpbWVVcyA9IGdldFJlYWxUaW1lVXMobWVkaWFUaW1lVXMsIG5vd1VzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1IYXNBdWRpbykgeworICAgICAgICAgICAgbUFuY2hvck1heE1lZGlhVXMgPSBtZWRpYVRpbWVVcyArIDEwMDAwMDsgLy8gc21vb3RoIG91dCB2aWRlb3MgPj0gMTBmcHMKKyAgICAgICAgfQogCi0gICAgICAgICAgICBkZWxheVVzID0gcmVhbFRpbWVVcyAtIEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgICAgIC8vIEhldXJpc3RpY3MgdG8gaGFuZGxlIHNpdHVhdGlvbiB3aGVuIG1lZGlhIHRpbWUgY2hhbmdlZCB3aXRob3V0IGEKKyAgICAgICAgLy8gZGlzY29udGludWl0eS4gSWYgd2UgaGF2ZSBub3QgZHJhaW5lZCBhbiBhdWRpbyBidWZmZXIgdGhhdCB3YXMKKyAgICAgICAgLy8gcmVjZWl2ZWQgYWZ0ZXIgdGhpcyBidWZmZXIsIHJlcG9zdCBpbiAxMCBtc2VjLiBPdGhlcndpc2UgcmVwb3N0CisgICAgICAgIC8vIGluIDUwMCBtc2VjLgorICAgICAgICBkZWxheVVzID0gcmVhbFRpbWVVcyAtIG5vd1VzOworICAgICAgICBpZiAoZGVsYXlVcyA+IDUwMDAwMCkgeworICAgICAgICAgICAgaW50NjRfdCBwb3N0RGVsYXlVcyA9IDUwMDAwMDsKKyAgICAgICAgICAgIGlmIChtSGFzQXVkaW8gJiYgKG1MYXN0QXVkaW9CdWZmZXJEcmFpbmVkIC0gZW50cnkubUJ1ZmZlck9yZGluYWwpIDw9IDApIHsKKyAgICAgICAgICAgICAgICBwb3N0RGVsYXlVcyA9IDEwMDAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbXNnLT5zZXRXaGF0KGtXaGF0UG9zdERyYWluVmlkZW9RdWV1ZSk7CisgICAgICAgICAgICBtc2ctPnBvc3QocG9zdERlbGF5VXMpOworICAgICAgICAgICAgbVZpZGVvU2NoZWR1bGVyLT5yZXN0YXJ0KCk7CisgICAgICAgICAgICBBTE9HSSgicG9zc2libGUgdmlkZW8gdGltZSBqdW1wIG9mICVkbXMsIHJldHJ5aW5nIGluICVkbXMiLAorICAgICAgICAgICAgICAgICAgICAoaW50KShkZWxheVVzIC8gMTAwMCksIChpbnQpKHBvc3REZWxheVVzIC8gMTAwMCkpOworICAgICAgICAgICAgbURyYWluVmlkZW9RdWV1ZVBlbmRpbmcgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgfQogCi0gICAgbXNnLT5wb3N0KGRlbGF5VXMpOworICAgIHJlYWxUaW1lVXMgPSBtVmlkZW9TY2hlZHVsZXItPnNjaGVkdWxlKHJlYWxUaW1lVXMgKiAxMDAwKSAvIDEwMDA7CisgICAgaW50NjRfdCB0d29Wc3luY3NVcyA9IDIgKiAobVZpZGVvU2NoZWR1bGVyLT5nZXRWc3luY1BlcmlvZCgpIC8gMTAwMCk7CisKKyAgICBkZWxheVVzID0gcmVhbFRpbWVVcyAtIG5vd1VzOworCisgICAgQUxPR1dfSUYoZGVsYXlVcyA+IDUwMDAwMCwgInVudXN1YWxseSBoaWdoIGRlbGF5VXM6ICUiIFBSSWQ2NCwgZGVsYXlVcyk7CisgICAgLy8gcG9zdCAyIGRpc3BsYXkgcmVmcmVzaGVzIGJlZm9yZSByZW5kZXJpbmcgaXMgZHVlCisgICAgLy8gRklYTUUgY3VycmVudGx5IHRoaXMgaW5jcmVhc2VzIHBvd2VyIGNvbnN1bXB0aW9uLCBzbyB1bmxlc3MgZnJhbWUtYWNjdXJhdGUKKyAgICAvLyBBViBzeW5jIGlzIHJlcXVlc3RlZCwgcG9zdCBjbG9zZXIgdG8gcmVxdWlyZWQgcmVuZGVyIHRpbWUgKGF0IDAuNjMgdnN5bmNzKQorICAgIGlmICghc0ZyYW1lQWNjdXJhdGVBVnN5bmMpIHsKKyAgICAgICAgdHdvVnN5bmNzVXMgPj49IDQ7CisgICAgfQorICAgIG1zZy0+cG9zdChkZWxheVVzID4gdHdvVnN5bmNzVXMgPyBkZWxheVVzIC0gdHdvVnN5bmNzVXMgOiAwKTsKIAogICAgIG1EcmFpblZpZGVvUXVldWVQZW5kaW5nID0gdHJ1ZTsKIH0KQEAgLTM5OSwxMiArODE3LDExIEBACiAgICAgICAgIG1WaWRlb1F1ZXVlLmVyYXNlKG1WaWRlb1F1ZXVlLmJlZ2luKCkpOwogICAgICAgICBlbnRyeSA9IE5VTEw7CiAKLSAgICAgICAgbVZpZGVvTGF0ZUJ5VXMgPSAwbGw7Ci0KLSAgICAgICAgbm90aWZ5UG9zaXRpb24oKTsKKyAgICAgICAgc2V0VmlkZW9MYXRlQnlVcygwKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIGludDY0X3Qgbm93VXMgPSAtMTsKICAgICBpbnQ2NF90IHJlYWxUaW1lVXM7CiAgICAgaWYgKG1GbGFncyAmIEZMQUdfUkVBTF9USU1FKSB7CiAgICAgICAgIENIRUNLKGVudHJ5LT5tQnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnJlYWxUaW1lVXMpKTsKQEAgLTQxMiwzNyArODI5LDUxIEBACiAgICAgICAgIGludDY0X3QgbWVkaWFUaW1lVXM7CiAgICAgICAgIENIRUNLKGVudHJ5LT5tQnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJm1lZGlhVGltZVVzKSk7CiAKLSAgICAgICAgcmVhbFRpbWVVcyA9IG1lZGlhVGltZVVzIC0gbUFuY2hvclRpbWVNZWRpYVVzICsgbUFuY2hvclRpbWVSZWFsVXM7CisgICAgICAgIG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICAgICAgcmVhbFRpbWVVcyA9IGdldFJlYWxUaW1lVXMobWVkaWFUaW1lVXMsIG5vd1VzKTsKICAgICB9CiAKLSAgICBtVmlkZW9MYXRlQnlVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSByZWFsVGltZVVzOwotICAgIGJvb2wgdG9vTGF0ZSA9IChtVmlkZW9MYXRlQnlVcyA+IDQwMDAwKTsKKyAgICBib29sIHRvb0xhdGUgPSBmYWxzZTsKIAotICAgIGlmICh0b29MYXRlKSB7Ci0gICAgICAgIEFMT0dWKCJ2aWRlbyBsYXRlIGJ5ICVsbGQgdXMgKCUuMmYgc2VjcykiLAotICAgICAgICAgICAgIG1WaWRlb0xhdGVCeVVzLCBtVmlkZW9MYXRlQnlVcyAvIDFFNik7CisgICAgaWYgKCFtUGF1c2VkKSB7CisgICAgICAgIGlmIChub3dVcyA9PSAtMSkgeworICAgICAgICAgICAgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgICAgICB9CisgICAgICAgIHNldFZpZGVvTGF0ZUJ5VXMobm93VXMgLSByZWFsVGltZVVzKTsKKyAgICAgICAgdG9vTGF0ZSA9IChtVmlkZW9MYXRlQnlVcyA+IDQwMDAwKTsKKworICAgICAgICBpZiAodG9vTGF0ZSkgeworICAgICAgICAgICAgQUxPR1YoInZpZGVvIGxhdGUgYnkgJWxsZCB1cyAoJS4yZiBzZWNzKSIsCisgICAgICAgICAgICAgICAgIG1WaWRlb0xhdGVCeVVzLCBtVmlkZW9MYXRlQnlVcyAvIDFFNik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVigicmVuZGVyaW5nIHZpZGVvIGF0IG1lZGlhIHRpbWUgJS4yZiBzZWNzIiwKKyAgICAgICAgICAgICAgICAgICAgKG1GbGFncyAmIEZMQUdfUkVBTF9USU1FID8gcmVhbFRpbWVVcyA6CisgICAgICAgICAgICAgICAgICAgIChyZWFsVGltZVVzICsgbUFuY2hvclRpbWVNZWRpYVVzIC0gbUFuY2hvclRpbWVSZWFsVXMpKSAvIDFFNik7CisgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigicmVuZGVyaW5nIHZpZGVvIGF0IG1lZGlhIHRpbWUgJS4yZiBzZWNzIiwKLSAgICAgICAgICAgICAgICAobUZsYWdzICYgRkxBR19SRUFMX1RJTUUgPyByZWFsVGltZVVzIDoKLSAgICAgICAgICAgICAgICAocmVhbFRpbWVVcyArIG1BbmNob3JUaW1lTWVkaWFVcyAtIG1BbmNob3JUaW1lUmVhbFVzKSkgLyAxRTYpOwotICAgICAgICBpZiAobVNvZnRSZW5kZXJlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtU29mdFJlbmRlcmVyLT5yZW5kZXIoZW50cnktPm1CdWZmZXItPmRhdGEoKSwgZW50cnktPm1CdWZmZXItPnNpemUoKSwgTlVMTCk7CisgICAgICAgIHNldFZpZGVvTGF0ZUJ5VXMoMCk7CisgICAgICAgIGlmICghbVZpZGVvU2FtcGxlUmVjZWl2ZWQgJiYgIW1IYXNBdWRpbykgeworICAgICAgICAgICAgLy8gVGhpcyB3aWxsIGVuc3VyZSB0aGF0IHRoZSBmaXJzdCBmcmFtZSBhZnRlciBhIGZsdXNoIHdvbid0IGJlIHVzZWQgYXMgYW5jaG9yCisgICAgICAgICAgICAvLyB3aGVuIHJlbmRlcmVyIGlzIGluIHBhdXNlZCBzdGF0ZSwgYmVjYXVzZSByZXN1bWUgY2FuIGhhcHBlbiBhbnkgdGltZSBhZnRlciBzZWVrLgorICAgICAgICAgICAgc2V0QW5jaG9yVGltZSgtMSwgLTEpOwogICAgICAgICB9CiAgICAgfQogCisgICAgZW50cnktPm1Ob3RpZnlDb25zdW1lZC0+c2V0SW50NjQoInRpbWVzdGFtcE5zIiwgcmVhbFRpbWVVcyAqIDEwMDBsbCk7CiAgICAgZW50cnktPm1Ob3RpZnlDb25zdW1lZC0+c2V0SW50MzIoInJlbmRlciIsICF0b29MYXRlKTsKICAgICBlbnRyeS0+bU5vdGlmeUNvbnN1bWVkLT5wb3N0KCk7CiAgICAgbVZpZGVvUXVldWUuZXJhc2UobVZpZGVvUXVldWUuYmVnaW4oKSk7CiAgICAgZW50cnkgPSBOVUxMOwogCi0gICAgaWYgKCFtVmlkZW9SZW5kZXJpbmdTdGFydGVkKSB7Ci0gICAgICAgIG1WaWRlb1JlbmRlcmluZ1N0YXJ0ZWQgPSB0cnVlOwotICAgICAgICBub3RpZnlWaWRlb1JlbmRlcmluZ1N0YXJ0KCk7CisgICAgbVZpZGVvU2FtcGxlUmVjZWl2ZWQgPSB0cnVlOworCisgICAgaWYgKCFtUGF1c2VkKSB7CisgICAgICAgIGlmICghbVZpZGVvUmVuZGVyaW5nU3RhcnRlZCkgeworICAgICAgICAgICAgbVZpZGVvUmVuZGVyaW5nU3RhcnRlZCA9IHRydWU7CisgICAgICAgICAgICBub3RpZnlWaWRlb1JlbmRlcmluZ1N0YXJ0KCk7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5SWZNZWRpYVJlbmRlcmluZ1N0YXJ0ZWQoKTsKICAgICB9Ci0KLSAgICBub3RpZnlJZk1lZGlhUmVuZGVyaW5nU3RhcnRlZCgpOwotCi0gICAgbm90aWZ5UG9zaXRpb24oKTsKIH0KIAogdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6Om5vdGlmeVZpZGVvUmVuZGVyaW5nU3RhcnQoKSB7CkBAIC00NTEsMjIgKzg4MiwyOSBAQAogICAgIG5vdGlmeS0+cG9zdCgpOwogfQogCi12b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6bm90aWZ5RU9TKGJvb2wgYXVkaW8sIHN0YXR1c190IGZpbmFsUmVzdWx0KSB7Cit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6bm90aWZ5RU9TKGJvb2wgYXVkaW8sIHN0YXR1c190IGZpbmFsUmVzdWx0LCBpbnQ2NF90IGRlbGF5VXMpIHsKICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CiAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0RU9TKTsKICAgICBub3RpZnktPnNldEludDMyKCJhdWRpbyIsIHN0YXRpY19jYXN0PGludDMyX3Q+KGF1ZGlvKSk7CiAgICAgbm90aWZ5LT5zZXRJbnQzMigiZmluYWxSZXN1bHQiLCBmaW5hbFJlc3VsdCk7Ci0gICAgbm90aWZ5LT5wb3N0KCk7CisgICAgbm90aWZ5LT5wb3N0KGRlbGF5VXMpOworfQorCit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6bm90aWZ5QXVkaW9PZmZsb2FkVGVhckRvd24oKSB7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdEF1ZGlvT2ZmbG9hZFRlYXJEb3duLCBpZCgpKSktPnBvc3QoKTsKIH0KIAogdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6Om9uUXVldWVCdWZmZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBpbnQzMl90IGF1ZGlvOwogICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJhdWRpbyIsICZhdWRpbykpOwogCi0gICAgaWYgKGF1ZGlvKSB7Ci0gICAgICAgIG1IYXNBdWRpbyA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUhhc1ZpZGVvID0gdHJ1ZTsKKyAgICBzZXRIYXNNZWRpYShhdWRpbyk7CisKKyAgICBpZiAobUhhc1ZpZGVvKSB7CisgICAgICAgIGlmIChtVmlkZW9TY2hlZHVsZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgbVZpZGVvU2NoZWR1bGVyID0gbmV3IFZpZGVvRnJhbWVTY2hlZHVsZXIoKTsKKyAgICAgICAgICAgIG1WaWRlb1NjaGVkdWxlci0+aW5pdCgpOworICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKGRyb3BCdWZmZXJXaGlsZUZsdXNoaW5nKGF1ZGlvLCBtc2cpKSB7CkBAIC00ODQsMTUgKzkyMiwxOCBAQAogICAgIGVudHJ5Lm1Ob3RpZnlDb25zdW1lZCA9IG5vdGlmeUNvbnN1bWVkOwogICAgIGVudHJ5Lm1PZmZzZXQgPSAwOwogICAgIGVudHJ5Lm1GaW5hbFJlc3VsdCA9IE9LOworICAgIGVudHJ5Lm1CdWZmZXJPcmRpbmFsID0gKyttVG90YWxCdWZmZXJzUXVldWVkOwogCiAgICAgaWYgKGF1ZGlvKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgICAgIG1BdWRpb1F1ZXVlLnB1c2hfYmFjayhlbnRyeSk7Ci0gICAgICAgIHBvc3REcmFpbkF1ZGlvUXVldWUoKTsKKyAgICAgICAgcG9zdERyYWluQXVkaW9RdWV1ZV9sKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbVZpZGVvUXVldWUucHVzaF9iYWNrKGVudHJ5KTsKICAgICAgICAgcG9zdERyYWluVmlkZW9RdWV1ZSgpOwogICAgIH0KIAorICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgaWYgKCFtU3luY1F1ZXVlcyB8fCBtQXVkaW9RdWV1ZS5lbXB0eSgpIHx8IG1WaWRlb1F1ZXVlLmVtcHR5KCkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTUwMiw3ICs5NDMsNyBAQAogCiAgICAgaWYgKGZpcnN0QXVkaW9CdWZmZXIgPT0gTlVMTCB8fCBmaXJzdFZpZGVvQnVmZmVyID09IE5VTEwpIHsKICAgICAgICAgLy8gRU9TIHNpZ25hbGxlZCBvbiBlaXRoZXIgcXVldWUuCi0gICAgICAgIHN5bmNRdWV1ZXNEb25lKCk7CisgICAgICAgIHN5bmNRdWV1ZXNEb25lX2woKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtNTI2LDEwICs5NjcsMTAgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIHN5bmNRdWV1ZXNEb25lKCk7CisgICAgc3luY1F1ZXVlc0RvbmVfbCgpOwogfQogCi12b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6c3luY1F1ZXVlc0RvbmUoKSB7Cit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6c3luY1F1ZXVlc0RvbmVfbCgpIHsKICAgICBpZiAoIW1TeW5jUXVldWVzKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC01MzcsNyArOTc4LDcgQEAKICAgICBtU3luY1F1ZXVlcyA9IGZhbHNlOwogCiAgICAgaWYgKCFtQXVkaW9RdWV1ZS5lbXB0eSgpKSB7Ci0gICAgICAgIHBvc3REcmFpbkF1ZGlvUXVldWUoKTsKKyAgICAgICAgcG9zdERyYWluQXVkaW9RdWV1ZV9sKCk7CiAgICAgfQogCiAgICAgaWYgKCFtVmlkZW9RdWV1ZS5lbXB0eSgpKSB7CkBAIC01NjEsMTQgKzEwMDIsMTYgQEAKICAgICBlbnRyeS5tRmluYWxSZXN1bHQgPSBmaW5hbFJlc3VsdDsKIAogICAgIGlmIChhdWRpbykgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgICAgICBpZiAobUF1ZGlvUXVldWUuZW1wdHkoKSAmJiBtU3luY1F1ZXVlcykgewotICAgICAgICAgICAgc3luY1F1ZXVlc0RvbmUoKTsKKyAgICAgICAgICAgIHN5bmNRdWV1ZXNEb25lX2woKTsKICAgICAgICAgfQogICAgICAgICBtQXVkaW9RdWV1ZS5wdXNoX2JhY2soZW50cnkpOwotICAgICAgICBwb3N0RHJhaW5BdWRpb1F1ZXVlKCk7CisgICAgICAgIHBvc3REcmFpbkF1ZGlvUXVldWVfbCgpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChtVmlkZW9RdWV1ZS5lbXB0eSgpICYmIG1TeW5jUXVldWVzKSB7Ci0gICAgICAgICAgICBzeW5jUXVldWVzRG9uZSgpOworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgICAgIHN5bmNRdWV1ZXNEb25lX2woKTsKICAgICAgICAgfQogICAgICAgICBtVmlkZW9RdWV1ZS5wdXNoX2JhY2soZW50cnkpOwogICAgICAgICBwb3N0RHJhaW5WaWRlb1F1ZXVlKCk7CkBAIC01NzksNiArMTAyMiwxNSBAQAogICAgIGludDMyX3QgYXVkaW87CiAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImF1ZGlvIiwgJmF1ZGlvKSk7CiAKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtRmx1c2hMb2NrKTsKKyAgICAgICAgaWYgKGF1ZGlvKSB7CisgICAgICAgICAgICBtRmx1c2hpbmdBdWRpbyA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUZsdXNoaW5nVmlkZW8gPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIElmIHdlJ3JlIGN1cnJlbnRseSBzeW5jaW5nIHRoZSBxdWV1ZXMsIGkuZS4gZHJvcHBpbmcgYXVkaW8gd2hpbGUKICAgICAvLyBhbGlnbmluZyB0aGUgZmlyc3QgYXVkaW8vdmlkZW8gYnVmZmVyIHRpbWVzIGFuZCBvbmx5IG9uZSBvZiB0aGUKICAgICAvLyB0d28gcXVldWVzIGhhcyBkYXRhLCB3ZSBtYXkgc3RhcnZlIHRoYXQgcXVldWUgYnkgbm90IHJlcXVlc3RpbmcKQEAgLTU4NywzMSArMTAzOSw0NyBAQAogICAgIC8vIGNvcnJlc3BvbmRpbmcgZGlzY29udGludWl0eSBvbiB0aGUgb3RoZXIgcXVldWUuCiAgICAgLy8gVGhlcmVmb3JlIHdlJ2xsIHN0b3Agc3luY2luZyB0aGUgcXVldWVzIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGVtCiAgICAgLy8gaXMgZmx1c2hlZC4KLSAgICBzeW5jUXVldWVzRG9uZSgpOworICAgIHsKKyAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgICBzeW5jUXVldWVzRG9uZV9sKCk7CisgICAgICAgICBzZXRQYXVzZVN0YXJ0ZWRUaW1lUmVhbFVzKC0xKTsKKyAgICB9CiAKICAgICBBTE9HVigiZmx1c2hpbmcgJXMiLCBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKICAgICBpZiAoYXVkaW8pIHsKLSAgICAgICAgZmx1c2hRdWV1ZSgmbUF1ZGlvUXVldWUpOworICAgICAgICB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICAgICAgZmx1c2hRdWV1ZSgmbUF1ZGlvUXVldWUpOwogCi0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtRmx1c2hMb2NrKTsKLSAgICAgICAgbUZsdXNoaW5nQXVkaW8gPSBmYWxzZTsKKyAgICAgICAgICAgICsrbUF1ZGlvUXVldWVHZW5lcmF0aW9uOworICAgICAgICAgICAgcHJlcGFyZUZvck1lZGlhUmVuZGVyaW5nU3RhcnQoKTsKKworICAgICAgICAgICAgaWYgKG9mZmxvYWRpbmdBdWRpbygpKSB7CisgICAgICAgICAgICAgICAgc2V0QXVkaW9GaXJzdEFuY2hvclRpbWUoLTEpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKICAgICAgICAgbURyYWluQXVkaW9RdWV1ZVBlbmRpbmcgPSBmYWxzZTsKLSAgICAgICAgKyttQXVkaW9RdWV1ZUdlbmVyYXRpb247CiAKLSAgICAgICAgcHJlcGFyZUZvck1lZGlhUmVuZGVyaW5nU3RhcnQoKTsKKyAgICAgICAgaWYgKG9mZmxvYWRpbmdBdWRpbygpKSB7CisgICAgICAgICAgICBtQXVkaW9TaW5rLT5wYXVzZSgpOworICAgICAgICAgICAgbUF1ZGlvU2luay0+Zmx1c2goKTsKKyAgICAgICAgICAgIG1BdWRpb1NpbmstPnN0YXJ0KCk7CisgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBmbHVzaFF1ZXVlKCZtVmlkZW9RdWV1ZSk7CiAKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1GbHVzaExvY2spOwotICAgICAgICBtRmx1c2hpbmdWaWRlbyA9IGZhbHNlOwotCiAgICAgICAgIG1EcmFpblZpZGVvUXVldWVQZW5kaW5nID0gZmFsc2U7CiAgICAgICAgICsrbVZpZGVvUXVldWVHZW5lcmF0aW9uOwogCisgICAgICAgIGlmIChtVmlkZW9TY2hlZHVsZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgbVZpZGVvU2NoZWR1bGVyLT5yZXN0YXJ0KCk7CisgICAgICAgIH0KKwogICAgICAgICBwcmVwYXJlRm9yTWVkaWFSZW5kZXJpbmdTdGFydCgpOwogICAgIH0KIAorICAgIG1WaWRlb1NhbXBsZVJlY2VpdmVkID0gZmFsc2U7CiAgICAgbm90aWZ5Rmx1c2hDb21wbGV0ZShhdWRpbyk7CiB9CiAKQEAgLTY2MSw3MCArMTEyOSw3MyBAQAogfQogCiB2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6b25BdWRpb1NpbmtDaGFuZ2VkKCkgeworICAgIGlmIChvZmZsb2FkaW5nQXVkaW8oKSkgeworICAgICAgICByZXR1cm47CisgICAgfQogICAgIENIRUNLKCFtRHJhaW5BdWRpb1F1ZXVlUGVuZGluZyk7CiAgICAgbU51bUZyYW1lc1dyaXR0ZW4gPSAwOworICAgIG1BbmNob3JOdW1GcmFtZXNXcml0dGVuID0gLTE7CiAgICAgdWludDMyX3Qgd3JpdHRlbjsKICAgICBpZiAobUF1ZGlvU2luay0+Z2V0RnJhbWVzV3JpdHRlbigmd3JpdHRlbikgPT0gT0spIHsKICAgICAgICAgbU51bUZyYW1lc1dyaXR0ZW4gPSB3cml0dGVuOwogICAgIH0KIH0KIAotdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6Om5vdGlmeVBvc2l0aW9uKCkgewotICAgIGlmIChtQW5jaG9yVGltZVJlYWxVcyA8IDAgfHwgbUFuY2hvclRpbWVNZWRpYVVzIDwgMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0KLSAgICBpZiAobUxhc3RQb3NpdGlvblVwZGF0ZVVzID49IDAKLSAgICAgICAgICAgICYmIG5vd1VzIDwgbUxhc3RQb3NpdGlvblVwZGF0ZVVzICsga01pblBvc2l0aW9uVXBkYXRlRGVsYXlVcykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1MYXN0UG9zaXRpb25VcGRhdGVVcyA9IG5vd1VzOwotCi0gICAgaW50NjRfdCBwb3NpdGlvblVzID0gKG5vd1VzIC0gbUFuY2hvclRpbWVSZWFsVXMpICsgbUFuY2hvclRpbWVNZWRpYVVzOwotCi0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFBvc2l0aW9uKTsKLSAgICBub3RpZnktPnNldEludDY0KCJwb3NpdGlvblVzIiwgcG9zaXRpb25Vcyk7Ci0gICAgbm90aWZ5LT5zZXRJbnQ2NCgidmlkZW9MYXRlQnlVcyIsIG1WaWRlb0xhdGVCeVVzKTsKLSAgICBub3RpZnktPnBvc3QoKTsKK3ZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpvbkRpc2FibGVPZmZsb2FkQXVkaW8oKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBtRmxhZ3MgJj0gfkZMQUdfT0ZGTE9BRF9BVURJTzsKKyAgICArK21BdWRpb1F1ZXVlR2VuZXJhdGlvbjsKIH0KIAogdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6Om9uUGF1c2UoKSB7Ci0gICAgQ0hFQ0soIW1QYXVzZWQpOworICAgIGlmIChtUGF1c2VkKSB7CisgICAgICAgIEFMT0dXKCJSZW5kZXJlcjo6b25QYXVzZSgpIGNhbGxlZCB3aGlsZSBhbHJlYWR5IHBhdXNlZCEiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgICsrbUF1ZGlvUXVldWVHZW5lcmF0aW9uOworICAgICAgICArK21WaWRlb1F1ZXVlR2VuZXJhdGlvbjsKKyAgICAgICAgcHJlcGFyZUZvck1lZGlhUmVuZGVyaW5nU3RhcnQoKTsKKyAgICAgICAgbVBhdXNlZCA9IHRydWU7CisgICAgICAgIHNldFBhdXNlU3RhcnRlZFRpbWVSZWFsVXMoQUxvb3Blcjo6R2V0Tm93VXMoKSk7CisgICAgfQogCiAgICAgbURyYWluQXVkaW9RdWV1ZVBlbmRpbmcgPSBmYWxzZTsKLSAgICArK21BdWRpb1F1ZXVlR2VuZXJhdGlvbjsKLQogICAgIG1EcmFpblZpZGVvUXVldWVQZW5kaW5nID0gZmFsc2U7Ci0gICAgKyttVmlkZW9RdWV1ZUdlbmVyYXRpb247Ci0KLSAgICBwcmVwYXJlRm9yTWVkaWFSZW5kZXJpbmdTdGFydCgpOwogCiAgICAgaWYgKG1IYXNBdWRpbykgewogICAgICAgICBtQXVkaW9TaW5rLT5wYXVzZSgpOworICAgICAgICBzdGFydEF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dCgpOwogICAgIH0KIAogICAgIEFMT0dWKCJub3cgcGF1c2VkIGF1ZGlvIHF1ZXVlIGhhcyAlZCBlbnRyaWVzLCB2aWRlbyBoYXMgJWQgZW50cmllcyIsCiAgICAgICAgICAgbUF1ZGlvUXVldWUuc2l6ZSgpLCBtVmlkZW9RdWV1ZS5zaXplKCkpOwotCi0gICAgbVBhdXNlZCA9IHRydWU7CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpvblJlc3VtZSgpIHsKKyAgICByZWFkUHJvcGVydGllcygpOworCiAgICAgaWYgKCFtUGF1c2VkKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICBpZiAobUhhc0F1ZGlvKSB7CisgICAgICAgIGNhbmNlbEF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dCgpOwogICAgICAgICBtQXVkaW9TaW5rLT5zdGFydCgpOwogICAgIH0KIAorICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgbVBhdXNlZCA9IGZhbHNlOworICAgIGlmIChtUGF1c2VTdGFydGVkVGltZVJlYWxVcyAhPSAtMSkgeworICAgICAgICBpbnQ2NF90IG5ld0FuY2hvclJlYWxVcyA9CisgICAgICAgICAgICBtQW5jaG9yVGltZVJlYWxVcyArIEFMb29wZXI6OkdldE5vd1VzKCkgLSBtUGF1c2VTdGFydGVkVGltZVJlYWxVczsKKyAgICAgICAgc2V0QW5jaG9yVGltZSgKKyAgICAgICAgICAgICAgICBtQW5jaG9yVGltZU1lZGlhVXMsIG5ld0FuY2hvclJlYWxVcywgbUFuY2hvck51bUZyYW1lc1dyaXR0ZW4sIHRydWUgLyogcmVzdW1lICovKTsKKyAgICB9CiAKICAgICBpZiAoIW1BdWRpb1F1ZXVlLmVtcHR5KCkpIHsKLSAgICAgICAgcG9zdERyYWluQXVkaW9RdWV1ZSgpOworICAgICAgICBwb3N0RHJhaW5BdWRpb1F1ZXVlX2woKTsKICAgICB9CiAKICAgICBpZiAoIW1WaWRlb1F1ZXVlLmVtcHR5KCkpIHsKQEAgLTczMiw1ICsxMjAzLDI0MiBAQAogICAgIH0KIH0KIAordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6Om9uU2V0VmlkZW9GcmFtZVJhdGUoZmxvYXQgZnBzKSB7CisgICAgaWYgKG1WaWRlb1NjaGVkdWxlciA9PSBOVUxMKSB7CisgICAgICAgIG1WaWRlb1NjaGVkdWxlciA9IG5ldyBWaWRlb0ZyYW1lU2NoZWR1bGVyKCk7CisgICAgfQorICAgIG1WaWRlb1NjaGVkdWxlci0+aW5pdChmcHMpOworfQorCisvLyBUT0RPOiBSZW1vdmUgdW5uZWNlc3NhcnkgY2FsbHMgdG8gZ2V0UGxheWVkT3V0QXVkaW9EdXJhdGlvblVzKCkKKy8vIGFzIGl0IGFjcXVpcmVzIGxvY2tzIGFuZCBtYXkgcXVlcnkgdGhlIGF1ZGlvIGRyaXZlci4KKy8vCisvLyBTb21lIGNhbGxzIGNvdWxkIGNvbmNlaXZhYmx5IHJldHJpZXZlIGV4dHJhcG9sYXRlZCBkYXRhIGluc3RlYWQgb2YKKy8vIGFjY2Vzc2luZyBnZXRUaW1lc3RhbXAoKSBvciBnZXRQb3NpdGlvbigpIGV2ZXJ5IHRpbWUgYSBkYXRhIGJ1ZmZlciB3aXRoCisvLyBhIG1lZGlhIHRpbWUgaXMgcmVjZWl2ZWQuCisvLworaW50NjRfdCBOdVBsYXllcjo6UmVuZGVyZXI6OmdldFBsYXllZE91dEF1ZGlvRHVyYXRpb25VcyhpbnQ2NF90IG5vd1VzKSB7CisgICAgdWludDMyX3QgbnVtRnJhbWVzUGxheWVkOworICAgIGludDY0X3QgbnVtRnJhbWVzUGxheWVkQXQ7CisgICAgQXVkaW9UaW1lc3RhbXAgdHM7CisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga1N0YWxlVGltZXN0YW1wMTAwbXMgPSAxMDAwMDA7CisKKyAgICBzdGF0dXNfdCByZXMgPSBtQXVkaW9TaW5rLT5nZXRUaW1lc3RhbXAodHMpOworICAgIGlmIChyZXMgPT0gT0spIHsgICAgICAgICAgICAgICAgIC8vIGNhc2UgMTogbWl4aW5nIGF1ZGlvIHRyYWNrcyBhbmQgb2ZmbG9hZGVkIHRyYWNrcy4KKyAgICAgICAgbnVtRnJhbWVzUGxheWVkID0gdHMubVBvc2l0aW9uOworICAgICAgICBudW1GcmFtZXNQbGF5ZWRBdCA9CisgICAgICAgICAgICB0cy5tVGltZS50dl9zZWMgKiAxMDAwMDAwTEwgKyB0cy5tVGltZS50dl9uc2VjIC8gMTAwMDsKKyAgICAgICAgY29uc3QgaW50NjRfdCB0aW1lc3RhbXBBZ2UgPSBub3dVcyAtIG51bUZyYW1lc1BsYXllZEF0OworICAgICAgICBpZiAodGltZXN0YW1wQWdlID4ga1N0YWxlVGltZXN0YW1wMTAwbXMpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgYW4gYXVkaW8gRklYTUUuCisgICAgICAgICAgICAvLyBnZXRUaW1lc3RhbXAgcmV0dXJucyBhIHRpbWVzdGFtcCB3aGljaCBtYXkgY29tZSBmcm9tIGF1ZGlvIG1peGluZyB0aHJlYWRzLgorICAgICAgICAgICAgLy8gQWZ0ZXIgcGF1c2luZywgdGhlIE1peGVyVGhyZWFkIG1heSBnbyBpZGxlLCB0aHVzIHRoZSBtVGltZSBlc3RpbWF0ZSBtYXkKKyAgICAgICAgICAgIC8vIGJlY29tZSBzdGFsZS4gQXNzdW1pbmcgdGhhdCB0aGUgTWl4ZXJUaHJlYWQgcnVucyAyMG1zLCB3aXRoIEZhc3RNaXhlciBhdCA1bXMsCisgICAgICAgICAgICAvLyB0aGUgbWF4IGxhdGVuY3kgc2hvdWxkIGJlIGFib3V0IDI1bXMgd2l0aCBhbiBhdmVyYWdlIGFyb3VuZCAxMm1zICh0byBiZSB2ZXJpZmllZCkuCisgICAgICAgICAgICAvLyBGb3Igc2FmZXR5IHdlIHVzZSAxMDBtcy4KKyAgICAgICAgICAgIEFMT0dWKCJnZXRUaW1lc3RhbXA6IHJldHVybmVkIHN0YWxlIHRpbWVzdGFtcCBub3dVcyglbGxkKSBudW1GcmFtZXNQbGF5ZWRBdCglbGxkKSIsCisgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbm93VXMsIChsb25nIGxvbmcpbnVtRnJhbWVzUGxheWVkQXQpOworICAgICAgICAgICAgbnVtRnJhbWVzUGxheWVkQXQgPSBub3dVcyAtIGtTdGFsZVRpbWVzdGFtcDEwMG1zOworICAgICAgICB9CisgICAgICAgIC8vQUxPR0QoImdldFRpbWVzdGFtcDogT0sgJWQgJWxsZCIsIG51bUZyYW1lc1BsYXllZCwgKGxvbmcgbG9uZyludW1GcmFtZXNQbGF5ZWRBdCk7CisgICAgfSBlbHNlIGlmIChyZXMgPT0gV09VTERfQkxPQ0spIHsgLy8gY2FzZSAyOiB0cmFuc2l0b3J5IHN0YXRlIG9uIHN0YXJ0IG9mIGEgbmV3IHRyYWNrCisgICAgICAgIG51bUZyYW1lc1BsYXllZCA9IDA7CisgICAgICAgIG51bUZyYW1lc1BsYXllZEF0ID0gbm93VXM7CisgICAgICAgIC8vQUxPR0QoImdldFRpbWVzdGFtcDogV09VTERfQkxPQ0sgJWQgJWxsZCIsCisgICAgICAgIC8vICAgICAgICBudW1GcmFtZXNQbGF5ZWQsIChsb25nIGxvbmcpbnVtRnJhbWVzUGxheWVkQXQpOworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhc2UgMzogdHJhbnNpdG9yeSBhdCBuZXcgdHJhY2sgb3IgYXVkaW8gZmFzdCB0cmFja3MuCisgICAgICAgIHJlcyA9IG1BdWRpb1NpbmstPmdldFBvc2l0aW9uKCZudW1GcmFtZXNQbGF5ZWQpOworICAgICAgICBDSEVDS19FUShyZXMsIChzdGF0dXNfdClPSyk7CisgICAgICAgIG51bUZyYW1lc1BsYXllZEF0ID0gbm93VXM7CisgICAgICAgIG51bUZyYW1lc1BsYXllZEF0ICs9IDEwMDBMTCAqIG1BdWRpb1NpbmstPmxhdGVuY3koKSAvIDI7IC8qIFhYWCAqLworICAgICAgICAvL0FMT0dEKCJnZXRQb3NpdGlvbjogJWQgJWxsZCIsIG51bUZyYW1lc1BsYXllZCwgbnVtRnJhbWVzUGxheWVkQXQpOworICAgIH0KKworICAgIC8vIFRPRE86IHJlbW92ZSB0aGUgKGludDMyX3QpIGNhc3RpbmcgYmVsb3cgYXMgaXQgbWF5IG92ZXJmbG93IGF0IDEyLjQgaG91cnMuCisgICAgLy9DSEVDS19FUShudW1GcmFtZXNQbGF5ZWQgJiAoMSA8PCAzMSksIDApOyAgLy8gY2FuJ3QgYmUgbmVnYXRpdmUgdW50aWwgMTIuNCBocnMsIHRlc3QKKyAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPSAoaW50NjRfdCkoKGludDMyX3QpbnVtRnJhbWVzUGxheWVkICogMTAwMExMICogbUF1ZGlvU2luay0+bXNlY3NQZXJGcmFtZSgpKQorICAgICAgICAgICAgKyBub3dVcyAtIG51bUZyYW1lc1BsYXllZEF0OworICAgIGlmIChkdXJhdGlvblVzIDwgMCkgeworICAgICAgICAvLyBPY2N1cnMgd2hlbiBudW1GcmFtZXNQbGF5ZWQgcG9zaXRpb24gaXMgdmVyeSBzbWFsbCBhbmQgdGhlIGZvbGxvd2luZzoKKyAgICAgICAgLy8gKDEpIEluIGNhc2UgMSwgdGhlIHRpbWUgbm93VXMgaXMgY29tcHV0ZWQgYmVmb3JlIGdldFRpbWVzdGFtcCgpIGlzIGNhbGxlZCBhbmQKKyAgICAgICAgLy8gICAgIG51bUZyYW1lc1BsYXllZEF0IGlzIGdyZWF0ZXIgdGhhbiBub3dVcyBieSB0aW1lIG1vcmUgdGhhbiBudW1GcmFtZXNQbGF5ZWQuCisgICAgICAgIC8vICgyKSBJbiBjYXNlIDMsIHVzaW5nIGdldFBvc2l0aW9uIGFuZCBhZGRpbmcgbUF1ZGlvU2luay0+bGF0ZW5jeSgpIHRvCisgICAgICAgIC8vICAgICBudW1GcmFtZXNQbGF5ZWRBdCwgYnkgYSB0aW1lIGFtb3VudCBncmVhdGVyIHRoYW4gbnVtRnJhbWVzUGxheWVkLgorICAgICAgICAvLworICAgICAgICAvLyBCb3RoIG9mIHRoZXNlIGFyZSB0cmFuc2l0b3J5IGNvbmRpdGlvbnMuCisgICAgICAgIEFMT0dWKCJnZXRQbGF5ZWRPdXRBdWRpb0R1cmF0aW9uVXM6IG5lZ2F0aXZlIGR1cmF0aW9uICVsbGQgc2V0IHRvIHplcm8iLCAobG9uZyBsb25nKWR1cmF0aW9uVXMpOworICAgICAgICBkdXJhdGlvblVzID0gMDsKKyAgICB9CisgICAgQUxPR1YoImdldFBsYXllZE91dEF1ZGlvRHVyYXRpb25VcyglbGxkKSBub3dVcyglbGxkKSBmcmFtZXMoJXUpIGZyYW1lc0F0KCVsbGQpIiwKKyAgICAgICAgICAgIChsb25nIGxvbmcpZHVyYXRpb25VcywgKGxvbmcgbG9uZylub3dVcywgbnVtRnJhbWVzUGxheWVkLCAobG9uZyBsb25nKW51bUZyYW1lc1BsYXllZEF0KTsKKyAgICByZXR1cm4gZHVyYXRpb25VczsKK30KKwordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6Om9uQXVkaW9PZmZsb2FkVGVhckRvd24oQXVkaW9PZmZsb2FkVGVhckRvd25SZWFzb24gcmVhc29uKSB7CisgICAgaWYgKG1BdWRpb09mZmxvYWRUb3JuRG93bikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1BdWRpb09mZmxvYWRUb3JuRG93biA9IHRydWU7CisKKyAgICBpbnQ2NF90IGN1cnJlbnRQb3NpdGlvblVzOworICAgIGlmIChnZXRDdXJyZW50UG9zaXRpb24oJmN1cnJlbnRQb3NpdGlvblVzKSAhPSBPSykgeworICAgICAgICBjdXJyZW50UG9zaXRpb25VcyA9IDA7CisgICAgfQorCisgICAgbUF1ZGlvU2luay0+c3RvcCgpOworICAgIG1BdWRpb1NpbmstPmZsdXNoKCk7CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0QXVkaW9PZmZsb2FkVGVhckRvd24pOworICAgIG5vdGlmeS0+c2V0SW50NjQoInBvc2l0aW9uVXMiLCBjdXJyZW50UG9zaXRpb25Vcyk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigicmVhc29uIiwgcmVhc29uKTsKKyAgICBub3RpZnktPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnN0YXJ0QXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0KCkgeworICAgIGlmIChvZmZsb2FkaW5nQXVkaW8oKSkgeworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0QXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0LCBpZCgpKTsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1BdWRpb09mZmxvYWRQYXVzZVRpbWVvdXRHZW5lcmF0aW9uKTsKKyAgICAgICAgbXNnLT5wb3N0KGtPZmZsb2FkUGF1c2VNYXhVcyk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6Y2FuY2VsQXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0KCkgeworICAgIGlmIChvZmZsb2FkaW5nQXVkaW8oKSkgeworICAgICAgICArK21BdWRpb09mZmxvYWRQYXVzZVRpbWVvdXRHZW5lcmF0aW9uOworICAgIH0KK30KKworYm9vbCBOdVBsYXllcjo6UmVuZGVyZXI6Om9uT3BlbkF1ZGlvU2luaygKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgIGJvb2wgb2ZmbG9hZE9ubHksCisgICAgICAgIGJvb2wgaGFzVmlkZW8sCisgICAgICAgIHVpbnQzMl90IGZsYWdzKSB7CisgICAgQUxPR1YoIm9wZW5BdWRpb1Npbms6IG9mZmxvYWRPbmx5KCVkKSBvZmZsb2FkaW5nQXVkaW8oJWQpIiwKKyAgICAgICAgICAgIG9mZmxvYWRPbmx5LCBvZmZsb2FkaW5nQXVkaW8oKSk7CisgICAgYm9vbCBhdWRpb1NpbmtDaGFuZ2VkID0gZmFsc2U7CisKKyAgICBpbnQzMl90IG51bUNoYW5uZWxzOworICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJjaGFubmVsLWNvdW50IiwgJm51bUNoYW5uZWxzKSk7CisKKyAgICBpbnQzMl90IGNoYW5uZWxNYXNrOworICAgIGlmICghZm9ybWF0LT5maW5kSW50MzIoImNoYW5uZWwtbWFzayIsICZjaGFubmVsTWFzaykpIHsKKyAgICAgICAgLy8gc2lnbmFsIHRvIHRoZSBBdWRpb1NpbmsgdG8gZGVyaXZlIHRoZSBtYXNrIGZyb20gY291bnQuCisgICAgICAgIGNoYW5uZWxNYXNrID0gQ0hBTk5FTF9NQVNLX1VTRV9DSEFOTkVMX09SREVSOworICAgIH0KKworICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKKyAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigic2FtcGxlLXJhdGUiLCAmc2FtcGxlUmF0ZSkpOworCisgICAgaWYgKG9mZmxvYWRpbmdBdWRpbygpKSB7CisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgICAgIEFTdHJpbmcgbWltZTsKKyAgICAgICAgQ0hFQ0soZm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbWFwTWltZVRvQXVkaW9Gb3JtYXQoYXVkaW9Gb3JtYXQsIG1pbWUuY19zdHIoKSk7CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIkNvdWxkbid0IG1hcCBtaW1lIFwiJXNcIiB0byBhIHZhbGlkICIKKyAgICAgICAgICAgICAgICAgICAgImF1ZGlvX2Zvcm1hdCIsIG1pbWUuY19zdHIoKSk7CisgICAgICAgICAgICBvbkRpc2FibGVPZmZsb2FkQXVkaW8oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dWKCJNaW1lIFwiJXNcIiBtYXBwZWQgdG8gYXVkaW9fZm9ybWF0IDB4JXgiLAorICAgICAgICAgICAgICAgICAgICBtaW1lLmNfc3RyKCksIGF1ZGlvRm9ybWF0KTsKKworICAgICAgICAgICAgaW50IGF2Z0JpdFJhdGUgPSAtMTsKKyAgICAgICAgICAgIGZvcm1hdC0+ZmluZEludDMyKCJiaXQtcmF0ZSIsICZhdmdCaXRSYXRlKTsKKworICAgICAgICAgICAgaW50MzJfdCBhYWNQcm9maWxlID0gLTE7CisgICAgICAgICAgICBpZiAoYXVkaW9Gb3JtYXQgPT0gQVVESU9fRk9STUFUX0FBQworICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXQtPmZpbmRJbnQzMigiYWFjLXByb2ZpbGUiLCAmYWFjUHJvZmlsZSkpIHsKKyAgICAgICAgICAgICAgICAvLyBSZWRlZmluZSBBQUMgZm9ybWF0IGFzIHBlciBhYWMgcHJvZmlsZQorICAgICAgICAgICAgICAgIG1hcEFBQ1Byb2ZpbGVUb0F1ZGlvRm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBhYWNQcm9maWxlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXVkaW9fb2ZmbG9hZF9pbmZvX3Qgb2ZmbG9hZEluZm8gPSBBVURJT19JTkZPX0lOSVRJQUxJWkVSOworICAgICAgICAgICAgb2ZmbG9hZEluZm8uZHVyYXRpb25fdXMgPSAtMTsKKyAgICAgICAgICAgIGZvcm1hdC0+ZmluZEludDY0KAorICAgICAgICAgICAgICAgICAgICAiZHVyYXRpb25VcyIsICZvZmZsb2FkSW5mby5kdXJhdGlvbl91cyk7CisgICAgICAgICAgICBvZmZsb2FkSW5mby5zYW1wbGVfcmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgICAgICAgICBvZmZsb2FkSW5mby5jaGFubmVsX21hc2sgPSBjaGFubmVsTWFzazsKKyAgICAgICAgICAgIG9mZmxvYWRJbmZvLmZvcm1hdCA9IGF1ZGlvRm9ybWF0OworICAgICAgICAgICAgb2ZmbG9hZEluZm8uc3RyZWFtX3R5cGUgPSBBVURJT19TVFJFQU1fTVVTSUM7CisgICAgICAgICAgICBvZmZsb2FkSW5mby5iaXRfcmF0ZSA9IGF2Z0JpdFJhdGU7CisgICAgICAgICAgICBvZmZsb2FkSW5mby5oYXNfdmlkZW8gPSBoYXNWaWRlbzsKKyAgICAgICAgICAgIG9mZmxvYWRJbmZvLmlzX3N0cmVhbWluZyA9IHRydWU7CisKKyAgICAgICAgICAgIGlmIChtZW1jbXAoJm1DdXJyZW50T2ZmbG9hZEluZm8sICZvZmZsb2FkSW5mbywgc2l6ZW9mKG9mZmxvYWRJbmZvKSkgPT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJvcGVuQXVkaW9TaW5rOiBubyBjaGFuZ2UgaW4gb2ZmbG9hZCBtb2RlIik7CisgICAgICAgICAgICAgICAgLy8gbm8gY2hhbmdlIGZyb20gcHJldmlvdXMgY29uZmlndXJhdGlvbiwgZXZlcnl0aGluZyBvay4KKyAgICAgICAgICAgICAgICByZXR1cm4gb2ZmbG9hZGluZ0F1ZGlvKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigib3BlbkF1ZGlvU2luazogdHJ5IHRvIG9wZW4gQXVkaW9TaW5rIGluIG9mZmxvYWQgbW9kZSIpOworICAgICAgICAgICAgZmxhZ3MgfD0gQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRDsKKyAgICAgICAgICAgIGZsYWdzICY9IH5BVURJT19PVVRQVVRfRkxBR19ERUVQX0JVRkZFUjsKKyAgICAgICAgICAgIGF1ZGlvU2lua0NoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgbUF1ZGlvU2luay0+Y2xvc2UoKTsKKyAgICAgICAgICAgIGVyciA9IG1BdWRpb1NpbmstPm9wZW4oCisgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgIGF1ZGlvRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICA4IC8qIGJ1ZmZlckNvdW50ICovLAorICAgICAgICAgICAgICAgICAgICAmTnVQbGF5ZXI6OlJlbmRlcmVyOjpBdWRpb1NpbmtDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KWZsYWdzLAorICAgICAgICAgICAgICAgICAgICAmb2ZmbG9hZEluZm8pOworCisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHBsYXliYWNrIGlzIG9mZmxvYWRlZCB0byBoL3csIHdlIHBhc3MKKyAgICAgICAgICAgICAgICAvLyB0aGUgSEFMIHNvbWUgbWV0YWRhdGEgaW5mb3JtYXRpb24uCisgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byBkbyB0aGlzIGZvciBQQ00gYmVjYXVzZSBpdAorICAgICAgICAgICAgICAgIC8vIHdpbGwgYmUgZ29pbmcgdGhyb3VnaCB0aGUgQXVkaW9GbGluZ2VyIG1peGVyCisgICAgICAgICAgICAgICAgLy8gYmVmb3JlIHJlYWNoaW5nIHRoZSBoYXJkd2FyZS4KKyAgICAgICAgICAgICAgICAvLyBUT0RPCisgICAgICAgICAgICAgICAgbUN1cnJlbnRPZmZsb2FkSW5mbyA9IG9mZmxvYWRJbmZvOworICAgICAgICAgICAgICAgIGVyciA9IG1BdWRpb1NpbmstPnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgQUxPR1ZfSUYoZXJyID09IE9LLCAib3BlbkF1ZGlvU2luazogb2ZmbG9hZCBzdWNjZWVkZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAvLyBDbGVhbiB1cCwgZmFsbCBiYWNrIHRvIG5vbiBvZmZsb2FkIG1vZGUuCisgICAgICAgICAgICAgICAgbUF1ZGlvU2luay0+Y2xvc2UoKTsKKyAgICAgICAgICAgICAgICBvbkRpc2FibGVPZmZsb2FkQXVkaW8oKTsKKyAgICAgICAgICAgICAgICBtQ3VycmVudE9mZmxvYWRJbmZvID0gQVVESU9fSU5GT19JTklUSUFMSVpFUjsKKyAgICAgICAgICAgICAgICBBTE9HVigib3BlbkF1ZGlvU2luazogb2ZmbG9hZCBmYWlsZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIW9mZmxvYWRPbmx5ICYmICFvZmZsb2FkaW5nQXVkaW8oKSkgeworICAgICAgICBmbGFncyAmPSB+QVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRDsKKyAgICAgICAgQUxPR1YoIm9wZW5BdWRpb1Npbms6IG9wZW4gQXVkaW9TaW5rIGluIE5PTi1vZmZsb2FkIG1vZGUiKTsKKworICAgICAgICBhdWRpb1NpbmtDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgbUF1ZGlvU2luay0+Y2xvc2UoKTsKKyAgICAgICAgbUN1cnJlbnRPZmZsb2FkSW5mbyA9IEFVRElPX0lORk9fSU5JVElBTElaRVI7CisgICAgICAgIENIRUNLX0VRKG1BdWRpb1NpbmstPm9wZW4oCisgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAorICAgICAgICAgICAgICAgICAgICA4IC8qIGJ1ZmZlckNvdW50ICovLAorICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpZmxhZ3MpLAorICAgICAgICAgICAgICAgICAoc3RhdHVzX3QpT0spOworICAgICAgICBtQXVkaW9TaW5rLT5zdGFydCgpOworICAgIH0KKyAgICBpZiAoYXVkaW9TaW5rQ2hhbmdlZCkgeworICAgICAgICBvbkF1ZGlvU2lua0NoYW5nZWQoKTsKKyAgICB9CisKKyAgICByZXR1cm4gb2ZmbG9hZGluZ0F1ZGlvKCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpvbkNsb3NlQXVkaW9TaW5rKCkgeworICAgIG1BdWRpb1NpbmstPmNsb3NlKCk7CisgICAgbUN1cnJlbnRPZmZsb2FkSW5mbyA9IEFVRElPX0lORk9fSU5JVElBTElaRVI7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5oCmluZGV4IDkxMjRlMDMuLjdiNDZhNTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuaApAQCAtMjMsMTYgKzIzLDIyIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBQnVmZmVyOwotY2xhc3MgU29mdHdhcmVSZW5kZXJlcjsKK3N0cnVjdCBWaWRlb0ZyYW1lU2NoZWR1bGVyOwogCiBzdHJ1Y3QgTnVQbGF5ZXI6OlJlbmRlcmVyIDogcHVibGljIEFIYW5kbGVyIHsKICAgICBlbnVtIEZsYWdzIHsKICAgICAgICAgRkxBR19SRUFMX1RJTUUgPSAxLAorICAgICAgICBGTEFHX09GRkxPQURfQVVESU8gPSAyLAogICAgIH07CiAgICAgUmVuZGVyZXIoY29uc3Qgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+ICZzaW5rLAogICAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAogICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7CiAKKyAgICBzdGF0aWMgc2l6ZV90IEF1ZGlvU2lua0NhbGxiYWNrKAorICAgICAgICAgICAgTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1NpbmsgKmF1ZGlvU2luaywKKyAgICAgICAgICAgIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCB2b2lkICptZSwKKyAgICAgICAgICAgIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rOjpjYl9ldmVudF90IGV2ZW50KTsKKwogICAgIHZvaWQgcXVldWVCdWZmZXIoCiAgICAgICAgICAgICBib29sIGF1ZGlvLAogICAgICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciwKQEAgLTQ2LDE4ICs1Miw0NyBAQAogCiAgICAgdm9pZCBzaWduYWxBdWRpb1NpbmtDaGFuZ2VkKCk7CiAKKyAgICB2b2lkIHNpZ25hbERpc2FibGVPZmZsb2FkQXVkaW8oKTsKKwogICAgIHZvaWQgcGF1c2UoKTsKICAgICB2b2lkIHJlc3VtZSgpOwogCisgICAgdm9pZCBzZXRWaWRlb0ZyYW1lUmF0ZShmbG9hdCBmcHMpOworCisgICAgLy8gRm9sbG93aW5nIHNldHRlcnMgYW5kIGdldHRlcnMgYXJlIHByb3RlY3RlZCBieSBtVGltZUxvY2suCisgICAgc3RhdHVzX3QgZ2V0Q3VycmVudFBvc2l0aW9uKGludDY0X3QgKm1lZGlhVXMpOworICAgIHN0YXR1c190IGdldEN1cnJlbnRQb3NpdGlvbigKKyAgICAgICAgICAgIGludDY0X3QgKm1lZGlhVXMsIGludDY0X3Qgbm93VXMsIGJvb2wgYWxsb3dQYXN0UXVldWVkVmlkZW8gPSBmYWxzZSk7CisgICAgdm9pZCBzZXRIYXNNZWRpYShib29sIGF1ZGlvKTsKKyAgICB2b2lkIHNldEF1ZGlvRmlyc3RBbmNob3JUaW1lKGludDY0X3QgbWVkaWFVcyk7CisgICAgdm9pZCBzZXRBdWRpb0ZpcnN0QW5jaG9yVGltZUlmTmVlZGVkKGludDY0X3QgbWVkaWFVcyk7CisgICAgdm9pZCBzZXRBbmNob3JUaW1lKAorICAgICAgICAgICAgaW50NjRfdCBtZWRpYVVzLCBpbnQ2NF90IHJlYWxVcywgaW50NjRfdCBudW1GcmFtZXNXcml0dGVuID0gLTEsIGJvb2wgcmVzdW1lID0gZmFsc2UpOworICAgIHZvaWQgc2V0VmlkZW9MYXRlQnlVcyhpbnQ2NF90IGxhdGVVcyk7CisgICAgaW50NjRfdCBnZXRWaWRlb0xhdGVCeVVzKCk7CisgICAgdm9pZCBzZXRQYXVzZVN0YXJ0ZWRUaW1lUmVhbFVzKGludDY0X3QgcmVhbFVzKTsKKworICAgIGJvb2wgb3BlbkF1ZGlvU2luaygKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgYm9vbCBvZmZsb2FkT25seSwKKyAgICAgICAgICAgIGJvb2wgaGFzVmlkZW8sCisgICAgICAgICAgICB1aW50MzJfdCBmbGFncyk7CisgICAgdm9pZCBjbG9zZUF1ZGlvU2luaygpOworCiAgICAgZW51bSB7CiAgICAgICAgIGtXaGF0RU9TICAgICAgICAgICAgICAgICA9ICdlb3MgJywKICAgICAgICAga1doYXRGbHVzaENvbXBsZXRlICAgICAgID0gJ2ZsdUMnLAogICAgICAgICBrV2hhdFBvc2l0aW9uICAgICAgICAgICAgPSAncG9zaScsCiAgICAgICAgIGtXaGF0VmlkZW9SZW5kZXJpbmdTdGFydCA9ICd2ZHJkJywKICAgICAgICAga1doYXRNZWRpYVJlbmRlcmluZ1N0YXJ0ID0gJ21kcmQnLAorICAgICAgICBrV2hhdEF1ZGlvT2ZmbG9hZFRlYXJEb3duID0gJ2FPVEQnLAorICAgICAgICBrV2hhdEF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dCA9ICdhT1BUJywKICAgICB9OwogCi0gICAgdm9pZCBzZXRTb2Z0UmVuZGVyZXIoU29mdHdhcmVSZW5kZXJlciAqc29mdFJlbmRlcmVyKTsKKyAgICBlbnVtIEF1ZGlvT2ZmbG9hZFRlYXJEb3duUmVhc29uIHsKKyAgICAgICAga0R1ZVRvRXJyb3IgPSAwLAorICAgICAgICBrRHVlVG9UaW1lb3V0LAorICAgIH07CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5SZW5kZXJlcigpOwpAQCAtNjYsMTQgKzEwMSwyMCBAQAogCiBwcml2YXRlOgogICAgIGVudW0gewotICAgICAgICBrV2hhdERyYWluQXVkaW9RdWV1ZSAgICA9ICdkcmFBJywKLSAgICAgICAga1doYXREcmFpblZpZGVvUXVldWUgICAgPSAnZHJhVicsCi0gICAgICAgIGtXaGF0UXVldWVCdWZmZXIgICAgICAgID0gJ3F1ZUInLAotICAgICAgICBrV2hhdFF1ZXVlRU9TICAgICAgICAgICA9ICdxRU9TJywKLSAgICAgICAga1doYXRGbHVzaCAgICAgICAgICAgICAgPSAnZmx1cycsCi0gICAgICAgIGtXaGF0QXVkaW9TaW5rQ2hhbmdlZCAgID0gJ2F1U0MnLAotICAgICAgICBrV2hhdFBhdXNlICAgICAgICAgICAgICA9ICdwYXVzJywKLSAgICAgICAga1doYXRSZXN1bWUgICAgICAgICAgICAgPSAncmVzbScsCisgICAgICAgIGtXaGF0RHJhaW5BdWRpb1F1ZXVlICAgICA9ICdkcmFBJywKKyAgICAgICAga1doYXREcmFpblZpZGVvUXVldWUgICAgID0gJ2RyYVYnLAorICAgICAgICBrV2hhdFBvc3REcmFpblZpZGVvUXVldWUgPSAncERWUScsCisgICAgICAgIGtXaGF0UXVldWVCdWZmZXIgICAgICAgICA9ICdxdWVCJywKKyAgICAgICAga1doYXRRdWV1ZUVPUyAgICAgICAgICAgID0gJ3FFT1MnLAorICAgICAgICBrV2hhdEZsdXNoICAgICAgICAgICAgICAgPSAnZmx1cycsCisgICAgICAgIGtXaGF0QXVkaW9TaW5rQ2hhbmdlZCAgICA9ICdhdVNDJywKKyAgICAgICAga1doYXRQYXVzZSAgICAgICAgICAgICAgID0gJ3BhdXMnLAorICAgICAgICBrV2hhdFJlc3VtZSAgICAgICAgICAgICAgPSAncmVzbScsCisgICAgICAgIGtXaGF0T3BlbkF1ZGlvU2luayAgICAgICA9ICdvcG5BJywKKyAgICAgICAga1doYXRDbG9zZUF1ZGlvU2luayAgICAgID0gJ2Nsc0EnLAorICAgICAgICBrV2hhdFN0b3BBdWRpb1NpbmsgICAgICAgPSAnc3RwQScsCisgICAgICAgIGtXaGF0RGlzYWJsZU9mZmxvYWRBdWRpbyA9ICdub09BJywKKyAgICAgICAga1doYXRTZXRWaWRlb0ZyYW1lUmF0ZSAgID0gJ3NWRlInLAogICAgIH07CiAKICAgICBzdHJ1Y3QgUXVldWVFbnRyeSB7CkBAIC04MSw0NCArMTIyLDcyIEBACiAgICAgICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5Q29uc3VtZWQ7CiAgICAgICAgIHNpemVfdCBtT2Zmc2V0OwogICAgICAgICBzdGF0dXNfdCBtRmluYWxSZXN1bHQ7CisgICAgICAgIGludDMyX3QgbUJ1ZmZlck9yZGluYWw7CiAgICAgfTsKIAogICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNaW5Qb3NpdGlvblVwZGF0ZURlbGF5VXM7CiAKICAgICBzcDxNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luaz4gbUF1ZGlvU2luazsKLSAgICBTb2Z0d2FyZVJlbmRlcmVyICptU29mdFJlbmRlcmVyOwogICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5OworICAgIE11dGV4IG1Mb2NrOwogICAgIHVpbnQzMl90IG1GbGFnczsKICAgICBMaXN0PFF1ZXVlRW50cnk+IG1BdWRpb1F1ZXVlOwogICAgIExpc3Q8UXVldWVFbnRyeT4gbVZpZGVvUXVldWU7CiAgICAgdWludDMyX3QgbU51bUZyYW1lc1dyaXR0ZW47CisgICAgc3A8VmlkZW9GcmFtZVNjaGVkdWxlcj4gbVZpZGVvU2NoZWR1bGVyOwogCiAgICAgYm9vbCBtRHJhaW5BdWRpb1F1ZXVlUGVuZGluZzsKICAgICBib29sIG1EcmFpblZpZGVvUXVldWVQZW5kaW5nOwogICAgIGludDMyX3QgbUF1ZGlvUXVldWVHZW5lcmF0aW9uOwogICAgIGludDMyX3QgbVZpZGVvUXVldWVHZW5lcmF0aW9uOwogCisgICAgTXV0ZXggbVRpbWVMb2NrOworICAgIC8vIHxtVGltZUxvY2t8IHByb3RlY3RzIHRoZSBmb2xsb3dpbmcgNyBtZW1iZXIgdmFycyB0aGF0IGFyZSByZWxhdGVkIHRvIHRpbWUuCisgICAgLy8gTm90ZTogdGhvc2UgbWVtYmVycyBhcmUgb25seSB3cml0dGVuIG9uIFJlbmRlcmVyIHRocmVhZCwgc28gcmVhZGluZyBvbiBSZW5kZXJlciB0aHJlYWQKKyAgICAvLyBkb2Vzbid0IG5lZWQgdG8gYmUgcHJvdGVjdGVkLiBPdGhlcndpc2UgYWNjZXNzaW5nIHRob3NlIG1lbWJlcnMgbXVzdCBiZSBwcm90ZWN0ZWQgYnkKKyAgICAvLyB8bVRpbWVMb2NrfC4KKyAgICAvLyBUT0RPOiBtb3ZlIHRob3NlIG1lbWJlcnMgdG8gYSBzZXBlcmF0ZWQgbWVkaWEgY2xvY2sgY2xhc3MuCisgICAgaW50NjRfdCBtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzOwogICAgIGludDY0X3QgbUFuY2hvclRpbWVNZWRpYVVzOwogICAgIGludDY0X3QgbUFuY2hvclRpbWVSZWFsVXM7CisgICAgaW50NjRfdCBtQW5jaG9yTnVtRnJhbWVzV3JpdHRlbjsKKyAgICBpbnQ2NF90IG1BbmNob3JNYXhNZWRpYVVzOworICAgIGludDY0X3QgbVZpZGVvTGF0ZUJ5VXM7CisgICAgYm9vbCBtSGFzQXVkaW87CisgICAgYm9vbCBtSGFzVmlkZW87CisgICAgaW50NjRfdCBtUGF1c2VTdGFydGVkVGltZVJlYWxVczsKIAogICAgIE11dGV4IG1GbHVzaExvY2s7ICAvLyBwcm90ZWN0cyB0aGUgZm9sbG93aW5nIDIgbWVtYmVyIHZhcnMuCiAgICAgYm9vbCBtRmx1c2hpbmdBdWRpbzsKICAgICBib29sIG1GbHVzaGluZ1ZpZGVvOwogCi0gICAgYm9vbCBtSGFzQXVkaW87Ci0gICAgYm9vbCBtSGFzVmlkZW87CiAgICAgYm9vbCBtU3luY1F1ZXVlczsKIAogICAgIGJvb2wgbVBhdXNlZDsKKyAgICBib29sIG1WaWRlb1NhbXBsZVJlY2VpdmVkOwogICAgIGJvb2wgbVZpZGVvUmVuZGVyaW5nU3RhcnRlZDsKICAgICBpbnQzMl90IG1WaWRlb1JlbmRlcmluZ1N0YXJ0R2VuZXJhdGlvbjsKICAgICBpbnQzMl90IG1BdWRpb1JlbmRlcmluZ1N0YXJ0R2VuZXJhdGlvbjsKIAogICAgIGludDY0X3QgbUxhc3RQb3NpdGlvblVwZGF0ZVVzOwotICAgIGludDY0X3QgbVZpZGVvTGF0ZUJ5VXM7CisKKyAgICBpbnQzMl90IG1BdWRpb09mZmxvYWRQYXVzZVRpbWVvdXRHZW5lcmF0aW9uOworICAgIGJvb2wgbUF1ZGlvT2ZmbG9hZFRvcm5Eb3duOworICAgIGF1ZGlvX29mZmxvYWRfaW5mb190IG1DdXJyZW50T2ZmbG9hZEluZm87CisKKyAgICBpbnQzMl90IG1Ub3RhbEJ1ZmZlcnNRdWV1ZWQ7CisgICAgaW50MzJfdCBtTGFzdEF1ZGlvQnVmZmVyRHJhaW5lZDsKKworCisgICAgc2l6ZV90IGZpbGxBdWRpb0J1ZmZlcih2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKTsKIAogICAgIGJvb2wgb25EcmFpbkF1ZGlvUXVldWUoKTsKLSAgICB2b2lkIHBvc3REcmFpbkF1ZGlvUXVldWUoaW50NjRfdCBkZWxheVVzID0gMCk7CisgICAgaW50NjRfdCBnZXRQZW5kaW5nQXVkaW9QbGF5b3V0RHVyYXRpb25VcyhpbnQ2NF90IG5vd1VzKTsKKyAgICBpbnQ2NF90IGdldFBsYXllZE91dEF1ZGlvRHVyYXRpb25VcyhpbnQ2NF90IG5vd1VzKTsKKyAgICB2b2lkIHBvc3REcmFpbkF1ZGlvUXVldWVfbChpbnQ2NF90IGRlbGF5VXMgPSAwKTsKKworICAgIHZvaWQgb25OZXdBdWRpb01lZGlhVGltZShpbnQ2NF90IG1lZGlhVGltZVVzKTsKKyAgICBpbnQ2NF90IGdldFJlYWxUaW1lVXMoaW50NjRfdCBtZWRpYVRpbWVVcywgaW50NjRfdCBub3dVcyk7CiAKICAgICB2b2lkIG9uRHJhaW5WaWRlb1F1ZXVlKCk7CiAgICAgdm9pZCBwb3N0RHJhaW5WaWRlb1F1ZXVlKCk7CkBAIC0xMzAsMTggKzE5OSwzMyBAQAogICAgIHZvaWQgb25RdWV1ZUVPUyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAgICAgdm9pZCBvbkZsdXNoKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKICAgICB2b2lkIG9uQXVkaW9TaW5rQ2hhbmdlZCgpOworICAgIHZvaWQgb25EaXNhYmxlT2ZmbG9hZEF1ZGlvKCk7CiAgICAgdm9pZCBvblBhdXNlKCk7CiAgICAgdm9pZCBvblJlc3VtZSgpOworICAgIHZvaWQgb25TZXRWaWRlb0ZyYW1lUmF0ZShmbG9hdCBmcHMpOworICAgIHZvaWQgb25BdWRpb09mZmxvYWRUZWFyRG93bihBdWRpb09mZmxvYWRUZWFyRG93blJlYXNvbiByZWFzb24pOworICAgIGJvb2wgb25PcGVuQXVkaW9TaW5rKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgICAgICBib29sIG9mZmxvYWRPbmx5LAorICAgICAgICAgICAgYm9vbCBoYXNWaWRlbywKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2b2lkIG9uQ2xvc2VBdWRpb1NpbmsoKTsKIAotICAgIHZvaWQgbm90aWZ5RU9TKGJvb2wgYXVkaW8sIHN0YXR1c190IGZpbmFsUmVzdWx0KTsKKyAgICB2b2lkIG5vdGlmeUVPUyhib29sIGF1ZGlvLCBzdGF0dXNfdCBmaW5hbFJlc3VsdCwgaW50NjRfdCBkZWxheVVzID0gMCk7CiAgICAgdm9pZCBub3RpZnlGbHVzaENvbXBsZXRlKGJvb2wgYXVkaW8pOwogICAgIHZvaWQgbm90aWZ5UG9zaXRpb24oKTsKICAgICB2b2lkIG5vdGlmeVZpZGVvTGF0ZUJ5KGludDY0X3QgbGF0ZUJ5VXMpOwogICAgIHZvaWQgbm90aWZ5VmlkZW9SZW5kZXJpbmdTdGFydCgpOworICAgIHZvaWQgbm90aWZ5QXVkaW9PZmZsb2FkVGVhckRvd24oKTsKIAogICAgIHZvaWQgZmx1c2hRdWV1ZShMaXN0PFF1ZXVlRW50cnk+ICpxdWV1ZSk7CiAgICAgYm9vbCBkcm9wQnVmZmVyV2hpbGVGbHVzaGluZyhib29sIGF1ZGlvLCBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0gICAgdm9pZCBzeW5jUXVldWVzRG9uZSgpOworICAgIHZvaWQgc3luY1F1ZXVlc0RvbmVfbCgpOworCisgICAgYm9vbCBvZmZsb2FkaW5nQXVkaW8oKSBjb25zdCB7IHJldHVybiAobUZsYWdzICYgRkxBR19PRkZMT0FEX0FVRElPKSAhPSAwOyB9CisKKyAgICB2b2lkIHN0YXJ0QXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0KCk7CisgICAgdm9pZCBjYW5jZWxBdWRpb09mZmxvYWRQYXVzZVRpbWVvdXQoKTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFJlbmRlcmVyKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclNvdXJjZS5oCmluZGV4IGU1MDUzM2EuLjJmMDZjMzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclNvdXJjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclNvdXJjZS5oCkBAIC0yMSwxMSArMjEsMTUgQEAKICNpbmNsdWRlICJOdVBsYXllci5oIgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvbWVkaWFwbGF5ZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQUJ1ZmZlcjsKIHN0cnVjdCBNZXRhRGF0YTsKK3N0cnVjdCBNZWRpYUJ1ZmZlcjsKIAogc3RydWN0IE51UGxheWVyOjpTb3VyY2UgOiBwdWJsaWMgQUhhbmRsZXIgewogICAgIGVudW0gRmxhZ3MgewpAQCAtMzQsMTYgKzM4LDIwIEBACiAgICAgICAgIEZMQUdfQ0FOX1NFRUtfRk9SV0FSRCAgID0gNCwgIC8vIHRoZSAiMTAgc2VjIGZvcndhcmQgYnV0dG9uIgogICAgICAgICBGTEFHX0NBTl9TRUVLICAgICAgICAgICA9IDgsICAvLyB0aGUgInNlZWsgYmFyIgogICAgICAgICBGTEFHX0RZTkFNSUNfRFVSQVRJT04gICA9IDE2LAorICAgICAgICBGTEFHX1NFQ1VSRSAgICAgICAgICAgICA9IDMyLAogICAgIH07CiAKICAgICBlbnVtIHsKICAgICAgICAga1doYXRQcmVwYXJlZCwKICAgICAgICAga1doYXRGbGFnc0NoYW5nZWQsCiAgICAgICAgIGtXaGF0VmlkZW9TaXplQ2hhbmdlZCwKKyAgICAgICAga1doYXRCdWZmZXJpbmdVcGRhdGUsCiAgICAgICAgIGtXaGF0QnVmZmVyaW5nU3RhcnQsCiAgICAgICAgIGtXaGF0QnVmZmVyaW5nRW5kLAogICAgICAgICBrV2hhdFN1YnRpdGxlRGF0YSwKKyAgICAgICAga1doYXRUaW1lZFRleHREYXRhLAogICAgICAgICBrV2hhdFF1ZXVlRGVjb2RlclNodXRkb3duLAorICAgICAgICBrV2hhdERybU5vTGljZW5zZSwKICAgICB9OwogCiAgICAgLy8gVGhlIHByb3ZpZGVzIG1lc3NhZ2UgaXMgdXNlZCB0byBub3RpZnkgdGhlIHBsYXllciBhYm91dCB2YXJpb3VzCkBAIC01OSwyOCArNjcsNDUgQEAKICAgICB2aXJ0dWFsIHZvaWQgcGF1c2UoKSB7fQogICAgIHZpcnR1YWwgdm9pZCByZXN1bWUoKSB7fQogCisgICAgLy8gRXhwbGljaXRseSBkaXNjb25uZWN0IHRoZSB1bmRlcmxpbmcgZGF0YSBzb3VyY2UKKyAgICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdCgpIHt9CisKICAgICAvLyBSZXR1cm5zIE9LIGlmZiBtb3JlIGRhdGEgd2FzIGF2YWlsYWJsZSwKICAgICAvLyBhbiBlcnJvciBvciBFUlJPUl9FTkRfT0ZfU1RSRUFNIGlmIG5vdC4KICAgICB2aXJ0dWFsIHN0YXR1c190IGZlZWRNb3JlVFNEYXRhKCkgPSAwOwogCiAgICAgdmlydHVhbCBzcDxBTWVzc2FnZT4gZ2V0Rm9ybWF0KGJvb2wgYXVkaW8pOworICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdE1ldGEoYm9vbCAvKiBhdWRpbyAqLykgeyByZXR1cm4gTlVMTDsgfQorICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZpbGVGb3JtYXRNZXRhKCkgY29uc3QgeyByZXR1cm4gTlVMTDsgfQogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBkZXF1ZXVlQWNjZXNzVW5pdCgKICAgICAgICAgICAgIGJvb2wgYXVkaW8sIHNwPEFCdWZmZXI+ICphY2Nlc3NVbml0KSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMpIHsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldER1cmF0aW9uKGludDY0X3QgKiAvKiBkdXJhdGlvblVzICovKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrSW5mbyhQYXJjZWwqIHJlcGx5KSBjb25zdCB7CisgICAgdmlydHVhbCBzaXplX3QgZ2V0VHJhY2tDb3VudCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdmlydHVhbCBzcDxBTWVzc2FnZT4gZ2V0VHJhY2tJbmZvKHNpemVfdCAvKiB0cmFja0luZGV4ICovKSBjb25zdCB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHZpcnR1YWwgc3NpemVfdCBnZXRTZWxlY3RlZFRyYWNrKG1lZGlhX3RyYWNrX3R5cGUgLyogdHlwZSAqLykgY29uc3QgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZWxlY3RUcmFjayhzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBzZWxlY3QpIHsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNlbGVjdFRyYWNrKHNpemVfdCAvKiB0cmFja0luZGV4ICovLCBib29sIC8qIHNlbGVjdCAqLykgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZWVrVG8oaW50NjRfdCBzZWVrVGltZVVzKSB7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZWVrVG8oaW50NjRfdCAvKiBzZWVrVGltZVVzICovKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlcnMoYm9vbCAvKiBhdWRpbyAqLywgVmVjdG9yPE1lZGlhQnVmZmVyICo+ICYvKiBidWZmZXJzICovKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKQEAgLTkzLDEyICsxMTgsMTAgQEAKIAogICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAKLSAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXRNZXRhKGJvb2wgYXVkaW8pIHsgcmV0dXJuIE5VTEw7IH0KLQogICAgIHNwPEFNZXNzYWdlPiBkdXBOb3RpZnkoKSBjb25zdCB7IHJldHVybiBtTm90aWZ5LT5kdXAoKTsgfQogCiAgICAgdm9pZCBub3RpZnlGbGFnc0NoYW5nZWQodWludDMyX3QgZmxhZ3MpOwotICAgIHZvaWQgbm90aWZ5VmlkZW9TaXplQ2hhbmdlZChpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCk7CisgICAgdm9pZCBub3RpZnlWaWRlb1NpemVDaGFuZ2VkKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0ID0gTlVMTCk7CiAgICAgdm9pZCBub3RpZnlQcmVwYXJlZChzdGF0dXNfdCBlcnIgPSBPSyk7CiAKIHByaXZhdGU6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRTUFNvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRTUFNvdXJjZS5jcHAKaW5kZXggMThjZjZkMS4uZmZhY2I4ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUU1BTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFNQU291cmNlLmNwcApAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgIk15SGFuZGxlci5oIgogI2luY2x1ZGUgIlNEUExvYWRlci5oIgogCisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogCkBAIC0zMywxMiArMzQsMTQgQEAKIAogTnVQbGF5ZXI6OlJUU1BTb3VyY2U6OlJUU1BTb3VyY2UoCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAorICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICBjb25zdCBjaGFyICp1cmwsCiAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAogICAgICAgICBib29sIHVpZFZhbGlkLAogICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgIGJvb2wgaXNTRFApCiAgICAgOiBTb3VyY2Uobm90aWZ5KSwKKyAgICAgIG1IVFRQU2VydmljZShodHRwU2VydmljZSksCiAgICAgICBtVVJMKHVybCksCiAgICAgICBtVUlEVmFsaWQodWlkVmFsaWQpLAogICAgICAgbVVJRCh1aWQpLApAQCAtNjcsNiArNzAsNyBAQAogCiBOdVBsYXllcjo6UlRTUFNvdXJjZTo6flJUU1BTb3VyY2UoKSB7CiAgICAgaWYgKG1Mb29wZXIgIT0gTlVMTCkgeworICAgICAgICBtTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihpZCgpKTsKICAgICAgICAgbUxvb3Blci0+c3RvcCgpOwogICAgIH0KIH0KQEAgLTc3LDE0ICs4MSwxMyBAQAogICAgICAgICBtTG9vcGVyLT5zZXROYW1lKCJydHNwIik7CiAgICAgICAgIG1Mb29wZXItPnN0YXJ0KCk7CiAKLSAgICAgICAgbVJlZmxlY3RvciA9IG5ldyBBSGFuZGxlclJlZmxlY3RvcjxSVFNQU291cmNlPih0aGlzKTsKLSAgICAgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1SZWZsZWN0b3IpOworICAgICAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIodGhpcyk7CiAgICAgfQogCiAgICAgQ0hFQ0sobUhhbmRsZXIgPT0gTlVMTCk7CiAgICAgQ0hFQ0sobVNEUExvYWRlciA9PSBOVUxMKTsKIAotICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXROb3RpZnksIG1SZWZsZWN0b3ItPmlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXROb3RpZnksIGlkKCkpOwogCiAgICAgQ0hFQ0tfRVEobVN0YXRlLCAoaW50KURJU0NPTk5FQ1RFRCk7CiAgICAgbVN0YXRlID0gQ09OTkVDVElORzsKQEAgLTkyLDcgKzk1LDcgQEAKICAgICBpZiAobUlzU0RQKSB7CiAgICAgICAgIG1TRFBMb2FkZXIgPSBuZXcgU0RQTG9hZGVyKG5vdGlmeSwKICAgICAgICAgICAgICAgICAobUZsYWdzICYga0ZsYWdJbmNvZ25pdG8pID8gU0RQTG9hZGVyOjprRmxhZ0luY29nbml0byA6IDAsCi0gICAgICAgICAgICAgICAgbVVJRFZhbGlkLCBtVUlEKTsKKyAgICAgICAgICAgICAgICBtSFRUUFNlcnZpY2UpOwogCiAgICAgICAgIG1TRFBMb2FkZXItPmxvYWQoCiAgICAgICAgICAgICAgICAgbVVSTC5jX3N0cigpLCBtRXh0cmFIZWFkZXJzLmlzRW1wdHkoKSA/IE5VTEwgOiAmbUV4dHJhSGVhZGVycyk7CkBAIC0xMTUsNyArMTE4LDcgQEAKICAgICBpZiAobUxvb3BlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdERpc2Nvbm5lY3QsIG1SZWZsZWN0b3ItPmlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXREaXNjb25uZWN0LCBpZCgpKTsKIAogICAgIHNwPEFNZXNzYWdlPiBkdW1teTsKICAgICBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZkdW1teSk7CkBAIC0zMDIsNyArMzA1LDcgQEAKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXI6OlJUU1BTb3VyY2U6OnNlZWtUbyhpbnQ2NF90IHNlZWtUaW1lVXMpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UGVyZm9ybVNlZWssIG1SZWZsZWN0b3ItPmlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQZXJmb3JtU2VlaywgaWQoKSk7CiAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsICsrbVNlZWtHZW5lcmF0aW9uKTsKICAgICBtc2ctPnNldEludDY0KCJ0aW1lVXMiLCBzZWVrVGltZVVzKTsKICAgICBtc2ctPnBvc3QoMjAwMDAwbGwpOwpAQCAtMzUzLDcgKzM1Niw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIG9uQ29ubmVjdGVkKCk7CiAKLSAgICAgICAgICAgIG5vdGlmeVZpZGVvU2l6ZUNoYW5nZWQoMCwgMCk7CisgICAgICAgICAgICBub3RpZnlWaWRlb1NpemVDaGFuZ2VkKCk7CiAKICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKIApAQCAtNTAyLDcgKzUwNSwxMCBAQAogICAgICAgICAgICAgVHJhY2tJbmZvICppbmZvID0gJm1UcmFja3MuZWRpdEl0ZW1BdCh0cmFja0luZGV4KTsKICAgICAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNvdXJjZSA9IGluZm8tPm1Tb3VyY2U7CiAgICAgICAgICAgICBpZiAoc291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBzb3VyY2UtPnF1ZXVlRGlzY29udGludWl0eShBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfU0VFSywgTlVMTCk7CisgICAgICAgICAgICAgICAgc291cmNlLT5xdWV1ZURpc2NvbnRpbnVpdHkoCisgICAgICAgICAgICAgICAgICAgICAgICBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfU0VFSywKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGRpc2NhcmQgKi8pOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBicmVhazsKQEAgLTYwNyw3ICs2MTMsNyBAQAogICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBmaW5kIHVybCBpbiBTRFAiKTsKICAgICAgICAgICAgIGVyciA9IFVOS05PV05fRVJST1I7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0Tm90aWZ5LCBtUmVmbGVjdG9yLT5pZCgpKTsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXROb3RpZnksIGlkKCkpOwogCiAgICAgICAgICAgICBtSGFuZGxlciA9IG5ldyBNeUhhbmRsZXIocnRzcFVyaS5jX3N0cigpLCBub3RpZnksIG1VSURWYWxpZCwgbVVJRCk7CiAgICAgICAgICAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUU1BTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFNQU291cmNlLmgKaW5kZXggOGNmMzRhMC4uZjFjYWU1MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUU1BTb3VyY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRTUFNvdXJjZS5oCkBAIC0yMiw4ICsyMiw2IEBACiAKICNpbmNsdWRlICJBVFNQYXJzZXIuaCIKIAotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXJSZWZsZWN0b3IuaD4KLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQUxvb3BlcjsKQEAgLTM0LDYgKzMyLDcgQEAKIHN0cnVjdCBOdVBsYXllcjo6UlRTUFNvdXJjZSA6IHB1YmxpYyBOdVBsYXllcjo6U291cmNlIHsKICAgICBSVFNQU291cmNlKAogICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCiAgICAgICAgICAgICBib29sIHVpZFZhbGlkID0gZmFsc2UsCkBAIC04OCw2ICs4Nyw3IEBACiAgICAgICAgIGJvb2wgbU5QVE1hcHBpbmdWYWxpZDsKICAgICB9OwogCisgICAgc3A8SU1lZGlhSFRUUFNlcnZpY2U+IG1IVFRQU2VydmljZTsKICAgICBBU3RyaW5nIG1VUkw7CiAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbUV4dHJhSGVhZGVyczsKICAgICBib29sIG1VSURWYWxpZDsKQEAgLTEwMCw3ICsxMDAsNiBAQAogICAgIGJvb2wgbUJ1ZmZlcmluZzsKIAogICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7Ci0gICAgc3A8QUhhbmRsZXJSZWZsZWN0b3I8UlRTUFNvdXJjZT4gPiBtUmVmbGVjdG9yOwogICAgIHNwPE15SGFuZGxlcj4gbUhhbmRsZXI7CiAgICAgc3A8U0RQTG9hZGVyPiBtU0RQTG9hZGVyOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvU3RyZWFtaW5nU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9TdHJlYW1pbmdTb3VyY2UuY3BwCmluZGV4IDI4ZjBkNTAuLjJlOWEyOWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9TdHJlYW1pbmdTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9TdHJlYW1pbmdTb3VyY2UuY3BwCkBAIC00NCw3ICs0NCw3IEBACiB9CiAKIHZvaWQgTnVQbGF5ZXI6OlN0cmVhbWluZ1NvdXJjZTo6cHJlcGFyZUFzeW5jKCkgewotICAgIG5vdGlmeVZpZGVvU2l6ZUNoYW5nZWQoMCwgMCk7CisgICAgbm90aWZ5VmlkZW9TaXplQ2hhbmdlZCgpOwogICAgIG5vdGlmeUZsYWdzQ2hhbmdlZCgwKTsKICAgICBub3RpZnlQcmVwYXJlZCgpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL21wNC9NUDRTb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL21wNC9NUDRTb3VyY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzFkOTQ3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9tcDQvTVA0U291cmNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIk1QNFNvdXJjZS5oIgotCi0jaW5jbHVkZSAiRnJhZ21lbnRlZE1QNFBhcnNlci5oIgotI2luY2x1ZGUgIi4uL051UGxheWVyU3RyZWFtTGlzdGVuZXIuaCIKLQotI2luY2x1ZGUgPG1lZGlhL0lTdHJlYW1Tb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBTdHJlYW1Tb3VyY2UgOiBwdWJsaWMgRnJhZ21lbnRlZE1QNFBhcnNlcjo6U291cmNlIHsKLSAgICBTdHJlYW1Tb3VyY2UoY29uc3Qgc3A8SVN0cmVhbVNvdXJjZT4gJnNvdXJjZSkKLSAgICAgICAgOiBtTGlzdGVuZXIobmV3IE51UGxheWVyOjpOdVBsYXllclN0cmVhbUxpc3RlbmVyKHNvdXJjZSwgMCkpLAotICAgICAgICAgIG1Qb3NpdGlvbigwKSB7Ci0gICAgICAgIG1MaXN0ZW5lci0+c3RhcnQoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgICAgICBpZiAob2Zmc2V0IDwgbVBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVQSVBFOwotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKG9mZnNldCA+IG1Qb3NpdGlvbikgewotICAgICAgICAgICAgY2hhciBidWZmZXJbMTAyNF07Ci0gICAgICAgICAgICBvZmY2NF90IHNraXBCeXRlcyA9IG9mZnNldCAtIG1Qb3NpdGlvbjsKLSAgICAgICAgICAgIGlmIChza2lwQnl0ZXMgPiBzaXplb2YoYnVmZmVyKSkgewotICAgICAgICAgICAgICAgIHNraXBCeXRlcyA9IHNpemVvZihidWZmZXIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gZXh0cmE7Ci0gICAgICAgICAgICBzc2l6ZV90IG47Ci0gICAgICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICAgICAgbiA9IG1MaXN0ZW5lci0+cmVhZChidWZmZXIsIHNraXBCeXRlcywgJmV4dHJhKTsKLQotICAgICAgICAgICAgICAgIGlmIChuID09IC1FV09VTERCTE9DSykgewotICAgICAgICAgICAgICAgICAgICB1c2xlZXAoMTAwMDApOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQUxPR1YoInNraXBwZWQgJWxkIGJ5dGVzIGF0IG9mZnNldCAlbGxkIiwgbiwgbVBvc2l0aW9uKTsKLQotICAgICAgICAgICAgaWYgKG4gPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1Qb3NpdGlvbiArPSBuOwotICAgICAgICB9Ci0KLSAgICAgICAgc3A8QU1lc3NhZ2U+IGV4dHJhOwotICAgICAgICBzaXplX3QgdG90YWwgPSAwOwotICAgICAgICB3aGlsZSAodG90YWwgPCBzaXplKSB7Ci0gICAgICAgICAgICBzc2l6ZV90IG4gPSBtTGlzdGVuZXItPnJlYWQoCi0gICAgICAgICAgICAgICAgICAgICh1aW50OF90ICopZGF0YSArIHRvdGFsLCBzaXplIC0gdG90YWwsICZleHRyYSk7Ci0KLSAgICAgICAgICAgIGlmIChuID09IC1FV09VTERCTE9DSykgewotICAgICAgICAgICAgICAgIHVzbGVlcCgxMDAwMCk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG4gPT0gMCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBlbHNlIGlmIChuIDwgMCkgewotICAgICAgICAgICAgICAgIG1Qb3NpdGlvbiArPSB0b3RhbDsKLSAgICAgICAgICAgICAgICByZXR1cm4gbjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdG90YWwgKz0gbjsKLSAgICAgICAgfQotCi0gICAgICAgIEFMT0dWKCJyZWFkICVsZCBieXRlcyBhdCBvZmZzZXQgJWxsZCIsIG4sIG1Qb3NpdGlvbik7Ci0KLSAgICAgICAgbVBvc2l0aW9uICs9IHRvdGFsOwotCi0gICAgICAgIHJldHVybiB0b3RhbDsKLSAgICB9Ci0KLSAgICBib29sIGlzU2Vla2FibGUoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgc3A8TnVQbGF5ZXI6Ok51UGxheWVyU3RyZWFtTGlzdGVuZXI+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+bUJ1ZmZlciwgcGFydDIgPDwgbUJpdFNoaWZ0KTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoKGNoYXIgKikgYnVmZmVyICsgKHBhcnQxICogbUZyYW1lU2l6ZSksIG1QaXBlLT5tQnVmZmVyLCBwYXJ0MiAqIG1GcmFtZVNpemUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIG1QaXBlLT51cGRhdGVGcm9udEFuZE5SUFRTKHJlZCArIG1QaXBlLT5tRnJvbnQsIG5leHRSZWFkUFRTKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL05CQUlPLmNwcCBiL21lZGlhL2xpYm5iYWlvL05CQUlPLmNwcAppbmRleCBlMGQyYzIxLi5kNjQxZTc0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9OQkFJTy5jcHAKKysrIGIvbWVkaWEvbGlibmJhaW8vTkJBSU8uY3BwCkBAIC0yMiwxMTkgKzIyLDQyIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc2l6ZV90IEZvcm1hdF9mcmFtZVNpemUoTkJBSU9fRm9ybWF0IGZvcm1hdCkKK3NpemVfdCBGb3JtYXRfZnJhbWVTaXplKGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0KQogewotICAgIHJldHVybiBGb3JtYXRfY2hhbm5lbENvdW50KGZvcm1hdCkgKiBzaXplb2Yoc2hvcnQpOworICAgIHJldHVybiBmb3JtYXQubUZyYW1lU2l6ZTsKIH0KIAotc2l6ZV90IEZvcm1hdF9mcmFtZUJpdFNoaWZ0KE5CQUlPX0Zvcm1hdCBmb3JtYXQpCitjb25zdCBOQkFJT19Gb3JtYXQgRm9ybWF0X0ludmFsaWQgPSB7IDAsIDAsIEFVRElPX0ZPUk1BVF9JTlZBTElELCAwIH07CisKK3Vuc2lnbmVkIEZvcm1hdF9zYW1wbGVSYXRlKGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0KQogewotICAgIC8vIHNpemVvZihzaG9ydCkgPT0gMiwgc28gZnJhbWUgc2l6ZSA9PSAxIDw8IGNoYW5uZWxzCi0gICAgcmV0dXJuIEZvcm1hdF9jaGFubmVsQ291bnQoZm9ybWF0KTsKKyAgICBpZiAoIUZvcm1hdF9pc1ZhbGlkKGZvcm1hdCkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBmb3JtYXQubVNhbXBsZVJhdGU7CiB9CiAKLWVudW0gewotICAgIEZvcm1hdF9TUl84MDAwLAotICAgIEZvcm1hdF9TUl8xMTAyNSwKLSAgICBGb3JtYXRfU1JfMTYwMDAsCi0gICAgRm9ybWF0X1NSXzIyMDUwLAotICAgIEZvcm1hdF9TUl8yNDAwMCwKLSAgICBGb3JtYXRfU1JfMzIwMDAsCi0gICAgRm9ybWF0X1NSXzQ0MTAwLAotICAgIEZvcm1hdF9TUl80ODAwMCwKLSAgICBGb3JtYXRfU1JfTWFzayA9IDcKLX07Ci0KLWVudW0gewotICAgIEZvcm1hdF9DXzEgPSAweDA4LAotICAgIEZvcm1hdF9DXzIgPSAweDEwLAotICAgIEZvcm1hdF9DX01hc2sgPSAweDE4Ci19OwotCi11bnNpZ25lZCBGb3JtYXRfc2FtcGxlUmF0ZShOQkFJT19Gb3JtYXQgZm9ybWF0KQordW5zaWduZWQgRm9ybWF0X2NoYW5uZWxDb3VudChjb25zdCBOQkFJT19Gb3JtYXQmIGZvcm1hdCkKIHsKLSAgICBpZiAoZm9ybWF0ID09IEZvcm1hdF9JbnZhbGlkKSB7CisgICAgaWYgKCFGb3JtYXRfaXNWYWxpZChmb3JtYXQpKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICBzd2l0Y2ggKGZvcm1hdCAmIEZvcm1hdF9TUl9NYXNrKSB7Ci0gICAgY2FzZSBGb3JtYXRfU1JfODAwMDoKLSAgICAgICAgcmV0dXJuIDgwMDA7Ci0gICAgY2FzZSBGb3JtYXRfU1JfMTEwMjU6Ci0gICAgICAgIHJldHVybiAxMTAyNTsKLSAgICBjYXNlIEZvcm1hdF9TUl8xNjAwMDoKLSAgICAgICAgcmV0dXJuIDE2MDAwOwotICAgIGNhc2UgRm9ybWF0X1NSXzIyMDUwOgotICAgICAgICByZXR1cm4gMjIwNTA7Ci0gICAgY2FzZSBGb3JtYXRfU1JfMjQwMDA6Ci0gICAgICAgIHJldHVybiAyNDAwMDsKLSAgICBjYXNlIEZvcm1hdF9TUl8zMjAwMDoKLSAgICAgICAgcmV0dXJuIDMyMDAwOwotICAgIGNhc2UgRm9ybWF0X1NSXzQ0MTAwOgotICAgICAgICByZXR1cm4gNDQxMDA7Ci0gICAgY2FzZSBGb3JtYXRfU1JfNDgwMDA6Ci0gICAgICAgIHJldHVybiA0ODAwMDsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gMDsKLSAgICB9CisgICAgcmV0dXJuIGZvcm1hdC5tQ2hhbm5lbENvdW50OwogfQogCi11bnNpZ25lZCBGb3JtYXRfY2hhbm5lbENvdW50KE5CQUlPX0Zvcm1hdCBmb3JtYXQpCitOQkFJT19Gb3JtYXQgRm9ybWF0X2Zyb21fU1JfQyh1bnNpZ25lZCBzYW1wbGVSYXRlLCB1bnNpZ25lZCBjaGFubmVsQ291bnQsCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkKIHsKLSAgICBpZiAoZm9ybWF0ID09IEZvcm1hdF9JbnZhbGlkKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBzd2l0Y2ggKGZvcm1hdCAmIEZvcm1hdF9DX01hc2spIHsKLSAgICBjYXNlIEZvcm1hdF9DXzE6Ci0gICAgICAgIHJldHVybiAxOwotICAgIGNhc2UgRm9ybWF0X0NfMjoKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi1OQkFJT19Gb3JtYXQgRm9ybWF0X2Zyb21fU1JfQyh1bnNpZ25lZCBzYW1wbGVSYXRlLCB1bnNpZ25lZCBjaGFubmVsQ291bnQpCi17Ci0gICAgTkJBSU9fRm9ybWF0IGZvcm1hdDsKLSAgICBzd2l0Y2ggKHNhbXBsZVJhdGUpIHsKLSAgICBjYXNlIDgwMDA6Ci0gICAgICAgIGZvcm1hdCA9IEZvcm1hdF9TUl84MDAwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDExMDI1OgotICAgICAgICBmb3JtYXQgPSBGb3JtYXRfU1JfMTEwMjU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMTYwMDA6Ci0gICAgICAgIGZvcm1hdCA9IEZvcm1hdF9TUl8xNjAwMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyMjA1MDoKLSAgICAgICAgZm9ybWF0ID0gRm9ybWF0X1NSXzIyMDUwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDI0MDAwOgotICAgICAgICBmb3JtYXQgPSBGb3JtYXRfU1JfMjQwMDA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMzIwMDA6Ci0gICAgICAgIGZvcm1hdCA9IEZvcm1hdF9TUl8zMjAwMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0NDEwMDoKLSAgICAgICAgZm9ybWF0ID0gRm9ybWF0X1NSXzQ0MTAwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDQ4MDAwOgotICAgICAgICBmb3JtYXQgPSBGb3JtYXRfU1JfNDgwMDA7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6CisgICAgaWYgKHNhbXBsZVJhdGUgPT0gMCB8fCBjaGFubmVsQ291bnQgPT0gMCB8fCAhYXVkaW9faXNfdmFsaWRfZm9ybWF0KGZvcm1hdCkpIHsKICAgICAgICAgcmV0dXJuIEZvcm1hdF9JbnZhbGlkOwogICAgIH0KLSAgICBzd2l0Y2ggKGNoYW5uZWxDb3VudCkgewotICAgIGNhc2UgMToKLSAgICAgICAgZm9ybWF0IHw9IEZvcm1hdF9DXzE7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgICAgZm9ybWF0IHw9IEZvcm1hdF9DXzI7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBGb3JtYXRfSW52YWxpZDsKLSAgICB9Ci0gICAgcmV0dXJuIGZvcm1hdDsKKyAgICBOQkFJT19Gb3JtYXQgcmV0OworICAgIHJldC5tU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgcmV0Lm1DaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQ7CisgICAgcmV0Lm1Gb3JtYXQgPSBmb3JtYXQ7CisgICAgcmV0Lm1GcmFtZVNpemUgPSBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkgPworICAgICAgICAgICAgY2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpIDogc2l6ZW9mKHVpbnQ4X3QpOworICAgIHJldHVybiByZXQ7CiB9CiAKIC8vIFRoaXMgaXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uOyBpdCBpcyBleHBlY3RlZCB0aGF0IHN1YmNsYXNzZXMgd2lsbCBvcHRpbWl6ZSB0aGlzLgpAQCAtMjE0LDExICsxMzcsMTEgQEAKIHNzaXplX3QgTkJBSU9fUG9ydDo6bmVnb3RpYXRlKGNvbnN0IE5CQUlPX0Zvcm1hdCBvZmZlcnNbXSwgc2l6ZV90IG51bU9mZmVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQkFJT19Gb3JtYXQgY291bnRlck9mZmVyc1tdLCBzaXplX3QmIG51bUNvdW50ZXJPZmZlcnMpCiB7Ci0gICAgQUxPR1YoIm5lZ290aWF0ZSBvZmZlcnM9JXAgbnVtT2ZmZXJzPSV1IGNvdW50ZXJzT2ZmZXJzPSVwIG51bUNvdW50ZXJPZmZlcnM9JXUiLAorICAgIEFMT0dWKCJuZWdvdGlhdGUgb2ZmZXJzPSVwIG51bU9mZmVycz0lenUgY291bnRlcnNPZmZlcnM9JXAgbnVtQ291bnRlck9mZmVycz0lenUiLAogICAgICAgICAgICAgb2ZmZXJzLCBudW1PZmZlcnMsIGNvdW50ZXJPZmZlcnMsIG51bUNvdW50ZXJPZmZlcnMpOwotICAgIGlmIChtRm9ybWF0ICE9IEZvcm1hdF9JbnZhbGlkKSB7CisgICAgaWYgKEZvcm1hdF9pc1ZhbGlkKG1Gb3JtYXQpKSB7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtT2ZmZXJzOyArK2kpIHsKLSAgICAgICAgICAgIGlmIChvZmZlcnNbaV0gPT0gbUZvcm1hdCkgeworICAgICAgICAgICAgaWYgKEZvcm1hdF9pc0VxdWFsKG9mZmVyc1tpXSwgbUZvcm1hdCkpIHsKICAgICAgICAgICAgICAgICBtTmVnb3RpYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICB9CkBAIC0yMzMsNCArMTU2LDE3IEBACiAgICAgcmV0dXJuIChzc2l6ZV90KSBORUdPVElBVEU7CiB9CiAKK2Jvb2wgRm9ybWF0X2lzVmFsaWQoY29uc3QgTkJBSU9fRm9ybWF0JiBmb3JtYXQpCit7CisgICAgcmV0dXJuIGZvcm1hdC5tU2FtcGxlUmF0ZSAhPSAwICYmIGZvcm1hdC5tQ2hhbm5lbENvdW50ICE9IDAgJiYKKyAgICAgICAgICAgIGZvcm1hdC5tRm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9JTlZBTElEICYmIGZvcm1hdC5tRnJhbWVTaXplICE9IDA7Cit9CisKK2Jvb2wgRm9ybWF0X2lzRXF1YWwoY29uc3QgTkJBSU9fRm9ybWF0JiBmb3JtYXQxLCBjb25zdCBOQkFJT19Gb3JtYXQmIGZvcm1hdDIpCit7CisgICAgcmV0dXJuIGZvcm1hdDEubVNhbXBsZVJhdGUgPT0gZm9ybWF0Mi5tU2FtcGxlUmF0ZSAmJgorICAgICAgICAgICAgZm9ybWF0MS5tQ2hhbm5lbENvdW50ID09IGZvcm1hdDIubUNoYW5uZWxDb3VudCAmJiBmb3JtYXQxLm1Gb3JtYXQgPT0gZm9ybWF0Mi5tRm9ybWF0ICYmCisgICAgICAgICAgICBmb3JtYXQxLm1GcmFtZVNpemUgPT0gZm9ybWF0Mi5tRnJhbWVTaXplOworfQorCiB9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL05CTG9nLmNwcCBiL21lZGlhL2xpYm5iYWlvL05CTG9nLmNwcAppbmRleCAwNDViZjY0Li40ZDE0OTA0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9OQkxvZy5jcHAKKysrIGIvbWVkaWEvbGlibmJhaW8vTkJMb2cuY3BwCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgogI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTMzNywyNSArMzM4LDI1IEBACiAgICAgICAgIH0KICAgICAgICAgaSAtPSBsZW5ndGggKyAzOwogICAgIH0KLSAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgbG9zdCArPSBpOwotICAgICAgICBpZiAoZmQgPj0gMCkgewotICAgICAgICAgICAgZmRwcmludGYoZmQsICIlKnN3YXJuaW5nOiBsb3N0ICV1IGJ5dGVzIHdvcnRoIG9mIGV2ZW50c1xuIiwgaW5kZW50LCAiIiwgbG9zdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HSSgiJSpzd2FybmluZzogbG9zdCAldSBieXRlcyB3b3J0aCBvZiBldmVudHNcbiIsIGluZGVudCwgIiIsIGxvc3QpOwotICAgICAgICB9CisgICAgbUZkID0gZmQ7CisgICAgbUluZGVudCA9IGluZGVudDsKKyAgICBTdHJpbmc4IHRpbWVzdGFtcCwgYm9keTsKKyAgICBsb3N0ICs9IGk7CisgICAgaWYgKGxvc3QgPiAwKSB7CisgICAgICAgIGJvZHkuYXBwZW5kRm9ybWF0KCJ3YXJuaW5nOiBsb3N0ICV6dSBieXRlcyB3b3J0aCBvZiBldmVudHMiLCBsb3N0KTsKKyAgICAgICAgLy8gVE9ETyB0aW1lc3RhbXAgZW1wdHkgaGVyZSwgb25seSBvdGhlciBjaG9pY2UgdG8gd2FpdCBmb3IgdGhlIGZpcnN0IHRpbWVzdGFtcCBldmVudCBpbiB0aGUKKyAgICAgICAgLy8gICAgICBsb2cgdG8gcHVzaCBpdCBvdXQuICBDb25zaWRlciBrZWVwaW5nIHRoZSB0aW1lc3RhbXAvYm9keSBiZXR3ZWVuIGNhbGxzIHRvIHJlYWRBdCgpLgorICAgICAgICBkdW1wTGluZSh0aW1lc3RhbXAsIGJvZHkpOwogICAgIH0KICAgICBzaXplX3Qgd2lkdGggPSAxOwogICAgIHdoaWxlIChtYXhTZWMgPj0gMTApIHsKICAgICAgICAgKyt3aWR0aDsKICAgICAgICAgbWF4U2VjIC89IDEwOwogICAgIH0KLSAgICBjaGFyIHByZWZpeFszMl07CiAgICAgaWYgKG1heFNlYyA+PSAwKSB7Ci0gICAgICAgIHNucHJpbnRmKHByZWZpeCwgc2l6ZW9mKHByZWZpeCksICJbJSpzXSAiLCB3aWR0aCArIDQsICIiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBwcmVmaXhbMF0gPSAnXDAnOworICAgICAgICB0aW1lc3RhbXAuYXBwZW5kRm9ybWF0KCJbJSpzXSIsIChpbnQpIHdpZHRoICsgNCwgIiIpOwogICAgIH0KKyAgICBib29sIGRlZmVycmVkVGltZXN0YW1wID0gZmFsc2U7CiAgICAgd2hpbGUgKGkgPCBhdmFpbCkgewogICAgICAgICBldmVudCA9IChFdmVudCkgY29weVtpXTsKICAgICAgICAgbGVuZ3RoID0gY29weVtpICsgMV07CkBAIC0zNjMsMTEgKzM2NCw4IEBACiAgICAgICAgIHNpemVfdCBhZHZhbmNlID0gbGVuZ3RoICsgMzsKICAgICAgICAgc3dpdGNoIChldmVudCkgewogICAgICAgICBjYXNlIEVWRU5UX1NUUklORzoKLSAgICAgICAgICAgIGlmIChmZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgZmRwcmludGYoZmQsICIlKnMlcyUuKnNcbiIsIGluZGVudCwgIiIsIHByZWZpeCwgbGVuZ3RoLCAoY29uc3QgY2hhciAqKSBkYXRhKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR0koIiUqcyVzJS4qcyIsIGluZGVudCwgIiIsIHByZWZpeCwgbGVuZ3RoLCAoY29uc3QgY2hhciAqKSBkYXRhKTsKLSAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgiJS4qcyIsIChpbnQpIGxlbmd0aCwgKGNvbnN0IGNoYXIgKikgZGF0YSk7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBFVkVOVF9USU1FU1RBTVA6IHsKICAgICAgICAgICAgIC8vIGFscmVhZHkgY2hlY2tlZCB0aGF0IGxlbmd0aCA9PSBzaXplb2Yoc3RydWN0IHRpbWVzcGVjKTsKICAgICAgICAgICAgIG1lbWNweSgmdHMsIGRhdGEsIHNpemVvZihzdHJ1Y3QgdGltZXNwZWMpKTsKQEAgLTQwMCw0OCArMzk4LDU2IEBACiAgICAgICAgICAgICAgICAgcHJldk5zZWMgPSB0c05leHQudHZfbnNlYzsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNpemVfdCBuID0gKGogLSBpKSAvIChzaXplb2Yoc3RydWN0IHRpbWVzcGVjKSArIDMpOworICAgICAgICAgICAgaWYgKGRlZmVycmVkVGltZXN0YW1wKSB7CisgICAgICAgICAgICAgICAgZHVtcExpbmUodGltZXN0YW1wLCBib2R5KTsKKyAgICAgICAgICAgICAgICBkZWZlcnJlZFRpbWVzdGFtcCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGltZXN0YW1wLmNsZWFyKCk7CiAgICAgICAgICAgICBpZiAobiA+PSBrU3F1YXNoVGltZXN0YW1wKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZkID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZmRwcmludGYoZmQsICIlKnNbJWQuJTAzZCB0byAuJS4wM2QgYnkgLiUuMDNkIHRvIC4lLjAzZF1cbiIsIGluZGVudCwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgdHMudHZfc2VjLCAoaW50KSAodHMudHZfbnNlYyAvIDEwMDAwMDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpICgodHMudHZfbnNlYyArIGRlbHRhVG90YWwpIC8gMTAwMDAwMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKGRlbHRhTWluIC8gMTAwMDAwMCksIChpbnQpIChkZWx0YU1heCAvIDEwMDAwMDApKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HSSgiJSpzWyVkLiUwM2QgdG8gLiUuMDNkIGJ5IC4lLjAzZCB0byAuJS4wM2RdXG4iLCBpbmRlbnQsICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIHRzLnR2X3NlYywgKGludCkgKHRzLnR2X25zZWMgLyAxMDAwMDAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAoKHRzLnR2X25zZWMgKyBkZWx0YVRvdGFsKSAvIDEwMDAwMDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIChkZWx0YU1pbiAvIDEwMDAwMDApLCAoaW50KSAoZGVsdGFNYXggLyAxMDAwMDAwKSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5hcHBlbmRGb3JtYXQoIlslZC4lMDNkIHRvIC4lLjAzZCBieSAuJS4wM2QgdG8gLiUuMDNkXSIsCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSB0cy50dl9zZWMsIChpbnQpICh0cy50dl9uc2VjIC8gMTAwMDAwMCksCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAoKHRzLnR2X25zZWMgKyBkZWx0YVRvdGFsKSAvIDEwMDAwMDApLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKGRlbHRhTWluIC8gMTAwMDAwMCksIChpbnQpIChkZWx0YU1heCAvIDEwMDAwMDApKTsKICAgICAgICAgICAgICAgICBpID0gajsKICAgICAgICAgICAgICAgICBhZHZhbmNlID0gMDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChmZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgZmRwcmludGYoZmQsICIlKnNbJWQuJTAzZF1cbiIsIGluZGVudCwgIiIsIChpbnQpIHRzLnR2X3NlYywKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpICh0cy50dl9uc2VjIC8gMTAwMDAwMCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HSSgiJSpzWyVkLiUwM2RdIiwgaW5kZW50LCAiIiwgKGludCkgdHMudHZfc2VjLAotICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKHRzLnR2X25zZWMgLyAxMDAwMDAwKSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICB0aW1lc3RhbXAuYXBwZW5kRm9ybWF0KCJbJWQuJTAzZF0iLCAoaW50KSB0cy50dl9zZWMsCisgICAgICAgICAgICAgICAgICAgIChpbnQpICh0cy50dl9uc2VjIC8gMTAwMDAwMCkpOworICAgICAgICAgICAgZGVmZXJyZWRUaW1lc3RhbXAgPSB0cnVlOwogICAgICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBFVkVOVF9SRVNFUlZFRDoKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlmIChmZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgZmRwcmludGYoZmQsICIlKnMlc3dhcm5pbmc6IHVua25vd24gZXZlbnQgJWRcbiIsIGluZGVudCwgIiIsIHByZWZpeCwgZXZlbnQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HSSgiJSpzJXN3YXJuaW5nOiB1bmtub3duIGV2ZW50ICVkIiwgaW5kZW50LCAiIiwgcHJlZml4LCBldmVudCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgid2FybmluZzogdW5rbm93biBldmVudCAlZCIsIGV2ZW50KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGkgKz0gYWR2YW5jZTsKKworICAgICAgICBpZiAoIWJvZHkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBkdW1wTGluZSh0aW1lc3RhbXAsIGJvZHkpOworICAgICAgICAgICAgZGVmZXJyZWRUaW1lc3RhbXAgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZGVmZXJyZWRUaW1lc3RhbXApIHsKKyAgICAgICAgZHVtcExpbmUodGltZXN0YW1wLCBib2R5KTsKICAgICB9CiAgICAgLy8gRklYTUUgaXQgd291bGQgYmUgbW9yZSBlZmZpY2llbnQgdG8gcHV0IGEgY2hhciBtQ29weVsyNTZdIGFzIGEgbWVtYmVyIHZhcmlhYmxlIG9mIHRoZSBkdW1wZXIKICAgICBkZWxldGVbXSBjb3B5OwogfQogCit2b2lkIE5CTG9nOjpSZWFkZXI6OmR1bXBMaW5lKGNvbnN0IFN0cmluZzgmIHRpbWVzdGFtcCwgU3RyaW5nOCYgYm9keSkKK3sKKyAgICBpZiAobUZkID49IDApIHsKKyAgICAgICAgZHByaW50ZihtRmQsICIlLipzJXMgJXNcbiIsIG1JbmRlbnQsICIiLCB0aW1lc3RhbXAuc3RyaW5nKCksIGJvZHkuc3RyaW5nKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dJKCIlLipzJXMgJXMiLCBtSW5kZW50LCAiIiwgdGltZXN0YW1wLnN0cmluZygpLCBib2R5LnN0cmluZygpKTsKKyAgICB9CisgICAgYm9keS5jbGVhcigpOworfQorCiBib29sIE5CTG9nOjpSZWFkZXI6OmlzSU1lbW9yeShjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSkgY29uc3QKIHsKLSAgICByZXR1cm4gaU1lbW9yeS5nZXQoKSA9PSBtSU1lbW9yeS5nZXQoKTsKKyAgICByZXR1cm4gaU1lbW9yeSAhPSAwICYmIG1JTWVtb3J5ICE9IDAgJiYgaU1lbW9yeS0+cG9pbnRlcigpID09IG1JTWVtb3J5LT5wb2ludGVyKCk7CiB9CiAKIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vUGlwZS5jcHAgYi9tZWRpYS9saWJuYmFpby9QaXBlLmNwcAppbmRleCAxYzIxZjljLi42ZTBlYzhjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9QaXBlLmNwcAorKysgYi9tZWRpYS9saWJuYmFpby9QaXBlLmNwcApAQCAtMjUsMTkgKzI1LDIyIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotUGlwZTo6UGlwZShzaXplX3QgbWF4RnJhbWVzLCBOQkFJT19Gb3JtYXQgZm9ybWF0KSA6CitQaXBlOjpQaXBlKHNpemVfdCBtYXhGcmFtZXMsIGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0LCB2b2lkICpidWZmZXIpIDoKICAgICAgICAgTkJBSU9fU2luayhmb3JtYXQpLAogICAgICAgICBtTWF4RnJhbWVzKHJvdW5kdXAobWF4RnJhbWVzKSksCi0gICAgICAgIG1CdWZmZXIobWFsbG9jKG1NYXhGcmFtZXMgKiBGb3JtYXRfZnJhbWVTaXplKGZvcm1hdCkpKSwKKyAgICAgICAgbUJ1ZmZlcihidWZmZXIgPT0gTlVMTCA/IG1hbGxvYyhtTWF4RnJhbWVzICogRm9ybWF0X2ZyYW1lU2l6ZShmb3JtYXQpKSA6IGJ1ZmZlciksCiAgICAgICAgIG1SZWFyKDApLAotICAgICAgICBtUmVhZGVycygwKQorICAgICAgICBtUmVhZGVycygwKSwKKyAgICAgICAgbUZyZWVCdWZmZXJJbkRlc3RydWN0b3IoYnVmZmVyID09IE5VTEwpCiB7CiB9CiAKIFBpcGU6On5QaXBlKCkKIHsKICAgICBBTE9HX0FTU0VSVChhbmRyb2lkX2F0b21pY19hY3F1aXJlX2xvYWQoJm1SZWFkZXJzKSA9PSAwKTsKLSAgICBmcmVlKG1CdWZmZXIpOworICAgIGlmIChtRnJlZUJ1ZmZlckluRGVzdHJ1Y3RvcikgeworICAgICAgICBmcmVlKG1CdWZmZXIpOworICAgIH0KIH0KIAogc3NpemVfdCBQaXBlOjp3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBjb3VudCkKQEAgLTUyLDEzICs1NSwxMyBAQAogICAgIGlmIChDQ19MSUtFTFkod3JpdHRlbiA+IGNvdW50KSkgewogICAgICAgICB3cml0dGVuID0gY291bnQ7CiAgICAgfQotICAgIG1lbWNweSgoY2hhciAqKSBtQnVmZmVyICsgKHJlYXIgPDwgbUJpdFNoaWZ0KSwgYnVmZmVyLCB3cml0dGVuIDw8IG1CaXRTaGlmdCk7CisgICAgbWVtY3B5KChjaGFyICopIG1CdWZmZXIgKyAocmVhciAqIG1GcmFtZVNpemUpLCBidWZmZXIsIHdyaXR0ZW4gKiBtRnJhbWVTaXplKTsKICAgICBpZiAoQ0NfVU5MSUtFTFkocmVhciArIHdyaXR0ZW4gPT0gbU1heEZyYW1lcykpIHsKICAgICAgICAgaWYgKENDX1VOTElLRUxZKChjb3VudCAtPSB3cml0dGVuKSA+IHJlYXIpKSB7CiAgICAgICAgICAgICBjb3VudCA9IHJlYXI7CiAgICAgICAgIH0KICAgICAgICAgaWYgKENDX0xJS0VMWShjb3VudCA+IDApKSB7Ci0gICAgICAgICAgICBtZW1jcHkobUJ1ZmZlciwgKGNoYXIgKikgYnVmZmVyICsgKHdyaXR0ZW4gPDwgbUJpdFNoaWZ0KSwgY291bnQgPDwgbUJpdFNoaWZ0KTsKKyAgICAgICAgICAgIG1lbWNweShtQnVmZmVyLCAoY2hhciAqKSBidWZmZXIgKyAod3JpdHRlbiAqIG1GcmFtZVNpemUpLCBjb3VudCAqIG1GcmFtZVNpemUpOwogICAgICAgICAgICAgd3JpdHRlbiArPSBjb3VudDsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL1BpcGVSZWFkZXIuY3BwIGIvbWVkaWEvbGlibmJhaW8vUGlwZVJlYWRlci5jcHAKaW5kZXggZDc4NmI4NC4uYzhlNDk1MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vUGlwZVJlYWRlci5jcHAKKysrIGIvbWVkaWEvbGlibmJhaW8vUGlwZVJlYWRlci5jcHAKQEAgLTU5LDcgKzU5LDcgQEAKICAgICByZXR1cm4gYXZhaWw7CiB9CiAKLXNzaXplX3QgUGlwZVJlYWRlcjo6cmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBjb3VudCwgaW50NjRfdCByZWFkUFRTKQorc3NpemVfdCBQaXBlUmVhZGVyOjpyZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBpbnQ2NF90IHJlYWRQVFMgX191bnVzZWQpCiB7CiAgICAgc3NpemVfdCBhdmFpbCA9IGF2YWlsYWJsZVRvUmVhZCgpOwogICAgIGlmIChDQ19VTkxJS0VMWShhdmFpbCA8PSAwKSkgewpAQCAtNzYsMTQgKzc2LDE0IEBACiAgICAgICAgIHJlZCA9IGNvdW50OwogICAgIH0KICAgICAvLyBJbiBwYXJ0aWN1bGFyLCBhbiBvdmVycnVuIGR1cmluZyB0aGUgbWVtY3B5IHdpbGwgcmVzdWx0IGluIHJlYWRpbmcgY29ycnVwdCBkYXRhCi0gICAgbWVtY3B5KGJ1ZmZlciwgKGNoYXIgKikgbVBpcGUubUJ1ZmZlciArIChmcm9udCA8PCBtQml0U2hpZnQpLCByZWQgPDwgbUJpdFNoaWZ0KTsKKyAgICBtZW1jcHkoYnVmZmVyLCAoY2hhciAqKSBtUGlwZS5tQnVmZmVyICsgKGZyb250ICogbUZyYW1lU2l6ZSksIHJlZCAqIG1GcmFtZVNpemUpOwogICAgIC8vIFdlIGNvdWxkIHJlLXJlYWQgdGhlIHJlYXIgcG9pbnRlciBoZXJlIHRvIGRldGVjdCB0aGUgY29ycnVwdGlvbiwgYnV0IHdoeSBib3RoZXI/CiAgICAgaWYgKENDX1VOTElLRUxZKGZyb250ICsgcmVkID09IG1QaXBlLm1NYXhGcmFtZXMpKSB7CiAgICAgICAgIGlmIChDQ19VTkxJS0VMWSgoY291bnQgLT0gcmVkKSA+IGZyb250KSkgewogICAgICAgICAgICAgY291bnQgPSBmcm9udDsKICAgICAgICAgfQogICAgICAgICBpZiAoQ0NfTElLRUxZKGNvdW50ID4gMCkpIHsKLSAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKSBidWZmZXIgKyAocmVkIDw8IG1CaXRTaGlmdCksIG1QaXBlLm1CdWZmZXIsIGNvdW50IDw8IG1CaXRTaGlmdCk7CisgICAgICAgICAgICBtZW1jcHkoKGNoYXIgKikgYnVmZmVyICsgKHJlZCAqIG1GcmFtZVNpemUpLCBtUGlwZS5tQnVmZmVyLCBjb3VudCAqIG1GcmFtZVNpemUpOwogICAgICAgICAgICAgcmVkICs9IGNvdW50OwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5jcHAgYi9tZWRpYS9saWJuYmFpby9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmNwcAppbmRleCAwNjJmYTBmLi5lMjFlZjQ4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmNwcAorKysgYi9tZWRpYS9saWJuYmFpby9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmNwcApAQCAtMjQsNyArMjQsNyBAQAogCiBTb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyOjpTb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyKGNvbnN0IHNwPE5CQUlPX1NvdXJjZT4mIHNvdXJjZSkgOgogICAgIG1Tb3VyY2Uoc291cmNlKSwKLSAgICAvLyBtRnJhbWVCaXRTaGlmdEZvcm1hdCBiZWxvdworICAgIC8vIG1GcmFtZVNpemUgYmVsb3cKICAgICBtQWxsb2NhdGVkKE5VTEwpLCBtU2l6ZSgwKSwgbU9mZnNldCgwKSwgbVJlbWFpbmluZygwKSwgbUdldENvdW50KDApLCBtRnJhbWVzUmVsZWFzZWQoMCkKIHsKICAgICBBTE9HX0FTU0VSVChzb3VyY2UgIT0gMCk7CkBAIC0zNyw3ICszNyw3IEBACiAgICAgbnVtQ291bnRlck9mZmVycyA9IDA7CiAgICAgaW5kZXggPSBzb3VyY2UtPm5lZ290aWF0ZShjb3VudGVyT2ZmZXJzLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKICAgICBBTE9HX0FTU0VSVChpbmRleCA9PSAwKTsKLSAgICBtRnJhbWVCaXRTaGlmdCA9IEZvcm1hdF9mcmFtZUJpdFNoaWZ0KHNvdXJjZS0+Zm9ybWF0KCkpOworICAgIG1GcmFtZVNpemUgPSBGb3JtYXRfZnJhbWVTaXplKHNvdXJjZS0+Zm9ybWF0KCkpOwogfQogCiBTb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyOjp+U291cmNlQXVkaW9CdWZmZXJQcm92aWRlcigpCkBAIC01NCwxNCArNTQsMTQgQEAKICAgICAgICAgaWYgKG1SZW1haW5pbmcgPCBidWZmZXItPmZyYW1lQ291bnQpIHsKICAgICAgICAgICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IG1SZW1haW5pbmc7CiAgICAgICAgIH0KLSAgICAgICAgYnVmZmVyLT5yYXcgPSAoY2hhciAqKSBtQWxsb2NhdGVkICsgKG1PZmZzZXQgPDwgbUZyYW1lQml0U2hpZnQpOworICAgICAgICBidWZmZXItPnJhdyA9IChjaGFyICopIG1BbGxvY2F0ZWQgKyAobU9mZnNldCAqIG1GcmFtZVNpemUpOwogICAgICAgICBtR2V0Q291bnQgPSBidWZmZXItPmZyYW1lQ291bnQ7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAgICAgLy8gZG8gd2UgbmVlZCB0byByZWFsbG9jYXRlPwogICAgIGlmIChidWZmZXItPmZyYW1lQ291bnQgPiBtU2l6ZSkgewogICAgICAgICBmcmVlKG1BbGxvY2F0ZWQpOwotICAgICAgICBtQWxsb2NhdGVkID0gbWFsbG9jKGJ1ZmZlci0+ZnJhbWVDb3VudCA8PCBtRnJhbWVCaXRTaGlmdCk7CisgICAgICAgIG1BbGxvY2F0ZWQgPSBtYWxsb2MoYnVmZmVyLT5mcmFtZUNvdW50ICogbUZyYW1lU2l6ZSk7CiAgICAgICAgIG1TaXplID0gYnVmZmVyLT5mcmFtZUNvdW50OwogICAgIH0KICAgICAvLyByZWFkIGZyb20gc291cmNlCkBAIC04NCw3ICs4NCw3IEBACiB2b2lkIFNvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXI6OnJlbGVhc2VCdWZmZXIoQnVmZmVyICpidWZmZXIpCiB7CiAgICAgQUxPR19BU1NFUlQoKGJ1ZmZlciAhPSBOVUxMKSAmJgotICAgICAgICAgICAgKGJ1ZmZlci0+cmF3ID09IChjaGFyICopIG1BbGxvY2F0ZWQgKyAobU9mZnNldCA8PCBtRnJhbWVCaXRTaGlmdCkpICYmCisgICAgICAgICAgICAoYnVmZmVyLT5yYXcgPT0gKGNoYXIgKikgbUFsbG9jYXRlZCArIChtT2Zmc2V0ICogbUZyYW1lU2l6ZSkpICYmCiAgICAgICAgICAgICAoYnVmZmVyLT5mcmFtZUNvdW50IDw9IG1HZXRDb3VudCkgJiYKICAgICAgICAgICAgIChtR2V0Q291bnQgPD0gbVJlbWFpbmluZykgJiYKICAgICAgICAgICAgIChtT2Zmc2V0ICsgbVJlbWFpbmluZyA8PSBtU2l6ZSkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUFDRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FBQ0V4dHJhY3Rvci5jcHAKaW5kZXggNGQxMDcyZi4uMTk2ZjZlZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUFDRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQUNFeHRyYWN0b3IuY3BwCkBAIC0yMTksNyArMjE5LDcgQEAKICAgICByZXR1cm4gbmV3IEFBQ1NvdXJjZShtRGF0YVNvdXJjZSwgbU1ldGEsIG1PZmZzZXRWZWN0b3IsIG1GcmFtZUR1cmF0aW9uVXMpOwogfQogCi1zcDxNZXRhRGF0YT4gQUFDRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpIHsKK3NwPE1ldGFEYXRhPiBBQUNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ICE9IDApIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMjUyLDcgKzI1Miw3IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBBQUNTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKK3N0YXR1c190IEFBQ1NvdXJjZTo6c3RhcnQoTWV0YURhdGEgKiAvKiBwYXJhbXMgKi8pIHsKICAgICBDSEVDSyghbVN0YXJ0ZWQpOwogCiAgICAgaWYgKG1PZmZzZXRWZWN0b3IuZW1wdHkoKSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FBQ1dyaXRlci5jcHAKaW5kZXggYTZmN2NmYi4uMzUzOTIwZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQUNXcml0ZXIuY3BwCkBAIC0xNCw2ICsxNCwxMiBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIkFBQ1dyaXRlciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KQEAgLTI3LDEwICszMyw2IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhcmVjb3JkZXIuaD4KLSNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMTExLDcgKzExMyw3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBBQUNXcml0ZXI6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKK3N0YXR1c190IEFBQ1dyaXRlcjo6c3RhcnQoTWV0YURhdGEgKiAvKiBwYXJhbXMgKi8pIHsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewogICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKICAgICB9CkBAIC0xNzEsNyArMTczLDcgQEAKICAgICB2b2lkICpkdW1teTsKICAgICBwdGhyZWFkX2pvaW4obVRocmVhZCwgJmR1bW15KTsKIAotICAgIHN0YXR1c190IGVyciA9IChzdGF0dXNfdCkgZHVtbXk7CisgICAgc3RhdHVzX3QgZXJyID0gc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihkdW1teSkpOwogICAgIHsKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVNvdXJjZS0+c3RvcCgpOwogICAgICAgICBpZiAoZXJyID09IE9LICYmCkBAIC0yMDAsNyArMjAyLDcgQEAKIAogLy8gc3RhdGljCiB2b2lkICpBQUNXcml0ZXI6OlRocmVhZFdyYXBwZXIodm9pZCAqbWUpIHsKLSAgICByZXR1cm4gKHZvaWQgKikgc3RhdGljX2Nhc3Q8QUFDV3JpdGVyICo+KG1lKS0+dGhyZWFkRnVuYygpOworICAgIHJldHVybiAodm9pZCAqKSh1aW50cHRyX3Qpc3RhdGljX2Nhc3Q8QUFDV3JpdGVyICo+KG1lKS0+dGhyZWFkRnVuYygpOwogfQogCiAvKgpAQCAtMzQ4LDcgKzM1MCw3IEBACiAgICAgICAgICAgICBtUmVzdW1lZCA9IGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIHRpbWVzdGFtcFVzIC09IHByZXZpb3VzUGF1c2VkRHVyYXRpb25VczsKLSAgICAgICAgQUxPR1YoInRpbWUgc3RhbXA6ICVsbGQsIHByZXZpb3VzIHBhdXNlZCBkdXJhdGlvbjogJWxsZCIsCisgICAgICAgIEFMT0dWKCJ0aW1lIHN0YW1wOiAlIiBQUklkNjQgIiwgcHJldmlvdXMgcGF1c2VkIGR1cmF0aW9uOiAlIiBQUklkNjQsCiAgICAgICAgICAgICB0aW1lc3RhbXBVcywgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzKTsKICAgICAgICAgaWYgKHRpbWVzdGFtcFVzID4gbWF4VGltZXN0YW1wVXMpIHsKICAgICAgICAgICAgIG1heFRpbWVzdGFtcFVzID0gdGltZXN0YW1wVXM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcAppbmRleCBhZGNkYTAzLi5mNWEzYTcwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAKQEAgLTE3LDYgKzE3LDEzIEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIkFDb2RlYyIKIAorI2lmZGVmIF9fTFA2NF9fCisjZGVmaW5lIE9NWF9BTkRST0lEX0NPTVBJTEVfQVNfMzJCSVRfT05fNjRCSVRfUExBVEZPUk1TCisjZW5kaWYKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KKwogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oPgogCiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgpAQCAtMjUsNiArMzIsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9CdWZmZXJQcm9kdWNlcldyYXBwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oPgpAQCAtMzYsNiArNDQsNyBAQAogI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+CiAKICNpbmNsdWRlIDxPTVhfQXVkaW9FeHQuaD4KKyNpbmNsdWRlIDxPTVhfVmlkZW9FeHQuaD4KICNpbmNsdWRlIDxPTVhfQ29tcG9uZW50Lmg+CiAjaW5jbHVkZSA8T01YX0luZGV4RXh0Lmg+CiAKQEAgLTQzLDYgKzUyLDQ4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorLy8gT01YIGVycm9ycyBhcmUgZGlyZWN0bHkgbWFwcGVkIGludG8gc3RhdHVzX3QgcmFuZ2UgaWYKKy8vIHRoZXJlIGlzIG5vIGNvcnJlc3BvbmRpbmcgTWVkaWFFcnJvciBzdGF0dXMgY29kZS4KKy8vIFVzZSB0aGUgc3RhdHVzRnJvbU9NWEVycm9yKGludDMyX3Qgb214RXJyb3IpIGZ1bmN0aW9uLgorLy8KKy8vIEN1cnJlbnRseSB0aGlzIGlzIGEgZGlyZWN0IG1hcC4KKy8vIFNlZSBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgvT01YX0NvcmUuaAorLy8KKy8vIFZlbmRvciBPTVggZXJyb3JzICAgICBmcm9tIDB4OTAwMDAwMDAgLSAweDkwMDBGRkZGCisvLyBFeHRlbnNpb24gT01YIGVycm9ycyAgZnJvbSAweDhGMDAwMDAwIC0gMHg5MDAwMDAwMAorLy8gU3RhbmRhcmQgT01YIGVycm9ycyAgIGZyb20gMHg4MDAwMTAwMCAtIDB4ODAwMDEwMjQgKDB4ODAwMDEwMjQgY3VycmVudCkKKy8vCisKKy8vIHJldHVybnMgdHJ1ZSBpZiBlcnIgaXMgYSByZWNvZ25pemVkIE9NWCBlcnJvciBjb2RlLgorLy8gYXMgT01YIGVycm9yIGlzIE9NWF9TMzIsIHRoaXMgaXMgYW4gaW50MzJfdCB0eXBlCitzdGF0aWMgaW5saW5lIGJvb2wgaXNPTVhFcnJvcihpbnQzMl90IGVycikgeworICAgIHJldHVybiAoRVJST1JfQ09ERUNfTUlOIDw9IGVyciAmJiBlcnIgPD0gRVJST1JfQ09ERUNfTUFYKTsKK30KKworLy8gY29udmVydHMgYW4gT01YIGVycm9yIHRvIGEgc3RhdHVzX3QKK3N0YXRpYyBpbmxpbmUgc3RhdHVzX3Qgc3RhdHVzRnJvbU9NWEVycm9yKGludDMyX3Qgb214RXJyb3IpIHsKKyAgICBzd2l0Y2ggKG9teEVycm9yKSB7CisgICAgY2FzZSBPTVhfRXJyb3JJbnZhbGlkQ29tcG9uZW50TmFtZToKKyAgICBjYXNlIE9NWF9FcnJvckNvbXBvbmVudE5vdEZvdW5kOgorICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7IC8vIGNhbiB0cmlnZ2VyIGlsbGVnYWwgYXJndW1lbnQgZXJyb3IgZm9yIHByb3ZpZGVkIG5hbWVzLgorICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBpc09NWEVycm9yKG9teEVycm9yKSA/IG9teEVycm9yIDogMDsgLy8gbm8gdHJhbnNsYXRpb24gcmVxdWlyZWQKKyAgICB9Cit9CisKKy8vIGNoZWNrcyBhbmQgY29udmVydHMgc3RhdHVzX3QgdG8gYSBub24tc2lkZS1lZmZlY3Qgc3RhdHVzX3QKK3N0YXRpYyBpbmxpbmUgc3RhdHVzX3QgbWFrZU5vU2lkZUVmZmVjdFN0YXR1cyhzdGF0dXNfdCBlcnIpIHsKKyAgICBzd2l0Y2ggKGVycikgeworICAgIC8vIHRoZSBmb2xsb3dpbmcgZXJyb3JzIGhhdmUgc2lkZSBlZmZlY3RzIGFuZCBtYXkgY29tZQorICAgIC8vIGZyb20gb3RoZXIgY29kZSBtb2R1bGVzLiBSZW1hcCBmb3Igc2FmZXR5IHJlYXNvbnMuCisgICAgY2FzZSBJTlZBTElEX09QRVJBVElPTjoKKyAgICBjYXNlIERFQURfT0JKRUNUOgorICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KK30KKwogdGVtcGxhdGU8Y2xhc3MgVD4KIHN0YXRpYyB2b2lkIEluaXRPTVhQYXJhbXMoVCAqcGFyYW1zKSB7CiAgICAgcGFyYW1zLT5uU2l6ZSA9IHNpemVvZihUKTsKQEAgLTY0LDcgKzExNSw3IEBACiAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtTm90aWZ5LT5kdXAoKTsKIAogICAgICAgICBtc2ctPnNldEludDMyKCJ0eXBlIiwgb214X21zZy50eXBlKTsKLSAgICAgICAgbXNnLT5zZXRQb2ludGVyKCJub2RlIiwgb214X21zZy5ub2RlKTsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigibm9kZSIsIG9teF9tc2cubm9kZSk7CiAKICAgICAgICAgc3dpdGNoIChvbXhfbXNnLnR5cGUpIHsKICAgICAgICAgICAgIGNhc2Ugb214X21lc3NhZ2U6OkVWRU5UOgpAQCAtNzcsMTMgKzEyOCwxMyBAQAogCiAgICAgICAgICAgICBjYXNlIG9teF9tZXNzYWdlOjpFTVBUWV9CVUZGRVJfRE9ORToKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoImJ1ZmZlciIsIG9teF9tc2cudS5idWZmZXJfZGF0YS5idWZmZXIpOworICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImJ1ZmZlciIsIG9teF9tc2cudS5idWZmZXJfZGF0YS5idWZmZXIpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBjYXNlIG9teF9tZXNzYWdlOjpGSUxMX0JVRkZFUl9ET05FOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcigKKyAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKAogICAgICAgICAgICAgICAgICAgICAgICAgImJ1ZmZlciIsIG9teF9tc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5idWZmZXIpOwogICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoCiAgICAgICAgICAgICAgICAgICAgICAgICAicmFuZ2Vfb2Zmc2V0IiwKQEAgLTk3LDEyICsxNDgsNiBAQAogICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50NjQoCiAgICAgICAgICAgICAgICAgICAgICAgICAidGltZXN0YW1wIiwKICAgICAgICAgICAgICAgICAgICAgICAgIG9teF9tc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS50aW1lc3RhbXApOwotICAgICAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICJwbGF0Zm9ybV9wcml2YXRlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9teF9tc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5wbGF0Zm9ybV9wcml2YXRlKTsKLSAgICAgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAiZGF0YV9wdHIiLAotICAgICAgICAgICAgICAgICAgICAgICAgb214X21zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLmRhdGFfcHRyKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIApAQCAtMTU3LDkgKzIwMiw3IEBACiAgICAgICAgICAgICBJT01YOjpidWZmZXJfaWQgYnVmZmVySUQsCiAgICAgICAgICAgICBzaXplX3QgcmFuZ2VPZmZzZXQsIHNpemVfdCByYW5nZUxlbmd0aCwKICAgICAgICAgICAgIE9NWF9VMzIgZmxhZ3MsCi0gICAgICAgICAgICBpbnQ2NF90IHRpbWVVcywKLSAgICAgICAgICAgIHZvaWQgKnBsYXRmb3JtUHJpdmF0ZSwKLSAgICAgICAgICAgIHZvaWQgKmRhdGFQdHIpOworICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMpOwogCiAgICAgdm9pZCBnZXRNb3JlSW5wdXREYXRhSWZQb3NzaWJsZSgpOwogCkBAIC0zNjAsMjIgKzQwMywyNyBAQAogCiBBQ29kZWM6OkFDb2RlYygpCiAgICAgOiBtUXVpcmtzKDApLAotICAgICAgbU5vZGUoTlVMTCksCisgICAgICBtTm9kZSgwKSwKICAgICAgIG1TZW50Rm9ybWF0KGZhbHNlKSwKICAgICAgIG1Jc0VuY29kZXIoZmFsc2UpLAogICAgICAgbVVzZU1ldGFkYXRhT25FbmNvZGVyT3V0cHV0KGZhbHNlKSwKICAgICAgIG1GYXRhbEVycm9yKGZhbHNlKSwKICAgICAgIG1TaHV0ZG93bkluUHJvZ3Jlc3MoZmFsc2UpLAotICAgICAgbUlzQ29uZmlndXJlZEZvckFkYXB0aXZlUGxheWJhY2soZmFsc2UpLAorICAgICAgbUV4cGxpY2l0U2h1dGRvd24oZmFsc2UpLAogICAgICAgbUVuY29kZXJEZWxheSgwKSwKICAgICAgIG1FbmNvZGVyUGFkZGluZygwKSwKKyAgICAgIG1Sb3RhdGlvbkRlZ3JlZXMoMCksCiAgICAgICBtQ2hhbm5lbE1hc2tQcmVzZW50KGZhbHNlKSwKICAgICAgIG1DaGFubmVsTWFzaygwKSwKICAgICAgIG1EZXF1ZXVlQ291bnRlcigwKSwKICAgICAgIG1TdG9yZU1ldGFEYXRhSW5PdXRwdXRCdWZmZXJzKGZhbHNlKSwKICAgICAgIG1NZXRhRGF0YUJ1ZmZlcnNUb1N1Ym1pdCgwKSwKICAgICAgIG1SZXBlYXRGcmFtZURlbGF5VXMoLTFsbCksCi0gICAgICBtTWF4UHRzR2FwVXMoLTFsKSB7CisgICAgICBtTWF4UHRzR2FwVXMoLTFsbCksCisgICAgICBtVGltZVBlckZyYW1lVXMoLTFsbCksCisgICAgICBtVGltZVBlckNhcHR1cmVVcygtMWxsKSwKKyAgICAgIG1DcmVhdGVJbnB1dEJ1ZmZlcnNTdXNwZW5kZWQoZmFsc2UpLAorICAgICAgbVR1bm5lbGVkKGZhbHNlKSB7CiAgICAgbVVuaW5pdGlhbGl6ZWRTdGF0ZSA9IG5ldyBVbmluaXRpYWxpemVkU3RhdGUodGhpcyk7CiAgICAgbUxvYWRlZFN0YXRlID0gbmV3IExvYWRlZFN0YXRlKHRoaXMpOwogICAgIG1Mb2FkZWRUb0lkbGVTdGF0ZSA9IG5ldyBMb2FkZWRUb0lkbGVTdGF0ZSh0aGlzKTsKQEAgLTQ1MSw2ICs0OTksMTAgQEAKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2h1dGRvd24sIGlkKCkpOwogICAgIG1zZy0+c2V0SW50MzIoImtlZXBDb21wb25lbnRBbGxvY2F0ZWQiLCBrZWVwQ29tcG9uZW50QWxsb2NhdGVkKTsKICAgICBtc2ctPnBvc3QoKTsKKyAgICBpZiAoIWtlZXBDb21wb25lbnRBbGxvY2F0ZWQpIHsKKyAgICAgICAgLy8gZW5zdXJlIHNodXRkb3duIGNvbXBsZXRlcyBpbiAzIHNlY29uZHMKKyAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlbGVhc2VDb2RlY0luc3RhbmNlLCBpZCgpKSktPnBvc3QoMzAwMDAwMCk7CisgICAgfQogfQogCiB2b2lkIEFDb2RlYzo6c2lnbmFsUmVxdWVzdElEUkZyYW1lKCkgewpAQCAtNDkxLDcgKzU0Myw3IEBACiAgICAgICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24sICZkZWYsIHNpemVvZihkZWYpKTsKIAogICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICBBTE9HVigiWyVzXSBBbGxvY2F0aW5nICVsdSBidWZmZXJzIG9mIHNpemUgJWx1IG9uICVzIHBvcnQiLAorICAgICAgICAgICAgQUxPR1YoIlslc10gQWxsb2NhdGluZyAldSBidWZmZXJzIG9mIHNpemUgJXUgb24gJXMgcG9ydCIsCiAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwsIGRlZi5uQnVmZmVyU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgcG9ydEluZGV4ID09IGtQb3J0SW5kZXhJbnB1dCA/ICJpbnB1dCIgOiAib3V0cHV0Iik7CkBAIC01NDcsNyArNTk5LDcgQEAKICAgICB9CiAKICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIEFDb2RlYzo6a1doYXRCdWZmZXJzQWxsb2NhdGVkKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQ29kZWNCYXNlOjprV2hhdEJ1ZmZlcnNBbGxvY2F0ZWQpOwogCiAgICAgbm90aWZ5LT5zZXRJbnQzMigicG9ydEluZGV4IiwgcG9ydEluZGV4KTsKIApAQCAtNTkxLDYgKzY0MywyNyBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAorICAgIGlmIChtUm90YXRpb25EZWdyZWVzICE9IDApIHsKKyAgICAgICAgdWludDMyX3QgdHJhbnNmb3JtID0gMDsKKyAgICAgICAgc3dpdGNoIChtUm90YXRpb25EZWdyZWVzKSB7CisgICAgICAgICAgICBjYXNlIDA6IHRyYW5zZm9ybSA9IDA7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA5MDogdHJhbnNmb3JtID0gSEFMX1RSQU5TRk9STV9ST1RfOTA7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAxODA6IHRyYW5zZm9ybSA9IEhBTF9UUkFOU0ZPUk1fUk9UXzE4MDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI3MDogdHJhbnNmb3JtID0gSEFMX1RSQU5TRk9STV9ST1RfMjcwOyBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6IHRyYW5zZm9ybSA9IDA7IGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRyYW5zZm9ybSA+IDApIHsKKyAgICAgICAgICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfdHJhbnNmb3JtKAorICAgICAgICAgICAgICAgICAgICBtTmF0aXZlV2luZG93LmdldCgpLCB0cmFuc2Zvcm0pOworICAgICAgICAgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIm5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfdHJhbnNmb3JtIGZhaWxlZDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgLWVycik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIFNldCB1cCB0aGUgbmF0aXZlIHdpbmRvdy4KICAgICBPTVhfVTMyIHVzYWdlID0gMDsKICAgICBlcnIgPSBtT01YLT5nZXRHcmFwaGljQnVmZmVyVXNhZ2UobU5vZGUsIGtQb3J0SW5kZXhPdXRwdXQsICZ1c2FnZSk7CkBAIC02MzIsNiArNzA1LDIxIEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCisgICAgLy8gRXhpdHMgaGVyZSBmb3IgdHVubmVsZWQgdmlkZW8gcGxheWJhY2sgY29kZWNzIC0tIGkuZS4gc2tpcHMgbmF0aXZlIHdpbmRvdworICAgIC8vIGJ1ZmZlciBhbGxvY2F0aW9uIHN0ZXAgYXMgdGhpcyBpcyBtYW5hZ2VkIGJ5IHRoZSB0dW5uZWxlZCBPTVggb21wb25lbnQKKyAgICAvLyBpdHNlbGYgYW5kIGV4cGxpY2l0bHkgc2V0cyBkZWYubkJ1ZmZlckNvdW50QWN0dWFsIHRvIDAuCisgICAgaWYgKG1UdW5uZWxlZCkgeworICAgICAgICBBTE9HVigiVHVubmVsZWQgUGxheWJhY2s6IHNraXBwaW5nIG5hdGl2ZSB3aW5kb3cgYnVmZmVyIGFsbG9jYXRpb24uIik7CisgICAgICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSAwOworICAgICAgICBlcnIgPSBtT01YLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24sICZkZWYsIHNpemVvZihkZWYpKTsKKworICAgICAgICAqbWluVW5kZXF1ZXVlZEJ1ZmZlcnMgPSAwOworICAgICAgICAqYnVmZmVyQ291bnQgPSAwOworICAgICAgICAqYnVmZmVyU2l6ZSA9IDA7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCiAgICAgKm1pblVuZGVxdWV1ZWRCdWZmZXJzID0gMDsKICAgICBlcnIgPSBtTmF0aXZlV2luZG93LT5xdWVyeSgKICAgICAgICAgICAgIG1OYXRpdmVXaW5kb3cuZ2V0KCksIE5BVElWRV9XSU5ET1dfTUlOX1VOREVRVUVVRURfQlVGRkVSUywKQEAgLTY0MywxOCArNzMxLDM0IEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCi0gICAgLy8gWFhYOiBJcyB0aGlzIHRoZSByaWdodCBsb2dpYyB0byB1c2U/ICBJdCdzIG5vdCBjbGVhciB0byBtZSB3aGF0IHRoZSBPTVgKLSAgICAvLyBidWZmZXIgY291bnRzIHJlZmVyIHRvIC0gaG93IGRvIHRoZXkgYWNjb3VudCBmb3IgdGhlIHJlbmRlcmVyIGhvbGRpbmcgb24KLSAgICAvLyB0byBidWZmZXJzPwotICAgIGlmIChkZWYubkJ1ZmZlckNvdW50QWN0dWFsIDwgZGVmLm5CdWZmZXJDb3VudE1pbiArICptaW5VbmRlcXVldWVkQnVmZmVycykgewotICAgICAgICBPTVhfVTMyIG5ld0J1ZmZlckNvdW50ID0gZGVmLm5CdWZmZXJDb3VudE1pbiArICptaW5VbmRlcXVldWVkQnVmZmVyczsKKyAgICAvLyBGSVhNRTogYXNzdW1lIHRoYXQgc3VyZmFjZSBpcyBjb250cm9sbGVkIGJ5IGFwcCAobmF0aXZlIHdpbmRvdworICAgIC8vIHJldHVybnMgdGhlIG51bWJlciBmb3IgdGhlIGNhc2Ugd2hlbiBzdXJmYWNlIGlzIG5vdCBjb250cm9sbGVkIGJ5IGFwcCkKKyAgICAvLyBGSVhNRTI6IFRoaXMgbWVhbnMgdGhhdCBtaW5VbmRlcWV1ZXVkQnVmcyBjYW4gYmUgMSBsYXJnZXIgdGhhbiByZXBvcnRlZAorICAgIC8vIEZvciBub3csIHRyeSB0byBhbGxvY2F0ZSAxIG1vcmUgYnVmZmVyLCBidXQgZG9uJ3QgZmFpbCBpZiB1bnN1Y2Nlc3NmdWwKKworICAgIC8vIFVzZSBjb25zZXJ2YXRpdmUgYWxsb2NhdGlvbiB3aGlsZSBhbHNvIHRyeWluZyB0byByZWR1Y2Ugc3RhcnZhdGlvbgorICAgIC8vCisgICAgLy8gMS4gYWxsb2NhdGUgYXQgbGVhc3QgbkJ1ZmZlckNvdW50TWluICsgbWluVW5kZXF1ZXVlZEJ1ZmZlcnMgLSB0aGF0IGlzIHRoZQorICAgIC8vICAgIG1pbmltdW0gbmVlZGVkIGZvciB0aGUgY29uc3VtZXIgdG8gYmUgYWJsZSB0byB3b3JrCisgICAgLy8gMi4gdHJ5IHRvIGFsbG9jYXRlIHR3byAoMikgYWRkaXRpb25hbCBidWZmZXJzIHRvIHJlZHVjZSBzdGFydmF0aW9uIGZyb20KKyAgICAvLyAgICB0aGUgY29uc3VtZXIKKyAgICAvLyAgICBwbHVzIGFuIGV4dHJhIGJ1ZmZlciB0byBhY2NvdW50IGZvciBpbmNvcnJlY3QgbWluVW5kZXF1ZXVlZEJ1ZnMKKyAgICBmb3IgKE9NWF9VMzIgZXh0cmFCdWZmZXJzID0gMiArIDE7IC8qIGNvbmRpdGlvbiBpbnNpZGUgbG9vcCAqLzsgZXh0cmFCdWZmZXJzLS0pIHsKKyAgICAgICAgT01YX1UzMiBuZXdCdWZmZXJDb3VudCA9CisgICAgICAgICAgICBkZWYubkJ1ZmZlckNvdW50TWluICsgKm1pblVuZGVxdWV1ZWRCdWZmZXJzICsgZXh0cmFCdWZmZXJzOwogICAgICAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsID0gbmV3QnVmZmVyQ291bnQ7CiAgICAgICAgIGVyciA9IG1PTVgtPnNldFBhcmFtZXRlcigKICAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbiwgJmRlZiwgc2l6ZW9mKGRlZikpOwogCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJbJXNdIHNldHRpbmcgbkJ1ZmZlckNvdW50QWN0dWFsIHRvICVsdSBmYWlsZWQ6ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgbmV3QnVmZmVyQ291bnQsIGVycik7CisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICptaW5VbmRlcXVldWVkQnVmZmVycyArPSBleHRyYUJ1ZmZlcnM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dXKCJbJXNdIHNldHRpbmcgbkJ1ZmZlckNvdW50QWN0dWFsIHRvICV1IGZhaWxlZDogJWQiLAorICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIG5ld0J1ZmZlckNvdW50LCBlcnIpOworICAgICAgICAvKiBleGl0IGNvbmRpdGlvbiAqLworICAgICAgICBpZiAoZXh0cmFCdWZmZXJzID09IDApIHsKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KICAgICB9CkBAIC02NzksOCArNzgzLDkgQEAKICAgICAgICAgICAgICZidWZmZXJDb3VudCwgJmJ1ZmZlclNpemUsICZtaW5VbmRlcXVldWVkQnVmZmVycyk7CiAgICAgaWYgKGVyciAhPSAwKQogICAgICAgICByZXR1cm4gZXJyOworICAgIG1OdW1VbmRlcXVldWVkQnVmZmVycyA9IG1pblVuZGVxdWV1ZWRCdWZmZXJzOwogCi0gICAgQUxPR1YoIlslc10gQWxsb2NhdGluZyAlbHUgYnVmZmVycyBmcm9tIGEgbmF0aXZlIHdpbmRvdyBvZiBzaXplICVsdSBvbiAiCisgICAgQUxPR1YoIlslc10gQWxsb2NhdGluZyAldSBidWZmZXJzIGZyb20gYSBuYXRpdmUgd2luZG93IG9mIHNpemUgJXUgb24gIgogICAgICAgICAgIm91dHB1dCBwb3J0IiwKICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGJ1ZmZlckNvdW50LCBidWZmZXJTaXplKTsKIApAQCAtNzA0LDE0ICs4MDksMTQgQEAKICAgICAgICAgZXJyID0gbU9NWC0+dXNlR3JhcGhpY0J1ZmZlcihtTm9kZSwga1BvcnRJbmRleE91dHB1dCwgZ3JhcGhpY0J1ZmZlciwKICAgICAgICAgICAgICAgICAmYnVmZmVySWQpOwogICAgICAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJyZWdpc3RlcmluZyBHcmFwaGljQnVmZmVyICVsdSB3aXRoIE9NWCBJTCBjb21wb25lbnQgZmFpbGVkOiAiCisgICAgICAgICAgICBBTE9HRSgicmVnaXN0ZXJpbmcgR3JhcGhpY0J1ZmZlciAldSB3aXRoIE9NWCBJTCBjb21wb25lbnQgZmFpbGVkOiAiCiAgICAgICAgICAgICAgICAgICIlZCIsIGksIGVycik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIG1CdWZmZXJzW2tQb3J0SW5kZXhPdXRwdXRdLmVkaXRJdGVtQXQoaSkubUJ1ZmZlcklEID0gYnVmZmVySWQ7CiAKLSAgICAgICAgQUxPR1YoIlslc10gUmVnaXN0ZXJlZCBncmFwaGljIGJ1ZmZlciB3aXRoIElEICVwIChwb2ludGVyID0gJXApIiwKKyAgICAgICAgQUxPR1YoIlslc10gUmVnaXN0ZXJlZCBncmFwaGljIGJ1ZmZlciB3aXRoIElEICV1IChwb2ludGVyID0gJXApIiwKICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLAogICAgICAgICAgICAgIGJ1ZmZlcklkLCBncmFwaGljQnVmZmVyLmdldCgpKTsKICAgICB9CkBAIC03MzIsNyArODM3LDEwIEBACiAKICAgICBmb3IgKE9NWF9VMzIgaSA9IGNhbmNlbFN0YXJ0OyBpIDwgY2FuY2VsRW5kOyBpKyspIHsKICAgICAgICAgQnVmZmVySW5mbyAqaW5mbyA9ICZtQnVmZmVyc1trUG9ydEluZGV4T3V0cHV0XS5lZGl0SXRlbUF0KGkpOwotICAgICAgICBjYW5jZWxCdWZmZXJUb05hdGl2ZVdpbmRvdyhpbmZvKTsKKyAgICAgICAgc3RhdHVzX3QgZXJyb3IgPSBjYW5jZWxCdWZmZXJUb05hdGl2ZVdpbmRvdyhpbmZvKTsKKyAgICAgICAgaWYgKGVyciA9PSAwKSB7CisgICAgICAgICAgICBlcnIgPSBlcnJvcjsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHJldHVybiBlcnI7CkBAIC03NDQsOCArODUyLDkgQEAKICAgICAgICAgICAgICZidWZmZXJDb3VudCwgJmJ1ZmZlclNpemUsICZtaW5VbmRlcXVldWVkQnVmZmVycyk7CiAgICAgaWYgKGVyciAhPSAwKQogICAgICAgICByZXR1cm4gZXJyOworICAgIG1OdW1VbmRlcXVldWVkQnVmZmVycyA9IG1pblVuZGVxdWV1ZWRCdWZmZXJzOwogCi0gICAgQUxPR1YoIlslc10gQWxsb2NhdGluZyAlbHUgbWV0YSBidWZmZXJzIG9uIG91dHB1dCBwb3J0IiwKKyAgICBBTE9HVigiWyVzXSBBbGxvY2F0aW5nICV1IG1ldGEgYnVmZmVycyBvbiBvdXRwdXQgcG9ydCIsCiAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBidWZmZXJDb3VudCk7CiAKICAgICBzaXplX3QgdG90YWxTaXplID0gYnVmZmVyQ291bnQgKiA4OwpAQCAtNzcxLDcgKzg4MCw3IEBACiAKICAgICAgICAgbUJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF0ucHVzaChpbmZvKTsKIAotICAgICAgICBBTE9HVigiWyVzXSBhbGxvY2F0ZWQgbWV0YSBidWZmZXIgd2l0aCBJRCAlcCAocG9pbnRlciA9ICVwKSIsCisgICAgICAgIEFMT0dWKCJbJXNdIGFsbG9jYXRlZCBtZXRhIGJ1ZmZlciB3aXRoIElEICV1IChwb2ludGVyID0gJXApIiwKICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBpbmZvLm1CdWZmZXJJRCwgbWVtLT5wb2ludGVyKCkpOwogICAgIH0KIApAQCAtNzg4LDcgKzg5Nyw3IEBACiAgICAgaWYgKGluZm8gPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogCi0gICAgQUxPR1YoIlslc10gc3VibWl0dGluZyBvdXRwdXQgbWV0YSBidWZmZXIgSUQgJXAgZm9yIGdyYXBoaWMgYnVmZmVyICVwIiwKKyAgICBBTE9HVigiWyVzXSBzdWJtaXR0aW5nIG91dHB1dCBtZXRhIGJ1ZmZlciBJRCAldSBmb3IgZ3JhcGhpYyBidWZmZXIgJXAiLAogICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGluZm8tPm1CdWZmZXJJRCwgaW5mby0+bUdyYXBoaWNCdWZmZXIuZ2V0KCkpOwogCiAgICAgLS1tTWV0YURhdGFCdWZmZXJzVG9TdWJtaXQ7CkBAIC04MDIsMTcgKzkxMSwxOCBAQAogc3RhdHVzX3QgQUNvZGVjOjpjYW5jZWxCdWZmZXJUb05hdGl2ZVdpbmRvdyhCdWZmZXJJbmZvICppbmZvKSB7CiAgICAgQ0hFQ0tfRVEoKGludClpbmZvLT5tU3RhdHVzLCAoaW50KUJ1ZmZlckluZm86Ok9XTkVEX0JZX1VTKTsKIAotICAgIEFMT0dWKCJbJXNdIENhbGxpbmcgY2FuY2VsQnVmZmVyIG9uIGJ1ZmZlciAlcCIsCisgICAgQUxPR1YoIlslc10gQ2FsbGluZyBjYW5jZWxCdWZmZXIgb24gYnVmZmVyICV1IiwKICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGluZm8tPm1CdWZmZXJJRCk7CiAKICAgICBpbnQgZXJyID0gbU5hdGl2ZVdpbmRvdy0+Y2FuY2VsQnVmZmVyKAogICAgICAgICBtTmF0aXZlV2luZG93LmdldCgpLCBpbmZvLT5tR3JhcGhpY0J1ZmZlci5nZXQoKSwgLTEpOwogCi0gICAgQ0hFQ0tfRVEoZXJyLCAwKTsKKyAgICBBTE9HV19JRihlcnIgIT0gMCwgIlslc10gY2FuIG5vdCByZXR1cm4gYnVmZmVyICV1IHRvIG5hdGl2ZSB3aW5kb3ciLAorICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgaW5mby0+bUJ1ZmZlcklEKTsKIAogICAgIGluZm8tPm1TdGF0dXMgPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9OQVRJVkVfV0lORE9XOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBlcnI7CiB9CiAKIEFDb2RlYzo6QnVmZmVySW5mbyAqQUNvZGVjOjpkZXF1ZXVlQnVmZmVyRnJvbU5hdGl2ZVdpbmRvdygpIHsKQEAgLTgyMCw2ICs5MzAsMTIgQEAKICAgICBpbnQgZmVuY2VGZCA9IC0xOwogICAgIENIRUNLKG1OYXRpdmVXaW5kb3cuZ2V0KCkgIT0gTlVMTCk7CiAKKyAgICBpZiAobVR1bm5lbGVkKSB7CisgICAgICAgIEFMT0dXKCJkZXF1ZXVlQnVmZmVyRnJvbU5hdGl2ZVdpbmRvdygpIHNob3VsZCBub3QgYmUgY2FsbGVkIGluIHR1bm5lbCIKKyAgICAgICAgICAgICAgIiB2aWRlbyBwbGF5YmFjayBtb2RlIG1vZGUhIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKwogICAgIGlmIChtRmF0YWxFcnJvcikgewogICAgICAgICBBTE9HVygibm90IGRlcXVldWluZyBmcm9tIG5hdGl2ZSB3aW5kb3cgZHVlIHRvIGZhdGFsIGVycm9yIik7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtOTE5LDcgKzEwMzUsNyBAQAogCiAgICAgaWYgKHBvcnRJbmRleCA9PSBrUG9ydEluZGV4T3V0cHV0ICYmIG1OYXRpdmVXaW5kb3cgIT0gTlVMTAogICAgICAgICAgICAgJiYgaW5mby0+bVN0YXR1cyA9PSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUykgewotICAgICAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIGNhbmNlbEJ1ZmZlclRvTmF0aXZlV2luZG93KGluZm8pKTsKKyAgICAgICAgY2FuY2VsQnVmZmVyVG9OYXRpdmVXaW5kb3coaW5mbyk7CiAgICAgfQogCiAgICAgQ0hFQ0tfRVEobU9NWC0+ZnJlZUJ1ZmZlcigKQEAgLTk3MywxMiArMTA4OSwxNiBAQAogICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIuYWFjIiwgImF1ZGlvX2VuY29kZXIuYWFjIiB9LAogICAgICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUywKICAgICAgICAgICAgICJhdWRpb19kZWNvZGVyLnZvcmJpcyIsICJhdWRpb19lbmNvZGVyLnZvcmJpcyIgfSwKKyAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTLAorICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIub3B1cyIsICJhdWRpb19lbmNvZGVyLm9wdXMiIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXLAogICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIuZzcxMW1sYXciLCAiYXVkaW9fZW5jb2Rlci5nNzExbWxhdyIgfSwKICAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcsCiAgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5nNzExYWxhdyIsICJhdWRpb19lbmNvZGVyLmc3MTFhbGF3IiB9LAogICAgICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywKICAgICAgICAgICAgICJ2aWRlb19kZWNvZGVyLmF2YyIsICJ2aWRlb19lbmNvZGVyLmF2YyIgfSwKKyAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDLAorICAgICAgICAgICAgInZpZGVvX2RlY29kZXIuaGV2YyIsICJ2aWRlb19lbmNvZGVyLmhldmMiIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsCiAgICAgICAgICAgICAidmlkZW9fZGVjb2Rlci5tcGVnNCIsICJ2aWRlb19lbmNvZGVyLm1wZWc0IiB9LAogICAgICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsCkBAIC0xMDQ4LDYgKzExNjgsOSBAQAogICAgICAgICBlbmNvZGVyID0gZmFsc2U7CiAgICAgfQogCisgICAgc3A8QU1lc3NhZ2U+IGlucHV0Rm9ybWF0ID0gbmV3IEFNZXNzYWdlKCk7CisgICAgc3A8QU1lc3NhZ2U+IG91dHB1dEZvcm1hdCA9IG5ldyBBTWVzc2FnZSgpOworCiAgICAgbUlzRW5jb2RlciA9IGVuY29kZXI7CiAKICAgICBzdGF0dXNfdCBlcnIgPSBzZXRDb21wb25lbnRSb2xlKGVuY29kZXIgLyogaXNFbmNvZGVyICovLCBtaW1lKTsKQEAgLTExMzAsNzQgKzEyNTMsMTI0IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIW1zZy0+ZmluZEludDY0KCJtYXgtcHRzLWdhcC10by1lbmNvZGVyIiwgJm1NYXhQdHNHYXBVcykpIHsKLSAgICAgICAgICAgIG1NYXhQdHNHYXBVcyA9IC0xbDsKKyAgICAgICAgICAgIG1NYXhQdHNHYXBVcyA9IC0xbGw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1zZy0+ZmluZEludDY0KCJ0aW1lLWxhcHNlIiwgJm1UaW1lUGVyQ2FwdHVyZVVzKSkgeworICAgICAgICAgICAgbVRpbWVQZXJDYXB0dXJlVXMgPSAtMWxsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigKKyAgICAgICAgICAgICAgICAgICAgImNyZWF0ZS1pbnB1dC1idWZmZXJzLXN1c3BlbmRlZCIsCisgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KikmbUNyZWF0ZUlucHV0QnVmZmVyc1N1c3BlbmRlZCkpIHsKKyAgICAgICAgICAgIG1DcmVhdGVJbnB1dEJ1ZmZlcnNTdXNwZW5kZWQgPSBmYWxzZTsKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIEFsd2F5cyB0cnkgdG8gZW5hYmxlIGR5bmFtaWMgb3V0cHV0IGJ1ZmZlcnMgb24gbmF0aXZlIHN1cmZhY2UKICAgICBzcDxSZWZCYXNlPiBvYmo7CiAgICAgaW50MzJfdCBoYXZlTmF0aXZlV2luZG93ID0gbXNnLT5maW5kT2JqZWN0KCJuYXRpdmUtd2luZG93IiwgJm9iaikgJiYKLSAgICAgICAgICAgIG9iaiAhPSBOVUxMOworICAgICAgICBvYmogIT0gTlVMTDsKICAgICBtU3RvcmVNZXRhRGF0YUluT3V0cHV0QnVmZmVycyA9IGZhbHNlOwotICAgIG1Jc0NvbmZpZ3VyZWRGb3JBZGFwdGl2ZVBsYXliYWNrID0gZmFsc2U7CisgICAgaWYgKHZpZGVvICYmICFlbmNvZGVyKSB7CisgICAgICAgIGlucHV0Rm9ybWF0LT5zZXRJbnQzMigiYWRhcHRpdmUtcGxheWJhY2siLCBmYWxzZSk7CisgICAgfQogICAgIGlmICghZW5jb2RlciAmJiB2aWRlbyAmJiBoYXZlTmF0aXZlV2luZG93KSB7Ci0gICAgICAgIGVyciA9IG1PTVgtPnN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMobU5vZGUsIGtQb3J0SW5kZXhPdXRwdXQsIE9NWF9UUlVFKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIlslc10gc3RvcmVNZXRhRGF0YUluQnVmZmVycyBmYWlsZWQgdy8gZXJyICVkIiwKLSAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CisgICAgICAgIHNwPE5hdGl2ZVdpbmRvd1dyYXBwZXI+IHdpbmRvd1dyYXBwZXIoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TmF0aXZlV2luZG93V3JhcHBlciAqPihvYmouZ2V0KCkpKTsKKyAgICAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gbmF0aXZlV2luZG93ID0gd2luZG93V3JhcHBlci0+Z2V0TmF0aXZlV2luZG93KCk7CiAKLSAgICAgICAgICAgIC8vIGlmIGFkYXB0aXZlIHBsYXliYWNrIGhhcyBiZWVuIHJlcXVlc3RlZCwgdHJ5IEpCIGZhbGxiYWNrCi0gICAgICAgICAgICAvLyBOT1RFOiBUSElTIEZBTExCQUNLIE1FQ0hBTklTTSBXSUxMIEJFIFJFTU9WRUQgRFVFIFRPIElUUwotICAgICAgICAgICAgLy8gTEFSR0UgTUVNT1JZIFJFUVVJUkVNRU5UCisgICAgICAgIGludDMyX3QgdHVubmVsZWQ7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiZmVhdHVyZS10dW5uZWxlZC1wbGF5YmFjayIsICZ0dW5uZWxlZCkgJiYKKyAgICAgICAgICAgIHR1bm5lbGVkICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dJKCJDb25maWd1cmluZyBUVU5ORUxFRCB2aWRlbyBwbGF5YmFjay4iKTsKKyAgICAgICAgICAgIG1UdW5uZWxlZCA9IHRydWU7CiAKLSAgICAgICAgICAgIC8vIHdlIHdpbGwgbm90IGRvIGFkYXB0aXZlIHBsYXliYWNrIG9uIHNvZnR3YXJlIGFjY2Vzc2VkCi0gICAgICAgICAgICAvLyBzdXJmYWNlcyBhcyB0aGV5IG5ldmVyIGhhZCB0byByZXNwb25kIHRvIGNoYW5nZXMgaW4gdGhlCi0gICAgICAgICAgICAvLyBjcm9wIHdpbmRvdywgYW5kIHdlIGRvbid0IHRydXN0IHRoYXQgdGhleSB3aWxsIGJlIGFibGUgdG8uCi0gICAgICAgICAgICBpbnQgdXNhZ2VCaXRzID0gMDsKLSAgICAgICAgICAgIGJvb2wgY2FuRG9BZGFwdGl2ZVBsYXliYWNrOwotCi0gICAgICAgICAgICBzcDxOYXRpdmVXaW5kb3dXcmFwcGVyPiB3aW5kb3dXcmFwcGVyKAotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxOYXRpdmVXaW5kb3dXcmFwcGVyICo+KG9iai5nZXQoKSkpOwotICAgICAgICAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gbmF0aXZlV2luZG93ID0gd2luZG93V3JhcHBlci0+Z2V0TmF0aXZlV2luZG93KCk7Ci0KLSAgICAgICAgICAgIGlmIChuYXRpdmVXaW5kb3ctPnF1ZXJ5KAotICAgICAgICAgICAgICAgICAgICBuYXRpdmVXaW5kb3cuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfQ09OU1VNRVJfVVNBR0VfQklUUywKLSAgICAgICAgICAgICAgICAgICAgJnVzYWdlQml0cykgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBjYW5Eb0FkYXB0aXZlUGxheWJhY2sgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY2FuRG9BZGFwdGl2ZVBsYXliYWNrID0KLSAgICAgICAgICAgICAgICAgICAgKHVzYWdlQml0cyAmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9NQVNLIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19XUklURV9NQVNLKSkgPT0gMDsKKyAgICAgICAgICAgIGludDMyX3QgYXVkaW9Id1N5bmMgPSAwOworICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiYXVkaW8taHctc3luYyIsICZhdWRpb0h3U3luYykpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiTm8gQXVkaW8gSFcgU3luYyBwcm92aWRlZCBmb3IgdmlkZW8gdHVubmVsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlcnIgPSBjb25maWd1cmVUdW5uZWxlZFZpZGVvUGxheWJhY2soYXVkaW9Id1N5bmMsIG5hdGl2ZVdpbmRvdyk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImNvbmZpZ3VyZVR1bm5lbGVkVmlkZW9QbGF5YmFjayglZCwlcCkgZmFpbGVkISIsCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb0h3U3luYywgbmF0aXZlV2luZG93LmdldCgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpbnQzMl90IG1heFdpZHRoID0gMCwgbWF4SGVpZ2h0ID0gMDsKLSAgICAgICAgICAgIGlmIChjYW5Eb0FkYXB0aXZlUGxheWJhY2sgJiYKLSAgICAgICAgICAgICAgICBtc2ctPmZpbmRJbnQzMigibWF4LXdpZHRoIiwgJm1heFdpZHRoKSAmJgotICAgICAgICAgICAgICAgIG1zZy0+ZmluZEludDMyKCJtYXgtaGVpZ2h0IiwgJm1heEhlaWdodCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBwcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFjayglbGR4JWxkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgbWF4V2lkdGgsIG1heEhlaWdodCk7Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSBtT01YLT5wcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFjaygKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBrUG9ydEluZGV4T3V0cHV0LCBPTVhfVFJVRSwgbWF4V2lkdGgsIG1heEhlaWdodCk7Ci0gICAgICAgICAgICAgICAgQUxPR1dfSUYoZXJyICE9IE9LLAotICAgICAgICAgICAgICAgICAgICAgICAgIlslc10gcHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2sgZmFpbGVkIHcvIGVyciAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOwotICAgICAgICAgICAgICAgIG1Jc0NvbmZpZ3VyZWRGb3JBZGFwdGl2ZVBsYXliYWNrID0gKGVyciA9PSBPSyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBhbGxvdyBmYWlsdXJlCi0gICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgICAgIGlucHV0Rm9ybWF0LT5zZXRJbnQzMigiYWRhcHRpdmUtcGxheWJhY2siLCB0cnVlKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dWKCJbJXNdIHN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMgc3VjY2VlZGVkIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICBtU3RvcmVNZXRhRGF0YUluT3V0cHV0QnVmZmVycyA9IHRydWU7Ci0gICAgICAgICAgICBtSXNDb25maWd1cmVkRm9yQWRhcHRpdmVQbGF5YmFjayA9IHRydWU7CisgICAgICAgICAgICBBTE9HVigiQ29uZmlndXJpbmcgQ1BVIGNvbnRyb2xsZWQgdmlkZW8gcGxheWJhY2suIik7CisgICAgICAgICAgICBtVHVubmVsZWQgPSBmYWxzZTsKKworICAgICAgICAgICAgLy8gQWx3YXlzIHRyeSB0byBlbmFibGUgZHluYW1pYyBvdXRwdXQgYnVmZmVycyBvbiBuYXRpdmUgc3VyZmFjZQorICAgICAgICAgICAgZXJyID0gbU9NWC0+c3RvcmVNZXRhRGF0YUluQnVmZmVycygKKyAgICAgICAgICAgICAgICAgICAgbU5vZGUsIGtQb3J0SW5kZXhPdXRwdXQsIE9NWF9UUlVFKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiWyVzXSBzdG9yZU1ldGFEYXRhSW5CdWZmZXJzIGZhaWxlZCB3LyBlcnIgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKKworICAgICAgICAgICAgICAgIC8vIGlmIGFkYXB0aXZlIHBsYXliYWNrIGhhcyBiZWVuIHJlcXVlc3RlZCwgdHJ5IEpCIGZhbGxiYWNrCisgICAgICAgICAgICAgICAgLy8gTk9URTogVEhJUyBGQUxMQkFDSyBNRUNIQU5JU00gV0lMTCBCRSBSRU1PVkVEIERVRSBUTyBJVFMKKyAgICAgICAgICAgICAgICAvLyBMQVJHRSBNRU1PUlkgUkVRVUlSRU1FTlQKKworICAgICAgICAgICAgICAgIC8vIHdlIHdpbGwgbm90IGRvIGFkYXB0aXZlIHBsYXliYWNrIG9uIHNvZnR3YXJlIGFjY2Vzc2VkCisgICAgICAgICAgICAgICAgLy8gc3VyZmFjZXMgYXMgdGhleSBuZXZlciBoYWQgdG8gcmVzcG9uZCB0byBjaGFuZ2VzIGluIHRoZQorICAgICAgICAgICAgICAgIC8vIGNyb3Agd2luZG93LCBhbmQgd2UgZG9uJ3QgdHJ1c3QgdGhhdCB0aGV5IHdpbGwgYmUgYWJsZSB0by4KKyAgICAgICAgICAgICAgICBpbnQgdXNhZ2VCaXRzID0gMDsKKyAgICAgICAgICAgICAgICBib29sIGNhbkRvQWRhcHRpdmVQbGF5YmFjazsKKworICAgICAgICAgICAgICAgIGlmIChuYXRpdmVXaW5kb3ctPnF1ZXJ5KAorICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlV2luZG93LmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19DT05TVU1FUl9VU0FHRV9CSVRTLAorICAgICAgICAgICAgICAgICAgICAgICAgJnVzYWdlQml0cykgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgY2FuRG9BZGFwdGl2ZVBsYXliYWNrID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY2FuRG9BZGFwdGl2ZVBsYXliYWNrID0KKyAgICAgICAgICAgICAgICAgICAgICAgICh1c2FnZUJpdHMgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR1JBTExPQ19VU0FHRV9TV19SRUFEX01BU0sgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19XUklURV9NQVNLKSkgPT0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQzMl90IG1heFdpZHRoID0gMCwgbWF4SGVpZ2h0ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoY2FuRG9BZGFwdGl2ZVBsYXliYWNrICYmCisgICAgICAgICAgICAgICAgICAgICAgICBtc2ctPmZpbmRJbnQzMigibWF4LXdpZHRoIiwgJm1heFdpZHRoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbXNnLT5maW5kSW50MzIoIm1heC1oZWlnaHQiLCAmbWF4SGVpZ2h0KSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBwcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFjayglZHglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIG1heFdpZHRoLCBtYXhIZWlnaHQpOworCisgICAgICAgICAgICAgICAgICAgIGVyciA9IG1PTVgtPnByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBrUG9ydEluZGV4T3V0cHV0LCBPTVhfVFJVRSwgbWF4V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4SGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1dfSUYoZXJyICE9IE9LLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbJXNdIHByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrIGZhaWxlZCB3LyBlcnIgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRGb3JtYXQtPnNldEludDMyKCJtYXgtd2lkdGgiLCBtYXhXaWR0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEZvcm1hdC0+c2V0SW50MzIoIm1heC1oZWlnaHQiLCBtYXhIZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRGb3JtYXQtPnNldEludDMyKCJhZGFwdGl2ZS1wbGF5YmFjayIsIHRydWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGFsbG93IGZhaWx1cmUKKyAgICAgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gc3RvcmVNZXRhRGF0YUluQnVmZmVycyBzdWNjZWVkZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgbVN0b3JlTWV0YURhdGFJbk91dHB1dEJ1ZmZlcnMgPSB0cnVlOworICAgICAgICAgICAgICAgIGlucHV0Rm9ybWF0LT5zZXRJbnQzMigiYWRhcHRpdmUtcGxheWJhY2siLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50MzJfdCBwdXNoOworICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJwdXNoLWJsYW5rLWJ1ZmZlcnMtb24tc2h1dGRvd24iLCAmcHVzaCkKKyAgICAgICAgICAgICAgICAgICAgJiYgcHVzaCAhPSAwKSB7CisgICAgICAgICAgICAgICAgbUZsYWdzIHw9IGtGbGFnUHVzaEJsYW5rQnVmZmVyc1RvTmF0aXZlV2luZG93T25TaHV0ZG93bjsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGludDMyX3QgcHVzaDsKLSAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJwdXNoLWJsYW5rLWJ1ZmZlcnMtb24tc2h1dGRvd24iLCAmcHVzaCkKLSAgICAgICAgICAgICAgICAmJiBwdXNoICE9IDApIHsKLSAgICAgICAgICAgIG1GbGFncyB8PSBrRmxhZ1B1c2hCbGFua0J1ZmZlcnNUb05hdGl2ZVdpbmRvd09uU2h1dGRvd247CisgICAgICAgIGludDMyX3Qgcm90YXRpb25EZWdyZWVzOworICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoInJvdGF0aW9uLWRlZ3JlZXMiLCAmcm90YXRpb25EZWdyZWVzKSkgeworICAgICAgICAgICAgbVJvdGF0aW9uRGVncmVlcyA9IHJvdGF0aW9uRGVncmVlczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Sb3RhdGlvbkRlZ3JlZXMgPSAwOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMjA1LDEzICsxMzc4LDcgQEAKICAgICAgICAgaWYgKGVuY29kZXIpIHsKICAgICAgICAgICAgIGVyciA9IHNldHVwVmlkZW9FbmNvZGVyKG1pbWUsIG1zZyk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7Ci0gICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkKLSAgICAgICAgICAgICAgICAgICAgfHwgIW1zZy0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSkgewotICAgICAgICAgICAgICAgIGVyciA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBzZXR1cFZpZGVvRGVjb2RlcihtaW1lLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVyciA9IHNldHVwVmlkZW9EZWNvZGVyKG1pbWUsIG1zZyk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpKSB7CiAgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHMsIHNhbXBsZVJhdGU7CkBAIC0xMjMzLDE2ICsxNDAwLDUyIEBACiAgICAgICAgICAgICBlcnIgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGludDMyX3QgaXNBRFRTLCBhYWNQcm9maWxlOworICAgICAgICAgICAgaW50MzJfdCBzYnJNb2RlOworICAgICAgICAgICAgaW50MzJfdCBtYXhPdXRwdXRDaGFubmVsQ291bnQ7CisgICAgICAgICAgICBpbnQzMl90IHBjbUxpbWl0ZXJFbmFibGU7CisgICAgICAgICAgICBkcmNQYXJhbXNfdCBkcmM7CiAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJpcy1hZHRzIiwgJmlzQURUUykpIHsKICAgICAgICAgICAgICAgICBpc0FEVFMgPSAwOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiYWFjLXByb2ZpbGUiLCAmYWFjUHJvZmlsZSkpIHsKICAgICAgICAgICAgICAgICBhYWNQcm9maWxlID0gT01YX0FVRElPX0FBQ09iamVjdE51bGw7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJhYWMtc2JyLW1vZGUiLCAmc2JyTW9kZSkpIHsKKyAgICAgICAgICAgICAgICBzYnJNb2RlID0gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImFhYy1tYXgtb3V0cHV0LWNoYW5uZWxfY291bnQiLCAmbWF4T3V0cHV0Q2hhbm5lbENvdW50KSkgeworICAgICAgICAgICAgICAgIG1heE91dHB1dENoYW5uZWxDb3VudCA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiYWFjLXBjbS1saW1pdGVyLWVuYWJsZSIsICZwY21MaW1pdGVyRW5hYmxlKSkgeworICAgICAgICAgICAgICAgIC8vIHZhbHVlIGlzIHVua25vd24KKyAgICAgICAgICAgICAgICBwY21MaW1pdGVyRW5hYmxlID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJhYWMtZW5jb2RlZC10YXJnZXQtbGV2ZWwiLCAmZHJjLmVuY29kZWRUYXJnZXRMZXZlbCkpIHsKKyAgICAgICAgICAgICAgICAvLyB2YWx1ZSBpcyB1bmtub3duCisgICAgICAgICAgICAgICAgZHJjLmVuY29kZWRUYXJnZXRMZXZlbCA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiYWFjLWRyYy1jdXQtbGV2ZWwiLCAmZHJjLmRyY0N1dCkpIHsKKyAgICAgICAgICAgICAgICAvLyB2YWx1ZSBpcyB1bmtub3duCisgICAgICAgICAgICAgICAgZHJjLmRyY0N1dCA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiYWFjLWRyYy1ib29zdC1sZXZlbCIsICZkcmMuZHJjQm9vc3QpKSB7CisgICAgICAgICAgICAgICAgLy8gdmFsdWUgaXMgdW5rbm93bgorICAgICAgICAgICAgICAgIGRyYy5kcmNCb29zdCA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiYWFjLWRyYy1oZWF2eS1jb21wcmVzc2lvbiIsICZkcmMuaGVhdnlDb21wcmVzc2lvbikpIHsKKyAgICAgICAgICAgICAgICAvLyB2YWx1ZSBpcyB1bmtub3duCisgICAgICAgICAgICAgICAgZHJjLmhlYXZ5Q29tcHJlc3Npb24gPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImFhYy10YXJnZXQtcmVmLWxldmVsIiwgJmRyYy50YXJnZXRSZWZMZXZlbCkpIHsKKyAgICAgICAgICAgICAgICAvLyB2YWx1ZSBpcyB1bmtub3duCisgICAgICAgICAgICAgICAgZHJjLnRhcmdldFJlZkxldmVsID0gLTE7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGVyciA9IHNldHVwQUFDQ29kZWMoCiAgICAgICAgICAgICAgICAgICAgIGVuY29kZXIsIG51bUNoYW5uZWxzLCBzYW1wbGVSYXRlLCBiaXRSYXRlLCBhYWNQcm9maWxlLAotICAgICAgICAgICAgICAgICAgICBpc0FEVFMgIT0gMCk7CisgICAgICAgICAgICAgICAgICAgIGlzQURUUyAhPSAwLCBzYnJNb2RlLCBtYXhPdXRwdXRDaGFubmVsQ291bnQsIGRyYywKKyAgICAgICAgICAgICAgICAgICAgcGNtTGltaXRlckVuYWJsZSk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQikpIHsKICAgICAgICAgZXJyID0gc2V0dXBBTVJDb2RlYyhlbmNvZGVyLCBmYWxzZSAvKiBpc1dBTVIgKi8sIGJpdFJhdGUpOwpAQCAtMTI2OSw4ICsxNDcyLDEwIEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAoZW5jb2RlcikgewogICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBsZXhpdHkiLCAmY29tcHJlc3Npb25MZXZlbCkgJiYKKyAgICAgICAgICAgICAgICAgICAgIW1zZy0+ZmluZEludDMyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmbGFjLWNvbXByZXNzaW9uLWxldmVsIiwgJmNvbXByZXNzaW9uTGV2ZWwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uTGV2ZWwgPSA1Oy8vIGRlZmF1bHQgRkxBQyBjb21wcmVzc2lvbiBsZXZlbAorICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbkxldmVsID0gNTsgLy8gZGVmYXVsdCBGTEFDIGNvbXByZXNzaW9uIGxldmVsCiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb21wcmVzc2lvbkxldmVsIDwgMCkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVygiY29tcHJlc3Npb24gbGV2ZWwgJWQgb3V0c2lkZSBbMC4uOF0gcmFuZ2UsICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIDAiLApAQCAtMTMzMSw2ICsxNTM2LDExIEBACiAgICAgICAgIGVyciA9IHNldE1pbkJ1ZmZlclNpemUoa1BvcnRJbmRleElucHV0LCA4MTkyKTsgIC8vIFhYWAogICAgIH0KIAorICAgIENIRUNLX0VRKGdldFBvcnRGb3JtYXQoa1BvcnRJbmRleElucHV0LCBpbnB1dEZvcm1hdCksIChzdGF0dXNfdClPSyk7CisgICAgQ0hFQ0tfRVEoZ2V0UG9ydEZvcm1hdChrUG9ydEluZGV4T3V0cHV0LCBvdXRwdXRGb3JtYXQpLCAoc3RhdHVzX3QpT0spOworICAgIG1JbnB1dEZvcm1hdCA9IGlucHV0Rm9ybWF0OworICAgIG1PdXRwdXRGb3JtYXQgPSBvdXRwdXRGb3JtYXQ7CisKICAgICByZXR1cm4gZXJyOwogfQogCkBAIC0xMzk5LDcgKzE2MDksOSBAQAogCiBzdGF0dXNfdCBBQ29kZWM6OnNldHVwQUFDQ29kZWMoCiAgICAgICAgIGJvb2wgZW5jb2RlciwgaW50MzJfdCBudW1DaGFubmVscywgaW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICBpbnQzMl90IGJpdFJhdGUsIGludDMyX3QgYWFjUHJvZmlsZSwgYm9vbCBpc0FEVFMpIHsKKyAgICAgICAgaW50MzJfdCBiaXRSYXRlLCBpbnQzMl90IGFhY1Byb2ZpbGUsIGJvb2wgaXNBRFRTLCBpbnQzMl90IHNick1vZGUsCisgICAgICAgIGludDMyX3QgbWF4T3V0cHV0Q2hhbm5lbENvdW50LCBjb25zdCBkcmNQYXJhbXNfdCYgZHJjLAorICAgICAgICBpbnQzMl90IHBjbUxpbWl0ZXJFbmFibGUpIHsKICAgICBpZiAoZW5jb2RlciAmJiBpc0FEVFMpIHsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQpAQCAtMTQ2Niw2ICsxNjc4LDMyIEBACiAgICAgICAgIHByb2ZpbGUubkFBQ0VSdG9vbHMgPSBPTVhfQVVESU9fQUFDRVJOb25lOwogICAgICAgICBwcm9maWxlLmVBQUNQcm9maWxlID0gKE9NWF9BVURJT19BQUNQUk9GSUxFVFlQRSkgYWFjUHJvZmlsZTsKICAgICAgICAgcHJvZmlsZS5lQUFDU3RyZWFtRm9ybWF0ID0gT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdE1QNEZGOworICAgICAgICBzd2l0Y2ggKHNick1vZGUpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgLy8gZGlzYWJsZSBzYnIKKyAgICAgICAgICAgIHByb2ZpbGUubkFBQ3Rvb2xzICY9IH5PTVhfQVVESU9fQUFDVG9vbEFuZHJvaWRTU0JSOworICAgICAgICAgICAgcHJvZmlsZS5uQUFDdG9vbHMgJj0gfk9NWF9BVURJT19BQUNUb29sQW5kcm9pZERTQlI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgLy8gZW5hYmxlIHNpbmdsZS1yYXRlIHNicgorICAgICAgICAgICAgcHJvZmlsZS5uQUFDdG9vbHMgfD0gT01YX0FVRElPX0FBQ1Rvb2xBbmRyb2lkU1NCUjsKKyAgICAgICAgICAgIHByb2ZpbGUubkFBQ3Rvb2xzICY9IH5PTVhfQVVESU9fQUFDVG9vbEFuZHJvaWREU0JSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIC8vIGVuYWJsZSBkdWFsLXJhdGUgc2JyCisgICAgICAgICAgICBwcm9maWxlLm5BQUN0b29scyAmPSB+T01YX0FVRElPX0FBQ1Rvb2xBbmRyb2lkU1NCUjsKKyAgICAgICAgICAgIHByb2ZpbGUubkFBQ3Rvb2xzIHw9IE9NWF9BVURJT19BQUNUb29sQW5kcm9pZERTQlI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAtMToKKyAgICAgICAgICAgIC8vIGVuYWJsZSBib3RoIG1vZGVzIC0+IHRoZSBjb2RlYyB3aWxsIGRlY2lkZSB3aGljaCBtb2RlIHNob3VsZCBiZSB1c2VkCisgICAgICAgICAgICBwcm9maWxlLm5BQUN0b29scyB8PSBPTVhfQVVESU9fQUFDVG9vbEFuZHJvaWRTU0JSOworICAgICAgICAgICAgcHJvZmlsZS5uQUFDdG9vbHMgfD0gT01YX0FVRElPX0FBQ1Rvb2xBbmRyb2lkRFNCUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLy8gdW5zdXBwb3J0ZWQgc2JyIG1vZGUKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKwogCiAgICAgICAgIGVyciA9IG1PTVgtPnNldFBhcmFtZXRlcigKICAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1BdWRpb0FhYywgJnByb2ZpbGUsIHNpemVvZihwcm9maWxlKSk7CkBAIC0xNDk2LDggKzE3MzQsMjUgQEAKICAgICAgICAgICAgID8gT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdE1QNEFEVFMKICAgICAgICAgICAgIDogT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdE1QNEZGOwogCi0gICAgcmV0dXJuIG1PTVgtPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbUF1ZGlvQWFjLCAmcHJvZmlsZSwgc2l6ZW9mKHByb2ZpbGUpKTsKKyAgICBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9BQUNQUkVTRU5UQVRJT05UWVBFIHByZXNlbnRhdGlvbjsKKyAgICBJbml0T01YUGFyYW1zKCZwcmVzZW50YXRpb24pOworICAgIHByZXNlbnRhdGlvbi5uTWF4T3V0cHV0Q2hhbm5lbHMgPSBtYXhPdXRwdXRDaGFubmVsQ291bnQ7CisgICAgcHJlc2VudGF0aW9uLm5EcmNDdXQgPSBkcmMuZHJjQ3V0OworICAgIHByZXNlbnRhdGlvbi5uRHJjQm9vc3QgPSBkcmMuZHJjQm9vc3Q7CisgICAgcHJlc2VudGF0aW9uLm5IZWF2eUNvbXByZXNzaW9uID0gZHJjLmhlYXZ5Q29tcHJlc3Npb247CisgICAgcHJlc2VudGF0aW9uLm5UYXJnZXRSZWZlcmVuY2VMZXZlbCA9IGRyYy50YXJnZXRSZWZMZXZlbDsKKyAgICBwcmVzZW50YXRpb24ubkVuY29kZWRUYXJnZXRMZXZlbCA9IGRyYy5lbmNvZGVkVGFyZ2V0TGV2ZWw7CisgICAgcHJlc2VudGF0aW9uLm5QQ01MaW1pdGVyRW5hYmxlID0gcGNtTGltaXRlckVuYWJsZTsKKworICAgIHN0YXR1c190IHJlcyA9IG1PTVgtPnNldFBhcmFtZXRlcihtTm9kZSwgT01YX0luZGV4UGFyYW1BdWRpb0FhYywgJnByb2ZpbGUsIHNpemVvZihwcm9maWxlKSk7CisgICAgaWYgKHJlcyA9PSBPSykgeworICAgICAgICAvLyBvcHRpb25hbCBwYXJhbWV0ZXJzLCB3aWxsIG5vdCBjYXVzZSBjb25maWd1cmF0aW9uIGZhaWx1cmUKKyAgICAgICAgbU9NWC0+c2V0UGFyYW1ldGVyKG1Ob2RlLCAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZEFhY1ByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAmcHJlc2VudGF0aW9uLCBzaXplb2YocHJlc2VudGF0aW9uKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1coImRpZCBub3Qgc2V0IEF1ZGlvQW5kcm9pZEFhY1ByZXNlbnRhdGlvbiBkdWUgdG8gZXJyb3IgJWQgd2hlbiBzZXR0aW5nIEF1ZGlvQWFjIiwgcmVzKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdHVzX3QgQUNvZGVjOjpzZXR1cEFDM0NvZGVjKApAQCAtMTY5NCw2ICsxOTQ5LDI3IEBACiAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1BdWRpb1BjbSwgJnBjbVBhcmFtcywgc2l6ZW9mKHBjbVBhcmFtcykpOwogfQogCitzdGF0dXNfdCBBQ29kZWM6OmNvbmZpZ3VyZVR1bm5lbGVkVmlkZW9QbGF5YmFjaygKKyAgICAgICAgaW50MzJfdCBhdWRpb0h3U3luYywgY29uc3Qgc3A8QU5hdGl2ZVdpbmRvdz4gJm5hdGl2ZVdpbmRvdykgeworICAgIG5hdGl2ZV9oYW5kbGVfdCogc2lkZWJhbmRIYW5kbGU7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBtT01YLT5jb25maWd1cmVWaWRlb1R1bm5lbE1vZGUoCisgICAgICAgICAgICBtTm9kZSwga1BvcnRJbmRleE91dHB1dCwgT01YX1RSVUUsIGF1ZGlvSHdTeW5jLCAmc2lkZWJhbmRIYW5kbGUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoImNvbmZpZ3VyZVZpZGVvVHVubmVsTW9kZSBmYWlsZWQhIChlcnIgJWQpLiIsIGVycik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfc2lkZWJhbmRfc3RyZWFtKG5hdGl2ZVdpbmRvdy5nZXQoKSwgc2lkZWJhbmRIYW5kbGUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIm5hdGl2ZV93aW5kb3dfc2V0X3NpZGViYW5kX3N0cmVhbSglcCkgZmFpbGVkISAoZXJyICVkKS4iLAorICAgICAgICAgICAgICAgIHNpZGViYW5kSGFuZGxlLCBlcnIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgQUNvZGVjOjpzZXRWaWRlb1BvcnRGb3JtYXRUeXBlKAogICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwKICAgICAgICAgT01YX1ZJREVPX0NPRElOR1RZUEUgY29tcHJlc3Npb25Gb3JtYXQsCkBAIC0xNzE1LDYgKzE5OTEsMTcgQEAKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KIAorICAgICAgICAvLyBzdWJzdGl0dXRlIGJhY2sgZmxleGlibGUgY29sb3IgZm9ybWF0IHRvIGNvZGVjIHN1cHBvcnRlZCBmb3JtYXQKKyAgICAgICAgT01YX1UzMiBmbGV4aWJsZUVxdWl2YWxlbnQ7CisgICAgICAgIGlmIChjb21wcmVzc2lvbkZvcm1hdCA9PSBPTVhfVklERU9fQ29kaW5nVW51c2VkICYmCisgICAgICAgICAgICAgICAgaXNGbGV4aWJsZUNvbG9yRm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgbU9NWCwgbU5vZGUsIGZvcm1hdC5lQ29sb3JGb3JtYXQsICZmbGV4aWJsZUVxdWl2YWxlbnQpICYmCisgICAgICAgICAgICAgICAgY29sb3JGb3JtYXQgPT0gZmxleGlibGVFcXVpdmFsZW50KSB7CisgICAgICAgICAgICBBTE9HSSgiWyVzXSB1c2luZyBjb2xvciBmb3JtYXQgJSN4IGluIHBsYWNlIG9mICUjeCIsCisgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGZvcm1hdC5lQ29sb3JGb3JtYXQsIGNvbG9yRm9ybWF0KTsKKyAgICAgICAgICAgIGNvbG9yRm9ybWF0ID0gZm9ybWF0LmVDb2xvckZvcm1hdDsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgYXNzZXJ0aW9uIGlzIHZpb2xhdGVkIGJ5IFRJJ3MgdmlkZW8gZGVjb2Rlci4KICAgICAgICAgLy8gQ0hFQ0tfRVEoZm9ybWF0Lm5JbmRleCwgaW5kZXgpOwogCkBAIC0xNzc1LDYgKzIwNjIsNyBAQAogICAgIE9NWF9WSURFT19DT0RJTkdUWVBFIG1WaWRlb0NvZGluZ1R5cGU7CiB9IGtWaWRlb0NvZGluZ01hcEVudHJ5W10gPSB7CiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsIE9NWF9WSURFT19Db2RpbmdBVkMgfSwKKyAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMsIE9NWF9WSURFT19Db2RpbmdIRVZDIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgT01YX1ZJREVPX0NvZGluZ01QRUc0IH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCBPTVhfVklERU9fQ29kaW5nSDI2MyB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIsIE9NWF9WSURFT19Db2RpbmdNUEVHMiB9LApAQCAtMTgxNSw3ICsyMTAzLDEzIEBACiB9CiAKIHN0YXR1c190IEFDb2RlYzo6c2V0dXBWaWRlb0RlY29kZXIoCi0gICAgICAgIGNvbnN0IGNoYXIgKm1pbWUsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7CisgICAgICAgIGNvbnN0IGNoYXIgKm1pbWUsIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgIGlmICghbXNnLT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKQorICAgICAgICAgICAgfHwgIW1zZy0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCiAgICAgT01YX1ZJREVPX0NPRElOR1RZUEUgY29tcHJlc3Npb25Gb3JtYXQ7CiAgICAgc3RhdHVzX3QgZXJyID0gR2V0VmlkZW9Db2RpbmdUeXBlRnJvbU1pbWUobWltZSwgJmNvbXByZXNzaW9uRm9ybWF0KTsKIApAQCAtMTgzMCw3ICsyMTI0LDIwIEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCi0gICAgZXJyID0gc2V0U3VwcG9ydGVkT3V0cHV0Rm9ybWF0KCk7CisgICAgaW50MzJfdCB0bXA7CisgICAgaWYgKG1zZy0+ZmluZEludDMyKCJjb2xvci1mb3JtYXQiLCAmdG1wKSkgeworICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBjb2xvckZvcm1hdCA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxPTVhfQ09MT1JfRk9STUFUVFlQRT4odG1wKTsKKyAgICAgICAgZXJyID0gc2V0VmlkZW9Qb3J0Rm9ybWF0VHlwZSgKKyAgICAgICAgICAgICAgICBrUG9ydEluZGV4T3V0cHV0LCBPTVhfVklERU9fQ29kaW5nVW51c2VkLCBjb2xvckZvcm1hdCk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dXKCJbJXNdIGRvZXMgbm90IHN1cHBvcnQgY29sb3IgZm9ybWF0ICVkIiwKKyAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGNvbG9yRm9ybWF0KTsKKyAgICAgICAgICAgIGVyciA9IHNldFN1cHBvcnRlZE91dHB1dEZvcm1hdCgpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZXJyID0gc2V0U3VwcG9ydGVkT3V0cHV0Rm9ybWF0KCk7CisgICAgfQogCiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICByZXR1cm4gZXJyOwpAQCAtMTkyMSw2ICsyMjI4LDcgQEAKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfQogICAgICAgICBmcmFtZVJhdGUgPSAoZmxvYXQpdG1wOworICAgICAgICBtVGltZVBlckZyYW1lVXMgPSAoaW50NjRfdCkgKDEwMDAwMDAuMGYgLyBmcmFtZVJhdGUpOwogICAgIH0KIAogICAgIHZpZGVvX2RlZi0+eEZyYW1lcmF0ZSA9IChPTVhfVTMyKShmcmFtZVJhdGUgKiA2NTUzNi4wZik7CkBAIC0xOTk1LDYgKzIzMDMsMTAgQEAKICAgICAgICAgICAgIGVyciA9IHNldHVwQVZDRW5jb2RlclBhcmFtZXRlcnMobXNnKTsKICAgICAgICAgICAgIGJyZWFrOwogCisgICAgICAgIGNhc2UgT01YX1ZJREVPX0NvZGluZ0hFVkM6CisgICAgICAgICAgICBlcnIgPSBzZXR1cEhFVkNFbmNvZGVyUGFyYW1ldGVycyhtc2cpOworICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgY2FzZSBPTVhfVklERU9fQ29kaW5nVlA4OgogICAgICAgICBjYXNlIE9NWF9WSURFT19Db2RpbmdWUDk6CiAgICAgICAgICAgICBlcnIgPSBzZXR1cFZQWEVuY29kZXJQYXJhbWV0ZXJzKG1zZyk7CkBAIC0yMDUzLDcgKzIzNjUsNiBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgT01YX1UzMiByZXQgPSBmcmFtZVJhdGUgKiBpRnJhbWVzSW50ZXJ2YWw7Ci0gICAgQ0hFQ0socmV0ID4gMSk7CiAgICAgcmV0dXJuIHJldDsKIH0KIApAQCAtMjIyMyw2ICsyNTM0LDU4IEBACiAgICAgcmV0dXJuIHNldHVwRXJyb3JDb3JyZWN0aW9uUGFyYW1ldGVycygpOwogfQogCisvLyBzdGF0aWMKK2ludCAvKiBPTVhfVklERU9fQVZDTEVWRUxUWVBFICovIEFDb2RlYzo6Z2V0QVZDTGV2ZWxGb3IoCisgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHJhdGUsIGludCBiaXRyYXRlLAorICAgICAgICBPTVhfVklERU9fQVZDUFJPRklMRVRZUEUgcHJvZmlsZSkgeworICAgIC8vIGNvbnZlcnQgYml0cmF0ZSB0byBtYWluL2Jhc2VsaW5lIHByb2ZpbGUga2JwcyBlcXVpdmFsZW50CisgICAgc3dpdGNoIChwcm9maWxlKSB7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoMTA6CisgICAgICAgICAgICBiaXRyYXRlID0gZGl2VXAoYml0cmF0ZSwgMzAwMCk7IGJyZWFrOworICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNQcm9maWxlSGlnaDoKKyAgICAgICAgICAgIGJpdHJhdGUgPSBkaXZVcChiaXRyYXRlLCAxMjUwKTsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBiaXRyYXRlID0gZGl2VXAoYml0cmF0ZSwgMTAwMCk7IGJyZWFrOworICAgIH0KKworICAgIC8vIGNvbnZlcnQgc2l6ZSBhbmQgcmF0ZSB0byBNQnMKKyAgICB3aWR0aCA9IGRpdlVwKHdpZHRoLCAxNik7CisgICAgaGVpZ2h0ID0gZGl2VXAoaGVpZ2h0LCAxNik7CisgICAgaW50IG1icyA9IHdpZHRoICogaGVpZ2h0OworICAgIHJhdGUgKj0gbWJzOworICAgIGludCBtYXhEaW1lbnNpb24gPSBtYXgod2lkdGgsIGhlaWdodCk7CisKKyAgICBzdGF0aWMgY29uc3QgaW50IGxpbWl0c1tdWzVdID0geworICAgICAgICAvKiAgIE1CcHMgICAgIE1CICAgZGltICBiaXRyYXRlICAgICAgICBsZXZlbCAqLworICAgICAgICB7ICAgIDE0ODUsICAgIDk5LCAgMjgsICAgICA2NCwgT01YX1ZJREVPX0FWQ0xldmVsMSAgfSwKKyAgICAgICAgeyAgICAxNDg1LCAgICA5OSwgIDI4LCAgICAxMjgsIE9NWF9WSURFT19BVkNMZXZlbDFiIH0sCisgICAgICAgIHsgICAgMzAwMCwgICAzOTYsICA1NiwgICAgMTkyLCBPTVhfVklERU9fQVZDTGV2ZWwxMSB9LAorICAgICAgICB7ICAgIDYwMDAsICAgMzk2LCAgNTYsICAgIDM4NCwgT01YX1ZJREVPX0FWQ0xldmVsMTIgfSwKKyAgICAgICAgeyAgIDExODgwLCAgIDM5NiwgIDU2LCAgICA3NjgsIE9NWF9WSURFT19BVkNMZXZlbDEzIH0sCisgICAgICAgIHsgICAxMTg4MCwgICAzOTYsICA1NiwgICAyMDAwLCBPTVhfVklERU9fQVZDTGV2ZWwyICB9LAorICAgICAgICB7ICAgMTk4MDAsICAgNzkyLCAgNzksICAgNDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsMjEgfSwKKyAgICAgICAgeyAgIDIwMjUwLCAgMTYyMCwgMTEzLCAgIDQwMDAsIE9NWF9WSURFT19BVkNMZXZlbDIyIH0sCisgICAgICAgIHsgICA0MDUwMCwgIDE2MjAsIDExMywgIDEwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWwzICB9LAorICAgICAgICB7ICAxMDgwMDAsICAzNjAwLCAxNjksICAxNDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsMzEgfSwKKyAgICAgICAgeyAgMjE2MDAwLCAgNTEyMCwgMjAyLCAgMjAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDMyIH0sCisgICAgICAgIHsgIDI0NTc2MCwgIDgxOTIsIDI1NiwgIDIwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWw0ICB9LAorICAgICAgICB7ICAyNDU3NjAsICA4MTkyLCAyNTYsICA1MDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNDEgfSwKKyAgICAgICAgeyAgNTIyMjQwLCAgODcwNCwgMjYzLCAgNTAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDQyIH0sCisgICAgICAgIHsgIDU4OTgyNCwgMjIwODAsIDQyMCwgMTM1MDAwLCBPTVhfVklERU9fQVZDTGV2ZWw1ICB9LAorICAgICAgICB7ICA5ODMwNDAsIDM2ODY0LCA1NDMsIDI0MDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNTEgfSwKKyAgICAgICAgeyAyMDczNjAwLCAzNjg2NCwgNTQzLCAyNDAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDUyIH0sCisgICAgfTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShsaW1pdHMpOyBpKyspIHsKKyAgICAgICAgY29uc3QgaW50ICgmbGltaXQpWzVdID0gbGltaXRzW2ldOworICAgICAgICBpZiAocmF0ZSA8PSBsaW1pdFswXSAmJiBtYnMgPD0gbGltaXRbMV0gJiYgbWF4RGltZW5zaW9uIDw9IGxpbWl0WzJdCisgICAgICAgICAgICAgICAgJiYgYml0cmF0ZSA8PSBsaW1pdFszXSkgeworICAgICAgICAgICAgcmV0dXJuIGxpbWl0WzRdOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCiBzdGF0dXNfdCBBQ29kZWM6OnNldHVwQVZDRW5jb2RlclBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBpbnQzMl90IGJpdHJhdGUsIGlGcmFtZUludGVydmFsOwogICAgIGlmICghbXNnLT5maW5kSW50MzIoImJpdHJhdGUiLCAmYml0cmF0ZSkKQEAgLTIzMzEsMTQgKzI2OTQsMTM5IEBACiAgICAgcmV0dXJuIGNvbmZpZ3VyZUJpdHJhdGUoYml0cmF0ZSwgYml0cmF0ZU1vZGUpOwogfQogCi1zdGF0dXNfdCBBQ29kZWM6OnNldHVwVlBYRW5jb2RlclBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBpbnQzMl90IGJpdHJhdGU7Ci0gICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiYml0cmF0ZSIsICZiaXRyYXRlKSkgeworc3RhdHVzX3QgQUNvZGVjOjpzZXR1cEhFVkNFbmNvZGVyUGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIGludDMyX3QgYml0cmF0ZSwgaUZyYW1lSW50ZXJ2YWw7CisgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiYml0cmF0ZSIsICZiaXRyYXRlKQorICAgICAgICAgICAgfHwgIW1zZy0+ZmluZEludDMyKCJpLWZyYW1lLWludGVydmFsIiwgJmlGcmFtZUludGVydmFsKSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCiAgICAgT01YX1ZJREVPX0NPTlRST0xSQVRFVFlQRSBiaXRyYXRlTW9kZSA9IGdldEJpdHJhdGVNb2RlKG1zZyk7CiAKKyAgICBmbG9hdCBmcmFtZVJhdGU7CisgICAgaWYgKCFtc2ctPmZpbmRGbG9hdCgiZnJhbWUtcmF0ZSIsICZmcmFtZVJhdGUpKSB7CisgICAgICAgIGludDMyX3QgdG1wOworICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJmcmFtZS1yYXRlIiwgJnRtcCkpIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICBmcmFtZVJhdGUgPSAoZmxvYXQpdG1wOworICAgIH0KKworICAgIE9NWF9WSURFT19QQVJBTV9IRVZDVFlQRSBoZXZjVHlwZTsKKyAgICBJbml0T01YUGFyYW1zKCZoZXZjVHlwZSk7CisgICAgaGV2Y1R5cGUublBvcnRJbmRleCA9IGtQb3J0SW5kZXhPdXRwdXQ7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICBlcnIgPSBtT01YLT5nZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICBtTm9kZSwgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1WaWRlb0hldmMsICZoZXZjVHlwZSwgc2l6ZW9mKGhldmNUeXBlKSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGludDMyX3QgcHJvZmlsZTsKKyAgICBpZiAobXNnLT5maW5kSW50MzIoInByb2ZpbGUiLCAmcHJvZmlsZSkpIHsKKyAgICAgICAgaW50MzJfdCBsZXZlbDsKKyAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigibGV2ZWwiLCAmbGV2ZWwpKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKworICAgICAgICBlcnIgPSB2ZXJpZnlTdXBwb3J0Rm9yUHJvZmlsZUFuZExldmVsKHByb2ZpbGUsIGxldmVsKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgICAgIGhldmNUeXBlLmVQcm9maWxlID0gc3RhdGljX2Nhc3Q8T01YX1ZJREVPX0hFVkNQUk9GSUxFVFlQRT4ocHJvZmlsZSk7CisgICAgICAgIGhldmNUeXBlLmVMZXZlbCA9IHN0YXRpY19jYXN0PE9NWF9WSURFT19IRVZDTEVWRUxUWVBFPihsZXZlbCk7CisgICAgfQorCisgICAgLy8gVE9ETzogTmVlZCBPTVggc3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHNldHRpbmcgaUZyYW1lSW50ZXJ2YWwKKworICAgIGVyciA9IG1PTVgtPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgIG1Ob2RlLCAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbVZpZGVvSGV2YywgJmhldmNUeXBlLCBzaXplb2YoaGV2Y1R5cGUpKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgcmV0dXJuIGNvbmZpZ3VyZUJpdHJhdGUoYml0cmF0ZSwgYml0cmF0ZU1vZGUpOworfQorCitzdGF0dXNfdCBBQ29kZWM6OnNldHVwVlBYRW5jb2RlclBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBpbnQzMl90IGJpdHJhdGU7CisgICAgaW50MzJfdCBpRnJhbWVJbnRlcnZhbCA9IDA7CisgICAgc2l6ZV90IHRzTGF5ZXJzID0gMDsKKyAgICBPTVhfVklERU9fQU5EUk9JRF9WUFhURU1QT1JBTExBWUVSUEFUVEVSTlRZUEUgcGF0dGVybiA9CisgICAgICAgIE9NWF9WSURFT19WUFhUZW1wb3JhbExheWVyUGF0dGVybk5vbmU7CisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtWcDhMYXllclJhdGVBbGxvY3Rpb24KKyAgICAgICAgW09NWF9WSURFT19BTkRST0lEX01BWFZQOFRFTVBPUkFMTEFZRVJTXQorICAgICAgICBbT01YX1ZJREVPX0FORFJPSURfTUFYVlA4VEVNUE9SQUxMQVlFUlNdID0geworICAgICAgICB7MTAwLCAxMDAsIDEwMH0sICAvLyAxIGxheWVyCisgICAgICAgIHsgNjAsIDEwMCwgMTAwfSwgIC8vIDIgbGF5ZXJzIHs2MCUsIDQwJX0KKyAgICAgICAgeyA0MCwgIDYwLCAxMDB9LCAgLy8gMyBsYXllcnMgezQwJSwgMjAlLCA0MCV9CisgICAgfTsKKyAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJiaXRyYXRlIiwgJmJpdHJhdGUpKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgbXNnLT5maW5kSW50MzIoImktZnJhbWUtaW50ZXJ2YWwiLCAmaUZyYW1lSW50ZXJ2YWwpOworCisgICAgT01YX1ZJREVPX0NPTlRST0xSQVRFVFlQRSBiaXRyYXRlTW9kZSA9IGdldEJpdHJhdGVNb2RlKG1zZyk7CisKKyAgICBmbG9hdCBmcmFtZVJhdGU7CisgICAgaWYgKCFtc2ctPmZpbmRGbG9hdCgiZnJhbWUtcmF0ZSIsICZmcmFtZVJhdGUpKSB7CisgICAgICAgIGludDMyX3QgdG1wOworICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJmcmFtZS1yYXRlIiwgJnRtcCkpIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICBmcmFtZVJhdGUgPSAoZmxvYXQpdG1wOworICAgIH0KKworICAgIEFTdHJpbmcgdHNTY2hlbWE7CisgICAgaWYgKG1zZy0+ZmluZFN0cmluZygidHMtc2NoZW1hIiwgJnRzU2NoZW1hKSkgeworICAgICAgICBpZiAodHNTY2hlbWEgPT0gIndlYnJ0Yy52cDguMS1sYXllciIpIHsKKyAgICAgICAgICAgIHBhdHRlcm4gPSBPTVhfVklERU9fVlBYVGVtcG9yYWxMYXllclBhdHRlcm5XZWJSVEM7CisgICAgICAgICAgICB0c0xheWVycyA9IDE7CisgICAgICAgIH0gZWxzZSBpZiAodHNTY2hlbWEgPT0gIndlYnJ0Yy52cDguMi1sYXllciIpIHsKKyAgICAgICAgICAgIHBhdHRlcm4gPSBPTVhfVklERU9fVlBYVGVtcG9yYWxMYXllclBhdHRlcm5XZWJSVEM7CisgICAgICAgICAgICB0c0xheWVycyA9IDI7CisgICAgICAgIH0gZWxzZSBpZiAodHNTY2hlbWEgPT0gIndlYnJ0Yy52cDguMy1sYXllciIpIHsKKyAgICAgICAgICAgIHBhdHRlcm4gPSBPTVhfVklERU9fVlBYVGVtcG9yYWxMYXllclBhdHRlcm5XZWJSVEM7CisgICAgICAgICAgICB0c0xheWVycyA9IDM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiVW5zdXBwb3J0ZWQgdHMtc2NoZW1hIFslc10iLCB0c1NjaGVtYS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIE9NWF9WSURFT19QQVJBTV9BTkRST0lEX1ZQOEVOQ09ERVJUWVBFIHZwOHR5cGU7CisgICAgSW5pdE9NWFBhcmFtcygmdnA4dHlwZSk7CisgICAgdnA4dHlwZS5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKKyAgICBzdGF0dXNfdCBlcnIgPSBtT01YLT5nZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICBtTm9kZSwgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1WaWRlb0FuZHJvaWRWcDhFbmNvZGVyLAorICAgICAgICAgICAgJnZwOHR5cGUsIHNpemVvZih2cDh0eXBlKSk7CisKKyAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgIGlmIChpRnJhbWVJbnRlcnZhbCA+IDApIHsKKyAgICAgICAgICAgIHZwOHR5cGUubktleUZyYW1lSW50ZXJ2YWwgPSBzZXRQRnJhbWVzU3BhY2luZyhpRnJhbWVJbnRlcnZhbCwgZnJhbWVSYXRlKTsKKyAgICAgICAgfQorICAgICAgICB2cDh0eXBlLmVUZW1wb3JhbFBhdHRlcm4gPSBwYXR0ZXJuOworICAgICAgICB2cDh0eXBlLm5UZW1wb3JhbExheWVyQ291bnQgPSB0c0xheWVyczsKKyAgICAgICAgaWYgKHRzTGF5ZXJzID4gMCkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBPTVhfVklERU9fQU5EUk9JRF9NQVhWUDhURU1QT1JBTExBWUVSUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgdnA4dHlwZS5uVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpb1tpXSA9CisgICAgICAgICAgICAgICAgICAgIGtWcDhMYXllclJhdGVBbGxvY3Rpb25bdHNMYXllcnMgLSAxXVtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYml0cmF0ZU1vZGUgPT0gT01YX1ZpZGVvX0NvbnRyb2xSYXRlQ29uc3RhbnQpIHsKKyAgICAgICAgICAgIHZwOHR5cGUubk1pblF1YW50aXplciA9IDI7CisgICAgICAgICAgICB2cDh0eXBlLm5NYXhRdWFudGl6ZXIgPSA2MzsKKyAgICAgICAgfQorCisgICAgICAgIGVyciA9IG1PTVgtPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBtTm9kZSwgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1WaWRlb0FuZHJvaWRWcDhFbmNvZGVyLAorICAgICAgICAgICAgICAgICZ2cDh0eXBlLCBzaXplb2YodnA4dHlwZSkpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVygiRXh0ZW5kZWQgVlA4IHBhcmFtZXRlcnMgc2V0IGZhaWxlZDogJWQiLCBlcnIpOworICAgICAgICB9CisgICAgfQorCiAgICAgcmV0dXJuIGNvbmZpZ3VyZUJpdHJhdGUoYml0cmF0ZSwgYml0cmF0ZU1vZGUpOwogfQogCkBAIC0yNDk0LDE5ICsyOTgyLDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGludCBtaW5VbmRlcXVldWVkQnVmcyA9IDA7Ci0gICAgc3RhdHVzX3QgZXJyID0gbU5hdGl2ZVdpbmRvdy0+cXVlcnkoCi0gICAgICAgICAgICBtTmF0aXZlV2luZG93LmdldCgpLCBOQVRJVkVfV0lORE9XX01JTl9VTkRFUVVFVUVEX0JVRkZFUlMsCi0gICAgICAgICAgICAmbWluVW5kZXF1ZXVlZEJ1ZnMpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBBTE9HRSgiWyVzXSBOQVRJVkVfV0lORE9XX01JTl9VTkRFUVVFVUVEX0JVRkZFUlMgcXVlcnkgZmFpbGVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBzdHJlcnJvcigtZXJyKSwgLWVycik7Ci0KLSAgICAgICAgbWluVW5kZXF1ZXVlZEJ1ZnMgPSAwOwotICAgIH0KLQotICAgIHdoaWxlIChjb3VudEJ1ZmZlcnNPd25lZEJ5TmF0aXZlV2luZG93KCkgPiAoc2l6ZV90KW1pblVuZGVxdWV1ZWRCdWZzCisgICAgd2hpbGUgKGNvdW50QnVmZmVyc093bmVkQnlOYXRpdmVXaW5kb3coKSA+IG1OdW1VbmRlcXVldWVkQnVmZmVycwogICAgICAgICAgICAgJiYgZGVxdWV1ZUJ1ZmZlckZyb21OYXRpdmVXaW5kb3coKSAhPSBOVUxMKSB7CiAgICAgICAgIC8vIHRoZXNlIGJ1ZmZlcnMgd2lsbCBiZSBzdWJtaXR0ZWQgYXMgcmVndWxhciBidWZmZXJzOyBhY2NvdW50IGZvciB0aGlzCiAgICAgICAgIGlmIChtU3RvcmVNZXRhRGF0YUluT3V0cHV0QnVmZmVycyAmJiBtTWV0YURhdGFCdWZmZXJzVG9TdWJtaXQgPiAwKSB7CkBAIC0yNTIyLDcgKzI5OTgsNyBAQAogCiAgICAgICAgIGlmIChpbmZvLT5tU3RhdHVzICE9IEJ1ZmZlckluZm86Ok9XTkVEX0JZX1VTCiAgICAgICAgICAgICAgICAgJiYgaW5mby0+bVN0YXR1cyAhPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9OQVRJVkVfV0lORE9XKSB7Ci0gICAgICAgICAgICBBTE9HVigiWyVzXSBCdWZmZXIgJXAgb24gcG9ydCAlbGQgc3RpbGwgaGFzIHN0YXR1cyAlZCIsCisgICAgICAgICAgICBBTE9HVigiWyVzXSBCdWZmZXIgJXUgb24gcG9ydCAldSBzdGlsbCBoYXMgc3RhdHVzICVkIiwKICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgaW5mby0+bUJ1ZmZlcklELCBwb3J0SW5kZXgsIGluZm8tPm1TdGF0dXMpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMjU1Miw3OSArMzAyOCwyOTEgQEAKICAgICB9CiB9CiAKLXZvaWQgQUNvZGVjOjpzZW5kRm9ybWF0Q2hhbmdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmcmVwbHkpIHsKLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0T3V0cHV0Rm9ybWF0Q2hhbmdlZCk7CisvLyBzdGF0aWMKK2Jvb2wgQUNvZGVjOjpkZXNjcmliZURlZmF1bHRDb2xvckZvcm1hdChEZXNjcmliZUNvbG9yRm9ybWF0UGFyYW1zICZwYXJhbXMpIHsKKyAgICBNZWRpYUltYWdlICZpbWFnZSA9IHBhcmFtcy5zTWVkaWFJbWFnZTsKKyAgICBtZW1zZXQoJmltYWdlLCAwLCBzaXplb2YoaW1hZ2UpKTsKIAorICAgIGltYWdlLm1UeXBlID0gTWVkaWFJbWFnZTo6TUVESUFfSU1BR0VfVFlQRV9VTktOT1dOOworICAgIGltYWdlLm1OdW1QbGFuZXMgPSAwOworCisgICAgY29uc3QgT01YX0NPTE9SX0ZPUk1BVFRZUEUgZm10ID0gcGFyYW1zLmVDb2xvckZvcm1hdDsKKyAgICBpbWFnZS5tV2lkdGggPSBwYXJhbXMubkZyYW1lV2lkdGg7CisgICAgaW1hZ2UubUhlaWdodCA9IHBhcmFtcy5uRnJhbWVIZWlnaHQ7CisKKyAgICAvLyBvbmx5IHN1cHBvcnRpbmcgWVVWNDIwCisgICAgaWYgKGZtdCAhPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyICYmCisgICAgICAgIGZtdCAhPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkUGxhbmFyICYmCisgICAgICAgIGZtdCAhPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hciAmJgorICAgICAgICBmbXQgIT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIpIHsKKyAgICAgICAgQUxPR1coImRvIG5vdCBrbm93IGNvbG9yIGZvcm1hdCAweCV4ID0gJWQiLCBmbXQsIGZtdCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBURU1QT1JBUlkgRklYIGZvciBzb21lIHZlbmRvcnMgdGhhdCBhZHZlcnRpc2Ugc2xpY2VIZWlnaHQgYXMgMAorICAgIGlmIChwYXJhbXMublN0cmlkZSAhPSAwICYmIHBhcmFtcy5uU2xpY2VIZWlnaHQgPT0gMCkgeworICAgICAgICBBTE9HVygidXNpbmcgc2xpY2VIZWlnaHQ9JXUgaW5zdGVhZCBvZiB3aGF0IGNvZGVjIGFkdmVydGlzZWQgKD0wKSIsCisgICAgICAgICAgICAgICAgcGFyYW1zLm5GcmFtZUhlaWdodCk7CisgICAgICAgIHBhcmFtcy5uU2xpY2VIZWlnaHQgPSBwYXJhbXMubkZyYW1lSGVpZ2h0OworICAgIH0KKworICAgIC8vIHdlIG5lZWQgc3RyaWRlIGFuZCBzbGljZS1oZWlnaHQgdG8gYmUgbm9uLXplcm8KKyAgICBpZiAocGFyYW1zLm5TdHJpZGUgPT0gMCB8fCBwYXJhbXMublNsaWNlSGVpZ2h0ID09IDApIHsKKyAgICAgICAgQUxPR1coImNhbm5vdCBkZXNjcmliZSBjb2xvciBmb3JtYXQgMHgleCA9ICVkIHdpdGggc3RyaWRlPSV1IGFuZCBzbGljZUhlaWdodD0ldSIsCisgICAgICAgICAgICAgICAgZm10LCBmbXQsIHBhcmFtcy5uU3RyaWRlLCBwYXJhbXMublNsaWNlSGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIHNldC11cCBZVVYgZm9ybWF0CisgICAgaW1hZ2UubVR5cGUgPSBNZWRpYUltYWdlOjpNRURJQV9JTUFHRV9UWVBFX1lVVjsKKyAgICBpbWFnZS5tTnVtUGxhbmVzID0gMzsKKyAgICBpbWFnZS5tQml0RGVwdGggPSA4OworICAgIGltYWdlLm1QbGFuZVtpbWFnZS5ZXS5tT2Zmc2V0ID0gMDsKKyAgICBpbWFnZS5tUGxhbmVbaW1hZ2UuWV0ubUNvbEluYyA9IDE7CisgICAgaW1hZ2UubVBsYW5lW2ltYWdlLlldLm1Sb3dJbmMgPSBwYXJhbXMublN0cmlkZTsKKyAgICBpbWFnZS5tUGxhbmVbaW1hZ2UuWV0ubUhvcml6U3Vic2FtcGxpbmcgPSAxOworICAgIGltYWdlLm1QbGFuZVtpbWFnZS5ZXS5tVmVydFN1YnNhbXBsaW5nID0gMTsKKworICAgIHN3aXRjaCAoZm10KSB7CisgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjogLy8gdXNlZCBmb3IgWVYxMgorICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRQbGFuYXI6CisgICAgICAgICAgICBpbWFnZS5tUGxhbmVbaW1hZ2UuVV0ubU9mZnNldCA9IHBhcmFtcy5uU3RyaWRlICogcGFyYW1zLm5TbGljZUhlaWdodDsKKyAgICAgICAgICAgIGltYWdlLm1QbGFuZVtpbWFnZS5VXS5tQ29sSW5jID0gMTsKKyAgICAgICAgICAgIGltYWdlLm1QbGFuZVtpbWFnZS5VXS5tUm93SW5jID0gcGFyYW1zLm5TdHJpZGUgLyAyOworICAgICAgICAgICAgaW1hZ2UubVBsYW5lW2ltYWdlLlVdLm1Ib3JpelN1YnNhbXBsaW5nID0gMjsKKyAgICAgICAgICAgIGltYWdlLm1QbGFuZVtpbWFnZS5VXS5tVmVydFN1YnNhbXBsaW5nID0gMjsKKworICAgICAgICAgICAgaW1hZ2UubVBsYW5lW2ltYWdlLlZdLm1PZmZzZXQgPSBpbWFnZS5tUGxhbmVbaW1hZ2UuVV0ubU9mZnNldAorICAgICAgICAgICAgICAgICAgICArIChwYXJhbXMublN0cmlkZSAqIHBhcmFtcy5uU2xpY2VIZWlnaHQgLyA0KTsKKyAgICAgICAgICAgIGltYWdlLm1QbGFuZVtpbWFnZS5WXS5tQ29sSW5jID0gMTsKKyAgICAgICAgICAgIGltYWdlLm1QbGFuZVtpbWFnZS5WXS5tUm93SW5jID0gcGFyYW1zLm5TdHJpZGUgLyAyOworICAgICAgICAgICAgaW1hZ2UubVBsYW5lW2ltYWdlLlZdLm1Ib3JpelN1YnNhbXBsaW5nID0gMjsKKyAgICAgICAgICAgIGltYWdlLm1QbGFuZVtpbWFnZS5WXS5tVmVydFN1YnNhbXBsaW5nID0gMjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CisgICAgICAgICAgICAvLyBGSVhNRTogTlYyMSBmb3Igc3ctZW5jb2RlciwgTlYxMiBmb3IgZGVjb2RlciBhbmQgaHctZW5jb2RlcgorICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyOgorICAgICAgICAgICAgLy8gTlYxMgorICAgICAgICAgICAgaW1hZ2UubVBsYW5lW2ltYWdlLlVdLm1PZmZzZXQgPSBwYXJhbXMublN0cmlkZSAqIHBhcmFtcy5uU2xpY2VIZWlnaHQ7CisgICAgICAgICAgICBpbWFnZS5tUGxhbmVbaW1hZ2UuVV0ubUNvbEluYyA9IDI7CisgICAgICAgICAgICBpbWFnZS5tUGxhbmVbaW1hZ2UuVV0ubVJvd0luYyA9IHBhcmFtcy5uU3RyaWRlOworICAgICAgICAgICAgaW1hZ2UubVBsYW5lW2ltYWdlLlVdLm1Ib3JpelN1YnNhbXBsaW5nID0gMjsKKyAgICAgICAgICAgIGltYWdlLm1QbGFuZVtpbWFnZS5VXS5tVmVydFN1YnNhbXBsaW5nID0gMjsKKworICAgICAgICAgICAgaW1hZ2UubVBsYW5lW2ltYWdlLlZdLm1PZmZzZXQgPSBpbWFnZS5tUGxhbmVbaW1hZ2UuVV0ubU9mZnNldCArIDE7CisgICAgICAgICAgICBpbWFnZS5tUGxhbmVbaW1hZ2UuVl0ubUNvbEluYyA9IDI7CisgICAgICAgICAgICBpbWFnZS5tUGxhbmVbaW1hZ2UuVl0ubVJvd0luYyA9IHBhcmFtcy5uU3RyaWRlOworICAgICAgICAgICAgaW1hZ2UubVBsYW5lW2ltYWdlLlZdLm1Ib3JpelN1YnNhbXBsaW5nID0gMjsKKyAgICAgICAgICAgIGltYWdlLm1QbGFuZVtpbWFnZS5WXS5tVmVydFN1YnNhbXBsaW5nID0gMjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBUUkVTUEFTUygpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gc3RhdGljCitib29sIEFDb2RlYzo6ZGVzY3JpYmVDb2xvckZvcm1hdCgKKyAgICAgICAgY29uc3Qgc3A8SU9NWD4gJm9teCwgSU9NWDo6bm9kZV9pZCBub2RlLAorICAgICAgICBEZXNjcmliZUNvbG9yRm9ybWF0UGFyYW1zICZkZXNjcmliZVBhcmFtcykKK3sKKyAgICBPTVhfSU5ERVhUWVBFIGRlc2NyaWJlQ29sb3JGb3JtYXRJbmRleDsKKyAgICBpZiAob214LT5nZXRFeHRlbnNpb25JbmRleCgKKyAgICAgICAgICAgIG5vZGUsICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguZGVzY3JpYmVDb2xvckZvcm1hdCIsCisgICAgICAgICAgICAmZGVzY3JpYmVDb2xvckZvcm1hdEluZGV4KSAhPSBPSyB8fAorICAgICAgICBvbXgtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgIG5vZGUsIGRlc2NyaWJlQ29sb3JGb3JtYXRJbmRleCwKKyAgICAgICAgICAgICZkZXNjcmliZVBhcmFtcywgc2l6ZW9mKGRlc2NyaWJlUGFyYW1zKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGRlc2NyaWJlRGVmYXVsdENvbG9yRm9ybWF0KGRlc2NyaWJlUGFyYW1zKTsKKyAgICB9CisgICAgcmV0dXJuIGRlc2NyaWJlUGFyYW1zLnNNZWRpYUltYWdlLm1UeXBlICE9CisgICAgICAgICAgICBNZWRpYUltYWdlOjpNRURJQV9JTUFHRV9UWVBFX1VOS05PV047Cit9CisKKy8vIHN0YXRpYworYm9vbCBBQ29kZWM6OmlzRmxleGlibGVDb2xvckZvcm1hdCgKKyAgICAgICAgIGNvbnN0IHNwPElPTVg+ICZvbXgsIElPTVg6Om5vZGVfaWQgbm9kZSwKKyAgICAgICAgIHVpbnQzMl90IGNvbG9yRm9ybWF0LCBPTVhfVTMyICpmbGV4aWJsZUVxdWl2YWxlbnQpIHsKKyAgICBEZXNjcmliZUNvbG9yRm9ybWF0UGFyYW1zIGRlc2NyaWJlUGFyYW1zOworICAgIEluaXRPTVhQYXJhbXMoJmRlc2NyaWJlUGFyYW1zKTsKKyAgICBkZXNjcmliZVBhcmFtcy5lQ29sb3JGb3JtYXQgPSAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpY29sb3JGb3JtYXQ7CisgICAgLy8gcmVhc29uYWJsZSBkdW1teSB2YWx1ZXMKKyAgICBkZXNjcmliZVBhcmFtcy5uRnJhbWVXaWR0aCA9IDEyODsKKyAgICBkZXNjcmliZVBhcmFtcy5uRnJhbWVIZWlnaHQgPSAxMjg7CisgICAgZGVzY3JpYmVQYXJhbXMublN0cmlkZSA9IDEyODsKKyAgICBkZXNjcmliZVBhcmFtcy5uU2xpY2VIZWlnaHQgPSAxMjg7CisKKyAgICBDSEVDSyhmbGV4aWJsZUVxdWl2YWxlbnQgIT0gTlVMTCk7CisKKyAgICBpZiAoIWRlc2NyaWJlQ29sb3JGb3JtYXQob214LCBub2RlLCBkZXNjcmliZVBhcmFtcykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IE1lZGlhSW1hZ2UgJmltZyA9IGRlc2NyaWJlUGFyYW1zLnNNZWRpYUltYWdlOworICAgIGlmIChpbWcubVR5cGUgPT0gTWVkaWFJbWFnZTo6TUVESUFfSU1BR0VfVFlQRV9ZVVYpIHsKKyAgICAgICAgaWYgKGltZy5tTnVtUGxhbmVzICE9IDMgfHwKKyAgICAgICAgICAgIGltZy5tUGxhbmVbaW1nLlldLm1Ib3JpelN1YnNhbXBsaW5nICE9IDEgfHwKKyAgICAgICAgICAgIGltZy5tUGxhbmVbaW1nLlldLm1WZXJ0U3Vic2FtcGxpbmcgIT0gMSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gWVVWIDQyMAorICAgICAgICBpZiAoaW1nLm1QbGFuZVtpbWcuVV0ubUhvcml6U3Vic2FtcGxpbmcgPT0gMgorICAgICAgICAgICAgICAgICYmIGltZy5tUGxhbmVbaW1nLlVdLm1WZXJ0U3Vic2FtcGxpbmcgPT0gMgorICAgICAgICAgICAgICAgICYmIGltZy5tUGxhbmVbaW1nLlZdLm1Ib3JpelN1YnNhbXBsaW5nID09IDIKKyAgICAgICAgICAgICAgICAmJiBpbWcubVBsYW5lW2ltZy5WXS5tVmVydFN1YnNhbXBsaW5nID09IDIpIHsKKyAgICAgICAgICAgIC8vIHBvc3NpYmxlIGZsZXhpYmxlIFlVVjQyMCBmb3JtYXQKKyAgICAgICAgICAgIGlmIChpbWcubUJpdERlcHRoIDw9IDgpIHsKKyAgICAgICAgICAgICAgICpmbGV4aWJsZUVxdWl2YWxlbnQgPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU7CisgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXR1c190IEFDb2RlYzo6Z2V0UG9ydEZvcm1hdChPTVhfVTMyIHBvcnRJbmRleCwgc3A8QU1lc3NhZ2U+ICZub3RpZnkpIHsKKyAgICAvLyBUT0RPOiBjYXRjaCBlcnJvcnMgYW4gcmV0dXJuIHRoZW0gaW5zdGVhZCBvZiB1c2luZyBDSEVDSwogICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgZGVmOwogICAgIEluaXRPTVhQYXJhbXMoJmRlZik7Ci0gICAgZGVmLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4T3V0cHV0OworICAgIGRlZi5uUG9ydEluZGV4ID0gcG9ydEluZGV4OwogCiAgICAgQ0hFQ0tfRVEobU9NWC0+Z2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uLCAmZGVmLCBzaXplb2YoZGVmKSksCiAgICAgICAgICAgICAgKHN0YXR1c190KU9LKTsKIAotICAgIENIRUNLX0VRKChpbnQpZGVmLmVEaXIsIChpbnQpT01YX0Rpck91dHB1dCk7CisgICAgQ0hFQ0tfRVEoKGludClkZWYuZURpciwKKyAgICAgICAgICAgIChpbnQpKHBvcnRJbmRleCA9PSBrUG9ydEluZGV4T3V0cHV0ID8gT01YX0Rpck91dHB1dCA6IE9NWF9EaXJJbnB1dCkpOwogCiAgICAgc3dpdGNoIChkZWYuZURvbWFpbikgewogICAgICAgICBjYXNlIE9NWF9Qb3J0RG9tYWluVmlkZW86CiAgICAgICAgIHsKICAgICAgICAgICAgIE9NWF9WSURFT19QT1JUREVGSU5JVElPTlRZUEUgKnZpZGVvRGVmID0gJmRlZi5mb3JtYXQudmlkZW87CisgICAgICAgICAgICBzd2l0Y2ggKChpbnQpdmlkZW9EZWYtPmVDb21wcmVzc2lvbkZvcm1hdCkgeworICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0NvZGluZ1VudXNlZDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKG1Jc0VuY29kZXIgXiAocG9ydEluZGV4ID09IGtQb3J0SW5kZXhPdXRwdXQpKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9WSURFT19SQVcpOwogCi0gICAgICAgICAgICBBU3RyaW5nIG1pbWU7Ci0gICAgICAgICAgICBpZiAoIW1Jc0VuY29kZXIpIHsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX1ZJREVPX1JBVyk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKEdldE1pbWVUeXBlRm9yVmlkZW9Db2RpbmcoCisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInN0cmlkZSIsIHZpZGVvRGVmLT5uU3RyaWRlKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2xpY2UtaGVpZ2h0IiwgdmlkZW9EZWYtPm5TbGljZUhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImNvbG9yLWZvcm1hdCIsIHZpZGVvRGVmLT5lQ29sb3JGb3JtYXQpOworCisgICAgICAgICAgICAgICAgICAgIERlc2NyaWJlQ29sb3JGb3JtYXRQYXJhbXMgZGVzY3JpYmVQYXJhbXM7CisgICAgICAgICAgICAgICAgICAgIEluaXRPTVhQYXJhbXMoJmRlc2NyaWJlUGFyYW1zKTsKKyAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmVQYXJhbXMuZUNvbG9yRm9ybWF0ID0gdmlkZW9EZWYtPmVDb2xvckZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmVQYXJhbXMubkZyYW1lV2lkdGggPSB2aWRlb0RlZi0+bkZyYW1lV2lkdGg7CisgICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlUGFyYW1zLm5GcmFtZUhlaWdodCA9IHZpZGVvRGVmLT5uRnJhbWVIZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlUGFyYW1zLm5TdHJpZGUgPSB2aWRlb0RlZi0+blN0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmVQYXJhbXMublNsaWNlSGVpZ2h0ID0gdmlkZW9EZWYtPm5TbGljZUhlaWdodDsKKworICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3JpYmVDb2xvckZvcm1hdChtT01YLCBtTm9kZSwgZGVzY3JpYmVQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImltYWdlLWRhdGEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2NyaWJlUGFyYW1zLnNNZWRpYUltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihkZXNjcmliZVBhcmFtcy5zTWVkaWFJbWFnZSkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChwb3J0SW5kZXggIT0ga1BvcnRJbmRleE91dHB1dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogYWxzbyBnZXQgaW5wdXQgY3JvcAorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBPTVhfQ09ORklHX1JFQ1RUWVBFIHJlY3Q7CisgICAgICAgICAgICAgICAgICAgIEluaXRPTVhQYXJhbXMoJnJlY3QpOworICAgICAgICAgICAgICAgICAgICByZWN0Lm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1PTVgtPmdldENvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwb3J0SW5kZXggPT0ga1BvcnRJbmRleE91dHB1dCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0Q3JvcCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uSW5wdXRDcm9wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlY3QsIHNpemVvZihyZWN0KSkgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QubkxlZnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uVG9wID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QubldpZHRoID0gdmlkZW9EZWYtPm5GcmFtZVdpZHRoOworICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uSGVpZ2h0ID0gdmlkZW9EZWYtPm5GcmFtZUhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIENIRUNLX0dFKHJlY3QubkxlZnQsIDApOworICAgICAgICAgICAgICAgICAgICBDSEVDS19HRShyZWN0Lm5Ub3AsIDApOworICAgICAgICAgICAgICAgICAgICBDSEVDS19HRShyZWN0Lm5XaWR0aCwgMHUpOworICAgICAgICAgICAgICAgICAgICBDSEVDS19HRShyZWN0Lm5IZWlnaHQsIDB1KTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfTEUocmVjdC5uTGVmdCArIHJlY3QubldpZHRoIC0gMSwgdmlkZW9EZWYtPm5GcmFtZVdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfTEUocmVjdC5uVG9wICsgcmVjdC5uSGVpZ2h0IC0gMSwgdmlkZW9EZWYtPm5GcmFtZUhlaWdodCk7CisKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRSZWN0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm9wIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5MZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QublRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5MZWZ0ICsgcmVjdC5uV2lkdGggLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QublRvcCArIHJlY3QubkhlaWdodCAtIDEpOworCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0NvZGluZ1ZQODoKKyAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19Db2RpbmdWUDk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fQU5EUk9JRF9WUDhFTkNPREVSVFlQRSB2cDh0eXBlOworICAgICAgICAgICAgICAgICAgICBJbml0T01YUGFyYW1zKCZ2cDh0eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgdnA4dHlwZS5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbU9NWC0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtVmlkZW9BbmRyb2lkVnA4RW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdnA4dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodnA4dHlwZSkpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgdHNTY2hlbWEgPSAibm9uZSI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodnA4dHlwZS5lVGVtcG9yYWxQYXR0ZXJuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE9NWF9WSURFT19WUFhUZW1wb3JhbExheWVyUGF0dGVybldlYlJUQykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodnA4dHlwZS5uVGVtcG9yYWxMYXllckNvdW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNTY2hlbWEgPSAid2VicnRjLnZwOC4xLWxheWVyIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNTY2hlbWEgPSAid2VicnRjLnZwOC4yLWxheWVyIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNTY2hlbWEgPSAid2VicnRjLnZwOC4zLWxheWVyIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoInRzLXNjaGVtYSIsIHRzU2NoZW1hKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBGYWxsIHRocm91Z2ggdG8gc2V0IHVwIG1pbWUuCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKG1Jc0VuY29kZXIgXiAocG9ydEluZGV4ID09IGtQb3J0SW5kZXhJbnB1dCkpOworICAgICAgICAgICAgICAgICAgICBBU3RyaW5nIG1pbWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChHZXRNaW1lVHlwZUZvclZpZGVvQ29kaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9EZWYtPmVDb21wcmVzc2lvbkZvcm1hdCwgJm1pbWUpICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoIm1pbWUiLCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0U3RyaW5nKCJtaW1lIiwgbWltZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0U3RyaW5nKCJtaW1lIiwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoIm1pbWUiLCBtaW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2lkdGgiLCB2aWRlb0RlZi0+bkZyYW1lV2lkdGgpOwogICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiaGVpZ2h0IiwgdmlkZW9EZWYtPm5GcmFtZUhlaWdodCk7Ci0KLSAgICAgICAgICAgIGlmICghbUlzRW5jb2RlcikgewotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInN0cmlkZSIsIHZpZGVvRGVmLT5uU3RyaWRlKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzbGljZS1oZWlnaHQiLCB2aWRlb0RlZi0+blNsaWNlSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJjb2xvci1mb3JtYXQiLCB2aWRlb0RlZi0+ZUNvbG9yRm9ybWF0KTsKLQotICAgICAgICAgICAgICAgIE9NWF9DT05GSUdfUkVDVFRZUEUgcmVjdDsKLSAgICAgICAgICAgICAgICBJbml0T01YUGFyYW1zKCZyZWN0KTsKLSAgICAgICAgICAgICAgICByZWN0Lm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4T3V0cHV0OwotCi0gICAgICAgICAgICAgICAgaWYgKG1PTVgtPmdldENvbmZpZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0Q3JvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjdCwgc2l6ZW9mKHJlY3QpKSAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICByZWN0Lm5MZWZ0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgcmVjdC5uVG9wID0gMDsKLSAgICAgICAgICAgICAgICAgICAgcmVjdC5uV2lkdGggPSB2aWRlb0RlZi0+bkZyYW1lV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHJlY3QubkhlaWdodCA9IHZpZGVvRGVmLT5uRnJhbWVIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQ0hFQ0tfR0UocmVjdC5uTGVmdCwgMCk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfR0UocmVjdC5uVG9wLCAwKTsKLSAgICAgICAgICAgICAgICBDSEVDS19HRShyZWN0Lm5XaWR0aCwgMHUpOwotICAgICAgICAgICAgICAgIENIRUNLX0dFKHJlY3QubkhlaWdodCwgMHUpOwotICAgICAgICAgICAgICAgIENIRUNLX0xFKHJlY3QubkxlZnQgKyByZWN0Lm5XaWR0aCAtIDEsIHZpZGVvRGVmLT5uRnJhbWVXaWR0aCk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfTEUocmVjdC5uVG9wICsgcmVjdC5uSGVpZ2h0IC0gMSwgdmlkZW9EZWYtPm5GcmFtZUhlaWdodCk7Ci0KLSAgICAgICAgICAgICAgICBub3RpZnktPnNldFJlY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAiY3JvcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5MZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uVG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uTGVmdCArIHJlY3QubldpZHRoIC0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QublRvcCArIHJlY3QubkhlaWdodCAtIDEpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1OYXRpdmVXaW5kb3cgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICByZXBseS0+c2V0UmVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3JvcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5Ub3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uTGVmdCArIHJlY3QubldpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QublRvcCArIHJlY3QubkhlaWdodCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMjYzNyw3ICszMzI1LDcgQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSBwYXJhbXM7CiAgICAgICAgICAgICAgICAgICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtcyk7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7CiAKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobU9NWC0+Z2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1BdWRpb1BjbSwKQEAgLTI2NTcsMjAgKzMzNDUsNiBAQAogICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7CiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImNoYW5uZWwtY291bnQiLCBwYXJhbXMubkNoYW5uZWxzKTsKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2FtcGxlLXJhdGUiLCBwYXJhbXMublNhbXBsaW5nUmF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtRW5jb2RlckRlbGF5ICsgbUVuY29kZXJQYWRkaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVTaXplID0gcGFyYW1zLm5DaGFubmVscyAqIHNpemVvZihpbnQxNl90KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU2tpcEN1dEJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHByZXZidWZzaXplID0gbVNraXBDdXRCdWZmZXItPnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldmJ1ZnNpemUgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiUmVwbGFjaW5nIFNraXBDdXRCdWZmZXIgaG9sZGluZyAlZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZidWZzaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2tpcEN1dEJ1ZmZlciA9IG5ldyBTa2lwQ3V0QnVmZmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRW5jb2RlckRlbGF5ICogZnJhbWVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRW5jb2RlclBhZGRpbmcgKiBmcmFtZVNpemUpOwotICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKG1DaGFubmVsTWFza1ByZXNlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImNoYW5uZWwtbWFzayIsIG1DaGFubmVsTWFzayk7CkBAIC0yNjgyLDcgKzMzNTYsNyBAQAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFIHBhcmFtczsKICAgICAgICAgICAgICAgICAgICAgSW5pdE9NWFBhcmFtcygmcGFyYW1zKTsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4T3V0cHV0OworICAgICAgICAgICAgICAgICAgICBwYXJhbXMublBvcnRJbmRleCA9IHBvcnRJbmRleDsKIAogICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtT01YLT5nZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbUF1ZGlvQWFjLApAQCAtMjY5OSw3ICszMzczLDcgQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9BTVJUWVBFIHBhcmFtczsKICAgICAgICAgICAgICAgICAgICAgSW5pdE9NWFBhcmFtcygmcGFyYW1zKTsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4T3V0cHV0OworICAgICAgICAgICAgICAgICAgICBwYXJhbXMublBvcnRJbmRleCA9IHBvcnRJbmRleDsKIAogICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtT01YLT5nZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbUF1ZGlvQW1yLApAQCAtMjcyNSw3ICszMzk5LDcgQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9GTEFDVFlQRSBwYXJhbXM7CiAgICAgICAgICAgICAgICAgICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtcyk7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7CiAKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobU9NWC0+Z2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1BdWRpb0ZsYWMsCkBAIC0yNzM4LDExICszNDEyLDQ1IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIGNhc2UgT01YX0FVRElPX0NvZGluZ01QMzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9NUDNUWVBFIHBhcmFtczsKKyAgICAgICAgICAgICAgICAgICAgSW5pdE9NWFBhcmFtcygmcGFyYW1zKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7CisKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobU9NWC0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1BdWRpb01wMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtcywgc2l6ZW9mKHBhcmFtcykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdHVzX3QpT0spOworCisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRyk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImNoYW5uZWwtY291bnQiLCBwYXJhbXMubkNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2FtcGxlLXJhdGUiLCBwYXJhbXMublNhbXBsZVJhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIE9NWF9BVURJT19Db2RpbmdWT1JCSVM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fVk9SQklTVFlQRSBwYXJhbXM7CisgICAgICAgICAgICAgICAgICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtcyk7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uUG9ydEluZGV4ID0gcG9ydEluZGV4OworCisgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKG1PTVgtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtQXVkaW9Wb3JiaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMsIHNpemVvZihwYXJhbXMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXR1c190KU9LKTsKKworICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUyk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImNoYW5uZWwtY291bnQiLCBwYXJhbXMubkNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2FtcGxlLXJhdGUiLCBwYXJhbXMublNhbXBsZVJhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBjYXNlIE9NWF9BVURJT19Db2RpbmdBbmRyb2lkQUMzOgogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX0FORFJPSURfQUMzVFlQRSBwYXJhbXM7CiAgICAgICAgICAgICAgICAgICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtcyk7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7CiAKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBtT01YLT5nZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsCkBAIC0yNzU2LDcgKzM0NjQsNTIgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgY2FzZSBPTVhfQVVESU9fQ29kaW5nQW5kcm9pZE9QVVM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9PUFVTVFlQRSBwYXJhbXM7CisgICAgICAgICAgICAgICAgICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtcyk7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uUG9ydEluZGV4ID0gcG9ydEluZGV4OworCisgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywgbU9NWC0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkT3B1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihwYXJhbXMpKSk7CisKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiY2hhbm5lbC1jb3VudCIsIHBhcmFtcy5uQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzYW1wbGUtcmF0ZSIsIHBhcmFtcy5uU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgT01YX0FVRElPX0NvZGluZ0c3MTE6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgcGFyYW1zOworICAgICAgICAgICAgICAgICAgICBJbml0T01YUGFyYW1zKCZwYXJhbXMpOworICAgICAgICAgICAgICAgICAgICBwYXJhbXMublBvcnRJbmRleCA9IHBvcnRJbmRleDsKKworICAgICAgICAgICAgICAgICAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIG1PTVgtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBhcmFtcykpKTsKKworICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5lUENNTW9kZSA9PSBPTVhfQVVESU9fUENNTW9kZU1VTGF3KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtaW1lID0gTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtcy5lUENNTW9kZSA9PSBPTVhfQVVESU9fUENNTW9kZUFMYXcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbWUgPSBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVc7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHBhcmFtcy5lUENNTW9kZSA9PSBPTVhfQVVESU9fUENNTW9kZUxpbmVhcgorICAgICAgICAgICAgICAgICAgICAgICAgbWltZSA9IE1FRElBX01JTUVUWVBFX0FVRElPX1JBVzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldFN0cmluZygibWltZSIsIG1pbWUpOworICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgcGFyYW1zLm5DaGFubmVscyk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInNhbXBsZS1yYXRlIiwgcGFyYW1zLm5TYW1wbGluZ1JhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBBTE9HRSgiVU5LTk9XTiBBVURJTyBDT0RJTkc6ICVkXG4iLCBhdWRpb0RlZi0+ZUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICAgICAgVFJFU1BBU1MoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjc2Niw2ICszNTE5LDQzIEBACiAgICAgICAgICAgICBUUkVTUEFTUygpOwogICAgIH0KIAorICAgIHJldHVybiBPSzsKK30KKwordm9pZCBBQ29kZWM6OnNlbmRGb3JtYXRDaGFuZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZyZXBseSkgeworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRPdXRwdXRGb3JtYXRDaGFuZ2VkKTsKKworICAgIENIRUNLX0VRKGdldFBvcnRGb3JtYXQoa1BvcnRJbmRleE91dHB1dCwgbm90aWZ5KSwgKHN0YXR1c190KU9LKTsKKworICAgIEFTdHJpbmcgbWltZTsKKyAgICBDSEVDSyhub3RpZnktPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOworCisgICAgaW50MzJfdCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b207CisgICAgaWYgKG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfVklERU9fUkFXICYmCisgICAgICAgIG1OYXRpdmVXaW5kb3cgIT0gTlVMTCAmJgorICAgICAgICBub3RpZnktPmZpbmRSZWN0KCJjcm9wIiwgJmxlZnQsICZ0b3AsICZyaWdodCwgJmJvdHRvbSkpIHsKKyAgICAgICAgLy8gbm90aWZ5IHJlbmRlcmVyIG9mIHRoZSBjcm9wIGNoYW5nZQorICAgICAgICAvLyBOT1RFOiBuYXRpdmUgd2luZG93IHVzZXMgZXh0ZW5kZWQgcmlnaHQtYm90dG9tIGNvb3JkaW5hdGUKKyAgICAgICAgcmVwbHktPnNldFJlY3QoImNyb3AiLCBsZWZ0LCB0b3AsIHJpZ2h0ICsgMSwgYm90dG9tICsgMSk7CisgICAgfSBlbHNlIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyAmJgorICAgICAgICAgICAgICAgKG1FbmNvZGVyRGVsYXkgfHwgbUVuY29kZXJQYWRkaW5nKSkgeworICAgICAgICBpbnQzMl90IGNoYW5uZWxDb3VudDsKKyAgICAgICAgQ0hFQ0sobm90aWZ5LT5maW5kSW50MzIoImNoYW5uZWwtY291bnQiLCAmY2hhbm5lbENvdW50KSk7CisgICAgICAgIHNpemVfdCBmcmFtZVNpemUgPSBjaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCk7CisgICAgICAgIGlmIChtU2tpcEN1dEJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBzaXplX3QgcHJldmJ1ZnNpemUgPSBtU2tpcEN1dEJ1ZmZlci0+c2l6ZSgpOworICAgICAgICAgICAgaWYgKHByZXZidWZzaXplICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiUmVwbGFjaW5nIFNraXBDdXRCdWZmZXIgaG9sZGluZyAlZCAiCisgICAgICAgICAgICAgICAgICAgICAgImJ5dGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBwcmV2YnVmc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVNraXBDdXRCdWZmZXIgPSBuZXcgU2tpcEN1dEJ1ZmZlcigKKyAgICAgICAgICAgICAgICBtRW5jb2RlckRlbGF5ICogZnJhbWVTaXplLAorICAgICAgICAgICAgICAgIG1FbmNvZGVyUGFkZGluZyAqIGZyYW1lU2l6ZSk7CisgICAgfQorCiAgICAgbm90aWZ5LT5wb3N0KCk7CiAKICAgICBtU2VudEZvcm1hdCA9IHRydWU7CkBAIC0yNzczLDEyICszNTYzLDIyIEBACiAKIHZvaWQgQUNvZGVjOjpzaWduYWxFcnJvcihPTVhfRVJST1JUWVBFIGVycm9yLCBzdGF0dXNfdCBpbnRlcm5hbEVycm9yKSB7CiAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBBQ29kZWM6OmtXaGF0RXJyb3IpOwotICAgIG5vdGlmeS0+c2V0SW50MzIoIm9teC1lcnJvciIsIGVycm9yKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQ29kZWNCYXNlOjprV2hhdEVycm9yKTsKKyAgICBBTE9HRSgic2lnbmFsRXJyb3Iob214RXJyb3IgJSN4LCBpbnRlcm5hbEVycm9yICVkKSIsIGVycm9yLCBpbnRlcm5hbEVycm9yKTsKKworICAgIGlmIChpbnRlcm5hbEVycm9yID09IFVOS05PV05fRVJST1IpIHsgLy8gZmluZCBiZXR0ZXIgZXJyb3IgY29kZQorICAgICAgICBjb25zdCBzdGF0dXNfdCBvbXhTdGF0dXMgPSBzdGF0dXNGcm9tT01YRXJyb3IoZXJyb3IpOworICAgICAgICBpZiAob214U3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgIGludGVybmFsRXJyb3IgPSBvbXhTdGF0dXM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiSW52YWxpZCBPTVggZXJyb3IgJSN4IiwgZXJyb3IpOworICAgICAgICB9CisgICAgfQogCiAgICAgbUZhdGFsRXJyb3IgPSB0cnVlOwogCiAgICAgbm90aWZ5LT5zZXRJbnQzMigiZXJyIiwgaW50ZXJuYWxFcnJvcik7CisgICAgbm90aWZ5LT5zZXRJbnQzMigiYWN0aW9uQ29kZSIsIEFDVElPTl9DT0RFX0ZBVEFMKTsgLy8gY291bGQgdHJhbnNsYXRlIGZyb20gT01YIGVycm9yLgogICAgIG5vdGlmeS0+cG9zdCgpOwogfQogCkBAIC0yOTc1LDcgKzM3NzUsOCBAQAogICAgICAgbUNvZGVjKGNvZGVjKSB7CiB9CiAKLUFDb2RlYzo6QmFzZVN0YXRlOjpQb3J0TW9kZSBBQ29kZWM6OkJhc2VTdGF0ZTo6Z2V0UG9ydE1vZGUoT01YX1UzMiBwb3J0SW5kZXgpIHsKK0FDb2RlYzo6QmFzZVN0YXRlOjpQb3J0TW9kZSBBQ29kZWM6OkJhc2VTdGF0ZTo6Z2V0UG9ydE1vZGUoCisgICAgICAgIE9NWF9VMzIgLyogcG9ydEluZGV4ICovKSB7CiAgICAgcmV0dXJuIEtFRVBfQlVGRkVSUzsKIH0KIApAQCAtMzAwMSw2ICszODAyLDcgQEAKICAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0Q3JlYXRlSW5wdXRTdXJmYWNlOgogICAgICAgICBjYXNlIEFDb2RlYzo6a1doYXRTaWduYWxFbmRPZklucHV0U3RyZWFtOgogICAgICAgICB7CisgICAgICAgICAgICAvLyBUaGlzIG1heSByZXN1bHQgaW4gYW4gYXBwIGlsbGVnYWwgc3RhdGUgZXhjZXB0aW9uLgogICAgICAgICAgICAgQUxPR0UoIk1lc3NhZ2UgMHgleCB3YXMgbm90IGhhbmRsZWQiLCBtc2ctPndoYXQoKSk7CiAgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgSU5WQUxJRF9PUEVSQVRJT04pOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC0zMDA4LDExICszODEwLDI1IEBACiAKICAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0T01YRGllZDoKICAgICAgICAgeworICAgICAgICAgICAgLy8gVGhpcyB3aWxsIHJlc3VsdCBpbiBrRmxhZ1Nhd01lZGlhU2VydmVyRGllIGhhbmRsaW5nIGluIE1lZGlhQ29kZWMuCiAgICAgICAgICAgICBBTE9HRSgiT01YL21lZGlhc2VydmVyIGRpZWQsIHNpZ25hbGxpbmcgZXJyb3IhIik7CiAgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclJlc291cmNlc0xvc3QsIERFQURfT0JKRUNUKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0UmVsZWFzZUNvZGVjSW5zdGFuY2U6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFMT0dJKCJbJXNdIGZvcmNpbmcgdGhlIHJlbGVhc2Ugb2YgY29kZWMiLAorICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNvZGVjLT5tT01YLT5mcmVlTm9kZShtQ29kZWMtPm1Ob2RlKTsKKyAgICAgICAgICAgIEFMT0dFX0lGKCJbJXNdIGZhaWxlZCB0byByZWxlYXNlIGNvZGVjIGluc3RhbmNlOiBlcnI9JWQiLAorICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbUNvZGVjLT5tTm90aWZ5LT5kdXAoKTsKKyAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0U2h1dGRvd25Db21wbGV0ZWQpOworICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtMzAyNCw4ICszODQwLDE2IEBACiAgICAgaW50MzJfdCB0eXBlOwogICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ0eXBlIiwgJnR5cGUpKTsKIAorICAgIC8vIHRoZXJlIGlzIGEgcG9zc2liaWxpdHkgdGhhdCB0aGlzIGlzIGFuIG91dHN0YW5kaW5nIG1lc3NhZ2UgZm9yIGEKKyAgICAvLyBjb2RlYyB0aGF0IHdlIGhhdmUgYWxyZWFkeSBkZXN0cm95ZWQKKyAgICBpZiAobUNvZGVjLT5tTm9kZSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dJKCJpZ25vcmluZyBtZXNzYWdlIGFzIGFscmVhZHkgZnJlZWQgY29tcG9uZW50OiAlcyIsCisgICAgICAgICAgICAgICAgbXNnLT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKICAgICBJT01YOjpub2RlX2lkIG5vZGVJRDsKLSAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJub2RlIiwgJm5vZGVJRCkpOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJub2RlIiwgKGludDMyX3QqKSZub2RlSUQpKTsKICAgICBDSEVDS19FUShub2RlSUQsIG1Db2RlYy0+bU5vZGUpOwogCiAgICAgc3dpdGNoICh0eXBlKSB7CkBAIC0zMDU2LDcgKzM4ODAsNyBAQAogICAgICAgICBjYXNlIG9teF9tZXNzYWdlOjpFTVBUWV9CVUZGRVJfRE9ORToKICAgICAgICAgewogICAgICAgICAgICAgSU9NWDo6YnVmZmVyX2lkIGJ1ZmZlcklEOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigiYnVmZmVyIiwgJmJ1ZmZlcklEKSk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYnVmZmVyIiwgKGludDMyX3QqKSZidWZmZXJJRCkpOwogCiAgICAgICAgICAgICByZXR1cm4gb25PTVhFbXB0eUJ1ZmZlckRvbmUoYnVmZmVySUQpOwogICAgICAgICB9CkBAIC0zMDY0LDI3ICszODg4LDIxIEBACiAgICAgICAgIGNhc2Ugb214X21lc3NhZ2U6OkZJTExfQlVGRkVSX0RPTkU6CiAgICAgICAgIHsKICAgICAgICAgICAgIElPTVg6OmJ1ZmZlcl9pZCBidWZmZXJJRDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFBvaW50ZXIoImJ1ZmZlciIsICZidWZmZXJJRCkpOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImJ1ZmZlciIsIChpbnQzMl90KikmYnVmZmVySUQpKTsKIAogICAgICAgICAgICAgaW50MzJfdCByYW5nZU9mZnNldCwgcmFuZ2VMZW5ndGgsIGZsYWdzOwogICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgICAgICAgICB2b2lkICpwbGF0Zm9ybVByaXZhdGU7Ci0gICAgICAgICAgICB2b2lkICpkYXRhUHRyOwogCiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmFuZ2Vfb2Zmc2V0IiwgJnJhbmdlT2Zmc2V0KSk7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmFuZ2VfbGVuZ3RoIiwgJnJhbmdlTGVuZ3RoKSk7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZmxhZ3MiLCAmZmxhZ3MpKTsKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJ0aW1lc3RhbXAiLCAmdGltZVVzKSk7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJwbGF0Zm9ybV9wcml2YXRlIiwgJnBsYXRmb3JtUHJpdmF0ZSkpOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigiZGF0YV9wdHIiLCAmZGF0YVB0cikpOwogCiAgICAgICAgICAgICByZXR1cm4gb25PTVhGaWxsQnVmZmVyRG9uZSgKICAgICAgICAgICAgICAgICAgICAgYnVmZmVySUQsCiAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpcmFuZ2VPZmZzZXQsIChzaXplX3QpcmFuZ2VMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgIChPTVhfVTMyKWZsYWdzLAotICAgICAgICAgICAgICAgICAgICB0aW1lVXMsCi0gICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtUHJpdmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgZGF0YVB0cik7CisgICAgICAgICAgICAgICAgICAgIHRpbWVVcyk7CiAgICAgICAgIH0KIAogICAgICAgICBkZWZhdWx0OgpAQCAtMzEwNCw3ICszOTIyLDEzIEBACiAKICAgICBBTE9HRSgiWyVzXSBFUlJPUigweCUwOGx4KSIsIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZGF0YTEpOwogCi0gICAgbUNvZGVjLT5zaWduYWxFcnJvcigoT01YX0VSUk9SVFlQRSlkYXRhMSk7CisgICAgLy8gdmVyaWZ5IE9NWCBjb21wb25lbnQgc2VuZHMgYmFjayBhbiBlcnJvciB3ZSBleHBlY3QuCisgICAgT01YX0VSUk9SVFlQRSBvbXhFcnJvciA9IChPTVhfRVJST1JUWVBFKWRhdGExOworICAgIGlmICghaXNPTVhFcnJvcihvbXhFcnJvcikpIHsKKyAgICAgICAgQUxPR1coIkludmFsaWQgT01YIGVycm9yICUjeCIsIG9teEVycm9yKTsKKyAgICAgICAgb214RXJyb3IgPSBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgfQorICAgIG1Db2RlYy0+c2lnbmFsRXJyb3Iob214RXJyb3IpOwogCiAgICAgcmV0dXJuIHRydWU7CiB9CkBAIC0zMTE5LDIzICszOTQzLDEyIEBACiAgICAgQ0hFQ0tfRVEoKGludClpbmZvLT5tU3RhdHVzLCAoaW50KUJ1ZmZlckluZm86Ok9XTkVEX0JZX0NPTVBPTkVOVCk7CiAgICAgaW5mby0+bVN0YXR1cyA9IEJ1ZmZlckluZm86Ok9XTkVEX0JZX1VTOwogCi0gICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZidWZmZXJNZXRhID0gaW5mby0+bURhdGEtPm1ldGEoKTsKLSAgICB2b2lkICptZWRpYUJ1ZmZlcjsKLSAgICBpZiAoYnVmZmVyTWV0YS0+ZmluZFBvaW50ZXIoIm1lZGlhQnVmZmVyIiwgJm1lZGlhQnVmZmVyKQotICAgICAgICAgICAgJiYgbWVkaWFCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAvLyBXZSdyZSBpbiAic3RvcmUtbWV0YWRhdGEtaW4tYnVmZmVycyIgbW9kZSwgdGhlIHVuZGVybHlpbmcKLSAgICAgICAgLy8gT01YIGNvbXBvbmVudCBoYWQgYWNjZXNzIHRvIGRhdGEgdGhhdCdzIGltcGxpY2l0bHkgcmVmY291bnRlZAotICAgICAgICAvLyBieSB0aGlzICJtZWRpYUJ1ZmZlciIgb2JqZWN0LiBOb3cgdGhhdCB0aGUgT01YIGNvbXBvbmVudCBoYXMKLSAgICAgICAgLy8gdG9sZCB1cyB0aGF0IGl0J3MgZG9uZSB3aXRoIHRoZSBpbnB1dCBidWZmZXIsIHdlIGNhbiBkZWNyZW1lbnQKLSAgICAgICAgLy8gdGhlIG1lZGlhQnVmZmVyJ3MgcmVmZXJlbmNlIGNvdW50LgotCi0gICAgICAgIEFMT0dWKCJyZWxlYXNpbmcgbWJ1ZiAlcCIsIG1lZGlhQnVmZmVyKTsKLQotICAgICAgICAoKE1lZGlhQnVmZmVyICopbWVkaWFCdWZmZXIpLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1lZGlhQnVmZmVyID0gTlVMTDsKLQotICAgICAgICBidWZmZXJNZXRhLT5zZXRQb2ludGVyKCJtZWRpYUJ1ZmZlciIsIE5VTEwpOwotICAgIH0KKyAgICAvLyBXZSdyZSBpbiAic3RvcmUtbWV0YWRhdGEtaW4tYnVmZmVycyIgbW9kZSwgdGhlIHVuZGVybHlpbmcKKyAgICAvLyBPTVggY29tcG9uZW50IGhhZCBhY2Nlc3MgdG8gZGF0YSB0aGF0J3MgaW1wbGljaXRseSByZWZjb3VudGVkCisgICAgLy8gYnkgdGhpcyAiTWVkaWFCdWZmZXIiIG9iamVjdC4gTm93IHRoYXQgdGhlIE9NWCBjb21wb25lbnQgaGFzCisgICAgLy8gdG9sZCB1cyB0aGF0IGl0J3MgZG9uZSB3aXRoIHRoZSBpbnB1dCBidWZmZXIsIHdlIGNhbiBkZWNyZW1lbnQKKyAgICAvLyB0aGUgbWVkaWFCdWZmZXIncyByZWZlcmVuY2UgY291bnQuCisgICAgaW5mby0+bURhdGEtPnNldE1lZGlhQnVmZmVyQmFzZShOVUxMKTsKIAogICAgIFBvcnRNb2RlIG1vZGUgPSBnZXRQb3J0TW9kZShrUG9ydEluZGV4SW5wdXQpOwogCkBAIC0zMTY2LDE0ICszOTc5LDE0IEBACiAgICAgQ0hFQ0tfRVEoKGludClpbmZvLT5tU3RhdHVzLCAoaW50KUJ1ZmZlckluZm86Ok9XTkVEX0JZX1VTKTsKIAogICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtQ29kZWMtPm1Ob3RpZnktPmR1cCgpOwotICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBBQ29kZWM6OmtXaGF0RmlsbFRoaXNCdWZmZXIpOwotICAgIG5vdGlmeS0+c2V0UG9pbnRlcigiYnVmZmVyLWlkIiwgaW5mby0+bUJ1ZmZlcklEKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQ29kZWNCYXNlOjprV2hhdEZpbGxUaGlzQnVmZmVyKTsKKyAgICBub3RpZnktPnNldEludDMyKCJidWZmZXItaWQiLCBpbmZvLT5tQnVmZmVySUQpOwogCiAgICAgaW5mby0+bURhdGEtPm1ldGEoKS0+Y2xlYXIoKTsKICAgICBub3RpZnktPnNldEJ1ZmZlcigiYnVmZmVyIiwgaW5mby0+bURhdGEpOwogCiAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKGtXaGF0SW5wdXRCdWZmZXJGaWxsZWQsIG1Db2RlYy0+aWQoKSk7Ci0gICAgcmVwbHktPnNldFBvaW50ZXIoImJ1ZmZlci1pZCIsIGluZm8tPm1CdWZmZXJJRCk7CisgICAgcmVwbHktPnNldEludDMyKCJidWZmZXItaWQiLCBpbmZvLT5tQnVmZmVySUQpOwogCiAgICAgbm90aWZ5LT5zZXRNZXNzYWdlKCJyZXBseSIsIHJlcGx5KTsKIApAQCAtMzE4NCw4ICszOTk3LDcgQEAKIAogdm9pZCBBQ29kZWM6OkJhc2VTdGF0ZTo6b25JbnB1dEJ1ZmZlckZpbGxlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIElPTVg6OmJ1ZmZlcl9pZCBidWZmZXJJRDsKLSAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJidWZmZXItaWQiLCAmYnVmZmVySUQpKTsKLQorICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJidWZmZXItaWQiLCAoaW50MzJfdCopJmJ1ZmZlcklEKSk7CiAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOwogICAgIGludDMyX3QgZXJyID0gT0s7CiAgICAgYm9vbCBlb3MgPSBmYWxzZTsKQEAgLTMyODksOCArNDEwMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dHB1dE1vZGUgPT0gRlJFRV9CVUZGRVJTID8gIkZSRUUiIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0TW9kZSA9PSBLRUVQX0JVRkZFUlMgPyAiS0VFUCIgOiAiUkVTVUJNSVQiKSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXRNb2RlID09IFJFU1VCTUlUX0JVRkZFUlMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKG1Db2RlYy0+c3VibWl0T3V0cHV0TWV0YURhdGFCdWZmZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXR1c190KU9LKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+c3VibWl0T3V0cHV0TWV0YURhdGFCdWZmZXIoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIApAQCAtMzM4MywxMCArNDE5NCw4IEBACiAgICAgICAgIElPTVg6OmJ1ZmZlcl9pZCBidWZmZXJJRCwKICAgICAgICAgc2l6ZV90IHJhbmdlT2Zmc2V0LCBzaXplX3QgcmFuZ2VMZW5ndGgsCiAgICAgICAgIE9NWF9VMzIgZmxhZ3MsCi0gICAgICAgIGludDY0X3QgdGltZVVzLAotICAgICAgICB2b2lkICpwbGF0Zm9ybVByaXZhdGUsCi0gICAgICAgIHZvaWQgKmRhdGFQdHIpIHsKLSAgICBBTE9HVigiWyVzXSBvbk9NWEZpbGxCdWZmZXJEb25lICVwIHRpbWUgJWxsZCB1cywgZmxhZ3MgPSAweCUwOGx4IiwKKyAgICAgICAgaW50NjRfdCB0aW1lVXMpIHsKKyAgICBBTE9HVigiWyVzXSBvbk9NWEZpbGxCdWZmZXJEb25lICV1IHRpbWUgJSIgUFJJZDY0ICIgdXMsIGZsYWdzID0gMHglMDh4IiwKICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwgYnVmZmVySUQsIHRpbWVVcywgZmxhZ3MpOwogCiAgICAgc3NpemVfdCBpbmRleDsKQEAgLTM0MjMsNyArNDIzMiw3IEBACiAgICAgICAgIGNhc2UgUkVTVUJNSVRfQlVGRkVSUzoKICAgICAgICAgewogICAgICAgICAgICAgaWYgKHJhbmdlTGVuZ3RoID09IDAgJiYgIShmbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBjYWxsaW5nIGZpbGxCdWZmZXIgJXAiLAorICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIGNhbGxpbmcgZmlsbEJ1ZmZlciAldSIsCiAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCksIGluZm8tPm1CdWZmZXJJRCk7CiAKICAgICAgICAgICAgICAgICBDSEVDS19FUShtQ29kZWMtPm1PTVgtPmZpbGxCdWZmZXIoCkBAIC0zNDM3LDcgKzQyNDYsNyBAQAogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0KICAgICAgICAgICAgICAgICBuZXcgQU1lc3NhZ2Uoa1doYXRPdXRwdXRCdWZmZXJEcmFpbmVkLCBtQ29kZWMtPmlkKCkpOwogCi0gICAgICAgICAgICBpZiAoIW1Db2RlYy0+bVNlbnRGb3JtYXQpIHsKKyAgICAgICAgICAgIGlmICghbUNvZGVjLT5tU2VudEZvcm1hdCAmJiByYW5nZUxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICBtQ29kZWMtPnNlbmRGb3JtYXRDaGFuZ2UocmVwbHkpOwogICAgICAgICAgICAgfQogCkBAIC0zNDY0LDEyICs0MjczLDEyIEBACiAgICAgICAgICAgICBpbmZvLT5tRGF0YS0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKIAogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Db2RlYy0+bU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQUNvZGVjOjprV2hhdERyYWluVGhpc0J1ZmZlcik7Ci0gICAgICAgICAgICBub3RpZnktPnNldFBvaW50ZXIoImJ1ZmZlci1pZCIsIGluZm8tPm1CdWZmZXJJRCk7CisgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQ29kZWNCYXNlOjprV2hhdERyYWluVGhpc0J1ZmZlcik7CisgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJidWZmZXItaWQiLCBpbmZvLT5tQnVmZmVySUQpOwogICAgICAgICAgICAgbm90aWZ5LT5zZXRCdWZmZXIoImJ1ZmZlciIsIGluZm8tPm1EYXRhKTsKICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImZsYWdzIiwgZmxhZ3MpOwogCi0gICAgICAgICAgICByZXBseS0+c2V0UG9pbnRlcigiYnVmZmVyLWlkIiwgaW5mby0+bUJ1ZmZlcklEKTsKKyAgICAgICAgICAgIHJlcGx5LT5zZXRJbnQzMigiYnVmZmVyLWlkIiwgaW5mby0+bUJ1ZmZlcklEKTsKIAogICAgICAgICAgICAgbm90aWZ5LT5zZXRNZXNzYWdlKCJyZXBseSIsIHJlcGx5KTsKIApAQCAtMzQ4MSw3ICs0MjkwLDcgQEAKICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBzYXcgb3V0cHV0IEVPUyIsIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CiAKICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbUNvZGVjLT5tTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQUNvZGVjOjprV2hhdEVPUyk7CisgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIENvZGVjQmFzZTo6a1doYXRFT1MpOwogICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImVyciIsIG1Db2RlYy0+bUlucHV0RU9TUmVzdWx0KTsKICAgICAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKIApAQCAtMzUwNSw4ICs0MzE0LDcgQEAKIAogdm9pZCBBQ29kZWM6OkJhc2VTdGF0ZTo6b25PdXRwdXRCdWZmZXJEcmFpbmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgSU9NWDo6YnVmZmVyX2lkIGJ1ZmZlcklEOwotICAgIENIRUNLKG1zZy0+ZmluZFBvaW50ZXIoImJ1ZmZlci1pZCIsICZidWZmZXJJRCkpOwotCisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImJ1ZmZlci1pZCIsIChpbnQzMl90KikmYnVmZmVySUQpKTsKICAgICBzc2l6ZV90IGluZGV4OwogICAgIEJ1ZmZlckluZm8gKmluZm8gPQogICAgICAgICBtQ29kZWMtPmZpbmRCdWZmZXJCeUlEKGtQb3J0SW5kZXhPdXRwdXQsIGJ1ZmZlcklELCAmaW5kZXgpOwpAQCAtMzUyMiwxOSArNDMzMCw0MyBAQAogICAgIGludDMyX3QgcmVuZGVyOwogICAgIGlmIChtQ29kZWMtPm1OYXRpdmVXaW5kb3cgIT0gTlVMTAogICAgICAgICAgICAgJiYgbXNnLT5maW5kSW50MzIoInJlbmRlciIsICZyZW5kZXIpICYmIHJlbmRlciAhPSAwCi0gICAgICAgICAgICAmJiAoaW5mby0+bURhdGEgPT0gTlVMTCB8fCBpbmZvLT5tRGF0YS0+c2l6ZSgpICE9IDApKSB7CisgICAgICAgICAgICAmJiBpbmZvLT5tRGF0YSAhPSBOVUxMICYmIGluZm8tPm1EYXRhLT5zaXplKCkgIT0gMCkgeworICAgICAgICBBVFJBQ0VfTkFNRSgicmVuZGVyIik7CiAgICAgICAgIC8vIFRoZSBjbGllbnQgd2FudHMgdGhpcyBidWZmZXIgdG8gYmUgcmVuZGVyZWQuCiAKKyAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBOcyA9IDA7CisgICAgICAgIGlmICghbXNnLT5maW5kSW50NjQoInRpbWVzdGFtcE5zIiwgJnRpbWVzdGFtcE5zKSkgeworICAgICAgICAgICAgLy8gVE9ETzogaXQgc2VlbXMgbGlrZSB3ZSBzaG91bGQgdXNlIHRoZSB0aW1lc3RhbXAKKyAgICAgICAgICAgIC8vIGluIHRoZSAobWVkaWEpYnVmZmVyIGFzIGl0IHBvdGVudGlhbGx5IGNhbWUgZnJvbQorICAgICAgICAgICAgLy8gYW4gaW5wdXQgc3VyZmFjZSwgYnV0IHdlIGRpZCBub3QgcHJvcGFnYXRlIGl0IHByaW9yIHRvCisgICAgICAgICAgICAvLyBBUEkgMjAuICBQZXJoYXBzIGNoZWNrIGZvciB0YXJnZXQgU0RLIHZlcnNpb24uCisjaWYgMAorICAgICAgICAgICAgaWYgKGluZm8tPm1EYXRhLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVzdGFtcE5zKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJ1c2luZyBidWZmZXIgUFRTIG9mICUiIFBSSWQ2NCwgdGltZXN0YW1wTnMpOworICAgICAgICAgICAgICAgIHRpbWVzdGFtcE5zICo9IDEwMDA7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfQorCiAgICAgICAgIHN0YXR1c190IGVycjsKKyAgICAgICAgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc190aW1lc3RhbXAobUNvZGVjLT5tTmF0aXZlV2luZG93LmdldCgpLCB0aW1lc3RhbXBOcyk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dXKCJmYWlsZWQgdG8gc2V0IGJ1ZmZlciB0aW1lc3RhbXA6ICVkIiwgZXJyKTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmICgoZXJyID0gbUNvZGVjLT5tTmF0aXZlV2luZG93LT5xdWV1ZUJ1ZmZlcigKICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tTmF0aXZlV2luZG93LmdldCgpLAogICAgICAgICAgICAgICAgICAgICBpbmZvLT5tR3JhcGhpY0J1ZmZlci5nZXQoKSwgLTEpKSA9PSBPSykgewogICAgICAgICAgICAgaW5mby0+bVN0YXR1cyA9IEJ1ZmZlckluZm86Ok9XTkVEX0JZX05BVElWRV9XSU5ET1c7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgZXJyKTsKKyAgICAgICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9yVW5kZWZpbmVkLCBtYWtlTm9TaWRlRWZmZWN0U3RhdHVzKGVycikpOwogICAgICAgICAgICAgaW5mby0+bVN0YXR1cyA9IEJ1ZmZlckluZm86Ok9XTkVEX0JZX1VTOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1Db2RlYy0+bU5hdGl2ZVdpbmRvdyAhPSBOVUxMICYmCisgICAgICAgICAgICAoaW5mby0+bURhdGEgPT0gTlVMTCB8fCBpbmZvLT5tRGF0YS0+c2l6ZSgpICE9IDApKSB7CisgICAgICAgICAgICBBVFJBQ0VfTkFNRSgiZnJhbWUtZHJvcCIpOworICAgICAgICB9CiAgICAgICAgIGluZm8tPm1TdGF0dXMgPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUzsKICAgICB9CiAKQEAgLTM1NjUsNyArNDM5Nyw3IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKGluZm8gIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBjYWxsaW5nIGZpbGxCdWZmZXIgJXAiLAorICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBjYWxsaW5nIGZpbGxCdWZmZXIgJXUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwgaW5mby0+bUJ1ZmZlcklEKTsKIAogICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtQ29kZWMtPm1PTVgtPmZpbGxCdWZmZXIobUNvZGVjLT5tTm9kZSwgaW5mby0+bUJ1ZmZlcklEKSwKQEAgLTM2MzUsMTAgKzQ0NjcsMTEgQEAKICAgICAgICAgICAgIGludDMyX3Qga2VlcENvbXBvbmVudEFsbG9jYXRlZDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKAogICAgICAgICAgICAgICAgICAgICAgICAgImtlZXBDb21wb25lbnRBbGxvY2F0ZWQiLCAma2VlcENvbXBvbmVudEFsbG9jYXRlZCkpOwotICAgICAgICAgICAgQ0hFQ0soIWtlZXBDb21wb25lbnRBbGxvY2F0ZWQpOworICAgICAgICAgICAgQUxPR1dfSUYoa2VlcENvbXBvbmVudEFsbG9jYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICJjYW5ub3Qga2VlcCBjb21wb25lbnQgYWxsb2NhdGVkIG9uIHNodXRkb3duIGluIFVuaW5pdGlhbGl6ZWQgc3RhdGUiKTsKIAogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Db2RlYy0+bU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQUNvZGVjOjprV2hhdFNodXRkb3duQ29tcGxldGVkKTsKKyAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0U2h1dGRvd25Db21wbGV0ZWQpOwogICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CiAKICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwpAQCAtMzY0OCwxMyArNDQ4MSwyMCBAQAogICAgICAgICBjYXNlIEFDb2RlYzo6a1doYXRGbHVzaDoKICAgICAgICAgewogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Db2RlYy0+bU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQUNvZGVjOjprV2hhdEZsdXNoQ29tcGxldGVkKTsKKyAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0Rmx1c2hDb21wbGV0ZWQpOwogICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CiAKICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIEFDb2RlYzo6a1doYXRSZWxlYXNlQ29kZWNJbnN0YW5jZToKKyAgICAgICAgeworICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbywgYXMgd2UgaGF2ZSBhbHJlYWR5IHNpZ25hbGVkIHNodXRkb3duCisgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBCYXNlU3RhdGU6Om9uTWVzc2FnZVJlY2VpdmVkKG1zZyk7CiAgICAgfQpAQCAtMzY5NSw2ICs0NTM1LDcgQEAKIAogICAgIEFTdHJpbmcgY29tcG9uZW50TmFtZTsKICAgICB1aW50MzJfdCBxdWlya3MgPSAwOworICAgIGludDMyX3QgZW5jb2RlciA9IGZhbHNlOwogICAgIGlmIChtc2ctPmZpbmRTdHJpbmcoImNvbXBvbmVudE5hbWUiLCAmY29tcG9uZW50TmFtZSkpIHsKICAgICAgICAgc3NpemVfdCBpbmRleCA9IG1hdGNoaW5nQ29kZWNzLmFkZCgpOwogICAgICAgICBPTVhDb2RlYzo6Q29kZWNOYW1lQW5kUXVpcmtzICplbnRyeSA9ICZtYXRjaGluZ0NvZGVjcy5lZGl0SXRlbUF0KGluZGV4KTsKQEAgLTM3MDcsNyArNDU0OCw2IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKIAotICAgICAgICBpbnQzMl90IGVuY29kZXI7CiAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImVuY29kZXIiLCAmZW5jb2RlcikpIHsKICAgICAgICAgICAgIGVuY29kZXIgPSBmYWxzZTsKICAgICAgICAgfQpAQCAtMzczNiw2ICs0NTc2LDggQEAKIAogICAgICAgICBpZiAoZXJyID09IE9LKSB7CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCJBbGxvY2F0aW5nIGNvbXBvbmVudCAnJXMnIGZhaWxlZCwgdHJ5IG5leHQgb25lLiIsIGNvbXBvbmVudE5hbWUuY19zdHIoKSk7CiAgICAgICAgIH0KIAogICAgICAgICBub2RlID0gTlVMTDsKQEAgLTM3NDMsMTAgKzQ1ODUsMTAgQEAKIAogICAgIGlmIChub2RlID09IE5VTEwpIHsKICAgICAgICAgaWYgKCFtaW1lLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gaW5zdGFudGlhdGUgYSBkZWNvZGVyIGZvciB0eXBlICclcycuIiwKLSAgICAgICAgICAgICAgICAgbWltZS5jX3N0cigpKTsKKyAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gaW5zdGFudGlhdGUgYSAlc2NvZGVyIGZvciB0eXBlICclcycuIiwKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlciA/ICJlbiIgOiAiZGUiLCBtaW1lLmNfc3RyKCkpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBpbnN0YW50aWF0ZSBkZWNvZGVyICclcycuIiwgY29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gaW5zdGFudGlhdGUgY29kZWMgJyVzJy4iLCBjb21wb25lbnROYW1lLmNfc3RyKCkpOwogICAgICAgICB9CiAKICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JDb21wb25lbnROb3RGb3VuZCk7CkBAIC0zNzcwLDcgKzQ2MTIsNyBAQAogCiAgICAgewogICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbUNvZGVjLT5tTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIEFDb2RlYzo6a1doYXRDb21wb25lbnRBbGxvY2F0ZWQpOworICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQ29kZWNCYXNlOjprV2hhdENvbXBvbmVudEFsbG9jYXRlZCk7CiAgICAgICAgIG5vdGlmeS0+c2V0U3RyaW5nKCJjb21wb25lbnROYW1lIiwgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CiAgICAgfQpAQCAtMzc5Nyw3ICs0NjM5LDggQEAKICAgICBtQ29kZWMtPm1EZXF1ZXVlQ291bnRlciA9IDA7CiAgICAgbUNvZGVjLT5tTWV0YURhdGFCdWZmZXJzVG9TdWJtaXQgPSAwOwogICAgIG1Db2RlYy0+bVJlcGVhdEZyYW1lRGVsYXlVcyA9IC0xbGw7Ci0gICAgbUNvZGVjLT5tSXNDb25maWd1cmVkRm9yQWRhcHRpdmVQbGF5YmFjayA9IGZhbHNlOworICAgIG1Db2RlYy0+bUlucHV0Rm9ybWF0LmNsZWFyKCk7CisgICAgbUNvZGVjLT5tT3V0cHV0Rm9ybWF0LmNsZWFyKCk7CiAKICAgICBpZiAobUNvZGVjLT5tU2h1dGRvd25JblByb2dyZXNzKSB7CiAgICAgICAgIGJvb2wga2VlcENvbXBvbmVudEFsbG9jYXRlZCA9IG1Db2RlYy0+bUtlZXBDb21wb25lbnRBbGxvY2F0ZWQ7CkBAIC0zODA3LDYgKzQ2NTAsOSBAQAogCiAgICAgICAgIG9uU2h1dGRvd24oa2VlcENvbXBvbmVudEFsbG9jYXRlZCk7CiAgICAgfQorICAgIG1Db2RlYy0+bUV4cGxpY2l0U2h1dGRvd24gPSBmYWxzZTsKKworICAgIG1Db2RlYy0+cHJvY2Vzc0RlZmVycmVkTWVzc2FnZXMoKTsKIH0KIAogdm9pZCBBQ29kZWM6OkxvYWRlZFN0YXRlOjpvblNodXRkb3duKGJvb2wga2VlcENvbXBvbmVudEFsbG9jYXRlZCkgewpAQCAtMzgxNiw5ICs0NjYyLDEyIEBACiAgICAgICAgIG1Db2RlYy0+Y2hhbmdlU3RhdGUobUNvZGVjLT5tVW5pbml0aWFsaXplZFN0YXRlKTsKICAgICB9CiAKLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbUNvZGVjLT5tTm90aWZ5LT5kdXAoKTsKLSAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQUNvZGVjOjprV2hhdFNodXRkb3duQ29tcGxldGVkKTsKLSAgICBub3RpZnktPnBvc3QoKTsKKyAgICBpZiAobUNvZGVjLT5tRXhwbGljaXRTaHV0ZG93bikgeworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbUNvZGVjLT5tTm90aWZ5LT5kdXAoKTsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIENvZGVjQmFzZTo6a1doYXRTaHV0ZG93bkNvbXBsZXRlZCk7CisgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgICAgICBtQ29kZWMtPm1FeHBsaWNpdFNodXRkb3duID0gZmFsc2U7CisgICAgfQogfQogCiBib29sIEFDb2RlYzo6TG9hZGVkU3RhdGU6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CkBAIC0zODUyLDYgKzQ3MDEsNyBAQAogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoCiAgICAgICAgICAgICAgICAgICAgICAgICAia2VlcENvbXBvbmVudEFsbG9jYXRlZCIsICZrZWVwQ29tcG9uZW50QWxsb2NhdGVkKSk7CiAKKyAgICAgICAgICAgIG1Db2RlYy0+bUV4cGxpY2l0U2h1dGRvd24gPSB0cnVlOwogICAgICAgICAgICAgb25TaHV0ZG93bihrZWVwQ29tcG9uZW50QWxsb2NhdGVkKTsKIAogICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CkBAIC0zODYxLDcgKzQ3MTEsNyBAQAogICAgICAgICBjYXNlIEFDb2RlYzo6a1doYXRGbHVzaDoKICAgICAgICAgewogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Db2RlYy0+bU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQUNvZGVjOjprV2hhdEZsdXNoQ29tcGxldGVkKTsKKyAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0Rmx1c2hDb21wbGV0ZWQpOwogICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CiAKICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwpAQCAtMzg5MCw3ICs0NzQwLDcgQEAKICAgICAgICAgQUxPR0UoIlslc10gY29uZmlndXJlQ29kZWMgcmV0dXJuaW5nIGVycm9yICVkIiwKICAgICAgICAgICAgICAgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOwogCi0gICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9yVW5kZWZpbmVkLCBlcnIpOworICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgbWFrZU5vU2lkZUVmZmVjdFN0YXR1cyhlcnIpKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApAQCAtMzkxMCw3ICs0NzYwLDkgQEAKIAogICAgIHsKICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Db2RlYy0+bU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBBQ29kZWM6OmtXaGF0Q29tcG9uZW50Q29uZmlndXJlZCk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0Q29tcG9uZW50Q29uZmlndXJlZCk7CisgICAgICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgiaW5wdXQtZm9ybWF0IiwgbUNvZGVjLT5tSW5wdXRGb3JtYXQpOworICAgICAgICBub3RpZnktPnNldE1lc3NhZ2UoIm91dHB1dC1mb3JtYXQiLCBtQ29kZWMtPm1PdXRwdXRGb3JtYXQpOwogICAgICAgICBub3RpZnktPnBvc3QoKTsKICAgICB9CiAKQEAgLTM5MTgsMTEgKzQ3NzAsMTEgQEAKIH0KIAogdm9pZCBBQ29kZWM6OkxvYWRlZFN0YXRlOjpvbkNyZWF0ZUlucHV0U3VyZmFjZSgKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICYgLyogbXNnICovKSB7CiAgICAgQUxPR1YoIm9uQ3JlYXRlSW5wdXRTdXJmYWNlIik7CiAKICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbUNvZGVjLT5tTm90aWZ5LT5kdXAoKTsKLSAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQUNvZGVjOjprV2hhdElucHV0U3VyZmFjZUNyZWF0ZWQpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0SW5wdXRTdXJmYWNlQ3JlYXRlZCk7CiAKICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBidWZmZXJQcm9kdWNlcjsKICAgICBzdGF0dXNfdCBlcnI7CkBAIC0zOTQ2LDcgKzQ3OTgsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKGVyciA9PSBPSyAmJiBtQ29kZWMtPm1NYXhQdHNHYXBVcyA+IDBsKSB7CisgICAgaWYgKGVyciA9PSBPSyAmJiBtQ29kZWMtPm1NYXhQdHNHYXBVcyA+IDBsbCkgewogICAgICAgICBlcnIgPSBtQ29kZWMtPm1PTVgtPnNldEludGVybmFsT3B0aW9uKAogICAgICAgICAgICAgICAgIG1Db2RlYy0+bU5vZGUsCiAgICAgICAgICAgICAgICAga1BvcnRJbmRleElucHV0LApAQCAtMzk1Niw2ICs0ODA4LDQxIEBACiAKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIlslc10gVW5hYmxlIHRvIGNvbmZpZ3VyZSBtYXggdGltZXN0YW1wIGdhcCAoZXJyICVkKSIsCisgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgZXJyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChlcnIgPT0gT0sgJiYgbUNvZGVjLT5tVGltZVBlckNhcHR1cmVVcyA+IDBsbAorICAgICAgICAgICAgJiYgbUNvZGVjLT5tVGltZVBlckZyYW1lVXMgPiAwbGwpIHsKKyAgICAgICAgaW50NjRfdCB0aW1lTGFwc2VbMl07CisgICAgICAgIHRpbWVMYXBzZVswXSA9IG1Db2RlYy0+bVRpbWVQZXJGcmFtZVVzOworICAgICAgICB0aW1lTGFwc2VbMV0gPSBtQ29kZWMtPm1UaW1lUGVyQ2FwdHVyZVVzOworICAgICAgICBlcnIgPSBtQ29kZWMtPm1PTVgtPnNldEludGVybmFsT3B0aW9uKAorICAgICAgICAgICAgICAgIG1Db2RlYy0+bU5vZGUsCisgICAgICAgICAgICAgICAga1BvcnRJbmRleElucHV0LAorICAgICAgICAgICAgICAgIElPTVg6OklOVEVSTkFMX09QVElPTl9USU1FX0xBUFNFLAorICAgICAgICAgICAgICAgICZ0aW1lTGFwc2VbMF0sCisgICAgICAgICAgICAgICAgc2l6ZW9mKHRpbWVMYXBzZSkpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJbJXNdIFVuYWJsZSB0byBjb25maWd1cmUgdGltZSBsYXBzZSAoZXJyICVkKSIsCisgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgZXJyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChlcnIgPT0gT0sgJiYgbUNvZGVjLT5tQ3JlYXRlSW5wdXRCdWZmZXJzU3VzcGVuZGVkKSB7CisgICAgICAgIGJvb2wgc3VzcGVuZCA9IHRydWU7CisgICAgICAgIGVyciA9IG1Db2RlYy0+bU9NWC0+c2V0SW50ZXJuYWxPcHRpb24oCisgICAgICAgICAgICAgICAgbUNvZGVjLT5tTm9kZSwKKyAgICAgICAgICAgICAgICBrUG9ydEluZGV4SW5wdXQsCisgICAgICAgICAgICAgICAgSU9NWDo6SU5URVJOQUxfT1BUSU9OX1NVU1BFTkQsCisgICAgICAgICAgICAgICAgJnN1c3BlbmQsCisgICAgICAgICAgICAgICAgc2l6ZW9mKHN1c3BlbmQpKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiWyVzXSBVbmFibGUgdG8gY29uZmlndXJlIG9wdGlvbiB0byBzdXNwZW5kIChlcnIgJWQpIiwKICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgIGVycik7CiAgICAgICAgIH0KQEAgLTQwMDAsNyArNDg4Nyw3IEBACiAgICAgICAgICAgICAgIihlcnJvciAweCUwOHgpIiwKICAgICAgICAgICAgICBlcnIpOwogCi0gICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9yVW5kZWZpbmVkLCBlcnIpOworICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgbWFrZU5vU2lkZUVmZmVjdFN0YXR1cyhlcnIpKTsKIAogICAgICAgICBtQ29kZWMtPmNoYW5nZVN0YXRlKG1Db2RlYy0+bUxvYWRlZFN0YXRlKTsKICAgICB9CkBAIC00MDE4LDYgKzQ5MDUsNyBAQAogCiBib29sIEFDb2RlYzo6TG9hZGVkVG9JZGxlU3RhdGU6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0U2V0UGFyYW1ldGVyczoKICAgICAgICAgY2FzZSBrV2hhdFNodXRkb3duOgogICAgICAgICB7CiAgICAgICAgICAgICBtQ29kZWMtPmRlZmVyTWVzc2FnZShtc2cpOwpAQCAtNDA0MCw3ICs0OTI4LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgLy8gV2UgaGF2ZW4ndCBldmVuIHN0YXJ0ZWQgeWV0LCBzbyB3ZSdyZSBmbHVzaGVkIGFscmlnaHQuLi4KICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtQ29kZWMtPm1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIEFDb2RlYzo6a1doYXRGbHVzaENvbXBsZXRlZCk7CisgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQ29kZWNCYXNlOjprV2hhdEZsdXNoQ29tcGxldGVkKTsKICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KQEAgLTQwODQsNiArNDk3Miw3IEBACiAKIGJvb2wgQUNvZGVjOjpJZGxlVG9FeGVjdXRpbmdTdGF0ZTo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRTZXRQYXJhbWV0ZXJzOgogICAgICAgICBjYXNlIGtXaGF0U2h1dGRvd246CiAgICAgICAgIHsKICAgICAgICAgICAgIG1Db2RlYy0+ZGVmZXJNZXNzYWdlKG1zZyk7CkBAIC00MTAwLDcgKzQ5ODksNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICAvLyBXZSBoYXZlbid0IGV2ZW4gc3RhcnRlZCB5ZXQsIHNvIHdlJ3JlIGZsdXNoZWQgYWxyaWdodC4uLgogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Db2RlYy0+bU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQUNvZGVjOjprV2hhdEZsdXNoQ29tcGxldGVkKTsKKyAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0Rmx1c2hDb21wbGV0ZWQpOwogICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CiAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtNDE0NCw3ICs1MDMzLDcgQEAKIH0KIAogQUNvZGVjOjpCYXNlU3RhdGU6OlBvcnRNb2RlIEFDb2RlYzo6RXhlY3V0aW5nU3RhdGU6OmdldFBvcnRNb2RlKAotICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCkgeworICAgICAgICBPTVhfVTMyIC8qIHBvcnRJbmRleCAqLykgewogICAgIHJldHVybiBSRVNVQk1JVF9CVUZGRVJTOwogfQogCkBAIC00MjA2LDExICs1MDk1LDE0IEBACiAKICAgICBzdWJtaXRPdXRwdXRCdWZmZXJzKCk7CiAKLSAgICAvLyBQb3N0IHRoZSBmaXJzdCBpbnB1dCBidWZmZXIuCisgICAgLy8gUG9zdCBhbGwgYXZhaWxhYmxlIGlucHV0IGJ1ZmZlcnMKICAgICBDSEVDS19HVChtQ29kZWMtPm1CdWZmZXJzW2tQb3J0SW5kZXhJbnB1dF0uc2l6ZSgpLCAwdSk7Ci0gICAgQnVmZmVySW5mbyAqaW5mbyA9ICZtQ29kZWMtPm1CdWZmZXJzW2tQb3J0SW5kZXhJbnB1dF0uZWRpdEl0ZW1BdCgwKTsKLQotICAgIHBvc3RGaWxsVGhpc0J1ZmZlcihpbmZvKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db2RlYy0+bUJ1ZmZlcnNba1BvcnRJbmRleElucHV0XS5zaXplKCk7IGkrKykgeworICAgICAgICBCdWZmZXJJbmZvICppbmZvID0gJm1Db2RlYy0+bUJ1ZmZlcnNba1BvcnRJbmRleElucHV0XS5lZGl0SXRlbUF0KGkpOworICAgICAgICBpZiAoaW5mby0+bVN0YXR1cyA9PSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUykgeworICAgICAgICAgICAgcG9zdEZpbGxUaGlzQnVmZmVyKGluZm8pOworICAgICAgICB9CisgICAgfQogCiAgICAgbUFjdGl2ZSA9IHRydWU7CiB9CkBAIC00MjMyLDYgKzUxMjQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgImtlZXBDb21wb25lbnRBbGxvY2F0ZWQiLCAma2VlcENvbXBvbmVudEFsbG9jYXRlZCkpOwogCiAgICAgICAgICAgICBtQ29kZWMtPm1TaHV0ZG93bkluUHJvZ3Jlc3MgPSB0cnVlOworICAgICAgICAgICAgbUNvZGVjLT5tRXhwbGljaXRTaHV0ZG93biA9IHRydWU7CiAgICAgICAgICAgICBtQ29kZWMtPm1LZWVwQ29tcG9uZW50QWxsb2NhdGVkID0ga2VlcENvbXBvbmVudEFsbG9jYXRlZDsKIAogICAgICAgICAgICAgbUFjdGl2ZSA9IGZhbHNlOwpAQCAtNDM1Myw2ICs1MjQ2LDIyIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpbnQ2NF90IHNraXBGcmFtZXNCZWZvcmVVczsKKyAgICBpZiAocGFyYW1zLT5maW5kSW50NjQoInNraXAtZnJhbWVzLWJlZm9yZSIsICZza2lwRnJhbWVzQmVmb3JlVXMpKSB7CisgICAgICAgIHN0YXR1c190IGVyciA9CisgICAgICAgICAgICBtT01YLT5zZXRJbnRlcm5hbE9wdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLAorICAgICAgICAgICAgICAgICAgICAga1BvcnRJbmRleElucHV0LAorICAgICAgICAgICAgICAgICAgICAgSU9NWDo6SU5URVJOQUxfT1BUSU9OX1NUQVJUX1RJTUUsCisgICAgICAgICAgICAgICAgICAgICAmc2tpcEZyYW1lc0JlZm9yZVVzLAorICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNraXBGcmFtZXNCZWZvcmVVcykpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IHBhcmFtZXRlciAnc2tpcC1mcmFtZXMtYmVmb3JlJyAoZXJyICVkKSIsIGVycik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorCiAgICAgaW50MzJfdCBkcm9wSW5wdXRGcmFtZXM7CiAgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKCJkcm9wLWlucHV0LWZyYW1lcyIsICZkcm9wSW5wdXRGcmFtZXMpKSB7CiAgICAgICAgIGJvb2wgc3VzcGVuZCA9IGRyb3BJbnB1dEZyYW1lcyAhPSAwOwpAQCAtNDM4Niw3ICs1Mjk1LDcgQEAKIAogdm9pZCBBQ29kZWM6Om9uU2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpIHsKICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIEFDb2RlYzo6a1doYXRTaWduYWxlZElucHV0RU9TKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQ29kZWNCYXNlOjprV2hhdFNpZ25hbGVkSW5wdXRFT1MpOwogCiAgICAgc3RhdHVzX3QgZXJyID0gbU9NWC0+c2lnbmFsRW5kT2ZJbnB1dFN0cmVhbShtTm9kZSk7CiAgICAgaWYgKGVyciAhPSBPSykgewpAQCAtNDUwNiw3ICs1NDE1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCByZWNvbmZpZ3VyYXRpb24gKGVycm9yIDB4JTA4eCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7CiAKLSAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIGVycik7CisgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9yVW5kZWZpbmVkLCBtYWtlTm9TaWRlRWZmZWN0U3RhdHVzKGVycikpOwogCiAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGVjaG5pY2FsbHkgbm90IGNvcnJlY3QsIGJ1dCBhcHBlYXJzIHRvIGJlCiAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBvbmx5IHdheSB0byBmcmVlIHRoZSBjb21wb25lbnQgaW5zdGFuY2UuCkBAIC00Nzc1LDcgKzU2ODQsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0T01YTWVzc2FnZSwgbUNvZGVjLT5pZCgpKTsKICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoInR5cGUiLCBvbXhfbWVzc2FnZTo6RVZFTlQpOwotICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKCJub2RlIiwgbUNvZGVjLT5tTm9kZSk7CisgICAgICAgICAgICBtc2ctPnNldEludDMyKCJub2RlIiwgbUNvZGVjLT5tTm9kZSk7CiAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJldmVudCIsIGV2ZW50KTsKICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImRhdGExIiwgZGF0YTEpOwogICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiZGF0YTIiLCBkYXRhMik7CkBAIC00ODE2LDcgKzU3MjUsNyBAQAogICAgICAgICBtQ29kZWMtPndhaXRVbnRpbEFsbFBvc3NpYmxlTmF0aXZlV2luZG93QnVmZmVyc0FyZVJldHVybmVkVG9VcygpOwogCiAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtQ29kZWMtPm1Ob3RpZnktPmR1cCgpOwotICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQUNvZGVjOjprV2hhdEZsdXNoQ29tcGxldGVkKTsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIENvZGVjQmFzZTo6a1doYXRGbHVzaENvbXBsZXRlZCk7CiAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwogCiAgICAgICAgIG1Db2RlYy0+bVBvcnRFT1Nba1BvcnRJbmRleElucHV0XSA9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BTVJFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQU1SRXh0cmFjdG9yLmNwcAppbmRleCAwM2RjYmY5Li5hNmZiM2Q4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BTVJFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FNUkV4dHJhY3Rvci5jcHAKQEAgLTE4OSw3ICsxODksNyBAQAogICAgICAgICAgICAgbU9mZnNldFRhYmxlLCBtT2Zmc2V0VGFibGVMZW5ndGgpOwogfQogCi1zcDxNZXRhRGF0YT4gQU1SRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpIHsKK3NwPE1ldGFEYXRhPiBBTVJFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ICE9IDApIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMjIxLDcgKzIyMSw3IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBBTVJTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKK3N0YXR1c190IEFNUlNvdXJjZTo6c3RhcnQoTWV0YURhdGEgKiAvKiBwYXJhbXMgKi8pIHsKICAgICBDSEVDSyghbVN0YXJ0ZWQpOwogCiAgICAgbU9mZnNldCA9IG1Jc1dpZGUgPyA5IDogNjsKQEAgLTI1OCwxNCArMjU4LDE0IEBACiAgICAgICAgIGludDY0X3Qgc2Vla0ZyYW1lID0gc2Vla1RpbWVVcyAvIDIwMDAwbGw7ICAvLyAyMG1zIHBlciBmcmFtZS4KICAgICAgICAgbUN1cnJlbnRUaW1lVXMgPSBzZWVrRnJhbWUgKiAyMDAwMGxsOwogCi0gICAgICAgIGludCBpbmRleCA9IHNlZWtGcmFtZSAvIDUwOworICAgICAgICBzaXplX3QgaW5kZXggPSBzZWVrRnJhbWUgPCAwID8gMCA6IHNlZWtGcmFtZSAvIDUwOwogICAgICAgICBpZiAoaW5kZXggPj0gbU9mZnNldFRhYmxlTGVuZ3RoKSB7CiAgICAgICAgICAgICBpbmRleCA9IG1PZmZzZXRUYWJsZUxlbmd0aCAtIDE7CiAgICAgICAgIH0KIAogICAgICAgICBtT2Zmc2V0ID0gbU9mZnNldFRhYmxlW2luZGV4XSArIChtSXNXaWRlID8gOSA6IDYpOwogCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpPCBzZWVrRnJhbWUgLSBpbmRleCAqIDUwOyBpKyspIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGk8IHNlZWtGcmFtZSAtIGluZGV4ICogNTA7IGkrKykgewogICAgICAgICAgICAgc3RhdHVzX3QgZXJyOwogICAgICAgICAgICAgaWYgKChlcnIgPSBnZXRGcmFtZVNpemVCeU9mZnNldChtRGF0YVNvdXJjZSwgbU9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSXNXaWRlLCAmc2l6ZSkpICE9IE9LKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BTVJXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQU1SV3JpdGVyLmNwcAppbmRleCA4ZDVlZWM4Li45YWE3ZDk1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BTVJXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FNUldyaXRlci5jcHAKQEAgLTE0LDYgKzE0LDEyIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0FNUldyaXRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CkBAIC0yMiwxMCArMjgsNiBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+Ci0jaW5jbHVkZSA8c3lzL3ByY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTEwNSw3ICsxMDcsNyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQU1SV3JpdGVyOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7CitzdGF0dXNfdCBBTVJXcml0ZXI6OnN0YXJ0KE1ldGFEYXRhICogLyogcGFyYW1zICovKSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CiAgICAgfQpAQCAtMTYyLDcgKzE2NCw3IEBACiAgICAgdm9pZCAqZHVtbXk7CiAgICAgcHRocmVhZF9qb2luKG1UaHJlYWQsICZkdW1teSk7CiAKLSAgICBzdGF0dXNfdCBlcnIgPSAoc3RhdHVzX3QpIGR1bW15OworICAgIHN0YXR1c190IGVyciA9IHN0YXRpY19jYXN0PHN0YXR1c190PihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oZHVtbXkpKTsKICAgICB7CiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1Tb3VyY2UtPnN0b3AoKTsKICAgICAgICAgaWYgKGVyciA9PSBPSyAmJgpAQCAtMTkxLDcgKzE5Myw3IEBACiAKIC8vIHN0YXRpYwogdm9pZCAqQU1SV3JpdGVyOjpUaHJlYWRXcmFwcGVyKHZvaWQgKm1lKSB7Ci0gICAgcmV0dXJuICh2b2lkICopIHN0YXRpY19jYXN0PEFNUldyaXRlciAqPihtZSktPnRocmVhZEZ1bmMoKTsKKyAgICByZXR1cm4gKHZvaWQgKikodWludHB0cl90KSBzdGF0aWNfY2FzdDxBTVJXcml0ZXIgKj4obWUpLT50aHJlYWRGdW5jKCk7CiB9CiAKIHN0YXR1c190IEFNUldyaXRlcjo6dGhyZWFkRnVuYygpIHsKQEAgLTIzNSw3ICsyMzcsNyBAQAogICAgICAgICAgICAgbVJlc3VtZWQgPSBmYWxzZTsKICAgICAgICAgfQogICAgICAgICB0aW1lc3RhbXBVcyAtPSBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXM7Ci0gICAgICAgIEFMT0dWKCJ0aW1lIHN0YW1wOiAlbGxkLCBwcmV2aW91cyBwYXVzZWQgZHVyYXRpb246ICVsbGQiLAorICAgICAgICBBTE9HVigidGltZSBzdGFtcDogJSIgUFJJZDY0ICIsIHByZXZpb3VzIHBhdXNlZCBkdXJhdGlvbjogJSIgUFJJZDY0LAogICAgICAgICAgICAgICAgIHRpbWVzdGFtcFVzLCBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXMpOwogICAgICAgICBpZiAodGltZXN0YW1wVXMgPiBtYXhUaW1lc3RhbXBVcykgewogICAgICAgICAgICAgbWF4VGltZXN0YW1wVXMgPSB0aW1lc3RhbXBVczsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLm1rCmluZGV4IDZhMmE2OTYuLjE5M2Y4YTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5tawpAQCAtMTQsNyArMTQsMTAgQEAKICAgICAgICAgQXdlc29tZVBsYXllci5jcHAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgQ2FtZXJhU291cmNlLmNwcCAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgQ2FtZXJhU291cmNlVGltZUxhcHNlLmNwcCAgICAgICAgIFwKKyAgICAgICAgQ2xvY2tFc3RpbWF0b3IuY3BwICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ29kZWNCYXNlLmNwcCAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgRGF0YVNvdXJjZS5jcHAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRGF0YVVSSVNvdXJjZS5jcHAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgRFJNRXh0cmFjdG9yLmNwcCAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgRVNEUy5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgRmlsZVNvdXJjZS5jcHAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTMwLDggKzMzLDEwIEBACiAgICAgICAgIE1lZGlhQnVmZmVyR3JvdXAuY3BwICAgICAgICAgICAgICBcCiAgICAgICAgIE1lZGlhQ29kZWMuY3BwICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIE1lZGlhQ29kZWNMaXN0LmNwcCAgICAgICAgICAgICAgICBcCisgICAgICAgIE1lZGlhQ29kZWNTb3VyY2UuY3BwICAgICAgICAgICAgICBcCiAgICAgICAgIE1lZGlhRGVmcy5jcHAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIE1lZGlhRXh0cmFjdG9yLmNwcCAgICAgICAgICAgICAgICBcCisgICAgICAgIGh0dHAvTWVkaWFIVFRQLmNwcCAgICAgICAgICAgICAgICBcCiAgICAgICAgIE1lZGlhTXV4ZXIuY3BwICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIE1lZGlhU291cmNlLmNwcCAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIE1ldGFEYXRhLmNwcCAgICAgICAgICAgICAgICAgICAgICBcCkBAIC01NSwyMiArNjAsMjMgQEAKICAgICAgICAgV1ZNRXh0cmFjdG9yLmNwcCAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgWElOR1NlZWtlci5jcHAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgYXZjX3V0aWxzLmNwcCAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgbXA0L0ZyYWdtZW50ZWRNUDRQYXJzZXIuY3BwICAgICAgIFwKLSAgICAgICAgbXA0L1RyYWNrRnJhZ21lbnQuY3BwICAgICAgICAgICAgIFwKIAogTE9DQUxfQ19JTkNMVURFUzo9IFwKKyAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvaW5jbHVkZS9tZWRpYS8gXAogICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3RpbWVkdGV4dCBcCiAgICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL2hhcmR3YXJlIFwKICAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCi0gICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9zZXJ2aWNlcy9jb25uZWN0aXZpdHltYW5hZ2VyIFwKICAgICAgICAgJChUT1ApL2V4dGVybmFsL2ZsYWMvaW5jbHVkZSBcCiAgICAgICAgICQoVE9QKS9leHRlcm5hbC90cmVtb2xvIFwKICAgICAgICAgJChUT1ApL2V4dGVybmFsL29wZW5zc2wvaW5jbHVkZSBcCisgICAgICAgICQoVE9QKS9leHRlcm5hbC9saWJ2cHgvbGlid2VibSBcCisgICAgICAgICQoVE9QKS9zeXN0ZW0vbmV0ZC9pbmNsdWRlIFwKKyAgICAgICAgJChUT1ApL2V4dGVybmFsL2ljdS9pY3U0Yy9zb3VyY2UvY29tbW9uIFwKKyAgICAgICAgJChUT1ApL2V4dGVybmFsL2ljdS9pY3U0Yy9zb3VyY2UvaTE4biBcCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgICAgICBsaWJiaW5kZXIgXAogICAgICAgICBsaWJjYW1lcmFfY2xpZW50IFwKLSAgICAgICAgbGliY29ubmVjdGl2aXR5bWFuYWdlciBcCiAgICAgICAgIGxpYmN1dGlscyBcCiAgICAgICAgIGxpYmRsIFwKICAgICAgICAgbGliZHJtZnJhbWV3b3JrIFwKQEAgLTgwLDYgKzg2LDggQEAKICAgICAgICAgbGliaWN1dWMgXAogICAgICAgICBsaWJsb2cgXAogICAgICAgICBsaWJtZWRpYSBcCisgICAgICAgIGxpYm5ldGRfY2xpZW50IFwKKyAgICAgICAgbGlib3B1cyBcCiAgICAgICAgIGxpYnNvbml2b3ggXAogICAgICAgICBsaWJzc2wgXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9vbXggXApAQCAtOTUsNiArMTAzLDcgQEAKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfY29sb3JfY29udmVyc2lvbiBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2FhY2VuYyBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X21hdHJvc2thIFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHRfd2VibSBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X3RpbWVkdGV4dCBcCiAgICAgICAgIGxpYnZweCBcCiAgICAgICAgIGxpYndlYm0gXApAQCAtMTAzLDEzICsxMTIsNiBAQAogICAgICAgICBsaWJGTEFDIFwKICAgICAgICAgbGlibWVkaWFfaGVscGVyCiAKLUxPQ0FMX1NSQ19GSUxFUyArPSBcCi0gICAgICAgIGNocm9taXVtX2h0dHBfc3R1Yi5jcHAKLUxPQ0FMX0NQUEZMQUdTICs9IC1EQ0hST01JVU1fQVZBSUxBQkxFPTEKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJzdGxwb3J0Ci1pbmNsdWRlIGV4dGVybmFsL3N0bHBvcnQvbGlic3RscG9ydC5tawotCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfZW5jX2NvbW1vbiBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2F2Y19jb21tb24gXApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwCmluZGV4IDA1ZWUzNGUuLmUyNDgyNGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1BsYXllci5jcHAKQEAgLTE0LDYgKzE0LDggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIkF1ZGlvUGxheWVyIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgpAQCAtMjEsNiArMjMsNyBAQAogCiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0F1ZGlvLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BdWRpb1BsYXllci5oPgpAQCAtMTM5LDYgKzE0MiwxMiBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQUxPR1YoIk1pbWUgdHlwZSBcIiVzXCIgbWFwcGVkIHRvIGF1ZGlvX2Zvcm1hdCAweCV4IiwgbWltZSwgYXVkaW9Gb3JtYXQpOwogICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBhYWNhb3QgPSAtMTsKKyAgICAgICAgaWYgKChhdWRpb0Zvcm1hdCA9PSBBVURJT19GT1JNQVRfQUFDKSAmJiBmb3JtYXQtPmZpbmRJbnQzMihrS2V5QUFDQU9ULCAmYWFjYW90KSkgeworICAgICAgICAgICAgLy8gUmVkZWZpbmUgQUFDIGZvcm1hdCBjb3Jyb3Nwb25kaW5nIHRvIGFhYyBwcm9maWxlCisgICAgICAgICAgICBtYXBBQUNQcm9maWxlVG9BdWRpb0Zvcm1hdChhdWRpb0Zvcm1hdCwoT01YX0FVRElPX0FBQ1BST0ZJTEVUWVBFKSBhYWNhb3QpOworICAgICAgICB9CiAgICAgfQogCiAgICAgaW50IGF2Z0JpdFJhdGUgPSAtMTsKQEAgLTIyMSw3ICsyMzAsOCBAQAogCiAgICAgICAgIG1BdWRpb1RyYWNrID0gbmV3IEF1ZGlvVHJhY2soCiAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX01VU0lDLCBtU2FtcGxlUmF0ZSwgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsIGF1ZGlvTWFzaywKLSAgICAgICAgICAgICAgICAwLCBBVURJT19PVVRQVVRfRkxBR19OT05FLCAmQXVkaW9DYWxsYmFjaywgdGhpcywgMCk7CisgICAgICAgICAgICAgICAgMCAvKmZyYW1lQ291bnQqLywgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgJkF1ZGlvQ2FsbGJhY2ssIHRoaXMsCisgICAgICAgICAgICAgICAgMCAvKm5vdGlmaWNhdGlvbkZyYW1lcyovKTsKIAogICAgICAgICBpZiAoKGVyciA9IG1BdWRpb1RyYWNrLT5pbml0Q2hlY2soKSkgIT0gT0spIHsKICAgICAgICAgICAgIG1BdWRpb1RyYWNrLmNsZWFyKCk7CkBAIC00MTAsNyArNDIwLDcgQEAKIAogLy8gc3RhdGljCiBzaXplX3QgQXVkaW9QbGF5ZXI6OkF1ZGlvU2lua0NhbGxiYWNrKAotICAgICAgICBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luayAqYXVkaW9TaW5rLAorICAgICAgICBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luayAqIC8qIGF1ZGlvU2luayAqLywKICAgICAgICAgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwgdm9pZCAqY29va2llLAogICAgICAgICBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luazo6Y2JfZXZlbnRfdCBldmVudCkgewogICAgIEF1ZGlvUGxheWVyICptZSA9IChBdWRpb1BsYXllciAqKWNvb2tpZTsKQEAgLTU2NSwxMiArNTc1LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lVG9Db21wbGV0aW9uVXMgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTAwMDAwMGxsICogbnVtRnJhbWVzUGVuZGluZ1BsYXlvdXQpIC8gbVNhbXBsZVJhdGU7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigidG90YWwgbnVtYmVyIG9mIGZyYW1lcyBwbGF5ZWQ6ICVsbGQgKCVsbGQgdXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigidG90YWwgbnVtYmVyIG9mIGZyYW1lcyBwbGF5ZWQ6ICUiIFBSSWQ2NCAiICglbGxkIHVzKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobU51bUZyYW1lc1BsYXllZCArIG51bUFkZGl0aW9uYWxGcmFtZXMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMGxsICogKG1OdW1GcmFtZXNQbGF5ZWQgKyBudW1BZGRpdGlvbmFsRnJhbWVzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gbVNhbXBsZVJhdGUpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVkIGZyYW1lcyBsZWZ0IHRvIHBsYXksICVsbGQgdXMgKCUuMmYgc2VjcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlZCBmcmFtZXMgbGVmdCB0byBwbGF5LCAlIiBQUklkNjQgIiB1cyAoJS4yZiBzZWNzKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXNQZW5kaW5nUGxheW91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVUb0NvbXBsZXRpb25VcywgdGltZVRvQ29tcGxldGlvblVzIC8gMUU2KTsKIApAQCAtNjI3LDcgKzYzNyw3IEBACiAgICAgICAgICAgICAgICAgbVBvc2l0aW9uVGltZVJlYWxVcyA9CiAgICAgICAgICAgICAgICAgICAgICgobU51bUZyYW1lc1BsYXllZCArIHNpemVfZG9uZSAvIG1GcmFtZVNpemUpICogMTAwMDAwMCkKICAgICAgICAgICAgICAgICAgICAgICAgIC8gbVNhbXBsZVJhdGU7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImJ1ZmZlci0+c2l6ZSgpID0gJWQsICIKKyAgICAgICAgICAgICAgICBBTE9HVigiYnVmZmVyLT5zaXplKCkgPSAlenUsICIKICAgICAgICAgICAgICAgICAgICAgICJtUG9zaXRpb25UaW1lTWVkaWFVcz0lLjJmIG1Qb3NpdGlvblRpbWVSZWFsVXM9JS4yZiIsCiAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpLAogICAgICAgICAgICAgICAgICAgICAgbVBvc2l0aW9uVGltZU1lZGlhVXMgLyAxRTYsIG1Qb3NpdGlvblRpbWVSZWFsVXMgLyAxRTYpOwpAQCAtNzQ1LDcgKzc1NSw3IEBACiAKICAgICAvLyBIQUwgcG9zaXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIGZpcnN0IGJ1ZmZlciB3ZSBzZW50IGF0IG1TdGFydFBvc1VzCiAgICAgY29uc3QgaW50NjRfdCByZW5kZXJlZER1cmF0aW9uID0gbVN0YXJ0UG9zVXMgKyBwbGF5ZWRVczsKLSAgICBBTE9HVigiZ2V0T3V0cHV0UGxheVBvc2l0aW9uVXNfbCAlbGxkIiwgcmVuZGVyZWREdXJhdGlvbik7CisgICAgQUxPR1YoImdldE91dHB1dFBsYXlQb3NpdGlvblVzX2wgJSIgUFJJZDY0LCByZW5kZXJlZER1cmF0aW9uKTsKICAgICByZXR1cm4gcmVuZGVyZWREdXJhdGlvbjsKIH0KIApAQCAtNzU2LDggKzc2NiwxMyBAQAogICAgICAgICBpZiAobVNlZWtpbmcpIHsKICAgICAgICAgICAgIHJldHVybiBtU2Vla1RpbWVVczsKICAgICAgICAgfQorICAgICAgICBpZiAobVJlYWNoZWRFT1MpIHsKKyAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKKyAgICAgICAgICAgIG1Tb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb25Vcyk7CisgICAgICAgICAgICByZXR1cm4gZHVyYXRpb25VczsKKyAgICAgICAgfQogICAgICAgICBtUG9zaXRpb25UaW1lUmVhbFVzID0gZ2V0T3V0cHV0UGxheVBvc2l0aW9uVXNfbCgpOwotICAgICAgICBBTE9HVigiZ2V0TWVkaWFUaW1lVXMgZ2V0T3V0cHV0UGxheVBvc2l0aW9uVXNfbCgpIG1Qb3NpdGlvblRpbWVSZWFsVXMgJWxsZCIsCisgICAgICAgIEFMT0dWKCJnZXRNZWRpYVRpbWVVcyBnZXRPdXRwdXRQbGF5UG9zaXRpb25Vc19sKCkgbVBvc2l0aW9uVGltZVJlYWxVcyAlIiBQUklkNjQsCiAgICAgICAgICAgICAgIG1Qb3NpdGlvblRpbWVSZWFsVXMpOwogICAgICAgICByZXR1cm4gbVBvc2l0aW9uVGltZVJlYWxVczsKICAgICB9CkBAIC03OTUsNyArODEwLDcgQEAKIHN0YXR1c190IEF1ZGlvUGxheWVyOjpzZWVrVG8oaW50NjRfdCB0aW1lX3VzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAotICAgIEFMT0dWKCJzZWVrVG8oICVsbGQgKSIsIHRpbWVfdXMpOworICAgIEFMT0dWKCJzZWVrVG8oICUiIFBSSWQ2NCAiICkiLCB0aW1lX3VzKTsKIAogICAgIG1TZWVraW5nID0gdHJ1ZTsKICAgICBtUG9zaXRpb25UaW1lUmVhbFVzID0gbVBvc2l0aW9uVGltZU1lZGlhVXMgPSAtMTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmNwcAppbmRleCAxNzI5M2M4Li44MDVmMTJlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuY3BwCkBAIC0xNCw2ICsxNCw5IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKwogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJBdWRpb1NvdXJjZSIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KQEAgLTI2LDcgKzI5LDYgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNjksMTAgKzcxLDEwIEBACiAgICAgaWYgKHN0YXR1cyA9PSBPSykgewogICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgQXVkaW9SZWNvcmQgY2FsbGJhY2sgbmV2ZXIgcmV0dXJucyBtb3JlIHRoYW4gdGhlIG1heGltdW0KICAgICAgICAgLy8gYnVmZmVyIHNpemUKLSAgICAgICAgaW50IGZyYW1lQ291bnQgPSBrTWF4QnVmZmVyU2l6ZSAvIHNpemVvZihpbnQxNl90KSAvIGNoYW5uZWxDb3VudDsKKyAgICAgICAgdWludDMyX3QgZnJhbWVDb3VudCA9IGtNYXhCdWZmZXJTaXplIC8gc2l6ZW9mKGludDE2X3QpIC8gY2hhbm5lbENvdW50OwogCiAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRoZSBBdWRpb1JlY29yZCB0b3RhbCBidWZmZXIgc2l6ZSBpcyBsYXJnZSBlbm91Z2gKLSAgICAgICAgaW50IGJ1ZkNvdW50ID0gMjsKKyAgICAgICAgc2l6ZV90IGJ1ZkNvdW50ID0gMjsKICAgICAgICAgd2hpbGUgKChidWZDb3VudCAqIGZyYW1lQ291bnQpIDwgbWluRnJhbWVDb3VudCkgewogICAgICAgICAgICAgYnVmQ291bnQrKzsKICAgICAgICAgfQpAQCAtODAsMTAgKzgyLDEwIEBACiAgICAgICAgIG1SZWNvcmQgPSBuZXcgQXVkaW9SZWNvcmQoCiAgICAgICAgICAgICAgICAgICAgIGlucHV0U291cmNlLCBzYW1wbGVSYXRlLCBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9pbl9tYXNrX2Zyb21fY291bnQoY2hhbm5lbENvdW50KSwKLSAgICAgICAgICAgICAgICAgICAgYnVmQ291bnQgKiBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KSAoYnVmQ291bnQgKiBmcmFtZUNvdW50KSwKICAgICAgICAgICAgICAgICAgICAgQXVkaW9SZWNvcmRDYWxsYmFja0Z1bmN0aW9uLAogICAgICAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCAvKm5vdGlmaWNhdGlvbkZyYW1lcyovKTsKICAgICAgICAgbUluaXRDaGVjayA9IG1SZWNvcmQtPmluaXRDaGVjaygpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1Jbml0Q2hlY2sgPSBzdGF0dXM7CkBAIC0xNDAsNyArMTQyLDcgQEAKIH0KIAogdm9pZCBBdWRpb1NvdXJjZTo6d2FpdE91dHN0YW5kaW5nRW5jb2RpbmdGcmFtZXNfbCgpIHsKLSAgICBBTE9HVigid2FpdE91dHN0YW5kaW5nRW5jb2RpbmdGcmFtZXNfbDogJWxsZCIsIG1OdW1DbGllbnRPd25lZEJ1ZmZlcnMpOworICAgIEFMT0dWKCJ3YWl0T3V0c3RhbmRpbmdFbmNvZGluZ0ZyYW1lc19sOiAlIiBQUklkNjQsIG1OdW1DbGllbnRPd25lZEJ1ZmZlcnMpOwogICAgIHdoaWxlIChtTnVtQ2xpZW50T3duZWRCdWZmZXJzID4gMCkgewogICAgICAgICBtRnJhbWVFbmNvZGluZ0NvbXBsZXRpb25Db25kaXRpb24ud2FpdChtTG9jayk7CiAgICAgfQpAQCAtMTU3LDYgKzE1OSw4IEBACiAgICAgfQogCiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICBtRnJhbWVBdmFpbGFibGVDb25kaXRpb24uc2lnbmFsKCk7CisKICAgICBtUmVjb3JkLT5zdG9wKCk7CiAgICAgd2FpdE91dHN0YW5kaW5nRW5jb2RpbmdGcmFtZXNfbCgpOwogICAgIHJlbGVhc2VRdWV1ZWRGcmFtZXNfbCgpOwpAQCAtMjEyLDcgKzIxNiw3IEBACiB9CiAKIHN0YXR1c190IEF1ZGlvU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICAgICAgTWVkaWFCdWZmZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICogLyogb3B0aW9ucyAqLykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgKm91dCA9IE5VTEw7CiAKQEAgLTI3Myw3ICsyNzcsNyBAQAogc3RhdHVzX3QgQXVkaW9Tb3VyY2U6OmRhdGFDYWxsYmFjayhjb25zdCBBdWRpb1JlY29yZDo6QnVmZmVyJiBhdWRpb0J1ZmZlcikgewogICAgIGludDY0X3QgdGltZVVzID0gc3lzdGVtVGltZSgpIC8gMTAwMGxsOwogCi0gICAgQUxPR1YoImRhdGFDYWxsYmFja1RpbWVzdGFtcDogJWxsZCB1cyIsIHRpbWVVcyk7CisgICAgQUxPR1YoImRhdGFDYWxsYmFja1RpbWVzdGFtcDogJSIgUFJJZDY0ICIgdXMiLCB0aW1lVXMpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgaWYgKCFtU3RhcnRlZCkgewogICAgICAgICBBTE9HVygiU3B1cmlvdXMgY2FsbGJhY2sgZnJvbSBBdWRpb1JlY29yZC4gRHJvcCB0aGUgYXVkaW8gZGF0YS4iKTsKQEAgLTI4Miw4ICsyODYsOCBAQAogCiAgICAgLy8gRHJvcCByZXRyaWV2ZWQgYW5kIHByZXZpb3VzbHkgbG9zdCBhdWRpbyBkYXRhLgogICAgIGlmIChtTnVtRnJhbWVzUmVjZWl2ZWQgPT0gMCAmJiB0aW1lVXMgPCBtU3RhcnRUaW1lVXMpIHsKLSAgICAgICAgbVJlY29yZC0+Z2V0SW5wdXRGcmFtZXNMb3N0KCk7Ci0gICAgICAgIEFMT0dWKCJEcm9wIGF1ZGlvIGRhdGEgYXQgJWxsZC8lbGxkIHVzIiwgdGltZVVzLCBtU3RhcnRUaW1lVXMpOworICAgICAgICAodm9pZCkgbVJlY29yZC0+Z2V0SW5wdXRGcmFtZXNMb3N0KCk7CisgICAgICAgIEFMT0dWKCJEcm9wIGF1ZGlvIGRhdGEgYXQgJSIgUFJJZDY0ICIvJSIgUFJJZDY0ICIgdXMiLCB0aW1lVXMsIG1TdGFydFRpbWVVcyk7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKQEAgLTMxMiw3ICszMTYsNyBAQAogICAgIGlmIChudW1Mb3N0Qnl0ZXMgPiAwKSB7CiAgICAgICAgIC8vIExvc3Mgb2YgYXVkaW8gZnJhbWVzIHNob3VsZCBoYXBwZW4gcmFyZWx5OyB0aHVzIHRoZSBMT0dXIHNob3VsZAogICAgICAgICAvLyBub3QgY2F1c2UgYSBsb2dnaW5nIHNwYW0KLSAgICAgICAgQUxPR1coIkxvc3QgYXVkaW8gcmVjb3JkIGRhdGE6ICVkIGJ5dGVzIiwgbnVtTG9zdEJ5dGVzKTsKKyAgICAgICAgQUxPR1coIkxvc3QgYXVkaW8gcmVjb3JkIGRhdGE6ICV6dSBieXRlcyIsIG51bUxvc3RCeXRlcyk7CiAgICAgfQogCiAgICAgd2hpbGUgKG51bUxvc3RCeXRlcyA+IDApIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F3ZXNvbWVQbGF5ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAKaW5kZXggMTMzY2FlMy4uNDkzZTU5OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAKQEAgLTE5LDYgKzE5LDkgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiQXdlc29tZVBsYXllciIKICNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX1ZJREVPCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KIApAQCAtMzQsMTYgKzM3LDIwIEBACiAKICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHREcml2ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BdWRpb1BsYXllci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0Nsb2NrRXN0aW1hdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmg+CkBAIC04Miw3ICs4OSw3IEBACiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QXdlc29tZUV2ZW50KCkge30KIAotICAgIHZpcnR1YWwgdm9pZCBmaXJlKFRpbWVkRXZlbnRRdWV1ZSAqcXVldWUsIGludDY0X3QgLyogbm93X3VzICovKSB7CisgICAgdmlydHVhbCB2b2lkIGZpcmUoVGltZWRFdmVudFF1ZXVlICogLyogcXVldWUgKi8sIGludDY0X3QgLyogbm93X3VzICovKSB7CiAgICAgICAgIChtUGxheWVyLT4qbU1ldGhvZCkoKTsKICAgICB9CiAKQEAgLTk2LDE3ICsxMDMsMjEgQEAKIAogc3RydWN0IEF3ZXNvbWVMb2NhbFJlbmRlcmVyIDogcHVibGljIEF3ZXNvbWVSZW5kZXJlciB7CiAgICAgQXdlc29tZUxvY2FsUmVuZGVyZXIoCi0gICAgICAgICAgICBjb25zdCBzcDxBTmF0aXZlV2luZG93PiAmbmF0aXZlV2luZG93LCBjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEpCi0gICAgICAgIDogbVRhcmdldChuZXcgU29mdHdhcmVSZW5kZXJlcihuYXRpdmVXaW5kb3csIG1ldGEpKSB7CisgICAgICAgICAgICBjb25zdCBzcDxBTmF0aXZlV2luZG93PiAmbmF0aXZlV2luZG93LCBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkKKyAgICAgICAgOiBtRm9ybWF0KGZvcm1hdCksCisgICAgICAgICAgbVRhcmdldChuZXcgU29mdHdhcmVSZW5kZXJlcihuYXRpdmVXaW5kb3cpKSB7CiAgICAgfQogCiAgICAgdmlydHVhbCB2b2lkIHJlbmRlcihNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7CisgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICBDSEVDSyhidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKKwogICAgICAgICByZW5kZXIoKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCi0gICAgICAgICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKKyAgICAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCksIHRpbWVVcyAqIDEwMDApOwogICAgIH0KIAotICAgIHZvaWQgcmVuZGVyKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgICAgIG1UYXJnZXQtPnJlbmRlcihkYXRhLCBzaXplLCBOVUxMKTsKKyAgICB2b2lkIHJlbmRlcihjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgaW50NjRfdCB0aW1lc3RhbXBOcykgeworICAgICAgICBtVGFyZ2V0LT5yZW5kZXIoZGF0YSwgc2l6ZSwgdGltZXN0YW1wTnMsIE5VTEwsIG1Gb3JtYXQpOwogICAgIH0KIAogcHJvdGVjdGVkOgpAQCAtMTE2LDYgKzEyNyw3IEBACiAgICAgfQogCiBwcml2YXRlOgorICAgIHNwPEFNZXNzYWdlPiBtRm9ybWF0OwogICAgIFNvZnR3YXJlUmVuZGVyZXIgKm1UYXJnZXQ7CiAKICAgICBBd2Vzb21lTG9jYWxSZW5kZXJlcihjb25zdCBBd2Vzb21lTG9jYWxSZW5kZXJlciAmKTsKQEAgLTIyNyw2ICsyMzksOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkF3ZXNvbWVQbGF5ZXI6Om9uQXVkaW9UZWFyRG93bkV2ZW50KTsKICAgICBtQXVkaW9UZWFyRG93bkV2ZW50UGVuZGluZyA9IGZhbHNlOwogCisgICAgbUNsb2NrRXN0aW1hdG9yID0gbmV3IFdpbmRvd2VkTGluZWFyRml0RXN0aW1hdG9yKCk7CisKICAgICByZXNldCgpOwogfQogCkBAIC0yNzYsMTUgKzI5MCwyMCBAQAogfQogCiBzdGF0dXNfdCBBd2Vzb21lUGxheWVyOjpzZXREYXRhU291cmNlKAotICAgICAgICBjb25zdCBjaGFyICp1cmksIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIHJldHVybiBzZXREYXRhU291cmNlX2wodXJpLCBoZWFkZXJzKTsKKyAgICByZXR1cm4gc2V0RGF0YVNvdXJjZV9sKGh0dHBTZXJ2aWNlLCB1cmksIGhlYWRlcnMpOwogfQogCiBzdGF0dXNfdCBBd2Vzb21lUGxheWVyOjpzZXREYXRhU291cmNlX2woCi0gICAgICAgIGNvbnN0IGNoYXIgKnVyaSwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgewogICAgIHJlc2V0X2woKTsKIAorICAgIG1IVFRQU2VydmljZSA9IGh0dHBTZXJ2aWNlOwogICAgIG1VcmkgPSB1cmk7CiAKICAgICBpZiAoaGVhZGVycykgewpAQCAtMzAxLDcgKzMyMCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBBTE9HSSgic2V0RGF0YVNvdXJjZV9sKFVSTCBzdXBwcmVzc2VkKSIpOworICAgIEFMT0dJKCJzZXREYXRhU291cmNlX2woJXMpIiwgdXJpRGVidWdTdHJpbmcobVVyaSwgbUZsYWdzICYgSU5DT0dOSVRPKS5jX3N0cigpKTsKIAogICAgIC8vIFRoZSBhY3R1YWwgd29yayB3aWxsIGJlIGRvbmUgZHVyaW5nIHByZXBhcmF0aW9uIGluIHRoZSBjYWxsIHRvCiAgICAgLy8gOjpmaW5pc2hTZXREYXRhU291cmNlX2wgdG8gYXZvaWQgYmxvY2tpbmcgdGhlIGNhbGxpbmcgdGhyZWFkIGluCkBAIC0zOTMsNiArNDEyLDEzIEBACiAKICAgICAgICAgdG90YWxCaXRSYXRlICs9IGJpdHJhdGU7CiAgICAgfQorICAgIHNwPE1ldGFEYXRhPiBmaWxlTWV0YSA9IG1FeHRyYWN0b3ItPmdldE1ldGFEYXRhKCk7CisgICAgaWYgKGZpbGVNZXRhICE9IE5VTEwpIHsKKyAgICAgICAgaW50NjRfdCBkdXJhdGlvbjsKKyAgICAgICAgaWYgKGZpbGVNZXRhLT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb24pKSB7CisgICAgICAgICAgICBtRHVyYXRpb25VcyA9IGR1cmF0aW9uOworICAgICAgICB9CisgICAgfQogCiAgICAgbUJpdHJhdGUgPSB0b3RhbEJpdFJhdGU7CiAKQEAgLTU4MSw2ICs2MDcsNyBAQAogICAgIG1TZWVrTm90aWZpY2F0aW9uU2VudCA9IHRydWU7CiAgICAgbVNlZWtUaW1lVXMgPSAwOwogCisgICAgbUhUVFBTZXJ2aWNlLmNsZWFyKCk7CiAgICAgbVVyaS5zZXRUbygiIik7CiAgICAgbVVyaUhlYWRlcnMuY2xlYXIoKTsKIApAQCAtNzA4LDExICs3MzUsOSBAQAogICAgICAgICAgICAgICAgIGZpbmlzaEFzeW5jUHJlcGFyZV9sKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQ2NF90IGJpdHJhdGU7Ci0gICAgICAgICAgICBpZiAoZ2V0Qml0cmF0ZSgmYml0cmF0ZSkpIHsKLSAgICAgICAgICAgICAgICBzaXplX3QgY2FjaGVkU2l6ZSA9IG1DYWNoZWRTb3VyY2UtPmNhY2hlZFNpemUoKTsKLSAgICAgICAgICAgICAgICBpbnQ2NF90IGNhY2hlZER1cmF0aW9uVXMgPSBjYWNoZWRTaXplICogODAwMDAwMGxsIC8gYml0cmF0ZTsKLQorICAgICAgICAgICAgYm9vbCBlb3MyOworICAgICAgICAgICAgaW50NjRfdCBjYWNoZWREdXJhdGlvblVzOworICAgICAgICAgICAgaWYgKGdldENhY2hlZER1cmF0aW9uX2woJmNhY2hlZER1cmF0aW9uVXMsICZlb3MyKSAmJiBtRHVyYXRpb25VcyA+IDApIHsKICAgICAgICAgICAgICAgICBpbnQgcGVyY2VudGFnZSA9IDEwMC4wICogKGRvdWJsZSljYWNoZWREdXJhdGlvblVzIC8gbUR1cmF0aW9uVXM7CiAgICAgICAgICAgICAgICAgaWYgKHBlcmNlbnRhZ2UgPiAxMDApIHsKICAgICAgICAgICAgICAgICAgICAgcGVyY2VudGFnZSA9IDEwMDsKQEAgLTcyMCwxMiArNzQ1LDEyIEBACiAKICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX0JVRkZFUklOR19VUERBVEUsIHBlcmNlbnRhZ2UpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCBrbm93IHRoZSBiaXRyYXRlIG9mIHRoZSBzdHJlYW0sIHVzZSBhYnNvbHV0ZSBzaXplCisgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3Qga25vdyB0aGUgYml0cmF0ZS9kdXJhdGlvbiBvZiB0aGUgc3RyZWFtLCB1c2UgYWJzb2x1dGUgc2l6ZQogICAgICAgICAgICAgICAgIC8vIGxpbWl0cyB0byBtYWludGFpbiB0aGUgY2FjaGUuCiAKICAgICAgICAgICAgICAgICBpZiAoKG1GbGFncyAmIFBMQVlJTkcpICYmICFlb3MKICAgICAgICAgICAgICAgICAgICAgICAgICYmIChjYWNoZWREYXRhUmVtYWluaW5nIDwga0xvd1dhdGVyTWFya0J5dGVzKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HSSgiY2FjaGUgaXMgcnVubmluZyBsb3cgKDwgJWQpICwgcGF1c2luZy4iLAorICAgICAgICAgICAgICAgICAgICBBTE9HSSgiY2FjaGUgaXMgcnVubmluZyBsb3cgKDwgJXp1KSAsIHBhdXNpbmcuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBrTG93V2F0ZXJNYXJrQnl0ZXMpOwogICAgICAgICAgICAgICAgICAgICBtb2RpZnlGbGFncyhDQUNIRV9VTkRFUlJVTiwgU0VUKTsKICAgICAgICAgICAgICAgICAgICAgcGF1c2VfbCgpOwpAQCAtNzM0LDEyICs3NTksMTIgQEAKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9JTkZPLCBNRURJQV9JTkZPX0JVRkZFUklOR19TVEFSVCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlb3MgfHwgY2FjaGVkRGF0YVJlbWFpbmluZyA+IGtIaWdoV2F0ZXJNYXJrQnl0ZXMpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1GbGFncyAmIENBQ0hFX1VOREVSUlVOKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HSSgiY2FjaGUgaGFzIGZpbGxlZCB1cCAoPiAlZCksIHJlc3VtaW5nLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HSSgiY2FjaGUgaGFzIGZpbGxlZCB1cCAoPiAlenUpLCByZXN1bWluZy4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrSGlnaFdhdGVyTWFya0J5dGVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmeUZsYWdzKENBQ0hFX1VOREVSUlVOLCBDTEVBUik7CiAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5X2woKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtRmxhZ3MgJiBQUkVQQVJJTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjYWNoZSBoYXMgZmlsbGVkIHVwICg+ICVkKSwgcHJlcGFyZSBpcyBkb25lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjYWNoZSBoYXMgZmlsbGVkIHVwICg+ICV6dSksIHByZXBhcmUgaXMgZG9uZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtIaWdoV2F0ZXJNYXJrQnl0ZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoQXN5bmNQcmVwYXJlX2woKTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTIxMyw3ICsxMjM4LDkgQEAKICAgICAgICAgLy8gYWxsb2NhdGUgdGhlaXIgYnVmZmVycyBpbiBsb2NhbCBhZGRyZXNzIHNwYWNlLiAgVGhpcyByZW5kZXJlcgogICAgICAgICAvLyB0aGVuIHBlcmZvcm1zIGEgY29sb3IgY29udmVyc2lvbiBhbmQgY29weSB0byBnZXQgdGhlIGRhdGEKICAgICAgICAgLy8gaW50byB0aGUgQU5hdGl2ZUJ1ZmZlci4KLSAgICAgICAgbVZpZGVvUmVuZGVyZXIgPSBuZXcgQXdlc29tZUxvY2FsUmVuZGVyZXIobU5hdGl2ZVdpbmRvdywgbWV0YSk7CisgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CisgICAgICAgIGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZShtZXRhLCAmZm9ybWF0KTsKKyAgICAgICAgbVZpZGVvUmVuZGVyZXIgPSBuZXcgQXdlc29tZUxvY2FsUmVuZGVyZXIobU5hdGl2ZVdpbmRvdywgZm9ybWF0KTsKICAgICB9CiB9CiAKQEAgLTE0ODIsNyArMTUwOSw3IEBACiAgICAgQ0hFQ0soc291cmNlICE9IE5VTEwpOwogCiAgICAgaWYgKG1UZXh0RHJpdmVyID09IE5VTEwpIHsKLSAgICAgICAgbVRleHREcml2ZXIgPSBuZXcgVGltZWRUZXh0RHJpdmVyKG1MaXN0ZW5lcik7CisgICAgICAgIG1UZXh0RHJpdmVyID0gbmV3IFRpbWVkVGV4dERyaXZlcihtTGlzdGVuZXIsIG1IVFRQU2VydmljZSk7CiAgICAgfQogCiAgICAgbVRleHREcml2ZXItPmFkZEluQmFuZFRleHRTb3VyY2UodHJhY2tJbmRleCwgc291cmNlKTsKQEAgLTE2OTQsNyArMTcyMSw3IEBACiAgICAgfQogCiAgICAgaWYgKG1BdWRpb1BsYXllciAhPSBOVUxMKSB7Ci0gICAgICAgIEFMT0dWKCJzZWVraW5nIGF1ZGlvIHRvICVsbGQgdXMgKCUuMmYgc2VjcykuIiwgdmlkZW9UaW1lVXMsIHZpZGVvVGltZVVzIC8gMUU2KTsKKyAgICAgICAgQUxPR1YoInNlZWtpbmcgYXVkaW8gdG8gJSIgUFJJZDY0ICIgdXMgKCUuMmYgc2VjcykuIiwgdmlkZW9UaW1lVXMsIHZpZGVvVGltZVVzIC8gMUU2KTsKIAogICAgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgdmlkZW8gdGltZSwgc2VlayBhdWRpbyB0byB0aGUgb3JpZ2luYWxseQogICAgICAgICAvLyByZXF1ZXN0ZWQgc2VlayB0aW1lIGluc3RlYWQuCkBAIC0xNzU4LDcgKzE3ODUsNyBAQAogICAgIGlmICghbVZpZGVvQnVmZmVyKSB7CiAgICAgICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyBvcHRpb25zOwogICAgICAgICBpZiAobVNlZWtpbmcgIT0gTk9fU0VFSykgewotICAgICAgICAgICAgQUxPR1YoInNlZWtpbmcgdG8gJWxsZCB1cyAoJS4yZiBzZWNzKSIsIG1TZWVrVGltZVVzLCBtU2Vla1RpbWVVcyAvIDFFNik7CisgICAgICAgICAgICBBTE9HVigic2Vla2luZyB0byAlIiBQUklkNjQgIiB1cyAoJS4yZiBzZWNzKSIsIG1TZWVrVGltZVVzLCBtU2Vla1RpbWVVcyAvIDFFNik7CiAKICAgICAgICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKAogICAgICAgICAgICAgICAgICAgICBtU2Vla1RpbWVVcywKQEAgLTE4MjgsNyArMTg1NSw3IEBACiAKICAgICBpZiAobVNlZWtpbmcgPT0gU0VFS19WSURFT19PTkxZKSB7CiAgICAgICAgIGlmIChtU2Vla1RpbWVVcyA+IHRpbWVVcykgewotICAgICAgICAgICAgQUxPR0koIlhYWCBtU2Vla1RpbWVVcyA9ICVsbGQgdXMsIHRpbWVVcyA9ICVsbGQgdXMiLAorICAgICAgICAgICAgQUxPR0koIlhYWCBtU2Vla1RpbWVVcyA9ICUiIFBSSWQ2NCAiIHVzLCB0aW1lVXMgPSAlIiBQUklkNjQgIiB1cyIsCiAgICAgICAgICAgICAgICAgIG1TZWVrVGltZVVzLCB0aW1lVXMpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTg1OCwyMSArMTg4NSwyOCBAQAogICAgIFRpbWVTb3VyY2UgKnRzID0KICAgICAgICAgKChtRmxhZ3MgJiBBVURJT19BVF9FT1MpIHx8ICEobUZsYWdzICYgQVVESU9QTEFZRVJfU1RBUlRFRCkpCiAgICAgICAgICAgICA/ICZtU3lzdGVtVGltZVNvdXJjZSA6IG1UaW1lU291cmNlOworICAgIGludDY0X3Qgc3lzdGVtVGltZVVzID0gbVN5c3RlbVRpbWVTb3VyY2UuZ2V0UmVhbFRpbWVVcygpOworICAgIGludDY0X3QgbG9vcGVyVGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKIAogICAgIGlmIChtRmxhZ3MgJiBGSVJTVF9GUkFNRSkgewogICAgICAgICBtb2RpZnlGbGFncyhGSVJTVF9GUkFNRSwgQ0xFQVIpOwogICAgICAgICBtU2luY2VMYXN0RHJvcHBlZCA9IDA7Ci0gICAgICAgIG1UaW1lU291cmNlRGVsdGFVcyA9IHRzLT5nZXRSZWFsVGltZVVzKCkgLSB0aW1lVXM7CisgICAgICAgIG1DbG9ja0VzdGltYXRvci0+cmVzZXQoKTsKKyAgICAgICAgbVRpbWVTb3VyY2VEZWx0YVVzID0gZXN0aW1hdGVSZWFsVGltZVVzKHRzLCBzeXN0ZW1UaW1lVXMpIC0gdGltZVVzOwogICAgIH0KIAogICAgIGludDY0X3QgcmVhbFRpbWVVcywgbWVkaWFUaW1lVXM7CiAgICAgaWYgKCEobUZsYWdzICYgQVVESU9fQVRfRU9TKSAmJiBtQXVkaW9QbGF5ZXIgIT0gTlVMTAogICAgICAgICAmJiBtQXVkaW9QbGF5ZXItPmdldE1lZGlhVGltZU1hcHBpbmcoJnJlYWxUaW1lVXMsICZtZWRpYVRpbWVVcykpIHsKKyAgICAgICAgQUxPR1YoInVwZGF0aW5nIFRTZGVsdGEgKCUiIFBSSWQ2NCAiID0+ICUiIFBSSWQ2NCAiIGNoYW5nZSAlIiBQUklkNjQgIikiLAorICAgICAgICAgICAgICBtVGltZVNvdXJjZURlbHRhVXMsIHJlYWxUaW1lVXMgLSBtZWRpYVRpbWVVcywKKyAgICAgICAgICAgICAgbVRpbWVTb3VyY2VEZWx0YVVzIC0gKHJlYWxUaW1lVXMgLSBtZWRpYVRpbWVVcykpOworICAgICAgICBBVFJBQ0VfSU5UKCJUUyBkZWx0YSBjaGFuZ2UgKG1zKSIsIChtVGltZVNvdXJjZURlbHRhVXMgLSAocmVhbFRpbWVVcyAtIG1lZGlhVGltZVVzKSkgLyAxRTMpOwogICAgICAgICBtVGltZVNvdXJjZURlbHRhVXMgPSByZWFsVGltZVVzIC0gbWVkaWFUaW1lVXM7CiAgICAgfQogCiAgICAgaWYgKHdhc1NlZWtpbmcgPT0gU0VFS19WSURFT19PTkxZKSB7Ci0gICAgICAgIGludDY0X3Qgbm93VXMgPSB0cy0+Z2V0UmVhbFRpbWVVcygpIC0gbVRpbWVTb3VyY2VEZWx0YVVzOworICAgICAgICBpbnQ2NF90IG5vd1VzID0gZXN0aW1hdGVSZWFsVGltZVVzKHRzLCBzeXN0ZW1UaW1lVXMpIC0gbVRpbWVTb3VyY2VEZWx0YVVzOwogCiAgICAgICAgIGludDY0X3QgbGF0ZW5lc3NVcyA9IG5vd1VzIC0gdGltZVVzOwogCkBAIC0xODgzLDEyICsxOTE3LDEzIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpbnQ2NF90IGxhdGVuZXNzVXMgPSAwOwogICAgIGlmICh3YXNTZWVraW5nID09IE5PX1NFRUspIHsKICAgICAgICAgLy8gTGV0J3MgZGlzcGxheSB0aGUgZmlyc3QgZnJhbWUgYWZ0ZXIgc2Vla2luZyByaWdodCBhd2F5LgogCi0gICAgICAgIGludDY0X3Qgbm93VXMgPSB0cy0+Z2V0UmVhbFRpbWVVcygpIC0gbVRpbWVTb3VyY2VEZWx0YVVzOworICAgICAgICBpbnQ2NF90IG5vd1VzID0gZXN0aW1hdGVSZWFsVGltZVVzKHRzLCBzeXN0ZW1UaW1lVXMpIC0gbVRpbWVTb3VyY2VEZWx0YVVzOwogCi0gICAgICAgIGludDY0X3QgbGF0ZW5lc3NVcyA9IG5vd1VzIC0gdGltZVVzOworICAgICAgICBsYXRlbmVzc1VzID0gbm93VXMgLSB0aW1lVXM7CiAKICAgICAgICAgQVRSQUNFX0lOVCgiVmlkZW8gTGF0ZW5lc3MgKG1zKSIsIGxhdGVuZXNzVXMgLyAxRTMpOwogCkBAIC0xOTE4LDEzICsxOTUzLDEzIEBACiAKICAgICAgICAgaWYgKGxhdGVuZXNzVXMgPiA0MDAwMCkgewogICAgICAgICAgICAgLy8gV2UncmUgbW9yZSB0aGFuIDQwbXMgbGF0ZS4KLSAgICAgICAgICAgIEFMT0dWKCJ3ZSdyZSBsYXRlIGJ5ICVsbGQgdXMgKCUuMmYgc2VjcykiLAorICAgICAgICAgICAgQUxPR1YoIndlJ3JlIGxhdGUgYnkgJSIgUFJJZDY0ICIgdXMgKCUuMmYgc2VjcykiLAogICAgICAgICAgICAgICAgICBsYXRlbmVzc1VzLCBsYXRlbmVzc1VzIC8gMUU2KTsKIAogICAgICAgICAgICAgaWYgKCEobUZsYWdzICYgU0xPV19ERUNPREVSX0hBQ0spCiAgICAgICAgICAgICAgICAgICAgIHx8IG1TaW5jZUxhc3REcm9wcGVkID4gRlJBTUVfRFJPUF9GUkVRKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFMT0dWKCJ3ZSdyZSBsYXRlIGJ5ICVsbGQgdXMgKCUuMmYgc2VjcykgZHJvcHBpbmcgIgorICAgICAgICAgICAgICAgIEFMT0dWKCJ3ZSdyZSBsYXRlIGJ5ICUiIFBSSWQ2NCAiIHVzICglLjJmIHNlY3MpIGRyb3BwaW5nICIKICAgICAgICAgICAgICAgICAgICAgICJvbmUgYWZ0ZXIgJWQgZnJhbWVzIiwKICAgICAgICAgICAgICAgICAgICAgIGxhdGVuZXNzVXMsIGxhdGVuZXNzVXMgLyAxRTYsIG1TaW5jZUxhc3REcm9wcGVkKTsKIApAQCAtMTk0Miw5ICsxOTc3LDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGlmIChsYXRlbmVzc1VzIDwgLTEwMDAwKSB7Ci0gICAgICAgICAgICAvLyBXZSdyZSBtb3JlIHRoYW4gMTBtcyBlYXJseS4KLSAgICAgICAgICAgIHBvc3RWaWRlb0V2ZW50X2woMTAwMDApOworICAgICAgICBpZiAobGF0ZW5lc3NVcyA8IC0zMDAwMCkgeworICAgICAgICAgICAgLy8gV2UncmUgbW9yZSB0aGFuIDMwbXMgZWFybHksIHNjaGVkdWxlIGF0IG1vc3QgMjAgbXMgYmVmb3JlIHRpbWUgZHVlCisgICAgICAgICAgICBwb3N0VmlkZW9FdmVudF9sKGxhdGVuZXNzVXMgPCAtNjAwMDAgPyAzMDAwMCA6IC1sYXRlbmVzc1VzIC0gMjAwMDApOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgfQpAQCAtMTk1OCw2ICsxOTkzLDggQEAKIAogICAgIGlmIChtVmlkZW9SZW5kZXJlciAhPSBOVUxMKSB7CiAgICAgICAgIG1TaW5jZUxhc3REcm9wcGVkKys7CisgICAgICAgIG1WaWRlb0J1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCBsb29wZXJUaW1lVXMgLSBsYXRlbmVzc1VzKTsKKwogICAgICAgICBtVmlkZW9SZW5kZXJlci0+cmVuZGVyKG1WaWRlb0J1ZmZlcik7CiAgICAgICAgIGlmICghbVZpZGVvUmVuZGVyaW5nU3RhcnRlZCkgewogICAgICAgICAgICAgbVZpZGVvUmVuZGVyaW5nU3RhcnRlZCA9IHRydWU7CkBAIC0yMDA3LDE0ICsyMDQ0LDI2IEBACiAKICAgICAgICAgaW50NjRfdCBuZXh0VGltZVVzOwogICAgICAgICBDSEVDSyhtVmlkZW9CdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZuZXh0VGltZVVzKSk7Ci0gICAgICAgIGludDY0X3QgZGVsYXlVcyA9IG5leHRUaW1lVXMgLSB0cy0+Z2V0UmVhbFRpbWVVcygpICsgbVRpbWVTb3VyY2VEZWx0YVVzOwotICAgICAgICBwb3N0VmlkZW9FdmVudF9sKGRlbGF5VXMgPiAxMDAwMCA/IDEwMDAwIDogZGVsYXlVcyA8IDAgPyAwIDogZGVsYXlVcyk7CisgICAgICAgIHN5c3RlbVRpbWVVcyA9IG1TeXN0ZW1UaW1lU291cmNlLmdldFJlYWxUaW1lVXMoKTsKKyAgICAgICAgaW50NjRfdCBkZWxheVVzID0gbmV4dFRpbWVVcyAtIGVzdGltYXRlUmVhbFRpbWVVcyh0cywgc3lzdGVtVGltZVVzKSArIG1UaW1lU291cmNlRGVsdGFVczsKKyAgICAgICAgQVRSQUNFX0lOVCgiRnJhbWUgZGVsdGEgKG1zKSIsIChuZXh0VGltZVVzIC0gdGltZVVzKSAvIDFFMyk7CisgICAgICAgIEFMT0dWKCJuZXh0IGZyYW1lIGluICUiIFBSSWQ2NCwgZGVsYXlVcyk7CisgICAgICAgIC8vIHRyeSB0byBzY2hlZHVsZSAzMG1zIGJlZm9yZSB0aW1lIGR1ZQorICAgICAgICBwb3N0VmlkZW9FdmVudF9sKGRlbGF5VXMgPiA2MDAwMCA/IDMwMDAwIDogKGRlbGF5VXMgPCAzMDAwMCA/IDAgOiBkZWxheVVzIC0gMzAwMDApKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIHBvc3RWaWRlb0V2ZW50X2woKTsKIH0KIAoraW50NjRfdCBBd2Vzb21lUGxheWVyOjplc3RpbWF0ZVJlYWxUaW1lVXMoVGltZVNvdXJjZSAqdHMsIGludDY0X3Qgc3lzdGVtVGltZVVzKSB7CisgICAgaWYgKHRzID09ICZtU3lzdGVtVGltZVNvdXJjZSkgeworICAgICAgICByZXR1cm4gc3lzdGVtVGltZVVzOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAoaW50NjRfdCltQ2xvY2tFc3RpbWF0b3ItPmVzdGltYXRlKHN5c3RlbVRpbWVVcywgdHMtPmdldFJlYWxUaW1lVXMoKSk7CisgICAgfQorfQorCiB2b2lkIEF3ZXNvbWVQbGF5ZXI6OnBvc3RWaWRlb0V2ZW50X2woaW50NjRfdCBkZWxheVVzKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKIApAQCAtMjE5MiwxNSArMjI0MSwxNCBAQAogICAgIGlmICghc3RybmNhc2VjbXAoImh0dHA6Ly8iLCBtVXJpLnN0cmluZygpLCA3KQogICAgICAgICAgICAgfHwgIXN0cm5jYXNlY21wKCJodHRwczovLyIsIG1Vcmkuc3RyaW5nKCksIDgpCiAgICAgICAgICAgICB8fCBpc1dpZGV2aW5lU3RyZWFtaW5nKSB7Ci0gICAgICAgIG1Db25uZWN0aW5nRGF0YVNvdXJjZSA9IEhUVFBCYXNlOjpDcmVhdGUoCi0gICAgICAgICAgICAgICAgKG1GbGFncyAmIElOQ09HTklUTykKLSAgICAgICAgICAgICAgICAgICAgPyBIVFRQQmFzZTo6a0ZsYWdJbmNvZ25pdG8KLSAgICAgICAgICAgICAgICAgICAgOiAwKTsKLQotICAgICAgICBpZiAobVVJRFZhbGlkKSB7Ci0gICAgICAgICAgICBtQ29ubmVjdGluZ0RhdGFTb3VyY2UtPnNldFVJRChtVUlEKTsKKyAgICAgICAgaWYgKG1IVFRQU2VydmljZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiQXR0ZW1wdCB0byBwbGF5IG1lZGlhIGZyb20gaHR0cCBVUkkgd2l0aG91dCBIVFRQIHNlcnZpY2UuIik7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgfQogCisgICAgICAgIHNwPElNZWRpYUhUVFBDb25uZWN0aW9uPiBjb25uID0gbUhUVFBTZXJ2aWNlLT5tYWtlSFRUUENvbm5lY3Rpb24oKTsKKyAgICAgICAgbUNvbm5lY3RpbmdEYXRhU291cmNlID0gbmV3IE1lZGlhSFRUUChjb25uKTsKKwogICAgICAgICBTdHJpbmc4IGNhY2hlQ29uZmlnOwogICAgICAgICBib29sIGRpc2Nvbm5lY3RBdEhpZ2h3YXRlcm1hcms7CiAgICAgICAgIE51Q2FjaGVkU291cmNlMjo6UmVtb3ZlQ2FjaGVTcGVjaWZpY0hlYWRlcnMoCkBAIC0yMjA4LDYgKzIyNTYsMTAgQEAKIAogICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNvbm5lY3RpbmdEYXRhU291cmNlLT5jb25uZWN0KG1VcmksICZtVXJpSGVhZGVycyk7CisgICAgICAgIC8vIGZvcmNlIGNvbm5lY3Rpb24gYXQgdGhpcyBwb2ludCwgdG8gYXZvaWQgYSByYWNlIGNvbmRpdGlvbiBiZXR3ZWVuIGdldE1JTUVUeXBlIGFuZCB0aGUKKyAgICAgICAgLy8gY2FjaGluZyBkYXRhc291cmNlIGNvbnN0cnVjdGVkIGJlbG93LCB3aGljaCBjb3VsZCByZXN1bHQgaW4gbXVsdGlwbGUgcmVxdWVzdHMgdG8gdGhlCisgICAgICAgIC8vIHNlcnZlciwgYW5kL29yIGZhaWxlZCBjb25uZWN0aW9ucy4KKyAgICAgICAgU3RyaW5nOCBjb250ZW50VHlwZSA9IG1Db25uZWN0aW5nRGF0YVNvdXJjZS0+Z2V0TUlNRVR5cGUoKTsKICAgICAgICAgbUxvY2subG9jaygpOwogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTIyMzgsOCArMjI5MCw2IEBACiAKICAgICAgICAgbUNvbm5lY3RpbmdEYXRhU291cmNlLmNsZWFyKCk7CiAKLSAgICAgICAgU3RyaW5nOCBjb250ZW50VHlwZSA9IGRhdGFTb3VyY2UtPmdldE1JTUVUeXBlKCk7Ci0KICAgICAgICAgaWYgKHN0cm5jYXNlY21wKGNvbnRlbnRUeXBlLnN0cmluZygpLCAiYXVkaW8vIiwgNikpIHsKICAgICAgICAgICAgIC8vIFdlJ3JlIG5vdCBkb2luZyB0aGlzIGZvciBzdHJlYW1zIHRoYXQgYXBwZWFyIHRvIGJlIGF1ZGlvLW9ubHkKICAgICAgICAgICAgIC8vIHN0cmVhbXMgdG8gZW5zdXJlIHRoYXQgZXZlbiBsb3cgYmFuZHdpZHRoIHN0cmVhbXMgc3RhcnQKQEAgLTIyNzEsMTIgKzIzMjEsMTIgQEAKIAogICAgICAgICAgICAgICAgICAgICBpZiAoZmluYWxTdGF0dXMgIT0gT0sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAobWV0YURhdGFTaXplID49IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgY2FjaGVkRGF0YVJlbWFpbmluZyA+PSBtZXRhRGF0YVNpemUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChvZmY2NF90KWNhY2hlZERhdGFSZW1haW5pbmcgPj0gbWV0YURhdGFTaXplKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChtRmxhZ3MgJiBQUkVQQVJFX0NBTkNFTExFRCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm5vdyBjYWNoZWQgJWQgYnl0ZXMgb2YgZGF0YSIsIGNhY2hlZERhdGFSZW1haW5pbmcpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigibm93IGNhY2hlZCAlenUgYnl0ZXMgb2YgZGF0YSIsIGNhY2hlZERhdGFSZW1haW5pbmcpOwogCiAgICAgICAgICAgICAgICAgICAgIGlmIChtZXRhRGF0YVNpemUgPCAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgY2FjaGVkRGF0YVJlbWFpbmluZyA+PSBrTWluQnl0ZXNGb3JTbmlmZmluZykgewpAQCAtMjI5NSw4ICsyMzQ1LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHNuaWZmZWRNSU1FID0gdG1wLnN0cmluZygpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWV0YSA9PSBOVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFtZXRhLT5maW5kSW50NjQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWV0YS1kYXRhLXNpemUiLCAmbWV0YURhdGFTaXplKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhbWV0YS0+ZmluZEludDY0KCJtZXRhLWRhdGEtc2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxpbnQ2NF90Kj4oJm1ldGFEYXRhU2l6ZSkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YURhdGFTaXplID0ga0hpZ2hXYXRlck1hcmtCeXRlczsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtMjMxNiw3ICsyMzY2LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIGRhdGFTb3VyY2UgPSBEYXRhU291cmNlOjpDcmVhdGVGcm9tVVJJKG1Vcmkuc3RyaW5nKCksICZtVXJpSGVhZGVycyk7CisgICAgICAgIGRhdGFTb3VyY2UgPSBEYXRhU291cmNlOjpDcmVhdGVGcm9tVVJJKAorICAgICAgICAgICAgICAgIG1IVFRQU2VydmljZSwgbVVyaS5zdHJpbmcoKSwgJm1VcmlIZWFkZXJzKTsKICAgICB9CiAKICAgICBpZiAoZGF0YVNvdXJjZSA9PSBOVUxMKSB7CkBAIC0yNTgzLDEyICsyNjM0LDEyIEBACiBzdGF0dXNfdCBBd2Vzb21lUGxheWVyOjpzZWxlY3RBdWRpb1RyYWNrX2woCiAgICAgICAgIGNvbnN0IHNwPE1lZGlhU291cmNlPiYgc291cmNlLCBzaXplX3QgdHJhY2tJbmRleCkgewogCi0gICAgQUxPR0koInNlbGVjdEF1ZGlvVHJhY2tfbDogdHJhY2tJbmRleD0lZCwgbUZsYWdzPTB4JXgiLCB0cmFja0luZGV4LCBtRmxhZ3MpOworICAgIEFMT0dJKCJzZWxlY3RBdWRpb1RyYWNrX2w6IHRyYWNrSW5kZXg9JXp1LCBtRmxhZ3M9MHgleCIsIHRyYWNrSW5kZXgsIG1GbGFncyk7CiAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU3RhdHNMb2NrKTsKICAgICAgICAgaWYgKChzc2l6ZV90KXRyYWNrSW5kZXggPT0gbUFjdGl2ZUF1ZGlvVHJhY2tJbmRleCkgewotICAgICAgICAgICAgQUxPR0koIlRyYWNrICVkIGlzIGFjdGl2ZS4gRG9lcyBub3RoaW5nLiIsIHRyYWNrSW5kZXgpOworICAgICAgICAgICAgQUxPR0koIlRyYWNrICV6dSBpcyBhY3RpdmUuIERvZXMgbm90aGluZy4iLCB0cmFja0luZGV4KTsKICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQogICAgICAgICAvL21TdGF0cy5tRmxhZ3MgPSBtRmxhZ3M7CkBAIC0yNjU0LDE0ICsyNzA1LDE0IEBACiAKIHN0YXR1c190IEF3ZXNvbWVQbGF5ZXI6OnNlbGVjdFRyYWNrKHNpemVfdCB0cmFja0luZGV4LCBib29sIHNlbGVjdCkgewogICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgQUxPR1YoInNlbGVjdFRyYWNrOiB0cmFja0luZGV4ID0gJWQgYW5kIHNlbGVjdD0lZCIsIHRyYWNrSW5kZXgsIHNlbGVjdCk7CisgICAgQUxPR1YoInNlbGVjdFRyYWNrOiB0cmFja0luZGV4ID0gJXp1IGFuZCBzZWxlY3Q9JWQiLCB0cmFja0luZGV4LCBzZWxlY3QpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgc2l6ZV90IHRyYWNrQ291bnQgPSBtRXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOwogICAgIGlmIChtVGV4dERyaXZlciAhPSBOVUxMKSB7CiAgICAgICAgIHRyYWNrQ291bnQgKz0gbVRleHREcml2ZXItPmNvdW50RXh0ZXJuYWxUcmFja3MoKTsKICAgICB9CiAgICAgaWYgKHRyYWNrSW5kZXggPj0gdHJhY2tDb3VudCkgewotICAgICAgICBBTE9HRSgiVHJhY2sgaW5kZXggKCVkKSBpcyBvdXQgb2YgcmFuZ2UgWzAsICVkKSIsIHRyYWNrSW5kZXgsIHRyYWNrQ291bnQpOworICAgICAgICBBTE9HRSgiVHJhY2sgaW5kZXggKCV6dSkgaXMgb3V0IG9mIHJhbmdlIFswLCAlenUpIiwgdHJhY2tJbmRleCwgdHJhY2tDb3VudCk7CiAgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgfQogCkBAIC0yNjczLDE0ICsyNzI0LDE0IEBACiAgICAgICAgIGlzQXVkaW9UcmFjayA9ICFzdHJuY2FzZWNtcChtaW1lLCAiYXVkaW8vIiwgNik7CiAKICAgICAgICAgaWYgKCFpc0F1ZGlvVHJhY2sgJiYgc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9URVhUXzNHUFApICE9IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJUcmFjayAlZCBpcyBub3QgZWl0aGVyIGF1ZGlvIG9yIHRpbWVkIHRleHQiLCB0cmFja0luZGV4KTsKKyAgICAgICAgICAgIEFMT0dFKCJUcmFjayAlenUgaXMgbm90IGVpdGhlciBhdWRpbyBvciB0aW1lZCB0ZXh0IiwgdHJhY2tJbmRleCk7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoaXNBdWRpb1RyYWNrKSB7CiAgICAgICAgIGlmICghc2VsZWN0KSB7Ci0gICAgICAgICAgICBBTE9HRSgiRGVzZWxlY3QgYW4gYXVkaW8gdHJhY2sgKCVkKSBpcyBub3Qgc3VwcG9ydGVkIiwgdHJhY2tJbmRleCk7CisgICAgICAgICAgICBBTE9HRSgiRGVzZWxlY3QgYW4gYXVkaW8gdHJhY2sgKCV6dSkgaXMgbm90IHN1cHBvcnRlZCIsIHRyYWNrSW5kZXgpOwogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBzZWxlY3RBdWRpb1RyYWNrX2wobUV4dHJhY3Rvci0+Z2V0VHJhY2sodHJhY2tJbmRleCksIHRyYWNrSW5kZXgpOwpAQCAtMjc1OCw3ICsyODA5LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICAgICAgICAgIGlmIChtVGV4dERyaXZlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbVRleHREcml2ZXIgPSBuZXcgVGltZWRUZXh0RHJpdmVyKG1MaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgbVRleHREcml2ZXIgPSBuZXcgVGltZWRUZXh0RHJpdmVyKG1MaXN0ZW5lciwgbUhUVFBTZXJ2aWNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIFN0cmluZyB2YWx1ZXMgd3JpdHRlbiBpbiBQYXJjZWwgYXJlIFVURi0xNiB2YWx1ZXMuCiAgICAgICAgICAgICBTdHJpbmc4IHVyaShyZXF1ZXN0LnJlYWRTdHJpbmcxNigpKTsKQEAgLTI3NzAsNyArMjgyMSw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgICAgICAgICBpZiAobVRleHREcml2ZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG1UZXh0RHJpdmVyID0gbmV3IFRpbWVkVGV4dERyaXZlcihtTGlzdGVuZXIpOworICAgICAgICAgICAgICAgIG1UZXh0RHJpdmVyID0gbmV3IFRpbWVkVGV4dERyaXZlcihtTGlzdGVuZXIsIG1IVFRQU2VydmljZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpbnQgZmQgICAgICAgICA9IHJlcXVlc3QucmVhZEZpbGVEZXNjcmlwdG9yKCk7CiAgICAgICAgICAgICBvZmY2NF90IG9mZnNldCA9IHJlcXVlc3QucmVhZEludDY0KCk7CkBAIC0yODAzLDE0ICsyODU0LDE1IEBACiAgICAgcmV0dXJuIG1DYWNoZWRTb3VyY2UgIT0gTlVMTCB8fCBtV1ZNRXh0cmFjdG9yICE9IE5VTEw7CiB9CiAKLXN0YXR1c190IEF3ZXNvbWVQbGF5ZXI6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSBjb25zdCB7CitzdGF0dXNfdCBBd2Vzb21lUGxheWVyOjpkdW1wKAorICAgICAgICBpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJiAvKiBhcmdzICovKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1TdGF0c0xvY2spOwogCiAgICAgRklMRSAqb3V0ID0gZmRvcGVuKGR1cChmZCksICJ3Iik7CiAKICAgICBmcHJpbnRmKG91dCwgIiBBd2Vzb21lUGxheWVyXG4iKTsKICAgICBpZiAobVN0YXRzLm1GZCA8IDApIHsKLSAgICAgICAgZnByaW50ZihvdXQsICIgIFVSSShzdXBwcmVzc2VkKSIpOworICAgICAgICBmcHJpbnRmKG91dCwgIiAgVVJJKCVzKSIsIHVyaURlYnVnU3RyaW5nKG1VcmksIG1GbGFncyAmIElOQ09HTklUTykuY19zdHIoKSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgZnByaW50ZihvdXQsICIgIGZkKCVkKSIsIG1TdGF0cy5tRmQpOwogICAgIH0KQEAgLTI4MTgsNyArMjg3MCw3IEBACiAgICAgZnByaW50ZihvdXQsICIsIGZsYWdzKDB4JTA4eCkiLCBtU3RhdHMubUZsYWdzKTsKIAogICAgIGlmIChtU3RhdHMubUJpdHJhdGUgPj0gMCkgewotICAgICAgICBmcHJpbnRmKG91dCwgIiwgYml0cmF0ZSglbGxkIGJwcykiLCBtU3RhdHMubUJpdHJhdGUpOworICAgICAgICBmcHJpbnRmKG91dCwgIiwgYml0cmF0ZSglIiBQUklkNjQgIiBicHMpIiwgbVN0YXRzLm1CaXRyYXRlKTsKICAgICB9CiAKICAgICBmcHJpbnRmKG91dCwgIlxuIik7CkBAIC0yODI2LDcgKzI4NzgsNyBAQAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVN0YXRzLm1UcmFja3Muc2l6ZSgpOyArK2kpIHsKICAgICAgICAgY29uc3QgVHJhY2tTdGF0ICZzdGF0ID0gbVN0YXRzLm1UcmFja3MuaXRlbUF0KGkpOwogCi0gICAgICAgIGZwcmludGYob3V0LCAiICBUcmFjayAlZFxuIiwgaSArIDEpOworICAgICAgICBmcHJpbnRmKG91dCwgIiAgVHJhY2sgJXp1XG4iLCBpICsgMSk7CiAgICAgICAgIGZwcmludGYob3V0LCAiICAgTUlNRSglcykiLCBzdGF0Lm1NSU1FLnN0cmluZygpKTsKIAogICAgICAgICBpZiAoIXN0YXQubURlY29kZXJOYW1lLmlzRW1wdHkoKSkgewpAQCAtMjgzOCw4ICsyODkwLDggQEAKICAgICAgICAgaWYgKChzc2l6ZV90KWkgPT0gbVN0YXRzLm1WaWRlb1RyYWNrSW5kZXgpIHsKICAgICAgICAgICAgIGZwcmludGYob3V0LAogICAgICAgICAgICAgICAgICAgICAiICAgdmlkZW9EaW1lbnNpb25zKCVkIHggJWQpLCAiCi0gICAgICAgICAgICAgICAgICAgICJudW1WaWRlb0ZyYW1lc0RlY29kZWQoJWxsZCksICIKLSAgICAgICAgICAgICAgICAgICAgIm51bVZpZGVvRnJhbWVzRHJvcHBlZCglbGxkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIm51bVZpZGVvRnJhbWVzRGVjb2RlZCglIiBQUklkNjQgIiksICIKKyAgICAgICAgICAgICAgICAgICAgIm51bVZpZGVvRnJhbWVzRHJvcHBlZCglIiBQUklkNjQgIilcbiIsCiAgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5tVmlkZW9XaWR0aCwKICAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm1WaWRlb0hlaWdodCwKICAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm1OdW1WaWRlb0ZyYW1lc0RlY29kZWQsCkBAIC0yODk5LDYgKzI5NTEsOSBAQAogICAgIC8vIGdldCBjdXJyZW50IHBvc2l0aW9uIHNvIHdlIGNhbiBzdGFydCByZWNyZWF0ZWQgc3RyZWFtIGZyb20gaGVyZQogICAgIGdldFBvc2l0aW9uKCZtQXVkaW9UZWFyRG93blBvc2l0aW9uKTsKIAorICAgIHNwPElNZWRpYUhUVFBTZXJ2aWNlPiBzYXZlZEhUVFBTZXJ2aWNlID0gbUhUVFBTZXJ2aWNlOworCisgICAgYm9vbCB3YXNMb29waW5nID0gbUZsYWdzICYgTE9PUElORzsKICAgICAvLyBSZXNldCBhbmQgcmVjcmVhdGUKICAgICByZXNldF9sKCk7CiAKQEAgLTI5MDgsNyArMjk2Myw3IEBACiAgICAgICAgIG1GaWxlU291cmNlID0gZmlsZVNvdXJjZTsKICAgICAgICAgZXJyID0gc2V0RGF0YVNvdXJjZV9sKGZpbGVTb3VyY2UpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGVyciA9IHNldERhdGFTb3VyY2VfbCh1cmksICZ1cmlIZWFkZXJzKTsKKyAgICAgICAgZXJyID0gc2V0RGF0YVNvdXJjZV9sKHNhdmVkSFRUUFNlcnZpY2UsIHVyaSwgJnVyaUhlYWRlcnMpOwogICAgIH0KIAogICAgIG1GbGFncyB8PSBQUkVQQVJJTkc7CkBAIC0yOTE3LDYgKzI5NzIsOSBAQAogICAgICAgICAvLyBhIE1FRElBX0VSUk9SIHRvIHRoZSBjbGllbnQgYW5kIGFib3J0IHRoZSBwcmVwYXJlCiAgICAgICAgIG1GbGFncyB8PSBQUkVQQVJFX0NBTkNFTExFRDsKICAgICB9CisgICAgaWYgKHdhc0xvb3BpbmcpIHsKKyAgICAgICAgbUZsYWdzIHw9IExPT1BJTkc7CisgICAgfQogCiAgICAgbUF1ZGlvVGVhckRvd24gPSB0cnVlOwogICAgIG1Jc0FzeW5jUHJlcGFyZSA9IHRydWU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcAppbmRleCBmZTIyZjFmLi43ZDJlMGE0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5jcHAKQEAgLTE0LDYgKzE0LDggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIkNhbWVyYVNvdXJjZSIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KQEAgLTMzLDYgKzM1LDEyIEBACiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAKKyNpZiBMT0dfTkRFQlVHCisjZGVmaW5lIFVOVVNFRF9VTkxFU1NfVkVSQk9TRSh4KSAodm9pZCkoeCkKKyNlbHNlCisjZGVmaW5lIFVOVVNFRF9VTkxFU1NfVkVSQk9TRSh4KQorI2VuZGlmCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RhdGljIGNvbnN0IGludDY0X3QgQ0FNRVJBX1NPVVJDRV9USU1FT1VUX05TID0gMzAwMDAwMDAwMExMOwpAQCAtNjUsMTIgKzczLDE1IEBACiB9CiAKIHZvaWQgQ2FtZXJhU291cmNlTGlzdGVuZXI6Om5vdGlmeShpbnQzMl90IG1zZ1R5cGUsIGludDMyX3QgZXh0MSwgaW50MzJfdCBleHQyKSB7CisgICAgVU5VU0VEX1VOTEVTU19WRVJCT1NFKG1zZ1R5cGUpOworICAgIFVOVVNFRF9VTkxFU1NfVkVSQk9TRShleHQxKTsKKyAgICBVTlVTRURfVU5MRVNTX1ZFUkJPU0UoZXh0Mik7CiAgICAgQUxPR1YoIm5vdGlmeSglZCwgJWQsICVkKSIsIG1zZ1R5cGUsIGV4dDEsIGV4dDIpOwogfQogCiB2b2lkIENhbWVyYVNvdXJjZUxpc3RlbmVyOjpwb3N0RGF0YShpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+ICZkYXRhUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhX2ZyYW1lX21ldGFkYXRhX3QgKm1ldGFkYXRhKSB7Ci0gICAgQUxPR1YoInBvc3REYXRhKCVkLCBwdHI6JXAsIHNpemU6JWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9mcmFtZV9tZXRhZGF0YV90ICogLyogbWV0YWRhdGEgKi8pIHsKKyAgICBBTE9HVigicG9zdERhdGEoJWQsIHB0cjolcCwgc2l6ZTolenUpIiwKICAgICAgICAgIG1zZ1R5cGUsIGRhdGFQdHItPnBvaW50ZXIoKSwgZGF0YVB0ci0+c2l6ZSgpKTsKIAogICAgIHNwPENhbWVyYVNvdXJjZT4gc291cmNlID0gbVNvdXJjZS5wcm9tb3RlKCk7CkBAIC01NzksMTQgKzU5MCwxNSBAQAogICAgIH0KIH0KIAotdm9pZCBDYW1lcmFTb3VyY2U6OnN0YXJ0Q2FtZXJhUmVjb3JkaW5nKCkgeworc3RhdHVzX3QgQ2FtZXJhU291cmNlOjpzdGFydENhbWVyYVJlY29yZGluZygpIHsKICAgICBBTE9HVigic3RhcnRDYW1lcmFSZWNvcmRpbmciKTsKICAgICAvLyBSZXNldCB0aGUgaWRlbnRpdHkgdG8gdGhlIGN1cnJlbnQgdGhyZWFkIGJlY2F1c2UgbWVkaWEgc2VydmVyIG93bnMgdGhlCiAgICAgLy8gY2FtZXJhIGFuZCByZWNvcmRpbmcgaXMgc3RhcnRlZCBieSB0aGUgYXBwbGljYXRpb25zLiBUaGUgYXBwbGljYXRpb25zCiAgICAgLy8gd2lsbCBjb25uZWN0IHRvIHRoZSBjYW1lcmEgaW4gSUNhbWVyYVJlY29yZGluZ1Byb3h5OjpzdGFydFJlY29yZGluZy4KICAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICBzdGF0dXNfdCBlcnI7CiAgICAgaWYgKG1OdW1JbnB1dEJ1ZmZlcnMgPiAwKSB7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IG1DYW1lcmEtPnNlbmRDb21tYW5kKAorICAgICAgICBlcnIgPSBtQ2FtZXJhLT5zZW5kQ29tbWFuZCgKICAgICAgICAgICAgIENBTUVSQV9DTURfU0VUX1ZJREVPX0JVRkZFUl9DT1VOVCwgbU51bUlucHV0QnVmZmVycywgMCk7CiAKICAgICAgICAgLy8gVGhpcyBjb3VsZCBoYXBwZW4gZm9yIENhbWVyYUhBTDEgY2xpZW50czsgdGh1cyB0aGUgZmFpbHVyZSBpcwpAQCAtNTk3LDE3ICs2MDksMjUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIGVyciA9IE9LOwogICAgIGlmIChtQ2FtZXJhRmxhZ3MgJiBGTEFHU19IT1RfQ0FNRVJBKSB7CiAgICAgICAgIG1DYW1lcmEtPnVubG9jaygpOwogICAgICAgICBtQ2FtZXJhLmNsZWFyKCk7Ci0gICAgICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywKLSAgICAgICAgICAgIG1DYW1lcmFSZWNvcmRpbmdQcm94eS0+c3RhcnRSZWNvcmRpbmcobmV3IFByb3h5TGlzdGVuZXIodGhpcykpKTsKKyAgICAgICAgaWYgKChlcnIgPSBtQ2FtZXJhUmVjb3JkaW5nUHJveHktPnN0YXJ0UmVjb3JkaW5nKAorICAgICAgICAgICAgICAgIG5ldyBQcm94eUxpc3RlbmVyKHRoaXMpKSkgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc3RhcnQgcmVjb3JkaW5nLCByZWNlaXZlZCBlcnJvcjogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCBlcnIpOworICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgbUNhbWVyYS0+c2V0TGlzdGVuZXIobmV3IENhbWVyYVNvdXJjZUxpc3RlbmVyKHRoaXMpKTsKICAgICAgICAgbUNhbWVyYS0+c3RhcnRSZWNvcmRpbmcoKTsKLSAgICAgICAgQ0hFQ0sobUNhbWVyYS0+cmVjb3JkaW5nRW5hYmxlZCgpKTsKKyAgICAgICAgaWYgKCFtQ2FtZXJhLT5yZWNvcmRpbmdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGVyciA9IC1FSU5WQUw7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHN0YXJ0IHJlY29yZGluZyIpOworICAgICAgICB9CiAgICAgfQogICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworICAgIHJldHVybiBlcnI7CiB9CiAKIHN0YXR1c190IENhbWVyYVNvdXJjZTo6c3RhcnQoTWV0YURhdGEgKm1ldGEpIHsKQEAgLTYzOSwxMCArNjU5LDEyIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBzdGFydENhbWVyYVJlY29yZGluZygpOworICAgIHN0YXR1c190IGVycjsKKyAgICBpZiAoKGVyciA9IHN0YXJ0Q2FtZXJhUmVjb3JkaW5nKCkpID09IE9LKSB7CisgICAgICAgIG1TdGFydGVkID0gdHJ1ZTsKKyAgICB9CiAKLSAgICBtU3RhcnRlZCA9IHRydWU7Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBlcnI7CiB9CiAKIHZvaWQgQ2FtZXJhU291cmNlOjpzdG9wQ2FtZXJhUmVjb3JkaW5nKCkgewpAQCAtNjU3LDYzICs2NzksODAgQEAKIAogdm9pZCBDYW1lcmFTb3VyY2U6OnJlbGVhc2VDYW1lcmEoKSB7CiAgICAgQUxPR1YoInJlbGVhc2VDYW1lcmEiKTsKLSAgICBpZiAobUNhbWVyYSAhPSAwKSB7Ci0gICAgICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwotICAgICAgICBpZiAoKG1DYW1lcmFGbGFncyAmIEZMQUdTX0hPVF9DQU1FUkEpID09IDApIHsKLSAgICAgICAgICAgIEFMT0dWKCJDYW1lcmEgd2FzIGNvbGQgd2hlbiB3ZSBzdGFydGVkLCBzdG9wcGluZyBwcmV2aWV3Iik7Ci0gICAgICAgICAgICBtQ2FtZXJhLT5zdG9wUHJldmlldygpOwotICAgICAgICAgICAgbUNhbWVyYS0+ZGlzY29ubmVjdCgpOwotICAgICAgICB9Ci0gICAgICAgIG1DYW1lcmEtPnVubG9jaygpOworICAgIHNwPENhbWVyYT4gY2FtZXJhOworICAgIGJvb2wgY29sZENhbWVyYSA9IGZhbHNlOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgLy8gZ2V0IGEgbG9jYWwgcmVmIGFuZCBjbGVhciByZWYgdG8gbUNhbWVyYSBub3cKKyAgICAgICAgY2FtZXJhID0gbUNhbWVyYTsKICAgICAgICAgbUNhbWVyYS5jbGVhcigpOwotICAgICAgICBtQ2FtZXJhID0gMDsKKyAgICAgICAgY29sZENhbWVyYSA9IChtQ2FtZXJhRmxhZ3MgJiBGTEFHU19IT1RfQ0FNRVJBKSA9PSAwOworICAgIH0KKworICAgIGlmIChjYW1lcmEgIT0gMCkgeworICAgICAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICAgICAgaWYgKGNvbGRDYW1lcmEpIHsKKyAgICAgICAgICAgIEFMT0dWKCJDYW1lcmEgd2FzIGNvbGQgd2hlbiB3ZSBzdGFydGVkLCBzdG9wcGluZyBwcmV2aWV3Iik7CisgICAgICAgICAgICBjYW1lcmEtPnN0b3BQcmV2aWV3KCk7CisgICAgICAgICAgICBjYW1lcmEtPmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgfQorICAgICAgICBjYW1lcmEtPnVubG9jaygpOwogICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKICAgICB9Ci0gICAgaWYgKG1DYW1lcmFSZWNvcmRpbmdQcm94eSAhPSAwKSB7Ci0gICAgICAgIG1DYW1lcmFSZWNvcmRpbmdQcm94eS0+YXNCaW5kZXIoKS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllcik7Ci0gICAgICAgIG1DYW1lcmFSZWNvcmRpbmdQcm94eS5jbGVhcigpOworCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICBpZiAobUNhbWVyYVJlY29yZGluZ1Byb3h5ICE9IDApIHsKKyAgICAgICAgICAgIG1DYW1lcmFSZWNvcmRpbmdQcm94eS0+YXNCaW5kZXIoKS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllcik7CisgICAgICAgICAgICBtQ2FtZXJhUmVjb3JkaW5nUHJveHkuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBtQ2FtZXJhRmxhZ3MgPSAwOwogICAgIH0KLSAgICBtQ2FtZXJhRmxhZ3MgPSAwOwogfQogCiBzdGF0dXNfdCBDYW1lcmFTb3VyY2U6OnJlc2V0KCkgewogICAgIEFMT0dEKCJyZXNldDogRSIpOwotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICBtRnJhbWVBdmFpbGFibGVDb25kaXRpb24uc2lnbmFsKCk7CiAKLSAgICBpbnQ2NF90IHRva2VuOwotICAgIGJvb2wgaXNUb2tlblZhbGlkID0gZmFsc2U7Ci0gICAgaWYgKG1DYW1lcmEgIT0gMCkgewotICAgICAgICB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Ci0gICAgICAgIGlzVG9rZW5WYWxpZCA9IHRydWU7Ci0gICAgfQotICAgIHJlbGVhc2VRdWV1ZWRGcmFtZXMoKTsKLSAgICB3aGlsZSAoIW1GcmFtZXNCZWluZ0VuY29kZWQuZW1wdHkoKSkgewotICAgICAgICBpZiAoTk9fRVJST1IgIT0KLSAgICAgICAgICAgIG1GcmFtZUNvbXBsZXRlQ29uZGl0aW9uLndhaXRSZWxhdGl2ZShtTG9jaywKLSAgICAgICAgICAgICAgICAgICAgbVRpbWVCZXR3ZWVuRnJhbWVDYXB0dXJlVXMgKiAxMDAwTEwgKyBDQU1FUkFfU09VUkNFX1RJTUVPVVRfTlMpKSB7Ci0gICAgICAgICAgICBBTE9HVygiVGltZWQgb3V0IHdhaXRpbmcgZm9yIG91dHN0YW5kaW5nIGZyYW1lcyBiZWluZyBlbmNvZGVkOiAlZCIsCi0gICAgICAgICAgICAgICAgbUZyYW1lc0JlaW5nRW5jb2RlZC5zaXplKCkpOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgbUZyYW1lQXZhaWxhYmxlQ29uZGl0aW9uLnNpZ25hbCgpOworCisgICAgICAgIGludDY0X3QgdG9rZW47CisgICAgICAgIGJvb2wgaXNUb2tlblZhbGlkID0gZmFsc2U7CisgICAgICAgIGlmIChtQ2FtZXJhICE9IDApIHsKKyAgICAgICAgICAgIHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICAgICAgICAgIGlzVG9rZW5WYWxpZCA9IHRydWU7CiAgICAgICAgIH0KKyAgICAgICAgcmVsZWFzZVF1ZXVlZEZyYW1lcygpOworICAgICAgICB3aGlsZSAoIW1GcmFtZXNCZWluZ0VuY29kZWQuZW1wdHkoKSkgeworICAgICAgICAgICAgaWYgKE5PX0VSUk9SICE9CisgICAgICAgICAgICAgICAgbUZyYW1lQ29tcGxldGVDb25kaXRpb24ud2FpdFJlbGF0aXZlKG1Mb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgbVRpbWVCZXR3ZWVuRnJhbWVDYXB0dXJlVXMgKiAxMDAwTEwgKyBDQU1FUkFfU09VUkNFX1RJTUVPVVRfTlMpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIlRpbWVkIG91dCB3YWl0aW5nIGZvciBvdXRzdGFuZGluZyBmcmFtZXMgYmVpbmcgZW5jb2RlZDogJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgbUZyYW1lc0JlaW5nRW5jb2RlZC5zaXplKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0b3BDYW1lcmFSZWNvcmRpbmcoKTsKKyAgICAgICAgaWYgKGlzVG9rZW5WYWxpZCkgeworICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUNvbGxlY3RTdGF0cykgeworICAgICAgICAgICAgQUxPR0koIkZyYW1lcyByZWNlaXZlZC9lbmNvZGVkL2Ryb3BwZWQ6ICVkLyVkLyVkIGluICUiIFBSSWQ2NCAiIHVzIiwKKyAgICAgICAgICAgICAgICAgICAgbU51bUZyYW1lc1JlY2VpdmVkLCBtTnVtRnJhbWVzRW5jb2RlZCwgbU51bUZyYW1lc0Ryb3BwZWQsCisgICAgICAgICAgICAgICAgICAgIG1MYXN0RnJhbWVUaW1lc3RhbXBVcyAtIG1GaXJzdEZyYW1lVGltZVVzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtTnVtR2xpdGNoZXMgPiAwKSB7CisgICAgICAgICAgICBBTE9HVygiJWQgbG9uZyBkZWxheXMgYmV0d2VlbiBuZWlnaGJvcmluZyB2aWRlbyBmcmFtZXMiLCBtTnVtR2xpdGNoZXMpOworICAgICAgICB9CisKKyAgICAgICAgQ0hFQ0tfRVEobU51bUZyYW1lc1JlY2VpdmVkLCBtTnVtRnJhbWVzRW5jb2RlZCArIG1OdW1GcmFtZXNEcm9wcGVkKTsKICAgICB9Ci0gICAgc3RvcENhbWVyYVJlY29yZGluZygpOworCiAgICAgcmVsZWFzZUNhbWVyYSgpOwotICAgIGlmIChpc1Rva2VuVmFsaWQpIHsKLSAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7Ci0gICAgfQogCi0gICAgaWYgKG1Db2xsZWN0U3RhdHMpIHsKLSAgICAgICAgQUxPR0koIkZyYW1lcyByZWNlaXZlZC9lbmNvZGVkL2Ryb3BwZWQ6ICVkLyVkLyVkIGluICVsbGQgdXMiLAotICAgICAgICAgICAgICAgIG1OdW1GcmFtZXNSZWNlaXZlZCwgbU51bUZyYW1lc0VuY29kZWQsIG1OdW1GcmFtZXNEcm9wcGVkLAotICAgICAgICAgICAgICAgIG1MYXN0RnJhbWVUaW1lc3RhbXBVcyAtIG1GaXJzdEZyYW1lVGltZVVzKTsKLSAgICB9Ci0KLSAgICBpZiAobU51bUdsaXRjaGVzID4gMCkgewotICAgICAgICBBTE9HVygiJWQgbG9uZyBkZWxheXMgYmV0d2VlbiBuZWlnaGJvcmluZyB2aWRlbyBmcmFtZXMiLCBtTnVtR2xpdGNoZXMpOwotICAgIH0KLQotICAgIENIRUNLX0VRKG1OdW1GcmFtZXNSZWNlaXZlZCwgbU51bUZyYW1lc0VuY29kZWQgKyBtTnVtRnJhbWVzRHJvcHBlZCk7CiAgICAgQUxPR0QoInJlc2V0OiBYIik7CiAgICAgcmV0dXJuIE9LOwogfQpAQCAtNzk2LDcgKzgzNSw3IEBACiAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjYW1lcmEgcmVjb3JkaW5nIHByb3h5IGlzIGdvbmUiKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFMT0dXKCJUaW1lZCBvdXQgd2FpdGluZyBmb3IgaW5jb21pbmcgY2FtZXJhIHZpZGVvIGZyYW1lczogJWxsZCB1cyIsCisgICAgICAgICAgICAgICAgQUxPR1coIlRpbWVkIG91dCB3YWl0aW5nIGZvciBpbmNvbWluZyBjYW1lcmEgdmlkZW8gZnJhbWVzOiAlIiBQUklkNjQgIiB1cyIsCiAgICAgICAgICAgICAgICAgICAgIG1MYXN0RnJhbWVUaW1lc3RhbXBVcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTgxOSwxMCArODU4LDEwIEBACiAKIHZvaWQgQ2FtZXJhU291cmNlOjpkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoaW50NjRfdCB0aW1lc3RhbXBVcywKICAgICAgICAgaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiAmZGF0YSkgewotICAgIEFMT0dWKCJkYXRhQ2FsbGJhY2tUaW1lc3RhbXA6IHRpbWVzdGFtcCAlbGxkIHVzIiwgdGltZXN0YW1wVXMpOworICAgIEFMT0dWKCJkYXRhQ2FsbGJhY2tUaW1lc3RhbXA6IHRpbWVzdGFtcCAlIiBQUklkNjQgIiB1cyIsIHRpbWVzdGFtcFVzKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIGlmICghbVN0YXJ0ZWQgfHwgKG1OdW1GcmFtZXNSZWNlaXZlZCA9PSAwICYmIHRpbWVzdGFtcFVzIDwgbVN0YXJ0VGltZVVzKSkgewotICAgICAgICBBTE9HVigiRHJvcCBmcmFtZSBhdCAlbGxkLyVsbGQgdXMiLCB0aW1lc3RhbXBVcywgbVN0YXJ0VGltZVVzKTsKKyAgICAgICAgQUxPR1YoIkRyb3AgZnJhbWUgYXQgJSIgUFJJZDY0ICIvJSIgUFJJZDY0ICIgdXMiLCB0aW1lc3RhbXBVcywgbVN0YXJ0VGltZVVzKTsKICAgICAgICAgcmVsZWFzZU9uZVJlY29yZGluZ0ZyYW1lKGRhdGEpOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtODY1LDcgKzkwNCw3IEBACiAgICAgbUZyYW1lc1JlY2VpdmVkLnB1c2hfYmFjayhkYXRhKTsKICAgICBpbnQ2NF90IHRpbWVVcyA9IG1TdGFydFRpbWVVcyArICh0aW1lc3RhbXBVcyAtIG1GaXJzdEZyYW1lVGltZVVzKTsKICAgICBtRnJhbWVUaW1lcy5wdXNoX2JhY2sodGltZVVzKTsKLSAgICBBTE9HVigiaW5pdGlhbCBkZWxheTogJWxsZCwgY3VycmVudCB0aW1lIHN0YW1wOiAlbGxkIiwKKyAgICBBTE9HVigiaW5pdGlhbCBkZWxheTogJSIgUFJJZDY0ICIsIGN1cnJlbnQgdGltZSBzdGFtcDogJSIgUFJJZDY0LAogICAgICAgICBtU3RhcnRUaW1lVXMsIHRpbWVVcyk7CiAgICAgbUZyYW1lQXZhaWxhYmxlQ29uZGl0aW9uLnNpZ25hbCgpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5jcHAKaW5kZXggNTc3MjMxNi4uMGFjZDlkMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuY3BwCkBAIC0xNCw2ICsxNCw4IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJDYW1lcmFTb3VyY2VUaW1lTGFwc2UiCiAKQEAgLTc5LDEzICs4MSwxNCBAQAogICAgICAgbVNraXBDdXJyZW50RnJhbWUoZmFsc2UpIHsKIAogICAgIG1UaW1lQmV0d2VlbkZyYW1lQ2FwdHVyZVVzID0gdGltZUJldHdlZW5GcmFtZUNhcHR1cmVVczsKLSAgICBBTE9HRCgic3RhcnRpbmcgdGltZSBsYXBzZSBtb2RlOiAlbGxkIHVzIiwKKyAgICBBTE9HRCgic3RhcnRpbmcgdGltZSBsYXBzZSBtb2RlOiAlIiBQUklkNjQgIiB1cyIsCiAgICAgICAgIG1UaW1lQmV0d2VlbkZyYW1lQ2FwdHVyZVVzKTsKIAogICAgIG1WaWRlb1dpZHRoID0gdmlkZW9TaXplLndpZHRoOwogICAgIG1WaWRlb0hlaWdodCA9IHZpZGVvU2l6ZS5oZWlnaHQ7CiAKLSAgICBpZiAoIXRyeVNldHRpbmdWaWRlb1NpemUodmlkZW9TaXplLndpZHRoLCB2aWRlb1NpemUuaGVpZ2h0KSkgeworICAgIGlmIChPSyA9PSBtSW5pdENoZWNrICYmICF0cnlTZXR0aW5nVmlkZW9TaXplKHZpZGVvU2l6ZS53aWR0aCwgdmlkZW9TaXplLmhlaWdodCkpIHsKKyAgICAgICAgcmVsZWFzZUNhbWVyYSgpOwogICAgICAgICBtSW5pdENoZWNrID0gTk9fSU5JVDsKICAgICB9CiAKQEAgLTEzNCw3ICsxMzcsNyBAQAogICAgIH0KIAogICAgIGJvb2wgdmlkZW9TaXplU3VwcG9ydGVkID0gZmFsc2U7Ci0gICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHN1cHBvcnRlZFNpemVzLnNpemUoKTsgKytpKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdXBwb3J0ZWRTaXplcy5zaXplKCk7ICsraSkgewogICAgICAgICBpbnQzMl90IHBpY3R1cmVXaWR0aCA9IHN1cHBvcnRlZFNpemVzW2ldLndpZHRoOwogICAgICAgICBpbnQzMl90IHBpY3R1cmVIZWlnaHQgPSBzdXBwb3J0ZWRTaXplc1tpXS5oZWlnaHQ7CiAKQEAgLTIzMSw3ICsyMzQsNyBAQAogICAgIHJldHVybiBuZXdNZW1vcnk7CiB9CiAKLWJvb2wgQ2FtZXJhU291cmNlVGltZUxhcHNlOjpza2lwQ3VycmVudEZyYW1lKGludDY0X3QgdGltZXN0YW1wVXMpIHsKK2Jvb2wgQ2FtZXJhU291cmNlVGltZUxhcHNlOjpza2lwQ3VycmVudEZyYW1lKGludDY0X3QgLyogdGltZXN0YW1wVXMgKi8pIHsKICAgICBBTE9HVigic2tpcEN1cnJlbnRGcmFtZSIpOwogICAgIGlmIChtU2tpcEN1cnJlbnRGcmFtZSkgewogICAgICAgICBtU2tpcEN1cnJlbnRGcmFtZSA9IGZhbHNlOwpAQCAtMjY1LDcgKzI2OCw3IEBACiAKICAgICAgICAgICAgIC8vIFJlYWxseSBtYWtlIHN1cmUgdGhhdCB0aGlzIHZpZGVvIHJlY29yZGluZyBmcmFtZSB3aWxsIG5vdCBiZSBkcm9wcGVkLgogICAgICAgICAgICAgaWYgKCp0aW1lc3RhbXBVcyA8IG1TdGFydFRpbWVVcykgewotICAgICAgICAgICAgICAgIEFMT0dJKCJzZXQgdGltZXN0YW1wVXMgdG8gc3RhcnQgdGltZSBzdGFtcCAlbGxkIHVzIiwgbVN0YXJ0VGltZVVzKTsKKyAgICAgICAgICAgICAgICBBTE9HSSgic2V0IHRpbWVzdGFtcFVzIHRvIHN0YXJ0IHRpbWUgc3RhbXAgJSIgUFJJZDY0ICIgdXMiLCBtU3RhcnRUaW1lVXMpOwogICAgICAgICAgICAgICAgICp0aW1lc3RhbXBVcyA9IG1TdGFydFRpbWVVczsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0Nsb2NrRXN0aW1hdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0Nsb2NrRXN0aW1hdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGQxZTQyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2xvY2tFc3RpbWF0b3IuY3BwCkBAIC0wLDAgKzEsMTc3IEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDE0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNsb2NrRXN0aW1hdG9yIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0Nsb2NrRXN0aW1hdG9yLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1dpbmRvd2VkTGluZWFyRml0RXN0aW1hdG9yOjpXaW5kb3dlZExpbmVhckZpdEVzdGltYXRvcigKKyAgICAgICAgc2l6ZV90IGhlYWRMZW5ndGgsIGRvdWJsZSBoZWFkRmFjdG9yLCBzaXplX3QgbWFpbkxlbmd0aCwgZG91YmxlIHRhaWxGYWN0b3IpCisgICAgOiBtSGVhZEZhY3RvckludigxLiAvIGhlYWRGYWN0b3IpLAorICAgICAgbVRhaWxGYWN0b3IodGFpbEZhY3RvciksCisgICAgICBtSGlzdG9yeUxlbmd0aChtYWluTGVuZ3RoICsgaGVhZExlbmd0aCksCisgICAgICBtSGVhZExlbmd0aChoZWFkTGVuZ3RoKSB7CisgICAgcmVzZXQoKTsKKyAgICBtWEhpc3RvcnkucmVzaXplKG1IaXN0b3J5TGVuZ3RoKTsKKyAgICBtWUhpc3RvcnkucmVzaXplKG1IaXN0b3J5TGVuZ3RoKTsKKyAgICBtRmlyc3RXZWlnaHQgPSBwb3coaGVhZEZhY3RvciwgbUhlYWRMZW5ndGgpOworfQorCitXaW5kb3dlZExpbmVhckZpdEVzdGltYXRvcjo6TGluZWFyRml0OjpMaW5lYXJGaXQoKSB7CisgICAgcmVzZXQoKTsKK30KKwordm9pZCBXaW5kb3dlZExpbmVhckZpdEVzdGltYXRvcjo6TGluZWFyRml0OjpyZXNldCgpIHsKKyAgICBtWCA9IG1YWCA9IG1ZID0gbVlZID0gbVhZID0gbVcgPSAwLjsKK30KKworZG91YmxlIFdpbmRvd2VkTGluZWFyRml0RXN0aW1hdG9yOjpMaW5lYXJGaXQ6OnNpemUoKSBjb25zdCB7CisgICAgZG91YmxlIHMgPSBtVyAqIG1XICsgbVggKiBtWCArIG1ZICogbVkgKyBtWFggKiBtWFggKyBtWFkgKiBtWFkgKyBtWVkgKiBtWVk7CisgICAgaWYgKHMgPiAxZTcyKSB7CisgICAgICAgIC8vIDFlNzIgY29ycmVzcG9uZHMgdG8gY2xvY2sgbW9ub3RvbmljIHRpbWUgb2YgYWJvdXQgOCB5ZWFycworICAgICAgICBBTE9HVygiZXN0aW1hdG9yIGlzIG92ZXJmbG93aW5nOiB3PSVnIHg9JWcgeT0lZyB4eD0lZyB4eT0lZyB5eT0lZyIsCisgICAgICAgICAgICAgIG1XLCBtWCwgbVksIG1YWCwgbVhZLCBtWVkpOworICAgIH0KKyAgICByZXR1cm4gczsKK30KKwordm9pZCBXaW5kb3dlZExpbmVhckZpdEVzdGltYXRvcjo6TGluZWFyRml0OjphZGQoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgdykgeworICAgIG1XICs9IHc7CisgICAgbVggKz0gdyAqIHg7CisgICAgbVkgKz0gdyAqIHk7CisgICAgbVhYICs9IHcgKiB4ICogeDsKKyAgICBtWFkgKz0gdyAqIHggKiB5OworICAgIG1ZWSArPSB3ICogeSAqIHk7Cit9CisKK3ZvaWQgV2luZG93ZWRMaW5lYXJGaXRFc3RpbWF0b3I6OkxpbmVhckZpdDo6Y29tYmluZShjb25zdCBMaW5lYXJGaXQgJmxmKSB7CisgICAgbVcgKz0gbGYubVc7CisgICAgbVggKz0gbGYubVg7CisgICAgbVkgKz0gbGYubVk7CisgICAgbVhYICs9IGxmLm1YWDsKKyAgICBtWFkgKz0gbGYubVhZOworICAgIG1ZWSArPSBsZi5tWVk7Cit9CisKK3ZvaWQgV2luZG93ZWRMaW5lYXJGaXRFc3RpbWF0b3I6OkxpbmVhckZpdDo6c2NhbGUoZG91YmxlIHcpIHsKKyAgICBtVyAqPSB3OworICAgIG1YICo9IHc7CisgICAgbVkgKj0gdzsKKyAgICBtWFggKj0gdzsKKyAgICBtWFkgKj0gdzsKKyAgICBtWVkgKj0gdzsKK30KKworZG91YmxlIFdpbmRvd2VkTGluZWFyRml0RXN0aW1hdG9yOjpMaW5lYXJGaXQ6OmludGVycG9sYXRlKGRvdWJsZSB4KSB7CisgICAgZG91YmxlIGRpdiA9IG1XICogbVhYIC0gbVggKiBtWDsKKyAgICBpZiAoZmFicyhkaXYpIDwgMWUtNSAqIG1XICogbVcpIHsKKyAgICAgICAgLy8gdGhpcyBvbmx5IHNob3VsZCBoYXBwZW4gb24gdGhlIGZpcnN0IHZhbHVlCisgICAgICAgIHJldHVybiB4OworICAgICAgICAvLyBhc3N1bWluZyBhID0gMSwgd2UgY291bGQgYWxzbyByZXR1cm4geCArIChtWSAtIG1YKSAvIG1XOworICAgIH0KKyAgICBkb3VibGUgYV9kaXYgPSAobVcgKiBtWFkgLSBtWCAqIG1ZKTsKKyAgICBkb3VibGUgYl9kaXYgPSAobVhYICogbVkgLSBtWCAqIG1YWSk7CisgICAgQUxPR1YoImE9JS40ZyBiPSUuNGcgaW49JWcgb3V0PSVnIiwKKyAgICAgICAgICAgIGFfZGl2IC8gZGl2LCBiX2RpdiAvIGRpdiwgeCwgKGFfZGl2ICogeCArIGJfZGl2KSAvIGRpdik7CisgICAgcmV0dXJuIChhX2RpdiAqIHggKyBiX2RpdikgLyBkaXY7Cit9CisKK2RvdWJsZSBXaW5kb3dlZExpbmVhckZpdEVzdGltYXRvcjo6ZXN0aW1hdGUoZG91YmxlIHgsIGRvdWJsZSB5KSB7CisgICAgLyoKKyAgICAgKiBUT0RPOiBXZSBjb3VsZCB1cGRhdGUgdGhlIGhlYWQgYnkgYWRkaW5nIHRoZSBuZXcgc2FtcGxlIHRvIGl0CisgICAgICogYW5kIGFtcGxpZnlpbmcgaXQsIGJ1dCB0aGlzIGFwcHJvYWNoIGNhbiBsZWFkIHRvIHVuYm91bmRlZAorICAgICAqIGVycm9yLiBJbnN0ZWFkLCB3ZSByZWNhbGN1bGF0ZSB0aGUgaGVhZCBhdCBlYWNoIHN0ZXAsIHdoaWNoCisgICAgICogaXMgY29tcHV0YXRpb25hbGx5IG1vcmUgZXhwZW5zaXZlLiBXZSBjb3VsZCBiYWxhbmNlIHRoZSB0d28KKyAgICAgKiBtZXRob2RzIGJ5IHJlY2FsY3VsYXRpbmcganVzdCBiZWZvcmUgdGhlIGVycm9yIGJlY29tZXMKKyAgICAgKiBzaWduaWZpY2FudC4KKyAgICAgKi8KKyAgICBjb25zdCBib29sIHVwZGF0ZV9oZWFkID0gZmFsc2U7CisgICAgaWYgKHVwZGF0ZV9oZWFkKSB7CisgICAgICAgIC8vIGFkZCBuZXcgc2FtcGxlIHRvIHRoZSBoZWFkCisgICAgICAgIG1IZWFkLnNjYWxlKG1IZWFkRmFjdG9ySW52KTsgLy8gYW1wbGlmeSBoZWFkCisgICAgICAgIG1IZWFkLmFkZCh4LCB5LCBtRmlyc3RXZWlnaHQpOworICAgIH0KKworICAgIC8qCisgICAgICogVFJJQ0tZOiBwbGFjZSBlbGVtZW50cyBpbnRvIHRoZSBjaXJjdWxhciBidWZmZXIgYXQgZGVjcmVhc2luZworICAgICAqIGluZGljZXMsIHNvIHRoYXQgd2UgY2FuIGFjY2VzcyBwYXN0IGVsZW1lbnRzIGJ5IGFkZGl0aW9uCisgICAgICogKHRoZXJlYnkgYXZvaWRpbmcgcG90ZW50aWFsbHkgbmVnYXRpdmUgaW5kaWNlcy4pCisgICAgICovCisgICAgaWYgKG1OdW1TYW1wbGVzID49IG1IZWFkTGVuZ3RoKSB7CisgICAgICAgIC8vIG1vdmUgbGFzdCBoZWFkIHNhbXBsZSBmcm9tIGhlYWQgdG8gdGhlIG1haW4gd2luZG93CisgICAgICAgIHNpemVfdCBsYXN0SGVhZEl4ID0gKG1TYW1wbGVJeCArIG1IZWFkTGVuZ3RoKSAlIG1IaXN0b3J5TGVuZ3RoOworICAgICAgICBpZiAodXBkYXRlX2hlYWQpIHsKKyAgICAgICAgICAgIG1IZWFkLmFkZChtWEhpc3RvcnlbbGFzdEhlYWRJeF0sIG1ZSGlzdG9yeVtsYXN0SGVhZEl4XSwgLTEuKTsgLy8gcmVtb3ZlCisgICAgICAgIH0KKyAgICAgICAgbU1haW4uYWRkKG1YSGlzdG9yeVtsYXN0SGVhZEl4XSwgbVlIaXN0b3J5W2xhc3RIZWFkSXhdLCAxLik7CisgICAgICAgIGlmIChtTnVtU2FtcGxlcyA+PSBtSGlzdG9yeUxlbmd0aCkgeworICAgICAgICAgICAgLy8gbW92ZSBsYXN0IG1haW4gc2FtcGxlIGZyb20gbWFpbiB3aW5kb3cgdG8gdGFpbAorICAgICAgICAgICAgbU1haW4uYWRkKG1YSGlzdG9yeVttU2FtcGxlSXhdLCBtWUhpc3RvcnlbbVNhbXBsZUl4XSwgLTEuKTsgLy8gcmVtb3ZlCisgICAgICAgICAgICBtVGFpbC5hZGQobVhIaXN0b3J5W21TYW1wbGVJeF0sIG1ZSGlzdG9yeVttU2FtcGxlSXhdLCAxLik7CisgICAgICAgICAgICBtVGFpbC5zY2FsZShtVGFpbEZhY3Rvcik7IC8vIGF0dGVudWF0ZSB0YWlsCisgICAgICAgIH0KKyAgICB9CisKKyAgICBtWEhpc3RvcnkuZWRpdEl0ZW1BdChtU2FtcGxlSXgpID0geDsKKyAgICBtWUhpc3RvcnkuZWRpdEl0ZW1BdChtU2FtcGxlSXgpID0geTsKKyAgICBpZiAobU51bVNhbXBsZXMgPCBtSGlzdG9yeUxlbmd0aCkgeworICAgICAgICArK21OdW1TYW1wbGVzOworICAgIH0KKworICAgIC8vIHJlY2FsY3VsYXRlIGhlYWQgdW5sZXNzIHdlIHdlcmUgdXNpbmcgdGhlIHVwZGF0ZSBtZXRob2QKKyAgICBpZiAoIXVwZGF0ZV9oZWFkKSB7CisgICAgICAgIG1IZWFkLnJlc2V0KCk7CisgICAgICAgIGRvdWJsZSB3ID0gbUZpcnN0V2VpZ2h0OworICAgICAgICBmb3IgKHNpemVfdCBoZWFkSXggPSAwOyBoZWFkSXggPCBtSGVhZExlbmd0aCAmJiBoZWFkSXggPCBtTnVtU2FtcGxlczsgKytoZWFkSXgpIHsKKyAgICAgICAgICAgIHNpemVfdCBpeCA9IChtU2FtcGxlSXggKyBoZWFkSXgpICUgbUhpc3RvcnlMZW5ndGg7CisgICAgICAgICAgICBtSGVhZC5hZGQobVhIaXN0b3J5W2l4XSwgbVlIaXN0b3J5W2l4XSwgdyk7CisgICAgICAgICAgICB3ICo9IG1IZWFkRmFjdG9ySW52OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1TYW1wbGVJeCA+IDApIHsKKyAgICAgICAgLS1tU2FtcGxlSXg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVNhbXBsZUl4ID0gbUhpc3RvcnlMZW5ndGggLSAxOworICAgIH0KKworICAgIC8vIHJldHVybiBlc3RpbWF0aW9uIHJlc3VsdAorICAgIExpbmVhckZpdCB0b3RhbDsKKyAgICB0b3RhbC5jb21iaW5lKG1IZWFkKTsKKyAgICB0b3RhbC5jb21iaW5lKG1NYWluKTsKKyAgICB0b3RhbC5jb21iaW5lKG1UYWlsKTsKKyAgICByZXR1cm4gdG90YWwuaW50ZXJwb2xhdGUoeCk7Cit9CisKK3ZvaWQgV2luZG93ZWRMaW5lYXJGaXRFc3RpbWF0b3I6OnJlc2V0KCkgeworICAgIG1IZWFkLnJlc2V0KCk7CisgICAgbU1haW4ucmVzZXQoKTsKKyAgICBtVGFpbC5yZXNldCgpOworICAgIG1OdW1TYW1wbGVzID0gMDsKKyAgICBtU2FtcGxlSXggPSBtSGlzdG9yeUxlbmd0aCAtIDE7Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NvZGVjQmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcyOWQ0ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NvZGVjQmFzZS5jcHAKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWNCYXNlIgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0NvZGVjQmFzZTo6Q29kZWNCYXNlKCkgeworfQorCitDb2RlY0Jhc2U6On5Db2RlY0Jhc2UoKSB7Cit9CisKK0NvZGVjQmFzZTo6UG9ydERlc2NyaXB0aW9uOjpQb3J0RGVzY3JpcHRpb24oKSB7Cit9CisKK0NvZGVjQmFzZTo6UG9ydERlc2NyaXB0aW9uOjp+UG9ydERlc2NyaXB0aW9uKCkgeworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9EYXRhU291cmNlLmNwcAppbmRleCA1NTMxZWE3NC4uNjVhZDBmMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5jcHAKQEAgLTEzLDEzICsxMywxMSBAQAogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiRGF0YVNvdXJjZSIKIAogI2luY2x1ZGUgImluY2x1ZGUvQU1SRXh0cmFjdG9yLmgiCiAKLSNpZiBDSFJPTUlVTV9BVkFJTEFCTEUKLSNpbmNsdWRlICJpbmNsdWRlL2Nocm9taXVtX2h0dHBfc3R1Yi5oIgotI2VuZGlmCi0KICNpbmNsdWRlICJpbmNsdWRlL0FBQ0V4dHJhY3Rvci5oIgogI2luY2x1ZGUgImluY2x1ZGUvRFJNRXh0cmFjdG9yLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9GTEFDRXh0cmFjdG9yLmgiCkBAIC0zNSwxMCArMzMsMTUgQEAKIAogI2luY2x1ZGUgIm1hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmgiCiAKKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFVUklTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgpAQCAtMTgwLDcgKzE4MywxNSBAQAogCiAvLyBzdGF0aWMKIHNwPERhdGFTb3VyY2U+IERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkoCi0gICAgICAgIGNvbnN0IGNoYXIgKnVyaSwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKKyAgICAgICAgU3RyaW5nOCAqY29udGVudFR5cGUsCisgICAgICAgIEhUVFBCYXNlICpodHRwU291cmNlKSB7CisgICAgaWYgKGNvbnRlbnRUeXBlICE9IE5VTEwpIHsKKyAgICAgICAgKmNvbnRlbnRUeXBlID0gIiI7CisgICAgfQorCiAgICAgYm9vbCBpc1dpZGV2aW5lID0gIXN0cm5jYXNlY21wKCJ3aWRldmluZTovLyIsIHVyaSwgMTEpOwogCiAgICAgc3A8RGF0YVNvdXJjZT4gc291cmNlOwpAQCAtMTg5LDcgKzIwMCwxOSBAQAogICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKCJodHRwOi8vIiwgdXJpLCA3KQogICAgICAgICAgICAgfHwgIXN0cm5jYXNlY21wKCJodHRwczovLyIsIHVyaSwgOCkKICAgICAgICAgICAgIHx8IGlzV2lkZXZpbmUpIHsKLSAgICAgICAgc3A8SFRUUEJhc2U+IGh0dHBTb3VyY2UgPSBIVFRQQmFzZTo6Q3JlYXRlKCk7CisgICAgICAgIGlmIChodHRwU2VydmljZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBodHRwIHNlcnZpY2UhIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChodHRwU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgICAgIHNwPElNZWRpYUhUVFBDb25uZWN0aW9uPiBjb25uID0gaHR0cFNlcnZpY2UtPm1ha2VIVFRQQ29ubmVjdGlvbigpOworICAgICAgICAgICAgaWYgKGNvbm4gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gbWFrZSBodHRwIGNvbm5lY3Rpb24gZnJvbSBodHRwIHNlcnZpY2UhIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBodHRwU291cmNlID0gbmV3IE1lZGlhSFRUUChjb25uKTsKKyAgICAgICAgfQogCiAgICAgICAgIFN0cmluZzggdG1wOwogICAgICAgICBpZiAoaXNXaWRldmluZSkgewpAQCAtMTk5LDMyICsyMjIsMzggQEAKICAgICAgICAgICAgIHVyaSA9IHRtcC5zdHJpbmcoKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChodHRwU291cmNlLT5jb25uZWN0KHVyaSwgaGVhZGVycykgIT0gT0spIHsKKyAgICAgICAgU3RyaW5nOCBjYWNoZUNvbmZpZzsKKyAgICAgICAgYm9vbCBkaXNjb25uZWN0QXRIaWdod2F0ZXJtYXJrOworICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBub25DYWNoZVNwZWNpZmljSGVhZGVyczsKKyAgICAgICAgaWYgKGhlYWRlcnMgIT0gTlVMTCkgeworICAgICAgICAgICAgbm9uQ2FjaGVTcGVjaWZpY0hlYWRlcnMgPSAqaGVhZGVyczsKKyAgICAgICAgICAgIE51Q2FjaGVkU291cmNlMjo6UmVtb3ZlQ2FjaGVTcGVjaWZpY0hlYWRlcnMoCisgICAgICAgICAgICAgICAgICAgICZub25DYWNoZVNwZWNpZmljSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgJmNhY2hlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAmZGlzY29ubmVjdEF0SGlnaHdhdGVybWFyayk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaHR0cFNvdXJjZS0+Y29ubmVjdCh1cmksICZub25DYWNoZVNwZWNpZmljSGVhZGVycykgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY29ubmVjdCBodHRwIHNvdXJjZSEiKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFpc1dpZGV2aW5lKSB7Ci0gICAgICAgICAgICBTdHJpbmc4IGNhY2hlQ29uZmlnOwotICAgICAgICAgICAgYm9vbCBkaXNjb25uZWN0QXRIaWdod2F0ZXJtYXJrOwotICAgICAgICAgICAgaWYgKGhlYWRlcnMgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGNvcHkgPSAqaGVhZGVyczsKLSAgICAgICAgICAgICAgICBOdUNhY2hlZFNvdXJjZTI6OlJlbW92ZUNhY2hlU3BlY2lmaWNIZWFkZXJzKAotICAgICAgICAgICAgICAgICAgICAgICAgJmNvcHksICZjYWNoZUNvbmZpZywgJmRpc2Nvbm5lY3RBdEhpZ2h3YXRlcm1hcmspOworICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAqY29udGVudFR5cGUgPSBodHRwU291cmNlLT5nZXRNSU1FVHlwZSgpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzb3VyY2UgPSBOdUNhY2hlZFNvdXJjZTI6OkNyZWF0ZSgKICAgICAgICAgICAgICAgICAgICAgaHR0cFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgY2FjaGVDb25maWcuaXNFbXB0eSgpID8gTlVMTCA6IGNhY2hlQ29uZmlnLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgY2FjaGVDb25maWcuaXNFbXB0eSgpID8gTlVMTCA6IGNhY2hlQ29uZmlnLnN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0QXRIaWdod2F0ZXJtYXJrKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIFdlIGRvIG5vdCB3YW50IHRoYXQgcHJlZmV0Y2hpbmcsIGNhY2hpbmcsIGRhdGFzb3VyY2Ugd3JhcHBlcgogICAgICAgICAgICAgLy8gaW4gdGhlIHdpZGV2aW5lOi8vIGNhc2UuCiAgICAgICAgICAgICBzb3VyY2UgPSBodHRwU291cmNlOwogICAgICAgICB9Ci0KLSMgaWYgQ0hST01JVU1fQVZBSUxBQkxFCiAgICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAoImRhdGE6IiwgdXJpLCA1KSkgewotICAgICAgICBzb3VyY2UgPSBjcmVhdGVEYXRhVXJpU291cmNlKHVyaSk7Ci0jZW5kaWYKKyAgICAgICAgc291cmNlID0gRGF0YVVSSVNvdXJjZTo6Q3JlYXRlKHVyaSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gQXNzdW1lIGl0J3MgYSBmaWxlbmFtZS4KICAgICAgICAgc291cmNlID0gbmV3IEZpbGVTb3VyY2UodXJpKTsKQEAgLTIzNyw2ICsyNjYsMTkgQEAKICAgICByZXR1cm4gc291cmNlOwogfQogCitzcDxEYXRhU291cmNlPiBEYXRhU291cmNlOjpDcmVhdGVNZWRpYUhUVFAoY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSkgeworICAgIGlmIChodHRwU2VydmljZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNwPElNZWRpYUhUVFBDb25uZWN0aW9uPiBjb25uID0gaHR0cFNlcnZpY2UtPm1ha2VIVFRQQ29ubmVjdGlvbigpOworICAgIGlmIChjb25uID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUhUVFAoY29ubik7CisgICAgfQorfQorCiBTdHJpbmc4IERhdGFTb3VyY2U6OmdldE1JTUVUeXBlKCkgY29uc3QgewogICAgIHJldHVybiBTdHJpbmc4KCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFVUklTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVVSSVNvdXJjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMzOTMxNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFVUklTb3VyY2UuY3BwCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFVUklTb3VyY2UuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gc3RhdGljCitzcDxEYXRhVVJJU291cmNlPiBEYXRhVVJJU291cmNlOjpDcmVhdGUoY29uc3QgY2hhciAqdXJpKSB7CisgICAgaWYgKHN0cm5jYXNlY21wKCJkYXRhOiIsIHVyaSwgNSkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgY2hhciAqY29tbWFQb3MgPSBzdHJyY2hyKHVyaSwgJywnKTsKKworICAgIGlmIChjb21tYVBvcyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKKworICAgIEFTdHJpbmcgdG1wKCZ1cmlbNV0sIGNvbW1hUG9zIC0gJnVyaVs1XSk7CisKKyAgICBpZiAodG1wLmVuZHNXaXRoKCI7YmFzZTY0IikpIHsKKyAgICAgICAgQVN0cmluZyBlbmNvZGVkKGNvbW1hUG9zICsgMSk7CisKKyAgICAgICAgLy8gU3RyaXAgQ1IgYW5kIExGLi4uCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSBlbmNvZGVkLnNpemUoKTsgaS0tID4gMDspIHsKKyAgICAgICAgICAgIGlmIChlbmNvZGVkLmNfc3RyKClbaV0gPT0gJ1xyJyB8fCBlbmNvZGVkLmNfc3RyKClbaV0gPT0gJ1xuJykgeworICAgICAgICAgICAgICAgIGVuY29kZWQuZXJhc2UoaSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBidWZmZXIgPSBkZWNvZGVCYXNlNjQoZW5jb2RlZCk7CisKKyAgICAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiTWFsZm9ybWVkIGJhc2U2NCBlbmNvZGVkIGNvbnRlbnQgZm91bmQuIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisjaWYgMAorICAgICAgICBzaXplX3QgZGF0YUxlbiA9IHN0cmxlbih1cmkpIC0gdG1wLnNpemUoKSAtIDY7CisgICAgICAgIGJ1ZmZlciA9IG5ldyBBQnVmZmVyKGRhdGFMZW4pOworICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCksIGNvbW1hUG9zICsgMSwgZGF0YUxlbik7CisKKyAgICAgICAgLy8gdW5lc2NhcGUKKyNlbHNlCisgICAgICAgIC8vIE1lZGlhUGxheWVyIGRvZXNuJ3QgY2FyZSBmb3IgdGhpcyByaWdodCBub3cgYXMgd2UgZG9uJ3QKKyAgICAgICAgLy8gcGxheSBhbnkgdGV4dC1iYXNlZCBtZWRpYS4KKyAgICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgICB9CisKKyAgICAvLyBXZSBkb24ndCByZWFsbHkgY2FyZSBhYm91dCBjaGFyc2V0IG9yIG1pbWUgdHlwZS4KKworICAgIHJldHVybiBuZXcgRGF0YVVSSVNvdXJjZShidWZmZXIpOworfQorCitEYXRhVVJJU291cmNlOjpEYXRhVVJJU291cmNlKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpCisgICAgOiBtQnVmZmVyKGJ1ZmZlcikgeworfQorCitEYXRhVVJJU291cmNlOjp+RGF0YVVSSVNvdXJjZSgpIHsKK30KKworc3RhdHVzX3QgRGF0YVVSSVNvdXJjZTo6aW5pdENoZWNrKCkgY29uc3QgeworICAgIHJldHVybiBPSzsKK30KKworc3NpemVfdCBEYXRhVVJJU291cmNlOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKChvZmZzZXQgPCAwKSB8fCAob2Zmc2V0ID49IChvZmY2NF90KW1CdWZmZXItPnNpemUoKSkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgc2l6ZV90IGNvcHkgPSBtQnVmZmVyLT5zaXplKCkgLSBvZmZzZXQ7CisgICAgaWYgKGNvcHkgPiBzaXplKSB7CisgICAgICAgIGNvcHkgPSBzaXplOworICAgIH0KKworICAgIG1lbWNweShkYXRhLCBtQnVmZmVyLT5kYXRhKCkgKyBvZmZzZXQsIGNvcHkpOworCisgICAgcmV0dXJuIGNvcHk7Cit9CisKK3N0YXR1c190IERhdGFVUklTb3VyY2U6OmdldFNpemUob2ZmNjRfdCAqc2l6ZSkgeworICAgICpzaXplID0gbUJ1ZmZlci0+c2l6ZSgpOworCisgICAgcmV0dXJuIE9LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9FU0RTLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0VTRFMuY3BwCmluZGV4IGM3NmJjNGEuLjhmYmI1N2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0VTRFMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0VTRFMuY3BwCkBAIC05MSw3ICs5MSw3IEBACiAgICAgfQogICAgIHdoaWxlIChtb3JlKTsKIAotICAgIEFMT0dWKCJ0YWc9MHglMDJ4IGRhdGFfc2l6ZT0lZCIsICp0YWcsICpkYXRhX3NpemUpOworICAgIEFMT0dWKCJ0YWc9MHglMDJ4IGRhdGFfc2l6ZT0lenUiLCAqdGFnLCAqZGF0YV9zaXplKTsKIAogICAgIGlmICgqZGF0YV9zaXplID4gc2l6ZSkgewogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRkxBQ0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GTEFDRXh0cmFjdG9yLmNwcAppbmRleCAwOThmY2Y5Li5mYTcyNTFjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9GTEFDRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GTEFDRXh0cmFjdG9yLmNwcApAQCAtMjA4LDU1ICsyMDgsNTUgQEAKIC8vIHdpdGggdGhlIHNhbWUgcGFyYW1ldGVyIGxpc3QsIGJ1dCBkaXNjYXJkIHJlZHVuZGFudCBpbmZvcm1hdGlvbi4KIAogRkxBQ19fU3RyZWFtRGVjb2RlclJlYWRTdGF0dXMgRkxBQ1BhcnNlcjo6cmVhZF9jYWxsYmFjaygKLSAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqZGVjb2RlciwgRkxBQ19fYnl0ZSBidWZmZXJbXSwKKyAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqIC8qIGRlY29kZXIgKi8sIEZMQUNfX2J5dGUgYnVmZmVyW10sCiAgICAgICAgIHNpemVfdCAqYnl0ZXMsIHZvaWQgKmNsaWVudF9kYXRhKQogewogICAgIHJldHVybiAoKEZMQUNQYXJzZXIgKikgY2xpZW50X2RhdGEpLT5yZWFkQ2FsbGJhY2soYnVmZmVyLCBieXRlcyk7CiB9CiAKIEZMQUNfX1N0cmVhbURlY29kZXJTZWVrU3RhdHVzIEZMQUNQYXJzZXI6OnNlZWtfY2FsbGJhY2soCi0gICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKmRlY29kZXIsCisgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKiAvKiBkZWNvZGVyICovLAogICAgICAgICBGTEFDX191aW50NjQgYWJzb2x1dGVfYnl0ZV9vZmZzZXQsIHZvaWQgKmNsaWVudF9kYXRhKQogewogICAgIHJldHVybiAoKEZMQUNQYXJzZXIgKikgY2xpZW50X2RhdGEpLT5zZWVrQ2FsbGJhY2soYWJzb2x1dGVfYnl0ZV9vZmZzZXQpOwogfQogCiBGTEFDX19TdHJlYW1EZWNvZGVyVGVsbFN0YXR1cyBGTEFDUGFyc2VyOjp0ZWxsX2NhbGxiYWNrKAotICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICpkZWNvZGVyLAorICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICogLyogZGVjb2RlciAqLywKICAgICAgICAgRkxBQ19fdWludDY0ICphYnNvbHV0ZV9ieXRlX29mZnNldCwgdm9pZCAqY2xpZW50X2RhdGEpCiB7CiAgICAgcmV0dXJuICgoRkxBQ1BhcnNlciAqKSBjbGllbnRfZGF0YSktPnRlbGxDYWxsYmFjayhhYnNvbHV0ZV9ieXRlX29mZnNldCk7CiB9CiAKIEZMQUNfX1N0cmVhbURlY29kZXJMZW5ndGhTdGF0dXMgRkxBQ1BhcnNlcjo6bGVuZ3RoX2NhbGxiYWNrKAotICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICpkZWNvZGVyLAorICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICogLyogZGVjb2RlciAqLywKICAgICAgICAgRkxBQ19fdWludDY0ICpzdHJlYW1fbGVuZ3RoLCB2b2lkICpjbGllbnRfZGF0YSkKIHsKICAgICByZXR1cm4gKChGTEFDUGFyc2VyICopIGNsaWVudF9kYXRhKS0+bGVuZ3RoQ2FsbGJhY2soc3RyZWFtX2xlbmd0aCk7CiB9CiAKIEZMQUNfX2Jvb2wgRkxBQ1BhcnNlcjo6ZW9mX2NhbGxiYWNrKAotICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICpkZWNvZGVyLCB2b2lkICpjbGllbnRfZGF0YSkKKyAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqIC8qIGRlY29kZXIgKi8sIHZvaWQgKmNsaWVudF9kYXRhKQogewogICAgIHJldHVybiAoKEZMQUNQYXJzZXIgKikgY2xpZW50X2RhdGEpLT5lb2ZDYWxsYmFjaygpOwogfQogCiBGTEFDX19TdHJlYW1EZWNvZGVyV3JpdGVTdGF0dXMgRkxBQ1BhcnNlcjo6d3JpdGVfY2FsbGJhY2soCi0gICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKmRlY29kZXIsIGNvbnN0IEZMQUNfX0ZyYW1lICpmcmFtZSwKKyAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqIC8qIGRlY29kZXIgKi8sIGNvbnN0IEZMQUNfX0ZyYW1lICpmcmFtZSwKICAgICAgICAgY29uc3QgRkxBQ19faW50MzIgKiBjb25zdCBidWZmZXJbXSwgdm9pZCAqY2xpZW50X2RhdGEpCiB7CiAgICAgcmV0dXJuICgoRkxBQ1BhcnNlciAqKSBjbGllbnRfZGF0YSktPndyaXRlQ2FsbGJhY2soZnJhbWUsIGJ1ZmZlcik7CiB9CiAKIHZvaWQgRkxBQ1BhcnNlcjo6bWV0YWRhdGFfY2FsbGJhY2soCi0gICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKmRlY29kZXIsCisgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKiAvKiBkZWNvZGVyICovLAogICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1NZXRhZGF0YSAqbWV0YWRhdGEsIHZvaWQgKmNsaWVudF9kYXRhKQogewogICAgICgoRkxBQ1BhcnNlciAqKSBjbGllbnRfZGF0YSktPm1ldGFkYXRhQ2FsbGJhY2sobWV0YWRhdGEpOwogfQogCiB2b2lkIEZMQUNQYXJzZXI6OmVycm9yX2NhbGxiYWNrKAotICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICpkZWNvZGVyLAorICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICogLyogZGVjb2RlciAqLywKICAgICAgICAgRkxBQ19fU3RyZWFtRGVjb2RlckVycm9yU3RhdHVzIHN0YXR1cywgdm9pZCAqY2xpZW50X2RhdGEpCiB7CiAgICAgKChGTEFDUGFyc2VyICopIGNsaWVudF9kYXRhKS0+ZXJyb3JDYWxsYmFjayhzdGF0dXMpOwpAQCAtMzgwLDE1ICszODAsMjEgQEAKIC8vIENvcHkgc2FtcGxlcyBmcm9tIEZMQUMgbmF0aXZlIDMyLWJpdCBub24taW50ZXJsZWF2ZWQgdG8gMTYtYml0IGludGVybGVhdmVkLgogLy8gVGhlc2UgYXJlIGNhbmRpZGF0ZXMgZm9yIG9wdGltaXphdGlvbiBpZiBuZWVkZWQuCiAKLXN0YXRpYyB2b2lkIGNvcHlNb25vOChzaG9ydCAqZHN0LCBjb25zdCBpbnQgKmNvbnN0ICpzcmMsIHVuc2lnbmVkIG5TYW1wbGVzLCB1bnNpZ25lZCBuQ2hhbm5lbHMpCi17CitzdGF0aWMgdm9pZCBjb3B5TW9ubzgoCisgICAgICAgIHNob3J0ICpkc3QsCisgICAgICAgIGNvbnN0IGludCAqY29uc3QgKnNyYywKKyAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCisgICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewogICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7CiAgICAgICAgICpkc3QrKyA9IHNyY1swXVtpXSA8PCA4OwogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgY29weVN0ZXJlbzgoc2hvcnQgKmRzdCwgY29uc3QgaW50ICpjb25zdCAqc3JjLCB1bnNpZ25lZCBuU2FtcGxlcywgdW5zaWduZWQgbkNoYW5uZWxzKQoteworc3RhdGljIHZvaWQgY29weVN0ZXJlbzgoCisgICAgICAgIHNob3J0ICpkc3QsCisgICAgICAgIGNvbnN0IGludCAqY29uc3QgKnNyYywKKyAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCisgICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewogICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7CiAgICAgICAgICpkc3QrKyA9IHNyY1swXVtpXSA8PCA4OwogICAgICAgICAqZHN0KysgPSBzcmNbMV1baV0gPDwgODsKQEAgLTQwNCwxNSArNDEwLDIxIEBACiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBjb3B5TW9ubzE2KHNob3J0ICpkc3QsIGNvbnN0IGludCAqY29uc3QgKnNyYywgdW5zaWduZWQgblNhbXBsZXMsIHVuc2lnbmVkIG5DaGFubmVscykKLXsKK3N0YXRpYyB2b2lkIGNvcHlNb25vMTYoCisgICAgICAgIHNob3J0ICpkc3QsCisgICAgICAgIGNvbnN0IGludCAqY29uc3QgKnNyYywKKyAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCisgICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewogICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7CiAgICAgICAgICpkc3QrKyA9IHNyY1swXVtpXTsKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGNvcHlTdGVyZW8xNihzaG9ydCAqZHN0LCBjb25zdCBpbnQgKmNvbnN0ICpzcmMsIHVuc2lnbmVkIG5TYW1wbGVzLCB1bnNpZ25lZCBuQ2hhbm5lbHMpCi17CitzdGF0aWMgdm9pZCBjb3B5U3RlcmVvMTYoCisgICAgICAgIHNob3J0ICpkc3QsCisgICAgICAgIGNvbnN0IGludCAqY29uc3QgKnNyYywKKyAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCisgICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewogICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7CiAgICAgICAgICpkc3QrKyA9IHNyY1swXVtpXTsKICAgICAgICAgKmRzdCsrID0gc3JjWzFdW2ldOwpAQCAtNDMwLDE1ICs0NDIsMjEgQEAKIAogLy8gMjQtYml0IHZlcnNpb25zIHNob3VsZCBkbyBkaXRoZXJpbmcgb3Igbm9pc2Utc2hhcGluZywgaGVyZSBvciBpbiBBdWRpb0ZsaW5nZXIKIAotc3RhdGljIHZvaWQgY29weU1vbm8yNChzaG9ydCAqZHN0LCBjb25zdCBpbnQgKmNvbnN0ICpzcmMsIHVuc2lnbmVkIG5TYW1wbGVzLCB1bnNpZ25lZCBuQ2hhbm5lbHMpCi17CitzdGF0aWMgdm9pZCBjb3B5TW9ubzI0KAorICAgICAgICBzaG9ydCAqZHN0LAorICAgICAgICBjb25zdCBpbnQgKmNvbnN0ICpzcmMsCisgICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAorICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewogICAgICAgICAqZHN0KysgPSBzcmNbMF1baV0gPj4gODsKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGNvcHlTdGVyZW8yNChzaG9ydCAqZHN0LCBjb25zdCBpbnQgKmNvbnN0ICpzcmMsIHVuc2lnbmVkIG5TYW1wbGVzLCB1bnNpZ25lZCBuQ2hhbm5lbHMpCi17CitzdGF0aWMgdm9pZCBjb3B5U3RlcmVvMjQoCisgICAgICAgIHNob3J0ICpkc3QsCisgICAgICAgIGNvbnN0IGludCAqY29uc3QgKnNyYywKKyAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCisgICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewogICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7CiAgICAgICAgICpkc3QrKyA9IHNyY1swXVtpXSA+PiA4OwogICAgICAgICAqZHN0KysgPSBzcmNbMV1baV0gPj4gODsKQEAgLTQ1NCw4ICs0NzIsMTEgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGNvcHlUcmVzcGFzcyhzaG9ydCAqZHN0LCBjb25zdCBpbnQgKmNvbnN0ICpzcmMsIHVuc2lnbmVkIG5TYW1wbGVzLCB1bnNpZ25lZCBuQ2hhbm5lbHMpCi17CitzdGF0aWMgdm9pZCBjb3B5VHJlc3Bhc3MoCisgICAgICAgIHNob3J0ICogLyogZHN0ICovLAorICAgICAgICBjb25zdCBpbnQgKmNvbnN0ICogLyogc3JjICovLAorICAgICAgICB1bnNpZ25lZCAvKiBuU2FtcGxlcyAqLywKKyAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7CiAgICAgVFJFU1BBU1MoKTsKIH0KIApAQCAtNzAwLDcgKzcyMSw3IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBGTEFDU291cmNlOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKQorc3RhdHVzX3QgRkxBQ1NvdXJjZTo6c3RhcnQoTWV0YURhdGEgKiAvKiBwYXJhbXMgKi8pCiB7CiAgICAgQUxPR1YoIkZMQUNTb3VyY2U6OnN0YXJ0Iik7CiAKQEAgLTc5Miw4ICs4MTMsNyBAQAogfQogCiBzcDxNZXRhRGF0YT4gRkxBQ0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncykKLXsKKyAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ID4gMCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9IVFRQQmFzZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9IVFRQQmFzZS5jcHAKaW5kZXggNWZhNGI2Zi4uMzIyOTFjOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSFRUUEJhc2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hUVFBCYXNlLmNwcApAQCAtMjAsMTcgKzIwLDEzIEBACiAKICNpbmNsdWRlICJpbmNsdWRlL0hUVFBCYXNlLmgiCiAKLSNpZiBDSFJPTUlVTV9BVkFJTEFCTEUKLSNpbmNsdWRlICJpbmNsdWRlL2Nocm9taXVtX2h0dHBfc3R1Yi5oIgotI2VuZGlmCi0KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgogCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxjdXRpbHMvcXRhZ3VpZC5oPgogCi0jaW5jbHVkZSA8Q29ubmVjdGl2aXR5TWFuYWdlci5oPgorI2luY2x1ZGUgPE5ldGRDbGllbnQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC00MCwzNCArMzYsNyBAQAogICAgICAgbVRvdGFsVHJhbnNmZXJCeXRlcygwKSwKICAgICAgIG1QcmV2QmFuZHdpZHRoTWVhc3VyZVRpbWVVcygwKSwKICAgICAgIG1QcmV2RXN0aW1hdGVkQmFuZFdpZHRoS2JwcygwKSwKLSAgICAgIG1CYW5kV2lkdGhDb2xsZWN0RnJlcU1zKDUwMDApLAotICAgICAgbVVJRFZhbGlkKGZhbHNlKSwKLSAgICAgIG1VSUQoMCkgewotfQotCi0vLyBzdGF0aWMKLXNwPEhUVFBCYXNlPiBIVFRQQmFzZTo6Q3JlYXRlKHVpbnQzMl90IGZsYWdzKSB7Ci0jaWYgQ0hST01JVU1fQVZBSUxBQkxFCi0gICAgICAgIEhUVFBCYXNlICpkYXRhU291cmNlID0gY3JlYXRlQ2hyb21pdW1IVFRQRGF0YVNvdXJjZShmbGFncyk7Ci0gICAgICAgIGlmIChkYXRhU291cmNlKSB7Ci0gICAgICAgICAgIHJldHVybiBkYXRhU291cmNlOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICB7Ci0gICAgICAgIFRSRVNQQVNTKCk7Ci0KLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotfQotCi0vLyBzdGF0aWMKLXN0YXR1c190IEhUVFBCYXNlOjpVcGRhdGVQcm94eUNvbmZpZygKLSAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgaW50MzJfdCBwb3J0LCBjb25zdCBjaGFyICpleGNsdXNpb25MaXN0KSB7Ci0jaWYgQ0hST01JVU1fQVZBSUxBQkxFCi0gICAgcmV0dXJuIFVwZGF0ZUNocm9taXVtSFRUUERhdGFTb3VyY2VQcm94eUNvbmZpZyhob3N0LCBwb3J0LCBleGNsdXNpb25MaXN0KTsKLSNlbHNlCi0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotI2VuZGlmCisgICAgICBtQmFuZFdpZHRoQ29sbGVjdEZyZXFNcyg1MDAwKSB7CiB9CiAKIHZvaWQgSFRUUEJhc2U6OmFkZEJhbmR3aWR0aE1lYXN1cmVtZW50KApAQCAtMTM1LDIxICsxMDQsNiBAQAogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBIVFRQQmFzZTo6c2V0VUlEKHVpZF90IHVpZCkgewotICAgIG1VSURWYWxpZCA9IHRydWU7Ci0gICAgbVVJRCA9IHVpZDsKLX0KLQotYm9vbCBIVFRQQmFzZTo6Z2V0VUlEKHVpZF90ICp1aWQpIGNvbnN0IHsKLSAgICBpZiAoIW1VSURWYWxpZCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgKnVpZCA9IG1VSUQ7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQogLy8gc3RhdGljCiB2b2lkIEhUVFBCYXNlOjpSZWdpc3RlclNvY2tldFVzZXJUYWcoaW50IHNvY2tmZCwgdWlkX3QgdWlkLCB1aW50MzJfdCBrVGFnKSB7CiAgICAgaW50IHJlcyA9IHF0YWd1aWRfdGFnU29ja2V0KHNvY2tmZCwga1RhZywgdWlkKTsKQEAgLTE2OCw3ICsxMjIsNyBAQAogCiAvLyBzdGF0aWMKIHZvaWQgSFRUUEJhc2U6OlJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW50IHNvY2tmZCwgdWlkX3QgdWlkKSB7Ci0gICAgQ29ubmVjdGl2aXR5TWFuYWdlcjo6bWFya1NvY2tldEFzVXNlcihzb2NrZmQsIHVpZCk7CisgICAgc2V0TmV0d29ya0ZvclVzZXIodWlkLCBzb2NrZmQpOwogfQogCiAvLyBzdGF0aWMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QM0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUDNFeHRyYWN0b3IuY3BwCmluZGV4IDM4MGRhYjQuLjRhNjMxNTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QM0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVAzRXh0cmFjdG9yLmNwcApAQCAtMzk4LDcgKzM5OCw4IEBACiAgICAgICAgICAgICBtU2Vla2VyKTsKIH0KIAotc3A8TWV0YURhdGE+IE1QM0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YShzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKSB7CitzcDxNZXRhRGF0YT4gTVAzRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggIT0gMCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHMlRTV3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUcyVFNXcml0ZXIuY3BwCmluZGV4IGM5ZWQ1YmIuLjk4NTZmOTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUcyVFNXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUcyVFNXcml0ZXIuY3BwCkBAIC01NTUsNyArNTU1LDcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE1QRUcyVFNXcml0ZXI6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbSkgeworc3RhdHVzX3QgTVBFRzJUU1dyaXRlcjo6c3RhcnQoTWV0YURhdGEgKiAvKiBwYXJhbSAqLykgewogICAgIENIRUNLKCFtU3RhcnRlZCk7CiAKICAgICBtU3RhcnRlZCA9IHRydWU7CkBAIC01OTYsNyArNTk2LDggQEAKICAgICByZXR1cm4gIW1TdGFydGVkIHx8IChtTnVtU291cmNlc0RvbmUgPT0gbVNvdXJjZXMuc2l6ZSgpID8gdHJ1ZSA6IGZhbHNlKTsKIH0KIAotc3RhdHVzX3QgTVBFRzJUU1dyaXRlcjo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MpIHsKK3N0YXR1c190IE1QRUcyVFNXcml0ZXI6OmR1bXAoCisgICAgICAgIGludCAvKiBmZCAqLywgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmIC8qIGFyZ3MgKi8pIHsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTY4MSw3ICs2ODIsNyBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBBTE9HVigid3JpdGluZyBhY2Nlc3MgdW5pdCBhdCB0aW1lICUuMmYgc2VjcyAoaW5kZXggJWQpIiwKKyAgICAgICAgICAgICAgICBBTE9HVigid3JpdGluZyBhY2Nlc3MgdW5pdCBhdCB0aW1lICUuMmYgc2VjcyAoaW5kZXggJXp1KSIsCiAgICAgICAgICAgICAgICAgICAgICBtaW5UaW1lVXMgLyAxRTYsIG1pbkluZGV4KTsKIAogICAgICAgICAgICAgICAgIHNvdXJjZSA9IG1Tb3VyY2VzLmVkaXRJdGVtQXQobWluSW5kZXgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRFeHRyYWN0b3IuY3BwCmluZGV4IDBlOTgxMWQuLjM4NzU0ZTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0RXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNEV4dHJhY3Rvci5jcHAKQEAgLTE2LDE3ICsxNiwxOSBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIk1QRUc0RXh0cmFjdG9yIgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlICJpbmNsdWRlL01QRUc0RXh0cmFjdG9yLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9TYW1wbGVUYWJsZS5oIgogI2luY2x1ZGUgImluY2x1ZGUvRVNEUy5oIgogCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC01MSwxMSArNTMsMTMgQEAKIGNsYXNzIE1QRUc0U291cmNlIDogcHVibGljIE1lZGlhU291cmNlIHsKIHB1YmxpYzoKICAgICAvLyBDYWxsZXIgcmV0YWlucyBvd25lcnNoaXAgb2YgYm90aCAiZGF0YVNvdXJjZSIgYW5kICJzYW1wbGVUYWJsZSIuCi0gICAgTVBFRzRTb3VyY2UoY29uc3Qgc3A8TWV0YURhdGE+ICZmb3JtYXQsCisgICAgTVBFRzRTb3VyY2UoY29uc3Qgc3A8TVBFRzRFeHRyYWN0b3I+ICZvd25lciwKKyAgICAgICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJmZvcm1hdCwKICAgICAgICAgICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmZGF0YVNvdXJjZSwKICAgICAgICAgICAgICAgICBpbnQzMl90IHRpbWVTY2FsZSwKICAgICAgICAgICAgICAgICBjb25zdCBzcDxTYW1wbGVUYWJsZT4gJnNhbXBsZVRhYmxlLAogICAgICAgICAgICAgICAgIFZlY3RvcjxTaWR4RW50cnk+ICZzaWR4LAorICAgICAgICAgICAgICAgIGNvbnN0IFRyZXggKnRyZXgsCiAgICAgICAgICAgICAgICAgb2ZmNjRfdCBmaXJzdE1vb2ZPZmZzZXQpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCk7CkBAIC03Miw2ICs3Niw4IEBACiBwcml2YXRlOgogICAgIE11dGV4IG1Mb2NrOwogCisgICAgLy8ga2VlcCB0aGUgTVBFRzRFeHRyYWN0b3IgYXJvdW5kLCBzaW5jZSB3ZSdyZSByZWZlcmVuY2luZyBpdHMgZGF0YQorICAgIHNwPE1QRUc0RXh0cmFjdG9yPiBtT3duZXI7CiAgICAgc3A8TWV0YURhdGE+IG1Gb3JtYXQ7CiAgICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7CiAgICAgaW50MzJfdCBtVGltZXNjYWxlOwpAQCAtNzksNiArODUsNyBAQAogICAgIHVpbnQzMl90IG1DdXJyZW50U2FtcGxlSW5kZXg7CiAgICAgdWludDMyX3QgbUN1cnJlbnRGcmFnbWVudEluZGV4OwogICAgIFZlY3RvcjxTaWR4RW50cnk+ICZtU2VnbWVudHM7CisgICAgY29uc3QgVHJleCAqbVRyZXg7CiAgICAgb2ZmNjRfdCBtRmlyc3RNb29mT2Zmc2V0OwogICAgIG9mZjY0X3QgbUN1cnJlbnRNb29mT2Zmc2V0OwogICAgIG9mZjY0X3QgbU5leHRNb29mT2Zmc2V0OwpAQCAtMTAwLDYgKzEwNyw3IEBACiAgICAgdWludDY0X3QqIG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHM7CiAKICAgICBib29sIG1Jc0FWQzsKKyAgICBib29sIG1Jc0hFVkM7CiAgICAgc2l6ZV90IG1OQUxMZW5ndGhTaXplOwogCiAgICAgYm9vbCBtU3RhcnRlZDsKQEAgLTE0NSw2ICsxNTMsNyBAQAogICAgICAgICBvZmY2NF90IG9mZnNldDsKICAgICAgICAgc2l6ZV90IHNpemU7CiAgICAgICAgIHVpbnQzMl90IGR1cmF0aW9uOworICAgICAgICBpbnQzMl90IGNvbXBvc2l0aW9uT2Zmc2V0OwogICAgICAgICB1aW50OF90IGl2WzE2XTsKICAgICAgICAgVmVjdG9yPHNpemVfdD4gY2xlYXJzaXplczsKICAgICAgICAgVmVjdG9yPHNpemVfdD4gZW5jcnlwdGVkc2l6ZXM7CkBAIC0yNjQsNyArMjczLDcgQEAKICAgICBjb25zdCB1aW50OF90ICpkYXRhID0gKGNvbnN0IHVpbnQ4X3QgKilfZGF0YTsKICAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKICAgICB3aGlsZSAob2Zmc2V0IDwgc2l6ZSkgewotICAgICAgICBwcmludGYoIjB4JTA0eCAgIiwgb2Zmc2V0KTsKKyAgICAgICAgcHJpbnRmKCIweCUwNHp4ICAiLCBvZmZzZXQpOwogCiAgICAgICAgIHNpemVfdCBuID0gc2l6ZSAtIG9mZnNldDsKICAgICAgICAgaWYgKG4gPiAxNikgewpAQCAtMzIxLDYgKzMzMCw5IEBACiAgICAgICAgIGNhc2UgRk9VUkNDKCdhJywgJ3YnLCAnYycsICcxJyk6CiAgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfVklERU9fQVZDOwogCisgICAgICAgIGNhc2UgRk9VUkNDKCdoJywgJ3YnLCAnYycsICcxJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdoJywgJ2UnLCAndicsICcxJyk6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQzsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIENIRUNLKCEic2hvdWxkIG5vdCBiZSBoZXJlLiIpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0zNDMsOCArMzU1LDcgQEAKIH0KIAogTVBFRzRFeHRyYWN0b3I6Ok1QRUc0RXh0cmFjdG9yKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UpCi0gICAgOiBtU2lkeER1cmF0aW9uKDApLAotICAgICAgbU1vb2ZPZmZzZXQoMCksCisgICAgOiBtTW9vZk9mZnNldCgwKSwKICAgICAgIG1EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICBtSW5pdENoZWNrKE5PX0lOSVQpLAogICAgICAgbUhhc1ZpZGVvKGZhbHNlKSwKQEAgLTQwOSw3ICs0MjAsNyBAQAogICAgICAgICB0cmFjayA9IHRyYWNrLT5uZXh0OwogICAgIH0KIAotICAgIEFMT0dWKCJNUEVHNEV4dHJhY3Rvcjo6Y291bnRUcmFja3M6ICVkIHRyYWNrcyIsIG4pOworICAgIEFMT0dWKCJNUEVHNEV4dHJhY3Rvcjo6Y291bnRUcmFja3M6ICV6dSB0cmFja3MiLCBuKTsKICAgICByZXR1cm4gbjsKIH0KIApAQCAtNDgyLDggKzQ5MywxOCBAQAogICAgIG9mZjY0X3Qgb2Zmc2V0ID0gMDsKICAgICBzdGF0dXNfdCBlcnI7CiAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgb2ZmNjRfdCBvcmlnX29mZnNldCA9IG9mZnNldDsKICAgICAgICAgZXJyID0gcGFyc2VDaHVuaygmb2Zmc2V0LCAwKTsKLSAgICAgICAgaWYgKGVyciA9PSBPSykgeworCisgICAgICAgIGlmIChlcnIgIT0gT0sgJiYgZXJyICE9IFVOS05PV05fRVJST1IpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKG9mZnNldCA8PSBvcmlnX29mZnNldCkgeworICAgICAgICAgICAgLy8gb25seSBjb250aW51ZSBwYXJzaW5nIGlmIHRoZSBvZmZzZXQgd2FzIGFkdmFuY2VkLAorICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIHdlIG1pZ2h0IGVuZCB1cCBpbiBhbiBpbmZpbml0ZSBsb29wCisgICAgICAgICAgICBBTE9HRSgiZGlkIG5vdCBhZHZhbmNlOiAweCVsbGQtPjB4JWxsZCIsIG9yaWdfb2Zmc2V0LCBvZmZzZXQpOworICAgICAgICAgICAgZXJyID0gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoZXJyID09IE9LKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCkBAIC00OTIsMTIgKzUxMywxMiBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgdWludDMyX3QgY2h1bmtfdHlwZSA9IG50b2hsKGhkclsxXSk7Ci0gICAgICAgIGlmIChjaHVua190eXBlID09IEZPVVJDQygncycsICdpJywgJ2QnLCAneCcpKSB7Ci0gICAgICAgICAgICAvLyBwYXJzZSB0aGUgc2lkeCBib3ggdG9vCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfSBlbHNlIGlmIChjaHVua190eXBlID09IEZPVVJDQygnbScsICdvJywgJ28nLCAnZicpKSB7CisgICAgICAgIGlmIChjaHVua190eXBlID09IEZPVVJDQygnbScsICdvJywgJ28nLCAnZicpKSB7CiAgICAgICAgICAgICAvLyBzdG9yZSB0aGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBzZWdtZW50CiAgICAgICAgICAgICBtTW9vZk9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgfSBlbHNlIGlmIChjaHVua190eXBlICE9IEZPVVJDQygnbScsICdkJywgJ2EnLCAndCcpKSB7CisgICAgICAgICAgICAvLyBrZWVwIHBhcnNpbmcgdW50aWwgd2UgZ2V0IHRvIHRoZSBkYXRhCisgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICB9CkBAIC01MDksOCArNTMwLDYgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCAiYXVkaW8vbXA0Iik7CiAgICAgICAgIH0KLQotICAgICAgICBtSW5pdENoZWNrID0gT0s7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbUluaXRDaGVjayA9IGVycjsKICAgICB9CkBAIC01NzksNyArNTk4LDggQEAKICAgICByZXR1cm4gc2l6ZTsKIH0KIAotc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlRHJtU0lORihvZmY2NF90ICpvZmZzZXQsIG9mZjY0X3QgZGF0YV9vZmZzZXQpIHsKK3N0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZURybVNJTkYoCisgICAgICAgIG9mZjY0X3QgKiAvKiBvZmZzZXQgKi8sIG9mZjY0X3QgZGF0YV9vZmZzZXQpIHsKICAgICB1aW50OF90IHVwZGF0ZUlkVGFnOwogICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0LCAmdXBkYXRlSWRUYWcsIDEpIDwgMSkgewogICAgICAgICByZXR1cm4gRVJST1JfSU87CkBAIC03NjgsOCArNzg4LDI1IEBACiAgICAgICAgICAgICAvLyBUaGUgc21hbGxlc3QgdmFsaWQgY2h1bmsgaXMgMTYgYnl0ZXMgbG9uZyBpbiB0aGlzIGNhc2UuCiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CisgICAgfSBlbHNlIGlmIChjaHVua19zaXplID09IDApIHsKKyAgICAgICAgaWYgKGRlcHRoID09IDApIHsKKyAgICAgICAgICAgIC8vIGF0b20gZXh0ZW5kcyB0byBlbmQgb2YgZmlsZQorICAgICAgICAgICAgb2ZmNjRfdCBzb3VyY2VTaXplOworICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5nZXRTaXplKCZzb3VyY2VTaXplKSA9PSBPSykgeworICAgICAgICAgICAgICAgIGNodW5rX3NpemUgPSAoc291cmNlU2l6ZSAtICpvZmZzZXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBYWFggY291bGQgd2UganVzdCBwaWNrIGEgInN1ZmZpY2llbnRseSBsYXJnZSIgdmFsdWUgaGVyZT8KKyAgICAgICAgICAgICAgICBBTE9HRSgiYXRvbSBzaXplIGlzIDAsIGFuZCBkYXRhIHNvdXJjZSBoYXMgbm8gc2l6ZSIpOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBub3QgYWxsb3dlZCBmb3Igbm9uLXRvcGxldmVsIGF0b21zLCBza2lwIGl0CisgICAgICAgICAgICAqb2Zmc2V0ICs9IDQ7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKGNodW5rX3NpemUgPCA4KSB7CiAgICAgICAgIC8vIFRoZSBzbWFsbGVzdCB2YWxpZCBjaHVuayBpcyA4IGJ5dGVzIGxvbmcuCisgICAgICAgIEFMT0dFKCJpbnZhbGlkIGNodW5rIHNpemU6ICUiIFBSSXU2NCwgY2h1bmtfc2l6ZSk7CiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCkBAIC03ODAsNyArODE3LDcgQEAKICNpZiAwCiAgICAgc3RhdGljIGNvbnN0IGNoYXIga1doaXRlc3BhY2VbXSA9ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjsKICAgICBjb25zdCBjaGFyICppbmRlbnQgPSAma1doaXRlc3BhY2Vbc2l6ZW9mKGtXaGl0ZXNwYWNlKSAtIDEgLSAyICogZGVwdGhdOwotICAgIHByaW50ZigiJXNmb3VuZCBjaHVuayAnJXMnIG9mIHNpemUgJWxsZFxuIiwgaW5kZW50LCBjaHVuaywgY2h1bmtfc2l6ZSk7CisgICAgcHJpbnRmKCIlc2ZvdW5kIGNodW5rICclcycgb2Ygc2l6ZSAlIiBQUkl1NjQgIlxuIiwgaW5kZW50LCBjaHVuaywgY2h1bmtfc2l6ZSk7CiAKICAgICBjaGFyIGJ1ZmZlclsyNTZdOwogICAgIHNpemVfdCBuID0gY2h1bmtfc2l6ZTsKQEAgLTgzNiw3ICs4NzMsNyBAQAogICAgICAgICBjYXNlIEZPVVJDQygnZScsICdkJywgJ3QnLCAncycpOgogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoJ3MnLCAndCcsICdiJywgJ2wnKSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJzYW1wbGVUYWJsZSBjaHVuayBpcyAlZCBieXRlcyBsb25nLiIsIChzaXplX3QpY2h1bmtfc2l6ZSk7CisgICAgICAgICAgICAgICAgQUxPR1YoInNhbXBsZVRhYmxlIGNodW5rIGlzICUiIFBSSXU2NCAiIGJ5dGVzIGxvbmcuIiwgY2h1bmtfc2l6ZSk7CiAKICAgICAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPmZsYWdzKCkKICAgICAgICAgICAgICAgICAgICAgICAgICYgKERhdGFTb3VyY2U6OmtXYW50c1ByZWZldGNoaW5nCkBAIC05MjgsNiArOTY1LDggQEAKIAogICAgICAgICBjYXNlIEZPVVJDQygnZScsICdsJywgJ3MnLCAndCcpOgogICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIC8vIFNlZSAxNDQ5Ni0xMiA4LjYuNgogICAgICAgICAgICAgdWludDhfdCB2ZXJzaW9uOwogICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQsICZ2ZXJzaW9uLCAxKSA8IDEpIHsKQEAgLTk5MCwxMiArMTAyOSwxMyBAQAogICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5RW5jb2RlclBhZGRpbmcsIHBhZGRpbmdzYW1wbGVzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgRk9VUkNDKCdmJywgJ3InLCAnbScsICdhJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKwogICAgICAgICAgICAgdWludDMyX3Qgb3JpZ2luYWxfZm91cmNjOwogICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQsICZvcmlnaW5hbF9mb3VyY2MsIDQpIDwgNCkgewogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKQEAgLTEwMDksMTIgKzEwNDksMTMgQEAKICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBudW1fY2hhbm5lbHMpOwogICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVfcmF0ZSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgRk9VUkNDKCd0JywgJ2UnLCAnbicsICdjJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKwogICAgICAgICAgICAgaWYgKGNodW5rX3NpemUgPCAzMikgewogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CkBAIC0xMDU5LDIzICsxMTAwLDI1IEBACiAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgZGVmYXVsdEFsZ29yaXRobUlkKTsKICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDMyKGtLZXlDcnlwdG9EZWZhdWx0SVZTaXplLCBkZWZhdWx0SVZTaXplKTsKICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldERhdGEoa0tleUNyeXB0b0tleSwgJ3RlbmMnLCBkZWZhdWx0S2V5SWQsIDE2KTsKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAnaycsICdoJywgJ2QnKToKICAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnI7CiAgICAgICAgICAgICBpZiAoKGVyciA9IHBhcnNlVHJhY2tIZWFkZXIoZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSkpICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIEZPVVJDQygncCcsICdzJywgJ3MnLCAnaCcpOgogICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIFBzc2hJbmZvIHBzc2g7CiAKICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0ICsgNCwgJnBzc2gudXVpZCwgMTYpIDwgMTYpIHsKQEAgLTExMDQsMTIgKzExNDcsMTMgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1Qc3NoLnB1c2hfYmFjayhwc3NoKTsKIAotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIEZPVVJDQygnbScsICdkJywgJ2gnLCAnZCcpOgogICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPCA0KSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KQEAgLTExNDAsNiArMTE4NCw4IEBACiAKICAgICAgICAgICAgIG1MYXN0VHJhY2stPnRpbWVzY2FsZSA9IG50b2hsKHRpbWVzY2FsZSk7CiAKKyAgICAgICAgICAgIC8vIDE0NDk2LTEyIHNheXMgYWxsIG9uZXMgbWVhbnMgaW5kZXRlcm1pbmF0ZSwgYnV0IHNvbWUgZmlsZXMgc2VlbSB0byB1c2UKKyAgICAgICAgICAgIC8vIDAgaW5zdGVhZC4gV2UgdHJlYXQgYm90aCB0aGUgc2FtZS4KICAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb24gPSAwOwogICAgICAgICAgICAgaWYgKHZlcnNpb24gPT0gMSkgewogICAgICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KApAQCAtMTE0Nyw3ICsxMTkzLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIDwgKHNzaXplX3Qpc2l6ZW9mKGR1cmF0aW9uKSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gbnRvaDY0KGR1cmF0aW9uKTsKKyAgICAgICAgICAgICAgICBpZiAoZHVyYXRpb24gIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24gPSBudG9oNjQoZHVyYXRpb24pOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgdWludDMyX3QgZHVyYXRpb24zMjsKICAgICAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKQEAgLTExNTUsMTMgKzEyMDMsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIDwgKHNzaXplX3Qpc2l6ZW9mKGR1cmF0aW9uMzIpKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gZmZtcGVnIHNldHMgZHVyYXRpb24gdG8gLTEsIHdoaWNoIGlzIGluY29ycmVjdC4KICAgICAgICAgICAgICAgICBpZiAoZHVyYXRpb24zMiAhPSAweGZmZmZmZmZmKSB7CiAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gbnRvaGwoZHVyYXRpb24zMik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlEdXJhdGlvbiwgKGR1cmF0aW9uICogMTAwMDAwMCkgLyBtTGFzdFRyYWNrLT50aW1lc2NhbGUpOworICAgICAgICAgICAgaWYgKGR1cmF0aW9uICE9IDApIHsKKyAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlEdXJhdGlvbiwgKGR1cmF0aW9uICogMTAwMDAwMCkgLyBtTGFzdFRyYWNrLT50aW1lc2NhbGUpOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB1aW50OF90IGxhbmdbMl07CiAgICAgICAgICAgICBvZmY2NF90IGxhbmdfb2Zmc2V0OwpAQCAtMTE5MCw3ICsxMjM5LDYgQEAKICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldENTdHJpbmcoCiAgICAgICAgICAgICAgICAgICAgIGtLZXlNZWRpYUxhbmd1YWdlLCBsYW5nX2NvZGUpOwogCi0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xMzAwLDYgKzEzNDgsOCBAQAogICAgICAgICBjYXNlIEZPVVJDQygnSCcsICcyJywgJzYnLCAnMycpOgogICAgICAgICBjYXNlIEZPVVJDQygnaCcsICcyJywgJzYnLCAnMycpOgogICAgICAgICBjYXNlIEZPVVJDQygnYScsICd2JywgJ2MnLCAnMScpOgorICAgICAgICBjYXNlIEZPVVJDQygnaCcsICd2JywgJ2MnLCAnMScpOgorICAgICAgICBjYXNlIEZPVVJDQygnaCcsICdlJywgJ3YnLCAnMScpOgogICAgICAgICB7CiAgICAgICAgICAgICBtSGFzVmlkZW8gPSB0cnVlOwogCkBAIC0xMzU3LDExICsxNDA3LDEyIEBACiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2FtcGxlVGFibGUtPnNldENodW5rT2Zmc2V0UGFyYW1zKAogICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtfdHlwZSwgZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CiAKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKwogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTEzNzEsMTEgKzE0MjIsMTIgQEAKICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZS0+c2V0U2FtcGxlVG9DaHVua1BhcmFtcygKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOwogCisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xMzg2LDYgKzE0MzgsOCBAQAogICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlLT5zZXRTYW1wbGVTaXplUGFyYW1zKAogICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtfdHlwZSwgZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CiAKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKwogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9CkBAIC0xNDM4LDcgKzE0OTIsNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCBtYXhfc2l6ZSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAKICAgICAgICAgICAgIC8vIE5PVEU6IHNldHRpbmcgYW5vdGhlciBwaWVjZSBvZiBtZXRhZGF0YSBpbnZhbGlkYXRlcyBhbnkgcG9pbnRlcnMgKHN1Y2ggYXMgdGhlCiAgICAgICAgICAgICAvLyBtaW1ldHlwZSkgcHJldmlvdXNseSBvYnRhaW5lZCwgc28gZG9uJ3QgY2FjaGUgdGhlbS4KQEAgLTE0NjIsNiArMTUxNSw4IEBACiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAndCcsICd0JywgJ3MnKToKICAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPQogICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlLT5zZXRUaW1lVG9TYW1wbGVQYXJhbXMoCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKQEAgLTE0NzAsMTIgKzE1MjUsMTMgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgRk9VUkNDKCdjJywgJ3QnLCAndCcsICdzJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0KICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZS0+c2V0Q29tcG9zaXRpb25UaW1lVG9TYW1wbGVQYXJhbXMoCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKQEAgLTE0ODQsMTIgKzE1NDAsMTMgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ3QnLCAncycsICdzJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0KICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZS0+c2V0U3luY1NhbXBsZVBhcmFtcygKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOwpAQCAtMTQ5OCwxMyArMTU1NSwxNCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgLy8gQHh5egogICAgICAgICBjYXNlIEZPVVJDQygnXHhBOScsICd4JywgJ3knLCAneicpOgogICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIC8vIEJlc3QgY2FzZSB0aGUgdG90YWwgZGF0YSBsZW5ndGggaW5zaWRlICJAeHl6IiBib3gKICAgICAgICAgICAgIC8vIHdvdWxkIGJlIDgsIGZvciBpbnN0YW5jZSAiQHh5eiIgKyAiXHgwMFx4MDRceDE1XHhjNyIgKyAiMCswLyIsCiAgICAgICAgICAgICAvLyB3aGVyZSAiXHgwMFx4MDQiIGlzIHRoZSB0ZXh0IHN0cmluZyBsZW5ndGggd2l0aCB2YWx1ZSA9IDQsCkBAIC0xNTMzLDEyICsxNTkxLDEzIEBACiAKICAgICAgICAgICAgIGJ1ZmZlcltsb2NhdGlvbl9sZW5ndGhdID0gJ1wwJzsKICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEtPnNldENTdHJpbmcoa0tleUxvY2F0aW9uLCBidWZmZXIpOwotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIEZPVVJDQygnZScsICdzJywgJ2QnLCAncycpOgogICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPCA0KSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KQEAgLTE1NzYsMTIgKzE2MzUsMTMgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ2EnLCAndicsICdjJywgJ0MnKToKICAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCiAgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcihjaHVua19kYXRhX3NpemUpOwogCiAgICAgICAgICAgICBpZiAoYnVmZmVyLT5kYXRhKCkgPT0gTlVMTCkgewpAQCAtMTU5NywxMiArMTY1NywzMiBAQAogICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0RGF0YSgKICAgICAgICAgICAgICAgICAgICAga0tleUFWQ0MsIGtUeXBlQVZDQywgYnVmZmVyLT5kYXRhKCksIGNodW5rX2RhdGFfc2l6ZSk7CiAKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRk9VUkNDKCdoJywgJ3YnLCAnYycsICdDJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKGNodW5rX2RhdGFfc2l6ZSk7CisKKyAgICAgICAgICAgIGlmIChidWZmZXItPmRhdGEoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImIvMjg0NzEyMDYiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBidWZmZXItPmRhdGEoKSwgY2h1bmtfZGF0YV9zaXplKSA8IGNodW5rX2RhdGFfc2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0RGF0YSgKKyAgICAgICAgICAgICAgICAgICAga0tleUhWQ0MsIGtUeXBlSFZDQywgYnVmZmVyLT5kYXRhKCksIGNodW5rX2RhdGFfc2l6ZSk7CisKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ2QnLCAnMicsICc2JywgJzMnKToKICAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIGQyNjMgY29udGFpbnMgYSBmaXhlZCA3IGJ5dGVzIHBhcnQ6CiAgICAgICAgICAgICAgKiAgIHZlbmRvciAtIDQgYnl0ZXMKQEAgLTE2MjgsNyArMTcwOCw2IEBACiAKICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldERhdGEoa0tleUQyNjMsIGtUeXBlRDI2MywgYnVmZmVyLCBjaHVua19kYXRhX3NpemUpOwogCi0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xNjM2LDExICsxNzE1LDEzIEBACiAgICAgICAgIHsKICAgICAgICAgICAgIHVpbnQ4X3QgYnVmZmVyWzRdOwogICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IChvZmY2NF90KXNpemVvZihidWZmZXIpKSB7CisgICAgICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGJ1ZmZlciwgNCkgPCA0KSB7CisgICAgICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKICAgICAgICAgICAgIH0KIApAQCAtMTY3NCw2ICsxNzU1LDggQEAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ24nLCAnYScsICdtJywgJ2UnKToKICAgICAgICAgY2FzZSBGT1VSQ0MoJ2QnLCAnYScsICd0JywgJ2EnKToKICAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCiAgICAgICAgICAgICBpZiAobVBhdGguc2l6ZSgpID09IDYgJiYgdW5kZXJNZXRhRGF0YVBhdGgobVBhdGgpKSB7CiAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VJVHVuZXNNZXRhRGF0YShkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKIApAQCAtMTY4MiwxNyArMTc2NSwxOCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIEZPVVJDQygnbScsICd2JywgJ2gnLCAnZCcpOgogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgMjQpIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKworICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IDMyKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgdWludDhfdCBoZWFkZXJbMjRdOworICAgICAgICAgICAgdWludDhfdCBoZWFkZXJbMzJdOwogICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkKICAgICAgICAgICAgICAgICAgICAgPCAoc3NpemVfdClzaXplb2YoaGVhZGVyKSkgewpAQCAtMTcwMCwxNCArMTc4NCwyNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB1aW50NjRfdCBjcmVhdGlvblRpbWU7CisgICAgICAgICAgICB1aW50NjRfdCBkdXJhdGlvbiA9IDA7CiAgICAgICAgICAgICBpZiAoaGVhZGVyWzBdID09IDEpIHsKICAgICAgICAgICAgICAgICBjcmVhdGlvblRpbWUgPSBVNjRfQVQoJmhlYWRlcls0XSk7CiAgICAgICAgICAgICAgICAgbUhlYWRlclRpbWVzY2FsZSA9IFUzMl9BVCgmaGVhZGVyWzIwXSk7CisgICAgICAgICAgICAgICAgZHVyYXRpb24gPSBVNjRfQVQoJmhlYWRlclsyNF0pOworICAgICAgICAgICAgICAgIGlmIChkdXJhdGlvbiA9PSAweGZmZmZmZmZmZmZmZmZmZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24gPSAwOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAoaGVhZGVyWzBdICE9IDApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBjcmVhdGlvblRpbWUgPSBVMzJfQVQoJmhlYWRlcls0XSk7CiAgICAgICAgICAgICAgICAgbUhlYWRlclRpbWVzY2FsZSA9IFUzMl9BVCgmaGVhZGVyWzEyXSk7CisgICAgICAgICAgICAgICAgdWludDMyX3QgZDMyID0gVTMyX0FUKCZoZWFkZXJbMTZdKTsKKyAgICAgICAgICAgICAgICBpZiAoZDMyID09IDB4ZmZmZmZmZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgZDMyID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZHVyYXRpb24gPSBkMzI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZHVyYXRpb24gIT0gMCkgeworICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb24gKiAxMDAwMDAwIC8gbUhlYWRlclRpbWVzY2FsZSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIFN0cmluZzggczsKQEAgLTE3MTUsNyArMTgxMiw1MCBAQAogCiAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXRDU3RyaW5nKGtLZXlEYXRlLCBzLnN0cmluZygpKTsKIAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygnbScsICdlJywgJ2gnLCAnZCcpOgorICAgICAgICB7CiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKKyAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPCA4KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDhfdCBmbGFnc1s0XTsKKyAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGZsYWdzLCBzaXplb2YoZmxhZ3MpKQorICAgICAgICAgICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZihmbGFncykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQ2NF90IGR1cmF0aW9uID0gMDsKKyAgICAgICAgICAgIGlmIChmbGFnc1swXSA9PSAxKSB7CisgICAgICAgICAgICAgICAgLy8gNjQgYml0CisgICAgICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IDEyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1EYXRhU291cmNlLT5nZXRVSW50NjQoZGF0YV9vZmZzZXQgKyA0LCAmZHVyYXRpb24pOworICAgICAgICAgICAgICAgIGlmIChkdXJhdGlvbiA9PSAweGZmZmZmZmZmZmZmZmZmZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZmxhZ3NbMF0gPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIDMyIGJpdAorICAgICAgICAgICAgICAgIHVpbnQzMl90IGQzMjsKKyAgICAgICAgICAgICAgICBtRGF0YVNvdXJjZS0+Z2V0VUludDMyKGRhdGFfb2Zmc2V0ICsgNCwgJmQzMik7CisgICAgICAgICAgICAgICAgaWYgKGQzMiA9PSAweGZmZmZmZmZmKSB7CisgICAgICAgICAgICAgICAgICAgIGQzMiA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gZDMyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZHVyYXRpb24gIT0gMCkgeworICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb24gKiAxMDAwMDAwIC8gbUhlYWRlclRpbWVzY2FsZSk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTE3MzYsNiArMTg3Niw4IEBACiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ2gnLCAnZCcsICdsJywgJ3InKToKICAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCiAgICAgICAgICAgICB1aW50MzJfdCBidWZmZXI7CiAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0ICsgOCwgJmJ1ZmZlciwgNCkgPCA0KSB7CkBAIC0xNzUyLDcgKzE4OTQsMjYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAncicsICdlJywgJ3gnKToKKyAgICAgICAgewogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCisgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgMjQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1aW50MzJfdCBkdXJhdGlvbjsKKyAgICAgICAgICAgIFRyZXggdHJleDsKKyAgICAgICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihkYXRhX29mZnNldCArIDQsICZ0cmV4LnRyYWNrX0lEKSB8fAorICAgICAgICAgICAgICAgICFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKGRhdGFfb2Zmc2V0ICsgOCwgJnRyZXguZGVmYXVsdF9zYW1wbGVfZGVzY3JpcHRpb25faW5kZXgpIHx8CisgICAgICAgICAgICAgICAgIW1EYXRhU291cmNlLT5nZXRVSW50MzIoZGF0YV9vZmZzZXQgKyAxMiwgJnRyZXguZGVmYXVsdF9zYW1wbGVfZHVyYXRpb24pIHx8CisgICAgICAgICAgICAgICAgIW1EYXRhU291cmNlLT5nZXRVSW50MzIoZGF0YV9vZmZzZXQgKyAxNiwgJnRyZXguZGVmYXVsdF9zYW1wbGVfc2l6ZSkgfHwKKyAgICAgICAgICAgICAgICAhbURhdGFTb3VyY2UtPmdldFVJbnQzMihkYXRhX29mZnNldCArIDIwLCAmdHJleC5kZWZhdWx0X3NhbXBsZV9mbGFncykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtVHJleC5hZGQodHJleCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xNzY5LDYgKzE5MzAsNyBAQAogICAgICAgICAgICAgaWYgKChjaHVua19zaXplID4gU0laRV9NQVgpIHx8IChTSVpFX01BWCAtIGNodW5rX3NpemUgPD0gc2l6ZSkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQorCiAgICAgICAgICAgICB1aW50OF90ICpidWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgdWludDhfdFtzaXplICsgY2h1bmtfc2l6ZV07CiAgICAgICAgICAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwpAQCAtMTc4Myw2ICsxOTQ1LDggQEAKICAgICAgICAgICAgICAgICBkZWxldGVbXSBidWZmZXI7CiAgICAgICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKIAorICAgICAgICAgICAgICAgIC8vIGFkdmFuY2UgcmVhZCBwb2ludGVyIHNvIHdlIGRvbid0IGVuZCB1cCByZWFkaW5nIHRoaXMgYWdhaW4KKyAgICAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogICAgICAgICAgICAgfQogCkBAIC0xNzk3LDYgKzE5NjEsOCBAQAogCiAgICAgICAgIGNhc2UgRk9VUkNDKCdjJywgJ28nLCAndicsICdyJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKwogICAgICAgICAgICAgaWYgKG1GaWxlTWV0YURhdGEgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJjaHVua19kYXRhX3NpemUgPSAlbGxkIGFuZCBkYXRhX29mZnNldCA9ICVsbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtfZGF0YV9zaXplLCBkYXRhX29mZnNldCk7CkBAIC0xODIzLDcgKzE5ODksNiBAQAogICAgICAgICAgICAgICAgICAgICBidWZmZXItPmRhdGEoKSArIGtTa2lwQnl0ZXNPZkRhdGFCb3gsIGNodW5rX2RhdGFfc2l6ZSAtIGtTa2lwQnl0ZXNPZkRhdGFCb3gpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xODM0LDI1ICsxOTk5LDI3IEBACiAgICAgICAgIGNhc2UgRk9VUkNDKCdhJywgJ2wnLCAnYicsICdtJyk6CiAgICAgICAgIGNhc2UgRk9VUkNDKCd5JywgJ3InLCAncicsICdjJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2UzR1BQTWV0YURhdGEoZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSwgZGVwdGgpOwogCiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIEZPVVJDQygnSScsICdEJywgJzMnLCAnMicpOgogICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPCA2KSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcGFyc2VJRDN2Mk1ldGFEYXRhKGRhdGFfb2Zmc2V0ICsgNik7CiAKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTE5NDQsNyArMjExMSw3IEBACiAgICAgICAgIG9mZnNldCArPSAxNjsKICAgICAgICAgc2l6ZSAtPSAxNjsKICAgICB9Ci0gICAgQUxPR1YoInNpZHggcHJlcy9vZmY6ICVMZC8lTGQiLCBlYXJsaWVzdFByZXNlbnRhdGlvblRpbWUsIGZpcnN0T2Zmc2V0KTsKKyAgICBBTE9HVigic2lkeCBwcmVzL29mZjogJSIgUFJJdTY0ICIvJSIgUFJJdTY0LCBlYXJsaWVzdFByZXNlbnRhdGlvblRpbWUsIGZpcnN0T2Zmc2V0KTsKIAogICAgIGlmIChzaXplIDwgNCkgewogICAgICAgICByZXR1cm4gLUVJTlZBTDsKQEAgLTE5NzYsOSArMjE0MywxMCBAQAogICAgICAgICAgICAgQUxPR1coInN1Yi1zaWR4IGJveGVzIG5vdCBzdXBwb3J0ZWQgeWV0Iik7CiAgICAgICAgIH0KICAgICAgICAgYm9vbCBzYXAgPSBkMyAmIDB4ODAwMDAwMDA7Ci0gICAgICAgIGJvb2wgc2FwdHlwZSA9IGQzID4+IDI4OwotICAgICAgICBpZiAoIXNhcCB8fCBzYXB0eXBlID4gMikgewotICAgICAgICAgICAgQUxPR1coIm5vdCBhIHN0cmVhbSBhY2Nlc3MgcG9pbnQsIG9yIHVuc3VwcG9ydGVkIHR5cGUiKTsKKyAgICAgICAgdWludDMyX3Qgc2FwdHlwZSA9IChkMyA+PiAyOCkgJiA3OworICAgICAgICBpZiAoIXNhcCB8fCAoc2FwdHlwZSAhPSAxICYmIHNhcHR5cGUgIT0gMikpIHsKKyAgICAgICAgICAgIC8vIHR5cGUgMSBhbmQgMiBhcmUgc3luYyBzYW1wbGVzCisgICAgICAgICAgICBBTE9HVygibm90IGEgc3RyZWFtIGFjY2VzcyBwb2ludCwgb3IgdW5zdXBwb3J0ZWQgdHlwZTogJTA4eCIsIGQzKTsKICAgICAgICAgfQogICAgICAgICB0b3RhbF9kdXJhdGlvbiArPSBkMjsKICAgICAgICAgb2Zmc2V0ICs9IDEyOwpAQCAtMTk4OSwxMiArMjE1NywxMSBAQAogICAgICAgICBtU2lkeEVudHJpZXMuYWRkKHNlKTsKICAgICB9CiAKLSAgICBtU2lkeER1cmF0aW9uID0gdG90YWxfZHVyYXRpb24gKiAxMDAwMDAwIC8gdGltZVNjYWxlOwotICAgIEFMT0dWKCJkdXJhdGlvbjogJWxsZCIsIG1TaWR4RHVyYXRpb24pOworICAgIHVpbnQ2NF90IHNpZHhEdXJhdGlvbiA9IHRvdGFsX2R1cmF0aW9uICogMTAwMDAwMCAvIHRpbWVTY2FsZTsKIAogICAgIGludDY0X3QgbWV0YUR1cmF0aW9uOwogICAgIGlmICghbUxhc3RUcmFjay0+bWV0YS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJm1ldGFEdXJhdGlvbikgfHwgbWV0YUR1cmF0aW9uID09IDApIHsKLSAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCBtU2lkeER1cmF0aW9uKTsKKyAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCBzaWR4RHVyYXRpb24pOwogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CkBAIC0yMjg3LDExICsyNDU0LDE0IEBACiB9CiAKIHN0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZTNHUFBNZXRhRGF0YShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUsIGludCBkZXB0aCkgewotICAgIGlmIChzaXplIDwgNCkgeworICAgIGlmIChzaXplIDwgNCB8fCBzaXplID09IFNJWkVfTUFYKSB7CiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCi0gICAgdWludDhfdCAqYnVmZmVyID0gbmV3IHVpbnQ4X3Rbc2l6ZV07CisgICAgdWludDhfdCAqYnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQ4X3Rbc2l6ZSArIDFdOworICAgIGlmIChidWZmZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKICAgICAgICAgICAgICAgICBvZmZzZXQsIGJ1ZmZlciwgc2l6ZSkgIT0gKHNzaXplX3Qpc2l6ZSkgewogICAgICAgICBkZWxldGVbXSBidWZmZXI7CkBAIC0yMzU3LDYgKzI1MjcsMTAgQEAKICAgICAgICAgaW50IGxlbjE2ID0gMDsgLy8gTnVtYmVyIG9mIFVURi0xNiBjaGFyYWN0ZXJzCiAKICAgICAgICAgLy8gc21hbGxlc3QgcG9zc2libGUgdmFsaWQgVVRGLTE2IHN0cmluZyB3IEJPTTogMHhmZSAweGZmIDB4MDAgMHgwMAorICAgICAgICBpZiAoc2l6ZSA8IDYpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKwogICAgICAgICBpZiAoc2l6ZSAtIDYgPj0gNCkgewogICAgICAgICAgICAgbGVuMTYgPSAoKHNpemUgLSA2KSAvIDIpIC0gMTsgLy8gZG9uJ3QgaW5jbHVkZSAweDAwMDAgdGVybWluYXRvcgogICAgICAgICAgICAgZnJhbWVkYXRhID0gKGNoYXIxNl90ICopKGJ1ZmZlciArIDYpOwpAQCAtMjM4MCw2ICsyNTU0LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChpc1VURjgpIHsKKyAgICAgICAgICAgIGJ1ZmZlcltzaXplXSA9IDA7CiAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXRDU3RyaW5nKG1ldGFkYXRhS2V5LCAoY29uc3QgY2hhciAqKWJ1ZmZlciArIDYpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gQ29udmVydCBmcm9tIFVURi0xNiBzdHJpbmcgdG8gVVRGLTggc3RyaW5nLgpAQCAtMjQ3MCwxMSArMjY0NSwyNyBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBBTE9HVigiZ2V0VHJhY2sgY2FsbGVkLCBwc3NoOiAlZCIsIG1Qc3NoLnNpemUoKSk7CiAKLSAgICByZXR1cm4gbmV3IE1QRUc0U291cmNlKAorICAgIFRyZXggKnRyZXggPSBOVUxMOworICAgIGludDMyX3QgdHJhY2tJZDsKKyAgICBpZiAodHJhY2stPm1ldGEtPmZpbmRJbnQzMihrS2V5VHJhY2tJRCwgJnRyYWNrSWQpKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyZXguc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIFRyZXggKnQgPSAmbVRyZXguZWRpdEl0ZW1BdChpbmRleCk7CisgICAgICAgICAgICBpZiAodC0+dHJhY2tfSUQgPT0gKHVpbnQzMl90KSB0cmFja0lkKSB7CisgICAgICAgICAgICAgICAgdHJleCA9IHQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiYi8yMTY1Nzk1NyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBBTE9HVigiZ2V0VHJhY2sgY2FsbGVkLCBwc3NoOiAlenUiLCBtUHNzaC5zaXplKCkpOworCisgICAgcmV0dXJuIG5ldyBNUEVHNFNvdXJjZSh0aGlzLAogICAgICAgICAgICAgdHJhY2stPm1ldGEsIG1EYXRhU291cmNlLCB0cmFjay0+dGltZXNjYWxlLCB0cmFjay0+c2FtcGxlVGFibGUsCi0gICAgICAgICAgICBtU2lkeEVudHJpZXMsIG1Nb29mT2Zmc2V0KTsKKyAgICAgICAgICAgIG1TaWR4RW50cmllcywgdHJleCwgbU1vb2ZPZmZzZXQpOwogfQogCiAvLyBzdGF0aWMKQEAgLTI0OTAsNiArMjY4MSwxMSBAQAogICAgICAgICAgICAgICAgIHx8IHR5cGUgIT0ga1R5cGVBVkNDKSB7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKSkgeworICAgICAgICBpZiAoIXRyYWNrLT5tZXRhLT5maW5kRGF0YShrS2V5SFZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgfHwgdHlwZSAhPSBrVHlwZUhWQ0MpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KQogICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKSkgewogICAgICAgICBpZiAoIXRyYWNrLT5tZXRhLT5maW5kRGF0YShrS2V5RVNEUywgJnR5cGUsICZkYXRhLCAmc2l6ZSkKQEAgLTI0OTgsMTQgKzI2OTQsNjcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmICghdHJhY2stPnNhbXBsZVRhYmxlLT5pc1ZhbGlkKCkpIHsKKyAgICBpZiAodHJhY2stPnNhbXBsZVRhYmxlID09IE5VTEwgfHwgIXRyYWNrLT5zYW1wbGVUYWJsZS0+aXNWYWxpZCgpKSB7CiAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIGFsbCB0aGUgbWV0YWRhdGEgd2UgbmVlZC4KKyAgICAgICAgQUxPR0UoInN0YmwgYXRvbSBtaXNzaW5nL2ludmFsaWQuIik7CiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwogfQogCit0eXBlZGVmIGVudW0geworICAgIC8vQU9UX05PTkUgICAgICAgICAgICAgPSAtMSwKKyAgICAvL0FPVF9OVUxMX09CSkVDVCAgICAgID0gMCwKKyAgICAvL0FPVF9BQUNfTUFJTiAgICAgICAgID0gMSwgLyoqPCBNYWluIHByb2ZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIEFPVF9BQUNfTEMgICAgICAgICAgID0gMiwgICAvKio8IExvdyBDb21wbGV4aXR5IG9iamVjdCAgICAgICAgICAgICAgICAgICAgICovCisgICAgLy9BT1RfQUFDX1NTUiAgICAgICAgICA9IDMsCisgICAgLy9BT1RfQUFDX0xUUCAgICAgICAgICA9IDQsCisgICAgQU9UX1NCUiAgICAgICAgICAgICAgPSA1LAorICAgIC8vQU9UX0FBQ19TQ0FMICAgICAgICAgPSA2LAorICAgIC8vQU9UX1RXSU5fVlEgICAgICAgICAgPSA3LAorICAgIC8vQU9UX0NFTFAgICAgICAgICAgICAgPSA4LAorICAgIC8vQU9UX0hWWEMgICAgICAgICAgICAgPSA5LAorICAgIC8vQU9UX1JTVkRfMTAgICAgICAgICAgPSAxMCwgLyoqPCAocmVzZXJ2ZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX1JTVkRfMTEgICAgICAgICAgPSAxMSwgLyoqPCAocmVzZXJ2ZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX1RUU0kgICAgICAgICAgICAgPSAxMiwgLyoqPCBUVFNJIE9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX01BSU5fU1lOVEggICAgICAgPSAxMywgLyoqPCBNYWluIFN5bnRoZXRpYyBvYmplY3QgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX1dBVl9UQUJfU1lOVEggICAgPSAxNCwgLyoqPCBXYXZldGFibGUgU3ludGhlc2lzIG9iamVjdCAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX0dFTl9NSURJICAgICAgICAgPSAxNSwgLyoqPCBHZW5lcmFsIE1JREkgb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX0FMR19TWU5USF9BVURfRlggPSAxNiwgLyoqPCBBbGdvcml0aG1pYyBTeW50aGVzaXMgYW5kIEF1ZGlvIEZYIG9iamVjdCAqLworICAgIEFPVF9FUl9BQUNfTEMgICAgICAgID0gMTcsICAgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIEFBQyBMb3cgQ29tcGxleGl0eSAgICAqLworICAgIC8vQU9UX1JTVkRfMTggICAgICAgICAgPSAxOCwgLyoqPCAocmVzZXJ2ZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX0VSX0FBQ19MVFAgICAgICAgPSAxOSwgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIEFBQyBMVFAgb2JqZWN0ICAgICAgICAqLworICAgIEFPVF9FUl9BQUNfU0NBTCAgICAgID0gMjAsICAgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIEFBQyBTY2FsYWJsZSBvYmplY3QgICAqLworICAgIC8vQU9UX0VSX1RXSU5fVlEgICAgICAgPSAyMSwgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIFR3aW5WUSBvYmplY3QgICAgICAgICAqLworICAgIEFPVF9FUl9CU0FDICAgICAgICAgID0gMjIsICAgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIEJTQUMgb2JqZWN0ICAgICAgICAgICAqLworICAgIEFPVF9FUl9BQUNfTEQgICAgICAgID0gMjMsICAgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIEFBQyBMb3dEZWxheSBvYmplY3QgICAqLworICAgIC8vQU9UX0VSX0NFTFAgICAgICAgICAgPSAyNCwgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIENFTFAgb2JqZWN0ICAgICAgICAgICAqLworICAgIC8vQU9UX0VSX0hWWEMgICAgICAgICAgPSAyNSwgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIEhWWEMgb2JqZWN0ICAgICAgICAgICAqLworICAgIC8vQU9UX0VSX0hJTE4gICAgICAgICAgPSAyNiwgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIEhJTE4gb2JqZWN0ICAgICAgICAgICAqLworICAgIC8vQU9UX0VSX1BBUkEgICAgICAgICAgPSAyNywgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIFBhcmFtZXRyaWMgb2JqZWN0ICAgICAqLworICAgIC8vQU9UX1JTVkRfMjggICAgICAgICAgPSAyOCwgLyoqPCBtaWdodCBiZWNvbWUgU1NDICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIEFPVF9QUyAgICAgICAgICAgICAgID0gMjksICAgLyoqPCBQUywgUGFyYW1ldHJpYyBTdGVyZW8gKGluY2x1ZGVzIFNCUikgICAgICAqLworICAgIC8vQU9UX01QRUdTICAgICAgICAgICAgPSAzMCwgLyoqPCBNUEVHIFN1cnJvdW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgQU9UX0VTQ0FQRSAgICAgICAgICAgPSAzMSwgICAvKio8IFNpZ25hbCBBT1QgdXNlcyBtb3JlIHRoYW4gNSBiaXRzICAgICAgICAgICovCisKKyAgICAvL0FPVF9NUDNPTk1QNF9MMSAgICAgID0gMzIsIC8qKjwgTVBFRy1MYXllcjEgaW4gbXA0ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9NUDNPTk1QNF9MMiAgICAgID0gMzMsIC8qKjwgTVBFRy1MYXllcjIgaW4gbXA0ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9NUDNPTk1QNF9MMyAgICAgID0gMzQsIC8qKjwgTVBFRy1MYXllcjMgaW4gbXA0ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9SU1ZEXzM1ICAgICAgICAgID0gMzUsIC8qKjwgbWlnaHQgYmVjb21lIERTVCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9SU1ZEXzM2ICAgICAgICAgID0gMzYsIC8qKjwgbWlnaHQgYmVjb21lIEFMUyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9BQUNfU0xTICAgICAgICAgID0gMzcsIC8qKjwgQUFDICsgU0xTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9TTFMgICAgICAgICAgICAgID0gMzgsIC8qKjwgU0xTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9FUl9BQUNfRUxEICAgICAgID0gMzksIC8qKjwgQUFDIEVuaGFuY2VkIExvdyBEZWxheSAgICAgICAgICAgICAgICAgICAgKi8KKworICAgIC8vQU9UX1VTQUMgICAgICAgICAgICAgPSA0MiwgLyoqPCBVU0FDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX1NBT0MgICAgICAgICAgICAgPSA0MywgLyoqPCBTQU9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX0xEX01QRUdTICAgICAgICAgPSA0NCwgLyoqPCBMb3cgRGVsYXkgTVBFRyBTdXJyb3VuZCAgICAgICAgICAgICAgICAgICAqLworCisgICAgLy9BT1RfUlNWRDUwICAgICAgICAgICA9IDUwLCAgLyoqPCBJbnRlcmltIEFPVCBmb3IgUnN2ZDUwICAgICAgICAgICAgICAgICAgICovCit9IEFVRElPX09CSkVDVF9UWVBFOworCiBzdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6dXBkYXRlQXVkaW9UcmFja0luZm9Gcm9tRVNEU19NUEVHNEF1ZGlvKAogICAgICAgICBjb25zdCB2b2lkICplc2RzX2RhdGEsIHNpemVfdCBlc2RzX3NpemUpIHsKICAgICBFU0RTIGVzZHMoZXNkc19kYXRhLCBlc2RzX3NpemUpOwpAQCAtMjU4OCw3ICsyODM3LDcgQEAKICAgICAgICAgc2FtcGxlUmF0ZSA9IGtTYW1wbGluZ1JhdGVbZnJlcUluZGV4XTsKICAgICB9CiAKLSAgICBpZiAob2JqZWN0VHlwZSA9PSA1IHx8IG9iamVjdFR5cGUgPT0gMjkpIHsgLy8gU0JSIHNwZWNpZmljIGNvbmZpZyBwZXIgMTQ0OTYtMyB0YWJsZSAxLjEzCisgICAgaWYgKG9iamVjdFR5cGUgPT0gQU9UX1NCUiB8fCBvYmplY3RUeXBlID09IEFPVF9QUykgey8vU0JSIHNwZWNpZmljIGNvbmZpZyBwZXIgMTQ0OTYtMyB0YWJsZSAxLjEzCiAgICAgICAgIHVpbnQzMl90IGV4dEZyZXFJbmRleCA9IGJyLmdldEJpdHMoNCk7CiAgICAgICAgIGludDMyX3QgZXh0U2FtcGxlUmF0ZTsKICAgICAgICAgaWYgKGV4dEZyZXFJbmRleCA9PSAxNSkgewpAQCAtMjYwNiw2ICsyODU1LDEzMSBAQAogICAgICAgICAvLyAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDMyKGtLZXlFeHRTYW1wbGVSYXRlLCBleHRTYW1wbGVSYXRlKTsKICAgICB9CiAKKyAgICBzd2l0Y2ggKG51bUNoYW5uZWxzKSB7CisgICAgICAgIC8vIHZhbHVlcyBkZWZpbmVkIGluIDE0NDk2LTNfMjAwOSBhbWVuZG1lbnQtNCBUYWJsZSAxLjE5IC0gQ2hhbm5lbCBDb25maWd1cmF0aW9uCisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgY2FzZSAxOi8vIEZDCisgICAgICAgIGNhc2UgMjovLyBGTCBGUgorICAgICAgICBjYXNlIDM6Ly8gRkMsIEZMIEZSCisgICAgICAgIGNhc2UgNDovLyBGQywgRkwgRlIsIFJDCisgICAgICAgIGNhc2UgNTovLyBGQywgRkwgRlIsIFNMIFNSCisgICAgICAgIGNhc2UgNjovLyBGQywgRkwgRlIsIFNMIFNSLCBMRkUKKyAgICAgICAgICAgIC8vbnVtQ2hhbm5lbHMgYWxyZWFkeSBjb250YWlucyB0aGUgcmlnaHQgdmFsdWUKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDExOi8vIEZDLCBGTCBGUiwgU0wgU1IsIFJDLCBMRkUKKyAgICAgICAgICAgIG51bUNoYW5uZWxzID0gNzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc6IC8vIEZDLCBGQ0wgRkNSLCBGTCBGUiwgU0wgU1IsIExGRQorICAgICAgICBjYXNlIDEyOi8vIEZDLCBGTCAgRlIsICBTTCBTUiwgUkwgUlIsIExGRQorICAgICAgICBjYXNlIDE0Oi8vIEZDLCBGTCAgRlIsICBTTCBTUiwgTEZFLCBGSEwgRkhSCisgICAgICAgICAgICBudW1DaGFubmVscyA9IDg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIGlmIChvYmplY3RUeXBlID09IEFPVF9TQlIgfHwgb2JqZWN0VHlwZSA9PSBBT1RfUFMpIHsKKyAgICAgICAgICAgIG9iamVjdFR5cGUgPSBici5nZXRCaXRzKDUpOworCisgICAgICAgICAgICBpZiAob2JqZWN0VHlwZSA9PSBBT1RfRVNDQVBFKSB7CisgICAgICAgICAgICAgICAgb2JqZWN0VHlwZSA9IDMyICsgYnIuZ2V0Qml0cyg2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAob2JqZWN0VHlwZSA9PSBBT1RfQUFDX0xDIHx8IG9iamVjdFR5cGUgPT0gQU9UX0VSX0FBQ19MQyB8fAorICAgICAgICAgICAgICAgIG9iamVjdFR5cGUgPT0gQU9UX0VSX0FBQ19MRCB8fCBvYmplY3RUeXBlID09IEFPVF9FUl9BQUNfU0NBTCB8fAorICAgICAgICAgICAgICAgIG9iamVjdFR5cGUgPT0gQU9UX0VSX0JTQUMpIHsKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZnJhbWVMZW5ndGhGbGFnID0gYnIuZ2V0Qml0cygxKTsKKworICAgICAgICAgICAgY29uc3QgaW50MzJfdCBkZXBlbmRzT25Db3JlQ29kZXIgPSBici5nZXRCaXRzKDEpOworCisgICAgICAgICAgICBpZiAoZGVwZW5kc09uQ29yZUNvZGVyICkgeworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgY29yZUNvZGVyRGVsYXkgPSBici5nZXRCaXRzKDE0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50MzJfdCBleHRlbnNpb25GbGFnID0gLTE7CisgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBleHRlbnNpb25GbGFnID0gYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChvYmplY3RUeXBlKSB7CisgICAgICAgICAgICAgICAgLy8gMTQ0OTYtMyA0LjUuMS4xIGV4dGVuc2lvbkZsYWcKKyAgICAgICAgICAgICAgICBjYXNlIEFPVF9BQUNfTEM6CisgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbkZsYWcgPSAwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEFPVF9FUl9BQUNfTEM6CisgICAgICAgICAgICAgICAgY2FzZSBBT1RfRVJfQUFDX1NDQUw6CisgICAgICAgICAgICAgICAgY2FzZSBBT1RfRVJfQlNBQzoKKyAgICAgICAgICAgICAgICBjYXNlIEFPVF9FUl9BQUNfTEQ6CisgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbkZsYWcgPSAxOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1coImNzZCBtaXNzaW5nIGV4dGVuc2lvbiBmbGFnOyBhc3N1bWluZyAlZCBmb3Igb2JqZWN0IHR5cGUgJXUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbkZsYWcsIG9iamVjdFR5cGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobnVtQ2hhbm5lbHMgPT0gMCkgeworICAgICAgICAgICAgICAgIGludDMyX3QgY2hhbm5lbHNFZmZlY3RpdmVOdW0gPSAwOworICAgICAgICAgICAgICAgIGludDMyX3QgY2hhbm5lbHNOdW0gPSAwOworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgRWxlbWVudEluc3RhbmNlVGFnID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFByb2ZpbGUgPSBici5nZXRCaXRzKDIpOworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgU2FtcGxpbmdGcmVxdWVuY3lJbmRleCA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBOdW1Gcm9udENoYW5uZWxFbGVtZW50cyA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBOdW1TaWRlQ2hhbm5lbEVsZW1lbnRzID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE51bUJhY2tDaGFubmVsRWxlbWVudHMgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTnVtTGZlQ2hhbm5lbEVsZW1lbnRzID0gYnIuZ2V0Qml0cygyKTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE51bUFzc29jRGF0YUVsZW1lbnRzID0gYnIuZ2V0Qml0cygzKTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE51bVZhbGlkQ2NFbGVtZW50cyA9IGJyLmdldEJpdHMoNCk7CisKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE1vbm9NaXhkb3duUHJlc2VudCA9IGJyLmdldEJpdHMoMSk7CisgICAgICAgICAgICAgICAgaWYgKE1vbm9NaXhkb3duUHJlc2VudCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTW9ub01peGRvd25FbGVtZW50TnVtYmVyID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFN0ZXJlb01peGRvd25QcmVzZW50ID0gYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgICAgICAgICBpZiAoU3RlcmVvTWl4ZG93blByZXNlbnQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFN0ZXJlb01peGRvd25FbGVtZW50TnVtYmVyID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE1hdHJpeE1peGRvd25JbmRleFByZXNlbnQgPSBici5nZXRCaXRzKDEpOworICAgICAgICAgICAgICAgIGlmIChNYXRyaXhNaXhkb3duSW5kZXhQcmVzZW50ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBNYXRyaXhNaXhkb3duSW5kZXggPSBici5nZXRCaXRzKDIpOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFBzZXVkb1N1cnJvdW5kRW5hYmxlID0gYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IE51bUZyb250Q2hhbm5lbEVsZW1lbnRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBGcm9udEVsZW1lbnRJc0NwZSA9IGJyLmdldEJpdHMoMSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgRnJvbnRFbGVtZW50VGFnU2VsZWN0ID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNOdW0gKz0gRnJvbnRFbGVtZW50SXNDcGUgPyAyIDogMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IE51bVNpZGVDaGFubmVsRWxlbWVudHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFNpZGVFbGVtZW50SXNDcGUgPSBici5nZXRCaXRzKDEpOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFNpZGVFbGVtZW50VGFnU2VsZWN0ID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNOdW0gKz0gU2lkZUVsZW1lbnRJc0NwZSA/IDIgOiAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgTnVtQmFja0NoYW5uZWxFbGVtZW50czsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgQmFja0VsZW1lbnRJc0NwZSA9IGJyLmdldEJpdHMoMSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgQmFja0VsZW1lbnRUYWdTZWxlY3QgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgICAgICBjaGFubmVsc051bSArPSBCYWNrRWxlbWVudElzQ3BlID8gMiA6IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNoYW5uZWxzRWZmZWN0aXZlTnVtID0gY2hhbm5lbHNOdW07CisKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IE51bUxmZUNoYW5uZWxFbGVtZW50czsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTGZlRWxlbWVudFRhZ1NlbGVjdCA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzTnVtICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCJtcGVnNCBhdWRpbyBjaGFubmVsc051bSA9ICVkIiwgY2hhbm5lbHNOdW0pOworICAgICAgICAgICAgICAgIEFMT0dWKCJtcGVnNCBhdWRpbyBjaGFubmVsc0VmZmVjdGl2ZU51bSA9ICVkIiwgY2hhbm5lbHNFZmZlY3RpdmVOdW0pOworICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzID0gY2hhbm5lbHNOdW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBpZiAobnVtQ2hhbm5lbHMgPT0gMCkgewogICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgfQpAQCAtMjYzNiwxOSArMzAxMCwyMyBAQAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogTVBFRzRTb3VyY2U6Ok1QRUc0U291cmNlKAorICAgICAgICBjb25zdCBzcDxNUEVHNEV4dHJhY3Rvcj4gJm93bmVyLAogICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJmZvcm1hdCwKICAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJmRhdGFTb3VyY2UsCiAgICAgICAgIGludDMyX3QgdGltZVNjYWxlLAogICAgICAgICBjb25zdCBzcDxTYW1wbGVUYWJsZT4gJnNhbXBsZVRhYmxlLAogICAgICAgICBWZWN0b3I8U2lkeEVudHJ5PiAmc2lkeCwKKyAgICAgICAgY29uc3QgVHJleCAqdHJleCwKICAgICAgICAgb2ZmNjRfdCBmaXJzdE1vb2ZPZmZzZXQpCi0gICAgOiBtRm9ybWF0KGZvcm1hdCksCisgICAgOiBtT3duZXIob3duZXIpLAorICAgICAgbUZvcm1hdChmb3JtYXQpLAogICAgICAgbURhdGFTb3VyY2UoZGF0YVNvdXJjZSksCiAgICAgICBtVGltZXNjYWxlKHRpbWVTY2FsZSksCiAgICAgICBtU2FtcGxlVGFibGUoc2FtcGxlVGFibGUpLAogICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCgwKSwKICAgICAgIG1DdXJyZW50RnJhZ21lbnRJbmRleCgwKSwKICAgICAgIG1TZWdtZW50cyhzaWR4KSwKKyAgICAgIG1UcmV4KHRyZXgpLAogICAgICAgbUZpcnN0TW9vZk9mZnNldChmaXJzdE1vb2ZPZmZzZXQpLAogICAgICAgbUN1cnJlbnRNb29mT2Zmc2V0KGZpcnN0TW9vZk9mZnNldCksCiAgICAgICBtQ3VycmVudFRpbWUoMCksCkBAIC0yNjU3LDYgKzMwMzUsNyBAQAogICAgICAgbUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0c0FsbG9jU2l6ZSgwKSwKICAgICAgIG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHMoTlVMTCksCiAgICAgICBtSXNBVkMoZmFsc2UpLAorICAgICAgbUlzSEVWQyhmYWxzZSksCiAgICAgICBtTkFMTGVuZ3RoU2l6ZSgwKSwKICAgICAgIG1TdGFydGVkKGZhbHNlKSwKICAgICAgIG1Hcm91cChOVUxMKSwKQEAgLTI2NjQsNiArMzA0Myw4IEBACiAgICAgICBtV2FudHNOQUxGcmFnbWVudHMoZmFsc2UpLAogICAgICAgbVNyY0J1ZmZlcihOVUxMKSB7CiAKKyAgICBtZW1zZXQoJm1UcmFja0ZyYWdtZW50SGVhZGVySW5mbywgMCwgc2l6ZW9mKG1UcmFja0ZyYWdtZW50SGVhZGVySW5mbykpOworCiAgICAgbUZvcm1hdC0+ZmluZEludDMyKGtLZXlDcnlwdG9Nb2RlLCAmbUNyeXB0b01vZGUpOwogICAgIG1EZWZhdWx0SVZTaXplID0gMDsKICAgICBtRm9ybWF0LT5maW5kSW50MzIoa0tleUNyeXB0b0RlZmF1bHRJVlNpemUsICZtRGVmYXVsdElWU2l6ZSk7CkBAIC0yNjgxLDYgKzMwNjIsNyBAQAogICAgIENIRUNLKHN1Y2Nlc3MpOwogCiAgICAgbUlzQVZDID0gIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKyAgICBtSXNIRVZDID0gIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQyk7CiAKICAgICBpZiAobUlzQVZDKSB7CiAgICAgICAgIHVpbnQzMl90IHR5cGU7CkBAIC0yNjk1LDYgKzMwNzcsMTggQEAKIAogICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHVzZWQgdG8gZW5jb2RlIHRoZSBsZW5ndGggb2YgYSBOQUwgdW5pdC4KICAgICAgICAgbU5BTExlbmd0aFNpemUgPSAxICsgKHB0cls0XSAmIDMpOworICAgIH0gZWxzZSBpZiAobUlzSEVWQykgeworICAgICAgICB1aW50MzJfdCB0eXBlOworICAgICAgICBjb25zdCB2b2lkICpkYXRhOworICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICAgICAgQ0hFQ0soZm9ybWF0LT5maW5kRGF0YShrS2V5SFZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpOworCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9IChjb25zdCB1aW50OF90ICopZGF0YTsKKworICAgICAgICBDSEVDSyhzaXplID49IDcpOworICAgICAgICBDSEVDS19FUSgodW5zaWduZWQpcHRyWzBdLCAxdSk7ICAvLyBjb25maWd1cmF0aW9uVmVyc2lvbiA9PSAxCisKKyAgICAgICAgbU5BTExlbmd0aFNpemUgPSAxICsgKHB0clsxNCArIDddICYgMyk7CiAgICAgfQogCiAgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoa0tleVRyYWNrSUQsICZtVHJhY2tJZCkpOwpAQCAtMjgxOCw5ICszMjEyLDIwIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCdtJywgJ28nLCAnbycsICdmJykpIHsKLSAgICAgICAgICAgICAgICAvLyAqb2Zmc2V0IHBvaW50cyB0byB0aGUgbWRhdCBib3ggZm9sbG93aW5nIHRoaXMgbW9vZgotICAgICAgICAgICAgICAgIHBhcnNlQ2h1bmsob2Zmc2V0KTsgLy8gZG9lc24ndCBhY3R1YWxseSBwYXJzZSBpdCwganVzdCB1cGRhdGVzIG9mZnNldAotICAgICAgICAgICAgICAgIG1OZXh0TW9vZk9mZnNldCA9ICpvZmZzZXQ7CisgICAgICAgICAgICAgICAgLy8gKm9mZnNldCBwb2ludHMgdG8gdGhlIGJveCBmb2xsb3dpbmcgdGhpcyBtb29mLiBGaW5kIHRoZSBuZXh0IG1vb2YgZnJvbSB0aGVyZS4KKworICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KCpvZmZzZXQsIGhkciwgOCkgPCA4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjaHVua19zaXplID0gbnRvaGwoaGRyWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgY2h1bmtfdHlwZSA9IG50b2hsKGhkclsxXSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaHVua190eXBlID09IEZPVVJDQygnbScsICdvJywgJ28nLCAnZicpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtTmV4dE1vb2ZPZmZzZXQgPSAqb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yODc5LDcgKzMyODQsOCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnBhcnNlU2FtcGxlQXV4aWxpYXJ5SW5mb3JtYXRpb25TaXplcyhvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBzaXplKSB7CitzdGF0dXNfdCBNUEVHNFNvdXJjZTo6cGFyc2VTYW1wbGVBdXhpbGlhcnlJbmZvcm1hdGlvblNpemVzKAorICAgICAgICBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCAvKiBzaXplICovKSB7CiAgICAgQUxPR1YoInBhcnNlU2FtcGxlQXV4aWxpYXJ5SW5mb3JtYXRpb25TaXplcyIpOwogICAgIC8vIDE0NDk2LTEyIDguNy4xMgogICAgIHVpbnQ4X3QgdmVyc2lvbjsKQEAgLTI5NDEsNyArMzM0Nyw4IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBNUEVHNFNvdXJjZTo6cGFyc2VTYW1wbGVBdXhpbGlhcnlJbmZvcm1hdGlvbk9mZnNldHMob2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3Qgc2l6ZSkgeworc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnBhcnNlU2FtcGxlQXV4aWxpYXJ5SW5mb3JtYXRpb25PZmZzZXRzKAorICAgICAgICBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCAvKiBzaXplICovKSB7CiAgICAgQUxPR1YoInBhcnNlU2FtcGxlQXV4aWxpYXJ5SW5mb3JtYXRpb25PZmZzZXRzIik7CiAgICAgLy8gMTQ0OTYtMTIgOC43LjEzCiAgICAgdWludDhfdCB2ZXJzaW9uOwpAQCAtMzI0MCw4ICszNjQ3LDggQEAKICAgICB9IGVsc2UgaWYgKG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRmxhZ3MKICAgICAgICAgICAgICYgVHJhY2tGcmFnbWVudEhlYWRlckluZm86OmtEZWZhdWx0U2FtcGxlRHVyYXRpb25QcmVzZW50KSB7CiAgICAgICAgIHNhbXBsZUR1cmF0aW9uID0gbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1EZWZhdWx0U2FtcGxlRHVyYXRpb247Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc2FtcGxlRHVyYXRpb24gPSBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubURlZmF1bHRTYW1wbGVEdXJhdGlvbjsKKyAgICB9IGVsc2UgaWYgKG1UcmV4KSB7CisgICAgICAgIHNhbXBsZUR1cmF0aW9uID0gbVRyZXgtPmRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uOwogICAgIH0KIAogICAgIGlmIChmbGFncyAmIGtTYW1wbGVTaXplUHJlc2VudCkgewpAQCAtMzI2OCw3ICszNjc1LDcgQEAKICAgICAgICAgc2FtcGxlQ3RzT2Zmc2V0ID0gMDsKICAgICB9CiAKLSAgICBpZiAoc2l6ZSA8IHNhbXBsZUNvdW50ICogYnl0ZXNQZXJTYW1wbGUpIHsKKyAgICBpZiAoc2l6ZSA8IChvZmY2NF90KXNhbXBsZUNvdW50ICogYnl0ZXNQZXJTYW1wbGUpIHsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCkBAIC0zMzAyLDcgKzM3MDksNyBAQAogICAgICAgICAgICAgb2Zmc2V0ICs9IDQ7CiAgICAgICAgIH0KIAotICAgICAgICBBTE9HVigiYWRkaW5nIHNhbXBsZSAlZCBhdCBvZmZzZXQgMHglMDhsbHgsIHNpemUgJXUsIGR1cmF0aW9uICV1LCAiCisgICAgICAgIEFMT0dWKCJhZGRpbmcgc2FtcGxlICVkIGF0IG9mZnNldCAweCUwOCIgUFJJeDY0ICIsIHNpemUgJXUsIGR1cmF0aW9uICV1LCAiCiAgICAgICAgICAgICAgICIgZmxhZ3MgMHglMDh4IiwgaSArIDEsCiAgICAgICAgICAgICAgICAgZGF0YU9mZnNldCwgc2FtcGxlU2l6ZSwgc2FtcGxlRHVyYXRpb24sCiAgICAgICAgICAgICAgICAgKGZsYWdzICYga0ZpcnN0U2FtcGxlRmxhZ3NQcmVzZW50KSAmJiBpID09IDAKQEAgLTMzMTAsNiArMzcxNyw3IEBACiAgICAgICAgIHRtcC5vZmZzZXQgPSBkYXRhT2Zmc2V0OwogICAgICAgICB0bXAuc2l6ZSA9IHNhbXBsZVNpemU7CiAgICAgICAgIHRtcC5kdXJhdGlvbiA9IHNhbXBsZUR1cmF0aW9uOworICAgICAgICB0bXAuY29tcG9zaXRpb25PZmZzZXQgPSBzYW1wbGVDdHNPZmZzZXQ7CiAgICAgICAgIG1DdXJyZW50U2FtcGxlcy5hZGQodG1wKTsKIAogICAgICAgICBkYXRhT2Zmc2V0ICs9IHNhbXBsZVNpemU7CkBAIC0zMzgxLDcgKzM3ODksNyBAQAogCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZUluZGV4OwogICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU2FtcGxlVGFibGUtPmZpbmRTYW1wbGVBdFRpbWUoCi0gICAgICAgICAgICAgICAgc2Vla1RpbWVVcyAqIG1UaW1lc2NhbGUgLyAxMDAwMDAwLAorICAgICAgICAgICAgICAgIHNlZWtUaW1lVXMsIDEwMDAwMDAsIG1UaW1lc2NhbGUsCiAgICAgICAgICAgICAgICAgJnNhbXBsZUluZGV4LCBmaW5kRmxhZ3MpOwogCiAgICAgICAgIGlmIChtb2RlID09IFJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1QpIHsKQEAgLTM0NDMsNyArMzg1MSw3IEBACiAKICAgICBvZmY2NF90IG9mZnNldDsKICAgICBzaXplX3Qgc2l6ZTsKLSAgICB1aW50MzJfdCBjdHM7CisgICAgdWludDMyX3QgY3RzLCBzdHRzOwogICAgIGJvb2wgaXNTeW5jU2FtcGxlOwogICAgIGJvb2wgbmV3QnVmZmVyID0gZmFsc2U7CiAgICAgaWYgKG1CdWZmZXIgPT0gTlVMTCkgewpAQCAtMzQ1MSw3ICszODU5LDcgQEAKIAogICAgICAgICBzdGF0dXNfdCBlcnIgPQogICAgICAgICAgICAgbVNhbXBsZVRhYmxlLT5nZXRNZXRhRGF0YUZvclNhbXBsZSgKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCwgJm9mZnNldCwgJnNpemUsICZjdHMsICZpc1N5bmNTYW1wbGUpOworICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNhbXBsZUluZGV4LCAmb2Zmc2V0LCAmc2l6ZSwgJmN0cywgJmlzU3luY1NhbXBsZSwgJnN0dHMpOwogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIHJldHVybiBlcnI7CkBAIC0zNDY5LDcgKzM4NzcsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKCFtSXNBVkMgfHwgbVdhbnRzTkFMRnJhZ21lbnRzKSB7CisgICAgaWYgKCghbUlzQVZDICYmICFtSXNIRVZDKSB8fCBtV2FudHNOQUxGcmFnbWVudHMpIHsKICAgICAgICAgaWYgKG5ld0J1ZmZlcikgewogICAgICAgICAgICAgc3NpemVfdCBudW1fYnl0ZXNfcmVhZCA9CiAgICAgICAgICAgICAgICAgbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsICh1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpLCBzaXplKTsKQEAgLTM0ODYsNiArMzg5NCw4IEBACiAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+Y2xlYXIoKTsKICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKICAgICAgICAgICAgICAgICAgICAga0tleVRpbWUsICgoaW50NjRfdCljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KAorICAgICAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sICgoaW50NjRfdClzdHRzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKIAogICAgICAgICAgICAgaWYgKHRhcmdldFNhbXBsZVRpbWVVcyA+PSAwKSB7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KApAQCAtMzQ5OSw3ICszOTA5LDcgQEAKICAgICAgICAgICAgICsrbUN1cnJlbnRTYW1wbGVJbmRleDsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghbUlzQVZDKSB7CisgICAgICAgIGlmICghbUlzQVZDICYmICFtSXNIRVZDKSB7CiAgICAgICAgICAgICAqb3V0ID0gbUJ1ZmZlcjsKICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogCkBAIC0zNTc0LDEyICszOTg0LDEyIEBACiAgICAgICAgICAgICBzaXplX3QgZHN0T2Zmc2V0ID0gMDsKIAogICAgICAgICAgICAgd2hpbGUgKHNyY09mZnNldCA8IHNpemUpIHsKLSAgICAgICAgICAgICAgICBib29sIGlzTWFsRm9ybWVkID0gIWlzSW5SYW5nZSgwdSwgc2l6ZSwgc3JjT2Zmc2V0LCBtTkFMTGVuZ3RoU2l6ZSk7CisgICAgICAgICAgICAgICAgYm9vbCBpc01hbEZvcm1lZCA9ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgc2l6ZSwgc3JjT2Zmc2V0LCBtTkFMTGVuZ3RoU2l6ZSk7CiAgICAgICAgICAgICAgICAgc2l6ZV90IG5hbExlbmd0aCA9IDA7CiAgICAgICAgICAgICAgICAgaWYgKCFpc01hbEZvcm1lZCkgewogICAgICAgICAgICAgICAgICAgICBuYWxMZW5ndGggPSBwYXJzZU5BTFNpemUoJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSk7CiAgICAgICAgICAgICAgICAgICAgIHNyY09mZnNldCArPSBtTkFMTGVuZ3RoU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgaXNNYWxGb3JtZWQgPSAhaXNJblJhbmdlKDB1LCBzaXplLCBzcmNPZmZzZXQsIG5hbExlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBzaXplLCBzcmNPZmZzZXQsIG5hbExlbmd0aCk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKGlzTWFsRm9ybWVkKSB7CkBAIC0zNjE5LDYgKzQwMjksOCBAQAogICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+Y2xlYXIoKTsKICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KAogICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAoKGludDY0X3QpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKyAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KAorICAgICAgICAgICAgICAgIGtLZXlEdXJhdGlvbiwgKChpbnQ2NF90KXN0dHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOwogCiAgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMCkgewogICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KApAQCAtMzY2MSw3ICs0MDczLDcgQEAKICAgICAgICAgICAgICAgICBjb25zdCBTaWR4RW50cnkgKnNlID0gJm1TZWdtZW50c1tpXTsKICAgICAgICAgICAgICAgICBpZiAodG90YWxUaW1lICsgc2UtPm1EdXJhdGlvblVzID4gc2Vla1RpbWVVcykgewogICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmVxdWVzdGVkIHRpbWUgaXMgc29tZXdoZXJlIGluIHRoaXMgc2VnbWVudAotICAgICAgICAgICAgICAgICAgICBpZiAoKG1vZGUgPT0gUmVhZE9wdGlvbnM6OlNFRUtfTkVYVF9TWU5DKSB8fAorICAgICAgICAgICAgICAgICAgICBpZiAoKG1vZGUgPT0gUmVhZE9wdGlvbnM6OlNFRUtfTkVYVF9TWU5DICYmIHNlZWtUaW1lVXMgPiB0b3RhbFRpbWUpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAobW9kZSA9PSBSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUX1NZTkMgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIChzZWVrVGltZVVzIC0gdG90YWxUaW1lKSA+ICh0b3RhbFRpbWUgKyBzZS0+bUR1cmF0aW9uVXMgLSBzZWVrVGltZVVzKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVlc3RlZCBuZXh0IHN5bmMsIG9yIGNsb3Nlc3Qgc3luYyBhbmQgaXQgd2FzIGNsb3NlciB0byB0aGUgZW5kIG9mCkBAIC0zNjc0LDExICs0MDg2LDE5IEBACiAgICAgICAgICAgICAgICAgdG90YWxUaW1lICs9IHNlLT5tRHVyYXRpb25VczsKICAgICAgICAgICAgICAgICB0b3RhbE9mZnNldCArPSBzZS0+bVNpemU7CiAgICAgICAgICAgICB9Ci0gICAgICAgIG1DdXJyZW50TW9vZk9mZnNldCA9IHRvdGFsT2Zmc2V0OwotICAgICAgICBtQ3VycmVudFNhbXBsZXMuY2xlYXIoKTsKLSAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCA9IDA7Ci0gICAgICAgIHBhcnNlQ2h1bmsoJnRvdGFsT2Zmc2V0KTsKLSAgICAgICAgbUN1cnJlbnRUaW1lID0gdG90YWxUaW1lICogbVRpbWVzY2FsZSAvIDEwMDAwMDBsbDsKKyAgICAgICAgICAgIG1DdXJyZW50TW9vZk9mZnNldCA9IHRvdGFsT2Zmc2V0OworICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVzLmNsZWFyKCk7CisgICAgICAgICAgICBtQ3VycmVudFNhbXBsZUluZGV4ID0gMDsKKyAgICAgICAgICAgIHBhcnNlQ2h1bmsoJnRvdGFsT2Zmc2V0KTsKKyAgICAgICAgICAgIG1DdXJyZW50VGltZSA9IHRvdGFsVGltZSAqIG1UaW1lc2NhbGUgLyAxMDAwMDAwbGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyB3aXRob3V0IHNpZHggYm94ZXMsIHdlIGNhbiBvbmx5IHNlZWsgdG8gMAorICAgICAgICAgICAgbUN1cnJlbnRNb29mT2Zmc2V0ID0gbUZpcnN0TW9vZk9mZnNldDsKKyAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlcy5jbGVhcigpOworICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCA9IDA7CisgICAgICAgICAgICBvZmY2NF90IHRtcCA9IG1DdXJyZW50TW9vZk9mZnNldDsKKyAgICAgICAgICAgIHBhcnNlQ2h1bmsoJnRtcCk7CisgICAgICAgICAgICBtQ3VycmVudFRpbWUgPSAwOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKG1CdWZmZXIgIT0gTlVMTCkgewpAQCAtMzY5MCw3ICs0MTEwLDcgQEAKICAgICB9CiAKICAgICBvZmY2NF90IG9mZnNldCA9IDA7Ci0gICAgc2l6ZV90IHNpemU7CisgICAgc2l6ZV90IHNpemUgPSAwOwogICAgIHVpbnQzMl90IGN0cyA9IDA7CiAgICAgYm9vbCBpc1N5bmNTYW1wbGUgPSBmYWxzZTsKICAgICBib29sIG5ld0J1ZmZlciA9IGZhbHNlOwpAQCAtMzY5OCwyMiArNDExOCwyNCBAQAogICAgICAgICBuZXdCdWZmZXIgPSB0cnVlOwogCiAgICAgICAgIGlmIChtQ3VycmVudFNhbXBsZUluZGV4ID49IG1DdXJyZW50U2FtcGxlcy5zaXplKCkpIHsKLSAgICAgICAgICAgIC8vIG1vdmUgdG8gbmV4dCBmcmFnbWVudAotICAgICAgICAgICAgU2FtcGxlIGxhc3RTYW1wbGUgPSBtQ3VycmVudFNhbXBsZXNbbUN1cnJlbnRTYW1wbGVzLnNpemUoKSAtIDFdOwotICAgICAgICAgICAgb2ZmNjRfdCBuZXh0TW9vZiA9IG1OZXh0TW9vZk9mZnNldDsgLy8gbGFzdFNhbXBsZS5vZmZzZXQgKyBsYXN0U2FtcGxlLnNpemU7CisgICAgICAgICAgICAvLyBtb3ZlIHRvIG5leHQgZnJhZ21lbnQgaWYgdGhlcmUgaXMgb25lCisgICAgICAgICAgICBpZiAobU5leHRNb29mT2Zmc2V0IDw9IG1DdXJyZW50TW9vZk9mZnNldCkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb2ZmNjRfdCBuZXh0TW9vZiA9IG1OZXh0TW9vZk9mZnNldDsKICAgICAgICAgICAgIG1DdXJyZW50TW9vZk9mZnNldCA9IG5leHRNb29mOwogICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVzLmNsZWFyKCk7CiAgICAgICAgICAgICBtQ3VycmVudFNhbXBsZUluZGV4ID0gMDsKICAgICAgICAgICAgIHBhcnNlQ2h1bmsoJm5leHRNb29mKTsKLSAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRTYW1wbGVJbmRleCA+PSBtQ3VycmVudFNhbXBsZXMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtQ3VycmVudFNhbXBsZUluZGV4ID49IG1DdXJyZW50U2FtcGxlcy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGNvbnN0IFNhbXBsZSAqc21wbCA9ICZtQ3VycmVudFNhbXBsZXNbbUN1cnJlbnRTYW1wbGVJbmRleF07CiAgICAgICAgIG9mZnNldCA9IHNtcGwtPm9mZnNldDsKICAgICAgICAgc2l6ZSA9IHNtcGwtPnNpemU7Ci0gICAgICAgIGN0cyA9IG1DdXJyZW50VGltZTsKKyAgICAgICAgY3RzID0gbUN1cnJlbnRUaW1lICsgc21wbC0+Y29tcG9zaXRpb25PZmZzZXQ7CiAgICAgICAgIG1DdXJyZW50VGltZSArPSBzbXBsLT5kdXJhdGlvbjsKICAgICAgICAgaXNTeW5jU2FtcGxlID0gKG1DdXJyZW50U2FtcGxlSW5kZXggPT0gMCk7IC8vIFhYWAogCkBAIC0zNzQ1LDcgKzQxNjcsNyBAQAogICAgICAgICBidWZtZXRhLT5zZXREYXRhKGtLZXlDcnlwdG9LZXksIDAsIG1DcnlwdG9LZXksIDE2KTsKICAgICB9CiAKLSAgICBpZiAoIW1Jc0FWQyB8fCBtV2FudHNOQUxGcmFnbWVudHMpIHsKKyAgICBpZiAoKCFtSXNBVkMgJiYgIW1Jc0hFVkMpfHwgbVdhbnRzTkFMRnJhZ21lbnRzKSB7CiAgICAgICAgIGlmIChuZXdCdWZmZXIpIHsKICAgICAgICAgICAgIGlmICghaXNJblJhbmdlKChzaXplX3QpMHUsIG1CdWZmZXItPnNpemUoKSwgc2l6ZSkpIHsKICAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CkBAIC0zNzcwLDYgKzQxOTIsOCBAQAogICAgICAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIHNpemUpOwogICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KAogICAgICAgICAgICAgICAgICAgICBrS2V5VGltZSwgKChpbnQ2NF90KWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoCisgICAgICAgICAgICAgICAgICAgIGtLZXlEdXJhdGlvbiwgKChpbnQ2NF90KXNtcGwtPmR1cmF0aW9uICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKIAogICAgICAgICAgICAgaWYgKHRhcmdldFNhbXBsZVRpbWVVcyA+PSAwKSB7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KApAQCAtMzc4Myw3ICs0MjA3LDcgQEAKICAgICAgICAgICAgICsrbUN1cnJlbnRTYW1wbGVJbmRleDsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghbUlzQVZDKSB7CisgICAgICAgIGlmICghbUlzQVZDICYmICFtSXNIRVZDKSB7CiAgICAgICAgICAgICAqb3V0ID0gbUJ1ZmZlcjsKICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogCkBAIC0zOTI5LDYgKzQzNTMsOCBAQAogCiAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKICAgICAgICAgICAgICAgICBrS2V5VGltZSwgKChpbnQ2NF90KWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sICgoaW50NjRfdClzbXBsLT5kdXJhdGlvbiAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CiAKICAgICAgICAgaWYgKHRhcmdldFNhbXBsZVRpbWVVcyA+PSAwKSB7CiAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoCkBAIC0zOTkxLDYgKzQ0MTcsOCBAQAogICAgICAgICBGT1VSQ0MoJ2knLCAncycsICdvJywgJ20nKSwKICAgICAgICAgRk9VUkNDKCdpJywgJ3MnLCAnbycsICcyJyksCiAgICAgICAgIEZPVVJDQygnYScsICd2JywgJ2MnLCAnMScpLAorICAgICAgICBGT1VSQ0MoJ2gnLCAndicsICdjJywgJzEnKSwKKyAgICAgICAgRk9VUkNDKCdoJywgJ2UnLCAndicsICcxJyksCiAgICAgICAgIEZPVVJDQygnMycsICdnJywgJ3AnLCAnNCcpLAogICAgICAgICBGT1VSQ0MoJ20nLCAncCcsICc0JywgJzEnKSwKICAgICAgICAgRk9VUkNDKCdtJywgJ3AnLCAnNCcsICcyJyksCkBAIC00MDYyLDcgKzQ0OTAsNyBAQAogCiAgICAgICAgIGNoYXIgY2h1bmtzdHJpbmdbNV07CiAgICAgICAgIE1ha2VGb3VyQ0NTdHJpbmcoY2h1bmtUeXBlLCBjaHVua3N0cmluZyk7Ci0gICAgICAgIEFMT0dWKCJzYXcgY2h1bmsgdHlwZSAlcywgc2l6ZSAlbGxkIEAgJWxsZCIsIGNodW5rc3RyaW5nLCBjaHVua1NpemUsIG9mZnNldCk7CisgICAgICAgIEFMT0dWKCJzYXcgY2h1bmsgdHlwZSAlcywgc2l6ZSAlIiBQUkl1NjQgIiBAICVsbGQiLCBjaHVua3N0cmluZywgY2h1bmtTaXplLCBvZmZzZXQpOwogICAgICAgICBzd2l0Y2ggKGNodW5rVHlwZSkgewogICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ2YnLCAndCcsICd5JywgJ3AnKToKICAgICAgICAgICAgIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcAppbmRleCA0Mjg4NWRkLi40Yjg0NDBiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwCkBAIC0xNiwxMiArMTYsMTcgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJNUEVHNFdyaXRlciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPGFycGEvaW5ldC5oPgotCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHB0aHJlYWQuaD4KICNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmg+CkBAIC0zMywxMyArMzgsMTUgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhcmVjb3JkZXIuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgImluY2x1ZGUvRVNEUy5oIgogCisjZGVmaW5lIFdBUk5fVU5MRVNTKGNvbmRpdGlvbiwgbWVzc2FnZSwgLi4uKSBcCisoIChDT05ESVRJT04oY29uZGl0aW9uKSkgPyBmYWxzZSA6ICh7IFwKKyAgICBBTE9HVygiQ29uZGl0aW9uICVzIGZhaWxlZCAiICBtZXNzYWdlLCAjY29uZGl0aW9uLCAjI19fVkFfQVJHU19fKTsgXAorICAgIHRydWU7IFwKK30pKQorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNaW5TdHJlYW1hYmxlRmlsZVNpemVJbkJ5dGVzID0gNSAqIDEwMjQgKiAxMDI0OwpAQCAtNDA4LDcgKzQxNSw3IEBACiB9CiAKIHN0YXR1c190IE1QRUc0V3JpdGVyOjpUcmFjazo6ZHVtcCgKLSAgICAgICAgaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdCB7CisgICAgICAgIGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgLyogYXJncyAqLykgY29uc3QgewogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwogICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogICAgIFN0cmluZzggcmVzdWx0OwpAQCAtNDE5LDcgKzQyNiw3IEBACiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgICBmcmFtZXMgZW5jb2RlZCA6ICVkXG4iLCBtU3RzelRhYmxlRW50cmllcy0+Y291bnQoKSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgICBkdXJhdGlvbiBlbmNvZGVkIDogJWxsZCB1c1xuIiwgbVRyYWNrRHVyYXRpb25Vcyk7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICAgIGR1cmF0aW9uIGVuY29kZWQgOiAlIiBQUklkNjQgIiB1c1xuIiwgbVRyYWNrRHVyYXRpb25Vcyk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIDo6d3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiAgICAgcmV0dXJuIE9LOwpAQCAtNDM0LDcgKzQ0MSw3IEBACiAKICAgICAvLyBBdCBtb3N0IDIgdHJhY2tzIGNhbiBiZSBzdXBwb3J0ZWQuCiAgICAgaWYgKG1UcmFja3Muc2l6ZSgpID49IDIpIHsKLSAgICAgICAgQUxPR0UoIlRvbyBtYW55IHRyYWNrcyAoJWQpIHRvIGFkZCIsIG1UcmFja3Muc2l6ZSgpKTsKKyAgICAgICAgQUxPR0UoIlRvbyBtYW55IHRyYWNrcyAoJXp1KSB0byBhZGQiLCBtVHJhY2tzLnNpemUoKSk7CiAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKICAgICB9CiAKQEAgLTU0OCw4ICs1NTUsOCBAQAogICAgICAgICBzaXplID0gTUFYX01PT1ZfQk9YX1NJWkU7CiAgICAgfQogCi0gICAgQUxPR0koImxpbWl0czogJWxsZC8lbGxkIGJ5dGVzL3VzLCBiaXQgcmF0ZTogJWQgYnBzIGFuZCB0aGUgZXN0aW1hdGVkIgotICAgICAgICAgIiBtb292IHNpemUgJWxsZCBieXRlcyIsCisgICAgQUxPR0koImxpbWl0czogJSIgUFJJZDY0ICIvJSIgUFJJZDY0ICIgYnl0ZXMvdXMsIGJpdCByYXRlOiAlZCBicHMgYW5kIHRoZSIKKyAgICAgICAgICIgZXN0aW1hdGVkIG1vb3Ygc2l6ZSAlIiBQUklkNjQgIiBieXRlcyIsCiAgICAgICAgICBtTWF4RmlsZVNpemVMaW1pdEJ5dGVzLCBtTWF4RmlsZUR1cmF0aW9uTGltaXRVcywgYml0UmF0ZSwgc2l6ZSk7CiAgICAgcmV0dXJuIGZhY3RvciAqIHNpemU7CiB9CkBAIC01ODUsOCArNTkyLDggQEAKICAgICAgICAgLy8gSWYgZmlsZSBzaXplIGlzIHNldCB0byBiZSBsYXJnZXIgdGhhbiB0aGUgMzIgYml0IGZpbGUKICAgICAgICAgLy8gc2l6ZSBsaW1pdCwgdHJlYXQgaXQgYXMgYW4gZXJyb3IuCiAgICAgICAgIGlmIChtTWF4RmlsZVNpemVMaW1pdEJ5dGVzID4ga01heDMyQml0RmlsZVNpemUpIHsKLSAgICAgICAgICAgIEFMT0dXKCIzMi1iaXQgZmlsZSBzaXplIGxpbWl0ICglbGxkIGJ5dGVzKSB0b28gYmlnLiAiCi0gICAgICAgICAgICAgICAgICJJdCBpcyBjaGFuZ2VkIHRvICVsbGQgYnl0ZXMiLAorICAgICAgICAgICAgQUxPR1coIjMyLWJpdCBmaWxlIHNpemUgbGltaXQgKCUiIFBSSWQ2NCAiIGJ5dGVzKSB0b28gYmlnLiAiCisgICAgICAgICAgICAgICAgICJJdCBpcyBjaGFuZ2VkIHRvICUiIFBSSWQ2NCAiIGJ5dGVzIiwKICAgICAgICAgICAgICAgICBtTWF4RmlsZVNpemVMaW1pdEJ5dGVzLCBrTWF4MzJCaXRGaWxlU2l6ZSk7CiAgICAgICAgICAgICBtTWF4RmlsZVNpemVMaW1pdEJ5dGVzID0ga01heDMyQml0RmlsZVNpemU7CiAgICAgICAgIH0KQEAgLTg0Nyw3ICs4NTQsNyBAQAogICAgIH0KIAogICAgIGlmIChtVHJhY2tzLnNpemUoKSA+IDEpIHsKLSAgICAgICAgQUxPR0QoIkR1cmF0aW9uIGZyb20gdHJhY2tzIHJhbmdlIGlzIFslbGxkLCAlbGxkXSB1cyIsCisgICAgICAgIEFMT0dEKCJEdXJhdGlvbiBmcm9tIHRyYWNrcyByYW5nZSBpcyBbJSIgUFJJZDY0ICIsICUiIFBSSWQ2NCAiXSB1cyIsCiAgICAgICAgICAgICBtaW5EdXJhdGlvblVzLCBtYXhEdXJhdGlvblVzKTsKICAgICB9CiAKQEAgLTk3NCwxMyArOTgxLDE2IEBACiAgICAgaWYgKHBhcmFtICYmIHBhcmFtLT5maW5kSW50MzIoa0tleUZpbGVUeXBlLCAmZmlsZVR5cGUpICYmCiAgICAgICAgIGZpbGVUeXBlICE9IE9VVFBVVF9GT1JNQVRfTVBFR180KSB7CiAgICAgICAgIHdyaXRlRm91cmNjKCIzZ3A0Iik7Ci0gICAgfSBlbHNlIHsKKyAgICAgICAgd3JpdGVJbnQzMigwKTsKICAgICAgICAgd3JpdGVGb3VyY2MoImlzb20iKTsKKyAgICAgICAgd3JpdGVGb3VyY2MoIjNncDQiKTsKKyAgICB9IGVsc2UgeworICAgICAgICB3cml0ZUZvdXJjYygibXA0MiIpOworICAgICAgICB3cml0ZUludDMyKDApOworICAgICAgICB3cml0ZUZvdXJjYygiaXNvbSIpOworICAgICAgICB3cml0ZUZvdXJjYygibXA0MiIpOwogICAgIH0KIAotICAgIHdyaXRlSW50MzIoMCk7Ci0gICAgd3JpdGVGb3VyY2MoImlzb20iKTsKLSAgICB3cml0ZUZvdXJjYygiM2dwNCIpOwogICAgIGVuZEJveCgpOwogfQogCkBAIC0xMzExLDEyICsxMzIxLDEyIEBACiB9CiAKIHZvaWQgTVBFRzRXcml0ZXI6OnNldFN0YXJ0VGltZXN0YW1wVXMoaW50NjRfdCB0aW1lVXMpIHsKLSAgICBBTE9HSSgic2V0U3RhcnRUaW1lc3RhbXBVczogJWxsZCIsIHRpbWVVcyk7CisgICAgQUxPR0koInNldFN0YXJ0VGltZXN0YW1wVXM6ICUiIFBSSWQ2NCwgdGltZVVzKTsKICAgICBDSEVDS19HRSh0aW1lVXMsIDBsbCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICBpZiAobVN0YXJ0VGltZXN0YW1wVXMgPCAwIHx8IG1TdGFydFRpbWVzdGFtcFVzID4gdGltZVVzKSB7CiAgICAgICAgIG1TdGFydFRpbWVzdGFtcFVzID0gdGltZVVzOwotICAgICAgICBBTE9HSSgiRWFybGllc3QgdHJhY2sgc3RhcnRpbmcgdGltZTogJWxsZCIsIG1TdGFydFRpbWVzdGFtcFVzKTsKKyAgICAgICAgQUxPR0koIkVhcmxpZXN0IHRyYWNrIHN0YXJ0aW5nIHRpbWU6ICUiIFBSSWQ2NCwgbVN0YXJ0VGltZXN0YW1wVXMpOwogICAgIH0KIH0KIApAQCAtMTQwNiw3ICsxNDE2LDcgQEAKICAgICAgICAgc2l6ZV90IHNhbXBsZUNvdW50LCBpbnQzMl90IGR1cmF0aW9uKSB7CiAKICAgICBpZiAoZHVyYXRpb24gPT0gMCkgewotICAgICAgICBBTE9HVygiMC1kdXJhdGlvbiBzYW1wbGVzIGZvdW5kOiAlZCIsIHNhbXBsZUNvdW50KTsKKyAgICAgICAgQUxPR1coIjAtZHVyYXRpb24gc2FtcGxlcyBmb3VuZDogJXp1Iiwgc2FtcGxlQ291bnQpOwogICAgIH0KICAgICBtU3R0c1RhYmxlRW50cmllcy0+YWRkKGh0b25sKHNhbXBsZUNvdW50KSk7CiAgICAgbVN0dHNUYWJsZUVudHJpZXMtPmFkZChodG9ubChkdXJhdGlvbikpOwpAQCAtMTUxNyw3ICsxNTI3LDcgQEAKICAgICB7CiAgICAgICAgIGludDY0X3QgdGltZVVzOwogICAgICAgICBpZiAocGFyYW1zICYmIHBhcmFtcy0+ZmluZEludDY0KGtLZXlUcmFja1RpbWVTdGF0dXMsICZ0aW1lVXMpKSB7Ci0gICAgICAgICAgICBBTE9HVigiUmVjZWl2ZSByZXF1ZXN0IHRvIHRyYWNrIHByb2dyZXNzIHN0YXR1cyBmb3IgZXZlcnkgJWxsZCB1cyIsIHRpbWVVcyk7CisgICAgICAgICAgICBBTE9HVigiUmVjZWl2ZSByZXF1ZXN0IHRvIHRyYWNrIHByb2dyZXNzIHN0YXR1cyBmb3IgZXZlcnkgJSIgUFJJZDY0ICIgdXMiLCB0aW1lVXMpOwogICAgICAgICAgICAgbVRyYWNrRXZlcnlUaW1lRHVyYXRpb25VcyA9IHRpbWVVczsKICAgICAgICAgICAgIG1UcmFja2luZ1Byb2dyZXNzU3RhdHVzID0gdHJ1ZTsKICAgICAgICAgfQpAQCAtMTU1MSw3ICsxNTYxLDcgQEAKIH0KIAogdm9pZCBNUEVHNFdyaXRlcjo6d3JpdGVDaHVua1RvRmlsZShDaHVuayogY2h1bmspIHsKLSAgICBBTE9HVigid3JpdGVDaHVua1RvRmlsZTogJWxsZCBmcm9tICVzIHRyYWNrIiwKKyAgICBBTE9HVigid3JpdGVDaHVua1RvRmlsZTogJSIgUFJJZDY0ICIgZnJvbSAlcyB0cmFjayIsCiAgICAgICAgIGNodW5rLT5tVGltZVN0YW1wVXMsIGNodW5rLT5tVHJhY2stPmlzQXVkaW8oKT8gImF1ZGlvIjogInZpZGVvIik7CiAKICAgICBpbnQzMl90IGlzRmlyc3RTYW1wbGUgPSB0cnVlOwpAQCAtMTU4Niw3ICsxNTk2LDcgQEAKICAgICBzZW5kU2Vzc2lvblN1bW1hcnkoKTsKIAogICAgIG1DaHVua0luZm9zLmNsZWFyKCk7Ci0gICAgQUxPR0QoIiVkIGNodW5rcyBhcmUgd3JpdHRlbiBpbiB0aGUgbGFzdCBiYXRjaCIsIG91dHN0YW5kaW5nQ2h1bmtzKTsKKyAgICBBTE9HRCgiJXp1IGNodW5rcyBhcmUgd3JpdHRlbiBpbiB0aGUgbGFzdCBiYXRjaCIsIG91dHN0YW5kaW5nQ2h1bmtzKTsKIH0KIAogYm9vbCBNUEVHNFdyaXRlcjo6ZmluZENodW5rVG9Xcml0ZShDaHVuayAqY2h1bmspIHsKQEAgLTE3MjcsNyArMTczNyw3IEBACiAgICAgICAgICAgICBzdGFydFRpbWVPZmZzZXRVcyA9IGtJbml0aWFsRGVsYXlUaW1lVXM7CiAgICAgICAgIH0KICAgICAgICAgc3RhcnRUaW1lVXMgKz0gc3RhcnRUaW1lT2Zmc2V0VXM7Ci0gICAgICAgIEFMT0dJKCJTdGFydCB0aW1lIG9mZnNldDogJWxsZCB1cyIsIHN0YXJ0VGltZU9mZnNldFVzKTsKKyAgICAgICAgQUxPR0koIlN0YXJ0IHRpbWUgb2Zmc2V0OiAlIiBQUklkNjQgIiB1cyIsIHN0YXJ0VGltZU9mZnNldFVzKTsKICAgICB9CiAKICAgICBtZXRhLT5zZXRJbnQ2NChrS2V5VGltZSwgc3RhcnRUaW1lVXMpOwpAQCAtMTc2Miw3ICsxNzcyLDcgQEAKIH0KIAogc3RhdHVzX3QgTVBFRzRXcml0ZXI6OlRyYWNrOjpzdG9wKCkgewotICAgIEFMT0dEKCJTdG9wcGluZyAlcyB0cmFjayIsIG1Jc0F1ZGlvPyAiQXVkaW8iOiAiVmlkZW8iKTsKKyAgICBBTE9HRCgiJXMgdHJhY2sgc3RvcHBpbmciLCBtSXNBdWRpbz8gIkF1ZGlvIjogIlZpZGVvIik7CiAgICAgaWYgKCFtU3RhcnRlZCkgewogICAgICAgICBBTE9HRSgiU3RvcCgpIGNhbGxlZCBidXQgdHJhY2sgaXMgbm90IHN0YXJ0ZWQiKTsKICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CkBAIC0xNzczLDE4ICsxNzgzLDEzIEBACiAgICAgfQogICAgIG1Eb25lID0gdHJ1ZTsKIAorICAgIEFMT0dEKCIlcyB0cmFjayBzb3VyY2Ugc3RvcHBpbmciLCBtSXNBdWRpbz8gIkF1ZGlvIjogIlZpZGVvIik7CisgICAgbVNvdXJjZS0+c3RvcCgpOworICAgIEFMT0dEKCIlcyB0cmFjayBzb3VyY2Ugc3RvcHBlZCIsIG1Jc0F1ZGlvPyAiQXVkaW8iOiAiVmlkZW8iKTsKKwogICAgIHZvaWQgKmR1bW15OwogICAgIHB0aHJlYWRfam9pbihtVGhyZWFkLCAmZHVtbXkpOwotCi0gICAgc3RhdHVzX3QgZXJyID0gKHN0YXR1c190KSBkdW1teTsKLQotICAgIEFMT0dEKCJTdG9wcGluZyAlcyB0cmFjayBzb3VyY2UiLCBtSXNBdWRpbz8gIkF1ZGlvIjogIlZpZGVvIik7Ci0gICAgewotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU291cmNlLT5zdG9wKCk7Ci0gICAgICAgIGlmIChlcnIgPT0gT0sgJiYgc3RhdHVzICE9IE9LICYmIHN0YXR1cyAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7Ci0gICAgICAgICAgICBlcnIgPSBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICB9CisgICAgc3RhdHVzX3QgZXJyID0gc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihkdW1teSkpOwogCiAgICAgQUxPR0QoIiVzIHRyYWNrIHN0b3BwZWQiLCBtSXNBdWRpbz8gIkF1ZGlvIjogIlZpZGVvIik7CiAgICAgcmV0dXJuIGVycjsKQEAgLTE3OTksNyArMTgwNCw3IEBACiAgICAgVHJhY2sgKnRyYWNrID0gc3RhdGljX2Nhc3Q8VHJhY2sgKj4obWUpOwogCiAgICAgc3RhdHVzX3QgZXJyID0gdHJhY2stPnRocmVhZEVudHJ5KCk7Ci0gICAgcmV0dXJuICh2b2lkICopIGVycjsKKyAgICByZXR1cm4gKHZvaWQgKikodWludHB0cl90KWVycjsKIH0KIAogc3RhdGljIHZvaWQgZ2V0TmFsVW5pdFR5cGUodWludDhfdCBieXRlLCB1aW50OF90KiB0eXBlKSB7CkBAIC0xODEyLDcgKzE4MTcsNyBAQAogc3RhdGljIGNvbnN0IHVpbnQ4X3QgKmZpbmROZXh0U3RhcnRDb2RlKAogICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgbGVuZ3RoKSB7CiAKLSAgICBBTE9HVigiZmluZE5leHRTdGFydENvZGU6ICVwICVkIiwgZGF0YSwgbGVuZ3RoKTsKKyAgICBBTE9HVigiZmluZE5leHRTdGFydENvZGU6ICVwICV6dSIsIGRhdGEsIGxlbmd0aCk7CiAKICAgICBzaXplX3QgYnl0ZXNMZWZ0ID0gbGVuZ3RoOwogICAgIHdoaWxlIChieXRlc0xlZnQgPiA0ICAmJgpAQCAtMTg3MSw3ICsxODc2LDcgQEAKICAgICAvLyAyIGJ5dGVzIGZvciBlYWNoIG9mIHRoZSBwYXJhbWV0ZXIgc2V0IGxlbmd0aCBmaWVsZAogICAgIC8vIHBsdXMgdGhlIDcgYnl0ZXMgZm9yIHRoZSBoZWFkZXIKICAgICBpZiAoc2l6ZSA8IDQgKyA3KSB7Ci0gICAgICAgIEFMT0dFKCJDb2RlYyBzcGVjaWZpYyBkYXRhIGxlbmd0aCB0b28gc2hvcnQ6ICVkIiwgc2l6ZSk7CisgICAgICAgIEFMT0dFKCJDb2RlYyBzcGVjaWZpYyBkYXRhIGxlbmd0aCB0b28gc2hvcnQ6ICV6dSIsIHNpemUpOwogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KIApAQCAtMTk0MCw3ICsxOTQ1LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChuU2VxUGFyYW1TZXRzID4gMHgxRikgewotICAgICAgICAgICAgQUxPR0UoIlRvbyBtYW55IHNlcSBwYXJhbWV0ZXIgc2V0cyAoJWQpIGZvdW5kIiwgblNlcVBhcmFtU2V0cyk7CisgICAgICAgICAgICBBTE9HRSgiVG9vIG1hbnkgc2VxIHBhcmFtZXRlciBzZXRzICglenUpIGZvdW5kIiwgblNlcVBhcmFtU2V0cyk7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAgICAgfQpAQCAtMTk1Myw3ICsxOTU4LDcgQEAKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG5QaWNQYXJhbVNldHMgPiAweEZGKSB7Ci0gICAgICAgICAgICBBTE9HRSgiVG9vIG1hbnkgcGljIHBhcmFtZXRlciBzZXRzICglZCkgZm91bmQiLCBuUGljUGFyYW1TZXRzKTsKKyAgICAgICAgICAgIEFMT0dFKCJUb28gbWFueSBwaWMgcGFyYW1ldGVyIHNldHMgKCV6ZCkgZm91bmQiLCBuUGljUGFyYW1TZXRzKTsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KICAgICB9CkBAIC0xOTgzLDcgKzE5ODgsNyBAQAogICAgIH0KIAogICAgIGlmIChzaXplIDwgNCkgewotICAgICAgICBBTE9HRSgiQ29kZWMgc3BlY2lmaWMgZGF0YSBsZW5ndGggdG9vIHNob3J0OiAlZCIsIHNpemUpOworICAgICAgICBBTE9HRSgiQ29kZWMgc3BlY2lmaWMgZGF0YSBsZW5ndGggdG9vIHNob3J0OiAlenUiLCBzaXplKTsKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKQEAgLTIwOTksNiArMjEwNCw3IEBACiAKICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyOworICAgIGNvbnN0IGNoYXIgKnRyYWNrTmFtZSA9IG1Jc0F1ZGlvID8gIkF1ZGlvIiA6ICJWaWRlbyI7CiAgICAgd2hpbGUgKCFtRG9uZSAmJiAoZXJyID0gbVNvdXJjZS0+cmVhZCgmYnVmZmVyKSkgPT0gT0spIHsKICAgICAgICAgaWYgKGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPT0gMCkgewogICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CkBAIC0yMTk0LDE1ICsyMjAwLDI3IEBACiAKICAgICAgICAgaWYgKG1SZXN1bWVkKSB7CiAgICAgICAgICAgICBpbnQ2NF90IGR1ckV4Y2x1ZGluZ0VhcmxpZXJQYXVzZXNVcyA9IHRpbWVzdGFtcFVzIC0gcHJldmlvdXNQYXVzZWREdXJhdGlvblVzOwotICAgICAgICAgICAgQ0hFQ0tfR0UoZHVyRXhjbHVkaW5nRWFybGllclBhdXNlc1VzLCAwbGwpOworICAgICAgICAgICAgaWYgKFdBUk5fVU5MRVNTKGR1ckV4Y2x1ZGluZ0VhcmxpZXJQYXVzZXNVcyA+PSAwbGwsICJmb3IgJXMgdHJhY2siLCB0cmFja05hbWUpKSB7CisgICAgICAgICAgICAgICAgY29weS0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGludDY0X3QgcGF1c2VkRHVyYXRpb25VcyA9IGR1ckV4Y2x1ZGluZ0VhcmxpZXJQYXVzZXNVcyAtIG1UcmFja0R1cmF0aW9uVXM7Ci0gICAgICAgICAgICBDSEVDS19HRShwYXVzZWREdXJhdGlvblVzLCBsYXN0RHVyYXRpb25Vcyk7CisgICAgICAgICAgICBpZiAoV0FSTl9VTkxFU1MocGF1c2VkRHVyYXRpb25VcyA+PSBsYXN0RHVyYXRpb25VcywgImZvciAlcyB0cmFjayIsIHRyYWNrTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBjb3B5LT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzICs9IHBhdXNlZER1cmF0aW9uVXMgLSBsYXN0RHVyYXRpb25VczsKICAgICAgICAgICAgIG1SZXN1bWVkID0gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICB0aW1lc3RhbXBVcyAtPSBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXM7Ci0gICAgICAgIENIRUNLX0dFKHRpbWVzdGFtcFVzLCAwbGwpOworICAgICAgICBpZiAoV0FSTl9VTkxFU1ModGltZXN0YW1wVXMgPj0gMGxsLCAiZm9yICVzIHRyYWNrIiwgdHJhY2tOYW1lKSkgeworICAgICAgICAgICAgY29weS0+cmVsZWFzZSgpOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCiAgICAgICAgIGlmICghbUlzQXVkaW8pIHsKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBDb21wb3NpdGlvbiB0aW1lOiB0aW1lc3RhbXBVcwpAQCAtMjIxNCwxNSArMjIzMiwyMyBAQAogICAgICAgICAgICAgZGVjb2RpbmdUaW1lVXMgLT0gcHJldmlvdXNQYXVzZWREdXJhdGlvblVzOwogICAgICAgICAgICAgY3R0c09mZnNldFRpbWVVcyA9CiAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcFVzICsga01heEN0dHNPZmZzZXRUaW1lVXMgLSBkZWNvZGluZ1RpbWVVczsKLSAgICAgICAgICAgIENIRUNLX0dFKGN0dHNPZmZzZXRUaW1lVXMsIDBsbCk7CisgICAgICAgICAgICBpZiAoV0FSTl9VTkxFU1MoY3R0c09mZnNldFRpbWVVcyA+PSAwbGwsICJmb3IgJXMgdHJhY2siLCB0cmFja05hbWUpKSB7CisgICAgICAgICAgICAgICAgY29weS0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHRpbWVzdGFtcFVzID0gZGVjb2RpbmdUaW1lVXM7Ci0gICAgICAgICAgICBBTE9HVigiZGVjb2RpbmcgdGltZTogJWxsZCBhbmQgY3R0cyBvZmZzZXQgdGltZTogJWxsZCIsCisgICAgICAgICAgICBBTE9HVigiZGVjb2RpbmcgdGltZTogJSIgUFJJZDY0ICIgYW5kIGN0dHMgb2Zmc2V0IHRpbWU6ICUiIFBSSWQ2NCwKICAgICAgICAgICAgICAgICB0aW1lc3RhbXBVcywgY3R0c09mZnNldFRpbWVVcyk7CiAKICAgICAgICAgICAgIC8vIFVwZGF0ZSBjdHRzIGJveCB0YWJsZSBpZiBuZWNlc3NhcnkKICAgICAgICAgICAgIGN1cnJDdHRzT2Zmc2V0VGltZVRpY2tzID0KICAgICAgICAgICAgICAgICAgICAgKGN0dHNPZmZzZXRUaW1lVXMgKiBtVGltZVNjYWxlICsgNTAwMDAwTEwpIC8gMTAwMDAwMExMOwotICAgICAgICAgICAgQ0hFQ0tfTEUoY3VyckN0dHNPZmZzZXRUaW1lVGlja3MsIDB4MEZGRkZGRkZGTEwpOworICAgICAgICAgICAgaWYgKFdBUk5fVU5MRVNTKGN1cnJDdHRzT2Zmc2V0VGltZVRpY2tzIDw9IDB4MEZGRkZGRkZGTEwsICJmb3IgJXMgdHJhY2siLCB0cmFja05hbWUpKSB7CisgICAgICAgICAgICAgICAgY29weS0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChtU3RzelRhYmxlRW50cmllcy0+Y291bnQoKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgLy8gRm9yY2UgdGhlIGZpcnN0IGN0dHMgdGFibGUgZW50cnkgdG8gaGF2ZSBvbmUgc2luZ2xlIGVudHJ5CiAgICAgICAgICAgICAgICAgLy8gc28gdGhhdCB3ZSBjYW4gZG8gYWRqdXN0bWVudCBmb3IgdGhlIGluaXRpYWwgdHJhY2sgc3RhcnQKQEAgLTIyNjAsOSArMjI4NiwxMyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgQ0hFQ0tfR0UodGltZXN0YW1wVXMsIDBsbCk7Ci0gICAgICAgIEFMT0dWKCIlcyBtZWRpYSB0aW1lIHN0YW1wOiAlbGxkIGFuZCBwcmV2aW91cyBwYXVzZWQgZHVyYXRpb24gJWxsZCIsCi0gICAgICAgICAgICAgICAgbUlzQXVkaW8/ICJBdWRpbyI6ICJWaWRlbyIsIHRpbWVzdGFtcFVzLCBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXMpOworICAgICAgICBpZiAoV0FSTl9VTkxFU1ModGltZXN0YW1wVXMgPj0gMGxsLCAiZm9yICVzIHRyYWNrIiwgdHJhY2tOYW1lKSkgeworICAgICAgICAgICAgY29weS0+cmVsZWFzZSgpOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCIlcyBtZWRpYSB0aW1lIHN0YW1wOiAlIiBQUklkNjQgIiBhbmQgcHJldmlvdXMgcGF1c2VkIGR1cmF0aW9uICUiIFBSSWQ2NCwKKyAgICAgICAgICAgICAgICB0cmFja05hbWUsIHRpbWVzdGFtcFVzLCBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXMpOwogICAgICAgICBpZiAodGltZXN0YW1wVXMgPiBtVHJhY2tEdXJhdGlvblVzKSB7CiAgICAgICAgICAgICBtVHJhY2tEdXJhdGlvblVzID0gdGltZXN0YW1wVXM7CiAgICAgICAgIH0KQEAgLTIyNzYsMTEgKzIzMDYsMjggQEAKICAgICAgICAgICAgICgodGltZXN0YW1wVXMgKiBtVGltZVNjYWxlICsgNTAwMDAwTEwpIC8gMTAwMDAwMExMIC0KICAgICAgICAgICAgICAgICAobGFzdFRpbWVzdGFtcFVzICogbVRpbWVTY2FsZSArIDUwMDAwMExMKSAvIDEwMDAwMDBMTCk7CiAgICAgICAgIGlmIChjdXJyRHVyYXRpb25UaWNrcyA8IDBsbCkgewotICAgICAgICAgICAgQUxPR0UoInRpbWVzdGFtcFVzICVsbGQgPCBsYXN0VGltZXN0YW1wVXMgJWxsZCBmb3IgJXMgdHJhY2siLAotICAgICAgICAgICAgICAgIHRpbWVzdGFtcFVzLCBsYXN0VGltZXN0YW1wVXMsIG1Jc0F1ZGlvPyAiQXVkaW8iOiAiVmlkZW8iKTsKKyAgICAgICAgICAgIEFMT0dFKCJ0aW1lc3RhbXBVcyAlIiBQUklkNjQgIiA8IGxhc3RUaW1lc3RhbXBVcyAlIiBQUklkNjQgIiBmb3IgJXMgdHJhY2siLAorICAgICAgICAgICAgICAgIHRpbWVzdGFtcFVzLCBsYXN0VGltZXN0YW1wVXMsIHRyYWNrTmFtZSk7CisgICAgICAgICAgICBjb3B5LT5yZWxlYXNlKCk7CiAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgfQogCisgICAgICAgIC8vIGlmIHRoZSBkdXJhdGlvbiBpcyBkaWZmZXJlbnQgZm9yIHRoaXMgc2FtcGxlLCBzZWUgaWYgaXQgaXMgY2xvc2UgZW5vdWdoIHRvIHRoZSBwcmV2aW91cworICAgICAgICAvLyBkdXJhdGlvbiB0aGF0IHdlIGNhbiBmdWRnZSBpdCBhbmQgdXNlIHRoZSBzYW1lIHZhbHVlLCB0byBhdm9pZCBmaWxsaW5nIHRoZSBzdHRzIHRhYmxlCisgICAgICAgIC8vIHdpdGggbG90cyBvZiBuZWFyLWlkZW50aWNhbCBlbnRyaWVzLgorICAgICAgICAvLyAiY2xvc2UgZW5vdWdoIiBoZXJlIG1lYW5zIHRoYXQgdGhlIGN1cnJlbnQgZHVyYXRpb24gbmVlZHMgdG8gYmUgYWRqdXN0ZWQgYnkgbGVzcworICAgICAgICAvLyB0aGFuIDAuMSBtaWxsaXNlY29uZHMKKyAgICAgICAgaWYgKGxhc3REdXJhdGlvblRpY2tzICYmIChjdXJyRHVyYXRpb25UaWNrcyAhPSBsYXN0RHVyYXRpb25UaWNrcykpIHsKKyAgICAgICAgICAgIGludDY0X3QgZGVsdGFVcyA9ICgobGFzdER1cmF0aW9uVGlja3MgLSBjdXJyRHVyYXRpb25UaWNrcykgKiAxMDAwMDAwTEwKKyAgICAgICAgICAgICAgICAgICAgKyAobVRpbWVTY2FsZSAvIDIpKSAvIG1UaW1lU2NhbGU7CisgICAgICAgICAgICBpZiAoZGVsdGFVcyA+IC0xMDAgJiYgZGVsdGFVcyA8IDEwMCkgeworICAgICAgICAgICAgICAgIC8vIHVzZSBwcmV2aW91cyB0aWNrcywgYW5kIGFkanVzdCB0aW1lc3RhbXAgYXMgaWYgaXQgd2FzIGFjdHVhbGx5IHRoYXQgbnVtYmVyCisgICAgICAgICAgICAgICAgLy8gb2YgdGlja3MKKyAgICAgICAgICAgICAgICBjdXJyRHVyYXRpb25UaWNrcyA9IGxhc3REdXJhdGlvblRpY2tzOworICAgICAgICAgICAgICAgIHRpbWVzdGFtcFVzICs9IGRlbHRhVXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBtU3RzelRhYmxlRW50cmllcy0+YWRkKGh0b25sKHNhbXBsZVNpemUpKTsKICAgICAgICAgaWYgKG1TdHN6VGFibGVFbnRyaWVzLT5jb3VudCgpID4gMikgewogCkBAIC0yMzAwLDggKzIzNDcsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgcHJldmlvdXNTYW1wbGVTaXplID0gc2FtcGxlU2l6ZTsKICAgICAgICAgfQotICAgICAgICBBTE9HVigiJXMgdGltZXN0YW1wVXMvbGFzdFRpbWVzdGFtcFVzOiAlbGxkLyVsbGQiLAotICAgICAgICAgICAgICAgIG1Jc0F1ZGlvPyAiQXVkaW8iOiAiVmlkZW8iLCB0aW1lc3RhbXBVcywgbGFzdFRpbWVzdGFtcFVzKTsKKyAgICAgICAgQUxPR1YoIiVzIHRpbWVzdGFtcFVzL2xhc3RUaW1lc3RhbXBVczogJSIgUFJJZDY0ICIvJSIgUFJJZDY0LAorICAgICAgICAgICAgICAgIHRyYWNrTmFtZSwgdGltZXN0YW1wVXMsIGxhc3RUaW1lc3RhbXBVcyk7CiAgICAgICAgIGxhc3REdXJhdGlvblVzID0gdGltZXN0YW1wVXMgLSBsYXN0VGltZXN0YW1wVXM7CiAgICAgICAgIGxhc3REdXJhdGlvblRpY2tzID0gY3VyckR1cmF0aW9uVGlja3M7CiAgICAgICAgIGxhc3RUaW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOwpAQCAtMjQwNiw5ICsyNDUzLDkgQEAKICAgICBzZW5kVHJhY2tTdW1tYXJ5KGhhc011bHRpcGxlVHJhY2tzKTsKIAogICAgIEFMT0dJKCJSZWNlaXZlZCB0b3RhbC8wLWxlbmd0aCAoJWQvJWQpIGJ1ZmZlcnMgYW5kIGVuY29kZWQgJWQgZnJhbWVzLiAtICVzIiwKLSAgICAgICAgICAgIGNvdW50LCBuWmVyb0xlbmd0aEZyYW1lcywgbVN0c3pUYWJsZUVudHJpZXMtPmNvdW50KCksIG1Jc0F1ZGlvPyAiYXVkaW8iOiAidmlkZW8iKTsKKyAgICAgICAgICAgIGNvdW50LCBuWmVyb0xlbmd0aEZyYW1lcywgbVN0c3pUYWJsZUVudHJpZXMtPmNvdW50KCksIHRyYWNrTmFtZSk7CiAgICAgaWYgKG1Jc0F1ZGlvKSB7Ci0gICAgICAgIEFMT0dJKCJBdWRpbyB0cmFjayBkcmlmdCB0aW1lOiAlbGxkIHVzIiwgbU93bmVyLT5nZXREcmlmdFRpbWVVcygpKTsKKyAgICAgICAgQUxPR0koIkF1ZGlvIHRyYWNrIGRyaWZ0IHRpbWU6ICUiIFBSSWQ2NCAiIHVzIiwgbU93bmVyLT5nZXREcmlmdFRpbWVVcygpKTsKICAgICB9CiAKICAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKQEAgLTI0OTEsMTEgKzI1MzgsMTEgQEAKIH0KIAogdm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OnRyYWNrUHJvZ3Jlc3NTdGF0dXMoaW50NjRfdCB0aW1lVXMsIHN0YXR1c190IGVycikgewotICAgIEFMT0dWKCJ0cmFja1Byb2dyZXNzU3RhdHVzOiAlbGxkIHVzIiwgdGltZVVzKTsKKyAgICBBTE9HVigidHJhY2tQcm9ncmVzc1N0YXR1czogJSIgUFJJZDY0ICIgdXMiLCB0aW1lVXMpOwogCiAgICAgaWYgKG1UcmFja0V2ZXJ5VGltZUR1cmF0aW9uVXMgPiAwICYmCiAgICAgICAgIHRpbWVVcyAtIG1QcmV2aW91c1RyYWNrVGltZVVzID49IG1UcmFja0V2ZXJ5VGltZUR1cmF0aW9uVXMpIHsKLSAgICAgICAgQUxPR1YoIkZpcmUgdGltZSB0cmFja2luZyBwcm9ncmVzcyBzdGF0dXMgYXQgJWxsZCB1cyIsIHRpbWVVcyk7CisgICAgICAgIEFMT0dWKCJGaXJlIHRpbWUgdHJhY2tpbmcgcHJvZ3Jlc3Mgc3RhdHVzIGF0ICUiIFBSSWQ2NCAiIHVzIiwgdGltZVVzKTsKICAgICAgICAgbU93bmVyLT50cmFja1Byb2dyZXNzU3RhdHVzKG1UcmFja0lkLCB0aW1lVXMgLSBtUHJldmlvdXNUcmFja1RpbWVVcywgZXJyKTsKICAgICAgICAgbVByZXZpb3VzVHJhY2tUaW1lVXMgPSB0aW1lVXM7CiAgICAgfQpAQCAtMjUyOSwxMyArMjU3NiwxMyBAQAogfQogCiB2b2lkIE1QRUc0V3JpdGVyOjpzZXREcmlmdFRpbWVVcyhpbnQ2NF90IGRyaWZ0VGltZVVzKSB7Ci0gICAgQUxPR1YoInNldERyaWZ0VGltZVVzOiAlbGxkIHVzIiwgZHJpZnRUaW1lVXMpOworICAgIEFMT0dWKCJzZXREcmlmdFRpbWVVczogJSIgUFJJZDY0ICIgdXMiLCBkcmlmdFRpbWVVcyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKICAgICBtRHJpZnRUaW1lVXMgPSBkcmlmdFRpbWVVczsKIH0KIAogaW50NjRfdCBNUEVHNFdyaXRlcjo6Z2V0RHJpZnRUaW1lVXMoKSB7Ci0gICAgQUxPR1YoImdldERyaWZ0VGltZVVzOiAlbGxkIHVzIiwgbURyaWZ0VGltZVVzKTsKKyAgICBBTE9HVigiZ2V0RHJpZnRUaW1lVXM6ICUiIFBSSWQ2NCAiIHVzIiwgbURyaWZ0VGltZVVzKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOwogICAgIHJldHVybiBtRHJpZnRUaW1lVXM7CiB9CkBAIC0yOTkxLDcgKzMwMzgsNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgQUxPR1YoImN0dHMgYm94IGhhcyAlZCBlbnRyaWVzIHdpdGggcmFuZ2UgWyVsbGQsICVsbGRdIiwKKyAgICBBTE9HVigiY3R0cyBib3ggaGFzICVkIGVudHJpZXMgd2l0aCByYW5nZSBbJSIgUFJJZDY0ICIsICUiIFBSSWQ2NCAiXSIsCiAgICAgICAgICAgICBtQ3R0c1RhYmxlRW50cmllcy0+Y291bnQoKSwgbU1pbkN0dHNPZmZzZXRUaW1lVXMsIG1NYXhDdHRzT2Zmc2V0VGltZVVzKTsKIAogICAgIG1Pd25lci0+YmVnaW5Cb3goImN0dHMiKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQWRhcHRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUFkYXB0ZXIuY3BwCmluZGV4IDI0ODQyMTIuLmQ2ODBlMGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQWRhcHRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFBZGFwdGVyLmNwcApAQCAtMzYsNyArMzYsNyBAQAogICAgIENIRUNLKG1DdXJyZW50TWVkaWFCdWZmZXIgPT0gTlVMTCk7CiB9CiAKLXN0YXR1c190IE1lZGlhQWRhcHRlcjo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgeworc3RhdHVzX3QgTWVkaWFBZGFwdGVyOjpzdGFydChNZXRhRGF0YSAqIC8qIHBhcmFtcyAqLykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtQWRhcHRlckxvY2spOwogICAgIGlmICghbVN0YXJ0ZWQpIHsKICAgICAgICAgbVN0YXJ0ZWQgPSB0cnVlOwpAQCAtNzUsNyArNzUsNyBAQAogfQogCiBzdGF0dXNfdCBNZWRpYUFkYXB0ZXI6OnJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqIC8qIG9wdGlvbnMgKi8pIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUFkYXB0ZXJMb2NrKTsKICAgICBpZiAoIW1TdGFydGVkKSB7CiAgICAgICAgIEFMT0dWKCJSZWFkIGJlZm9yZSBldmVuIHN0YXJ0ZWQhIik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5jcHAKaW5kZXggMTFiODBiZi4uMWY4MGE0NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmNwcApAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAKICNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+Ci0jaW5jbHVkZSA8c3lzL2F0b21pY3MuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC05Miw3ICs5MSw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBpbnQgcHJldkNvdW50ID0gX19hdG9taWNfZGVjKCZtUmVmQ291bnQpOworICAgIGludCBwcmV2Q291bnQgPSBfX3N5bmNfZmV0Y2hfYW5kX3N1YigmbVJlZkNvdW50LCAxKTsKICAgICBpZiAocHJldkNvdW50ID09IDEpIHsKICAgICAgICAgaWYgKG1PYnNlcnZlciA9PSBOVUxMKSB7CiAgICAgICAgICAgICBkZWxldGUgdGhpczsKQEAgLTExMiw3ICsxMTEsNyBAQAogfQogCiB2b2lkIE1lZGlhQnVmZmVyOjphZGRfcmVmKCkgewotICAgICh2b2lkKSBfX2F0b21pY19pbmMoJm1SZWZDb3VudCk7CisgICAgKHZvaWQpIF9fc3luY19mZXRjaF9hbmRfYWRkKCZtUmVmQ291bnQsIDEpOwogfQogCiB2b2lkICpNZWRpYUJ1ZmZlcjo6ZGF0YSgpIGNvbnN0IHsKQEAgLTEzNSw3ICsxMzQsNyBAQAogCiB2b2lkIE1lZGlhQnVmZmVyOjpzZXRfcmFuZ2Uoc2l6ZV90IG9mZnNldCwgc2l6ZV90IGxlbmd0aCkgewogICAgIGlmICgobUdyYXBoaWNCdWZmZXIgPT0gTlVMTCkgJiYgKG9mZnNldCArIGxlbmd0aCA+IG1TaXplKSkgewotICAgICAgICBBTE9HRSgib2Zmc2V0ID0gJWQsIGxlbmd0aCA9ICVkLCBtU2l6ZSA9ICVkIiwgb2Zmc2V0LCBsZW5ndGgsIG1TaXplKTsKKyAgICAgICAgQUxPR0UoIm9mZnNldCA9ICV6dSwgbGVuZ3RoID0gJXp1LCBtU2l6ZSA9ICV6dSIsIG9mZnNldCwgbGVuZ3RoLCBtU2l6ZSk7CiAgICAgfQogICAgIENIRUNLKChtR3JhcGhpY0J1ZmZlciAhPSBOVUxMKSB8fCAob2Zmc2V0ICsgbGVuZ3RoIDw9IG1TaXplKSk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5jcHAKaW5kZXggODBhYWU1MS4uNmFjNmQ0YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5jcHAKQEAgLTU1LDcgKzU1LDggQEAKICAgICBtTGFzdEJ1ZmZlciA9IGJ1ZmZlcjsKIH0KIAotc3RhdHVzX3QgTWVkaWFCdWZmZXJHcm91cDo6YWNxdWlyZV9idWZmZXIoTWVkaWFCdWZmZXIgKipvdXQpIHsKK3N0YXR1c190IE1lZGlhQnVmZmVyR3JvdXA6OmFjcXVpcmVfYnVmZmVyKAorICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgYm9vbCBub25CbG9ja2luZykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBmb3IgKDs7KSB7CkBAIC03MCw2ICs3MSwxMSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgaWYgKG5vbkJsb2NraW5nKSB7CisgICAgICAgICAgICAqb3V0ID0gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIEFsbCBidWZmZXJzIGFyZSBpbiB1c2UuIEJsb2NrIHVudGlsIG9uZSBvZiB0aGVtIGlzIHJldHVybmVkIHRvIHVzLgogICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAKaW5kZXggOGFmMWFhZi4uZGY0N2JkNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAKQEAgLTE2LDEyICsxNiwxMyBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIk1lZGlhQ29kZWMiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KIAotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaD4KLQorI2luY2x1ZGUgImluY2x1ZGUvYXZjX3V0aWxzLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9Tb2Z0d2FyZVJlbmRlcmVyLmgiCiAKKyNpbmNsdWRlIDxiaW5kZXIvSUJhdHRlcnlTdGF0cy5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KQEAgLTMxLDQ1ICszMiwxMTkgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9CdWZmZXJQcm9kdWNlcldyYXBwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTmF0aXZlV2luZG93V3JhcHBlci5oPgotCi0jaW5jbHVkZSAiaW5jbHVkZS9hdmNfdXRpbHMuaCIKKyNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TaW5nbGV0b24uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi0vLyBzdGF0aWMKLXNwPE1lZGlhQ29kZWM+IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5VHlwZSgKLSAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwgY29uc3QgY2hhciAqbWltZSwgYm9vbCBlbmNvZGVyKSB7Ci0gICAgc3A8TWVkaWFDb2RlYz4gY29kZWMgPSBuZXcgTWVkaWFDb2RlYyhsb29wZXIpOwotICAgIGlmIChjb2RlYy0+aW5pdChtaW1lLCB0cnVlIC8qIG5hbWVJc1R5cGUgKi8sIGVuY29kZXIpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOworc3RydWN0IE1lZGlhQ29kZWM6OkJhdHRlcnlOb3RpZmllciA6IHB1YmxpYyBTaW5nbGV0b248QmF0dGVyeU5vdGlmaWVyPiB7CisgICAgQmF0dGVyeU5vdGlmaWVyKCk7CisKKyAgICB2b2lkIG5vdGVTdGFydFZpZGVvKCk7CisgICAgdm9pZCBub3RlU3RvcFZpZGVvKCk7CisgICAgdm9pZCBub3RlU3RhcnRBdWRpbygpOworICAgIHZvaWQgbm90ZVN0b3BBdWRpbygpOworCitwcml2YXRlOgorICAgIGludDMyX3QgbVZpZGVvUmVmQ291bnQ7CisgICAgaW50MzJfdCBtQXVkaW9SZWZDb3VudDsKKyAgICBzcDxJQmF0dGVyeVN0YXRzPiBtQmF0dGVyeVN0YXRTZXJ2aWNlOworfTsKKworQU5EUk9JRF9TSU5HTEVUT05fU1RBVElDX0lOU1RBTkNFKE1lZGlhQ29kZWM6OkJhdHRlcnlOb3RpZmllcikKKworTWVkaWFDb2RlYzo6QmF0dGVyeU5vdGlmaWVyOjpCYXR0ZXJ5Tm90aWZpZXIoKSA6CisgICAgbVZpZGVvUmVmQ291bnQoMCksCisgICAgbUF1ZGlvUmVmQ291bnQoMCkgeworICAgIC8vIGdldCBiYXR0ZXJ5IHNlcnZpY2UKKyAgICBjb25zdCBzcDxJU2VydmljZU1hbmFnZXI+IHNtKGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpKTsKKyAgICBpZiAoc20gIT0gTlVMTCkgeworICAgICAgICBjb25zdCBTdHJpbmcxNiBuYW1lKCJiYXR0ZXJ5c3RhdHMiKTsKKyAgICAgICAgbUJhdHRlcnlTdGF0U2VydmljZSA9IGludGVyZmFjZV9jYXN0PElCYXR0ZXJ5U3RhdHM+KHNtLT5nZXRTZXJ2aWNlKG5hbWUpKTsKKyAgICAgICAgaWYgKG1CYXR0ZXJ5U3RhdFNlcnZpY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoImJhdHRlcnlzdGF0cyBzZXJ2aWNlIHVuYXZhaWxhYmxlISIpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIE1lZGlhQ29kZWM6OkJhdHRlcnlOb3RpZmllcjo6bm90ZVN0YXJ0VmlkZW8oKSB7CisgICAgaWYgKG1WaWRlb1JlZkNvdW50ID09IDAgJiYgbUJhdHRlcnlTdGF0U2VydmljZSAhPSBOVUxMKSB7CisgICAgICAgIG1CYXR0ZXJ5U3RhdFNlcnZpY2UtPm5vdGVTdGFydFZpZGVvKEFJRF9NRURJQSk7CisgICAgfQorICAgIG1WaWRlb1JlZkNvdW50Kys7Cit9CisKK3ZvaWQgTWVkaWFDb2RlYzo6QmF0dGVyeU5vdGlmaWVyOjpub3RlU3RvcFZpZGVvKCkgeworICAgIGlmIChtVmlkZW9SZWZDb3VudCA9PSAwKSB7CisgICAgICAgIEFMT0dXKCJCYXR0ZXJ5Tm90aWZpZXI6Om5vdGVTdG9wKCk6IHZpZGVvIHJlZmNvdW50IGlzIGJyb2tlbiEiKTsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIHJldHVybiBjb2RlYzsKKyAgICBtVmlkZW9SZWZDb3VudC0tOworICAgIGlmIChtVmlkZW9SZWZDb3VudCA9PSAwICYmIG1CYXR0ZXJ5U3RhdFNlcnZpY2UgIT0gTlVMTCkgeworICAgICAgICBtQmF0dGVyeVN0YXRTZXJ2aWNlLT5ub3RlU3RvcFZpZGVvKEFJRF9NRURJQSk7CisgICAgfQorfQorCit2b2lkIE1lZGlhQ29kZWM6OkJhdHRlcnlOb3RpZmllcjo6bm90ZVN0YXJ0QXVkaW8oKSB7CisgICAgaWYgKG1BdWRpb1JlZkNvdW50ID09IDAgJiYgbUJhdHRlcnlTdGF0U2VydmljZSAhPSBOVUxMKSB7CisgICAgICAgIG1CYXR0ZXJ5U3RhdFNlcnZpY2UtPm5vdGVTdGFydEF1ZGlvKEFJRF9NRURJQSk7CisgICAgfQorICAgIG1BdWRpb1JlZkNvdW50Kys7Cit9CisKK3ZvaWQgTWVkaWFDb2RlYzo6QmF0dGVyeU5vdGlmaWVyOjpub3RlU3RvcEF1ZGlvKCkgeworICAgIGlmIChtQXVkaW9SZWZDb3VudCA9PSAwKSB7CisgICAgICAgIEFMT0dXKCJCYXR0ZXJ5Tm90aWZpZXI6Om5vdGVTdG9wKCk6IGF1ZGlvIHJlZmNvdW50IGlzIGJyb2tlbiEiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1BdWRpb1JlZkNvdW50LS07CisgICAgaWYgKG1BdWRpb1JlZkNvdW50ID09IDAgJiYgbUJhdHRlcnlTdGF0U2VydmljZSAhPSBOVUxMKSB7CisgICAgICAgIG1CYXR0ZXJ5U3RhdFNlcnZpY2UtPm5vdGVTdG9wQXVkaW8oQUlEX01FRElBKTsKKyAgICB9Cit9CisvLyBzdGF0aWMKK3NwPE1lZGlhQ29kZWM+IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5VHlwZSgKKyAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwgY29uc3QgY2hhciAqbWltZSwgYm9vbCBlbmNvZGVyLCBzdGF0dXNfdCAqZXJyKSB7CisgICAgc3A8TWVkaWFDb2RlYz4gY29kZWMgPSBuZXcgTWVkaWFDb2RlYyhsb29wZXIpOworCisgICAgY29uc3Qgc3RhdHVzX3QgcmV0ID0gY29kZWMtPmluaXQobWltZSwgdHJ1ZSAvKiBuYW1lSXNUeXBlICovLCBlbmNvZGVyKTsKKyAgICBpZiAoZXJyICE9IE5VTEwpIHsKKyAgICAgICAgKmVyciA9IHJldDsKKyAgICB9CisgICAgcmV0dXJuIHJldCA9PSBPSyA/IGNvZGVjIDogTlVMTDsgLy8gTlVMTCBkZWFsbG9jYXRlcyBjb2RlYy4KIH0KIAogLy8gc3RhdGljCiBzcDxNZWRpYUNvZGVjPiBNZWRpYUNvZGVjOjpDcmVhdGVCeUNvbXBvbmVudE5hbWUoCi0gICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsIGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwgY29uc3QgY2hhciAqbmFtZSwgc3RhdHVzX3QgKmVycikgewogICAgIHNwPE1lZGlhQ29kZWM+IGNvZGVjID0gbmV3IE1lZGlhQ29kZWMobG9vcGVyKTsKLSAgICBpZiAoY29kZWMtPmluaXQobmFtZSwgZmFsc2UgLyogbmFtZUlzVHlwZSAqLywgZmFsc2UgLyogZW5jb2RlciAqLykgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQogCi0gICAgcmV0dXJuIGNvZGVjOworICAgIGNvbnN0IHN0YXR1c190IHJldCA9IGNvZGVjLT5pbml0KG5hbWUsIGZhbHNlIC8qIG5hbWVJc1R5cGUgKi8sIGZhbHNlIC8qIGVuY29kZXIgKi8pOworICAgIGlmIChlcnIgIT0gTlVMTCkgeworICAgICAgICAqZXJyID0gcmV0OworICAgIH0KKyAgICByZXR1cm4gcmV0ID09IE9LID8gY29kZWMgOiBOVUxMOyAvLyBOVUxMIGRlYWxsb2NhdGVzIGNvZGVjLgogfQogCiBNZWRpYUNvZGVjOjpNZWRpYUNvZGVjKGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIpCiAgICAgOiBtU3RhdGUoVU5JTklUSUFMSVpFRCksCiAgICAgICBtTG9vcGVyKGxvb3BlciksCi0gICAgICBtQ29kZWMobmV3IEFDb2RlYyksCisgICAgICBtQ29kZWMoTlVMTCksCiAgICAgICBtUmVwbHlJRCgwKSwKICAgICAgIG1GbGFncygwKSwKKyAgICAgIG1TdGlja3lFcnJvcihPSyksCiAgICAgICBtU29mdFJlbmRlcmVyKE5VTEwpLAorICAgICAgbUJhdHRlcnlTdGF0Tm90aWZpZWQoZmFsc2UpLAorICAgICAgbUlzVmlkZW8oZmFsc2UpLAogICAgICAgbURlcXVldWVJbnB1dFRpbWVvdXRHZW5lcmF0aW9uKDApLAogICAgICAgbURlcXVldWVJbnB1dFJlcGx5SUQoMCksCiAgICAgICBtRGVxdWV1ZU91dHB1dFRpbWVvdXRHZW5lcmF0aW9uKDApLApAQCAtOTcsMjkgKzE3Miw0MiBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKLXN0YXR1c190IE1lZGlhQ29kZWM6OmluaXQoY29uc3QgY2hhciAqbmFtZSwgYm9vbCBuYW1lSXNUeXBlLCBib29sIGVuY29kZXIpIHsKKy8vIHN0YXRpYwordm9pZCBNZWRpYUNvZGVjOjpQb3N0UmVwbHlXaXRoRXJyb3IoaW50MzJfdCByZXBseUlELCBpbnQzMl90IGVycikgeworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlYzo6aW5pdChjb25zdCBBU3RyaW5nICZuYW1lLCBib29sIG5hbWVJc1R5cGUsIGJvb2wgZW5jb2RlcikgeworICAgIC8vIHNhdmUgaW5pdCBwYXJhbWV0ZXJzIGZvciByZXNldAorICAgIG1Jbml0TmFtZSA9IG5hbWU7CisgICAgbUluaXROYW1lSXNUeXBlID0gbmFtZUlzVHlwZTsKKyAgICBtSW5pdElzRW5jb2RlciA9IGVuY29kZXI7CisKICAgICAvLyBDdXJyZW50IHZpZGVvIGRlY29kZXJzIGRvIG5vdCByZXR1cm4gZnJvbSBPTVhfRmlsbFRoaXNCdWZmZXIKICAgICAvLyBxdWlja2x5LCB2aW9sYXRpbmcgdGhlIE9wZW5NQVggc3BlY3MsIHVudGlsIHRoYXQgaXMgcmVtZWRpZWQKICAgICAvLyB3ZSBuZWVkIHRvIGludmVzdCBpbiBhbiBleHRyYSBsb29wZXIgdG8gZnJlZSB0aGUgbWFpbiBldmVudAogICAgIC8vIHF1ZXVlLgorICAgIG1Db2RlYyA9IG5ldyBBQ29kZWM7CiAgICAgYm9vbCBuZWVkRGVkaWNhdGVkTG9vcGVyID0gZmFsc2U7Ci0gICAgaWYgKG5hbWVJc1R5cGUgJiYgIXN0cm5jYXNlY21wKG5hbWUsICJ2aWRlby8iLCA2KSkgeworICAgIGlmIChuYW1lSXNUeXBlICYmICFzdHJuY2FzZWNtcChuYW1lLmNfc3RyKCksICJ2aWRlby8iLCA2KSkgewogICAgICAgICBuZWVkRGVkaWNhdGVkTG9vcGVyID0gdHJ1ZTsKICAgICB9IGVsc2UgewogICAgICAgICBBU3RyaW5nIHRtcCA9IG5hbWU7CiAgICAgICAgIGlmICh0bXAuZW5kc1dpdGgoIi5zZWN1cmUiKSkgewogICAgICAgICAgICAgdG1wLmVyYXNlKHRtcC5zaXplKCkgLSA3LCA3KTsKICAgICAgICAgfQotICAgICAgICBjb25zdCBNZWRpYUNvZGVjTGlzdCAqbWNsID0gTWVkaWFDb2RlY0xpc3Q6OmdldEluc3RhbmNlKCk7CisgICAgICAgIGNvbnN0IHNwPElNZWRpYUNvZGVjTGlzdD4gbWNsID0gTWVkaWFDb2RlY0xpc3Q6OmdldEluc3RhbmNlKCk7CiAgICAgICAgIHNzaXplX3QgY29kZWNJZHggPSBtY2wtPmZpbmRDb2RlY0J5TmFtZSh0bXAuY19zdHIoKSk7CiAgICAgICAgIGlmIChjb2RlY0lkeCA+PSAwKSB7Ci0gICAgICAgICAgICBWZWN0b3I8QVN0cmluZz4gdHlwZXM7Ci0gICAgICAgICAgICBpZiAobWNsLT5nZXRTdXBwb3J0ZWRUeXBlcyhjb2RlY0lkeCwgJnR5cGVzKSA9PSBPSykgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVzW2ldLnN0YXJ0c1dpdGgoInZpZGVvLyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZWVkRGVkaWNhdGVkTG9vcGVyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjSW5mbz4gaW5mbyA9IG1jbC0+Z2V0Q29kZWNJbmZvKGNvZGVjSWR4KTsKKyAgICAgICAgICAgIFZlY3RvcjxBU3RyaW5nPiBtaW1lczsKKyAgICAgICAgICAgIGluZm8tPmdldFN1cHBvcnRlZE1pbWVzKCZtaW1lcyk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1pbWVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKG1pbWVzW2ldLnN0YXJ0c1dpdGgoInZpZGVvLyIpKSB7CisgICAgICAgICAgICAgICAgICAgIG5lZWREZWRpY2F0ZWRMb29wZXIgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTE1Myw2ICsyNDEsMTQgQEAKICAgICByZXR1cm4gUG9zdEFuZEF3YWl0UmVzcG9uc2UobXNnLCAmcmVzcG9uc2UpOwogfQogCitzdGF0dXNfdCBNZWRpYUNvZGVjOjpzZXRDYWxsYmFjayhjb25zdCBzcDxBTWVzc2FnZT4gJmNhbGxiYWNrKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldENhbGxiYWNrLCBpZCgpKTsKKyAgICBtc2ctPnNldE1lc3NhZ2UoImNhbGxiYWNrIiwgY2FsbGJhY2spOworCisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHJldHVybiBQb3N0QW5kQXdhaXRSZXNwb25zZShtc2csICZyZXNwb25zZSk7Cit9CisKIHN0YXR1c190IE1lZGlhQ29kZWM6OmNvbmZpZ3VyZSgKICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCiAgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+ICZuYXRpdmVXaW5kb3csCkBAIC0xNzQsNyArMjcwLDIwIEBACiAgICAgfQogCiAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwotICAgIHJldHVybiBQb3N0QW5kQXdhaXRSZXNwb25zZShtc2csICZyZXNwb25zZSk7CisgICAgc3RhdHVzX3QgZXJyID0gUG9zdEFuZEF3YWl0UmVzcG9uc2UobXNnLCAmcmVzcG9uc2UpOworCisgICAgaWYgKGVyciAhPSBPSyAmJiBlcnIgIT0gSU5WQUxJRF9PUEVSQVRJT04pIHsKKyAgICAgICAgLy8gTWVkaWFDb2RlYyBub3cgc2V0IHN0YXRlIHRvIFVOSU5JVElBTElaRUQgdXBvbiBhbnkgZmF0YWwgZXJyb3IuCisgICAgICAgIC8vIFRvIG1haW50YWluIGJhY2t3YXJkLWNvbXBhdGliaWxpdHksIGRvIGEgcmVzZXQoKSB0byBwdXQgY29kZWMKKyAgICAgICAgLy8gYmFjayBpbnRvIElOSVRJQUxJWkVEIHN0YXRlLgorICAgICAgICAvLyBCdXQgZG9uJ3QgcmVzZXQgaWYgdGhlIGVyciBpcyBJTlZBTElEX09QRVJBVElPTiwgd2hpY2ggbWVhbnMKKyAgICAgICAgLy8gdGhlIGNvbmZpZ3VyZSBmYWlsdXJlIGlzIGR1ZSB0byB3cm9uZyBzdGF0ZS4KKworICAgICAgICBBTE9HRSgiY29uZmlndXJlIGZhaWxlZCB3aXRoIGVyciAweCUwOHgsIHJlc2V0dGluZy4uLiIsIGVycik7CisgICAgICAgIHJlc2V0KCk7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKIH0KIAogc3RhdHVzX3QgTWVkaWFDb2RlYzo6Y3JlYXRlSW5wdXRTdXJmYWNlKApAQCAtMjE4LDYgKzMyNyw0MSBAQAogICAgIHJldHVybiBQb3N0QW5kQXdhaXRSZXNwb25zZShtc2csICZyZXNwb25zZSk7CiB9CiAKK3N0YXR1c190IE1lZGlhQ29kZWM6OnJlc2V0KCkgeworICAgIC8qIFdoZW4gZXh0ZXJuYWwtZmFjaW5nIE1lZGlhQ29kZWMgb2JqZWN0IGlzIGNyZWF0ZWQsCisgICAgICAgaXQgaXMgYWxyZWFkeSBpbml0aWFsaXplZC4gIFRodXMsIHJlc2V0IGlzIGVzc2VudGlhbGx5CisgICAgICAgcmVsZWFzZSgpIGZvbGxvd2VkIGJ5IGluaXQoKSwgcGx1cyBjbGVhcmluZyB0aGUgc3RhdGUgKi8KKworICAgIHN0YXR1c190IGVyciA9IHJlbGVhc2UoKTsKKworICAgIC8vIHVucmVnaXN0ZXIgaGFuZGxlcnMKKyAgICBpZiAobUNvZGVjICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKG1Db2RlY0xvb3BlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBtQ29kZWNMb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1Db2RlYy0+aWQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtQ29kZWMtPmlkKCkpOworICAgICAgICB9CisgICAgICAgIG1Db2RlYyA9IE5VTEw7CisgICAgfQorICAgIG1Mb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKGlkKCkpOworCisgICAgbUZsYWdzID0gMDsgICAgLy8gY2xlYXIgYWxsIGZsYWdzCisgICAgbVN0aWNreUVycm9yID0gT0s7CisKKyAgICAvLyByZXNldCBzdGF0ZSBub3QgcmVzZXQgYnkgc2V0U3RhdGUoVU5JTklUSUFMSVpFRCkKKyAgICBtUmVwbHlJRCA9IDA7CisgICAgbURlcXVldWVJbnB1dFJlcGx5SUQgPSAwOworICAgIG1EZXF1ZXVlT3V0cHV0UmVwbHlJRCA9IDA7CisgICAgbURlcXVldWVJbnB1dFRpbWVvdXRHZW5lcmF0aW9uID0gMDsKKyAgICBtRGVxdWV1ZU91dHB1dFRpbWVvdXRHZW5lcmF0aW9uID0gMDsKKyAgICBtSGF2ZUlucHV0U3VyZmFjZSA9IGZhbHNlOworCisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICBlcnIgPSBpbml0KG1Jbml0TmFtZSwgbUluaXROYW1lSXNUeXBlLCBtSW5pdElzRW5jb2Rlcik7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKIHN0YXR1c190IE1lZGlhQ29kZWM6OnF1ZXVlSW5wdXRCdWZmZXIoCiAgICAgICAgIHNpemVfdCBpbmRleCwKICAgICAgICAgc2l6ZV90IG9mZnNldCwKQEAgLTMyMyw2ICs0NjcsMTYgQEAKICAgICByZXR1cm4gUG9zdEFuZEF3YWl0UmVzcG9uc2UobXNnLCAmcmVzcG9uc2UpOwogfQogCitzdGF0dXNfdCBNZWRpYUNvZGVjOjpyZW5kZXJPdXRwdXRCdWZmZXJBbmRSZWxlYXNlKHNpemVfdCBpbmRleCwgaW50NjRfdCB0aW1lc3RhbXBOcykgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZWxlYXNlT3V0cHV0QnVmZmVyLCBpZCgpKTsKKyAgICBtc2ctPnNldFNpemUoImluZGV4IiwgaW5kZXgpOworICAgIG1zZy0+c2V0SW50MzIoInJlbmRlciIsIHRydWUpOworICAgIG1zZy0+c2V0SW50NjQoInRpbWVzdGFtcE5zIiwgdGltZXN0YW1wTnMpOworCisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHJldHVybiBQb3N0QW5kQXdhaXRSZXNwb25zZShtc2csICZyZXNwb25zZSk7Cit9CisKIHN0YXR1c190IE1lZGlhQ29kZWM6OnJlbGVhc2VPdXRwdXRCdWZmZXIoc2l6ZV90IGluZGV4KSB7CiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlbGVhc2VPdXRwdXRCdWZmZXIsIGlkKCkpOwogICAgIG1zZy0+c2V0U2l6ZSgiaW5kZXgiLCBpbmRleCk7CkBAIC0zNTIsNiArNTA2LDIwIEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBNZWRpYUNvZGVjOjpnZXRJbnB1dEZvcm1hdChzcDxBTWVzc2FnZT4gKmZvcm1hdCkgY29uc3QgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRJbnB1dEZvcm1hdCwgaWQoKSk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3QgZXJyOworICAgIGlmICgoZXJyID0gUG9zdEFuZEF3YWl0UmVzcG9uc2UobXNnLCAmcmVzcG9uc2UpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIENIRUNLKHJlc3BvbnNlLT5maW5kTWVzc2FnZSgiZm9ybWF0IiwgZm9ybWF0KSk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IE1lZGlhQ29kZWM6OmdldE5hbWUoQVN0cmluZyAqbmFtZSkgY29uc3QgewogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXROYW1lLCBpZCgpKTsKIApAQCAtMzg0LDYgKzU1Miw1NSBAQAogICAgIHJldHVybiBQb3N0QW5kQXdhaXRSZXNwb25zZShtc2csICZyZXNwb25zZSk7CiB9CiAKK3N0YXR1c190IE1lZGlhQ29kZWM6OmdldE91dHB1dEJ1ZmZlcihzaXplX3QgaW5kZXgsIHNwPEFCdWZmZXI+ICpidWZmZXIpIHsKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgIHJldHVybiBnZXRCdWZmZXJBbmRGb3JtYXQoa1BvcnRJbmRleE91dHB1dCwgaW5kZXgsIGJ1ZmZlciwgJmZvcm1hdCk7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWM6OmdldE91dHB1dEZvcm1hdChzaXplX3QgaW5kZXgsIHNwPEFNZXNzYWdlPiAqZm9ybWF0KSB7CisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOworICAgIHJldHVybiBnZXRCdWZmZXJBbmRGb3JtYXQoa1BvcnRJbmRleE91dHB1dCwgaW5kZXgsICZidWZmZXIsIGZvcm1hdCk7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWM6OmdldElucHV0QnVmZmVyKHNpemVfdCBpbmRleCwgc3A8QUJ1ZmZlcj4gKmJ1ZmZlcikgeworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CisgICAgcmV0dXJuIGdldEJ1ZmZlckFuZEZvcm1hdChrUG9ydEluZGV4SW5wdXQsIGluZGV4LCBidWZmZXIsICZmb3JtYXQpOworfQorCitib29sIE1lZGlhQ29kZWM6OmlzRXhlY3V0aW5nKCkgY29uc3QgeworICAgIHJldHVybiBtU3RhdGUgPT0gU1RBUlRFRCB8fCBtU3RhdGUgPT0gRkxVU0hFRDsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlYzo6Z2V0QnVmZmVyQW5kRm9ybWF0KAorICAgICAgICBzaXplX3QgcG9ydEluZGV4LCBzaXplX3QgaW5kZXgsCisgICAgICAgIHNwPEFCdWZmZXI+ICpidWZmZXIsIHNwPEFNZXNzYWdlPiAqZm9ybWF0KSB7CisgICAgLy8gdXNlIG11dGV4IGluc3RlYWQgb2YgYSBjb250ZXh0IHN3aXRjaAorCisgICAgYnVmZmVyLT5jbGVhcigpOworICAgIGZvcm1hdC0+Y2xlYXIoKTsKKyAgICBpZiAoIWlzRXhlY3V0aW5nKCkpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIC8vIHdlIGRvIG5vdCB3YW50IG1Qb3J0QnVmZmVycyB0byBjaGFuZ2UgZHVyaW5nIHRoaXMgc2VjdGlvbgorICAgIC8vIHdlIGFsc28gZG9uJ3Qgd2FudCBtT3duZWRCeUNsaWVudCB0byBjaGFuZ2UgZHVyaW5nIHRoaXMKKyAgICBNdXRleDo6QXV0b2xvY2sgYWwobUJ1ZmZlckxvY2spOworICAgIFZlY3RvcjxCdWZmZXJJbmZvPiAqYnVmZmVycyA9ICZtUG9ydEJ1ZmZlcnNbcG9ydEluZGV4XTsKKyAgICBpZiAoaW5kZXggPCBidWZmZXJzLT5zaXplKCkpIHsKKyAgICAgICAgY29uc3QgQnVmZmVySW5mbyAmaW5mbyA9IGJ1ZmZlcnMtPml0ZW1BdChpbmRleCk7CisgICAgICAgIGlmIChpbmZvLm1Pd25lZEJ5Q2xpZW50KSB7CisgICAgICAgICAgICAvLyBieSB0aGUgdGltZSBidWZmZXJzIGFycmF5IGlzIGluaXRpYWxpemVkLCBjcnlwdG8gaXMgc2V0CisgICAgICAgICAgICBpZiAocG9ydEluZGV4ID09IGtQb3J0SW5kZXhJbnB1dCAmJiBtQ3J5cHRvICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAqYnVmZmVyID0gaW5mby5tRW5jcnlwdGVkRGF0YTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IGluZm8ubURhdGE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqZm9ybWF0ID0gaW5mby5tRm9ybWF0OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgTWVkaWFDb2RlYzo6Zmx1c2goKSB7CiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEZsdXNoLCBpZCgpKTsKIApAQCAtNDA3LDkgKzYyNCw3IEBACiAKIHZvaWQgTWVkaWFDb2RlYzo6Y2FuY2VsUGVuZGluZ0RlcXVldWVPcGVyYXRpb25zKCkgewogICAgIGlmIChtRmxhZ3MgJiBrRmxhZ0RlcXVldWVJbnB1dFBlbmRpbmcpIHsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIElOVkFMSURfT1BFUkFUSU9OKTsKLSAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShtRGVxdWV1ZUlucHV0UmVwbHlJRCk7CisgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihtRGVxdWV1ZUlucHV0UmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOwogCiAgICAgICAgICsrbURlcXVldWVJbnB1dFRpbWVvdXRHZW5lcmF0aW9uOwogICAgICAgICBtRGVxdWV1ZUlucHV0UmVwbHlJRCA9IDA7CkBAIC00MTcsOSArNjMyLDcgQEAKICAgICB9CiAKICAgICBpZiAobUZsYWdzICYga0ZsYWdEZXF1ZXVlT3V0cHV0UGVuZGluZykgewotICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgSU5WQUxJRF9PUEVSQVRJT04pOwotICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KG1EZXF1ZXVlT3V0cHV0UmVwbHlJRCk7CisgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihtRGVxdWV1ZU91dHB1dFJlcGx5SUQsIElOVkFMSURfT1BFUkFUSU9OKTsKIAogICAgICAgICArK21EZXF1ZXVlT3V0cHV0VGltZW91dEdlbmVyYXRpb247CiAgICAgICAgIG1EZXF1ZXVlT3V0cHV0UmVwbHlJRCA9IDA7CkBAIC00MjgsMTQgKzY0MSwxMiBAQAogfQogCiBib29sIE1lZGlhQ29kZWM6OmhhbmRsZURlcXVldWVJbnB1dEJ1ZmZlcih1aW50MzJfdCByZXBseUlELCBib29sIG5ld1JlcXVlc3QpIHsKLSAgICBpZiAobVN0YXRlICE9IFNUQVJURUQKLSAgICAgICAgICAgIHx8IChtRmxhZ3MgJiBrRmxhZ1N0aWNreUVycm9yKQorICAgIGlmICghaXNFeGVjdXRpbmcoKSB8fCAobUZsYWdzICYga0ZsYWdJc0FzeW5jKQogICAgICAgICAgICAgfHwgKG5ld1JlcXVlc3QgJiYgKG1GbGFncyAmIGtGbGFnRGVxdWV1ZUlucHV0UGVuZGluZykpKSB7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBJTlZBTElEX09QRVJBVElPTik7Ci0KLSAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKLQorICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKG1GbGFncyAmIGtGbGFnU3RpY2t5RXJyb3IpIHsKKyAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIGdldFN0aWNreUVycm9yKCkpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKQEAgLTQ1NiwxMCArNjY3LDExIEBACiBib29sIE1lZGlhQ29kZWM6OmhhbmRsZURlcXVldWVPdXRwdXRCdWZmZXIodWludDMyX3QgcmVwbHlJRCwgYm9vbCBuZXdSZXF1ZXN0KSB7CiAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwogCi0gICAgaWYgKG1TdGF0ZSAhPSBTVEFSVEVECi0gICAgICAgICAgICB8fCAobUZsYWdzICYga0ZsYWdTdGlja3lFcnJvcikKKyAgICBpZiAoIWlzRXhlY3V0aW5nKCkgfHwgKG1GbGFncyAmIGtGbGFnSXNBc3luYykKICAgICAgICAgICAgIHx8IChuZXdSZXF1ZXN0ICYmIChtRmxhZ3MgJiBrRmxhZ0RlcXVldWVPdXRwdXRQZW5kaW5nKSkpIHsKICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBJTlZBTElEX09QRVJBVElPTik7CisgICAgfSBlbHNlIGlmIChtRmxhZ3MgJiBrRmxhZ1N0aWNreUVycm9yKSB7CisgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZ2V0U3RpY2t5RXJyb3IoKSk7CiAgICAgfSBlbHNlIGlmIChtRmxhZ3MgJiBrRmxhZ091dHB1dEJ1ZmZlcnNDaGFuZ2VkKSB7CiAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgSU5GT19PVVRQVVRfQlVGRkVSU19DSEFOR0VEKTsKICAgICAgICAgbUZsYWdzICY9IH5rRmxhZ091dHB1dEJ1ZmZlcnNDaGFuZ2VkOwpAQCAtNTE2LDIyICs3MjgsMjAgQEAKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ3aGF0IiwgJndoYXQpKTsKIAogICAgICAgICAgICAgc3dpdGNoICh3aGF0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0RXJyb3I6CisgICAgICAgICAgICAgICAgY2FzZSBDb2RlY0Jhc2U6OmtXaGF0RXJyb3I6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG9teEVycm9yLCBpbnRlcm5hbEVycm9yOwotICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigib214LWVycm9yIiwgJm9teEVycm9yKSk7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJlcnIiLCAmaW50ZXJuYWxFcnJvcikpOworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGVyciwgYWN0aW9uQ29kZTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImFjdGlvbkNvZGUiLCAmYWN0aW9uQ29kZSkpOwogCi0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDb2RlYyByZXBvcnRlZCBhbiBlcnJvci4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiKG9teCBlcnJvciAweCUwOHgsIGludGVybmFsRXJyb3IgJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgb214RXJyb3IsIGludGVybmFsRXJyb3IpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChvbXhFcnJvciA9PSBPTVhfRXJyb3JSZXNvdXJjZXNMb3N0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaW50ZXJuYWxFcnJvciA9PSBERUFEX09CSkVDVCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ29kZWMgcmVwb3J0ZWQgZXJyICUjeCwgYWN0aW9uQ29kZSAlZCwgd2hpbGUgaW4gc3RhdGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciwgYWN0aW9uQ29kZSwgbVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBERUFEX09CSkVDVCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzIHw9IGtGbGFnU2F3TWVkaWFTZXJ2ZXJEaWU7CisgICAgICAgICAgICAgICAgICAgICAgICBtRmxhZ3MgJj0gfmtGbGFnSXNDb21wb25lbnRBbGxvY2F0ZWQ7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBib29sIHNlbmRFcnJvclJlcG9uc2UgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBib29sIHNlbmRFcnJvclJlc3BvbnNlID0gdHJ1ZTsKIAogICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1TdGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJTklUSUFMSVpJTkc6CkBAIC01NDIsMTMgKzc1MiwxNSBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENPTkZJR1VSSU5HOgogICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKElOSVRJQUxJWkVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShhY3Rpb25Db2RlID09IEFDVElPTl9DT0RFX0ZBVEFMID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOSU5JVElBTElaRUQgOiBJTklUSUFMSVpFRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU1RBUlRJTkc6CiAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoQ09ORklHVVJFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoYWN0aW9uQ29kZSA9PSBBQ1RJT05fQ09ERV9GQVRBTCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTklOSVRJQUxJWkVEIDogQ09ORklHVVJFRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTU1OCw3ICs3NzAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSB0aGUgZXJyb3IsIGFzc3VtaW5nIHdlJ2xsIHN0aWxsIGdldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzaHV0ZG93biBjb21wbGV0ZSBub3RpZmljYXRpb24uCiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kRXJyb3JSZXBvbnNlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZEVycm9yUmVzcG9uc2UgPSBmYWxzZTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBrRmxhZ1Nhd01lZGlhU2VydmVyRGllKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1lZGlhU2VydmVyIGRpZWQsIHRoZXJlIGRlZmluaXRlbHkgd29uJ3QKQEAgLTU2OSw3ICs3ODEsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTVE9QUElORy0+VU5JTklUSUFMSVpFRCwgaW5zdGVhZCBvZiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXN1YWwgU1RPUFBJTkctPklOSVRJQUxJWkVEIHN0YXRlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShVTklOSVRJQUxJWkVEKTsKLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXRlID09IFJFTEVBU0lORykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKS0+cG9zdFJlcGx5KG1SZXBseUlEKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC01NzcsNDQgKzc5MSw4MCBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZMVVNISU5HOgogICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKFNUQVJURUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25Db2RlID09IEFDVElPTl9DT0RFX0ZBVEFMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKFVOSU5JVElBTElaRUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtRmxhZ3MgJiBrRmxhZ0lzQXN5bmMpID8gRkxVU0hFRCA6IFNUQVJURUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGTFVTSEVEOgogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTVEFSVEVEOgogICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRFcnJvclJlcG9uc2UgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kRXJyb3JSZXNwb25zZSA9IGZhbHNlOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzIHw9IGtGbGFnU3RpY2t5RXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RpY2t5RXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0QWN0aXZpdHlOb3RpZmljYXRpb25JZlBvc3NpYmxlKCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxQZW5kaW5nRGVxdWV1ZU9wZXJhdGlvbnMoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBrRmxhZ0lzQXN5bmMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcihlcnIsIGFjdGlvbkNvZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFjdGlvbkNvZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFDVElPTl9DT0RFX1RSQU5TSUVOVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBQ1RJT05fQ09ERV9SRUNPVkVSQUJMRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoSU5JVElBTElaRUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShVTklOSVRJQUxJWkVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRFcnJvclJlcG9uc2UgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kRXJyb3JSZXNwb25zZSA9IGZhbHNlOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzIHw9IGtGbGFnU3RpY2t5RXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RpY2t5RXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0QWN0aXZpdHlOb3RpZmljYXRpb25JZlBvc3NpYmxlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhY3Rpb25Db2RlIGluIGFuIHVuaW5pdGlhbGl6ZWQgc3RhdGUgaXMgYWx3YXlzIGZhdGFsLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gVU5JTklUSUFMSVpFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25Db2RlID0gQUNUSU9OX0NPREVfRkFUQUw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBrRmxhZ0lzQXN5bmMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcihlcnIsIGFjdGlvbkNvZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFjdGlvbkNvZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFDVElPTl9DT0RFX1RSQU5TSUVOVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBQ1RJT05fQ09ERV9SRUNPVkVSQUJMRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoSU5JVElBTElaRUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShVTklOSVRJQUxJWkVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlbmRFcnJvclJlcG9uc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgVU5LTk9XTl9FUlJPUik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkobVJlcGx5SUQpOworICAgICAgICAgICAgICAgICAgICBpZiAoc2VuZEVycm9yUmVzcG9uc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihtUmVwbHlJRCwgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBjYXNlIEFDb2RlYzo6a1doYXRDb21wb25lbnRBbGxvY2F0ZWQ6CisgICAgICAgICAgICAgICAgY2FzZSBDb2RlY0Jhc2U6OmtXaGF0Q29tcG9uZW50QWxsb2NhdGVkOgogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobVN0YXRlLCBJTklUSUFMSVpJTkcpOwogICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShJTklUSUFMSVpFRCk7CisgICAgICAgICAgICAgICAgICAgIG1GbGFncyB8PSBrRmxhZ0lzQ29tcG9uZW50QWxsb2NhdGVkOwogCiAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFN0cmluZygiY29tcG9uZW50TmFtZSIsICZtQ29tcG9uZW50TmFtZSkpOwogCkBAIC02MzQsMjEgKzg4NCwyNCBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBjYXNlIEFDb2RlYzo6a1doYXRDb21wb25lbnRDb25maWd1cmVkOgorICAgICAgICAgICAgICAgIGNhc2UgQ29kZWNCYXNlOjprV2hhdENvbXBvbmVudENvbmZpZ3VyZWQ6CiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtU3RhdGUsIENPTkZJR1VSSU5HKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoQ09ORklHVVJFRCk7CiAKICAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgaW5wdXQgc3VyZmFjZSBmbGFnCiAgICAgICAgICAgICAgICAgICAgIG1IYXZlSW5wdXRTdXJmYWNlID0gZmFsc2U7CiAKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgiaW5wdXQtZm9ybWF0IiwgJm1JbnB1dEZvcm1hdCkpOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJvdXRwdXQtZm9ybWF0IiwgJm1PdXRwdXRGb3JtYXQpKTsKKworICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShDT05GSUdVUkVEKTsKICAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSktPnBvc3RSZXBseShtUmVwbHlJRCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGNhc2UgQUNvZGVjOjprV2hhdElucHV0U3VyZmFjZUNyZWF0ZWQ6CisgICAgICAgICAgICAgICAgY2FzZSBDb2RlY0Jhc2U6OmtXaGF0SW5wdXRTdXJmYWNlQ3JlYXRlZDoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJlc3BvbnNlIHRvIEFDb2RlYzo6a1doYXRDcmVhdGVJbnB1dFN1cmZhY2UKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVzcG9uc2UgdG8gaW5pdGlhdGVDcmVhdGVJbnB1dFN1cmZhY2UoKQogICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBOT19FUlJPUjsKICAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlKCk7CiAgICAgICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpKSB7CkBAIC02NjQsOSArOTE3LDkgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0U2lnbmFsZWRJbnB1dEVPUzoKKyAgICAgICAgICAgICAgICBjYXNlIENvZGVjQmFzZTo6a1doYXRTaWduYWxlZElucHV0RU9TOgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gcmVzcG9uc2UgdG8gQUNvZGVjOjprV2hhdFNpZ25hbEVuZE9mSW5wdXRTdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgLy8gcmVzcG9uc2UgdG8gc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpCiAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZSgpOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnI7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiZXJyIiwgJmVycikpIHsKQEAgLTY3Nyw4ICs5MzAsOSBAQAogICAgICAgICAgICAgICAgIH0KIAogCi0gICAgICAgICAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0QnVmZmVyc0FsbG9jYXRlZDoKKyAgICAgICAgICAgICAgICBjYXNlIENvZGVjQmFzZTo6a1doYXRCdWZmZXJzQWxsb2NhdGVkOgogICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1CdWZmZXJMb2NrKTsKICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwb3J0SW5kZXg7CiAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJwb3J0SW5kZXgiLCAmcG9ydEluZGV4KSk7CiAKQEAgLTY5NSw4ICs5NDksOCBAQAogICAgICAgICAgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CiAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgicG9ydERlc2MiLCAmb2JqKSk7CiAKLSAgICAgICAgICAgICAgICAgICAgc3A8QUNvZGVjOjpQb3J0RGVzY3JpcHRpb24+IHBvcnREZXNjID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFDb2RlYzo6UG9ydERlc2NyaXB0aW9uICo+KG9iai5nZXQoKSk7CisgICAgICAgICAgICAgICAgICAgIHNwPENvZGVjQmFzZTo6UG9ydERlc2NyaXB0aW9uPiBwb3J0RGVzYyA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDb2RlY0Jhc2U6OlBvcnREZXNjcmlwdGlvbiAqPihvYmouZ2V0KCkpOwogCiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1CdWZmZXJzID0gcG9ydERlc2MtPmNvdW50QnVmZmVycygpOwogCkBAIC03MjksNDAgKzk4MywxOCBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBjYXNlIEFDb2RlYzo6a1doYXRPdXRwdXRGb3JtYXRDaGFuZ2VkOgorICAgICAgICAgICAgICAgIGNhc2UgQ29kZWNCYXNlOjprV2hhdE91dHB1dEZvcm1hdENoYW5nZWQ6CiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBBTE9HVigiY29kZWMgb3V0cHV0IGZvcm1hdCBjaGFuZ2VkIik7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBrRmxhZ0lzU29mdHdhcmVDb2RlYykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtTmF0aXZlV2luZG93ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Tb2Z0UmVuZGVyZXIgPT0gTlVMTCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYXRpdmVXaW5kb3cgIT0gTlVMTCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtRmxhZ3MgJiBrRmxhZ0lzU29mdHdhcmVDb2RlYykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgbWltZTsKICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RybmNhc2VjbXAoInZpZGVvLyIsIG1pbWUuY19zdHIoKSwgNikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgbVNvZnRSZW5kZXJlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU29mdFJlbmRlcmVyID0gTlVMTDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjcm9wTGVmdCwgY3JvcFRvcCwgY3JvcFJpZ2h0LCBjcm9wQm90dG9tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFJlY3QoImNyb3AiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JvcExlZnQsICZjcm9wVG9wLCAmY3JvcFJpZ2h0LCAmY3JvcEJvdHRvbSkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb2xvckZvcm1hdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sb3ItZm9ybWF0IiwgJmNvbG9yRm9ybWF0KSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBoZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldFJlY3Qoa0tleUNyb3BSZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9wTGVmdCwgY3JvcFRvcCwgY3JvcFJpZ2h0LCBjcm9wQm90dG9tKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5Q29sb3JGb3JtYXQsIGNvbG9yRm9ybWF0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Tb2Z0UmVuZGVyZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU29mdHdhcmVSZW5kZXJlcihtTmF0aXZlV2luZG93LCBtZXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtaW1lLnN0YXJ0c1dpdGhJZ25vcmVDYXNlKCJ2aWRlby8iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Tb2Z0UmVuZGVyZXIgPSBuZXcgU29mdHdhcmVSZW5kZXJlcihtTmF0aXZlV2luZG93KTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC03NzMsNiArMTAwNSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xsZWN0IGNvZGVjIHNwZWNpZmljIGRhdGEgYW5kIGFtZW5kIHRoZSBvdXRwdXQKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcm1hdCBhcyBuZWNlc3NhcnkuCiAgICAgICAgICAgICAgICAgICAgICAgICBtRmxhZ3MgfD0ga0ZsYWdHYXRoZXJDb2RlY1NwZWNpZmljRGF0YTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtRmxhZ3MgJiBrRmxhZ0lzQXN5bmMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9uT3V0cHV0Rm9ybWF0Q2hhbmdlZCgpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzIHw9IGtGbGFnT3V0cHV0Rm9ybWF0Q2hhbmdlZDsKICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RBY3Rpdml0eU5vdGlmaWNhdGlvbklmUG9zc2libGUoKTsKQEAgLTc4MCw3ICsxMDE0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0RmlsbFRoaXNCdWZmZXI6CisgICAgICAgICAgICAgICAgY2FzZSBDb2RlY0Jhc2U6OmtXaGF0RmlsbFRoaXNCdWZmZXI6CiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAvKiBzaXplX3QgaW5kZXggPSAqL3VwZGF0ZUJ1ZmZlcnMoa1BvcnRJbmRleElucHV0LCBtc2cpOwogCkBAIC04MDcsNyArMTA0MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoInF1ZXVlQ1NESW5wdXRCdWZmZXIgZmFpbGVkIHcvIGVycm9yICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzIHw9IGtGbGFnU3RpY2t5RXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RpY2t5RXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0QWN0aXZpdHlOb3RpZmljYXRpb25JZlBvc3NpYmxlKCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxQZW5kaW5nRGVxdWV1ZU9wZXJhdGlvbnMoKTsKQEAgLTgxNSw3ICsxMDQ5LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBrRmxhZ0RlcXVldWVJbnB1dFBlbmRpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1GbGFncyAmIGtGbGFnSXNBc3luYykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtSGF2ZUlucHV0U3VyZmFjZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uSW5wdXRCdWZmZXJBdmFpbGFibGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtRmxhZ3MgJiBrRmxhZ0RlcXVldWVJbnB1dFBlbmRpbmcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGhhbmRsZURlcXVldWVJbnB1dEJ1ZmZlcihtRGVxdWV1ZUlucHV0UmVwbHlJRCkpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICArK21EZXF1ZXVlSW5wdXRUaW1lb3V0R2VuZXJhdGlvbjsKQEAgLTgyNyw3ICsxMDY1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0RHJhaW5UaGlzQnVmZmVyOgorICAgICAgICAgICAgICAgIGNhc2UgQ29kZWNCYXNlOjprV2hhdERyYWluVGhpc0J1ZmZlcjoKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIC8qIHNpemVfdCBpbmRleCA9ICovdXBkYXRlQnVmZmVycyhrUG9ydEluZGV4T3V0cHV0LCBtc2cpOwogCkBAIC04NjIsMTAgKzExMDAsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzICY9IH5rRmxhZ0dhdGhlckNvZGVjU3BlY2lmaWNEYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzIHw9IGtGbGFnT3V0cHV0Rm9ybWF0Q2hhbmdlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBrRmxhZ0lzQXN5bmMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbk91dHB1dEZvcm1hdENoYW5nZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzIHw9IGtGbGFnT3V0cHV0Rm9ybWF0Q2hhbmdlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBrRmxhZ0RlcXVldWVPdXRwdXRQZW5kaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBrRmxhZ0lzQXN5bmMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9uT3V0cHV0QnVmZmVyQXZhaWxhYmxlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUZsYWdzICYga0ZsYWdEZXF1ZXVlT3V0cHV0UGVuZGluZykgewogICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaGFuZGxlRGVxdWV1ZU91dHB1dEJ1ZmZlcihtRGVxdWV1ZU91dHB1dFJlcGx5SUQpKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgKyttRGVxdWV1ZU91dHB1dFRpbWVvdXRHZW5lcmF0aW9uOwpAQCAtODc4LDMyICsxMTIyLDQyIEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGNhc2UgQUNvZGVjOjprV2hhdEVPUzoKKyAgICAgICAgICAgICAgICBjYXNlIENvZGVjQmFzZTo6a1doYXRFT1M6CiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAvLyBXZSBhbHJlYWR5IG5vdGlmeSB0aGUgY2xpZW50IG9mIHRoaXMgYnkgdXNpbmcgdGhlCiAgICAgICAgICAgICAgICAgICAgIC8vIGNvcnJlc3BvbmRpbmcgZmxhZyBpbiAib25PdXRwdXRCdWZmZXJSZWFkeSIuCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGNhc2UgQUNvZGVjOjprV2hhdFNodXRkb3duQ29tcGxldGVkOgorICAgICAgICAgICAgICAgIGNhc2UgQ29kZWNCYXNlOjprV2hhdFNodXRkb3duQ29tcGxldGVkOgogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVE9QUElORykgewogICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoSU5JVElBTElaRUQpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobVN0YXRlLCBSRUxFQVNJTkcpOwogICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoVU5JTklUSUFMSVpFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1GbGFncyAmPSB+a0ZsYWdJc0NvbXBvbmVudEFsbG9jYXRlZDsKIAogICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKS0+cG9zdFJlcGx5KG1SZXBseUlEKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0Rmx1c2hDb21wbGV0ZWQ6CisgICAgICAgICAgICAgICAgY2FzZSBDb2RlY0Jhc2U6OmtXaGF0Rmx1c2hDb21wbGV0ZWQ6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtU3RhdGUsIEZMVVNISU5HKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoU1RBUlRFRCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gRkxVU0hJTkcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJyZWNlaXZlZCBGbHVzaENvbXBsZXRlZCBtZXNzYWdlIGluIHN0YXRlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxSZXN1bWUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1GbGFncyAmIGtGbGFnSXNBc3luYykgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoRkxVU0hFRCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShTVEFSVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+c2lnbmFsUmVzdW1lKCk7CisgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKS0+cG9zdFJlcGx5KG1SZXBseUlEKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC05MjEsMTAgKzExNzUsNyBAQAogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCiAgICAgICAgICAgICBpZiAobVN0YXRlICE9IFVOSU5JVElBTElaRUQpIHsKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBJTlZBTElEX09QRVJBVElPTik7Ci0KLSAgICAgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBJTlZBTElEX09QRVJBVElPTik7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKQEAgLTk1NCwxNiArMTIwNSw0NSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0U2V0Q2FsbGJhY2s6CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisKKyAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gVU5JTklUSUFMSVpFRAorICAgICAgICAgICAgICAgICAgICB8fCBtU3RhdGUgPT0gSU5JVElBTElaSU5HCisgICAgICAgICAgICAgICAgICAgIHx8IGlzRXhlY3V0aW5nKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBjYWxsYmFjayBjYW4ndCBiZSBzZXQgYWZ0ZXIgY29kZWMgaXMgZXhlY3V0aW5nLAorICAgICAgICAgICAgICAgIC8vIG9yIGJlZm9yZSBpdCdzIGluaXRpYWxpemVkIChhcyB0aGUgY2FsbGJhY2sKKyAgICAgICAgICAgICAgICAvLyB3aWxsIGJlIGNsZWFyZWQgd2hlbiBpdCBnb2VzIHRvIElOSVRJQUxJWkVEKQorICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBJTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBjYWxsYmFjazsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoImNhbGxiYWNrIiwgJmNhbGxiYWNrKSk7CisKKyAgICAgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworCisgICAgICAgICAgICBpZiAobUNhbGxiYWNrICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HSSgiTWVkaWFDb2RlYyB3aWxsIG9wZXJhdGUgaW4gYXN5bmMgbW9kZSIpOworICAgICAgICAgICAgICAgIG1GbGFncyB8PSBrRmxhZ0lzQXN5bmM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1GbGFncyAmPSB+a0ZsYWdJc0FzeW5jOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIGtXaGF0Q29uZmlndXJlOgogICAgICAgICB7CiAgICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCiAgICAgICAgICAgICBpZiAobVN0YXRlICE9IElOSVRJQUxJWkVEKSB7Ci0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgSU5WQUxJRF9PUEVSQVRJT04pOwotCi0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC05ODMsMTAgKzEyNjMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLT5nZXRTdXJmYWNlVGV4dHVyZUNsaWVudCgpKTsKIAogICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIGVycik7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0xMDI0LDEwICsxMzAxLDcgQEAKIAogICAgICAgICAgICAgLy8gTXVzdCBiZSBjb25maWd1cmVkLCBidXQgY2FuJ3QgaGF2ZSBiZWVuIHN0YXJ0ZWQgeWV0LgogICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBDT05GSUdVUkVEKSB7Ci0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgSU5WQUxJRF9PUEVSQVRJT04pOwotCi0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC0xMDQxLDExICsxMzE1LDExIEBACiAgICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCi0gICAgICAgICAgICBpZiAobVN0YXRlICE9IENPTkZJR1VSRUQpIHsKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBJTlZBTElEX09QRVJBVElPTik7Ci0KLSAgICAgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBGTFVTSEVEKSB7CisgICAgICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxSZXN1bWUoKTsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgT0spOworICAgICAgICAgICAgfSBlbHNlIGlmIChtU3RhdGUgIT0gQ09ORklHVVJFRCkgeworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBJTlZBTElEX09QRVJBVElPTik7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKQEAgLTEwNjUsMjAgKzEzMzksMjEgQEAKICAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKLSAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gSU5JVElBTElaRUQKLSAgICAgICAgICAgICAgICAgICAgJiYgbVN0YXRlICE9IENPTkZJR1VSRUQgJiYgbVN0YXRlICE9IFNUQVJURUQpIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBtYXkgYmUgaW4gIlVOSU5JVElBTElaRUQiIHN0YXRlIGFscmVhZHkgd2l0aG91dCB0aGUKKyAgICAgICAgICAgIGlmICghKG1GbGFncyAmIGtGbGFnSXNDb21wb25lbnRBbGxvY2F0ZWQpICYmIG1TdGF0ZSAhPSBJTklUSUFMSVpFRAorICAgICAgICAgICAgICAgICAgICAmJiBtU3RhdGUgIT0gQ09ORklHVVJFRCAmJiAhaXNFeGVjdXRpbmcoKSkgeworICAgICAgICAgICAgICAgIC8vIFdlIG1heSBiZSBpbiAiVU5JTklUSUFMSVpFRCIgc3RhdGUgYWxyZWFkeSBhbmQKKyAgICAgICAgICAgICAgICAvLyBhbHNvIHNodXRkb3duIHRoZSBlbmNvZGVyL2RlY29kZXIgd2l0aG91dCB0aGUKICAgICAgICAgICAgICAgICAvLyBjbGllbnQgYmVpbmcgYXdhcmUgb2YgdGhpcyBpZiBtZWRpYSBzZXJ2ZXIgZGllZCB3aGlsZQogICAgICAgICAgICAgICAgIC8vIHdlIHdlcmUgYmVpbmcgc3RvcHBlZC4gVGhlIGNsaWVudCB3b3VsZCBhc3N1bWUgdGhhdAogICAgICAgICAgICAgICAgIC8vIGFmdGVyIHN0b3AoKSByZXR1cm5lZCwgaXQgd291bGQgYmUgc2FmZSB0byBjYWxsIHJlbGVhc2UoKQogICAgICAgICAgICAgICAgIC8vIGFuZCBpdCBzaG91bGQgYmUgaW4gdGhpcyBjYXNlLCBubyBoYXJtIHRvIGFsbG93IGEgcmVsZWFzZSgpCiAgICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgYWxyZWFkeSB1bmluaXRpYWxpemVkLgotICAgICAgICAgICAgICAgIC8vIFNpbWlsYXJseSBzdG9wcGluZyBhIHN0b3BwZWQgTWVkaWFDb2RlYyBzaG91bGQgYmUgYmVuaWduLgogICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoCi0gICAgICAgICAgICAgICAgICAgICAgICAiZXJyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9PSB0YXJnZXRTdGF0ZSA/IE9LIDogSU5WQUxJRF9PUEVSQVRJT04pOwotCisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVN0YXRlID09IHRhcmdldFN0YXRlID8gT0sgOiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSyAmJiB0YXJnZXRTdGF0ZSA9PSBVTklOSVRJQUxJWkVEKSB7CisgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC0xMDg3LDYgKzEzNjIsOSBAQAogICAgICAgICAgICAgICAgIC8vIEl0J3MgZGVhZCwgSmltLiBEb24ndCBleHBlY3QgaW5pdGlhdGVTaHV0ZG93biB0byB5aWVsZAogICAgICAgICAgICAgICAgIC8vIGFueSB1c2VmdWwgcmVzdWx0cyBub3cuLi4KICAgICAgICAgICAgICAgICBzZXRTdGF0ZShVTklOSVRJQUxJWkVEKTsKKyAgICAgICAgICAgICAgICBpZiAodGFyZ2V0U3RhdGUgPT0gVU5JTklUSUFMSVpFRCkgeworICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jbGVhcigpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKS0+cG9zdFJlcGx5KHJlcGx5SUQpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMTEwNiwxMSArMTM4NCwxNSBAQAogICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAorICAgICAgICAgICAgaWYgKG1GbGFncyAmIGtGbGFnSXNBc3luYykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJkZXF1ZXVlT3V0cHV0QnVmZmVyIGNhbid0IGJlIHVzZWQgaW4gYXN5bmMgbW9kZSIpOworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBJTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChtSGF2ZUlucHV0U3VyZmFjZSkgewogICAgICAgICAgICAgICAgIEFMT0dFKCJkZXF1ZXVlSW5wdXRCdWZmZXIgY2FuJ3QgYmUgdXNlZCB3aXRoIGlucHV0IHN1cmZhY2UiKTsKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBJTlZBTElEX09QRVJBVElPTik7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC0xMTIyLDkgKzE0MDQsNyBAQAogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWVvdXRVcyIsICZ0aW1lb3V0VXMpKTsKIAogICAgICAgICAgICAgaWYgKHRpbWVvdXRVcyA9PSAwbGwpIHsKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCAtRUFHQUlOKTsKLSAgICAgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCAtRUFHQUlOKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIApAQCAtMTE1Myw5ICsxNDMzLDcgQEAKIAogICAgICAgICAgICAgQ0hFQ0sobUZsYWdzICYga0ZsYWdEZXF1ZXVlSW5wdXRQZW5kaW5nKTsKIAotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCAtRUFHQUlOKTsKLSAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkobURlcXVldWVJbnB1dFJlcGx5SUQpOworICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKG1EZXF1ZXVlSW5wdXRSZXBseUlELCAtRUFHQUlOKTsKIAogICAgICAgICAgICAgbUZsYWdzICY9IH5rRmxhZ0RlcXVldWVJbnB1dFBlbmRpbmc7CiAgICAgICAgICAgICBtRGVxdWV1ZUlucHV0UmVwbHlJRCA9IDA7CkBAIC0xMTY3LDE5ICsxNDQ1LDE3IEBACiAgICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCi0gICAgICAgICAgICBpZiAobVN0YXRlICE9IFNUQVJURUQgfHwgKG1GbGFncyAmIGtGbGFnU3RpY2t5RXJyb3IpKSB7Ci0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgSU5WQUxJRF9PUEVSQVRJT04pOwotCi0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGlmICghaXNFeGVjdXRpbmcoKSkgeworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBJTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1GbGFncyAmIGtGbGFnU3RpY2t5RXJyb3IpIHsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgZ2V0U3RpY2t5RXJyb3IoKSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG9uUXVldWVJbnB1dEJ1ZmZlcihtc2cpOwogCi0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7Ci0gICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIGVycik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xMTg4LDYgKzE0NjQsMTIgQEAKICAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKKyAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBrRmxhZ0lzQXN5bmMpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZGVxdWV1ZU91dHB1dEJ1ZmZlciBjYW4ndCBiZSB1c2VkIGluIGFzeW5jIG1vZGUiKTsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoaGFuZGxlRGVxdWV1ZU91dHB1dEJ1ZmZlcihyZXBseUlELCB0cnVlIC8qIG5ldyByZXF1ZXN0ICovKSkgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMTE5Niw5ICsxNDc4LDcgQEAKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJ0aW1lb3V0VXMiLCAmdGltZW91dFVzKSk7CiAKICAgICAgICAgICAgIGlmICh0aW1lb3V0VXMgPT0gMGxsKSB7Ci0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgLUVBR0FJTik7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgLUVBR0FJTik7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKQEAgLTEyMjcsOSArMTUwNyw3IEBACiAKICAgICAgICAgICAgIENIRUNLKG1GbGFncyAmIGtGbGFnRGVxdWV1ZU91dHB1dFBlbmRpbmcpOwogCi0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIC1FQUdBSU4pOwotICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShtRGVxdWV1ZU91dHB1dFJlcGx5SUQpOworICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKG1EZXF1ZXVlT3V0cHV0UmVwbHlJRCwgLUVBR0FJTik7CiAKICAgICAgICAgICAgIG1GbGFncyAmPSB+a0ZsYWdEZXF1ZXVlT3V0cHV0UGVuZGluZzsKICAgICAgICAgICAgIG1EZXF1ZXVlT3V0cHV0UmVwbHlJRCA9IDA7CkBAIC0xMjQxLDE5ICsxNTE5LDE3IEBACiAgICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCi0gICAgICAgICAgICBpZiAobVN0YXRlICE9IFNUQVJURUQgfHwgKG1GbGFncyAmIGtGbGFnU3RpY2t5RXJyb3IpKSB7Ci0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgSU5WQUxJRF9PUEVSQVRJT04pOwotCi0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGlmICghaXNFeGVjdXRpbmcoKSkgeworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBJTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1GbGFncyAmIGtGbGFnU3RpY2t5RXJyb3IpIHsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgZ2V0U3RpY2t5RXJyb3IoKSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG9uUmVsZWFzZU91dHB1dEJ1ZmZlcihtc2cpOwogCi0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7Ci0gICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIGVycik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xMjYyLDExICsxNTM4LDExIEBACiAgICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCi0gICAgICAgICAgICBpZiAobVN0YXRlICE9IFNUQVJURUQgfHwgKG1GbGFncyAmIGtGbGFnU3RpY2t5RXJyb3IpKSB7Ci0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgSU5WQUxJRF9PUEVSQVRJT04pOwotCi0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGlmICghaXNFeGVjdXRpbmcoKSkgeworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBJTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1GbGFncyAmIGtGbGFnU3RpY2t5RXJyb3IpIHsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgZ2V0U3RpY2t5RXJyb3IoKSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKQEAgLTEyODAsMTEgKzE1NTYsMTEgQEAKICAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKLSAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gU1RBUlRFRCB8fCAobUZsYWdzICYga0ZsYWdTdGlja3lFcnJvcikpIHsKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBJTlZBTElEX09QRVJBVElPTik7Ci0KLSAgICAgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgaWYgKCFpc0V4ZWN1dGluZygpIHx8IChtRmxhZ3MgJiBrRmxhZ0lzQXN5bmMpKSB7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIElOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUZsYWdzICYga0ZsYWdTdGlja3lFcnJvcikgeworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBnZXRTdGlja3lFcnJvcigpKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIApAQCAtMTMxNCwxNSArMTU5MCwxNiBAQAogICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAotICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBTVEFSVEVEIHx8IChtRmxhZ3MgJiBrRmxhZ1N0aWNreUVycm9yKSkgewotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIElOVkFMSURfT1BFUkFUSU9OKTsKLQotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBpZiAoIWlzRXhlY3V0aW5nKCkpIHsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIGlmIChtRmxhZ3MgJiBrRmxhZ1N0aWNreUVycm9yKSB7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIGdldFN0aWNreUVycm9yKCkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBtUmVwbHlJRCA9IHJlcGx5SUQ7CisgICAgICAgICAgICAvLyBUT0RPOiBza2lwIGZsdXNoaW5nIGlmIGFscmVhZHkgRkxVU0hFRAogICAgICAgICAgICAgc2V0U3RhdGUoRkxVU0hJTkcpOwogCiAgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbEZsdXNoKCk7CkBAIC0xMzMwLDIzICsxNjA3LDI4IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2Uga1doYXRHZXRJbnB1dEZvcm1hdDoKICAgICAgICAgY2FzZSBrV2hhdEdldE91dHB1dEZvcm1hdDoKICAgICAgICAgeworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9CisgICAgICAgICAgICAgICAgKG1zZy0+d2hhdCgpID09IGtXaGF0R2V0T3V0cHV0Rm9ybWF0ID8gbU91dHB1dEZvcm1hdCA6IG1JbnB1dEZvcm1hdCk7CisKICAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKLSAgICAgICAgICAgIGlmICgobVN0YXRlICE9IFNUQVJURUQgJiYgbVN0YXRlICE9IEZMVVNISU5HKQotICAgICAgICAgICAgICAgICAgICB8fCAobUZsYWdzICYga0ZsYWdTdGlja3lFcnJvcikKLSAgICAgICAgICAgICAgICAgICAgfHwgbU91dHB1dEZvcm1hdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgSU5WQUxJRF9PUEVSQVRJT04pOwotCi0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGlmICgobVN0YXRlICE9IENPTkZJR1VSRUQgJiYgbVN0YXRlICE9IFNUQVJUSU5HICYmCisgICAgICAgICAgICAgICAgIG1TdGF0ZSAhPSBTVEFSVEVEICYmIG1TdGF0ZSAhPSBGTFVTSElORyAmJgorICAgICAgICAgICAgICAgICBtU3RhdGUgIT0gRkxVU0hFRCkKKyAgICAgICAgICAgICAgICAgICAgfHwgZm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIGlmIChtRmxhZ3MgJiBrRmxhZ1N0aWNreUVycm9yKSB7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIGdldFN0aWNreUVycm9yKCkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICByZXNwb25zZS0+c2V0TWVzc2FnZSgiZm9ybWF0IiwgbU91dHB1dEZvcm1hdCk7CisgICAgICAgICAgICByZXNwb25zZS0+c2V0TWVzc2FnZSgiZm9ybWF0IiwgZm9ybWF0KTsKICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTM3MiwxMCArMTY1NCw3IEBACiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKICAgICAgICAgICAgIGlmIChtQ29tcG9uZW50TmFtZS5lbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgSU5WQUxJRF9PUEVSQVRJT04pOwotCi0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC0xMzk1LDEwICsxNjc0LDcgQEAKIAogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gb25TZXRQYXJhbWV0ZXJzKHBhcmFtcyk7CiAKLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKLQotICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBlcnIpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTQyMSwxNCArMTY5NywxNCBAQAogICAgICAgICArK2k7CiAgICAgfQogCi0gICAgQUxPR1YoIkZvdW5kICV1IHBpZWNlcyBvZiBjb2RlYyBzcGVjaWZpYyBkYXRhLiIsIG1DU0Quc2l6ZSgpKTsKKyAgICBBTE9HVigiRm91bmQgJXp1IHBpZWNlcyBvZiBjb2RlYyBzcGVjaWZpYyBkYXRhLiIsIG1DU0Quc2l6ZSgpKTsKIH0KIAogc3RhdHVzX3QgTWVkaWFDb2RlYzo6cXVldWVDU0RJbnB1dEJ1ZmZlcihzaXplX3QgYnVmZmVySW5kZXgpIHsKICAgICBDSEVDSyghbUNTRC5lbXB0eSgpKTsKIAotICAgIEJ1ZmZlckluZm8gKmluZm8gPQotICAgICAgICAmbVBvcnRCdWZmZXJzW2tQb3J0SW5kZXhJbnB1dF0uZWRpdEl0ZW1BdChidWZmZXJJbmRleCk7CisgICAgY29uc3QgQnVmZmVySW5mbyAqaW5mbyA9CisgICAgICAgICZtUG9ydEJ1ZmZlcnNba1BvcnRJbmRleElucHV0XS5pdGVtQXQoYnVmZmVySW5kZXgpOwogCiAgICAgc3A8QUJ1ZmZlcj4gY3NkID0gKm1DU0QuYmVnaW4oKTsKICAgICBtQ1NELmVyYXNlKG1DU0QuYmVnaW4oKSk7CkBAIC0xNDYzLDE4ICsxNzM5LDIzIEBACiAgICAgICAgIG1DcnlwdG8uY2xlYXIoKTsKICAgICAgICAgc2V0TmF0aXZlV2luZG93KE5VTEwpOwogCisgICAgICAgIG1JbnB1dEZvcm1hdC5jbGVhcigpOwogICAgICAgICBtT3V0cHV0Rm9ybWF0LmNsZWFyKCk7CiAgICAgICAgIG1GbGFncyAmPSB+a0ZsYWdPdXRwdXRGb3JtYXRDaGFuZ2VkOwogICAgICAgICBtRmxhZ3MgJj0gfmtGbGFnT3V0cHV0QnVmZmVyc0NoYW5nZWQ7CiAgICAgICAgIG1GbGFncyAmPSB+a0ZsYWdTdGlja3lFcnJvcjsKICAgICAgICAgbUZsYWdzICY9IH5rRmxhZ0lzRW5jb2RlcjsKICAgICAgICAgbUZsYWdzICY9IH5rRmxhZ0dhdGhlckNvZGVjU3BlY2lmaWNEYXRhOworICAgICAgICBtRmxhZ3MgJj0gfmtGbGFnSXNBc3luYzsKKyAgICAgICAgbVN0aWNreUVycm9yID0gT0s7CiAKICAgICAgICAgbUFjdGl2aXR5Tm90aWZ5LmNsZWFyKCk7CisgICAgICAgIG1DYWxsYmFjay5jbGVhcigpOwogICAgIH0KIAogICAgIGlmIChuZXdTdGF0ZSA9PSBVTklOSVRJQUxJWkVEKSB7Ci0gICAgICAgIG1Db21wb25lbnROYW1lLmNsZWFyKCk7CisgICAgICAgIC8vIHJldHVybiBhbnkgc3RyYWdnbGluZyBidWZmZXJzLCBlLmcuIGlmIHdlIGdvdCBoZXJlIG9uIGFuIGVycm9yCisgICAgICAgIHJldHVybkJ1ZmZlcnNUb0NvZGVjKCk7CiAKICAgICAgICAgLy8gVGhlIGNvbXBvbmVudCBpcyBnb25lLCBtZWRpYXNlcnZlcidzIHByb2JhYmx5IGJhY2sgdXAgYWxyZWFkeQogICAgICAgICAvLyBidXQgc2hvdWxkIGRlZmluaXRlbHkgYmUgYmFjayB1cCBzaG91bGQgd2UgdHJ5IHRvIGluc3RhbnRpYXRlCkBAIC0xNDg1LDYgKzE3NjYsOCBAQAogICAgIG1TdGF0ZSA9IG5ld1N0YXRlOwogCiAgICAgY2FuY2VsUGVuZGluZ0RlcXVldWVPcGVyYXRpb25zKCk7CisKKyAgICB1cGRhdGVCYXR0ZXJ5U3RhdCgpOwogfQogCiB2b2lkIE1lZGlhQ29kZWM6OnJldHVybkJ1ZmZlcnNUb0NvZGVjKCkgewpAQCAtMTQ5NCw2ICsxNzc3LDcgQEAKIAogdm9pZCBNZWRpYUNvZGVjOjpyZXR1cm5CdWZmZXJzVG9Db2RlY09uUG9ydChpbnQzMl90IHBvcnRJbmRleCkgewogICAgIENIRUNLKHBvcnRJbmRleCA9PSBrUG9ydEluZGV4SW5wdXQgfHwgcG9ydEluZGV4ID09IGtQb3J0SW5kZXhPdXRwdXQpOworICAgIE11dGV4OjpBdXRvbG9jayBhbChtQnVmZmVyTG9jayk7CiAKICAgICBWZWN0b3I8QnVmZmVySW5mbz4gKmJ1ZmZlcnMgPSAmbVBvcnRCdWZmZXJzW3BvcnRJbmRleF07CiAKQEAgLTE1MjAsOCArMTgwNCw4IEBACiAgICAgICAgIGludDMyX3QgcG9ydEluZGV4LCBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIENIRUNLKHBvcnRJbmRleCA9PSBrUG9ydEluZGV4SW5wdXQgfHwgcG9ydEluZGV4ID09IGtQb3J0SW5kZXhPdXRwdXQpOwogCi0gICAgdm9pZCAqYnVmZmVySUQ7Ci0gICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigiYnVmZmVyLWlkIiwgJmJ1ZmZlcklEKSk7CisgICAgdWludDMyX3QgYnVmZmVySUQ7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImJ1ZmZlci1pZCIsIChpbnQzMl90KikmYnVmZmVySUQpKTsKIAogICAgIFZlY3RvcjxCdWZmZXJJbmZvPiAqYnVmZmVycyA9ICZtUG9ydEJ1ZmZlcnNbcG9ydEluZGV4XTsKIApAQCAtMTUzMiw2ICsxODE2LDggQEAKICAgICAgICAgICAgIENIRUNLKGluZm8tPm1Ob3RpZnkgPT0gTlVMTCk7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJyZXBseSIsICZpbmZvLT5tTm90aWZ5KSk7CiAKKyAgICAgICAgICAgIGluZm8tPm1Gb3JtYXQgPQorICAgICAgICAgICAgICAgIChwb3J0SW5kZXggPT0ga1BvcnRJbmRleElucHV0KSA/IG1JbnB1dEZvcm1hdCA6IG1PdXRwdXRGb3JtYXQ7CiAgICAgICAgICAgICBtQXZhaWxQb3J0QnVmZmVyc1twb3J0SW5kZXhdLnB1c2hfYmFjayhpKTsKIAogICAgICAgICAgICAgcmV0dXJuIGk7CkBAIC0xNjQ4LDExICsxOTM0LDE1IEBACiAgICAgICAgIGluZm8tPm1EYXRhLT5zZXRSYW5nZSgwLCByZXN1bHQpOwogICAgIH0KIAorICAgIC8vIHN5bmNocm9uaXphdGlvbiBib3VuZGFyeSBmb3IgZ2V0QnVmZmVyQW5kRm9ybWF0CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYWwobUJ1ZmZlckxvY2spOworICAgICAgICBpbmZvLT5tT3duZWRCeUNsaWVudCA9IGZhbHNlOworICAgIH0KICAgICByZXBseS0+c2V0QnVmZmVyKCJidWZmZXIiLCBpbmZvLT5tRGF0YSk7CiAgICAgcmVwbHktPnBvc3QoKTsKIAogICAgIGluZm8tPm1Ob3RpZnkgPSBOVUxMOwotICAgIGluZm8tPm1Pd25lZEJ5Q2xpZW50ID0gZmFsc2U7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0xNjY2LDcgKzE5NTYsNyBAQAogICAgICAgICByZW5kZXIgPSAwOwogICAgIH0KIAotICAgIGlmIChtU3RhdGUgIT0gU1RBUlRFRCkgeworICAgIGlmICghaXNFeGVjdXRpbmcoKSkgewogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKQEAgLTE2ODAsMTggKzE5NzAsNDAgQEAKICAgICAgICAgcmV0dXJuIC1FQUNDRVM7CiAgICAgfQogCi0gICAgaWYgKHJlbmRlciAmJiAoaW5mby0+bURhdGEgPT0gTlVMTCB8fCBpbmZvLT5tRGF0YS0+c2l6ZSgpICE9IDApKSB7CisgICAgLy8gc3luY2hyb25pemF0aW9uIGJvdW5kYXJ5IGZvciBnZXRCdWZmZXJBbmRGb3JtYXQKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtQnVmZmVyTG9jayk7CisgICAgICAgIGluZm8tPm1Pd25lZEJ5Q2xpZW50ID0gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHJlbmRlciAmJiBpbmZvLT5tRGF0YSAhPSBOVUxMICYmIGluZm8tPm1EYXRhLT5zaXplKCkgIT0gMCkgewogICAgICAgICBpbmZvLT5tTm90aWZ5LT5zZXRJbnQzMigicmVuZGVyIiwgdHJ1ZSk7CiAKKyAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBOcyA9IDA7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQ2NCgidGltZXN0YW1wTnMiLCAmdGltZXN0YW1wTnMpKSB7CisgICAgICAgICAgICBpbmZvLT5tTm90aWZ5LT5zZXRJbnQ2NCgidGltZXN0YW1wTnMiLCB0aW1lc3RhbXBOcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUT0RPOiBpdCBzZWVtcyBsaWtlIHdlIHNob3VsZCB1c2UgdGhlIHRpbWVzdGFtcAorICAgICAgICAgICAgLy8gaW4gdGhlIChtZWRpYSlidWZmZXIgYXMgaXQgcG90ZW50aWFsbHkgY2FtZSBmcm9tCisgICAgICAgICAgICAvLyBhbiBpbnB1dCBzdXJmYWNlLCBidXQgd2UgZGlkIG5vdCBwcm9wYWdhdGUgaXQgcHJpb3IgdG8KKyAgICAgICAgICAgIC8vIEFQSSAyMC4gIFBlcmhhcHMgY2hlY2sgZm9yIHRhcmdldCBTREsgdmVyc2lvbi4KKyNpZiAwCisgICAgICAgICAgICBpZiAoaW5mby0+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+PSBtVHJhY2tMaXN0LnNpemUoKSkgewotICAgICAgICBBTE9HRSgiV3JpdGVTYW1wbGVEYXRhKCkgZ2V0IGFuIGludmFsaWQgaW5kZXggJWQiLCB0cmFja0luZGV4KTsKKyAgICAgICAgQUxPR0UoIldyaXRlU2FtcGxlRGF0YSgpIGdldCBhbiBpbnZhbGlkIGluZGV4ICV6dSIsIHRyYWNrSW5kZXgpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhU291cmNlLmNwcAppbmRleCBmZDBlNzljLi41NzY0NzFhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuY3BwCkBAIC0zMiw2ICszMiwxOSBAQAogICAgIG1PcHRpb25zID0gMDsKICAgICBtU2Vla1RpbWVVcyA9IDA7CiAgICAgbUxhdGVuZXNzVXMgPSAwOworICAgIG1Ob25CbG9ja2luZyA9IGZhbHNlOworfQorCit2b2lkIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6c2V0Tm9uQmxvY2tpbmcoKSB7CisgICAgbU5vbkJsb2NraW5nID0gdHJ1ZTsKK30KKwordm9pZCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OmNsZWFyTm9uQmxvY2tpbmcoKSB7CisgICAgbU5vbkJsb2NraW5nID0gZmFsc2U7Cit9CisKK2Jvb2wgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpnZXROb25CbG9ja2luZygpIGNvbnN0IHsKKyAgICByZXR1cm4gbU5vbkJsb2NraW5nOwogfQogCiB2b2lkIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6c2V0U2Vla1RvKGludDY0X3QgdGltZV91cywgU2Vla01vZGUgbW9kZSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWV0YURhdGEuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWV0YURhdGEuY3BwCmluZGV4IDcyNWY5N2UuLjFhMTFjMWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01ldGFEYXRhLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZXRhRGF0YS5jcHAKQEAgLTE2LDYgKzE2LDcgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJNZXRhRGF0YSIKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8c3RkbGliLmg+CkBAIC0zMjAsNyArMzIxLDcgQEAKICAgICBjb25zdCB2b2lkICpkYXRhID0gc3RvcmFnZSgpOwogICAgIHN3aXRjaChtVHlwZSkgewogICAgICAgICBjYXNlIFRZUEVfTk9ORToKLSAgICAgICAgICAgIG91dCA9IFN0cmluZzg6OmZvcm1hdCgibm8gdHlwZSwgc2l6ZSAlZCkiLCBtU2l6ZSk7CisgICAgICAgICAgICBvdXQgPSBTdHJpbmc4Ojpmb3JtYXQoIm5vIHR5cGUsIHNpemUgJXp1KSIsIG1TaXplKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFRZUEVfQ19TVFJJTkc6CiAgICAgICAgICAgICBvdXQgPSBTdHJpbmc4Ojpmb3JtYXQoIihjaGFyKikgJXMiLCAoY29uc3QgY2hhciAqKWRhdGEpOwpAQCAtMzI5LDcgKzMzMCw3IEBACiAgICAgICAgICAgICBvdXQgPSBTdHJpbmc4Ojpmb3JtYXQoIihpbnQzMl90KSAlZCIsICooaW50MzJfdCAqKWRhdGEpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgVFlQRV9JTlQ2NDoKLSAgICAgICAgICAgIG91dCA9IFN0cmluZzg6OmZvcm1hdCgiKGludDY0X3QpICVsbGQiLCAqKGludDY0X3QgKilkYXRhKTsKKyAgICAgICAgICAgIG91dCA9IFN0cmluZzg6OmZvcm1hdCgiKGludDY0X3QpICUiIFBSSWQ2NCwgKihpbnQ2NF90ICopZGF0YSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBUWVBFX0ZMT0FUOgogICAgICAgICAgICAgb3V0ID0gU3RyaW5nODo6Zm9ybWF0KCIoZmxvYXQpICVmIiwgKihmbG9hdCAqKWRhdGEpOwpAQCAtMzQ2LDcgKzM0Nyw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgb3V0ID0gU3RyaW5nODo6Zm9ybWF0KCIodW5rbm93biB0eXBlICVkLCBzaXplICVkKSIsIG1UeXBlLCBtU2l6ZSk7CisgICAgICAgICAgICBvdXQgPSBTdHJpbmc4Ojpmb3JtYXQoIih1bmtub3duIHR5cGUgJWQsIHNpemUgJXp1KSIsIG1UeXBlLCBtU2l6ZSk7CiAgICAgICAgICAgICBpZiAobVNpemUgPD0gNDgpIHsgLy8gaWYgaXQncyBsZXNzIHRoYW4gdGhyZWUgbGluZXMgb2YgaGV4IGRhdGEsIGR1bXAgaXQKICAgICAgICAgICAgICAgICBBU3RyaW5nIGZvbzsKICAgICAgICAgICAgICAgICBoZXhkdW1wKGRhdGEsIG1TaXplLCAwLCAmZm9vKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051Q2FjaGVkU291cmNlMi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUNhY2hlZFNvdXJjZTIuY3BwCmluZGV4IDI3MGQ2NGEuLmNiYzFmZTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051Q2FjaGVkU291cmNlMi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVDYWNoZWRTb3VyY2UyLmNwcApAQCAtMTQsNiArMTQsOCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiTnVDYWNoZWRTb3VyY2UyIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgpAQCAtMTM1LDcgKzEzNyw3IEBACiB9CiAKIHZvaWQgUGFnZUNhY2hlOjpjb3B5KHNpemVfdCBmcm9tLCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIEFMT0dWKCJjb3B5IGZyb20gJWQgc2l6ZSAlZCIsIGZyb20sIHNpemUpOworICAgIEFMT0dWKCJjb3B5IGZyb20gJXp1IHNpemUgJXp1IiwgZnJvbSwgc2l6ZSk7CiAKICAgICBpZiAoc2l6ZSA9PSAwKSB7CiAgICAgICAgIHJldHVybjsKQEAgLTE4OSw2ICsxOTEsNyBAQAogICAgICAgbUZpbmFsU3RhdHVzKE9LKSwKICAgICAgIG1MYXN0QWNjZXNzUG9zKDApLAogICAgICAgbUZldGNoaW5nKHRydWUpLAorICAgICAgbURpc2Nvbm5lY3RpbmcoZmFsc2UpLAogICAgICAgbUxhc3RGZXRjaFRpbWVVcygtMSksCiAgICAgICBtTnVtUmV0cmllc0xlZnQoa01heE51bVJldHJpZXMpLAogICAgICAgbUhpZ2h3YXRlclRocmVzaG9sZEJ5dGVzKGtEZWZhdWx0SGlnaFdhdGVyVGhyZXNob2xkKSwKQEAgLTIxMyw3ICsyMTYsMTQgQEAKIAogICAgIG1Mb29wZXItPnNldE5hbWUoIk51Q2FjaGVkU291cmNlMiIpOwogICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtUmVmbGVjdG9yKTsKLSAgICBtTG9vcGVyLT5zdGFydCgpOworCisgICAgLy8gU2luY2UgaXQgbWF5IG5vdCBiZSBvYnZpb3VzIHdoeSBvdXIgbG9vcGVyIHRocmVhZCBuZWVkcyB0byBiZQorICAgIC8vIGFibGUgdG8gY2FsbCBpbnRvIGphdmEgc2luY2UgaXQgZG9lc24ndCBhcHBlYXIgdG8gZG8gc28gYXQgYWxsLi4uCisgICAgLy8gSU1lZGlhSFRUUENvbm5lY3Rpb24gbWF5IGJlIChhbmQgbW9zdCBsaWtlbHkgaXMpIGltcGxlbWVudGVkIGluIEpBVkEKKyAgICAvLyBhbmQgYSBsb2NhbCBKQVZBIElCaW5kZXIgd2lsbCBjYWxsIGRpcmVjdGx5IGludG8gSk5JIG1ldGhvZHMuCisgICAgLy8gU28gd2hlbmV2ZXIgd2UgY2FsbCBEYXRhU291cmNlOjpyZWFkQXQgaXQgbWF5IGVuZCB1cCBpbiBhIGNhbGwgdG8KKyAgICAvLyBJTWVkaWFIVFRQQ29ubmVjdGlvbjo6cmVhZEF0IGFuZCB0aGVyZWZvcmUgY2FsbCBiYWNrIGludG8gSkFWQS4KKyAgICBtTG9vcGVyLT5zdGFydChmYWxzZSAvKiBydW5PbkNhbGxpbmdUaHJlYWQgKi8sIHRydWUgLyogY2FuQ2FsbEphdmEgKi8pOwogfQogCiBOdUNhY2hlZFNvdXJjZTI6On5OdUNhY2hlZFNvdXJjZTIoKSB7CkBAIC0yNDQsNiArMjU0LDI3IEBACiAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwogfQogCit2b2lkIE51Q2FjaGVkU291cmNlMjo6ZGlzY29ubmVjdCgpIHsKKyAgICBpZiAobVNvdXJjZS0+ZmxhZ3MoKSAmIGtJc0hUVFBCYXNlZFNvdXJjZSkgeworICAgICAgICBBTE9HVigiZGlzY29ubmVjdGluZyBIVFRQQmFzZWRTb3VyY2UiKTsKKworICAgICAgICB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICAgICAgLy8gc2V0IG1EaXNjb25uZWN0aW5nIHRvIHRydWUsIGlmIGEgZmV0Y2ggcmV0dXJucyBhZnRlcgorICAgICAgICAgICAgLy8gdGhpcywgdGhlIHNvdXJjZSB3aWxsIGJlIG1hcmtlZCBhcyBFT1MuCisgICAgICAgICAgICBtRGlzY29ubmVjdGluZyA9IHRydWU7CisKKyAgICAgICAgICAgIC8vIGV4cGxpY2l0bHkgc2lnbmFsIG1Db25kaXRpb24gc28gdGhhdCB0aGUgcGVuZGluZyByZWFkQXQoKQorICAgICAgICAgICAgLy8gd2lsbCBpbW1lZGlhdGVseSByZXR1cm4KKyAgICAgICAgICAgIG1Db25kaXRpb24uc2lnbmFsKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBleHBsaWNpdGx5IGRpc2Nvbm5lY3QgZnJvbSB0aGUgc291cmNlLCB0byBhbGxvdyBhbnkKKyAgICAgICAgLy8gcGVuZGluZyByZWFkcyB0byByZXR1cm4gbW9yZSBwcm9tcHRseQorICAgICAgICBzdGF0aWNfY2FzdDxIVFRQQmFzZSAqPihtU291cmNlLmdldCgpKS0+ZGlzY29ubmVjdCgpOworICAgIH0KK30KKwogc3RhdHVzX3QgTnVDYWNoZWRTb3VyY2UyOjpzZXRDYWNoZVN0YXRDb2xsZWN0RnJlcShpbnQzMl90IGZyZXFNcykgewogICAgIGlmIChtU291cmNlLT5mbGFncygpICYga0lzSFRUUEJhc2VkU291cmNlKSB7CiAgICAgICAgIEhUVFBCYXNlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxIVFRQQmFzZSAqPihtU291cmNlLmdldCgpKTsKQEAgLTMwNyw3ICszMzgsMTEgQEAKIAogICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCi0gICAgICAgIGlmIChlcnIgPT0gRVJST1JfVU5TVVBQT1JURUQgfHwgZXJyID09IC1FUElQRSkgeworICAgICAgICBpZiAobURpc2Nvbm5lY3RpbmcpIHsKKyAgICAgICAgICAgIG1OdW1SZXRyaWVzTGVmdCA9IDA7CisgICAgICAgICAgICBtRmluYWxTdGF0dXMgPSBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBFUlJPUl9VTlNVUFBPUlRFRCB8fCBlcnIgPT0gLUVQSVBFKSB7CiAgICAgICAgICAgICAvLyBUaGVzZSBhcmUgZXJyb3JzIHRoYXQgYXJlIG5vdCBsaWtlbHkgdG8gZ28gYXdheSBldmVuIGlmIHdlCiAgICAgICAgICAgICAvLyByZXRyeSwgaS5lLiB0aGUgc2VydmVyIGRvZXNuJ3Qgc3VwcG9ydCByYW5nZSByZXF1ZXN0cyBvciBzaW1pbGFyLgogICAgICAgICAgICAgbU51bVJldHJpZXNMZWZ0ID0gMDsKQEAgLTMyNyw3ICszNjIsMTQgQEAKIAogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKLSAgICBpZiAobiA8IDApIHsKKyAgICBpZiAobiA9PSAwIHx8IG1EaXNjb25uZWN0aW5nKSB7CisgICAgICAgIEFMT0dJKCJFUlJPUl9FTkRfT0ZfU1RSRUFNIik7CisKKyAgICAgICAgbU51bVJldHJpZXNMZWZ0ID0gMDsKKyAgICAgICAgbUZpbmFsU3RhdHVzID0gRVJST1JfRU5EX09GX1NUUkVBTTsKKworICAgICAgICBtQ2FjaGUtPnJlbGVhc2VQYWdlKHBhZ2UpOworICAgIH0gZWxzZSBpZiAobiA8IDApIHsKICAgICAgICAgbUZpbmFsU3RhdHVzID0gbjsKICAgICAgICAgaWYgKG4gPT0gRVJST1JfVU5TVVBQT1JURUQgfHwgbiA9PSAtRVBJUEUpIHsKICAgICAgICAgICAgIC8vIFRoZXNlIGFyZSBlcnJvcnMgdGhhdCBhcmUgbm90IGxpa2VseSB0byBnbyBhd2F5IGV2ZW4gaWYgd2UKQEAgLTMzNSwxNCArMzc3LDcgQEAKICAgICAgICAgICAgIG1OdW1SZXRyaWVzTGVmdCA9IDA7CiAgICAgICAgIH0KIAotICAgICAgICBBTE9HRSgic291cmNlIHJldHVybmVkIGVycm9yICVsZCwgJWQgcmV0cmllcyBsZWZ0IiwgbiwgbU51bVJldHJpZXNMZWZ0KTsKLSAgICAgICAgbUNhY2hlLT5yZWxlYXNlUGFnZShwYWdlKTsKLSAgICB9IGVsc2UgaWYgKG4gPT0gMCkgewotICAgICAgICBBTE9HSSgiRVJST1JfRU5EX09GX1NUUkVBTSIpOwotCi0gICAgICAgIG1OdW1SZXRyaWVzTGVmdCA9IDA7Ci0gICAgICAgIG1GaW5hbFN0YXR1cyA9IEVSUk9SX0VORF9PRl9TVFJFQU07Ci0KKyAgICAgICAgQUxPR0UoInNvdXJjZSByZXR1cm5lZCBlcnJvciAlemQsICVkIHJldHJpZXMgbGVmdCIsIG4sIG1OdW1SZXRyaWVzTGVmdCk7CiAgICAgICAgIG1DYWNoZS0+cmVsZWFzZVBhZ2UocGFnZSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKG1GaW5hbFN0YXR1cyAhPSBPSykgewpAQCAtNDMwLDYgKzQ2NSwxMCBAQAogICAgIH0KIAogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgaWYgKG1EaXNjb25uZWN0aW5nKSB7CisgICAgICAgIG1Db25kaXRpb24uc2lnbmFsKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKICAgICBDSEVDSyhtQXN5bmNSZXN1bHQgPT0gTlVMTCk7CiAKQEAgLTQ2NiwxNiArNTA1LDE5IEBACiAgICAgc2l6ZV90IGFjdHVhbEJ5dGVzID0gbUNhY2hlLT5yZWxlYXNlRnJvbVN0YXJ0KG1heEJ5dGVzKTsKICAgICBtQ2FjaGVPZmZzZXQgKz0gYWN0dWFsQnl0ZXM7CiAKLSAgICBBTE9HSSgicmVzdGFydGluZyBwcmVmZXRjaGVyLCB0b3RhbFNpemUgPSAlZCIsIG1DYWNoZS0+dG90YWxTaXplKCkpOworICAgIEFMT0dJKCJyZXN0YXJ0aW5nIHByZWZldGNoZXIsIHRvdGFsU2l6ZSA9ICV6dSIsIG1DYWNoZS0+dG90YWxTaXplKCkpOwogICAgIG1GZXRjaGluZyA9IHRydWU7CiB9CiAKIHNzaXplX3QgTnVDYWNoZWRTb3VyY2UyOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9TZXJpYWxpemVyKG1TZXJpYWxpemVyKTsKIAotICAgIEFMT0dWKCJyZWFkQXQgb2Zmc2V0ICVsbGQsIHNpemUgJWQiLCBvZmZzZXQsIHNpemUpOworICAgIEFMT0dWKCJyZWFkQXQgb2Zmc2V0ICVsbGQsIHNpemUgJXp1Iiwgb2Zmc2V0LCBzaXplKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgaWYgKG1EaXNjb25uZWN0aW5nKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgIH0KIAogICAgIC8vIElmIHRoZSByZXF1ZXN0IGNhbiBiZSBjb21wbGV0ZWx5IHNhdGlzZmllZCBmcm9tIHRoZSBjYWNoZSwgZG8gc28uCiAKQEAgLTQ5NywxMCArNTM5LDE1IEBACiAgICAgQ0hFQ0sobUFzeW5jUmVzdWx0ID09IE5VTEwpOwogICAgIG1zZy0+cG9zdCgpOwogCi0gICAgd2hpbGUgKG1Bc3luY1Jlc3VsdCA9PSBOVUxMKSB7CisgICAgd2hpbGUgKG1Bc3luY1Jlc3VsdCA9PSBOVUxMICYmICFtRGlzY29ubmVjdGluZykgewogICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOwogICAgIH0KIAorICAgIGlmIChtRGlzY29ubmVjdGluZykgeworICAgICAgICBtQXN5bmNSZXN1bHQuY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgfQorCiAgICAgaW50MzJfdCByZXN1bHQ7CiAgICAgQ0hFQ0sobUFzeW5jUmVzdWx0LT5maW5kSW50MzIoInJlc3VsdCIsICZyZXN1bHQpKTsKIApAQCAtNTQxLDcgKzU4OCw3IEBACiBzc2l6ZV90IE51Q2FjaGVkU291cmNlMjo6cmVhZEludGVybmFsKG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewogICAgIENIRUNLX0xFKHNpemUsIChzaXplX3QpbUhpZ2h3YXRlclRocmVzaG9sZEJ5dGVzKTsKIAotICAgIEFMT0dWKCJyZWFkSW50ZXJuYWwgb2Zmc2V0ICVsbGQgc2l6ZSAlZCIsIG9mZnNldCwgc2l6ZSk7CisgICAgQUxPR1YoInJlYWRJbnRlcm5hbCBvZmZzZXQgJWxsZCBzaXplICV6dSIsIG9mZnNldCwgc2l6ZSk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCkBAIC02NTAsNyArNjk3LDcgQEAKICAgICBzc2l6ZV90IGxvd3dhdGVyTWFya0tiLCBoaWdod2F0ZXJNYXJrS2I7CiAgICAgaW50IGtlZXBBbGl2ZVNlY3M7CiAKLSAgICBpZiAoc3NjYW5mKHMsICIlbGQvJWxkLyVkIiwKKyAgICBpZiAoc3NjYW5mKHMsICIlemQvJXpkLyVkIiwKICAgICAgICAgICAgICAgICZsb3d3YXRlck1hcmtLYiwgJmhpZ2h3YXRlck1hcmtLYiwgJmtlZXBBbGl2ZVNlY3MpICE9IDMpIHsKICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBwYXJzZSBjYWNoZSBwYXJhbWV0ZXJzIGZyb20gJyVzJy4iLCBzKTsKICAgICAgICAgcmV0dXJuOwpAQCAtNjgxLDcgKzcyOCw3IEBACiAgICAgICAgIG1LZWVwQWxpdmVJbnRlcnZhbFVzID0ga0RlZmF1bHRLZWVwQWxpdmVJbnRlcnZhbFVzOwogICAgIH0KIAotICAgIEFMT0dWKCJsb3d3YXRlciA9ICVkIGJ5dGVzLCBoaWdod2F0ZXIgPSAlZCBieXRlcywga2VlcGFsaXZlID0gJWxsZCB1cyIsCisgICAgQUxPR1YoImxvd3dhdGVyID0gJXp1IGJ5dGVzLCBoaWdod2F0ZXIgPSAlenUgYnl0ZXMsIGtlZXBhbGl2ZSA9ICUiIFBSSWQ2NCAiIHVzIiwKICAgICAgICAgIG1Mb3d3YXRlclRocmVzaG9sZEJ5dGVzLAogICAgICAgICAgbUhpZ2h3YXRlclRocmVzaG9sZEJ5dGVzLAogICAgICAgICAgbUtlZXBBbGl2ZUludGVydmFsVXMpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmNwcAppbmRleCA3YmM3ZGEyLi5mMjRjZjNhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmNwcApAQCAtNTgsNyArNTgsOSBAQAogfQogCiBzdGF0dXNfdCBOdU1lZGlhRXh0cmFjdG9yOjpzZXREYXRhU291cmNlKAotICAgICAgICBjb25zdCBjaGFyICpwYXRoLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgeworICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICBjb25zdCBjaGFyICpwYXRoLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBpZiAobUltcGwgIT0gTlVMTCkgewpAQCAtNjYsNyArNjgsNyBAQAogICAgIH0KIAogICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPQotICAgICAgICBEYXRhU291cmNlOjpDcmVhdGVGcm9tVVJJKHBhdGgsIGhlYWRlcnMpOworICAgICAgICBEYXRhU291cmNlOjpDcmVhdGVGcm9tVVJJKGh0dHBTZXJ2aWNlLCBwYXRoLCBoZWFkZXJzKTsKIAogICAgIGlmIChkYXRhU291cmNlID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CkBAIC0zODcsNyArMzg5LDcgQEAKICAgICAgICAgICAgICAgICBpbmZvLT5tRmluYWxSZXN1bHQgPSBlcnI7CiAKICAgICAgICAgICAgICAgICBpZiAoaW5mby0+bUZpbmFsUmVzdWx0ICE9IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coInJlYWQgb24gdHJhY2sgJWQgZmFpbGVkIHdpdGggZXJyb3IgJWQiLAorICAgICAgICAgICAgICAgICAgICBBTE9HVygicmVhZCBvbiB0cmFjayAlenUgZmFpbGVkIHdpdGggZXJyb3IgJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5tVHJhY2tJbmRleCwgZXJyKTsKICAgICAgICAgICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENsaWVudC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDbGllbnQuY3BwCmluZGV4IDRlYjg2NTQuLjAzNDFkMDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENsaWVudC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ2xpZW50LmNwcApAQCAtMTYsNiArMTYsMTEgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJPTVhDbGllbnQiCisKKyNpZmRlZiBfX0xQNjRfXworI2RlZmluZSBPTVhfQU5EUk9JRF9DT01QSUxFX0FTXzMyQklUX09OXzY0QklUX1BMQVRGT1JNUworI2VuZGlmCisKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KQEAgLTczLDYgKzc4LDEwIEBACiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgT01YX0JPT0wgZW5hYmxlLAogICAgICAgICAgICAgT01YX1UzMiBtYXhGcmFtZVdpZHRoLCBPTVhfVTMyIG1heEZyYW1lSGVpZ2h0KTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlVmlkZW9UdW5uZWxNb2RlKAorICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgdHVubmVsZWQsCisgICAgICAgICAgICBPTVhfVTMyIGF1ZGlvSHdTeW5jLCBuYXRpdmVfaGFuZGxlX3QgKipzaWRlYmFuZEhhbmRsZSk7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGVuYWJsZUdyYXBoaWNCdWZmZXJzKAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIE9NWF9CT09MIGVuYWJsZSk7CiAKQEAgLTE0MSw3ICsxNTAsNyBAQAogICAgIGNvbnN0IHNwPElPTVg+ICZnZXRPTVgobm9kZV9pZCBub2RlKSBjb25zdDsKICAgICBjb25zdCBzcDxJT01YPiAmZ2V0T01YX2wobm9kZV9pZCBub2RlKSBjb25zdDsKIAotICAgIHN0YXRpYyBib29sIElzU29mdHdhcmVDb21wb25lbnQoY29uc3QgY2hhciAqbmFtZSk7CisgICAgc3RhdGljIGJvb2wgQ2FuTGl2ZUxvY2FsbHkoY29uc3QgY2hhciAqbmFtZSk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNdXhPTVgpOwogfTsKQEAgLTE2NCw4ICsxNzMsMTUgQEAKIH0KIAogLy8gc3RhdGljCi1ib29sIE11eE9NWDo6SXNTb2Z0d2FyZUNvbXBvbmVudChjb25zdCBjaGFyICpuYW1lKSB7Citib29sIE11eE9NWDo6Q2FuTGl2ZUxvY2FsbHkoY29uc3QgY2hhciAqbmFtZSkgeworI2lmZGVmIF9fTFA2NF9fCisgICAgKHZvaWQpbmFtZTsgLy8gZGlzYWJsZSB1bnVzZWQgcGFyYW1ldGVyIHdhcm5pbmcKKyAgICAvLyA2NCBiaXQgcHJvY2Vzc2VzIGFsd2F5cyBydW4gT01YIHJlbW90ZSBvbiBNZWRpYVNlcnZlcgorICAgIHJldHVybiBmYWxzZTsKKyNlbHNlCisgICAgLy8gMzIgYml0IHByb2Nlc3NlcyBydW4gb25seSBPTVguZ29vZ2xlLiogY29tcG9uZW50cyBsb2NhbGx5CiAgICAgcmV0dXJuICFzdHJuY2FzZWNtcChuYW1lLCAiT01YLmdvb2dsZS4iLCAxMSk7CisjZW5kaWYKIH0KIAogY29uc3Qgc3A8SU9NWD4gJk11eE9NWDo6Z2V0T01YKG5vZGVfaWQgbm9kZSkgY29uc3QgewpAQCAtMTk3LDcgKzIxMyw3IEBACiAKICAgICBzcDxJT01YPiBvbXg7CiAKLSAgICBpZiAoSXNTb2Z0d2FyZUNvbXBvbmVudChuYW1lKSkgeworICAgIGlmIChDYW5MaXZlTG9jYWxseShuYW1lKSkgewogICAgICAgICBpZiAobUxvY2FsT01YID09IE5VTEwpIHsKICAgICAgICAgICAgIG1Mb2NhbE9NWCA9IG5ldyBPTVg7CiAgICAgICAgIH0KQEAgLTI3OSw2ICsyOTUsMTMgQEAKICAgICAgICAgICAgIG5vZGUsIHBvcnRfaW5kZXgsIGVuYWJsZSwgbWF4RnJhbWVXaWR0aCwgbWF4RnJhbWVIZWlnaHQpOwogfQogCitzdGF0dXNfdCBNdXhPTVg6OmNvbmZpZ3VyZVZpZGVvVHVubmVsTW9kZSgKKyAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgZW5hYmxlLAorICAgICAgICBPTVhfVTMyIGF1ZGlvSHdTeW5jLCBuYXRpdmVfaGFuZGxlX3QgKipzaWRlYmFuZEhhbmRsZSkgeworICAgIHJldHVybiBnZXRPTVgobm9kZSktPmNvbmZpZ3VyZVZpZGVvVHVubmVsTW9kZSgKKyAgICAgICAgICAgIG5vZGUsIHBvcnRJbmRleCwgZW5hYmxlLCBhdWRpb0h3U3luYywgc2lkZWJhbmRIYW5kbGUpOworfQorCiBzdGF0dXNfdCBNdXhPTVg6OmVuYWJsZUdyYXBoaWNCdWZmZXJzKAogICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgT01YX0JPT0wgZW5hYmxlKSB7CiAgICAgcmV0dXJuIGdldE9NWChub2RlKS0+ZW5hYmxlR3JhcGhpY0J1ZmZlcnMobm9kZSwgcG9ydF9pbmRleCwgZW5hYmxlKTsKQEAgLTM4Myw3ICs0MDYsNyBAQAogICAgIG1PTVggPSBzZXJ2aWNlLT5nZXRPTVgoKTsKICAgICBDSEVDSyhtT01YLmdldCgpICE9IE5VTEwpOwogCi0gICAgaWYgKCFtT01YLT5saXZlc0xvY2FsbHkoTlVMTCAvKiBub2RlICovLCBnZXRwaWQoKSkpIHsKKyAgICBpZiAoIW1PTVgtPmxpdmVzTG9jYWxseSgwIC8qIG5vZGUgKi8sIGdldHBpZCgpKSkgewogICAgICAgICBBTE9HSSgiVXNpbmcgY2xpZW50LXNpZGUgT01YIG11eC4iKTsKICAgICAgICAgbU9NWCA9IG5ldyBNdXhPTVgobU9NWCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ29kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ29kZWMuY3BwCmluZGV4IGVjNTNhZmYuLjk3ZjQ5YmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENvZGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDb2RlYy5jcHAKQEAgLTE0LDggKzE0LDE1IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJPTVhDb2RlYyIKKworI2lmZGVmIF9fTFA2NF9fCisjZGVmaW5lIE9NWF9BTkRST0lEX0NPTVBJTEVfQVNfMzJCSVRfT05fNjRCSVRfUExBVEZPUk1TCisjZW5kaWYKKwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiaW5jbHVkZS9BQUNFbmNvZGVyLmgiCkBAIC0yOCw2ICszNSw3IEBACiAjaW5jbHVkZSA8SGFyZHdhcmVBUEkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KQEAgLTk0LDYgKzEwMiw3IEBACiAKICNkZWZpbmUgQ09ERUNfTE9HSSh4LCAuLi4pIEFMT0dJKCJbJXNdICJ4LCBtQ29tcG9uZW50TmFtZSwgIyNfX1ZBX0FSR1NfXykKICNkZWZpbmUgQ09ERUNfTE9HVih4LCAuLi4pIEFMT0dWKCJbJXNdICJ4LCBtQ29tcG9uZW50TmFtZSwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgQ09ERUNfTE9HVyh4LCAuLi4pIEFMT0dXKCJbJXNdICJ4LCBtQ29tcG9uZW50TmFtZSwgIyNfX1ZBX0FSR1NfXykKICNkZWZpbmUgQ09ERUNfTE9HRSh4LCAuLi4pIEFMT0dFKCJbJXNdICJ4LCBtQ29tcG9uZW50TmFtZSwgIyNfX1ZBX0FSR1NfXykKIAogc3RydWN0IE9NWENvZGVjT2JzZXJ2ZXIgOiBwdWJsaWMgQm5PTVhPYnNlcnZlciB7CkBAIC0xMjcsNiArMTM2LDcgQEAKIAogdGVtcGxhdGU8Y2xhc3MgVD4KIHN0YXRpYyB2b2lkIEluaXRPTVhQYXJhbXMoVCAqcGFyYW1zKSB7CisgICAgQ09NUElMRV9USU1FX0FTU0VSVF9GVU5DVElPTl9TQ09QRShzaXplb2YoT01YX1BUUikgPT0gNCk7IC8vIGNoZWNrIE9NWF9QVFIgaXMgNCBieXRlcy4KICAgICBwYXJhbXMtPm5TaXplID0gc2l6ZW9mKFQpOwogICAgIHBhcmFtcy0+blZlcnNpb24ucy5uVmVyc2lvbk1ham9yID0gMTsKICAgICBwYXJhbXMtPm5WZXJzaW9uLnMublZlcnNpb25NaW5vciA9IDA7CkBAIC0xODgsNyArMTk4LDcgQEAKICAgICAgICAgVmVjdG9yPENvZGVjTmFtZUFuZFF1aXJrcz4gKm1hdGNoaW5nQ29kZWNzKSB7CiAgICAgbWF0Y2hpbmdDb2RlY3MtPmNsZWFyKCk7CiAKLSAgICBjb25zdCBNZWRpYUNvZGVjTGlzdCAqbGlzdCA9IE1lZGlhQ29kZWNMaXN0OjpnZXRJbnN0YW5jZSgpOworICAgIGNvbnN0IHNwPElNZWRpYUNvZGVjTGlzdD4gbGlzdCA9IE1lZGlhQ29kZWNMaXN0OjpnZXRJbnN0YW5jZSgpOwogICAgIGlmIChsaXN0ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTIwNCw3ICsyMTQsOSBAQAogCiAgICAgICAgIGluZGV4ID0gbWF0Y2hJbmRleCArIDE7CiAKLSAgICAgICAgY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSA9IGxpc3QtPmdldENvZGVjTmFtZShtYXRjaEluZGV4KTsKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0luZm8+IGluZm8gPSBsaXN0LT5nZXRDb2RlY0luZm8obWF0Y2hJbmRleCk7CisgICAgICAgIENIRUNLKGluZm8gIT0gTlVMTCk7CisgICAgICAgIGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUgPSBpbmZvLT5nZXRDb2RlY05hbWUoKTsKIAogICAgICAgICAvLyBJZiBhIHNwZWNpZmljIGNvZGVjIGlzIHJlcXVlc3RlZCwgc2tpcCB0aGUgbm9uLW1hdGNoaW5nIG9uZXMuCiAgICAgICAgIGlmIChtYXRjaENvbXBvbmVudE5hbWUgJiYgc3RyY21wKGNvbXBvbmVudE5hbWUsIG1hdGNoQ29tcG9uZW50TmFtZSkpIHsKQEAgLTIyMiw3ICsyMzQsNyBAQAogICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IG1hdGNoaW5nQ29kZWNzLT5hZGQoKTsKICAgICAgICAgICAgIENvZGVjTmFtZUFuZFF1aXJrcyAqZW50cnkgPSAmbWF0Y2hpbmdDb2RlY3MtPmVkaXRJdGVtQXQoaW5kZXgpOwogICAgICAgICAgICAgZW50cnktPm1OYW1lID0gU3RyaW5nOChjb21wb25lbnROYW1lKTsKLSAgICAgICAgICAgIGVudHJ5LT5tUXVpcmtzID0gZ2V0Q29tcG9uZW50UXVpcmtzKGxpc3QsIG1hdGNoSW5kZXgpOworICAgICAgICAgICAgZW50cnktPm1RdWlya3MgPSBnZXRDb21wb25lbnRRdWlya3MoaW5mbyk7CiAKICAgICAgICAgICAgIEFMT0dWKCJtYXRjaGluZyAnJXMnIHF1aXJrcyAweCUwOHgiLAogICAgICAgICAgICAgICAgICAgZW50cnktPm1OYW1lLnN0cmluZygpLCBlbnRyeS0+bVF1aXJrcyk7CkBAIC0yMzYsMTggKzI0OCwxNSBAQAogCiAvLyBzdGF0aWMKIHVpbnQzMl90IE9NWENvZGVjOjpnZXRDb21wb25lbnRRdWlya3MoCi0gICAgICAgIGNvbnN0IE1lZGlhQ29kZWNMaXN0ICpsaXN0LCBzaXplX3QgaW5kZXgpIHsKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0luZm8+ICZpbmZvKSB7CiAgICAgdWludDMyX3QgcXVpcmtzID0gMDsKLSAgICBpZiAobGlzdC0+Y29kZWNIYXNRdWlyaygKLSAgICAgICAgICAgICAgICBpbmRleCwgInJlcXVpcmVzLWFsbG9jYXRlLW9uLWlucHV0LXBvcnRzIikpIHsKKyAgICBpZiAoaW5mby0+aGFzUXVpcmsoInJlcXVpcmVzLWFsbG9jYXRlLW9uLWlucHV0LXBvcnRzIikpIHsKICAgICAgICAgcXVpcmtzIHw9IGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25JbnB1dFBvcnRzOwogICAgIH0KLSAgICBpZiAobGlzdC0+Y29kZWNIYXNRdWlyaygKLSAgICAgICAgICAgICAgICBpbmRleCwgInJlcXVpcmVzLWFsbG9jYXRlLW9uLW91dHB1dC1wb3J0cyIpKSB7CisgICAgaWYgKGluZm8tPmhhc1F1aXJrKCJyZXF1aXJlcy1hbGxvY2F0ZS1vbi1vdXRwdXQtcG9ydHMiKSkgewogICAgICAgICBxdWlya3MgfD0ga1JlcXVpcmVzQWxsb2NhdGVCdWZmZXJPbk91dHB1dFBvcnRzOwogICAgIH0KLSAgICBpZiAobGlzdC0+Y29kZWNIYXNRdWlyaygKLSAgICAgICAgICAgICAgICBpbmRleCwgIm91dHB1dC1idWZmZXJzLWFyZS11bnJlYWRhYmxlIikpIHsKKyAgICBpZiAoaW5mby0+aGFzUXVpcmsoIm91dHB1dC1idWZmZXJzLWFyZS11bnJlYWRhYmxlIikpIHsKICAgICAgICAgcXVpcmtzIHw9IGtPdXRwdXRCdWZmZXJzQXJlVW5yZWFkYWJsZTsKICAgICB9CiAKQEAgLTI1Niw4ICsyNjUsNyBAQAogCiAvLyBzdGF0aWMKIGJvb2wgT01YQ29kZWM6OmZpbmRDb2RlY1F1aXJrcyhjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCB1aW50MzJfdCAqcXVpcmtzKSB7Ci0gICAgY29uc3QgTWVkaWFDb2RlY0xpc3QgKmxpc3QgPSBNZWRpYUNvZGVjTGlzdDo6Z2V0SW5zdGFuY2UoKTsKLQorICAgIGNvbnN0IHNwPElNZWRpYUNvZGVjTGlzdD4gbGlzdCA9IE1lZGlhQ29kZWNMaXN0OjpnZXRJbnN0YW5jZSgpOwogICAgIGlmIChsaXN0ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTI2OCw3ICsyNzYsOSBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgKnF1aXJrcyA9IGdldENvbXBvbmVudFF1aXJrcyhsaXN0LCBpbmRleCk7CisgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0luZm8+IGluZm8gPSBsaXN0LT5nZXRDb2RlY0luZm8oaW5kZXgpOworICAgIENIRUNLKGluZm8gIT0gTlVMTCk7CisgICAgKnF1aXJrcyA9IGdldENvbXBvbmVudFF1aXJrcyhpbmZvKTsKIAogICAgIHJldHVybiB0cnVlOwogfQpAQCAtMzcyLDYgKzM4Miw1NyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCitzdGF0dXNfdCBPTVhDb2RlYzo6cGFyc2VIRVZDQ29kZWNTcGVjaWZpY0RhdGEoCisgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLAorICAgICAgICB1bnNpZ25lZCAqcHJvZmlsZSwgdW5zaWduZWQgKmxldmVsKSB7CisgICAgY29uc3QgdWludDhfdCAqcHRyID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOworCisgICAgLy8gdmVyaWZ5IG1pbmltdW0gc2l6ZSBhbmQgY29uZmlndXJhdGlvblZlcnNpb24gPT0gMS4KKyAgICBpZiAoc2l6ZSA8IDcgfHwgcHRyWzBdICE9IDEpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICAqcHJvZmlsZSA9IChwdHJbMV0gJiAzMSk7CisgICAgKmxldmVsID0gcHRyWzEyXTsKKworICAgIHB0ciArPSAyMjsKKyAgICBzaXplIC09IDIyOworCisgICAgc2l6ZV90IG51bW9mQXJyYXlzID0gKGNoYXIpcHRyWzBdOworICAgIHB0ciArPSAxOworICAgIHNpemUgLT0gMTsKKyAgICBzaXplX3QgaiA9IDAsIGkgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBudW1vZkFycmF5czsgaSsrKSB7CisgICAgICAgIHB0ciArPSAxOworICAgICAgICBzaXplIC09IDE7CisKKyAgICAgICAgLy8gTnVtIG9mIG5hbHMKKyAgICAgICAgc2l6ZV90IG51bW9mTmFscyA9IFUxNl9BVChwdHIpOworICAgICAgICBwdHIgKz0gMjsKKyAgICAgICAgc2l6ZSAtPSAyOworCisgICAgICAgIGZvciAoaiA9IDA7aiA8IG51bW9mTmFscztqKyspIHsKKyAgICAgICAgICAgIGlmIChzaXplIDwgMikgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNpemVfdCBsZW5ndGggPSBVMTZfQVQocHRyKTsKKworICAgICAgICAgICAgcHRyICs9IDI7CisgICAgICAgICAgICBzaXplIC09IDI7CisKKyAgICAgICAgICAgIGlmIChzaXplIDwgbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZENvZGVjU3BlY2lmaWNEYXRhKHB0ciwgbGVuZ3RoKTsKKworICAgICAgICAgICAgcHRyICs9IGxlbmd0aDsKKyAgICAgICAgICAgIHNpemUgLT0gbGVuZ3RoOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgT01YQ29kZWM6OnBhcnNlQVZDQ29kZWNTcGVjaWZpY0RhdGEoCiAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLAogICAgICAgICB1bnNpZ25lZCAqcHJvZmlsZSwgdW5zaWduZWQgKmxldmVsKSB7CkBAIC00ODQsMTEgKzU0NSwzMiBAQAogICAgICAgICAgICAgQ09ERUNfTE9HSSgKICAgICAgICAgICAgICAgICAgICAgIkFWQyBwcm9maWxlID0gJXUgKCVzKSwgbGV2ZWwgPSAldSIsCiAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUsIEFWQ1Byb2ZpbGVUb1N0cmluZyhwcm9maWxlKSwgbGV2ZWwpOworICAgICAgICB9IGVsc2UgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlIVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgLy8gUGFyc2UgdGhlIEhFVkNEZWNvZGVyQ29uZmlndXJhdGlvblJlY29yZAorCisgICAgICAgICAgICB1bnNpZ25lZCBwcm9maWxlLCBsZXZlbDsKKyAgICAgICAgICAgIHN0YXR1c190IGVycjsKKyAgICAgICAgICAgIGlmICgoZXJyID0gcGFyc2VIRVZDQ29kZWNTcGVjaWZpY0RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgc2l6ZSwgJnByb2ZpbGUsICZsZXZlbCkpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIk1hbGZvcm1lZCBIRVZDIGNvZGVjIHNwZWNpZmljIGRhdGEuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ09ERUNfTE9HSSgKKyAgICAgICAgICAgICAgICAgICAgIkhFVkMgcHJvZmlsZSA9ICV1ICwgbGV2ZWwgPSAldSIsCisgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUsIGxldmVsKTsKICAgICAgICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrS2V5Vm9yYmlzSW5mbywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKICAgICAgICAgICAgIGFkZENvZGVjU3BlY2lmaWNEYXRhKGRhdGEsIHNpemUpOwogCiAgICAgICAgICAgICBDSEVDSyhtZXRhLT5maW5kRGF0YShrS2V5Vm9yYmlzQm9va3MsICZ0eXBlLCAmZGF0YSwgJnNpemUpKTsKICAgICAgICAgICAgIGFkZENvZGVjU3BlY2lmaWNEYXRhKGRhdGEsIHNpemUpOworICAgICAgICB9IGVsc2UgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlPcHVzSGVhZGVyLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgYWRkQ29kZWNTcGVjaWZpY0RhdGEoZGF0YSwgc2l6ZSk7CisKKyAgICAgICAgICAgIENIRUNLKG1ldGEtPmZpbmREYXRhKGtLZXlPcHVzQ29kZWNEZWxheSwgJnR5cGUsICZkYXRhLCAmc2l6ZSkpOworICAgICAgICAgICAgYWRkQ29kZWNTcGVjaWZpY0RhdGEoZGF0YSwgc2l6ZSk7CisgICAgICAgICAgICBDSEVDSyhtZXRhLT5maW5kRGF0YShrS2V5T3B1c1NlZWtQcmVSb2xsLCAmdHlwZSwgJmRhdGEsICZzaXplKSk7CisgICAgICAgICAgICBhZGRDb2RlY1NwZWNpZmljRGF0YShkYXRhLCBzaXplKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNjY3LDExICs3NDksOSBAQAogICAgIE9NWF9VMzIgaW5kZXggPSAwOwogICAgIGZvciAoOzspIHsKICAgICAgICAgZm9ybWF0Lm5JbmRleCA9IGluZGV4OwotICAgICAgICBBTE9HSSgiY2FsbGluZyBnZXRwYXJhbSAlZCBzaXplICVkIiwgaW5kZXgsIGZvcm1hdC5uU2l6ZSk7CiAgICAgICAgIHN0YXR1c190IGVyciA9IG1PTVgtPmdldFBhcmFtZXRlcigKICAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1WaWRlb1BvcnRGb3JtYXQsCiAgICAgICAgICAgICAgICAgJmZvcm1hdCwgc2l6ZW9mKGZvcm1hdCkpOwotICAgICAgICBBTE9HSSgiY2FsbGVkIGdldHBhcmFtICVkIHNpemUgJWQ6ICVkIiwgaW5kZXgsIGZvcm1hdC5uU2l6ZSwgZXJyKTsKIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwpAQCAtNjgxLDcgKzc2MSw3IEBACiAgICAgICAgIC8vIENIRUNLX0VRKGZvcm1hdC5uSW5kZXgsIGluZGV4KTsKIAogI2lmIDEKLSAgICAgICAgQ09ERUNfTE9HVigicG9ydEluZGV4OiAlbGQsIGluZGV4OiAlbGQsIGVDb21wcmVzc2lvbkZvcm1hdD0lZCBlQ29sb3JGb3JtYXQ9JWQiLAorICAgICAgICBDT0RFQ19MT0dWKCJwb3J0SW5kZXg6ICV1LCBpbmRleDogJXUsIGVDb21wcmVzc2lvbkZvcm1hdD0lZCBlQ29sb3JGb3JtYXQ9JWQiLAogICAgICAgICAgICAgIHBvcnRJbmRleCwKICAgICAgICAgICAgICBpbmRleCwgZm9ybWF0LmVDb21wcmVzc2lvbkZvcm1hdCwgZm9ybWF0LmVDb2xvckZvcm1hdCk7CiAjZW5kaWYKQEAgLTcwNSwxMSArNzg1LDkgQEAKICAgICB9CiAKICAgICBDT0RFQ19MT0dWKCJmb3VuZCBhIG1hdGNoLiIpOwotICAgIEFMT0dJKCJjYWxsaW5nIHNldHBhcmFtIHNpemUgJWQiLCBmb3JtYXQublNpemUpOwogICAgIHN0YXR1c190IGVyciA9IG1PTVgtPnNldFBhcmFtZXRlcigKICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbVZpZGVvUG9ydEZvcm1hdCwKICAgICAgICAgICAgICZmb3JtYXQsIHNpemVvZihmb3JtYXQpKTsKLSAgICBBTE9HSSgiY2FsbGVkIHNldHBhcmFtOiAlZCIsIGVycik7CiAKICAgICByZXR1cm4gZXJyOwogfQpAQCAtNzg1LDcgKzg2Myw3IEBACiAgICAgICAgIHBvcnRGb3JtYXQubkluZGV4ID0gaW5kZXg7CiAKICAgICAgICAgaWYgKGluZGV4ID49IGtNYXhDb2xvckZvcm1hdFN1cHBvcnRlZCkgewotICAgICAgICAgICAgQ09ERUNfTE9HRSgiTW9yZSB0aGFuICVsZCBjb2xvciBmb3JtYXRzIGFyZSBzdXBwb3J0ZWQ/Pz8iLCBpbmRleCk7CisgICAgICAgICAgICBDT0RFQ19MT0dFKCJNb3JlIHRoYW4gJXUgY29sb3IgZm9ybWF0cyBhcmUgc3VwcG9ydGVkPz8/IiwgaW5kZXgpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CkBAIC04MTAsNiArODg4LDggQEAKICAgICBPTVhfVklERU9fQ09ESU5HVFlQRSBjb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdVbnVzZWQ7CiAgICAgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgbWltZSkpIHsKICAgICAgICAgY29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nQVZDOworICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQywgbWltZSkpIHsKKyAgICAgICAgY29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nSEVWQzsKICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCBtaW1lKSkgewogICAgICAgICBjb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdNUEVHNDsKICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsIG1pbWUpKSB7CkBAIC05MTQsNyArOTk0LDYgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIE9NWF9VMzIgcmV0ID0gZnJhbWVSYXRlICogaUZyYW1lc0ludGVydmFsIC0gMTsKLSAgICBDSEVDSyhyZXQgPiAxKTsKICAgICByZXR1cm4gcmV0OwogfQogCkBAIC0xMjA1LDYgKzEyODQsOCBAQAogICAgICAgICBjb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdBVkM7CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgbWltZSkpIHsKICAgICAgICAgY29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nTVBFRzQ7CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDLCBtaW1lKSkgeworICAgICAgICBjb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdIRVZDOwogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgbWltZSkpIHsKICAgICAgICAgY29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nSDI2MzsKICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOCwgbWltZSkpIHsKQEAgLTEzOTEsMTIgKzE0NzIsMTYgQEAKICAgICAgICAgICAgICJhdWRpb19kZWNvZGVyLmFhYyIsICJhdWRpb19lbmNvZGVyLmFhYyIgfSwKICAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMsCiAgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci52b3JiaXMiLCAiYXVkaW9fZW5jb2Rlci52b3JiaXMiIH0sCisgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUywKKyAgICAgICAgICAgICJhdWRpb19kZWNvZGVyLm9wdXMiLCAiYXVkaW9fZW5jb2Rlci5vcHVzIiB9LAogICAgICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVywKICAgICAgICAgICAgICJhdWRpb19kZWNvZGVyLmc3MTFtbGF3IiwgImF1ZGlvX2VuY29kZXIuZzcxMW1sYXciIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9BTEFXLAogICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIuZzcxMWFsYXciLCAiYXVkaW9fZW5jb2Rlci5nNzExYWxhdyIgfSwKICAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsCiAgICAgICAgICAgICAidmlkZW9fZGVjb2Rlci5hdmMiLCAidmlkZW9fZW5jb2Rlci5hdmMiIH0sCisgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQywKKyAgICAgICAgICAgICJ2aWRlb19kZWNvZGVyLmhldmMiLCAidmlkZW9fZW5jb2Rlci5oZXZjIiB9LAogICAgICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LAogICAgICAgICAgICAgInZpZGVvX2RlY29kZXIubXBlZzQiLCAidmlkZW9fZW5jb2Rlci5tcGVnNCIgfSwKICAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLApAQCAtMTQ2Niw3ICsxNTUxLDcgQEAKICAgICBzdGF0dXNfdCBlcnIgPSBtT01YLT5mcmVlTm9kZShtTm9kZSk7CiAgICAgQ0hFQ0tfRVEoZXJyLCAoc3RhdHVzX3QpT0spOwogCi0gICAgbU5vZGUgPSBOVUxMOworICAgIG1Ob2RlID0gMDsKICAgICBzZXRTdGF0ZShERUFEKTsKIAogICAgIGNsZWFyQ29kZWNTcGVjaWZpY0RhdGEoKTsKQEAgLTE2MjQsMTUgKzE3MDksMTUgQEAKICAgICAgICAgaW5mby5tTWVkaWFCdWZmZXIgPSBOVUxMOwogCiAgICAgICAgIGlmIChwb3J0SW5kZXggPT0ga1BvcnRJbmRleE91dHB1dCkgewotICAgICAgICAgICAgaWYgKCEobU9NWExpdmVzTG9jYWxseQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1RdWlya3MgJiBrUmVxdWlyZXNBbGxvY2F0ZUJ1ZmZlck9uT3V0cHV0UG9ydHMpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAobVF1aXJrcyAmIGtEZWZlcnNPdXRwdXRCdWZmZXJBbGxvY2F0aW9uKSkpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbm9kZSBkb2VzIG5vdCBmaWxsIGluIHRoZSBidWZmZXIgcHRyIGF0IHRoaXMgdGltZSwKLSAgICAgICAgICAgICAgICAvLyB3ZSB3aWxsIGRlZmVyIGNyZWF0aW5nIHRoZSBNZWRpYUJ1ZmZlciB1bnRpbCByZWNlaXZpbmcKLSAgICAgICAgICAgICAgICAvLyB0aGUgZmlyc3QgRklMTF9CVUZGRVJfRE9ORSBub3RpZmljYXRpb24gaW5zdGVhZC4KLSAgICAgICAgICAgICAgICBpbmZvLm1NZWRpYUJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcihpbmZvLm1EYXRhLCBpbmZvLm1TaXplKTsKLSAgICAgICAgICAgICAgICBpbmZvLm1NZWRpYUJ1ZmZlci0+c2V0T2JzZXJ2ZXIodGhpcyk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBGYWlsIGRlZmVycmVkIE1lZGlhQnVmZmVyIGNyZWF0aW9uIHVudGlsIEZJTExfQlVGRkVSX0RPTkU7CisgICAgICAgICAgICAvLyB0aGlzIGxlZ2FjeSBtb2RlIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuCisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKChtT01YTGl2ZXNMb2NhbGx5CisgICAgICAgICAgICAgICAgICAgICYmIChtUXVpcmtzICYga1JlcXVpcmVzQWxsb2NhdGVCdWZmZXJPbk91dHB1dFBvcnRzKQorICAgICAgICAgICAgICAgICAgICAmJiAobVF1aXJrcyAmIGtEZWZlcnNPdXRwdXRCdWZmZXJBbGxvY2F0aW9uKSksCisgICAgICAgICAgICAgICAgICAgICJhbGxvY2F0ZUJ1ZmZlcnNPblBvcnQgY2Fubm90IGRlZmVyIGJ1ZmZlciBhbGxvY2F0aW9uIik7CisKKyAgICAgICAgICAgIGluZm8ubU1lZGlhQnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKGluZm8ubURhdGEsIGluZm8ubVNpemUpOworICAgICAgICAgICAgaW5mby5tTWVkaWFCdWZmZXItPnNldE9ic2VydmVyKHRoaXMpOwogICAgICAgICB9CiAKICAgICAgICAgbVBvcnRCdWZmZXJzW3BvcnRJbmRleF0ucHVzaChpbmZvKTsKQEAgLTE4MDMsMjEgKzE4ODgsNDIgQEAKICAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgLWVycik7CiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQorICAgIC8vIEZJWE1FOiBhc3N1bWUgdGhhdCBzdXJmYWNlIGlzIGNvbnRyb2xsZWQgYnkgYXBwIChuYXRpdmUgd2luZG93CisgICAgLy8gcmV0dXJucyB0aGUgbnVtYmVyIGZvciB0aGUgY2FzZSB3aGVuIHN1cmZhY2UgaXMgbm90IGNvbnRyb2xsZWQgYnkgYXBwKQorICAgIC8vIEZJWE1FMjogVGhpcyBtZWFucyB0aGF0IG1pblVuZGVxZXVldWRCdWZzIGNhbiBiZSAxIGxhcmdlciB0aGFuIHJlcG9ydGVkCisgICAgLy8gRm9yIG5vdywgdHJ5IHRvIGFsbG9jYXRlIDEgbW9yZSBidWZmZXIsIGJ1dCBkb24ndCBmYWlsIGlmIHVuc3VjY2Vzc2Z1bAogCi0gICAgLy8gWFhYOiBJcyB0aGlzIHRoZSByaWdodCBsb2dpYyB0byB1c2U/ICBJdCdzIG5vdCBjbGVhciB0byBtZSB3aGF0IHRoZSBPTVgKLSAgICAvLyBidWZmZXIgY291bnRzIHJlZmVyIHRvIC0gaG93IGRvIHRoZXkgYWNjb3VudCBmb3IgdGhlIHJlbmRlcmVyIGhvbGRpbmcgb24KLSAgICAvLyB0byBidWZmZXJzPwotICAgIGlmIChkZWYubkJ1ZmZlckNvdW50QWN0dWFsIDwgZGVmLm5CdWZmZXJDb3VudE1pbiArIG1pblVuZGVxdWV1ZWRCdWZzKSB7Ci0gICAgICAgIE9NWF9VMzIgbmV3QnVmZmVyQ291bnQgPSBkZWYubkJ1ZmZlckNvdW50TWluICsgbWluVW5kZXF1ZXVlZEJ1ZnM7CisgICAgLy8gVXNlIGNvbnNlcnZhdGl2ZSBhbGxvY2F0aW9uIHdoaWxlIGFsc28gdHJ5aW5nIHRvIHJlZHVjZSBzdGFydmF0aW9uCisgICAgLy8KKyAgICAvLyAxLiBhbGxvY2F0ZSBhdCBsZWFzdCBuQnVmZmVyQ291bnRNaW4gKyBtaW5VbmRlcXVldWVkQnVmZmVycyAtIHRoYXQgaXMgdGhlCisgICAgLy8gICAgbWluaW11bSBuZWVkZWQgZm9yIHRoZSBjb25zdW1lciB0byBiZSBhYmxlIHRvIHdvcmsKKyAgICAvLyAyLiB0cnkgdG8gYWxsb2NhdGUgdHdvICgyKSBhZGRpdGlvbmFsIGJ1ZmZlcnMgdG8gcmVkdWNlIHN0YXJ2YXRpb24gZnJvbQorICAgIC8vICAgIHRoZSBjb25zdW1lcgorICAgIC8vICAgIHBsdXMgYW4gZXh0cmEgYnVmZmVyIHRvIGFjY291bnQgZm9yIGluY29ycmVjdCBtaW5VbmRlcXVldWVkQnVmcworICAgIENPREVDX0xPR0koIk9NWC1idWZmZXJzOiBtaW49JXUgYWN0dWFsPSV1IHVuZGVxPSVkKzEiLAorICAgICAgICAgICAgZGVmLm5CdWZmZXJDb3VudE1pbiwgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCwgbWluVW5kZXF1ZXVlZEJ1ZnMpOworCisgICAgZm9yIChPTVhfVTMyIGV4dHJhQnVmZmVycyA9IDIgKyAxOyAvKiBjb25kaXRpb24gaW5zaWRlIGxvb3AgKi87IGV4dHJhQnVmZmVycy0tKSB7CisgICAgICAgIE9NWF9VMzIgbmV3QnVmZmVyQ291bnQgPQorICAgICAgICAgICAgZGVmLm5CdWZmZXJDb3VudE1pbiArIG1pblVuZGVxdWV1ZWRCdWZzICsgZXh0cmFCdWZmZXJzOwogICAgICAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsID0gbmV3QnVmZmVyQ291bnQ7CiAgICAgICAgIGVyciA9IG1PTVgtPnNldFBhcmFtZXRlcigKICAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbiwgJmRlZiwgc2l6ZW9mKGRlZikpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBDT0RFQ19MT0dFKCJzZXR0aW5nIG5CdWZmZXJDb3VudEFjdHVhbCB0byAlbHUgZmFpbGVkOiAlZCIsCi0gICAgICAgICAgICAgICAgICAgIG5ld0J1ZmZlckNvdW50LCBlcnIpOworCisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIG1pblVuZGVxdWV1ZWRCdWZzICs9IGV4dHJhQnVmZmVyczsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgQ09ERUNfTE9HVygic2V0dGluZyBuQnVmZmVyQ291bnRBY3R1YWwgdG8gJXUgZmFpbGVkOiAlZCIsCisgICAgICAgICAgICAgICAgbmV3QnVmZmVyQ291bnQsIGVycik7CisgICAgICAgIC8qIGV4aXQgY29uZGl0aW9uICovCisgICAgICAgIGlmIChleHRyYUJ1ZmZlcnMgPT0gMCkgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogICAgIH0KKyAgICBDT0RFQ19MT0dJKCJPTVgtYnVmZmVyczogbWluPSV1IGFjdHVhbD0ldSB1bmRlcT0lZCsxIiwKKyAgICAgICAgICAgIGRlZi5uQnVmZmVyQ291bnRNaW4sIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwsIG1pblVuZGVxdWV1ZWRCdWZzKTsKIAogICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcl9jb3VudCgKICAgICAgICAgICAgIG1OYXRpdmVXaW5kb3cuZ2V0KCksIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwpOwpAQCAtMTgyNyw3ICsxOTMzLDcgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKLSAgICBDT0RFQ19MT0dWKCJhbGxvY2F0aW5nICVsdSBidWZmZXJzIGZyb20gYSBuYXRpdmUgd2luZG93IG9mIHNpemUgJWx1IG9uICIKKyAgICBDT0RFQ19MT0dWKCJhbGxvY2F0aW5nICV1IGJ1ZmZlcnMgZnJvbSBhIG5hdGl2ZSB3aW5kb3cgb2Ygc2l6ZSAldSBvbiAiCiAgICAgICAgICAgICAib3V0cHV0IHBvcnQiLCBkZWYubkJ1ZmZlckNvdW50QWN0dWFsLCBkZWYubkJ1ZmZlclNpemUpOwogCiAgICAgLy8gRGVxdWV1ZSBidWZmZXJzIGFuZCBzZW5kIHRoZW0gdG8gT01YCkBAIC0xODYwLDcgKzE5NjYsNyBAQAogCiAgICAgICAgIG1Qb3J0QnVmZmVyc1trUG9ydEluZGV4T3V0cHV0XS5lZGl0SXRlbUF0KGkpLm1CdWZmZXIgPSBidWZmZXJJZDsKIAotICAgICAgICBDT0RFQ19MT0dWKCJyZWdpc3RlcmVkIGdyYXBoaWMgYnVmZmVyIHdpdGggSUQgJXAgKHBvaW50ZXIgPSAlcCkiLAorICAgICAgICBDT0RFQ19MT0dWKCJyZWdpc3RlcmVkIGdyYXBoaWMgYnVmZmVyIHdpdGggSUQgJXUgKHBvaW50ZXIgPSAlcCkiLAogICAgICAgICAgICAgICAgIGJ1ZmZlcklkLCBncmFwaGljQnVmZmVyLmdldCgpKTsKICAgICB9CiAKQEAgLTE4ODcsNyArMTk5Myw3IEBACiAKIHN0YXR1c190IE9NWENvZGVjOjpjYW5jZWxCdWZmZXJUb05hdGl2ZVdpbmRvdyhCdWZmZXJJbmZvICppbmZvKSB7CiAgICAgQ0hFQ0tfRVEoKGludClpbmZvLT5tU3RhdHVzLCAoaW50KU9XTkVEX0JZX1VTKTsKLSAgICBDT0RFQ19MT0dWKCJDYWxsaW5nIGNhbmNlbEJ1ZmZlciBvbiBidWZmZXIgJXAiLCBpbmZvLT5tQnVmZmVyKTsKKyAgICBDT0RFQ19MT0dWKCJDYWxsaW5nIGNhbmNlbEJ1ZmZlciBvbiBidWZmZXIgJXUiLCBpbmZvLT5tQnVmZmVyKTsKICAgICBpbnQgZXJyID0gbU5hdGl2ZVdpbmRvdy0+Y2FuY2VsQnVmZmVyKAogICAgICAgICBtTmF0aXZlV2luZG93LmdldCgpLCBpbmZvLT5tTWVkaWFCdWZmZXItPmdyYXBoaWNCdWZmZXIoKS5nZXQoKSwgLTEpOwogICAgIGlmIChlcnIgIT0gMCkgewpAQCAtMjEyNSw3ICsyMjMxLDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgSU9NWDo6YnVmZmVyX2lkIGJ1ZmZlciA9IG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLmJ1ZmZlcjsKIAotICAgICAgICAgICAgQ09ERUNfTE9HVigiRU1QVFlfQlVGRkVSX0RPTkUoYnVmZmVyOiAlcCkiLCBidWZmZXIpOworICAgICAgICAgICAgQ09ERUNfTE9HVigiRU1QVFlfQlVGRkVSX0RPTkUoYnVmZmVyOiAldSkiLCBidWZmZXIpOwogCiAgICAgICAgICAgICBWZWN0b3I8QnVmZmVySW5mbz4gKmJ1ZmZlcnMgPSAmbVBvcnRCdWZmZXJzW2tQb3J0SW5kZXhJbnB1dF07CiAgICAgICAgICAgICBzaXplX3QgaSA9IDA7CkBAIC0yMTM1LDcgKzIyNDEsNyBAQAogCiAgICAgICAgICAgICBDSEVDSyhpIDwgYnVmZmVycy0+c2l6ZSgpKTsKICAgICAgICAgICAgIGlmICgoKmJ1ZmZlcnMpW2ldLm1TdGF0dXMgIT0gT1dORURfQllfQ09NUE9ORU5UKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIldlIGFscmVhZHkgb3duIGlucHV0IGJ1ZmZlciAlcCwgeWV0IHJlY2VpdmVkICIKKyAgICAgICAgICAgICAgICBBTE9HVygiV2UgYWxyZWFkeSBvd24gaW5wdXQgYnVmZmVyICV1LCB5ZXQgcmVjZWl2ZWQgIgogICAgICAgICAgICAgICAgICAgICAgImFuIEVNUFRZX0JVRkZFUl9ET05FLiIsIGJ1ZmZlcik7CiAgICAgICAgICAgICB9CiAKQEAgLTIxNDksNyArMjI1NSw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtUG9ydFN0YXR1c1trUG9ydEluZGV4SW5wdXRdID09IERJU0FCTElORykgewotICAgICAgICAgICAgICAgIENPREVDX0xPR1YoIlBvcnQgaXMgZGlzYWJsZWQsIGZyZWVpbmcgYnVmZmVyICVwIiwgYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBDT0RFQ19MT0dWKCJQb3J0IGlzIGRpc2FibGVkLCBmcmVlaW5nIGJ1ZmZlciAldSIsIGJ1ZmZlcik7CiAKICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBmcmVlQnVmZmVyKGtQb3J0SW5kZXhJbnB1dCwgaSk7CiAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoZXJyLCAoc3RhdHVzX3QpT0spOwpAQCAtMjE3MSw3ICsyMjc3LDcgQEAKICAgICAgICAgICAgIElPTVg6OmJ1ZmZlcl9pZCBidWZmZXIgPSBtc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5idWZmZXI7CiAgICAgICAgICAgICBPTVhfVTMyIGZsYWdzID0gbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEuZmxhZ3M7CiAKLSAgICAgICAgICAgIENPREVDX0xPR1YoIkZJTExfQlVGRkVSX0RPTkUoYnVmZmVyOiAlcCwgc2l6ZTogJWxkLCBmbGFnczogMHglMDhseCwgdGltZXN0YW1wOiAlbGxkIHVzICglLjJmIHNlY3MpKSIsCisgICAgICAgICAgICBDT0RFQ19MT0dWKCJGSUxMX0JVRkZFUl9ET05FKGJ1ZmZlcjogJXUsIHNpemU6ICV1LCBmbGFnczogMHglMDh4LCB0aW1lc3RhbXA6ICVsbGQgdXMgKCUuMmYgc2VjcykpIiwKICAgICAgICAgICAgICAgICAgYnVmZmVyLAogICAgICAgICAgICAgICAgICBtc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5yYW5nZV9sZW5ndGgsCiAgICAgICAgICAgICAgICAgIGZsYWdzLApAQCAtMjE4OCwxNCArMjI5NCwxNCBAQAogICAgICAgICAgICAgQnVmZmVySW5mbyAqaW5mbyA9ICZidWZmZXJzLT5lZGl0SXRlbUF0KGkpOwogCiAgICAgICAgICAgICBpZiAoaW5mby0+bVN0YXR1cyAhPSBPV05FRF9CWV9DT01QT05FTlQpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiV2UgYWxyZWFkeSBvd24gb3V0cHV0IGJ1ZmZlciAlcCwgeWV0IHJlY2VpdmVkICIKKyAgICAgICAgICAgICAgICBBTE9HVygiV2UgYWxyZWFkeSBvd24gb3V0cHV0IGJ1ZmZlciAldSwgeWV0IHJlY2VpdmVkICIKICAgICAgICAgICAgICAgICAgICAgICJhIEZJTExfQlVGRkVSX0RPTkUuIiwgYnVmZmVyKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaW5mby0+bVN0YXR1cyA9IE9XTkVEX0JZX1VTOwogCiAgICAgICAgICAgICBpZiAobVBvcnRTdGF0dXNba1BvcnRJbmRleE91dHB1dF0gPT0gRElTQUJMSU5HKSB7Ci0gICAgICAgICAgICAgICAgQ09ERUNfTE9HVigiUG9ydCBpcyBkaXNhYmxlZCwgZnJlZWluZyBidWZmZXIgJXAiLCBidWZmZXIpOworICAgICAgICAgICAgICAgIENPREVDX0xPR1YoIlBvcnQgaXMgZGlzYWJsZWQsIGZyZWVpbmcgYnVmZmVyICV1IiwgYnVmZmVyKTsKIAogICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGZyZWVCdWZmZXIoa1BvcnRJbmRleE91dHB1dCwgaSk7CiAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoZXJyLCAoc3RhdHVzX3QpT0spOwpAQCAtMjIxMCwyMiArMjMxNiw2IEBACiAgICAgICAgICAgICB9IGVsc2UgaWYgKG1Qb3J0U3RhdHVzW2tQb3J0SW5kZXhPdXRwdXRdICE9IFNIVVRUSU5HX0RPV04pIHsKICAgICAgICAgICAgICAgICBDSEVDS19FUSgoaW50KW1Qb3J0U3RhdHVzW2tQb3J0SW5kZXhPdXRwdXRdLCAoaW50KUVOQUJMRUQpOwogCi0gICAgICAgICAgICAgICAgaWYgKGluZm8tPm1NZWRpYUJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKG1PTVhMaXZlc0xvY2FsbHkpOwotICAgICAgICAgICAgICAgICAgICBDSEVDSyhtUXVpcmtzICYga1JlcXVpcmVzQWxsb2NhdGVCdWZmZXJPbk91dHB1dFBvcnRzKTsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobVF1aXJrcyAmIGtEZWZlcnNPdXRwdXRCdWZmZXJBbGxvY2F0aW9uKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcWNvbSB2aWRlbyBkZWNvZGVycyBvbiBOZXh1cyBkb24ndCBhY3R1YWxseSBhbGxvY2F0ZQotICAgICAgICAgICAgICAgICAgICAvLyBvdXRwdXQgYnVmZmVyIG1lbW9yeSBvbiBhIGNhbGwgdG8gT01YX0FsbG9jYXRlQnVmZmVyCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSAicEJ1ZmZlciIgbWVtYmVyIG9mIHRoZSBPTVhfQlVGRkVSSEVBREVSVFlQRQotICAgICAgICAgICAgICAgICAgICAvLyBzdHJ1Y3R1cmUgaXMgb25seSBmaWxsZWQgaW4gbGF0ZXIuCi0KLSAgICAgICAgICAgICAgICAgICAgaW5mby0+bU1lZGlhQnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLmRhdGFfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPm1TaXplKTsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+bU1lZGlhQnVmZmVyLT5zZXRPYnNlcnZlcih0aGlzKTsKLSAgICAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyID0gaW5mby0+bU1lZGlhQnVmZmVyOwogICAgICAgICAgICAgICAgIGJvb2wgaXNHcmFwaGljQnVmZmVyID0gYnVmZmVyLT5ncmFwaGljQnVmZmVyKCkgIT0gTlVMTDsKIApAQCAtMjI2MCwxMSArMjM1MCw3IEBACiAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc1VucmVhZGFibGUsIHRydWUpOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldFBvaW50ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBrS2V5UGxhdGZvcm1Qcml2YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEucGxhdGZvcm1fcHJpdmF0ZSk7Ci0KLSAgICAgICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRQb2ludGVyKAorICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDMyKAogICAgICAgICAgICAgICAgICAgICAgICAga0tleUJ1ZmZlcklELAogICAgICAgICAgICAgICAgICAgICAgICAgbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEuYnVmZmVyKTsKIApAQCAtMjQwNiw3ICsyNDkyLDcgQEAKIAogICAgICAgICBjYXNlIE9NWF9FdmVudEVycm9yOgogICAgICAgICB7Ci0gICAgICAgICAgICBDT0RFQ19MT0dFKCJFUlJPUigweCUwOGx4LCAlbGQpIiwgZGF0YTEsIGRhdGEyKTsKKyAgICAgICAgICAgIENPREVDX0xPR0UoIk9NWF9FdmVudEVycm9yKDB4JTA4eCwgJXUpIiwgZGF0YTEsIGRhdGEyKTsKIAogICAgICAgICAgICAgc2V0U3RhdGUoRVJST1IpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0yNDE0LDE2ICsyNTAwLDEwIEBACiAKICAgICAgICAgY2FzZSBPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkOgogICAgICAgICB7Ci0gICAgICAgICAgICBDT0RFQ19MT0dWKCJPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkKHBvcnQ9JWxkLCBkYXRhMj0weCUwOGx4KSIsCisgICAgICAgICAgICBDT0RFQ19MT0dWKCJPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkKHBvcnQ9JXUsIGRhdGEyPTB4JTA4eCkiLAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhMSwgZGF0YTIpOwogCiAgICAgICAgICAgICBpZiAoZGF0YTIgPT0gMCB8fCBkYXRhMiA9PSBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayB3aGV0aGVyIG1GaWxsZWRCdWZmZXJzIGlzIGVtcHR5IG9yIG5vdAotICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQgaXMgbm90IG1lYW50IGZvciByZWFsbG9jYXRpbmcKLSAgICAgICAgICAgICAgICAvLyB0aGUgb3V0cHV0IGJ1ZmZlcnMuCi0gICAgICAgICAgICAgICAgaWYgKGRhdGExID09IGtQb3J0SW5kZXhPdXRwdXQpIHsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobUZpbGxlZEJ1ZmZlcnMuZW1wdHkoKSk7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG9uUG9ydFNldHRpbmdzQ2hhbmdlZChkYXRhMSk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGExID09IGtQb3J0SW5kZXhPdXRwdXQgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIChkYXRhMiA9PSBPTVhfSW5kZXhDb25maWdDb21tb25PdXRwdXRDcm9wIHx8CkBAIC0yNDU0LDcgKzI1MzQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHNjYWxlIGlzIGluIDE2LjE2IGZvcm1hdC4KICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjYWxlIDEuMCA9IDB4MDEwMDAwLiBXaGVuIHRoZXJlIGlzIG5vCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGNoYW5nZSB0aGUgZGlzcGxheSwgc2tpcCBpdC4KLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJHZXQgT01YX0luZGV4Q29uZmlnU2NhbGU6IDB4JWx4LzB4JWx4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJHZXQgT01YX0luZGV4Q29uZmlnU2NhbGU6IDB4JXgvMHgleCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlLnhXaWR0aCwgc2NhbGUueEhlaWdodCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY2FsZS54V2lkdGggIT0gMHgwMTAwMDApIHsKQEAgLTI0ODgsNyArMjU2OCw3IEBACiAKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgewotICAgICAgICAgICAgQ09ERUNfTE9HVigiRVZFTlQoJWQsICVsZCwgJWxkKSIsIGV2ZW50LCBkYXRhMSwgZGF0YTIpOworICAgICAgICAgICAgQ09ERUNfTE9HVigiRVZFTlQoJWQsICV1LCAldSkiLCBldmVudCwgZGF0YTEsIGRhdGEyKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQpAQCAtMjUwNSw3ICsyNTg1LDcgQEAKICAgICAgICAgY2FzZSBPTVhfQ29tbWFuZFBvcnREaXNhYmxlOgogICAgICAgICB7CiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCA9IGRhdGE7Ci0gICAgICAgICAgICBDT0RFQ19MT0dWKCJQT1JUX0RJU0FCTEVEKCVsZCkiLCBwb3J0SW5kZXgpOworICAgICAgICAgICAgQ09ERUNfTE9HVigiUE9SVF9ESVNBQkxFRCgldSkiLCBwb3J0SW5kZXgpOwogCiAgICAgICAgICAgICBDSEVDSyhtU3RhdGUgPT0gRVhFQ1VUSU5HIHx8IG1TdGF0ZSA9PSBSRUNPTkZJR1VSSU5HKTsKICAgICAgICAgICAgIENIRUNLX0VRKChpbnQpbVBvcnRTdGF0dXNbcG9ydEluZGV4XSwgKGludClESVNBQkxJTkcpOwpAQCAtMjUyOSw3ICsyNjA5LDcgQEAKIAogICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGVuYWJsZVBvcnRBc3luYyhwb3J0SW5kZXgpOwogICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgQ09ERUNfTE9HRSgiZW5hYmxlUG9ydEFzeW5jKCVsZCkgZmFpbGVkIChlcnIgPSAlZCkiLCBwb3J0SW5kZXgsIGVycik7CisgICAgICAgICAgICAgICAgICAgIENPREVDX0xPR0UoImVuYWJsZVBvcnRBc3luYygldSkgZmFpbGVkIChlcnIgPSAlZCkiLCBwb3J0SW5kZXgsIGVycik7CiAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKEVSUk9SKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBlcnIgPSBhbGxvY2F0ZUJ1ZmZlcnNPblBvcnQocG9ydEluZGV4KTsKQEAgLTI1NTAsNyArMjYzMCw3IEBACiAgICAgICAgIGNhc2UgT01YX0NvbW1hbmRQb3J0RW5hYmxlOgogICAgICAgICB7CiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCA9IGRhdGE7Ci0gICAgICAgICAgICBDT0RFQ19MT0dWKCJQT1JUX0VOQUJMRUQoJWxkKSIsIHBvcnRJbmRleCk7CisgICAgICAgICAgICBDT0RFQ19MT0dWKCJQT1JUX0VOQUJMRUQoJXUpIiwgcG9ydEluZGV4KTsKIAogICAgICAgICAgICAgQ0hFQ0sobVN0YXRlID09IEVYRUNVVElORyB8fCBtU3RhdGUgPT0gUkVDT05GSUdVUklORyk7CiAgICAgICAgICAgICBDSEVDS19FUSgoaW50KW1Qb3J0U3RhdHVzW3BvcnRJbmRleF0sIChpbnQpRU5BQkxJTkcpOwpAQCAtMjU3MSw3ICsyNjUxLDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXggPSBkYXRhOwogCi0gICAgICAgICAgICBDT0RFQ19MT0dWKCJGTFVTSF9ET05FKCVsZCkiLCBwb3J0SW5kZXgpOworICAgICAgICAgICAgQ09ERUNfTE9HVigiRkxVU0hfRE9ORSgldSkiLCBwb3J0SW5kZXgpOwogCiAgICAgICAgICAgICBDSEVDS19FUSgoaW50KW1Qb3J0U3RhdHVzW3BvcnRJbmRleF0sIChpbnQpU0hVVFRJTkdfRE9XTik7CiAgICAgICAgICAgICBtUG9ydFN0YXR1c1twb3J0SW5kZXhdID0gRU5BQkxFRDsKQEAgLTI4MTcsNyArMjg5Nyw3IEBACiB2b2lkIE9NWENvZGVjOjpvblBvcnRTZXR0aW5nc0NoYW5nZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKICAgICBDT0RFQ19MT0dWKCJQT1JUX1NFVFRJTkdTX0NIQU5HRUQoJWxkKSIsIHBvcnRJbmRleCk7CiAKLSAgICBDSEVDS19FUSgoaW50KW1TdGF0ZSwgKGludClFWEVDVVRJTkcpOworICAgIENIRUNLKG1TdGF0ZSA9PSBFWEVDVVRJTkcgfHwgbVN0YXRlID09IEVYRUNVVElOR19UT19JRExFKTsKICAgICBDSEVDS19FUShwb3J0SW5kZXgsIChPTVhfVTMyKWtQb3J0SW5kZXhPdXRwdXQpOwogICAgIENIRUNLKCFtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlZFBlbmRpbmcpOwogCkBAIC0yOTk5LDcgKzMwNzksOCBAQAogCiAgICAgICAgIHNpemVfdCBzaXplID0gc3BlY2lmaWMtPm1TaXplOwogCi0gICAgICAgIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsIG1NSU1FKQorICAgICAgICBpZiAoKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgbU1JTUUpIHx8CisgICAgICAgICAgICAgIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQywgbU1JTUUpKQogICAgICAgICAgICAgICAgICYmICEobVF1aXJrcyAmIGtXYW50c05BTEZyYWdtZW50cykpIHsKICAgICAgICAgICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtOQUxTdGFydENvZGVbNF0gPQogICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEgfTsKQEAgLTM4ODksNyArMzk3MCw3IEBACiAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgfQogCi0gICAgICAgIENPREVDX0xPR1YoInNlZWtpbmcgdG8gJWxsZCB1cyAoJS4yZiBzZWNzKSIsIHNlZWtUaW1lVXMsIHNlZWtUaW1lVXMgLyAxRTYpOworICAgICAgICBDT0RFQ19MT0dWKCJzZWVraW5nIHRvICUiIFBSSWQ2NCAiIHVzICglLjJmIHNlY3MpIiwgc2Vla1RpbWVVcywgc2Vla1RpbWVVcyAvIDFFNik7CiAKICAgICAgICAgbVNpZ25hbGxlZEVPUyA9IGZhbHNlOwogCkBAIC00MTM0LDYgKzQyMTUsNyBAQAogICAgICAgICAiT01YX0FVRElPX0NvZGluZ01QMyIsCiAgICAgICAgICJPTVhfQVVESU9fQ29kaW5nU0JDIiwKICAgICAgICAgIk9NWF9BVURJT19Db2RpbmdWT1JCSVMiLAorICAgICAgICAiT01YX0FVRElPX0NvZGluZ09QVVMiLAogICAgICAgICAiT01YX0FVRElPX0NvZGluZ1dNQSIsCiAgICAgICAgICJPTVhfQVVESU9fQ29kaW5nUkEiLAogICAgICAgICAiT01YX0FVRElPX0NvZGluZ01JREkiLApAQCAtNDIyOCw5ICs0MzEwLDkgQEAKICAgICBDSEVDSygocG9ydEluZGV4ID09IGtQb3J0SW5kZXhJbnB1dCAmJiBkZWYuZURpciA9PSBPTVhfRGlySW5wdXQpCiAgICAgICAgICAgfHwgKHBvcnRJbmRleCA9PSBrUG9ydEluZGV4T3V0cHV0ICYmIGRlZi5lRGlyID09IE9NWF9EaXJPdXRwdXQpKTsKIAotICAgIHByaW50ZigiICBuQnVmZmVyQ291bnRBY3R1YWwgPSAlbGRcbiIsIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwpOwotICAgIHByaW50ZigiICBuQnVmZmVyQ291bnRNaW4gPSAlbGRcbiIsIGRlZi5uQnVmZmVyQ291bnRNaW4pOwotICAgIHByaW50ZigiICBuQnVmZmVyU2l6ZSA9ICVsZFxuIiwgZGVmLm5CdWZmZXJTaXplKTsKKyAgICBwcmludGYoIiAgbkJ1ZmZlckNvdW50QWN0dWFsID0gJSIgUFJJdTMyICJcbiIsIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwpOworICAgIHByaW50ZigiICBuQnVmZmVyQ291bnRNaW4gPSAlIiBQUkl1MzIgIlxuIiwgZGVmLm5CdWZmZXJDb3VudE1pbik7CisgICAgcHJpbnRmKCIgIG5CdWZmZXJTaXplID0gJSIgUFJJdTMyICJcbiIsIGRlZi5uQnVmZmVyU2l6ZSk7CiAKICAgICBzd2l0Y2ggKGRlZi5lRG9tYWluKSB7CiAgICAgICAgIGNhc2UgT01YX1BvcnREb21haW5JbWFnZToKQEAgLTQyMzksOSArNDMyMSw5IEBACiAKICAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICAgICAgIHByaW50ZigiICAvLyBJbWFnZVxuIik7Ci0gICAgICAgICAgICBwcmludGYoIiAgbkZyYW1lV2lkdGggPSAlbGRcbiIsIGltYWdlRGVmLT5uRnJhbWVXaWR0aCk7Ci0gICAgICAgICAgICBwcmludGYoIiAgbkZyYW1lSGVpZ2h0ID0gJWxkXG4iLCBpbWFnZURlZi0+bkZyYW1lSGVpZ2h0KTsKLSAgICAgICAgICAgIHByaW50ZigiICBuU3RyaWRlID0gJWxkXG4iLCBpbWFnZURlZi0+blN0cmlkZSk7CisgICAgICAgICAgICBwcmludGYoIiAgbkZyYW1lV2lkdGggPSAlIiBQUkl1MzIgIlxuIiwgaW1hZ2VEZWYtPm5GcmFtZVdpZHRoKTsKKyAgICAgICAgICAgIHByaW50ZigiICBuRnJhbWVIZWlnaHQgPSAlIiBQUkl1MzIgIlxuIiwgaW1hZ2VEZWYtPm5GcmFtZUhlaWdodCk7CisgICAgICAgICAgICBwcmludGYoIiAgblN0cmlkZSA9ICUiIFBSSXUzMiAiXG4iLCBpbWFnZURlZi0+blN0cmlkZSk7CiAKICAgICAgICAgICAgIHByaW50ZigiICBlQ29tcHJlc3Npb25Gb3JtYXQgPSAlc1xuIiwKICAgICAgICAgICAgICAgICAgICBpbWFnZUNvbXByZXNzaW9uRm9ybWF0U3RyaW5nKGltYWdlRGVmLT5lQ29tcHJlc3Npb25Gb3JtYXQpKTsKQEAgLTQyNTgsOSArNDM0MCw5IEBACiAKICAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICAgICAgIHByaW50ZigiICAvLyBWaWRlb1xuIik7Ci0gICAgICAgICAgICBwcmludGYoIiAgbkZyYW1lV2lkdGggPSAlbGRcbiIsIHZpZGVvRGVmLT5uRnJhbWVXaWR0aCk7Ci0gICAgICAgICAgICBwcmludGYoIiAgbkZyYW1lSGVpZ2h0ID0gJWxkXG4iLCB2aWRlb0RlZi0+bkZyYW1lSGVpZ2h0KTsKLSAgICAgICAgICAgIHByaW50ZigiICBuU3RyaWRlID0gJWxkXG4iLCB2aWRlb0RlZi0+blN0cmlkZSk7CisgICAgICAgICAgICBwcmludGYoIiAgbkZyYW1lV2lkdGggPSAlIiBQUkl1MzIgIlxuIiwgdmlkZW9EZWYtPm5GcmFtZVdpZHRoKTsKKyAgICAgICAgICAgIHByaW50ZigiICBuRnJhbWVIZWlnaHQgPSAlIiBQUkl1MzIgIlxuIiwgdmlkZW9EZWYtPm5GcmFtZUhlaWdodCk7CisgICAgICAgICAgICBwcmludGYoIiAgblN0cmlkZSA9ICUiIFBSSXUzMiAiXG4iLCB2aWRlb0RlZi0+blN0cmlkZSk7CiAKICAgICAgICAgICAgIHByaW50ZigiICBlQ29tcHJlc3Npb25Gb3JtYXQgPSAlc1xuIiwKICAgICAgICAgICAgICAgICAgICB2aWRlb0NvbXByZXNzaW9uRm9ybWF0U3RyaW5nKHZpZGVvRGVmLT5lQ29tcHJlc3Npb25Gb3JtYXQpKTsKQEAgLTQyODksMTAgKzQzNzEsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtLCAmcGFyYW1zLCBzaXplb2YocGFyYW1zKSk7CiAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoZXJyLCAoc3RhdHVzX3QpT0spOwogCi0gICAgICAgICAgICAgICAgcHJpbnRmKCIgIG5TYW1wbGluZ1JhdGUgPSAlbGRcbiIsIHBhcmFtcy5uU2FtcGxpbmdSYXRlKTsKLSAgICAgICAgICAgICAgICBwcmludGYoIiAgbkNoYW5uZWxzID0gJWxkXG4iLCBwYXJhbXMubkNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBwcmludGYoIiAgblNhbXBsaW5nUmF0ZSA9ICUiIFBSSXUzMiAiXG4iLCBwYXJhbXMublNhbXBsaW5nUmF0ZSk7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIgIG5DaGFubmVscyA9ICUiIFBSSXUzMiAiXG4iLCBwYXJhbXMubkNoYW5uZWxzKTsKICAgICAgICAgICAgICAgICBwcmludGYoIiAgYkludGVybGVhdmVkID0gJWRcbiIsIHBhcmFtcy5iSW50ZXJsZWF2ZWQpOwotICAgICAgICAgICAgICAgIHByaW50ZigiICBuQml0UGVyU2FtcGxlID0gJWxkXG4iLCBwYXJhbXMubkJpdFBlclNhbXBsZSk7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIgIG5CaXRQZXJTYW1wbGUgPSAlIiBQUkl1MzIgIlxuIiwgcGFyYW1zLm5CaXRQZXJTYW1wbGUpOwogCiAgICAgICAgICAgICAgICAgcHJpbnRmKCIgIGVOdW1EYXRhID0gJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5lTnVtRGF0YSA9PSBPTVhfTnVtZXJpY2FsRGF0YVNpZ25lZApAQCAtNDMwOCw3ICs0MzkwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbUF1ZGlvQW1yLCAmYW1yLCBzaXplb2YoYW1yKSk7CiAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoZXJyLCAoc3RhdHVzX3QpT0spOwogCi0gICAgICAgICAgICAgICAgcHJpbnRmKCIgIG5DaGFubmVscyA9ICVsZFxuIiwgYW1yLm5DaGFubmVscyk7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIgIG5DaGFubmVscyA9ICUiIFBSSXUzMiAiXG4iLCBhbXIubkNoYW5uZWxzKTsKICAgICAgICAgICAgICAgICBwcmludGYoIiAgZUFNUkJhbmRNb2RlID0gJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBhbXJCYW5kTW9kZVN0cmluZyhhbXIuZUFNUkJhbmRNb2RlKSk7CiAgICAgICAgICAgICAgICAgcHJpbnRmKCIgIGVBTVJGcmFtZUZvcm1hdCA9ICVzXG4iLApAQCAtNDY2Myw2ICs0NzQ1LDggQEAKICAgICB9CiAKICAgICAvLyBDb2xvciBmb3JtYXQgcXVlcnkKKyAgICAvLyByZXR1cm4gY29sb3JzIGluIHRoZSBvcmRlciByZXBvcnRlZCBieSB0aGUgT01YIGNvbXBvbmVudAorICAgIC8vIHByZWZpeCAiZmxleGlibGUiIHN0YW5kYXJkIG9uZXMgd2l0aCB0aGUgZmxleGlibGUgZXF1aXZhbGVudAogICAgIE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSBwb3J0Rm9ybWF0OwogICAgIEluaXRPTVhQYXJhbXMoJnBvcnRGb3JtYXQpOwogICAgIHBvcnRGb3JtYXQublBvcnRJbmRleCA9ICFpc0VuY29kZXIgPyAxIDogMDsKQEAgLTQ2NzMsNiArNDc1NywyMSBAQAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQorCisgICAgICAgIE9NWF9VMzIgZmxleGlibGVFcXVpdmFsZW50OworICAgICAgICBpZiAoQUNvZGVjOjppc0ZsZXhpYmxlQ29sb3JGb3JtYXQoCisgICAgICAgICAgICAgICAgICAgIG9teCwgbm9kZSwgcG9ydEZvcm1hdC5lQ29sb3JGb3JtYXQsICZmbGV4aWJsZUVxdWl2YWxlbnQpKSB7CisgICAgICAgICAgICBib29sIG1hcmtlZCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXBzLT5tQ29sb3JGb3JtYXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGNhcHMtPm1Db2xvckZvcm1hdHMuaXRlbUF0KGkpID09IGZsZXhpYmxlRXF1aXZhbGVudCkgeworICAgICAgICAgICAgICAgICAgICBtYXJrZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1hcmtlZCkgeworICAgICAgICAgICAgICAgIGNhcHMtPm1Db2xvckZvcm1hdHMucHVzaChmbGV4aWJsZUVxdWl2YWxlbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIGNhcHMtPm1Db2xvckZvcm1hdHMucHVzaChwb3J0Rm9ybWF0LmVDb2xvckZvcm1hdCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PZ2dFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT2dnRXh0cmFjdG9yLmNwcAppbmRleCBkYTk0NTg3Li45MDBlMmIwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PZ2dFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09nZ0V4dHJhY3Rvci5jcHAKQEAgLTE1Myw3ICsxNTMsNyBAQAogICAgIHJldHVybiBtRXh0cmFjdG9yLT5tSW1wbC0+Z2V0Rm9ybWF0KCk7CiB9CiAKLXN0YXR1c190IE9nZ1NvdXJjZTo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgeworc3RhdHVzX3QgT2dnU291cmNlOjpzdGFydChNZXRhRGF0YSAqIC8qIHBhcmFtcyAqLykgewogICAgIGlmIChtU3RhcnRlZCkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQpAQCAtMzIyLDI1ICszMjIsMjkgQEAKICAgICB9CiAKICAgICBzaXplX3QgbGVmdCA9IDA7Ci0gICAgc2l6ZV90IHJpZ2h0ID0gbVRhYmxlT2ZDb250ZW50cy5zaXplKCk7Ci0gICAgd2hpbGUgKGxlZnQgPCByaWdodCkgewotICAgICAgICBzaXplX3QgY2VudGVyID0gbGVmdCAvIDIgKyByaWdodCAvIDIgKyAobGVmdCAmIHJpZ2h0ICYgMSk7CisgICAgc2l6ZV90IHJpZ2h0X3BsdXNfb25lID0gbVRhYmxlT2ZDb250ZW50cy5zaXplKCk7CisgICAgd2hpbGUgKGxlZnQgPCByaWdodF9wbHVzX29uZSkgeworICAgICAgICBzaXplX3QgY2VudGVyID0gbGVmdCArIChyaWdodF9wbHVzX29uZSAtIGxlZnQpIC8gMjsKIAogICAgICAgICBjb25zdCBUT0NFbnRyeSAmZW50cnkgPSBtVGFibGVPZkNvbnRlbnRzLml0ZW1BdChjZW50ZXIpOwogCiAgICAgICAgIGlmICh0aW1lVXMgPCBlbnRyeS5tVGltZVVzKSB7Ci0gICAgICAgICAgICByaWdodCA9IGNlbnRlcjsKKyAgICAgICAgICAgIHJpZ2h0X3BsdXNfb25lID0gY2VudGVyOwogICAgICAgICB9IGVsc2UgaWYgKHRpbWVVcyA+IGVudHJ5Lm1UaW1lVXMpIHsKICAgICAgICAgICAgIGxlZnQgPSBjZW50ZXIgKyAxOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGVmdCA9IHJpZ2h0ID0gY2VudGVyOworICAgICAgICAgICAgbGVmdCA9IGNlbnRlcjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCisgICAgaWYgKGxlZnQgPT0gbVRhYmxlT2ZDb250ZW50cy5zaXplKCkpIHsKKyAgICAgICAgLS1sZWZ0OworICAgIH0KKwogICAgIGNvbnN0IFRPQ0VudHJ5ICZlbnRyeSA9IG1UYWJsZU9mQ29udGVudHMuaXRlbUF0KGxlZnQpOwogCi0gICAgQUxPR1YoInNlZWtpbmcgdG8gZW50cnkgJWQgLyAlZCBhdCBvZmZzZXQgJWxsZCIsCisgICAgQUxPR1YoInNlZWtpbmcgdG8gZW50cnkgJXp1IC8gJXp1IGF0IG9mZnNldCAlbGxkIiwKICAgICAgICAgIGxlZnQsIG1UYWJsZU9mQ29udGVudHMuc2l6ZSgpLCBlbnRyeS5tUGFnZU9mZnNldCk7CiAKICAgICByZXR1cm4gc2Vla1RvT2Zmc2V0KGVudHJ5Lm1QYWdlT2Zmc2V0KTsKQEAgLTM4Myw3ICszODcsNyBAQAogICAgIHNzaXplX3QgbjsKICAgICBpZiAoKG4gPSBtU291cmNlLT5yZWFkQXQob2Zmc2V0LCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKSkKICAgICAgICAgICAgIDwgKHNzaXplX3Qpc2l6ZW9mKGhlYWRlcikpIHsKLSAgICAgICAgQUxPR1YoImZhaWxlZCB0byByZWFkICVkIGJ5dGVzIGF0IG9mZnNldCAweCUwMTZsbHgsIGdvdCAlbGQgYnl0ZXMiLAorICAgICAgICBBTE9HVigiZmFpbGVkIHRvIHJlYWQgJXp1IGJ5dGVzIGF0IG9mZnNldCAweCUwMTZsbHgsIGdvdCAlemQgYnl0ZXMiLAogICAgICAgICAgICAgIHNpemVvZihoZWFkZXIpLCBvZmZzZXQsIG4pOwogCiAgICAgICAgIGlmIChuIDwgMCkgewpAQCAtNTA3LDcgKzUxMSw3IEBACiAgICAgICAgICAgICAgICAgICAgIHBhY2tldFNpemUpOwogCiAgICAgICAgICAgICBpZiAobiA8IChzc2l6ZV90KXBhY2tldFNpemUpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiZmFpbGVkIHRvIHJlYWQgJWQgYnl0ZXMgYXQgMHglMDE2bGx4LCBnb3QgJWxkIGJ5dGVzIiwKKyAgICAgICAgICAgICAgICBBTE9HVigiZmFpbGVkIHRvIHJlYWQgJXp1IGJ5dGVzIGF0IDB4JTAxNmxseCwgZ290ICV6ZCBieXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICBwYWNrZXRTaXplLCBkYXRhT2Zmc2V0LCBuKTsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgICAgICAgICB9CkBAIC01NDgsNyArNTUyLDcgQEAKICAgICAgICAgICAgICAgICBidWZmZXIgPSBOVUxMOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBBTE9HVigicmVhZFBhZ2UgcmV0dXJuZWQgJWxkIiwgbik7CisgICAgICAgICAgICBBTE9HVigicmVhZFBhZ2UgcmV0dXJuZWQgJXpkIiwgbik7CiAKICAgICAgICAgICAgIHJldHVybiBuIDwgMCA/IG4gOiAoc3RhdHVzX3QpRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICAgICAgfQpAQCAtNTkyLDcgKzU5Niw3IEBACiAgICAgaWYgKChlcnIgPSByZWFkTmV4dFBhY2tldCgmcGFja2V0KSkgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9Ci0gICAgQUxPR1YoInJlYWQgcGFja2V0IG9mIHNpemUgJWRcbiIsIHBhY2tldC0+cmFuZ2VfbGVuZ3RoKCkpOworICAgIEFMT0dWKCJyZWFkIHBhY2tldCBvZiBzaXplICV6dVxuIiwgcGFja2V0LT5yYW5nZV9sZW5ndGgoKSk7CiAgICAgZXJyID0gdmVyaWZ5SGVhZGVyKHBhY2tldCwgMSk7CiAgICAgcGFja2V0LT5yZWxlYXNlKCk7CiAgICAgcGFja2V0ID0gTlVMTDsKQEAgLTYwMyw3ICs2MDcsNyBAQAogICAgIGlmICgoZXJyID0gcmVhZE5leHRQYWNrZXQoJnBhY2tldCkpICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQotICAgIEFMT0dWKCJyZWFkIHBhY2tldCBvZiBzaXplICVkXG4iLCBwYWNrZXQtPnJhbmdlX2xlbmd0aCgpKTsKKyAgICBBTE9HVigicmVhZCBwYWNrZXQgb2Ygc2l6ZSAlenVcbiIsIHBhY2tldC0+cmFuZ2VfbGVuZ3RoKCkpOwogICAgIGVyciA9IHZlcmlmeUhlYWRlcihwYWNrZXQsIDMpOwogICAgIHBhY2tldC0+cmVsZWFzZSgpOwogICAgIHBhY2tldCA9IE5VTEw7CkBAIC02MTQsNyArNjE4LDcgQEAKICAgICBpZiAoKGVyciA9IHJlYWROZXh0UGFja2V0KCZwYWNrZXQpKSAhPSBPSykgewogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KLSAgICBBTE9HVigicmVhZCBwYWNrZXQgb2Ygc2l6ZSAlZFxuIiwgcGFja2V0LT5yYW5nZV9sZW5ndGgoKSk7CisgICAgQUxPR1YoInJlYWQgcGFja2V0IG9mIHNpemUgJXp1XG4iLCBwYWNrZXQtPnJhbmdlX2xlbmd0aCgpKTsKICAgICBlcnIgPSB2ZXJpZnlIZWFkZXIocGFja2V0LCA1KTsKICAgICBwYWNrZXQtPnJlbGVhc2UoKTsKICAgICBwYWNrZXQgPSBOVUxMOwpAQCAtODk1LDcgKzg5OSw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBBTE9HVigiZ290IGltYWdlIGRhdGEsICVkIHRyYWlsaW5nIGJ5dGVzIiwKKyAgICBBTE9HVigiZ290IGltYWdlIGRhdGEsICV6dSB0cmFpbGluZyBieXRlcyIsCiAgICAgICAgICBmbGFjU2l6ZSAtIDMyIC0gdHlwZUxlbiAtIGRlc2NMZW4gLSBkYXRhTGVuKTsKIAogICAgIGZpbGVNZXRhLT5zZXREYXRhKApAQCAtOTM2LDcgKzk0MCw3IEBACiB9CiAKIHNwPE1ldGFEYXRhPiBPZ2dFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpIHsKKyAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgewogICAgIGlmIChpbmRleCA+PSAxKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NhbXBsZUl0ZXJhdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NhbXBsZUl0ZXJhdG9yLmNwcAppbmRleCBlODUyODllLi5jNWYzNTllIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TYW1wbGVJdGVyYXRvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2FtcGxlSXRlcmF0b3IuY3BwCkBAIC0xMzgsNyArMTM4LDggQEAKICAgICB9CiAKICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgaWYgKChlcnIgPSBmaW5kU2FtcGxlVGltZShzYW1wbGVJbmRleCwgJm1DdXJyZW50U2FtcGxlVGltZSkpICE9IE9LKSB7CisgICAgaWYgKChlcnIgPSBmaW5kU2FtcGxlVGltZUFuZER1cmF0aW9uKAorICAgICAgICAgICAgc2FtcGxlSW5kZXgsICZtQ3VycmVudFNhbXBsZVRpbWUsICZtQ3VycmVudFNhbXBsZUR1cmF0aW9uKSkgIT0gT0spIHsKICAgICAgICAgQUxPR0UoImZpbmRTYW1wbGVUaW1lIHJldHVybiBlcnJvciIpOwogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KQEAgLTI5MCw4ICsyOTEsOCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgU2FtcGxlSXRlcmF0b3I6OmZpbmRTYW1wbGVUaW1lKAotICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleCwgdWludDMyX3QgKnRpbWUpIHsKK3N0YXR1c190IFNhbXBsZUl0ZXJhdG9yOjpmaW5kU2FtcGxlVGltZUFuZER1cmF0aW9uKAorICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleCwgdWludDMyX3QgKnRpbWUsIHVpbnQzMl90ICpkdXJhdGlvbikgewogICAgIGlmIChzYW1wbGVJbmRleCA+PSBtVGFibGUtPm1OdW1TYW1wbGVTaXplcykgewogICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOwogICAgIH0KQEAgLTMxNCw2ICszMTUsOCBAQAogCiAgICAgKnRpbWUgKz0gbVRhYmxlLT5nZXRDb21wb3NpdGlvblRpbWVPZmZzZXQoc2FtcGxlSW5kZXgpOwogCisgICAgKmR1cmF0aW9uID0gbVRUU0R1cmF0aW9uOworCiAgICAgcmV0dXJuIE9LOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TYW1wbGVUYWJsZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TYW1wbGVUYWJsZS5jcHAKaW5kZXggMmRlMDc3My4uMzQ3MWRlYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2FtcGxlVGFibGUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NhbXBsZVRhYmxlLmNwcApAQCAtMTQsOSArMTQsNiBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2RlZmluZSBfX1NURElOVF9NQUNST1MKLSNkZWZpbmUgX19TVERJTlRfTElNSVRTCi0KICNkZWZpbmUgTE9HX1RBRyAiU2FtcGxlVGFibGUiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CkBAIC02NzAsNyArNjY3LDggQEAKIH0KIAogc3RhdHVzX3QgU2FtcGxlVGFibGU6OmZpbmRTYW1wbGVBdFRpbWUoCi0gICAgICAgIHVpbnQzMl90IHJlcV90aW1lLCB1aW50MzJfdCAqc2FtcGxlX2luZGV4LCB1aW50MzJfdCBmbGFncykgeworICAgICAgICB1aW50NjRfdCByZXFfdGltZSwgdWludDY0X3Qgc2NhbGVfbnVtLCB1aW50NjRfdCBzY2FsZV9kZW4sCisgICAgICAgIHVpbnQzMl90ICpzYW1wbGVfaW5kZXgsIHVpbnQzMl90IGZsYWdzKSB7CiAgICAgYnVpbGRTYW1wbGVFbnRyaWVzVGFibGUoKTsKIAogICAgIGlmIChtU2FtcGxlVGltZUVudHJpZXMgPT0gTlVMTCkgewpAQCAtNjc4LDc5ICs2NzYsNjcgQEAKICAgICB9CiAKICAgICB1aW50MzJfdCBsZWZ0ID0gMDsKLSAgICB1aW50MzJfdCByaWdodCA9IG1OdW1TYW1wbGVTaXplczsKLSAgICB3aGlsZSAobGVmdCA8IHJpZ2h0KSB7Ci0gICAgICAgIHVpbnQzMl90IGNlbnRlciA9IChsZWZ0ICsgcmlnaHQpIC8gMjsKLSAgICAgICAgdWludDMyX3QgY2VudGVyVGltZSA9IG1TYW1wbGVUaW1lRW50cmllc1tjZW50ZXJdLm1Db21wb3NpdGlvblRpbWU7CisgICAgdWludDMyX3QgcmlnaHRfcGx1c19vbmUgPSBtTnVtU2FtcGxlU2l6ZXM7CisgICAgd2hpbGUgKGxlZnQgPCByaWdodF9wbHVzX29uZSkgeworICAgICAgICB1aW50MzJfdCBjZW50ZXIgPSBsZWZ0ICsgKHJpZ2h0X3BsdXNfb25lIC0gbGVmdCkgLyAyOworICAgICAgICB1aW50NjRfdCBjZW50ZXJUaW1lID0KKyAgICAgICAgICAgIGdldFNhbXBsZVRpbWUoY2VudGVyLCBzY2FsZV9udW0sIHNjYWxlX2Rlbik7CiAKICAgICAgICAgaWYgKHJlcV90aW1lIDwgY2VudGVyVGltZSkgewotICAgICAgICAgICAgcmlnaHQgPSBjZW50ZXI7CisgICAgICAgICAgICByaWdodF9wbHVzX29uZSA9IGNlbnRlcjsKICAgICAgICAgfSBlbHNlIGlmIChyZXFfdGltZSA+IGNlbnRlclRpbWUpIHsKICAgICAgICAgICAgIGxlZnQgPSBjZW50ZXIgKyAxOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGVmdCA9IGNlbnRlcjsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgKnNhbXBsZV9pbmRleCA9IG1TYW1wbGVUaW1lRW50cmllc1tjZW50ZXJdLm1TYW1wbGVJbmRleDsKKyAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChsZWZ0ID09IG1OdW1TYW1wbGVTaXplcykgewotICAgICAgICBpZiAoZmxhZ3MgPT0ga0ZsYWdBZnRlcikgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKLSAgICAgICAgfQotCi0gICAgICAgIC0tbGVmdDsKLSAgICB9Ci0KICAgICB1aW50MzJfdCBjbG9zZXN0SW5kZXggPSBsZWZ0OwogCisgICAgaWYgKGNsb3Nlc3RJbmRleCA9PSBtTnVtU2FtcGxlU2l6ZXMpIHsKKyAgICAgICAgaWYgKGZsYWdzID09IGtGbGFnQWZ0ZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CisgICAgICAgIH0KKyAgICAgICAgZmxhZ3MgPSBrRmxhZ0JlZm9yZTsKKyAgICB9IGVsc2UgaWYgKGNsb3Nlc3RJbmRleCA9PSAwKSB7CisgICAgICAgIGlmIChmbGFncyA9PSBrRmxhZ0JlZm9yZSkgeworICAgICAgICAgICAgLy8gbm9ybWFsbHkgd2Ugc2hvdWxkIHJldHVybiBvdXQgb2YgcmFuZ2UsIGJ1dCB0aGF0IGlzCisgICAgICAgICAgICAvLyB0cmVhdGVkIGFzIGVuZC1vZi1zdHJlYW0uICBpbnN0ZWFkIHJldHVybiBmaXJzdCBzYW1wbGUKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOworICAgICAgICB9CisgICAgICAgIGZsYWdzID0ga0ZsYWdBZnRlcjsKKyAgICB9CisKICAgICBzd2l0Y2ggKGZsYWdzKSB7CiAgICAgICAgIGNhc2Uga0ZsYWdCZWZvcmU6CiAgICAgICAgIHsKLSAgICAgICAgICAgIHdoaWxlIChjbG9zZXN0SW5kZXggPiAwCi0gICAgICAgICAgICAgICAgICAgICYmIG1TYW1wbGVUaW1lRW50cmllc1tjbG9zZXN0SW5kZXhdLm1Db21wb3NpdGlvblRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA+IHJlcV90aW1lKSB7Ci0gICAgICAgICAgICAgICAgLS1jbG9zZXN0SW5kZXg7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICAtLWNsb3Nlc3RJbmRleDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBrRmxhZ0FmdGVyOgogICAgICAgICB7Ci0gICAgICAgICAgICB3aGlsZSAoY2xvc2VzdEluZGV4ICsgMSA8IG1OdW1TYW1wbGVTaXplcwotICAgICAgICAgICAgICAgICAgICAmJiBtU2FtcGxlVGltZUVudHJpZXNbY2xvc2VzdEluZGV4XS5tQ29tcG9zaXRpb25UaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCByZXFfdGltZSkgewotICAgICAgICAgICAgICAgICsrY2xvc2VzdEluZGV4OwotICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBkZWZhdWx0OgogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDSyhmbGFncyA9PSBrRmxhZ0Nsb3Nlc3QpOwotCi0gICAgICAgICAgICBpZiAoY2xvc2VzdEluZGV4ID4gMCkgewotICAgICAgICAgICAgICAgIC8vIENoZWNrIGxlZnQgbmVpZ2hib3VyIGFuZCBwaWNrIGNsb3Nlc3QuCi0gICAgICAgICAgICAgICAgdWludDMyX3QgYWJzZGlmZjEgPQotICAgICAgICAgICAgICAgICAgICBhYnNfZGlmZmVyZW5jZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlVGltZUVudHJpZXNbY2xvc2VzdEluZGV4XS5tQ29tcG9zaXRpb25UaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcV90aW1lKTsKLQotICAgICAgICAgICAgICAgIHVpbnQzMl90IGFic2RpZmYyID0KLSAgICAgICAgICAgICAgICAgICAgYWJzX2RpZmZlcmVuY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVRpbWVFbnRyaWVzW2Nsb3Nlc3RJbmRleCAtIDFdLm1Db21wb3NpdGlvblRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxX3RpbWUpOwotCi0gICAgICAgICAgICAgICAgaWYgKGFic2RpZmYxID4gYWJzZGlmZjIpIHsKLSAgICAgICAgICAgICAgICAgICAgY2xvc2VzdEluZGV4ID0gY2xvc2VzdEluZGV4IC0gMTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBwaWNrIGNsb3Nlc3QgYmFzZWQgb24gdGltZXN0YW1wLiB1c2UgYWJzX2RpZmZlcmVuY2UgZm9yIHNhZmV0eQorICAgICAgICAgICAgaWYgKGFic19kaWZmZXJlbmNlKAorICAgICAgICAgICAgICAgICAgICBnZXRTYW1wbGVUaW1lKGNsb3Nlc3RJbmRleCwgc2NhbGVfbnVtLCBzY2FsZV9kZW4pLCByZXFfdGltZSkgPgorICAgICAgICAgICAgICAgIGFic19kaWZmZXJlbmNlKAorICAgICAgICAgICAgICAgICAgICByZXFfdGltZSwgZ2V0U2FtcGxlVGltZShjbG9zZXN0SW5kZXggLSAxLCBzY2FsZV9udW0sIHNjYWxlX2RlbikpKSB7CisgICAgICAgICAgICAgICAgLS1jbG9zZXN0SW5kZXg7CiAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCiAgICAgKnNhbXBsZV9pbmRleCA9IG1TYW1wbGVUaW1lRW50cmllc1tjbG9zZXN0SW5kZXhdLm1TYW1wbGVJbmRleDsKLQogICAgIHJldHVybiBPSzsKIH0KIApAQCAtNzcyLDEwOSArNzU4LDg1IEBACiAgICAgfQogCiAgICAgdWludDMyX3QgbGVmdCA9IDA7Ci0gICAgdWludDMyX3QgcmlnaHQgPSBtTnVtU3luY1NhbXBsZXM7Ci0gICAgd2hpbGUgKGxlZnQgPCByaWdodCkgewotICAgICAgICB1aW50MzJfdCBjZW50ZXIgPSBsZWZ0ICsgKHJpZ2h0IC0gbGVmdCkgLyAyOworICAgIHVpbnQzMl90IHJpZ2h0X3BsdXNfb25lID0gbU51bVN5bmNTYW1wbGVzOworICAgIHdoaWxlIChsZWZ0IDwgcmlnaHRfcGx1c19vbmUpIHsKKyAgICAgICAgdWludDMyX3QgY2VudGVyID0gbGVmdCArIChyaWdodF9wbHVzX29uZSAtIGxlZnQpIC8gMjsKICAgICAgICAgdWludDMyX3QgeCA9IG1TeW5jU2FtcGxlc1tjZW50ZXJdOwogCiAgICAgICAgIGlmIChzdGFydF9zYW1wbGVfaW5kZXggPCB4KSB7Ci0gICAgICAgICAgICByaWdodCA9IGNlbnRlcjsKKyAgICAgICAgICAgIHJpZ2h0X3BsdXNfb25lID0gY2VudGVyOwogICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0X3NhbXBsZV9pbmRleCA+IHgpIHsKICAgICAgICAgICAgIGxlZnQgPSBjZW50ZXIgKyAxOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGVmdCA9IGNlbnRlcjsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgKnNhbXBsZV9pbmRleCA9IHg7CisgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0KICAgICB9CisKICAgICBpZiAobGVmdCA9PSBtTnVtU3luY1NhbXBsZXMpIHsKICAgICAgICAgaWYgKGZsYWdzID09IGtGbGFnQWZ0ZXIpIHsKICAgICAgICAgICAgIEFMT0dFKCJ0cmllZCB0byBmaW5kIGEgc3luYyBmcmFtZSBhZnRlciB0aGUgbGFzdCBvbmU6ICVkIiwgbGVmdCk7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOwogICAgICAgICB9Ci0gICAgICAgIGxlZnQgPSBsZWZ0IC0gMTsKKyAgICAgICAgZmxhZ3MgPSBrRmxhZ0JlZm9yZTsKKyAgICB9CisgICAgZWxzZSBpZiAobGVmdCA9PSAwKSB7CisgICAgICAgIGlmIChmbGFncyA9PSBrRmxhZ0JlZm9yZSkgeworICAgICAgICAgICAgQUxPR0UoInRyaWVkIHRvIGZpbmQgYSBzeW5jIGZyYW1lIGJlZm9yZSB0aGUgZmlyc3Qgb25lOiAlZCIsIGxlZnQpOworCisgICAgICAgICAgICAvLyBub3JtYWxseSB3ZSBzaG91bGQgcmV0dXJuIG91dCBvZiByYW5nZSwgYnV0IHRoYXQgaXMKKyAgICAgICAgICAgIC8vIHRyZWF0ZWQgYXMgZW5kLW9mLXN0cmVhbS4gIGluc3RlYWQgc2VlayB0byBmaXJzdCBzeW5jCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKKyAgICAgICAgfQorICAgICAgICBmbGFncyA9IGtGbGFnQWZ0ZXI7CiAgICAgfQogCi0gICAgLy8gTm93IHNzaVtsZWZ0XSBpcyB0aGUgc3luYyBzYW1wbGUgaW5kZXgganVzdCBiZWZvcmUgKG9yIGF0KQotICAgIC8vIHN0YXJ0X3NhbXBsZV9pbmRleC4KLSAgICAvLyBBbHNvIHN0YXJ0X3NhbXBsZV9pbmRleCA8IHNzaVtsZWZ0ICsgMV0sIGlmIGxlZnQgKyAxIDwgbU51bVN5bmNTYW1wbGVzLgotCi0gICAgdWludDMyX3QgeCA9IG1TeW5jU2FtcGxlc1tsZWZ0XTsKLQotICAgIGlmIChsZWZ0ICsgMSA8IG1OdW1TeW5jU2FtcGxlcykgewotICAgICAgICB1aW50MzJfdCB5ID0gbVN5bmNTYW1wbGVzW2xlZnQgKyAxXTsKLQotICAgICAgICAvLyBvdXIgc2FtcGxlIGxpZXMgYmV0d2VlbiBzeW5jIHNhbXBsZXMgeCBhbmQgeS4KLQotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU2FtcGxlSXRlcmF0b3ItPnNlZWtUbyhzdGFydF9zYW1wbGVfaW5kZXgpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgdWludDMyX3Qgc2FtcGxlX3RpbWUgPSBtU2FtcGxlSXRlcmF0b3ItPmdldFNhbXBsZVRpbWUoKTsKLQotICAgICAgICBlcnIgPSBtU2FtcGxlSXRlcmF0b3ItPnNlZWtUbyh4KTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICB1aW50MzJfdCB4X3RpbWUgPSBtU2FtcGxlSXRlcmF0b3ItPmdldFNhbXBsZVRpbWUoKTsKLQotICAgICAgICBlcnIgPSBtU2FtcGxlSXRlcmF0b3ItPnNlZWtUbyh5KTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIHVpbnQzMl90IHlfdGltZSA9IG1TYW1wbGVJdGVyYXRvci0+Z2V0U2FtcGxlVGltZSgpOwotCi0gICAgICAgIGlmIChhYnNfZGlmZmVyZW5jZSh4X3RpbWUsIHNhbXBsZV90aW1lKQotICAgICAgICAgICAgICAgID4gYWJzX2RpZmZlcmVuY2UoeV90aW1lLCBzYW1wbGVfdGltZSkpIHsKLSAgICAgICAgICAgIC8vIFBpY2sgdGhlIHN5bmMgc2FtcGxlIGNsb3Nlc3QgKHRpbWV3aXNlKSB0byB0aGUgc3RhcnQtc2FtcGxlLgotICAgICAgICAgICAgeCA9IHk7Ci0gICAgICAgICAgICArK2xlZnQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KKyAgICAvLyBOb3cgc3NpW2xlZnQgLSAxXSA8KD0pIHN0YXJ0X3NhbXBsZV9pbmRleCA8PSBzc2lbbGVmdF0KICAgICBzd2l0Y2ggKGZsYWdzKSB7CiAgICAgICAgIGNhc2Uga0ZsYWdCZWZvcmU6CiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICh4ID4gc3RhcnRfc2FtcGxlX2luZGV4KSB7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobGVmdCA+IDApOwotCi0gICAgICAgICAgICAgICAgeCA9IG1TeW5jU2FtcGxlc1tsZWZ0IC0gMV07Ci0KLSAgICAgICAgICAgICAgICBpZiAoeCA+IHN0YXJ0X3NhbXBsZV9pbmRleCkgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGUgdGFibGUgb2Ygc3luYyBzYW1wbGUgaW5kaWNlcyB3YXMgbm90IHNvcnRlZAotICAgICAgICAgICAgICAgICAgICAvLyBwcm9wZXJseS4KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICAtLWxlZnQ7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotCiAgICAgICAgIGNhc2Uga0ZsYWdBZnRlcjoKICAgICAgICAgewotICAgICAgICAgICAgaWYgKHggPCBzdGFydF9zYW1wbGVfaW5kZXgpIHsKLSAgICAgICAgICAgICAgICBpZiAobGVmdCArIDEgPj0gbU51bVN5bmNTYW1wbGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgeCA9IG1TeW5jU2FtcGxlc1tsZWZ0ICsgMV07Ci0KLSAgICAgICAgICAgICAgICBpZiAoeCA8IHN0YXJ0X3NhbXBsZV9pbmRleCkgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGUgdGFibGUgb2Ygc3luYyBzYW1wbGUgaW5kaWNlcyB3YXMgbm90IHNvcnRlZAotICAgICAgICAgICAgICAgICAgICAvLyBwcm9wZXJseS4KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0KICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgLy8gdGhpcyByb3V0ZSBpcyBub3QgdXNlZCwgYnV0IGltcGxlbWVudCBpdCBub25ldGhlbGVzcworICAgICAgICAgICAgQ0hFQ0soZmxhZ3MgPT0ga0ZsYWdDbG9zZXN0KTsKKworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNhbXBsZUl0ZXJhdG9yLT5zZWVrVG8oc3RhcnRfc2FtcGxlX2luZGV4KTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlX3RpbWUgPSBtU2FtcGxlSXRlcmF0b3ItPmdldFNhbXBsZVRpbWUoKTsKKworICAgICAgICAgICAgZXJyID0gbVNhbXBsZUl0ZXJhdG9yLT5zZWVrVG8obVN5bmNTYW1wbGVzW2xlZnRdKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWludDMyX3QgdXBwZXJfdGltZSA9IG1TYW1wbGVJdGVyYXRvci0+Z2V0U2FtcGxlVGltZSgpOworCisgICAgICAgICAgICBlcnIgPSBtU2FtcGxlSXRlcmF0b3ItPnNlZWtUbyhtU3luY1NhbXBsZXNbbGVmdCAtIDFdKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWludDMyX3QgbG93ZXJfdGltZSA9IG1TYW1wbGVJdGVyYXRvci0+Z2V0U2FtcGxlVGltZSgpOworCisgICAgICAgICAgICAvLyB1c2UgYWJzX2RpZmZlcmVuY2UgZm9yIHNhZmV0eQorICAgICAgICAgICAgaWYgKGFic19kaWZmZXJlbmNlKHVwcGVyX3RpbWUsIHNhbXBsZV90aW1lKSA+CisgICAgICAgICAgICAgICAgYWJzX2RpZmZlcmVuY2Uoc2FtcGxlX3RpbWUsIGxvd2VyX3RpbWUpKSB7CisgICAgICAgICAgICAgICAgLS1sZWZ0OworICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICB9CiAKLSAgICAqc2FtcGxlX2luZGV4ID0geDsKLQorICAgICpzYW1wbGVfaW5kZXggPSBtU3luY1NhbXBsZXNbbGVmdF07CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC05MzIsNyArODk0LDggQEAKICAgICAgICAgb2ZmNjRfdCAqb2Zmc2V0LAogICAgICAgICBzaXplX3QgKnNpemUsCiAgICAgICAgIHVpbnQzMl90ICpjb21wb3NpdGlvblRpbWUsCi0gICAgICAgIGJvb2wgKmlzU3luY1NhbXBsZSkgeworICAgICAgICBib29sICppc1N5bmNTYW1wbGUsCisgICAgICAgIHVpbnQzMl90ICpzYW1wbGVEdXJhdGlvbikgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBzdGF0dXNfdCBlcnI7CkBAIC05NzQsNiArOTM3LDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpZiAoc2FtcGxlRHVyYXRpb24pIHsKKyAgICAgICAgKnNhbXBsZUR1cmF0aW9uID0gbVNhbXBsZUl0ZXJhdG9yLT5nZXRTYW1wbGVEdXJhdGlvbigpOworICAgIH0KKwogICAgIHJldHVybiBPSzsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2tpcEN1dEJ1ZmZlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9Ta2lwQ3V0QnVmZmVyLmNwcAppbmRleCA0ZDE1ZDdlLi4xZGExZTVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9Ta2lwQ3V0QnVmZmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9Ta2lwQ3V0QnVmZmVyLmNwcApAQCAtMzIsNyArMzIsNyBAQAogICAgICAgICBjdXQgPSAwOwogICAgIH0KIAotICAgIG1Gcm9udFBhZGRpbmcgPSBza2lwOworICAgIG1Gcm9udFBhZGRpbmcgPSBtU2tpcCA9IHNraXA7CiAgICAgbUJhY2tQYWRkaW5nID0gY3V0OwogICAgIG1Xcml0ZUhlYWQgPSAwOwogICAgIG1SZWFkSGVhZCA9IDA7CkBAIC0xMDEsNiArMTAxLDcgQEAKIAogdm9pZCBTa2lwQ3V0QnVmZmVyOjpjbGVhcigpIHsKICAgICBtV3JpdGVIZWFkID0gbVJlYWRIZWFkID0gMDsKKyAgICBtRnJvbnRQYWRkaW5nID0gbVNraXA7CiB9CiAKIHZvaWQgU2tpcEN1dEJ1ZmZlcjo6d3JpdGUoY29uc3QgY2hhciAqc3JjLCBzaXplX3QgbnVtKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5jcHAKaW5kZXggYWY4MTg2Yy4uNDQ0OWQ1NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmNwcApAQCAtMjQsNiArMjQsNyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuaD4KIAorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5oPgogI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvVmlkZW9GcmFtZS5oPgogCkBAIC0xMTcsNyArMTE4LDcgQEAKIH0KIAogTWVkaWFTY2FuUmVzdWx0IFN0YWdlZnJpZ2h0TWVkaWFTY2FubmVyOjpwcm9jZXNzRmlsZUludGVybmFsKAotICAgICAgICBjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICptaW1lVHlwZSwKKyAgICAgICAgY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqIC8qIG1pbWVUeXBlICovLAogICAgICAgICBNZWRpYVNjYW5uZXJDbGllbnQgJmNsaWVudCkgewogICAgIGNvbnN0IGNoYXIgKmV4dGVuc2lvbiA9IHN0cnJjaHIocGF0aCwgJy4nKTsKIApAQCAtMTQ3LDcgKzE0OCw3IEBACiAgICAgc3RhdHVzX3Qgc3RhdHVzOwogICAgIGlmIChmZCA8IDApIHsKICAgICAgICAgLy8gY291bGRuJ3Qgb3BlbiBpdCBsb2NhbGx5LCBtYXliZSB0aGUgbWVkaWEgc2VydmVyIGNhbj8KLSAgICAgICAgc3RhdHVzID0gbVJldHJpZXZlci0+c2V0RGF0YVNvdXJjZShwYXRoKTsKKyAgICAgICAgc3RhdHVzID0gbVJldHJpZXZlci0+c2V0RGF0YVNvdXJjZShOVUxMIC8qIGh0dHBTZXJ2aWNlICovLCBwYXRoKTsKICAgICB9IGVsc2UgewogICAgICAgICBzdGF0dXMgPSBtUmV0cmlldmVyLT5zZXREYXRhU291cmNlKGZkLCAwLCAweDdmZmZmZmZmZmZmZmZmZkwpOwogICAgICAgICBjbG9zZShmZCk7CkBAIC0yMDIsNyArMjAzLDcgQEAKICAgICByZXR1cm4gTUVESUFfU0NBTl9SRVNVTFRfT0s7CiB9CiAKLWNoYXIgKlN0YWdlZnJpZ2h0TWVkaWFTY2FubmVyOjpleHRyYWN0QWxidW1BcnQoaW50IGZkKSB7CitNZWRpYUFsYnVtQXJ0ICpTdGFnZWZyaWdodE1lZGlhU2Nhbm5lcjo6ZXh0cmFjdEFsYnVtQXJ0KGludCBmZCkgewogICAgIEFMT0dWKCJleHRyYWN0QWxidW1BcnQgJWQiLCBmZCk7CiAKICAgICBvZmY2NF90IHNpemUgPSBsc2VlazY0KGZkLCAwLCBTRUVLX0VORCk7CkBAIC0yMTQsMTUgKzIxNSw5IEBACiAgICAgc3A8TWVkaWFNZXRhZGF0YVJldHJpZXZlcj4gbVJldHJpZXZlcihuZXcgTWVkaWFNZXRhZGF0YVJldHJpZXZlcik7CiAgICAgaWYgKG1SZXRyaWV2ZXItPnNldERhdGFTb3VyY2UoZmQsIDAsIHNpemUpID09IE9LKSB7CiAgICAgICAgIHNwPElNZW1vcnk+IG1lbSA9IG1SZXRyaWV2ZXItPmV4dHJhY3RBbGJ1bUFydCgpOwotCiAgICAgICAgIGlmIChtZW0gIT0gTlVMTCkgewogICAgICAgICAgICAgTWVkaWFBbGJ1bUFydCAqYXJ0ID0gc3RhdGljX2Nhc3Q8TWVkaWFBbGJ1bUFydCAqPihtZW0tPnBvaW50ZXIoKSk7Ci0KLSAgICAgICAgICAgIGNoYXIgKmRhdGEgPSAoY2hhciAqKW1hbGxvYyhhcnQtPm1TaXplICsgNCk7Ci0gICAgICAgICAgICAqKGludDMyX3QgKilkYXRhID0gYXJ0LT5tU2l6ZTsKLSAgICAgICAgICAgIG1lbWNweSgmZGF0YVs0XSwgJmFydFsxXSwgYXJ0LT5tU2l6ZSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBkYXRhOworICAgICAgICAgICAgcmV0dXJuIGFydC0+Y2xvbmUoKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcAppbmRleCAxOWFmNGZiLi4xMDFmYzhhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcApAQCAtMTYsMTAgKzE2LDE0IEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlciIKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgImluY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oIgogCisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgpAQCAtMjgsNiArMzIsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNTAsNyArNTUsOSBAQAogfQogCiBzdGF0dXNfdCBTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyOjpzZXREYXRhU291cmNlKAotICAgICAgICBjb25zdCBjaGFyICp1cmksIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKICAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglcykiLCB1cmkpOwogCiAgICAgbVBhcnNlZE1ldGFEYXRhID0gZmFsc2U7CkBAIC01OCw3ICs2NSw3IEBACiAgICAgZGVsZXRlIG1BbGJ1bUFydDsKICAgICBtQWxidW1BcnQgPSBOVUxMOwogCi0gICAgbVNvdXJjZSA9IERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkodXJpLCBoZWFkZXJzKTsKKyAgICBtU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSShodHRwU2VydmljZSwgdXJpLCBoZWFkZXJzKTsKIAogICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBjcmVhdGUgZGF0YSBzb3VyY2UgZm9yICclcycuIiwgdXJpKTsKQEAgLTgzLDcgKzkwLDcgQEAKICAgICAgICAgaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpIHsKICAgICBmZCA9IGR1cChmZCk7CiAKLSAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglZCwgJWxsZCwgJWxsZCkiLCBmZCwgb2Zmc2V0LCBsZW5ndGgpOworICAgIEFMT0dWKCJzZXREYXRhU291cmNlKCVkLCAlIiBQUklkNjQgIiwgJSIgUFJJZDY0ICIpIiwgZmQsIG9mZnNldCwgbGVuZ3RoKTsKIAogICAgIG1QYXJzZWRNZXRhRGF0YSA9IGZhbHNlOwogICAgIG1NZXRhRGF0YS5jbGVhcigpOwpAQCAtMjM4LDcgKzI0NSw3IEBACiAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lOwogICAgICAgICAgICAgQ0hFQ0sodHJhY2tNZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CiAKLSAgICAgICAgICAgIEFMT0dWKCJ0aHVtYk5haWxUaW1lID0gJWxsZCB1cywgdGltZVVzID0gJWxsZCB1cywgbWltZSA9ICVzIiwKKyAgICAgICAgICAgIEFMT0dWKCJ0aHVtYk5haWxUaW1lID0gJSIgUFJJZDY0ICIgdXMsIHRpbWVVcyA9ICUiIFBSSWQ2NCAiIHVzLCBtaW1lID0gJXMiLAogICAgICAgICAgICAgICAgICB0aHVtYk5haWxUaW1lLCB0aW1lVXMsIG1pbWUpOwogICAgICAgICB9CiAgICAgfQpAQCAtMzIxLDcgKzMyOCw3IEBACiBWaWRlb0ZyYW1lICpTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyOjpnZXRGcmFtZUF0VGltZSgKICAgICAgICAgaW50NjRfdCB0aW1lVXMsIGludCBvcHRpb24pIHsKIAotICAgIEFMT0dWKCJnZXRGcmFtZUF0VGltZTogJWxsZCB1cyBvcHRpb246ICVkIiwgdGltZVVzLCBvcHRpb24pOworICAgIEFMT0dWKCJnZXRGcmFtZUF0VGltZTogJSIgUFJJZDY0ICIgdXMgb3B0aW9uOiAlZCIsIHRpbWVVcywgb3B0aW9uKTsKIAogICAgIGlmIChtRXh0cmFjdG9yLmdldCgpID09IE5VTEwpIHsKICAgICAgICAgQUxPR1YoIm5vIGV4dHJhY3Rvci4iKTsKQEAgLTM3NCwxMCArMzgxLDcgQEAKICAgICBzaXplX3QgZGF0YVNpemU7CiAgICAgaWYgKGZpbGVNZXRhLT5maW5kRGF0YShrS2V5QWxidW1BcnQsICZ0eXBlLCAmZGF0YSwgJmRhdGFTaXplKQogICAgICAgICAgICAgJiYgbUFsYnVtQXJ0ID09IE5VTEwpIHsKLSAgICAgICAgbUFsYnVtQXJ0ID0gbmV3IE1lZGlhQWxidW1BcnQ7Ci0gICAgICAgIG1BbGJ1bUFydC0+bVNpemUgPSBkYXRhU2l6ZTsKLSAgICAgICAgbUFsYnVtQXJ0LT5tRGF0YSA9IG5ldyB1aW50OF90W2RhdGFTaXplXTsKLSAgICAgICAgbWVtY3B5KG1BbGJ1bUFydC0+bURhdGEsIGRhdGEsIGRhdGFTaXplKTsKKyAgICAgICAgbUFsYnVtQXJ0ID0gTWVkaWFBbGJ1bUFydDo6ZnJvbURhdGEoZGF0YVNpemUsIGRhdGEpOwogICAgIH0KIAogICAgIFZpZGVvRnJhbWUgKmZyYW1lID0KQEAgLTQxMCw3ICs0MTQsNyBAQAogICAgIH0KIAogICAgIGlmIChtQWxidW1BcnQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUFsYnVtQXJ0KCptQWxidW1BcnQpOworICAgICAgICByZXR1cm4gbUFsYnVtQXJ0LT5jbG9uZSgpOwogICAgIH0KIAogICAgIHJldHVybiBOVUxMOwpAQCAtNDQ3LDQ4ICs0NTEsNzEgQEAKICAgICBzdHJ1Y3QgTWFwIHsKICAgICAgICAgaW50IGZyb207CiAgICAgICAgIGludCB0bzsKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZTsKICAgICB9OwogICAgIHN0YXRpYyBjb25zdCBNYXAga01hcFtdID0gewotICAgICAgICB7IGtLZXlNSU1FVHlwZSwgTUVUQURBVEFfS0VZX01JTUVUWVBFIH0sCi0gICAgICAgIHsga0tleUNEVHJhY2tOdW1iZXIsIE1FVEFEQVRBX0tFWV9DRF9UUkFDS19OVU1CRVIgfSwKLSAgICAgICAgeyBrS2V5RGlzY051bWJlciwgTUVUQURBVEFfS0VZX0RJU0NfTlVNQkVSIH0sCi0gICAgICAgIHsga0tleUFsYnVtLCBNRVRBREFUQV9LRVlfQUxCVU0gfSwKLSAgICAgICAgeyBrS2V5QXJ0aXN0LCBNRVRBREFUQV9LRVlfQVJUSVNUIH0sCi0gICAgICAgIHsga0tleUFsYnVtQXJ0aXN0LCBNRVRBREFUQV9LRVlfQUxCVU1BUlRJU1QgfSwKLSAgICAgICAgeyBrS2V5QXV0aG9yLCBNRVRBREFUQV9LRVlfQVVUSE9SIH0sCi0gICAgICAgIHsga0tleUNvbXBvc2VyLCBNRVRBREFUQV9LRVlfQ09NUE9TRVIgfSwKLSAgICAgICAgeyBrS2V5RGF0ZSwgTUVUQURBVEFfS0VZX0RBVEUgfSwKLSAgICAgICAgeyBrS2V5R2VucmUsIE1FVEFEQVRBX0tFWV9HRU5SRSB9LAotICAgICAgICB7IGtLZXlUaXRsZSwgTUVUQURBVEFfS0VZX1RJVExFIH0sCi0gICAgICAgIHsga0tleVllYXIsIE1FVEFEQVRBX0tFWV9ZRUFSIH0sCi0gICAgICAgIHsga0tleVdyaXRlciwgTUVUQURBVEFfS0VZX1dSSVRFUiB9LAotICAgICAgICB7IGtLZXlDb21waWxhdGlvbiwgTUVUQURBVEFfS0VZX0NPTVBJTEFUSU9OIH0sCi0gICAgICAgIHsga0tleUxvY2F0aW9uLCBNRVRBREFUQV9LRVlfTE9DQVRJT04gfSwKKyAgICAgICAgeyBrS2V5TUlNRVR5cGUsIE1FVEFEQVRBX0tFWV9NSU1FVFlQRSwgTlVMTCB9LAorICAgICAgICB7IGtLZXlDRFRyYWNrTnVtYmVyLCBNRVRBREFUQV9LRVlfQ0RfVFJBQ0tfTlVNQkVSLCAidHJhY2tudW1iZXIiIH0sCisgICAgICAgIHsga0tleURpc2NOdW1iZXIsIE1FVEFEQVRBX0tFWV9ESVNDX05VTUJFUiwgImRpc2NudW1iZXIiIH0sCisgICAgICAgIHsga0tleUFsYnVtLCBNRVRBREFUQV9LRVlfQUxCVU0sICJhbGJ1bSIgfSwKKyAgICAgICAgeyBrS2V5QXJ0aXN0LCBNRVRBREFUQV9LRVlfQVJUSVNULCAiYXJ0aXN0IiB9LAorICAgICAgICB7IGtLZXlBbGJ1bUFydGlzdCwgTUVUQURBVEFfS0VZX0FMQlVNQVJUSVNULCAiYWxidW1hcnRpc3QiIH0sCisgICAgICAgIHsga0tleUF1dGhvciwgTUVUQURBVEFfS0VZX0FVVEhPUiwgTlVMTCB9LAorICAgICAgICB7IGtLZXlDb21wb3NlciwgTUVUQURBVEFfS0VZX0NPTVBPU0VSLCAiY29tcG9zZXIiIH0sCisgICAgICAgIHsga0tleURhdGUsIE1FVEFEQVRBX0tFWV9EQVRFLCBOVUxMIH0sCisgICAgICAgIHsga0tleUdlbnJlLCBNRVRBREFUQV9LRVlfR0VOUkUsICJnZW5yZSIgfSwKKyAgICAgICAgeyBrS2V5VGl0bGUsIE1FVEFEQVRBX0tFWV9USVRMRSwgInRpdGxlIiB9LAorICAgICAgICB7IGtLZXlZZWFyLCBNRVRBREFUQV9LRVlfWUVBUiwgInllYXIiIH0sCisgICAgICAgIHsga0tleVdyaXRlciwgTUVUQURBVEFfS0VZX1dSSVRFUiwgIndyaXRlciIgfSwKKyAgICAgICAgeyBrS2V5Q29tcGlsYXRpb24sIE1FVEFEQVRBX0tFWV9DT01QSUxBVElPTiwgImNvbXBpbGF0aW9uIiB9LAorICAgICAgICB7IGtLZXlMb2NhdGlvbiwgTUVUQURBVEFfS0VZX0xPQ0FUSU9OLCBOVUxMIH0sCiAgICAgfTsKKwogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga051bU1hcEVudHJpZXMgPSBzaXplb2Yoa01hcCkgLyBzaXplb2Yoa01hcFswXSk7CiAKKyAgICBDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yICpkZXRlY3RvciA9IG5ldyBDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yKCk7CisKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1NYXBFbnRyaWVzOyArK2kpIHsKICAgICAgICAgY29uc3QgY2hhciAqdmFsdWU7CiAgICAgICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrTWFwW2ldLmZyb20sICZ2YWx1ZSkpIHsKLSAgICAgICAgICAgIG1NZXRhRGF0YS5hZGQoa01hcFtpXS50bywgU3RyaW5nOCh2YWx1ZSkpOworICAgICAgICAgICAgaWYgKGtNYXBbaV0ubmFtZSkgeworICAgICAgICAgICAgICAgIC8vIGFkZCB0byBjaGFyc2V0IGRldGVjdG9yCisgICAgICAgICAgICAgICAgZGV0ZWN0b3ItPmFkZFRhZyhrTWFwW2ldLm5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gZGlyZWN0bHkgYWRkIHRvIG91dHB1dCBsaXN0CisgICAgICAgICAgICAgICAgbU1ldGFEYXRhLmFkZChrTWFwW2ldLnRvLCBTdHJpbmc4KHZhbHVlKSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBkZXRlY3Rvci0+ZGV0ZWN0QW5kQ29udmVydCgpOworICAgIGludCBzaXplID0gZGV0ZWN0b3ItPnNpemUoKTsKKyAgICBpZiAoc2l6ZSkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlOworICAgICAgICAgICAgZGV0ZWN0b3ItPmdldFRhZyhpLCAmbmFtZSwgJnZhbHVlKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwga051bU1hcEVudHJpZXM7ICsraikgeworICAgICAgICAgICAgICAgIGlmIChrTWFwW2pdLm5hbWUgJiYgIXN0cmNtcChrTWFwW2pdLm5hbWUsIG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIG1NZXRhRGF0YS5hZGQoa01hcFtqXS50bywgU3RyaW5nOCh2YWx1ZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBkZWxldGUgZGV0ZWN0b3I7CisKICAgICBjb25zdCB2b2lkICpkYXRhOwogICAgIHVpbnQzMl90IHR5cGU7CiAgICAgc2l6ZV90IGRhdGFTaXplOwogICAgIGlmIChtZXRhLT5maW5kRGF0YShrS2V5QWxidW1BcnQsICZ0eXBlLCAmZGF0YSwgJmRhdGFTaXplKQogICAgICAgICAgICAgJiYgbUFsYnVtQXJ0ID09IE5VTEwpIHsKLSAgICAgICAgbUFsYnVtQXJ0ID0gbmV3IE1lZGlhQWxidW1BcnQ7Ci0gICAgICAgIG1BbGJ1bUFydC0+bVNpemUgPSBkYXRhU2l6ZTsKLSAgICAgICAgbUFsYnVtQXJ0LT5tRGF0YSA9IG5ldyB1aW50OF90W2RhdGFTaXplXTsKLSAgICAgICAgbWVtY3B5KG1BbGJ1bUFydC0+bURhdGEsIGRhdGEsIGRhdGFTaXplKTsKKyAgICAgICAgbUFsYnVtQXJ0ID0gTWVkaWFBbGJ1bUFydDo6ZnJvbURhdGEoZGF0YVNpemUsIGRhdGEpOwogICAgIH0KIAogICAgIHNpemVfdCBudW1UcmFja3MgPSBtRXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOwogCiAgICAgY2hhciB0bXBbMzJdOwotICAgIHNwcmludGYodG1wLCAiJWQiLCBudW1UcmFja3MpOworICAgIHNwcmludGYodG1wLCAiJXp1IiwgbnVtVHJhY2tzKTsKIAogICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX05VTV9UUkFDS1MsIFN0cmluZzgodG1wKSk7CiAKQEAgLTU0NSw3ICs1NzIsNyBAQAogICAgIH0KIAogICAgIC8vIFRoZSBkdXJhdGlvbiB2YWx1ZSBpcyBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGR1cmF0aW9uIGluIG1zLgotICAgIHNwcmludGYodG1wLCAiJWxsZCIsIChtYXhEdXJhdGlvblVzICsgNTAwKSAvIDEwMDApOworICAgIHNwcmludGYodG1wLCAiJSIgUFJJZDY0LCAobWF4RHVyYXRpb25VcyArIDUwMCkgLyAxMDAwKTsKICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9EVVJBVElPTiwgU3RyaW5nOCh0bXApKTsKIAogICAgIGlmIChoYXNBdWRpbykgewpAQCAtNTczLDcgKzYwMCw3IEBACiAgICAgICAgIGlmIChtU291cmNlLT5nZXRTaXplKCZzb3VyY2VTaXplKSA9PSBPSykgewogICAgICAgICAgICAgaW50NjRfdCBhdmdCaXRSYXRlID0gKGludDY0X3QpKHNvdXJjZVNpemUgKiA4RTYgLyBtYXhEdXJhdGlvblVzKTsKIAotICAgICAgICAgICAgc3ByaW50Zih0bXAsICIlbGxkIiwgYXZnQml0UmF0ZSk7CisgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIiUiIFBSSWQ2NCwgYXZnQml0UmF0ZSk7CiAgICAgICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9CSVRSQVRFLCBTdHJpbmc4KHRtcCkpOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N1cmZhY2VNZWRpYVNvdXJjZS5jcHAKaW5kZXggNmI5MzRkNC4uNGUxYzY1YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdXJmYWNlTWVkaWFTb3VyY2UuY3BwCkBAIC0xNiw2ICsxNiw4IEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIlN1cmZhY2VNZWRpYVNvdXJjZSIKIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VNZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgpAQCAtNTQsOSArNTYsOSBAQAogICAgICAgICBBTE9HRSgiSW52YWxpZCBkaW1lbnNpb25zICVkeCVkIiwgYnVmZmVyV2lkdGgsIGJ1ZmZlckhlaWdodCk7CiAgICAgfQogCi0gICAgbUJ1ZmZlclF1ZXVlID0gbmV3IEJ1ZmZlclF1ZXVlKCk7Ci0gICAgbUJ1ZmZlclF1ZXVlLT5zZXREZWZhdWx0QnVmZmVyU2l6ZShidWZmZXJXaWR0aCwgYnVmZmVySGVpZ2h0KTsKLSAgICBtQnVmZmVyUXVldWUtPnNldENvbnN1bWVyVXNhZ2VCaXRzKEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUiB8CisgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZtUHJvZHVjZXIsICZtQ29uc3VtZXIpOworICAgIG1Db25zdW1lci0+c2V0RGVmYXVsdEJ1ZmZlclNpemUoYnVmZmVyV2lkdGgsIGJ1ZmZlckhlaWdodCk7CisgICAgbUNvbnN1bWVyLT5zZXRDb25zdW1lclVzYWdlQml0cyhHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVIgfAogICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9IV19URVhUVVJFKTsKIAogICAgIHNwPElTdXJmYWNlQ29tcG9zZXI+IGNvbXBvc2VyKENvbXBvc2VyU2VydmljZTo6Z2V0Q29tcG9zZXJTZXJ2aWNlKCkpOwpAQCAtNjgsNyArNzAsNyBAQAogICAgIHdwPENvbnN1bWVyTGlzdGVuZXI+IGxpc3RlbmVyID0gc3RhdGljX2Nhc3Q8Q29uc3VtZXJMaXN0ZW5lcio+KHRoaXMpOwogICAgIHNwPEJ1ZmZlclF1ZXVlOjpQcm94eUNvbnN1bWVyTGlzdGVuZXI+IHByb3h5ID0gbmV3IEJ1ZmZlclF1ZXVlOjpQcm94eUNvbnN1bWVyTGlzdGVuZXIobGlzdGVuZXIpOwogCi0gICAgc3RhdHVzX3QgZXJyID0gbUJ1ZmZlclF1ZXVlLT5jb25zdW1lckNvbm5lY3QocHJveHksIGZhbHNlKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtQ29uc3VtZXItPmNvbnN1bWVyQ29ubmVjdChwcm94eSwgZmFsc2UpOwogICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR0UoIlN1cmZhY2VNZWRpYVNvdXJjZTogZXJyb3IgY29ubmVjdGluZyB0byBCdWZmZXJRdWV1ZTogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIGVycik7CkBAIC05OSwxMyArMTAxLDE2IEBACiAgICAgZHVtcChyZXN1bHQsICIiLCBidWZmZXIsIDEwMjQpOwogfQogCi12b2lkIFN1cmZhY2VNZWRpYVNvdXJjZTo6ZHVtcChTdHJpbmc4JiByZXN1bHQsIGNvbnN0IGNoYXIqIHByZWZpeCwKLSAgICAgICAgY2hhciogYnVmZmVyLCBzaXplX3QgU0laRSkgY29uc3QKK3ZvaWQgU3VyZmFjZU1lZGlhU291cmNlOjpkdW1wKAorICAgICAgICBTdHJpbmc4JiByZXN1bHQsCisgICAgICAgIGNvbnN0IGNoYXIqIC8qIHByZWZpeCAqLywKKyAgICAgICAgY2hhciogYnVmZmVyLAorICAgICAgICBzaXplX3QgLyogU0laRSAqLykgY29uc3QKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwogCiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIG1CdWZmZXJRdWV1ZS0+ZHVtcChyZXN1bHQsICIiKTsKKyAgICBtQ29uc3VtZXItPmR1bXAocmVzdWx0LCAiIik7CiB9CiAKIHN0YXR1c190IFN1cmZhY2VNZWRpYVNvdXJjZTo6c2V0RnJhbWVSYXRlKGludDMyX3QgZnBzKQpAQCAtMTYzLDcgKzE2OCw3IEBACiAgICAgQ0hFQ0tfR1QobU1heEFjcXVpcmVkQnVmZmVyQ291bnQsIDEpOwogCiAgICAgc3RhdHVzX3QgZXJyID0KLSAgICAgICAgbUJ1ZmZlclF1ZXVlLT5zZXRNYXhBY3F1aXJlZEJ1ZmZlckNvdW50KG1NYXhBY3F1aXJlZEJ1ZmZlckNvdW50KTsKKyAgICAgICAgbUNvbnN1bWVyLT5zZXRNYXhBY3F1aXJlZEJ1ZmZlckNvdW50KG1NYXhBY3F1aXJlZEJ1ZmZlckNvdW50KTsKIAogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTE3Niw3ICsxODEsNyBAQAogfQogCiBzdGF0dXNfdCBTdXJmYWNlTWVkaWFTb3VyY2U6OnNldE1heEFjcXVpcmVkQnVmZmVyQ291bnQoc2l6ZV90IGNvdW50KSB7Ci0gICAgQUxPR1YoInNldE1heEFjcXVpcmVkQnVmZmVyQ291bnQoJWQpIiwgY291bnQpOworICAgIEFMT0dWKCJzZXRNYXhBY3F1aXJlZEJ1ZmZlckNvdW50KCV6dSkiLCBjb3VudCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKIAogICAgIENIRUNLX0dUKGNvdW50LCAxKTsKQEAgLTIwMiw4ICsyMDcsMTEgQEAKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAorICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgbUZyYW1lQXZhaWxhYmxlQ29uZGl0aW9uLnNpZ25hbCgpOworCiAgICAgd2hpbGUgKG1OdW1QZW5kaW5nQnVmZmVycyA+IDApIHsKLSAgICAgICAgQUxPR0koIlN0aWxsIHdhaXRpbmcgZm9yICVkIGJ1ZmZlcnMgdG8gYmUgcmV0dXJuZWQuIiwKKyAgICAgICAgQUxPR0koIlN0aWxsIHdhaXRpbmcgZm9yICV6dSBidWZmZXJzIHRvIGJlIHJldHVybmVkLiIsCiAgICAgICAgICAgICAgICAgbU51bVBlbmRpbmdCdWZmZXJzKTsKIAogI2lmIERFQlVHX1BFTkRJTkdfQlVGRkVSUwpAQCAtMjE1LDExICsyMjMsOSBAQAogICAgICAgICBtTWVkaWFCdWZmZXJzQXZhaWxhYmxlQ29uZGl0aW9uLndhaXQobU11dGV4KTsKICAgICB9CiAKLSAgICBtU3RhcnRlZCA9IGZhbHNlOwotICAgIG1GcmFtZUF2YWlsYWJsZUNvbmRpdGlvbi5zaWduYWwoKTsKICAgICBtTWVkaWFCdWZmZXJzQXZhaWxhYmxlQ29uZGl0aW9uLnNpZ25hbCgpOwogCi0gICAgcmV0dXJuIG1CdWZmZXJRdWV1ZS0+Y29uc3VtZXJEaXNjb25uZWN0KCk7CisgICAgcmV0dXJuIG1Db25zdW1lci0+Y29uc3VtZXJEaXNjb25uZWN0KCk7CiB9CiAKIHNwPE1ldGFEYXRhPiBTdXJmYWNlTWVkaWFTb3VyY2U6OmdldEZvcm1hdCgpCkBAIC0yNjUsMTMgKzI3MSwxMiBAQAogICAgIG1lbWNweShkYXRhLCAmdHlwZSwgNCk7CiAgICAgbWVtY3B5KGRhdGEgKyA0LCAmYnVmZmVySGFuZGxlLCBzaXplb2YoYnVmZmVyX2hhbmRsZV90KSk7CiAKLSAgICBBTE9HVigiaGFuZGxlID0gJXAsICwgb2Zmc2V0ID0gJWQsIGxlbmd0aCA9ICVkIiwKKyAgICBBTE9HVigiaGFuZGxlID0gJXAsICwgb2Zmc2V0ID0gJXp1LCBsZW5ndGggPSAlenUiLAogICAgICAgICAgICAgYnVmZmVySGFuZGxlLCAoKmJ1ZmZlciktPnJhbmdlX2xlbmd0aCgpLCAoKmJ1ZmZlciktPnJhbmdlX29mZnNldCgpKTsKIH0KIAotc3RhdHVzX3QgU3VyZmFjZU1lZGlhU291cmNlOjpyZWFkKCBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKQoteworc3RhdHVzX3QgU3VyZmFjZU1lZGlhU291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKiAvKiBvcHRpb25zICovKSB7CiAgICAgQUxPR1YoInJlYWQiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwogCkBAIC0yOTAsNyArMjk1LDcgQEAKICAgICAvLyB3YWl0IGhlcmUgdGlsbCB0aGUgZnJhbWVzIGNvbWUgaW4gZnJvbSB0aGUgY2xpZW50IHNpZGUKICAgICB3aGlsZSAobVN0YXJ0ZWQpIHsKIAotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQnVmZmVyUXVldWUtPmFjcXVpcmVCdWZmZXIoJml0ZW0sIDApOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQ29uc3VtZXItPmFjcXVpcmVCdWZmZXIoJml0ZW0sIDApOwogICAgICAgICBpZiAoZXJyID09IEJ1ZmZlclF1ZXVlOjpOT19CVUZGRVJfQVZBSUxBQkxFKSB7CiAgICAgICAgICAgICAvLyB3YWl0IGZvciBhIGJ1ZmZlciB0byBiZSBxdWV1ZWQKICAgICAgICAgICAgIG1GcmFtZUF2YWlsYWJsZUNvbmRpdGlvbi53YWl0KG1NdXRleCk7CkBAIC0zMTMsNyArMzE4LDcgQEAKICAgICAgICAgICAgICAgICBpZiAobVN0YXJ0VGltZU5zID4gMCkgewogICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5tVGltZXN0YW1wIDwgbVN0YXJ0VGltZU5zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGZyYW1lIHByZWRhdGVzIHN0YXJ0IG9mIHJlY29yZCwgZGlzY2FyZAotICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlclF1ZXVlLT5yZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnN1bWVyLT5yZWxlYXNlQnVmZmVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLm1CdWYsIGl0ZW0ubUZyYW1lTnVtYmVyLCBFR0xfTk9fRElTUExBWSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMX05PX1NZTkNfS0hSLCBGZW5jZTo6Tk9fRkVOQ0UpOwogICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC0zNjAsNyArMzY1LDcgQEAKICAgICAoKmJ1ZmZlciktPnNldE9ic2VydmVyKHRoaXMpOwogICAgICgqYnVmZmVyKS0+YWRkX3JlZigpOwogICAgICgqYnVmZmVyKS0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCBtQ3VycmVudFRpbWVzdGFtcCAvIDEwMDApOwotICAgIEFMT0dWKCJGcmFtZXMgZW5jb2RlZCA9ICVkLCB0aW1lc3RhbXAgPSAlbGxkLCB0aW1lIGRpZmYgPSAlbGxkIiwKKyAgICBBTE9HVigiRnJhbWVzIGVuY29kZWQgPSAlZCwgdGltZXN0YW1wID0gJSIgUFJJZDY0ICIsIHRpbWUgZGlmZiA9ICUiIFBSSWQ2NCwKICAgICAgICAgICAgIG1OdW1GcmFtZXNFbmNvZGVkLCBtQ3VycmVudFRpbWVzdGFtcCAvIDEwMDAsCiAgICAgICAgICAgICBtQ3VycmVudFRpbWVzdGFtcCAvIDEwMDAgLSBwcmV2VGltZVN0YW1wIC8gMTAwMCk7CiAKQEAgLTQxMyw3ICs0MTgsNyBAQAogICAgICAgICAgICAgQUxPR1YoIlNsb3QgJWQgcmV0dXJuZWQsIG1hdGNoZXMgaGFuZGxlID0gJXAiLCBpZCwKICAgICAgICAgICAgICAgICAgICAgbVNsb3RzW2lkXS5tR3JhcGhpY0J1ZmZlci0+aGFuZGxlKTsKIAotICAgICAgICAgICAgbUJ1ZmZlclF1ZXVlLT5yZWxlYXNlQnVmZmVyKGlkLCBtU2xvdHNbaWRdLm1GcmFtZU51bWJlciwKKyAgICAgICAgICAgIG1Db25zdW1lci0+cmVsZWFzZUJ1ZmZlcihpZCwgbVNsb3RzW2lkXS5tRnJhbWVOdW1iZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMX05PX0RJU1BMQVksIEVHTF9OT19TWU5DX0tIUiwKICAgICAgICAgICAgICAgICAgICAgRmVuY2U6Ok5PX0ZFTkNFKTsKIApAQCAtNDc0LDQgKzQ3OSw4IEBACiAgICAgfQogfQogCit2b2lkIFN1cmZhY2VNZWRpYVNvdXJjZTo6b25TaWRlYmFuZFN0cmVhbUNoYW5nZWQoKSB7CisgICAgQUxPR19BU1NFUlQoZmFsc2UsICJTdXJmYWNlTWVkaWFTb3VyY2UgY2FuJ3QgY29uc3VtZSBzaWRlYmFuZCBzdHJlYW1zIik7Cit9CisKIH0gLy8gZW5kIG9mIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9UaW1lZEV2ZW50UXVldWUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVGltZWRFdmVudFF1ZXVlLmNwcAppbmRleCAwYWZhYzY5Li4xZmRiMjQ0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9UaW1lZEV2ZW50UXVldWUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1RpbWVkRXZlbnRRdWV1ZS5jcHAKQEAgLTE3LDcgKzE3LDExIEBACiAjdW5kZWYgX19TVFJJQ1RfQU5TSV9fCiAjZGVmaW5lIF9fU1RESU5UX0xJTUlUUwogI2RlZmluZSBfX1NURENfTElNSVRfTUFDUk9TCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiVGltZWRFdmVudFF1ZXVlIgpAQCAtMjYsOSArMzAsNiBAQAogCiAjaW5jbHVkZSAiaW5jbHVkZS9UaW1lZEV2ZW50UXVldWUuaCIKIAotI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KQEAgLTI1OCw3ICsyNTksNyBAQAogICAgICAgICAgICAgICAgIHN0YXRpYyBpbnQ2NF90IGtNYXhUaW1lb3V0VXMgPSAxMDAwMDAwMGxsOyAgLy8gMTAgc2VjcwogICAgICAgICAgICAgICAgIGJvb2wgdGltZW91dENhcHBlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGlmIChkZWxheV91cyA+IGtNYXhUaW1lb3V0VXMpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coImRlbGF5X3VzIGV4Y2VlZHMgbWF4IHRpbWVvdXQ6ICVsbGQgdXMiLCBkZWxheV91cyk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJkZWxheV91cyBleGNlZWRzIG1heCB0aW1lb3V0OiAlIiBQUklkNjQgIiB1cyIsIGRlbGF5X3VzKTsKIAogICAgICAgICAgICAgICAgICAgICAvLyBXZSdsbCBuZXZlciBibG9jayBmb3IgbW9yZSB0aGFuIDEwIHNlY3MsIGluc3RlYWQKICAgICAgICAgICAgICAgICAgICAgLy8gd2Ugd2lsbCBzcGxpdCB1cCB0aGUgZnVsbCB0aW1lb3V0IGludG8gY2h1bmtzIG9mCkBAIC0zMzcsNyArMzM4LDcgQEAKICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1Qb3dlck1hbmFnZXItPmFjcXVpcmVXYWtlTG9jayhQT1dFUk1BTkFHRVJfUEFSVElBTF9XQUtFX0xPQ0ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzE2KCJUaW1lZEV2ZW50UXVldWUiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcxNigibWVkaWEiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nMTYoIm1lZGlhIikpOyAgICAvLyBub3Qgb25ld2F5CiAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICBtV2FrZUxvY2tUb2tlbiA9IGJpbmRlcjsKQEAgLTM2Miw3ICszNjMsNyBAQAogICAgICAgICBDSEVDSyhtV2FrZUxvY2tUb2tlbiAhPSAwKTsKICAgICAgICAgaWYgKG1Qb3dlck1hbmFnZXIgIT0gMCkgewogICAgICAgICAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Ci0gICAgICAgICAgICBtUG93ZXJNYW5hZ2VyLT5yZWxlYXNlV2FrZUxvY2sobVdha2VMb2NrVG9rZW4sIDApOworICAgICAgICAgICAgbVBvd2VyTWFuYWdlci0+cmVsZWFzZVdha2VMb2NrKG1XYWtlTG9ja1Rva2VuLCAwKTsgIC8vIG5vdCBvbmV3YXkKICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwogICAgICAgICB9CiAgICAgICAgIG1XYWtlTG9ja1Rva2VuLmNsZWFyKCk7CkBAIC0zNzYsOCArMzc3LDggQEAKICAgICBtUG93ZXJNYW5hZ2VyLmNsZWFyKCk7CiB9CiAKLXZvaWQgVGltZWRFdmVudFF1ZXVlOjpQTURlYXRoUmVjaXBpZW50OjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pCi17Cit2b2lkIFRpbWVkRXZlbnRRdWV1ZTo6UE1EZWF0aFJlY2lwaWVudDo6YmluZGVyRGllZCgKKyAgICAgICAgY29uc3Qgd3A8SUJpbmRlcj4mIC8qIHdobyAqLykgewogICAgIG1RdWV1ZS0+Y2xlYXJQb3dlck1hbmFnZXIoKTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwCmluZGV4IDI1NWI5NDIuLjFlM2JmZGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAKQEAgLTE3LDExICsxNywxMyBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJVdGlscyIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgogCiAjaW5jbHVkZSAiaW5jbHVkZS9FU0RTLmgiCiAKICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0F1ZGlvLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CkBAIC0xMDAsNiArMTAyLDExIEBACiAgICAgICAgIG1zZy0+c2V0SW50NjQoImR1cmF0aW9uVXMiLCBkdXJhdGlvblVzKTsKICAgICB9CiAKKyAgICBpbnQgYXZnQml0UmF0ZTsKKyAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlCaXRSYXRlLCAmYXZnQml0UmF0ZSkpIHsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigiYml0LXJhdGUiLCBhdmdCaXRSYXRlKTsKKyAgICB9CisKICAgICBpbnQzMl90IGlzU3luYzsKICAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlJc1N5bmNGcmFtZSwgJmlzU3luYykgJiYgaXNTeW5jICE9IDApIHsKICAgICAgICAgbXNnLT5zZXRJbnQzMigiaXMtc3luYy1mcmFtZSIsIDEpOwpAQCAtMTE5LDYgKzEyNiwyNSBAQAogICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigic2FyLXdpZHRoIiwgc2FyV2lkdGgpOwogICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigic2FyLWhlaWdodCIsIHNhckhlaWdodCk7CiAgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IGNvbG9yRm9ybWF0OworICAgICAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlDb2xvckZvcm1hdCwgJmNvbG9yRm9ybWF0KSkgeworICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiY29sb3ItZm9ybWF0IiwgY29sb3JGb3JtYXQpOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBjcm9wTGVmdCwgY3JvcFRvcCwgY3JvcFJpZ2h0LCBjcm9wQm90dG9tOworICAgICAgICBpZiAobWV0YS0+ZmluZFJlY3Qoa0tleUNyb3BSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyb3BMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyb3BUb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JvcFJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyb3BCb3R0b20pKSB7CisgICAgICAgICAgICBtc2ctPnNldFJlY3QoImNyb3AiLCBjcm9wTGVmdCwgY3JvcFRvcCwgY3JvcFJpZ2h0LCBjcm9wQm90dG9tKTsKKyAgICAgICAgfQorCisgICAgICAgIGludDMyX3Qgcm90YXRpb25EZWdyZWVzOworICAgICAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlSb3RhdGlvbiwgJnJvdGF0aW9uRGVncmVlcykpIHsKKyAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoInJvdGF0aW9uLWRlZ3JlZXMiLCByb3RhdGlvbkRlZ3JlZXMpOworICAgICAgICB9CiAgICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAoImF1ZGlvLyIsIG1pbWUsIDYpKSB7CiAgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHMsIHNhbXBsZVJhdGU7CiAgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmbnVtQ2hhbm5lbHMpKTsKQEAgLTE0NSw2ICsxNzEsMTEgQEAKICAgICAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5SXNBRFRTLCAmaXNBRFRTKSkgewogICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiaXMtYWR0cyIsIHRydWUpOwogICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBhYWNQcm9maWxlID0gLTE7CisgICAgICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUFBQ0FPVCwgJmFhY1Byb2ZpbGUpKSB7CisgICAgICAgICAgICBtc2ctPnNldEludDMyKCJhYWMtcHJvZmlsZSIsIGFhY1Byb2ZpbGUpOworICAgICAgICB9CiAgICAgfQogCiAgICAgaW50MzJfdCBtYXhJbnB1dFNpemU7CkBAIC0xNTIsNiArMTgzLDExIEBACiAgICAgICAgIG1zZy0+c2V0SW50MzIoIm1heC1pbnB1dC1zaXplIiwgbWF4SW5wdXRTaXplKTsKICAgICB9CiAKKyAgICBpbnQzMl90IHJvdGF0aW9uRGVncmVlczsKKyAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlSb3RhdGlvbiwgJnJvdGF0aW9uRGVncmVlcykpIHsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigicm90YXRpb24tZGVncmVlcyIsIHJvdGF0aW9uRGVncmVlcyk7CisgICAgfQorCiAgICAgdWludDMyX3QgdHlwZTsKICAgICBjb25zdCB2b2lkICpkYXRhOwogICAgIHNpemVfdCBzaXplOwpAQCAtMjU0LDYgKzI5MCw3MCBAQAogICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImNzZCIsIHRydWUpOwogICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIDApOwogICAgICAgICBtc2ctPnNldEJ1ZmZlcigiY3NkLTEiLCBidWZmZXIpOworICAgIH0gZWxzZSBpZiAobWV0YS0+ZmluZERhdGEoa0tleUhWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9IChjb25zdCB1aW50OF90ICopZGF0YTsKKworICAgICAgICBpZiAoc2l6ZSA8IDIzIHx8IHB0clswXSAhPSAxKSB7ICAvLyBjb25maWd1cmF0aW9uVmVyc2lvbiA9PSAxCisgICAgICAgICAgICBBTE9HRSgiYi8yMzY4MDc4MCIpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICB1aW50OF90IHByb2ZpbGUgPSBwdHJbMV0gJiAzMTsKKyAgICAgICAgdWludDhfdCBsZXZlbCA9IHB0clsxMl07CisgICAgICAgIHB0ciArPSAyMjsKKyAgICAgICAgc2l6ZSAtPSAyMjsKKworCisgICAgICAgIHNpemVfdCBudW1vZkFycmF5cyA9IChjaGFyKXB0clswXTsKKyAgICAgICAgcHRyICs9IDE7CisgICAgICAgIHNpemUgLT0gMTsKKyAgICAgICAgc2l6ZV90IGogPSAwLCBpID0gMDsKKworICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgQUJ1ZmZlcigxMDI0KTsKKyAgICAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBOVUxMIHx8IGJ1ZmZlci0+YmFzZSgpID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtb2ZBcnJheXM7IGkrKykgeworICAgICAgICAgICAgaWYgKHNpemUgPCAzKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImIvMjM2ODA3ODAiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHRyICs9IDE7CisgICAgICAgICAgICBzaXplIC09IDE7CisKKyAgICAgICAgICAgIC8vTnVtIG9mIG5hbHMKKyAgICAgICAgICAgIHNpemVfdCBudW1vZk5hbHMgPSBVMTZfQVQocHRyKTsKKworICAgICAgICAgICAgcHRyICs9IDI7CisgICAgICAgICAgICBzaXplIC09IDI7CisKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1vZk5hbHM7IGorKykgeworICAgICAgICAgICAgICAgIGlmIChzaXplIDwgMikgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiYi8yMzY4MDc4MCIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoID0gVTE2X0FUKHB0cik7CisKKyAgICAgICAgICAgICAgICBwdHIgKz0gMjsKKyAgICAgICAgICAgICAgICBzaXplIC09IDI7CisKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8IGxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBjb3B5TkFMVVRvQUJ1ZmZlcigmYnVmZmVyLCBwdHIsIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHB0ciArPSBsZW5ndGg7CisgICAgICAgICAgICAgICAgc2l6ZSAtPSBsZW5ndGg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJjc2QiLCB0cnVlKTsKKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCAwKTsKKyAgICAgICAgbXNnLT5zZXRCdWZmZXIoImNzZC0wIiwgYnVmZmVyKTsKKwogICAgIH0gZWxzZSBpZiAobWV0YS0+ZmluZERhdGEoa0tleUVTRFMsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CiAgICAgICAgIEVTRFMgZXNkcygoY29uc3QgY2hhciAqKWRhdGEsIHNpemUpOwogICAgICAgICBDSEVDS19FUShlc2RzLkluaXRDaGVjaygpLCAoc3RhdHVzX3QpT0spOwpAQCAtMjk4LDYgKzM5OCwxNiBAQAogICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImNzZCIsIHRydWUpOwogICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIDApOwogICAgICAgICBtc2ctPnNldEJ1ZmZlcigiY3NkLTEiLCBidWZmZXIpOworICAgIH0gZWxzZSBpZiAobWV0YS0+ZmluZERhdGEoa0tleU9wdXNIZWFkZXIsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSBBQnVmZmVyKHNpemUpOworICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IE5VTEwgfHwgYnVmZmVyLT5iYXNlKCkgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCksIGRhdGEsIHNpemUpOworCisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiY3NkIiwgdHJ1ZSk7CisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgMCk7CisgICAgICAgIG1zZy0+c2V0QnVmZmVyKCJjc2QtMCIsIGJ1ZmZlcik7CiAgICAgfQogCiAgICAgKmZvcm1hdCA9IG1zZzsKQEAgLTMyNCw3ICs0MzQsNyBAQAogICAgICAgICAgICAgICAgIC8vIHRoZXJlIGNhbid0IGJlIGFub3RoZXIgcGFyYW0gaGVyZSwgc28gdXNlIGFsbCB0aGUgcmVzdAogICAgICAgICAgICAgICAgIGkgPSBjc2QwLT5zaXplKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiYmxvY2sgYXQgJWQsIGxhc3Qgd2FzICVkIiwgaSwgbGFzdHBhcmFtb2Zmc2V0KTsKKyAgICAgICAgICAgIEFMT0dWKCJibG9jayBhdCAlenUsIGxhc3Qgd2FzICVkIiwgaSwgbGFzdHBhcmFtb2Zmc2V0KTsKICAgICAgICAgICAgIGlmIChsYXN0cGFyYW1vZmZzZXQgPiAwKSB7CiAgICAgICAgICAgICAgICAgaW50IHNpemUgPSBpIC0gbGFzdHBhcmFtb2Zmc2V0OwogICAgICAgICAgICAgICAgIGF2Y2NbYXZjY2lkeCsrXSA9IHNpemUgPj4gODsKQEAgLTM1NSw3ICs0NjUsNyBAQAogICAgICAgICAgICAgICAgIC8vIHRoZXJlIGNhbid0IGJlIGFub3RoZXIgcGFyYW0gaGVyZSwgc28gdXNlIGFsbCB0aGUgcmVzdAogICAgICAgICAgICAgICAgIGkgPSBjc2QxLT5zaXplKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiYmxvY2sgYXQgJWQsIGxhc3Qgd2FzICVkIiwgaSwgbGFzdHBhcmFtb2Zmc2V0KTsKKyAgICAgICAgICAgIEFMT0dWKCJibG9jayBhdCAlenUsIGxhc3Qgd2FzICVkIiwgaSwgbGFzdHBhcmFtb2Zmc2V0KTsKICAgICAgICAgICAgIGlmIChsYXN0cGFyYW1vZmZzZXQgPiAwKSB7CiAgICAgICAgICAgICAgICAgaW50IHNpemUgPSBpIC0gbGFzdHBhcmFtb2Zmc2V0OwogICAgICAgICAgICAgICAgIGF2Y2NbYXZjY2lkeCsrXSA9IHNpemUgPj4gODsKQEAgLTQ0OCw2ICs1NTgsMjUgQEAKICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlTQVJXaWR0aCwgc2FyV2lkdGgpOwogICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVNBUkhlaWdodCwgc2FySGVpZ2h0KTsKICAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgY29sb3JGb3JtYXQ7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJmNvbG9yRm9ybWF0KSkgeworICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUNvbG9yRm9ybWF0LCBjb2xvckZvcm1hdCk7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IGNyb3BMZWZ0LCBjcm9wVG9wLCBjcm9wUmlnaHQsIGNyb3BCb3R0b207CisgICAgICAgIGlmIChtc2ctPmZpbmRSZWN0KCJjcm9wIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyb3BMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JvcFRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyb3BSaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyb3BCb3R0b20pKSB7CisgICAgICAgICAgICBtZXRhLT5zZXRSZWN0KGtLZXlDcm9wUmVjdCwgY3JvcExlZnQsIGNyb3BUb3AsIGNyb3BSaWdodCwgY3JvcEJvdHRvbSk7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IHJvdGF0aW9uRGVncmVlczsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJyb3RhdGlvbi1kZWdyZWVzIiwgJnJvdGF0aW9uRGVncmVlcykpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlSb3RhdGlvbiwgcm90YXRpb25EZWdyZWVzKTsKKyAgICAgICAgfQogICAgIH0gZWxzZSBpZiAobWltZS5zdGFydHNXaXRoKCJhdWRpby8iKSkgewogICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzOwogICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImNoYW5uZWwtY291bnQiLCAmbnVtQ2hhbm5lbHMpKSB7CkBAIC01MDksNiArNjM4LDExIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpbnQzMl90IHRpbWVTY2FsZTsKKyAgICBpZiAobXNnLT5maW5kSW50MzIoInRpbWUtc2NhbGUiLCAmdGltZVNjYWxlKSkgeworICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5VGltZVNjYWxlLCB0aW1lU2NhbGUpOworICAgIH0KKwogICAgIC8vIFhYWCBUT0RPIGFkZCB3aGF0ZXZlciBvdGhlciBrZXlzIHRoZXJlIGFyZQogCiAjaWYgMApAQCAtNTgwLDYgKzcxNCw3IEBACiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IsICAgICAgQVVESU9fRk9STUFUX0FNUl9XQiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDLCAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUMgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUywgICAgICBBVURJT19GT1JNQVRfVk9SQklTIH0sCisgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTLCAgICAgICAgQVVESU9fRk9STUFUX09QVVN9LAogICAgIHsgMCwgQVVESU9fRk9STUFUX0lOVkFMSUQgfQogfTsKIApAQCAtNTk3LDEwICs3MzIsNDYgQEAKICAgICByZXR1cm4gQkFEX1ZBTFVFOwogfQogCitzdHJ1Y3QgYWFjX2Zvcm1hdF9jb252X3QgeworICAgIE9NWF9BVURJT19BQUNQUk9GSUxFVFlQRSBlQWFjUHJvZmlsZVR5cGU7CisgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0OworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhYWNfZm9ybWF0X2NvbnZfdCBwcm9maWxlTG9va3VwW10gPSB7CisgICAgeyBPTVhfQVVESU9fQUFDT2JqZWN0TWFpbiwgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfTUFJTn0sCisgICAgeyBPTVhfQVVESU9fQUFDT2JqZWN0TEMsICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfTEN9LAorICAgIHsgT01YX0FVRElPX0FBQ09iamVjdFNTUiwgICAgICAgICBBVURJT19GT1JNQVRfQUFDX1NTUn0sCisgICAgeyBPTVhfQVVESU9fQUFDT2JqZWN0TFRQLCAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfTFRQfSwKKyAgICB7IE9NWF9BVURJT19BQUNPYmplY3RIRSwgICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19IRV9WMX0sCisgICAgeyBPTVhfQVVESU9fQUFDT2JqZWN0U2NhbGFibGUsICAgIEFVRElPX0ZPUk1BVF9BQUNfU0NBTEFCTEV9LAorICAgIHsgT01YX0FVRElPX0FBQ09iamVjdEVSTEMsICAgICAgICBBVURJT19GT1JNQVRfQUFDX0VSTEN9LAorICAgIHsgT01YX0FVRElPX0FBQ09iamVjdExELCAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0xEfSwKKyAgICB7IE9NWF9BVURJT19BQUNPYmplY3RIRV9QUywgICAgICAgQVVESU9fRk9STUFUX0FBQ19IRV9WMn0sCisgICAgeyBPTVhfQVVESU9fQUFDT2JqZWN0RUxELCAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfRUxEfSwKKyAgICB7IE9NWF9BVURJT19BQUNPYmplY3ROdWxsLCAgICAgICAgQVVESU9fRk9STUFUX0FBQ30sCit9OworCit2b2lkIG1hcEFBQ1Byb2ZpbGVUb0F1ZGlvRm9ybWF0KCBhdWRpb19mb3JtYXRfdCYgZm9ybWF0LCB1aW50NjRfdCBlQWFjUHJvZmlsZSkKK3sKK2NvbnN0IHN0cnVjdCBhYWNfZm9ybWF0X2NvbnZfdCogcCA9ICZwcm9maWxlTG9va3VwWzBdOworICAgIHdoaWxlIChwLT5lQWFjUHJvZmlsZVR5cGUgIT0gT01YX0FVRElPX0FBQ09iamVjdE51bGwpIHsKKyAgICAgICAgaWYgKGVBYWNQcm9maWxlID09IHAtPmVBYWNQcm9maWxlVHlwZSkgeworICAgICAgICAgICAgZm9ybWF0ID0gcC0+Zm9ybWF0OworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgICsrcDsKKyAgICB9CisgICAgZm9ybWF0ID0gQVVESU9fRk9STUFUX0FBQzsKKyAgICByZXR1cm47Cit9CisKIGJvb2wgY2FuT2ZmbG9hZFN0cmVhbShjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEsIGJvb2wgaGFzVmlkZW8sCiAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1N0cmVhbWluZywgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKQogewogICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgaWYgKG1ldGEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKIAogICAgIGF1ZGlvX29mZmxvYWRfaW5mb190IGluZm8gPSBBVURJT19JTkZPX0lOSVRJQUxJWkVSOwpAQCAtNjE5LDE1ICs3OTAsMTEgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIC8vIGNoZWNrIHdoZXRoZXIgaXQgaXMgRUxEL0xEIGNvbnRlbnQgLT4gbm8gb2ZmbG9hZGluZwotICAgIC8vIEZJWE1FOiB0aGlzIHNob3VsZCBkZXBlbmQgb24gYXVkaW8gRFNQIGNhcGFiaWxpdGllcy4gbWFwTWltZVRvQXVkaW9Gb3JtYXQoKSBzaG91bGQgdXNlIHRoZQotICAgIC8vIG1ldGFkYXRhIHRvIHJlZmluZSB0aGUgQUFDIGZvcm1hdCBhbmQgdGhlIGF1ZGlvIEhBTCBzaG91bGQgb25seSBsaXN0IHN1cHBvcnRlZCBwcm9maWxlcy4KKyAgICAvLyBSZWRlZmluZSBhYWMgZm9ybWF0IGFjY29yZGluZyB0byBpdHMgcHJvZmlsZQorICAgIC8vIE9mZmxvYWRpbmcgZGVwZW5kcyBvbiBhdWRpbyBEU1AgY2FwYWJpbGl0aWVzLgogICAgIGludDMyX3QgYWFjYW90ID0gLTE7CiAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5QUFDQU9ULCAmYWFjYW90KSkgewotICAgICAgICBpZiAoYWFjYW90ID09IDIzIHx8IGFhY2FvdCA9PSAzOSApIHsKLSAgICAgICAgICAgIEFMT0dWKCJ0cmFjayBvZiB0eXBlICclcycgaXMgRUxEL0xEIGNvbnRlbnQiLCBtaW1lKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQorICAgICAgICBtYXBBQUNQcm9maWxlVG9BdWRpb0Zvcm1hdChpbmZvLmZvcm1hdCwoT01YX0FVRElPX0FBQ1BST0ZJTEVUWVBFKSBhYWNhb3QpOwogICAgIH0KIAogICAgIGludDMyX3Qgc3JhdGUgPSAtMTsKQEAgLTY3Miw1ICs4MzksNDAgQEAKICAgICByZXR1cm4gQXVkaW9TeXN0ZW06OmlzT2ZmbG9hZFN1cHBvcnRlZChpbmZvKTsKIH0KIAorQVN0cmluZyB1cmlEZWJ1Z1N0cmluZyhjb25zdCBBU3RyaW5nICZ1cmksIGJvb2wgaW5jb2duaXRvKSB7CisgICAgaWYgKGluY29nbml0bykgeworICAgICAgICByZXR1cm4gQVN0cmluZygiPFVSSSBzdXBwcmVzc2VkPiIpOworICAgIH0KKworICAgIGNoYXIgcHJvcFtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGlmIChwcm9wZXJ0eV9nZXQoIm1lZGlhLnN0YWdlZnJpZ2h0LmxvZy11cmkiLCBwcm9wLCAiZmFsc2UiKSAmJgorICAgICAgICAoIXN0cmNtcChwcm9wLCAiMSIpIHx8ICFzdHJjbXAocHJvcCwgInRydWUiKSkpIHsKKyAgICAgICAgcmV0dXJuIHVyaTsKKyAgICB9CisKKyAgICAvLyBmaW5kIHNjaGVtZQorICAgIEFTdHJpbmcgc2NoZW1lOworICAgIGNvbnN0IGNoYXIgKmNoYXJzID0gdXJpLmNfc3RyKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB1cmkuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgY2hhciBjID0gY2hhcnNbaV07CisgICAgICAgIGlmICghaXNhc2NpaShjKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoaXNhbHBoYShjKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAvLyBmaXJzdCBjaGFyYWN0ZXIgbXVzdCBiZSBhIGxldHRlcgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoaXNkaWdpdChjKSB8fCBjID09ICcrJyB8fCBjID09ICcuJyB8fCBjID09Jy0nKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmIChjICE9ICc6JykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc2NoZW1lID0gQVN0cmluZyh1cmksIDAsIGkpOworICAgICAgICBzY2hlbWUuYXBwZW5kKCI6Ly88c3VwcHJlc3NlZD4iKTsKKyAgICAgICAgcmV0dXJuIHNjaGVtZTsKKyAgICB9CisgICAgcmV0dXJuIEFTdHJpbmcoIjxuby1zY2hlbWUgVVJJIHN1cHByZXNzZWQ+Iik7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZCUklTZWVrZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVkJSSVNlZWtlci5jcHAKaW5kZXggYTI0NWYyYy4uZTk4OGY2ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVkJSSVNlZWtlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVkJSSVNlZWtlci5jcHAKQEAgLTE2LDYgKzE2LDkgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJWQlJJU2Vla2VyIgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiaW5jbHVkZS9WQlJJU2Vla2VyLmgiCkBAIC03NSw3ICs3OCw3IEBACiAgICAgc2l6ZV90IGVudHJ5U2l6ZSA9IFUxNl9BVCgmdmJyaUhlYWRlclsyMl0pOwogICAgIHNpemVfdCBzY2FsZSA9IFUxNl9BVCgmdmJyaUhlYWRlclsyMF0pOwogCi0gICAgQUxPR1YoIiVkIGVudHJpZXMsIHNjYWxlPSVkLCBzaXplX3Blcl9lbnRyeT0lZCIsCisgICAgQUxPR1YoIiV6dSBlbnRyaWVzLCBzY2FsZT0lenUsIHNpemVfcGVyX2VudHJ5PSV6dSIsCiAgICAgICAgICBudW1FbnRyaWVzLAogICAgICAgICAgc2NhbGUsCiAgICAgICAgICBlbnRyeVNpemUpOwpAQCAtMTE5LDcgKzEyMiw3IEBACiAKICAgICAgICAgc2Vla2VyLT5tU2VnbWVudHMucHVzaChudW1CeXRlcyk7CiAKLSAgICAgICAgQUxPR1YoImVudHJ5ICMlZDogJWQgb2Zmc2V0IDB4JTA4bHgiLCBpLCBudW1CeXRlcywgb2Zmc2V0KTsKKyAgICAgICAgQUxPR1YoImVudHJ5ICMlenU6ICV1IG9mZnNldCAweCUwMTZsbHgiLCBpLCBudW1CeXRlcywgb2Zmc2V0KTsKICAgICAgICAgb2Zmc2V0ICs9IG51bUJ5dGVzOwogICAgIH0KIApAQCAtMTYwLDcgKzE2Myw3IEBACiAgICAgICAgICpwb3MgKz0gbVNlZ21lbnRzLml0ZW1BdChzZWdtZW50SW5kZXgrKyk7CiAgICAgfQogCi0gICAgQUxPR1YoImdldE9mZnNldEZvclRpbWUgJWxsZCB1cyA9PiAweCUwOGx4IiwgKnRpbWVVcywgKnBvcyk7CisgICAgQUxPR1YoImdldE9mZnNldEZvclRpbWUgJSIgUFJJZDY0ICIgdXMgPT4gMHglMDE2bGx4IiwgKnRpbWVVcywgKnBvcyk7CiAKICAgICAqdGltZVVzID0gbm93VXM7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1dBVkV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9XQVZFeHRyYWN0b3IuY3BwCmluZGV4IDIyYWY2ZmIuLmE0YTY1MWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1dBVkV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvV0FWRXh0cmFjdG9yLmNwcApAQCAtMTI3LDcgKzEyNyw3IEBACiB9CiAKIHNwPE1ldGFEYXRhPiBXQVZFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpIHsKKyAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ID4gMCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC0zNTgsNyArMzU4LDcgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IFdBVlNvdXJjZTo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgeworc3RhdHVzX3QgV0FWU291cmNlOjpzdGFydChNZXRhRGF0YSAqIC8qIHBhcmFtcyAqLykgewogICAgIEFMT0dWKCJXQVZTb3VyY2U6OnN0YXJ0Iik7CiAKICAgICBDSEVDSyghbVN0YXJ0ZWQpOwpAQCAtNDE0LDcgKzQxNCw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBwb3MgPSAoc2Vla1RpbWVVcyAqIG1TYW1wbGVSYXRlKSAvIDEwMDAwMDAgKiBtTnVtQ2hhbm5lbHMgKiAobUJpdHNQZXJTYW1wbGUgPj4gMyk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHBvcyA+IG1TaXplKSB7CisgICAgICAgIGlmIChwb3MgPiAob2ZmNjRfdCltU2l6ZSkgewogICAgICAgICAgICAgcG9zID0gbVNpemU7CiAgICAgICAgIH0KICAgICAgICAgbUN1cnJlbnRQb3MgPSBwb3MgKyBtT2Zmc2V0OwpAQCAtNDM5LDYgKzQzOSwxMCBAQAogICAgICAgICBtYXhCeXRlc1RvUmVhZCA9IG1heEJ5dGVzQXZhaWxhYmxlOwogICAgIH0KIAorICAgIC8vIHJlYWQgb25seSBpbnRlZ3JhbCBhbW91bnRzIG9mIGF1ZGlvIHVuaXQgZnJhbWVzLgorICAgIGNvbnN0IHNpemVfdCBpbnB1dFVuaXRGcmFtZVNpemUgPSBtTnVtQ2hhbm5lbHMgKiBtQml0c1BlclNhbXBsZSAvIDg7CisgICAgbWF4Qnl0ZXNUb1JlYWQgLT0gbWF4Qnl0ZXNUb1JlYWQgJSBpbnB1dFVuaXRGcmFtZVNpemU7CisKICAgICBpZiAobVdhdmVGb3JtYXQgPT0gV0FWRV9GT1JNQVRfTVNHU00pIHsKICAgICAgICAgLy8gTWljcm9zb2Z0IHBhY2tzIDIgZnJhbWVzIGludG8gNjUgYnl0ZXMsIHJhdGhlciB0aGFuIHVzaW5nIHNlcGFyYXRlIDMzLWJ5dGUgZnJhbWVzLAogICAgICAgICAvLyBzbyByZWFkIG11bHRpcGxlcyBvZiA2NSwgYW5kIHVzZSBzbWFsbGVyIGJ1ZmZlcnMgdG8gYWNjb3VudCBmb3IgfjEwOjEgZXhwYW5zaW9uIHJhdGlvCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9hdmNfdXRpbHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYXZjX3V0aWxzLmNwcAppbmRleCBiODIyODY4Li4zOGExZjZiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9hdmNfdXRpbHMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2F2Y191dGlscy5jcHAKQEAgLTQwLDYgKzQwLDI1IEBACiAgICAgcmV0dXJuIHggKyAoMXUgPDwgbnVtWmVyb2VzKSAtIDE7CiB9CiAKK3NpZ25lZCBwYXJzZVNFKEFCaXRSZWFkZXIgKmJyKSB7CisgICAgdW5zaWduZWQgY29kZU51bSA9IHBhcnNlVUUoYnIpOworCisgICAgcmV0dXJuIChjb2RlTnVtICYgMSkgPyAoY29kZU51bSArIDEpIC8gMiA6IC0oY29kZU51bSAvIDIpOworfQorCitzdGF0aWMgdm9pZCBza2lwU2NhbGluZ0xpc3QoQUJpdFJlYWRlciAqYnIsIHNpemVfdCBzaXplT2ZTY2FsaW5nTGlzdCkgeworICAgIHNpemVfdCBsYXN0U2NhbGUgPSA4OworICAgIHNpemVfdCBuZXh0U2NhbGUgPSA4OworICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgc2l6ZU9mU2NhbGluZ0xpc3Q7ICsraikgeworICAgICAgICBpZiAobmV4dFNjYWxlICE9IDApIHsKKyAgICAgICAgICAgIHNpZ25lZCBkZWx0YV9zY2FsZSA9IHBhcnNlU0UoYnIpOworICAgICAgICAgICAgbmV4dFNjYWxlID0gKGxhc3RTY2FsZSArIGRlbHRhX3NjYWxlICsgMjU2KSAlIDI1NjsKKyAgICAgICAgfQorCisgICAgICAgIGxhc3RTY2FsZSA9IChuZXh0U2NhbGUgPT0gMCkgPyBsYXN0U2NhbGUgOiBuZXh0U2NhbGU7CisgICAgfQorfQorCiAvLyBEZXRlcm1pbmUgdmlkZW8gZGltZW5zaW9ucyBmcm9tIHRoZSBzZXF1ZW5jZSBwYXJhbWV0ZXJzZXQuCiB2b2lkIEZpbmRBVkNEaW1lbnNpb25zKAogICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmc2VxUGFyYW1TZXQsCkBAIC02Myw3ICs4MiwyNCBAQAogICAgICAgICBwYXJzZVVFKCZicik7ICAvLyBiaXRfZGVwdGhfbHVtYV9taW51czgKICAgICAgICAgcGFyc2VVRSgmYnIpOyAgLy8gYml0X2RlcHRoX2Nocm9tYV9taW51czgKICAgICAgICAgYnIuc2tpcEJpdHMoMSk7ICAvLyBxcHByaW1lX3lfemVyb190cmFuc2Zvcm1fYnlwYXNzX2ZsYWcKLSAgICAgICAgQ0hFQ0tfRVEoYnIuZ2V0Qml0cygxKSwgMHUpOyAgLy8gc2VxX3NjYWxpbmdfbWF0cml4X3ByZXNlbnRfZmxhZworCisgICAgICAgIGlmIChici5nZXRCaXRzKDEpKSB7ICAvLyBzZXFfc2NhbGluZ19tYXRyaXhfcHJlc2VudF9mbGFnCisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDg7ICsraSkgeworICAgICAgICAgICAgICAgIGlmIChici5nZXRCaXRzKDEpKSB7ICAvLyBzZXFfc2NhbGluZ19saXN0X3ByZXNlbnRfZmxhZ1tpXQorCisgICAgICAgICAgICAgICAgICAgIC8vIFdBUk5JTkc6IHRoZSBjb2RlIGJlbG93IGhhcyBub3QgZXZlciBiZWVuIGV4ZXJjaXNlZC4uLgorICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIGEgcmVhbC13b3JsZCBleGFtcGxlLgorCisgICAgICAgICAgICAgICAgICAgIGlmIChpIDwgNikgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2NhbGluZ0xpc3Q0eDRbaV0sMTYsLi4uCisgICAgICAgICAgICAgICAgICAgICAgICBza2lwU2NhbGluZ0xpc3QoJmJyLCAxNik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTY2FsaW5nTGlzdDh4OFtpLTZdLDY0LC4uLgorICAgICAgICAgICAgICAgICAgICAgICAgc2tpcFNjYWxpbmdMaXN0KCZiciwgNjQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgcGFyc2VVRSgmYnIpOyAgLy8gbG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNApAQCAtMjUxLDkgKzI4Nyw3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0aWMgc3A8QUJ1ZmZlcj4gRmluZE5BTCgKLSAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUsIHVuc2lnbmVkIG5hbFR5cGUsCi0gICAgICAgIHNpemVfdCAqc3RvcE9mZnNldCkgeworc3RhdGljIHNwPEFCdWZmZXI+IEZpbmROQUwoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUsIHVuc2lnbmVkIG5hbFR5cGUpIHsKICAgICBjb25zdCB1aW50OF90ICpuYWxTdGFydDsKICAgICBzaXplX3QgbmFsU2l6ZTsKICAgICB3aGlsZSAoZ2V0TmV4dE5BTFVuaXQoJmRhdGEsICZzaXplLCAmbmFsU3RhcnQsICZuYWxTaXplLCB0cnVlKSA9PSBPSykgewpAQCAtMjkzLDcgKzMyNyw3IEBACiAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGFjY2Vzc1VuaXQtPmRhdGEoKTsKICAgICBzaXplX3Qgc2l6ZSA9IGFjY2Vzc1VuaXQtPnNpemUoKTsKIAotICAgIHNwPEFCdWZmZXI+IHNlcVBhcmFtU2V0ID0gRmluZE5BTChkYXRhLCBzaXplLCA3LCBOVUxMKTsKKyAgICBzcDxBQnVmZmVyPiBzZXFQYXJhbVNldCA9IEZpbmROQUwoZGF0YSwgc2l6ZSwgNyk7CiAgICAgaWYgKHNlcVBhcmFtU2V0ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMzAzLDggKzMzNyw3IEBACiAgICAgRmluZEFWQ0RpbWVuc2lvbnMoCiAgICAgICAgICAgICBzZXFQYXJhbVNldCwgJndpZHRoLCAmaGVpZ2h0LCAmc2FyV2lkdGgsICZzYXJIZWlnaHQpOwogCi0gICAgc2l6ZV90IHN0b3BPZmZzZXQ7Ci0gICAgc3A8QUJ1ZmZlcj4gcGljUGFyYW1TZXQgPSBGaW5kTkFMKGRhdGEsIHNpemUsIDgsICZzdG9wT2Zmc2V0KTsKKyAgICBzcDxBQnVmZmVyPiBwaWNQYXJhbVNldCA9IEZpbmROQUwoZGF0YSwgc2l6ZSwgOCk7CiAgICAgQ0hFQ0socGljUGFyYW1TZXQgIT0gTlVMTCk7CiAKICAgICBzaXplX3QgY3NkU2l6ZSA9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwOWUzZmUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLWlmbmVxICgkKFRBUkdFVF9CVUlMRF9QREspLCB0cnVlKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9ICAgICAgIFwKLSAgICAgICAgRGF0YVVyaVNvdXJjZS5jcHAgXAotICAgICAgICBDaHJvbWl1bUhUVFBEYXRhU291cmNlLmNwcCBcCi0gICAgICAgIHN1cHBvcnQuY3BwIFwKLSAgICAgICAgY2hyb21pdW1faHR0cF9zdHViLmNwcAotCi1MT0NBTF9DX0lOQ0xVREVTOj0gXAotICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0gICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAotICAgICAgICBleHRlcm5hbC9jaHJvbWl1bSBcCi0gICAgICAgIGV4dGVybmFsL2Nocm9taXVtL2FuZHJvaWQKLQotTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gXAotICAgICAgICBsaWJiaW5kZXIgXAotICAgICAgICBsaWJzdGxwb3J0IFwKLSAgICAgICAgbGliY2hyb21pdW1fbmV0IFwKLSAgICAgICAgbGlidXRpbHMgXAotICAgICAgICBsaWJiaW5kZXIgXAotICAgICAgICBsaWJjdXRpbHMgXAotICAgICAgICBsaWJsb2cgXAotICAgICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHQgXAotICAgICAgICBsaWJkcm1mcmFtZXdvcmsKLQotaW5jbHVkZSBleHRlcm5hbC9zdGxwb3J0L2xpYnN0bHBvcnQubWsKLQotTE9DQUxfTU9EVUxFOj0gbGlic3RhZ2VmcmlnaHRfY2hyb21pdW1faHR0cAotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi1lbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9DaHJvbWl1bUhUVFBEYXRhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvQ2hyb21pdW1IVFRQRGF0YVNvdXJjZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNWMyODAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9DaHJvbWl1bUhUVFBEYXRhU291cmNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJDaHJvbWl1bUhUVFBEYXRhU291cmNlIgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0KLSNpbmNsdWRlICJpbmNsdWRlL0Nocm9taXVtSFRUUERhdGFTb3VyY2UuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0KLSNpbmNsdWRlICJzdXBwb3J0LmgiCi0KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPiAvLyBmb3IgcHJvcGVydHlfZ2V0Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6Q2hyb21pdW1IVFRQRGF0YVNvdXJjZSh1aW50MzJfdCBmbGFncykKLSAgICA6IG1GbGFncyhmbGFncyksCi0gICAgICBtU3RhdGUoRElTQ09OTkVDVEVEKSwKLSAgICAgIG1EZWxlZ2F0ZShuZXcgU2ZEZWxlZ2F0ZSksCi0gICAgICBtQ3VycmVudE9mZnNldCgwKSwKLSAgICAgIG1JT1Jlc3VsdChPSyksCi0gICAgICBtQ29udGVudFNpemUoLTEpLAotICAgICAgbURlY3J5cHRIYW5kbGUoTlVMTCksCi0gICAgICBtRHJtTWFuYWdlckNsaWVudChOVUxMKSB7Ci0gICAgbURlbGVnYXRlLT5zZXRPd25lcih0aGlzKTsKLX0KLQotQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6fkNocm9taXVtSFRUUERhdGFTb3VyY2UoKSB7Ci0gICAgZGlzY29ubmVjdCgpOwotCi0gICAgZGVsZXRlIG1EZWxlZ2F0ZTsKLSAgICBtRGVsZWdhdGUgPSBOVUxMOwotCi0gICAgY2xlYXJEUk1TdGF0ZV9sKCk7Ci0KLSAgICBpZiAobURybU1hbmFnZXJDbGllbnQgIT0gTlVMTCkgewotICAgICAgICBkZWxldGUgbURybU1hbmFnZXJDbGllbnQ7Ci0gICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50ID0gTlVMTDsKLSAgICB9Ci19Ci0KLXN0YXR1c190IENocm9taXVtSFRUUERhdGFTb3VyY2U6OmNvbm5lY3QoCi0gICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKLSAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCi0gICAgICAgIG9mZjY0X3Qgb2Zmc2V0KSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIHVpZF90IHVpZDsKLSAgICBpZiAoZ2V0VUlEKCZ1aWQpKSB7Ci0gICAgICAgIG1EZWxlZ2F0ZS0+c2V0VUlEKHVpZCk7Ci0gICAgfQotCi0jaWYgZGVmaW5lZChMT0dfTkRFQlVHKSAmJiAhTE9HX05ERUJVRwotICAgIExPR19QUkkoQU5EUk9JRF9MT0dfVkVSQk9TRSwgTE9HX1RBRywgImNvbm5lY3Qgb24gYmVoYWxmIG9mIHVpZCAlZCIsIHVpZCk7Ci0jZW5kaWYKLQotICAgIHJldHVybiBjb25uZWN0X2wodXJpLCBoZWFkZXJzLCBvZmZzZXQpOwotfQotCi1zdGF0dXNfdCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpjb25uZWN0X2woCi0gICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKLSAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCi0gICAgICAgIG9mZjY0X3Qgb2Zmc2V0KSB7Ci0gICAgaWYgKG1TdGF0ZSAhPSBESVNDT05ORUNURUQpIHsKLSAgICAgICAgZGlzY29ubmVjdF9sKCk7Ci0gICAgfQotCi0jaWYgZGVmaW5lZChMT0dfTkRFQlVHKSAmJiAhTE9HX05ERUJVRwotICAgIExPR19QUkkoQU5EUk9JRF9MT0dfVkVSQk9TRSwgTE9HX1RBRywKLSAgICAgICAgICAgICAgICAiY29ubmVjdCB0byA8VVJMIHN1cHByZXNzZWQ+IEAlbGxkIiwgb2Zmc2V0KTsKLSNlbmRpZgotCi0gICAgbVVSSSA9IHVyaTsKLSAgICBtQ29udGVudFR5cGUgPSBTdHJpbmc4KCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKLQotICAgIGlmIChoZWFkZXJzICE9IE5VTEwpIHsKLSAgICAgICAgbUhlYWRlcnMgPSAqaGVhZGVyczsKLSAgICB9IGVsc2UgewotICAgICAgICBtSGVhZGVycy5jbGVhcigpOwotICAgIH0KLQotICAgIG1TdGF0ZSA9IENPTk5FQ1RJTkc7Ci0gICAgbUNvbnRlbnRTaXplID0gLTE7Ci0gICAgbUN1cnJlbnRPZmZzZXQgPSBvZmZzZXQ7Ci0KLSAgICBtRGVsZWdhdGUtPmluaXRpYXRlQ29ubmVjdGlvbihtVVJJLmNfc3RyKCksICZtSGVhZGVycywgb2Zmc2V0KTsKLQotICAgIHdoaWxlIChtU3RhdGUgPT0gQ09OTkVDVElORyB8fCBtU3RhdGUgPT0gRElTQ09OTkVDVElORykgewotICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOwotICAgIH0KLQotICAgIHJldHVybiBtU3RhdGUgPT0gQ09OTkVDVEVEID8gT0sgOiBtSU9SZXN1bHQ7Ci19Ci0KLXZvaWQgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6b25SZWRpcmVjdChjb25zdCBjaGFyICp1cmwpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIG1VUkkgPSB1cmw7Ci19Ci0KLXZvaWQgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6b25Db25uZWN0aW9uRXN0YWJsaXNoZWQoCi0gICAgICAgIGludDY0X3QgY29udGVudFNpemUsIGNvbnN0IGNoYXIgKmNvbnRlbnRUeXBlKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtU3RhdGUgIT0gQ09OTkVDVElORykgewotICAgICAgICAvLyBXZSBtYXkgaGF2ZSBpbml0aWF0ZWQgZGlzY29ubmVjdGlvbi4KLSAgICAgICAgQ0hFQ0tfRVEobVN0YXRlLCBESVNDT05ORUNUSU5HKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1TdGF0ZSA9IENPTk5FQ1RFRDsKLSAgICBtQ29udGVudFNpemUgPSAoY29udGVudFNpemUgPCAwKSA/IC0xIDogY29udGVudFNpemUgKyBtQ3VycmVudE9mZnNldDsKLSAgICBtQ29udGVudFR5cGUgPSBTdHJpbmc4KGNvbnRlbnRUeXBlKTsKLSAgICBtQ29uZGl0aW9uLmJyb2FkY2FzdCgpOwotfQotCi12b2lkIENocm9taXVtSFRUUERhdGFTb3VyY2U6Om9uQ29ubmVjdGlvbkZhaWxlZChzdGF0dXNfdCBlcnIpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIG1TdGF0ZSA9IERJU0NPTk5FQ1RFRDsKLSAgICBtQ29uZGl0aW9uLmJyb2FkY2FzdCgpOwotCi0gICAgLy8gbVVSSS5jbGVhcigpOwotCi0gICAgbUlPUmVzdWx0ID0gZXJyOwotfQotCi12b2lkIENocm9taXVtSFRUUERhdGFTb3VyY2U6OmRpc2Nvbm5lY3QoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBkaXNjb25uZWN0X2woKTsKLX0KLQotdm9pZCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpkaXNjb25uZWN0X2woKSB7Ci0gICAgaWYgKG1TdGF0ZSA9PSBESVNDT05ORUNURUQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1TdGF0ZSA9IERJU0NPTk5FQ1RJTkc7Ci0gICAgbUlPUmVzdWx0ID0gLUVJTlRSOwotCi0gICAgbURlbGVnYXRlLT5pbml0aWF0ZURpc2Nvbm5lY3QoKTsKLQotICAgIHdoaWxlIChtU3RhdGUgPT0gRElTQ09OTkVDVElORykgewotICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOwotICAgIH0KLQotICAgIENIRUNLX0VRKChpbnQpbVN0YXRlLCAoaW50KURJU0NPTk5FQ1RFRCk7Ci19Ci0KLXN0YXR1c190IENocm9taXVtSFRUUERhdGFTb3VyY2U6OmluaXRDaGVjaygpIGNvbnN0IHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgcmV0dXJuIG1TdGF0ZSA9PSBDT05ORUNURUQgPyBPSyA6IE5PX0lOSVQ7Ci19Ci0KLXNzaXplX3QgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobVN0YXRlICE9IENPTk5FQ1RFRCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0jaWYgMAotICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICBpZiAocHJvcGVydHlfZ2V0KCJtZWRpYS5zdGFnZWZyaWdodC5kaXNhYmxlLW5ldCIsIHZhbHVlLCAwKQotICAgICAgICAgICAgJiYgKCFzdHJjYXNlY21wKHZhbHVlLCAidHJ1ZSIpIHx8ICFzdHJjbXAodmFsdWUsICIxIikpKSB7Ci0gICAgICAgIExPR19QUkkoQU5EUk9JRF9MT0dfSU5GTywgTE9HX1RBRywgIlNpbXVsYXRpbmcgdGhhdCB0aGUgbmV0d29yayBpcyBkb3duLiIpOwotICAgICAgICBkaXNjb25uZWN0X2woKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgIH0KLSNlbmRpZgotCi0gICAgaWYgKG9mZnNldCAhPSBtQ3VycmVudE9mZnNldCkgewotICAgICAgICBBU3RyaW5nIHRtcCA9IG1VUkk7Ci0gICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IHRtcEhlYWRlcnMgPSBtSGVhZGVyczsKLQotICAgICAgICBkaXNjb25uZWN0X2woKTsKLQotICAgICAgICBzdGF0dXNfdCBlcnIgPSBjb25uZWN0X2wodG1wLmNfc3RyKCksICZ0bXBIZWFkZXJzLCBvZmZzZXQpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtU3RhdGUgPSBSRUFESU5HOwotCi0gICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0KLSAgICBtRGVsZWdhdGUtPmluaXRpYXRlUmVhZChkYXRhLCBzaXplKTsKLQotICAgIHdoaWxlIChtU3RhdGUgPT0gUkVBRElORykgewotICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOwotICAgIH0KLQotICAgIGlmIChtSU9SZXN1bHQgPCBPSykgewotICAgICAgICByZXR1cm4gbUlPUmVzdWx0OwotICAgIH0KLQotICAgIGlmIChtU3RhdGUgPT0gQ09OTkVDVEVEKSB7Ci0gICAgICAgIGludDY0X3QgZGVsYXlVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWVVczsKLQotICAgICAgICAvLyBUaGUgcmVhZCBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwsIG1JT1Jlc3VsdCBjb250YWlucwotICAgICAgICAvLyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuCi0gICAgICAgIGFkZEJhbmR3aWR0aE1lYXN1cmVtZW50KG1JT1Jlc3VsdCwgZGVsYXlVcyk7Ci0KLSAgICAgICAgbUN1cnJlbnRPZmZzZXQgKz0gbUlPUmVzdWx0OwotICAgICAgICByZXR1cm4gbUlPUmVzdWx0OwotICAgIH0KLQotICAgIHJldHVybiBFUlJPUl9JTzsKLX0KLQotdm9pZCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpvblJlYWRDb21wbGV0ZWQoc3NpemVfdCBzaXplKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIG1JT1Jlc3VsdCA9IHNpemU7Ci0KLSAgICBpZiAobVN0YXRlID09IFJFQURJTkcpIHsKLSAgICAgICAgbVN0YXRlID0gQ09OTkVDVEVEOwotICAgICAgICBtQ29uZGl0aW9uLmJyb2FkY2FzdCgpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6Z2V0U2l6ZShvZmY2NF90ICpzaXplKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtQ29udGVudFNpemUgPCAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICAqc2l6ZSA9IG1Db250ZW50U2l6ZTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotdWludDMyX3QgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6ZmxhZ3MoKSB7Ci0gICAgcmV0dXJuIGtXYW50c1ByZWZldGNoaW5nIHwga0lzSFRUUEJhc2VkU291cmNlOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6SW5pdGlhdGVSZWFkKAotICAgICAgICBDaHJvbWl1bUhUVFBEYXRhU291cmNlICptZSwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBtZS0+aW5pdGlhdGVSZWFkKGRhdGEsIHNpemUpOwotfQotCi12b2lkIENocm9taXVtSFRUUERhdGFTb3VyY2U6OmluaXRpYXRlUmVhZCh2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIG1EZWxlZ2F0ZS0+aW5pdGlhdGVSZWFkKGRhdGEsIHNpemUpOwotfQotCi12b2lkIENocm9taXVtSFRUUERhdGFTb3VyY2U6Om9uRGlzY29ubmVjdENvbXBsZXRlKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgQ0hFQ0tfRVEoKGludCltU3RhdGUsIChpbnQpRElTQ09OTkVDVElORyk7Ci0KLSAgICBtU3RhdGUgPSBESVNDT05ORUNURUQ7Ci0gICAgLy8gbVVSSS5jbGVhcigpOwotICAgIG1JT1Jlc3VsdCA9IC1FTk9UQ09OTjsKLQotICAgIG1Db25kaXRpb24uYnJvYWRjYXN0KCk7Ci19Ci0KLXNwPERlY3J5cHRIYW5kbGU+IENocm9taXVtSFRUUERhdGFTb3VyY2U6OkRybUluaXRpYWxpemF0aW9uKGNvbnN0IGNoYXIqIG1pbWUpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKG1Ecm1NYW5hZ2VyQ2xpZW50ID09IE5VTEwpIHsKLSAgICAgICAgbURybU1hbmFnZXJDbGllbnQgPSBuZXcgRHJtTWFuYWdlckNsaWVudCgpOwotICAgIH0KLQotICAgIGlmIChtRHJtTWFuYWdlckNsaWVudCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGlmIChtRGVjcnlwdEhhbmRsZSA9PSBOVUxMKSB7Ci0gICAgICAgIC8qIE5vdGUgaWYgcmVkaXJlY3Qgb2NjdXJzLCBtVXJpIGlzIHRoZSByZWRpcmVjdCB1cmkgaW5zdGVhZCBvZiB0aGUKLSAgICAgICAgICogb3JpZ2luYWwgb25lCi0gICAgICAgICAqLwotICAgICAgICBtRGVjcnlwdEhhbmRsZSA9IG1Ecm1NYW5hZ2VyQ2xpZW50LT5vcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgICAgICAgICAgICAgU3RyaW5nOChtVVJJLmNfc3RyKCkpLCBtaW1lKTsKLSAgICB9Ci0KLSAgICBpZiAobURlY3J5cHRIYW5kbGUgPT0gTlVMTCkgewotICAgICAgICBkZWxldGUgbURybU1hbmFnZXJDbGllbnQ7Ci0gICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50ID0gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gbURlY3J5cHRIYW5kbGU7Ci19Ci0KLXZvaWQgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6Z2V0RHJtSW5mbygKLSAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gJmhhbmRsZSwgRHJtTWFuYWdlckNsaWVudCAqKmNsaWVudCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBoYW5kbGUgPSBtRGVjcnlwdEhhbmRsZTsKLSAgICAqY2xpZW50ID0gbURybU1hbmFnZXJDbGllbnQ7Ci19Ci0KLVN0cmluZzggQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6Z2V0VXJpKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICByZXR1cm4gU3RyaW5nOChtVVJJLmNfc3RyKCkpOwotfQotCi1TdHJpbmc4IENocm9taXVtSFRUUERhdGFTb3VyY2U6OmdldE1JTUVUeXBlKCkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICByZXR1cm4gbUNvbnRlbnRUeXBlOwotfQotCi12b2lkIENocm9taXVtSFRUUERhdGFTb3VyY2U6OmNsZWFyRFJNU3RhdGVfbCgpIHsKLSAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTCkgewotICAgICAgICAvLyBUbyByZWxlYXNlIG1EZWNyeXB0SGFuZGxlCi0gICAgICAgIENIRUNLKG1Ecm1NYW5hZ2VyQ2xpZW50KTsKLSAgICAgICAgbURybU1hbmFnZXJDbGllbnQtPmNsb3NlRGVjcnlwdFNlc3Npb24obURlY3J5cHRIYW5kbGUpOwotICAgICAgICBtRGVjcnlwdEhhbmRsZSA9IE5VTEw7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpyZWNvbm5lY3RBdE9mZnNldChvZmY2NF90IG9mZnNldCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobVVSSS5lbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBMT0dfUFJJKEFORFJPSURfTE9HX0lORk8sIExPR19UQUcsICJSZWNvbm5lY3RpbmcuLi4iKTsKLSAgICBzdGF0dXNfdCBlcnIgPSBjb25uZWN0X2wobVVSSS5jX3N0cigpLCAmbUhlYWRlcnMsIG9mZnNldCk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBMT0dfUFJJKEFORFJPSURfTE9HX0lORk8sIExPR19UQUcsICJSZWNvbm5lY3QgZmFpbGVkIHcvIGVyciAweCUwOHgiLCBlcnIpOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8vIHN0YXRpYwotc3RhdHVzX3QgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6VXBkYXRlUHJveHlDb25maWcoCi0gICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGludDMyX3QgcG9ydCwgY29uc3QgY2hhciAqZXhjbHVzaW9uTGlzdCkgewotICAgIHJldHVybiBTZkRlbGVnYXRlOjpVcGRhdGVQcm94eUNvbmZpZyhob3N0LCBwb3J0LCBleGNsdXNpb25MaXN0KTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9EYXRhVXJpU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvRGF0YVVyaVNvdXJjZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZjNmYTEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9EYXRhVXJpU291cmNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8aW5jbHVkZS9EYXRhVXJpU291cmNlLmg+Ci0KLSNpbmNsdWRlIDxuZXQvYmFzZS9kYXRhX3VybC5oPgotI2luY2x1ZGUgPGdvb2dsZXVybC9zcmMvZ3VybC5oPgotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotRGF0YVVyaVNvdXJjZTo6RGF0YVVyaVNvdXJjZShjb25zdCBjaGFyICp1cmkpIDoKLSAgICBtRGF0YVVyaSh1cmkpLAotICAgIG1Jbml0ZWQoTk9fSU5JVCkgewotCi0gICAgLy8gQ29weTE6IGNvbnN0IGNoYXIgKnVyaSAtPiBTdHJpbmc4IG1EYXRhVXJpLgotICAgIHN0ZDo6c3RyaW5nIG1pbWVUeXBlU3RyLCB1bnVzZWRDaGFyc2V0U3RyLCBkYXRhU3RyOwotICAgIC8vIENvcHkyOiBTdHJpbmc4IG1EYXRhVXJpIC0+IHN0ZDo6c3RyaW5nCi0gICAgY29uc3QgYm9vbCByZXQgPSBuZXQ6OkRhdGFVUkw6OlBhcnNlKAotICAgICAgICAgICAgR1VSTChzdGQ6OnN0cmluZyhtRGF0YVVyaS5zdHJpbmcoKSkpLAotICAgICAgICAgICAgJm1pbWVUeXBlU3RyLCAmdW51c2VkQ2hhcnNldFN0ciwgJmRhdGFTdHIpOwotICAgIC8vIENvcHkzOiBzdGQ6OnN0cmluZyBkYXRhU3RyIC0+IEFTdHJpbmcgbURhdGEKLSAgICBtRGF0YS5zZXRUbyhkYXRhU3RyLmRhdGEoKSwgZGF0YVN0ci5sZW5ndGgoKSk7Ci0gICAgbUluaXRlZCA9IHJldCA/IE9LIDogVU5LTk9XTl9FUlJPUjsKLQotICAgIC8vIFRoZSBjaHJvbWl1bSBkYXRhIHVybCBpbXBsZW1lbnRhdGlvbiBkZWZhdWx0cyB0byB1c2luZyAidGV4dC9wbGFpbiIKLSAgICAvLyBpZiBubyBtaW1lIHR5cGUgaXMgc3BlY2lmaWVkLiBXZSBwcmVmZXIgdG8gbGVhdmUgdGhpcyB1bnNwZWNpZmllZAotICAgIC8vIGluc3RlYWQsIHNpbmNlIHRoZSBtaW1lIHR5cGUgaXMgc25pZmZlZCBpbiBtb3N0IGNhc2VzLgotICAgIGlmIChtaW1lVHlwZVN0ciAhPSAidGV4dC9wbGFpbiIpIHsKLSAgICAgICAgbU1pbWVUeXBlID0gbWltZVR5cGVTdHIuY19zdHIoKTsKLSAgICB9Ci19Ci0KLXNzaXplX3QgRGF0YVVyaVNvdXJjZTo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpvdXQsIHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKG1Jbml0ZWQgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIG1Jbml0ZWQ7Ci0gICAgfQotCi0gICAgY29uc3Qgb2ZmNjRfdCBsZW5ndGggPSBtRGF0YS5zaXplKCk7Ci0gICAgaWYgKG9mZnNldCA+PSBsZW5ndGgpIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgY29uc3QgY2hhciAqZGF0YUJ1ZiA9IG1EYXRhLmNfc3RyKCk7Ci0gICAgY29uc3Qgc2l6ZV90IGJ5dGVzVG9Db3B5ID0KLSAgICAgICAgICAgIG9mZnNldCArIHNpemUgPj0gbGVuZ3RoID8gKGxlbmd0aCAtIG9mZnNldCkgOiBzaXplOwotCi0gICAgaWYgKGJ5dGVzVG9Db3B5ID4gMCkgewotICAgICAgICBtZW1jcHkob3V0LCBkYXRhQnVmICsgb2Zmc2V0LCBieXRlc1RvQ29weSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGJ5dGVzVG9Db3B5OwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9jaHJvbWl1bV9odHRwX3N0dWIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9jaHJvbWl1bV9odHRwX3N0dWIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODlmNmRlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvY2hyb21pdW1faHR0cF9zdHViLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8ZGxmY24uaD4KLQotI2luY2x1ZGUgPGluY2x1ZGUvY2hyb21pdW1faHR0cF9zdHViLmg+Ci0jaW5jbHVkZSA8aW5jbHVkZS9DaHJvbWl1bUhUVFBEYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8aW5jbHVkZS9EYXRhVXJpU291cmNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotSFRUUEJhc2UgKmNyZWF0ZUNocm9taXVtSFRUUERhdGFTb3VyY2UodWludDMyX3QgZmxhZ3MpIHsKLSAgICByZXR1cm4gbmV3IENocm9taXVtSFRUUERhdGFTb3VyY2UoZmxhZ3MpOwotfQotCi1zdGF0dXNfdCBVcGRhdGVDaHJvbWl1bUhUVFBEYXRhU291cmNlUHJveHlDb25maWcoCi0gICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGludDMyX3QgcG9ydCwgY29uc3QgY2hhciAqZXhjbHVzaW9uTGlzdCkgewotICAgIHJldHVybiBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpVcGRhdGVQcm94eUNvbmZpZyhob3N0LCBwb3J0LCBleGNsdXNpb25MaXN0KTsKLX0KLQotRGF0YVNvdXJjZSAqY3JlYXRlRGF0YVVyaVNvdXJjZShjb25zdCBjaGFyICp1cmkpIHsKLSAgICByZXR1cm4gbmV3IERhdGFVcmlTb3VyY2UodXJpKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9zdXBwb3J0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvc3VwcG9ydC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZTQ4NzcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9zdXBwb3J0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJDaHJvbWl1bUhUVFBEYXRhU291cmNlU3VwcG9ydCIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgotCi0jaW5jbHVkZSAic3VwcG9ydC5oIgotCi0jaW5jbHVkZSAiYW5kcm9pZC9uZXQvYW5kcm9pZF9uZXR3b3JrX2xpYnJhcnlfaW1wbC5oIgotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZC5oIgotI2luY2x1ZGUgIm5ldC9iYXNlL2NlcnRfdmVyaWZpZXIuaCIKLSNpbmNsdWRlICJuZXQvYmFzZS9jb29raWVfbW9uc3Rlci5oIgotI2luY2x1ZGUgIm5ldC9iYXNlL2hvc3RfcmVzb2x2ZXIuaCIKLSNpbmNsdWRlICJuZXQvYmFzZS9zc2xfY29uZmlnX3NlcnZpY2UuaCIKLSNpbmNsdWRlICJuZXQvaHR0cC9odHRwX2F1dGhfaGFuZGxlcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAibmV0L2h0dHAvaHR0cF9jYWNoZS5oIgotI2luY2x1ZGUgIm5ldC9wcm94eS9wcm94eV9jb25maWdfc2VydmljZV9hbmRyb2lkLmgiCi0KLSNpbmNsdWRlICJpbmNsdWRlL0Nocm9taXVtSFRUUERhdGFTb3VyY2UuaCIKLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIGludGVyZmFjZSBkZWZpbmVkIGluIElBdWRpb1NlcnZpY2UuYWlkbAotY2xhc3MgSUF1ZGlvU2VydmljZSA6IHB1YmxpYyBJSW50ZXJmYWNlCi17Ci1wdWJsaWM6Ci0gICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShBdWRpb1NlcnZpY2UpOwotCi0gICAgdmlydHVhbCBpbnQgdmVyaWZ5WDUwOUNlcnRDaGFpbigKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgY2VydF9jaGFpbiwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0bmFtZSwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhdXRoX3R5cGUpID0gMDsKLX07Ci0KLWNsYXNzIEJwQXVkaW9TZXJ2aWNlIDogcHVibGljIEJwSW50ZXJmYWNlPElBdWRpb1NlcnZpY2U+Ci17Ci1wdWJsaWM6Ci0gICAgQnBBdWRpb1NlcnZpY2UoY29uc3Qgc3A8SUJpbmRlcj4mIGltcGwpCi0gICAgICAgIDogQnBJbnRlcmZhY2U8SUF1ZGlvU2VydmljZT4oaW1wbCkKLSAgICB7Ci0gICAgfQotCi0gICAgdmlydHVhbCBpbnQgdmVyaWZ5WDUwOUNlcnRDaGFpbigKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgY2VydF9jaGFpbiwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0bmFtZSwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhdXRoX3R5cGUpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9TZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotCi0gICAgICAgIC8vIFRoZSB2ZWN0b3Igb2Ygc3RkOjpzdHJpbmcgd2UgZ2V0IGlzbid0IHJlYWxseSBhIHZlY3RvciBvZiBzdHJpbmdzLAotICAgICAgICAvLyBidXQgcmF0aGVyIGEgdmVjdG9yIG9mIGJpbmFyeSBjZXJ0aWZpY2F0ZSBkYXRhLiBJZiB3ZSB0cnkgdG8gcGFzcwotICAgICAgICAvLyBpdCB0byBKYXZhIGxhbmd1YWdlIGNvZGUgYXMgYSBzdHJpbmcsIGl0IGVuZHMgdXAgbWFuZ2xlZCBvbiB0aGUgb3RoZXIKLSAgICAgICAgLy8gc2lkZSwgc28gc2VuZCB0aGVtIGFzIGJ5dGVzIGluc3RlYWQuCi0gICAgICAgIC8vIFNpbmNlIHdlIGNhbid0IHNlbmQgYW4gYXJyYXkgb2YgYnl0ZSBhcnJheXMsIHNlbmQgYSBzaW5nbGUgYXJyYXksCi0gICAgICAgIC8vIHdoaWNoIHdpbGwgYmUgc3BsaXQgb3V0IGJ5IHRoZSByZWNpcGllbnQuCi0KLSAgICAgICAgaW50IG51bWNlcnRzID0gY2VydF9jaGFpbi5zaXplKCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihudW1jZXJ0cyk7Ci0gICAgICAgIHNpemVfdCB0b3RhbCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtY2VydHM7IGkrKykgewotICAgICAgICAgICAgdG90YWwgKz0gY2VydF9jaGFpbltpXS5zaXplKCk7Ci0gICAgICAgIH0KLSAgICAgICAgc2l6ZV90IGJ5dGVzaXplID0gdG90YWwgKyBudW1jZXJ0cyAqIDQ7Ci0gICAgICAgIHVpbnQ4X3QgKmJ5dGVzID0gKHVpbnQ4X3QqKSBtYWxsb2MoYnl0ZXNpemUpOwotICAgICAgICBpZiAoIWJ5dGVzKSB7Ci0gICAgICAgICAgICByZXR1cm4gNTsgLy8gU1NMX0lOVkFMSUQKLSAgICAgICAgfQotICAgICAgICBBTE9HVigiJWQgY2VydHM6ICVkIC0+ICVkIiwgbnVtY2VydHMsIHRvdGFsLCBieXRlc2l6ZSk7Ci0KLSAgICAgICAgaW50IG9mZnNldCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtY2VydHM7IGkrKykgewotICAgICAgICAgICAgaW50MzJfdCBjZXJ0c2l6ZSA9IGNlcnRfY2hhaW5baV0uc2l6ZSgpOwotICAgICAgICAgICAgLy8gc3RvcmUgdGhpcyBpbiBhIGtub3duIG9yZGVyLCB3aGljaCBqdXN0IGhhcHBlbnMgdG8gbWF0Y2ggdGhlIGRlZmF1bHQKLSAgICAgICAgICAgIC8vIGJ5dGUgb3JkZXIgb2YgYSBqYXZhIEJ5dGVCdWZmZXIKLSAgICAgICAgICAgIGludDMyX3QgYmlnc2l6ZSA9IGh0b25sKGNlcnRzaXplKTsKLSAgICAgICAgICAgIEFMT0dWKCJjZXJ0ICVkLCBzaXplICVkIiwgaSwgY2VydHNpemUpOwotICAgICAgICAgICAgbWVtY3B5KGJ5dGVzICsgb2Zmc2V0LCAmYmlnc2l6ZSwgc2l6ZW9mKGJpZ3NpemUpKTsKLSAgICAgICAgICAgIG9mZnNldCArPSBzaXplb2YoYmlnc2l6ZSk7Ci0gICAgICAgICAgICBtZW1jcHkoYnl0ZXMgKyBvZmZzZXQsIGNlcnRfY2hhaW5baV0uZGF0YSgpLCBjZXJ0c2l6ZSk7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gY2VydHNpemU7Ci0gICAgICAgIH0KLSAgICAgICAgZGF0YS53cml0ZUJ5dGVBcnJheShieXRlc2l6ZSwgYnl0ZXMpOwotICAgICAgICBmcmVlKGJ5dGVzKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cmluZzE2KFN0cmluZzE2KGhvc3RuYW1lLmNfc3RyKCkpKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cmluZzE2KFN0cmluZzE2KGF1dGhfdHlwZS5jX3N0cigpKSk7Ci0KLSAgICAgICAgaW50MzJfdCByZXN1bHQ7Ci0gICAgICAgIGlmIChyZW1vdGUoKS0+dHJhbnNhY3QoSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwgZGF0YSwgJnJlcGx5KSAhPSBOT19FUlJPUgotICAgICAgICAgICAgICAgIHx8IHJlcGx5LnJlYWRFeGNlcHRpb25Db2RlKCkgPCAwIHx8IHJlcGx5LnJlYWRJbnQzMigmcmVzdWx0KSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIDU7IC8vIFNTTF9JTlZBTElEOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi19OwotCi1JTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoQXVkaW9TZXJ2aWNlLCAiYW5kcm9pZC5tZWRpYS5JQXVkaW9TZXJ2aWNlIik7Ci0KLQotc3RhdGljIE11dGV4IGdOZXR3b3JrVGhyZWFkTG9jazsKLXN0YXRpYyBiYXNlOjpUaHJlYWQgKmdOZXR3b3JrVGhyZWFkID0gTlVMTDsKLXN0YXRpYyBzY29wZWRfcmVmcHRyPFNmUmVxdWVzdENvbnRleHQ+IGdSZXFDb250ZXh0Owotc3RhdGljIHNjb3BlZF9wdHI8bmV0OjpOZXR3b3JrQ2hhbmdlTm90aWZpZXI+IGdOZXR3b3JrQ2hhbmdlTm90aWZpZXI7Ci0KLWJvb2wgbG9nTWVzc2FnZUhhbmRsZXIoCi0gICAgICAgIGludCBzZXZlcml0eSwKLSAgICAgICAgY29uc3QgY2hhciogZmlsZSwKLSAgICAgICAgaW50IGxpbmUsCi0gICAgICAgIHNpemVfdCBtZXNzYWdlX3N0YXJ0LAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gICAgaW50IGFuZHJvaWRTZXZlcml0eSA9IEFORFJPSURfTE9HX1ZFUkJPU0U7Ci0gICAgc3dpdGNoKHNldmVyaXR5KSB7Ci0gICAgY2FzZSBsb2dnaW5nOjpMT0dfRkFUQUw6Ci0gICAgICAgIGFuZHJvaWRTZXZlcml0eSA9IEFORFJPSURfTE9HX0ZBVEFMOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIGxvZ2dpbmc6OkxPR19FUlJPUl9SRVBPUlQ6Ci0gICAgY2FzZSBsb2dnaW5nOjpMT0dfRVJST1I6Ci0gICAgICAgIGFuZHJvaWRTZXZlcml0eSA9IEFORFJPSURfTE9HX0VSUk9SOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIGxvZ2dpbmc6OkxPR19XQVJOSU5HOgotICAgICAgICBhbmRyb2lkU2V2ZXJpdHkgPSBBTkRST0lEX0xPR19XQVJOOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBhbmRyb2lkU2V2ZXJpdHkgPSBBTkRST0lEX0xPR19WRVJCT1NFOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgYW5kcm9pZF9wcmludExvZyhhbmRyb2lkU2V2ZXJpdHksICJjaHJvbWl1bS1saWJzdGFnZWZyaWdodCIsCi0gICAgICAgICAgICAgICAgICAgICIlczolZDogJXMiLCBmaWxlLCBsaW5lLCBzdHIuY19zdHIoKSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1zdHJ1Y3QgQXV0b1ByaW9yaXR5U2F2ZXIgewotICAgIEF1dG9Qcmlvcml0eVNhdmVyKCkKLSAgICAgICAgOiBtVElEKGFuZHJvaWRHZXRUaWQoKSksCi0gICAgICAgICAgbVByZXZQcmlvcml0eShhbmRyb2lkR2V0VGhyZWFkUHJpb3JpdHkobVRJRCkpIHsKLSAgICAgICAgYW5kcm9pZFNldFRocmVhZFByaW9yaXR5KG1USUQsIEFORFJPSURfUFJJT1JJVFlfTk9STUFMKTsKLSAgICB9Ci0KLSAgICB+QXV0b1ByaW9yaXR5U2F2ZXIoKSB7Ci0gICAgICAgIGFuZHJvaWRTZXRUaHJlYWRQcmlvcml0eShtVElELCBtUHJldlByaW9yaXR5KTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgcGlkX3QgbVRJRDsKLSAgICBpbnQgbVByZXZQcmlvcml0eTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEF1dG9Qcmlvcml0eVNhdmVyKTsKLX07Ci0KLXN0YXRpYyB2b2lkIEluaXRpYWxpemVOZXR3b3JrVGhyZWFkSWZOZWNlc3NhcnkoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKGdOZXR3b3JrVGhyZWFkTG9jayk7Ci0KLSAgICBpZiAoZ05ldHdvcmtUaHJlYWQgPT0gTlVMTCkgewotICAgICAgICAvLyBNYWtlIHN1cmUgYW55IHRocmVhZHMgc3Bhd25lZCBieSB0aGUgY2hyb21pdW0gZnJhbWV3b3JrIGFyZQotICAgICAgICAvLyBydW5uaW5nIGF0IG5vcm1hbCBwcmlvcml0eSBpbnN0ZWFkIG9mIGluaGVyaXRpbmcgdGhpcyB0aHJlYWQncy4KLSAgICAgICAgQXV0b1ByaW9yaXR5U2F2ZXIgc2F2ZXI7Ci0KLSAgICAgICAgZ05ldHdvcmtUaHJlYWQgPSBuZXcgYmFzZTo6VGhyZWFkKCJuZXR3b3JrIik7Ci0gICAgICAgIGJhc2U6OlRocmVhZDo6T3B0aW9ucyBvcHRpb25zOwotICAgICAgICBvcHRpb25zLm1lc3NhZ2VfbG9vcF90eXBlID0gTWVzc2FnZUxvb3A6OlRZUEVfSU87Ci0gICAgICAgIENIRUNLKGdOZXR3b3JrVGhyZWFkLT5TdGFydFdpdGhPcHRpb25zKG9wdGlvbnMpKTsKLQotICAgICAgICBnUmVxQ29udGV4dCA9IG5ldyBTZlJlcXVlc3RDb250ZXh0OwotCi0gICAgICAgIGdOZXR3b3JrQ2hhbmdlTm90aWZpZXIucmVzZXQobmV0OjpOZXR3b3JrQ2hhbmdlTm90aWZpZXI6OkNyZWF0ZSgpKTsKLQotICAgICAgICBuZXQ6OkFuZHJvaWROZXR3b3JrTGlicmFyeTo6UmVnaXN0ZXJTaGFyZWRJbnN0YW5jZSgKLSAgICAgICAgICAgICAgICBuZXcgU2ZOZXR3b3JrTGlicmFyeSk7Ci0gICAgICAgIGxvZ2dpbmc6OlNldExvZ01lc3NhZ2VIYW5kbGVyKGxvZ01lc3NhZ2VIYW5kbGVyKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIE1ZX0xPR0koY29uc3QgY2hhciAqcykgewotICAgIExPR19QUkkoQU5EUk9JRF9MT0dfSU5GTywgTE9HX1RBRywgIiVzIiwgcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIE1ZX0xPR1YoY29uc3QgY2hhciAqcykgewotI2lmICFkZWZpbmVkKExPR19OREVCVUcpIHx8IExPR19OREVCVUcgPT0gMAotICAgIExPR19QUkkoQU5EUk9JRF9MT0dfVkVSQk9TRSwgTE9HX1RBRywgIiVzIiwgcyk7Ci0jZW5kaWYKLX0KLQotU2ZOZXRMb2c6OlNmTmV0TG9nKCkKLSAgICA6IG1OZXh0SUQoMSkgewotfQotCi12b2lkIFNmTmV0TG9nOjpBZGRFbnRyeSgKLSAgICAgICAgRXZlbnRUeXBlIHR5cGUsCi0gICAgICAgIGNvbnN0IGJhc2U6OlRpbWVUaWNrcyAmdGltZSwKLSAgICAgICAgY29uc3QgU291cmNlICZzb3VyY2UsCi0gICAgICAgIEV2ZW50UGhhc2UgcGhhc2UsCi0gICAgICAgIEV2ZW50UGFyYW1ldGVycyAqcGFyYW1zKSB7Ci0jaWYgMAotICAgIE1ZX0xPR0koU3RyaW5nUHJpbnRmKAotICAgICAgICAgICAgICAgICJBZGRFbnRyeSB0aW1lPSVzIHR5cGU9JXMgc291cmNlPSVzIHBoYXNlPSVzXG4iLAotICAgICAgICAgICAgICAgIFRpY2tDb3VudFRvU3RyaW5nKHRpbWUpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgRXZlbnRUeXBlVG9TdHJpbmcodHlwZSksCi0gICAgICAgICAgICAgICAgU291cmNlVHlwZVRvU3RyaW5nKHNvdXJjZS50eXBlKSwKLSAgICAgICAgICAgICAgICBFdmVudFBoYXNlVG9TdHJpbmcocGhhc2UpKS5jX3N0cigpKTsKLSNlbmRpZgotfQotCi11aW50MzIgU2ZOZXRMb2c6Ok5leHRJRCgpIHsKLSAgICByZXR1cm4gbU5leHRJRCsrOwotfQotCi1uZXQ6Ok5ldExvZzo6TG9nTGV2ZWwgU2ZOZXRMb2c6OkdldExvZ0xldmVsKCkgY29uc3QgewotICAgIHJldHVybiBMT0dfQkFTSUM7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLVNmUmVxdWVzdENvbnRleHQ6OlNmUmVxdWVzdENvbnRleHQoKSB7Ci0gICAgbVVzZXJBZ2VudCA9IE1ha2VVc2VyQWdlbnQoKS5jX3N0cigpOwotCi0gICAgc2V0X25ldF9sb2cobmV3IFNmTmV0TG9nKCkpOwotCi0gICAgc2V0X2hvc3RfcmVzb2x2ZXIoCi0gICAgICAgIG5ldDo6Q3JlYXRlU3lzdGVtSG9zdFJlc29sdmVyKAotICAgICAgICAgICAgICAgIG5ldDo6SG9zdFJlc29sdmVyOjprRGVmYXVsdFBhcmFsbGVsaXNtLAotICAgICAgICAgICAgICAgIE5VTEwgLyogcmVzb2x2ZXJfcHJvYyAqLywKLSAgICAgICAgICAgICAgICBuZXRfbG9nKCkpKTsKLQotICAgIHNldF9zc2xfY29uZmlnX3NlcnZpY2UoCi0gICAgICAgIG5ldDo6U1NMQ29uZmlnU2VydmljZTo6Q3JlYXRlU3lzdGVtU1NMQ29uZmlnU2VydmljZSgpKTsKLQotICAgIG1Qcm94eUNvbmZpZ1NlcnZpY2UgPSBuZXcgbmV0OjpQcm94eUNvbmZpZ1NlcnZpY2VBbmRyb2lkOwotCi0gICAgc2V0X3Byb3h5X3NlcnZpY2UobmV0OjpQcm94eVNlcnZpY2U6OkNyZWF0ZVdpdGhvdXRQcm94eVJlc29sdmVyKAotICAgICAgICBtUHJveHlDb25maWdTZXJ2aWNlLCBuZXRfbG9nKCkpKTsKLQotICAgIHNldF9odHRwX3RyYW5zYWN0aW9uX2ZhY3RvcnkobmV3IG5ldDo6SHR0cENhY2hlKAotICAgICAgICAgICAgaG9zdF9yZXNvbHZlcigpLAotICAgICAgICAgICAgbmV3IG5ldDo6Q2VydFZlcmlmaWVyKCksCi0gICAgICAgICAgICBkbnNycl9yZXNvbHZlcigpLAotICAgICAgICAgICAgZG5zX2NlcnRfY2hlY2tlcigpLAotICAgICAgICAgICAgcHJveHlfc2VydmljZSgpLAotICAgICAgICAgICAgc3NsX2NvbmZpZ19zZXJ2aWNlKCksCi0gICAgICAgICAgICBuZXQ6Okh0dHBBdXRoSGFuZGxlckZhY3Rvcnk6OkNyZWF0ZURlZmF1bHQoaG9zdF9yZXNvbHZlcigpKSwKLSAgICAgICAgICAgIG5ldHdvcmtfZGVsZWdhdGUoKSwKLSAgICAgICAgICAgIG5ldF9sb2coKSwKLSAgICAgICAgICAgIE5VTEwpKTsgIC8vIGJhY2tlbmRfZmFjdG9yeQotCi0gICAgc2V0X2Nvb2tpZV9zdG9yZShuZXcgbmV0OjpDb29raWVNb25zdGVyKE5VTEwsIE5VTEwpKTsKLX0KLQotY29uc3Qgc3RkOjpzdHJpbmcgJlNmUmVxdWVzdENvbnRleHQ6OkdldFVzZXJBZ2VudChjb25zdCBHVVJMICZ1cmwpIGNvbnN0IHsKLSAgICByZXR1cm4gbVVzZXJBZ2VudDsKLX0KLQotc3RhdHVzX3QgU2ZSZXF1ZXN0Q29udGV4dDo6dXBkYXRlUHJveHlDb25maWcoCi0gICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGludDMyX3QgcG9ydCwgY29uc3QgY2hhciAqZXhjbHVzaW9uTGlzdCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtUHJveHlDb25maWdMb2NrKTsKLQotICAgIGlmIChob3N0ID09IE5VTEwgfHwgKmhvc3QgPT0gJ1wwJykgewotICAgICAgICBNWV9MT0dWKCJ1cGRhdGVQcm94eUNvbmZpZyBOVUxMIik7Ci0KLSAgICAgICAgc3RkOjpzdHJpbmcgcHJveHk7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIGV4TGlzdDsKLSAgICAgICAgbVByb3h5Q29uZmlnU2VydmljZS0+VXBkYXRlUHJveHlTZXR0aW5ncyhwcm94eSwgZXhMaXN0KTsKLSAgICB9IGVsc2UgewotI2lmICFkZWZpbmVkKExPR19OREVCVUcpIHx8IExPR19OREVCVUcgPT0gMAotICAgICAgICBMT0dfUFJJKEFORFJPSURfTE9HX1ZFUkJPU0UsIExPR19UQUcsCi0gICAgICAgICAgICAgICAgInVwZGF0ZVByb3h5Q29uZmlnICVzOiVkLCBleGNsdWRlICclcyciLAotICAgICAgICAgICAgICAgIGhvc3QsIHBvcnQsIGV4Y2x1c2lvbkxpc3QpOwotI2VuZGlmCi0KLSAgICAgICAgc3RkOjpzdHJpbmcgcHJveHkgPSBTdHJpbmdQcmludGYoIiVzOiVkIiwgaG9zdCwgcG9ydCkuY19zdHIoKTsKLSAgICAgICAgc3RkOjpzdHJpbmcgZXhMaXN0ID0gZXhjbHVzaW9uTGlzdDsKLSAgICAgICAgbVByb3h5Q29uZmlnU2VydmljZS0+VXBkYXRlUHJveHlTZXR0aW5ncyhwcm94eSwgZXhMaXN0KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLVNmTmV0d29ya0xpYnJhcnk6OlNmTmV0d29ya0xpYnJhcnkoKSB7fQotCi1TZk5ldHdvcmtMaWJyYXJ5OjpWZXJpZnlSZXN1bHQgU2ZOZXR3b3JrTGlicmFyeTo6VmVyaWZ5WDUwOUNlcnRDaGFpbigKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBjZXJ0X2NoYWluLAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaG9zdG5hbWUsCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhdXRoX3R5cGUpIHsKLQotICAgIHNwPElCaW5kZXI+IGJpbmRlciA9Ci0gICAgICAgIGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5jaGVja1NlcnZpY2UoU3RyaW5nMTYoImF1ZGlvIikpOwotICAgIGlmIChiaW5kZXIgPT0gMCkgewotICAgICAgICBBTE9HVygiVGhyZWFkIGNhbm5vdCBjb25uZWN0IHRvIHRoZSBhdWRpbyBzZXJ2aWNlIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3A8SUF1ZGlvU2VydmljZT4gc2VydmljZSA9IGludGVyZmFjZV9jYXN0PElBdWRpb1NlcnZpY2U+KGJpbmRlcik7Ci0gICAgICAgIGludCBjb2RlID0gc2VydmljZS0+dmVyaWZ5WDUwOUNlcnRDaGFpbihjZXJ0X2NoYWluLCBob3N0bmFtZSwgYXV0aF90eXBlKTsKLSAgICAgICAgQUxPR1YoInZlcmlmaWVkOiAlZCIsIGNvZGUpOwotICAgICAgICBpZiAoY29kZSA9PSAtMSkgewotICAgICAgICAgICAgcmV0dXJuIFZFUklGWV9PSzsKLSAgICAgICAgfSBlbHNlIGlmIChjb2RlID09IDIpIHsgLy8gU1NMX0lETUlTTUFUQ0gKLSAgICAgICAgICAgIHJldHVybiBWRVJJRllfQkFEX0hPU1ROQU1FOwotICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gMykgeyAvLyBTU0xfVU5UUlVTVEVECi0gICAgICAgICAgICByZXR1cm4gVkVSSUZZX05PX1RSVVNURURfUk9PVDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVkVSSUZZX0lOVk9DQVRJT05fRVJST1I7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLVNmRGVsZWdhdGU6OlNmRGVsZWdhdGUoKQotICAgIDogbU93bmVyKE5VTEwpLAotICAgICAgbVVSTFJlcXVlc3QoTlVMTCksCi0gICAgICBtUmVhZEJ1ZmZlcihuZXcgbmV0OjpJT0J1ZmZlcldpdGhTaXplKDgxOTIpKSwKLSAgICAgIG1OdW1CeXRlc1JlYWQoMCksCi0gICAgICBtTnVtQnl0ZXNUb3RhbCgwKSwKLSAgICAgIG1EYXRhRGVzdGluYXRpb24oTlVMTCksCi0gICAgICBtQXRFT1MoZmFsc2UpIHsKLSAgICBJbml0aWFsaXplTmV0d29ya1RocmVhZElmTmVjZXNzYXJ5KCk7Ci19Ci0KLVNmRGVsZWdhdGU6On5TZkRlbGVnYXRlKCkgewotICAgIENIRUNLKG1VUkxSZXF1ZXN0ID09IE5VTEwpOwotfQotCi0vLyBzdGF0aWMKLXN0YXR1c190IFNmRGVsZWdhdGU6OlVwZGF0ZVByb3h5Q29uZmlnKAotICAgICAgICBjb25zdCBjaGFyICpob3N0LCBpbnQzMl90IHBvcnQsIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QpIHsKLSAgICBJbml0aWFsaXplTmV0d29ya1RocmVhZElmTmVjZXNzYXJ5KCk7Ci0KLSAgICByZXR1cm4gZ1JlcUNvbnRleHQtPnVwZGF0ZVByb3h5Q29uZmlnKGhvc3QsIHBvcnQsIGV4Y2x1c2lvbkxpc3QpOwotfQotCi12b2lkIFNmRGVsZWdhdGU6OnNldE93bmVyKENocm9taXVtSFRUUERhdGFTb3VyY2UgKm93bmVyKSB7Ci0gICAgbU93bmVyID0gb3duZXI7Ci19Ci0KLXZvaWQgU2ZEZWxlZ2F0ZTo6c2V0VUlEKHVpZF90IHVpZCkgewotICAgIGdSZXFDb250ZXh0LT5zZXRVSUQodWlkKTsKLX0KLQotYm9vbCBTZkRlbGVnYXRlOjpnZXRVSUQodWlkX3QgKnVpZCkgY29uc3QgewotICAgIHJldHVybiBnUmVxQ29udGV4dC0+Z2V0VUlEKHVpZCk7Ci19Ci0KLXZvaWQgU2ZEZWxlZ2F0ZTo6T25SZWNlaXZlZFJlZGlyZWN0KAotICAgICAgICAgICAgbmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0LCBjb25zdCBHVVJMICZuZXdfdXJsLCBib29sICpkZWZlcl9yZWRpcmVjdCkgewotICAgIE1ZX0xPR1YoIk9uUmVjZWl2ZWRSZWRpcmVjdCIpOwotICAgIG1Pd25lci0+b25SZWRpcmVjdChuZXdfdXJsLnNwZWMoKS5jX3N0cigpKTsKLX0KLQotdm9pZCBTZkRlbGVnYXRlOjpPbkF1dGhSZXF1aXJlZCgKLSAgICAgICAgICAgIG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCwgbmV0OjpBdXRoQ2hhbGxlbmdlSW5mbyAqYXV0aF9pbmZvKSB7Ci0gICAgTVlfTE9HVigiT25BdXRoUmVxdWlyZWQiKTsKLQotICAgIGluaGVyaXRlZDo6T25BdXRoUmVxdWlyZWQocmVxdWVzdCwgYXV0aF9pbmZvKTsKLX0KLQotdm9pZCBTZkRlbGVnYXRlOjpPbkNlcnRpZmljYXRlUmVxdWVzdGVkKAotICAgICAgICAgICAgbmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0LCBuZXQ6OlNTTENlcnRSZXF1ZXN0SW5mbyAqY2VydF9yZXF1ZXN0X2luZm8pIHsKLSAgICBNWV9MT0dWKCJPbkNlcnRpZmljYXRlUmVxdWVzdGVkIik7Ci0KLSAgICBpbmhlcml0ZWQ6Ok9uQ2VydGlmaWNhdGVSZXF1ZXN0ZWQocmVxdWVzdCwgY2VydF9yZXF1ZXN0X2luZm8pOwotfQotCi12b2lkIFNmRGVsZWdhdGU6Ok9uU1NMQ2VydGlmaWNhdGVFcnJvcigKLSAgICAgICAgICAgIG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCwgaW50IGNlcnRfZXJyb3IsIG5ldDo6WDUwOUNlcnRpZmljYXRlICpjZXJ0KSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJPblNTTENlcnRpZmljYXRlRXJyb3IgY2VydF9lcnJvcj0lZFxuIiwgY2VydF9lcnJvcik7Ci0KLSAgICBpbmhlcml0ZWQ6Ok9uU1NMQ2VydGlmaWNhdGVFcnJvcihyZXF1ZXN0LCBjZXJ0X2Vycm9yLCBjZXJ0KTsKLX0KLQotdm9pZCBTZkRlbGVnYXRlOjpPbkdldENvb2tpZXMobmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0LCBib29sIGJsb2NrZWRfYnlfcG9saWN5KSB7Ci0gICAgTVlfTE9HVigiT25HZXRDb29raWVzIik7Ci19Ci0KLXZvaWQgU2ZEZWxlZ2F0ZTo6T25TZXRDb29raWUoCi0gICAgICAgIG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCwKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmNvb2tpZV9saW5lLAotICAgICAgICBjb25zdCBuZXQ6OkNvb2tpZU9wdGlvbnMgJm9wdGlvbnMsCi0gICAgICAgIGJvb2wgYmxvY2tlZF9ieV9wb2xpY3kpIHsKLSAgICBNWV9MT0dWKCJPblNldENvb2tpZSIpOwotfQotCi12b2lkIFNmRGVsZWdhdGU6Ok9uUmVzcG9uc2VTdGFydGVkKG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCkgewotICAgIGlmIChyZXF1ZXN0LT5zdGF0dXMoKS5zdGF0dXMoKSAhPSBuZXQ6OlVSTFJlcXVlc3RTdGF0dXM6OlNVQ0NFU1MpIHsKLSAgICAgICAgTVlfTE9HSShTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAgICAgICAgICJSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCBhbmQgb3NfZXJyb3IgJWQiLAotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5zdGF0dXMoKS5zdGF0dXMoKSwKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC0+c3RhdHVzKCkub3NfZXJyb3IoKSkuY19zdHIoKSk7Ci0KLSAgICAgICAgZGVsZXRlIG1VUkxSZXF1ZXN0OwotICAgICAgICBtVVJMUmVxdWVzdCA9IE5VTEw7Ci0KLSAgICAgICAgbU93bmVyLT5vbkNvbm5lY3Rpb25GYWlsZWQoRVJST1JfSU8pOwotICAgICAgICByZXR1cm47Ci0gICAgfSBlbHNlIGlmIChtUmFuZ2VSZXF1ZXN0ZWQgJiYgcmVxdWVzdC0+R2V0UmVzcG9uc2VDb2RlKCkgIT0gMjA2KSB7Ci0gICAgICAgIE1ZX0xPR0koU3RyaW5nUHJpbnRmKAotICAgICAgICAgICAgICAgICAgICAiV2UgcmVxdWVzdGVkIGEgY29udGVudCByYW5nZSwgYnV0IHNlcnZlciBkaWRuJ3QgIgotICAgICAgICAgICAgICAgICAgICAic3VwcG9ydCB0aGF0LiAocmVzcG9uZGVkIHdpdGggJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC0+R2V0UmVzcG9uc2VDb2RlKCkpLmNfc3RyKCkpOwotCi0gICAgICAgIGRlbGV0ZSBtVVJMUmVxdWVzdDsKLSAgICAgICAgbVVSTFJlcXVlc3QgPSBOVUxMOwotCi0gICAgICAgIG1Pd25lci0+b25Db25uZWN0aW9uRmFpbGVkKC1FUElQRSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgaWYgKChyZXF1ZXN0LT5HZXRSZXNwb25zZUNvZGUoKSAvIDEwMCkgIT0gMikgewotICAgICAgICBNWV9MT0dJKFN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICAgICAgICAgIlNlcnZlciByZXNwb25kZWQgd2l0aCBodHRwIHN0YXR1cyAlZCIsCi0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPkdldFJlc3BvbnNlQ29kZSgpKS5jX3N0cigpKTsKLQotICAgICAgICBkZWxldGUgbVVSTFJlcXVlc3Q7Ci0gICAgICAgIG1VUkxSZXF1ZXN0ID0gTlVMTDsKLQotICAgICAgICBtT3duZXItPm9uQ29ubmVjdGlvbkZhaWxlZChFUlJPUl9JTyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBNWV9MT0dWKCJPblJlc3BvbnNlU3RhcnRlZCIpOwotCi0gICAgc3RkOjpzdHJpbmcgaGVhZGVyczsKLSAgICByZXF1ZXN0LT5HZXRBbGxSZXNwb25zZUhlYWRlcnMoJmhlYWRlcnMpOwotCi0gICAgTVlfTE9HVihTdHJpbmdQcmludGYoInJlc3BvbnNlIGhlYWRlcnM6ICVzIiwgaGVhZGVycy5jX3N0cigpKS5jX3N0cigpKTsKLQotICAgIHN0ZDo6c3RyaW5nIGNvbnRlbnRUeXBlOwotICAgIHJlcXVlc3QtPkdldFJlc3BvbnNlSGVhZGVyQnlOYW1lKCJDb250ZW50LVR5cGUiLCAmY29udGVudFR5cGUpOwotCi0gICAgbU93bmVyLT5vbkNvbm5lY3Rpb25Fc3RhYmxpc2hlZCgKLSAgICAgICAgICAgIHJlcXVlc3QtPkdldEV4cGVjdGVkQ29udGVudFNpemUoKSwgY29udGVudFR5cGUuY19zdHIoKSk7Ci19Ci0KLXZvaWQgU2ZEZWxlZ2F0ZTo6T25SZWFkQ29tcGxldGVkKG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCwgaW50IGJ5dGVzX3JlYWQpIHsKLSAgICBpZiAoYnl0ZXNfcmVhZCA9PSAtMSkgewotICAgICAgICBNWV9MT0dJKFN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICAgICAgICAgIk9uUmVhZENvbXBsZXRlZCwgcmVhZCBmYWlsZWQsIHN0YXR1cyAlZCIsCi0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPnN0YXR1cygpLnN0YXR1cygpKS5jX3N0cigpKTsKLQotICAgICAgICBtT3duZXItPm9uUmVhZENvbXBsZXRlZChFUlJPUl9JTyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBNWV9MT0dWKFN0cmluZ1ByaW50ZigiT25SZWFkQ29tcGxldGVkLCByZWFkICVkIGJ5dGVzIiwgYnl0ZXNfcmVhZCkuY19zdHIoKSk7Ci0KLSAgICBpZiAoYnl0ZXNfcmVhZCA8IDApIHsKLSAgICAgICAgTVlfTE9HSShTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAgICAgICAgICJSZWFkIGZhaWxlZCB3LyBzdGF0dXMgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPnN0YXR1cygpLnN0YXR1cygpKS5jX3N0cigpKTsKLQotICAgICAgICBtT3duZXItPm9uUmVhZENvbXBsZXRlZChFUlJPUl9JTyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgaWYgKGJ5dGVzX3JlYWQgPT0gMCkgewotICAgICAgICBtQXRFT1MgPSB0cnVlOwotICAgICAgICBtT3duZXItPm9uUmVhZENvbXBsZXRlZChtTnVtQnl0ZXNSZWFkKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIENIRUNLX0dUKGJ5dGVzX3JlYWQsIDApOwotICAgIENIRUNLX0xFKG1OdW1CeXRlc1JlYWQgKyBieXRlc19yZWFkLCBtTnVtQnl0ZXNUb3RhbCk7Ci0KLSAgICBtZW1jcHkoKHVpbnQ4X3QgKiltRGF0YURlc3RpbmF0aW9uICsgbU51bUJ5dGVzUmVhZCwKLSAgICAgICAgICAgbVJlYWRCdWZmZXItPmRhdGEoKSwKLSAgICAgICAgICAgYnl0ZXNfcmVhZCk7Ci0KLSAgICBtTnVtQnl0ZXNSZWFkICs9IGJ5dGVzX3JlYWQ7Ci0KLSAgICByZWFkTW9yZShyZXF1ZXN0KTsKLX0KLQotdm9pZCBTZkRlbGVnYXRlOjpyZWFkTW9yZShuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QpIHsKLSAgICB3aGlsZSAobU51bUJ5dGVzUmVhZCA8IG1OdW1CeXRlc1RvdGFsKSB7Ci0gICAgICAgIHNpemVfdCBjb3B5ID0gbU51bUJ5dGVzVG90YWwgLSBtTnVtQnl0ZXNSZWFkOwotICAgICAgICBpZiAoY29weSA+IG1SZWFkQnVmZmVyLT5zaXplKCkpIHsKLSAgICAgICAgICAgIGNvcHkgPSBtUmVhZEJ1ZmZlci0+c2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG47Ci0gICAgICAgIGlmIChyZXF1ZXN0LT5SZWFkKG1SZWFkQnVmZmVyLCBjb3B5LCAmbikpIHsKLSAgICAgICAgICAgIE1ZX0xPR1YoU3RyaW5nUHJpbnRmKCJSZWFkICVkIGJ5dGVzIGRpcmVjdGx5LiIsIG4pLmNfc3RyKCkpOwotCi0gICAgICAgICAgICBDSEVDS19MRSgoc2l6ZV90KW4sIGNvcHkpOwotCi0gICAgICAgICAgICBtZW1jcHkoKHVpbnQ4X3QgKiltRGF0YURlc3RpbmF0aW9uICsgbU51bUJ5dGVzUmVhZCwKLSAgICAgICAgICAgICAgICAgICBtUmVhZEJ1ZmZlci0+ZGF0YSgpLAotICAgICAgICAgICAgICAgICAgIG4pOwotCi0gICAgICAgICAgICBtTnVtQnl0ZXNSZWFkICs9IG47Ci0KLSAgICAgICAgICAgIGlmIChuID09IDApIHsKLSAgICAgICAgICAgICAgICBtQXRFT1MgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTVlfTE9HVigicmVhZE1vcmUgcGVuZGluZyByZWFkIik7Ci0KLSAgICAgICAgICAgIGlmIChyZXF1ZXN0LT5zdGF0dXMoKS5zdGF0dXMoKSAhPSBuZXQ6OlVSTFJlcXVlc3RTdGF0dXM6OklPX1BFTkRJTkcpIHsKLSAgICAgICAgICAgICAgICBNWV9MT0dJKFN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlyZWN0IHJlYWQgZmFpbGVkIHcvIHN0YXR1cyAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5zdGF0dXMoKS5zdGF0dXMoKSkuY19zdHIoKSk7Ci0KLSAgICAgICAgICAgICAgICBtT3duZXItPm9uUmVhZENvbXBsZXRlZChFUlJPUl9JTyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtT3duZXItPm9uUmVhZENvbXBsZXRlZChtTnVtQnl0ZXNSZWFkKTsKLX0KLQotdm9pZCBTZkRlbGVnYXRlOjppbml0aWF0ZUNvbm5lY3Rpb24oCi0gICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKLSAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCi0gICAgICAgIG9mZjY0X3Qgb2Zmc2V0KSB7Ci0gICAgR1VSTCB1cmwodXJpKTsKLQotICAgIE1lc3NhZ2VMb29wICpsb29wID0gZ05ldHdvcmtUaHJlYWQtPm1lc3NhZ2VfbG9vcCgpOwotICAgIGxvb3AtPlBvc3RUYXNrKAotICAgICAgICAgICAgRlJPTV9IRVJFLAotICAgICAgICAgICAgTmV3UnVubmFibGVGdW5jdGlvbigKLSAgICAgICAgICAgICAgICAmU2ZEZWxlZ2F0ZTo6T25Jbml0aWF0ZUNvbm5lY3Rpb25XcmFwcGVyLAotICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgdXJsLAotICAgICAgICAgICAgICAgIGhlYWRlcnMsCi0gICAgICAgICAgICAgICAgb2Zmc2V0KSk7Ci0KLX0KLQotLy8gc3RhdGljCi12b2lkIFNmRGVsZWdhdGU6Ok9uSW5pdGlhdGVDb25uZWN0aW9uV3JhcHBlcigKLSAgICAgICAgU2ZEZWxlZ2F0ZSAqbWUsIEdVUkwgdXJsLAotICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKLSAgICAgICAgb2ZmNjRfdCBvZmZzZXQpIHsKLSAgICBtZS0+b25Jbml0aWF0ZUNvbm5lY3Rpb24odXJsLCBoZWFkZXJzLCBvZmZzZXQpOwotfQotCi12b2lkIFNmRGVsZWdhdGU6Om9uSW5pdGlhdGVDb25uZWN0aW9uKAotICAgICAgICBjb25zdCBHVVJMICZ1cmwsCi0gICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpleHRyYSwKLSAgICAgICAgb2ZmNjRfdCBvZmZzZXQpIHsKLSAgICBDSEVDSyhtVVJMUmVxdWVzdCA9PSBOVUxMKTsKLQotICAgIG1VUkxSZXF1ZXN0ID0gbmV3IG5ldDo6VVJMUmVxdWVzdCh1cmwsIHRoaXMpOwotICAgIG1BdEVPUyA9IGZhbHNlOwotCi0gICAgbVJhbmdlUmVxdWVzdGVkID0gZmFsc2U7Ci0KLSAgICBpZiAob2Zmc2V0ICE9IDAgfHwgZXh0cmEgIT0gTlVMTCkgewotICAgICAgICBuZXQ6Okh0dHBSZXF1ZXN0SGVhZGVycyBoZWFkZXJzID0KLSAgICAgICAgICAgIG1VUkxSZXF1ZXN0LT5leHRyYV9yZXF1ZXN0X2hlYWRlcnMoKTsKLQotICAgICAgICBpZiAob2Zmc2V0ICE9IDApIHsKLSAgICAgICAgICAgIGhlYWRlcnMuQWRkSGVhZGVyRnJvbVN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nUHJpbnRmKCJSYW5nZTogYnl0ZXM9JWxsZC0iLCBvZmZzZXQpLmNfc3RyKCkpOwotCi0gICAgICAgICAgICBtUmFuZ2VSZXF1ZXN0ZWQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGV4dHJhICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZXh0cmEtPnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgQVN0cmluZyBzOwotICAgICAgICAgICAgICAgIHMuYXBwZW5kKGV4dHJhLT5rZXlBdChpKS5zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgcy5hcHBlbmQoIjogIik7Ci0gICAgICAgICAgICAgICAgcy5hcHBlbmQoZXh0cmEtPnZhbHVlQXQoaSkuc3RyaW5nKCkpOwotCi0gICAgICAgICAgICAgICAgaGVhZGVycy5BZGRIZWFkZXJGcm9tU3RyaW5nKHMuY19zdHIoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtVVJMUmVxdWVzdC0+U2V0RXh0cmFSZXF1ZXN0SGVhZGVycyhoZWFkZXJzKTsKLSAgICB9Ci0KLSAgICBtVVJMUmVxdWVzdC0+c2V0X2NvbnRleHQoZ1JlcUNvbnRleHQpOwotCi0gICAgbVVSTFJlcXVlc3QtPlN0YXJ0KCk7Ci19Ci0KLXZvaWQgU2ZEZWxlZ2F0ZTo6aW5pdGlhdGVEaXNjb25uZWN0KCkgewotICAgIE1lc3NhZ2VMb29wICpsb29wID0gZ05ldHdvcmtUaHJlYWQtPm1lc3NhZ2VfbG9vcCgpOwotICAgIGxvb3AtPlBvc3RUYXNrKAotICAgICAgICAgICAgRlJPTV9IRVJFLAotICAgICAgICAgICAgTmV3UnVubmFibGVGdW5jdGlvbigKLSAgICAgICAgICAgICAgICAmU2ZEZWxlZ2F0ZTo6T25Jbml0aWF0ZURpc2Nvbm5lY3RXcmFwcGVyLCB0aGlzKSk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBTZkRlbGVnYXRlOjpPbkluaXRpYXRlRGlzY29ubmVjdFdyYXBwZXIoU2ZEZWxlZ2F0ZSAqbWUpIHsKLSAgICBtZS0+b25Jbml0aWF0ZURpc2Nvbm5lY3QoKTsKLX0KLQotdm9pZCBTZkRlbGVnYXRlOjpvbkluaXRpYXRlRGlzY29ubmVjdCgpIHsKLSAgICBpZiAobVVSTFJlcXVlc3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbVVSTFJlcXVlc3QtPkNhbmNlbCgpOwotCi0gICAgZGVsZXRlIG1VUkxSZXF1ZXN0OwotICAgIG1VUkxSZXF1ZXN0ID0gTlVMTDsKLQotICAgIG1Pd25lci0+b25EaXNjb25uZWN0Q29tcGxldGUoKTsKLX0KLQotdm9pZCBTZkRlbGVnYXRlOjppbml0aWF0ZVJlYWQodm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBNZXNzYWdlTG9vcCAqbG9vcCA9IGdOZXR3b3JrVGhyZWFkLT5tZXNzYWdlX2xvb3AoKTsKLSAgICBsb29wLT5Qb3N0VGFzaygKLSAgICAgICAgICAgIEZST01fSEVSRSwKLSAgICAgICAgICAgIE5ld1J1bm5hYmxlRnVuY3Rpb24oCi0gICAgICAgICAgICAgICAgJlNmRGVsZWdhdGU6Ok9uSW5pdGlhdGVSZWFkV3JhcHBlciwgdGhpcywgZGF0YSwgc2l6ZSkpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgU2ZEZWxlZ2F0ZTo6T25Jbml0aWF0ZVJlYWRXcmFwcGVyKAotICAgICAgICBTZkRlbGVnYXRlICptZSwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBtZS0+b25Jbml0aWF0ZVJlYWQoZGF0YSwgc2l6ZSk7Ci19Ci0KLXZvaWQgU2ZEZWxlZ2F0ZTo6b25Jbml0aWF0ZVJlYWQodm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBDSEVDSyhtVVJMUmVxdWVzdCAhPSBOVUxMKTsKLQotICAgIG1OdW1CeXRlc1JlYWQgPSAwOwotICAgIG1OdW1CeXRlc1RvdGFsID0gc2l6ZTsKLSAgICBtRGF0YURlc3RpbmF0aW9uID0gZGF0YTsKLQotICAgIGlmIChtQXRFT1MpIHsKLSAgICAgICAgbU93bmVyLT5vblJlYWRDb21wbGV0ZWQoMCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICByZWFkTW9yZShtVVJMUmVxdWVzdCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvc3VwcG9ydC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9zdXBwb3J0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NWExZDMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9zdXBwb3J0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgU1VQUE9SVF9IXwotCi0jZGVmaW5lIFNVUFBPUlRfSF8KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotCi0jaW5jbHVkZSAibmV0L2Jhc2UvbmV0X2xvZy5oIgotI2luY2x1ZGUgIm5ldC91cmxfcmVxdWVzdC91cmxfcmVxdWVzdC5oIgotI2luY2x1ZGUgIm5ldC91cmxfcmVxdWVzdC91cmxfcmVxdWVzdF9jb250ZXh0LmgiCi0jaW5jbHVkZSAibmV0L2Jhc2UvYW5kcm9pZF9uZXR3b3JrX2xpYnJhcnkuaCIKLSNpbmNsdWRlICJuZXQvYmFzZS9pb19idWZmZXIuaCIKLQotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0KLW5hbWVzcGFjZSBuZXQgewotICAgIHN0cnVjdCBQcm94eUNvbmZpZ1NlcnZpY2VBbmRyb2lkOwotfTsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgU2ZOZXRMb2cgOiBwdWJsaWMgbmV0OjpOZXRMb2cgewotICAgIFNmTmV0TG9nKCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgQWRkRW50cnkoCi0gICAgICAgICAgICBFdmVudFR5cGUgdHlwZSwKLSAgICAgICAgICAgIGNvbnN0IGJhc2U6OlRpbWVUaWNrcyAmdGltZSwKLSAgICAgICAgICAgIGNvbnN0IFNvdXJjZSAmc291cmNlLAotICAgICAgICAgICAgRXZlbnRQaGFzZSBwaGFzZSwKLSAgICAgICAgICAgIEV2ZW50UGFyYW1ldGVycyAqcGFyYW1zKTsKLQotICAgIHZpcnR1YWwgdWludDMyIE5leHRJRCgpOwotICAgIHZpcnR1YWwgTG9nTGV2ZWwgR2V0TG9nTGV2ZWwoKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICB1aW50MzIgbU5leHRJRDsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNmTmV0TG9nKTsKLX07Ci0KLXN0cnVjdCBTZlJlcXVlc3RDb250ZXh0IDogcHVibGljIG5ldDo6VVJMUmVxdWVzdENvbnRleHQgewotICAgIFNmUmVxdWVzdENvbnRleHQoKTsKLQotICAgIHZpcnR1YWwgY29uc3Qgc3RkOjpzdHJpbmcgJkdldFVzZXJBZ2VudChjb25zdCBHVVJMICZ1cmwpIGNvbnN0OwotCi0gICAgc3RhdHVzX3QgdXBkYXRlUHJveHlDb25maWcoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpob3N0LCBpbnQzMl90IHBvcnQsIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QpOwotCi1wcml2YXRlOgotICAgIE11dGV4IG1Qcm94eUNvbmZpZ0xvY2s7Ci0KLSAgICBzdGQ6OnN0cmluZyBtVXNlckFnZW50OwotICAgIG5ldDo6UHJveHlDb25maWdTZXJ2aWNlQW5kcm9pZCAqbVByb3h5Q29uZmlnU2VydmljZTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNmUmVxdWVzdENvbnRleHQpOwotfTsKLQotLy8gVGhpcyBpcyByZXF1aXJlZCBmb3IgaHR0cHMgc3VwcG9ydCwgd2UgZG9uJ3QgcmVhbGx5IHZlcmlmeSBjZXJ0aWZpY2F0ZXMsCi0vLyB3ZSBhY2NlcHQgYW55dGhpbmcuLi4KLXN0cnVjdCBTZk5ldHdvcmtMaWJyYXJ5IDogcHVibGljIG5ldDo6QW5kcm9pZE5ldHdvcmtMaWJyYXJ5IHsKLSAgICBTZk5ldHdvcmtMaWJyYXJ5KCk7Ci0KLSAgICB2aXJ0dWFsIFZlcmlmeVJlc3VsdCBWZXJpZnlYNTA5Q2VydENoYWluKAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBjZXJ0X2NoYWluLAotICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGhvc3RuYW1lLAotICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGF1dGhfdHlwZSk7Ci0KLXByaXZhdGU6Ci0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2ZOZXR3b3JrTGlicmFyeSk7Ci19OwotCi1zdHJ1Y3QgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTsKLQotc3RydWN0IFNmRGVsZWdhdGUgOiBwdWJsaWMgbmV0OjpVUkxSZXF1ZXN0OjpEZWxlZ2F0ZSB7Ci0gICAgU2ZEZWxlZ2F0ZSgpOwotICAgIHZpcnR1YWwgflNmRGVsZWdhdGUoKTsKLQotICAgIHZvaWQgaW5pdGlhdGVDb25uZWN0aW9uKAotICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLAotICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCi0gICAgICAgICAgICBvZmY2NF90IG9mZnNldCk7Ci0KLSAgICB2b2lkIGluaXRpYXRlRGlzY29ubmVjdCgpOwotICAgIHZvaWQgaW5pdGlhdGVSZWFkKHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKLQotICAgIHZvaWQgc2V0T3duZXIoQ2hyb21pdW1IVFRQRGF0YVNvdXJjZSAqbU93bmVyKTsKLQotICAgIC8vIEdldHMgdGhlIFVJRCBvZiB0aGUgY2FsbGluZyBwcm9jZXNzCi0gICAgYm9vbCBnZXRVSUQodWlkX3QgKnVpZCkgY29uc3Q7Ci0KLSAgICB2b2lkIHNldFVJRCh1aWRfdCB1aWQpOwotCi0gICAgdmlydHVhbCB2b2lkIE9uUmVjZWl2ZWRSZWRpcmVjdCgKLSAgICAgICAgICAgIG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCwgY29uc3QgR1VSTCAmbmV3X3VybCwgYm9vbCAqZGVmZXJfcmVkaXJlY3QpOwotCi0gICAgdmlydHVhbCB2b2lkIE9uQXV0aFJlcXVpcmVkKAotICAgICAgICAgICAgbmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0LCBuZXQ6OkF1dGhDaGFsbGVuZ2VJbmZvICphdXRoX2luZm8pOwotCi0gICAgdmlydHVhbCB2b2lkIE9uQ2VydGlmaWNhdGVSZXF1ZXN0ZWQoCi0gICAgICAgICAgICBuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QsIG5ldDo6U1NMQ2VydFJlcXVlc3RJbmZvICpjZXJ0X3JlcXVlc3RfaW5mbyk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgT25TU0xDZXJ0aWZpY2F0ZUVycm9yKAotICAgICAgICAgICAgbmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0LCBpbnQgY2VydF9lcnJvciwgbmV0OjpYNTA5Q2VydGlmaWNhdGUgKmNlcnQpOwotCi0gICAgdmlydHVhbCB2b2lkIE9uR2V0Q29va2llcyhuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QsIGJvb2wgYmxvY2tlZF9ieV9wb2xpY3kpOwotCi0gICAgdmlydHVhbCB2b2lkIE9uU2V0Q29va2llKAotICAgICAgICAgICAgbmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0LAotICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmNvb2tpZV9saW5lLAotICAgICAgICAgICAgY29uc3QgbmV0OjpDb29raWVPcHRpb25zICZvcHRpb25zLAotICAgICAgICAgICAgYm9vbCBibG9ja2VkX2J5X3BvbGljeSk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgT25SZXNwb25zZVN0YXJ0ZWQobmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0KTsKLQotICAgIHZpcnR1YWwgdm9pZCBPblJlYWRDb21wbGV0ZWQobmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0LCBpbnQgYnl0ZXNfcmVhZCk7Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3QgVXBkYXRlUHJveHlDb25maWcoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpob3N0LCBpbnQzMl90IHBvcnQsIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QpOwotCi1wcml2YXRlOgotICAgIHR5cGVkZWYgRGVsZWdhdGUgaW5oZXJpdGVkOwotCi0gICAgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZSAqbU93bmVyOwotCi0gICAgbmV0OjpVUkxSZXF1ZXN0ICptVVJMUmVxdWVzdDsKLSAgICBzY29wZWRfcmVmcHRyPG5ldDo6SU9CdWZmZXJXaXRoU2l6ZT4gbVJlYWRCdWZmZXI7Ci0KLSAgICBzaXplX3QgbU51bUJ5dGVzUmVhZDsKLSAgICBzaXplX3QgbU51bUJ5dGVzVG90YWw7Ci0gICAgdm9pZCAqbURhdGFEZXN0aW5hdGlvbjsKLQotICAgIGJvb2wgbVJhbmdlUmVxdWVzdGVkOwotICAgIGJvb2wgbUF0RU9TOwotCi0gICAgdm9pZCByZWFkTW9yZShuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QpOwotCi0gICAgc3RhdGljIHZvaWQgT25Jbml0aWF0ZUNvbm5lY3Rpb25XcmFwcGVyKAotICAgICAgICAgICAgU2ZEZWxlZ2F0ZSAqbWUsCi0gICAgICAgICAgICBHVVJMIHVybCwKLSAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAotICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQpOwotCi0gICAgc3RhdGljIHZvaWQgT25Jbml0aWF0ZURpc2Nvbm5lY3RXcmFwcGVyKFNmRGVsZWdhdGUgKm1lKTsKLQotICAgIHN0YXRpYyB2b2lkIE9uSW5pdGlhdGVSZWFkV3JhcHBlcigKLSAgICAgICAgICAgIFNmRGVsZWdhdGUgKm1lLCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICB2b2lkIG9uSW5pdGlhdGVDb25uZWN0aW9uKAotICAgICAgICAgICAgY29uc3QgR1VSTCAmdXJsLAotICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCi0gICAgICAgICAgICBvZmY2NF90IG9mZnNldCk7Ci0KLSAgICB2b2lkIG9uSW5pdGlhdGVEaXNjb25uZWN0KCk7Ci0gICAgdm9pZCBvbkluaXRpYXRlUmVhZCh2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTZkRlbGVnYXRlKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gU1VQUE9SVF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cF9zdHViLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHBfc3R1Yi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkOGE4NzguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cF9zdHViLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGRsZmNuLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+Ci0KLSNpbmNsdWRlICJpbmNsdWRlL2Nocm9taXVtX2h0dHBfc3R1Yi5oIgotI2luY2x1ZGUgImluY2x1ZGUvSFRUUEJhc2UuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgYm9vbCBnRmlyc3QgPSB0cnVlOwotc3RhdGljIHZvaWQgKmdIYW5kbGU7Ci1zdGF0aWMgTXV0ZXggZ0xpYk11dGV4OwotCi1IVFRQQmFzZSAqKCpnTGliX2NyZWF0ZUNocm9taXVtSFRUUERhdGFTb3VyY2UpKHVpbnQzMl90IGZsYWdzKTsKLURhdGFTb3VyY2UgKigqZ0xpYl9jcmVhdGVEYXRhVXJpU291cmNlKShjb25zdCBjaGFyICp1cmkpOwotCi1zdGF0dXNfdCAoKmdMaWJfVXBkYXRlQ2hyb21pdW1IVFRQRGF0YVNvdXJjZVByb3h5Q29uZmlnKSgKLSAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgaW50MzJfdCBwb3J0LCBjb25zdCBjaGFyICpleGNsdXNpb25MaXN0KTsKLQotc3RhdGljIGJvb2wgbG9hZF9saWJzdGFnZWZyaWdodF9jaHJvbWl1bV9odHRwKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhnTGliTXV0ZXgpOwotICAgIHZvaWQgKnN5bTsKLQotICAgIGlmICghZ0ZpcnN0KSB7Ci0gICAgICAgIHJldHVybiAoZ0hhbmRsZSAhPSBOVUxMKTsKLSAgICB9Ci0KLSAgICBnRmlyc3QgPSBmYWxzZTsKLQotICAgIGdIYW5kbGUgPSBkbG9wZW4oImxpYnN0YWdlZnJpZ2h0X2Nocm9taXVtX2h0dHAuc28iLCBSVExEX05PVyk7Ci0gICAgaWYgKGdIYW5kbGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgc3ltID0gZGxzeW0oZ0hhbmRsZSwgImNyZWF0ZUNocm9taXVtSFRUUERhdGFTb3VyY2UiKTsKLSAgICBpZiAoc3ltID09IE5VTEwpIHsKLSAgICAgICAgZ0hhbmRsZSA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZ0xpYl9jcmVhdGVDaHJvbWl1bUhUVFBEYXRhU291cmNlID0gKEhUVFBCYXNlICooKikodWludDMyX3QpKXN5bTsKLQotICAgIHN5bSA9IGRsc3ltKGdIYW5kbGUsICJjcmVhdGVEYXRhVXJpU291cmNlIik7Ci0gICAgaWYgKHN5bSA9PSBOVUxMKSB7Ci0gICAgICAgIGdIYW5kbGUgPSBOVUxMOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGdMaWJfY3JlYXRlRGF0YVVyaVNvdXJjZSA9IChEYXRhU291cmNlICooKikoY29uc3QgY2hhciAqKSlzeW07Ci0KLSAgICBzeW0gPSBkbHN5bShnSGFuZGxlLCAiVXBkYXRlQ2hyb21pdW1IVFRQRGF0YVNvdXJjZVByb3h5Q29uZmlnIik7Ci0gICAgaWYgKHN5bSA9PSBOVUxMKSB7Ci0gICAgICAgIGdIYW5kbGUgPSBOVUxMOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGdMaWJfVXBkYXRlQ2hyb21pdW1IVFRQRGF0YVNvdXJjZVByb3h5Q29uZmlnID0KLSAgICAgICAgKHN0YXR1c190ICgqKShjb25zdCBjaGFyICosIGludDMyX3QsIGNvbnN0IGNoYXIgKikpc3ltOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLUhUVFBCYXNlICpjcmVhdGVDaHJvbWl1bUhUVFBEYXRhU291cmNlKHVpbnQzMl90IGZsYWdzKSB7Ci0gICAgaWYgKCFsb2FkX2xpYnN0YWdlZnJpZ2h0X2Nocm9taXVtX2h0dHAoKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZ0xpYl9jcmVhdGVDaHJvbWl1bUhUVFBEYXRhU291cmNlKGZsYWdzKTsKLX0KLQotc3RhdHVzX3QgVXBkYXRlQ2hyb21pdW1IVFRQRGF0YVNvdXJjZVByb3h5Q29uZmlnKAotICAgICAgICBjb25zdCBjaGFyICpob3N0LCBpbnQzMl90IHBvcnQsIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QpIHsKLSAgICBpZiAoIWxvYWRfbGlic3RhZ2VmcmlnaHRfY2hyb21pdW1faHR0cCgpKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICByZXR1cm4gZ0xpYl9VcGRhdGVDaHJvbWl1bUhUVFBEYXRhU291cmNlUHJveHlDb25maWcoCi0gICAgICAgICAgICBob3N0LCBwb3J0LCBleGNsdXNpb25MaXN0KTsKLX0KLQotRGF0YVNvdXJjZSAqY3JlYXRlRGF0YVVyaVNvdXJjZShjb25zdCBjaGFyICp1cmkpIHsKLSAgICBpZiAoIWxvYWRfbGlic3RhZ2VmcmlnaHRfY2hyb21pdW1faHR0cCgpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBnTGliX2NyZWF0ZURhdGFVcmlTb3VyY2UodXJpKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9BbmRyb2lkLm1rCmluZGV4IGZmYTY0ZjkuLmFmYjAwYWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0FuZHJvaWQubWsKQEAgLTMsNyArMyw4IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfU1JDX0ZJTEVTIDo9IFwKLSAgICAgIFNvZnRBQUMyLmNwcAorICAgICAgU29mdEFBQzIuY3BwIFwKKyAgICAgIERyY1ByZXNNb2RlV3JhcC5jcHAKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAgICAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXApAQCAtMTcsNiArMTgsOCBAQAogCiBMT0NBTF9DRkxBR1MgOj0KIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJGcmF1bmhvZmVyQUFDCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9EcmNQcmVzTW9kZVdyYXAuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9EcmNQcmVzTW9kZVdyYXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyOWFkNjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0RyY1ByZXNNb2RlV3JhcC5jcHAKQEAgLTAsMCArMSwzNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgIkRyY1ByZXNNb2RlV3JhcC5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNkZWZpbmUgTE9HX1RBRyAiU29mdEFBQzJfRHJjV3JhcHBlciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworLy8jZGVmaW5lIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworCisjZGVmaW5lIEdQTV9FTkNPREVSX1RBUkdFVF9MRVZFTCA2NAorI2RlZmluZSBNQVhfVEFSR0VUX0xFVkVMIDY0CisKK0NEcmNQcmVzTW9kZVdyYXBwZXI6OkNEcmNQcmVzTW9kZVdyYXBwZXIoKQoreworICAgIG1EYXRhVXBkYXRlID0gdHJ1ZTsKKworICAgIC8qIERhdGEgZnJvbSBzdHJlYW1JbmZvLiAqLworICAgIC8qIEluaXRpYWxpemVkIHRvIHRoZSBzYW1lIHZhbHVlcyBhcyBpbiB0aGUgYWFjIGRlY29kZXIgKi8KKyAgICBtU3RyZWFtUFJMID0gLTE7CisgICAgbVN0cmVhbURSQ1ByZXNNb2RlID0gLTE7CisgICAgbVN0cmVhbU5yQUFDQ2hhbiA9IDA7CisgICAgbVN0cmVhbU5yT3V0Q2hhbiA9IDA7CisKKyAgICAvKiBEZXNpcmVkIHZhbHVlcyAoc2V0IGJ5IHVzZXIpLiAqLworICAgIC8qIEluaXRpYWxpemVkIHRvIHRoZSBzYW1lIHZhbHVlcyBhcyBpbiB0aGUgYWFjIGRlY29kZXIgKi8KKyAgICBtRGVzVGFyZ2V0ID0gLTE7CisgICAgbURlc0F0dEZhY3RvciA9IDA7CisgICAgbURlc0Jvb3N0RmFjdG9yID0gMDsKKyAgICBtRGVzSGVhdnkgPSAwOworCisgICAgbUVuY29kZXJUYXJnZXQgPSAtMTsKKworICAgIC8qIFZhbHVlcyBmcm9tIGxhc3QgdGltZS4gKi8KKyAgICAvKiBJbml0aWFsaXplZCB0byB0aGUgc2FtZSB2YWx1ZXMgYXMgdGhlIGRlc2lyZWQgdmFsdWVzICovCisgICAgbUxhc3RUYXJnZXQgPSAtMTsKKyAgICBtTGFzdEF0dEZhY3RvciA9IDA7CisgICAgbUxhc3RCb29zdEZhY3RvciA9IDA7CisgICAgbUxhc3RIZWF2eSA9IDA7Cit9CisKK0NEcmNQcmVzTW9kZVdyYXBwZXI6On5DRHJjUHJlc01vZGVXcmFwcGVyKCkKK3sKK30KKwordm9pZAorQ0RyY1ByZXNNb2RlV3JhcHBlcjo6c2V0RGVjb2RlckhhbmRsZShjb25zdCBIQU5ETEVfQUFDREVDT0RFUiBoYW5kbGUpCit7CisgICAgbUhhbmRsZURlY29kZXIgPSBoYW5kbGU7Cit9CisKK3ZvaWQKK0NEcmNQcmVzTW9kZVdyYXBwZXI6OnN1Ym1pdFN0cmVhbURhdGEoQ1N0cmVhbUluZm8qIHBTdHJlYW1JbmZvKQoreworICAgIGFzc2VydChwU3RyZWFtSW5mbyk7CisKKyAgICBpZiAobVN0cmVhbVBSTCAhPSBwU3RyZWFtSW5mby0+ZHJjUHJvZ1JlZkxldikgeworICAgICAgICBtU3RyZWFtUFJMID0gcFN0cmVhbUluZm8tPmRyY1Byb2dSZWZMZXY7CisgICAgICAgIG1EYXRhVXBkYXRlID0gdHJ1ZTsKKyNpZmRlZiBEUkNfUFJFU19NT0RFX1dSQVBfREVCVUcKKyAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBkcmNQcm9nUmVmTGV2IGlzICVkXG4iLCBtU3RyZWFtUFJMKTsKKyNlbmRpZgorICAgIH0KKworICAgIGlmIChtU3RyZWFtRFJDUHJlc01vZGUgIT0gcFN0cmVhbUluZm8tPmRyY1ByZXNNb2RlKSB7CisgICAgICAgIG1TdHJlYW1EUkNQcmVzTW9kZSA9IHBTdHJlYW1JbmZvLT5kcmNQcmVzTW9kZTsKKyAgICAgICAgbURhdGFVcGRhdGUgPSB0cnVlOworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IGRyY1ByZXNNb2RlIGlzICVkXG4iLCBtU3RyZWFtRFJDUHJlc01vZGUpOworI2VuZGlmCisgICAgfQorCisgICAgaWYgKG1TdHJlYW1OckFBQ0NoYW4gIT0gcFN0cmVhbUluZm8tPmFhY051bUNoYW5uZWxzKSB7CisgICAgICAgIG1TdHJlYW1OckFBQ0NoYW4gPSBwU3RyZWFtSW5mby0+YWFjTnVtQ2hhbm5lbHM7CisgICAgICAgIG1EYXRhVXBkYXRlID0gdHJ1ZTsKKyNpZmRlZiBEUkNfUFJFU19NT0RFX1dSQVBfREVCVUcKKyAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBhYWNOdW1DaGFubmVscyBpcyAlZFxuIiwgbVN0cmVhbU5yQUFDQ2hhbik7CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAobVN0cmVhbU5yT3V0Q2hhbiAhPSBwU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpIHsKKyAgICAgICAgbVN0cmVhbU5yT3V0Q2hhbiA9IHBTdHJlYW1JbmZvLT5udW1DaGFubmVsczsKKyAgICAgICAgbURhdGFVcGRhdGUgPSB0cnVlOworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IG51bUNoYW5uZWxzIGlzICVkXG4iLCBtU3RyZWFtTnJPdXRDaGFuKTsKKyNlbmRpZgorICAgIH0KKworCisKKyAgICBpZiAobVN0cmVhbU5yT3V0Q2hhbjxtU3RyZWFtTnJBQUNDaGFuKSB7CisgICAgICAgIG1Jc0Rvd25taXggPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Jc0Rvd25taXggPSBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAobUlzRG93bm1peCAmJiAobVN0cmVhbU5yT3V0Q2hhbiA9PSAxKSkgeworICAgICAgICBtSXNNb25vRG93bm1peCA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUlzTW9ub0Rvd25taXggPSBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAobUlzRG93bm1peCAmJiBtU3RyZWFtTnJPdXRDaGFuID09IDIpeworICAgICAgICBtSXNTdGVyZW9Eb3dubWl4ID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtSXNTdGVyZW9Eb3dubWl4ID0gZmFsc2U7CisgICAgfQorCit9CisKK3ZvaWQKK0NEcmNQcmVzTW9kZVdyYXBwZXI6OnNldFBhcmFtKGNvbnN0IERSQ19QUkVTX01PREVfV1JBUF9QQVJBTSBwYXJhbSwgY29uc3QgaW50IHZhbHVlKQoreworICAgIHN3aXRjaCAocGFyYW0pIHsKKyAgICBjYXNlIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX1RBUkdFVDoKKyAgICAgICAgbURlc1RhcmdldCA9IHZhbHVlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0FUVF9GQUNUT1I6CisgICAgICAgIG1EZXNBdHRGYWN0b3IgPSB2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9CT09TVF9GQUNUT1I6CisgICAgICAgIG1EZXNCb29zdEZhY3RvciA9IHZhbHVlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0hFQVZZOgorICAgICAgICBtRGVzSGVhdnkgPSB2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBEUkNfUFJFU19NT0RFX1dSQVBfRU5DT0RFUl9UQVJHRVQ6CisgICAgICAgIG1FbmNvZGVyVGFyZ2V0ID0gdmFsdWU7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBtRGF0YVVwZGF0ZSA9IHRydWU7Cit9CisKK3ZvaWQKK0NEcmNQcmVzTW9kZVdyYXBwZXI6OnVwZGF0ZSgpCit7CisgICAgLy8gR2V0IERhdGEgZnJvbSBEZWNvZGVyCisgICAgaW50IHByb2dSZWZMZXZlbCA9IG1TdHJlYW1QUkw7CisgICAgaW50IGRyY1ByZXNNb2RlID0gbVN0cmVhbURSQ1ByZXNNb2RlOworCisgICAgLy8gYnkgZGVmYXVsdCwgZG8gYXMgZGVzaXJlZAorICAgIGludCBuZXdUYXJnZXQgICAgICAgICA9IG1EZXNUYXJnZXQ7CisgICAgaW50IG5ld0F0dEZhY3RvciAgICAgID0gbURlc0F0dEZhY3RvcjsKKyAgICBpbnQgbmV3Qm9vc3RGYWN0b3IgICAgPSBtRGVzQm9vc3RGYWN0b3I7CisgICAgaW50IG5ld0hlYXZ5ICAgICAgICAgID0gbURlc0hlYXZ5OworCisgICAgaWYgKG1EYXRhVXBkYXRlKSB7CisgICAgICAgIC8vIHNhbml0eSBjaGVjaworICAgICAgICBpZiAobURlc1RhcmdldCA8IE1BWF9UQVJHRVRfTEVWRUwpeworICAgICAgICAgICAgbURlc1RhcmdldCA9IE1BWF9UQVJHRVRfTEVWRUw7ICAvLyBsaW1pdCB0YXJnZXQgbGV2ZWwgdG8gLTE2IGRCIG9yIGJlbG93CisgICAgICAgICAgICBuZXdUYXJnZXQgPSBNQVhfVEFSR0VUX0xFVkVMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1FbmNvZGVyVGFyZ2V0ICE9IC0xKSB7CisgICAgICAgICAgICBpZiAobURlc1RhcmdldDwxMjQpIHsgLy8gaWYgdGFyZ2V0IGxldmVsID4gLTMxIGRCCisgICAgICAgICAgICAgICAgaWYgKChtSXNTdGVyZW9Eb3dubWl4ID09IGZhbHNlKSAmJiAobUlzTW9ub0Rvd25taXggPT0gZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vIHN0ZXJlbyBvciBtb25vIGRvd25taXhpbmcsIGNhbGN1bGF0ZWQgc2NhbGluZyBvZiBsaWdodCBEUkMKKyAgICAgICAgICAgICAgICAgICAgLyogdXNlIGFzIGxpdHRsZSBjb21wcmVzc2lvbiBhcyBwb3NzaWJsZSAqLworICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAwOworICAgICAgICAgICAgICAgICAgICBuZXdCb29zdEZhY3RvciA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmIChtRGVzVGFyZ2V0PHByb2dSZWZMZXZlbCkgeyAvLyBpZiB0YXJnZXQgbGV2ZWwgPiBQUkwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRW5jb2RlclRhcmdldCA8IG1EZXNUYXJnZXQpIHsgLy8gaWYgbUVuY29kZXJUYXJnZXQgPiB0YXJnZXQgbGV2ZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtRW5jb2RlclRhcmdldCA+IHRhcmdldCBsZXZlbCA+IFBSTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYWxjRmFjdG9yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGNhbGNGYWN0b3Jfbm9ybTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwLjBmIDwgY2FsY0ZhY3Rvcl9ub3JtIDwgMS4wZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGNGYWN0b3Jfbm9ybSA9IChmbG9hdCkobURlc1RhcmdldCAtIHByb2dSZWZMZXZlbCkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0KShtRW5jb2RlclRhcmdldCAtIHByb2dSZWZMZXZlbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsY0ZhY3RvciA9IChpbnQpKGNhbGNGYWN0b3Jfbm9ybSoxMjcuMGYpOyAvLyAwIDw9IGNhbGNGYWN0b3IgPCAxMjcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxjRmFjdG9yIGlzIHRoZSBsb3dlciBsaW1pdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IChjYWxjRmFjdG9yPm5ld0F0dEZhY3RvcikgPyBjYWxjRmFjdG9yIDogbmV3QXR0RmFjdG9yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ldyBBdHRGYWN0b3Igd2lsbCBiZSBhbHdheXMgPSBjYWxjRmFjdG9yLCBhcyBpdCBpcyBzZXQgdG8gMCBiZWZvcmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Qm9vc3RGYWN0b3IgPSBuZXdBdHRGYWN0b3I7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRhcmdldCBsZXZlbCA+IG1FbmNvZGVyVGFyZ2V0ID4gUFJMICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3VERMaW1pdGVyRW5hYmxlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGltZSBkb21haW4gbGltaXRlciBtdXN0IGFsd2F5cyBiZSBhY3RpdmUgaW4gdGhpcyBjYXNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGZyYW1ld29yayBhY3RpdmF0ZXMgaXQgYnkgZGVmYXVsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdCb29zdEZhY3RvciA9IDEyNzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gdGFyZ2V0IGxldmVsIDw9IFBSTAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gcmVzdHJpY3Rpb25zIHJlcXVpcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXdBdHRGYWN0b3IgPSBuZXdBdHRGYWN0b3I7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBkb3dubWl4aW5nCisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRhcmdldCBsZXZlbCA+IC0yMyBkQiBvciBtb25vIGRvd25taXgKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAobURlc1RhcmdldDw5MikgfHwgbUlzTW9ub0Rvd25taXggKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdIZWF2eSA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBwZXJmb3JtIGEgZG93bm1peCwgc28sIHdlIG5lZWQgYXQgbGVhc3QgZnVsbCBsaWdodCBEUkMKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7IC8vIHRhcmdldCBsZXZlbCA8PSAtMzEgZEIKKyAgICAgICAgICAgICAgICAvLyBwbGF5YmFjayAtMzEgZEI6IGxpZ2h0IERSQyBvbmx5IG5lZWRlZCBpZiB3ZSBwZXJmb3JtIGRvd25taXhpbmcKKyAgICAgICAgICAgICAgICBpZiAobUlzRG93bm1peCkgeyAgIC8vIHdlIGRvIGRvd25taXhpbmcKKyAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsgLy8gaGFuZGxlIG90aGVyIHVzZWQgZW5jb2RlciB0YXJnZXQgbGV2ZWxzCisKKyAgICAgICAgICAgIC8vIFNhbml0eSBjaGVjazogRFJDIHByZXNlbnRhdGlvbiBtb2RlIGlzIG9ubHkgc3BlY2lmaWVkIGZvciBtYXguIDUuMSBjaGFubmVscworICAgICAgICAgICAgaWYgKG1TdHJlYW1OckFBQ0NoYW4gPiA2KSB7CisgICAgICAgICAgICAgICAgZHJjUHJlc01vZGUgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGRyY1ByZXNNb2RlKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBkZWZhdWx0OiAvLyBwcmVzZW50YXRpb24gbW9kZSBub3QgaW5kaWNhdGVkCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICBpZiAobURlc1RhcmdldDwxMjQpIHsgLy8gaWYgdGFyZ2V0IGxldmVsID4gLTMxIGRCCisgICAgICAgICAgICAgICAgICAgIC8vIG5vIHN0ZXJlbyBvciBtb25vIGRvd25taXhpbmcKKyAgICAgICAgICAgICAgICAgICAgaWYgKChtSXNTdGVyZW9Eb3dubWl4ID09IGZhbHNlKSAmJiAobUlzTW9ub0Rvd25taXggPT0gZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobURlc1RhcmdldDxwcm9nUmVmTGV2ZWwpIHsgLy8gaWYgdGFyZ2V0IGxldmVsID4gUFJMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3VERMaW1pdGVyRW5hYmxlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGltZSBkb21haW4gbGltaXRlciBtdXN0IGFsd2F5cyBiZSBhY3RpdmUgaW4gdGhpcyBjYXNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgZnJhbWV3b3JrIGFjdGl2YXRlcyBpdCBieSBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OyAvLyBhdCBsZWFzdCwgdXNlIGxpZ2h0IGNvbXByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyB0YXJnZXQgbGV2ZWwgPD0gUFJMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gcmVzdHJpY3Rpb25zIHJlcXVpcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3QXR0RmFjdG9yID0gbmV3QXR0RmFjdG9yOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBkb3dubWl4aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXdURExpbWl0ZXJFbmFibGUgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRpbWUgZG9tYWluIGxpbWl0ZXIgbXVzdCBhbHdheXMgYmUgYWN0aXZlIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgZnJhbWV3b3JrIGFjdGl2YXRlcyBpdCBieSBkZWZhdWx0CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRhcmdldCBsZXZlbCA+IC0yMyBkQiBvciBtb25vIGRvd25taXgKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKG1EZXNUYXJnZXQgPCA5MikgfHwgbUlzTW9ub0Rvd25taXggKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGVhdnkgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNleworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHBlcmZvcm0gYSBkb3dubWl4LCBzbywgd2UgbmVlZCBhdCBsZWFzdCBmdWxsIGxpZ2h0IERSQworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHRhcmdldCBsZXZlbCA8PSAtMzEgZEIKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc0Rvd25taXgpIHsgICAvLyB3ZSBkbyBkb3dubWl4aW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3VERMaW1pdGVyRW5hYmxlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0aW1lIGRvbWFpbiBsaW1pdGVyIG11c3QgYWx3YXlzIGJlIGFjdGl2ZSBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGZyYW1ld29yayBhY3RpdmF0ZXMgaXQgYnkgZGVmYXVsdAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8vIFByZXNlbnRhdGlvbiBtb2RlIDEgYW5kIDIgYWNjb3JkaW5nIHRvIEVUU0kgVFMgMTAxIDE1NDoKKyAgICAgICAgICAgIC8vIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIChEVkIpOyBTcGVjaWZpY2F0aW9uIGZvciB0aGUgdXNlIG9mIFZpZGVvIGFuZCBBdWRpbyBDb2RpbmcKKyAgICAgICAgICAgIC8vIGluIEJyb2FkY2FzdGluZyBBcHBsaWNhdGlvbnMgYmFzZWQgb24gdGhlIE1QRUctMiBUcmFuc3BvcnQgU3RyZWFtLAorICAgICAgICAgICAgLy8gc2VjdGlvbiBDLjUuNC4sICJEZWNvZGluZyIsIGFuZCBUYWJsZSBDLjMzCisgICAgICAgICAgICAvLyBJU08gRFJDICAgICAgICAgICAgLT4gbmV3SGVhdnkgPSAwICAoVXNlIGxpZ2h0IGNvbXByZXNzaW9uLCBNUEVHLXN0eWxlKQorICAgICAgICAgICAgLy8gQ29tcHJlc3Npb25fdmFsdWUgIC0+IG5ld0hlYXZ5ID0gMSAgKFVzZSBoZWF2eSBjb21wcmVzc2lvbiwgRFZCLXN0eWxlKQorICAgICAgICAgICAgLy8gc2NhbGluZyByZXN0cmljdGVkIC0+IG5ld0F0dEZhY3RvciA9IDEyNworCisgICAgICAgICAgICBjYXNlIDE6IC8vIHByZXNlbnRhdGlvbiBtb2RlIDEsIExpZ2h0Oi0zMS9IZWF2eTotMjMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobURlc1RhcmdldCA8IDEyNCkgeyAvLyBpZiB0YXJnZXQgbGV2ZWwgPiAtMzEgZEIKKyAgICAgICAgICAgICAgICAgICAgLy8gcGxheWJhY2sgdXAgdG8gLTIzIGRCCisgICAgICAgICAgICAgICAgICAgIG5ld0hlYXZ5ID0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyB0YXJnZXQgbGV2ZWwgPD0gLTMxIGRCCisgICAgICAgICAgICAgICAgICAgIC8vIHBsYXliYWNrIC0zMSBkQgorICAgICAgICAgICAgICAgICAgICBpZiAobUlzRG93bm1peCkgeyAgIC8vIHdlIGRvIGRvd25taXhpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAyOiAvLyBwcmVzZW50YXRpb24gbW9kZSAyLCBMaWdodDotMjMvSGVhdnk6LTIzCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG1EZXNUYXJnZXQgPCAxMjQpIHsgLy8gaWYgdGFyZ2V0IGxldmVsID4gLTMxIGRCCisgICAgICAgICAgICAgICAgICAgIC8vIHBsYXliYWNrIHVwIHRvIC0yMyBkQgorICAgICAgICAgICAgICAgICAgICBpZiAobUlzTW9ub0Rvd25taXgpIHsgLy8gaWYgbW9ubyBkb3dubWl4CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdIZWF2eSA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdIZWF2eSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyB0YXJnZXQgbGV2ZWwgPD0gLTMxIGRCCisgICAgICAgICAgICAgICAgICAgIC8vIHBsYXliYWNrIC0zMSBkQgorICAgICAgICAgICAgICAgICAgICBuZXdIZWF2eSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmIChtSXNEb3dubWl4KSB7ICAgLy8gd2UgZG8gZG93bm1peGluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9IC8vIHN3aXRjaCgpCisgICAgICAgIH0gLy8gaWYgKG1FbmNvZGVyVGFyZ2V0ICA9PSBHUE1fRU5DT0RFUl9UQVJHRVRfTEVWRUwpCisKKyAgICAgICAgLy8gc2FuaXR5IGFnYWluCisgICAgICAgIGlmIChuZXdIZWF2eSA9PSAxKSB7CisgICAgICAgICAgICBuZXdCb29zdEZhY3Rvcj0xMjc7IC8vIG5vdCByZWFsbHkgbmVlZGVkIGFzIHRoZSBzYW1lIHdvdWxkIGJlIGRvbmUgYnkgdGhlIGRlY29kZXIgYW55d2F5CisgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CisgICAgICAgIH0KKworICAgICAgICAvLyB1cGRhdGUgdGhlIGRlY29kZXIKKyAgICAgICAgaWYgKG5ld1RhcmdldCAhPSBtTGFzdFRhcmdldCkgeworICAgICAgICAgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtSGFuZGxlRGVjb2RlciwgQUFDX0RSQ19SRUZFUkVOQ0VfTEVWRUwsIG5ld1RhcmdldCk7CisgICAgICAgICAgICBtTGFzdFRhcmdldCA9IG5ld1RhcmdldDsKKyNpZmRlZiBEUkNfUFJFU19NT0RFX1dSQVBfREVCVUcKKyAgICAgICAgICAgIGlmIChuZXdUYXJnZXQgIT0gbURlc1RhcmdldCkKKyAgICAgICAgICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IGZvcmNlZCB0YXJnZXQgbGV2ZWwgdG8gJWQgKGZyb20gJWQpXG4iLCBuZXdUYXJnZXQsIG1EZXNUYXJnZXQpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogc2V0IHRhcmdldCBsZXZlbCB0byAlZFxuIiwgbmV3VGFyZ2V0KTsKKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgaWYgKG5ld0F0dEZhY3RvciAhPSBtTGFzdEF0dEZhY3RvcikgeworICAgICAgICAgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtSGFuZGxlRGVjb2RlciwgQUFDX0RSQ19BVFRFTlVBVElPTl9GQUNUT1IsIG5ld0F0dEZhY3Rvcik7CisgICAgICAgICAgICBtTGFzdEF0dEZhY3RvciA9IG5ld0F0dEZhY3RvcjsKKyNpZmRlZiBEUkNfUFJFU19NT0RFX1dSQVBfREVCVUcKKyAgICAgICAgICAgIGlmIChuZXdBdHRGYWN0b3IgIT0gbURlc0F0dEZhY3RvcikKKyAgICAgICAgICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IGZvcmNlZCBhdHRlbnVhdGlvbiBmYWN0b3IgdG8gJWQgKGZyb20gJWQpXG4iLCBuZXdBdHRGYWN0b3IsIG1EZXNBdHRGYWN0b3IpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogc2V0IGF0dGVudWF0aW9uIGZhY3RvciB0byAlZFxuIiwgbmV3QXR0RmFjdG9yKTsKKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgaWYgKG5ld0Jvb3N0RmFjdG9yICE9IG1MYXN0Qm9vc3RGYWN0b3IpIHsKKyAgICAgICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUhhbmRsZURlY29kZXIsIEFBQ19EUkNfQk9PU1RfRkFDVE9SLCBuZXdCb29zdEZhY3Rvcik7CisgICAgICAgICAgICBtTGFzdEJvb3N0RmFjdG9yID0gbmV3Qm9vc3RGYWN0b3I7CisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgICAgICBpZiAobmV3Qm9vc3RGYWN0b3IgIT0gbURlc0Jvb3N0RmFjdG9yKQorICAgICAgICAgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogZm9yY2VkIGJvb3N0IGZhY3RvciB0byAlZCAoZnJvbSAlZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdCb29zdEZhY3RvciwgbURlc0Jvb3N0RmFjdG9yKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IHNldCBib29zdCBmYWN0b3IgdG8gJWRcbiIsIG5ld0Jvb3N0RmFjdG9yKTsKKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgaWYgKG5ld0hlYXZ5ICE9IG1MYXN0SGVhdnkpIHsKKyAgICAgICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUhhbmRsZURlY29kZXIsIEFBQ19EUkNfSEVBVllfQ09NUFJFU1NJT04sIG5ld0hlYXZ5KTsKKyAgICAgICAgICAgIG1MYXN0SGVhdnkgPSBuZXdIZWF2eTsKKyNpZmRlZiBEUkNfUFJFU19NT0RFX1dSQVBfREVCVUcKKyAgICAgICAgICAgIGlmIChuZXdIZWF2eSAhPSBtRGVzSGVhdnkpCisgICAgICAgICAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBmb3JjZWQgaGVhdnkgY29tcHJlc3Npb24gdG8gJWQgKGZyb20gJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGVhdnksIG1EZXNIZWF2eSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBzZXQgaGVhdnkgY29tcHJlc3Npb24gdG8gJWRcbiIsIG5ld0hlYXZ5KTsKKyNlbmRpZgorICAgICAgICB9CisKKyNpZmRlZiBEUkNfUFJFU19NT0RFX1dSQVBfREVCVUcKKyAgICAgICAgQUxPR1YoIkRSQyBjb25maWc6IHRndF9sZXY6ICUzZCwgY3V0OiAlM2QsIGJvb3N0OiAlM2QsIGhlYXZ5OiAlZFxuIiwgbmV3VGFyZ2V0LAorICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciwgbmV3Qm9vc3RGYWN0b3IsIG5ld0hlYXZ5KTsKKyNlbmRpZgorICAgICAgICBtRGF0YVVwZGF0ZSA9IGZhbHNlOworCisgICAgfSAvLyBpZiAobURhdGFVcGRhdGUpCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0RyY1ByZXNNb2RlV3JhcC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9EcmNQcmVzTW9kZVdyYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGI2Y2YyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9EcmNQcmVzTW9kZVdyYXAuaApAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNwcmFnbWEgb25jZQorI2luY2x1ZGUgImFhY2RlY29kZXJfbGliLmgiCisKK3R5cGVkZWYgZW51bQoreworICAgIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX1RBUkdFVCAgICAgICAgID0gMHgwMDAwLAorICAgIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0FUVF9GQUNUT1IgICAgID0gMHgwMDAxLAorICAgIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0JPT1NUX0ZBQ1RPUiAgID0gMHgwMDAyLAorICAgIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0hFQVZZICAgICAgICAgID0gMHgwMDAzLAorICAgIERSQ19QUkVTX01PREVfV1JBUF9FTkNPREVSX1RBUkdFVCAgICAgICAgID0gMHgwMDA0Cit9IERSQ19QUkVTX01PREVfV1JBUF9QQVJBTTsKKworCitjbGFzcyBDRHJjUHJlc01vZGVXcmFwcGVyIHsKK3B1YmxpYzoKKyAgICBDRHJjUHJlc01vZGVXcmFwcGVyKCk7CisgICAgfkNEcmNQcmVzTW9kZVdyYXBwZXIoKTsKKyAgICB2b2lkIHNldERlY29kZXJIYW5kbGUoY29uc3QgSEFORExFX0FBQ0RFQ09ERVIgaGFuZGxlKTsKKyAgICB2b2lkIHNldFBhcmFtKGNvbnN0IERSQ19QUkVTX01PREVfV1JBUF9QQVJBTSBwYXJhbSwgY29uc3QgaW50IHZhbHVlKTsKKyAgICB2b2lkIHN1Ym1pdFN0cmVhbURhdGEoQ1N0cmVhbUluZm8qKTsKKyAgICB2b2lkIHVwZGF0ZSgpOworCitwcm90ZWN0ZWQ6CisgICAgSEFORExFX0FBQ0RFQ09ERVIgbUhhbmRsZURlY29kZXI7CisgICAgaW50IG1EZXNUYXJnZXQ7CisgICAgaW50IG1EZXNBdHRGYWN0b3I7CisgICAgaW50IG1EZXNCb29zdEZhY3RvcjsKKyAgICBpbnQgbURlc0hlYXZ5OworCisgICAgaW50IG1FbmNvZGVyVGFyZ2V0OworCisgICAgaW50IG1MYXN0VGFyZ2V0OworICAgIGludCBtTGFzdEF0dEZhY3RvcjsKKyAgICBpbnQgbUxhc3RCb29zdEZhY3RvcjsKKyAgICBpbnQgbUxhc3RIZWF2eTsKKworICAgIFNDSEFSIG1TdHJlYW1QUkw7CisgICAgU0NIQVIgbVN0cmVhbURSQ1ByZXNNb2RlOworICAgIElOVCBtU3RyZWFtTnJBQUNDaGFuOworICAgIElOVCBtU3RyZWFtTnJPdXRDaGFuOworCisgICAgYm9vbCBtSXNEb3dubWl4OworICAgIGJvb2wgbUlzTW9ub0Rvd25taXg7CisgICAgYm9vbCBtSXNTdGVyZW9Eb3dubWl4OworCisgICAgYm9vbCBtRGF0YVVwZGF0ZTsKK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuY3BwCmluZGV4IGE5ZGExY2MuLjcxMjFjZDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuY3BwCkBAIC0xNCwyNyArMTQsMzUgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNkZWZpbmUgTE9HX1RBRyAiU29mdEFBQzIiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlNvZnRBQUMyIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiU29mdEFBQzIuaCIKKyNpbmNsdWRlIDxPTVhfQXVkaW9FeHQuaD4KKyNpbmNsdWRlIDxPTVhfSW5kZXhFeHQuaD4KIAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogCisjaW5jbHVkZSA8bWF0aC5oPgorCiAjZGVmaW5lIEZJTEVSRUFEX01BWF9MQVlFUlMgMgogCiAjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9SRUZfTEVWRUwgNjQgIC8qIDY0Ki0wLjI1ZEIgPSAtMTYgZEIgYmVsb3cgZnVsbCBzY2FsZSBmb3IgbW9iaWxlIGNvbmYgKi8KICNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19DVVQgICAxMjcgLyogbWF4aW11bSBjb21wcmVzc2lvbiBvZiBkeW5hbWljIHJhbmdlIGZvciBtb2JpbGUgY29uZiAqLwogI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0JPT1NUIDEyNyAvKiBtYXhpbXVtIGNvbXByZXNzaW9uIG9mIGR5bmFtaWMgcmFuZ2UgZm9yIG1vYmlsZSBjb25mICovCi0jZGVmaW5lIE1BWF9DSEFOTkVMX0NPVU5UICAgICAgICAgICAgNiAgLyogbWF4aW11bSBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgdGhhdCBjYW4gYmUgZGVjb2RlZCAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0hFQVZZIDEgICAvKiBzd2l0Y2ggZm9yIGhlYXZ5IGNvbXByZXNzaW9uIGZvciBtb2JpbGUgY29uZiAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRU5DX0xFVkVMIC0xIC8qIGVuY29kZXIgdGFyZ2V0IGxldmVsOyAtMSA9PiB0aGUgdmFsdWUgaXMgdW5rbm93biwgb3RoZXJ3aXNlIGRCIHN0ZXAgdmFsdWUgKGUuZy4gNjQgZm9yIC0xNiBkQikgKi8KKyNkZWZpbmUgTUFYX0NIQU5ORUxfQ09VTlQgICAgICAgICAgICA4ICAvKiBtYXhpbXVtIG51bWJlciBvZiBhdWRpbyBjaGFubmVscyB0aGF0IGNhbiBiZSBkZWNvZGVkICovCiAvLyBuYW1lcyBvZiBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgRFJDIHNldHRpbmdzCiAjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX1JFRl9MRVZFTCAgImFhY19kcmNfcmVmZXJlbmNlX2xldmVsIgogI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9DVVQgICAgICAgICJhYWNfZHJjX2N1dCIKICNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfQk9PU1QgICAgICAiYWFjX2RyY19ib29zdCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfSEVBVlkgICAgICAiYWFjX2RyY19oZWF2eSIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfRU5DX0xFVkVMICJhYWNfZHJjX2VuY190YXJnZXRfbGV2ZWwiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNTcsOSArNjUsOSBAQAogICAgICAgbVN0cmVhbUluZm8oTlVMTCksCiAgICAgICBtSXNBRFRTKGZhbHNlKSwKICAgICAgIG1JbnB1dEJ1ZmZlckNvdW50KDApLAorICAgICAgbU91dHB1dEJ1ZmZlckNvdW50KDApLAogICAgICAgbVNpZ25hbGxlZEVycm9yKGZhbHNlKSwKLSAgICAgIG1BbmNob3JUaW1lVXMoMCksCi0gICAgICBtTnVtU2FtcGxlc091dHB1dCgwKSwKKyAgICAgIG1MYXN0SW5IZWFkZXIoTlVMTCksCiAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlKE5PTkUpIHsKICAgICBpbml0UG9ydHMoKTsKICAgICBDSEVDS19FUShpbml0RGVjb2RlcigpLCAoc3RhdHVzX3QpT0spOwpAQCAtNjcsNiArNzUsNyBAQAogCiBTb2Z0QUFDMjo6flNvZnRBQUMyKCkgewogICAgIGFhY0RlY29kZXJfQ2xvc2UobUFBQ0RlY29kZXIpOworICAgIGRlbGV0ZSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyOwogfQogCiB2b2lkIFNvZnRBQUMyOjppbml0UG9ydHMoKSB7CkBAIC0xMTEsNiArMTIwLDcgQEAKIH0KIAogc3RhdHVzX3QgU29mdEFBQzI6OmluaXREZWNvZGVyKCkgeworICAgIEFMT0dWKCJpbml0RGVjb2RlcigpIik7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gVU5LTk9XTl9FUlJPUjsKICAgICBtQUFDRGVjb2RlciA9IGFhY0RlY29kZXJfT3BlbihUVF9NUDRfQURJRiwgLyogbnVtIGxheWVycyAqLyAxKTsKICAgICBpZiAobUFBQ0RlY29kZXIgIT0gTlVMTCkgewpAQCAtMTE5LDM2ICsxMjksNzMgQEAKICAgICAgICAgICAgIHN0YXR1cyA9IE9LOwogICAgICAgICB9CiAgICAgfQotICAgIG1EZWNvZGVySGFzRGF0YSA9IGZhbHNlOwogCi0gICAgLy8gZm9yIHN0cmVhbXMgdGhhdCBjb250YWluIG1ldGFkYXRhLCB1c2UgdGhlIG1vYmlsZSBwcm9maWxlIERSQyBzZXR0aW5ncyB1bmxlc3Mgb3ZlcnJpZGRlbgotICAgIC8vIGJ5IHBsYXRmb3JtIHByb3BlcnRpZXM6CisgICAgbUVuZE9mSW5wdXQgPSBmYWxzZTsKKyAgICBtRW5kT2ZPdXRwdXQgPSBmYWxzZTsKKyAgICBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZCA9IDA7CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemUgPSAyMDQ4ICogTUFYX0NIQU5ORUxfQ09VTlQgKiBrTnVtRGVsYXlCbG9ja3NNYXg7CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlciA9IG5ldyBzaG9ydFttT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZV07CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zID0gMDsKKyAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyA9IDA7CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlckZpbGxlZCA9IDA7CisKKyAgICBpZiAobUFBQ0RlY29kZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiQUFDIGRlY29kZXIgaXMgbnVsbC4gVE9ETzogQ2FuIG5vdCBjYWxsIGFhY0RlY29kZXJfU2V0UGFyYW0gaW4gdGhlIGZvbGxvd2luZyBjb2RlIik7CisgICAgfQorCisgICAgLy9hYWNEZWNvZGVyX1NldFBhcmFtKG1BQUNEZWNvZGVyLCBBQUNfUENNX0xJTUlURVJfRU5BQkxFLCAwKTsKKworICAgIC8vaW5pdCBEUkMgd3JhcHBlcgorICAgIG1EcmNXcmFwLnNldERlY29kZXJIYW5kbGUobUFBQ0RlY29kZXIpOworICAgIG1EcmNXcmFwLnN1Ym1pdFN0cmVhbURhdGEobVN0cmVhbUluZm8pOworCisgICAgLy8gZm9yIHN0cmVhbXMgdGhhdCBjb250YWluIG1ldGFkYXRhLCB1c2UgdGhlIG1vYmlsZSBwcm9maWxlIERSQyBzZXR0aW5ncyB1bmxlc3Mgb3ZlcnJpZGRlbiBieSBwbGF0Zm9ybSBwcm9wZXJ0aWVzCisgICAgLy8gVE9ETzogY2hhbmdlIHRoZSBEUkMgc2V0dGluZ3MgZGVwZW5kaW5nIG9uIGF1ZGlvIG91dHB1dCBkZXZpY2UgdHlwZSAoSERNSSwgbG9hZHNwZWFrZXIsIGhlYWRwaG9uZSkKICAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgLy8gICogQUFDX0RSQ19SRUZFUkVOQ0VfTEVWRUwKKyAgICAvLyAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfVEFSR0VUCiAgICAgaWYgKHByb3BlcnR5X2dldChQUk9QX0RSQ19PVkVSUklERV9SRUZfTEVWRUwsIHZhbHVlLCBOVUxMKSkgewogICAgICAgICB1bnNpZ25lZCByZWZMZXZlbCA9IGF0b2kodmFsdWUpOwotICAgICAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgQUFDX0RSQ19SRUZFUkVOQ0VfTEVWRUwgb2YgJWQgaW5zdGVhZCBvZiAlZCIsCi0gICAgICAgICAgICAgICAgcmVmTGV2ZWwsIERSQ19ERUZBVUxUX01PQklMRV9SRUZfTEVWRUwpOwotICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1BQUNEZWNvZGVyLCBBQUNfRFJDX1JFRkVSRU5DRV9MRVZFTCwgcmVmTGV2ZWwpOworICAgICAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgZGVzaXJlZCBEUkMgdGFyZ2V0IHJlZmVyZW5jZSBsZXZlbCBvZiAlZCBpbnN0ZWFkIG9mICVkIiwgcmVmTGV2ZWwsCisgICAgICAgICAgICAgICAgRFJDX0RFRkFVTFRfTU9CSUxFX1JFRl9MRVZFTCk7CisgICAgICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX1RBUkdFVCwgcmVmTGV2ZWwpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19EUkNfUkVGRVJFTkNFX0xFVkVMLCBEUkNfREVGQVVMVF9NT0JJTEVfUkVGX0xFVkVMKTsKKyAgICAgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfVEFSR0VULCBEUkNfREVGQVVMVF9NT0JJTEVfUkVGX0xFVkVMKTsKICAgICB9Ci0gICAgLy8gICogQUFDX0RSQ19BVFRFTlVBVElPTl9GQUNUT1IKKyAgICAvLyAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQVRUX0ZBQ1RPUgogICAgIGlmIChwcm9wZXJ0eV9nZXQoUFJPUF9EUkNfT1ZFUlJJREVfQ1VULCB2YWx1ZSwgTlVMTCkpIHsKICAgICAgICAgdW5zaWduZWQgY3V0ID0gYXRvaSh2YWx1ZSk7Ci0gICAgICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBBQUNfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUiBvZiAlZCBpbnN0ZWFkIG9mICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1dCwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19DVVQpOwotICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1BQUNEZWNvZGVyLCBBQUNfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUiwgY3V0KTsKKyAgICAgICAgQUxPR1YoIkFBQyBkZWNvZGVyIHVzaW5nIGRlc2lyZWQgRFJDIGF0dGVudWF0aW9uIGZhY3RvciBvZiAlZCBpbnN0ZWFkIG9mICVkIiwgY3V0LAorICAgICAgICAgICAgICAgIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQ1VUKTsKKyAgICAgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQVRUX0ZBQ1RPUiwgY3V0KTsKICAgICB9IGVsc2UgewotICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1BQUNEZWNvZGVyLCBBQUNfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUiwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19DVVQpOworICAgICAgICBtRHJjV3JhcC5zZXRQYXJhbShEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9BVFRfRkFDVE9SLCBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0NVVCk7CiAgICAgfQotICAgIC8vICAqIEFBQ19EUkNfQk9PU1RfRkFDVE9SIChub3RlOiBubyBkZWZhdWx0LCB1c2luZyBjdXQpCisgICAgLy8gIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0JPT1NUX0ZBQ1RPUgogICAgIGlmIChwcm9wZXJ0eV9nZXQoUFJPUF9EUkNfT1ZFUlJJREVfQk9PU1QsIHZhbHVlLCBOVUxMKSkgewogICAgICAgICB1bnNpZ25lZCBib29zdCA9IGF0b2kodmFsdWUpOwotICAgICAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgQUFDX0RSQ19CT09TVF9GQUNUT1Igb2YgJWQiLCBib29zdCk7Ci0gICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19EUkNfQk9PU1RfRkFDVE9SLCBib29zdCk7CisgICAgICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBkZXNpcmVkIERSQyBib29zdCBmYWN0b3Igb2YgJWQgaW5zdGVhZCBvZiAlZCIsIGJvb3N0LAorICAgICAgICAgICAgICAgIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQk9PU1QpOworICAgICAgICBtRHJjV3JhcC5zZXRQYXJhbShEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9CT09TVF9GQUNUT1IsIGJvb3N0KTsKICAgICB9IGVsc2UgewotICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1BQUNEZWNvZGVyLCBBQUNfRFJDX0JPT1NUX0ZBQ1RPUiwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19CT09TVCk7CisgICAgICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0JPT1NUX0ZBQ1RPUiwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19CT09TVCk7CisgICAgfQorICAgIC8vICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9IRUFWWQorICAgIGlmIChwcm9wZXJ0eV9nZXQoUFJPUF9EUkNfT1ZFUlJJREVfSEVBVlksIHZhbHVlLCBOVUxMKSkgeworICAgICAgICB1bnNpZ25lZCBoZWF2eSA9IGF0b2kodmFsdWUpOworICAgICAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgZGVzcmllZCBEUkMgaGVhdnkgY29tcHJlc3Npb24gc3dpdGNoIG9mICVkIGluc3RlYWQgb2YgJWQiLCBoZWF2eSwKKyAgICAgICAgICAgICAgICBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0hFQVZZKTsKKyAgICAgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfSEVBVlksIGhlYXZ5KTsKKyAgICB9IGVsc2UgeworICAgICAgICBtRHJjV3JhcC5zZXRQYXJhbShEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9IRUFWWSwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19IRUFWWSk7CisgICAgfQorICAgIC8vIERSQ19QUkVTX01PREVfV1JBUF9FTkNPREVSX1RBUkdFVAorICAgIGlmIChwcm9wZXJ0eV9nZXQoUFJPUF9EUkNfT1ZFUlJJREVfRU5DX0xFVkVMLCB2YWx1ZSwgTlVMTCkpIHsKKyAgICAgICAgdW5zaWduZWQgZW5jb2RlclJlZkxldmVsID0gYXRvaSh2YWx1ZSk7CisgICAgICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBlbmNvZGVyLXNpZGUgRFJDIHJlZmVyZW5jZSBsZXZlbCBvZiAlZCBpbnN0ZWFkIG9mICVkIiwKKyAgICAgICAgICAgICAgICBlbmNvZGVyUmVmTGV2ZWwsIERSQ19ERUZBVUxUX01PQklMRV9FTkNfTEVWRUwpOworICAgICAgICBtRHJjV3JhcC5zZXRQYXJhbShEUkNfUFJFU19NT0RFX1dSQVBfRU5DT0RFUl9UQVJHRVQsIGVuY29kZXJSZWZMZXZlbCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0VOQ09ERVJfVEFSR0VULCBEUkNfREVGQVVMVF9NT0JJTEVfRU5DX0xFVkVMKTsKICAgICB9CiAKICAgICByZXR1cm4gc3RhdHVzOwpAQCAtMjM5LDcgKzI4Niw3IEBACiAKIE9NWF9FUlJPUlRZUEUgU29mdEFBQzI6OmludGVybmFsU2V0UGFyYW1ldGVyKAogICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcykgewotICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICBzd2l0Y2ggKChpbnQpaW5kZXgpIHsKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVN0YW5kYXJkQ29tcG9uZW50Um9sZToKICAgICAgICAgewogICAgICAgICAgICAgY29uc3QgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICpyb2xlUGFyYW1zID0KQEAgLTI4Myw2ICszMzAsNzYgQEAKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZEFhY1ByZXNlbnRhdGlvbjoKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX0FORFJPSURfQUFDUFJFU0VOVEFUSU9OVFlQRSAqYWFjUHJlc1BhcmFtcyA9CisgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9BQUNQUkVTRU5UQVRJT05UWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShhYWNQcmVzUGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGZvciB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgb2YgdGhlIE9NWF9BVURJT19QQVJBTV9BQUNQUk9GSUxFVFlQRSBzdHJ1Y3R1cmUsCisgICAgICAgICAgICAvLyBhIHZhbHVlIG9mIC0xIGltcGxpZXMgdGhlIHBhcmFtZXRlciBpcyBub3Qgc2V0IGJ5IHRoZSBhcHBsaWNhdGlvbjoKKyAgICAgICAgICAgIC8vICAgbk1heE91dHB1dENoYW5uZWxzICAgICB1c2VzIGRlZmF1bHQgcGxhdGZvcm0gcHJvcGVydGllcywgc2VlIGNvbmZpZ3VyZURvd25taXgoKQorICAgICAgICAgICAgLy8gICBuRHJjQ3V0ICAgICAgICAgICAgICAgIHVzZXMgZGVmYXVsdCBwbGF0Zm9ybSBwcm9wZXJ0aWVzLCBzZWUgaW5pdERlY29kZXIoKQorICAgICAgICAgICAgLy8gICBuRHJjQm9vc3QgICAgICAgICAgICAgICAgaWRlbQorICAgICAgICAgICAgLy8gICBuSGVhdnlDb21wcmVzc2lvbiAgICAgICAgaWRlbQorICAgICAgICAgICAgLy8gICBuVGFyZ2V0UmVmZXJlbmNlTGV2ZWwgICAgaWRlbQorICAgICAgICAgICAgLy8gICBuRW5jb2RlZFRhcmdldExldmVsICAgICAgaWRlbQorICAgICAgICAgICAgaWYgKGFhY1ByZXNQYXJhbXMtPm5NYXhPdXRwdXRDaGFubmVscyA+PSAwKSB7CisgICAgICAgICAgICAgICAgaW50IG1heDsKKyAgICAgICAgICAgICAgICBpZiAoYWFjUHJlc1BhcmFtcy0+bk1heE91dHB1dENoYW5uZWxzID49IDgpIHsgbWF4ID0gODsgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFhY1ByZXNQYXJhbXMtPm5NYXhPdXRwdXRDaGFubmVscyA+PSA2KSB7IG1heCA9IDY7IH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhYWNQcmVzUGFyYW1zLT5uTWF4T3V0cHV0Q2hhbm5lbHMgPj0gMikgeyBtYXggPSAyOyB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIC0xIG9yIDA6IGRpc2FibGUgZG93bm1peCwgIDE6IG1vbm8KKyAgICAgICAgICAgICAgICAgICAgbWF4ID0gYWFjUHJlc1BhcmFtcy0+bk1heE91dHB1dENoYW5uZWxzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigic2V0IG5NYXhPdXRwdXRDaGFubmVscz0lZCIsIG1heCk7CisgICAgICAgICAgICAgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtQUFDRGVjb2RlciwgQUFDX1BDTV9NQVhfT1VUUFVUX0NIQU5ORUxTLCBtYXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9vbCB1cGRhdGVEcmNXcmFwcGVyID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoYWFjUHJlc1BhcmFtcy0+bkRyY0Jvb3N0ID49IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVigic2V0IG5EcmNCb29zdD0lZCIsIGFhY1ByZXNQYXJhbXMtPm5EcmNCb29zdCk7CisgICAgICAgICAgICAgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQk9PU1RfRkFDVE9SLAorICAgICAgICAgICAgICAgICAgICAgICAgYWFjUHJlc1BhcmFtcy0+bkRyY0Jvb3N0KTsKKyAgICAgICAgICAgICAgICB1cGRhdGVEcmNXcmFwcGVyID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhYWNQcmVzUGFyYW1zLT5uRHJjQ3V0ID49IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVigic2V0IG5EcmNDdXQ9JWQiLCBhYWNQcmVzUGFyYW1zLT5uRHJjQ3V0KTsKKyAgICAgICAgICAgICAgICBtRHJjV3JhcC5zZXRQYXJhbShEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9BVFRfRkFDVE9SLCBhYWNQcmVzUGFyYW1zLT5uRHJjQ3V0KTsKKyAgICAgICAgICAgICAgICB1cGRhdGVEcmNXcmFwcGVyID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhYWNQcmVzUGFyYW1zLT5uSGVhdnlDb21wcmVzc2lvbiA+PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoInNldCBuSGVhdnlDb21wcmVzc2lvbj0lZCIsIGFhY1ByZXNQYXJhbXMtPm5IZWF2eUNvbXByZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBtRHJjV3JhcC5zZXRQYXJhbShEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9IRUFWWSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFhY1ByZXNQYXJhbXMtPm5IZWF2eUNvbXByZXNzaW9uKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVEcmNXcmFwcGVyID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhYWNQcmVzUGFyYW1zLT5uVGFyZ2V0UmVmZXJlbmNlTGV2ZWwgPj0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJzZXQgblRhcmdldFJlZmVyZW5jZUxldmVsPSVkIiwgYWFjUHJlc1BhcmFtcy0+blRhcmdldFJlZmVyZW5jZUxldmVsKTsKKyAgICAgICAgICAgICAgICBtRHJjV3JhcC5zZXRQYXJhbShEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9UQVJHRVQsCisgICAgICAgICAgICAgICAgICAgICAgICBhYWNQcmVzUGFyYW1zLT5uVGFyZ2V0UmVmZXJlbmNlTGV2ZWwpOworICAgICAgICAgICAgICAgIHVwZGF0ZURyY1dyYXBwZXIgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFhY1ByZXNQYXJhbXMtPm5FbmNvZGVkVGFyZ2V0TGV2ZWwgPj0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJzZXQgbkVuY29kZWRUYXJnZXRMZXZlbD0lZCIsIGFhY1ByZXNQYXJhbXMtPm5FbmNvZGVkVGFyZ2V0TGV2ZWwpOworICAgICAgICAgICAgICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9FTkNPREVSX1RBUkdFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFhY1ByZXNQYXJhbXMtPm5FbmNvZGVkVGFyZ2V0TGV2ZWwpOworICAgICAgICAgICAgICAgIHVwZGF0ZURyY1dyYXBwZXIgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFhY1ByZXNQYXJhbXMtPm5QQ01MaW1pdGVyRW5hYmxlID49IDApIHsKKyAgICAgICAgICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1BQUNEZWNvZGVyLCBBQUNfUENNX0xJTUlURVJfRU5BQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgKGFhY1ByZXNQYXJhbXMtPm5QQ01MaW1pdGVyRW5hYmxlICE9IDApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh1cGRhdGVEcmNXcmFwcGVyKSB7CisgICAgICAgICAgICAgICAgbURyY1dyYXAudXBkYXRlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtOgogICAgICAgICB7CiAgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKnBjbVBhcmFtcyA9CkBAIC0zMDgsMTkgKzQyNSwxMDAgQEAKICAgICByZXR1cm4gbUlucHV0QnVmZmVyQ291bnQgPiAwOwogfQogCi12b2lkIFNvZnRBQUMyOjptYXliZUNvbmZpZ3VyZURvd25taXgoKSBjb25zdCB7Ci0gICAgaWYgKG1TdHJlYW1JbmZvLT5udW1DaGFubmVscyA+IDIpIHsKLSAgICAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgICAgICBpZiAoIShwcm9wZXJ0eV9nZXQoIm1lZGlhLmFhY181MV9vdXRwdXRfZW5hYmxlZCIsIHZhbHVlLCBOVUxMKSAmJgotICAgICAgICAgICAgICAgICghc3RyY21wKHZhbHVlLCAiMSIpIHx8ICFzdHJjYXNlY21wKHZhbHVlLCAidHJ1ZSIpKSkpIHsKLSAgICAgICAgICAgIEFMT0dJKCJEb3dubWl4aW5nIG11bHRpY2hhbm5lbCBBQUMgdG8gc3RlcmVvIik7Ci0gICAgICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1BQUNEZWNvZGVyLCBBQUNfUENNX09VVFBVVF9DSEFOTkVMUywgMik7Ci0gICAgICAgICAgICBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMgPSAyOwotICAgICAgICB9Cit2b2lkIFNvZnRBQUMyOjpjb25maWd1cmVEb3dubWl4KCkgY29uc3QgeworICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBpZiAoIShwcm9wZXJ0eV9nZXQoIm1lZGlhLmFhY181MV9vdXRwdXRfZW5hYmxlZCIsIHZhbHVlLCBOVUxMKQorICAgICAgICAgICAgJiYgKCFzdHJjbXAodmFsdWUsICIxIikgfHwgIXN0cmNhc2VjbXAodmFsdWUsICJ0cnVlIikpKSkgeworICAgICAgICBBTE9HSSgibGltaXRpbmcgdG8gc3RlcmVvIG91dHB1dCIpOworICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1BQUNEZWNvZGVyLCBBQUNfUENNX01BWF9PVVRQVVRfQ0hBTk5FTFMsIDIpOworICAgICAgICAvLyBCeSBkZWZhdWx0LCB0aGUgZGVjb2RlciBjcmVhdGVzIGEgNS4xIGNoYW5uZWwgZG93bm1peCBzaWduYWwKKyAgICAgICAgLy8gZm9yIHNldmVuIGFuZCBlaWdodCBjaGFubmVsIGlucHV0IHN0cmVhbXMuIFRvIGVuYWJsZSA2LjEgYW5kIDcuMSBjaGFubmVsIG91dHB1dAorICAgICAgICAvLyB1c2UgYWFjRGVjb2Rlcl9TZXRQYXJhbShtQUFDRGVjb2RlciwgQUFDX1BDTV9NQVhfT1VUUFVUX0NIQU5ORUxTLCAtMSkKICAgICB9CiB9CiAKLXZvaWQgU29mdEFBQzI6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKK2Jvb2wgU29mdEFBQzI6Om91dHB1dERlbGF5UmluZ0J1ZmZlclB1dFNhbXBsZXMoSU5UX1BDTSAqc2FtcGxlcywgaW50MzJfdCBudW1TYW1wbGVzKSB7CisgICAgaWYgKG51bVNhbXBsZXMgPT0gMCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKG91dHB1dERlbGF5UmluZ0J1ZmZlclNwYWNlTGVmdCgpIDwgbnVtU2FtcGxlcykgeworICAgICAgICBBTE9HRSgiUklORyBCVUZGRVIgV09VTEQgT1ZFUkZMT1ciKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAobU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zICsgbnVtU2FtcGxlcyA8PSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZQorICAgICAgICAgICAgJiYgKG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zIDw9IG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcworICAgICAgICAgICAgICAgICAgICB8fCBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyA+IG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyArIG51bVNhbXBsZXMpKSB7CisgICAgICAgIC8vIGZhc3RlciBtZW1jb3B5IGxvb3Agd2l0aG91dCBjaGVja3MsIGlmIHRoZSBwcmVjb25kaXRpb25zIGFsbG93IHRoaXMKKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyW21PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcysrXSA9IHNhbXBsZXNbaV07CisgICAgICAgIH0KKworICAgICAgICBpZiAobU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zID49IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplKSB7CisgICAgICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MgLT0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigic2xvdyBTb2Z0QUFDMjo6b3V0cHV0RGVsYXlSaW5nQnVmZmVyUHV0U2FtcGxlcygpIik7CisKKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyW21PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvc10gPSBzYW1wbGVzW2ldOworICAgICAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zKys7CisgICAgICAgICAgICBpZiAobU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zID49IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplKSB7CisgICAgICAgICAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zIC09IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJGaWxsZWQgKz0gbnVtU2FtcGxlczsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworaW50MzJfdCBTb2Z0QUFDMjo6b3V0cHV0RGVsYXlSaW5nQnVmZmVyR2V0U2FtcGxlcyhJTlRfUENNICpzYW1wbGVzLCBpbnQzMl90IG51bVNhbXBsZXMpIHsKKworICAgIGlmIChudW1TYW1wbGVzID4gbU91dHB1dERlbGF5UmluZ0J1ZmZlckZpbGxlZCkgeworICAgICAgICBBTE9HRSgiUklORyBCVUZGRVIgV09VTEQgVU5ERVJSVU4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyArIG51bVNhbXBsZXMgPD0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemUKKyAgICAgICAgICAgICYmIChtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MgPCBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcworICAgICAgICAgICAgICAgICAgICB8fCBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MgPj0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgKyBudW1TYW1wbGVzKSkgeworICAgICAgICAvLyBmYXN0ZXIgbWVtY29weSBsb29wIHdpdGhvdXQgY2hlY2tzLCBpZiB0aGUgcHJlY29uZGl0aW9ucyBhbGxvdyB0aGlzCisgICAgICAgIGlmIChzYW1wbGVzICE9IDApIHsKKyAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bVNhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgICAgIHNhbXBsZXNbaV0gPSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyW21PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zKytdOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgKz0gbnVtU2FtcGxlczsKKyAgICAgICAgfQorICAgICAgICBpZiAobU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgPj0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemUpIHsKKyAgICAgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zIC09IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoInNsb3cgU29mdEFBQzI6Om91dHB1dERlbGF5UmluZ0J1ZmZlckdldFNhbXBsZXMoKSIpOworCisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bVNhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgaWYgKHNhbXBsZXMgIT0gMCkgeworICAgICAgICAgICAgICAgIHNhbXBsZXNbaV0gPSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyW21PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zKys7CisgICAgICAgICAgICBpZiAobU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgPj0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemUpIHsKKyAgICAgICAgICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyAtPSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyRmlsbGVkIC09IG51bVNhbXBsZXM7CisgICAgcmV0dXJuIG51bVNhbXBsZXM7Cit9CisKK2ludDMyX3QgU29mdEFBQzI6Om91dHB1dERlbGF5UmluZ0J1ZmZlclNhbXBsZXNBdmFpbGFibGUoKSB7CisgICAgcmV0dXJuIG1PdXRwdXREZWxheVJpbmdCdWZmZXJGaWxsZWQ7Cit9CisKK2ludDMyX3QgU29mdEFBQzI6Om91dHB1dERlbGF5UmluZ0J1ZmZlclNwYWNlTGVmdCgpIHsKKyAgICByZXR1cm4gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemUgLSBvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCk7Cit9CisKKwordm9pZCBTb2Z0QUFDMjo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIC8qIHBvcnRJbmRleCAqLykgewogICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSAhPSBOT05FKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0zMzIsMjcwICs1MzAsNDc2IEBACiAgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZpblF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDApOwogICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoMSk7CiAKLSAgICBpZiAocG9ydEluZGV4ID09IDAgJiYgbUlucHV0QnVmZmVyQ291bnQgPT0gMCkgewotICAgICAgICArK21JbnB1dEJ1ZmZlckNvdW50OwotICAgICAgICBCdWZmZXJJbmZvICppbmZvID0gKmluUXVldWUuYmVnaW4oKTsKLSAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciA9IGluZm8tPm1IZWFkZXI7CisgICAgd2hpbGUgKCghaW5RdWV1ZS5lbXB0eSgpIHx8IG1FbmRPZklucHV0KSAmJiAhb3V0UXVldWUuZW1wdHkoKSkgeworICAgICAgICBpZiAoIWluUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgSU5UX1BDTSB0bXBPdXRCdWZmZXJbMjA0OCAqIE1BWF9DSEFOTkVMX0NPVU5UXTsKKyAgICAgICAgICAgIEJ1ZmZlckluZm8gKmluSW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7CisgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7CiAKLSAgICAgICAgaW5CdWZmZXJbMF0gPSBoZWFkZXItPnBCdWZmZXIgKyBoZWFkZXItPm5PZmZzZXQ7Ci0gICAgICAgIGluQnVmZmVyTGVuZ3RoWzBdID0gaGVhZGVyLT5uRmlsbGVkTGVuOworICAgICAgICAgICAgbUVuZE9mSW5wdXQgPSAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgIT0gMDsKIAotICAgICAgICBBQUNfREVDT0RFUl9FUlJPUiBkZWNvZGVyRXJyID0KLSAgICAgICAgICAgIGFhY0RlY29kZXJfQ29uZmlnUmF3KG1BQUNEZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlckxlbmd0aCk7CisgICAgICAgICAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPT0gMCAmJiAhKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRykpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZmlyc3QgYnVmZmVyIHNob3VsZCBoYXZlIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHIHNldCIpOworICAgICAgICAgICAgICAgIGluSGVhZGVyLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRykgIT0gMCkgeworICAgICAgICAgICAgICAgIEJ1ZmZlckluZm8gKmluSW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmluSGVhZGVyID0gaW5JbmZvLT5tSGVhZGVyOwogCi0gICAgICAgIGlmIChkZWNvZGVyRXJyICE9IEFBQ19ERUNfT0spIHsKLSAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7Ci0gICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgZGVjb2RlckVyciwgTlVMTCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7Ci0gICAgICAgIGluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGhlYWRlcik7Ci0KLSAgICAgICAgLy8gT25seSBzZW5kIG91dCBwb3J0IHNldHRpbmdzIGNoYW5nZWQgZXZlbnQgaWYgYm90aCBzYW1wbGUgcmF0ZQotICAgICAgICAvLyBhbmQgbnVtQ2hhbm5lbHMgYXJlIHZhbGlkLgotICAgICAgICBpZiAobVN0cmVhbUluZm8tPnNhbXBsZVJhdGUgJiYgbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKSB7Ci0gICAgICAgICAgICBtYXliZUNvbmZpZ3VyZURvd25taXgoKTsKLSAgICAgICAgICAgIEFMT0dJKCJJbml0aWFsbHkgY29uZmlndXJpbmcgZGVjb2RlcjogJWQgSHosICVkIGNoYW5uZWxzIiwKLSAgICAgICAgICAgICAgICBtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpOwotCi0gICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwgMSwgMCwgTlVMTCk7Ci0gICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRElTQUJMRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgd2hpbGUgKCFpblF1ZXVlLmVtcHR5KCkgJiYgIW91dFF1ZXVlLmVtcHR5KCkpIHsKLSAgICAgICAgQnVmZmVySW5mbyAqaW5JbmZvID0gKmluUXVldWUuYmVnaW4oKTsKLSAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmluSGVhZGVyID0gaW5JbmZvLT5tSGVhZGVyOwotCi0gICAgICAgIEJ1ZmZlckluZm8gKm91dEluZm8gPSAqb3V0UXVldWUuYmVnaW4oKTsKLSAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7Ci0KLSAgICAgICAgaWYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKLSAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKLSAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwotICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKLQotICAgICAgICAgICAgaWYgKG1EZWNvZGVySGFzRGF0YSkgewotICAgICAgICAgICAgICAgIC8vIGZsdXNoIG91dCB0aGUgZGVjb2RlcidzIGRlbGF5ZWQgZGF0YSBieSBjYWxsaW5nIERlY29kZUZyYW1lCi0gICAgICAgICAgICAgICAgLy8gb25lIG1vcmUgdGltZSwgd2l0aCB0aGUgQUFDREVDX0ZMVVNIIGZsYWcgc2V0Ci0gICAgICAgICAgICAgICAgSU5UX1BDTSAqb3V0QnVmZmVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8SU5UX1BDTSAqPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5wQnVmZmVyICsgb3V0SGVhZGVyLT5uT2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBpbkJ1ZmZlclswXSA9IGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQ7CisgICAgICAgICAgICAgICAgaW5CdWZmZXJMZW5ndGhbMF0gPSBpbkhlYWRlci0+bkZpbGxlZExlbjsKIAogICAgICAgICAgICAgICAgIEFBQ19ERUNPREVSX0VSUk9SIGRlY29kZXJFcnIgPQotICAgICAgICAgICAgICAgICAgICBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKG1BQUNEZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5BbGxvY0xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQUNERUNfRkxVU0gpOwotICAgICAgICAgICAgICAgIG1EZWNvZGVySGFzRGF0YSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBhYWNEZWNvZGVyX0NvbmZpZ1JhdyhtQUFDRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQnVmZmVyTGVuZ3RoKTsKIAogICAgICAgICAgICAgICAgIGlmIChkZWNvZGVyRXJyICE9IEFBQ19ERUNfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coImFhY0RlY29kZXJfQ29uZmlnUmF3IGRlY29kZXJFcnIgPSAweCU0LjR4IiwgZGVjb2RlckVycik7CiAgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIGRlY29kZXJFcnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLQorICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgZGVjb2RlckVyciwgTlVMTCk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPQotICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbUluZm8tPmZyYW1lU2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKGludDE2X3QpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHdlIG5ldmVyIHN1Ym1pdHRlZCBhbnkgZGF0YSB0byB0aGUgZGVjb2Rlciwgc28gdGhlcmUncyBub3RoaW5nIHRvIGZsdXNoIG91dAotICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IDA7CisgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyQ291bnQrKzsKKyAgICAgICAgICAgICAgICBtT3V0cHV0QnVmZmVyQ291bnQrKzsgLy8gZmFrZSBpbmNyZWFzZSBvZiBvdXRwdXRCdWZmZXJDb3VudCB0byBrZWVwIHRoZSBjb3VudGVycyBhbGlnbmVkCisKKyAgICAgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICAgICAgbUxhc3RJbkhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgaW5JbmZvID0gTlVMTDsKKyAgICAgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworICAgICAgICAgICAgICAgIGluSGVhZGVyID0gTlVMTDsKKworICAgICAgICAgICAgICAgIGNvbmZpZ3VyZURvd25taXgoKTsKKyAgICAgICAgICAgICAgICAvLyBPbmx5IHNlbmQgb3V0IHBvcnQgc2V0dGluZ3MgY2hhbmdlZCBldmVudCBpZiBib3RoIHNhbXBsZSByYXRlCisgICAgICAgICAgICAgICAgLy8gYW5kIG51bUNoYW5uZWxzIGFyZSB2YWxpZC4KKyAgICAgICAgICAgICAgICBpZiAobVN0cmVhbUluZm8tPnNhbXBsZVJhdGUgJiYgbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJJbml0aWFsbHkgY29uZmlndXJpbmcgZGVjb2RlcjogJWQgSHosICVkIGNoYW5uZWxzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKTsKKworICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwgMSwgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBBV0FJVElOR19ESVNBQkxFRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKyAgICAgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgICAgIG1MYXN0SW5IZWFkZXIgPSBOVUxMOworICAgICAgICAgICAgICAgIGluSW5mbyA9IE5VTEw7CisgICAgICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKyAgICAgICAgICAgICAgICBpbkhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOwotICAgICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwotICAgICAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1Jc0FEVFMpIHsKKyAgICAgICAgICAgICAgICBzaXplX3QgYWR0c0hlYWRlclNpemUgPSAwOworICAgICAgICAgICAgICAgIC8vIHNraXAgMzAgYml0cywgYWFjX2ZyYW1lX2xlbmd0aCBmb2xsb3dzLgorICAgICAgICAgICAgICAgIC8vIHNzc3Nzc3NzIHNzc3NpaWlwIHBwZmZmZlBjIGNjb2hDQ2xsIGxsbGxsbGxsIGxsbD8/Pz8/CiAKLSAgICAgICAgaWYgKGluSGVhZGVyLT5uT2Zmc2V0ID09IDApIHsKLSAgICAgICAgICAgIG1BbmNob3JUaW1lVXMgPSBpbkhlYWRlci0+blRpbWVTdGFtcDsKLSAgICAgICAgICAgIG1OdW1TYW1wbGVzT3V0cHV0ID0gMDsKLSAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmFkdHNIZWFkZXIgPSBpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0OwogCi0gICAgICAgIHNpemVfdCBhZHRzSGVhZGVyU2l6ZSA9IDA7Ci0gICAgICAgIGlmIChtSXNBRFRTKSB7Ci0gICAgICAgICAgICAvLyBza2lwIDMwIGJpdHMsIGFhY19mcmFtZV9sZW5ndGggZm9sbG93cy4KLSAgICAgICAgICAgIC8vIHNzc3Nzc3NzIHNzc3NpaWlwIHBwZmZmZlBjIGNjb2hDQ2xsIGxsbGxsbGxsIGxsbD8/Pz8/Ci0KLSAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmFkdHNIZWFkZXIgPSBpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0OwotCi0gICAgICAgICAgICBib29sIHNpZ25hbEVycm9yID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gPCA3KSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkF1ZGlvIGRhdGEgdG9vIHNob3J0IHRvIGNvbnRhaW4gZXZlbiB0aGUgQURUUyBoZWFkZXIuICIKLSAgICAgICAgICAgICAgICAgICAgICAiR290ICVsZCBieXRlcy4iLCBpbkhlYWRlci0+bkZpbGxlZExlbik7Ci0gICAgICAgICAgICAgICAgaGV4ZHVtcChhZHRzSGVhZGVyLCBpbkhlYWRlci0+bkZpbGxlZExlbik7Ci0gICAgICAgICAgICAgICAgc2lnbmFsRXJyb3IgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBib29sIHByb3RlY3Rpb25BYnNlbnQgPSAoYWR0c0hlYWRlclsxXSAmIDEpOwotCi0gICAgICAgICAgICAgICAgdW5zaWduZWQgYWFjX2ZyYW1lX2xlbmd0aCA9Ci0gICAgICAgICAgICAgICAgICAgICgoYWR0c0hlYWRlclszXSAmIDMpIDw8IDExKQotICAgICAgICAgICAgICAgICAgICB8IChhZHRzSGVhZGVyWzRdIDw8IDMpCi0gICAgICAgICAgICAgICAgICAgIHwgKGFkdHNIZWFkZXJbNV0gPj4gNSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gPCBhYWNfZnJhbWVfbGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJOb3QgZW5vdWdoIGF1ZGlvIGRhdGEgZm9yIHRoZSBjb21wbGV0ZSBmcmFtZS4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiR290ICVsZCBieXRlcywgZnJhbWUgc2l6ZSBhY2NvcmRpbmcgdG8gdGhlIEFEVFMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVhZGVyIGlzICV1IGJ5dGVzLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGluSGVhZGVyLT5uRmlsbGVkTGVuLCBhYWNfZnJhbWVfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBib29sIHNpZ25hbEVycm9yID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuIDwgNykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQXVkaW8gZGF0YSB0b28gc2hvcnQgdG8gY29udGFpbiBldmVuIHRoZSBBRFRTIGhlYWRlci4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHb3QgJWQgYnl0ZXMuIiwgaW5IZWFkZXItPm5GaWxsZWRMZW4pOwogICAgICAgICAgICAgICAgICAgICBoZXhkdW1wKGFkdHNIZWFkZXIsIGluSGVhZGVyLT5uRmlsbGVkTGVuKTsKICAgICAgICAgICAgICAgICAgICAgc2lnbmFsRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkdHNIZWFkZXJTaXplID0gKHByb3RlY3Rpb25BYnNlbnQgPyA3IDogOSk7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgcHJvdGVjdGlvbkFic2VudCA9IChhZHRzSGVhZGVyWzFdICYgMSk7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFhY19mcmFtZV9sZW5ndGggPCBhZHRzSGVhZGVyU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBhYWNfZnJhbWVfbGVuZ3RoID0KKyAgICAgICAgICAgICAgICAgICAgICAgICgoYWR0c0hlYWRlclszXSAmIDMpIDw8IDExKQorICAgICAgICAgICAgICAgICAgICAgICAgfCAoYWR0c0hlYWRlcls0XSA8PCAzKQorICAgICAgICAgICAgICAgICAgICAgICAgfCAoYWR0c0hlYWRlcls1XSA+PiA1KTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gPCBhYWNfZnJhbWVfbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiTm90IGVub3VnaCBhdWRpbyBkYXRhIGZvciB0aGUgY29tcGxldGUgZnJhbWUuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdvdCAlZCBieXRlcywgZnJhbWUgc2l6ZSBhY2NvcmRpbmcgdG8gdGhlIEFEVFMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVhZGVyIGlzICV1IGJ5dGVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSGVhZGVyLT5uRmlsbGVkTGVuLCBhYWNfZnJhbWVfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhleGR1bXAoYWR0c0hlYWRlciwgaW5IZWFkZXItPm5GaWxsZWRMZW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXJbMF0gPSAoVUNIQVIgKilhZHRzSGVhZGVyICsgYWR0c0hlYWRlclNpemU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlckxlbmd0aFswXSA9IGFhY19mcmFtZV9sZW5ndGggLSBhZHRzSGVhZGVyU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkdHNIZWFkZXJTaXplID0gKHByb3RlY3Rpb25BYnNlbnQgPyA3IDogOSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWFjX2ZyYW1lX2xlbmd0aCA8IGFkdHNIZWFkZXJTaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlclswXSA9IChVQ0hBUiAqKWFkdHNIZWFkZXIgKyBhZHRzSGVhZGVyU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlckxlbmd0aFswXSA9IGFhY19mcmFtZV9sZW5ndGggLSBhZHRzSGVhZGVyU2l6ZTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXItPm5PZmZzZXQgKz0gYWR0c0hlYWRlclNpemU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiAtPSBhZHRzSGVhZGVyU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhlYWRlci0+bk9mZnNldCArPSBhZHRzSGVhZGVyU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiAtPSBhZHRzSGVhZGVyU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChzaWduYWxFcnJvcikgeworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclN0cmVhbUNvcnJ1cHQsIEVSUk9SX01BTEZPUk1FRCwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBpbnNlcnQgYnVmZmVyIHNpemUgYW5kIHRpbWUgc3RhbXAKKyAgICAgICAgICAgICAgICBtQnVmZmVyU2l6ZXMuYWRkKGluQnVmZmVyTGVuZ3RoWzBdKTsKKyAgICAgICAgICAgICAgICBpZiAobUxhc3RJbkhlYWRlciAhPSBpbkhlYWRlcikgeworICAgICAgICAgICAgICAgICAgICBtQnVmZmVyVGltZXN0YW1wcy5hZGQoaW5IZWFkZXItPm5UaW1lU3RhbXApOworICAgICAgICAgICAgICAgICAgICBtTGFzdEluSGVhZGVyID0gaW5IZWFkZXI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjdXJyZW50VGltZSA9IG1CdWZmZXJUaW1lc3RhbXBzLnRvcCgpOworICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGltZSArPSBtU3RyZWFtSW5mby0+YWFjU2FtcGxlc1BlckZyYW1lICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAwbGwgLyBtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlclRpbWVzdGFtcHMuYWRkKGN1cnJlbnRUaW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGluQnVmZmVyWzBdID0gaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKKyAgICAgICAgICAgICAgICBpbkJ1ZmZlckxlbmd0aFswXSA9IGluSGVhZGVyLT5uRmlsbGVkTGVuOworICAgICAgICAgICAgICAgIG1MYXN0SW5IZWFkZXIgPSBpbkhlYWRlcjsKKyAgICAgICAgICAgICAgICBtQnVmZmVyVGltZXN0YW1wcy5hZGQoaW5IZWFkZXItPm5UaW1lU3RhbXApOworICAgICAgICAgICAgICAgIG1CdWZmZXJTaXplcy5hZGQoaW5IZWFkZXItPm5GaWxsZWRMZW4pOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoc2lnbmFsRXJyb3IpIHsKLSAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgLy8gRmlsbCBhbmQgZGVjb2RlCisgICAgICAgICAgICBieXRlc1ZhbGlkWzBdID0gaW5CdWZmZXJMZW5ndGhbMF07CiAKLSAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgIE9NWF9FcnJvclN0cmVhbUNvcnJ1cHQsCi0gICAgICAgICAgICAgICAgICAgICAgIEVSUk9SX01BTEZPUk1FRCwKLSAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICBJTlQgcHJldlNhbXBsZVJhdGUgPSBtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZTsKKyAgICAgICAgICAgIElOVCBwcmV2TnVtQ2hhbm5lbHMgPSBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHM7CiAKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbkJ1ZmZlclswXSA9IGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQ7Ci0gICAgICAgICAgICBpbkJ1ZmZlckxlbmd0aFswXSA9IGluSGVhZGVyLT5uRmlsbGVkTGVuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRmlsbCBhbmQgZGVjb2RlCi0gICAgICAgIElOVF9QQ00gKm91dEJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8SU5UX1BDTSAqPigKLSAgICAgICAgICAgICAgICBvdXRIZWFkZXItPnBCdWZmZXIgKyBvdXRIZWFkZXItPm5PZmZzZXQpOwotCi0gICAgICAgIGJ5dGVzVmFsaWRbMF0gPSBpbkJ1ZmZlckxlbmd0aFswXTsKLQotICAgICAgICBpbnQgcHJldlNhbXBsZVJhdGUgPSBtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZTsKLSAgICAgICAgaW50IHByZXZOdW1DaGFubmVscyA9IG1TdHJlYW1JbmZvLT5udW1DaGFubmVsczsKLQotICAgICAgICBBQUNfREVDT0RFUl9FUlJPUiBkZWNvZGVyRXJyID0gQUFDX0RFQ19OT1RfRU5PVUdIX0JJVFM7Ci0gICAgICAgIHdoaWxlIChieXRlc1ZhbGlkWzBdID4gMCAmJiBkZWNvZGVyRXJyID09IEFBQ19ERUNfTk9UX0VOT1VHSF9CSVRTKSB7CiAgICAgICAgICAgICBhYWNEZWNvZGVyX0ZpbGwobUFBQ0RlY29kZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXJMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNWYWxpZCk7Ci0gICAgICAgICAgICBtRGVjb2Rlckhhc0RhdGEgPSB0cnVlOwogCi0gICAgICAgICAgICBkZWNvZGVyRXJyID0gYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZShtQUFDRGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkFsbG9jTGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBmbGFncyAqLyk7CisgICAgICAgICAgICAvLyBydW4gRFJDIGNoZWNrCisgICAgICAgICAgICBtRHJjV3JhcC5zdWJtaXRTdHJlYW1EYXRhKG1TdHJlYW1JbmZvKTsKKyAgICAgICAgICAgIG1EcmNXcmFwLnVwZGF0ZSgpOwogCi0gICAgICAgICAgICBpZiAoZGVjb2RlckVyciA9PSBBQUNfREVDX05PVF9FTk9VR0hfQklUUykgewotICAgICAgICAgICAgICAgIEFMT0dXKCJOb3QgZW5vdWdoIGJpdHMsIGJ5dGVzVmFsaWQgJWQiLCBieXRlc1ZhbGlkWzBdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHNpemVfdCBudW1PdXRCeXRlcyA9Ci0gICAgICAgICAgICBtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogc2l6ZW9mKGludDE2X3QpICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzOwotCi0gICAgICAgIGlmIChkZWNvZGVyRXJyID09IEFBQ19ERUNfT0spIHsKICAgICAgICAgICAgIFVJTlQgaW5CdWZmZXJVc2VkTGVuZ3RoID0gaW5CdWZmZXJMZW5ndGhbMF0gLSBieXRlc1ZhbGlkWzBdOwogICAgICAgICAgICAgaW5IZWFkZXItPm5GaWxsZWRMZW4gLT0gaW5CdWZmZXJVc2VkTGVuZ3RoOwogICAgICAgICAgICAgaW5IZWFkZXItPm5PZmZzZXQgKz0gaW5CdWZmZXJVc2VkTGVuZ3RoOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1coIkFBQyBkZWNvZGVyIHJldHVybmVkIGVycm9yICVkLCBzdWJzdGl0dXRpbmcgc2lsZW5jZSIsCi0gICAgICAgICAgICAgICAgICBkZWNvZGVyRXJyKTsKIAotICAgICAgICAgICAgbWVtc2V0KG91dEhlYWRlci0+cEJ1ZmZlciArIG91dEhlYWRlci0+bk9mZnNldCwgMCwgbnVtT3V0Qnl0ZXMpOworICAgICAgICAgICAgQUFDX0RFQ09ERVJfRVJST1IgZGVjb2RlckVycjsKKyAgICAgICAgICAgIGludCBudW1Mb29wcyA9IDA7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaWYgKG91dHB1dERlbGF5UmluZ0J1ZmZlclNwYWNlTGVmdCgpIDwKKyAgICAgICAgICAgICAgICAgICAgICAgIChtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigic2tpcHBpbmcgZGVjb2RlOiBub3QgZW5vdWdoIHNwYWNlIGxlZnQgaW4gcmluZ2J1ZmZlciIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIERpc2NhcmQgaW5wdXQgYnVmZmVyLgotICAgICAgICAgICAgaW5IZWFkZXItPm5GaWxsZWRMZW4gPSAwOworICAgICAgICAgICAgICAgIGludCBudW1Db25zdW1lZCA9IG1TdHJlYW1JbmZvLT5udW1Ub3RhbEJ5dGVzOworICAgICAgICAgICAgICAgIGRlY29kZXJFcnIgPSBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKG1BQUNEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcE91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDQ4ICogTUFYX0NIQU5ORUxfQ09VTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBmbGFncyAqLyk7CiAKLSAgICAgICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19UUERFQ19DTEVBUl9CVUZGRVIsIDEpOworICAgICAgICAgICAgICAgIG51bUNvbnN1bWVkID0gbVN0cmVhbUluZm8tPm51bVRvdGFsQnl0ZXMgLSBudW1Db25zdW1lZDsKKyAgICAgICAgICAgICAgICBudW1Mb29wcysrOwogCi0gICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgICAgICAgICBpZiAoZGVjb2RlckVyciA9PSBBQUNfREVDX05PVF9FTk9VR0hfQklUUykgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbURlY29kZWRTaXplcy5hZGQobnVtQ29uc3VtZWQpOworCisgICAgICAgICAgICAgICAgaWYgKGRlY29kZXJFcnIgIT0gQUFDX0RFQ19PSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSBkZWNvZGVyRXJyID0gMHglNC40eCIsIGRlY29kZXJFcnIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChieXRlc1ZhbGlkWzBdICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImJ5dGVzVmFsaWRbMF0gIT0gMCBzaG91bGQgbmV2ZXIgaGFwcGVuIik7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHNpemVfdCBudW1PdXRCeXRlcyA9CisgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBzaXplb2YoaW50MTZfdCkgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHM7CisKKyAgICAgICAgICAgICAgICBpZiAoZGVjb2RlckVyciA9PSBBQUNfREVDX09LKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghb3V0cHV0RGVsYXlSaW5nQnVmZmVyUHV0U2FtcGxlcyh0bXBPdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgZGVjb2RlckVyciwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiQUFDIGRlY29kZXIgcmV0dXJuZWQgZXJyb3IgMHglNC40eCwgc3Vic3RpdHV0aW5nIHNpbGVuY2UiLCBkZWNvZGVyRXJyKTsKKworICAgICAgICAgICAgICAgICAgICBtZW1zZXQodG1wT3V0QnVmZmVyLCAwLCBudW1PdXRCeXRlcyk7IC8vIFRPRE86IGNoZWNrIGZvciBvdmVyZmxvdworCisgICAgICAgICAgICAgICAgICAgIGlmICghb3V0cHV0RGVsYXlSaW5nQnVmZmVyUHV0U2FtcGxlcyh0bXBPdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgZGVjb2RlckVyciwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBEaXNjYXJkIGlucHV0IGJ1ZmZlci4KKyAgICAgICAgICAgICAgICAgICAgaWYgKGluSGVhZGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1BQUNEZWNvZGVyLCBBQUNfVFBERUNfQ0xFQVJfQlVGRkVSLCAxKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBBZnRlciBhbiBlcnJvciwgcmVwbGFjZSB0aGUgbGFzdCBlbnRyeSBpbiBtQnVmZmVyU2l6ZXMgd2l0aCB0aGUgc3VtIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBsYXN0IDxudW1Mb29wcz4gZW50cmllcyBmcm9tIG1EZWNvZGVkU2l6ZXMgdG8gcmVzeW5jaHJvbml6ZSB0aGUgaW4vb3V0IGxpc3RzLgorICAgICAgICAgICAgICAgICAgICBtQnVmZmVyU2l6ZXMucG9wKCk7CisgICAgICAgICAgICAgICAgICAgIGludCBuID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Mb29wczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuICs9IG1EZWNvZGVkU2l6ZXMuaXRlbUF0KG1EZWNvZGVkU2l6ZXMuc2l6ZSgpIC0gbnVtTG9vcHMgKyBpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtQnVmZmVyU2l6ZXMuYWRkKG4pOworCisgICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogQUFDKy9lQUFDKyBzdHJlYW1zIGNhbiBiZSBzaWduYWxsZWQgaW4gdHdvIHdheXM6IGVpdGhlciBleHBsaWNpdGx5CisgICAgICAgICAgICAgICAgICogb3IgaW1wbGljaXRseSwgYWNjb3JkaW5nIHRvIE1QRUc0IHNwZWMuIEFBQysvZUFBQysgaXMgYSBkdWFsCisgICAgICAgICAgICAgICAgICogcmF0ZSBzeXN0ZW0gYW5kIHRoZSBzYW1wbGluZyByYXRlIGluIHRoZSBmaW5hbCBvdXRwdXQgaXMgYWN0dWFsbHkKKyAgICAgICAgICAgICAgICAgKiBkb3VibGVkIGNvbXBhcmVkIHdpdGggdGhlIGNvcmUgQUFDIGRlY29kZXIgc2FtcGxpbmcgcmF0ZS4KKyAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAqIEV4cGxpY2l0IHNpZ25hbGxpbmcgaXMgZG9uZSBieSBleHBsaWNpdGx5IGRlZmluaW5nIFNCUiBhdWRpbyBvYmplY3QKKyAgICAgICAgICAgICAgICAgKiB0eXBlIGluIHRoZSBiaXRzdHJlYW0uIEltcGxpY2l0IHNpZ25hbGxpbmcgaXMgZG9uZSBieSBlbWJlZGRpbmcKKyAgICAgICAgICAgICAgICAgKiBTQlIgY29udGVudCBpbiBBQUMgZXh0ZW5zaW9uIHBheWxvYWQgc3BlY2lmaWMgdG8gU0JSLCBhbmQgaGVuY2UKKyAgICAgICAgICAgICAgICAgKiByZXF1aXJlcyBhbiBBQUMgZGVjb2RlciB0byBwZXJmb3JtIHByZS1jaGVja3Mgb24gYWN0dWFsIGF1ZGlvIGZyYW1lcy4KKyAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAqIFRodXMsIHdlIGNvdWxkIG5vdCBzYXkgZm9yIHN1cmUgd2hldGhlciBhIHN0cmVhbSBpcworICAgICAgICAgICAgICAgICAqIEFBQysvZUFBQysgdW50aWwgdGhlIGZpcnN0IGRhdGEgZnJhbWUgaXMgZGVjb2RlZC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPD0gMiB8fCBtT3V0cHV0QnVmZmVyQ291bnQgPiAxKSB7IC8vIFRPRE86IDw9IDEKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlICE9IHByZXZTYW1wbGVSYXRlIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMgIT0gcHJldk51bUNoYW5uZWxzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HSSgiUmVjb25maWd1cmluZyBkZWNvZGVyOiAlZC0+JWQgSHosICVkLT4lZCBjaGFubmVscyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2U2FtcGxlUmF0ZSwgbVN0cmVhbUluZm8tPnNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2TnVtQ2hhbm5lbHMsIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkLCAxLCAwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBBV0FJVElOR19ESVNBQkxFRDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluSGVhZGVyICYmIGluSGVhZGVyLT5uRmlsbGVkTGVuID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXJDb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdEluSGVhZGVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkluZm8gPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXIgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghbVN0cmVhbUluZm8tPnNhbXBsZVJhdGUgfHwgIW1TdHJlYW1JbmZvLT5udW1DaGFubmVscykgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiSW52YWxpZCBBQUMgc3RyZWFtIik7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCBkZWNvZGVyRXJyLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaW5IZWFkZXIgJiYgaW5IZWFkZXItPm5GaWxsZWRMZW4gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyQ291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgICAgICAgICBtTGFzdEluSGVhZGVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgaW5JbmZvID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXIgPSBOVUxMOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJpbkhlYWRlci0+bkZpbGxlZExlbiA9ICVkIiwgaW5IZWFkZXIgPyBpbkhlYWRlci0+bkZpbGxlZExlbiA6IDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKGRlY29kZXJFcnIgPT0gQUFDX0RFQ19PSyk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gPT0gMCkgewotICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7Ci0gICAgICAgICAgICBpbkluZm8gPSBOVUxMOwotICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKLSAgICAgICAgICAgIGluSGVhZGVyID0gTlVMTDsKKyAgICAgICAgaW50MzJfdCBvdXRwdXREZWxheSA9IG1TdHJlYW1JbmZvLT5vdXRwdXREZWxheSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVsczsKKworICAgICAgICBpZiAoIW1FbmRPZklucHV0ICYmIG1PdXRwdXREZWxheUNvbXBlbnNhdGVkIDwgb3V0cHV0RGVsYXkpIHsKKyAgICAgICAgICAgIC8vIGRpc2NhcmQgb3V0cHV0RGVsYXkgYXQgdGhlIGJlZ2lubmluZworICAgICAgICAgICAgaW50MzJfdCB0b0NvbXBlbnNhdGUgPSBvdXRwdXREZWxheSAtIG1PdXRwdXREZWxheUNvbXBlbnNhdGVkOworICAgICAgICAgICAgaW50MzJfdCBkaXNjYXJkID0gb3V0cHV0RGVsYXlSaW5nQnVmZmVyU2FtcGxlc0F2YWlsYWJsZSgpOworICAgICAgICAgICAgaWYgKGRpc2NhcmQgPiB0b0NvbXBlbnNhdGUpIHsKKyAgICAgICAgICAgICAgICBkaXNjYXJkID0gdG9Db21wZW5zYXRlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50MzJfdCBkaXNjYXJkZWQgPSBvdXRwdXREZWxheVJpbmdCdWZmZXJHZXRTYW1wbGVzKDAsIGRpc2NhcmQpOworICAgICAgICAgICAgbU91dHB1dERlbGF5Q29tcGVuc2F0ZWQgKz0gZGlzY2FyZGVkOworICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAotICAgICAgICAvKgotICAgICAgICAgKiBBQUMrL2VBQUMrIHN0cmVhbXMgY2FuIGJlIHNpZ25hbGxlZCBpbiB0d28gd2F5czogZWl0aGVyIGV4cGxpY2l0bHkKLSAgICAgICAgICogb3IgaW1wbGljaXRseSwgYWNjb3JkaW5nIHRvIE1QRUc0IHNwZWMuIEFBQysvZUFBQysgaXMgYSBkdWFsCi0gICAgICAgICAqIHJhdGUgc3lzdGVtIGFuZCB0aGUgc2FtcGxpbmcgcmF0ZSBpbiB0aGUgZmluYWwgb3V0cHV0IGlzIGFjdHVhbGx5Ci0gICAgICAgICAqIGRvdWJsZWQgY29tcGFyZWQgd2l0aCB0aGUgY29yZSBBQUMgZGVjb2RlciBzYW1wbGluZyByYXRlLgotICAgICAgICAgKgotICAgICAgICAgKiBFeHBsaWNpdCBzaWduYWxsaW5nIGlzIGRvbmUgYnkgZXhwbGljaXRseSBkZWZpbmluZyBTQlIgYXVkaW8gb2JqZWN0Ci0gICAgICAgICAqIHR5cGUgaW4gdGhlIGJpdHN0cmVhbS4gSW1wbGljaXQgc2lnbmFsbGluZyBpcyBkb25lIGJ5IGVtYmVkZGluZwotICAgICAgICAgKiBTQlIgY29udGVudCBpbiBBQUMgZXh0ZW5zaW9uIHBheWxvYWQgc3BlY2lmaWMgdG8gU0JSLCBhbmQgaGVuY2UKLSAgICAgICAgICogcmVxdWlyZXMgYW4gQUFDIGRlY29kZXIgdG8gcGVyZm9ybSBwcmUtY2hlY2tzIG9uIGFjdHVhbCBhdWRpbyBmcmFtZXMuCi0gICAgICAgICAqCi0gICAgICAgICAqIFRodXMsIHdlIGNvdWxkIG5vdCBzYXkgZm9yIHN1cmUgd2hldGhlciBhIHN0cmVhbSBpcwotICAgICAgICAgKiBBQUMrL2VBQUMrIHVudGlsIHRoZSBmaXJzdCBkYXRhIGZyYW1lIGlzIGRlY29kZWQuCi0gICAgICAgICAqLwotICAgICAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPD0gMikgewotICAgICAgICAgICAgaWYgKG1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlICE9IHByZXZTYW1wbGVSYXRlIHx8Ci0gICAgICAgICAgICAgICAgbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzICE9IHByZXZOdW1DaGFubmVscykgewotICAgICAgICAgICAgICAgIG1heWJlQ29uZmlndXJlRG93bm1peCgpOwotICAgICAgICAgICAgICAgIEFMT0dJKCJSZWNvbmZpZ3VyaW5nIGRlY29kZXI6ICVkLT4lZCBIeiwgJWQtPiVkIGNoYW5uZWxzIiwKLSAgICAgICAgICAgICAgICAgICAgICBwcmV2U2FtcGxlUmF0ZSwgbVN0cmVhbUluZm8tPnNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgcHJldk51bUNoYW5uZWxzLCBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpOworICAgICAgICBpZiAobUVuZE9mSW5wdXQpIHsKKyAgICAgICAgICAgIHdoaWxlIChtT3V0cHV0RGVsYXlDb21wZW5zYXRlZCA+IDApIHsKKyAgICAgICAgICAgICAgICAvLyBhIGJ1ZmZlciBiaWcgZW5vdWdoIGZvciBNQVhfQ0hBTk5FTF9DT1VOVCBjaGFubmVscyBvZiBkZWNvZGVkIEhFLUFBQworICAgICAgICAgICAgICAgIElOVF9QQ00gdG1wT3V0QnVmZmVyWzIwNDggKiBNQVhfQ0hBTk5FTF9DT1VOVF07CisgCisgICAgICAgICAgICAgICAgIC8vIHJ1biBEUkMgY2hlY2sKKyAgICAgICAgICAgICAgICAgbURyY1dyYXAuc3VibWl0U3RyZWFtRGF0YShtU3RyZWFtSW5mbyk7CisgICAgICAgICAgICAgICAgIG1EcmNXcmFwLnVwZGF0ZSgpOwogCi0gICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIDEsIDAsIE5VTEwpOwotICAgICAgICAgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBBV0FJVElOR19ESVNBQkxFRDsKKyAgICAgICAgICAgICAgICBBQUNfREVDT0RFUl9FUlJPUiBkZWNvZGVyRXJyID0KKyAgICAgICAgICAgICAgICAgICAgYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZShtQUFDRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBPdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA0OCAqIE1BWF9DSEFOTkVMX0NPVU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBQ0RFQ19GTFVTSCk7CisgICAgICAgICAgICAgICAgaWYgKGRlY29kZXJFcnIgIT0gQUFDX0RFQ19PSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSBkZWNvZGVyRXJyID0gMHglNC40eCIsIGRlY29kZXJFcnIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludDMyX3QgdG1wT3V0QnVmZmVyU2FtcGxlcyA9IG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHM7CisgICAgICAgICAgICAgICAgaWYgKHRtcE91dEJ1ZmZlclNhbXBsZXMgPiBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZCkgeworICAgICAgICAgICAgICAgICAgICB0bXBPdXRCdWZmZXJTYW1wbGVzID0gbU91dHB1dERlbGF5Q29tcGVuc2F0ZWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dHB1dERlbGF5UmluZ0J1ZmZlclB1dFNhbXBsZXModG1wT3V0QnVmZmVyLCB0bXBPdXRCdWZmZXJTYW1wbGVzKTsKKyAgICAgICAgICAgICAgICBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZCAtPSB0bXBPdXRCdWZmZXJTYW1wbGVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKCFvdXRRdWV1ZS5lbXB0eSgpCisgICAgICAgICAgICAgICAgJiYgb3V0cHV0RGVsYXlSaW5nQnVmZmVyU2FtcGxlc0F2YWlsYWJsZSgpCisgICAgICAgICAgICAgICAgICAgICAgICA+PSBtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKSB7CisgICAgICAgICAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7CisgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyID0gb3V0SW5mby0+bUhlYWRlcjsKKworICAgICAgICAgICAgaWYgKG91dEhlYWRlci0+bk9mZnNldCAhPSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIm91dEhlYWRlci0+bk9mZnNldCAhPSAwIGlzIG5vdCBoYW5kbGVkIik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCFtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZSB8fCAhbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKSB7Ci0gICAgICAgICAgICBBTE9HVygiSW52YWxpZCBBQUMgc3RyZWFtIik7Ci0gICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwotICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIGRlY29kZXJFcnIsIE5VTEwpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9CiAKLSAgICAgICAgaWYgKGRlY29kZXJFcnIgPT0gQUFDX0RFQ19PSyB8fCBtTnVtU2FtcGxlc091dHB1dCA+IDApIHsKLSAgICAgICAgICAgIC8vIFdlJ2xsIG9ubHkgb3V0cHV0IGRhdGEgaWYgd2Ugc3VjY2Vzc2Z1bGx5IGRlY29kZWQgaXQgb3IKLSAgICAgICAgICAgIC8vIHdlJ3ZlIHByZXZpb3VzbHkgZGVjb2RlZCB2YWxpZCBkYXRhLCBpbiB0aGUgbGF0dGVyIGNhc2UKLSAgICAgICAgICAgIC8vIChkZWNvZGUgZmFpbGVkKSB3ZSdsbCBvdXRwdXQgYSBzaWxlbnQgZnJhbWUuCi0gICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSBudW1PdXRCeXRlczsKLSAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gMDsKKyAgICAgICAgICAgIElOVF9QQ00gKm91dEJ1ZmZlciA9CisgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8SU5UX1BDTSAqPihvdXRIZWFkZXItPnBCdWZmZXIgKyBvdXRIZWFkZXItPm5PZmZzZXQpOworICAgICAgICAgICAgaW50IHNhbXBsZXNpemUgPSBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCk7CisgICAgICAgICAgICBpZiAob3V0SGVhZGVyLT5uT2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICsgbVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIHNhbXBsZXNpemUKKyAgICAgICAgICAgICAgICAgICAgPiBvdXRIZWFkZXItPm5BbGxvY0xlbikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJidWZmZXIgb3ZlcmZsb3ciKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CiAKLSAgICAgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9Ci0gICAgICAgICAgICAgICAgbUFuY2hvclRpbWVVcwotICAgICAgICAgICAgICAgICAgICArIChtTnVtU2FtcGxlc091dHB1dCAqIDEwMDAwMDBsbCkgLyBtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZTsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbU51bVNhbXBsZXNPdXRwdXQgKz0gbVN0cmVhbUluZm8tPmZyYW1lU2l6ZTsKKyAgICAgICAgICAgIGludCBhdmFpbGFibGUgPSBvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCk7CisgICAgICAgICAgICBpbnQgbnVtU2FtcGxlcyA9IG91dEhlYWRlci0+bkFsbG9jTGVuIC8gc2l6ZW9mKGludDE2X3QpOworICAgICAgICAgICAgaWYgKG51bVNhbXBsZXMgPiBhdmFpbGFibGUpIHsKKyAgICAgICAgICAgICAgICBudW1TYW1wbGVzID0gYXZhaWxhYmxlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50NjRfdCBjdXJyZW50VGltZSA9IDA7CisgICAgICAgICAgICBpZiAoYXZhaWxhYmxlKSB7CiAKKyAgICAgICAgICAgICAgICBpbnQgbnVtRnJhbWVzID0gbnVtU2FtcGxlcyAvIChtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBudW1TYW1wbGVzID0gbnVtRnJhbWVzICogKG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpOworCisgICAgICAgICAgICAgICAgQUxPR1YoIiVkIHNhbXBsZXMgYXZhaWxhYmxlICglZCksIG9yICVkIGZyYW1lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzLCBhdmFpbGFibGUsIG51bUZyYW1lcyk7CisgICAgICAgICAgICAgICAgaW50NjRfdCAqbmV4dFRpbWVTdGFtcCA9ICZtQnVmZmVyVGltZXN0YW1wcy5lZGl0SXRlbUF0KDApOworICAgICAgICAgICAgICAgIGN1cnJlbnRUaW1lID0gKm5leHRUaW1lU3RhbXA7CisgICAgICAgICAgICAgICAgaW50MzJfdCAqY3VycmVudEJ1ZkxlZnQgPSAmbUJ1ZmZlclNpemVzLmVkaXRJdGVtQXQoMCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GcmFtZXM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRlY29kZWRTaXplID0gbURlY29kZWRTaXplcy5pdGVtQXQoMCk7CisgICAgICAgICAgICAgICAgICAgIG1EZWNvZGVkU2l6ZXMucmVtb3ZlQXQoMCk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJkZWNvZGVkICVkIG9mICVkIiwgZGVjb2RlZFNpemUsICpjdXJyZW50QnVmTGVmdCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgqY3VycmVudEJ1ZkxlZnQgPiBkZWNvZGVkU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRqdXN0L2ludGVycG9sYXRlIG5leHQgdGltZSBzdGFtcAorICAgICAgICAgICAgICAgICAgICAgICAgKmN1cnJlbnRCdWZMZWZ0IC09IGRlY29kZWRTaXplOworICAgICAgICAgICAgICAgICAgICAgICAgKm5leHRUaW1lU3RhbXAgKz0gbVN0cmVhbUluZm8tPmFhY1NhbXBsZXNQZXJGcmFtZSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDBsbCAvIG1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImFkanVzdGVkIG5leHRUaW1lU3RhbXAvc2l6ZSB0byAlbGxkLyVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5leHRUaW1lU3RhbXAsICpjdXJyZW50QnVmTGVmdCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIHRvIG5leHQgdGltZXN0YW1wIGluIGxpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQnVmZmVyVGltZXN0YW1wcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlclRpbWVzdGFtcHMucmVtb3ZlQXQoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFRpbWVTdGFtcCA9ICZtQnVmZmVyVGltZXN0YW1wcy5lZGl0SXRlbUF0KDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJTaXplcy5yZW1vdmVBdCgwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QnVmTGVmdCA9ICZtQnVmZmVyU2l6ZXMuZWRpdEl0ZW1BdCgwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigibW92ZWQgdG8gbmV4dCB0aW1lL3NpemU6ICVsbGQvJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5leHRUaW1lU3RhbXAsICpjdXJyZW50QnVmTGVmdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnkgdG8gbGltaXQgb3V0cHV0IGJ1ZmZlciBzaXplIHRvIG1hdGNoIGlucHV0IGJ1ZmZlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIChlLmcgd2hlbiBhbiBpbnB1dCBidWZmZXIgY29udGFpbmVkIDQgInN1YiIgZnJhbWVzLCBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0IG1vc3QgNCBkZWNvZGVkIHVuaXRzIGluIHRoZSBjb3JyZXNwb25kaW5nIG91dHB1dCBidWZmZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIG9wdGlvbmFsLiBSZW1vdmUgdGhlIG5leHQgdGhyZWUgbGluZXMgdG8gZmlsbCB0aGUgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBidWZmZXIgd2l0aCBhcyBtYW55IHVuaXRzIGFzIGF2YWlsYWJsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcyA9IGkgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcyA9IG51bUZyYW1lcyAqIG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEFMT0dWKCJnZXR0aW5nICVkIGZyb20gcmluZ2J1ZmZlciIsIG51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgIGludDMyX3QgbnMgPSBvdXRwdXREZWxheVJpbmdCdWZmZXJHZXRTYW1wbGVzKG91dEJ1ZmZlciwgbnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgaWYgKG5zICE9IG51bVNhbXBsZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIm5vdCBhIGNvbXBsZXRlIGZyYW1lIG9mIHNhbXBsZXMgYXZhaWxhYmxlIik7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gbnVtU2FtcGxlcyAqIHNpemVvZihpbnQxNl90KTsKKworICAgICAgICAgICAgaWYgKG1FbmRPZklucHV0ICYmICFvdXRRdWV1ZS5lbXB0eSgpICYmIG91dHB1dERlbGF5UmluZ0J1ZmZlclNhbXBsZXNBdmFpbGFibGUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7CisgICAgICAgICAgICAgICAgbUVuZE9mT3V0cHV0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPSBjdXJyZW50VGltZTsKKworICAgICAgICAgICAgbU91dHB1dEJ1ZmZlckNvdW50Kys7CiAgICAgICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CiAgICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKICAgICAgICAgICAgIG91dEluZm8gPSBOVUxMOworICAgICAgICAgICAgQUxPR1YoIm91dCB0aW1lc3RhbXAgJWxsZCAvICVkIiwgb3V0SGVhZGVyLT5uVGltZVN0YW1wLCBvdXRIZWFkZXItPm5GaWxsZWRMZW4pOwogICAgICAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKICAgICAgICAgICAgIG91dEhlYWRlciA9IE5VTEw7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoZGVjb2RlckVyciA9PSBBQUNfREVDX09LKSB7Ci0gICAgICAgICAgICArK21JbnB1dEJ1ZmZlckNvdW50OworICAgICAgICBpZiAobUVuZE9mSW5wdXQpIHsKKyAgICAgICAgICAgIGlmIChvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCkgPiAwCisgICAgICAgICAgICAgICAgICAgICYmIG91dHB1dERlbGF5UmluZ0J1ZmZlclNhbXBsZXNBdmFpbGFibGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwgbVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJub3QgYSBjb21wbGV0ZSBmcmFtZSBvZiBzYW1wbGVzIGF2YWlsYWJsZSIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1FbmRPZklucHV0ICYmICFvdXRRdWV1ZS5lbXB0eSgpICYmIG91dHB1dERlbGF5UmluZ0J1ZmZlclNhbXBsZXNBdmFpbGFibGUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtRW5kT2ZPdXRwdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc2VuZCBlbXB0eSBibG9jayBzaWduYWxpbmcgRU9TCisgICAgICAgICAgICAgICAgICAgIG1FbmRPZk91dHB1dCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIEJ1ZmZlckluZm8gKm91dEluZm8gPSAqb3V0UXVldWUuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dEhlYWRlci0+bk9mZnNldCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgib3V0SGVhZGVyLT5uT2Zmc2V0ICE9IDAgaXMgbm90IGhhbmRsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBJTlRfUENNICpvdXRCdWZmZXIgPSByZWludGVycHJldF9jYXN0PElOVF9QQ00gKj4ob3V0SGVhZGVyLT5wQnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBvdXRIZWFkZXItPm5PZmZzZXQpOworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5zID0gMDsKKyAgICAgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gMDsKKyAgICAgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7CisKKyAgICAgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0gbUJ1ZmZlclRpbWVzdGFtcHMuaXRlbUF0KDApOworICAgICAgICAgICAgICAgICAgICBtQnVmZmVyVGltZXN0YW1wcy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICBtQnVmZmVyU2l6ZXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgbURlY29kZWRTaXplcy5jbGVhcigpOworCisgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJDb3VudCsrOworICAgICAgICAgICAgICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgICAgICAgICBvdXRJbmZvID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0SGVhZGVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7IC8vIGlmIG91dFF1ZXVlIG5vdCBlbXB0eSBidXQgbm8gbW9yZSBvdXRwdXQKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KQEAgLTYwNiwyOCArMTAxMCw3NyBAQAogICAgICAgICAvLyBkZXBlbmQgb24gZnJhZ21lbnRzIGZyb20gdGhlIGxhc3Qgb25lIGRlY29kZWQuCiAgICAgICAgIC8vIGRyYWluIGFsbCBleGlzdGluZyBkYXRhCiAgICAgICAgIGRyYWluRGVjb2RlcigpOworICAgICAgICBtQnVmZmVyVGltZXN0YW1wcy5jbGVhcigpOworICAgICAgICBtQnVmZmVyU2l6ZXMuY2xlYXIoKTsKKyAgICAgICAgbURlY29kZWRTaXplcy5jbGVhcigpOworICAgICAgICBtTGFzdEluSGVhZGVyID0gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgYXZhaWw7CisgICAgICAgIHdoaWxlICgoYXZhaWwgPSBvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCkpID4gMCkgeworICAgICAgICAgICAgaWYgKGF2YWlsID4gbVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscykgeworICAgICAgICAgICAgICAgIGF2YWlsID0gbVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVsczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludDMyX3QgbnMgPSBvdXRwdXREZWxheVJpbmdCdWZmZXJHZXRTYW1wbGVzKDAsIGF2YWlsKTsKKyAgICAgICAgICAgIGlmIChucyAhPSBhdmFpbCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJub3QgYSBjb21wbGV0ZSBmcmFtZSBvZiBzYW1wbGVzIGF2YWlsYWJsZSIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU91dHB1dEJ1ZmZlckNvdW50Kys7CisgICAgICAgIH0KKyAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgPSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3M7CiAgICAgfQogfQogCiB2b2lkIFNvZnRBQUMyOjpkcmFpbkRlY29kZXIoKSB7Ci0gICAgLy8gYSBidWZmZXIgYmlnIGVub3VnaCBmb3IgNiBjaGFubmVscyBvZiBkZWNvZGVkIEhFLUFBQwotICAgIHNob3J0IGJ1ZiBbMjA0OCo2XTsKLSAgICBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKG1BQUNEZWNvZGVyLAotICAgICAgICAgICAgYnVmLCBzaXplb2YoYnVmKSwgQUFDREVDX0ZMVVNIIHwgQUFDREVDX0NMUkhJU1QgfCBBQUNERUNfSU5UUik7Ci0gICAgYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZShtQUFDRGVjb2RlciwKLSAgICAgICAgICAgIGJ1Ziwgc2l6ZW9mKGJ1ZiksIEFBQ0RFQ19GTFVTSCB8IEFBQ0RFQ19DTFJISVNUIHwgQUFDREVDX0lOVFIpOwotICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19UUERFQ19DTEVBUl9CVUZGRVIsIDEpOwotICAgIG1EZWNvZGVySGFzRGF0YSA9IGZhbHNlOworICAgIGludDMyX3Qgb3V0cHV0RGVsYXkgPSBtU3RyZWFtSW5mby0+b3V0cHV0RGVsYXkgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHM7CisKKyAgICAvLyBmbHVzaCBkZWNvZGVyIHVudGlsIG91dHB1dERlbGF5IGlzIGNvbXBlbnNhdGVkCisgICAgd2hpbGUgKG1PdXRwdXREZWxheUNvbXBlbnNhdGVkID4gMCkgeworICAgICAgICAvLyBhIGJ1ZmZlciBiaWcgZW5vdWdoIGZvciBNQVhfQ0hBTk5FTF9DT1VOVCBjaGFubmVscyBvZiBkZWNvZGVkIEhFLUFBQworICAgICAgICBJTlRfUENNIHRtcE91dEJ1ZmZlclsyMDQ4ICogTUFYX0NIQU5ORUxfQ09VTlRdOworCisgICAgICAgIC8vIHJ1biBEUkMgY2hlY2sKKyAgICAgICAgbURyY1dyYXAuc3VibWl0U3RyZWFtRGF0YShtU3RyZWFtSW5mbyk7CisgICAgICAgIG1EcmNXcmFwLnVwZGF0ZSgpOworCisgICAgICAgIEFBQ19ERUNPREVSX0VSUk9SIGRlY29kZXJFcnIgPQorICAgICAgICAgICAgYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZShtQUFDRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wT3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDQ4ICogTUFYX0NIQU5ORUxfQ09VTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBQ0RFQ19GTFVTSCk7CisgICAgICAgIGlmIChkZWNvZGVyRXJyICE9IEFBQ19ERUNfT0spIHsKKyAgICAgICAgICAgIEFMT0dXKCJhYWNEZWNvZGVyX0RlY29kZUZyYW1lIGRlY29kZXJFcnIgPSAweCU0LjR4IiwgZGVjb2RlckVycik7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IHRtcE91dEJ1ZmZlclNhbXBsZXMgPSBtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzOworICAgICAgICBpZiAodG1wT3V0QnVmZmVyU2FtcGxlcyA+IG1PdXRwdXREZWxheUNvbXBlbnNhdGVkKSB7CisgICAgICAgICAgICB0bXBPdXRCdWZmZXJTYW1wbGVzID0gbU91dHB1dERlbGF5Q29tcGVuc2F0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgb3V0cHV0RGVsYXlSaW5nQnVmZmVyUHV0U2FtcGxlcyh0bXBPdXRCdWZmZXIsIHRtcE91dEJ1ZmZlclNhbXBsZXMpOworCisgICAgICAgIG1PdXRwdXREZWxheUNvbXBlbnNhdGVkIC09IHRtcE91dEJ1ZmZlclNhbXBsZXM7CisgICAgfQogfQogCiB2b2lkIFNvZnRBQUMyOjpvblJlc2V0KCkgewogICAgIGRyYWluRGVjb2RlcigpOwogICAgIC8vIHJlc2V0IHRoZSAiY29uZmlndXJlZCIgc3RhdGUKICAgICBtSW5wdXRCdWZmZXJDb3VudCA9IDA7Ci0gICAgbU51bVNhbXBsZXNPdXRwdXQgPSAwOworICAgIG1PdXRwdXRCdWZmZXJDb3VudCA9IDA7CisgICAgbU91dHB1dERlbGF5Q29tcGVuc2F0ZWQgPSAwOworICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyA9IDA7CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgPSAwOworICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJGaWxsZWQgPSAwOworICAgIG1FbmRPZklucHV0ID0gZmFsc2U7CisgICAgbUVuZE9mT3V0cHV0ID0gZmFsc2U7CisgICAgbUJ1ZmZlclRpbWVzdGFtcHMuY2xlYXIoKTsKKyAgICBtQnVmZmVyU2l6ZXMuY2xlYXIoKTsKKyAgICBtRGVjb2RlZFNpemVzLmNsZWFyKCk7CisgICAgbUxhc3RJbkhlYWRlciA9IE5VTEw7CisKICAgICAvLyBUbyBtYWtlIHRoZSBjb2RlYyBiZWhhdmUgdGhlIHNhbWUgYmVmb3JlIGFuZCBhZnRlciBhIHJlc2V0LCB3ZSBuZWVkIHRvIGludmFsaWRhdGUgdGhlCiAgICAgLy8gc3RyZWFtaW5mbyBzdHJ1Y3QuIFRoaXMgZG9lcyB0aGF0OgotICAgIG1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlID0gMDsKKyAgICBtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZSA9IDA7IC8vIFRPRE86IG1TdHJlYW1JbmZvIGlzIHJlYWQgb25seQogCiAgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CiAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IE5PTkU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmgKaW5kZXggMmQ5NjBhYi4uYzNlNDQ1OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuaApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgIlNpbXBsZVNvZnRPTVhDb21wb25lbnQuaCIKIAogI2luY2x1ZGUgImFhY2RlY29kZXJfbGliLmgiCisjaW5jbHVkZSAiRHJjUHJlc01vZGVXcmFwLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDcsMTYgKzQ4LDIyIEBACiAgICAgZW51bSB7CiAgICAgICAgIGtOdW1JbnB1dEJ1ZmZlcnMgICAgICAgID0gNCwKICAgICAgICAga051bU91dHB1dEJ1ZmZlcnMgICAgICAgPSA0LAorICAgICAgICBrTnVtRGVsYXlCbG9ja3NNYXggICAgICA9IDgsCiAgICAgfTsKIAogICAgIEhBTkRMRV9BQUNERUNPREVSIG1BQUNEZWNvZGVyOwogICAgIENTdHJlYW1JbmZvICptU3RyZWFtSW5mbzsKICAgICBib29sIG1Jc0FEVFM7Ci0gICAgYm9vbCBtRGVjb2Rlckhhc0RhdGE7CisgICAgYm9vbCBtSXNGaXJzdDsKICAgICBzaXplX3QgbUlucHV0QnVmZmVyQ291bnQ7CisgICAgc2l6ZV90IG1PdXRwdXRCdWZmZXJDb3VudDsKICAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKLSAgICBpbnQ2NF90IG1BbmNob3JUaW1lVXM7Ci0gICAgaW50NjRfdCBtTnVtU2FtcGxlc091dHB1dDsKKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqbUxhc3RJbkhlYWRlcjsKKyAgICBWZWN0b3I8aW50MzJfdD4gbUJ1ZmZlclNpemVzOworICAgIFZlY3RvcjxpbnQzMl90PiBtRGVjb2RlZFNpemVzOworICAgIFZlY3RvcjxpbnQ2NF90PiBtQnVmZmVyVGltZXN0YW1wczsKKworICAgIENEcmNQcmVzTW9kZVdyYXBwZXIgbURyY1dyYXA7CiAKICAgICBlbnVtIHsKICAgICAgICAgTk9ORSwKQEAgLTY3LDkgKzc0LDIzIEBACiAgICAgdm9pZCBpbml0UG9ydHMoKTsKICAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOwogICAgIGJvb2wgaXNDb25maWd1cmVkKCkgY29uc3Q7Ci0gICAgdm9pZCBtYXliZUNvbmZpZ3VyZURvd25taXgoKSBjb25zdDsKKyAgICB2b2lkIGNvbmZpZ3VyZURvd25taXgoKSBjb25zdDsKICAgICB2b2lkIGRyYWluRGVjb2RlcigpOwogCisvLyAgICAgIGRlbGF5IGNvbXBlbnNhdGlvbgorICAgIGJvb2wgbUVuZE9mSW5wdXQ7CisgICAgYm9vbCBtRW5kT2ZPdXRwdXQ7CisgICAgaW50MzJfdCBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZDsKKyAgICBpbnQzMl90IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplOworICAgIHNob3J0ICptT3V0cHV0RGVsYXlSaW5nQnVmZmVyOworICAgIGludDMyX3QgbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zOworICAgIGludDMyX3QgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3M7CisgICAgaW50MzJfdCBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyRmlsbGVkOworICAgIGJvb2wgb3V0cHV0RGVsYXlSaW5nQnVmZmVyUHV0U2FtcGxlcyhJTlRfUENNICpzYW1wbGVzLCBpbnQgbnVtU2FtcGxlcyk7CisgICAgaW50MzJfdCBvdXRwdXREZWxheVJpbmdCdWZmZXJHZXRTYW1wbGVzKElOVF9QQ00gKnNhbXBsZXMsIGludCBudW1TYW1wbGVzKTsKKyAgICBpbnQzMl90IG91dHB1dERlbGF5UmluZ0J1ZmZlclNhbXBsZXNBdmFpbGFibGUoKTsKKyAgICBpbnQzMl90IG91dHB1dERlbGF5UmluZ0J1ZmZlclNwYWNlTGVmdCgpOworCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdEFBQzIpOwogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BbmRyb2lkLm1rCmluZGV4IDA1N2M2OWIuLjU4ZWMzYmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL0FuZHJvaWQubWsKQEAgLTgyLDYgKzgyLDggQEAKIExPQ0FMX0NfSU5DTFVERVMgKz0gJChMT0NBTF9QQVRIKS9zcmMvYXNtL0FSTVY3CiBlbmRpZgogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC0xMDYsNiArMTA4LDggQEAKIAogICBMT0NBTF9DRkxBR1MgOj0KIAorICBMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiAgIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGliRnJhdW5ob2ZlckFBQwogCiAgIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXApAQCAtMTI4LDYgKzEzMiw4IEBACiAKICAgTE9DQUxfQ0ZMQUdTIDo9IC1ET1NDTF9JTVBPUlRfUkVGPQogCisgIExPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKICAgTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCiAgICAgICAgICAgbGlic3RhZ2VmcmlnaHRfYWFjZW5jCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU29mdEFBQ0VuY29kZXIyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU29mdEFBQ0VuY29kZXIyLmNwcAppbmRleCBmNWM4NThhLi5lOGRhYmVkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NvZnRBQUNFbmNvZGVyMi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9Tb2Z0QUFDRW5jb2RlcjIuY3BwCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlICJTb2Z0QUFDRW5jb2RlcjIuaCIKKyNpbmNsdWRlIDxPTVhfQXVkaW9FeHQuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CkBAIC00NCw2ICs0NSw4IEBACiAgICAgICBtTnVtQ2hhbm5lbHMoMSksCiAgICAgICBtU2FtcGxlUmF0ZSg0NDEwMCksCiAgICAgICBtQml0UmF0ZSgwKSwKKyAgICAgIG1TQlJNb2RlKC0xKSwKKyAgICAgIG1TQlJSYXRpbygwKSwKICAgICAgIG1BQUNQcm9maWxlKE9NWF9BVURJT19BQUNPYmplY3RMQyksCiAgICAgICBtU2VudENvZGVjU3BlY2lmaWNEYXRhKGZhbHNlKSwKICAgICAgIG1JbnB1dFNpemUoMCksCkBAIC0xNjQsNiArMTY3LDQxIEBACiAgICAgICAgICAgICBhYWNQYXJhbXMtPm5TYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7CiAgICAgICAgICAgICBhYWNQYXJhbXMtPm5GcmFtZUxlbmd0aCA9IDA7CiAKKyAgICAgICAgICAgIHN3aXRjaCAobVNCUk1vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgMTogLy8gc2JyIG9uCisgICAgICAgICAgICAgICAgc3dpdGNoIChtU0JSUmF0aW8pIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgIC8vIHNldCBib3RoIE9NWCBBQUMgdG9vbCBmbGFncworICAgICAgICAgICAgICAgICAgICBhYWNQYXJhbXMtPm5BQUN0b29scyB8PSBPTVhfQVVESU9fQUFDVG9vbEFuZHJvaWRTU0JSOworICAgICAgICAgICAgICAgICAgICBhYWNQYXJhbXMtPm5BQUN0b29scyB8PSBPTVhfQVVESU9fQUFDVG9vbEFuZHJvaWREU0JSOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIC8vIHNldCBzaW5nbGUtcmF0ZSBTQlIgYWN0aXZlCisgICAgICAgICAgICAgICAgICAgIGFhY1BhcmFtcy0+bkFBQ3Rvb2xzIHw9IE9NWF9BVURJT19BQUNUb29sQW5kcm9pZFNTQlI7CisgICAgICAgICAgICAgICAgICAgIGFhY1BhcmFtcy0+bkFBQ3Rvb2xzICY9IH5PTVhfQVVESU9fQUFDVG9vbEFuZHJvaWREU0JSOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIC8vIHNldCBkdWFsLXJhdGUgU0JSIGFjdGl2ZQorICAgICAgICAgICAgICAgICAgICBhYWNQYXJhbXMtPm5BQUN0b29scyAmPSB+T01YX0FVRElPX0FBQ1Rvb2xBbmRyb2lkU1NCUjsKKyAgICAgICAgICAgICAgICAgICAgYWFjUGFyYW1zLT5uQUFDdG9vbHMgfD0gT01YX0FVRElPX0FBQ1Rvb2xBbmRyb2lkRFNCUjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImludmFsaWQgU0JSIHJhdGlvICVkIiwgbVNCUlJhdGlvKTsKKyAgICAgICAgICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDA6ICAvLyBzYnIgb2ZmCisgICAgICAgICAgICBjYXNlIC0xOiAvLyBzYnIgdW5kZWZpbmVkCisgICAgICAgICAgICAgICAgYWFjUGFyYW1zLT5uQUFDdG9vbHMgJj0gfk9NWF9BVURJT19BQUNUb29sQW5kcm9pZFNTQlI7CisgICAgICAgICAgICAgICAgYWFjUGFyYW1zLT5uQUFDdG9vbHMgJj0gfk9NWF9BVURJT19BQUNUb29sQW5kcm9pZERTQlI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dFKCJpbnZhbGlkIFNCUiBtb2RlICVkIiwgbVNCUk1vZGUpOworICAgICAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgICAgICAgICB9CisKKworCiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCkBAIC0yNjcsNiArMzA1LDIzIEBACiAgICAgICAgICAgICAgICAgbUFBQ1Byb2ZpbGUgPSBhYWNQYXJhbXMtPmVBQUNQcm9maWxlOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAoIShhYWNQYXJhbXMtPm5BQUN0b29scyAmIE9NWF9BVURJT19BQUNUb29sQW5kcm9pZFNTQlIpCisgICAgICAgICAgICAgICAgICAgICYmICEoYWFjUGFyYW1zLT5uQUFDdG9vbHMgJiBPTVhfQVVESU9fQUFDVG9vbEFuZHJvaWREU0JSKSkgeworICAgICAgICAgICAgICAgIG1TQlJNb2RlID0gMDsKKyAgICAgICAgICAgICAgICBtU0JSUmF0aW8gPSAwOworICAgICAgICAgICAgfSBlbHNlIGlmICgoYWFjUGFyYW1zLT5uQUFDdG9vbHMgJiBPTVhfQVVESU9fQUFDVG9vbEFuZHJvaWRTU0JSKQorICAgICAgICAgICAgICAgICAgICAmJiAhKGFhY1BhcmFtcy0+bkFBQ3Rvb2xzICYgT01YX0FVRElPX0FBQ1Rvb2xBbmRyb2lkRFNCUikpIHsKKyAgICAgICAgICAgICAgICBtU0JSTW9kZSA9IDE7CisgICAgICAgICAgICAgICAgbVNCUlJhdGlvID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIShhYWNQYXJhbXMtPm5BQUN0b29scyAmIE9NWF9BVURJT19BQUNUb29sQW5kcm9pZFNTQlIpCisgICAgICAgICAgICAgICAgICAgICYmIChhYWNQYXJhbXMtPm5BQUN0b29scyAmIE9NWF9BVURJT19BQUNUb29sQW5kcm9pZERTQlIpKSB7CisgICAgICAgICAgICAgICAgbVNCUk1vZGUgPSAxOworICAgICAgICAgICAgICAgIG1TQlJSYXRpbyA9IDI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1TQlJNb2RlID0gLTE7IC8vIGNvZGVjIGRlZmF1bHQgc2JyIG1vZGUKKyAgICAgICAgICAgICAgICBtU0JSUmF0aW8gPSAwOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoc2V0QXVkaW9QYXJhbXMoKSAhPSBPSykgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9CkBAIC0zMzMsMTEgKzM4OCwxMSBAQAogfQogCiBzdGF0dXNfdCBTb2Z0QUFDRW5jb2RlcjI6OnNldEF1ZGlvUGFyYW1zKCkgewotICAgIC8vIFdlIGNhbGwgdGhpcyB3aGVuZXZlciBzYW1wbGUgcmF0ZSwgbnVtYmVyIG9mIGNoYW5uZWxzIG9yIGJpdHJhdGUgY2hhbmdlCisgICAgLy8gV2UgY2FsbCB0aGlzIHdoZW5ldmVyIHNhbXBsZSByYXRlLCBudW1iZXIgb2YgY2hhbm5lbHMsIGJpdHJhdGUgb3IgU0JSIG1vZGUgY2hhbmdlCiAgICAgLy8gaW4gcmVwb25zZSB0byBzZXRQYXJhbWV0ZXIgY2FsbHMuCiAKLSAgICBBTE9HVigic2V0QXVkaW9QYXJhbXM6ICVsdSBIeiwgJWx1IGNoYW5uZWxzLCAlbHUgYnBzIiwKLSAgICAgICAgIG1TYW1wbGVSYXRlLCBtTnVtQ2hhbm5lbHMsIG1CaXRSYXRlKTsKKyAgICBBTE9HVigic2V0QXVkaW9QYXJhbXM6ICV1IEh6LCAldSBjaGFubmVscywgJXUgYnBzLCAlaSBzYnIgbW9kZSwgJWkgc2JyIHJhdGlvIiwKKyAgICAgICAgIG1TYW1wbGVSYXRlLCBtTnVtQ2hhbm5lbHMsIG1CaXRSYXRlLCBtU0JSTW9kZSwgbVNCUlJhdGlvKTsKIAogICAgIGlmIChBQUNFTkNfT0sgIT0gYWFjRW5jb2Rlcl9TZXRQYXJhbShtQUFDRW5jb2RlciwgQUFDRU5DX0FPVCwKICAgICAgICAgICAgIGdldEFPVEZyb21Qcm9maWxlKG1BQUNQcm9maWxlKSkpIHsKQEAgLTM2MywxMCArNDE4LDI4IEBACiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KIAorICAgIGlmIChtU0JSTW9kZSAhPSAtMSAmJiBtQUFDUHJvZmlsZSA9PSBPTVhfQVVESU9fQUFDT2JqZWN0RUxEKSB7CisgICAgICAgIGlmIChBQUNFTkNfT0sgIT0gYWFjRW5jb2Rlcl9TZXRQYXJhbShtQUFDRW5jb2RlciwgQUFDRU5DX1NCUl9NT0RFLCBtU0JSTW9kZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEFBQyBlbmNvZGVyIHBhcmFtZXRlcnMiKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgLyogU0JSIHJhdGlvIHBhcmFtZXRlciBjb25maWd1cmF0aW9uczoKKyAgICAgICAwOiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gd2hlcmVpbiBTQlIgcmF0aW8gaXMgY29uZmlndXJlZCBkZXBlbmRpbmcgb24gYXVkaW8gb2JqZWN0IHR5cGUgYnkKKyAgICAgICAgICB0aGUgRkRLLgorICAgICAgIDE6IERvd25zYW1wbGVkIFNCUiAoZGVmYXVsdCBmb3IgRUxEKQorICAgICAgIDI6IER1YWxyYXRlIFNCUiAoZGVmYXVsdCBmb3IgSEUtQUFDKQorICAgICAqLworICAgIGlmIChBQUNFTkNfT0sgIT0gYWFjRW5jb2Rlcl9TZXRQYXJhbShtQUFDRW5jb2RlciwgQUFDRU5DX1NCUl9SQVRJTywgbVNCUlJhdGlvKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBBQUMgZW5jb2RlciBwYXJhbWV0ZXJzIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKwogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBTb2Z0QUFDRW5jb2RlcjI6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKK3ZvaWQgU29mdEFBQ0VuY29kZXIyOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgLyogcG9ydEluZGV4ICovKSB7CiAgICAgaWYgKG1TaWduYWxsZWRFcnJvcikgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMzkyLDcgKzQ2NSw3IEBACiAKICAgICAgICAgT01YX1UzMiBhY3R1YWxCaXRSYXRlICA9IGFhY0VuY29kZXJfR2V0UGFyYW0obUFBQ0VuY29kZXIsIEFBQ0VOQ19CSVRSQVRFKTsKICAgICAgICAgaWYgKG1CaXRSYXRlICE9IGFjdHVhbEJpdFJhdGUpIHsKLSAgICAgICAgICAgIEFMT0dXKCJSZXF1ZXN0ZWQgYml0cmF0ZSAlbHUgdW5zdXBwb3J0ZWQsIHVzaW5nICVsdSIsIG1CaXRSYXRlLCBhY3R1YWxCaXRSYXRlKTsKKyAgICAgICAgICAgIEFMT0dXKCJSZXF1ZXN0ZWQgYml0cmF0ZSAldSB1bnN1cHBvcnRlZCwgdXNpbmcgJXUiLCBtQml0UmF0ZSwgYWN0dWFsQml0UmF0ZSk7CiAgICAgICAgIH0KIAogICAgICAgICBBQUNFTkNfSW5mb1N0cnVjdCBlbmNJbmZvOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9Tb2Z0QUFDRW5jb2RlcjIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU29mdEFBQ0VuY29kZXIyLmgKaW5kZXggMjYwM2Y0Zi4uYmNlOWMyNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9Tb2Z0QUFDRW5jb2RlcjIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NvZnRBQUNFbmNvZGVyMi5oCkBAIC01Myw2ICs1Myw4IEBACiAgICAgT01YX1UzMiBtTnVtQ2hhbm5lbHM7CiAgICAgT01YX1UzMiBtU2FtcGxlUmF0ZTsKICAgICBPTVhfVTMyIG1CaXRSYXRlOworICAgIE9NWF9TMzIgbVNCUk1vZGU7CisgICAgT01YX1MzMiBtU0JSUmF0aW87CiAgICAgT01YX1UzMiBtQUFDUHJvZmlsZTsKIAogICAgIGJvb2wgbVNlbnRDb2RlY1NwZWNpZmljRGF0YTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3Avb3Blcl8zMmIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3Avb3Blcl8zMmIuYwppbmRleCBjYzAxOTI3Li4xZDAyOWZjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL29wZXJfMzJiLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9vcGVyXzMyYi5jCkBAIC0yNCw2ICsyNCw4IEBACiAjaW5jbHVkZSAiYmFzaWNfb3AuaCIKICNpbmNsdWRlICJvcGVyXzMyYi5oIgogCisjZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICAqICBGdW5jdGlvbiBMX0V4dHJhY3QoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgpAQCAtMjQzLDYgKzI0NSw4IEBACiBXb3JkMzIgcnNxcnQoV29yZDMyIHZhbHVlLCAgICAgLyohPCBPcGVyYW5kIHRvIHNxdWFyZSByb290ICgwLjAgLi4uIDEpICovCiAgICAgICAgICAgICAgV29yZDMyIGFjY3VyYWN5KSAgLyohPCBOdW1iZXIgb2YgdmFsaWQgYml0cyB0aGF0IHdpbGwgYmUgY2FsY3VsYXRlZCAqLwogeworICAgIFVOVVNFRChhY2N1cmFjeSk7CisKICAgICBXb3JkMzIgcm9vdCA9IDA7CiAJV29yZDMyIHNjYWxlOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hYWNlbmMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FhY2VuYy5jCmluZGV4IGQxYzg2MjEuLjQwZGI5MmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FhY2VuYy5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FhY2VuYy5jCkBAIC0yNyw2ICsyNyw4IEBACiAjaW5jbHVkZSAiY21uTWVtb3J5LmgiCiAjaW5jbHVkZSAibWVtYWxpZ24uaCIKIAorI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpCisKIC8qKgogKiBJbml0IHRoZSBhdWRpbyBjb2RlYyBtb2R1bGUgYW5kIHJldHVybiBjb2RlYyBoYW5kbGUKICogXHBhcmFtIHBoQ29kZWMgW09VVF0gUmV0dXJuIHRoZSB2aWRlbyBjb2RlYyBoYW5kbGUKQEAgLTQ2LDYgKzQ4LDggQEAKIAlWT19NRU1fT1BFUkFUT1IgKnBNZW1PUDsKIAlpbnQgaW50ZXJNZW07CiAKKyAgICAgICAgVU5VU0VEKHZUeXBlKTsKKwogCWludGVyTWVtID0gMDsKIAllcnJvciA9IDA7CiAKQEAgLTQ3MSw2ICs0NzUsMTAgQEAKICovCiBWT19VMzIgVk9fQVBJIHZvQUFDRW5jR2V0UGFyYW0oVk9fSEFORExFIGhDb2RlYywgVk9fUzMyIHVQYXJhbUlELCBWT19QVFIgcERhdGEpCiB7CisgICAgICAgIFVOVVNFRChoQ29kZWMpOworICAgICAgICBVTlVTRUQodVBhcmFtSUQpOworICAgICAgICBVTlVTRUQocERhdGEpOworCiAJcmV0dXJuIFZPX0VSUl9OT05FOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hZGpfdGhyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hZGpfdGhyLmMKaW5kZXggY2NmZTg4My4uNDcxNjMxYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYWRqX3Roci5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2Fkal90aHIuYwpAQCAtNzIsNyArNzIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgbkNoYW5uZWxzKQogewogICBXb3JkMTYgY2gsIHNmYiwgc2ZiR3JwOwotICBXb3JkMzIgKnB0aHJFeHAsICpwc2ZiVGhyZTsKKyAgV29yZDMyICpwdGhyRXhwID0gTlVMTCwgKnBzZmJUaHJlOwogICBmb3IgKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewogICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiA9ICZwc3lPdXRDaGFubmVsW2NoXTsKIAkgZm9yKHNmYkdycCA9IDA7IHNmYkdycCA8IHBzeU91dENoYW4tPnNmYkNudDsgc2ZiR3JwKz0gcHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXApCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9iaXRlbmMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JpdGVuYy5jCmluZGV4IGZjYzEyZGQuLmQxZmQ2NDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JpdGVuYy5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JpdGVuYy5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSAicWNfZGF0YS5oIgogI2luY2x1ZGUgImludGVyZmFjZS5oIgogCisjZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKIAogc3RhdGljIGNvbnN0ICBXb3JkMTYgZ2xvYmFsR2Fpbk9mZnNldCA9IDEwMDsKIHN0YXRpYyBjb25zdCAgV29yZDE2IGljc1Jlc2VydmVkQml0ICAgPSAwOwpAQCAtNTg1LDYgKzU4Niw4IEBACiAgIFdvcmQxNiBlbGVtZW50VXNlZEJpdHM7CiAgIFdvcmQxNiBmcmFtZUJpdHM9MDsKIAorICBVTlVTRUQoYW5jQnl0ZXMpOworCiAgIC8qICAgc3RydWN0IGJpdGJ1ZmZlciBic1dyaXRlQ29weTsgKi8KICAgYml0TWFya1VwID0gR2V0Qml0c0F2YWlsKGhCaXRTdHJlYW0pOwogICBpZihxY091dC0+cWNFbGVtZW50LmFkdHNVc2VkKSAgLyogIHdyaXRlIGFkdHMgaGVhZGVyKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2R5bl9iaXRzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9keW5fYml0cy5jCmluZGV4IDc3NjkxODguLjRkNzYzZDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2R5bl9iaXRzLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvZHluX2JpdHMuYwpAQCAtMjUsNyArMjUsNiBAQAogI2luY2x1ZGUgImJpdF9jbnQuaCIKICNpbmNsdWRlICJwc3lfY29uc3QuaCIKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogZnVuY3Rpb24gbmFtZTogYnVpbGRCaXRMb29rVXAKQEAgLTIyNiw3ICsyMjUsNyBAQAogICB9CiAKICAgd2hpbGUgKFRSVUUpIHsKLSAgICBXb3JkMTYgbWF4TWVyZ2VHYWluLCBtYXhOZHgsIG1heE5keE5leHQsIG1heE5keExhc3Q7CisgICAgV29yZDE2IG1heE1lcmdlR2FpbiwgbWF4TmR4ID0gMCwgbWF4TmR4TmV4dCwgbWF4TmR4TGFzdDsKIAogICAgIG1heE1lcmdlR2FpbiA9IGZpbmRNYXhNZXJnZShtZXJnZUdhaW5Mb29rVXAsIHNlY3Rpb25JbmZvLCBtYXhTZmIsICZtYXhOZHgpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9wc3lfbWFpbi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcHN5X21haW4uYwppbmRleCA0ZTkyMThjLi42ZjA2NzljIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9wc3lfbWFpbi5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3BzeV9tYWluLmMKQEAgLTM4LDYgKzM4LDggQEAKICNpbmNsdWRlICJ0bnNfZnVuYy5oIgogI2luY2x1ZGUgIm1lbWFsaWduLmgiCiAKKyNkZWZpbmUgVU5VU0VEKHgpICh2b2lkKSh4KQorCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgc3RhcnQgICAgICAgc2hvcnQgICAgICAgc3RvcCAqLwogc3RhdGljIFdvcmQxNiBibG9ja1R5cGUyd2luZG93U2hhcGVbXSA9IHtLQkRfV0lORE9XLFNJTkVfV0lORE9XLFNJTkVfV0lORE9XLEtCRF9XSU5ET1d9OwogCkBAIC0xNzAsNyArMTcyLDkgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogV29yZDE2IFBzeU91dERlbGV0ZShQU1lfT1VUICpoUHN5T3V0LCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCkKIHsKLSAgaFBzeU91dD1OVUxMOworICBVTlVTRUQoaFBzeU91dCk7CisgIFVOVVNFRChwTWVtT1ApOworCiAgIHJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9xY19tYWluLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9xY19tYWluLmMKaW5kZXggNDhmZjMwMC4uZTVkNzhhYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcWNfbWFpbi5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3FjX21haW4uYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgImNoYW5uZWxfbWFwLmgiCiAjaW5jbHVkZSAibWVtYWxpZ24uaCIKIAorI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpCiAKIHR5cGVkZWYgZW51bXsKICAgRlJBTUVfTEVOX0JZVEVTX01PRFVMTyA9ICAxLApAQCAtMjA0LDExICsyMDUsOCBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgUUNEZWxldGUoUUNfU1RBVEUgKmhRQywgVk9fTUVNX09QRVJBVE9SICpwTWVtT1ApCiB7Ci0KLSAgLyoKLSAgICAgbm90aGluZyB0byBkbwotICAqLwotICBoUUM9TlVMTDsKKyAgVU5VU0VEKGhRQyk7CisgIFVOVVNFRChwTWVtT1ApOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy90bnMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3Rucy5jCmluZGV4IDQ1NWE4NjQuLjUxNzI2MTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3Rucy5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3Rucy5jCkBAIC0zMCw2ICszMCw4IEBACiAjaW5jbHVkZSAicHN5X2NvbmZpZ3VyYXRpb24uaCIKICNpbmNsdWRlICJ0bnNfZnVuYy5oIgogCisjZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKKwogI2RlZmluZSBUTlNfTU9ESUZZX0JFR0lOICAgICAgICAgMjYwMCAgLyogSHogKi8KICNkZWZpbmUgUkFUSU9fUEFUQ0hfTE9XRVJfQk9SREVSIDM4MCAgIC8qIEh6ICovCiAjZGVmaW5lIFROU19HQUlOX1RIUkVTSAkJCSAxNDEgICAvKiAxLjQxKjEwMCAqLwpAQCAtNjQzLDYgKzY0NSw4IEBACiAgIFdvcmQzMiBpOwogICBXb3JkMzIgdG5zT3JkZXJQbHVzMSA9IHRuc09yZGVyICsgMTsKIAorICBVTlVTRUQod2luZG93KTsKKwogICBhc3NlcnQodG5zT3JkZXIgPD0gVE5TX01BWF9PUkRFUik7ICAgICAgLyogcmVtb3ZlIGFzc2VydHMgbGF0ZXI/IChidGcpICovCiAKICAgZm9yKGk9MDtpPHRuc09yZGVyO2krKykgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9BbmRyb2lkLm1rCmluZGV4IDMwY2UyOWMuLmEyYjNjOGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL0FuZHJvaWQubWsKQEAgLTY5LDYgKzY5LDggQEAKIExPQ0FMX0NGTEFHUyA6PSBcCiAgICAgICAgIC1ET1NDTF9VTlVTRURfQVJHPSAtRE9TQ0xfSU1QT1JUX1JFRj0gLURPU0NMX0VYUE9SVF9SRUY9CiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIExPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24KIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9BbmRyb2lkLm1rCmluZGV4IDhkNmM2ZjguLmIwNjc0NTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL0FuZHJvaWQubWsKQEAgLTQ3LDYgKzQ3LDggQEAKIExPQ0FMX0NGTEFHUyA6PSBcCiAgICAgICAgIC1ET1NDTF9VTlVTRURfQVJHPSAtRE9TQ0xfSU1QT1JUX1JFRj0KIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X2Ftcm5iZGVjCiAKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKQEAgLTY4LDYgKzcwLDggQEAKIAogTE9DQUxfQ0ZMQUdTIDo9IC1ET1NDTF9JTVBPUlRfUkVGPQogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfYW1ybmJkZWMgbGlic3RhZ2VmcmlnaHRfYW1yd2JkZWMKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9Tb2Z0QU1SLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvU29mdEFNUi5jcHAKaW5kZXggNmZiNTlkZC4uMGJhZjVmZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9Tb2Z0QU1SLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL1NvZnRBTVIuY3BwCkBAIC0yOTQsNyArMjk0LDcgQEAKICAgICByZXR1cm4gZnJhbWVTaXplOwogfQogCi12b2lkIFNvZnRBTVI6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKK3ZvaWQgU29mdEFNUjo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIC8qIHBvcnRJbmRleCAqLykgewogICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmaW5RdWV1ZSA9IGdldFBvcnRRdWV1ZSgwKTsKICAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDEpOwogCkBAIC00ODksNyArNDg5LDcgQEAKICAgICB9CiB9CiAKLXZvaWQgU29mdEFNUjo6b25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKK3ZvaWQgU29mdEFNUjo6b25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiAvKiBwb3J0SW5kZXggKi8pIHsKIH0KIAogdm9pZCBTb2Z0QU1SOjpvblBvcnRFbmFibGVDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgsIGJvb2wgZW5hYmxlZCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9BbmRyb2lkLm1rCmluZGV4IGY0ZTQ2N2EuLmFmYzBiODkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL0FuZHJvaWQubWsKQEAgLTY5LDYgKzY5LDggQEAKIExPQ0FMX0NGTEFHUyA6PSBcCiAgICAgICAgIC1ET1NDTF9VTlVTRURfQVJHPQogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBMT0NBTF9NT0RVTEUgOj0gbGlic3RhZ2VmcmlnaHRfYW1ybmJlbmMKIAogaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpAQCAtODgsNiArOTAsOCBAQAogICAgICAgICAkKExPQ0FMX1BBVEgpLy4uL2NvbW1vbi9pbmNsdWRlIFwKICAgICAgICAgJChMT0NBTF9QQVRIKS8uLi9jb21tb24KIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2Ftcm5iZW5jCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvU29mdEFNUk5CRW5jb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL1NvZnRBTVJOQkVuY29kZXIuY3BwCmluZGV4IDU0NDk1OGEuLmFhYTY3MzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvU29mdEFNUk5CRW5jb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9Tb2Z0QU1STkJFbmNvZGVyLmNwcApAQCAtMjk4LDcgKzI5OCw3IEBACiAgICAgfQogfQogCi12b2lkIFNvZnRBTVJOQkVuY29kZXI6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKK3ZvaWQgU29mdEFNUk5CRW5jb2Rlcjo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIC8qIHBvcnRJbmRleCAqLykgewogICAgIGlmIChtU2lnbmFsbGVkRXJyb3IpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL0FuZHJvaWQubWsKaW5kZXggNjc3MTA3Zi4uZWZkZjk4OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL0FuZHJvaWQubWsKQEAgLTUwLDYgKzUwLDggQEAKIExPQ0FMX0NGTEFHUyA6PSBcCiAgICAgICAgIC1ET1NDTF9VTlVTRURfQVJHPSAtRE9TQ0xfSU1QT1JUX1JFRj0KIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X2FtcndiZGVjCiAKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL0FuZHJvaWQubWsKaW5kZXggYzViOGUwYy4uNjRmZThkMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL0FuZHJvaWQubWsKQEAgLTExMiw2ICsxMTIsOCBAQAogTE9DQUxfQ19JTkNMVURFUyArPSAkKExPQ0FMX1BBVEgpL3NyYy9hc20vQVJNVjcKIGVuZGlmCiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKQEAgLTEyNiw2ICsxMjgsOCBAQAogCWZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9pbmNsdWRlIFwKIAlmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2FtcndiZW5jCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9Tb2Z0QU1SV0JFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9Tb2Z0QU1SV0JFbmNvZGVyLmNwcAppbmRleCA3NDY1MmYwLi45ZDUwYzRlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU29mdEFNUldCRW5jb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NvZnRBTVJXQkVuY29kZXIuY3BwCkBAIC0zNDUsNyArMzQ1LDcgQEAKICAgICB9CiB9CiAKLXZvaWQgU29mdEFNUldCRW5jb2Rlcjo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgewordm9pZCBTb2Z0QU1SV0JFbmNvZGVyOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgLyogcG9ydEluZGV4ICovKSB7CiAgICAgaWYgKG1TaWduYWxsZWRFcnJvcikgewogICAgICAgICByZXR1cm47CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL0ZpbHRfNmtfN2tfb3B0LnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvRmlsdF82a183a19vcHQucwppbmRleCA4NDUxMTk1Li5mMjNiNWEwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvRmlsdF82a183a19vcHQucworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvRmlsdF82a183a19vcHQucwpAQCAtMjksNiArMjksNyBAQAogICAgICAgICAgIC5nbG9iYWwgIEZpbHRfNmtfN2tfYXNtCiAgICAgICAgICAgLmV4dGVybiAgdm9BV0JfQ29weQogICAgICAgICAgIC5leHRlcm4gIGZpcl82a183aworICAgICAgICAgIC5oaWRkZW4gIGZpcl82a183awogCiBGaWx0XzZrXzdrX2FzbToKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL3ByZWRfbHQ0XzFfb3B0LnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvcHJlZF9sdDRfMV9vcHQucwppbmRleCBhYzJkZDEzLi5kZWI3ZWZjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvcHJlZF9sdDRfMV9vcHQucworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvcHJlZF9sdDRfMV9vcHQucwpAQCAtMzIsNiArMzIsNyBAQAogICAgICAgICAgLnNlY3Rpb24gIC50ZXh0CiAJIC5nbG9iYWwgICBwcmVkX2x0NF9hc20KIAkgLmV4dGVybiAgIGludGVyNF8yCisJIC5oaWRkZW4gICBpbnRlcjRfMgogCiBwcmVkX2x0NF9hc206CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L0ZpbHRfNmtfN2tfbmVvbi5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvRmlsdF82a183a19uZW9uLnMKaW5kZXggZmM0MmEwMy4uOGRmMGNhYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvRmlsdF82a183a19uZW9uLnMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvRmlsdF82a183a19uZW9uLnMKQEAgLTI4LDYgKzI4LDcgQEAKICAgICAgICAgICAuc2VjdGlvbiAgLnRleHQKICAgICAgICAgICAuZ2xvYmFsICAgRmlsdF82a183a19hc20KICAgICAgICAgICAuZXh0ZXJuICAgZmlyXzZrXzdrCisgICAgICAgICAgLmhpZGRlbiAgIGZpcl82a183awogCiBGaWx0XzZrXzdrX2FzbToKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvcHJlZF9sdDRfMV9uZW9uLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9wcmVkX2x0NF8xX25lb24ucwppbmRleCA4ZDJhYWYyLi42N2JlMWVkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9wcmVkX2x0NF8xX25lb24ucworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9wcmVkX2x0NF8xX25lb24ucwpAQCAtMjksNiArMjksNyBAQAogICAgICAgICAgIC5zZWN0aW9uICAudGV4dAogICAgICAgICAgIC5nbG9iYWwgICBwcmVkX2x0NF9hc20KICAgICAgICAgICAuZXh0ZXJuICAgaW50ZXI0XzIKKyAgICAgICAgICAuaGlkZGVuICAgaW50ZXI0XzIKIAogcHJlZF9sdDRfYXNtOgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2F1dG9jb3JyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2F1dG9jb3JyLmMKaW5kZXggOGM0NzdjYS4uMGIyZWE4OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hdXRvY29yci5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXV0b2NvcnIuYwpAQCAtMjgsNiArMjgsOCBAQAogI2luY2x1ZGUgImFjZWxwLmgiCiAjaW5jbHVkZSAiaGFtX3dpbmQudGFiIgogCisjZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKKwogdm9pZCBBdXRvY29ycigKIAkJV29yZDE2IHhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgOiBJbnB1dCBzaWduYWwgICAgICAgICAgICAgICAgICAgICAgKi8KIAkJV29yZDE2IG0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgOiBMUEMgb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTQwLDYgKzQyLDggQEAKIAlXb3JkMzIgTF9zdW0sIExfc3VtMSwgTF90bXAsIEZfTEVOOwogCVdvcmQxNiAqcDEsKnAyLCpwMzsKIAljb25zdCBXb3JkMTYgKnA0OworICAgICAgICBVTlVTRUQobSk7CisKIAkvKiBXaW5kb3dpbmcgb2Ygc2lnbmFsICovCiAJcDEgPSB4OwogCXA0ID0gdm9fd2luZG93OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9jb252b2x2ZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9jb252b2x2ZS5jCmluZGV4IGFjYmE1MzIuLjRjMWY3ZDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvY29udm9sdmUuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2NvbnZvbHZlLmMKQEAgLTI1LDYgKzI1LDggQEAKICNpbmNsdWRlICJ0eXBlZGVmLmgiCiAjaW5jbHVkZSAiYmFzaWNfb3AuaCIKIAorI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpCisKIHZvaWQgQ29udm9sdmUgKAogCQlXb3JkMTYgeFtdLCAgICAgICAgLyogKGkpICAgICA6IGlucHV0IHZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAJCVdvcmQxNiBoW10sICAgICAgICAvKiAoaSkgICAgIDogaW1wdWxzZSByZXNwb25zZSAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTM1LDYgKzM3LDggQEAKIAlXb3JkMzIgIGksIG47CiAJV29yZDE2ICp0bXBILCp0bXBYOwogCVdvcmQzMiBzOworICAgICAgICBVTlVTRUQoTCk7CisKIAlmb3IgKG4gPSAwOyBuIDwgNjQ7KQogCXsKIAkJdG1wSCA9IGgrbjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcGl0Y2hfZjQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcGl0Y2hfZjQuYwppbmRleCAwZDY2YzMxLi5iNjZiNTVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3BpdGNoX2Y0LmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9waXRjaF9mNC5jCkBAIC0zMSw2ICszMSw4IEBACiAjZGVmaW5lIFVQX1NBTVAgICAgICA0CiAjZGVmaW5lIExfSU5URVJQT0wxICA0CiAKKyNkZWZpbmUgVU5VU0VEKHgpICh2b2lkKSh4KQorCiAvKiBMb2NhbCBmdW5jdGlvbnMgKi8KIAogI2lmZGVmIEFTTV9PUFQKQEAgLTE3MSw2ICsxNzMsNyBAQAogCVdvcmQzMiBjb3JyLCBleHBfY29yciwgbm9ybSwgZXhwLCBzY2FsZTsKIAlXb3JkMTYgZXhwX25vcm0sIGV4Y2ZbTF9TVUJGUl0sIHRtcDsKIAlXb3JkMzIgTF90bXAsIExfdG1wMSwgTF90bXAyOworICAgICAgICBVTlVTRUQoTF9zdWJmcik7CiAKIAkvKiBjb21wdXRlIHRoZSBmaWx0ZXJlZCBleGNpdGF0aW9uIGZvciB0aGUgZmlyc3QgZGVsYXkgdF9taW4gKi8KIAlrID0gLXRfbWluOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9zeW5fZmlsdC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9zeW5fZmlsdC5jCmluZGV4IDFiZGEwNWEuLjk2MWFhZGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvc3luX2ZpbHQuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3N5bl9maWx0LmMKQEAgLTI2LDYgKzI2LDggQEAKICNpbmNsdWRlICJtYXRoX29wLmgiCiAjaW5jbHVkZSAiY25zdC5oIgogCisjZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKKwogdm9pZCBTeW5fZmlsdCgKIAkJV29yZDE2IGFbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTEyIDogYVttKzFdIHByZWRpY3Rpb24gY29lZmZpY2llbnRzICAgICAgICAgICAqLwogCQlXb3JkMTYgeFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBpbnB1dCBzaWduYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC05NSw2ICs5Nyw4IEBACiAJV29yZDMyIGksYTA7CiAJV29yZDMyIExfdG1wLCBMX3RtcDE7CiAJV29yZDE2ICpwMSwgKnAyLCAqcDM7CisgICAgICAgIFVOVVNFRChtKTsKKwogCWEwID0gYVswXSA+PiAoNCArIFFuZXcpOyAgICAgICAgICAvKiBpbnB1dCAvIDE2IGFuZCA+PlFuZXcgKi8KIAkvKiBEbyB0aGUgZmlsdGVyaW5nLiAqLwogCWZvciAoaSA9IDA7IGkgPCBsZzsgaSsrKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy92b0FNUldCRW5jLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3ZvQU1SV0JFbmMuYwppbmRleCBlYTlkYTUyLi5kZjdiOWIzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3ZvQU1SV0JFbmMuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3ZvQU1SV0JFbmMuYwpAQCAtMzksNiArMzksOCBAQAogI2luY2x1ZGUgIm1lbV9hbGlnbi5oIgogI2luY2x1ZGUgImNtbk1lbW9yeS5oIgogCisjZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKKwogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKICNlbmRpZgpAQCAtMTYwMiw2ICsxNjA0LDggQEAKIAlWT19NRU1fT1BFUkFUT1Igdm9NZW1vcHJhdG9yOwogI2VuZGlmCiAJVk9fTUVNX09QRVJBVE9SICpwTWVtT1A7CisgICAgICAgIFVOVVNFRCh2VHlwZSk7CisKIAlpbnQgaW50ZXJNZW0gPSAwOwogCiAJaWYocFVzZXJEYXRhID09IE5VTEwgfHwgcFVzZXJEYXRhLT5tZW1mbGFnICE9IFZPX0lNRl9VU0VSTUVNT1BFUkFUT1IgfHwgcFVzZXJEYXRhLT5tZW1EYXRhID09IE5VTEwgKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9jb21tb24vQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvY29tbW9uL0FuZHJvaWQubWsKaW5kZXggMjJkZWUxNS4uODQ0ZWYwYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9jb21tb24vQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2NvbW1vbi9BbmRyb2lkLm1rCkBAIC0xNiw0ICsxNiw2IEBACiAJJChMT0NBTF9QQVRIKS9zcmMgXAogIAkkKExPQ0FMX1BBVEgpL2luY2x1ZGUKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL0FuZHJvaWQubWsKaW5kZXggN2QxN2MyYS4uNTM3YmE0MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9BbmRyb2lkLm1rCkBAIC0zMCw2ICszMCw4IEBACiBMT0NBTF9DRkxBR1MgOj0gXAogICAgIC1ET1NDTF9JTVBPUlRfUkVGPSAtRE9TQ0xfVU5VU0VEX0FSRz0gLURPU0NMX0VYUE9SVF9SRUY9CiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKQEAgLTY5LDQgKzcxLDYgQEAKIExPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9zb2Z0X2gyNjRlbmMKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL1NvZnRBVkNFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL1NvZnRBVkNFbmNvZGVyLmNwcAppbmRleCA0YTY2MWYwLi44MGJjMzlkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9Tb2Z0QVZDRW5jb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvU29mdEFWQ0VuY29kZXIuY3BwCkBAIC0zNCw4ICszNCwxMCBAQAogCiAjaW5jbHVkZSAiU29mdEFWQ0VuY29kZXIuaCIKIAotI2lmbmRlZiBJTlQzMl9NQVgKLSNkZWZpbmUgSU5UMzJfTUFYICAgMjE0NzQ4MzY0NworI2lmIExPR19OREVCVUcKKyNkZWZpbmUgVU5VU0VEX1VOTEVTU19WRVJCT1NFKHgpICh2b2lkKSh4KQorI2Vsc2UKKyNkZWZpbmUgVU5VU0VEX1VOTEVTU19WRVJCT1NFKHgpCiAjZW5kaWYKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMTA5LDQ1ICsxMTEsMTUgQEAKICAgICByZXR1cm4gQkFEX1ZBTFVFOwogfQogCi1pbmxpbmUgc3RhdGljIHZvaWQgQ29udmVydFlVVjQyMFNlbWlQbGFuYXJUb1lVVjQyMFBsYW5hcigKLSAgICAgICAgdWludDhfdCAqaW55dXYsIHVpbnQ4X3QqIG91dHl1diwKLSAgICAgICAgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpIHsKLQotICAgIGludDMyX3Qgb3V0WXNpemUgPSB3aWR0aCAqIGhlaWdodDsKLSAgICB1aW50MzJfdCAqb3V0eSA9ICAodWludDMyX3QgKikgb3V0eXV2OwotICAgIHVpbnQxNl90ICpvdXRjYiA9ICh1aW50MTZfdCAqKSAob3V0eXV2ICsgb3V0WXNpemUpOwotICAgIHVpbnQxNl90ICpvdXRjciA9ICh1aW50MTZfdCAqKSAob3V0eXV2ICsgb3V0WXNpemUgKyAob3V0WXNpemUgPj4gMikpOwotCi0gICAgLyogWSBjb3B5aW5nICovCi0gICAgbWVtY3B5KG91dHksIGlueXV2LCBvdXRZc2l6ZSk7Ci0KLSAgICAvKiBVICYgViBjb3B5aW5nICovCi0gICAgdWludDMyX3QgKmlueXV2XzQgPSAodWludDMyX3QgKikgKGlueXV2ICsgb3V0WXNpemUpOwotICAgIGZvciAoaW50MzJfdCBpID0gaGVpZ2h0ID4+IDE7IGkgPiAwOyAtLWkpIHsKLSAgICAgICAgZm9yIChpbnQzMl90IGogPSB3aWR0aCA+PiAyOyBqID4gMDsgLS1qKSB7Ci0gICAgICAgICAgICB1aW50MzJfdCB0ZW1wID0gKmlueXV2XzQrKzsKLSAgICAgICAgICAgIHVpbnQzMl90IHRlbXBVID0gdGVtcCAmIDB4RkY7Ci0gICAgICAgICAgICB0ZW1wVSA9IHRlbXBVIHwgKCh0ZW1wID4+IDgpICYgMHhGRjAwKTsKLQotICAgICAgICAgICAgdWludDMyX3QgdGVtcFYgPSAodGVtcCA+PiA4KSAmIDB4RkY7Ci0gICAgICAgICAgICB0ZW1wViA9IHRlbXBWIHwgKCh0ZW1wID4+IDE2KSAmIDB4RkYwMCk7Ci0KLSAgICAgICAgICAgIC8vIEZsaXAgVSBhbmQgVgotICAgICAgICAgICAgKm91dGNiKysgPSB0ZW1wVjsKLSAgICAgICAgICAgICpvdXRjcisrID0gdGVtcFU7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KIHN0YXRpYyB2b2lkKiBNYWxsb2NXcmFwcGVyKAotICAgICAgICB2b2lkICp1c2VyRGF0YSwgaW50MzJfdCBzaXplLCBpbnQzMl90IGF0dHJzKSB7CisgICAgICAgIHZvaWQgKiAvKiB1c2VyRGF0YSAqLywgaW50MzJfdCBzaXplLCBpbnQzMl90IC8qIGF0dHJzICovKSB7CiAgICAgdm9pZCAqcHRyID0gbWFsbG9jKHNpemUpOwogICAgIGlmIChwdHIpCiAgICAgICAgIG1lbXNldChwdHIsIDAsIHNpemUpOwogICAgIHJldHVybiBwdHI7CiB9CiAKLXN0YXRpYyB2b2lkIEZyZWVXcmFwcGVyKHZvaWQgKnVzZXJEYXRhLCB2b2lkKiBwdHIpIHsKK3N0YXRpYyB2b2lkIEZyZWVXcmFwcGVyKHZvaWQgKiAvKiB1c2VyRGF0YSAqLywgdm9pZCogcHRyKSB7CiAgICAgZnJlZShwdHIpOwogfQogCkBAIC0xNzYsNyArMTQ4LDcgQEAKICAgICAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKICAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKICAgICAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KQotICAgIDogU2ltcGxlU29mdE9NWENvbXBvbmVudChuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCksCisgICAgOiBTb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50KG5hbWUsIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KSwKICAgICAgIG1WaWRlb1dpZHRoKDE3NiksCiAgICAgICBtVmlkZW9IZWlnaHQoMTQ0KSwKICAgICAgIG1WaWRlb0ZyYW1lUmF0ZSgzMCksCkBAIC0yMjEsNyArMTkzLDcgQEAKICAgICBtSGFuZGxlLT5DQkFWQ19GcmVlID0gRnJlZVdyYXBwZXI7CiAKICAgICBDSEVDSyhtRW5jUGFyYW1zICE9IE5VTEwpOwotICAgIG1lbXNldChtRW5jUGFyYW1zLCAwLCBzaXplb2YobUVuY1BhcmFtcykpOworICAgIG1lbXNldChtRW5jUGFyYW1zLCAwLCBzaXplb2YoKm1FbmNQYXJhbXMpKTsKICAgICBtRW5jUGFyYW1zLT5yYXRlX2NvbnRyb2wgPSBBVkNfT047CiAgICAgbUVuY1BhcmFtcy0+aW5pdFFQID0gMDsKICAgICBtRW5jUGFyYW1zLT5pbml0X0NCUF9yZW1vdmFsX2RlbGF5ID0gMTYwMDsKQEAgLTI1OCw5ICsyMzAsMTAgQEAKIAogICAgIG1FbmNQYXJhbXMtPnVzZV9vdmVycnVuX2J1ZmZlciA9IEFWQ19PRkY7CiAKLSAgICBpZiAobVZpZGVvQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIpIHsKKyAgICBpZiAobVZpZGVvQ29sb3JGb3JtYXQgIT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcgorICAgICAgICAgICAgfHwgbVN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMpIHsKICAgICAgICAgLy8gQ29sb3IgY29udmVyc2lvbiBpcyBuZWVkZWQuCi0gICAgICAgIENIRUNLKG1JbnB1dEZyYW1lRGF0YSA9PSBOVUxMKTsKKyAgICAgICAgZnJlZShtSW5wdXRGcmFtZURhdGEpOwogICAgICAgICBpZiAoKCh1aW50NjRfdCltVmlkZW9XaWR0aCAqIG1WaWRlb0hlaWdodCkgPiAoKHVpbnQ2NF90KUlOVDMyX01BWCAvIDMpKSB7CiAgICAgICAgICAgICBBTE9HRSgiQnVmZmVyIHNpemUgaXMgdG9vIGJpZy4iKTsKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CkBAIC0zNTQsMTAgKzMyNywxMCBAQAogICAgIFBWQVZDQ2xlYW5VcEVuY29kZXIobUhhbmRsZSk7CiAgICAgcmVsZWFzZU91dHB1dEJ1ZmZlcnMoKTsKIAotICAgIGRlbGV0ZSBtSW5wdXRGcmFtZURhdGE7CisgICAgZnJlZShtSW5wdXRGcmFtZURhdGEpOwogICAgIG1JbnB1dEZyYW1lRGF0YSA9IE5VTEw7CiAKLSAgICBkZWxldGUgbVNsaWNlR3JvdXA7CisgICAgZnJlZShtU2xpY2VHcm91cCk7CiAgICAgbVNsaWNlR3JvdXAgPSBOVUxMOwogCiAgICAgZGVsZXRlIG1FbmNQYXJhbXM7CkBAIC02MzAsNiArNjAzLDE3IEBACiAgICAgICAgICAgICAgICAgbVZpZGVvSGVpZ2h0ID0gZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0OwogICAgICAgICAgICAgICAgIG1WaWRlb0ZyYW1lUmF0ZSA9IGRlZi0+Zm9ybWF0LnZpZGVvLnhGcmFtZXJhdGUgPj4gMTY7CiAgICAgICAgICAgICAgICAgbVZpZGVvQ29sb3JGb3JtYXQgPSBkZWYtPmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQ7CisKKyAgICAgICAgICAgICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpwb3J0RGVmID0KKyAgICAgICAgICAgICAgICAgICAgJmVkaXRQb3J0SW5mbygwKS0+bURlZjsKKyAgICAgICAgICAgICAgICBwb3J0RGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBtVmlkZW9XaWR0aDsKKyAgICAgICAgICAgICAgICBwb3J0RGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gbVZpZGVvSGVpZ2h0OworICAgICAgICAgICAgICAgIHBvcnREZWYtPmZvcm1hdC52aWRlby54RnJhbWVyYXRlID0gZGVmLT5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZTsKKyAgICAgICAgICAgICAgICBwb3J0RGVmLT5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID0KKyAgICAgICAgICAgICAgICAgICAgKE9NWF9DT0xPUl9GT1JNQVRUWVBFKSBtVmlkZW9Db2xvckZvcm1hdDsKKyAgICAgICAgICAgICAgICBwb3J0RGVmID0gJmVkaXRQb3J0SW5mbygxKS0+bURlZjsKKyAgICAgICAgICAgICAgICBwb3J0RGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBtVmlkZW9XaWR0aDsKKyAgICAgICAgICAgICAgICBwb3J0RGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gbVZpZGVvSGVpZ2h0OwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBtVmlkZW9CaXRSYXRlID0gZGVmLT5mb3JtYXQudmlkZW8ubkJpdHJhdGU7CiAgICAgICAgICAgICB9CkBAIC03NTAsMTUgKzczNCw3IEBACiAgICAgICAgICAgICAgICAgICAgIG1TdG9yZU1ldGFEYXRhSW5CdWZmZXJzID8gIiB0cnVlIiA6ICJmYWxzZSIpOwogCiAgICAgICAgICAgICBpZiAobVN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMpIHsKLSAgICAgICAgICAgICAgICBtVmlkZW9Db2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjsKLSAgICAgICAgICAgICAgICBpZiAobUlucHV0RnJhbWVEYXRhID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCgodWludDY0X3QpbVZpZGVvV2lkdGggKiBtVmlkZW9IZWlnaHQpID4gKCh1aW50NjRfdClJTlQzMl9NQVggLyAzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkJ1ZmZlciBzaXplIGlzIHRvbyBiaWcuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1JbnB1dEZyYW1lRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QgKikgbWFsbG9jKChtVmlkZW9XaWR0aCAqIG1WaWRlb0hlaWdodCAqIDMgKSA+PiAxKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVZpZGVvQ29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0QW5kcm9pZE9wYXF1ZTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CkBAIC03NjksNyArNzQ1LDcgQEAKICAgICB9CiB9CiAKLXZvaWQgU29mdEFWQ0VuY29kZXI6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKK3ZvaWQgU29mdEFWQ0VuY29kZXI6Om9uUXVldWVGaWxsZWQoT01YX1UzMiAvKiBwb3J0SW5kZXggKi8pIHsKICAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TYXdJbnB1dEVPUykgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtODQyLDggKzgxOCw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBidWZmZXJfaGFuZGxlX3Qgc3JjQnVmZmVyOyAvLyBmb3IgTWV0YURhdGFNb2RlIG9ubHkKLQogICAgICAgICAvLyBHZXQgbmV4dCBpbnB1dCB2aWRlbyBmcmFtZQogICAgICAgICBpZiAobVJlYWR5Rm9yTmV4dEZyYW1lKSB7CiAgICAgICAgICAgICAvLyBTYXZlIHRoZSBpbnB1dCBidWZmZXIgaW5mbyBzbyB0aGF0IGl0IGNhbiBiZQpAQCAtODY0LDE4ICs4MzgsMjAgQEAKICAgICAgICAgICAgICAgICB2aWRlb0lucHV0LmhlaWdodCA9ICgobVZpZGVvSGVpZ2h0ICArIDE1KSA+PiA0KSA8PCA0OwogICAgICAgICAgICAgICAgIHZpZGVvSW5wdXQucGl0Y2ggPSAoKG1WaWRlb1dpZHRoICsgMTUpID4+IDQpIDw8IDQ7CiAgICAgICAgICAgICAgICAgdmlkZW9JbnB1dC5jb2RpbmdfdGltZXN0YW1wID0gKGluSGVhZGVyLT5uVGltZVN0YW1wICsgNTAwKSAvIDEwMDA7ICAvLyBpbiBtcwotICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmlucHV0RGF0YSA9IE5VTEw7CisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaW5wdXREYXRhID0gTlVMTDsKICAgICAgICAgICAgICAgICBpZiAobVN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuICE9IDgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJNZXRhRGF0YSBidWZmZXIgaXMgd3Jvbmcgc2l6ZSEgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKGdvdCAlbHUgYnl0ZXMsIGV4cGVjdGVkIDgpIiwgaW5IZWFkZXItPm5GaWxsZWRMZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKGdvdCAldSBieXRlcywgZXhwZWN0ZWQgOCkiLCBpbkhlYWRlci0+bkZpbGxlZExlbik7CiAgICAgICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlucHV0RGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdEdyYWxsb2NEYXRhKGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjQnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RHcmFwaGljQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRGcmFtZURhdGEsIChtVmlkZW9XaWR0aCAqIG1WaWRlb0hlaWdodCAqIDMpID4+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQsIGluSGVhZGVyLT5uRmlsbGVkTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0RGF0YSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGV4dHJhY3QgZ3JhbGxvYyBidWZmZXIgaW4gbWV0YWRhdGEgbW9kZSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKQEAgLTg4NCwxNiArODYwLDE2IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogVmVyaWZ5L2NvbnZlcnQgcGl4ZWwgZm9ybWF0IGVudW0KICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpbnB1dERhdGEgPSAodWludDhfdCAqKWluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIGlucHV0RGF0YSA9IChjb25zdCB1aW50OF90ICopaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1WaWRlb0NvbG9yRm9ybWF0ICE9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnRZVVY0MjBTZW1pUGxhbmFyVG9ZVVY0MjBQbGFuYXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXREYXRhLCBtSW5wdXRGcmFtZURhdGEsIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXREYXRhID0gbUlucHV0RnJhbWVEYXRhOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKG1WaWRlb0NvbG9yRm9ybWF0ICE9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpIHsKLSAgICAgICAgICAgICAgICAgICAgQ29udmVydFlVVjQyMFNlbWlQbGFuYXJUb1lVVjQyMFBsYW5hcigKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0RGF0YSwgbUlucHV0RnJhbWVEYXRhLCBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgaW5wdXREYXRhID0gbUlucHV0RnJhbWVEYXRhOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBDSEVDSyhpbnB1dERhdGEgIT0gTlVMTCk7Ci0gICAgICAgICAgICAgICAgdmlkZW9JbnB1dC5ZQ2JDclswXSA9IGlucHV0RGF0YTsKKyAgICAgICAgICAgICAgICB2aWRlb0lucHV0LllDYkNyWzBdID0gKHVpbnQ4X3QgKilpbnB1dERhdGE7CiAgICAgICAgICAgICAgICAgdmlkZW9JbnB1dC5ZQ2JDclsxXSA9IHZpZGVvSW5wdXQuWUNiQ3JbMF0gKyB2aWRlb0lucHV0LmhlaWdodCAqIHZpZGVvSW5wdXQucGl0Y2g7CiAgICAgICAgICAgICAgICAgdmlkZW9JbnB1dC5ZQ2JDclsyXSA9IHZpZGVvSW5wdXQuWUNiQ3JbMV0gKwogICAgICAgICAgICAgICAgICAgICAoKHZpZGVvSW5wdXQuaGVpZ2h0ICogdmlkZW9JbnB1dC5waXRjaCkgPj4gMik7CkBAIC05MTAsMTQgKzg4NiwxMiBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoZW5jb2RlclN0YXR1cyA8IEFWQ0VOQ19TVUNDRVNTKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZW5jb2RlclN0YXR1cyA9ICVkIGF0IGxpbmUgJWQiLCBlbmNvZGVyU3RhdHVzLCBfX0xJTkVfXyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUdyYWxsb2NEYXRhKHNyY0J1ZmZlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiZW5jb2RlclN0YXR1cyA9ICVkIGF0IGxpbmUgJWQiLCBlbmNvZGVyU3RhdHVzLCBfX0xJTkVfXyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VHcmFsbG9jRGF0YShzcmNCdWZmZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtOTU3LDcgKzkzMSw2IEBACiAgICAgICAgICAgICBpZiAoZW5jb2RlclN0YXR1cyA8IEFWQ0VOQ19TVUNDRVNTKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoImVuY29kZXJTdGF0dXMgPSAlZCBhdCBsaW5lICVkIiwgZW5jb2RlclN0YXR1cywgX19MSU5FX18pOwogICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcmVsZWFzZUdyYWxsb2NEYXRhKHNyY0J1ZmZlcik7CiAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIDApOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KQEAgLTk2Nyw3ICs5NDAsNiBAQAogCiAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgIHJlbGVhc2VHcmFsbG9jRGF0YShzcmNCdWZmZXIpOwogICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOwogCiAgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOwpAQCAtMTAxMSw1MCArOTgzLDEwIEBACiB9CiAKIHZvaWQgU29mdEFWQ0VuY29kZXI6OnNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyICpidWZmZXIpIHsKKyAgICBVTlVTRURfVU5MRVNTX1ZFUkJPU0UoYnVmZmVyKTsKICAgICBBTE9HVigic2lnbmFsQnVmZmVyUmV0dXJuZWQ6ICVwIiwgYnVmZmVyKTsKIH0KIAotT01YX0VSUk9SVFlQRSBTb2Z0QVZDRW5jb2Rlcjo6Z2V0RXh0ZW5zaW9uSW5kZXgoCi0gICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIE9NWF9JTkRFWFRZUEUgKmluZGV4KSB7Ci0gICAgaWYgKCFzdHJjbXAobmFtZSwgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5zdG9yZU1ldGFEYXRhSW5CdWZmZXJzIikpIHsKLSAgICAgICAgKihpbnQzMl90KilpbmRleCA9IGtTdG9yZU1ldGFEYXRhRXh0ZW5zaW9uSW5kZXg7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwotICAgIH0KLSAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwotfQotCi11aW50OF90ICpTb2Z0QVZDRW5jb2Rlcjo6ZXh0cmFjdEdyYWxsb2NEYXRhKHZvaWQgKmRhdGEsIGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyKSB7Ci0gICAgT01YX1UzMiB0eXBlID0gKihPTVhfVTMyKilkYXRhOwotICAgIHN0YXR1c190IHJlczsKLSAgICBpZiAodHlwZSAhPSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSkgewotICAgICAgICBBTE9HRSgiRGF0YSBwYXNzZWQgaW4gd2l0aCBtZXRhZGF0YSBtb2RlIGRvZXMgbm90IGhhdmUgdHlwZSAiCi0gICAgICAgICAgICAgICAgImtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlICglZCksIGhhcyB0eXBlICVsZCBpbnN0ZWFkIiwKLSAgICAgICAgICAgICAgICBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSwgdHlwZSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBidWZmZXJfaGFuZGxlX3QgaW1nQnVmZmVyID0gKihidWZmZXJfaGFuZGxlX3QqKSgodWludDhfdCopZGF0YSArIDQpOwotCi0gICAgY29uc3QgUmVjdCByZWN0KG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOwotICAgIHVpbnQ4X3QgKmltZzsKLSAgICByZXMgPSBHcmFwaGljQnVmZmVyTWFwcGVyOjpnZXQoKS5sb2NrKGltZ0J1ZmZlciwKLSAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUiwKLSAgICAgICAgICAgIHJlY3QsICh2b2lkKiopJmltZyk7Ci0gICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBsb2NrIGltYWdlIGJ1ZmZlciAlcCBmb3IgYWNjZXNzIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgIGltZ0J1ZmZlcik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgICpidWZmZXIgPSBpbWdCdWZmZXI7Ci0gICAgcmV0dXJuIGltZzsKLX0KLQotdm9pZCBTb2Z0QVZDRW5jb2Rlcjo6cmVsZWFzZUdyYWxsb2NEYXRhKGJ1ZmZlcl9oYW5kbGVfdCBidWZmZXIpIHsKLSAgICBpZiAobVN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMpIHsKLSAgICAgICAgR3JhcGhpY0J1ZmZlck1hcHBlcjo6Z2V0KCkudW5sb2NrKGJ1ZmZlcik7Ci0gICAgfQotfQotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiBhbmRyb2lkOjpTb2Z0T01YQ29tcG9uZW50ICpjcmVhdGVTb2Z0T01YQ29tcG9uZW50KApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvU29mdEFWQ0VuY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL1NvZnRBVkNFbmNvZGVyLmgKaW5kZXggMjNkNWZmMS4uMTMwNTkzZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvU29mdEFWQ0VuY29kZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9Tb2Z0QVZDRW5jb2Rlci5oCkBAIC0yMiwxNCArMjIsMTQgQEAKICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAogI2luY2x1ZGUgImF2Y2VuY19hcGkuaCIKLSNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSAiU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBNZWRpYUJ1ZmZlcjsKIAogc3RydWN0IFNvZnRBVkNFbmNvZGVyIDogcHVibGljIE1lZGlhQnVmZmVyT2JzZXJ2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgU2ltcGxlU29mdE9NWENvbXBvbmVudCB7CisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudCB7CiAgICAgU29mdEFWQ0VuY29kZXIoCiAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAogICAgICAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLApAQCAtNDUsMTEgKzQ1LDYgQEAKIAogICAgIHZpcnR1YWwgdm9pZCBvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KTsKIAotICAgIC8vIE92ZXJyaWRlIFNvZnRPTVhDb21wb25lbnQgbWV0aG9kcwotCi0gICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGdldEV4dGVuc2lvbkluZGV4KAotICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgT01YX0lOREVYVFlQRSAqaW5kZXgpOwotCiAgICAgLy8gSW1wbGVtZW50IE1lZGlhQnVmZmVyT2JzZXJ2ZXIKICAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CiAKQEAgLTY3LDEwICs2Miw2IEBACiAgICAgICAgIGtOdW1CdWZmZXJzID0gMiwKICAgICB9OwogCi0gICAgZW51bSB7Ci0gICAgICAgIGtTdG9yZU1ldGFEYXRhRXh0ZW5zaW9uSW5kZXggPSBPTVhfSW5kZXhWZW5kb3JTdGFydFVudXNlZCArIDEKLSAgICB9OwotCiAgICAgLy8gT01YIGlucHV0IGJ1ZmZlcidzIHRpbWVzdGFtcCBhbmQgZmxhZ3MKICAgICB0eXBlZGVmIHN0cnVjdCB7CiAgICAgICAgIGludDY0X3QgbVRpbWVVczsKQEAgLTEwOSw5ICsxMDAsNiBAQAogICAgIE9NWF9FUlJPUlRZUEUgcmVsZWFzZUVuY29kZXIoKTsKICAgICB2b2lkIHJlbGVhc2VPdXRwdXRCdWZmZXJzKCk7CiAKLSAgICB1aW50OF90KiBleHRyYWN0R3JhbGxvY0RhdGEodm9pZCAqZGF0YSwgYnVmZmVyX2hhbmRsZV90ICpidWZmZXIpOwotICAgIHZvaWQgcmVsZWFzZUdyYWxsb2NEYXRhKGJ1ZmZlcl9oYW5kbGVfdCBidWZmZXIpOwotCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdEFWQ0VuY29kZXIpOwogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2JpdHN0cmVhbV9pby5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvYml0c3RyZWFtX2lvLmNwcAppbmRleCAwZTMwMzdmLi5kNzFjMzI3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvYml0c3RyZWFtX2lvLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvYml0c3RyZWFtX2lvLmNwcApAQCAtMTAzLDYgKzEwMywxNSBAQAogICAgIHsKICAgICAgICAgbnVtX2JpdHMgLT0gODsKICAgICAgICAgYnl0ZSA9IChjdXJyZW50X3dvcmQgPj4gbnVtX2JpdHMpICYgMHhGRjsKKyAgICAgICAgaWYgKHN0cmVhbS0+Y291bnRfemVyb3MgPT0gMikKKyAgICAgICAgeyAgIC8qIGZvciBudW1fYml0cyA9IDMyLCB0aGlzIGNhbiBhZGQgMiBtb3JlIGJ5dGVzIGV4dHJhIGZvciBFUEJTICovCisgICAgICAgICAgICBpZiAoYnl0ZSA8PSAzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICp3cml0ZV9wbnQrKyA9IDB4MzsKKyAgICAgICAgICAgICAgICBzdHJlYW0tPndyaXRlX3BvcysrOworICAgICAgICAgICAgICAgIHN0cmVhbS0+Y291bnRfemVyb3MgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIGlmIChieXRlICE9IDApCiAgICAgICAgIHsKICAgICAgICAgICAgICp3cml0ZV9wbnQrKyA9IGJ5dGU7CkBAIC0xMTQsMTIgKzEyMyw2IEBACiAgICAgICAgICAgICBzdHJlYW0tPmNvdW50X3plcm9zKys7CiAgICAgICAgICAgICAqd3JpdGVfcG50KysgPSBieXRlOwogICAgICAgICAgICAgc3RyZWFtLT53cml0ZV9wb3MrKzsKLSAgICAgICAgICAgIGlmIChzdHJlYW0tPmNvdW50X3plcm9zID09IDIpCi0gICAgICAgICAgICB7ICAgLyogZm9yIG51bV9iaXRzID0gMzIsIHRoaXMgY2FuIGFkZCAyIG1vcmUgYnl0ZXMgZXh0cmEgZm9yIEVQQlMgKi8KLSAgICAgICAgICAgICAgICAqd3JpdGVfcG50KysgPSAweDM7Ci0gICAgICAgICAgICAgICAgc3RyZWFtLT53cml0ZV9wb3MrKzsKLSAgICAgICAgICAgICAgICBzdHJlYW0tPmNvdW50X3plcm9zID0gMDsKLSAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9BbmRyb2lkLm1rCmluZGV4IGEzM2NiOTIuLmIwMDEwZmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL0FuZHJvaWQubWsKQEAgLTE0LDYgKzE0LDggQEAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogCSQoTE9DQUxfUEFUSCkvaW5jbHVkZQogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9Db25maWcubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL0NvbmZpZy5tawppbmRleCBhNmQ0Mjg2Li5hODQzY2VmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL0NvbmZpZy5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL0NvbmZpZy5tawpAQCAtMTQsOCArMTQsMTAgQEAKIGVuZGlmCiAKICMgRG8gd2UgYWxzbyBuZWVkIHRvIGNoZWNrIG9uIEFSQ0hfQVJNX0hBVkVfQVJNVjdBPyAtIHByb2JhYmx5IG5vdAotaWZlcSAoJChBUkNIX0FSTV9IQVZFX05FT04pLHRydWUpCi1WT1RUIDo9IHY3CitpZmVxICgkKFRBUkdFVF9BUkNIKSxhcm0pCisgIGlmZXEgKCQoQVJDSF9BUk1fSEFWRV9ORU9OKSx0cnVlKQorICAgIFZPVFQgOj0gdjcKKyAgZW5kaWYKIGVuZGlmCiAKIFZPVEVTVCA6PSAwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL2Ntbk1lbW9yeS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9jbW5NZW1vcnkuYwppbmRleCBhYTUyYmQ5Li41YmI2Y2M0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL2Ntbk1lbW9yeS5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vY21uTWVtb3J5LmMKQEAgLTI2LDggKzI2LDEyIEBACiAKIC8vVk9fTUVNX09QRVJBVE9SCQlnX21lbU9QOwogCisjZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKKwogVk9fVTMyIGNtbk1lbUFsbG9jIChWT19TMzIgdUlELCAgVk9fTUVNX0lORk8gKiBwTWVtSW5mbykKIHsKKyAgICAgICAgVU5VU0VEKHVJRCk7CisKIAlpZiAoIXBNZW1JbmZvKQogCQlyZXR1cm4gVk9fRVJSX0lOVkFMSURfQVJHOwogCkBAIC0zNywzNCArNDEsNDggQEAKIAogVk9fVTMyIGNtbk1lbUZyZWUgKFZPX1MzMiB1SUQsIFZPX1BUUiBwTWVtKQogeworICAgICAgICBVTlVTRUQodUlEKTsKKwogCWZyZWUgKHBNZW0pOwogCXJldHVybiAwOwogfQogCiBWT19VMzIJY21uTWVtU2V0IChWT19TMzIgdUlELCBWT19QVFIgcEJ1ZmYsIFZPX1U4IHVWYWx1ZSwgVk9fVTMyIHVTaXplKQogeworICAgICAgICBVTlVTRUQodUlEKTsKKwogCW1lbXNldCAocEJ1ZmYsIHVWYWx1ZSwgdVNpemUpOwogCXJldHVybiAwOwogfQogCiBWT19VMzIJY21uTWVtQ29weSAoVk9fUzMyIHVJRCwgVk9fUFRSIHBEZXN0LCBWT19QVFIgcFNvdXJjZSwgVk9fVTMyIHVTaXplKQogeworICAgICAgICBVTlVTRUQodUlEKTsKKwogCW1lbWNweSAocERlc3QsIHBTb3VyY2UsIHVTaXplKTsKIAlyZXR1cm4gMDsKIH0KIAogVk9fVTMyCWNtbk1lbUNoZWNrIChWT19TMzIgdUlELCBWT19QVFIgcEJ1ZmZlciwgVk9fVTMyIHVTaXplKQogeworICAgICAgICBVTlVTRUQodUlEKTsKKyAgICAgICAgVU5VU0VEKHBCdWZmZXIpOworICAgICAgICBVTlVTRUQodVNpemUpOworCiAJcmV0dXJuIDA7CiB9CiAKIFZPX1MzMiBjbW5NZW1Db21wYXJlIChWT19TMzIgdUlELCBWT19QVFIgcEJ1ZmZlcjEsIFZPX1BUUiBwQnVmZmVyMiwgVk9fVTMyIHVTaXplKQogeworICAgICAgICBVTlVTRUQodUlEKTsKKwogCXJldHVybiBtZW1jbXAocEJ1ZmZlcjEsIHBCdWZmZXIyLCB1U2l6ZSk7CiB9CiAKIFZPX1UzMgljbW5NZW1Nb3ZlIChWT19TMzIgdUlELCBWT19QVFIgcERlc3QsIFZPX1BUUiBwU291cmNlLCBWT19VMzIgdVNpemUpCiB7CisgICAgICAgIFVOVVNFRCh1SUQpOworCiAJbWVtbW92ZSAocERlc3QsIHBTb3VyY2UsIHVTaXplKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL0FuZHJvaWQubWsKaW5kZXggZjAxZDYwNS4uNTlhMTFkZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL0FuZHJvaWQubWsKQEAgLTksNiArOSw4IEBACiAgICAgICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCiAgICAgICAgIGV4dGVybmFsL2ZsYWMvaW5jbHVkZQogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlic3RhZ2VmcmlnaHRfb214IGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gbGlidXRpbHMgbGlibG9nCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5jcHAKaW5kZXggZmNjMTk5ZS4uZTFlZTNhOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5jcHAKQEAgLTI3LDYgKzI3LDEyIEBACiAjZGVmaW5lIEZMQUNfQ09NUFJFU1NJT05fTEVWRUxfREVGQVVMVCA1CiAjZGVmaW5lIEZMQUNfQ09NUFJFU1NJT05fTEVWRUxfTUFYICAgICA4CiAKKyNpZiBMT0dfTkRFQlVHCisjZGVmaW5lIFVOVVNFRF9VTkxFU1NfVkVSQk9TRSh4KSAodm9pZCkoeCkKKyNlbHNlCisjZGVmaW5lIFVOVVNFRF9VTkxFU1NfVkVSQk9TRSh4KQorI2VuZGlmCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogdGVtcGxhdGU8Y2xhc3MgVD4KQEAgLTIxNyw3ICsyMjMsNyBAQAogCiAgICAgICAgICAgICBtTnVtQ2hhbm5lbHMgPSBwY21QYXJhbXMtPm5DaGFubmVsczsKICAgICAgICAgICAgIG1TYW1wbGVSYXRlID0gcGNtUGFyYW1zLT5uU2FtcGxpbmdSYXRlOwotICAgICAgICAgICAgQUxPR1YoIndpbGwgZW5jb2RlICVsZCBjaGFubmVscyBhdCAlbGRIeiIsIG1OdW1DaGFubmVscywgbVNhbXBsZVJhdGUpOworICAgICAgICAgICAgQUxPR1YoIndpbGwgZW5jb2RlICVkIGNoYW5uZWxzIGF0ICVkSHoiLCBtTnVtQ2hhbm5lbHMsIG1TYW1wbGVSYXRlKTsKIAogICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ3VyZUVuY29kZXIoKTsKICAgICAgICAgfQpAQCAtMjY3LDcgKzI3Myw3IEBACiAKICAgICAgICAgICAgIGlmIChkZWZQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMCkgewogICAgICAgICAgICAgICAgIGlmIChkZWZQYXJhbXMtPm5CdWZmZXJTaXplID4ga01heElucHV0QnVmZmVyU2l6ZSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiSW5wdXQgYnVmZmVyIHNpemUgbXVzdCBiZSBhdCBtb3N0ICV6dSBieXRlcyIsCisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJJbnB1dCBidWZmZXIgc2l6ZSBtdXN0IGJlIGF0IG1vc3QgJWQgYnl0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAga01heElucHV0QnVmZmVyU2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjgzLDggKzI4OSw4IEBACiB9CiAKIHZvaWQgU29mdEZsYWNFbmNvZGVyOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7Ci0KLSAgICBBTE9HVigiU29mdEZsYWNFbmNvZGVyOjpvblF1ZXVlRmlsbGVkKHBvcnRJbmRleD0lbGQpIiwgcG9ydEluZGV4KTsKKyAgICBVTlVTRURfVU5MRVNTX1ZFUkJPU0UocG9ydEluZGV4KTsKKyAgICBBTE9HVigiU29mdEZsYWNFbmNvZGVyOjpvblF1ZXVlRmlsbGVkKHBvcnRJbmRleD0lZCkiLCBwb3J0SW5kZXgpOwogCiAgICAgaWYgKG1TaWduYWxsZWRFcnJvcikgewogICAgICAgICByZXR1cm47CkBAIC0zMTYsNyArMzIyLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA+IGtNYXhJbnB1dEJ1ZmZlclNpemUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJpbnB1dCBidWZmZXIgdG9vIGxhcmdlICglbGQpLiIsIGluSGVhZGVyLT5uRmlsbGVkTGVuKTsKKyAgICAgICAgICAgIEFMT0dFKCJpbnB1dCBidWZmZXIgdG9vIGxhcmdlICglZCkuIiwgaW5IZWFkZXItPm5GaWxsZWRMZW4pOwogICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTM2OSwxNiArMzc1LDE3IEBACiAgICAgfQogfQogCi0KIEZMQUNfX1N0cmVhbUVuY29kZXJXcml0ZVN0YXR1cyBTb2Z0RmxhY0VuY29kZXI6Om9uRW5jb2RlZEZsYWNBdmFpbGFibGUoCiAgICAgICAgICAgICBjb25zdCBGTEFDX19ieXRlIGJ1ZmZlcltdLAotICAgICAgICAgICAgc2l6ZV90IGJ5dGVzLCB1bnNpZ25lZCBzYW1wbGVzLCB1bnNpZ25lZCBjdXJyZW50X2ZyYW1lKSB7Ci0gICAgQUxPR1YoIlNvZnRGbGFjRW5jb2Rlcjo6b25FbmNvZGVkRmxhY0F2YWlsYWJsZShieXRlcz0lZCwgc2FtcGxlcz0lZCwgY3Vycl9mcmFtZT0lZCkiLAorICAgICAgICAgICAgc2l6ZV90IGJ5dGVzLCB1bnNpZ25lZCBzYW1wbGVzLAorICAgICAgICAgICAgdW5zaWduZWQgY3VycmVudF9mcmFtZSkgeworICAgIFVOVVNFRF9VTkxFU1NfVkVSQk9TRShjdXJyZW50X2ZyYW1lKTsKKyAgICBBTE9HVigiU29mdEZsYWNFbmNvZGVyOjpvbkVuY29kZWRGbGFjQXZhaWxhYmxlKGJ5dGVzPSV6dSwgc2FtcGxlcz0ldSwgY3Vycl9mcmFtZT0ldSkiLAogICAgICAgICAgICAgYnl0ZXMsIHNhbXBsZXMsIGN1cnJlbnRfZnJhbWUpOwogCiAjaWZkZWYgV1JJVEVfRkxBQ19IRUFERVJfSU5fRklSU1RfQlVGRkVSCiAgICAgaWYgKHNhbXBsZXMgPT0gMCkgewotICAgICAgICBBTE9HSSgiIHNhdmluZyAlZCBieXRlcyBvZiBoZWFkZXIiLCBieXRlcyk7CisgICAgICAgIEFMT0dJKCIgc2F2aW5nICV6dSBieXRlcyBvZiBoZWFkZXIiLCBieXRlcyk7CiAgICAgICAgIG1lbWNweShtSGVhZGVyICsgbUhlYWRlck9mZnNldCwgYnVmZmVyLCBieXRlcyk7CiAgICAgICAgIG1IZWFkZXJPZmZzZXQgKz0gYnl0ZXM7Ly8gd2lsbCBjb250YWluIGhlYWRlciBzaXplIHdoZW4gZmluaXNoZWQgcmVjZWl2aW5nIGhlYWRlcgogICAgICAgICByZXR1cm4gRkxBQ19fU1RSRUFNX0VOQ09ERVJfV1JJVEVfU1RBVFVTX09LOwpAQCAtMzg5LDcgKzM5Niw3IEBACiAgICAgaWYgKChzYW1wbGVzID09IDApIHx8ICFtRW5jb2RlcldyaXRlRGF0YSkgewogICAgICAgICAvLyBjYWxsZWQgYnkgdGhlIGVuY29kZXIgYmVjYXVzZSB0aGVyZSdzIGhlYWRlciBkYXRhIHRvIHNhdmUsIGJ1dCBpdCdzIG5vdCB0aGUgcm9sZQogICAgICAgICAvLyBvZiB0aGlzIGNvbXBvbmVudCAodW5sZXNzIFdSSVRFX0ZMQUNfSEVBREVSX0lOX0ZJUlNUX0JVRkZFUiBpcyBkZWZpbmVkKQotICAgICAgICBBTE9HVigiaWdub3JpbmcgJWQgYnl0ZXMgb2YgaGVhZGVyIGRhdGEgKHNhbXBsZXM9JWQpIiwgYnl0ZXMsIHNhbXBsZXMpOworICAgICAgICBBTE9HVigiaWdub3JpbmcgJXp1IGJ5dGVzIG9mIGhlYWRlciBkYXRhIChzYW1wbGVzPSVkKSIsIGJ5dGVzLCBzYW1wbGVzKTsKICAgICAgICAgcmV0dXJuIEZMQUNfX1NUUkVBTV9FTkNPREVSX1dSSVRFX1NUQVRVU19PSzsKICAgICB9CiAKQEAgLTQxMCw5ICs0MTcsOSBAQAogI2VuZGlmCiAKICAgICAvLyB3cml0ZSBlbmNvZGVkIGRhdGEKLSAgICBBTE9HVigiIHdyaXRpbmcgJWQgYnl0ZXMgb2YgZW5jb2RlZCBkYXRhIG9uIG91dHB1dCBwb3J0IiwgYnl0ZXMpOworICAgIEFMT0dWKCIgd3JpdGluZyAlenUgYnl0ZXMgb2YgZW5jb2RlZCBkYXRhIG9uIG91dHB1dCBwb3J0IiwgYnl0ZXMpOwogICAgIGlmIChieXRlcyA+IG91dEhlYWRlci0+bkFsbG9jTGVuIC0gb3V0SGVhZGVyLT5uT2Zmc2V0IC0gb3V0SGVhZGVyLT5uRmlsbGVkTGVuKSB7Ci0gICAgICAgIEFMT0dFKCIgbm90IGVub3VnaCBzcGFjZSBsZWZ0IHRvIHdyaXRlIGVuY29kZWQgZGF0YSwgZHJvcHBpbmcgJXUgYnl0ZXMiLCBieXRlcyk7CisgICAgICAgIEFMT0dFKCIgbm90IGVub3VnaCBzcGFjZSBsZWZ0IHRvIHdyaXRlIGVuY29kZWQgZGF0YSwgZHJvcHBpbmcgJXp1IGJ5dGVzIiwgYnl0ZXMpOwogICAgICAgICAvLyBhIGZhdGFsIGVycm9yIHdvdWxkIHN0b3AgdGhlIGVuY29kaW5nCiAgICAgICAgIHJldHVybiBGTEFDX19TVFJFQU1fRU5DT0RFUl9XUklURV9TVEFUVVNfT0s7CiAgICAgfQpAQCAtNDMxLDcgKzQzOCw3IEBACiAKIAogT01YX0VSUk9SVFlQRSBTb2Z0RmxhY0VuY29kZXI6OmNvbmZpZ3VyZUVuY29kZXIoKSB7Ci0gICAgQUxPR1YoIlNvZnRGbGFjRW5jb2Rlcjo6Y29uZmlndXJlRW5jb2RlcigpIG51bUNoYW5uZWw9JWxkLCBzYW1wbGVSYXRlPSVsZCIsCisgICAgQUxPR1YoIlNvZnRGbGFjRW5jb2Rlcjo6Y29uZmlndXJlRW5jb2RlcigpIG51bUNoYW5uZWw9JWQsIHNhbXBsZVJhdGU9JWQiLAogICAgICAgICAgICAgbU51bUNoYW5uZWxzLCBtU2FtcGxlUmF0ZSk7CiAKICAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IChtRmxhY1N0cmVhbUVuY29kZXIgPT0gTlVMTCkpIHsKQEAgLTQ3MCw4ICs0NzcsMTIgQEAKIAogLy8gc3RhdGljCiBGTEFDX19TdHJlYW1FbmNvZGVyV3JpdGVTdGF0dXMgU29mdEZsYWNFbmNvZGVyOjpmbGFjRW5jb2RlcldyaXRlQ2FsbGJhY2soCi0gICAgICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1FbmNvZGVyICplbmNvZGVyLCBjb25zdCBGTEFDX19ieXRlIGJ1ZmZlcltdLAotICAgICAgICAgICAgc2l6ZV90IGJ5dGVzLCB1bnNpZ25lZCBzYW1wbGVzLCB1bnNpZ25lZCBjdXJyZW50X2ZyYW1lLCB2b2lkICpjbGllbnRfZGF0YSkgeworICAgICAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRW5jb2RlciAqIC8qIGVuY29kZXIgKi8sCisgICAgICAgICAgICBjb25zdCBGTEFDX19ieXRlIGJ1ZmZlcltdLAorICAgICAgICAgICAgc2l6ZV90IGJ5dGVzLAorICAgICAgICAgICAgdW5zaWduZWQgc2FtcGxlcywKKyAgICAgICAgICAgIHVuc2lnbmVkIGN1cnJlbnRfZnJhbWUsCisgICAgICAgICAgICB2b2lkICpjbGllbnRfZGF0YSkgewogICAgIHJldHVybiAoKFNvZnRGbGFjRW5jb2RlciopIGNsaWVudF9kYXRhKS0+b25FbmNvZGVkRmxhY0F2YWlsYWJsZSgKICAgICAgICAgICAgIGJ1ZmZlciwgYnl0ZXMsIHNhbXBsZXMsIGN1cnJlbnRfZnJhbWUpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvQW5kcm9pZC5tawppbmRleCA0YzgwZGE2Li5hMDExMmUxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvQW5kcm9pZC5tawpAQCAtMTQsNCArMTQsNiBAQAogTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X3NvZnRfZzcxMWRlYwogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5jcHAKaW5kZXggZWE3ZGFjZi4uMmFjM2U1MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuY3BwCkBAIC0xMjEsNyArMTIxLDE0IEBACiAgICAgICAgICAgICBwY21QYXJhbXMtPmVFbmRpYW4gPSBPTVhfRW5kaWFuQmlnOwogICAgICAgICAgICAgcGNtUGFyYW1zLT5iSW50ZXJsZWF2ZWQgPSBPTVhfVFJVRTsKICAgICAgICAgICAgIHBjbVBhcmFtcy0+bkJpdFBlclNhbXBsZSA9IDE2OwotICAgICAgICAgICAgcGNtUGFyYW1zLT5lUENNTW9kZSA9IE9NWF9BVURJT19QQ01Nb2RlTGluZWFyOworICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+blBvcnRJbmRleCA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gaW5wdXQgcG9ydAorICAgICAgICAgICAgICAgIHBjbVBhcmFtcy0+ZVBDTU1vZGUgPSBtSXNNTGF3ID8gT01YX0FVRElPX1BDTU1vZGVNVUxhdworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogT01YX0FVRElPX1BDTU1vZGVBTGF3OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBvdXRwdXQgcG9ydAorICAgICAgICAgICAgICAgIHBjbVBhcmFtcy0+ZVBDTU1vZGUgPSBPTVhfQVVESU9fUENNTW9kZUxpbmVhcjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUNoYW5uZWxNYXBwaW5nWzBdID0gT01YX0FVRElPX0NoYW5uZWxMRjsKICAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUNoYW5uZWxNYXBwaW5nWzFdID0gT01YX0FVRElPX0NoYW5uZWxSRjsKIApAQCAtMTk0LDcgKzIwMSw3IEBACiAgICAgfQogfQogCi12b2lkIFNvZnRHNzExOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7Cit2b2lkIFNvZnRHNzExOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgLyogcG9ydEluZGV4ICovKSB7CiAgICAgaWYgKG1TaWduYWxsZWRFcnJvcikgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMjI0LDcgKzIzMSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gPiBrTWF4TnVtU2FtcGxlc1BlckZyYW1lKSB7Ci0gICAgICAgICAgICBBTE9HRSgiaW5wdXQgYnVmZmVyIHRvbyBsYXJnZSAoJWxkKS4iLCBpbkhlYWRlci0+bkZpbGxlZExlbik7CisgICAgICAgICAgICBBTE9HRSgiaW5wdXQgYnVmZmVyIHRvbyBsYXJnZSAoJWQpLiIsIGluSGVhZGVyLT5uRmlsbGVkTGVuKTsKIAogICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOwogICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9BbmRyb2lkLm1rCmluZGV4IDcxNjEzZDIuLjMwODY4ZDUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvQW5kcm9pZC5tawpAQCAtOSw2ICs5LDggQEAKICAgICAgICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKICAgICAgICAgZXh0ZXJuYWwvbGliZ3NtL2luYwogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlic3RhZ2VmcmlnaHRfb214IGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gbGlidXRpbHMgbGlibG9nCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvU29mdEdTTS5jcHAKaW5kZXggNTEzMmI2My4uYmJiNDVlOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvU29mdEdTTS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvU29mdEdTTS5jcHAKQEAgLTE4NCw3ICsxODQsNyBAQAogICAgIH0KIH0KIAotdm9pZCBTb2Z0R1NNOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7Cit2b2lkIFNvZnRHU006Om9uUXVldWVGaWxsZWQoT01YX1UzMiAvKiBwb3J0SW5kZXggKi8pIHsKICAgICBpZiAobVNpZ25hbGxlZEVycm9yKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0yMTQsMTMgKzIxNCwxMyBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuID4ga01heE51bVNhbXBsZXNQZXJGcmFtZSkgewotICAgICAgICAgICAgQUxPR0UoImlucHV0IGJ1ZmZlciB0b28gbGFyZ2UgKCVsZCkuIiwgaW5IZWFkZXItPm5GaWxsZWRMZW4pOworICAgICAgICAgICAgQUxPR0UoImlucHV0IGJ1ZmZlciB0b28gbGFyZ2UgKCVkKS4iLCBpbkhlYWRlci0+bkZpbGxlZExlbik7CiAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CiAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwogICAgICAgICB9CiAKICAgICAgICAgaWYoKChpbkhlYWRlci0+bkZpbGxlZExlbiAvIDY1KSAqIDY1KSAhPSBpbkhlYWRlci0+bkZpbGxlZExlbikgewotICAgICAgICAgICAgQUxPR0UoImlucHV0IGJ1ZmZlciBub3QgbXVsdGlwbGUgb2YgNjUgKCVsZCkuIiwgaW5IZWFkZXItPm5GaWxsZWRMZW4pOworICAgICAgICAgICAgQUxPR0UoImlucHV0IGJ1ZmZlciBub3QgbXVsdGlwbGUgb2YgNjUgKCVkKS4iLCBpbkhlYWRlci0+bkZpbGxlZExlbik7CiAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CiAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGM2OTRlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDMwIEBACitpZmVxICgkKGlmICQod2lsZGNhcmQgZXh0ZXJuYWwvbGliaGV2YyksMSwwKSwxKQorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFICAgICAgICAgICAgOj0gbGlic3RhZ2VmcmlnaHRfc29mdF9oZXZjZGVjCitMT0NBTF9NT0RVTEVfVEFHUyAgICAgICA6PSBvcHRpb25hbAorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTICA6PSBsaWJoZXZjZGVjCitMT0NBTF9TUkNfRklMRVMgICAgICAgICA6PSBTb2Z0SEVWQy5jcHAKKworTE9DQUxfQ19JTkNMVURFUyA6PSAkKFRPUCkvZXh0ZXJuYWwvbGliaGV2Yy9kZWNvZGVyCitMT0NBTF9DX0lOQ0xVREVTICs9ICQoVE9QKS9leHRlcm5hbC9saWJoZXZjL2NvbW1vbgorTE9DQUxfQ19JTkNMVURFUyArPSAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlCitMT0NBTF9DX0lOQ0xVREVTICs9ICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyAgOj0gbGlic3RhZ2VmcmlnaHQKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgICs9IGxpYnN0YWdlZnJpZ2h0X29teAorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyAgKz0gbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbgorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyAgKz0gbGlidXRpbHMKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgICs9IGxpYmxvZworCisjIFdlIG5lZWQgdGhpcyBiZWNhdXNlIHRoZSBjdXJyZW50IGFzbSBnZW5lcmF0ZXMgdGhlIGZvbGxvd2luZyBsaW5rIGVycm9yOgorIyByZXF1aXJlcyB1bnN1cHBvcnRlZCBkeW5hbWljIHJlbG9jIFJfQVJNX1JFTDMyOyByZWNvbXBpbGUgd2l0aCAtZlBJQworIyBCdWc6IDE2ODUzMjkxCitMT0NBTF9MREZMQUdTIDo9IC1XbCwtQnN5bWJvbGljCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL1NvZnRIRVZDLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL1NvZnRIRVZDLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTYzZDBiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvU29mdEhFVkMuY3BwCkBAIC0wLDAgKzEsNzc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTb2Z0SEVWQyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgImloZXZjX3R5cGVkZWZzLmgiCisjaW5jbHVkZSAiaXYuaCIKKyNpbmNsdWRlICJpdmQuaCIKKyNpbmNsdWRlICJpdGhyZWFkLmgiCisjaW5jbHVkZSAiaWhldmNkX2N4YS5oIgorI2luY2x1ZGUgIlNvZnRIRVZDLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPE9NWF9WaWRlb0V4dC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNkZWZpbmUgY29tcG9uZW50TmFtZSAgICAgICAgICAgICAgICAgICAidmlkZW9fZGVjb2Rlci5oZXZjIgorI2RlZmluZSBjb2RpbmdUeXBlICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19Db2RpbmdIRVZDCisjZGVmaW5lIENPREVDX01JTUVfVFlQRSAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQworCisvKiogRnVuY3Rpb24gYW5kIHN0cnVjdHVyZSBkZWZpbml0aW9ucyB0byBrZWVwIGNvZGUgc2ltaWxhciBmb3IgZWFjaCBjb2RlYyAqLworI2RlZmluZSBpdmRlY19hcGlfZnVuY3Rpb24gICAgICAgICAgICAgIGloZXZjZF9jeGFfYXBpX2Z1bmN0aW9uCisjZGVmaW5lIGl2ZGV4dF9pbml0X2lwX3QgICAgICAgICAgICAgICAgaWhldmNkX2N4YV9pbml0X2lwX3QKKyNkZWZpbmUgaXZkZXh0X2luaXRfb3BfdCAgICAgICAgICAgICAgICBpaGV2Y2RfY3hhX2luaXRfb3BfdAorI2RlZmluZSBpdmRleHRfZmlsbF9tZW1fcmVjX2lwX3QgICAgICAgIGloZXZjZF9jeGFfZmlsbF9tZW1fcmVjX2lwX3QKKyNkZWZpbmUgaXZkZXh0X2ZpbGxfbWVtX3JlY19vcF90ICAgICAgICBpaGV2Y2RfY3hhX2ZpbGxfbWVtX3JlY19vcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90ICAgaWhldmNkX2N4YV9jdGxfc2V0X251bV9jb3Jlc19pcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90ICAgaWhldmNkX2N4YV9jdGxfc2V0X251bV9jb3Jlc19vcF90CisKKyNkZWZpbmUgSVZERVhUX0NNRF9DVExfU0VUX05VTV9DT1JFUyAgICBcCisgICAgICAgIChJVkRfQ09OVFJPTF9BUElfQ09NTUFORF9UWVBFX1QpSUhFVkNEX0NYQV9DTURfQ1RMX1NFVF9OVU1fQ09SRVMKKworc3RhdGljIGNvbnN0IENvZGVjUHJvZmlsZUxldmVsIGtQcm9maWxlTGV2ZWxzW10gPSB7CisgICAgeyBPTVhfVklERU9fSEVWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWwxICB9LAorICAgIHsgT01YX1ZJREVPX0hFVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsMiAgfSwKKyAgICB7IE9NWF9WSURFT19IRVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19IRVZDTWFpblRpZXJMZXZlbDIxIH0sCisgICAgeyBPTVhfVklERU9fSEVWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWwzICB9LAorICAgIHsgT01YX1ZJREVPX0hFVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsMzEgfSwKKyAgICB7IE9NWF9WSURFT19IRVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19IRVZDTWFpblRpZXJMZXZlbDQgIH0sCisgICAgeyBPTVhfVklERU9fSEVWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWw0MSB9LAorICAgIHsgT01YX1ZJREVPX0hFVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsNSAgfSwKKyAgICB7IE9NWF9WSURFT19IRVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19IRVZDTWFpblRpZXJMZXZlbDUxIH0sCit9OworCitTb2Z0SEVWQzo6U29mdEhFVkMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgT01YX1BUUiBhcHBEYXRhLAorICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkKKyAgICA6IFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQobmFtZSwgY29tcG9uZW50TmFtZSwgY29kaW5nVHlwZSwKKyAgICAgICAgICAgIGtQcm9maWxlTGV2ZWxzLCBBUlJBWV9TSVpFKGtQcm9maWxlTGV2ZWxzKSwKKyAgICAgICAgICAgIDMyMCAvKiB3aWR0aCAqLywgMjQwIC8qIGhlaWdodCAqLywgY2FsbGJhY2tzLAorICAgICAgICAgICAgYXBwRGF0YSwgY29tcG9uZW50KSwKKyAgICAgIG1NZW1SZWNvcmRzKE5VTEwpLAorICAgICAgbUZsdXNoT3V0QnVmZmVyKE5VTEwpLAorICAgICAgbU9teENvbG9yRm9ybWF0KE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpLAorICAgICAgbUl2Q29sb3JGb3JtYXQoSVZfWVVWXzQyMFApLAorICAgICAgbU5ld1dpZHRoKG1XaWR0aCksCisgICAgICBtTmV3SGVpZ2h0KG1IZWlnaHQpLAorICAgICAgbUNoYW5naW5nUmVzb2x1dGlvbihmYWxzZSkgeworICAgIGluaXRQb3J0cyhrTnVtQnVmZmVycywgSU5QVVRfQlVGX1NJWkUsIGtOdW1CdWZmZXJzLAorICAgICAgICAgICAgQ09ERUNfTUlNRV9UWVBFKTsKKyAgICBDSEVDS19FUShpbml0RGVjb2RlcigpLCAoc3RhdHVzX3QpT0spOworfQorCitTb2Z0SEVWQzo6flNvZnRIRVZDKCkgeworICAgIEFMT0dEKCJJbiBTb2Z0SEVWQzo6flNvZnRIRVZDIik7CisgICAgQ0hFQ0tfRVEoZGVJbml0RGVjb2RlcigpLCAoc3RhdHVzX3QpT0spOworfQorCitzdGF0aWMgc2l6ZV90IEdldENQVUNvcmVDb3VudCgpIHsKKyAgICBsb25nIGNwdUNvcmVDb3VudCA9IDE7CisjaWYgZGVmaW5lZChfU0NfTlBST0NFU1NPUlNfT05MTikKKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19PTkxOKTsKKyNlbHNlCisgICAgLy8gX1NDX05QUk9DX09OTE4gbXVzdCBiZSBkZWZpbmVkLi4uCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NfT05MTik7CisjZW5kaWYKKyAgICBDSEVDSyhjcHVDb3JlQ291bnQgPj0gMSk7CisgICAgQUxPR0QoIk51bWJlciBvZiBDUFUgY29yZXM6ICVsZCIsIGNwdUNvcmVDb3VudCk7CisgICAgcmV0dXJuIChzaXplX3QpY3B1Q29yZUNvdW50OworfQorCit2b2lkIFNvZnRIRVZDOjpsb2dWZXJzaW9uKCkgeworICAgIGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9faXBfdCBzX2N0bF9pcDsKKyAgICBpdmRfY3RsX2dldHZlcnNpb25pbmZvX29wX3Qgc19jdGxfb3A7CisgICAgVVdPUkQ4IGF1MV9idWZbNTEyXTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXM7CisKKyAgICBzX2N0bF9pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfY3RsX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX0dFVFZFUlNJT047CisgICAgc19jdGxfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2dldHZlcnNpb25pbmZvX2lwX3QpOworICAgIHNfY3RsX29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19vcF90KTsKKyAgICBzX2N0bF9pcC5wdl92ZXJzaW9uX2J1ZmZlciA9IGF1MV9idWY7CisgICAgc19jdGxfaXAudTRfdmVyc2lvbl9idWZmZXJfc2l6ZSA9IHNpemVvZihhdTFfYnVmKTsKKworICAgIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICh2b2lkICopJnNfY3RsX2lwLAorICAgICAgICAgICAgKHZvaWQgKikmc19jdGxfb3ApOworCisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBpbiBnZXR0aW5nIHZlcnNpb24gbnVtYmVyOiAweCV4IiwKKyAgICAgICAgICAgICAgICBzX2N0bF9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRCgiSXR0aWFtIGRlY29kZXIgdmVyc2lvbiBudW1iZXI6ICVzIiwKKyAgICAgICAgICAgICAgICAoY2hhciAqKXNfY3RsX2lwLnB2X3ZlcnNpb25fYnVmZmVyKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCitzdGF0dXNfdCBTb2Z0SEVWQzo6c2V0UGFyYW1zKHNpemVfdCBzdHJpZGUpIHsKKyAgICBpdmRfY3RsX3NldF9jb25maWdfaXBfdCBzX2N0bF9pcDsKKyAgICBpdmRfY3RsX3NldF9jb25maWdfb3BfdCBzX2N0bF9vcDsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXM7CisgICAgc19jdGxfaXAudTRfZGlzcF93ZCA9IChVV09SRDMyKXN0cmlkZTsKKyAgICBzX2N0bF9pcC5lX2ZybV9za2lwX21vZGUgPSBJVkRfU0tJUF9OT05FOworCisgICAgc19jdGxfaXAuZV9mcm1fb3V0X21vZGUgPSBJVkRfRElTUExBWV9GUkFNRV9PVVQ7CisgICAgc19jdGxfaXAuZV92aWRfZGVjX21vZGUgPSBJVkRfREVDT0RFX0ZSQU1FOworICAgIHNfY3RsX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19jdGxfaXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfU0VUUEFSQU1TOworICAgIHNfY3RsX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9zZXRfY29uZmlnX2lwX3QpOworICAgIHNfY3RsX29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9zZXRfY29uZmlnX29wX3QpOworCisgICAgQUxPR1YoIlNldCB0aGUgcnVuLXRpbWUgKGR5bmFtaWMpIHBhcmFtZXRlcnMgc3RyaWRlID0gJXUiLCBzdHJpZGUpOworICAgIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICh2b2lkICopJnNfY3RsX2lwLAorICAgICAgICAgICAgKHZvaWQgKikmc19jdGxfb3ApOworCisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBpbiBzZXR0aW5nIHRoZSBydW4tdGltZSBwYXJhbWV0ZXJzOiAweCV4IiwKKyAgICAgICAgICAgICAgICBzX2N0bF9vcC51NF9lcnJvcl9jb2RlKTsKKworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTb2Z0SEVWQzo6cmVzZXRQbHVnaW4oKSB7CisgICAgbUlzSW5GbHVzaCA9IGZhbHNlOworICAgIG1SZWNlaXZlZEVPUyA9IGZhbHNlOworICAgIG1lbXNldChtVGltZVN0YW1wcywgMCwgc2l6ZW9mKG1UaW1lU3RhbXBzKSk7CisgICAgbWVtc2V0KG1UaW1lU3RhbXBzVmFsaWQsIDAsIHNpemVvZihtVGltZVN0YW1wc1ZhbGlkKSk7CisKKyAgICAvKiBJbml0aWFsaXplIGJvdGggc3RhcnQgYW5kIGVuZCB0aW1lcyAqLworICAgIGdldHRpbWVvZmRheSgmbVRpbWVTdGFydCwgTlVMTCk7CisgICAgZ2V0dGltZW9mZGF5KCZtVGltZUVuZCwgTlVMTCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFNvZnRIRVZDOjpyZXNldERlY29kZXIoKSB7CisgICAgaXZkX2N0bF9yZXNldF9pcF90IHNfY3RsX2lwOworICAgIGl2ZF9jdGxfcmVzZXRfb3BfdCBzX2N0bF9vcDsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXM7CisKKyAgICBzX2N0bF9pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfY3RsX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX1JFU0VUOworICAgIHNfY3RsX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9yZXNldF9pcF90KTsKKyAgICBzX2N0bF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfcmVzZXRfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAodm9pZCAqKSZzX2N0bF9pcCwKKyAgICAgICAgICAgICh2b2lkICopJnNfY3RsX29wKTsKKyAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIGluIHJlc2V0OiAweCV4Iiwgc19jdGxfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIC8qIFNldCB0aGUgcnVuLXRpbWUgKGR5bmFtaWMpIHBhcmFtZXRlcnMgKi8KKyAgICBzZXRQYXJhbXMob3V0cHV0QnVmZmVyV2lkdGgoKSk7CisKKyAgICAvKiBTZXQgbnVtYmVyIG9mIGNvcmVzL3RocmVhZHMgdG8gYmUgdXNlZCBieSB0aGUgY29kZWMgKi8KKyAgICBzZXROdW1Db3JlcygpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTb2Z0SEVWQzo6c2V0TnVtQ29yZXMoKSB7CisgICAgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX2lwX3Qgc19zZXRfY29yZXNfaXA7CisgICAgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX29wX3Qgc19zZXRfY29yZXNfb3A7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzOworICAgIHNfc2V0X2NvcmVzX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19zZXRfY29yZXNfaXAuZV9zdWJfY21kID0gSVZERVhUX0NNRF9DVExfU0VUX05VTV9DT1JFUzsKKyAgICBzX3NldF9jb3Jlc19pcC51NF9udW1fY29yZXMgPSBNSU4obU51bUNvcmVzLCBDT0RFQ19NQVhfTlVNX0NPUkVTKTsKKyAgICBzX3NldF9jb3Jlc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90KTsKKyAgICBzX3NldF9jb3Jlc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90KTsKKyAgICBBTE9HRCgiU2V0IG51bWJlciBvZiBjb3JlcyB0byAldSIsIHNfc2V0X2NvcmVzX2lwLnU0X251bV9jb3Jlcyk7CisgICAgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikmc19zZXRfY29yZXNfaXAsCisgICAgICAgICAgICAodm9pZCAqKSZzX3NldF9jb3Jlc19vcCk7CisgICAgaWYgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBpbiBzZXR0aW5nIG51bWJlciBvZiBjb3JlczogMHgleCIsCisgICAgICAgICAgICAgICAgc19zZXRfY29yZXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFNvZnRIRVZDOjpzZXRGbHVzaE1vZGUoKSB7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzOworICAgIGl2ZF9jdGxfZmx1c2hfaXBfdCBzX3ZpZGVvX2ZsdXNoX2lwOworICAgIGl2ZF9jdGxfZmx1c2hfb3BfdCBzX3ZpZGVvX2ZsdXNoX29wOworCisgICAgc192aWRlb19mbHVzaF9pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfdmlkZW9fZmx1c2hfaXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfRkxVU0g7CisgICAgc192aWRlb19mbHVzaF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZmx1c2hfaXBfdCk7CisgICAgc192aWRlb19mbHVzaF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZmx1c2hfb3BfdCk7CisgICAgQUxPR0QoIlNldCB0aGUgZGVjb2RlciBpbiBmbHVzaCBtb2RlICIpOworCisgICAgLyogU2V0IHRoZSBkZWNvZGVyIGluIEZsdXNoIG1vZGUsIHN1YnNlcXVlbnQgZGVjb2RlKCkgY2FsbHMgd2lsbCBmbHVzaCAqLworICAgIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICh2b2lkICopJnNfdmlkZW9fZmx1c2hfaXAsCisgICAgICAgICAgICAodm9pZCAqKSZzX3ZpZGVvX2ZsdXNoX29wKTsKKworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiRXJyb3IgaW4gc2V0dGluZyB0aGUgZGVjb2RlciBpbiBmbHVzaCBtb2RlOiAoJWQpIDB4JXgiLCBzdGF0dXMsCisgICAgICAgICAgICAgICAgc192aWRlb19mbHVzaF9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgbUlzSW5GbHVzaCA9IHRydWU7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTb2Z0SEVWQzo6aW5pdERlY29kZXIoKSB7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgVVdPUkQzMiB1NF9udW1fcmVvcmRlcl9mcmFtZXM7CisgICAgVVdPUkQzMiB1NF9udW1fcmVmX2ZyYW1lczsKKyAgICBVV09SRDMyIHU0X3NoYXJlX2Rpc3BfYnVmOworICAgIFdPUkQzMiBpNF9sZXZlbDsKKworICAgIG1OdW1Db3JlcyA9IEdldENQVUNvcmVDb3VudCgpOworCisgICAgLyogSW5pdGlhbGl6ZSBudW1iZXIgb2YgcmVmIGFuZCByZW9yZGVyIG1vZGVzIChmb3IgSEVWQykgKi8KKyAgICB1NF9udW1fcmVvcmRlcl9mcmFtZXMgPSAxNjsKKyAgICB1NF9udW1fcmVmX2ZyYW1lcyA9IDE2OworICAgIHU0X3NoYXJlX2Rpc3BfYnVmID0gMDsKKworICAgIHVpbnQzMl90IGRpc3BsYXlTdHJpZGUgPSBvdXRwdXRCdWZmZXJXaWR0aCgpOworICAgIHVpbnQzMl90IGRpc3BsYXlIZWlnaHQgPSBvdXRwdXRCdWZmZXJIZWlnaHQoKTsKKyAgICB1aW50MzJfdCBkaXNwbGF5U2l6ZVkgPSBkaXNwbGF5U3RyaWRlICogZGlzcGxheUhlaWdodDsKKworICAgIGlmIChkaXNwbGF5U2l6ZVkgPiAoMTkyMCAqIDEwODgpKSB7CisgICAgICAgIGk0X2xldmVsID0gNTA7CisgICAgfSBlbHNlIGlmIChkaXNwbGF5U2l6ZVkgPiAoMTI4MCAqIDcyMCkpIHsKKyAgICAgICAgaTRfbGV2ZWwgPSA0MDsKKyAgICB9IGVsc2UgaWYgKGRpc3BsYXlTaXplWSA+ICg5NjAgKiA1NDApKSB7CisgICAgICAgIGk0X2xldmVsID0gMzE7CisgICAgfSBlbHNlIGlmIChkaXNwbGF5U2l6ZVkgPiAoNjQwICogMzYwKSkgeworICAgICAgICBpNF9sZXZlbCA9IDMwOworICAgIH0gZWxzZSBpZiAoZGlzcGxheVNpemVZID4gKDM1MiAqIDI4OCkpIHsKKyAgICAgICAgaTRfbGV2ZWwgPSAyMTsKKyAgICB9IGVsc2UgeworICAgICAgICBpNF9sZXZlbCA9IDIwOworICAgIH0KKyAgICB7CisgICAgICAgIGl2X251bV9tZW1fcmVjX2lwX3Qgc19udW1fbWVtX3JlY19pcDsKKyAgICAgICAgaXZfbnVtX21lbV9yZWNfb3BfdCBzX251bV9tZW1fcmVjX29wOworCisgICAgICAgIHNfbnVtX21lbV9yZWNfaXAudTRfc2l6ZSA9IHNpemVvZihzX251bV9tZW1fcmVjX2lwKTsKKyAgICAgICAgc19udW1fbWVtX3JlY19vcC51NF9zaXplID0gc2l6ZW9mKHNfbnVtX21lbV9yZWNfb3ApOworICAgICAgICBzX251bV9tZW1fcmVjX2lwLmVfY21kID0gSVZfQ01EX0dFVF9OVU1fTUVNX1JFQzsKKworICAgICAgICBBTE9HVigiR2V0IG51bWJlciBvZiBtZW0gcmVjb3JkcyIpOworICAgICAgICBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAodm9pZCopJnNfbnVtX21lbV9yZWNfaXAsCisgICAgICAgICAgICAgICAgKHZvaWQqKSZzX251bV9tZW1fcmVjX29wKTsKKyAgICAgICAgaWYgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisgICAgICAgICAgICBBTE9HRSgiRXJyb3IgaW4gZ2V0dGluZyBtZW0gcmVjb3JkczogMHgleCIsCisgICAgICAgICAgICAgICAgICAgIHNfbnVtX21lbV9yZWNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIG1OdW1NZW1SZWNvcmRzID0gc19udW1fbWVtX3JlY19vcC51NF9udW1fbWVtX3JlYzsKKyAgICB9CisKKyAgICBtTWVtUmVjb3JkcyA9IChpdl9tZW1fcmVjX3QqKWl2ZF9hbGlnbmVkX21hbGxvYygKKyAgICAgICAgICAgIDEyOCwgbU51bU1lbVJlY29yZHMgKiBzaXplb2YoaXZfbWVtX3JlY190KSk7CisgICAgaWYgKG1NZW1SZWNvcmRzID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIkFsbG9jYXRpb24gZmFpbHVyZSIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIG1lbXNldChtTWVtUmVjb3JkcywgMCwgbU51bU1lbVJlY29yZHMgKiBzaXplb2YoaXZfbWVtX3JlY190KSk7CisKKyAgICB7CisgICAgICAgIHNpemVfdCBpOworICAgICAgICBpdmRleHRfZmlsbF9tZW1fcmVjX2lwX3Qgc19maWxsX21lbV9pcDsKKyAgICAgICAgaXZkZXh0X2ZpbGxfbWVtX3JlY19vcF90IHNfZmlsbF9tZW1fb3A7CisgICAgICAgIGl2X21lbV9yZWNfdCAqcHNfbWVtX3JlYzsKKworICAgICAgICBzX2ZpbGxfbWVtX2lwLnNfaXZkX2ZpbGxfbWVtX3JlY19pcF90LnU0X3NpemUgPQorICAgICAgICAgICAgc2l6ZW9mKGl2ZGV4dF9maWxsX21lbV9yZWNfaXBfdCk7CisgICAgICAgIHNfZmlsbF9tZW1faXAuaTRfbGV2ZWwgPSBpNF9sZXZlbDsKKyAgICAgICAgc19maWxsX21lbV9pcC51NF9udW1fcmVvcmRlcl9mcmFtZXMgPSB1NF9udW1fcmVvcmRlcl9mcmFtZXM7CisgICAgICAgIHNfZmlsbF9tZW1faXAudTRfbnVtX3JlZl9mcmFtZXMgPSB1NF9udW1fcmVmX2ZyYW1lczsKKyAgICAgICAgc19maWxsX21lbV9pcC51NF9zaGFyZV9kaXNwX2J1ZiA9IHU0X3NoYXJlX2Rpc3BfYnVmOworICAgICAgICBzX2ZpbGxfbWVtX2lwLnU0X251bV9leHRyYV9kaXNwX2J1ZiA9IDA7CisgICAgICAgIHNfZmlsbF9tZW1faXAuZV9vdXRwdXRfZm9ybWF0ID0gbUl2Q29sb3JGb3JtYXQ7CisKKyAgICAgICAgc19maWxsX21lbV9pcC5zX2l2ZF9maWxsX21lbV9yZWNfaXBfdC5lX2NtZCA9IElWX0NNRF9GSUxMX05VTV9NRU1fUkVDOworICAgICAgICBzX2ZpbGxfbWVtX2lwLnNfaXZkX2ZpbGxfbWVtX3JlY19pcF90LnB2X21lbV9yZWNfbG9jYXRpb24gPSBtTWVtUmVjb3JkczsKKyAgICAgICAgc19maWxsX21lbV9pcC5zX2l2ZF9maWxsX21lbV9yZWNfaXBfdC51NF9tYXhfZnJtX3dkID0gZGlzcGxheVN0cmlkZTsKKyAgICAgICAgc19maWxsX21lbV9pcC5zX2l2ZF9maWxsX21lbV9yZWNfaXBfdC51NF9tYXhfZnJtX2h0ID0gZGlzcGxheUhlaWdodDsKKyAgICAgICAgc19maWxsX21lbV9vcC5zX2l2ZF9maWxsX21lbV9yZWNfb3BfdC51NF9zaXplID0KKyAgICAgICAgICAgIHNpemVvZihpdmRleHRfZmlsbF9tZW1fcmVjX29wX3QpOworCisgICAgICAgIHBzX21lbV9yZWMgPSBtTWVtUmVjb3JkczsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG1OdW1NZW1SZWNvcmRzOyBpKyspCisgICAgICAgICAgICBwc19tZW1fcmVjW2ldLnU0X3NpemUgPSBzaXplb2YoaXZfbWVtX3JlY190KTsKKworICAgICAgICBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAodm9pZCAqKSZzX2ZpbGxfbWVtX2lwLAorICAgICAgICAgICAgICAgICh2b2lkICopJnNfZmlsbF9tZW1fb3ApOworCisgICAgICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICAgICAgQUxPR0UoIkVycm9yIGluIGZpbGxpbmcgbWVtIHJlY29yZHM6IDB4JXgiLAorICAgICAgICAgICAgICAgICAgICBzX2ZpbGxfbWVtX29wLnNfaXZkX2ZpbGxfbWVtX3JlY19vcF90LnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgbU51bU1lbVJlY29yZHMgPQorICAgICAgICAgICAgc19maWxsX21lbV9vcC5zX2l2ZF9maWxsX21lbV9yZWNfb3BfdC51NF9udW1fbWVtX3JlY19maWxsZWQ7CisKKyAgICAgICAgcHNfbWVtX3JlYyA9IG1NZW1SZWNvcmRzOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtTnVtTWVtUmVjb3JkczsgaSsrKSB7CisgICAgICAgICAgICBwc19tZW1fcmVjLT5wdl9iYXNlID0gaXZkX2FsaWduZWRfbWFsbG9jKAorICAgICAgICAgICAgICAgICAgICBwc19tZW1fcmVjLT51NF9tZW1fYWxpZ25tZW50LCBwc19tZW1fcmVjLT51NF9tZW1fc2l6ZSk7CisgICAgICAgICAgICBpZiAocHNfbWVtX3JlYy0+cHZfYmFzZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkFsbG9jYXRpb24gZmFpbHVyZSBmb3IgbWVtb3J5IHJlY29yZCAjJXp1IG9mIHNpemUgJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgaSwgcHNfbWVtX3JlYy0+dTRfbWVtX3NpemUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IElWX0ZBSUw7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHNfbWVtX3JlYysrOworICAgICAgICB9CisgICAgfQorCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgZGVjb2RlciAqLworICAgIHsKKyAgICAgICAgaXZkZXh0X2luaXRfaXBfdCBzX2luaXRfaXA7CisgICAgICAgIGl2ZGV4dF9pbml0X29wX3Qgc19pbml0X29wOworCisgICAgICAgIHZvaWQgKmRlY19meG5zID0gKHZvaWQgKilpdmRlY19hcGlfZnVuY3Rpb247CisKKyAgICAgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9pbml0X2lwX3QpOworICAgICAgICBzX2luaXRfaXAuc19pdmRfaW5pdF9pcF90LmVfY21kID0gKElWRF9BUElfQ09NTUFORF9UWVBFX1QpSVZfQ01EX0lOSVQ7CisgICAgICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QucHZfbWVtX3JlY19sb2NhdGlvbiA9IG1NZW1SZWNvcmRzOworICAgICAgICBzX2luaXRfaXAuc19pdmRfaW5pdF9pcF90LnU0X2ZybV9tYXhfd2QgPSBkaXNwbGF5U3RyaWRlOworICAgICAgICBzX2luaXRfaXAuc19pdmRfaW5pdF9pcF90LnU0X2ZybV9tYXhfaHQgPSBkaXNwbGF5SGVpZ2h0OworCisgICAgICAgIHNfaW5pdF9pcC5pNF9sZXZlbCA9IGk0X2xldmVsOworICAgICAgICBzX2luaXRfaXAudTRfbnVtX3Jlb3JkZXJfZnJhbWVzID0gdTRfbnVtX3Jlb3JkZXJfZnJhbWVzOworICAgICAgICBzX2luaXRfaXAudTRfbnVtX3JlZl9mcmFtZXMgPSB1NF9udW1fcmVmX2ZyYW1lczsKKyAgICAgICAgc19pbml0X2lwLnU0X3NoYXJlX2Rpc3BfYnVmID0gdTRfc2hhcmVfZGlzcF9idWY7CisgICAgICAgIHNfaW5pdF9pcC51NF9udW1fZXh0cmFfZGlzcF9idWYgPSAwOworCisgICAgICAgIHNfaW5pdF9vcC5zX2l2ZF9pbml0X29wX3QudTRfc2l6ZSA9IHNpemVvZihzX2luaXRfb3ApOworCisgICAgICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QudTRfbnVtX21lbV9yZWMgPSBtTnVtTWVtUmVjb3JkczsKKyAgICAgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC5lX291dHB1dF9mb3JtYXQgPSBtSXZDb2xvckZvcm1hdDsKKworICAgICAgICBtQ29kZWNDdHggPSAoaXZfb2JqX3QqKW1NZW1SZWNvcmRzWzBdLnB2X2Jhc2U7CisgICAgICAgIG1Db2RlY0N0eC0+cHZfZnhucyA9IGRlY19meG5zOworICAgICAgICBtQ29kZWNDdHgtPnU0X3NpemUgPSBzaXplb2YoaXZfb2JqX3QpOworCisgICAgICAgIEFMT0dEKCJJbml0aWFsaXppbmcgZGVjb2RlciIpOworICAgICAgICBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAodm9pZCAqKSZzX2luaXRfaXAsCisgICAgICAgICAgICAgICAgKHZvaWQgKikmc19pbml0X29wKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgICAgICBBTE9HRSgiRXJyb3IgaW4gaW5pdDogMHgleCIsCisgICAgICAgICAgICAgICAgICAgIHNfaW5pdF9vcC5zX2l2ZF9pbml0X29wX3QudTRfZXJyb3JfY29kZSk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFJlc2V0IHRoZSBwbHVnaW4gc3RhdGUgKi8KKyAgICByZXNldFBsdWdpbigpOworCisgICAgLyogU2V0IHRoZSBydW4gdGltZSAoZHluYW1pYykgcGFyYW1ldGVycyAqLworICAgIHNldFBhcmFtcyhkaXNwbGF5U3RyaWRlKTsKKworICAgIC8qIFNldCBudW1iZXIgb2YgY29yZXMvdGhyZWFkcyB0byBiZSB1c2VkIGJ5IHRoZSBjb2RlYyAqLworICAgIHNldE51bUNvcmVzKCk7CisKKyAgICAvKiBHZXQgY29kZWMgdmVyc2lvbiAqLworICAgIGxvZ1ZlcnNpb24oKTsKKworICAgIC8qIEFsbG9jYXRlIGludGVybmFsIHBpY3R1cmUgYnVmZmVyICovCisgICAgdWludDMyX3QgYnVmZmVyU2l6ZSA9IGRpc3BsYXlTaXplWSAqIDMgLyAyOworICAgIG1GbHVzaE91dEJ1ZmZlciA9ICh1aW50OF90ICopaXZkX2FsaWduZWRfbWFsbG9jKDEyOCwgYnVmZmVyU2l6ZSk7CisgICAgaWYgKE5VTEwgPT0gbUZsdXNoT3V0QnVmZmVyKSB7CisgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgYWxsb2NhdGUgZmx1c2hPdXRwdXRCdWZmZXIgb2Ygc2l6ZSAlenUiLCBidWZmZXJTaXplKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICBtSW5pdE5lZWRlZCA9IGZhbHNlOworICAgIG1GbHVzaE5lZWRlZCA9IGZhbHNlOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU29mdEhFVkM6OmRlSW5pdERlY29kZXIoKSB7CisgICAgc2l6ZV90IGk7CisKKyAgICBpZiAobU1lbVJlY29yZHMpIHsKKyAgICAgICAgaXZfbWVtX3JlY190ICpwc19tZW1fcmVjOworCisgICAgICAgIHBzX21lbV9yZWMgPSBtTWVtUmVjb3JkczsKKyAgICAgICAgQUxPR0QoIkZyZWVpbmcgY29kZWMgbWVtb3J5Iik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtTnVtTWVtUmVjb3JkczsgaSsrKSB7CisgICAgICAgICAgICBpZihwc19tZW1fcmVjLT5wdl9iYXNlKSB7CisgICAgICAgICAgICAgICAgaXZkX2FsaWduZWRfZnJlZShwc19tZW1fcmVjLT5wdl9iYXNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBzX21lbV9yZWMrKzsKKyAgICAgICAgfQorICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKG1NZW1SZWNvcmRzKTsKKyAgICAgICAgbU1lbVJlY29yZHMgPSBOVUxMOworICAgIH0KKworICAgIGlmKG1GbHVzaE91dEJ1ZmZlcikgeworICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKG1GbHVzaE91dEJ1ZmZlcik7CisgICAgICAgIG1GbHVzaE91dEJ1ZmZlciA9IE5VTEw7CisgICAgfQorCisgICAgbUluaXROZWVkZWQgPSB0cnVlOworICAgIG1DaGFuZ2luZ1Jlc29sdXRpb24gPSBmYWxzZTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU29mdEhFVkM6OnJlSW5pdERlY29kZXIoKSB7CisgICAgc3RhdHVzX3QgcmV0OworCisgICAgZGVJbml0RGVjb2RlcigpOworCisgICAgcmV0ID0gaW5pdERlY29kZXIoKTsKKyAgICBpZiAoT0sgIT0gcmV0KSB7CisgICAgICAgIEFMT0dFKCJDcmVhdGUgZmFpbHVyZSIpOworICAgICAgICBkZUluaXREZWNvZGVyKCk7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwordm9pZCBTb2Z0SEVWQzo6b25SZXNldCgpIHsKKyAgICBBTE9HRCgib25SZXNldCBjYWxsZWQiKTsKKyAgICBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjpvblJlc2V0KCk7CisKKyAgICByZXNldERlY29kZXIoKTsKKyAgICByZXNldFBsdWdpbigpOworfQorCitPTVhfRVJST1JUWVBFIFNvZnRIRVZDOjppbnRlcm5hbFNldFBhcmFtZXRlcihPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcykgeworICAgIGNvbnN0IHVpbnQzMl90IG9sZFdpZHRoID0gbVdpZHRoOworICAgIGNvbnN0IHVpbnQzMl90IG9sZEhlaWdodCA9IG1IZWlnaHQ7CisgICAgT01YX0VSUk9SVFlQRSByZXQgPSBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjppbnRlcm5hbFNldFBhcmFtZXRlcihpbmRleCwgcGFyYW1zKTsKKyAgICBpZiAobVdpZHRoICE9IG9sZFdpZHRoIHx8IG1IZWlnaHQgIT0gb2xkSGVpZ2h0KSB7CisgICAgICAgIHJlSW5pdERlY29kZXIoKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworYm9vbCBTb2Z0SEVWQzo6c2V0RGVjb2RlQXJncyhpdmRfdmlkZW9fZGVjb2RlX2lwX3QgKnBzX2RlY19pcCwKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90ICpwc19kZWNfb3AsCisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciwKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciwKKyAgICAgICAgc2l6ZV90IHRpbWVTdGFtcEl4KSB7CisgICAgc2l6ZV90IHNpemVZID0gb3V0cHV0QnVmZmVyV2lkdGgoKSAqIG91dHB1dEJ1ZmZlckhlaWdodCgpOworICAgIHNpemVfdCBzaXplVVY7CisKKyAgICBwc19kZWNfaXAtPnU0X3NpemUgPSBzaXplb2YoaXZkX3ZpZGVvX2RlY29kZV9pcF90KTsKKyAgICBwc19kZWNfb3AtPnU0X3NpemUgPSBzaXplb2YoaXZkX3ZpZGVvX2RlY29kZV9vcF90KTsKKworICAgIHBzX2RlY19pcC0+ZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0RFQ09ERTsKKworICAgIC8qIFdoZW4gaW4gZmx1c2ggYW5kIGFmdGVyIEVPUyB3aXRoIHplcm8gYnl0ZSBpbnB1dCwKKyAgICAgKiBpbkhlYWRlciBpcyBzZXQgdG8gemVyby4gSGVuY2UgY2hlY2sgZm9yIG5vbi1udWxsICovCisgICAgaWYgKGluSGVhZGVyKSB7CisgICAgICAgIHBzX2RlY19pcC0+dTRfdHMgPSB0aW1lU3RhbXBJeDsKKyAgICAgICAgcHNfZGVjX2lwLT5wdl9zdHJlYW1fYnVmZmVyID0gaW5IZWFkZXItPnBCdWZmZXIKKyAgICAgICAgICAgICAgICArIGluSGVhZGVyLT5uT2Zmc2V0OworICAgICAgICBwc19kZWNfaXAtPnU0X251bV9CeXRlcyA9IGluSGVhZGVyLT5uRmlsbGVkTGVuOworICAgIH0gZWxzZSB7CisgICAgICAgIHBzX2RlY19pcC0+dTRfdHMgPSAwOworICAgICAgICBwc19kZWNfaXAtPnB2X3N0cmVhbV9idWZmZXIgPSBOVUxMOworICAgICAgICBwc19kZWNfaXAtPnU0X251bV9CeXRlcyA9IDA7CisgICAgfQorCisgICAgc2l6ZVVWID0gc2l6ZVkgLyA0OworICAgIHBzX2RlY19pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMF0gPSBzaXplWTsKKyAgICBwc19kZWNfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzFdID0gc2l6ZVVWOworICAgIHBzX2RlY19pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMl0gPSBzaXplVVY7CisKKyAgICB1aW50OF90ICpwQnVmOworICAgIGlmIChvdXRIZWFkZXIpIHsKKyAgICAgICAgaWYgKG91dEhlYWRlci0+bkFsbG9jTGVuIDwgc2l6ZVkgKyAoc2l6ZVVWICogMikpIHsKKyAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjc4MzM2MTYiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBwQnVmID0gb3V0SGVhZGVyLT5wQnVmZmVyOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIG1GbHVzaE91dEJ1ZmZlciBhbHdheXMgaGFzIHRoZSByaWdodCBzaXplLgorICAgICAgICBwQnVmID0gbUZsdXNoT3V0QnVmZmVyOworICAgIH0KKworICAgIHBzX2RlY19pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzBdID0gcEJ1ZjsKKyAgICBwc19kZWNfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1sxXSA9IHBCdWYgKyBzaXplWTsKKyAgICBwc19kZWNfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1syXSA9IHBCdWYgKyBzaXplWSArIHNpemVVVjsKKyAgICBwc19kZWNfaXAtPnNfb3V0X2J1ZmZlci51NF9udW1fYnVmcyA9IDM7CisgICAgcmV0dXJuIHRydWU7Cit9Cit2b2lkIFNvZnRIRVZDOjpvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCkgeworICAgIC8qIE9uY2UgdGhlIG91dHB1dCBidWZmZXJzIGFyZSBmbHVzaGVkLCBpZ25vcmUgYW55IGJ1ZmZlcnMgdGhhdCBhcmUgaGVsZCBpbiBkZWNvZGVyICovCisgICAgaWYgKGtPdXRwdXRQb3J0SW5kZXggPT0gcG9ydEluZGV4KSB7CisgICAgICAgIHNldEZsdXNoTW9kZSgpOworCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNfaXA7CisgICAgICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3Qgc19kZWNfb3A7CisgICAgICAgICAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXM7CisgICAgICAgICAgICBzaXplX3Qgc2l6ZVksIHNpemVVVjsKKworICAgICAgICAgICAgc2V0RGVjb2RlQXJncygmc19kZWNfaXAsICZzX2RlY19vcCwgTlVMTCwgTlVMTCwgMCk7CisKKyAgICAgICAgICAgIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICh2b2lkICopJnNfZGVjX2lwLAorICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZzX2RlY19vcCk7CisgICAgICAgICAgICBpZiAoMCA9PSBzX2RlY19vcC51NF9vdXRwdXRfcHJlc2VudCkgeworICAgICAgICAgICAgICAgIHJlc2V0UGx1Z2luKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgU29mdEhFVkM6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKKyAgICBVTlVTRUQocG9ydEluZGV4KTsKKworICAgIGlmIChtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlICE9IE5PTkUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmaW5RdWV1ZSA9IGdldFBvcnRRdWV1ZShrSW5wdXRQb3J0SW5kZXgpOworICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoa091dHB1dFBvcnRJbmRleCk7CisKKyAgICAvKiBJZiBpbnB1dCBFT1MgaXMgc2VlbiBhbmQgZGVjb2RlciBpcyBub3QgaW4gZmx1c2ggbW9kZSwKKyAgICAgKiBzZXQgdGhlIGRlY29kZXIgaW4gZmx1c2ggbW9kZS4KKyAgICAgKiBUaGVyZSBjYW4gYmUgYSBjYXNlIHdoZXJlIEVPUyBpcyBzZW50IGFsb25nIHdpdGggbGFzdCBwaWN0dXJlIGRhdGEKKyAgICAgKiBJbiB0aGF0IGNhc2UsIG9ubHkgYWZ0ZXIgZGVjb2RpbmcgdGhhdCBpbnB1dCBkYXRhLCBkZWNvZGVyIGhhcyB0byBiZQorICAgICAqIHB1dCBpbiBmbHVzaC4gVGhpcyBjYXNlIGlzIGhhbmRsZWQgaGVyZSAgKi8KKworICAgIGlmIChtUmVjZWl2ZWRFT1MgJiYgIW1Jc0luRmx1c2gpIHsKKyAgICAgICAgc2V0Rmx1c2hNb2RlKCk7CisgICAgfQorCisgICAgd2hpbGUgKCFvdXRRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgIEJ1ZmZlckluZm8gKmluSW5mbzsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmluSGVhZGVyOworCisgICAgICAgIEJ1ZmZlckluZm8gKm91dEluZm87CisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXI7CisgICAgICAgIHNpemVfdCB0aW1lU3RhbXBJeDsKKworICAgICAgICBpbkluZm8gPSBOVUxMOworICAgICAgICBpbkhlYWRlciA9IE5VTEw7CisKKyAgICAgICAgaWYgKCFtSXNJbkZsdXNoKSB7CisgICAgICAgICAgICBpZiAoIWluUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGluSW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgb3V0SW5mbyA9ICpvdXRRdWV1ZS5iZWdpbigpOworICAgICAgICBvdXRIZWFkZXIgPSBvdXRJbmZvLT5tSGVhZGVyOworICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IDA7CisgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9IDA7CisgICAgICAgIG91dEhlYWRlci0+bk9mZnNldCA9IDA7CisKKyAgICAgICAgaWYgKGluSGVhZGVyICE9IE5VTEwgJiYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpKSB7CisgICAgICAgICAgICBBTE9HRCgiRU9TIHNlZW4gb24gaW5wdXQiKTsKKyAgICAgICAgICAgIG1SZWNlaXZlZEVPUyA9IHRydWU7CisgICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gPT0gMCkgeworICAgICAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworICAgICAgICAgICAgICAgIGluSGVhZGVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICBzZXRGbHVzaE1vZGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFdoZW4gdGhlcmUgaXMgYW4gaW5pdCByZXF1aXJlZCBhbmQgdGhlIGRlY29kZXIgaXMgbm90IGluIGZsdXNoIG1vZGUsCisgICAgICAgIC8vIHVwZGF0ZSBvdXRwdXQgcG9ydCdzIGRlZmluaXRpb24gYW5kIHJlaW5pdGlhbGl6ZSBkZWNvZGVyLgorICAgICAgICBpZiAobUluaXROZWVkZWQgJiYgIW1Jc0luRmx1c2gpIHsKKyAgICAgICAgICAgIGJvb2wgcG9ydFdpbGxSZXNldCA9IGZhbHNlOworICAgICAgICAgICAgaGFuZGxlUG9ydFNldHRpbmdzQ2hhbmdlKCZwb3J0V2lsbFJlc2V0LCBtTmV3V2lkdGgsIG1OZXdIZWlnaHQpOworCisgICAgICAgICAgICBDSEVDS19FUShyZUluaXREZWNvZGVyKCksIChzdGF0dXNfdClPSyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvKiBHZXQgYSBmcmVlIHNsb3QgaW4gdGltZXN0YW1wIGFycmF5IHRvIGhvbGQgaW5wdXQgdGltZXN0YW1wICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpemVfdCBpOworICAgICAgICAgICAgdGltZVN0YW1wSXggPSAwOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9USU1FX1NUQU1QUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtVGltZVN0YW1wc1ZhbGlkW2ldKSB7CisgICAgICAgICAgICAgICAgICAgIHRpbWVTdGFtcEl4ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGluSGVhZGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtVGltZVN0YW1wc1ZhbGlkW3RpbWVTdGFtcEl4XSA9IHRydWU7CisgICAgICAgICAgICAgICAgbVRpbWVTdGFtcHNbdGltZVN0YW1wSXhdID0gaW5IZWFkZXItPm5UaW1lU3RhbXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNfaXA7CisgICAgICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3Qgc19kZWNfb3A7CisgICAgICAgICAgICBXT1JEMzIgdGltZURlbGF5LCB0aW1lVGFrZW47CisgICAgICAgICAgICBzaXplX3Qgc2l6ZVksIHNpemVVVjsKKworICAgICAgICAgICAgaWYgKCFzZXREZWNvZGVBcmdzKCZzX2RlY19pcCwgJnNfZGVjX29wLCBpbkhlYWRlciwgb3V0SGVhZGVyLCB0aW1lU3RhbXBJeCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRGVjb2RlciBhcmcgc2V0dXAgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgTlVMTCk7CisgICAgICAgICAgICAvKiBDb21wdXRlIHRpbWUgZWxhcHNlZCBiZXR3ZWVuIGVuZCBvZiBwcmV2aW91cyBkZWNvZGUoKQorICAgICAgICAgICAgICogdG8gc3RhcnQgb2YgY3VycmVudCBkZWNvZGUoKSAqLworICAgICAgICAgICAgVElNRV9ESUZGKG1UaW1lRW5kLCBtVGltZVN0YXJ0LCB0aW1lRGVsYXkpOworCisgICAgICAgICAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXM7CisgICAgICAgICAgICBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAodm9pZCAqKSZzX2RlY19pcCwgKHZvaWQgKikmc19kZWNfb3ApOworICAgICAgICAgICAgLy8gRklYTUU6IENvbXBhcmUgfHN0YXR1c3wgdG8gSUhFVkNEX1VOU1VQUE9SVEVEX0RJTUVOU0lPTlMsIHdoaWNoIGlzIG5vdCBvbmUgb2YgdGhlCisgICAgICAgICAgICAvLyBJVl9BUElfQ0FMTF9TVEFUVVNfVCwgc2VlbXMgYmUgd3JvbmcuIEJ1dCB0aGlzIGlzIHdoYXQgdGhlIGRlY29kZXIgcmV0dXJucyByaWdodCBub3cuCisgICAgICAgICAgICAvLyBUaGUgZGVjb2RlciBzaG91bGQgYmUgZml4ZWQgc28gdGhhdCB8dTRfZXJyb3JfY29kZXwgaW5zdGVhZCBvZiB8c3RhdHVzfCByZXR1cm5zCisgICAgICAgICAgICAvLyBJSEVWQ0RfVU5TVVBQT1JURURfRElNRU5TSU9OUy4KKyAgICAgICAgICAgIGJvb2wgdW5zdXBwb3J0ZWREaW1lbnNpb25zID0KKyAgICAgICAgICAgICAgICAoKElIRVZDRF9VTlNVUFBPUlRFRF9ESU1FTlNJT05TID09IHN0YXR1cykKKyAgICAgICAgICAgICAgICAgICAgfHwgKElIRVZDRF9VTlNVUFBPUlRFRF9ESU1FTlNJT05TID09IHNfZGVjX29wLnU0X2Vycm9yX2NvZGUpKTsKKyAgICAgICAgICAgIGJvb2wgcmVzQ2hhbmdlZCA9IChJVkRfUkVTX0NIQU5HRUQgPT0gKHNfZGVjX29wLnU0X2Vycm9yX2NvZGUgJiAweEZGKSk7CisKKyAgICAgICAgICAgIEdFVFRJTUUoJm1UaW1lRW5kLCBOVUxMKTsKKyAgICAgICAgICAgIC8qIENvbXB1dGUgdGltZSB0YWtlbiBmb3IgZGVjb2RlKCkgKi8KKyAgICAgICAgICAgIFRJTUVfRElGRihtVGltZVN0YXJ0LCBtVGltZUVuZCwgdGltZVRha2VuKTsKKworICAgICAgICAgICAgQUxPR1YoInRpbWVUYWtlbj0lNmQgZGVsYXk9JTZkIG51bUJ5dGVzPSU2ZCIsIHRpbWVUYWtlbiwgdGltZURlbGF5LAorICAgICAgICAgICAgICAgICAgIHNfZGVjX29wLnU0X251bV9ieXRlc19jb25zdW1lZCk7CisgICAgICAgICAgICBpZiAoc19kZWNfb3AudTRfZnJhbWVfZGVjb2RlZF9mbGFnICYmICFtRmx1c2hOZWVkZWQpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hOZWVkZWQgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKGluSGVhZGVyICE9IE5VTEwpICYmICgxICE9IHNfZGVjX29wLnU0X2ZyYW1lX2RlY29kZWRfZmxhZykpIHsKKyAgICAgICAgICAgICAgICAvKiBJZiB0aGUgaW5wdXQgZGlkIG5vdCBjb250YWluIHBpY3R1cmUgZGF0YSwgdGhlbiBpZ25vcmUKKyAgICAgICAgICAgICAgICAgKiB0aGUgYXNzb2NpYXRlZCB0aW1lc3RhbXAgKi8KKyAgICAgICAgICAgICAgICBtVGltZVN0YW1wc1ZhbGlkW3RpbWVTdGFtcEl4XSA9IGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBoYW5kbGUgQ1RTIERlY29kZXJUZXN0IHRlc3RDb2RlY1Jlc2V0c0hFVkNXaXRob3V0U3VyZmFjZSwKKyAgICAgICAgICAgIC8vIHdoaWNoIGlzIG5vdCBzZW5kaW5nIFNQUy9QUFMgYWZ0ZXIgcG9ydCByZWNvbmZpZ3VyYXRpb24gYW5kIGZsdXNoIHRvIHRoZSBjb2RlYy4KKyAgICAgICAgICAgIGlmICh1bnN1cHBvcnRlZERpbWVuc2lvbnMgJiYgIW1GbHVzaE5lZWRlZCkgeworICAgICAgICAgICAgICAgIGJvb2wgcG9ydFdpbGxSZXNldCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGhhbmRsZVBvcnRTZXR0aW5nc0NoYW5nZSgmcG9ydFdpbGxSZXNldCwgc19kZWNfb3AudTRfcGljX3dkLCBzX2RlY19vcC51NF9waWNfaHQpOworCisgICAgICAgICAgICAgICAgQ0hFQ0tfRVEocmVJbml0RGVjb2RlcigpLCAoc3RhdHVzX3QpT0spOworCisgICAgICAgICAgICAgICAgc2V0RGVjb2RlQXJncygmc19kZWNfaXAsICZzX2RlY19vcCwgaW5IZWFkZXIsIG91dEhlYWRlciwgdGltZVN0YW1wSXgpOworCisgICAgICAgICAgICAgICAgaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikmc19kZWNfaXAsICh2b2lkICopJnNfZGVjX29wKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIElmIHRoZSBkZWNvZGVyIGlzIGluIHRoZSBjaGFuZ2luZyByZXNvbHV0aW9uIG1vZGUgYW5kIHRoZXJlIGlzIG5vIG91dHB1dCBwcmVzZW50LAorICAgICAgICAgICAgLy8gdGhhdCBtZWFucyB0aGUgc3dpdGNoaW5nIGlzIGRvbmUgYW5kIGl0J3MgcmVhZHkgdG8gcmVzZXQgdGhlIGRlY29kZXIgYW5kIHRoZSBwbHVnaW4uCisgICAgICAgICAgICBpZiAobUNoYW5naW5nUmVzb2x1dGlvbiAmJiAhc19kZWNfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgICAgICAgICBtQ2hhbmdpbmdSZXNvbHV0aW9uID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmVzZXREZWNvZGVyKCk7CisgICAgICAgICAgICAgICAgcmVzZXRQbHVnaW4oKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHVuc3VwcG9ydGVkRGltZW5zaW9ucyB8fCByZXNDaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgbUNoYW5naW5nUmVzb2x1dGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYgKG1GbHVzaE5lZWRlZCkgeworICAgICAgICAgICAgICAgICAgICBzZXRGbHVzaE1vZGUoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodW5zdXBwb3J0ZWREaW1lbnNpb25zKSB7CisgICAgICAgICAgICAgICAgICAgIG1OZXdXaWR0aCA9IHNfZGVjX29wLnU0X3BpY193ZDsKKyAgICAgICAgICAgICAgICAgICAgbU5ld0hlaWdodCA9IHNfZGVjX29wLnU0X3BpY19odDsKKyAgICAgICAgICAgICAgICAgICAgbUluaXROZWVkZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCgwIDwgc19kZWNfb3AudTRfcGljX3dkKSAmJiAoMCA8IHNfZGVjX29wLnU0X3BpY19odCkpIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCA9IHNfZGVjX29wLnU0X3BpY193ZDsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBoZWlnaHQgPSBzX2RlY19vcC51NF9waWNfaHQ7CisgICAgICAgICAgICAgICAgYm9vbCBwb3J0V2lsbFJlc2V0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaGFuZGxlUG9ydFNldHRpbmdzQ2hhbmdlKCZwb3J0V2lsbFJlc2V0LCB3aWR0aCwgaGVpZ2h0KTsKKworICAgICAgICAgICAgICAgIGlmIChwb3J0V2lsbFJlc2V0KSB7CisgICAgICAgICAgICAgICAgICAgIHJlc2V0RGVjb2RlcigpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc19kZWNfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAobVdpZHRoICogbUhlaWdodCAqIDMpIC8gMjsKKworICAgICAgICAgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9IG1UaW1lU3RhbXBzW3NfZGVjX29wLnU0X3RzXTsKKyAgICAgICAgICAgICAgICBtVGltZVN0YW1wc1ZhbGlkW3NfZGVjX29wLnU0X3RzXSA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgICAgIG91dEluZm8gPSBOVUxMOworICAgICAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CisgICAgICAgICAgICAgICAgb3V0SGVhZGVyID0gTlVMTDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogSWYgaW4gZmx1c2ggbW9kZSBhbmQgbm8gb3V0cHV0IGlzIHJldHVybmVkIGJ5IHRoZSBjb2RlYywKKyAgICAgICAgICAgICAgICAgKiB0aGVuIGNvbWUgb3V0IG9mIGZsdXNoIG1vZGUgKi8KKyAgICAgICAgICAgICAgICBtSXNJbkZsdXNoID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICAvKiBJZiBFT1Mgd2FzIHJlY2lldmVkIG9uIGlucHV0IHBvcnQgYW5kIHRoZXJlIGlzIG5vIG91dHB1dAorICAgICAgICAgICAgICAgICAqIGZyb20gdGhlIGNvZGVjLCB0aGVuIHNpZ25hbCBFT1Mgb24gb3V0cHV0IHBvcnQgKi8KKyAgICAgICAgICAgICAgICBpZiAobVJlY2VpdmVkRU9TKSB7CisgICAgICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKworICAgICAgICAgICAgICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgICAgICAgICBvdXRJbmZvID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0SGVhZGVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgcmVzZXRQbHVnaW4oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiBIYW5kbGUgbW9yZSB0aGFuIG9uZSBwaWN0dXJlIGRhdGEKKyAgICAgICAgaWYgKGluSGVhZGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgaW5JbmZvID0gTlVMTDsKKyAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisgICAgICAgICAgICBpbkhlYWRlciA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2FuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQgKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLCBPTVhfUFRSIGFwcERhdGEsCisgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KSB7CisgICAgcmV0dXJuIG5ldyBhbmRyb2lkOjpTb2Z0SEVWQyhuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9Tb2Z0SEVWQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvU29mdEhFVkMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTI5OWExCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvU29mdEhFVkMuaApAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU09GVF9IRVZDX0hfCisKKyNkZWZpbmUgU09GVF9IRVZDX0hfCisKKyNpbmNsdWRlICJTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjZGVmaW5lIGl2ZF9hbGlnbmVkX21hbGxvYyhhbGlnbm1lbnQsIHNpemUpIG1lbWFsaWduKGFsaWdubWVudCwgc2l6ZSkKKyNkZWZpbmUgaXZkX2FsaWduZWRfZnJlZShidWYpIGZyZWUoYnVmKQorCisvKiogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHRpbWUtc3RhbXAgYXJyYXkgKi8KKyNkZWZpbmUgTUFYX1RJTUVfU1RBTVBTIDY0CisKKy8qKiBNYXhpbXVtIG51bWJlciBvZiBjb3JlcyBzdXBwb3J0ZWQgYnkgdGhlIGNvZGVjICovCisjZGVmaW5lIENPREVDX01BWF9OVU1fQ09SRVMgNAorCisjZGVmaW5lIENPREVDX01BWF9XSURUSCAgICAgMTkyMAorCisjZGVmaW5lIENPREVDX01BWF9IRUlHSFQgICAgMTA4OAorCisvKiogSW5wdXQgYnVmZmVyIHNpemUgKi8KKyNkZWZpbmUgSU5QVVRfQlVGX1NJWkUgKDEwMjQgKiAxMDI0KQorCisjZGVmaW5lIE1JTihhLCBiKSAoKGEpIDwgKGIpKSA/IChhKSA6IChiKQorCisvKiogVXNlZCB0byByZW1vdmUgd2FybmluZ3MgYWJvdXQgdW51c2VkIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgVU5VU0VEKHgpICgodm9pZCkoeCkpCisKKy8qKiBHZXQgdGltZSAqLworI2RlZmluZSBHRVRUSU1FKGEsIGIpIGdldHRpbWVvZmRheShhLCBiKTsKKworLyoqIENvbXB1dGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHN0YXJ0IGFuZCBlbmQgKi8KKyNkZWZpbmUgVElNRV9ESUZGKHN0YXJ0LCBlbmQsIGRpZmYpIFwKKyAgICBkaWZmID0gKChlbmQudHZfc2VjIC0gc3RhcnQudHZfc2VjKSAqIDEwMDAwMDApICsgXAorICAgICAgICAgICAgKGVuZC50dl91c2VjIC0gc3RhcnQudHZfdXNlYyk7CisKK3N0cnVjdCBTb2Z0SEVWQzogcHVibGljIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQgeworICAgIFNvZnRIRVZDKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+U29mdEhFVkMoKTsKKworICAgIHZpcnR1YWwgdm9pZCBvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KTsKKyAgICB2aXJ0dWFsIHZvaWQgb25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgpOworICAgIHZpcnR1YWwgdm9pZCBvblJlc2V0KCk7CisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0UGFyYW1ldGVyKE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKTsKK3ByaXZhdGU6CisgICAgLy8gTnVtYmVyIG9mIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycworICAgIGVudW0geworICAgICAgICBrTnVtQnVmZmVycyA9IDgKKyAgICB9OworCisgICAgaXZfb2JqX3QgKm1Db2RlY0N0eDsgICAgICAgICAvLyBDb2RlYyBjb250ZXh0CisgICAgaXZfbWVtX3JlY190ICptTWVtUmVjb3JkczsgICAvLyBNZW1vcnkgcmVjb3JkcyByZXF1ZXN0ZWQgYnkgdGhlIGNvZGVjCisgICAgc2l6ZV90IG1OdW1NZW1SZWNvcmRzOyAgICAgICAvLyBOdW1iZXIgb2YgbWVtb3J5IHJlY29yZHMgcmVxdWVzdGVkIGJ5IHRoZSBjb2RlYworCisgICAgc2l6ZV90IG1OdW1Db3JlczsgICAgICAgICAgICAvLyBOdW1iZXIgb2YgY29yZXMgdG8gYmUgdWVzZCBieSB0aGUgY29kZWMKKworICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lU3RhcnQ7ICAgLy8gVGltZSBhdCB0aGUgc3RhcnQgb2YgZGVjb2RlKCkKKyAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZUVuZDsgICAgIC8vIFRpbWUgYXQgdGhlIGVuZCBvZiBkZWNvZGUoKQorCisgICAgLy8gSW50ZXJuYWwgYnVmZmVyIHRvIGJlIHVzZWQgdG8gZmx1c2ggb3V0IHRoZSBidWZmZXJzIGZyb20gZGVjb2RlcgorICAgIHVpbnQ4X3QgKm1GbHVzaE91dEJ1ZmZlcjsKKworICAgIC8vIFN0YXR1cyBvZiBlbnRyaWVzIGluIHRoZSB0aW1lc3RhbXAgYXJyYXkKKyAgICBib29sIG1UaW1lU3RhbXBzVmFsaWRbTUFYX1RJTUVfU1RBTVBTXTsKKworICAgIC8vIFRpbWVzdGFtcCBhcnJheSAtIFNpbmNlIGNvZGVjIGRvZXMgbm90IHRha2UgNjQgYml0IHRpbWVzdGFtcHMsCisgICAgLy8gdGhleSBhcmUgbWFpbnRhaW5lZCBpbiB0aGUgcGx1Z2luCisgICAgT01YX1M2NCBtVGltZVN0YW1wc1tNQVhfVElNRV9TVEFNUFNdOworCisgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgbU9teENvbG9yRm9ybWF0OyAgICAvLyBPTVggQ29sb3IgZm9ybWF0CisgICAgSVZfQ09MT1JfRk9STUFUX1QgbUl2Q29sb3JGb3JtYXQ7ICAgICAgICAvLyBJdHRpYW0gQ29sb3IgZm9ybWF0CisKKyAgICBib29sIG1Jc0luRmx1c2g7ICAgICAgICAvLyBjb2RlYyBpcyBmbHVzaCBtb2RlCisgICAgYm9vbCBtUmVjZWl2ZWRFT1M7ICAgICAgLy8gRU9TIGlzIHJlY2VpZXZlZCBvbiBpbnB1dCBwb3J0CisgICAgYm9vbCBtSW5pdE5lZWRlZDsKKyAgICB1aW50MzJfdCBtTmV3V2lkdGg7CisgICAgdWludDMyX3QgbU5ld0hlaWdodDsKKyAgICAvLyBUaGUgaW5wdXQgc3RyZWFtIGhhcyBjaGFuZ2VkIHRvIGEgZGlmZmVyZW50IHJlc29sdXRpb24sIHdoaWNoIGlzIHN0aWxsIHN1cHBvcnRlZCBieSB0aGUKKyAgICAvLyBjb2RlYy4gU28gdGhlIGNvZGVjIGlzIHN3aXRjaGluZyB0byBkZWNvZGUgdGhlIG5ldyByZXNvbHV0aW9uLgorICAgIGJvb2wgbUNoYW5naW5nUmVzb2x1dGlvbjsKKyAgICBib29sIG1GbHVzaE5lZWRlZDsKKworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisgICAgc3RhdHVzX3QgZGVJbml0RGVjb2RlcigpOworICAgIHN0YXR1c190IHNldEZsdXNoTW9kZSgpOworICAgIHN0YXR1c190IHNldFBhcmFtcyhzaXplX3Qgc3RyaWRlKTsKKyAgICB2b2lkIGxvZ1ZlcnNpb24oKTsKKyAgICBzdGF0dXNfdCBzZXROdW1Db3JlcygpOworICAgIHN0YXR1c190IHJlc2V0RGVjb2RlcigpOworICAgIHN0YXR1c190IHJlc2V0UGx1Z2luKCk7CisgICAgc3RhdHVzX3QgcmVJbml0RGVjb2RlcigpOworCisgICAgYm9vbCBzZXREZWNvZGVBcmdzKGl2ZF92aWRlb19kZWNvZGVfaXBfdCAqcHNfZGVjX2lwLAorICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3QgKnBzX2RlY19vcCwKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmluSGVhZGVyLAorICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyLAorICAgICAgICBzaXplX3QgdGltZVN0YW1wSXgpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMgKFNvZnRIRVZDKTsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBTT0ZUX0hFVkNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvQW5kcm9pZC5tawppbmRleCBhM2Q1Nzc5Li4xZDIzMmM2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9BbmRyb2lkLm1rCkBAIC00Niw2ICs0Niw4IEBACiAKIExPQ0FMX0NGTEFHUyA6PSAtRE9TQ0xfRVhQT1JUX1JFRj0gLURPU0NMX0lNUE9SVF9SRUY9CiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKQEAgLTcyLDQgKzc0LDYgQEAKIExPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9zb2Z0X21wZWc0ZGVjCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL1NvZnRNUEVHNC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL1NvZnRNUEVHNC5jcHAKaW5kZXggZDUwYTIxOS4uZjUwM2E0MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9Tb2Z0TVBFRzQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmNwcApAQCAtMjcsMTAgKzI3LDYgQEAKIAogI2luY2x1ZGUgIm1wNGRlY19hcGkuaCIKIAotI2lmbmRlZiBVSU5UMzJfTUFYCi0jZGVmaW5lIFVJTlQzMl9NQVggKDQyOTQ5NjcyOTVVKQotI2VuZGlmCi0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RhdGljIGNvbnN0IENvZGVjUHJvZmlsZUxldmVsIGtNNFZQcm9maWxlTGV2ZWxzW10gPSB7CkBAIC05NSw3ICs5MSw3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIFNvZnRNUEVHNDo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgewordm9pZCBTb2Z0TVBFRzQ6Om9uUXVldWVGaWxsZWQoT01YX1UzMiAvKiBwb3J0SW5kZXggKi8pIHsKICAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgIT0gTk9ORSkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTM4LDYgKzEzNCwxMiBAQAogICAgICAgICB9CiAKICAgICAgICAgdWludDhfdCAqYml0c3RyZWFtID0gaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKKyAgICAgICAgdWludDMyX3QgKnN0YXJ0X2NvZGUgPSAodWludDMyX3QgKiliaXRzdHJlYW07CisgICAgICAgIGJvb2wgdm9sSGVhZGVyID0gKnN0YXJ0X2NvZGUgPT0gMHhCMDAxMDAwMDsKKyAgICAgICAgaWYgKHZvbEhlYWRlcikgeworICAgICAgICAgICAgUFZDbGVhblVwVmlkZW9EZWNvZGVyKG1IYW5kbGUpOworICAgICAgICAgICAgbUluaXRpYWxpemVkID0gZmFsc2U7CisgICAgICAgIH0KIAogICAgICAgICBpZiAoIW1Jbml0aWFsaXplZCkgewogICAgICAgICAgICAgdWludDhfdCAqdm9sX2RhdGFbMV07CkBAIC0xNDUsNyArMTQ3LDcgQEAKIAogICAgICAgICAgICAgdm9sX2RhdGFbMF0gPSBOVUxMOwogCi0gICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHKSB7CisgICAgICAgICAgICBpZiAoKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRykgfHwgdm9sSGVhZGVyKSB7CiAgICAgICAgICAgICAgICAgdm9sX2RhdGFbMF0gPSBiaXRzdHJlYW07CiAgICAgICAgICAgICAgICAgdm9sX3NpemUgPSBpbkhlYWRlci0+bkZpbGxlZExlbjsKICAgICAgICAgICAgIH0KQEAgLTE1NCw3ICsxNTYsOCBAQAogICAgICAgICAgICAgICAgIChtTW9kZSA9PSBNT0RFX01QRUc0KSA/IE1QRUc0X01PREUgOiBIMjYzX01PREU7CiAKICAgICAgICAgICAgIEJvb2wgc3VjY2VzcyA9IFBWSW5pdFZpZGVvRGVjb2RlcigKLSAgICAgICAgICAgICAgICAgICAgbUhhbmRsZSwgdm9sX2RhdGEsICZ2b2xfc2l6ZSwgMSwgbVdpZHRoLCBtSGVpZ2h0LCBtb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgbUhhbmRsZSwgdm9sX2RhdGEsICZ2b2xfc2l6ZSwgMSwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyV2lkdGgoKSwgb3V0cHV0QnVmZmVySGVpZ2h0KCksIG1vZGUpOwogCiAgICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICBBTE9HVygiUFZJbml0VmlkZW9EZWNvZGVyIGZhaWxlZC4gVW5zdXBwb3J0ZWQgY29udGVudD8iKTsKQEAgLTE3MywyMSArMTc2LDI2IEBACiAKICAgICAgICAgICAgIFBWU2V0UG9zdFByb2NUeXBlKChWaWRlb0RlY0NvbnRyb2xzICopIG1IYW5kbGUsIDApOwogCisgICAgICAgICAgICBib29sIGhhc0ZyYW1lRGF0YSA9IGZhbHNlOwogICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRykgewogICAgICAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKICAgICAgICAgICAgICAgICBpbkluZm8gPSBOVUxMOwogICAgICAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CiAgICAgICAgICAgICAgICAgaW5IZWFkZXIgPSBOVUxMOworICAgICAgICAgICAgfSBlbHNlIGlmICh2b2xIZWFkZXIpIHsKKyAgICAgICAgICAgICAgICBoYXNGcmFtZURhdGEgPSB0cnVlOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOwogCi0gICAgICAgICAgICBpZiAobW9kZSA9PSBNUEVHNF9NT0RFICYmIHBvcnRTZXR0aW5nc0NoYW5nZWQoKSkgeworICAgICAgICAgICAgaWYgKG1vZGUgPT0gTVBFRzRfTU9ERSAmJiBoYW5kbGVQb3J0U2V0dGluZ3NDaGFuZ2UoKSkgewogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAoIWhhc0ZyYW1lRGF0YSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFtRnJhbWVzQ29uZmlndXJlZCkgewpAQCAtMjUzLDcgKzI2MSw5IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBpZiAocG9ydFNldHRpbmdzQ2hhbmdlZCgpKSB7CisgICAgICAgIC8vIEgyNjMgZG9lc24ndCBoYXZlIFZPTCBoZWFkZXIsIHRoZSBmcmFtZSBzaXplIGluZm9ybWF0aW9uIGlzIGluIHNob3J0IGhlYWRlciwgaS5lLiB0aGUKKyAgICAgICAgLy8gZGVjb2RlciBtYXkgZGV0ZWN0IHNpemUgY2hhbmdlIGFmdGVyIFBWRGVjb2RlVmlkZW9GcmFtZS4KKyAgICAgICAgaWYgKGhhbmRsZVBvcnRTZXR0aW5nc0NoYW5nZSgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtMjk5LDcgKzMwOSw3IEBACiAgICAgfQogfQogCi1ib29sIFNvZnRNUEVHNDo6cG9ydFNldHRpbmdzQ2hhbmdlZCgpIHsKK2Jvb2wgU29mdE1QRUc0OjpoYW5kbGVQb3J0U2V0dGluZ3NDaGFuZ2UoKSB7CiAgICAgdWludDMyX3QgZGlzcF93aWR0aCwgZGlzcF9oZWlnaHQ7CiAgICAgUFZHZXRWaWRlb0RpbWVuc2lvbnMobUhhbmRsZSwgKGludDMyICopJmRpc3Bfd2lkdGgsIChpbnQzMiAqKSZkaXNwX2hlaWdodCk7CiAKQEAgLTMxMiwyNSArMzIyLDI0IEBACiAgICAgQUxPR1YoImRpc3Bfd2lkdGggPSAlZCwgZGlzcF9oZWlnaHQgPSAlZCwgYnVmX3dpZHRoID0gJWQsIGJ1Zl9oZWlnaHQgPSAlZCIsCiAgICAgICAgICAgICBkaXNwX3dpZHRoLCBkaXNwX2hlaWdodCwgYnVmX3dpZHRoLCBidWZfaGVpZ2h0KTsKIAotICAgIGlmIChtQ3JvcFdpZHRoICE9IGRpc3Bfd2lkdGgKLSAgICAgICAgICAgIHx8IG1Dcm9wSGVpZ2h0ICE9IGRpc3BfaGVpZ2h0KSB7Ci0gICAgICAgIG1Dcm9wTGVmdCA9IDA7Ci0gICAgICAgIG1Dcm9wVG9wID0gMDsKLSAgICAgICAgbUNyb3BXaWR0aCA9IGRpc3Bfd2lkdGg7Ci0gICAgICAgIG1Dcm9wSGVpZ2h0ID0gZGlzcF9oZWlnaHQ7CisgICAgQ3JvcFNldHRpbmdzTW9kZSBjcm9wU2V0dGluZ3NNb2RlID0ga0Nyb3BVblNldDsKKyAgICBpZiAoZGlzcF93aWR0aCAhPSBidWZfd2lkdGggfHwgZGlzcF9oZWlnaHQgIT0gYnVmX2hlaWdodCkgeworICAgICAgICBjcm9wU2V0dGluZ3NNb2RlID0ga0Nyb3BTZXQ7CiAKLSAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsCi0gICAgICAgICAgICAgICAxLAotICAgICAgICAgICAgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0Q3JvcCwKLSAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICBpZiAobUNyb3BXaWR0aCAhPSBkaXNwX3dpZHRoIHx8IG1Dcm9wSGVpZ2h0ICE9IGRpc3BfaGVpZ2h0KSB7CisgICAgICAgICAgICBtQ3JvcExlZnQgPSAwOworICAgICAgICAgICAgbUNyb3BUb3AgPSAwOworICAgICAgICAgICAgbUNyb3BXaWR0aCA9IGRpc3Bfd2lkdGg7CisgICAgICAgICAgICBtQ3JvcEhlaWdodCA9IGRpc3BfaGVpZ2h0OworICAgICAgICAgICAgY3JvcFNldHRpbmdzTW9kZSA9IGtDcm9wQ2hhbmdlZDsKKyAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChidWZfd2lkdGggIT0gbVdpZHRoIHx8IGJ1Zl9oZWlnaHQgIT0gbUhlaWdodCkgewotICAgICAgICBtV2lkdGggPSBidWZfd2lkdGg7Ci0gICAgICAgIG1IZWlnaHQgPSBidWZfaGVpZ2h0OwotCi0gICAgICAgIHVwZGF0ZVBvcnREZWZpbml0aW9ucygpOwotCisgICAgYm9vbCBwb3J0V2lsbFJlc2V0ID0gZmFsc2U7CisgICAgY29uc3QgYm9vbCBmYWtlU3RyaWRlID0gdHJ1ZTsKKyAgICBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjpoYW5kbGVQb3J0U2V0dGluZ3NDaGFuZ2UoCisgICAgICAgICAgICAmcG9ydFdpbGxSZXNldCwgYnVmX3dpZHRoLCBidWZfaGVpZ2h0LCBjcm9wU2V0dGluZ3NNb2RlLCBmYWtlU3RyaWRlKTsKKyAgICBpZiAocG9ydFdpbGxSZXNldCkgewogICAgICAgICBpZiAobU1vZGUgPT0gTU9ERV9IMjYzKSB7CiAgICAgICAgICAgICBQVkNsZWFuVXBWaWRlb0RlY29kZXIobUhhbmRsZSk7CiAKQEAgLTMzOSw3ICszNDgsNyBAQAogCiAgICAgICAgICAgICB2b2xfZGF0YVswXSA9IE5VTEw7CiAgICAgICAgICAgICBpZiAoIVBWSW5pdFZpZGVvRGVjb2RlcigKLSAgICAgICAgICAgICAgICAgICAgbUhhbmRsZSwgdm9sX2RhdGEsICZ2b2xfc2l6ZSwgMSwgbVdpZHRoLCBtSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBtSGFuZGxlLCB2b2xfZGF0YSwgJnZvbF9zaXplLCAxLCBvdXRwdXRCdWZmZXJXaWR0aCgpLCBvdXRwdXRCdWZmZXJIZWlnaHQoKSwKICAgICAgICAgICAgICAgICAgICAgSDI2M19NT0RFKSkgewogICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwpAQCAtMzQ4LDEzICszNTcsOSBAQAogICAgICAgICB9CiAKICAgICAgICAgbUZyYW1lc0NvbmZpZ3VyZWQgPSBmYWxzZTsKLQotICAgICAgICBub3RpZnkoT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwgMSwgMCwgTlVMTCk7Ci0gICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBBV0FJVElOR19ESVNBQkxFRDsKLSAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBwb3J0V2lsbFJlc2V0OwogfQogCiB2b2lkIFNvZnRNUEVHNDo6b25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL1NvZnRNUEVHNC5oCmluZGV4IGRlMTRhYWYuLjhhMDZhMDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9Tb2Z0TVBFRzQuaApAQCAtNjcsNyArNjcsNyBAQAogICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CiAKICAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlUG9ydERlZmluaXRpb25zKCk7Ci0gICAgYm9vbCBwb3J0U2V0dGluZ3NDaGFuZ2VkKCk7CisgICAgYm9vbCBoYW5kbGVQb3J0U2V0dGluZ3NDaGFuZ2UoKTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvZnRNUEVHNCk7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZ2V0X3ByZWRfYWR2X2JfYWRkLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2dldF9wcmVkX2Fkdl9iX2FkZC5jcHAKaW5kZXggZTIzZjIzZC4uZmU5ZTdkYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZ2V0X3ByZWRfYWR2X2JfYWRkLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9nZXRfcHJlZF9hZHZfYl9hZGQuY3BwCkBAIC05Niw3ICs5Niw3IEBACiAgICAgb2Zmc2V0ID0gd2lkdGggLSBCX1NJWkU7IC8qIG9mZnNldCBmb3IgcHJldiAqLwogICAgIG9mZnNldDIgPSAocHJlZF93aWR0aF9ybmQgPj4gMSkgLSA0OyAvKiBvZmZzZXQgZm9yIHByZWRfYmxvY2sgKi8KIAotICAgIHRtcCA9ICh1aW50MzIpcHJldiAmIDB4MzsKKyAgICB0bXAgPSAodWludHB0cl90KXByZXYgJiAweDM7CiAgICAgcHJlZF9ibG9jayAtPSBvZmZzZXQyOyAvKiBwcmVzZXQgKi8KIAogICAgIGlmICh0bXAgPT0gMCkgIC8qIHdvcmQtYWxpZ25lZCAqLwpAQCAtMjAzLDcgKzIwMyw3IEBACiAgICAgLyogQnJhbmNoIGJhc2VkIG9uIHBpeGVsIGxvY2F0aW9uIChoYWxmLXBlbCBvciBmdWxsLXBlbCkgZm9yIHggYW5kIHkgKi8KICAgICBwcmVkX2Jsb2NrIC09IG9mZnNldDI7IC8qIHByZXNldCAqLwogCi0gICAgdG1wID0gKHVpbnQzMilwcmV2ICYgMzsKKyAgICB0bXAgPSAodWludHB0cl90KXByZXYgJiAzOwogICAgIG1hc2sgPSAyNTQ7CiAgICAgbWFzayB8PSAobWFzayA8PCA4KTsKICAgICBtYXNrIHw9IChtYXNrIDw8IDE2KTsgLyogMHhGRUZFRkVGRSAqLwpAQCAtNTMyLDcgKzUzMiw3IEBACiAgICAgLyogQnJhbmNoIGJhc2VkIG9uIHBpeGVsIGxvY2F0aW9uIChoYWxmLXBlbCBvciBmdWxsLXBlbCkgZm9yIHggYW5kIHkgKi8KICAgICBwcmVkX2Jsb2NrIC09IG9mZnNldDI7IC8qIHByZXNldCAqLwogCi0gICAgdG1wID0gKHVpbnQzMilwcmV2ICYgMzsKKyAgICB0bXAgPSAodWludHB0cl90KXByZXYgJiAzOwogICAgIG1hc2sgPSAyNTQ7CiAgICAgbWFzayB8PSAobWFzayA8PCA4KTsKICAgICBtYXNrIHw9IChtYXNrIDw8IDE2KTsgLyogMHhGRUZFRkVGRSAqLwpAQCAtODg0LDcgKzg4NCw3IEBACiAgICAgbWFzayB8PSAobWFzayA8PCA4KTsKICAgICBtYXNrIHw9IChtYXNrIDw8IDE2KTsgLyogMHgzZjNmM2YzZiAqLwogCi0gICAgdG1wID0gKHVpbnQzMilwcmV2ICYgMzsKKyAgICB0bXAgPSAodWludHB0cl90KXByZXYgJiAzOwogCiAgICAgcHJlZF9ibG9jayAtPSA0OyAvKiBwcmVzZXQgKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvdm9wLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZvcC5jcHAKaW5kZXggYjNjMzUwZi4uYjAzZWM4YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvdm9wLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy92b3AuY3BwCkBAIC0xNDI2LDcgKzE0MjYsNyBAQAogICAgICAgICB2aWRlby0+bkJpdHNGb3JNQklEID0gQ2FsY051bUJpdHMoKHVpbnQpdmlkZW8tPm5Ub3RhbE1CIC0gMSk7IC8qIG90aGVyd2lzZSBjYWxjdWxhdGUgYWJvdmUgKi8KICAgICB9CiAgICAgc2l6ZSA9IChpbnQzMil2aWRlby0+d2lkdGggKiB2aWRlby0+aGVpZ2h0OwotICAgIGlmICh2aWRlby0+Y3VyclZvcC0+cHJlZGljdGlvblR5cGUgPT0gUF9WT1AgJiYgc2l6ZSA+IHZpZGVvLT52aWRlb0RlY0NvbnRyb2xzLT5zaXplKQorICAgIGlmIChjdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBQX1ZPUCAmJiBzaXplID4gdmlkZW8tPnZpZGVvRGVjQ29udHJvbHMtPnNpemUpCiAgICAgewogICAgICAgICBzdGF0dXMgPSBQVl9GQUlMOwogICAgICAgICBnb3RvIHJldHVybl9wb2ludDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvQW5kcm9pZC5tawppbmRleCA4M2EyZGQyLi5jOTAwNmQ5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9BbmRyb2lkLm1rCkBAIC0zMyw2ICszMyw4IEBACiAgICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCiAgICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC03Miw0ICs3NCw2IEBACiBMT0NBTF9NT0RVTEUgOj0gbGlic3RhZ2VmcmlnaHRfc29mdF9tcGVnNGVuYwogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5jcHAKaW5kZXggNzg3YzQ2ZS4uNTk2YjMyOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuY3BwCkBAIC0zMyw2ICszMyw4IEBACiAKICNpbmNsdWRlICJTb2Z0TVBFRzRFbmNvZGVyLmgiCiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAjaWZuZGVmIElOVDMyX01BWAogI2RlZmluZSBJTlQzMl9NQVggICAyMTQ3NDgzNjQ3CiAjZW5kaWYKQEAgLTQ4LDQyICs1MCwxMiBAQAogICAgIHBhcmFtcy0+blZlcnNpb24ucy5uU3RlcCA9IDA7CiB9CiAKLWlubGluZSBzdGF0aWMgdm9pZCBDb252ZXJ0WVVWNDIwU2VtaVBsYW5hclRvWVVWNDIwUGxhbmFyKAotICAgICAgICB1aW50OF90ICppbnl1diwgdWludDhfdCogb3V0eXV2LAotICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgewotCi0gICAgaW50MzJfdCBvdXRZc2l6ZSA9IHdpZHRoICogaGVpZ2h0OwotICAgIHVpbnQzMl90ICpvdXR5ID0gICh1aW50MzJfdCAqKSBvdXR5dXY7Ci0gICAgdWludDE2X3QgKm91dGNiID0gKHVpbnQxNl90ICopIChvdXR5dXYgKyBvdXRZc2l6ZSk7Ci0gICAgdWludDE2X3QgKm91dGNyID0gKHVpbnQxNl90ICopIChvdXR5dXYgKyBvdXRZc2l6ZSArIChvdXRZc2l6ZSA+PiAyKSk7Ci0KLSAgICAvKiBZIGNvcHlpbmcgKi8KLSAgICBtZW1jcHkob3V0eSwgaW55dXYsIG91dFlzaXplKTsKLQotICAgIC8qIFUgJiBWIGNvcHlpbmcgKi8KLSAgICB1aW50MzJfdCAqaW55dXZfNCA9ICh1aW50MzJfdCAqKSAoaW55dXYgKyBvdXRZc2l6ZSk7Ci0gICAgZm9yIChpbnQzMl90IGkgPSBoZWlnaHQgPj4gMTsgaSA+IDA7IC0taSkgewotICAgICAgICBmb3IgKGludDMyX3QgaiA9IHdpZHRoID4+IDI7IGogPiAwOyAtLWopIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHRlbXAgPSAqaW55dXZfNCsrOwotICAgICAgICAgICAgdWludDMyX3QgdGVtcFUgPSB0ZW1wICYgMHhGRjsKLSAgICAgICAgICAgIHRlbXBVID0gdGVtcFUgfCAoKHRlbXAgPj4gOCkgJiAweEZGMDApOwotCi0gICAgICAgICAgICB1aW50MzJfdCB0ZW1wViA9ICh0ZW1wID4+IDgpICYgMHhGRjsKLSAgICAgICAgICAgIHRlbXBWID0gdGVtcFYgfCAoKHRlbXAgPj4gMTYpICYgMHhGRjAwKTsKLQotICAgICAgICAgICAgLy8gRmxpcCBVIGFuZCBWCi0gICAgICAgICAgICAqb3V0Y2IrKyA9IHRlbXBWOwotICAgICAgICAgICAgKm91dGNyKysgPSB0ZW1wVTsKLSAgICAgICAgfQotICAgIH0KLX0KLQogU29mdE1QRUc0RW5jb2Rlcjo6U29mdE1QRUc0RW5jb2RlcigKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCiAgICAgICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCiAgICAgICAgICAgICBPTVhfUFRSIGFwcERhdGEsCiAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkKLSAgICA6IFNpbXBsZVNvZnRPTVhDb21wb25lbnQobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpLAorICAgIDogU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudChuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCksCiAgICAgICBtRW5jb2RlTW9kZShDT01CSU5FX01PREVfV0lUSF9FUlJfUkVTKSwKICAgICAgIG1WaWRlb1dpZHRoKDE3NiksCiAgICAgICBtVmlkZW9IZWlnaHQoMTQ0KSwKQEAgLTE1NSw3ICsxMjcsOCBAQAogICAgIG1FbmNQYXJhbXMtPnF1YW50VHlwZVswXSA9IDA7CiAgICAgbUVuY1BhcmFtcy0+bm9GcmFtZVNraXBwZWQgPSBQVl9PRkY7CiAKLSAgICBpZiAobVZpZGVvQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIpIHsKKyAgICBpZiAobVZpZGVvQ29sb3JGb3JtYXQgIT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcgorICAgICAgICAgICAgfHwgbVN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMpIHsKICAgICAgICAgLy8gQ29sb3IgY29udmVyc2lvbiBpcyBuZWVkZWQuCiAgICAgICAgIGZyZWUobUlucHV0RnJhbWVEYXRhKTsKICAgICAgICAgbUlucHV0RnJhbWVEYXRhID0gTlVMTDsKQEAgLTIyNyw3ICsyMDAsNyBAQAogCiAgICAgUFZDbGVhblVwVmlkZW9FbmNvZGVyKG1IYW5kbGUpOwogCi0gICAgZGVsZXRlIG1JbnB1dEZyYW1lRGF0YTsKKyAgICBmcmVlKG1JbnB1dEZyYW1lRGF0YSk7CiAgICAgbUlucHV0RnJhbWVEYXRhID0gTlVMTDsKIAogICAgIGRlbGV0ZSBtRW5jUGFyYW1zOwpAQCAtNTI2LDYgKzQ5OSwxNyBAQAogICAgICAgICAgICAgICAgIG1WaWRlb0hlaWdodCA9IGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKICAgICAgICAgICAgICAgICBtVmlkZW9GcmFtZVJhdGUgPSBkZWYtPmZvcm1hdC52aWRlby54RnJhbWVyYXRlID4+IDE2OwogICAgICAgICAgICAgICAgIG1WaWRlb0NvbG9yRm9ybWF0ID0gZGVmLT5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0OworCisgICAgICAgICAgICAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqcG9ydERlZiA9CisgICAgICAgICAgICAgICAgICAgICZlZGl0UG9ydEluZm8oMCktPm1EZWY7CisgICAgICAgICAgICAgICAgcG9ydERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gbVZpZGVvV2lkdGg7CisgICAgICAgICAgICAgICAgcG9ydERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG1WaWRlb0hlaWdodDsKKyAgICAgICAgICAgICAgICBwb3J0RGVmLT5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZSA9IGRlZi0+Zm9ybWF0LnZpZGVvLnhGcmFtZXJhdGU7CisgICAgICAgICAgICAgICAgcG9ydERlZi0+Zm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9CisgICAgICAgICAgICAgICAgICAgIChPTVhfQ09MT1JfRk9STUFUVFlQRSkgbVZpZGVvQ29sb3JGb3JtYXQ7CisgICAgICAgICAgICAgICAgcG9ydERlZiA9ICZlZGl0UG9ydEluZm8oMSktPm1EZWY7CisgICAgICAgICAgICAgICAgcG9ydERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gbVZpZGVvV2lkdGg7CisgICAgICAgICAgICAgICAgcG9ydERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG1WaWRlb0hlaWdodDsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbVZpZGVvQml0UmF0ZSA9IGRlZi0+Zm9ybWF0LnZpZGVvLm5CaXRyYXRlOwogICAgICAgICAgICAgfQpAQCAtNjY4LDExICs2NTIsNyBAQAogICAgICAgICAgICAgICAgICAgICBtU3RvcmVNZXRhRGF0YUluQnVmZmVycyA/ICIgdHJ1ZSIgOiAiZmFsc2UiKTsKIAogICAgICAgICAgICAgaWYgKG1TdG9yZU1ldGFEYXRhSW5CdWZmZXJzKSB7Ci0gICAgICAgICAgICAgICAgbVZpZGVvQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI7Ci0gICAgICAgICAgICAgICAgaWYgKG1JbnB1dEZyYW1lRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1JbnB1dEZyYW1lRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QgKikgbWFsbG9jKChtVmlkZW9XaWR0aCAqIG1WaWRlb0hlaWdodCAqIDMgKSA+PiAxKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVZpZGVvQ29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0QW5kcm9pZE9wYXF1ZTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CkBAIC02ODMsNyArNjYzLDcgQEAKICAgICB9CiB9CiAKLXZvaWQgU29mdE1QRUc0RW5jb2Rlcjo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgewordm9pZCBTb2Z0TVBFRzRFbmNvZGVyOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgLyogcG9ydEluZGV4ICovKSB7CiAgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2F3SW5wdXRFT1MpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTc0MCwzNiArNzIwLDM2IEBACiAgICAgICAgICAgICBtU2F3SW5wdXRFT1MgPSB0cnVlOwogICAgICAgICB9CiAKLSAgICAgICAgYnVmZmVyX2hhbmRsZV90IHNyY0J1ZmZlcjsgLy8gZm9yIE1ldGFEYXRhTW9kZSBvbmx5CiAgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA+IDApIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgKmlucHV0RGF0YSA9IE5VTEw7CisgICAgICAgICAgICBjb25zdCB1aW50OF90ICppbnB1dERhdGEgPSBOVUxMOwogICAgICAgICAgICAgaWYgKG1TdG9yZU1ldGFEYXRhSW5CdWZmZXJzKSB7CiAgICAgICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuICE9IDgpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk1ldGFEYXRhIGJ1ZmZlciBpcyB3cm9uZyBzaXplISAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIihnb3QgJWx1IGJ5dGVzLCBleHBlY3RlZCA4KSIsIGluSGVhZGVyLT5uRmlsbGVkTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKGdvdCAldSBieXRlcywgZXhwZWN0ZWQgOCkiLCBpbkhlYWRlci0+bkZpbGxlZExlbik7CiAgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCAwKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpbnB1dERhdGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdEdyYWxsb2NEYXRhKGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNCdWZmZXIpOworICAgICAgICAgICAgICAgICAgICBleHRyYWN0R3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRGcmFtZURhdGEsIChtVmlkZW9XaWR0aCAqIG1WaWRlb0hlaWdodCAqIDMpID4+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldCwgaW5IZWFkZXItPm5GaWxsZWRMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7CiAgICAgICAgICAgICAgICAgaWYgKGlucHV0RGF0YSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gZXh0cmFjdCBncmFsbG9jIGJ1ZmZlciBpbiBtZXRhZGF0YSBtb2RlIik7CiAgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogVmVyaWZ5L2NvbnZlcnQgcGl4ZWwgZm9ybWF0IGVudW0KICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW5wdXREYXRhID0gKHVpbnQ4X3QgKilpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0OworICAgICAgICAgICAgICAgIGlucHV0RGF0YSA9IChjb25zdCB1aW50OF90ICopaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKKyAgICAgICAgICAgICAgICBpZiAobVZpZGVvQ29sb3JGb3JtYXQgIT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcikgeworICAgICAgICAgICAgICAgICAgICBDb252ZXJ0WVVWNDIwU2VtaVBsYW5hclRvWVVWNDIwUGxhbmFyKAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXREYXRhLCBtSW5wdXRGcmFtZURhdGEsIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOworICAgICAgICAgICAgICAgICAgICBpbnB1dERhdGEgPSBtSW5wdXRGcmFtZURhdGE7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAobVZpZGVvQ29sb3JGb3JtYXQgIT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcikgewotICAgICAgICAgICAgICAgIENvbnZlcnRZVVY0MjBTZW1pUGxhbmFyVG9ZVVY0MjBQbGFuYXIoCi0gICAgICAgICAgICAgICAgICAgIGlucHV0RGF0YSwgbUlucHV0RnJhbWVEYXRhLCBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBpbnB1dERhdGEgPSBtSW5wdXRGcmFtZURhdGE7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICBDSEVDSyhpbnB1dERhdGEgIT0gTlVMTCk7CiAKICAgICAgICAgICAgIFZpZGVvRW5jRnJhbWVJTyB2aW4sIHZvdXQ7CkBAIC03NzgsMTcgKzc1OCwxNyBAQAogICAgICAgICAgICAgdmluLmhlaWdodCA9ICgobVZpZGVvSGVpZ2h0ICArIDE1KSA+PiA0KSA8PCA0OwogICAgICAgICAgICAgdmluLnBpdGNoID0gKChtVmlkZW9XaWR0aCArIDE1KSA+PiA0KSA8PCA0OwogICAgICAgICAgICAgdmluLnRpbWVzdGFtcCA9IChpbkhlYWRlci0+blRpbWVTdGFtcCArIDUwMCkgLyAxMDAwOyAgLy8gaW4gbXMKLSAgICAgICAgICAgIHZpbi55Q2hhbiA9IGlucHV0RGF0YTsKKyAgICAgICAgICAgIHZpbi55Q2hhbiA9ICh1aW50OF90ICopaW5wdXREYXRhOwogICAgICAgICAgICAgdmluLnVDaGFuID0gdmluLnlDaGFuICsgdmluLmhlaWdodCAqIHZpbi5waXRjaDsKICAgICAgICAgICAgIHZpbi52Q2hhbiA9IHZpbi51Q2hhbiArICgodmluLmhlaWdodCAqIHZpbi5waXRjaCkgPj4gMik7CiAKLSAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbW9kVGltZU1zID0gMDsKKyAgICAgICAgICAgIFVMb25nIG1vZFRpbWVNcyA9IDA7CiAgICAgICAgICAgICBpbnQzMl90IG5MYXllciA9IDA7CiAgICAgICAgICAgICBNUDRIaW50VHJhY2sgaGludFRyYWNrOwogICAgICAgICAgICAgaWYgKCFQVkVuY29kZVZpZGVvRnJhbWUobUhhbmRsZSwgJnZpbiwgJnZvdXQsCiAgICAgICAgICAgICAgICAgICAgICZtb2RUaW1lTXMsIG91dFB0ciwgJmRhdGFMZW5ndGgsICZuTGF5ZXIpIHx8CiAgICAgICAgICAgICAgICAgIVBWR2V0SGludFRyYWNrKG1IYW5kbGUsICZoaW50VHJhY2spKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBlbmNvZGUgZnJhbWUgb3IgZ2V0IGhpbmsgdHJhY2sgYXQgZnJhbWUgJWxsZCIsCisgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBlbmNvZGUgZnJhbWUgb3IgZ2V0IGhpbmsgdHJhY2sgYXQgZnJhbWUgJSIgUFJJZDY0LAogICAgICAgICAgICAgICAgICAgICBtTnVtSW5wdXRGcmFtZXMpOwogICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIDApOwpAQCAtODA1LDcgKzc4NSw2IEBACiAKICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOwogICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICAgICAgcmVsZWFzZUdyYWxsb2NEYXRhKHNyY0J1ZmZlcik7CiAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CiAKICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CkBAIC04MjAsNDcgKzc5OSw2IEBACiAgICAgfQogfQogCi1PTVhfRVJST1JUWVBFIFNvZnRNUEVHNEVuY29kZXI6OmdldEV4dGVuc2lvbkluZGV4KAotICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBPTVhfSU5ERVhUWVBFICppbmRleCkgewotICAgIGlmICghc3RyY21wKG5hbWUsICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguc3RvcmVNZXRhRGF0YUluQnVmZmVycyIpKSB7Ci0gICAgICAgICooaW50MzJfdCopaW5kZXggPSBrU3RvcmVNZXRhRGF0YUV4dGVuc2lvbkluZGV4OwotICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKLSAgICB9Ci0gICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKLX0KLQotdWludDhfdCAqU29mdE1QRUc0RW5jb2Rlcjo6ZXh0cmFjdEdyYWxsb2NEYXRhKHZvaWQgKmRhdGEsIGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyKSB7Ci0gICAgT01YX1UzMiB0eXBlID0gKihPTVhfVTMyKilkYXRhOwotICAgIHN0YXR1c190IHJlczsKLSAgICBpZiAodHlwZSAhPSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSkgewotICAgICAgICBBTE9HRSgiRGF0YSBwYXNzZWQgaW4gd2l0aCBtZXRhZGF0YSBtb2RlIGRvZXMgbm90IGhhdmUgdHlwZSAiCi0gICAgICAgICAgICAgICAgImtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlICglZCksIGhhcyB0eXBlICVsZCBpbnN0ZWFkIiwKLSAgICAgICAgICAgICAgICBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSwgdHlwZSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBidWZmZXJfaGFuZGxlX3QgaW1nQnVmZmVyID0gKihidWZmZXJfaGFuZGxlX3QqKSgodWludDhfdCopZGF0YSArIDQpOwotCi0gICAgY29uc3QgUmVjdCByZWN0KG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOwotICAgIHVpbnQ4X3QgKmltZzsKLSAgICByZXMgPSBHcmFwaGljQnVmZmVyTWFwcGVyOjpnZXQoKS5sb2NrKGltZ0J1ZmZlciwKLSAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUiwKLSAgICAgICAgICAgIHJlY3QsICh2b2lkKiopJmltZyk7Ci0gICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBsb2NrIGltYWdlIGJ1ZmZlciAlcCBmb3IgYWNjZXNzIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgIGltZ0J1ZmZlcik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgICpidWZmZXIgPSBpbWdCdWZmZXI7Ci0gICAgcmV0dXJuIGltZzsKLX0KLQotdm9pZCBTb2Z0TVBFRzRFbmNvZGVyOjpyZWxlYXNlR3JhbGxvY0RhdGEoYnVmZmVyX2hhbmRsZV90IGJ1ZmZlcikgewotICAgIGlmIChtU3RvcmVNZXRhRGF0YUluQnVmZmVycykgewotICAgICAgICBHcmFwaGljQnVmZmVyTWFwcGVyOjpnZXQoKS51bmxvY2soYnVmZmVyKTsKLSAgICB9Ci19Ci0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKIGFuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQgKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5oCmluZGV4IGNjNGVhOGYuLmIwNjA1YjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5oCkBAIC0xOSw3ICsxOSw3IEBACiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSAiU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oIgogI2luY2x1ZGUgIm1wNGVuY19hcGkuaCIKIAogCkBAIC0yNyw3ICsyNyw3IEBACiAKIHN0cnVjdCBNZWRpYUJ1ZmZlcjsKIAotc3RydWN0IFNvZnRNUEVHNEVuY29kZXIgOiBwdWJsaWMgU2ltcGxlU29mdE9NWENvbXBvbmVudCB7CitzdHJ1Y3QgU29mdE1QRUc0RW5jb2RlciA6IHB1YmxpYyBTb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50IHsKICAgICBTb2Z0TVBFRzRFbmNvZGVyKAogICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKICAgICAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKQEAgLTQzLDExICs0Myw2IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgb25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCk7CiAKLSAgICAvLyBPdmVycmlkZSBTb2Z0T01YQ29tcG9uZW50IG1ldGhvZHMKLQotICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBnZXRFeHRlbnNpb25JbmRleCgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIE9NWF9JTkRFWFRZUEUgKmluZGV4KTsKLQogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgflNvZnRNUEVHNEVuY29kZXIoKTsKIApAQCAtNTYsMTAgKzUxLDYgQEAKICAgICAgICAga051bUJ1ZmZlcnMgPSAyLAogICAgIH07CiAKLSAgICBlbnVtIHsKLSAgICAgICAga1N0b3JlTWV0YURhdGFFeHRlbnNpb25JbmRleCA9IE9NWF9JbmRleFZlbmRvclN0YXJ0VW51c2VkICsgMQotICAgIH07Ci0KICAgICAvLyBPTVggaW5wdXQgYnVmZmVyJ3MgdGltZXN0YW1wIGFuZCBmbGFncwogICAgIHR5cGVkZWYgc3RydWN0IHsKICAgICAgICAgaW50NjRfdCBtVGltZVVzOwpAQCAtOTAsOSArODEsNiBAQAogICAgIE9NWF9FUlJPUlRZUEUgaW5pdEVuY29kZXIoKTsKICAgICBPTVhfRVJST1JUWVBFIHJlbGVhc2VFbmNvZGVyKCk7CiAKLSAgICB1aW50OF90KiBleHRyYWN0R3JhbGxvY0RhdGEodm9pZCAqZGF0YSwgYnVmZmVyX2hhbmRsZV90ICpidWZmZXIpOwotICAgIHZvaWQgcmVsZWFzZUdyYWxsb2NEYXRhKGJ1ZmZlcl9oYW5kbGVfdCBidWZmZXIpOwotCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdE1QRUc0RW5jb2Rlcik7CiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL2luY2x1ZGUvbXA0ZW5jX2FwaS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9pbmNsdWRlL21wNGVuY19hcGkuaAppbmRleCBhNTRmZDhiLi45NDUxNDc5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL2luY2x1ZGUvbXA0ZW5jX2FwaS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvaW5jbHVkZS9tcDRlbmNfYXBpLmgKQEAgLTI5LDcgKzI5LDcgQEAKIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgVVNob3J0OwogdHlwZWRlZiBzaG9ydCBTaG9ydDsKIHR5cGVkZWYgdW5zaWduZWQgaW50IEJvb2w7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgVUxvbmc7Cit0eXBlZGVmIHVpbnQzMl90IFVMb25nOwogCiAjZGVmaW5lIFBWX0NPREVDX0lOSVQgIDAKICNkZWZpbmUgUFZfQ09ERUNfU1RPUCAgMQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZGN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2RjdC5jcHAKaW5kZXggZmE1MGVlYi4uZmE0YWUyMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZGN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9kY3QuY3BwCkBAIC0yNTAsNyArMjUwLDcgQEAKICAgICAgICAgICAgIG91dFs0MF0gPSBrNCA7ICAgLyogcm93IDUgKi8KICAgICAgICAgICAgIG91dCsrOwogICAgICAgICB9Ci0gICAgICAgIHdoaWxlICgoVUludClvdXQgPCAoVUludClkc3QpIDsKKyAgICAgICAgd2hpbGUgKCh1aW50cHRyX3Qpb3V0IDwgKHVpbnRwdHJfdClkc3QpIDsKIAogICAgICAgICByZXR1cm4gOwogICAgIH0KQEAgLTQ1NSw3ICs0NTUsNyBAQAogICAgICAgICAgICAgb3V0WzhdID0gazUgOyAgICAgICAvKiByb3cgMSAqLwogICAgICAgICAgICAgb3V0Kys7CiAgICAgICAgIH0KLSAgICAgICAgd2hpbGUgKChVSW50KW91dCA8IChVSW50KWRzdCkgOworICAgICAgICB3aGlsZSAoKHVpbnRwdHJfdClvdXQgPCAodWludHB0cl90KWRzdCkgOwogCiAgICAgICAgIHJldHVybiA7CiAgICAgfQpAQCAtNjM1LDcgKzYzNSw3IEBACiAgICAgICAgICAgICBvdXRbOF0gPSBrNSA7ICAgICAgIC8qIHJvdyAxICovCiAgICAgICAgICAgICBvdXQrKzsKICAgICAgICAgfQotICAgICAgICB3aGlsZSAoKFVJbnQpb3V0IDwgKFVJbnQpZHN0KSA7CisgICAgICAgIHdoaWxlICgodWludHB0cl90KW91dCA8ICh1aW50cHRyX3QpZHN0KSA7CiAKICAgICAgICAgcmV0dXJuIDsKICAgICB9CkBAIC04NDYsNyArODQ2LDcgQEAKICAgICAgICAgICAgIG91dFs0MF0gPSBrNCA7ICAgLyogcm93IDUgKi8KICAgICAgICAgICAgIG91dCsrOwogICAgICAgICB9Ci0gICAgICAgIHdoaWxlICgoVUludClvdXQgPCAoVUludClkc3QpIDsKKyAgICAgICAgd2hpbGUgKCh1aW50cHRyX3Qpb3V0IDwgKHVpbnRwdHJfdClkc3QpIDsKIAogICAgICAgICByZXR1cm4gOwogICAgIH0KQEAgLTEwMzMsNyArMTAzMyw3IEBACiAgICAgICAgICAgICBvdXRbOF0gPSBrNSA7ICAgICAgIC8qIHJvdyAxICovCiAgICAgICAgICAgICBvdXQrKzsKICAgICAgICAgfQotICAgICAgICB3aGlsZSAoKFVJbnQpb3V0IDwgKFVJbnQpZHN0KSA7CisgICAgICAgIHdoaWxlICgodWludHB0cl90KW91dCA8ICh1aW50cHRyX3QpZHN0KSA7CiAKICAgICAgICAgcmV0dXJuIDsKICAgICB9CkBAIC0xMTk1LDcgKzExOTUsNyBAQAogICAgICAgICAgICAgb3V0WzhdID0gazUgOyAgICAgICAvKiByb3cgMSAqLwogICAgICAgICAgICAgb3V0Kys7CiAgICAgICAgIH0KLSAgICAgICAgd2hpbGUgKChVSW50KW91dCA8IChVSW50KWRzdCkgOworICAgICAgICB3aGlsZSAoKHVpbnRwdHJfdClvdXQgPCAodWludHB0cl90KWRzdCkgOwogCiAgICAgICAgIHJldHVybiA7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmFzdGNvZGVtYi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9mYXN0Y29kZW1iLmNwcAppbmRleCA2ZmQ0MWMzLi4wYWQzOWE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9mYXN0Y29kZW1iLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9mYXN0Y29kZW1iLmNwcApAQCAtNTcyLDcgKzU3Miw3IEBACiAgICAgICAgIGN1cjIgICAgPSBjdXIyICYgKG1hc2sgPDwgOCk7ICAgLyogbWFzayBmaXJzdCBhbmQgdGhpcmQgYnl0ZXMgKi8KICAgICAgICAgc3VtMiAgICA9IHN1bTIgKyAoKFVJbnQpY3VyMiA+PiA4KTsKICAgICB9Ci0gICAgd2hpbGUgKChVSW50KWN1ckludCA8IChVSW50KWVuZCk7CisgICAgd2hpbGUgKCh1aW50cHRyX3QpY3VySW50IDwgKHVpbnRwdHJfdCllbmQpOwogCiAgICAgY3VyMSA9IHN1bTQgLSAoc3VtMiA8PCA4KTsgIC8qIGdldCBldmVuLXN1bSAqLwogICAgIGN1cjEgPSBjdXIxICsgc3VtMjsgICAgICAgICAvKiBhZGQgMTYgYml0IGV2ZW4tc3VtIGFuZCBvZGQtc3VtKi8KQEAgLTYxMSw3ICs2MTEsNyBAQAogICAgICAgICBsb2FkMiA9IGxvYWQyICYgKG1hc2sgPDwgOCk7IC8qIGV2ZW4gYnl0ZXMgKi8KICAgICAgICAgc3VtMiArPSAoKFVJbnQpbG9hZDIgPj4gOCk7IC8qIHN1bSBldmVuIGJ5dGVzLCAxNiBiaXQgKi8KICAgICB9Ci0gICAgd2hpbGUgKChVSW50KWN1ckludCA8IChVSW50KWVuZCk7CisgICAgd2hpbGUgKCh1aW50cHRyX3QpY3VySW50IDwgKHVpbnRwdHJfdCllbmQpOwogICAgIGxvYWQxID0gc3VtNCAtIChzdW0yIDw8IDgpOyAgICAgLyogZ2V0IGV2ZW4tc3VtICovCiAgICAgbG9hZDEgPSBsb2FkMSArIHN1bTI7ICAgICAgICAgICAvKiBhZGQgMTYgYml0IGV2ZW4tc3VtIGFuZCBvZGQtc3VtKi8KICAgICBsb2FkMSA9IGxvYWQxICsgKGxvYWQxIDw8IDE2KTsgIC8qIGFkZCB1cHBlciBhbmQgbG93ZXIgMTYgYml0IHN1bSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbW90aW9uX2NvbXAuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbW90aW9uX2NvbXAuY3BwCmluZGV4IGI4MWQyNzguLjlhOTY3YzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21vdGlvbl9jb21wLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tb3Rpb25fY29tcC5jcHAKQEAgLTM2Myw3ICszNjMsNyBAQAogICAgIC8qIGluaXRpYWxpemUgb2Zmc2V0IHRvIGFkanVzdCBwaXhlbCBjb3VudGVyICovCiAgICAgLyogICAgdGhlIG5leHQgcm93OyBmdWxsLXBlbCByZXNvbHV0aW9uICAgICAgKi8KIAotICAgIHRtcCA9IChVTG9uZylwcmV2ICYgMHgzOworICAgIHRtcCA9ICh1aW50cHRyX3QpcHJldiAmIDB4MzsKIAogICAgIGlmICh0bXAgPT0gMCkgIC8qIHdvcmQtYWxpZ25lZCAqLwogICAgIHsKQEAgLTQ2Niw3ICs0NjYsNyBAQAogICAgIC8qIEJyYW5jaCBiYXNlZCBvbiBwaXhlbCBsb2NhdGlvbiAoaGFsZi1wZWwgb3IgZnVsbC1wZWwpIGZvciB4IGFuZCB5ICovCiAgICAgcmVjIC09IDEyOyAvKiBwcmVzZXQgKi8KIAotICAgIHRtcCA9IChVTG9uZylwcmV2ICYgMzsKKyAgICB0bXAgPSAodWludHB0cl90KXByZXYgJiAzOwogICAgIG1hc2sgPSAyNTQ7CiAgICAgbWFzayB8PSAobWFzayA8PCA4KTsKICAgICBtYXNrIHw9IChtYXNrIDw8IDE2KTsgLyogMHhGRUZFRkVGRSAqLwpAQCAtNzkxLDcgKzc5MSw3IEBACiAgICAgLyogQnJhbmNoIGJhc2VkIG9uIHBpeGVsIGxvY2F0aW9uIChoYWxmLXBlbCBvciBmdWxsLXBlbCkgZm9yIHggYW5kIHkgKi8KICAgICByZWMgLT0gMTI7IC8qIHByZXNldCAqLwogCi0gICAgdG1wID0gKFVMb25nKXByZXYgJiAzOworICAgIHRtcCA9ICh1aW50cHRyX3QpcHJldiAmIDM7CiAgICAgbWFzayA9IDI1NDsKICAgICBtYXNrIHw9IChtYXNrIDw8IDgpOwogICAgIG1hc2sgfD0gKG1hc2sgPDwgMTYpOyAvKiAweEZFRkVGRUZFICovCkBAIC0xMTQwLDcgKzExNDAsNyBAQAogICAgIG1hc2sgfD0gKG1hc2sgPDwgOCk7CiAgICAgbWFzayB8PSAobWFzayA8PCAxNik7IC8qIDB4M2YzZjNmM2YgKi8KIAotICAgIHRtcCA9IChVTG9uZylwcmV2ICYgMzsKKyAgICB0bXAgPSAodWludHB0cl90KXByZXYgJiAzOwogCiAgICAgcmVjIC09IDQ7IC8qIHByZXNldCAqLwogCkBAIC0xOTU5LDcgKzE5NTksNyBAQAogICAgICAgICBkc3QgKz0gb2Zmc2V0OwogICAgICAgICBzcmMgKz0gb2Zmc2V0OwogICAgIH0KLSAgICB3aGlsZSAoKFVJbnQpc3JjIDwgKFVJbnQpZW5kKTsKKyAgICB3aGlsZSAoKHVpbnRwdHJfdClzcmMgPCAodWludHB0cl90KWVuZCk7CiAKICAgICByZXR1cm4gOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbXA0ZGVmLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRkZWYuaAppbmRleCAwZDVhM2U4Li4yZDQ0NDgyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRkZWYuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRkZWYuaApAQCAtNjAsNyArNjAsNyBAQAogdHlwZWRlZiBzaG9ydCBTaG9ydDsKIHR5cGVkZWYgc2hvcnQgaW50IFNJbnQ7CiB0eXBlZGVmIHVuc2lnbmVkIGludCBCb29sOwotdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgVUxvbmc7Cit0eXBlZGVmIHVpbnQzMl90IFVMb25nOwogdHlwZWRlZiB2b2lkIFZvaWQ7CiAKICNkZWZpbmUgUFZfQ09ERUNfSU5JVCAgICAgICAwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9zYWRfaW5saW5lLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9zYWRfaW5saW5lLmgKaW5kZXggYmE3N2RmZC4uYjg2NWYyMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvc2FkX2lubGluZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3NhZF9pbmxpbmUuaApAQCAtODUsNyArODUsNyBAQAogCiAgICAgICAgIHg5ID0gMHg4MDgwODA4MDsgLyogY29uc3QuICovCiAKLSAgICAgICAgeDggPSAodWludDMyKXJlZiAmIDB4MzsKKyAgICAgICAgeDggPSAodWludHB0cl90KXJlZiAmIDB4MzsKICAgICAgICAgaWYgKHg4ID09IDMpCiAgICAgICAgICAgICBnb3RvIFNhZE1CT2Zmc2V0MzsKICAgICAgICAgaWYgKHg4ID09IDIpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL0FuZHJvaWQubWsKaW5kZXggMTM1YzcxNS4uODI4NDQ5MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvQW5kcm9pZC5tawpAQCAtNTAsNiArNTAsOCBAQAogTE9DQUxfQ0ZMQUdTIDo9IFwKICAgICAgICAgLURPU0NMX1VOVVNFRF9BUkc9CiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIExPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9tcDNkZWMKIAogTE9DQUxfQVJNX01PREUgOj0gYXJtCkBAIC02OSw2ICs3MSw4IEBACiAgICAgICAgICQoTE9DQUxfUEFUSCkvc3JjIFwKICAgICAgICAgJChMT0NBTF9QQVRIKS9pbmNsdWRlCiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJzdGFnZWZyaWdodF9vbXggbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJ1dGlscyBsaWJsb2cKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAKaW5kZXggMTIyMTE4MS4uNDk0ZDgzZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuY3BwCkBAIC00OSw2ICs0OSw4IEBACiAgICAgICBtTnVtQ2hhbm5lbHMoMiksCiAgICAgICBtU2FtcGxpbmdSYXRlKDQ0MTAwKSwKICAgICAgIG1TaWduYWxsZWRFcnJvcihmYWxzZSksCisgICAgICBtU2F3SW5wdXRFb3MoZmFsc2UpLAorICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyhmYWxzZSksCiAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlKE5PTkUpIHsKICAgICBpbml0UG9ydHMoKTsKICAgICBpbml0RGVjb2RlcigpOwpAQCAtMjMwLDcgKzIzMiw3IEBACiAgICAgfQogfQogCi12b2lkIFNvZnRNUDM6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKK3ZvaWQgU29mdE1QMzo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIC8qIHBvcnRJbmRleCAqLykgewogICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSAhPSBOT05FKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0yMzgsNTAgKzI0MCwzNiBAQAogICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmaW5RdWV1ZSA9IGdldFBvcnRRdWV1ZSgwKTsKICAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDEpOwogCi0gICAgd2hpbGUgKCFpblF1ZXVlLmVtcHR5KCkgJiYgIW91dFF1ZXVlLmVtcHR5KCkpIHsKLSAgICAgICAgQnVmZmVySW5mbyAqaW5JbmZvID0gKmluUXVldWUuYmVnaW4oKTsKLSAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmluSGVhZGVyID0gaW5JbmZvLT5tSGVhZGVyOworICAgIHdoaWxlICgoIWluUXVldWUuZW1wdHkoKSB8fCAobVNhd0lucHV0RW9zICYmICFtU2lnbmFsbGVkT3V0cHV0RW9zKSkgJiYgIW91dFF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgQnVmZmVySW5mbyAqaW5JbmZvID0gTlVMTDsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmluSGVhZGVyID0gTlVMTDsKKyAgICAgICAgaWYgKCFpblF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGluSW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7CisgICAgICAgICAgICBpbkhlYWRlciA9IGluSW5mby0+bUhlYWRlcjsKKyAgICAgICAgfQogCiAgICAgICAgIEJ1ZmZlckluZm8gKm91dEluZm8gPSAqb3V0UXVldWUuYmVnaW4oKTsKICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7CisgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gMDsKIAotICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgewotICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOwotICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOwotCi0gICAgICAgICAgICBpZiAoIW1Jc0ZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgLy8gcGFkIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSB3aXRoIDUyOSBzYW1wbGVzLCBzaW5jZSB0aGF0IG1hbnkgc2FtcGxlcwotICAgICAgICAgICAgICAgIC8vIHdlcmUgdHJpbW1lZCBvZmYgdGhlIGJlZ2lubmluZyB3aGVuIGRlY29kaW5nIHN0YXJ0ZWQKLSAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPQotICAgICAgICAgICAgICAgICAgICBrUFZNUDNEZWNvZGVyRGVsYXkgKiBtTnVtQ2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIW1lbXNldFNhZmUob3V0SGVhZGVyLCAwLCBvdXRIZWFkZXItPm5GaWxsZWRMZW4pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFNpbmNlIHdlIG5ldmVyIGRpc2NhcmRlZCBmcmFtZXMgZnJvbSB0aGUgc3RhcnQsIHdlIHdvbid0IGhhdmUKLSAgICAgICAgICAgICAgICAvLyB0byBhZGQgYW55IHBhZGRpbmcgYXQgdGhlIGVuZCBlaXRoZXIuCi0gICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gMDsKKyAgICAgICAgaWYgKGluSGVhZGVyKSB7CisgICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5PZmZzZXQgPT0gMCAmJiBpbkhlYWRlci0+bkZpbGxlZExlbikgeworICAgICAgICAgICAgICAgIG1BbmNob3JUaW1lVXMgPSBpbkhlYWRlci0+blRpbWVTdGFtcDsKKyAgICAgICAgICAgICAgICBtTnVtRnJhbWVzT3V0cHV0ID0gMDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7CisgICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgeworICAgICAgICAgICAgICAgIG1TYXdJbnB1dEVvcyA9IHRydWU7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOwotICAgICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwotICAgICAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKLSAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIG1Db25maWctPnBJbnB1dEJ1ZmZlciA9CisgICAgICAgICAgICAgICAgaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKKworICAgICAgICAgICAgbUNvbmZpZy0+aW5wdXRCdWZmZXJDdXJyZW50TGVuZ3RoID0gaW5IZWFkZXItPm5GaWxsZWRMZW47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQ29uZmlnLT5wSW5wdXRCdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgbUNvbmZpZy0+aW5wdXRCdWZmZXJDdXJyZW50TGVuZ3RoID0gMDsKICAgICAgICAgfQotCi0gICAgICAgIGlmIChpbkhlYWRlci0+bk9mZnNldCA9PSAwKSB7Ci0gICAgICAgICAgICBtQW5jaG9yVGltZVVzID0gaW5IZWFkZXItPm5UaW1lU3RhbXA7Ci0gICAgICAgICAgICBtTnVtRnJhbWVzT3V0cHV0ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIG1Db25maWctPnBJbnB1dEJ1ZmZlciA9Ci0gICAgICAgICAgICBpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0OwotCi0gICAgICAgIG1Db25maWctPmlucHV0QnVmZmVyQ3VycmVudExlbmd0aCA9IGluSGVhZGVyLT5uRmlsbGVkTGVuOwogICAgICAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlck1heExlbmd0aCA9IDA7CiAgICAgICAgIG1Db25maWctPmlucHV0QnVmZmVyVXNlZExlbmd0aCA9IDA7CiAKQEAgLTMxNiwxMyArMzA0LDMwIEBACiAgICAgICAgICAgICAgICAgbUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplID0ga091dHB1dEJ1ZmZlclNpemUgLyBzaXplb2YoaW50MTZfdCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIFRoaXMgaXMgcmVjb3ZlcmFibGUsIGp1c3QgaWdub3JlIHRoZSBjdXJyZW50IGZyYW1lIGFuZAotICAgICAgICAgICAgLy8gcGxheSBzaWxlbmNlIGluc3RlYWQuCi0gICAgICAgICAgICBpZiAoIW1lbXNldFNhZmUob3V0SGVhZGVyLCAwLCBtQ29uZmlnLT5vdXRwdXRGcmFtZVNpemUgKiBzaXplb2YoaW50MTZfdCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRlY29kZXJFcnIgPT0gTk9fRU5PVUdIX01BSU5fREFUQV9FUlJPUiAmJiBtU2F3SW5wdXRFb3MpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1Jc0ZpcnN0KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHBhZCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gd2l0aCA1Mjkgc2FtcGxlcywgc2luY2UgdGhhdCBtYW55IHNhbXBsZXMKKyAgICAgICAgICAgICAgICAgICAgLy8gd2VyZSB0cmltbWVkIG9mZiB0aGUgYmVnaW5uaW5nIHdoZW4gZGVjb2Rpbmcgc3RhcnRlZAorICAgICAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5PZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSBrUFZNUDNEZWNvZGVyRGVsYXkgKiBtTnVtQ2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCk7CiAKLSAgICAgICAgICAgIG1Db25maWctPmlucHV0QnVmZmVyVXNlZExlbmd0aCA9IGluSGVhZGVyLT5uRmlsbGVkTGVuOworICAgICAgICAgICAgICAgICAgICBpZiAoIW1lbXNldFNhZmUob3V0SGVhZGVyLCAwLCBvdXRIZWFkZXItPm5GaWxsZWRMZW4pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgcmVjb3ZlcmFibGUsIGp1c3QgaWdub3JlIHRoZSBjdXJyZW50IGZyYW1lIGFuZAorICAgICAgICAgICAgICAgIC8vIHBsYXkgc2lsZW5jZSBpbnN0ZWFkLgorICAgICAgICAgICAgICAgIGlmICghbWVtc2V0U2FmZShvdXRIZWFkZXIsIDAsIG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSAqIHNpemVvZihpbnQxNl90KSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChpbkhlYWRlcikgeworICAgICAgICAgICAgICAgICAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGggPSBpbkhlYWRlci0+bkZpbGxlZExlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAobUNvbmZpZy0+c2FtcGxpbmdSYXRlICE9IG1TYW1wbGluZ1JhdGUKICAgICAgICAgICAgICAgICB8fCBtQ29uZmlnLT5udW1fY2hhbm5lbHMgIT0gbU51bUNoYW5uZWxzKSB7CiAgICAgICAgICAgICBtU2FtcGxpbmdSYXRlID0gbUNvbmZpZy0+c2FtcGxpbmdSYXRlOwpAQCAtMzQzLDcgKzM0OCw3IEBACiAKICAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9CiAgICAgICAgICAgICAgICAgbUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplICogc2l6ZW9mKGludDE2X3QpIC0gb3V0SGVhZGVyLT5uT2Zmc2V0OwotICAgICAgICB9IGVsc2UgeworICAgICAgICB9IGVsc2UgaWYgKCFtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CiAgICAgICAgICAgICBvdXRIZWFkZXItPm5PZmZzZXQgPSAwOwogICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gbUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplICogc2l6ZW9mKGludDE2X3QpOwogICAgICAgICB9CkBAIC0zNTIsMjMgKzM1NywyNCBAQAogICAgICAgICAgICAgbUFuY2hvclRpbWVVcwogICAgICAgICAgICAgICAgICsgKG1OdW1GcmFtZXNPdXRwdXQgKiAxMDAwMDAwbGwpIC8gbUNvbmZpZy0+c2FtcGxpbmdSYXRlOwogCi0gICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gMDsKKyAgICAgICAgaWYgKGluSGVhZGVyKSB7CisgICAgICAgICAgICBDSEVDS19HRShpbkhlYWRlci0+bkZpbGxlZExlbiwgbUNvbmZpZy0+aW5wdXRCdWZmZXJVc2VkTGVuZ3RoKTsKIAotICAgICAgICBDSEVDS19HRShpbkhlYWRlci0+bkZpbGxlZExlbiwgbUNvbmZpZy0+aW5wdXRCdWZmZXJVc2VkTGVuZ3RoKTsKKyAgICAgICAgICAgIGluSGVhZGVyLT5uT2Zmc2V0ICs9IG1Db25maWctPmlucHV0QnVmZmVyVXNlZExlbmd0aDsKKyAgICAgICAgICAgIGluSGVhZGVyLT5uRmlsbGVkTGVuIC09IG1Db25maWctPmlucHV0QnVmZmVyVXNlZExlbmd0aDsKIAotICAgICAgICBpbkhlYWRlci0+bk9mZnNldCArPSBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGg7Ci0gICAgICAgIGluSGVhZGVyLT5uRmlsbGVkTGVuIC09IG1Db25maWctPmlucHV0QnVmZmVyVXNlZExlbmd0aDsKKworICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuID09IDApIHsKKyAgICAgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICAgICAgaW5JbmZvID0gTlVMTDsKKyAgICAgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworICAgICAgICAgICAgICAgIGluSGVhZGVyID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCiAgICAgICAgIG1OdW1GcmFtZXNPdXRwdXQgKz0gbUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplIC8gbU51bUNoYW5uZWxzOwogCi0gICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA9PSAwKSB7Ci0gICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKLSAgICAgICAgICAgIGluSW5mbyA9IE5VTEw7Ci0gICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOwotICAgICAgICAgICAgaW5IZWFkZXIgPSBOVUxMOwotICAgICAgICB9Ci0KICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwogICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKICAgICAgICAgb3V0SW5mbyA9IE5VTEw7CkBAIC0zODMsNiArMzg5LDkgQEAKICAgICAgICAgLy8gZGVwZW5kIG9uIGZyYWdtZW50cyBmcm9tIHRoZSBsYXN0IG9uZSBkZWNvZGVkLgogICAgICAgICBwdm1wM19Jbml0RGVjb2RlcihtQ29uZmlnLCBtRGVjb2RlckJ1Zik7CiAgICAgICAgIG1Jc0ZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgICAgIG1TYXdJbnB1dEVvcyA9IGZhbHNlOworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CiAgICAgfQogfQogCkBAIC00MTYsNiArNDI1LDggQEAKICAgICBwdm1wM19Jbml0RGVjb2RlcihtQ29uZmlnLCBtRGVjb2RlckJ1Zik7CiAgICAgbUlzRmlyc3QgPSB0cnVlOwogICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TYXdJbnB1dEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gTk9ORTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuaAppbmRleCAzZTMwNDk4Li4zYmZhNmM3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuaApAQCAtNjEsNiArNjEsOCBAQAogCiAgICAgYm9vbCBtSXNGaXJzdDsKICAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBib29sIG1TYXdJbnB1dEVvczsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CiAKICAgICBlbnVtIHsKICAgICAgICAgTk9ORSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19kY3RfOV9hcm0ucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19kY3RfOV9hcm0ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E2ZGQ0Zi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9hc20vcHZtcDNfZGN0XzlfYXJtLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KLTsKLTsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ci07ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ci07IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotOyBleHByZXNzIG9yIGltcGxpZWQuCi07IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucwotOyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotOwotOwotOyAgIEZpbGVuYW1lOiBwdm1wM19kY3RfOS5zCi07Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJFVklTSU9OIEhJU1RPUlkKLTsKLTsKLTsgV2hvOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZTogTU0vREQvWVlZWQotOyBEZXNjcmlwdGlvbjogCi07Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgQVJFQSAgfC5kcmVjdHZlfCwgRFJFQ1RWRQotCi0gICAgRENCICItZGVmYXVsdGxpYjpjb3JlZGxsLmxpYiAiCi0gICAgRENCICItZGVmYXVsdGxpYjpjb3JlbGliYy5saWIgIgotCi0gIElNUE9SVCBwdm1wM19tZGN0XzE4IDsgcHZtcDNfbWRjdF8xOC5jcHAKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIEFSRUEgIHwucmRhdGF8LCBEQVRBLCBSRUFET05MWQotICAlIDQKLQotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgQVJFQSAgfC50ZXh0fCwgQ09ERSwgUkVBRE9OTFkKLQotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSBFWFBPUlQgfHB2bXAzX2RjdF85fAotCi18cHZtcDNfZGN0Xzl8IFBST0MKLSAgICAgICAgc3RtZmQgICAgc3AhLHtyNC1yMTAsbHJ9Ci0gICAgICAgIGxkciAgICAgIHIyLCBbcjAsICMweDIwXQotICAgICAgICBsZHIgICAgICByMywgW3IwXQotICAgICAgICBsZHIgICAgICByMTIsW3IwLCAjNF0KLSAgICAgICAgYWRkICAgICAgcjEscjIscjMKLSAgICAgICAgc3ViICAgICAgbHIscjIscjMKLSAgICAgICAgbGRyICAgICAgcjMsW3IwLCAjMHgxY10KLSAgICAgICAgbGRyICAgICAgcjQsW3IwLCAjMHgxOF0KLSAgICAgICAgYWRkICAgICAgcjIscjMscjEyCi0gICAgICAgIGxkciAgICAgIHI1LFtyMCwjOF0KLSAgICAgICAgc3ViICAgICAgcjMscjMscjEyCi0gICAgICAgIGFkZCAgICAgIHIxMixyNCxyNQotICAgICAgICBzdWIgICAgICByNCxyNCxyNQotICAgICAgICBsZHIgICAgICByNSxbcjAsICMweDE0XQotICAgICAgICBsZHIgICAgICByNyxbcjAsICMweGNdCi0gICAgICAgIGxkciAgICAgIHI5LFtyMCwgIzB4MTBdCi0gICAgICAgIGFkZCAgICAgIHI2LHI1LHI3Ci0gICAgICAgIHN1YiAgICAgIHI1LHI1LHI3Ci0gICAgICAgIGFkZCAgICAgIHI3LHIxLHIxMgotICAgICAgICBhZGQgICAgICByOCxyOSxyMgotICAgICAgICBhZGQgICAgICByNyxyNyxyNgotICAgICAgICBhZGQgICAgICByMTAscjcscjgKLSAgICAgICAgcnNiICAgICAgcjcscjgscjcsYXNyICMxCi0gICAgICAgIHN0ciAgICAgIHI3LFtyMCwgIzB4MThdCi0gICAgICAgIHJzYiAgICAgIHIyLHI5LHIyLGFzciAjMQotICAgICAgICBzdHIgICAgICByMTAsW3IwXQotICAgICAgICBsZHIgICAgICByMTEsfGNvc18ycGlfOXwKLSAgICAgICAgcnNiICAgICAgcjcscjIsIzAKLQotICAgICAgICBtb3YgICAgICByOSxyMSxsc2wgIzEKLQkJbW92ICAgICAgcjEscjkJCQk7Ozs7OzsgICEhISEhIQotICAgICAgICBtb3YgICAgICByOCxyNwotCi07ICAgIHZlY1s0XSAgPSBmeHBfbWFjMzJfUTMyKCB2ZWNbNF0sIHRtcDA8PDEsIGNvc18ycGlfOSk7IAotCi0gICAgICAgIHNtbGFsICAgIHIxLHI4LHIxMSxyOQotICAgICAgICBsZHIgICAgICByMTAsfGNvc180cGlfOXwKLSAgICAgICAgbGRyICAgICAgcjExLHxjb3NfcGlfOXwKLQotOyAgICB2ZWNbOF0gID0gZnhwX21hYzMyX1EzMiggdmVjWzhdLCB0bXAwPDwxLCBjb3NfNHBpXzkpOwotCi0gICAgICAgIHNtbGFsICAgIHIxLHI3LHIxMCxyOQotCi0KLQotOyAgICB2ZWNbMl0gID0gZnhwX21hYzMyX1EzMiggdmVjWzJdLCB0bXAwPDwxLCBjb3NfcGlfOSk7Ci0KLSAgICAgICAgc21sYWwgICAgcjkscjIscjExLHI5Ci0gICAgICAgIG1vdiAgICAgIHIxLHIxMixsc2wgIzEKLSAgICAgICAgcnNiICAgICAgcjkscjEwLCMwCi0gICAgICAgIGxkciAgICAgIHIxMSx8Y29zXzVwaV85fAotCi0gICAgICAgIHNtbGFsICAgIHIxMixyMixyOSxyMQotCi0KLQotOyAgICB2ZWNbMl0gID0gZnhwX21hYzMyX1EzMiggdmVjWzJdLCB0bXAyPDwxLCBjb3NfNXBpXzkpOwotCi0gICAgICAgIGxkciAgICAgIHI5LHxjb3NfMnBpXzl8Ci0gICAgICAgIG1vdiAgICAgIHIxMixyMQkJCTs7Ozs7OyAgISEhISEhCi0gICAgICAgIHNtbGFsICAgIHIxMixyOCxyMTEscjEKLQotCi07ICAgIHZlY1s4XSAgPSBmeHBfbWFjMzJfUTMyKCB2ZWNbOF0sIHRtcDI8PDEsIGNvc18ycGlfOSk7Ci0KLSAgICAgICAgc21sYWwgICAgcjEscjcscjkscjEKLSAgICAgICAgbW92ICAgICAgcjEscjYsbHNsICMxCi0gICAgICAgIHNtbGFsICAgIHIxMixyNyxyMTEscjEKLSAgICAgICAgYW5kICAgICAgcjYscjEwLHIxMSxhc3IgIzE0Ci0gICAgICAgIHNtbGFsICAgIHIxMixyOCxyNixyMQotICAgICAgICBsZHIgICAgICByMTAsfGNvc18xMXBpXzE4fAotICAgICAgICBhZGQgICAgICByMTIscjExLHI2Ci0gICAgICAgIHNtbGFsICAgIHIxLHIyLHIxMixyMQotICAgICAgICBsZHIgICAgICByOSx8Y29zXzhwaV85fAotICAgICAgICBzdHIgICAgICByMixbcjAsIzhdCi0gICAgICAgIG1vdiAgICAgIHIxLHI1LGxzbCAjMQotCi07ICAgIHZlY1s4XSAgPSBmeHBfbWFjMzJfUTMyKCB2ZWNbOF0sIHRtcDM8PDEsIGNvc184cGlfOSk7Ci0KLSAgICAgICAgc211bGwgICAgcjIscjYscjkscjEKLSAgICAgICAgc3RyICAgICAgcjcsW3IwLCMweDIwXQotICAgICAgICBtb3YgICAgICByMixyNCxsc2wgIzEKLSAgICAgICAgbGRyICAgICAgcjcsfGNvc18xM3BpXzE4fAotICAgICAgICBzbWxhbCAgICByMTIscjYscjEwLHIyCi0KLSAgICAgICAgbW92ICAgICAgcjMscjMsbHNsICMxCi0KLTsgICAgdmVjWzVdICA9IGZ4cF9tYWMzMl9RMzIoIHZlY1s1XSwgdG1wODw8MSwgY29zXzEzcGlfMTgpOwotCi0gICAgICAgIHNtbGFsICAgIHIxMixyNixyNyxyMwotICAgICAgICBhZGQgICAgICByNCxyNSxyNAotICAgICAgICBtb3YgICAgICByMTIsbHIsbHNsICMxCi0gICAgICAgIHN1YiAgICAgIGxyLHI0LGxyCi0gICAgICAgIGxkciAgICAgIHI3LHxjb3NfMTdwaV8xOHwKLSAgICAgICAgc3RyICAgICAgcjgsW3IwLCAjMHgxMF0KLSAgICAgICAgbGRyICAgICAgcjQsfGNvc19waV82fAotCi0gICAgICAgIG1vdiAgICAgIGxyLGxyLGxzbCAjMQotCi07ICAgIHZlY1sxXSAgPSBmeHBfbWFjMzJfUTMyKCB2ZWNbMV0sIHRtcDg8PDEsIGNvc18xN3BpXzE4KTsKLQotICAgICAgICBzbWxhbCAgICByOCxyNixyNyxyMTIKLQotOyAgICB2ZWNbM10gID0gZnhwX211bDMyX1EzMigodG1wNSArIHRtcDYgIC0gdG1wOCk8PDEsIGNvc19waV82KTsKLQotICAgICAgICBzbXVsbCAgICByNSxscixyNCxscgotICAgICAgICBzdHIgICAgICByNixbcjAsICM0XQotICAgICAgICBzdHIgICAgICBscixbcjAsICMweGNdCi0KLQotOyAgICB2ZWNbNV0gID0gZnhwX211bDMyX1EzMih0bXA1PDwxLCBjb3NfMTdwaV8xOCk7Ci0gICAgICAgIHNtdWxsICAgIHI1LGxyLHI3LHIxCi0gICAgICAgIHJzYiAgICAgIHI2LHI5LCMwCi07ICAgIHZlY1s1XSAgPSBmeHBfbWFjMzJfUTMyKCB2ZWNbNV0sIHRtcDY8PDEsICBjb3NfN3BpXzE4KTsKLSAgICAgICAgc21sYWwgICAgcjUsbHIscjYscjIKLTsgICAgdmVjWzVdICA9IGZ4cF9tYWMzMl9RMzIoIHZlY1s1XSwgdG1wNzw8MSwgICAgY29zX3BpXzYpOwotICAgICAgICBzbWxhbCAgICByNSxscixyNCxyMwotOyAgICB2ZWNbNV0gID0gZnhwX21hYzMyX1EzMiggdmVjWzVdLCB0bXA4PDwxLCBjb3NfMTNwaV8xOCk7Ci0gICAgICAgIHNtbGFsICAgIHI1LGxyLHIxMCxyMTIKLSAgICAgICAgc3RyICAgICAgbHIsW3IwLCAjMHgxNF0KLSAgICAgICAgcnNiICAgICAgbHIscjEwLCMwCi0KLTsgICAgdmVjWzddICA9IGZ4cF9tdWwzMl9RMzIodG1wNTw8MSwgY29zXzVwaV8xOCk7Ci0gICAgICAgIHNtdWxsICAgIHI1LHIxLGxyLHIxCi07ICAgIHZlY1s3XSAgPSBmeHBfbWFjMzJfUTMyKCB2ZWNbN10sIHRtcDY8PDEsIGNvc18xN3BpXzE4KTsKLSAgICAgICAgc21sYWwgICAgcjIscjEscjcscjIKLTsgICAgdmVjWzddICA9IGZ4cF9tYWMzMl9RMzIoIHZlY1s3XSwgdG1wNzw8MSwgICAgY29zX3BpXzYpOwotICAgICAgICBzbWxhbCAgICByMyxyMSxyNCxyMwotOyAgICB2ZWNbN10gID0gZnhwX21hYzMyX1EzMiggdmVjWzddLCB0bXA4PDwxLCBjb3NfMTFwaV8xOCk7Ci0gICAgICAgIHNtbGFsICAgIHIxMixyMSxyOSxyMTIKLSAgICAgICAgc3RyICAgICAgcjEsW3IwLCAjMHgxY10KLSAgICAgICAgbGRtZmQgICAgc3AhLHtyNC1yMTAscGN9Ci18Y29zXzJwaV85fAotICAgICAgICBEQ0QgICAgICAweDYyMGRiZTgwCi18Y29zXzRwaV85fAotICAgICAgICBEQ0QgICAgICAweDE2M2ExYTgwCi18Y29zX3BpXzl8Ci0gICAgICAgIERDRCAgICAgIDB4Nzg0N2Q5MDAKLXxjb3NfNXBpXzl8Ci0gICAgICAgIERDRCAgICAgIDB4ODdiODI3MDAKLXxjb3NfOHBpXzl8Ci0gICAgICAgIERDRCAgICAgIDB4ZDQzOGFmMDAKLXxjb3NfMTFwaV8xOHwKLSAgICAgICAgRENEICAgICAgMHhhZGI5MjI4MAotfGNvc18xM3BpXzE4fAotICAgICAgICBEQ0QgICAgICAweDkxMjYxNDgwCi18Y29zXzE3cGlfMTh8Ci0gICAgICAgIERDRCAgICAgIDB4ODFmMWQyMDAKLXxjb3NfcGlfNnwKLSAgICAgICAgRENEICAgICAgMHg2ZWQ5ZWI4MAotICAgICAgICBFTkRQCi0KLQotCi0KLQotICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19tZGN0XzE4X2FybS5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX21kY3RfMThfYXJtLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MDFkOGMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX21kY3RfMThfYXJtLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNjkgKzAsMCBAQAotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KLTsKLTsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ci07ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ci07IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotOyBleHByZXNzIG9yIGltcGxpZWQuCi07IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucwotOyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotOwotOwotOyAgIEZpbGVuYW1lOiBwdm1wM19kY3RfMTgucwotOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSRVZJU0lPTiBISVNUT1JZCi07Ci07Ci07IFdobzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGU6IE1NL0REL1lZWVkKLTsgRGVzY3JpcHRpb246IAotOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIEVYUE9SVCBwdm1wM19tZGN0XzE4Ci0KLSAgICAgICAgSU1QT1JUIHx8TGliJCRSZXF1ZXN0JCRhcm1saWJ8fCBbV0VBS10KLSAgICAgICAgSU1QT1JUIHx8TGliJCRSZXF1ZXN0JCRjcHBsaWJ8fCBbV0VBS10KLSAgICAgICAgSU1QT1JUIHB2bXAzX2RjdF85Ci0KLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gQVJFQSB8LnRleHR8LCBDT0RFLCBSRUFET05MWSwgQUxJR049MgotCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfHB2bXAzX21kY3RfMTh8IFBST0MKLSAgICAgICAgc3RtZmQgICAgc3AhLHtyNC1yMTAsbHJ9Ci0gICAgICAgIG1vdiAgICAgIHI3LHIyCi0gICAgICAgIGxkciAgICAgIHIyLHRhYmxlCi0gICAgICAgIG1vdiAgICAgIHI2LHIxCi0gICAgICAgIGFkZCAgICAgIHIzLHIyLCMweDI0Ci0gICAgICAgIGFkZCAgICAgIHIxMixyMywjMHg0NAotICAgICAgICBhZGQgICAgICByMSxyMCwjMHg0NAotICAgICAgICBtb3YgICAgICByNSxyMAotCi07ICAgIGZvciAoIGk9OTsgaSE9MDsgaS0tKQotOyAgICB7Ci0KLSAgICAgICAgbW92ICAgICAgcjQsIzkKLUxvb3BfMQotCi07ICAgICAgIHRtcCAgPSAqKHB0X3ZlYyk7Ci07CQl0bXAxID0gKihwdF92ZWNfbyk7Ci0KLSAgICAgICAgbGRyICAgICAgbHIsW3IwXQkJOzsgdG1wICA9PSBscgotICAgICAgICBsZHIgICAgICByOCxbcjNdLCM0CQk7OyB0bXAxID09IHI4Ci0KLTsgICAgICAgIHRtcCAgPSBmeHBfbXVsMzJfUTMyKCB0bXA8PDEsICAqKHB0X2NvcysrICApKTsKLTsgICAgICAgIHRtcDEgPSBmeHBfbXVsMzJfUTI3KCB0bXAxLCAqKHB0X2Nvc194LS0pKTsKLQotICAgICAgICBtb3YgICAgICBscixscixsc2wgIzEKLSAgICAgICAgc211bGwgICAgcjEwLGxyLHI4LGxyCi0gICAgICAgIGxkciAgICAgIHI4LFtyMTJdLCMtNAotICAgICAgICBsZHIgICAgICByOSxbcjFdCi0gICAgICAgIHN1YnMgICAgIHI0LHI0LCMxCi0gICAgICAgIHNtdWxsICAgIHI5LHIxMCxyOCxyOQotICAgICAgICBtb3YgICAgICByOCxyOSxsc3IgIzI3Ci0gICAgICAgIGFkZCAgICAgIHI4LHI4LHIxMCxsc2wgIzUKLQotOyAgICAgICAgKihwdF92ZWMrKykgICA9ICAgdG1wICsgdG1wMSA7Ci07ICAgICAgICAqKHB0X3ZlY19vLS0pID0gZnhwX211bDMyX1EyOCggKHRtcCAtIHRtcDEpLCAqKHB0X2Nvc19zcGxpdCsrKSk7Ci0KLSAgICAgICAgYWRkICAgICAgcjksbHIscjgKLSAgICAgICAgc3ViICAgICAgcjgsbHIscjgKLSAgICAgICAgbGRyICAgICAgbHIsW3IyXSwjNAotICAgICAgICBzdHIgICAgICByOSxbcjBdLCM0Ci0gICAgICAgIHNtdWxsICAgIHI4LHI5LGxyLHI4Ci0gICAgICAgIG1vdiAgICAgIGxyLHI4LGxzciAjMjgKLSAgICAgICAgYWRkICAgICAgbHIsbHIscjksbHNsICM0Ci0gICAgICAgIHN0ciAgICAgIGxyLFtyMV0sIy00Ci0gICAgICAgIGJuZSAgICAgIExvb3BfMQotCi07CQl9Ci0KLSAgICAgICAgbW92ICAgICAgcjAscjUJCQk7OyByMCA9IHZlYwotICAgICAgICBibCAgICAgICBwdm1wM19kY3RfOQotICAgICAgICBhZGQgICAgICByMCxyNSwjMHgyNAk7OyByMCA9ICZ2ZWNbOV0KLSAgICAgICAgYmwgICAgICAgcHZtcDNfZGN0XzkKLQotICAgICAgICBsZHIgICAgICByMCxbcjUsIzB4MjBdCi0gICAgICAgIGxkciAgICAgIHIyLFtyNSwjMHg0MF0KLSAgICAgICAgc3RyICAgICAgcjAsW3I1LCMweDQwXQotICAgICAgICBsZHIgICAgICByMCxbcjUsIzB4MWNdCi0gICAgICAgIGxkciAgICAgIHIzLFtyNSwjMHgzOF0KLSAgICAgICAgc3RyICAgICAgcjAsW3I1LCMweDM4XQotICAgICAgICBsZHIgICAgICByMSxbcjUsIzB4MThdCi0gICAgICAgIGxkciAgICAgIHIwLFtyNSwjMHgzMF0KLSAgICAgICAgc3RyICAgICAgcjEsW3I1LCMweDMwXQotICAgICAgICBsZHIgICAgICByMTIsW3I1LCMweDE0XQotICAgICAgICBsZHIgICAgICByMSxbcjUsIzB4MjhdCi0gICAgICAgIHN0ciAgICAgIHIxMixbcjUsIzB4MjhdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjUsIzB4MTBdCi0gICAgICAgIHN0ciAgICAgIHIxMixbcjUsIzB4MjBdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjUsIzB4Y10KLSAgICAgICAgc3RyICAgICAgcjEyLFtyNSwjMHgxOF0KLSAgICAgICAgbGRyICAgICAgcjEyLFtyNSwjOF0KLSAgICAgICAgc3RyICAgICAgcjEyLFtyNSwjMHgxMF0KLSAgICAgICAgbGRyICAgICAgcjEyLFtyNSwjNF0KLSAgICAgICAgc3RyICAgICAgcjEyLFtyNSwjOF0KLSAgICAgICAgbGRyICAgICAgcjEyLFtyNSwjMHgyNF0KLSAgICAgICAgc3ViICAgICAgcjEyLHIxMixyMQotICAgICAgICBzdHIgICAgICByMTIsW3I1LCM0XQotICAgICAgICBsZHIgICAgICByMTIsW3I1LCMweDJjXQotICAgICAgICBzdWIgICAgICByMSxyMTIscjEKLSAgICAgICAgc3RyICAgICAgcjEsW3I1LCMweGNdCi0gICAgICAgIHN1YiAgICAgIHIxLHIxMixyMAotICAgICAgICBzdHIgICAgICByMSxbcjUsIzB4MTRdCi0gICAgICAgIGxkciAgICAgIHIxLFtyNSwjMHgzNF0KLSAgICAgICAgc3ViICAgICAgcjAscjEscjAKLSAgICAgICAgc3RyICAgICAgcjAsW3I1LCMweDFjXQotICAgICAgICBzdWIgICAgICByMCxyMSxyMwotICAgICAgICBzdHIgICAgICByMCxbcjUsIzB4MjRdCi0gICAgICAgIGxkciAgICAgIHIxLFtyNSwjMHgzY10KLSAgICAgICAgc3ViICAgICAgcjMscjEscjMKLSAgICAgICAgc3ViICAgICAgcjEscjEscjIKLSAgICAgICAgc3RyICAgICAgcjEsW3I1LCMweDM0XQotICAgICAgICBzdHIgICAgICByMyxbcjUsIzB4MmNdCi0gICAgICAgIGxkciAgICAgIHIxLFtyNSwjMHg0NF0KLSAgICAgICAgc3ViICAgICAgcjEscjEscjIKLSAgICAgICAgc3RyICAgICAgcjEsW3I1LCMweDNjXQotICAgICAgICBsZHIgICAgICByMTIsW3I1LCMwXQotCi1Mb29wXzIKLSAgICAgICAgYWRkICAgICAgcjEscjUscjQsbHNsICMyCi0gICAgICAgIGxkciAgICAgIHIyLFtyMSwjMHgyOF0KLSAgICAgICAgbGRyICAgICAgcjMsW3I2LHI0LGxzbCAjMl0KLSAgICAgICAgYWRkICAgICAgcjAscjAscjIKLSAgICAgICAgc3RyICAgICAgcjAsW3IxLCMweDI4XQotICAgICAgICBsZHIgICAgICBscixbcjcscjQsbHNsICMyXQotICAgICAgICBsZHIgICAgICByMSxbcjEsIzRdCi0gICAgICAgIHNtbGFsICAgIHIwLHIzLGxyLHIwCi0gICAgICAgIG1vdiAgICAgIHIwLHIyCi0gICAgICAgIGFkZCAgICAgIHIyLHIxMixyMQotICAgICAgICByc2IgICAgICByMixyMiwjMAotICAgICAgICBzdHIgICAgICByMyxbcjUscjQsbHNsICMyXQotICAgICAgICBzdHIgICAgICByMixbcjYscjQsbHNsICMyXQotICAgICAgICBhZGQgICAgICByNCxyNCwjMQotICAgICAgICBjbXAgICAgICByNCwjNgotICAgICAgICBtb3YgICAgICByMTIscjEKLQotICAgICAgICBibHQgICAgICBMb29wXzIKLQotICAgICAgICBsZHIgICAgICByMSxbcjUsIzB4NDBdCi0gICAgICAgIGxkciAgICAgIHIyLFtyNiwjMHgxOF0KLSAgICAgICAgYWRkICAgICAgcjMscjAscjEKLSAgICAgICAgc3RyICAgICAgcjMsW3I1LCMweDQwXQotICAgICAgICBsZHIgICAgICBscixbcjcscjQsbHNsICMyXQotICAgICAgICBtb3YgICAgICByMyxyMyxsc2wgIzEKLSAgICAgICAgbGRyICAgICAgcjAsW3I1LCMweDFjXQotICAgICAgICBzbWxhbCAgICByMyxyMixscixyMwotICAgICAgICBhZGQgICAgICByMyxyMTIscjAKLSAgICAgICAgc3RyICAgICAgcjIsW3I1LCMweDE4XQotICAgICAgICBsZHIgICAgICByMixbcjYsIzB4MWNdCi0gICAgICAgIHJzYiAgICAgIHIzLHIzLCMwCi0gICAgICAgIHN0ciAgICAgIHIzLFtyNiwjMHgxOF0KLSAgICAgICAgbGRyICAgICAgcjMsW3I1LCMweDIwXQotICAgICAgICBhZGQgICAgICByMCxyMyxyMAotICAgICAgICByc2IgICAgICByMCxyMCwjMAotICAgICAgICBzdHIgICAgICByMCxbcjYsIzB4MWNdCi0gICAgICAgIGxkciAgICAgIHIzLFtyNSwjMHg0NF0KLSAgICAgICAgbGRyICAgICAgcjAsW3I2LCMweDIwXQotICAgICAgICBhZGQgICAgICByMyxyMyxyMQotICAgICAgICBtb3YgICAgICByMSxyMgotICAgICAgICBsZHIgICAgICByMTAsW3I3LCMweDFjXQotICAgICAgICBtb3YgICAgICByMixyMyxsc2wgIzEKLSAgICAgICAgc21sYWwgICAgcjEyLHIxLHIxMCxyMgotICAgICAgICBzdHIgICAgICByMSxbcjUsIzB4MWNdCi0gICAgICAgIGxkciAgICAgIHIxLFtyNSwjMHgyMF0KLSAgICAgICAgbGRyICAgICAgcjMsW3I1LCMweDI0XQotICAgICAgICBhZGQgICAgICByMSxyMSxyMwotICAgICAgICByc2IgICAgICByMSxyMSwjMAotICAgICAgICBzdHIgICAgICByMSxbcjYsIzB4MjBdCi0gICAgICAgIGxkciAgICAgIHIxLFtyNSwjMHg0NF0KLSAgICAgICAgbGRyICAgICAgcjMsW3I3LCMweDIwXQotICAgICAgICBtb3YgICAgICByMSxyMSxsc2wgIzEKLSAgICAgICAgc21sYWwgICAgcjEyLHIwLHIzLHIxCi0gICAgICAgIGxkciAgICAgIGxyLFtyNywjMHgyNF0KLSAgICAgICAgbGRyICAgICAgcjMsW3I2LCMweDI0XQotICAgICAgICBzdHIgICAgICByMCxbcjUsIzB4MjBdCi0gICAgICAgIHNtbGFsICAgIHIxLHIzLGxyLHIxCi0gICAgICAgIGxkciAgICAgIHIwLFtyNiwjMHg0MF0KLSAgICAgICAgbGRyICAgICAgcjEyLFtyNiwjMHg0NF0KLSAgICAgICAgc3RyICAgICAgcjMsW3I1LCMweDI0XQotICAgICAgICBsZHIgICAgICByMSxbcjUsIzB4MjhdCi0gICAgICAgIGxkciAgICAgIHIzLFtyNywjMHg0NF0KLSAgICAgICAgbW92ICAgICAgcjEscjEsbHNsICMxCi0gICAgICAgIHNtbGFsICAgIHIxLHIxMixyMyxyMQotICAgICAgICBsZHIgICAgICByMSxbcjUsIzB4NDBdCi0gICAgICAgIHN0ciAgICAgIHIxMixbcjUsIzB4NDRdCi0gICAgICAgIHJzYiAgICAgIHI4LHIxLCMwCi0gICAgICAgIHN0ciAgICAgIHI4LFtyNSwjMHgyOF0KLSAgICAgICAgbGRyICAgICAgcjEsW3I1LCMweDJjXQotICAgICAgICBsZHIgICAgICByMyxbcjcsIzB4NDBdCi0gICAgICAgIG1vdiAgICAgIHIxLHIxLGxzbCAjMQotICAgICAgICBzbWxhbCAgICByMSxyMCxyMyxyMQotICAgICAgICBzdHIgICAgICByMCxbcjUsIzB4NDBdCi0gICAgICAgIGxkciAgICAgIHIwLFtyNSwjMHgzY10KLSAgICAgICAgbGRyICAgICAgcjEsW3I2LCMweDM4XQotICAgICAgICBsZHIgICAgICByMyxbcjYsIzB4M2NdCi0gICAgICAgIHJzYiAgICAgIHI5LHIwLCMwCi0gICAgICAgIHN0ciAgICAgIHI5LFtyNSwjMHgyY10KLSAgICAgICAgbGRyICAgICAgcjAsW3I1LCMweDMwXQotICAgICAgICBsZHIgICAgICByMTIsW3I3LCMweDNjXQotICAgICAgICBtb3YgICAgICByMCxyMCxsc2wgIzEKLSAgICAgICAgc21sYWwgICAgcjAscjMscjEyLHIwCi0gICAgICAgIHN0ciAgICAgIHIzLFtyNSwjMHgzY10KLSAgICAgICAgbGRyICAgICAgcjAsW3I1LCMweDM4XQotICAgICAgICByc2IgICAgICByMCxyMCwjMAotICAgICAgICBzdHIgICAgICByMCxbcjUsIzB4MzBdCi0gICAgICAgIGxkciAgICAgIHIzLFtyNSwjMHgzNF0KLSAgICAgICAgbGRyICAgICAgcjEyLFtyNywjMHgzOF0KLSAgICAgICAgbW92ICAgICAgcjMscjMsbHNsICMxCi0gICAgICAgIHNtbGFsICAgIHIzLHIxLHIxMixyMwotICAgICAgICBtb3YgICAgICByMCxyMCxsc2wgIzEKLSAgICAgICAgc3RyICAgICAgcjEsW3I1LCMweDM4XQotICAgICAgICBsZHIgICAgICByNCxbcjcsIzB4MzRdCi0gICAgICAgIGxkciAgICAgIHIxLFtyNiwjMHgzNF0KLSAgICAgICAgbGRyICAgICAgcjMsW3I2LCMweDMwXQotICAgICAgICBzbWxhbCAgICByMCxyMSxyNCxyMAotICAgICAgICBsZHIgICAgICByMTIsW3I2LCMweDJjXQotICAgICAgICBsZHIgICAgICBscixbcjYsIzB4MjhdCi0gICAgICAgIHN0ciAgICAgIHIxLFtyNSwjMHgzNF0KLSAgICAgICAgbGRyICAgICAgcjEsW3I3LCMweDMwXQotICAgICAgICBtb3YgICAgICByMCxyOSxsc2wgIzEKLSAgICAgICAgc21sYWwgICAgcjAscjMscjEscjAKLSAgICAgICAgbW92ICAgICAgcjAscjgsbHNsICMxCi0gICAgICAgIGxkciAgICAgIHIxLFtyNywjMHgyY10KLSAgICAgICAgc3RyICAgICAgcjMsW3I1LCMweDMwXQotICAgICAgICBzbWxhbCAgICByMCxyMTIscjEscjAKLSAgICAgICAgbGRyICAgICAgcjAsW3I3LCMweDI4XQotICAgICAgICBzdHIgICAgICByMTIsW3I1LCMweDJjXQotICAgICAgICBzbWxhbCAgICByMixscixyMCxyMgotICAgICAgICBzdHIgICAgICBscixbcjUsIzB4MjhdCi0gICAgICAgIGxkciAgICAgIHIxLFtyNiwjNF0KLSAgICAgICAgbGRyICAgICAgcjEyLFtyNywjMHg0OF0KLSAgICAgICAgbW92ICAgICAgcjIscjEsbHNsICMxCi0gICAgICAgIGxkciAgICAgIHIxLFtyNiwjMHgyMF0KLSAgICAgICAgbGRyICAgICAgcjAsW3I2XQotICAgICAgICBtb3YgICAgICByMSxyMSxsc2wgIzEKLSAgICAgICAgc211bGwgICAgcjQsbHIscjEyLHIxCi0gICAgICAgIGxkciAgICAgIHIzLFtyNiwjMHgxY10KLSAgICAgICAgc3RyICAgICAgbHIsW3I2XQotICAgICAgICBsZHIgICAgICByMTIsW3I3LCMweDRjXQotICAgICAgICBtb3YgICAgICByMyxyMyxsc2wgIzEKLSAgICAgICAgc211bGwgICAgcjQsbHIscjEyLHIzCi0gICAgICAgIG1vdiAgICAgIHIwLHIwLGxzbCAjMQotICAgICAgICBsZHIgICAgICByMTIsW3I3LCMweDY0XQotICAgICAgICBzdHIgICAgICBscixbcjYsIzRdCi0gICAgICAgIHNtdWxsICAgIHI0LGxyLHIxMixyMgotICAgICAgICBsZHIgICAgICByMTIsW3I3LCMweDY4XQotICAgICAgICBzdHIgICAgICBscixbcjYsIzB4MWNdCi0gICAgICAgIHNtdWxsICAgIHI0LGxyLHIxMixyMAotICAgICAgICBsZHIgICAgICByMTIsW3I3LCMweDZjXQotICAgICAgICBzdHIgICAgICBscixbcjYsIzB4MjBdCi0gICAgICAgIHNtdWxsICAgIGxyLHIwLHIxMixyMAotICAgICAgICBsZHIgICAgICByMTIsW3I3LCMweDcwXQotICAgICAgICBzdHIgICAgICByMCxbcjYsIzB4MjRdCi0gICAgICAgIHNtdWxsICAgIHIwLHIyLHIxMixyMgotICAgICAgICBsZHIgICAgICByMCxbcjcsIzB4ODhdCi0gICAgICAgIHN0ciAgICAgIHIyLFtyNiwjMHgyOF0KLSAgICAgICAgc211bGwgICAgcjMscjIscjAscjMKLSAgICAgICAgbGRyICAgICAgcjAsW3I3LCMweDhjXQotICAgICAgICBzdHIgICAgICByMixbcjYsIzB4NDBdCi0gICAgICAgIHNtdWxsICAgIHIyLHIxLHIwLHIxCi0gICAgICAgIHN0ciAgICAgIHIxLFtyNiwjMHg0NF0KLSAgICAgICAgbGRyICAgICAgcjAsW3I2LCMweDE4XQotICAgICAgICBsZHIgICAgICBscixbcjcsIzB4NTBdCi0gICAgICAgIG1vdiAgICAgIHIxLHIwLGxzbCAjMQotICAgICAgICBsZHIgICAgICByMCxbcjYsIzB4MTRdCi0gICAgICAgIHNtdWxsICAgIHI1LHI0LGxyLHIxCi0gICAgICAgIGxkciAgICAgIHIxMixbcjYsIzB4MTBdCi0gICAgICAgIG1vdiAgICAgIHIzLHIwLGxzbCAjMQotICAgICAgICBsZHIgICAgICByMCxbcjYsIzB4Y10KLSAgICAgICAgbW92ICAgICAgcjEyLHIxMixsc2wgIzEKLSAgICAgICAgbW92ICAgICAgcjIscjAsbHNsICMxCi0gICAgICAgIGxkciAgICAgIHIwLFtyNiwjOF0KLSAgICAgICAgc3RyICAgICAgcjQsW3I2LCM4XQotICAgICAgICBsZHIgICAgICBscixbcjcsIzB4NTRdCi0gICAgICAgIG1vdiAgICAgIHIwLHIwLGxzbCAjMQotICAgICAgICBzbXVsbCAgICByNSxyNCxscixyMwotICAgICAgICBsZHIgICAgICBscixbcjcsIzB4NThdCi0gICAgICAgIHN0ciAgICAgIHI0LFtyNiwjMHhjXQotICAgICAgICBzbXVsbCAgICByNSxyNCxscixyMTIKLSAgICAgICAgbGRyICAgICAgbHIsW3I3LCMweDVjXQotICAgICAgICBzdHIgICAgICByNCxbcjYsIzB4MTBdCi0gICAgICAgIHNtdWxsICAgIHI1LHI0LGxyLHIyCi0gICAgICAgIGxkciAgICAgIGxyLFtyNywjMHg2MF0KLSAgICAgICAgc3RyICAgICAgcjQsW3I2LCMweDE0XQotICAgICAgICBzbXVsbCAgICByNSxyNCxscixyMAotICAgICAgICBsZHIgICAgICBscixbcjcsIzB4NzRdCi0gICAgICAgIHN0ciAgICAgIHI0LFtyNiwjMHgxOF0KLSAgICAgICAgc211bGwgICAgcjQscjAsbHIscjAKLSAgICAgICAgbGRyICAgICAgbHIsW3I3LCMweDc4XQotICAgICAgICBzdHIgICAgICByMCxbcjYsIzB4MmNdCi0gICAgICAgIHNtdWxsICAgIHIwLHIyLGxyLHIyCi0gICAgICAgIGxkciAgICAgIHIwLFtyNywjMHg3Y10KLSAgICAgICAgc3RyICAgICAgcjIsW3I2LCMweDMwXQotICAgICAgICBzbXVsbCAgICByMTIscjIscjAscjEyCi0gICAgICAgIGxkciAgICAgIHIwLFtyNywjMHg4MF0KLSAgICAgICAgc3RyICAgICAgcjIsW3I2LCMweDM0XQotICAgICAgICBzbXVsbCAgICByMyxyMixyMCxyMwotICAgICAgICBsZHIgICAgICByMCxbcjcsIzB4ODRdCi0gICAgICAgIHN0ciAgICAgIHIyLFtyNiwjMHgzOF0KLSAgICAgICAgc211bGwgICAgcjIscjEscjAscjEKLSAgICAgICAgc3RyICAgICAgcjEsW3I2LCMweDNjXQotICAgICAgICBsZG1mZCAgICBzcCEse3I0LXIxMCxwY30KLXRhYmxlCi0gICAgICAgIERDRCAgICAgIHx8LmNvbnN0ZGF0YSQxfHwKLSAgICAgICAgRU5EUAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSBBUkVBIHwuY29uc3RkYXRhfCwgREFUQSwgUkVBRE9OTFksIEFMSUdOPTIKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi18fC5jb25zdGRhdGEkMXx8Ci1jb3NUZXJtc19kY3QxOAotICAgICAgICBEQ0QgICAgICAweDA4MDdkMmIwCi0gICAgICAgIERDRCAgICAgIDB4MDg0ODNlZTAKLSAgICAgICAgRENEICAgICAgMHgwOGQzYjdkMAotICAgICAgICBEQ0QgICAgICAweDA5YzQyNTcwCi0gICAgICAgIERDRCAgICAgIDB4MGI1MDRmMzAKLSAgICAgICAgRENEICAgICAgMHgwZGYyOTQ0MAotICAgICAgICBEQ0QgICAgICAweDEyZWRmYjIwCi0gICAgICAgIERDRCAgICAgIDB4MWVlOGRkNDAKLSAgICAgICAgRENEICAgICAgMHg1YmNhMmEwMAotY29zVGVybXNfMV9vdl9jb3NfcGhpCi0gICAgICAgIERDRCAgICAgIDB4NDAwZjljMDAKLSAgICAgICAgRENEICAgICAgMHg0MDhkNjA4MAotICAgICAgICBEQ0QgICAgICAweDQxOGRjYjgwCi0gICAgICAgIERDRCAgICAgIDB4NDMxYjFhMDAKLSAgICAgICAgRENEICAgICAgMHg0NTQ1ZWEwMAotICAgICAgICBEQ0QgICAgICAweDQ4MjcwNjgwCi0gICAgICAgIERDRCAgICAgIDB4NGJlMjU0ODAKLSAgICAgICAgRENEICAgICAgMHg1MGFiOTQ4MAotICAgICAgICBEQ0QgICAgICAweDU2Y2U0ZDgwCi0gICAgICAgIERDRCAgICAgIDB4MDVlYmI2MzAKLSAgICAgICAgRENEICAgICAgMHgwNjkyMWE5OAotICAgICAgICBEQ0QgICAgICAweDA3NzFkM2E4Ci0gICAgICAgIERDRCAgICAgIDB4MDhhOWE4MzAKLSAgICAgICAgRENEICAgICAgMHgwYTczZDc1MAotICAgICAgICBEQ0QgICAgICAweDBkNGQ1MjYwCi0gICAgICAgIERDRCAgICAgIDB4MTI3YjFjYTAKLSAgICAgICAgRENEICAgICAgMHgxZWE1MmI0MAotICAgICAgICBEQ0QgICAgICAweDViYjNjYzgwCi0KLQotCi0gICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX21kY3RfMThfd20uYXNtIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX21kY3RfMThfd20uYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmU3NWQ0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19tZGN0XzE4X3dtLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDM2NiArMCwwIEBACi07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotOwotOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsKLTsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsKLTsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi07IGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi07IGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi07Ci07Ci07ICAgRmlsZW5hbWU6IHB2bXAzX2RjdF8xOC5zCi07Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFJFVklTSU9OIEhJU1RPUlkKLTsKLTsKLTsgV2hvOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZTogTU0vREQvWVlZWQotOyBEZXNjcmlwdGlvbjogCi07Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgRVhQT1JUIHxwdm1wM19tZGN0XzE4fAotCi0gICAgICAgIElNUE9SVCBwdm1wM19kY3RfOQotCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIEFSRUEgfC50ZXh0fCwgQ09ERSwgUkVBRE9OTFksIEFMSUdOPTIKLQotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXxwdm1wM19tZGN0XzE4fCBQUk9DCi0gICAgICAgIHN0bWZkICAgIHNwISx7cjQtcjEwLGxyfQotICAgICAgICBtb3YgICAgICByNyxyMgotICAgICAgICBsZHIgICAgICByMix0YWJsZQotICAgICAgICBtb3YgICAgICByNixyMQotICAgICAgICBhZGQgICAgICByMyxyMiwjMHgyNAotICAgICAgICBhZGQgICAgICByMTIscjMsIzB4NDQKLSAgICAgICAgYWRkICAgICAgcjEscjAsIzB4NDQKLSAgICAgICAgbW92ICAgICAgcjUscjAKLQotOyAgICBmb3IgKCBpPTk7IGkhPTA7IGktLSkKLTsgICAgewotCi0gICAgICAgIG1vdiAgICAgIHI0LCM5Ci1Mb29wXzEKLQotOyAgICAgICB0bXAgID0gKihwdF92ZWMpOwotOwkJdG1wMSA9ICoocHRfdmVjX28pOwotCi0gICAgICAgIGxkciAgICAgIGxyLFtyMF0JCTs7IHRtcCAgPT0gbHIKLSAgICAgICAgbGRyICAgICAgcjgsW3IzXSwjNAkJOzsgdG1wMSA9PSByOAotCi07ICAgICAgICB0bXAgID0gZnhwX211bDMyX1EzMiggdG1wPDwxLCAgKihwdF9jb3MrKyAgKSk7Ci07ICAgICAgICB0bXAxID0gZnhwX211bDMyX1EyNyggdG1wMSwgKihwdF9jb3NfeC0tKSk7Ci0KLSAgICAgICAgbW92ICAgICAgbHIsbHIsbHNsICMxCi0gICAgICAgIHNtdWxsICAgIHIxMCxscixyOCxscgotICAgICAgICBsZHIgICAgICByOCxbcjEyXSwjLTQKLSAgICAgICAgbGRyICAgICAgcjksW3IxXQotICAgICAgICBzdWJzICAgICByNCxyNCwjMQotICAgICAgICBzbXVsbCAgICByOSxyMTAscjgscjkKLSAgICAgICAgbW92ICAgICAgcjgscjksbHNyICMyNwotICAgICAgICBhZGQgICAgICByOCxyOCxyMTAsbHNsICM1Ci0KLTsgICAgICAgICoocHRfdmVjKyspICAgPSAgIHRtcCArIHRtcDEgOwotOyAgICAgICAgKihwdF92ZWNfby0tKSA9IGZ4cF9tdWwzMl9RMjgoICh0bXAgLSB0bXAxKSwgKihwdF9jb3Nfc3BsaXQrKykpOwotCi0gICAgICAgIGFkZCAgICAgIHI5LGxyLHI4Ci0gICAgICAgIHN1YiAgICAgIHI4LGxyLHI4Ci0gICAgICAgIGxkciAgICAgIGxyLFtyMl0sIzQKLSAgICAgICAgc3RyICAgICAgcjksW3IwXSwjNAotICAgICAgICBzbXVsbCAgICByOCxyOSxscixyOAotICAgICAgICBtb3YgICAgICBscixyOCxsc3IgIzI4Ci0gICAgICAgIGFkZCAgICAgIGxyLGxyLHI5LGxzbCAjNAotICAgICAgICBzdHIgICAgICBscixbcjFdLCMtNAotICAgICAgICBibmUgICAgICBMb29wXzEKLQotOwkJfQotCi0gICAgICAgIG1vdiAgICAgIHIwLHI1CQkJOzsgcjAgPSB2ZWMKLSAgICAgICAgYmwgICAgICAgcHZtcDNfZGN0XzkKLSAgICAgICAgYWRkICAgICAgcjAscjUsIzB4MjQJOzsgcjAgPSAmdmVjWzldCi0gICAgICAgIGJsICAgICAgIHB2bXAzX2RjdF85Ci0KLSAgICAgICAgbGRyICAgICAgcjAsW3I1LCMweDIwXQotICAgICAgICBsZHIgICAgICByMixbcjUsIzB4NDBdCi0gICAgICAgIHN0ciAgICAgIHIwLFtyNSwjMHg0MF0KLSAgICAgICAgbGRyICAgICAgcjAsW3I1LCMweDFjXQotICAgICAgICBsZHIgICAgICByMyxbcjUsIzB4MzhdCi0gICAgICAgIHN0ciAgICAgIHIwLFtyNSwjMHgzOF0KLSAgICAgICAgbGRyICAgICAgcjEsW3I1LCMweDE4XQotICAgICAgICBsZHIgICAgICByMCxbcjUsIzB4MzBdCi0gICAgICAgIHN0ciAgICAgIHIxLFtyNSwjMHgzMF0KLSAgICAgICAgbGRyICAgICAgcjEyLFtyNSwjMHgxNF0KLSAgICAgICAgbGRyICAgICAgcjEsW3I1LCMweDI4XQotICAgICAgICBzdHIgICAgICByMTIsW3I1LCMweDI4XQotICAgICAgICBsZHIgICAgICByMTIsW3I1LCMweDEwXQotICAgICAgICBzdHIgICAgICByMTIsW3I1LCMweDIwXQotICAgICAgICBsZHIgICAgICByMTIsW3I1LCMweGNdCi0gICAgICAgIHN0ciAgICAgIHIxMixbcjUsIzB4MThdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjUsIzhdCi0gICAgICAgIHN0ciAgICAgIHIxMixbcjUsIzB4MTBdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjUsIzRdCi0gICAgICAgIHN0ciAgICAgIHIxMixbcjUsIzhdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjUsIzB4MjRdCi0gICAgICAgIHN1YiAgICAgIHIxMixyMTIscjEKLSAgICAgICAgc3RyICAgICAgcjEyLFtyNSwjNF0KLSAgICAgICAgbGRyICAgICAgcjEyLFtyNSwjMHgyY10KLSAgICAgICAgc3ViICAgICAgcjEscjEyLHIxCi0gICAgICAgIHN0ciAgICAgIHIxLFtyNSwjMHhjXQotICAgICAgICBzdWIgICAgICByMSxyMTIscjAKLSAgICAgICAgc3RyICAgICAgcjEsW3I1LCMweDE0XQotICAgICAgICBsZHIgICAgICByMSxbcjUsIzB4MzRdCi0gICAgICAgIHN1YiAgICAgIHIwLHIxLHIwCi0gICAgICAgIHN0ciAgICAgIHIwLFtyNSwjMHgxY10KLSAgICAgICAgc3ViICAgICAgcjAscjEscjMKLSAgICAgICAgc3RyICAgICAgcjAsW3I1LCMweDI0XQotICAgICAgICBsZHIgICAgICByMSxbcjUsIzB4M2NdCi0gICAgICAgIHN1YiAgICAgIHIzLHIxLHIzCi0gICAgICAgIHN1YiAgICAgIHIxLHIxLHIyCi0gICAgICAgIHN0ciAgICAgIHIxLFtyNSwjMHgzNF0KLSAgICAgICAgc3RyICAgICAgcjMsW3I1LCMweDJjXQotICAgICAgICBsZHIgICAgICByMSxbcjUsIzB4NDRdCi0gICAgICAgIHN1YiAgICAgIHIxLHIxLHIyCi0gICAgICAgIHN0ciAgICAgIHIxLFtyNSwjMHgzY10KLSAgICAgICAgbGRyICAgICAgcjEyLFtyNSwjMF0KLQotTG9vcF8yCi0gICAgICAgIGFkZCAgICAgIHIxLHI1LHI0LGxzbCAjMgotICAgICAgICBsZHIgICAgICByMixbcjEsIzB4MjhdCi0gICAgICAgIGxkciAgICAgIHIzLFtyNixyNCxsc2wgIzJdCi0gICAgICAgIGFkZCAgICAgIHIwLHIwLHIyCi0gICAgICAgIHN0ciAgICAgIHIwLFtyMSwjMHgyOF0KLSAgICAgICAgbGRyICAgICAgbHIsW3I3LHI0LGxzbCAjMl0KLSAgICAgICAgbGRyICAgICAgcjEsW3IxLCM0XQotICAgICAgICBzbWxhbCAgICByMCxyMyxscixyMAotICAgICAgICBtb3YgICAgICByMCxyMgotICAgICAgICBhZGQgICAgICByMixyMTIscjEKLSAgICAgICAgcnNiICAgICAgcjIscjIsIzAKLSAgICAgICAgc3RyICAgICAgcjMsW3I1LHI0LGxzbCAjMl0KLSAgICAgICAgc3RyICAgICAgcjIsW3I2LHI0LGxzbCAjMl0KLSAgICAgICAgYWRkICAgICAgcjQscjQsIzEKLSAgICAgICAgY21wICAgICAgcjQsIzYKLSAgICAgICAgbW92ICAgICAgcjEyLHIxCi0KLSAgICAgICAgYmx0ICAgICAgTG9vcF8yCi0KLSAgICAgICAgbGRyICAgICAgcjEsW3I1LCMweDQwXQotICAgICAgICBsZHIgICAgICByMixbcjYsIzB4MThdCi0gICAgICAgIGFkZCAgICAgIHIzLHIwLHIxCi0gICAgICAgIHN0ciAgICAgIHIzLFtyNSwjMHg0MF0KLSAgICAgICAgbGRyICAgICAgbHIsW3I3LHI0LGxzbCAjMl0KLSAgICAgICAgbW92ICAgICAgcjMscjMsbHNsICMxCi0gICAgICAgIGxkciAgICAgIHIwLFtyNSwjMHgxY10KLSAgICAgICAgc21sYWwgICAgcjMscjIsbHIscjMKLSAgICAgICAgYWRkICAgICAgcjMscjEyLHIwCi0gICAgICAgIHN0ciAgICAgIHIyLFtyNSwjMHgxOF0KLSAgICAgICAgbGRyICAgICAgcjIsW3I2LCMweDFjXQotICAgICAgICByc2IgICAgICByMyxyMywjMAotICAgICAgICBzdHIgICAgICByMyxbcjYsIzB4MThdCi0gICAgICAgIGxkciAgICAgIHIzLFtyNSwjMHgyMF0KLSAgICAgICAgYWRkICAgICAgcjAscjMscjAKLSAgICAgICAgcnNiICAgICAgcjAscjAsIzAKLSAgICAgICAgc3RyICAgICAgcjAsW3I2LCMweDFjXQotICAgICAgICBsZHIgICAgICByMyxbcjUsIzB4NDRdCi0gICAgICAgIGxkciAgICAgIHIwLFtyNiwjMHgyMF0KLSAgICAgICAgYWRkICAgICAgcjMscjMscjEKLSAgICAgICAgbW92ICAgICAgcjEscjIKLSAgICAgICAgbGRyICAgICAgcjEwLFtyNywjMHgxY10KLSAgICAgICAgbW92ICAgICAgcjIscjMsbHNsICMxCi0gICAgICAgIHNtbGFsICAgIHIxMixyMSxyMTAscjIKLSAgICAgICAgc3RyICAgICAgcjEsW3I1LCMweDFjXQotICAgICAgICBsZHIgICAgICByMSxbcjUsIzB4MjBdCi0gICAgICAgIGxkciAgICAgIHIzLFtyNSwjMHgyNF0KLSAgICAgICAgYWRkICAgICAgcjEscjEscjMKLSAgICAgICAgcnNiICAgICAgcjEscjEsIzAKLSAgICAgICAgc3RyICAgICAgcjEsW3I2LCMweDIwXQotICAgICAgICBsZHIgICAgICByMSxbcjUsIzB4NDRdCi0gICAgICAgIGxkciAgICAgIHIzLFtyNywjMHgyMF0KLSAgICAgICAgbW92ICAgICAgcjEscjEsbHNsICMxCi0gICAgICAgIHNtbGFsICAgIHIxMixyMCxyMyxyMQotICAgICAgICBsZHIgICAgICBscixbcjcsIzB4MjRdCi0gICAgICAgIGxkciAgICAgIHIzLFtyNiwjMHgyNF0KLSAgICAgICAgc3RyICAgICAgcjAsW3I1LCMweDIwXQotICAgICAgICBzbWxhbCAgICByMSxyMyxscixyMQotICAgICAgICBsZHIgICAgICByMCxbcjYsIzB4NDBdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjYsIzB4NDRdCi0gICAgICAgIHN0ciAgICAgIHIzLFtyNSwjMHgyNF0KLSAgICAgICAgbGRyICAgICAgcjEsW3I1LCMweDI4XQotICAgICAgICBsZHIgICAgICByMyxbcjcsIzB4NDRdCi0gICAgICAgIG1vdiAgICAgIHIxLHIxLGxzbCAjMQotICAgICAgICBzbWxhbCAgICByMSxyMTIscjMscjEKLSAgICAgICAgbGRyICAgICAgcjEsW3I1LCMweDQwXQotICAgICAgICBzdHIgICAgICByMTIsW3I1LCMweDQ0XQotICAgICAgICByc2IgICAgICByOCxyMSwjMAotICAgICAgICBzdHIgICAgICByOCxbcjUsIzB4MjhdCi0gICAgICAgIGxkciAgICAgIHIxLFtyNSwjMHgyY10KLSAgICAgICAgbGRyICAgICAgcjMsW3I3LCMweDQwXQotICAgICAgICBtb3YgICAgICByMSxyMSxsc2wgIzEKLSAgICAgICAgc21sYWwgICAgcjEscjAscjMscjEKLSAgICAgICAgc3RyICAgICAgcjAsW3I1LCMweDQwXQotICAgICAgICBsZHIgICAgICByMCxbcjUsIzB4M2NdCi0gICAgICAgIGxkciAgICAgIHIxLFtyNiwjMHgzOF0KLSAgICAgICAgbGRyICAgICAgcjMsW3I2LCMweDNjXQotICAgICAgICByc2IgICAgICByOSxyMCwjMAotICAgICAgICBzdHIgICAgICByOSxbcjUsIzB4MmNdCi0gICAgICAgIGxkciAgICAgIHIwLFtyNSwjMHgzMF0KLSAgICAgICAgbGRyICAgICAgcjEyLFtyNywjMHgzY10KLSAgICAgICAgbW92ICAgICAgcjAscjAsbHNsICMxCi0gICAgICAgIHNtbGFsICAgIHIwLHIzLHIxMixyMAotICAgICAgICBzdHIgICAgICByMyxbcjUsIzB4M2NdCi0gICAgICAgIGxkciAgICAgIHIwLFtyNSwjMHgzOF0KLSAgICAgICAgcnNiICAgICAgcjAscjAsIzAKLSAgICAgICAgc3RyICAgICAgcjAsW3I1LCMweDMwXQotICAgICAgICBsZHIgICAgICByMyxbcjUsIzB4MzRdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjcsIzB4MzhdCi0gICAgICAgIG1vdiAgICAgIHIzLHIzLGxzbCAjMQotICAgICAgICBzbWxhbCAgICByMyxyMSxyMTIscjMKLSAgICAgICAgbW92ICAgICAgcjAscjAsbHNsICMxCi0gICAgICAgIHN0ciAgICAgIHIxLFtyNSwjMHgzOF0KLSAgICAgICAgbGRyICAgICAgcjQsW3I3LCMweDM0XQotICAgICAgICBsZHIgICAgICByMSxbcjYsIzB4MzRdCi0gICAgICAgIGxkciAgICAgIHIzLFtyNiwjMHgzMF0KLSAgICAgICAgc21sYWwgICAgcjAscjEscjQscjAKLSAgICAgICAgbGRyICAgICAgcjEyLFtyNiwjMHgyY10KLSAgICAgICAgbGRyICAgICAgbHIsW3I2LCMweDI4XQotICAgICAgICBzdHIgICAgICByMSxbcjUsIzB4MzRdCi0gICAgICAgIGxkciAgICAgIHIxLFtyNywjMHgzMF0KLSAgICAgICAgbW92ICAgICAgcjAscjksbHNsICMxCi0gICAgICAgIHNtbGFsICAgIHIwLHIzLHIxLHIwCi0gICAgICAgIG1vdiAgICAgIHIwLHI4LGxzbCAjMQotICAgICAgICBsZHIgICAgICByMSxbcjcsIzB4MmNdCi0gICAgICAgIHN0ciAgICAgIHIzLFtyNSwjMHgzMF0KLSAgICAgICAgc21sYWwgICAgcjAscjEyLHIxLHIwCi0gICAgICAgIGxkciAgICAgIHIwLFtyNywjMHgyOF0KLSAgICAgICAgc3RyICAgICAgcjEyLFtyNSwjMHgyY10KLSAgICAgICAgc21sYWwgICAgcjIsbHIscjAscjIKLSAgICAgICAgc3RyICAgICAgbHIsW3I1LCMweDI4XQotICAgICAgICBsZHIgICAgICByMSxbcjYsIzRdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjcsIzB4NDhdCi0gICAgICAgIG1vdiAgICAgIHIyLHIxLGxzbCAjMQotICAgICAgICBsZHIgICAgICByMSxbcjYsIzB4MjBdCi0gICAgICAgIGxkciAgICAgIHIwLFtyNl0KLSAgICAgICAgbW92ICAgICAgcjEscjEsbHNsICMxCi0gICAgICAgIHNtdWxsICAgIHI0LGxyLHIxMixyMQotICAgICAgICBsZHIgICAgICByMyxbcjYsIzB4MWNdCi0gICAgICAgIHN0ciAgICAgIGxyLFtyNl0KLSAgICAgICAgbGRyICAgICAgcjEyLFtyNywjMHg0Y10KLSAgICAgICAgbW92ICAgICAgcjMscjMsbHNsICMxCi0gICAgICAgIHNtdWxsICAgIHI0LGxyLHIxMixyMwotICAgICAgICBtb3YgICAgICByMCxyMCxsc2wgIzEKLSAgICAgICAgbGRyICAgICAgcjEyLFtyNywjMHg2NF0KLSAgICAgICAgc3RyICAgICAgbHIsW3I2LCM0XQotICAgICAgICBzbXVsbCAgICByNCxscixyMTIscjIKLSAgICAgICAgbGRyICAgICAgcjEyLFtyNywjMHg2OF0KLSAgICAgICAgc3RyICAgICAgbHIsW3I2LCMweDFjXQotICAgICAgICBzbXVsbCAgICByNCxscixyMTIscjAKLSAgICAgICAgbGRyICAgICAgcjEyLFtyNywjMHg2Y10KLSAgICAgICAgc3RyICAgICAgbHIsW3I2LCMweDIwXQotICAgICAgICBzbXVsbCAgICBscixyMCxyMTIscjAKLSAgICAgICAgbGRyICAgICAgcjEyLFtyNywjMHg3MF0KLSAgICAgICAgc3RyICAgICAgcjAsW3I2LCMweDI0XQotICAgICAgICBzbXVsbCAgICByMCxyMixyMTIscjIKLSAgICAgICAgbGRyICAgICAgcjAsW3I3LCMweDg4XQotICAgICAgICBzdHIgICAgICByMixbcjYsIzB4MjhdCi0gICAgICAgIHNtdWxsICAgIHIzLHIyLHIwLHIzCi0gICAgICAgIGxkciAgICAgIHIwLFtyNywjMHg4Y10KLSAgICAgICAgc3RyICAgICAgcjIsW3I2LCMweDQwXQotICAgICAgICBzbXVsbCAgICByMixyMSxyMCxyMQotICAgICAgICBzdHIgICAgICByMSxbcjYsIzB4NDRdCi0gICAgICAgIGxkciAgICAgIHIwLFtyNiwjMHgxOF0KLSAgICAgICAgbGRyICAgICAgbHIsW3I3LCMweDUwXQotICAgICAgICBtb3YgICAgICByMSxyMCxsc2wgIzEKLSAgICAgICAgbGRyICAgICAgcjAsW3I2LCMweDE0XQotICAgICAgICBzbXVsbCAgICByNSxyNCxscixyMQotICAgICAgICBsZHIgICAgICByMTIsW3I2LCMweDEwXQotICAgICAgICBtb3YgICAgICByMyxyMCxsc2wgIzEKLSAgICAgICAgbGRyICAgICAgcjAsW3I2LCMweGNdCi0gICAgICAgIG1vdiAgICAgIHIxMixyMTIsbHNsICMxCi0gICAgICAgIG1vdiAgICAgIHIyLHIwLGxzbCAjMQotICAgICAgICBsZHIgICAgICByMCxbcjYsIzhdCi0gICAgICAgIHN0ciAgICAgIHI0LFtyNiwjOF0KLSAgICAgICAgbGRyICAgICAgbHIsW3I3LCMweDU0XQotICAgICAgICBtb3YgICAgICByMCxyMCxsc2wgIzEKLSAgICAgICAgc211bGwgICAgcjUscjQsbHIscjMKLSAgICAgICAgbGRyICAgICAgbHIsW3I3LCMweDU4XQotICAgICAgICBzdHIgICAgICByNCxbcjYsIzB4Y10KLSAgICAgICAgc211bGwgICAgcjUscjQsbHIscjEyCi0gICAgICAgIGxkciAgICAgIGxyLFtyNywjMHg1Y10KLSAgICAgICAgc3RyICAgICAgcjQsW3I2LCMweDEwXQotICAgICAgICBzbXVsbCAgICByNSxyNCxscixyMgotICAgICAgICBsZHIgICAgICBscixbcjcsIzB4NjBdCi0gICAgICAgIHN0ciAgICAgIHI0LFtyNiwjMHgxNF0KLSAgICAgICAgc211bGwgICAgcjUscjQsbHIscjAKLSAgICAgICAgbGRyICAgICAgbHIsW3I3LCMweDc0XQotICAgICAgICBzdHIgICAgICByNCxbcjYsIzB4MThdCi0gICAgICAgIHNtdWxsICAgIHI0LHIwLGxyLHIwCi0gICAgICAgIGxkciAgICAgIGxyLFtyNywjMHg3OF0KLSAgICAgICAgc3RyICAgICAgcjAsW3I2LCMweDJjXQotICAgICAgICBzbXVsbCAgICByMCxyMixscixyMgotICAgICAgICBsZHIgICAgICByMCxbcjcsIzB4N2NdCi0gICAgICAgIHN0ciAgICAgIHIyLFtyNiwjMHgzMF0KLSAgICAgICAgc211bGwgICAgcjEyLHIyLHIwLHIxMgotICAgICAgICBsZHIgICAgICByMCxbcjcsIzB4ODBdCi0gICAgICAgIHN0ciAgICAgIHIyLFtyNiwjMHgzNF0KLSAgICAgICAgc211bGwgICAgcjMscjIscjAscjMKLSAgICAgICAgbGRyICAgICAgcjAsW3I3LCMweDg0XQotICAgICAgICBzdHIgICAgICByMixbcjYsIzB4MzhdCi0gICAgICAgIHNtdWxsICAgIHIyLHIxLHIwLHIxCi0gICAgICAgIHN0ciAgICAgIHIxLFtyNiwjMHgzY10KLSAgICAgICAgbGRtZmQgICAgc3AhLHtyNC1yMTAscGN9Ci10YWJsZQotICAgICAgICBEQ0QgICAgICBjb3NUZXJtc19kY3QxOAotICAgICAgICBFTkRQCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIEFSRUEgfC5jb25zdGRhdGF8LCBEQVRBLCBSRUFET05MWSwgQUxJR049MgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNvc1Rlcm1zX2RjdDE4Ci0gICAgICAgIERDRCAgICAgIDB4MDgwN2QyYjAKLSAgICAgICAgRENEICAgICAgMHgwODQ4M2VlMAotICAgICAgICBEQ0QgICAgICAweDA4ZDNiN2QwCi0gICAgICAgIERDRCAgICAgIDB4MDljNDI1NzAKLSAgICAgICAgRENEICAgICAgMHgwYjUwNGYzMAotICAgICAgICBEQ0QgICAgICAweDBkZjI5NDQwCi0gICAgICAgIERDRCAgICAgIDB4MTJlZGZiMjAKLSAgICAgICAgRENEICAgICAgMHgxZWU4ZGQ0MAotICAgICAgICBEQ0QgICAgICAweDViY2EyYTAwCi1jb3NUZXJtc18xX292X2Nvc19waGkKLSAgICAgICAgRENEICAgICAgMHg0MDBmOWMwMAotICAgICAgICBEQ0QgICAgICAweDQwOGQ2MDgwCi0gICAgICAgIERDRCAgICAgIDB4NDE4ZGNiODAKLSAgICAgICAgRENEICAgICAgMHg0MzFiMWEwMAotICAgICAgICBEQ0QgICAgICAweDQ1NDVlYTAwCi0gICAgICAgIERDRCAgICAgIDB4NDgyNzA2ODAKLSAgICAgICAgRENEICAgICAgMHg0YmUyNTQ4MAotICAgICAgICBEQ0QgICAgICAweDUwYWI5NDgwCi0gICAgICAgIERDRCAgICAgIDB4NTZjZTRkODAKLSAgICAgICAgRENEICAgICAgMHgwNWViYjYzMAotICAgICAgICBEQ0QgICAgICAweDA2OTIxYTk4Ci0gICAgICAgIERDRCAgICAgIDB4MDc3MWQzYTgKLSAgICAgICAgRENEICAgICAgMHgwOGE5YTgzMAotICAgICAgICBEQ0QgICAgICAweDBhNzNkNzUwCi0gICAgICAgIERDRCAgICAgIDB4MGQ0ZDUyNjAKLSAgICAgICAgRENEICAgICAgMHgxMjdiMWNhMAotICAgICAgICBEQ0QgICAgICAweDFlYTUyYjQwCi0gICAgICAgIERDRCAgICAgIDB4NWJiM2NjODAKLQotCi0KLSAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9hc20vcHZtcDNfcG9seXBoYXNlX2ZpbHRlcl93aW5kb3dfYXJtLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9hc20vcHZtcDNfcG9seXBoYXNlX2ZpbHRlcl93aW5kb3dfYXJtLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZWM1OTkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93X2FybS5zCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi07Ci07IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOwotOyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOwotOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKLTsgZXhwcmVzcyBvciBpbXBsaWVkLgotOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLTsgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLTsKLTsKLTsgICBGaWxlbmFtZTogcHZtcDNfcG9seXBoYXNlX2ZpbHRlcl93aW5kb3cucwotOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSRVZJU0lPTiBISVNUT1JZCi07Ci07Ci07IFdobzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGU6IE1NL0REL1lZWVkKLTsgRGVzY3JpcHRpb246IAotOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIEVYUE9SVCBwdm1wM19wb2x5cGhhc2VfZmlsdGVyX3dpbmRvdwotCi0gICAgICAgIElNUE9SVCB8fExpYiQkUmVxdWVzdCQkYXJtbGlifHwgW1dFQUtdCi0gICAgICAgIElNUE9SVCB8fExpYiQkUmVxdWVzdCQkY3BwbGlifHwgW1dFQUtdCi0gICAgICAgIElNUE9SVCBwcW1mU3ludGhXaW4KLQotCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIEFSRUEgfC50ZXh0fCwgQ09ERSwgUkVBRE9OTFksIEFMSUdOPTIKLQotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXxwdm1wM19wb2x5cGhhc2VfZmlsdGVyX3dpbmRvd3wgUFJPQwotCi0gICAgICAgIHN0bWZkICAgIHNwISx7cjAtcjIscjQtcjExLGxyfQotCi0gICAgICAgIHN1YiAgICAgIHNwLHNwLCM0Ci0gICAgICAgIGxkciAgICAgIHIyLFtzcCwjMHhjXQotICAgICAgICBsZHIgICAgICByMSxQb2x5UGhfZmlsdGVyX2NvZWZmCi0JCQotICAgICAgICBzdWIgICAgICByMixyMiwjMQotICAgICAgICBtb3YgICAgICByMTAsIzEKLSAgICAgICAgc3RyICAgICAgcjIsW3NwXQotCi07IEFjY3VtdWxhdG9ycyByOSwgcjExOjo+IEluaXRpYWxpemF0aW9uCi0KLUxvb3BfagotICAgICAgICBtb3YgICAgICByOSwgICMweDIwCi0gICAgICAgIG1vdiAgICAgIHIxMSwgIzB4MjAKLSAgICAgICAgbW92ICAgICAgcjQsICAjMHgxMAotTG9vcF9pCi0gICAgICAgIGFkZCAgICAgIHIyLHI0LHIxMAotICAgICAgICBhZGQgICAgICByMyxyMCxyMixsc2wgIzIKLSAgICAgICAgc3ViICAgICAgcjIscjQscjEwCi0gICAgICAgIGxkciAgICAgIHI1LFtyM10KLSAgICAgICAgbGRyICAgICAgbHIsW3IxXQotICAgICAgICBhZGQgICAgICByMTIscjAscjIsbHNsICMyCi0gICAgICAgIGxkciAgICAgIHI2LFtyMTIsIzB4NzgwXQotICAgICAgICBzbWxhbCAgICByMixyOSxscixyNQotICAgICAgICBzbWxhbCAgICByMixyMTEsbHIscjYKLSAgICAgICAgbGRyICAgICAgcjIsW3IxLCM0XQotICAgICAgICBsZHIgICAgICByNyxbcjEyLCMweDgwXQotICAgICAgICBzbWxhbCAgICByNSxyMTEscjIscjUKLSAgICAgICAgc211bGwgICAgcjYscjUscjIscjYKLSAgICAgICAgc3ViICAgICAgcjkscjkscjUKLSAgICAgICAgbGRyICAgICAgcjUsW3IxLCM4XQotICAgICAgICBsZHIgICAgICByOCxbcjMsIzB4NzAwXQotICAgICAgICBhZGQgICAgICByNCxyNCwjMHgyMDAKLSAgICAgICAgc21sYWwgICAgcjYscjkscjUscjcKLSAgICAgICAgc211bGwgICAgcjYscjIscjUscjgKLSAgICAgICAgbGRyICAgICAgcjUsW3IxLCMweGNdCi0gICAgICAgIHN1YiAgICAgIHIxMSxyMTEscjIKLSAgICAgICAgc21sYWwgICAgcjgscjkscjUscjgKLSAgICAgICAgc21sYWwgICAgcjcscjExLHI1LHI3Ci0gICAgICAgIGxkciAgICAgIHI1LFtyMywjMHgxMDBdCi0gICAgICAgIGxkciAgICAgIHIyLFtyMSwjMHgxMF0KLSAgICAgICAgbGRyICAgICAgcjYsW3IxMiwjMHg2ODBdCi0gICAgICAgIHNtbGFsICAgIGxyLHI5LHIyLHI1Ci0gICAgICAgIHNtbGFsICAgIGxyLHIxMSxyMixyNgotICAgICAgICBsZHIgICAgICByMixbcjEsIzB4MTRdCi0gICAgICAgIGxkciAgICAgIHI3LFtyMTIsIzB4MTgwXQotICAgICAgICBzbWxhbCAgICByNSxyMTEscjIscjUKLSAgICAgICAgc211bGwgICAgcjYscjUscjIscjYKLSAgICAgICAgbGRyICAgICAgcjYsW3IxLCMweDE4XQotICAgICAgICBsZHIgICAgICByOCxbcjMsIzB4NjAwXQotICAgICAgICBzdWIgICAgICByOSxyOSxyNQotICAgICAgICBzbWxhbCAgICByNSxyOSxyNixyNwotICAgICAgICBzbXVsbCAgICByMixyNSxyNixyOAotICAgICAgICBsZHIgICAgICByNixbcjEsIzB4MWNdCi0gICAgICAgIHN1YiAgICAgIHIxMSxyMTEscjUKLSAgICAgICAgc21sYWwgICAgcjgscjkscjYscjgKLSAgICAgICAgbGRyICAgICAgcjIsW3IxLCMweDIwXQotICAgICAgICBsZHIgICAgICByNSxbcjMsIzB4MjAwXQotICAgICAgICBzbWxhbCAgICByNyxyMTEscjYscjcKLSAgICAgICAgbGRyICAgICAgcjYsW3IxMiwjMHg1ODBdCi0gICAgICAgIHNtbGFsICAgIGxyLHI5LHIyLHI1Ci0gICAgICAgIHNtbGFsICAgIGxyLHIxMSxyMixyNgotICAgICAgICBsZHIgICAgICByMixbcjEsIzB4MjRdCi0gICAgICAgIGxkciAgICAgIHI3LFtyMTIsIzB4MjgwXQotICAgICAgICBzbWxhbCAgICByNSxyMTEscjIscjUKLSAgICAgICAgc211bGwgICAgcjYscjUscjIscjYKLSAgICAgICAgbGRyICAgICAgcjYsW3IxLCMweDI4XQotICAgICAgICBsZHIgICAgICByOCxbcjMsIzB4NTAwXQotICAgICAgICBzdWIgICAgICByOSxyOSxyNQotICAgICAgICBzbWxhbCAgICByNSxyOSxyNixyNwotICAgICAgICBzbXVsbCAgICByMixyNSxyNixyOAotICAgICAgICBsZHIgICAgICByNixbcjEsIzB4MmNdCi0gICAgICAgIHN1YiAgICAgIHIxMSxyMTEscjUKLQotICAgICAgICBzbWxhbCAgICByOCxyOSxyNixyOAotICAgICAgICBzbWxhbCAgICByNyxyMTEscjYscjcKLSAgICAgICAgbGRyICAgICAgcjUsW3IzLCMweDMwMF0KLSAgICAgICAgbGRyICAgICAgcjgsW3IxLCMweDMwXQotICAgICAgICBsZHIgICAgICByNixbcjEyLCMweDQ4MF0KLSAgICAgICAgc21sYWwgICAgcjcscjkscjgscjUKLSAgICAgICAgc21sYWwgICAgcjcscjExLHI4LHI2Ci0gICAgICAgIGxkciAgICAgIHI4LFtyMSwjMHgzNF0KLSAgICAgICAgbGRyICAgICAgcjEyLFtyMTIsIzB4MzgwXQotICAgICAgICBzbWxhbCAgICByNSxyMTEscjgscjUKLSAgICAgICAgc211bGwgICAgcjYscjUscjgscjYKLSAgICAgICAgbGRyICAgICAgcjYsW3IxLCMweDM4XQotCi0KLSAgICAgICAgbGRyICAgICAgcjMsW3IzLCMweDQwMF0KLSAgICAgICAgc3ViICAgICAgcjkscjkscjUKLSAgICAgICAgc21sYWwgICAgcjcscjkscjYscjEyCi0gICAgICAgIHNtdWxsICAgIHI4LHI3LHI2LHIzCi0gICAgICAgIGNtcCAgICAgIHI0LCMweDIxMAotICAgICAgICBzdWIgICAgICByMTEscjExLHI3Ci0KLSAgICAgICAgbGRyICAgICAgcjIsW3IxLCMweDNjXQotICAgICAgICBhZGQgICAgICByMSxyMSwjMHg0MAotICAgICAgICBzbWxhbCAgICByMyxyOSxyMixyMwotICAgICAgICBzbWxhbCAgICByMTIscjExLHIyLHIxMgotCi0gICAgICAgIGJsdCAgICAgIExvb3BfaQotCi0gICAgICAgIG1vdiAgICAgIHIzLHI5LCBhc3IgIzYKLSAgICAgICAgbW92ICAgICAgcjQscjMsIGFzciAjMTUKLSAgICAgICAgdGVxICAgICAgcjQscjMsIGFzciAjMzEKLSAgICAgICAgbGRyICAgICAgcjEyLExPV18xNkJJVFMKLSAgICAgICAgbGRyICAgICAgcjIsW3NwXQotICAgICAgICBlb3JuZSAgICByMyxyMTIscjMsYXNyICMzMQotICAgICAgICBsZHIgICAgICByNCxbc3AsIzhdCi0gICAgICAgIG1vdiAgICAgIHIyLHIxMCxsc2wgcjIKLSAgICAgICAgYWRkICAgICAgcjQscjQscjIsbHNsICMxCi0gICAgICAgIHN0cmggICAgIHIzLFtyNF0KLQotICAgICAgICBtb3YgICAgICByMyxyMTEsYXNyICM2Ci0gICAgICAgIG1vdiAgICAgIHI0LHIzLGFzciAjMTUKLSAgICAgICAgdGVxICAgICAgcjQscjMsYXNyICMzMQotICAgICAgICBlb3JuZSAgICByMyxyMTIscjMsYXNyICMzMQotICAgICAgICBsZHIgICAgICByMTIsW3NwLCMweGNdCi0gICAgICAgIGxkciAgICAgIHIxMSxbc3AsIzhdCi0gICAgICAgIHJzYiAgICAgIHIyLHIyLHIxMixsc2wgIzUKLSAgICAgICAgYWRkICAgICAgcjIscjExLHIyLGxzbCAjMQotICAgICAgICBzdHJoICAgICByMyxbcjJdCi0KLSAgICAgICAgYWRkICAgICAgcjEwLHIxMCwjMQotICAgICAgICBjbXAgICAgICByMTAsIzB4MTAKLSAgICAgICAgYmx0ICAgICAgTG9vcF9qCi0KLTsgQWNjdW11bGF0b3JzIHI0LCByNSBJbml0aWFsaXphdGlvbgotCi0gICAgICAgIG1vdiAgICAgIHI0LCMweDIwCi0gICAgICAgIG1vdiAgICAgIHI1LCMweDIwCi0gICAgICAgIG1vdiAgICAgIHIzLCMweDEwCi1Qb2x5UGhfZmlsdGVyX2xvb3AyCi0gICAgICAgIGFkZCAgICAgIHIyLHIwLHIzLGxzbCAjMgotICAgICAgICBsZHIgICAgICByMTIsW3IyXQotICAgICAgICBsZHIgICAgICByOCxbcjFdCi0gICAgICAgIGxkciAgICAgIHI2LFtyMiwjMHg4MF0KLSAgICAgICAgc21sYWwgICAgcjEyLHI0LHI4LHIxMgotICAgICAgICBsZHIgICAgICByMTIsW3IxLCM0XQotICAgICAgICBsZHIgICAgICByNyxbcjIsIzB4NDBdCi0gICAgICAgIHNtbGFsICAgIHI2LHI0LHIxMixyNgotCi0gICAgICAgIGxkciAgICAgIHIxMixbcjEsIzhdCi0gICAgICAgIGxkciAgICAgIHI2LFtyMiwjMHgxODBdCi0gICAgICAgIHNtbGFsICAgIHI3LHI1LHIxMixyNwotICAgICAgICBsZHIgICAgICByMTIsW3IyLCMweDEwMF0KLSAgICAgICAgbGRyICAgICAgcjcsW3IxLCMweGNdCi0gICAgICAgIGxkciAgICAgIHIyLFtyMiwjMHgxNDBdCi0gICAgICAgIHNtbGFsICAgIHIxMixyNCxyNyxyMTIKLSAgICAgICAgbGRyICAgICAgcjEyLFtyMSwjMHgxMF0KLSAgICAgICAgYWRkICAgICAgcjMscjMsIzB4ODAKLSAgICAgICAgc21sYWwgICAgcjYscjQscjEyLHI2Ci0gICAgICAgIGxkciAgICAgIHI2LFtyMSwjMHgxNF0KLSAgICAgICAgY21wICAgICAgcjMsIzB4MjEwCi0gICAgICAgIHNtbGFsICAgIHIyLHI1LHI2LHIyCi0gICAgICAgIGFkZCAgICAgIHIxLHIxLCMweDE4Ci0KLSAgICAgICAgYmx0ICAgICAgUG9seVBoX2ZpbHRlcl9sb29wMgotICAgICAgICBtb3YgICAgICByMCxyNCxhc3IgIzYKLSAgICAgICAgbW92ICAgICAgcjIscjAsYXNyICMxNQotICAgICAgICB0ZXEgICAgICByMixyMCxhc3IgIzMxCi0gICAgICAgIGxkcm5lICAgIHIxMixMT1dfMTZCSVRTCi0gICAgICAgIGxkciAgICAgIHIxLFtzcCwjOF0KLSAgICAgICAgZW9ybmUgICAgcjAscjEyLHIwLGFzciAjMzEKLSAgICAgICAgc3RyaCAgICAgcjAsW3IxLCMwXQotICAgICAgICBtb3YgICAgICByMCxyNSxhc3IgIzYKLSAgICAgICAgbW92ICAgICAgcjIscjAsYXNyICMxNQotICAgICAgICB0ZXEgICAgICByMixyMCxhc3IgIzMxCi0gICAgICAgIGxkcm5lICAgIHIxMixMT1dfMTZCSVRTCi0gICAgICAgIGxkciAgICAgIHIyLFtzcF0KLSAgICAgICAgbW92ICAgICAgcjEsIzB4MTAKLSAgICAgICAgZW9ybmUgICAgcjAscjEyLHIwLGFzciAjMzEKLSAgICAgICAgbGRyICAgICAgcjEyLFtzcCwjOF0KLSAgICAgICAgbW92ICAgICAgcjEscjEsbHNsIHIyCi0gICAgICAgIGFkZCAgICAgIHIxLHIxMixyMSxsc2wgIzEKLSAgICAgICAgc3RyaCAgICAgcjAsW3IxXQotICAgICAgICBhZGQgICAgICBzcCxzcCwjMHgxMAotICAgICAgICBsZG1mZCAgICBzcCEse3I0LXIxMSxwY30KLQotCi1Qb2x5UGhfZmlsdGVyX2NvZWZmCi0gICAgICAgIERDRCAgICAgIHBxbWZTeW50aFdpbgotTE9XXzE2QklUUwotICAgICAgICBEQ0QgICAgICAweDAwMDA3ZmZmCi0KLSAgICAgICAgRU5EUAotCi0KLSAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9hc20vcHZtcDNfcG9seXBoYXNlX2ZpbHRlcl93aW5kb3dfZ2NjLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9hc20vcHZtcDNfcG9seXBoYXNlX2ZpbHRlcl93aW5kb3dfZ2NjLnMKaW5kZXggYjc0Yzg0OS4uMTE0MGVkNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93X2djYy5zCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19wb2x5cGhhc2VfZmlsdGVyX3dpbmRvd19nY2MucwpAQCAtMzUsNiArMzUsNyBAQAogLnRleHQKIAogLmV4dGVybiBwcW1mU3ludGhXaW4KKy5oaWRkZW4gcHFtZlN5bnRoV2luCiAKIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9hc20vcHZtcDNfcG9seXBoYXNlX2ZpbHRlcl93aW5kb3dfd20uYXNtIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93X3dtLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk1NzI2Ny4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9hc20vcHZtcDNfcG9seXBoYXNlX2ZpbHRlcl93aW5kb3dfd20uYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi07Ci07IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOwotOyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOwotOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKLTsgZXhwcmVzcyBvciBpbXBsaWVkLgotOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLTsgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLTsKLTsKLTsgICBGaWxlbmFtZTogcHZtcDNfcG9seXBoYXNlX2ZpbHRlcl93aW5kb3cucwotOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSRVZJU0lPTiBISVNUT1JZCi07Ci07Ci07IFdobzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGU6IE1NL0REL1lZWVkKLTsgRGVzY3JpcHRpb246IAotOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0JQ09ERTMyCi0KLQlBUkVBCXwuZHJlY3R2ZXwsIERSRUNUVkUKLQotCUVYUE9SVAl8cHZtcDNfcG9seXBoYXNlX2ZpbHRlcl93aW5kb3d8Ci0JSU1QT1JUCXxwcW1mU3ludGhXaW58Ci0KLQlBUkVBCXwucGRhdGF8LCBQREFUQQotCi0JQVJFQQl8LnRleHR8LCBDT0RFLCBBUk0KLQotfHB2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93fCBQUk9DCi0gICAgICAgIHN0bWZkICAgIHNwISx7cjAtcjIscjQtcjExLGxyfQotCi0gICAgICAgIHN1YiAgICAgIHNwLHNwLCM0Ci0gICAgICAgIGxkciAgICAgIHIyLFtzcCwjMHhjXQotICAgICAgICBsZHIgICAgICByMSxQb2x5UGhfZmlsdGVyX2NvZWZmCi0JCQotICAgICAgICBzdWIgICAgICByMixyMiwjMQotICAgICAgICBtb3YgICAgICByMTAsIzEKLSAgICAgICAgc3RyICAgICAgcjIsW3NwXQotCi07IEFjY3VtdWxhdG9ycyByOSwgcjExOjo+IEluaXRpYWxpemF0aW9uCi0KLUxvb3BfagotICAgICAgICBtb3YgICAgICByOSwgICMweDIwCi0gICAgICAgIG1vdiAgICAgIHIxMSwgIzB4MjAKLSAgICAgICAgbW92ICAgICAgcjQsICAjMHgxMAotTG9vcF9pCi0gICAgICAgIGFkZCAgICAgIHIyLHI0LHIxMAotICAgICAgICBhZGQgICAgICByMyxyMCxyMixsc2wgIzIKLSAgICAgICAgc3ViICAgICAgcjIscjQscjEwCi0gICAgICAgIGxkciAgICAgIHI1LFtyM10KLSAgICAgICAgbGRyICAgICAgbHIsW3IxXQotICAgICAgICBhZGQgICAgICByMTIscjAscjIsbHNsICMyCi0gICAgICAgIGxkciAgICAgIHI2LFtyMTIsIzB4NzgwXQotICAgICAgICBzbWxhbCAgICByMixyOSxscixyNQotICAgICAgICBzbWxhbCAgICByMixyMTEsbHIscjYKLSAgICAgICAgbGRyICAgICAgcjIsW3IxLCM0XQotICAgICAgICBsZHIgICAgICByNyxbcjEyLCMweDgwXQotICAgICAgICBzbWxhbCAgICByNSxyMTEscjIscjUKLSAgICAgICAgc211bGwgICAgcjYscjUscjIscjYKLSAgICAgICAgc3ViICAgICAgcjkscjkscjUKLSAgICAgICAgbGRyICAgICAgcjUsW3IxLCM4XQotICAgICAgICBsZHIgICAgICByOCxbcjMsIzB4NzAwXQotICAgICAgICBhZGQgICAgICByNCxyNCwjMHgyMDAKLSAgICAgICAgc21sYWwgICAgcjYscjkscjUscjcKLSAgICAgICAgc211bGwgICAgcjYscjIscjUscjgKLSAgICAgICAgbGRyICAgICAgcjUsW3IxLCMweGNdCi0gICAgICAgIHN1YiAgICAgIHIxMSxyMTEscjIKLSAgICAgICAgc21sYWwgICAgcjgscjkscjUscjgKLSAgICAgICAgc21sYWwgICAgcjcscjExLHI1LHI3Ci0gICAgICAgIGxkciAgICAgIHI1LFtyMywjMHgxMDBdCi0gICAgICAgIGxkciAgICAgIHIyLFtyMSwjMHgxMF0KLSAgICAgICAgbGRyICAgICAgcjYsW3IxMiwjMHg2ODBdCi0gICAgICAgIHNtbGFsICAgIGxyLHI5LHIyLHI1Ci0gICAgICAgIHNtbGFsICAgIGxyLHIxMSxyMixyNgotICAgICAgICBsZHIgICAgICByMixbcjEsIzB4MTRdCi0gICAgICAgIGxkciAgICAgIHI3LFtyMTIsIzB4MTgwXQotICAgICAgICBzbWxhbCAgICByNSxyMTEscjIscjUKLSAgICAgICAgc211bGwgICAgcjYscjUscjIscjYKLSAgICAgICAgbGRyICAgICAgcjYsW3IxLCMweDE4XQotICAgICAgICBsZHIgICAgICByOCxbcjMsIzB4NjAwXQotICAgICAgICBzdWIgICAgICByOSxyOSxyNQotICAgICAgICBzbWxhbCAgICByNSxyOSxyNixyNwotICAgICAgICBzbXVsbCAgICByMixyNSxyNixyOAotICAgICAgICBsZHIgICAgICByNixbcjEsIzB4MWNdCi0gICAgICAgIHN1YiAgICAgIHIxMSxyMTEscjUKLSAgICAgICAgc21sYWwgICAgcjgscjkscjYscjgKLSAgICAgICAgbGRyICAgICAgcjIsW3IxLCMweDIwXQotICAgICAgICBsZHIgICAgICByNSxbcjMsIzB4MjAwXQotICAgICAgICBzbWxhbCAgICByNyxyMTEscjYscjcKLSAgICAgICAgbGRyICAgICAgcjYsW3IxMiwjMHg1ODBdCi0gICAgICAgIHNtbGFsICAgIGxyLHI5LHIyLHI1Ci0gICAgICAgIHNtbGFsICAgIGxyLHIxMSxyMixyNgotICAgICAgICBsZHIgICAgICByMixbcjEsIzB4MjRdCi0gICAgICAgIGxkciAgICAgIHI3LFtyMTIsIzB4MjgwXQotICAgICAgICBzbWxhbCAgICByNSxyMTEscjIscjUKLSAgICAgICAgc211bGwgICAgcjYscjUscjIscjYKLSAgICAgICAgbGRyICAgICAgcjYsW3IxLCMweDI4XQotICAgICAgICBsZHIgICAgICByOCxbcjMsIzB4NTAwXQotICAgICAgICBzdWIgICAgICByOSxyOSxyNQotICAgICAgICBzbWxhbCAgICByNSxyOSxyNixyNwotICAgICAgICBzbXVsbCAgICByMixyNSxyNixyOAotICAgICAgICBsZHIgICAgICByNixbcjEsIzB4MmNdCi0gICAgICAgIHN1YiAgICAgIHIxMSxyMTEscjUKLQotICAgICAgICBzbWxhbCAgICByOCxyOSxyNixyOAotICAgICAgICBzbWxhbCAgICByNyxyMTEscjYscjcKLSAgICAgICAgbGRyICAgICAgcjUsW3IzLCMweDMwMF0KLSAgICAgICAgbGRyICAgICAgcjgsW3IxLCMweDMwXQotICAgICAgICBsZHIgICAgICByNixbcjEyLCMweDQ4MF0KLSAgICAgICAgc21sYWwgICAgcjcscjkscjgscjUKLSAgICAgICAgc21sYWwgICAgcjcscjExLHI4LHI2Ci0gICAgICAgIGxkciAgICAgIHI4LFtyMSwjMHgzNF0KLSAgICAgICAgbGRyICAgICAgcjEyLFtyMTIsIzB4MzgwXQotICAgICAgICBzbWxhbCAgICByNSxyMTEscjgscjUKLSAgICAgICAgc211bGwgICAgcjYscjUscjgscjYKLSAgICAgICAgbGRyICAgICAgcjYsW3IxLCMweDM4XQotCi0KLSAgICAgICAgbGRyICAgICAgcjMsW3IzLCMweDQwMF0KLSAgICAgICAgc3ViICAgICAgcjkscjkscjUKLSAgICAgICAgc21sYWwgICAgcjcscjkscjYscjEyCi0gICAgICAgIHNtdWxsICAgIHI4LHI3LHI2LHIzCi0gICAgICAgIGNtcCAgICAgIHI0LCMweDIxMAotICAgICAgICBzdWIgICAgICByMTEscjExLHI3Ci0KLSAgICAgICAgbGRyICAgICAgcjIsW3IxLCMweDNjXQotICAgICAgICBhZGQgICAgICByMSxyMSwjMHg0MAotICAgICAgICBzbWxhbCAgICByMyxyOSxyMixyMwotICAgICAgICBzbWxhbCAgICByMTIscjExLHIyLHIxMgotCi0gICAgICAgIGJsdCAgICAgIExvb3BfaQotCi0gICAgICAgIG1vdiAgICAgIHIzLHI5LCBhc3IgIzYKLSAgICAgICAgbW92ICAgICAgcjQscjMsIGFzciAjMTUKLSAgICAgICAgdGVxICAgICAgcjQscjMsIGFzciAjMzEKLSAgICAgICAgbGRyICAgICAgcjEyLExPV18xNkJJVFMKLSAgICAgICAgbGRyICAgICAgcjIsW3NwXQotICAgICAgICBlb3JuZSAgICByMyxyMTIscjMsYXNyICMzMQotICAgICAgICBsZHIgICAgICByNCxbc3AsIzhdCi0gICAgICAgIG1vdiAgICAgIHIyLHIxMCxsc2wgcjIKLSAgICAgICAgYWRkICAgICAgcjQscjQscjIsbHNsICMxCi0gICAgICAgIHN0cmggICAgIHIzLFtyNF0KLQotICAgICAgICBtb3YgICAgICByMyxyMTEsYXNyICM2Ci0gICAgICAgIG1vdiAgICAgIHI0LHIzLGFzciAjMTUKLSAgICAgICAgdGVxICAgICAgcjQscjMsYXNyICMzMQotICAgICAgICBlb3JuZSAgICByMyxyMTIscjMsYXNyICMzMQotICAgICAgICBsZHIgICAgICByMTIsW3NwLCMweGNdCi0gICAgICAgIGxkciAgICAgIHIxMSxbc3AsIzhdCi0gICAgICAgIHJzYiAgICAgIHIyLHIyLHIxMixsc2wgIzUKLSAgICAgICAgYWRkICAgICAgcjIscjExLHIyLGxzbCAjMQotICAgICAgICBzdHJoICAgICByMyxbcjJdCi0KLSAgICAgICAgYWRkICAgICAgcjEwLHIxMCwjMQotICAgICAgICBjbXAgICAgICByMTAsIzB4MTAKLSAgICAgICAgYmx0ICAgICAgTG9vcF9qCi0KLTsgQWNjdW11bGF0b3JzIHI0LCByNSBJbml0aWFsaXphdGlvbgotCi0gICAgICAgIG1vdiAgICAgIHI0LCMweDIwCi0gICAgICAgIG1vdiAgICAgIHI1LCMweDIwCi0gICAgICAgIG1vdiAgICAgIHIzLCMweDEwCi1Qb2x5UGhfZmlsdGVyX2xvb3AyCi0gICAgICAgIGFkZCAgICAgIHIyLHIwLHIzLGxzbCAjMgotICAgICAgICBsZHIgICAgICByMTIsW3IyXQotICAgICAgICBsZHIgICAgICByOCxbcjFdCi0gICAgICAgIGxkciAgICAgIHI2LFtyMiwjMHg4MF0KLSAgICAgICAgc21sYWwgICAgcjEyLHI0LHI4LHIxMgotICAgICAgICBsZHIgICAgICByMTIsW3IxLCM0XQotICAgICAgICBsZHIgICAgICByNyxbcjIsIzB4NDBdCi0gICAgICAgIHNtbGFsICAgIHI2LHI0LHIxMixyNgotCi0gICAgICAgIGxkciAgICAgIHIxMixbcjEsIzhdCi0gICAgICAgIGxkciAgICAgIHI2LFtyMiwjMHgxODBdCi0gICAgICAgIHNtbGFsICAgIHI3LHI1LHIxMixyNwotICAgICAgICBsZHIgICAgICByMTIsW3IyLCMweDEwMF0KLSAgICAgICAgbGRyICAgICAgcjcsW3IxLCMweGNdCi0gICAgICAgIGxkciAgICAgIHIyLFtyMiwjMHgxNDBdCi0gICAgICAgIHNtbGFsICAgIHIxMixyNCxyNyxyMTIKLSAgICAgICAgbGRyICAgICAgcjEyLFtyMSwjMHgxMF0KLSAgICAgICAgYWRkICAgICAgcjMscjMsIzB4ODAKLSAgICAgICAgc21sYWwgICAgcjYscjQscjEyLHI2Ci0gICAgICAgIGxkciAgICAgIHI2LFtyMSwjMHgxNF0KLSAgICAgICAgY21wICAgICAgcjMsIzB4MjEwCi0gICAgICAgIHNtbGFsICAgIHIyLHI1LHI2LHIyCi0gICAgICAgIGFkZCAgICAgIHIxLHIxLCMweDE4Ci0KLSAgICAgICAgYmx0ICAgICAgUG9seVBoX2ZpbHRlcl9sb29wMgotICAgICAgICBtb3YgICAgICByMCxyNCxhc3IgIzYKLSAgICAgICAgbW92ICAgICAgcjIscjAsYXNyICMxNQotICAgICAgICB0ZXEgICAgICByMixyMCxhc3IgIzMxCi0gICAgICAgIGxkcm5lICAgIHIxMixMT1dfMTZCSVRTCi0gICAgICAgIGxkciAgICAgIHIxLFtzcCwjOF0KLSAgICAgICAgZW9ybmUgICAgcjAscjEyLHIwLGFzciAjMzEKLSAgICAgICAgc3RyaCAgICAgcjAsW3IxLCMwXQotICAgICAgICBtb3YgICAgICByMCxyNSxhc3IgIzYKLSAgICAgICAgbW92ICAgICAgcjIscjAsYXNyICMxNQotICAgICAgICB0ZXEgICAgICByMixyMCxhc3IgIzMxCi0gICAgICAgIGxkcm5lICAgIHIxMixMT1dfMTZCSVRTCi0gICAgICAgIGxkciAgICAgIHIyLFtzcF0KLSAgICAgICAgbW92ICAgICAgcjEsIzB4MTAKLSAgICAgICAgZW9ybmUgICAgcjAscjEyLHIwLGFzciAjMzEKLSAgICAgICAgbGRyICAgICAgcjEyLFtzcCwjOF0KLSAgICAgICAgbW92ICAgICAgcjEscjEsbHNsIHIyCi0gICAgICAgIGFkZCAgICAgIHIxLHIxMixyMSxsc2wgIzEKLSAgICAgICAgc3RyaCAgICAgcjAsW3IxXQotICAgICAgICBhZGQgICAgICBzcCxzcCwjMHgxMAotICAgICAgICBsZG1mZCAgICBzcCEse3I0LXIxMSxwY30KLQotCi1Qb2x5UGhfZmlsdGVyX2NvZWZmCi0gICAgICAgIERDRCAgICAgIHBxbWZTeW50aFdpbgotTE9XXzE2QklUUwotICAgICAgICBEQ0QgICAgICAweDAwMDA3ZmZmCi0JCi0JCUVORFAgIDsgfHB2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93fAotCQlFTkQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbXBlZzJfZ2V0X3NjYWxlX2RhdGEuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbXBlZzJfZ2V0X3NjYWxlX2RhdGEuY3BwCmluZGV4IGVlNDJkYzUuLjQ5OTY3MmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21wZWcyX2dldF9zY2FsZV9kYXRhLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tcGVnMl9nZXRfc2NhbGVfZGF0YS5jcHAKQEAgLTEzOSw3ICsxMzksNyBAQAogICAgIGludDE2IGJsb2NrbnVtYmVyID0gMDsKIAogICAgIGdyYW51bGVJbmZvICpncl9pbmZvID0gJihzaS0+Y2hbY2hdLmdyYW5bZ3JdKTsKLSAgICB1aW50MzIgc2NhbGVmYWNfY29tcCwgaW50X3NjYWxlZmFjX2NvbXAsIG5ld19zbGVuWzRdOworICAgIHVpbnQzMiBzY2FsZWZhY19jb21wLCBpbnRfc2NhbGVmYWNfY29tcCwgbmV3X3NsZW5bNF0gPSB7IDAsMCwwLDAgfTsKIAogICAgIHNjYWxlZmFjX2NvbXAgPSAgZ3JfaW5mby0+c2NhbGVmYWNfY29tcHJlc3M7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9BbmRyb2lkLm1rCmluZGV4IDdmMmM0NmQuLjkzZmY2NGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvQW5kcm9pZC5tawpAQCAtMjAsNCArMjAsNiBAQAogTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X3NvZnRfdnB4ZGVjCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguY3BwCmluZGV4IDE2OTFkMDMuLjQxZmZjNTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguY3BwCkBAIC0yMywxMyArMjMsNiBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAKLSNpbmNsdWRlICJ2cHgvdnB4X2RlY29kZXIuaCIKLSNpbmNsdWRlICJ2cHgvdnB4X2NvZGVjLmgiCi0jaW5jbHVkZSAidnB4L3ZwOGR4LmgiCi0KLSNpZm5kZWYgVUlOVDMyX01BWAotI2RlZmluZSBVSU5UMzJfTUFYICAgICAgICg0Mjk0OTY3Mjk1VSkKLSNlbmRpZgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTQ1LDcgKzM4LDggQEAKICAgICAgICAgICAgIE5VTEwgLyogcHJvZmlsZUxldmVscyAqLywgMCAvKiBudW1Qcm9maWxlTGV2ZWxzICovLAogICAgICAgICAgICAgMzIwIC8qIHdpZHRoICovLCAyNDAgLyogaGVpZ2h0ICovLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCksCiAgICAgICBtTW9kZShjb2RpbmdUeXBlID09IE9NWF9WSURFT19Db2RpbmdWUDggPyBNT0RFX1ZQOCA6IE1PREVfVlA5KSwKLSAgICAgIG1DdHgoTlVMTCkgeworICAgICAgbUN0eChOVUxMKSwKKyAgICAgIG1JbWcoTlVMTCkgewogICAgIGluaXRQb3J0cyhrTnVtQnVmZmVycywgNzY4ICogMTAyNCAvKiBpbnB1dEJ1ZmZlclNpemUgKi8sCiAgICAgICAgICAgICBrTnVtQnVmZmVycywKICAgICAgICAgICAgIGNvZGluZ1R5cGUgPT0gT01YX1ZJREVPX0NvZGluZ1ZQOCA/IE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOCA6IE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOSk7CkBAIC04OSw3ICs4Myw3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIFNvZnRWUFg6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKK3ZvaWQgU29mdFZQWDo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIC8qIHBvcnRJbmRleCAqLykgewogICAgIGlmIChtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlICE9IE5PTkUpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTEyMiw3MSArMTE2LDUxIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBpZiAodnB4X2NvZGVjX2RlY29kZSgKLSAgICAgICAgICAgICAgICAgICAgKHZweF9jb2RlY19jdHhfdCAqKW1DdHgsCi0gICAgICAgICAgICAgICAgICAgIGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIGluSGVhZGVyLT5uRmlsbGVkTGVuLAotICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAwKSkgewotICAgICAgICAgICAgQUxPR0UoIm9uMiBkZWNvZGVyIGZhaWxlZCB0byBkZWNvZGUgZnJhbWUuIik7CisgICAgICAgIGlmIChtSW1nID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmICh2cHhfY29kZWNfZGVjb2RlKAorICAgICAgICAgICAgICAgICAgICAgICAgKHZweF9jb2RlY19jdHhfdCAqKW1DdHgsCisgICAgICAgICAgICAgICAgICAgICAgICBpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXItPm5GaWxsZWRMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgMCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgib24yIGRlY29kZXIgZmFpbGVkIHRvIGRlY29kZSBmcmFtZS4iKTsKIAotICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOwotICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2cHhfY29kZWNfaXRlcl90IGl0ZXIgPSBOVUxMOworICAgICAgICAgICAgbUltZyA9IHZweF9jb2RlY19nZXRfZnJhbWUoKHZweF9jb2RlY19jdHhfdCAqKW1DdHgsICZpdGVyKTsKICAgICAgICAgfQogCi0gICAgICAgIHZweF9jb2RlY19pdGVyX3QgaXRlciA9IE5VTEw7Ci0gICAgICAgIHZweF9pbWFnZV90ICppbWcgPSB2cHhfY29kZWNfZ2V0X2ZyYW1lKCh2cHhfY29kZWNfY3R4X3QgKiltQ3R4LCAmaXRlcik7CisgICAgICAgIGlmIChtSW1nICE9IE5VTEwpIHsKKyAgICAgICAgICAgIENIRUNLX0VRKG1JbWctPmZtdCwgVlBYX0lNR19GTVRfSTQyMCk7CiAKLSAgICAgICAgaWYgKGltZyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBDSEVDS19FUShpbWctPmZtdCwgVlBYX0lNR19GTVRfSTQyMCk7Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoID0gaW1nLT5kX3c7Ci0gICAgICAgICAgICB1aW50MzJfdCBoZWlnaHQgPSBpbWctPmRfaDsKLQotICAgICAgICAgICAgaWYgKHdpZHRoICE9IG1XaWR0aCB8fCBoZWlnaHQgIT0gbUhlaWdodCkgewotICAgICAgICAgICAgICAgIG1XaWR0aCA9IHdpZHRoOwotICAgICAgICAgICAgICAgIG1IZWlnaHQgPSBoZWlnaHQ7Ci0KLSAgICAgICAgICAgICAgICB1cGRhdGVQb3J0RGVmaW5pdGlvbnMoKTsKLQotICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkLCAxLCAwLCBOVUxMKTsKLSAgICAgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRElTQUJMRUQ7CisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCA9IG1JbWctPmRfdzsKKyAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCA9IG1JbWctPmRfaDsKKyAgICAgICAgICAgIGJvb2wgcG9ydFdpbGxSZXNldCA9IGZhbHNlOworICAgICAgICAgICAgaGFuZGxlUG9ydFNldHRpbmdzQ2hhbmdlKCZwb3J0V2lsbFJlc2V0LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIGlmIChwb3J0V2lsbFJlc2V0KSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBvdXRIZWFkZXItPm5PZmZzZXQgPSAwOwotICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gKG1XaWR0aCAqIG1IZWlnaHQgKiAzKSAvIDI7CisgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAob3V0cHV0QnVmZmVyV2lkdGgoKSAqIG91dHB1dEJ1ZmZlckhlaWdodCgpICogMykgLyAyOwogICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBFT1NzZWVuID8gT01YX0JVRkZFUkZMQUdfRU9TIDogMDsKICAgICAgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9IGluSGVhZGVyLT5uVGltZVN0YW1wOwotCiAgICAgICAgICAgICBpZiAob3V0cHV0QnVmZmVyU2FmZShvdXRIZWFkZXIpKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjTGluZSA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbVlBYX1BMQU5FX1ldOwogICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCA9IG91dEhlYWRlci0+cEJ1ZmZlcjsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGltZy0+ZF9oOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGRzdCwgc3JjTGluZSwgaW1nLT5kX3cpOwotCi0gICAgICAgICAgICAgICAgICAgIHNyY0xpbmUgKz0gaW1nLT5zdHJpZGVbVlBYX1BMQU5FX1ldOwotICAgICAgICAgICAgICAgICAgICBkc3QgKz0gaW1nLT5kX3c7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3JjTGluZSA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbVlBYX1BMQU5FX1VdOwotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW1nLT5kX2ggLyAyOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGRzdCwgc3JjTGluZSwgaW1nLT5kX3cgLyAyKTsKLQotICAgICAgICAgICAgICAgICAgICBzcmNMaW5lICs9IGltZy0+c3RyaWRlW1ZQWF9QTEFORV9VXTsKLSAgICAgICAgICAgICAgICAgICAgZHN0ICs9IGltZy0+ZF93IC8gMjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzcmNMaW5lID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tWUFhfUExBTkVfVl07Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbWctPmRfaCAvIDI7ICsraSkgewotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoZHN0LCBzcmNMaW5lLCBpbWctPmRfdyAvIDIpOwotCi0gICAgICAgICAgICAgICAgICAgIHNyY0xpbmUgKz0gaW1nLT5zdHJpZGVbVlBYX1BMQU5FX1ZdOwotICAgICAgICAgICAgICAgICAgICBkc3QgKz0gaW1nLT5kX3cgLyAyOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNZID0gKGNvbnN0IHVpbnQ4X3QgKiltSW1nLT5wbGFuZXNbVlBYX1BMQU5FX1ldOworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1UgPSAoY29uc3QgdWludDhfdCAqKW1JbWctPnBsYW5lc1tWUFhfUExBTkVfVV07CisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjViA9IChjb25zdCB1aW50OF90ICopbUltZy0+cGxhbmVzW1ZQWF9QTEFORV9WXTsKKyAgICAgICAgICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSA9IG1JbWctPnN0cmlkZVtWUFhfUExBTkVfWV07CisgICAgICAgICAgICAgICAgc2l6ZV90IHNyY1VTdHJpZGUgPSBtSW1nLT5zdHJpZGVbVlBYX1BMQU5FX1VdOworICAgICAgICAgICAgICAgIHNpemVfdCBzcmNWU3RyaWRlID0gbUltZy0+c3RyaWRlW1ZQWF9QTEFORV9WXTsKKyAgICAgICAgICAgICAgICBjb3B5WVYxMkZyYW1lVG9PdXRwdXRCdWZmZXIoZHN0LCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlLCBzcmNVU3RyaWRlLCBzcmNWU3RyaWRlKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gMDsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUltZyA9IE5VTEw7CiAgICAgICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CiAgICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKICAgICAgICAgICAgIG91dEluZm8gPSBOVUxMOwpAQCAtMjAzLDggKzE3Nyw4IEBACiB9CiAKIGJvb2wgU29mdFZQWDo6b3V0cHV0QnVmZmVyU2FmZShPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyKSB7Ci0gICAgdWludDMyX3Qgd2lkdGggPSBtV2lkdGg7Ci0gICAgdWludDMyX3QgaGVpZ2h0ID0gbUhlaWdodDsKKyAgICB1aW50MzJfdCB3aWR0aCA9IG91dHB1dEJ1ZmZlcldpZHRoKCk7CisgICAgdWludDMyX3QgaGVpZ2h0ID0gb3V0cHV0QnVmZmVySGVpZ2h0KCk7CiAgICAgdWludDY0X3QgbkZpbGxlZExlbiA9IHdpZHRoOwogICAgIG5GaWxsZWRMZW4gKj0gaGVpZ2h0OwogICAgIGlmIChuRmlsbGVkTGVuID4gVUlOVDMyX01BWCAvIDMpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguaAppbmRleCA1ODAxYjRhLi5hMWI1NDhhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5oCkBAIC0yMCw2ICsyMCwxMCBAQAogCiAjaW5jbHVkZSAiU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oIgogCisjaW5jbHVkZSAidnB4L3ZweF9kZWNvZGVyLmgiCisjaW5jbHVkZSAidnB4L3ZweF9jb2RlYy5oIgorI2luY2x1ZGUgInZweC92cDhkeC5oIgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBTb2Z0VlBYIDogcHVibGljIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQgewpAQCAtNDcsNiArNTEsOCBAQAogCiAgICAgdm9pZCAqbUN0eDsKIAorICAgIHZweF9pbWFnZV90ICptSW1nOworCiAgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKICAgICBib29sIG91dHB1dEJ1ZmZlclNhZmUoT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlcik7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9BbmRyb2lkLm1rCmluZGV4IDQwNjBhMGEuLmUyNjUxMDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvQW5kcm9pZC5tawpAQCAtMTIsMTAgKzEyLDYgQEAKICAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKICAgICAgICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKIAotaWZlcSAoJChUQVJHRVRfREVWSUNFKSwgbWFudGEpCi0gICAgTE9DQUxfQ0ZMQUdTICs9IC1EU1VSRkFDRV9JU19CR1IzMgotZW5kaWYKLQogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCiAgICAgICAgIGxpYnZweAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5jcHAKaW5kZXggODBjMjlhYi4uYWRmOTA1OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmNwcApAQCAtMzEsNyArMzEsNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLQogdGVtcGxhdGU8Y2xhc3MgVD4KIHN0YXRpYyB2b2lkIEluaXRPTVhQYXJhbXMoVCAqcGFyYW1zKSB7CiAgICAgcGFyYW1zLT5uU2l6ZSA9IHNpemVvZihUKTsKQEAgLTU1LDEwNyArNTQsMzcgQEAKICAgICByZXR1cm4gY3B1Q29yZUNvdW50OwogfQogCi0KLS8vIFRoaXMgY29sb3IgY29udmVyc2lvbiB1dGlsaXR5IGlzIGNvcGllZCBmcm9tIFNvZnRNUEVHNEVuY29kZXIuY3BwCi1pbmxpbmUgc3RhdGljIHZvaWQgQ29udmVydFNlbWlQbGFuYXJUb1BsYW5hcih1aW50OF90ICppbnl1diwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG91dHl1diwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkgewotICAgIGludDMyX3Qgb3V0WXNpemUgPSB3aWR0aCAqIGhlaWdodDsKLSAgICB1aW50MzJfdCAqb3V0eSA9ICAodWludDMyX3QgKikgb3V0eXV2OwotICAgIHVpbnQxNl90ICpvdXRjYiA9ICh1aW50MTZfdCAqKSAob3V0eXV2ICsgb3V0WXNpemUpOwotICAgIHVpbnQxNl90ICpvdXRjciA9ICh1aW50MTZfdCAqKSAob3V0eXV2ICsgb3V0WXNpemUgKyAob3V0WXNpemUgPj4gMikpOwotCi0gICAgLyogWSBjb3B5aW5nICovCi0gICAgbWVtY3B5KG91dHksIGlueXV2LCBvdXRZc2l6ZSk7Ci0KLSAgICAvKiBVICYgViBjb3B5aW5nICovCi0gICAgdWludDMyX3QgKmlueXV2XzQgPSAodWludDMyX3QgKikgKGlueXV2ICsgb3V0WXNpemUpOwotICAgIGZvciAoaW50MzJfdCBpID0gaGVpZ2h0ID4+IDE7IGkgPiAwOyAtLWkpIHsKLSAgICAgICAgZm9yIChpbnQzMl90IGogPSB3aWR0aCA+PiAyOyBqID4gMDsgLS1qKSB7Ci0gICAgICAgICAgICB1aW50MzJfdCB0ZW1wID0gKmlueXV2XzQrKzsKLSAgICAgICAgICAgIHVpbnQzMl90IHRlbXBVID0gdGVtcCAmIDB4RkY7Ci0gICAgICAgICAgICB0ZW1wVSA9IHRlbXBVIHwgKCh0ZW1wID4+IDgpICYgMHhGRjAwKTsKLQotICAgICAgICAgICAgdWludDMyX3QgdGVtcFYgPSAodGVtcCA+PiA4KSAmIDB4RkY7Ci0gICAgICAgICAgICB0ZW1wViA9IHRlbXBWIHwgKCh0ZW1wID4+IDE2KSAmIDB4RkYwMCk7Ci0KLSAgICAgICAgICAgIC8vIEZsaXAgVSBhbmQgVgotICAgICAgICAgICAgKm91dGNiKysgPSB0ZW1wVjsKLSAgICAgICAgICAgICpvdXRjcisrID0gdGVtcFU7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIENvbnZlcnRSR0IzMlRvUGxhbmFyKAotICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdFksIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7Ci0gICAgQ0hFQ0soKHdpZHRoICYgMSkgPT0gMCk7Ci0gICAgQ0hFQ0soKGhlaWdodCAmIDEpID09IDApOwotCi0gICAgdWludDhfdCAqZHN0VSA9IGRzdFkgKyB3aWR0aCAqIGhlaWdodDsKLSAgICB1aW50OF90ICpkc3RWID0gZHN0VSArICh3aWR0aCAvIDIpICogKGhlaWdodCAvIDIpOwotCi0gICAgZm9yIChpbnQzMl90IHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKLSAgICAgICAgZm9yIChpbnQzMl90IHggPSAwOyB4IDwgd2lkdGg7ICsreCkgewotI2lmZGVmIFNVUkZBQ0VfSVNfQkdSMzIKLSAgICAgICAgICAgIHVuc2lnbmVkIGJsdWUgPSBzcmNbNCAqIHhdOwotICAgICAgICAgICAgdW5zaWduZWQgZ3JlZW4gPSBzcmNbNCAqIHggKyAxXTsKLSAgICAgICAgICAgIHVuc2lnbmVkIHJlZD0gc3JjWzQgKiB4ICsgMl07Ci0jZWxzZQotICAgICAgICAgICAgdW5zaWduZWQgcmVkPSBzcmNbNCAqIHhdOwotICAgICAgICAgICAgdW5zaWduZWQgZ3JlZW4gPSBzcmNbNCAqIHggKyAxXTsKLSAgICAgICAgICAgIHVuc2lnbmVkIGJsdWUgPSBzcmNbNCAqIHggKyAyXTsKLSNlbmRpZgotCi0gICAgICAgICAgICB1bnNpZ25lZCBsdW1hID0KLSAgICAgICAgICAgICAgICAoKHJlZCAqIDY2ICsgZ3JlZW4gKiAxMjkgKyBibHVlICogMjUpID4+IDgpICsgMTY7Ci0KLSAgICAgICAgICAgIGRzdFlbeF0gPSBsdW1hOwotCi0gICAgICAgICAgICBpZiAoKHggJiAxKSA9PSAwICYmICh5ICYgMSkgPT0gMCkgewotICAgICAgICAgICAgICAgIHVuc2lnbmVkIFUgPQotICAgICAgICAgICAgICAgICAgICAoKC1yZWQgKiAzOCAtIGdyZWVuICogNzQgKyBibHVlICogMTEyKSA+PiA4KSArIDEyODsKLQotICAgICAgICAgICAgICAgIHVuc2lnbmVkIFYgPQotICAgICAgICAgICAgICAgICAgICAoKHJlZCAqIDExMiAtIGdyZWVuICogOTQgLSBibHVlICogMTgpID4+IDgpICsgMTI4OwotCi0gICAgICAgICAgICAgICAgZHN0VVt4IC8gMl0gPSBVOwotICAgICAgICAgICAgICAgIGRzdFZbeCAvIDJdID0gVjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICgoeSAmIDEpID09IDApIHsKLSAgICAgICAgICAgIGRzdFUgKz0gd2lkdGggLyAyOwotICAgICAgICAgICAgZHN0ViArPSB3aWR0aCAvIDI7Ci0gICAgICAgIH0KLQotICAgICAgICBzcmMgKz0gNCAqIHdpZHRoOwotICAgICAgICBkc3RZICs9IHdpZHRoOwotICAgIH0KLX0KLQogU29mdFZQWEVuY29kZXI6OlNvZnRWUFhFbmNvZGVyKGNvbnN0IGNoYXIgKm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkKLSAgICA6IFNpbXBsZVNvZnRPTVhDb21wb25lbnQobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpLAorICAgIDogU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudChuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCksCiAgICAgICBtQ29kZWNDb250ZXh0KE5VTEwpLAogICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbihOVUxMKSwKICAgICAgIG1Db2RlY0ludGVyZmFjZShOVUxMKSwKICAgICAgIG1XaWR0aCgxNzYpLAogICAgICAgbUhlaWdodCgxNDQpLAogICAgICAgbUJpdHJhdGUoMTkyMDAwKSwgIC8vIGluIGJwcworICAgICAgbUZyYW1lcmF0ZSgzMCA8PCAxNiksIC8vIGluIFExNiBmb3JtYXQKICAgICAgIG1CaXRyYXRlVXBkYXRlZChmYWxzZSksCiAgICAgICBtQml0cmF0ZUNvbnRyb2xNb2RlKFZQWF9WQlIpLCAgLy8gdmFyaWFibGUgYml0cmF0ZQotICAgICAgbUZyYW1lRHVyYXRpb25VcygzMzMzMyksICAvLyBEZWZhdWx0cyB0byAzMCBmcHMKICAgICAgIG1EQ1RQYXJ0aXRpb25zKDApLAogICAgICAgbUVycm9yUmVzaWxpZW5jZShPTVhfRkFMU0UpLAogICAgICAgbUNvbG9yRm9ybWF0KE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpLAogICAgICAgbUxldmVsKE9NWF9WSURFT19WUDhMZXZlbF9WZXJzaW9uMCksCisgICAgICBtS2V5RnJhbWVJbnRlcnZhbCgwKSwKKyAgICAgIG1NaW5RdWFudGl6ZXIoMCksCisgICAgICBtTWF4UXVhbnRpemVyKDApLAorICAgICAgbVRlbXBvcmFsTGF5ZXJzKDApLAorICAgICAgbVRlbXBvcmFsUGF0dGVyblR5cGUoT01YX1ZJREVPX1ZQWFRlbXBvcmFsTGF5ZXJQYXR0ZXJuTm9uZSksCisgICAgICBtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoKDApLAorICAgICAgbVRlbXBvcmFsUGF0dGVybklkeCgwKSwKKyAgICAgIG1MYXN0VGltZXN0YW1wKDB4N0ZGRkZGRkZGRkZGRkZGRkxMKSwKICAgICAgIG1Db252ZXJzaW9uQnVmZmVyKE5VTEwpLAogICAgICAgbUlucHV0RGF0YUlzTWV0YShmYWxzZSksCi0gICAgICBtR3JhbGxvY01vZHVsZShOVUxMKSwKICAgICAgIG1LZXlGcmFtZVJlcXVlc3RlZChmYWxzZSkgeworICAgIG1lbXNldChtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpbywgMCwgc2l6ZW9mKG1UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvKSk7CisgICAgbVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9bMF0gPSAxMDA7CiAgICAgaW5pdFBvcnRzKCk7CiB9CiAKQEAgLTE4NCw5ICsxMTMsOCBAQAogICAgIGlucHV0UG9ydC5mb3JtYXQudmlkZW8ublN0cmlkZSA9IGlucHV0UG9ydC5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGg7CiAgICAgaW5wdXRQb3J0LmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgPSBpbnB1dFBvcnQuZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKICAgICBpbnB1dFBvcnQuZm9ybWF0LnZpZGVvLm5CaXRyYXRlID0gMDsKLSAgICAvLyBmcmFtZVJhdGUgaXMgcmVjaXByb2NhbCBvZiBmcmFtZUR1cmF0aW9uLCB3aGljaCBpcwotICAgIC8vIGluIG1pY3Jvc2Vjb25kcy4gSXQgaXMgYWxzbyBpbiBRMTYgZm9ybWF0LgotICAgIGlucHV0UG9ydC5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZSA9ICgxMDAwMDAwL21GcmFtZUR1cmF0aW9uVXMpIDw8IDE2OworICAgIC8vIGZyYW1lUmF0ZSBpcyBpbiBRMTYgZm9ybWF0LgorICAgIGlucHV0UG9ydC5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZSA9IG1GcmFtZXJhdGU7CiAgICAgaW5wdXRQb3J0LmZvcm1hdC52aWRlby5iRmxhZ0Vycm9yQ29uY2VhbG1lbnQgPSBPTVhfRkFMU0U7CiAgICAgaW5wdXRQb3J0Lm5Qb3J0SW5kZXggPSBrSW5wdXRQb3J0SW5kZXg7CiAgICAgaW5wdXRQb3J0LmVEaXIgPSBPTVhfRGlySW5wdXQ7CkBAIC0yMjQsNyArMTUyLDcgQEAKICAgICBvdXRwdXRQb3J0LmZvcm1hdC52aWRlby5lQ29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nVlA4OwogICAgIG91dHB1dFBvcnQuZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRVbnVzZWQ7CiAgICAgb3V0cHV0UG9ydC5mb3JtYXQudmlkZW8ucE5hdGl2ZVdpbmRvdyA9IE5VTEw7Ci0gICAgb3V0cHV0UG9ydC5uQnVmZmVyU2l6ZSA9IDI1NiAqIDEwMjQ7ICAvLyBhcmJpdHJhcnkKKyAgICBvdXRwdXRQb3J0Lm5CdWZmZXJTaXplID0gMTAyNCAqIDEwMjQ7IC8vIGFyYml0cmFyeQogCiAgICAgYWRkUG9ydChvdXRwdXRQb3J0KTsKIH0KQEAgLTI0MCw3ICsxNjgsOSBAQAogICAgIGlmIChtQ29kZWNJbnRlcmZhY2UgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9Ci0KKyAgICBBTE9HRCgiVlA4OiBpbml0RW5jb2Rlci4gQlJNb2RlOiAldS4gVFNMYXllcnM6ICV6dS4gS0Y6ICV1LiBRUDogJXUgLSAldSIsCisgICAgICAgICAgKHVpbnQzMl90KW1CaXRyYXRlQ29udHJvbE1vZGUsIG1UZW1wb3JhbExheWVycywgbUtleUZyYW1lSW50ZXJ2YWwsCisgICAgICAgICAgbU1pblF1YW50aXplciwgbU1heFF1YW50aXplcik7CiAgICAgY29kZWNfcmV0dXJuID0gdnB4X2NvZGVjX2VuY19jb25maWdfZGVmYXVsdChtQ29kZWNJbnRlcmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7ICAvLyBDb2RlYyBzcGVjaWZpYyBmbGFncwpAQCAtMjgxLDggKzIxMSwxMjAgQEAKICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3RpbWViYXNlLm51bSA9IDE7CiAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z190aW1lYmFzZS5kZW4gPSAxMDAwMDAwOwogICAgIC8vIHJjX3RhcmdldF9iaXRyYXRlIGlzIGluIGticHMsIG1CaXRyYXRlIGluIGJwcwotICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX3RhcmdldF9iaXRyYXRlID0gbUJpdHJhdGUvMTAwMDsKKyAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY190YXJnZXRfYml0cmF0ZSA9IChtQml0cmF0ZSArIDUwMCkgLyAxMDAwOwogICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX2VuZF91c2FnZSA9IG1CaXRyYXRlQ29udHJvbE1vZGU7CisgICAgLy8gRGlzYWJsZSBmcmFtZSBkcm9wIC0gbm90IGFsbG93ZWQgaW4gTWVkaWFDb2RlYyBub3cuCisgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfZHJvcGZyYW1lX3RocmVzaCA9IDA7CisgICAgaWYgKG1CaXRyYXRlQ29udHJvbE1vZGUgPT0gVlBYX0NCUikgeworICAgICAgICAvLyBEaXNhYmxlIHNwYXRpYWwgcmVzaXppbmcuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX3Jlc2l6ZV9hbGxvd2VkID0gMDsKKyAgICAgICAgLy8gU2luZ2xlLXBhc3MgbW9kZS4KKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19wYXNzID0gVlBYX1JDX09ORV9QQVNTOworICAgICAgICAvLyBNYXhpbXVtIGFtb3VudCBvZiBiaXRzIHRoYXQgY2FuIGJlIHN1YnRyYWN0ZWQgZnJvbSB0aGUgdGFyZ2V0CisgICAgICAgIC8vIGJpdHJhdGUgLSBleHByZXNzZWQgYXMgcGVyY2VudGFnZSBvZiB0aGUgdGFyZ2V0IGJpdHJhdGUuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX3VuZGVyc2hvb3RfcGN0ID0gMTAwOworICAgICAgICAvLyBNYXhpbXVtIGFtb3VudCBvZiBiaXRzIHRoYXQgY2FuIGJlIGFkZGVkIHRvIHRoZSB0YXJnZXQKKyAgICAgICAgLy8gYml0cmF0ZSAtIGV4cHJlc3NlZCBhcyBwZXJjZW50YWdlIG9mIHRoZSB0YXJnZXQgYml0cmF0ZS4KKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfb3ZlcnNob290X3BjdCA9IDE1OworICAgICAgICAvLyBJbml0aWFsIHZhbHVlIG9mIHRoZSBidWZmZXIgbGV2ZWwgaW4gbXMuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX2J1Zl9pbml0aWFsX3N6ID0gNTAwOworICAgICAgICAvLyBBbW91bnQgb2YgZGF0YSB0aGF0IHRoZSBlbmNvZGVyIHNob3VsZCB0cnkgdG8gbWFpbnRhaW4gaW4gbXMuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX2J1Zl9vcHRpbWFsX3N6ID0gNjAwOworICAgICAgICAvLyBUaGUgYW1vdW50IG9mIGRhdGEgdGhhdCBtYXkgYmUgYnVmZmVyZWQgYnkgdGhlIGRlY29kaW5nCisgICAgICAgIC8vIGFwcGxpY2F0aW9uIGluIG1zLgorICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19idWZfc3ogPSAxMDAwOworICAgICAgICAvLyBFbmFibGUgZXJyb3IgcmVzaWxpZW5jZSAtIG5lZWRlZCBmb3IgcGFja2V0IGxvc3MuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfZXJyb3JfcmVzaWxpZW50ID0gMTsKKyAgICAgICAgLy8gRGlzYWJsZSBsYWdnZWQgZW5jb2RpbmcuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfbGFnX2luX2ZyYW1lcyA9IDA7CisgICAgICAgIC8vIE1heGltdW0ga2V5IGZyYW1lIGludGVydmFsIC0gZm9yIENCUiBib29zdCB0byAzMDAwCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmtmX21heF9kaXN0ID0gMzAwMDsKKyAgICAgICAgLy8gRW5jb2RlciBkZXRlcm1pbmVzIG9wdGltYWwga2V5IGZyYW1lIHBsYWNlbWVudCBhdXRvbWF0aWNhbGx5LgorICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5rZl9tb2RlID0gVlBYX0tGX0FVVE87CisgICAgfQorCisgICAgLy8gRnJhbWVzIHRlbXBvcmFsIHBhdHRlcm4gLSBmb3Igbm93IFdlYlJUQyBsaWtlIHBhdHRlcm4gaXMgb25seSBzdXBwb3J0ZWQuCisgICAgc3dpdGNoIChtVGVtcG9yYWxMYXllcnMpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICB7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgeworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbnVtYmVyX2xheWVycyA9IDE7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19yYXRlX2RlY2ltYXRvclswXSA9IDE7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19wZXJpb2RpY2l0eSA9IDE7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19sYXllcl9pZFswXSA9IDA7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzBdID0ga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsbDsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5MZW5ndGggPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSAyOgorICAgICAgICB7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19udW1iZXJfbGF5ZXJzID0gMjsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3JhdGVfZGVjaW1hdG9yWzBdID0gMjsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3JhdGVfZGVjaW1hdG9yWzFdID0gMTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3BlcmlvZGljaXR5ID0gMjsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzBdID0gMDsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzFdID0gMTsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bMF0gPSBrVGVtcG9yYWxVcGRhdGVMYXN0QW5kR29sZGVuUmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblsxXSA9IGtUZW1wb3JhbFVwZGF0ZUdvbGRlbldpdGhvdXREZXBlbmRlbmN5UmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblsyXSA9IGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzNdID0ga1RlbXBvcmFsVXBkYXRlR29sZGVuUmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybls0XSA9IGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzVdID0ga1RlbXBvcmFsVXBkYXRlR29sZGVuUmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybls2XSA9IGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzddID0ga1RlbXBvcmFsVXBkYXRlTm9uZTsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5MZW5ndGggPSA4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSAzOgorICAgICAgICB7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19udW1iZXJfbGF5ZXJzID0gMzsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3JhdGVfZGVjaW1hdG9yWzBdID0gNDsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3JhdGVfZGVjaW1hdG9yWzFdID0gMjsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3JhdGVfZGVjaW1hdG9yWzJdID0gMTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3BlcmlvZGljaXR5ID0gNDsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzBdID0gMDsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzFdID0gMjsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzJdID0gMTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzNdID0gMjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bMF0gPSBrVGVtcG9yYWxVcGRhdGVMYXN0QW5kR29sZGVuUmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblsxXSA9IGtUZW1wb3JhbFVwZGF0ZU5vbmVOb1JlZkdvbGRlblJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bMl0gPSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5XaXRob3V0RGVwZW5kZW5jeVJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bM10gPSBrVGVtcG9yYWxVcGRhdGVOb25lOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybls0XSA9IGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzVdID0ga1RlbXBvcmFsVXBkYXRlTm9uZTsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bNl0gPSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5SZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzddID0ga1RlbXBvcmFsVXBkYXRlTm9uZTsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5MZW5ndGggPSA4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgQUxPR0UoIldyb25nIG51bWJlciBvZiB0ZW1wb3JhbCBsYXllcnMgJXp1IiwgbVRlbXBvcmFsTGF5ZXJzKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gU2V0IGJpdHJhdGUgdmFsdWVzIGZvciBlYWNoIGxheWVyCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29kZWNDb25maWd1cmF0aW9uLT50c19udW1iZXJfbGF5ZXJzOyBpKyspIHsKKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfdGFyZ2V0X2JpdHJhdGVbaV0gPQorICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfdGFyZ2V0X2JpdHJhdGUgKgorICAgICAgICAgICAgbVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9baV0gLyAxMDA7CisgICAgfQorICAgIGlmIChtS2V5RnJhbWVJbnRlcnZhbCA+IDApIHsKKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+a2ZfbWF4X2Rpc3QgPSBtS2V5RnJhbWVJbnRlcnZhbDsKKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+a2ZfbWluX2Rpc3QgPSBtS2V5RnJhbWVJbnRlcnZhbDsKKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+a2ZfbW9kZSA9IFZQWF9LRl9BVVRPOworICAgIH0KKyAgICBpZiAobU1pblF1YW50aXplciA+IDApIHsKKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfbWluX3F1YW50aXplciA9IG1NaW5RdWFudGl6ZXI7CisgICAgfQorICAgIGlmIChtTWF4UXVhbnRpemVyID4gMCkgeworICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19tYXhfcXVhbnRpemVyID0gbU1heFF1YW50aXplcjsKKyAgICB9CiAKICAgICBjb2RlY19yZXR1cm4gPSB2cHhfY29kZWNfZW5jX2luaXQobUNvZGVjQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjSW50ZXJmYWNlLApAQCAtMzAyLDE3ICszNDQsNDQgQEAKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogCi0gICAgaWYgKG1Db2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hciB8fCBtSW5wdXREYXRhSXNNZXRhKSB7CisgICAgLy8gRXh0cmEgQ0JSIHNldHRpbmdzCisgICAgaWYgKG1CaXRyYXRlQ29udHJvbE1vZGUgPT0gVlBYX0NCUikgeworICAgICAgICBjb2RlY19yZXR1cm4gPSB2cHhfY29kZWNfY29udHJvbChtQ29kZWNDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhFX1NFVF9TVEFUSUNfVEhSRVNIT0xELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICAgICAgaWYgKGNvZGVjX3JldHVybiA9PSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHJjX21heF9pbnRyYV90YXJnZXQgPQorICAgICAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX2J1Zl9vcHRpbWFsX3N6ICogKG1GcmFtZXJhdGUgPj4gMTcpIC8gMTA7CisgICAgICAgICAgICAvLyBEb24ndCBnbyBiZWxvdyAzIHRpbWVzIHBlciBmcmFtZSBiYW5kd2lkdGguCisgICAgICAgICAgICBpZiAocmNfbWF4X2ludHJhX3RhcmdldCA8IDMwMCkgeworICAgICAgICAgICAgICAgIHJjX21heF9pbnRyYV90YXJnZXQgPSAzMDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb2RlY19yZXR1cm4gPSB2cHhfY29kZWNfY29udHJvbChtQ29kZWNDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4RV9TRVRfTUFYX0lOVFJBX0JJVFJBVEVfUENULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNfbWF4X2ludHJhX3RhcmdldCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvZGVjX3JldHVybiA9PSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgICAgIGNvZGVjX3JldHVybiA9IHZweF9jb2RlY19jb250cm9sKG1Db2RlY0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhFX1NFVF9DUFVVU0VELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTgpOworICAgICAgICB9CisgICAgICAgIGlmIChjb2RlY19yZXR1cm4gIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiRXJyb3Igc2V0dGluZyBjYnIgcGFyYW1ldGVycyBmb3IgdnB4IGVuY29kZXIuIik7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtQ29sb3JGb3JtYXQgIT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hciB8fCBtSW5wdXREYXRhSXNNZXRhKSB7CisgICAgICAgIGZyZWUobUNvbnZlcnNpb25CdWZmZXIpOworICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlciA9IE5VTEw7CisgICAgICAgIGlmICgoKHVpbnQ2NF90KW1XaWR0aCAqIG1IZWlnaHQpID4gKCh1aW50NjRfdClJTlQzMl9NQVggLyAzKSkgeworICAgICAgICAgICAgQUxPR0UoImIvMjU4MTI3OTQsIEJ1ZmZlciBzaXplIGlzIHRvbyBiaWcuIik7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlciA9ICh1aW50OF90ICopbWFsbG9jKG1XaWR0aCAqIG1IZWlnaHQgKiAzIC8gMik7CiAgICAgICAgIGlmIChtQ29udmVyc2lvbkJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBpZiAoKCh1aW50NjRfdCltV2lkdGggKiBtSGVpZ2h0KSA+ICgodWludDY0X3QpSU5UMzJfTUFYIC8gMykpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYi8yNTgxMjc5NCwgQnVmZmVyIHNpemUgaXMgdG9vIGJpZy4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyID0gKHVpbnQ4X3QgKiltYWxsb2MobVdpZHRoICogbUhlaWdodCAqIDMgLyAyKTsKLSAgICAgICAgICAgIGlmIChtQ29udmVyc2lvbkJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkFsbG9jYXRpbmcgY29udmVyc2lvbiBidWZmZXIgZmFpbGVkLiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR0UoIkFsbG9jYXRpbmcgY29udmVyc2lvbiBidWZmZXIgZmFpbGVkLiIpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIE9LOwpAQCAtMzMyLDcgKzQwMSw3IEBACiAgICAgfQogCiAgICAgaWYgKG1Db252ZXJzaW9uQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIG1Db252ZXJzaW9uQnVmZmVyOworICAgICAgICBmcmVlKG1Db252ZXJzaW9uQnVmZmVyKTsKICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXIgPSBOVUxMOwogICAgIH0KIApAQCAtMzczLDkgKzQ0Miw3IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT5lQ29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nVW51c2VkOwotICAgICAgICAgICAgICAgIC8vIENvbnZlcnRpbmcgZnJvbSBtaWNyb3NlY29uZHMKLSAgICAgICAgICAgICAgICAvLyBBbHNvIGNvbnZlcnRpbmcgdG8gUTE2IGZvcm1hdAotICAgICAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+eEZyYW1lcmF0ZSA9ICgxMDAwMDAwL21GcmFtZUR1cmF0aW9uVXMpIDw8IDE2OworICAgICAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+eEZyYW1lcmF0ZSA9IG1GcmFtZXJhdGU7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSBrT3V0cHV0UG9ydEluZGV4KSB7CiAgICAgICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT5lQ29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nVlA4OwpAQCAtNDMxLDYgKzQ5OCwyOCBAQAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9BbmRyb2lkVnA4RW5jb2RlcjogeworICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX0FORFJPSURfVlA4RU5DT0RFUlRZUEUgKnZwOEFuZHJvaWRQYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfVklERU9fUEFSQU1fQU5EUk9JRF9WUDhFTkNPREVSVFlQRSAqKXBhcmFtOworCisgICAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0odnA4QW5kcm9pZFBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodnA4QW5kcm9pZFBhcmFtcy0+blBvcnRJbmRleCAhPSBrT3V0cHV0UG9ydEluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZEluZGV4OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZwOEFuZHJvaWRQYXJhbXMtPm5LZXlGcmFtZUludGVydmFsID0gbUtleUZyYW1lSW50ZXJ2YWw7CisgICAgICAgICAgICAgICAgdnA4QW5kcm9pZFBhcmFtcy0+ZVRlbXBvcmFsUGF0dGVybiA9IG1UZW1wb3JhbFBhdHRlcm5UeXBlOworICAgICAgICAgICAgICAgIHZwOEFuZHJvaWRQYXJhbXMtPm5UZW1wb3JhbExheWVyQ291bnQgPSBtVGVtcG9yYWxMYXllcnM7CisgICAgICAgICAgICAgICAgdnA4QW5kcm9pZFBhcmFtcy0+bk1pblF1YW50aXplciA9IG1NaW5RdWFudGl6ZXI7CisgICAgICAgICAgICAgICAgdnA4QW5kcm9pZFBhcmFtcy0+bk1heFF1YW50aXplciA9IG1NYXhRdWFudGl6ZXI7CisgICAgICAgICAgICAgICAgbWVtY3B5KHZwOEFuZHJvaWRQYXJhbXMtPm5UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvLAorICAgICAgICAgICAgICAgICAgICAgICBtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpbywgc2l6ZW9mKG1UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9Qcm9maWxlTGV2ZWxRdWVyeVN1cHBvcnRlZDogewogICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgKnByb2ZpbGVBbmRMZXZlbCA9CiAgICAgICAgICAgICAgICAgKE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFICopcGFyYW07CkBAIC01NjgsNyArNjU3LDExIEBACiAgICAgICAgICAgICByZXR1cm4gaW50ZXJuYWxTZXRQcm9maWxlTGV2ZWwodnA4UGFyYW1zKTsKICAgICAgICAgfQogCi0gICAgICAgIGNhc2UgT01YX0luZGV4VmVuZG9yU3RhcnRVbnVzZWQ6CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb0FuZHJvaWRWcDhFbmNvZGVyOgorICAgICAgICAgICAgcmV0dXJuIGludGVybmFsU2V0QW5kcm9pZFZwOFBhcmFtcygKKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX1ZJREVPX1BBUkFNX0FORFJPSURfVlA4RU5DT0RFUlRZUEUgKilwYXJhbSk7CisKKyAgICAgICAgY2FzZSBrU3RvcmVNZXRhRGF0YUV4dGVuc2lvbkluZGV4OgogICAgICAgICB7CiAgICAgICAgICAgICAvLyBzdG9yZU1ldGFEYXRhSW5CdWZmZXJzCiAgICAgICAgICAgICBjb25zdCBTdG9yZU1ldGFEYXRhSW5CdWZmZXJzUGFyYW1zICpzdG9yZVBhcmFtID0KQEAgLTYzOSw2ICs3MzIsMTEgQEAKIAogT01YX0VSUk9SVFlQRSBTb2Z0VlBYRW5jb2Rlcjo6aW50ZXJuYWxTZXRQcm9maWxlTGV2ZWwoCiAgICAgICAgIGNvbnN0IE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFKiBwcm9maWxlQW5kTGV2ZWwpIHsKKworICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKHByb2ZpbGVBbmRMZXZlbCkpIHsKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICB9CisKICAgICBpZiAocHJvZmlsZUFuZExldmVsLT5uUG9ydEluZGV4ICE9IGtPdXRwdXRQb3J0SW5kZXgpIHsKICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7CiAgICAgfQpAQCAtNjg5LDYgKzc4Nyw1NSBAQAogICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogfQogCitPTVhfRVJST1JUWVBFIFNvZnRWUFhFbmNvZGVyOjppbnRlcm5hbFNldEFuZHJvaWRWcDhQYXJhbXMoCisgICAgICAgIGNvbnN0IE9NWF9WSURFT19QQVJBTV9BTkRST0lEX1ZQOEVOQ09ERVJUWVBFKiB2cDhBbmRyb2lkUGFyYW1zKSB7CisKKyAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbSh2cDhBbmRyb2lkUGFyYW1zKSkgeworICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgIH0KKworICAgIGlmICh2cDhBbmRyb2lkUGFyYW1zLT5uUG9ydEluZGV4ICE9IGtPdXRwdXRQb3J0SW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7CisgICAgfQorICAgIGlmICh2cDhBbmRyb2lkUGFyYW1zLT5lVGVtcG9yYWxQYXR0ZXJuICE9IE9NWF9WSURFT19WUFhUZW1wb3JhbExheWVyUGF0dGVybk5vbmUgJiYKKyAgICAgICAgdnA4QW5kcm9pZFBhcmFtcy0+ZVRlbXBvcmFsUGF0dGVybiAhPSBPTVhfVklERU9fVlBYVGVtcG9yYWxMYXllclBhdHRlcm5XZWJSVEMpIHsKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICB9CisgICAgaWYgKHZwOEFuZHJvaWRQYXJhbXMtPm5UZW1wb3JhbExheWVyQ291bnQgPiBPTVhfVklERU9fQU5EUk9JRF9NQVhWUDhURU1QT1JBTExBWUVSUykgeworICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgIH0KKyAgICBpZiAodnA4QW5kcm9pZFBhcmFtcy0+bk1pblF1YW50aXplciA+IHZwOEFuZHJvaWRQYXJhbXMtPm5NYXhRdWFudGl6ZXIpIHsKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICB9CisKKyAgICBtVGVtcG9yYWxQYXR0ZXJuVHlwZSA9IHZwOEFuZHJvaWRQYXJhbXMtPmVUZW1wb3JhbFBhdHRlcm47CisgICAgaWYgKHZwOEFuZHJvaWRQYXJhbXMtPmVUZW1wb3JhbFBhdHRlcm4gPT0gT01YX1ZJREVPX1ZQWFRlbXBvcmFsTGF5ZXJQYXR0ZXJuV2ViUlRDKSB7CisgICAgICAgIG1UZW1wb3JhbExheWVycyA9IHZwOEFuZHJvaWRQYXJhbXMtPm5UZW1wb3JhbExheWVyQ291bnQ7CisgICAgfSBlbHNlIGlmICh2cDhBbmRyb2lkUGFyYW1zLT5lVGVtcG9yYWxQYXR0ZXJuID09IE9NWF9WSURFT19WUFhUZW1wb3JhbExheWVyUGF0dGVybk5vbmUpIHsKKyAgICAgICAgbVRlbXBvcmFsTGF5ZXJzID0gMDsKKyAgICB9CisgICAgLy8gQ2hlY2sgdGhlIGJpdHJhdGUgZGlzdHJpYnV0aW9uIGJldHdlZW4gbGF5ZXJzIGlzIGluIGluY3JlYXNpbmcgb3JkZXIKKyAgICBpZiAobVRlbXBvcmFsTGF5ZXJzID4gMSkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UZW1wb3JhbExheWVycyAtIDE7IGkrKykgeworICAgICAgICAgICAgaWYgKHZwOEFuZHJvaWRQYXJhbXMtPm5UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvW2kgKyAxXSA8PQorICAgICAgICAgICAgICAgICAgICB2cDhBbmRyb2lkUGFyYW1zLT5uVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpb1tpXSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJXcm9uZyBiaXRyYXRlIHJhdGlvIC0gc2hvdWxkIGJlIGluIGluY3JlYXNpbmcgb3JkZXIuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtS2V5RnJhbWVJbnRlcnZhbCA9IHZwOEFuZHJvaWRQYXJhbXMtPm5LZXlGcmFtZUludGVydmFsOworICAgIG1NaW5RdWFudGl6ZXIgPSB2cDhBbmRyb2lkUGFyYW1zLT5uTWluUXVhbnRpemVyOworICAgIG1NYXhRdWFudGl6ZXIgPSB2cDhBbmRyb2lkUGFyYW1zLT5uTWF4UXVhbnRpemVyOworICAgIG1lbWNweShtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpbywgdnA4QW5kcm9pZFBhcmFtcy0+blRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW8sCisgICAgICAgICAgICBzaXplb2YobVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW8pKTsKKyAgICBBTE9HRCgiVlA4OiBpbnRlcm5hbFNldEFuZHJvaWRWcDhQYXJhbXMuIEJSTW9kZTogJXUuIFRTOiAlenUuIEtGOiAldS4iCisgICAgICAgICAgIiBRUDogJXUgLSAldSBCUjA6ICV1LiBCUjE6ICV1LiBCUjI6ICV1IiwKKyAgICAgICAgICAodWludDMyX3QpbUJpdHJhdGVDb250cm9sTW9kZSwgbVRlbXBvcmFsTGF5ZXJzLCBtS2V5RnJhbWVJbnRlcnZhbCwKKyAgICAgICAgICBtTWluUXVhbnRpemVyLCBtTWF4UXVhbnRpemVyLCBtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpb1swXSwKKyAgICAgICAgICBtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpb1sxXSwgbVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9bMl0pOworICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworfQogCiBPTVhfRVJST1JUWVBFIFNvZnRWUFhFbmNvZGVyOjppbnRlcm5hbFNldEZvcm1hdFBhcmFtcygKICAgICAgICAgY29uc3QgT01YX1ZJREVPX1BBUkFNX1BPUlRGT1JNQVRUWVBFKiBmb3JtYXQpIHsKQEAgLTczOSw5ICs4ODYsNyBAQAogICAgICAgICBtSGVpZ2h0ID0gcG9ydC0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKIAogICAgICAgICAvLyB4RnJhbWVyYXRlIGNvbWVzIGluIFExNiBmb3JtYXQsIGluIGZyYW1lcyBwZXIgc2Vjb25kIHVuaXQKLSAgICAgICAgY29uc3QgdWludDMyX3QgZnJhbWVyYXRlID0gcG9ydC0+Zm9ybWF0LnZpZGVvLnhGcmFtZXJhdGUgPj4gMTY7Ci0gICAgICAgIC8vIGZyYW1lIGR1cmF0aW9uIGlzIGluIG1pY3Jvc2Vjb25kcwotICAgICAgICBtRnJhbWVEdXJhdGlvblVzID0gKDEwMDAwMDAvZnJhbWVyYXRlKTsKKyAgICAgICAgbUZyYW1lcmF0ZSA9IHBvcnQtPmZvcm1hdC52aWRlby54RnJhbWVyYXRlOwogCiAgICAgICAgIGlmIChwb3J0LT5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIgfHwKICAgICAgICAgICAgIHBvcnQtPmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIgfHwKQEAgLTc1NCwxMiArODk5LDIyIEBACiAgICAgICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKmRlZiA9ICZlZGl0UG9ydEluZm8oa0lucHV0UG9ydEluZGV4KS0+bURlZjsKICAgICAgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBtV2lkdGg7CiAgICAgICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG1IZWlnaHQ7Ci0gICAgICAgIGRlZi0+Zm9ybWF0LnZpZGVvLnhGcmFtZXJhdGUgPSBwb3J0LT5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZTsKKyAgICAgICAgZGVmLT5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZSA9IG1GcmFtZXJhdGU7CiAgICAgICAgIGRlZi0+Zm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9IG1Db2xvckZvcm1hdDsKKyAgICAgICAgZGVmID0gJmVkaXRQb3J0SW5mbyhrT3V0cHV0UG9ydEluZGV4KS0+bURlZjsKKyAgICAgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBtV2lkdGg7CisgICAgICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG1IZWlnaHQ7CiAKICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgfSBlbHNlIGlmIChwb3J0LT5uUG9ydEluZGV4ID09IGtPdXRwdXRQb3J0SW5kZXgpIHsKICAgICAgICAgbUJpdHJhdGUgPSBwb3J0LT5mb3JtYXQudmlkZW8ubkJpdHJhdGU7CisgICAgICAgIG1XaWR0aCA9IHBvcnQtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aDsKKyAgICAgICAgbUhlaWdodCA9IHBvcnQtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ7CisKKyAgICAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqZGVmID0gJmVkaXRQb3J0SW5mbyhrT3V0cHV0UG9ydEluZGV4KS0+bURlZjsKKyAgICAgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBtV2lkdGg7CisgICAgICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG1IZWlnaHQ7CisgICAgICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5CaXRyYXRlID0gbUJpdHJhdGU7CiAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CkBAIC03ODYsNiArOTQxLDc0IEBACiAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiB9CiAKK3ZweF9lbmNfZnJhbWVfZmxhZ3NfdCBTb2Z0VlBYRW5jb2Rlcjo6Z2V0RW5jb2RlRmxhZ3MoKSB7CisgICAgdnB4X2VuY19mcmFtZV9mbGFnc190IGZsYWdzID0gMDsKKyAgICBpbnQgcGF0dGVybklkeCA9IG1UZW1wb3JhbFBhdHRlcm5JZHggJSBtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoOworICAgIG1UZW1wb3JhbFBhdHRlcm5JZHgrKzsKKyAgICBzd2l0Y2ggKG1UZW1wb3JhbFBhdHRlcm5bcGF0dGVybklkeF0pIHsKKyAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVMYXN0OgorICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9HRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9HRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfQVJGOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlR29sZGVuV2l0aG91dERlcGVuZGVuY3k6CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0dGOworICAgICAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IG5vIGJyZWFrIGhlcmUuCisgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlR29sZGVuOgorICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9BUkY7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfTEFTVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUFsdHJlZldpdGhvdXREZXBlbmRlbmN5OgorICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9BUkY7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0dGOworICAgICAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IG5vIGJyZWFrIGhlcmUuCisgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlQWx0cmVmOgorICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9HRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfTEFTVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZU5vbmVOb1JlZkFsdHJlZjoKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfQVJGOworICAgICAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IG5vIGJyZWFrIGhlcmUuCisgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlTm9uZToKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfR0Y7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfTEFTVDsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfRU5UUk9QWTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZU5vbmVOb1JlZkdvbGRlblJlZkFsdFJlZjoKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfR0Y7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0dGOworICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0xBU1Q7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0VOVFJPUFk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5XaXRob3V0RGVwZW5kZW5jeVJlZkFsdFJlZjoKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfR0Y7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfTEFTVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbHRSZWY6CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0dGOworICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0dGOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlR29sZGVuUmVmQWx0UmVmOgorICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0xBU1Q7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVMYXN0QW5kR29sZGVuUmVmQWx0UmVmOgorICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0dGOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsbDoKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9HRjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gZmxhZ3M7Cit9CiAKIHZvaWQgU29mdFZQWEVuY29kZXI6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKICAgICAvLyBJbml0aWFsaXplIGVuY29kZXIgaWYgbm90IGFscmVhZHkKQEAgLTgyNSw0MSArMTA0OCwyMCBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgdWludDhfdCAqc291cmNlID0KKyAgICAgICAgY29uc3QgdWludDhfdCAqc291cmNlID0KICAgICAgICAgICAgIGlucHV0QnVmZmVySGVhZGVyLT5wQnVmZmVyICsgaW5wdXRCdWZmZXJIZWFkZXItPm5PZmZzZXQ7CiAKICAgICAgICAgc2l6ZV90IGZyYW1lU2l6ZSA9IG1XaWR0aCAqIG1IZWlnaHQgKiAzIC8gMjsKICAgICAgICAgaWYgKG1JbnB1dERhdGFJc01ldGEpIHsKLSAgICAgICAgICAgIENIRUNLX0dFKGlucHV0QnVmZmVySGVhZGVyLT5uRmlsbGVkTGVuLAotICAgICAgICAgICAgICAgICAgICAgNCArIHNpemVvZihidWZmZXJfaGFuZGxlX3QpKTsKLQotICAgICAgICAgICAgdWludDMyX3QgYnVmZmVyVHlwZSA9ICoodWludDMyX3QgKilzb3VyY2U7Ci0gICAgICAgICAgICBDSEVDS19FUShidWZmZXJUeXBlLCBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSk7Ci0KLSAgICAgICAgICAgIGlmIChtR3JhbGxvY01vZHVsZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfRVEoMCwgaHdfZ2V0X21vZHVsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUkFMTE9DX0hBUkRXQVJFX01PRFVMRV9JRCwgJm1HcmFsbG9jTW9kdWxlKSk7CisgICAgICAgICAgICBzb3VyY2UgPSBleHRyYWN0R3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXIsIGZyYW1lU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgc291cmNlLCBpbnB1dEJ1ZmZlckhlYWRlci0+bkZpbGxlZExlbiwKKyAgICAgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gZXh0cmFjdCBncmFsbG9jIGJ1ZmZlciBpbiBtZXRhZGF0YSBtb2RlIik7CisgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIDApOworICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY29uc3QgZ3JhbGxvY19tb2R1bGVfdCAqZ3Jtb2R1bGUgPQotICAgICAgICAgICAgICAgIChjb25zdCBncmFsbG9jX21vZHVsZV90ICopbUdyYWxsb2NNb2R1bGU7Ci0KLSAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCBoYW5kbGUgPSAqKGJ1ZmZlcl9oYW5kbGVfdCAqKShzb3VyY2UgKyA0KTsKLQotICAgICAgICAgICAgdm9pZCAqYml0czsKLSAgICAgICAgICAgIENIRUNLX0VRKDAsCi0gICAgICAgICAgICAgICAgICAgICBncm1vZHVsZS0+bG9jaygKLSAgICAgICAgICAgICAgICAgICAgICAgICBncm1vZHVsZSwgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9ORVZFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBtV2lkdGgsIG1IZWlnaHQsICZiaXRzKSk7Ci0KLSAgICAgICAgICAgIENvbnZlcnRSR0IzMlRvUGxhbmFyKAotICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKWJpdHMsIG1Db252ZXJzaW9uQnVmZmVyLCBtV2lkdGgsIG1IZWlnaHQpOwotCi0gICAgICAgICAgICBzb3VyY2UgPSBtQ29udmVyc2lvbkJ1ZmZlcjsKLQotICAgICAgICAgICAgQ0hFQ0tfRVEoMCwgZ3Jtb2R1bGUtPnVubG9jayhncm1vZHVsZSwgaGFuZGxlKSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAoaW5wdXRCdWZmZXJIZWFkZXItPm5GaWxsZWRMZW4gPCBmcmFtZVNpemUpIHsKICAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI3NTY5NjM1Iik7CkBAIC04NzAsNyArMTA3Miw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIpIHsKLSAgICAgICAgICAgICAgICBDb252ZXJ0U2VtaVBsYW5hclRvUGxhbmFyKAorICAgICAgICAgICAgICAgIENvbnZlcnRZVVY0MjBTZW1pUGxhbmFyVG9ZVVY0MjBQbGFuYXIoCiAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UsIG1Db252ZXJzaW9uQnVmZmVyLCBtV2lkdGgsIG1IZWlnaHQpOwogCiAgICAgICAgICAgICAgICAgc291cmNlID0gbUNvbnZlcnNpb25CdWZmZXI7CkBAIC04NzgsOSArMTA4MCwxMiBAQAogICAgICAgICB9CiAgICAgICAgIHZweF9pbWFnZV90IHJhd19mcmFtZTsKICAgICAgICAgdnB4X2ltZ193cmFwKCZyYXdfZnJhbWUsIFZQWF9JTUdfRk1UX0k0MjAsIG1XaWR0aCwgbUhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgIGtJbnB1dEJ1ZmZlckFsaWdubWVudCwgc291cmNlKTsKKyAgICAgICAgICAgICAgICAgICAgIGtJbnB1dEJ1ZmZlckFsaWdubWVudCwgKHVpbnQ4X3QgKilzb3VyY2UpOwogCiAgICAgICAgIHZweF9lbmNfZnJhbWVfZmxhZ3NfdCBmbGFncyA9IDA7CisgICAgICAgIGlmIChtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoID4gMCkgeworICAgICAgICAgICAgZmxhZ3MgPSBnZXRFbmNvZGVGbGFncygpOworICAgICAgICB9CiAgICAgICAgIGlmIChtS2V5RnJhbWVSZXF1ZXN0ZWQpIHsKICAgICAgICAgICAgIGZsYWdzIHw9IFZQWF9FRkxBR19GT1JDRV9LRjsKICAgICAgICAgICAgIG1LZXlGcmFtZVJlcXVlc3RlZCA9IGZhbHNlOwpAQCAtOTAxLDExICsxMTA2LDE4IEBACiAgICAgICAgICAgICBtQml0cmF0ZVVwZGF0ZWQgPSBmYWxzZTsKICAgICAgICAgfQogCisgICAgICAgIHVpbnQzMl90IGZyYW1lRHVyYXRpb247CisgICAgICAgIGlmIChpbnB1dEJ1ZmZlckhlYWRlci0+blRpbWVTdGFtcCA+IG1MYXN0VGltZXN0YW1wKSB7CisgICAgICAgICAgICBmcmFtZUR1cmF0aW9uID0gKHVpbnQzMl90KShpbnB1dEJ1ZmZlckhlYWRlci0+blRpbWVTdGFtcCAtIG1MYXN0VGltZXN0YW1wKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZyYW1lRHVyYXRpb24gPSAodWludDMyX3QpKCgodWludDY0X3QpMTAwMDAwMCA8PCAxNikgLyBtRnJhbWVyYXRlKTsKKyAgICAgICAgfQorICAgICAgICBtTGFzdFRpbWVzdGFtcCA9IGlucHV0QnVmZmVySGVhZGVyLT5uVGltZVN0YW1wOwogICAgICAgICBjb2RlY19yZXR1cm4gPSB2cHhfY29kZWNfZW5jb2RlKAogICAgICAgICAgICAgICAgIG1Db2RlY0NvbnRleHQsCiAgICAgICAgICAgICAgICAgJnJhd19mcmFtZSwKICAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlckhlYWRlci0+blRpbWVTdGFtcCwgIC8vIGluIHRpbWViYXNlIHVuaXRzCi0gICAgICAgICAgICAgICAgbUZyYW1lRHVyYXRpb25VcywgIC8vIGZyYW1lIGR1cmF0aW9uIGluIHRpbWViYXNlIHVuaXRzCisgICAgICAgICAgICAgICAgZnJhbWVEdXJhdGlvbiwgIC8vIGZyYW1lIGR1cmF0aW9uIGluIHRpbWViYXNlIHVuaXRzCiAgICAgICAgICAgICAgICAgZmxhZ3MsICAvLyBmcmFtZSBmbGFncwogICAgICAgICAgICAgICAgIFZQWF9ETF9SRUFMVElNRSk7ICAvLyBlbmNvZGluZyBkZWFkbGluZQogICAgICAgICBpZiAoY29kZWNfcmV0dXJuICE9IFZQWF9DT0RFQ19PSykgewpAQCAtOTQ5LDE2ICsxMTYxLDYgQEAKICAgICB9CiB9CiAKLU9NWF9FUlJPUlRZUEUgU29mdFZQWEVuY29kZXI6OmdldEV4dGVuc2lvbkluZGV4KAotICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBPTVhfSU5ERVhUWVBFICppbmRleCkgewotICAgIGlmICghc3RyY21wKG5hbWUsICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguc3RvcmVNZXRhRGF0YUluQnVmZmVycyIpKSB7Ci0gICAgICAgICppbmRleCA9IE9NWF9JbmRleFZlbmRvclN0YXJ0VW51c2VkOwotICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6Z2V0RXh0ZW5zaW9uSW5kZXgobmFtZSwgaW5kZXgpOwotfQotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5oCmluZGV4IDA3NjgzMGYuLmY0YzE1NjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuaApAQCAtMTgsNyArMTgsNyBAQAogCiAjZGVmaW5lIFNPRlRfVlBYX0VOQ09ERVJfSF8KIAotI2luY2x1ZGUgIlNpbXBsZVNvZnRPTVhDb21wb25lbnQuaCIKKyNpbmNsdWRlICJTb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmgiCiAKICNpbmNsdWRlIDxPTVhfVmlkZW9FeHQuaD4KICNpbmNsdWRlIDxPTVhfSW5kZXhFeHQuaD4KQEAgLTU5LDcgKzU5LDcgQEAKIC8vICAgIC0gT01YIHRpbWVzdGFtcHMgYXJlIGluIG1pY3Jvc2Vjb25kcywgdGhlcmVmb3JlCiAvLyBlbmNvZGVyIHRpbWViYXNlIGlzIGZpeGVkIHRvIDEvMTAwMDAwMAogCi1zdHJ1Y3QgU29mdFZQWEVuY29kZXIgOiBwdWJsaWMgU2ltcGxlU29mdE9NWENvbXBvbmVudCB7CitzdHJ1Y3QgU29mdFZQWEVuY29kZXIgOiBwdWJsaWMgU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudCB7CiAgICAgU29mdFZQWEVuY29kZXIoY29uc3QgY2hhciAqbmFtZSwKICAgICAgICAgICAgICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCiAgICAgICAgICAgICAgICAgICAgT01YX1BUUiBhcHBEYXRhLApAQCAtODcsMTAgKzg3LDQ0IEBACiAgICAgLy8gZW5jb2Rpbmcgb2YgdGhlIGZyYW1lCiAgICAgdmlydHVhbCB2b2lkIG9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpOwogCi0gICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGdldEV4dGVuc2lvbkluZGV4KAotICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgT01YX0lOREVYVFlQRSAqaW5kZXgpOwotCiBwcml2YXRlOgorICAgIGVudW0gVGVtcG9yYWxSZWZlcmVuY2VzIHsKKyAgICAgICAgLy8gRm9yIDEgbGF5ZXIgY2FzZTogcmVmZXJlbmNlIGFsbCAobGFzdCwgZ29sZGVuLCBhbmQgYWx0IHJlZiksIGJ1dCBvbmx5CisgICAgICAgIC8vIHVwZGF0ZSBsYXN0LgorICAgICAgICBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWxsID0gMTIsCisgICAgICAgIC8vIEZpcnN0IGJhc2UgbGF5ZXIgZnJhbWUgZm9yIDMgdGVtcG9yYWwgbGF5ZXJzLCB3aGljaCB1cGRhdGVzIGxhc3QgYW5kCisgICAgICAgIC8vIGdvbGRlbiB3aXRoIGFsdCByZWYgZGVwZW5kZW5jeS4KKyAgICAgICAga1RlbXBvcmFsVXBkYXRlTGFzdEFuZEdvbGRlblJlZkFsdFJlZiA9IDExLAorICAgICAgICAvLyBGaXJzdCBlbmhhbmNlbWVudCBsYXllciB3aXRoIGFsdCByZWYgZGVwZW5kZW5jeS4KKyAgICAgICAga1RlbXBvcmFsVXBkYXRlR29sZGVuUmVmQWx0UmVmID0gMTAsCisgICAgICAgIC8vIEZpcnN0IGVuaGFuY2VtZW50IGxheWVyIHdpdGggYWx0IHJlZiBkZXBlbmRlbmN5LgorICAgICAgICBrVGVtcG9yYWxVcGRhdGVHb2xkZW5XaXRob3V0RGVwZW5kZW5jeVJlZkFsdFJlZiA9IDksCisgICAgICAgIC8vIEJhc2UgbGF5ZXIgd2l0aCBhbHQgcmVmIGRlcGVuZGVuY3kuCisgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbHRSZWYgPSA4LAorICAgICAgICAvLyBIaWdoZXN0IGVuaGFjZW1lbnQgbGF5ZXIgd2l0aG91dCBkZXBlbmRlbmN5IG9uIGdvbGRlbiB3aXRoIGFsdCByZWYKKyAgICAgICAgLy8gZGVwZW5kZW5jeS4KKyAgICAgICAga1RlbXBvcmFsVXBkYXRlTm9uZU5vUmVmR29sZGVuUmVmQWx0UmVmID0gNywKKyAgICAgICAgLy8gU2Vjb25kIGxheWVyIGFuZCBsYXN0IGZyYW1lIGluIGN5Y2xlLCBmb3IgMiBsYXllcnMuCisgICAgICAgIGtUZW1wb3JhbFVwZGF0ZU5vbmVOb1JlZkFsdHJlZiA9IDYsCisgICAgICAgIC8vIEhpZ2hlc3QgZW5oYW5jZW1lbnQgbGF5ZXIuCisgICAgICAgIGtUZW1wb3JhbFVwZGF0ZU5vbmUgPSA1LAorICAgICAgICAvLyBTZWNvbmQgZW5oYW5jZW1lbnQgbGF5ZXIuCisgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUFsdHJlZiA9IDQsCisgICAgICAgIC8vIFNlY29uZCBlbmhhbmNlbWVudCBsYXllciB3aXRob3V0IGRlcGVuZGVuY3kgb24gcHJldmlvdXMgZnJhbWVzIGluCisgICAgICAgIC8vIHRoZSBzZWNvbmQgZW5oYW5jZW1lbnQgbGF5ZXIuCisgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUFsdHJlZldpdGhvdXREZXBlbmRlbmN5ID0gMywKKyAgICAgICAgLy8gRmlyc3QgZW5oYW5jZW1lbnQgbGF5ZXIuCisgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUdvbGRlbiA9IDIsCisgICAgICAgIC8vIEZpcnN0IGVuaGFuY2VtZW50IGxheWVyIHdpdGhvdXQgZGVwZW5kZW5jeSBvbiBwcmV2aW91cyBmcmFtZXMgaW4KKyAgICAgICAgLy8gdGhlIGZpcnN0IGVuaGFuY2VtZW50IGxheWVyLgorICAgICAgICBrVGVtcG9yYWxVcGRhdGVHb2xkZW5XaXRob3V0RGVwZW5kZW5jeSA9IDEsCisgICAgICAgIC8vIEJhc2UgbGF5ZXIuCisgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUxhc3QgPSAwLAorICAgIH07CisgICAgZW51bSB7CisgICAgICAgIGtNYXhUZW1wb3JhbFBhdHRlcm4gPSA4CisgICAgfTsKKwogICAgIC8vIG51bWJlciBvZiBidWZmZXJzIGFsbG9jYXRlZCBwZXIgcG9ydAogICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrTnVtQnVmZmVycyA9IDQ7CiAKQEAgLTEzMCwxNiArMTY0LDE1IEBACiAgICAgLy8gVGFyZ2V0IGJpdHJhdGUgc2V0IGZvciB0aGUgZW5jb2RlciwgaW4gYml0cyBwZXIgc2Vjb25kLgogICAgIHVpbnQzMl90IG1CaXRyYXRlOwogCisgICAgLy8gVGFyZ2V0IGZyYW1lcmF0ZSBzZXQgZm9yIHRoZSBlbmNvZGVyLgorICAgIHVpbnQzMl90IG1GcmFtZXJhdGU7CisKICAgICAvLyBJZiBhIHJlcXVlc3QgZm9yIGEgY2hhbmdlIGl0IGJpdHJhdGUgaGFzIGJlZW4gcmVjZWl2ZWQuCiAgICAgYm9vbCBtQml0cmF0ZVVwZGF0ZWQ7CiAKICAgICAvLyBCaXRyYXRlIGNvbnRyb2wgbW9kZSwgZWl0aGVyIGNvbnN0YW50IG9yIHZhcmlhYmxlCiAgICAgdnB4X3JjX21vZGUgbUJpdHJhdGVDb250cm9sTW9kZTsKIAotICAgIC8vIEZyYW1lIGR1cmF0aW9uIGlzIHRoZSByZWNpcHJvY2FsIG9mIGZyYW1lcmF0ZSwgZGVub3RlZAotICAgIC8vIGluIG1pY3Jvc2Vjb25kcwotICAgIHVpbnQ2NF90IG1GcmFtZUR1cmF0aW9uVXM7Ci0KICAgICAvLyB2cDggc3BlY2lmaWMgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIKICAgICAvLyB0aGF0IGVuYWJsZXMgdG9rZW4gcGFydGl0aW9uaW5nIG9mCiAgICAgLy8gdGhlIHN0cmVhbSBpbnRvIHN1YnN0cmVhbXMKQEAgLTE2MCw2ICsxOTMsMzYgQEAKICAgICAvLyBzb21ldGhpbmcgZWxzZS4KICAgICBPTVhfVklERU9fVlA4TEVWRUxUWVBFIG1MZXZlbDsKIAorICAgIC8vIEtleSBmcmFtZSBpbnRlcnZhbCBpbiBmcmFtZXMKKyAgICB1aW50MzJfdCBtS2V5RnJhbWVJbnRlcnZhbDsKKworICAgIC8vIE1pbmltdW0gKGJlc3QgcXVhbGl0eSkgcXVhbnRpemVyCisgICAgdWludDMyX3QgbU1pblF1YW50aXplcjsKKworICAgIC8vIE1heGltdW0gKHdvcnN0IHF1YWxpdHkpIHF1YW50aXplcgorICAgIHVpbnQzMl90IG1NYXhRdWFudGl6ZXI7CisKKyAgICAvLyBOdW1iZXIgb2YgY29kaW5nIHRlbXBvcmFsIGxheWVycyB0byBiZSB1c2VkLgorICAgIHNpemVfdCBtVGVtcG9yYWxMYXllcnM7CisKKyAgICAvLyBUZW1wb3JhbCBsYXllciBiaXRyYXJlIHJhdGlvIGluIHBlcmNlbnRhZ2UKKyAgICB1aW50MzJfdCBtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpb1tPTVhfVklERU9fQU5EUk9JRF9NQVhWUDhURU1QT1JBTExBWUVSU107CisKKyAgICAvLyBUZW1wb3JhbCBwYXR0ZXJuIHR5cGUKKyAgICBPTVhfVklERU9fQU5EUk9JRF9WUFhURU1QT1JBTExBWUVSUEFUVEVSTlRZUEUgbVRlbXBvcmFsUGF0dGVyblR5cGU7CisKKyAgICAvLyBUZW1wb3JhbCBwYXR0ZXJuIGxlbmd0aAorICAgIHNpemVfdCBtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoOworCisgICAgLy8gVGVtcG9yYWwgcGF0dGVybiBjdXJyZW50IGluZGV4CisgICAgc2l6ZV90IG1UZW1wb3JhbFBhdHRlcm5JZHg7CisKKyAgICAvLyBGcmFtZSB0eXBlIHRlbXBvcmFsIHBhdHRlcm4KKyAgICBUZW1wb3JhbFJlZmVyZW5jZXMgbVRlbXBvcmFsUGF0dGVybltrTWF4VGVtcG9yYWxQYXR0ZXJuXTsKKworICAgIC8vIExhc3QgaW5wdXQgYnVmZmVyIHRpbWVzdGFtcAorICAgIE9NWF9USUNLUyBtTGFzdFRpbWVzdGFtcDsKKwogICAgIC8vIENvbnZlcnNpb24gYnVmZmVyIGlzIG5lZWRlZCB0byBjb252ZXJ0IHNlbWkKICAgICAvLyBwbGFuYXIgeXV2NDIwIHRvIHBsYW5hciBmb3JtYXQKICAgICAvLyBJdCBpcyBvbmx5IGFsbG9jYXRlZCBpZiBpbnB1dCBmb3JtYXQgaXMKQEAgLTE2Nyw3ICsyMzAsNiBAQAogICAgIHVpbnQ4X3QqIG1Db252ZXJzaW9uQnVmZmVyOwogCiAgICAgYm9vbCBtSW5wdXREYXRhSXNNZXRhOwotICAgIGNvbnN0IGh3X21vZHVsZV90ICptR3JhbGxvY01vZHVsZTsKIAogICAgIGJvb2wgbUtleUZyYW1lUmVxdWVzdGVkOwogCkBAIC0xODUsNiArMjQ3LDkgQEAKICAgICAvLyBkdG9yLgogICAgIHN0YXR1c190IHJlbGVhc2VFbmNvZGVyKCk7CiAKKyAgICAvLyBHZXQgY3VycmVudCBlbmNvZGUgZmxhZ3MKKyAgICB2cHhfZW5jX2ZyYW1lX2ZsYWdzX3QgZ2V0RW5jb2RlRmxhZ3MoKTsKKwogICAgIC8vIEhhbmRsZXMgcG9ydCBjaGFuZ2VzIHdpdGggcmVzcGVjdCB0byBjb2xvciBmb3JtYXRzCiAgICAgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldEZvcm1hdFBhcmFtcygKICAgICAgICAgY29uc3QgT01YX1ZJREVPX1BBUkFNX1BPUlRGT1JNQVRUWVBFKiBmb3JtYXQpOwpAQCAtMjA2LDYgKzI3MSwxMCBAQAogICAgIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRWcDhQYXJhbXMoCiAgICAgICAgIGNvbnN0IE9NWF9WSURFT19QQVJBTV9WUDhUWVBFKiB2cDhQYXJhbXMpOwogCisgICAgLy8gSGFuZGxlcyBBbmRyb2lkIHZwOCBzcGVjaWZpYyBwYXJhbWV0ZXJzLgorICAgIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRBbmRyb2lkVnA4UGFyYW1zKAorICAgICAgICBjb25zdCBPTVhfVklERU9fUEFSQU1fQU5EUk9JRF9WUDhFTkNPREVSVFlQRSogdnA4QW5kcm9pZFBhcmFtcyk7CisKICAgICAvLyBVcGRhdGVzIGVuY29kZXIgcHJvZmlsZQogICAgIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRQcm9maWxlTGV2ZWwoCiAgICAgICAgIGNvbnN0IE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFKiBwcm9maWxlQW5kTGV2ZWwpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvQW5kcm9pZC5tawppbmRleCA2NTViMmFiLi5iZjAzYWQ5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvQW5kcm9pZC5tawpAQCAtODQsOCArODQsOCBAQAogCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkX3MuUyBcCiAJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5TIFwKIAotCi1pZmVxICgkKEFSQ0hfQVJNX0hBVkVfTkVPTiksdHJ1ZSkKK2lmZXEgKCQoVEFSR0VUX0FSQ0gpLGFybSkKKyAgaWZlcSAoJChBUkNIX0FSTV9IQVZFX05FT04pLHRydWUpCiAgICAgTE9DQUxfQVJNX05FT04gICA6PSB0cnVlCiAjICAgIExPQ0FMX0NGTEFHUyAgICAgOj0gLXN0ZD1jOTkgLUQuX05FT04gLUQuX09NWERMCiAgICAgTE9DQUxfQ0ZMQUdTICAgICA6PSAtREgyNjRERUNfTkVPTiAtREgyNjRERUNfT01YREwKQEAgLTk0LDYgKzk0LDcgQEAKICAgICBMT0NBTF9DX0lOQ0xVREVTICs9ICQoTE9DQUxfUEFUSCkvLi9vbXhkbC9hcm1fbmVvbi9hcGkgXAogICAgICAgICAgICAgICAgICAgICAgICAgJChMT0NBTF9QQVRIKS8uL29teGRsL2FybV9uZW9uL3ZjL2FwaSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAkKExPQ0FMX1BBVEgpLy4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvYXBpCisgIGVuZGlmCiBlbmRpZgogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9Tb2Z0QVZDLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9Tb2Z0QVZDLmNwcAppbmRleCAxZjlmOGQ3Li4yNTMyMWI5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvU29mdEFWQy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL1NvZnRBVkMuY3BwCkBAIC01OCw3ICs1OCw2IEBACiAgICAgICAgICAgICAzMjAgLyogd2lkdGggKi8sIDI0MCAvKiBoZWlnaHQgKi8sIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KSwKICAgICAgIG1IYW5kbGUoTlVMTCksCiAgICAgICBtSW5wdXRCdWZmZXJDb3VudCgwKSwKLSAgICAgIG1QaWN0dXJlU2l6ZShtV2lkdGggKiBtSGVpZ2h0ICogMyAvIDIpLAogICAgICAgbUZpcnN0UGljdHVyZShOVUxMKSwKICAgICAgIG1GaXJzdFBpY3R1cmVJZCgtMSksCiAgICAgICBtUGljSWQoMCksCkBAIC05OCw3ICs5Nyw3IEBACiAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiB9CiAKLXZvaWQgU29mdEFWQzo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgewordm9pZCBTb2Z0QVZDOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgLyogcG9ydEluZGV4ICovKSB7CiAgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlICE9IE5PTkUpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTExOCw3ICsxMTcsNyBAQAogICAgIH0KIAogICAgIEgyNjRTd0RlY1JldCByZXQgPSBIMjY0U1dERUNfUElDX1JEWTsKLSAgICBib29sIHBvcnRTZXR0aW5nc0NoYW5nZWQgPSBmYWxzZTsKKyAgICBib29sIHBvcnRXaWxsUmVzZXQgPSBmYWxzZTsKICAgICB3aGlsZSAoKG1FT1NTdGF0dXMgIT0gSU5QVVRfREFUQV9BVkFJTEFCTEUgfHwgIWluUXVldWUuZW1wdHkoKSkKICAgICAgICAgICAgICYmIG91dFF1ZXVlLnNpemUoKSA9PSBrTnVtT3V0cHV0QnVmZmVycykgewogCkBAIC0xNjEsMTcgKzE2MCwxNCBAQAogICAgICAgICAgICAgICAgICAgICBIMjY0U3dEZWNJbmZvIGRlY29kZXJJbmZvOwogICAgICAgICAgICAgICAgICAgICBDSEVDSyhIMjY0U3dEZWNHZXRJbmZvKG1IYW5kbGUsICZkZWNvZGVySW5mbykgPT0gSDI2NFNXREVDX09LKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlUG9ydFNldHRpbmdDaGFuZ2VFdmVudCgmZGVjb2RlckluZm8pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwb3J0U2V0dGluZ3NDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChkZWNvZGVySW5mby5jcm9wcGluZ0ZsYWcgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNyb3BSZWN0RXZlbnQoJmRlY29kZXJJbmZvLmNyb3BQYXJhbXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwb3J0U2V0dGluZ3NDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjpDcm9wU2V0dGluZ3NNb2RlIGNyb3BTZXR0aW5nc01vZGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ3JvcFBhcmFtcyhkZWNvZGVySW5mbyk7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZVBvcnRTZXR0aW5nc0NoYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9ydFdpbGxSZXNldCwgZGVjb2RlckluZm8ucGljV2lkdGgsIGRlY29kZXJJbmZvLnBpY0hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9wU2V0dGluZ3NNb2RlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChwb3J0U2V0dGluZ3NDaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgaWYgKHBvcnRXaWxsUmVzZXQpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKEgyNjRTd0RlY05leHRQaWN0dXJlKG1IYW5kbGUsICZkZWNvZGVkUGljdHVyZSwgMCkKICAgICAgICAgICAgICAgICAgICAgICAgID09IEgyNjRTV0RFQ19QSUNfUkRZKSB7CiAKQEAgLTE5OSw4ICsxOTUsNyBAQAogICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKIAotICAgICAgICBpZiAocG9ydFNldHRpbmdzQ2hhbmdlZCkgewotICAgICAgICAgICAgcG9ydFNldHRpbmdzQ2hhbmdlZCA9IGZhbHNlOworICAgICAgICBpZiAocG9ydFdpbGxSZXNldCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTIyMCw1MSArMjE1LDQyIEBACiAgICAgfQogfQogCi1ib29sIFNvZnRBVkM6OmhhbmRsZVBvcnRTZXR0aW5nQ2hhbmdlRXZlbnQoY29uc3QgSDI2NFN3RGVjSW5mbyAqaW5mbykgewotICAgIGlmIChtV2lkdGggIT0gaW5mby0+cGljV2lkdGggfHwgbUhlaWdodCAhPSBpbmZvLT5waWNIZWlnaHQpIHsKLSAgICAgICAgbVdpZHRoICA9IGluZm8tPnBpY1dpZHRoOwotICAgICAgICBtSGVpZ2h0ID0gaW5mby0+cGljSGVpZ2h0OwotICAgICAgICBtUGljdHVyZVNpemUgPSBtV2lkdGggKiBtSGVpZ2h0ICogMyAvIDI7Ci0gICAgICAgIHVwZGF0ZVBvcnREZWZpbml0aW9ucygpOwotICAgICAgICBub3RpZnkoT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwgMSwgMCwgTlVMTCk7Ci0gICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBBV0FJVElOR19ESVNBQkxFRDsKLSAgICAgICAgcmV0dXJuIHRydWU7CitTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjpDcm9wU2V0dGluZ3NNb2RlIFNvZnRBVkM6OmhhbmRsZUNyb3BQYXJhbXMoCisgICAgICAgIGNvbnN0IEgyNjRTd0RlY0luZm8mIGRlY0luZm8pIHsKKyAgICBpZiAoIWRlY0luZm8uY3JvcHBpbmdGbGFnKSB7CisgICAgICAgIHJldHVybiBrQ3JvcFVuU2V0OwogICAgIH0KIAotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBTb2Z0QVZDOjpoYW5kbGVDcm9wUmVjdEV2ZW50KGNvbnN0IENyb3BQYXJhbXMgKmNyb3ApIHsKLSAgICBpZiAobUNyb3BMZWZ0ICE9IGNyb3AtPmNyb3BMZWZ0T2Zmc2V0IHx8Ci0gICAgICAgIG1Dcm9wVG9wICE9IGNyb3AtPmNyb3BUb3BPZmZzZXQgfHwKLSAgICAgICAgbUNyb3BXaWR0aCAhPSBjcm9wLT5jcm9wT3V0V2lkdGggfHwKLSAgICAgICAgbUNyb3BIZWlnaHQgIT0gY3JvcC0+Y3JvcE91dEhlaWdodCkgewotICAgICAgICBtQ3JvcExlZnQgPSBjcm9wLT5jcm9wTGVmdE9mZnNldDsKLSAgICAgICAgbUNyb3BUb3AgPSBjcm9wLT5jcm9wVG9wT2Zmc2V0OwotICAgICAgICBtQ3JvcFdpZHRoID0gY3JvcC0+Y3JvcE91dFdpZHRoOwotICAgICAgICBtQ3JvcEhlaWdodCA9IGNyb3AtPmNyb3BPdXRIZWlnaHQ7Ci0KLSAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIDEsCi0gICAgICAgICAgICAgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0Q3JvcCwgTlVMTCk7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgY29uc3QgQ3JvcFBhcmFtcyYgY3JvcCA9IGRlY0luZm8uY3JvcFBhcmFtczsKKyAgICBpZiAobUNyb3BMZWZ0ID09IGNyb3AuY3JvcExlZnRPZmZzZXQgJiYKKyAgICAgICAgbUNyb3BUb3AgPT0gY3JvcC5jcm9wVG9wT2Zmc2V0ICYmCisgICAgICAgIG1Dcm9wV2lkdGggPT0gY3JvcC5jcm9wT3V0V2lkdGggJiYKKyAgICAgICAgbUNyb3BIZWlnaHQgPT0gY3JvcC5jcm9wT3V0SGVpZ2h0KSB7CisgICAgICAgIHJldHVybiBrQ3JvcFNldDsKICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworCisgICAgbUNyb3BMZWZ0ID0gY3JvcC5jcm9wTGVmdE9mZnNldDsKKyAgICBtQ3JvcFRvcCA9IGNyb3AuY3JvcFRvcE9mZnNldDsKKyAgICBtQ3JvcFdpZHRoID0gY3JvcC5jcm9wT3V0V2lkdGg7CisgICAgbUNyb3BIZWlnaHQgPSBjcm9wLmNyb3BPdXRIZWlnaHQ7CisgICAgcmV0dXJuIGtDcm9wQ2hhbmdlZDsKIH0KIAogdm9pZCBTb2Z0QVZDOjpzYXZlRmlyc3RPdXRwdXRCdWZmZXIoaW50MzJfdCBwaWNJZCwgdWludDhfdCAqZGF0YSkgewogICAgIENIRUNLKG1GaXJzdFBpY3R1cmUgPT0gTlVMTCk7CiAgICAgbUZpcnN0UGljdHVyZUlkID0gcGljSWQ7CiAKLSAgICBtRmlyc3RQaWN0dXJlID0gbmV3IHVpbnQ4X3RbbVBpY3R1cmVTaXplXTsKLSAgICBtZW1jcHkobUZpcnN0UGljdHVyZSwgZGF0YSwgbVBpY3R1cmVTaXplKTsKKyAgICB1aW50MzJfdCBwaWN0dXJlU2l6ZSA9IG1XaWR0aCAqIG1IZWlnaHQgKiAzIC8gMjsKKyAgICBtRmlyc3RQaWN0dXJlID0gbmV3IHVpbnQ4X3RbcGljdHVyZVNpemVdOworICAgIG1lbWNweShtRmlyc3RQaWN0dXJlLCBkYXRhLCBwaWN0dXJlU2l6ZSk7CiB9CiAKIGJvb2wgU29mdEFWQzo6ZHJhaW5PbmVPdXRwdXRCdWZmZXIoaW50MzJfdCBwaWNJZCwgdWludDhfdCogZGF0YSkgewogICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoa091dHB1dFBvcnRJbmRleCk7CiAgICAgQnVmZmVySW5mbyAqb3V0SW5mbyA9ICpvdXRRdWV1ZS5iZWdpbigpOwogICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIgPSBvdXRJbmZvLT5tSGVhZGVyOwotICAgIGlmIChvdXRIZWFkZXItPm5BbGxvY0xlbiAtIG91dEhlYWRlci0+bk9mZnNldCA8IG1QaWN0dXJlU2l6ZSkgeworICAgIE9NWF9VMzIgZnJhbWVTaXplID0gbVdpZHRoICogbUhlaWdodCAqIDMgLyAyOworICAgIGlmIChvdXRIZWFkZXItPm5BbGxvY0xlbiAtIG91dEhlYWRlci0+bk9mZnNldCA8IGZyYW1lU2l6ZSkgewogICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI3ODMzNjE2Iik7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC0yNzIsOSArMjU4LDE3IEBACiAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciA9IG1QaWNUb0hlYWRlck1hcC52YWx1ZUZvcihwaWNJZCk7CiAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0gaGVhZGVyLT5uVGltZVN0YW1wOwogICAgIG91dEhlYWRlci0+bkZsYWdzID0gaGVhZGVyLT5uRmxhZ3M7Ci0gICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gbVBpY3R1cmVTaXplOwotICAgIG1lbWNweShvdXRIZWFkZXItPnBCdWZmZXIgKyBvdXRIZWFkZXItPm5PZmZzZXQsCi0gICAgICAgICAgICBkYXRhLCBtUGljdHVyZVNpemUpOworICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IGZyYW1lU2l6ZTsKKworICAgIHVpbnQ4X3QgKmRzdCA9IG91dEhlYWRlci0+cEJ1ZmZlciArIG91dEhlYWRlci0+bk9mZnNldDsKKyAgICBjb25zdCB1aW50OF90ICpzcmNZID0gZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpzcmNVID0gc3JjWSArIG1XaWR0aCAqIG1IZWlnaHQ7CisgICAgY29uc3QgdWludDhfdCAqc3JjViA9IHNyY1UgKyBtV2lkdGggKiBtSGVpZ2h0IC8gNDsKKyAgICBzaXplX3Qgc3JjWVN0cmlkZSA9IG1XaWR0aDsKKyAgICBzaXplX3Qgc3JjVVN0cmlkZSA9IG1XaWR0aCAvIDI7CisgICAgc2l6ZV90IHNyY1ZTdHJpZGUgPSBzcmNVU3RyaWRlOworICAgIGNvcHlZVjEyRnJhbWVUb091dHB1dEJ1ZmZlcihkc3QsIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUsIHNyY1VTdHJpZGUsIHNyY1ZTdHJpZGUpOworCiAgICAgbVBpY1RvSGVhZGVyTWFwLnJlbW92ZUl0ZW0ocGljSWQpOwogICAgIGRlbGV0ZSBoZWFkZXI7CiAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL1NvZnRBVkMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9Tb2Z0QVZDLmgKaW5kZXggNTI4ZWYxYy4uYjhjMTgwNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL1NvZnRBVkMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvU29mdEFWQy5oCkBAIC01NSw4ICs1NSw2IEBACiAKICAgICBzaXplX3QgbUlucHV0QnVmZmVyQ291bnQ7CiAKLSAgICB1aW50MzJfdCBtUGljdHVyZVNpemU7Ci0KICAgICB1aW50OF90ICptRmlyc3RQaWN0dXJlOwogICAgIGludDMyX3QgbUZpcnN0UGljdHVyZUlkOwogCkBAIC03NSw4ICs3Myw3IEBACiAgICAgdm9pZCBkcmFpbkFsbE91dHB1dEJ1ZmZlcnMoYm9vbCBlb3MpOwogICAgIGJvb2wgZHJhaW5PbmVPdXRwdXRCdWZmZXIoaW50MzJfdCBwaWNJZCwgdWludDhfdCAqZGF0YSk7CiAgICAgdm9pZCBzYXZlRmlyc3RPdXRwdXRCdWZmZXIoaW50MzJfdCBwaWRJZCwgdWludDhfdCAqZGF0YSk7Ci0gICAgYm9vbCBoYW5kbGVDcm9wUmVjdEV2ZW50KGNvbnN0IENyb3BQYXJhbXMqIGNyb3ApOwotICAgIGJvb2wgaGFuZGxlUG9ydFNldHRpbmdDaGFuZ2VFdmVudChjb25zdCBIMjY0U3dEZWNJbmZvICppbmZvKTsKKyAgICBDcm9wU2V0dGluZ3NNb2RlIGhhbmRsZUNyb3BQYXJhbXMoY29uc3QgSDI2NFN3RGVjSW5mbyYgZGVjSW5mbyk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTb2Z0QVZDKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL29teHR5cGVzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL29teHR5cGVzLmgKaW5kZXggOGIyOTVhNi4uOTEyY2IwZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9vbXh0eXBlcy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvb214dHlwZXMuaApAQCAtMzIsNiArMzIsNyBAQAogI2RlZmluZSBfT01YVFlQRVNfSF8KIAogI2luY2x1ZGUgPGxpbWl0cy5oPiAKKyNpbmNsdWRlIDxzdGRpbnQuaD4KIAogI2RlZmluZSBPTVhfSU4KICNkZWZpbmUgT01YX09VVApAQCAtNzUsNjQgKzc2LDIyIEBACiAKICAKIC8qIE9NWF9VOCAqLwotI2lmIFVDSEFSX01BWCA9PSAweGZmCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgT01YX1U4OwotI2VsaWYgVVNIUlRfTUFYID09IDB4ZmYgCi10eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCBPTVhfVTg7IAotI2Vsc2UKLSNlcnJvciBPTVhfVTggdW5kZWZpbmVkCi0jZW5kaWYgCi0KK3R5cGVkZWYgdWludDhfdCBPTVhfVTg7CiAgCiAvKiBPTVhfUzggKi8KLSNpZiBTQ0hBUl9NQVggPT0gMHg3ZiAKLXR5cGVkZWYgc2lnbmVkIGNoYXIgT01YX1M4OwotI2VsaWYgU0hSVF9NQVggPT0gMHg3ZiAKLXR5cGVkZWYgc2lnbmVkIHNob3J0IGludCBPTVhfUzg7IAotI2Vsc2UKLSNlcnJvciBPTVhfUzggdW5kZWZpbmVkCi0jZW5kaWYKLSAKK3R5cGVkZWYgaW50OF90IE9NWF9TODsKICAKIC8qIE9NWF9VMTYgKi8KLSNpZiBVU0hSVF9NQVggPT0gMHhmZmZmCi10eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCBPTVhfVTE2OwotI2VsaWYgVUlOVF9NQVggPT0gMHhmZmZmCi10eXBlZGVmIHVuc2lnbmVkIGludCBPTVhfVTE2OyAKLSNlbHNlCi0jZXJyb3IgT01YX1UxNiB1bmRlZmluZWQKLSNlbmRpZgotCit0eXBlZGVmIHVpbnQxNl90IE9NWF9VMTY7CiAKIC8qIE9NWF9TMTYgKi8KLSNpZiBTSFJUX01BWCA9PSAweDdmZmYgCi10eXBlZGVmIHNpZ25lZCBzaG9ydCBpbnQgT01YX1MxNjsKLSNlbGlmIElOVF9NQVggPT0gMHg3ZmZmIAotdHlwZWRlZiBzaWduZWQgaW50IE9NWF9TMTY7IAotI2Vsc2UKLSNlcnJvciBPTVhfUzE2IHVuZGVmaW5lZAotI2VuZGlmCi0KK3R5cGVkZWYgaW50MTZfdCBPTVhfUzE2OwogCiAvKiBPTVhfVTMyICovCi0jaWYgVUlOVF9NQVggPT0gMHhmZmZmZmZmZgotdHlwZWRlZiB1bnNpZ25lZCBpbnQgT01YX1UzMjsKLSNlbGlmIExPTkdfTUFYID09IDB4ZmZmZmZmZmYKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgT01YX1UzMjsgCi0jZWxzZQotI2Vycm9yIE9NWF9VMzIgdW5kZWZpbmVkCi0jZW5kaWYKLQordHlwZWRlZiB1aW50MzJfdCBPTVhfVTMyOwogCiAvKiBPTVhfUzMyICovCi0jaWYgSU5UX01BWCA9PSAweDdmZmZmZmZmCi10eXBlZGVmIHNpZ25lZCBpbnQgT01YX1MzMjsKLSNlbGlmIExPTkdfTUFYID09IDB4N2ZmZmZmZmYKLXR5cGVkZWYgbG9uZyBzaWduZWQgaW50IE9NWF9TMzI7IAotI2Vsc2UKLSNlcnJvciBPTVhfUzMyIHVuZGVmaW5lZAotI2VuZGlmCi0KK3R5cGVkZWYgaW50MzJfdCBPTVhfUzMyOwogCiAvKiBPTVhfVTY0ICYgT01YX1M2NCAqLwogI2lmIGRlZmluZWQoIF9XSU4zMiApIHx8IGRlZmluZWQgKCBfV0lONjQgKQpAQCAtMTQzLDE1ICsxMDIsMTQgQEAKICAgICAjZGVmaW5lIE9NWF9NQVhfUzY0CQkJKDB4N0ZGRkZGRkZGRkZGRkZGRmk2NCkKICAgICAjZGVmaW5lIE9NWF9NQVhfVTY0CQkJKDB4RkZGRkZGRkZGRkZGRkZGRmk2NCkKICNlbHNlCi0gICAgdHlwZWRlZiBsb25nIGxvbmcgT01YX1M2NDsgLyoqIFNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLwotICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIE9NWF9VNjQ7IC8qKiBVbnNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLworICAgIHR5cGVkZWYgaW50NjRfdCBPTVhfUzY0OyAvKiogU2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCisgICAgdHlwZWRlZiB1aW50NjRfdCBPTVhfVTY0OyAvKiogVW5zaWduZWQgNjQtYml0IGludGVnZXIgKi8KICAgICAjZGVmaW5lIE9NWF9NSU5fUzY0CQkJKDB4ODAwMDAwMDAwMDAwMDAwMExMKQogICAgICNkZWZpbmUgT01YX01JTl9VNjQJCQkoMHgwMDAwMDAwMDAwMDAwMDAwTEwpCiAgICAgI2RlZmluZSBPTVhfTUFYX1M2NAkJCSgweDdGRkZGRkZGRkZGRkZGRkZMTCkKICAgICAjZGVmaW5lIE9NWF9NQVhfVTY0CQkJKDB4RkZGRkZGRkZGRkZGRkZGRkxMKQogI2VuZGlmCiAKLQogLyogT01YX1NDOCAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvb214dHlwZXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvb214dHlwZXMuaAppbmRleCA4YjI5NWE2Li45MTJjYjBkIDEwMDc1NQotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL29teHR5cGVzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9vbXh0eXBlcy5oCkBAIC0zMiw2ICszMiw3IEBACiAjZGVmaW5lIF9PTVhUWVBFU19IXwogCiAjaW5jbHVkZSA8bGltaXRzLmg+IAorI2luY2x1ZGUgPHN0ZGludC5oPgogCiAjZGVmaW5lIE9NWF9JTgogI2RlZmluZSBPTVhfT1VUCkBAIC03NSw2NCArNzYsMjIgQEAKIAogIAogLyogT01YX1U4ICovCi0jaWYgVUNIQVJfTUFYID09IDB4ZmYKLXR5cGVkZWYgdW5zaWduZWQgY2hhciBPTVhfVTg7Ci0jZWxpZiBVU0hSVF9NQVggPT0gMHhmZiAKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IE9NWF9VODsgCi0jZWxzZQotI2Vycm9yIE9NWF9VOCB1bmRlZmluZWQKLSNlbmRpZiAKLQordHlwZWRlZiB1aW50OF90IE9NWF9VODsKICAKIC8qIE9NWF9TOCAqLwotI2lmIFNDSEFSX01BWCA9PSAweDdmIAotdHlwZWRlZiBzaWduZWQgY2hhciBPTVhfUzg7Ci0jZWxpZiBTSFJUX01BWCA9PSAweDdmIAotdHlwZWRlZiBzaWduZWQgc2hvcnQgaW50IE9NWF9TODsgCi0jZWxzZQotI2Vycm9yIE9NWF9TOCB1bmRlZmluZWQKLSNlbmRpZgotIAordHlwZWRlZiBpbnQ4X3QgT01YX1M4OwogIAogLyogT01YX1UxNiAqLwotI2lmIFVTSFJUX01BWCA9PSAweGZmZmYKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IE9NWF9VMTY7Ci0jZWxpZiBVSU5UX01BWCA9PSAweGZmZmYKLXR5cGVkZWYgdW5zaWduZWQgaW50IE9NWF9VMTY7IAotI2Vsc2UKLSNlcnJvciBPTVhfVTE2IHVuZGVmaW5lZAotI2VuZGlmCi0KK3R5cGVkZWYgdWludDE2X3QgT01YX1UxNjsKIAogLyogT01YX1MxNiAqLwotI2lmIFNIUlRfTUFYID09IDB4N2ZmZiAKLXR5cGVkZWYgc2lnbmVkIHNob3J0IGludCBPTVhfUzE2OwotI2VsaWYgSU5UX01BWCA9PSAweDdmZmYgCi10eXBlZGVmIHNpZ25lZCBpbnQgT01YX1MxNjsgCi0jZWxzZQotI2Vycm9yIE9NWF9TMTYgdW5kZWZpbmVkCi0jZW5kaWYKLQordHlwZWRlZiBpbnQxNl90IE9NWF9TMTY7CiAKIC8qIE9NWF9VMzIgKi8KLSNpZiBVSU5UX01BWCA9PSAweGZmZmZmZmZmCi10eXBlZGVmIHVuc2lnbmVkIGludCBPTVhfVTMyOwotI2VsaWYgTE9OR19NQVggPT0gMHhmZmZmZmZmZgotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBPTVhfVTMyOyAKLSNlbHNlCi0jZXJyb3IgT01YX1UzMiB1bmRlZmluZWQKLSNlbmRpZgotCit0eXBlZGVmIHVpbnQzMl90IE9NWF9VMzI7CiAKIC8qIE9NWF9TMzIgKi8KLSNpZiBJTlRfTUFYID09IDB4N2ZmZmZmZmYKLXR5cGVkZWYgc2lnbmVkIGludCBPTVhfUzMyOwotI2VsaWYgTE9OR19NQVggPT0gMHg3ZmZmZmZmZgotdHlwZWRlZiBsb25nIHNpZ25lZCBpbnQgT01YX1MzMjsgCi0jZWxzZQotI2Vycm9yIE9NWF9TMzIgdW5kZWZpbmVkCi0jZW5kaWYKLQordHlwZWRlZiBpbnQzMl90IE9NWF9TMzI7CiAKIC8qIE9NWF9VNjQgJiBPTVhfUzY0ICovCiAjaWYgZGVmaW5lZCggX1dJTjMyICkgfHwgZGVmaW5lZCAoIF9XSU42NCApCkBAIC0xNDMsMTUgKzEwMiwxNCBAQAogICAgICNkZWZpbmUgT01YX01BWF9TNjQJCQkoMHg3RkZGRkZGRkZGRkZGRkZGaTY0KQogICAgICNkZWZpbmUgT01YX01BWF9VNjQJCQkoMHhGRkZGRkZGRkZGRkZGRkZGaTY0KQogI2Vsc2UKLSAgICB0eXBlZGVmIGxvbmcgbG9uZyBPTVhfUzY0OyAvKiogU2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCi0gICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgT01YX1U2NDsgLyoqIFVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCisgICAgdHlwZWRlZiBpbnQ2NF90IE9NWF9TNjQ7IC8qKiBTaWduZWQgNjQtYml0IGludGVnZXIgKi8KKyAgICB0eXBlZGVmIHVpbnQ2NF90IE9NWF9VNjQ7IC8qKiBVbnNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLwogICAgICNkZWZpbmUgT01YX01JTl9TNjQJCQkoMHg4MDAwMDAwMDAwMDAwMDAwTEwpCiAgICAgI2RlZmluZSBPTVhfTUlOX1U2NAkJCSgweDAwMDAwMDAwMDAwMDAwMDBMTCkKICAgICAjZGVmaW5lIE9NWF9NQVhfUzY0CQkJKDB4N0ZGRkZGRkZGRkZGRkZGRkxMKQogICAgICNkZWZpbmUgT01YX01BWF9VNjQJCQkoMHhGRkZGRkZGRkZGRkZGRkZGTEwpCiAjZW5kaWYKIAotCiAvKiBPTVhfU0M4ICovCiB0eXBlZGVmIHN0cnVjdAogewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5TCmluZGV4IDA3M2RiYmEuLmJjYzZiNmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MuUworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLlMKQEAgLTEwLDYgKzEwLDIyIEBACiAgICAgLmZwdSBuZW9uCiAgICAgLnRleHQKIAorICAgIC5leHRlcm4gICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlcworICAgIC5leHRlcm4gICBhcm1WQ000UDEwX1N1ZmZpeFRvTGV2ZWwKKyAgICAuZXh0ZXJuICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXMKKyAgICAuZXh0ZXJuICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlcworICAgIC5leHRlcm4gICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzCisgICAgLmV4dGVybiAgIGFybVZDTTRQMTBfWmlnWmFnXzJ4MgorICAgIC5leHRlcm4gICBhcm1WQ000UDEwX1ppZ1phZ180eDQKKworICAgIC5oaWRkZW4gICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlcworICAgIC5oaWRkZW4gICBhcm1WQ000UDEwX1N1ZmZpeFRvTGV2ZWwKKyAgICAuaGlkZGVuICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXMKKyAgICAuaGlkZGVuICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlcworICAgIC5oaWRkZW4gICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzCisgICAgLmhpZGRlbiAgIGFybVZDTTRQMTBfWmlnWmFnXzJ4MgorICAgIC5oaWRkZW4gICBhcm1WQ000UDEwX1ppZ1phZ180eDQKKwogICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIKICAgICAuZnVuYyAgIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyCiBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcjoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5TCmluZGV4IDQ0ZWI0MjguLjViYzc4NzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLlMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MuUwpAQCAtMjAsNiArMjAsMTQgQEAKICAgICAuZ2xvYmFsIGFybVZDTTRQMTBfUVBNb2R1bG9UYWJsZQogICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9WTWF0cml4VTE2CiAKKyAgICAuaGlkZGVuIGFybVZDTTRQMTBfUVBEaXZUYWJsZQorICAgIC5oaWRkZW4gYXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZQorICAgIC5oaWRkZW4gYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDQKKyAgICAuaGlkZGVuIGFybVZDTTRQMTBfUG9zVG9WQ29sMngyCisgICAgLmhpZGRlbiBhcm1WQ000UDEwX1ZNYXRyaXgKKyAgICAuaGlkZGVuIGFybVZDTTRQMTBfUVBNb2R1bG9UYWJsZQorICAgIC5oaWRkZW4gYXJtVkNNNFAxMF9WTWF0cml4VTE2CisKIGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0OgogICAgIC5ieXRlICAwLCAyLCAwLCAyCiAgICAgLmJ5dGUgIDIsIDEsIDIsIDEKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL29teHR5cGVzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9vbXh0eXBlcy5oCmluZGV4IDhiMjk1YTYuLjkxMmNiMGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL29teHR5cGVzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9hcGkvb214dHlwZXMuaApAQCAtMzIsNiArMzIsNyBAQAogI2RlZmluZSBfT01YVFlQRVNfSF8KIAogI2luY2x1ZGUgPGxpbWl0cy5oPiAKKyNpbmNsdWRlIDxzdGRpbnQuaD4KIAogI2RlZmluZSBPTVhfSU4KICNkZWZpbmUgT01YX09VVApAQCAtNzUsNjQgKzc2LDIyIEBACiAKICAKIC8qIE9NWF9VOCAqLwotI2lmIFVDSEFSX01BWCA9PSAweGZmCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgT01YX1U4OwotI2VsaWYgVVNIUlRfTUFYID09IDB4ZmYgCi10eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCBPTVhfVTg7IAotI2Vsc2UKLSNlcnJvciBPTVhfVTggdW5kZWZpbmVkCi0jZW5kaWYgCi0KK3R5cGVkZWYgdWludDhfdCBPTVhfVTg7CiAgCiAvKiBPTVhfUzggKi8KLSNpZiBTQ0hBUl9NQVggPT0gMHg3ZiAKLXR5cGVkZWYgc2lnbmVkIGNoYXIgT01YX1M4OwotI2VsaWYgU0hSVF9NQVggPT0gMHg3ZiAKLXR5cGVkZWYgc2lnbmVkIHNob3J0IGludCBPTVhfUzg7IAotI2Vsc2UKLSNlcnJvciBPTVhfUzggdW5kZWZpbmVkCi0jZW5kaWYKLSAKK3R5cGVkZWYgaW50OF90IE9NWF9TODsKICAKIC8qIE9NWF9VMTYgKi8KLSNpZiBVU0hSVF9NQVggPT0gMHhmZmZmCi10eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCBPTVhfVTE2OwotI2VsaWYgVUlOVF9NQVggPT0gMHhmZmZmCi10eXBlZGVmIHVuc2lnbmVkIGludCBPTVhfVTE2OyAKLSNlbHNlCi0jZXJyb3IgT01YX1UxNiB1bmRlZmluZWQKLSNlbmRpZgotCit0eXBlZGVmIHVpbnQxNl90IE9NWF9VMTY7CiAKIC8qIE9NWF9TMTYgKi8KLSNpZiBTSFJUX01BWCA9PSAweDdmZmYgCi10eXBlZGVmIHNpZ25lZCBzaG9ydCBpbnQgT01YX1MxNjsKLSNlbGlmIElOVF9NQVggPT0gMHg3ZmZmIAotdHlwZWRlZiBzaWduZWQgaW50IE9NWF9TMTY7IAotI2Vsc2UKLSNlcnJvciBPTVhfUzE2IHVuZGVmaW5lZAotI2VuZGlmCi0KK3R5cGVkZWYgaW50MTZfdCBPTVhfUzE2OwogCiAvKiBPTVhfVTMyICovCi0jaWYgVUlOVF9NQVggPT0gMHhmZmZmZmZmZgotdHlwZWRlZiB1bnNpZ25lZCBpbnQgT01YX1UzMjsKLSNlbGlmIExPTkdfTUFYID09IDB4ZmZmZmZmZmYKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgT01YX1UzMjsgCi0jZWxzZQotI2Vycm9yIE9NWF9VMzIgdW5kZWZpbmVkCi0jZW5kaWYKLQordHlwZWRlZiB1aW50MzJfdCBPTVhfVTMyOwogCiAvKiBPTVhfUzMyICovCi0jaWYgSU5UX01BWCA9PSAweDdmZmZmZmZmCi10eXBlZGVmIHNpZ25lZCBpbnQgT01YX1MzMjsKLSNlbGlmIExPTkdfTUFYID09IDB4N2ZmZmZmZmYKLXR5cGVkZWYgbG9uZyBzaWduZWQgaW50IE9NWF9TMzI7IAotI2Vsc2UKLSNlcnJvciBPTVhfUzMyIHVuZGVmaW5lZAotI2VuZGlmCi0KK3R5cGVkZWYgaW50MzJfdCBPTVhfUzMyOwogCiAvKiBPTVhfVTY0ICYgT01YX1M2NCAqLwogI2lmIGRlZmluZWQoIF9XSU4zMiApIHx8IGRlZmluZWQgKCBfV0lONjQgKQpAQCAtMTQzLDE1ICsxMDIsMTQgQEAKICAgICAjZGVmaW5lIE9NWF9NQVhfUzY0CQkJKDB4N0ZGRkZGRkZGRkZGRkZGRmk2NCkKICAgICAjZGVmaW5lIE9NWF9NQVhfVTY0CQkJKDB4RkZGRkZGRkZGRkZGRkZGRmk2NCkKICNlbHNlCi0gICAgdHlwZWRlZiBsb25nIGxvbmcgT01YX1M2NDsgLyoqIFNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLwotICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIE9NWF9VNjQ7IC8qKiBVbnNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLworICAgIHR5cGVkZWYgaW50NjRfdCBPTVhfUzY0OyAvKiogU2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCisgICAgdHlwZWRlZiB1aW50NjRfdCBPTVhfVTY0OyAvKiogVW5zaWduZWQgNjQtYml0IGludGVnZXIgKi8KICAgICAjZGVmaW5lIE9NWF9NSU5fUzY0CQkJKDB4ODAwMDAwMDAwMDAwMDAwMExMKQogICAgICNkZWZpbmUgT01YX01JTl9VNjQJCQkoMHgwMDAwMDAwMDAwMDAwMDAwTEwpCiAgICAgI2RlZmluZSBPTVhfTUFYX1M2NAkJCSgweDdGRkZGRkZGRkZGRkZGRkZMTCkKICAgICAjZGVmaW5lIE9NWF9NQVhfVTY0CQkJKDB4RkZGRkZGRkZGRkZGRkZGRkxMKQogI2VuZGlmCiAKLQogLyogT01YX1NDOCAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvSDI2NFN3RGVjQXBpLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL0gyNjRTd0RlY0FwaS5jCmluZGV4IGE2ZjM5ZGMuLjJjMTUyZWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvSDI2NFN3RGVjQXBpLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9IMjY0U3dEZWNBcGkuYwpAQCAtNDQsNiArNDQsOCBAQAogI2luY2x1ZGUgImgyNjRic2RfZGVjb2Rlci5oIgogI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgogCisjZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKKwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICBWZXJzaW9uIEluZm9ybWF0aW9uCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtNzUsNiArNzcsNyBAQAogI2VuZGlmCiAKIHZvaWQgSDI2NFN3RGVjVHJhY2UoY2hhciAqc3RyaW5nKSB7CisgICAgVU5VU0VEKHN0cmluZyk7CiB9CiAKIHZvaWQqIEgyNjRTd0RlY01hbGxvYyh1MzIgc2l6ZSwgdTMyIG51bSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NvbmNlYWwuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jb25jZWFsLmMKaW5kZXggNDkzZmI5ZS4uN2EyNjJlZCAxMDA3NTUKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NvbmNlYWwuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY29uY2VhbC5jCkBAIC0yNjcsNyArMjY3LDcgQEAKICAgICBpMzIgZmlyc3RQaGFzZVsxNl07CiAgICAgaTMyICpwVG1wOwogICAgIC8qIG5laWdoYm91cnMgYWJvdmUsIGJlbG93LCBsZWZ0IGFuZCByaWdodCAqLwotICAgIGkzMiBhWzRdLCBiWzRdLCBsWzRdLCByWzRdOworICAgIGkzMiBhWzRdID0geyAwLDAsMCwwIH0sIGJbNF0sIGxbNF0gPSB7IDAsMCwwLDAgfSwgcls0XTsKICAgICB1MzIgQSwgQiwgTCwgUjsKICNpZmRlZiBIMjY0REVDX09NWERMCiAgICAgdTggZmlsbEJ1ZmZbMzIqMjEgKyAxNSArIDMyXTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRyYV9wcmVkaWN0aW9uLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW50cmFfcHJlZGljdGlvbi5jCmluZGV4IDE1ZWFiZmIuLjUyYzg1ZTUgMTAwNzU1Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRyYV9wcmVkaWN0aW9uLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ludHJhX3ByZWRpY3Rpb24uYwpAQCAtMTExMCw3ICsxMTEwLDcgQEAKIAogLyogVmFyaWFibGVzICovCiAKLSAgICB1MzIgaSwgajsKKyAgICBpMzIgaSwgajsKICAgICBpMzIgYSwgYiwgYzsKICAgICBpMzIgdG1wOwogCkBAIC0xMTIzLDIwICsxMTIzLDIwIEBACiAgICAgYSA9IDE2ICogKGFib3ZlWzE1XSArIGxlZnRbMTVdKTsKIAogICAgIGZvciAoaSA9IDAsIGIgPSAwOyBpIDwgODsgaSsrKQotICAgICAgICBiICs9ICgoaTMyKWkgKyAxKSAqIChhYm92ZVs4K2ldIC0gYWJvdmVbNi1pXSk7CisgICAgICAgIGIgKz0gKGkgKyAxKSAqIChhYm92ZVs4K2ldIC0gYWJvdmVbNi1pXSk7CiAgICAgYiA9ICg1ICogYiArIDMyKSA+PiA2OwogCiAgICAgZm9yIChpID0gMCwgYyA9IDA7IGkgPCA3OyBpKyspCi0gICAgICAgIGMgKz0gKChpMzIpaSArIDEpICogKGxlZnRbOCtpXSAtIGxlZnRbNi1pXSk7CisgICAgICAgIGMgKz0gKGkgKyAxKSAqIChsZWZ0WzgraV0gLSBsZWZ0WzYtaV0pOwogICAgIC8qIHBbLTEsLTFdIGhhcyB0byBiZSBhY2Nlc3NlZCB0aHJvdWdoIGFib3ZlIHBvaW50ZXIgKi8KLSAgICBjICs9ICgoaTMyKWkgKyAxKSAqIChsZWZ0WzgraV0gLSBhYm92ZVstMV0pOworICAgIGMgKz0gKGkgKyAxKSAqIChsZWZ0WzgraV0gLSBhYm92ZVstMV0pOwogICAgIGMgPSAoNSAqIGMgKyAzMikgPj4gNjsKIAogICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQogICAgIHsKICAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IChhICsgYiAqICgoaTMyKWogLSA3KSArIGMgKiAoKGkzMilpIC0gNykgKyAxNikgPj4gNTsKKyAgICAgICAgICAgIHRtcCA9IChhICsgYiAqIChqIC0gNykgKyBjICogKGkgLSA3KSArIDE2KSA+PiA1OwogICAgICAgICAgICAgZGF0YVtpKjE2K2pdID0gKHU4KUNMSVAxKHRtcCk7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcmVjb25zdHJ1Y3QuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9yZWNvbnN0cnVjdC5jCmluZGV4IGM5NDg3NzYuLmI0MDlhMDYgMTAwNzU1Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9yZWNvbnN0cnVjdC5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9yZWNvbnN0cnVjdC5jCkBAIC00Miw2ICs0Miw4IEBACiAjaW5jbHVkZSAiYXJtVkMuaCIKICNlbmRpZiAvKiBIMjY0REVDX09NWERMICovCiAKKyNkZWZpbmUgVU5VU0VEKHgpICh2b2lkKSh4KQorCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMjEzNiw3ICsyMTM4LDggQEAKICAgaTMyIGNlbnRlciwKICAgaTMyIHJpZ2h0KQogewotCisgICAgVU5VU0VEKGxlZnQpOworICAgIFVOVVNFRChyaWdodCk7CiAgICAgQVNTRVJUKHJlZik7CiAgICAgQVNTRVJUKGZpbGwpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfaGVhZGVyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfaGVhZGVyLmMKaW5kZXggYTdjNmY2NC4uMjM0MDFjNiAxMDA3NTUKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2hlYWRlci5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9oZWFkZXIuYwpAQCAtNDcsNiArNDcsOCBAQAogI2luY2x1ZGUgImgyNjRic2RfbmFsX3VuaXQuaCIKICNpbmNsdWRlICJoMjY0YnNkX2RwYi5oIgogCisjZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKKwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE0MDcsNiArMTQwOSw3IEBACiAgICAgdTMyIHRtcCwgdmFsdWUsIGk7CiAgICAgaTMyIGl2YWx1ZTsKICAgICBzdHJtRGF0YV90IHRtcFN0cm1EYXRhWzFdOworICAgIFVOVVNFRChuYWxVbml0VHlwZSk7CiAKIC8qIENvZGUgKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3V0aWwuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF91dGlsLmMKaW5kZXggY2M4MzhmZC4uZmI5N2EyOCAxMDA3NTUKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3V0aWwuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdXRpbC5jCkBAIC0xODYsNyArMTg2LDcgQEAKICAgICAgICAgcmV0dXJuKEhBTlRST19GQUxTRSk7CiAKICAgICBpZiAoIChiaXRzID4gOCkgfHwKLSAgICAgICAgICgoaDI2NGJzZFNob3dCaXRzMzIocFN0cm1EYXRhKT4+KDMyLWJpdHMpKSAhPSAoMSA8PCAoYml0cy0xKSkpICkKKyAgICAgICAgICgoaDI2NGJzZFNob3dCaXRzMzIocFN0cm1EYXRhKT4+KDMyLWJpdHMpKSAhPSAoMXVsIDw8IChiaXRzLTEpKSkgKQogICAgICAgICByZXR1cm4oSEFOVFJPX1RSVUUpOwogICAgIGVsc2UKICAgICAgICAgcmV0dXJuKEhBTlRST19GQUxTRSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdXRpbC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3V0aWwuaAppbmRleCA0MGRmYTliLi45ZjBlYjdkIDEwMDc1NQotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdXRpbC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF91dGlsLmgKQEAgLTQyLDYgKzQyLDcgQEAKICNpbmNsdWRlIDxzdGRpby5oPgogI2VuZGlmCiAKKyNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlICJiYXNldHlwZS5oIgogI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCiAjaW5jbHVkZSAiaDI2NGJzZF9pbWFnZS5oIgpAQCAtMTUwLDcgKzE1MSw3IEBACiB9CiAKICNkZWZpbmUgQUxJR04ocHRyLCBieXRlUG9zKSBcCi0gICAgICAgIChwdHIgKyAoICgoYnl0ZVBvcyAtIChpbnQpcHRyKSAmIChieXRlUG9zIC0gMSkpIC8gc2l6ZW9mKCpwdHIpICkpCisgICAgICAgIChwdHIgKyAoICgoYnl0ZVBvcyAtICh1aW50cHRyX3QpcHRyKSAmIChieXRlUG9zIC0gMSkpIC8gc2l6ZW9mKCpwdHIpICkpCiAKIGV4dGVybiBjb25zdCB1MzIgaDI2NGJzZFFwQ1s1Ml07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NWIxNzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNCBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM3OWM1ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTkgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgICAgIFNvZnRPcHVzLmNwcAorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICAgICAgZXh0ZXJuYWwvbGlib3B1cy9pbmNsdWRlIFwKKyAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKKyAgICAgICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgICAgIGxpYm9wdXMgbGlic3RhZ2VmcmlnaHQgbGlic3RhZ2VmcmlnaHRfb214IFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJ1dGlscyBsaWJsb2cKKworTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X3NvZnRfb3B1c2RlYworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZDE0MTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuY3BwCkBAIC0wLDAgKzEsNTYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTb2Z0T3B1cyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIlNvZnRPcHVzLmgiCisjaW5jbHVkZSA8T01YX0F1ZGlvRXh0Lmg+CisjaW5jbHVkZSA8T01YX0luZGV4RXh0Lmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorCitleHRlcm4gIkMiIHsKKyAgICAjaW5jbHVkZSA8b3B1cy5oPgorICAgICNpbmNsdWRlIDxvcHVzX211bHRpc3RyZWFtLmg+Cit9CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGNvbnN0IGludCBrUmF0ZSA9IDQ4MDAwOworCisvLyBPcHVzIHVzZXMgVm9yYmlzIGNoYW5uZWwgbWFwcGluZywgYW5kIFZvcmJpcyBjaGFubmVsIG1hcHBpbmcgc3BlY2lmaWVzCisvLyBtYXBwaW5ncyBmb3IgdXAgdG8gOCBjaGFubmVscy4gVGhpcyBpbmZvcm1hdGlvbiBpcyBwYXJ0IG9mIHRoZSBWb3JiaXMgSQorLy8gU3BlY2lmaWNhdGlvbjoKKy8vIGh0dHA6Ly93d3cueGlwaC5vcmcvdm9yYmlzL2RvYy9Wb3JiaXNfSV9zcGVjLmh0bWwKK3N0YXRpYyBjb25zdCBpbnQga01heENoYW5uZWxzID0gODsKKwordGVtcGxhdGU8Y2xhc3MgVD4KK3N0YXRpYyB2b2lkIEluaXRPTVhQYXJhbXMoVCAqcGFyYW1zKSB7CisgICAgcGFyYW1zLT5uU2l6ZSA9IHNpemVvZihUKTsKKyAgICBwYXJhbXMtPm5WZXJzaW9uLnMublZlcnNpb25NYWpvciA9IDE7CisgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5WZXJzaW9uTWlub3IgPSAwOworICAgIHBhcmFtcy0+blZlcnNpb24ucy5uUmV2aXNpb24gPSAwOworICAgIHBhcmFtcy0+blZlcnNpb24ucy5uU3RlcCA9IDA7Cit9CisKK1NvZnRPcHVzOjpTb2Z0T3B1cygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAorICAgICAgICBPTVhfUFRSIGFwcERhdGEsCisgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KQorICAgIDogU2ltcGxlU29mdE9NWENvbXBvbmVudChuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCksCisgICAgICBtSW5wdXRCdWZmZXJDb3VudCgwKSwKKyAgICAgIG1EZWNvZGVyKE5VTEwpLAorICAgICAgbUhlYWRlcihOVUxMKSwKKyAgICAgIG1Db2RlY0RlbGF5KDApLAorICAgICAgbVNlZWtQcmVSb2xsKDApLAorICAgICAgbUFuY2hvclRpbWVVcygwKSwKKyAgICAgIG1OdW1GcmFtZXNPdXRwdXQoMCksCisgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlKE5PTkUpIHsKKyAgICBpbml0UG9ydHMoKTsKKyAgICBDSEVDS19FUShpbml0RGVjb2RlcigpLCAoc3RhdHVzX3QpT0spOworfQorCitTb2Z0T3B1czo6flNvZnRPcHVzKCkgeworICAgIGlmIChtRGVjb2RlciAhPSBOVUxMKSB7CisgICAgICAgIG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9kZXN0cm95KG1EZWNvZGVyKTsKKyAgICAgICAgbURlY29kZXIgPSBOVUxMOworICAgIH0KKyAgICBpZiAobUhlYWRlciAhPSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBtSGVhZGVyOworICAgICAgICBtSGVhZGVyID0gTlVMTDsKKyAgICB9Cit9CisKK3ZvaWQgU29mdE9wdXM6OmluaXRQb3J0cygpIHsKKyAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFIGRlZjsKKyAgICBJbml0T01YUGFyYW1zKCZkZWYpOworCisgICAgZGVmLm5Qb3J0SW5kZXggPSAwOworICAgIGRlZi5lRGlyID0gT01YX0RpcklucHV0OworICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gPSBrTnVtQnVmZmVyczsKKyAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsID0gZGVmLm5CdWZmZXJDb3VudE1pbjsKKyAgICBkZWYubkJ1ZmZlclNpemUgPSA5NjAgKiA2OworICAgIGRlZi5iRW5hYmxlZCA9IE9NWF9UUlVFOworICAgIGRlZi5iUG9wdWxhdGVkID0gT01YX0ZBTFNFOworICAgIGRlZi5lRG9tYWluID0gT01YX1BvcnREb21haW5BdWRpbzsKKyAgICBkZWYuYkJ1ZmZlcnNDb250aWd1b3VzID0gT01YX0ZBTFNFOworICAgIGRlZi5uQnVmZmVyQWxpZ25tZW50ID0gMTsKKworICAgIGRlZi5mb3JtYXQuYXVkaW8uY01JTUVUeXBlID0KKyAgICAgICAgY29uc3RfY2FzdDxjaGFyICo+KE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMpOworCisgICAgZGVmLmZvcm1hdC5hdWRpby5wTmF0aXZlUmVuZGVyID0gTlVMTDsKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLmJGbGFnRXJyb3JDb25jZWFsbWVudCA9IE9NWF9GQUxTRTsKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLmVFbmNvZGluZyA9CisgICAgICAgIChPTVhfQVVESU9fQ09ESU5HVFlQRSlPTVhfQVVESU9fQ29kaW5nQW5kcm9pZE9QVVM7CisKKyAgICBhZGRQb3J0KGRlZik7CisKKyAgICBkZWYublBvcnRJbmRleCA9IDE7CisgICAgZGVmLmVEaXIgPSBPTVhfRGlyT3V0cHV0OworICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gPSBrTnVtQnVmZmVyczsKKyAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsID0gZGVmLm5CdWZmZXJDb3VudE1pbjsKKyAgICBkZWYubkJ1ZmZlclNpemUgPSBrTWF4TnVtU2FtcGxlc1BlckJ1ZmZlciAqIHNpemVvZihpbnQxNl90KSAqIGtNYXhDaGFubmVsczsKKyAgICBkZWYuYkVuYWJsZWQgPSBPTVhfVFJVRTsKKyAgICBkZWYuYlBvcHVsYXRlZCA9IE9NWF9GQUxTRTsKKyAgICBkZWYuZURvbWFpbiA9IE9NWF9Qb3J0RG9tYWluQXVkaW87CisgICAgZGVmLmJCdWZmZXJzQ29udGlndW91cyA9IE9NWF9GQUxTRTsKKyAgICBkZWYubkJ1ZmZlckFsaWdubWVudCA9IDI7CisKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLmNNSU1FVHlwZSA9IGNvbnN0X2Nhc3Q8Y2hhciAqPigiYXVkaW8vcmF3Iik7CisgICAgZGVmLmZvcm1hdC5hdWRpby5wTmF0aXZlUmVuZGVyID0gTlVMTDsKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLmJGbGFnRXJyb3JDb25jZWFsbWVudCA9IE9NWF9GQUxTRTsKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLmVFbmNvZGluZyA9IE9NWF9BVURJT19Db2RpbmdQQ007CisKKyAgICBhZGRQb3J0KGRlZik7Cit9CisKK3N0YXR1c190IFNvZnRPcHVzOjppbml0RGVjb2RlcigpIHsKKyAgICByZXR1cm4gT0s7Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdE9wdXM6OmludGVybmFsR2V0UGFyYW1ldGVyKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcykgeworICAgIHN3aXRjaCAoKGludClpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkT3B1czoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX0FORFJPSURfT1BVU1RZUEUgKm9wdXNQYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9PUFVTVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0ob3B1c1BhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAob3B1c1BhcmFtcy0+blBvcnRJbmRleCAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3B1c1BhcmFtcy0+bkF1ZGlvQmFuZFdpZHRoID0gMDsKKyAgICAgICAgICAgIG9wdXNQYXJhbXMtPm5TYW1wbGVSYXRlID0ga1JhdGU7CisgICAgICAgICAgICBvcHVzUGFyYW1zLT5uQml0UmF0ZSA9IDA7CisKKyAgICAgICAgICAgIGlmICghaXNDb25maWd1cmVkKCkpIHsKKyAgICAgICAgICAgICAgICBvcHVzUGFyYW1zLT5uQ2hhbm5lbHMgPSAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvcHVzUGFyYW1zLT5uQ2hhbm5lbHMgPSBtSGVhZGVyLT5jaGFubmVsczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9QY206CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqcGNtUGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShwY21QYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+blBvcnRJbmRleCAhPSAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGNtUGFyYW1zLT5lTnVtRGF0YSA9IE9NWF9OdW1lcmljYWxEYXRhU2lnbmVkOworICAgICAgICAgICAgcGNtUGFyYW1zLT5lRW5kaWFuID0gT01YX0VuZGlhbkJpZzsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+YkludGVybGVhdmVkID0gT01YX1RSVUU7CisgICAgICAgICAgICBwY21QYXJhbXMtPm5CaXRQZXJTYW1wbGUgPSAxNjsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+ZVBDTU1vZGUgPSBPTVhfQVVESU9fUENNTW9kZUxpbmVhcjsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUNoYW5uZWxNYXBwaW5nWzBdID0gT01YX0FVRElPX0NoYW5uZWxMRjsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUNoYW5uZWxNYXBwaW5nWzFdID0gT01YX0FVRElPX0NoYW5uZWxSRjsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+blNhbXBsaW5nUmF0ZSA9IGtSYXRlOworCisgICAgICAgICAgICBpZiAoIWlzQ29uZmlndXJlZCgpKSB7CisgICAgICAgICAgICAgICAgcGNtUGFyYW1zLT5uQ2hhbm5lbHMgPSAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwY21QYXJhbXMtPm5DaGFubmVscyA9IG1IZWFkZXItPmNoYW5uZWxzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoaW5kZXgsIHBhcmFtcyk7CisgICAgfQorfQorCitPTVhfRVJST1JUWVBFIFNvZnRPcHVzOjppbnRlcm5hbFNldFBhcmFtZXRlcigKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpIHsKKyAgICBzd2l0Y2ggKChpbnQpaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVN0YW5kYXJkQ29tcG9uZW50Um9sZToKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICpyb2xlUGFyYW1zID0KKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShyb2xlUGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdHJuY21wKChjb25zdCBjaGFyICopcm9sZVBhcmFtcy0+Y1JvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5vcHVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFIC0gMSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb0FuZHJvaWRPcHVzOgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9PUFVTVFlQRSAqb3B1c1BhcmFtcyA9CisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9BVURJT19QQVJBTV9BTkRST0lEX09QVVNUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShvcHVzUGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChvcHVzUGFyYW1zLT5uUG9ydEluZGV4ICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6aW50ZXJuYWxTZXRQYXJhbWV0ZXIoaW5kZXgsIHBhcmFtcyk7CisgICAgfQorfQorCitib29sIFNvZnRPcHVzOjppc0NvbmZpZ3VyZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbnB1dEJ1ZmZlckNvdW50ID49IDE7Cit9CisKK3N0YXRpYyB1aW50MTZfdCBSZWFkTEUxNihjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlYWRfb2Zmc2V0KSB7CisgICAgaWYgKHJlYWRfb2Zmc2V0ICsgMSA+IGRhdGFfc2l6ZSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgdWludDE2X3QgdmFsOworICAgIHZhbCA9IGRhdGFbcmVhZF9vZmZzZXRdOworICAgIHZhbCB8PSBkYXRhW3JlYWRfb2Zmc2V0ICsgMV0gPDwgODsKKyAgICByZXR1cm4gdmFsOworfQorCisvLyBNYXhpbXVtIHBhY2tldCBzaXplIHVzZWQgaW4gWGlwaCdzIG9wdXNkZWMuCitzdGF0aWMgY29uc3QgaW50IGtNYXhPcHVzT3V0cHV0UGFja2V0U2l6ZVNhbXBsZXMgPSA5NjAgKiA2OworCisvLyBEZWZhdWx0IGF1ZGlvIG91dHB1dCBjaGFubmVsIGxheW91dC4gVXNlZCB0byBpbml0aWFsaXplIHxzdHJlYW1fbWFwfCBpbgorLy8gT3B1c0hlYWRlciwgYW5kIHBhc3NlZCB0byBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3JlYXRlKCkgd2hlbiB0aGUgaGVhZGVyCisvLyBkb2VzIG5vdCBjb250YWluIG1hcHBpbmcgaW5mb3JtYXRpb24uIFRoZSB2YWx1ZXMgYXJlIHZhbGlkIG9ubHkgZm9yIG1vbm8gYW5kCisvLyBzdGVyZW8gb3V0cHV0OiBPcHVzIHN0cmVhbXMgd2l0aCBtb3JlIHRoYW4gMiBjaGFubmVscyByZXF1aXJlIGEgc3RyZWFtIG1hcC4KK3N0YXRpYyBjb25zdCBpbnQga01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXQgPSAyOworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0RlZmF1bHRPcHVzQ2hhbm5lbExheW91dFtrTWF4Q2hhbm5lbHNXaXRoRGVmYXVsdExheW91dF0gPSB7IDAsIDEgfTsKKworLy8gUGFyc2VzIE9wdXMgSGVhZGVyLiBIZWFkZXIgc3BlYzogaHR0cDovL3dpa2kueGlwaC5vcmcvT2dnT3B1cyNJRF9IZWFkZXIKK3N0YXRpYyBib29sIFBhcnNlT3B1c0hlYWRlcihjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdXNIZWFkZXIqIGhlYWRlcikgeworICAgIC8vIFNpemUgb2YgdGhlIE9wdXMgaGVhZGVyIGV4Y2x1ZGluZyBvcHRpb25hbCBtYXBwaW5nIGluZm9ybWF0aW9uLgorICAgIGNvbnN0IHNpemVfdCBrT3B1c0hlYWRlclNpemUgPSAxOTsKKworICAgIC8vIE9mZnNldCB0byB0aGUgY2hhbm5lbCBjb3VudCBieXRlIGluIHRoZSBPcHVzIGhlYWRlci4KKyAgICBjb25zdCBzaXplX3Qga09wdXNIZWFkZXJDaGFubmVsc09mZnNldCA9IDk7CisKKyAgICAvLyBPZmZzZXQgdG8gdGhlIHByZS1za2lwIHZhbHVlIGluIHRoZSBPcHVzIGhlYWRlci4KKyAgICBjb25zdCBzaXplX3Qga09wdXNIZWFkZXJTa2lwU2FtcGxlc09mZnNldCA9IDEwOworCisgICAgLy8gT2Zmc2V0IHRvIHRoZSBnYWluIHZhbHVlIGluIHRoZSBPcHVzIGhlYWRlci4KKyAgICBjb25zdCBzaXplX3Qga09wdXNIZWFkZXJHYWluT2Zmc2V0ID0gMTY7CisKKyAgICAvLyBPZmZzZXQgdG8gdGhlIGNoYW5uZWwgbWFwcGluZyBieXRlIGluIHRoZSBPcHVzIGhlYWRlci4KKyAgICBjb25zdCBzaXplX3Qga09wdXNIZWFkZXJDaGFubmVsTWFwcGluZ09mZnNldCA9IDE4OworCisgICAgLy8gT3B1cyBIZWFkZXIgY29udGFpbnMgYSBzdHJlYW0gbWFwLiBUaGUgbWFwcGluZyB2YWx1ZXMgYXJlIGluIHRoZSBoZWFkZXIKKyAgICAvLyBiZXlvbmQgdGhlIGFsd2F5cyBwcmVzZW50IHxrT3B1c0hlYWRlclNpemV8IGJ5dGVzIG9mIGRhdGEuIFRoZSBtYXBwaW5nCisgICAgLy8gZGF0YSBjb250YWlucyBzdHJlYW0gY291bnQsIGNvdXBsaW5nIGluZm9ybWF0aW9uLCBhbmQgcGVyIGNoYW5uZWwgbWFwcGluZworICAgIC8vIHZhbHVlczoKKyAgICAvLyAgIC0gQnl0ZSAwOiBOdW1iZXIgb2Ygc3RyZWFtcy4KKyAgICAvLyAgIC0gQnl0ZSAxOiBOdW1iZXIgY291cGxlZC4KKyAgICAvLyAgIC0gQnl0ZSAyOiBTdGFydGluZyBhdCBieXRlIDIgYXJlIHxoZWFkZXItPmNoYW5uZWxzfCB1aW50OCBtYXBwaW5nCisgICAgLy8gICAgICAgICAgICAgdmFsdWVzLgorICAgIGNvbnN0IHNpemVfdCBrT3B1c0hlYWRlck51bVN0cmVhbXNPZmZzZXQgPSBrT3B1c0hlYWRlclNpemU7CisgICAgY29uc3Qgc2l6ZV90IGtPcHVzSGVhZGVyTnVtQ291cGxlZE9mZnNldCA9IGtPcHVzSGVhZGVyTnVtU3RyZWFtc09mZnNldCArIDE7CisgICAgY29uc3Qgc2l6ZV90IGtPcHVzSGVhZGVyU3RyZWFtTWFwT2Zmc2V0ID0ga09wdXNIZWFkZXJOdW1TdHJlYW1zT2Zmc2V0ICsgMjsKKworICAgIGlmIChkYXRhX3NpemUgPCBrT3B1c0hlYWRlclNpemUpIHsKKyAgICAgICAgQUxPR1YoIkhlYWRlciBzaXplIGlzIHRvbyBzbWFsbC4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBoZWFkZXItPmNoYW5uZWxzID0gKihkYXRhICsga09wdXNIZWFkZXJDaGFubmVsc09mZnNldCk7CisKKyAgICBpZiAoaGVhZGVyLT5jaGFubmVscyA8PSAwIHx8IGhlYWRlci0+Y2hhbm5lbHMgPiBrTWF4Q2hhbm5lbHMpIHsKKyAgICAgICAgQUxPR1YoIkludmFsaWQgSGVhZGVyLCB3cm9uZyBjaGFubmVsIGNvdW50OiAlZCIsIGhlYWRlci0+Y2hhbm5lbHMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGhlYWRlci0+c2tpcF9zYW1wbGVzID0gUmVhZExFMTYoZGF0YSwgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtPcHVzSGVhZGVyU2tpcFNhbXBsZXNPZmZzZXQpOworICAgIGhlYWRlci0+Z2Fpbl9kYiA9IHN0YXRpY19jYXN0PGludDE2X3Q+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhZExFMTYoZGF0YSwgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga09wdXNIZWFkZXJHYWluT2Zmc2V0KSk7CisgICAgaGVhZGVyLT5jaGFubmVsX21hcHBpbmcgPSAqKGRhdGEgKyBrT3B1c0hlYWRlckNoYW5uZWxNYXBwaW5nT2Zmc2V0KTsKKyAgICBpZiAoIWhlYWRlci0+Y2hhbm5lbF9tYXBwaW5nKSB7CisgICAgICAgIGlmIChoZWFkZXItPmNoYW5uZWxzID4ga01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXQpIHsKKyAgICAgICAgICAgIEFMT0dWKCJJbnZhbGlkIEhlYWRlciwgbWlzc2luZyBzdHJlYW0gbWFwLiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGhlYWRlci0+bnVtX3N0cmVhbXMgPSAxOworICAgICAgICBoZWFkZXItPm51bV9jb3VwbGVkID0gaGVhZGVyLT5jaGFubmVscyA+IDE7CisgICAgICAgIGhlYWRlci0+c3RyZWFtX21hcFswXSA9IDA7CisgICAgICAgIGhlYWRlci0+c3RyZWFtX21hcFsxXSA9IDE7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoZGF0YV9zaXplIDwga09wdXNIZWFkZXJTdHJlYW1NYXBPZmZzZXQgKyBoZWFkZXItPmNoYW5uZWxzKSB7CisgICAgICAgIEFMT0dWKCJJbnZhbGlkIHN0cmVhbSBtYXA7IGluc3VmZmljaWVudCBkYXRhIGZvciBjdXJyZW50IGNoYW5uZWwgIgorICAgICAgICAgICAgICAiY291bnQ6ICVkIiwgaGVhZGVyLT5jaGFubmVscyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaGVhZGVyLT5udW1fc3RyZWFtcyA9ICooZGF0YSArIGtPcHVzSGVhZGVyTnVtU3RyZWFtc09mZnNldCk7CisgICAgaGVhZGVyLT5udW1fY291cGxlZCA9ICooZGF0YSArIGtPcHVzSGVhZGVyTnVtQ291cGxlZE9mZnNldCk7CisgICAgaWYgKGhlYWRlci0+bnVtX3N0cmVhbXMgKyBoZWFkZXItPm51bV9jb3VwbGVkICE9IGhlYWRlci0+Y2hhbm5lbHMpIHsKKyAgICAgICAgQUxPR1YoIkluY29uc2lzdGVudCBjaGFubmVsIG1hcHBpbmcuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoZWFkZXItPmNoYW5uZWxzOyArK2kpCisgICAgICBoZWFkZXItPnN0cmVhbV9tYXBbaV0gPSAqKGRhdGEgKyBrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCArIGkpOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBDb252ZXJ0IG5hbm9zZWNvbmRzIHRvIG51bWJlciBvZiBzYW1wbGVzLgorc3RhdGljIHVpbnQ2NF90IG5zX3RvX3NhbXBsZXModWludDY0X3QgbnMsIGludCBrUmF0ZSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxkb3VibGU+KG5zKSAqIGtSYXRlIC8gMTAwMDAwMDAwMDsKK30KKwordm9pZCBTb2Z0T3B1czo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgeworICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmaW5RdWV1ZSA9IGdldFBvcnRRdWV1ZSgwKTsKKyAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDEpOworCisgICAgaWYgKG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgIT0gTk9ORSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHBvcnRJbmRleCA9PSAwICYmIG1JbnB1dEJ1ZmZlckNvdW50IDwgMykgeworICAgICAgICBCdWZmZXJJbmZvICppbmZvID0gKmluUXVldWUuYmVnaW4oKTsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciA9IGluZm8tPm1IZWFkZXI7CisKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGhlYWRlci0+cEJ1ZmZlciArIGhlYWRlci0+bk9mZnNldDsKKyAgICAgICAgc2l6ZV90IHNpemUgPSBoZWFkZXItPm5GaWxsZWRMZW47CisKKyAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50ID09IDApIHsKKyAgICAgICAgICAgIENIRUNLKG1IZWFkZXIgPT0gTlVMTCk7CisgICAgICAgICAgICBtSGVhZGVyID0gbmV3IE9wdXNIZWFkZXIoKTsKKyAgICAgICAgICAgIG1lbXNldChtSGVhZGVyLCAwLCBzaXplb2YoKm1IZWFkZXIpKTsKKyAgICAgICAgICAgIGlmICghUGFyc2VPcHVzSGVhZGVyKGRhdGEsIHNpemUsIG1IZWFkZXIpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIlBhcnNpbmcgT3B1cyBIZWFkZXIgZmFpbGVkLiIpOworICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQ4X3QgY2hhbm5lbF9tYXBwaW5nW2tNYXhDaGFubmVsc10gPSB7MH07CisgICAgICAgICAgICBtZW1jcHkoJmNoYW5uZWxfbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICBrRGVmYXVsdE9wdXNDaGFubmVsTGF5b3V0LAorICAgICAgICAgICAgICAgICAgIGtNYXhDaGFubmVsc1dpdGhEZWZhdWx0TGF5b3V0KTsKKworICAgICAgICAgICAgaW50IHN0YXR1cyA9IE9QVVNfSU5WQUxJRF9TVEFURTsKKyAgICAgICAgICAgIG1EZWNvZGVyID0gb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2NyZWF0ZShrUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLT5jaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLT5udW1fc3RyZWFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLT5udW1fY291cGxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsX21hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cyk7CisgICAgICAgICAgICBpZiAoIW1EZWNvZGVyIHx8IHN0YXR1cyAhPSBPUFVTX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIm9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9jcmVhdGUgZmFpbGVkIHN0YXR1cz0lcyIsCisgICAgICAgICAgICAgICAgICAgICAgb3B1c19zdHJlcnJvcihzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0KKyAgICAgICAgICAgICAgICBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3RsKG1EZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BVU19TRVRfR0FJTihtSGVhZGVyLT5nYWluX2RiKSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE9QVVNfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiRmFpbGVkIHRvIHNldCBPUFVTIGhlYWRlciBnYWluOyBzdGF0dXM9JXMiLAorICAgICAgICAgICAgICAgICAgICAgIG9wdXNfc3RyZXJyb3Ioc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChtSW5wdXRCdWZmZXJDb3VudCA9PSAxKSB7CisgICAgICAgICAgICBtQ29kZWNEZWxheSA9IG5zX3RvX3NhbXBsZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHJlaW50ZXJwcmV0X2Nhc3Q8aW50NjRfdCo+KGhlYWRlci0+cEJ1ZmZlciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci0+bk9mZnNldCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1JhdGUpOworICAgICAgICAgICAgbVNhbXBsZXNUb0Rpc2NhcmQgPSBtQ29kZWNEZWxheTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TZWVrUHJlUm9sbCA9IG5zX3RvX3NhbXBsZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihyZWludGVycHJldF9jYXN0PGludDY0X3QqPihoZWFkZXItPnBCdWZmZXIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLT5uT2Zmc2V0KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1JhdGUpOworICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIDEsIDAsIE5VTEwpOworICAgICAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IEFXQUlUSU5HX0RJU0FCTEVEOworICAgICAgICB9CisKKyAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICBpbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShoZWFkZXIpOworICAgICAgICArK21JbnB1dEJ1ZmZlckNvdW50OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgd2hpbGUgKCFpblF1ZXVlLmVtcHR5KCkgJiYgIW91dFF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgQnVmZmVySW5mbyAqaW5JbmZvID0gKmluUXVldWUuYmVnaW4oKTsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmluSGVhZGVyID0gaW5JbmZvLT5tSGVhZGVyOworCisgICAgICAgIEJ1ZmZlckluZm8gKm91dEluZm8gPSAqb3V0UXVldWUuYmVnaW4oKTsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7CisKKyAgICAgICAgaWYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKKyAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKworICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gMDsKKyAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU9TOworCisgICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW5IZWFkZXItPm5PZmZzZXQgPT0gMCkgeworICAgICAgICAgICAgbUFuY2hvclRpbWVVcyA9IGluSGVhZGVyLT5uVGltZVN0YW1wOworICAgICAgICAgICAgbU51bUZyYW1lc091dHB1dCA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvLyBXaGVuIHNlZWtpbmcgdG8gemVybywgfG1Db2RlY0RlbGF5fCBzYW1wbGVzIGhhcyB0byBiZSBkaXNjYXJkZWQKKyAgICAgICAgLy8gaW5zdGVhZCBvZiB8bVNlZWtQcmVSb2xsfCBzYW1wbGVzIChhcyB3ZSB3b3VsZCB3aGVuIHNlZWtpbmcgdG8gYW55CisgICAgICAgIC8vIG90aGVyIHRpbWVzdGFtcCkuCisgICAgICAgIGlmIChpbkhlYWRlci0+blRpbWVTdGFtcCA9PSAwKSB7CisgICAgICAgICAgICBtU2FtcGxlc1RvRGlzY2FyZCA9IG1Db2RlY0RlbGF5OworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQ7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUgPSBpbkhlYWRlci0+bkZpbGxlZExlbjsKKyAgICAgICAgc2l6ZV90IGZyYW1lU2l6ZSA9IGtNYXhPcHVzT3V0cHV0UGFja2V0U2l6ZVNhbXBsZXM7CisgICAgICAgIGlmIChmcmFtZVNpemUgPiBvdXRIZWFkZXItPm5BbGxvY0xlbiAvIHNpemVvZihpbnQxNl90KSAvIG1IZWFkZXItPmNoYW5uZWxzKSB7CisgICAgICAgICAgICBmcmFtZVNpemUgPSBvdXRIZWFkZXItPm5BbGxvY0xlbiAvIHNpemVvZihpbnQxNl90KSAvIG1IZWFkZXItPmNoYW5uZWxzOworICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNzgzMzYxNiIpOworICAgICAgICB9CisKKyAgICAgICAgaW50IG51bUZyYW1lcyA9IG9wdXNfbXVsdGlzdHJlYW1fZGVjb2RlKG1EZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCAqKW91dEhlYWRlci0+cEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICBpZiAobnVtRnJhbWVzIDwgMCkgeworICAgICAgICAgICAgQUxPR0UoIm9wdXNfbXVsdGlzdHJlYW1fZGVjb2RlIHJldHVybmVkICVkIiwgbnVtRnJhbWVzKTsKKyAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG91dEhlYWRlci0+bk9mZnNldCA9IDA7CisgICAgICAgIGlmIChtU2FtcGxlc1RvRGlzY2FyZCA+IDApIHsKKyAgICAgICAgICAgIGlmIChtU2FtcGxlc1RvRGlzY2FyZCA+IG51bUZyYW1lcykgeworICAgICAgICAgICAgICAgIG1TYW1wbGVzVG9EaXNjYXJkIC09IG51bUZyYW1lczsKKyAgICAgICAgICAgICAgICBudW1GcmFtZXMgPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBudW1GcmFtZXMgLT0gbVNhbXBsZXNUb0Rpc2NhcmQ7CisgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uT2Zmc2V0ID0gbVNhbXBsZXNUb0Rpc2NhcmQgKiBzaXplb2YoaW50MTZfdCkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXItPmNoYW5uZWxzOworICAgICAgICAgICAgICAgIG1TYW1wbGVzVG9EaXNjYXJkID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IG51bUZyYW1lcyAqIHNpemVvZihpbnQxNl90KSAqIG1IZWFkZXItPmNoYW5uZWxzOworICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IDA7CisKKyAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0gbUFuY2hvclRpbWVVcyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtTnVtRnJhbWVzT3V0cHV0ICogMTAwMDAwMGxsKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSYXRlOworCisgICAgICAgIG1OdW1GcmFtZXNPdXRwdXQgKz0gbnVtRnJhbWVzOworCisgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CisgICAgICAgIGluSW5mbyA9IE5VTEw7CisgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisgICAgICAgIGluSGVhZGVyID0gTlVMTDsKKworICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOworICAgICAgICBvdXRJbmZvID0gTlVMTDsKKyAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKKyAgICAgICAgb3V0SGVhZGVyID0gTlVMTDsKKworICAgICAgICArK21JbnB1dEJ1ZmZlckNvdW50OworICAgIH0KK30KKwordm9pZCBTb2Z0T3B1czo6b25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKKyAgICBpZiAocG9ydEluZGV4ID09IDAgJiYgbURlY29kZXIgIT0gTlVMTCkgeworICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgbmV4dCBidWZmZXIgb3V0cHV0IGRvZXMgbm90IHN0aWxsCisgICAgICAgIC8vIGRlcGVuZCBvbiBmcmFnbWVudHMgZnJvbSB0aGUgbGFzdCBvbmUgZGVjb2RlZC4KKyAgICAgICAgbU51bUZyYW1lc091dHB1dCA9IDA7CisgICAgICAgIG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9jdGwobURlY29kZXIsIE9QVVNfUkVTRVRfU1RBVEUpOworICAgICAgICBtQW5jaG9yVGltZVVzID0gMDsKKyAgICAgICAgbVNhbXBsZXNUb0Rpc2NhcmQgPSBtU2Vla1ByZVJvbGw7CisgICAgfQorfQorCit2b2lkIFNvZnRPcHVzOjpvblJlc2V0KCkgeworICAgIG1JbnB1dEJ1ZmZlckNvdW50ID0gMDsKKyAgICBtTnVtRnJhbWVzT3V0cHV0ID0gMDsKKyAgICBpZiAobURlY29kZXIgIT0gTlVMTCkgeworICAgICAgICBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfZGVzdHJveShtRGVjb2Rlcik7CisgICAgICAgIG1EZWNvZGVyID0gTlVMTDsKKyAgICB9CisgICAgaWYgKG1IZWFkZXIgIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbUhlYWRlcjsKKyAgICAgICAgbUhlYWRlciA9IE5VTEw7CisgICAgfQorCisgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IE5PTkU7Cit9CisKK3ZvaWQgU29mdE9wdXM6Om9uUG9ydEVuYWJsZUNvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCwgYm9vbCBlbmFibGVkKSB7CisgICAgaWYgKHBvcnRJbmRleCAhPSAxKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UpIHsKKyAgICAgICAgY2FzZSBOT05FOgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBV0FJVElOR19ESVNBQkxFRDoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0soIWVuYWJsZWQpOworICAgICAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IEFXQUlUSU5HX0VOQUJMRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0VRKChpbnQpbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSwgKGludClBV0FJVElOR19FTkFCTEVEKTsKKyAgICAgICAgICAgIENIRUNLKGVuYWJsZWQpOworICAgICAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IE5PTkU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworYW5kcm9pZDo6U29mdE9NWENvbXBvbmVudCAqY3JlYXRlU29mdE9NWENvbXBvbmVudCgKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAorICAgICAgICBPTVhfUFRSIGFwcERhdGEsIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KSB7CisgICAgcmV0dXJuIG5ldyBhbmRyb2lkOjpTb2Z0T3B1cyhuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZjY1NjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuaApAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIFRoZSBPcHVzIHNwZWNpZmljYXRpb24gaXMgcGFydCBvZiBJRVRGIFJGQyA2NzE2OgorICogaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjcxNgorICovCisKKyNpZm5kZWYgU09GVF9PUFVTX0hfCisKKyNkZWZpbmUgU09GVF9PUFVTX0hfCisKKyNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCisKK3N0cnVjdCBPcHVzTVNEZWNvZGVyOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBPcHVzSGVhZGVyIHsKKyAgaW50IGNoYW5uZWxzOworICBpbnQgc2tpcF9zYW1wbGVzOworICBpbnQgY2hhbm5lbF9tYXBwaW5nOworICBpbnQgbnVtX3N0cmVhbXM7CisgIGludCBudW1fY291cGxlZDsKKyAgaW50MTZfdCBnYWluX2RiOworICB1aW50OF90IHN0cmVhbV9tYXBbOF07Cit9OworCitzdHJ1Y3QgU29mdE9wdXMgOiBwdWJsaWMgU2ltcGxlU29mdE9NWENvbXBvbmVudCB7CisgICAgU29mdE9wdXMoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCisgICAgICAgICAgICAgT01YX1BUUiBhcHBEYXRhLAorICAgICAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflNvZnRPcHVzKCk7CisKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxHZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcyk7CisKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcyk7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCk7CisgICAgdmlydHVhbCB2b2lkIG9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KTsKKyAgICB2aXJ0dWFsIHZvaWQgb25Qb3J0RW5hYmxlQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4LCBib29sIGVuYWJsZWQpOworICAgIHZpcnR1YWwgdm9pZCBvblJlc2V0KCk7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtOdW1CdWZmZXJzID0gNCwKKyAgICAgICAga01heE51bVNhbXBsZXNQZXJCdWZmZXIgPSA5NjAgKiA2CisgICAgfTsKKworICAgIHNpemVfdCBtSW5wdXRCdWZmZXJDb3VudDsKKworICAgIE9wdXNNU0RlY29kZXIgKm1EZWNvZGVyOworICAgIE9wdXNIZWFkZXIgKm1IZWFkZXI7CisKKyAgICBpbnQ2NF90IG1Db2RlY0RlbGF5OworICAgIGludDY0X3QgbVNlZWtQcmVSb2xsOworICAgIGludDY0X3QgbVNhbXBsZXNUb0Rpc2NhcmQ7CisgICAgaW50NjRfdCBtQW5jaG9yVGltZVVzOworICAgIGludDY0X3QgbU51bUZyYW1lc091dHB1dDsKKworICAgIGVudW0geworICAgICAgICBOT05FLAorICAgICAgICBBV0FJVElOR19ESVNBQkxFRCwKKyAgICAgICAgQVdBSVRJTkdfRU5BQkxFRAorICAgIH0gbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZTsKKworICAgIHZvaWQgaW5pdFBvcnRzKCk7CisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKyAgICBib29sIGlzQ29uZmlndXJlZCgpIGNvbnN0OworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdE9wdXMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBTT0ZUX09QVVNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvQW5kcm9pZC5tawppbmRleCBmZTkwYTAzLi44NzA4MGU3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9BbmRyb2lkLm1rCkBAIC04LDYgKzgsOCBAQAogICAgICAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAogICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X29teCBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYnV0aWxzIGxpYmxvZwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L1NvZnRSYXcuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9Tb2Z0UmF3LmNwcAppbmRleCA1YzFmYWRiLi40ZjdhZTk1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L1NvZnRSYXcuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvU29mdFJhdy5jcHAKQEAgLTE3NSw3ICsxNzUsNyBAQAogICAgIH0KIH0KIAotdm9pZCBTb2Z0UmF3OjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7Cit2b2lkIFNvZnRSYXc6Om9uUXVldWVGaWxsZWQoT01YX1UzMiAvKiBwb3J0SW5kZXggKi8pIHsKICAgICBpZiAobVNpZ25hbGxlZEVycm9yKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvQW5kcm9pZC5tawppbmRleCAyMjMyMzUzLi4yMTdhNmQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL0FuZHJvaWQubWsKQEAgLTE2LDQgKzE2LDYgQEAKIExPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9zb2Z0X3ZvcmJpc2RlYwogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9Tb2Z0Vm9yYmlzLmNwcAppbmRleCBlYzNkOTcyLi41ZjRlMzQ2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9Tb2Z0Vm9yYmlzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9Tb2Z0Vm9yYmlzLmNwcApAQCAtNTQsNiArNTQsOCBAQAogICAgICAgbUFuY2hvclRpbWVVcygwKSwKICAgICAgIG1OdW1GcmFtZXNPdXRwdXQoMCksCiAgICAgICBtTnVtRnJhbWVzTGVmdE9uUGFnZSgtMSksCisgICAgICBtU2F3SW5wdXRFb3MoZmFsc2UpLAorICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyhmYWxzZSksCiAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlKE5PTkUpIHsKICAgICBpbml0UG9ydHMoKTsKICAgICBDSEVDS19FUShpbml0RGVjb2RlcigpLCAoc3RhdHVzX3QpT0spOwpAQCAtMzEyLDQ4ICszMTQsNDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIHdoaWxlICghaW5RdWV1ZS5lbXB0eSgpICYmICFvdXRRdWV1ZS5lbXB0eSgpKSB7Ci0gICAgICAgIEJ1ZmZlckluZm8gKmluSW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7Ci0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciA9IGluSW5mby0+bUhlYWRlcjsKKyAgICB3aGlsZSAoKCFpblF1ZXVlLmVtcHR5KCkgfHwgKG1TYXdJbnB1dEVvcyAmJiAhbVNpZ25hbGxlZE91dHB1dEVvcykpICYmICFvdXRRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgIEJ1ZmZlckluZm8gKmluSW5mbyA9IE5VTEw7CisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciA9IE5VTEw7CisgICAgICAgIGlmICghaW5RdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICBpbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOworICAgICAgICAgICAgaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7CisgICAgICAgIH0KIAogICAgICAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7CiAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIgPSBvdXRJbmZvLT5tSGVhZGVyOwogCi0gICAgICAgIGlmIChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSB7Ci0gICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7Ci0gICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisgICAgICAgIGludDMyX3QgbnVtUGFnZVNhbXBsZXMgPSAwOwogCi0gICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAwOwotICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7CisgICAgICAgIGlmIChpbkhlYWRlcikgeworICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKKyAgICAgICAgICAgICAgICBtU2F3SW5wdXRFb3MgPSB0cnVlOworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKLSAgICAgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7Ci0gICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gfHwgIW1TYXdJbnB1dEVvcykgeworICAgICAgICAgICAgICAgIENIRUNLX0dFKGluSGVhZGVyLT5uRmlsbGVkTGVuLCBzaXplb2YobnVtUGFnZVNhbXBsZXMpKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJm51bVBhZ2VTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICBpbkhlYWRlci0+cEJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgKyBpbkhlYWRlci0+bk9mZnNldCArIGluSGVhZGVyLT5uRmlsbGVkTGVuIC0gNCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG51bVBhZ2VTYW1wbGVzKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5PZmZzZXQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtQW5jaG9yVGltZVVzID0gaW5IZWFkZXItPm5UaW1lU3RhbXA7CisgICAgICAgICAgICAgICAgICAgIG1OdW1GcmFtZXNPdXRwdXQgPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGluSGVhZGVyLT5uRmlsbGVkTGVuIC09IHNpemVvZihudW1QYWdlU2FtcGxlcyk7OworICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaW50MzJfdCBudW1QYWdlU2FtcGxlczsKLSAgICAgICAgQ0hFQ0tfR0UoaW5IZWFkZXItPm5GaWxsZWRMZW4sIHNpemVvZihudW1QYWdlU2FtcGxlcykpOwotICAgICAgICBtZW1jcHkoJm51bVBhZ2VTYW1wbGVzLAotICAgICAgICAgICAgICAgaW5IZWFkZXItPnBCdWZmZXIKLSAgICAgICAgICAgICAgICArIGluSGVhZGVyLT5uT2Zmc2V0ICsgaW5IZWFkZXItPm5GaWxsZWRMZW4gLSA0LAotICAgICAgICAgICAgICAgc2l6ZW9mKG51bVBhZ2VTYW1wbGVzKSk7Ci0KICAgICAgICAgaWYgKG51bVBhZ2VTYW1wbGVzID49IDApIHsKICAgICAgICAgICAgIG1OdW1GcmFtZXNMZWZ0T25QYWdlID0gbnVtUGFnZVNhbXBsZXM7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoaW5IZWFkZXItPm5PZmZzZXQgPT0gMCkgewotICAgICAgICAgICAgbUFuY2hvclRpbWVVcyA9IGluSGVhZGVyLT5uVGltZVN0YW1wOwotICAgICAgICAgICAgbU51bUZyYW1lc091dHB1dCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiAtPSBzaXplb2YobnVtUGFnZVNhbXBsZXMpOzsKLQogICAgICAgICBvZ2dfYnVmZmVyIGJ1ZjsKLSAgICAgICAgYnVmLmRhdGEgPSBpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0OwotICAgICAgICBidWYuc2l6ZSA9IGluSGVhZGVyLT5uRmlsbGVkTGVuOworICAgICAgICBidWYuZGF0YSA9IGluSGVhZGVyID8gaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldCA6IE5VTEw7CisgICAgICAgIGJ1Zi5zaXplID0gaW5IZWFkZXIgPyBpbkhlYWRlci0+bkZpbGxlZExlbiA6IDA7CiAgICAgICAgIGJ1Zi5yZWZjb3VudCA9IDE7CiAgICAgICAgIGJ1Zi5wdHIub3duZXIgPSBOVUxMOwogCkBAIC0zNzMsOSArMzc0LDE1IEBACiAKICAgICAgICAgaW50IG51bUZyYW1lcyA9IDA7CiAKKyAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSAwOwogICAgICAgICBpbnQgZXJyID0gdm9yYmlzX2RzcF9zeW50aGVzaXMobVN0YXRlLCAmcGFjaywgMSk7CiAgICAgICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICAgICAgLy8gRklYTUUgdGVtcG9yYXJ5IHdvcmthcm91bmQgZm9yIGxvZyBzcGFtCisjaWYgIWRlZmluZWQoX19hcm1fXykgJiYgIWRlZmluZWQoX19hYXJjaDY0X18pCisgICAgICAgICAgICBBTE9HVigidm9yYmlzX2RzcF9zeW50aGVzaXMgcmV0dXJuZWQgJWQiLCBlcnIpOworI2Vsc2UKICAgICAgICAgICAgIEFMT0dXKCJ2b3JiaXNfZHNwX3N5bnRoZXNpcyByZXR1cm5lZCAlZCIsIGVycik7CisjZW5kaWYKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHNpemVfdCBudW1TYW1wbGVzUGVyQnVmZmVyID0ga01heE51bVNhbXBsZXNQZXJCdWZmZXI7CiAgICAgICAgICAgICBpZiAobnVtU2FtcGxlc1BlckJ1ZmZlciA+IG91dEhlYWRlci0+bkFsbG9jTGVuIC8gc2l6ZW9mKGludDE2X3QpKSB7CkBAIC0zOTcsMTMgKzQwNCwxNiBAQAogICAgICAgICAgICAgICAgIEFMT0dWKCJkaXNjYXJkaW5nICVkIGZyYW1lcyBhdCBlbmQgb2YgcGFnZSIsCiAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMgLSBtTnVtRnJhbWVzTGVmdE9uUGFnZSk7CiAgICAgICAgICAgICAgICAgbnVtRnJhbWVzID0gbU51bUZyYW1lc0xlZnRPblBhZ2U7CisgICAgICAgICAgICAgICAgaWYgKG1TYXdJbnB1dEVvcykgeworICAgICAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgbU51bUZyYW1lc0xlZnRPblBhZ2UgLT0gbnVtRnJhbWVzOwogICAgICAgICB9CiAKICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gbnVtRnJhbWVzICogc2l6ZW9mKGludDE2X3QpICogbVZpLT5jaGFubmVsczsKICAgICAgICAgb3V0SGVhZGVyLT5uT2Zmc2V0ID0gMDsKLSAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSAwOwogCiAgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9CiAgICAgICAgICAgICBtQW5jaG9yVGltZVVzCkBAIC00MTEsMTEgKzQyMSwxMyBAQAogCiAgICAgICAgIG1OdW1GcmFtZXNPdXRwdXQgKz0gbnVtRnJhbWVzOwogCi0gICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwotICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7Ci0gICAgICAgIGluSW5mbyA9IE5VTEw7Ci0gICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7Ci0gICAgICAgIGluSGVhZGVyID0gTlVMTDsKKyAgICAgICAgaWYgKGluSGVhZGVyKSB7CisgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgIGluSW5mbyA9IE5VTEw7CisgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworICAgICAgICAgICAgaW5IZWFkZXIgPSBOVUxMOworICAgICAgICB9CiAKICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwogICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKQEAgLTQ1Miw2ICs0NjQsOCBAQAogICAgICAgICBtVmkgPSBOVUxMOwogICAgIH0KIAorICAgIG1TYXdJbnB1dEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gTk9ORTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5oCmluZGV4IGNiNjI4YTAuLjFkMDA4MTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL1NvZnRWb3JiaXMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9Tb2Z0Vm9yYmlzLmgKQEAgLTU5LDYgKzU5LDggQEAKICAgICBpbnQ2NF90IG1BbmNob3JUaW1lVXM7CiAgICAgaW50NjRfdCBtTnVtRnJhbWVzT3V0cHV0OwogICAgIGludDMyX3QgbU51bUZyYW1lc0xlZnRPblBhZ2U7CisgICAgYm9vbCBtU2F3SW5wdXRFb3M7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOwogCiAgICAgZW51bSB7CiAgICAgICAgIE5PTkUsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vU29mdHdhcmVSZW5kZXJlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vU29mdHdhcmVSZW5kZXJlci5jcHAKaW5kZXggOTkwZDU1NC4uZjkwNjc1NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL1NvZnR3YXJlUmVuZGVyZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcApAQCAtMjEsNyArMjEsNyBAQAogCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4gLy8gZm9yIHByb3BlcnR5X2dldAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8c3lzdGVtL3dpbmRvdy5oPgogI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXJNYXBwZXIuaD4KICNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgpAQCAtMzMsMzQgKzMzLDcxIEBACiAgICAgcmV0dXJuIChwcm9wZXJ0eV9nZXQoInJvLmtlcm5lbC5xZW11IiwgcHJvcCwgTlVMTCkgPiAwKTsKIH0KIAotU29mdHdhcmVSZW5kZXJlcjo6U29mdHdhcmVSZW5kZXJlcigKLSAgICAgICAgY29uc3Qgc3A8QU5hdGl2ZVdpbmRvdz4gJm5hdGl2ZVdpbmRvdywgY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhKQotICAgIDogbUNvbnZlcnRlcihOVUxMKSwKK3N0YXRpYyBpbnQgQUxJR04oaW50IHgsIGludCB5KSB7CisgICAgLy8geSBtdXN0IGJlIGEgcG93ZXIgb2YgMi4KKyAgICByZXR1cm4gKHggKyB5IC0gMSkgJiB+KHkgLSAxKTsKK30KKworU29mdHdhcmVSZW5kZXJlcjo6U29mdHdhcmVSZW5kZXJlcihjb25zdCBzcDxBTmF0aXZlV2luZG93PiAmbmF0aXZlV2luZG93KQorICAgIDogbUNvbG9yRm9ybWF0KE9NWF9DT0xPUl9Gb3JtYXRVbnVzZWQpLAorICAgICAgbUNvbnZlcnRlcihOVUxMKSwKICAgICAgIG1ZVVZNb2RlKE5vbmUpLAotICAgICAgbU5hdGl2ZVdpbmRvdyhuYXRpdmVXaW5kb3cpIHsKLSAgICBpbnQzMl90IHRtcDsKLSAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUNvbG9yRm9ybWF0LCAmdG1wKSk7Ci0gICAgbUNvbG9yRm9ybWF0ID0gKE9NWF9DT0xPUl9GT1JNQVRUWVBFKXRtcDsKKyAgICAgIG1OYXRpdmVXaW5kb3cobmF0aXZlV2luZG93KSwKKyAgICAgIG1XaWR0aCgwKSwKKyAgICAgIG1IZWlnaHQoMCksCisgICAgICBtQ3JvcExlZnQoMCksCisgICAgICBtQ3JvcFRvcCgwKSwKKyAgICAgIG1Dcm9wUmlnaHQoMCksCisgICAgICBtQ3JvcEJvdHRvbSgwKSwKKyAgICAgIG1Dcm9wV2lkdGgoMCksCisgICAgICBtQ3JvcEhlaWdodCgwKSB7Cit9CiAKLSAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmbVdpZHRoKSk7Ci0gICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZtSGVpZ2h0KSk7CitTb2Z0d2FyZVJlbmRlcmVyOjp+U29mdHdhcmVSZW5kZXJlcigpIHsKKyAgICBkZWxldGUgbUNvbnZlcnRlcjsKKyAgICBtQ29udmVydGVyID0gTlVMTDsKK30KIAotICAgIGlmICghbWV0YS0+ZmluZFJlY3QoCi0gICAgICAgICAgICAgICAga0tleUNyb3BSZWN0LAotICAgICAgICAgICAgICAgICZtQ3JvcExlZnQsICZtQ3JvcFRvcCwgJm1Dcm9wUmlnaHQsICZtQ3JvcEJvdHRvbSkpIHsKLSAgICAgICAgbUNyb3BMZWZ0ID0gbUNyb3BUb3AgPSAwOwotICAgICAgICBtQ3JvcFJpZ2h0ID0gbVdpZHRoIC0gMTsKLSAgICAgICAgbUNyb3BCb3R0b20gPSBtSGVpZ2h0IC0gMTsKK3ZvaWQgU29mdHdhcmVSZW5kZXJlcjo6cmVzZXRGb3JtYXRJZkNoYW5nZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKKyAgICBDSEVDSyhmb3JtYXQgIT0gTlVMTCk7CisKKyAgICBpbnQzMl90IGNvbG9yRm9ybWF0TmV3OworICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJjb2xvci1mb3JtYXQiLCAmY29sb3JGb3JtYXROZXcpKTsKKworICAgIGludDMyX3Qgd2lkdGhOZXcsIGhlaWdodE5ldzsKKyAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigic3RyaWRlIiwgJndpZHRoTmV3KSk7CisgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoInNsaWNlLWhlaWdodCIsICZoZWlnaHROZXcpKTsKKworICAgIGludDMyX3QgY3JvcExlZnROZXcsIGNyb3BUb3BOZXcsIGNyb3BSaWdodE5ldywgY3JvcEJvdHRvbU5ldzsKKyAgICBpZiAoIWZvcm1hdC0+ZmluZFJlY3QoCisgICAgICAgICAgICAiY3JvcCIsICZjcm9wTGVmdE5ldywgJmNyb3BUb3BOZXcsICZjcm9wUmlnaHROZXcsICZjcm9wQm90dG9tTmV3KSkgeworICAgICAgICBjcm9wTGVmdE5ldyA9IGNyb3BUb3BOZXcgPSAwOworICAgICAgICBjcm9wUmlnaHROZXcgPSB3aWR0aE5ldyAtIDE7CisgICAgICAgIGNyb3BCb3R0b21OZXcgPSBoZWlnaHROZXcgLSAxOwogICAgIH0KIAorICAgIGlmIChzdGF0aWNfY2FzdDxpbnQzMl90PihtQ29sb3JGb3JtYXQpID09IGNvbG9yRm9ybWF0TmV3ICYmCisgICAgICAgIG1XaWR0aCA9PSB3aWR0aE5ldyAmJgorICAgICAgICBtSGVpZ2h0ID09IGhlaWdodE5ldyAmJgorICAgICAgICBtQ3JvcExlZnQgPT0gY3JvcExlZnROZXcgJiYKKyAgICAgICAgbUNyb3BUb3AgPT0gY3JvcFRvcE5ldyAmJgorICAgICAgICBtQ3JvcFJpZ2h0ID09IGNyb3BSaWdodE5ldyAmJgorICAgICAgICBtQ3JvcEJvdHRvbSA9PSBjcm9wQm90dG9tTmV3KSB7CisgICAgICAgIC8vIE5vdGhpbmcgY2hhbmdlZCwgbm8gbmVlZCB0byByZXNldCByZW5kZXJlci4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1Db2xvckZvcm1hdCA9IHN0YXRpY19jYXN0PE9NWF9DT0xPUl9GT1JNQVRUWVBFPihjb2xvckZvcm1hdE5ldyk7CisgICAgbVdpZHRoID0gd2lkdGhOZXc7CisgICAgbUhlaWdodCA9IGhlaWdodE5ldzsKKyAgICBtQ3JvcExlZnQgPSBjcm9wTGVmdE5ldzsKKyAgICBtQ3JvcFRvcCA9IGNyb3BUb3BOZXc7CisgICAgbUNyb3BSaWdodCA9IGNyb3BSaWdodE5ldzsKKyAgICBtQ3JvcEJvdHRvbSA9IGNyb3BCb3R0b21OZXc7CisKICAgICBtQ3JvcFdpZHRoID0gbUNyb3BSaWdodCAtIG1Dcm9wTGVmdCArIDE7CiAgICAgbUNyb3BIZWlnaHQgPSBtQ3JvcEJvdHRvbSAtIG1Dcm9wVG9wICsgMTsKIAotICAgIGludDMyX3Qgcm90YXRpb25EZWdyZWVzOwotICAgIGlmICghbWV0YS0+ZmluZEludDMyKGtLZXlSb3RhdGlvbiwgJnJvdGF0aW9uRGVncmVlcykpIHsKLSAgICAgICAgcm90YXRpb25EZWdyZWVzID0gMDsKLSAgICB9Ci0KICAgICBpbnQgaGFsRm9ybWF0OwogICAgIHNpemVfdCBidWZXaWR0aCwgYnVmSGVpZ2h0OwogCkBAIC0xMDYsMTIgKzE0MywyOSBAQAogICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19TQ0FMSU5HX01PREVfU0NBTEVfVE9fV0lORE9XKSk7CiAKICAgICAvLyBXaWR0aCBtdXN0IGJlIG11bHRpcGxlIG9mIDMyPz8/Ci0gICAgQ0hFQ0tfRVEoMCwgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeSgKKyAgICBDSEVDS19FUSgwLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2RpbWVuc2lvbnMoCiAgICAgICAgICAgICAgICAgbU5hdGl2ZVdpbmRvdy5nZXQoKSwKICAgICAgICAgICAgICAgICBidWZXaWR0aCwKLSAgICAgICAgICAgICAgICBidWZIZWlnaHQsCisgICAgICAgICAgICAgICAgYnVmSGVpZ2h0KSk7CisgICAgQ0hFQ0tfRVEoMCwgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19mb3JtYXQoCisgICAgICAgICAgICAgICAgbU5hdGl2ZVdpbmRvdy5nZXQoKSwKICAgICAgICAgICAgICAgICBoYWxGb3JtYXQpKTsKIAorICAgIC8vIE5PVEU6IG5hdGl2ZSB3aW5kb3cgdXNlcyBleHRlbmRlZCByaWdodC1ib3R0b20gY29vcmRpbmF0ZQorICAgIGFuZHJvaWRfbmF0aXZlX3JlY3RfdCBjcm9wOworICAgIGNyb3AubGVmdCA9IG1Dcm9wTGVmdDsKKyAgICBjcm9wLnRvcCA9IG1Dcm9wVG9wOworICAgIGNyb3AucmlnaHQgPSBtQ3JvcFJpZ2h0ICsgMTsKKyAgICBjcm9wLmJvdHRvbSA9IG1Dcm9wQm90dG9tICsgMTsKKyAgICBBTE9HVigic2V0dGluZyBjcm9wOiBbJWQsICVkLCAlZCwgJWRdIGZvciBzaXplIFslenUsICV6dV0iLAorICAgICAgICAgIGNyb3AubGVmdCwgY3JvcC50b3AsIGNyb3AucmlnaHQsIGNyb3AuYm90dG9tLCBidWZXaWR0aCwgYnVmSGVpZ2h0KTsKKworICAgIENIRUNLX0VRKDAsIG5hdGl2ZV93aW5kb3dfc2V0X2Nyb3AobU5hdGl2ZVdpbmRvdy5nZXQoKSwgJmNyb3ApKTsKKworICAgIGludDMyX3Qgcm90YXRpb25EZWdyZWVzOworICAgIGlmICghZm9ybWF0LT5maW5kSW50MzIoInJvdGF0aW9uLWRlZ3JlZXMiLCAmcm90YXRpb25EZWdyZWVzKSkgeworICAgICAgICByb3RhdGlvbkRlZ3JlZXMgPSAwOworICAgIH0KICAgICB1aW50MzJfdCB0cmFuc2Zvcm07CiAgICAgc3dpdGNoIChyb3RhdGlvbkRlZ3JlZXMpIHsKICAgICAgICAgY2FzZSAwOiB0cmFuc2Zvcm0gPSAwOyBicmVhazsKQEAgLTEyMSwyNCArMTc1LDE1IEBACiAgICAgICAgIGRlZmF1bHQ6IHRyYW5zZm9ybSA9IDA7IGJyZWFrOwogICAgIH0KIAotICAgIGlmICh0cmFuc2Zvcm0pIHsKLSAgICAgICAgQ0hFQ0tfRVEoMCwgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc190cmFuc2Zvcm0oCi0gICAgICAgICAgICAgICAgICAgIG1OYXRpdmVXaW5kb3cuZ2V0KCksIHRyYW5zZm9ybSkpOwotICAgIH0KLX0KLQotU29mdHdhcmVSZW5kZXJlcjo6flNvZnR3YXJlUmVuZGVyZXIoKSB7Ci0gICAgZGVsZXRlIG1Db252ZXJ0ZXI7Ci0gICAgbUNvbnZlcnRlciA9IE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgQUxJR04oaW50IHgsIGludCB5KSB7Ci0gICAgLy8geSBtdXN0IGJlIGEgcG93ZXIgb2YgMi4KLSAgICByZXR1cm4gKHggKyB5IC0gMSkgJiB+KHkgLSAxKTsKKyAgICBDSEVDS19FUSgwLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RyYW5zZm9ybSgKKyAgICAgICAgICAgICAgICBtTmF0aXZlV2luZG93LmdldCgpLCB0cmFuc2Zvcm0pKTsKIH0KIAogdm9pZCBTb2Z0d2FyZVJlbmRlcmVyOjpyZW5kZXIoCi0gICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCB2b2lkICpwbGF0Zm9ybVByaXZhdGUpIHsKKyAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIGludDY0X3QgdGltZXN0YW1wTnMsCisgICAgICAgIHZvaWQqIC8qcGxhdGZvcm1Qcml2YXRlKi8sIGNvbnN0IHNwPEFNZXNzYWdlPiYgZm9ybWF0KSB7CisgICAgcmVzZXRGb3JtYXRJZkNoYW5nZWQoZm9ybWF0KTsKKwogICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIgKmJ1ZjsKICAgICBpbnQgZXJyOwogICAgIGlmICgoZXJyID0gbmF0aXZlX3dpbmRvd19kZXF1ZXVlX2J1ZmZlcl9hbmRfd2FpdChtTmF0aXZlV2luZG93LmdldCgpLApAQCAtMjM3LDYgKzI4MiwxMSBAQAogc2tpcF9jb3B5aW5nOgogICAgIENIRUNLX0VRKDAsIG1hcHBlci51bmxvY2soYnVmLT5oYW5kbGUpKTsKIAorICAgIGlmICgoZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc190aW1lc3RhbXAobU5hdGl2ZVdpbmRvdy5nZXQoKSwKKyAgICAgICAgICAgIHRpbWVzdGFtcE5zKSkgIT0gMCkgeworICAgICAgICBBTE9HVygiU3VyZmFjZTo6c2V0X2J1ZmZlcnNfdGltZXN0YW1wIHJldHVybmVkIGVycm9yICVkIiwgZXJyKTsKKyAgICB9CisKICAgICBpZiAoKGVyciA9IG1OYXRpdmVXaW5kb3ctPnF1ZXVlQnVmZmVyKG1OYXRpdmVXaW5kb3cuZ2V0KCksIGJ1ZiwKICAgICAgICAgICAgIC0xKSkgIT0gMCkgewogICAgICAgICBBTE9HVygiU3VyZmFjZTo6cXVldWVCdWZmZXIgcmV0dXJuZWQgZXJyb3IgJWQiLCBlcnIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2F1ZGlvLnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9hdWRpby54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU5OTAwNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9hdWRpby54bWwKQEAgLTAsMCArMSw5MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxJbmNsdWRlZD4KKyAgICA8RGVjb2RlcnM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUubXAzLmRlY29kZXIiIHR5cGU9ImF1ZGlvL21wZWciPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwLDExMDI1LDEyMDAwLDE2MDAwLDIyMDUwLDI0MDAwLDMyMDAwLDQ0MTAwLDQ4MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI4MDAwLTMyMDAwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLmFtcm5iLmRlY29kZXIiIHR5cGU9ImF1ZGlvLzNncHAiPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI0NzUwLTEyMjAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUuYW1yd2IuZGVjb2RlciIgdHlwZT0iYXVkaW8vYW1yLXdiIj4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjEiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iMTYwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjY2MDAtMjM4NTAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5hYWMuZGVjb2RlciIgdHlwZT0iYXVkaW8vbXA0YS1sYXRtIj4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iNzM1MCw4MDAwLDExMDI1LDEyMDAwLDE2MDAwLDIyMDUwLDI0MDAwLDMyMDAwLDQ0MTAwLDQ4MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI4MDAwLTk2MDAwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLmc3MTEuYWxhdy5kZWNvZGVyIiB0eXBlPSJhdWRpby9nNzExLWFsYXciPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI2NDAwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLmc3MTEubWxhdy5kZWNvZGVyIiB0eXBlPSJhdWRpby9nNzExLW1sYXciPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI2NDAwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLnZvcmJpcy5kZWNvZGVyIiB0eXBlPSJhdWRpby92b3JiaXMiPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iOCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwLDExMDI1LDEyMDAwLDE2MDAwLDIyMDUwLDI0MDAwLDMyMDAwLDQ0MTAwLDQ4MDAwLDk2MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIzMjAwMC01MDAwMDAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5vcHVzLmRlY29kZXIiIHR5cGU9ImF1ZGlvL29wdXMiPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iOCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI0ODAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNjAwMC01MTAwMDAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5yYXcuZGVjb2RlciIgdHlwZT0iYXVkaW8vcmF3Ij4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMC05NjAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0xMDAwMDAwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgIDwvRGVjb2RlcnM+CisgICAgPEVuY29kZXJzPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLmFhYy5lbmNvZGVyIiB0eXBlPSJhdWRpby9tcDRhLWxhdG0iPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iNiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSIxMTAyNSwxMjAwMCwxNjAwMCwyMjA1MCwyNDAwMCwzMjAwMCw0NDEwMCw0ODAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iODAwMC05NjAwMDAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5hbXJuYi5lbmNvZGVyIiB0eXBlPSJhdWRpby8zZ3BwIj4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjEiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNDc1MC0xMjIwMCIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImJpdHJhdGUtbW9kZXMiIHZhbHVlPSJDQlIiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5hbXJ3Yi5lbmNvZGVyIiB0eXBlPSJhdWRpby9hbXItd2IiPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSIxNjAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNjYwMC0yMzg1MCIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImJpdHJhdGUtbW9kZXMiIHZhbHVlPSJDQlIiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5mbGFjLmVuY29kZXIiIHR5cGU9ImF1ZGlvL2ZsYWMiPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSIxLTY1NTM1MCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0yMTAwMDAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjb21wbGV4aXR5IiByYW5nZT0iMC04IiAgZGVmYXVsdD0iNSIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImJpdHJhdGUtbW9kZXMiIHZhbHVlPSJDUSIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgIDwvRW5jb2RlcnM+Cis8L0luY2x1ZGVkPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX3RlbGVwaG9ueS54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfdGVsZXBob255LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWQ5MGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX3RlbGVwaG9ueS54bWwKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxJbmNsdWRlZD4KKyAgICA8RGVjb2RlcnM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUuZ3NtLmRlY29kZXIiIHR5cGU9ImF1ZGlvL2dzbSI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIxIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEzMDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgPC9EZWNvZGVycz4KKzwvSW5jbHVkZWQ+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfdmlkZW8ueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX3ZpZGVvLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2JlZjM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX3ZpZGVvLnhtbApAQCAtMCwwICsxLDEwNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxJbmNsdWRlZD4KKyAgICA8RGVjb2RlcnM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUubXBlZzQuZGVjb2RlciIgdHlwZT0idmlkZW8vbXA0di1lcyI+CisgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlU2ltcGxlIDogTGV2ZWwzIC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjM1MngyODgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEyLTExODgwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTM4NDAwMCIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUuaDI2My5kZWNvZGVyIiB0eXBlPSJ2aWRlby8zZ3BwIj4KKyAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVCYXNlbGluZSA6IExldmVsMzAsIFByb2ZpbGVCYXNlbGluZSA6IExldmVsNDUKKyAgICAgICAgICAgICAgICAgICAgUHJvZmlsZUlTV1YyIDogTGV2ZWwzMCwgUHJvZmlsZUlTV1YyIDogTGV2ZWw0NSAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIzNTJ4Mjg4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0zODQwMDAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLmgyNjQuZGVjb2RlciIgdHlwZT0idmlkZW8vYXZjIj4KKyAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVCYXNlbGluZSA6IExldmVsNTEgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMjA0OHgyMDQ4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTk4MzA0MCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS00MDAwMDAwMCIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUuaGV2Yy5kZWNvZGVyIiB0eXBlPSJ2aWRlby9oZXZjIj4KKyAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTWFpblRpZXJMZXZlbDUxIC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjIwNDh4MjA0OCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9Ijh4OCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtMTM5MjY0IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS0yMDAwMDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTEwMDAwMDAwIiAvPgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS52cDguZGVjb2RlciIgdHlwZT0idmlkZW8veC12bmQub24yLnZwOCI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMjA0OHgyMDQ4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTEwMDAwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtNDAwMDAwMDAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLnZwOS5kZWNvZGVyIiB0eXBlPSJ2aWRlby94LXZuZC5vbjIudnA5Ij4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIyMDQ4eDIwNDgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtNTAwMDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTQwMDAwMDAwIiAvPgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICA8L0RlY29kZXJzPgorCisgICAgPEVuY29kZXJzPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLmgyNjMuZW5jb2RlciIgdHlwZT0idmlkZW8vM2dwcCI+CisgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlQmFzZWxpbmUgOiBMZXZlbDQ1IC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMTZ4MTYiIG1heD0iMTc2eDE0NCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIxNngxNiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0xMjgwMDAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5oMjY0LmVuY29kZXIiIHR5cGU9InZpZGVvL2F2YyI+CisgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlQmFzZWxpbmUgOiBMZXZlbDIgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIxNngxNiIgbWF4PSI4OTZ4ODk2IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtMTE4ODAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMjAwMDAwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLm1wZWc0LmVuY29kZXIiIHR5cGU9InZpZGVvL21wNHYtZXMiPgorICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZUNvcmUgOiBMZXZlbDIgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIxNngxNiIgbWF4PSIxNzZ4MTQ0IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEyLTE0ODUiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtNjQwMDAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS52cDguZW5jb2RlciIgdHlwZT0idmlkZW8veC12bmQub24yLnZwOCI+CisgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlTWFpbiA6IExldmVsX1ZlcnNpb24wLTMgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMjA0OHgyMDQ4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS00MDAwMDAwMCIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImJpdHJhdGUtbW9kZXMiIHZhbHVlPSJWQlIsQ0JSIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgPC9FbmNvZGVycz4KKzwvSW5jbHVkZWQ+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmNwcAppbmRleCA1NDk5YzMyLi5iZWI1Y2MwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5jcHAKQEAgLTI3LDYgKzI3LDkgQEAKICAgICAgIG1OdW1CaXRzTGVmdCgwKSB7CiB9CiAKK0FCaXRSZWFkZXI6On5BQml0UmVhZGVyKCkgeworfQorCiB2b2lkIEFCaXRSZWFkZXI6OmZpbGxSZXNlcnZvaXIoKSB7CiAgICAgQ0hFQ0tfR1QobVNpemUsIDB1KTsKIApAQCAtOTksNCArMTAyLDY5IEBACiAgICAgcmV0dXJuIG1EYXRhIC0gKG1OdW1CaXRzTGVmdCArIDcpIC8gODsKIH0KIAorTkFMQml0UmVhZGVyOjpOQUxCaXRSZWFkZXIoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpCisgICAgOiBBQml0UmVhZGVyKGRhdGEsIHNpemUpLAorICAgICAgbU51bVplcm9zKDApIHsKK30KKworYm9vbCBOQUxCaXRSZWFkZXI6OmF0TGVhc3ROdW1CaXRzTGVmdChzaXplX3QgbikgY29uc3QgeworICAgIC8vIGNoZWNrIGFnYWluc3QgcmF3IHNpemUgYW5kIHJlc2Vydm9pciBiaXRzIGZpcnN0CisgICAgc2l6ZV90IG51bUJpdHMgPSBudW1CaXRzTGVmdCgpOworICAgIGlmIChuID4gbnVtQml0cykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3NpemVfdCBudW1CaXRzUmVtYWluaW5nID0gbiAtIG1OdW1CaXRzTGVmdDsKKworICAgIHNpemVfdCBzaXplID0gbVNpemU7CisgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IG1EYXRhOworICAgIGludDMyX3QgbnVtWmVyb3MgPSBtTnVtWmVyb3M7CisgICAgd2hpbGUgKHNpemUgPiAwICYmIG51bUJpdHNSZW1haW5pbmcgPiAwKSB7CisgICAgICAgIGJvb2wgaXNFbXVsYXRpb25QcmV2ZW50aW9uQnl0ZSA9IChudW1aZXJvcyA+PSAyICYmICpkYXRhID09IDMpOworCisgICAgICAgIGlmICgqZGF0YSA9PSAwKSB7CisgICAgICAgICAgICArK251bVplcm9zOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbnVtWmVyb3MgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFpc0VtdWxhdGlvblByZXZlbnRpb25CeXRlKSB7CisgICAgICAgICAgICBudW1CaXRzUmVtYWluaW5nIC09IDg7CisgICAgICAgIH0KKworICAgICAgICArK2RhdGE7CisgICAgICAgIC0tc2l6ZTsKKyAgICB9CisKKyAgICByZXR1cm4gKG51bUJpdHNSZW1haW5pbmcgPD0gMCk7Cit9CisKK3ZvaWQgTkFMQml0UmVhZGVyOjpmaWxsUmVzZXJ2b2lyKCkgeworICAgIENIRUNLX0dUKG1TaXplLCAwdSk7CisKKyAgICBtUmVzZXJ2b2lyID0gMDsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgd2hpbGUgKG1TaXplID4gMCAmJiBpIDwgNCkgeworICAgICAgICBib29sIGlzRW11bGF0aW9uUHJldmVudGlvbkJ5dGUgPSAobU51bVplcm9zID49IDIgJiYgKm1EYXRhID09IDMpOworCisgICAgICAgIGlmICgqbURhdGEgPT0gMCkgeworICAgICAgICAgICAgKyttTnVtWmVyb3M7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtTnVtWmVyb3MgPSAwOworICAgICAgICB9CisKKyAgICAgICAgLy8gc2tpcCBlbXVsYXRpb25fcHJldmVudGlvbl90aHJlZV9ieXRlCisgICAgICAgIGlmICghaXNFbXVsYXRpb25QcmV2ZW50aW9uQnl0ZSkgeworICAgICAgICAgICAgbVJlc2Vydm9pciA9IChtUmVzZXJ2b2lyIDw8IDgpIHwgKm1EYXRhOworICAgICAgICAgICAgKytpOworICAgICAgICB9CisKKyAgICAgICAgKyttRGF0YTsKKyAgICAgICAgLS1tU2l6ZTsKKyAgICB9CisKKyAgICBtTnVtQml0c0xlZnQgPSA4ICogaTsKKyAgICBtUmVzZXJ2b2lyIDw8PSAzMiAtIG1OdW1CaXRzTGVmdDsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuY3BwCmluZGV4IDVmNWM5NzcuLjQ5MTNmZDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmNwcApAQCAtMTksMTEgKzE5LDEzIEBACiAjaW5jbHVkZSAiQURlYnVnLmgiCiAjaW5jbHVkZSAiQUxvb3Blci5oIgogI2luY2x1ZGUgIkFNZXNzYWdlLmgiCisjaW5jbHVkZSAiTWVkaWFCdWZmZXJCYXNlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogQUJ1ZmZlcjo6QUJ1ZmZlcihzaXplX3QgY2FwYWNpdHkpCi0gICAgOiBtUmFuZ2VPZmZzZXQoMCksCisgICAgOiBtTWVkaWFCdWZmZXJCYXNlKE5VTEwpLAorICAgICAgbVJhbmdlT2Zmc2V0KDApLAogICAgICAgbUludDMyRGF0YSgwKSwKICAgICAgIG1Pd25zRGF0YSh0cnVlKSB7CiAgICAgbURhdGEgPSBtYWxsb2MoY2FwYWNpdHkpOwpAQCAtMzcsNyArMzksOCBAQAogfQogCiBBQnVmZmVyOjpBQnVmZmVyKHZvaWQgKmRhdGEsIHNpemVfdCBjYXBhY2l0eSkKLSAgICA6IG1EYXRhKGRhdGEpLAorICAgIDogbU1lZGlhQnVmZmVyQmFzZShOVUxMKSwKKyAgICAgIG1EYXRhKGRhdGEpLAogICAgICAgbUNhcGFjaXR5KGNhcGFjaXR5KSwKICAgICAgIG1SYW5nZU9mZnNldCgwKSwKICAgICAgIG1SYW5nZUxlbmd0aChjYXBhY2l0eSksCkBAIC00NSw2ICs0OCwxNCBAQAogICAgICAgbU93bnNEYXRhKGZhbHNlKSB7CiB9CiAKKy8vIHN0YXRpYworc3A8QUJ1ZmZlcj4gQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBjYXBhY2l0eSkKK3sKKyAgICBzcDxBQnVmZmVyPiByZXMgPSBuZXcgQUJ1ZmZlcihjYXBhY2l0eSk7CisgICAgbWVtY3B5KHJlcy0+ZGF0YSgpLCBkYXRhLCBjYXBhY2l0eSk7CisgICAgcmV0dXJuIHJlczsKK30KKwogQUJ1ZmZlcjo6fkFCdWZmZXIoKSB7CiAgICAgaWYgKG1Pd25zRGF0YSkgewogICAgICAgICBpZiAobURhdGEgIT0gTlVMTCkgewpAQCAtNTYsNiArNjcsOCBAQAogICAgIGlmIChtRmFyZXdlbGwgIT0gTlVMTCkgewogICAgICAgICBtRmFyZXdlbGwtPnBvc3QoKTsKICAgICB9CisKKyAgICBzZXRNZWRpYUJ1ZmZlckJhc2UoTlVMTCk7CiB9CiAKIHZvaWQgQUJ1ZmZlcjo6c2V0UmFuZ2Uoc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKQEAgLTc3LDUgKzkwLDE5IEBACiAgICAgcmV0dXJuIG1NZXRhOwogfQogCitNZWRpYUJ1ZmZlckJhc2UgKkFCdWZmZXI6OmdldE1lZGlhQnVmZmVyQmFzZSgpIHsKKyAgICBpZiAobU1lZGlhQnVmZmVyQmFzZSAhPSBOVUxMKSB7CisgICAgICAgIG1NZWRpYUJ1ZmZlckJhc2UtPmFkZF9yZWYoKTsKKyAgICB9CisgICAgcmV0dXJuIG1NZWRpYUJ1ZmZlckJhc2U7Cit9CisKK3ZvaWQgQUJ1ZmZlcjo6c2V0TWVkaWFCdWZmZXJCYXNlKE1lZGlhQnVmZmVyQmFzZSAqbWVkaWFCdWZmZXIpIHsKKyAgICBpZiAobU1lZGlhQnVmZmVyQmFzZSAhPSBOVUxMKSB7CisgICAgICAgIG1NZWRpYUJ1ZmZlckJhc2UtPnJlbGVhc2UoKTsKKyAgICB9CisgICAgbU1lZGlhQnVmZmVyQmFzZSA9IG1lZGlhQnVmZmVyOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcAppbmRleCBmN2EwMGQ4Li41ZjdjNzBkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5jcHAKQEAgLTUxLDcgKzUxLDcgQEAKIEFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmU6On5BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lKCkgewogfQogCi12b2lkIEFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmU6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Cit2b2lkIEFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmU6OmhhbmRsZU1lc3NhZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBzcDxBU3RhdGU+IHNhdmUgPSBtU3RhdGU7CiAKICAgICBzcDxBU3RhdGU+IGN1ciA9IG1TdGF0ZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuY3BwCmluZGV4IGViZjlkOGQuLjg4YjFjOTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmNwcApAQCAtNjgsMTQgKzY4LDE0IEBACiAKIEFMb29wZXI6OkFMb29wZXIoKQogICAgIDogbVJ1bm5pbmdMb2NhbGx5KGZhbHNlKSB7CisgICAgLy8gY2xlYW4gdXAgc3RhbGUgQUhhbmRsZXJzLiBEb2luZyBpdCBoZXJlIGluc3RlYWQgb2YgaW4gdGhlIGRlc3RydWN0b3IgYXZvaWRzCisgICAgLy8gdGhlIHNpZGUgZWZmZWN0IG9mIG9iamVjdHMgYmVpbmcgZGVsZXRlZCBmcm9tIHRoZSB1bnJlZ2lzdGVyIGZ1bmN0aW9uIHJlY3Vyc2l2ZWx5LgorICAgIGdMb29wZXJSb3N0ZXIudW5yZWdpc3RlclN0YWxlSGFuZGxlcnMoKTsKIH0KIAogQUxvb3Blcjo6fkFMb29wZXIoKSB7CiAgICAgc3RvcCgpOwotCi0gICAgLy8gU2luY2UgdGhpcyBsb29wZXIgaXMgImRlYWQiIChvciBhcyBnb29kIGFzIGRlYWQgYnkgbm93KSwKLSAgICAvLyBoYXZlIEFMb29wZXJSb3N0ZXIgdW5yZWdpc3RlciBhbnkgaGFuZGxlcnMgc3RpbGwgcmVnaXN0ZXJlZCBmb3IgaXQuCi0gICAgZ0xvb3BlclJvc3Rlci51bnJlZ2lzdGVyU3RhbGVIYW5kbGVycygpOworICAgIC8vIHN0YWxlIEFIYW5kbGVycyBhcmUgbm93IGNsZWFuZWQgdXAgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBuZXh0IEFMb29wZXIgdG8gY29tZSBhbG9uZwogfQogCiB2b2lkIEFMb29wZXI6OnNldE5hbWUoY29uc3QgY2hhciAqbmFtZSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5jcHAKaW5kZXggMGMxODFmZi4uZTBkYzc2OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuY3BwCkBAIC03Miw1MCArNzIsNDAgQEAKIH0KIAogdm9pZCBBTG9vcGVyUm9zdGVyOjp1bnJlZ2lzdGVyU3RhbGVIYW5kbGVycygpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCi0gICAgZm9yIChzaXplX3QgaSA9IG1IYW5kbGVycy5zaXplKCk7IGktLSA+IDA7KSB7Ci0gICAgICAgIGNvbnN0IEhhbmRsZXJJbmZvICZpbmZvID0gbUhhbmRsZXJzLnZhbHVlQXQoaSk7CisgICAgVmVjdG9yPHNwPEFMb29wZXI+ID4gYWN0aXZlTG9vcGVyczsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKLSAgICAgICAgc3A8QUxvb3Blcj4gbG9vcGVyID0gaW5mby5tTG9vcGVyLnByb21vdGUoKTsKLSAgICAgICAgaWYgKGxvb3BlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HVigiVW5yZWdpc3RlcmluZyBzdGFsZSBoYW5kbGVyICVkIiwgbUhhbmRsZXJzLmtleUF0KGkpKTsKLSAgICAgICAgICAgIG1IYW5kbGVycy5yZW1vdmVJdGVtc0F0KGkpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gbUhhbmRsZXJzLnNpemUoKTsgaS0tID4gMDspIHsKKyAgICAgICAgICAgIGNvbnN0IEhhbmRsZXJJbmZvICZpbmZvID0gbUhhbmRsZXJzLnZhbHVlQXQoaSk7CisKKyAgICAgICAgICAgIHNwPEFMb29wZXI+IGxvb3BlciA9IGluZm8ubUxvb3Blci5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAobG9vcGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiVW5yZWdpc3RlcmluZyBzdGFsZSBoYW5kbGVyICVkIiwgbUhhbmRsZXJzLmtleUF0KGkpKTsKKyAgICAgICAgICAgICAgICBtSGFuZGxlcnMucmVtb3ZlSXRlbXNBdChpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCAnbG9vcGVyJyBtaWdodCBiZSB0aGUgb25seSBzcDw+IGtlZXBpbmcKKyAgICAgICAgICAgICAgICAvLyB0aGUgb2JqZWN0IGFsaXZlLiBUbyBwcmV2ZW50IGl0IGZyb20gZ29pbmcgb3V0IG9mIHNjb3BlCisgICAgICAgICAgICAgICAgLy8gYW5kIGhhdmluZyB+QUxvb3BlciBjYWxsIHRoaXMgbWV0aG9kIGFnYWluIHJlY3Vyc2l2ZWx5CisgICAgICAgICAgICAgICAgLy8gYW5kIHRoZW4gZGVhZGxvY2tpbmcgYmVjYXVzZSBvZiB0aGUgQXV0b2xvY2sgYWJvdmUsIGFkZAorICAgICAgICAgICAgICAgIC8vIGl0IHRvIGEgVmVjdG9yIHdoaWNoIHdpbGwgZ28gb3V0IG9mIHNjb3BlIGFmdGVyIHRoZSBsb2NrCisgICAgICAgICAgICAgICAgLy8gaGFzIGJlZW4gcmVsZWFzZWQuCisgICAgICAgICAgICAgICAgYWN0aXZlTG9vcGVycy5hZGQobG9vcGVyKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KIAogc3RhdHVzX3QgQUxvb3BlclJvc3Rlcjo6cG9zdE1lc3NhZ2UoCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBpbnQ2NF90IGRlbGF5VXMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIHJldHVybiBwb3N0TWVzc2FnZV9sKG1zZywgZGVsYXlVcyk7Ci19CiAKLXN0YXR1c190IEFMb29wZXJSb3N0ZXI6OnBvc3RNZXNzYWdlX2woCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBpbnQ2NF90IGRlbGF5VXMpIHsKLSAgICBzc2l6ZV90IGluZGV4ID0gbUhhbmRsZXJzLmluZGV4T2ZLZXkobXNnLT50YXJnZXQoKSk7Ci0KLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJmYWlsZWQgdG8gcG9zdCBtZXNzYWdlICclcycuIFRhcmdldCBoYW5kbGVyIG5vdCByZWdpc3RlcmVkLiIsCi0gICAgICAgICAgICAgIG1zZy0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIC1FTk9FTlQ7Ci0gICAgfQotCi0gICAgY29uc3QgSGFuZGxlckluZm8gJmluZm8gPSBtSGFuZGxlcnMudmFsdWVBdChpbmRleCk7Ci0KLSAgICBzcDxBTG9vcGVyPiBsb29wZXIgPSBpbmZvLm1Mb29wZXIucHJvbW90ZSgpOworICAgIHNwPEFMb29wZXI+IGxvb3BlciA9IGZpbmRMb29wZXIobXNnLT50YXJnZXQoKSk7CiAKICAgICBpZiAobG9vcGVyID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coImZhaWxlZCB0byBwb3N0IG1lc3NhZ2UuICIKLSAgICAgICAgICAgICAiVGFyZ2V0IGhhbmRsZXIgJWQgc3RpbGwgcmVnaXN0ZXJlZCwgYnV0IG9iamVjdCBnb25lLiIsCi0gICAgICAgICAgICAgbXNnLT50YXJnZXQoKSk7Ci0KLSAgICAgICAgbUhhbmRsZXJzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOwogICAgICAgICByZXR1cm4gLUVOT0VOVDsKICAgICB9Ci0KICAgICBsb29wZXItPnBvc3QobXNnLCBkZWxheVVzKTsKLQogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMTY5LDE4ICsxNTksMjMgQEAKIAogc3RhdHVzX3QgQUxvb3BlclJvc3Rlcjo6cG9zdEFuZEF3YWl0UmVzcG9uc2UoCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBzcDxBTWVzc2FnZT4gKnJlc3BvbnNlKSB7CisgICAgc3A8QUxvb3Blcj4gbG9vcGVyID0gZmluZExvb3Blcihtc2ctPnRhcmdldCgpKTsKKworICAgIGlmIChsb29wZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygiZmFpbGVkIHRvIHBvc3QgbWVzc2FnZS4gIgorICAgICAgICAgICAgICAgICJUYXJnZXQgaGFuZGxlciAlZCBzdGlsbCByZWdpc3RlcmVkLCBidXQgb2JqZWN0IGdvbmUuIiwKKyAgICAgICAgICAgICAgICBtc2ctPnRhcmdldCgpKTsKKyAgICAgICAgcmVzcG9uc2UtPmNsZWFyKCk7CisgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgIH0KKwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICB1aW50MzJfdCByZXBseUlEID0gbU5leHRSZXBseUlEKys7CiAKICAgICBtc2ctPnNldEludDMyKCJyZXBseUlEIiwgcmVwbHlJRCk7CiAKLSAgICBzdGF0dXNfdCBlcnIgPSBwb3N0TWVzc2FnZV9sKG1zZywgMCAvKiBkZWxheVVzICovKTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmVzcG9uc2UtPmNsZWFyKCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQorICAgIGxvb3Blci0+cG9zdChtc2csIDAgLyogZGVsYXlVcyAqLyk7CiAKICAgICBzc2l6ZV90IGluZGV4OwogICAgIHdoaWxlICgoaW5kZXggPSBtUmVwbGllcy5pbmRleE9mS2V5KHJlcGx5SUQpKSA8IDApIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5jcHAKaW5kZXggMTMwMGYxNi4uMjZiZWEyYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5jcHAKQEAgLTE0LDYgKzE0LDExIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjZGVmaW5lIExPR19UQUcgIkFNZXNzYWdlIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorLy8jZGVmaW5lIERVTVBfU1RBVFMKKyNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CisKICNpbmNsdWRlICJBTWVzc2FnZS5oIgogCiAjaW5jbHVkZSA8Y3R5cGUuaD4KQEAgLTYwLDEyICs2NSwxNCBAQAogdm9pZCBBTWVzc2FnZTo6Y2xlYXIoKSB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTnVtSXRlbXM7ICsraSkgewogICAgICAgICBJdGVtICppdGVtID0gJm1JdGVtc1tpXTsKLSAgICAgICAgZnJlZUl0ZW0oaXRlbSk7CisgICAgICAgIGRlbGV0ZVtdIGl0ZW0tPm1OYW1lOworICAgICAgICBpdGVtLT5tTmFtZSA9IE5VTEw7CisgICAgICAgIGZyZWVJdGVtVmFsdWUoaXRlbSk7CiAgICAgfQogICAgIG1OdW1JdGVtcyA9IDA7CiB9CiAKLXZvaWQgQU1lc3NhZ2U6OmZyZWVJdGVtKEl0ZW0gKml0ZW0pIHsKK3ZvaWQgQU1lc3NhZ2U6OmZyZWVJdGVtVmFsdWUoSXRlbSAqaXRlbSkgewogICAgIHN3aXRjaCAoaXRlbS0+bVR5cGUpIHsKICAgICAgICAgY2FzZSBrVHlwZVN0cmluZzoKICAgICAgICAgewpAQCAtODgsMjUgKzk1LDg1IEBACiAgICAgfQogfQogCi1BTWVzc2FnZTo6SXRlbSAqQU1lc3NhZ2U6OmFsbG9jYXRlSXRlbShjb25zdCBjaGFyICpuYW1lKSB7Ci0gICAgbmFtZSA9IEFBdG9taXplcjo6QXRvbWl6ZShuYW1lKTsKKyNpZmRlZiBEVU1QX1NUQVRTCisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KIAotICAgIHNpemVfdCBpID0gMDsKLSAgICB3aGlsZSAoaSA8IG1OdW1JdGVtcyAmJiBtSXRlbXNbaV0ubU5hbWUgIT0gbmFtZSkgewotICAgICAgICArK2k7CitNdXRleCBnTG9jazsKK3N0YXRpYyBpbnQzMl90IGdGaW5kSXRlbUNhbGxzID0gMTsKK3N0YXRpYyBpbnQzMl90IGdEdXBDYWxscyA9IDE7CitzdGF0aWMgaW50MzJfdCBnQXZlcmFnZU51bUl0ZW1zID0gMDsKK3N0YXRpYyBpbnQzMl90IGdBdmVyYWdlTnVtQ2hlY2tzID0gMDsKK3N0YXRpYyBpbnQzMl90IGdBdmVyYWdlTnVtTWVtQ2hlY2tzID0gMDsKK3N0YXRpYyBpbnQzMl90IGdBdmVyYWdlRHVwSXRlbXMgPSAwOworc3RhdGljIGludDMyX3QgZ0xhc3RDaGVja2VkID0gLTE7CisKK3N0YXRpYyB2b2lkIHJlcG9ydFN0YXRzKCkgeworICAgIGludDMyX3QgdGltZSA9IChBTG9vcGVyOjpHZXROb3dVcygpIC8gMTAwMCk7CisgICAgaWYgKHRpbWUgLyAxMDAwICE9IGdMYXN0Q2hlY2tlZCAvIDEwMDApIHsKKyAgICAgICAgZ0xhc3RDaGVja2VkID0gdGltZTsKKyAgICAgICAgQUxPR0koImNhbGxlZCBmaW5kSXRlbUl4ICV6dSB0aW1lcyAoZm9yIGxlbj0lLjFmIGk9JS4xZi8lLjFmIG1lbSkgZHVwICV6dSB0aW1lcyAoZm9yIGxlbj0lLjFmKSIsCisgICAgICAgICAgICAgICAgZ0ZpbmRJdGVtQ2FsbHMsCisgICAgICAgICAgICAgICAgZ0F2ZXJhZ2VOdW1JdGVtcyAvIChmbG9hdClnRmluZEl0ZW1DYWxscywKKyAgICAgICAgICAgICAgICBnQXZlcmFnZU51bUNoZWNrcyAvIChmbG9hdClnRmluZEl0ZW1DYWxscywKKyAgICAgICAgICAgICAgICBnQXZlcmFnZU51bU1lbUNoZWNrcyAvIChmbG9hdClnRmluZEl0ZW1DYWxscywKKyAgICAgICAgICAgICAgICBnRHVwQ2FsbHMsCisgICAgICAgICAgICAgICAgZ0F2ZXJhZ2VEdXBJdGVtcyAvIChmbG9hdClnRHVwQ2FsbHMpOworICAgICAgICBnRmluZEl0ZW1DYWxscyA9IGdEdXBDYWxscyA9IDE7CisgICAgICAgIGdBdmVyYWdlTnVtSXRlbXMgPSBnQXZlcmFnZU51bUNoZWNrcyA9IGdBdmVyYWdlTnVtTWVtQ2hlY2tzID0gZ0F2ZXJhZ2VEdXBJdGVtcyA9IDA7CisgICAgICAgIGdMYXN0Q2hlY2tlZCA9IHRpbWU7CiAgICAgfQorfQorI2VuZGlmCiAKK2lubGluZSBzaXplX3QgQU1lc3NhZ2U6OmZpbmRJdGVtSW5kZXgoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IGxlbikgY29uc3QgeworI2lmZGVmIERVTVBfU1RBVFMKKyAgICBzaXplX3QgbWVtY2hlY2tzID0gMDsKKyNlbmRpZgorICAgIHNpemVfdCBpID0gMDsKKyAgICBmb3IgKDsgaSA8IG1OdW1JdGVtczsgaSsrKSB7CisgICAgICAgIGlmIChsZW4gIT0gbUl0ZW1zW2ldLm1OYW1lTGVuZ3RoKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorI2lmZGVmIERVTVBfU1RBVFMKKyAgICAgICAgKyttZW1jaGVja3M7CisjZW5kaWYKKyAgICAgICAgaWYgKCFtZW1jbXAobUl0ZW1zW2ldLm1OYW1lLCBuYW1lLCBsZW4pKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyNpZmRlZiBEVU1QX1NUQVRTCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2spOworICAgICAgICArK2dGaW5kSXRlbUNhbGxzOworICAgICAgICBnQXZlcmFnZU51bUl0ZW1zICs9IG1OdW1JdGVtczsKKyAgICAgICAgZ0F2ZXJhZ2VOdW1NZW1DaGVja3MgKz0gbWVtY2hlY2tzOworICAgICAgICBnQXZlcmFnZU51bUNoZWNrcyArPSBpOworICAgICAgICByZXBvcnRTdGF0cygpOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBpOworfQorCisvLyBhc3N1bWVzIGl0ZW0ncyBuYW1lIHdhcyB1bmluaXRpYWxpemVkIG9yIE5VTEwKK3ZvaWQgQU1lc3NhZ2U6Okl0ZW06OnNldE5hbWUoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IGxlbikgeworICAgIG1OYW1lTGVuZ3RoID0gbGVuOworICAgIG1OYW1lID0gbmV3IGNoYXJbbGVuICsgMV07CisgICAgbWVtY3B5KCh2b2lkKiltTmFtZSwgbmFtZSwgbGVuICsgMSk7Cit9CisKK0FNZXNzYWdlOjpJdGVtICpBTWVzc2FnZTo6YWxsb2NhdGVJdGVtKGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgICBzaXplX3QgbGVuID0gc3RybGVuKG5hbWUpOworICAgIHNpemVfdCBpID0gZmluZEl0ZW1JbmRleChuYW1lLCBsZW4pOwogICAgIEl0ZW0gKml0ZW07CiAKICAgICBpZiAoaSA8IG1OdW1JdGVtcykgewogICAgICAgICBpdGVtID0gJm1JdGVtc1tpXTsKLSAgICAgICAgZnJlZUl0ZW0oaXRlbSk7CisgICAgICAgIGZyZWVJdGVtVmFsdWUoaXRlbSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQ0hFQ0sobU51bUl0ZW1zIDwga01heE51bUl0ZW1zKTsKICAgICAgICAgaSA9IG1OdW1JdGVtcysrOwogICAgICAgICBpdGVtID0gJm1JdGVtc1tpXTsKLQotICAgICAgICBpdGVtLT5tTmFtZSA9IG5hbWU7CisgICAgICAgIGl0ZW0tPnNldE5hbWUobmFtZSwgbGVuKTsKICAgICB9CiAKICAgICByZXR1cm4gaXRlbTsKQEAgLTExNCwxOSArMTgxLDIwIEBACiAKIGNvbnN0IEFNZXNzYWdlOjpJdGVtICpBTWVzc2FnZTo6ZmluZEl0ZW0oCiAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIFR5cGUgdHlwZSkgY29uc3QgewotICAgIG5hbWUgPSBBQXRvbWl6ZXI6OkF0b21pemUobmFtZSk7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1JdGVtczsgKytpKSB7CisgICAgc2l6ZV90IGkgPSBmaW5kSXRlbUluZGV4KG5hbWUsIHN0cmxlbihuYW1lKSk7CisgICAgaWYgKGkgPCBtTnVtSXRlbXMpIHsKICAgICAgICAgY29uc3QgSXRlbSAqaXRlbSA9ICZtSXRlbXNbaV07CisgICAgICAgIHJldHVybiBpdGVtLT5tVHlwZSA9PSB0eXBlID8gaXRlbSA6IE5VTEw7CiAKLSAgICAgICAgaWYgKGl0ZW0tPm1OYW1lID09IG5hbWUpIHsKLSAgICAgICAgICAgIHJldHVybiBpdGVtLT5tVHlwZSA9PSB0eXBlID8gaXRlbSA6IE5VTEw7Ci0gICAgICAgIH0KICAgICB9Ci0KICAgICByZXR1cm4gTlVMTDsKIH0KIAorYm9vbCBBTWVzc2FnZTo6Y29udGFpbnMoY29uc3QgY2hhciAqbmFtZSkgY29uc3QgeworICAgIHNpemVfdCBpID0gZmluZEl0ZW1JbmRleChuYW1lLCBzdHJsZW4obmFtZSkpOworICAgIHJldHVybiBpIDwgbU51bUl0ZW1zOworfQorCiAjZGVmaW5lIEJBU0lDX1RZUEUoTkFNRSxGSUVMRE5BTUUsVFlQRU5BTUUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB2b2lkIEFNZXNzYWdlOjpzZXQjI05BTUUoY29uc3QgY2hhciAqbmFtZSwgVFlQRU5BTUUgdmFsdWUpIHsgICAgICAgICAgICBcCiAgICAgSXRlbSAqaXRlbSA9IGFsbG9jYXRlSXRlbShuYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0xNjAsNiArMjI4LDExIEBACiAgICAgaXRlbS0+dS5zdHJpbmdWYWx1ZSA9IG5ldyBBU3RyaW5nKHMsIGxlbiA8IDAgPyBzdHJsZW4ocykgOiBsZW4pOwogfQogCit2b2lkIEFNZXNzYWdlOjpzZXRTdHJpbmcoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IEFTdHJpbmcgJnMpIHsKKyAgICBzZXRTdHJpbmcobmFtZSwgcy5jX3N0cigpLCBzLnNpemUoKSk7Cit9CisKIHZvaWQgQU1lc3NhZ2U6OnNldE9iamVjdEludGVybmFsKAogICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBzcDxSZWZCYXNlPiAmb2JqLCBUeXBlIHR5cGUpIHsKICAgICBJdGVtICppdGVtID0gYWxsb2NhdGVJdGVtKG5hbWUpOwpAQCAtMjc4LDExICszNTEsMjAgQEAKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKG1XaGF0LCBtVGFyZ2V0KTsKICAgICBtc2ctPm1OdW1JdGVtcyA9IG1OdW1JdGVtczsKIAorI2lmZGVmIERVTVBfU1RBVFMKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9jayk7CisgICAgICAgICsrZ0R1cENhbGxzOworICAgICAgICBnQXZlcmFnZUR1cEl0ZW1zICs9IG1OdW1JdGVtczsKKyAgICAgICAgcmVwb3J0U3RhdHMoKTsKKyAgICB9CisjZW5kaWYKKwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU51bUl0ZW1zOyArK2kpIHsKICAgICAgICAgY29uc3QgSXRlbSAqZnJvbSA9ICZtSXRlbXNbaV07CiAgICAgICAgIEl0ZW0gKnRvID0gJm1zZy0+bUl0ZW1zW2ldOwogCi0gICAgICAgIHRvLT5tTmFtZSA9IGZyb20tPm1OYW1lOworICAgICAgICB0by0+c2V0TmFtZShmcm9tLT5tTmFtZSwgZnJvbS0+bU5hbWVMZW5ndGgpOwogICAgICAgICB0by0+bVR5cGUgPSBmcm9tLT5tVHlwZTsKIAogICAgICAgICBzd2l0Y2ggKGZyb20tPm1UeXBlKSB7CkBAIC00MDMsNyArNDg1LDcgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBzdGF0aWNfY2FzdDxBQnVmZmVyICo+KGl0ZW0udS5yZWZWYWx1ZSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoYnVmZmVyICE9IE5VTEwgJiYgYnVmZmVyLT5zaXplKCkgPD0gNjQpIHsKKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVyICE9IE5VTEwgJiYgYnVmZmVyLT5kYXRhKCkgIT0gTlVMTCAmJiBidWZmZXItPnNpemUoKSA8PSA2NCkgewogICAgICAgICAgICAgICAgICAgICB0bXAgPSBTdHJpbmdQcmludGYoIkJ1ZmZlciAlcyA9IHtcbiIsIGl0ZW0ubU5hbWUpOwogICAgICAgICAgICAgICAgICAgICBoZXhkdW1wKGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSwgaW5kZW50ICsgNCwgJnRtcCk7CiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZEluZGVudCgmdG1wLCBpbmRlbnQgKyAyKTsKQEAgLTQ2OCw4ICs1NTAsOSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBpdGVtLT5tTmFtZSA9IEFBdG9taXplcjo6QXRvbWl6ZShuYW1lKTsKICAgICAgICAgaXRlbS0+bVR5cGUgPSBzdGF0aWNfY2FzdDxUeXBlPihwYXJjZWwucmVhZEludDMyKCkpOworICAgICAgICAvLyBzZXROYW1lKCkgaGFwcGVucyBiZWxvdyBzbyB0aGF0IHdlIGRvbid0IGxlYWsgbWVtb3J5IHdoZW4gcGFyc2luZworICAgICAgICAvLyBpcyBhYm9ydGVkIGluIHRoZSBtaWRkbGUuCiAgICAgICAgIHN3aXRjaCAoaXRlbS0+bVR5cGUpIHsKICAgICAgICAgICAgIGNhc2Uga1R5cGVJbnQzMjoKICAgICAgICAgICAgIHsKQEAgLTUzMSw2ICs2MTQsOCBAQAogICAgICAgICAgICAgICAgIFRSRVNQQVNTKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICBpdGVtLT5zZXROYW1lKG5hbWUsIHN0cmxlbihuYW1lKSk7CiAgICAgfQogCiAgICAgcmV0dXJuIG1zZzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU5ldHdvcmtTZXNzaW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU5ldHdvcmtTZXNzaW9uLmNwcAppbmRleCBlNjI5NTg4Li40NTA0YzJiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FOZXR3b3JrU2Vzc2lvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTmV0d29ya1Nlc3Npb24uY3BwCkBAIC01MjEsNyArNTIxLDcgQEAKICAgICByZXR1cm4gZXJyOwogfQogCi12b2lkIEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6ZHVtcEZyYWdtZW50U3RhdHMoY29uc3QgRnJhZ21lbnQgJmZyYWcpIHsKK3ZvaWQgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjpkdW1wRnJhZ21lbnRTdGF0cyhjb25zdCBGcmFnbWVudCAmIC8qIGZyYWcgKi8pIHsKICNpZiAwCiAgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CiAgICAgaW50NjRfdCBkZWxheU1zID0gKG5vd1VzIC0gZnJhZy5tVGltZVVzKSAvIDEwMDBsbDsKQEAgLTU3OSw3ICs1NzksNyBAQAogCiAgICAgICAgIGlmIChlcnIgPT0gLUVBR0FJTikgewogICAgICAgICAgICAgaWYgKCFtT3V0RnJhZ21lbnRzLmVtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HSSgiJWQgZGF0YWdyYW1zIHJlbWFpbiBxdWV1ZWQuIiwgbU91dEZyYWdtZW50cy5zaXplKCkpOworICAgICAgICAgICAgICAgIEFMT0dJKCIlenUgZGF0YWdyYW1zIHJlbWFpbiBxdWV1ZWQuIiwgbU91dEZyYWdtZW50cy5zaXplKCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZXJyID0gT0s7CiAgICAgICAgIH0KQEAgLTYyMyw3ICs2MjMsNyBAQAogICAgIENIRUNLX0VRKG1TdGF0ZSwgQ09OTkVDVEVEKTsKICAgICBDSEVDSyghbU91dEZyYWdtZW50cy5lbXB0eSgpKTsKIAotICAgIHNzaXplX3QgbjsKKyAgICBzc2l6ZV90IG4gPSAtMTsKICAgICB3aGlsZSAoIW1PdXRGcmFnbWVudHMuZW1wdHkoKSkgewogICAgICAgICBjb25zdCBGcmFnbWVudCAmZnJhZyA9ICptT3V0RnJhZ21lbnRzLmJlZ2luKCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuY3BwCmluZGV4IGRlZTc4NmQuLjk4MzVjYTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmNwcApAQCAtMjAsNiArMjAsOCBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogCisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlICJBRGVidWcuaCIKICNpbmNsdWRlICJBU3RyaW5nLmgiCiAKQEAgLTQ4LDYgKzUwLDEzIEBACiAgICAgc2V0VG8ocywgc2l6ZSk7CiB9CiAKK0FTdHJpbmc6OkFTdHJpbmcoY29uc3QgU3RyaW5nOCAmZnJvbSkKKyAgICA6IG1EYXRhKE5VTEwpLAorICAgICAgbVNpemUoMCksCisgICAgICBtQWxsb2NTaXplKDEpIHsKKyAgICBzZXRUbyhmcm9tLnN0cmluZygpLCBmcm9tLmxlbmd0aCgpKTsKK30KKwogQVN0cmluZzo6QVN0cmluZyhjb25zdCBBU3RyaW5nICZmcm9tKQogICAgIDogbURhdGEoTlVMTCksCiAgICAgICBtU2l6ZSgwKSwKQEAgLTE4OSw2NCArMTk4LDY0IEBACiAKIHZvaWQgQVN0cmluZzo6YXBwZW5kKGludCB4KSB7CiAgICAgY2hhciBzWzE2XTsKLSAgICBzcHJpbnRmKHMsICIlZCIsIHgpOwotCisgICAgaW50IHJlc3VsdCA9IHNucHJpbnRmKHMsIHNpemVvZihzKSwgIiVkIiwgeCk7CisgICAgQ0hFQ0soKHJlc3VsdCA+IDApICYmICgoc2l6ZV90KSByZXN1bHQpIDwgc2l6ZW9mKHMpKTsKICAgICBhcHBlbmQocyk7CiB9CiAKIHZvaWQgQVN0cmluZzo6YXBwZW5kKHVuc2lnbmVkIHgpIHsKICAgICBjaGFyIHNbMTZdOwotICAgIHNwcmludGYocywgIiV1IiwgeCk7Ci0KKyAgICBpbnQgcmVzdWx0ID0gc25wcmludGYocywgc2l6ZW9mKHMpLCAiJXUiLCB4KTsKKyAgICBDSEVDSygocmVzdWx0ID4gMCkgJiYgKChzaXplX3QpIHJlc3VsdCkgPCBzaXplb2YocykpOwogICAgIGFwcGVuZChzKTsKIH0KIAogdm9pZCBBU3RyaW5nOjphcHBlbmQobG9uZyB4KSB7Ci0gICAgY2hhciBzWzE2XTsKLSAgICBzcHJpbnRmKHMsICIlbGQiLCB4KTsKLQorICAgIGNoYXIgc1szMl07CisgICAgaW50IHJlc3VsdCA9IHNucHJpbnRmKHMsIHNpemVvZihzKSwgIiVsZCIsIHgpOworICAgIENIRUNLKChyZXN1bHQgPiAwKSAmJiAoKHNpemVfdCkgcmVzdWx0KSA8IHNpemVvZihzKSk7CiAgICAgYXBwZW5kKHMpOwogfQogCiB2b2lkIEFTdHJpbmc6OmFwcGVuZCh1bnNpZ25lZCBsb25nIHgpIHsKLSAgICBjaGFyIHNbMTZdOwotICAgIHNwcmludGYocywgIiVsdSIsIHgpOwotCisgICAgY2hhciBzWzMyXTsKKyAgICBpbnQgcmVzdWx0ID0gc25wcmludGYocywgc2l6ZW9mKHMpLCAiJWx1IiwgeCk7CisgICAgQ0hFQ0soKHJlc3VsdCA+IDApICYmICgoc2l6ZV90KSByZXN1bHQpIDwgc2l6ZW9mKHMpKTsKICAgICBhcHBlbmQocyk7CiB9CiAKIHZvaWQgQVN0cmluZzo6YXBwZW5kKGxvbmcgbG9uZyB4KSB7CiAgICAgY2hhciBzWzMyXTsKLSAgICBzcHJpbnRmKHMsICIlbGxkIiwgeCk7Ci0KKyAgICBpbnQgcmVzdWx0ID0gc25wcmludGYocywgc2l6ZW9mKHMpLCAiJWxsZCIsIHgpOworICAgIENIRUNLKChyZXN1bHQgPiAwKSAmJiAoKHNpemVfdCkgcmVzdWx0KSA8IHNpemVvZihzKSk7CiAgICAgYXBwZW5kKHMpOwogfQogCiB2b2lkIEFTdHJpbmc6OmFwcGVuZCh1bnNpZ25lZCBsb25nIGxvbmcgeCkgewogICAgIGNoYXIgc1szMl07Ci0gICAgc3ByaW50ZihzLCAiJWxsdSIsIHgpOwotCisgICAgaW50IHJlc3VsdCA9IHNucHJpbnRmKHMsIHNpemVvZihzKSwgIiVsbHUiLCB4KTsKKyAgICBDSEVDSygocmVzdWx0ID4gMCkgJiYgKChzaXplX3QpIHJlc3VsdCkgPCBzaXplb2YocykpOwogICAgIGFwcGVuZChzKTsKIH0KIAogdm9pZCBBU3RyaW5nOjphcHBlbmQoZmxvYXQgeCkgewogICAgIGNoYXIgc1sxNl07Ci0gICAgc3ByaW50ZihzLCAiJWYiLCB4KTsKLQorICAgIGludCByZXN1bHQgPSBzbnByaW50ZihzLCBzaXplb2YocyksICIlZiIsIHgpOworICAgIENIRUNLKChyZXN1bHQgPiAwKSAmJiAoKHNpemVfdCkgcmVzdWx0KSA8IHNpemVvZihzKSk7CiAgICAgYXBwZW5kKHMpOwogfQogCiB2b2lkIEFTdHJpbmc6OmFwcGVuZChkb3VibGUgeCkgewogICAgIGNoYXIgc1sxNl07Ci0gICAgc3ByaW50ZihzLCAiJWYiLCB4KTsKLQorICAgIGludCByZXN1bHQgPSBzbnByaW50ZihzLCBzaXplb2YocyksICIlZiIsIHgpOworICAgIENIRUNLKChyZXN1bHQgPiAwKSAmJiAoKHNpemVfdCkgcmVzdWx0KSA8IHNpemVvZihzKSk7CiAgICAgYXBwZW5kKHMpOwogfQogCiB2b2lkIEFTdHJpbmc6OmFwcGVuZCh2b2lkICp4KSB7Ci0gICAgY2hhciBzWzE2XTsKLSAgICBzcHJpbnRmKHMsICIlcCIsIHgpOwotCisgICAgY2hhciBzWzMyXTsKKyAgICBpbnQgcmVzdWx0ID0gc25wcmludGYocywgc2l6ZW9mKHMpLCAiJXAiLCB4KTsKKyAgICBDSEVDSygocmVzdWx0ID4gMCkgJiYgKChzaXplX3QpIHJlc3VsdCkgPCBzaXplb2YocykpOwogICAgIGFwcGVuZChzKTsKIH0KIApAQCAtMjk4LDYgKzMwNywxNCBAQAogICAgIHJldHVybiBzdHJjbXAobURhdGEsIG90aGVyLm1EYXRhKTsKIH0KIAoraW50IEFTdHJpbmc6OmNvbXBhcmVJZ25vcmVDYXNlKGNvbnN0IEFTdHJpbmcgJm90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIHN0cmNhc2VjbXAobURhdGEsIG90aGVyLm1EYXRhKTsKK30KKworYm9vbCBBU3RyaW5nOjplcXVhbHNJZ25vcmVDYXNlKGNvbnN0IEFTdHJpbmcgJm90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbXBhcmVJZ25vcmVDYXNlKG90aGVyKSA9PSAwOworfQorCiB2b2lkIEFTdHJpbmc6OnRvbG93ZXIoKSB7CiAgICAgbWFrZU11dGFibGUoKTsKIApAQCAtMzIwLDYgKzMzNywzNSBAQAogICAgIHJldHVybiAhc3RyY21wKG1EYXRhICsgbVNpemUgLSBzdWZmaXhMZW4sIHN1ZmZpeCk7CiB9CiAKK2Jvb2wgQVN0cmluZzo6c3RhcnRzV2l0aElnbm9yZUNhc2UoY29uc3QgY2hhciAqcHJlZml4KSBjb25zdCB7CisgICAgcmV0dXJuICFzdHJuY2FzZWNtcChtRGF0YSwgcHJlZml4LCBzdHJsZW4ocHJlZml4KSk7Cit9CisKK2Jvb2wgQVN0cmluZzo6ZW5kc1dpdGhJZ25vcmVDYXNlKGNvbnN0IGNoYXIgKnN1ZmZpeCkgY29uc3QgeworICAgIHNpemVfdCBzdWZmaXhMZW4gPSBzdHJsZW4oc3VmZml4KTsKKworICAgIGlmIChtU2l6ZSA8IHN1ZmZpeExlbikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuICFzdHJjYXNlY21wKG1EYXRhICsgbVNpemUgLSBzdWZmaXhMZW4sIHN1ZmZpeCk7Cit9CisKKy8vIHN0YXRpYworQVN0cmluZyBBU3RyaW5nOjpGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAmcGFyY2VsKSB7CisgICAgc2l6ZV90IHNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHBhcmNlbC5yZWFkSW50MzIoKSk7CisgICAgcmV0dXJuIEFTdHJpbmcoc3RhdGljX2Nhc3Q8Y29uc3QgY2hhciAqPihwYXJjZWwucmVhZElucGxhY2Uoc2l6ZSkpLCBzaXplKTsKK30KKworc3RhdHVzX3QgQVN0cmluZzo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3QgeworICAgIENIRUNLX0xFKG1TaXplLCBzdGF0aWNfY2FzdDxzaXplX3Q+KElOVDMyX01BWCkpOworICAgIHN0YXR1c190IGVyciA9IHBhcmNlbC0+d3JpdGVJbnQzMihtU2l6ZSk7CisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICBlcnIgPSBwYXJjZWwtPndyaXRlKG1EYXRhLCBtU2l6ZSk7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKIEFTdHJpbmcgU3RyaW5nUHJpbnRmKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSB7CiAgICAgdmFfbGlzdCBhcDsKICAgICB2YV9zdGFydChhcCwgZm9ybWF0KTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5tawppbmRleCBhZDJkYWI1Li45MGE2YTIzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLm1rCkBAIC0yNCw3ICsyNCw3IEBACiAgICAgICAgIGxpYnV0aWxzICAgICAgICAgIFwKICAgICAgICAgbGlibG9nCiAKLUxPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhcgorTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyIC1XZXJyb3IKIAogTE9DQUxfTU9EVUxFOj0gbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5jcHAKaW5kZXggOTU4MTk4Ni4uN2RhN2RiOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmNwcApAQCAtMzMsNiArMzMsMTAgQEAKIAogICAgICAgICBpZiAobiA+PSAyICYmIHMuY19zdHIoKVtuIC0gMl0gPT0gJz0nKSB7CiAgICAgICAgICAgICBwYWRkaW5nID0gMjsKKworICAgICAgICAgICAgaWYgKG4gPj0gMyAmJiBzLmNfc3RyKClbbiAtIDNdID09ICc9JykgeworICAgICAgICAgICAgICAgIHBhZGRpbmcgPSAzOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC03Niw3ICs4MCw3IEBACiAgICAgICAgIGlmICgoKGkgKyAxKSAlIDQpID09IDApIHsKICAgICAgICAgICAgIG91dFtqKytdID0gKGFjY3VtID4+IDE2KTsKIAotICAgICAgICAgICAgaWYgKGogPCBvdXRMZW4pIHsgb3V0W2orK10gPSAoYWNjdW0gPj4gOCkgJiAweGZmOyB9IAorICAgICAgICAgICAgaWYgKGogPCBvdXRMZW4pIHsgb3V0W2orK10gPSAoYWNjdW0gPj4gOCkgJiAweGZmOyB9CiAgICAgICAgICAgICBpZiAoaiA8IG91dExlbikgeyBvdXRbaisrXSA9IGFjY3VtICYgMHhmZjsgfQogCiAgICAgICAgICAgICBhY2N1bSA9IDA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YzMzA3ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvQW5kcm9pZC5tawpAQCAtMCwwICsxLDI4IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaWZuZXEgKCQoVEFSR0VUX0JVSUxEX1BESyksIHRydWUpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSAgICAgICBcCisgICAgICAgIEhUVFBIZWxwZXIuY3BwICAgICAgICAgIFwKKworTE9DQUxfQ19JTkNMVURFUzo9IFwKKwkkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCisJJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCisJJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9jb3JlL2puaSBcCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorCWxpYnN0YWdlZnJpZ2h0IGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBcCisgICAgICAgIGxpYmFuZHJvaWRfcnVudGltZSBcCisgICAgICAgIGxpYm1lZGlhCisKK0xPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X2h0dHBfc3VwcG9ydAorCitMT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIKKworTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9IVFRQSGVscGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvSFRUUEhlbHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc4NDVlMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvSFRUUEhlbHBlci5jcHAKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiSFRUUEhlbHBlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkhUVFBIZWxwZXIuaCIKKworI2luY2x1ZGUgImFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oIgorI2luY2x1ZGUgImFuZHJvaWRfdXRpbF9CaW5kZXIuaCIKKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bmF0aXZlaGVscGVyL1Njb3BlZExvY2FsUmVmLmg+CisjaW5jbHVkZSAiam5pLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3A8SU1lZGlhSFRUUFNlcnZpY2U+IENyZWF0ZUhUVFBTZXJ2aWNlSW5DdXJyZW50SmF2YUNvbnRleHQoKSB7CisgICAgaWYgKEFuZHJvaWRSdW50aW1lOjpnZXRKYXZhVk0oKSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJDcmVhdGVIVFRQU2VydmljZUluQ3VycmVudEphdmFDb250ZXh0IGNhbGxlZCBvdXRzaWRlICIKKyAgICAgICAgICAgICAgIkpBVkEgZW52aXJvbm1lbnQuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworCisgICAgU2NvcGVkTG9jYWxSZWY8amNsYXNzPiBjbGF6eigKKyAgICAgICAgICAgIGVudiwgZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvTWVkaWFIVFRQU2VydmljZSIpKTsKKyAgICBDSEVDSyhjbGF6ei5nZXQoKSAhPSBOVUxMKTsKKworICAgIGptZXRob2RJRCBjb25zdHJ1Y3RJRCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenouZ2V0KCksICI8aW5pdD4iLCAiKClWIik7CisgICAgQ0hFQ0soY29uc3RydWN0SUQgIT0gTlVMTCk7CisKKyAgICBTY29wZWRMb2NhbFJlZjxqb2JqZWN0PiBodHRwU2VydmljZU9iaigKKyAgICAgICAgICAgIGVudiwgZW52LT5OZXdPYmplY3QoY2xhenouZ2V0KCksIGNvbnN0cnVjdElEKSk7CisKKyAgICBzcDxJTWVkaWFIVFRQU2VydmljZT4gaHR0cFNlcnZpY2U7CisgICAgaWYgKGh0dHBTZXJ2aWNlT2JqLmdldCgpICE9IE5VTEwpIHsKKyAgICAgICAgam1ldGhvZElEIGFzQmluZGVySUQgPQorICAgICAgICAgICAgZW52LT5HZXRNZXRob2RJRChjbGF6ei5nZXQoKSwgImFzQmluZGVyIiwgIigpTGFuZHJvaWQvb3MvSUJpbmRlcjsiKTsKKyAgICAgICAgQ0hFQ0soYXNCaW5kZXJJRCAhPSBOVUxMKTsKKworICAgICAgICBTY29wZWRMb2NhbFJlZjxqb2JqZWN0PiBodHRwU2VydmljZUJpbmRlck9iaigKKyAgICAgICAgICAgICAgICBlbnYsIGVudi0+Q2FsbE9iamVjdE1ldGhvZChodHRwU2VydmljZU9iai5nZXQoKSwgYXNCaW5kZXJJRCkpOworICAgICAgICBDSEVDSyhodHRwU2VydmljZUJpbmRlck9iai5nZXQoKSAhPSBOVUxMKTsKKworICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPQorICAgICAgICAgICAgaWJpbmRlckZvckphdmFPYmplY3QoZW52LCBodHRwU2VydmljZUJpbmRlck9iai5nZXQoKSk7CisKKyAgICAgICAgaHR0cFNlcnZpY2UgPSBpbnRlcmZhY2VfY2FzdDxJTWVkaWFIVFRQU2VydmljZT4oYmluZGVyKTsKKyAgICB9CisKKyAgICByZXR1cm4gaHR0cFNlcnZpY2U7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0hUVFBIZWxwZXIuaApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggNjUlCmNvcHkgZnJvbSBsaWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKY29weSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0hUVFBIZWxwZXIuaAppbmRleCAxM2NhYzZkLi44YWVmMTE1Ci0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0hUVFBIZWxwZXIuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDEzICsxNCwxOCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2lmbmRlZiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0gKLSNkZWZpbmUgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19ICisjaWZuZGVmIEhUVFBfSEVMUEVSX0hfCiAKLS8qIC0tLS0tIE1haW4gZmVhdHVyZXMgLS0tLS0gKi8KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzX01DUy5oIiAvKiBUcmFuc2NvZGVyICovCisjZGVmaW5lIEhUVFBfSEVMUEVSX0hfCiAKLS8qIC0tLS0tIEFkZC1vbnMgLS0tLS0gKi8KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAKLSNlbmRpZiAvKiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0ggKi8KK25hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RydWN0IElNZWRpYUhUVFBTZXJ2aWNlOworCitzcDxJTWVkaWFIVFRQU2VydmljZT4gQ3JlYXRlSFRUUFNlcnZpY2VJbkN1cnJlbnRKYXZhQ29udGV4dCgpOworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEhUVFBfSEVMUEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL01lZGlhSFRUUC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL01lZGlhSFRUUC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQyOTkxMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvTWVkaWFIVFRQLmNwcApAQCAtMCwwICsxLDIwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFIVFRQIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorCisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNZWRpYUhUVFA6Ok1lZGlhSFRUUChjb25zdCBzcDxJTWVkaWFIVFRQQ29ubmVjdGlvbj4gJmNvbm4pCisgICAgOiBtSW5pdENoZWNrKE5PX0lOSVQpLAorICAgICAgbUhUVFBDb25uZWN0aW9uKGNvbm4pLAorICAgICAgbUNhY2hlZFNpemVWYWxpZChmYWxzZSksCisgICAgICBtQ2FjaGVkU2l6ZSgwbGwpLAorICAgICAgbURybU1hbmFnZXJDbGllbnQoTlVMTCkgeworICAgIG1Jbml0Q2hlY2sgPSBPSzsKK30KKworTWVkaWFIVFRQOjp+TWVkaWFIVFRQKCkgeworICAgIGNsZWFyRFJNU3RhdGVfbCgpOworfQorCitzdGF0dXNfdCBNZWRpYUhUVFA6OmNvbm5lY3QoCisgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCisgICAgICAgIG9mZjY0X3QgLyogb2Zmc2V0ICovKSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gZXh0SGVhZGVyczsKKyAgICBpZiAoaGVhZGVycyAhPSBOVUxMKSB7CisgICAgICAgIGV4dEhlYWRlcnMgPSAqaGVhZGVyczsKKyAgICB9CisgICAgZXh0SGVhZGVycy5hZGQoU3RyaW5nOCgiVXNlci1BZ2VudCIpLCBTdHJpbmc4KE1ha2VVc2VyQWdlbnQoKS5jX3N0cigpKSk7CisKKyAgICBib29sIHN1Y2Nlc3MgPSBtSFRUUENvbm5lY3Rpb24tPmNvbm5lY3QodXJpLCAmZXh0SGVhZGVycyk7CisKKyAgICBtTGFzdEhlYWRlcnMgPSBleHRIZWFkZXJzOworICAgIG1MYXN0VVJJID0gdXJpOworCisgICAgbUNhY2hlZFNpemVWYWxpZCA9IGZhbHNlOworCisgICAgcmV0dXJuIHN1Y2Nlc3MgPyBPSyA6IFVOS05PV05fRVJST1I7Cit9CisKK3ZvaWQgTWVkaWFIVFRQOjpkaXNjb25uZWN0KCkgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtSFRUUENvbm5lY3Rpb24tPmRpc2Nvbm5lY3QoKTsKK30KKworc3RhdHVzX3QgTWVkaWFIVFRQOjppbml0Q2hlY2soKSBjb25zdCB7CisgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Cit9CisKK3NzaXplX3QgTWVkaWFIVFRQOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisKKyAgICBzaXplX3QgbnVtQnl0ZXNSZWFkID0gMDsKKyAgICB3aGlsZSAobnVtQnl0ZXNSZWFkIDwgc2l6ZSkgeworICAgICAgICBzaXplX3QgY29weSA9IHNpemUgLSBudW1CeXRlc1JlYWQ7CisKKyAgICAgICAgaWYgKGNvcHkgPiA2NCAqIDEwMjQpIHsKKyAgICAgICAgICAgIC8vIGxpbWl0IHRoZSBidWZmZXIgc2l6ZXMgdHJhbnNmZXJyZWQgYWNyb3NzIGJpbmRlciBib3VuZGFyaWVzCisgICAgICAgICAgICAvLyB0byBhdm9pZCBzcHVyaW91cyB0cmFuc2FjdGlvbiBmYWlsdXJlcy4KKyAgICAgICAgICAgIGNvcHkgPSA2NCAqIDEwMjQ7CisgICAgICAgIH0KKworICAgICAgICBzc2l6ZV90IG4gPSBtSFRUUENvbm5lY3Rpb24tPnJlYWRBdCgKKyAgICAgICAgICAgICAgICBvZmZzZXQgKyBudW1CeXRlc1JlYWQsICh1aW50OF90ICopZGF0YSArIG51bUJ5dGVzUmVhZCwgY29weSk7CisKKyAgICAgICAgaWYgKG4gPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gbjsKKyAgICAgICAgfSBlbHNlIGlmIChuID09IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgbnVtQnl0ZXNSZWFkICs9IG47CisgICAgfQorCisgICAgaW50NjRfdCBkZWxheVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKSAtIHN0YXJ0VGltZVVzOworCisgICAgYWRkQmFuZHdpZHRoTWVhc3VyZW1lbnQobnVtQnl0ZXNSZWFkLCBkZWxheVVzKTsKKworICAgIHJldHVybiBudW1CeXRlc1JlYWQ7Cit9CisKK3N0YXR1c190IE1lZGlhSFRUUDo6Z2V0U2l6ZShvZmY2NF90ICpzaXplKSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgLy8gQ2FjaGluZyB0aGUgcmV0dXJuZWQgc2l6ZSBzbyB0aGF0IGl0IHN0YXlzIHZhbGlkIGV2ZW4gYWZ0ZXIgYQorICAgIC8vIGRpc2Nvbm5lY3QuIE51Q2FjaGVkU291cmNlMiByZWxpZXMgb24gdGhpcy4KKworICAgIGlmICghbUNhY2hlZFNpemVWYWxpZCkgeworICAgICAgICBtQ2FjaGVkU2l6ZSA9IG1IVFRQQ29ubmVjdGlvbi0+Z2V0U2l6ZSgpOworICAgICAgICBtQ2FjaGVkU2l6ZVZhbGlkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAqc2l6ZSA9IG1DYWNoZWRTaXplOworCisgICAgcmV0dXJuICpzaXplIDwgMCA/ICpzaXplIDogT0s7Cit9CisKK3VpbnQzMl90IE1lZGlhSFRUUDo6ZmxhZ3MoKSB7CisgICAgcmV0dXJuIGtXYW50c1ByZWZldGNoaW5nIHwga0lzSFRUUEJhc2VkU291cmNlOworfQorCitzdGF0dXNfdCBNZWRpYUhUVFA6OnJlY29ubmVjdEF0T2Zmc2V0KG9mZjY0X3Qgb2Zmc2V0KSB7CisgICAgcmV0dXJuIGNvbm5lY3QobUxhc3RVUkkuY19zdHIoKSwgJm1MYXN0SGVhZGVycywgb2Zmc2V0KTsKK30KKworLy8gRFJNLi4uCisKK3NwPERlY3J5cHRIYW5kbGU+IE1lZGlhSFRUUDo6RHJtSW5pdGlhbGl6YXRpb24oY29uc3QgY2hhciogbWltZSkgeworICAgIGlmIChtRHJtTWFuYWdlckNsaWVudCA9PSBOVUxMKSB7CisgICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50ID0gbmV3IERybU1hbmFnZXJDbGllbnQoKTsKKyAgICB9CisKKyAgICBpZiAobURybU1hbmFnZXJDbGllbnQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobURlY3J5cHRIYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBtRGVjcnlwdEhhbmRsZSA9IG1Ecm1NYW5hZ2VyQ2xpZW50LT5vcGVuRGVjcnlwdFNlc3Npb24oCisgICAgICAgICAgICAgICAgU3RyaW5nOChtTGFzdFVSSS5jX3N0cigpKSwgbWltZSk7CisgICAgfQorCisgICAgaWYgKG1EZWNyeXB0SGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIG1Ecm1NYW5hZ2VyQ2xpZW50OworICAgICAgICBtRHJtTWFuYWdlckNsaWVudCA9IE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIG1EZWNyeXB0SGFuZGxlOworfQorCit2b2lkIE1lZGlhSFRUUDo6Z2V0RHJtSW5mbygKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gJmhhbmRsZSwgRHJtTWFuYWdlckNsaWVudCAqKmNsaWVudCkgeworICAgIGhhbmRsZSA9IG1EZWNyeXB0SGFuZGxlOworICAgICpjbGllbnQgPSBtRHJtTWFuYWdlckNsaWVudDsKK30KKworU3RyaW5nOCBNZWRpYUhUVFA6OmdldFVyaSgpIHsKKyAgICBTdHJpbmc4IHVyaTsKKyAgICBpZiAoT0sgPT0gbUhUVFBDb25uZWN0aW9uLT5nZXRVcmkoJnVyaSkpIHsKKyAgICAgICAgcmV0dXJuIHVyaTsKKyAgICB9CisgICAgcmV0dXJuIFN0cmluZzgobUxhc3RVUkkuY19zdHIoKSk7Cit9CisKK1N0cmluZzggTWVkaWFIVFRQOjpnZXRNSU1FVHlwZSgpIGNvbnN0IHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gU3RyaW5nOCgiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CisgICAgfQorCisgICAgU3RyaW5nOCBtaW1lVHlwZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtSFRUUENvbm5lY3Rpb24tPmdldE1JTUVUeXBlKCZtaW1lVHlwZSk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBTdHJpbmc4KCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKKyAgICB9CisKKyAgICByZXR1cm4gbWltZVR5cGU7Cit9CisKK3ZvaWQgTWVkaWFIVFRQOjpjbGVhckRSTVN0YXRlX2woKSB7CisgICAgaWYgKG1EZWNyeXB0SGFuZGxlICE9IE5VTEwpIHsKKyAgICAgICAgLy8gVG8gcmVsZWFzZSBtRGVjcnlwdEhhbmRsZQorICAgICAgICBDSEVDSyhtRHJtTWFuYWdlckNsaWVudCk7CisgICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50LT5jbG9zZURlY3J5cHRTZXNzaW9uKG1EZWNyeXB0SGFuZGxlKTsKKyAgICAgICAgbURlY3J5cHRIYW5kbGUgPSBOVUxMOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLm1rCmluZGV4IGYzNTI5ZjkuLmU4ZDU1OGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvQW5kcm9pZC5tawpAQCAtMTMsNiArMTMsOCBAQAogCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogCSQoVE9QKS9leHRlcm5hbC9vcGVuc3NsL2luY2x1ZGUKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgICAgIGxpYmJpbmRlciBcCiAgICAgICAgIGxpYmNyeXB0byBcCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5jcHAKaW5kZXggZTUzZTM1YS4uZmJhNmIwOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmNwcApAQCAtMjcsNiArMjcsOCBAQAogI2luY2x1ZGUgIm1wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oIgogCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KQEAgLTM0LDUyICszNiw1MyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAKICNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgogCiAjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPG9wZW5zc2wvYWVzLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9tZDUuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBMaXZlU2Vzc2lvbjo6TGl2ZVNlc3Npb24oCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCB1aW50MzJfdCBmbGFncywgYm9vbCB1aWRWYWxpZCwgdWlkX3QgdWlkKQorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgdWludDMyX3QgZmxhZ3MsCisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UpCiAgICAgOiBtTm90aWZ5KG5vdGlmeSksCiAgICAgICBtRmxhZ3MoZmxhZ3MpLAotICAgICAgbVVJRFZhbGlkKHVpZFZhbGlkKSwKLSAgICAgIG1VSUQodWlkKSwKKyAgICAgIG1IVFRQU2VydmljZShodHRwU2VydmljZSksCiAgICAgICBtSW5QcmVwYXJhdGlvblBoYXNlKHRydWUpLAotICAgICAgbUhUVFBEYXRhU291cmNlKAotICAgICAgICAgICAgICBIVFRQQmFzZTo6Q3JlYXRlKAotICAgICAgICAgICAgICAgICAgKG1GbGFncyAmIGtGbGFnSW5jb2duaXRvKQotICAgICAgICAgICAgICAgICAgICA/IEhUVFBCYXNlOjprRmxhZ0luY29nbml0bwotICAgICAgICAgICAgICAgICAgICA6IDApKSwKLSAgICAgIG1QcmV2QmFuZHdpZHRoSW5kZXgoLTEpLAorICAgICAgbUhUVFBEYXRhU291cmNlKG5ldyBNZWRpYUhUVFAobUhUVFBTZXJ2aWNlLT5tYWtlSFRUUENvbm5lY3Rpb24oKSkpLAorICAgICAgbUN1ckJhbmR3aWR0aEluZGV4KC0xKSwKICAgICAgIG1TdHJlYW1NYXNrKDApLAogICAgICAgbU5ld1N0cmVhbU1hc2soMCksCiAgICAgICBtU3dhcE1hc2soMCksCiAgICAgICBtQ2hlY2tCYW5kd2lkdGhHZW5lcmF0aW9uKDApLAogICAgICAgbVN3aXRjaEdlbmVyYXRpb24oMCksCisgICAgICBtU3VidGl0bGVHZW5lcmF0aW9uKDApLAogICAgICAgbUxhc3REZXF1ZXVlZFRpbWVVcygwbGwpLAogICAgICAgbVJlYWxUaW1lQmFzZVVzKDBsbCksCiAgICAgICBtUmVjb25maWd1cmF0aW9uSW5Qcm9ncmVzcyhmYWxzZSksCiAgICAgICBtU3dpdGNoSW5Qcm9ncmVzcyhmYWxzZSksCiAgICAgICBtRGlzY29ubmVjdFJlcGx5SUQoMCksCi0gICAgICBtU2Vla1JlcGx5SUQoMCkgewotICAgIGlmIChtVUlEVmFsaWQpIHsKLSAgICAgICAgbUhUVFBEYXRhU291cmNlLT5zZXRVSUQobVVJRCk7Ci0gICAgfQorICAgICAgbVNlZWtSZXBseUlEKDApLAorICAgICAgbUZpcnN0VGltZVVzVmFsaWQoZmFsc2UpLAorICAgICAgbUZpcnN0VGltZVVzKDApLAorICAgICAgbUxhc3RTZWVrVGltZVVzKDApIHsKIAogICAgIG1TdHJlYW1zW2tBdWRpb0luZGV4XSA9IFN0cmVhbUl0ZW0oImF1ZGlvIik7CiAgICAgbVN0cmVhbXNba1ZpZGVvSW5kZXhdID0gU3RyZWFtSXRlbSgidmlkZW8iKTsKICAgICBtU3RyZWFtc1trU3VidGl0bGVJbmRleF0gPSBTdHJlYW1JdGVtKCJzdWJ0aXRsZXMiKTsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heFN0cmVhbXM7ICsraSkgeworICAgICAgICBtRGlzY29udGludWl0aWVzLmFkZChpbmRleFRvVHlwZShpKSwgbmV3IEFub3RoZXJQYWNrZXRTb3VyY2UoTlVMTCAvKiBtZXRhICovKSk7CiAgICAgICAgIG1QYWNrZXRTb3VyY2VzLmFkZChpbmRleFRvVHlwZShpKSwgbmV3IEFub3RoZXJQYWNrZXRTb3VyY2UoTlVMTCAvKiBtZXRhICovKSk7CiAgICAgICAgIG1QYWNrZXRTb3VyY2VzMi5hZGQoaW5kZXhUb1R5cGUoaSksIG5ldyBBbm90aGVyUGFja2V0U291cmNlKE5VTEwgLyogbWV0YSAqLykpOworICAgICAgICBtQnVmZmVyaW5nW2ldID0gZmFsc2U7CiAgICAgfQogfQogCkBAIC0xMTIsMzEgKzExNSw5MCBAQAogICAgICAgICByZXR1cm4gLUVXT1VMREJMT0NLOwogICAgIH0KIAorICAgIHN0YXR1c190IGZpbmFsUmVzdWx0OworICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IGRpc2NvbnRpbnVpdHlRdWV1ZSAgPSBtRGlzY29udGludWl0aWVzLnZhbHVlRm9yKHN0cmVhbSk7CisgICAgaWYgKGRpc2NvbnRpbnVpdHlRdWV1ZS0+aGFzQnVmZmVyQXZhaWxhYmxlKCZmaW5hbFJlc3VsdCkpIHsKKyAgICAgICAgZGlzY29udGludWl0eVF1ZXVlLT5kZXF1ZXVlQWNjZXNzVW5pdChhY2Nlc3NVbml0KTsKKyAgICAgICAgLy8gc2Vla2luZywgdHJhY2sgc3dpdGNoaW5nCisgICAgICAgIHNwPEFNZXNzYWdlPiBleHRyYTsKKyAgICAgICAgaW50NjRfdCB0aW1lVXM7CisgICAgICAgIGlmICgoKmFjY2Vzc1VuaXQpLT5tZXRhKCktPmZpbmRNZXNzYWdlKCJleHRyYSIsICZleHRyYSkKKyAgICAgICAgICAgICAgICAmJiBleHRyYSAhPSBOVUxMCisgICAgICAgICAgICAgICAgJiYgZXh0cmEtPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpIHsKKyAgICAgICAgICAgIC8vIHNlZWtpbmcgb25seQorICAgICAgICAgICAgbUxhc3RTZWVrVGltZVVzID0gdGltZVVzOworICAgICAgICAgICAgbURpc2NvbnRpbnVpdHlPZmZzZXRUaW1lc1VzLmNsZWFyKCk7CisgICAgICAgICAgICBtRGlzY29udGludWl0eUFic1N0YXJ0VGltZXNVcy5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBJTkZPX0RJU0NPTlRJTlVJVFk7CisgICAgfQorCiAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gcGFja2V0U291cmNlID0gbVBhY2tldFNvdXJjZXMudmFsdWVGb3Ioc3RyZWFtKTsKIAotICAgIHN0YXR1c190IGZpbmFsUmVzdWx0OworICAgIHNzaXplX3QgaWR4ID0gdHlwZVRvSW5kZXgoc3RyZWFtKTsKICAgICBpZiAoIXBhY2tldFNvdXJjZS0+aGFzQnVmZmVyQXZhaWxhYmxlKCZmaW5hbFJlc3VsdCkpIHsKKyAgICAgICAgaWYgKGZpbmFsUmVzdWx0ID09IE9LKSB7CisgICAgICAgICAgICBtQnVmZmVyaW5nW2lkeF0gPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIC1FQUdBSU47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmluYWxSZXN1bHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobUJ1ZmZlcmluZ1tpZHhdKSB7CisgICAgICAgIGlmIChtU3dpdGNoSW5Qcm9ncmVzcworICAgICAgICAgICAgICAgIHx8IHBhY2tldFNvdXJjZS0+aXNGaW5pc2hlZCgwKQorICAgICAgICAgICAgICAgIHx8IHBhY2tldFNvdXJjZS0+Z2V0RXN0aW1hdGVkRHVyYXRpb25VcygpID4gMTAwMDAwMDBsbCkgeworICAgICAgICAgICAgbUJ1ZmZlcmluZ1tpZHhdID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobUJ1ZmZlcmluZ1tpZHhdKSB7CisgICAgICAgIHJldHVybiAtRUFHQUlOOworICAgIH0KKworICAgIC8vIHdhaXQgZm9yIGNvdW50ZXJwYXJ0CisgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gb3RoZXJTb3VyY2U7CisgICAgdWludDMyX3QgbWFzayA9IG1OZXdTdHJlYW1NYXNrICYgbVN0cmVhbU1hc2s7CisgICAgdWludDMyX3QgZmV0Y2hlcnNNYXNrICA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRmV0Y2hlckluZm9zLnNpemUoKTsgKytpKSB7CisgICAgICAgIHVpbnQzMl90IGZldGNoZXJNYXNrID0gbUZldGNoZXJJbmZvcy52YWx1ZUF0KGkpLm1GZXRjaGVyLT5nZXRTdHJlYW1UeXBlTWFzaygpOworICAgICAgICBmZXRjaGVyc01hc2sgfD0gZmV0Y2hlck1hc2s7CisgICAgfQorICAgIG1hc2sgJj0gZmV0Y2hlcnNNYXNrOworICAgIGlmIChzdHJlYW0gPT0gU1RSRUFNVFlQRV9BVURJTyAmJiAobWFzayAmIFNUUkVBTVRZUEVfVklERU8pKSB7CisgICAgICAgIG90aGVyU291cmNlID0gbVBhY2tldFNvdXJjZXMudmFsdWVGb3IoU1RSRUFNVFlQRV9WSURFTyk7CisgICAgfSBlbHNlIGlmIChzdHJlYW0gPT0gU1RSRUFNVFlQRV9WSURFTyAmJiAobWFzayAmIFNUUkVBTVRZUEVfQVVESU8pKSB7CisgICAgICAgIG90aGVyU291cmNlID0gbVBhY2tldFNvdXJjZXMudmFsdWVGb3IoU1RSRUFNVFlQRV9BVURJTyk7CisgICAgfQorICAgIGlmIChvdGhlclNvdXJjZSAhPSBOVUxMICYmICFvdGhlclNvdXJjZS0+aGFzQnVmZmVyQXZhaWxhYmxlKCZmaW5hbFJlc3VsdCkpIHsKICAgICAgICAgcmV0dXJuIGZpbmFsUmVzdWx0ID09IE9LID8gLUVBR0FJTiA6IGZpbmFsUmVzdWx0OwogICAgIH0KIAogICAgIHN0YXR1c190IGVyciA9IHBhY2tldFNvdXJjZS0+ZGVxdWV1ZUFjY2Vzc1VuaXQoYWNjZXNzVW5pdCk7CiAKKyAgICBzaXplX3Qgc3RyZWFtSWR4OwogICAgIGNvbnN0IGNoYXIgKnN0cmVhbVN0cjsKICAgICBzd2l0Y2ggKHN0cmVhbSkgewogICAgICAgICBjYXNlIFNUUkVBTVRZUEVfQVVESU86CisgICAgICAgICAgICBzdHJlYW1JZHggPSBrQXVkaW9JbmRleDsKICAgICAgICAgICAgIHN0cmVhbVN0ciA9ICJhdWRpbyI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBTVFJFQU1UWVBFX1ZJREVPOgorICAgICAgICAgICAgc3RyZWFtSWR4ID0ga1ZpZGVvSW5kZXg7CiAgICAgICAgICAgICBzdHJlYW1TdHIgPSAidmlkZW8iOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9TVUJUSVRMRVM6CisgICAgICAgICAgICBzdHJlYW1JZHggPSBrU3VidGl0bGVJbmRleDsKICAgICAgICAgICAgIHN0cmVhbVN0ciA9ICJzdWJzIjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgVFJFU1BBU1MoKTsKICAgICB9CiAKKyAgICBTdHJlYW1JdGVtJiBzdHJtID0gbVN0cmVhbXNbc3RyZWFtSWR4XTsKICAgICBpZiAoZXJyID09IElORk9fRElTQ09OVElOVUlUWSkgeworICAgICAgICAvLyBhZGFwdGl2ZSBzdHJlYW1pbmcsIGRpc2NvbnRpbnVpdGllcyBpbiB0aGUgcGxheWxpc3QKICAgICAgICAgaW50MzJfdCB0eXBlOwogICAgICAgICBDSEVDSygoKmFjY2Vzc1VuaXQpLT5tZXRhKCktPmZpbmRJbnQzMigiZGlzY29udGludWl0eSIsICZ0eXBlKSk7CiAKQEAgLTE1MSwxMCArMjEzLDcgQEAKICAgICAgICAgICAgICAgZXh0cmEgPT0gTlVMTCA/ICJOVUxMIiA6IGV4dHJhLT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOwogCiAgICAgICAgIGludDMyX3Qgc3dhcDsKLSAgICAgICAgaWYgKHR5cGUgPT0gQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX0ZPUk1BVENIQU5HRQotICAgICAgICAgICAgICAgICYmICgqYWNjZXNzVW5pdCktPm1ldGEoKS0+ZmluZEludDMyKCJzd2FwUGFja2V0U291cmNlIiwgJnN3YXApCi0gICAgICAgICAgICAgICAgJiYgc3dhcCkgewotCisgICAgICAgIGlmICgoKmFjY2Vzc1VuaXQpLT5tZXRhKCktPmZpbmRJbnQzMigic3dhcFBhY2tldFNvdXJjZSIsICZzd2FwKSAmJiBzd2FwKSB7CiAgICAgICAgICAgICBpbnQzMl90IHN3aXRjaEdlbmVyYXRpb247CiAgICAgICAgICAgICBDSEVDSygoKmFjY2Vzc1VuaXQpLT5tZXRhKCktPmZpbmRJbnQzMigic3dpdGNoR2VuZXJhdGlvbiIsICZzd2l0Y2hHZW5lcmF0aW9uKSk7CiAgICAgICAgICAgICB7CkBAIC0xNjcsMTYgKzIyNiw3NSBAQAogICAgICAgICAgICAgICAgICAgICBtc2ctPnBvc3QoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaXplX3Qgc2VxID0gc3RybS5tQ3VyRGlzY29udGludWl0eVNlcTsKKyAgICAgICAgICAgIGludDY0X3Qgb2Zmc2V0VGltZVVzOworICAgICAgICAgICAgaWYgKG1EaXNjb250aW51aXR5T2Zmc2V0VGltZXNVcy5pbmRleE9mS2V5KHNlcSkgPj0gMCkgeworICAgICAgICAgICAgICAgIG9mZnNldFRpbWVVcyA9IG1EaXNjb250aW51aXR5T2Zmc2V0VGltZXNVcy52YWx1ZUZvcihzZXEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvZmZzZXRUaW1lVXMgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzZXEgKz0gMTsKKyAgICAgICAgICAgIGlmIChtRGlzY29udGludWl0eUFic1N0YXJ0VGltZXNVcy5pbmRleE9mS2V5KHN0cm0ubUN1ckRpc2NvbnRpbnVpdHlTZXEpID49IDApIHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGZpcnN0VGltZVVzOworICAgICAgICAgICAgICAgIGZpcnN0VGltZVVzID0gbURpc2NvbnRpbnVpdHlBYnNTdGFydFRpbWVzVXMudmFsdWVGb3Ioc3RybS5tQ3VyRGlzY29udGludWl0eVNlcSk7CisgICAgICAgICAgICAgICAgb2Zmc2V0VGltZVVzICs9IHN0cm0ubUxhc3REZXF1ZXVlZFRpbWVVcyAtIGZpcnN0VGltZVVzOworICAgICAgICAgICAgICAgIG9mZnNldFRpbWVVcyArPSBzdHJtLm1MYXN0U2FtcGxlRHVyYXRpb25VczsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb2Zmc2V0VGltZVVzICs9IHN0cm0ubUxhc3RTYW1wbGVEdXJhdGlvblVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtRGlzY29udGludWl0eU9mZnNldFRpbWVzVXMuYWRkKHNlcSwgb2Zmc2V0VGltZVVzKTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoZXJyID09IE9LKSB7CisKICAgICAgICAgaWYgKHN0cmVhbSA9PSBTVFJFQU1UWVBFX0FVRElPIHx8IHN0cmVhbSA9PSBTVFJFQU1UWVBFX1ZJREVPKSB7CiAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgICAgIGludDMyX3QgZGlzY29udGludWl0eVNlcSA9IDA7CiAgICAgICAgICAgICBDSEVDSygoKmFjY2Vzc1VuaXQpLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgICZ0aW1lVXMpKTsKLSAgICAgICAgICAgIEFMT0dWKCJbJXNdIHJlYWQgYnVmZmVyIGF0IHRpbWUgJWxsZCB1cyIsIHN0cmVhbVN0ciwgdGltZVVzKTsKKyAgICAgICAgICAgICgqYWNjZXNzVW5pdCktPm1ldGEoKS0+ZmluZEludDMyKCJkaXNjb250aW51aXR5U2VxIiwgJmRpc2NvbnRpbnVpdHlTZXEpOworICAgICAgICAgICAgc3RybS5tQ3VyRGlzY29udGludWl0eVNlcSA9IGRpc2NvbnRpbnVpdHlTZXE7CiAKKyAgICAgICAgICAgIGludDMyX3QgZGlzY2FyZCA9IDA7CisgICAgICAgICAgICBpbnQ2NF90IGZpcnN0VGltZVVzOworICAgICAgICAgICAgaWYgKG1EaXNjb250aW51aXR5QWJzU3RhcnRUaW1lc1VzLmluZGV4T2ZLZXkoc3RybS5tQ3VyRGlzY29udGludWl0eVNlcSkgPj0gMCkgeworICAgICAgICAgICAgICAgIGludDY0X3QgZHVyVXM7IC8vIGFwcHJveGltYXRlIHNhbXBsZSBkdXJhdGlvbgorICAgICAgICAgICAgICAgIGlmICh0aW1lVXMgPiBzdHJtLm1MYXN0RGVxdWV1ZWRUaW1lVXMpIHsKKyAgICAgICAgICAgICAgICAgICAgZHVyVXMgPSB0aW1lVXMgLSBzdHJtLm1MYXN0RGVxdWV1ZWRUaW1lVXM7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZHVyVXMgPSBzdHJtLm1MYXN0RGVxdWV1ZWRUaW1lVXMgLSB0aW1lVXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0cm0ubUxhc3RTYW1wbGVEdXJhdGlvblVzID0gZHVyVXM7CisgICAgICAgICAgICAgICAgZmlyc3RUaW1lVXMgPSBtRGlzY29udGludWl0eUFic1N0YXJ0VGltZXNVcy52YWx1ZUZvcihzdHJtLm1DdXJEaXNjb250aW51aXR5U2VxKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5maW5kSW50MzIoImRpc2NhcmQiLCAmZGlzY2FyZCkgJiYgZGlzY2FyZCkgeworICAgICAgICAgICAgICAgIGZpcnN0VGltZVVzID0gdGltZVVzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtRGlzY29udGludWl0eUFic1N0YXJ0VGltZXNVcy5hZGQoc3RybS5tQ3VyRGlzY29udGludWl0eVNlcSwgdGltZVVzKTsKKyAgICAgICAgICAgICAgICBmaXJzdFRpbWVVcyA9IHRpbWVVczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RybS5tTGFzdERlcXVldWVkVGltZVVzID0gdGltZVVzOworICAgICAgICAgICAgaWYgKHRpbWVVcyA+PSBmaXJzdFRpbWVVcykgeworICAgICAgICAgICAgICAgIHRpbWVVcyAtPSBmaXJzdFRpbWVVczsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGltZVVzID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRpbWVVcyArPSBtTGFzdFNlZWtUaW1lVXM7CisgICAgICAgICAgICBpZiAobURpc2NvbnRpbnVpdHlPZmZzZXRUaW1lc1VzLmluZGV4T2ZLZXkoZGlzY29udGludWl0eVNlcSkgPj0gMCkgeworICAgICAgICAgICAgICAgIHRpbWVVcyArPSBtRGlzY29udGludWl0eU9mZnNldFRpbWVzVXMudmFsdWVGb3IoZGlzY29udGludWl0eVNlcSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIHJlYWQgYnVmZmVyIGF0IHRpbWUgJSIgUFJJZDY0ICIgdXMiLCBzdHJlYW1TdHIsIHRpbWVVcyk7CisgICAgICAgICAgICAoKmFjY2Vzc1VuaXQpLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCAgdGltZVVzKTsKICAgICAgICAgICAgIG1MYXN0RGVxdWV1ZWRUaW1lVXMgPSB0aW1lVXM7CiAgICAgICAgICAgICBtUmVhbFRpbWVCYXNlVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpIC0gdGltZVVzOwogICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbSA9PSBTVFJFQU1UWVBFX1NVQlRJVExFUykgeworICAgICAgICAgICAgaW50MzJfdCBzdWJ0aXRsZUdlbmVyYXRpb247CisgICAgICAgICAgICBpZiAoKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5maW5kSW50MzIoInN1YnRpdGxlR2VuZXJhdGlvbiIsICZzdWJ0aXRsZUdlbmVyYXRpb24pCisgICAgICAgICAgICAgICAgICAgICYmIHN1YnRpdGxlR2VuZXJhdGlvbiAhPSBtU3VidGl0bGVHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICByZXR1cm4gLUVBR0FJTjsKKyAgICAgICAgICAgIH07CiAgICAgICAgICAgICAoKmFjY2Vzc1VuaXQpLT5tZXRhKCktPnNldEludDMyKAogICAgICAgICAgICAgICAgICAgICAidHJhY2tJbmRleCIsIG1QbGF5bGlzdC0+Z2V0U2VsZWN0ZWRJbmRleCgpKTsKICAgICAgICAgICAgICgqYWNjZXNzVW5pdCktPm1ldGEoKS0+c2V0SW50NjQoImJhc2VVcyIsIG1SZWFsVGltZUJhc2VVcyk7CkBAIC0yMzUsMTAgKzM1Myw2IEBACiAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwogICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKIAotICAgIHVpbnQzMl90IHJlcGx5SUQ7Ci0gICAgQ0hFQ0socmVzcG9uc2UgPT0gbVNlZWtSZXBseSAmJiAwICE9IG1TZWVrUmVwbHlJRCk7Ci0gICAgbVNlZWtSZXBseS5jbGVhcigpOwotICAgIG1TZWVrUmVwbHlJRCA9IDA7CiAgICAgcmV0dXJuIGVycjsKIH0KIApAQCAtMjY0LDEyICszNzgsMTYgQEAKIAogICAgICAgICBjYXNlIGtXaGF0U2VlazoKICAgICAgICAgewotICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmbVNlZWtSZXBseUlEKSk7CisgICAgICAgICAgICB1aW50MzJfdCBzZWVrUmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnNlZWtSZXBseUlEKSk7CisgICAgICAgICAgICBtU2Vla1JlcGx5SUQgPSBzZWVrUmVwbHlJRDsKKyAgICAgICAgICAgIG1TZWVrUmVwbHkgPSBuZXcgQU1lc3NhZ2U7CiAKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG9uU2Vlayhtc2cpOwogCi0gICAgICAgICAgICBtU2Vla1JlcGx5ID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgbVNlZWtSZXBseS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgbXNnLT5wb3N0KDUwMDAwKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTI5Miw3ICs0MTAsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnlUb0ZpbmlzaEJhbmR3aWR0aFN3aXRjaCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Td2l0Y2hJblByb2dyZXNzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5VG9GaW5pc2hCYW5kd2lkdGhTd2l0Y2goKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIGlmIChtQ29udGludWF0aW9uICE9IE5VTEwpIHsKQEAgLTMwMiw3ICs0MjIsMTAgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU2Vla1JlcGx5SUQgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtU2Vla1JlcGx5ICE9IE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vla1JlcGx5LT5zZXRJbnQzMigiZXJyIiwgT0spOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vla1JlcGx5LT5wb3N0UmVwbHkobVNlZWtSZXBseUlEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlZWtSZXBseUlEID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlZWtSZXBseS5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMzI5LDYgKzQ1MiwyMyBAQAogCiAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJYWFggUmVjZWl2ZWQgZXJyb3IgJWQgZnJvbSBQbGF5bGlzdEZldGNoZXIuIiwgZXJyKTsKIAorICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGUgRU9TIG9uIHN1YnRpdGxlIHRyYWNrcyBpbmRlcGVuZGVudGx5CisgICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgdXJpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0gJiYgbXNnLT5maW5kU3RyaW5nKCJ1cmkiLCAmdXJpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBpID0gbUZldGNoZXJJbmZvcy5pbmRleE9mS2V5KHVyaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8UGxheWxpc3RGZXRjaGVyPiAmZmV0Y2hlciA9IG1GZXRjaGVySW5mb3MudmFsdWVBdChpKS5tRmV0Y2hlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmV0Y2hlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHR5cGUgPSBmZXRjaGVyLT5nZXRTdHJlYW1UeXBlTWFzaygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBTVFJFQU1UWVBFX1NVQlRJVExFUykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhY2tldFNvdXJjZXMudmFsdWVGb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUUkVBTVRZUEVfU1VCVElUTEVTKS0+c2lnbmFsRU9TKGVycik7OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICBpZiAobUluUHJlcGFyYXRpb25QaGFzZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFByZXBhcmVkKGVycik7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTM1NCw2ICs0OTQsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgQVN0cmluZyB1cmk7CiAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFN0cmluZygidXJpIiwgJnVyaSkpOwogCisgICAgICAgICAgICAgICAgICAgIGlmIChtRmV0Y2hlckluZm9zLmluZGV4T2ZLZXkodXJpKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJjb3VsZG4ndCBmaW5kIHVyaSIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgRmV0Y2hlckluZm8gKmluZm8gPSAmbUZldGNoZXJJbmZvcy5lZGl0VmFsdWVGb3IodXJpKTsKICAgICAgICAgICAgICAgICAgICAgaW5mby0+bUlzUHJlcGFyZWQgPSB0cnVlOwogCkBAIC00MTAsNyArNTU0LDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgb25DaGVja0JhbmR3aWR0aCgpOworICAgICAgICAgICAgb25DaGVja0JhbmR3aWR0aChtc2cpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtNDQzLDYgKzU4NywxOSBAQAogICAgICAgICAgICAgb25Td2FwcGVkKG1zZyk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRDaGVja1N3aXRjaERvd246CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uQ2hlY2tTd2l0Y2hEb3duKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRTd2l0Y2hEb3duOgorICAgICAgICB7CisgICAgICAgICAgICBvblN3aXRjaERvd24oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIFRSRVNQQVNTKCk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTQ2Niw2ICs2MjMsMjEgQEAKICAgICByZXR1cm4gKFN0cmVhbVR5cGUpKDEgPDwgaWR4KTsKIH0KIAorLy8gc3RhdGljCitzc2l6ZV90IExpdmVTZXNzaW9uOjp0eXBlVG9JbmRleChpbnQzMl90IHR5cGUpIHsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX0FVRElPOgorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9WSURFTzoKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBjYXNlIFNUUkVBTVRZUEVfU1VCVElUTEVTOgorICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfTsKKyAgICByZXR1cm4gLTE7Cit9CisKIHZvaWQgTGl2ZVNlc3Npb246Om9uQ29ubmVjdChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIEFTdHJpbmcgdXJsOwogICAgIENIRUNLKG1zZy0+ZmluZFN0cmluZygidXJsIiwgJnVybCkpOwpAQCAtNDgwLDExICs2NTIsOCBAQAogICAgICAgICBoZWFkZXJzID0gTlVMTDsKICAgICB9CiAKLSNpZiAxCi0gICAgQUxPR0koIm9uQ29ubmVjdCA8VVJMIHN1cHByZXNzZWQ+Iik7Ci0jZWxzZQotICAgIEFMT0dJKCJvbkNvbm5lY3QgJXMiLCB1cmwuY19zdHIoKSk7Ci0jZW5kaWYKKyAgICAvLyBUT0RPIGN1cnJlbnRseSB3ZSBkb24ndCBrbm93IGlmIHdlIGFyZSBjb21pbmcgaGVyZSBmcm9tIGluY29nbml0byBtb2RlCisgICAgQUxPR0koIm9uQ29ubmVjdCAlcyIsIHVyaURlYnVnU3RyaW5nKHVybCkuY19zdHIoKSk7CiAKICAgICBtTWFzdGVyVVJMID0gdXJsOwogCkBAIC00OTIsNyArNjYxLDcgQEAKICAgICBtUGxheWxpc3QgPSBmZXRjaFBsYXlsaXN0KHVybC5jX3N0cigpLCBOVUxMIC8qIGN1clBsYXlsaXN0SGFzaCAqLywgJmR1bW15KTsKIAogICAgIGlmIChtUGxheWxpc3QgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgidW5hYmxlIHRvIGZldGNoIG1hc3RlciBwbGF5bGlzdCAnJXMnLiIsIHVybC5jX3N0cigpKTsKKyAgICAgICAgQUxPR0UoInVuYWJsZSB0byBmZXRjaCBtYXN0ZXIgcGxheWxpc3QgJXMuIiwgdXJpRGVidWdTdHJpbmcodXJsKS5jX3N0cigpKTsKIAogICAgICAgICBwb3N0UHJlcGFyZWQoRVJST1JfSU8pOwogICAgICAgICByZXR1cm47CkBAIC01NDQsOCArNzEzLDkgQEAKICAgICAgICAgbUJhbmR3aWR0aEl0ZW1zLnB1c2goaXRlbSk7CiAgICAgfQogCisgICAgbVBsYXlsaXN0LT5waWNrUmFuZG9tTWVkaWFJdGVtcygpOwogICAgIGNoYW5nZUNvbmZpZ3VyYXRpb24oCi0gICAgICAgICAgICAwbGwgLyogdGltZVVzICovLCBpbml0aWFsQmFuZHdpZHRoSW5kZXgsIHRydWUgLyogcGlja1RyYWNrICovKTsKKyAgICAgICAgICAgIDBsbCAvKiB0aW1lVXMgKi8sIGluaXRpYWxCYW5kd2lkdGhJbmRleCwgZmFsc2UgLyogcGlja1RyYWNrICovKTsKIH0KIAogdm9pZCBMaXZlU2Vzc2lvbjo6ZmluaXNoRGlzY29ubmVjdCgpIHsKQEAgLTU1Nyw2ICs3MjcsOSBAQAogICAgIC8vIChmaW5pc2hEaXNjb25uZWN0LCBvbkZpbmlzaERpc2Nvbm5lY3QyKQogICAgIGNhbmNlbEJhbmR3aWR0aFN3aXRjaCgpOwogCisgICAgLy8gY2FuY2VsIHN3aXRjaCBkb3duIG1vbml0b3IKKyAgICBtU3dpdGNoRG93bk1vbml0b3IuY2xlYXIoKTsKKwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZldGNoZXJJbmZvcy5zaXplKCk7ICsraSkgewogICAgICAgICBtRmV0Y2hlckluZm9zLnZhbHVlQXQoaSkubUZldGNoZXItPnN0b3BBc3luYygpOwogICAgIH0KQEAgLTU5OSw3ICs3NzIsNyBAQAogICAgIG5vdGlmeS0+c2V0SW50MzIoInN3aXRjaEdlbmVyYXRpb24iLCBtU3dpdGNoR2VuZXJhdGlvbik7CiAKICAgICBGZXRjaGVySW5mbyBpbmZvOwotICAgIGluZm8ubUZldGNoZXIgPSBuZXcgUGxheWxpc3RGZXRjaGVyKG5vdGlmeSwgdGhpcywgdXJpKTsKKyAgICBpbmZvLm1GZXRjaGVyID0gbmV3IFBsYXlsaXN0RmV0Y2hlcihub3RpZnksIHRoaXMsIHVyaSwgbVN1YnRpdGxlR2VuZXJhdGlvbik7CiAgICAgaW5mby5tRHVyYXRpb25VcyA9IC0xbGw7CiAgICAgaW5mby5tSXNQcmVwYXJlZCA9IGZhbHNlOwogICAgIGluZm8ubVRvQmVSZW1vdmVkID0gZmFsc2U7CkBAIC02NzksNyArODUyLDcgQEAKIAogICAgIHNzaXplX3QgYnl0ZXNSZWFkID0gMDsKICAgICAvLyBhZGp1c3QgcmFuZ2VfbGVuZ3RoIGlmIG9ubHkgcmVhZGluZyBwYXJ0aWFsIGJsb2NrCi0gICAgaWYgKGJsb2NrX3NpemUgPiAwICYmIChyYW5nZV9sZW5ndGggPT0gLTEgfHwgYnVmZmVyLT5zaXplKCkgKyBibG9ja19zaXplIDwgcmFuZ2VfbGVuZ3RoKSkgeworICAgIGlmIChibG9ja19zaXplID4gMCAmJiAocmFuZ2VfbGVuZ3RoID09IC0xIHx8IChpbnQ2NF90KShidWZmZXItPnNpemUoKSArIGJsb2NrX3NpemUpIDwgcmFuZ2VfbGVuZ3RoKSkgewogICAgICAgICByYW5nZV9sZW5ndGggPSBidWZmZXItPnNpemUoKSArIGJsb2NrX3NpemU7CiAgICAgfQogICAgIGZvciAoOzspIHsKQEAgLTY4OCw3ICs4NjEsNyBAQAogICAgICAgICBpZiAoYnVmZmVyUmVtYWluaW5nID09IDAgJiYgZ2V0U2l6ZUVyciAhPSBPSykgewogICAgICAgICAgICAgYnVmZmVyUmVtYWluaW5nID0gMzI3Njg7CiAKLSAgICAgICAgICAgIEFMT0dWKCJpbmNyZWFzaW5nIGRvd25sb2FkIGJ1ZmZlciB0byAlZCBieXRlcyIsCisgICAgICAgICAgICBBTE9HVigiaW5jcmVhc2luZyBkb3dubG9hZCBidWZmZXIgdG8gJXp1IGJ5dGVzIiwKICAgICAgICAgICAgICAgICAgYnVmZmVyLT5zaXplKCkgKyBidWZmZXJSZW1haW5pbmcpOwogCiAgICAgICAgICAgICBzcDxBQnVmZmVyPiBjb3B5ID0gbmV3IEFCdWZmZXIoYnVmZmVyLT5zaXplKCkgKyBidWZmZXJSZW1haW5pbmcpOwpAQCAtNzAxLDcgKzg3NCw3IEBACiAgICAgICAgIHNpemVfdCBtYXhCeXRlc1RvUmVhZCA9IGJ1ZmZlclJlbWFpbmluZzsKICAgICAgICAgaWYgKHJhbmdlX2xlbmd0aCA+PSAwKSB7CiAgICAgICAgICAgICBpbnQ2NF90IGJ5dGVzTGVmdEluUmFuZ2UgPSByYW5nZV9sZW5ndGggLSBidWZmZXItPnNpemUoKTsKLSAgICAgICAgICAgIGlmIChieXRlc0xlZnRJblJhbmdlIDwgbWF4Qnl0ZXNUb1JlYWQpIHsKKyAgICAgICAgICAgIGlmIChieXRlc0xlZnRJblJhbmdlIDwgKGludDY0X3QpbWF4Qnl0ZXNUb1JlYWQpIHsKICAgICAgICAgICAgICAgICBtYXhCeXRlc1RvUmVhZCA9IGJ5dGVzTGVmdEluUmFuZ2U7CiAKICAgICAgICAgICAgICAgICBpZiAoYnl0ZXNMZWZ0SW5SYW5nZSA9PSAwKSB7CkBAIC03NjksOSArOTQyLDYgQEAKICAgICAgICAgLy8gcGxheWxpc3QgdW5jaGFuZ2VkCiAgICAgICAgICp1bmNoYW5nZWQgPSB0cnVlOwogCi0gICAgICAgIEFMT0dWKCJQbGF5bGlzdCB1bmNoYW5nZWQsIHJlZnJlc2ggc3RhdGUgaXMgbm93ICVkIiwKLSAgICAgICAgICAgICAoaW50KW1SZWZyZXNoU3RhdGUpOwotCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIApAQCAtODM2LDE0ICsxMDA2LDIyIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvLyBDb25zaWRlciBvbmx5IDgwJSBvZiB0aGUgYXZhaWxhYmxlIGJhbmR3aWR0aCB1c2FibGUuCi0gICAgICAgIGJhbmR3aWR0aEJwcyA9IChiYW5kd2lkdGhCcHMgKiA4KSAvIDEwOwotCiAgICAgICAgIC8vIFBpY2sgdGhlIGhpZ2hlc3QgYmFuZHdpZHRoIHN0cmVhbSBiZWxvdyBvciBlcXVhbCB0byBlc3RpbWF0ZWQgYmFuZHdpZHRoLgogCiAgICAgICAgIGluZGV4ID0gbUJhbmR3aWR0aEl0ZW1zLnNpemUoKSAtIDE7Ci0gICAgICAgIHdoaWxlIChpbmRleCA+IDAgJiYgbUJhbmR3aWR0aEl0ZW1zLml0ZW1BdChpbmRleCkubUJhbmR3aWR0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+IChzaXplX3QpYmFuZHdpZHRoQnBzKSB7CisgICAgICAgIHdoaWxlIChpbmRleCA+IDApIHsKKyAgICAgICAgICAgIC8vIGNvbnNpZGVyIG9ubHkgODAlIG9mIHRoZSBhdmFpbGFibGUgYmFuZHdpZHRoLCBidXQgaWYgd2UgYXJlIHN3aXRjaGluZyB1cCwKKyAgICAgICAgICAgIC8vIGJlIGV2ZW4gbW9yZSBjb25zZXJ2YXRpdmUgKDcwJSkgdG8gYXZvaWQgb3ZlcmVzdGltYXRpbmcgYW5kIGltbWVkaWF0ZWx5CisgICAgICAgICAgICAvLyBzd2l0Y2hpbmcgYmFjay4KKyAgICAgICAgICAgIHNpemVfdCBhZGp1c3RlZEJhbmR3aWR0aEJwcyA9IGJhbmR3aWR0aEJwczsKKyAgICAgICAgICAgIGlmIChpbmRleCA+IG1DdXJCYW5kd2lkdGhJbmRleCkgeworICAgICAgICAgICAgICAgIGFkanVzdGVkQmFuZHdpZHRoQnBzID0gYWRqdXN0ZWRCYW5kd2lkdGhCcHMgKiA3IC8gMTA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFkanVzdGVkQmFuZHdpZHRoQnBzID0gYWRqdXN0ZWRCYW5kd2lkdGhCcHMgKiA4IC8gMTA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUJhbmR3aWR0aEl0ZW1zLml0ZW1BdChpbmRleCkubUJhbmR3aWR0aCA8PSBhZGp1c3RlZEJhbmR3aWR0aEJwcykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogICAgICAgICAgICAgLS1pbmRleDsKICAgICAgICAgfQogICAgIH0KQEAgLTg1NiwyMCArMTAzNCwyMCBAQAogICAgIC8vIHRvIGxvd2VzdCkKICAgICBjb25zdCBzaXplX3Qga01pbkluZGV4ID0gMDsKIAotICAgIHN0YXRpYyBzc2l6ZV90IG1QcmV2QmFuZHdpZHRoSW5kZXggPSAtMTsKKyAgICBzdGF0aWMgc3NpemVfdCBtQ3VyQmFuZHdpZHRoSW5kZXggPSAtMTsKIAogICAgIHNpemVfdCBpbmRleDsKLSAgICBpZiAobVByZXZCYW5kd2lkdGhJbmRleCA8IDApIHsKKyAgICBpZiAobUN1ckJhbmR3aWR0aEluZGV4IDwgMCkgewogICAgICAgICBpbmRleCA9IGtNaW5JbmRleDsKICAgICB9IGVsc2UgaWYgKHVuaWZvcm1SYW5kKCkgPCAwLjUpIHsKLSAgICAgICAgaW5kZXggPSAoc2l6ZV90KW1QcmV2QmFuZHdpZHRoSW5kZXg7CisgICAgICAgIGluZGV4ID0gKHNpemVfdCltQ3VyQmFuZHdpZHRoSW5kZXg7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZXggPSBtUHJldkJhbmR3aWR0aEluZGV4ICsgMTsKKyAgICAgICAgaW5kZXggPSBtQ3VyQmFuZHdpZHRoSW5kZXggKyAxOwogICAgICAgICBpZiAoaW5kZXggPT0gbUJhbmR3aWR0aEl0ZW1zLnNpemUoKSkgewogICAgICAgICAgICAgaW5kZXggPSBrTWluSW5kZXg7CiAgICAgICAgIH0KICAgICB9Ci0gICAgbVByZXZCYW5kd2lkdGhJbmRleCA9IGluZGV4OworICAgIG1DdXJCYW5kd2lkdGhJbmRleCA9IGluZGV4OwogI2VsaWYgMAogICAgIC8vIFBpY2sgdGhlIGhpZ2hlc3QgYmFuZHdpZHRoIHN0cmVhbSBiZWxvdyBvciBlcXVhbCB0byAxLjIgTWJpdC9zZWMKIApAQCAtOTAwLDE1ICsxMDc4LDM0IEBACiAgICAgcmV0dXJuIGluZGV4OwogfQogCitpbnQ2NF90IExpdmVTZXNzaW9uOjpsYXRlc3RNZWRpYVNlZ21lbnRTdGFydFRpbWVVcygpIHsKKyAgICBzcDxBTWVzc2FnZT4gYXVkaW9NZXRhID0gbVBhY2tldFNvdXJjZXMudmFsdWVGb3IoU1RSRUFNVFlQRV9BVURJTyktPmdldExhdGVzdERlcXVldWVkTWV0YSgpOworICAgIGludDY0X3QgbWluU2VnbWVudFN0YXJ0VGltZVVzID0gLTEsIHZpZGVvU2VnbWVudFN0YXJ0VGltZVVzID0gLTE7CisgICAgaWYgKGF1ZGlvTWV0YSAhPSBOVUxMKSB7CisgICAgICAgIGF1ZGlvTWV0YS0+ZmluZEludDY0KCJzZWdtZW50U3RhcnRUaW1lVXMiLCAmbWluU2VnbWVudFN0YXJ0VGltZVVzKTsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gdmlkZW9NZXRhID0gbVBhY2tldFNvdXJjZXMudmFsdWVGb3IoU1RSRUFNVFlQRV9WSURFTyktPmdldExhdGVzdERlcXVldWVkTWV0YSgpOworICAgIGlmICh2aWRlb01ldGEgIT0gTlVMTAorICAgICAgICAgICAgJiYgdmlkZW9NZXRhLT5maW5kSW50NjQoInNlZ21lbnRTdGFydFRpbWVVcyIsICZ2aWRlb1NlZ21lbnRTdGFydFRpbWVVcykpIHsKKyAgICAgICAgaWYgKG1pblNlZ21lbnRTdGFydFRpbWVVcyA8IDAgfHwgdmlkZW9TZWdtZW50U3RhcnRUaW1lVXMgPCBtaW5TZWdtZW50U3RhcnRUaW1lVXMpIHsKKyAgICAgICAgICAgIG1pblNlZ21lbnRTdGFydFRpbWVVcyA9IHZpZGVvU2VnbWVudFN0YXJ0VGltZVVzOworICAgICAgICB9CisKKyAgICB9CisgICAgcmV0dXJuIG1pblNlZ21lbnRTdGFydFRpbWVVczsKK30KKwogc3RhdHVzX3QgTGl2ZVNlc3Npb246Om9uU2Vlayhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIGludDY0X3QgdGltZVVzOwogICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CiAKICAgICBpZiAoIW1SZWNvbmZpZ3VyYXRpb25JblByb2dyZXNzKSB7Ci0gICAgICAgIGNoYW5nZUNvbmZpZ3VyYXRpb24odGltZVVzLCBnZXRCYW5kd2lkdGhJbmRleCgpKTsKKyAgICAgICAgY2hhbmdlQ29uZmlndXJhdGlvbih0aW1lVXMsIG1DdXJCYW5kd2lkdGhJbmRleCk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gLUVXT1VMREJMT0NLOwogICAgIH0KLQotICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgTGl2ZVNlc3Npb246OmdldER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMpIGNvbnN0IHsKQEAgLTkzNSwxNCArMTEzMiwzNCBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAotc3RhdHVzX3QgTGl2ZVNlc3Npb246OmdldFRyYWNrSW5mbyhQYXJjZWwgKnJlcGx5KSBjb25zdCB7Ci0gICAgcmV0dXJuIG1QbGF5bGlzdC0+Z2V0VHJhY2tJbmZvKHJlcGx5KTsKK3NpemVfdCBMaXZlU2Vzc2lvbjo6Z2V0VHJhY2tDb3VudCgpIGNvbnN0IHsKKyAgICBpZiAobVBsYXlsaXN0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG1QbGF5bGlzdC0+Z2V0VHJhY2tDb3VudCgpOworICAgIH0KK30KKworc3A8QU1lc3NhZ2U+IExpdmVTZXNzaW9uOjpnZXRUcmFja0luZm8oc2l6ZV90IHRyYWNrSW5kZXgpIGNvbnN0IHsKKyAgICBpZiAobVBsYXlsaXN0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG1QbGF5bGlzdC0+Z2V0VHJhY2tJbmZvKHRyYWNrSW5kZXgpOworICAgIH0KIH0KIAogc3RhdHVzX3QgTGl2ZVNlc3Npb246OnNlbGVjdFRyYWNrKHNpemVfdCBpbmRleCwgYm9vbCBzZWxlY3QpIHsKKyAgICBpZiAobVBsYXlsaXN0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgICsrbVN1YnRpdGxlR2VuZXJhdGlvbjsKICAgICBzdGF0dXNfdCBlcnIgPSBtUGxheWxpc3QtPnNlbGVjdFRyYWNrKGluZGV4LCBzZWxlY3QpOwogICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdENoYW5nZUNvbmZpZ3VyYXRpb24sIGlkKCkpKS0+cG9zdCgpOworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2hhbmdlQ29uZmlndXJhdGlvbiwgaWQoKSk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoImJhbmR3aWR0aEluZGV4IiwgbUN1ckJhbmR3aWR0aEluZGV4KTsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigicGlja1RyYWNrIiwgc2VsZWN0KTsKKyAgICAgICAgbXNnLT5wb3N0KCk7CiAgICAgfQogICAgIHJldHVybiBlcnI7CiB9CkBAIC05NjksMTUgKzExODYsMTEgQEAKICAgICBDSEVDSyghbVJlY29uZmlndXJhdGlvbkluUHJvZ3Jlc3MpOwogICAgIG1SZWNvbmZpZ3VyYXRpb25JblByb2dyZXNzID0gdHJ1ZTsKIAotICAgIG1QcmV2QmFuZHdpZHRoSW5kZXggPSBiYW5kd2lkdGhJbmRleDsKKyAgICBtQ3VyQmFuZHdpZHRoSW5kZXggPSBiYW5kd2lkdGhJbmRleDsKIAotICAgIEFMT0dWKCJjaGFuZ2VDb25maWd1cmF0aW9uID0+IHRpbWVVczolbGxkIHVzLCBid0luZGV4OiVkLCBwaWNrVHJhY2s6JWQiLAorICAgIEFMT0dWKCJjaGFuZ2VDb25maWd1cmF0aW9uID0+IHRpbWVVczolIiBQUklkNjQgIiB1cywgYndJbmRleDolenUsIHBpY2tUcmFjazolZCIsCiAgICAgICAgICAgdGltZVVzLCBiYW5kd2lkdGhJbmRleCwgcGlja1RyYWNrKTsKIAotICAgIGlmIChwaWNrVHJhY2spIHsKLSAgICAgICAgbVBsYXlsaXN0LT5waWNrUmFuZG9tTWVkaWFJdGVtcygpOwotICAgIH0KLQogICAgIENIRUNLX0xUKGJhbmR3aWR0aEluZGV4LCBtQmFuZHdpZHRoSXRlbXMuc2l6ZSgpKTsKICAgICBjb25zdCBCYW5kd2lkdGhJdGVtICZpdGVtID0gbUJhbmR3aWR0aEl0ZW1zLml0ZW1BdChiYW5kd2lkdGhJbmRleCk7CiAKQEAgLTEwMDAsMTQgKzEyMTMsMTUgQEAKIAogICAgICAgICAvLyBJZiB3ZSdyZSBzZWVraW5nIGFsbCBjdXJyZW50IGZldGNoZXJzIGFyZSBkaXNjYXJkZWQuCiAgICAgICAgIGlmICh0aW1lVXMgPCAwbGwpIHsKLSAgICAgICAgICAgIC8vIGRlbGF5IGZldGNoZXIgcmVtb3ZhbAotICAgICAgICAgICAgZGlzY2FyZEZldGNoZXIgPSBmYWxzZTsKKyAgICAgICAgICAgIC8vIGRlbGF5IGZldGNoZXIgcmVtb3ZhbCBpZiBub3QgcGlja2luZyB0cmFja3MKKyAgICAgICAgICAgIGRpc2NhcmRGZXRjaGVyID0gcGlja1RyYWNrOwogCiAgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGtNYXhTdHJlYW1zOyArK2opIHsKICAgICAgICAgICAgICAgICBTdHJlYW1UeXBlIHR5cGUgPSBpbmRleFRvVHlwZShqKTsKICAgICAgICAgICAgICAgICBpZiAoKHN0cmVhbU1hc2sgJiB0eXBlKSAmJiB1cmkgPT0gVVJJc1tqXSkgewogICAgICAgICAgICAgICAgICAgICByZXN1bWVNYXNrIHw9IHR5cGU7CiAgICAgICAgICAgICAgICAgICAgIHN0cmVhbU1hc2sgJj0gfnR5cGU7CisgICAgICAgICAgICAgICAgICAgIGRpc2NhcmRGZXRjaGVyID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xMDIxLDE2ICsxMjM1LDE3IEBACiAKICAgICBzcDxBTWVzc2FnZT4gbXNnOwogICAgIGlmICh0aW1lVXMgPCAwbGwpIHsKLSAgICAgICAgLy8gc2tpcCBvbkNoYW5nZUNvbmZpZ3VyYXRpb24yIChkZWNvZGVyIGRlc3RydWN0aW9uKSBpZiBzd2l0Y2hpbmcuCisgICAgICAgIC8vIHNraXAgb25DaGFuZ2VDb25maWd1cmF0aW9uMiAoZGVjb2RlciBkZXN0cnVjdGlvbikgaWYgbm90IHNlZWtpbmcuCiAgICAgICAgIG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENoYW5nZUNvbmZpZ3VyYXRpb24zLCBpZCgpKTsKICAgICB9IGVsc2UgewogICAgICAgICBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDaGFuZ2VDb25maWd1cmF0aW9uMiwgaWQoKSk7CiAgICAgfQogICAgIG1zZy0+c2V0SW50MzIoInN0cmVhbU1hc2siLCBzdHJlYW1NYXNrKTsKICAgICBtc2ctPnNldEludDMyKCJyZXN1bWVNYXNrIiwgcmVzdW1lTWFzayk7CisgICAgbXNnLT5zZXRJbnQzMigicGlja1RyYWNrIiwgcGlja1RyYWNrKTsKICAgICBtc2ctPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heFN0cmVhbXM7ICsraSkgewotICAgICAgICBpZiAoc3RyZWFtTWFzayAmIGluZGV4VG9UeXBlKGkpKSB7CisgICAgICAgIGlmICgoc3RyZWFtTWFzayB8IHJlc3VtZU1hc2spICYgaW5kZXhUb1R5cGUoaSkpIHsKICAgICAgICAgICAgIG1zZy0+c2V0U3RyaW5nKG1TdHJlYW1zW2ldLnVyaUtleSgpLmNfc3RyKCksIFVSSXNbaV0uY19zdHIoKSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMDQ3LDE0ICsxMjYyLDIwIEBACiAKICAgICAgICAgaWYgKG1TZWVrUmVwbHlJRCAhPSAwKSB7CiAgICAgICAgICAgICBDSEVDSyhtU2Vla1JlcGx5ICE9IE5VTEwpOworICAgICAgICAgICAgbVNlZWtSZXBseS0+c2V0SW50MzIoImVyciIsIE9LKTsKICAgICAgICAgICAgIG1TZWVrUmVwbHktPnBvc3RSZXBseShtU2Vla1JlcGx5SUQpOworICAgICAgICAgICAgbVNlZWtSZXBseUlEID0gMDsKKyAgICAgICAgICAgIG1TZWVrUmVwbHkuY2xlYXIoKTsKICAgICAgICAgfQogICAgIH0KIH0KIAogdm9pZCBMaXZlU2Vzc2lvbjo6b25DaGFuZ2VDb25maWd1cmF0aW9uKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgaWYgKCFtUmVjb25maWd1cmF0aW9uSW5Qcm9ncmVzcykgewotICAgICAgICBjaGFuZ2VDb25maWd1cmF0aW9uKC0xbGwgLyogdGltZVVzICovLCBnZXRCYW5kd2lkdGhJbmRleCgpKTsKKyAgICAgICAgaW50MzJfdCBwaWNrVHJhY2sgPSAwLCBiYW5kd2lkdGhJbmRleCA9IG1DdXJCYW5kd2lkdGhJbmRleDsKKyAgICAgICAgbXNnLT5maW5kSW50MzIoInBpY2tUcmFjayIsICZwaWNrVHJhY2spOworICAgICAgICBtc2ctPmZpbmRJbnQzMigiYmFuZHdpZHRoSW5kZXgiLCAmYmFuZHdpZHRoSW5kZXgpOworICAgICAgICBjaGFuZ2VDb25maWd1cmF0aW9uKC0xbGwgLyogdGltZVVzICovLCBiYW5kd2lkdGhJbmRleCwgcGlja1RyYWNrKTsKICAgICB9IGVsc2UgewogICAgICAgICBtc2ctPnBvc3QoMTAwMDAwMGxsKTsgLy8gcmV0cnkgaW4gMSBzZWMKICAgICB9CkBAIC0xMDY1LDggKzEyODYsMTQgQEAKIAogICAgIC8vIEFsbCBmZXRjaGVycyBhcmUgZWl0aGVyIHN1c3BlbmRlZCBvciBoYXZlIGJlZW4gcmVtb3ZlZCBub3cuCiAKLSAgICB1aW50MzJfdCBzdHJlYW1NYXNrOworICAgIHVpbnQzMl90IHN0cmVhbU1hc2ssIHJlc3VtZU1hc2s7CiAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInN0cmVhbU1hc2siLCAoaW50MzJfdCAqKSZzdHJlYW1NYXNrKSk7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJlc3VtZU1hc2siLCAoaW50MzJfdCAqKSZyZXN1bWVNYXNrKSk7CisKKyAgICAvLyBjdXJyZW50bHkgb25DaGFuZ2VDb25maWd1cmF0aW9uMiBpcyBvbmx5IGNhbGxlZCBmb3Igc2Vla2luZzsKKyAgICAvLyByZW1vdmUgdGhlIGZvbGxvd2luZyBDSEVDSyBpZiB1c2luZyBpdCBlbHNlIHdoZXJlLgorICAgIENIRUNLX0VRKHJlc3VtZU1hc2ssIDApOworICAgIHN0cmVhbU1hc2sgfD0gcmVzdW1lTWFzazsKIAogICAgIEFTdHJpbmcgVVJJc1trTWF4U3RyZWFtc107CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWF4U3RyZWFtczsgKytpKSB7CkBAIC0xMTIzLDIzICsxMzUwLDM1IEBACiAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInN0cmVhbU1hc2siLCAoaW50MzJfdCAqKSZzdHJlYW1NYXNrKSk7CiAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJlc3VtZU1hc2siLCAoaW50MzJfdCAqKSZyZXN1bWVNYXNrKSk7CiAKKyAgICBpbnQ2NF90IHRpbWVVczsKKyAgICBpbnQzMl90IHBpY2tUcmFjazsKKyAgICBib29sIHN3aXRjaGluZyA9IGZhbHNlOworICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInBpY2tUcmFjayIsICZwaWNrVHJhY2spKTsKKworICAgIGlmICh0aW1lVXMgPCAwbGwpIHsKKyAgICAgICAgaWYgKCFwaWNrVHJhY2spIHsKKyAgICAgICAgICAgIHN3aXRjaGluZyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgbVJlYWxUaW1lQmFzZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKSAtIG1MYXN0RGVxdWV1ZWRUaW1lVXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVJlYWxUaW1lQmFzZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKSAtIHRpbWVVczsKKyAgICB9CisKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhTdHJlYW1zOyArK2kpIHsKICAgICAgICAgaWYgKHN0cmVhbU1hc2sgJiBpbmRleFRvVHlwZShpKSkgewotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU3RyaW5nKG1TdHJlYW1zW2ldLnVyaUtleSgpLmNfc3RyKCksICZtU3RyZWFtc1tpXS5tVXJpKSk7CisgICAgICAgICAgICBpZiAoc3dpdGNoaW5nKSB7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU3RyaW5nKG1TdHJlYW1zW2ldLnVyaUtleSgpLmNfc3RyKCksICZtU3RyZWFtc1tpXS5tTmV3VXJpKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFN0cmluZyhtU3RyZWFtc1tpXS51cmlLZXkoKS5jX3N0cigpLCAmbVN0cmVhbXNbaV0ubVVyaSkpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCi0gICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgYm9vbCBzd2l0Y2hpbmcgPSBmYWxzZTsKLSAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwotCi0gICAgaWYgKHRpbWVVcyA8IDBsbCkgewotICAgICAgICB0aW1lVXMgPSBtTGFzdERlcXVldWVkVGltZVVzOwotICAgICAgICBzd2l0Y2hpbmcgPSB0cnVlOworICAgIG1OZXdTdHJlYW1NYXNrID0gc3RyZWFtTWFzayB8IHJlc3VtZU1hc2s7CisgICAgaWYgKHN3aXRjaGluZykgeworICAgICAgICBtU3dhcE1hc2sgPSBtU3RyZWFtTWFzayAmIH5yZXN1bWVNYXNrOwogICAgIH0KLSAgICBtUmVhbFRpbWVCYXNlVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpIC0gdGltZVVzOwotCi0gICAgbU5ld1N0cmVhbU1hc2sgPSBzdHJlYW1NYXNrOwogCiAgICAgLy8gT2YgYWxsIGV4aXN0aW5nIGZldGNoZXJzOgogICAgIC8vICogUmVzdW1lIGZldGNoZXJzIHRoYXQgYXJlIHN0aWxsIG5lZWRlZCBhbmQgYXNzaWduIHRoZW0gb3JpZ2luYWwgcGFja2V0IHNvdXJjZXMuCkBAIC0xMTUyLDYgKzEzOTEsMTYgQEAKICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBrTWF4U3RyZWFtczsgKytqKSB7CiAgICAgICAgICAgICBpZiAoKHJlc3VtZU1hc2sgJiBpbmRleFRvVHlwZShqKSkgJiYgdXJpID09IG1TdHJlYW1zW2pdLm1VcmkpIHsKICAgICAgICAgICAgICAgICBzb3VyY2VzW2pdID0gbVBhY2tldFNvdXJjZXMudmFsdWVGb3IoaW5kZXhUb1R5cGUoaikpOworCisgICAgICAgICAgICAgICAgaWYgKGogIT0ga1N1YnRpdGxlSW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoInF1ZXVlaW5nIGR1bW15IGRpc2NvbnRpbnVpdHkgZm9yIHN0cmVhbSB0eXBlICVkIiwgaW5kZXhUb1R5cGUoaikpOworICAgICAgICAgICAgICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBkaXNjb250aW51aXR5UXVldWU7CisgICAgICAgICAgICAgICAgICAgIGRpc2NvbnRpbnVpdHlRdWV1ZSA9IG1EaXNjb250aW51aXRpZXMudmFsdWVGb3IoaW5kZXhUb1R5cGUoaikpOworICAgICAgICAgICAgICAgICAgICBkaXNjb250aW51aXR5UXVldWUtPnF1ZXVlRGlzY29udGludWl0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xMTc5LDQzICsxNDI4LDg2IEBACiAgICAgICAgIH0KIAogICAgICAgICBBU3RyaW5nIHVyaTsKLSAgICAgICAgdXJpID0gbVN0cmVhbXNbaV0ubVVyaTsKKyAgICAgICAgdXJpID0gc3dpdGNoaW5nID8gbVN0cmVhbXNbaV0ubU5ld1VyaSA6IG1TdHJlYW1zW2ldLm1Vcmk7CiAKICAgICAgICAgc3A8UGxheWxpc3RGZXRjaGVyPiBmZXRjaGVyID0gYWRkRmV0Y2hlcih1cmkuY19zdHIoKSk7CiAgICAgICAgIENIRUNLKGZldGNoZXIgIT0gTlVMTCk7CiAKICAgICAgICAgaW50MzJfdCBsYXRlc3RTZXEgPSAtMTsKLSAgICAgICAgaW50NjRfdCBsYXRlc3RUaW1lVXMgPSAwbGw7CisgICAgICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSAtMTsKKyAgICAgICAgaW50NjRfdCBzZWdtZW50U3RhcnRUaW1lVXMgPSAtMWxsOworICAgICAgICBpbnQzMl90IGRpc2NvbnRpbnVpdHlTZXEgPSAtMTsKICAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gc291cmNlc1trTWF4U3RyZWFtc107CiAKKyAgICAgICAgaWYgKGkgPT0ga1N1YnRpdGxlSW5kZXgpIHsKKyAgICAgICAgICAgIHNlZ21lbnRTdGFydFRpbWVVcyA9IGxhdGVzdE1lZGlhU2VnbWVudFN0YXJ0VGltZVVzKCk7CisgICAgICAgIH0KKwogICAgICAgICAvLyBUUklDS1k6IGxvb3BpbmcgZnJvbSBpIGFzIGVhcmxpZXIgc3RyZWFtcyBhcmUgYWxyZWFkeSByZW1vdmVkIGZyb20gc3RyZWFtTWFzawogICAgICAgICBmb3IgKHNpemVfdCBqID0gaTsgaiA8IGtNYXhTdHJlYW1zOyArK2opIHsKLSAgICAgICAgICAgIGlmICgoc3RyZWFtTWFzayAmIGluZGV4VG9UeXBlKGopKSAmJiB1cmkgPT0gbVN0cmVhbXNbal0ubVVyaSkgeworICAgICAgICAgICAgY29uc3QgQVN0cmluZyAmc3RyZWFtVXJpID0gc3dpdGNoaW5nID8gbVN0cmVhbXNbal0ubU5ld1VyaSA6IG1TdHJlYW1zW2pdLm1Vcmk7CisgICAgICAgICAgICBpZiAoKHN0cmVhbU1hc2sgJiBpbmRleFRvVHlwZShqKSkgJiYgdXJpID09IHN0cmVhbVVyaSkgewogICAgICAgICAgICAgICAgIHNvdXJjZXNbal0gPSBtUGFja2V0U291cmNlcy52YWx1ZUZvcihpbmRleFRvVHlwZShqKSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoIXN3aXRjaGluZykgeworICAgICAgICAgICAgICAgIGlmICh0aW1lVXMgPj0gMCkgewogICAgICAgICAgICAgICAgICAgICBzb3VyY2VzW2pdLT5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWVVcyA9IHRpbWVVczsKKworICAgICAgICAgICAgICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBkaXNjb250aW51aXR5UXVldWU7CisgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBleHRyYSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgICAgICAgICAgZXh0cmEtPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworICAgICAgICAgICAgICAgICAgICBkaXNjb250aW51aXR5UXVldWUgPSBtRGlzY29udGludWl0aWVzLnZhbHVlRm9yKGluZGV4VG9UeXBlKGopKTsKKyAgICAgICAgICAgICAgICAgICAgZGlzY29udGludWl0eVF1ZXVlLT5xdWV1ZURpc2NvbnRpbnVpdHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX1NFRUssIGV4dHJhLCB0cnVlKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHR5cGUsIHNlcTsKLSAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBzcmNUaW1lVXM7Ci0gICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtZXRhID0gc291cmNlc1tqXS0+Z2V0TGF0ZXN0TWV0YSgpOworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHR5cGU7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgc3JjU2VnbWVudFN0YXJ0VGltZVVzOworICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbWV0YTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBpY2tUcmFjaykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VsZWN0aW5nCisgICAgICAgICAgICAgICAgICAgICAgICBtZXRhID0gc291cmNlc1tqXS0+Z2V0TGF0ZXN0RGVxdWV1ZWRNZXRhKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGFwdGluZworICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSA9IHNvdXJjZXNbal0tPmdldExhdGVzdEVucXVldWVkTWV0YSgpOworICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGEgIT0gTlVMTCAmJiAhbWV0YS0+ZmluZEludDMyKCJkaXNjb250aW51aXR5IiwgJnR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoInNlcSIsICZzZXEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXEgPiBsYXRlc3RTZXEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlc3RTZXEgPSBzZXE7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRtcFVzOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdG1wVXMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydFRpbWVVcyA8IDAgfHwgdG1wVXMgPCBzdGFydFRpbWVVcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZVVzID0gdG1wVXM7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50NjQoInRpbWVVcyIsICZzcmNUaW1lVXMpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNUaW1lVXMgPiBsYXRlc3RUaW1lVXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlc3RUaW1lVXMgPSBzcmNUaW1lVXM7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQ2NCgic2VnbWVudFN0YXJ0VGltZVVzIiwgJnRtcFVzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudFN0YXJ0VGltZVVzIDwgMCB8fCB0bXBVcyA8IHNlZ21lbnRTdGFydFRpbWVVcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnRTdGFydFRpbWVVcyA9IHRtcFVzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNlcTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMigiZGlzY29udGludWl0eVNlcSIsICZzZXEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXNjb250aW51aXR5U2VxIDwgMCB8fCBzZXEgPCBkaXNjb250aW51aXR5U2VxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY29udGludWl0eVNlcSA9IHNlcTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIHNvdXJjZXNbal0gPSBtUGFja2V0U291cmNlczIudmFsdWVGb3IoaW5kZXhUb1R5cGUoaikpOwotICAgICAgICAgICAgICAgICAgICBzb3VyY2VzW2pdLT5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBleHRyYVN0cmVhbXMgPSBtTmV3U3RyZWFtTWFzayAmICh+bVN0cmVhbU1hc2spOwotICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFTdHJlYW1zICYgaW5kZXhUb1R5cGUoaikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXNbal0tPnF1ZXVlQWNjZXNzVW5pdChjcmVhdGVGb3JtYXRDaGFuZ2VCdWZmZXIoLyogc3dhcCA9ICovIGZhbHNlKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwaWNrVHJhY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlbGVjdGluZyB0cmFjaywgcXVldWUgZGlzY29udGludWl0aWVzIGJlZm9yZSBjb250ZW50CisgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzW2pdLT5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogPT0ga1N1YnRpdGxlSW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IGRpc2NvbnRpbnVpdHlRdWV1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvbnRpbnVpdHlRdWV1ZSA9IG1EaXNjb250aW51aXRpZXMudmFsdWVGb3IoaW5kZXhUb1R5cGUoaikpOworICAgICAgICAgICAgICAgICAgICAgICAgZGlzY29udGludWl0eVF1ZXVlLT5xdWV1ZURpc2NvbnRpbnVpdHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9GT1JNQVRDSEFOR0UsIE5VTEwsIHRydWUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRhcHRpbmcsIHF1ZXVlIGRpc2NvbnRpbnVpdGllcyBhZnRlciByZXN1bWUKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXNbal0gPSBtUGFja2V0U291cmNlczIudmFsdWVGb3IoaW5kZXhUb1R5cGUoaikpOworICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlc1tqXS0+Y2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGV4dHJhU3RyZWFtcyA9IG1OZXdTdHJlYW1NYXNrICYgKH5tU3RyZWFtTWFzayk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFTdHJlYW1zICYgaW5kZXhUb1R5cGUoaikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzW2pdLT5xdWV1ZUFjY2Vzc1VuaXQoY3JlYXRlRm9ybWF0Q2hhbmdlQnVmZmVyKC8qc3dhcCovIGZhbHNlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKQEAgLTEyMjcsMTQgKzE1MTksMTYgQEAKICAgICAgICAgICAgICAgICBzb3VyY2VzW2tBdWRpb0luZGV4XSwKICAgICAgICAgICAgICAgICBzb3VyY2VzW2tWaWRlb0luZGV4XSwKICAgICAgICAgICAgICAgICBzb3VyY2VzW2tTdWJ0aXRsZUluZGV4XSwKLSAgICAgICAgICAgICAgICB0aW1lVXMsCi0gICAgICAgICAgICAgICAgbGF0ZXN0VGltZVVzIC8qIG1pbiBzdGFydCB0aW1lKHVzKSAqLywKLSAgICAgICAgICAgICAgICBsYXRlc3RTZXEgPj0gMCA/IGxhdGVzdFNlcSArIDEgOiAtMSAvKiBzdGFydGluZyBzZXF1ZW5jZSBudW1iZXIgaGludCAqLyApOworICAgICAgICAgICAgICAgIHN0YXJ0VGltZVVzIDwgMCA/IG1MYXN0U2Vla1RpbWVVcyA6IHN0YXJ0VGltZVVzLAorICAgICAgICAgICAgICAgIHNlZ21lbnRTdGFydFRpbWVVcywKKyAgICAgICAgICAgICAgICBkaXNjb250aW51aXR5U2VxLAorICAgICAgICAgICAgICAgIHN3aXRjaGluZyk7CiAgICAgfQogCiAgICAgLy8gQWxsIGZldGNoZXJzIGhhdmUgbm93IGJlZW4gc3RhcnRlZCwgdGhlIGNvbmZpZ3VyYXRpb24gY2hhbmdlCiAgICAgLy8gaGFzIGNvbXBsZXRlZC4KIAorICAgIGNhbmNlbENoZWNrQmFuZHdpZHRoRXZlbnQoKTsKICAgICBzY2hlZHVsZUNoZWNrQmFuZHdpZHRoRXZlbnQoKTsKIAogICAgIEFMT0dWKCJYWFggY29uZmlndXJhdGlvbiBjaGFuZ2UgY29tcGxldGVkLiIpOwpAQCAtMTI1OSw4ICsxNTUzLDE3IEBACiAKICAgICBpbnQzMl90IHN0cmVhbTsKICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigic3RyZWFtIiwgJnN0cmVhbSkpOwotICAgIG1Td2FwTWFzayB8PSBzdHJlYW07Ci0gICAgaWYgKG1Td2FwTWFzayAhPSBtU3RyZWFtTWFzaykgeworCisgICAgc3NpemVfdCBpZHggPSB0eXBlVG9JbmRleChzdHJlYW0pOworICAgIENIRUNLKGlkeCA+PSAwKTsKKyAgICBpZiAoKG1OZXdTdHJlYW1NYXNrICYgc3RyZWFtKSAmJiBtU3RyZWFtc1tpZHhdLm1OZXdVcmkuZW1wdHkoKSkgeworICAgICAgICBBTE9HVygic3dhcHBpbmcgc3RyZWFtIHR5cGUgJWQgJXMgdG8gZW1wdHkgc3RyZWFtIiwgc3RyZWFtLCBtU3RyZWFtc1tpZHhdLm1VcmkuY19zdHIoKSk7CisgICAgfQorICAgIG1TdHJlYW1zW2lkeF0ubVVyaSA9IG1TdHJlYW1zW2lkeF0ubU5ld1VyaTsKKyAgICBtU3RyZWFtc1tpZHhdLm1OZXdVcmkuY2xlYXIoKTsKKworICAgIG1Td2FwTWFzayAmPSB+c3RyZWFtOworICAgIGlmIChtU3dhcE1hc2sgIT0gMCkgewogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC0xMjcwLDE1ICsxNTczLDY1IEBACiAgICAgICAgIFN0cmVhbVR5cGUgZXh0cmFTdHJlYW0gPSAoU3RyZWFtVHlwZSkgKGV4dHJhU3RyZWFtcyAmIH4oZXh0cmFTdHJlYW1zIC0gMSkpOwogICAgICAgICBzd2FwUGFja2V0U291cmNlKGV4dHJhU3RyZWFtKTsKICAgICAgICAgZXh0cmFTdHJlYW1zICY9IH5leHRyYVN0cmVhbTsKKworICAgICAgICBpZHggPSB0eXBlVG9JbmRleChleHRyYVN0cmVhbSk7CisgICAgICAgIENIRUNLKGlkeCA+PSAwKTsKKyAgICAgICAgaWYgKG1TdHJlYW1zW2lkeF0ubU5ld1VyaS5lbXB0eSgpKSB7CisgICAgICAgICAgICBBTE9HVygic3dhcHBpbmcgZXh0cmEgc3RyZWFtIHR5cGUgJWQgJXMgdG8gZW1wdHkgc3RyZWFtIiwKKyAgICAgICAgICAgICAgICAgICAgZXh0cmFTdHJlYW0sIG1TdHJlYW1zW2lkeF0ubVVyaS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICBtU3RyZWFtc1tpZHhdLm1VcmkgPSBtU3RyZWFtc1tpZHhdLm1OZXdVcmk7CisgICAgICAgIG1TdHJlYW1zW2lkeF0ubU5ld1VyaS5jbGVhcigpOwogICAgIH0KIAogICAgIHRyeVRvRmluaXNoQmFuZHdpZHRoU3dpdGNoKCk7CiB9CiAKK3ZvaWQgTGl2ZVNlc3Npb246Om9uQ2hlY2tTd2l0Y2hEb3duKCkgeworICAgIGlmIChtU3dpdGNoRG93bk1vbml0b3IgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWF4U3RyZWFtczsgKytpKSB7CisgICAgICAgIGludDMyX3QgdGFyZ2V0RHVyYXRpb247CisgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHBhY2tldFNvdXJjZSA9IG1QYWNrZXRTb3VyY2VzLnZhbHVlRm9yKGluZGV4VG9UeXBlKGkpKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1ldGEgPSBwYWNrZXRTb3VyY2UtPmdldExhdGVzdERlcXVldWVkTWV0YSgpOworCisgICAgICAgIGlmIChtZXRhICE9IE5VTEwgJiYgbWV0YS0+ZmluZEludDMyKCJ0YXJnZXREdXJhdGlvbiIsICZ0YXJnZXREdXJhdGlvbikgKSB7CisgICAgICAgICAgICBpbnQ2NF90IGJ1ZmZlcmVkRHVyYXRpb25VcyA9IHBhY2tldFNvdXJjZS0+Z2V0RXN0aW1hdGVkRHVyYXRpb25VcygpOworICAgICAgICAgICAgaW50NjRfdCB0YXJnZXREdXJhdGlvblVzID0gdGFyZ2V0RHVyYXRpb24gKiAxMDAwMDAwbGw7CisKKyAgICAgICAgICAgIGlmIChidWZmZXJlZER1cmF0aW9uVXMgPCB0YXJnZXREdXJhdGlvblVzIC8gMykgeworICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTd2l0Y2hEb3duLCBpZCgpKSktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIG1Td2l0Y2hEb3duTW9uaXRvci0+cG9zdCgxMDAwMDAwbGwpOworfQorCit2b2lkIExpdmVTZXNzaW9uOjpvblN3aXRjaERvd24oKSB7CisgICAgaWYgKG1SZWNvbmZpZ3VyYXRpb25JblByb2dyZXNzIHx8IG1Td2l0Y2hJblByb2dyZXNzIHx8IG1DdXJCYW5kd2lkdGhJbmRleCA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzc2l6ZV90IGJhbmR3aWR0aEluZGV4ID0gZ2V0QmFuZHdpZHRoSW5kZXgoKTsKKyAgICBpZiAoYmFuZHdpZHRoSW5kZXggPCBtQ3VyQmFuZHdpZHRoSW5kZXgpIHsKKyAgICAgICAgY2hhbmdlQ29uZmlndXJhdGlvbigtMSwgYmFuZHdpZHRoSW5kZXgsIGZhbHNlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNoYW5nZUNvbmZpZ3VyYXRpb24oLTEsIG1DdXJCYW5kd2lkdGhJbmRleCAtIDEsIGZhbHNlKTsKK30KKwogLy8gTWFyayBzd2l0Y2ggZG9uZSB3aGVuOgotLy8gICAxLiBhbGwgb2xkIGJ1ZmZlcnMgYXJlIHN3YXBwZWQgb3V0LCBBTkQKLS8vICAgMi4gYWxsIG9sZCBmZXRjaGVycyBhcmUgcmVtb3ZlZC4KKy8vICAgMS4gYWxsIG9sZCBidWZmZXJzIGFyZSBzd2FwcGVkIG91dAogdm9pZCBMaXZlU2Vzc2lvbjo6dHJ5VG9GaW5pc2hCYW5kd2lkdGhTd2l0Y2goKSB7CisgICAgaWYgKCFtU3dpdGNoSW5Qcm9ncmVzcykgeworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgYm9vbCBuZWVkVG9SZW1vdmVGZXRjaGVycyA9IGZhbHNlOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZldGNoZXJJbmZvcy5zaXplKCk7ICsraSkgewogICAgICAgICBpZiAobUZldGNoZXJJbmZvcy52YWx1ZUF0KGkpLm1Ub0JlUmVtb3ZlZCkgewpAQCAtMTI4NiwxMCArMTYzOSwxMSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKCFuZWVkVG9SZW1vdmVGZXRjaGVycyAmJiBtU3dhcE1hc2sgPT0gbVN0cmVhbU1hc2spIHsKKworICAgIGlmICghbmVlZFRvUmVtb3ZlRmV0Y2hlcnMgJiYgbVN3YXBNYXNrID09IDApIHsKKyAgICAgICAgQUxPR0koIm1Td2l0Y2hJblByb2dyZXNzID0gZmFsc2UiKTsKICAgICAgICAgbVN0cmVhbU1hc2sgPSBtTmV3U3RyZWFtTWFzazsKICAgICAgICAgbVN3aXRjaEluUHJvZ3Jlc3MgPSBmYWxzZTsKLSAgICAgICAgbVN3YXBNYXNrID0gMDsKICAgICB9CiB9CiAKQEAgLTEzMDgsNiArMTY2MiwyOCBAQAogICAgIG1Td2l0Y2hHZW5lcmF0aW9uKys7CiAgICAgbVN3aXRjaEluUHJvZ3Jlc3MgPSBmYWxzZTsKICAgICBtU3dhcE1hc2sgPSAwOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRmV0Y2hlckluZm9zLnNpemUoKTsgKytpKSB7CisgICAgICAgIEZldGNoZXJJbmZvJiBpbmZvID0gbUZldGNoZXJJbmZvcy5lZGl0VmFsdWVBdChpKTsKKyAgICAgICAgaWYgKGluZm8ubVRvQmVSZW1vdmVkKSB7CisgICAgICAgICAgICBpbmZvLm1Ub0JlUmVtb3ZlZCA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWF4U3RyZWFtczsgKytpKSB7CisgICAgICAgIGlmICghbVN0cmVhbXNbaV0ubU5ld1VyaS5lbXB0eSgpKSB7CisgICAgICAgICAgICBzc2l6ZV90IGogPSBtRmV0Y2hlckluZm9zLmluZGV4T2ZLZXkobVN0cmVhbXNbaV0ubU5ld1VyaSk7CisgICAgICAgICAgICBpZiAoaiA8IDApIHsKKyAgICAgICAgICAgICAgICBtU3RyZWFtc1tpXS5tTmV3VXJpLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnN0IEZldGNoZXJJbmZvICZpbmZvID0gbUZldGNoZXJJbmZvcy52YWx1ZUF0KGopOworICAgICAgICAgICAgaW5mby5tRmV0Y2hlci0+c3RvcEFzeW5jKCk7CisgICAgICAgICAgICBtRmV0Y2hlckluZm9zLnJlbW92ZUl0ZW1zQXQoaik7CisgICAgICAgICAgICBtU3RyZWFtc1tpXS5tTmV3VXJpLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIGJvb2wgTGl2ZVNlc3Npb246OmNhblN3aXRjaEJhbmR3aWR0aFRvKHNpemVfdCBiYW5kd2lkdGhJbmRleCkgewpAQCAtMTMxNSwzMyArMTY5MSwyOSBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgaWYgKG1QcmV2QmFuZHdpZHRoSW5kZXggPCAwKSB7CisgICAgaWYgKG1DdXJCYW5kd2lkdGhJbmRleCA8IDApIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgaWYgKGJhbmR3aWR0aEluZGV4ID09IChzaXplX3QpbVByZXZCYW5kd2lkdGhJbmRleCkgeworICAgIGlmIChiYW5kd2lkdGhJbmRleCA9PSAoc2l6ZV90KW1DdXJCYW5kd2lkdGhJbmRleCkgewogICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfSBlbHNlIGlmIChiYW5kd2lkdGhJbmRleCA+IChzaXplX3QpbVByZXZCYW5kd2lkdGhJbmRleCkgeworICAgIH0gZWxzZSBpZiAoYmFuZHdpZHRoSW5kZXggPiAoc2l6ZV90KW1DdXJCYW5kd2lkdGhJbmRleCkgewogICAgICAgICByZXR1cm4gY2FuU3dpdGNoVXAoKTsKICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiB9CiAKLXZvaWQgTGl2ZVNlc3Npb246Om9uQ2hlY2tCYW5kd2lkdGgoKSB7Cit2b2lkIExpdmVTZXNzaW9uOjpvbkNoZWNrQmFuZHdpZHRoKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgc2l6ZV90IGJhbmR3aWR0aEluZGV4ID0gZ2V0QmFuZHdpZHRoSW5kZXgoKTsKICAgICBpZiAoY2FuU3dpdGNoQmFuZHdpZHRoVG8oYmFuZHdpZHRoSW5kZXgpKSB7CiAgICAgICAgIGNoYW5nZUNvbmZpZ3VyYXRpb24oLTFsbCAvKiB0aW1lVXMgKi8sIGJhbmR3aWR0aEluZGV4KTsKICAgICB9IGVsc2UgewotICAgICAgICBzY2hlZHVsZUNoZWNrQmFuZHdpZHRoRXZlbnQoKTsKKyAgICAgICAgLy8gQ29tZSBiYWNrIGFuZCBjaGVjayBhZ2FpbiAxMCBzZWNvbmRzIGxhdGVyIGluIGNhc2UgdGhlcmUgaXMgbm90aGluZyB0byBkbyBub3cuCisgICAgICAgIC8vIElmIHdlIERPIGNoYW5nZSBjb25maWd1cmF0aW9uLCBvbmNlIHRoYXQgY29tcGxldGVzIGl0J2xsIHNjaGVkdWxlIGEgbmV3CisgICAgICAgIC8vIGNoZWNrIGJhbmR3aWR0aCBldmVudCB3aXRoIGFuIGluY3JlbWVudGVkIG1DaGVja0JhbmR3aWR0aEdlbmVyYXRpb24uCisgICAgICAgIG1zZy0+cG9zdCgxMDAwMDAwMGxsKTsKICAgICB9Ci0KLSAgICAvLyBIYW5kbGluZyB0aGUga1doYXRDaGVja0JhbmR3aWR0aCBldmVuIGhlcmUgZG9lcyBfbm90XyBhdXRvbWF0aWNhbGx5Ci0gICAgLy8gc2NoZWR1bGUgYW5vdGhlciBvbmUgb24gcmV0dXJuLCBvbmx5IGFuIGV4cGxpY2l0IGNhbGwgdG8KLSAgICAvLyBzY2hlZHVsZUNoZWNrQmFuZHdpZHRoRXZlbnQgd2lsbCBkbyB0aGF0LgotICAgIC8vIFRoaXMgZW5zdXJlcyB0aGF0IG9ubHkgb25lIGNvbmZpZ3VyYXRpb24gY2hhbmdlIGlzIG9uZ29pbmcgYXQgYW55Ci0gICAgLy8gb25lIHRpbWUsIG9uY2UgdGhhdCBjb21wbGV0ZXMgaXQnbGwgc2NoZWR1bGUgYW5vdGhlciBjaGVjayBiYW5kd2lkdGgKLSAgICAvLyBldmVudC4KIH0KIAogdm9pZCBMaXZlU2Vzc2lvbjo6cG9zdFByZXBhcmVkKHN0YXR1c190IGVycikgewpAQCAtMTM1OCw2ICsxNzMwLDkgQEAKICAgICBub3RpZnktPnBvc3QoKTsKIAogICAgIG1JblByZXBhcmF0aW9uUGhhc2UgPSBmYWxzZTsKKworICAgIG1Td2l0Y2hEb3duTW9uaXRvciA9IG5ldyBBTWVzc2FnZShrV2hhdENoZWNrU3dpdGNoRG93biwgaWQoKSk7CisgICAgbVN3aXRjaERvd25Nb25pdG9yLT5wb3N0KCk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uaAppbmRleCAzZjhmZWU1Li43YWFjY2E2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmgKQEAgLTI4LDYgKzI4LDcgQEAKIHN0cnVjdCBBbm90aGVyUGFja2V0U291cmNlOwogc3RydWN0IERhdGFTb3VyY2U7CiBzdHJ1Y3QgSFRUUEJhc2U7CitzdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CiBzdHJ1Y3QgTGl2ZURhdGFTb3VyY2U7CiBzdHJ1Y3QgTTNVUGFyc2VyOwogc3RydWN0IFBsYXlsaXN0RmV0Y2hlcjsKQEAgLTQwLDcgKzQxLDggQEAKICAgICB9OwogICAgIExpdmVTZXNzaW9uKAogICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDAsIGJvb2wgdWlkVmFsaWQgPSBmYWxzZSwgdWlkX3QgdWlkID0gMCk7CisgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UpOwogCiAgICAgZW51bSBTdHJlYW1JbmRleCB7CiAgICAgICAgIGtBdWRpb0luZGV4ICAgID0gMCwKQEAgLTY4LDcgKzcwLDggQEAKICAgICBzdGF0dXNfdCBzZWVrVG8oaW50NjRfdCB0aW1lVXMpOwogCiAgICAgc3RhdHVzX3QgZ2V0RHVyYXRpb24oaW50NjRfdCAqZHVyYXRpb25VcykgY29uc3Q7Ci0gICAgc3RhdHVzX3QgZ2V0VHJhY2tJbmZvKFBhcmNlbCAqcmVwbHkpIGNvbnN0OworICAgIHNpemVfdCBnZXRUcmFja0NvdW50KCkgY29uc3Q7CisgICAgc3A8QU1lc3NhZ2U+IGdldFRyYWNrSW5mbyhzaXplX3QgdHJhY2tJbmRleCkgY29uc3Q7CiAgICAgc3RhdHVzX3Qgc2VsZWN0VHJhY2soc2l6ZV90IGluZGV4LCBib29sIHNlbGVjdCk7CiAKICAgICBib29sIGlzU2Vla2FibGUoKSBjb25zdDsKQEAgLTEwNSw2ICsxMDgsOCBAQAogICAgICAgICBrV2hhdENoYW5nZUNvbmZpZ3VyYXRpb24zICAgICAgID0gJ2NoQzMnLAogICAgICAgICBrV2hhdEZpbmlzaERpc2Nvbm5lY3QyICAgICAgICAgID0gJ2ZpbjInLAogICAgICAgICBrV2hhdFN3YXBwZWQgICAgICAgICAgICAgICAgICAgID0gJ3N3YXAnLAorICAgICAgICBrV2hhdENoZWNrU3dpdGNoRG93biAgICAgICAgICAgID0gJ2NrU0QnLAorICAgICAgICBrV2hhdFN3aXRjaERvd24gICAgICAgICAgICAgICAgID0gJ3NEd24nLAogICAgIH07CiAKICAgICBzdHJ1Y3QgQmFuZHdpZHRoSXRlbSB7CkBAIC0xMjEsOSArMTI2LDIwIEBACiAKICAgICBzdHJ1Y3QgU3RyZWFtSXRlbSB7CiAgICAgICAgIGNvbnN0IGNoYXIgKm1UeXBlOwotICAgICAgICBBU3RyaW5nIG1Vcmk7Ci0gICAgICAgIFN0cmVhbUl0ZW0oKSA6IG1UeXBlKCIiKSB7fQotICAgICAgICBTdHJlYW1JdGVtKGNvbnN0IGNoYXIgKnR5cGUpIDogbVR5cGUodHlwZSkge30KKyAgICAgICAgQVN0cmluZyBtVXJpLCBtTmV3VXJpOworICAgICAgICBzaXplX3QgbUN1ckRpc2NvbnRpbnVpdHlTZXE7CisgICAgICAgIGludDY0X3QgbUxhc3REZXF1ZXVlZFRpbWVVczsKKyAgICAgICAgaW50NjRfdCBtTGFzdFNhbXBsZUR1cmF0aW9uVXM7CisgICAgICAgIFN0cmVhbUl0ZW0oKQorICAgICAgICAgICAgOiBtVHlwZSgiIiksCisgICAgICAgICAgICAgIG1DdXJEaXNjb250aW51aXR5U2VxKDApLAorICAgICAgICAgICAgICBtTGFzdERlcXVldWVkVGltZVVzKDApLAorICAgICAgICAgICAgICBtTGFzdFNhbXBsZUR1cmF0aW9uVXMoMCkge30KKyAgICAgICAgU3RyZWFtSXRlbShjb25zdCBjaGFyICp0eXBlKQorICAgICAgICAgICAgOiBtVHlwZSh0eXBlKSwKKyAgICAgICAgICAgICAgbUN1ckRpc2NvbnRpbnVpdHlTZXEoMCksCisgICAgICAgICAgICAgIG1MYXN0RGVxdWV1ZWRUaW1lVXMoMCksCisgICAgICAgICAgICAgIG1MYXN0U2FtcGxlRHVyYXRpb25VcygwKSB7fQogICAgICAgICBBU3RyaW5nIHVyaUtleSgpIHsKICAgICAgICAgICAgIEFTdHJpbmcga2V5KG1UeXBlKTsKICAgICAgICAgICAgIGtleS5hcHBlbmQoIlVSSSIpOwpAQCAtMTM0LDEwICsxNTAsMTAgQEAKIAogICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5OwogICAgIHVpbnQzMl90IG1GbGFnczsKLSAgICBib29sIG1VSURWYWxpZDsKLSAgICB1aWRfdCBtVUlEOworICAgIHNwPElNZWRpYUhUVFBTZXJ2aWNlPiBtSFRUUFNlcnZpY2U7CiAKICAgICBib29sIG1JblByZXBhcmF0aW9uUGhhc2U7CisgICAgYm9vbCBtQnVmZmVyaW5nW2tNYXhTdHJlYW1zXTsKIAogICAgIHNwPEhUVFBCYXNlPiBtSFRUUERhdGFTb3VyY2U7CiAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbUV4dHJhSGVhZGVyczsKQEAgLTE0NSw3ICsxNjEsNyBAQAogICAgIEFTdHJpbmcgbU1hc3RlclVSTDsKIAogICAgIFZlY3RvcjxCYW5kd2lkdGhJdGVtPiBtQmFuZHdpZHRoSXRlbXM7Ci0gICAgc3NpemVfdCBtUHJldkJhbmR3aWR0aEluZGV4OworICAgIHNzaXplX3QgbUN1ckJhbmR3aWR0aEluZGV4OwogCiAgICAgc3A8TTNVUGFyc2VyPiBtUGxheWxpc3Q7CiAKQEAgLTE2MSw2ICsxNzcsNyBAQAogICAgIC8vIHdlIHVzZSB0aGlzIHRvIHRyYWNrIHJlY29uZmlndXJhdGlvbiBwcm9ncmVzcy4KICAgICB1aW50MzJfdCBtU3dhcE1hc2s7CiAKKyAgICBLZXllZFZlY3RvcjxTdHJlYW1UeXBlLCBzcDxBbm90aGVyUGFja2V0U291cmNlPiA+IG1EaXNjb250aW51aXRpZXM7CiAgICAgS2V5ZWRWZWN0b3I8U3RyZWFtVHlwZSwgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gPiBtUGFja2V0U291cmNlczsKICAgICAvLyBBIHNlY29uZCBzZXQgb2YgcGFja2V0IHNvdXJjZXMgdGhhdCBidWZmZXIgY29udGVudCBmb3IgdGhlIHZhcmlhbnQgd2UncmUgc3dpdGNoaW5nIHRvLgogICAgIEtleWVkVmVjdG9yPFN0cmVhbVR5cGUsIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ID4gbVBhY2tldFNvdXJjZXMyOwpAQCAtMTcyLDYgKzE4OSw3IEBACiAKICAgICBpbnQzMl90IG1DaGVja0JhbmR3aWR0aEdlbmVyYXRpb247CiAgICAgaW50MzJfdCBtU3dpdGNoR2VuZXJhdGlvbjsKKyAgICBpbnQzMl90IG1TdWJ0aXRsZUdlbmVyYXRpb247CiAKICAgICBzaXplX3QgbUNvbnRpbnVhdGlvbkNvdW50ZXI7CiAgICAgc3A8QU1lc3NhZ2U+IG1Db250aW51YXRpb247CkBAIC0xODUsNiArMjAzLDEzIEBACiAgICAgdWludDMyX3QgbURpc2Nvbm5lY3RSZXBseUlEOwogICAgIHVpbnQzMl90IG1TZWVrUmVwbHlJRDsKIAorICAgIGJvb2wgbUZpcnN0VGltZVVzVmFsaWQ7CisgICAgaW50NjRfdCBtRmlyc3RUaW1lVXM7CisgICAgaW50NjRfdCBtTGFzdFNlZWtUaW1lVXM7CisgICAgc3A8QU1lc3NhZ2U+IG1Td2l0Y2hEb3duTW9uaXRvcjsKKyAgICBLZXllZFZlY3RvcjxzaXplX3QsIGludDY0X3Q+IG1EaXNjb250aW51aXR5QWJzU3RhcnRUaW1lc1VzOworICAgIEtleWVkVmVjdG9yPHNpemVfdCwgaW50NjRfdD4gbURpc2NvbnRpbnVpdHlPZmZzZXRUaW1lc1VzOworCiAgICAgc3A8UGxheWxpc3RGZXRjaGVyPiBhZGRGZXRjaGVyKGNvbnN0IGNoYXIgKnVyaSk7CiAKICAgICB2b2lkIG9uQ29ubmVjdChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CkBAIC0yMTYsOSArMjQxLDExIEBACiAgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsIHVpbnQ4X3QgKmN1clBsYXlsaXN0SGFzaCwgYm9vbCAqdW5jaGFuZ2VkKTsKIAogICAgIHNpemVfdCBnZXRCYW5kd2lkdGhJbmRleCgpOworICAgIGludDY0X3QgbGF0ZXN0TWVkaWFTZWdtZW50U3RhcnRUaW1lVXMoKTsKIAogICAgIHN0YXRpYyBpbnQgU29ydEJ5QmFuZHdpZHRoKGNvbnN0IEJhbmR3aWR0aEl0ZW0gKiwgY29uc3QgQmFuZHdpZHRoSXRlbSAqKTsKICAgICBzdGF0aWMgU3RyZWFtVHlwZSBpbmRleFRvVHlwZShpbnQgaWR4KTsKKyAgICBzdGF0aWMgc3NpemVfdCB0eXBlVG9JbmRleChpbnQzMl90IHR5cGUpOwogCiAgICAgdm9pZCBjaGFuZ2VDb25maWd1cmF0aW9uKAogICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMsIHNpemVfdCBiYW5kd2lkdGhJbmRleCwgYm9vbCBwaWNrVHJhY2sgPSBmYWxzZSk7CkBAIC0yMjYsNiArMjUzLDggQEAKICAgICB2b2lkIG9uQ2hhbmdlQ29uZmlndXJhdGlvbjIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogICAgIHZvaWQgb25DaGFuZ2VDb25maWd1cmF0aW9uMyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAgICAgdm9pZCBvblN3YXBwZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZvaWQgb25DaGVja1N3aXRjaERvd24oKTsKKyAgICB2b2lkIG9uU3dpdGNoRG93bigpOwogICAgIHZvaWQgdHJ5VG9GaW5pc2hCYW5kd2lkdGhTd2l0Y2goKTsKIAogICAgIHZvaWQgc2NoZWR1bGVDaGVja0JhbmR3aWR0aEV2ZW50KCk7CkBAIC0yMzcsNyArMjY2LDcgQEAKICAgICB2b2lkIGNhbmNlbEJhbmR3aWR0aFN3aXRjaCgpOwogCiAgICAgYm9vbCBjYW5Td2l0Y2hCYW5kd2lkdGhUbyhzaXplX3QgYmFuZHdpZHRoSW5kZXgpOwotICAgIHZvaWQgb25DaGVja0JhbmR3aWR0aCgpOworICAgIHZvaWQgb25DaGVja0JhbmR3aWR0aChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAKICAgICB2b2lkIGZpbmlzaERpc2Nvbm5lY3QoKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAKaW5kZXggZTMxYWQ0MC4uMTY1MWRlZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuY3BwCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFwbGF5ZXIuaD4KQEAgLTU4LDggKzU5LDggQEAKIAogICAgIHZvaWQgcGlja1JhbmRvbU1lZGlhSXRlbXMoKTsKICAgICBzdGF0dXNfdCBzZWxlY3RUcmFjayhzaXplX3QgaW5kZXgsIGJvb2wgc2VsZWN0KTsKLSAgICB2b2lkIGdldFRyYWNrSW5mbyhQYXJjZWwqIHJlcGx5KSBjb25zdDsKICAgICBzaXplX3QgY291bnRUcmFja3MoKSBjb25zdDsKKyAgICBzcDxBTWVzc2FnZT4gZ2V0VHJhY2tJbmZvKHNpemVfdCBpbmRleCkgY29uc3Q7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5NZWRpYUdyb3VwKCk7CkBAIC0xMjYsNyArMTI3LDcgQEAKICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRJbmRleCA9IHN0cnRvdWwodmFsdWUsICZlbmQsIDEwKTsKICAgICAgICAgICAgICAgICBDSEVDSyhlbmQgPiB2YWx1ZSAmJiAqZW5kID09ICdcMCcpOwogCi0gICAgICAgICAgICAgICAgaWYgKG1TZWxlY3RlZEluZGV4ID49IG1NZWRpYUl0ZW1zLnNpemUoKSkgeworICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRJbmRleCA+PSAoc3NpemVfdCltTWVkaWFJdGVtcy5zaXplKCkpIHsKICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkSW5kZXggPSBtTWVkaWFJdGVtcy5zaXplKCkgLSAxOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0xNTYsNjUgKzE1Nyw3MiBAQAogfQogCiBzdGF0dXNfdCBNM1VQYXJzZXI6Ok1lZGlhR3JvdXA6OnNlbGVjdFRyYWNrKHNpemVfdCBpbmRleCwgYm9vbCBzZWxlY3QpIHsKLSAgICBpZiAobVR5cGUgIT0gVFlQRV9TVUJTKSB7Ci0gICAgICAgIEFMT0dFKCJvbmx5IHNlbGVjdCBzdWJ0aXRpbGUgdHJhY2tzIGZvciBub3chIik7CisgICAgaWYgKG1UeXBlICE9IFRZUEVfU1VCUyAmJiBtVHlwZSAhPSBUWVBFX0FVRElPKSB7CisgICAgICAgIEFMT0dFKCJvbmx5IHNlbGVjdCBzdWJ0aXRpbGUvYXVkaW8gdHJhY2tzIGZvciBub3chIik7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKICAgICBpZiAoc2VsZWN0KSB7CiAgICAgICAgIGlmIChpbmRleCA+PSBtTWVkaWFJdGVtcy5zaXplKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJ0cmFjayAlZCBkb2VzIG5vdCBleGlzdCIsIGluZGV4KTsKKyAgICAgICAgICAgIEFMT0dFKCJ0cmFjayAlenUgZG9lcyBub3QgZXhpc3QiLCBpbmRleCk7CiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIH0KLSAgICAgICAgaWYgKG1TZWxlY3RlZEluZGV4ID09IGluZGV4KSB7Ci0gICAgICAgICAgICBBTE9HRSgidHJhY2sgJWQgYWxyZWFkeSBzZWxlY3RlZCIsIGluZGV4KTsKKyAgICAgICAgaWYgKG1TZWxlY3RlZEluZGV4ID09IChzc2l6ZV90KWluZGV4KSB7CisgICAgICAgICAgICBBTE9HRSgidHJhY2sgJXp1IGFscmVhZHkgc2VsZWN0ZWQiLCBpbmRleCk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJzZWxlY3RlZCB0cmFjayAlZCIsIGluZGV4KTsKKyAgICAgICAgQUxPR1YoInNlbGVjdGVkIHRyYWNrICV6dSIsIGluZGV4KTsKICAgICAgICAgbVNlbGVjdGVkSW5kZXggPSBpbmRleDsKICAgICB9IGVsc2UgewotICAgICAgICBpZiAobVNlbGVjdGVkSW5kZXggIT0gaW5kZXgpIHsKLSAgICAgICAgICAgIEFMT0dFKCJ0cmFjayAlZCBpcyBub3Qgc2VsZWN0ZWQiLCBpbmRleCk7CisgICAgICAgIGlmIChtU2VsZWN0ZWRJbmRleCAhPSAoc3NpemVfdClpbmRleCkgeworICAgICAgICAgICAgQUxPR0UoInRyYWNrICV6dSBpcyBub3Qgc2VsZWN0ZWQiLCBpbmRleCk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJ1bnNlbGVjdGVkIHRyYWNrICVkIiwgaW5kZXgpOworICAgICAgICBBTE9HVigidW5zZWxlY3RlZCB0cmFjayAlenUiLCBpbmRleCk7CiAgICAgICAgIG1TZWxlY3RlZEluZGV4ID0gLTE7CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIE0zVVBhcnNlcjo6TWVkaWFHcm91cDo6Z2V0VHJhY2tJbmZvKFBhcmNlbCogcmVwbHkpIGNvbnN0IHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1NZWRpYUl0ZW1zLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIHJlcGx5LT53cml0ZUludDMyKDIpOyAvLyAyIGZpZWxkcwotCi0gICAgICAgIGlmIChtVHlwZSA9PSBUWVBFX0FVRElPKSB7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihNRURJQV9UUkFDS19UWVBFX0FVRElPKTsKLSAgICAgICAgfSBlbHNlIGlmIChtVHlwZSA9PSBUWVBFX1ZJREVPKSB7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihNRURJQV9UUkFDS19UWVBFX1ZJREVPKTsKLSAgICAgICAgfSBlbHNlIGlmIChtVHlwZSA9PSBUWVBFX1NVQlMpIHsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKE1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoTUVESUFfVFJBQ0tfVFlQRV9VTktOT1dOKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IE1lZGlhICZpdGVtID0gbU1lZGlhSXRlbXMuaXRlbUF0KGkpOwotICAgICAgICBjb25zdCBjaGFyICpsYW5nID0gaXRlbS5tTGFuZ3VhZ2UuZW1wdHkoKSA/ICJ1bmQiIDogaXRlbS5tTGFuZ3VhZ2UuY19zdHIoKTsKLSAgICAgICAgcmVwbHktPndyaXRlU3RyaW5nMTYoU3RyaW5nMTYobGFuZykpOwotCi0gICAgICAgIGlmIChtVHlwZSA9PSBUWVBFX1NVQlMpIHsKLSAgICAgICAgICAgIC8vIFRPLURPOiBwYXNzIGluIGEgTWVkaWFGb3JtYXQgaW5zdGVhZAotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoISEoaXRlbS5tRmxhZ3MgJiBNZWRpYUdyb3VwOjpGTEFHX0FVVE9TRUxFQ1QpKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKCEhKGl0ZW0ubUZsYWdzICYgTWVkaWFHcm91cDo6RkxBR19ERUZBVUxUKSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMighIShpdGVtLm1GbGFncyAmIE1lZGlhR3JvdXA6OkZMQUdfRk9SQ0VEKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KIHNpemVfdCBNM1VQYXJzZXI6Ok1lZGlhR3JvdXA6OmNvdW50VHJhY2tzKCkgY29uc3QgewogICAgIHJldHVybiBtTWVkaWFJdGVtcy5zaXplKCk7CiB9CiAKK3NwPEFNZXNzYWdlPiBNM1VQYXJzZXI6Ok1lZGlhR3JvdXA6OmdldFRyYWNrSW5mbyhzaXplX3QgaW5kZXgpIGNvbnN0IHsKKyAgICBpZiAoaW5kZXggPj0gbU1lZGlhSXRlbXMuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBuZXcgQU1lc3NhZ2UoKTsKKworICAgIGludDMyX3QgdHJhY2tUeXBlOworICAgIGlmIChtVHlwZSA9PSBUWVBFX0FVRElPKSB7CisgICAgICAgIHRyYWNrVHlwZSA9IE1FRElBX1RSQUNLX1RZUEVfQVVESU87CisgICAgfSBlbHNlIGlmIChtVHlwZSA9PSBUWVBFX1ZJREVPKSB7CisgICAgICAgIHRyYWNrVHlwZSA9IE1FRElBX1RSQUNLX1RZUEVfVklERU87CisgICAgfSBlbHNlIGlmIChtVHlwZSA9PSBUWVBFX1NVQlMpIHsKKyAgICAgICAgdHJhY2tUeXBlID0gTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRTsKKyAgICB9IGVsc2UgeworICAgICAgICB0cmFja1R5cGUgPSBNRURJQV9UUkFDS19UWVBFX1VOS05PV047CisgICAgfQorICAgIGZvcm1hdC0+c2V0SW50MzIoInR5cGUiLCB0cmFja1R5cGUpOworCisgICAgY29uc3QgTWVkaWEgJml0ZW0gPSBtTWVkaWFJdGVtcy5pdGVtQXQoaW5kZXgpOworICAgIGNvbnN0IGNoYXIgKmxhbmcgPSBpdGVtLm1MYW5ndWFnZS5lbXB0eSgpID8gInVuZCIgOiBpdGVtLm1MYW5ndWFnZS5jX3N0cigpOworICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJsYW5ndWFnZSIsIGxhbmcpOworCisgICAgaWYgKG1UeXBlID09IFRZUEVfU1VCUykgeworICAgICAgICAvLyBUTy1ETzogcGFzcyBpbiBhIE1lZGlhRm9ybWF0IGluc3RlYWQKKyAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9URVhUX1ZUVCk7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImF1dG8iLCAhIShpdGVtLm1GbGFncyAmIE1lZGlhR3JvdXA6OkZMQUdfQVVUT1NFTEVDVCkpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJkZWZhdWx0IiwgISEoaXRlbS5tRmxhZ3MgJiBNZWRpYUdyb3VwOjpGTEFHX0RFRkFVTFQpKTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiZm9yY2VkIiwgISEoaXRlbS5tRmxhZ3MgJiBNZWRpYUdyb3VwOjpGTEFHX0ZPUkNFRCkpOworICAgIH0KKworICAgIHJldHVybiBmb3JtYXQ7Cit9CisKIGJvb2wgTTNVUGFyc2VyOjpNZWRpYUdyb3VwOjpnZXRBY3RpdmVVUkkoQVN0cmluZyAqdXJpKSBjb25zdCB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTWVkaWFJdGVtcy5zaXplKCk7ICsraSkgewogICAgICAgICBpZiAobVNlbGVjdGVkSW5kZXggPj0gMCAmJiBpID09IChzaXplX3QpbVNlbGVjdGVkSW5kZXgpIHsKQEAgLTIzOCw2ICsyNDYsNyBAQAogICAgICAgbUlzVmFyaWFudFBsYXlsaXN0KGZhbHNlKSwKICAgICAgIG1Jc0NvbXBsZXRlKGZhbHNlKSwKICAgICAgIG1Jc0V2ZW50KGZhbHNlKSwKKyAgICAgIG1EaXNjb250aW51aXR5U2VxKDApLAogICAgICAgbVNlbGVjdGVkSW5kZXgoLTEpIHsKICAgICBtSW5pdENoZWNrID0gcGFyc2UoZGF0YSwgc2l6ZSk7CiB9CkBAIC0yNjUsNiArMjc0LDEwIEBACiAgICAgcmV0dXJuIG1Jc0V2ZW50OwogfQogCitzaXplX3QgTTNVUGFyc2VyOjpnZXREaXNjb250aW51aXR5U2VxKCkgY29uc3QgeworICAgIHJldHVybiBtRGlzY29udGludWl0eVNlcTsKK30KKwogc3A8QU1lc3NhZ2U+IE0zVVBhcnNlcjo6bWV0YSgpIHsKICAgICByZXR1cm4gbU1ldGE7CiB9CkBAIC0zMTksMTcgKzMzMiwyNCBAQAogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIH0KIAotc3RhdHVzX3QgTTNVUGFyc2VyOjpnZXRUcmFja0luZm8oUGFyY2VsKiByZXBseSkgY29uc3Qgeworc2l6ZV90IE0zVVBhcnNlcjo6Z2V0VHJhY2tDb3VudCgpIGNvbnN0IHsKICAgICBzaXplX3QgdHJhY2tDb3VudCA9IDA7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTWVkaWFHcm91cHMuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgdHJhY2tDb3VudCArPSBtTWVkaWFHcm91cHMudmFsdWVBdChpKS0+Y291bnRUcmFja3MoKTsKICAgICB9Ci0gICAgcmVwbHktPndyaXRlSW50MzIodHJhY2tDb3VudCk7CisgICAgcmV0dXJuIHRyYWNrQ291bnQ7Cit9CiAKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1NZWRpYUdyb3Vwcy5zaXplKCk7ICsraSkgewotICAgICAgICBtTWVkaWFHcm91cHMudmFsdWVBdChpKS0+Z2V0VHJhY2tJbmZvKHJlcGx5KTsKK3NwPEFNZXNzYWdlPiBNM1VQYXJzZXI6OmdldFRyYWNrSW5mbyhzaXplX3QgaW5kZXgpIGNvbnN0IHsKKyAgICBmb3IgKHNpemVfdCBpID0gMCwgaWkgPSBpbmRleDsgaSA8IG1NZWRpYUdyb3Vwcy5zaXplKCk7ICsraSkgeworICAgICAgICBzcDxNZWRpYUdyb3VwPiBncm91cCA9IG1NZWRpYUdyb3Vwcy52YWx1ZUF0KGkpOworICAgICAgICBzaXplX3QgdHJhY2tzID0gZ3JvdXAtPmNvdW50VHJhY2tzKCk7CisgICAgICAgIGlmIChpaSA8IHRyYWNrcykgeworICAgICAgICAgICAgcmV0dXJuIGdyb3VwLT5nZXRUcmFja0luZm8oaWkpOworICAgICAgICB9CisgICAgICAgIGlpIC09IHRyYWNrczsKICAgICB9Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBOVUxMOwogfQogCiBzc2l6ZV90IE0zVVBhcnNlcjo6Z2V0U2VsZWN0ZWRJbmRleCgpIGNvbnN0IHsKQEAgLTM5OCw2ICs0MTgsOCBAQAogICAgICAgICAvLyBCYXNlIFVSTCBtdXN0IGJlIGFic29sdXRlCiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CisgICAgY29uc3Qgc2l6ZV90IHNjaGVtZUVuZCA9IChzdHJzdHIoYmFzZVVSTCwgIi8vIikgLSBiYXNlVVJMKSArIDI7CisgICAgQ0hFQ0soc2NoZW1lRW5kID09IDcgfHwgc2NoZW1lRW5kID09IDgpOwogCiAgICAgaWYgKCFzdHJuY2FzZWNtcCgiaHR0cDovLyIsIHVybCwgNykgfHwgIXN0cm5jYXNlY21wKCJodHRwczovLyIsIHVybCwgOCkpIHsKICAgICAgICAgLy8gInVybCIgaXMgYWxyZWFkeSBhbiBhYnNvbHV0ZSBVUkwsIGlnbm9yZSBiYXNlIFVSTC4KQEAgLTQ0Miw3ICs0NjQsNyBAQAogCiAgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGZvdW5kIHNsYXNoIGFjdHVhbGx5IGlzIHBhcnQgb2YgdGhlIHBhdGgKICAgICAgICAgLy8gYW5kIG5vdCBwYXJ0IG9mIHRoZSAiaHR0cDovLyIuCi0gICAgICAgIGlmIChlbmQgPiA2KSB7CisgICAgICAgIGlmIChlbmQgPj0gc2NoZW1lRW5kKSB7CiAgICAgICAgICAgICBvdXQtPnNldFRvKGJhc2VVUkwsIGVuZCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBvdXQtPnNldFRvKGJhc2VVUkwpOwpAQCAtNTUwLDYgKzU3MiwxMiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCIjRVhULVgtTUVESUEiKSkgewogICAgICAgICAgICAgICAgIGVyciA9IHBhcnNlTWVkaWEobGluZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aCgiI0VYVC1YLURJU0NPTlRJTlVJVFktU0VRVUVOQ0UiKSkgeworICAgICAgICAgICAgICAgIHNpemVfdCBzZXE7CisgICAgICAgICAgICAgICAgZXJyID0gcGFyc2VEaXNjb250aW51aXR5U2VxdWVuY2UobGluZSwgJnNlcSk7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICBtRGlzY29udGludWl0eVNlcSA9IHNlcTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTcxMyw2ICs3NDEsOSBAQAogCiAgICAgICAgICAgICBrZXkudG9sb3dlcigpOwogICAgICAgICAgICAgY29uc3QgQVN0cmluZyAmY29kZWNzID0gdW5xdW90ZVN0cmluZyh2YWwpOworICAgICAgICAgICAgaWYgKG1ldGEtPmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAqbWV0YSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgICgqbWV0YSktPnNldFN0cmluZyhrZXkuY19zdHIoKSwgY29kZWNzLmNfc3RyKCkpOwogICAgICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKCJhdWRpbyIsIGtleS5jX3N0cigpKQogICAgICAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKCJ2aWRlbyIsIGtleS5jX3N0cigpKQpAQCAtNzM2LDYgKzc2Nyw5IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGtleS50b2xvd2VyKCk7CisgICAgICAgICAgICBpZiAobWV0YS0+Z2V0KCkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICptZXRhID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgfQogICAgICAgICAgICAgKCptZXRhKS0+c2V0U3RyaW5nKGtleS5jX3N0cigpLCBncm91cElELmNfc3RyKCkpOwogICAgICAgICB9CiAgICAgfQpAQCAtNzk4LDggKzgzMiw4IEBACiAgICAgICAgICAgICAgICAgaWYgKE1ha2VVUkwoYmFzZVVSSS5jX3N0cigpLCB2YWwuY19zdHIoKSwgJmFic1VSSSkpIHsKICAgICAgICAgICAgICAgICAgICAgdmFsID0gYWJzVVJJOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gbWFrZSBhYnNvbHV0ZSB1cmwgZm9yICclcycuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB2YWwuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gbWFrZSBhYnNvbHV0ZSB1cmwgZm9yICVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJpRGVidWdTdHJpbmcoYmFzZVVSSSkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC0xMDg3LDYgKzExMjEsMzAgQEAKIH0KIAogLy8gc3RhdGljCitzdGF0dXNfdCBNM1VQYXJzZXI6OnBhcnNlRGlzY29udGludWl0eVNlcXVlbmNlKGNvbnN0IEFTdHJpbmcgJmxpbmUsIHNpemVfdCAqc2VxKSB7CisgICAgc3NpemVfdCBjb2xvblBvcyA9IGxpbmUuZmluZCgiOiIpOworCisgICAgaWYgKGNvbG9uUG9zIDwgMCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGludDMyX3QgeDsKKyAgICBzdGF0dXNfdCBlcnIgPSBQYXJzZUludDMyKGxpbmUuY19zdHIoKSArIGNvbG9uUG9zICsgMSwgJngpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoeCA8IDApIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBpZiAoc2VxKSB7CisgICAgICAgICpzZXEgPSB4OworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKy8vIHN0YXRpYwogc3RhdHVzX3QgTTNVUGFyc2VyOjpQYXJzZUludDMyKGNvbnN0IGNoYXIgKnMsIGludDMyX3QgKngpIHsKICAgICBjaGFyICplbmQ7CiAgICAgbG9uZyBsdmFsID0gc3RydG9sKHMsICZlbmQsIDEwKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmgKaW5kZXggY2NkNjU1Ni4uZDU4OGFmZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmgKQEAgLTM0LDYgKzM0LDcgQEAKICAgICBib29sIGlzVmFyaWFudFBsYXlsaXN0KCkgY29uc3Q7CiAgICAgYm9vbCBpc0NvbXBsZXRlKCkgY29uc3Q7CiAgICAgYm9vbCBpc0V2ZW50KCkgY29uc3Q7CisgICAgc2l6ZV90IGdldERpc2NvbnRpbnVpdHlTZXEoKSBjb25zdDsKIAogICAgIHNwPEFNZXNzYWdlPiBtZXRhKCk7CiAKQEAgLTQyLDcgKzQzLDggQEAKIAogICAgIHZvaWQgcGlja1JhbmRvbU1lZGlhSXRlbXMoKTsKICAgICBzdGF0dXNfdCBzZWxlY3RUcmFjayhzaXplX3QgaW5kZXgsIGJvb2wgc2VsZWN0KTsKLSAgICBzdGF0dXNfdCBnZXRUcmFja0luZm8oUGFyY2VsKiByZXBseSkgY29uc3Q7CisgICAgc2l6ZV90IGdldFRyYWNrQ291bnQoKSBjb25zdDsKKyAgICBzcDxBTWVzc2FnZT4gZ2V0VHJhY2tJbmZvKHNpemVfdCBpbmRleCkgY29uc3Q7CiAgICAgc3NpemVfdCBnZXRTZWxlY3RlZEluZGV4KCkgY29uc3Q7CiAKICAgICBib29sIGdldFR5cGVVUkkoc2l6ZV90IGluZGV4LCBjb25zdCBjaGFyICprZXksIEFTdHJpbmcgKnVyaSkgY29uc3Q7CkBAIC02NSw2ICs2Nyw3IEBACiAgICAgYm9vbCBtSXNWYXJpYW50UGxheWxpc3Q7CiAgICAgYm9vbCBtSXNDb21wbGV0ZTsKICAgICBib29sIG1Jc0V2ZW50OworICAgIHNpemVfdCBtRGlzY29udGludWl0eVNlcTsKIAogICAgIHNwPEFNZXNzYWdlPiBtTWV0YTsKICAgICBWZWN0b3I8SXRlbT4gbUl0ZW1zOwpAQCAtOTMsNiArOTYsOCBAQAogCiAgICAgc3RhdHVzX3QgcGFyc2VNZWRpYShjb25zdCBBU3RyaW5nICZsaW5lKTsKIAorICAgIHN0YXRpYyBzdGF0dXNfdCBwYXJzZURpc2NvbnRpbnVpdHlTZXF1ZW5jZShjb25zdCBBU3RyaW5nICZsaW5lLCBzaXplX3QgKnNlcSk7CisKICAgICBzdGF0aWMgc3RhdHVzX3QgUGFyc2VJbnQzMihjb25zdCBjaGFyICpzLCBpbnQzMl90ICp4KTsKICAgICBzdGF0aWMgc3RhdHVzX3QgUGFyc2VEb3VibGUoY29uc3QgY2hhciAqcywgZG91YmxlICp4KTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5jcHAKaW5kZXggNjY4Y2JkNC4uMzBmYTg2OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuY3BwCkBAIC00MCw2ICs0MCw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KIAogI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxvcGVuc3NsL2Flcy5oPgogI2luY2x1ZGUgPG9wZW5zc2wvbWQ1Lmg+CiAKQEAgLTQ4LDMxICs0OSwzNiBAQAogLy8gc3RhdGljCiBjb25zdCBpbnQ2NF90IFBsYXlsaXN0RmV0Y2hlcjo6a01pbkJ1ZmZlcmVkRHVyYXRpb25VcyA9IDEwMDAwMDAwbGw7CiBjb25zdCBpbnQ2NF90IFBsYXlsaXN0RmV0Y2hlcjo6a01heE1vbml0b3JEZWxheVVzID0gMzAwMDAwMGxsOwotY29uc3QgaW50MzJfdCBQbGF5bGlzdEZldGNoZXI6OmtEb3dubG9hZEJsb2NrU2l6ZSA9IDE5MjsKK2NvbnN0IGludDMyX3QgUGxheWxpc3RGZXRjaGVyOjprRG93bmxvYWRCbG9ja1NpemUgPSAyMDQ4OwogY29uc3QgaW50MzJfdCBQbGF5bGlzdEZldGNoZXI6OmtOdW1Ta2lwRnJhbWVzID0gMTA7CiAKIFBsYXlsaXN0RmV0Y2hlcjo6UGxheWxpc3RGZXRjaGVyKAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKICAgICAgICAgY29uc3Qgc3A8TGl2ZVNlc3Npb24+ICZzZXNzaW9uLAotICAgICAgICBjb25zdCBjaGFyICp1cmkpCisgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgaW50MzJfdCBzdWJ0aXRsZUdlbmVyYXRpb24pCiAgICAgOiBtTm90aWZ5KG5vdGlmeSksCiAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnkobm90aWZ5LT5kdXAoKSksCiAgICAgICBtU2Vzc2lvbihzZXNzaW9uKSwKICAgICAgIG1VUkkodXJpKSwKICAgICAgIG1TdHJlYW1UeXBlTWFzaygwKSwKICAgICAgIG1TdGFydFRpbWVVcygtMWxsKSwKLSAgICAgIG1NaW5TdGFydFRpbWVVcygwbGwpLAotICAgICAgbVN0b3BQYXJhbXMoTlVMTCksCisgICAgICBtU2VnbWVudFN0YXJ0VGltZVVzKC0xbGwpLAorICAgICAgbURpc2NvbnRpbnVpdHlTZXEoLTFsbCksCisgICAgICBtU3RhcnRUaW1lVXNSZWxhdGl2ZShmYWxzZSksCiAgICAgICBtTGFzdFBsYXlsaXN0RmV0Y2hUaW1lVXMoLTFsbCksCiAgICAgICBtU2VxTnVtYmVyKC0xKSwKICAgICAgIG1OdW1SZXRyaWVzKDApLAogICAgICAgbVN0YXJ0dXAodHJ1ZSksCisgICAgICBtQWRhcHRpdmUoZmFsc2UpLAogICAgICAgbVByZXBhcmVkKGZhbHNlKSwKICAgICAgIG1OZXh0UFRTVGltZVVzKC0xbGwpLAogICAgICAgbU1vbml0b3JRdWV1ZUdlbmVyYXRpb24oMCksCisgICAgICBtU3VidGl0bGVHZW5lcmF0aW9uKHN1YnRpdGxlR2VuZXJhdGlvbiksCiAgICAgICBtUmVmcmVzaFN0YXRlKElOSVRJQUxfTUlOSU1VTV9SRUxPQURfREVMQVkpLAogICAgICAgbUZpcnN0UFRTVmFsaWQoZmFsc2UpLAotICAgICAgbUFic29sdXRlVGltZUFuY2hvclVzKDBsbCkgeworICAgICAgbUFic29sdXRlVGltZUFuY2hvclVzKDBsbCksCisgICAgICBtVmlkZW9CdWZmZXIobmV3IEFub3RoZXJQYWNrZXRTb3VyY2UoTlVMTCkpIHsKICAgICBtZW1zZXQobVBsYXlsaXN0SGFzaCwgMCwgc2l6ZW9mKG1QbGF5bGlzdEhhc2gpKTsKICAgICBtU3RhcnRUaW1lVXNOb3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRTdGFydGVkQXQpOwogICAgIG1TdGFydFRpbWVVc05vdGlmeS0+c2V0SW50MzIoInN0cmVhbU1hc2siLCAwKTsKQEAgLTMxNiw3ICszMjIsNyBAQAogICAgICAgICBtYXhEZWxheVVzID0gbWluRGVsYXlVczsKICAgICB9CiAgICAgaWYgKGRlbGF5VXMgPiBtYXhEZWxheVVzKSB7Ci0gICAgICAgIEFMT0dWKCJOZWVkIHRvIHJlZnJlc2ggcGxheWxpc3QgaW4gJWxsZCIsIG1heERlbGF5VXMpOworICAgICAgICBBTE9HVigiTmVlZCB0byByZWZyZXNoIHBsYXlsaXN0IGluICUiIFBSSWQ2NCAsIG1heERlbGF5VXMpOwogICAgICAgICBkZWxheVVzID0gbWF4RGVsYXlVczsKICAgICB9CiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdE1vbml0b3JRdWV1ZSwgaWQoKSk7CkBAIC0zMzMsOCArMzM5LDkgQEAKICAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJnZpZGVvU291cmNlLAogICAgICAgICBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmc3VidGl0bGVTb3VyY2UsCiAgICAgICAgIGludDY0X3Qgc3RhcnRUaW1lVXMsCi0gICAgICAgIGludDY0X3QgbWluU3RhcnRUaW1lVXMsCi0gICAgICAgIGludDMyX3Qgc3RhcnRTZXFOdW1iZXJIaW50KSB7CisgICAgICAgIGludDY0X3Qgc2VnbWVudFN0YXJ0VGltZVVzLAorICAgICAgICBpbnQzMl90IHN0YXJ0RGlzY29udGludWl0eVNlcSwKKyAgICAgICAgYm9vbCBhZGFwdGl2ZSkgewogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdGFydCwgaWQoKSk7CiAKICAgICB1aW50MzJfdCBzdHJlYW1UeXBlTWFzayA9IDB1bDsKQEAgLTM1Niw4ICszNjMsOSBAQAogCiAgICAgbXNnLT5zZXRJbnQzMigic3RyZWFtVHlwZU1hc2siLCBzdHJlYW1UeXBlTWFzayk7CiAgICAgbXNnLT5zZXRJbnQ2NCgic3RhcnRUaW1lVXMiLCBzdGFydFRpbWVVcyk7Ci0gICAgbXNnLT5zZXRJbnQ2NCgibWluU3RhcnRUaW1lVXMiLCBtaW5TdGFydFRpbWVVcyk7Ci0gICAgbXNnLT5zZXRJbnQzMigic3RhcnRTZXFOdW1iZXJIaW50Iiwgc3RhcnRTZXFOdW1iZXJIaW50KTsKKyAgICBtc2ctPnNldEludDY0KCJzZWdtZW50U3RhcnRUaW1lVXMiLCBzZWdtZW50U3RhcnRUaW1lVXMpOworICAgIG1zZy0+c2V0SW50MzIoInN0YXJ0RGlzY29udGludWl0eVNlcSIsIHN0YXJ0RGlzY29udGludWl0eVNlcSk7CisgICAgbXNnLT5zZXRJbnQzMigiYWRhcHRpdmUiLCBhZGFwdGl2ZSk7CiAgICAgbXNnLT5wb3N0KCk7CiB9CiAKQEAgLTM2NSw5ICszNzMsOSBAQAogICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQYXVzZSwgaWQoKSkpLT5wb3N0KCk7CiB9CiAKLXZvaWQgUGxheWxpc3RGZXRjaGVyOjpzdG9wQXN5bmMoYm9vbCBzZWxmVHJpZ2dlcmVkKSB7Cit2b2lkIFBsYXlsaXN0RmV0Y2hlcjo6c3RvcEFzeW5jKGJvb2wgY2xlYXIpIHsKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U3RvcCwgaWQoKSk7Ci0gICAgbXNnLT5zZXRJbnQzMigic2VsZlRyaWdnZXJlZCIsIHNlbGZUcmlnZ2VyZWQpOworICAgIG1zZy0+c2V0SW50MzIoImNsZWFyIiwgY2xlYXIpOwogICAgIG1zZy0+cG9zdCgpOwogfQogCkBAIC00NDcsMTAgKzQ1NSwxMyBAQAogICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzdHJlYW1UeXBlTWFzayIsIChpbnQzMl90ICopJnN0cmVhbVR5cGVNYXNrKSk7CiAKICAgICBpbnQ2NF90IHN0YXJ0VGltZVVzOwotICAgIGludDMyX3Qgc3RhcnRTZXFOdW1iZXJIaW50OworICAgIGludDY0X3Qgc2VnbWVudFN0YXJ0VGltZVVzOworICAgIGludDMyX3Qgc3RhcnREaXNjb250aW51aXR5U2VxOworICAgIGludDMyX3QgYWRhcHRpdmU7CiAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInN0YXJ0VGltZVVzIiwgJnN0YXJ0VGltZVVzKSk7Ci0gICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoIm1pblN0YXJ0VGltZVVzIiwgKGludDY0X3QgKikgJm1NaW5TdGFydFRpbWVVcykpOwotICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzdGFydFNlcU51bWJlckhpbnQiLCAmc3RhcnRTZXFOdW1iZXJIaW50KSk7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInNlZ21lbnRTdGFydFRpbWVVcyIsICZzZWdtZW50U3RhcnRUaW1lVXMpKTsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigic3RhcnREaXNjb250aW51aXR5U2VxIiwgJnN0YXJ0RGlzY29udGludWl0eVNlcSkpOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJhZGFwdGl2ZSIsICZhZGFwdGl2ZSkpOwogCiAgICAgaWYgKHN0cmVhbVR5cGVNYXNrICYgTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfQVVESU8pIHsKICAgICAgICAgdm9pZCAqcHRyOwpAQCAtNDgwLDE2ICs0OTEsMTYgQEAKICAgICB9CiAKICAgICBtU3RyZWFtVHlwZU1hc2sgPSBzdHJlYW1UeXBlTWFzazsKLSAgICBtU3RhcnRUaW1lVXMgPSBzdGFydFRpbWVVczsKIAotICAgIGlmIChtU3RhcnRUaW1lVXMgPj0gMGxsKSB7CisgICAgbVNlZ21lbnRTdGFydFRpbWVVcyA9IHNlZ21lbnRTdGFydFRpbWVVczsKKyAgICBtRGlzY29udGludWl0eVNlcSA9IHN0YXJ0RGlzY29udGludWl0eVNlcTsKKworICAgIGlmIChzdGFydFRpbWVVcyA+PSAwKSB7CisgICAgICAgIG1TdGFydFRpbWVVcyA9IHN0YXJ0VGltZVVzOwogICAgICAgICBtU2VxTnVtYmVyID0gLTE7CiAgICAgICAgIG1TdGFydHVwID0gdHJ1ZTsKICAgICAgICAgbVByZXBhcmVkID0gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKHN0YXJ0U2VxTnVtYmVySGludCA+PSAwKSB7Ci0gICAgICAgIG1TZXFOdW1iZXIgPSBzdGFydFNlcU51bWJlckhpbnQ7CisgICAgICAgIG1BZGFwdGl2ZSA9IGFkYXB0aXZlOwogICAgIH0KIAogICAgIHBvc3RNb25pdG9yUXVldWUoKTsKQEAgLTUwNCwxMSArNTE1LDkgQEAKIHZvaWQgUGxheWxpc3RGZXRjaGVyOjpvblN0b3AoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBjYW5jZWxNb25pdG9yUXVldWUoKTsKIAotICAgIGludDMyX3Qgc2VsZlRyaWdnZXJlZDsKLSAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigic2VsZlRyaWdnZXJlZCIsICZzZWxmVHJpZ2dlcmVkKSk7Ci0gICAgaWYgKCFzZWxmVHJpZ2dlcmVkKSB7Ci0gICAgICAgIC8vIFNlbGYgdHJpZ2dlcmVkIHN0b3BzIG9ubHkgaGFwcGVuIGR1cmluZyBzd2l0Y2hpbmcsIGluIHdoaWNoIGNhc2Ugd2UgZG8gbm90IHdhbnQKLSAgICAgICAgLy8gdG8gY2xlYXIgdGhlIGRpc2NvbnRpbnVpdGllcyBxdWV1ZWQgYXQgdGhlIGVuZCBvZiBwYWNrZXQgc291cmNlcy4KKyAgICBpbnQzMl90IGNsZWFyOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJjbGVhciIsICZjbGVhcikpOworICAgIGlmIChjbGVhcikgewogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QYWNrZXRTb3VyY2VzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBwYWNrZXRTb3VyY2UgPSBtUGFja2V0U291cmNlcy52YWx1ZUF0KGkpOwogICAgICAgICAgICAgcGFja2V0U291cmNlLT5jbGVhcigpOwpAQCAtNTUwLDE1ICs1NTksMTYgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIERvbid0IHJlc3VtZSBpZiB3ZSB3b3VsZCBzdG9wIHdpdGhpbiBhIHJlc3VtZSB0aHJlc2hvbGQuCisgICAgICAgIGludDMyX3QgZGlzY29udGludWl0eVNlcTsKICAgICAgICAgaW50NjRfdCBsYXRlc3RUaW1lVXMgPSAwLCBzdG9wVGltZVVzID0gMDsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IGxhdGVzdE1ldGEgPSBwYWNrZXRTb3VyY2UtPmdldExhdGVzdE1ldGEoKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IGxhdGVzdE1ldGEgPSBwYWNrZXRTb3VyY2UtPmdldExhdGVzdERlcXVldWVkTWV0YSgpOwogICAgICAgICBpZiAobGF0ZXN0TWV0YSAhPSBOVUxMCi0gICAgICAgICAgICAgICAgJiYgKGxhdGVzdE1ldGEtPmZpbmRJbnQ2NCgidGltZVVzIiwgJmxhdGVzdFRpbWVVcykKLSAgICAgICAgICAgICAgICAmJiBwYXJhbXMtPmZpbmRJbnQ2NChzdG9wS2V5LCAmc3RvcFRpbWVVcykpKSB7Ci0gICAgICAgICAgICBpbnQ2NF90IGRpZmZVcyA9IHN0b3BUaW1lVXMgLSBsYXRlc3RUaW1lVXM7Ci0gICAgICAgICAgICBpZiAoZGlmZlVzIDwgcmVzdW1lVGhyZXNob2xkKGxhdGVzdE1ldGEpKSB7Ci0gICAgICAgICAgICAgICAgc3RvcCA9IHRydWU7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgJiYgbGF0ZXN0TWV0YS0+ZmluZEludDMyKCJkaXNjb250aW51aXR5U2VxIiwgJmRpc2NvbnRpbnVpdHlTZXEpCisgICAgICAgICAgICAgICAgJiYgZGlzY29udGludWl0eVNlcSA9PSBtRGlzY29udGludWl0eVNlcQorICAgICAgICAgICAgICAgICYmIGxhdGVzdE1ldGEtPmZpbmRJbnQ2NCgidGltZVVzIiwgJmxhdGVzdFRpbWVVcykKKyAgICAgICAgICAgICAgICAmJiBwYXJhbXMtPmZpbmRJbnQ2NChzdG9wS2V5LCAmc3RvcFRpbWVVcykKKyAgICAgICAgICAgICAgICAmJiBzdG9wVGltZVVzIC0gbGF0ZXN0VGltZVVzIDwgcmVzdW1lVGhyZXNob2xkKGxhdGVzdE1ldGEpKSB7CisgICAgICAgICAgICBzdG9wID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNTY2LDcgKzU3Niw3IEBACiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBhY2tldFNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIG1QYWNrZXRTb3VyY2VzLnZhbHVlQXQoaSktPnF1ZXVlQWNjZXNzVW5pdChtU2Vzc2lvbi0+Y3JlYXRlRm9ybWF0Q2hhbmdlQnVmZmVyKCkpOwogICAgICAgICB9Ci0gICAgICAgIHN0b3BBc3luYygvKiBzZWxmVHJpZ2dlcmVkID0gKi8gdHJ1ZSk7CisgICAgICAgIHN0b3BBc3luYygvKiBjbGVhciA9ICovIGZhbHNlKTsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIApAQCAtNTg2LDcgKzU5NiwxMCBAQAogdm9pZCBQbGF5bGlzdEZldGNoZXI6OnF1ZXVlRGlzY29udGludWl0eSgKICAgICAgICAgQVRTUGFyc2VyOjpEaXNjb250aW51aXR5VHlwZSB0eXBlLCBjb25zdCBzcDxBTWVzc2FnZT4gJmV4dHJhKSB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGFja2V0U291cmNlcy5zaXplKCk7ICsraSkgewotICAgICAgICBtUGFja2V0U291cmNlcy52YWx1ZUF0KGkpLT5xdWV1ZURpc2NvbnRpbnVpdHkodHlwZSwgZXh0cmEpOworICAgICAgICAvLyBkbyBub3QgZGlzY2FyZCBidWZmZXIgdXBvbiAjRVhULVgtRElTQ09OVElOVUlUWSB0YWcKKyAgICAgICAgLy8gKHNlZWsgd2lsbCBkaXNjYXJkIGJ1ZmZlciBieSBhYmFuZG9uaW5nIG9sZCBmZXRjaGVycykKKyAgICAgICAgbVBhY2tldFNvdXJjZXMudmFsdWVBdChpKS0+cXVldWVEaXNjb250aW51aXR5KAorICAgICAgICAgICAgICAgIHR5cGUsIGV4dHJhLCBmYWxzZSAvKiBkaXNjYXJkICovKTsKICAgICB9CiB9CiAKQEAgLTYyNyw3ICs2NDAsNyBAQAogCiAgICAgICAgICAgICBpbnQ2NF90IGJ1ZmZlcmVkU3RyZWFtRHVyYXRpb25VcyA9CiAgICAgICAgICAgICAgICAgbVBhY2tldFNvdXJjZXMudmFsdWVBdChpKS0+Z2V0QnVmZmVyZWREdXJhdGlvblVzKCZmaW5hbFJlc3VsdCk7Ci0gICAgICAgICAgICBBTE9HVigiYnVmZmVyZWQgJWxsZCBmb3Igc3RyZWFtICVkIiwKKyAgICAgICAgICAgIEFMT0dWKCJidWZmZXJlZCAlIiBQUklkNjQgIiBmb3Igc3RyZWFtICVkIiwKICAgICAgICAgICAgICAgICAgICAgYnVmZmVyZWRTdHJlYW1EdXJhdGlvblVzLCBtUGFja2V0U291cmNlcy5rZXlBdChpKSk7CiAgICAgICAgICAgICBpZiAoYnVmZmVyZWRTdHJlYW1EdXJhdGlvblVzID4gYnVmZmVyZWREdXJhdGlvblVzKSB7CiAgICAgICAgICAgICAgICAgYnVmZmVyZWREdXJhdGlvblVzID0gYnVmZmVyZWRTdHJlYW1EdXJhdGlvblVzOwpAQCAtNjQwLDcgKzY1Myw3IEBACiAgICAgaWYgKCFtUHJlcGFyZWQgJiYgYnVmZmVyZWREdXJhdGlvblVzID4gdGFyZ2V0RHVyYXRpb25VcyAmJiBkb3dubG9hZE1vcmUpIHsKICAgICAgICAgbVByZXBhcmVkID0gdHJ1ZTsKIAotICAgICAgICBBTE9HVigicHJlcGFyZWQsIGJ1ZmZlcmVkPSVsbGQgPiAlbGxkIiwKKyAgICAgICAgQUxPR1YoInByZXBhcmVkLCBidWZmZXJlZD0lIiBQUklkNjQgIiA+ICUiIFBSSWQ2NCAiIiwKICAgICAgICAgICAgICAgICBidWZmZXJlZER1cmF0aW9uVXMsIHRhcmdldER1cmF0aW9uVXMpOwogICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeS0+ZHVwKCk7CiAgICAgICAgIG1zZy0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFRlbXBvcmFyaWx5RG9uZUZldGNoaW5nKTsKQEAgLTY0OCw3ICs2NjEsNyBAQAogICAgIH0KIAogICAgIGlmIChmaW5hbFJlc3VsdCA9PSBPSyAmJiBkb3dubG9hZE1vcmUpIHsKLSAgICAgICAgQUxPR1YoIm1vbml0b3JpbmcsIGJ1ZmZlcmVkPSVsbGQgPCAlbGxkIiwKKyAgICAgICAgQUxPR1YoIm1vbml0b3JpbmcsIGJ1ZmZlcmVkPSUiIFBSSWQ2NCAiIDwgJSIgUFJJZDY0ICIiLAogICAgICAgICAgICAgICAgIGJ1ZmZlcmVkRHVyYXRpb25VcywgZHVyYXRpb25Ub0J1ZmZlclVzKTsKICAgICAgICAgLy8gZGVsYXkgdGhlIG5leHQgZG93bmxvYWQgc2xpZ2h0bHk7IGhvcGVmdWxseSB0aGlzIGdpdmVzIG90aGVyIGNvbmN1cnJlbnQgZmV0Y2hlcnMKICAgICAgICAgLy8gYSBiZXR0ZXIgY2hhbmNlIHRvIHJ1bi4KQEAgLTY2NCw3ICs2NzcsNyBAQAogICAgICAgICBtc2ctPnBvc3QoKTsKIAogICAgICAgICBpbnQ2NF90IGRlbGF5VXMgPSBtUHJlcGFyZWQgPyBrTWF4TW9uaXRvckRlbGF5VXMgOiB0YXJnZXREdXJhdGlvblVzIC8gMjsKLSAgICAgICAgQUxPR1YoInBhdXNpbmcgZm9yICVsbGQsIGJ1ZmZlcmVkPSVsbGQgPiAlbGxkIiwKKyAgICAgICAgQUxPR1YoInBhdXNpbmcgZm9yICUiIFBSSWQ2NCAiLCBidWZmZXJlZD0lIiBQUklkNjQgIiA+ICUiIFBSSWQ2NCAiIiwKICAgICAgICAgICAgICAgICBkZWxheVVzLCBidWZmZXJlZER1cmF0aW9uVXMsIGR1cmF0aW9uVG9CdWZmZXJVcyk7CiAgICAgICAgIC8vIDpUUklDS1k6IG5lZWQgdG8gZW5mb3JjZSBtaW5pbXVtIGRlbGF5IGJlY2F1c2UgdGhlIGRlbGF5IHRvCiAgICAgICAgIC8vIHJlZnJlc2ggdGhlIHBsYXlsaXN0IHdpbGwgYmVjb21lIDAKQEAgLTcyMSwzOCArNzM0LDU1IEBACiAgICAgICAgIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCA9IDA7CiAgICAgfQogCi0gICAgYm9vbCBzZWVrRGlzY29udGludWl0eSA9IGZhbHNlOwotICAgIGJvb2wgZXhwbGljaXREaXNjb250aW51aXR5ID0gZmFsc2U7CisgICAgYm9vbCBkaXNjb250aW51aXR5ID0gZmFsc2U7CiAKICAgICBjb25zdCBpbnQzMl90IGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0ID0KICAgICAgICAgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0ICsgKGludDMyX3QpbVBsYXlsaXN0LT5zaXplKCkgLSAxOwogCi0gICAgaWYgKG1TdGFydHVwICYmIG1TZXFOdW1iZXIgPj0gMAotICAgICAgICAgICAgJiYgKG1TZXFOdW1iZXIgPCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgfHwgbVNlcU51bWJlciA+IGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0KSkgewotICAgICAgICAvLyBpbiBjYXNlIHdlIGd1ZXNzZWQgd3JvbmcgZHVyaW5nIHJlY29uZmlndXJhdGlvbiwgdHJ5IGZldGNoaW5nIHRoZSBsYXRlc3QgY29udGVudC4KLSAgICAgICAgbVNlcU51bWJlciA9IGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0OworICAgIGlmIChtRGlzY29udGludWl0eVNlcSA8IDApIHsKKyAgICAgICAgbURpc2NvbnRpbnVpdHlTZXEgPSBtUGxheWxpc3QtPmdldERpc2NvbnRpbnVpdHlTZXEoKTsKICAgICB9CiAKICAgICBpZiAobVNlcU51bWJlciA8IDApIHsKICAgICAgICAgQ0hFQ0tfR0UobVN0YXJ0VGltZVVzLCAwbGwpOwogCi0gICAgICAgIGlmIChtUGxheWxpc3QtPmlzQ29tcGxldGUoKSB8fCBtUGxheWxpc3QtPmlzRXZlbnQoKSkgewotICAgICAgICAgICAgbVNlcU51bWJlciA9IGdldFNlcU51bWJlckZvclRpbWUobVN0YXJ0VGltZVVzKTsKLSAgICAgICAgICAgIEFMT0dWKCJJbml0aWFsIHNlcXVlbmNlIG51bWJlciBmb3IgdGltZSAlbGxkIGlzICVsZCBmcm9tICglbGQgLi4gJWxkKSIsCisgICAgICAgIGlmIChtU2VnbWVudFN0YXJ0VGltZVVzIDwgMCkgeworICAgICAgICAgICAgaWYgKCFtUGxheWxpc3QtPmlzQ29tcGxldGUoKSAmJiAhbVBsYXlsaXN0LT5pc0V2ZW50KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIGEgbGl2ZSBzZXNzaW9uLCBzdGFydCAzIHNlZ21lbnRzIGZyb20gdGhlIGVuZCBvbiBjb25uZWN0CisgICAgICAgICAgICAgICAgbVNlcU51bWJlciA9IGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0IC0gMzsKKyAgICAgICAgICAgICAgICBpZiAobVNlcU51bWJlciA8IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCkgeworICAgICAgICAgICAgICAgICAgICBtU2VxTnVtYmVyID0gZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVNlcU51bWJlciA9IGdldFNlcU51bWJlckZvclRpbWUobVN0YXJ0VGltZVVzKTsKKyAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXMgLT0gZ2V0U2VnbWVudFN0YXJ0VGltZVVzKG1TZXFOdW1iZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVN0YXJ0VGltZVVzUmVsYXRpdmUgPSB0cnVlOworICAgICAgICAgICAgQUxPR1YoIkluaXRpYWwgc2VxdWVuY2UgbnVtYmVyIGZvciB0aW1lICUiIFBSSWQ2NCAiIGlzICVkIGZyb20gKCVkIC4uICVkKSIsCiAgICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVcywgbVNlcU51bWJlciwgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0LAogICAgICAgICAgICAgICAgICAgICBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBJZiB0aGlzIGlzIGEgbGl2ZSBzZXNzaW9uLCBzdGFydCAzIHNlZ21lbnRzIGZyb20gdGhlIGVuZC4KLSAgICAgICAgICAgIG1TZXFOdW1iZXIgPSBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCAtIDM7CisgICAgICAgICAgICBtU2VxTnVtYmVyID0gZ2V0U2VxTnVtYmVyRm9yVGltZShtU2VnbWVudFN0YXJ0VGltZVVzKTsKKyAgICAgICAgICAgIGlmIChtQWRhcHRpdmUpIHsKKyAgICAgICAgICAgICAgICAvLyBhdm9pZCBkb3VibGUgZmV0Y2gvZGVjb2RlCisgICAgICAgICAgICAgICAgbVNlcU51bWJlciArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3NpemVfdCBtaW5TZXEgPSBnZXRTZXFOdW1iZXJGb3JEaXNjb250aW51aXR5KG1EaXNjb250aW51aXR5U2VxKTsKKyAgICAgICAgICAgIGlmIChtU2VxTnVtYmVyIDwgbWluU2VxKSB7CisgICAgICAgICAgICAgICAgbVNlcU51bWJlciA9IG1pblNlcTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKG1TZXFOdW1iZXIgPCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QpIHsKICAgICAgICAgICAgICAgICBtU2VxTnVtYmVyID0gZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0OwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR1YoIkluaXRpYWwgc2VxdWVuY2UgbnVtYmVyIGZvciBsaXZlIGV2ZW50ICVsZCBmcm9tICglbGQgLi4gJWxkKSIsCisKKyAgICAgICAgICAgIGlmIChtU2VxTnVtYmVyID4gbGFzdFNlcU51bWJlckluUGxheWxpc3QpIHsKKyAgICAgICAgICAgICAgICBtU2VxTnVtYmVyID0gbGFzdFNlcU51bWJlckluUGxheWxpc3Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigiSW5pdGlhbCBzZXF1ZW5jZSBudW1iZXIgZm9yIGxpdmUgZXZlbnQgJWQgZnJvbSAoJWQgLi4gJWQpIiwKICAgICAgICAgICAgICAgICAgICAgbVNlcU51bWJlciwgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0LAogICAgICAgICAgICAgICAgICAgICBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCk7CiAgICAgICAgIH0KLQotICAgICAgICBtU3RhcnRUaW1lVXMgPSAtMWxsOwogICAgIH0KIAogICAgIGlmIChtU2VxTnVtYmVyIDwgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0CkBAIC03NzEsNyArODAxLDggQEAKICAgICAgICAgICAgICAgICBpZiAoZGVsYXlVcyA+IGtNYXhNb25pdG9yRGVsYXlVcykgewogICAgICAgICAgICAgICAgICAgICBkZWxheVVzID0ga01heE1vbml0b3JEZWxheVVzOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBTE9HVigic2VxdWVuY2UgbnVtYmVyIGhpZ2g6ICVsZCBmcm9tICglbGQgLi4gJWxkKSwgbW9uaXRvciBpbiAlbGxkIChyZXRyeT0lZCkiLAorICAgICAgICAgICAgICAgIEFMT0dWKCJzZXF1ZW5jZSBudW1iZXIgaGlnaDogJWQgZnJvbSAoJWQgLi4gJWQpLCAiCisgICAgICAgICAgICAgICAgICAgICAgIm1vbml0b3IgaW4gJSIgUFJJZDY0ICIgKHJldHJ5PSVkKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBtU2VxTnVtYmVyLCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCwgZGVsYXlVcywgbU51bVJldHJpZXMpOwogICAgICAgICAgICAgICAgIHBvc3RNb25pdG9yUXVldWUoZGVsYXlVcyk7CkBAIC03ODksMTQgKzgyMCwxNCBAQAogICAgICAgICAgICAgaWYgKG1TZXFOdW1iZXIgPCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QpIHsKICAgICAgICAgICAgICAgICBtU2VxTnVtYmVyID0gZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0OwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZXhwbGljaXREaXNjb250aW51aXR5ID0gdHJ1ZTsKKyAgICAgICAgICAgIGRpc2NvbnRpbnVpdHkgPSB0cnVlOwogCiAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dFKCJDYW5ub3QgZmluZCBzZXF1ZW5jZSBudW1iZXIgJWQgaW4gcGxheWxpc3QgIgogICAgICAgICAgICAgICAgICAiKGNvbnRhaW5zICVkIC0gJWQpIiwKICAgICAgICAgICAgICAgICAgbVNlcU51bWJlciwgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0LAotICAgICAgICAgICAgICAgICBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgKyBtUGxheWxpc3QtPnNpemUoKSAtIDEpOworICAgICAgICAgICAgICAgICAgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0ICsgKGludDMyX3QpbVBsYXlsaXN0LT5zaXplKCkgLSAxKTsKIAogICAgICAgICAgICAgbm90aWZ5RXJyb3IoRVJST1JfRU5EX09GX1NUUkVBTSk7CiAgICAgICAgICAgICByZXR1cm47CkBAIC04MTQsNyArODQ1LDggQEAKIAogICAgIGludDMyX3QgdmFsOwogICAgIGlmIChpdGVtTWV0YS0+ZmluZEludDMyKCJkaXNjb250aW51aXR5IiwgJnZhbCkgJiYgdmFsICE9IDApIHsKLSAgICAgICAgZXhwbGljaXREaXNjb250aW51aXR5ID0gdHJ1ZTsKKyAgICAgICAgbURpc2NvbnRpbnVpdHlTZXErKzsKKyAgICAgICAgZGlzY29udGludWl0eSA9IHRydWU7CiAgICAgfQogCiAgICAgaW50NjRfdCByYW5nZV9vZmZzZXQsIHJhbmdlX2xlbmd0aDsKQEAgLTg0NSw2ICs4NzcsNyBAQAogICAgIH0KIAogICAgIC8vIGJsb2NrLXdpc2UgZG93bmxvYWQKKyAgICBib29sIHN0YXJ0dXAgPSBtU3RhcnR1cDsKICAgICBzc2l6ZV90IGJ5dGVzUmVhZDsKICAgICBkbyB7CiAgICAgICAgIGJ5dGVzUmVhZCA9IG1TZXNzaW9uLT5mZXRjaEZpbGUoCkBAIC04NzQsNyArOTA3LDcgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChtU3RhcnR1cCB8fCBzZWVrRGlzY29udGludWl0eSB8fCBleHBsaWNpdERpc2NvbnRpbnVpdHkpIHsKKyAgICAgICAgaWYgKHN0YXJ0dXAgfHwgZGlzY29udGludWl0eSkgewogICAgICAgICAgICAgLy8gU2lnbmFsIGRpc2NvbnRpbnVpdHkuCiAKICAgICAgICAgICAgIGlmIChtUGxheWxpc3QtPmlzQ29tcGxldGUoKSB8fCBtUGxheWxpc3QtPmlzRXZlbnQoKSkgewpAQCAtODg0LDE2ICs5MTcsMTcgQEAKICAgICAgICAgICAgICAgICBtTmV4dFBUU1RpbWVVcyA9IGdldFNlZ21lbnRTdGFydFRpbWVVcyhtU2VxTnVtYmVyKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHNlZWtEaXNjb250aW51aXR5IHx8IGV4cGxpY2l0RGlzY29udGludWl0eSkgewotICAgICAgICAgICAgICAgIEFMT0dJKCJxdWV1ZWluZyBkaXNjb250aW51aXR5IChzZWVrPSVkLCBleHBsaWNpdD0lZCkiLAotICAgICAgICAgICAgICAgICAgICAgc2Vla0Rpc2NvbnRpbnVpdHksIGV4cGxpY2l0RGlzY29udGludWl0eSk7CisgICAgICAgICAgICBpZiAoZGlzY29udGludWl0eSkgeworICAgICAgICAgICAgICAgIEFMT0dJKCJxdWV1ZWluZyBkaXNjb250aW51aXR5IChleHBsaWNpdD0lZCkiLCBkaXNjb250aW51aXR5KTsKIAogICAgICAgICAgICAgICAgIHF1ZXVlRGlzY29udGludWl0eSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4cGxpY2l0RGlzY29udGludWl0eQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX0ZPUk1BVENIQU5HRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX1NFRUssCisgICAgICAgICAgICAgICAgICAgICAgICBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfRk9STUFUQ0hBTkdFLAogICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAvKiBleHRyYSAqLyk7CisKKyAgICAgICAgICAgICAgICBkaXNjb250aW51aXR5ID0gZmFsc2U7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXJ0dXAgPSBmYWxzZTsKICAgICAgICAgfQogCiAgICAgICAgIGVyciA9IE9LOwpAQCAtOTEzLDIzICs5NDcsMTkgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChlcnIgPT0gLUVBR0FJTikgewotICAgICAgICAgICAgLy8gYmFkIHN0YXJ0aW5nIHNlcXVlbmNlIG51bWJlciBoaW50CisgICAgICAgICAgICAvLyBzdGFydGluZyBzZXF1ZW5jZSBudW1iZXIgdG9vIGxvdy9oaWdoCisgICAgICAgICAgICBtVFNQYXJzZXIuY2xlYXIoKTsKICAgICAgICAgICAgIHBvc3RNb25pdG9yUXVldWUoKTsKICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlcnIgPT0gRVJST1JfT1VUX09GX1JBTkdFKSB7CisgICAgICAgIH0gZWxzZSBpZiAoZXJyID09IEVSUk9SX09VVF9PRl9SQU5HRSkgewogICAgICAgICAgICAgLy8gcmVhY2hlZCBzdG9wcGluZyBwb2ludAotICAgICAgICAgICAgc3RvcEFzeW5jKC8qIHNlbGZUcmlnZ2VyZWQgPSAqLyB0cnVlKTsKKyAgICAgICAgICAgIHN0b3BBc3luYygvKiBjbGVhciA9ICovIGZhbHNlKTsKICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgfSBlbHNlIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIG5vdGlmeUVycm9yKGVycik7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBtU3RhcnR1cCA9IGZhbHNlOwogICAgIH0gd2hpbGUgKGJ5dGVzUmVhZCAhPSAwKTsKIAogICAgIGlmIChidWZmZXJTdGFydHNXaXRoVHNTeW5jQnl0ZShidWZmZXIpKSB7CkBAIC05ODEsNyArMTAxMSwxNiBAQAogCiAgICAgLy8gYnVsayBleHRyYWN0IG5vbi10cyBmaWxlcwogICAgIGlmICh0c0J1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICBlcnIgPSBleHRyYWN0QW5kUXVldWVBY2Nlc3NVbml0cyhidWZmZXIsIGl0ZW1NZXRhKTsKKyAgICAgICAgZXJyID0gZXh0cmFjdEFuZFF1ZXVlQWNjZXNzVW5pdHMoYnVmZmVyLCBpdGVtTWV0YSk7CisgICAgICAgIGlmIChlcnIgPT0gLUVBR0FJTikgeworICAgICAgICAgICAgLy8gc3RhcnRpbmcgc2VxdWVuY2UgbnVtYmVyIHRvbyBsb3cvaGlnaAorICAgICAgICAgICAgcG9zdE1vbml0b3JRdWV1ZSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBFUlJPUl9PVVRfT0ZfUkFOR0UpIHsKKyAgICAgICAgICAgIC8vIHJlYWNoZWQgc3RvcHBpbmcgcG9pbnQKKyAgICAgICAgICAgIHN0b3BBc3luYygvKiBjbGVhciA9ICovZmFsc2UpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKGVyciAhPSBPSykgewpAQCAtOTk0LDYgKzEwMzMsNjYgQEAKICAgICBwb3N0TW9uaXRvclF1ZXVlKCk7CiB9CiAKK2ludDMyX3QgUGxheWxpc3RGZXRjaGVyOjpnZXRTZXFOdW1iZXJXaXRoQW5jaG9yVGltZShpbnQ2NF90IGFuY2hvclRpbWVVcykgY29uc3QgeworICAgIGludDMyX3QgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0LCBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdDsKKyAgICBpZiAobVBsYXlsaXN0LT5tZXRhKCkgPT0gTlVMTAorICAgICAgICAgICAgfHwgIW1QbGF5bGlzdC0+bWV0YSgpLT5maW5kSW50MzIoIm1lZGlhLXNlcXVlbmNlIiwgJmZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCkpIHsKKyAgICAgICAgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0ID0gMDsKKyAgICB9CisgICAgbGFzdFNlcU51bWJlckluUGxheWxpc3QgPSBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgKyBtUGxheWxpc3QtPnNpemUoKSAtIDE7CisKKyAgICBpbnQzMl90IGluZGV4ID0gbVNlcU51bWJlciAtIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCAtIDE7CisgICAgd2hpbGUgKGluZGV4ID49IDAgJiYgYW5jaG9yVGltZVVzID4gbVN0YXJ0VGltZVVzKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBpdGVtTWV0YTsKKyAgICAgICAgQ0hFQ0sobVBsYXlsaXN0LT5pdGVtQXQoaW5kZXgsIE5VTEwgLyogdXJpICovLCAmaXRlbU1ldGEpKTsKKworICAgICAgICBpbnQ2NF90IGl0ZW1EdXJhdGlvblVzOworICAgICAgICBDSEVDSyhpdGVtTWV0YS0+ZmluZEludDY0KCJkdXJhdGlvblVzIiwgJml0ZW1EdXJhdGlvblVzKSk7CisKKyAgICAgICAgYW5jaG9yVGltZVVzIC09IGl0ZW1EdXJhdGlvblVzOworICAgICAgICAtLWluZGV4OworICAgIH0KKworICAgIGludDMyX3QgbmV3U2VxTnVtYmVyID0gZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0ICsgaW5kZXggKyAxOworICAgIGlmIChuZXdTZXFOdW1iZXIgPD0gbGFzdFNlcU51bWJlckluUGxheWxpc3QpIHsKKyAgICAgICAgcmV0dXJuIG5ld1NlcU51bWJlcjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbGFzdFNlcU51bWJlckluUGxheWxpc3Q7CisgICAgfQorfQorCitpbnQzMl90IFBsYXlsaXN0RmV0Y2hlcjo6Z2V0U2VxTnVtYmVyRm9yRGlzY29udGludWl0eShzaXplX3QgZGlzY29udGludWl0eVNlcSkgY29uc3QgeworICAgIGludDMyX3QgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0OworICAgIGlmIChtUGxheWxpc3QtPm1ldGEoKSA9PSBOVUxMCisgICAgICAgICAgICB8fCAhbVBsYXlsaXN0LT5tZXRhKCktPmZpbmRJbnQzMigibWVkaWEtc2VxdWVuY2UiLCAmZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0KSkgeworICAgICAgICBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgPSAwOworICAgIH0KKworICAgIHNpemVfdCBjdXJEaXNjb250aW51aXR5U2VxID0gbVBsYXlsaXN0LT5nZXREaXNjb250aW51aXR5U2VxKCk7CisgICAgaWYgKGRpc2NvbnRpbnVpdHlTZXEgPCBjdXJEaXNjb250aW51aXR5U2VxKSB7CisgICAgICAgIHJldHVybiBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgPD0gMCA/IDAgOiAoZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0IC0gMSk7CisgICAgfQorCisgICAgc2l6ZV90IGluZGV4ID0gMDsKKyAgICB3aGlsZSAoaW5kZXggPCBtUGxheWxpc3QtPnNpemUoKSkgeworICAgICAgICBzcDxBTWVzc2FnZT4gaXRlbU1ldGE7CisgICAgICAgIENIRUNLKG1QbGF5bGlzdC0+aXRlbUF0KCBpbmRleCwgTlVMTCAvKiB1cmkgKi8sICZpdGVtTWV0YSkpOworCisgICAgICAgIGludDY0X3QgZGlzY29udGludWl0eTsKKyAgICAgICAgaWYgKGl0ZW1NZXRhLT5maW5kSW50NjQoImRpc2NvbnRpbnVpdHkiLCAmZGlzY29udGludWl0eSkpIHsKKyAgICAgICAgICAgIGN1ckRpc2NvbnRpbnVpdHlTZXErKzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjdXJEaXNjb250aW51aXR5U2VxID09IGRpc2NvbnRpbnVpdHlTZXEpIHsKKyAgICAgICAgICAgIHJldHVybiBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgKyBpbmRleDsKKyAgICAgICAgfQorCisgICAgICAgICsraW5kZXg7CisgICAgfQorCisgICAgcmV0dXJuIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCArIG1QbGF5bGlzdC0+c2l6ZSgpOworfQorCiBpbnQzMl90IFBsYXlsaXN0RmV0Y2hlcjo6Z2V0U2VxTnVtYmVyRm9yVGltZShpbnQ2NF90IHRpbWVVcykgY29uc3QgewogICAgIGludDMyX3QgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0OwogICAgIGlmIChtUGxheWxpc3QtPm1ldGEoKSA9PSBOVUxMIHx8ICFtUGxheWxpc3QtPm1ldGEoKS0+ZmluZEludDMyKApAQCAtMTAyNiw2ICsxMTI1LDIzIEBACiAgICAgcmV0dXJuIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCArIGluZGV4OwogfQogCitjb25zdCBzcDxBQnVmZmVyPiAmUGxheWxpc3RGZXRjaGVyOjpzZXRBY2Nlc3NVbml0UHJvcGVydGllcygKKyAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQsIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZzb3VyY2UsIGJvb2wgZGlzY2FyZCkgeworICAgIHNwPE1ldGFEYXRhPiBmb3JtYXQgPSBzb3VyY2UtPmdldEZvcm1hdCgpOworICAgIGlmIChmb3JtYXQgIT0gTlVMTCkgeworICAgICAgICAvLyBmb3Igc2ltcGxpY2l0eSwgc3RvcmUgYSByZWZlcmVuY2UgdG8gdGhlIGZvcm1hdCBpbiBlYWNoIHVuaXQKKyAgICAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRPYmplY3QoImZvcm1hdCIsIGZvcm1hdCk7CisgICAgfQorCisgICAgaWYgKGRpc2NhcmQpIHsKKyAgICAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigiZGlzY2FyZCIsIGRpc2NhcmQpOworICAgIH0KKworICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50MzIoImRpc2NvbnRpbnVpdHlTZXEiLCBtRGlzY29udGludWl0eVNlcSk7CisgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQ2NCgic2VnbWVudFN0YXJ0VGltZVVzIiwgZ2V0U2VnbWVudFN0YXJ0VGltZVVzKG1TZXFOdW1iZXIpKTsKKyAgICByZXR1cm4gYWNjZXNzVW5pdDsKK30KKwogc3RhdHVzX3QgUGxheWxpc3RGZXRjaGVyOjpleHRyYWN0QW5kUXVldWVBY2Nlc3NVbml0c0Zyb21Ucyhjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CiAgICAgaWYgKG1UU1BhcnNlciA9PSBOVUxMKSB7CiAgICAgICAgIC8vIFVzZSBUU19USU1FU1RBTVBTX0FSRV9BQlNPTFVURSBzbyBwdHMgY2Fycnkgb3ZlciBiZXR3ZWVuIGZldGNoZXJzLgpAQCAtMTA0MSw3ICsxMTU3LDkgQEAKICAgICAgICAgbVRTUGFyc2VyLT5zaWduYWxEaXNjb250aW51aXR5KAogICAgICAgICAgICAgICAgIEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9TRUVLLCBleHRyYSk7CiAKKyAgICAgICAgbUFic29sdXRlVGltZUFuY2hvclVzID0gbU5leHRQVFNUaW1lVXM7CiAgICAgICAgIG1OZXh0UFRTVGltZVVzID0gLTFsbDsKKyAgICAgICAgbUZpcnN0UFRTVmFsaWQgPSBmYWxzZTsKICAgICB9CiAKICAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKQEAgLTExMDEsNDMgKzEyMTksMTA4IEBACiAgICAgICAgICAgICAgICAgJiYgc291cmNlLT5kZXF1ZXVlQWNjZXNzVW5pdCgmYWNjZXNzVW5pdCkgPT0gT0spIHsKIAogICAgICAgICAgICAgQ0hFQ0soYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKLSAgICAgICAgICAgIGlmIChtTWluU3RhcnRUaW1lVXMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRpbWVVcyA8IG1NaW5TdGFydFRpbWVVcykgewotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIHVudGVzdGVkIHBhdGgKLSAgICAgICAgICAgICAgICAgICAgLy8gdHJ5IGEgbGF0ZXIgdHMKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0YXJnZXREdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgbVBsYXlsaXN0LT5tZXRhKCktPmZpbmRJbnQzMigidGFyZ2V0LWR1cmF0aW9uIiwgJnRhcmdldER1cmF0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbmNyID0gKG1NaW5TdGFydFRpbWVVcyAtIHRpbWVVcykgLyAxMDAwMDAwIC8gdGFyZ2V0RHVyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbmNyID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluY3JlbWVudCBtU2VxTnVtYmVyIGJ5IGF0IGxlYXN0IG9uZQotICAgICAgICAgICAgICAgICAgICAgICAgaW5jciA9IDE7CisKKyAgICAgICAgICAgIGlmIChtU3RhcnR1cCkgeworICAgICAgICAgICAgICAgIGlmICghbUZpcnN0UFRTVmFsaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbUZpcnN0VGltZVVzID0gdGltZVVzOworICAgICAgICAgICAgICAgICAgICBtRmlyc3RQVFNWYWxpZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtU3RhcnRUaW1lVXNSZWxhdGl2ZSkgeworICAgICAgICAgICAgICAgICAgICB0aW1lVXMgLT0gbUZpcnN0VGltZVVzOworICAgICAgICAgICAgICAgICAgICBpZiAodGltZVVzIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGltZVVzID0gMDsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtU2VxTnVtYmVyICs9IGluY3I7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IC1FQUdBSU47Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGludDY0X3Qgc3RhcnRUaW1lVXM7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtU3RhcnRUaW1lVXNOb3RpZnkgIT0gTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFtU3RhcnRUaW1lVXNOb3RpZnktPmZpbmRJbnQ2NChrZXksICZzdGFydFRpbWVVcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+c2V0SW50NjQoa2V5LCB0aW1lVXMpOworICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyZWFtTWFzayA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnktPmZpbmRJbnQzMigic3RyZWFtTWFzayIsIChpbnQzMl90ICopICZzdHJlYW1NYXNrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbU1hc2sgfD0gbVBhY2tldFNvdXJjZXMua2V5QXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnktPnNldEludDMyKCJzdHJlYW1NYXNrIiwgc3RyZWFtTWFzayk7CisgICAgICAgICAgICAgICAgaWYgKHRpbWVVcyA8IG1TdGFydFRpbWVVcykgeworICAgICAgICAgICAgICAgICAgICAvLyBidWZmZXIgdXAgdG8gdGhlIGNsb3Nlc3QgcHJlY2VkaW5nIElEUiBmcmFtZQorICAgICAgICAgICAgICAgICAgICBBTE9HVigidGltZVVzICUiIFBSSWQ2NCAiIHVzIDwgbVN0YXJ0VGltZVVzICUiIFBSSWQ2NCAiIHVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lVXMsIG1TdGFydFRpbWVVcyk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgICAgICAgICAgICAgICAgIHNwPE1ldGFEYXRhPiBmb3JtYXQgID0gc291cmNlLT5nZXRGb3JtYXQoKTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0F2YyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ICE9IE5VTEwgJiYgZm9ybWF0LT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzQXZjID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoaXNBdmMgJiYgSXNJRFIoYWNjZXNzVW5pdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1WaWRlb0J1ZmZlci0+Y2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoaXNBdmMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1WaWRlb0J1ZmZlci0+cXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOworICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1NYXNrID09IG1TdHJlYW1UeXBlTWFzaykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+cG9zdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENIRUNLKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CisgICAgICAgICAgICBpZiAobVN0YXJ0VGltZVVzTm90aWZ5ICE9IE5VTEwgJiYgdGltZVVzID4gbVN0YXJ0VGltZVVzKSB7CisKKyAgICAgICAgICAgICAgICBpbnQzMl90IHRhcmdldER1cmF0aW9uU2VjczsKKyAgICAgICAgICAgICAgICBDSEVDSyhtUGxheWxpc3QtPm1ldGEoKS0+ZmluZEludDMyKCJ0YXJnZXQtZHVyYXRpb24iLCAmdGFyZ2V0RHVyYXRpb25TZWNzKSk7CisgICAgICAgICAgICAgICAgaW50NjRfdCB0YXJnZXREdXJhdGlvblVzID0gdGFyZ2V0RHVyYXRpb25TZWNzICogMTAwMDAwMGxsOworICAgICAgICAgICAgICAgIC8vIG1TdGFydHVwCisgICAgICAgICAgICAgICAgLy8gICBtU3RhcnR1cCBpcyB0cnVlIHVudGlsIHdlIGhhdmUgcXVldWVkIGEgcGFja2V0IGZvciBhbGwgdGhlIHN0cmVhbXMKKyAgICAgICAgICAgICAgICAvLyAgIHdlIGFyZSBmZXRjaGluZy4gV2UgcXVldWUgcGFja2V0cyB3aG9zZSB0aW1lc3RhbXBzIGFyZSBncmVhdGVyIHRoYW4KKyAgICAgICAgICAgICAgICAvLyAgIG1TdGFydFRpbWVVcy4KKyAgICAgICAgICAgICAgICAvLyBtU2VnbWVudFN0YXJ0VGltZVVzID49IDAKKyAgICAgICAgICAgICAgICAvLyAgIG1TZWdtZW50U3RhcnRUaW1lVXMgaXMgbm9uLW5lZ2F0aXZlIHdoZW4gYWRhcHRpbmcgb3Igc3dpdGNoaW5nIHRyYWNrcworICAgICAgICAgICAgICAgIC8vIHRpbWVVcyAtIG1TdGFydFRpbWVVcyA+IHRhcmdldER1cmF0aW9uVXM6CisgICAgICAgICAgICAgICAgLy8gICBUaGlzIGFuZCB0aGUgMiBhYm92ZSBjb25kaXRpb25zIHNob3VsZCBvbmx5IGhhcHBlbiB3aGVuIGFkYXB0aW5nIGluIGEgbGl2ZQorICAgICAgICAgICAgICAgIC8vICAgc3RyZWFtOyB0aGUgb2xkIGZldGNoZXIgaGFzIGFscmVhZHkgZmV0Y2hlZCB0byBtU3RhcnRUaW1lVXM7IHRoZSBuZXcgZmV0Y2hlcgorICAgICAgICAgICAgICAgIC8vICAgd291bGQgc3RhcnQgZmV0Y2hpbmcgYWZ0ZXIgdGltZVVzLCB3aGljaCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIG1TdGFydFRpbWVVczsKKyAgICAgICAgICAgICAgICAvLyAgIHRoZSBvbGQgZmV0Y2hlciB3b3VsZCB0aGVuIGNvbnRpbnVlIGZldGNoaW5nIGRhdGEgdW50aWwgdGltZVVzLiBXZSBkb24ndCB3YW50CisgICAgICAgICAgICAgICAgLy8gICB0aW1lVXMgdG8gYmUgdG9vIGZhciBhaGVhZCBvZiBtU3RhcnRUaW1lVXMgYmVjYXVzZSB3ZSB3YW50IHRoZSBvbGQgZmV0Y2hlciB0bworICAgICAgICAgICAgICAgIC8vICAgc3RvcCBhcyBlYXJseSBhcyBwb3NzaWJsZS4gVGhlIGRlZmluaXRpb24gb2YgYmVpbmcgInRvbyBmYXIgYWhlYWQiIGlzCisgICAgICAgICAgICAgICAgLy8gICBhcmJpdHJhcnk7IGhlcmUgd2UgdXNlIHRhcmdldER1cmF0aW9uVXMgYXMgdGhyZXNob2xkLgorICAgICAgICAgICAgICAgIGlmIChtU3RhcnR1cCAmJiBtU2VnbWVudFN0YXJ0VGltZVVzID49IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHRpbWVVcyAtIG1TdGFydFRpbWVVcyA+IHRhcmdldER1cmF0aW9uVXMpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UganVzdCBndWVzc2VkIGEgc3RhcnRpbmcgdGltZXN0YW1wIHRoYXQgaXMgdG9vIGhpZ2ggd2hlbiBhZGFwdGluZyBpbiBhCisgICAgICAgICAgICAgICAgICAgIC8vIGxpdmUgc3RyZWFtOyByZS1hZGp1c3QgYmFzZWQgb24gdGhlIGFjdHVhbCB0aW1lc3RhbXAgZXh0cmFjdGVkIGZyb20gdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIG1lZGlhIHNlZ21lbnQ7IGlmIHdlIGRpZG4ndCBtb3ZlIGJhY2t3YXJkIGFmdGVyIHRoZSByZS1hZGp1c3RtZW50CisgICAgICAgICAgICAgICAgICAgIC8vIChuZXdTZXFOdW1iZXIpLCBzdGFydCBhdCBsZWFzdCAxIHNlZ21lbnQgcHJpb3IuCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbmV3U2VxTnVtYmVyID0gZ2V0U2VxTnVtYmVyV2l0aEFuY2hvclRpbWUodGltZVVzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1NlcU51bWJlciA+PSBtU2VxTnVtYmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAtLW1TZXFOdW1iZXI7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2VxTnVtYmVyID0gbmV3U2VxTnVtYmVyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRTdGFydGVkQXQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVBR0FJTjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQzMl90IHNlcTsKKyAgICAgICAgICAgICAgICBpZiAoIW1TdGFydFRpbWVVc05vdGlmeS0+ZmluZEludDMyKCJkaXNjb250aW51aXR5U2VxIiwgJnNlcSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5zZXRJbnQzMigiZGlzY29udGludWl0eVNlcSIsIG1EaXNjb250aW51aXR5U2VxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50NjRfdCBzdGFydFRpbWVVczsKKyAgICAgICAgICAgICAgICBpZiAoIW1TdGFydFRpbWVVc05vdGlmeS0+ZmluZEludDY0KGtleSwgJnN0YXJ0VGltZVVzKSkgeworICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnktPnNldEludDY0KGtleSwgdGltZVVzKTsKKworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJlYW1NYXNrID0gMDsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5maW5kSW50MzIoInN0cmVhbU1hc2siLCAoaW50MzJfdCAqKSAmc3RyZWFtTWFzayk7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbU1hc2sgfD0gbVBhY2tldFNvdXJjZXMua2V5QXQoaSk7CisgICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+c2V0SW50MzIoInN0cmVhbU1hc2siLCBzdHJlYW1NYXNrKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtTWFzayA9PSBtU3RyZWFtVHlwZU1hc2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydHVwID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobVN0b3BQYXJhbXMgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIC8vIFF1ZXVlIGRpc2NvbnRpbnVpdHkgaW4gb3JpZ2luYWwgc3RyZWFtLgorICAgICAgICAgICAgICAgIGludDMyX3QgZGlzY29udGludWl0eVNlcTsKICAgICAgICAgICAgICAgICBpbnQ2NF90IHN0b3BUaW1lVXM7Ci0gICAgICAgICAgICAgICAgaWYgKCFtU3RvcFBhcmFtcy0+ZmluZEludDY0KGtleSwgJnN0b3BUaW1lVXMpIHx8IHRpbWVVcyA+PSBzdG9wVGltZVVzKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtU3RvcFBhcmFtcy0+ZmluZEludDMyKCJkaXNjb250aW51aXR5U2VxIiwgJmRpc2NvbnRpbnVpdHlTZXEpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBkaXNjb250aW51aXR5U2VxID4gbURpc2NvbnRpbnVpdHlTZXEKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFtU3RvcFBhcmFtcy0+ZmluZEludDY0KGtleSwgJnN0b3BUaW1lVXMpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoZGlzY29udGludWl0eVNlcSA9PSBtRGlzY29udGludWl0eVNlcQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0aW1lVXMgPj0gc3RvcFRpbWVVcykpIHsKICAgICAgICAgICAgICAgICAgICAgcGFja2V0U291cmNlLT5xdWV1ZUFjY2Vzc1VuaXQobVNlc3Npb24tPmNyZWF0ZUZvcm1hdENoYW5nZUJ1ZmZlcigpKTsKICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbVR5cGVNYXNrICY9IH5zdHJlYW07CiAgICAgICAgICAgICAgICAgICAgIG1QYWNrZXRTb3VyY2VzLnJlbW92ZUl0ZW1zQXQoaSk7CkBAIC0xMTQ2LDE1ICsxMzI5LDE4IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBkbyBOT1QgZGVxdWV1ZSBhbnkgZGlzY29udGludWl0aWVzIGV4Y2VwdCBmb3IgZm9ybWF0IGNoYW5nZS4KLQotICAgICAgICAgICAgLy8gZm9yIHNpbXBsaWNpdHksIHN0b3JlIGEgcmVmZXJlbmNlIHRvIHRoZSBmb3JtYXQgaW4gZWFjaCB1bml0Ci0gICAgICAgICAgICBzcDxNZXRhRGF0YT4gZm9ybWF0ID0gc291cmNlLT5nZXRGb3JtYXQoKTsKLSAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0T2JqZWN0KCJmb3JtYXQiLCBmb3JtYXQpOworICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9WSURFTykgeworICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgZGlzY2FyZCA9IHRydWU7CisgICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgICAgICAgICAgICAgIHdoaWxlIChtVmlkZW9CdWZmZXItPmhhc0J1ZmZlckF2YWlsYWJsZSgmc3RhdHVzKSkgeworICAgICAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiB2aWRlb0J1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyLT5kZXF1ZXVlQWNjZXNzVW5pdCgmdmlkZW9CdWZmZXIpOworICAgICAgICAgICAgICAgICAgICBzZXRBY2Nlc3NVbml0UHJvcGVydGllcyh2aWRlb0J1ZmZlciwgc291cmNlLCBkaXNjYXJkKTsKKyAgICAgICAgICAgICAgICAgICAgcGFja2V0U291cmNlLT5xdWV1ZUFjY2Vzc1VuaXQodmlkZW9CdWZmZXIpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gU3Rhc2ggdGhlIHNlcXVlbmNlIG51bWJlciBzbyB3ZSBjYW4gaGludCBmdXR1cmUgcGxheWxpc3Qgd2hlcmUgdG8gc3RhcnQgYXQuCi0gICAgICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDMyKCJzZXEiLCBtU2VxTnVtYmVyKTsKKyAgICAgICAgICAgIHNldEFjY2Vzc1VuaXRQcm9wZXJ0aWVzKGFjY2Vzc1VuaXQsIHNvdXJjZSk7CiAgICAgICAgICAgICBwYWNrZXRTb3VyY2UtPnF1ZXVlQWNjZXNzVW5pdChhY2Nlc3NVbml0KTsKICAgICAgICAgfQogCkBAIC0xMTgwLDkgKzEzNjYsMzUgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKKy8qIHN0YXRpYyAqLworYm9vbCBQbGF5bGlzdEZldGNoZXI6OmJ1ZmZlclN0YXJ0c1dpdGhXZWJWVFRNYWdpY1NlcXVlbmNlKAorICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgc2l6ZV90IHBvcyA9IDA7CisKKyAgICAvLyBza2lwIHBvc3NpYmxlIEJPTQorICAgIGlmIChidWZmZXItPnNpemUoKSA+PSBwb3MgKyAzICYmCisgICAgICAgICAgICAhbWVtY21wKCJceGVmXHhiYlx4YmYiLCBidWZmZXItPmRhdGEoKSArIHBvcywgMykpIHsKKyAgICAgICAgcG9zICs9IDM7CisgICAgfQorCisgICAgLy8gYWNjZXB0IFdFQlZUVCBmb2xsb3dlZCBieSBTUEFDRSwgVEFCIG9yIChDUikgTEYKKyAgICBpZiAoYnVmZmVyLT5zaXplKCkgPCBwb3MgKyA2IHx8CisgICAgICAgICAgICBtZW1jbXAoIldFQlZUVCIsIGJ1ZmZlci0+ZGF0YSgpICsgcG9zLCA2KSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHBvcyArPSA2OworCisgICAgaWYgKGJ1ZmZlci0+c2l6ZSgpID09IHBvcykgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB1aW50OF90IHNlcCA9IGJ1ZmZlci0+ZGF0YSgpW3Bvc107CisgICAgcmV0dXJuIHNlcCA9PSAnICcgfHwgc2VwID09ICdcdCcgfHwgc2VwID09ICdcbicgfHwgc2VwID09ICdccic7Cit9CisKIHN0YXR1c190IFBsYXlsaXN0RmV0Y2hlcjo6ZXh0cmFjdEFuZFF1ZXVlQWNjZXNzVW5pdHMoCiAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIsIGNvbnN0IHNwPEFNZXNzYWdlPiAmaXRlbU1ldGEpIHsKLSAgICBpZiAoYnVmZmVyLT5zaXplKCkgPj0gNyAmJiAhbWVtY21wKCJXRUJWVFRcbiIsIGJ1ZmZlci0+ZGF0YSgpLCA3KSkgeworICAgIGlmIChidWZmZXJTdGFydHNXaXRoV2ViVlRUTWFnaWNTZXF1ZW5jZShidWZmZXIpKSB7CiAgICAgICAgIGlmIChtU3RyZWFtVHlwZU1hc2sgIT0gTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfU1VCVElUTEVTKSB7CiAgICAgICAgICAgICBBTE9HRSgiVGhpcyBzdHJlYW0gb25seSBjb250YWlucyBzdWJ0aXRsZXMuIik7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwpAQCAtMTE5NSw3ICsxNDA3LDkgQEAKICAgICAgICAgQ0hFQ0soaXRlbU1ldGEtPmZpbmRJbnQ2NCgiZHVyYXRpb25VcyIsICZkdXJhdGlvblVzKSk7CiAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgZ2V0U2VnbWVudFN0YXJ0VGltZVVzKG1TZXFOdW1iZXIpKTsKICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJkdXJhdGlvblVzIiwgZHVyYXRpb25Vcyk7Ci0gICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigic2VxIiwgbVNlcU51bWJlcik7CisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgic2VnbWVudFN0YXJ0VGltZVVzIiwgZ2V0U2VnbWVudFN0YXJ0VGltZVVzKG1TZXFOdW1iZXIpKTsKKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJkaXNjb250aW51aXR5U2VxIiwgbURpc2NvbnRpbnVpdHlTZXEpOworICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoInN1YnRpdGxlR2VuZXJhdGlvbiIsIG1TdWJ0aXRsZUdlbmVyYXRpb24pOwogCiAgICAgICAgIHBhY2tldFNvdXJjZS0+cXVldWVBY2Nlc3NVbml0KGJ1ZmZlcik7CiAgICAgICAgIHJldHVybiBPSzsKQEAgLTEyNjEsMTQgKzE0NzUsNiBAQAogICAgICAgICBmaXJzdElEM1RhZyA9IGZhbHNlOwogICAgIH0KIAotICAgIGlmICghbUZpcnN0UFRTVmFsaWQpIHsKLSAgICAgICAgbUZpcnN0UFRTVmFsaWQgPSB0cnVlOwotICAgICAgICBtRmlyc3RQVFMgPSBQVFM7Ci0gICAgfQotICAgIFBUUyAtPSBtRmlyc3RQVFM7Ci0KLSAgICBpbnQ2NF90IHRpbWVVcyA9IChQVFMgKiAxMDBsbCkgLyA5bGwgKyBtQWJzb2x1dGVUaW1lQW5jaG9yVXM7Ci0KICAgICBpZiAobVN0cmVhbVR5cGVNYXNrICE9IExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX0FVRElPKSB7CiAgICAgICAgIEFMT0dXKCJUaGlzIHN0cmVhbSBvbmx5IGNvbnRhaW5zIGF1ZGlvIGRhdGEhIik7CiAKQEAgLTEzMTEsNiArMTUxNywxMiBAQAogICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKICAgICBDSEVDSyhwYWNrZXRTb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVSYXRlKSk7CiAKKyAgICBpbnQ2NF90IHRpbWVVcyA9IChQVFMgKiAxMDBsbCkgLyA5bGw7CisgICAgaWYgKCFtRmlyc3RQVFNWYWxpZCkgeworICAgICAgICBtRmlyc3RQVFNWYWxpZCA9IHRydWU7CisgICAgICAgIG1GaXJzdFRpbWVVcyA9IHRpbWVVczsKKyAgICB9CisKICAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKICAgICB3aGlsZSAob2Zmc2V0IDwgYnVmZmVyLT5zaXplKCkpIHsKICAgICAgICAgY29uc3QgdWludDhfdCAqYWR0c0hlYWRlciA9IGJ1ZmZlci0+ZGF0YSgpICsgb2Zmc2V0OwpAQCAtMTMzNSwxOSArMTU0Nyw3MCBAQAogCiAgICAgICAgIENIRUNLX0xFKG9mZnNldCArIGFhY19mcmFtZV9sZW5ndGgsIGJ1ZmZlci0+c2l6ZSgpKTsKIAotICAgICAgICBzcDxBQnVmZmVyPiB1bml0ID0gbmV3IEFCdWZmZXIoYWFjX2ZyYW1lX2xlbmd0aCk7Ci0gICAgICAgIG1lbWNweSh1bml0LT5kYXRhKCksIGFkdHNIZWFkZXIsIGFhY19mcmFtZV9sZW5ndGgpOwotCiAgICAgICAgIGludDY0X3QgdW5pdFRpbWVVcyA9IHRpbWVVcyArIG51bVNhbXBsZXMgKiAxMDAwMDAwbGwgLyBzYW1wbGVSYXRlOwotICAgICAgICB1bml0LT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB1bml0VGltZVVzKTsKKyAgICAgICAgb2Zmc2V0ICs9IGFhY19mcmFtZV9sZW5ndGg7CiAKICAgICAgICAgLy8gRWFjaCBBQUMgZnJhbWUgZW5jb2RlcyAxMDI0IHNhbXBsZXMuCiAgICAgICAgIG51bVNhbXBsZXMgKz0gMTAyNDsKIAotICAgICAgICB1bml0LT5tZXRhKCktPnNldEludDMyKCJzZXEiLCBtU2VxTnVtYmVyKTsKLSAgICAgICAgcGFja2V0U291cmNlLT5xdWV1ZUFjY2Vzc1VuaXQodW5pdCk7CisgICAgICAgIGlmIChtU3RhcnR1cCkgeworICAgICAgICAgICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IHVuaXRUaW1lVXM7CisgICAgICAgICAgICBpZiAobVN0YXJ0VGltZVVzUmVsYXRpdmUpIHsKKyAgICAgICAgICAgICAgICBzdGFydFRpbWVVcyAtPSBtRmlyc3RUaW1lVXM7CisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0VGltZVVzICA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lVXMgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGFydFRpbWVVcyA8IG1TdGFydFRpbWVVcykgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQogCi0gICAgICAgIG9mZnNldCArPSBhYWNfZnJhbWVfbGVuZ3RoOworICAgICAgICAgICAgaWYgKG1TdGFydFRpbWVVc05vdGlmeSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCB0YXJnZXREdXJhdGlvblNlY3M7CisgICAgICAgICAgICAgICAgQ0hFQ0sobVBsYXlsaXN0LT5tZXRhKCktPmZpbmRJbnQzMigidGFyZ2V0LWR1cmF0aW9uIiwgJnRhcmdldER1cmF0aW9uU2VjcykpOworICAgICAgICAgICAgICAgIGludDY0X3QgdGFyZ2V0RHVyYXRpb25VcyA9IHRhcmdldER1cmF0aW9uU2VjcyAqIDEwMDAwMDBsbDsKKworICAgICAgICAgICAgICAgIC8vIER1cGxpY2F0ZWQgbG9naWMgZnJvbSBob3cgd2UgaGFuZGxlIC50cyBwbGF5bGlzdHMuCisgICAgICAgICAgICAgICAgaWYgKG1TdGFydHVwICYmIG1TZWdtZW50U3RhcnRUaW1lVXMgPj0gMAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGltZVVzIC0gbVN0YXJ0VGltZVVzID4gdGFyZ2V0RHVyYXRpb25VcykgeworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5ld1NlcU51bWJlciA9IGdldFNlcU51bWJlcldpdGhBbmNob3JUaW1lKHRpbWVVcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdTZXFOdW1iZXIgPj0gbVNlcU51bWJlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgLS1tU2VxTnVtYmVyOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbVNlcU51bWJlciA9IG5ld1NlcU51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVBR0FJTjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnktPnNldEludDY0KCJ0aW1lVXNBdWRpbyIsIHRpbWVVcyk7CisgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5zZXRJbnQzMigiZGlzY29udGludWl0eVNlcSIsIG1EaXNjb250aW51aXR5U2VxKTsKKyAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnktPnNldEludDMyKCJzdHJlYW1NYXNrIiwgTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfQVVESU8pOworICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+cG9zdCgpOworICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS5jbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG1TdG9wUGFyYW1zICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8vIFF1ZXVlIGRpc2NvbnRpbnVpdHkgaW4gb3JpZ2luYWwgc3RyZWFtLgorICAgICAgICAgICAgaW50MzJfdCBkaXNjb250aW51aXR5U2VxOworICAgICAgICAgICAgaW50NjRfdCBzdG9wVGltZVVzOworICAgICAgICAgICAgaWYgKCFtU3RvcFBhcmFtcy0+ZmluZEludDMyKCJkaXNjb250aW51aXR5U2VxIiwgJmRpc2NvbnRpbnVpdHlTZXEpCisgICAgICAgICAgICAgICAgICAgIHx8IGRpc2NvbnRpbnVpdHlTZXEgPiBtRGlzY29udGludWl0eVNlcQorICAgICAgICAgICAgICAgICAgICB8fCAhbVN0b3BQYXJhbXMtPmZpbmRJbnQ2NCgidGltZVVzQXVkaW8iLCAmc3RvcFRpbWVVcykKKyAgICAgICAgICAgICAgICAgICAgfHwgKGRpc2NvbnRpbnVpdHlTZXEgPT0gbURpc2NvbnRpbnVpdHlTZXEgJiYgdW5pdFRpbWVVcyA+PSBzdG9wVGltZVVzKSkgeworICAgICAgICAgICAgICAgIHBhY2tldFNvdXJjZS0+cXVldWVBY2Nlc3NVbml0KG1TZXNzaW9uLT5jcmVhdGVGb3JtYXRDaGFuZ2VCdWZmZXIoKSk7CisgICAgICAgICAgICAgICAgbVN0cmVhbVR5cGVNYXNrID0gMDsKKyAgICAgICAgICAgICAgICBtUGFja2V0U291cmNlcy5jbGVhcigpOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzcDxBQnVmZmVyPiB1bml0ID0gbmV3IEFCdWZmZXIoYWFjX2ZyYW1lX2xlbmd0aCk7CisgICAgICAgIG1lbWNweSh1bml0LT5kYXRhKCksIGFkdHNIZWFkZXIsIGFhY19mcmFtZV9sZW5ndGgpOworCisgICAgICAgIHVuaXQtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHVuaXRUaW1lVXMpOworICAgICAgICBzZXRBY2Nlc3NVbml0UHJvcGVydGllcyh1bml0LCBwYWNrZXRTb3VyY2UpOworICAgICAgICBwYWNrZXRTb3VyY2UtPnF1ZXVlQWNjZXNzVW5pdCh1bml0KTsKICAgICB9CiAKICAgICByZXR1cm4gT0s7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5oCmluZGV4IDdlMjE1MjMuLjc4YzM1OGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5oCkBAIC00OSw3ICs0OSw4IEBACiAgICAgUGxheWxpc3RGZXRjaGVyKAogICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCiAgICAgICAgICAgICBjb25zdCBzcDxMaXZlU2Vzc2lvbj4gJnNlc3Npb24sCi0gICAgICAgICAgICBjb25zdCBjaGFyICp1cmkpOworICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICAgICAgaW50MzJfdCBzdWJ0aXRsZUdlbmVyYXRpb24pOwogCiAgICAgc3A8RGF0YVNvdXJjZT4gZ2V0RGF0YVNvdXJjZSgpOwogCkBAIC01NywxNiArNTgsMjIgQEAKICAgICAgICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZhdWRpb1NvdXJjZSwKICAgICAgICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZ2aWRlb1NvdXJjZSwKICAgICAgICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZzdWJ0aXRsZVNvdXJjZSwKLSAgICAgICAgICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSAtMWxsLAotICAgICAgICAgICAgaW50NjRfdCBtaW5TdGFydFRpbWVVcyA9IDBsbCAvKiBzdGFydCBhZnRlciB0aGlzIHRpbWVzdGFtcCAqLywKLSAgICAgICAgICAgIGludDMyX3Qgc3RhcnRTZXFOdW1iZXJIaW50ID0gLTEgLyogdHJ5IHN0YXJ0aW5nIGF0IHRoaXMgc2VxdWVuY2UgbnVtYmVyICovKTsKKyAgICAgICAgICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSAtMWxsLCAgICAgICAgIC8vIHN0YXJ0aW5nIHRpbWVzdGFtcHMKKyAgICAgICAgICAgIGludDY0X3Qgc2VnbWVudFN0YXJ0VGltZVVzID0gLTFsbCwgLy8gc3RhcnRpbmcgcG9zaXRpb24gd2l0aGluIHBsYXlsaXN0CisgICAgICAgICAgICAvLyBzdGFydFRpbWVVcyE9c2VnbWVudFN0YXJ0VGltZVVzIG9ubHkgd2hlbiBwbGF5bGlzdCBpcyBsaXZlCisgICAgICAgICAgICBpbnQzMl90IHN0YXJ0RGlzY29udGludWl0eVNlcSA9IDAsCisgICAgICAgICAgICBib29sIGFkYXB0aXZlID0gZmFsc2UpOwogCiAgICAgdm9pZCBwYXVzZUFzeW5jKCk7CiAKLSAgICB2b2lkIHN0b3BBc3luYyhib29sIHNlbGZUcmlnZ2VyZWQgPSBmYWxzZSk7CisgICAgdm9pZCBzdG9wQXN5bmMoYm9vbCBjbGVhciA9IHRydWUpOwogCiAgICAgdm9pZCByZXN1bWVVbnRpbEFzeW5jKGNvbnN0IHNwPEFNZXNzYWdlPiAmcGFyYW1zKTsKIAorICAgIHVpbnQzMl90IGdldFN0cmVhbVR5cGVNYXNrKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVN0cmVhbVR5cGVNYXNrOworICAgIH0KKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgflBsYXlsaXN0RmV0Y2hlcigpOwogICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CkBAIC05MSw2ICs5OCw3IEBACiAgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga051bVNraXBGcmFtZXM7CiAKICAgICBzdGF0aWMgYm9vbCBidWZmZXJTdGFydHNXaXRoVHNTeW5jQnl0ZShjb25zdCBzcDxBQnVmZmVyPiYgYnVmZmVyKTsKKyAgICBzdGF0aWMgYm9vbCBidWZmZXJTdGFydHNXaXRoV2ViVlRUTWFnaWNTZXF1ZW5jZShjb25zdCBzcDxBQnVmZmVyPiYgYnVmZmVyKTsKIAogICAgIC8vIG5vdGlmaWNhdGlvbnMgdG8gbVNlc3Npb24KICAgICBzcDxBTWVzc2FnZT4gbU5vdGlmeTsKQEAgLTEwMSw3ICsxMDksMTQgQEAKIAogICAgIHVpbnQzMl90IG1TdHJlYW1UeXBlTWFzazsKICAgICBpbnQ2NF90IG1TdGFydFRpbWVVczsKLSAgICBpbnQ2NF90IG1NaW5TdGFydFRpbWVVczsgLy8gc3RhcnQgZmV0Y2hpbmcgbm8gZWFybGllciB0aGFuIHRoaXMgdmFsdWUKKworICAgIC8vIFN0YXJ0IHRpbWUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlyc3Qgc2VnbWVudCBpbiB0aGUgaW5pdGlhbAorICAgIC8vIHBsYXlsaXN0LiBJdCdzIHZhbHVlIGlzIGluaXRpYWxpemVkIHRvIGEgbm9uLW5lZ2F0aXZlIHZhbHVlIG9ubHkgd2hlbiB3ZSBhcmUKKyAgICAvLyBhZGFwdGluZyBvciBzd2l0Y2hpbmcgdHJhY2tzLgorICAgIGludDY0X3QgbVNlZ21lbnRTdGFydFRpbWVVczsKKworICAgIHNzaXplX3QgbURpc2NvbnRpbnVpdHlTZXE7CisgICAgYm9vbCBtU3RhcnRUaW1lVXNSZWxhdGl2ZTsKICAgICBzcDxBTWVzc2FnZT4gbVN0b3BQYXJhbXM7IC8vIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgbGF0ZXN0IHRpbWVzdGFtcHMgd2Ugc2hvdWxkIGZldGNoLgogCiAgICAgS2V5ZWRWZWN0b3I8TGl2ZVNlc3Npb246OlN0cmVhbVR5cGUsIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ID4KQEAgLTExNCwxMCArMTI5LDEyIEBACiAgICAgaW50MzJfdCBtU2VxTnVtYmVyOwogICAgIGludDMyX3QgbU51bVJldHJpZXM7CiAgICAgYm9vbCBtU3RhcnR1cDsKKyAgICBib29sIG1BZGFwdGl2ZTsKICAgICBib29sIG1QcmVwYXJlZDsKICAgICBpbnQ2NF90IG1OZXh0UFRTVGltZVVzOwogCiAgICAgaW50MzJfdCBtTW9uaXRvclF1ZXVlR2VuZXJhdGlvbjsKKyAgICBjb25zdCBpbnQzMl90IG1TdWJ0aXRsZUdlbmVyYXRpb247CiAKICAgICBlbnVtIFJlZnJlc2hTdGF0ZSB7CiAgICAgICAgIElOSVRJQUxfTUlOSU1VTV9SRUxPQURfREVMQVksCkBAIC0xMzMsNyArMTUwLDkgQEAKIAogICAgIGJvb2wgbUZpcnN0UFRTVmFsaWQ7CiAgICAgdWludDY0X3QgbUZpcnN0UFRTOworICAgIGludDY0X3QgbUZpcnN0VGltZVVzOwogICAgIGludDY0X3QgbUFic29sdXRlVGltZUFuY2hvclVzOworICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IG1WaWRlb0J1ZmZlcjsKIAogICAgIC8vIFN0b3JlcyB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIHRvIGRlY3J5cHQgdGhlIG5leHQgYmxvY2sgb2YgY2lwaGVyIHRleHQsIHdoaWNoIGNhbgogICAgIC8vIGVpdGhlciBiZSBkZXJpdmVkIGZyb20gdGhlIHNlcXVlbmNlIG51bWJlciwgcmVhZCBmcm9tIHRoZSBtYW5pZmVzdCwgb3IgY29waWVkIGZyb20KQEAgLTE3Miw2ICsxOTEsMTAgQEAKICAgICAvLyBSZXN1bWUgYSBmZXRjaGVyIHRvIGNvbnRpbnVlIHVudGlsIHRoZSBzdG9wcGluZyBwb2ludCBzdG9yZWQgaW4gbXNnLgogICAgIHN0YXR1c190IG9uUmVzdW1lVW50aWwoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogCisgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJnNldEFjY2Vzc1VuaXRQcm9wZXJ0aWVzKAorICAgICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQsCisgICAgICAgICAgICBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmc291cmNlLAorICAgICAgICAgICAgYm9vbCBkaXNjYXJkID0gZmFsc2UpOwogICAgIHN0YXR1c190IGV4dHJhY3RBbmRRdWV1ZUFjY2Vzc1VuaXRzRnJvbVRzKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOwogCiAgICAgc3RhdHVzX3QgZXh0cmFjdEFuZFF1ZXVlQWNjZXNzVW5pdHMoCkBAIC0xODIsNiArMjA1LDggQEAKICAgICB2b2lkIHF1ZXVlRGlzY29udGludWl0eSgKICAgICAgICAgICAgIEFUU1BhcnNlcjo6RGlzY29udGludWl0eVR5cGUgdHlwZSwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZleHRyYSk7CiAKKyAgICBpbnQzMl90IGdldFNlcU51bWJlcldpdGhBbmNob3JUaW1lKGludDY0X3QgYW5jaG9yVGltZVVzKSBjb25zdDsKKyAgICBpbnQzMl90IGdldFNlcU51bWJlckZvckRpc2NvbnRpbnVpdHkoc2l6ZV90IGRpc2NvbnRpbnVpdHlTZXEpIGNvbnN0OwogICAgIGludDMyX3QgZ2V0U2VxTnVtYmVyRm9yVGltZShpbnQ2NF90IHRpbWVVcykgY29uc3Q7CiAKICAgICB2b2lkIHVwZGF0ZUR1cmF0aW9uKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9BbmRyb2lkLm1rCmluZGV4IGJmNmY3YmIuLjIxOTRjMzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9BbmRyb2lkLm1rCkBAIC00LDYgKzQsOCBAQAogTE9DQUxfU1JDX0ZJTEVTIDo9IFwKIAlJRDMuY3BwCiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIExPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9pZDMKIAogaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpAQCAtMTUsNiArMTcsOCBAQAogTE9DQUxfU1JDX0ZJTEVTIDo9IFwKIAl0ZXN0aWQzLmNwcAogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKIAlsaWJzdGFnZWZyaWdodCBsaWJ1dGlscyBsaWJsb2cgbGliYmluZGVyIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0lEMy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvSUQzLmNwcAppbmRleCBiMjVmYzRkLi5iMWI3NjFmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvSUQzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvSUQzLmNwcApAQCAtNDEsOSArNDEsOSBAQAogICAgIH0KIAogICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgICAgIG9mZjY0X3QgYXZhaWxhYmxlID0gKG9mZnNldCA+PSBtU2l6ZSkgPyAwbGwgOiBtU2l6ZSAtIG9mZnNldDsKKyAgICAgICAgb2ZmNjRfdCBhdmFpbGFibGUgPSAob2Zmc2V0ID49IChvZmY2NF90KW1TaXplKSA/IDBsbCA6IG1TaXplIC0gb2Zmc2V0OwogCi0gICAgICAgIHNpemVfdCBjb3B5ID0gKGF2YWlsYWJsZSA+IHNpemUpID8gc2l6ZSA6IGF2YWlsYWJsZTsKKyAgICAgICAgc2l6ZV90IGNvcHkgPSAoYXZhaWxhYmxlID4gKG9mZjY0X3Qpc2l6ZSkgPyBzaXplIDogYXZhaWxhYmxlOwogICAgICAgICBtZW1jcHkoZGF0YSwgbURhdGEgKyBvZmZzZXQsIGNvcHkpOwogCiAgICAgICAgIHJldHVybiBjb3B5OwpAQCAtNzcsNyArNzcsMTAgQEAKICAgICAgIG1GaXJzdEZyYW1lT2Zmc2V0KDApLAogICAgICAgbVZlcnNpb24oSUQzX1VOS05PV04pLAogICAgICAgbVJhd1NpemUoMCkgewotICAgIHNwPE1lbW9yeVNvdXJjZT4gc291cmNlID0gbmV3IE1lbW9yeVNvdXJjZShkYXRhLCBzaXplKTsKKyAgICBzcDxNZW1vcnlTb3VyY2U+IHNvdXJjZSA9IG5ldyAoc3RkOjpub3Rocm93KSBNZW1vcnlTb3VyY2UoZGF0YSwgc2l6ZSk7CisKKyAgICBpZiAoc291cmNlID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAogICAgIG1Jc1ZhbGlkID0gcGFyc2VWMihzb3VyY2UsIDApOwogCkBAIC0xNzIsNyArMTc1LDcgQEAKICAgICB9CiAKICAgICBpZiAoc2l6ZSA+IGtNYXhNZXRhZGF0YVNpemUpIHsKLSAgICAgICAgQUxPR0UoInNraXBwaW5nIGh1Z2UgSUQzIG1ldGFkYXRhIG9mIHNpemUgJWQiLCBzaXplKTsKKyAgICAgICAgQUxPR0UoInNraXBwaW5nIGh1Z2UgSUQzIG1ldGFkYXRhIG9mIHNpemUgJXp1Iiwgc2l6ZSk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKQEAgLTQ4OCw0OSArNDkxLDYgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGNvbnZlcnRJU084ODU5VG9TdHJpbmc4KAotICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgU3RyaW5nOCAqcykgewotICAgIHNpemVfdCB1dGY4bGVuID0gMDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgewotICAgICAgICBpZiAoZGF0YVtpXSA9PSAnXDAnKSB7Ci0gICAgICAgICAgICBzaXplID0gaTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9IGVsc2UgaWYgKGRhdGFbaV0gPCAweDgwKSB7Ci0gICAgICAgICAgICArK3V0ZjhsZW47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB1dGY4bGVuICs9IDI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAodXRmOGxlbiA9PSBzaXplKSB7Ci0gICAgICAgIC8vIE9ubHkgQVNDSUkgY2hhcmFjdGVycyBwcmVzZW50LgotCi0gICAgICAgIHMtPnNldFRvKChjb25zdCBjaGFyICopZGF0YSwgc2l6ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBjaGFyICp0bXAgPSBuZXcgY2hhclt1dGY4bGVuXTsKLSAgICBjaGFyICpwdHIgPSB0bXA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLSAgICAgICAgaWYgKGRhdGFbaV0gPT0gJ1wwJykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSBpZiAoZGF0YVtpXSA8IDB4ODApIHsKLSAgICAgICAgICAgICpwdHIrKyA9IGRhdGFbaV07Ci0gICAgICAgIH0gZWxzZSBpZiAoZGF0YVtpXSA8IDB4YzApIHsKLSAgICAgICAgICAgICpwdHIrKyA9IDB4YzI7Ci0gICAgICAgICAgICAqcHRyKysgPSBkYXRhW2ldOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKnB0cisrID0gMHhjMzsKLSAgICAgICAgICAgICpwdHIrKyA9IGRhdGFbaV0gLSA2NDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHMtPnNldFRvKHRtcCwgdXRmOGxlbik7Ci0KLSAgICBkZWxldGVbXSB0bXA7Ci0gICAgdG1wID0gTlVMTDsKLX0KIAogLy8gdGhlIDJuZCBhcmd1bWVudCBpcyB1c2VkIHRvIGdldCB0aGUgZGF0YSBmb2xsb3dpbmcgdGhlIFwwIGluIGEgY29tbWVudCBmaWVsZAogdm9pZCBJRDM6Okl0ZXJhdG9yOjpnZXRTdHJpbmcoU3RyaW5nOCAqaWQsIFN0cmluZzggKmNvbW1lbnQpIGNvbnN0IHsKQEAgLTU2Myw3ICs1MjMsOSBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgY29udmVydElTTzg4NTlUb1N0cmluZzgoZnJhbWVEYXRhLCBtRnJhbWVTaXplLCBpZCk7CisgICAgICAgIC8vIHRoaXMgaXMgc3VwcG9zZWQgdG8gYmUgSVNPLTg4NTktMSwgYnV0IHBhc3MgaXQgdXAgYXMtaXMgdG8gdGhlIGNhbGxlciwgd2hvIHdpbGwgZmlndXJlCisgICAgICAgIC8vIG91dCB0aGUgcmVhbCBlbmNvZGluZworICAgICAgICBpZC0+c2V0VG8oKGNvbnN0IGNoYXIqKWZyYW1lRGF0YSwgbUZyYW1lU2l6ZSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTU4Myw0OSArNTQ1LDkzIEBACiAgICAgICAgIG4gLT0gc2tpcHBlZDsKICAgICB9CiAKKyAgICBpZiAobiA8PSAwKSB7CisgICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIGlmIChlbmNvZGluZyA9PSAweDAwKSB7Ci0gICAgICAgIC8vIElTTyA4ODU5LTEKLSAgICAgICAgY29udmVydElTTzg4NTlUb1N0cmluZzgoZnJhbWVEYXRhICsgMSwgbiwgaWQpOworICAgICAgICAvLyBzdXBwb3NlZGx5IElTTyA4ODU5LTEKKyAgICAgICAgaWQtPnNldFRvKChjb25zdCBjaGFyKilmcmFtZURhdGEgKyAxLCBuKTsKICAgICB9IGVsc2UgaWYgKGVuY29kaW5nID09IDB4MDMpIHsKLSAgICAgICAgLy8gVVRGLTgKKyAgICAgICAgLy8gc3VwcG9zZWRseSBVVEYtOAogICAgICAgICBpZC0+c2V0VG8oKGNvbnN0IGNoYXIgKikoZnJhbWVEYXRhICsgMSksIG4pOwogICAgIH0gZWxzZSBpZiAoZW5jb2RpbmcgPT0gMHgwMikgewotICAgICAgICAvLyBVVEYtMTYgQkUsIG5vIGJ5dGUgb3JkZXIgbWFyay4KKyAgICAgICAgLy8gc3VwcG9zZWRseSBVVEYtMTYgQkUsIG5vIGJ5dGUgb3JkZXIgbWFyay4KICAgICAgICAgLy8gQVBJIHdhbnRzIG51bWJlciBvZiBjaGFyYWN0ZXJzLCBub3QgbnVtYmVyIG9mIGJ5dGVzLi4uCiAgICAgICAgIGludCBsZW4gPSBuIC8gMjsKICAgICAgICAgY29uc3QgY2hhcjE2X3QgKmZyYW1lZGF0YSA9IChjb25zdCBjaGFyMTZfdCAqKSAoZnJhbWVEYXRhICsgMSk7CiAgICAgICAgIGNoYXIxNl90ICpmcmFtZWRhdGFjb3B5ID0gTlVMTDsKICNpZiBCWVRFX09SREVSID09IExJVFRMRV9FTkRJQU4KLSAgICAgICAgZnJhbWVkYXRhY29weSA9IG5ldyBjaGFyMTZfdFtsZW5dOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICBmcmFtZWRhdGFjb3B5W2ldID0gYnN3YXBfMTYoZnJhbWVkYXRhW2ldKTsKKyAgICAgICAgaWYgKGxlbiA+IDApIHsKKyAgICAgICAgICAgIGZyYW1lZGF0YWNvcHkgPSBuZXcgKHN0ZDo6bm90aHJvdykgY2hhcjE2X3RbbGVuXTsKKyAgICAgICAgICAgIGlmIChmcmFtZWRhdGFjb3B5ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgZnJhbWVkYXRhY29weVtpXSA9IGJzd2FwXzE2KGZyYW1lZGF0YVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmFtZWRhdGEgPSBmcmFtZWRhdGFjb3B5OwogICAgICAgICB9Ci0gICAgICAgIGZyYW1lZGF0YSA9IGZyYW1lZGF0YWNvcHk7CiAjZW5kaWYKICAgICAgICAgaWQtPnNldFRvKGZyYW1lZGF0YSwgbGVuKTsKICAgICAgICAgaWYgKGZyYW1lZGF0YWNvcHkgIT0gTlVMTCkgewogICAgICAgICAgICAgZGVsZXRlW10gZnJhbWVkYXRhY29weTsKICAgICAgICAgfQotICAgIH0gZWxzZSB7CisgICAgfSBlbHNlIGlmIChlbmNvZGluZyA9PSAweDAxKSB7CiAgICAgICAgIC8vIFVDUy0yCiAgICAgICAgIC8vIEFQSSB3YW50cyBudW1iZXIgb2YgY2hhcmFjdGVycywgbm90IG51bWJlciBvZiBieXRlcy4uLgogICAgICAgICBpbnQgbGVuID0gbiAvIDI7CiAgICAgICAgIGNvbnN0IGNoYXIxNl90ICpmcmFtZWRhdGEgPSAoY29uc3QgY2hhcjE2X3QgKikgKGZyYW1lRGF0YSArIDEpOwogICAgICAgICBjaGFyMTZfdCAqZnJhbWVkYXRhY29weSA9IE5VTEw7CiAgICAgICAgIGlmICgqZnJhbWVkYXRhID09IDB4ZmZmZSkgewotICAgICAgICAgICAgLy8gZW5kaWFubmVzcyBtYXJrZXIgZG9lc24ndCBtYXRjaCBob3N0IGVuZGlhbm5lc3MsIGNvbnZlcnQKLSAgICAgICAgICAgIGZyYW1lZGF0YWNvcHkgPSBuZXcgY2hhcjE2X3RbbGVuXTsKKyAgICAgICAgICAgIC8vIGVuZGlhbm5lc3MgbWFya2VyICE9IGhvc3QgZW5kaWFubmVzcywgY29udmVydCAmIHNraXAKKyAgICAgICAgICAgIGlmIChsZW4gPD0gMSkgeworICAgICAgICAgICAgICAgIHJldHVybjsgICAgICAgICAvLyBub3RoaW5nIGFmdGVyIHRoZSBtYXJrZXIKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyYW1lZGF0YWNvcHkgPSBuZXcgKHN0ZDo6bm90aHJvdykgY2hhcjE2X3RbbGVuXTsKKyAgICAgICAgICAgIGlmIChmcmFtZWRhdGFjb3B5ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgZnJhbWVkYXRhY29weVtpXSA9IGJzd2FwXzE2KGZyYW1lZGF0YVtpXSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBmcmFtZWRhdGEgPSBmcmFtZWRhdGFjb3B5OwotICAgICAgICB9Ci0gICAgICAgIC8vIElmIHRoZSBzdHJpbmcgc3RhcnRzIHdpdGggYW4gZW5kaWFubmVzcyBtYXJrZXIsIHNraXAgaXQKLSAgICAgICAgaWYgKCpmcmFtZWRhdGEgPT0gMHhmZWZmKSB7CisgICAgICAgICAgICAvLyBhbmQgc2tpcCBvdmVyIHRoZSBtYXJrZXIKKyAgICAgICAgICAgIGZyYW1lZGF0YSsrOworICAgICAgICAgICAgbGVuLS07CisgICAgICAgIH0gZWxzZSBpZiAoKmZyYW1lZGF0YSA9PSAweGZlZmYpIHsKKyAgICAgICAgICAgIC8vIGVuZGlhbm5lc3MgbWFya2VyID09IGhvc3QgZW5kaWFubmVzcywgc2tpcCBpdAorICAgICAgICAgICAgaWYgKGxlbiA8PSAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgIC8vIG5vdGhpbmcgYWZ0ZXIgdGhlIG1hcmtlcgorICAgICAgICAgICAgfQogICAgICAgICAgICAgZnJhbWVkYXRhKys7CiAgICAgICAgICAgICBsZW4tLTsKICAgICAgICAgfQotICAgICAgICBpZC0+c2V0VG8oZnJhbWVkYXRhLCBsZW4pOworCisgICAgICAgIC8vIGNoZWNrIGlmIHRoZSByZXN1bHRpbmcgZGF0YSBjb25zaXN0cyBlbnRpcmVseSBvZiA4LWJpdCB2YWx1ZXMKKyAgICAgICAgYm9vbCBlaWdodEJpdCA9IHRydWU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChmcmFtZWRhdGFbaV0gPiAweGZmKSB7CisgICAgICAgICAgICAgICAgZWlnaHRCaXQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZWlnaHRCaXQpIHsKKyAgICAgICAgICAgIC8vIGNvbGxhcHNlIHRvIDggYml0LCB0aGVuIGxldCB0aGUgbWVkaWEgc2Nhbm5lciBjbGllbnQgZmlndXJlIG91dCB0aGUgcmVhbCBlbmNvZGluZworICAgICAgICAgICAgY2hhciAqZnJhbWU4ID0gbmV3IChzdGQ6Om5vdGhyb3cpIGNoYXJbbGVuXTsKKyAgICAgICAgICAgIGlmIChmcmFtZTggIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZnJhbWU4W2ldID0gZnJhbWVkYXRhW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZC0+c2V0VG8oZnJhbWU4LCBsZW4pOworICAgICAgICAgICAgICAgIGRlbGV0ZSBbXSBmcmFtZTg7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlkLT5zZXRUbyhmcmFtZWRhdGEsIGxlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZC0+c2V0VG8oZnJhbWVkYXRhLCBsZW4pOworICAgICAgICB9CisKICAgICAgICAgaWYgKGZyYW1lZGF0YWNvcHkgIT0gTlVMTCkgewogICAgICAgICAgICAgZGVsZXRlW10gZnJhbWVkYXRhY29weTsKICAgICAgICAgfQpAQCAtNjgyLDggKzY4OCw4IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtT2Zmc2V0ICsgbUZyYW1lU2l6ZSA+IG1QYXJlbnQubVNpemUpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigicGFydGlhbCBmcmFtZSBhdCBvZmZzZXQgJWQgKHNpemUgPSAlZCwgYnl0ZXMtcmVtYWluaW5nID0gJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgIG1PZmZzZXQsIG1GcmFtZVNpemUsIG1QYXJlbnQubVNpemUgLSBtT2Zmc2V0IC0gNik7CisgICAgICAgICAgICAgICAgQUxPR1YoInBhcnRpYWwgZnJhbWUgYXQgb2Zmc2V0ICV6dSAoc2l6ZSA9ICV6dSwgYnl0ZXMtcmVtYWluaW5nID0gJXp1KSIsCisgICAgICAgICAgICAgICAgICAgIG1PZmZzZXQsIG1GcmFtZVNpemUsIG1QYXJlbnQubVNpemUgLSBtT2Zmc2V0IC0gKHNpemVfdCk2KTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKQEAgLTczNyw4ICs3NDMsOCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobU9mZnNldCArIG1GcmFtZVNpemUgPiBtUGFyZW50Lm1TaXplKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInBhcnRpYWwgZnJhbWUgYXQgb2Zmc2V0ICVkIChzaXplID0gJWQsIGJ5dGVzLXJlbWFpbmluZyA9ICVkKSIsCi0gICAgICAgICAgICAgICAgICAgICBtT2Zmc2V0LCBtRnJhbWVTaXplLCBtUGFyZW50Lm1TaXplIC0gbU9mZnNldCAtIDEwKTsKKyAgICAgICAgICAgICAgICBBTE9HVigicGFydGlhbCBmcmFtZSBhdCBvZmZzZXQgJXp1IChzaXplID0gJXp1LCBieXRlcy1yZW1haW5pbmcgPSAlenUpIiwKKyAgICAgICAgICAgICAgICAgICAgbU9mZnNldCwgbUZyYW1lU2l6ZSwgbVBhcmVudC5tU2l6ZSAtIG1PZmZzZXQgLSAoc2l6ZV90KTEwKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy90ZXN0aWQzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy90ZXN0aWQzLmNwcAppbmRleCBiYzQ1NzJjLi5iMmY0MTg4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvdGVzdGlkMy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL3Rlc3RpZDMuY3BwCkBAIC0zMyw3ICszMyw3IEBACiAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IChjb25zdCB1aW50OF90ICopX2RhdGE7CiAgICAgc2l6ZV90IG9mZnNldCA9IDA7CiAgICAgd2hpbGUgKG9mZnNldCA8IHNpemUpIHsKLSAgICAgICAgcHJpbnRmKCIweCUwNHggICIsIG9mZnNldCk7CisgICAgICAgIHByaW50ZigiMHglMDR6eCAgIiwgb2Zmc2V0KTsKIAogICAgICAgICBzaXplX3QgbiA9IHNpemUgLSBvZmZzZXQ7CiAgICAgICAgIGlmIChuID4gMTYpIHsKQEAgLTEwMSw3ICsxMDEsNyBAQAogICAgICAgICBjb25zdCB2b2lkICpkYXRhID0gdGFnLmdldEFsYnVtQXJ0KCZkYXRhU2l6ZSwgJm1pbWUpOwogCiAgICAgICAgIGlmIChkYXRhKSB7Ci0gICAgICAgICAgICBwcmludGYoImZvdW5kIGFsYnVtIGFydDogc2l6ZT0lZCBtaW1lPSclcydcbiIsIGRhdGFTaXplLAorICAgICAgICAgICAgcHJpbnRmKCJmb3VuZCBhbGJ1bSBhcnQ6IHNpemU9JXp1IG1pbWU9JyVzJ1xuIiwgZGF0YVNpemUsCiAgICAgICAgICAgICAgICAgICAgbWltZS5zdHJpbmcoKSk7CiAKICAgICAgICAgICAgIGhleGR1bXAoZGF0YSwgZGF0YVNpemUgPiAxMjggPyAxMjggOiBkYXRhU2l6ZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0F3ZXNvbWVQbGF5ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oCmluZGV4IDI3MWRmOGUuLjc3ZDY1ZTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oCkBAIC0zMiw2ICszMiw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBdWRpb1BsYXllcjsKK3N0cnVjdCBDbG9ja0VzdGltYXRvcjsKIHN0cnVjdCBEYXRhU291cmNlOwogc3RydWN0IE1lZGlhQnVmZmVyOwogc3RydWN0IE1lZGlhRXh0cmFjdG9yOwpAQCAtNjMsNiArNjQsNyBAQAogICAgIHZvaWQgc2V0VUlEKHVpZF90IHVpZCk7CiAKICAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCk7CiAKQEAgLTE1OSw2ICsxNjEsNyBAQAogICAgIFN5c3RlbVRpbWVTb3VyY2UgbVN5c3RlbVRpbWVTb3VyY2U7CiAgICAgVGltZVNvdXJjZSAqbVRpbWVTb3VyY2U7CiAKKyAgICBzcDxJTWVkaWFIVFRQU2VydmljZT4gbUhUVFBTZXJ2aWNlOwogICAgIFN0cmluZzggbVVyaTsKICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtVXJpSGVhZGVyczsKIApAQCAtMjM0LDYgKzIzNyw3IEBACiAKICAgICBNZWRpYUJ1ZmZlciAqbVZpZGVvQnVmZmVyOwogCisgICAgc3A8Q2xvY2tFc3RpbWF0b3I+IG1DbG9ja0VzdGltYXRvcjsKICAgICBzcDxIVFRQQmFzZT4gbUNvbm5lY3RpbmdEYXRhU291cmNlOwogICAgIHNwPE51Q2FjaGVkU291cmNlMj4gbUNhY2hlZFNvdXJjZTsKIApAQCAtMjQ3LDYgKzI1MSw3IEBACiAgICAgc3A8TWVkaWFFeHRyYWN0b3I+IG1FeHRyYWN0b3I7CiAKICAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlX2woCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMKTsKIApAQCAtMjkzLDYgKzI5OCw3IEBACiAKICAgICBib29sIGdldEJpdHJhdGUoaW50NjRfdCAqYml0cmF0ZSk7CiAKKyAgICBpbnQ2NF90IGVzdGltYXRlUmVhbFRpbWVVcyhUaW1lU291cmNlICp0cywgaW50NjRfdCBzeXN0ZW1UaW1lVXMpOwogICAgIHZvaWQgZmluaXNoU2Vla0lmTmVjZXNzYXJ5KGludDY0X3QgdmlkZW9UaW1lVXMpOwogICAgIHZvaWQgZW5zdXJlQ2FjaGVJc0ZldGNoaW5nX2woKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9DaHJvbWl1bUhUVFBEYXRhU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0Nocm9taXVtSFRUUERhdGFTb3VyY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGExODhkZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0Nocm9taXVtSFRUUERhdGFTb3VyY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBDSFJPTUVfSFRUUF9EQVRBX1NPVVJDRV9IXwotCi0jZGVmaW5lIENIUk9NRV9IVFRQX0RBVEFfU09VUkNFX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLSNpbmNsdWRlICJIVFRQQmFzZS5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBTZkRlbGVnYXRlOwotCi1zdHJ1Y3QgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZSA6IHB1YmxpYyBIVFRQQmFzZSB7Ci0gICAgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZSh1aW50MzJfdCBmbGFncyA9IDApOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjb25uZWN0KAotICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLAotICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMLAotICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQgPSAwKTsKLQotICAgIHZpcnR1YWwgdm9pZCBkaXNjb25uZWN0KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OwotCi0gICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKTsKLSAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCk7Ci0KLSAgICB2aXJ0dWFsIHNwPERlY3J5cHRIYW5kbGU+IERybUluaXRpYWxpemF0aW9uKGNvbnN0IGNoYXIgKm1pbWUpOwotCi0gICAgdmlydHVhbCB2b2lkIGdldERybUluZm8oc3A8RGVjcnlwdEhhbmRsZT4gJmhhbmRsZSwgRHJtTWFuYWdlckNsaWVudCAqKmNsaWVudCk7Ci0KLSAgICB2aXJ0dWFsIFN0cmluZzggZ2V0VXJpKCk7Ci0KLSAgICB2aXJ0dWFsIFN0cmluZzggZ2V0TUlNRVR5cGUoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVjb25uZWN0QXRPZmZzZXQob2ZmNjRfdCBvZmZzZXQpOwotCi0gICAgc3RhdGljIHN0YXR1c190IFVwZGF0ZVByb3h5Q29uZmlnKAotICAgICAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgaW50MzJfdCBwb3J0LCBjb25zdCBjaGFyICpleGNsdXNpb25MaXN0KTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkNocm9taXVtSFRUUERhdGFTb3VyY2UoKTsKLQotcHJpdmF0ZToKLSAgICBmcmllbmQgc3RydWN0IFNmRGVsZWdhdGU7Ci0KLSAgICBlbnVtIFN0YXRlIHsKLSAgICAgICAgRElTQ09OTkVDVEVELAotICAgICAgICBDT05ORUNUSU5HLAotICAgICAgICBDT05ORUNURUQsCi0gICAgICAgIFJFQURJTkcsCi0gICAgICAgIERJU0NPTk5FQ1RJTkcKLSAgICB9OwotCi0gICAgY29uc3QgdWludDMyX3QgbUZsYWdzOwotCi0gICAgbXV0YWJsZSBNdXRleCBtTG9jazsKLSAgICBDb25kaXRpb24gbUNvbmRpdGlvbjsKLQotICAgIFN0YXRlIG1TdGF0ZTsKLQotICAgIFNmRGVsZWdhdGUgKm1EZWxlZ2F0ZTsKLQotICAgIEFTdHJpbmcgbVVSSTsKLSAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtSGVhZGVyczsKLQotICAgIG9mZjY0X3QgbUN1cnJlbnRPZmZzZXQ7Ci0KLSAgICAvLyBBbnkgY29ubmVjdGlvbiBlcnJvciBvciB0aGUgcmVzdWx0IG9mIGEgcmVhZCBvcGVyYXRpb24KLSAgICAvLyAoZm9yIHRoZSBsYXR0dGVyIHRoaXMgaXMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLCBpZiBzdWNjZXNzZnVsKS4KLSAgICBzc2l6ZV90IG1JT1Jlc3VsdDsKLQotICAgIGludDY0X3QgbUNvbnRlbnRTaXplOwotCi0gICAgU3RyaW5nOCBtQ29udGVudFR5cGU7Ci0KLSAgICBzcDxEZWNyeXB0SGFuZGxlPiBtRGVjcnlwdEhhbmRsZTsKLSAgICBEcm1NYW5hZ2VyQ2xpZW50ICptRHJtTWFuYWdlckNsaWVudDsKLQotICAgIHZvaWQgZGlzY29ubmVjdF9sKCk7Ci0KLSAgICBzdGF0dXNfdCBjb25uZWN0X2woCi0gICAgICAgICAgICBjb25zdCBjaGFyICp1cmksCi0gICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKLSAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0KTsKLQotICAgIHN0YXRpYyB2b2lkIEluaXRpYXRlUmVhZCgKLSAgICAgICAgICAgIENocm9taXVtSFRUUERhdGFTb3VyY2UgKm1lLCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICB2b2lkIGluaXRpYXRlUmVhZCh2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICB2b2lkIG9uQ29ubmVjdGlvbkVzdGFibGlzaGVkKAotICAgICAgICAgICAgaW50NjRfdCBjb250ZW50U2l6ZSwgY29uc3QgY2hhciAqY29udGVudFR5cGUpOwotCi0gICAgdm9pZCBvbkNvbm5lY3Rpb25GYWlsZWQoc3RhdHVzX3QgZXJyKTsKLSAgICB2b2lkIG9uUmVhZENvbXBsZXRlZChzc2l6ZV90IHNpemUpOwotICAgIHZvaWQgb25EaXNjb25uZWN0Q29tcGxldGUoKTsKLSAgICB2b2lkIG9uUmVkaXJlY3QoY29uc3QgY2hhciAqdXJsKTsKLQotICAgIHZvaWQgY2xlYXJEUk1TdGF0ZV9sKCk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDaHJvbWl1bUhUVFBEYXRhU291cmNlKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gQ0hST01FX0hUVFBfREFUQV9TT1VSQ0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvRnJhZ21lbnRlZE1QNFBhcnNlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9GcmFnbWVudGVkTVA0UGFyc2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZTAyYjguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9GcmFnbWVudGVkTVA0UGFyc2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgUEFSU0VSX0hfCi0KLSNkZWZpbmUgUEFSU0VSX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBBQnVmZmVyOwotCi1zdHJ1Y3QgRnJhZ21lbnRlZE1QNFBhcnNlciA6IHB1YmxpYyBBSGFuZGxlciB7Ci0gICAgc3RydWN0IFNvdXJjZSA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICAgICAgU291cmNlKCkge30KLQotICAgICAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgPSAwOwotICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTZWVrYWJsZSgpID0gMDsKLQotICAgICAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIHZpcnR1YWwgflNvdXJjZSgpIHt9Ci0KLSAgICAgICAgcHJpdmF0ZToKLSAgICAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU291cmNlKTsKLSAgICB9OwotCi0gICAgRnJhZ21lbnRlZE1QNFBhcnNlcigpOwotCi0gICAgdm9pZCBzdGFydChjb25zdCBjaGFyICpmaWxlbmFtZSk7Ci0gICAgdm9pZCBzdGFydChjb25zdCBzcDxTb3VyY2U+ICZzb3VyY2UpOwotICAgIHZvaWQgc3RhcnQoc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSk7Ci0KLSAgICBzcDxBTWVzc2FnZT4gZ2V0Rm9ybWF0KGJvb2wgYXVkaW8sIGJvb2wgc3luY2hyb25vdXMgPSBmYWxzZSk7Ci0gICAgc3RhdHVzX3QgZGVxdWV1ZUFjY2Vzc1VuaXQoYm9vbCBhdWRpbywgc3A8QUJ1ZmZlcj4gKmFjY2Vzc1VuaXQsIGJvb2wgc3luY2hyb25vdXMgPSBmYWxzZSk7Ci0gICAgc3RhdHVzX3Qgc2Vla1RvKGJvb2wgYXVkaW8sIGludDY0X3QgdGltZVVzKTsKLSAgICBib29sIGlzU2Vla2FibGUoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5GcmFnbWVudGVkTVA0UGFyc2VyKCk7Ci0KLXByaXZhdGU6Ci0gICAgZW51bSB7Ci0gICAgICAgIGtXaGF0U3RhcnQsCi0gICAgICAgIGtXaGF0UHJvY2VlZCwKLSAgICAgICAga1doYXRSZWFkTW9yZSwKLSAgICAgICAga1doYXRHZXRGb3JtYXQsCi0gICAgICAgIGtXaGF0RGVxdWV1ZUFjY2Vzc1VuaXQsCi0gICAgICAgIGtXaGF0U2Vla1RvLAotICAgIH07Ci0KLSAgICBzdHJ1Y3QgVHJhY2tGcmFnbWVudDsKLSAgICBzdHJ1Y3QgRHluYW1pY1RyYWNrRnJhZ21lbnQ7Ci0gICAgc3RydWN0IFN0YXRpY1RyYWNrRnJhZ21lbnQ7Ci0KLSAgICBzdHJ1Y3QgRGlzcGF0Y2hFbnRyeSB7Ci0gICAgICAgIHVpbnQzMl90IG1UeXBlOwotICAgICAgICB1aW50MzJfdCBtUGFyZW50VHlwZTsKLSAgICAgICAgc3RhdHVzX3QgKEZyYWdtZW50ZWRNUDRQYXJzZXI6OiptSGFuZGxlcikodWludDMyX3QsIHNpemVfdCwgdWludDY0X3QpOwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgQ29udGFpbmVyIHsKLSAgICAgICAgdWludDY0X3QgbU9mZnNldDsKLSAgICAgICAgdWludDY0X3QgbUJ5dGVzUmVtYWluaW5nOwotICAgICAgICB1aW50MzJfdCBtVHlwZTsKLSAgICAgICAgYm9vbCBtRXh0ZW5kc1RvRU9GOwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgU2FtcGxlRGVzY3JpcHRpb24gewotICAgICAgICB1aW50MzJfdCBtVHlwZTsKLSAgICAgICAgdWludDE2X3QgbURhdGFSZWZJbmRleDsKLQotICAgICAgICBzcDxBTWVzc2FnZT4gbUZvcm1hdDsKLSAgICB9OwotCi0gICAgc3RydWN0IFNhbXBsZUluZm8gewotICAgICAgICBvZmY2NF90IG1PZmZzZXQ7Ci0gICAgICAgIHNpemVfdCBtU2l6ZTsKLSAgICAgICAgdWludDMyX3QgbVByZXNlbnRhdGlvblRpbWU7Ci0gICAgICAgIHNpemVfdCBtU2FtcGxlRGVzY0luZGV4OwotICAgICAgICB1aW50MzJfdCBtRmxhZ3M7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBNZWRpYURhdGFJbmZvIHsKLSAgICAgICAgc3A8QUJ1ZmZlcj4gbUJ1ZmZlcjsKLSAgICAgICAgb2ZmNjRfdCBtT2Zmc2V0OwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgU2lkeEVudHJ5IHsKLSAgICAgICAgc2l6ZV90IG1TaXplOwotICAgICAgICB1aW50MzJfdCBtRHVyYXRpb25VczsKLSAgICB9OwotCi0gICAgc3RydWN0IFRyYWNrSW5mbyB7Ci0gICAgICAgIGVudW0gRmxhZ3MgewotICAgICAgICAgICAga1RyYWNrRW5hYmxlZCAgICAgPSAweDAxLAotICAgICAgICAgICAga1RyYWNrSW5Nb3ZpZSAgICAgPSAweDAyLAotICAgICAgICAgICAga1RyYWNrSW5QcmV2aWV3ICAgPSAweDA0LAotICAgICAgICB9OwotCi0gICAgICAgIHVpbnQzMl90IG1UcmFja0lEOwotICAgICAgICB1aW50MzJfdCBtRmxhZ3M7Ci0gICAgICAgIHVpbnQzMl90IG1EdXJhdGlvbjsgIC8vIFRoaXMgaXMgdGhlIGR1cmF0aW9uIGluIHRlcm1zIG9mIG1vdmllIHRpbWVzY2FsZSEKLSAgICAgICAgdWludDY0X3QgbVNpZHhEdXJhdGlvbjsgLy8gdXNlYywgZnJvbSBzaWR4IGJveCwgd2hpY2ggY2FuIHVzZSBhIGRpZmZlcmVudCB0aW1lc2NhbGUKLQotICAgICAgICB1aW50MzJfdCBtTWVkaWFUaW1lU2NhbGU7Ci0KLSAgICAgICAgdWludDMyX3QgbU1lZGlhSGFuZGxlclR5cGU7Ci0gICAgICAgIFZlY3RvcjxTYW1wbGVEZXNjcmlwdGlvbj4gbVNhbXBsZURlc2NzOwotCi0gICAgICAgIC8vIGZyb20gdHJhY2sgZXh0ZW5kczoKLSAgICAgICAgdWludDMyX3QgbURlZmF1bHRTYW1wbGVEZXNjcmlwdGlvbkluZGV4OwotICAgICAgICB1aW50MzJfdCBtRGVmYXVsdFNhbXBsZUR1cmF0aW9uOwotICAgICAgICB1aW50MzJfdCBtRGVmYXVsdFNhbXBsZVNpemU7Ci0gICAgICAgIHVpbnQzMl90IG1EZWZhdWx0U2FtcGxlRmxhZ3M7Ci0KLSAgICAgICAgdWludDMyX3QgbURlY29kaW5nVGltZTsKLQotICAgICAgICBWZWN0b3I8U2lkeEVudHJ5PiBtU2lkeDsKLSAgICAgICAgc3A8U3RhdGljVHJhY2tGcmFnbWVudD4gbVN0YXRpY0ZyYWdtZW50OwotICAgICAgICBMaXN0PHNwPFRyYWNrRnJhZ21lbnQ+ID4gbUZyYWdtZW50czsKLSAgICB9OwotCi0gICAgc3RydWN0IFRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvIHsKLSAgICAgICAgZW51bSBGbGFncyB7Ci0gICAgICAgICAgICBrQmFzZURhdGFPZmZzZXRQcmVzZW50ICAgICAgICAgPSAweDAxLAotICAgICAgICAgICAga1NhbXBsZURlc2NyaXB0aW9uSW5kZXhQcmVzZW50ID0gMHgwMiwKLSAgICAgICAgICAgIGtEZWZhdWx0U2FtcGxlRHVyYXRpb25QcmVzZW50ICA9IDB4MDgsCi0gICAgICAgICAgICBrRGVmYXVsdFNhbXBsZVNpemVQcmVzZW50ICAgICAgPSAweDEwLAotICAgICAgICAgICAga0RlZmF1bHRTYW1wbGVGbGFnc1ByZXNlbnQgICAgID0gMHgyMCwKLSAgICAgICAgICAgIGtEdXJhdGlvbklzRW1wdHkgICAgICAgICAgICAgICA9IDB4MTAwMDAsCi0gICAgICAgIH07Ci0KLSAgICAgICAgdWludDMyX3QgbVRyYWNrSUQ7Ci0gICAgICAgIHVpbnQzMl90IG1GbGFnczsKLSAgICAgICAgdWludDY0X3QgbUJhc2VEYXRhT2Zmc2V0OwotICAgICAgICB1aW50MzJfdCBtU2FtcGxlRGVzY3JpcHRpb25JbmRleDsKLSAgICAgICAgdWludDMyX3QgbURlZmF1bHRTYW1wbGVEdXJhdGlvbjsKLSAgICAgICAgdWludDMyX3QgbURlZmF1bHRTYW1wbGVTaXplOwotICAgICAgICB1aW50MzJfdCBtRGVmYXVsdFNhbXBsZUZsYWdzOwotCi0gICAgICAgIHVpbnQ2NF90IG1EYXRhT2Zmc2V0OwotICAgIH07Ci0KLSAgICBzdGF0aWMgY29uc3QgRGlzcGF0Y2hFbnRyeSBrRGlzcGF0Y2hUYWJsZVtdOwotCi0gICAgc3A8U291cmNlPiBtU291cmNlOwotICAgIG9mZl90IG1CdWZmZXJQb3M7Ci0gICAgYm9vbCBtU3VzcGVuZGVkOwotICAgIGJvb2wgbURvbmVXaXRoTW9vdjsKLSAgICBvZmZfdCBtRmlyc3RNb29mT2Zmc2V0OyAvLyB1c2VkIGFzIHRoZSBzdGFydGluZyBwb2ludCBmb3Igb2Zmc2V0cyBjYWxjdWxhdGVkIGZyb20gdGhlIHNpZHggYm94Ci0gICAgc3A8QUJ1ZmZlcj4gbUJ1ZmZlcjsKLSAgICBWZWN0b3I8Q29udGFpbmVyPiBtU3RhY2s7Ci0gICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIFRyYWNrSW5mbz4gbVRyYWNrczsgIC8vIFRyYWNrSW5mbyBieSB0cmFja0lECi0gICAgVmVjdG9yPE1lZGlhRGF0YUluZm8+IG1NZWRpYURhdGE7Ci0KLSAgICB1aW50MzJfdCBtQ3VycmVudFRyYWNrSUQ7Ci0KLSAgICBzdGF0dXNfdCBtRmluYWxSZXN1bHQ7Ci0KLSAgICBUcmFja0ZyYWdtZW50SGVhZGVySW5mbyBtVHJhY2tGcmFnbWVudEhlYWRlckluZm87Ci0KLSAgICBzdGF0dXNfdCBvblByb2NlZWQoKTsKLSAgICBzdGF0dXNfdCBvbkRlcXVldWVBY2Nlc3NVbml0KHNpemVfdCB0cmFja0luZGV4LCBzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCk7Ci0gICAgc3RhdHVzX3Qgb25TZWVrVG8oYm9vbCB3YW50QXVkaW8sIGludDY0X3QgcG9zaXRpb24pOwotCi0gICAgdm9pZCBlbnRlcihvZmY2NF90IG9mZnNldCwgdWludDMyX3QgdHlwZSwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICB1aW50MTZfdCByZWFkVTE2KHNpemVfdCBvZmZzZXQpOwotICAgIHVpbnQzMl90IHJlYWRVMzIoc2l6ZV90IG9mZnNldCk7Ci0gICAgdWludDY0X3QgcmVhZFU2NChzaXplX3Qgb2Zmc2V0KTsKLSAgICB2b2lkIHNraXAob2ZmX3QgZGlzdGFuY2UpOwotICAgIHN0YXR1c190IG5lZWQoc2l6ZV90IHNpemUpOwotICAgIGJvb2wgZml0c0NvbnRhaW5lcih1aW50NjRfdCBzaXplKSBjb25zdDsKLQotICAgIHN0YXR1c190IHBhcnNlVHJhY2tIZWFkZXIoCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlTWVkaWFIZWFkZXIoCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlTWVkaWFIYW5kbGVyKAotICAgICAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZVRyYWNrRXh0ZW5kcygKLSAgICAgICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpOwotCi0gICAgc3RhdHVzX3QgcGFyc2VUcmFja0ZyYWdtZW50SGVhZGVyKAotICAgICAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZVRyYWNrRnJhZ21lbnRSdW4oCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlVmlzdWFsU2FtcGxlRW50cnkoCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlQXVkaW9TYW1wbGVFbnRyeSgKLSAgICAgICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpOwotCi0gICAgc3RhdHVzX3QgcGFyc2VTYW1wbGVTaXplcygKLSAgICAgICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpOwotCi0gICAgc3RhdHVzX3QgcGFyc2VDb21wYWN0U2FtcGxlU2l6ZXMoCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlU2FtcGxlVG9DaHVuaygKLSAgICAgICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpOwotCi0gICAgc3RhdHVzX3QgcGFyc2VDaHVua09mZnNldHMoCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlQ2h1bmtPZmZzZXRzNjQoCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlQVZDQ29kZWNTcGVjaWZpY0RhdGEoCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlRVNEU0NvZGVjU3BlY2lmaWNEYXRhKAotICAgICAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZU1lZGlhRGF0YSgKLSAgICAgICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpOwotCi0gICAgc3RhdHVzX3QgcGFyc2VTZWdtZW50SW5kZXgoCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIFRyYWNrSW5mbyAqZWRpdFRyYWNrKHVpbnQzMl90IHRyYWNrSUQsIGJvb2wgY3JlYXRlSWZOZWNlc3NhcnkgPSBmYWxzZSk7Ci0KLSAgICBzc2l6ZV90IGZpbmRUcmFjayhib29sIHdhbnRBdWRpbykgY29uc3Q7Ci0KLSAgICBzdGF0dXNfdCBtYWtlQWNjZXNzVW5pdCgKLSAgICAgICAgICAgIFRyYWNrSW5mbyAqaW5mbywKLSAgICAgICAgICAgIGNvbnN0IFNhbXBsZUluZm8gJnNhbXBsZSwKLSAgICAgICAgICAgIGNvbnN0IE1lZGlhRGF0YUluZm8gJm1kYXRJbmZvLAotICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gKmFjY2Vzc1VuaXQpOwotCi0gICAgc3RhdHVzX3QgZ2V0U2FtcGxlKAotICAgICAgICAgICAgVHJhY2tJbmZvICppbmZvLAotICAgICAgICAgICAgc3A8VHJhY2tGcmFnbWVudD4gKmZyYWdtZW50LAotICAgICAgICAgICAgU2FtcGxlSW5mbyAqc2FtcGxlSW5mbyk7Ci0KLSAgICBzdGF0aWMgaW50IENvbXBhcmVTYW1wbGVMb2NhdGlvbigKLSAgICAgICAgY29uc3QgU2FtcGxlSW5mbyAmc2FtcGxlLCBjb25zdCBNZWRpYURhdGFJbmZvICZtZGF0SW5mbyk7Ci0KLSAgICB2b2lkIHJlc3VtZUlmTmVjZXNzYXJ5KCk7Ci0KLSAgICB2b2lkIGNvcHlCdWZmZXIoCi0gICAgICAgICAgICBzcDxBQnVmZmVyPiAqZHN0LAotICAgICAgICAgICAgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgY29uc3Q7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhGcmFnbWVudGVkTVA0UGFyc2VyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gUEFSU0VSX0hfCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaAppbmRleCBkNGI3ZjlmLi4xYzNjZDVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0hUVFBCYXNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9IVFRQQmFzZS5oCkBAIC00OCwxNCArNDgsNiBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCYW5kd2lkdGhTdGF0Q29sbGVjdEZyZXEoaW50MzJfdCBmcmVxTXMpOwogCi0gICAgc3RhdGljIHN0YXR1c190IFVwZGF0ZVByb3h5Q29uZmlnKAotICAgICAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgaW50MzJfdCBwb3J0LCBjb25zdCBjaGFyICpleGNsdXNpb25MaXN0KTsKLQotICAgIHZvaWQgc2V0VUlEKHVpZF90IHVpZCk7Ci0gICAgYm9vbCBnZXRVSUQodWlkX3QgKnVpZCkgY29uc3Q7Ci0KLSAgICBzdGF0aWMgc3A8SFRUUEJhc2U+IENyZWF0ZSh1aW50MzJfdCBmbGFncyA9IDApOwotCiAgICAgc3RhdGljIHZvaWQgUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCBzb2NrZmQsIHVpZF90IHVpZCwgdWludDMyX3Qga1RhZyk7CiAgICAgc3RhdGljIHZvaWQgVW5SZWdpc3RlclNvY2tldFVzZXJUYWcoaW50IHNvY2tmZCk7CiAKQEAgLTg3LDkgKzc5LDYgQEAKICAgICBpbnQzMl90IG1QcmV2RXN0aW1hdGVkQmFuZFdpZHRoS2JwczsKICAgICBpbnQzMl90IG1CYW5kV2lkdGhDb2xsZWN0RnJlcU1zOwogCi0gICAgYm9vbCBtVUlEVmFsaWQ7Ci0gICAgdWlkX3QgbVVJRDsKLQogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEhUVFBCYXNlKTsKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzRFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzRFeHRyYWN0b3IuaAppbmRleCA3YjRiYzZkLi4xZmU2ZmNmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUc0RXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHNEV4dHJhY3Rvci5oCkBAIC0zOSw2ICszOSwxNCBAQAogICAgIHVpbnQzMl90IG1EdXJhdGlvblVzOwogfTsKIAorc3RydWN0IFRyZXggeworICAgIHVpbnQzMl90IHRyYWNrX0lEOworICAgIHVpbnQzMl90IGRlZmF1bHRfc2FtcGxlX2Rlc2NyaXB0aW9uX2luZGV4OworICAgIHVpbnQzMl90IGRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uOworICAgIHVpbnQzMl90IGRlZmF1bHRfc2FtcGxlX3NpemU7CisgICAgdWludDMyX3QgZGVmYXVsdF9zYW1wbGVfZmxhZ3M7Cit9OworCiBjbGFzcyBNUEVHNEV4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7CiBwdWJsaWM6CiAgICAgLy8gRXh0cmFjdG9yIGFzc3VtZXMgb3duZXJzaGlwIG9mICJzb3VyY2UiLgpAQCAtNzQsMTEgKzgyLDEyIEBACiAgICAgfTsKIAogICAgIFZlY3RvcjxTaWR4RW50cnk+IG1TaWR4RW50cmllczsKLSAgICB1aW50NjRfdCBtU2lkeER1cmF0aW9uOwogICAgIG9mZjY0X3QgbU1vb2ZPZmZzZXQ7CiAKICAgICBWZWN0b3I8UHNzaEluZm8+IG1Qc3NoOwogCisgICAgVmVjdG9yPFRyZXg+IG1UcmV4OworCiAgICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7CiAgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKICAgICBib29sIG1IYXNWaWRlbzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oCmluZGV4IDk0OWE0OWUuLmEyOWJkZjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaApAQCAtMzcsNiArMzcsOCBAQAogCiAgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwogCisgICAgdmlydHVhbCB2b2lkIGRpc2Nvbm5lY3QoKTsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKTsKICAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCk7CiAKQEAgLTEwOCw2ICsxMTAsNyBAQAogICAgIG9mZjY0X3QgbUxhc3RBY2Nlc3NQb3M7CiAgICAgc3A8QU1lc3NhZ2U+IG1Bc3luY1Jlc3VsdDsKICAgICBib29sIG1GZXRjaGluZzsKKyAgICBib29sIG1EaXNjb25uZWN0aW5nOwogICAgIGludDY0X3QgbUxhc3RGZXRjaFRpbWVVczsKIAogICAgIGludDMyX3QgbU51bVJldHJpZXNMZWZ0OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVguaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YLmgKaW5kZXggNzQ4ZDE4NC4uODI5YzM4YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVguaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWC5oCkBAIC03NSw2ICs3NSwxMCBAQAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgZW5hYmxlLAogICAgICAgICAgICAgT01YX1UzMiBtYXhfZnJhbWVfd2lkdGgsIE9NWF9VMzIgbWF4X2ZyYW1lX2hlaWdodCk7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVZpZGVvVHVubmVsTW9kZSgKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIHR1bm5lbGVkLAorICAgICAgICAgICAgT01YX1UzMiBhdWRpb0h3U3luYywgbmF0aXZlX2hhbmRsZV90ICoqc2lkZWJhbmRIYW5kbGUpOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCB1c2VCdWZmZXIoCiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgY29uc3Qgc3A8SU1lbW9yeT4gJnBhcmFtcywKICAgICAgICAgICAgIGJ1ZmZlcl9pZCAqYnVmZmVyLCBPTVhfQk9PTCBjcm9zc1Byb2Nlc3MpOwpAQCAtMTM2LDEwICsxNDAsMTAgQEAKICAgICAgICAgICAgIE9NWF9JTiBPTVhfUFRSIHBFdmVudERhdGEpOwogCiAgICAgT01YX0VSUk9SVFlQRSBPbkVtcHR5QnVmZmVyRG9uZSgKLSAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwQnVmZmVyKTsKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgYnVmZmVyX2lkIGJ1ZmZlciwgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwQnVmZmVyKTsKIAogICAgIE9NWF9FUlJPUlRZUEUgT25GaWxsQnVmZmVyRG9uZSgKLSAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwQnVmZmVyKTsKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgYnVmZmVyX2lkIGJ1ZmZlciwgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwQnVmZmVyKTsKIAogICAgIHZvaWQgaW52YWxpZGF0ZU5vZGVJRChub2RlX2lkIG5vZGUpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWE5vZGVJbnN0YW5jZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVhOb2RlSW5zdGFuY2UuaAppbmRleCAxNjI1ZjA3Li5kNWJkMDQ2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWE5vZGVJbnN0YW5jZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YTm9kZUluc3RhbmNlLmgKQEAgLTYzLDYgKzYzLDEwIEBACiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgZW5hYmxlLAogICAgICAgICAgICAgT01YX1UzMiBtYXhGcmFtZVdpZHRoLCBPTVhfVTMyIG1heEZyYW1lSGVpZ2h0KTsKIAorICAgIHN0YXR1c190IGNvbmZpZ3VyZVZpZGVvVHVubmVsTW9kZSgKKyAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBPTVhfQk9PTCB0dW5uZWxlZCwKKyAgICAgICAgICAgIE9NWF9VMzIgYXVkaW9Id1N5bmMsIG5hdGl2ZV9oYW5kbGVfdCAqKnNpZGViYW5kSGFuZGxlKTsKKwogICAgIHN0YXR1c190IHVzZUJ1ZmZlcigKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBjb25zdCBzcDxJTWVtb3J5PiAmcGFyYW1zLAogICAgICAgICAgICAgT01YOjpidWZmZXJfaWQgKmJ1ZmZlciwgT01YX0JPT0wgY3Jvc3NQcm9jZXNzKTsKQEAgLTE0Nyw2ICsxNTEsMTEgQEAKICAgICAgICAgT01YOjpidWZmZXJfaWQgbUlEOwogICAgIH07CiAgICAgVmVjdG9yPEFjdGl2ZUJ1ZmZlcj4gbUFjdGl2ZUJ1ZmZlcnM7CisgICAgLy8gZm9yIGJ1ZmZlciBwdHIgdG8gYnVmZmVyIGlkIHRyYW5zbGF0aW9uCisgICAgTXV0ZXggbUJ1ZmZlcklETG9jazsKKyAgICB1aW50MzJfdCBtQnVmZmVySURDb3VudDsKKyAgICBLZXllZFZlY3RvcjxPTVg6OmJ1ZmZlcl9pZCwgT01YX0JVRkZFUkhFQURFUlRZUEUgKj4gbUJ1ZmZlcklEVG9CdWZmZXJIZWFkZXI7CisgICAgS2V5ZWRWZWN0b3I8T01YX0JVRkZFUkhFQURFUlRZUEUgKiwgT01YOjpidWZmZXJfaWQ+IG1CdWZmZXJIZWFkZXJUb0J1ZmZlcklEOwogCiAgICAgLy8gbWV0YWRhdGEgbW9kZSB0cmFja2luZwogICAgIGJvb2wgbVVzaW5nTWV0YWRhdGFbMl07CkBAIC0xNTcsNiArMTY2LDEyIEBACiAgICAgdm9pZCByZW1vdmVBY3RpdmVCdWZmZXIoT01YX1UzMiBwb3J0SW5kZXgsIE9NWDo6YnVmZmVyX2lkIGlkKTsKICAgICB2b2lkIGZyZWVBY3RpdmVCdWZmZXJzKCk7CiAKKyAgICAvLyBGb3IgYnVmZmVyIGlkIG1hbmFnZW1lbnQKKyAgICBPTVg6OmJ1ZmZlcl9pZCBtYWtlQnVmZmVySUQoT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlckhlYWRlcik7CisgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmZpbmRCdWZmZXJIZWFkZXIoT01YOjpidWZmZXJfaWQgYnVmZmVyLCBPTVhfVTMyIHBvcnRJbmRleCk7CisgICAgT01YOjpidWZmZXJfaWQgZmluZEJ1ZmZlcklEKE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZmZXJIZWFkZXIpOworICAgIHZvaWQgaW52YWxpZGF0ZUJ1ZmZlcklEKE9NWDo6YnVmZmVyX2lkIGJ1ZmZlcik7CisKICAgICBib29sIGlzUHJvaGliaXRlZEluZGV4X2woT01YX0lOREVYVFlQRSBpbmRleCk7CiAKICAgICBzdGF0dXNfdCB1c2VHcmFwaGljQnVmZmVyMl9sKApAQCAtMTgwLDcgKzE5NSw5IEBACiAgICAgICAgICAgICBPTVhfSU4gT01YX1BUUiBwQXBwRGF0YSwKICAgICAgICAgICAgIE9NWF9JTiBPTVhfQlVGRkVSSEVBREVSVFlQRSAqcEJ1ZmZlcik7CiAKLSAgICBzdGF0dXNfdCBzdG9yZU1ldGFEYXRhSW5CdWZmZXJzX2woT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIGVuYWJsZSk7CisgICAgc3RhdHVzX3Qgc3RvcmVNZXRhRGF0YUluQnVmZmVyc19sKAorICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIGVuYWJsZSwKKyAgICAgICAgICAgIE9NWF9CT09MIHVzZUdyYXBoaWNCdWZmZXIsIE9NWF9CT09MICp1c2luZ0dyYXBoaWNCdWZmZXJJbk1ldGEpOwogCiAgICAgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4gZ2V0R3JhcGhpY0J1ZmZlclNvdXJjZSgpOwogICAgIHZvaWQgc2V0R3JhcGhpY0J1ZmZlclNvdXJjZShjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiYgYnVmZmVyU291cmNlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU0RQTG9hZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NEUExvYWRlci5oCmluZGV4IGNhNTlkYzAuLjJjNGY1NDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU0RQTG9hZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TRFBMb2FkZXIuaApAQCAtMjUsNiArMjUsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgSFRUUEJhc2U7CitzdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CiAKIHN0cnVjdCBTRFBMb2FkZXIgOiBwdWJsaWMgQUhhbmRsZXIgewogICAgIGVudW0gRmxhZ3MgewpAQCAtMzQsNyArMzUsMTAgQEAKICAgICBlbnVtIHsKICAgICAgICAga1doYXRTRFBMb2FkZWQgPSAnc2RwbCcKICAgICB9OwotICAgIFNEUExvYWRlcihjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgdWludDMyX3QgZmxhZ3MgPSAwLCBib29sIHVpZFZhbGlkID0gZmFsc2UsIHVpZF90IHVpZCA9IDApOworICAgIFNEUExvYWRlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAorICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlKTsKIAogICAgIHZvaWQgbG9hZChjb25zdCBjaGFyKiB1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKIApAQCAtNTUsOCArNTksNiBAQAogICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5OwogICAgIGNvbnN0IGNoYXIqIG1Vcmw7CiAgICAgdWludDMyX3QgbUZsYWdzOwotICAgIGJvb2wgbVVJRFZhbGlkOwotICAgIHVpZF90IG1VSUQ7CiAgICAgc3A8QUxvb3Blcj4gbU5ldExvb3BlcjsKICAgICBib29sIG1DYW5jZWxsZWQ7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU2FtcGxlSXRlcmF0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU2FtcGxlSXRlcmF0b3IuaAppbmRleCBiNWEwNDNjLi42MGM5ZTdlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NhbXBsZUl0ZXJhdG9yLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TYW1wbGVJdGVyYXRvci5oCkBAIC0zMCw2ICszMCw3IEBACiAgICAgb2ZmNjRfdCBnZXRTYW1wbGVPZmZzZXQoKSBjb25zdCB7IHJldHVybiBtQ3VycmVudFNhbXBsZU9mZnNldDsgfQogICAgIHNpemVfdCBnZXRTYW1wbGVTaXplKCkgY29uc3QgeyByZXR1cm4gbUN1cnJlbnRTYW1wbGVTaXplOyB9CiAgICAgdWludDMyX3QgZ2V0U2FtcGxlVGltZSgpIGNvbnN0IHsgcmV0dXJuIG1DdXJyZW50U2FtcGxlVGltZTsgfQorICAgIHVpbnQzMl90IGdldFNhbXBsZUR1cmF0aW9uKCkgY29uc3QgeyByZXR1cm4gbUN1cnJlbnRTYW1wbGVEdXJhdGlvbjsgfQogCiAgICAgc3RhdHVzX3QgZ2V0U2FtcGxlU2l6ZURpcmVjdCgKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZUluZGV4LCBzaXplX3QgKnNpemUpOwpAQCAtNjEsMTEgKzYyLDEyIEBACiAgICAgb2ZmNjRfdCBtQ3VycmVudFNhbXBsZU9mZnNldDsKICAgICBzaXplX3QgbUN1cnJlbnRTYW1wbGVTaXplOwogICAgIHVpbnQzMl90IG1DdXJyZW50U2FtcGxlVGltZTsKKyAgICB1aW50MzJfdCBtQ3VycmVudFNhbXBsZUR1cmF0aW9uOwogCiAgICAgdm9pZCByZXNldCgpOwogICAgIHN0YXR1c190IGZpbmRDaHVua1JhbmdlKHVpbnQzMl90IHNhbXBsZUluZGV4KTsKICAgICBzdGF0dXNfdCBnZXRDaHVua09mZnNldCh1aW50MzJfdCBjaHVuaywgb2ZmNjRfdCAqb2Zmc2V0KTsKLSAgICBzdGF0dXNfdCBmaW5kU2FtcGxlVGltZSh1aW50MzJfdCBzYW1wbGVJbmRleCwgdWludDMyX3QgKnRpbWUpOworICAgIHN0YXR1c190IGZpbmRTYW1wbGVUaW1lQW5kRHVyYXRpb24odWludDMyX3Qgc2FtcGxlSW5kZXgsIHVpbnQzMl90ICp0aW1lLCB1aW50MzJfdCAqZHVyYXRpb24pOwogCiAgICAgU2FtcGxlSXRlcmF0b3IoY29uc3QgU2FtcGxlSXRlcmF0b3IgJik7CiAgICAgU2FtcGxlSXRlcmF0b3IgJm9wZXJhdG9yPShjb25zdCBTYW1wbGVJdGVyYXRvciAmKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU2FtcGxlVGFibGUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU2FtcGxlVGFibGUuaAppbmRleCAwMzZkYTJlLi41NTJlZWY3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NhbXBsZVRhYmxlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TYW1wbGVUYWJsZS5oCkBAIC02Niw3ICs2Niw4IEBACiAgICAgICAgICAgICBvZmY2NF90ICpvZmZzZXQsCiAgICAgICAgICAgICBzaXplX3QgKnNpemUsCiAgICAgICAgICAgICB1aW50MzJfdCAqY29tcG9zaXRpb25UaW1lLAotICAgICAgICAgICAgYm9vbCAqaXNTeW5jU2FtcGxlID0gTlVMTCk7CisgICAgICAgICAgICBib29sICppc1N5bmNTYW1wbGUgPSBOVUxMLAorICAgICAgICAgICAgdWludDMyX3QgKnNhbXBsZUR1cmF0aW9uID0gTlVMTCk7CiAKICAgICBlbnVtIHsKICAgICAgICAga0ZsYWdCZWZvcmUsCkBAIC03NCw3ICs3NSw4IEBACiAgICAgICAgIGtGbGFnQ2xvc2VzdAogICAgIH07CiAgICAgc3RhdHVzX3QgZmluZFNhbXBsZUF0VGltZSgKLSAgICAgICAgICAgIHVpbnQzMl90IHJlcV90aW1lLCB1aW50MzJfdCAqc2FtcGxlX2luZGV4LCB1aW50MzJfdCBmbGFncyk7CisgICAgICAgICAgICB1aW50NjRfdCByZXFfdGltZSwgdWludDY0X3Qgc2NhbGVfbnVtLCB1aW50NjRfdCBzY2FsZV9kZW4sCisgICAgICAgICAgICB1aW50MzJfdCAqc2FtcGxlX2luZGV4LCB1aW50MzJfdCBmbGFncyk7CiAKICAgICBzdGF0dXNfdCBmaW5kU3luY1NhbXBsZU5lYXIoCiAgICAgICAgICAgICB1aW50MzJfdCBzdGFydF9zYW1wbGVfaW5kZXgsIHVpbnQzMl90ICpzYW1wbGVfaW5kZXgsCkBAIC0xNDQsNiArMTQ2LDE0IEBACiAKICAgICBmcmllbmQgc3RydWN0IFNhbXBsZUl0ZXJhdG9yOwogCisgICAgLy8gbm9ybWFsbHkgd2UgZG9uJ3Qgcm91bmQKKyAgICBpbmxpbmUgdWludDY0X3QgZ2V0U2FtcGxlVGltZSgKKyAgICAgICAgICAgIHNpemVfdCBzYW1wbGVfaW5kZXgsIHVpbnQ2NF90IHNjYWxlX251bSwgdWludDY0X3Qgc2NhbGVfZGVuKSBjb25zdCB7CisgICAgICAgIHJldHVybiAoc2FtcGxlX2luZGV4IDwgKHNpemVfdCltTnVtU2FtcGxlU2l6ZXMgJiYgbVNhbXBsZVRpbWVFbnRyaWVzICE9IE5VTEwKKyAgICAgICAgICAgICAgICAmJiBzY2FsZV9kZW4gIT0gMCkKKyAgICAgICAgICAgICAgICA/IChtU2FtcGxlVGltZUVudHJpZXNbc2FtcGxlX2luZGV4XS5tQ29tcG9zaXRpb25UaW1lICogc2NhbGVfbnVtKSAvIHNjYWxlX2RlbiA6IDA7CisgICAgfQorCiAgICAgc3RhdHVzX3QgZ2V0U2FtcGxlU2l6ZV9sKHVpbnQzMl90IHNhbXBsZV9pbmRleCwgc2l6ZV90ICpzYW1wbGVfc2l6ZSk7CiAgICAgdWludDMyX3QgZ2V0Q29tcG9zaXRpb25UaW1lT2Zmc2V0KHVpbnQzMl90IHNhbXBsZUluZGV4KTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaAppbmRleCBmOGM2MWViLi41OTFiMzhlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaApAQCAtNTgsNiArNTgsMTEgQEAKICAgICAgICAgfSBtVHJhbnNpdGlvbjsKICAgICB9OwogCisgICAgZW51bSB7CisgICAgICAgIGtTdG9yZU1ldGFEYXRhRXh0ZW5zaW9uSW5kZXggPSBPTVhfSW5kZXhWZW5kb3JTdGFydFVudXNlZCArIDEsCisgICAgICAgIGtQcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFja0luZGV4LAorICAgIH07CisKICAgICB2b2lkIGFkZFBvcnQoY29uc3QgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAmZGVmKTsKIAogICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbEdldFBhcmFtZXRlcigKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmgKaW5kZXggZDA1MGZhNi4uOWU5N2ViZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmgKQEAgLTI3LDggKzI3LDYgQEAKICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKLSNkZWZpbmUgQVJSQVlfU0laRShhKSAoc2l6ZW9mKGEpIC8gc2l6ZW9mKCooYSkpKQotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50IDogcHVibGljIFNpbXBsZVNvZnRPTVhDb21wb25lbnQgewpAQCAtNTcsMTIgKzU1LDMxIEBACiAgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGdldENvbmZpZygKICAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKTsKIAorICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBnZXRFeHRlbnNpb25JbmRleCgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIE9NWF9JTkRFWFRZUEUgKmluZGV4KTsKKwogICAgIHZvaWQgaW5pdFBvcnRzKE9NWF9VMzIgbnVtSW5wdXRCdWZmZXJzLAogICAgICAgICAgICAgT01YX1UzMiBpbnB1dEJ1ZmZlclNpemUsCiAgICAgICAgICAgICBPTVhfVTMyIG51bU91dHB1dEJ1ZmZlcnMsCiAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lVHlwZSk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlUG9ydERlZmluaXRpb25zKCk7CisgICAgdmlydHVhbCB2b2lkIHVwZGF0ZVBvcnREZWZpbml0aW9ucyhib29sIHVwZGF0ZUNyb3AgPSB0cnVlKTsKKworICAgIHVpbnQzMl90IG91dHB1dEJ1ZmZlcldpZHRoKCk7CisgICAgdWludDMyX3Qgb3V0cHV0QnVmZmVySGVpZ2h0KCk7CisKKyAgICBlbnVtIENyb3BTZXR0aW5nc01vZGUgeworICAgICAgICBrQ3JvcFVuU2V0ID0gMCwKKyAgICAgICAga0Nyb3BTZXQsCisgICAgICAgIGtDcm9wQ2hhbmdlZCwKKyAgICB9OworICAgIHZvaWQgaGFuZGxlUG9ydFNldHRpbmdzQ2hhbmdlKAorICAgICAgICAgICAgYm9vbCAqcG9ydFdpbGxSZXNldCwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgIENyb3BTZXR0aW5nc01vZGUgY3JvcFNldHRpbmdzTW9kZSA9IGtDcm9wVW5TZXQsIGJvb2wgZmFrZVN0cmlkZSA9IGZhbHNlKTsKKworICAgIHZvaWQgY29weVlWMTJGcmFtZVRvT3V0cHV0QnVmZmVyKAorICAgICAgICAgICAgdWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmNZLCBjb25zdCB1aW50OF90ICpzcmNVLCBjb25zdCB1aW50OF90ICpzcmNWLAorICAgICAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSk7CiAKICAgICBlbnVtIHsKICAgICAgICAga0lucHV0UG9ydEluZGV4ICA9IDAsCkBAIC03MCw2ICs4Nyw4IEBACiAgICAgICAgIGtNYXhQb3J0SW5kZXggPSAxLAogICAgIH07CiAKKyAgICBib29sIG1Jc0FkYXB0aXZlOworICAgIHVpbnQzMl90IG1BZGFwdGl2ZU1heFdpZHRoLCBtQWRhcHRpdmVNYXhIZWlnaHQ7CiAgICAgdWludDMyX3QgbVdpZHRoLCBtSGVpZ2h0OwogICAgIHVpbnQzMl90IG1Dcm9wTGVmdCwgbUNyb3BUb3AsIG1Dcm9wV2lkdGgsIG1Dcm9wSGVpZ2h0OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYjgxMGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuaApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNPRlRfVklERU9fRU5DT0RFUl9PTVhfQ09NUE9ORU5UX0hfCisKKyNkZWZpbmUgU09GVF9WSURFT19FTkNPREVSX09NWF9DT01QT05FTlRfSF8KKworI2luY2x1ZGUgIlNpbXBsZVNvZnRPTVhDb21wb25lbnQuaCIKKyNpbmNsdWRlIDxzeXN0ZW0vd2luZG93Lmg+CisKK3N0cnVjdCBod19tb2R1bGVfdDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudCA6IHB1YmxpYyBTaW1wbGVTb2Z0T01YQ29tcG9uZW50IHsKKyAgICBTb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50KAorICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKKyAgICAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KTsKKworcHJvdGVjdGVkOgorICAgIHN0YXRpYyB2b2lkIENvbnZlcnRGbGV4WVVWVG9QbGFuYXIoCisgICAgICAgICAgICB1aW50OF90ICpkc3QsIHNpemVfdCBkc3RTdHJpZGUsIHNpemVfdCBkc3RWU3RyaWRlLAorICAgICAgICAgICAgc3RydWN0IGFuZHJvaWRfeWNiY3IgKnljYmNyLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCk7CisKKyAgICBzdGF0aWMgdm9pZCBDb252ZXJ0WVVWNDIwU2VtaVBsYW5hclRvWVVWNDIwUGxhbmFyKAorICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaW5ZVlUsIHVpbnQ4X3QqIG91dFlVViwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpOworCisgICAgc3RhdGljIHZvaWQgQ29udmVydFJHQjMyVG9QbGFuYXIoCisgICAgICAgIHVpbnQ4X3QgKmRzdFksIHNpemVfdCBkc3RTdHJpZGUsIHNpemVfdCBkc3RWU3RyaWRlLAorICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwgc2l6ZV90IHNyY1N0cmlkZSwKKyAgICAgICAgYm9vbCBiZ3IpOworCisgICAgY29uc3QgdWludDhfdCAqZXh0cmFjdEdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICB1aW50OF90ICpkc3QsIHNpemVfdCBkc3RTaXplLCBjb25zdCB1aW50OF90ICpzcmMsIHNpemVfdCBzcmNTaXplLAorICAgICAgICAgICAgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KSBjb25zdDsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBnZXRFeHRlbnNpb25JbmRleChjb25zdCBjaGFyICpuYW1lLCBPTVhfSU5ERVhUWVBFICppbmRleCk7CisKKyAgICBlbnVtIHsKKyAgICAgICAga0lucHV0UG9ydEluZGV4ID0gMCwKKyAgICAgICAga091dHB1dFBvcnRJbmRleCA9IDEsCisgICAgfTsKKworcHJpdmF0ZToKKyAgICBtdXRhYmxlIGNvbnN0IGh3X21vZHVsZV90ICptR3JhbGxvY01vZHVsZTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBTT0ZUX1ZJREVPX0VOQ09ERVJfT01YX0NPTVBPTkVOVF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0d2FyZVJlbmRlcmVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnR3YXJlUmVuZGVyZXIuaAppbmRleCA3YWIwMDQyLi5mYTNlYTg5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnR3YXJlUmVuZGVyZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnR3YXJlUmVuZGVyZXIuaApAQCAtMjQsMTcgKzI0LDE3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IE1ldGFEYXRhOworc3RydWN0IEFNZXNzYWdlOwogCiBjbGFzcyBTb2Z0d2FyZVJlbmRlcmVyIHsKIHB1YmxpYzoKLSAgICBTb2Z0d2FyZVJlbmRlcmVyKAotICAgICAgICAgICAgY29uc3Qgc3A8QU5hdGl2ZVdpbmRvdz4gJm5hdGl2ZVdpbmRvdywgY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhKTsKKyAgICBleHBsaWNpdCBTb2Z0d2FyZVJlbmRlcmVyKGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+ICZuYXRpdmVXaW5kb3cpOwogCiAgICAgflNvZnR3YXJlUmVuZGVyZXIoKTsKIAogICAgIHZvaWQgcmVuZGVyKAotICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIHZvaWQgKnBsYXRmb3JtUHJpdmF0ZSk7CisgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgaW50NjRfdCB0aW1lc3RhbXBOcywKKyAgICAgICAgICAgIHZvaWQgKnBsYXRmb3JtUHJpdmF0ZSwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpOwogCiBwcml2YXRlOgogICAgIGVudW0gWVVWTW9kZSB7CkBAIC01MSw2ICs1MSw4IEBACiAKICAgICBTb2Z0d2FyZVJlbmRlcmVyKGNvbnN0IFNvZnR3YXJlUmVuZGVyZXIgJik7CiAgICAgU29mdHdhcmVSZW5kZXJlciAmb3BlcmF0b3I9KGNvbnN0IFNvZnR3YXJlUmVuZGVyZXIgJik7CisKKyAgICB2b2lkIHJlc2V0Rm9ybWF0SWZDaGFuZ2VkKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oCmluZGV4IGIwMmVkMGUuLjY2MzJjMjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oCkBAIC0zMyw2ICszMyw3IEBACiAgICAgdmlydHVhbCB+U3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcigpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9UaW1lZEV2ZW50UXVldWUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvVGltZWRFdmVudFF1ZXVlLmgKaW5kZXggM2U4NDI1Ni4uMjk2MzE1MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9UaW1lZEV2ZW50UXVldWUuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1RpbWVkRXZlbnRRdWV1ZS5oCkBAIC0xMjIsNyArMTIyLDcgQEAKICAgICB9OwogCiAgICAgc3RydWN0IFN0b3BFdmVudCA6IHB1YmxpYyBUaW1lZEV2ZW50UXVldWU6OkV2ZW50IHsKLSAgICAgICAgdmlydHVhbCB2b2lkIGZpcmUoVGltZWRFdmVudFF1ZXVlICpxdWV1ZSwgaW50NjRfdCBub3dfdXMpIHsKKyAgICAgICAgdmlydHVhbCB2b2lkIGZpcmUoVGltZWRFdmVudFF1ZXVlICpxdWV1ZSwgaW50NjRfdCAvKiBub3dfdXMgKi8pIHsKICAgICAgICAgICAgIHF1ZXVlLT5tU3RvcHBlZCA9IHRydWU7CiAgICAgICAgIH0KICAgICB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9XVk1FeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvV1ZNRXh0cmFjdG9yLmgKaW5kZXggOGU2Mjk0Ni4uYWI3ZThiOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9XVk1FeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1dWTUV4dHJhY3Rvci5oCkBAIC00OSw2ICs0OSw3IEBACiAgICAgdmlydHVhbCBzcDxNZWRpYVNvdXJjZT4gZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKICAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRUcmFja01ldGFEYXRhKHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwogICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldE1ldGFEYXRhKCk7CisgICAgdmlydHVhbCB2b2lkIHNldFVJRCh1aWRfdCB1aWQpOwogCiAgICAgLy8gUmV0dXJuIHRoZSBhbW91bnQgb2YgZGF0YSBjYWNoZWQgZnJvbSB0aGUgY3VycmVudAogICAgIC8vIHBsYXliYWNrIHBvc2l0aWlvbiAoaW4gdXMpLgpAQCAtNzQsOCArNzUsNiBAQAogICAgIC8vIGNvZGVjLgogICAgIHZvaWQgc2V0Q3J5cHRvUGx1Z2luTW9kZShib29sIGNyeXB0b1BsdWdpbk1vZGUpOwogCi0gICAgdm9pZCBzZXRVSUQodWlkX3QgdWlkKTsKLQogICAgIHN0YXRpYyBib29sIGdldFZlbmRvckxpYkhhbmRsZSgpOwogCiAgICAgc3RhdHVzX3QgZ2V0RXJyb3IoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvY2hyb21pdW1faHR0cF9zdHViLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL2Nocm9taXVtX2h0dHBfc3R1Yi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDY1MWE0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvY2hyb21pdW1faHR0cF9zdHViLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBDSFJPTUlVTV9IVFRQX1NUVUJfSF8KLSNkZWZpbmUgQ0hST01JVU1fSFRUUF9TVFVCX0hfCi0KLSNpbmNsdWRlIDxpbmNsdWRlL0hUVFBCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1leHRlcm4gIkMiIHsKLUhUVFBCYXNlICpjcmVhdGVDaHJvbWl1bUhUVFBEYXRhU291cmNlKHVpbnQzMl90IGZsYWdzKTsKLQotc3RhdHVzX3QgVXBkYXRlQ2hyb21pdW1IVFRQRGF0YVNvdXJjZVByb3h5Q29uZmlnKAotICAgICAgICBjb25zdCBjaGFyICpob3N0LCBpbnQzMl90IHBvcnQsIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QpOwotCi1EYXRhU291cmNlICpjcmVhdGVEYXRhVXJpU291cmNlKGNvbnN0IGNoYXIgKnVyaSk7Ci19Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL0FuZHJvaWQubWsKaW5kZXggMmQ4YzFlMS4uNDQ2ZmY4YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9BbmRyb2lkLm1rCkBAIC04LDcgKzgsNyBAQAogICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvbGlidnB4L2xpYndlYm0gXAogICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKIAotTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyCitMT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIgLVdlcnJvcgogCiBMT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF9tYXRyb3NrYQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NYXRyb3NrYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NYXRyb3NrYUV4dHJhY3Rvci5jcHAKaW5kZXggMjVkMGNmMS4uNDRhMWUyMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTWF0cm9za2FFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmNwcApAQCAtMjAsOCArMjAsNiBAQAogCiAjaW5jbHVkZSAiTWF0cm9za2FFeHRyYWN0b3IuaCIKIAotI2luY2x1ZGUgIm1rdnBhcnNlci5ocHAiCi0KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CkBAIC0zNCw2ICszMiw4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBEYXRhU291cmNlUmVhZGVyIDogcHVibGljIG1rdnBhcnNlcjo6SU1rdlJlYWRlciB7CkBAIC04OCw3ICs4OCw3IEBACiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBzdHJ1Y3QgQmxvY2tJdGVyYXRvciB7Ci0gICAgQmxvY2tJdGVyYXRvcihNYXRyb3NrYUV4dHJhY3RvciAqZXh0cmFjdG9yLCB1bnNpZ25lZCBsb25nIHRyYWNrTnVtKTsKKyAgICBCbG9ja0l0ZXJhdG9yKE1hdHJvc2thRXh0cmFjdG9yICpleHRyYWN0b3IsIHVuc2lnbmVkIGxvbmcgdHJhY2tOdW0sIHVuc2lnbmVkIGxvbmcgaW5kZXgpOwogCiAgICAgYm9vbCBlb3MoKSBjb25zdDsKIApAQCAtMTA0LDcgKzEwNCw4IEBACiAKIHByaXZhdGU6CiAgICAgTWF0cm9za2FFeHRyYWN0b3IgKm1FeHRyYWN0b3I7Ci0gICAgdW5zaWduZWQgbG9uZyBtVHJhY2tOdW07CisgICAgbG9uZyBsb25nIG1UcmFja051bTsKKyAgICB1bnNpZ25lZCBsb25nIG1JbmRleDsKIAogICAgIGNvbnN0IG1rdnBhcnNlcjo6Q2x1c3RlciAqbUNsdXN0ZXI7CiAgICAgY29uc3QgbWt2cGFyc2VyOjpCbG9ja0VudHJ5ICptQmxvY2tFbnRyeTsKQEAgLTE1Niw2ICsxNTcsNTMgQEAKICAgICBNYXRyb3NrYVNvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IE1hdHJvc2thU291cmNlICYpOwogfTsKIAorY29uc3QgbWt2cGFyc2VyOjpUcmFjayogTWF0cm9za2FFeHRyYWN0b3I6OlRyYWNrSW5mbzo6Z2V0VHJhY2soKSBjb25zdCB7CisgICAgcmV0dXJuIG1FeHRyYWN0b3ItPm1TZWdtZW50LT5HZXRUcmFja3MoKS0+R2V0VHJhY2tCeU51bWJlcihtVHJhY2tOdW0pOworfQorCisvLyBUaGlzIGZ1bmN0aW9uIGRvZXMgZXhhY3RseSB0aGUgc2FtZSBhcyBta3ZwYXJzZXI6OkN1ZXM6OkZpbmQsIGV4Y2VwdCB0aGF0IGl0CisvLyBzZWFyY2hlcyBpbiBvdXIgb3duIHRyYWNrIGJhc2VkIHZlY3RvcnMuIFdlIHNob3VsZCBub3QgbmVlZCB0aGlzIG9uY2UgbWt2cGFyc2VyCisvLyBhZGRzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkuCitjb25zdCBta3ZwYXJzZXI6OkN1ZVBvaW50OjpUcmFja1Bvc2l0aW9uICpNYXRyb3NrYUV4dHJhY3Rvcjo6VHJhY2tJbmZvOjpmaW5kKAorICAgICAgICBsb25nIGxvbmcgdGltZU5zKSBjb25zdCB7CisgICAgQUxPR1YoIm1DdWVQb2ludHMuc2l6ZSAlenUiLCBtQ3VlUG9pbnRzLnNpemUoKSk7CisgICAgaWYgKG1DdWVQb2ludHMuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBjb25zdCBta3ZwYXJzZXI6OkN1ZVBvaW50KiBjcCA9IG1DdWVQb2ludHMuaXRlbUF0KDApOworICAgIGNvbnN0IG1rdnBhcnNlcjo6VHJhY2sqIHRyYWNrID0gZ2V0VHJhY2soKTsKKyAgICBpZiAodGltZU5zIDw9IGNwLT5HZXRUaW1lKG1FeHRyYWN0b3ItPm1TZWdtZW50KSkgeworICAgICAgICByZXR1cm4gY3AtPkZpbmQodHJhY2spOworICAgIH0KKworICAgIC8vIEJpbmFyeSBzZWFyY2hlcyB0aHJvdWdoIHJlbGV2YW50IGN1ZXM7IGFzc3VtZXMgY3VlcyBhcmUgb3JkZXJlZCBieSB0aW1lY29kZS4KKyAgICAvLyBJZiB3ZSBkbyBkZXRlY3Qgb3V0LW9mLW9yZGVyIGN1ZXMsIHJldHVybiBOVUxMLgorICAgIHNpemVfdCBsbyA9IDA7CisgICAgc2l6ZV90IGhpID0gbUN1ZVBvaW50cy5zaXplKCk7CisgICAgd2hpbGUgKGxvIDwgaGkpIHsKKyAgICAgICAgY29uc3Qgc2l6ZV90IG1pZCA9IGxvICsgKGhpIC0gbG8pIC8gMjsKKyAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpDdWVQb2ludCogY29uc3QgbWlkQ3AgPSBtQ3VlUG9pbnRzLml0ZW1BdChtaWQpOworICAgICAgICBjb25zdCBsb25nIGxvbmcgY3VlVGltZU5zID0gbWlkQ3AtPkdldFRpbWUobUV4dHJhY3Rvci0+bVNlZ21lbnQpOworICAgICAgICBpZiAoY3VlVGltZU5zIDw9IHRpbWVOcykgeworICAgICAgICAgICAgbG8gPSBtaWQgKyAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaGkgPSBtaWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobG8gPT0gMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBjcCA9IG1DdWVQb2ludHMuaXRlbUF0KGxvIC0gMSk7CisgICAgaWYgKGNwLT5HZXRUaW1lKG1FeHRyYWN0b3ItPm1TZWdtZW50KSA+IHRpbWVOcykgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gY3AtPkZpbmQodHJhY2spOworfQorCiBNYXRyb3NrYVNvdXJjZTo6TWF0cm9za2FTb3VyY2UoCiAgICAgICAgIGNvbnN0IHNwPE1hdHJvc2thRXh0cmFjdG9yPiAmZXh0cmFjdG9yLCBzaXplX3QgaW5kZXgpCiAgICAgOiBtRXh0cmFjdG9yKGV4dHJhY3RvciksCkBAIC0xNjMsNyArMjExLDggQEAKICAgICAgIG1UeXBlKE9USEVSKSwKICAgICAgIG1Jc0F1ZGlvKGZhbHNlKSwKICAgICAgIG1CbG9ja0l0ZXIobUV4dHJhY3Rvci5nZXQoKSwKLSAgICAgICAgICAgICAgICAgbUV4dHJhY3Rvci0+bVRyYWNrcy5pdGVtQXQoaW5kZXgpLm1UcmFja051bSksCisgICAgICAgICAgICAgICAgIG1FeHRyYWN0b3ItPm1UcmFja3MuaXRlbUF0KGluZGV4KS5tVHJhY2tOdW0sCisgICAgICAgICAgICAgICAgIGluZGV4KSwKICAgICAgIG1OQUxTaXplTGVuKDApIHsKICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1FeHRyYWN0b3ItPm1UcmFja3MuaXRlbUF0KGluZGV4KS5tTWV0YTsKIApAQCAtMTg0LDcgKzIzMyw3IEBACiAgICAgICAgIENIRUNLX0dFKGF2Y2NTaXplLCA1dSk7CiAKICAgICAgICAgbU5BTFNpemVMZW4gPSAxICsgKGF2Y2NbNF0gJiAzKTsKLSAgICAgICAgQUxPR1YoIm1OQUxTaXplTGVuID0gJWQiLCBtTkFMU2l6ZUxlbik7CisgICAgICAgIEFMT0dWKCJtTkFMU2l6ZUxlbiA9ICV6dSIsIG1OQUxTaXplTGVuKTsKICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQykpIHsKICAgICAgICAgbVR5cGUgPSBBQUM7CiAgICAgfQpAQCAtMTk0LDcgKzI0Myw3IEBACiAgICAgY2xlYXJQZW5kaW5nRnJhbWVzKCk7CiB9CiAKLXN0YXR1c190IE1hdHJvc2thU291cmNlOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7CitzdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6c3RhcnQoTWV0YURhdGEgKiAvKiBwYXJhbXMgKi8pIHsKICAgICBtQmxvY2tJdGVyLnJlc2V0KCk7CiAKICAgICByZXR1cm4gT0s7CkBAIC0yMTMsOSArMjYyLDEwIEBACiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBCbG9ja0l0ZXJhdG9yOjpCbG9ja0l0ZXJhdG9yKAotICAgICAgICBNYXRyb3NrYUV4dHJhY3RvciAqZXh0cmFjdG9yLCB1bnNpZ25lZCBsb25nIHRyYWNrTnVtKQorICAgICAgICBNYXRyb3NrYUV4dHJhY3RvciAqZXh0cmFjdG9yLCB1bnNpZ25lZCBsb25nIHRyYWNrTnVtLCB1bnNpZ25lZCBsb25nIGluZGV4KQogICAgIDogbUV4dHJhY3RvcihleHRyYWN0b3IpLAogICAgICAgbVRyYWNrTnVtKHRyYWNrTnVtKSwKKyAgICAgIG1JbmRleChpbmRleCksCiAgICAgICBtQ2x1c3RlcihOVUxMKSwKICAgICAgIG1CbG9ja0VudHJ5KE5VTEwpLAogICAgICAgbUJsb2NrRW50cnlJbmRleCgwKSB7CkBAIC0zMTQsMTQgKzM2NCwxNCBAQAogCiAgICAgKmFjdHVhbEZyYW1lVGltZVVzID0gLTFsbDsKIAotICAgIGNvbnN0IGludDY0X3Qgc2Vla1RpbWVOcyA9IHNlZWtUaW1lVXMgKiAxMDAwbGw7CisgICAgY29uc3QgaW50NjRfdCBzZWVrVGltZU5zID0gc2Vla1RpbWVVcyAqIDEwMDBsbCAtIG1FeHRyYWN0b3ItPm1TZWVrUHJlUm9sbE5zOwogCiAgICAgbWt2cGFyc2VyOjpTZWdtZW50KiBjb25zdCBwU2VnbWVudCA9IG1FeHRyYWN0b3ItPm1TZWdtZW50OwogCiAgICAgLy8gU3BlY2lhbCBjYXNlIHRoZSAwIHNlZWsgdG8gYXZvaWQgbG9hZGluZyBDdWVzIHdoZW4gdGhlIGFwcGxpY2F0aW9uCiAgICAgLy8gZXh0cmFuZW91c2x5IHNlZWtzIHRvIDAgYmVmb3JlIHBsYXlpbmcuCiAgICAgaWYgKHNlZWtUaW1lTnMgPD0gMCkgewotICAgICAgICBBTE9HVigiU2VlayB0byBiZWdpbm5pbmc6ICVsbGQiLCBzZWVrVGltZVVzKTsKKyAgICAgICAgQUxPR1YoIlNlZWsgdG8gYmVnaW5uaW5nOiAlIiBQUklkNjQsIHNlZWtUaW1lVXMpOwogICAgICAgICBtQ2x1c3RlciA9IHBTZWdtZW50LT5HZXRGaXJzdCgpOwogICAgICAgICBtQmxvY2tFbnRyeUluZGV4ID0gMDsKICAgICAgICAgZG8gewpAQCAtMzMwLDcgKzM4MCw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBBTE9HVigiU2Vla2luZyB0bzogJWxsZCIsIHNlZWtUaW1lVXMpOworICAgIEFMT0dWKCJTZWVraW5nIHRvOiAlIiBQUklkNjQsIHNlZWtUaW1lVXMpOwogCiAgICAgLy8gSWYgdGhlIEN1ZXMgaGF2ZSBub3QgYmVlbiBsb2NhdGVkIHRoZW4gZmluZCB0aGVtLgogICAgIGNvbnN0IG1rdnBhcnNlcjo6Q3VlcyogcEN1ZXMgPSBwU2VnbWVudC0+R2V0Q3VlcygpOwpAQCAtMzYzLDkgKzQxMywyMCBAQAogICAgIH0KIAogICAgIGNvbnN0IG1rdnBhcnNlcjo6Q3VlUG9pbnQqIHBDUDsKKyAgICBta3ZwYXJzZXI6OlRyYWNrcyBjb25zdCAqcFRyYWNrcyA9IHBTZWdtZW50LT5HZXRUcmFja3MoKTsKKyAgICB1bnNpZ25lZCBsb25nIGludCB0cmFja0NvdW50ID0gcFRyYWNrcy0+R2V0VHJhY2tzQ291bnQoKTsKICAgICB3aGlsZSAoIXBDdWVzLT5Eb25lUGFyc2luZygpKSB7CiAgICAgICAgIHBDdWVzLT5Mb2FkQ3VlUG9pbnQoKTsKICAgICAgICAgcENQID0gcEN1ZXMtPkdldExhc3QoKTsKKyAgICAgICAgQ0hFQ0socENQKTsKKworICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgdHJhY2tDb3VudDsgKytpbmRleCkgeworICAgICAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpUcmFjayAqcFRyYWNrID0gcFRyYWNrcy0+R2V0VHJhY2tCeUluZGV4KGluZGV4KTsKKyAgICAgICAgICAgIGlmIChwVHJhY2sgJiYgcFRyYWNrLT5HZXRUeXBlKCkgPT0gMSAmJiBwQ1AtPkZpbmQocFRyYWNrKSkgeyAvLyBWSURFT19UUkFDSworICAgICAgICAgICAgICAgIE1hdHJvc2thRXh0cmFjdG9yOjpUcmFja0luZm8mIHRyYWNrID0gbUV4dHJhY3Rvci0+bVRyYWNrcy5lZGl0SXRlbUF0KGluZGV4KTsKKyAgICAgICAgICAgICAgICB0cmFjay5tQ3VlUG9pbnRzLnB1c2hfYmFjayhwQ1ApOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKICAgICAgICAgaWYgKHBDUC0+R2V0VGltZShwU2VnbWVudCkgPj0gc2Vla1RpbWVOcykgewogICAgICAgICAgICAgQUxPR1YoIlBhcnNlZCBwYXN0IHJlbGV2YW50IEN1ZSIpOwpAQCAtMzczLDIyICs0MzQsMjUgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIFRoZSBDdWUgaW5kZXggaXMgYnVpbHQgYXJvdW5kIHZpZGVvIGtleWZyYW1lcwotICAgIG1rdnBhcnNlcjo6VHJhY2tzIGNvbnN0ICpwVHJhY2tzID0gcFNlZ21lbnQtPkdldFRyYWNrcygpOwotICAgIGNvbnN0IG1rdnBhcnNlcjo6VHJhY2sgKnBUcmFjayA9IE5VTEw7Ci0gICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHBUcmFja3MtPkdldFRyYWNrc0NvdW50KCk7ICsraW5kZXgpIHsKLSAgICAgICAgcFRyYWNrID0gcFRyYWNrcy0+R2V0VHJhY2tCeUluZGV4KGluZGV4KTsKLSAgICAgICAgaWYgKHBUcmFjayAmJiBwVHJhY2stPkdldFR5cGUoKSA9PSAxKSB7IC8vIFZJREVPX1RSQUNLCi0gICAgICAgICAgICBBTE9HVigiVmlkZW8gdHJhY2sgbG9jYXRlZCBhdCAlZCIsIGluZGV4KTsKLSAgICAgICAgICAgIGJyZWFrOworICAgIGNvbnN0IG1rdnBhcnNlcjo6Q3VlUG9pbnQ6OlRyYWNrUG9zaXRpb24gKnBUUCA9IE5VTEw7CisgICAgY29uc3QgbWt2cGFyc2VyOjpUcmFjayAqdGhpc1RyYWNrID0gcFRyYWNrcy0+R2V0VHJhY2tCeUluZGV4KG1JbmRleCk7CisgICAgaWYgKHRoaXNUcmFjay0+R2V0VHlwZSgpID09IDEpIHsgLy8gdmlkZW8KKyAgICAgICAgTWF0cm9za2FFeHRyYWN0b3I6OlRyYWNrSW5mbyYgdHJhY2sgPSBtRXh0cmFjdG9yLT5tVHJhY2tzLmVkaXRJdGVtQXQobUluZGV4KTsKKyAgICAgICAgcFRQID0gdHJhY2suZmluZChzZWVrVGltZU5zKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBUaGUgQ3VlIGluZGV4IGlzIGJ1aWx0IGFyb3VuZCB2aWRlbyBrZXlmcmFtZXMKKyAgICAgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHRyYWNrQ291bnQ7ICsraW5kZXgpIHsKKyAgICAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6VHJhY2sgKnBUcmFjayA9IHBUcmFja3MtPkdldFRyYWNrQnlJbmRleChpbmRleCk7CisgICAgICAgICAgICBpZiAocFRyYWNrICYmIHBUcmFjay0+R2V0VHlwZSgpID09IDEgJiYgcEN1ZXMtPkZpbmQoc2Vla1RpbWVOcywgcFRyYWNrLCBwQ1AsIHBUUCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiVmlkZW8gdHJhY2sgbG9jYXRlZCBhdCAlenUiLCBpbmRleCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKKwogICAgIC8vIEFsd2F5cyAqc2VhcmNoKiBiYXNlZCBvbiB0aGUgdmlkZW8gdHJhY2ssIGJ1dCBmaW5hbGl6ZSBiYXNlZCBvbiBtVHJhY2tOdW0KLSAgICBjb25zdCBta3ZwYXJzZXI6OkN1ZVBvaW50OjpUcmFja1Bvc2l0aW9uKiBwVFA7Ci0gICAgaWYgKHBUcmFjayAmJiBwVHJhY2stPkdldFR5cGUoKSA9PSAxKSB7Ci0gICAgICAgIHBDdWVzLT5GaW5kKHNlZWtUaW1lTnMsIHBUcmFjaywgcENQLCBwVFApOwotICAgIH0gZWxzZSB7CisgICAgaWYgKCFwVFApIHsKICAgICAgICAgQUxPR0UoIkRpZCBub3QgbG9jYXRlIHRoZSB2aWRlbyB0cmFjayBmb3Igc2Vla2luZyIpOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNDA5LDEwICs0NzMsMTMgQEAKIAogICAgICAgICBpZiAoaXNBdWRpbyB8fCBibG9jaygpLT5Jc0tleSgpKSB7CiAgICAgICAgICAgICAvLyBBY2NlcHQgdGhlIGZpcnN0IGtleSBmcmFtZQotICAgICAgICAgICAgKmFjdHVhbEZyYW1lVGltZVVzID0gKGJsb2NrKCktPkdldFRpbWUobUNsdXN0ZXIpICsgNTAwTEwpIC8gMTAwMExMOwotICAgICAgICAgICAgQUxPR1YoIlJlcXVlc3RlZCBzZWVrIHBvaW50OiAlbGxkIGFjdHVhbDogJWxsZCIsCi0gICAgICAgICAgICAgICAgICBzZWVrVGltZVVzLCBhY3R1YWxGcmFtZVRpbWVVcyk7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGludDY0X3QgZnJhbWVUaW1lVXMgPSAoYmxvY2soKS0+R2V0VGltZShtQ2x1c3RlcikgKyA1MDBMTCkgLyAxMDAwTEw7CisgICAgICAgICAgICBpZiAodGhpc1RyYWNrLT5HZXRUeXBlKCkgPT0gMSB8fCBmcmFtZVRpbWVVcyA+PSBzZWVrVGltZVVzKSB7CisgICAgICAgICAgICAgICAgKmFjdHVhbEZyYW1lVGltZVVzID0gZnJhbWVUaW1lVXM7CisgICAgICAgICAgICAgICAgQUxPR1YoIlJlcXVlc3RlZCBzZWVrIHBvaW50OiAlIiBQUklkNjQgIiBhY3R1YWw6ICUiIFBSSWQ2NCwKKyAgICAgICAgICAgICAgICAgICAgICBzZWVrVGltZVVzLCAqYWN0dWFsRnJhbWVUaW1lVXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQpAQCAtNjM0LDcgKzcwMSw4IEBACiAgICAgICBtUmVhZGVyKG5ldyBEYXRhU291cmNlUmVhZGVyKG1EYXRhU291cmNlKSksCiAgICAgICBtU2VnbWVudChOVUxMKSwKICAgICAgIG1FeHRyYWN0ZWRUaHVtYm5haWxzKGZhbHNlKSwKLSAgICAgIG1Jc1dlYm0oZmFsc2UpIHsKKyAgICAgIG1Jc1dlYm0oZmFsc2UpLAorICAgICAgbVNlZWtQcmVSb2xsTnMoMCkgewogICAgIG9mZjY0X3Qgc2l6ZTsKICAgICBtSXNMaXZlU3RyZWFtaW5nID0KICAgICAgICAgKG1EYXRhU291cmNlLT5mbGFncygpCkBAIC02NjAsMTQgKzcyOCwyMiBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCisgICAgLy8gZnJvbSBta3ZwYXJzZXI6OlNlZ21lbnQ6OkxvYWQoKSwgYnV0IHN0b3AgYXQgZmlyc3QgY2x1c3RlcgogICAgIHJldCA9IG1TZWdtZW50LT5QYXJzZUhlYWRlcnMoKTsKLSAgICBDSEVDS19FUShyZXQsIDApOwotCi0gICAgbG9uZyBsZW47Ci0gICAgcmV0ID0gbVNlZ21lbnQtPkxvYWRDbHVzdGVyKHBvcywgbGVuKTsKLSAgICBDSEVDS19FUShyZXQsIDApOworICAgIGlmIChyZXQgPT0gMCkgeworICAgICAgICBsb25nIGxlbjsKKyAgICAgICAgcmV0ID0gbVNlZ21lbnQtPkxvYWRDbHVzdGVyKHBvcywgbGVuKTsKKyAgICAgICAgaWYgKHJldCA+PSAxKSB7CisgICAgICAgICAgICAvLyBubyBtb3JlIGNsdXN0ZXJzCisgICAgICAgICAgICByZXQgPSAwOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChyZXQgPiAwKSB7CisgICAgICAgIHJldCA9IG1rdnBhcnNlcjo6RV9CVUZGRVJfTk9UX0ZVTEw7CisgICAgfQogCiAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgQUxPR1coIkNvcnJ1cHQgJXMgc291cmNlOiAlcyIsIG1Jc1dlYm0gPyAid2VibSIgOiAibWF0cm9za2EiLAorICAgICAgICAgICAgICAgIHVyaURlYnVnU3RyaW5nKG1EYXRhU291cmNlLT5nZXRVcmkoKSkuY19zdHIoKSk7CiAgICAgICAgIGRlbGV0ZSBtU2VnbWVudDsKICAgICAgICAgbVNlZ21lbnQgPSBOVUxMOwogICAgICAgICByZXR1cm47CkBAIC05MzgsNiArMTAxNCwxMiBAQAogCiAgICAgICAgICAgICAgICAgICAgIGVyciA9IGFkZFZvcmJpc0NvZGVjSW5mbygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiQV9PUFVTIiwgY29kZWNJRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMpOworICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlPcHVzSGVhZGVyLCAwLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOworICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQ2NChrS2V5T3B1c0NvZGVjRGVsYXksIHRyYWNrLT5HZXRDb2RlY0RlbGF5KCkpOworICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQ2NChrS2V5T3B1c1NlZWtQcmVSb2xsLCB0cmFjay0+R2V0U2Vla1ByZVJvbGwoKSk7CisgICAgICAgICAgICAgICAgICAgIG1TZWVrUHJlUm9sbE5zID0gdHJhY2stPkdldFNlZWtQcmVSb2xsKCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJBX01QRUcvTDMiLCBjb2RlY0lEKSkgewogICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRyk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTk2Niw2ICsxMDQ4LDcgQEAKICAgICAgICAgVHJhY2tJbmZvICp0cmFja0luZm8gPSAmbVRyYWNrcy5lZGl0SXRlbUF0KG1UcmFja3Muc2l6ZSgpIC0gMSk7CiAgICAgICAgIHRyYWNrSW5mby0+bVRyYWNrTnVtID0gdHJhY2stPkdldE51bWJlcigpOwogICAgICAgICB0cmFja0luZm8tPm1NZXRhID0gbWV0YTsKKyAgICAgICAgdHJhY2tJbmZvLT5tRXh0cmFjdG9yID0gdGhpczsKICAgICB9CiB9CiAKQEAgLTk4MCw3ICsxMDYzLDcgQEAKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAgICAgQmxvY2tJdGVyYXRvciBpdGVyKHRoaXMsIGluZm8tPm1UcmFja051bSk7CisgICAgICAgIEJsb2NrSXRlcmF0b3IgaXRlcih0aGlzLCBpbmZvLT5tVHJhY2tOdW0sIGkpOwogICAgICAgICBpbnQzMl90IGogPSAwOwogICAgICAgICBpbnQ2NF90IHRodW1ibmFpbFRpbWVVcyA9IDA7CiAgICAgICAgIHNpemVfdCBtYXhCbG9ja1NpemUgPSAwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTWF0cm9za2FFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmgKaW5kZXggMTI5NGI0Zi4uZGIzNmJmOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTWF0cm9za2FFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NYXRyb3NrYUV4dHJhY3Rvci5oCkBAIC0xOCwxNCArMTgsMTIgQEAKIAogI2RlZmluZSBNQVRST1NLQV9FWFRSQUNUT1JfSF8KIAorI2luY2x1ZGUgIm1rdnBhcnNlci5ocHAiCisKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KIAotbmFtZXNwYWNlIG1rdnBhcnNlciB7Ci1zdHJ1Y3QgU2VnbWVudDsKLX07Ci0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFNZXNzYWdlOwpAQCAtNTgsNiArNTYsMTEgQEAKICAgICBzdHJ1Y3QgVHJhY2tJbmZvIHsKICAgICAgICAgdW5zaWduZWQgbG9uZyBtVHJhY2tOdW07CiAgICAgICAgIHNwPE1ldGFEYXRhPiBtTWV0YTsKKyAgICAgICAgY29uc3QgTWF0cm9za2FFeHRyYWN0b3IgKm1FeHRyYWN0b3I7CisgICAgICAgIFZlY3Rvcjxjb25zdCBta3ZwYXJzZXI6OkN1ZVBvaW50Kj4gbUN1ZVBvaW50czsKKworICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrKiBnZXRUcmFjaygpIGNvbnN0OworICAgICAgICBjb25zdCBta3ZwYXJzZXI6OkN1ZVBvaW50OjpUcmFja1Bvc2l0aW9uICpmaW5kKGxvbmcgbG9uZyB0aW1lTnMpIGNvbnN0OwogICAgIH07CiAKICAgICBNdXRleCBtTG9jazsKQEAgLTY5LDYgKzcyLDcgQEAKICAgICBib29sIG1FeHRyYWN0ZWRUaHVtYm5haWxzOwogICAgIGJvb2wgbUlzTGl2ZVN0cmVhbWluZzsKICAgICBib29sIG1Jc1dlYm07CisgICAgaW50NjRfdCBtU2Vla1ByZVJvbGxOczsKIAogICAgIHZvaWQgYWRkVHJhY2tzKCk7CiAgICAgdm9pZCBmaW5kVGh1bWJuYWlscygpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXA0L0ZyYWdtZW50ZWRNUDRQYXJzZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXA0L0ZyYWdtZW50ZWRNUDRQYXJzZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTAyNjU2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wNC9GcmFnbWVudGVkTVA0UGFyc2VyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5OTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiRnJhZ21lbnRlZE1QNFBhcnNlciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgImluY2x1ZGUvYXZjX3V0aWxzLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9FU0RTLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9GcmFnbWVudGVkTVA0UGFyc2VyLmgiCi0jaW5jbHVkZSAiVHJhY2tGcmFnbWVudC5oIgotCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+Ci0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgY29uc3QgY2hhciAqRm91cmNjMlN0cmluZyh1aW50MzJfdCBmb3VyY2MpIHsKLSAgICBzdGF0aWMgY2hhciBidWZmZXJbNV07Ci0gICAgYnVmZmVyWzRdID0gJ1wwJzsKLSAgICBidWZmZXJbMF0gPSBmb3VyY2MgPj4gMjQ7Ci0gICAgYnVmZmVyWzFdID0gKGZvdXJjYyA+PiAxNikgJiAweGZmOwotICAgIGJ1ZmZlclsyXSA9IChmb3VyY2MgPj4gOCkgJiAweGZmOwotICAgIGJ1ZmZlclszXSA9IGZvdXJjYyAmIDB4ZmY7Ci0KLSAgICByZXR1cm4gYnVmZmVyOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqSW5kZW50U3RyaW5nKHNpemVfdCBuKSB7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIga1NwYWNlW10gPSAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjsKLSAgICByZXR1cm4ga1NwYWNlICsgc2l6ZW9mKGtTcGFjZSkgLSAyICogbiAtIDE7Ci19Ci0KLS8vIHN0YXRpYwotY29uc3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6RGlzcGF0Y2hFbnRyeSBGcmFnbWVudGVkTVA0UGFyc2VyOjprRGlzcGF0Y2hUYWJsZVtdID0gewotICAgIHsgRk9VUkNDKCdtJywgJ28nLCAnbycsICd2JyksIDAsIE5VTEwgfSwKLSAgICB7IEZPVVJDQygndCcsICdyJywgJ2EnLCAnaycpLCBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ3YnKSwgTlVMTCB9LAotICAgIHsgRk9VUkNDKCd1JywgJ2QnLCAndCcsICdhJyksIEZPVVJDQygndCcsICdyJywgJ2EnLCAnaycpLCBOVUxMIH0sCi0gICAgeyBGT1VSQ0MoJ3UnLCAnZCcsICd0JywgJ2EnKSwgRk9VUkNDKCdtJywgJ28nLCAnbycsICd2JyksIE5VTEwgfSwKLSAgICB7IEZPVVJDQygnbScsICdlJywgJ3QnLCAnYScpLCBGT1VSQ0MoJ3UnLCAnZCcsICd0JywgJ2EnKSwgTlVMTCB9LAotICAgIHsgRk9VUkNDKCdpJywgJ2wnLCAncycsICd0JyksIEZPVVJDQygnbScsICdlJywgJ3QnLCAnYScpLCBOVUxMIH0sCi0KLSAgICB7IEZPVVJDQygndCcsICdrJywgJ2gnLCAnZCcpLCBGT1VSQ0MoJ3QnLCAncicsICdhJywgJ2snKSwKLSAgICAgICAgJkZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlVHJhY2tIZWFkZXIKLSAgICB9LAotCi0gICAgeyBGT1VSQ0MoJ20nLCAndicsICdlJywgJ3gnKSwgRk9VUkNDKCdtJywgJ28nLCAnbycsICd2JyksIE5VTEwgfSwKLQotICAgIHsgRk9VUkNDKCd0JywgJ3InLCAnZScsICd4JyksIEZPVVJDQygnbScsICd2JywgJ2UnLCAneCcpLAotICAgICAgICAmRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VUcmFja0V4dGVuZHMKLSAgICB9LAotCi0gICAgeyBGT1VSQ0MoJ2UnLCAnZCcsICd0JywgJ3MnKSwgRk9VUkNDKCd0JywgJ3InLCAnYScsICdrJyksIE5VTEwgfSwKLSAgICB7IEZPVVJDQygnbScsICdkJywgJ2knLCAnYScpLCBGT1VSQ0MoJ3QnLCAncicsICdhJywgJ2snKSwgTlVMTCB9LAotCi0gICAgeyBGT1VSQ0MoJ20nLCAnZCcsICdoJywgJ2QnKSwgRk9VUkNDKCdtJywgJ2QnLCAnaScsICdhJyksCi0gICAgICAgICZGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZU1lZGlhSGVhZGVyCi0gICAgfSwKLQotICAgIHsgRk9VUkNDKCdoJywgJ2QnLCAnbCcsICdyJyksIEZPVVJDQygnbScsICdkJywgJ2knLCAnYScpLAotICAgICAgICAmRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VNZWRpYUhhbmRsZXIKLSAgICB9LAotCi0gICAgeyBGT1VSQ0MoJ20nLCAnaScsICduJywgJ2YnKSwgRk9VUkNDKCdtJywgJ2QnLCAnaScsICdhJyksIE5VTEwgfSwKLSAgICB7IEZPVVJDQygnZCcsICdpJywgJ24nLCAnZicpLCBGT1VSQ0MoJ20nLCAnaScsICduJywgJ2YnKSwgTlVMTCB9LAotICAgIHsgRk9VUkNDKCdzJywgJ3QnLCAnYicsICdsJyksIEZPVVJDQygnbScsICdpJywgJ24nLCAnZicpLCBOVUxMIH0sCi0gICAgeyBGT1VSQ0MoJ3MnLCAndCcsICdzJywgJ2QnKSwgRk9VUkNDKCdzJywgJ3QnLCAnYicsICdsJyksIE5VTEwgfSwKLQotICAgIHsgRk9VUkNDKCdzJywgJ3QnLCAncycsICd6JyksIEZPVVJDQygncycsICd0JywgJ2InLCAnbCcpLAotICAgICAgICAmRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VTYW1wbGVTaXplcyB9LAotCi0gICAgeyBGT1VSQ0MoJ3MnLCAndCcsICd6JywgJzInKSwgRk9VUkNDKCdzJywgJ3QnLCAnYicsICdsJyksCi0gICAgICAgICZGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZUNvbXBhY3RTYW1wbGVTaXplcyB9LAotCi0gICAgeyBGT1VSQ0MoJ3MnLCAndCcsICdzJywgJ2MnKSwgRk9VUkNDKCdzJywgJ3QnLCAnYicsICdsJyksCi0gICAgICAgICZGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZVNhbXBsZVRvQ2h1bmsgfSwKLQotICAgIHsgRk9VUkNDKCdzJywgJ3QnLCAnYycsICdvJyksIEZPVVJDQygncycsICd0JywgJ2InLCAnbCcpLAotICAgICAgICAmRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VDaHVua09mZnNldHMgfSwKLQotICAgIHsgRk9VUkNDKCdjJywgJ28nLCAnNicsICc0JyksIEZPVVJDQygncycsICd0JywgJ2InLCAnbCcpLAotICAgICAgICAmRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VDaHVua09mZnNldHM2NCB9LAotCi0gICAgeyBGT1VSQ0MoJ2EnLCAndicsICdjJywgJ0MnKSwgRk9VUkNDKCdhJywgJ3YnLCAnYycsICcxJyksCi0gICAgICAgICZGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZUFWQ0NvZGVjU3BlY2lmaWNEYXRhIH0sCi0KLSAgICB7IEZPVVJDQygnZScsICdzJywgJ2QnLCAncycpLCBGT1VSQ0MoJ20nLCAncCcsICc0JywgJ2EnKSwKLSAgICAgICAgJkZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlRVNEU0NvZGVjU3BlY2lmaWNEYXRhIH0sCi0KLSAgICB7IEZPVVJDQygnZScsICdzJywgJ2QnLCAncycpLCBGT1VSQ0MoJ20nLCAncCcsICc0JywgJ3YnKSwKLSAgICAgICAgJkZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlRVNEU0NvZGVjU3BlY2lmaWNEYXRhIH0sCi0KLSAgICB7IEZPVVJDQygnbScsICdkJywgJ2EnLCAndCcpLCAwLCAmRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VNZWRpYURhdGEgfSwKLQotICAgIHsgRk9VUkNDKCdtJywgJ28nLCAnbycsICdmJyksIDAsIE5VTEwgfSwKLSAgICB7IEZPVVJDQygndCcsICdyJywgJ2EnLCAnZicpLCBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ2YnKSwgTlVMTCB9LAotCi0gICAgeyBGT1VSQ0MoJ3QnLCAnZicsICdoJywgJ2QnKSwgRk9VUkNDKCd0JywgJ3InLCAnYScsICdmJyksCi0gICAgICAgICZGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZVRyYWNrRnJhZ21lbnRIZWFkZXIKLSAgICB9LAotICAgIHsgRk9VUkNDKCd0JywgJ3InLCAndScsICduJyksIEZPVVJDQygndCcsICdyJywgJ2EnLCAnZicpLAotICAgICAgICAmRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VUcmFja0ZyYWdtZW50UnVuCi0gICAgfSwKLQotICAgIHsgRk9VUkNDKCdtJywgJ2YnLCAncicsICdhJyksIDAsIE5VTEwgfSwKLQotICAgIHsgRk9VUkNDKCdzJywgJ2knLCAnZCcsICd4JyksIDAsICZGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZVNlZ21lbnRJbmRleCB9LAotfTsKLQotc3RydWN0IEZpbGVTb3VyY2UgOiBwdWJsaWMgRnJhZ21lbnRlZE1QNFBhcnNlcjo6U291cmNlIHsKLSAgICBGaWxlU291cmNlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotICAgICAgICA6IG1GaWxlKGZvcGVuKGZpbGVuYW1lLCAicmIiKSkgewotICAgICAgICAgICAgQ0hFQ0sobUZpbGUgIT0gTlVMTCk7Ci0gICAgICAgIH0KLQotICAgIHZpcnR1YWwgfkZpbGVTb3VyY2UoKSB7Ci0gICAgICAgIGZjbG9zZShtRmlsZSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICAgICAgZnNlZWsobUZpbGUsIG9mZnNldCwgU0VFS19TRVQpOwotICAgICAgICByZXR1cm4gZnJlYWQoZGF0YSwgMSwgc2l6ZSwgbUZpbGUpOwotICAgIH0KLQotICAgIHZpcnR1YWwgYm9vbCBpc1NlZWthYmxlKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlOgotICAgIEZJTEUgKm1GaWxlOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRmlsZVNvdXJjZSk7Ci19OwotCi1zdHJ1Y3QgUmVhZFRyYWNrZXIgOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgUmVhZFRyYWNrZXIob2ZmNjRfdCBzaXplKSB7Ci0gICAgICAgIGFsbG9jU2l6ZSA9IDEgKyBzaXplIC8gODE5MjsgLy8gMSBiaXQgcGVyIGtpbG9ieXRlCi0gICAgICAgIGJpdG1hcCA9IChjaGFyKikgY2FsbG9jKDEsIGFsbG9jU2l6ZSk7Ci0gICAgfQotICAgIHZpcnR1YWwgflJlYWRUcmFja2VyKCkgewotICAgICAgICBkdW1wVG9Mb2coKTsKLSAgICAgICAgZnJlZShiaXRtYXApOwotICAgIH0KLSAgICB2b2lkIG1hcmsob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7Ci0gICAgICAgIGludCBmaXJzdGJpdCA9IG9mZnNldCAvIDEwMjQ7Ci0gICAgICAgIGludCBsYXN0Yml0ID0gKG9mZnNldCArIHNpemUgLSAxKSAvIDEwMjQ7Ci0gICAgICAgIGZvciAoaW50IGkgPSBmaXJzdGJpdDsgaSA8PSBsYXN0Yml0OyBpKyspIHsKLSAgICAgICAgICAgIGJpdG1hcFtpLzhdIHw9ICgweDgwID4+IChpICYgNykpOwotICAgICAgICB9Ci0gICAgfQotCi0gcHJpdmF0ZToKLSAgICB2b2lkIGR1bXBUb0xvZygpIHsKLSAgICAgICAgLy8gOTYgY2hhcnMgcGVyIGxpbmUsIGVhY2ggY2hhciByZXByZXNlbnRzIG9uZSBraWxvYnl0ZSwgMSBrYiBwZXIgYml0Ci0gICAgICAgIGludCBudW1saW5lcyA9IGFsbG9jU2l6ZSAvIDEyOwotICAgICAgICBjaGFyIGJ1Zls5N107Ci0gICAgICAgIGNoYXIgKmN1ciA9IGJpdG1hcDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1saW5lczsgaSsrICYmIGN1cikgewotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAxMjsgaisrKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA4OyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmWyhqICogOCkgKyBrXSA9ICgqY3VyICYgKDB4ODAgPj4gaykpID8gJ1gnIDogJy4nOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjdXIrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1Zls5Nl0gPSAnXDAnOwotICAgICAgICAgICAgQUxPR0koIiU1ZGs6ICVzIiwgaSAqIDk2LCBidWYpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc2l6ZV90IGFsbG9jU2l6ZTsKLSAgICBjaGFyICpiaXRtYXA7Ci19OwotCi1zdHJ1Y3QgRGF0YVNvdXJjZVNvdXJjZSA6IHB1YmxpYyBGcmFnbWVudGVkTVA0UGFyc2VyOjpTb3VyY2UgewotICAgIERhdGFTb3VyY2VTb3VyY2Uoc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSkKLSAgICAgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpIHsKLSAgICAgICAgICAgIENIRUNLKG1EYXRhU291cmNlICE9IE5VTEwpOwotI2lmIDAKLSAgICAgICAgICAgIG9mZjY0X3Qgc2l6ZTsKLSAgICAgICAgICAgIGlmIChzb3VyY2UtPmdldFNpemUoJnNpemUpID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgbVJlYWRUcmFja2VyID0gbmV3IFJlYWRUcmFja2VyKHNpemUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiY291bGRuJ3QgZ2V0IGRhdGEgc291cmNlIHNpemUiKTsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICB9Ci0KLSAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgICAgICBpZiAobVJlYWRUcmFja2VyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1SZWFkVHJhY2tlci0+bWFyayhvZmZzZXQsIHNpemUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgZGF0YSwgc2l6ZSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBib29sIGlzU2Vla2FibGUoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGU6Ci0gICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7Ci0gICAgc3A8UmVhZFRyYWNrZXI+IG1SZWFkVHJhY2tlcjsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERhdGFTb3VyY2VTb3VyY2UpOwotfTsKLQotRnJhZ21lbnRlZE1QNFBhcnNlcjo6RnJhZ21lbnRlZE1QNFBhcnNlcigpCi0gICAgOiBtQnVmZmVyUG9zKDApLAotICAgICAgbVN1c3BlbmRlZChmYWxzZSksCi0gICAgICBtRG9uZVdpdGhNb292KGZhbHNlKSwKLSAgICAgIG1GaXJzdE1vb2ZPZmZzZXQoMCksCi0gICAgICBtRmluYWxSZXN1bHQoT0spIHsKLX0KLQotRnJhZ21lbnRlZE1QNFBhcnNlcjo6fkZyYWdtZW50ZWRNUDRQYXJzZXIoKSB7Ci19Ci0KLXZvaWQgRnJhZ21lbnRlZE1QNFBhcnNlcjo6c3RhcnQoY29uc3QgY2hhciAqZmlsZW5hbWUpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U3RhcnQsIGlkKCkpOwotICAgIG1zZy0+c2V0T2JqZWN0KCJzb3VyY2UiLCBuZXcgRmlsZVNvdXJjZShmaWxlbmFtZSkpOwotICAgIG1zZy0+cG9zdCgpOwotICAgIEFMT0dWKCJQYXJzZXI6OnN0YXJ0KCVzKSIsIGZpbGVuYW1lKTsKLX0KLQotdm9pZCBGcmFnbWVudGVkTVA0UGFyc2VyOjpzdGFydChjb25zdCBzcDxTb3VyY2U+ICZzb3VyY2UpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U3RhcnQsIGlkKCkpOwotICAgIG1zZy0+c2V0T2JqZWN0KCJzb3VyY2UiLCBzb3VyY2UpOwotICAgIG1zZy0+cG9zdCgpOwotICAgIEFMT0dWKCJQYXJzZXI6OnN0YXJ0KFNvdXJjZSkiKTsKLX0KLQotdm9pZCBGcmFnbWVudGVkTVA0UGFyc2VyOjpzdGFydChzcDxEYXRhU291cmNlPiAmc291cmNlKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCBpZCgpKTsKLSAgICBtc2ctPnNldE9iamVjdCgic291cmNlIiwgbmV3IERhdGFTb3VyY2VTb3VyY2Uoc291cmNlKSk7Ci0gICAgbXNnLT5wb3N0KCk7Ci0gICAgQUxPR1YoIlBhcnNlcjo6c3RhcnQoRGF0YVNvdXJjZSkiKTsKLX0KLQotc3A8QU1lc3NhZ2U+IEZyYWdtZW50ZWRNUDRQYXJzZXI6OmdldEZvcm1hdChib29sIGF1ZGlvLCBib29sIHN5bmNocm9ub3VzKSB7Ci0KLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBib29sIG1vb3ZEb25lID0gbURvbmVXaXRoTW9vdjsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEdldEZvcm1hdCwgaWQoKSk7Ci0gICAgICAgIG1zZy0+c2V0SW50MzIoImF1ZGlvIiwgYXVkaW8pOwotCi0gICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dWKCJnZXRGb3JtYXQgcG9zdCBmYWlsZWQ6ICVkIiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpICYmIGVyciAhPSBPSykgewotICAgICAgICAgICAgaWYgKHN5bmNocm9ub3VzICYmIGVyciA9PSAtRVdPVUxEQkxPQ0sgJiYgIW1vb3ZEb25lKSB7Ci0gICAgICAgICAgICAgICAgcmVzdW1lSWZOZWNlc3NhcnkoKTsKLSAgICAgICAgICAgICAgICBBTE9HVigiQGdldEZvcm1hdCBwYXJzZXIgbm90IHJlYWR5IHlldCwgcmV0cnlpbmciKTsKLSAgICAgICAgICAgICAgICB1c2xlZXAoMTAwMDApOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR1YoImdldEZvcm1hdCBmYWlsZWQ6ICVkIiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKLSAgICAgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRNZXNzYWdlKCJmb3JtYXQiLCAmZm9ybWF0KSk7Ci0KLSAgICAgICAgQUxPR1YoInJldHVybmluZyBmb3JtYXQgJXMiLCBmb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBmb3JtYXQ7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpzZWVrVG8oYm9vbCB3YW50QXVkaW8sIGludDY0X3QgdGltZVVzKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlZWtUbywgaWQoKSk7Ci0gICAgbXNnLT5zZXRJbnQzMigiYXVkaW8iLCB3YW50QXVkaW8pOwotICAgIG1zZy0+c2V0SW50NjQoInBvc2l0aW9uIiwgdGltZVVzKTsKLQotICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKLSAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotYm9vbCBGcmFnbWVudGVkTVA0UGFyc2VyOjppc1NlZWthYmxlKCkgY29uc3QgewotICAgIHdoaWxlIChtRmlyc3RNb29mT2Zmc2V0ID09IDAgJiYgbUZpbmFsUmVzdWx0ID09IE9LKSB7Ci0gICAgICAgIHVzbGVlcCgxMDAwMCk7Ci0gICAgfQotICAgIGJvb2wgc2Vla2FibGUgPSBtU291cmNlLT5pc1NlZWthYmxlKCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IHNlZWthYmxlICYmIGkgPCBtVHJhY2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tzLnZhbHVlQXQoaSk7Ci0gICAgICAgIHNlZWthYmxlICY9ICFpbmZvLT5tU2lkeC5lbXB0eSgpOwotICAgIH0KLSAgICByZXR1cm4gc2Vla2FibGU7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6Om9uU2Vla1RvKGJvb2wgd2FudEF1ZGlvLCBpbnQ2NF90IHBvc2l0aW9uKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gLUVJTlZBTDsKLSAgICBzc2l6ZV90IHRyYWNrSW5kZXggPSBmaW5kVHJhY2sod2FudEF1ZGlvKTsKLSAgICBpZiAodHJhY2tJbmRleCA8IDApIHsKLSAgICAgICAgZXJyID0gdHJhY2tJbmRleDsKLSAgICB9IGVsc2UgewotICAgICAgICBUcmFja0luZm8gKmluZm8gPSAmbVRyYWNrcy5lZGl0VmFsdWVBdCh0cmFja0luZGV4KTsKLQotICAgICAgICBpbnQgbnVtU2lkeEVudHJpZXMgPSBpbmZvLT5tU2lkeC5zaXplKCk7Ci0gICAgICAgIGludDY0X3QgdG90YWxUaW1lID0gMDsKLSAgICAgICAgb2ZmX3QgdG90YWxPZmZzZXQgPSBtRmlyc3RNb29mT2Zmc2V0OwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVNpZHhFbnRyaWVzOyBpKyspIHsKLSAgICAgICAgICAgIGNvbnN0IFNpZHhFbnRyeSAqc2UgPSAmaW5mby0+bVNpZHhbaV07Ci0gICAgICAgICAgICBpZiAodG90YWxUaW1lICsgc2UtPm1EdXJhdGlvblVzID4gcG9zaXRpb24pIHsKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLDApOwotICAgICAgICAgICAgICAgIG1CdWZmZXJQb3MgPSB0b3RhbE9mZnNldDsKLSAgICAgICAgICAgICAgICBpZiAobUZpbmFsUmVzdWx0ID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKLSAgICAgICAgICAgICAgICAgICAgbUZpbmFsUmVzdWx0ID0gT0s7Ci0gICAgICAgICAgICAgICAgICAgIG1TdXNwZW5kZWQgPSB0cnVlOyAvLyBmb3JjZSByZXN1bWUKLSAgICAgICAgICAgICAgICAgICAgcmVzdW1lSWZOZWNlc3NhcnkoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW5mby0+bUZyYWdtZW50cy5jbGVhcigpOwotICAgICAgICAgICAgICAgIGluZm8tPm1EZWNvZGluZ1RpbWUgPSB0b3RhbFRpbWUgKiBpbmZvLT5tTWVkaWFUaW1lU2NhbGUgLyAxMDAwMDAwbGw7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdG90YWxUaW1lICs9IHNlLT5tRHVyYXRpb25VczsKLSAgICAgICAgICAgIHRvdGFsT2Zmc2V0ICs9IHNlLT5tU2l6ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBBTE9HVigic2Vla1RvIG91dCBvZiByYW5nZSIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OmRlcXVldWVBY2Nlc3NVbml0KGJvb2wgYXVkaW8sIHNwPEFCdWZmZXI+ICphY2Nlc3NVbml0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzeW5jaHJvbm91cykgewotCi0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdERlcXVldWVBY2Nlc3NVbml0LCBpZCgpKTsKLSAgICAgICAgbXNnLT5zZXRJbnQzMigiYXVkaW8iLCBhdWRpbyk7Ci0KLSAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQUxPR1YoImRlcXVldWUgZmFpbCAxOiAlZCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpICYmIGVyciAhPSBPSykgewotICAgICAgICAgICAgaWYgKHN5bmNocm9ub3VzICYmIGVyciA9PSAtRVdPVUxEQkxPQ0spIHsKLSAgICAgICAgICAgICAgICByZXN1bWVJZk5lY2Vzc2FyeSgpOwotICAgICAgICAgICAgICAgIEFMT0dWKCJQYXJzZXIgbm90IHJlYWR5IHlldCwgcmV0cnlpbmciKTsKLSAgICAgICAgICAgICAgICB1c2xlZXAoMTAwMDApOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR1YoImRlcXVldWUgZmFpbCAyOiAlZCwgJWQiLCBlcnIsIHN5bmNocm9ub3VzKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEJ1ZmZlcigiYWNjZXNzVW5pdCIsIGFjY2Vzc1VuaXQpKTsKLQotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotfQotCi1zc2l6ZV90IEZyYWdtZW50ZWRNUDRQYXJzZXI6OmZpbmRUcmFjayhib29sIHdhbnRBdWRpbykgY29uc3QgewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7ICsraSkgewotICAgICAgICBjb25zdCBUcmFja0luZm8gKmluZm8gPSAmbVRyYWNrcy52YWx1ZUF0KGkpOwotCi0gICAgICAgIGJvb2wgaXNBdWRpbyA9Ci0gICAgICAgICAgICBpbmZvLT5tTWVkaWFIYW5kbGVyVHlwZSA9PSBGT1VSQ0MoJ3MnLCAnbycsICd1JywgJ24nKTsKLQotICAgICAgICBib29sIGlzVmlkZW8gPQotICAgICAgICAgICAgaW5mby0+bU1lZGlhSGFuZGxlclR5cGUgPT0gRk9VUkNDKCd2JywgJ2knLCAnZCcsICdlJyk7Ci0KLSAgICAgICAgaWYgKCh3YW50QXVkaW8gJiYgaXNBdWRpbykgfHwgKCF3YW50QXVkaW8gJiYgIWlzQXVkaW8pKSB7Ci0gICAgICAgICAgICBpZiAoaW5mby0+bVNhbXBsZURlc2NzLmVtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gLUVXT1VMREJMT0NLOwotfQotCi12b2lkIEZyYWdtZW50ZWRNUDRQYXJzZXI6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgc3dpdGNoIChtc2ctPndoYXQoKSkgewotICAgICAgICBjYXNlIGtXaGF0U3RhcnQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgic291cmNlIiwgJm9iaikpOwotCi0gICAgICAgICAgICBtU291cmNlID0gc3RhdGljX2Nhc3Q8U291cmNlICo+KG9iai5nZXQoKSk7Ci0KLSAgICAgICAgICAgIG1CdWZmZXIgPSBuZXcgQUJ1ZmZlcig1MTIgKiAxMDI0KTsKLSAgICAgICAgICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIDApOwotCi0gICAgICAgICAgICBlbnRlcigwbGwsIDAsIDApOwotCi0gICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0UHJvY2VlZCwgaWQoKSkpLT5wb3N0KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRQcm9jZWVkOgotICAgICAgICB7Ci0gICAgICAgICAgICBDSEVDSyghbVN1c3BlbmRlZCk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG9uUHJvY2VlZCgpOwotCi0gICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtU3VzcGVuZGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1zZy0+cG9zdCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyICE9IC1FQUdBSU4pIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgib25Qcm9jZWVkIHJldHVybmVkIGVycm9yICVkIiwgZXJyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0UmVhZE1vcmU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHNpemVfdCBuZWVkZWQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTaXplKCJuZWVkZWQiLCAmbmVlZGVkKSk7Ci0KLSAgICAgICAgICAgIG1lbW1vdmUobUJ1ZmZlci0+YmFzZSgpLCBtQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnNpemUoKSk7Ci0gICAgICAgICAgICBtQnVmZmVyUG9zICs9IG1CdWZmZXItPm9mZnNldCgpOwotICAgICAgICAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgbUJ1ZmZlci0+c2l6ZSgpKTsKLQotICAgICAgICAgICAgc2l6ZV90IG1heEJ5dGVzVG9SZWFkID0gbUJ1ZmZlci0+Y2FwYWNpdHkoKSAtIG1CdWZmZXItPnNpemUoKTsKLQotICAgICAgICAgICAgaWYgKG1heEJ5dGVzVG9SZWFkIDwgbmVlZGVkKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInJlc2l6aW5nIGJ1ZmZlci4iKTsKLQotICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IG5ld0J1ZmZlciA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBBQnVmZmVyKChtQnVmZmVyLT5zaXplKCkgKyBuZWVkZWQgKyAxMDIzKSAmIH4xMDIzKTsKLSAgICAgICAgICAgICAgICBtZW1jcHkobmV3QnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpKTsKLSAgICAgICAgICAgICAgICBuZXdCdWZmZXItPnNldFJhbmdlKDAsIG1CdWZmZXItPnNpemUoKSk7Ci0KLSAgICAgICAgICAgICAgICBtQnVmZmVyID0gbmV3QnVmZmVyOwotICAgICAgICAgICAgICAgIG1heEJ5dGVzVG9SZWFkID0gbUJ1ZmZlci0+Y2FwYWNpdHkoKSAtIG1CdWZmZXItPnNpemUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ0hFQ0tfR0UobWF4Qnl0ZXNUb1JlYWQsIG5lZWRlZCk7Ci0KLSAgICAgICAgICAgIHNzaXplX3QgbiA9IG1Tb3VyY2UtPnJlYWRBdCgKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlclBvcyArIG1CdWZmZXItPnNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+ZGF0YSgpICsgbUJ1ZmZlci0+c2l6ZSgpLCBuZWVkZWQpOwotCi0gICAgICAgICAgICBpZiAobiA8IChzc2l6ZV90KW5lZWRlZCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJSZWFjaGVkIEVPRiB3aGVuIHJlYWRpbmcgJWQgQCAlZCArICVkIiwgbmVlZGVkLCBtQnVmZmVyUG9zLCBtQnVmZmVyLT5zaXplKCkpOwotICAgICAgICAgICAgICAgIGlmIChuIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBtRmluYWxSZXN1bHQgPSBuOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1GaW5hbFJlc3VsdCA9IEVSUk9SX0VORF9PRl9TVFJFQU07Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbUZpbmFsUmVzdWx0ID0gRVJST1JfSU87Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCBtQnVmZmVyLT5zaXplKCkgKyBuKTsKLSAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0UHJvY2VlZCwgaWQoKSkpLT5wb3N0KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdEdldEZvcm1hdDoKLSAgICAgICAgewotICAgICAgICAgICAgaW50MzJfdCB3YW50QXVkaW87Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYXVkaW8iLCAmd2FudEF1ZGlvKSk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IC1FV09VTERCTE9DSzsKLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLQotICAgICAgICAgICAgc3NpemVfdCB0cmFja0luZGV4ID0gZmluZFRyYWNrKHdhbnRBdWRpbyk7Ci0KLSAgICAgICAgICAgIGlmICh0cmFja0luZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIGVyciA9IHRyYWNrSW5kZXg7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tzLmVkaXRWYWx1ZUF0KHRyYWNrSW5kZXgpOwotCi0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IGluZm8tPm1TYW1wbGVEZXNjcy5pdGVtQXQoMCkubUZvcm1hdDsKLSAgICAgICAgICAgICAgICBpZiAoaW5mby0+bVNpZHhEdXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICBmb3JtYXQtPnNldEludDY0KCJkdXJhdGlvblVzIiwgaW5mby0+bVNpZHhEdXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBwcm9iYWJseSBnb2luZyB0byBiZSB6ZXJvLiBPaCB3ZWxsLi4uCi0gICAgICAgICAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50NjQoImR1cmF0aW9uVXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDBsbCAqIGluZm8tPm1EdXJhdGlvbiAvIGluZm8tPm1NZWRpYVRpbWVTY2FsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgImZvcm1hdCIsIGZvcm1hdCk7Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSBPSzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOwotCi0gICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwotCi0gICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0RGVxdWV1ZUFjY2Vzc1VuaXQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGludDMyX3Qgd2FudEF1ZGlvOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImF1ZGlvIiwgJndhbnRBdWRpbykpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSAtRVdPVUxEQkxPQ0s7Ci0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0KLSAgICAgICAgICAgIHNzaXplX3QgdHJhY2tJbmRleCA9IGZpbmRUcmFjayh3YW50QXVkaW8pOwotCi0gICAgICAgICAgICBpZiAodHJhY2tJbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICBlcnIgPSB0cmFja0luZGV4OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0OwotICAgICAgICAgICAgICAgIGVyciA9IG9uRGVxdWV1ZUFjY2Vzc1VuaXQodHJhY2tJbmRleCwgJmFjY2Vzc1VuaXQpOwotCi0gICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0QnVmZmVyKCJhY2Nlc3NVbml0IiwgYWNjZXNzVW5pdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7Ci0KLSAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRTZWVrVG86Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEFMT0dWKCJrV2hhdFNlZWtUbyIpOwotICAgICAgICAgICAgaW50MzJfdCB3YW50QXVkaW87Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYXVkaW8iLCAmd2FudEF1ZGlvKSk7Ci0gICAgICAgICAgICBpbnQ2NF90IHBvc2l0aW9uOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInBvc2l0aW9uIiwgJnBvc2l0aW9uKSk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IC1FV09VTERCTE9DSzsKLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLQotICAgICAgICAgICAgc3NpemVfdCB0cmFja0luZGV4ID0gZmluZFRyYWNrKHdhbnRBdWRpbyk7Ci0KLSAgICAgICAgICAgIGlmICh0cmFja0luZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIGVyciA9IHRyYWNrSW5kZXg7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVyciA9IG9uU2Vla1RvKHdhbnRBdWRpbywgcG9zaXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOwotICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKLSAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgVFJFU1BBU1MoKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6Om9uUHJvY2VlZCgpIHsKLSAgICBzdGF0dXNfdCBlcnI7Ci0KLSAgICBpZiAoKGVyciA9IG5lZWQoOCkpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgdWludDY0X3Qgc2l6ZSA9IHJlYWRVMzIoMCk7Ci0gICAgdWludDMyX3QgdHlwZSA9IHJlYWRVMzIoNCk7Ci0KLSAgICBzaXplX3Qgb2Zmc2V0ID0gODsKLQotICAgIGlmIChzaXplID09IDEpIHsKLSAgICAgICAgaWYgKChlcnIgPSBuZWVkKDE2KSkgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBzaXplID0gcmVhZFU2NChvZmZzZXQpOwotICAgICAgICBvZmZzZXQgKz0gODsKLSAgICB9Ci0KLSAgICB1aW50OF90IHVzZXJUeXBlWzE2XTsKLQotICAgIGlmICh0eXBlID09IEZPVVJDQygndScsICd1JywgJ2knLCAnZCcpKSB7Ci0gICAgICAgIGlmICgoZXJyID0gbmVlZChvZmZzZXQgKyAxNikpICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgbWVtY3B5KHVzZXJUeXBlLCBtQnVmZmVyLT5kYXRhKCkgKyBvZmZzZXQsIDE2KTsKLSAgICAgICAgb2Zmc2V0ICs9IDE2OwotICAgIH0KLQotICAgIENIRUNLKCFtU3RhY2suaXNFbXB0eSgpKTsKLSAgICB1aW50MzJfdCBwdHlwZSA9IG1TdGFjay5pdGVtQXQobVN0YWNrLnNpemUoKSAtIDEpLm1UeXBlOwotCi0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTnVtRGlzcGF0Y2hlcnMgPQotICAgICAgICBzaXplb2Yoa0Rpc3BhdGNoVGFibGUpIC8gc2l6ZW9mKGtEaXNwYXRjaFRhYmxlWzBdKTsKLQotICAgIHNpemVfdCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBrTnVtRGlzcGF0Y2hlcnM7ICsraSkgewotICAgICAgICBpZiAoa0Rpc3BhdGNoVGFibGVbaV0ubVR5cGUgPT0gdHlwZQotICAgICAgICAgICAgICAgICYmIGtEaXNwYXRjaFRhYmxlW2ldLm1QYXJlbnRUeXBlID09IHB0eXBlKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFNhbXBsZUVudHJ5IGJveGVzIGFyZSBjb250YWluZXIgYm94ZXMgdGhhdCBzdGFydCB3aXRoIGEgdmFyaWFibGUKLSAgICAvLyBhbW91bnQgb2YgZGF0YSBkZXBlbmRpbmcgb24gdGhlIG1lZGlhIGhhbmRsZXIgdHlwZS4KLSAgICAvLyBXZSBkb24ndCBsb29rIGluc2lkZSAnaGludCcgdHlwZSBTYW1wbGVFbnRyeSBib3hlcy4KLQotICAgIGJvb2wgaXNTYW1wbGVFbnRyeUJveCA9Ci0gICAgICAgIChwdHlwZSA9PSBGT1VSQ0MoJ3MnLCAndCcsICdzJywgJ2QnKSkKLSAgICAgICAgJiYgZWRpdFRyYWNrKG1DdXJyZW50VHJhY2tJRCktPm1NZWRpYUhhbmRsZXJUeXBlCi0gICAgICAgICE9IEZPVVJDQygnaCcsICdpJywgJ24nLCAndCcpOwotCi0gICAgaWYgKChpIDwga051bURpc3BhdGNoZXJzICYmIGtEaXNwYXRjaFRhYmxlW2ldLm1IYW5kbGVyID09IDApCi0gICAgICAgICAgICB8fCBpc1NhbXBsZUVudHJ5Qm94IHx8IHB0eXBlID09IEZPVVJDQygnaScsICdsJywgJ3MnLCAndCcpKSB7Ci0gICAgICAgIC8vIFRoaXMgaXMgYSBjb250YWluZXIgYm94LgotICAgICAgICBpZiAodHlwZSA9PSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ2YnKSkgewotICAgICAgICAgICAgaWYgKG1GaXJzdE1vb2ZPZmZzZXQgPT0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJmaXJzdCBtb29mIEAgJTA4eCIsIG1CdWZmZXJQb3MgKyBvZmZzZXQpOwotICAgICAgICAgICAgICAgIG1GaXJzdE1vb2ZPZmZzZXQgPSBtQnVmZmVyUG9zICsgb2Zmc2V0IC0gODsgLy8gcG9pbnQgYXQgdGhlIHNpemUKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAodHlwZSA9PSBGT1VSQ0MoJ20nLCAnZScsICd0JywgJ2EnKSkgewotICAgICAgICAgICAgaWYgKChlcnIgPSBuZWVkKG9mZnNldCArIDQpKSA8IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJlYWRVMzIob2Zmc2V0KSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG9mZnNldCArPSA0OwotICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gRk9VUkNDKCdzJywgJ3QnLCAncycsICdkJykpIHsKLSAgICAgICAgICAgIGlmICgoZXJyID0gbmVlZChvZmZzZXQgKyA4KSkgPCBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyZWFkVTMyKG9mZnNldCkgIT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocmVhZFUzMihvZmZzZXQgKyA0KSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgbmVlZCBhdCBsZWFzdCBzb21lIGVudHJpZXMuCi0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG9mZnNldCArPSA4OwotICAgICAgICB9IGVsc2UgaWYgKGlzU2FtcGxlRW50cnlCb3gpIHsKLSAgICAgICAgICAgIHNpemVfdCBoZWFkZXJTaXplOwotCi0gICAgICAgICAgICBzd2l0Y2ggKGVkaXRUcmFjayhtQ3VycmVudFRyYWNrSUQpLT5tTWVkaWFIYW5kbGVyVHlwZSkgewotICAgICAgICAgICAgICAgIGNhc2UgRk9VUkNDKCd2JywgJ2knLCAnZCcsICdlJyk6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyA4IGJ5dGVzIFNhbXBsZUVudHJ5ICsgNzAgYnl0ZXMgVmlzdWFsU2FtcGxlRW50cnkKLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyU2l6ZSA9IDc4OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjYXNlIEZPVVJDQygncycsICdvJywgJ3UnLCAnbicpOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gOCBieXRlcyBTYW1wbGVFbnRyeSArIDIwIGJ5dGVzIEF1ZGlvU2FtcGxlRW50cnkKLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyU2l6ZSA9IDI4OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjYXNlIEZPVVJDQygnbScsICdlJywgJ3QnLCAnYScpOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyU2l6ZSA9IDg7ICAvLyA4IGJ5dGVzIFNhbXBsZUVudHJ5Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIFRSRVNQQVNTKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChvZmZzZXQgKyBoZWFkZXJTaXplID4gc2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoKGVyciA9IG5lZWQob2Zmc2V0ICsgaGVhZGVyU2l6ZSkpICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3dpdGNoIChlZGl0VHJhY2sobUN1cnJlbnRUcmFja0lEKS0+bU1lZGlhSGFuZGxlclR5cGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIEZPVVJDQygndicsICdpJywgJ2QnLCAnZScpOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcGFyc2VWaXN1YWxTYW1wbGVFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLCBvZmZzZXQsIG9mZnNldCArIGhlYWRlclNpemUpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjYXNlIEZPVVJDQygncycsICdvJywgJ3UnLCAnbicpOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcGFyc2VBdWRpb1NhbXBsZUVudHJ5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIG9mZnNldCwgb2Zmc2V0ICsgaGVhZGVyU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ2UnLCAndCcsICdhJyk6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBPSzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgVFJFU1BBU1MoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG9mZnNldCArPSBoZWFkZXJTaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgc2tpcChvZmZzZXQpOwotCi0gICAgICAgIEFMT0dWKCIlc2VudGVyaW5nIGJveCBvZiB0eXBlICclcyciLAotICAgICAgICAgICAgICAgIEluZGVudFN0cmluZyhtU3RhY2suc2l6ZSgpKSwgRm91cmNjMlN0cmluZyh0eXBlKSk7Ci0KLSAgICAgICAgZW50ZXIobUJ1ZmZlclBvcyAtIG9mZnNldCwgdHlwZSwgc2l6ZSAtIG9mZnNldCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCFmaXRzQ29udGFpbmVyKHNpemUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpIDwga051bURpc3BhdGNoZXJzICYmIGtEaXNwYXRjaFRhYmxlW2ldLm1IYW5kbGVyICE9IDApIHsKLSAgICAgICAgICAgIC8vIFdlIGhhdmUgYSBoYW5kbGVyIGZvciB0aGlzIGJveCB0eXBlLgotCi0gICAgICAgICAgICBpZiAoKGVyciA9IG5lZWQoc2l6ZSkpICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQUxPR1YoIiVzcGFyc2luZyBib3ggb2YgdHlwZSAnJXMnIiwKLSAgICAgICAgICAgICAgICAgICAgSW5kZW50U3RyaW5nKG1TdGFjay5zaXplKCkpLCBGb3VyY2MyU3RyaW5nKHR5cGUpKTsKLQotICAgICAgICAgICAgaWYgKChlcnIgPSAodGhpcy0+KmtEaXNwYXRjaFRhYmxlW2ldLm1IYW5kbGVyKSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLCBvZmZzZXQsIHNpemUpKSAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBVbmtub3duIGJveCB0eXBlCi0KLSAgICAgICAgICAgIEFMT0dWKCIlc3NraXBwaW5nIGJveCBvZiB0eXBlICclcycsIHNpemUgJWxsdSIsCi0gICAgICAgICAgICAgICAgICAgIEluZGVudFN0cmluZyhtU3RhY2suc2l6ZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgRm91cmNjMlN0cmluZyh0eXBlKSwgc2l6ZSk7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHNraXAoc2l6ZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi0vLyBzdGF0aWMKLWludCBGcmFnbWVudGVkTVA0UGFyc2VyOjpDb21wYXJlU2FtcGxlTG9jYXRpb24oCi0gICAgICAgIGNvbnN0IFNhbXBsZUluZm8gJnNhbXBsZSwgY29uc3QgTWVkaWFEYXRhSW5mbyAmbWRhdEluZm8pIHsKLSAgICBpZiAoc2FtcGxlLm1PZmZzZXQgKyBzYW1wbGUubVNpemUgPCBtZGF0SW5mby5tT2Zmc2V0KSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBpZiAoc2FtcGxlLm1PZmZzZXQgPj0gbWRhdEluZm8ubU9mZnNldCArIG1kYXRJbmZvLm1CdWZmZXItPnNpemUoKSkgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICAvLyBPdGhlcndpc2UgbWFrZSBzdXJlIHRoZSBzYW1wbGUgaXMgY29tcGxldGVseSBjb250YWluZWQgd2l0aGluIHRoaXMKLSAgICAvLyBtZWRpYSBkYXRhIGJsb2NrLgotCi0gICAgQ0hFQ0tfR0Uoc2FtcGxlLm1PZmZzZXQsIG1kYXRJbmZvLm1PZmZzZXQpOwotCi0gICAgQ0hFQ0tfTEUoc2FtcGxlLm1PZmZzZXQgKyBzYW1wbGUubVNpemUsCi0gICAgICAgICAgICAgbWRhdEluZm8ubU9mZnNldCArIG1kYXRJbmZvLm1CdWZmZXItPnNpemUoKSk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBGcmFnbWVudGVkTVA0UGFyc2VyOjpyZXN1bWVJZk5lY2Vzc2FyeSgpIHsKLSAgICBpZiAoIW1TdXNwZW5kZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEFMT0dWKCJyZXN1bWluZy4iKTsKLQotICAgIG1TdXNwZW5kZWQgPSBmYWxzZTsKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0UHJvY2VlZCwgaWQoKSkpLT5wb3N0KCk7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OmdldFNhbXBsZSgKLSAgICAgICAgVHJhY2tJbmZvICppbmZvLCBzcDxUcmFja0ZyYWdtZW50PiAqZnJhZ21lbnQsIFNhbXBsZUluZm8gKnNhbXBsZUluZm8pIHsKLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIGlmIChpbmZvLT5tRnJhZ21lbnRzLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIGlmIChtRmluYWxSZXN1bHQgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUZpbmFsUmVzdWx0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXN1bWVJZk5lY2Vzc2FyeSgpOwotICAgICAgICAgICAgcmV0dXJuIC1FV09VTERCTE9DSzsKLSAgICAgICAgfQotCi0gICAgICAgICpmcmFnbWVudCA9ICppbmZvLT5tRnJhZ21lbnRzLmJlZ2luKCk7Ci0KLSAgICAgICAgc3RhdHVzX3QgZXJyID0gKCpmcmFnbWVudCktPmdldFNhbXBsZShzYW1wbGVJbmZvKTsKLQotICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0gZWxzZSBpZiAoZXJyICE9IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZWFsbHksIGVuZCBvZiB0aGlzIGZyYWdtZW50Li4uCi0KLSAgICAgICAgaW5mby0+bUZyYWdtZW50cy5lcmFzZShpbmZvLT5tRnJhZ21lbnRzLmJlZ2luKCkpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6b25EZXF1ZXVlQWNjZXNzVW5pdCgKLSAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXgsIHNwPEFCdWZmZXI+ICphY2Nlc3NVbml0KSB7Ci0gICAgVHJhY2tJbmZvICppbmZvID0gJm1UcmFja3MuZWRpdFZhbHVlQXQodHJhY2tJbmRleCk7Ci0KLSAgICBzcDxUcmFja0ZyYWdtZW50PiBmcmFnbWVudDsKLSAgICBTYW1wbGVJbmZvIHNhbXBsZUluZm87Ci0gICAgc3RhdHVzX3QgZXJyID0gZ2V0U2FtcGxlKGluZm8sICZmcmFnbWVudCwgJnNhbXBsZUluZm8pOwotCi0gICAgaWYgKGVyciA9PSAtRVdPVUxEQkxPQ0spIHsKLSAgICAgICAgcmVzdW1lSWZOZWNlc3NhcnkoKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9IGVsc2UgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGVyciA9IC1FV09VTERCTE9DSzsKLQotICAgIGJvb2wgY2hlY2tEcm9wcGFibGUgPSBmYWxzZTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1lZGlhRGF0YS5zaXplKCk7ICsraSkgewotICAgICAgICBjb25zdCBNZWRpYURhdGFJbmZvICZtZGF0SW5mbyA9IG1NZWRpYURhdGEuaXRlbUF0KGkpOwotCi0gICAgICAgIGludCBjbXAgPSBDb21wYXJlU2FtcGxlTG9jYXRpb24oc2FtcGxlSW5mbywgbWRhdEluZm8pOwotCi0gICAgICAgIGlmIChjbXAgPCAwICYmICFtU291cmNlLT5pc1NlZWthYmxlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAtRVBJUEU7Ci0gICAgICAgIH0gZWxzZSBpZiAoY21wID09IDApIHsKLSAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgIGNoZWNrRHJvcHBhYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZXJyID0gbWFrZUFjY2Vzc1VuaXQoaW5mbywgc2FtcGxlSW5mbywgbWRhdEluZm8sIGFjY2Vzc1VuaXQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZnJhZ21lbnQtPmFkdmFuY2UoKTsKLQotICAgIGlmICghbU1lZGlhRGF0YS5lbXB0eSgpICYmIGNoZWNrRHJvcHBhYmxlKSB7Ci0gICAgICAgIHNpemVfdCBudW1Ecm9wcGFibGUgPSAwOwotICAgICAgICBib29sIGRvbmUgPSBmYWxzZTsKLQotICAgICAgICAvLyBYWFggRklYTUU6IGlmIG9uZSBvZiB0aGUgdHJhY2tzIGlzIG5vdCBhZHZhbmNlZCAoZS5nLiBpZiB5b3UgcGxheSBhbiBhdWRpbyt2aWRlbwotICAgICAgICAvLyBmaWxlIHdpdGggc2YyKSwgdGhlbiBtTWVkaWFEYXRhIHdpbGwgbm90IGJlIHBydW5lZCBhbmQga2VlcHMgZ3Jvd2luZwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgIWRvbmUgJiYgaSA8IG1NZWRpYURhdGEuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIGNvbnN0IE1lZGlhRGF0YUluZm8gJm1kYXRJbmZvID0gbU1lZGlhRGF0YS5pdGVtQXQoaSk7Ci0KLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbVRyYWNrcy5zaXplKCk7ICsraikgewotICAgICAgICAgICAgICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tzLmVkaXRWYWx1ZUF0KGopOwotCi0gICAgICAgICAgICAgICAgc3A8VHJhY2tGcmFnbWVudD4gZnJhZ21lbnQ7Ci0gICAgICAgICAgICAgICAgU2FtcGxlSW5mbyBzYW1wbGVJbmZvOwotICAgICAgICAgICAgICAgIGVyciA9IGdldFNhbXBsZShpbmZvLCAmZnJhZ21lbnQsICZzYW1wbGVJbmZvKTsKLQotICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGludCBjbXAgPSBDb21wYXJlU2FtcGxlTG9jYXRpb24oc2FtcGxlSW5mbywgbWRhdEluZm8pOwotCi0gICAgICAgICAgICAgICAgaWYgKGNtcCA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghZG9uZSkgewotICAgICAgICAgICAgICAgICsrbnVtRHJvcHBhYmxlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG51bURyb3BwYWJsZSA+IDApIHsKLSAgICAgICAgICAgIG1NZWRpYURhdGEucmVtb3ZlSXRlbXNBdCgwLCBudW1Ecm9wcGFibGUpOwotCi0gICAgICAgICAgICBpZiAobU1lZGlhRGF0YS5zaXplKCkgPCA1KSB7Ci0gICAgICAgICAgICAgICAgcmVzdW1lSWZOZWNlc3NhcnkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBzaXplX3QgcGFyc2VOQUxTaXplKHNpemVfdCBuYWxMZW5ndGhTaXplLCBjb25zdCB1aW50OF90ICpkYXRhKSB7Ci0gICAgc3dpdGNoIChuYWxMZW5ndGhTaXplKSB7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIHJldHVybiAqZGF0YTsKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgcmV0dXJuIFUxNl9BVChkYXRhKTsKLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgcmV0dXJuICgoc2l6ZV90KWRhdGFbMF0gPDwgMTYpIHwgVTE2X0FUKCZkYXRhWzFdKTsKLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgcmV0dXJuIFUzMl9BVChkYXRhKTsKLSAgICB9Ci0KLSAgICAvLyBUaGlzIGNhbm5vdCBoYXBwZW4sIG1OQUxMZW5ndGhTaXplIHNwcmluZ3MgdG8gbGlmZSBieSBhZGRpbmcgMSB0bwotICAgIC8vIGEgMi1iaXQgaW50ZWdlci4KLSAgICBUUkVTUEFTUygpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6Om1ha2VBY2Nlc3NVbml0KAotICAgICAgICBUcmFja0luZm8gKmluZm8sCi0gICAgICAgIGNvbnN0IFNhbXBsZUluZm8gJnNhbXBsZSwKLSAgICAgICAgY29uc3QgTWVkaWFEYXRhSW5mbyAmbWRhdEluZm8sCi0gICAgICAgIHNwPEFCdWZmZXI+ICphY2Nlc3NVbml0KSB7Ci0gICAgaWYgKHNhbXBsZS5tU2FtcGxlRGVzY0luZGV4IDwgMQotICAgICAgICAgICAgfHwgc2FtcGxlLm1TYW1wbGVEZXNjSW5kZXggPiBpbmZvLT5tU2FtcGxlRGVzY3Muc2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgaW50NjRfdCBwcmVzZW50YXRpb25UaW1lVXMgPQotICAgICAgICAxMDAwMDAwbGwgKiBzYW1wbGUubVByZXNlbnRhdGlvblRpbWUgLyBpbmZvLT5tTWVkaWFUaW1lU2NhbGU7Ci0KLSAgICBjb25zdCBTYW1wbGVEZXNjcmlwdGlvbiAmc2FtcGxlRGVzYyA9Ci0gICAgICAgIGluZm8tPm1TYW1wbGVEZXNjcy5pdGVtQXQoc2FtcGxlLm1TYW1wbGVEZXNjSW5kZXggLSAxKTsKLQotICAgIHNpemVfdCBuYWxMZW5ndGhTaXplOwotICAgIGlmICghc2FtcGxlRGVzYy5tRm9ybWF0LT5maW5kU2l6ZSgibmFsLWxlbmd0aC1zaXplIiwgJm5hbExlbmd0aFNpemUpKSB7Ci0gICAgICAgICphY2Nlc3NVbml0ID0gbmV3IEFCdWZmZXIoc2FtcGxlLm1TaXplKTsKLQotICAgICAgICBtZW1jcHkoKCphY2Nlc3NVbml0KS0+ZGF0YSgpLAotICAgICAgICAgICAgICAgbWRhdEluZm8ubUJ1ZmZlci0+ZGF0YSgpICsgKHNhbXBsZS5tT2Zmc2V0IC0gbWRhdEluZm8ubU9mZnNldCksCi0gICAgICAgICAgICAgICBzYW1wbGUubVNpemUpOwotCi0gICAgICAgICgqYWNjZXNzVW5pdCktPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHByZXNlbnRhdGlvblRpbWVVcyk7Ci0gICAgICAgIGlmIChJc0lEUigqYWNjZXNzVW5pdCkpIHsKLSAgICAgICAgICAgICgqYWNjZXNzVW5pdCktPm1ldGEoKS0+c2V0SW50MzIoImlzLXN5bmMtZnJhbWUiLCAxKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBjb25zdCB1aW50OF90ICpzcmNQdHIgPQotICAgICAgICBtZGF0SW5mby5tQnVmZmVyLT5kYXRhKCkgKyAoc2FtcGxlLm1PZmZzZXQgLSBtZGF0SW5mby5tT2Zmc2V0KTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMiA7ICsraSkgewotICAgICAgICBzaXplX3Qgc3JjT2Zmc2V0ID0gMDsKLSAgICAgICAgc2l6ZV90IGRzdE9mZnNldCA9IDA7Ci0KLSAgICAgICAgd2hpbGUgKHNyY09mZnNldCA8IHNhbXBsZS5tU2l6ZSkgewotICAgICAgICAgICAgaWYgKHNyY09mZnNldCArIG5hbExlbmd0aFNpemUgPiBzYW1wbGUubVNpemUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzaXplX3QgbmFsU2l6ZSA9IHBhcnNlTkFMU2l6ZShuYWxMZW5ndGhTaXplLCAmc3JjUHRyW3NyY09mZnNldF0pOwotICAgICAgICAgICAgc3JjT2Zmc2V0ICs9IG5hbExlbmd0aFNpemU7Ci0KLSAgICAgICAgICAgIGlmIChzcmNPZmZzZXQgKyBuYWxTaXplID4gc2FtcGxlLm1TaXplKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGkgPT0gMSkgewotICAgICAgICAgICAgICAgIG1lbWNweSgoKmFjY2Vzc1VuaXQpLT5kYXRhKCkgKyBkc3RPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICJceDAwXHgwMFx4MDBceDAxIiwKLSAgICAgICAgICAgICAgICAgICAgICAgNCk7Ci0KLSAgICAgICAgICAgICAgICBtZW1jcHkoKCphY2Nlc3NVbml0KS0+ZGF0YSgpICsgZHN0T2Zmc2V0ICsgNCwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjUHRyICsgc3JjT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICBuYWxTaXplKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3JjT2Zmc2V0ICs9IG5hbFNpemU7Ci0gICAgICAgICAgICBkc3RPZmZzZXQgKz0gbmFsU2l6ZSArIDQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaSA9PSAwKSB7Ci0gICAgICAgICAgICAoKmFjY2Vzc1VuaXQpID0gbmV3IEFCdWZmZXIoZHN0T2Zmc2V0KTsKLSAgICAgICAgICAgICgqYWNjZXNzVW5pdCktPm1ldGEoKS0+c2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgICJ0aW1lVXMiLCBwcmVzZW50YXRpb25UaW1lVXMpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChJc0lEUigqYWNjZXNzVW5pdCkpIHsKLSAgICAgICAgKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5zZXRJbnQzMigiaXMtc3luYy1mcmFtZSIsIDEpOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6bmVlZChzaXplX3Qgc2l6ZSkgewotICAgIGlmICghZml0c0NvbnRhaW5lcihzaXplKSkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBpZiAoc2l6ZSA8PSBtQnVmZmVyLT5zaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZWFkTW9yZSwgaWQoKSk7Ci0gICAgbXNnLT5zZXRTaXplKCJuZWVkZWQiLCBzaXplIC0gbUJ1ZmZlci0+c2l6ZSgpKTsKLSAgICBtc2ctPnBvc3QoKTsKLQotICAgIC8vIEFMT0dWKCJuZWVkKCVkKSByZXR1cm5pbmcgLUVBR0FJTiwgb25seSBoYXZlICVkIiwgc2l6ZSwgbUJ1ZmZlci0+c2l6ZSgpKTsKLQotICAgIHJldHVybiAtRUFHQUlOOwotfQotCi12b2lkIEZyYWdtZW50ZWRNUDRQYXJzZXI6OmVudGVyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MzJfdCB0eXBlLCB1aW50NjRfdCBzaXplKSB7Ci0gICAgQ29udGFpbmVyIGNvbnRhaW5lcjsKLSAgICBjb250YWluZXIubU9mZnNldCA9IG9mZnNldDsKLSAgICBjb250YWluZXIubVR5cGUgPSB0eXBlOwotICAgIGNvbnRhaW5lci5tRXh0ZW5kc1RvRU9GID0gKHNpemUgPT0gMCk7Ci0gICAgY29udGFpbmVyLm1CeXRlc1JlbWFpbmluZyA9IHNpemU7Ci0KLSAgICBtU3RhY2sucHVzaChjb250YWluZXIpOwotfQotCi1ib29sIEZyYWdtZW50ZWRNUDRQYXJzZXI6OmZpdHNDb250YWluZXIodWludDY0X3Qgc2l6ZSkgY29uc3QgewotICAgIENIRUNLKCFtU3RhY2suaXNFbXB0eSgpKTsKLSAgICBjb25zdCBDb250YWluZXIgJmNvbnRhaW5lciA9IG1TdGFjay5pdGVtQXQobVN0YWNrLnNpemUoKSAtIDEpOwotCi0gICAgcmV0dXJuIGNvbnRhaW5lci5tRXh0ZW5kc1RvRU9GIHx8IHNpemUgPD0gY29udGFpbmVyLm1CeXRlc1JlbWFpbmluZzsKLX0KLQotdWludDE2X3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6cmVhZFUxNihzaXplX3Qgb2Zmc2V0KSB7Ci0gICAgQ0hFQ0tfTEUob2Zmc2V0ICsgMiwgbUJ1ZmZlci0+c2l6ZSgpKTsKLQotICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9IG1CdWZmZXItPmRhdGEoKSArIG9mZnNldDsKLSAgICByZXR1cm4gKHB0clswXSA8PCA4KSB8IHB0clsxXTsKLX0KLQotdWludDMyX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6cmVhZFUzMihzaXplX3Qgb2Zmc2V0KSB7Ci0gICAgQ0hFQ0tfTEUob2Zmc2V0ICsgNCwgbUJ1ZmZlci0+c2l6ZSgpKTsKLQotICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9IG1CdWZmZXItPmRhdGEoKSArIG9mZnNldDsKLSAgICByZXR1cm4gKHB0clswXSA8PCAyNCkgfCAocHRyWzFdIDw8IDE2KSB8IChwdHJbMl0gPDwgOCkgfCBwdHJbM107Ci19Ci0KLXVpbnQ2NF90IEZyYWdtZW50ZWRNUDRQYXJzZXI6OnJlYWRVNjQoc2l6ZV90IG9mZnNldCkgewotICAgIHJldHVybiAoKCh1aW50NjRfdClyZWFkVTMyKG9mZnNldCkpIDw8IDMyKSB8IHJlYWRVMzIob2Zmc2V0ICsgNCk7Ci19Ci0KLXZvaWQgRnJhZ21lbnRlZE1QNFBhcnNlcjo6c2tpcChvZmZfdCBkaXN0YW5jZSkgewotICAgIENIRUNLKCFtU3RhY2suaXNFbXB0eSgpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gbVN0YWNrLnNpemUoKTsgaS0tID4gMDspIHsKLSAgICAgICAgQ29udGFpbmVyICpjb250YWluZXIgPSAmbVN0YWNrLmVkaXRJdGVtQXQoaSk7Ci0gICAgICAgIGlmICghY29udGFpbmVyLT5tRXh0ZW5kc1RvRU9GKSB7Ci0gICAgICAgICAgICBDSEVDS19MRShkaXN0YW5jZSwgKG9mZl90KWNvbnRhaW5lci0+bUJ5dGVzUmVtYWluaW5nKTsKLQotICAgICAgICAgICAgY29udGFpbmVyLT5tQnl0ZXNSZW1haW5pbmcgLT0gZGlzdGFuY2U7Ci0KLSAgICAgICAgICAgIGlmIChjb250YWluZXItPm1CeXRlc1JlbWFpbmluZyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiVzbGVhdmluZyBib3ggb2YgdHlwZSAnJXMnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEluZGVudFN0cmluZyhtU3RhY2suc2l6ZSgpIC0gMSksCi0gICAgICAgICAgICAgICAgICAgICAgICBGb3VyY2MyU3RyaW5nKGNvbnRhaW5lci0+bVR5cGUpKTsKLQotI2lmIDAKLSAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyLT5tVHlwZSA9PSBGT1VSQ0MoJ3MnLCAndCcsICdzJywgJ2QnKSkgewotICAgICAgICAgICAgICAgICAgICBUcmFja0luZm8gKnRyYWNrSW5mbyA9IGVkaXRUcmFjayhtQ3VycmVudFRyYWNrSUQpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpIDwgdHJhY2tJbmZvLT5tU2FtcGxlRGVzY3Muc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJmb3JtYXQgIyVkOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJbmZvLT5tU2FtcGxlRGVzY3MuaXRlbUF0KGkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tRm9ybWF0LT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotI2VuZGlmCi0KLSAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyLT5tVHlwZSA9PSBGT1VSQ0MoJ3MnLCAndCcsICdiJywgJ2wnKSkgewotICAgICAgICAgICAgICAgICAgICBUcmFja0luZm8gKnRyYWNrSW5mbyA9IGVkaXRUcmFjayhtQ3VycmVudFRyYWNrSUQpOwotCi0gICAgICAgICAgICAgICAgICAgIHRyYWNrSW5mby0+bVN0YXRpY0ZyYWdtZW50LT5zaWduYWxDb21wbGV0aW9uKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0sodHJhY2tJbmZvLT5tRnJhZ21lbnRzLmVtcHR5KCkpOwotICAgICAgICAgICAgICAgICAgICB0cmFja0luZm8tPm1GcmFnbWVudHMucHVzaF9iYWNrKHRyYWNrSW5mby0+bVN0YXRpY0ZyYWdtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgdHJhY2tJbmZvLT5tU3RhdGljRnJhZ21lbnQuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lci0+bVR5cGUgPT0gRk9VUkNDKCd0JywgJ3InLCAnYScsICdmJykpIHsKLSAgICAgICAgICAgICAgICAgICAgVHJhY2tJbmZvICp0cmFja0luZm8gPQotICAgICAgICAgICAgICAgICAgICAgICAgZWRpdFRyYWNrKG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tVHJhY2tJRCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8VHJhY2tGcmFnbWVudD4gJmZyYWdtZW50ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICotLXRyYWNrSW5mby0+bUZyYWdtZW50cy5lbmQoKTsKLQotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxEeW5hbWljVHJhY2tGcmFnbWVudCAqPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnbWVudC5nZXQoKSktPnNpZ25hbENvbXBsZXRpb24oKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lci0+bVR5cGUgPT0gRk9VUkNDKCdtJywgJ28nLCAnbycsICd2JykpIHsKLSAgICAgICAgICAgICAgICAgICAgbURvbmVXaXRoTW9vdiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY29udGFpbmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICBtU3RhY2sucmVtb3ZlSXRlbXNBdChpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChkaXN0YW5jZSA8IChvZmZfdCltQnVmZmVyLT5zaXplKCkpIHsKLSAgICAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UobUJ1ZmZlci0+b2Zmc2V0KCkgKyBkaXN0YW5jZSwgbUJ1ZmZlci0+c2l6ZSgpIC0gZGlzdGFuY2UpOwotICAgICAgICBtQnVmZmVyUG9zICs9IGRpc3RhbmNlOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7Ci0gICAgbUJ1ZmZlclBvcyArPSBkaXN0YW5jZTsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VUcmFja0hlYWRlcigKLSAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIGlmIChvZmZzZXQgKyA0ID4gc2l6ZSkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBmbGFncyA9IHJlYWRVMzIob2Zmc2V0KTsKLQotICAgIHVpbnQzMl90IHZlcnNpb24gPSBmbGFncyA+PiAyNDsKLSAgICBmbGFncyAmPSAweGZmZmZmZjsKLQotICAgIHVpbnQzMl90IHRyYWNrSUQ7Ci0gICAgdWludDY0X3QgZHVyYXRpb247Ci0KLSAgICBpZiAodmVyc2lvbiA9PSAxKSB7Ci0gICAgICAgIGlmIChvZmZzZXQgKyAzNiA+IHNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJhY2tJRCA9IHJlYWRVMzIob2Zmc2V0ICsgMjApOwotICAgICAgICBkdXJhdGlvbiA9IHJlYWRVNjQob2Zmc2V0ICsgMjgpOwotCi0gICAgICAgIG9mZnNldCArPSAzNjsKLSAgICB9IGVsc2UgaWYgKHZlcnNpb24gPT0gMCkgewotICAgICAgICBpZiAob2Zmc2V0ICsgMjQgPiBzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgIHRyYWNrSUQgPSByZWFkVTMyKG9mZnNldCArIDEyKTsKLSAgICAgICAgZHVyYXRpb24gPSByZWFkVTMyKG9mZnNldCArIDIwKTsKLQotICAgICAgICBvZmZzZXQgKz0gMjQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgVHJhY2tJbmZvICppbmZvID0gZWRpdFRyYWNrKHRyYWNrSUQsIHRydWUgLyogY3JlYXRlSWZOZWNlc3NhcnkgKi8pOwotICAgIGluZm8tPm1GbGFncyA9IGZsYWdzOwotICAgIGluZm8tPm1EdXJhdGlvbiA9IGR1cmF0aW9uOwotICAgIGlmIChpbmZvLT5tRHVyYXRpb24gPT0gMHhmZmZmZmZmZikgewotICAgICAgICAvLyBmZm1wZWcgc2V0cyB0aGlzIHRvIC0xLCB3aGljaCBpcyBpbmNvcnJlY3QuCi0gICAgICAgIGluZm8tPm1EdXJhdGlvbiA9IDA7Ci0gICAgfQotCi0gICAgaW5mby0+bVN0YXRpY0ZyYWdtZW50ID0gbmV3IFN0YXRpY1RyYWNrRnJhZ21lbnQ7Ci0KLSAgICBtQ3VycmVudFRyYWNrSUQgPSB0cmFja0lEOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZU1lZGlhSGVhZGVyKAotICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgaWYgKG9mZnNldCArIDQgPiBzaXplKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIHVpbnQzMl90IHZlcnNpb25BbmRGbGFncyA9IHJlYWRVMzIob2Zmc2V0KTsKLQotICAgIGlmICh2ZXJzaW9uQW5kRmxhZ3MgJiAweGZmZmZmZikgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHVpbnQzMl90IHZlcnNpb24gPSB2ZXJzaW9uQW5kRmxhZ3MgPj4gMjQ7Ci0KLSAgICBUcmFja0luZm8gKmluZm8gPSBlZGl0VHJhY2sobUN1cnJlbnRUcmFja0lEKTsKLQotICAgIGlmICh2ZXJzaW9uID09IDEpIHsKLSAgICAgICAgaWYgKG9mZnNldCArIDQgKyAzMiA+IHNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0gICAgICAgIGluZm8tPm1NZWRpYVRpbWVTY2FsZSA9IFUzMl9BVChtQnVmZmVyLT5kYXRhKCkgKyBvZmZzZXQgKyAyMCk7Ci0gICAgfSBlbHNlIGlmICh2ZXJzaW9uID09IDApIHsKLSAgICAgICAgaWYgKG9mZnNldCArIDQgKyAyMCA+IHNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0gICAgICAgIGluZm8tPm1NZWRpYVRpbWVTY2FsZSA9IFUzMl9BVChtQnVmZmVyLT5kYXRhKCkgKyBvZmZzZXQgKyAxMik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlTWVkaWFIYW5kbGVyKAotICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgaWYgKG9mZnNldCArIDEyID4gc2l6ZSkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBpZiAocmVhZFUzMihvZmZzZXQpICE9IDApIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgdWludDMyX3QgaGFuZGxlclR5cGUgPSByZWFkVTMyKG9mZnNldCArIDgpOwotCi0gICAgc3dpdGNoIChoYW5kbGVyVHlwZSkgewotICAgICAgICBjYXNlIEZPVVJDQygndicsICdpJywgJ2QnLCAnZScpOgotICAgICAgICBjYXNlIEZPVVJDQygncycsICdvJywgJ3UnLCAnbicpOgotICAgICAgICBjYXNlIEZPVVJDQygnaCcsICdpJywgJ24nLCAndCcpOgotICAgICAgICBjYXNlIEZPVVJDQygnbScsICdlJywgJ3QnLCAnYScpOgotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIGVkaXRUcmFjayhtQ3VycmVudFRyYWNrSUQpLT5tTWVkaWFIYW5kbGVyVHlwZSA9IGhhbmRsZXJUeXBlOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZVZpc3VhbFNhbXBsZUVudHJ5KAotICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgaWYgKG9mZnNldCArIDc4ID4gc2l6ZSkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBUcmFja0luZm8gKnRyYWNrSW5mbyA9IGVkaXRUcmFjayhtQ3VycmVudFRyYWNrSUQpOwotCi0gICAgdHJhY2tJbmZvLT5tU2FtcGxlRGVzY3MucHVzaCgpOwotICAgIFNhbXBsZURlc2NyaXB0aW9uICpzYW1wbGVEZXNjID0KLSAgICAgICAgJnRyYWNrSW5mby0+bVNhbXBsZURlc2NzLmVkaXRJdGVtQXQoCi0gICAgICAgICAgICAgICAgdHJhY2tJbmZvLT5tU2FtcGxlRGVzY3Muc2l6ZSgpIC0gMSk7Ci0KLSAgICBzYW1wbGVEZXNjLT5tVHlwZSA9IHR5cGU7Ci0gICAgc2FtcGxlRGVzYy0+bURhdGFSZWZJbmRleCA9IHJlYWRVMTYob2Zmc2V0ICsgNik7Ci0KLSAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbmV3IEFNZXNzYWdlOwotCi0gICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdhJywgJ3YnLCAnYycsICcxJyk6Ci0gICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAncCcsICc0JywgJ3YnKToKLSAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJzInLCAnNicsICczJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdoJywgJzInLCAnNicsICczJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdIJywgJzInLCAnNicsICczJyk6Ci0gICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGZvcm1hdC0+c2V0SW50MzIoIndpZHRoIiwgcmVhZFUxNihvZmZzZXQgKyA4ICsgMTYpKTsKLSAgICBmb3JtYXQtPnNldEludDMyKCJoZWlnaHQiLCByZWFkVTE2KG9mZnNldCArIDggKyAxOCkpOwotCi0gICAgc2FtcGxlRGVzYy0+bUZvcm1hdCA9IGZvcm1hdDsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VBdWRpb1NhbXBsZUVudHJ5KAotICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgaWYgKG9mZnNldCArIDI4ID4gc2l6ZSkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBUcmFja0luZm8gKnRyYWNrSW5mbyA9IGVkaXRUcmFjayhtQ3VycmVudFRyYWNrSUQpOwotCi0gICAgdHJhY2tJbmZvLT5tU2FtcGxlRGVzY3MucHVzaCgpOwotICAgIFNhbXBsZURlc2NyaXB0aW9uICpzYW1wbGVEZXNjID0KLSAgICAgICAgJnRyYWNrSW5mby0+bVNhbXBsZURlc2NzLmVkaXRJdGVtQXQoCi0gICAgICAgICAgICAgICAgdHJhY2tJbmZvLT5tU2FtcGxlRGVzY3Muc2l6ZSgpIC0gMSk7Ci0KLSAgICBzYW1wbGVEZXNjLT5tVHlwZSA9IHR5cGU7Ci0gICAgc2FtcGxlRGVzYy0+bURhdGFSZWZJbmRleCA9IHJlYWRVMTYob2Zmc2V0ICsgNik7Ci0KLSAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbmV3IEFNZXNzYWdlOwotCi0gICAgZm9ybWF0LT5zZXRJbnQzMigiY2hhbm5lbC1jb3VudCIsIHJlYWRVMTYob2Zmc2V0ICsgOCArIDgpKTsKLSAgICBmb3JtYXQtPnNldEludDMyKCJzYW1wbGUtc2l6ZSIsIHJlYWRVMTYob2Zmc2V0ICsgOCArIDEwKSk7Ci0gICAgZm9ybWF0LT5zZXRJbnQzMigic2FtcGxlLXJhdGUiLCByZWFkVTMyKG9mZnNldCArIDggKyAxNikgLyA2NTUzNi4wZik7Ci0KLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAncCcsICc0JywgJ2EnKToKLSAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ2EnLCAnbScsICdyJyk6Ci0gICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQik7Ci0gICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgMSk7Ci0gICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJzYW1wbGUtcmF0ZSIsIDgwMDApOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAnYScsICd3JywgJ2InKToKLSAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCKTsKLSAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImNoYW5uZWwtY291bnQiLCAxKTsKLSAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInNhbXBsZS1yYXRlIiwgMTYwMDApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHNhbXBsZURlc2MtPm1Gb3JtYXQgPSBmb3JtYXQ7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXRpYyB2b2lkIGFkZENvZGVjU3BlY2lmaWNEYXRhKAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwgaW50MzJfdCBpbmRleCwKLSAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsCi0gICAgICAgIGJvb2wgaW5zZXJ0U3RhcnRDb2RlID0gZmFsc2UpIHsKLSAgICBzcDxBQnVmZmVyPiBjc2QgPSBuZXcgQUJ1ZmZlcihpbnNlcnRTdGFydENvZGUgPyBzaXplICsgNCA6IHNpemUpOwotCi0gICAgbWVtY3B5KGNzZC0+ZGF0YSgpICsgKGluc2VydFN0YXJ0Q29kZSA/IDQgOiAwKSwgZGF0YSwgc2l6ZSk7Ci0KLSAgICBpZiAoaW5zZXJ0U3RhcnRDb2RlKSB7Ci0gICAgICAgIG1lbWNweShjc2QtPmRhdGEoKSwgIlx4MDBceDAwXHgwMFx4MDEiLCA0KTsKLSAgICB9Ci0KLSAgICBjc2QtPm1ldGEoKS0+c2V0SW50MzIoImNzZCIsIHRydWUpOwotICAgIGNzZC0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgMGxsKTsKLQotICAgIGZvcm1hdC0+c2V0QnVmZmVyKFN0cmluZ1ByaW50ZigiY3NkLSVkIiwgaW5kZXgpLmNfc3RyKCksIGNzZCk7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlU2FtcGxlU2l6ZXMoCi0gICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICByZXR1cm4gZWRpdFRyYWNrKG1DdXJyZW50VHJhY2tJRCktPm1TdGF0aWNGcmFnbWVudC0+cGFyc2VTYW1wbGVTaXplcygKLSAgICAgICAgICAgIHRoaXMsIHR5cGUsIG9mZnNldCwgc2l6ZSk7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlQ29tcGFjdFNhbXBsZVNpemVzKAotICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgcmV0dXJuIGVkaXRUcmFjayhtQ3VycmVudFRyYWNrSUQpLT5tU3RhdGljRnJhZ21lbnQtPnBhcnNlQ29tcGFjdFNhbXBsZVNpemVzKAotICAgICAgICAgICAgdGhpcywgdHlwZSwgb2Zmc2V0LCBzaXplKTsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VTYW1wbGVUb0NodW5rKAotICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgcmV0dXJuIGVkaXRUcmFjayhtQ3VycmVudFRyYWNrSUQpLT5tU3RhdGljRnJhZ21lbnQtPnBhcnNlU2FtcGxlVG9DaHVuaygKLSAgICAgICAgICAgIHRoaXMsIHR5cGUsIG9mZnNldCwgc2l6ZSk7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlQ2h1bmtPZmZzZXRzKAotICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgcmV0dXJuIGVkaXRUcmFjayhtQ3VycmVudFRyYWNrSUQpLT5tU3RhdGljRnJhZ21lbnQtPnBhcnNlQ2h1bmtPZmZzZXRzKAotICAgICAgICAgICAgdGhpcywgdHlwZSwgb2Zmc2V0LCBzaXplKTsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VDaHVua09mZnNldHM2NCgKLSAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIHJldHVybiBlZGl0VHJhY2sobUN1cnJlbnRUcmFja0lEKS0+bVN0YXRpY0ZyYWdtZW50LT5wYXJzZUNodW5rT2Zmc2V0czY0KAotICAgICAgICAgICAgdGhpcywgdHlwZSwgb2Zmc2V0LCBzaXplKTsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VBVkNDb2RlY1NwZWNpZmljRGF0YSgKLSAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIFRyYWNrSW5mbyAqdHJhY2tJbmZvID0gZWRpdFRyYWNrKG1DdXJyZW50VHJhY2tJRCk7Ci0KLSAgICBTYW1wbGVEZXNjcmlwdGlvbiAqc2FtcGxlRGVzYyA9Ci0gICAgICAgICZ0cmFja0luZm8tPm1TYW1wbGVEZXNjcy5lZGl0SXRlbUF0KAotICAgICAgICAgICAgICAgIHRyYWNrSW5mby0+bVNhbXBsZURlc2NzLnNpemUoKSAtIDEpOwotCi0gICAgaWYgKHNhbXBsZURlc2MtPm1UeXBlICE9IEZPVVJDQygnYScsICd2JywgJ2MnLCAnMScpKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9IG1CdWZmZXItPmRhdGEoKSArIG9mZnNldDsKLQotICAgIHNpemUgLT0gb2Zmc2V0OwotICAgIG9mZnNldCA9IDA7Ci0KLSAgICBpZiAoc2l6ZSA8IDcgfHwgcHRyWzBdICE9IDB4MDEpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBzYW1wbGVEZXNjLT5tRm9ybWF0LT5zZXRTaXplKCJuYWwtbGVuZ3RoLXNpemUiLCAxICsgKHB0cls0XSAmIDMpKTsKLQotICAgIHNpemVfdCBudW1TUFMgPSBwdHJbNV0gJiAzMTsKLQotICAgIHB0ciArPSA2OwotICAgIHNpemUgLT0gNjsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU1BTOyArK2kpIHsKLSAgICAgICAgaWYgKHNpemUgPCAyKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgc2l6ZV90IGxlbmd0aCA9IFUxNl9BVChwdHIpOwotCi0gICAgICAgIHB0ciArPSAyOwotICAgICAgICBzaXplIC09IDI7Ci0KLSAgICAgICAgaWYgKHNpemUgPCBsZW5ndGgpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBhZGRDb2RlY1NwZWNpZmljRGF0YSgKLSAgICAgICAgICAgICAgICBzYW1wbGVEZXNjLT5tRm9ybWF0LCBpLCBwdHIsIGxlbmd0aCwKLSAgICAgICAgICAgICAgICB0cnVlIC8qIGluc2VydFN0YXJ0Q29kZSAqLyk7Ci0KLSAgICAgICAgcHRyICs9IGxlbmd0aDsKLSAgICAgICAgc2l6ZSAtPSBsZW5ndGg7Ci0gICAgfQotCi0gICAgaWYgKHNpemUgPCAxKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgc2l6ZV90IG51bVBQUyA9ICpwdHI7Ci0gICAgKytwdHI7Ci0gICAgLS1zaXplOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1QUFM7ICsraSkgewotICAgICAgICBpZiAoc2l6ZSA8IDIpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBzaXplX3QgbGVuZ3RoID0gVTE2X0FUKHB0cik7Ci0KLSAgICAgICAgcHRyICs9IDI7Ci0gICAgICAgIHNpemUgLT0gMjsKLQotICAgICAgICBpZiAoc2l6ZSA8IGxlbmd0aCkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIGFkZENvZGVjU3BlY2lmaWNEYXRhKAotICAgICAgICAgICAgICAgIHNhbXBsZURlc2MtPm1Gb3JtYXQsIG51bVNQUyArIGksIHB0ciwgbGVuZ3RoLAotICAgICAgICAgICAgICAgIHRydWUgLyogaW5zZXJ0U3RhcnRDb2RlICovKTsKLQotICAgICAgICBwdHIgKz0gbGVuZ3RoOwotICAgICAgICBzaXplIC09IGxlbmd0aDsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlRVNEU0NvZGVjU3BlY2lmaWNEYXRhKAotICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgVHJhY2tJbmZvICp0cmFja0luZm8gPSBlZGl0VHJhY2sobUN1cnJlbnRUcmFja0lEKTsKLQotICAgIFNhbXBsZURlc2NyaXB0aW9uICpzYW1wbGVEZXNjID0KLSAgICAgICAgJnRyYWNrSW5mby0+bVNhbXBsZURlc2NzLmVkaXRJdGVtQXQoCi0gICAgICAgICAgICAgICAgdHJhY2tJbmZvLT5tU2FtcGxlRGVzY3Muc2l6ZSgpIC0gMSk7Ci0KLSAgICBpZiAoc2FtcGxlRGVzYy0+bVR5cGUgIT0gRk9VUkNDKCdtJywgJ3AnLCAnNCcsICdhJykKLSAgICAgICAgICAgICYmIHNhbXBsZURlc2MtPm1UeXBlICE9IEZPVVJDQygnbScsICdwJywgJzQnLCAndicpKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9IG1CdWZmZXItPmRhdGEoKSArIG9mZnNldDsKLQotICAgIHNpemUgLT0gb2Zmc2V0OwotICAgIG9mZnNldCA9IDA7Ci0KLSAgICBpZiAoc2l6ZSA8IDQpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgaWYgKFUzMl9BVChwdHIpICE9IDApIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgcHRyICs9IDQ7Ci0gICAgc2l6ZSAtPTQ7Ci0KLSAgICBFU0RTIGVzZHMocHRyLCBzaXplKTsKLQotICAgIHVpbnQ4X3Qgb2JqZWN0VHlwZUluZGljYXRpb247Ci0gICAgaWYgKGVzZHMuZ2V0T2JqZWN0VHlwZUluZGljYXRpb24oJm9iamVjdFR5cGVJbmRpY2F0aW9uKSAhPSBPSykgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGNvbnN0IHVpbnQ4X3QgKmNzZDsKLSAgICBzaXplX3QgY3NkX3NpemU7Ci0gICAgaWYgKGVzZHMuZ2V0Q29kZWNTcGVjaWZpY0luZm8oCi0gICAgICAgICAgICAgICAgKGNvbnN0IHZvaWQgKiopJmNzZCwgJmNzZF9zaXplKSAhPSBPSykgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGFkZENvZGVjU3BlY2lmaWNEYXRhKHNhbXBsZURlc2MtPm1Gb3JtYXQsIDAsIGNzZCwgY3NkX3NpemUpOwotCi0gICAgaWYgKHNhbXBsZURlc2MtPm1UeXBlICE9IEZPVVJDQygnbScsICdwJywgJzQnLCAnYScpKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBpZiAoY3NkX3NpemUgPT0gMCkgewotICAgICAgICAvLyBUaGVyZSdzIG5vIGZ1cnRoZXIgaW5mb3JtYXRpb24sIGkuZS4gbm8gY29kZWMgc3BlY2lmaWMgZGF0YQotICAgICAgICAvLyBMZXQncyBhc3N1bWUgdGhhdCB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgaW4gdGhlIG1wZWc0IGhlYWRlcnMKLSAgICAgICAgLy8gaXMgYWNjdXJhdGUgYW5kIGhvcGUgZm9yIHRoZSBiZXN0LgotCi0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBpZiAoY3NkX3NpemUgPCAyKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgdWludDMyX3Qgb2JqZWN0VHlwZSA9IGNzZFswXSA+PiAzOwotCi0gICAgaWYgKG9iamVjdFR5cGUgPT0gMzEpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgIHVpbnQzMl90IGZyZXFJbmRleCA9IChjc2RbMF0gJiA3KSA8PCAxIHwgKGNzZFsxXSA+PiA3KTsKLSAgICBpbnQzMl90IHNhbXBsZVJhdGUgPSAwOwotICAgIGludDMyX3QgbnVtQ2hhbm5lbHMgPSAwOwotICAgIGlmIChmcmVxSW5kZXggPT0gMTUpIHsKLSAgICAgICAgaWYgKGNzZF9zaXplIDwgNSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIHNhbXBsZVJhdGUgPSAoY3NkWzFdICYgMHg3ZikgPDwgMTcKLSAgICAgICAgICAgICAgICAgICAgICAgIHwgY3NkWzJdIDw8IDkKLSAgICAgICAgICAgICAgICAgICAgICAgIHwgY3NkWzNdIDw8IDEKLSAgICAgICAgICAgICAgICAgICAgICAgIHwgKGNzZFs0XSA+PiA3KTsKLQotICAgICAgICBudW1DaGFubmVscyA9IChjc2RbNF0gPj4gMykgJiAxNTsKLSAgICB9IGVsc2UgewotICAgICAgICBzdGF0aWMgdWludDMyX3Qga1NhbXBsaW5nUmF0ZVtdID0gewotICAgICAgICAgICAgOTYwMDAsIDg4MjAwLCA2NDAwMCwgNDgwMDAsIDQ0MTAwLCAzMjAwMCwgMjQwMDAsIDIyMDUwLAotICAgICAgICAgICAgMTYwMDAsIDEyMDAwLCAxMTAyNSwgODAwMCwgNzM1MAotICAgICAgICB9OwotCi0gICAgICAgIGlmIChmcmVxSW5kZXggPT0gMTMgfHwgZnJlcUluZGV4ID09IDE0KSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgc2FtcGxlUmF0ZSA9IGtTYW1wbGluZ1JhdGVbZnJlcUluZGV4XTsKLSAgICAgICAgbnVtQ2hhbm5lbHMgPSAoY3NkWzFdID4+IDMpICYgMTU7Ci0gICAgfQotCi0gICAgaWYgKG51bUNoYW5uZWxzID09IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgIHNhbXBsZURlc2MtPm1Gb3JtYXQtPnNldEludDMyKCJzYW1wbGUtcmF0ZSIsIHNhbXBsZVJhdGUpOwotICAgIHNhbXBsZURlc2MtPm1Gb3JtYXQtPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgbnVtQ2hhbm5lbHMpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZU1lZGlhRGF0YSgKLSAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIEFMT0dWKCJza2lwcGluZyAnbWRhdCcgY2h1bmsgYXQgb2Zmc2V0cyAweCUwOGx4LTB4JTA4bGx4LiIsCi0gICAgICAgICAgbUJ1ZmZlclBvcyArIG9mZnNldCwgbUJ1ZmZlclBvcyArIHNpemUpOwotCi0gICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoc2l6ZSAtIG9mZnNldCk7Ci0gICAgbWVtY3B5KGJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5kYXRhKCkgKyBvZmZzZXQsIHNpemUgLSBvZmZzZXQpOwotCi0gICAgbU1lZGlhRGF0YS5wdXNoKCk7Ci0gICAgTWVkaWFEYXRhSW5mbyAqaW5mbyA9ICZtTWVkaWFEYXRhLmVkaXRJdGVtQXQobU1lZGlhRGF0YS5zaXplKCkgLSAxKTsKLSAgICBpbmZvLT5tQnVmZmVyID0gYnVmZmVyOwotICAgIGluZm8tPm1PZmZzZXQgPSBtQnVmZmVyUG9zICsgb2Zmc2V0OwotCi0gICAgaWYgKG1NZWRpYURhdGEuc2l6ZSgpID4gMTApIHsKLSAgICAgICAgQUxPR1YoInN1c3BlbmRpbmcgZm9yIG5vdy4iKTsKLSAgICAgICAgbVN1c3BlbmRlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZVNlZ21lbnRJbmRleCgKLSAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIEFMT0dWKCJzaWR4IGJveCB0eXBlICVkLCBvZmZzZXQgJWQsIHNpemUgJWQiLCB0eXBlLCBpbnQob2Zmc2V0KSwgaW50KHNpemUpKTsKLS8vICAgIEFTdHJpbmcgc2lkeHN0cjsKLS8vICAgIGhleGR1bXAobUJ1ZmZlci0+ZGF0YSgpICsgb2Zmc2V0LCBzaXplLCAwIC8qIGluZGVudCAqLywgJnNpZHhzdHIpOwotLy8gICAgQUxPR1YoInJhdyBzaWR4OiIpOwotLy8gICAgQUxPR1YoIiVzIiwgc2lkeHN0ci5jX3N0cigpKTsKLSAgICBpZiAob2Zmc2V0ICsgMTIgPiBzaXplKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIHVpbnQzMl90IGZsYWdzID0gcmVhZFUzMihvZmZzZXQpOwotCi0gICAgdWludDMyX3QgdmVyc2lvbiA9IGZsYWdzID4+IDI0OwotICAgIGZsYWdzICY9IDB4ZmZmZmZmOwotCi0gICAgQUxPR1YoInNpZHggdmVyc2lvbiAlZCIsIHZlcnNpb24pOwotCi0gICAgdWludDMyX3QgcmVmZXJlbmNlSWQgPSByZWFkVTMyKG9mZnNldCArIDQpOwotICAgIHVpbnQzMl90IHRpbWVTY2FsZSA9IHJlYWRVMzIob2Zmc2V0ICsgOCk7Ci0gICAgQUxPR1YoInNpZHggcmVmaWQvdGltZXNjYWxlOiAlZC8lZCIsIHJlZmVyZW5jZUlkLCB0aW1lU2NhbGUpOwotCi0gICAgdWludDY0X3QgZWFybGllc3RQcmVzZW50YXRpb25UaW1lOwotICAgIHVpbnQ2NF90IGZpcnN0T2Zmc2V0OwotCi0gICAgb2Zmc2V0ICs9IDEyOwotCi0gICAgaWYgKHZlcnNpb24gPT0gMCkgewotICAgICAgICBpZiAob2Zmc2V0ICsgOCA+IHNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0gICAgICAgIGVhcmxpZXN0UHJlc2VudGF0aW9uVGltZSA9IHJlYWRVMzIob2Zmc2V0KTsKLSAgICAgICAgZmlyc3RPZmZzZXQgPSByZWFkVTMyKG9mZnNldCArIDQpOwotICAgICAgICBvZmZzZXQgKz0gODsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAob2Zmc2V0ICsgMTYgPiBzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotICAgICAgICBlYXJsaWVzdFByZXNlbnRhdGlvblRpbWUgPSByZWFkVTY0KG9mZnNldCk7Ci0gICAgICAgIGZpcnN0T2Zmc2V0ID0gcmVhZFU2NChvZmZzZXQgKyA4KTsKLSAgICAgICAgb2Zmc2V0ICs9IDE2OwotICAgIH0KLSAgICBBTE9HVigic2lkeCBwcmVzL29mZjogJUxkLyVMZCIsIGVhcmxpZXN0UHJlc2VudGF0aW9uVGltZSwgZmlyc3RPZmZzZXQpOwotCi0gICAgaWYgKG9mZnNldCArIDQgPiBzaXplKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICBpZiAocmVhZFUxNihvZmZzZXQpICE9IDApIHsgLy8gcmVzZXJ2ZWQKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIGludDMyX3QgcmVmZXJlbmNlQ291bnQgPSByZWFkVTE2KG9mZnNldCArIDIpOwotICAgIG9mZnNldCArPSA0OwotICAgIEFMT0dWKCJyZWZjb3VudDogJWQiLCByZWZlcmVuY2VDb3VudCk7Ci0KLSAgICBpZiAob2Zmc2V0ICsgcmVmZXJlbmNlQ291bnQgKiAxMiA+IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgVHJhY2tJbmZvICppbmZvID0gZWRpdFRyYWNrKG1DdXJyZW50VHJhY2tJRCk7Ci0gICAgdWludDY0X3QgdG90YWxfZHVyYXRpb24gPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVmZXJlbmNlQ291bnQ7IGkrKykgewotICAgICAgICB1aW50MzJfdCBkMSA9IHJlYWRVMzIob2Zmc2V0KTsKLSAgICAgICAgdWludDMyX3QgZDIgPSByZWFkVTMyKG9mZnNldCArIDQpOwotICAgICAgICB1aW50MzJfdCBkMyA9IHJlYWRVMzIob2Zmc2V0ICsgOCk7Ci0KLSAgICAgICAgaWYgKGQxICYgMHg4MDAwMDAwMCkgewotICAgICAgICAgICAgQUxPR1coInN1Yi1zaWR4IGJveGVzIG5vdCBzdXBwb3J0ZWQgeWV0Iik7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbCBzYXAgPSBkMyAmIDB4ODAwMDAwMDA7Ci0gICAgICAgIGJvb2wgc2FwdHlwZSA9IGQzID4+IDI4OwotICAgICAgICBpZiAoIXNhcCB8fCBzYXB0eXBlID4gMikgewotICAgICAgICAgICAgQUxPR1coIm5vdCBhIHN0cmVhbSBhY2Nlc3MgcG9pbnQsIG9yIHVuc3VwcG9ydGVkIHR5cGUiKTsKLSAgICAgICAgfQotICAgICAgICB0b3RhbF9kdXJhdGlvbiArPSBkMjsKLSAgICAgICAgb2Zmc2V0ICs9IDEyOwotICAgICAgICBBTE9HVigiIGl0ZW0gJWQsICUwOHggJTA4eCAlMDh4IiwgaSwgZDEsIGQyLCBkMyk7Ci0gICAgICAgIFNpZHhFbnRyeSBzZTsKLSAgICAgICAgc2UubVNpemUgPSBkMSAmIDB4N2ZmZmZmZmY7Ci0gICAgICAgIHNlLm1EdXJhdGlvblVzID0gMTAwMDAwMExMICogZDIgLyB0aW1lU2NhbGU7Ci0gICAgICAgIGluZm8tPm1TaWR4LmFkZChzZSk7Ci0gICAgfQotCi0gICAgaW5mby0+bVNpZHhEdXJhdGlvbiA9IHRvdGFsX2R1cmF0aW9uICogMTAwMDAwMCAvIHRpbWVTY2FsZTsKLSAgICBBTE9HVigiZHVyYXRpb246ICVsbGQiLCBpbmZvLT5tU2lkeER1cmF0aW9uKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlVHJhY2tFeHRlbmRzKAotICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgaWYgKG9mZnNldCArIDI0ID4gc2l6ZSkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBpZiAocmVhZFUzMihvZmZzZXQpICE9IDApIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgdWludDMyX3QgdHJhY2tJRCA9IHJlYWRVMzIob2Zmc2V0ICsgNCk7Ci0KLSAgICBUcmFja0luZm8gKmluZm8gPSBlZGl0VHJhY2sodHJhY2tJRCwgdHJ1ZSAvKiBjcmVhdGVJZk5lY2Vzc2FyeSAqLyk7Ci0gICAgaW5mby0+bURlZmF1bHRTYW1wbGVEZXNjcmlwdGlvbkluZGV4ID0gcmVhZFUzMihvZmZzZXQgKyA4KTsKLSAgICBpbmZvLT5tRGVmYXVsdFNhbXBsZUR1cmF0aW9uID0gcmVhZFUzMihvZmZzZXQgKyAxMik7Ci0gICAgaW5mby0+bURlZmF1bHRTYW1wbGVTaXplID0gcmVhZFUzMihvZmZzZXQgKyAxNik7Ci0gICAgaW5mby0+bURlZmF1bHRTYW1wbGVGbGFncyA9IHJlYWRVMzIob2Zmc2V0ICsgMjApOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1GcmFnbWVudGVkTVA0UGFyc2VyOjpUcmFja0luZm8gKkZyYWdtZW50ZWRNUDRQYXJzZXI6OmVkaXRUcmFjaygKLSAgICAgICAgdWludDMyX3QgdHJhY2tJRCwgYm9vbCBjcmVhdGVJZk5lY2Vzc2FyeSkgewotICAgIHNzaXplX3QgaSA9IG1UcmFja3MuaW5kZXhPZktleSh0cmFja0lEKTsKLQotICAgIGlmIChpID49IDApIHsKLSAgICAgICAgcmV0dXJuICZtVHJhY2tzLmVkaXRWYWx1ZUF0KGkpOwotICAgIH0KLQotICAgIGlmICghY3JlYXRlSWZOZWNlc3NhcnkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgVHJhY2tJbmZvIGluZm87Ci0gICAgaW5mby5tVHJhY2tJRCA9IHRyYWNrSUQ7Ci0gICAgaW5mby5tRmxhZ3MgPSAwOwotICAgIGluZm8ubUR1cmF0aW9uID0gMHhmZmZmZmZmZjsKLSAgICBpbmZvLm1TaWR4RHVyYXRpb24gPSAwOwotICAgIGluZm8ubU1lZGlhVGltZVNjYWxlID0gMDsKLSAgICBpbmZvLm1NZWRpYUhhbmRsZXJUeXBlID0gMDsKLSAgICBpbmZvLm1EZWZhdWx0U2FtcGxlRGVzY3JpcHRpb25JbmRleCA9IDA7Ci0gICAgaW5mby5tRGVmYXVsdFNhbXBsZUR1cmF0aW9uID0gMDsKLSAgICBpbmZvLm1EZWZhdWx0U2FtcGxlU2l6ZSA9IDA7Ci0gICAgaW5mby5tRGVmYXVsdFNhbXBsZUZsYWdzID0gMDsKLQotICAgIGluZm8ubURlY29kaW5nVGltZSA9IDA7Ci0KLSAgICBtVHJhY2tzLmFkZCh0cmFja0lELCBpbmZvKTsKLSAgICByZXR1cm4gJm1UcmFja3MuZWRpdFZhbHVlQXQobVRyYWNrcy5pbmRleE9mS2V5KHRyYWNrSUQpKTsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VUcmFja0ZyYWdtZW50SGVhZGVyKAotICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgaWYgKG9mZnNldCArIDggPiBzaXplKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIHVpbnQzMl90IGZsYWdzID0gcmVhZFUzMihvZmZzZXQpOwotCi0gICAgaWYgKGZsYWdzICYgMHhmZjAwMDAwMCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubUZsYWdzID0gZmxhZ3M7Ci0KLSAgICBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubVRyYWNrSUQgPSByZWFkVTMyKG9mZnNldCArIDQpOwotICAgIG9mZnNldCArPSA4OwotCi0gICAgaWYgKGZsYWdzICYgVHJhY2tGcmFnbWVudEhlYWRlckluZm86OmtCYXNlRGF0YU9mZnNldFByZXNlbnQpIHsKLSAgICAgICAgaWYgKG9mZnNldCArIDggPiBzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgIG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tQmFzZURhdGFPZmZzZXQgPSByZWFkVTY0KG9mZnNldCk7Ci0gICAgICAgIG9mZnNldCArPSA4OwotICAgIH0KLQotICAgIGlmIChmbGFncyAmIFRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvOjprU2FtcGxlRGVzY3JpcHRpb25JbmRleFByZXNlbnQpIHsKLSAgICAgICAgaWYgKG9mZnNldCArIDQgPiBzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgIG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tU2FtcGxlRGVzY3JpcHRpb25JbmRleCA9IHJlYWRVMzIob2Zmc2V0KTsKLSAgICAgICAgb2Zmc2V0ICs9IDQ7Ci0gICAgfQotCi0gICAgaWYgKGZsYWdzICYgVHJhY2tGcmFnbWVudEhlYWRlckluZm86OmtEZWZhdWx0U2FtcGxlRHVyYXRpb25QcmVzZW50KSB7Ci0gICAgICAgIGlmIChvZmZzZXQgKyA0ID4gc2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLQotICAgICAgICBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubURlZmF1bHRTYW1wbGVEdXJhdGlvbiA9IHJlYWRVMzIob2Zmc2V0KTsKLSAgICAgICAgb2Zmc2V0ICs9IDQ7Ci0gICAgfQotCi0gICAgaWYgKGZsYWdzICYgVHJhY2tGcmFnbWVudEhlYWRlckluZm86OmtEZWZhdWx0U2FtcGxlU2l6ZVByZXNlbnQpIHsKLSAgICAgICAgaWYgKG9mZnNldCArIDQgPiBzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgIG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRGVmYXVsdFNhbXBsZVNpemUgPSByZWFkVTMyKG9mZnNldCk7Ci0gICAgICAgIG9mZnNldCArPSA0OwotICAgIH0KLQotICAgIGlmIChmbGFncyAmIFRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvOjprRGVmYXVsdFNhbXBsZUZsYWdzUHJlc2VudCkgewotICAgICAgICBpZiAob2Zmc2V0ICsgNCA+IHNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0KLSAgICAgICAgbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1EZWZhdWx0U2FtcGxlRmxhZ3MgPSByZWFkVTMyKG9mZnNldCk7Ci0gICAgICAgIG9mZnNldCArPSA0OwotICAgIH0KLQotICAgIGlmICghKGZsYWdzICYgVHJhY2tGcmFnbWVudEhlYWRlckluZm86OmtCYXNlRGF0YU9mZnNldFByZXNlbnQpKSB7Ci0gICAgICAgIC8vIFRoaXMgc2hvdWxkIHBvaW50IHRvIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUKLSAgICAgICAgLy8gZW5jbG9zaW5nICdtb29mJyBjb250YWluZXIgZm9yIHRoZSBmaXJzdCB0cmFjayBhbmQKLSAgICAgICAgLy8gdGhlIGVuZCBvZiB0aGUgZGF0YSBvZiB0aGUgcHJlY2VkaW5nIGZyYWdtZW50IGZvciBzdWJzZXF1ZW50Ci0gICAgICAgIC8vIHRyYWNrcy4KLQotICAgICAgICBDSEVDS19HRShtU3RhY2suc2l6ZSgpLCAydSk7Ci0KLSAgICAgICAgbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1CYXNlRGF0YU9mZnNldCA9Ci0gICAgICAgICAgICBtU3RhY2suaXRlbUF0KG1TdGFjay5zaXplKCkgLSAyKS5tT2Zmc2V0OwotCi0gICAgICAgIC8vIFhYWCBUT0RPOiBUaGlzIGRvZXMgbm90IGRvIHRoZSByaWdodCB0aGluZyBmb3IgdGhlIDJuZCBhbmQKLSAgICAgICAgLy8gc3Vic2VxdWVudCB0cmFja3MgeWV0LgotICAgIH0KLQotICAgIG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRGF0YU9mZnNldCA9Ci0gICAgICAgIG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tQmFzZURhdGFPZmZzZXQ7Ci0KLSAgICBUcmFja0luZm8gKnRyYWNrSW5mbyA9IGVkaXRUcmFjayhtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubVRyYWNrSUQpOwotCi0gICAgaWYgKHRyYWNrSW5mby0+bUZyYWdtZW50cy5lbXB0eSgpCi0gICAgICAgICAgICB8fCAoKnRyYWNrSW5mby0+bUZyYWdtZW50cy5iZWdpbigpKS0+Y29tcGxldGUoKSkgewotICAgICAgICB0cmFja0luZm8tPm1GcmFnbWVudHMucHVzaF9iYWNrKG5ldyBEeW5hbWljVHJhY2tGcmFnbWVudCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZVRyYWNrRnJhZ21lbnRSdW4oCi0gICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICBpZiAob2Zmc2V0ICsgOCA+IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgZW51bSB7Ci0gICAgICAgIGtEYXRhT2Zmc2V0UHJlc2VudCAgICAgICAgICAgICAgICAgID0gMHgwMSwKLSAgICAgICAga0ZpcnN0U2FtcGxlRmxhZ3NQcmVzZW50ICAgICAgICAgICAgPSAweDA0LAotICAgICAgICBrU2FtcGxlRHVyYXRpb25QcmVzZW50ICAgICAgICAgICAgICA9IDB4MTAwLAotICAgICAgICBrU2FtcGxlU2l6ZVByZXNlbnQgICAgICAgICAgICAgICAgICA9IDB4MjAwLAotICAgICAgICBrU2FtcGxlRmxhZ3NQcmVzZW50ICAgICAgICAgICAgICAgICA9IDB4NDAwLAotICAgICAgICBrU2FtcGxlQ29tcG9zaXRpb25UaW1lT2Zmc2V0UHJlc2VudCA9IDB4ODAwLAotICAgIH07Ci0KLSAgICB1aW50MzJfdCBmbGFncyA9IHJlYWRVMzIob2Zmc2V0KTsKLQotICAgIGlmIChmbGFncyAmIDB4ZmYwMDAwMDApIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgaWYgKChmbGFncyAmIGtGaXJzdFNhbXBsZUZsYWdzUHJlc2VudCkgJiYgKGZsYWdzICYga1NhbXBsZUZsYWdzUHJlc2VudCkpIHsKLSAgICAgICAgLy8gVGhlc2UgdHdvIHNoYWxsIG5vdCBiZSB1c2VkIHRvZ2V0aGVyLgotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBzYW1wbGVDb3VudCA9IHJlYWRVMzIob2Zmc2V0ICsgNCk7Ci0gICAgb2Zmc2V0ICs9IDg7Ci0KLSAgICB1aW50NjRfdCBkYXRhT2Zmc2V0ID0gbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1EYXRhT2Zmc2V0OwotCi0gICAgdWludDMyX3QgZmlyc3RTYW1wbGVGbGFncyA9IDA7Ci0KLSAgICBpZiAoZmxhZ3MgJiBrRGF0YU9mZnNldFByZXNlbnQpIHsKLSAgICAgICAgaWYgKG9mZnNldCArIDQgPiBzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgIGludDMyX3QgZGF0YU9mZnNldERlbHRhID0gKGludDMyX3QpcmVhZFUzMihvZmZzZXQpOwotCi0gICAgICAgIGRhdGFPZmZzZXQgPSBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubUJhc2VEYXRhT2Zmc2V0ICsgZGF0YU9mZnNldERlbHRhOwotCi0gICAgICAgIG9mZnNldCArPSA0OwotICAgIH0KLQotICAgIGlmIChmbGFncyAmIGtGaXJzdFNhbXBsZUZsYWdzUHJlc2VudCkgewotICAgICAgICBpZiAob2Zmc2V0ICsgNCA+IHNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0KLSAgICAgICAgZmlyc3RTYW1wbGVGbGFncyA9IHJlYWRVMzIob2Zmc2V0KTsKLSAgICAgICAgb2Zmc2V0ICs9IDQ7Ci0gICAgfQotCi0gICAgVHJhY2tJbmZvICppbmZvID0gZWRpdFRyYWNrKG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tVHJhY2tJRCk7Ci0KLSAgICBpZiAoaW5mbyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIHVpbnQzMl90IHNhbXBsZUR1cmF0aW9uID0gMCwgc2FtcGxlU2l6ZSA9IDAsIHNhbXBsZUZsYWdzID0gMCwKLSAgICAgICAgICAgICBzYW1wbGVDdHNPZmZzZXQgPSAwOwotCi0gICAgc2l6ZV90IGJ5dGVzUGVyU2FtcGxlID0gMDsKLSAgICBpZiAoZmxhZ3MgJiBrU2FtcGxlRHVyYXRpb25QcmVzZW50KSB7Ci0gICAgICAgIGJ5dGVzUGVyU2FtcGxlICs9IDQ7Ci0gICAgfSBlbHNlIGlmIChtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubUZsYWdzCi0gICAgICAgICAgICAmIFRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvOjprRGVmYXVsdFNhbXBsZUR1cmF0aW9uUHJlc2VudCkgewotICAgICAgICBzYW1wbGVEdXJhdGlvbiA9IG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRGVmYXVsdFNhbXBsZUR1cmF0aW9uOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNhbXBsZUR1cmF0aW9uID0gaW5mby0+bURlZmF1bHRTYW1wbGVEdXJhdGlvbjsKLSAgICB9Ci0KLSAgICBpZiAoZmxhZ3MgJiBrU2FtcGxlU2l6ZVByZXNlbnQpIHsKLSAgICAgICAgYnl0ZXNQZXJTYW1wbGUgKz0gNDsKLSAgICB9IGVsc2UgaWYgKG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRmxhZ3MKLSAgICAgICAgICAgICYgVHJhY2tGcmFnbWVudEhlYWRlckluZm86OmtEZWZhdWx0U2FtcGxlU2l6ZVByZXNlbnQpIHsKLSAgICAgICAgc2FtcGxlU2l6ZSA9IG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRGVmYXVsdFNhbXBsZVNpemU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc2FtcGxlU2l6ZSA9IGluZm8tPm1EZWZhdWx0U2FtcGxlU2l6ZTsKLSAgICB9Ci0KLSAgICBpZiAoZmxhZ3MgJiBrU2FtcGxlRmxhZ3NQcmVzZW50KSB7Ci0gICAgICAgIGJ5dGVzUGVyU2FtcGxlICs9IDQ7Ci0gICAgfSBlbHNlIGlmIChtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubUZsYWdzCi0gICAgICAgICAgICAmIFRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvOjprRGVmYXVsdFNhbXBsZUZsYWdzUHJlc2VudCkgewotICAgICAgICBzYW1wbGVGbGFncyA9IG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRGVmYXVsdFNhbXBsZUZsYWdzOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNhbXBsZUZsYWdzID0gaW5mby0+bURlZmF1bHRTYW1wbGVGbGFnczsKLSAgICB9Ci0KLSAgICBpZiAoZmxhZ3MgJiBrU2FtcGxlQ29tcG9zaXRpb25UaW1lT2Zmc2V0UHJlc2VudCkgewotICAgICAgICBieXRlc1BlclNhbXBsZSArPSA0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNhbXBsZUN0c09mZnNldCA9IDA7Ci0gICAgfQotCi0gICAgaWYgKG9mZnNldCArIHNhbXBsZUNvdW50ICogYnl0ZXNQZXJTYW1wbGUgPiBzaXplKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIHVpbnQzMl90IHNhbXBsZURlc2NJbmRleCA9Ci0gICAgICAgIChtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubUZsYWdzCi0gICAgICAgICAgICAmIFRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvOjprU2FtcGxlRGVzY3JpcHRpb25JbmRleFByZXNlbnQpCi0gICAgICAgICAgICA/IG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tU2FtcGxlRGVzY3JpcHRpb25JbmRleAotICAgICAgICAgICAgOiBpbmZvLT5tRGVmYXVsdFNhbXBsZURlc2NyaXB0aW9uSW5kZXg7Ci0KLSAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc2FtcGxlQ291bnQ7ICsraSkgewotICAgICAgICBpZiAoZmxhZ3MgJiBrU2FtcGxlRHVyYXRpb25QcmVzZW50KSB7Ci0gICAgICAgICAgICBzYW1wbGVEdXJhdGlvbiA9IHJlYWRVMzIob2Zmc2V0KTsKLSAgICAgICAgICAgIG9mZnNldCArPSA0OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZsYWdzICYga1NhbXBsZVNpemVQcmVzZW50KSB7Ci0gICAgICAgICAgICBzYW1wbGVTaXplID0gcmVhZFUzMihvZmZzZXQpOwotICAgICAgICAgICAgb2Zmc2V0ICs9IDQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZmxhZ3MgJiBrU2FtcGxlRmxhZ3NQcmVzZW50KSB7Ci0gICAgICAgICAgICBzYW1wbGVGbGFncyA9IHJlYWRVMzIob2Zmc2V0KTsKLSAgICAgICAgICAgIG9mZnNldCArPSA0OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZsYWdzICYga1NhbXBsZUNvbXBvc2l0aW9uVGltZU9mZnNldFByZXNlbnQpIHsKLSAgICAgICAgICAgIHNhbXBsZUN0c09mZnNldCA9IHJlYWRVMzIob2Zmc2V0KTsKLSAgICAgICAgICAgIG9mZnNldCArPSA0OwotICAgICAgICB9Ci0KLSAgICAgICAgQUxPR1YoImFkZGluZyBzYW1wbGUgYXQgb2Zmc2V0IDB4JTA4bGx4LCBzaXplICV1LCBkdXJhdGlvbiAldSwgIgotICAgICAgICAgICAgICAic2FtcGxlRGVzY0luZGV4PSV1LCBmbGFncyAweCUwOHgiLAotICAgICAgICAgICAgICAgIGRhdGFPZmZzZXQsIHNhbXBsZVNpemUsIHNhbXBsZUR1cmF0aW9uLAotICAgICAgICAgICAgICAgIHNhbXBsZURlc2NJbmRleCwKLSAgICAgICAgICAgICAgICAoZmxhZ3MgJiBrRmlyc3RTYW1wbGVGbGFnc1ByZXNlbnQpICYmIGkgPT0gMAotICAgICAgICAgICAgICAgICAgICA/IGZpcnN0U2FtcGxlRmxhZ3MgOiBzYW1wbGVGbGFncyk7Ci0KLSAgICAgICAgY29uc3Qgc3A8VHJhY2tGcmFnbWVudD4gJmZyYWdtZW50ID0gKi0taW5mby0+bUZyYWdtZW50cy5lbmQoKTsKLQotICAgICAgICB1aW50MzJfdCBkZWNvZGluZ1RpbWUgPSBpbmZvLT5tRGVjb2RpbmdUaW1lOwotICAgICAgICBpbmZvLT5tRGVjb2RpbmdUaW1lICs9IHNhbXBsZUR1cmF0aW9uOwotICAgICAgICB1aW50MzJfdCBwcmVzZW50YXRpb25UaW1lID0gZGVjb2RpbmdUaW1lICsgc2FtcGxlQ3RzT2Zmc2V0OwotCi0gICAgICAgIHN0YXRpY19jYXN0PER5bmFtaWNUcmFja0ZyYWdtZW50ICo+KAotICAgICAgICAgICAgICAgIGZyYWdtZW50LmdldCgpKS0+YWRkU2FtcGxlKAotICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICBzYW1wbGVTaXplLAotICAgICAgICAgICAgICAgICAgICBwcmVzZW50YXRpb25UaW1lLAotICAgICAgICAgICAgICAgICAgICBzYW1wbGVEZXNjSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICgoZmxhZ3MgJiBrRmlyc3RTYW1wbGVGbGFnc1ByZXNlbnQpICYmIGkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgID8gZmlyc3RTYW1wbGVGbGFncyA6IHNhbXBsZUZsYWdzKTsKLQotICAgICAgICBkYXRhT2Zmc2V0ICs9IHNhbXBsZVNpemU7Ci0gICAgfQotCi0gICAgbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1EYXRhT2Zmc2V0ID0gZGF0YU9mZnNldDsKLQotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBGcmFnbWVudGVkTVA0UGFyc2VyOjpjb3B5QnVmZmVyKAotICAgICAgICBzcDxBQnVmZmVyPiAqZHN0LCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSBjb25zdCB7Ci0gICAgc3A8QUJ1ZmZlcj4gYnVmID0gbmV3IEFCdWZmZXIoc2l6ZSk7Ci0gICAgbWVtY3B5KGJ1Zi0+ZGF0YSgpLCBtQnVmZmVyLT5kYXRhKCkgKyBvZmZzZXQsIHNpemUpOwotCi0gICAgKmRzdCA9IGJ1ZjsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wNC9UcmFja0ZyYWdtZW50LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wNC9UcmFja0ZyYWdtZW50LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY5OTAzOC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcDQvVHJhY2tGcmFnbWVudC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiVHJhY2tGcmFnbWVudCIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIlRyYWNrRnJhZ21lbnQuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLUZyYWdtZW50ZWRNUDRQYXJzZXI6OkR5bmFtaWNUcmFja0ZyYWdtZW50OjpEeW5hbWljVHJhY2tGcmFnbWVudCgpCi0gICAgOiBtQ29tcGxldGUoZmFsc2UpLAotICAgICAgbVNhbXBsZUluZGV4KDApIHsKLX0KLQotRnJhZ21lbnRlZE1QNFBhcnNlcjo6RHluYW1pY1RyYWNrRnJhZ21lbnQ6On5EeW5hbWljVHJhY2tGcmFnbWVudCgpIHsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6RHluYW1pY1RyYWNrRnJhZ21lbnQ6OmdldFNhbXBsZShTYW1wbGVJbmZvICppbmZvKSB7Ci0gICAgaWYgKG1TYW1wbGVJbmRleCA+PSBtU2FtcGxlcy5zaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIG1Db21wbGV0ZSA/IEVSUk9SX0VORF9PRl9TVFJFQU0gOiAtRVdPVUxEQkxPQ0s7Ci0gICAgfQotCi0gICAgKmluZm8gPSBtU2FtcGxlcy5pdGVtQXQobVNhbXBsZUluZGV4KTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBGcmFnbWVudGVkTVA0UGFyc2VyOjpEeW5hbWljVHJhY2tGcmFnbWVudDo6YWR2YW5jZSgpIHsKLSAgICArK21TYW1wbGVJbmRleDsKLX0KLQotdm9pZCBGcmFnbWVudGVkTVA0UGFyc2VyOjpEeW5hbWljVHJhY2tGcmFnbWVudDo6YWRkU2FtcGxlKAotICAgICAgICBvZmY2NF90IGRhdGFPZmZzZXQsIHNpemVfdCBzYW1wbGVTaXplLAotICAgICAgICB1aW50MzJfdCBwcmVzZW50YXRpb25UaW1lLAotICAgICAgICBzaXplX3Qgc2FtcGxlRGVzY0luZGV4LAotICAgICAgICB1aW50MzJfdCBmbGFncykgewotICAgIG1TYW1wbGVzLnB1c2goKTsKLSAgICBTYW1wbGVJbmZvICpzYW1wbGVJbmZvID0gJm1TYW1wbGVzLmVkaXRJdGVtQXQobVNhbXBsZXMuc2l6ZSgpIC0gMSk7Ci0KLSAgICBzYW1wbGVJbmZvLT5tT2Zmc2V0ID0gZGF0YU9mZnNldDsKLSAgICBzYW1wbGVJbmZvLT5tU2l6ZSA9IHNhbXBsZVNpemU7Ci0gICAgc2FtcGxlSW5mby0+bVByZXNlbnRhdGlvblRpbWUgPSBwcmVzZW50YXRpb25UaW1lOwotICAgIHNhbXBsZUluZm8tPm1TYW1wbGVEZXNjSW5kZXggPSBzYW1wbGVEZXNjSW5kZXg7Ci0gICAgc2FtcGxlSW5mby0+bUZsYWdzID0gZmxhZ3M7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OkR5bmFtaWNUcmFja0ZyYWdtZW50OjpzaWduYWxDb21wbGV0aW9uKCkgewotICAgIG1Db21wbGV0ZSA9IHRydWU7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLWJvb2wgRnJhZ21lbnRlZE1QNFBhcnNlcjo6RHluYW1pY1RyYWNrRnJhZ21lbnQ6OmNvbXBsZXRlKCkgY29uc3QgewotICAgIHJldHVybiBtQ29tcGxldGU7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLUZyYWdtZW50ZWRNUDRQYXJzZXI6OlN0YXRpY1RyYWNrRnJhZ21lbnQ6OlN0YXRpY1RyYWNrRnJhZ21lbnQoKQotICAgIDogbVNhbXBsZUluZGV4KDApLAotICAgICAgbVNhbXBsZUNvdW50KDApLAotICAgICAgbUNodW5rSW5kZXgoMCksCi0gICAgICBtU2FtcGxlVG9DaHVua0luZGV4KC0xKSwKLSAgICAgIG1TYW1wbGVUb0NodW5rUmVtYWluaW5nKDApLAotICAgICAgbVByZXZDaHVua0luZGV4KDB4ZmZmZmZmZmYpLAotICAgICAgbU5leHRTYW1wbGVPZmZzZXQoMCkgewotfQotCi1GcmFnbWVudGVkTVA0UGFyc2VyOjpTdGF0aWNUcmFja0ZyYWdtZW50Ojp+U3RhdGljVHJhY2tGcmFnbWVudCgpIHsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6U3RhdGljVHJhY2tGcmFnbWVudDo6Z2V0U2FtcGxlKFNhbXBsZUluZm8gKmluZm8pIHsKLSAgICBpZiAobVNhbXBsZUluZGV4ID49IG1TYW1wbGVDb3VudCkgewotICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICB9Ci0KLSAgICAqaW5mbyA9IG1TYW1wbGVJbmZvOwotCi0gICAgQUxPR1YoInJldHVybmluZyBzYW1wbGUgJWQgYXQgWzB4JTA4bGx4LCAweCUwOGxseCkiLAotICAgICAgICAgIG1TYW1wbGVJbmRleCwKLSAgICAgICAgICBpbmZvLT5tT2Zmc2V0LCBpbmZvLT5tT2Zmc2V0ICsgaW5mby0+bVNpemUpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIEZyYWdtZW50ZWRNUDRQYXJzZXI6OlN0YXRpY1RyYWNrRnJhZ21lbnQ6OnVwZGF0ZVNhbXBsZUluZm8oKSB7Ci0gICAgaWYgKG1TYW1wbGVJbmRleCA+PSBtU2FtcGxlQ291bnQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChtU2FtcGxlU2l6ZXMgIT0gTlVMTCkgewotICAgICAgICB1aW50MzJfdCBkZWZhdWx0U2FtcGxlU2l6ZSA9IFUzMl9BVChtU2FtcGxlU2l6ZXMtPmRhdGEoKSArIDQpOwotICAgICAgICBpZiAoZGVmYXVsdFNhbXBsZVNpemUgPiAwKSB7Ci0gICAgICAgICAgICBtU2FtcGxlSW5mby5tU2l6ZSA9IGRlZmF1bHRTYW1wbGVTaXplOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVNhbXBsZUluZm8ubVNpemU9IFUzMl9BVChtU2FtcGxlU2l6ZXMtPmRhdGEoKSArIDEyICsgNCAqIG1TYW1wbGVJbmRleCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBDSEVDSyhtQ29tcGFjdFNhbXBsZVNpemVzICE9IE5VTEwpOwotCi0gICAgICAgIHVpbnQzMl90IGZpZWxkU2l6ZSA9IFUzMl9BVChtQ29tcGFjdFNhbXBsZVNpemVzLT5kYXRhKCkgKyA0KTsKLQotICAgICAgICBzd2l0Y2ggKGZpZWxkU2l6ZSkgewotICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGJ5dGUgPSBtQ29tcGFjdFNhbXBsZVNpemVzLT5kYXRhKClbMTIgKyBtU2FtcGxlSW5kZXggLyAyXTsKLSAgICAgICAgICAgICAgICBtU2FtcGxlSW5mby5tU2l6ZSA9IChtU2FtcGxlSW5kZXggJiAxKSA/IGJ5dGUgJiAweDBmIDogYnl0ZSA+PiA0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbVNhbXBsZUluZm8ubVNpemUgPSBtQ29tcGFjdFNhbXBsZVNpemVzLT5kYXRhKClbMTIgKyBtU2FtcGxlSW5kZXhdOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENIRUNLX0VRKGZpZWxkU2l6ZSwgMTYpOwotICAgICAgICAgICAgICAgIG1TYW1wbGVJbmZvLm1TaXplID0KLSAgICAgICAgICAgICAgICAgICAgVTE2X0FUKG1Db21wYWN0U2FtcGxlU2l6ZXMtPmRhdGEoKSArIDEyICsgbVNhbXBsZUluZGV4ICogMik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBDSEVDS19HVChtU2FtcGxlVG9DaHVua1JlbWFpbmluZywgMCk7Ci0KLSAgICAvLyBUaGUgc2FtcGxlIGRlc2MgaW5kZXggaXMgMS1iYXNlZC4uLiBYWFgKLSAgICBtU2FtcGxlSW5mby5tU2FtcGxlRGVzY0luZGV4ID0KLSAgICAgICAgVTMyX0FUKG1TYW1wbGVUb0NodW5rLT5kYXRhKCkgKyA4ICsgMTIgKiBtU2FtcGxlVG9DaHVua0luZGV4ICsgOCk7Ci0KLSAgICBpZiAobUNodW5rSW5kZXggIT0gbVByZXZDaHVua0luZGV4KSB7Ci0gICAgICAgIG1QcmV2Q2h1bmtJbmRleCA9IG1DaHVua0luZGV4OwotCi0gICAgICAgIGlmIChtQ2h1bmtPZmZzZXRzICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHVpbnQzMl90IGVudHJ5Q291bnQgPSBVMzJfQVQobUNodW5rT2Zmc2V0cy0+ZGF0YSgpICsgNCk7Ci0KLSAgICAgICAgICAgIGlmIChtQ2h1bmtJbmRleCA+PSBlbnRyeUNvdW50KSB7Ci0gICAgICAgICAgICAgICAgbVNhbXBsZUluZGV4ID0gbVNhbXBsZUNvdW50OwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbU5leHRTYW1wbGVPZmZzZXQgPQotICAgICAgICAgICAgICAgIFUzMl9BVChtQ2h1bmtPZmZzZXRzLT5kYXRhKCkgKyA4ICsgNCAqIG1DaHVua0luZGV4KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIENIRUNLKG1DaHVua09mZnNldHM2NCAhPSBOVUxMKTsKLQotICAgICAgICAgICAgdWludDMyX3QgZW50cnlDb3VudCA9IFUzMl9BVChtQ2h1bmtPZmZzZXRzNjQtPmRhdGEoKSArIDQpOwotCi0gICAgICAgICAgICBpZiAobUNodW5rSW5kZXggPj0gZW50cnlDb3VudCkgewotICAgICAgICAgICAgICAgIG1TYW1wbGVJbmRleCA9IG1TYW1wbGVDb3VudDsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1OZXh0U2FtcGxlT2Zmc2V0ID0KLSAgICAgICAgICAgICAgICBVNjRfQVQobUNodW5rT2Zmc2V0czY0LT5kYXRhKCkgKyA4ICsgOCAqIG1DaHVua0luZGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG1TYW1wbGVJbmZvLm1PZmZzZXQgPSBtTmV4dFNhbXBsZU9mZnNldDsKLQotICAgIG1TYW1wbGVJbmZvLm1QcmVzZW50YXRpb25UaW1lID0gMDsKLSAgICBtU2FtcGxlSW5mby5tRmxhZ3MgPSAwOwotfQotCi12b2lkIEZyYWdtZW50ZWRNUDRQYXJzZXI6OlN0YXRpY1RyYWNrRnJhZ21lbnQ6OmFkdmFuY2UoKSB7Ci0gICAgbU5leHRTYW1wbGVPZmZzZXQgKz0gbVNhbXBsZUluZm8ubVNpemU7Ci0KLSAgICArK21TYW1wbGVJbmRleDsKLSAgICBpZiAoLS1tU2FtcGxlVG9DaHVua1JlbWFpbmluZyA9PSAwKSB7Ci0gICAgICAgICsrbUNodW5rSW5kZXg7Ci0KLSAgICAgICAgdWludDMyX3QgZW50cnlDb3VudCA9IFUzMl9BVChtU2FtcGxlVG9DaHVuay0+ZGF0YSgpICsgNCk7Ci0KLSAgICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgbGFzdCBlbnRyeSBpbiB0aGUgc2FtcGxlIHRvIGNodW5rIHRhYmxlLCB3ZSB3aWxsCi0gICAgICAgIC8vIHN0YXkgb24gdGhpcyBlbnRyeS4KLSAgICAgICAgaWYgKCh1aW50MzJfdCkobVNhbXBsZVRvQ2h1bmtJbmRleCArIDEpIDwgZW50cnlDb3VudCkgewotICAgICAgICAgICAgdWludDMyX3QgbmV4dENodW5rSW5kZXggPQotICAgICAgICAgICAgICAgIFUzMl9BVChtU2FtcGxlVG9DaHVuay0+ZGF0YSgpICsgOCArIDEyICogKG1TYW1wbGVUb0NodW5rSW5kZXggKyAxKSk7Ci0KLSAgICAgICAgICAgIENIRUNLX0dFKG5leHRDaHVua0luZGV4LCAxdSk7Ci0gICAgICAgICAgICAtLW5leHRDaHVua0luZGV4OwotCi0gICAgICAgICAgICBpZiAobUNodW5rSW5kZXggPj0gbmV4dENodW5rSW5kZXgpIHsKLSAgICAgICAgICAgICAgICBDSEVDS19FUShtQ2h1bmtJbmRleCwgbmV4dENodW5rSW5kZXgpOwotICAgICAgICAgICAgICAgICsrbVNhbXBsZVRvQ2h1bmtJbmRleDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1TYW1wbGVUb0NodW5rUmVtYWluaW5nID0KLSAgICAgICAgICAgIFUzMl9BVChtU2FtcGxlVG9DaHVuay0+ZGF0YSgpICsgOCArIDEyICogbVNhbXBsZVRvQ2h1bmtJbmRleCArIDQpOwotICAgIH0KLQotICAgIHVwZGF0ZVNhbXBsZUluZm8oKTsKLX0KLQotc3RhdGljIHZvaWQgc2V0VTMyQXQodWludDhfdCAqcHRyLCB1aW50MzJfdCB4KSB7Ci0gICAgcHRyWzBdID0geCA+PiAyNDsKLSAgICBwdHJbMV0gPSAoeCA+PiAxNikgJiAweGZmOwotICAgIHB0clsyXSA9ICh4ID4+IDgpICYgMHhmZjsKLSAgICBwdHJbM10gPSB4ICYgMHhmZjsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6U3RhdGljVHJhY2tGcmFnbWVudDo6c2lnbmFsQ29tcGxldGlvbigpIHsKLSAgICBtU2FtcGxlVG9DaHVua0luZGV4ID0gMDsKLQotICAgIG1TYW1wbGVUb0NodW5rUmVtYWluaW5nID0KLSAgICAgICAgKG1TYW1wbGVUb0NodW5rID09IE5VTEwpCi0gICAgICAgICAgICA/IDAKLSAgICAgICAgICAgIDogVTMyX0FUKG1TYW1wbGVUb0NodW5rLT5kYXRhKCkgKyA4ICsgMTIgKiBtU2FtcGxlVG9DaHVua0luZGV4ICsgNCk7Ci0KLSAgICB1cGRhdGVTYW1wbGVJbmZvKCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLWJvb2wgRnJhZ21lbnRlZE1QNFBhcnNlcjo6U3RhdGljVHJhY2tGcmFnbWVudDo6Y29tcGxldGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OlN0YXRpY1RyYWNrRnJhZ21lbnQ6OnBhcnNlU2FtcGxlU2l6ZXMoCi0gICAgICAgIEZyYWdtZW50ZWRNUDRQYXJzZXIgKnBhcnNlciwgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIGlmIChvZmZzZXQgKyAxMiA+IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBpZiAocGFyc2VyLT5yZWFkVTMyKG9mZnNldCkgIT0gMCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHVpbnQzMl90IHNhbXBsZVNpemUgPSBwYXJzZXItPnJlYWRVMzIob2Zmc2V0ICsgNCk7Ci0gICAgdWludDMyX3Qgc2FtcGxlQ291bnQgPSBwYXJzZXItPnJlYWRVMzIob2Zmc2V0ICsgOCk7Ci0KLSAgICBpZiAoc2FtcGxlU2l6ZSA9PSAwICYmIG9mZnNldCArIDEyICsgc2FtcGxlQ291bnQgKiA0ICE9IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBwYXJzZXItPmNvcHlCdWZmZXIoJm1TYW1wbGVTaXplcywgb2Zmc2V0LCBzaXplKTsKLQotICAgIG1TYW1wbGVDb3VudCA9IHNhbXBsZUNvdW50OwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpTdGF0aWNUcmFja0ZyYWdtZW50OjpwYXJzZUNvbXBhY3RTYW1wbGVTaXplcygKLSAgICAgICAgRnJhZ21lbnRlZE1QNFBhcnNlciAqcGFyc2VyLCB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgaWYgKG9mZnNldCArIDEyID4gc2l6ZSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGlmIChwYXJzZXItPnJlYWRVMzIob2Zmc2V0KSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgdWludDMyX3QgZmllbGRTaXplID0gcGFyc2VyLT5yZWFkVTMyKG9mZnNldCArIDQpOwotCi0gICAgaWYgKGZpZWxkU2l6ZSAhPSA0ICYmIGZpZWxkU2l6ZSAhPSA4ICYmIGZpZWxkU2l6ZSAhPSAxNikgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHVpbnQzMl90IHNhbXBsZUNvdW50ID0gcGFyc2VyLT5yZWFkVTMyKG9mZnNldCArIDgpOwotCi0gICAgaWYgKG9mZnNldCArIDEyICsgKHNhbXBsZUNvdW50ICogZmllbGRTaXplICsgNCkgLyA4ICE9IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBwYXJzZXItPmNvcHlCdWZmZXIoJm1Db21wYWN0U2FtcGxlU2l6ZXMsIG9mZnNldCwgc2l6ZSk7Ci0KLSAgICBtU2FtcGxlQ291bnQgPSBzYW1wbGVDb3VudDsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6U3RhdGljVHJhY2tGcmFnbWVudDo6cGFyc2VTYW1wbGVUb0NodW5rKAotICAgICAgICBGcmFnbWVudGVkTVA0UGFyc2VyICpwYXJzZXIsIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICBpZiAob2Zmc2V0ICsgOCA+IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBpZiAocGFyc2VyLT5yZWFkVTMyKG9mZnNldCkgIT0gMCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHVpbnQzMl90IGVudHJ5Q291bnQgPSBwYXJzZXItPnJlYWRVMzIob2Zmc2V0ICsgNCk7Ci0KLSAgICBpZiAoZW50cnlDb3VudCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBpZiAob2Zmc2V0ICsgOCArIGVudHJ5Q291bnQgKiAxMiAhPSBzaXplKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgcGFyc2VyLT5jb3B5QnVmZmVyKCZtU2FtcGxlVG9DaHVuaywgb2Zmc2V0LCBzaXplKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6U3RhdGljVHJhY2tGcmFnbWVudDo6cGFyc2VDaHVua09mZnNldHMoCi0gICAgICAgIEZyYWdtZW50ZWRNUDRQYXJzZXIgKnBhcnNlciwgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIGlmIChvZmZzZXQgKyA4ID4gc2l6ZSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGlmIChwYXJzZXItPnJlYWRVMzIob2Zmc2V0KSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgdWludDMyX3QgZW50cnlDb3VudCA9IHBhcnNlci0+cmVhZFUzMihvZmZzZXQgKyA0KTsKLQotICAgIGlmIChvZmZzZXQgKyA4ICsgZW50cnlDb3VudCAqIDQgIT0gc2l6ZSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHBhcnNlci0+Y29weUJ1ZmZlcigmbUNodW5rT2Zmc2V0cywgb2Zmc2V0LCBzaXplKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6U3RhdGljVHJhY2tGcmFnbWVudDo6cGFyc2VDaHVua09mZnNldHM2NCgKLSAgICAgICAgRnJhZ21lbnRlZE1QNFBhcnNlciAqcGFyc2VyLCB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgaWYgKG9mZnNldCArIDggPiBzaXplKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgaWYgKHBhcnNlci0+cmVhZFUzMihvZmZzZXQpICE9IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBlbnRyeUNvdW50ID0gcGFyc2VyLT5yZWFkVTMyKG9mZnNldCArIDQpOwotCi0gICAgaWYgKG9mZnNldCArIDggKyBlbnRyeUNvdW50ICogOCAhPSBzaXplKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgcGFyc2VyLT5jb3B5QnVmZmVyKCZtQ2h1bmtPZmZzZXRzNjQsIG9mZnNldCwgc2l6ZSk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wNC9UcmFja0ZyYWdtZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcDQvVHJhY2tGcmFnbWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWFkNDZlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wNC9UcmFja0ZyYWdtZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVFJBQ0tfRlJBR01FTlRfSF8KLQotI2RlZmluZSBUUkFDS19GUkFHTUVOVF9IXwotCi0jaW5jbHVkZSAiaW5jbHVkZS9GcmFnbWVudGVkTVA0UGFyc2VyLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IEZyYWdtZW50ZWRNUDRQYXJzZXI6OlRyYWNrRnJhZ21lbnQgOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgVHJhY2tGcmFnbWVudCgpIHt9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNhbXBsZShTYW1wbGVJbmZvICppbmZvKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIGFkdmFuY2UoKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNpZ25hbENvbXBsZXRpb24oKSA9IDA7Ci0gICAgdmlydHVhbCBib29sIGNvbXBsZXRlKCkgY29uc3QgPSAwOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+VHJhY2tGcmFnbWVudCgpIHt9Ci0KLXByaXZhdGU6Ci0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVHJhY2tGcmFnbWVudCk7Ci19OwotCi1zdHJ1Y3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6RHluYW1pY1RyYWNrRnJhZ21lbnQgOiBwdWJsaWMgRnJhZ21lbnRlZE1QNFBhcnNlcjo6VHJhY2tGcmFnbWVudCB7Ci0gICAgRHluYW1pY1RyYWNrRnJhZ21lbnQoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2FtcGxlKFNhbXBsZUluZm8gKmluZm8pOwotICAgIHZpcnR1YWwgdm9pZCBhZHZhbmNlKCk7Ci0KLSAgICB2b2lkIGFkZFNhbXBsZSgKLSAgICAgICAgICAgIG9mZjY0X3QgZGF0YU9mZnNldCwgc2l6ZV90IHNhbXBsZVNpemUsCi0gICAgICAgICAgICB1aW50MzJfdCBwcmVzZW50YXRpb25UaW1lLAotICAgICAgICAgICAgc2l6ZV90IHNhbXBsZURlc2NJbmRleCwKLSAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKTsKLQotICAgIC8vIE5vIG1vcmUgc2FtcGxlcyB3aWxsIGJlIGFkZGVkIHRvIHRoaXMgZnJhZ21lbnQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzaWduYWxDb21wbGV0aW9uKCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgY29tcGxldGUoKSBjb25zdDsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkR5bmFtaWNUcmFja0ZyYWdtZW50KCk7Ci0KLXByaXZhdGU6Ci0gICAgYm9vbCBtQ29tcGxldGU7Ci0gICAgc2l6ZV90IG1TYW1wbGVJbmRleDsKLSAgICBWZWN0b3I8U2FtcGxlSW5mbz4gbVNhbXBsZXM7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEeW5hbWljVHJhY2tGcmFnbWVudCk7Ci19OwotCi1zdHJ1Y3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6U3RhdGljVHJhY2tGcmFnbWVudCA6IHB1YmxpYyBGcmFnbWVudGVkTVA0UGFyc2VyOjpUcmFja0ZyYWdtZW50IHsKLSAgICBTdGF0aWNUcmFja0ZyYWdtZW50KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNhbXBsZShTYW1wbGVJbmZvICppbmZvKTsKLSAgICB2aXJ0dWFsIHZvaWQgYWR2YW5jZSgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzaWduYWxDb21wbGV0aW9uKCk7Ci0gICAgdmlydHVhbCBib29sIGNvbXBsZXRlKCkgY29uc3Q7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZVNhbXBsZVNpemVzKAotICAgICAgICAgICAgRnJhZ21lbnRlZE1QNFBhcnNlciAqcGFyc2VyLCB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlQ29tcGFjdFNhbXBsZVNpemVzKAotICAgICAgICAgICAgRnJhZ21lbnRlZE1QNFBhcnNlciAqcGFyc2VyLCB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlU2FtcGxlVG9DaHVuaygKLSAgICAgICAgICAgIEZyYWdtZW50ZWRNUDRQYXJzZXIgKnBhcnNlciwgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZUNodW5rT2Zmc2V0cygKLSAgICAgICAgICAgIEZyYWdtZW50ZWRNUDRQYXJzZXIgKnBhcnNlciwgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZUNodW5rT2Zmc2V0czY0KAotICAgICAgICAgICAgRnJhZ21lbnRlZE1QNFBhcnNlciAqcGFyc2VyLCB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgflN0YXRpY1RyYWNrRnJhZ21lbnQoKTsKLQotcHJpdmF0ZToKLSAgICBzaXplX3QgbVNhbXBsZUluZGV4OwotICAgIHNpemVfdCBtU2FtcGxlQ291bnQ7Ci0gICAgdWludDMyX3QgbUNodW5rSW5kZXg7Ci0KLSAgICBTYW1wbGVJbmZvIG1TYW1wbGVJbmZvOwotCi0gICAgc3A8QUJ1ZmZlcj4gbVNhbXBsZVNpemVzOwotICAgIHNwPEFCdWZmZXI+IG1Db21wYWN0U2FtcGxlU2l6ZXM7Ci0KLSAgICBzcDxBQnVmZmVyPiBtU2FtcGxlVG9DaHVuazsKLSAgICBzc2l6ZV90IG1TYW1wbGVUb0NodW5rSW5kZXg7Ci0gICAgc2l6ZV90IG1TYW1wbGVUb0NodW5rUmVtYWluaW5nOwotCi0gICAgc3A8QUJ1ZmZlcj4gbUNodW5rT2Zmc2V0czsKLSAgICBzcDxBQnVmZmVyPiBtQ2h1bmtPZmZzZXRzNjQ7Ci0gICAgdWludDMyX3QgbVByZXZDaHVua0luZGV4OwotICAgIHVpbnQ2NF90IG1OZXh0U2FtcGxlT2Zmc2V0OwotCi0gICAgdm9pZCB1cGRhdGVTYW1wbGVJbmZvKCk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTdGF0aWNUcmFja0ZyYWdtZW50KTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gVFJBQ0tfRlJBR01FTlRfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcAppbmRleCBjYjU3YTJmLi42ZDg4NjZhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwCkBAIC0zNiw2ICszNiw4IEBACiAjaW5jbHVkZSA8bWVkaWEvSVN0cmVhbVNvdXJjZS5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vIEkgd2FudCB0aGUgZXhwcmVzc2lvbiAieSIgZXZhbHVhdGVkIGV2ZW4gaWYgdmVyYm9zZSBsb2dnaW5nIGlzIG9mZi4KQEAgLTUwMSwxMSArNTAzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpNUEVHNF9WSURFTyk7CiAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIFNUUkVBTVRZUEVfUENNX0FVRElPOgotICAgICAgICAgICAgbVF1ZXVlID0gbmV3IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZSgKLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpQQ01fQVVESU8pOwotICAgICAgICAgICAgYnJlYWs7Ci0KKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX0xQQ01fQUMzOgogICAgICAgICBjYXNlIFNUUkVBTVRZUEVfQUMzOgogICAgICAgICAgICAgbVF1ZXVlID0gbmV3IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZSgKICAgICAgICAgICAgICAgICAgICAgRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpBQzMpOwpAQCAtNTUzLDcgKzU1MSw5IEBACiAgICAgICAgIH0KICNlbmRpZgogCi0gICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgaWYgKCFwYXlsb2FkX3VuaXRfc3RhcnRfaW5kaWNhdG9yKSB7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KICAgICB9CiAKICAgICBtRXhwZWN0ZWRDb250aW51aXR5Q291bnRlciA9IChjb250aW51aXR5X2NvdW50ZXIgKyAxKSAmIDB4MGY7CkBAIC01ODYsNyArNTg2LDcgQEAKICAgICAgICAgLy8gSW5jcmVtZW50IGluIG11bHRpcGxlcyBvZiA2NEsuCiAgICAgICAgIG5lZWRlZFNpemUgPSAobmVlZGVkU2l6ZSArIDY1NTM1KSAmIH42NTUzNTsKIAotICAgICAgICBBTE9HSSgicmVzaXppbmcgYnVmZmVyIHRvICVkIGJ5dGVzIiwgbmVlZGVkU2l6ZSk7CisgICAgICAgIEFMT0dJKCJyZXNpemluZyBidWZmZXIgdG8gJXp1IGJ5dGVzIiwgbmVlZGVkU2l6ZSk7CiAKICAgICAgICAgc3A8QUJ1ZmZlcj4gbmV3QnVmZmVyID0gbmV3IEFCdWZmZXIobmVlZGVkU2l6ZSk7CiAgICAgICAgIG1lbWNweShuZXdCdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCkpOwpAQCAtNjE4LDcgKzYxOCw3IEBACiAgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9NUEVHMV9BVURJTzoKICAgICAgICAgY2FzZSBTVFJFQU1UWVBFX01QRUcyX0FVRElPOgogICAgICAgICBjYXNlIFNUUkVBTVRZUEVfTVBFRzJfQVVESU9fQURUUzoKLSAgICAgICAgY2FzZSBTVFJFQU1UWVBFX1BDTV9BVURJTzoKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX0xQQ01fQUMzOgogICAgICAgICBjYXNlIFNUUkVBTVRZUEVfQUMzOgogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAKQEAgLTY2NSw3ICs2NjUsNyBAQAogICAgIH0KIAogICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgbVNvdXJjZS0+cXVldWVEaXNjb250aW51aXR5KHR5cGUsIGV4dHJhKTsKKyAgICAgICAgbVNvdXJjZS0+cXVldWVEaXNjb250aW51aXR5KHR5cGUsIGV4dHJhLCB0cnVlKTsKICAgICB9CiB9CiAKQEAgLTc0OCw3ICs3NDgsNyBAQAogICAgICAgICAgICAgUFRTIHw9IGJyLT5nZXRCaXRzKDE1KTsKICAgICAgICAgICAgIENIRUNLX0VRKGJyLT5nZXRCaXRzKDEpLCAxdSk7CiAKLSAgICAgICAgICAgIEFMT0dWKCJQVFMgPSAweCUwMTZsbHggKCUuMmYpIiwgUFRTLCBQVFMgLyA5MDAwMC4wKTsKKyAgICAgICAgICAgIEFMT0dWKCJQVFMgPSAweCUwMTYiIFBSSXg2NCAiICglLjJmKSIsIFBUUywgUFRTIC8gOTAwMDAuMCk7CiAKICAgICAgICAgICAgIG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZyAtPSA1OwogCkBAIC03NjQsNyArNzY0LDcgQEAKICAgICAgICAgICAgICAgICBEVFMgfD0gYnItPmdldEJpdHMoMTUpOwogICAgICAgICAgICAgICAgIENIRUNLX0VRKGJyLT5nZXRCaXRzKDEpLCAxdSk7CiAKLSAgICAgICAgICAgICAgICBBTE9HVigiRFRTID0gJWxsdSIsIERUUyk7CisgICAgICAgICAgICAgICAgQUxPR1YoIkRUUyA9ICUiIFBSSXU2NCwgRFRTKTsKIAogICAgICAgICAgICAgICAgIG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZyAtPSA1OwogICAgICAgICAgICAgfQpAQCAtNzgyLDcgKzc4Miw3IEBACiAgICAgICAgICAgICBFU0NSIHw9IGJyLT5nZXRCaXRzKDE1KTsKICAgICAgICAgICAgIENIRUNLX0VRKGJyLT5nZXRCaXRzKDEpLCAxdSk7CiAKLSAgICAgICAgICAgIEFMT0dWKCJFU0NSID0gJWxsdSIsIEVTQ1IpOworICAgICAgICAgICAgQUxPR1YoIkVTQ1IgPSAlIiBQUkl1NjQsIEVTQ1IpOwogICAgICAgICAgICAgTVlfTE9HVigiRVNDUl9leHRlbnNpb24gPSAldSIsIGJyLT5nZXRCaXRzKDkpKTsKIAogICAgICAgICAgICAgQ0hFQ0tfRVEoYnItPmdldEJpdHMoMSksIDF1KTsKQEAgLTgxMiw3ICs4MTIsNyBAQAogCiAgICAgICAgICAgICBpZiAoYnItPm51bUJpdHNMZWZ0KCkgPCBkYXRhTGVuZ3RoICogOCkgewogICAgICAgICAgICAgICAgIEFMT0dFKCJQRVMgcGFja2V0IGRvZXMgbm90IGNhcnJ5IGVub3VnaCBkYXRhIHRvIGNvbnRhaW4gIgotICAgICAgICAgICAgICAgICAgICAgInBheWxvYWQuIChudW1CaXRzTGVmdCA9ICVkLCByZXF1aXJlZCA9ICVkKSIsCisgICAgICAgICAgICAgICAgICAgICAicGF5bG9hZC4gKG51bUJpdHNMZWZ0ID0gJXp1LCByZXF1aXJlZCA9ICV1KSIsCiAgICAgICAgICAgICAgICAgICAgICBici0+bnVtQml0c0xlZnQoKSwgZGF0YUxlbmd0aCAqIDgpOwogCiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKQEAgLTgzMiw3ICs4MzIsNyBAQAogICAgICAgICAgICAgc2l6ZV90IHBheWxvYWRTaXplQml0cyA9IGJyLT5udW1CaXRzTGVmdCgpOwogICAgICAgICAgICAgQ0hFQ0tfRVEocGF5bG9hZFNpemVCaXRzICUgOCwgMHUpOwogCi0gICAgICAgICAgICBBTE9HVigiVGhlcmUncyAlZCBieXRlcyBvZiBwYXlsb2FkLiIsIHBheWxvYWRTaXplQml0cyAvIDgpOworICAgICAgICAgICAgQUxPR1YoIlRoZXJlJ3MgJXp1IGJ5dGVzIG9mIHBheWxvYWQuIiwgcGF5bG9hZFNpemVCaXRzIC8gOCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKHN0cmVhbV9pZCA9PSAweGJlKSB7ICAvLyBwYWRkaW5nX3N0cmVhbQogICAgICAgICBDSEVDS19ORShQRVNfcGFja2V0X2xlbmd0aCwgMHUpOwpAQCAtODUwLDcgKzg1MCw3IEBACiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKLSAgICBBTE9HVigiZmx1c2hpbmcgc3RyZWFtIDB4JTA0eCBzaXplID0gJWQiLCBtRWxlbWVudGFyeVBJRCwgbUJ1ZmZlci0+c2l6ZSgpKTsKKyAgICBBTE9HVigiZmx1c2hpbmcgc3RyZWFtIDB4JTA0eCBzaXplID0gJXp1IiwgbUVsZW1lbnRhcnlQSUQsIG1CdWZmZXItPnNpemUoKSk7CiAKICAgICBBQml0UmVhZGVyIGJyKG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpKTsKIApAQCAtODYyLDcgKzg2Miw3IEBACiB9CiAKIHZvaWQgQVRTUGFyc2VyOjpTdHJlYW06Om9uUGF5bG9hZERhdGEoCi0gICAgICAgIHVuc2lnbmVkIFBUU19EVFNfZmxhZ3MsIHVpbnQ2NF90IFBUUywgdWludDY0X3QgRFRTLAorICAgICAgICB1bnNpZ25lZCBQVFNfRFRTX2ZsYWdzLCB1aW50NjRfdCBQVFMsIHVpbnQ2NF90IC8qIERUUyAqLywKICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKICNpZiAwCiAgICAgQUxPR0koInBheWxvYWQgc3RyZWFtVHlwZSAweCUwMngsIFBUUyA9IDB4JTAxNmxseCwgZFBUUyA9ICVsbGQiLApAQCAtODk0LDYgKzg5NCwxMiBAQAogICAgICAgICAgICAgICAgIEFMT0dWKCJTdHJlYW0gUElEIDB4JTA4eCBvZiB0eXBlIDB4JTAyeCBub3cgaGFzIGRhdGEuIiwKICAgICAgICAgICAgICAgICAgICAgIG1FbGVtZW50YXJ5UElELCBtU3RyZWFtVHlwZSk7CiAKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lOworICAgICAgICAgICAgICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgIUlzSURSKGFjY2Vzc1VuaXQpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtU291cmNlID0gbmV3IEFub3RoZXJQYWNrZXRTb3VyY2UobWV0YSk7CiAgICAgICAgICAgICAgICAgbVNvdXJjZS0+cXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOwogICAgICAgICAgICAgfQpAQCAtMTE3Miw3ICsxMTc4LDcgQEAKIAogICAgICAgICAgICAgdWludDY0X3QgUENSID0gUENSX2Jhc2UgKiAzMDAgKyBQQ1JfZXh0OwogCi0gICAgICAgICAgICBBTE9HVigiUElEIDB4JTA0eDogUENSID0gMHglMDE2bGx4ICglLjJmKSIsCisgICAgICAgICAgICBBTE9HVigiUElEIDB4JTA0eDogUENSID0gMHglMDE2IiBQUkl4NjQgIiAoJS4yZikiLAogICAgICAgICAgICAgICAgICAgUElELCBQQ1IsIFBDUiAvIDI3RTYpOwogCiAgICAgICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkIGJ5IHRoaXMgcGFyc2VyIHVwIHRvIGFuZApAQCAtMTI2Nyw4ICsxMjczLDggQEAKIH0KIAogdm9pZCBBVFNQYXJzZXI6OnVwZGF0ZVBDUigKLSAgICAgICAgdW5zaWduZWQgUElELCB1aW50NjRfdCBQQ1IsIHNpemVfdCBieXRlT2Zmc2V0RnJvbVN0YXJ0KSB7Ci0gICAgQUxPR1YoIlBDUiAweCUwMTZsbHggQCAlZCIsIFBDUiwgYnl0ZU9mZnNldEZyb21TdGFydCk7CisgICAgICAgIHVuc2lnbmVkIC8qIFBJRCAqLywgdWludDY0X3QgUENSLCBzaXplX3QgYnl0ZU9mZnNldEZyb21TdGFydCkgeworICAgIEFMT0dWKCJQQ1IgMHglMDE2IiBQUkl4NjQgIiBAICV6dSIsIFBDUiwgYnl0ZU9mZnNldEZyb21TdGFydCk7CiAKICAgICBpZiAobU51bVBDUnMgPT0gMikgewogICAgICAgICBtUENSWzBdID0gbVBDUlsxXTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oCmluZGV4IDg2YjAyNWYuLjg5ODZhMjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaApAQCAtOTMsNyArOTMsOSBAQAogICAgICAgICAvLyBGcm9tIEFUU0MgQS81MyBQYXJ0IDM6MjAwOSwgNi43LjEKICAgICAgICAgU1RSRUFNVFlQRV9BQzMgICAgICAgICAgICAgICAgICA9IDB4ODEsCiAKLSAgICAgICAgU1RSRUFNVFlQRV9QQ01fQVVESU8gICAgICAgICAgICA9IDB4ODMsCisgICAgICAgIC8vIFN0cmVhbSB0eXBlIDB4ODMgaXMgbm9uLXN0YW5kYXJkLAorICAgICAgICAvLyBpdCBjb3VsZCBiZSBMUENNIG9yIFRydWVIRCBBQzMKKyAgICAgICAgU1RSRUFNVFlQRV9MUENNX0FDMyAgICAgICAgICAgICA9IDB4ODMsCiAgICAgfTsKIAogcHJvdGVjdGVkOgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLm1rCmluZGV4IGMxYTdhOWQuLmMxN2EwYjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQubWsKQEAgLTEzLDYgKzEzLDggQEAKIAkkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCiAJJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBMT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF9tcGVnMnRzCiAKIGlmZXEgKCQoVEFSR0VUX0FSQ0gpLGFybSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuY3BwCmluZGV4IDJiMGJmMzAuLmEwM2Y2ZjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmNwcApAQCAtMTQsNiArMTQsOSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJBbm90aGVyUGFja2V0U291cmNlIgorCiAjaW5jbHVkZSAiQW5vdGhlclBhY2tldFNvdXJjZS5oIgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CkBAIC0yNiwxNiArMjksMjEgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjb25zdCBpbnQ2NF90IGtOZWFyRU9TTWFya1VzID0gMjAwMDAwMGxsOyAvLyAyIHNlY3MKIAogQW5vdGhlclBhY2tldFNvdXJjZTo6QW5vdGhlclBhY2tldFNvdXJjZShjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEpCiAgICAgOiBtSXNBdWRpbyhmYWxzZSksCisgICAgICBtSXNWaWRlbyhmYWxzZSksCiAgICAgICBtRm9ybWF0KE5VTEwpLAogICAgICAgbUxhc3RRdWV1ZWRUaW1lVXMoMCksCiAgICAgICBtRU9TUmVzdWx0KE9LKSwKLSAgICAgIG1MYXRlc3RFbnF1ZXVlZE1ldGEoTlVMTCkgeworICAgICAgbUxhdGVzdEVucXVldWVkTWV0YShOVUxMKSwKKyAgICAgIG1MYXRlc3REZXF1ZXVlZE1ldGEoTlVMTCksCisgICAgICBtUXVldWVkRGlzY29udGludWl0eUNvdW50KDApIHsKICAgICBzZXRGb3JtYXQobWV0YSk7CiB9CiAKQEAgLTQzLDYgKzUxLDcgQEAKICAgICBDSEVDSyhtRm9ybWF0ID09IE5VTEwpOwogCiAgICAgbUlzQXVkaW8gPSBmYWxzZTsKKyAgICBtSXNWaWRlbyA9IGZhbHNlOwogCiAgICAgaWYgKG1ldGEgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CkBAIC01NCwxNSArNjMsMTcgQEAKIAogICAgIGlmICghc3RybmNhc2VjbXAoImF1ZGlvLyIsIG1pbWUsIDYpKSB7CiAgICAgICAgIG1Jc0F1ZGlvID0gdHJ1ZTsKKyAgICB9IGVsc2UgIGlmICghc3RybmNhc2VjbXAoInZpZGVvLyIsIG1pbWUsIDYpKSB7CisgICAgICAgIG1Jc1ZpZGVvID0gdHJ1ZTsKICAgICB9IGVsc2UgewotICAgICAgICBDSEVDSyghc3RybmNhc2VjbXAoInZpZGVvLyIsIG1pbWUsIDYpKTsKKyAgICAgICAgQ0hFQ0soIXN0cm5jYXNlY21wKCJ0ZXh0LyIsIG1pbWUsIDUpKTsKICAgICB9CiB9CiAKIEFub3RoZXJQYWNrZXRTb3VyY2U6On5Bbm90aGVyUGFja2V0U291cmNlKCkgewogfQogCi1zdGF0dXNfdCBBbm90aGVyUGFja2V0U291cmNlOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7CitzdGF0dXNfdCBBbm90aGVyUGFja2V0U291cmNlOjpzdGFydChNZXRhRGF0YSAqIC8qIHBhcmFtcyAqLykgewogICAgIHJldHVybiBPSzsKIH0KIApAQCAtODYsNyArOTcsNyBAQAogCiAgICAgICAgIHNwPFJlZkJhc2U+IG9iamVjdDsKICAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kT2JqZWN0KCJmb3JtYXQiLCAmb2JqZWN0KSkgewotICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PE1ldGFEYXRhKj4ob2JqZWN0LmdldCgpKTsKKyAgICAgICAgICAgIHJldHVybiBtRm9ybWF0ID0gc3RhdGljX2Nhc3Q8TWV0YURhdGEqPihvYmplY3QuZ2V0KCkpOwogICAgICAgICB9CiAKICAgICAgICAgKytpdDsKQEAgLTExMiw5ICsxMjMsMTIgQEAKICAgICAgICAgICAgICAgICBtRm9ybWF0LmNsZWFyKCk7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIC0tbVF1ZXVlZERpc2NvbnRpbnVpdHlDb3VudDsKICAgICAgICAgICAgIHJldHVybiBJTkZPX0RJU0NPTlRJTlVJVFk7CiAgICAgICAgIH0KIAorICAgICAgICBtTGF0ZXN0RGVxdWV1ZWRNZXRhID0gKCpidWZmZXIpLT5tZXRhKCktPmR1cCgpOworCiAgICAgICAgIHNwPFJlZkJhc2U+IG9iamVjdDsKICAgICAgICAgaWYgKCgqYnVmZmVyKS0+bWV0YSgpLT5maW5kT2JqZWN0KCJmb3JtYXQiLCAmb2JqZWN0KSkgewogICAgICAgICAgICAgbUZvcm1hdCA9IHN0YXRpY19jYXN0PE1ldGFEYXRhKj4ob2JqZWN0LmdldCgpKTsKQEAgLTEzNiw4ICsxNTAsMTAgQEAKICAgICB9CiAKICAgICBpZiAoIW1CdWZmZXJzLmVtcHR5KCkpIHsKKwogICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiBidWZmZXIgPSAqbUJ1ZmZlcnMuYmVnaW4oKTsKICAgICAgICAgbUJ1ZmZlcnMuZXJhc2UobUJ1ZmZlcnMuYmVnaW4oKSk7CisgICAgICAgIG1MYXRlc3REZXF1ZXVlZE1ldGEgPSBidWZmZXItPm1ldGEoKS0+ZHVwKCk7CiAKICAgICAgICAgaW50MzJfdCBkaXNjb250aW51aXR5OwogICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiZGlzY29udGludWl0eSIsICZkaXNjb250aW51aXR5KSkgewpAQCAtMTczLDcgKzE4OSwxMSBAQAogICAgICAgICByZXR1cm4gKGRpc2NvbnRpbnVpdHlUeXBlICYgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX0FVRElPX0ZPUk1BVCkgIT0gMDsKICAgICB9CiAKLSAgICByZXR1cm4gKGRpc2NvbnRpbnVpdHlUeXBlICYgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX1ZJREVPX0ZPUk1BVCkgIT0gMDsKKyAgICBpZiAobUlzVmlkZW8pIHsKKyAgICAgICAgcmV0dXJuIChkaXNjb250aW51aXR5VHlwZSAmIEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9WSURFT19GT1JNQVQpICE9IDA7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOwogfQogCiB2b2lkIEFub3RoZXJQYWNrZXRTb3VyY2U6OnF1ZXVlQWNjZXNzVW5pdChjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CkBAIC0xODYsMTMgKzIwNiwxOCBAQAogICAgIGludDY0X3QgbGFzdFF1ZXVlZFRpbWVVczsKICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbGFzdFF1ZXVlZFRpbWVVcykpOwogICAgIG1MYXN0UXVldWVkVGltZVVzID0gbGFzdFF1ZXVlZFRpbWVVczsKLSAgICBBTE9HVigicXVldWVBY2Nlc3NVbml0IHRpbWVVcz0lbGxkIHVzICglLjJmIHNlY3MpIiwgbUxhc3RRdWV1ZWRUaW1lVXMsIG1MYXN0UXVldWVkVGltZVVzIC8gMUU2KTsKKyAgICBBTE9HVigicXVldWVBY2Nlc3NVbml0IHRpbWVVcz0lIiBQUklpNjQgIiB1cyAoJS4yZiBzZWNzKSIsIG1MYXN0UXVldWVkVGltZVVzLCBtTGFzdFF1ZXVlZFRpbWVVcyAvIDFFNik7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIG1CdWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOwogICAgIG1Db25kaXRpb24uc2lnbmFsKCk7CiAKLSAgICBpZiAoIW1MYXRlc3RFbnF1ZXVlZE1ldGEuZ2V0KCkpIHsKKyAgICBpbnQzMl90IGRpc2NvbnRpbnVpdHk7CisgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHkiLCAmZGlzY29udGludWl0eSkpIHsKKyAgICAgICAgKyttUXVldWVkRGlzY29udGludWl0eUNvdW50OworICAgIH0KKworICAgIGlmIChtTGF0ZXN0RW5xdWV1ZWRNZXRhID09IE5VTEwpIHsKICAgICAgICAgbUxhdGVzdEVucXVldWVkTWV0YSA9IGJ1ZmZlci0+bWV0YSgpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGludDY0X3QgbGF0ZXN0VGltZVVzID0gMDsKQEAgLTIwOCw2ICsyMzMsNyBAQAogCiAgICAgbUJ1ZmZlcnMuY2xlYXIoKTsKICAgICBtRU9TUmVzdWx0ID0gT0s7CisgICAgbVF1ZXVlZERpc2NvbnRpbnVpdHlDb3VudCA9IDA7CiAKICAgICBtRm9ybWF0ID0gTlVMTDsKICAgICBtTGF0ZXN0RW5xdWV1ZWRNZXRhID0gTlVMTDsKQEAgLTIxNSwyNyArMjQxLDMxIEBACiAKIHZvaWQgQW5vdGhlclBhY2tldFNvdXJjZTo6cXVldWVEaXNjb250aW51aXR5KAogICAgICAgICBBVFNQYXJzZXI6OkRpc2NvbnRpbnVpdHlUeXBlIHR5cGUsCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZXh0cmEpIHsKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZleHRyYSwKKyAgICAgICAgYm9vbCBkaXNjYXJkKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAotICAgIC8vIExlYXZlIG9ubHkgZGlzY29udGludWl0aWVzIGluIHRoZSBxdWV1ZS4KLSAgICBMaXN0PHNwPEFCdWZmZXI+ID46Oml0ZXJhdG9yIGl0ID0gbUJ1ZmZlcnMuYmVnaW4oKTsKLSAgICB3aGlsZSAoaXQgIT0gbUJ1ZmZlcnMuZW5kKCkpIHsKLSAgICAgICAgc3A8QUJ1ZmZlcj4gb2xkQnVmZmVyID0gKml0OworICAgIGlmIChkaXNjYXJkKSB7CisgICAgICAgIC8vIExlYXZlIG9ubHkgZGlzY29udGludWl0aWVzIGluIHRoZSBxdWV1ZS4KKyAgICAgICAgTGlzdDxzcDxBQnVmZmVyPiA+OjppdGVyYXRvciBpdCA9IG1CdWZmZXJzLmJlZ2luKCk7CisgICAgICAgIHdoaWxlIChpdCAhPSBtQnVmZmVycy5lbmQoKSkgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gb2xkQnVmZmVyID0gKml0OwogCi0gICAgICAgIGludDMyX3Qgb2xkRGlzY29udGludWl0eVR5cGU7Ci0gICAgICAgIGlmICghb2xkQnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigKLSAgICAgICAgICAgICAgICAgICAgImRpc2NvbnRpbnVpdHkiLCAmb2xkRGlzY29udGludWl0eVR5cGUpKSB7Ci0gICAgICAgICAgICBpdCA9IG1CdWZmZXJzLmVyYXNlKGl0KTsKLSAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaW50MzJfdCBvbGREaXNjb250aW51aXR5VHlwZTsKKyAgICAgICAgICAgIGlmICghb2xkQnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigKKyAgICAgICAgICAgICAgICAgICAgICAgICJkaXNjb250aW51aXR5IiwgJm9sZERpc2NvbnRpbnVpdHlUeXBlKSkgeworICAgICAgICAgICAgICAgIGl0ID0gbUJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICArK2l0OwogICAgICAgICB9Ci0KLSAgICAgICAgKytpdDsKICAgICB9CiAKICAgICBtRU9TUmVzdWx0ID0gT0s7CiAgICAgbUxhc3RRdWV1ZWRUaW1lVXMgPSAwOwogICAgIG1MYXRlc3RFbnF1ZXVlZE1ldGEgPSBOVUxMOworICAgICsrbVF1ZXVlZERpc2NvbnRpbnVpdHlDb3VudDsKIAogICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKDApOwogICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiZGlzY29udGludWl0eSIsIHN0YXRpY19jYXN0PGludDMyX3Q+KHR5cGUpKTsKQEAgLTI2NSw3ICsyOTUsMTAgQEAKIAogaW50NjRfdCBBbm90aGVyUGFja2V0U291cmNlOjpnZXRCdWZmZXJlZER1cmF0aW9uVXMoc3RhdHVzX3QgKmZpbmFsUmVzdWx0KSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gZ2V0QnVmZmVyZWREdXJhdGlvblVzX2woZmluYWxSZXN1bHQpOworfQogCitpbnQ2NF90IEFub3RoZXJQYWNrZXRTb3VyY2U6OmdldEJ1ZmZlcmVkRHVyYXRpb25Vc19sKHN0YXR1c190ICpmaW5hbFJlc3VsdCkgewogICAgICpmaW5hbFJlc3VsdCA9IG1FT1NSZXN1bHQ7CiAKICAgICBpZiAobUJ1ZmZlcnMuZW1wdHkoKSkgewpAQCAtMjc0LDYgKzMwNyw3IEBACiAKICAgICBpbnQ2NF90IHRpbWUxID0gLTE7CiAgICAgaW50NjRfdCB0aW1lMiA9IC0xOworICAgIGludDY0X3QgZHVyYXRpb25VcyA9IDA7CiAKICAgICBMaXN0PHNwPEFCdWZmZXI+ID46Oml0ZXJhdG9yIGl0ID0gbUJ1ZmZlcnMuYmVnaW4oKTsKICAgICB3aGlsZSAoaXQgIT0gbUJ1ZmZlcnMuZW5kKCkpIHsKQEAgLTI4MSwyMCArMzE1LDY0IEBACiAKICAgICAgICAgaW50NjRfdCB0aW1lVXM7CiAgICAgICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSkgewotICAgICAgICAgICAgaWYgKHRpbWUxIDwgMCkgeworICAgICAgICAgICAgaWYgKHRpbWUxIDwgMCB8fCB0aW1lVXMgPCB0aW1lMSkgewogICAgICAgICAgICAgICAgIHRpbWUxID0gdGltZVVzOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICB0aW1lMiA9IHRpbWVVczsKKyAgICAgICAgICAgIGlmICh0aW1lMiA8IDAgfHwgdGltZVVzID4gdGltZTIpIHsKKyAgICAgICAgICAgICAgICB0aW1lMiA9IHRpbWVVczsKKyAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBkaXNjb250aW51aXR5LCByZXNldCBldmVyeXRoaW5nLgorICAgICAgICAgICAgZHVyYXRpb25VcyArPSB0aW1lMiAtIHRpbWUxOwogICAgICAgICAgICAgdGltZTEgPSB0aW1lMiA9IC0xOwogICAgICAgICB9CiAKICAgICAgICAgKytpdDsKICAgICB9CiAKLSAgICByZXR1cm4gdGltZTIgLSB0aW1lMTsKKyAgICByZXR1cm4gZHVyYXRpb25VcyArICh0aW1lMiAtIHRpbWUxKTsKK30KKworLy8gQSBjaGVhcGVyIGJ1dCBsZXNzIHByZWNpc2UgdmVyc2lvbiBvZiBnZXRCdWZmZXJlZER1cmF0aW9uVXMgdGhhdCB3ZSB3b3VsZCBsaWtlIHRvIHVzZSBpbgorLy8gTGl2ZVNlc3Npb246OmRlcXVldWVBY2Nlc3NVbml0IHRvIHRyaWdnZXIgZG93bndhcmRzIGFkYXB0YXRpb24uCitpbnQ2NF90IEFub3RoZXJQYWNrZXRTb3VyY2U6OmdldEVzdGltYXRlZER1cmF0aW9uVXMoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBpZiAobUJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAobVF1ZXVlZERpc2NvbnRpbnVpdHlDb3VudCA+IDApIHsKKyAgICAgICAgc3RhdHVzX3QgZmluYWxSZXN1bHQ7CisgICAgICAgIHJldHVybiBnZXRCdWZmZXJlZER1cmF0aW9uVXNfbCgmZmluYWxSZXN1bHQpOworICAgIH0KKworICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQgPSBtQnVmZmVycy5iZWdpbigpOworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9ICppdDsKKworICAgIGludDY0X3Qgc3RhcnRUaW1lVXM7CisgICAgYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnN0YXJ0VGltZVVzKTsKKyAgICBpZiAoc3RhcnRUaW1lVXMgPCAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGl0ID0gbUJ1ZmZlcnMuZW5kKCk7CisgICAgLS1pdDsKKyAgICBidWZmZXIgPSAqaXQ7CisKKyAgICBpbnQ2NF90IGVuZFRpbWVVczsKKyAgICBidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmZW5kVGltZVVzKTsKKyAgICBpZiAoZW5kVGltZVVzIDwgMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpbnQ2NF90IGRpZmZVczsKKyAgICBpZiAoZW5kVGltZVVzID4gc3RhcnRUaW1lVXMpIHsKKyAgICAgICAgZGlmZlVzID0gZW5kVGltZVVzIC0gc3RhcnRUaW1lVXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGlmZlVzID0gc3RhcnRUaW1lVXMgLSBlbmRUaW1lVXM7CisgICAgfQorICAgIHJldHVybiBkaWZmVXM7CiB9CiAKIHN0YXR1c190IEFub3RoZXJQYWNrZXRTb3VyY2U6Om5leHRCdWZmZXJUaW1lKGludDY0X3QgKnRpbWVVcykgewpAQCAtMzIzLDkgKzQwMSwxNCBAQAogICAgIHJldHVybiAobUVPU1Jlc3VsdCAhPSBPSyk7CiB9CiAKLXNwPEFNZXNzYWdlPiBBbm90aGVyUGFja2V0U291cmNlOjpnZXRMYXRlc3RNZXRhKCkgeworc3A8QU1lc3NhZ2U+IEFub3RoZXJQYWNrZXRTb3VyY2U6OmdldExhdGVzdEVucXVldWVkTWV0YSgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIHJldHVybiBtTGF0ZXN0RW5xdWV1ZWRNZXRhOwogfQogCitzcDxBTWVzc2FnZT4gQW5vdGhlclBhY2tldFNvdXJjZTo6Z2V0TGF0ZXN0RGVxdWV1ZWRNZXRhKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1MYXRlc3REZXF1ZXVlZE1ldGE7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oCmluZGV4IDliMTkzYTIuLjgwOWE4NTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oCkBAIC00OSwxMiArNDksMTYgQEAKICAgICAvLyBwcmVzZW50YXRpb24gdGltZXN0YW1wcyBzaW5jZSB0aGUgbGFzdCBkaXNjb250aW51aXR5IChpZiBhbnkpLgogICAgIGludDY0X3QgZ2V0QnVmZmVyZWREdXJhdGlvblVzKHN0YXR1c190ICpmaW5hbFJlc3VsdCk7CiAKKyAgICBpbnQ2NF90IGdldEVzdGltYXRlZER1cmF0aW9uVXMoKTsKKwogICAgIHN0YXR1c190IG5leHRCdWZmZXJUaW1lKGludDY0X3QgKnRpbWVVcyk7CiAKICAgICB2b2lkIHF1ZXVlQWNjZXNzVW5pdChjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKIAogICAgIHZvaWQgcXVldWVEaXNjb250aW51aXR5KAotICAgICAgICAgICAgQVRTUGFyc2VyOjpEaXNjb250aW51aXR5VHlwZSB0eXBlLCBjb25zdCBzcDxBTWVzc2FnZT4gJmV4dHJhKTsKKyAgICAgICAgICAgIEFUU1BhcnNlcjo6RGlzY29udGludWl0eVR5cGUgdHlwZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZXh0cmEsCisgICAgICAgICAgICBib29sIGRpc2NhcmQpOwogCiAgICAgdm9pZCBzaWduYWxFT1Moc3RhdHVzX3QgcmVzdWx0KTsKIApAQCAtNjIsNyArNjYsOCBAQAogCiAgICAgYm9vbCBpc0ZpbmlzaGVkKGludDY0X3QgZHVyYXRpb24pIGNvbnN0OwogCi0gICAgc3A8QU1lc3NhZ2U+IGdldExhdGVzdE1ldGEoKTsKKyAgICBzcDxBTWVzc2FnZT4gZ2V0TGF0ZXN0RW5xdWV1ZWRNZXRhKCk7CisgICAgc3A8QU1lc3NhZ2U+IGdldExhdGVzdERlcXVldWVkTWV0YSgpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QW5vdGhlclBhY2tldFNvdXJjZSgpOwpAQCAtNzIsMTMgKzc3LDE4IEBACiAgICAgQ29uZGl0aW9uIG1Db25kaXRpb247CiAKICAgICBib29sIG1Jc0F1ZGlvOworICAgIGJvb2wgbUlzVmlkZW87CiAgICAgc3A8TWV0YURhdGE+IG1Gb3JtYXQ7CiAgICAgaW50NjRfdCBtTGFzdFF1ZXVlZFRpbWVVczsKICAgICBMaXN0PHNwPEFCdWZmZXI+ID4gbUJ1ZmZlcnM7CiAgICAgc3RhdHVzX3QgbUVPU1Jlc3VsdDsKICAgICBzcDxBTWVzc2FnZT4gbUxhdGVzdEVucXVldWVkTWV0YTsKKyAgICBzcDxBTWVzc2FnZT4gbUxhdGVzdERlcXVldWVkTWV0YTsKKworICAgIHNpemVfdCAgbVF1ZXVlZERpc2NvbnRpbnVpdHlDb3VudDsKIAogICAgIGJvb2wgd2FzRm9ybWF0Q2hhbmdlKGludDMyX3QgZGlzY29udGludWl0eVR5cGUpIGNvbnN0OworICAgIGludDY0X3QgZ2V0QnVmZmVyZWREdXJhdGlvblVzX2woc3RhdHVzX3QgKmZpbmFsUmVzdWx0KTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFub3RoZXJQYWNrZXRTb3VyY2UpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwCmluZGV4IDJiMDcxMWIuLmVmMWNkM2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmNwcApAQCAtMzEsNiArMzEsNyBAQAogCiAjaW5jbHVkZSAiaW5jbHVkZS9hdmNfdXRpbHMuaCIKIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC0yNjQsNyArMjY1LDcgQEAKIAogICAgICAgICAgICAgICAgIGlmIChzdGFydE9mZnNldCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0koImZvdW5kIHNvbWV0aGluZyByZXNlbWJsaW5nIGFuIEguMjY0L01QRUcgc3luY3dvcmQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiYXQgb2Zmc2V0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImF0IG9mZnNldCAlemQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydE9mZnNldCk7CiAgICAgICAgICAgICAgICAgfQogCkBAIC0yOTcsNyArMjk4LDcgQEAKIAogICAgICAgICAgICAgICAgIGlmIChzdGFydE9mZnNldCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0koImZvdW5kIHNvbWV0aGluZyByZXNlbWJsaW5nIGFuIEguMjY0L01QRUcgc3luY3dvcmQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiYXQgb2Zmc2V0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImF0IG9mZnNldCAlemQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydE9mZnNldCk7CiAgICAgICAgICAgICAgICAgfQogCkBAIC0zMzAsNyArMzMxLDcgQEAKIAogICAgICAgICAgICAgICAgIGlmIChzdGFydE9mZnNldCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0koImZvdW5kIHNvbWV0aGluZyByZXNlbWJsaW5nIGFuIEFBQyBzeW5jd29yZCBhdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJvZmZzZXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAib2Zmc2V0ICV6ZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0T2Zmc2V0KTsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTM1OCw3ICszNTksNyBAQAogCiAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0T2Zmc2V0ID4gMCkgewogICAgICAgICAgICAgICAgICAgICBBTE9HSSgiZm91bmQgc29tZXRoaW5nIHJlc2VtYmxpbmcgYW4gQUMzIHN5bmN3b3JkIGF0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIm9mZnNldCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJvZmZzZXQgJXpkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQpOwogICAgICAgICAgICAgICAgIH0KIApAQCAtMzg1LDcgKzM4Niw3IEBACiAKICAgICAgICAgICAgICAgICBpZiAoc3RhcnRPZmZzZXQgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJmb3VuZCBzb21ldGhpbmcgcmVzZW1ibGluZyBhbiBNUEVHIGF1ZGlvICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgInN5bmN3b3JkIGF0IG9mZnNldCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJzeW5jd29yZCBhdCBvZmZzZXQgJXpkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQpOwogICAgICAgICAgICAgICAgIH0KIApAQCAtNDA5LDcgKzQxMCw3IEBACiAgICAgaWYgKG1CdWZmZXIgPT0gTlVMTCB8fCBuZWVkZWRTaXplID4gbUJ1ZmZlci0+Y2FwYWNpdHkoKSkgewogICAgICAgICBuZWVkZWRTaXplID0gKG5lZWRlZFNpemUgKyA2NTUzNSkgJiB+NjU1MzU7CiAKLSAgICAgICAgQUxPR1YoInJlc2l6aW5nIGJ1ZmZlciB0byBzaXplICVkIiwgbmVlZGVkU2l6ZSk7CisgICAgICAgIEFMT0dWKCJyZXNpemluZyBidWZmZXIgdG8gc2l6ZSAlenUiLCBuZWVkZWRTaXplKTsKIAogICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcihuZWVkZWRTaXplKTsKICAgICAgICAgaWYgKG1CdWZmZXIgIT0gTlVMTCkgewpAQCAtNDMyLDcgKzQzMyw3IEBACiAKICNpZiAwCiAgICAgaWYgKG1Nb2RlID09IEFBQykgewotICAgICAgICBBTE9HSSgic2l6ZSA9ICVkLCB0aW1lVXMgPSAlLjJmIHNlY3MiLCBzaXplLCB0aW1lVXMgLyAxRTYpOworICAgICAgICBBTE9HSSgic2l6ZSA9ICV6dSwgdGltZVVzID0gJS4yZiBzZWNzIiwgc2l6ZSwgdGltZVVzIC8gMUU2KTsKICAgICAgICAgaGV4ZHVtcChkYXRhLCBzaXplKTsKICAgICB9CiAjZW5kaWYKQEAgLTYwMyw2ICs2MDQsOCBAQAogICAgIC8vIGhhdmluZyB0byBpbnRlcnBvbGF0ZS4KICAgICAvLyBUaGUgZmluYWwgQUFDIGZyYW1lIG1heSB3ZWxsIGV4dGVuZCBpbnRvIHRoZSBuZXh0IFJhbmdlSW5mbyBidXQKICAgICAvLyB0aGF0J3Mgb2suCisgICAgLy8gVE9ETzogdGhlIGxvZ2ljIGNvbW1lbnRlZCBhYm92ZSBpcyBza2lwcGVkIGJlY2F1c2UgY29kZWMgY2Fubm90IHRha2UKKyAgICAvLyBhcmJpdHJhcnkgc2l6ZWQgaW5wdXQgYnVmZmVyczsKICAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKICAgICB3aGlsZSAob2Zmc2V0IDwgaW5mby5tTGVuZ3RoKSB7CiAgICAgICAgIGlmIChvZmZzZXQgKyA3ID4gbUJ1ZmZlci0+c2l6ZSgpKSB7CkBAIC02NjcsOSArNjcwLDEyIEBACiAgICAgICAgIHNpemVfdCBoZWFkZXJTaXplID0gcHJvdGVjdGlvbl9hYnNlbnQgPyA3IDogOTsKIAogICAgICAgICBvZmZzZXQgKz0gYWFjX2ZyYW1lX2xlbmd0aDsKKyAgICAgICAgLy8gVE9ETzogbW92ZSBiYWNrIHRvIGNvbmNhdGVuYXRpb24gd2hlbiBjb2RlYyBjYW4gc3VwcG9ydCBhcmJpdHJhcnkgaW5wdXQgYnVmZmVycy4KKyAgICAgICAgLy8gRm9yIG5vdyBvbmx5IHF1ZXVlIGEgc2luZ2xlIGJ1ZmZlcgorICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBpbnQ2NF90IHRpbWVVcyA9IGZldGNoVGltZXN0YW1wKG9mZnNldCk7CisgICAgaW50NjRfdCB0aW1lVXMgPSBmZXRjaFRpbWVzdGFtcEFBQyhvZmZzZXQpOwogCiAgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9IG5ldyBBQnVmZmVyKG9mZnNldCk7CiAgICAgbWVtY3B5KGFjY2Vzc1VuaXQtPmRhdGEoKSwgbUJ1ZmZlci0+ZGF0YSgpLCBvZmZzZXQpOwpAQCAtNzE2LDYgKzcyMiw0NSBAQAogICAgIHJldHVybiB0aW1lVXM7CiB9CiAKKy8vIFRPRE86IGF2b2lkIGludGVycG9sYXRpbmcgdGltZXN0YW1wcyBvbmNlIGNvZGVjIHN1cHBvcnRzIGFyYml0cmFyeSBzaXplZCBpbnB1dCBidWZmZXJzCitpbnQ2NF90IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6ZmV0Y2hUaW1lc3RhbXBBQUMoc2l6ZV90IHNpemUpIHsKKyAgICBpbnQ2NF90IHRpbWVVcyA9IC0xOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworCisgICAgc2l6ZV90IHNhbXBsZXNpemUgPSBzaXplOworICAgIHdoaWxlIChzaXplID4gMCkgeworICAgICAgICBDSEVDSyghbVJhbmdlSW5mb3MuZW1wdHkoKSk7CisKKyAgICAgICAgUmFuZ2VJbmZvICppbmZvID0gJiptUmFuZ2VJbmZvcy5iZWdpbigpOworCisgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgdGltZVVzID0gaW5mby0+bVRpbWVzdGFtcFVzOworICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbmZvLT5tTGVuZ3RoID4gc2l6ZSkgeworICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlOworICAgICAgICAgICAgQ0hFQ0sobUZvcm1hdC0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlUmF0ZSkpOworICAgICAgICAgICAgaW5mby0+bUxlbmd0aCAtPSBzaXplOworICAgICAgICAgICAgc2l6ZV90IG51bVNhbXBsZXMgPSAxMDI0ICogc2l6ZSAvIHNhbXBsZXNpemU7CisgICAgICAgICAgICBpbmZvLT5tVGltZXN0YW1wVXMgKz0gbnVtU2FtcGxlcyAqIDEwMDAwMDBsbCAvIHNhbXBsZVJhdGU7CisgICAgICAgICAgICBzaXplID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNpemUgLT0gaW5mby0+bUxlbmd0aDsKKworICAgICAgICAgICAgbVJhbmdlSW5mb3MuZXJhc2UobVJhbmdlSW5mb3MuYmVnaW4oKSk7CisgICAgICAgICAgICBpbmZvID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgaWYgKHRpbWVVcyA9PSAwbGwpIHsKKyAgICAgICAgQUxPR1YoIlJldHVybmluZyAwIHRpbWVzdGFtcCIpOworICAgIH0KKworICAgIHJldHVybiB0aW1lVXM7Cit9CisKIHN0cnVjdCBOQUxQb3NpdGlvbiB7CiAgICAgc2l6ZV90IG5hbE9mZnNldDsKICAgICBzaXplX3QgbmFsU2l6ZTsKQEAgLTc3Niw2ICs4MjEsMTIgQEAKIAogICAgICAgICAgICAgICAgIHVuc2lnbmVkIG5hbFR5cGUgPSBtQnVmZmVyLT5kYXRhKClbcG9zLm5hbE9mZnNldF0gJiAweDFmOwogCisgICAgICAgICAgICAgICAgaWYgKG5hbFR5cGUgPT0gNikgeworICAgICAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBzZWkgPSBuZXcgQUJ1ZmZlcihwb3MubmFsU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShzZWktPmRhdGEoKSwgbUJ1ZmZlci0+ZGF0YSgpICsgcG9zLm5hbE9mZnNldCwgcG9zLm5hbFNpemUpOworICAgICAgICAgICAgICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEJ1ZmZlcigic2VpIiwgc2VpKTsKKyAgICAgICAgICAgICAgICB9CisKICNpZiAhTE9HX05ERUJVRwogICAgICAgICAgICAgICAgIGNoYXIgdG1wWzEyOF07CiAgICAgICAgICAgICAgICAgc3ByaW50Zih0bXAsICIweCUwMngiLCBuYWxUeXBlKTsKQEAgLTc5NCw3ICs4NDUsOSBAQAogICAgICAgICAgICAgICAgIGRzdE9mZnNldCArPSBwb3MubmFsU2l6ZSArIDQ7CiAgICAgICAgICAgICB9CiAKKyNpZiAhTE9HX05ERUJVRwogICAgICAgICAgICAgQUxPR1YoImFjY2Vzc1VuaXQgY29udGFpbnMgbmFsIHR5cGVzICVzIiwgb3V0LmNfc3RyKCkpOworI2VuZGlmCiAKICAgICAgICAgICAgIGNvbnN0IE5BTFBvc2l0aW9uICZwb3MgPSBuYWxzLml0ZW1BdChuYWxzLnNpemUoKSAtIDEpOwogICAgICAgICAgICAgc2l6ZV90IG5leHRTY2FuID0gcG9zLm5hbE9mZnNldCArIHBvcy5uYWxTaXplOwpAQCAtMTAyNSw3ICsxMDc4LDcgQEAKIAogICAgICAgICAgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CiAKLSAgICAgICAgICAgICAgICBBTE9HVigicmV0dXJuaW5nIE1QRUcgdmlkZW8gYWNjZXNzIHVuaXQgYXQgdGltZSAlbGxkIHVzIiwKKyAgICAgICAgICAgICAgICBBTE9HVigicmV0dXJuaW5nIE1QRUcgdmlkZW8gYWNjZXNzIHVuaXQgYXQgdGltZSAlIiBQUklkNjQgIiB1cyIsCiAgICAgICAgICAgICAgICAgICAgICAgdGltZVVzKTsKIAogICAgICAgICAgICAgICAgIC8vIGhleGR1bXAoYWNjZXNzVW5pdC0+ZGF0YSgpLCBhY2Nlc3NVbml0LT5zaXplKCkpOwpAQCAtMTE4NCw3ICsxMjM3LDcgQEAKIAogICAgICAgICAgICAgICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwogCi0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJyZXR1cm5pbmcgTVBFRzQgdmlkZW8gYWNjZXNzIHVuaXQgYXQgdGltZSAlbGxkIHVzIiwKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoInJldHVybmluZyBNUEVHNCB2aWRlbyBhY2Nlc3MgdW5pdCBhdCB0aW1lICUiIFBSSWQ2NCAiIHVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lVXMpOwogCiAgICAgICAgICAgICAgICAgICAgIC8vIGhleGR1bXAoYWNjZXNzVW5pdC0+ZGF0YSgpLCBhY2Nlc3NVbml0LT5zaXplKCkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuaAppbmRleCBhMmNjYTc3Li43YzgxZmYwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuaApAQCAtNzcsNiArNzcsNyBAQAogICAgIC8vIGNvbnN1bWUgYSBsb2dpY2FsIChjb21wcmVzc2VkKSBhY2Nlc3MgdW5pdCBvZiBzaXplICJzaXplIiwKICAgICAvLyByZXR1cm5zIGl0cyB0aW1lc3RhbXAgaW4gdXMgKG9yIC0xIGlmIG5vIHRpbWUgaW5mb3JtYXRpb24pLgogICAgIGludDY0X3QgZmV0Y2hUaW1lc3RhbXAoc2l6ZV90IHNpemUpOworICAgIGludDY0X3QgZmV0Y2hUaW1lc3RhbXBBQUMoc2l6ZV90IHNpemUpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRWxlbWVudGFyeVN0cmVhbVF1ZXVlKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL01QRUcyUFNFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9NUEVHMlBTRXh0cmFjdG9yLmNwcAppbmRleCBkZDcxNGM5OS4uODU4NTlmNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9NUEVHMlBTRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL01QRUcyUFNFeHRyYWN0b3IuY3BwCkBAIC0zNiw2ICszNiw4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjayA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7CkBAIC0xMzAsNyArMTMyLDggQEAKICAgICByZXR1cm4gbmV3IFdyYXBwZWRUcmFjayh0aGlzLCBtVHJhY2tzLnZhbHVlQXQoaW5kZXgpKTsKIH0KIAotc3A8TWV0YURhdGE+IE1QRUcyUFNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncykgeworc3A8TWV0YURhdGE+IE1QRUcyUFNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCisgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKICAgICBpZiAoaW5kZXggPj0gbVRyYWNrcy5zaXplKCkpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtNDA4LDcgKzQxMSw3IEBACiAgICAgICAgICAgICBQVFMgfD0gYnIuZ2V0Qml0cygxNSk7CiAgICAgICAgICAgICBDSEVDS19FUShici5nZXRCaXRzKDEpLCAxdSk7CiAKLSAgICAgICAgICAgIEFMT0dWKCJQVFMgPSAlbGx1IiwgUFRTKTsKKyAgICAgICAgICAgIEFMT0dWKCJQVFMgPSAlIiBQUkl1NjQsIFBUUyk7CiAgICAgICAgICAgICAvLyBBTE9HSSgiUFRTID0gJS4yZiBzZWNzIiwgUFRTIC8gOTAwMDAuMGYpOwogCiAgICAgICAgICAgICBvcHRpb25hbF9ieXRlc19yZW1haW5pbmcgLT0gNTsKQEAgLTQyNSw3ICs0MjgsNyBAQAogICAgICAgICAgICAgICAgIERUUyB8PSBici5nZXRCaXRzKDE1KTsKICAgICAgICAgICAgICAgICBDSEVDS19FUShici5nZXRCaXRzKDEpLCAxdSk7CiAKLSAgICAgICAgICAgICAgICBBTE9HVigiRFRTID0gJWxsdSIsIERUUyk7CisgICAgICAgICAgICAgICAgQUxPR1YoIkRUUyA9ICUiIFBSSXU2NCwgRFRTKTsKIAogICAgICAgICAgICAgICAgIG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZyAtPSA1OwogICAgICAgICAgICAgfQpAQCAtNDQzLDcgKzQ0Niw3IEBACiAgICAgICAgICAgICBFU0NSIHw9IGJyLmdldEJpdHMoMTUpOwogICAgICAgICAgICAgQ0hFQ0tfRVEoYnIuZ2V0Qml0cygxKSwgMXUpOwogCi0gICAgICAgICAgICBBTE9HVigiRVNDUiA9ICVsbHUiLCBFU0NSKTsKKyAgICAgICAgICAgIEFMT0dWKCJFU0NSID0gJSIgUFJJdTY0LCBFU0NSKTsKICAgICAgICAgICAgIC8qIHVuc2lnbmVkIEVTQ1JfZXh0ZW5zaW9uID0gKi9ici5nZXRCaXRzKDkpOwogCiAgICAgICAgICAgICBDSEVDS19FUShici5nZXRCaXRzKDEpLCAxdSk7CkBAIC00NzIsNyArNDc1LDcgQEAKIAogICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IGRhdGFMZW5ndGggKiA4KSB7CiAgICAgICAgICAgICBBTE9HRSgiUEVTIHBhY2tldCBkb2VzIG5vdCBjYXJyeSBlbm91Z2ggZGF0YSB0byBjb250YWluICIKLSAgICAgICAgICAgICAgICAgInBheWxvYWQuIChudW1CaXRzTGVmdCA9ICVkLCByZXF1aXJlZCA9ICVkKSIsCisgICAgICAgICAgICAgICAgICJwYXlsb2FkLiAobnVtQml0c0xlZnQgPSAlenUsIHJlcXVpcmVkID0gJXUpIiwKICAgICAgICAgICAgICAgICAgYnIubnVtQml0c0xlZnQoKSwgZGF0YUxlbmd0aCAqIDgpOwogCiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwpAQCAtNjI1LDcgKzYyOCw3IEBACiAKIHN0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrOjphcHBlbmRQRVNEYXRhKAogICAgICAgICB1bnNpZ25lZCBQVFNfRFRTX2ZsYWdzLAotICAgICAgICB1aW50NjRfdCBQVFMsIHVpbnQ2NF90IERUUywKKyAgICAgICAgdWludDY0X3QgUFRTLCB1aW50NjRfdCAvKiBEVFMgKi8sCiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CiAgICAgaWYgKG1RdWV1ZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBPSzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvTVBFRzJUU0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL01QRUcyVFNFeHRyYWN0b3IuY3BwCmluZGV4IGQ0NDljMzQuLjM1Y2ExMTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvTVBFRzJUU0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9NUEVHMlRTRXh0cmFjdG9yLmNwcApAQCAtMTQxLDcgKzE0MSw3IEBACiB9CiAKIHNwPE1ldGFEYXRhPiBNUEVHMlRTRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAotICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKSB7CisgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKICAgICByZXR1cm4gaW5kZXggPCBtU291cmNlSW1wbHMuc2l6ZSgpCiAgICAgICAgID8gbVNvdXJjZUltcGxzLmVkaXRJdGVtQXQoaW5kZXgpLT5nZXRGb3JtYXQoKSA6IE5VTEw7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLm1rCmluZGV4IGNkOTEyZTcuLmFhYTgzMzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLm1rCkBAIC0xLDYgKzEsMTAgQEAKIExPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKK2lmZXEgKCQoVEFSR0VUX0RFVklDRSksIG1hbnRhKQorICAgIExPQ0FMX0NGTEFHUyArPSAtRFNVUkZBQ0VfSVNfQkdSMzIKK2VuZGlmCisKIExPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBHcmFwaGljQnVmZmVyU291cmNlLmNwcCAgICAgICBcCiAgICAgICAgIE9NWC5jcHAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTEwLDYgKzE0LDcgQEAKICAgICAgICAgU29mdE9NWENvbXBvbmVudC5jcHAgICAgICAgICAgXAogICAgICAgICBTb2Z0T01YUGx1Z2luLmNwcCAgICAgICAgICAgICBcCiAgICAgICAgIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuY3BwIFwKKyAgICAgICAgU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5jcHAgXAogCiBMT0NBTF9DX0lOQ0xVREVTICs9IFwKICAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXApAQCAtMTgsNiArMjMsNyBAQAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9ICAgICAgICAgICAgICAgXAogICAgICAgICBsaWJiaW5kZXIgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbGliaGFyZHdhcmUgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGxpYm1lZGlhICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBsaWJ1dGlscyAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgbGlibG9nICAgICAgICAgICAgICAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKaW5kZXggNDRmMGJlNy4uM2U3MDk1NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmNwcApAQCAtMTQsNiArMTQsOCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKICNkZWZpbmUgTE9HX1RBRyAiR3JhcGhpY0J1ZmZlclNvdXJjZSIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KQEAgLTI3LDEzICsyOSwxNiBAQAogI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL01ldGFkYXRhQnVmZmVyVHlwZS5oPgogI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RhdGljIGNvbnN0IGJvb2wgRVhUUkFfQ0hFQ0sgPSB0cnVlOwogCiAKIEdyYXBoaWNCdWZmZXJTb3VyY2U6OkdyYXBoaWNCdWZmZXJTb3VyY2UoT01YTm9kZUluc3RhbmNlKiBub2RlSW5zdGFuY2UsCi0gICAgICAgIHVpbnQzMl90IGJ1ZmZlcldpZHRoLCB1aW50MzJfdCBidWZmZXJIZWlnaHQsIHVpbnQzMl90IGJ1ZmZlckNvdW50KSA6CisgICAgICAgIHVpbnQzMl90IGJ1ZmZlcldpZHRoLCB1aW50MzJfdCBidWZmZXJIZWlnaHQsIHVpbnQzMl90IGJ1ZmZlckNvdW50LAorICAgICAgICBib29sIHVzZUdyYXBoaWNCdWZmZXJJbk1ldGEpIDoKICAgICBtSW5pdENoZWNrKFVOS05PV05fRVJST1IpLAogICAgIG1Ob2RlSW5zdGFuY2Uobm9kZUluc3RhbmNlKSwKICAgICBtRXhlY3V0aW5nKGZhbHNlKSwKQEAgLTQxLDE2ICs0NiwyMiBAQAogICAgIG1OdW1GcmFtZXNBdmFpbGFibGUoMCksCiAgICAgbUVuZE9mU3RyZWFtKGZhbHNlKSwKICAgICBtRW5kT2ZTdHJlYW1TZW50KGZhbHNlKSwKLSAgICBtUmVwZWF0QWZ0ZXJVcygtMWxsKSwKICAgICBtTWF4VGltZXN0YW1wR2FwVXMoLTFsbCksCiAgICAgbVByZXZPcmlnaW5hbFRpbWVVcygtMWxsKSwKICAgICBtUHJldk1vZGlmaWVkVGltZVVzKC0xbGwpLAorICAgIG1Ta2lwRnJhbWVzQmVmb3JlTnMoLTFsbCksCisgICAgbVJlcGVhdEFmdGVyVXMoLTFsbCksCiAgICAgbVJlcGVhdExhc3RGcmFtZUdlbmVyYXRpb24oMCksCiAgICAgbVJlcGVhdExhc3RGcmFtZVRpbWVzdGFtcCgtMWxsKSwKICAgICBtTGF0ZXN0U3VibWl0dGVkQnVmZmVySWQoLTEpLAogICAgIG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJGcmFtZU51bSgwKSwKICAgICBtTGF0ZXN0U3VibWl0dGVkQnVmZmVyVXNlQ291bnQoMCksCi0gICAgbVJlcGVhdEJ1ZmZlckRlZmVycmVkKGZhbHNlKSB7CisgICAgbVJlcGVhdEJ1ZmZlckRlZmVycmVkKGZhbHNlKSwKKyAgICBtVGltZVBlckNhcHR1cmVVcygtMWxsKSwKKyAgICBtVGltZVBlckZyYW1lVXMoLTFsbCksCisgICAgbVByZXZDYXB0dXJlVXMoLTFsbCksCisgICAgbVByZXZGcmFtZVVzKC0xbGwpLAorICAgIG1Vc2VHcmFwaGljQnVmZmVySW5NZXRhKHVzZUdyYXBoaWNCdWZmZXJJbk1ldGEpIHsKIAogICAgIEFMT0dWKCJHcmFwaGljQnVmZmVyU291cmNlIHc9JXUgaD0ldSBjPSV1IiwKICAgICAgICAgICAgIGJ1ZmZlcldpZHRoLCBidWZmZXJIZWlnaHQsIGJ1ZmZlckNvdW50KTsKQEAgLTYzLDEzICs3NCwxMiBAQAogCiAgICAgU3RyaW5nOCBuYW1lKCJHcmFwaGljQnVmZmVyU291cmNlIik7CiAKLSAgICBtQnVmZmVyUXVldWUgPSBuZXcgQnVmZmVyUXVldWUoKTsKLSAgICBtQnVmZmVyUXVldWUtPnNldENvbnN1bWVyTmFtZShuYW1lKTsKLSAgICBtQnVmZmVyUXVldWUtPnNldERlZmF1bHRCdWZmZXJTaXplKGJ1ZmZlcldpZHRoLCBidWZmZXJIZWlnaHQpOwotICAgIG1CdWZmZXJRdWV1ZS0+c2V0Q29uc3VtZXJVc2FnZUJpdHMoR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSIHwKLSAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfSFdfVEVYVFVSRSk7CisgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZtUHJvZHVjZXIsICZtQ29uc3VtZXIpOworICAgIG1Db25zdW1lci0+c2V0Q29uc3VtZXJOYW1lKG5hbWUpOworICAgIG1Db25zdW1lci0+c2V0RGVmYXVsdEJ1ZmZlclNpemUoYnVmZmVyV2lkdGgsIGJ1ZmZlckhlaWdodCk7CisgICAgbUNvbnN1bWVyLT5zZXRDb25zdW1lclVzYWdlQml0cyhHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVIpOwogCi0gICAgbUluaXRDaGVjayA9IG1CdWZmZXJRdWV1ZS0+c2V0TWF4QWNxdWlyZWRCdWZmZXJDb3VudChidWZmZXJDb3VudCk7CisgICAgbUluaXRDaGVjayA9IG1Db25zdW1lci0+c2V0TWF4QWNxdWlyZWRCdWZmZXJDb3VudChidWZmZXJDb3VudCk7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgQlEgbWF4IGFjcXVpcmVkIGJ1ZmZlciBjb3VudCB0byAldTogJWQiLAogICAgICAgICAgICAgICAgIGJ1ZmZlckNvdW50LCBtSW5pdENoZWNrKTsKQEAgLTgzLDcgKzkzLDcgQEAKICAgICB3cDxCdWZmZXJRdWV1ZTo6Q29uc3VtZXJMaXN0ZW5lcj4gbGlzdGVuZXIgPSBzdGF0aWNfY2FzdDxCdWZmZXJRdWV1ZTo6Q29uc3VtZXJMaXN0ZW5lcio+KHRoaXMpOwogICAgIHNwPEJ1ZmZlclF1ZXVlOjpQcm94eUNvbnN1bWVyTGlzdGVuZXI+IHByb3h5ID0gbmV3IEJ1ZmZlclF1ZXVlOjpQcm94eUNvbnN1bWVyTGlzdGVuZXIobGlzdGVuZXIpOwogCi0gICAgbUluaXRDaGVjayA9IG1CdWZmZXJRdWV1ZS0+Y29uc3VtZXJDb25uZWN0KHByb3h5LCBmYWxzZSk7CisgICAgbUluaXRDaGVjayA9IG1Db25zdW1lci0+Y29uc3VtZXJDb25uZWN0KHByb3h5LCBmYWxzZSk7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR0UoIkVycm9yIGNvbm5lY3RpbmcgdG8gQnVmZmVyUXVldWU6ICVzICglZCkiLAogICAgICAgICAgICAgICAgIHN0cmVycm9yKC1tSW5pdENoZWNrKSwgbUluaXRDaGVjayk7CkBAIC05NSw4ICsxMDUsOCBAQAogCiBHcmFwaGljQnVmZmVyU291cmNlOjp+R3JhcGhpY0J1ZmZlclNvdXJjZSgpIHsKICAgICBBTE9HVigifkdyYXBoaWNCdWZmZXJTb3VyY2UiKTsKLSAgICBpZiAobUJ1ZmZlclF1ZXVlICE9IE5VTEwpIHsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbUJ1ZmZlclF1ZXVlLT5jb25zdW1lckRpc2Nvbm5lY3QoKTsKKyAgICBpZiAobUNvbnN1bWVyICE9IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNvbnN1bWVyLT5jb25zdW1lckRpc2Nvbm5lY3QoKTsKICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgQUxPR1coImNvbnN1bWVyRGlzY29ubmVjdCBmYWlsZWQ6ICVkIiwgZXJyKTsKICAgICAgICAgfQpAQCAtMTA1LDcgKzExNSw3IEBACiAKIHZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6b214RXhlY3V0aW5nKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOwotICAgIEFMT0dWKCItLT4gZXhlY3V0aW5nOyBhdmFpbD0lZCwgY29kZWMgdmVjIHNpemU9JXpkIiwKKyAgICBBTE9HVigiLS0+IGV4ZWN1dGluZzsgYXZhaWw9JXp1LCBjb2RlYyB2ZWMgc2l6ZT0lemQiLAogICAgICAgICAgICAgbU51bUZyYW1lc0F2YWlsYWJsZSwgbUNvZGVjQnVmZmVycy5zaXplKCkpOwogICAgIENIRUNLKCFtRXhlY3V0aW5nKTsKICAgICBtRXhlY3V0aW5nID0gdHJ1ZTsKQEAgLTEyNyw3ICsxMzcsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgQUxPR1YoImRvbmUgbG9hZGluZyBpbml0aWFsIGZyYW1lcywgYXZhaWw9JWQiLCBtTnVtRnJhbWVzQXZhaWxhYmxlKTsKKyAgICBBTE9HVigiZG9uZSBsb2FkaW5nIGluaXRpYWwgZnJhbWVzLCBhdmFpbD0lenUiLCBtTnVtRnJhbWVzQXZhaWxhYmxlKTsKIAogICAgIC8vIElmIEVPUyBoYXMgYWxyZWFkeSBiZWVuIHNpZ25hbGVkLCBhbmQgdGhlcmUgYXJlIG5vIG1vcmUgZnJhbWVzIHRvCiAgICAgLy8gc3VibWl0LCB0cnkgdG8gc2VuZCBFT1Mgbm93IGFzIHdlbGwuCkBAIC0xNzksNyArMTg5LDcgQEAKICAgICAgICAgbUxvb3Blci5jbGVhcigpOwogICAgIH0KIAotICAgIEFMT0dWKCItLT4gbG9hZGVkOyBhdmFpbD0lZCBlb3M9JWQgZW9zU2VudD0lZCIsCisgICAgQUxPR1YoIi0tPiBsb2FkZWQ7IGF2YWlsPSV6dSBlb3M9JWQgZW9zU2VudD0lZCIsCiAgICAgICAgICAgICBtTnVtRnJhbWVzQXZhaWxhYmxlLCBtRW5kT2ZTdHJlYW0sIG1FbmRPZlN0cmVhbVNlbnQpOwogCiAgICAgLy8gQ29kZWMgaXMgbm8gbG9uZ2VyIGV4ZWN1dGluZy4gIERpc2NhcmQgYWxsIGNvZGVjLXJlbGF0ZWQgc3RhdGUuCkBAIC0yMDAsNyArMjEwLDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIEFMT0dWKCJhZGRDb2RlY0J1ZmZlciBoPSVwIHNpemU9JWx1IHA9JXAiLAorICAgIEFMT0dWKCJhZGRDb2RlY0J1ZmZlciBoPSVwIHNpemU9JSIgUFJJdTMyICIgcD0lcCIsCiAgICAgICAgICAgICBoZWFkZXIsIGhlYWRlci0+bkFsbG9jTGVuLCBoZWFkZXItPnBCdWZmZXIpOwogICAgIENvZGVjQnVmZmVyIGNvZGVjQnVmZmVyOwogICAgIGNvZGVjQnVmZmVyLm1IZWFkZXIgPSBoZWFkZXI7CkBAIC0yMjEsNyArMjMxLDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIEFMT0dWKCJjb2RlY0J1ZmZlckVtcHRpZWQgaD0lcCBzaXplPSVsdSBmaWxsZWQ9JWx1IHA9JXAiLAorICAgIEFMT0dWKCJjb2RlY0J1ZmZlckVtcHRpZWQgaD0lcCBzaXplPSUiIFBSSXUzMiAiIGZpbGxlZD0lIiBQUkl1MzIgIiBwPSVwIiwKICAgICAgICAgICAgIGhlYWRlciwgaGVhZGVyLT5uQWxsb2NMZW4sIGhlYWRlci0+bkZpbGxlZExlbiwKICAgICAgICAgICAgIGhlYWRlci0+cEJ1ZmZlcik7CiAgICAgQ29kZWNCdWZmZXImIGNvZGVjQnVmZmVyKG1Db2RlY0J1ZmZlcnMuZWRpdEl0ZW1BdChjYmkpKTsKQEAgLTI0NiwxMyArMjU2LDI1IEBACiAgICAgICAgIC8vIFB1bGwgdGhlIGdyYXBoaWMgYnVmZmVyIGhhbmRsZSBiYWNrIG91dCBvZiB0aGUgYnVmZmVyLCBhbmQgY29uZmlybQogICAgICAgICAvLyB0aGF0IGl0IG1hdGNoZXMgZXhwZWN0YXRpb25zLgogICAgICAgICBPTVhfVTgqIGRhdGEgPSBoZWFkZXItPnBCdWZmZXI7Ci0gICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCBidWZmZXJIYW5kbGU7Ci0gICAgICAgIG1lbWNweSgmYnVmZmVySGFuZGxlLCBkYXRhICsgNCwgc2l6ZW9mKGJ1ZmZlcl9oYW5kbGVfdCkpOwotICAgICAgICBpZiAoYnVmZmVySGFuZGxlICE9IGNvZGVjQnVmZmVyLm1HcmFwaGljQnVmZmVyLT5oYW5kbGUpIHsKLSAgICAgICAgICAgIC8vIHNob3VsZCBuZXZlciBoYXBwZW4KLSAgICAgICAgICAgIEFMT0dFKCJjb2RlY0J1ZmZlckVtcHRpZWQ6IGJ1ZmZlcidzIGhhbmRsZSBpcyAlcCwgZXhwZWN0ZWQgJXAiLAotICAgICAgICAgICAgICAgICAgICBidWZmZXJIYW5kbGUsIGNvZGVjQnVmZmVyLm1HcmFwaGljQnVmZmVyLT5oYW5kbGUpOwotICAgICAgICAgICAgQ0hFQ0soISJjb2RlY0J1ZmZlckVtcHRpZWQ6IG1pc21hdGNoZWQgYnVmZmVyIik7CisgICAgICAgIE1ldGFkYXRhQnVmZmVyVHlwZSB0eXBlID0gKihNZXRhZGF0YUJ1ZmZlclR5cGUgKilkYXRhOworICAgICAgICBpZiAodHlwZSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSkgeworICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90IGJ1ZmZlckhhbmRsZTsKKyAgICAgICAgICAgIG1lbWNweSgmYnVmZmVySGFuZGxlLCBkYXRhICsgNCwgc2l6ZW9mKGJ1ZmZlcl9oYW5kbGVfdCkpOworICAgICAgICAgICAgaWYgKGJ1ZmZlckhhbmRsZSAhPSBjb2RlY0J1ZmZlci5tR3JhcGhpY0J1ZmZlci0+aGFuZGxlKSB7CisgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbgorICAgICAgICAgICAgICAgIEFMT0dFKCJjb2RlY0J1ZmZlckVtcHRpZWQ6IGJ1ZmZlcidzIGhhbmRsZSBpcyAlcCwgZXhwZWN0ZWQgJXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVySGFuZGxlLCBjb2RlY0J1ZmZlci5tR3JhcGhpY0J1ZmZlci0+aGFuZGxlKTsKKyAgICAgICAgICAgICAgICBDSEVDSyghImNvZGVjQnVmZmVyRW1wdGllZDogbWlzbWF0Y2hlZCBidWZmZXIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFwaGljQnVmZmVyKSB7CisgICAgICAgICAgICBHcmFwaGljQnVmZmVyICpidWZmZXI7CisgICAgICAgICAgICBtZW1jcHkoJmJ1ZmZlciwgZGF0YSArIDQsIHNpemVvZihidWZmZXIpKTsKKyAgICAgICAgICAgIGlmIChidWZmZXIgIT0gY29kZWNCdWZmZXIubUdyYXBoaWNCdWZmZXIuZ2V0KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuCisgICAgICAgICAgICAgICAgQUxPR0UoImNvZGVjQnVmZmVyRW1wdGllZDogYnVmZmVyIGlzICVwLCBleHBlY3RlZCAlcCIsCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIGNvZGVjQnVmZmVyLm1HcmFwaGljQnVmZmVyLmdldCgpKTsKKyAgICAgICAgICAgICAgICBDSEVDSyghImNvZGVjQnVmZmVyRW1wdGllZDogbWlzbWF0Y2hlZCBidWZmZXIiKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMjY4LDcgKzI5MCw3IEBACiAgICAgICAgIGlmIChpZCA9PSBtTGF0ZXN0U3VibWl0dGVkQnVmZmVySWQpIHsKICAgICAgICAgICAgIENIRUNLX0dUKG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJVc2VDb3VudC0tLCAwKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1CdWZmZXJRdWV1ZS0+cmVsZWFzZUJ1ZmZlcihpZCwgY29kZWNCdWZmZXIubUZyYW1lTnVtYmVyLAorICAgICAgICAgICAgbUNvbnN1bWVyLT5yZWxlYXNlQnVmZmVyKGlkLCBjb2RlY0J1ZmZlci5tRnJhbWVOdW1iZXIsCiAgICAgICAgICAgICAgICAgICAgIEVHTF9OT19ESVNQTEFZLCBFR0xfTk9fU1lOQ19LSFIsIEZlbmNlOjpOT19GRU5DRSk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewpAQCAtMjgyLDcgKzMwNCw3IEBACiAgICAgaWYgKG1OdW1GcmFtZXNBdmFpbGFibGUpIHsKICAgICAgICAgLy8gRmlsbCB0aGlzIGNvZGVjIGJ1ZmZlci4KICAgICAgICAgQ0hFQ0soIW1FbmRPZlN0cmVhbVNlbnQpOwotICAgICAgICBBTE9HVigiYnVmZmVyIGZyZWVkLCAlZCBmcmFtZXMgYXZhaWwgKGVvcz0lZCkiLAorICAgICAgICBBTE9HVigiYnVmZmVyIGZyZWVkLCAlenUgZnJhbWVzIGF2YWlsIChlb3M9JWQpIiwKICAgICAgICAgICAgICAgICBtTnVtRnJhbWVzQXZhaWxhYmxlLCBtRW5kT2ZTdHJlYW0pOwogICAgICAgICBmaWxsQ29kZWNCdWZmZXJfbCgpOwogICAgIH0gZWxzZSBpZiAobUVuZE9mU3RyZWFtKSB7CkBAIC0zMTEsNyArMzMzLDggQEAKICAgICAgICAgc3NpemVfdCBpbmRleCA9IG1PcmlnaW5hbFRpbWVVcy5pbmRleE9mS2V5KGhlYWRlci0+blRpbWVTdGFtcCk7CiAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CiAgICAgICAgICAgICBBTE9HVigiT1VUIHRpbWVzdGFtcDogJWxsZCAtPiAlbGxkIiwKLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyLT5uVGltZVN0YW1wLCBtT3JpZ2luYWxUaW1lVXNbaW5kZXhdKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPihoZWFkZXItPm5UaW1lU3RhbXApLAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KG1PcmlnaW5hbFRpbWVVc1tpbmRleF0pKTsKICAgICAgICAgICAgIGhlYWRlci0+blRpbWVTdGFtcCA9IG1PcmlnaW5hbFRpbWVVc1tpbmRleF07CiAgICAgICAgICAgICBtT3JpZ2luYWxUaW1lVXMucmVtb3ZlSXRlbXNBdChpbmRleCk7CiAgICAgICAgIH0gZWxzZSB7CkBAIC0zMjIsNyArMzQ1LDcgQEAKICAgICAgICAgfQogICAgICAgICBpZiAobU9yaWdpbmFsVGltZVVzLnNpemUoKSA+IEJ1ZmZlclF1ZXVlOjpOVU1fQlVGRkVSX1NMT1RTKSB7CiAgICAgICAgICAgICAvLyBzb21ldGhpbmcgdGVycmlibHkgd3JvbmcgbXVzdCBoYXZlIGhhcHBlbmVkLCBnaXZpbmcgdXAuLi4KLSAgICAgICAgICAgIEFMT0dFKCJtT3JpZ2luYWxUaW1lVXMgaGFzIHRvbyBtYW55IGVudHJpZXMgKCVkKSIsCisgICAgICAgICAgICBBTE9HRSgibU9yaWdpbmFsVGltZVVzIGhhcyB0b28gbWFueSBlbnRyaWVzICglenUpIiwKICAgICAgICAgICAgICAgICAgICAgbU9yaWdpbmFsVGltZVVzLnNpemUoKSk7CiAgICAgICAgICAgICBtTWF4VGltZXN0YW1wR2FwVXMgPSAtMWxsOwogICAgICAgICB9CkBAIC0zMzcsNyArMzYwLDcgQEAKIAogICAgICAgICB3aGlsZSAobU51bUZyYW1lc0F2YWlsYWJsZSA+IDApIHsKICAgICAgICAgICAgIEJ1ZmZlclF1ZXVlOjpCdWZmZXJJdGVtIGl0ZW07Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQnVmZmVyUXVldWUtPmFjcXVpcmVCdWZmZXIoJml0ZW0sIDApOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNvbnN1bWVyLT5hY3F1aXJlQnVmZmVyKCZpdGVtLCAwKTsKIAogICAgICAgICAgICAgaWYgKGVyciA9PSBCdWZmZXJRdWV1ZTo6Tk9fQlVGRkVSX0FWQUlMQUJMRSkgewogICAgICAgICAgICAgICAgIC8vIHNob3VsZG4ndCBoYXBwZW4uCkBAIC0zNTAsNyArMzczLDcgQEAKIAogICAgICAgICAgICAgLS1tTnVtRnJhbWVzQXZhaWxhYmxlOwogCi0gICAgICAgICAgICBtQnVmZmVyUXVldWUtPnJlbGVhc2VCdWZmZXIoaXRlbS5tQnVmLCBpdGVtLm1GcmFtZU51bWJlciwKKyAgICAgICAgICAgIG1Db25zdW1lci0+cmVsZWFzZUJ1ZmZlcihpdGVtLm1CdWYsIGl0ZW0ubUZyYW1lTnVtYmVyLAogICAgICAgICAgICAgICAgICAgICBFR0xfTk9fRElTUExBWSwgRUdMX05PX1NZTkNfS0hSLCBpdGVtLm1GZW5jZSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuOwpAQCAtMzc5LDE1ICs0MDIsMTUgQEAKICAgICBpbnQgY2JpID0gZmluZEF2YWlsYWJsZUNvZGVjQnVmZmVyX2woKTsKICAgICBpZiAoY2JpIDwgMCkgewogICAgICAgICAvLyBObyBidWZmZXJzIGF2YWlsYWJsZSwgYmFpbC4KLSAgICAgICAgQUxPR1YoImZpbGxDb2RlY0J1ZmZlcl9sOiBubyBjb2RlYyBidWZmZXJzLCBhdmFpbCBub3cgJWQiLAorICAgICAgICBBTE9HVigiZmlsbENvZGVjQnVmZmVyX2w6IG5vIGNvZGVjIGJ1ZmZlcnMsIGF2YWlsIG5vdyAlenUiLAogICAgICAgICAgICAgICAgIG1OdW1GcmFtZXNBdmFpbGFibGUpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgQUxPR1YoImZpbGxDb2RlY0J1ZmZlcl9sOiBhY3F1aXJpbmcgYnVmZmVyLCBhdmFpbD0lZCIsCisgICAgQUxPR1YoImZpbGxDb2RlY0J1ZmZlcl9sOiBhY3F1aXJpbmcgYnVmZmVyLCBhdmFpbD0lenUiLAogICAgICAgICAgICAgbU51bUZyYW1lc0F2YWlsYWJsZSk7CiAgICAgQnVmZmVyUXVldWU6OkJ1ZmZlckl0ZW0gaXRlbTsKLSAgICBzdGF0dXNfdCBlcnIgPSBtQnVmZmVyUXVldWUtPmFjcXVpcmVCdWZmZXIoJml0ZW0sIDApOworICAgIHN0YXR1c190IGVyciA9IG1Db25zdW1lci0+YWNxdWlyZUJ1ZmZlcigmaXRlbSwgMCk7CiAgICAgaWYgKGVyciA9PSBCdWZmZXJRdWV1ZTo6Tk9fQlVGRkVSX0FWQUlMQUJMRSkgewogICAgICAgICAvLyBzaG91bGRuJ3QgaGFwcGVuCiAgICAgICAgIEFMT0dXKCJmaWxsQ29kZWNCdWZmZXJfbDogZnJhbWUgd2FzIG5vdCBhdmFpbGFibGUiKTsKQEAgLTQxNCwxMCArNDM3LDIxIEBACiAgICAgICAgIG1CdWZmZXJTbG90W2l0ZW0ubUJ1Zl0gPSBpdGVtLm1HcmFwaGljQnVmZmVyOwogICAgIH0KIAotICAgIGVyciA9IHN1Ym1pdEJ1ZmZlcl9sKGl0ZW0sIGNiaSk7CisgICAgZXJyID0gVU5LTk9XTl9FUlJPUjsKKworICAgIC8vIG9ubHkgc3VibWl0IHNhbXBsZSBpZiBzdGFydCB0aW1lIGlzIHVuc3BlY2lmaWVkLCBvciBzYW1wbGUKKyAgICAvLyBpcyBxdWV1ZWQgYWZ0ZXIgdGhlIHNwZWNpZmllZCBzdGFydCB0aW1lCisgICAgaWYgKG1Ta2lwRnJhbWVzQmVmb3JlTnMgPCAwbGwgfHwgaXRlbS5tVGltZXN0YW1wID49IG1Ta2lwRnJhbWVzQmVmb3JlTnMpIHsKKyAgICAgICAgLy8gaWYgc3RhcnQgdGltZSBpcyBzZXQsIG9mZnNldCB0aW1lIHN0YW1wIGJ5IHN0YXJ0IHRpbWUKKyAgICAgICAgaWYgKG1Ta2lwRnJhbWVzQmVmb3JlTnMgPiAwKSB7CisgICAgICAgICAgICBpdGVtLm1UaW1lc3RhbXAgLT0gbVNraXBGcmFtZXNCZWZvcmVOczsKKyAgICAgICAgfQorICAgICAgICBlcnIgPSBzdWJtaXRCdWZmZXJfbChpdGVtLCBjYmkpOworICAgIH0KKwogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgQUxPR1YoInN1Ym1pdEJ1ZmZlcl9sIGZhaWxlZCwgcmVsZWFzaW5nIGJxIGJ1ZiAlZCIsIGl0ZW0ubUJ1Zik7Ci0gICAgICAgIG1CdWZmZXJRdWV1ZS0+cmVsZWFzZUJ1ZmZlcihpdGVtLm1CdWYsIGl0ZW0ubUZyYW1lTnVtYmVyLAorICAgICAgICBtQ29uc3VtZXItPnJlbGVhc2VCdWZmZXIoaXRlbS5tQnVmLCBpdGVtLm1GcmFtZU51bWJlciwKICAgICAgICAgICAgICAgICBFR0xfTk9fRElTUExBWSwgRUdMX05PX1NZTkNfS0hSLCBGZW5jZTo6Tk9fRkVOQ0UpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dWKCJidWZmZXIgc3VibWl0dGVkIChicSAlZCwgY2JpICVkKSIsIGl0ZW0ubUJ1ZiwgY2JpKTsKQEAgLTQ0MCw3ICs0NzQsNyBAQAogICAgICAgICAvLwogICAgICAgICAvLyBUbyBiZSBvbiB0aGUgc2FmZSBzaWRlIHdlIHRyeSB0byByZWxlYXNlIHRoZSBidWZmZXIuCiAgICAgICAgIEFMT0dEKCJyZXBlYXRMYXRlc3RTdWJtaXR0ZWRCdWZmZXJfbDogc2xvdCB3YXMgTlVMTCIpOwotICAgICAgICBtQnVmZmVyUXVldWUtPnJlbGVhc2VCdWZmZXIoCisgICAgICAgIG1Db25zdW1lci0+cmVsZWFzZUJ1ZmZlcigKICAgICAgICAgICAgICAgICBtTGF0ZXN0U3VibWl0dGVkQnVmZmVySWQsCiAgICAgICAgICAgICAgICAgbUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlckZyYW1lTnVtLAogICAgICAgICAgICAgICAgIEVHTF9OT19ESVNQTEFZLApAQCAtNDk0LDcgKzUyOCw3IEBACiAKICAgICBpZiAobUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlcklkID49IDApIHsKICAgICAgICAgaWYgKG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJVc2VDb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICBtQnVmZmVyUXVldWUtPnJlbGVhc2VCdWZmZXIoCisgICAgICAgICAgICBtQ29uc3VtZXItPnJlbGVhc2VCdWZmZXIoCiAgICAgICAgICAgICAgICAgICAgIG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJJZCwKICAgICAgICAgICAgICAgICAgICAgbUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlckZyYW1lTnVtLAogICAgICAgICAgICAgICAgICAgICBFR0xfTk9fRElTUExBWSwKQEAgLTUyMCw3ICs1NTQsNyBAQAogCiBzdGF0dXNfdCBHcmFwaGljQnVmZmVyU291cmNlOjpzaWduYWxFbmRPZklucHV0U3RyZWFtKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOwotICAgIEFMT0dWKCJzaWduYWxFbmRPZklucHV0U3RyZWFtOiBleGVjPSVkIGF2YWlsPSVkIGVvcz0lZCIsCisgICAgQUxPR1YoInNpZ25hbEVuZE9mSW5wdXRTdHJlYW06IGV4ZWM9JWQgYXZhaWw9JXp1IGVvcz0lZCIsCiAgICAgICAgICAgICBtRXhlY3V0aW5nLCBtTnVtRnJhbWVzQXZhaWxhYmxlLCBtRW5kT2ZTdHJlYW0pOwogCiAgICAgaWYgKG1FbmRPZlN0cmVhbSkgewpAQCAtNTQ4LDcgKzU4MiwzMiBAQAogaW50NjRfdCBHcmFwaGljQnVmZmVyU291cmNlOjpnZXRUaW1lc3RhbXAoY29uc3QgQnVmZmVyUXVldWU6OkJ1ZmZlckl0ZW0gJml0ZW0pIHsKICAgICBpbnQ2NF90IHRpbWVVcyA9IGl0ZW0ubVRpbWVzdGFtcCAvIDEwMDA7CiAKLSAgICBpZiAobU1heFRpbWVzdGFtcEdhcFVzID4gMGxsKSB7CisgICAgaWYgKG1UaW1lUGVyQ2FwdHVyZVVzID4gMGxsKSB7CisgICAgICAgIC8vIFRpbWUgbGFwc2Ugb3Igc2xvdyBtb3Rpb24gbW9kZQorICAgICAgICBpZiAobVByZXZDYXB0dXJlVXMgPCAwbGwpIHsKKyAgICAgICAgICAgIC8vIGZpcnN0IGNhcHR1cmUKKyAgICAgICAgICAgIG1QcmV2Q2FwdHVyZVVzID0gdGltZVVzOworICAgICAgICAgICAgbVByZXZGcmFtZVVzID0gdGltZVVzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gc25hcCB0byBuZWFyZXN0IGNhcHR1cmUgcG9pbnQKKyAgICAgICAgICAgIGludDY0X3QgbkZyYW1lcyA9ICh0aW1lVXMgKyBtVGltZVBlckNhcHR1cmVVcyAvIDIgLSBtUHJldkNhcHR1cmVVcykKKyAgICAgICAgICAgICAgICAgICAgLyBtVGltZVBlckNhcHR1cmVVczsKKyAgICAgICAgICAgIGlmIChuRnJhbWVzIDw9IDApIHsKKyAgICAgICAgICAgICAgICAvLyBza2lwIHRoaXMgZnJhbWUgYXMgaXQncyB0b28gY2xvc2UgdG8gcHJldmlvdXMgY2FwdHVyZQorICAgICAgICAgICAgICAgIEFMT0dWKCJza2lwcGluZyBmcmFtZSwgdGltZVVzICVsbGQiLCBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KHRpbWVVcykpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QcmV2Q2FwdHVyZVVzID0gbVByZXZDYXB0dXJlVXMgKyBuRnJhbWVzICogbVRpbWVQZXJDYXB0dXJlVXM7CisgICAgICAgICAgICBtUHJldkZyYW1lVXMgKz0gbVRpbWVQZXJGcmFtZVVzICogbkZyYW1lczsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCJ0aW1lVXMgJWxsZCwgY2FwdHVyZVVzICVsbGQsIGZyYW1lVXMgJWxsZCIsCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPih0aW1lVXMpLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4obVByZXZDYXB0dXJlVXMpLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4obVByZXZGcmFtZVVzKSk7CisKKyAgICAgICAgcmV0dXJuIG1QcmV2RnJhbWVVczsKKyAgICB9IGVsc2UgaWYgKG1NYXhUaW1lc3RhbXBHYXBVcyA+IDBsbCkgewogICAgICAgICAvKiBDYXAgdGltZXN0YW1wIGdhcCBiZXR3ZWVuIGFkamFjZW50IGZyYW1lcyB0byBzcGVjaWZpZWQgbWF4CiAgICAgICAgICAqCiAgICAgICAgICAqIEluIHRoZSBzY2VuYXJpbyBvZiBjYXN0IG1pcnJvcmluZywgZW5jb2RpbmcgY291bGQgYmUgc3VzcGVuZGVkIGZvcgpAQCAtNTcyLDcgKzYzMSw5IEBACiAgICAgICAgIG1QcmV2T3JpZ2luYWxUaW1lVXMgPSBvcmlnaW5hbFRpbWVVczsKICAgICAgICAgbVByZXZNb2RpZmllZFRpbWVVcyA9IHRpbWVVczsKICAgICAgICAgbU9yaWdpbmFsVGltZVVzLmFkZCh0aW1lVXMsIG9yaWdpbmFsVGltZVVzKTsKLSAgICAgICAgQUxPR1YoIklOICB0aW1lc3RhbXA6ICVsbGQgLT4gJWxsZCIsIG9yaWdpbmFsVGltZVVzLCB0aW1lVXMpOworICAgICAgICBBTE9HVigiSU4gIHRpbWVzdGFtcDogJWxsZCAtPiAlbGxkIiwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4ob3JpZ2luYWxUaW1lVXMpLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPih0aW1lVXMpKTsKICAgICB9CiAKICAgICByZXR1cm4gdGltZVVzOwpAQCAtNTk1LDEwICs2NTYsMjIgQEAKICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSogaGVhZGVyID0gY29kZWNCdWZmZXIubUhlYWRlcjsKICAgICBDSEVDSyhoZWFkZXItPm5BbGxvY0xlbiA+PSA0ICsgc2l6ZW9mKGJ1ZmZlcl9oYW5kbGVfdCkpOwogICAgIE9NWF9VOCogZGF0YSA9IGhlYWRlci0+cEJ1ZmZlcjsKLSAgICBjb25zdCBPTVhfVTMyIHR5cGUgPSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZTsKLSAgICBidWZmZXJfaGFuZGxlX3QgaGFuZGxlID0gY29kZWNCdWZmZXIubUdyYXBoaWNCdWZmZXItPmhhbmRsZTsKLSAgICBtZW1jcHkoZGF0YSwgJnR5cGUsIDQpOwotICAgIG1lbWNweShkYXRhICsgNCwgJmhhbmRsZSwgc2l6ZW9mKGJ1ZmZlcl9oYW5kbGVfdCkpOworICAgIGJ1ZmZlcl9oYW5kbGVfdCBoYW5kbGU7CisgICAgaWYgKCFtVXNlR3JhcGhpY0J1ZmZlckluTWV0YSkgeworICAgICAgICBjb25zdCBPTVhfVTMyIHR5cGUgPSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZTsKKyAgICAgICAgaGFuZGxlID0gY29kZWNCdWZmZXIubUdyYXBoaWNCdWZmZXItPmhhbmRsZTsKKyAgICAgICAgbWVtY3B5KGRhdGEsICZ0eXBlLCA0KTsKKyAgICAgICAgbWVtY3B5KGRhdGEgKyA0LCAmaGFuZGxlLCBzaXplb2YoYnVmZmVyX2hhbmRsZV90KSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gY29kZWNCdWZmZXIgaG9sZHMgYSByZWZlcmVuY2UgdG8gdGhlIEdyYXBoaWNCdWZmZXIsIHNvCisgICAgICAgIC8vIGl0IGlzIHZhbGlkIHdoaWxlIGl0IGlzIHdpdGggdGhlIE9NWCBjb21wb25lbnQKKyAgICAgICAgY29uc3QgT01YX1UzMiB0eXBlID0ga01ldGFkYXRhQnVmZmVyVHlwZUdyYXBoaWNCdWZmZXI7CisgICAgICAgIG1lbWNweShkYXRhLCAmdHlwZSwgNCk7CisgICAgICAgIC8vIHBhc3NpbmcgYSBub24tcmVmZXJlbmNlLWNvdW50ZWQgZ3JhcGhpY0J1ZmZlcgorICAgICAgICBHcmFwaGljQnVmZmVyICpidWZmZXIgPSBjb2RlY0J1ZmZlci5tR3JhcGhpY0J1ZmZlci5nZXQoKTsKKyAgICAgICAgaGFuZGxlID0gYnVmZmVyLT5oYW5kbGU7CisgICAgICAgIG1lbWNweShkYXRhICsgNCwgJmJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworICAgIH0KIAogICAgIHN0YXR1c190IGVyciA9IG1Ob2RlSW5zdGFuY2UtPmVtcHR5RGlyZWN0QnVmZmVyKGhlYWRlciwgMCwKICAgICAgICAgICAgIDQgKyBzaXplb2YoYnVmZmVyX2hhbmRsZV90KSwgT01YX0JVRkZFUkZMQUdfRU5ET0ZGUkFNRSwKQEAgLTY4MCw3ICs3NTMsNyBAQAogdm9pZCBHcmFwaGljQnVmZmVyU291cmNlOjpvbkZyYW1lQXZhaWxhYmxlKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOwogCi0gICAgQUxPR1YoIm9uRnJhbWVBdmFpbGFibGUgZXhlYz0lZCBhdmFpbD0lZCIsCisgICAgQUxPR1YoIm9uRnJhbWVBdmFpbGFibGUgZXhlYz0lZCBhdmFpbD0lenUiLAogICAgICAgICAgICAgbUV4ZWN1dGluZywgbU51bUZyYW1lc0F2YWlsYWJsZSk7CiAKICAgICBpZiAobUVuZE9mU3RyZWFtIHx8IG1TdXNwZW5kZWQpIHsKQEAgLTY5NCwxNSArNzY3LDE1IEBACiAgICAgICAgIH0KIAogICAgICAgICBCdWZmZXJRdWV1ZTo6QnVmZmVySXRlbSBpdGVtOwotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQnVmZmVyUXVldWUtPmFjcXVpcmVCdWZmZXIoJml0ZW0sIDApOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQ29uc3VtZXItPmFjcXVpcmVCdWZmZXIoJml0ZW0sIDApOwogICAgICAgICBpZiAoZXJyID09IE9LKSB7CiAgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlJ3JlIHNlZWluZyB0aGlzIGJ1ZmZlciwgYWRkIGl0IHRvIG91cgogICAgICAgICAgICAgLy8gc2xvdCB0YWJsZS4KICAgICAgICAgICAgIGlmIChpdGVtLm1HcmFwaGljQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiZmlsbENvZGVjQnVmZmVyX2w6IHNldHRpbmcgbUJ1ZmZlclNsb3QgJWQiLCBpdGVtLm1CdWYpOworICAgICAgICAgICAgICAgIEFMT0dWKCJvbkZyYW1lQXZhaWxhYmxlOiBzZXR0aW5nIG1CdWZmZXJTbG90ICVkIiwgaXRlbS5tQnVmKTsKICAgICAgICAgICAgICAgICBtQnVmZmVyU2xvdFtpdGVtLm1CdWZdID0gaXRlbS5tR3JhcGhpY0J1ZmZlcjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdWZmZXJRdWV1ZS0+cmVsZWFzZUJ1ZmZlcihpdGVtLm1CdWYsIGl0ZW0ubUZyYW1lTnVtYmVyLAorICAgICAgICAgICAgbUNvbnN1bWVyLT5yZWxlYXNlQnVmZmVyKGl0ZW0ubUJ1ZiwgaXRlbS5tRnJhbWVOdW1iZXIsCiAgICAgICAgICAgICAgICAgICAgIEVHTF9OT19ESVNQTEFZLCBFR0xfTk9fU1lOQ19LSFIsIGl0ZW0ubUZlbmNlKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm47CkBAIC03MjIsMTMgKzc5NSwxMyBAQAogdm9pZCBHcmFwaGljQnVmZmVyU291cmNlOjpvbkJ1ZmZlcnNSZWxlYXNlZCgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwogCi0gICAgdWludDMyX3Qgc2xvdE1hc2s7Ci0gICAgaWYgKG1CdWZmZXJRdWV1ZS0+Z2V0UmVsZWFzZWRCdWZmZXJzKCZzbG90TWFzaykgIT0gTk9fRVJST1IpIHsKKyAgICB1aW50NjRfdCBzbG90TWFzazsKKyAgICBpZiAobUNvbnN1bWVyLT5nZXRSZWxlYXNlZEJ1ZmZlcnMoJnNsb3RNYXNrKSAhPSBOT19FUlJPUikgewogICAgICAgICBBTE9HVygib25CdWZmZXJzUmVsZWFzZWQ6IHVuYWJsZSB0byBnZXQgcmVsZWFzZWQgYnVmZmVyIHNldCIpOwotICAgICAgICBzbG90TWFzayA9IDB4ZmZmZmZmZmY7CisgICAgICAgIHNsb3RNYXNrID0gMHhmZmZmZmZmZmZmZmZmZmZmVUxMOwogICAgIH0KIAotICAgIEFMT0dWKCJvbkJ1ZmZlcnNSZWxlYXNlZDogMHglMDh4Iiwgc2xvdE1hc2spOworICAgIEFMT0dWKCJvbkJ1ZmZlcnNSZWxlYXNlZDogMHglMDE2IiBQUkl4NjQsIHNsb3RNYXNrKTsKIAogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQnVmZmVyUXVldWU6Ok5VTV9CVUZGRVJfU0xPVFM7IGkrKykgewogICAgICAgICBpZiAoKHNsb3RNYXNrICYgMHgwMSkgIT0gMCkgewpAQCAtNzM4LDYgKzgxMSwxMSBAQAogICAgIH0KIH0KIAorLy8gQnVmZmVyUXVldWU6OkNvbnN1bWVyTGlzdGVuZXIgY2FsbGJhY2sKK3ZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6b25TaWRlYmFuZFN0cmVhbUNoYW5nZWQoKSB7CisgICAgQUxPR19BU1NFUlQoZmFsc2UsICJHcmFwaGljQnVmZmVyU291cmNlIGNhbid0IGNvbnN1bWUgc2lkZWJhbmQgc3RyZWFtcyIpOworfQorCiBzdGF0dXNfdCBHcmFwaGljQnVmZmVyU291cmNlOjpzZXRSZXBlYXRQcmV2aW91c0ZyYW1lRGVsYXlVcygKICAgICAgICAgaW50NjRfdCByZXBlYXRBZnRlclVzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CkBAIC03NjIsNiArODQwLDI3IEBACiAKICAgICByZXR1cm4gT0s7CiB9CisKK3ZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2V0U2tpcEZyYW1lc0JlZm9yZVVzKGludDY0X3Qgc2tpcEZyYW1lc0JlZm9yZVVzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisKKyAgICBtU2tpcEZyYW1lc0JlZm9yZU5zID0KKyAgICAgICAgICAgIChza2lwRnJhbWVzQmVmb3JlVXMgPiAwKSA/IChza2lwRnJhbWVzQmVmb3JlVXMgKiAxMDAwKSA6IC0xbGw7Cit9CisKK3N0YXR1c190IEdyYXBoaWNCdWZmZXJTb3VyY2U6OnNldFRpbWVMYXBzZVVzKGludDY0X3QqIGRhdGEpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKworICAgIGlmIChtRXhlY3V0aW5nIHx8IGRhdGFbMF0gPD0gMGxsIHx8IGRhdGFbMV0gPD0gMGxsKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBtVGltZVBlckZyYW1lVXMgPSBkYXRhWzBdOworICAgIG1UaW1lUGVyQ2FwdHVyZVVzID0gZGF0YVsxXTsKKworICAgIHJldHVybiBPSzsKK30KKwogdm9pZCBHcmFwaGljQnVmZmVyU291cmNlOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKICAgICAgICAgY2FzZSBrV2hhdFJlcGVhdExhc3RGcmFtZToKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5oCmluZGV4IDNiMGU0NTQuLmMwODYwYWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuaApAQCAtNDksNyArNDksOCBAQAogY2xhc3MgR3JhcGhpY0J1ZmZlclNvdXJjZSA6IHB1YmxpYyBCdWZmZXJRdWV1ZTo6Q29uc3VtZXJMaXN0ZW5lciB7CiBwdWJsaWM6CiAgICAgR3JhcGhpY0J1ZmZlclNvdXJjZShPTVhOb2RlSW5zdGFuY2UqIG5vZGVJbnN0YW5jZSwKLSAgICAgICAgICAgIHVpbnQzMl90IGJ1ZmZlcldpZHRoLCB1aW50MzJfdCBidWZmZXJIZWlnaHQsIHVpbnQzMl90IGJ1ZmZlckNvdW50KTsKKyAgICAgICAgICAgIHVpbnQzMl90IGJ1ZmZlcldpZHRoLCB1aW50MzJfdCBidWZmZXJIZWlnaHQsIHVpbnQzMl90IGJ1ZmZlckNvdW50LAorICAgICAgICAgICAgYm9vbCB1c2VHcmFwaGljQnVmZmVySW5NZXRhID0gZmFsc2UpOwogICAgIHZpcnR1YWwgfkdyYXBoaWNCdWZmZXJTb3VyY2UoKTsKIAogICAgIC8vIFdlIGNhbid0IHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgY29uc3RydWN0b3IgZmFpbHMsIHNvIHdlIGp1c3Qgc2V0CkBAIC02MSw3ICs2Miw3IEBACiAgICAgLy8gUmV0dXJucyB0aGUgaGFuZGxlIHRvIHRoZSBwcm9kdWNlciBzaWRlIG9mIHRoZSBCdWZmZXJRdWV1ZS4gIEJ1ZmZlcnMKICAgICAvLyBxdWV1ZWQgb24gdGhpcyB3aWxsIGJlIHJlY2VpdmVkIGJ5IEdyYXBoaWNCdWZmZXJTb3VyY2UuCiAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gZ2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1CdWZmZXJRdWV1ZTsKKyAgICAgICAgcmV0dXJuIG1Qcm9kdWNlcjsKICAgICB9CiAKICAgICAvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIE9NWCB0cmFuc2l0aW9ucyB0byBPTVhfU3RhdGVFeGVjdXRpbmcsIHdoaWNoIG1lYW5zCkBAIC0xMTgsNiArMTE5LDE3IEBACiAgICAgLy8gb2Ygc3VzcGVuc2lvbiBvbiBpbnB1dC4KICAgICBzdGF0dXNfdCBzZXRNYXhUaW1lc3RhbXBHYXBVcyhpbnQ2NF90IG1heEdhcFVzKTsKIAorICAgIC8vIFNldHMgdGhlIHRpbWUgbGFwc2UgKG9yIHNsb3cgbW90aW9uKSBwYXJhbWV0ZXJzLgorICAgIC8vIGRhdGFbMF0gaXMgdGhlIHRpbWUgKHVzKSBiZXR3ZWVuIHR3byBmcmFtZXMgZm9yIHBsYXliYWNrCisgICAgLy8gZGF0YVsxXSBpcyB0aGUgdGltZSAodXMpIGJldHdlZW4gdHdvIGZyYW1lcyBmb3IgY2FwdHVyZQorICAgIC8vIFdoZW4gc2V0LCB0aGUgc2FtcGxlJ3MgdGltZXN0YW1wIHdpbGwgYmUgbW9kaWZpZWQgdG8gcGxheWJhY2sgZnJhbWVyYXRlLAorICAgIC8vIGFuZCBjYXB0dXJlIHRpbWVzdGFtcCB3aWxsIGJlIG1vZGlmaWVkIHRvIGNhcHR1cmUgcmF0ZS4KKyAgICBzdGF0dXNfdCBzZXRUaW1lTGFwc2VVcyhpbnQ2NF90KiBkYXRhKTsKKworICAgIC8vIFNldHMgdGhlIHN0YXJ0IHRpbWUgdXMgKGluIHN5c3RlbSB0aW1lKSwgc2FtcGxlcyBiZWZvcmUgd2hpY2ggc2hvdWxkCisgICAgLy8gYmUgZHJvcHBlZCBhbmQgbm90IHN1Ym1pdHRlZCB0byBlbmNvZGVyCisgICAgdm9pZCBzZXRTa2lwRnJhbWVzQmVmb3JlVXMoaW50NjRfdCBzdGFydFRpbWVVcyk7CisKIHByb3RlY3RlZDoKICAgICAvLyBCdWZmZXJRdWV1ZTo6Q29uc3VtZXJMaXN0ZW5lciBpbnRlcmZhY2UsIGNhbGxlZCB3aGVuIGEgbmV3IGZyYW1lIG9mCiAgICAgLy8gZGF0YSBpcyBhdmFpbGFibGUuICBJZiB3ZSdyZSBleGVjdXRpbmcgYW5kIGEgY29kZWMgYnVmZmVyIGlzCkBAIC0xMzIsNiArMTQ0LDExIEBACiAgICAgLy8gc2V0IG9mIG1CdWZmZXJTbG90IGVudHJpZXMuCiAgICAgdmlydHVhbCB2b2lkIG9uQnVmZmVyc1JlbGVhc2VkKCk7CiAKKyAgICAvLyBCdWZmZXJRdWV1ZTo6Q29uc3VtZXJMaXN0ZW5lciBpbnRlcmZhY2UsIGNhbGxlZCB3aGVuIHRoZSBjbGllbnQgaGFzCisgICAgLy8gY2hhbmdlZCB0aGUgc2lkZWJhbmQgc3RyZWFtLiBHcmFwaGljQnVmZmVyU291cmNlIGRvZXNuJ3QgaGFuZGxlIHNpZGViYW5kCisgICAgLy8gc3RyZWFtcyBzbyB0aGlzIGlzIGEgbm8tb3AgKGFuZCBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkKS4KKyAgICB2aXJ0dWFsIHZvaWQgb25TaWRlYmFuZFN0cmVhbUNoYW5nZWQoKTsKKwogcHJpdmF0ZToKICAgICAvLyBLZWVwIHRyYWNrIG9mIGNvZGVjIGlucHV0IGJ1ZmZlcnMuICBUaGV5IG1heSBlaXRoZXIgYmUgYXZhaWxhYmxlCiAgICAgLy8gKG1HcmFwaGljQnVmZmVyID09IE5VTEwpIG9yIGluIHVzZSBieSB0aGUgY29kZWMuCkBAIC0xOTQsOCArMjExLDExIEBACiAKICAgICBib29sIG1TdXNwZW5kZWQ7CiAKLSAgICAvLyBXZSBjb25zdW1lIGdyYXBoaWMgYnVmZmVycyBmcm9tIHRoaXMuCi0gICAgc3A8QnVmZmVyUXVldWU+IG1CdWZmZXJRdWV1ZTsKKyAgICAvLyBPdXIgQnVmZmVyUXVldWUgaW50ZXJmYWNlcy4gbVByb2R1Y2VyIGlzIHBhc3NlZCB0byB0aGUgcHJvZHVjZXIgdGhyb3VnaAorICAgIC8vIGdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIsIGFuZCBtQ29uc3VtZXIgaXMgdXNlZCBpbnRlcm5hbGx5IHRvIHJldHJpZXZlCisgICAgLy8gdGhlIGJ1ZmZlcnMgcXVldWVkIGJ5IHRoZSBwcm9kdWNlci4KKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtUHJvZHVjZXI7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gbUNvbnN1bWVyOwogCiAgICAgLy8gTnVtYmVyIG9mIGZyYW1lcyBwZW5kaW5nIGluIEJ1ZmZlclF1ZXVlIHRoYXQgaGF2ZW4ndCB5ZXQgYmVlbgogICAgIC8vIGZvcndhcmRlZCB0byB0aGUgY29kZWMuCkBAIC0yMjMsMTYgKzI0MywxNyBAQAogICAgIGVudW0gewogICAgICAgICBrUmVwZWF0TGFzdEZyYW1lQ291bnQgPSAxMCwKICAgICB9OwotICAgIGludDY0X3QgbVJlcGVhdEFmdGVyVXM7Ci0gICAgaW50NjRfdCBtTWF4VGltZXN0YW1wR2FwVXM7CiAKICAgICBLZXllZFZlY3RvcjxpbnQ2NF90LCBpbnQ2NF90PiBtT3JpZ2luYWxUaW1lVXM7CisgICAgaW50NjRfdCBtTWF4VGltZXN0YW1wR2FwVXM7CiAgICAgaW50NjRfdCBtUHJldk9yaWdpbmFsVGltZVVzOwogICAgIGludDY0X3QgbVByZXZNb2RpZmllZFRpbWVVczsKKyAgICBpbnQ2NF90IG1Ta2lwRnJhbWVzQmVmb3JlTnM7CiAKICAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOwogICAgIHNwPEFIYW5kbGVyUmVmbGVjdG9yPEdyYXBoaWNCdWZmZXJTb3VyY2U+ID4gbVJlZmxlY3RvcjsKIAorICAgIGludDY0X3QgbVJlcGVhdEFmdGVyVXM7CiAgICAgaW50MzJfdCBtUmVwZWF0TGFzdEZyYW1lR2VuZXJhdGlvbjsKICAgICBpbnQ2NF90IG1SZXBlYXRMYXN0RnJhbWVUaW1lc3RhbXA7CiAgICAgaW50MzJfdCBtUmVwZWF0TGFzdEZyYW1lQ291bnQ7CkBAIC0yNDUsNiArMjY2LDE0IEBACiAgICAgLy8gbm8gY29kZWMgYnVmZmVyIHdhcyBhdmFpbGFibGUgYXQgdGhlIHRpbWUuCiAgICAgYm9vbCBtUmVwZWF0QnVmZmVyRGVmZXJyZWQ7CiAKKyAgICAvLyBUaW1lIGxhcHNlIC8gc2xvdyBtb3Rpb24gY29uZmlndXJhdGlvbgorICAgIGludDY0X3QgbVRpbWVQZXJDYXB0dXJlVXM7CisgICAgaW50NjRfdCBtVGltZVBlckZyYW1lVXM7CisgICAgaW50NjRfdCBtUHJldkNhcHR1cmVVczsKKyAgICBpbnQ2NF90IG1QcmV2RnJhbWVVczsKKworICAgIGJvb2wgbVVzZUdyYXBoaWNCdWZmZXJJbk1ldGE7CisKICAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEdyYXBoaWNCdWZmZXJTb3VyY2UpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YLmNwcAppbmRleCBjNTJkMTg0Li4xZmFmNzI0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YLmNwcApAQCAtMTQsNiArMTQsOCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiT01YIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgpAQCAtMTk1LDcgKzE5Nyw3IEBACiAgICAgcmV0dXJuIChpbnN0YW5jZSA9PSBOVUxMID8gZmFsc2UgOiBpbnN0YW5jZS0+aXNTZWN1cmUoKSk7CiB9CiAKLWJvb2wgT01YOjpsaXZlc0xvY2FsbHkobm9kZV9pZCBub2RlLCBwaWRfdCBwaWQpIHsKK2Jvb2wgT01YOjpsaXZlc0xvY2FsbHkobm9kZV9pZCAvKiBub2RlICovLCBwaWRfdCBwaWQpIHsKICAgICByZXR1cm4gcGlkID09IGdldHBpZCgpOwogfQogCkBAIC0yNDEsNyArMjQzLDcgQEAKICAgICAgICAgICAgIGluc3RhbmNlLCAmaGFuZGxlKTsKIAogICAgIGlmIChlcnIgIT0gT01YX0Vycm9yTm9uZSkgewotICAgICAgICBBTE9HVigiRkFJTEVEIHRvIGFsbG9jYXRlIG9teCBjb21wb25lbnQgJyVzJyIsIG5hbWUpOworICAgICAgICBBTE9HRSgiRkFJTEVEIHRvIGFsbG9jYXRlIG9teCBjb21wb25lbnQgJyVzJyIsIG5hbWUpOwogCiAgICAgICAgIGluc3RhbmNlLT5vbkdldEhhbmRsZUZhaWxlZCgpOwogCkBAIC0yOTUsNiArMjk3LDcgQEAKIHN0YXR1c190IE9NWDo6Z2V0UGFyYW1ldGVyKAogICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9JTkRFWFRZUEUgaW5kZXgsCiAgICAgICAgIHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIHsKKyAgICBBTE9HVigiZ2V0UGFyYW1ldGVyKCV1ICUjeCAlcCAlemQpIiwgbm9kZSwgaW5kZXgsIHBhcmFtcywgc2l6ZSk7CiAgICAgcmV0dXJuIGZpbmRJbnN0YW5jZShub2RlKS0+Z2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgaW5kZXgsIHBhcmFtcywgc2l6ZSk7CiB9CkBAIC0zMDIsNiArMzA1LDcgQEAKIHN0YXR1c190IE9NWDo6c2V0UGFyYW1ldGVyKAogICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9JTkRFWFRZUEUgaW5kZXgsCiAgICAgICAgIGNvbnN0IHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIHsKKyAgICBBTE9HVigic2V0UGFyYW1ldGVyKCV1ICUjeCAlcCAlemQpIiwgbm9kZSwgaW5kZXgsIHBhcmFtcywgc2l6ZSk7CiAgICAgcmV0dXJuIGZpbmRJbnN0YW5jZShub2RlKS0+c2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgaW5kZXgsIHBhcmFtcywgc2l6ZSk7CiB9CkBAIC0zNDgsNiArMzUyLDEzIEBACiAgICAgICAgICAgICBwb3J0SW5kZXgsIGVuYWJsZSwgbWF4RnJhbWVXaWR0aCwgbWF4RnJhbWVIZWlnaHQpOwogfQogCitzdGF0dXNfdCBPTVg6OmNvbmZpZ3VyZVZpZGVvVHVubmVsTW9kZSgKKyAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgdHVubmVsZWQsCisgICAgICAgIE9NWF9VMzIgYXVkaW9Id1N5bmMsIG5hdGl2ZV9oYW5kbGVfdCAqKnNpZGViYW5kSGFuZGxlKSB7CisgICAgcmV0dXJuIGZpbmRJbnN0YW5jZShub2RlKS0+Y29uZmlndXJlVmlkZW9UdW5uZWxNb2RlKAorICAgICAgICAgICAgcG9ydEluZGV4LCB0dW5uZWxlZCwgYXVkaW9Id1N5bmMsIHNpZGViYW5kSGFuZGxlKTsKK30KKwogc3RhdHVzX3QgT01YOjp1c2VCdWZmZXIoCiAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBjb25zdCBzcDxJTWVtb3J5PiAmcGFyYW1zLAogICAgICAgICBidWZmZXJfaWQgKmJ1ZmZlciwgT01YX0JPT0wgY3Jvc3NQcm9jZXNzKSB7CkBAIC00MzQsOCArNDQ1LDggQEAKICAgICAgICAgT01YX0lOIE9NWF9FVkVOVFRZUEUgZUV2ZW50LAogICAgICAgICBPTVhfSU4gT01YX1UzMiBuRGF0YTEsCiAgICAgICAgIE9NWF9JTiBPTVhfVTMyIG5EYXRhMiwKLSAgICAgICAgT01YX0lOIE9NWF9QVFIgcEV2ZW50RGF0YSkgewotICAgIEFMT0dWKCJPbkV2ZW50KCVkLCAlbGQsICVsZCkiLCBlRXZlbnQsIG5EYXRhMSwgbkRhdGEyKTsKKyAgICAgICAgT01YX0lOIE9NWF9QVFIgLyogcEV2ZW50RGF0YSAqLykgeworICAgIEFMT0dWKCJPbkV2ZW50KCVkLCAlIiBQUkl1MzIiLCAlIiBQUkl1MzIgIikiLCBlRXZlbnQsIG5EYXRhMSwgbkRhdGEyKTsKIAogICAgIC8vIEZvcndhcmQgdG8gT01YTm9kZUluc3RhbmNlLgogICAgIGZpbmRJbnN0YW5jZShub2RlKS0+b25FdmVudChlRXZlbnQsIG5EYXRhMSwgbkRhdGEyKTsKQEAgLTQ1MywxMyArNDY0LDEzIEBACiB9CiAKIE9NWF9FUlJPUlRZUEUgT01YOjpPbkVtcHR5QnVmZmVyRG9uZSgKLSAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfSU4gT01YX0JVRkZFUkhFQURFUlRZUEUgKnBCdWZmZXIpIHsKKyAgICAgICAgbm9kZV9pZCBub2RlLCBidWZmZXJfaWQgYnVmZmVyLCBPTVhfSU4gT01YX0JVRkZFUkhFQURFUlRZUEUgKnBCdWZmZXIpIHsKICAgICBBTE9HVigiT25FbXB0eUJ1ZmZlckRvbmUgYnVmZmVyPSVwIiwgcEJ1ZmZlcik7CiAKICAgICBvbXhfbWVzc2FnZSBtc2c7CiAgICAgbXNnLnR5cGUgPSBvbXhfbWVzc2FnZTo6RU1QVFlfQlVGRkVSX0RPTkU7CiAgICAgbXNnLm5vZGUgPSBub2RlOwotICAgIG1zZy51LmJ1ZmZlcl9kYXRhLmJ1ZmZlciA9IHBCdWZmZXI7CisgICAgbXNnLnUuYnVmZmVyX2RhdGEuYnVmZmVyID0gYnVmZmVyOwogCiAgICAgZmluZERpc3BhdGNoZXIobm9kZSktPnBvc3QobXNnKTsKIApAQCAtNDY3LDE5ICs0NzgsMTcgQEAKIH0KIAogT01YX0VSUk9SVFlQRSBPTVg6Ok9uRmlsbEJ1ZmZlckRvbmUoCi0gICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwQnVmZmVyKSB7CisgICAgICAgIG5vZGVfaWQgbm9kZSwgYnVmZmVyX2lkIGJ1ZmZlciwgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwQnVmZmVyKSB7CiAgICAgQUxPR1YoIk9uRmlsbEJ1ZmZlckRvbmUgYnVmZmVyPSVwIiwgcEJ1ZmZlcik7CiAKICAgICBvbXhfbWVzc2FnZSBtc2c7CiAgICAgbXNnLnR5cGUgPSBvbXhfbWVzc2FnZTo6RklMTF9CVUZGRVJfRE9ORTsKICAgICBtc2cubm9kZSA9IG5vZGU7Ci0gICAgbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEuYnVmZmVyID0gcEJ1ZmZlcjsKKyAgICBtc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5idWZmZXIgPSBidWZmZXI7CiAgICAgbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEucmFuZ2Vfb2Zmc2V0ID0gcEJ1ZmZlci0+bk9mZnNldDsKICAgICBtc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5yYW5nZV9sZW5ndGggPSBwQnVmZmVyLT5uRmlsbGVkTGVuOwogICAgIG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLmZsYWdzID0gcEJ1ZmZlci0+bkZsYWdzOwogICAgIG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLnRpbWVzdGFtcCA9IHBCdWZmZXItPm5UaW1lU3RhbXA7Ci0gICAgbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEucGxhdGZvcm1fcHJpdmF0ZSA9IHBCdWZmZXItPnBQbGF0Zm9ybVByaXZhdGU7Ci0gICAgbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEuZGF0YV9wdHIgPSBwQnVmZmVyLT5wQnVmZmVyOwogCiAgICAgZmluZERpc3BhdGNoZXIobm9kZSktPnBvc3QobXNnKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmNwcAppbmRleCA2YjZkMGFiLi5hZTNjYjMzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmNwcApAQCAtOTEsNyArOTEsNyBAQAogICAgIH0KIAogICAgIGlmIChlcnIgIT0gT01YX0Vycm9yTm9Nb3JlKSB7Ci0gICAgICAgIEFMT0dFKCJPTVggcGx1Z2luIGZhaWxlZCB3LyBlcnJvciAweCUwOHggYWZ0ZXIgcmVnaXN0ZXJpbmcgJWQgIgorICAgICAgICBBTE9HRSgiT01YIHBsdWdpbiBmYWlsZWQgdy8gZXJyb3IgMHglMDh4IGFmdGVyIHJlZ2lzdGVyaW5nICV6dSAiCiAgICAgICAgICAgICAgImNvbXBvbmVudHMiLCBlcnIsIG1QbHVnaW5CeUNvbXBvbmVudE5hbWUuc2l6ZSgpKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCmluZGV4IDEyMjFlN2UuLjkyNjU1N2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCkBAIC0xMTcsMTIgKzExNywxNCBAQAogT01YTm9kZUluc3RhbmNlOjpPTVhOb2RlSW5zdGFuY2UoCiAgICAgICAgIE9NWCAqb3duZXIsIGNvbnN0IHNwPElPTVhPYnNlcnZlcj4gJm9ic2VydmVyLCBjb25zdCBjaGFyICpuYW1lKQogICAgIDogbU93bmVyKG93bmVyKSwKLSAgICAgIG1Ob2RlSUQoTlVMTCksCisgICAgICBtTm9kZUlEKDApLAogICAgICAgbUhhbmRsZShOVUxMKSwKICAgICAgIG1PYnNlcnZlcihvYnNlcnZlciksCiAgICAgICBtRHlpbmcoZmFsc2UpLAogICAgICAgbVNhaWxlZChmYWxzZSksCi0gICAgICBtUXVlcmllZFByb2hpYml0ZWRFeHRlbnNpb25zKGZhbHNlKSB7CisgICAgICBtUXVlcmllZFByb2hpYml0ZWRFeHRlbnNpb25zKGZhbHNlKSwKKyAgICAgIG1CdWZmZXJJRENvdW50KDApCit7CiAgICAgbVVzaW5nTWV0YWRhdGFbMF0gPSBmYWxzZTsKICAgICBtVXNpbmdNZXRhZGF0YVsxXSA9IGZhbHNlOwogICAgIG1Jc1NlY3VyZSA9IEFTdHJpbmcobmFtZSkuZW5kc1dpdGgoIi5zZWN1cmUiKTsKQEAgLTE3NSw2ICsxNzcsMTEgQEAKIHN0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6ZnJlZU5vZGUoT01YTWFzdGVyICptYXN0ZXIpIHsKICAgICBzdGF0aWMgaW50MzJfdCBrTWF4TnVtSXRlcmF0aW9ucyA9IDEwOwogCisgICAgLy8gZXhpdCBpZiB3ZSBoYXZlIGFscmVhZHkgZnJlZWQgdGhlIG5vZGUKKyAgICBpZiAobUhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKICAgICAvLyBUcmFuc2l0aW9uIHRoZSBub2RlIGZyb20gaXRzIGN1cnJlbnQgc3RhdGUgYWxsIHRoZSB3YXkgZG93bgogICAgIC8vIHRvICJMb2FkZWQiLgogICAgIC8vIFRoaXMgZW5zdXJlcyB0aGF0IGFsbCBhY3RpdmUgYnVmZmVycyBhcmUgcHJvcGVybHkgZnJlZWQgZXZlbgpAQCAtMjYyLDcgKzI2OSw3IEBACiAgICAgfQogCiAgICAgbU93bmVyLT5pbnZhbGlkYXRlTm9kZUlEKG1Ob2RlSUQpOwotICAgIG1Ob2RlSUQgPSBOVUxMOworICAgIG1Ob2RlSUQgPSAwOwogCiAgICAgQUxPR1YoIk9NWE5vZGVJbnN0YW5jZSBnb2luZyBhd2F5LiIpOwogICAgIGRlbGV0ZSB0aGlzOwpAQCAtMzA1LDYgKzMxMiw3IEBACiAgICAgc3RhdGljIGNvbnN0IGNoYXIgKnJlc3RyaWN0ZWRfZXh0ZW5zaW9uc1tdID0gewogICAgICAgICAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LnN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMiLAogICAgICAgICAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LnByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrIiwKKyAgICAgICAgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5jb25maWd1cmVWaWRlb1R1bm5lbE1vZGUiLAogICAgICAgICAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LnVzZUFuZHJvaWROYXRpdmVCdWZmZXIyIiwKICAgICAgICAgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC51c2VBbmRyb2lkTmF0aXZlQnVmZmVyIiwKICAgICAgICAgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5lbmFibGVBbmRyb2lkTmF0aXZlQnVmZmVycyIsCkBAIC0zMTcsOCArMzI1LDEwIEBACiAgICAgICAgICAgICB8fCAoaW5kZXggPiBPTVhfSW5kZXhWaWRlb1N0YXJ0VW51c2VkICYmIGluZGV4IDw9IE9NWF9JbmRleENvbmZpZ1ZpZGVvTmFsU2l6ZSkKICAgICAgICAgICAgIHx8IChpbmRleCA+IE9NWF9JbmRleENvbW1vblN0YXJ0VW51c2VkCiAgICAgICAgICAgICAgICAgICAgICYmIGluZGV4IDw9IE9NWF9JbmRleENvbmZpZ0NvbW1vblRyYW5zaXRpb25FZmZlY3QpCisgICAgICAgICAgICB8fCAoaW5kZXggPiAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhFeHRBdWRpb1N0YXJ0VW51c2VkCisgICAgICAgICAgICAgICAgICAgICYmIGluZGV4IDw9IChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkQWFjUHJlc2VudGF0aW9uKQogICAgICAgICAgICAgfHwgKGluZGV4ID4gKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4RXh0VmlkZW9TdGFydFVudXNlZAotICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCA8PSAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhDb25maWdWaWRlb1ZwOFJlZmVyZW5jZUZyYW1lVHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJiYgaW5kZXggPD0gKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1TbGljZVNlZ21lbnRzKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCkBAIC0zMzYsNyArMzQ2LDcgQEAKIH0KIAogc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjpnZXRQYXJhbWV0ZXIoCi0gICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgdm9pZCAqcGFyYW1zLCBzaXplX3QgLyogc2l6ZSAqLykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBpZiAoaXNQcm9oaWJpdGVkSW5kZXhfbChpbmRleCkpIHsKQEAgLTM0NSwxMiArMzU1LDEyIEBACiAgICAgfQogCiAgICAgT01YX0VSUk9SVFlQRSBlcnIgPSBPTVhfR2V0UGFyYW1ldGVyKG1IYW5kbGUsIGluZGV4LCBwYXJhbXMpOwotCisgICAgQUxPR0VfSUYoZXJyICE9IE9NWF9FcnJvck5vbmUsICJnZXRQYXJhbWV0ZXIoJWQpIEVSUk9SOiAlI3giLCBpbmRleCwgZXJyKTsKICAgICByZXR1cm4gU3RhdHVzRnJvbU9NWEVycm9yKGVycik7CiB9CiAKIHN0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6c2V0UGFyYW1ldGVyKAotICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCB2b2lkICpwYXJhbXMsIHNpemVfdCBzaXplKSB7CisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IHZvaWQgKnBhcmFtcywgc2l6ZV90IC8qIHNpemUgKi8pIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgaWYgKGlzUHJvaGliaXRlZEluZGV4X2woaW5kZXgpKSB7CkBAIC0zNjAsMTIgKzM3MCwxMiBAQAogCiAgICAgT01YX0VSUk9SVFlQRSBlcnIgPSBPTVhfU2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgbUhhbmRsZSwgaW5kZXgsIGNvbnN0X2Nhc3Q8dm9pZCAqPihwYXJhbXMpKTsKLQorICAgIEFMT0dFX0lGKGVyciAhPSBPTVhfRXJyb3JOb25lLCAic2V0UGFyYW1ldGVyKCVkKSBFUlJPUjogJSN4IiwgaW5kZXgsIGVycik7CiAgICAgcmV0dXJuIFN0YXR1c0Zyb21PTVhFcnJvcihlcnIpOwogfQogCiBzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OmdldENvbmZpZygKLSAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgdm9pZCAqcGFyYW1zLCBzaXplX3Qgc2l6ZSkgeworICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCB2b2lkICpwYXJhbXMsIHNpemVfdCAvKiBzaXplICovKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIGlmIChpc1Byb2hpYml0ZWRJbmRleF9sKGluZGV4KSkgewpAQCAtMzc4LDcgKzM4OCw3IEBACiB9CiAKIHN0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6c2V0Q29uZmlnKAotICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCB2b2lkICpwYXJhbXMsIHNpemVfdCBzaXplKSB7CisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IHZvaWQgKnBhcmFtcywgc2l6ZV90IC8qIHNpemUgKi8pIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgaWYgKGlzUHJvaGliaXRlZEluZGV4X2woaW5kZXgpKSB7CkBAIC00NzksMTIgKzQ4OSwxNiBAQAogICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwKICAgICAgICAgT01YX0JPT0wgZW5hYmxlKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKLSAgICByZXR1cm4gc3RvcmVNZXRhRGF0YUluQnVmZmVyc19sKHBvcnRJbmRleCwgZW5hYmxlKTsKKyAgICByZXR1cm4gc3RvcmVNZXRhRGF0YUluQnVmZmVyc19sKAorICAgICAgICAgICAgcG9ydEluZGV4LCBlbmFibGUsCisgICAgICAgICAgICBPTVhfRkFMU0UgLyogdXNlR3JhcGhpY0J1ZmZlciAqLywgTlVMTCAvKiB1c2luZ0dyYXBoaWNCdWZmZXJJbk1ldGFkYXRhICovKTsKIH0KIAogc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjpzdG9yZU1ldGFEYXRhSW5CdWZmZXJzX2woCiAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LAotICAgICAgICBPTVhfQk9PTCBlbmFibGUpIHsKKyAgICAgICAgT01YX0JPT0wgZW5hYmxlLAorICAgICAgICBPTVhfQk9PTCB1c2VHcmFwaGljQnVmZmVyLAorICAgICAgICBPTVhfQk9PTCAqdXNpbmdHcmFwaGljQnVmZmVySW5NZXRhZGF0YSkgewogICAgIGlmIChtU2FpbGVkKSB7CiAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjk0MjIwMjAiKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtNDk4LDEwICs1MTIsMjUgQEAKICAgICBPTVhfU1RSSU5HIG5hbWUgPSBjb25zdF9jYXN0PE9NWF9TVFJJTkc+KAogICAgICAgICAgICAgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5zdG9yZU1ldGFEYXRhSW5CdWZmZXJzIik7CiAKLSAgICBPTVhfRVJST1JUWVBFIGVyciA9IE9NWF9HZXRFeHRlbnNpb25JbmRleChtSGFuZGxlLCBuYW1lLCAmaW5kZXgpOworICAgIE9NWF9TVFJJTkcgZ3JhcGhpY0J1ZmZlck5hbWUgPSBjb25zdF9jYXN0PE9NWF9TVFJJTkc+KAorICAgICAgICAgICAgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5zdG9yZUdyYXBoaWNCdWZmZXJJbk1ldGFEYXRhIik7CisgICAgaWYgKHVzaW5nR3JhcGhpY0J1ZmZlckluTWV0YWRhdGEgPT0gTlVMTCkgeworICAgICAgICB1c2luZ0dyYXBoaWNCdWZmZXJJbk1ldGFkYXRhID0gJnVzZUdyYXBoaWNCdWZmZXI7CisgICAgfQorCisgICAgT01YX0VSUk9SVFlQRSBlcnIgPQorICAgICAgICAodXNlR3JhcGhpY0J1ZmZlciAmJiBwb3J0SW5kZXggPT0ga1BvcnRJbmRleElucHV0KQorICAgICAgICAgICAgICAgID8gT01YX0dldEV4dGVuc2lvbkluZGV4KG1IYW5kbGUsIGdyYXBoaWNCdWZmZXJOYW1lLCAmaW5kZXgpCisgICAgICAgICAgICAgICAgOiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgaWYgKGVyciA9PSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICp1c2luZ0dyYXBoaWNCdWZmZXJJbk1ldGFkYXRhID0gT01YX1RSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKnVzaW5nR3JhcGhpY0J1ZmZlckluTWV0YWRhdGEgPSBPTVhfRkFMU0U7CisgICAgICAgIGVyciA9IE9NWF9HZXRFeHRlbnNpb25JbmRleChtSGFuZGxlLCBuYW1lLCAmaW5kZXgpOworICAgIH0KKwogICAgIGlmIChlcnIgIT0gT01YX0Vycm9yTm9uZSkgewogICAgICAgICBBTE9HRSgiT01YX0dldEV4dGVuc2lvbkluZGV4ICVzIGZhaWxlZCIsIG5hbWUpOwotCiAgICAgICAgIHJldHVybiBTdGF0dXNGcm9tT01YRXJyb3IoZXJyKTsKICAgICB9CiAKQEAgLTUxNiw2ICs1NDUsNyBAQAogICAgIHBhcmFtcy5iU3RvcmVNZXRhRGF0YSA9IGVuYWJsZTsKICAgICBpZiAoKGVyciA9IE9NWF9TZXRQYXJhbWV0ZXIobUhhbmRsZSwgaW5kZXgsICZwYXJhbXMpKSAhPSBPTVhfRXJyb3JOb25lKSB7CiAgICAgICAgIEFMT0dFKCJPTVhfU2V0UGFyYW1ldGVyKCkgZmFpbGVkIGZvciBTdG9yZU1ldGFEYXRhSW5CdWZmZXJzOiAweCUwOHgiLCBlcnIpOworICAgICAgICAqdXNpbmdHcmFwaGljQnVmZmVySW5NZXRhZGF0YSA9IE9NWF9GQUxTRTsKICAgICAgICAgaWYgKGVuYWJsZSkgewogICAgICAgICAgICAgbVVzaW5nTWV0YWRhdGFbcG9ydEluZGV4XSA9IGZhbHNlOwogICAgICAgICB9CkBAIC01NjQsNiArNTk0LDUzIEBACiAgICAgcmV0dXJuIGVycjsKIH0KIAorc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjpjb25maWd1cmVWaWRlb1R1bm5lbE1vZGUoCisgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBPTVhfQk9PTCB0dW5uZWxlZCwgT01YX1UzMiBhdWRpb0h3U3luYywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqc2lkZWJhbmRIYW5kbGUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOworICAgIGlmIChtU2FpbGVkKSB7CisgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjk0MjIwMjAiKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIE9NWF9JTkRFWFRZUEUgaW5kZXg7CisgICAgT01YX1NUUklORyBuYW1lID0gY29uc3RfY2FzdDxPTVhfU1RSSU5HPigKKyAgICAgICAgICAgICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguY29uZmlndXJlVmlkZW9UdW5uZWxNb2RlIik7CisKKyAgICBPTVhfRVJST1JUWVBFIGVyciA9IE9NWF9HZXRFeHRlbnNpb25JbmRleChtSGFuZGxlLCBuYW1lLCAmaW5kZXgpOworICAgIGlmIChlcnIgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBBTE9HRSgiY29uZmlndXJlVmlkZW9UdW5uZWxNb2RlIGV4dGVuc2lvbiBpcyBtaXNzaW5nISIpOworICAgICAgICByZXR1cm4gU3RhdHVzRnJvbU9NWEVycm9yKGVycik7CisgICAgfQorCisgICAgQ29uZmlndXJlVmlkZW9UdW5uZWxNb2RlUGFyYW1zIHR1bm5lbFBhcmFtczsKKyAgICB0dW5uZWxQYXJhbXMublNpemUgPSBzaXplb2YodHVubmVsUGFyYW1zKTsKKyAgICB0dW5uZWxQYXJhbXMublZlcnNpb24ucy5uVmVyc2lvbk1ham9yID0gMTsKKyAgICB0dW5uZWxQYXJhbXMublZlcnNpb24ucy5uVmVyc2lvbk1pbm9yID0gMDsKKyAgICB0dW5uZWxQYXJhbXMublZlcnNpb24ucy5uUmV2aXNpb24gPSAwOworICAgIHR1bm5lbFBhcmFtcy5uVmVyc2lvbi5zLm5TdGVwID0gMDsKKworICAgIHR1bm5lbFBhcmFtcy5uUG9ydEluZGV4ID0gcG9ydEluZGV4OworICAgIHR1bm5lbFBhcmFtcy5iVHVubmVsZWQgPSB0dW5uZWxlZDsKKyAgICB0dW5uZWxQYXJhbXMubkF1ZGlvSHdTeW5jID0gYXVkaW9Id1N5bmM7CisgICAgZXJyID0gT01YX1NldFBhcmFtZXRlcihtSGFuZGxlLCBpbmRleCwgJnR1bm5lbFBhcmFtcyk7CisgICAgaWYgKGVyciAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIEFMT0dFKCJjb25maWd1cmVWaWRlb1R1bm5lbE1vZGUgZmFpbGVkISAoZXJyICVkKS4iLCBlcnIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBlcnIgPSBPTVhfR2V0UGFyYW1ldGVyKG1IYW5kbGUsIGluZGV4LCAmdHVubmVsUGFyYW1zKTsKKyAgICBpZiAoZXJyICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgQUxPR0UoIkdldFZpZGVvVHVubmVsV2luZG93IGZhaWxlZCEgKGVyciAlZCkuIiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIGlmIChzaWRlYmFuZEhhbmRsZSkgeworICAgICAgICAqc2lkZWJhbmRIYW5kbGUgPSAobmF0aXZlX2hhbmRsZV90Kil0dW5uZWxQYXJhbXMucFNpZGViYW5kV2luZG93OworICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKIHN0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6dXNlQnVmZmVyKAogICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgY29uc3Qgc3A8SU1lbW9yeT4gJnBhcmFtcywKICAgICAgICAgT01YOjpidWZmZXJfaWQgKmJ1ZmZlciwgT01YX0JPT0wgY3Jvc3NQcm9jZXNzKSB7CkBAIC02MTMsNyArNjkwLDcgQEAKIAogICAgIENIRUNLX0VRKGhlYWRlci0+cEFwcFByaXZhdGUsIGJ1ZmZlcl9tZXRhKTsKIAotICAgICpidWZmZXIgPSBoZWFkZXI7CisgICAgKmJ1ZmZlciA9IG1ha2VCdWZmZXJJRChoZWFkZXIpOwogCiAgICAgYWRkQWN0aXZlQnVmZmVyKHBvcnRJbmRleCwgKmJ1ZmZlcik7CiAKQEAgLTY2OSw3ICs3NDYsNyBAQAogICAgIENIRUNLX0VRKGhlYWRlci0+cEJ1ZmZlciwgYnVmZmVySGFuZGxlKTsKICAgICBDSEVDS19FUShoZWFkZXItPnBBcHBQcml2YXRlLCBidWZmZXJNZXRhKTsKIAotICAgICpidWZmZXIgPSBoZWFkZXI7CisgICAgKmJ1ZmZlciA9IG1ha2VCdWZmZXJJRChoZWFkZXIpOwogCiAgICAgYWRkQWN0aXZlQnVmZmVyKHBvcnRJbmRleCwgKmJ1ZmZlcik7CiAKQEAgLTczMyw3ICs4MTAsNyBAQAogCiAgICAgQ0hFQ0tfRVEoaGVhZGVyLT5wQXBwUHJpdmF0ZSwgYnVmZmVyTWV0YSk7CiAKLSAgICAqYnVmZmVyID0gaGVhZGVyOworICAgICpidWZmZXIgPSBtYWtlQnVmZmVySUQoaGVhZGVyKTsKIAogICAgIGFkZEFjdGl2ZUJ1ZmZlcihwb3J0SW5kZXgsICpidWZmZXIpOwogCkBAIC03NDUsMTUgKzgyMiwxMyBAQAogICAgICAgICBPTVg6OmJ1ZmZlcl9pZCBidWZmZXIpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCi0gICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciA9IChPTVhfQlVGRkVSSEVBREVSVFlQRSAqKShidWZmZXIpOworICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIgPSBmaW5kQnVmZmVySGVhZGVyKGJ1ZmZlciwgcG9ydEluZGV4KTsKKyAgICBpZiAoaGVhZGVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CiAgICAgVmlkZW9EZWNvZGVyT3V0cHV0TWV0YURhdGEgKm1ldGFkYXRhID0KICAgICAgICAgKFZpZGVvRGVjb2Rlck91dHB1dE1ldGFEYXRhICopKGhlYWRlci0+cEJ1ZmZlcik7CiAgICAgQnVmZmVyTWV0YSAqYnVmZmVyTWV0YSA9IChCdWZmZXJNZXRhICopKGhlYWRlci0+cEFwcFByaXZhdGUpOwotICAgIGlmIChidWZmZXJNZXRhLT5nZXRQb3J0SW5kZXgoKSAhPSBwb3J0SW5kZXgpIHsKLSAgICAgICAgQUxPR1coImJ1ZmZlciAldSBoYXMgYW4gaW5jb3JyZWN0IHBvcnQgaW5kZXguIiwgYnVmZmVyKTsKLSAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyODgxNjgyNyIpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9CiAgICAgYnVmZmVyTWV0YS0+c2V0R3JhcGhpY0J1ZmZlcihncmFwaGljQnVmZmVyKTsKICAgICBtZXRhZGF0YS0+ZVR5cGUgPSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZTsKICAgICBtZXRhZGF0YS0+cEhhbmRsZSA9IGdyYXBoaWNCdWZmZXItPmhhbmRsZTsKQEAgLTc4MSw3ICs4NTYsMTAgQEAKICAgICB9CiAKICAgICAvLyBJbnB1dCBidWZmZXJzIHdpbGwgaG9sZCBtZXRhLWRhdGEgKGdyYWxsb2MgcmVmZXJlbmNlcykuCi0gICAgZXJyID0gc3RvcmVNZXRhRGF0YUluQnVmZmVyc19sKHBvcnRJbmRleCwgT01YX1RSVUUpOworICAgIE9NWF9CT09MIHVzaW5nR3JhcGhpY0J1ZmZlciA9IE9NWF9GQUxTRTsKKyAgICBlcnIgPSBzdG9yZU1ldGFEYXRhSW5CdWZmZXJzX2woCisgICAgICAgICAgICBwb3J0SW5kZXgsIE9NWF9UUlVFLAorICAgICAgICAgICAgT01YX1RSVUUgLyogdXNlR3JhcGhpY0J1ZmZlciAqLywgJnVzaW5nR3JhcGhpY0J1ZmZlcik7CiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KQEAgLTgwNyw3ICs4ODUsNyBAQAogCiAgICAgR3JhcGhpY0J1ZmZlclNvdXJjZSogYnVmZmVyU291cmNlID0gbmV3IEdyYXBoaWNCdWZmZXJTb3VyY2UoCiAgICAgICAgICAgICB0aGlzLCBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoLCBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCwKLSAgICAgICAgICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwpOworICAgICAgICAgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCwgdXNpbmdHcmFwaGljQnVmZmVyKTsKICAgICBpZiAoKGVyciA9IGJ1ZmZlclNvdXJjZS0+aW5pdENoZWNrKCkpICE9IE9LKSB7CiAgICAgICAgIGRlbGV0ZSBidWZmZXJTb3VyY2U7CiAgICAgICAgIHJldHVybiBlcnI7CkBAIC04NTcsNyArOTM1LDcgQEAKIAogICAgIENIRUNLX0VRKGhlYWRlci0+cEFwcFByaXZhdGUsIGJ1ZmZlcl9tZXRhKTsKIAotICAgICpidWZmZXIgPSBoZWFkZXI7CisgICAgKmJ1ZmZlciA9IG1ha2VCdWZmZXJJRChoZWFkZXIpOwogICAgICpidWZmZXJfZGF0YSA9IGhlYWRlci0+cEJ1ZmZlcjsKIAogICAgIGFkZEFjdGl2ZUJ1ZmZlcihwb3J0SW5kZXgsICpidWZmZXIpOwpAQCAtOTA4LDcgKzk4Niw3IEBACiAKICAgICBDSEVDS19FUShoZWFkZXItPnBBcHBQcml2YXRlLCBidWZmZXJfbWV0YSk7CiAKLSAgICAqYnVmZmVyID0gaGVhZGVyOworICAgICpidWZmZXIgPSBtYWtlQnVmZmVySUQoaGVhZGVyKTsKIAogICAgIGFkZEFjdGl2ZUJ1ZmZlcihwb3J0SW5kZXgsICpidWZmZXIpOwogCkBAIC05MjYsMTggKzEwMDQsMTcgQEAKIAogICAgIHJlbW92ZUFjdGl2ZUJ1ZmZlcihwb3J0SW5kZXgsIGJ1ZmZlcik7CiAKLSAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyID0gKE9NWF9CVUZGRVJIRUFERVJUWVBFICopYnVmZmVyOwotICAgIEJ1ZmZlck1ldGEgKmJ1ZmZlcl9tZXRhID0gc3RhdGljX2Nhc3Q8QnVmZmVyTWV0YSAqPihoZWFkZXItPnBBcHBQcml2YXRlKTsKLSAgICBpZiAoYnVmZmVyX21ldGEtPmdldFBvcnRJbmRleCgpICE9IHBvcnRJbmRleCkgewotICAgICAgICBBTE9HVygiYnVmZmVyICV1IGhhcyBhbiBpbmNvcnJlY3QgcG9ydCBpbmRleC4iLCBidWZmZXIpOwotICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI4ODE2ODI3Iik7Ci0gICAgICAgIC8vIGNvbnRpbnVlIGZyZWVpbmcKKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyID0gZmluZEJ1ZmZlckhlYWRlcihidWZmZXIsIHBvcnRJbmRleCk7CisgICAgaWYgKGhlYWRlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQorICAgIEJ1ZmZlck1ldGEgKmJ1ZmZlcl9tZXRhID0gc3RhdGljX2Nhc3Q8QnVmZmVyTWV0YSAqPihoZWFkZXItPnBBcHBQcml2YXRlKTsKIAogICAgIE9NWF9FUlJPUlRZUEUgZXJyID0gT01YX0ZyZWVCdWZmZXIobUhhbmRsZSwgcG9ydEluZGV4LCBoZWFkZXIpOwogCiAgICAgZGVsZXRlIGJ1ZmZlcl9tZXRhOwogICAgIGJ1ZmZlcl9tZXRhID0gTlVMTDsKKyAgICBpbnZhbGlkYXRlQnVmZmVySUQoYnVmZmVyKTsKIAogICAgIHJldHVybiBTdGF0dXNGcm9tT01YRXJyb3IoZXJyKTsKIH0KQEAgLTk0NSwxOCArMTAyMiwxNCBAQAogc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjpmaWxsQnVmZmVyKE9NWDo6YnVmZmVyX2lkIGJ1ZmZlcikgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKLSAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyID0gKE9NWF9CVUZGRVJIRUFERVJUWVBFICopYnVmZmVyOworICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIgPSBmaW5kQnVmZmVySGVhZGVyKGJ1ZmZlciwga1BvcnRJbmRleE91dHB1dCk7CisgICAgaWYgKGhlYWRlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQogICAgIGhlYWRlci0+bkZpbGxlZExlbiA9IDA7CiAgICAgaGVhZGVyLT5uT2Zmc2V0ID0gMDsKICAgICBoZWFkZXItPm5GbGFncyA9IDA7CiAKLSAgICBCdWZmZXJNZXRhICpidWZmZXJfbWV0YSA9IHN0YXRpY19jYXN0PEJ1ZmZlck1ldGEgKj4oaGVhZGVyLT5wQXBwUHJpdmF0ZSk7Ci0gICAgaWYgKGJ1ZmZlcl9tZXRhLT5nZXRQb3J0SW5kZXgoKSAhPSBrUG9ydEluZGV4T3V0cHV0KSB7Ci0gICAgICAgIEFMT0dXKCJidWZmZXIgJXUgaGFzIGFuIGluY29ycmVjdCBwb3J0IGluZGV4LiIsIGJ1ZmZlcik7Ci0gICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjg4MTY4MjciKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCiAgICAgT01YX0VSUk9SVFlQRSBlcnIgPSBPTVhfRmlsbFRoaXNCdWZmZXIobUhhbmRsZSwgaGVhZGVyKTsKIAogICAgIHJldHVybiBTdGF0dXNGcm9tT01YRXJyb3IoZXJyKTsKQEAgLTk2OCwxNCArMTA0MSwxMyBAQAogICAgICAgICBPTVhfVTMyIGZsYWdzLCBPTVhfVElDS1MgdGltZXN0YW1wKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAotICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIgPSAoT01YX0JVRkZFUkhFQURFUlRZUEUgKilidWZmZXI7Ci0KICAgICAvLyBubyBlbXB0eWJ1ZmZlciBpZiB1c2luZyBpbnB1dCBzdXJmYWNlCiAgICAgaWYgKGdldEdyYXBoaWNCdWZmZXJTb3VyY2UoKSAhPSBOVUxMKSB7CiAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjk0MjIwMjAiKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAorICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIgPSBmaW5kQnVmZmVySGVhZGVyKGJ1ZmZlciwga1BvcnRJbmRleElucHV0KTsKICAgICAvLyByYW5nZUxlbmd0aCBhbmQgcmFuZ2VPZmZzZXQgbXVzdCBiZSBhIHN1YnNldCBvZiB0aGUgYWxsb2NhdGVkIGRhdGEgaW4gdGhlIGJ1ZmZlci4KICAgICAvLyBjb3JuZXIgY2FzZTogd2UgcGVybWl0IHJhbmdlT2Zmc2V0ID09IGVuZC1vZi1idWZmZXIgd2l0aCByYW5nZUxlbmd0aCA9PSAwLgogICAgIGlmIChoZWFkZXIgPT0gTlVMTApAQCAtOTkwLDExICsxMDYyLDYgQEAKIAogICAgIEJ1ZmZlck1ldGEgKmJ1ZmZlcl9tZXRhID0KICAgICAgICAgc3RhdGljX2Nhc3Q8QnVmZmVyTWV0YSAqPihoZWFkZXItPnBBcHBQcml2YXRlKTsKLSAgICBpZiAoYnVmZmVyX21ldGEtPmdldFBvcnRJbmRleCgpICE9IGtQb3J0SW5kZXhJbnB1dCkgewotICAgICAgICBBTE9HVygiYnVmZmVyICV1IGhhcyBhbiBpbmNvcnJlY3QgcG9ydCBpbmRleC4iLCBidWZmZXIpOwotICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI4ODE2ODI3Iik7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KICAgICBidWZmZXJfbWV0YS0+Q29weVRvT01YKGhlYWRlcik7CiAKICAgICBPTVhfRVJST1JUWVBFIGVyciA9IE9NWF9FbXB0eVRoaXNCdWZmZXIobUhhbmRsZSwgaGVhZGVyKTsKQEAgLTEwNDEsNiArMTEwOCw4IEBACiAgICAgICAgIGNhc2UgSU9NWDo6SU5URVJOQUxfT1BUSU9OX1NVU1BFTkQ6CiAgICAgICAgIGNhc2UgSU9NWDo6SU5URVJOQUxfT1BUSU9OX1JFUEVBVF9QUkVWSU9VU19GUkFNRV9ERUxBWToKICAgICAgICAgY2FzZSBJT01YOjpJTlRFUk5BTF9PUFRJT05fTUFYX1RJTUVTVEFNUF9HQVA6CisgICAgICAgIGNhc2UgSU9NWDo6SU5URVJOQUxfT1BUSU9OX1NUQVJUX1RJTUU6CisgICAgICAgIGNhc2UgSU9NWDo6SU5URVJOQUxfT1BUSU9OX1RJTUVfTEFQU0U6CiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+ICZidWZmZXJTb3VyY2UgPQogICAgICAgICAgICAgICAgIGdldEdyYXBoaWNCdWZmZXJTb3VyY2UoKTsKQEAgLTEwNjUsNyArMTEzNCw4IEBACiAgICAgICAgICAgICAgICAgaW50NjRfdCBkZWxheVVzID0gKihpbnQ2NF90ICopZGF0YTsKIAogICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXJTb3VyY2UtPnNldFJlcGVhdFByZXZpb3VzRnJhbWVEZWxheVVzKGRlbGF5VXMpOwotICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PQorICAgICAgICAgICAgICAgICAgICBJT01YOjpJTlRFUk5BTF9PUFRJT05fTUFYX1RJTUVTVEFNUF9HQVApewogICAgICAgICAgICAgICAgIGlmIChzaXplICE9IHNpemVvZihpbnQ2NF90KSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICAgICAgfQpAQCAtMTA3Myw2ICsxMTQzLDIwIEBACiAgICAgICAgICAgICAgICAgaW50NjRfdCBtYXhHYXBVcyA9ICooaW50NjRfdCAqKWRhdGE7CiAKICAgICAgICAgICAgICAgICByZXR1cm4gYnVmZmVyU291cmNlLT5zZXRNYXhUaW1lc3RhbXBHYXBVcyhtYXhHYXBVcyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gSU9NWDo6SU5URVJOQUxfT1BUSU9OX1NUQVJUX1RJTUUpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSAhPSBzaXplb2YoaW50NjRfdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludDY0X3Qgc2tpcEZyYW1lc0JlZm9yZVVzID0gKihpbnQ2NF90ICopZGF0YTsKKworICAgICAgICAgICAgICAgIGJ1ZmZlclNvdXJjZS0+c2V0U2tpcEZyYW1lc0JlZm9yZVVzKHNraXBGcmFtZXNCZWZvcmVVcyk7CisgICAgICAgICAgICB9IGVsc2UgeyAvLyBJT01YOjpJTlRFUk5BTF9PUFRJT05fVElNRV9MQVBTRQorICAgICAgICAgICAgICAgIGlmIChzaXplICE9IHNpemVvZihpbnQ2NF90KSAqIDIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ1ZmZlclNvdXJjZS0+c2V0VGltZUxhcHNlVXMoKGludDY0X3QgKilkYXRhKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcmV0dXJuIE9LOwpAQCAtMTA4OCwxNyArMTE3MiwxNSBAQAogCiAgICAgaWYgKG1zZy50eXBlID09IG9teF9tZXNzYWdlOjpGSUxMX0JVRkZFUl9ET05FKSB7CiAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZmZXIgPQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8T01YX0JVRkZFUkhFQURFUlRZUEUgKj4oCi0gICAgICAgICAgICAgICAgICAgIG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLmJ1ZmZlcik7CisgICAgICAgICAgICBmaW5kQnVmZmVySGVhZGVyKG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLmJ1ZmZlciwga1BvcnRJbmRleE91dHB1dCk7CisgICAgICAgIGlmIChidWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAKICAgICAgICAgQnVmZmVyTWV0YSAqYnVmZmVyX21ldGEgPQogICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QnVmZmVyTWV0YSAqPihidWZmZXItPnBBcHBQcml2YXRlKTsKLSAgICAgICAgaWYgKGJ1ZmZlcl9tZXRhLT5nZXRQb3J0SW5kZXgoKSAhPSBrUG9ydEluZGV4T3V0cHV0KSB7Ci0gICAgICAgICAgICBBTE9HVygiYnVmZmVyICV1IGhhcyBhbiBpbmNvcnJlY3QgcG9ydCBpbmRleC4iLCBidWZmZXIpOwotICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyODgxNjgyNyIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnVmZmVyX21ldGEtPkNvcHlGcm9tT01YKGJ1ZmZlcik7Ci0gICAgICAgIH0KKworICAgICAgICBidWZmZXJfbWV0YS0+Q29weUZyb21PTVgoYnVmZmVyKTsKIAogICAgICAgICBpZiAoYnVmZmVyU291cmNlICE9IE5VTEwpIHsKICAgICAgICAgICAgIC8vIGZpeCB1cCB0aGUgYnVmZmVyIGluZm8gKGVzcGVjaWFsbHkgdGltZXN0YW1wKSBpZiBuZWVkZWQKQEAgLTExMTgsOCArMTIwMCwxMCBAQAogICAgICAgICAgICAgLy8gYmUgdmVyeSBjb25mdXNlZC4KIAogICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlciA9Ci0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8T01YX0JVRkZFUkhFQURFUlRZUEUgKj4oCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2cudS5idWZmZXJfZGF0YS5idWZmZXIpOworICAgICAgICAgICAgICAgIGZpbmRCdWZmZXJIZWFkZXIobXNnLnUuYnVmZmVyX2RhdGEuYnVmZmVyLCBrUG9ydEluZGV4SW5wdXQpOworICAgICAgICAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBidWZmZXJTb3VyY2UtPmNvZGVjQnVmZmVyRW1wdGllZChidWZmZXIpOwogICAgICAgICAgICAgcmV0dXJuOwpAQCAtMTE2Myw3ICsxMjQ3LDcgQEAKIAogLy8gc3RhdGljCiBPTVhfRVJST1JUWVBFIE9NWE5vZGVJbnN0YW5jZTo6T25FdmVudCgKLSAgICAgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSAvKiBoQ29tcG9uZW50ICovLAogICAgICAgICBPTVhfSU4gT01YX1BUUiBwQXBwRGF0YSwKICAgICAgICAgT01YX0lOIE9NWF9FVkVOVFRZUEUgZUV2ZW50LAogICAgICAgICBPTVhfSU4gT01YX1UzMiBuRGF0YTEsCkBAIC0xMTc5LDI2ICsxMjYzLDI4IEBACiAKIC8vIHN0YXRpYwogT01YX0VSUk9SVFlQRSBPTVhOb2RlSW5zdGFuY2U6Ok9uRW1wdHlCdWZmZXJEb25lKAotICAgICAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICAgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIC8qIGhDb21wb25lbnQgKi8sCiAgICAgICAgIE9NWF9JTiBPTVhfUFRSIHBBcHBEYXRhLAogICAgICAgICBPTVhfSU4gT01YX0JVRkZFUkhFQURFUlRZUEUqIHBCdWZmZXIpIHsKICAgICBPTVhOb2RlSW5zdGFuY2UgKmluc3RhbmNlID0gc3RhdGljX2Nhc3Q8T01YTm9kZUluc3RhbmNlICo+KHBBcHBEYXRhKTsKICAgICBpZiAoaW5zdGFuY2UtPm1EeWluZykgewogICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICB9Ci0gICAgcmV0dXJuIGluc3RhbmNlLT5vd25lcigpLT5PbkVtcHR5QnVmZmVyRG9uZShpbnN0YW5jZS0+bm9kZUlEKCksIHBCdWZmZXIpOworICAgIHJldHVybiBpbnN0YW5jZS0+b3duZXIoKS0+T25FbXB0eUJ1ZmZlckRvbmUoaW5zdGFuY2UtPm5vZGVJRCgpLAorICAgICAgICAgICAgaW5zdGFuY2UtPmZpbmRCdWZmZXJJRChwQnVmZmVyKSwgcEJ1ZmZlcik7CiB9CiAKIC8vIHN0YXRpYwogT01YX0VSUk9SVFlQRSBPTVhOb2RlSW5zdGFuY2U6Ok9uRmlsbEJ1ZmZlckRvbmUoCi0gICAgICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgICAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgLyogaENvbXBvbmVudCAqLywKICAgICAgICAgT01YX0lOIE9NWF9QVFIgcEFwcERhdGEsCiAgICAgICAgIE9NWF9JTiBPTVhfQlVGRkVSSEVBREVSVFlQRSogcEJ1ZmZlcikgewogICAgIE9NWE5vZGVJbnN0YW5jZSAqaW5zdGFuY2UgPSBzdGF0aWNfY2FzdDxPTVhOb2RlSW5zdGFuY2UgKj4ocEFwcERhdGEpOwogICAgIGlmIChpbnN0YW5jZS0+bUR5aW5nKSB7CiAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgIH0KLSAgICByZXR1cm4gaW5zdGFuY2UtPm93bmVyKCktPk9uRmlsbEJ1ZmZlckRvbmUoaW5zdGFuY2UtPm5vZGVJRCgpLCBwQnVmZmVyKTsKKyAgICByZXR1cm4gaW5zdGFuY2UtPm93bmVyKCktPk9uRmlsbEJ1ZmZlckRvbmUoaW5zdGFuY2UtPm5vZGVJRCgpLAorICAgICAgICAgICAgaW5zdGFuY2UtPmZpbmRCdWZmZXJJRChwQnVmZmVyKSwgcEJ1ZmZlcik7CiB9CiAKIHZvaWQgT01YTm9kZUluc3RhbmNlOjphZGRBY3RpdmVCdWZmZXIoT01YX1UzMiBwb3J0SW5kZXgsIE9NWDo6YnVmZmVyX2lkIGlkKSB7CkBAIC0xMjMzLDQgKzEzMTksNjAgQEAKICAgICB9CiB9CiAKK09NWDo6YnVmZmVyX2lkIE9NWE5vZGVJbnN0YW5jZTo6bWFrZUJ1ZmZlcklEKE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZmZXJIZWFkZXIpIHsKKyAgICBpZiAoYnVmZmVySGVhZGVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtQnVmZmVySURMb2NrKTsKKyAgICBPTVg6OmJ1ZmZlcl9pZCBidWZmZXI7CisgICAgZG8geyAvLyBoYW5kbGUgdGhlIHZlcnkgdW5saWtlbHkgY2FzZSBvZiBJRCBvdmVyZmxvdworICAgICAgICBpZiAoKyttQnVmZmVySURDb3VudCA9PSAwKSB7CisgICAgICAgICAgICsrbUJ1ZmZlcklEQ291bnQ7CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyID0gKE9NWDo6YnVmZmVyX2lkKW1CdWZmZXJJRENvdW50OworICAgIH0gd2hpbGUgKG1CdWZmZXJJRFRvQnVmZmVySGVhZGVyLmluZGV4T2ZLZXkoYnVmZmVyKSA+PSAwKTsKKyAgICBtQnVmZmVySURUb0J1ZmZlckhlYWRlci5hZGQoYnVmZmVyLCBidWZmZXJIZWFkZXIpOworICAgIG1CdWZmZXJIZWFkZXJUb0J1ZmZlcklELmFkZChidWZmZXJIZWFkZXIsIGJ1ZmZlcik7CisgICAgcmV0dXJuIGJ1ZmZlcjsKK30KKworT01YX0JVRkZFUkhFQURFUlRZUEUgKk9NWE5vZGVJbnN0YW5jZTo6ZmluZEJ1ZmZlckhlYWRlcigKKyAgICAgICAgT01YOjpidWZmZXJfaWQgYnVmZmVyLCBPTVhfVTMyIHBvcnRJbmRleCkgeworICAgIGlmIChidWZmZXIgPT0gMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1CdWZmZXJJRExvY2spOworICAgIHNzaXplX3QgaW5kZXggPSBtQnVmZmVySURUb0J1ZmZlckhlYWRlci5pbmRleE9mS2V5KGJ1ZmZlcik7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVygiZmluZEJ1ZmZlckhlYWRlcjogYnVmZmVyICV1IG5vdCBmb3VuZCIsIGJ1ZmZlcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyID0gbUJ1ZmZlcklEVG9CdWZmZXJIZWFkZXIudmFsdWVBdChpbmRleCk7CisgICAgQnVmZmVyTWV0YSAqYnVmZmVyX21ldGEgPQorICAgICAgICBzdGF0aWNfY2FzdDxCdWZmZXJNZXRhICo+KGhlYWRlci0+cEFwcFByaXZhdGUpOworICAgIGlmIChidWZmZXJfbWV0YS0+Z2V0UG9ydEluZGV4KCkgIT0gcG9ydEluZGV4KSB7CisgICAgICAgIEFMT0dXKCJmaW5kQnVmZmVySGVhZGVyOiBidWZmZXIgJXUgZm91bmQgYnV0IHdpdGggaW5jb3JyZWN0IHBvcnQgaW5kZXguIiwgYnVmZmVyKTsKKyAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyODgxNjgyNyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIGhlYWRlcjsKK30KKworT01YOjpidWZmZXJfaWQgT01YTm9kZUluc3RhbmNlOjpmaW5kQnVmZmVySUQoT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlckhlYWRlcikgeworICAgIGlmIChidWZmZXJIZWFkZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1CdWZmZXJJRExvY2spOworICAgIHJldHVybiBtQnVmZmVySGVhZGVyVG9CdWZmZXJJRC52YWx1ZUZvcihidWZmZXJIZWFkZXIpOworfQorCit2b2lkIE9NWE5vZGVJbnN0YW5jZTo6aW52YWxpZGF0ZUJ1ZmZlcklEKE9NWDo6YnVmZmVyX2lkIGJ1ZmZlcikgeworICAgIGlmIChidWZmZXIgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtQnVmZmVySURMb2NrKTsKKyAgICBtQnVmZmVySGVhZGVyVG9CdWZmZXJJRC5yZW1vdmVJdGVtKG1CdWZmZXJJRFRvQnVmZmVySGVhZGVyLnZhbHVlRm9yKGJ1ZmZlcikpOworICAgIG1CdWZmZXJJRFRvQnVmZmVySGVhZGVyLnJlbW92ZUl0ZW0oYnVmZmVyKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YQ29tcG9uZW50LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YQ29tcG9uZW50LmNwcAppbmRleCBiMWMzNGRjLi42NDZjZDMyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWENvbXBvbmVudC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhDb21wb25lbnQuY3BwCkBAIC0yNTcsNjkgKzI1Nyw2OSBAQAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogT01YX0VSUk9SVFlQRSBTb2Z0T01YQ29tcG9uZW50OjpzZW5kQ29tbWFuZCgKLSAgICAgICAgT01YX0NPTU1BTkRUWVBFIGNtZCwgT01YX1UzMiBwYXJhbSwgT01YX1BUUiBkYXRhKSB7CisgICAgICAgIE9NWF9DT01NQU5EVFlQRSAvKiBjbWQgKi8sIE9NWF9VMzIgLyogcGFyYW0gKi8sIE9NWF9QVFIgLyogZGF0YSAqLykgewogICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiB9CiAKIE9NWF9FUlJPUlRZUEUgU29mdE9NWENvbXBvbmVudDo6Z2V0UGFyYW1ldGVyKAotICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcykgeworICAgICAgICBPTVhfSU5ERVhUWVBFIC8qIGluZGV4ICovLCBPTVhfUFRSIC8qIHBhcmFtcyAqLykgewogICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiB9CiAKIE9NWF9FUlJPUlRZUEUgU29mdE9NWENvbXBvbmVudDo6c2V0UGFyYW1ldGVyKAotICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcykgeworICAgICAgICBPTVhfSU5ERVhUWVBFIC8qIGluZGV4ICovLCBjb25zdCBPTVhfUFRSIC8qIHBhcmFtcyAqLykgewogICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiB9CiAKIE9NWF9FUlJPUlRZUEUgU29mdE9NWENvbXBvbmVudDo6Z2V0Q29uZmlnKAotICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcykgeworICAgICAgICBPTVhfSU5ERVhUWVBFIC8qIGluZGV4ICovLCBPTVhfUFRSIC8qIHBhcmFtcyAqLykgewogICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiB9CiAKIE9NWF9FUlJPUlRZUEUgU29mdE9NWENvbXBvbmVudDo6c2V0Q29uZmlnKAotICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcykgeworICAgICAgICBPTVhfSU5ERVhUWVBFIC8qIGluZGV4ICovLCBjb25zdCBPTVhfUFRSIC8qIHBhcmFtcyAqLykgewogICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiB9CiAKIE9NWF9FUlJPUlRZUEUgU29mdE9NWENvbXBvbmVudDo6Z2V0RXh0ZW5zaW9uSW5kZXgoCi0gICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIE9NWF9JTkRFWFRZUEUgKmluZGV4KSB7CisgICAgICAgIGNvbnN0IGNoYXIgKiAvKiBuYW1lICovLCBPTVhfSU5ERVhUWVBFICogLyogaW5kZXggKi8pIHsKICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogfQogCiBPTVhfRVJST1JUWVBFIFNvZnRPTVhDb21wb25lbnQ6OnVzZUJ1ZmZlcigKLSAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKipidWZmZXIsCi0gICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LAotICAgICAgICBPTVhfUFRSIGFwcFByaXZhdGUsCi0gICAgICAgIE9NWF9VMzIgc2l6ZSwKLSAgICAgICAgT01YX1U4ICpwdHIpIHsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKiogLyogYnVmZmVyICovLAorICAgICAgICBPTVhfVTMyIC8qIHBvcnRJbmRleCAqLywKKyAgICAgICAgT01YX1BUUiAvKiBhcHBQcml2YXRlICovLAorICAgICAgICBPTVhfVTMyIC8qIHNpemUgKi8sCisgICAgICAgIE9NWF9VOCAqIC8qIHB0ciAqLykgewogICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiB9CiAKIE9NWF9FUlJPUlRZUEUgU29mdE9NWENvbXBvbmVudDo6YWxsb2NhdGVCdWZmZXIoCi0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICoqYnVmZmVyLAotICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwKLSAgICAgICAgT01YX1BUUiBhcHBQcml2YXRlLAotICAgICAgICBPTVhfVTMyIHNpemUpIHsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKiogLyogYnVmZmVyICovLAorICAgICAgICBPTVhfVTMyIC8qIHBvcnRJbmRleCAqLywKKyAgICAgICAgT01YX1BUUiAvKiBhcHBQcml2YXRlICovLAorICAgICAgICBPTVhfVTMyIC8qIHNpemUgKi8pIHsKICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogfQogCiBPTVhfRVJST1JUWVBFIFNvZnRPTVhDb21wb25lbnQ6OmZyZWVCdWZmZXIoCi0gICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LAotICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVyKSB7CisgICAgICAgIE9NWF9VMzIgLyogcG9ydEluZGV4ICovLAorICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqIC8qIGJ1ZmZlciAqLykgewogICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiB9CiAKIE9NWF9FUlJPUlRZUEUgU29mdE9NWENvbXBvbmVudDo6ZW1wdHlUaGlzQnVmZmVyKAotICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVyKSB7CisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICogLyogYnVmZmVyICovKSB7CiAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKIH0KIAogT01YX0VSUk9SVFlQRSBTb2Z0T01YQ29tcG9uZW50OjpmaWxsVGhpc0J1ZmZlcigKLSAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlcikgeworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqIC8qIGJ1ZmZlciAqLykgewogICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiB9CiAKLU9NWF9FUlJPUlRZUEUgU29mdE9NWENvbXBvbmVudDo6Z2V0U3RhdGUoT01YX1NUQVRFVFlQRSAqc3RhdGUpIHsKK09NWF9FUlJPUlRZUEUgU29mdE9NWENvbXBvbmVudDo6Z2V0U3RhdGUoT01YX1NUQVRFVFlQRSAqIC8qIHN0YXRlICovKSB7CiAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uY3BwCmluZGV4IGQ2Y2RlNzMuLjliNjk1OGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5jcHAKQEAgLTQyLDYgKzQyLDcgQEAKICAgICB7ICJPTVguZ29vZ2xlLmFtcndiLmVuY29kZXIiLCAiYW1yd2JlbmMiLCAiYXVkaW9fZW5jb2Rlci5hbXJ3YiIgfSwKICAgICB7ICJPTVguZ29vZ2xlLmgyNjQuZGVjb2RlciIsICJoMjY0ZGVjIiwgInZpZGVvX2RlY29kZXIuYXZjIiB9LAogICAgIHsgIk9NWC5nb29nbGUuaDI2NC5lbmNvZGVyIiwgImgyNjRlbmMiLCAidmlkZW9fZW5jb2Rlci5hdmMiIH0sCisgICAgeyAiT01YLmdvb2dsZS5oZXZjLmRlY29kZXIiLCAiaGV2Y2RlYyIsICJ2aWRlb19kZWNvZGVyLmhldmMiIH0sCiAgICAgeyAiT01YLmdvb2dsZS5nNzExLmFsYXcuZGVjb2RlciIsICJnNzExZGVjIiwgImF1ZGlvX2RlY29kZXIuZzcxMWFsYXciIH0sCiAgICAgeyAiT01YLmdvb2dsZS5nNzExLm1sYXcuZGVjb2RlciIsICJnNzExZGVjIiwgImF1ZGlvX2RlY29kZXIuZzcxMW1sYXciIH0sCiAgICAgeyAiT01YLmdvb2dsZS5oMjYzLmRlY29kZXIiLCAibXBlZzRkZWMiLCAidmlkZW9fZGVjb2Rlci5oMjYzIiB9LApAQCAtNTAsNiArNTEsNyBAQAogICAgIHsgIk9NWC5nb29nbGUubXBlZzQuZW5jb2RlciIsICJtcGVnNGVuYyIsICJ2aWRlb19lbmNvZGVyLm1wZWc0IiB9LAogICAgIHsgIk9NWC5nb29nbGUubXAzLmRlY29kZXIiLCAibXAzZGVjIiwgImF1ZGlvX2RlY29kZXIubXAzIiB9LAogICAgIHsgIk9NWC5nb29nbGUudm9yYmlzLmRlY29kZXIiLCAidm9yYmlzZGVjIiwgImF1ZGlvX2RlY29kZXIudm9yYmlzIiB9LAorICAgIHsgIk9NWC5nb29nbGUub3B1cy5kZWNvZGVyIiwgIm9wdXNkZWMiLCAiYXVkaW9fZGVjb2Rlci5vcHVzIiB9LAogICAgIHsgIk9NWC5nb29nbGUudnA4LmRlY29kZXIiLCAidnB4ZGVjIiwgInZpZGVvX2RlY29kZXIudnA4IiB9LAogICAgIHsgIk9NWC5nb29nbGUudnA5LmRlY29kZXIiLCAidnB4ZGVjIiwgInZpZGVvX2RlY29kZXIudnA5IiB9LAogICAgIHsgIk9NWC5nb29nbGUudnA4LmVuY29kZXIiLCAidnB4ZW5jIiwgInZpZGVvX2VuY29kZXIudnA4IiB9LApAQCAtMTU0LDcgKzE1Niw3IEBACiAKIE9NWF9FUlJPUlRZUEUgU29mdE9NWFBsdWdpbjo6ZW51bWVyYXRlQ29tcG9uZW50cygKICAgICAgICAgT01YX1NUUklORyBuYW1lLAotICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgc2l6ZV90IC8qIHNpemUgKi8sCiAgICAgICAgIE9NWF9VMzIgaW5kZXgpIHsKICAgICBpZiAoaW5kZXggPj0ga051bUNvbXBvbmVudHMpIHsKICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vTW9yZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmNwcAppbmRleCA4MjA3MTJjLi4xM2MxNjE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuY3BwCkBAIC0xNCwxMiArMTQsMTUgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIlNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlICJpbmNsdWRlL1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaCIKIAorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CkBAIC00OCw2ICs1MSw5IEBACiAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKICAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpCiAgICAgICAgIDogU2ltcGxlU29mdE9NWENvbXBvbmVudChuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCksCisgICAgICAgIG1Jc0FkYXB0aXZlKGZhbHNlKSwKKyAgICAgICAgbUFkYXB0aXZlTWF4V2lkdGgoMCksCisgICAgICAgIG1BZGFwdGl2ZU1heEhlaWdodCgwKSwKICAgICAgICAgbVdpZHRoKHdpZHRoKSwKICAgICAgICAgbUhlaWdodChoZWlnaHQpLAogICAgICAgICBtQ3JvcExlZnQoMCksCkBAIC0xMTcsMTYgKzEyMywxOCBAQAogICAgIHVwZGF0ZVBvcnREZWZpbml0aW9ucygpOwogfQogCi12b2lkIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OnVwZGF0ZVBvcnREZWZpbml0aW9ucygpIHsKK3ZvaWQgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6dXBkYXRlUG9ydERlZmluaXRpb25zKGJvb2wgdXBkYXRlQ3JvcCkgewogICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKmRlZiA9ICZlZGl0UG9ydEluZm8oa0lucHV0UG9ydEluZGV4KS0+bURlZjsKICAgICBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IG1XaWR0aDsKICAgICBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgPSBtSGVpZ2h0OwogICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5TdHJpZGUgPSBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aDsKICAgICBkZWYtPmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgPSBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ7CiAKKyAgICBkZWYtPm5CdWZmZXJTaXplID0gZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggKiBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgKiAzIC8gMjsKKwogICAgIGRlZiA9ICZlZGl0UG9ydEluZm8oa091dHB1dFBvcnRJbmRleCktPm1EZWY7Ci0gICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBtV2lkdGg7Ci0gICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gbUhlaWdodDsKKyAgICBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IG91dHB1dEJ1ZmZlcldpZHRoKCk7CisgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gb3V0cHV0QnVmZmVySGVpZ2h0KCk7CiAgICAgZGVmLT5mb3JtYXQudmlkZW8ublN0cmlkZSA9IGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOwogICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9IGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKIApAQCAtMTM0LDEwICsxNDIsMTA1IEBACiAgICAgICAgICAgICAoZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggKgogICAgICAgICAgICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCAqIDMpIC8gMjsKIAotICAgIG1Dcm9wTGVmdCA9IDA7Ci0gICAgbUNyb3BUb3AgPSAwOwotICAgIG1Dcm9wV2lkdGggPSBtV2lkdGg7Ci0gICAgbUNyb3BIZWlnaHQgPSBtSGVpZ2h0OworICAgIGlmICh1cGRhdGVDcm9wKSB7CisgICAgICAgIG1Dcm9wTGVmdCA9IDA7CisgICAgICAgIG1Dcm9wVG9wID0gMDsKKyAgICAgICAgbUNyb3BXaWR0aCA9IG1XaWR0aDsKKyAgICAgICAgbUNyb3BIZWlnaHQgPSBtSGVpZ2h0OworICAgIH0KK30KKworCit1aW50MzJfdCBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjpvdXRwdXRCdWZmZXJXaWR0aCgpIHsKKyAgICByZXR1cm4gbUlzQWRhcHRpdmUgPyBtQWRhcHRpdmVNYXhXaWR0aCA6IG1XaWR0aDsKK30KKwordWludDMyX3QgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6b3V0cHV0QnVmZmVySGVpZ2h0KCkgeworICAgIHJldHVybiBtSXNBZGFwdGl2ZSA/IG1BZGFwdGl2ZU1heEhlaWdodCA6IG1IZWlnaHQ7Cit9CisKK3ZvaWQgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6aGFuZGxlUG9ydFNldHRpbmdzQ2hhbmdlKAorICAgICAgICBib29sICpwb3J0V2lsbFJlc2V0LCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICBDcm9wU2V0dGluZ3NNb2RlIGNyb3BTZXR0aW5nc01vZGUsIGJvb2wgZmFrZVN0cmlkZSkgeworICAgICpwb3J0V2lsbFJlc2V0ID0gZmFsc2U7CisgICAgYm9vbCBzaXplQ2hhbmdlZCA9ICh3aWR0aCAhPSBtV2lkdGggfHwgaGVpZ2h0ICE9IG1IZWlnaHQpOworICAgIGJvb2wgdXBkYXRlQ3JvcCA9IChjcm9wU2V0dGluZ3NNb2RlID09IGtDcm9wVW5TZXQpOworICAgIGJvb2wgY3JvcENoYW5nZWQgPSAoY3JvcFNldHRpbmdzTW9kZSA9PSBrQ3JvcENoYW5nZWQpOworICAgIGJvb2wgc3RyaWRlQ2hhbmdlZCA9IGZhbHNlOworICAgIGlmIChmYWtlU3RyaWRlKSB7CisgICAgICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKmRlZiA9ICZlZGl0UG9ydEluZm8oa091dHB1dFBvcnRJbmRleCktPm1EZWY7CisgICAgICAgIGlmIChkZWYtPmZvcm1hdC52aWRlby5uU3RyaWRlICE9IHdpZHRoIHx8IGRlZi0+Zm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCAhPSBoZWlnaHQpIHsKKyAgICAgICAgICAgIHN0cmlkZUNoYW5nZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNpemVDaGFuZ2VkIHx8IGNyb3BDaGFuZ2VkIHx8IHN0cmlkZUNoYW5nZWQpIHsKKyAgICAgICAgbVdpZHRoID0gd2lkdGg7CisgICAgICAgIG1IZWlnaHQgPSBoZWlnaHQ7CisKKyAgICAgICAgaWYgKChzaXplQ2hhbmdlZCAmJiAhbUlzQWRhcHRpdmUpCisgICAgICAgICAgICB8fCB3aWR0aCA+IG1BZGFwdGl2ZU1heFdpZHRoCisgICAgICAgICAgICB8fCBoZWlnaHQgPiBtQWRhcHRpdmVNYXhIZWlnaHQpIHsKKyAgICAgICAgICAgIGlmIChtSXNBZGFwdGl2ZSkgeworICAgICAgICAgICAgICAgIGlmICh3aWR0aCA+IG1BZGFwdGl2ZU1heFdpZHRoKSB7CisgICAgICAgICAgICAgICAgICAgIG1BZGFwdGl2ZU1heFdpZHRoID0gd2lkdGg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChoZWlnaHQgPiBtQWRhcHRpdmVNYXhIZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgbUFkYXB0aXZlTWF4SGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVwZGF0ZVBvcnREZWZpbml0aW9ucyh1cGRhdGVDcm9wKTsKKyAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkLCBrT3V0cHV0UG9ydEluZGV4LCAwLCBOVUxMKTsKKyAgICAgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBBV0FJVElOR19ESVNBQkxFRDsKKyAgICAgICAgICAgICpwb3J0V2lsbFJlc2V0ID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVwZGF0ZVBvcnREZWZpbml0aW9ucyh1cGRhdGVDcm9wKTsKKworICAgICAgICAgICAgaWYgKGZha2VTdHJpZGUpIHsKKyAgICAgICAgICAgICAgICAvLyBNQUpPUiBIQUNLIHRoYXQgaXMgbm90IHByZXR0eSwgaXQncyBqdXN0IHRvIGZvb2wgdGhlIHJlbmRlcmVyIHRvIHJlYWQgdGhlIGNvcnJlY3QKKyAgICAgICAgICAgICAgICAvLyBkYXRhLgorICAgICAgICAgICAgICAgIC8vIFNvbWUgc29mdHdhcmUgZGVjb2RlcnMgKGUuZy4gU29mdE1QRUc0KSBmaWxsIGRlY29kZWQgZnJhbWUgZGlyZWN0bHkgdG8gb3V0cHV0CisgICAgICAgICAgICAgICAgLy8gYnVmZmVyIHdpdGhvdXQgY29uc2lkZXJpbmcgdGhlIG91dHB1dCBidWZmZXIgc3RyaWRlIGFuZCBzbGljZSBoZWlnaHQuIFNvIHRoaXMgaXMKKyAgICAgICAgICAgICAgICAvLyB1c2VkIHRvIHNpZ25hbCBob3cgdGhlIGJ1ZmZlciBpcyBhcnJhbmdlZC4gIFRoZSBhbHRlcm5hdGl2ZSBpcyB0byByZS1hcnJhbmdlIHRoZQorICAgICAgICAgICAgICAgIC8vIG91dHB1dCBidWZmZXIgaW4gU29mdE1QRUc0LCBidXQgdGhhdCByZXN1bHRzIGluIG1lbWNvcGllcy4KKyAgICAgICAgICAgICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpkZWYgPSAmZWRpdFBvcnRJbmZvKGtPdXRwdXRQb3J0SW5kZXgpLT5tRGVmOworICAgICAgICAgICAgICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5TdHJpZGUgPSBtV2lkdGg7CisgICAgICAgICAgICAgICAgZGVmLT5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gbUhlaWdodDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIGtPdXRwdXRQb3J0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0Q3JvcCwgTlVMTCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6Y29weVlWMTJGcmFtZVRvT3V0cHV0QnVmZmVyKAorICAgICAgICB1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyY1ksIGNvbnN0IHVpbnQ4X3QgKnNyY1UsIGNvbnN0IHVpbnQ4X3QgKnNyY1YsCisgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUpIHsKKyAgICBzaXplX3QgZHN0WVN0cmlkZSA9IG91dHB1dEJ1ZmZlcldpZHRoKCk7CisgICAgc2l6ZV90IGRzdFVWU3RyaWRlID0gZHN0WVN0cmlkZSAvIDI7CisgICAgc2l6ZV90IGRzdEhlaWdodCA9IG91dHB1dEJ1ZmZlckhlaWdodCgpOworICAgIHVpbnQ4X3QgKmRzdFN0YXJ0ID0gZHN0OworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSGVpZ2h0OyArK2kpIHsKKyAgICAgICAgIG1lbWNweShkc3QsIHNyY1ksIG1XaWR0aCk7CisgICAgICAgICBzcmNZICs9IHNyY1lTdHJpZGU7CisgICAgICAgICBkc3QgKz0gZHN0WVN0cmlkZTsKKyAgICB9CisKKyAgICBkc3QgPSBkc3RTdGFydCArIGRzdFlTdHJpZGUgKiBkc3RIZWlnaHQ7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSGVpZ2h0IC8gMjsgKytpKSB7CisgICAgICAgICBtZW1jcHkoZHN0LCBzcmNVLCBtV2lkdGggLyAyKTsKKyAgICAgICAgIHNyY1UgKz0gc3JjVVN0cmlkZTsKKyAgICAgICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgICB9CisKKyAgICBkc3QgPSBkc3RTdGFydCArICg1ICogZHN0WVN0cmlkZSAqIGRzdEhlaWdodCkgLyA0OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUhlaWdodCAvIDI7ICsraSkgeworICAgICAgICAgbWVtY3B5KGRzdCwgc3JjViwgbVdpZHRoIC8gMik7CisgICAgICAgICBzcmNWICs9IHNyY1ZTdHJpZGU7CisgICAgICAgICBkc3QgKz0gZHN0VVZTdHJpZGU7CisgICAgfQogfQogCiBPTVhfRVJST1JUWVBFIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OmludGVybmFsR2V0UGFyYW1ldGVyKApAQCAtMTg1LDE2ICsyODgsMTYgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKHByb2ZpbGVMZXZlbC0+blBvcnRJbmRleCAhPSBrSW5wdXRQb3J0SW5kZXgpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBwb3J0IGluZGV4OiAlbGQiLCBwcm9maWxlTGV2ZWwtPm5Qb3J0SW5kZXgpOworICAgICAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIHBvcnQgaW5kZXg6ICUiIFBSSXUzMiwgcHJvZmlsZUxldmVsLT5uUG9ydEluZGV4KTsKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGluZGV4ID49IG1OdW1Qcm9maWxlTGV2ZWxzKSB7CisgICAgICAgICAgICBpZiAocHJvZmlsZUxldmVsLT5uUHJvZmlsZUluZGV4ID49IG1OdW1Qcm9maWxlTGV2ZWxzKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vTW9yZTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgcHJvZmlsZUxldmVsLT5lUHJvZmlsZSA9IG1Qcm9maWxlTGV2ZWxzW2luZGV4XS5tUHJvZmlsZTsKLSAgICAgICAgICAgIHByb2ZpbGVMZXZlbC0+ZUxldmVsICAgPSBtUHJvZmlsZUxldmVsc1tpbmRleF0ubUxldmVsOworICAgICAgICAgICAgcHJvZmlsZUxldmVsLT5lUHJvZmlsZSA9IG1Qcm9maWxlTGV2ZWxzW3Byb2ZpbGVMZXZlbC0+blByb2ZpbGVJbmRleF0ubVByb2ZpbGU7CisgICAgICAgICAgICBwcm9maWxlTGV2ZWwtPmVMZXZlbCAgID0gbVByb2ZpbGVMZXZlbHNbcHJvZmlsZUxldmVsLT5uUHJvZmlsZUluZGV4XS5tTGV2ZWw7CiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCkBAIC0yMDUsNyArMzA4LDEwIEBACiAKIE9NWF9FUlJPUlRZUEUgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6aW50ZXJuYWxTZXRQYXJhbWV0ZXIoCiAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKSB7Ci0gICAgc3dpdGNoIChpbmRleCkgeworICAgIC8vIEluY2x1ZGUgZXh0ZW5zaW9uIGluZGV4IE9NWF9JTkRFWEVYVFRZUEUuCisgICAgY29uc3QgaW50MzJfdCBpbmRleEZ1bGwgPSBpbmRleDsKKworICAgIHN3aXRjaCAoaW5kZXhGdWxsKSB7CiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1TdGFuZGFyZENvbXBvbmVudFJvbGU6CiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqcm9sZVBhcmFtcyA9CkBAIC0yNDQsNiArMzUwLDY4IEBACiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2Uga1ByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrSW5kZXg6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IFByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrUGFyYW1zKiBhZGFwdGl2ZVBsYXliYWNrUGFyYW1zID0KKyAgICAgICAgICAgICAgICAgICAgKGNvbnN0IFByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrUGFyYW1zICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShhZGFwdGl2ZVBsYXliYWNrUGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1Jc0FkYXB0aXZlID0gYWRhcHRpdmVQbGF5YmFja1BhcmFtcy0+YkVuYWJsZTsKKyAgICAgICAgICAgIGlmIChtSXNBZGFwdGl2ZSkgeworICAgICAgICAgICAgICAgIG1BZGFwdGl2ZU1heFdpZHRoID0gYWRhcHRpdmVQbGF5YmFja1BhcmFtcy0+bk1heEZyYW1lV2lkdGg7CisgICAgICAgICAgICAgICAgbUFkYXB0aXZlTWF4SGVpZ2h0ID0gYWRhcHRpdmVQbGF5YmFja1BhcmFtcy0+bk1heEZyYW1lSGVpZ2h0OworICAgICAgICAgICAgICAgIG1XaWR0aCA9IG1BZGFwdGl2ZU1heFdpZHRoOworICAgICAgICAgICAgICAgIG1IZWlnaHQgPSBtQWRhcHRpdmVNYXhIZWlnaHQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1BZGFwdGl2ZU1heFdpZHRoID0gMDsKKyAgICAgICAgICAgICAgICBtQWRhcHRpdmVNYXhIZWlnaHQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdXBkYXRlUG9ydERlZmluaXRpb25zKCk7CisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbjoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqbmV3UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0obmV3UGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE9NWF9WSURFT19QT1JUREVGSU5JVElPTlRZUEUgKnZpZGVvX2RlZiA9ICZuZXdQYXJhbXMtPmZvcm1hdC52aWRlbzsKKyAgICAgICAgICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKmRlZiA9ICZlZGl0UG9ydEluZm8obmV3UGFyYW1zLT5uUG9ydEluZGV4KS0+bURlZjsKKworICAgICAgICAgICAgdWludDMyX3Qgb2xkV2lkdGggPSBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aDsKKyAgICAgICAgICAgIHVpbnQzMl90IG9sZEhlaWdodCA9IGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKKyAgICAgICAgICAgIHVpbnQzMl90IG5ld1dpZHRoID0gdmlkZW9fZGVmLT5uRnJhbWVXaWR0aDsKKyAgICAgICAgICAgIHVpbnQzMl90IG5ld0hlaWdodCA9IHZpZGVvX2RlZi0+bkZyYW1lSGVpZ2h0OworICAgICAgICAgICAgaWYgKG5ld1dpZHRoICE9IG9sZFdpZHRoIHx8IG5ld0hlaWdodCAhPSBvbGRIZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBib29sIG91dHB1dFBvcnQgPSAobmV3UGFyYW1zLT5uUG9ydEluZGV4ID09IGtPdXRwdXRQb3J0SW5kZXgpOworICAgICAgICAgICAgICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0KKyAgICAgICAgICAgICAgICAgICAgKG1Jc0FkYXB0aXZlICYmIG91dHB1dFBvcnQpID8gbUFkYXB0aXZlTWF4V2lkdGggOiBuZXdXaWR0aDsKKyAgICAgICAgICAgICAgICBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgPQorICAgICAgICAgICAgICAgICAgICAobUlzQWRhcHRpdmUgJiYgb3V0cHV0UG9ydCkgPyBtQWRhcHRpdmVNYXhIZWlnaHQgOiBuZXdIZWlnaHQ7CisgICAgICAgICAgICAgICAgZGVmLT5mb3JtYXQudmlkZW8ublN0cmlkZSA9IGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOworICAgICAgICAgICAgICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9IGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKKyAgICAgICAgICAgICAgICBkZWYtPm5CdWZmZXJTaXplID0KKyAgICAgICAgICAgICAgICAgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggKiBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgKiAzIC8gMjsKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0UG9ydCkgeworICAgICAgICAgICAgICAgICAgICBtV2lkdGggPSBuZXdXaWR0aDsKKyAgICAgICAgICAgICAgICAgICAgbUhlaWdodCA9IG5ld0hlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgbUNyb3BMZWZ0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgbUNyb3BUb3AgPSAwOworICAgICAgICAgICAgICAgICAgICBtQ3JvcFdpZHRoID0gbmV3V2lkdGg7CisgICAgICAgICAgICAgICAgICAgIG1Dcm9wSGVpZ2h0ID0gbmV3SGVpZ2h0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBuZXdQYXJhbXMtPm5CdWZmZXJTaXplID0gZGVmLT5uQnVmZmVyU2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjppbnRlcm5hbFNldFBhcmFtZXRlcihpbmRleCwgcGFyYW1zKTsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6aW50ZXJuYWxTZXRQYXJhbWV0ZXIoaW5kZXgsIHBhcmFtcyk7CiAgICAgfQpAQCAtMjc3LDYgKzQ0NSwxNiBAQAogICAgIH0KIH0KIAorT01YX0VSUk9SVFlQRSBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjpnZXRFeHRlbnNpb25JbmRleCgKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgT01YX0lOREVYVFlQRSAqaW5kZXgpIHsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LnByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrIikpIHsKKyAgICAgICAgKihpbnQzMl90KilpbmRleCA9IGtQcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFja0luZGV4OworICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICB9CisKKyAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6Z2V0RXh0ZW5zaW9uSW5kZXgobmFtZSwgaW5kZXgpOworfQorCiB2b2lkIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6Om9uUmVzZXQoKSB7CiAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IE5PTkU7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJmZjE0MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmNwcApAQCAtMCwwICsxLDMxMSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+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+IDEpOworICAgICAgICAgICAgeWNiY3IuY2hyb21hX3N0ZXAgPSAxOworICAgICAgICAgICAgeWNiY3IuY3N0cmlkZSA9IHNyY1ZTdHJpZGUgPj4gMTsKKyAgICAgICAgICAgIHljYmNyLnlzdHJpZGUgPSBzcmNWU3RyaWRlOworICAgICAgICAgICAgQ29udmVydEZsZXhZVVZUb1BsYW5hcihkc3QsIGRzdFN0cmlkZSwgZHN0VlN0cmlkZSwgJnljYmNyLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNyQ2JfNDIwX1NQOiAgLy8gWUNyQ2IgLyBZVlUgc2VtaXBsYW5hciwgTlYyMQorICAgICAgICAgICAgLy8gY29udmVydCB0byBmbGV4IFlVVgorICAgICAgICAgICAgeWNiY3IueSA9IGJpdHM7CisgICAgICAgICAgICB5Y2Jjci5jciA9ICh1aW50OF90ICopYml0cyArIHNyY1N0cmlkZSAqIHNyY1ZTdHJpZGU7CisgICAgICAgICAgICB5Y2Jjci5jYiA9ICh1aW50OF90ICopeWNiY3IuY3IgKyAxOworICAgICAgICAgICAgeWNiY3IuY2hyb21hX3N0ZXAgPSAyOworICAgICAgICAgICAgeWNiY3IuY3N0cmlkZSA9IHNyY1ZTdHJpZGU7CisgICAgICAgICAgICB5Y2Jjci55c3RyaWRlID0gc3JjVlN0cmlkZTsKKyAgICAgICAgICAgIENvbnZlcnRGbGV4WVVWVG9QbGFuYXIoZHN0LCBkc3RTdHJpZGUsIGRzdFZTdHJpZGUsICZ5Y2Jjciwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF84ODg6CisgICAgICAgICAgICBDb252ZXJ0RmxleFlVVlRvUGxhbmFyKGRzdCwgZHN0U3RyaWRlLCBkc3RWU3RyaWRlLCAmeWNiY3IsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODg6CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9CR1JBXzg4ODg6CisgICAgICAgICAgICBDb252ZXJ0UkdCMzJUb1BsYW5hcigKKyAgICAgICAgICAgICAgICAgICAgZHN0LCBkc3RTdHJpZGUsIGRzdFZTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopYml0cywgd2lkdGgsIGhlaWdodCwgc3JjU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9CR1JBXzg4ODgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0ICUjeCIsIGZvcm1hdCk7CisgICAgICAgICAgICBkc3QgPSBOVUxMOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGdybW9kdWxlLT51bmxvY2soZ3Jtb2R1bGUsIGhhbmRsZSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byB1bmxvY2sgaW1hZ2UgYnVmZmVyICVwIGZvciBhY2Nlc3MiLCBoYW5kbGUpOworICAgIH0KKworICAgIHJldHVybiBkc3Q7Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudDo6Z2V0RXh0ZW5zaW9uSW5kZXgoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIE9NWF9JTkRFWFRZUEUgKmluZGV4KSB7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5zdG9yZU1ldGFEYXRhSW5CdWZmZXJzIikgfHwKKyAgICAgICAgIXN0cmNtcChuYW1lLCAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LnN0b3JlR3JhcGhpY0J1ZmZlckluTWV0YURhdGEiKSkgeworICAgICAgICAqKGludDMyX3QqKWluZGV4ID0ga1N0b3JlTWV0YURhdGFFeHRlbnNpb25JbmRleDsKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgfQorICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpnZXRFeHRlbnNpb25JbmRleChuYW1lLCBpbmRleCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLm1rCmluZGV4IDEwNjFjMzkuLjQ0N2IyOWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLm1rCkBAIC0xMSw4ICsxMSwxMiBAQAogCSQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKIAkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIExPQ0FMX01PRFVMRSA6PSBvbXhfdGVzdHMKIAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKIAorTE9DQUxfMzJfQklUX09OTFkgOj0gdHJ1ZQorCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9PTVhIYXJuZXNzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9PTVhIYXJuZXNzLmNwcAppbmRleCA0YmVlODA4Li5mNGRmZDZiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuY3BwCkBAIC0xNiw2ICsxNiw3IEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiT01YSGFybmVzcyIKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiT01YSGFybmVzcy5oIgpAQCAtMjUsNiArMjYsNyBAQAogI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CkBAIC0yNDEsNyArMjQzLDggQEAKIH07CiAKIHN0YXRpYyBzcDxNZWRpYUV4dHJhY3Rvcj4gQ3JlYXRlRXh0cmFjdG9yRnJvbVVSSShjb25zdCBjaGFyICp1cmkpIHsKLSAgICBzcDxEYXRhU291cmNlPiBzb3VyY2UgPSBEYXRhU291cmNlOjpDcmVhdGVGcm9tVVJJKHVyaSk7CisgICAgc3A8RGF0YVNvdXJjZT4gc291cmNlID0KKyAgICAgICAgRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSShOVUxMIC8qIGh0dHBTZXJ2aWNlICovLCB1cmkpOwogCiAgICAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNDYwLDYgKzQ2Myw3IEBACiAgICAgICAgIHsgImF1ZGlvX2RlY29kZXIuYWFjIiwgImF1ZGlvL21wNGEtbGF0bSIgfSwKICAgICAgICAgeyAiYXVkaW9fZGVjb2Rlci5tcDMiLCAiYXVkaW8vbXBlZyIgfSwKICAgICAgICAgeyAiYXVkaW9fZGVjb2Rlci52b3JiaXMiLCAiYXVkaW8vdm9yYmlzIiB9LAorICAgICAgICB7ICJhdWRpb19kZWNvZGVyLm9wdXMiLCAiYXVkaW8vb3B1cyIgfSwKICAgICAgICAgeyAiYXVkaW9fZGVjb2Rlci5nNzExYWxhdyIsIE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfQUxBVyB9LAogICAgICAgICB7ICJhdWRpb19kZWNvZGVyLmc3MTFtbGF3IiwgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXIH0sCiAgICAgfTsKQEAgLTQ5Miw2ICs0OTYsNyBAQAogICAgICAgICB7ICJhdWRpby9tcGVnIiwKICAgICAgICAgICAiZmlsZTovLy9zZGNhcmQvbWVkaWFfYXBpL211c2ljL01QM180OEtIel8xMjhrYnBzX3NfMV8xN19DQlIubXAzIiB9LAogICAgICAgICB7ICJhdWRpby92b3JiaXMiLCBOVUxMIH0sCisgICAgICAgIHsgImF1ZGlvL29wdXMiLCBOVUxMIH0sCiAgICAgICAgIHsgInZpZGVvL3gtdm5kLm9uMi52cDgiLAogICAgICAgICAgICJmaWxlOi8vL3NkY2FyZC9tZWRpYV9hcGkvdmlkZW8vYmlnLWJ1Y2stYnVubnlfdHJhaWxlci53ZWJtIiB9LAogICAgICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfQUxBVywgImZpbGU6Ly8vc2RjYXJkL00xRjEtQWxhdy1BRnNwLndhdiIgfSwKQEAgLTcxMSwxMSArNzE2LDExIEBACiAgICAgICAgICAgICBpbnQ2NF90IGJ1ZmZlclRpbWVVczsKICAgICAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJmJ1ZmZlclRpbWVVcykpOwogICAgICAgICAgICAgaWYgKCFDbG9zZUVub3VnaChidWZmZXJUaW1lVXMsIGFjdHVhbFNlZWtUaW1lVXMpKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJcbiAgKiBBdHRlbXB0ZWQgc2Vla2luZyB0byAlbGxkIHVzICglLjJmIHNlY3MpIiwKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuICAqIEF0dGVtcHRlZCBzZWVraW5nIHRvICUiIFBSSWQ2NCAiIHVzICglLjJmIHNlY3MpIiwKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkU2Vla1RpbWVVcywgcmVxdWVzdGVkU2Vla1RpbWVVcyAvIDFFNik7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJcbiAgKiBOZWFyZXN0IGtleWZyYW1lIGlzIGF0ICVsbGQgdXMgKCUuMmYgc2VjcykiLAorICAgICAgICAgICAgICAgIHByaW50ZigiXG4gICogTmVhcmVzdCBrZXlmcmFtZSBpcyBhdCAlIiBQUklkNjQgIiB1cyAoJS4yZiBzZWNzKSIsCiAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFNlZWtUaW1lVXMsIGFjdHVhbFNlZWtUaW1lVXMgLyAxRTYpOwotICAgICAgICAgICAgICAgIHByaW50ZigiXG4gICogUmV0dXJuZWQgYnVmZmVyIHdhcyBhdCAlbGxkIHVzICglLjJmIHNlY3MpXG5cbiIsCisgICAgICAgICAgICAgICAgcHJpbnRmKCJcbiAgKiBSZXR1cm5lZCBidWZmZXIgd2FzIGF0ICUiIFBSSWQ2NCAiIHVzICglLjJmIHNlY3MpXG5cbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclRpbWVVcywgYnVmZmVyVGltZVVzIC8gMUU2KTsKIAogICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BQVZDQXNzZW1ibGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUFWQ0Fzc2VtYmxlci5jcHAKaW5kZXggYTY4MjVlYi4uNGJjNjdlOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BQVZDQXNzZW1ibGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FBVkNBc3NlbWJsZXIuY3BwCkBAIC0xMjQsNyArMTI0LDcgQEAKIH0KIAogdm9pZCBBQVZDQXNzZW1ibGVyOjphZGRTaW5nbGVOQUxVbml0KGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKLSAgICBBTE9HVigiYWRkU2luZ2xlTkFMVW5pdCBvZiBzaXplICVkIiwgYnVmZmVyLT5zaXplKCkpOworICAgIEFMT0dWKCJhZGRTaW5nbGVOQUxVbml0IG9mIHNpemUgJXp1IiwgYnVmZmVyLT5zaXplKCkpOwogI2lmICFMT0dfTkRFQlVHCiAgICAgaGV4ZHVtcChidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOwogI2VuZGlmCkBAIC0xOTEsNyArMTkxLDcgQEAKICAgICBDSEVDSygoaW5kaWNhdG9yICYgMHgxZikgPT0gMjgpOwogCiAgICAgaWYgKHNpemUgPCAyKSB7Ci0gICAgICAgIEFMT0dWKCJJZ25vcmluZyBtYWxmb3JtZWQgRlUgYnVmZmVyIChzaXplID0gJWQpIiwgc2l6ZSk7CisgICAgICAgIEFMT0dWKCJJZ25vcmluZyBtYWxmb3JtZWQgRlUgYnVmZmVyIChzaXplID0gJXp1KSIsIHNpemUpOwogCiAgICAgICAgIHF1ZXVlLT5lcmFzZShxdWV1ZS0+YmVnaW4oKSk7CiAgICAgICAgICsrbU5leHRFeHBlY3RlZFNlcU5vOwpAQCAtMjI1LDcgKzIyNSw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgTGlzdDxzcDxBQnVmZmVyPiA+OjppdGVyYXRvciBpdCA9ICsrcXVldWUtPmJlZ2luKCk7CiAgICAgICAgIHdoaWxlIChpdCAhPSBxdWV1ZS0+ZW5kKCkpIHsKLSAgICAgICAgICAgIEFMT0dWKCJzZXF1ZW5jZSBsZW5ndGggJWQiLCB0b3RhbENvdW50KTsKKyAgICAgICAgICAgIEFMT0dWKCJzZXF1ZW5jZSBsZW5ndGggJXp1IiwgdG90YWxDb3VudCk7CiAKICAgICAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIgPSAqaXQ7CiAKQEAgLTI5NCw3ICsyOTQsNyBAQAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdG90YWxDb3VudDsgKytpKSB7CiAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIgPSAqaXQ7CiAKLSAgICAgICAgQUxPR1YoInBpZWNlICMlZC8lZCIsIGkgKyAxLCB0b3RhbENvdW50KTsKKyAgICAgICAgQUxPR1YoInBpZWNlICMlenUvJXp1IiwgaSArIDEsIHRvdGFsQ291bnQpOwogI2lmICFMT0dfTkRFQlVHCiAgICAgICAgIGhleGR1bXAoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKICNlbmRpZgpAQCAtMzE3LDcgKzMxNyw3IEBACiB2b2lkIEFBVkNBc3NlbWJsZXI6OnN1Ym1pdEFjY2Vzc1VuaXQoKSB7CiAgICAgQ0hFQ0soIW1OQUxVbml0cy5lbXB0eSgpKTsKIAotICAgIEFMT0dWKCJBY2Nlc3MgdW5pdCBjb21wbGV0ZSAoJWQgbmFsIHVuaXRzKSIsIG1OQUxVbml0cy5zaXplKCkpOworICAgIEFMT0dWKCJBY2Nlc3MgdW5pdCBjb21wbGV0ZSAoJXp1IG5hbCB1bml0cykiLCBtTkFMVW5pdHMuc2l6ZSgpKTsKIAogICAgIHNpemVfdCB0b3RhbFNpemUgPSAwOwogICAgIGZvciAoTGlzdDxzcDxBQnVmZmVyPiA+OjppdGVyYXRvciBpdCA9IG1OQUxVbml0cy5iZWdpbigpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzJUU0Fzc2VtYmxlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHMlRTQXNzZW1ibGVyLmNwcAppbmRleCA0YzliZjViLi5kY2E1Yzg5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHMlRTQXNzZW1ibGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHMlRTQXNzZW1ibGVyLmNwcApAQCAtMzQsNyArMzQsOSBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBBTVBFRzJUU0Fzc2VtYmxlcjo6QU1QRUcyVFNBc3NlbWJsZXIoCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCBjb25zdCBjaGFyICpkZXNjLCBjb25zdCBBU3RyaW5nICZwYXJhbXMpCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAorICAgICAgICBjb25zdCBjaGFyICogLyogZGVzYyAqLywKKyAgICAgICAgY29uc3QgQVN0cmluZyAmIC8qIHBhcmFtcyAqLykKICAgICA6IG1Ob3RpZnlNc2cobm90aWZ5KSwKICAgICAgIG1OZXh0RXhwZWN0ZWRTZXFOb1ZhbGlkKGZhbHNlKSwKICAgICAgIG1OZXh0RXhwZWN0ZWRTZXFObygwKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHNEVsZW1lbnRhcnlBc3NlbWJsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyLmNwcAppbmRleCBlZWZjZWJhLi43ZWI2NTQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHNEVsZW1lbnRhcnlBc3NlbWJsZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0RWxlbWVudGFyeUFzc2VtYmxlci5jcHAKQEAgLTI0OSwxMSArMjQ5LDE1IEBACiAgICAgICAgIG1QYWNrZXRzLnB1c2hfYmFjayhidWZmZXIpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIGhleGR1bXAoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgaWYgKGJ1ZmZlci0+c2l6ZSgpIDwgMikgeworICAgICAgICAgICAgcmV0dXJuIE1BTEZPUk1FRF9QQUNLRVQ7CisgICAgICAgIH0KIAotICAgICAgICBDSEVDS19HRShidWZmZXItPnNpemUoKSwgMnUpOwogICAgICAgICB1bnNpZ25lZCBBVV9oZWFkZXJzX2xlbmd0aCA9IFUxNl9BVChidWZmZXItPmRhdGEoKSk7ICAvLyBpbiBiaXRzCiAKLSAgICAgICAgQ0hFQ0tfR0UoYnVmZmVyLT5zaXplKCksIDIgKyAoQVVfaGVhZGVyc19sZW5ndGggKyA3KSAvIDgpOworICAgICAgICBpZiAoYnVmZmVyLT5zaXplKCkgPCAyICsgKEFVX2hlYWRlcnNfbGVuZ3RoICsgNykgLyA4KSB7CisgICAgICAgICAgICByZXR1cm4gTUFMRk9STUVEX1BBQ0tFVDsKKyAgICAgICAgfQogCiAgICAgICAgIExpc3Q8QVVIZWFkZXI+IGhlYWRlcnM7CiAKQEAgLTM0Miw3ICszNDYsOSBAQAogICAgICAgICAgICAgIGl0ICE9IGhlYWRlcnMuZW5kKCk7ICsraXQpIHsKICAgICAgICAgICAgIGNvbnN0IEFVSGVhZGVyICZoZWFkZXIgPSAqaXQ7CiAKLSAgICAgICAgICAgIENIRUNLX0xFKG9mZnNldCArIGhlYWRlci5tU2l6ZSwgYnVmZmVyLT5zaXplKCkpOworICAgICAgICAgICAgaWYgKGJ1ZmZlci0+c2l6ZSgpIDwgb2Zmc2V0ICsgaGVhZGVyLm1TaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE1BTEZPUk1FRF9QQUNLRVQ7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQgPSBuZXcgQUJ1ZmZlcihoZWFkZXIubVNpemUpOwogICAgICAgICAgICAgbWVtY3B5KGFjY2Vzc1VuaXQtPmRhdGEoKSwgYnVmZmVyLT5kYXRhKCkgKyBvZmZzZXQsIGhlYWRlci5tU2l6ZSk7CkBAIC0zNTMsNyArMzU5LDEwIEBACiAgICAgICAgICAgICBtUGFja2V0cy5wdXNoX2JhY2soYWNjZXNzVW5pdCk7CiAgICAgICAgIH0KIAotICAgICAgICBDSEVDS19FUShvZmZzZXQsIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgaWYgKG9mZnNldCAhPSBidWZmZXItPnNpemUoKSkgeworICAgICAgICAgICAgQUxPR1coInBvdGVudGlhbGx5IG1hbGZvcm1lZCBwYWNrZXQgKG9mZnNldCAlZCwgc2l6ZSAlZCkiLAorICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHF1ZXVlLT5lcmFzZShxdWV1ZS0+YmVnaW4oKSk7CkBAIC0zNjUsNyArMzc0LDcgQEAKIHZvaWQgQU1QRUc0RWxlbWVudGFyeUFzc2VtYmxlcjo6c3VibWl0QWNjZXNzVW5pdCgpIHsKICAgICBDSEVDSyghbVBhY2tldHMuZW1wdHkoKSk7CiAKLSAgICBBTE9HVigiQWNjZXNzIHVuaXQgY29tcGxldGUgKCVkIG5hbCB1bml0cykiLCBtUGFja2V0cy5zaXplKCkpOworICAgIEFMT0dWKCJBY2Nlc3MgdW5pdCBjb21wbGV0ZSAoJXp1IG5hbCB1bml0cykiLCBtUGFja2V0cy5zaXplKCkpOwogCiAgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdDsKIApAQCAtNDAwLDYgKzQwOSw3IEBACiAgICAgICAgIGNvbnN0IHNwPEFSVFBTb3VyY2U+ICZzb3VyY2UpIHsKICAgICBBc3NlbWJseVN0YXR1cyBzdGF0dXMgPSBhZGRQYWNrZXQoc291cmNlKTsKICAgICBpZiAoc3RhdHVzID09IE1BTEZPUk1FRF9QQUNLRVQpIHsKKyAgICAgICAgQUxPR0koImFjY2VzcyB1bml0IGlzIGRhbWFnZWQiKTsKICAgICAgICAgbUFjY2Vzc1VuaXREYW1hZ2VkID0gdHJ1ZTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVBhY2tldFNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FQYWNrZXRTb3VyY2UuY3BwCmluZGV4IDQ2MmMzODQuLjA5ZjUyYmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVBhY2tldFNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUGFja2V0U291cmNlLmNwcApAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgIkFSYXdBdWRpb0Fzc2VtYmxlci5oIgogI2luY2x1ZGUgIkFTZXNzaW9uRGVzY3JpcHRpb24uaCIKIAotI2luY2x1ZGUgImF2Y191dGlscy5oIgorI2luY2x1ZGUgImluY2x1ZGUvYXZjX3V0aWxzLmgiCiAKICNpbmNsdWRlIDxjdHlwZS5oPgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBDb25uZWN0aW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUENvbm5lY3Rpb24uY3BwCmluZGV4IGFmMzY5YjUuLjM3MmZiZTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUENvbm5lY3Rpb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUENvbm5lY3Rpb24uY3BwCkBAIC01NjMsNyArNTYzLDcgQEAKIAogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiVW5rbm93biBSVENQIHBhY2tldCB0eXBlICV1IG9mIHNpemUgJWQiLAorICAgICAgICAgICAgICAgIEFMT0dXKCJVbmtub3duIFJUQ1AgcGFja2V0IHR5cGUgJXUgb2Ygc2l6ZSAlenUiLAogICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKWRhdGFbMV0sIGhlYWRlckxlbmd0aCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmNwcAppbmRleCAwZDA3MDQzLi43OTNkMTE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5jcHAKQEAgLTExNCw3ICsxMTQsNyBAQAogICAgIHJldHVybiAobUZsYWdzICYga0ZsYWdFT1MpICE9IDA7CiB9CiAKLXN0YXR1c190IEFSVFBXcml0ZXI6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKK3N0YXR1c190IEFSVFBXcml0ZXI6OnN0YXJ0KE1ldGFEYXRhICogLyogcGFyYW1zICovKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICBpZiAobUZsYWdzICYga0ZsYWdTdGFydGVkKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTI3Nyw3ICsyNzcsNyBAQAogICAgIH0KIAogICAgIGlmIChtZWRpYUJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgIEFMT0dWKCJyZWFkIGJ1ZmZlciBvZiBzaXplICVkIiwgbWVkaWFCdWYtPnJhbmdlX2xlbmd0aCgpKTsKKyAgICAgICAgQUxPR1YoInJlYWQgYnVmZmVyIG9mIHNpemUgJXp1IiwgbWVkaWFCdWYtPnJhbmdlX2xlbmd0aCgpKTsKIAogICAgICAgICBpZiAobU1vZGUgPT0gSDI2NCkgewogICAgICAgICAgICAgU3RyaXBTdGFydGNvZGUobWVkaWFCdWYpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwCmluZGV4IGVmZGU3YTkuLmYyNTUzOWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAKQEAgLTMzLDcgKzMzLDcgQEAKICNpbmNsdWRlIDxvcGVuc3NsL21kNS5oPgogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KIAotI2luY2x1ZGUgIkhUVFBCYXNlLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9IVFRQQmFzZS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTIzOSw3ICsyMzksNyBAQAogICAgICAgICAvLyByaWdodCBoZXJlLCBzaW5jZSB3ZSBjdXJyZW50bHkgaGF2ZSBubyB3YXkgb2YgYXNraW5nIHRoZSB1c2VyCiAgICAgICAgIC8vIGZvciB0aGlzIGluZm9ybWF0aW9uLgogCi0gICAgICAgIEFMT0dFKCJNYWxmb3JtZWQgcnRzcCB1cmwgJXMiLCB1cmwuY19zdHIoKSk7CisgICAgICAgIEFMT0dFKCJNYWxmb3JtZWQgcnRzcCB1cmwgJXMiLCB1cmlEZWJ1Z1N0cmluZyh1cmwpLmNfc3RyKCkpOwogCiAgICAgICAgIHJlcGx5LT5zZXRJbnQzMigicmVzdWx0IiwgRVJST1JfTUFMRk9STUVEKTsKICAgICAgICAgcmVwbHktPnBvc3QoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJhd0F1ZGlvQXNzZW1ibGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJhd0F1ZGlvQXNzZW1ibGVyLmNwcAppbmRleCAwZGE1ZGQyLi4xNjdmN2E0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSYXdBdWRpb0Fzc2VtYmxlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUmF3QXVkaW9Bc3NlbWJsZXIuY3BwCkBAIC0zNCw3ICszNCw5IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIEFSYXdBdWRpb0Fzc2VtYmxlcjo6QVJhd0F1ZGlvQXNzZW1ibGVyKAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgY29uc3QgY2hhciAqZGVzYywgY29uc3QgQVN0cmluZyAmcGFyYW1zKQorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKKyAgICAgICAgY29uc3QgY2hhciAqIC8qIGRlc2MgKi8sCisgICAgICAgIGNvbnN0IEFTdHJpbmcgJiAvKiBwYXJhbXMgKi8pCiAgICAgOiBtTm90aWZ5TXNnKG5vdGlmeSksCiAgICAgICBtTmV4dEV4cGVjdGVkU2VxTm9WYWxpZChmYWxzZSksCiAgICAgICBtTmV4dEV4cGVjdGVkU2VxTm8oMCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5jcHAKaW5kZXggZThjYzVlMS4uNDc1NzNjMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uY3BwCkBAIC0zMjMsNiArMzIzLDExIEBACiAKICAgICBzID0gZW5kICsgMTsgIC8vIHNraXAgdGhlIGRhc2guCiAKKyAgICBpZiAoKnMgPT0gJ1wwJykgeworICAgICAgICAqbnB0MiA9IEZMVF9NQVg7ICAvLyBvcGVuIGVuZGVkLgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKICAgICBpZiAoIXN0cm5jbXAoIm5vdyIsIHMsIDMpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIG5vIGFic29sdXRlIGVuZCB0aW1lIGF2YWlsYWJsZQogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5tawppbmRleCBlNzdjNjljLi5kNjBkYzJmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BbmRyb2lkLm1rCkBAIC0yMCw3ICsyMCw3IEBACiAgICAgICAgIFNEUExvYWRlci5jcHAgICAgICAgICAgICAgICBcCiAKIExPQ0FMX0NfSU5DTFVERVM6PSBcCi0JJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCisJJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAogCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogCSQoVE9QKS9leHRlcm5hbC9vcGVuc3NsL2luY2x1ZGUKIApAQCAtMzAsNiArMzAsMTAgQEAKICAgICBMT0NBTF9DRkxBR1MgKz0gLVduby1wc2FiaQogZW5kaWYKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKworTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMgOj0gJChMT0NBTF9QQVRIKS9BbmRyb2lkLm1rCisKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKQEAgLTU1LDQgKzU5LDYgQEAKIAogTE9DQUxfTU9EVUxFOj0gcnRwX3Rlc3QKIAorTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMgOj0gJChMT0NBTF9QQVRIKS9BbmRyb2lkLm1rCisKICMgaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaAppbmRleCBjZDc3YWEwLi40MjNhNDIwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmgKQEAgLTE5LDcgKzE5LDExIEBACiAjZGVmaW5lIE1ZX0hBTkRMRVJfSF8KIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaWZuZGVmIExPR19UQUcKICNkZWZpbmUgTE9HX1RBRyAiTXlIYW5kbGVyIgorI2VuZGlmCisKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgIkFQYWNrZXRTb3VyY2UuaCIKQEAgLTQyLDYgKzQ2LDEyIEBACiAKICNpbmNsdWRlICJIVFRQQmFzZS5oIgogCisjaWYgTE9HX05ERUJVRworI2RlZmluZSBVTlVTRURfVU5MRVNTX1ZFUkJPU0UoeCkgKHZvaWQpKHgpCisjZWxzZQorI2RlZmluZSBVTlVTRURfVU5MRVNTX1ZFUkJPU0UoeCkKKyNlbmRpZgorCiAvLyBJZiBubyBhY2Nlc3MgdW5pdHMgYXJlIHJlY2VpdmVkIHdpdGhpbiA1IHNlY3MsIGFzc3VtZSB0aGF0IHRoZSBydHAKIC8vIHN0cmVhbSBoYXMgZW5kZWQgYW5kIHNpZ25hbCBlbmQgb2Ygc3RyZWFtLgogc3RhdGljIGludDY0X3Qga0FjY2Vzc1VuaXRUaW1lb3V0VXMgPSAxMDAwMDAwMGxsOwpAQCAtMTQ5LDcgKzE1OSw3IEBACiAgICAgICAgICAgICBtU2Vzc2lvblVSTC5hcHBlbmQoU3RyaW5nUHJpbnRmKCIldSIsIHBvcnQpKTsKICAgICAgICAgICAgIG1TZXNzaW9uVVJMLmFwcGVuZChwYXRoKTsKIAotICAgICAgICAgICAgQUxPR0koInJld3JpdHRlbiBzZXNzaW9uIHVybDogJyVzJyIsIG1TZXNzaW9uVVJMLmNfc3RyKCkpOworICAgICAgICAgICAgQUxPR1YoInJld3JpdHRlbiBzZXNzaW9uIHVybDogJyVzJyIsIG1TZXNzaW9uVVJMLmNfc3RyKCkpOwogICAgICAgICB9CiAKICAgICAgICAgbVNlc3Npb25Ib3N0ID0gaG9zdDsKQEAgLTE3OCw3ICsxODgsNyBAQAogICAgICAgICBtQ29ubi0+Y29ubmVjdChtT3JpZ2luYWxTZXNzaW9uVVJMLmNfc3RyKCksIHJlcGx5KTsKICAgICB9CiAKLSAgICBBU3RyaW5nIGdldENvbnRyb2xVUkwoc3A8QVNlc3Npb25EZXNjcmlwdGlvbj4gZGVzYykgeworICAgIEFTdHJpbmcgZ2V0Q29udHJvbFVSTCgpIHsKICAgICAgICAgQVN0cmluZyBzZXNzaW9uTGV2ZWxDb250cm9sVVJMOwogICAgICAgICBpZiAobVNlc3Npb25EZXNjLT5maW5kQXR0cmlidXRlKAogICAgICAgICAgICAgICAgIDAsCkBAIC0yNDQsNyArMjU0LDkgQEAKICAgICBzdGF0aWMgdm9pZCBhZGRTREVTKGludCBzLCBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CiAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOwogICAgICAgICBzb2NrbGVuX3QgYWRkclNpemUgPSBzaXplb2YoYWRkcik7Ci0gICAgICAgIENIRUNLX0VRKDAsIGdldHNvY2tuYW1lKHMsIChzb2NrYWRkciAqKSZhZGRyLCAmYWRkclNpemUpKTsKKyAgICAgICAgaWYgKGdldHNvY2tuYW1lKHMsIChzb2NrYWRkciAqKSZhZGRyLCAmYWRkclNpemUpICE9IDApIHsKKyAgICAgICAgICAgIGluZXRfYXRvbigiMC4wLjAuMCIsICYoYWRkci5zaW5fYWRkcikpOworICAgICAgICB9CiAKICAgICAgICAgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5zaXplKCk7CiAgICAgICAgIGRhdGFbMF0gPSAweDgwIHwgMTsKQEAgLTQ3OCwyMSArNDkwLDMyIEBACiAgICAgICAgICAgICAgICAgICAgIHNwPEFSVFNQUmVzcG9uc2U+IHJlc3BvbnNlID0KICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFSVFNQUmVzcG9uc2UgKj4ob2JqLmdldCgpKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UtPm1TdGF0dXNDb2RlID09IDMwMikgeworICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UtPm1TdGF0dXNDb2RlID09IDMwMSB8fCByZXNwb25zZS0+bVN0YXR1c0NvZGUgPT0gMzAyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IGkgPSByZXNwb25zZS0+bUhlYWRlcnMuaW5kZXhPZktleSgibG9jYXRpb24iKTsKICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0dFKGksIDApOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvblVSTCA9IHJlc3BvbnNlLT5tSGVhZGVycy52YWx1ZUF0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgbU9yaWdpbmFsU2Vzc2lvblVSTCA9IHJlc3BvbnNlLT5tSGVhZGVycy52YWx1ZUF0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25VUkwgPSBtT3JpZ2luYWxTZXNzaW9uVVJMOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBBU3RyaW5nIHJlcXVlc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ID0gIkRFU0NSSUJFICI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChtU2Vzc2lvblVSTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiIFJUU1AvMS4wXHJcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIkFjY2VwdDogYXBwbGljYXRpb24vc2RwXHJcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0cmlwIGFueSBhdXRoZW50aWNhdGlvbiBpbmZvIGZyb20gdGhlIHNlc3Npb24gdXJsLCB3ZSBkb24ndAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FudCB0byB0cmFuc21pdCB1c2VyL3Bhc3MgaW4gY2xlYXJ0ZXh0LgorICAgICAgICAgICAgICAgICAgICAgICAgQVN0cmluZyBob3N0LCBwYXRoLCB1c2VyLCBwYXNzOworICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgcG9ydDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBUlRTUENvbm5lY3Rpb246OlBhcnNlVVJMKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25VUkwuY19zdHIoKSwgJmhvc3QsICZwb3J0LCAmcGF0aCwgJnVzZXIsICZwYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB1c2VyLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvblVSTC5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uVVJMLmFwcGVuZCgicnRzcDovLyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uVVJMLmFwcGVuZChob3N0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvblVSTC5hcHBlbmQoIjoiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvblVSTC5hcHBlbmQoU3RyaW5nUHJpbnRmKCIldSIsIHBvcnQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvblVSTC5hcHBlbmQocGF0aCk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnZGVzYycsIGlkKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUNvbm4tPnNlbmRSZXF1ZXN0KHJlcXVlc3QuY19zdHIoKSwgcmVwbHkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJyZXdyaXR0ZW4gc2Vzc2lvbiB1cmw6ICclcyciLCBtU2Vzc2lvblVSTC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdjb25uJywgaWQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ29ubi0+Y29ubmVjdChtT3JpZ2luYWxTZXNzaW9uVVJMLmNfc3RyKCksIHJlcGx5KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTU0NSw3ICs1NjgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQmFzZVVSTCA9IHRtcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udHJvbFVSTCA9IGdldENvbnRyb2xVUkwobVNlc3Npb25EZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udHJvbFVSTCA9IGdldENvbnRyb2xVUkwoKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU2Vzc2lvbkRlc2MtPmNvdW50VHJhY2tzKCkgPCAyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlJ3Mgbm8gYWN0dWFsIHRyYWNrcyBpbiB0aGlzIHNlc3Npb24uCkBAIC01OTEsNyArNjE0LDcgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgbVNlZWthYmxlID0gIWlzTGl2ZVN0cmVhbShtU2Vzc2lvbkRlc2MpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ29udHJvbFVSTCA9IGdldENvbnRyb2xVUkwobVNlc3Npb25EZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250cm9sVVJMID0gZ2V0Q29udHJvbFVSTCgpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNlc3Npb25EZXNjLT5jb3VudFRyYWNrcygpIDwgMikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlJ3Mgbm8gYWN0dWFsIHRyYWNrcyBpbiB0aGlzIHNlc3Npb24uCkBAIC0xODA1LDYgKzE4MjgsOCBAQAogICAgIGJvb2wgYWRkTWVkaWFUaW1lc3RhbXAoCiAgICAgICAgICAgICBpbnQzMl90IHRyYWNrSW5kZXgsIGNvbnN0IFRyYWNrSW5mbyAqdHJhY2ssCiAgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCkgeworICAgICAgICBVTlVTRURfVU5MRVNTX1ZFUkJPU0UodHJhY2tJbmRleCk7CisKICAgICAgICAgdWludDMyX3QgcnRwVGltZTsKICAgICAgICAgQ0hFQ0soYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kSW50MzIoCiAgICAgICAgICAgICAgICAgICAgICJydHAtdGltZSIsIChpbnQzMl90ICopJnJ0cFRpbWUpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvU0RQTG9hZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvU0RQTG9hZGVyLmNwcAppbmRleCBlZDNmYTdlLi40MjRiYWRmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1NEUExvYWRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9TRFBMb2FkZXIuY3BwCkBAIC0xOCwzNCArMTgsMzAgQEAKICNkZWZpbmUgTE9HX1RBRyAiU0RQTG9hZGVyIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSAiU0RQTG9hZGVyLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9TRFBMb2FkZXIuaCIKIAogI2luY2x1ZGUgIkFTZXNzaW9uRGVzY3JpcHRpb24uaCIKLSNpbmNsdWRlICJIVFRQQmFzZS5oIgogCisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KIAogI2RlZmluZSBERUZBVUxUX1NEUF9TSVpFIDEwMDAwMAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLVNEUExvYWRlcjo6U0RQTG9hZGVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCB1aW50MzJfdCBmbGFncywgYm9vbCB1aWRWYWxpZCwgdWlkX3QgdWlkKQorU0RQTG9hZGVyOjpTRFBMb2FkZXIoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAorICAgICAgICB1aW50MzJfdCBmbGFncywKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSkKICAgICA6IG1Ob3RpZnkobm90aWZ5KSwKICAgICAgIG1GbGFncyhmbGFncyksCi0gICAgICBtVUlEVmFsaWQodWlkVmFsaWQpLAotICAgICAgbVVJRCh1aWQpLAogICAgICAgbU5ldExvb3BlcihuZXcgQUxvb3BlciksCiAgICAgICBtQ2FuY2VsbGVkKGZhbHNlKSwKLSAgICAgIG1IVFRQRGF0YVNvdXJjZSgKLSAgICAgICAgICAgICAgSFRUUEJhc2U6OkNyZWF0ZSgKLSAgICAgICAgICAgICAgICAgIChtRmxhZ3MgJiBrRmxhZ0luY29nbml0bykKLSAgICAgICAgICAgICAgICAgICAgPyBIVFRQQmFzZTo6a0ZsYWdJbmNvZ25pdG8KLSAgICAgICAgICAgICAgICAgICAgOiAwKSkgewotICAgIGlmIChtVUlEVmFsaWQpIHsKLSAgICAgICAgbUhUVFBEYXRhU291cmNlLT5zZXRVSUQobVVJRCk7Ci0gICAgfQotCisgICAgICBtSFRUUERhdGFTb3VyY2UobmV3IE1lZGlhSFRUUChodHRwU2VydmljZS0+bWFrZUhUVFBDb25uZWN0aW9uKCkpKSB7CiAgICAgbU5ldExvb3Blci0+c2V0TmFtZSgic2RwIG5ldCIpOwogICAgIG1OZXRMb29wZXItPnN0YXJ0KGZhbHNlIC8qIHJ1bk9uQ2FsbGluZ1RocmVhZCAqLywKICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBjYW5DYWxsSmF2YSAqLywKQEAgLTk0LDExICs5MCw3IEBACiAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMOwogICAgIG1zZy0+ZmluZFBvaW50ZXIoImhlYWRlcnMiLCAodm9pZCAqKikmaGVhZGVycyk7CiAKLSAgICBpZiAoIShtRmxhZ3MgJiBrRmxhZ0luY29nbml0bykpIHsKLSAgICAgICAgQUxPR0koIm9uTG9hZCAnJXMnIiwgdXJsLmNfc3RyKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dJKCJvbkxvYWQgPFVSTCBzdXBwcmVzc2VkPiIpOwotICAgIH0KKyAgICBBTE9HVigib25Mb2FkICVzIiwgdXJpRGVidWdTdHJpbmcodXJsLCBtRmxhZ3MgJiBrRmxhZ0luY29nbml0bykuY19zdHIoKSk7CiAKICAgICBpZiAoIW1DYW5jZWxsZWQpIHsKICAgICAgICAgZXJyID0gbUhUVFBEYXRhU291cmNlLT5jb25uZWN0KHVybC5jX3N0cigpLCBoZWFkZXJzKTsKQEAgLTEzMCw3ICsxMjIsNyBAQAogICAgICAgICBzc2l6ZV90IHJlYWRTaXplID0gbUhUVFBEYXRhU291cmNlLT5yZWFkQXQoMCwgYnVmZmVyLT5kYXRhKCksIHNkcFNpemUpOwogCiAgICAgICAgIGlmIChyZWFkU2l6ZSA8IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVhZCBTRFAsIGVycm9yIGNvZGUgPSAlbGQiLCByZWFkU2l6ZSk7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJlYWQgU0RQLCBlcnJvciBjb2RlID0gJXp1IiwgcmVhZFNpemUpOwogICAgICAgICAgICAgZXJyID0gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGRlc2MgPSBuZXcgQVNlc3Npb25EZXNjcmlwdGlvbjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9BbmRyb2lkLm1rCmluZGV4IDA2Y2UxNmIuLjk5YjQ4MGFkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0FuZHJvaWQubWsKQEAgLTksNyArOSw3IEBACiBMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwogCiBMT0NBTF9TUkNfRklMRVMgOj0gXAotICAgIFN1cmZhY2VNZWRpYVNvdXJjZV90ZXN0LmNwcCBcCisJU3VyZmFjZU1lZGlhU291cmNlX3Rlc3QuY3BwIFwKIAlEdW1teVJlY29yZGVyLmNwcCBcCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXApAQCAtMzMsMTggKzMzLDU1IEBACiAJbGliZ3Rlc3RfbWFpbiBcCiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgIGJpb25pYyBcCi0gICAgYmlvbmljL2xpYnN0ZGMrKy9pbmNsdWRlIFwKLSAgICBleHRlcm5hbC9ndGVzdC9pbmNsdWRlIFwKLSAgICBleHRlcm5hbC9zdGxwb3J0L3N0bHBvcnQgXAorCWJpb25pYyBcCisJYmlvbmljL2xpYnN0ZGMrKy9pbmNsdWRlIFwKKwlleHRlcm5hbC9ndGVzdC9pbmNsdWRlIFwKKwlleHRlcm5hbC9zdGxwb3J0L3N0bHBvcnQgXAorCWZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAorCWZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCisJJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCisKK0xPQ0FMXzMyX0JJVF9PTkxZIDo9IHRydWUKKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCisKK2VuZGlmCisKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRSA6PSBVdGlsc190ZXN0CisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisJVXRpbHNfdGVzdC5jcHAgXAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJjdXRpbHMgXAorCWxpYmxvZyBcCisJbGlibWVkaWEgXAorCWxpYnN0YWdlZnJpZ2h0IFwKKwlsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKKwlsaWJzdGFnZWZyaWdodF9vbXggXAorCWxpYnN0bHBvcnQgXAorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKKwlsaWJndGVzdCBcCisJbGliZ3Rlc3RfbWFpbiBcCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorCWJpb25pYyBcCisJYmlvbmljL2xpYnN0ZGMrKy9pbmNsdWRlIFwKKwlleHRlcm5hbC9ndGVzdC9pbmNsdWRlIFwKKwlleHRlcm5hbC9zdGxwb3J0L3N0bHBvcnQgXAorCWZyYW1ld29ya3MvYXYvaW5jbHVkZSBcCiAJZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCiAJZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKIAkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKIAogaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCiAKLWVuZGlmCi0KICMgSW5jbHVkZSBzdWJkaXJlY3RvcnkgbWFrZWZpbGVzCiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9EdW1teVJlY29yZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0R1bW15UmVjb3JkZXIuY3BwCmluZGV4IGFjMzdiMjguLjhmMTcwODggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0R1bW15UmVjb3JkZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0R1bW15UmVjb3JkZXIuY3BwCkBAIC02MSw3ICs2MSw3IEBACiAgICAgbVNvdXJjZS0+c3RvcCgpOwogICAgIHZvaWQgKmR1bW15OwogICAgIHB0aHJlYWRfam9pbihtVGhyZWFkLCAmZHVtbXkpOwotICAgIHN0YXR1c190IGVyciA9IChzdGF0dXNfdCkgZHVtbXk7CisgICAgc3RhdHVzX3QgZXJyID0gc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihkdW1teSkpOwogCiAgICAgQUxPR1YoIkVuZGluZyB0aGUgcmVhZGluZyB0aHJlYWQiKTsKICAgICByZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvU3VyZmFjZU1lZGlhU291cmNlX3Rlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvU3VyZmFjZU1lZGlhU291cmNlX3Rlc3QuY3BwCmluZGV4IDQ5ZmZjZDYuLmZkODg5ZjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL1N1cmZhY2VNZWRpYVNvdXJjZV90ZXN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9TdXJmYWNlTWVkaWFTb3VyY2VfdGVzdC5jcHAKQEAgLTM1LDcgKzM1LDYgQEAKICNpbmNsdWRlIDxndWkvU3VyZmFjZUNvbXBvc2VyQ2xpZW50Lmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+Ci0jaW5jbHVkZSA8dWkvRnJhbWVidWZmZXJOYXRpdmVXaW5kb3cuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgpAQCAtMTEwLDcgKzEwOSw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HVigiTm8gYWN0dWFsIGRpc3BsYXkuIENob29zaW5nIEVHTFN1cmZhY2UgYmFzZWQgb24gU3VyZmFjZU1lZGlhU291cmNlIik7CiAgICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBzbXMgPSAobmV3IFN1cmZhY2VNZWRpYVNvdXJjZSgKLSAgICAgICAgICAgICAgICAgICAgZ2V0U3VyZmFjZVdpZHRoKCksIGdldFN1cmZhY2VIZWlnaHQoKSkpLT5nZXRCdWZmZXJRdWV1ZSgpOworICAgICAgICAgICAgICAgICAgICBnZXRTdXJmYWNlV2lkdGgoKSwgZ2V0U3VyZmFjZUhlaWdodCgpKSktPmdldFByb2R1Y2VyKCk7CiAgICAgICAgICAgICBzcDxTdXJmYWNlPiBzdGMgPSBuZXcgU3VyZmFjZShzbXMpOwogICAgICAgICAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gd2luZG93ID0gc3RjOwogCkBAIC0zNjEsOSArMzYwLDcgQEAKICAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CiAgICAgICAgIGFuZHJvaWQ6OlByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKICAgICAgICAgbVNNUyA9IG5ldyBTdXJmYWNlTWVkaWFTb3VyY2UobVl1dlRleFdpZHRoLCBtWXV2VGV4SGVpZ2h0KTsKLQotICAgICAgICAvLyBNYW51YWwgY2FzdCBpcyByZXF1aXJlZCB0byBhdm9pZCBjb25zdHJ1Y3RvciBhbWJpZ3VpdHkKLSAgICAgICAgbVNUQyA9IG5ldyBTdXJmYWNlKHN0YXRpY19jYXN0PHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ID4oIG1TTVMtPmdldEJ1ZmZlclF1ZXVlKCkpKTsKKyAgICAgICAgbVNUQyA9IG5ldyBTdXJmYWNlKG1TTVMtPmdldFByb2R1Y2VyKCkpOwogICAgICAgICBtQU5XID0gbVNUQzsKICAgICB9CiAKQEAgLTM5OCw3ICszOTUsNyBAQAogICAgICAgICBBTE9HVigiU01TLUdMVGVzdDo6U2V0VXAoKSIpOwogICAgICAgICBhbmRyb2lkOjpQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CiAgICAgICAgIG1TTVMgPSBuZXcgU3VyZmFjZU1lZGlhU291cmNlKG1ZdXZUZXhXaWR0aCwgbVl1dlRleEhlaWdodCk7Ci0gICAgICAgIG1TVEMgPSBuZXcgU3VyZmFjZShzdGF0aWNfY2FzdDxzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiA+KCBtU01TLT5nZXRCdWZmZXJRdWV1ZSgpKSk7CisgICAgICAgIG1TVEMgPSBuZXcgU3VyZmFjZShtU01TLT5nZXRQcm9kdWNlcigpKTsKICAgICAgICAgbUFOVyA9IG1TVEM7CiAKICAgICAgICAgLy8gRG9pbmcgdGhlIHNldHVwIHJlbGF0ZWQgdG8gdGhlIEdMIFNpZGUKQEAgLTUyNyw3ICs1MjQsOCBAQAogfQogCiAvLyBEZXF1ZXVpbmcgYW5kIHF1ZXVpbmcgdGhlIGJ1ZmZlciB3aXRob3V0IHJlYWxseSBmaWxsaW5nIGl0IGluLgotdm9pZCBTdXJmYWNlTWVkaWFTb3VyY2VUZXN0OjpvbmVCdWZmZXJQYXNzTm9GaWxsKGludCB3aWR0aCwgaW50IGhlaWdodCApIHsKK3ZvaWQgU3VyZmFjZU1lZGlhU291cmNlVGVzdDo6b25lQnVmZmVyUGFzc05vRmlsbCgKKyAgICAgICAgaW50IC8qIHdpZHRoICovLCBpbnQgLyogaGVpZ2h0ICAqLykgewogICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGFuYjsKICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG5hdGl2ZV93aW5kb3dfZGVxdWV1ZV9idWZmZXJfYW5kX3dhaXQobUFOVy5nZXQoKSwgJmFuYikpOwogICAgIEFTU0VSVF9UUlVFKGFuYiAhPSBOVUxMKTsKQEAgLTc0Niw5ICs3NDQsOCBAQAogICAgIENIRUNLKGZkID49IDApOwogCiAgICAgc3A8TWVkaWFSZWNvcmRlcj4gbXIgPSBTdXJmYWNlTWVkaWFTb3VyY2VHTFRlc3Q6OnNldFVwTWVkaWFSZWNvcmRlcihmZCwKLSAgICAgICAgICAgIFZJREVPX1NPVVJDRV9HUkFMTE9DX0JVRkZFUiwKLSAgICAgICAgICAgIE9VVFBVVF9GT1JNQVRfTVBFR180LCBWSURFT19FTkNPREVSX0gyNjQsIG1ZdXZUZXhXaWR0aCwKLSAgICAgICAgICAgIG1ZdXZUZXhIZWlnaHQsIDMwKTsKKyAgICAgICAgICAgIFZJREVPX1NPVVJDRV9TVVJGQUNFLCBPVVRQVVRfRk9STUFUX01QRUdfNCwgVklERU9fRU5DT0RFUl9IMjY0LAorICAgICAgICAgICAgbVl1dlRleFdpZHRoLCBtWXV2VGV4SGVpZ2h0LCAzMCk7CiAgICAgLy8gZ2V0IHRoZSByZWZlcmVuY2UgdG8gdGhlIHN1cmZhY2VtZWRpYXNvdXJjZSBsaXZpbmcgaW4KICAgICAvLyBtZWRpYXNlcnZlciB0aGF0IGlzIGNyZWF0ZWQgYnkgc3RhZ2VmcmlnaHRyZWNvcmRlcgogICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGlTVCA9IG1yLT5xdWVyeVN1cmZhY2VNZWRpYVNvdXJjZUZyb21NZWRpYVNlcnZlcigpOwpAQCAtNzgzLDcgKzc4MCw3IEBACiAgICAgQUxPR1YoIlZlcmlmeSBjcmVhdGluZyBhIHN1cmZhY2Ugdy8gcmlnaHQgY29uZmlnICsgZHVtbXkgd3JpdGVyKioqKioqKioqIik7CiAKICAgICBtU01TID0gbmV3IFN1cmZhY2VNZWRpYVNvdXJjZShtWXV2VGV4V2lkdGgsIG1ZdXZUZXhIZWlnaHQpOwotICAgIG1TVEMgPSBuZXcgU3VyZmFjZShzdGF0aWNfY2FzdDxzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiA+KCBtU01TLT5nZXRCdWZmZXJRdWV1ZSgpKSk7CisgICAgbVNUQyA9IG5ldyBTdXJmYWNlKG1TTVMtPmdldFByb2R1Y2VyKCkpOwogICAgIG1BTlcgPSBtU1RDOwogCiAgICAgRHVtbXlSZWNvcmRlciB3cml0ZXIobVNNUyk7CkBAIC04ODAsNyArODc3LDcgQEAKICAgICB9CiAgICAgQ0hFQ0soZmQgPj0gMCk7CiAKLSAgICBzcDxNZWRpYVJlY29yZGVyPiBtciA9IHNldFVwTWVkaWFSZWNvcmRlcihmZCwgVklERU9fU09VUkNFX0dSQUxMT0NfQlVGRkVSLAorICAgIHNwPE1lZGlhUmVjb3JkZXI+IG1yID0gc2V0VXBNZWRpYVJlY29yZGVyKGZkLCBWSURFT19TT1VSQ0VfU1VSRkFDRSwKICAgICAgICAgICAgIE9VVFBVVF9GT1JNQVRfTVBFR180LCBWSURFT19FTkNPREVSX0gyNjQsIG1ZdXZUZXhXaWR0aCwgbVl1dlRleEhlaWdodCwgMzApOwogCiAgICAgLy8gZ2V0IHRoZSByZWZlcmVuY2UgdG8gdGhlIHN1cmZhY2VtZWRpYXNvdXJjZSBsaXZpbmcgaW4KQEAgLTkyMyw3ICs5MjAsNyBAQAogICAgIH0KICAgICBDSEVDSyhmZCA+PSAwKTsKIAotICAgIHNwPE1lZGlhUmVjb3JkZXI+IG1yID0gc2V0VXBNZWRpYVJlY29yZGVyKGZkLCBWSURFT19TT1VSQ0VfR1JBTExPQ19CVUZGRVIsCisgICAgc3A8TWVkaWFSZWNvcmRlcj4gbXIgPSBzZXRVcE1lZGlhUmVjb3JkZXIoZmQsIFZJREVPX1NPVVJDRV9TVVJGQUNFLAogICAgICAgICAgICAgT1VUUFVUX0ZPUk1BVF9NUEVHXzQsIFZJREVPX0VOQ09ERVJfSDI2NCwgbVl1dlRleFdpZHRoLCBtWXV2VGV4SGVpZ2h0LCAzMCk7CiAKICAgICAvLyBnZXQgdGhlIHJlZmVyZW5jZSB0byB0aGUgc3VyZmFjZW1lZGlhc291cmNlIGxpdmluZyBpbgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvVXRpbHNfdGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9VdGlsc190ZXN0LmNwcAppbmRleCAyMmM0YTczLi4xYzEzZjE5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9VdGlsc190ZXN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9VdGlsc190ZXN0LmNwcApAQCAtMzIsNyArMzIsNjQgQEAKIGNsYXNzIFV0aWxzVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewogfTsKIAorVEVTVF9GKFV0aWxzVGVzdCwgVGVzdEZvdXJDQykgeworICAgIEFTU0VSVF9FUShGT1VSQ0MoJ3MnLCAndCcsICdtJyAsICd1JyksICdzdG11Jyk7Cit9CisKIFRFU1RfRihVdGlsc1Rlc3QsIFRlc3RNYXRoVGVtcGxhdGVzKSB7CisgICAgQVNTRVJUX0VRKGRpdlJvdW5kKC0xMCwgLTQpLCAzKTsKKyAgICBBU1NFUlRfRVEoZGl2Um91bmQoLTExLCAtNCksIDMpOworICAgIEFTU0VSVF9FUShkaXZSb3VuZCgtMTIsIC00KSwgMyk7CisgICAgQVNTRVJUX0VRKGRpdlJvdW5kKC0xMywgLTQpLCAzKTsKKyAgICBBU1NFUlRfRVEoZGl2Um91bmQoLTE0LCAtNCksIDQpOworCisgICAgQVNTRVJUX0VRKGRpdlJvdW5kKDEwLCAtNCksIC0zKTsKKyAgICBBU1NFUlRfRVEoZGl2Um91bmQoMTEsIC00KSwgLTMpOworICAgIEFTU0VSVF9FUShkaXZSb3VuZCgxMiwgLTQpLCAtMyk7CisgICAgQVNTRVJUX0VRKGRpdlJvdW5kKDEzLCAtNCksIC0zKTsKKyAgICBBU1NFUlRfRVEoZGl2Um91bmQoMTQsIC00KSwgLTQpOworCisgICAgQVNTRVJUX0VRKGRpdlJvdW5kKC0xMCwgNCksIC0zKTsKKyAgICBBU1NFUlRfRVEoZGl2Um91bmQoLTExLCA0KSwgLTMpOworICAgIEFTU0VSVF9FUShkaXZSb3VuZCgtMTIsIDQpLCAtMyk7CisgICAgQVNTRVJUX0VRKGRpdlJvdW5kKC0xMywgNCksIC0zKTsKKyAgICBBU1NFUlRfRVEoZGl2Um91bmQoLTE0LCA0KSwgLTQpOworCisgICAgQVNTRVJUX0VRKGRpdlJvdW5kKDEwLCA0KSwgMyk7CisgICAgQVNTRVJUX0VRKGRpdlJvdW5kKDExLCA0KSwgMyk7CisgICAgQVNTRVJUX0VRKGRpdlJvdW5kKDEyLCA0KSwgMyk7CisgICAgQVNTRVJUX0VRKGRpdlJvdW5kKDEzLCA0KSwgMyk7CisgICAgQVNTRVJUX0VRKGRpdlJvdW5kKDE0LCA0KSwgNCk7CisKKyAgICBBU1NFUlRfRVEoZGl2VXAoLTExLCAtNCksIDMpOworICAgIEFTU0VSVF9FUShkaXZVcCgtMTIsIC00KSwgMyk7CisgICAgQVNTRVJUX0VRKGRpdlVwKC0xMywgLTQpLCA0KTsKKworICAgIEFTU0VSVF9FUShkaXZVcCgxMSwgLTQpLCAtMik7CisgICAgQVNTRVJUX0VRKGRpdlVwKDEyLCAtNCksIC0zKTsKKyAgICBBU1NFUlRfRVEoZGl2VXAoMTMsIC00KSwgLTMpOworCisgICAgQVNTRVJUX0VRKGRpdlVwKC0xMSwgNCksIC0yKTsKKyAgICBBU1NFUlRfRVEoZGl2VXAoLTEyLCA0KSwgLTMpOworICAgIEFTU0VSVF9FUShkaXZVcCgtMTMsIDQpLCAtMyk7CisKKyAgICBBU1NFUlRfRVEoZGl2VXAoMTEsIDQpLCAzKTsKKyAgICBBU1NFUlRfRVEoZGl2VXAoMTIsIDQpLCAzKTsKKyAgICBBU1NFUlRfRVEoZGl2VXAoMTMsIDQpLCA0KTsKKworICAgIEFTU0VSVF9FUShhYnMoNUwpLCA1TCk7CisgICAgQVNTRVJUX0VRKGFicygtMjUpLCAyNSk7CisKKyAgICBBU1NFUlRfRVEobWluKDUuNmYsIDYuMGYpLCA1LjZmKTsKKyAgICBBU1NFUlRfRVEobWluKDYuMGYsIDUuNmYpLCA1LjZmKTsKKyAgICBBU1NFUlRfRVEobWluKC00LjMsIDguNiksIC00LjMpOworICAgIEFTU0VSVF9FUShtaW4oOC42LCAtNC4zKSwgLTQuMyk7CisKKyAgICBBU1NFUlRfRVEobWF4KDUuNmYsIDYuMGYpLCA2LjBmKTsKKyAgICBBU1NFUlRfRVEobWF4KDYuMGYsIDUuNmYpLCA2LjBmKTsKKyAgICBBU1NFUlRfRVEobWF4KC00LjMsIDguNiksIDguNik7CisgICAgQVNTRVJUX0VRKG1heCg4LjYsIC00LjMpLCA4LjYpOworCiAgICAgQVNTRVJUX0ZBTFNFKGlzSW5SYW5nZSgtNDMsIDg2dSwgLTQ0KSk7CiAgICAgQVNTRVJUX1RSVUUoaXNJblJhbmdlKC00MywgODd1LCAtNDMpKTsKICAgICBBU1NFUlRfVFJVRShpc0luUmFuZ2UoLTQzLCA4OHUsIC0xKSk7CkBAIC0xMTMsNiArMTcwLDEzIEBACiAgICAgQVNTRVJUX0ZBTFNFKGlzSW5SYW5nZSg0M3UsIDkxdSwgMTM0dSwgfjZ1KSk7CiAgICAgQVNTRVJUX0ZBTFNFKGlzSW5SYW5nZSg0M3UsIDkydSwgMTM2dSwgMHUpKTsKICAgICBBU1NFUlRfRkFMU0UoaXNJblJhbmdlKDQzdSwgOTJ1LCAxMzZ1LCAxdSkpOworCisgICAgQVNTRVJUX0VRKHBlcmlvZGljRXJyb3IoMTI0LCAxMDApLCAyNCk7CisgICAgQVNTRVJUX0VRKHBlcmlvZGljRXJyb3IoMjg4LCAxMDApLCAxMik7CisgICAgQVNTRVJUX0VRKHBlcmlvZGljRXJyb3IoLTM0NSwgMTAwKSwgNDUpOworICAgIEFTU0VSVF9FUShwZXJpb2RpY0Vycm9yKC00OTMsIDEwMCksIDcpOworICAgIEFTU0VSVF9FUShwZXJpb2RpY0Vycm9yKC01NTAsIDEwMCksIDUwKTsKKyAgICBBU1NFUlRfRVEocGVyaW9kaWNFcnJvcigtNjAwLCAxMDApLCAwKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvQW5kcm9pZC5tawppbmRleCBmMDk5YmJkLi42YThiOWZjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvQW5kcm9pZC5tawpAQCAtOSw3ICs5LDggQEAKICAgICAgICAgVGltZWRUZXh0U1JUU291cmNlLmNwcCAgICBcCiAgICAgICAgIFRpbWVkVGV4dFBsYXllci5jcHAKIAotTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyCitMT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIgLVdlcnJvcgorCiBMT0NBTF9DX0lOQ0xVREVTOj0gXAogICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3RpbWVkdGV4dCBcCiAgICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0RHJpdmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHREcml2ZXIuY3BwCmluZGV4IDEyZmQ3ZjQuLjcxYWEyMWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHREcml2ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHREcml2ZXIuY3BwCkBAIC0yMCw2ICsyMCw3IEBACiAKICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KIAorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFwbGF5ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KQEAgLTQwLDkgKzQxLDExIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIFRpbWVkVGV4dERyaXZlcjo6VGltZWRUZXh0RHJpdmVyKAotICAgICAgICBjb25zdCB3cDxNZWRpYVBsYXllckJhc2U+ICZsaXN0ZW5lcikKKyAgICAgICAgY29uc3Qgd3A8TWVkaWFQbGF5ZXJCYXNlPiAmbGlzdGVuZXIsCisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UpCiAgICAgOiBtTG9vcGVyKG5ldyBBTG9vcGVyKSwKICAgICAgIG1MaXN0ZW5lcihsaXN0ZW5lciksCisgICAgICBtSFRUUFNlcnZpY2UoaHR0cFNlcnZpY2UpLAogICAgICAgbVN0YXRlKFVOSU5JVElBTElaRUQpLAogICAgICAgbUN1cnJlbnRUcmFja0luZGV4KFVJTlRfTUFYKSB7CiAgICAgbUxvb3Blci0+c2V0TmFtZSgiVGltZWRUZXh0RHJpdmVyIik7CkBAIC0yMDcsNyArMjEwLDcgQEAKICAgICB9CiAKICAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0KLSAgICAgICAgICAgIERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkodXJpKTsKKyAgICAgICAgICAgIERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkobUhUVFBTZXJ2aWNlLCB1cmkpOwogICAgIHJldHVybiBjcmVhdGVPdXRPZkJhbmRUZXh0U291cmNlKHRyYWNrSW5kZXgsIG1pbWVUeXBlLCBkYXRhU291cmNlKTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dFBsYXllci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0UGxheWVyLmNwcAppbmRleCA5ZmIwYWZlLi5hMDcwNDg3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0UGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0UGxheWVyLmNwcApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZSBMT0dfVEFHICJUaW1lZFRleHRQbGF5ZXIiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPGxpbWl0cy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgpAQCAtMjcxLDcgKzI3Miw3IEBACiAgICAgc3A8TWVkaWFQbGF5ZXJCYXNlPiBsaXN0ZW5lciA9IG1MaXN0ZW5lci5wcm9tb3RlKCk7CiAgICAgaWYgKGxpc3RlbmVyID09IE5VTEwpIHsKICAgICAgICAgLy8gVE9ETzogaXQgbWF5IGJlIGJldHRlciB0byByZXR1cm4ga0ludmFsaWRUaW1lVXMKLSAgICAgICAgQUxPR0UoIiVzOiBMaXN0ZW5lciBpcyBOVUxMLiAoZmlyZVRpbWVVcyA9ICVsbGQpIiwKKyAgICAgICAgQUxPR0UoIiVzOiBMaXN0ZW5lciBpcyBOVUxMLiAoZmlyZVRpbWVVcyA9ICUiIFBSSWQ2NCIgKSIsCiAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZmlyZVRpbWVVcyk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHRTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHRTb3VyY2UuaAppbmRleCA3NTZjYzMxLi44YzFjMWNkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0U291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dFNvdXJjZS5oCkBAIC00Nyw3ICs0Nyw3IEBACiAgICAgICAgICAgaW50NjRfdCAqZW5kVGltZVVzLAogICAgICAgICAgIFBhcmNlbCAqcGFyY2VsLAogICAgICAgICAgIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpID0gMDsKLSAgdmlydHVhbCBzdGF0dXNfdCBleHRyYWN0R2xvYmFsRGVzY3JpcHRpb25zKFBhcmNlbCAqcGFyY2VsKSB7CisgIHZpcnR1YWwgc3RhdHVzX3QgZXh0cmFjdEdsb2JhbERlc2NyaXB0aW9ucyhQYXJjZWwgKiAvKiBwYXJjZWwgKi8pIHsKICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgfQogICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9BbmRyb2lkLm1rCmluZGV4IGE1ZTdiYTIuLjlhOWZkZTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvQW5kcm9pZC5tawpAQCAtMiw3ICsyLDYgQEAKIAogIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAjIFVuaXQgdGVzdHMgZm9yIGxpYnN0YWdlZnJpZ2h0X3RpbWVkdGV4dAotIyBTZWUgYWxzbyAvZGV2ZWxvcG1lbnQvdGVzdHJ1bm5lci90ZXN0X2RlZnMueG1sCiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0xOCwxMCArMTcsMTMgQEAKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAgICAgJChUT1ApL2V4dGVybmFsL2V4cGF0L2xpYiBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQKKyAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgbGliYmluZGVyIFwKICAgICBsaWJleHBhdCBcCi0gICAgbGlic3RhZ2VmcmlnaHQKKyAgICBsaWJzdGFnZWZyaWdodCBcCisgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBcCisgICAgbGlidXRpbHMKIAogaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwODE0NjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyMyBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfQ1BQRkxBR1MgKz0gLURfX1NURElOVF9MSU1JVFMgXAorICAgICAgICAgICAgICAgICAgLVdlcnJvcgorCitMT0NBTF9TUkNfRklMRVM6PSBFYm1sVXRpbC5jcHAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIFdlYm1FbGVtZW50LmNwcCAgICAgXAorICAgICAgICAgICAgICAgICAgV2VibUZyYW1lLmNwcCAgICAgICBcCisgICAgICAgICAgICAgICAgICBXZWJtRnJhbWVUaHJlYWQuY3BwIFwKKyAgICAgICAgICAgICAgICAgIFdlYm1Xcml0ZXIuY3BwCisKKworTE9DQUxfQ19JTkNMVURFUyArPSAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9pbmNsdWRlCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnN0YWdlZnJpZ2h0IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGlidXRpbHMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJsb2cKKworTE9DQUxfTU9EVUxFOj0gbGlic3RhZ2VmcmlnaHRfd2VibQorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0VibWxVdGlsLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vRWJtbFV0aWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0OWZlYzYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0VibWxVdGlsLmNwcApAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIHsKKworLy8gVGFibGUgZm9yIFNlYWwncyBhbGdvcml0aG0gZm9yIE51bWJlciBvZiBUcmFpbGluZyBaZXJvcy4gSGFja2VyJ3MgRGVsaWdodAorLy8gb25saW5lLCBGaWd1cmUgNS0xOCAoaHR0cDovL3d3dy5oYWNrZXJzZGVsaWdodC5vcmcvcmV2aXNpb25zLnBkZikKKy8vIFRoZSBlbnRyaWVzIHdob3NlIHZhbHVlIGlzIC0xIGFyZSBuZXZlciByZWZlcmVuY2VkLgoraW50IE5UWl9UQUJMRVtdID0geworICAgIDMyLCAgMCwgIDEsIDEyLCAgMiwgIDYsIC0xLCAxMywgICAzLCAtMSwgIDcsIC0xLCAtMSwgLTEsIC0xLCAxNCwKKyAgICAxMCwgIDQsIC0xLCAtMSwgIDgsIC0xLCAtMSwgMjUsICAtMSwgLTEsIC0xLCAtMSwgLTEsIDIxLCAyNywgMTUsCisgICAgMzEsIDExLCAgNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAgIDksIC0xLCAtMSwgMjQsIC0xLCAtMSwgMjAsIDI2LAorICAgIDMwLCAtMSwgLTEsIC0xLCAtMSwgMjMsIC0xLCAxOSwgIDI5LCAtMSwgMjIsIDE4LCAyOCwgMTcsIDE2LCAtMQorfTsKKworaW50IG51bWJlck9mVHJhaWxpbmdaZXJvczMyKGludDMyX3QgaSkgeworICAgIHVpbnQzMl90IHUgPSAoaSAmIC1pKSAqIDB4MDQ1MEZCQUY7CisgICAgcmV0dXJuIE5UWl9UQUJMRVsodSkgPj4gMjZdOworfQorCit1aW50NjRfdCBoaWdoZXN0T25lQml0KHVpbnQ2NF90IG4pIHsKKyAgICBuIHw9IChuID4+IDEpOworICAgIG4gfD0gKG4gPj4gMik7CisgICAgbiB8PSAobiA+PiA0KTsKKyAgICBuIHw9IChuID4+IDgpOworICAgIG4gfD0gKG4gPj4gMTYpOworICAgIG4gfD0gKG4gPj4gMzIpOworICAgIHJldHVybiBuIC0gKG4gPj4gMSk7Cit9CisKK3VpbnQ2NF90IF9wb3dlck9mMih1aW50NjRfdCB1KSB7CisgICAgdWludDY0X3QgcG93ZXJPZjIgPSBoaWdoZXN0T25lQml0KHUpOworICAgIHJldHVybiBwb3dlck9mMiA/IHBvd2VyT2YyIDogMTsKK30KKworLy8gQmFzZWQgb24gTG9uZy5udW1iZXJPZlRyYWlsaW5nWmVyb3MgaW4gTG9uZy5qYXZhCitpbnQgbnVtYmVyT2ZUcmFpbGluZ1plcm9zKHVpbnQ2NF90IHUpIHsKKyAgICBpbnQzMl90IGxvdyA9IHU7CisgICAgcmV0dXJuIGxvdyAhPTAgPyBudW1iZXJPZlRyYWlsaW5nWmVyb3MzMihsb3cpCisgICAgICAgICAgICAgICAgICAgOiAzMiArIG51bWJlck9mVHJhaWxpbmdaZXJvczMyKChpbnQzMl90KSAodSA+PiAzMikpOworfQorfQorCituYW1lc3BhY2Ugd2VibSB7CisKKy8vIEVuY29kZSB0aGUgaWQgYW5kL29yIHNpemUgb2YgYW4gRUJNTCBlbGVtZW50IGJ5dGVzIGJ5IHNldHRpbmcgYSBsZWFkaW5nIGxlbmd0aCBkZXNjcmlwdG9yIGJpdDoKKy8vCisvLyAgIDF4eHh4eHh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMS1ieXRlIHZhbHVlcworLy8gICAwMXh4eHh4eCB4eHh4eHh4eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtCisvLyAgIDAwMXh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0KKy8vICAgMDAwMXh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAuLi4KKy8vICAgMDAwMDF4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggICAgICAgICAgICAgICAgICAgICAgICAgICAgLQorLy8gICAwMDAwMDF4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCAgICAgICAgICAgICAgICAgICAtCisvLyAgIDAwMDAwMDF4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4ICAgICAgICAgIC0KKy8vICAgMDAwMDAwMDEgeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggLSA4LWJ5dGUgdmFsdWVzCisvLworLy8gVGhpcyBmdW5jdGlvbiB1c2VzIHRoZSBsZWFzdCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHBvc3NpYmxlLgordWludDY0X3QgZW5jb2RlVW5zaWduZWQodWludDY0X3QgdSkgeworICAgIHVpbnQ2NF90IHBvd2VyT2YyID0gX3Bvd2VyT2YyKHUpOworICAgIGlmICh1ICsgMSA9PSBwb3dlck9mMiA8PCAxKQorICAgICAgICBwb3dlck9mMiA8PD0gMTsKKyAgICBpbnQgc2hpZnRXaWR0aCA9ICg3ICsgbnVtYmVyT2ZUcmFpbGluZ1plcm9zKHBvd2VyT2YyKSkgLyA3ICogNzsKKyAgICBsb25nIGxlbmd0aERlc2NyaXB0b3IgPSAxIDw8IHNoaWZ0V2lkdGg7CisgICAgcmV0dXJuIGxlbmd0aERlc2NyaXB0b3IgfCB1OworfQorCisvLyBMaWtlIGFib3ZlIGJ1dCBwYWRzIHRoZSBpbnB1dCB2YWx1ZSB3aXRoIGxlYWRpbmcgemVyb3MgdXAgdG8gdGhlIHNwZWNpZmllZCB3aWR0aC4gVGhlIGxlbmd0aAorLy8gZGVzY3JpcHRvciBpcyBjYWxjdWxhdGVkIGJhc2VkIG9uIHdpZHRoLgordWludDY0X3QgZW5jb2RlVW5zaWduZWQodWludDY0X3QgdSwgaW50IHdpZHRoKSB7CisgICAgaW50IHNoaWZ0V2lkdGggPSA3ICogd2lkdGg7CisgICAgdWludDY0X3QgbGVuZ3RoRGVzY3JpcHRvciA9IDE7CisgICAgbGVuZ3RoRGVzY3JpcHRvciA8PD0gc2hpZnRXaWR0aDsKKyAgICByZXR1cm4gbGVuZ3RoRGVzY3JpcHRvciB8IHU7Cit9CisKKy8vIENhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIGFuIEVCTUwgY29kZWQgaWQgb3Igc2l6ZSBmcm9tIGl0cyBsZW5ndGggZGVzY3JpcHRvci4KK2ludCBzaXplT2YodWludDY0X3QgdSkgeworICAgIHVpbnQ2NF90IHBvd2VyT2YyID0gX3Bvd2VyT2YyKHUpOworICAgIGludCB1bnNpZ25lZExlbmd0aCA9IG51bWJlck9mVHJhaWxpbmdaZXJvcyhwb3dlck9mMikgLyA4ICsgMTsKKyAgICByZXR1cm4gdW5zaWduZWRMZW5ndGg7Cit9CisKKy8vIFNlcmlhbGl6ZSBhbiBFQk1MIGNvZGVkIGlkIG9yIHNpemUgaW4gYmlnLWVuZGlhbiBvcmRlci4KK2ludCBzZXJpYWxpemVDb2RlZFVuc2lnbmVkKHVpbnQ2NF90IHUsIHVpbnQ4X3QqIGJhcnkpIHsKKyAgICBpbnQgdW5zaWduZWRMZW5ndGggPSBzaXplT2YodSk7CisgICAgZm9yIChpbnQgaSA9IHVuc2lnbmVkTGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgYmFyeVtpXSA9IHUgJiAweGZmOworICAgICAgICB1ID4+PSA4OworICAgIH0KKyAgICByZXR1cm4gdW5zaWduZWRMZW5ndGg7Cit9CisKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vRWJtbFV0aWwuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vRWJtbFV0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjljMzdjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9FYm1sVXRpbC5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEVCTUxVVElMX0hfCisjZGVmaW5lIEVCTUxVVElMX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIHdlYm0geworCisvLyBFbmNvZGUgdGhlIGlkIGFuZC9vciBzaXplIG9mIGFuIEVCTUwgZWxlbWVudCBieXRlcyBieSBzZXR0aW5nIGEgbGVhZGluZyBsZW5ndGggZGVzY3JpcHRvciBiaXQ6CisvLworLy8gICAxeHh4eHh4eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDEtYnl0ZSB2YWx1ZXMKKy8vICAgMDF4eHh4eHggeHh4eHh4eHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLQorLy8gICAwMDF4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtCisvLyAgIDAwMDF4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gLi4uCisvLyAgIDAwMDAxeHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0KKy8vICAgMDAwMDAxeHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggICAgICAgICAgICAgICAgICAgLQorLy8gICAwMDAwMDAxeCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCAgICAgICAgICAtCisvLyAgIDAwMDAwMDAxIHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IC0gOC1ieXRlIHZhbHVlcworLy8KKy8vIFRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgbGVhc3QgdGhlIG51bWJlciBvZiBieXRlcyBwb3NzaWJsZS4KK3VpbnQ2NF90IGVuY29kZVVuc2lnbmVkKHVpbnQ2NF90IHUpOworCisvLyBMaWtlIGFib3ZlIGJ1dCBwYWRzIHRoZSBpbnB1dCB2YWx1ZSB3aXRoIGxlYWRpbmcgemVyb3MgdXAgdG8gdGhlIHNwZWNpZmllZCB3aWR0aC4gVGhlIGxlbmd0aAorLy8gZGVzY3JpcHRvciBpcyBjYWxjdWxhdGVkIGJhc2VkIG9uIHdpZHRoLgordWludDY0X3QgZW5jb2RlVW5zaWduZWQodWludDY0X3QgdSwgaW50IHdpZHRoKTsKKworLy8gU2VyaWFsaXplIGFuIEVCTUwgY29kZWQgaWQgb3Igc2l6ZSBpbiBiaWctZW5kaWFuIG9yZGVyLgoraW50IHNlcmlhbGl6ZUNvZGVkVW5zaWduZWQodWludDY0X3QgdSwgdWludDhfdCogYmFyeSk7CisKKy8vIENhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIGFuIEVCTUwgY29kZWQgaWQgb3Igc2l6ZSBmcm9tIGl0cyBsZW5ndGggZGVzY3JpcHRvci4KK2ludCBzaXplT2YodWludDY0X3QgdSk7CisKK30KKworI2VuZGlmIC8qIEVCTUxVVElMX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0xpbmtlZEJsb2NraW5nUXVldWUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vTGlua2VkQmxvY2tpbmdRdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNmE5YTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0xpbmtlZEJsb2NraW5nUXVldWUuaApAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBMSU5LRURCTE9DS0lOR1FVRVVFX0hfCisjZGVmaW5lIExJTktFREJMT0NLSU5HUVVFVUVfSF8KKworI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorI2luY2x1ZGUgPHV0aWxzL0NvbmRpdGlvbi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBMaW5rZWRCbG9ja2luZ1F1ZXVlIHsKKyAgICBMaXN0PFQ+IG1MaXN0OworICAgIE11dGV4IG1Mb2NrOworICAgIENvbmRpdGlvbiBtQ29udGVudEF2YWlsYWJsZUNvbmRpdGlvbjsKKworICAgIFQgZnJvbnQoYm9vbCByZW1vdmUpIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKKyAgICAgICAgd2hpbGUgKG1MaXN0LmVtcHR5KCkpIHsKKyAgICAgICAgICAgIG1Db250ZW50QXZhaWxhYmxlQ29uZGl0aW9uLndhaXQobUxvY2spOworICAgICAgICB9CisgICAgICAgIFQgZSA9ICoobUxpc3QuYmVnaW4oKSk7CisgICAgICAgIGlmIChyZW1vdmUpIHsKKyAgICAgICAgICAgIG1MaXN0LmVyYXNlKG1MaXN0LmJlZ2luKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlOworICAgIH0KKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKExpbmtlZEJsb2NraW5nUXVldWUpOworCitwdWJsaWM6CisgICAgTGlua2VkQmxvY2tpbmdRdWV1ZSgpIHsKKyAgICB9CisKKyAgICB+TGlua2VkQmxvY2tpbmdRdWV1ZSgpIHsKKyAgICB9CisKKyAgICBib29sIGVtcHR5KCkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOworICAgICAgICByZXR1cm4gbUxpc3QuZW1wdHkoKTsKKyAgICB9CisKKyAgICB2b2lkIGNsZWFyKCkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOworICAgICAgICBtTGlzdC5jbGVhcigpOworICAgIH0KKworICAgIFQgcGVlaygpIHsKKyAgICAgICAgcmV0dXJuIGZyb250KGZhbHNlKTsKKyAgICB9CisKKyAgICBUIHRha2UoKSB7CisgICAgICAgIHJldHVybiBmcm9udCh0cnVlKTsKKyAgICB9CisKKyAgICB2b2lkIHB1c2goVCBlKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7CisgICAgICAgIG1MaXN0LnB1c2hfYmFjayhlKTsKKyAgICAgICAgbUNvbnRlbnRBdmFpbGFibGVDb25kaXRpb24uc2lnbmFsKCk7CisgICAgfQorfTsKKworfSAvKiBuYW1lc3BhY2UgYW5kcm9pZCAqLworI2VuZGlmIC8qIExJTktFREJMT0NLSU5HUVVFVUVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUNvbnN0YW50cy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtQ29uc3RhbnRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUzZjQ1OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUNvbnN0YW50cy5oCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBXRUJNQ09OU1RBTlRTX0hfCisjZGVmaW5lIFdFQk1DT05TVEFOVFNfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2Ugd2VibSB7CisKK2NvbnN0IGludCBrTWluRWJtbFZvaWRTaXplID0gMjsKK2NvbnN0IGludDY0X3Qga01heE1ldGFTZWVrU2l6ZSA9IDY0OworY29uc3QgaW50NjRfdCBrTWt2VW5rbm93bkxlbmd0aCA9IDB4MDFmZmZmZmZmZmZmZmZmZmw7CisKKy8vIEVCTUwgZWxlbWVudCBpZCdzIGZyb20gaHR0cDovL21hdHJvc2thLm9yZy90ZWNobmljYWwvc3BlY3MvaW5kZXguaHRtbAorZW51bSBNa3YgeworICAgIGtNa3ZFYm1sID0gMHgxQTQ1REZBMywKKyAgICBrTWt2RWJtbFZlcnNpb24gPSAweDQyODYsCisgICAga01rdkVibWxSZWFkVmVyc2lvbiA9IDB4NDJGNywKKyAgICBrTWt2RWJtbE1heElkbGVuZ3RoID0gMHg0MkYyLAorICAgIGtNa3ZFYm1sTWF4U2l6ZUxlbmd0aCA9IDB4NDJGMywKKyAgICBrTWt2RG9jVHlwZSA9IDB4NDI4MiwKKyAgICBrTWt2RG9jVHlwZVZlcnNpb24gPSAweDQyODcsCisgICAga01rdkRvY1R5cGVSZWFkVmVyc2lvbiA9IDB4NDI4NSwKKyAgICBrTWt2Vm9pZCA9IDB4RUMsCisgICAga01rdlNpZ25hdHVyZVNsb3QgPSAweDFCNTM4NjY3LAorICAgIGtNa3ZTaWduYXR1cmVBbGdvID0gMHg3RThBLAorICAgIGtNa3ZTaWduYXR1cmVIYXNoID0gMHg3RTlBLAorICAgIGtNa3ZTaWduYXR1cmVQdWJsaWNLZXkgPSAweDdFQTUsCisgICAga01rdlNpZ25hdHVyZSA9IDB4N0VCNSwKKyAgICBrTWt2U2lnbmF0dXJlRWxlbWVudHMgPSAweDdFNUIsCisgICAga01rdlNpZ25hdHVyZUVsZW1lbnRMaXN0ID0gMHg3RTdCLAorICAgIGtNa3ZTaWduZWRFbGVtZW50ID0gMHg2NTMyLAorICAgIGtNa3ZTZWdtZW50ID0gMHgxODUzODA2NywKKyAgICBrTWt2U2Vla0hlYWQgPSAweDExNEQ5Qjc0LAorICAgIGtNa3ZTZWVrID0gMHg0REJCLAorICAgIGtNa3ZTZWVrSWQgPSAweDUzQUIsCisgICAga01rdlNlZWtQb3NpdGlvbiA9IDB4NTNBQywKKyAgICBrTWt2SW5mbyA9IDB4MTU0OUE5NjYsCisgICAga01rdlRpbWVjb2RlU2NhbGUgPSAweDJBRDdCMSwKKyAgICBrTWt2U2VnbWVudER1cmF0aW9uID0gMHg0NDg5LAorICAgIGtNa3ZEYXRlVXRjID0gMHg0NDYxLAorICAgIGtNa3ZNdXhpbmdBcHAgPSAweDREODAsCisgICAga01rdldyaXRpbmdBcHAgPSAweDU3NDEsCisgICAga01rdkNsdXN0ZXIgPSAweDFGNDNCNjc1LAorICAgIGtNa3ZUaW1lY29kZSA9IDB4RTcsCisgICAga01rdlByZXZTaXplID0gMHhBQiwKKyAgICBrTWt2QmxvY2tHcm91cCA9IDB4QTAsCisgICAga01rdkJsb2NrID0gMHhBMSwKKyAgICBrTWt2QmxvY2tBZGRpdGlvbnMgPSAweDc1QTEsCisgICAga01rdkJsb2NrTW9yZSA9IDB4QTYsCisgICAga01rdkJsb2NrQWRkSWQgPSAweEVFLAorICAgIGtNa3ZCbG9ja0FkZGl0aW9uYWwgPSAweEE1LAorICAgIGtNa3ZCbG9ja0R1cmF0aW9uID0gMHg5QiwKKyAgICBrTWt2UmVmZXJlbmNlQmxvY2sgPSAweEZCLAorICAgIGtNa3ZMYWNlTnVtYmVyID0gMHhDQywKKyAgICBrTWt2U2ltcGxlQmxvY2sgPSAweEEzLAorICAgIGtNa3ZUcmFja3MgPSAweDE2NTRBRTZCLAorICAgIGtNa3ZUcmFja0VudHJ5ID0gMHhBRSwKKyAgICBrTWt2VHJhY2tOdW1iZXIgPSAweEQ3LAorICAgIGtNa3ZUcmFja1VpZCA9IDB4NzNDNSwKKyAgICBrTWt2VHJhY2tUeXBlID0gMHg4MywKKyAgICBrTWt2RmxhZ0VuYWJsZWQgPSAweEI5LAorICAgIGtNa3ZGbGFnRGVmYXVsdCA9IDB4ODgsCisgICAga01rdkZsYWdGb3JjZWQgPSAweDU1QUEsCisgICAga01rdkZsYWdMYWNpbmcgPSAweDlDLAorICAgIGtNa3ZEZWZhdWx0RHVyYXRpb24gPSAweDIzRTM4MywKKyAgICBrTWt2TWF4QmxvY2tBZGRpdGlvbklkID0gMHg1NUVFLAorICAgIGtNa3ZOYW1lID0gMHg1MzZFLAorICAgIGtNa3ZMYW5ndWFnZSA9IDB4MjJCNTlDLAorICAgIGtNa3ZDb2RlY0lkID0gMHg4NiwKKyAgICBrTWt2Q29kZWNQcml2YXRlID0gMHg2M0EyLAorICAgIGtNa3ZDb2RlY05hbWUgPSAweDI1ODY4OCwKKyAgICBrTWt2VmlkZW8gPSAweEUwLAorICAgIGtNa3ZGbGFnSW50ZXJsYWNlZCA9IDB4OUEsCisgICAga01rdlN0ZXJlb01vZGUgPSAweDUzQjgsCisgICAga01rdkFscGhhTW9kZSA9IDB4NTNDMCwKKyAgICBrTWt2UGl4ZWxXaWR0aCA9IDB4QjAsCisgICAga01rdlBpeGVsSGVpZ2h0ID0gMHhCQSwKKyAgICBrTWt2UGl4ZWxDcm9wQm90dG9tID0gMHg1NEFBLAorICAgIGtNa3ZQaXhlbENyb3BUb3AgPSAweDU0QkIsCisgICAga01rdlBpeGVsQ3JvcExlZnQgPSAweDU0Q0MsCisgICAga01rdlBpeGVsQ3JvcFJpZ2h0ID0gMHg1NERELAorICAgIGtNa3ZEaXNwbGF5V2lkdGggPSAweDU0QjAsCisgICAga01rdkRpc3BsYXlIZWlnaHQgPSAweDU0QkEsCisgICAga01rdkRpc3BsYXlVbml0ID0gMHg1NEIyLAorICAgIGtNa3ZBc3BlY3RSYXRpb1R5cGUgPSAweDU0QjMsCisgICAga01rdkZyYW1lUmF0ZSA9IDB4MjM4M0UzLAorICAgIGtNa3ZBdWRpbyA9IDB4RTEsCisgICAga01rdlNhbXBsaW5nRnJlcXVlbmN5ID0gMHhCNSwKKyAgICBrTWt2T3V0cHV0U2FtcGxpbmdGcmVxdWVuY3kgPSAweDc4QjUsCisgICAga01rdkNoYW5uZWxzID0gMHg5RiwKKyAgICBrTWt2Qml0RGVwdGggPSAweDYyNjQsCisgICAga01rdkN1ZXMgPSAweDFDNTNCQjZCLAorICAgIGtNa3ZDdWVQb2ludCA9IDB4QkIsCisgICAga01rdkN1ZVRpbWUgPSAweEIzLAorICAgIGtNa3ZDdWVUcmFja1Bvc2l0aW9ucyA9IDB4QjcsCisgICAga01rdkN1ZVRyYWNrID0gMHhGNywKKyAgICBrTWt2Q3VlQ2x1c3RlclBvc2l0aW9uID0gMHhGMSwKKyAgICBrTWt2Q3VlQmxvY2tOdW1iZXIgPSAweDUzNzgKK307CisKK2VudW0gVHJhY2tUeXBlcyB7CisgICAga0ludmFsaWRUeXBlID0gLTEsCisgICAga1ZpZGVvVHlwZSA9IDB4MSwKKyAgICBrQXVkaW9UeXBlID0gMHgyLAorICAgIGtDb21wbGV4VHlwZSA9IDB4MywKKyAgICBrTG9nb1R5cGUgPSAweDEwLAorICAgIGtTdWJ0aXRsZVR5cGUgPSAweDExLAorICAgIGtCdXR0b25zVHlwZSA9IDB4MTIsCisgICAga0NvbnRyb2xUeXBlID0gMHgyMAorfTsKKworZW51bSBUcmFja051bSB7CisgICAga1ZpZGVvVHJhY2tOdW0gPSAweDEsCisgICAga0F1ZGlvVHJhY2tOdW0gPSAweDIKK307Cit9CisKKyNlbmRpZiAvKiBXRUJNQ09OU1RBTlRTX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1FbGVtZW50LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUVsZW1lbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMDhjYWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1FbGVtZW50LmNwcApAQCAtMCwwICsxLDM2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIldlYm1FbGVtZW50IgorCisjaW5jbHVkZSAiRWJtbFV0aWwuaCIKKyNpbmNsdWRlICJXZWJtRWxlbWVudC5oIgorI2luY2x1ZGUgIldlYm1Db25zdGFudHMuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2Ugd2VibTsKKworbmFtZXNwYWNlIHsKKworaW50NjRfdCB2b2lkU2l6ZShpbnQ2NF90IHRvdGFsU2l6ZSkgeworICAgIGlmICh0b3RhbFNpemUgPCAyKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHRvdGFsU2l6ZSA8IDkpIHsKKyAgICAgICAgcmV0dXJuIHRvdGFsU2l6ZSAtIDI7CisgICAgfQorICAgIHJldHVybiB0b3RhbFNpemUgLSA5OworfQorCit1aW50NjRfdCBjaGlsZHJlblN1bShjb25zdCBMaXN0PHNwPFdlYm1FbGVtZW50PiA+JiBjaGlsZHJlbikgeworICAgIHVpbnQ2NF90IHRvdGFsID0gMDsKKyAgICBmb3IgKExpc3Q8c3A8V2VibUVsZW1lbnQ+ID46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY2hpbGRyZW4uYmVnaW4oKTsKKyAgICAgICAgICAgIGl0ICE9IGNoaWxkcmVuLmVuZCgpOyArK2l0KSB7CisgICAgICAgIHRvdGFsICs9ICgqaXQpLT50b3RhbFNpemUoKTsKKyAgICB9CisgICAgcmV0dXJuIHRvdGFsOworfQorCit2b2lkIHBvcHVsYXRlQ29tbW9uVHJhY2tFbnRyaWVzKAorICAgICAgICBpbnQgbnVtLAorICAgICAgICB1aW50NjRfdCB1aWQsCisgICAgICAgIGJvb2wgbGFjaW5nLAorICAgICAgICBjb25zdCBjaGFyICpsYW5nLAorICAgICAgICBjb25zdCBjaGFyICpjb2RlYywKKyAgICAgICAgVHJhY2tUeXBlcyB0eXBlLAorICAgICAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+ICZscykgeworICAgIGxzLnB1c2hfYmFjayhuZXcgV2VibVVuc2lnbmVkKGtNa3ZUcmFja051bWJlciwgbnVtKSk7CisgICAgbHMucHVzaF9iYWNrKG5ldyBXZWJtVW5zaWduZWQoa01rdlRyYWNrVWlkLCB1aWQpKTsKKyAgICBscy5wdXNoX2JhY2sobmV3IFdlYm1VbnNpZ25lZChrTWt2RmxhZ0xhY2luZywgbGFjaW5nKSk7CisgICAgbHMucHVzaF9iYWNrKG5ldyBXZWJtU3RyaW5nKGtNa3ZMYW5ndWFnZSwgbGFuZykpOworICAgIGxzLnB1c2hfYmFjayhuZXcgV2VibVN0cmluZyhrTWt2Q29kZWNJZCwgY29kZWMpKTsKKyAgICBscy5wdXNoX2JhY2sobmV3IFdlYm1VbnNpZ25lZChrTWt2VHJhY2tUeXBlLCB0eXBlKSk7Cit9Cit9CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworV2VibUVsZW1lbnQ6OldlYm1FbGVtZW50KHVpbnQ2NF90IGlkLCB1aW50NjRfdCBzaXplKQorICAgIDogbUlkKGlkKSwgbVNpemUoc2l6ZSkgeworfQorCitXZWJtRWxlbWVudDo6fldlYm1FbGVtZW50KCkgeworfQorCitpbnQgV2VibUVsZW1lbnQ6OnNlcmlhbGl6ZVBheWxvYWRTaXplKHVpbnQ4X3QgKmJ1ZikgeworICAgIHJldHVybiBzZXJpYWxpemVDb2RlZFVuc2lnbmVkKGVuY29kZVVuc2lnbmVkKG1TaXplKSwgYnVmKTsKK30KKwordWludDY0X3QgV2VibUVsZW1lbnQ6OnNlcmlhbGl6ZUludG8odWludDhfdCAqYnVmKSB7CisgICAgdWludDhfdCAqY3VyID0gYnVmOworICAgIGludCBoZWFkID0gc2VyaWFsaXplQ29kZWRVbnNpZ25lZChtSWQsIGN1cik7CisgICAgY3VyICs9IGhlYWQ7CisgICAgaW50IG5lY2sgPSBzZXJpYWxpemVQYXlsb2FkU2l6ZShjdXIpOworICAgIGN1ciArPSBuZWNrOworICAgIHNlcmlhbGl6ZVBheWxvYWQoY3VyKTsKKyAgICBjdXIgKz0gbVNpemU7CisgICAgcmV0dXJuIGN1ciAtIGJ1ZjsKK30KKwordWludDY0X3QgV2VibUVsZW1lbnQ6OnRvdGFsU2l6ZSgpIHsKKyAgICB1aW50OF90IGJ1Zls4XTsKKyAgICAvLy4uLi4uLi4uLi4uLi4uLiArIHNpemVPZihlbmNvZGVVbnNpZ25lZChzaXplKSkKKyAgICByZXR1cm4gc2l6ZU9mKG1JZCkgKyBzZXJpYWxpemVQYXlsb2FkU2l6ZShidWYpICsgbVNpemU7Cit9CisKK3VpbnQ4X3QgKldlYm1FbGVtZW50OjpzZXJpYWxpemUodWludDY0X3QmIHNpemUpIHsKKyAgICBzaXplID0gdG90YWxTaXplKCk7CisgICAgdWludDhfdCAqYnVmID0gbmV3IHVpbnQ4X3Rbc2l6ZV07CisgICAgc2VyaWFsaXplSW50byhidWYpOworICAgIHJldHVybiBidWY7Cit9CisKK2ludCBXZWJtRWxlbWVudDo6d3JpdGUoaW50IGZkLCB1aW50NjRfdCYgc2l6ZSkgeworICAgIHVpbnQ4X3QgYnVmWzhdOworICAgIHNpemUgPSB0b3RhbFNpemUoKTsKKyAgICBvZmY2NF90IG9mZiA9IDo6bHNlZWs2NChmZCwgKHNpemUgLSAxKSwgU0VFS19DVVIpIC0gKHNpemUgLSAxKTsKKyAgICA6OndyaXRlKGZkLCBidWYsIDEpOyAvLyBleHRlbmQgZmlsZQorCisgICAgb2ZmNjRfdCBjdXJPZmYgPSBvZmYgKyBzaXplOworICAgIG9mZjY0X3QgYWxpZ25lZE9mZiA9IG9mZiAmIH4oOjpzeXNjb25mKF9TQ19QQUdFX1NJWkUpIC0gMSk7CisgICAgb2ZmNjRfdCBtYXBTaXplID0gY3VyT2ZmIC0gYWxpZ25lZE9mZjsKKyAgICBvZmY2NF90IHBhZ2VPZmYgPSBvZmYgLSBhbGlnbmVkT2ZmOworICAgIHZvaWQgKmRzdCA9IDo6bW1hcDY0KE5VTEwsIG1hcFNpemUsIFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGZkLCBhbGlnbmVkT2ZmKTsKKyAgICBpZiAoZHN0ID09IE1BUF9GQUlMRUQpIHsKKyAgICAgICAgQUxPR0UoIm1tYXA2NCBmYWlsZWQ7IGVycm5vID0gJWQiLCBlcnJubyk7CisgICAgICAgIEFMT0dFKCJmZCAlZDsgZmxhZ3M6ICVvIiwgZmQsIDo6ZmNudGwoZmQsIEZfR0VURkwsIDApKTsKKyAgICAgICAgcmV0dXJuIGVycm5vOworICAgIH0gZWxzZSB7CisgICAgICAgIHNlcmlhbGl6ZUludG8oKHVpbnQ4X3QqKSBkc3QgKyBwYWdlT2ZmKTsKKyAgICAgICAgOjptc3luYyhkc3QsIG1hcFNpemUsIE1TX1NZTkMpOworICAgICAgICByZXR1cm4gOjptdW5tYXAoZHN0LCBtYXBTaXplKTsKKyAgICB9Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitXZWJtVW5zaWduZWQ6OldlYm1VbnNpZ25lZCh1aW50NjRfdCBpZCwgdWludDY0X3QgdmFsdWUpCisgICAgOiBXZWJtRWxlbWVudChpZCwgc2l6ZU9mKHZhbHVlKSksIG1WYWx1ZSh2YWx1ZSkgeworfQorCit2b2lkIFdlYm1VbnNpZ25lZDo6c2VyaWFsaXplUGF5bG9hZCh1aW50OF90ICpidWYpIHsKKyAgICBzZXJpYWxpemVDb2RlZFVuc2lnbmVkKG1WYWx1ZSwgYnVmKTsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1dlYm1GbG9hdDo6V2VibUZsb2F0KHVpbnQ2NF90IGlkLCBkb3VibGUgdmFsdWUpCisgICAgOiBXZWJtRWxlbWVudChpZCwgc2l6ZW9mKGRvdWJsZSkpLCBtVmFsdWUodmFsdWUpIHsKK30KKworV2VibUZsb2F0OjpXZWJtRmxvYXQodWludDY0X3QgaWQsIGZsb2F0IHZhbHVlKQorICAgIDogV2VibUVsZW1lbnQoaWQsIHNpemVvZihmbG9hdCkpLCBtVmFsdWUodmFsdWUpIHsKK30KKwordm9pZCBXZWJtRmxvYXQ6OnNlcmlhbGl6ZVBheWxvYWQodWludDhfdCAqYnVmKSB7CisgICAgdWludDY0X3QgZGF0YTsKKyAgICBpZiAobVNpemUgPT0gc2l6ZW9mKGZsb2F0KSkgeworICAgICAgICBmbG9hdCBmID0gbVZhbHVlOworICAgICAgICBkYXRhID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QqPigmZik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGF0YSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ2NF90Kj4oJm1WYWx1ZSk7CisgICAgfQorICAgIGZvciAoaW50IGkgPSBtU2l6ZSAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgIGJ1ZltpXSA9IGRhdGEgJiAweGZmOworICAgICAgICBkYXRhID4+PSA4OworICAgIH0KK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1dlYm1CaW5hcnk6OldlYm1CaW5hcnkodWludDY0X3QgaWQsIGNvbnN0IHNwPEFCdWZmZXI+ICZyZWYpCisgICAgOiBXZWJtRWxlbWVudChpZCwgcmVmLT5zaXplKCkpLCBtUmVmKHJlZikgeworfQorCit2b2lkIFdlYm1CaW5hcnk6OnNlcmlhbGl6ZVBheWxvYWQodWludDhfdCAqYnVmKSB7CisgICAgbWVtY3B5KGJ1ZiwgbVJlZi0+ZGF0YSgpLCBtUmVmLT5zaXplKCkpOworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworV2VibVN0cmluZzo6V2VibVN0cmluZyh1aW50NjRfdCBpZCwgY29uc3QgY2hhciAqc3RyKQorICAgIDogV2VibUVsZW1lbnQoaWQsIHN0cmxlbihzdHIpKSwgbVN0cihzdHIpIHsKK30KKwordm9pZCBXZWJtU3RyaW5nOjpzZXJpYWxpemVQYXlsb2FkKHVpbnQ4X3QgKmJ1ZikgeworICAgIG1lbWNweShidWYsIG1TdHIsIHN0cmxlbihtU3RyKSk7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitXZWJtU2ltcGxlQmxvY2s6OldlYm1TaW1wbGVCbG9jaygKKyAgICAgICAgaW50IHRyYWNrTnVtLAorICAgICAgICBpbnQxNl90IHJlbFRpbWVjb2RlLAorICAgICAgICBib29sIGtleSwKKyAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4mIG9yaWcpCisgICAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiB0cmFja051bSoxICsgdGltZWNvZGUqMiArIGZsYWdzKjEKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eCisgICAgLy8gT25seSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSBvZiB0cmFja051bSBpcyBlbmNvZGVkCisgICAgOiBXZWJtRWxlbWVudChrTWt2U2ltcGxlQmxvY2ssIG9yaWctPnNpemUoKSArIDQpLAorICAgICAgbVRyYWNrTnVtKHRyYWNrTnVtKSwKKyAgICAgIG1SZWxUaW1lY29kZShyZWxUaW1lY29kZSksCisgICAgICBtS2V5KGtleSksCisgICAgICBtUmVmKG9yaWcpIHsKK30KKwordm9pZCBXZWJtU2ltcGxlQmxvY2s6OnNlcmlhbGl6ZVBheWxvYWQodWludDhfdCAqYnVmKSB7CisgICAgc2VyaWFsaXplQ29kZWRVbnNpZ25lZChlbmNvZGVVbnNpZ25lZChtVHJhY2tOdW0pLCBidWYpOworICAgIGJ1ZlsxXSA9IChtUmVsVGltZWNvZGUgJiAweGZmMDApID4+IDg7CisgICAgYnVmWzJdID0gbVJlbFRpbWVjb2RlICYgMHhmZjsKKyAgICBidWZbM10gPSBtS2V5ID8gMHg4MCA6IDA7CisgICAgbWVtY3B5KGJ1ZiArIDQsIG1SZWYtPmRhdGEoKSwgbVNpemUgLSA0KTsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0VibWxWb2lkOjpFYm1sVm9pZCh1aW50NjRfdCB0b3RhbFNpemUpCisgICAgOiBXZWJtRWxlbWVudChrTWt2Vm9pZCwgdm9pZFNpemUodG90YWxTaXplKSksCisgICAgICBtU2l6ZVdpZHRoKHRvdGFsU2l6ZSAtIHNpemVPZihrTWt2Vm9pZCkgLSB2b2lkU2l6ZSh0b3RhbFNpemUpKSB7CisgICAgQ0hFQ0tfR0Uodm9pZFNpemUodG90YWxTaXplKSwgMCk7Cit9CisKK2ludCBFYm1sVm9pZDo6c2VyaWFsaXplUGF5bG9hZFNpemUodWludDhfdCAqYnVmKSB7CisgICAgcmV0dXJuIHNlcmlhbGl6ZUNvZGVkVW5zaWduZWQoZW5jb2RlVW5zaWduZWQobVNpemUsIG1TaXplV2lkdGgpLCBidWYpOworfQorCit2b2lkIEVibWxWb2lkOjpzZXJpYWxpemVQYXlsb2FkKHVpbnQ4X3QgKmJ1ZikgeworICAgIDo6bWVtc2V0KGJ1ZiwgMCwgbVNpemUpOworICAgIHJldHVybjsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1dlYm1NYXN0ZXI6OldlYm1NYXN0ZXIodWludDY0X3QgaWQsIGNvbnN0IExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4mIGNoaWxkcmVuKQorICAgIDogV2VibUVsZW1lbnQoaWQsIGNoaWxkcmVuU3VtKGNoaWxkcmVuKSksIG1DaGlsZHJlbihjaGlsZHJlbikgeworfQorCitXZWJtTWFzdGVyOjpXZWJtTWFzdGVyKHVpbnQ2NF90IGlkKQorICAgIDogV2VibUVsZW1lbnQoaWQsIDApIHsKK30KKworaW50IFdlYm1NYXN0ZXI6OnNlcmlhbGl6ZVBheWxvYWRTaXplKHVpbnQ4X3QgKmJ1ZikgeworICAgIGlmIChtU2l6ZSA9PSAwKXsKKyAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZUNvZGVkVW5zaWduZWQoa01rdlVua25vd25MZW5ndGgsIGJ1Zik7CisgICAgfQorICAgIHJldHVybiBXZWJtRWxlbWVudDo6c2VyaWFsaXplUGF5bG9hZFNpemUoYnVmKTsKK30KKwordm9pZCBXZWJtTWFzdGVyOjpzZXJpYWxpemVQYXlsb2FkKHVpbnQ4X3QgKmJ1ZikgeworICAgIHVpbnQ2NF90IG9mZiA9IDA7CisgICAgZm9yIChMaXN0PHNwPFdlYm1FbGVtZW50PiA+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1DaGlsZHJlbi5iZWdpbigpOyBpdCAhPSBtQ2hpbGRyZW4uZW5kKCk7CisgICAgICAgICAgICArK2l0KSB7CisgICAgICAgIHNwPFdlYm1FbGVtZW50PiBjaGlsZCA9ICgqaXQpOworICAgICAgICBjaGlsZC0+c2VyaWFsaXplSW50byhidWYgKyBvZmYpOworICAgICAgICBvZmYgKz0gY2hpbGQtPnRvdGFsU2l6ZSgpOworICAgIH0KK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3NwPFdlYm1FbGVtZW50PiBXZWJtRWxlbWVudDo6Q3VlUG9pbnRFbnRyeSh1aW50NjRfdCB0aW1lLCBpbnQgdHJhY2ssIHVpbnQ2NF90IG9mZikgeworICAgIExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4gY3VlUG9pbnRFbnRyeUZpZWxkczsKKyAgICBjdWVQb2ludEVudHJ5RmllbGRzLnB1c2hfYmFjayhuZXcgV2VibVVuc2lnbmVkKGtNa3ZDdWVUcmFjaywgdHJhY2spKTsKKyAgICBjdWVQb2ludEVudHJ5RmllbGRzLnB1c2hfYmFjayhuZXcgV2VibVVuc2lnbmVkKGtNa3ZDdWVDbHVzdGVyUG9zaXRpb24sIG9mZikpOworICAgIFdlYm1FbGVtZW50ICpjdWVUcmFja1Bvc2l0aW9ucyA9IG5ldyBXZWJtTWFzdGVyKGtNa3ZDdWVUcmFja1Bvc2l0aW9ucywgY3VlUG9pbnRFbnRyeUZpZWxkcyk7CisKKyAgICBjdWVQb2ludEVudHJ5RmllbGRzLmNsZWFyKCk7CisgICAgY3VlUG9pbnRFbnRyeUZpZWxkcy5wdXNoX2JhY2sobmV3IFdlYm1VbnNpZ25lZChrTWt2Q3VlVGltZSwgdGltZSkpOworICAgIGN1ZVBvaW50RW50cnlGaWVsZHMucHVzaF9iYWNrKGN1ZVRyYWNrUG9zaXRpb25zKTsKKyAgICByZXR1cm4gbmV3IFdlYm1NYXN0ZXIoa01rdkN1ZVBvaW50LCBjdWVQb2ludEVudHJ5RmllbGRzKTsKK30KKworc3A8V2VibUVsZW1lbnQ+IFdlYm1FbGVtZW50OjpTZWVrRW50cnkodWludDY0X3QgaWQsIHVpbnQ2NF90IG9mZikgeworICAgIExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4gc2Vla0VudHJ5RmllbGRzOworICAgIHNlZWtFbnRyeUZpZWxkcy5wdXNoX2JhY2sobmV3IFdlYm1VbnNpZ25lZChrTWt2U2Vla0lkLCBpZCkpOworICAgIHNlZWtFbnRyeUZpZWxkcy5wdXNoX2JhY2sobmV3IFdlYm1VbnNpZ25lZChrTWt2U2Vla1Bvc2l0aW9uLCBvZmYpKTsKKyAgICByZXR1cm4gbmV3IFdlYm1NYXN0ZXIoa01rdlNlZWssIHNlZWtFbnRyeUZpZWxkcyk7Cit9CisKK3NwPFdlYm1FbGVtZW50PiBXZWJtRWxlbWVudDo6RWJtbEhlYWRlcigKKyAgICAgICAgaW50IHZlciwKKyAgICAgICAgaW50IHJlYWRWZXIsCisgICAgICAgIGludCBtYXhJZExlbiwKKyAgICAgICAgaW50IG1heFNpemVMZW4sCisgICAgICAgIGludCBkb2NWZXIsCisgICAgICAgIGludCBkb2NSZWFkVmVyKSB7CisgICAgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiBoZWFkZXJGaWVsZHM7CisgICAgaGVhZGVyRmllbGRzLnB1c2hfYmFjayhuZXcgV2VibVVuc2lnbmVkKGtNa3ZFYm1sVmVyc2lvbiwgdmVyKSk7CisgICAgaGVhZGVyRmllbGRzLnB1c2hfYmFjayhuZXcgV2VibVVuc2lnbmVkKGtNa3ZFYm1sUmVhZFZlcnNpb24sIHJlYWRWZXIpKTsKKyAgICBoZWFkZXJGaWVsZHMucHVzaF9iYWNrKG5ldyBXZWJtVW5zaWduZWQoa01rdkVibWxNYXhJZGxlbmd0aCwgbWF4SWRMZW4pKTsKKyAgICBoZWFkZXJGaWVsZHMucHVzaF9iYWNrKG5ldyBXZWJtVW5zaWduZWQoa01rdkVibWxNYXhTaXplTGVuZ3RoLCBtYXhTaXplTGVuKSk7CisgICAgaGVhZGVyRmllbGRzLnB1c2hfYmFjayhuZXcgV2VibVN0cmluZyhrTWt2RG9jVHlwZSwgIndlYm0iKSk7CisgICAgaGVhZGVyRmllbGRzLnB1c2hfYmFjayhuZXcgV2VibVVuc2lnbmVkKGtNa3ZEb2NUeXBlVmVyc2lvbiwgZG9jVmVyKSk7CisgICAgaGVhZGVyRmllbGRzLnB1c2hfYmFjayhuZXcgV2VibVVuc2lnbmVkKGtNa3ZEb2NUeXBlUmVhZFZlcnNpb24sIGRvY1JlYWRWZXIpKTsKKyAgICByZXR1cm4gbmV3IFdlYm1NYXN0ZXIoa01rdkVibWwsIGhlYWRlckZpZWxkcyk7Cit9CisKK3NwPFdlYm1FbGVtZW50PiBXZWJtRWxlbWVudDo6U2VnbWVudEluZm8odWludDY0X3Qgc2NhbGUsIGRvdWJsZSBkdXIpIHsKKyAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+IHNlZ21lbnRJbmZvOworICAgIC8vIHBsYWNlIGR1cmF0aW9uIGZpcnN0OyBlYXNpZXIgdG8gcGF0Y2gKKyAgICBzZWdtZW50SW5mby5wdXNoX2JhY2sobmV3IFdlYm1GbG9hdChrTWt2U2VnbWVudER1cmF0aW9uLCBkdXIpKTsKKyAgICBzZWdtZW50SW5mby5wdXNoX2JhY2sobmV3IFdlYm1VbnNpZ25lZChrTWt2VGltZWNvZGVTY2FsZSwgc2NhbGUpKTsKKyAgICBzZWdtZW50SW5mby5wdXNoX2JhY2sobmV3IFdlYm1TdHJpbmcoa01rdk11eGluZ0FwcCwgImFuZHJvaWQiKSk7CisgICAgc2VnbWVudEluZm8ucHVzaF9iYWNrKG5ldyBXZWJtU3RyaW5nKGtNa3ZXcml0aW5nQXBwLCAiYW5kcm9pZCIpKTsKKyAgICByZXR1cm4gbmV3IFdlYm1NYXN0ZXIoa01rdkluZm8sIHNlZ21lbnRJbmZvKTsKK30KKworc3A8V2VibUVsZW1lbnQ+IFdlYm1FbGVtZW50OjpBdWRpb1RyYWNrRW50cnkoCisgICAgICAgIGludCBjaGFucywKKyAgICAgICAgZG91YmxlIHJhdGUsCisgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZidWYsCisgICAgICAgIGludCBicHMsCisgICAgICAgIHVpbnQ2NF90IHVpZCwKKyAgICAgICAgYm9vbCBsYWNpbmcsCisgICAgICAgIGNvbnN0IGNoYXIgKmxhbmcpIHsKKyAgICBpZiAodWlkID09IDApIHsKKyAgICAgICAgdWlkID0ga0F1ZGlvVHJhY2tOdW07CisgICAgfQorCisgICAgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiB0cmFja0VudHJ5RmllbGRzOworICAgIHBvcHVsYXRlQ29tbW9uVHJhY2tFbnRyaWVzKAorICAgICAgICAgICAga0F1ZGlvVHJhY2tOdW0sCisgICAgICAgICAgICB1aWQsCisgICAgICAgICAgICBsYWNpbmcsCisgICAgICAgICAgICBsYW5nLAorICAgICAgICAgICAgIkFfVk9SQklTIiwKKyAgICAgICAgICAgIGtBdWRpb1R5cGUsCisgICAgICAgICAgICB0cmFja0VudHJ5RmllbGRzKTsKKworICAgIExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4gYXVkaW9JbmZvOworICAgIGF1ZGlvSW5mby5wdXNoX2JhY2sobmV3IFdlYm1VbnNpZ25lZChrTWt2Q2hhbm5lbHMsIGNoYW5zKSk7CisgICAgYXVkaW9JbmZvLnB1c2hfYmFjayhuZXcgV2VibUZsb2F0KGtNa3ZTYW1wbGluZ0ZyZXF1ZW5jeSwgcmF0ZSkpOworICAgIGlmIChicHMpIHsKKyAgICAgICAgV2VibUVsZW1lbnQgKmJpdERlcHRoID0gbmV3IFdlYm1VbnNpZ25lZChrTWt2Qml0RGVwdGgsIGJwcyk7CisgICAgICAgIGF1ZGlvSW5mby5wdXNoX2JhY2soYml0RGVwdGgpOworICAgIH0KKworICAgIHRyYWNrRW50cnlGaWVsZHMucHVzaF9iYWNrKG5ldyBXZWJtTWFzdGVyKGtNa3ZBdWRpbywgYXVkaW9JbmZvKSk7CisgICAgdHJhY2tFbnRyeUZpZWxkcy5wdXNoX2JhY2sobmV3IFdlYm1CaW5hcnkoa01rdkNvZGVjUHJpdmF0ZSwgYnVmKSk7CisgICAgcmV0dXJuIG5ldyBXZWJtTWFzdGVyKGtNa3ZUcmFja0VudHJ5LCB0cmFja0VudHJ5RmllbGRzKTsKK30KKworc3A8V2VibUVsZW1lbnQ+IFdlYm1FbGVtZW50OjpWaWRlb1RyYWNrRW50cnkoCisgICAgICAgIHVpbnQ2NF90IHdpZHRoLAorICAgICAgICB1aW50NjRfdCBoZWlnaHQsCisgICAgICAgIHVpbnQ2NF90IHVpZCwKKyAgICAgICAgYm9vbCBsYWNpbmcsCisgICAgICAgIGNvbnN0IGNoYXIgKmxhbmcpIHsKKyAgICBpZiAodWlkID09IDApIHsKKyAgICAgICAgdWlkID0ga1ZpZGVvVHJhY2tOdW07CisgICAgfQorCisgICAgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiB0cmFja0VudHJ5RmllbGRzOworICAgIHBvcHVsYXRlQ29tbW9uVHJhY2tFbnRyaWVzKAorICAgICAgICAgICAga1ZpZGVvVHJhY2tOdW0sCisgICAgICAgICAgICB1aWQsCisgICAgICAgICAgICBsYWNpbmcsCisgICAgICAgICAgICBsYW5nLAorICAgICAgICAgICAgIlZfVlA4IiwKKyAgICAgICAgICAgIGtWaWRlb1R5cGUsCisgICAgICAgICAgICB0cmFja0VudHJ5RmllbGRzKTsKKworICAgIExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4gdmlkZW9JbmZvOworICAgIHZpZGVvSW5mby5wdXNoX2JhY2sobmV3IFdlYm1VbnNpZ25lZChrTWt2UGl4ZWxXaWR0aCwgd2lkdGgpKTsKKyAgICB2aWRlb0luZm8ucHVzaF9iYWNrKG5ldyBXZWJtVW5zaWduZWQoa01rdlBpeGVsSGVpZ2h0LCBoZWlnaHQpKTsKKworICAgIHRyYWNrRW50cnlGaWVsZHMucHVzaF9iYWNrKG5ldyBXZWJtTWFzdGVyKGtNa3ZWaWRlbywgdmlkZW9JbmZvKSk7CisgICAgcmV0dXJuIG5ldyBXZWJtTWFzdGVyKGtNa3ZUcmFja0VudHJ5LCB0cmFja0VudHJ5RmllbGRzKTsKK30KK30gLyogbmFtZXNwYWNlIGFuZHJvaWQgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUVsZW1lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUVsZW1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTk5MzNlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRWxlbWVudC5oCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBXRUJNRUxFTUVOVF9IXworI2RlZmluZSBXRUJNRUxFTUVOVF9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBXZWJtRWxlbWVudCA6IHB1YmxpYyBMaWdodFJlZkJhc2U8V2VibUVsZW1lbnQ+IHsKKyAgICBjb25zdCB1aW50NjRfdCBtSWQsIG1TaXplOworCisgICAgV2VibUVsZW1lbnQodWludDY0X3QgaWQsIHVpbnQ2NF90IHNpemUpOworICAgIHZpcnR1YWwgfldlYm1FbGVtZW50KCk7CisKKyAgICB2aXJ0dWFsIGludCBzZXJpYWxpemVQYXlsb2FkU2l6ZSh1aW50OF90ICpidWYpOworICAgIHZpcnR1YWwgdm9pZCBzZXJpYWxpemVQYXlsb2FkKHVpbnQ4X3QgKmJ1Zik9MDsKKyAgICB1aW50NjRfdCB0b3RhbFNpemUoKTsKKyAgICB1aW50NjRfdCBzZXJpYWxpemVJbnRvKHVpbnQ4X3QgKmJ1Zik7CisgICAgdWludDhfdCAqc2VyaWFsaXplKHVpbnQ2NF90JiBzaXplKTsKKyAgICBpbnQgd3JpdGUoaW50IGZkLCB1aW50NjRfdCYgc2l6ZSk7CisKKyAgICBzdGF0aWMgc3A8V2VibUVsZW1lbnQ+IEVibWxIZWFkZXIoCisgICAgICAgICAgICBpbnQgdmVyID0gMSwKKyAgICAgICAgICAgIGludCByZWFkVmVyID0gMSwKKyAgICAgICAgICAgIGludCBtYXhJZExlbiA9IDQsCisgICAgICAgICAgICBpbnQgbWF4U2l6ZUxlbiA9IDgsCisgICAgICAgICAgICBpbnQgZG9jVmVyID0gMiwKKyAgICAgICAgICAgIGludCBkb2NSZWFkVmVyID0gMik7CisKKyAgICBzdGF0aWMgc3A8V2VibUVsZW1lbnQ+IFNlZ21lbnRJbmZvKHVpbnQ2NF90IHNjYWxlID0gMTAwMDAwMCwgZG91YmxlIGR1ciA9IDApOworCisgICAgc3RhdGljIHNwPFdlYm1FbGVtZW50PiBBdWRpb1RyYWNrRW50cnkoCisgICAgICAgICAgICBpbnQgY2hhbnMsCisgICAgICAgICAgICBkb3VibGUgcmF0ZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZidWYsCisgICAgICAgICAgICBpbnQgYnBzID0gMCwKKyAgICAgICAgICAgIHVpbnQ2NF90IHVpZCA9IDAsCisgICAgICAgICAgICBib29sIGxhY2luZyA9IGZhbHNlLAorICAgICAgICAgICAgY29uc3QgY2hhciAqbGFuZyA9ICJ1bmQiKTsKKworICAgIHN0YXRpYyBzcDxXZWJtRWxlbWVudD4gVmlkZW9UcmFja0VudHJ5KAorICAgICAgICAgICAgdWludDY0X3Qgd2lkdGgsCisgICAgICAgICAgICB1aW50NjRfdCBoZWlnaHQsCisgICAgICAgICAgICB1aW50NjRfdCB1aWQgPSAwLAorICAgICAgICAgICAgYm9vbCBsYWNpbmcgPSBmYWxzZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxhbmcgPSAidW5kIik7CisKKyAgICBzdGF0aWMgc3A8V2VibUVsZW1lbnQ+IFNlZWtFbnRyeSh1aW50NjRfdCBpZCwgdWludDY0X3Qgb2ZmKTsKKyAgICBzdGF0aWMgc3A8V2VibUVsZW1lbnQ+IEN1ZVBvaW50RW50cnkodWludDY0X3QgdGltZSwgaW50IHRyYWNrLCB1aW50NjRfdCBvZmYpOworICAgIHN0YXRpYyBzcDxXZWJtRWxlbWVudD4gU2ltcGxlQmxvY2soCisgICAgICAgICAgICBpbnQgdHJhY2tOdW0sCisgICAgICAgICAgICBpbnQxNl90IHRpbWVjb2RlLAorICAgICAgICAgICAgYm9vbCBrZXksCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLAorICAgICAgICAgICAgdWludDY0X3QgZGF0YVNpemUpOworfTsKKworc3RydWN0IFdlYm1VbnNpZ25lZCA6IHB1YmxpYyBXZWJtRWxlbWVudCB7CisgICAgV2VibVVuc2lnbmVkKHVpbnQ2NF90IGlkLCB1aW50NjRfdCB2YWx1ZSk7CisgICAgY29uc3QgdWludDY0X3QgbVZhbHVlOworICAgIHZvaWQgc2VyaWFsaXplUGF5bG9hZCh1aW50OF90ICpidWYpOworfTsKKworc3RydWN0IFdlYm1GbG9hdCA6IHB1YmxpYyBXZWJtRWxlbWVudCB7CisgICAgY29uc3QgZG91YmxlIG1WYWx1ZTsKKyAgICBXZWJtRmxvYXQodWludDY0X3QgaWQsIGZsb2F0IHZhbHVlKTsKKyAgICBXZWJtRmxvYXQodWludDY0X3QgaWQsIGRvdWJsZSB2YWx1ZSk7CisgICAgdm9pZCBzZXJpYWxpemVQYXlsb2FkKHVpbnQ4X3QgKmJ1Zik7Cit9OworCitzdHJ1Y3QgV2VibUJpbmFyeSA6IHB1YmxpYyBXZWJtRWxlbWVudCB7CisgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gbVJlZjsKKyAgICBXZWJtQmluYXJ5KHVpbnQ2NF90IGlkLCBjb25zdCBzcDxBQnVmZmVyPiAmcmVmKTsKKyAgICB2b2lkIHNlcmlhbGl6ZVBheWxvYWQodWludDhfdCAqYnVmKTsKK307CisKK3N0cnVjdCBXZWJtU3RyaW5nIDogcHVibGljIFdlYm1FbGVtZW50IHsKKyAgICBjb25zdCBjaGFyICpjb25zdCBtU3RyOworICAgIFdlYm1TdHJpbmcodWludDY0X3QgaWQsIGNvbnN0IGNoYXIgKnN0cik7CisgICAgdm9pZCBzZXJpYWxpemVQYXlsb2FkKHVpbnQ4X3QgKmJ1Zik7Cit9OworCitzdHJ1Y3QgV2VibVNpbXBsZUJsb2NrIDogcHVibGljIFdlYm1FbGVtZW50IHsKKyAgICBjb25zdCBpbnQgbVRyYWNrTnVtOworICAgIGNvbnN0IGludDE2X3QgbVJlbFRpbWVjb2RlOworICAgIGNvbnN0IGJvb2wgbUtleTsKKyAgICBjb25zdCBzcDxBQnVmZmVyPiBtUmVmOworCisgICAgV2VibVNpbXBsZUJsb2NrKGludCB0cmFja051bSwgaW50MTZfdCB0aW1lY29kZSwgYm9vbCBrZXksIGNvbnN0IHNwPEFCdWZmZXI+JiBvcmlnKTsKKyAgICB2b2lkIHNlcmlhbGl6ZVBheWxvYWQodWludDhfdCAqYnVmKTsKK307CisKK3N0cnVjdCBFYm1sVm9pZCA6IHB1YmxpYyBXZWJtRWxlbWVudCB7CisgICAgY29uc3QgdWludDY0X3QgbVNpemVXaWR0aDsKKyAgICBFYm1sVm9pZCh1aW50NjRfdCB0b3RhbFNpemUpOworICAgIGludCBzZXJpYWxpemVQYXlsb2FkU2l6ZSh1aW50OF90ICpidWYpOworICAgIHZvaWQgc2VyaWFsaXplUGF5bG9hZCh1aW50OF90ICpidWYpOworfTsKKworc3RydWN0IFdlYm1NYXN0ZXIgOiBwdWJsaWMgV2VibUVsZW1lbnQgeworICAgIGNvbnN0IExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4gbUNoaWxkcmVuOworICAgIFdlYm1NYXN0ZXIodWludDY0X3QgaWQpOworICAgIFdlYm1NYXN0ZXIodWludDY0X3QgaWQsIGNvbnN0IExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4gJmNoaWxkcmVuKTsKKyAgICBpbnQgc2VyaWFsaXplUGF5bG9hZFNpemUodWludDhfdCAqYnVmKTsKKyAgICB2b2lkIHNlcmlhbGl6ZVBheWxvYWQodWludDhfdCAqYnVmKTsKK307CisKK30gLyogbmFtZXNwYWNlIGFuZHJvaWQgKi8KKyNlbmRpZiAvKiBXRUJNRUxFTUVOVF9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MTM0ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZS5jcHAKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiV2VibUZyYW1lIgorCisjaW5jbHVkZSAiV2VibUZyYW1lLmgiCisjaW5jbHVkZSAiV2VibUNvbnN0YW50cy5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2Ugd2VibTsKKworbmFtZXNwYWNlIHsKK3NwPEFCdWZmZXI+IHRvQUJ1ZmZlcihNZWRpYUJ1ZmZlciAqbWJ1ZikgeworICAgIHNwPEFCdWZmZXI+IGFidWYgPSBuZXcgQUJ1ZmZlcihtYnVmLT5yYW5nZV9sZW5ndGgoKSk7CisgICAgbWVtY3B5KGFidWYtPmRhdGEoKSwgKHVpbnQ4X3QqKSBtYnVmLT5kYXRhKCkgKyBtYnVmLT5yYW5nZV9vZmZzZXQoKSwgbWJ1Zi0+cmFuZ2VfbGVuZ3RoKCkpOworICAgIHJldHVybiBhYnVmOworfQorfQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0IHNwPFdlYm1GcmFtZT4gV2VibUZyYW1lOjpFT1MgPSBuZXcgV2VibUZyYW1lKCk7CisKK1dlYm1GcmFtZTo6V2VibUZyYW1lKCkKKyAgICA6IG1UeXBlKGtJbnZhbGlkVHlwZSksCisgICAgICBtS2V5KGZhbHNlKSwKKyAgICAgIG1BYnNUaW1lY29kZShVSU5UNjRfTUFYKSwKKyAgICAgIG1EYXRhKG5ldyBBQnVmZmVyKDApKSwKKyAgICAgIG1Fb3ModHJ1ZSkgeworfQorCitXZWJtRnJhbWU6OldlYm1GcmFtZShpbnQgdHlwZSwgYm9vbCBrZXksIHVpbnQ2NF90IGFic1RpbWVjb2RlLCBNZWRpYUJ1ZmZlciAqbWJ1ZikKKyAgICA6IG1UeXBlKHR5cGUpLAorICAgICAgbUtleShrZXkpLAorICAgICAgbUFic1RpbWVjb2RlKGFic1RpbWVjb2RlKSwKKyAgICAgIG1EYXRhKHRvQUJ1ZmZlcihtYnVmKSksCisgICAgICBtRW9zKGZhbHNlKSB7Cit9CisKK3NwPFdlYm1FbGVtZW50PiBXZWJtRnJhbWU6OlNpbXBsZUJsb2NrKHVpbnQ2NF90IGJhc2VUaW1lY29kZSkgY29uc3QgeworICAgIHJldHVybiBuZXcgV2VibVNpbXBsZUJsb2NrKAorICAgICAgICAgICAgbVR5cGUgPT0ga1ZpZGVvVHlwZSA/IGtWaWRlb1RyYWNrTnVtIDoga0F1ZGlvVHJhY2tOdW0sCisgICAgICAgICAgICBtQWJzVGltZWNvZGUgLSBiYXNlVGltZWNvZGUsCisgICAgICAgICAgICBtS2V5LAorICAgICAgICAgICAgbURhdGEpOworfQorCitib29sIFdlYm1GcmFtZTo6b3BlcmF0b3I8KGNvbnN0IFdlYm1GcmFtZSAmb3RoZXIpIGNvbnN0IHsKKyAgICBpZiAodGhpcy0+bUVvcykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChvdGhlci5tRW9zKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAodGhpcy0+bUFic1RpbWVjb2RlID09IG90aGVyLm1BYnNUaW1lY29kZSkgeworICAgICAgICBpZiAodGhpcy0+bVR5cGUgPT0ga0F1ZGlvVHlwZSAmJiBvdGhlci5tVHlwZSA9PSBrVmlkZW9UeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy0+bVR5cGUgPT0ga1ZpZGVvVHlwZSAmJiBvdGhlci5tVHlwZSA9PSBrQXVkaW9UeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdGhpcy0+bUFic1RpbWVjb2RlIDwgb3RoZXIubUFic1RpbWVjb2RlOworfQorfSAvKiBuYW1lc3BhY2UgYW5kcm9pZCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYwYjA1NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgV0VCTUZSQU1FX0hfCisjZGVmaW5lIFdFQk1GUkFNRV9IXworCisjaW5jbHVkZSAiV2VibUVsZW1lbnQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgV2VibUZyYW1lIDogTGlnaHRSZWZCYXNlPFdlYm1GcmFtZT4geworcHVibGljOgorICAgIGNvbnN0IGludCBtVHlwZTsKKyAgICBjb25zdCBib29sIG1LZXk7CisgICAgY29uc3QgdWludDY0X3QgbUFic1RpbWVjb2RlOworICAgIGNvbnN0IHNwPEFCdWZmZXI+IG1EYXRhOworICAgIGNvbnN0IGJvb2wgbUVvczsKKworICAgIFdlYm1GcmFtZSgpOworICAgIFdlYm1GcmFtZShpbnQgdHlwZSwgYm9vbCBrZXksIHVpbnQ2NF90IGFic1RpbWVjb2RlLCBNZWRpYUJ1ZmZlciAqYnVmKTsKKyAgICB+V2VibUZyYW1lKCkge30KKworICAgIHNwPFdlYm1FbGVtZW50PiBTaW1wbGVCbG9jayh1aW50NjRfdCBiYXNlVGltZWNvZGUpIGNvbnN0OworCisgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgV2VibUZyYW1lICZvdGhlcikgY29uc3Q7CisKKyAgICBzdGF0aWMgY29uc3Qgc3A8V2VibUZyYW1lPiBFT1M7Citwcml2YXRlOgorICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFdlYm1GcmFtZSk7Cit9OworCit9IC8qIG5hbWVzcGFjZSBhbmRyb2lkICovCisjZW5kaWYgLyogV0VCTUZSQU1FX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZVRocmVhZC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZVRocmVhZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRiOGE0MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lVGhyZWFkLmNwcApAQCAtMCwwICsxLDM5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiV2VibUZyYW1lVGhyZWFkIgorCisjaW5jbHVkZSAiV2VibUNvbnN0YW50cy5oIgorI2luY2x1ZGUgIldlYm1GcmFtZVRocmVhZC5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwordXNpbmcgbmFtZXNwYWNlIHdlYm07CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordm9pZCAqV2VibUZyYW1lVGhyZWFkOjp3cmFwKHZvaWQgKmFyZykgeworICAgIFdlYm1GcmFtZVRocmVhZCAqd29ya2VyID0gcmVpbnRlcnByZXRfY2FzdDxXZWJtRnJhbWVUaHJlYWQqPihhcmcpOworICAgIHdvcmtlci0+cnVuKCk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXR1c190IFdlYm1GcmFtZVRocmVhZDo6c3RhcnQoKSB7CisgICAgcHRocmVhZF9hdHRyX3QgYXR0cjsKKyAgICBwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cik7CisgICAgcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZhdHRyLCBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSk7CisgICAgcHRocmVhZF9jcmVhdGUoJm1UaHJlYWQsICZhdHRyLCBXZWJtRnJhbWVUaHJlYWQ6OndyYXAsIHRoaXMpOworICAgIHB0aHJlYWRfYXR0cl9kZXN0cm95KCZhdHRyKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFdlYm1GcmFtZVRocmVhZDo6c3RvcCgpIHsKKyAgICB2b2lkICpzdGF0dXM7CisgICAgcHRocmVhZF9qb2luKG1UaHJlYWQsICZzdGF0dXMpOworICAgIHJldHVybiAoc3RhdHVzX3QpKGludHB0cl90KXN0YXR1czsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1dlYm1GcmFtZVNvdXJjZVRocmVhZDo6V2VibUZyYW1lU291cmNlVGhyZWFkKAorICAgIGludCB0eXBlLAorICAgIExpbmtlZEJsb2NraW5nUXVldWU8Y29uc3Qgc3A8V2VibUZyYW1lPiA+JiBzaW5rKQorICAgIDogbVR5cGUodHlwZSksIG1TaW5rKHNpbmspIHsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1dlYm1GcmFtZVNpbmtUaHJlYWQ6OldlYm1GcmFtZVNpbmtUaHJlYWQoCisgICAgICAgIGNvbnN0IGludCYgZmQsCisgICAgICAgIGNvbnN0IHVpbnQ2NF90JiBvZmYsCisgICAgICAgIHNwPFdlYm1GcmFtZVNvdXJjZVRocmVhZD4gdmlkZW9UaHJlYWQsCisgICAgICAgIHNwPFdlYm1GcmFtZVNvdXJjZVRocmVhZD4gYXVkaW9UaHJlYWQsCisgICAgICAgIExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4mIGN1ZXMpCisgICAgOiBtRmQoZmQpLAorICAgICAgbVNlZ21lbnREYXRhU3RhcnQob2ZmKSwKKyAgICAgIG1WaWRlb0ZyYW1lcyh2aWRlb1RocmVhZC0+bVNpbmspLAorICAgICAgbUF1ZGlvRnJhbWVzKGF1ZGlvVGhyZWFkLT5tU2luayksCisgICAgICBtQ3VlcyhjdWVzKSwKKyAgICAgIG1Eb25lKHRydWUpIHsKK30KKworV2VibUZyYW1lU2lua1RocmVhZDo6V2VibUZyYW1lU2lua1RocmVhZCgKKyAgICAgICAgY29uc3QgaW50JiBmZCwKKyAgICAgICAgY29uc3QgdWludDY0X3QmIG9mZiwKKyAgICAgICAgTGlua2VkQmxvY2tpbmdRdWV1ZTxjb25zdCBzcDxXZWJtRnJhbWU+ID4mIHZpZGVvU291cmNlLAorICAgICAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlPGNvbnN0IHNwPFdlYm1GcmFtZT4gPiYgYXVkaW9Tb3VyY2UsCisgICAgICAgIExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4mIGN1ZXMpCisgICAgOiBtRmQoZmQpLAorICAgICAgbVNlZ21lbnREYXRhU3RhcnQob2ZmKSwKKyAgICAgIG1WaWRlb0ZyYW1lcyh2aWRlb1NvdXJjZSksCisgICAgICBtQXVkaW9GcmFtZXMoYXVkaW9Tb3VyY2UpLAorICAgICAgbUN1ZXMoY3VlcyksCisgICAgICBtRG9uZSh0cnVlKSB7Cit9CisKKy8vIEluaXRpYWxpemVzIGEgd2VibSBjbHVzdGVyIHdpdGggaXRzIHN0YXJ0aW5nIHRpbWVjb2RlLgorLy8KKy8vIGZyYW1lczoKKy8vICAgc2VxdWVuY2Ugb2YgaW5wdXQgYXVkaW8vdmlkZW8gZnJhbWVzIHJlY2VpdmVkIGZyb20gdGhlIHNvdXJjZS4KKy8vCisvLyBjbHVzdGVyVGltZWNvZGVMOgorLy8gICB0aGUgc3RhcnRpbmcgdGltZWNvZGUgb2YgdGhlIGNsdXN0ZXI7IHRoaXMgaXMgdGhlIHRpbWVjb2RlIG9mIHRoZSBmaXJzdAorLy8gICBmcmFtZSBzaW5jZSBmcmFtZXMgYXJlIG9yZGVyZWQgYnkgdGltZXN0YW1wLgorLy8KKy8vIGNoaWxkcmVuOgorLy8gICBsaXN0IHRvIGhvbGQgY2hpbGQgZWxlbWVudHMgaW4gYSB3ZWJtIGNsdXN0ZXIgKHN0YXJ0IHRpbWVjb2RlIGFuZAorLy8gICBzaW1wbGUgYmxvY2tzKS4KKy8vCisvLyBzdGF0aWMKK3ZvaWQgV2VibUZyYW1lU2lua1RocmVhZDo6aW5pdENsdXN0ZXIoCisgICAgTGlzdDxjb25zdCBzcDxXZWJtRnJhbWU+ID4mIGZyYW1lcywKKyAgICB1aW50NjRfdCYgY2x1c3RlclRpbWVjb2RlTCwKKyAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+JiBjaGlsZHJlbikgeworICAgIENIRUNLKCFmcmFtZXMuZW1wdHkoKSAmJiBjaGlsZHJlbi5lbXB0eSgpKTsKKworICAgIGNvbnN0IHNwPFdlYm1GcmFtZT4gZiA9ICooZnJhbWVzLmJlZ2luKCkpOworICAgIGNsdXN0ZXJUaW1lY29kZUwgPSBmLT5tQWJzVGltZWNvZGU7CisgICAgV2VibVVuc2lnbmVkICpjbHVzdGVyVGltZWNvZGUgPSBuZXcgV2VibVVuc2lnbmVkKGtNa3ZUaW1lY29kZSwgY2x1c3RlclRpbWVjb2RlTCk7CisgICAgY2hpbGRyZW4uY2xlYXIoKTsKKyAgICBjaGlsZHJlbi5wdXNoX2JhY2soY2x1c3RlclRpbWVjb2RlKTsKK30KKwordm9pZCBXZWJtRnJhbWVTaW5rVGhyZWFkOjp3cml0ZUNsdXN0ZXIoTGlzdDxzcDxXZWJtRWxlbWVudD4gPiYgY2hpbGRyZW4pIHsKKyAgICAvLyBjaGlsZHJlbiBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIHNpbXBsZWJsb2NrIGFuZCBpdHMgdGltZWNvZGUKKyAgICBDSEVDS19HRShjaGlsZHJlbi5zaXplKCksIDIpOworCisgICAgdWludDY0X3Qgc2l6ZTsKKyAgICBzcDxXZWJtRWxlbWVudD4gY2x1c3RlciA9IG5ldyBXZWJtTWFzdGVyKGtNa3ZDbHVzdGVyLCBjaGlsZHJlbik7CisgICAgY2x1c3Rlci0+d3JpdGUobUZkLCBzaXplKTsKKyAgICBjaGlsZHJlbi5jbGVhcigpOworfQorCisvLyBXcml0ZSBvdXQgKHBvc3NpYmx5IG11bHRpcGxlKSB3ZWJtIGNsdXN0ZXIocykgZnJvbSBmcmFtZXMgc3BsaXQgb24gdmlkZW8ga2V5IGZyYW1lcy4KKy8vCisvLyBsYXN0OgorLy8gICBjdXJyZW50IGZsdXNoIGlzIHRyaWdnZXJlZCBieSBFT1MgaW5zdGVhZCBvZiBhIHNlY29uZCBvdXRzdGFuZGluZyB2aWRlbyBrZXkgZnJhbWUuCit2b2lkIFdlYm1GcmFtZVNpbmtUaHJlYWQ6OmZsdXNoRnJhbWVzKExpc3Q8Y29uc3Qgc3A8V2VibUZyYW1lPiA+JiBmcmFtZXMsIGJvb2wgbGFzdCkgeworICAgIGlmIChmcmFtZXMuZW1wdHkoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdWludDY0X3QgY2x1c3RlclRpbWVjb2RlTDsKKyAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+IGNoaWxkcmVuOworICAgIGluaXRDbHVzdGVyKGZyYW1lcywgY2x1c3RlclRpbWVjb2RlTCwgY2hpbGRyZW4pOworCisgICAgdWludDY0X3QgY3VlVGltZSA9IGNsdXN0ZXJUaW1lY29kZUw7CisgICAgb2ZmX3QgZnBvcyA9IDo6bHNlZWsobUZkLCAwLCBTRUVLX0NVUik7CisgICAgc2l6ZV90IG4gPSBmcmFtZXMuc2l6ZSgpOworICAgIGlmICghbGFzdCkgeworICAgICAgICAvLyBJZiB3ZSBhcmUgbm90IGZsdXNoaW5nIHRoZSBsYXN0IHNlcXVlbmNlIG9mIG91dHN0YW5kaW5nIGZyYW1lcywgZmx1c2hGcmFtZXMKKyAgICAgICAgLy8gbXVzdCBoYXZlIGJlZW4gY2FsbGVkIHJpZ2h0IGFmdGVyIHdlIGhhdmUgcHVzaGVkIGEgc2Vjb25kIG91dHN0YW5kaW5nIHZpZGVvIGtleQorICAgICAgICAvLyBmcmFtZSAodGhlIGxhc3QgZnJhbWUpLCB3aGljaCBiZWxvbmdzIHRvIHRoZSBuZXh0IGNsdXN0ZXI7IGFsc28gaG9sZCBiYWNrIG9uCisgICAgICAgIC8vIGZsdXNoaW5nIHRoZSBzZWNvbmQgdG8gbGFzdCBmcmFtZSBiZWZvcmUgd2UgY2hlY2sgaXRzIHR5cGUuIEEgYXVkaW8gZnJhbWUKKyAgICAgICAgLy8gc2hvdWxkIHByZWNlZGUgdGhlIGFmb3JlbWVudGlvbmVkIHZpZGVvIGtleSBmcmFtZSBpbiB0aGUgbmV4dCBzZXF1ZW5jZSwgYSB2aWRlbworICAgICAgICAvLyBmcmFtZSBzaG91bGQgYmUgdGhlIGxhc3QgZnJhbWUgaW4gdGhlIGN1cnJlbnQgKHRvLWJlLWZsdXNoZWQpIHNlcXVlbmNlLgorICAgICAgICBDSEVDS19HRShuLCAyKTsKKyAgICAgICAgbiAtPSAyOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGNvbnN0IHNwPFdlYm1GcmFtZT4gZiA9ICooZnJhbWVzLmJlZ2luKCkpOworICAgICAgICBpZiAoZi0+bVR5cGUgPT0ga1ZpZGVvVHlwZSAmJiBmLT5tS2V5KSB7CisgICAgICAgICAgICBjdWVUaW1lID0gZi0+bUFic1RpbWVjb2RlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGYtPm1BYnNUaW1lY29kZSAtIGNsdXN0ZXJUaW1lY29kZUwgPiBJTlQxNl9NQVgpIHsKKyAgICAgICAgICAgIHdyaXRlQ2x1c3RlcihjaGlsZHJlbik7CisgICAgICAgICAgICBpbml0Q2x1c3RlcihmcmFtZXMsIGNsdXN0ZXJUaW1lY29kZUwsIGNoaWxkcmVuKTsKKyAgICAgICAgfQorCisgICAgICAgIGZyYW1lcy5lcmFzZShmcmFtZXMuYmVnaW4oKSk7CisgICAgICAgIGNoaWxkcmVuLnB1c2hfYmFjayhmLT5TaW1wbGVCbG9jayhjbHVzdGVyVGltZWNvZGVMKSk7CisgICAgfQorCisgICAgLy8gZXF1aXZhbGVudCB0byBsYXN0PT1mYWxzZQorICAgIGlmICghZnJhbWVzLmVtcHR5KCkpIHsKKyAgICAgICAgLy8gZGVjaWRlIHdoZXRoZXIgdG8gd3JpdGUgb3V0IHRoZSBzZWNvbmQgdG8gbGFzdCBmcmFtZS4KKyAgICAgICAgY29uc3Qgc3A8V2VibUZyYW1lPiBzZWNvbmRMYXN0RnJhbWUgPSAqKGZyYW1lcy5iZWdpbigpKTsKKyAgICAgICAgaWYgKHNlY29uZExhc3RGcmFtZS0+bVR5cGUgPT0ga1ZpZGVvVHlwZSkgeworICAgICAgICAgICAgZnJhbWVzLmVyYXNlKGZyYW1lcy5iZWdpbigpKTsKKyAgICAgICAgICAgIGNoaWxkcmVuLnB1c2hfYmFjayhzZWNvbmRMYXN0RnJhbWUtPlNpbXBsZUJsb2NrKGNsdXN0ZXJUaW1lY29kZUwpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHdyaXRlQ2x1c3RlcihjaGlsZHJlbik7CisgICAgc3A8V2VibUVsZW1lbnQ+IGN1ZVBvaW50ID0gV2VibUVsZW1lbnQ6OkN1ZVBvaW50RW50cnkoY3VlVGltZSwgMSwgZnBvcyAtIG1TZWdtZW50RGF0YVN0YXJ0KTsKKyAgICBtQ3Vlcy5wdXNoX2JhY2soY3VlUG9pbnQpOworfQorCitzdGF0dXNfdCBXZWJtRnJhbWVTaW5rVGhyZWFkOjpzdGFydCgpIHsKKyAgICBtRG9uZSA9IGZhbHNlOworICAgIHJldHVybiBXZWJtRnJhbWVUaHJlYWQ6OnN0YXJ0KCk7Cit9CisKK3N0YXR1c190IFdlYm1GcmFtZVNpbmtUaHJlYWQ6OnN0b3AoKSB7CisgICAgbURvbmUgPSB0cnVlOworICAgIG1WaWRlb0ZyYW1lcy5wdXNoKFdlYm1GcmFtZTo6RU9TKTsKKyAgICBtQXVkaW9GcmFtZXMucHVzaChXZWJtRnJhbWU6OkVPUyk7CisgICAgcmV0dXJuIFdlYm1GcmFtZVRocmVhZDo6c3RvcCgpOworfQorCit2b2lkIFdlYm1GcmFtZVNpbmtUaHJlYWQ6OnJ1bigpIHsKKyAgICBpbnQgbnVtVmlkZW9LZXlGcmFtZXMgPSAwOworICAgIExpc3Q8Y29uc3Qgc3A8V2VibUZyYW1lPiA+IG91dHN0YW5kaW5nRnJhbWVzOworICAgIHdoaWxlICghbURvbmUpIHsKKyAgICAgICAgQUxPR1YoIndhaXQgdiBmcmFtZSIpOworICAgICAgICBjb25zdCBzcDxXZWJtRnJhbWU+IHZpZGVvRnJhbWUgPSBtVmlkZW9GcmFtZXMucGVlaygpOworICAgICAgICBBTE9HVigidiBmcmFtZTogJXAiLCB2aWRlb0ZyYW1lLmdldCgpKTsKKworICAgICAgICBBTE9HVigid2FpdCBhIGZyYW1lIik7CisgICAgICAgIGNvbnN0IHNwPFdlYm1GcmFtZT4gYXVkaW9GcmFtZSA9IG1BdWRpb0ZyYW1lcy5wZWVrKCk7CisgICAgICAgIEFMT0dWKCJhIGZyYW1lOiAlcCIsIGF1ZGlvRnJhbWUuZ2V0KCkpOworCisgICAgICAgIGlmICh2aWRlb0ZyYW1lLT5tRW9zICYmIGF1ZGlvRnJhbWUtPm1Fb3MpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCphdWRpb0ZyYW1lIDwgKnZpZGVvRnJhbWUpIHsKKyAgICAgICAgICAgIEFMT0dWKCJ0YWtlIGEgZnJhbWUiKTsKKyAgICAgICAgICAgIG1BdWRpb0ZyYW1lcy50YWtlKCk7CisgICAgICAgICAgICBvdXRzdGFuZGluZ0ZyYW1lcy5wdXNoX2JhY2soYXVkaW9GcmFtZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVigidGFrZSB2IGZyYW1lIik7CisgICAgICAgICAgICBtVmlkZW9GcmFtZXMudGFrZSgpOworICAgICAgICAgICAgb3V0c3RhbmRpbmdGcmFtZXMucHVzaF9iYWNrKHZpZGVvRnJhbWUpOworICAgICAgICAgICAgaWYgKHZpZGVvRnJhbWUtPm1LZXkpCisgICAgICAgICAgICAgICAgbnVtVmlkZW9LZXlGcmFtZXMrKzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChudW1WaWRlb0tleUZyYW1lcyA9PSAyKSB7CisgICAgICAgICAgICBmbHVzaEZyYW1lcyhvdXRzdGFuZGluZ0ZyYW1lcywgLyogbGFzdCA9ICovIGZhbHNlKTsKKyAgICAgICAgICAgIG51bVZpZGVvS2V5RnJhbWVzLS07CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1YoImZsdXNoaW5nIGxhc3QgY2x1c3RlciAoc2l6ZSAlenUpIiwgb3V0c3RhbmRpbmdGcmFtZXMuc2l6ZSgpKTsKKyAgICBmbHVzaEZyYW1lcyhvdXRzdGFuZGluZ0ZyYW1lcywgLyogbGFzdCA9ICovIHRydWUpOworICAgIG1Eb25lID0gdHJ1ZTsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N0YXRpYyBjb25zdCBpbnQ2NF90IGtJbml0aWFsRGVsYXlUaW1lVXMgPSA3MDAwMDBMTDsKKwordm9pZCBXZWJtRnJhbWVNZWRpYVNvdXJjZVRocmVhZDo6Y2xlYXJGbGFncygpIHsKKyAgICBtRG9uZSA9IGZhbHNlOworICAgIG1QYXVzZWQgPSBmYWxzZTsKKyAgICBtUmVzdW1lZCA9IGZhbHNlOworICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgbVJlYWNoZWRFT1MgPSBmYWxzZTsKK30KKworV2VibUZyYW1lTWVkaWFTb3VyY2VUaHJlYWQ6OldlYm1GcmFtZU1lZGlhU291cmNlVGhyZWFkKAorICAgICAgICBjb25zdCBzcDxNZWRpYVNvdXJjZT4mIHNvdXJjZSwKKyAgICAgICAgaW50IHR5cGUsCisgICAgICAgIExpbmtlZEJsb2NraW5nUXVldWU8Y29uc3Qgc3A8V2VibUZyYW1lPiA+JiBzaW5rLAorICAgICAgICB1aW50NjRfdCB0aW1lQ29kZVNjYWxlLAorICAgICAgICBpbnQ2NF90IHN0YXJ0VGltZVJlYWxVcywKKyAgICAgICAgaW50MzJfdCBzdGFydFRpbWVPZmZzZXRNcywKKyAgICAgICAgaW50IG51bVRyYWNrcywKKyAgICAgICAgYm9vbCByZWFsVGltZVJlY29yZGluZykKKyAgICA6IFdlYm1GcmFtZVNvdXJjZVRocmVhZCh0eXBlLCBzaW5rKSwKKyAgICAgIG1Tb3VyY2Uoc291cmNlKSwKKyAgICAgIG1UaW1lQ29kZVNjYWxlKHRpbWVDb2RlU2NhbGUpLAorICAgICAgbVRyYWNrRHVyYXRpb25VcygwKSB7CisgICAgY2xlYXJGbGFncygpOworICAgIG1TdGFydFRpbWVVcyA9IHN0YXJ0VGltZVJlYWxVczsKKyAgICBpZiAocmVhbFRpbWVSZWNvcmRpbmcgJiYgbnVtVHJhY2tzID4gMSkgeworICAgICAgICAvKgorICAgICAgICAgKiBDb3BpZWQgZnJvbSBNUEVHNFdyaXRlcgorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIGV4dHJhIGRlbGF5IG9mIGFjY2VwdGluZyBpbmNvbWluZyBhdWRpby92aWRlbyBzaWduYWxzCisgICAgICAgICAqIGhlbHBzIHRvIGFsaWduIGEvdiBzdGFydCB0aW1lIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSByZWNvcmRpbmcKKyAgICAgICAgICogc2Vzc2lvbiwgYW5kIGl0IGFsc28gaGVscHMgZWxpbWluYXRlIHRoZSAicmVjb3JkaW5nIiBzb3VuZCBmb3IKKyAgICAgICAgICogY2FtY29yZGVyIGFwcGxpY2F0aW9ucy4KKyAgICAgICAgICoKKyAgICAgICAgICogSWYgY2xpZW50IGRvZXMgbm90IHNldCB0aGUgc3RhcnQgdGltZSBvZmZzZXQsIHdlIGZhbGwgYmFjayB0bworICAgICAgICAgKiB1c2UgdGhlIGRlZmF1bHQgaW5pdGlhbCBkZWxheSB2YWx1ZS4KKyAgICAgICAgICovCisgICAgICAgIGludDY0X3Qgc3RhcnRUaW1lT2Zmc2V0VXMgPSBzdGFydFRpbWVPZmZzZXRNcyAqIDEwMDBMTDsKKyAgICAgICAgaWYgKHN0YXJ0VGltZU9mZnNldFVzIDwgMCkgeyAgLy8gU3RhcnQgdGltZSBvZmZzZXQgd2FzIG5vdCBzZXQKKyAgICAgICAgICAgIHN0YXJ0VGltZU9mZnNldFVzID0ga0luaXRpYWxEZWxheVRpbWVVczsKKyAgICAgICAgfQorICAgICAgICBtU3RhcnRUaW1lVXMgKz0gc3RhcnRUaW1lT2Zmc2V0VXM7CisgICAgICAgIEFMT0dJKCJTdGFydCB0aW1lIG9mZnNldDogJSIgUFJJZDY0ICIgdXMiLCBzdGFydFRpbWVPZmZzZXRVcyk7CisgICAgfQorfQorCitzdGF0dXNfdCBXZWJtRnJhbWVNZWRpYVNvdXJjZVRocmVhZDo6c3RhcnQoKSB7CisgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7CisgICAgbWV0YS0+c2V0SW50NjQoa0tleVRpbWUsIG1TdGFydFRpbWVVcyk7CisgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+c3RhcnQobWV0YS5nZXQoKSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBtRG9uZSA9IHRydWU7CisgICAgICAgIG1SZWFjaGVkRU9TID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9IGVsc2UgeworICAgICAgICBtU3RhcnRlZCA9IHRydWU7CisgICAgICAgIHJldHVybiBXZWJtRnJhbWVUaHJlYWQ6OnN0YXJ0KCk7CisgICAgfQorfQorCitzdGF0dXNfdCBXZWJtRnJhbWVNZWRpYVNvdXJjZVRocmVhZDo6cmVzdW1lKCkgeworICAgIGlmICghbURvbmUgJiYgbVBhdXNlZCkgeworICAgICAgICBtUGF1c2VkID0gZmFsc2U7CisgICAgICAgIG1SZXN1bWVkID0gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBXZWJtRnJhbWVNZWRpYVNvdXJjZVRocmVhZDo6cGF1c2UoKSB7CisgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIG1QYXVzZWQgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFdlYm1GcmFtZU1lZGlhU291cmNlVGhyZWFkOjpzdG9wKCkgeworICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgICAgICBtRG9uZSA9IHRydWU7CisgICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgcmV0dXJuIFdlYm1GcmFtZVRocmVhZDo6c3RvcCgpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgV2VibUZyYW1lTWVkaWFTb3VyY2VUaHJlYWQ6OnJ1bigpIHsKKyAgICBpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpbnQ2NF90IHRpbWVzdGFtcFVzID0gMHhkZWFkYmVlZjsKKyAgICBpbnQ2NF90IGxhc3RUaW1lc3RhbXBVcyA9IDA7IC8vIFByZXZpb3VzIHNhbXBsZSB0aW1lIHN0YW1wCisgICAgaW50NjRfdCBsYXN0RHVyYXRpb25VcyA9IDA7IC8vIFByZXZpb3VzIHNhbXBsZSBkdXJhdGlvbgorICAgIGludDY0X3QgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzID0gMDsKKworICAgIGNvbnN0IHVpbnQ2NF90IGtVbmluaXRpYWxpemVkID0gMHhmZmZmZmZmZmZmZmZmZmZmTDsKKyAgICBtU3RhcnRUaW1lVXMgPSBrVW5pbml0aWFsaXplZDsKKworICAgIHN0YXR1c190IGVyciA9IE9LOworICAgIE1lZGlhQnVmZmVyICpidWZmZXI7CisgICAgd2hpbGUgKCFtRG9uZSAmJiAoZXJyID0gbVNvdXJjZS0+cmVhZCgmYnVmZmVyLCBOVUxMKSkgPT0gT0spIHsKKyAgICAgICAgaWYgKGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBidWZmZXIgPSBOVUxMOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBzcDxNZXRhRGF0YT4gbWQgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgICAgICBDSEVDSyhtZC0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZXN0YW1wVXMpKTsKKyAgICAgICAgaWYgKG1TdGFydFRpbWVVcyA9PSBrVW5pbml0aWFsaXplZCkgeworICAgICAgICAgICAgbVN0YXJ0VGltZVVzID0gdGltZXN0YW1wVXM7CisgICAgICAgIH0KKyAgICAgICAgdGltZXN0YW1wVXMgLT0gbVN0YXJ0VGltZVVzOworCisgICAgICAgIGlmIChtUGF1c2VkICYmICFtUmVzdW1lZCkgeworICAgICAgICAgICAgbGFzdER1cmF0aW9uVXMgPSB0aW1lc3RhbXBVcyAtIGxhc3RUaW1lc3RhbXBVczsKKyAgICAgICAgICAgIGxhc3RUaW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOworICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBidWZmZXIgPSBOVUxMOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgKytjb3VudDsKKworICAgICAgICAvLyBhZGp1c3QgdGltZS1zdGFtcHMgYWZ0ZXIgcGF1c2UvcmVzdW1lCisgICAgICAgIGlmIChtUmVzdW1lZCkgeworICAgICAgICAgICAgaW50NjRfdCBkdXJFeGNsdWRpbmdFYXJsaWVyUGF1c2VzVXMgPSB0aW1lc3RhbXBVcyAtIHByZXZpb3VzUGF1c2VkRHVyYXRpb25VczsKKyAgICAgICAgICAgIENIRUNLX0dFKGR1ckV4Y2x1ZGluZ0VhcmxpZXJQYXVzZXNVcywgMGxsKTsKKyAgICAgICAgICAgIGludDY0X3QgcGF1c2VkRHVyYXRpb25VcyA9IGR1ckV4Y2x1ZGluZ0VhcmxpZXJQYXVzZXNVcyAtIG1UcmFja0R1cmF0aW9uVXM7CisgICAgICAgICAgICBDSEVDS19HRShwYXVzZWREdXJhdGlvblVzLCBsYXN0RHVyYXRpb25Vcyk7CisgICAgICAgICAgICBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXMgKz0gcGF1c2VkRHVyYXRpb25VcyAtIGxhc3REdXJhdGlvblVzOworICAgICAgICAgICAgbVJlc3VtZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0aW1lc3RhbXBVcyAtPSBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXM7CisgICAgICAgIENIRUNLX0dFKHRpbWVzdGFtcFVzLCAwbGwpOworCisgICAgICAgIGludDMyX3QgaXNTeW5jID0gZmFsc2U7CisgICAgICAgIG1kLT5maW5kSW50MzIoa0tleUlzU3luY0ZyYW1lLCAmaXNTeW5jKTsKKyAgICAgICAgY29uc3Qgc3A8V2VibUZyYW1lPiBmID0gbmV3IFdlYm1GcmFtZSgKKyAgICAgICAgICAgIG1UeXBlLAorICAgICAgICAgICAgaXNTeW5jLAorICAgICAgICAgICAgdGltZXN0YW1wVXMgKiAxMDAwIC8gbVRpbWVDb2RlU2NhbGUsCisgICAgICAgICAgICBidWZmZXIpOworICAgICAgICBtU2luay5wdXNoKGYpOworCisgICAgICAgIEFMT0dWKAorICAgICAgICAgICAgIiVzICVzIGZyYW1lIGF0ICUiIFBSSWQ2NCAiIHNpemUgJXp1XG4iLAorICAgICAgICAgICAgbVR5cGUgPT0ga1ZpZGVvVHlwZSA/ICJ2aWRlbyIgOiAiYXVkaW8iLAorICAgICAgICAgICAgaXNTeW5jID8gIkkiIDogIlAiLAorICAgICAgICAgICAgdGltZXN0YW1wVXMgKiAxMDAwIC8gbVRpbWVDb2RlU2NhbGUsCisgICAgICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKKworICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgYnVmZmVyID0gTlVMTDsKKworICAgICAgICBpZiAodGltZXN0YW1wVXMgPiBtVHJhY2tEdXJhdGlvblVzKSB7CisgICAgICAgICAgICBtVHJhY2tEdXJhdGlvblVzID0gdGltZXN0YW1wVXM7CisgICAgICAgIH0KKyAgICAgICAgbGFzdER1cmF0aW9uVXMgPSB0aW1lc3RhbXBVcyAtIGxhc3RUaW1lc3RhbXBVczsKKyAgICAgICAgbGFzdFRpbWVzdGFtcFVzID0gdGltZXN0YW1wVXM7CisgICAgfQorCisgICAgbVRyYWNrRHVyYXRpb25VcyArPSBsYXN0RHVyYXRpb25VczsKKyAgICBtU2luay5wdXNoKFdlYm1GcmFtZTo6RU9TKTsKK30KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lVGhyZWFkLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZVRocmVhZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NWQ5YjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZVRocmVhZC5oCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBXRUJNRlJBTUVUSFJFQURfSF8KKyNkZWZpbmUgV0VCTUZSQU1FVEhSRUFEX0hfCisKKyNpbmNsdWRlICJXZWJtRnJhbWUuaCIKKyNpbmNsdWRlICJMaW5rZWRCbG9ja2luZ1F1ZXVlLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBXZWJtRnJhbWVUaHJlYWQgOiBwdWJsaWMgTGlnaHRSZWZCYXNlPFdlYm1GcmFtZVRocmVhZD4geworcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBydW4oKSA9IDA7CisgICAgdmlydHVhbCBib29sIHJ1bm5pbmcoKSB7IHJldHVybiBmYWxzZTsgfQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCkgeyByZXR1cm4gT0s7IH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3VtZSgpIHsgcmV0dXJuIE9LOyB9CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCB+V2VibUZyYW1lVGhyZWFkKCkgeyBzdG9wKCk7IH0KKyAgICBzdGF0aWMgdm9pZCAqd3JhcCh2b2lkICphcmcpOworCitwcm90ZWN0ZWQ6CisgICAgV2VibUZyYW1lVGhyZWFkKCkKKyAgICAgICAgOiBtVGhyZWFkKDApIHsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgcHRocmVhZF90IG1UaHJlYWQ7CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoV2VibUZyYW1lVGhyZWFkKTsKK307CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBXZWJtRnJhbWVTb3VyY2VUaHJlYWQ7CitjbGFzcyBXZWJtRnJhbWVTaW5rVGhyZWFkIDogcHVibGljIFdlYm1GcmFtZVRocmVhZCB7CitwdWJsaWM6CisgICAgV2VibUZyYW1lU2lua1RocmVhZCgKKyAgICAgICAgICAgIGNvbnN0IGludCYgZmQsCisgICAgICAgICAgICBjb25zdCB1aW50NjRfdCYgb2ZmLAorICAgICAgICAgICAgc3A8V2VibUZyYW1lU291cmNlVGhyZWFkPiB2aWRlb1RocmVhZCwKKyAgICAgICAgICAgIHNwPFdlYm1GcmFtZVNvdXJjZVRocmVhZD4gYXVkaW9UaHJlYWQsCisgICAgICAgICAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+JiBjdWVzKTsKKworICAgIFdlYm1GcmFtZVNpbmtUaHJlYWQoCisgICAgICAgICAgICBjb25zdCBpbnQmIGZkLAorICAgICAgICAgICAgY29uc3QgdWludDY0X3QmIG9mZiwKKyAgICAgICAgICAgIExpbmtlZEJsb2NraW5nUXVldWU8Y29uc3Qgc3A8V2VibUZyYW1lPiA+JiB2aWRlb1NvdXJjZSwKKyAgICAgICAgICAgIExpbmtlZEJsb2NraW5nUXVldWU8Y29uc3Qgc3A8V2VibUZyYW1lPiA+JiBhdWRpb1NvdXJjZSwKKyAgICAgICAgICAgIExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4mIGN1ZXMpOworCisgICAgdm9pZCBydW4oKTsKKyAgICBib29sIHJ1bm5pbmcoKSB7CisgICAgICAgIHJldHVybiAhbURvbmU7CisgICAgfQorICAgIHN0YXR1c190IHN0YXJ0KCk7CisgICAgc3RhdHVzX3Qgc3RvcCgpOworCitwcml2YXRlOgorICAgIGNvbnN0IGludCYgbUZkOworICAgIGNvbnN0IHVpbnQ2NF90JiBtU2VnbWVudERhdGFTdGFydDsKKyAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlPGNvbnN0IHNwPFdlYm1GcmFtZT4gPiYgbVZpZGVvRnJhbWVzOworICAgIExpbmtlZEJsb2NraW5nUXVldWU8Y29uc3Qgc3A8V2VibUZyYW1lPiA+JiBtQXVkaW9GcmFtZXM7CisgICAgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiYgbUN1ZXM7CisKKyAgICB2b2xhdGlsZSBib29sIG1Eb25lOworCisgICAgc3RhdGljIHZvaWQgaW5pdENsdXN0ZXIoCisgICAgICAgICAgICBMaXN0PGNvbnN0IHNwPFdlYm1GcmFtZT4gPiYgZnJhbWVzLAorICAgICAgICAgICAgdWludDY0X3QmIGNsdXN0ZXJUaW1lY29kZUwsCisgICAgICAgICAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+JiBjaGlsZHJlbik7CisgICAgdm9pZCB3cml0ZUNsdXN0ZXIoTGlzdDxzcDxXZWJtRWxlbWVudD4gPiYgY2hpbGRyZW4pOworICAgIHZvaWQgZmx1c2hGcmFtZXMoTGlzdDxjb25zdCBzcDxXZWJtRnJhbWU+ID4mIGZyYW1lcywgYm9vbCBsYXN0KTsKK307CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBXZWJtRnJhbWVTb3VyY2VUaHJlYWQgOiBwdWJsaWMgV2VibUZyYW1lVGhyZWFkIHsKK3B1YmxpYzoKKyAgICBXZWJtRnJhbWVTb3VyY2VUaHJlYWQoaW50IHR5cGUsIExpbmtlZEJsb2NraW5nUXVldWU8Y29uc3Qgc3A8V2VibUZyYW1lPiA+JiBzaW5rKTsKKyAgICB2aXJ0dWFsIGludDY0X3QgZ2V0RHVyYXRpb25VcygpID0gMDsKK3Byb3RlY3RlZDoKKyAgICBjb25zdCBpbnQgbVR5cGU7CisgICAgTGlua2VkQmxvY2tpbmdRdWV1ZTxjb25zdCBzcDxXZWJtRnJhbWU+ID4mIG1TaW5rOworCisgICAgZnJpZW5kIGNsYXNzIFdlYm1GcmFtZVNpbmtUaHJlYWQ7Cit9OworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgV2VibUZyYW1lRW1wdHlTb3VyY2VUaHJlYWQgOiBwdWJsaWMgV2VibUZyYW1lU291cmNlVGhyZWFkIHsKK3B1YmxpYzoKKyAgICBXZWJtRnJhbWVFbXB0eVNvdXJjZVRocmVhZChpbnQgdHlwZSwgTGlua2VkQmxvY2tpbmdRdWV1ZTxjb25zdCBzcDxXZWJtRnJhbWU+ID4mIHNpbmspCisgICAgICAgIDogV2VibUZyYW1lU291cmNlVGhyZWFkKHR5cGUsIHNpbmspIHsKKyAgICB9CisgICAgdm9pZCBydW4oKSB7IG1TaW5rLnB1c2goV2VibUZyYW1lOjpFT1MpOyB9CisgICAgaW50NjRfdCBnZXREdXJhdGlvblVzKCkgeyByZXR1cm4gMDsgfQorfTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFdlYm1GcmFtZU1lZGlhU291cmNlVGhyZWFkOiBwdWJsaWMgV2VibUZyYW1lU291cmNlVGhyZWFkIHsKK3B1YmxpYzoKKyAgICBXZWJtRnJhbWVNZWRpYVNvdXJjZVRocmVhZCgKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhU291cmNlPiYgc291cmNlLAorICAgICAgICAgICAgaW50IHR5cGUsCisgICAgICAgICAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlPGNvbnN0IHNwPFdlYm1GcmFtZT4gPiYgc2luaywKKyAgICAgICAgICAgIHVpbnQ2NF90IHRpbWVDb2RlU2NhbGUsCisgICAgICAgICAgICBpbnQ2NF90IHN0YXJ0VGltZVJlYWxVcywKKyAgICAgICAgICAgIGludDMyX3Qgc3RhcnRUaW1lT2Zmc2V0TXMsCisgICAgICAgICAgICBpbnQgbnVtUGVlcnMsCisgICAgICAgICAgICBib29sIHJlYWxUaW1lUmVjb3JkaW5nKTsKKworICAgIHZvaWQgcnVuKCk7CisgICAgc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICBzdGF0dXNfdCByZXN1bWUoKTsKKyAgICBzdGF0dXNfdCBwYXVzZSgpOworICAgIHN0YXR1c190IHN0b3AoKTsKKyAgICBpbnQ2NF90IGdldER1cmF0aW9uVXMoKSB7CisgICAgICAgIHJldHVybiBtVHJhY2tEdXJhdGlvblVzOworICAgIH0KKworcHJpdmF0ZToKKyAgICBjb25zdCBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKKyAgICBjb25zdCB1aW50NjRfdCBtVGltZUNvZGVTY2FsZTsKKyAgICB1aW50NjRfdCBtU3RhcnRUaW1lVXM7CisKKyAgICB2b2xhdGlsZSBib29sIG1Eb25lOworICAgIHZvbGF0aWxlIGJvb2wgbVBhdXNlZDsKKyAgICB2b2xhdGlsZSBib29sIG1SZXN1bWVkOworICAgIHZvbGF0aWxlIGJvb2wgbVN0YXJ0ZWQ7CisgICAgdm9sYXRpbGUgYm9vbCBtUmVhY2hlZEVPUzsKKyAgICBpbnQ2NF90IG1UcmFja0R1cmF0aW9uVXM7CisKKyAgICB2b2lkIGNsZWFyRmxhZ3MoKTsKK307Cit9IC8qIG5hbWVzcGFjZSBhbmRyb2lkICovCisKKyNlbmRpZiAvKiBXRUJNRlJBTUVUSFJFQURfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibVdyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzY2Y5MmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuY3BwCkBAIC0wLDAgKzEsNTUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiV2VibVdyaXRlciIKKworI2luY2x1ZGUgIkVibWxVdGlsLmgiCisjaW5jbHVkZSAiV2VibVdyaXRlci5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwordXNpbmcgbmFtZXNwYWNlIHdlYm07CisKK25hbWVzcGFjZSB7CitzaXplX3QgWGlwaExhY2VDb2RlTGVuKHNpemVfdCBzaXplKSB7CisgICAgcmV0dXJuIHNpemUgLyAweGZmICsgMTsKK30KKworc2l6ZV90IFhpcGhMYWNlRW5jKHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IHNpemUpIHsKKyAgICBzaXplX3QgaTsKKyAgICBmb3IgKGkgPSAwOyBzaXplID49IDB4ZmY7ICsraSwgc2l6ZSAtPSAweGZmKSB7CisgICAgICAgIGJ1ZltpXSA9IDB4ZmY7CisgICAgfQorICAgIGJ1ZltpKytdID0gc2l6ZTsKKyAgICByZXR1cm4gaTsKK30KK30KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgY29uc3QgaW50NjRfdCBrTWluU3RyZWFtYWJsZUZpbGVTaXplSW5CeXRlcyA9IDUgKiAxMDI0ICogMTAyNDsKKworV2VibVdyaXRlcjo6V2VibVdyaXRlcihpbnQgZmQpCisgICAgOiBtRmQoZHVwKGZkKSksCisgICAgICBtSW5pdENoZWNrKG1GZCA8IDAgPyBOT19JTklUIDogT0spLAorICAgICAgbVRpbWVDb2RlU2NhbGUoMTAwMDAwMCksCisgICAgICBtU3RhcnRUaW1lc3RhbXBVcygwKSwKKyAgICAgIG1TdGFydFRpbWVPZmZzZXRNcygwKSwKKyAgICAgIG1TZWdtZW50T2Zmc2V0KDApLAorICAgICAgbVNlZ21lbnREYXRhU3RhcnQoMCksCisgICAgICBtSW5mb09mZnNldCgwKSwKKyAgICAgIG1JbmZvU2l6ZSgwKSwKKyAgICAgIG1UcmFja3NPZmZzZXQoMCksCisgICAgICBtQ3Vlc09mZnNldCgwKSwKKyAgICAgIG1QYXVzZWQoZmFsc2UpLAorICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAorICAgICAgbUlzRmlsZVNpemVMaW1pdEV4cGxpY2l0bHlSZXF1ZXN0ZWQoZmFsc2UpLAorICAgICAgbUlzUmVhbFRpbWVSZWNvcmRpbmcoZmFsc2UpLAorICAgICAgbVN0cmVhbWFibGVGaWxlKHRydWUpLAorICAgICAgbUVzdGltYXRlZEN1ZXNTaXplKDApIHsKKyAgICBtU3RyZWFtc1trQXVkaW9JbmRleF0gPSBXZWJtU3RyZWFtKGtBdWRpb1R5cGUsICJBdWRpbyIsICZXZWJtV3JpdGVyOjphdWRpb1RyYWNrKTsKKyAgICBtU3RyZWFtc1trVmlkZW9JbmRleF0gPSBXZWJtU3RyZWFtKGtWaWRlb1R5cGUsICJWaWRlbyIsICZXZWJtV3JpdGVyOjp2aWRlb1RyYWNrKTsKKyAgICBtU2lua1RocmVhZCA9IG5ldyBXZWJtRnJhbWVTaW5rVGhyZWFkKAorICAgICAgICAgICAgbUZkLAorICAgICAgICAgICAgbVNlZ21lbnREYXRhU3RhcnQsCisgICAgICAgICAgICBtU3RyZWFtc1trVmlkZW9JbmRleF0ubVNpbmssCisgICAgICAgICAgICBtU3RyZWFtc1trQXVkaW9JbmRleF0ubVNpbmssCisgICAgICAgICAgICBtQ3VlUG9pbnRzKTsKK30KKworV2VibVdyaXRlcjo6V2VibVdyaXRlcihjb25zdCBjaGFyICpmaWxlbmFtZSkKKyAgICA6IG1Jbml0Q2hlY2soTk9fSU5JVCksCisgICAgICBtVGltZUNvZGVTY2FsZSgxMDAwMDAwKSwKKyAgICAgIG1TdGFydFRpbWVzdGFtcFVzKDApLAorICAgICAgbVN0YXJ0VGltZU9mZnNldE1zKDApLAorICAgICAgbVNlZ21lbnRPZmZzZXQoMCksCisgICAgICBtU2VnbWVudERhdGFTdGFydCgwKSwKKyAgICAgIG1JbmZvT2Zmc2V0KDApLAorICAgICAgbUluZm9TaXplKDApLAorICAgICAgbVRyYWNrc09mZnNldCgwKSwKKyAgICAgIG1DdWVzT2Zmc2V0KDApLAorICAgICAgbVBhdXNlZChmYWxzZSksCisgICAgICBtU3RhcnRlZChmYWxzZSksCisgICAgICBtSXNGaWxlU2l6ZUxpbWl0RXhwbGljaXRseVJlcXVlc3RlZChmYWxzZSksCisgICAgICBtSXNSZWFsVGltZVJlY29yZGluZyhmYWxzZSksCisgICAgICBtU3RyZWFtYWJsZUZpbGUodHJ1ZSksCisgICAgICBtRXN0aW1hdGVkQ3Vlc1NpemUoMCkgeworICAgIG1GZCA9IG9wZW4oZmlsZW5hbWUsIE9fQ1JFQVQgfCBPX0xBUkdFRklMRSB8IE9fVFJVTkMgfCBPX1JEV1IsIFNfSVJVU1IgfCBTX0lXVVNSKTsKKyAgICBpZiAobUZkID49IDApIHsKKyAgICAgICAgQUxPR1YoImZkICVkOyBmbGFnczogJW8iLCBtRmQsIGZjbnRsKG1GZCwgRl9HRVRGTCwgMCkpOworICAgICAgICBtSW5pdENoZWNrID0gT0s7CisgICAgfQorICAgIG1TdHJlYW1zW2tBdWRpb0luZGV4XSA9IFdlYm1TdHJlYW0oa0F1ZGlvVHlwZSwgIkF1ZGlvIiwgJldlYm1Xcml0ZXI6OmF1ZGlvVHJhY2spOworICAgIG1TdHJlYW1zW2tWaWRlb0luZGV4XSA9IFdlYm1TdHJlYW0oa1ZpZGVvVHlwZSwgIlZpZGVvIiwgJldlYm1Xcml0ZXI6OnZpZGVvVHJhY2spOworICAgIG1TaW5rVGhyZWFkID0gbmV3IFdlYm1GcmFtZVNpbmtUaHJlYWQoCisgICAgICAgICAgICBtRmQsCisgICAgICAgICAgICBtU2VnbWVudERhdGFTdGFydCwKKyAgICAgICAgICAgIG1TdHJlYW1zW2tWaWRlb0luZGV4XS5tU2luaywKKyAgICAgICAgICAgIG1TdHJlYW1zW2tBdWRpb0luZGV4XS5tU2luaywKKyAgICAgICAgICAgIG1DdWVQb2ludHMpOworfQorCisvLyBzdGF0aWMKK3NwPFdlYm1FbGVtZW50PiBXZWJtV3JpdGVyOjp2aWRlb1RyYWNrKGNvbnN0IHNwPE1ldGFEYXRhPiYgbWQpIHsKKyAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisgICAgQ0hFQ0sobWQtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ3aWR0aCkpOworICAgIENIRUNLKG1kLT5maW5kSW50MzIoa0tleUhlaWdodCwgJmhlaWdodCkpOworICAgIHJldHVybiBXZWJtRWxlbWVudDo6VmlkZW9UcmFja0VudHJ5KHdpZHRoLCBoZWlnaHQpOworfQorCisvLyBzdGF0aWMKK3NwPFdlYm1FbGVtZW50PiBXZWJtV3JpdGVyOjphdWRpb1RyYWNrKGNvbnN0IHNwPE1ldGFEYXRhPiYgbWQpIHsKKyAgICBpbnQzMl90IG5DaGFubmVscywgc2FtcGxlcmF0ZTsKKyAgICB1aW50MzJfdCB0eXBlOworICAgIGNvbnN0IHZvaWQgKmhlYWRlckRhdGExOworICAgIGNvbnN0IGNoYXIgaGVhZGVyRGF0YTJbXSA9IHsgMywgJ3YnLCAnbycsICdyJywgJ2InLCAnaScsICdzJywgNywgMCwgMCwgMCwKKyAgICAgICAgICAgICdhJywgJ24nLCAnZCcsICdyJywgJ28nLCAnaScsICdkJywgMCwgMCwgMCwgMCwgMSB9OworICAgIGNvbnN0IHZvaWQgKmhlYWRlckRhdGEzOworICAgIHNpemVfdCBoZWFkZXJTaXplMSwgaGVhZGVyU2l6ZTIgPSBzaXplb2YoaGVhZGVyRGF0YTIpLCBoZWFkZXJTaXplMzsKKworICAgIENIRUNLKG1kLT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm5DaGFubmVscykpOworICAgIENIRUNLKG1kLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVyYXRlKSk7CisgICAgQ0hFQ0sobWQtPmZpbmREYXRhKGtLZXlWb3JiaXNJbmZvLCAmdHlwZSwgJmhlYWRlckRhdGExLCAmaGVhZGVyU2l6ZTEpKTsKKyAgICBDSEVDSyhtZC0+ZmluZERhdGEoa0tleVZvcmJpc0Jvb2tzLCAmdHlwZSwgJmhlYWRlckRhdGEzLCAmaGVhZGVyU2l6ZTMpKTsKKworICAgIHNpemVfdCBjb2RlY1ByaXZhdGVTaXplID0gMTsKKyAgICBjb2RlY1ByaXZhdGVTaXplICs9IFhpcGhMYWNlQ29kZUxlbihoZWFkZXJTaXplMSk7CisgICAgY29kZWNQcml2YXRlU2l6ZSArPSBYaXBoTGFjZUNvZGVMZW4oaGVhZGVyU2l6ZTIpOworICAgIGNvZGVjUHJpdmF0ZVNpemUgKz0gaGVhZGVyU2l6ZTEgKyBoZWFkZXJTaXplMiArIGhlYWRlclNpemUzOworCisgICAgb2ZmX3Qgb2ZmID0gMDsKKyAgICBzcDxBQnVmZmVyPiBjb2RlY1ByaXZhdGVCdWYgPSBuZXcgQUJ1ZmZlcihjb2RlY1ByaXZhdGVTaXplKTsKKyAgICB1aW50OF90ICpjb2RlY1ByaXZhdGVEYXRhID0gY29kZWNQcml2YXRlQnVmLT5kYXRhKCk7CisgICAgY29kZWNQcml2YXRlRGF0YVtvZmYrK10gPSAyOworCisgICAgb2ZmICs9IFhpcGhMYWNlRW5jKGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlclNpemUxKTsKKyAgICBvZmYgKz0gWGlwaExhY2VFbmMoY29kZWNQcml2YXRlRGF0YSArIG9mZiwgaGVhZGVyU2l6ZTIpOworCisgICAgbWVtY3B5KGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlckRhdGExLCBoZWFkZXJTaXplMSk7CisgICAgb2ZmICs9IGhlYWRlclNpemUxOworICAgIG1lbWNweShjb2RlY1ByaXZhdGVEYXRhICsgb2ZmLCBoZWFkZXJEYXRhMiwgaGVhZGVyU2l6ZTIpOworICAgIG9mZiArPSBoZWFkZXJTaXplMjsKKyAgICBtZW1jcHkoY29kZWNQcml2YXRlRGF0YSArIG9mZiwgaGVhZGVyRGF0YTMsIGhlYWRlclNpemUzKTsKKworICAgIHNwPFdlYm1FbGVtZW50PiBlbnRyeSA9IFdlYm1FbGVtZW50OjpBdWRpb1RyYWNrRW50cnkoCisgICAgICAgICAgICBuQ2hhbm5lbHMsCisgICAgICAgICAgICBzYW1wbGVyYXRlLAorICAgICAgICAgICAgY29kZWNQcml2YXRlQnVmKTsKKyAgICByZXR1cm4gZW50cnk7Cit9CisKK3NpemVfdCBXZWJtV3JpdGVyOjpudW1UcmFja3MoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKKworICAgIHNpemVfdCBudW1UcmFja3MgPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heFN0cmVhbXM7ICsraSkgeworICAgICAgICBpZiAobVN0cmVhbXNbaV0ubVRyYWNrRW50cnkgIT0gTlVMTCkgeworICAgICAgICAgICAgbnVtVHJhY2tzKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbnVtVHJhY2tzOworfQorCit1aW50NjRfdCBXZWJtV3JpdGVyOjplc3RpbWF0ZUN1ZXNTaXplKGludDMyX3QgYml0UmF0ZSkgeworICAgIC8vIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gZXN0aW1hdGVNb292Qm94U2l6ZSBpbiBNUEVHNFdyaXRlci4KKyAgICAvLworICAgIC8vIFN0YXRpc3RpY2FsIGFuYWx5c2lzIHNob3dzIHRoYXQgbWV0YWRhdGEgdXN1YWxseSBhY2NvdW50cworICAgIC8vIGZvciBhIHNtYWxsIHBvcnRpb24gb2YgdGhlIHRvdGFsIGZpbGUgc2l6ZSwgdXN1YWxseSA8IDAuNiUuCisKKyAgICAvLyBUaGUgZGVmYXVsdCBNSU5fTU9PVl9CT1hfU0laRSBpcyBzZXQgdG8gMC42JSB4IDFNQiAvIDIsCisgICAgLy8gd2hlcmUgMU1CIGlzIHRoZSBjb21tb24gZmlsZSBzaXplIGxpbWl0IGZvciBNTVMgYXBwbGljYXRpb24uCisgICAgLy8gVGhlIGRlZmF1bHQgTUFYIF9NT09WX0JPWF9TSVpFIHZhbHVlIGlzIGJhc2VkIG9uIGFib3V0IDMKKyAgICAvLyBtaW51dGUgdmlkZW8gcmVjb3JkaW5nIHdpdGggYSBiaXQgcmF0ZSBhYm91dCAzIE1icHMsIGJlY2F1c2UKKyAgICAvLyBzdGF0aXN0aWNzIGFsc28gc2hvdyB0aGF0IG1vc3Qgb2YgdGhlIHZpZGVvIGNhcHR1cmVkIGFyZSBnb2luZworICAgIC8vIHRvIGJlIGxlc3MgdGhhbiAzIG1pbnV0ZXMuCisKKyAgICAvLyBJZiB0aGUgZXN0aW1hdGlvbiBpcyB3cm9uZywgd2Ugd2lsbCBwYXkgdGhlIHByaWNlIG9mIHdhc3RpbmcKKyAgICAvLyBzb21lIHJlc2VydmVkIHNwYWNlLiBUaGlzIHNob3VsZCBub3QgaGFwcGVuIHNvIG9mdGVuIHN0YXRpc3RpY2FsbHkuCisgICAgc3RhdGljIGNvbnN0IGludDMyX3QgZmFjdG9yID0gMjsKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBNSU5fQ1VFU19TSVpFID0gMyAqIDEwMjQ7ICAvLyAzIEtCCisgICAgc3RhdGljIGNvbnN0IGludDY0X3QgTUFYX0NVRVNfU0laRSA9ICgxODAgKiAzMDAwMDAwICogNkxMIC8gODAwMCk7CisgICAgaW50NjRfdCBzaXplID0gTUlOX0NVRVNfU0laRTsKKworICAgIC8vIE1heCBmaWxlIHNpemUgbGltaXQgaXMgc2V0CisgICAgaWYgKG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMgIT0gMCAmJiBtSXNGaWxlU2l6ZUxpbWl0RXhwbGljaXRseVJlcXVlc3RlZCkgeworICAgICAgICBzaXplID0gbU1heEZpbGVTaXplTGltaXRCeXRlcyAqIDYgLyAxMDAwOworICAgIH0KKworICAgIC8vIE1heCBmaWxlIGR1cmF0aW9uIGxpbWl0IGlzIHNldAorICAgIGlmIChtTWF4RmlsZUR1cmF0aW9uTGltaXRVcyAhPSAwKSB7CisgICAgICAgIGlmIChiaXRSYXRlID4gMCkgeworICAgICAgICAgICAgaW50NjRfdCBzaXplMiA9ICgobU1heEZpbGVEdXJhdGlvbkxpbWl0VXMgKiBiaXRSYXRlICogNikgLyAxMDAwIC8gODAwMDAwMCk7CisgICAgICAgICAgICBpZiAobU1heEZpbGVTaXplTGltaXRCeXRlcyAhPSAwICYmIG1Jc0ZpbGVTaXplTGltaXRFeHBsaWNpdGx5UmVxdWVzdGVkKSB7CisgICAgICAgICAgICAgICAgLy8gV2hlbiBib3RoIGZpbGUgc2l6ZSBhbmQgZHVyYXRpb24gbGltaXRzIGFyZSBzZXQsCisgICAgICAgICAgICAgICAgLy8gd2UgdXNlIHRoZSBzbWFsbGVyIGxpbWl0IG9mIHRoZSB0d28uCisgICAgICAgICAgICAgICAgaWYgKHNpemUgPiBzaXplMikgeworICAgICAgICAgICAgICAgICAgICBzaXplID0gc2l6ZTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBPbmx5IG1heCBmaWxlIGR1cmF0aW9uIGxpbWl0IGlzIHNldAorICAgICAgICAgICAgICAgIHNpemUgPSBzaXplMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzaXplIDwgTUlOX0NVRVNfU0laRSkgeworICAgICAgICBzaXplID0gTUlOX0NVRVNfU0laRTsKKyAgICB9CisKKyAgICAvLyBBbnkgbG9uZyBkdXJhdGlvbiByZWNvcmRpbmcgd2lsbCBiZSBwcm9iYWJseSBlbmQgdXAgd2l0aAorICAgIC8vIG5vbi1zdHJlYW1hYmxlIHdlYm0gZmlsZS4KKyAgICBpZiAoc2l6ZSA+IE1BWF9DVUVTX1NJWkUpIHsKKyAgICAgICAgc2l6ZSA9IE1BWF9DVUVTX1NJWkU7CisgICAgfQorCisgICAgQUxPR1YoImxpbWl0czogJSIgUFJJZDY0ICIvJSIgUFJJZDY0ICIgYnl0ZXMvdXMsIgorICAgICAgICAgICAgIiBiaXQgcmF0ZTogJWQgYnBzIGFuZCB0aGUgZXN0aW1hdGVkIGN1ZXMgc2l6ZSAlIiBQUklkNjQgIiBieXRlcyIsCisgICAgICAgICAgICBtTWF4RmlsZVNpemVMaW1pdEJ5dGVzLCBtTWF4RmlsZUR1cmF0aW9uTGltaXRVcywgYml0UmF0ZSwgc2l6ZSk7CisgICAgcmV0dXJuIGZhY3RvciAqIHNpemU7Cit9CisKK3ZvaWQgV2VibVdyaXRlcjo6aW5pdFN0cmVhbShzaXplX3QgaWR4KSB7CisgICAgaWYgKG1TdHJlYW1zW2lkeF0ubVRocmVhZCAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKG1TdHJlYW1zW2lkeF0ubVNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dWKCJhZGRpbmcgZHVtbXkgc291cmNlIC4uLiAiKTsKKyAgICAgICAgbVN0cmVhbXNbaWR4XS5tVGhyZWFkID0gbmV3IFdlYm1GcmFtZUVtcHR5U291cmNlVGhyZWFkKAorICAgICAgICAgICAgICAgIG1TdHJlYW1zW2lkeF0ubVR5cGUsIG1TdHJlYW1zW2lkeF0ubVNpbmspOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJhZGRpbmcgc291cmNlICVwIiwgbVN0cmVhbXNbaWR4XS5tU291cmNlLmdldCgpKTsKKyAgICAgICAgbVN0cmVhbXNbaWR4XS5tVGhyZWFkID0gbmV3IFdlYm1GcmFtZU1lZGlhU291cmNlVGhyZWFkKAorICAgICAgICAgICAgICAgIG1TdHJlYW1zW2lkeF0ubVNvdXJjZSwKKyAgICAgICAgICAgICAgICBtU3RyZWFtc1tpZHhdLm1UeXBlLAorICAgICAgICAgICAgICAgIG1TdHJlYW1zW2lkeF0ubVNpbmssCisgICAgICAgICAgICAgICAgbVRpbWVDb2RlU2NhbGUsCisgICAgICAgICAgICAgICAgbVN0YXJ0VGltZXN0YW1wVXMsCisgICAgICAgICAgICAgICAgbVN0YXJ0VGltZU9mZnNldE1zLAorICAgICAgICAgICAgICAgIG51bVRyYWNrcygpLAorICAgICAgICAgICAgICAgIG1Jc1JlYWxUaW1lUmVjb3JkaW5nKTsKKyAgICB9Cit9CisKK3ZvaWQgV2VibVdyaXRlcjo6cmVsZWFzZSgpIHsKKyAgICBjbG9zZShtRmQpOworICAgIG1GZCA9IC0xOworICAgIG1Jbml0Q2hlY2sgPSBOT19JTklUOworICAgIG1TdGFydGVkID0gZmFsc2U7Cit9CisKK3N0YXR1c190IFdlYm1Xcml0ZXI6OnJlc2V0KCkgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgICAgICByZWxlYXNlKCk7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICBpbnQ2NF90IG1heER1cmF0aW9uVXMgPSAwOworICAgIGludDY0X3QgbWluRHVyYXRpb25VcyA9IDB4N2ZmZmZmZmZmZmZmZmZmZkxMOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga01heFN0cmVhbXM7ICsraSkgeworICAgICAgICBpZiAobVN0cmVhbXNbaV0ubVRocmVhZCA9PSBOVUxMKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1TdHJlYW1zW2ldLm1UaHJlYWQtPnN0b3AoKTsKKyAgICAgICAgaWYgKGVyciA9PSBPSyAmJiBzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIGVyciA9IHN0YXR1czsKKyAgICAgICAgfQorCisgICAgICAgIGludDY0X3QgZHVyYXRpb25VcyA9IG1TdHJlYW1zW2ldLm1UaHJlYWQtPmdldER1cmF0aW9uVXMoKTsKKyAgICAgICAgaWYgKGR1cmF0aW9uVXMgPiBtYXhEdXJhdGlvblVzKSB7CisgICAgICAgICAgICBtYXhEdXJhdGlvblVzID0gZHVyYXRpb25VczsKKyAgICAgICAgfQorICAgICAgICBpZiAoZHVyYXRpb25VcyA8IG1pbkR1cmF0aW9uVXMpIHsKKyAgICAgICAgICAgIG1pbkR1cmF0aW9uVXMgPSBkdXJhdGlvblVzOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG51bVRyYWNrcygpID4gMSkgeworICAgICAgICBBTE9HRCgiRHVyYXRpb24gZnJvbSB0cmFja3MgcmFuZ2UgaXMgWyUiIFBSSWQ2NCAiLCAlIiBQUklkNjQgIl0gdXMiLCBtaW5EdXJhdGlvblVzLCBtYXhEdXJhdGlvblVzKTsKKyAgICB9CisKKyAgICBtU2lua1RocmVhZC0+c3RvcCgpOworCisgICAgLy8gRG8gbm90IHdyaXRlIG91dCBtb3ZpZSBoZWFkZXIgb24gZXJyb3IuCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZWxlYXNlKCk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgc3A8V2VibUVsZW1lbnQ+IGN1ZXMgPSBuZXcgV2VibU1hc3RlcihrTWt2Q3VlcywgbUN1ZVBvaW50cyk7CisgICAgdWludDY0X3QgY3Vlc1NpemUgPSBjdWVzLT50b3RhbFNpemUoKTsKKyAgICAvLyBUUklDS1kgRXZlbiB3aGVuIHRoZSBjdWVzIGRvIGZpdCBpbiB0aGUgc3BhY2Ugd2UgcmVzZXJ2ZWQsIGlmIHRoZXkgZG8gbm90IGZpdAorICAgIC8vIHBlcmZlY3RseSwgd2Ugc3RpbGwgbmVlZCB0byBjaGVjayBpZiB0aGVyZSBpcyBlbm91Z2ggImV4dHJhIHNwYWNlIiB0byB3cml0ZSBhbgorICAgIC8vIEVCTUwgdm9pZCBlbGVtZW50LgorICAgIGlmIChjdWVzU2l6ZSAhPSBtRXN0aW1hdGVkQ3Vlc1NpemUgJiYgY3Vlc1NpemUgPiBtRXN0aW1hdGVkQ3Vlc1NpemUgLSBrTWluRWJtbFZvaWRTaXplKSB7CisgICAgICAgIG1DdWVzT2Zmc2V0ID0gOjpsc2VlayhtRmQsIDAsIFNFRUtfQ1VSKTsKKyAgICAgICAgY3Vlcy0+d3JpdGUobUZkLCBjdWVzU2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdWludDY0X3Qgc3BhY2VTaXplOworICAgICAgICA6OmxzZWVrKG1GZCwgbUN1ZXNPZmZzZXQsIFNFRUtfU0VUKTsKKyAgICAgICAgY3Vlcy0+d3JpdGUobUZkLCBjdWVzU2l6ZSk7CisgICAgICAgIHNwPFdlYm1FbGVtZW50PiBzcGFjZSA9IG5ldyBFYm1sVm9pZChtRXN0aW1hdGVkQ3Vlc1NpemUgLSBjdWVzU2l6ZSk7CisgICAgICAgIHNwYWNlLT53cml0ZShtRmQsIHNwYWNlU2l6ZSk7CisgICAgfQorCisgICAgbUN1ZVBvaW50cy5jbGVhcigpOworICAgIG1TdHJlYW1zW2tWaWRlb0luZGV4XS5tU2luay5jbGVhcigpOworICAgIG1TdHJlYW1zW2tBdWRpb0luZGV4XS5tU2luay5jbGVhcigpOworCisgICAgdWludDhfdCBiYXJ5W3NpemVvZih1aW50NjRfdCldOworICAgIHVpbnQ2NF90IHRvdGFsU2l6ZSA9IDo6bHNlZWsobUZkLCAwLCBTRUVLX0VORCk7CisgICAgdWludDY0X3Qgc2VnbWVudFNpemUgPSB0b3RhbFNpemUgLSBtU2VnbWVudERhdGFTdGFydDsKKyAgICA6OmxzZWVrKG1GZCwgbVNlZ21lbnRPZmZzZXQgKyBzaXplT2Yoa01rdlNlZ21lbnQpLCBTRUVLX1NFVCk7CisgICAgdWludDY0X3Qgc2VnbWVudFNpemVDb2RlZCA9IGVuY29kZVVuc2lnbmVkKHNlZ21lbnRTaXplLCBzaXplT2Yoa01rdlVua25vd25MZW5ndGgpKTsKKyAgICBzZXJpYWxpemVDb2RlZFVuc2lnbmVkKHNlZ21lbnRTaXplQ29kZWQsIGJhcnkpOworICAgIDo6d3JpdGUobUZkLCBiYXJ5LCBzaXplT2Yoa01rdlVua25vd25MZW5ndGgpKTsKKworICAgIHVpbnQ2NF90IHNpemU7CisgICAgdWludDY0X3QgZHVyYXRpb25PZmZzZXQgPSBtSW5mb09mZnNldCArIHNpemVPZihrTWt2SW5mbykgKyBzaXplT2YobUluZm9TaXplKQorICAgICAgICArIHNpemVPZihrTWt2U2VnbWVudER1cmF0aW9uKSArIHNpemVPZihzaXplb2YoZG91YmxlKSk7CisgICAgc3A8V2VibUVsZW1lbnQ+IGR1cmF0aW9uID0gbmV3IFdlYm1GbG9hdCgKKyAgICAgICAgICAgIGtNa3ZTZWdtZW50RHVyYXRpb24sCisgICAgICAgICAgICAoZG91YmxlKSAobWF4RHVyYXRpb25VcyAqIDEwMDAgLyBtVGltZUNvZGVTY2FsZSkpOworICAgIGR1cmF0aW9uLT5zZXJpYWxpemVQYXlsb2FkKGJhcnkpOworICAgIDo6bHNlZWsobUZkLCBkdXJhdGlvbk9mZnNldCwgU0VFS19TRVQpOworICAgIDo6d3JpdGUobUZkLCBiYXJ5LCBzaXplb2YoZG91YmxlKSk7CisKKyAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+IHNlZWtFbnRyaWVzOworICAgIHNlZWtFbnRyaWVzLnB1c2hfYmFjayhXZWJtRWxlbWVudDo6U2Vla0VudHJ5KGtNa3ZJbmZvLCBtSW5mb09mZnNldCAtIG1TZWdtZW50RGF0YVN0YXJ0KSk7CisgICAgc2Vla0VudHJpZXMucHVzaF9iYWNrKFdlYm1FbGVtZW50OjpTZWVrRW50cnkoa01rdlRyYWNrcywgbVRyYWNrc09mZnNldCAtIG1TZWdtZW50RGF0YVN0YXJ0KSk7CisgICAgc2Vla0VudHJpZXMucHVzaF9iYWNrKFdlYm1FbGVtZW50OjpTZWVrRW50cnkoa01rdkN1ZXMsIG1DdWVzT2Zmc2V0IC0gbVNlZ21lbnREYXRhU3RhcnQpKTsKKyAgICBzcDxXZWJtRWxlbWVudD4gc2Vla0hlYWQgPSBuZXcgV2VibU1hc3RlcihrTWt2U2Vla0hlYWQsIHNlZWtFbnRyaWVzKTsKKworICAgIHVpbnQ2NF90IG1ldGFTZWVrU2l6ZTsKKyAgICA6OmxzZWVrKG1GZCwgbVNlZ21lbnREYXRhU3RhcnQsIFNFRUtfU0VUKTsKKyAgICBzZWVrSGVhZC0+d3JpdGUobUZkLCBtZXRhU2Vla1NpemUpOworCisgICAgdWludDY0X3Qgc3BhY2VTaXplOworICAgIHNwPFdlYm1FbGVtZW50PiBzcGFjZSA9IG5ldyBFYm1sVm9pZChrTWF4TWV0YVNlZWtTaXplIC0gbWV0YVNlZWtTaXplKTsKKyAgICBzcGFjZS0+d3JpdGUobUZkLCBzcGFjZVNpemUpOworCisgICAgcmVsZWFzZSgpOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IFdlYm1Xcml0ZXI6OmFkZFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgQUxPR0UoIkF0dGVtcHQgdG8gYWRkIHNvdXJjZSBBRlRFUiByZWNvcmRpbmcgaXMgc3RhcnRlZCIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICAvLyBBdCBtb3N0IDIgdHJhY2tzIGNhbiBiZSBzdXBwb3J0ZWQuCisgICAgaWYgKG1TdHJlYW1zW2tWaWRlb0luZGV4XS5tVHJhY2tFbnRyeSAhPSBOVUxMCisgICAgICAgICAgICAmJiBtU3RyZWFtc1trQXVkaW9JbmRleF0ubVRyYWNrRW50cnkgIT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiVG9vIG1hbnkgdHJhY2tzICgyKSB0byBhZGQiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIENIRUNLKHNvdXJjZSAhPSBOVUxMKTsKKworICAgIC8vIEEgdHJhY2sgb2YgdHlwZSBvdGhlciB0aGFuIHZpZGVvIG9yIGF1ZGlvIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICBzb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKTsKKyAgICBjb25zdCBjaGFyICp2cDggPSBNRURJQV9NSU1FVFlQRV9WSURFT19WUDg7CisgICAgY29uc3QgY2hhciAqdm9yYmlzID0gTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTOworCisgICAgc2l6ZV90IHN0cmVhbUluZGV4OworICAgIGlmICghc3RybmNhc2VjbXAobWltZSwgdnA4LCBzdHJsZW4odnA4KSkpIHsKKyAgICAgICAgc3RyZWFtSW5kZXggPSBrVmlkZW9JbmRleDsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCB2b3JiaXMsIHN0cmxlbih2b3JiaXMpKSkgeworICAgICAgICBzdHJlYW1JbmRleCA9IGtBdWRpb0luZGV4OworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJUcmFjayAoJXMpIG90aGVyIHRoYW4gJXMgb3IgJXMgaXMgbm90IHN1cHBvcnRlZCIsIG1pbWUsIHZwOCwgdm9yYmlzKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIC8vIE5vIG1vcmUgdGhhbiBvbmUgdmlkZW8gb3Igb25lIGF1ZGlvIHRyYWNrIGlzIHN1cHBvcnRlZC4KKyAgICBpZiAobVN0cmVhbXNbc3RyZWFtSW5kZXhdLm1UcmFja0VudHJ5ICE9IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzIHRyYWNrIGFscmVhZHkgZXhpc3RzIiwgbVN0cmVhbXNbc3RyZWFtSW5kZXhdLm1OYW1lKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHRyYWNrIG9mIGVpdGhlciBhdWRpbyBvciB2aWRlby4KKyAgICAvLyBHbyBhaGVhZCB0byBhZGQgdGhlIHRyYWNrLgorICAgIG1TdHJlYW1zW3N0cmVhbUluZGV4XS5tU291cmNlID0gc291cmNlOworICAgIG1TdHJlYW1zW3N0cmVhbUluZGV4XS5tVHJhY2tFbnRyeSA9IG1TdHJlYW1zW3N0cmVhbUluZGV4XS5tTWFrZVRyYWNrKHNvdXJjZS0+Z2V0Rm9ybWF0KCkpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBXZWJtV3JpdGVyOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgaWYgKG1TdHJlYW1zW2tWaWRlb0luZGV4XS5tVHJhY2tFbnRyeSA9PSBOVUxMCisgICAgICAgICAgICAmJiBtU3RyZWFtc1trQXVkaW9JbmRleF0ubVRyYWNrRW50cnkgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiTm8gc291cmNlIGFkZGVkIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAobU1heEZpbGVTaXplTGltaXRCeXRlcyAhPSAwKSB7CisgICAgICAgIG1Jc0ZpbGVTaXplTGltaXRFeHBsaWNpdGx5UmVxdWVzdGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAocGFyYW1zKSB7CisgICAgICAgIGludDMyX3QgaXNSZWFsVGltZVJlY29yZGluZzsKKyAgICAgICAgcGFyYW1zLT5maW5kSW50MzIoa0tleVJlYWxUaW1lUmVjb3JkaW5nLCAmaXNSZWFsVGltZVJlY29yZGluZyk7CisgICAgICAgIG1Jc1JlYWxUaW1lUmVjb3JkaW5nID0gaXNSZWFsVGltZVJlY29yZGluZzsKKyAgICB9CisKKyAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgaWYgKG1QYXVzZWQpIHsKKyAgICAgICAgICAgIG1QYXVzZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIG1TdHJlYW1zW2tBdWRpb0luZGV4XS5tVGhyZWFkLT5yZXN1bWUoKTsKKyAgICAgICAgICAgIG1TdHJlYW1zW2tWaWRlb0luZGV4XS5tVGhyZWFkLT5yZXN1bWUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgaWYgKHBhcmFtcykgeworICAgICAgICBpbnQzMl90IHRjc2w7CisgICAgICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMihrS2V5VGltZVNjYWxlLCAmdGNzbCkpIHsKKyAgICAgICAgICAgIG1UaW1lQ29kZVNjYWxlID0gdGNzbDsKKyAgICAgICAgfQorICAgIH0KKyAgICBDSEVDS19HVChtVGltZUNvZGVTY2FsZSwgMCk7CisgICAgQUxPR1YoIm1vdmllIHRpbWUgc2NhbGU6ICUiIFBSSXU2NCwgbVRpbWVDb2RlU2NhbGUpOworCisgICAgLyoKKyAgICAgKiBXaGVuIHRoZSByZXF1ZXN0ZWQgZmlsZSBzaXplIGxpbWl0IGlzIHNtYWxsLCB0aGUgcHJpb3JpdHkKKyAgICAgKiBpcyB0byBtZWV0IHRoZSBmaWxlIHNpemUgbGltaXQgcmVxdWlyZW1lbnQsIHJhdGhlciB0aGFuCisgICAgICogdG8gbWFrZSB0aGUgZmlsZSBzdHJlYW1hYmxlLiBtU3RyZWFtYWJsZUZpbGUgZG9lcyBub3QgdGVsbAorICAgICAqIHdoZXRoZXIgdGhlIGFjdHVhbCByZWNvcmRlZCBmaWxlIGlzIHN0cmVhbWFibGUgb3Igbm90LgorICAgICAqLworICAgIG1TdHJlYW1hYmxlRmlsZSA9ICghbU1heEZpbGVTaXplTGltaXRCeXRlcykKKyAgICAgICAgfHwgKG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMgPj0ga01pblN0cmVhbWFibGVGaWxlU2l6ZUluQnl0ZXMpOworCisgICAgLyoKKyAgICAgKiBXcml0ZSB2YXJpb3VzIG1ldGFkYXRhLgorICAgICAqLworICAgIHNwPFdlYm1FbGVtZW50PiBlYm1sLCBzZWdtZW50LCBpbmZvLCBzZWVrSGVhZCwgdHJhY2tzLCBjdWVzOworICAgIGVibWwgPSBXZWJtRWxlbWVudDo6RWJtbEhlYWRlcigpOworICAgIHNlZ21lbnQgPSBuZXcgV2VibU1hc3RlcihrTWt2U2VnbWVudCk7CisgICAgc2Vla0hlYWQgPSBuZXcgRWJtbFZvaWQoa01heE1ldGFTZWVrU2l6ZSk7CisgICAgaW5mbyA9IFdlYm1FbGVtZW50OjpTZWdtZW50SW5mbyhtVGltZUNvZGVTY2FsZSwgMCk7CisKKyAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+IGNoaWxkcmVuOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heFN0cmVhbXM7ICsraSkgeworICAgICAgICBpZiAobVN0cmVhbXNbaV0ubVRyYWNrRW50cnkgIT0gTlVMTCkgeworICAgICAgICAgICAgY2hpbGRyZW4ucHVzaF9iYWNrKG1TdHJlYW1zW2ldLm1UcmFja0VudHJ5KTsKKyAgICAgICAgfQorICAgIH0KKyAgICB0cmFja3MgPSBuZXcgV2VibU1hc3RlcihrTWt2VHJhY2tzLCBjaGlsZHJlbik7CisKKyAgICBpZiAoIW1TdHJlYW1hYmxlRmlsZSkgeworICAgICAgICBjdWVzID0gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQzMl90IGJpdFJhdGUgPSAtMTsKKyAgICAgICAgaWYgKHBhcmFtcykgeworICAgICAgICAgICAgcGFyYW1zLT5maW5kSW50MzIoa0tleUJpdFJhdGUsICZiaXRSYXRlKTsKKyAgICAgICAgfQorICAgICAgICBtRXN0aW1hdGVkQ3Vlc1NpemUgPSBlc3RpbWF0ZUN1ZXNTaXplKGJpdFJhdGUpOworICAgICAgICBDSEVDS19HRShtRXN0aW1hdGVkQ3Vlc1NpemUsIDgpOworICAgICAgICBjdWVzID0gbmV3IEVibWxWb2lkKG1Fc3RpbWF0ZWRDdWVzU2l6ZSk7CisgICAgfQorCisgICAgc3A8V2VibUVsZW1lbnQ+IGVsZW1zW10gPSB7IGVibWwsIHNlZ21lbnQsIHNlZWtIZWFkLCBpbmZvLCB0cmFja3MsIGN1ZXMgfTsKKyAgICBzaXplX3QgbkVsZW1zID0gc2l6ZW9mKGVsZW1zKSAvIHNpemVvZihlbGVtc1swXSk7CisgICAgdWludDY0X3Qgb2Zmc2V0c1tuRWxlbXNdOworICAgIHVpbnQ2NF90IHNpemVzW25FbGVtc107CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG5FbGVtczsgaSsrKSB7CisgICAgICAgIFdlYm1FbGVtZW50ICplID0gZWxlbXNbaV0uZ2V0KCk7CisgICAgICAgIGlmICghZSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICB1aW50NjRfdCBzaXplOworICAgICAgICBvZmZzZXRzW2ldID0gOjpsc2VlayhtRmQsIDAsIFNFRUtfQ1VSKTsKKyAgICAgICAgc2l6ZXNbaV0gPSBlLT5tU2l6ZTsKKyAgICAgICAgZS0+d3JpdGUobUZkLCBzaXplKTsKKyAgICB9CisKKyAgICBtU2VnbWVudE9mZnNldCA9IG9mZnNldHNbMV07CisgICAgbVNlZ21lbnREYXRhU3RhcnQgPSBvZmZzZXRzWzJdOworICAgIG1JbmZvT2Zmc2V0ID0gb2Zmc2V0c1szXTsKKyAgICBtSW5mb1NpemUgPSBzaXplc1szXTsKKyAgICBtVHJhY2tzT2Zmc2V0ID0gb2Zmc2V0c1s0XTsKKyAgICBtQ3Vlc09mZnNldCA9IG9mZnNldHNbNV07CisKKyAgICAvLyBzdGFydCB0aHJlYWRzCisgICAgaWYgKHBhcmFtcykgeworICAgICAgICBwYXJhbXMtPmZpbmRJbnQ2NChrS2V5VGltZSwgJm1TdGFydFRpbWVzdGFtcFVzKTsKKyAgICB9CisKKyAgICBpbml0U3RyZWFtKGtBdWRpb0luZGV4KTsKKyAgICBpbml0U3RyZWFtKGtWaWRlb0luZGV4KTsKKworICAgIG1TdHJlYW1zW2tBdWRpb0luZGV4XS5tVGhyZWFkLT5zdGFydCgpOworICAgIG1TdHJlYW1zW2tWaWRlb0luZGV4XS5tVGhyZWFkLT5zdGFydCgpOworICAgIG1TaW5rVGhyZWFkLT5zdGFydCgpOworCisgICAgbVN0YXJ0ZWQgPSB0cnVlOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgV2VibVdyaXRlcjo6cGF1c2UoKSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICBtUGF1c2VkID0gdHJ1ZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtNYXhTdHJlYW1zOyArK2kpIHsKKyAgICAgICAgaWYgKG1TdHJlYW1zW2ldLm1UaHJlYWQgPT0gTlVMTCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVN0cmVhbXNbaV0ubVRocmVhZC0+cGF1c2UoKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgZXJyID0gc3RhdHVzOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IFdlYm1Xcml0ZXI6OnN0b3AoKSB7CisgICAgcmV0dXJuIHJlc2V0KCk7Cit9CisKK2Jvb2wgV2VibVdyaXRlcjo6cmVhY2hlZEVPUygpIHsKKyAgICByZXR1cm4gIW1TaW5rVGhyZWFkLT5ydW5uaW5nKCk7Cit9Cit9IC8qIG5hbWVzcGFjZSBhbmRyb2lkICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibVdyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YjY5NjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuaApAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgV0VCTVdSSVRFUl9IXworI2RlZmluZSBXRUJNV1JJVEVSX0hfCisKKyNpbmNsdWRlICJXZWJtQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAiV2VibUZyYW1lVGhyZWFkLmgiCisjaW5jbHVkZSAiTGlua2VkQmxvY2tpbmdRdWV1ZS5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVdyaXRlci5oPgorCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwordXNpbmcgbmFtZXNwYWNlIHdlYm07CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgV2VibVdyaXRlciA6IHB1YmxpYyBNZWRpYVdyaXRlciB7CitwdWJsaWM6CisgICAgV2VibVdyaXRlcihpbnQgZmQpOworICAgIFdlYm1Xcml0ZXIoY29uc3QgY2hhciAqZmlsZW5hbWUpOworICAgIH5XZWJtV3JpdGVyKCkgeyByZXNldCgpOyB9CisKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbSA9IE5VTEwpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKKyAgICB2aXJ0dWFsIGJvb2wgcmVhY2hlZEVPUygpOworCisgICAgdmlydHVhbCB2b2lkIHNldFN0YXJ0VGltZU9mZnNldE1zKGludCBtcykgeyBtU3RhcnRUaW1lT2Zmc2V0TXMgPSBtczsgfQorICAgIHZpcnR1YWwgaW50MzJfdCBnZXRTdGFydFRpbWVPZmZzZXRNcygpIGNvbnN0IHsgcmV0dXJuIG1TdGFydFRpbWVPZmZzZXRNczsgfQorCitwcml2YXRlOgorICAgIGludCBtRmQ7CisgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKKworICAgIHVpbnQ2NF90IG1UaW1lQ29kZVNjYWxlOworICAgIGludDY0X3QgbVN0YXJ0VGltZXN0YW1wVXM7CisgICAgaW50MzJfdCBtU3RhcnRUaW1lT2Zmc2V0TXM7CisKKyAgICB1aW50NjRfdCBtU2VnbWVudE9mZnNldDsKKyAgICB1aW50NjRfdCBtU2VnbWVudERhdGFTdGFydDsKKyAgICB1aW50NjRfdCBtSW5mb09mZnNldDsKKyAgICB1aW50NjRfdCBtSW5mb1NpemU7CisgICAgdWludDY0X3QgbVRyYWNrc09mZnNldDsKKyAgICB1aW50NjRfdCBtQ3Vlc09mZnNldDsKKworICAgIGJvb2wgbVBhdXNlZDsKKyAgICBib29sIG1TdGFydGVkOworICAgIGJvb2wgbUlzRmlsZVNpemVMaW1pdEV4cGxpY2l0bHlSZXF1ZXN0ZWQ7CisgICAgYm9vbCBtSXNSZWFsVGltZVJlY29yZGluZzsKKyAgICBib29sIG1TdHJlYW1hYmxlRmlsZTsKKyAgICB1aW50NjRfdCBtRXN0aW1hdGVkQ3Vlc1NpemU7CisKKyAgICBNdXRleCBtTG9jazsKKyAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+IG1DdWVQb2ludHM7CisKKyAgICBlbnVtIHsKKyAgICAgICAga0F1ZGlvSW5kZXggICAgID0gIDAsCisgICAgICAgIGtWaWRlb0luZGV4ICAgICA9ICAxLAorICAgICAgICBrTWF4U3RyZWFtcyAgICAgPSAgMiwKKyAgICB9OworCisgICAgc3RydWN0IFdlYm1TdHJlYW0geworICAgICAgICBpbnQgbVR5cGU7CisgICAgICAgIGNvbnN0IGNoYXIgKm1OYW1lOworICAgICAgICBzcDxXZWJtRWxlbWVudD4gKCptTWFrZVRyYWNrKShjb25zdCBzcDxNZXRhRGF0YT4mKTsKKworICAgICAgICBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKKyAgICAgICAgc3A8V2VibUVsZW1lbnQ+IG1UcmFja0VudHJ5OworICAgICAgICBzcDxXZWJtRnJhbWVTb3VyY2VUaHJlYWQ+IG1UaHJlYWQ7CisgICAgICAgIExpbmtlZEJsb2NraW5nUXVldWU8Y29uc3Qgc3A8V2VibUZyYW1lPiA+IG1TaW5rOworCisgICAgICAgIFdlYm1TdHJlYW0oKQorICAgICAgICAgICAgOiBtVHlwZShrSW52YWxpZFR5cGUpLAorICAgICAgICAgICAgICBtTmFtZSgiSW52YWxpZCIpLAorICAgICAgICAgICAgICBtTWFrZVRyYWNrKE5VTEwpIHsKKyAgICAgICAgfQorCisgICAgICAgIFdlYm1TdHJlYW0oaW50IHR5cGUsIGNvbnN0IGNoYXIgKm5hbWUsIHNwPFdlYm1FbGVtZW50PiAoKm1ha2VUcmFjaykoY29uc3Qgc3A8TWV0YURhdGE+JikpCisgICAgICAgICAgICA6IG1UeXBlKHR5cGUpLAorICAgICAgICAgICAgICBtTmFtZShuYW1lKSwKKyAgICAgICAgICAgICAgbU1ha2VUcmFjayhtYWtlVHJhY2spIHsKKyAgICAgICAgfQorCisgICAgICAgIFdlYm1TdHJlYW0gJm9wZXJhdG9yPShjb25zdCBXZWJtU3RyZWFtICZvdGhlcikgeworICAgICAgICAgICAgbVR5cGUgPSBvdGhlci5tVHlwZTsKKyAgICAgICAgICAgIG1OYW1lID0gb3RoZXIubU5hbWU7CisgICAgICAgICAgICBtTWFrZVRyYWNrID0gb3RoZXIubU1ha2VUcmFjazsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorICAgIH07CisgICAgV2VibVN0cmVhbSBtU3RyZWFtc1trTWF4U3RyZWFtc107CisKKyAgICBzcDxXZWJtRnJhbWVTaW5rVGhyZWFkPiBtU2lua1RocmVhZDsKKworICAgIHNpemVfdCBudW1UcmFja3MoKTsKKyAgICB1aW50NjRfdCBlc3RpbWF0ZUN1ZXNTaXplKGludDMyX3QgYml0UmF0ZSk7CisgICAgdm9pZCBpbml0U3RyZWFtKHNpemVfdCBpZHgpOworICAgIHZvaWQgcmVsZWFzZSgpOworICAgIHN0YXR1c190IHJlc2V0KCk7CisKKyAgICBzdGF0aWMgc3A8V2VibUVsZW1lbnQ+IHZpZGVvVHJhY2soY29uc3Qgc3A8TWV0YURhdGE+JiBtZCk7CisgICAgc3RhdGljIHNwPFdlYm1FbGVtZW50PiBhdWRpb1RyYWNrKGNvbnN0IHNwPE1ldGFEYXRhPiYgbWQpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoV2VibVdyaXRlcik7Cit9OworCit9IC8qIG5hbWVzcGFjZSBhbmRyb2lkICovCisjZW5kaWYgLyogV0VCTVdSSVRFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3J0cC9SVFBTZW5kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3J0cC9SVFBTZW5kZXIuY3BwCmluZGV4IDE4ODdiOGIuLmU4OGEzYmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9ydHAvUlRQU2VuZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvcnRwL1JUUFNlbmRlci5jcHAKQEAgLTY4NSw5ICs2ODUsOCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgUlRQU2VuZGVyOjpwYXJzZVJlY2VpdmVyUmVwb3J0KGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgLy8gaGV4ZHVtcChkYXRhLCBzaXplKTsKLQorc3RhdHVzX3QgUlRQU2VuZGVyOjpwYXJzZVJlY2VpdmVyUmVwb3J0KAorICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgLyogc2l6ZSAqLykgewogICAgIGZsb2F0IGZyYWN0aW9uTG9zdCA9IGRhdGFbMTJdIC8gMjU2LjBmOwogCiAgICAgQUxPR0koImxvc3QgJS4yZiAlJSBvZiBwYWNrZXRzIGR1cmluZyByZXBvcnQgaW50ZXJ2YWwuIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvQ29udmVydGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvQ29udmVydGVyLmNwcAppbmRleCA3NTNiM2VjLi4yODM0YTY2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL0NvbnZlcnRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9Db252ZXJ0ZXIuY3BwCkBAIC03NCwxOSArNzQsNiBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgUmVsZWFzZU1lZGlhQnVmZmVyUmVmZXJlbmNlKGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KSB7Ci0gICAgdm9pZCAqbWJ1ZjsKLSAgICBpZiAoYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kUG9pbnRlcigibWVkaWFCdWZmZXIiLCAmbWJ1ZikKLSAgICAgICAgICAgICYmIG1idWYgIT0gTlVMTCkgewotICAgICAgICBBTE9HVigicmVsZWFzaW5nIG1idWYgJXAiLCBtYnVmKTsKLQotICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldFBvaW50ZXIoIm1lZGlhQnVmZmVyIiwgTlVMTCk7Ci0KLSAgICAgICAgc3RhdGljX2Nhc3Q8TWVkaWFCdWZmZXIgKj4obWJ1ZiktPnJlbGVhc2UoKTsKLSAgICAgICAgbWJ1ZiA9IE5VTEw7Ci0gICAgfQotfQotCiB2b2lkIENvbnZlcnRlcjo6cmVsZWFzZUVuY29kZXIoKSB7CiAgICAgaWYgKG1FbmNvZGVyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwpAQCAtOTUsMTggKzgyLDcgQEAKICAgICBtRW5jb2Rlci0+cmVsZWFzZSgpOwogICAgIG1FbmNvZGVyLmNsZWFyKCk7CiAKLSAgICB3aGlsZSAoIW1JbnB1dEJ1ZmZlclF1ZXVlLmVtcHR5KCkpIHsKLSAgICAgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9ICptSW5wdXRCdWZmZXJRdWV1ZS5iZWdpbigpOwotICAgICAgICBtSW5wdXRCdWZmZXJRdWV1ZS5lcmFzZShtSW5wdXRCdWZmZXJRdWV1ZS5iZWdpbigpKTsKLQotICAgICAgICBSZWxlYXNlTWVkaWFCdWZmZXJSZWZlcmVuY2UoYWNjZXNzVW5pdCk7Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRW5jb2RlcklucHV0QnVmZmVycy5zaXplKCk7ICsraSkgewotICAgICAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0ID0gbUVuY29kZXJJbnB1dEJ1ZmZlcnMuaXRlbUF0KGkpOwotICAgICAgICBSZWxlYXNlTWVkaWFCdWZmZXJSZWZlcmVuY2UoYWNjZXNzVW5pdCk7Ci0gICAgfQotCisgICAgbUlucHV0QnVmZmVyUXVldWUuY2xlYXIoKTsKICAgICBtRW5jb2RlcklucHV0QnVmZmVycy5jbGVhcigpOwogICAgIG1FbmNvZGVyT3V0cHV0QnVmZmVycy5jbGVhcigpOwogfQpAQCAtMzI4LDcgKzMwNCw3IEBACiAgICAgICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQ7CiAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEJ1ZmZlcigiYWNjZXNzVW5pdCIsICZhY2Nlc3NVbml0KSk7CiAKLSAgICAgICAgICAgICAgICAgICAgUmVsZWFzZU1lZGlhQnVmZmVyUmVmZXJlbmNlKGFjY2Vzc1VuaXQpOworICAgICAgICAgICAgICAgICAgICBhY2Nlc3NVbml0LT5zZXRNZWRpYUJ1ZmZlckJhc2UoTlVMTCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMzUxLDE1ICszMjcsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJkcm9wcGluZyBmcmFtZS4iKTsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIFJlbGVhc2VNZWRpYUJ1ZmZlclJlZmVyZW5jZShhY2Nlc3NVbml0KTsKKyAgICAgICAgICAgICAgICAgICAgYWNjZXNzVW5pdC0+c2V0TWVkaWFCdWZmZXJCYXNlKE5VTEwpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKICNpZiAwCi0gICAgICAgICAgICAgICAgdm9pZCAqbWJ1ZjsKLSAgICAgICAgICAgICAgICBpZiAoYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kUG9pbnRlcigibWVkaWFCdWZmZXIiLCAmbWJ1ZikKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIG1idWYgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIE1lZGlhQnVmZmVyICptYnVmID0KKyAgICAgICAgICAgICAgICAgICAgKE1lZGlhQnVmZmVyICopKGFjY2Vzc1VuaXQtPmdldE1lZGlhQnVmZmVyQmFzZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAobWJ1ZiAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJxdWV1ZWluZyBtYnVmICVwIiwgbWJ1Zik7CisgICAgICAgICAgICAgICAgICAgIG1idWYtPnJlbGVhc2UoKTsKICAgICAgICAgICAgICAgICB9CiAjZW5kaWYKIApAQCAtNjQ3LDEzICs2MjQsMTMgQEAKICAgICAgICAgICAgICAgICAgICBidWZmZXItPmRhdGEoKSwKICAgICAgICAgICAgICAgICAgICBidWZmZXItPnNpemUoKSk7CiAKLSAgICAgICAgICAgIHZvaWQgKm1lZGlhQnVmZmVyOwotICAgICAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kUG9pbnRlcigibWVkaWFCdWZmZXIiLCAmbWVkaWFCdWZmZXIpCi0gICAgICAgICAgICAgICAgICAgICYmIG1lZGlhQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtRW5jb2RlcklucHV0QnVmZmVycy5pdGVtQXQoYnVmZmVySW5kZXgpLT5tZXRhKCkKLSAgICAgICAgICAgICAgICAgICAgLT5zZXRQb2ludGVyKCJtZWRpYUJ1ZmZlciIsIG1lZGlhQnVmZmVyKTsKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyICptZWRpYUJ1ZmZlciA9CisgICAgICAgICAgICAgICAgKE1lZGlhQnVmZmVyICopKGJ1ZmZlci0+Z2V0TWVkaWFCdWZmZXJCYXNlKCkpOworICAgICAgICAgICAgaWYgKG1lZGlhQnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtRW5jb2RlcklucHV0QnVmZmVycy5pdGVtQXQoYnVmZmVySW5kZXgpLT5zZXRNZWRpYUJ1ZmZlckJhc2UoCisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUJ1ZmZlcik7CiAKLSAgICAgICAgICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0UG9pbnRlcigibWVkaWFCdWZmZXIiLCBOVUxMKTsKKyAgICAgICAgICAgICAgICBidWZmZXItPnNldE1lZGlhQnVmZmVyQmFzZShOVUxMKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGZsYWdzID0gTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfRU9TOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9NZWRpYVB1bGxlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL01lZGlhUHVsbGVyLmNwcAppbmRleCA3ZTg4OTFkLi44NmI5MThmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL01lZGlhUHVsbGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL01lZGlhUHVsbGVyLmNwcApAQCAtMTc5LDcgKzE3OSw3IEBACiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgLy8gdmlkZW8gZW5jb2RlciB3aWxsIHJlbGVhc2UgTWVkaWFCdWZmZXIgd2hlbiBkb25lCiAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggdW5kZXJseWluZyBkYXRhLgotICAgICAgICAgICAgICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldFBvaW50ZXIoIm1lZGlhQnVmZmVyIiwgbWJ1Zik7CisgICAgICAgICAgICAgICAgICAgIGFjY2Vzc1VuaXQtPnNldE1lZGlhQnVmZmVyQmFzZShtYnVmKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1BsYXliYWNrU2Vzc2lvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1BsYXliYWNrU2Vzc2lvbi5jcHAKaW5kZXggMjg2ZWExMy4uMmNiNDc4NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9QbGF5YmFja1Nlc3Npb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvUGxheWJhY2tTZXNzaW9uLmNwcApAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPG1lZGlhL0lIRENQLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpAQCAtNzQ5LDcgKzc1MCw4IEBACiAKICAgICBtRXh0cmFjdG9yID0gbmV3IE51TWVkaWFFeHRyYWN0b3I7CiAKLSAgICBzdGF0dXNfdCBlcnIgPSBtRXh0cmFjdG9yLT5zZXREYXRhU291cmNlKG1NZWRpYVBhdGguY19zdHIoKSk7CisgICAgc3RhdHVzX3QgZXJyID0gbUV4dHJhY3Rvci0+c2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgIE5VTEwgLyogaHR0cFNlcnZpY2UgKi8sIG1NZWRpYVBhdGguY19zdHIoKSk7CiAKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBlcnI7CkBAIC0xMDUzLDcgKzEwNTUsNyBAQAogICAgIGVyciA9IHNvdXJjZS0+c2V0TWF4QWNxdWlyZWRCdWZmZXJDb3VudChudW1JbnB1dEJ1ZmZlcnMpOwogICAgIENIRUNLX0VRKGVyciwgKHN0YXR1c190KU9LKTsKIAotICAgIG1CdWZmZXJRdWV1ZSA9IHNvdXJjZS0+Z2V0QnVmZmVyUXVldWUoKTsKKyAgICBtUHJvZHVjZXIgPSBzb3VyY2UtPmdldFByb2R1Y2VyKCk7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0xMDc3LDcgKzEwNzksNyBAQAogfQogCiBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBXaWZpRGlzcGxheVNvdXJjZTo6UGxheWJhY2tTZXNzaW9uOjpnZXRTdXJmYWNlVGV4dHVyZSgpIHsKLSAgICByZXR1cm4gbUJ1ZmZlclF1ZXVlOworICAgIHJldHVybiBtUHJvZHVjZXI7CiB9CiAKIHZvaWQgV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6cmVxdWVzdElEUkZyYW1lKCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9QbGF5YmFja1Nlc3Npb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvUGxheWJhY2tTZXNzaW9uLmgKaW5kZXggNWM4ZWU5NC4uMjgyNDE0MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9QbGF5YmFja1Nlc3Npb24uaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1BsYXliYWNrU2Vzc2lvbi5oCkBAIC0yNSw3ICsyNSw2IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBQnVmZmVyOwotc3RydWN0IEJ1ZmZlclF1ZXVlOwogc3RydWN0IElIRENQOwogc3RydWN0IElHcmFwaGljQnVmZmVyUHJvZHVjZXI7CiBzdHJ1Y3QgTWVkaWFQdWxsZXI7CkBAIC0xMTEsNyArMTEwLDcgQEAKIAogICAgIGludDY0X3QgbUxhc3RMaWZlc2lnblVzOwogCi0gICAgc3A8QnVmZmVyUXVldWU+IG1CdWZmZXJRdWV1ZTsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtUHJvZHVjZXI7CiAKICAgICBLZXllZFZlY3RvcjxzaXplX3QsIHNwPFRyYWNrPiA+IG1UcmFja3M7CiAgICAgc3NpemVfdCBtVmlkZW9UcmFja0luZGV4OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9SZXBlYXRlclNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1JlcGVhdGVyU291cmNlLmNwcAppbmRleCBjYzhkZWUzLi41OWQ3ZTZlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1JlcGVhdGVyU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1JlcGVhdGVyU291cmNlLmNwcApAQCAtNzksNiArNzksOCBAQAogCiAgICAgQUxPR1YoInN0b3BwaW5nIik7CiAKKyAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5zdG9wKCk7CisKICAgICBpZiAobUxvb3BlciAhPSBOVUxMKSB7CiAgICAgICAgIG1Mb29wZXItPnN0b3AoKTsKICAgICAgICAgbUxvb3Blci5jbGVhcigpOwpAQCAtOTIsNyArOTQsNiBAQAogICAgICAgICBtQnVmZmVyID0gTlVMTDsKICAgICB9CiAKLSAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5zdG9wKCk7CiAKICAgICBBTE9HVigic3RvcHBlZCIpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1RTUGFja2V0aXplci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1RTUGFja2V0aXplci5jcHAKaW5kZXggZWViMzcwMC4uNTBkMzE3YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9UU1BhY2tldGl6ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvVFNQYWNrZXRpemVyLmNwcApAQCAtNTY1LDcgKzU2NSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvLyBzaXplX3QgbnVtUGFkZGluZ0J5dGVzID0gc2l6ZUF2YWlsYWJsZUZvclBheWxvYWQgLSBudW1CeXRlc09mUGF5bG9hZDsKKyAgICAgICAgc2l6ZV90IG51bVBhZGRpbmdCeXRlcyA9IHNpemVBdmFpbGFibGVGb3JQYXlsb2FkIC0gbnVtQnl0ZXNPZlBheWxvYWQ7CiAgICAgICAgIEFMT0dWKCJwYWNrZXQgMSBjb250YWlucyAlemQgcGFkZGluZyBieXRlcyBhbmQgJXpkIGJ5dGVzIG9mIHBheWxvYWQiLAogICAgICAgICAgICAgICBudW1QYWRkaW5nQnl0ZXMsIG51bUJ5dGVzT2ZQYXlsb2FkKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9XaWZpRGlzcGxheVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1dpZmlEaXNwbGF5U291cmNlLmNwcAppbmRleCAwNWU0MDE4Li5kYTQwNWUyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1dpZmlEaXNwbGF5U291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1dpZmlEaXNwbGF5U291cmNlLmNwcApAQCAtNzQ2LDcgKzc0Niw3IEBACiB9CiAKIHN0YXR1c190IFdpZmlEaXNwbGF5U291cmNlOjpvblJlY2VpdmVNMVJlc3BvbnNlKAotICAgICAgICBpbnQzMl90IHNlc3Npb25JRCwgY29uc3Qgc3A8UGFyc2VkTWVzc2FnZT4gJm1zZykgeworICAgICAgICBpbnQzMl90IC8qIHNlc3Npb25JRCAqLywgY29uc3Qgc3A8UGFyc2VkTWVzc2FnZT4gJm1zZykgewogICAgIGludDMyX3Qgc3RhdHVzQ29kZTsKICAgICBpZiAoIW1zZy0+Z2V0U3RhdHVzQ29kZSgmc3RhdHVzQ29kZSkpIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKQEAgLTk5MSw3ICs5OTEsNyBAQAogfQogCiBzdGF0dXNfdCBXaWZpRGlzcGxheVNvdXJjZTo6b25SZWNlaXZlTTVSZXNwb25zZSgKLSAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsIGNvbnN0IHNwPFBhcnNlZE1lc3NhZ2U+ICZtc2cpIHsKKyAgICAgICAgaW50MzJfdCAvKiBzZXNzaW9uSUQgKi8sIGNvbnN0IHNwPFBhcnNlZE1lc3NhZ2U+ICZtc2cpIHsKICAgICBpbnQzMl90IHN0YXR1c0NvZGU7CiAgICAgaWYgKCFtc2ctPmdldFN0YXR1c0NvZGUoJnN0YXR1c0NvZGUpKSB7CiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CkBAIC0xMDA1LDcgKzEwMDUsNyBAQAogfQogCiBzdGF0dXNfdCBXaWZpRGlzcGxheVNvdXJjZTo6b25SZWNlaXZlTTE2UmVzcG9uc2UoCi0gICAgICAgIGludDMyX3Qgc2Vzc2lvbklELCBjb25zdCBzcDxQYXJzZWRNZXNzYWdlPiAmbXNnKSB7CisgICAgICAgIGludDMyX3Qgc2Vzc2lvbklELCBjb25zdCBzcDxQYXJzZWRNZXNzYWdlPiAmIC8qIG1zZyAqLykgewogICAgIC8vIElmIG9ubHkgdGhlIHJlc3BvbnNlIHdhcyByZXF1aXJlZCB0byBpbmNsdWRlIGEgIlNlc3Npb246IiBoZWFkZXIuLi4KIAogICAgIENIRUNLX0VRKHNlc3Npb25JRCwgbUNsaWVudFNlc3Npb25JRCk7CkBAIC0xNjgwLDcgKzE2ODAsNyBAQAogfQogCiB2b2lkIFdpZmlEaXNwbGF5U291cmNlOjpIRENQT2JzZXJ2ZXI6Om5vdGlmeSgKLSAgICAgICAgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKm9iaikgeworICAgICAgICBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqIC8qIG9iaiAqLykgewogICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKICAgICBub3RpZnktPnNldEludDMyKCJtc2ciLCBtc2cpOwogICAgIG5vdGlmeS0+c2V0SW50MzIoImV4dDEiLCBleHQxKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveXV2L0FuZHJvaWQubWsKaW5kZXggYjNmN2IxYi4uYmI4NmRmYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveXV2L0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveXV2L0FuZHJvaWQubWsKQEAgLTEyLDUgKzEyLDcgQEAKIExPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X3l1dgogCiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveXV2L1lVVkltYWdlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9ZVVZJbWFnZS5jcHAKaW5kZXggN2I5MDAwYi4uYmIzZTJmZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveXV2L1lVVkltYWdlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC95dXYvWVVWSW1hZ2UuY3BwCkBAIC0yMjYsOCArMjI2LDggQEAKICAgICAgICAgICAgICZ5U3JjT2Zmc2V0SW5jcmVtZW50LCAmdVNyY09mZnNldEluY3JlbWVudCwgJnZTcmNPZmZzZXRJbmNyZW1lbnQpOwogCiAgICAgaW50MzJfdCB5RGVzdE9mZnNldEluY3JlbWVudDsKLSAgICBpbnQzMl90IHVEZXN0T2Zmc2V0SW5jcmVtZW50OwotICAgIGludDMyX3QgdkRlc3RPZmZzZXRJbmNyZW1lbnQ7CisgICAgaW50MzJfdCB1RGVzdE9mZnNldEluY3JlbWVudCA9IDA7CisgICAgaW50MzJfdCB2RGVzdE9mZnNldEluY3JlbWVudCA9IDA7CiAgICAgZGVzdEltYWdlLmdldE9mZnNldEluY3JlbWVudHNQZXJEYXRhUm93KAogICAgICAgICAgICAgJnlEZXN0T2Zmc2V0SW5jcmVtZW50LCAmdURlc3RPZmZzZXRJbmNyZW1lbnQsICZ2RGVzdE9mZnNldEluY3JlbWVudCk7CiAKQEAgLTMwOSw3ICszMDksNyBAQAogCiAgICAgaW50MzJfdCB5RGVzdE9mZnNldEluY3JlbWVudDsKICAgICBpbnQzMl90IHVEZXN0T2Zmc2V0SW5jcmVtZW50OwotICAgIGludDMyX3QgdkRlc3RPZmZzZXRJbmNyZW1lbnQ7CisgICAgaW50MzJfdCB2RGVzdE9mZnNldEluY3JlbWVudCA9IDA7CiAgICAgZGVzdEltYWdlLmdldE9mZnNldEluY3JlbWVudHNQZXJEYXRhUm93KAogICAgICAgICAgICAgJnlEZXN0T2Zmc2V0SW5jcmVtZW50LCAmdURlc3RPZmZzZXRJbmNyZW1lbnQsICZ2RGVzdE9mZnNldEluY3JlbWVudCk7CiAKQEAgLTM5Myw5ICszOTMsOSBAQAogICAgIGZwcmludGYoZnAsICIyNTVcbiIpOwogICAgIGZvciAoaW50MzJfdCB5ID0gMDsgeSA8IG1IZWlnaHQ7ICsreSkgewogICAgICAgICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCBtV2lkdGg7ICsreCkgewotICAgICAgICAgICAgdWludDhfdCB5VmFsdWU7Ci0gICAgICAgICAgICB1aW50OF90IHVWYWx1ZTsKLSAgICAgICAgICAgIHVpbnQ4X3QgdlZhbHVlOworICAgICAgICAgICAgdWludDhfdCB5VmFsdWUgPSAwdTsKKyAgICAgICAgICAgIHVpbnQ4X3QgdVZhbHVlID0gMHU7CisgICAgICAgICAgICB1aW50OF90IHZWYWx1ZSA9IDB1OwogICAgICAgICAgICAgZ2V0UGl4ZWxWYWx1ZSh4LCB5LCAmeVZhbHVlLCAmdVZhbHVlLCAmIHZWYWx1ZSk7CiAKICAgICAgICAgICAgIHVpbnQ4X3QgclZhbHVlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbWVkaWFzZXJ2ZXIvQW5kcm9pZC5tayBiL21lZGlhL21lZGlhc2VydmVyL0FuZHJvaWQubWsKaW5kZXggYjQxN2JhZC4uYjAyMGM5OCAxMDA2NDQKLS0tIGEvbWVkaWEvbWVkaWFzZXJ2ZXIvQW5kcm9pZC5taworKysgYi9tZWRpYS9tZWRpYXNlcnZlci9BbmRyb2lkLm1rCkBAIC0xNSw2ICsxNSw4IEBACiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogCWxpYmF1ZGlvZmxpbmdlciBcCisJbGliYXVkaW9wb2xpY3lzZXJ2aWNlIFwKKwlsaWJjYW1lcmFfbWV0YWRhdGFcCiAJbGliY2FtZXJhc2VydmljZSBcCiAJbGlibWVkaWFsb2dzZXJ2aWNlIFwKIAlsaWJjdXRpbHMgXApAQCAtMjMsNyArMjUsOCBAQAogCWxpYm1lZGlhcGxheWVyc2VydmljZSBcCiAJbGlidXRpbHMgXAogCWxpYmxvZyBcCi0JbGliYmluZGVyCisJbGliYmluZGVyIFwKKwlsaWJzb3VuZHRyaWdnZXJzZXJ2aWNlCiAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAogCWxpYnJlZ2lzdGVybXNleHQKQEAgLTMzLDggKzM2LDEyIEBACiAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYSBcCiAgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9tZWRpYWxvZyBcCiAgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIgXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UKKyAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5IFwKKyAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlIFwKKyAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKKyAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL3NvdW5kdHJpZ2dlcgogCiBMT0NBTF9NT0RVTEU6PSBtZWRpYXNlcnZlcgorTE9DQUxfMzJfQklUX09OTFkgOj0gdHJ1ZQogCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL21lZGlhL21lZGlhc2VydmVyL21haW5fbWVkaWFzZXJ2ZXIuY3BwIGIvbWVkaWEvbWVkaWFzZXJ2ZXIvbWFpbl9tZWRpYXNlcnZlci5jcHAKaW5kZXggZTNmZDRkYi4uYTI4OWZjNyAxMDA2NDQKLS0tIGEvbWVkaWEvbWVkaWFzZXJ2ZXIvbWFpbl9tZWRpYXNlcnZlci5jcHAKKysrIGIvbWVkaWEvbWVkaWFzZXJ2ZXIvbWFpbl9tZWRpYXNlcnZlci5jcHAKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlICJNZWRpYVBsYXllclNlcnZpY2UuaCIKICNpbmNsdWRlICJNZWRpYVV0aWxzLmgiCiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lTZXJ2aWNlLmgiCisjaW5jbHVkZSAiU291bmRUcmlnZ2VySHdTZXJ2aWNlLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCkBAIC0xMzQsNiArMTM1LDcgQEAKICAgICAgICAgTWVkaWFQbGF5ZXJTZXJ2aWNlOjppbnN0YW50aWF0ZSgpOwogICAgICAgICBDYW1lcmFTZXJ2aWNlOjppbnN0YW50aWF0ZSgpOwogICAgICAgICBBdWRpb1BvbGljeVNlcnZpY2U6Omluc3RhbnRpYXRlKCk7CisgICAgICAgIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6aW5zdGFudGlhdGUoKTsKICAgICAgICAgcmVnaXN0ZXJFeHRlbnNpb25zKCk7CiAgICAgICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+am9pblRocmVhZFBvb2woKTsKZGlmZiAtLWdpdCBhL21lZGlhL210cC9BbmRyb2lkLm1rIGIvbWVkaWEvbXRwL0FuZHJvaWQubWsKaW5kZXggYWM2MDhhMS4uM2FmMDk1NiAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbXRwL0FuZHJvaWQubWsKQEAgLTM5LDkgKzM5LDYgQEAKIAogTE9DQUxfQ0ZMQUdTIDo9IC1ETVRQX0RFVklDRSAtRE1UUF9IT1NUCiAKLSMgTmVlZGVkIGZvciA8YmlvbmljX3RpbWUuaD4KLUxPQ0FMX0NfSU5DTFVERVMgOj0gYmlvbmljL2xpYmMvcHJpdmF0ZQotCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYnV0aWxzIGxpYmN1dGlscyBsaWJsb2cgbGlidXNiaG9zdCBsaWJiaW5kZXIKIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERhdGFQYWNrZXQuY3BwIGIvbWVkaWEvbXRwL010cERhdGFQYWNrZXQuY3BwCmluZGV4IGM0Zjg3YTAuLmU2ZTE5ZTMgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBEYXRhUGFja2V0LmNwcAorKysgYi9tZWRpYS9tdHAvTXRwRGF0YVBhY2tldC5jcHAKQEAgLTM2Myw3ICszNjMsNyBAQAogfQogCiBpbnQgTXRwRGF0YVBhY2tldDo6d3JpdGVEYXRhKGludCBmZCwgdm9pZCogZGF0YSwgdWludDMyX3QgbGVuZ3RoKSB7Ci0gICAgYWxsb2NhdGUobGVuZ3RoKTsKKyAgICBhbGxvY2F0ZShsZW5ndGggKyBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFKTsKICAgICBtZW1jcHkobUJ1ZmZlciArIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkUsIGRhdGEsIGxlbmd0aCk7CiAgICAgbGVuZ3RoICs9IE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkU7CiAgICAgTXRwUGFja2V0OjpwdXRVSW50MzIoTVRQX0NPTlRBSU5FUl9MRU5HVEhfT0ZGU0VULCBsZW5ndGgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERldmljZS5jcHAgYi9tZWRpYS9tdHAvTXRwRGV2aWNlLmNwcAppbmRleCBkNjcyZGZmLi5kNmQ1ZGQ1IDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwRGV2aWNlLmNwcAorKysgYi9tZWRpYS9tdHAvTXRwRGV2aWNlLmNwcApAQCAtMTk1LDcgKzE5NSw3IEBACiAKIE10cERldmljZTo6fk10cERldmljZSgpIHsKICAgICBjbG9zZSgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbURldmljZVByb3BlcnRpZXMuc2l6ZSgpOyBpKyspCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRGV2aWNlUHJvcGVydGllcy5zaXplKCk7IGkrKykKICAgICAgICAgZGVsZXRlIG1EZXZpY2VQcm9wZXJ0aWVzW2ldOwogICAgIHVzYl9yZXF1ZXN0X2ZyZWUobVJlcXVlc3RJbjEpOwogICAgIHVzYl9yZXF1ZXN0X2ZyZWUobVJlcXVlc3RJbjIpOwpAQCAtMjUzLDcgKzI1Myw3IEBACiAgICAgICAgICAgICBBTE9HSSgiKioqIEZPUk1BVDogJXNcbiIsIE10cERlYnVnOjpnZXRGb3JtYXRDb2RlTmFtZShmb3JtYXQpKTsKICAgICAgICAgICAgIE10cE9iamVjdFByb3BlcnR5TGlzdCogcHJvcHMgPSBnZXRPYmplY3RQcm9wc1N1cHBvcnRlZChmb3JtYXQpOwogICAgICAgICAgICAgaWYgKHByb3BzKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwcm9wcy0+c2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHByb3BzLT5zaXplKCk7IGorKykgewogICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RQcm9wZXJ0eSBwcm9wID0gKCpwcm9wcylbal07CiAgICAgICAgICAgICAgICAgICAgIE10cFByb3BlcnR5KiBwcm9wZXJ0eSA9IGdldE9iamVjdFByb3BEZXNjKHByb3AsIGZvcm1hdCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFByb3BlcnR5LmNwcCBiL21lZGlhL210cC9NdHBQcm9wZXJ0eS5jcHAKaW5kZXggNjRkZDQ1Yi4uYzUwMDkwMSAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cFByb3BlcnR5LmNwcAorKysgYi9tZWRpYS9tdHAvTXRwUHJvcGVydHkuY3BwCkBAIC0xNiw2ICsxNiw4IEBACiAKICNkZWZpbmUgTE9HX1RBRyAiTXRwUHJvcGVydHkiCiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgogI2luY2x1ZGUgIk10cERhdGFQYWNrZXQuaCIKICNpbmNsdWRlICJNdHBEZWJ1Zy5oIgogI2luY2x1ZGUgIk10cFByb3BlcnR5LmgiCkBAIC0xODksOSArMTkxLDkgQEAKICAgICAgICAgICAgIGlmIChkZXZpY2VQcm9wKQogICAgICAgICAgICAgICAgIHdyaXRlVmFsdWUocGFja2V0LCBtQ3VycmVudFZhbHVlKTsKICAgICB9Ci0gICAgcGFja2V0LnB1dFVJbnQzMihtR3JvdXBDb2RlKTsKICAgICBpZiAoIWRldmljZVByb3ApCi0gICAgICAgIHBhY2tldC5wdXRVSW50OChtRm9ybUZsYWcpOworICAgICAgICBwYWNrZXQucHV0VUludDMyKG1Hcm91cENvZGUpOworICAgIHBhY2tldC5wdXRVSW50OChtRm9ybUZsYWcpOwogICAgIGlmIChtRm9ybUZsYWcgPT0ga0Zvcm1SYW5nZSkgewogICAgICAgICAgICAgd3JpdGVWYWx1ZShwYWNrZXQsIG1NaW5pbXVtVmFsdWUpOwogICAgICAgICAgICAgd3JpdGVWYWx1ZShwYWNrZXQsIG1NYXhpbXVtVmFsdWUpOwpAQCAtMzg1LDEwICszODcsMTAgQEAKICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmRGb3JtYXQoIiVkIiwgdmFsdWUudS51MzIpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UNjQ6Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kRm9ybWF0KCIlbGxkIiwgdmFsdWUudS5pNjQpOworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZEZvcm1hdCgiJSIgUFJJZDY0LCB2YWx1ZS51Lmk2NCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UNjQ6Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kRm9ybWF0KCIlbGxkIiwgdmFsdWUudS51NjQpOworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZEZvcm1hdCgiJSIgUFJJdTY0LCB2YWx1ZS51LnU2NCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQxMjg6CiAgICAgICAgICAgICBidWZmZXIuYXBwZW5kRm9ybWF0KCIlMDhYJTA4WCUwOFglMDhYIiwgdmFsdWUudS5pMTI4WzBdLCB2YWx1ZS51LmkxMjhbMV0sCkBAIC01MTcsOCArNTE5LDE0IEBACiAKIE10cFByb3BlcnR5VmFsdWUqIE10cFByb3BlcnR5OjpyZWFkQXJyYXlWYWx1ZXMoTXRwRGF0YVBhY2tldCYgcGFja2V0LCBpbnQmIGxlbmd0aCkgewogICAgIGxlbmd0aCA9IHBhY2tldC5nZXRVSW50MzIoKTsKLSAgICBpZiAobGVuZ3RoID09IDApCisgICAgLy8gRmFpbCBpZiByZXN1bHRpbmcgYXJyYXkgaXMgb3ZlciAyR0IuICBUaGlzIGlzIGJlY2F1c2UgdGhlIG1heGltdW0gYXJyYXkKKyAgICAvLyBzaXplIG1heSBiZSBsZXNzIHRoYW4gU0laRV9NQVggb24gc29tZSBwbGF0Zm9ybXMuCisgICAgaWYgKCBDQ19VTkxJS0VMWSgKKyAgICAgICAgICAgIGxlbmd0aCA9PSAwIHx8CisgICAgICAgICAgICBsZW5ndGggPj0gSU5UMzJfTUFYIC8gc2l6ZW9mKE10cFByb3BlcnR5VmFsdWUpKSApIHsKKyAgICAgICAgbGVuZ3RoID0gMDsKICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogICAgIE10cFByb3BlcnR5VmFsdWUqIHJlc3VsdCA9IG5ldyBNdHBQcm9wZXJ0eVZhbHVlW2xlbmd0aF07CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKICAgICAgICAgcmVhZFZhbHVlKHBhY2tldCwgcmVzdWx0W2ldKTsKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwIGIvbWVkaWEvbXRwL010cFNlcnZlci5jcHAKaW5kZXggZGY4N2RiNC4uYWE0Mzk2NyAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cFNlcnZlci5jcHAKKysrIGIvbWVkaWEvbXRwL010cFNlcnZlci5jcHAKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8ZGlyZW50Lmg+CkBAIC05Myw2ICs5NCw3IEBACiAgICAgTVRQX0VWRU5UX09CSkVDVF9SRU1PVkVELAogICAgIE1UUF9FVkVOVF9TVE9SRV9BRERFRCwKICAgICBNVFBfRVZFTlRfU1RPUkVfUkVNT1ZFRCwKKyAgICBNVFBfRVZFTlRfREVWSUNFX1BST1BfQ0hBTkdFRCwKIH07CiAKIE10cFNlcnZlcjo6TXRwU2VydmVyKGludCBmZCwgTXRwRGF0YWJhc2UqIGRhdGFiYXNlLCBib29sIHB0cCwKQEAgLTEyNCw3ICsxMjYsNyBAQAogdm9pZCBNdHBTZXJ2ZXI6OnJlbW92ZVN0b3JhZ2UoTXRwU3RvcmFnZSogc3RvcmFnZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOwogCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtU3RvcmFnZXMuc2l6ZSgpOyBpKyspIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TdG9yYWdlcy5zaXplKCk7IGkrKykgewogICAgICAgICBpZiAobVN0b3JhZ2VzW2ldID09IHN0b3JhZ2UpIHsKICAgICAgICAgICAgIG1TdG9yYWdlcy5yZW1vdmVBdChpKTsKICAgICAgICAgICAgIHNlbmRTdG9yZVJlbW92ZWQoc3RvcmFnZS0+Z2V0U3RvcmFnZUlEKCkpOwpAQCAtMTM2LDcgKzEzOCw3IEBACiBNdHBTdG9yYWdlKiBNdHBTZXJ2ZXI6OmdldFN0b3JhZ2UoTXRwU3RvcmFnZUlEIGlkKSB7CiAgICAgaWYgKGlkID09IDApCiAgICAgICAgIHJldHVybiBtU3RvcmFnZXNbMF07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtU3RvcmFnZXMuc2l6ZSgpOyBpKyspIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TdG9yYWdlcy5zaXplKCk7IGkrKykgewogICAgICAgICBNdHBTdG9yYWdlKiBzdG9yYWdlID0gbVN0b3JhZ2VzW2ldOwogICAgICAgICBpZiAoc3RvcmFnZS0+Z2V0U3RvcmFnZUlEKCkgPT0gaWQpCiAgICAgICAgICAgICByZXR1cm4gc3RvcmFnZTsKQEAgLTI2MSw2ICsyNjMsMTEgQEAKICAgICBzZW5kRXZlbnQoTVRQX0VWRU5UX1NUT1JFX1JFTU9WRUQsIGlkKTsKIH0KIAordm9pZCBNdHBTZXJ2ZXI6OnNlbmREZXZpY2VQcm9wZXJ0eUNoYW5nZWQoTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHkpIHsKKyAgICBBTE9HVigic2VuZERldmljZVByb3BlcnR5Q2hhbmdlZCAlZFxuIiwgcHJvcGVydHkpOworICAgIHNlbmRFdmVudChNVFBfRVZFTlRfREVWSUNFX1BST1BfQ0hBTkdFRCwgcHJvcGVydHkpOworfQorCiB2b2lkIE10cFNlcnZlcjo6c2VuZEV2ZW50KE10cEV2ZW50Q29kZSBjb2RlLCB1aW50MzJfdCBwYXJhbTEpIHsKICAgICBpZiAobVNlc3Npb25PcGVuKSB7CiAgICAgICAgIG1FdmVudC5zZXRFdmVudENvZGUoY29kZSk7CkBAIC0zMTgsNiArMzI1LDE0IEBACiAgICAgICAgIG1TZW5kT2JqZWN0SGFuZGxlID0ga0ludmFsaWRPYmplY3RIYW5kbGU7CiAgICAgfQogCisgICAgaW50IGNvbnRhaW5lcnR5cGUgPSBtUmVxdWVzdC5nZXRDb250YWluZXJUeXBlKCk7CisgICAgaWYgKGNvbnRhaW5lcnR5cGUgIT0gTVRQX0NPTlRBSU5FUl9UWVBFX0NPTU1BTkQpIHsKKyAgICAgICAgQUxPR0UoIndyb25nIGNvbnRhaW5lciB0eXBlICVkIiwgY29udGFpbmVydHlwZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBBTE9HVigiZ290IGNvbW1hbmQgJXMgKCV4KSIsIE10cERlYnVnOjpnZXRPcGVyYXRpb25Db2RlTmFtZShvcGVyYXRpb24pLCBvcGVyYXRpb24pOworCiAgICAgc3dpdGNoIChvcGVyYXRpb24pIHsKICAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfSU5GTzoKICAgICAgICAgICAgIHJlc3BvbnNlID0gZG9HZXREZXZpY2VJbmZvKCk7CkBAIC00MDgsNyArNDIzLDggQEAKICAgICAgICAgICAgIHJlc3BvbnNlID0gZG9FbmRFZGl0T2JqZWN0KCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dFKCJnb3QgdW5zdXBwb3J0ZWQgY29tbWFuZCAlcyIsIE10cERlYnVnOjpnZXRPcGVyYXRpb25Db2RlTmFtZShvcGVyYXRpb24pKTsKKyAgICAgICAgICAgIEFMT0dFKCJnb3QgdW5zdXBwb3J0ZWQgY29tbWFuZCAlcyAoJXgpIiwKKyAgICAgICAgICAgICAgICAgICAgTXRwRGVidWc6OmdldE9wZXJhdGlvbkNvZGVOYW1lKG9wZXJhdGlvbiksIG9wZXJhdGlvbik7CiAgICAgICAgICAgICByZXNwb25zZSA9IE1UUF9SRVNQT05TRV9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRDsKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KQEAgLTc4Niw3ICs4MDIsNyBAQAogICAgIGludCByZXN1bHQgPSBtRGF0YWJhc2UtPmdldE9iamVjdEZpbGVQYXRoKGhhbmRsZSwgcGF0aEJ1ZiwgZmlsZUxlbmd0aCwgZm9ybWF0KTsKICAgICBpZiAocmVzdWx0ICE9IE1UUF9SRVNQT05TRV9PSykKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICBpZiAob2Zmc2V0ICsgbGVuZ3RoID4gZmlsZUxlbmd0aCkKKyAgICBpZiAob2Zmc2V0ICsgbGVuZ3RoID4gKHVpbnQ2NF90KWZpbGVMZW5ndGgpCiAgICAgICAgIGxlbmd0aCA9IGZpbGVMZW5ndGggLSBvZmZzZXQ7CiAKICAgICBjb25zdCBjaGFyKiBmaWxlUGF0aCA9IChjb25zdCBjaGFyICopcGF0aEJ1ZjsKQEAgLTk0MywyMiArOTU5LDI4IEBACiAgICAgZmNobW9kKG1mci5mZCwgbUZpbGVQZXJtaXNzaW9uKTsKICAgICB1bWFzayhtYXNrKTsKIAotICAgIGlmIChpbml0aWFsRGF0YSA+IDApCisgICAgaWYgKGluaXRpYWxEYXRhID4gMCkgewogICAgICAgICByZXQgPSB3cml0ZShtZnIuZmQsIG1EYXRhLmdldERhdGEoKSwgaW5pdGlhbERhdGEpOworICAgIH0KIAotICAgIGlmIChtU2VuZE9iamVjdEZpbGVTaXplIC0gaW5pdGlhbERhdGEgPiAwKSB7Ci0gICAgICAgIG1mci5vZmZzZXQgPSBpbml0aWFsRGF0YTsKLSAgICAgICAgaWYgKG1TZW5kT2JqZWN0RmlsZVNpemUgPT0gMHhGRkZGRkZGRikgewotICAgICAgICAgICAgLy8gdGVsbCBkcml2ZXIgdG8gcmVhZCB1bnRpbCBpdCByZWNlaXZlcyBhIHNob3J0IHBhY2tldAotICAgICAgICAgICAgbWZyLmxlbmd0aCA9IDB4RkZGRkZGRkY7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtZnIubGVuZ3RoID0gbVNlbmRPYmplY3RGaWxlU2l6ZSAtIGluaXRpYWxEYXRhOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gd3JpdGUgaW5pdGlhbCBkYXRhIik7CisgICAgICAgIHJlc3VsdCA9IE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtU2VuZE9iamVjdEZpbGVTaXplIC0gaW5pdGlhbERhdGEgPiAwKSB7CisgICAgICAgICAgICBtZnIub2Zmc2V0ID0gaW5pdGlhbERhdGE7CisgICAgICAgICAgICBpZiAobVNlbmRPYmplY3RGaWxlU2l6ZSA9PSAweEZGRkZGRkZGKSB7CisgICAgICAgICAgICAgICAgLy8gdGVsbCBkcml2ZXIgdG8gcmVhZCB1bnRpbCBpdCByZWNlaXZlcyBhIHNob3J0IHBhY2tldAorICAgICAgICAgICAgICAgIG1mci5sZW5ndGggPSAweEZGRkZGRkZGOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtZnIubGVuZ3RoID0gbVNlbmRPYmplY3RGaWxlU2l6ZSAtIGluaXRpYWxEYXRhOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBTE9HVigicmVjZWl2aW5nICVzXG4iLCAoY29uc3QgY2hhciAqKW1TZW5kT2JqZWN0RmlsZVBhdGgpOworICAgICAgICAgICAgLy8gdHJhbnNmZXIgdGhlIGZpbGUKKyAgICAgICAgICAgIHJldCA9IGlvY3RsKG1GRCwgTVRQX1JFQ0VJVkVfRklMRSwgKHVuc2lnbmVkIGxvbmcpJm1mcik7CisgICAgICAgICAgICBBTE9HVigiTVRQX1JFQ0VJVkVfRklMRSByZXR1cm5lZCAlZFxuIiwgcmV0KTsKICAgICAgICAgfQotCi0gICAgICAgIEFMT0dWKCJyZWNlaXZpbmcgJXNcbiIsIChjb25zdCBjaGFyICopbVNlbmRPYmplY3RGaWxlUGF0aCk7Ci0gICAgICAgIC8vIHRyYW5zZmVyIHRoZSBmaWxlCi0gICAgICAgIHJldCA9IGlvY3RsKG1GRCwgTVRQX1JFQ0VJVkVfRklMRSwgKHVuc2lnbmVkIGxvbmcpJm1mcik7Ci0gICAgICAgIEFMT0dWKCJNVFBfUkVDRUlWRV9GSUxFIHJldHVybmVkICVkXG4iLCByZXQpOwogICAgIH0KICAgICBjbG9zZShtZnIuZmQpOwogCkBAIC05ODMsNyArMTAwNSw3IEBACiAKIHN0YXRpYyB2b2lkIGRlbGV0ZVJlY3Vyc2l2ZShjb25zdCBjaGFyKiBwYXRoKSB7CiAgICAgY2hhciBwYXRoYnVmW1BBVEhfTUFYXTsKLSAgICBpbnQgcGF0aExlbmd0aCA9IHN0cmxlbihwYXRoKTsKKyAgICBzaXplX3QgcGF0aExlbmd0aCA9IHN0cmxlbihwYXRoKTsKICAgICBpZiAocGF0aExlbmd0aCA+PSBzaXplb2YocGF0aGJ1ZikgLSAxKSB7CiAgICAgICAgIEFMT0dFKCJwYXRoIHRvbyBsb25nOiAlc1xuIiwgcGF0aCk7CiAgICAgfQpAQCAtMTEwNSwxMiArMTEyNywxMyBAQAogCiAgICAgLy8gY2FuJ3Qgc3RhcnQgd3JpdGluZyBwYXN0IHRoZSBlbmQgb2YgdGhlIGZpbGUKICAgICBpZiAob2Zmc2V0ID4gZWRpdC0+bVNpemUpIHsKLSAgICAgICAgQUxPR0QoIndyaXRpbmcgcGFzdCBlbmQgb2Ygb2JqZWN0LCBvZmZzZXQ6ICVsbGQsIGVkaXQtPm1TaXplOiAlbGxkIiwgb2Zmc2V0LCBlZGl0LT5tU2l6ZSk7CisgICAgICAgIEFMT0dEKCJ3cml0aW5nIHBhc3QgZW5kIG9mIG9iamVjdCwgb2Zmc2V0OiAlIiBQUkl1NjQgIiwgZWRpdC0+bVNpemU6ICUiIFBSSXU2NCwKKyAgICAgICAgICAgIG9mZnNldCwgZWRpdC0+bVNpemUpOwogICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1I7CiAgICAgfQogCiAgICAgY29uc3QgY2hhciogZmlsZVBhdGggPSAoY29uc3QgY2hhciAqKWVkaXQtPm1QYXRoOwotICAgIEFMT0dWKCJyZWNlaXZpbmcgcGFydGlhbCAlcyAlbGxkICVsbGRcbiIsIGZpbGVQYXRoLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgQUxPR1YoInJlY2VpdmluZyBwYXJ0aWFsICVzICUiIFBSSXU2NCAiICUiIFBSSXUzMiwgZmlsZVBhdGgsIG9mZnNldCwgbGVuZ3RoKTsKIAogICAgIC8vIHJlYWQgdGhlIGhlYWRlciwgYW5kIHBvc3NpYmx5IHNvbWUgZGF0YQogICAgIGludCByZXQgPSBtRGF0YS5yZWFkKG1GRCk7CkBAIC0xMTI0LDE1ICsxMTQ3LDE5IEBACiAgICAgICAgIGxlbmd0aCAtPSBpbml0aWFsRGF0YTsKICAgICB9CiAKLSAgICBpZiAobGVuZ3RoID4gMCkgewotICAgICAgICBtdHBfZmlsZV9yYW5nZSAgbWZyOwotICAgICAgICBtZnIuZmQgPSBlZGl0LT5tRkQ7Ci0gICAgICAgIG1mci5vZmZzZXQgPSBvZmZzZXQ7Ci0gICAgICAgIG1mci5sZW5ndGggPSBsZW5ndGg7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byB3cml0ZSBpbml0aWFsIGRhdGEiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobGVuZ3RoID4gMCkgeworICAgICAgICAgICAgbXRwX2ZpbGVfcmFuZ2UgIG1mcjsKKyAgICAgICAgICAgIG1mci5mZCA9IGVkaXQtPm1GRDsKKyAgICAgICAgICAgIG1mci5vZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgICAgICBtZnIubGVuZ3RoID0gbGVuZ3RoOwogCi0gICAgICAgIC8vIHRyYW5zZmVyIHRoZSBmaWxlCi0gICAgICAgIHJldCA9IGlvY3RsKG1GRCwgTVRQX1JFQ0VJVkVfRklMRSwgKHVuc2lnbmVkIGxvbmcpJm1mcik7Ci0gICAgICAgIEFMT0dWKCJNVFBfUkVDRUlWRV9GSUxFIHJldHVybmVkICVkIiwgcmV0KTsKKyAgICAgICAgICAgIC8vIHRyYW5zZmVyIHRoZSBmaWxlCisgICAgICAgICAgICByZXQgPSBpb2N0bChtRkQsIE1UUF9SRUNFSVZFX0ZJTEUsICh1bnNpZ25lZCBsb25nKSZtZnIpOworICAgICAgICAgICAgQUxPR1YoIk1UUF9SRUNFSVZFX0ZJTEUgcmV0dXJuZWQgJWQiLCByZXQpOworICAgICAgICB9CiAgICAgfQogICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgIG1SZXNwb25zZS5zZXRQYXJhbWV0ZXIoMSwgMCk7CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU2VydmVyLmggYi9tZWRpYS9tdHAvTXRwU2VydmVyLmgKaW5kZXggZGZhODI1OC4uYjNhMTFlMCAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cFNlcnZlci5oCisrKyBiL21lZGlhL210cC9NdHBTZXJ2ZXIuaApAQCAtMTA0LDYgKzEwNCw3IEBACiAKICAgICB2b2lkICAgICAgICAgICAgICAgIHNlbmRPYmplY3RBZGRlZChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKICAgICB2b2lkICAgICAgICAgICAgICAgIHNlbmRPYmplY3RSZW1vdmVkKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgc2VuZERldmljZVByb3BlcnR5Q2hhbmdlZChNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSk7CiAKIHByaXZhdGU6CiAgICAgdm9pZCAgICAgICAgICAgICAgICBzZW5kU3RvcmVBZGRlZChNdHBTdG9yYWdlSUQgaWQpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFN0b3JhZ2VJbmZvLmNwcCBiL21lZGlhL210cC9NdHBTdG9yYWdlSW5mby5jcHAKaW5kZXggZGNkMzdjZC4uMmIxYTlhZSAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cFN0b3JhZ2VJbmZvLmNwcAorKysgYi9tZWRpYS9tdHAvTXRwU3RvcmFnZUluZm8uY3BwCkBAIC0xNiw2ICsxNiw4IEBACiAKICNkZWZpbmUgTE9HX1RBRyAiTXRwU3RvcmFnZUluZm8iCiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAjaW5jbHVkZSAiTXRwRGVidWcuaCIKICNpbmNsdWRlICJNdHBEYXRhUGFja2V0LmgiCiAjaW5jbHVkZSAiTXRwU3RvcmFnZUluZm8uaCIKQEAgLTYzLDcgKzY1LDcgQEAKIHZvaWQgTXRwU3RvcmFnZUluZm86OnByaW50KCkgewogICAgIEFMT0dEKCJTdG9yYWdlIEluZm8gJTA4WDpcblx0bVN0b3JhZ2VUeXBlOiAlZFxuXHRtRmlsZVN5c3RlbVR5cGU6ICVkXG5cdG1BY2Nlc3NDYXBhYmlsaXR5OiAlZFxuIiwKICAgICAgICAgICAgIG1TdG9yYWdlSUQsIG1TdG9yYWdlVHlwZSwgbUZpbGVTeXN0ZW1UeXBlLCBtQWNjZXNzQ2FwYWJpbGl0eSk7Ci0gICAgQUxPR0QoIlx0bU1heENhcGFjaXR5OiAlbGxkXG5cdG1GcmVlU3BhY2VCeXRlczogJWxsZFxuXHRtRnJlZVNwYWNlT2JqZWN0czogJWRcbiIsCisgICAgQUxPR0QoIlx0bU1heENhcGFjaXR5OiAlIiBQUkl1NjQgIlxuXHRtRnJlZVNwYWNlQnl0ZXM6ICUiIFBSSXU2NCAiXG5cdG1GcmVlU3BhY2VPYmplY3RzOiAlZFxuIiwKICAgICAgICAgICAgIG1NYXhDYXBhY2l0eSwgbUZyZWVTcGFjZUJ5dGVzLCBtRnJlZVNwYWNlT2JqZWN0cyk7CiAgICAgQUxPR0QoIlx0bVN0b3JhZ2VEZXNjcmlwdGlvbjogJXNcblx0bVZvbHVtZUlkZW50aWZpZXI6ICVzXG4iLAogICAgICAgICAgICAgbVN0b3JhZ2VEZXNjcmlwdGlvbiwgbVZvbHVtZUlkZW50aWZpZXIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFV0aWxzLmNwcCBiL21lZGlhL210cC9NdHBVdGlscy5jcHAKaW5kZXggNmVjODg3Ni4uMDY2N2JkZCAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cFV0aWxzLmNwcAorKysgYi9tZWRpYS9tdHAvTXRwVXRpbHMuY3BwCkBAIC0xOSw3ICsxOSw4IEBACiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDx0aW1lLmg+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+cHJlc2VudGF0aW9uVGltZVVzLCBpbmZvLT5mbGFncykpOworfQorCisKK30gLy8gZXh0ZXJuICJDIgorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rCmluZGV4IDU0Mzc3ZjEuLjY5N2ZiMzcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rCkBAIC0xMywyNSArMTMsMzMgQEAKIAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgU2VydmljZVV0aWxpdGllcy5jcHAKKworIyBGSVhNRSBNb3ZlIHRoaXMgbGlicmFyeSB0byBmcmFtZXdvcmtzL25hdGl2ZQorTE9DQUxfTU9EVUxFIDo9IGxpYnNlcnZpY2V1dGlsaXR5CisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKIExPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgXAogICAgIEF1ZGlvRmxpbmdlci5jcHAgICAgICAgICAgICBcCiAgICAgVGhyZWFkcy5jcHAgICAgICAgICAgICAgICAgIFwKICAgICBUcmFja3MuY3BwICAgICAgICAgICAgICAgICAgXAogICAgIEVmZmVjdHMuY3BwICAgICAgICAgICAgICAgICBcCiAgICAgQXVkaW9NaXhlci5jcHAuYXJtICAgICAgICAgIFwKLSAgICBBdWRpb1Jlc2FtcGxlci5jcHAuYXJtICAgICAgXAotICAgIEF1ZGlvUG9saWN5U2VydmljZS5jcHAgICAgICBcCi0gICAgU2VydmljZVV0aWxpdGllcy5jcHAgICAgICAgIFwKLSAgICBBdWRpb1Jlc2FtcGxlckN1YmljLmNwcC5hcm0gXAotICAgIEF1ZGlvUmVzYW1wbGVyU2luYy5jcHAuYXJtCisgICAgUGF0Y2hQYW5lbC5jcHAKIAogTE9DQUxfU1JDX0ZJTEVTICs9IFN0YXRlUXVldWUuY3BwCiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgICQoVE9QRElSKWZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kgXAogICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby1lZmZlY3RzKSBcCiAgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKQogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhdWRpb3Jlc2FtcGxlciBcCiAgICAgbGliYXVkaW91dGlscyBcCiAgICAgbGliY29tbW9uX3RpbWVfY2xpZW50IFwKICAgICBsaWJjdXRpbHMgXApAQCAtNDMsMTcgKzUxLDIwIEBACiAgICAgbGliaGFyZHdhcmUgXAogICAgIGxpYmhhcmR3YXJlX2xlZ2FjeSBcCiAgICAgbGliZWZmZWN0cyBcCi0gICAgbGliZGwgXAogICAgIGxpYnBvd2VybWFuYWdlcgogCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKICAgICBsaWJzY2hlZHVsaW5nX3BvbGljeSBcCiAgICAgbGliY3B1c3RhdHMgXAotICAgIGxpYm1lZGlhX2hlbHBlcgorICAgIGxpYm1lZGlhX2hlbHBlciBcCisgICAgbGlic2VydmljZXV0aWxpdHkKIAogTE9DQUxfTU9EVUxFOj0gbGliYXVkaW9mbGluZ2VyCitMT0NBTF8zMl9CSVRfT05MWSA6PSB0cnVlCiAKIExPQ0FMX1NSQ19GSUxFUyArPSBGYXN0TWl4ZXIuY3BwIEZhc3RNaXhlclN0YXRlLmNwcCBBdWRpb1dhdGNoZG9nLmNwcAorTE9DQUxfU1JDX0ZJTEVTICs9IEZhc3RUaHJlYWQuY3BwIEZhc3RUaHJlYWRTdGF0ZS5jcHAKK0xPQ0FMX1NSQ19GSUxFUyArPSBGYXN0Q2FwdHVyZS5jcHAgRmFzdENhcHR1cmVTdGF0ZS5jcHAKIAogTE9DQUxfQ0ZMQUdTICs9IC1EU1RBVEVfUVVFVUVfSU5TVEFOVElBVElPTlM9JyJTdGF0ZVF1ZXVlSW5zdGFudGlhdGlvbnMuY3BwIicKIApAQCAtNzQsMTIgKzg1LDE3IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgICAgICBcCi0JdGVzdC1yZXNhbXBsZS5jcHAgCQkJXAotICAgIEF1ZGlvUmVzYW1wbGVyLmNwcC5hcm0gICAgICBcCi0JQXVkaW9SZXNhbXBsZXJDdWJpYy5jcHAuYXJtIFwKLSAgICBBdWRpb1Jlc2FtcGxlclNpbmMuY3BwLmFybQorICAgIHRlc3QtcmVzYW1wbGUuY3BwICAgICAgICAgICBcCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCisgICAgbGlic25kZmlsZQogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhdWRpb3Jlc2FtcGxlciBcCisgICAgbGliYXVkaW91dGlscyBcCiAgICAgbGliZGwgXAogICAgIGxpYmN1dGlscyBcCiAgICAgbGlidXRpbHMgXApAQCAtOTEsNCArMTA3LDI0IEBACiAKIGluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQogCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorICAgIEF1ZGlvUmVzYW1wbGVyLmNwcC5hcm0gXAorICAgIEF1ZGlvUmVzYW1wbGVyQ3ViaWMuY3BwLmFybSBcCisgICAgQXVkaW9SZXNhbXBsZXJTaW5jLmNwcC5hcm0gXAorICAgIEF1ZGlvUmVzYW1wbGVyRHluLmNwcC5hcm0KKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJjdXRpbHMgXAorICAgIGxpYmRsIFwKKyAgICBsaWJsb2cKKworTE9DQUxfTU9EVUxFIDo9IGxpYmF1ZGlvcmVzYW1wbGVyCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKwogaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAppbmRleCAwYWVmNTNmLi40MTNlYzNlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcApAQCAtODIsNiArODIsNyBAQAogCiBzdGF0aWMgY29uc3QgY2hhciBrRGVhZGxvY2tlZFN0cmluZ1tdID0gIkF1ZGlvRmxpbmdlciBtYXkgYmUgZGVhZGxvY2tlZFxuIjsKIHN0YXRpYyBjb25zdCBjaGFyIGtIYXJkd2FyZUxvY2tlZFN0cmluZ1tdID0gIkhhcmR3YXJlIGxvY2sgaXMgdGFrZW5cbiI7CitzdGF0aWMgY29uc3QgY2hhciBrQ2xpZW50TG9ja2VkU3RyaW5nW10gPSAiQ2xpZW50IGxvY2sgaXMgdGFrZW5cbiI7CiAKIAogbnNlY3NfdCBBdWRpb0ZsaW5nZXI6Om1TdGFuZGJ5VGltZUluTnNlY3MgPSBrRGVmYXVsdFN0YW5kYnlUaW1lSW5Oc2VjczsKQEAgLTEwNCw2ICsxMDUsMzYgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCitjb25zdCBjaGFyICpmb3JtYXRUb1N0cmluZyhhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKKyAgICBzd2l0Y2ggKGZvcm1hdCAmIEFVRElPX0ZPUk1BVF9NQUlOX01BU0spIHsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ006CisgICAgICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6IHJldHVybiAicGNtMTYiOworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQ6IHJldHVybiAicGNtOCI7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8zMl9CSVQ6IHJldHVybiAicGNtMzIiOworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fOF8yNF9CSVQ6IHJldHVybiAicGNtOC4yNCI7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDogcmV0dXJuICJwY21mbG9hdCI7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEOiByZXR1cm4gInBjbTI0IjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fRk9STUFUX01QMzogcmV0dXJuICJtcDMiOworICAgIGNhc2UgQVVESU9fRk9STUFUX0FNUl9OQjogcmV0dXJuICJhbXItbmIiOworICAgIGNhc2UgQVVESU9fRk9STUFUX0FNUl9XQjogcmV0dXJuICJhbXItd2IiOworICAgIGNhc2UgQVVESU9fRk9STUFUX0FBQzogcmV0dXJuICJhYWMiOworICAgIGNhc2UgQVVESU9fRk9STUFUX0hFX0FBQ19WMTogcmV0dXJuICJoZS1hYWMtdjEiOworICAgIGNhc2UgQVVESU9fRk9STUFUX0hFX0FBQ19WMjogcmV0dXJuICJoZS1hYWMtdjIiOworICAgIGNhc2UgQVVESU9fRk9STUFUX1ZPUkJJUzogcmV0dXJuICJ2b3JiaXMiOworICAgIGNhc2UgQVVESU9fRk9STUFUX09QVVM6IHJldHVybiAib3B1cyI7CisgICAgY2FzZSBBVURJT19GT1JNQVRfQUMzOiByZXR1cm4gImFjLTMiOworICAgIGNhc2UgQVVESU9fRk9STUFUX0VfQUMzOiByZXR1cm4gImUtYWMtMyI7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAidW5rbm93biI7Cit9CisKIHN0YXRpYyBpbnQgbG9hZF9hdWRpb19pbnRlcmZhY2UoY29uc3QgY2hhciAqaWZfbmFtZSwgYXVkaW9faHdfZGV2aWNlX3QgKipkZXYpCiB7CiAgICAgY29uc3QgaHdfbW9kdWxlX3QgKm1vZDsKQEAgLTEyMSw3ICsxNTIsNyBAQAogICAgIGlmIChyYykgewogICAgICAgICBnb3RvIG91dDsKICAgICB9Ci0gICAgaWYgKCgqZGV2KS0+Y29tbW9uLnZlcnNpb24gIT0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OX0NVUlJFTlQpIHsKKyAgICBpZiAoKCpkZXYpLT5jb21tb24udmVyc2lvbiA8IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl9NSU4pIHsKICAgICAgICAgQUxPR0UoIiVzIHdyb25nIGF1ZGlvIGh3IGRldmljZSB2ZXJzaW9uICUwNHgiLCBfX2Z1bmNfXywgKCpkZXYpLT5jb21tb24udmVyc2lvbik7CiAgICAgICAgIHJjID0gQkFEX1ZBTFVFOwogICAgICAgICBnb3RvIG91dDsKQEAgLTEzOCw2ICsxNjksNyBAQAogQXVkaW9GbGluZ2VyOjpBdWRpb0ZsaW5nZXIoKQogICAgIDogQm5BdWRpb0ZsaW5nZXIoKSwKICAgICAgIG1QcmltYXJ5SGFyZHdhcmVEZXYoTlVMTCksCisgICAgICBtQXVkaW9Id0RldnMoTlVMTCksCiAgICAgICBtSGFyZHdhcmVTdGF0dXMoQVVESU9fSFdfSURMRSksCiAgICAgICBtTWFzdGVyVm9sdW1lKDEuMGYpLAogICAgICAgbU1hc3Rlck11dGUoZmFsc2UpLApAQCAtMTQ2LDE0ICsxNzgsMTYgQEAKICAgICAgIG1CdE5yZWNJc09mZihmYWxzZSksCiAgICAgICBtSXNMb3dSYW1EZXZpY2UodHJ1ZSksCiAgICAgICBtSXNEZXZpY2VUeXBlS25vd24oZmFsc2UpLAotICAgICAgbUdsb2JhbEVmZmVjdEVuYWJsZVRpbWUoMCkKKyAgICAgIG1HbG9iYWxFZmZlY3RFbmFibGVUaW1lKDApLAorICAgICAgbVByaW1hcnlPdXRwdXRTYW1wbGVSYXRlKDApCiB7CiAgICAgZ2V0cGlkX2NhY2hlZCA9IGdldHBpZCgpOwogICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKICAgICBib29sIGRvTG9nID0gKHByb3BlcnR5X2dldCgicm8udGVzdF9oYXJuZXNzIiwgdmFsdWUsICIwIikgPiAwKSAmJiAoYXRvaSh2YWx1ZSkgPT0gMSk7CiAgICAgaWYgKGRvTG9nKSB7Ci0gICAgICAgIG1Mb2dNZW1vcnlEZWFsZXIgPSBuZXcgTWVtb3J5RGVhbGVyKGtMb2dNZW1vcnlTaXplLCAiTG9nV3JpdGVycyIpOworICAgICAgICBtTG9nTWVtb3J5RGVhbGVyID0gbmV3IE1lbW9yeURlYWxlcihrTG9nTWVtb3J5U2l6ZSwgIkxvZ1dyaXRlcnMiLCBNZW1vcnlIZWFwQmFzZTo6UkVBRF9PTkxZKTsKICAgICB9CisKICNpZmRlZiBURUVfU0lOSwogICAgICh2b2lkKSBwcm9wZXJ0eV9nZXQoInJvLmRlYnVnZ2FibGUiLCB2YWx1ZSwgIjAiKTsKICAgICBpbnQgZGVidWdnYWJsZSA9IGF0b2kodmFsdWUpOwpAQCAtMTYyLDEyICsxOTYsMTYgQEAKICAgICAgICAgKHZvaWQpIHByb3BlcnR5X2dldCgiYWYudGVlIiwgdmFsdWUsICIwIik7CiAgICAgICAgIHRlZUVuYWJsZWQgPSBhdG9pKHZhbHVlKTsKICAgICB9Ci0gICAgaWYgKHRlZUVuYWJsZWQgJiAxKQorICAgIC8vIEZJWE1FIHN5bWJvbGljIGNvbnN0YW50cyBoZXJlCisgICAgaWYgKHRlZUVuYWJsZWQgJiAxKSB7CiAgICAgICAgIG1UZWVTaW5rSW5wdXRFbmFibGVkID0gdHJ1ZTsKLSAgICBpZiAodGVlRW5hYmxlZCAmIDIpCisgICAgfQorICAgIGlmICh0ZWVFbmFibGVkICYgMikgewogICAgICAgICBtVGVlU2lua091dHB1dEVuYWJsZWQgPSB0cnVlOwotICAgIGlmICh0ZWVFbmFibGVkICYgNCkKKyAgICB9CisgICAgaWYgKHRlZUVuYWJsZWQgJiA0KSB7CiAgICAgICAgIG1UZWVTaW5rVHJhY2tFbmFibGVkID0gdHJ1ZTsKKyAgICB9CiAjZW5kaWYKIH0KIApAQCAtMTkxLDYgKzIyOSw4IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBtUGF0Y2hQYW5lbCA9IG5ldyBQYXRjaFBhbmVsKHRoaXMpOworCiAgICAgbU1vZGUgPSBBVURJT19NT0RFX05PUk1BTDsKIH0KIApAQCAtMjEwLDYgKzI1MCwxOCBAQAogICAgICAgICBhdWRpb19od19kZXZpY2VfY2xvc2UobUF1ZGlvSHdEZXZzLnZhbHVlQXQoaSktPmh3RGV2aWNlKCkpOwogICAgICAgICBkZWxldGUgbUF1ZGlvSHdEZXZzLnZhbHVlQXQoaSk7CiAgICAgfQorCisgICAgLy8gVGVsbCBtZWRpYS5sb2cgc2VydmljZSBhYm91dCBhbnkgb2xkIHdyaXRlcnMgdGhhdCBzdGlsbCBuZWVkIHRvIGJlIHVucmVnaXN0ZXJlZAorICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5sb2ciKSk7CisgICAgaWYgKGJpbmRlciAhPSAwKSB7CisgICAgICAgIHNwPElNZWRpYUxvZ1NlcnZpY2U+IG1lZGlhTG9nU2VydmljZShpbnRlcmZhY2VfY2FzdDxJTWVkaWFMb2dTZXJ2aWNlPihiaW5kZXIpKTsKKyAgICAgICAgZm9yIChzaXplX3QgY291bnQgPSBtVW5yZWdpc3RlcmVkV3JpdGVycy5zaXplKCk7IGNvdW50ID4gMDsgY291bnQtLSkgeworICAgICAgICAgICAgc3A8SU1lbW9yeT4gaU1lbW9yeShtVW5yZWdpc3RlcmVkV3JpdGVycy50b3AoKS0+Z2V0SU1lbW9yeSgpKTsKKyAgICAgICAgICAgIG1VbnJlZ2lzdGVyZWRXcml0ZXJzLnBvcCgpOworICAgICAgICAgICAgbWVkaWFMb2dTZXJ2aWNlLT51bnJlZ2lzdGVyV3JpdGVyKGlNZW1vcnkpOworICAgICAgICB9CisgICAgfQorCiB9CiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYXVkaW9faW50ZXJmYWNlc1tdID0gewpAQCAtMjQ5LDcgKzMwMSw3IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpkdW1wQ2xpZW50cyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCit2b2lkIEF1ZGlvRmxpbmdlcjo6ZHVtcENsaWVudHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQogewogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwogICAgIGNoYXIgYnVmZmVyW1NJWkVdOwpAQCAtMjcxLDE3ICszMjMsMTcgQEAKICAgICB9CiAKICAgICByZXN1bHQuYXBwZW5kKCJHbG9iYWwgc2Vzc2lvbiByZWZzOlxuIik7Ci0gICAgcmVzdWx0LmFwcGVuZCgiIHNlc3Npb24gcGlkIGNvdW50XG4iKTsKKyAgICByZXN1bHQuYXBwZW5kKCIgIHNlc3Npb24gICBwaWQgY291bnRcbiIpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF1ZGlvU2Vzc2lvblJlZnMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgQXVkaW9TZXNzaW9uUmVmICpyID0gbUF1ZGlvU2Vzc2lvblJlZnNbaV07Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAlN2QgJTNkICUzZFxuIiwgci0+bVNlc3Npb25pZCwgci0+bVBpZCwgci0+bUNudCk7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgJTdkICU1ZCAlNWRcbiIsIHItPm1TZXNzaW9uaWQsIHItPm1QaWQsIHItPm1DbnQpOwogICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgfQogICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogfQogCiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKK3ZvaWQgQXVkaW9GbGluZ2VyOjpkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKIHsKICAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKQEAgLTI5Niw3ICszNDgsNyBAQAogICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6ZHVtcFBlcm1pc3Npb25EZW5pYWwoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQordm9pZCBBdWRpb0ZsaW5nZXI6OmR1bXBQZXJtaXNzaW9uRGVuaWFsKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKIHsKICAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKQEAgLTM0NCw3ICszOTYsMTYgQEAKICAgICAgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogICAgICAgICB9CiAKKyAgICAgICAgYm9vbCBjbGllbnRMb2NrZWQgPSBkdW1wVHJ5TG9jayhtQ2xpZW50TG9jayk7CisgICAgICAgIGlmICghY2xpZW50TG9ja2VkKSB7CisgICAgICAgICAgICBTdHJpbmc4IHJlc3VsdChrQ2xpZW50TG9ja2VkU3RyaW5nKTsKKyAgICAgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgICAgICB9CiAgICAgICAgIGR1bXBDbGllbnRzKGZkLCBhcmdzKTsKKyAgICAgICAgaWYgKGNsaWVudExvY2tlZCkgeworICAgICAgICAgICAgbUNsaWVudExvY2sudW5sb2NrKCk7CisgICAgICAgIH0KKwogICAgICAgICBkdW1wSW50ZXJuYWxzKGZkLCBhcmdzKTsKIAogICAgICAgICAvLyBkdW1wIHBsYXliYWNrIHRocmVhZHMKQEAgLTM1Nyw2ICs0MTgsMTMgQEAKICAgICAgICAgICAgIG1SZWNvcmRUaHJlYWRzLnZhbHVlQXQoaSktPmR1bXAoZmQsIGFyZ3MpOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gZHVtcCBvcnBoYW4gZWZmZWN0IGNoYWlucworICAgICAgICBpZiAobU9ycGhhbkVmZmVjdENoYWlucy5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgd3JpdGUoZmQsICIgIE9ycGhhbiBFZmZlY3QgQ2hhaW5zXG4iLCBzdHJsZW4oIiAgT3JwaGFuIEVmZmVjdCBDaGFpbnNcbiIpKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU9ycGhhbkVmZmVjdENoYWlucy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIG1PcnBoYW5FZmZlY3RDaGFpbnMudmFsdWVBdChpKS0+ZHVtcChmZCwgYXJncyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgLy8gZHVtcCBhbGwgaGFyZHdhcmUgZGV2cwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb0h3RGV2cy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgKmRldiA9IG1BdWRpb0h3RGV2cy52YWx1ZUF0KGkpLT5od0RldmljZSgpOwpAQCAtMzc5LDcgKzQ0Nyw3IEBACiAgICAgICAgIGlmIChtTG9nTWVtb3J5RGVhbGVyICE9IDApIHsKICAgICAgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5sb2ciKSk7CiAgICAgICAgICAgICBpZiAoYmluZGVyICE9IDApIHsKLSAgICAgICAgICAgICAgICBmZHByaW50ZihmZCwgIlxubWVkaWEubG9nOlxuIik7CisgICAgICAgICAgICAgICAgZHByaW50ZihmZCwgIlxubWVkaWEubG9nOlxuIik7CiAgICAgICAgICAgICAgICAgVmVjdG9yPFN0cmluZzE2PiBhcmdzOwogICAgICAgICAgICAgICAgIGJpbmRlci0+ZHVtcChmZCwgYXJncyk7CiAgICAgICAgICAgICB9CkBAIC0zODgsOCArNDU2LDkgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXNwPEF1ZGlvRmxpbmdlcjo6Q2xpZW50PiBBdWRpb0ZsaW5nZXI6OnJlZ2lzdGVyUGlkX2wocGlkX3QgcGlkKQorc3A8QXVkaW9GbGluZ2VyOjpDbGllbnQ+IEF1ZGlvRmxpbmdlcjo6cmVnaXN0ZXJQaWQocGlkX3QgcGlkKQogeworICAgIE11dGV4OjpBdXRvbG9jayBfY2wobUNsaWVudExvY2spOwogICAgIC8vIElmIHBpZCBpcyBhbHJlYWR5IGluIHRoZSBtQ2xpZW50cyB3cDw+IG1hcCwgdGhlbiB1c2UgdGhhdCBlbnRyeQogICAgIC8vIChmb3Igd2hpY2ggcHJvbW90ZSgpIGlzIGFsd2F5cyAhPSAwKSwgb3RoZXJ3aXNlIGNyZWF0ZSBhIG5ldyBlbnRyeSBhbmQgQ2xpZW50LgogICAgIHNwPENsaWVudD4gY2xpZW50ID0gbUNsaWVudHMudmFsdWVGb3IocGlkKS5wcm9tb3RlKCk7CkBAIC00MDMsMTYgKzQ3Miw0NCBAQAogCiBzcDxOQkxvZzo6V3JpdGVyPiBBdWRpb0ZsaW5nZXI6Om5ld1dyaXRlcl9sKHNpemVfdCBzaXplLCBjb25zdCBjaGFyICpuYW1lKQogeworICAgIC8vIElmIHRoZXJlIGlzIG5vIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIGxvZ3MsIHJldHVybiBhIGR1bW15IHdyaXRlciB0aGF0IGRvZXMgbm90aGluZwogICAgIGlmIChtTG9nTWVtb3J5RGVhbGVyID09IDApIHsKICAgICAgICAgcmV0dXJuIG5ldyBOQkxvZzo6V3JpdGVyKCk7CiAgICAgfQotICAgIHNwPElNZW1vcnk+IHNoYXJlZCA9IG1Mb2dNZW1vcnlEZWFsZXItPmFsbG9jYXRlKE5CTG9nOjpUaW1lbGluZTo6c2hhcmVkU2l6ZShzaXplKSk7Ci0gICAgc3A8TkJMb2c6OldyaXRlcj4gd3JpdGVyID0gbmV3IE5CTG9nOjpXcml0ZXIoc2l6ZSwgc2hhcmVkKTsKICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+Z2V0U2VydmljZShTdHJpbmcxNigibWVkaWEubG9nIikpOwotICAgIGlmIChiaW5kZXIgIT0gMCkgewotICAgICAgICBpbnRlcmZhY2VfY2FzdDxJTWVkaWFMb2dTZXJ2aWNlPihiaW5kZXIpLT5yZWdpc3RlcldyaXRlcihzaGFyZWQsIHNpemUsIG5hbWUpOworICAgIC8vIFNpbWlsYXJseSBpZiB3ZSBjYW4ndCBjb250YWN0IHRoZSBtZWRpYS5sb2cgc2VydmljZSwgYWxzbyByZXR1cm4gYSBkdW1teSB3cml0ZXIKKyAgICBpZiAoYmluZGVyID09IDApIHsKKyAgICAgICAgcmV0dXJuIG5ldyBOQkxvZzo6V3JpdGVyKCk7CiAgICAgfQotICAgIHJldHVybiB3cml0ZXI7CisgICAgc3A8SU1lZGlhTG9nU2VydmljZT4gbWVkaWFMb2dTZXJ2aWNlKGludGVyZmFjZV9jYXN0PElNZWRpYUxvZ1NlcnZpY2U+KGJpbmRlcikpOworICAgIHNwPElNZW1vcnk+IHNoYXJlZCA9IG1Mb2dNZW1vcnlEZWFsZXItPmFsbG9jYXRlKE5CTG9nOjpUaW1lbGluZTo6c2hhcmVkU2l6ZShzaXplKSk7CisgICAgLy8gSWYgYWxsb2NhdGlvbiBmYWlscywgY29uc3VsdCB0aGUgdmVjdG9yIG9mIHByZXZpb3VzbHkgdW5yZWdpc3RlcmVkIHdyaXRlcnMKKyAgICAvLyBhbmQgZ2FyYmFnZS1jb2xsZWN0IG9uZSBvciBtb3JlIHRoZW0gdW50aWwgYW4gYWxsb2NhdGlvbiBzdWNjZWVkcworICAgIGlmIChzaGFyZWQgPT0gMCkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVVucmVnaXN0ZXJlZFdyaXRlcnNMb2NrKTsKKyAgICAgICAgZm9yIChzaXplX3QgY291bnQgPSBtVW5yZWdpc3RlcmVkV3JpdGVycy5zaXplKCk7IGNvdW50ID4gMDsgY291bnQtLSkgeworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFBpY2sgdGhlIG9sZGVzdCBzdGFsZSB3cml0ZXIgdG8gZ2FyYmFnZS1jb2xsZWN0CisgICAgICAgICAgICAgICAgc3A8SU1lbW9yeT4gaU1lbW9yeShtVW5yZWdpc3RlcmVkV3JpdGVyc1swXS0+Z2V0SU1lbW9yeSgpKTsKKyAgICAgICAgICAgICAgICBtVW5yZWdpc3RlcmVkV3JpdGVycy5yZW1vdmVBdCgwKTsKKyAgICAgICAgICAgICAgICBtZWRpYUxvZ1NlcnZpY2UtPnVucmVnaXN0ZXJXcml0ZXIoaU1lbW9yeSk7CisgICAgICAgICAgICAgICAgLy8gTm93IHRoZSBtZWRpYS5sb2cgcmVtb3RlIHJlZmVyZW5jZSB0byBJTWVtb3J5IGlzIGdvbmUuICBXaGVuIG91ciBsYXN0IGxvY2FsCisgICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIHRvIElNZW1vcnkgYWxzbyBkcm9wcyB0byB6ZXJvIGF0IGVuZCBvZiB0aGlzIGJsb2NrLAorICAgICAgICAgICAgICAgIC8vIHRoZSBJTWVtb3J5IGRlc3RydWN0b3Igd2lsbCBkZWFsbG9jYXRlIHRoZSByZWdpb24gZnJvbSBtTG9nTWVtb3J5RGVhbGVyLgorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gUmUtYXR0ZW1wdCB0aGUgYWxsb2NhdGlvbgorICAgICAgICAgICAgc2hhcmVkID0gbUxvZ01lbW9yeURlYWxlci0+YWxsb2NhdGUoTkJMb2c6OlRpbWVsaW5lOjpzaGFyZWRTaXplKHNpemUpKTsKKyAgICAgICAgICAgIGlmIChzaGFyZWQgIT0gMCkgeworICAgICAgICAgICAgICAgIGdvdG8gc3VjY2VzczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBFdmVuIGFmdGVyIGdhcmJhZ2UtY29sbGVjdGluZyBhbGwgb2xkIHdyaXRlcnMsIHRoZXJlIGlzIHN0aWxsIG5vdCBlbm91Z2ggbWVtb3J5LAorICAgICAgICAvLyBzbyByZXR1cm4gYSBkdW1teSB3cml0ZXIKKyAgICAgICAgcmV0dXJuIG5ldyBOQkxvZzo6V3JpdGVyKCk7CisgICAgfQorc3VjY2VzczoKKyAgICBtZWRpYUxvZ1NlcnZpY2UtPnJlZ2lzdGVyV3JpdGVyKHNoYXJlZCwgc2l6ZSwgbmFtZSk7CisgICAgcmV0dXJuIG5ldyBOQkxvZzo6V3JpdGVyKHNpemUsIHNoYXJlZCk7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjp1bnJlZ2lzdGVyV3JpdGVyKGNvbnN0IHNwPE5CTG9nOjpXcml0ZXI+JiB3cml0ZXIpCkBAIC00MjQsMTMgKzUyMSwxMCBAQAogICAgIGlmIChpTWVtb3J5ID09IDApIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+Z2V0U2VydmljZShTdHJpbmcxNigibWVkaWEubG9nIikpOwotICAgIGlmIChiaW5kZXIgIT0gMCkgewotICAgICAgICBpbnRlcmZhY2VfY2FzdDxJTWVkaWFMb2dTZXJ2aWNlPihiaW5kZXIpLT51bnJlZ2lzdGVyV3JpdGVyKGlNZW1vcnkpOwotICAgICAgICAvLyBOb3cgdGhlIG1lZGlhLmxvZyByZW1vdGUgcmVmZXJlbmNlIHRvIElNZW1vcnkgaXMgZ29uZS4KLSAgICAgICAgLy8gV2hlbiBvdXIgbGFzdCBsb2NhbCByZWZlcmVuY2UgdG8gSU1lbW9yeSBhbHNvIGRyb3BzIHRvIHplcm8sCi0gICAgICAgIC8vIHRoZSBJTWVtb3J5IGRlc3RydWN0b3Igd2lsbCBkZWFsbG9jYXRlIHRoZSByZWdpb24gZnJvbSBtTWVtb3J5RGVhbGVyLgotICAgIH0KKyAgICAvLyBSYXRoZXIgdGhhbiByZW1vdmluZyB0aGUgd3JpdGVyIGltbWVkaWF0ZWx5LCBhcHBlbmQgaXQgdG8gYSBxdWV1ZSBvZiBvbGQgd3JpdGVycyB0bworICAgIC8vIGJlIGdhcmJhZ2UtY29sbGVjdGVkIGxhdGVyLiAgVGhpcyBhbGxvd3MgdXMgdG8gY29udGludWUgdG8gdmlldyBvbGQgbG9ncyBmb3IgYSB3aGlsZS4KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobVVucmVnaXN0ZXJlZFdyaXRlcnNMb2NrKTsKKyAgICBtVW5yZWdpc3RlcmVkV3JpdGVycy5wdXNoKHdyaXRlcik7CiB9CiAKIC8vIElBdWRpb0ZsaW5nZXIgaW50ZXJmYWNlCkBAIC00NDEsMTMgKzUzNSwxMiBAQAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgc2l6ZV90ICpmcmFtZUNvdW50LAogICAgICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190ICpmbGFncywKICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAogICAgICAgICBwaWRfdCB0aWQsCiAgICAgICAgIGludCAqc2Vzc2lvbklkLAotICAgICAgICBTdHJpbmc4JiBuYW1lLAogICAgICAgICBpbnQgY2xpZW50VWlkLAogICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKQogewpAQCAtNDY1LDEwICs1NTgsMjkgQEAKICAgICAgICAgZ290byBFeGl0OwogICAgIH0KIAotICAgIC8vIGNsaWVudCBpcyByZXNwb25zaWJsZSBmb3IgY29udmVyc2lvbiBvZiA4LWJpdCBQQ00gdG8gMTYtYml0IFBDTSwKLSAgICAvLyBhbmQgd2UgZG9uJ3QgeWV0IHN1cHBvcnQgOC4yNCBvciAzMi1iaXQgUENNCi0gICAgaWYgKGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSAmJiBmb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKLSAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrKCkgaW52YWxpZCBmb3JtYXQgJWQiLCBmb3JtYXQpOworICAgIC8vIGZ1cnRoZXIgc2FtcGxlIHJhdGUgY2hlY2tzIGFyZSBwZXJmb3JtZWQgYnkgY3JlYXRlVHJhY2tfbCgpIGRlcGVuZGluZyBvbiB0aGUgdGhyZWFkIHR5cGUKKyAgICBpZiAoc2FtcGxlUmF0ZSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFjaygpIGludmFsaWQgc2FtcGxlIHJhdGUgJXUiLCBzYW1wbGVSYXRlKTsKKyAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgZ290byBFeGl0OworICAgIH0KKworICAgIC8vIGZ1cnRoZXIgY2hhbm5lbCBtYXNrIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGJ5IGNyZWF0ZVRyYWNrX2woKSBkZXBlbmRpbmcgb24gdGhlIHRocmVhZCB0eXBlCisgICAgaWYgKCFhdWRpb19pc19vdXRwdXRfY2hhbm5lbChjaGFubmVsTWFzaykpIHsKKyAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrKCkgaW52YWxpZCBjaGFubmVsIG1hc2sgJSN4IiwgY2hhbm5lbE1hc2spOworICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgLy8gZnVydGhlciBmb3JtYXQgY2hlY2tzIGFyZSBwZXJmb3JtZWQgYnkgY3JlYXRlVHJhY2tfbCgpIGRlcGVuZGluZyBvbiB0aGUgdGhyZWFkIHR5cGUKKyAgICBpZiAoIWF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChmb3JtYXQpKSB7CisgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFjaygpIGludmFsaWQgZm9ybWF0ICUjeCIsIGZvcm1hdCk7CisgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKKyAgICBpZiAoc2hhcmVkQnVmZmVyICE9IDAgJiYgc2hhcmVkQnVmZmVyLT5wb2ludGVyKCkgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2soKSBzaGFyZWRCdWZmZXIgaXMgbm9uLTAgYnV0IGhhcyBOVUxMIHBvaW50ZXIoKSIpOwogICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQpAQCAtNDc2LDcgKzU4OCw2IEBACiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgICAgICBQbGF5YmFja1RocmVhZCAqdGhyZWFkID0gY2hlY2tQbGF5YmFja1RocmVhZF9sKG91dHB1dCk7Ci0gICAgICAgIFBsYXliYWNrVGhyZWFkICplZmZlY3RUaHJlYWQgPSBOVUxMOwogICAgICAgICBpZiAodGhyZWFkID09IE5VTEwpIHsKICAgICAgICAgICAgIEFMT0dFKCJubyBwbGF5YmFjayB0aHJlYWQgZm91bmQgZm9yIG91dHB1dCBoYW5kbGUgJWQiLCBvdXRwdXQpOwogICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKQEAgLTQ4NCwyNCArNTk1LDIzIEBACiAgICAgICAgIH0KIAogICAgICAgICBwaWRfdCBwaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgICAgIGNsaWVudCA9IHJlZ2lzdGVyUGlkKHBpZCk7CiAKLSAgICAgICAgY2xpZW50ID0gcmVnaXN0ZXJQaWRfbChwaWQpOwotCi0gICAgICAgIEFMT0dWKCJjcmVhdGVUcmFjaygpIHNlc3Npb25JZDogJWQiLCAoc2Vzc2lvbklkID09IE5VTEwpID8gLTIgOiAqc2Vzc2lvbklkKTsKLSAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBOVUxMICYmICpzZXNzaW9uSWQgIT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKSB7CisgICAgICAgIFBsYXliYWNrVGhyZWFkICplZmZlY3RUaHJlYWQgPSBOVUxMOworICAgICAgICBpZiAoc2Vzc2lvbklkICE9IE5VTEwgJiYgKnNlc3Npb25JZCAhPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFKSB7CisgICAgICAgICAgICBsU2Vzc2lvbklkID0gKnNlc3Npb25JZDsKICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGFuIGVmZmVjdCBjaGFpbiB3aXRoIHRoZSBzYW1lIHNlc3Npb24gSUQgaXMgcHJlc2VudCBvbiBhbm90aGVyCiAgICAgICAgICAgICAvLyBvdXRwdXQgdGhyZWFkIGFuZCBtb3ZlIGl0IGhlcmUuCiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgICAgICBzcDxQbGF5YmFja1RocmVhZD4gdCA9IG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKTsKICAgICAgICAgICAgICAgICBpZiAobVBsYXliYWNrVGhyZWFkcy5rZXlBdChpKSAhPSBvdXRwdXQpIHsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2Vzc2lvbnMgPSB0LT5oYXNBdWRpb1Nlc3Npb24oKnNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNlc3Npb25zID0gdC0+aGFzQXVkaW9TZXNzaW9uKGxTZXNzaW9uSWQpOwogICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbnMgJiBQbGF5YmFja1RocmVhZDo6RUZGRUNUX1NFU1NJT04pIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdFRocmVhZCA9IHQuZ2V0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxTZXNzaW9uSWQgPSAqc2Vzc2lvbklkOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gaWYgbm8gYXVkaW8gc2Vzc2lvbiBpZCBpcyBwcm92aWRlZCwgY3JlYXRlIG9uZSBoZXJlCiAgICAgICAgICAgICBsU2Vzc2lvbklkID0gbmV4dFVuaXF1ZUlkKCk7CkBAIC01MTksMTMgKzYyOSwxNCBAQAogICAgICAgICAvLyBtb3ZlIGVmZmVjdCBjaGFpbiB0byB0aGlzIG91dHB1dCB0aHJlYWQgaWYgYW4gZWZmZWN0IG9uIHNhbWUgc2Vzc2lvbiB3YXMgd2FpdGluZwogICAgICAgICAvLyBmb3IgYSB0cmFjayB0byBiZSBjcmVhdGVkCiAgICAgICAgIGlmIChsU3RhdHVzID09IE5PX0VSUk9SICYmIGVmZmVjdFRocmVhZCAhPSBOVUxMKSB7CisgICAgICAgICAgICAvLyBubyByaXNrIG9mIGRlYWRsb2NrIGJlY2F1c2UgQXVkaW9GbGluZ2VyOjptTG9jayBpcyBoZWxkCiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2RsKHRocmVhZC0+bUxvY2spOwogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9zbChlZmZlY3RUaHJlYWQtPm1Mb2NrKTsKICAgICAgICAgICAgIG1vdmVFZmZlY3RDaGFpbl9sKGxTZXNzaW9uSWQsIGVmZmVjdFRocmVhZCwgdGhyZWFkLCB0cnVlKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIExvb2sgZm9yIHN5bmMgZXZlbnRzIGF3YWl0aW5nIGZvciBhIHNlc3Npb24gdG8gYmUgdXNlZC4KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KW1QZW5kaW5nU3luY0V2ZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QZW5kaW5nU3luY0V2ZW50cy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgaWYgKG1QZW5kaW5nU3luY0V2ZW50c1tpXS0+dHJpZ2dlclNlc3Npb24oKSA9PSBsU2Vzc2lvbklkKSB7CiAgICAgICAgICAgICAgICAgaWYgKHRocmVhZC0+aXNWYWxpZFN5bmNFdmVudChtUGVuZGluZ1N5bmNFdmVudHNbaV0pKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChsU3RhdHVzID09IE5PX0VSUk9SKSB7CkBAIC01MzgsMjMgKzY0OSwyNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH0KLSAgICBpZiAobFN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAvLyBzIGZvciBzZXJ2ZXIncyBwaWQsIG4gZm9yIG5vcm1hbCBtaXhlciBuYW1lLCBmIGZvciBmYXN0IGluZGV4Ci0gICAgICAgIG5hbWUgPSBTdHJpbmc4Ojpmb3JtYXQoInM6JWQ7bjolZDtmOiVkIiwgZ2V0cGlkX2NhY2hlZCwgdHJhY2stPm5hbWUoKSAtIEF1ZGlvTWl4ZXI6OlRSQUNLMCwKLSAgICAgICAgICAgICAgICB0cmFjay0+ZmFzdEluZGV4KCkpOwotICAgICAgICB0cmFja0hhbmRsZSA9IG5ldyBUcmFja0hhbmRsZSh0cmFjayk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gcmVtb3ZlIGxvY2FsIHN0cm9uZyByZWZlcmVuY2UgdG8gQ2xpZW50IGJlZm9yZSBkZWxldGluZyB0aGUgVHJhY2sgc28gdGhhdCB0aGUgQ2xpZW50Ci0gICAgICAgIC8vIGRlc3RydWN0b3IgaXMgY2FsbGVkIGJ5IHRoZSBUcmFja0Jhc2UgZGVzdHJ1Y3RvciB3aXRoIG1Mb2NrIGhlbGQKLSAgICAgICAgY2xpZW50LmNsZWFyKCk7Ci0gICAgICAgIHRyYWNrLmNsZWFyKCk7CisKICAgICB9CiAKLUV4aXQ6Ci0gICAgaWYgKHN0YXR1cyAhPSBOVUxMKSB7Ci0gICAgICAgICpzdGF0dXMgPSBsU3RhdHVzOworICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIC8vIHJlbW92ZSBsb2NhbCBzdHJvbmcgcmVmZXJlbmNlIHRvIENsaWVudCBiZWZvcmUgZGVsZXRpbmcgdGhlIFRyYWNrIHNvIHRoYXQgdGhlCisgICAgICAgIC8vIENsaWVudCBkZXN0cnVjdG9yIGlzIGNhbGxlZCBieSB0aGUgVHJhY2tCYXNlIGRlc3RydWN0b3Igd2l0aCBtQ2xpZW50TG9jayBoZWxkCisgICAgICAgIC8vIERvbid0IGhvbGQgbUNsaWVudExvY2sgd2hlbiByZWxlYXNpbmcgdGhlIHJlZmVyZW5jZSBvbiB0aGUgdHJhY2sgYXMgdGhlCisgICAgICAgIC8vIGRlc3RydWN0b3Igd2lsbCBhY3F1aXJlIGl0LgorICAgICAgICB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2NsKG1DbGllbnRMb2NrKTsKKyAgICAgICAgICAgIGNsaWVudC5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIHRyYWNrLmNsZWFyKCk7CisgICAgICAgIGdvdG8gRXhpdDsKICAgICB9CisKKyAgICAvLyByZXR1cm4gaGFuZGxlIHRvIGNsaWVudAorICAgIHRyYWNrSGFuZGxlID0gbmV3IFRyYWNrSGFuZGxlKHRyYWNrKTsKKworRXhpdDoKKyAgICAqc3RhdHVzID0gbFN0YXR1czsKICAgICByZXR1cm4gdHJhY2tIYW5kbGU7CiB9CiAKQEAgLTU2OSwxNyArNjg0LDYgQEAKICAgICByZXR1cm4gdGhyZWFkLT5zYW1wbGVSYXRlKCk7CiB9CiAKLWludCBBdWRpb0ZsaW5nZXI6OmNoYW5uZWxDb3VudChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGNvbnN0Ci17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBQbGF5YmFja1RocmVhZCAqdGhyZWFkID0gY2hlY2tQbGF5YmFja1RocmVhZF9sKG91dHB1dCk7Ci0gICAgaWYgKHRocmVhZCA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCJjaGFubmVsQ291bnQoKSB1bmtub3duIHRocmVhZCAlZCIsIG91dHB1dCk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gdGhyZWFkLT5jaGFubmVsQ291bnQoKTsKLX0KLQogYXVkaW9fZm9ybWF0X3QgQXVkaW9GbGluZ2VyOjpmb3JtYXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBjb25zdAogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC03MDMsOSArODA3LDE0IEBACiAgICAgfQogCiAgICAgQXV0b011dGV4IGxvY2sobUhhcmR3YXJlTG9jayk7Ci0gICAgYXVkaW9faHdfZGV2aWNlX3QgKmRldiA9IG1QcmltYXJ5SGFyZHdhcmVEZXYtPmh3RGV2aWNlKCk7CiAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfU0VUX01JQ19NVVRFOwotICAgIHJldCA9IGRldi0+c2V0X21pY19tdXRlKGRldiwgc3RhdGUpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF1ZGlvSHdEZXZzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGF1ZGlvX2h3X2RldmljZV90ICpkZXYgPSBtQXVkaW9Id0RldnMudmFsdWVBdChpKS0+aHdEZXZpY2UoKTsKKyAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gZGV2LT5zZXRfbWljX211dGUoZGV2LCBzdGF0ZSk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldCA9IHJlc3VsdDsKKyAgICAgICAgfQorICAgIH0KICAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19JRExFOwogICAgIHJldHVybiByZXQ7CiB9CkBAIC04MDQsNyArOTEzLDcgQEAKIAogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKICAgICBQbGF5YmFja1RocmVhZCAqdGhyZWFkID0gTlVMTDsKLSAgICBpZiAob3V0cHV0KSB7CisgICAgaWYgKG91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICB0aHJlYWQgPSBjaGVja1BsYXliYWNrVGhyZWFkX2wob3V0cHV0KTsKICAgICAgICAgaWYgKHRocmVhZCA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtODM5LDcgKzk0OCw3IEBACiAKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAgICAgbVN0cmVhbVR5cGVzW3N0cmVhbV0ubXV0ZSA9IG11dGVkOwotICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtUGxheWJhY2tUaHJlYWRzLnNpemUoKTsgaSsrKQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXliYWNrVGhyZWFkcy5zaXplKCk7IGkrKykKICAgICAgICAgbVBsYXliYWNrVGhyZWFkcy52YWx1ZUF0KGkpLT5zZXRTdHJlYW1NdXRlKHN0cmVhbSwgbXV0ZWQpOwogCiAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtODUzLDcgKzk2Miw3IEBACiAKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAgICAgZmxvYXQgdm9sdW1lOwotICAgIGlmIChvdXRwdXQpIHsKKyAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgIFBsYXliYWNrVGhyZWFkICp0aHJlYWQgPSBjaGVja1BsYXliYWNrVGhyZWFkX2wob3V0cHV0KTsKICAgICAgICAgaWYgKHRocmVhZCA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gMC4wZjsKQEAgLTg4Niw4ICs5OTUsOCBAQAogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQogCi0gICAgLy8gaW9IYW5kbGUgPT0gMCBtZWFucyB0aGUgcGFyYW1ldGVycyBhcmUgZ2xvYmFsIHRvIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UKLSAgICBpZiAoaW9IYW5kbGUgPT0gMCkgeworICAgIC8vIEFVRElPX0lPX0hBTkRMRV9OT05FIG1lYW5zIHRoZSBwYXJhbWV0ZXJzIGFyZSBnbG9iYWwgdG8gdGhlIGF1ZGlvIGhhcmR3YXJlIGludGVyZmFjZQorICAgIGlmIChpb0hhbmRsZSA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgICAgICBzdGF0dXNfdCBmaW5hbF9yZXN1bHQgPSBOT19FUlJPUjsKICAgICAgICAgewpAQCAtOTY5LDcgKzEwNzgsNyBAQAogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAotICAgIGlmIChpb0hhbmRsZSA9PSAwKSB7CisgICAgaWYgKGlvSGFuZGxlID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgIFN0cmluZzggb3V0X3M4OwogCiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF1ZGlvSHdEZXZzLnNpemUoKTsgaSsrKSB7CkBAIC0xMDA4LDcgKzExMTcsNyBAQAogCiAgICAgQXV0b011dGV4IGxvY2sobUhhcmR3YXJlTG9jayk7CiAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfR0VUX0lOUFVUX0JVRkZFUl9TSVpFOwotICAgIHN0cnVjdCBhdWRpb19jb25maWcgY29uZmlnOworICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZzsKICAgICBtZW1zZXQoJmNvbmZpZywgMCwgc2l6ZW9mKGNvbmZpZykpOwogICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IHNhbXBsZVJhdGU7CiAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IGNoYW5uZWxNYXNrOwpAQCAtMTAyMCw3ICsxMTI5LDcgQEAKICAgICByZXR1cm4gc2l6ZTsKIH0KIAotdW5zaWduZWQgaW50IEF1ZGlvRmxpbmdlcjo6Z2V0SW5wdXRGcmFtZXNMb3N0KGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKSBjb25zdAordWludDMyX3QgQXVkaW9GbGluZ2VyOjpnZXRJbnB1dEZyYW1lc0xvc3QoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpIGNvbnN0CiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIApAQCAtMTA1Miw3ICsxMTYxLDcgQEAKICAgICByZXR1cm4gcmV0OwogfQogCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OmdldFJlbmRlclBvc2l0aW9uKHNpemVfdCAqaGFsRnJhbWVzLCBzaXplX3QgKmRzcEZyYW1lcywKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6Z2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmhhbEZyYW1lcywgdWludDMyX3QgKmRzcEZyYW1lcywKICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBjb25zdAogewogICAgIHN0YXR1c190IHN0YXR1czsKQEAgLTEwNjksMjEgKzExNzgsMzIgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OnJlZ2lzdGVyQ2xpZW50KGNvbnN0IHNwPElBdWRpb0ZsaW5nZXJDbGllbnQ+JiBjbGllbnQpCiB7Ci0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChjbGllbnQgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGJvb2wgY2xpZW50QWRkZWQgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfY2wobUNsaWVudExvY2spOwogCi0gICAgcGlkX3QgcGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwotICAgIGlmIChtTm90aWZpY2F0aW9uQ2xpZW50cy5pbmRleE9mS2V5KHBpZCkgPCAwKSB7Ci0gICAgICAgIHNwPE5vdGlmaWNhdGlvbkNsaWVudD4gbm90aWZpY2F0aW9uQ2xpZW50ID0gbmV3IE5vdGlmaWNhdGlvbkNsaWVudCh0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWQpOwotICAgICAgICBBTE9HVigicmVnaXN0ZXJDbGllbnQoKSBjbGllbnQgJXAsIHBpZCAlZCIsIG5vdGlmaWNhdGlvbkNsaWVudC5nZXQoKSwgcGlkKTsKKyAgICAgICAgcGlkX3QgcGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworICAgICAgICBpZiAobU5vdGlmaWNhdGlvbkNsaWVudHMuaW5kZXhPZktleShwaWQpIDwgMCkgeworICAgICAgICAgICAgc3A8Tm90aWZpY2F0aW9uQ2xpZW50PiBub3RpZmljYXRpb25DbGllbnQgPSBuZXcgTm90aWZpY2F0aW9uQ2xpZW50KHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkKTsKKyAgICAgICAgICAgIEFMT0dWKCJyZWdpc3RlckNsaWVudCgpIGNsaWVudCAlcCwgcGlkICVkIiwgbm90aWZpY2F0aW9uQ2xpZW50LmdldCgpLCBwaWQpOwogCi0gICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLmFkZChwaWQsIG5vdGlmaWNhdGlvbkNsaWVudCk7CisgICAgICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy5hZGQocGlkLCBub3RpZmljYXRpb25DbGllbnQpOwogCi0gICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IGNsaWVudC0+YXNCaW5kZXIoKTsKLSAgICAgICAgYmluZGVyLT5saW5rVG9EZWF0aChub3RpZmljYXRpb25DbGllbnQpOworICAgICAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gY2xpZW50LT5hc0JpbmRlcigpOworICAgICAgICAgICAgYmluZGVyLT5saW5rVG9EZWF0aChub3RpZmljYXRpb25DbGllbnQpOworICAgICAgICAgICAgY2xpZW50QWRkZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQogCisgICAgLy8gbUNsaWVudExvY2sgc2hvdWxkIG5vdCBiZSBoZWxkIGhlcmUgYmVjYXVzZSBUaHJlYWRCYXNlOjpzZW5kSW9Db25maWdFdmVudCgpIHdpbGwgbG9jayB0aGUKKyAgICAvLyBUaHJlYWRCYXNlIG11dGV4IGFuZCB0aGUgbG9ja2luZyBvcmRlciBpcyBUaHJlYWRCYXNlOjptTG9jayB0aGVuIEF1ZGlvRmxpbmdlcjo6bUNsaWVudExvY2suCisgICAgaWYgKGNsaWVudEFkZGVkKSB7CiAgICAgICAgIC8vIHRoZSBjb25maWcgY2hhbmdlIGlzIGFsd2F5cyBzZW50IGZyb20gcGxheWJhY2sgb3IgcmVjb3JkIHRocmVhZHMgdG8gYXZvaWQgZGVhZGxvY2sKICAgICAgICAgLy8gd2l0aCBBdWRpb1N5c3RlbTo6Z0xvY2sKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGxheWJhY2tUaHJlYWRzLnNpemUoKTsgaSsrKSB7CkBAIC0xMDk5LDggKzEyMTksMTAgQEAKIHZvaWQgQXVkaW9GbGluZ2VyOjpyZW1vdmVOb3RpZmljYXRpb25DbGllbnQocGlkX3QgcGlkKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0KLSAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy5yZW1vdmVJdGVtKHBpZCk7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2NsKG1DbGllbnRMb2NrKTsKKyAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMucmVtb3ZlSXRlbShwaWQpOworICAgIH0KIAogICAgIEFMT0dWKCIlZCBkaWVkLCByZWxlYXNpbmcgaXRzIHNlc3Npb25zIiwgcGlkKTsKICAgICBzaXplX3QgbnVtID0gbUF1ZGlvU2Vzc2lvblJlZnMuc2l6ZSgpOwpAQCAtMTEyMywxNyArMTI0NSwxOCBAQAogICAgIH0KIH0KIAotLy8gYXVkaW9Db25maWdDaGFuZ2VkX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIEF1ZGlvRmxpbmdlcjo6bUxvY2sgaGVsZAotdm9pZCBBdWRpb0ZsaW5nZXI6OmF1ZGlvQ29uZmlnQ2hhbmdlZF9sKGludCBldmVudCwgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IHZvaWQgKnBhcmFtMikKK3ZvaWQgQXVkaW9GbGluZ2VyOjphdWRpb0NvbmZpZ0NoYW5nZWQoaW50IGV2ZW50LCBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3Qgdm9pZCAqcGFyYW0yKQogeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ2xpZW50TG9jayk7CiAgICAgc2l6ZV90IHNpemUgPSBtTm90aWZpY2F0aW9uQ2xpZW50cy5zaXplKCk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMudmFsdWVBdChpKS0+YXVkaW9GbGluZ2VyQ2xpZW50KCktPmlvQ29uZmlnQ2hhbmdlZChldmVudCwgaW9IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0yKTsKKyAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMudmFsdWVBdChpKS0+YXVkaW9GbGluZ2VyQ2xpZW50KCktPmlvQ29uZmlnQ2hhbmdlZChldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0yKTsKICAgICB9CiB9CiAKLS8vIHJlbW92ZUNsaWVudF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKKy8vIHJlbW92ZUNsaWVudF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1DbGllbnRMb2NrIGhlbGQKIHZvaWQgQXVkaW9GbGluZ2VyOjpyZW1vdmVDbGllbnRfbChwaWRfdCBwaWQpCiB7CiAgICAgQUxPR1YoInJlbW92ZUNsaWVudF9sKCkgcGlkICVkLCBjYWxsaW5nIHBpZCAlZCIsIHBpZCwKQEAgLTExNzEsNyArMTI5NCw3IEBACiAgICAgLy8gMSBNQiBvZiBhZGRyZXNzIHNwYWNlIGlzIGdvb2QgZm9yIDMyIHRyYWNrcywgOCBidWZmZXJzIGVhY2gsIDQgS0IvYnVmZmVyCiB9CiAKLS8vIENsaWVudCBkZXN0cnVjdG9yIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBoZWxkCisvLyBDbGllbnQgZGVzdHJ1Y3RvciBtdXN0IGJlIGNhbGxlZCB3aXRoIEF1ZGlvRmxpbmdlcjo6bUNsaWVudExvY2sgaGVsZAogQXVkaW9GbGluZ2VyOjpDbGllbnQ6On5DbGllbnQoKQogewogICAgIG1BdWRpb0ZsaW5nZXItPnJlbW92ZUNsaWVudF9sKG1QaWQpOwpAQCAtMTIyMCw3ICsxMzQzLDcgQEAKIHsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6Ok5vdGlmaWNhdGlvbkNsaWVudDo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKQordm9pZCBBdWRpb0ZsaW5nZXI6Ok5vdGlmaWNhdGlvbkNsaWVudDo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKQogewogICAgIHNwPE5vdGlmaWNhdGlvbkNsaWVudD4ga2VlcCh0aGlzKTsKICAgICBtQXVkaW9GbGluZ2VyLT5yZW1vdmVOb3RpZmljYXRpb25DbGllbnQobVBpZCk7CkBAIC0xMjM4LDIwICsxMzYxLDI0IEBACiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICBzaXplX3QgKmZyYW1lQ291bnQsCiAgICAgICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgKmZsYWdzLAogICAgICAgICBwaWRfdCB0aWQsCiAgICAgICAgIGludCAqc2Vzc2lvbklkLAorICAgICAgICBzaXplX3QgKm5vdGlmaWNhdGlvbkZyYW1lcywKKyAgICAgICAgc3A8SU1lbW9yeT4mIGNibGssCisgICAgICAgIHNwPElNZW1vcnk+JiBidWZmZXJzLAogICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKQogewogICAgIHNwPFJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s+IHJlY29yZFRyYWNrOwogICAgIHNwPFJlY29yZEhhbmRsZT4gcmVjb3JkSGFuZGxlOwogICAgIHNwPENsaWVudD4gY2xpZW50OwogICAgIHN0YXR1c190IGxTdGF0dXM7Ci0gICAgUmVjb3JkVGhyZWFkICp0aHJlYWQ7Ci0gICAgc2l6ZV90IGluRnJhbWVDb3VudDsKICAgICBpbnQgbFNlc3Npb25JZDsKIAorICAgIGNibGsuY2xlYXIoKTsKKyAgICBidWZmZXJzLmNsZWFyKCk7CisKICAgICAvLyBjaGVjayBjYWxsaW5nIHBlcm1pc3Npb25zCiAgICAgaWYgKCFyZWNvcmRpbmdBbGxvd2VkKCkpIHsKICAgICAgICAgQUxPR0UoIm9wZW5SZWNvcmQoKSBwZXJtaXNzaW9uIGRlbmllZDogcmVjb3JkaW5nIG5vdCBhbGxvd2VkIik7CkBAIC0xMjU5LDE2ICsxMzg2LDMxIEBACiAgICAgICAgIGdvdG8gRXhpdDsKICAgICB9CiAKLSAgICBpZiAoZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7Ci0gICAgICAgIEFMT0dFKCJvcGVuUmVjb3JkKCkgaW52YWxpZCBmb3JtYXQgJWQiLCBmb3JtYXQpOworICAgIC8vIGZ1cnRoZXIgc2FtcGxlIHJhdGUgY2hlY2tzIGFyZSBwZXJmb3JtZWQgYnkgY3JlYXRlUmVjb3JkVHJhY2tfbCgpCisgICAgaWYgKHNhbXBsZVJhdGUgPT0gMCkgeworICAgICAgICBBTE9HRSgib3BlblJlY29yZCgpIGludmFsaWQgc2FtcGxlIHJhdGUgJXUiLCBzYW1wbGVSYXRlKTsKICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgZ290byBFeGl0OwogICAgIH0KIAotICAgIC8vIGFkZCBjbGllbnQgdG8gbGlzdAotICAgIHsgLy8gc2NvcGUgZm9yIG1Mb2NrCisgICAgLy8gd2UgZG9uJ3QgeWV0IHN1cHBvcnQgYW55dGhpbmcgb3RoZXIgdGhhbiAxNi1iaXQgUENNCisgICAgaWYgKCEoYXVkaW9faXNfdmFsaWRfZm9ybWF0KGZvcm1hdCkgJiYKKyAgICAgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSAmJiBmb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpKSB7CisgICAgICAgIEFMT0dFKCJvcGVuUmVjb3JkKCkgaW52YWxpZCBmb3JtYXQgJSN4IiwgZm9ybWF0KTsKKyAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgZ290byBFeGl0OworICAgIH0KKworICAgIC8vIGZ1cnRoZXIgY2hhbm5lbCBtYXNrIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGJ5IGNyZWF0ZVJlY29yZFRyYWNrX2woKQorICAgIGlmICghYXVkaW9faXNfaW5wdXRfY2hhbm5lbChjaGFubmVsTWFzaykpIHsKKyAgICAgICAgQUxPR0UoIm9wZW5SZWNvcmQoKSBpbnZhbGlkIGNoYW5uZWwgbWFzayAlI3giLCBjaGFubmVsTWFzayk7CisgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKKyAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIHRocmVhZCA9IGNoZWNrUmVjb3JkVGhyZWFkX2woaW5wdXQpOworICAgICAgICBSZWNvcmRUaHJlYWQgKnRocmVhZCA9IGNoZWNrUmVjb3JkVGhyZWFkX2woaW5wdXQpOwogICAgICAgICBpZiAodGhyZWFkID09IE5VTEwpIHsKICAgICAgICAgICAgIEFMT0dFKCJvcGVuUmVjb3JkKCkgY2hlY2tSZWNvcmRUaHJlYWRfbCBmYWlsZWQiKTsKICAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CkBAIC0xMjgzLDQyICsxNDI1LDU4IEBACiAgICAgICAgIH0KIAogICAgICAgICBwaWRfdCBwaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7Ci0gICAgICAgIGNsaWVudCA9IHJlZ2lzdGVyUGlkX2wocGlkKTsKKyAgICAgICAgY2xpZW50ID0gcmVnaXN0ZXJQaWQocGlkKTsKIAotICAgICAgICAvLyBJZiBubyBhdWRpbyBzZXNzaW9uIGlkIGlzIHByb3ZpZGVkLCBjcmVhdGUgb25lIGhlcmUKLSAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBOVUxMICYmICpzZXNzaW9uSWQgIT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKSB7CisgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gTlVMTCAmJiAqc2Vzc2lvbklkICE9IEFVRElPX1NFU1NJT05fQUxMT0NBVEUpIHsKICAgICAgICAgICAgIGxTZXNzaW9uSWQgPSAqc2Vzc2lvbklkOwogICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gaWYgbm8gYXVkaW8gc2Vzc2lvbiBpZCBpcyBwcm92aWRlZCwgY3JlYXRlIG9uZSBoZXJlCiAgICAgICAgICAgICBsU2Vzc2lvbklkID0gbmV4dFVuaXF1ZUlkKCk7CiAgICAgICAgICAgICBpZiAoc2Vzc2lvbklkICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAqc2Vzc2lvbklkID0gbFNlc3Npb25JZDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAvLyBjcmVhdGUgbmV3IHJlY29yZCB0cmFjay4KLSAgICAgICAgLy8gVGhlIHJlY29yZCB0cmFjayB1c2VzIG9uZSB0cmFjayBpbiBtSGFyZHdhcmVNaXhlclRocmVhZCBieSBjb252ZW50aW9uLgorICAgICAgICBBTE9HVigib3BlblJlY29yZCgpIGxTZXNzaW9uSWQ6ICVkIGlucHV0ICVkIiwgbFNlc3Npb25JZCwgaW5wdXQpOworCiAgICAgICAgIC8vIFRPRE86IHRoZSB1aWQgc2hvdWxkIGJlIHBhc3NlZCBpbiBhcyBhIHBhcmFtZXRlciB0byBvcGVuUmVjb3JkCiAgICAgICAgIHJlY29yZFRyYWNrID0gdGhyZWFkLT5jcmVhdGVSZWNvcmRUcmFja19sKGNsaWVudCwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgbFNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgbFNlc3Npb25JZCwgbm90aWZpY2F0aW9uRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCB0aWQsICZsU3RhdHVzKTsKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigobFN0YXR1cyA9PSBOT19FUlJPUikgJiYgKHJlY29yZFRyYWNrID09IDApKTsKKworICAgICAgICBpZiAobFN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgLy8gQ2hlY2sgaWYgb25lIGVmZmVjdCBjaGFpbiB3YXMgYXdhaXRpbmcgZm9yIGFuIEF1ZGlvUmVjb3JkIHRvIGJlIGNyZWF0ZWQgb24gdGhpcworICAgICAgICAgICAgLy8gc2Vzc2lvbiBhbmQgbW92ZSBpdCB0byB0aGlzIHRocmVhZC4KKyAgICAgICAgICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IGdldE9ycGhhbkVmZmVjdENoYWluX2woKGF1ZGlvX3Nlc3Npb25fdClsU2Vzc2lvbklkKTsKKyAgICAgICAgICAgIGlmIChjaGFpbiAhPSAwKSB7CisgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHRocmVhZC0+bUxvY2spOworICAgICAgICAgICAgICAgIHRocmVhZC0+YWRkRWZmZWN0Q2hhaW5fbChjaGFpbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CisKICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAvLyByZW1vdmUgbG9jYWwgc3Ryb25nIHJlZmVyZW5jZSB0byBDbGllbnQgYmVmb3JlIGRlbGV0aW5nIHRoZSBSZWNvcmRUcmFjayBzbyB0aGF0IHRoZQotICAgICAgICAvLyBDbGllbnQgZGVzdHJ1Y3RvciBpcyBjYWxsZWQgYnkgdGhlIFRyYWNrQmFzZSBkZXN0cnVjdG9yIHdpdGggbUxvY2sgaGVsZAotICAgICAgICBjbGllbnQuY2xlYXIoKTsKKyAgICAgICAgLy8gQ2xpZW50IGRlc3RydWN0b3IgaXMgY2FsbGVkIGJ5IHRoZSBUcmFja0Jhc2UgZGVzdHJ1Y3RvciB3aXRoIG1DbGllbnRMb2NrIGhlbGQKKyAgICAgICAgLy8gRG9uJ3QgaG9sZCBtQ2xpZW50TG9jayB3aGVuIHJlbGVhc2luZyB0aGUgcmVmZXJlbmNlIG9uIHRoZSB0cmFjayBhcyB0aGUKKyAgICAgICAgLy8gZGVzdHJ1Y3RvciB3aWxsIGFjcXVpcmUgaXQuCisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfY2wobUNsaWVudExvY2spOworICAgICAgICAgICAgY2xpZW50LmNsZWFyKCk7CisgICAgICAgIH0KICAgICAgICAgcmVjb3JkVHJhY2suY2xlYXIoKTsKICAgICAgICAgZ290byBFeGl0OwogICAgIH0KIAotICAgIC8vIHJldHVybiB0byBoYW5kbGUgdG8gY2xpZW50CisgICAgY2JsayA9IHJlY29yZFRyYWNrLT5nZXRDYmxrKCk7CisgICAgYnVmZmVycyA9IHJlY29yZFRyYWNrLT5nZXRCdWZmZXJzKCk7CisKKyAgICAvLyByZXR1cm4gaGFuZGxlIHRvIGNsaWVudAogICAgIHJlY29yZEhhbmRsZSA9IG5ldyBSZWNvcmRIYW5kbGUocmVjb3JkVHJhY2spOwotICAgIGxTdGF0dXMgPSBOT19FUlJPUjsKIAogRXhpdDoKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgICpzdGF0dXMgPSBsU3RhdHVzOwotICAgIH0KKyAgICAqc3RhdHVzID0gbFN0YXR1czsKICAgICByZXR1cm4gcmVjb3JkSGFuZGxlOwogfQogCkBAIC0xMzI4LDYgKzE0ODYsOSBAQAogCiBhdWRpb19tb2R1bGVfaGFuZGxlX3QgQXVkaW9GbGluZ2VyOjpsb2FkSHdNb2R1bGUoY29uc3QgY2hhciAqbmFtZSkKIHsKKyAgICBpZiAobmFtZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KICAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTE0MDYsNyArMTU2Nyw3IEBACiAgICAgfQogCiAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGhhbmRsZSA9IG5leHRVbmlxdWVJZCgpOwotICAgIG1BdWRpb0h3RGV2cy5hZGQoaGFuZGxlLCBuZXcgQXVkaW9Id0RldmljZShuYW1lLCBkZXYsIGZsYWdzKSk7CisgICAgbUF1ZGlvSHdEZXZzLmFkZChoYW5kbGUsIG5ldyBBdWRpb0h3RGV2aWNlKGhhbmRsZSwgbmFtZSwgZGV2LCBmbGFncykpOwogCiAgICAgQUxPR0koImxvYWRId01vZHVsZSgpIExvYWRlZCAlcyBhdWRpbyBpbnRlcmZhY2UgZnJvbSAlcyAoJXMpIGhhbmRsZSAlZCIsCiAgICAgICAgICAgbmFtZSwgZGV2LT5jb21tb24ubW9kdWxlLT5uYW1lLCBkZXYtPmNvbW1vbi5tb2R1bGUtPmlkLCBoYW5kbGUpOwpAQCAtMTQ0OCwxMTcgKzE2MDksMTU1IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCithdWRpb19od19zeW5jX3QgQXVkaW9GbGluZ2VyOjpnZXRBdWRpb0h3U3luY0ZvclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXliYWNrVGhyZWFkcy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxQbGF5YmFja1RocmVhZD4gdGhyZWFkID0gbVBsYXliYWNrVGhyZWFkcy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoKHRocmVhZC0+aGFzQXVkaW9TZXNzaW9uKHNlc3Npb25JZCkgJiBUaHJlYWRCYXNlOjpUUkFDS19TRVNTSU9OKSAhPSAwKSB7CisgICAgICAgICAgICAvLyBBIHNlc3Npb24gY2FuIG9ubHkgYmUgb24gb25lIHRocmVhZCwgc28gZXhpdCBhZnRlciBmaXJzdCBtYXRjaAorICAgICAgICAgICAgU3RyaW5nOCByZXBseSA9IHRocmVhZC0+Z2V0UGFyYW1ldGVycyhTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fSFdfQVZfU1lOQykpOworICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihyZXBseSk7CisgICAgICAgICAgICBpbnQgdmFsdWU7CisgICAgICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9IV19BVl9TWU5DKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEFVRElPX0hXX1NZTkNfSU5WQUxJRDsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1hdWRpb19pb19oYW5kbGVfdCBBdWRpb0ZsaW5nZXI6Om9wZW5PdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKnBEZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpwRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICpwQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBMYXRlbmN5TXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQorCitzcDxBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkPiBBdWRpb0ZsaW5nZXI6Om9wZW5PdXRwdXRfbChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncykKIHsKLSAgICBQbGF5YmFja1RocmVhZCAqdGhyZWFkID0gTlVMTDsKLSAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnIGNvbmZpZzsKLSAgICBjb25maWcuc2FtcGxlX3JhdGUgPSAocFNhbXBsaW5nUmF0ZSAhPSBOVUxMKSA/ICpwU2FtcGxpbmdSYXRlIDogMDsKLSAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gKHBDaGFubmVsTWFzayAhPSBOVUxMKSA/ICpwQ2hhbm5lbE1hc2sgOiAwOwotICAgIGNvbmZpZy5mb3JtYXQgPSAocEZvcm1hdCAhPSBOVUxMKSA/ICpwRm9ybWF0IDogQVVESU9fRk9STUFUX0RFRkFVTFQ7Ci0gICAgaWYgKG9mZmxvYWRJbmZvKSB7Ci0gICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8gPSAqb2ZmbG9hZEluZm87CisgICAgQXVkaW9Id0RldmljZSAqb3V0SHdEZXYgPSBmaW5kU3VpdGFibGVId0Rldl9sKG1vZHVsZSwgZGV2aWNlcyk7CisgICAgaWYgKG91dEh3RGV2ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgYXVkaW9fc3RyZWFtX291dF90ICpvdXRTdHJlYW0gPSBOVUxMOwotICAgIEF1ZGlvSHdEZXZpY2UgKm91dEh3RGV2OworICAgIGF1ZGlvX2h3X2RldmljZV90ICpod0RldkhhbCA9IG91dEh3RGV2LT5od0RldmljZSgpOworICAgIGlmICgqb3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgICpvdXRwdXQgPSBuZXh0VW5pcXVlSWQoKTsKKyAgICB9CiAKKyAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19PVVRQVVRfT1BFTjsKKworICAgIGF1ZGlvX3N0cmVhbV9vdXRfdCAqb3V0U3RyZWFtID0gTlVMTDsKKworICAgIC8vIEZPUiBURVNUSU5HIE9OTFk6CisgICAgLy8gVGhpcyBpZiBzdGF0ZW1lbnQgYWxsb3dzIG92ZXJyaWRpbmcgdGhlIGF1ZGlvIHBvbGljeSBzZXR0aW5ncworICAgIC8vIGFuZCBmb3JjaW5nIGEgc3BlY2lmaWMgZm9ybWF0IG9yIGNoYW5uZWwgbWFzayB0byB0aGUgSEFML1NpbmsgZGV2aWNlIGZvciB0ZXN0aW5nLgorICAgIGlmICghKGZsYWdzICYgKEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpKSkgeworICAgICAgICAvLyBDaGVjayBvbmx5IGZvciBOb3JtYWwgTWl4aW5nIG1vZGUKKyAgICAgICAgaWYgKGtFbmFibGVFeHRlbmRlZFByZWNpc2lvbikgeworICAgICAgICAgICAgLy8gU3BlY2lmeSBmb3JtYXQgKHVuY29tbWVudCBvbmUgYmVsb3cgdG8gY2hvb3NlKQorICAgICAgICAgICAgLy9jb25maWctPmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisgICAgICAgICAgICAvL2NvbmZpZy0+Zm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEOworICAgICAgICAgICAgLy9jb25maWctPmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMzJfQklUOworICAgICAgICAgICAgLy9jb25maWctPmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fOF8yNF9CSVQ7CisgICAgICAgICAgICAvLyBBTE9HVigib3Blbk91dHB1dF9sKCkgdXBncmFkaW5nIGZvcm1hdCB0byAlIzA4eCIsIGNvbmZpZy0+Zm9ybWF0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoa0VuYWJsZUV4dGVuZGVkQ2hhbm5lbHMpIHsKKyAgICAgICAgICAgIC8vIFNwZWNpZnkgY2hhbm5lbCBtYXNrICh1bmNvbW1lbnQgb25lIGJlbG93IHRvIGNob29zZSkKKyAgICAgICAgICAgIC8vY29uZmlnLT5jaGFubmVsX21hc2sgPSBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQoNCk7ICAvLyBmb3IgVVNCIDRjaAorICAgICAgICAgICAgLy9jb25maWctPmNoYW5uZWxfbWFzayA9IGF1ZGlvX2NoYW5uZWxfbWFza19mcm9tX3JlcHJlc2VudGF0aW9uX2FuZF9iaXRzKAorICAgICAgICAgICAgLy8gICAgICAgIEFVRElPX0NIQU5ORUxfUkVQUkVTRU5UQVRJT05fSU5ERVgsICgxIDw8IDQpIC0gMSk7ICAvLyBhbm90aGVyIDRjaCBleGFtcGxlCisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBod0RldkhhbC0+b3Blbl9vdXRwdXRfc3RyZWFtKGh3RGV2SGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmluZygpKTsKKworICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX0lETEU7CisgICAgQUxPR1YoIm9wZW5PdXRwdXRfbCgpIG9wZW5PdXRwdXRTdHJlYW0gcmV0dXJuZWQgb3V0cHV0ICVwLCBzYW1wbGVSYXRlICVkLCBGb3JtYXQgJSN4LCAiCisgICAgICAgICAgICAiY2hhbm5lbE1hc2sgJSN4LCBzdGF0dXMgJWQiLAorICAgICAgICAgICAgb3V0U3RyZWFtLAorICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgIGNvbmZpZy0+Zm9ybWF0LAorICAgICAgICAgICAgY29uZmlnLT5jaGFubmVsX21hc2ssCisgICAgICAgICAgICBzdGF0dXMpOworCisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiBvdXRTdHJlYW0gIT0gTlVMTCkgeworICAgICAgICBBdWRpb1N0cmVhbU91dCAqb3V0cHV0U3RyZWFtID0gbmV3IEF1ZGlvU3RyZWFtT3V0KG91dEh3RGV2LCBvdXRTdHJlYW0sIGZsYWdzKTsKKworICAgICAgICBQbGF5YmFja1RocmVhZCAqdGhyZWFkOworICAgICAgICBpZiAoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSB7CisgICAgICAgICAgICB0aHJlYWQgPSBuZXcgT2ZmbG9hZFRocmVhZCh0aGlzLCBvdXRwdXRTdHJlYW0sICpvdXRwdXQsIGRldmljZXMpOworICAgICAgICAgICAgQUxPR1YoIm9wZW5PdXRwdXRfbCgpIGNyZWF0ZWQgb2ZmbG9hZCBvdXRwdXQ6IElEICVkIHRocmVhZCAlcCIsICpvdXRwdXQsIHRocmVhZCk7CisgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKQorICAgICAgICAgICAgICAgIHx8ICFpc1ZhbGlkUGNtU2lua0Zvcm1hdChjb25maWctPmZvcm1hdCkKKyAgICAgICAgICAgICAgICB8fCAhaXNWYWxpZFBjbVNpbmtDaGFubmVsTWFzayhjb25maWctPmNoYW5uZWxfbWFzaykpIHsKKyAgICAgICAgICAgIHRocmVhZCA9IG5ldyBEaXJlY3RPdXRwdXRUaHJlYWQodGhpcywgb3V0cHV0U3RyZWFtLCAqb3V0cHV0LCBkZXZpY2VzKTsKKyAgICAgICAgICAgIEFMT0dWKCJvcGVuT3V0cHV0X2woKSBjcmVhdGVkIGRpcmVjdCBvdXRwdXQ6IElEICVkIHRocmVhZCAlcCIsICpvdXRwdXQsIHRocmVhZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJlYWQgPSBuZXcgTWl4ZXJUaHJlYWQodGhpcywgb3V0cHV0U3RyZWFtLCAqb3V0cHV0LCBkZXZpY2VzKTsKKyAgICAgICAgICAgIEFMT0dWKCJvcGVuT3V0cHV0X2woKSBjcmVhdGVkIG1peGVyIG91dHB1dDogSUQgJWQgdGhyZWFkICVwIiwgKm91dHB1dCwgdGhyZWFkKTsKKyAgICAgICAgfQorICAgICAgICBtUGxheWJhY2tUaHJlYWRzLmFkZCgqb3V0cHV0LCB0aHJlYWQpOworICAgICAgICByZXR1cm4gdGhyZWFkOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Om9wZW5PdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmxhdGVuY3lNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncykKK3sKICAgICBBTE9HVigib3Blbk91dHB1dCgpLCBtb2R1bGUgJWQgRGV2aWNlICV4LCBTYW1wbGluZ1JhdGUgJWQsIEZvcm1hdCAlIzA4eCwgQ2hhbm5lbHMgJXgsIGZsYWdzICV4IiwKICAgICAgICAgICAgICAgbW9kdWxlLAotICAgICAgICAgICAgICAocERldmljZXMgIT0gTlVMTCkgPyAqcERldmljZXMgOiAwLAotICAgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUsCi0gICAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQsCi0gICAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2ssCisgICAgICAgICAgICAgIChkZXZpY2VzICE9IE5VTEwpID8gKmRldmljZXMgOiAwLAorICAgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgICBjb25maWctPmZvcm1hdCwKKyAgICAgICAgICAgICAgY29uZmlnLT5jaGFubmVsX21hc2ssCiAgICAgICAgICAgICAgIGZsYWdzKTsKLSAgICBBTE9HVigib3Blbk91dHB1dCgpLCBvZmZsb2FkSW5mbyAlcCB2ZXJzaW9uIDB4JTA0eCIsCi0gICAgICAgICAgb2ZmbG9hZEluZm8sIG9mZmxvYWRJbmZvID09IE5VTEwgPyAtMSA6IG9mZmxvYWRJbmZvLT52ZXJzaW9uICk7CiAKLSAgICBpZiAocERldmljZXMgPT0gTlVMTCB8fCAqcERldmljZXMgPT0gMCkgewotICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoKmRldmljZXMgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCi0gICAgb3V0SHdEZXYgPSBmaW5kU3VpdGFibGVId0Rldl9sKG1vZHVsZSwgKnBEZXZpY2VzKTsKLSAgICBpZiAob3V0SHdEZXYgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBhdWRpb19od19kZXZpY2VfdCAqaHdEZXZIYWwgPSBvdXRId0Rldi0+aHdEZXZpY2UoKTsKLSAgICBhdWRpb19pb19oYW5kbGVfdCBpZCA9IG5leHRVbmlxdWVJZCgpOwotCi0gICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfT1VUUFVUX09QRU47Ci0KLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBod0RldkhhbC0+b3Blbl9vdXRwdXRfc3RyZWFtKGh3RGV2SGFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFN0cmVhbSk7Ci0KLSAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19JRExFOwotICAgIEFMT0dWKCJvcGVuT3V0cHV0KCkgb3Blbk91dHB1dFN0cmVhbSByZXR1cm5lZCBvdXRwdXQgJXAsIFNhbXBsaW5nUmF0ZSAlZCwgRm9ybWF0ICUjMDh4LCAiCi0gICAgICAgICAgICAiQ2hhbm5lbHMgJXgsIHN0YXR1cyAlZCIsCi0gICAgICAgICAgICBvdXRTdHJlYW0sCi0gICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUsCi0gICAgICAgICAgICBjb25maWcuZm9ybWF0LAotICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzaywKLSAgICAgICAgICAgIHN0YXR1cyk7Ci0KLSAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIG91dFN0cmVhbSAhPSBOVUxMKSB7Ci0gICAgICAgIEF1ZGlvU3RyZWFtT3V0ICpvdXRwdXQgPSBuZXcgQXVkaW9TdHJlYW1PdXQob3V0SHdEZXYsIG91dFN0cmVhbSwgZmxhZ3MpOwotCi0gICAgICAgIGlmIChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpIHsKLSAgICAgICAgICAgIHRocmVhZCA9IG5ldyBPZmZsb2FkVGhyZWFkKHRoaXMsIG91dHB1dCwgaWQsICpwRGV2aWNlcyk7Ci0gICAgICAgICAgICBBTE9HVigib3Blbk91dHB1dCgpIGNyZWF0ZWQgb2ZmbG9hZCBvdXRwdXQ6IElEICVkIHRocmVhZCAlcCIsIGlkLCB0aHJlYWQpOwotICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgfHwKLSAgICAgICAgICAgIChjb25maWcuZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB8fAotICAgICAgICAgICAgKGNvbmZpZy5jaGFubmVsX21hc2sgIT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSkgewotICAgICAgICAgICAgdGhyZWFkID0gbmV3IERpcmVjdE91dHB1dFRocmVhZCh0aGlzLCBvdXRwdXQsIGlkLCAqcERldmljZXMpOwotICAgICAgICAgICAgQUxPR1YoIm9wZW5PdXRwdXQoKSBjcmVhdGVkIGRpcmVjdCBvdXRwdXQ6IElEICVkIHRocmVhZCAlcCIsIGlkLCB0aHJlYWQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyZWFkID0gbmV3IE1peGVyVGhyZWFkKHRoaXMsIG91dHB1dCwgaWQsICpwRGV2aWNlcyk7Ci0gICAgICAgICAgICBBTE9HVigib3Blbk91dHB1dCgpIGNyZWF0ZWQgbWl4ZXIgb3V0cHV0OiBJRCAlZCB0aHJlYWQgJXAiLCBpZCwgdGhyZWFkKTsKLSAgICAgICAgfQotICAgICAgICBtUGxheWJhY2tUaHJlYWRzLmFkZChpZCwgdGhyZWFkKTsKLQotICAgICAgICBpZiAocFNhbXBsaW5nUmF0ZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAqcFNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAocEZvcm1hdCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAqcEZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBDaGFubmVsTWFzayAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAqcENoYW5uZWxNYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKLSAgICAgICAgfQotICAgICAgICBpZiAocExhdGVuY3lNcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAqcExhdGVuY3lNcyA9IHRocmVhZC0+bGF0ZW5jeSgpOwotICAgICAgICB9CisgICAgc3A8UGxheWJhY2tUaHJlYWQ+IHRocmVhZCA9IG9wZW5PdXRwdXRfbChtb2R1bGUsIG91dHB1dCwgY29uZmlnLCAqZGV2aWNlcywgYWRkcmVzcywgZmxhZ3MpOworICAgIGlmICh0aHJlYWQgIT0gMCkgeworICAgICAgICAqbGF0ZW5jeU1zID0gdGhyZWFkLT5sYXRlbmN5KCk7CiAKICAgICAgICAgLy8gbm90aWZ5IGNsaWVudCBwcm9jZXNzZXMgb2YgdGhlIG5ldyBvdXRwdXQgY3JlYXRpb24KLSAgICAgICAgdGhyZWFkLT5hdWRpb0NvbmZpZ0NoYW5nZWRfbChBdWRpb1N5c3RlbTo6T1VUUFVUX09QRU5FRCk7CisgICAgICAgIHRocmVhZC0+YXVkaW9Db25maWdDaGFuZ2VkKEF1ZGlvU3lzdGVtOjpPVVRQVVRfT1BFTkVEKTsKIAogICAgICAgICAvLyB0aGUgZmlyc3QgcHJpbWFyeSBvdXRwdXQgb3BlbmVkIGRlc2lnbmF0ZXMgdGhlIHByaW1hcnkgaHcgZGV2aWNlCiAgICAgICAgIGlmICgobVByaW1hcnlIYXJkd2FyZURldiA9PSBOVUxMKSAmJiAoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19QUklNQVJZKSkgewogICAgICAgICAgICAgQUxPR0koIlVzaW5nIG1vZHVsZSAlZCBoYXMgdGhlIHByaW1hcnkgYXVkaW8gaW50ZXJmYWNlIiwgbW9kdWxlKTsKLSAgICAgICAgICAgIG1QcmltYXJ5SGFyZHdhcmVEZXYgPSBvdXRId0RldjsKKyAgICAgICAgICAgIG1QcmltYXJ5SGFyZHdhcmVEZXYgPSB0aHJlYWQtPmdldE91dHB1dCgpLT5hdWRpb0h3RGV2OwogCiAgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtSGFyZHdhcmVMb2NrKTsKICAgICAgICAgICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX1NFVF9NT0RFOwotICAgICAgICAgICAgaHdEZXZIYWwtPnNldF9tb2RlKGh3RGV2SGFsLCBtTW9kZSk7CisgICAgICAgICAgICBtUHJpbWFyeUhhcmR3YXJlRGV2LT5od0RldmljZSgpLT5zZXRfbW9kZShtUHJpbWFyeUhhcmR3YXJlRGV2LT5od0RldmljZSgpLCBtTW9kZSk7CiAgICAgICAgICAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19JRExFOworCisgICAgICAgICAgICBtUHJpbWFyeU91dHB1dFNhbXBsZVJhdGUgPSBjb25maWctPnNhbXBsZV9yYXRlOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpZDsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KIAotICAgIHJldHVybiAwOworICAgIHJldHVybiBOT19JTklUOwogfQogCiBhdWRpb19pb19oYW5kbGVfdCBBdWRpb0ZsaW5nZXI6Om9wZW5EdXBsaWNhdGVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MSwKQEAgLTE1NzEsNyArMTc3MCw3IEBACiAgICAgaWYgKHRocmVhZDEgPT0gTlVMTCB8fCB0aHJlYWQyID09IE5VTEwpIHsKICAgICAgICAgQUxPR1coIm9wZW5EdXBsaWNhdGVPdXRwdXQoKSB3cm9uZyBvdXRwdXQgbWl4ZXIgdHlwZSBmb3Igb3V0cHV0ICVkIG9yICVkIiwgb3V0cHV0MSwKICAgICAgICAgICAgICAgICBvdXRwdXQyKTsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICB9CiAKICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCA9IG5leHRVbmlxdWVJZCgpOwpAQCAtMTU3OSw3ICsxNzc4LDcgQEAKICAgICB0aHJlYWQtPmFkZE91dHB1dFRyYWNrKHRocmVhZDIpOwogICAgIG1QbGF5YmFja1RocmVhZHMuYWRkKGlkLCB0aHJlYWQpOwogICAgIC8vIG5vdGlmeSBjbGllbnQgcHJvY2Vzc2VzIG9mIHRoZSBuZXcgb3V0cHV0IGNyZWF0aW9uCi0gICAgdGhyZWFkLT5hdWRpb0NvbmZpZ0NoYW5nZWRfbChBdWRpb1N5c3RlbTo6T1VUUFVUX09QRU5FRCk7CisgICAgdGhyZWFkLT5hdWRpb0NvbmZpZ0NoYW5nZWQoQXVkaW9TeXN0ZW06Ok9VVFBVVF9PUEVORUQpOwogICAgIHJldHVybiBpZDsKIH0KIApAQCAtMTYyOCwyMiArMTgyNywzNSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBhdWRpb0NvbmZpZ0NoYW5nZWRfbChBdWRpb1N5c3RlbTo6T1VUUFVUX0NMT1NFRCwgb3V0cHV0LCBOVUxMKTsKKyAgICAgICAgYXVkaW9Db25maWdDaGFuZ2VkKEF1ZGlvU3lzdGVtOjpPVVRQVVRfQ0xPU0VELCBvdXRwdXQsIE5VTEwpOwogICAgIH0KICAgICB0aHJlYWQtPmV4aXQoKTsKICAgICAvLyBUaGUgdGhyZWFkIGVudGl0eSAoYWN0aXZlIHVuaXQgb2YgZXhlY3V0aW9uKSBpcyBubyBsb25nZXIgcnVubmluZyBoZXJlLAogICAgIC8vIGJ1dCB0aGUgVGhyZWFkQmFzZSBjb250YWluZXIgc3RpbGwgZXhpc3RzLgogCiAgICAgaWYgKCF0aHJlYWQtPmlzRHVwbGljYXRpbmcoKSkgewotICAgICAgICBBdWRpb1N0cmVhbU91dCAqb3V0ID0gdGhyZWFkLT5jbGVhck91dHB1dCgpOwotICAgICAgICBBTE9HX0FTU0VSVChvdXQgIT0gTlVMTCwgIm91dCBzaG91bGRuJ3QgYmUgTlVMTCIpOwotICAgICAgICAvLyBmcm9tIG5vdyBvbiB0aHJlYWQtPm1PdXRwdXQgaXMgTlVMTAotICAgICAgICBvdXQtPmh3RGV2KCktPmNsb3NlX291dHB1dF9zdHJlYW0ob3V0LT5od0RldigpLCBvdXQtPnN0cmVhbSk7Ci0gICAgICAgIGRlbGV0ZSBvdXQ7CisgICAgICAgIGNsb3NlT3V0cHV0RmluaXNoKHRocmVhZCk7CiAgICAgfQorCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6Y2xvc2VPdXRwdXRGaW5pc2goc3A8UGxheWJhY2tUaHJlYWQ+IHRocmVhZCkKK3sKKyAgICBBdWRpb1N0cmVhbU91dCAqb3V0ID0gdGhyZWFkLT5jbGVhck91dHB1dCgpOworICAgIEFMT0dfQVNTRVJUKG91dCAhPSBOVUxMLCAib3V0IHNob3VsZG4ndCBiZSBOVUxMIik7CisgICAgLy8gZnJvbSBub3cgb24gdGhyZWFkLT5tT3V0cHV0IGlzIE5VTEwKKyAgICBvdXQtPmh3RGV2KCktPmNsb3NlX291dHB1dF9zdHJlYW0ob3V0LT5od0RldigpLCBvdXQtPnN0cmVhbSk7CisgICAgZGVsZXRlIG91dDsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OmNsb3NlT3V0cHV0SW50ZXJuYWxfbChzcDxQbGF5YmFja1RocmVhZD4gdGhyZWFkKQoreworICAgIG1QbGF5YmFja1RocmVhZHMucmVtb3ZlSXRlbSh0aHJlYWQtPm1JZCk7CisgICAgdGhyZWFkLT5leGl0KCk7CisgICAgY2xvc2VPdXRwdXRGaW5pc2godGhyZWFkKTsKK30KKwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpzdXNwZW5kT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtMTY3NSw1OCArMTg4Nyw3NiBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotYXVkaW9faW9faGFuZGxlX3QgQXVkaW9GbGluZ2VyOjpvcGVuSW5wdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqcERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpwRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKnBDaGFubmVsTWFzaykKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6b3BlbklucHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykKIHsKLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgUmVjb3JkVGhyZWFkICp0aHJlYWQgPSBOVUxMOwotICAgIHN0cnVjdCBhdWRpb19jb25maWcgY29uZmlnOwotICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IChwU2FtcGxpbmdSYXRlICE9IE5VTEwpID8gKnBTYW1wbGluZ1JhdGUgOiAwOwotICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSAocENoYW5uZWxNYXNrICE9IE5VTEwpID8gKnBDaGFubmVsTWFzayA6IDA7Ci0gICAgY29uZmlnLmZvcm1hdCA9IChwRm9ybWF0ICE9IE5VTEwpID8gKnBGb3JtYXQgOiBBVURJT19GT1JNQVRfREVGQVVMVDsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCi0gICAgdWludDMyX3QgcmVxU2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOwotICAgIGF1ZGlvX2Zvcm1hdF90IHJlcUZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7Ci0gICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgcmVxQ2hhbm5lbHMgPSBjb25maWcuY2hhbm5lbF9tYXNrOwotICAgIGF1ZGlvX3N0cmVhbV9pbl90ICppblN0cmVhbSA9IE5VTEw7Ci0gICAgQXVkaW9Id0RldmljZSAqaW5Id0RldjsKKyAgICBpZiAoKmRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KIAotICAgIGlmIChwRGV2aWNlcyA9PSBOVUxMIHx8ICpwRGV2aWNlcyA9PSAwKSB7CisgICAgc3A8UmVjb3JkVGhyZWFkPiB0aHJlYWQgPSBvcGVuSW5wdXRfbChtb2R1bGUsIGlucHV0LCBjb25maWcsICpkZXZpY2UsIGFkZHJlc3MsIHNvdXJjZSwgZmxhZ3MpOworCisgICAgaWYgKHRocmVhZCAhPSAwKSB7CisgICAgICAgIC8vIG5vdGlmeSBjbGllbnQgcHJvY2Vzc2VzIG9mIHRoZSBuZXcgaW5wdXQgY3JlYXRpb24KKyAgICAgICAgdGhyZWFkLT5hdWRpb0NvbmZpZ0NoYW5nZWQoQXVkaW9TeXN0ZW06OklOUFVUX09QRU5FRCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIE5PX0lOSVQ7Cit9CisKK3NwPEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkPiBBdWRpb0ZsaW5nZXI6Om9wZW5JbnB1dF9sKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKQoreworICAgIEF1ZGlvSHdEZXZpY2UgKmluSHdEZXYgPSBmaW5kU3VpdGFibGVId0Rldl9sKG1vZHVsZSwgZGV2aWNlKTsKKyAgICBpZiAoaW5Id0RldiA9PSBOVUxMKSB7CisgICAgICAgICppbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmICgqaW5wdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgKmlucHV0ID0gbmV4dFVuaXF1ZUlkKCk7CisgICAgfQogCi0gICAgaW5Id0RldiA9IGZpbmRTdWl0YWJsZUh3RGV2X2wobW9kdWxlLCAqcERldmljZXMpOwotICAgIGlmIChpbkh3RGV2ID09IE5VTEwpCi0gICAgICAgIHJldHVybiAwOwotCisgICAgYXVkaW9fY29uZmlnX3QgaGFsY29uZmlnID0gKmNvbmZpZzsKICAgICBhdWRpb19od19kZXZpY2VfdCAqaW5Id0hhbCA9IGluSHdEZXYtPmh3RGV2aWNlKCk7Ci0gICAgYXVkaW9faW9faGFuZGxlX3QgaWQgPSBuZXh0VW5pcXVlSWQoKTsKLQotICAgIHN0YXR1cyA9IGluSHdIYWwtPm9wZW5faW5wdXRfc3RyZWFtKGluSHdIYWwsIGlkLCAqcERldmljZXMsICZjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU3RyZWFtKTsKLSAgICBBTE9HVigib3BlbklucHV0KCkgb3BlbklucHV0U3RyZWFtIHJldHVybmVkIGlucHV0ICVwLCBTYW1wbGluZ1JhdGUgJWQsIEZvcm1hdCAlZCwgQ2hhbm5lbHMgJXgsICIKLSAgICAgICAgICAgICJzdGF0dXMgJWQiLAorICAgIGF1ZGlvX3N0cmVhbV9pbl90ICppblN0cmVhbSA9IE5VTEw7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5Id0hhbC0+b3Blbl9pbnB1dF9zdHJlYW0oaW5Id0hhbCwgKmlucHV0LCBkZXZpY2UsICZoYWxjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU3RyZWFtLCBmbGFncywgYWRkcmVzcy5zdHJpbmcoKSwgc291cmNlKTsKKyAgICBBTE9HVigib3BlbklucHV0X2woKSBvcGVuSW5wdXRTdHJlYW0gcmV0dXJuZWQgaW5wdXQgJXAsIFNhbXBsaW5nUmF0ZSAlZCIKKyAgICAgICAgICAgIiwgRm9ybWF0ICUjeCwgQ2hhbm5lbHMgJXgsIGZsYWdzICUjeCwgc3RhdHVzICVkIiwKICAgICAgICAgICAgIGluU3RyZWFtLAotICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlLAotICAgICAgICAgICAgY29uZmlnLmZvcm1hdCwKLSAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2ssCisgICAgICAgICAgICBoYWxjb25maWcuc2FtcGxlX3JhdGUsCisgICAgICAgICAgICBoYWxjb25maWcuZm9ybWF0LAorICAgICAgICAgICAgaGFsY29uZmlnLmNoYW5uZWxfbWFzaywKKyAgICAgICAgICAgIGZsYWdzLAogICAgICAgICAgICAgc3RhdHVzKTsKIAogICAgIC8vIElmIHRoZSBpbnB1dCBjb3VsZCBub3QgYmUgb3BlbmVkIHdpdGggdGhlIHJlcXVlc3RlZCBwYXJhbWV0ZXJzIGFuZCB3ZSBjYW4gaGFuZGxlIHRoZQogICAgIC8vIGNvbnZlcnNpb24gaW50ZXJuYWxseSwgdHJ5IHRvIG9wZW4gYWdhaW4gd2l0aCB0aGUgcHJvcG9zZWQgcGFyYW1ldGVycy4gVGhlIEF1ZGlvRmxpbmdlciBjYW4KICAgICAvLyByZXNhbXBsZSB0aGUgaW5wdXQgYW5kIGRvIG1vbm8gdG8gc3RlcmVvIG9yIHN0ZXJlbyB0byBtb25vIGNvbnZlcnNpb25zIG9uIDE2IGJpdCBQQ00gaW5wdXRzLgogICAgIGlmIChzdGF0dXMgPT0gQkFEX1ZBTFVFICYmCi0gICAgICAgIHJlcUZvcm1hdCA9PSBjb25maWcuZm9ybWF0ICYmIGNvbmZpZy5mb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgJiYKLSAgICAgICAgKGNvbmZpZy5zYW1wbGVfcmF0ZSA8PSAyICogcmVxU2FtcGxpbmdSYXRlKSAmJgotICAgICAgICAocG9wY291bnQoY29uZmlnLmNoYW5uZWxfbWFzaykgPD0gRkNDXzIpICYmIChwb3Bjb3VudChyZXFDaGFubmVscykgPD0gRkNDXzIpKSB7Ci0gICAgICAgIEFMT0dWKCJvcGVuSW5wdXQoKSByZW9wZW5pbmcgd2l0aCBwcm9wb3NlZCBzYW1wbGluZyByYXRlIGFuZCBjaGFubmVsIG1hc2siKTsKKyAgICAgICAgICAgIGNvbmZpZy0+Zm9ybWF0ID09IGhhbGNvbmZpZy5mb3JtYXQgJiYgaGFsY29uZmlnLmZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCAmJgorICAgICAgICAoaGFsY29uZmlnLnNhbXBsZV9yYXRlIDw9IDIgKiBjb25maWctPnNhbXBsZV9yYXRlKSAmJgorICAgICAgICAoYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soaGFsY29uZmlnLmNoYW5uZWxfbWFzaykgPD0gRkNDXzIpICYmCisgICAgICAgIChhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjb25maWctPmNoYW5uZWxfbWFzaykgPD0gRkNDXzIpKSB7CisgICAgICAgIC8vIEZJWE1FIGRlc2NyaWJlIHRoZSBjaGFuZ2UgcHJvcG9zZWQgYnkgSEFMIChzYXZlIG9sZCB2YWx1ZXMgc28gd2UgY2FuIGxvZyB0aGVtIGhlcmUpCisgICAgICAgIEFMT0dWKCJvcGVuSW5wdXRfbCgpIHJlb3BlbmluZyB3aXRoIHByb3Bvc2VkIHNhbXBsaW5nIHJhdGUgYW5kIGNoYW5uZWwgbWFzayIpOwogICAgICAgICBpblN0cmVhbSA9IE5VTEw7Ci0gICAgICAgIHN0YXR1cyA9IGluSHdIYWwtPm9wZW5faW5wdXRfc3RyZWFtKGluSHdIYWwsIGlkLCAqcERldmljZXMsICZjb25maWcsICZpblN0cmVhbSk7CisgICAgICAgIHN0YXR1cyA9IGluSHdIYWwtPm9wZW5faW5wdXRfc3RyZWFtKGluSHdIYWwsICppbnB1dCwgZGV2aWNlLCAmaGFsY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdHJlYW0sIGZsYWdzLCBhZGRyZXNzLnN0cmluZygpLCBzb3VyY2UpOworICAgICAgICAvLyBGSVhNRSBsb2cgdGhpcyBuZXcgc3RhdHVzOyBIQUwgc2hvdWxkIG5vdCBwcm9wb3NlIGFueSBmdXJ0aGVyIGNoYW5nZXMKICAgICB9CiAKICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIGluU3RyZWFtICE9IE5VTEwpIHsKQEAgLTE3NDAsMTcgKzE5NzAsMTcgQEAKICAgICAgICAgICAgIFRFRV9TSU5LX05FVywgICAvLyBjb3B5IGlucHV0IHVzaW5nIGEgbmV3IHBpcGUKICAgICAgICAgICAgIFRFRV9TSU5LX09MRCwgICAvLyBjb3B5IGlucHV0IHVzaW5nIGFuIGV4aXN0aW5nIHBpcGUKICAgICAgICAgfSBraW5kOwotICAgICAgICBOQkFJT19Gb3JtYXQgZm9ybWF0ID0gRm9ybWF0X2Zyb21fU1JfQyhpblN0cmVhbS0+Y29tbW9uLmdldF9zYW1wbGVfcmF0ZSgmaW5TdHJlYW0tPmNvbW1vbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wY291bnQoaW5TdHJlYW0tPmNvbW1vbi5nZXRfY2hhbm5lbHMoJmluU3RyZWFtLT5jb21tb24pKSk7CisgICAgICAgIE5CQUlPX0Zvcm1hdCBmb3JtYXQgPSBGb3JtYXRfZnJvbV9TUl9DKGhhbGNvbmZpZy5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhoYWxjb25maWcuY2hhbm5lbF9tYXNrKSwgaGFsY29uZmlnLmZvcm1hdCk7CiAgICAgICAgIGlmICghbVRlZVNpbmtJbnB1dEVuYWJsZWQpIHsKICAgICAgICAgICAgIGtpbmQgPSBURUVfU0lOS19OTzsKLSAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gRm9ybWF0X0ludmFsaWQpIHsKKyAgICAgICAgfSBlbHNlIGlmICghRm9ybWF0X2lzVmFsaWQoZm9ybWF0KSkgewogICAgICAgICAgICAga2luZCA9IFRFRV9TSU5LX05POwogICAgICAgICB9IGVsc2UgaWYgKG1SZWNvcmRUZWVTaW5rID09IDApIHsKICAgICAgICAgICAgIGtpbmQgPSBURUVfU0lOS19ORVc7CiAgICAgICAgIH0gZWxzZSBpZiAobVJlY29yZFRlZVNpbmstPmdldFN0cm9uZ0NvdW50KCkgIT0gMSkgewogICAgICAgICAgICAga2luZCA9IFRFRV9TSU5LX05POwotICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBtUmVjb3JkVGVlU2luay0+Zm9ybWF0KCkpIHsKKyAgICAgICAgfSBlbHNlIGlmIChGb3JtYXRfaXNFcXVhbChmb3JtYXQsIG1SZWNvcmRUZWVTaW5rLT5mb3JtYXQoKSkpIHsKICAgICAgICAgICAgIGtpbmQgPSBURUVfU0lOS19PTEQ7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBraW5kID0gVEVFX1NJTktfTkVXOwpAQCAtMTc4MCwzOSArMjAxMCwyNiBAQAogICAgICAgICB9CiAjZW5kaWYKIAotICAgICAgICBBdWRpb1N0cmVhbUluICppbnB1dCA9IG5ldyBBdWRpb1N0cmVhbUluKGluSHdEZXYsIGluU3RyZWFtKTsKKyAgICAgICAgQXVkaW9TdHJlYW1JbiAqaW5wdXRTdHJlYW0gPSBuZXcgQXVkaW9TdHJlYW1Jbihpbkh3RGV2LCBpblN0cmVhbSk7CiAKICAgICAgICAgLy8gU3RhcnQgcmVjb3JkIHRocmVhZAogICAgICAgICAvLyBSZWNvcmRUaHJlYWQgcmVxdWlyZXMgYm90aCBpbnB1dCBhbmQgb3V0cHV0IGRldmljZSBpbmRpY2F0aW9uIHRvIGZvcndhcmQgdG8gYXVkaW8KICAgICAgICAgLy8gcHJlIHByb2Nlc3NpbmcgbW9kdWxlcwotICAgICAgICB0aHJlYWQgPSBuZXcgUmVjb3JkVGhyZWFkKHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxU2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcUNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICBzcDxSZWNvcmRUaHJlYWQ+IHRocmVhZCA9IG5ldyBSZWNvcmRUaHJlYWQodGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeU91dHB1dERldmljZV9sKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBEZXZpY2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlCiAjaWZkZWYgVEVFX1NJTksKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIHRlZVNpbmsKICNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgIG1SZWNvcmRUaHJlYWRzLmFkZChpZCwgdGhyZWFkKTsKLSAgICAgICAgQUxPR1YoIm9wZW5JbnB1dCgpIGNyZWF0ZWQgcmVjb3JkIHRocmVhZDogSUQgJWQgdGhyZWFkICVwIiwgaWQsIHRocmVhZCk7Ci0gICAgICAgIGlmIChwU2FtcGxpbmdSYXRlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICpwU2FtcGxpbmdSYXRlID0gcmVxU2FtcGxpbmdSYXRlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwRm9ybWF0ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICpwRm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKLSAgICAgICAgfQotICAgICAgICBpZiAocENoYW5uZWxNYXNrICE9IE5VTEwpIHsKLSAgICAgICAgICAgICpwQ2hhbm5lbE1hc2sgPSByZXFDaGFubmVsczsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIG5vdGlmeSBjbGllbnQgcHJvY2Vzc2VzIG9mIHRoZSBuZXcgaW5wdXQgY3JlYXRpb24KLSAgICAgICAgdGhyZWFkLT5hdWRpb0NvbmZpZ0NoYW5nZWRfbChBdWRpb1N5c3RlbTo6SU5QVVRfT1BFTkVEKTsKLSAgICAgICAgcmV0dXJuIGlkOworICAgICAgICBtUmVjb3JkVGhyZWFkcy5hZGQoKmlucHV0LCB0aHJlYWQpOworICAgICAgICBBTE9HVigib3BlbklucHV0X2woKSBjcmVhdGVkIHJlY29yZCB0aHJlYWQ6IElEICVkIHRocmVhZCAlcCIsICppbnB1dCwgdGhyZWFkLmdldCgpKTsKKyAgICAgICAgcmV0dXJuIHRocmVhZDsKICAgICB9CiAKKyAgICAqaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMTgzNCwyNiArMjA1MSw3MiBAQAogICAgICAgICB9CiAKICAgICAgICAgQUxPR1YoImNsb3NlSW5wdXQoKSAlZCIsIGlucHV0KTsKLSAgICAgICAgYXVkaW9Db25maWdDaGFuZ2VkX2woQXVkaW9TeXN0ZW06OklOUFVUX0NMT1NFRCwgaW5wdXQsIE5VTEwpOworCisgICAgICAgIC8vIElmIHdlIHN0aWxsIGhhdmUgZWZmZWN0IGNoYWlucywgaXQgbWVhbnMgdGhhdCBhIGNsaWVudCBzdGlsbCBob2xkcyBhIGhhbmRsZQorICAgICAgICAvLyBvbiBhdCBsZWFzdCBvbmUgZWZmZWN0LiBXZSBtdXN0IGVpdGhlciBtb3ZlIHRoZSBjaGFpbiB0byBhbiBleGlzdGluZyB0aHJlYWQgd2l0aCB0aGUKKyAgICAgICAgLy8gc2FtZSBzZXNzaW9uIElEIG9yIHB1dCBpdCBhc2lkZSBpbiBjYXNlIGEgbmV3IHJlY29yZCB0aHJlYWQgaXMgb3BlbmVkIGZvciBhCisgICAgICAgIC8vIG5ldyBjYXB0dXJlIG9uIHRoZSBzYW1lIHNlc3Npb24KKyAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluOworICAgICAgICB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX3NsKHRocmVhZC0+bUxvY2spOworICAgICAgICAgICAgVmVjdG9yPCBzcDxFZmZlY3RDaGFpbj4gPiBlZmZlY3RDaGFpbnMgPSB0aHJlYWQtPmdldEVmZmVjdENoYWluc19sKCk7CisgICAgICAgICAgICAvLyBOb3RlOiBtYXhpbXVtIG9uZSBjaGFpbiBwZXIgcmVjb3JkIHRocmVhZAorICAgICAgICAgICAgaWYgKGVmZmVjdENoYWlucy5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgICAgIGNoYWluID0gZWZmZWN0Q2hhaW5zWzBdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjaGFpbiAhPSAwKSB7CisgICAgICAgICAgICAvLyBmaXJzdCBjaGVjayBpZiBhIHJlY29yZCB0aHJlYWQgaXMgYWxyZWFkeSBvcGVuZWQgd2l0aCBhIGNsaWVudCBvbiB0aGUgc2FtZSBzZXNzaW9uLgorICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgb25seSBoYXBwZW4gaW4gY2FzZSBvZiBvdmVybGFwIGJldHdlZW4gb25lIHRocmVhZCB0ZWFyIGRvd24gYW5kIHRoZQorICAgICAgICAgICAgLy8gY3JlYXRpb24gb2YgaXRzIHJlcGxhY2VtZW50CisgICAgICAgICAgICBzaXplX3QgaTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtUmVjb3JkVGhyZWFkcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIHNwPFJlY29yZFRocmVhZD4gdCA9IG1SZWNvcmRUaHJlYWRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKHQgPT0gdGhyZWFkKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodC0+aGFzQXVkaW9TZXNzaW9uKGNoYWluLT5zZXNzaW9uSWQoKSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodC0+bUxvY2spOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2xvc2VJbnB1dCgpIGZvdW5kIHRocmVhZCAlZCBmb3IgZWZmZWN0IHNlc3Npb24gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0LT5pZCgpLCBjaGFpbi0+c2Vzc2lvbklkKCkpOworICAgICAgICAgICAgICAgICAgICB0LT5hZGRFZmZlY3RDaGFpbl9sKGNoYWluKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gcHV0IHRoZSBjaGFpbiBhc2lkZSBpZiB3ZSBjb3VsZCBub3QgZmluZCBhIHJlY29yZCB0aHJlYWQgd2l0aCB0aGUgc2FtZSBzZXNzaW9uIGlkLgorICAgICAgICAgICAgaWYgKGkgPT0gbVJlY29yZFRocmVhZHMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgcHV0T3JwaGFuRWZmZWN0Q2hhaW5fbChjaGFpbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXVkaW9Db25maWdDaGFuZ2VkKEF1ZGlvU3lzdGVtOjpJTlBVVF9DTE9TRUQsIGlucHV0LCBOVUxMKTsKICAgICAgICAgbVJlY29yZFRocmVhZHMucmVtb3ZlSXRlbShpbnB1dCk7CiAgICAgfQotICAgIHRocmVhZC0+ZXhpdCgpOwotICAgIC8vIFRoZSB0aHJlYWQgZW50aXR5IChhY3RpdmUgdW5pdCBvZiBleGVjdXRpb24pIGlzIG5vIGxvbmdlciBydW5uaW5nIGhlcmUsCi0gICAgLy8gYnV0IHRoZSBUaHJlYWRCYXNlIGNvbnRhaW5lciBzdGlsbCBleGlzdHMuCisgICAgLy8gRklYTUU6IGNhbGxpbmcgdGhyZWFkLT5leGl0KCkgd2l0aG91dCBtTG9jayBoZWxkIHNob3VsZCBub3QgYmUgbmVlZGVkIGFueW1vcmUgbm93IHRoYXQKKyAgICAvLyB3ZSBoYXZlIGEgZGlmZmVyZW50IGxvY2sgZm9yIG5vdGlmaWNhdGlvbiBjbGllbnQKKyAgICBjbG9zZUlucHV0RmluaXNoKHRocmVhZCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6Y2xvc2VJbnB1dEZpbmlzaChzcDxSZWNvcmRUaHJlYWQ+IHRocmVhZCkKK3sKKyAgICB0aHJlYWQtPmV4aXQoKTsKICAgICBBdWRpb1N0cmVhbUluICppbiA9IHRocmVhZC0+Y2xlYXJJbnB1dCgpOwogICAgIEFMT0dfQVNTRVJUKGluICE9IE5VTEwsICJpbiBzaG91bGRuJ3QgYmUgTlVMTCIpOwogICAgIC8vIGZyb20gbm93IG9uIHRocmVhZC0+bUlucHV0IGlzIE5VTEwKICAgICBpbi0+aHdEZXYoKS0+Y2xvc2VfaW5wdXRfc3RyZWFtKGluLT5od0RldigpLCBpbi0+c3RyZWFtKTsKICAgICBkZWxldGUgaW47Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6c2V0U3RyZWFtT3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCit2b2lkIEF1ZGlvRmxpbmdlcjo6Y2xvc2VJbnB1dEludGVybmFsX2woc3A8UmVjb3JkVGhyZWFkPiB0aHJlYWQpCit7CisgICAgbVJlY29yZFRocmVhZHMucmVtb3ZlSXRlbSh0aHJlYWQtPm1JZCk7CisgICAgY2xvc2VJbnB1dEZpbmlzaCh0aHJlYWQpOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OmludmFsaWRhdGVTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBBTE9HVigic2V0U3RyZWFtT3V0cHV0KCkgc3RyZWFtICVkIHRvIG91dHB1dCAlZCIsIHN0cmVhbSwgb3V0cHV0KTsKKyAgICBBTE9HVigiaW52YWxpZGF0ZVN0cmVhbSgpIHN0cmVhbSAlZCIsIHN0cmVhbSk7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgUGxheWJhY2tUaHJlYWQgKnRocmVhZCA9IG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKS5nZXQoKTsKQEAgLTE4NjQsMjQgKzIxMjcsMzAgQEAKIH0KIAogCi1pbnQgQXVkaW9GbGluZ2VyOjpuZXdBdWRpb1Nlc3Npb25JZCgpCithdWRpb191bmlxdWVfaWRfdCBBdWRpb0ZsaW5nZXI6Om5ld0F1ZGlvVW5pcXVlSWQoKQogewogICAgIHJldHVybiBuZXh0VW5pcXVlSWQoKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OmFjcXVpcmVBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uKQordm9pZCBBdWRpb0ZsaW5nZXI6OmFjcXVpcmVBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uLCBwaWRfdCBwaWQpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBwaWRfdCBjYWxsZXIgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7Ci0gICAgQUxPR1YoImFjcXVpcmluZyAlZCBmcm9tICVkIiwgYXVkaW9TZXNzaW9uLCBjYWxsZXIpOworICAgIEFMT0dWKCJhY3F1aXJpbmcgJWQgZnJvbSAlZCwgZm9yICVkIiwgYXVkaW9TZXNzaW9uLCBjYWxsZXIsIHBpZCk7CisgICAgaWYgKHBpZCAhPSAtMSAmJiAoY2FsbGVyID09IGdldHBpZF9jYWNoZWQpKSB7CisgICAgICAgIGNhbGxlciA9IHBpZDsKKyAgICB9CiAKLSAgICAvLyBJZ25vcmUgcmVxdWVzdHMgcmVjZWl2ZWQgZnJvbSBwcm9jZXNzZXMgbm90IGtub3duIGFzIG5vdGlmaWNhdGlvbiBjbGllbnQuIFRoZSByZXF1ZXN0Ci0gICAgLy8gaXMgbGlrZWx5IHByb3hpZWQgYnkgbWVkaWFzZXJ2ZXIgKGUuZyBDYW1lcmFTZXJ2aWNlKSBhbmQgcmVsZWFzZUF1ZGlvU2Vzc2lvbklkKCkgY2FuIGJlCi0gICAgLy8gY2FsbGVkIGZyb20gYSBkaWZmZXJlbnQgcGlkIGxlYXZpbmcgYSBzdGFsZSBzZXNzaW9uIHJlZmVyZW5jZS4gIEFsc28gd2UgZG9uJ3Qga25vdyBob3cKLSAgICAvLyB0byBjbGVhciB0aGlzIHJlZmVyZW5jZSBpZiB0aGUgY2xpZW50IHByb2Nlc3MgZGllcy4KLSAgICBpZiAobU5vdGlmaWNhdGlvbkNsaWVudHMuaW5kZXhPZktleShjYWxsZXIpIDwgMCkgewotICAgICAgICBBTE9HVigiYWNxdWlyZUF1ZGlvU2Vzc2lvbklkKCkgdW5rbm93biBjbGllbnQgJWQgZm9yIHNlc3Npb24gJWQiLCBjYWxsZXIsIGF1ZGlvU2Vzc2lvbik7Ci0gICAgICAgIHJldHVybjsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfY2wobUNsaWVudExvY2spOworICAgICAgICAvLyBJZ25vcmUgcmVxdWVzdHMgcmVjZWl2ZWQgZnJvbSBwcm9jZXNzZXMgbm90IGtub3duIGFzIG5vdGlmaWNhdGlvbiBjbGllbnQuIFRoZSByZXF1ZXN0CisgICAgICAgIC8vIGlzIGxpa2VseSBwcm94aWVkIGJ5IG1lZGlhc2VydmVyIChlLmcgQ2FtZXJhU2VydmljZSkgYW5kIHJlbGVhc2VBdWRpb1Nlc3Npb25JZCgpIGNhbiBiZQorICAgICAgICAvLyBjYWxsZWQgZnJvbSBhIGRpZmZlcmVudCBwaWQgbGVhdmluZyBhIHN0YWxlIHNlc3Npb24gcmVmZXJlbmNlLiAgQWxzbyB3ZSBkb24ndCBrbm93IGhvdworICAgICAgICAvLyB0byBjbGVhciB0aGlzIHJlZmVyZW5jZSBpZiB0aGUgY2xpZW50IHByb2Nlc3MgZGllcy4KKyAgICAgICAgaWYgKG1Ob3RpZmljYXRpb25DbGllbnRzLmluZGV4T2ZLZXkoY2FsbGVyKSA8IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJhY3F1aXJlQXVkaW9TZXNzaW9uSWQoKSB1bmtub3duIGNsaWVudCAlZCBmb3Igc2Vzc2lvbiAlZCIsIGNhbGxlciwgYXVkaW9TZXNzaW9uKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHNpemVfdCBudW0gPSBtQXVkaW9TZXNzaW9uUmVmcy5zaXplKCk7CkBAIC0xODk3LDExICsyMTY2LDE0IEBACiAgICAgQUxPR1YoIiBhZGRlZCBuZXcgZW50cnkgZm9yICVkIiwgYXVkaW9TZXNzaW9uKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uKQordm9pZCBBdWRpb0ZsaW5nZXI6OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uLCBwaWRfdCBwaWQpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBwaWRfdCBjYWxsZXIgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7Ci0gICAgQUxPR1YoInJlbGVhc2luZyAlZCBmcm9tICVkIiwgYXVkaW9TZXNzaW9uLCBjYWxsZXIpOworICAgIEFMT0dWKCJyZWxlYXNpbmcgJWQgZnJvbSAlZCBmb3IgJWQiLCBhdWRpb1Nlc3Npb24sIGNhbGxlciwgcGlkKTsKKyAgICBpZiAocGlkICE9IC0xICYmIChjYWxsZXIgPT0gZ2V0cGlkX2NhY2hlZCkpIHsKKyAgICAgICAgY2FsbGVyID0gcGlkOworICAgIH0KICAgICBzaXplX3QgbnVtID0gbUF1ZGlvU2Vzc2lvblJlZnMuc2l6ZSgpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpPCBudW07IGkrKykgewogICAgICAgICBBdWRpb1Nlc3Npb25SZWYgKnJlZiA9IG1BdWRpb1Nlc3Npb25SZWZzLml0ZW1BdChpKTsKQEAgLTE5NjMsNyArMjIzNSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFmb3VuZCkgewotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sICh0LT5tTG9jayk7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodC0+bUxvY2spOwogICAgICAgICAgICAgLy8gcmVtb3ZlIGFsbCBlZmZlY3RzIGZyb20gdGhlIGNoYWluCiAgICAgICAgICAgICB3aGlsZSAoZWMtPm1FZmZlY3RzLnNpemUoKSkgewogICAgICAgICAgICAgICAgIHNwPEVmZmVjdE1vZHVsZT4gZWZmZWN0ID0gZWMtPm1FZmZlY3RzWzBdOwpAQCAtMjAwMCw3ICsyMjcyLDcgQEAKIAogdWludDMyX3QgQXVkaW9GbGluZ2VyOjpuZXh0VW5pcXVlSWQoKQogewotICAgIHJldHVybiBhbmRyb2lkX2F0b21pY19pbmMoJm1OZXh0VW5pcXVlSWQpOworICAgIHJldHVybiAodWludDMyX3QpIGFuZHJvaWRfYXRvbWljX2luYygmbU5leHRVbmlxdWVJZCk7CiB9CiAKIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQgKkF1ZGlvRmxpbmdlcjo6cHJpbWFyeVBsYXliYWNrVGhyZWFkX2woKSBjb25zdApAQCAtMjAzMyw3ICsyMzA1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmlnZ2VyU2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaXN0ZW5lclNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jX2V2ZW50X2NhbGxiYWNrX3QgY2FsbEJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb29raWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cDxSZWZCYXNlPiBjb29raWUpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIApAQCAtMjE5NSw3ICsyNDY3LDcgQEAKIAogICAgICAgICAvLyByZXR1cm4gZWZmZWN0IGRlc2NyaXB0b3IKICAgICAgICAgKnBEZXNjID0gZGVzYzsKLSAgICAgICAgaWYgKGlvID09IDAgJiYgc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCkgeworICAgICAgICBpZiAoaW8gPT0gQVVESU9fSU9fSEFORExFX05PTkUgJiYgc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCkgewogICAgICAgICAgICAgLy8gaWYgdGhlIG91dHB1dCByZXR1cm5lZCBieSBnZXRPdXRwdXRGb3JFZmZlY3QoKSBpcyByZW1vdmVkIGJlZm9yZSB3ZSBsb2NrIHRoZQogICAgICAgICAgICAgLy8gbXV0ZXggYmVsb3csIHRoZSBjYWxsIHRvIGNoZWNrUGxheWJhY2tUaHJlYWRfbChpbykgYmVsb3cgd2lsbCBkZXRlY3QgaXQKICAgICAgICAgICAgIC8vIGFuZCB3ZSB3aWxsIGV4aXQgc2FmZWx5CkBAIC0yMjEwLDcgKzI0ODIsNyBAQAogICAgICAgICAvLyBJZiBvdXRwdXQgaXMgMCBoZXJlLCBzZXNzaW9uSWQgaXMgbmVpdGhlciBTRVNTSU9OX09VVFBVVF9TVEFHRSBub3IgU0VTU0lPTl9PVVRQVVRfTUlYCiAgICAgICAgIC8vIGJlY2F1c2Ugb2YgY29kZSBjaGVja2luZyBvdXRwdXQgd2hlbiBlbnRlcmluZyB0aGUgZnVuY3Rpb24uCiAgICAgICAgIC8vIE5vdGU6IGlvIGlzIG5ldmVyIDAgd2hlbiBjcmVhdGluZyBhbiBlZmZlY3Qgb24gYW4gaW5wdXQKLSAgICAgICAgaWYgKGlvID09IDApIHsKKyAgICAgICAgaWYgKGlvID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgICAgICBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX1NUQUdFKSB7CiAgICAgICAgICAgICAgICAgLy8gb3V0cHV0IG11c3QgYmUgc3BlY2lmaWVkIGJ5IEF1ZGlvUG9saWN5TWFuYWdlciB3aGVuIHVzaW5nIHNlc3Npb24KICAgICAgICAgICAgICAgICAvLyBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRQpAQCAtMjIzNSw3ICsyNTA3LDcgQEAKICAgICAgICAgICAgIC8vIElmIG5vIG91dHB1dCB0aHJlYWQgY29udGFpbnMgdGhlIHJlcXVlc3RlZCBzZXNzaW9uIElELCBkZWZhdWx0IHRvCiAgICAgICAgICAgICAvLyBmaXJzdCBvdXRwdXQuIFRoZSBlZmZlY3QgY2hhaW4gd2lsbCBiZSBtb3ZlZCB0byB0aGUgY29ycmVjdCBvdXRwdXQKICAgICAgICAgICAgIC8vIHRocmVhZCB3aGVuIGEgdHJhY2sgd2l0aCB0aGUgc2FtZSBzZXNzaW9uIElEIGlzIGNyZWF0ZWQKLSAgICAgICAgICAgIGlmIChpbyA9PSAwICYmIG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpKSB7CisgICAgICAgICAgICBpZiAoaW8gPT0gQVVESU9fSU9fSEFORExFX05PTkUgJiYgbVBsYXliYWNrVGhyZWFkcy5zaXplKCkgPiAwKSB7CiAgICAgICAgICAgICAgICAgaW8gPSBtUGxheWJhY2tUaHJlYWRzLmtleUF0KDApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUVmZmVjdCgpIGdvdCBpbyAlZCBmb3IgZWZmZWN0ICVzIiwgaW8sIGRlc2MubmFtZSk7CkBAIC0yMjQ4LDkgKzI1MjAsMTcgQEAKICAgICAgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIENoZWNrIGlmIG9uZSBlZmZlY3QgY2hhaW4gd2FzIGF3YWl0aW5nIGZvciBhbiBlZmZlY3QgdG8gYmUgY3JlYXRlZCBvbiB0aGlzCisgICAgICAgICAgICAvLyBzZXNzaW9uIGFuZCB1c2VkIGl0IGluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgb25lLgorICAgICAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gZ2V0T3JwaGFuRWZmZWN0Q2hhaW5fbCgoYXVkaW9fc2Vzc2lvbl90KXNlc3Npb25JZCk7CisgICAgICAgICAgICBpZiAoY2hhaW4gIT0gMCkgeworICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbCh0aHJlYWQtPm1Mb2NrKTsKKyAgICAgICAgICAgICAgICB0aHJlYWQtPmFkZEVmZmVjdENoYWluX2woY2hhaW4pOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgc3A8Q2xpZW50PiBjbGllbnQgPSByZWdpc3RlclBpZF9sKHBpZCk7CisgICAgICAgIHNwPENsaWVudD4gY2xpZW50ID0gcmVnaXN0ZXJQaWQocGlkKTsKIAogICAgICAgICAvLyBjcmVhdGUgZWZmZWN0IG9uIHNlbGVjdGVkIG91dHB1dCB0aHJlYWQKICAgICAgICAgaGFuZGxlID0gdGhyZWFkLT5jcmVhdGVFZmZlY3RfbChjbGllbnQsIGVmZmVjdENsaWVudCwgcHJpb3JpdHksIHNlc3Npb25JZCwKQEAgLTIyNTgsMTIgKzI1MzgsMTUgQEAKICAgICAgICAgaWYgKGhhbmRsZSAhPSAwICYmIGlkICE9IE5VTEwpIHsKICAgICAgICAgICAgICppZCA9IGhhbmRsZS0+aWQoKTsKICAgICAgICAgfQorICAgICAgICBpZiAoaGFuZGxlID09IDApIHsKKyAgICAgICAgICAgIC8vIHJlbW92ZSBsb2NhbCBzdHJvbmcgcmVmZXJlbmNlIHRvIENsaWVudCB3aXRoIG1DbGllbnRMb2NrIGhlbGQKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfY2wobUNsaWVudExvY2spOworICAgICAgICAgICAgY2xpZW50LmNsZWFyKCk7CisgICAgICAgIH0KICAgICB9CiAKIEV4aXQ6Ci0gICAgaWYgKHN0YXR1cyAhPSBOVUxMKSB7Ci0gICAgICAgICpzdGF0dXMgPSBsU3RhdHVzOwotICAgIH0KKyAgICAqc3RhdHVzID0gbFN0YXR1czsKICAgICByZXR1cm4gaGFuZGxlOwogfQogCkBAIC0yMzA5LDYgKzI1OTIsMTcgQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAorICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGRlc3RpbmF0aW9uIHRocmVhZCBoYXMgYSBjaGFubmVsIGNvdW50IG9mIEZDQ18yLCB3aGljaCBpcworICAgIC8vIGN1cnJlbnRseSByZXF1aXJlZCBmb3IgKG1vc3QpIGVmZmVjdHMuIFByZXZlbnQgbW92aW5nIHRoZSBlZmZlY3QgY2hhaW4gaGVyZSByYXRoZXIKKyAgICAvLyB0aGFuIGRpc2FibGluZyB0aGUgYWRkRWZmZWN0X2woKSBjYWxsIGluIGRzdFRocmVhZCBiZWxvdy4KKyAgICBpZiAoKGRzdFRocmVhZC0+dHlwZSgpID09IFRocmVhZEJhc2U6Ok1JWEVSIHx8IGRzdFRocmVhZC0+aXNEdXBsaWNhdGluZygpKSAmJgorICAgICAgICAgICAgZHN0VGhyZWFkLT5tQ2hhbm5lbENvdW50ICE9IEZDQ18yKSB7CisgICAgICAgIEFMT0dXKCJtb3ZlRWZmZWN0Q2hhaW5fbCgpIGVmZmVjdCBjaGFpbiBmYWlsZWQgYmVjYXVzZSIKKyAgICAgICAgICAgICAgICAiIGRlc3RpbmF0aW9uIHRocmVhZCAlcCBjaGFubmVsIGNvdW50KCV1KSAhPSAldSIsCisgICAgICAgICAgICAgICAgZHN0VGhyZWFkLCBkc3RUaHJlYWQtPm1DaGFubmVsQ291bnQsIEZDQ18yKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKwogICAgIC8vIHJlbW92ZSBjaGFpbiBmaXJzdC4gVGhpcyBpcyB1c2VmdWwgb25seSBpZiByZWNvbmZpZ3VyaW5nIGVmZmVjdCBjaGFpbiBvbiBzYW1lIG91dHB1dCB0aHJlYWQsCiAgICAgLy8gc28gdGhhdCBhIG5ldyBjaGFpbiBpcyBjcmVhdGVkIHdpdGggY29ycmVjdCBwYXJhbWV0ZXJzIHdoZW4gZmlyc3QgZWZmZWN0IGlzIGFkZGVkLiBUaGlzIGlzCiAgICAgLy8gb3RoZXJ3aXNlIHVubmVjZXNzYXJ5IGFzIHJlbW92ZUVmZmVjdF9sKCkgd2lsbCByZW1vdmUgdGhlIGNoYWluIHdoZW4gbGFzdCBlZmZlY3QgaXMKQEAgLTI0MDcsNiArMjcwMSw0OSBAQAogCiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6cHV0T3JwaGFuRWZmZWN0Q2hhaW5fbChjb25zdCBzcDxBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluPiYgY2hhaW4pCit7CisgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KWNoYWluLT5zZXNzaW9uSWQoKTsKKyAgICBzc2l6ZV90IGluZGV4ID0gbU9ycGhhbkVmZmVjdENoYWlucy5pbmRleE9mS2V5KHNlc3Npb24pOworICAgIEFMT0dWKCJwdXRPcnBoYW5FZmZlY3RDaGFpbl9sIHNlc3Npb24gJWQgaW5kZXggJWQiLCBzZXNzaW9uLCBpbmRleCk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgQUxPR1coInB1dE9ycGhhbkVmZmVjdENoYWluX2wgY2hhaW4gZm9yIHNlc3Npb24gJWQgYWxyZWFkeSBwcmVzZW50Iiwgc2Vzc2lvbik7CisgICAgICAgIHJldHVybiBBTFJFQURZX0VYSVNUUzsKKyAgICB9CisgICAgbU9ycGhhbkVmZmVjdENoYWlucy5hZGQoc2Vzc2lvbiwgY2hhaW4pOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3A8QXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbj4gQXVkaW9GbGluZ2VyOjpnZXRPcnBoYW5FZmZlY3RDaGFpbl9sKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQoreworICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbjsKKyAgICBzc2l6ZV90IGluZGV4ID0gbU9ycGhhbkVmZmVjdENoYWlucy5pbmRleE9mS2V5KHNlc3Npb24pOworICAgIEFMT0dWKCJnZXRPcnBoYW5FZmZlY3RDaGFpbl9sIHNlc3Npb24gJWQgaW5kZXggJWQiLCBzZXNzaW9uLCBpbmRleCk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgY2hhaW4gPSBtT3JwaGFuRWZmZWN0Q2hhaW5zLnZhbHVlQXQoaW5kZXgpOworICAgICAgICBtT3JwaGFuRWZmZWN0Q2hhaW5zLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOworICAgIH0KKyAgICByZXR1cm4gY2hhaW47Cit9CisKK2Jvb2wgQXVkaW9GbGluZ2VyOjp1cGRhdGVPcnBoYW5FZmZlY3RDaGFpbnMoY29uc3Qgc3A8QXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU+JiBlZmZlY3QpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpZWZmZWN0LT5zZXNzaW9uSWQoKTsKKyAgICBzc2l6ZV90IGluZGV4ID0gbU9ycGhhbkVmZmVjdENoYWlucy5pbmRleE9mS2V5KHNlc3Npb24pOworICAgIEFMT0dWKCJ1cGRhdGVPcnBoYW5FZmZlY3RDaGFpbnMgc2Vzc2lvbiAlZCBpbmRleCAlZCIsIHNlc3Npb24sIGluZGV4KTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBtT3JwaGFuRWZmZWN0Q2hhaW5zLnZhbHVlQXQoaW5kZXgpOworICAgICAgICBpZiAoY2hhaW4tPnJlbW92ZUVmZmVjdF9sKGVmZmVjdCkgPT0gMCkgeworICAgICAgICAgICAgQUxPR1YoInVwZGF0ZU9ycGhhbkVmZmVjdENoYWlucyByZW1vdmluZyBlZmZlY3QgY2hhaW4gYXQgaW5kZXggJWQiLCBpbmRleCk7CisgICAgICAgICAgICBtT3JwaGFuRWZmZWN0Q2hhaW5zLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKwogc3RydWN0IEVudHJ5IHsKICNkZWZpbmUgTUFYX05BTUUgMzIgICAgIC8vICVZJW0lZCVIJU0lU18lZC53YXYKICAgICBjaGFyIG1OYW1lW01BWF9OQU1FXTsKQEAgLTI0NzAsNyArMjgwNyw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAoZmQgPj0gMCkgewotICAgICAgICAgICAgICAgIGZkcHJpbnRmKGZkLCAidW5hYmxlIHRvIHJvdGF0ZSB0ZWVzIGluICVzOiAlc1xuIiwgdGVlUGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgICAgICBkcHJpbnRmKGZkLCAidW5hYmxlIHRvIHJvdGF0ZSB0ZWVzIGluICVzOiAlc1xuIiwgdGVlUGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBjaGFyIHRlZVRpbWVbMTZdOwpAQCAtMjQ4MywyNCArMjgyMCwyNiBAQAogICAgICAgICAvLyBpZiAyIGR1bXBzeXMgYXJlIGRvbmUgd2l0aGluIDEgc2Vjb25kLCBhbmQgcm90YXRpb24gZGlkbid0IHdvcmssIHRoZW4gZGlzY2FyZCAybmQKICAgICAgICAgaW50IHRlZUZkID0gb3Blbih0ZWVQYXRoLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX0VYQ0wgfCBPX05PRk9MTE9XLCBTX0lSVVNSIHwgU19JV1VTUik7CiAgICAgICAgIGlmICh0ZWVGZCA+PSAwKSB7CisgICAgICAgICAgICAvLyBGSVhNRSB1c2UgbGlic25kZmlsZQogICAgICAgICAgICAgY2hhciB3YXZIZWFkZXJbNDRdOwogICAgICAgICAgICAgbWVtY3B5KHdhdkhlYWRlciwKICAgICAgICAgICAgICAgICAiUklGRlwwXDBcMFwwV0FWRWZtdCBcMjBcMFwwXDBcMVwwXDJcMFwxMDRcMjU0XDBcMFwwXDBcMFwwXDRcMFwyMFwwZGF0YVwwXDBcMFwwIiwKICAgICAgICAgICAgICAgICBzaXplb2Yod2F2SGVhZGVyKSk7CiAgICAgICAgICAgICBOQkFJT19Gb3JtYXQgZm9ybWF0ID0gdGVlU291cmNlLT5mb3JtYXQoKTsKICAgICAgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxDb3VudCA9IEZvcm1hdF9jaGFubmVsQ291bnQoZm9ybWF0KTsKLSAgICAgICAgICAgIEFMT0dfQVNTRVJUKGNoYW5uZWxDb3VudCA8PSBGQ0NfMik7CiAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gRm9ybWF0X3NhbXBsZVJhdGUoZm9ybWF0KTsKKyAgICAgICAgICAgIHNpemVfdCBmcmFtZVNpemUgPSBGb3JtYXRfZnJhbWVTaXplKGZvcm1hdCk7CiAgICAgICAgICAgICB3YXZIZWFkZXJbMjJdID0gY2hhbm5lbENvdW50OyAgICAgICAvLyBudW1iZXIgb2YgY2hhbm5lbHMKICAgICAgICAgICAgIHdhdkhlYWRlclsyNF0gPSBzYW1wbGVSYXRlOyAgICAgICAgIC8vIHNhbXBsZSByYXRlCiAgICAgICAgICAgICB3YXZIZWFkZXJbMjVdID0gc2FtcGxlUmF0ZSA+PiA4OwotICAgICAgICAgICAgd2F2SGVhZGVyWzMyXSA9IGNoYW5uZWxDb3VudCAqIDI7ICAgLy8gYmxvY2sgYWxpZ25tZW50CisgICAgICAgICAgICB3YXZIZWFkZXJbMzJdID0gZnJhbWVTaXplOyAgICAgICAgICAvLyBibG9jayBhbGlnbm1lbnQKKyAgICAgICAgICAgIHdhdkhlYWRlclszM10gPSBmcmFtZVNpemUgPj4gODsKICAgICAgICAgICAgIHdyaXRlKHRlZUZkLCB3YXZIZWFkZXIsIHNpemVvZih3YXZIZWFkZXIpKTsKICAgICAgICAgICAgIHNpemVfdCB0b3RhbCA9IDA7CiAgICAgICAgICAgICBib29sIGZpcnN0UmVhZCA9IHRydWU7CisjZGVmaW5lIFRFRV9TSU5LX1JFQUQgMTAyNCAgICAgICAgICAgICAgICAgICAgICAvLyBmcmFtZXMgcGVyIEkvTyBvcGVyYXRpb24KKyAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciA9IG1hbGxvYyhURUVfU0lOS19SRUFEICogZnJhbWVTaXplKTsKICAgICAgICAgICAgIGZvciAoOzspIHsKLSNkZWZpbmUgVEVFX1NJTktfUkVBRCAxMDI0Ci0gICAgICAgICAgICAgICAgc2hvcnQgYnVmZmVyW1RFRV9TSU5LX1JFQUQgKiBGQ0NfMl07CiAgICAgICAgICAgICAgICAgc2l6ZV90IGNvdW50ID0gVEVFX1NJTktfUkVBRDsKICAgICAgICAgICAgICAgICBzc2l6ZV90IGFjdHVhbCA9IHRlZVNvdXJjZS0+cmVhZChidWZmZXIsIGNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6a0ludmFsaWRQVFMpOwpAQCAtMjUxMywyMiArMjg1MiwyNSBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoYWN0dWFsIDw9IChzc2l6ZV90KWNvdW50KTsKLSAgICAgICAgICAgICAgICB3cml0ZSh0ZWVGZCwgYnVmZmVyLCBhY3R1YWwgKiBjaGFubmVsQ291bnQgKiBzaXplb2Yoc2hvcnQpKTsKKyAgICAgICAgICAgICAgICB3cml0ZSh0ZWVGZCwgYnVmZmVyLCBhY3R1YWwgKiBmcmFtZVNpemUpOwogICAgICAgICAgICAgICAgIHRvdGFsICs9IGFjdHVhbDsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyZWUoYnVmZmVyKTsKICAgICAgICAgICAgIGxzZWVrKHRlZUZkLCAob2ZmX3QpIDQsIFNFRUtfU0VUKTsKLSAgICAgICAgICAgIHVpbnQzMl90IHRlbXAgPSA0NCArIHRvdGFsICogY2hhbm5lbENvdW50ICogc2l6ZW9mKHNob3J0KSAtIDg7CisgICAgICAgICAgICB1aW50MzJfdCB0ZW1wID0gNDQgKyB0b3RhbCAqIGZyYW1lU2l6ZSAtIDg7CisgICAgICAgICAgICAvLyBGSVhNRSBub3QgYmlnLWVuZGlhbiBzYWZlCiAgICAgICAgICAgICB3cml0ZSh0ZWVGZCwgJnRlbXAsIHNpemVvZih0ZW1wKSk7CiAgICAgICAgICAgICBsc2Vlayh0ZWVGZCwgKG9mZl90KSA0MCwgU0VFS19TRVQpOwotICAgICAgICAgICAgdGVtcCA9ICB0b3RhbCAqIGNoYW5uZWxDb3VudCAqIHNpemVvZihzaG9ydCk7CisgICAgICAgICAgICB0ZW1wID0gIHRvdGFsICogZnJhbWVTaXplOworICAgICAgICAgICAgLy8gRklYTUUgbm90IGJpZy1lbmRpYW4gc2FmZQogICAgICAgICAgICAgd3JpdGUodGVlRmQsICZ0ZW1wLCBzaXplb2YodGVtcCkpOwogICAgICAgICAgICAgY2xvc2UodGVlRmQpOwogICAgICAgICAgICAgaWYgKGZkID49IDApIHsKLSAgICAgICAgICAgICAgICBmZHByaW50ZihmZCwgInRlZSBjb3BpZWQgdG8gJXNcbiIsIHRlZVBhdGgpOworICAgICAgICAgICAgICAgIGRwcmludGYoZmQsICJ0ZWUgY29waWVkIHRvICVzXG4iLCB0ZWVQYXRoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChmZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgZmRwcmludGYoZmQsICJ1bmFibGUgdG8gY3JlYXRlIHRlZSAlczogJXNcbiIsIHRlZVBhdGgsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICAgICAgZHByaW50ZihmZCwgInVuYWJsZSB0byBjcmVhdGUgdGVlICVzOiAlc1xuIiwgdGVlUGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaAppbmRleCA1M2UyMzhlLi4xMDAzMDE3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCkBAIC0xOCw2ICsxOCw3IEBACiAjaWZuZGVmIEFORFJPSURfQVVESU9fRkxJTkdFUl9ICiAjZGVmaW5lIEFORFJPSURfQVVESU9fRkxJTkdFUl9ICiAKKyNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8bGltaXRzLmg+CkBAIC00OSw5ICs1MCwxMiBAQAogCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL0V4dGVuZGVkQXVkaW9CdWZmZXJQcm92aWRlci5oPgorCisjaW5jbHVkZSAiRmFzdENhcHR1cmUuaCIKICNpbmNsdWRlICJGYXN0TWl4ZXIuaCIKICNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkFJTy5oPgogI2luY2x1ZGUgIkF1ZGlvV2F0Y2hkb2cuaCIKKyNpbmNsdWRlICJBdWRpb01peGVyLmgiCiAKICNpbmNsdWRlIDxwb3dlcm1hbmFnZXIvSVBvd2VyTWFuYWdlci5oPgogCkBAIC02MCw4ICs2NCw4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgYXVkaW9fdHJhY2tfY2Jsa190OwotY2xhc3MgZWZmZWN0X3BhcmFtX2NibGtfdDsKK3N0cnVjdCBhdWRpb190cmFja19jYmxrX3Q7CitzdHJ1Y3QgZWZmZWN0X3BhcmFtX2NibGtfdDsKIGNsYXNzIEF1ZGlvTWl4ZXI7CiBjbGFzcyBBdWRpb0J1ZmZlcjsKIGNsYXNzIEF1ZGlvUmVzYW1wbGVyOwpAQCAtODEsOSArODUsNiBAQAogCiBzdGF0aWMgY29uc3QgbnNlY3NfdCBrRGVmYXVsdFN0YW5kYnlUaW1lSW5Oc2VjcyA9IHNlY29uZHMoMyk7CiAKLSNkZWZpbmUgTUFYX0dBSU4gNDA5Ni4wZgotI2RlZmluZSBNQVhfR0FJTl9JTlQgMHgxMDAwCi0KICNkZWZpbmUgSU5DTFVESU5HX0ZST01fQVVESU9GTElOR0VSX0gKIAogY2xhc3MgQXVkaW9GbGluZ2VyIDoKQEAgLTEwMiwyOSArMTAzLDMwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnBGcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190ICpmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCB0aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4JiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpZW50VWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cyAvKm5vbi1OVUxMKi8pOwogCiAgICAgdmlydHVhbCBzcDxJQXVkaW9SZWNvcmQ+IG9wZW5SZWNvcmQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpwRnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCAqZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHRpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKm5vdGlmaWNhdGlvbkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SU1lbW9yeT4mIGNibGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElNZW1vcnk+JiBidWZmZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzIC8qbm9uLU5VTEwqLyk7CiAKICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBzYW1wbGVSYXRlKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgY29uc3Q7Ci0gICAgdmlydHVhbCAgICAgaW50ICAgICAgICAgY2hhbm5lbENvdW50KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgY29uc3Q7CiAgICAgdmlydHVhbCAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgY29uc3Q7CiAgICAgdmlydHVhbCAgICAgc2l6ZV90ICAgICAgZnJhbWVDb3VudChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGNvbnN0OwogICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIGxhdGVuY3koYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBjb25zdDsKQEAgLTE1NiwxNCArMTU4LDEzIEBACiAgICAgdmlydHVhbCAgICAgc2l6ZV90ICAgICAgZ2V0SW5wdXRCdWZmZXJTaXplKHVpbnQzMl90IHNhbXBsZVJhdGUsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2spIGNvbnN0OwogCi0gICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBvcGVuT3V0cHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqcERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqcEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKnBDaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBMYXRlbmN5TXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3Blbk91dHB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpsYXRlbmN5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKTsKIAogICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3Qgb3BlbkR1cGxpY2F0ZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQyKTsKQEAgLTE3NCwyOCArMTc1LDMwIEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3RvcmVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKIAotICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3Qgb3BlbklucHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqcEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5JbnB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtT3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW52YWxpZGF0ZVN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJlbmRlclBvc2l0aW9uKHNpemVfdCAqaGFsRnJhbWVzLCBzaXplX3QgKmRzcEZyYW1lcywKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpoYWxGcmFtZXMsIHVpbnQzMl90ICpkc3BGcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGNvbnN0OwogCi0gICAgdmlydHVhbCAgICAgdW5zaWduZWQgaW50ICBnZXRJbnB1dEZyYW1lc0xvc3QoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpIGNvbnN0OworICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0SW5wdXRGcmFtZXNMb3N0KGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKSBjb25zdDsKIAotICAgIHZpcnR1YWwgaW50IG5ld0F1ZGlvU2Vzc2lvbklkKCk7CisgICAgdmlydHVhbCBhdWRpb191bmlxdWVfaWRfdCBuZXdBdWRpb1VuaXF1ZUlkKCk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgYWNxdWlyZUF1ZGlvU2Vzc2lvbklkKGludCBhdWRpb1Nlc3Npb24pOworICAgIHZpcnR1YWwgdm9pZCBhY3F1aXJlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbiwgcGlkX3QgcGlkKTsKIAotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbik7CisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uLCBwaWRfdCBwaWQpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKm51bUVmZmVjdHMpIGNvbnN0OwogCkBAIC0yMTAsNyArMjEzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCiAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cyAvKm5vbi1OVUxMKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50ICplbmFibGVkKTsKIApAQCAtMjI0LDYgKzIyNywzMCBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRMb3dSYW1EZXZpY2UoYm9vbCBpc0xvd1JhbURldmljZSk7CiAKKyAgICAvKiBMaXN0IGF2YWlsYWJsZSBhdWRpbyBwb3J0cyBhbmQgdGhlaXIgYXR0cmlidXRlcyAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHModW5zaWduZWQgaW50ICpudW1fcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMpOworCisgICAgLyogR2V0IGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydCAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KTsKKworICAgIC8qIENyZWF0ZSBhbiBhdWRpbyBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKTsKKworICAgIC8qIFJlbGVhc2UgYW4gYXVkaW8gcGF0Y2ggKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7CisKKyAgICAvKiBMaXN0IGV4aXN0aW5nIGF1ZGlvIHBhdGNoZXMgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzKTsKKworICAgIC8qIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24gKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CisKKyAgICAvKiBHZXQgdGhlIEhXIHN5bmNocm9uaXphdGlvbiBzb3VyY2UgdXNlZCBmb3IgYW4gYXVkaW8gc2Vzc2lvbiAqLworICAgIHZpcnR1YWwgYXVkaW9faHdfc3luY190IGdldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKTsKKwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKQEAgLTIzNSw4ICsyNjIsMTIgQEAKICAgICBzcDxOQkxvZzo6V3JpdGVyPiAgIG5ld1dyaXRlcl9sKHNpemVfdCBzaXplLCBjb25zdCBjaGFyICpuYW1lKTsKICAgICB2b2lkICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJXcml0ZXIoY29uc3Qgc3A8TkJMb2c6OldyaXRlcj4mIHdyaXRlcik7CiBwcml2YXRlOgotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0xvZ01lbW9yeVNpemUgPSAxMCAqIDEwMjQ7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTG9nTWVtb3J5U2l6ZSA9IDQwICogMTAyNDsKICAgICBzcDxNZW1vcnlEZWFsZXI+ICAgIG1Mb2dNZW1vcnlEZWFsZXI7ICAgLy8gPT0gMCB3aGVuIE5CTG9nIGlzIGRpc2FibGVkCisgICAgLy8gV2hlbiBhIGxvZyB3cml0ZXIgaXMgdW5yZWdpc3RlcmVkLCBpdCBpcyBkb25lIGxhemlseSBzbyB0aGF0IG1lZGlhLmxvZyBjYW4gY29udGludWUgdG8gc2VlIGl0CisgICAgLy8gZm9yIGFzIGxvbmcgYXMgcG9zc2libGUuICBUaGUgbWVtb3J5IGlzIG9ubHkgZnJlZWQgd2hlbiBpdCBpcyBuZWVkZWQgZm9yIGFub3RoZXIgbG9nIHdyaXRlci4KKyAgICBWZWN0b3I8IHNwPE5CTG9nOjpXcml0ZXI+ID4gbVVucmVnaXN0ZXJlZFdyaXRlcnM7CisgICAgTXV0ZXggICAgICAgICAgICAgICBtVW5yZWdpc3RlcmVkV3JpdGVyc0xvY2s7CiBwdWJsaWM6CiAKICAgICBjbGFzcyBTeW5jRXZlbnQ7CkBAIC0yNDksNyArMjgwLDcgQEAKICAgICAgICAgICAgICAgICAgIGludCB0cmlnZ2VyU2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgIGludCBsaXN0ZW5lclNlc3Npb24sCiAgICAgICAgICAgICAgICAgICBzeW5jX2V2ZW50X2NhbGxiYWNrX3QgY2FsbEJhY2ssCi0gICAgICAgICAgICAgICAgICB2b2lkICpjb29raWUpCisgICAgICAgICAgICAgICAgICB3cDxSZWZCYXNlPiBjb29raWUpCiAgICAgICAgIDogbVR5cGUodHlwZSksIG1UcmlnZ2VyU2Vzc2lvbih0cmlnZ2VyU2Vzc2lvbiksIG1MaXN0ZW5lclNlc3Npb24obGlzdGVuZXJTZXNzaW9uKSwKICAgICAgICAgICBtQ2FsbGJhY2soY2FsbEJhY2spLCBtQ29va2llKGNvb2tpZSkKICAgICAgICAge30KQEAgLTI2MiwxNCArMjkzLDE0IEBACiAgICAgICAgIEF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1UeXBlOyB9CiAgICAgICAgIGludCB0cmlnZ2VyU2Vzc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1UcmlnZ2VyU2Vzc2lvbjsgfQogICAgICAgICBpbnQgbGlzdGVuZXJTZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbUxpc3RlbmVyU2Vzc2lvbjsgfQotICAgICAgICB2b2lkICpjb29raWUoKSBjb25zdCB7IHJldHVybiBtQ29va2llOyB9CisgICAgICAgIHdwPFJlZkJhc2U+IGNvb2tpZSgpIGNvbnN0IHsgcmV0dXJuIG1Db29raWU7IH0KIAogICAgIHByaXZhdGU6CiAgICAgICAgICAgY29uc3QgQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCBtVHlwZTsKICAgICAgICAgICBjb25zdCBpbnQgbVRyaWdnZXJTZXNzaW9uOwogICAgICAgICAgIGNvbnN0IGludCBtTGlzdGVuZXJTZXNzaW9uOwogICAgICAgICAgIHN5bmNfZXZlbnRfY2FsbGJhY2tfdCBtQ2FsbGJhY2s7Ci0gICAgICAgICAgdm9pZCAqIGNvbnN0IG1Db29raWU7CisgICAgICAgICAgY29uc3Qgd3A8UmVmQmFzZT4gbUNvb2tpZTsKICAgICAgICAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwogICAgIH07CiAKQEAgLTI3Nyw3ICszMDgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmlnZ2VyU2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGlzdGVuZXJTZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNfZXZlbnRfY2FsbGJhY2tfdCBjYWxsQmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb29raWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdwPFJlZkJhc2U+IGNvb2tpZSk7CiAKIHByaXZhdGU6CiAgICAgY2xhc3MgQXVkaW9Id0RldmljZTsgICAgLy8gZndkIGRlY2xhcmF0aW9uIGZvciBmaW5kU3VpdGFibGVId0Rldl9sCkBAIC0zMDAsNiArMzMxLDQ5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyk7CiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgcHVyZ2VTdGFsZUVmZmVjdHNfbCgpOwogCisgICAgLy8gU2V0IGtFbmFibGVFeHRlbmRlZENoYW5uZWxzIHRvIHRydWUgdG8gZW5hYmxlIGdyZWF0ZXIgdGhhbiBzdGVyZW8gb3V0cHV0CisgICAgLy8gZm9yIHRoZSBNaXhlclRocmVhZCBhbmQgZGV2aWNlIHNpbmsuICBOdW1iZXIgb2YgY2hhbm5lbHMgYWxsb3dlZCBpcworICAgIC8vIEZDQ18yIDw9IGNoYW5uZWxzIDw9IEF1ZGlvTWl4ZXI6Ok1BWF9OVU1fQ0hBTk5FTFMuCisgICAgc3RhdGljIGNvbnN0IGJvb2wga0VuYWJsZUV4dGVuZGVkQ2hhbm5lbHMgPSB0cnVlOworCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIGNoYW5uZWwgbWFzayBpcyBwZXJtaXR0ZWQgZm9yIHRoZSBQQ00gc2luayBpbiB0aGUgTWl4ZXJUaHJlYWQKKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgaXNWYWxpZFBjbVNpbmtDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaykgeworICAgICAgICBzd2l0Y2ggKGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfcmVwcmVzZW50YXRpb24oY2hhbm5lbE1hc2spKSB7CisgICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9SRVBSRVNFTlRBVElPTl9QT1NJVElPTjogeworICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gRkNDXzI7IC8vIHN0ZXJlbyBpcyBkZWZhdWx0CisgICAgICAgICAgICBpZiAoa0VuYWJsZUV4dGVuZGVkQ2hhbm5lbHMpIHsKKyAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spOworICAgICAgICAgICAgICAgIGlmIChjaGFubmVsQ291bnQgPCBGQ0NfMiAvLyBtb25vIGlzIG5vdCBzdXBwb3J0ZWQgYXQgdGhpcyB0aW1lCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBjaGFubmVsQ291bnQgPiBBdWRpb01peGVyOjpNQVhfTlVNX0NIQU5ORUxTKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBjaGVjayB0aGF0IGNoYW5uZWxNYXNrIGlzIHRoZSAiY2Fub25pY2FsIiBvbmUgd2UgZXhwZWN0IGZvciB0aGUgY2hhbm5lbENvdW50LgorICAgICAgICAgICAgcmV0dXJuIGNoYW5uZWxNYXNrID09IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChjaGFubmVsQ291bnQpOworICAgICAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gU2V0IGtFbmFibGVFeHRlbmRlZFByZWNpc2lvbiB0byB0cnVlIHRvIHVzZSBleHRlbmRlZCBwcmVjaXNpb24gaW4gTWl4ZXJUaHJlYWQKKyAgICBzdGF0aWMgY29uc3QgYm9vbCBrRW5hYmxlRXh0ZW5kZWRQcmVjaXNpb24gPSB0cnVlOworCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIGZvcm1hdCBpcyBwZXJtaXR0ZWQgZm9yIHRoZSBQQ00gc2luayBpbiB0aGUgTWl4ZXJUaHJlYWQKKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgaXNWYWxpZFBjbVNpbmtGb3JtYXQoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7CisgICAgICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgorICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRDoKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzMyX0JJVDoKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzhfMjRfQklUOgorICAgICAgICAgICAgcmV0dXJuIGtFbmFibGVFeHRlbmRlZFByZWNpc2lvbjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIHN0YW5kYnkgZGVsYXkgZm9yIE1JWEVSIGFuZCBEVVBMSUNBVElORyBwbGF5YmFjayB0aHJlYWRzIGlzIHJlYWQgZnJvbSBwcm9wZXJ0eQogICAgIC8vIHJvLmF1ZGlvLmZsaW5nZXJfc3RhbmRieXRpbWVfbXMgb3IgZGVmYXVsdHMgdG8ga0RlZmF1bHRTdGFuZGJ5VGltZUluTnNlY3MKICAgICBzdGF0aWMgbnNlY3NfdCAgICAgICAgICBtU3RhbmRieVRpbWVJbk5zZWNzOwpAQCAtMzk0LDYgKzQ2OCw4IEBACiAKICNpbmNsdWRlICJFZmZlY3RzLmgiCiAKKyNpbmNsdWRlICJQYXRjaFBhbmVsLmgiCisKICAgICAvLyBzZXJ2ZXIgc2lkZSBvZiB0aGUgY2xpZW50J3MgSUF1ZGlvVHJhY2sKICAgICBjbGFzcyBUcmFja0hhbmRsZSA6IHB1YmxpYyBhbmRyb2lkOjpCbkF1ZGlvVHJhY2sgewogICAgIHB1YmxpYzoKQEAgLTQyNyw3ICs1MDMsNiBAQAogICAgIHB1YmxpYzoKICAgICAgICAgUmVjb3JkSGFuZGxlKGNvbnN0IHNwPFJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s+JiByZWNvcmRUcmFjayk7CiAgICAgICAgIHZpcnR1YWwgICAgICAgICAgICAgflJlY29yZEhhbmRsZSgpOwotICAgICAgICB2aXJ0dWFsIHNwPElNZW1vcnk+IGdldENibGsoKSBjb25zdDsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydChpbnQgLypBdWRpb1N5c3RlbTo6c3luY19ldmVudF90Ki8gZXZlbnQsIGludCB0cmlnZ2VyU2Vzc2lvbik7CiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgc3RvcCgpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IG9uVHJhbnNhY3QoCkBAIC00NDMsMTUgKzUxOCwzOSBAQAogICAgICAgICAgICAgICBQbGF5YmFja1RocmVhZCAqY2hlY2tQbGF5YmFja1RocmVhZF9sKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgY29uc3Q7CiAgICAgICAgICAgICAgIE1peGVyVGhyZWFkICpjaGVja01peGVyVGhyZWFkX2woYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBjb25zdDsKICAgICAgICAgICAgICAgUmVjb3JkVGhyZWFkICpjaGVja1JlY29yZFRocmVhZF9sKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KSBjb25zdDsKKyAgICAgICAgICAgICAgc3A8UmVjb3JkVGhyZWFkPiBvcGVuSW5wdXRfbChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyk7CisgICAgICAgICAgICAgIHNwPFBsYXliYWNrVGhyZWFkPiBvcGVuT3V0cHV0X2woYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyk7CisKKyAgICAgICAgICAgICAgdm9pZCBjbG9zZU91dHB1dEZpbmlzaChzcDxQbGF5YmFja1RocmVhZD4gdGhyZWFkKTsKKyAgICAgICAgICAgICAgdm9pZCBjbG9zZUlucHV0RmluaXNoKHNwPFJlY29yZFRocmVhZD4gdGhyZWFkKTsKKwogICAgICAgICAgICAgICAvLyBubyByYW5nZSBjaGVjaywgQXVkaW9GbGluZ2VyOjptTG9jayBoZWxkCiAgICAgICAgICAgICAgIGJvb2wgc3RyZWFtTXV0ZV9sKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBtU3RyZWFtVHlwZXNbc3RyZWFtXS5tdXRlOyB9CiAgICAgICAgICAgICAgIC8vIG5vIHJhbmdlIGNoZWNrLCBkb2Vzbid0IGNoZWNrIHBlci10aHJlYWQgc3RyZWFtIHZvbHVtZSwgQXVkaW9GbGluZ2VyOjptTG9jayBoZWxkCiAgICAgICAgICAgICAgIGZsb2F0IHN0cmVhbVZvbHVtZV9sKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBtU3RyZWFtVHlwZXNbc3RyZWFtXS52b2x1bWU7IH0KLSAgICAgICAgICAgICAgdm9pZCBhdWRpb0NvbmZpZ0NoYW5nZWRfbChpbnQgZXZlbnQsIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCB2b2lkICpwYXJhbTIpOworICAgICAgICAgICAgICB2b2lkIGF1ZGlvQ29uZmlnQ2hhbmdlZChpbnQgZXZlbnQsIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCB2b2lkICpwYXJhbTIpOwogCi0gICAgICAgICAgICAgIC8vIGFsbG9jYXRlIGFuIGF1ZGlvX2lvX2hhbmRsZV90LCBzZXNzaW9uIElELCBvciBlZmZlY3QgSUQKKyAgICAgICAgICAgICAgLy8gQWxsb2NhdGUgYW4gYXVkaW9faW9faGFuZGxlX3QsIHNlc3Npb24gSUQsIGVmZmVjdCBJRCwgb3IgYXVkaW9fbW9kdWxlX2hhbmRsZV90LgorICAgICAgICAgICAgICAvLyBUaGV5IGFsbCBzaGFyZSB0aGUgc2FtZSBJRCBzcGFjZSwgYnV0IHRoZSBuYW1lc3BhY2VzIGFyZSBhY3R1YWxseSBpbmRlcGVuZGVudAorICAgICAgICAgICAgICAvLyBiZWNhdXNlIHRoZXJlIGFyZSBzZXBhcmF0ZSBLZXllZFZlY3RvcnMgZm9yIGVhY2gga2luZCBvZiBJRC4KKyAgICAgICAgICAgICAgLy8gVGhlIHJldHVybiB2YWx1ZSBpcyB1aW50MzJfdCwgYnV0IGlzIGNhc3QgdG8gc2lnbmVkIGZvciBzb21lIElEcy4KKyAgICAgICAgICAgICAgLy8gRklYTUUgVGhpcyBBUEkgZG9lcyBub3QgaGFuZGxlIHJvbGxvdmVyIHRvIHplcm8gKGZvciB1bnNpZ25lZCBJRHMpLAorICAgICAgICAgICAgICAvLyAgICAgICBvciBmcm9tIHBvc2l0aXZlIHRvIG5lZ2F0aXZlIChmb3Igc2lnbmVkIElEcykuCisgICAgICAgICAgICAgIC8vICAgICAgIFRodXMgaXQgbWF5IGZhaWwgYnkgcmV0dXJuaW5nIGFuIElEIG9mIHRoZSB3cm9uZyBzaWduLAorICAgICAgICAgICAgICAvLyAgICAgICBvciBieSByZXR1cm5pbmcgYSBub24tdW5pcXVlIElELgogICAgICAgICAgICAgICB1aW50MzJfdCBuZXh0VW5pcXVlSWQoKTsKIAogICAgICAgICAgICAgICBzdGF0dXNfdCBtb3ZlRWZmZWN0Q2hhaW5fbChpbnQgc2Vzc2lvbklkLApAQCAtNDY3LDEwICs1NjYsMjYgQEAKIAogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHJlbW92ZUNsaWVudF9sKHBpZF90IHBpZCk7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgcmVtb3ZlTm90aWZpY2F0aW9uQ2xpZW50KHBpZF90IHBpZCk7Ci0KICAgICAgICAgICAgICAgICBib29sIGlzTm9uT2ZmbG9hZGFibGVHbG9iYWxFZmZlY3RFbmFibGVkX2woKTsKICAgICAgICAgICAgICAgICB2b2lkIG9uTm9uT2ZmbG9hZGFibGVHbG9iYWxFZmZlY3RFbmFibGUoKTsKIAorICAgICAgICAgICAgICAgIC8vIFN0b3JlIGFuIGVmZmVjdCBjaGFpbiB0byBtT3JwaGFuRWZmZWN0Q2hhaW5zIGtleWVkIHZlY3Rvci4KKyAgICAgICAgICAgICAgICAvLyBDYWxsZWQgd2hlbiBhIHRocmVhZCBleGl0cyBhbmQgZWZmZWN0cyBhcmUgc3RpbGwgYXR0YWNoZWQgdG8gaXQuCisgICAgICAgICAgICAgICAgLy8gSWYgZWZmZWN0cyBhcmUgbGF0ZXIgY3JlYXRlZCBvbiB0aGUgc2FtZSBzZXNzaW9uLCB0aGV5IHdpbGwgcmV1c2UgdGhlIHNhbWUKKyAgICAgICAgICAgICAgICAvLyBlZmZlY3QgY2hhaW4gYW5kIHNhbWUgaW5zdGFuY2VzIGluIHRoZSBlZmZlY3QgbGlicmFyeS4KKyAgICAgICAgICAgICAgICAvLyByZXR1cm4gQUxSRUFEWV9FWElTVFMgaWYgYSBjaGFpbiB3aXRoIHRoZSBzYW1lIHNlc3Npb24gYWxyZWFkeSBleGlzdHMgaW4KKyAgICAgICAgICAgICAgICAvLyBtT3JwaGFuRWZmZWN0Q2hhaW5zLiBOb3RlIHRoYXQgdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIGFzIHRoZXJlIGlzIG9ubHkgb25lCisgICAgICAgICAgICAgICAgLy8gY2hhaW4gZm9yIGEgZ2l2ZW4gc2Vzc2lvbiBhbmQgaXQgaXMgYXR0YWNoZWQgdG8gb25seSBvbmUgdGhyZWFkIGF0IGEgdGltZS4KKyAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgcHV0T3JwaGFuRWZmZWN0Q2hhaW5fbChjb25zdCBzcDxFZmZlY3RDaGFpbj4mIGNoYWluKTsKKyAgICAgICAgICAgICAgICAvLyBHZXQgYW4gZWZmZWN0IGNoYWluIGZvciB0aGUgc3BlY2lmaWVkIHNlc3Npb24gaW4gbU9ycGhhbkVmZmVjdENoYWlucyBhbmQgcmVtb3ZlCisgICAgICAgICAgICAgICAgLy8gaXQgaWYgZm91bmQuIFJldHVybnMgMCBpZiBub3QgZm91bmQgKHRoaXMgaXMgdGhlIG1vc3QgY29tbW9uIGNhc2UpLgorICAgICAgICAgICAgICAgIHNwPEVmZmVjdENoYWluPiBnZXRPcnBoYW5FZmZlY3RDaGFpbl9sKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbGFzdCBlZmZlY3QgaGFuZGxlIG9uIGFuIGVmZmVjdCBpbnN0YW5jZSBpcyByZW1vdmVkLiBJZiB0aGlzCisgICAgICAgICAgICAgICAgLy8gZWZmZWN0IGJlbG9uZ3MgdG8gYW4gZWZmZWN0IGNoYWluIGluIG1PcnBoYW5FZmZlY3RDaGFpbnMsIHRoZSBjaGFpbiBpcyB1cGRhdGVkCisgICAgICAgICAgICAgICAgLy8gYW5kIHJlbW92ZWQgZnJvbSBtT3JwaGFuRWZmZWN0Q2hhaW5zIGlmIGl0IGRvZXMgbm90IGNvbnRhaW4gYW55IGVmZmVjdC4KKyAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZWZmZWN0IHdhcyBmb3VuZCBpbiBtT3JwaGFuRWZmZWN0Q2hhaW5zLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgIHVwZGF0ZU9ycGhhbkVmZmVjdENoYWlucyhjb25zdCBzcDxFZmZlY3RNb2R1bGU+JiBlZmZlY3QpOworCiAgICAgY2xhc3MgQXVkaW9Id0RldmljZSB7CiAgICAgcHVibGljOgogICAgICAgICBlbnVtIEZsYWdzIHsKQEAgLTQ3OCwxMCArNTkzLDExIEBACiAgICAgICAgICAgICBBSFdEX0NBTl9TRVRfTUFTVEVSX01VVEUgICAgPSAweDIsCiAgICAgICAgIH07CiAKLSAgICAgICAgQXVkaW9Id0RldmljZShjb25zdCBjaGFyICptb2R1bGVOYW1lLAorICAgICAgICBBdWRpb0h3RGV2aWNlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbW9kdWxlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19od19kZXZpY2VfdCAqaHdEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3MgZmxhZ3MpCi0gICAgICAgICAgICA6IG1Nb2R1bGVOYW1lKHN0cmR1cChtb2R1bGVOYW1lKSkKKyAgICAgICAgICAgIDogbUhhbmRsZShoYW5kbGUpLCBtTW9kdWxlTmFtZShzdHJkdXAobW9kdWxlTmFtZSkpCiAgICAgICAgICAgICAsIG1Id0RldmljZShod0RldmljZSkKICAgICAgICAgICAgICwgbUZsYWdzKGZsYWdzKSB7IH0KICAgICAgICAgLyp2aXJ0dWFsKi8gfkF1ZGlvSHdEZXZpY2UoKSB7IGZyZWUoKHZvaWQgKiltTW9kdWxlTmFtZSk7IH0KQEAgLTQ5NCwxMiArNjEwLDE2IEBACiAgICAgICAgICAgICByZXR1cm4gKDAgIT0gKG1GbGFncyAmIEFIV0RfQ0FOX1NFVF9NQVNURVJfTVVURSkpOwogICAgICAgICB9CiAKKyAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIG1IYW5kbGU7IH0KICAgICAgICAgY29uc3QgY2hhciAqbW9kdWxlTmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1Nb2R1bGVOYW1lOyB9CiAgICAgICAgIGF1ZGlvX2h3X2RldmljZV90ICpod0RldmljZSgpIGNvbnN0IHsgcmV0dXJuIG1Id0RldmljZTsgfQorICAgICAgICB1aW50MzJfdCB2ZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gbUh3RGV2aWNlLT5jb21tb24udmVyc2lvbjsgfQorCiAgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3QgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1IYW5kbGU7CiAgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCBtTW9kdWxlTmFtZTsKICAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgKiBjb25zdCBtSHdEZXZpY2U7Ci0gICAgICAgIEZsYWdzIG1GbGFnczsKKyAgICAgICAgY29uc3QgRmxhZ3MgbUZsYWdzOwogICAgIH07CiAKICAgICAvLyBBdWRpb1N0cmVhbU91dCBhbmQgQXVkaW9TdHJlYW1JbiBhcmUgaW1tdXRhYmxlLCBzbyB0aGVpciBmaWVsZHMgYXJlIGNvbnN0LgpAQCAtNTA5LDcgKzYyOSw3IEBACiAgICAgc3RydWN0IEF1ZGlvU3RyZWFtT3V0IHsKICAgICAgICAgQXVkaW9Id0RldmljZSogY29uc3QgYXVkaW9Id0RldjsKICAgICAgICAgYXVkaW9fc3RyZWFtX291dF90KiBjb25zdCBzdHJlYW07Ci0gICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzOworICAgICAgICBjb25zdCBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFnczsKIAogICAgICAgICBhdWRpb19od19kZXZpY2VfdCogaHdEZXYoKSBjb25zdCB7IHJldHVybiBhdWRpb0h3RGV2LT5od0RldmljZSgpOyB9CiAKQEAgLTUzNyw3ICs2NTcsMTEgQEAKICAgICB9OwogCiAgICAgbXV0YWJsZSAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2s7Ci0KKyAgICAgICAgICAgICAgICAvLyBwcm90ZWN0cyBtQ2xpZW50cyBhbmQgbU5vdGlmaWNhdGlvbkNsaWVudHMuCisgICAgICAgICAgICAgICAgLy8gbXVzdCBiZSBsb2NrZWQgYWZ0ZXIgbUxvY2sgYW5kIFRocmVhZEJhc2U6Om1Mb2NrIGlmIGJvdGggbXVzdCBiZSBsb2NrZWQKKyAgICAgICAgICAgICAgICAvLyBhdm9pZHMgYWNxdWlyaW5nIEF1ZGlvRmxpbmdlcjo6bUxvY2sgZnJvbSBpbnNpZGUgdGhyZWFkIGxvb3AuCisgICAgbXV0YWJsZSAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNsaWVudExvY2s7CisgICAgICAgICAgICAgICAgLy8gcHJvdGVjdGVkIGJ5IG1DbGllbnRMb2NrCiAgICAgICAgICAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPCBwaWRfdCwgd3A8Q2xpZW50PiA+ICAgICBtQ2xpZW50czsgICAvLyBzZWUgfkNsaWVudCgpCiAKICAgICAgICAgICAgICAgICBtdXRhYmxlICAgICBNdXRleCAgICAgICAgICAgICAgICAgICBtSGFyZHdhcmVMb2NrOwpAQCAtNTg2LDggKzcxMCwxMyBAQAogCiAgICAgICAgICAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPCBhdWRpb19pb19oYW5kbGVfdCwgc3A8UmVjb3JkVGhyZWFkPiA+ICAgIG1SZWNvcmRUaHJlYWRzOwogCisgICAgICAgICAgICAgICAgLy8gcHJvdGVjdGVkIGJ5IG1DbGllbnRMb2NrCiAgICAgICAgICAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPCBwaWRfdCwgc3A8Tm90aWZpY2F0aW9uQ2xpZW50PiA+ICAgIG1Ob3RpZmljYXRpb25DbGllbnRzOworCiAgICAgICAgICAgICAgICAgdm9sYXRpbGUgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgbU5leHRVbmlxdWVJZDsgIC8vIHVwZGF0ZWQgYnkgYW5kcm9pZF9hdG9taWNfaW5jCisgICAgICAgICAgICAgICAgLy8gbmV4dFVuaXF1ZUlkKCkgcmV0dXJucyB1aW50MzJfdCwgYnV0IHRoaXMgaXMgZGVjbGFyZWQgaW50MzJfdAorICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlIGF0b21pYyBvcGVyYXRpb25zIHJlcXVpcmUgYW4gaW50MzJfdAorCiAgICAgICAgICAgICAgICAgYXVkaW9fbW9kZV90ICAgICAgICAgICAgICAgICAgICAgICAgbU1vZGU7CiAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ0TnJlY0lzT2ZmOwogCkBAIC02MDEsMTIgKzczMCwxNyBAQAogICAgICAgICAgICAgICAgIFZlY3RvciA8IHNwPFN5bmNFdmVudD4gPiBtUGVuZGluZ1N5bmNFdmVudHM7IC8vIHN5bmMgZXZlbnRzIGF3YWl0aW5nIGZvciBhIHNlc3Npb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBiZSBjcmVhdGVkCiAKKyAgICAgICAgICAgICAgICAvLyBFZmZlY3QgY2hhaW5zIHdpdGhvdXQgYSB2YWxpZCB0aHJlYWQKKyAgICAgICAgICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8IGF1ZGlvX3Nlc3Npb25fdCAsIHNwPEVmZmVjdENoYWluPiA+IG1PcnBoYW5FZmZlY3RDaGFpbnM7CisKIHByaXZhdGU6Ci0gICAgc3A8Q2xpZW50PiAgcmVnaXN0ZXJQaWRfbChwaWRfdCBwaWQpOyAgICAvLyBhbHdheXMgcmV0dXJucyBub24tMAorICAgIHNwPENsaWVudD4gIHJlZ2lzdGVyUGlkKHBpZF90IHBpZCk7ICAgIC8vIGFsd2F5cyByZXR1cm5zIG5vbi0wCiAKICAgICAvLyBmb3IgdXNlIGZyb20gZGVzdHJ1Y3RvcgogICAgIHN0YXR1c190ICAgIGNsb3NlT3V0cHV0X25vbnZpcnR1YWwoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKKyAgICB2b2lkICAgICAgICBjbG9zZU91dHB1dEludGVybmFsX2woc3A8UGxheWJhY2tUaHJlYWQ+IHRocmVhZCk7CiAgICAgc3RhdHVzX3QgICAgY2xvc2VJbnB1dF9ub252aXJ0dWFsKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKKyAgICB2b2lkICAgICAgICBjbG9zZUlucHV0SW50ZXJuYWxfbChzcDxSZWNvcmRUaHJlYWQ+IHRocmVhZCk7CiAKICNpZmRlZiBURUVfU0lOSwogICAgIC8vIGFsbCByZWNvcmQgdGhyZWFkcyBzZXJpYWxseSBzaGFyZSBhIGNvbW1vbiB0ZWUgc2luaywgd2hpY2ggaXMgcmUtY3JlYXRlZCBvbiBmb3JtYXQgY2hhbmdlCkBAIC02MzQsNyArNzY4LDcgQEAKICAgICAvLyAweDIwMDAwMCBzdGVyZW8gMTYtYml0IFBDTSBmcmFtZXMgPSA0Ny41IHNlY29uZHMgYXQgNDQuMSBrSHosIDggbWVnYWJ5dGVzCiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrVGVlU2lua0lucHV0RnJhbWVzRGVmYXVsdCA9IDB4MjAwMDAwOwogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1RlZVNpbmtPdXRwdXRGcmFtZXNEZWZhdWx0ID0gMHgyMDAwMDA7Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrVGVlU2lua1RyYWNrRnJhbWVzRGVmYXVsdCA9IDB4MTAwMDsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtUZWVTaW5rVHJhY2tGcmFtZXNEZWZhdWx0ID0gMHgyMDAwMDA7CiAjZW5kaWYKIAogICAgIC8vIFRoaXMgbWV0aG9kIHJlYWRzIGZyb20gYSB2YXJpYWJsZSB3aXRob3V0IG1Mb2NrLCBidXQgdGhlIHZhcmlhYmxlIGlzIHVwZGF0ZWQgdW5kZXIgbUxvY2suICBTbwpAQCAtNjQ3LDEwICs3ODEsMTcgQEAKICAgICBib29sICAgIG1Jc0xvd1JhbURldmljZTsKICAgICBib29sICAgIG1Jc0RldmljZVR5cGVLbm93bjsKICAgICBuc2Vjc190IG1HbG9iYWxFZmZlY3RFbmFibGVUaW1lOyAgLy8gd2hlbiBhIGdsb2JhbCBlZmZlY3Qgd2FzIGxhc3QgZW5hYmxlZAorCisgICAgc3A8UGF0Y2hQYW5lbD4gbVBhdGNoUGFuZWw7CisKKyAgICB1aW50MzJfdCAgICBtUHJpbWFyeU91dHB1dFNhbXBsZVJhdGU7ICAgLy8gc2FtcGxlIHJhdGUgb2YgdGhlIHByaW1hcnkgb3V0cHV0LCBvciB6ZXJvIGlmIG5vbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvdGVjdGVkIGJ5IG1IYXJkd2FyZUxvY2sKIH07CiAKICN1bmRlZiBJTkNMVURJTkdfRlJPTV9BVURJT0ZMSU5HRVJfSAogCitjb25zdCBjaGFyICpmb3JtYXRUb1N0cmluZyhhdWRpb19mb3JtYXRfdCBmb3JtYXQpOworCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5jcHAKaW5kZXggMDdkYzZkZC4uZmQyOGVhMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmNwcApAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgpAQCAtMzQsNjUgKzM1LDM0NSBAQAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Zvcm1hdC5oPgogI2luY2x1ZGUgPGNvbW1vbl90aW1lL2xvY2FsX2Nsb2NrLmg+CiAjaW5jbHVkZSA8Y29tbW9uX3RpbWUvY2NfaGVscGVyLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oPgorI2luY2x1ZGUgPGF1ZGlvX2VmZmVjdHMvZWZmZWN0X2Rvd25taXguaD4KIAorI2luY2x1ZGUgIkF1ZGlvTWl4ZXJPcHMuaCIKICNpbmNsdWRlICJBdWRpb01peGVyLmgiCiAKKy8vIFRoZSBGQ0NfMiBtYWNybyByZWZlcnMgdG8gdGhlIEZpeGVkIENoYW5uZWwgQ291bnQgb2YgMiBmb3IgdGhlIGxlZ2FjeSBpbnRlZ2VyIG1peGVyLgorI2lmbmRlZiBGQ0NfMgorI2RlZmluZSBGQ0NfMiAyCisjZW5kaWYKKworLy8gTG9vayBmb3IgTU9OT19IQUNLIGZvciBhbnkgTW9ubyBoYWNrIGludm9sdmluZyBsZWdhY3kgbW9ubyBjaGFubmVsIHRvCisvLyBzdGVyZW8gY2hhbm5lbCBjb252ZXJzaW9uLgorCisvKiBWRVJZX1ZFUllfVkVSQk9TRV9MT0dHSU5HIHdpbGwgc2hvdyBleGFjdGx5IHdoaWNoIHByb2Nlc3MgaG9vayBhbmQgdHJhY2sgaG9vayBpcworICogYmVpbmcgdXNlZC4gVGhpcyBpcyBhIGNvbnNpZGVyYWJsZSBhbW91bnQgb2YgbG9nIHNwYW0sIHNvIGRvbid0IGVuYWJsZSB1bmxlc3MgeW91CisgKiBhcmUgdmVyaWZ5aW5nIHRoZSBob29rIGJhc2VkIGNvZGUuCisgKi8KKy8vI2RlZmluZSBWRVJZX1ZFUllfVkVSQk9TRV9MT0dHSU5HCisjaWZkZWYgVkVSWV9WRVJZX1ZFUkJPU0VfTE9HR0lORworI2RlZmluZSBBTE9HVlYgQUxPR1YKKy8vZGVmaW5lIEFMT0dWViBwcmludGYgIC8vIGZvciB0ZXN0LW1peGVyLmNwcAorI2Vsc2UKKyNkZWZpbmUgQUxPR1ZWKGEuLi4pIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWZuZGVmIEFSUkFZX1NJWkUKKyNkZWZpbmUgQVJSQVlfU0laRSh4KSAoc2l6ZW9mKHgpL3NpemVvZigoeClbMF0pKQorI2VuZGlmCisKKy8vIFNldCBrVXNlTmV3TWl4ZXIgdG8gdHJ1ZSB0byB1c2UgdGhlIG5ldyBtaXhlciBlbmdpbmUuIE90aGVyd2lzZSB0aGUKKy8vIG9yaWdpbmFsIGNvZGUgd2lsbCBiZSB1c2VkLiAgVGhpcyBpcyBmYWxzZSBmb3Igbm93Lgorc3RhdGljIGNvbnN0IGJvb2wga1VzZU5ld01peGVyID0gZmFsc2U7CisKKy8vIFNldCBrVXNlRmxvYXQgdG8gdHJ1ZSB0byBhbGxvdyBmbG9hdGluZyBpbnB1dCBpbnRvIHRoZSBtaXhlciBlbmdpbmUuCisvLyBJZiBrVXNlTmV3TWl4ZXIgaXMgZmFsc2UsIHRoaXMgaXMgaWdub3JlZCBvciBtYXkgYmUgb3ZlcnJpZGRlbiBpbnRlcm5hbGx5CisvLyBiZWNhdXNlIG9mIGRvd25taXgvdXBtaXggc3VwcG9ydC4KK3N0YXRpYyBjb25zdCBib29sIGtVc2VGbG9hdCA9IHRydWU7CisKKy8vIFNldCB0byBkZWZhdWx0IGNvcHkgYnVmZmVyIHNpemUgaW4gZnJhbWVzIGZvciBpbnB1dCBwcm9jZXNzaW5nLgorc3RhdGljIGNvbnN0IHNpemVfdCBrQ29weUJ1ZmZlckZyYW1lQ291bnQgPSAyNTY7CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQXVkaW9NaXhlcjo6RG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OkRvd25taXhlckJ1ZmZlclByb3ZpZGVyKCkgOiBBdWRpb0J1ZmZlclByb3ZpZGVyKCksCi0gICAgICAgIG1UcmFja0J1ZmZlclByb3ZpZGVyKE5VTEwpLCBtRG93bm1peEhhbmRsZShOVUxMKQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1QgbWluKGNvbnN0IFQmIGEsIGNvbnN0IFQmIGIpCiB7CisgICAgcmV0dXJuIGEgPCBiID8gYSA6IGI7Cit9CisKK0F1ZGlvTWl4ZXI6OkNvcHlCdWZmZXJQcm92aWRlcjo6Q29weUJ1ZmZlclByb3ZpZGVyKHNpemVfdCBpbnB1dEZyYW1lU2l6ZSwKKyAgICAgICAgc2l6ZV90IG91dHB1dEZyYW1lU2l6ZSwgc2l6ZV90IGJ1ZmZlckZyYW1lQ291bnQpIDoKKyAgICAgICAgbUlucHV0RnJhbWVTaXplKGlucHV0RnJhbWVTaXplKSwKKyAgICAgICAgbU91dHB1dEZyYW1lU2l6ZShvdXRwdXRGcmFtZVNpemUpLAorICAgICAgICBtTG9jYWxCdWZmZXJGcmFtZUNvdW50KGJ1ZmZlckZyYW1lQ291bnQpLAorICAgICAgICBtTG9jYWxCdWZmZXJEYXRhKE5VTEwpLAorICAgICAgICBtQ29uc3VtZWQoMCkKK3sKKyAgICBBTE9HVigiQ29weUJ1ZmZlclByb3ZpZGVyKCVwKSglenUsICV6dSwgJXp1KSIsIHRoaXMsCisgICAgICAgICAgICBpbnB1dEZyYW1lU2l6ZSwgb3V0cHV0RnJhbWVTaXplLCBidWZmZXJGcmFtZUNvdW50KTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGlucHV0RnJhbWVTaXplIDwgb3V0cHV0RnJhbWVTaXplICYmIGJ1ZmZlckZyYW1lQ291bnQgPT0gMCwKKyAgICAgICAgICAgICJSZXF1aXJlcyBsb2NhbCBidWZmZXIgaWYgaW5wdXRGcmFtZVNpemUoJXp1KSA8IG91dHB1dEZyYW1lU2l6ZSglenUpIiwKKyAgICAgICAgICAgIGlucHV0RnJhbWVTaXplLCBvdXRwdXRGcmFtZVNpemUpOworICAgIGlmIChtTG9jYWxCdWZmZXJGcmFtZUNvdW50KSB7CisgICAgICAgICh2b2lkKXBvc2l4X21lbWFsaWduKCZtTG9jYWxCdWZmZXJEYXRhLCAzMiwgbUxvY2FsQnVmZmVyRnJhbWVDb3VudCAqIG1PdXRwdXRGcmFtZVNpemUpOworICAgIH0KKyAgICBtQnVmZmVyLmZyYW1lQ291bnQgPSAwOworfQorCitBdWRpb01peGVyOjpDb3B5QnVmZmVyUHJvdmlkZXI6On5Db3B5QnVmZmVyUHJvdmlkZXIoKQoreworICAgIEFMT0dWKCJ+Q29weUJ1ZmZlclByb3ZpZGVyKCVwKSIsIHRoaXMpOworICAgIGlmIChtQnVmZmVyLmZyYW1lQ291bnQgIT0gMCkgeworICAgICAgICBtVHJhY2tCdWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmbUJ1ZmZlcik7CisgICAgfQorICAgIGZyZWUobUxvY2FsQnVmZmVyRGF0YSk7Cit9CisKK3N0YXR1c190IEF1ZGlvTWl4ZXI6OkNvcHlCdWZmZXJQcm92aWRlcjo6Z2V0TmV4dEJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgKnBCdWZmZXIsCisgICAgICAgIGludDY0X3QgcHRzKQoreworICAgIC8vQUxPR1YoIkNvcHlCdWZmZXJQcm92aWRlciglcCk6OmdldE5leHRCdWZmZXIoJXAgKCV6dSksICVsbGQpIiwKKyAgICAvLyAgICAgICAgdGhpcywgcEJ1ZmZlciwgcEJ1ZmZlci0+ZnJhbWVDb3VudCwgcHRzKTsKKyAgICBpZiAobUxvY2FsQnVmZmVyRnJhbWVDb3VudCA9PSAwKSB7CisgICAgICAgIHN0YXR1c190IHJlcyA9IG1UcmFja0J1ZmZlclByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKHBCdWZmZXIsIHB0cyk7CisgICAgICAgIGlmIChyZXMgPT0gT0spIHsKKyAgICAgICAgICAgIGNvcHlGcmFtZXMocEJ1ZmZlci0+cmF3LCBwQnVmZmVyLT5yYXcsIHBCdWZmZXItPmZyYW1lQ291bnQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIGlmIChtQnVmZmVyLmZyYW1lQ291bnQgPT0gMCkgeworICAgICAgICBtQnVmZmVyLmZyYW1lQ291bnQgPSBwQnVmZmVyLT5mcmFtZUNvdW50OworICAgICAgICBzdGF0dXNfdCByZXMgPSBtVHJhY2tCdWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmbUJ1ZmZlciwgcHRzKTsKKyAgICAgICAgLy8gQXQgb25lIHRpbWUgYW4gdXBzdHJlYW0gYnVmZmVyIHByb3ZpZGVyIGhhZAorICAgICAgICAvLyByZXMgPT0gT0sgYW5kIG1CdWZmZXIuZnJhbWVDb3VudCA9PSAwLCBkb2Vzbid0IHNlZW0gdG8gaGFwcGVuIG5vdyA3LzE4LzIwMTQuCisgICAgICAgIC8vCisgICAgICAgIC8vIEJ5IEFQSSBzcGVjLCBpZiByZXMgIT0gT0ssIHRoZW4gbUJ1ZmZlci5mcmFtZUNvdW50ID09IDAuCisgICAgICAgIC8vIGJ1dCB0aGVyZSBtYXkgYmUgaW1wcm9wZXIgaW1wbGVtZW50YXRpb25zLgorICAgICAgICBBTE9HX0FTU0VSVChyZXMgPT0gT0sgfHwgbUJ1ZmZlci5mcmFtZUNvdW50ID09IDApOworICAgICAgICBpZiAocmVzICE9IE9LIHx8IG1CdWZmZXIuZnJhbWVDb3VudCA9PSAwKSB7IC8vIG5vdCBuZWVkZWQgYnkgQVBJIHNwZWMsIGJ1dCB0byBiZSBzYWZlLgorICAgICAgICAgICAgcEJ1ZmZlci0+cmF3ID0gTlVMTDsKKyAgICAgICAgICAgIHBCdWZmZXItPmZyYW1lQ291bnQgPSAwOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgICAgICBtQ29uc3VtZWQgPSAwOworICAgIH0KKyAgICBBTE9HX0FTU0VSVChtQ29uc3VtZWQgPCBtQnVmZmVyLmZyYW1lQ291bnQpOworICAgIHNpemVfdCBjb3VudCA9IG1pbihtTG9jYWxCdWZmZXJGcmFtZUNvdW50LCBtQnVmZmVyLmZyYW1lQ291bnQgLSBtQ29uc3VtZWQpOworICAgIGNvdW50ID0gbWluKGNvdW50LCBwQnVmZmVyLT5mcmFtZUNvdW50KTsKKyAgICBwQnVmZmVyLT5yYXcgPSBtTG9jYWxCdWZmZXJEYXRhOworICAgIHBCdWZmZXItPmZyYW1lQ291bnQgPSBjb3VudDsKKyAgICBjb3B5RnJhbWVzKHBCdWZmZXItPnJhdywgKHVpbnQ4X3QqKW1CdWZmZXIucmF3ICsgbUNvbnN1bWVkICogbUlucHV0RnJhbWVTaXplLAorICAgICAgICAgICAgcEJ1ZmZlci0+ZnJhbWVDb3VudCk7CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIEF1ZGlvTWl4ZXI6OkNvcHlCdWZmZXJQcm92aWRlcjo6cmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgKnBCdWZmZXIpCit7CisgICAgLy9BTE9HVigiQ29weUJ1ZmZlclByb3ZpZGVyKCVwKTo6cmVsZWFzZUJ1ZmZlciglcCglenUpKSIsCisgICAgLy8gICAgICAgIHRoaXMsIHBCdWZmZXIsIHBCdWZmZXItPmZyYW1lQ291bnQpOworICAgIGlmIChtTG9jYWxCdWZmZXJGcmFtZUNvdW50ID09IDApIHsKKyAgICAgICAgbVRyYWNrQnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIocEJ1ZmZlcik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gTE9HX0FMV0FZU19GQVRBTF9JRihwQnVmZmVyLT5mcmFtZUNvdW50ID09IDAsICJJbnZhbGlkIGZyYW1lY291bnQiKTsKKyAgICBtQ29uc3VtZWQgKz0gcEJ1ZmZlci0+ZnJhbWVDb3VudDsgLy8gVE9ETzogdXBkYXRlIGZvciBlZmZpY2llbmN5IHRvIHJldXNlIGV4aXN0aW5nIGNvbnRlbnQKKyAgICBpZiAobUNvbnN1bWVkICE9IDAgJiYgbUNvbnN1bWVkID49IG1CdWZmZXIuZnJhbWVDb3VudCkgeworICAgICAgICBtVHJhY2tCdWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmbUJ1ZmZlcik7CisgICAgICAgIEFMT0dfQVNTRVJUKG1CdWZmZXIuZnJhbWVDb3VudCA9PSAwKTsKKyAgICB9CisgICAgcEJ1ZmZlci0+cmF3ID0gTlVMTDsKKyAgICBwQnVmZmVyLT5mcmFtZUNvdW50ID0gMDsKK30KKwordm9pZCBBdWRpb01peGVyOjpDb3B5QnVmZmVyUHJvdmlkZXI6OnJlc2V0KCkKK3sKKyAgICBpZiAobUJ1ZmZlci5mcmFtZUNvdW50ICE9IDApIHsKKyAgICAgICAgbVRyYWNrQnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJm1CdWZmZXIpOworICAgIH0KKyAgICBtQ29uc3VtZWQgPSAwOworfQorCitBdWRpb01peGVyOjpEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6RG93bm1peGVyQnVmZmVyUHJvdmlkZXIoCisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGlucHV0Q2hhbm5lbE1hc2ssCisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG91dHB1dENoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3Qgc2Vzc2lvbklkLCBzaXplX3QgYnVmZmVyRnJhbWVDb3VudCkgOgorICAgICAgICBDb3B5QnVmZmVyUHJvdmlkZXIoCisgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCkgKiBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soaW5wdXRDaGFubmVsTWFzayksCisgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCkgKiBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sob3V0cHV0Q2hhbm5lbE1hc2spLAorICAgICAgICAgICAgYnVmZmVyRnJhbWVDb3VudCkgIC8vIHNldCBidWZmZXJGcmFtZUNvdW50IHRvIDAgdG8gZG8gaW4tcGxhY2UKK3sKKyAgICBBTE9HVigiRG93bm1peGVyQnVmZmVyUHJvdmlkZXIoJXApKCUjeCwgJSN4LCAlI3ggJXUgJWQpIiwKKyAgICAgICAgICAgIHRoaXMsIGlucHV0Q2hhbm5lbE1hc2ssIG91dHB1dENoYW5uZWxNYXNrLCBmb3JtYXQsCisgICAgICAgICAgICBzYW1wbGVSYXRlLCBzZXNzaW9uSWQpOworICAgIGlmICghc0lzTXVsdGljaGFubmVsQ2FwYWJsZQorICAgICAgICAgICAgfHwgRWZmZWN0Q3JlYXRlKCZzRHdubUZ4RGVzYy51dWlkLAorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgIFNFU1NJT05fSURfSU5WQUxJRF9BTkRfSUdOT1JFRCwKKyAgICAgICAgICAgICAgICAgICAgJm1Eb3dubWl4SGFuZGxlKSAhPSAwKSB7CisgICAgICAgICBBTE9HRSgiRG93bm1peGVyQnVmZmVyUHJvdmlkZXIoKSBlcnJvciBjcmVhdGluZyBkb3dubWl4ZXIgZWZmZWN0Iik7CisgICAgICAgICBtRG93bm1peEhhbmRsZSA9IE5VTEw7CisgICAgICAgICByZXR1cm47CisgICAgIH0KKyAgICAgLy8gY2hhbm5lbCBpbnB1dCBjb25maWd1cmF0aW9uIHdpbGwgYmUgb3ZlcnJpZGRlbiBwZXItdHJhY2sKKyAgICAgbURvd25taXhDb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBpbnB1dENoYW5uZWxNYXNrOyAgIC8vIEZJWE1FOiBTaG91bGQgYmUgYml0cworICAgICBtRG93bm1peENvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSBvdXRwdXRDaGFubmVsTWFzazsgLy8gRklYTUU6IHNob3VsZCBiZSBiaXRzCisgICAgIG1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IGZvcm1hdDsKKyAgICAgbURvd25taXhDb25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IGZvcm1hdDsKKyAgICAgbURvd25taXhDb25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gc2FtcGxlUmF0ZTsKKyAgICAgbURvd25taXhDb25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgIG1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFEOworICAgICBtRG93bm1peENvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1dSSVRFOworICAgICAvLyBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlciBwcm92aWRlciwgYW5kIGZyYW1lIGNvdW50IHdpbGwgbm90IGJlIHVzZWQgYXMgdGhlIGRvd25taXggZWZmZWN0CisgICAgIC8vIHByb2Nlc3MoKSBmdW5jdGlvbiBpcyBjYWxsZWQgZGlyZWN0bHkgKHNlZSBEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6Z2V0TmV4dEJ1ZmZlcigpKQorICAgICBtRG93bm1peENvbmZpZy5pbnB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19TTVBfUkFURSB8IEVGRkVDVF9DT05GSUdfQ0hBTk5FTFMgfAorICAgICAgICAgICAgIEVGRkVDVF9DT05GSUdfRk9STUFUIHwgRUZGRUNUX0NPTkZJR19BQ0NfTU9ERTsKKyAgICAgbURvd25taXhDb25maWcub3V0cHV0Q2ZnLm1hc2sgPSBtRG93bm1peENvbmZpZy5pbnB1dENmZy5tYXNrOworCisgICAgIGludCBjbWRTdGF0dXM7CisgICAgIHVpbnQzMl90IHJlcGx5U2l6ZSA9IHNpemVvZihpbnQpOworCisgICAgIC8vIENvbmZpZ3VyZSBkb3dubWl4ZXIKKyAgICAgc3RhdHVzX3Qgc3RhdHVzID0gKCptRG93bm1peEhhbmRsZSktPmNvbW1hbmQobURvd25taXhIYW5kbGUsCisgICAgICAgICAgICAgRUZGRUNUX0NNRF9TRVRfQ09ORklHIC8qY21kQ29kZSovLCBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSAvKmNtZFNpemUqLywKKyAgICAgICAgICAgICAmbURvd25taXhDb25maWcgLypwQ21kRGF0YSovLAorICAgICAgICAgICAgICZyZXBseVNpemUsICZjbWRTdGF0dXMgLypwUmVwbHlEYXRhKi8pOworICAgICBpZiAoc3RhdHVzICE9IDAgfHwgY21kU3RhdHVzICE9IDApIHsKKyAgICAgICAgIEFMT0dFKCJEb3dubWl4ZXJCdWZmZXJQcm92aWRlcigpIGVycm9yICVkIGNtZFN0YXR1cyAlZCB3aGlsZSBjb25maWd1cmluZyBkb3dubWl4ZXIiLAorICAgICAgICAgICAgICAgICBzdGF0dXMsIGNtZFN0YXR1cyk7CisgICAgICAgICBFZmZlY3RSZWxlYXNlKG1Eb3dubWl4SGFuZGxlKTsKKyAgICAgICAgIG1Eb3dubWl4SGFuZGxlID0gTlVMTDsKKyAgICAgICAgIHJldHVybjsKKyAgICAgfQorCisgICAgIC8vIEVuYWJsZSBkb3dubWl4ZXIKKyAgICAgcmVwbHlTaXplID0gc2l6ZW9mKGludCk7CisgICAgIHN0YXR1cyA9ICgqbURvd25taXhIYW5kbGUpLT5jb21tYW5kKG1Eb3dubWl4SGFuZGxlLAorICAgICAgICAgICAgIEVGRkVDVF9DTURfRU5BQkxFIC8qY21kQ29kZSovLCAwIC8qY21kU2l6ZSovLCBOVUxMIC8qcENtZERhdGEqLywKKyAgICAgICAgICAgICAmcmVwbHlTaXplLCAmY21kU3RhdHVzIC8qcFJlcGx5RGF0YSovKTsKKyAgICAgaWYgKHN0YXR1cyAhPSAwIHx8IGNtZFN0YXR1cyAhPSAwKSB7CisgICAgICAgICBBTE9HRSgiRG93bm1peGVyQnVmZmVyUHJvdmlkZXIoKSBlcnJvciAlZCBjbWRTdGF0dXMgJWQgd2hpbGUgZW5hYmxpbmcgZG93bm1peGVyIiwKKyAgICAgICAgICAgICAgICAgc3RhdHVzLCBjbWRTdGF0dXMpOworICAgICAgICAgRWZmZWN0UmVsZWFzZShtRG93bm1peEhhbmRsZSk7CisgICAgICAgICBtRG93bm1peEhhbmRsZSA9IE5VTEw7CisgICAgICAgICByZXR1cm47CisgICAgIH0KKworICAgICAvLyBTZXQgZG93bm1peCB0eXBlCisgICAgIC8vIHBhcmFtZXRlciBzaXplIHJvdW5kZWQgZm9yIHBhZGRpbmcgb24gMzJiaXQgYm91bmRhcnkKKyAgICAgY29uc3QgaW50IHBzaXplUGFkZGVkID0gKChzaXplb2YoZG93bm1peF9wYXJhbXNfdCkgLSAxKS9zaXplb2YoaW50KSArIDEpICogc2l6ZW9mKGludCk7CisgICAgIGNvbnN0IGludCBkb3dubWl4UGFyYW1TaXplID0KKyAgICAgICAgICAgICBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgcHNpemVQYWRkZWQgKyBzaXplb2YoZG93bm1peF90eXBlX3QpOworICAgICBlZmZlY3RfcGFyYW1fdCAqIGNvbnN0IHBhcmFtID0gKGVmZmVjdF9wYXJhbV90ICopIG1hbGxvYyhkb3dubWl4UGFyYW1TaXplKTsKKyAgICAgcGFyYW0tPnBzaXplID0gc2l6ZW9mKGRvd25taXhfcGFyYW1zX3QpOworICAgICBjb25zdCBkb3dubWl4X3BhcmFtc190IGRvd25taXhQYXJhbSA9IERPV05NSVhfUEFSQU1fVFlQRTsKKyAgICAgbWVtY3B5KHBhcmFtLT5kYXRhLCAmZG93bm1peFBhcmFtLCBwYXJhbS0+cHNpemUpOworICAgICBjb25zdCBkb3dubWl4X3R5cGVfdCBkb3dubWl4VHlwZSA9IERPV05NSVhfVFlQRV9GT0xEOworICAgICBwYXJhbS0+dnNpemUgPSBzaXplb2YoZG93bm1peF90eXBlX3QpOworICAgICBtZW1jcHkocGFyYW0tPmRhdGEgKyBwc2l6ZVBhZGRlZCwgJmRvd25taXhUeXBlLCBwYXJhbS0+dnNpemUpOworICAgICByZXBseVNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgc3RhdHVzID0gKCptRG93bm1peEhhbmRsZSktPmNvbW1hbmQobURvd25taXhIYW5kbGUsCisgICAgICAgICAgICAgRUZGRUNUX0NNRF9TRVRfUEFSQU0gLyogY21kQ29kZSAqLywgZG93bm1peFBhcmFtU2l6ZSAvKiBjbWRTaXplICovLAorICAgICAgICAgICAgIHBhcmFtIC8qcENtZERhdGEqLywgJnJlcGx5U2l6ZSwgJmNtZFN0YXR1cyAvKnBSZXBseURhdGEqLyk7CisgICAgIGZyZWUocGFyYW0pOworICAgICBpZiAoc3RhdHVzICE9IDAgfHwgY21kU3RhdHVzICE9IDApIHsKKyAgICAgICAgIEFMT0dFKCJEb3dubWl4ZXJCdWZmZXJQcm92aWRlcigpIGVycm9yICVkIGNtZFN0YXR1cyAlZCB3aGlsZSBzZXR0aW5nIGRvd25taXggdHlwZSIsCisgICAgICAgICAgICAgICAgIHN0YXR1cywgY21kU3RhdHVzKTsKKyAgICAgICAgIEVmZmVjdFJlbGVhc2UobURvd25taXhIYW5kbGUpOworICAgICAgICAgbURvd25taXhIYW5kbGUgPSBOVUxMOworICAgICAgICAgcmV0dXJuOworICAgICB9CisgICAgIEFMT0dWKCJEb3dubWl4ZXJCdWZmZXJQcm92aWRlcigpIGRvd25taXggdHlwZSBzZXQgdG8gJWQiLCAoaW50KSBkb3dubWl4VHlwZSk7CiB9CiAKIEF1ZGlvTWl4ZXI6OkRvd25taXhlckJ1ZmZlclByb3ZpZGVyOjp+RG93bm1peGVyQnVmZmVyUHJvdmlkZXIoKQogewotICAgIEFMT0dWKCJBdWRpb01peGVyIGRlbGV0aW5nIERvd25taXhlckJ1ZmZlclByb3ZpZGVyICglcCkiLCB0aGlzKTsKKyAgICBBTE9HVigifkRvd25taXhlckJ1ZmZlclByb3ZpZGVyICglcCkiLCB0aGlzKTsKICAgICBFZmZlY3RSZWxlYXNlKG1Eb3dubWl4SGFuZGxlKTsKKyAgICBtRG93bm1peEhhbmRsZSA9IE5VTEw7CiB9CiAKLXN0YXR1c190IEF1ZGlvTWl4ZXI6OkRvd25taXhlckJ1ZmZlclByb3ZpZGVyOjpnZXROZXh0QnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciAqcEJ1ZmZlciwKLSAgICAgICAgaW50NjRfdCBwdHMpIHsKLSAgICAvL0FMT0dWKCJEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6Z2V0TmV4dEJ1ZmZlcigpIik7Ci0gICAgaWYgKHRoaXMtPm1UcmFja0J1ZmZlclByb3ZpZGVyICE9IE5VTEwpIHsKLSAgICAgICAgc3RhdHVzX3QgcmVzID0gbVRyYWNrQnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIocEJ1ZmZlciwgcHRzKTsKLSAgICAgICAgaWYgKHJlcyA9PSBPSykgewotICAgICAgICAgICAgbURvd25taXhDb25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQgPSBwQnVmZmVyLT5mcmFtZUNvdW50OwotICAgICAgICAgICAgbURvd25taXhDb25maWcuaW5wdXRDZmcuYnVmZmVyLnJhdyA9IHBCdWZmZXItPnJhdzsKLSAgICAgICAgICAgIG1Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5idWZmZXIuZnJhbWVDb3VudCA9IHBCdWZmZXItPmZyYW1lQ291bnQ7Ci0gICAgICAgICAgICBtRG93bm1peENvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLnJhdyA9IG1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5yYXc7Ci0gICAgICAgICAgICAvLyBpbi1wbGFjZSBzbyBvdmVyd3JpdGUgdGhlIGJ1ZmZlciBjb250ZW50cywgaGFzIGJlZW4gc2V0IGluIHByZXBhcmVUcmFja0ZvckRvd25taXgoKQotICAgICAgICAgICAgLy9tRG93bm1peENvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1dSSVRFOwordm9pZCBBdWRpb01peGVyOjpEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6Y29weUZyYW1lcyh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcykKK3sKKyAgICBtRG93bm1peENvbmZpZy5pbnB1dENmZy5idWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lczsKKyAgICBtRG93bm1peENvbmZpZy5pbnB1dENmZy5idWZmZXIucmF3ID0gY29uc3RfY2FzdDx2b2lkICo+KHNyYyk7CisgICAgbURvd25taXhDb25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVzOworICAgIG1Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5idWZmZXIucmF3ID0gZHN0OworICAgIC8vIG1heSBiZSBpbi1wbGFjZSBpZiBzcmMgPT0gZHN0LgorICAgIHN0YXR1c190IHJlcyA9ICgqbURvd25taXhIYW5kbGUpLT5wcm9jZXNzKG1Eb3dubWl4SGFuZGxlLAorICAgICAgICAgICAgJm1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLmJ1ZmZlciwgJm1Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5idWZmZXIpOworICAgIEFMT0dFX0lGKHJlcyAhPSBPSywgIkRvd25taXhCdWZmZXJQcm92aWRlciBlcnJvciAlZCIsIHJlcyk7Cit9CiAKLSAgICAgICAgICAgIHJlcyA9ICgqbURvd25taXhIYW5kbGUpLT5wcm9jZXNzKG1Eb3dubWl4SGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAmbURvd25taXhDb25maWcuaW5wdXRDZmcuYnVmZmVyLCAmbURvd25taXhDb25maWcub3V0cHV0Q2ZnLmJ1ZmZlcik7Ci0gICAgICAgICAgICAvL0FMT0dWKCJnZXROZXh0QnVmZmVyIGlzIGRvd25taXhpbmciKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6Z2V0TmV4dEJ1ZmZlcigpIGVycm9yOiBOVUxMIHRyYWNrIGJ1ZmZlciBwcm92aWRlciIpOworLyogY2FsbCBvbmNlIGluIGEgcHRocmVhZF9vbmNlIGhhbmRsZXIuICovCisvKnN0YXRpYyovIHN0YXR1c190IEF1ZGlvTWl4ZXI6OkRvd25taXhlckJ1ZmZlclByb3ZpZGVyOjppbml0KCkKK3sKKyAgICAvLyBmaW5kIG11bHRpY2hhbm5lbCBkb3dubWl4IGVmZmVjdCBpZiB3ZSBoYXZlIHRvIHBsYXkgbXVsdGljaGFubmVsIGNvbnRlbnQKKyAgICB1aW50MzJfdCBudW1FZmZlY3RzID0gMDsKKyAgICBpbnQgcmV0ID0gRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzKCZudW1FZmZlY3RzKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgQUxPR0UoIkF1ZGlvTWl4ZXIoKSBlcnJvciAlZCBxdWVyeWluZyBudW1iZXIgb2YgZWZmZWN0cyIsIHJldCk7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLX0KKyAgICBBTE9HVigiRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzKCkgbnVtRWZmZWN0cz0lZCIsIG51bUVmZmVjdHMpOwogCi12b2lkIEF1ZGlvTWl4ZXI6OkRvd25taXhlckJ1ZmZlclByb3ZpZGVyOjpyZWxlYXNlQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciAqcEJ1ZmZlcikgewotICAgIC8vQUxPR1YoIkRvd25taXhlckJ1ZmZlclByb3ZpZGVyOjpyZWxlYXNlQnVmZmVyKCkiKTsKLSAgICBpZiAodGhpcy0+bVRyYWNrQnVmZmVyUHJvdmlkZXIgIT0gTlVMTCkgewotICAgICAgICBtVHJhY2tCdWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcihwQnVmZmVyKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiRG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OnJlbGVhc2VCdWZmZXIoKSBlcnJvcjogTlVMTCB0cmFjayBidWZmZXIgcHJvdmlkZXIiKTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwIDsgaSA8IG51bUVmZmVjdHMgOyBpKyspIHsKKyAgICAgICAgaWYgKEVmZmVjdFF1ZXJ5RWZmZWN0KGksICZzRHdubUZ4RGVzYykgPT0gMCkgeworICAgICAgICAgICAgQUxPR1YoImVmZmVjdCAlZCBpcyBjYWxsZWQgJXMiLCBpLCBzRHdubUZ4RGVzYy5uYW1lKTsKKyAgICAgICAgICAgIGlmIChtZW1jbXAoJnNEd25tRnhEZXNjLnR5cGUsIEVGRkVDVF9VSUlEX0RPV05NSVgsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dJKCJmb3VuZCBlZmZlY3QgXCIlc1wiIGZyb20gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgc0R3bm1GeERlc2MubmFtZSwgc0R3bm1GeERlc2MuaW1wbGVtZW50b3IpOworICAgICAgICAgICAgICAgIHNJc011bHRpY2hhbm5lbENhcGFibGUgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQorICAgIEFMT0dXX0lGKCFzSXNNdWx0aWNoYW5uZWxDYXBhYmxlLCAidW5hYmxlIHRvIGZpbmQgZG93bm1peCBlZmZlY3QiKTsKKyAgICByZXR1cm4gTk9fSU5JVDsKIH0KIAorLypzdGF0aWMqLyBib29sIEF1ZGlvTWl4ZXI6OkRvd25taXhlckJ1ZmZlclByb3ZpZGVyOjpzSXNNdWx0aWNoYW5uZWxDYXBhYmxlID0gZmFsc2U7CisvKnN0YXRpYyovIGVmZmVjdF9kZXNjcmlwdG9yX3QgQXVkaW9NaXhlcjo6RG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OnNEd25tRnhEZXNjOworCitBdWRpb01peGVyOjpSZW1peEJ1ZmZlclByb3ZpZGVyOjpSZW1peEJ1ZmZlclByb3ZpZGVyKGF1ZGlvX2NoYW5uZWxfbWFza190IGlucHV0Q2hhbm5lbE1hc2ssCisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG91dHB1dENoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgIHNpemVfdCBidWZmZXJGcmFtZUNvdW50KSA6CisgICAgICAgIENvcHlCdWZmZXJQcm92aWRlcigKKyAgICAgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCkKKyAgICAgICAgICAgICAgICAgICAgKiBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soaW5wdXRDaGFubmVsTWFzayksCisgICAgICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpCisgICAgICAgICAgICAgICAgICAgICogYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG91dHB1dENoYW5uZWxNYXNrKSwKKyAgICAgICAgICAgICAgICBidWZmZXJGcmFtZUNvdW50KSwKKyAgICAgICAgbUZvcm1hdChmb3JtYXQpLAorICAgICAgICBtU2FtcGxlU2l6ZShhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCkpLAorICAgICAgICBtSW5wdXRDaGFubmVscyhhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soaW5wdXRDaGFubmVsTWFzaykpLAorICAgICAgICBtT3V0cHV0Q2hhbm5lbHMoYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG91dHB1dENoYW5uZWxNYXNrKSkKK3sKKyAgICBBTE9HVigiUmVtaXhCdWZmZXJQcm92aWRlciglcCkoJSN4LCAlI3gsICUjeCkgJXp1ICV6dSIsCisgICAgICAgICAgICB0aGlzLCBmb3JtYXQsIGlucHV0Q2hhbm5lbE1hc2ssIG91dHB1dENoYW5uZWxNYXNrLAorICAgICAgICAgICAgbUlucHV0Q2hhbm5lbHMsIG1PdXRwdXRDaGFubmVscyk7CisgICAgLy8gVE9ETzogY29uc2lkZXIgY2hhbm5lbCByZXByZXNlbnRhdGlvbiBpbiBpbmRleCBhcnJheSBmb3JtdWxhdGlvbgorICAgIC8vIFdlIGlnbm9yZSBjaGFubmVsIHJlcHJlc2VudGF0aW9uLCBhbmQganVzdCB1c2UgdGhlIGJpdHMuCisgICAgbWVtY3B5X2J5X2luZGV4X2FycmF5X2luaXRpYWxpemF0aW9uKG1JZHhBcnksIEFSUkFZX1NJWkUobUlkeEFyeSksCisgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfZ2V0X2JpdHMob3V0cHV0Q2hhbm5lbE1hc2spLAorICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9iaXRzKGlucHV0Q2hhbm5lbE1hc2spKTsKK30KKwordm9pZCBBdWRpb01peGVyOjpSZW1peEJ1ZmZlclByb3ZpZGVyOjpjb3B5RnJhbWVzKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZnJhbWVzKQoreworICAgIG1lbWNweV9ieV9pbmRleF9hcnJheShkc3QsIG1PdXRwdXRDaGFubmVscywKKyAgICAgICAgICAgIHNyYywgbUlucHV0Q2hhbm5lbHMsIG1JZHhBcnksIG1TYW1wbGVTaXplLCBmcmFtZXMpOworfQorCitBdWRpb01peGVyOjpSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOjpSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyKGludDMyX3QgY2hhbm5lbHMsCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGlucHV0Rm9ybWF0LCBhdWRpb19mb3JtYXRfdCBvdXRwdXRGb3JtYXQsCisgICAgICAgIHNpemVfdCBidWZmZXJGcmFtZUNvdW50KSA6CisgICAgICAgIENvcHlCdWZmZXJQcm92aWRlcigKKyAgICAgICAgICAgIGNoYW5uZWxzICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShpbnB1dEZvcm1hdCksCisgICAgICAgICAgICBjaGFubmVscyAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUob3V0cHV0Rm9ybWF0KSwKKyAgICAgICAgICAgIGJ1ZmZlckZyYW1lQ291bnQpLAorICAgICAgICBtQ2hhbm5lbHMoY2hhbm5lbHMpLAorICAgICAgICBtSW5wdXRGb3JtYXQoaW5wdXRGb3JtYXQpLAorICAgICAgICBtT3V0cHV0Rm9ybWF0KG91dHB1dEZvcm1hdCkKK3sKKyAgICBBTE9HVigiUmVmb3JtYXRCdWZmZXJQcm92aWRlciglcCkoJWQsICUjeCwgJSN4KSIsIHRoaXMsIGNoYW5uZWxzLCBpbnB1dEZvcm1hdCwgb3V0cHV0Rm9ybWF0KTsKK30KKwordm9pZCBBdWRpb01peGVyOjpSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOjpjb3B5RnJhbWVzKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZnJhbWVzKQoreworICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQoZHN0LCBtT3V0cHV0Rm9ybWF0LCBzcmMsIG1JbnB1dEZvcm1hdCwgZnJhbWVzICogbUNoYW5uZWxzKTsKK30KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotYm9vbCBBdWRpb01peGVyOjppc011bHRpY2hhbm5lbENhcGFibGUgPSBmYWxzZTsKLQotZWZmZWN0X2Rlc2NyaXB0b3JfdCBBdWRpb01peGVyOjpkd25tRnhEZXNjOwogCiAvLyBFbnN1cmUgbUNvbmZpZ3VyZWROYW1lcyBiaXRtYXNrIGlzIGluaXRpYWxpemVkIHByb3Blcmx5IG9uIGFsbCBhcmNoaXRlY3R1cmVzLgogLy8gVGhlIHZhbHVlIG9mIDEgPDwgeCBpcyB1bmRlZmluZWQgaW4gQyB3aGVuIHggPj0gMzIuCkBAIC0xMDEsMjAgKzM4MiwxMiBAQAogICAgIDogICBtVHJhY2tOYW1lcygwKSwgbUNvbmZpZ3VyZWROYW1lcygobWF4TnVtVHJhY2tzID49IDMyID8gMCA6IDEgPDwgbWF4TnVtVHJhY2tzKSAtIDEpLAogICAgICAgICBtU2FtcGxlUmF0ZShzYW1wbGVSYXRlKQogewotICAgIC8vIEF1ZGlvTWl4ZXIgaXMgbm90IHlldCBjYXBhYmxlIG9mIG11bHRpLWNoYW5uZWwgYmV5b25kIHN0ZXJlbwotICAgIENPTVBJTEVfVElNRV9BU1NFUlRfRlVOQ1RJT05fU0NPUEUoMiA9PSBNQVhfTlVNX0NIQU5ORUxTKTsKLQogICAgIEFMT0dfQVNTRVJUKG1heE51bVRyYWNrcyA8PSBNQVhfTlVNX1RSQUNLUywgIm1heE51bVRyYWNrcyAldSA+IE1BWF9OVU1fVFJBQ0tTICV1IiwKICAgICAgICAgICAgIG1heE51bVRyYWNrcywgTUFYX05VTV9UUkFDS1MpOwogCiAgICAgLy8gQXVkaW9NaXhlciBpcyBub3QgeWV0IGNhcGFibGUgb2YgbW9yZSB0aGFuIDMyIGFjdGl2ZSB0cmFjayBpbnB1dHMKICAgICBBTE9HX0FTU0VSVCgzMiA+PSBNQVhfTlVNX1RSQUNLUywgImJhZCBNQVhfTlVNX1RSQUNLUyAlZCIsIE1BWF9OVU1fVFJBQ0tTKTsKIAotICAgIC8vIEF1ZGlvTWl4ZXIgaXMgbm90IHlldCBjYXBhYmxlIG9mIG11bHRpLWNoYW5uZWwgb3V0cHV0IGJleW9uZCBzdGVyZW8KLSAgICBBTE9HX0FTU0VSVCgyID09IE1BWF9OVU1fQ0hBTk5FTFMsICJiYWQgTUFYX05VTV9DSEFOTkVMUyAlZCIsIE1BWF9OVU1fQ0hBTk5FTFMpOwotCi0gICAgTG9jYWxDbG9jayBsYzsKLQogICAgIHB0aHJlYWRfb25jZSgmc09uY2VDb250cm9sLCAmc0luaXRSb3V0aW5lKTsKIAogICAgIG1TdGF0ZS5lbmFibGVkVHJhY2tzPSAwOwpAQCAtMTMzLDMwICs0MDYsMTAgQEAKICAgICBmb3IgKHVuc2lnbmVkIGk9MCA7IGkgPCBNQVhfTlVNX1RSQUNLUyA7IGkrKykgewogICAgICAgICB0LT5yZXNhbXBsZXIgPSBOVUxMOwogICAgICAgICB0LT5kb3dubWl4ZXJCdWZmZXJQcm92aWRlciA9IE5VTEw7CisgICAgICAgIHQtPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyID0gTlVMTDsKICAgICAgICAgdCsrOwogICAgIH0KIAotICAgIC8vIGZpbmQgbXVsdGljaGFubmVsIGRvd25taXggZWZmZWN0IGlmIHdlIGhhdmUgdG8gcGxheSBtdWx0aWNoYW5uZWwgY29udGVudAotICAgIHVpbnQzMl90IG51bUVmZmVjdHMgPSAwOwotICAgIGludCByZXQgPSBFZmZlY3RRdWVyeU51bWJlckVmZmVjdHMoJm51bUVmZmVjdHMpOwotICAgIGlmIChyZXQgIT0gMCkgewotICAgICAgICBBTE9HRSgiQXVkaW9NaXhlcigpIGVycm9yICVkIHF1ZXJ5aW5nIG51bWJlciBvZiBlZmZlY3RzIiwgcmV0KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBBTE9HVigiRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzKCkgbnVtRWZmZWN0cz0lZCIsIG51bUVmZmVjdHMpOwotCi0gICAgZm9yICh1aW50MzJfdCBpID0gMCA7IGkgPCBudW1FZmZlY3RzIDsgaSsrKSB7Ci0gICAgICAgIGlmIChFZmZlY3RRdWVyeUVmZmVjdChpLCAmZHdubUZ4RGVzYykgPT0gMCkgewotICAgICAgICAgICAgQUxPR1YoImVmZmVjdCAlZCBpcyBjYWxsZWQgJXMiLCBpLCBkd25tRnhEZXNjLm5hbWUpOwotICAgICAgICAgICAgaWYgKG1lbWNtcCgmZHdubUZ4RGVzYy50eXBlLCBFRkZFQ1RfVUlJRF9ET1dOTUlYLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HSSgiZm91bmQgZWZmZWN0IFwiJXNcIiBmcm9tICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGR3bm1GeERlc2MubmFtZSwgZHdubUZ4RGVzYy5pbXBsZW1lbnRvcik7Ci0gICAgICAgICAgICAgICAgaXNNdWx0aWNoYW5uZWxDYXBhYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBBTE9HRV9JRighaXNNdWx0aWNoYW5uZWxDYXBhYmxlLCAidW5hYmxlIHRvIGZpbmQgZG93bm1peCBlZmZlY3QiKTsKIH0KIAogQXVkaW9NaXhlcjo6fkF1ZGlvTWl4ZXIoKQpAQCAtMTY1LDYgKzQxOCw3IEBACiAgICAgZm9yICh1bnNpZ25lZCBpPTAgOyBpIDwgTUFYX05VTV9UUkFDS1MgOyBpKyspIHsKICAgICAgICAgZGVsZXRlIHQtPnJlc2FtcGxlcjsKICAgICAgICAgZGVsZXRlIHQtPmRvd25taXhlckJ1ZmZlclByb3ZpZGVyOworICAgICAgICBkZWxldGUgdC0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXI7CiAgICAgICAgIHQrKzsKICAgICB9CiAgICAgZGVsZXRlIFtdIG1TdGF0ZS5vdXRwdXRUZW1wOwpAQCAtMTc2LDMyICs0MzAsNTIgQEAKICAgICBtU3RhdGUubUxvZyA9IGxvZzsKIH0KIAotaW50IEF1ZGlvTWl4ZXI6OmdldFRyYWNrTmFtZShhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgaW50IHNlc3Npb25JZCkKK2ludCBBdWRpb01peGVyOjpnZXRUcmFja05hbWUoYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50IHNlc3Npb25JZCkKIHsKKyAgICBpZiAoIWlzVmFsaWRQY21UcmFja0Zvcm1hdChmb3JtYXQpKSB7CisgICAgICAgIEFMT0dFKCJBdWRpb01peGVyOjpnZXRUcmFja05hbWUgaW52YWxpZCBmb3JtYXQgKCUjeCkiLCBmb3JtYXQpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogICAgIHVpbnQzMl90IG5hbWVzID0gKH5tVHJhY2tOYW1lcykgJiBtQ29uZmlndXJlZE5hbWVzOwogICAgIGlmIChuYW1lcyAhPSAwKSB7CiAgICAgICAgIGludCBuID0gX19idWlsdGluX2N0eihuYW1lcyk7CiAgICAgICAgIEFMT0dWKCJhZGQgdHJhY2sgKCVkKSIsIG4pOwotICAgICAgICBtVHJhY2tOYW1lcyB8PSAxIDw8IG47CiAgICAgICAgIC8vIGFzc3VtZSBkZWZhdWx0IHBhcmFtZXRlcnMgZm9yIHRoZSB0cmFjaywgZXhjZXB0IHdoZXJlIG5vdGVkIGJlbG93CiAgICAgICAgIHRyYWNrX3QqIHQgPSAmbVN0YXRlLnRyYWNrc1tuXTsKICAgICAgICAgdC0+bmVlZHMgPSAwOwotICAgICAgICB0LT52b2x1bWVbMF0gPSBVTklUWV9HQUlOOwotICAgICAgICB0LT52b2x1bWVbMV0gPSBVTklUWV9HQUlOOwotICAgICAgICAvLyBubyBpbml0aWFsaXphdGlvbiBuZWVkZWQKLSAgICAgICAgLy8gdC0+cHJldlZvbHVtZVswXQotICAgICAgICAvLyB0LT5wcmV2Vm9sdW1lWzFdCisKKyAgICAgICAgLy8gSW50ZWdlciB2b2x1bWUuCisgICAgICAgIC8vIEN1cnJlbnRseSBpbnRlZ2VyIHZvbHVtZSBpcyBrZXB0IGZvciB0aGUgbGVnYWN5IGludGVnZXIgbWl4ZXIuCisgICAgICAgIC8vIFdpbGwgYmUgcmVtb3ZlZCB3aGVuIHRoZSBsZWdhY3kgbWl4ZXIgcGF0aCBpcyByZW1vdmVkLgorICAgICAgICB0LT52b2x1bWVbMF0gPSBVTklUWV9HQUlOX0lOVDsKKyAgICAgICAgdC0+dm9sdW1lWzFdID0gVU5JVFlfR0FJTl9JTlQ7CisgICAgICAgIHQtPnByZXZWb2x1bWVbMF0gPSBVTklUWV9HQUlOX0lOVCA8PCAxNjsKKyAgICAgICAgdC0+cHJldlZvbHVtZVsxXSA9IFVOSVRZX0dBSU5fSU5UIDw8IDE2OwogICAgICAgICB0LT52b2x1bWVJbmNbMF0gPSAwOwogICAgICAgICB0LT52b2x1bWVJbmNbMV0gPSAwOwogICAgICAgICB0LT5hdXhMZXZlbCA9IDA7CiAgICAgICAgIHQtPmF1eEluYyA9IDA7CisgICAgICAgIHQtPnByZXZBdXhMZXZlbCA9IDA7CisKKyAgICAgICAgLy8gRmxvYXRpbmcgcG9pbnQgdm9sdW1lLgorICAgICAgICB0LT5tVm9sdW1lWzBdID0gVU5JVFlfR0FJTl9GTE9BVDsKKyAgICAgICAgdC0+bVZvbHVtZVsxXSA9IFVOSVRZX0dBSU5fRkxPQVQ7CisgICAgICAgIHQtPm1QcmV2Vm9sdW1lWzBdID0gVU5JVFlfR0FJTl9GTE9BVDsKKyAgICAgICAgdC0+bVByZXZWb2x1bWVbMV0gPSBVTklUWV9HQUlOX0ZMT0FUOworICAgICAgICB0LT5tVm9sdW1lSW5jWzBdID0gMC47CisgICAgICAgIHQtPm1Wb2x1bWVJbmNbMV0gPSAwLjsKKyAgICAgICAgdC0+bUF1eExldmVsID0gMC47CisgICAgICAgIHQtPm1BdXhJbmMgPSAwLjsKKyAgICAgICAgdC0+bVByZXZBdXhMZXZlbCA9IDAuOworCiAgICAgICAgIC8vIG5vIGluaXRpYWxpemF0aW9uIG5lZWRlZAotICAgICAgICAvLyB0LT5wcmV2QXV4TGV2ZWwKICAgICAgICAgLy8gdC0+ZnJhbWVDb3VudAotICAgICAgICB0LT5jaGFubmVsQ291bnQgPSAyOworICAgICAgICB0LT5jaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spOwogICAgICAgICB0LT5lbmFibGVkID0gZmFsc2U7Ci0gICAgICAgIHQtPmZvcm1hdCA9IDE2OwotICAgICAgICB0LT5jaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyAgICAgICAgQUxPR1ZfSUYoYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9iaXRzKGNoYW5uZWxNYXNrKSAhPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sCisgICAgICAgICAgICAgICAgIk5vbi1zdGVyZW8gY2hhbm5lbCBtYXNrOiAlZFxuIiwgY2hhbm5lbE1hc2spOworICAgICAgICB0LT5jaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrOwogICAgICAgICB0LT5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CiAgICAgICAgIC8vIHNldEJ1ZmZlclByb3ZpZGVyKG5hbWUsIEF1ZGlvQnVmZmVyUHJvdmlkZXIgKikgaXMgcmVxdWlyZWQgYmVmb3JlIGVuYWJsZShuYW1lKQogICAgICAgICB0LT5idWZmZXJQcm92aWRlciA9IE5VTEw7CkBAIC0yMTUsNTIgKzQ4OSwxMTYgQEAKICAgICAgICAgLy8gc2V0UGFyYW1ldGVyKG5hbWUsIFRSQUNLLCBNQUlOX0JVRkZFUiwgbWl4QnVmZmVyKSBpcyByZXF1aXJlZCBiZWZvcmUgZW5hYmxlKG5hbWUpCiAgICAgICAgIHQtPm1haW5CdWZmZXIgPSBOVUxMOwogICAgICAgICB0LT5hdXhCdWZmZXIgPSBOVUxMOworICAgICAgICB0LT5tSW5wdXRCdWZmZXJQcm92aWRlciA9IE5VTEw7CisgICAgICAgIHQtPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyID0gTlVMTDsKICAgICAgICAgdC0+ZG93bm1peGVyQnVmZmVyUHJvdmlkZXIgPSBOVUxMOwotCi0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGluaXRUcmFja0Rvd25taXgoJm1TdGF0ZS50cmFja3Nbbl0sIG4sIGNoYW5uZWxNYXNrKTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgcmV0dXJuIFRSQUNLMCArIG47CisgICAgICAgIHQtPm1NaXhlckZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgICAgICB0LT5tRm9ybWF0ID0gZm9ybWF0OworICAgICAgICB0LT5tTWl4ZXJJbkZvcm1hdCA9IGtVc2VGbG9hdCAmJiBrVXNlTmV3TWl4ZXIKKyAgICAgICAgICAgICAgICA/IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQgOiBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICAgICAgdC0+bU1peGVyQ2hhbm5lbE1hc2sgPSBhdWRpb19jaGFubmVsX21hc2tfZnJvbV9yZXByZXNlbnRhdGlvbl9hbmRfYml0cygKKyAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX1JFUFJFU0VOVEFUSU9OX1BPU0lUSU9OLCBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pOworICAgICAgICB0LT5tTWl4ZXJDaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sodC0+bU1peGVyQ2hhbm5lbE1hc2spOworICAgICAgICAvLyBDaGVjayB0aGUgZG93bm1peGluZyAob3IgdXBtaXhpbmcpIHJlcXVpcmVtZW50cy4KKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5pdFRyYWNrRG93bm1peCh0LCBuKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIkF1ZGlvTWl4ZXI6OmdldFRyYWNrTmFtZSBpbnZhbGlkIGNoYW5uZWxNYXNrICglI3gpIiwgY2hhbm5lbE1hc2spOworICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9Ci0gICAgICAgIEFMT0dFKCJBdWRpb01peGVyOjpnZXRUcmFja05hbWUoMHgleCkgZmFpbGVkLCBlcnJvciBwcmVwYXJpbmcgdHJhY2sgZm9yIGRvd25taXgiLAotICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgLy8gaW5pdFRyYWNrRG93bm1peCgpIG1heSBjaGFuZ2UgdGhlIGlucHV0IGZvcm1hdCByZXF1aXJlbWVudC4KKyAgICAgICAgLy8gSWYgeW91IGRlc2lyZSBmbG9hdGluZyBwb2ludCBpbnB1dCB0byB0aGUgbWl4ZXIsIGl0IG1heSBjaGFuZ2UKKyAgICAgICAgLy8gdG8gaW50ZWdlciBiZWNhdXNlIHRoZSBkb3dubWl4ZXIgcmVxdWlyZXMgaW50ZWdlciB0byBwcm9jZXNzLgorICAgICAgICBBTE9HVlYoIm1NaXhlckZvcm1hdDolI3ggIG1NaXhlckluRm9ybWF0OiUjeFxuIiwgdC0+bU1peGVyRm9ybWF0LCB0LT5tTWl4ZXJJbkZvcm1hdCk7CisgICAgICAgIHByZXBhcmVUcmFja0ZvclJlZm9ybWF0KHQsIG4pOworICAgICAgICBtVHJhY2tOYW1lcyB8PSAxIDw8IG47CisgICAgICAgIHJldHVybiBUUkFDSzAgKyBuOwogICAgIH0KKyAgICBBTE9HRSgiQXVkaW9NaXhlcjo6Z2V0VHJhY2tOYW1lIG91dCBvZiBhdmFpbGFibGUgdHJhY2tzIik7CiAgICAgcmV0dXJuIC0xOwogfQogCiB2b2lkIEF1ZGlvTWl4ZXI6OmludmFsaWRhdGVTdGF0ZSh1aW50MzJfdCBtYXNrKQogewotICAgIGlmIChtYXNrKSB7CisgICAgaWYgKG1hc2sgIT0gMCkgewogICAgICAgICBtU3RhdGUubmVlZHNDaGFuZ2VkIHw9IG1hc2s7CiAgICAgICAgIG1TdGF0ZS5ob29rID0gcHJvY2Vzc19fdmFsaWRhdGU7CiAgICAgfQogIH0KIAotc3RhdHVzX3QgQXVkaW9NaXhlcjo6aW5pdFRyYWNrRG93bm1peCh0cmFja190KiBwVHJhY2ssIGludCB0cmFja051bSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbWFzaykKLXsKLSAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBwb3Bjb3VudChtYXNrKTsKLSAgICBBTE9HX0FTU0VSVCgoY2hhbm5lbENvdW50IDw9IE1BWF9OVU1fQ0hBTk5FTFNfVE9fRE9XTk1JWCkgJiYgY2hhbm5lbENvdW50KTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBPSzsKLSAgICBpZiAoY2hhbm5lbENvdW50ID4gTUFYX05VTV9DSEFOTkVMUykgewotICAgICAgICBwVHJhY2stPmNoYW5uZWxNYXNrID0gbWFzazsKLSAgICAgICAgcFRyYWNrLT5jaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQ7Ci0gICAgICAgIEFMT0dWKCJpbml0VHJhY2tEb3dubWl4KHRyYWNrPSVkLCBtYXNrPTB4JXgpIGNhbGxzIHByZXBhcmVUcmFja0ZvckRvd25taXgoKSIsCi0gICAgICAgICAgICAgICAgdHJhY2tOdW0sIG1hc2spOwotICAgICAgICBzdGF0dXMgPSBwcmVwYXJlVHJhY2tGb3JEb3dubWl4KHBUcmFjaywgdHJhY2tOdW0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHVucHJlcGFyZVRyYWNrRm9yRG93bm1peChwVHJhY2ssIHRyYWNrTnVtKTsKKy8vIENhbGxlZCB3aGVuIGNoYW5uZWwgbWFza3MgaGF2ZSBjaGFuZ2VkIGZvciBhIHRyYWNrIG5hbWUKKy8vIFRPRE86IEZpeCBEb3dubWl4YnVmZmVycHJvZmlkZXIgbm90IHRvIChwb3NzaWJseSkgY2hhbmdlIG1peGVyIGlucHV0IGZvcm1hdCwKKy8vIHdoaWNoIHdpbGwgc2ltcGxpZnkgdGhpcyBsb2dpYy4KK2Jvb2wgQXVkaW9NaXhlcjo6c2V0Q2hhbm5lbE1hc2tzKGludCBuYW1lLAorICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCB0cmFja0NoYW5uZWxNYXNrLCBhdWRpb19jaGFubmVsX21hc2tfdCBtaXhlckNoYW5uZWxNYXNrKSB7CisgICAgdHJhY2tfdCAmdHJhY2sgPSBtU3RhdGUudHJhY2tzW25hbWVdOworCisgICAgaWYgKHRyYWNrQ2hhbm5lbE1hc2sgPT0gdHJhY2suY2hhbm5lbE1hc2sKKyAgICAgICAgICAgICYmIG1peGVyQ2hhbm5lbE1hc2sgPT0gdHJhY2subU1peGVyQ2hhbm5lbE1hc2spIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gbm8gbmVlZCB0byBjaGFuZ2UKICAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKKyAgICAvLyBhbHdheXMgcmVjb21wdXRlIGZvciBib3RoIGNoYW5uZWwgbWFza3MgZXZlbiBpZiBvbmx5IG9uZSBoYXMgY2hhbmdlZC4KKyAgICBjb25zdCB1aW50MzJfdCB0cmFja0NoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayh0cmFja0NoYW5uZWxNYXNrKTsKKyAgICBjb25zdCB1aW50MzJfdCBtaXhlckNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtaXhlckNoYW5uZWxNYXNrKTsKKyAgICBjb25zdCBib29sIG1peGVyQ2hhbm5lbENvdW50Q2hhbmdlZCA9IHRyYWNrLm1NaXhlckNoYW5uZWxDb3VudCAhPSBtaXhlckNoYW5uZWxDb3VudDsKKworICAgIEFMT0dfQVNTRVJUKCh0cmFja0NoYW5uZWxDb3VudCA8PSBNQVhfTlVNX0NIQU5ORUxTX1RPX0RPV05NSVgpCisgICAgICAgICAgICAmJiB0cmFja0NoYW5uZWxDb3VudAorICAgICAgICAgICAgJiYgbWl4ZXJDaGFubmVsQ291bnQpOworICAgIHRyYWNrLmNoYW5uZWxNYXNrID0gdHJhY2tDaGFubmVsTWFzazsKKyAgICB0cmFjay5jaGFubmVsQ291bnQgPSB0cmFja0NoYW5uZWxDb3VudDsKKyAgICB0cmFjay5tTWl4ZXJDaGFubmVsTWFzayA9IG1peGVyQ2hhbm5lbE1hc2s7CisgICAgdHJhY2subU1peGVyQ2hhbm5lbENvdW50ID0gbWl4ZXJDaGFubmVsQ291bnQ7CisKKyAgICAvLyBjaGFubmVsIG1hc2tzIGhhdmUgY2hhbmdlZCwgZG9lcyB0aGlzIHRyYWNrIG5lZWQgYSBkb3dubWl4ZXI/CisgICAgLy8gdXBkYXRlIHRvIHRyeSB1c2luZyBvdXIgZGVzaXJlZCBmb3JtYXQgKGlmIHdlIGFyZW4ndCBhbHJlYWR5IHVzaW5nIGl0KQorICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IHByZXZNaXhlckluRm9ybWF0ID0gdHJhY2subU1peGVySW5Gb3JtYXQ7CisgICAgdHJhY2subU1peGVySW5Gb3JtYXQgPSBrVXNlRmxvYXQgJiYga1VzZU5ld01peGVyCisgICAgICAgICAgICA/IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQgOiBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMgPSBpbml0VHJhY2tEb3dubWl4KCZtU3RhdGUudHJhY2tzW25hbWVdLCBuYW1lKTsKKyAgICBBTE9HRV9JRihzdGF0dXMgIT0gT0ssCisgICAgICAgICAgICAiaW5pdFRyYWNrRG93bm1peCBlcnJvciAlZCwgdHJhY2sgY2hhbm5lbCBtYXNrICUjeCwgbWl4ZXIgY2hhbm5lbCBtYXNrICUjeCIsCisgICAgICAgICAgICBzdGF0dXMsIHRyYWNrLmNoYW5uZWxNYXNrLCB0cmFjay5tTWl4ZXJDaGFubmVsTWFzayk7CisKKyAgICBjb25zdCBib29sIG1peGVySW5Gb3JtYXRDaGFuZ2VkID0gcHJldk1peGVySW5Gb3JtYXQgIT0gdHJhY2subU1peGVySW5Gb3JtYXQ7CisgICAgaWYgKG1peGVySW5Gb3JtYXRDaGFuZ2VkKSB7CisgICAgICAgIHByZXBhcmVUcmFja0ZvclJlZm9ybWF0KCZ0cmFjaywgbmFtZSk7IC8vIGJlY2F1c2Ugb2YgZG93bm1peGVyLCB0cmFjayBmb3JtYXQgbWF5IGNoYW5nZSEKKyAgICB9CisKKyAgICBpZiAodHJhY2sucmVzYW1wbGVyICYmIChtaXhlckluRm9ybWF0Q2hhbmdlZCB8fCBtaXhlckNoYW5uZWxDb3VudENoYW5nZWQpKSB7CisgICAgICAgIC8vIHJlc2FtcGxlciBpbnB1dCBmb3JtYXQgb3IgY2hhbm5lbHMgbWF5IGhhdmUgY2hhbmdlZC4KKyAgICAgICAgY29uc3QgdWludDMyX3QgcmVzZXRUb1NhbXBsZVJhdGUgPSB0cmFjay5zYW1wbGVSYXRlOworICAgICAgICBkZWxldGUgdHJhY2sucmVzYW1wbGVyOworICAgICAgICB0cmFjay5yZXNhbXBsZXIgPSBOVUxMOworICAgICAgICB0cmFjay5zYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7IC8vIHdpdGhvdXQgcmVzYW1wbGVyLCB0cmFjayByYXRlIGlzIGRldmljZSBzYW1wbGUgcmF0ZS4KKyAgICAgICAgLy8gcmVjcmVhdGUgdGhlIHJlc2FtcGxlciB3aXRoIHVwZGF0ZWQgZm9ybWF0LCBjaGFubmVscywgc2F2ZWQgc2FtcGxlUmF0ZS4KKyAgICAgICAgdHJhY2suc2V0UmVzYW1wbGVyKHJlc2V0VG9TYW1wbGVSYXRlIC8qdHJhY2tTYW1wbGVSYXRlKi8sIG1TYW1wbGVSYXRlIC8qZGV2U2FtcGxlUmF0ZSovKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgQXVkaW9NaXhlcjo6dW5wcmVwYXJlVHJhY2tGb3JEb3dubWl4KHRyYWNrX3QqIHBUcmFjaywgaW50IHRyYWNrTmFtZSkgeworc3RhdHVzX3QgQXVkaW9NaXhlcjo6aW5pdFRyYWNrRG93bm1peCh0cmFja190KiBwVHJhY2ssIGludCB0cmFja05hbWUpCit7CisgICAgLy8gT25seSByZW1peCAodXBtaXggb3IgZG93bm1peCkgaWYgdGhlIHRyYWNrIGFuZCBtaXhlci9kZXZpY2UgY2hhbm5lbCBtYXNrcworICAgIC8vIGFyZSBub3QgdGhlIHNhbWUgYW5kIG5vdCBoYW5kbGVkIGludGVybmFsbHksIGFzIG1vbm8gLT4gc3RlcmVvIGN1cnJlbnRseSBpcy4KKyAgICBpZiAocFRyYWNrLT5jaGFubmVsTWFzayAhPSBwVHJhY2stPm1NaXhlckNoYW5uZWxNYXNrCisgICAgICAgICAgICAmJiAhKHBUcmFjay0+Y2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTworICAgICAgICAgICAgICAgICAgICAmJiBwVHJhY2stPm1NaXhlckNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTykpIHsKKyAgICAgICAgcmV0dXJuIHByZXBhcmVUcmFja0ZvckRvd25taXgocFRyYWNrLCB0cmFja05hbWUpOworICAgIH0KKyAgICAvLyBubyByZW1peCBuZWNlc3NhcnkKKyAgICB1bnByZXBhcmVUcmFja0ZvckRvd25taXgocFRyYWNrLCB0cmFja05hbWUpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBBdWRpb01peGVyOjp1bnByZXBhcmVUcmFja0ZvckRvd25taXgodHJhY2tfdCogcFRyYWNrLCBpbnQgdHJhY2tOYW1lIF9fdW51c2VkKSB7CiAgICAgQUxPR1YoIkF1ZGlvTWl4ZXI6OnVucHJlcGFyZVRyYWNrRm9yRG93bm1peCglZCkiLCB0cmFja05hbWUpOwogCiAgICAgaWYgKHBUcmFjay0+ZG93bm1peGVyQnVmZmVyUHJvdmlkZXIgIT0gTlVMTCkgewogICAgICAgICAvLyB0aGlzIHRyYWNrIGhhZCBwcmV2aW91c2x5IGJlZW4gY29uZmlndXJlZCB3aXRoIGEgZG93bm1peGVyLCBkZWxldGUgaXQKICAgICAgICAgQUxPR1YoIiBkZWxldGluZyBvbGQgZG93bm1peGVyIik7Ci0gICAgICAgIHBUcmFjay0+YnVmZmVyUHJvdmlkZXIgPSBwVHJhY2stPmRvd25taXhlckJ1ZmZlclByb3ZpZGVyLT5tVHJhY2tCdWZmZXJQcm92aWRlcjsKICAgICAgICAgZGVsZXRlIHBUcmFjay0+ZG93bm1peGVyQnVmZmVyUHJvdmlkZXI7CiAgICAgICAgIHBUcmFjay0+ZG93bm1peGVyQnVmZmVyUHJvdmlkZXIgPSBOVUxMOworICAgICAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycyhwVHJhY2spOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dWKCIgbm90aGluZyB0byBkbywgbm8gZG93bm1peGVyIHRvIGRlbGV0ZSIpOwogICAgIH0KQEAgLTI3MiwxMDEgKzYxMCw2NiBAQAogCiAgICAgLy8gZGlzY2FyZCB0aGUgcHJldmlvdXMgZG93bm1peGVyIGlmIHRoZXJlIHdhcyBvbmUKICAgICB1bnByZXBhcmVUcmFja0ZvckRvd25taXgocFRyYWNrLCB0cmFja05hbWUpOworICAgIGlmIChEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6aXNNdWx0aWNoYW5uZWxDYXBhYmxlKCkpIHsKKyAgICAgICAgRG93bm1peGVyQnVmZmVyUHJvdmlkZXIqIHBEYnAgPSBuZXcgRG93bm1peGVyQnVmZmVyUHJvdmlkZXIocFRyYWNrLT5jaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICBwVHJhY2stPm1NaXhlckNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIC8qIFRPRE86IHVzZSBwVHJhY2stPm1NaXhlckluRm9ybWF0LCBub3cgb25seSBQQ00gMTYgKi8sCisgICAgICAgICAgICAgICAgcFRyYWNrLT5zYW1wbGVSYXRlLCBwVHJhY2stPnNlc3Npb25JZCwga0NvcHlCdWZmZXJGcmFtZUNvdW50KTsKIAotICAgIERvd25taXhlckJ1ZmZlclByb3ZpZGVyKiBwRGJwID0gbmV3IERvd25taXhlckJ1ZmZlclByb3ZpZGVyKCk7Ci0gICAgaW50MzJfdCBzdGF0dXM7Ci0KLSAgICBpZiAoIWlzTXVsdGljaGFubmVsQ2FwYWJsZSkgewotICAgICAgICBBTE9HRSgicHJlcGFyZVRyYWNrRm9yRG93bm1peCglZCkgZmFpbHM6IG1peGVyIGRvZXNuJ3Qgc3VwcG9ydCBtdWx0aWNoYW5uZWwgY29udGVudCIsCi0gICAgICAgICAgICAgICAgdHJhY2tOYW1lKTsKLSAgICAgICAgZ290byBub0Rvd25taXhGb3JBY3RpdmVUcmFjazsKKyAgICAgICAgaWYgKHBEYnAtPmlzVmFsaWQoKSkgeyAvLyBpZiBjb25zdHJ1Y3RvciBjb21wbGV0ZWQgcHJvcGVybHkKKyAgICAgICAgICAgIHBUcmFjay0+bU1peGVySW5Gb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsgLy8gUENNIDE2IGJpdCByZXF1aXJlZCBmb3IgZG93bm1peAorICAgICAgICAgICAgcFRyYWNrLT5kb3dubWl4ZXJCdWZmZXJQcm92aWRlciA9IHBEYnA7CisgICAgICAgICAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycyhwVHJhY2spOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGRlbGV0ZSBwRGJwOwogICAgIH0KIAotICAgIGlmIChFZmZlY3RDcmVhdGUoJmR3bm1GeERlc2MudXVpZCwKLSAgICAgICAgICAgIHBUcmFjay0+c2Vzc2lvbklkIC8qc2Vzc2lvbklkKi8sIC0yIC8qaW9JZCBub3QgcmVsZXZhbnQgaGVyZSwgdXNpbmcgcmFuZG9tIHZhbHVlKi8sCi0gICAgICAgICAgICAmcERicC0+bURvd25taXhIYW5kbGUvKnBIYW5kbGUqLykgIT0gMCkgewotICAgICAgICBBTE9HRSgicHJlcGFyZVRyYWNrRm9yRG93bm1peCglZCkgZmFpbHM6IGVycm9yIGNyZWF0aW5nIGRvd25taXhlciBlZmZlY3QiLCB0cmFja05hbWUpOwotICAgICAgICBnb3RvIG5vRG93bm1peEZvckFjdGl2ZVRyYWNrOwotICAgIH0KLQotICAgIC8vIGNoYW5uZWwgaW5wdXQgY29uZmlndXJhdGlvbiB3aWxsIGJlIG92ZXJyaWRkZW4gcGVyLXRyYWNrCi0gICAgcERicC0+bURvd25taXhDb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBwVHJhY2stPmNoYW5uZWxNYXNrOwotICAgIHBEYnAtPm1Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKLSAgICBwRGJwLT5tRG93bm1peENvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKLSAgICBwRGJwLT5tRG93bm1peENvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7Ci0gICAgcERicC0+bURvd25taXhDb25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gcFRyYWNrLT5zYW1wbGVSYXRlOwotICAgIHBEYnAtPm1Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgPSBwVHJhY2stPnNhbXBsZVJhdGU7Ci0gICAgcERicC0+bURvd25taXhDb25maWcuaW5wdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7Ci0gICAgcERicC0+bURvd25taXhDb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURTsKLSAgICAvLyBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlciBwcm92aWRlciwgYW5kIGZyYW1lIGNvdW50IHdpbGwgbm90IGJlIHVzZWQgYXMgdGhlIGRvd25taXggZWZmZWN0Ci0gICAgLy8gcHJvY2VzcygpIGZ1bmN0aW9uIGlzIGNhbGxlZCBkaXJlY3RseSAoc2VlIERvd25taXhlckJ1ZmZlclByb3ZpZGVyOjpnZXROZXh0QnVmZmVyKCkpCi0gICAgcERicC0+bURvd25taXhDb25maWcuaW5wdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfU01QX1JBVEUgfCBFRkZFQ1RfQ09ORklHX0NIQU5ORUxTIHwKLSAgICAgICAgICAgIEVGRkVDVF9DT05GSUdfRk9STUFUIHwgRUZGRUNUX0NPTkZJR19BQ0NfTU9ERTsKLSAgICBwRGJwLT5tRG93bm1peENvbmZpZy5vdXRwdXRDZmcubWFzayA9IHBEYnAtPm1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLm1hc2s7Ci0KLSAgICB7Ly8gc2NvcGUgZm9yIGxvY2FsIHZhcmlhYmxlcyB0aGF0IGFyZSBub3QgdXNlZCBpbiBnb3RvIGxhYmVsICJub0Rvd25taXhGb3JBY3RpdmVUcmFjayIKLSAgICAgICAgaW50IGNtZFN0YXR1czsKLSAgICAgICAgdWludDMyX3QgcmVwbHlTaXplID0gc2l6ZW9mKGludCk7Ci0KLSAgICAgICAgLy8gQ29uZmlndXJlIGFuZCBlbmFibGUgZG93bm1peGVyCi0gICAgICAgIHN0YXR1cyA9ICgqcERicC0+bURvd25taXhIYW5kbGUpLT5jb21tYW5kKHBEYnAtPm1Eb3dubWl4SGFuZGxlLAotICAgICAgICAgICAgICAgIEVGRkVDVF9DTURfU0VUX0NPTkZJRyAvKmNtZENvZGUqLywgc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkgLypjbWRTaXplKi8sCi0gICAgICAgICAgICAgICAgJnBEYnAtPm1Eb3dubWl4Q29uZmlnIC8qcENtZERhdGEqLywKLSAgICAgICAgICAgICAgICAmcmVwbHlTaXplIC8qcmVwbHlTaXplKi8sICZjbWRTdGF0dXMgLypwUmVwbHlEYXRhKi8pOwotICAgICAgICBpZiAoKHN0YXR1cyAhPSAwKSB8fCAoY21kU3RhdHVzICE9IDApKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZXJyb3IgJWQgd2hpbGUgY29uZmlndXJpbmcgZG93bm1peGVyIGZvciB0cmFjayAlZCIsIHN0YXR1cywgdHJhY2tOYW1lKTsKLSAgICAgICAgICAgIGdvdG8gbm9Eb3dubWl4Rm9yQWN0aXZlVHJhY2s7Ci0gICAgICAgIH0KLSAgICAgICAgcmVwbHlTaXplID0gc2l6ZW9mKGludCk7Ci0gICAgICAgIHN0YXR1cyA9ICgqcERicC0+bURvd25taXhIYW5kbGUpLT5jb21tYW5kKHBEYnAtPm1Eb3dubWl4SGFuZGxlLAotICAgICAgICAgICAgICAgIEVGRkVDVF9DTURfRU5BQkxFIC8qY21kQ29kZSovLCAwIC8qY21kU2l6ZSovLCBOVUxMIC8qcENtZERhdGEqLywKLSAgICAgICAgICAgICAgICAmcmVwbHlTaXplIC8qcmVwbHlTaXplKi8sICZjbWRTdGF0dXMgLypwUmVwbHlEYXRhKi8pOwotICAgICAgICBpZiAoKHN0YXR1cyAhPSAwKSB8fCAoY21kU3RhdHVzICE9IDApKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZXJyb3IgJWQgd2hpbGUgZW5hYmxpbmcgZG93bm1peGVyIGZvciB0cmFjayAlZCIsIHN0YXR1cywgdHJhY2tOYW1lKTsKLSAgICAgICAgICAgIGdvdG8gbm9Eb3dubWl4Rm9yQWN0aXZlVHJhY2s7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZXQgZG93bm1peCB0eXBlCi0gICAgICAgIC8vIHBhcmFtZXRlciBzaXplIHJvdW5kZWQgZm9yIHBhZGRpbmcgb24gMzJiaXQgYm91bmRhcnkKLSAgICAgICAgY29uc3QgaW50IHBzaXplUGFkZGVkID0gKChzaXplb2YoZG93bm1peF9wYXJhbXNfdCkgLSAxKS9zaXplb2YoaW50KSArIDEpICogc2l6ZW9mKGludCk7Ci0gICAgICAgIGNvbnN0IGludCBkb3dubWl4UGFyYW1TaXplID0KLSAgICAgICAgICAgICAgICBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgcHNpemVQYWRkZWQgKyBzaXplb2YoZG93bm1peF90eXBlX3QpOwotICAgICAgICBlZmZlY3RfcGFyYW1fdCAqIGNvbnN0IHBhcmFtID0gKGVmZmVjdF9wYXJhbV90ICopIG1hbGxvYyhkb3dubWl4UGFyYW1TaXplKTsKLSAgICAgICAgcGFyYW0tPnBzaXplID0gc2l6ZW9mKGRvd25taXhfcGFyYW1zX3QpOwotICAgICAgICBjb25zdCBkb3dubWl4X3BhcmFtc190IGRvd25taXhQYXJhbSA9IERPV05NSVhfUEFSQU1fVFlQRTsKLSAgICAgICAgbWVtY3B5KHBhcmFtLT5kYXRhLCAmZG93bm1peFBhcmFtLCBwYXJhbS0+cHNpemUpOwotICAgICAgICBjb25zdCBkb3dubWl4X3R5cGVfdCBkb3dubWl4VHlwZSA9IERPV05NSVhfVFlQRV9GT0xEOwotICAgICAgICBwYXJhbS0+dnNpemUgPSBzaXplb2YoZG93bm1peF90eXBlX3QpOwotICAgICAgICBtZW1jcHkocGFyYW0tPmRhdGEgKyBwc2l6ZVBhZGRlZCwgJmRvd25taXhUeXBlLCBwYXJhbS0+dnNpemUpOwotCi0gICAgICAgIHN0YXR1cyA9ICgqcERicC0+bURvd25taXhIYW5kbGUpLT5jb21tYW5kKHBEYnAtPm1Eb3dubWl4SGFuZGxlLAotICAgICAgICAgICAgICAgIEVGRkVDVF9DTURfU0VUX1BBUkFNIC8qIGNtZENvZGUgKi8sIGRvd25taXhQYXJhbVNpemUvKiBjbWRTaXplICovLAotICAgICAgICAgICAgICAgIHBhcmFtIC8qcENtbmREYXRhKi8sICZyZXBseVNpemUgLypyZXBseVNpemUqLywgJmNtZFN0YXR1cyAvKnBSZXBseURhdGEqLyk7Ci0KLSAgICAgICAgZnJlZShwYXJhbSk7Ci0KLSAgICAgICAgaWYgKChzdGF0dXMgIT0gMCkgfHwgKGNtZFN0YXR1cyAhPSAwKSkgewotICAgICAgICAgICAgQUxPR0UoImVycm9yICVkIHdoaWxlIHNldHRpbmcgZG93bm1peCB0eXBlIGZvciB0cmFjayAlZCIsIHN0YXR1cywgdHJhY2tOYW1lKTsKLSAgICAgICAgICAgIGdvdG8gbm9Eb3dubWl4Rm9yQWN0aXZlVHJhY2s7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVigiZG93bm1peCB0eXBlIHNldCB0byAlZCBmb3IgdHJhY2sgJWQiLCAoaW50KSBkb3dubWl4VHlwZSwgdHJhY2tOYW1lKTsKLSAgICAgICAgfQotICAgIH0vLyBlbmQgb2Ygc2NvcGUgZm9yIGxvY2FsIHZhcmlhYmxlcyB0aGF0IGFyZSBub3QgdXNlZCBpbiBnb3RvIGxhYmVsICJub0Rvd25taXhGb3JBY3RpdmVUcmFjayIKLQotICAgIC8vIGluaXRpYWxpemF0aW9uIHN1Y2Nlc3NmdWw6Ci0gICAgLy8gLSBrZWVwIHRyYWNrIG9mIHRoZSByZWFsIGJ1ZmZlciBwcm92aWRlciBpbiBjYXNlIGl0IHdhcyBzZXQgYmVmb3JlCi0gICAgcERicC0+bVRyYWNrQnVmZmVyUHJvdmlkZXIgPSBwVHJhY2stPmJ1ZmZlclByb3ZpZGVyOwotICAgIC8vIC0gd2UnbGwgdXNlIHRoZSBkb3dubWl4IGVmZmVjdCBpbnRlZ3JhdGVkIGluc2lkZSB0aGlzCi0gICAgLy8gICAgdHJhY2sncyBidWZmZXIgcHJvdmlkZXIsIGFuZCB3ZSdsbCB1c2UgaXQgYXMgdGhlIHRyYWNrJ3MgYnVmZmVyIHByb3ZpZGVyCi0gICAgcFRyYWNrLT5kb3dubWl4ZXJCdWZmZXJQcm92aWRlciA9IHBEYnA7Ci0gICAgcFRyYWNrLT5idWZmZXJQcm92aWRlciA9IHBEYnA7Ci0KKyAgICAvLyBFZmZlY3QgZG93bm1peGVyIGRvZXMgbm90IGFjY2VwdCB0aGUgY2hhbm5lbCBjb252ZXJzaW9uLiAgTGV0J3MgdXNlIG91ciByZW1peGVyLgorICAgIFJlbWl4QnVmZmVyUHJvdmlkZXIqIHBSYnAgPSBuZXcgUmVtaXhCdWZmZXJQcm92aWRlcihwVHJhY2stPmNoYW5uZWxNYXNrLAorICAgICAgICAgICAgcFRyYWNrLT5tTWl4ZXJDaGFubmVsTWFzaywgcFRyYWNrLT5tTWl4ZXJJbkZvcm1hdCwga0NvcHlCdWZmZXJGcmFtZUNvdW50KTsKKyAgICAvLyBSZW1peCBhbHdheXMgZmluZHMgYSBjb252ZXJzaW9uIHdoZXJlYXMgRG93bm1peGVyIGVmZmVjdCBhYm92ZSBtYXkgZmFpbC4KKyAgICBwVHJhY2stPmRvd25taXhlckJ1ZmZlclByb3ZpZGVyID0gcFJicDsKKyAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycyhwVHJhY2spOwogICAgIHJldHVybiBOT19FUlJPUjsKK30KIAotbm9Eb3dubWl4Rm9yQWN0aXZlVHJhY2s6Ci0gICAgZGVsZXRlIHBEYnA7Ci0gICAgcFRyYWNrLT5kb3dubWl4ZXJCdWZmZXJQcm92aWRlciA9IE5VTEw7Ci0gICAgcmV0dXJuIE5PX0lOSVQ7Cit2b2lkIEF1ZGlvTWl4ZXI6OnVucHJlcGFyZVRyYWNrRm9yUmVmb3JtYXQodHJhY2tfdCogcFRyYWNrLCBpbnQgdHJhY2tOYW1lIF9fdW51c2VkKSB7CisgICAgQUxPR1YoIkF1ZGlvTWl4ZXI6OnVucHJlcGFyZVRyYWNrRm9yUmVmb3JtYXQoJWQpIiwgdHJhY2tOYW1lKTsKKyAgICBpZiAocFRyYWNrLT5tUmVmb3JtYXRCdWZmZXJQcm92aWRlciAhPSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBwVHJhY2stPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOworICAgICAgICBwVHJhY2stPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyID0gTlVMTDsKKyAgICAgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMocFRyYWNrKTsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvTWl4ZXI6OnByZXBhcmVUcmFja0ZvclJlZm9ybWF0KHRyYWNrX3QqIHBUcmFjaywgaW50IHRyYWNrTmFtZSkKK3sKKyAgICBBTE9HVigiQXVkaW9NaXhlcjo6cHJlcGFyZVRyYWNrRm9yUmVmb3JtYXQoJWQpIHdpdGggZm9ybWF0ICUjeCIsIHRyYWNrTmFtZSwgcFRyYWNrLT5tRm9ybWF0KTsKKyAgICAvLyBkaXNjYXJkIHRoZSBwcmV2aW91cyByZWZvcm1hdHRlciBpZiB0aGVyZSB3YXMgb25lCisgICAgdW5wcmVwYXJlVHJhY2tGb3JSZWZvcm1hdChwVHJhY2ssIHRyYWNrTmFtZSk7CisgICAgLy8gb25seSBjb25maWd1cmUgcmVmb3JtYXR0ZXIgaWYgbmVlZGVkCisgICAgaWYgKHBUcmFjay0+bUZvcm1hdCAhPSBwVHJhY2stPm1NaXhlckluRm9ybWF0KSB7CisgICAgICAgIHBUcmFjay0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIgPSBuZXcgUmVmb3JtYXRCdWZmZXJQcm92aWRlcigKKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2socFRyYWNrLT5jaGFubmVsTWFzayksCisgICAgICAgICAgICAgICAgcFRyYWNrLT5tRm9ybWF0LCBwVHJhY2stPm1NaXhlckluRm9ybWF0LAorICAgICAgICAgICAgICAgIGtDb3B5QnVmZmVyRnJhbWVDb3VudCk7CisgICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKHBUcmFjayk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBBdWRpb01peGVyOjpyZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycyh0cmFja190KiBwVHJhY2spCit7CisgICAgcFRyYWNrLT5idWZmZXJQcm92aWRlciA9IHBUcmFjay0+bUlucHV0QnVmZmVyUHJvdmlkZXI7CisgICAgaWYgKHBUcmFjay0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIpIHsKKyAgICAgICAgcFRyYWNrLT5tUmVmb3JtYXRCdWZmZXJQcm92aWRlci0+c2V0QnVmZmVyUHJvdmlkZXIocFRyYWNrLT5idWZmZXJQcm92aWRlcik7CisgICAgICAgIHBUcmFjay0+YnVmZmVyUHJvdmlkZXIgPSBwVHJhY2stPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOworICAgIH0KKyAgICBpZiAocFRyYWNrLT5kb3dubWl4ZXJCdWZmZXJQcm92aWRlcikgeworICAgICAgICBwVHJhY2stPmRvd25taXhlckJ1ZmZlclByb3ZpZGVyLT5zZXRCdWZmZXJQcm92aWRlcihwVHJhY2stPmJ1ZmZlclByb3ZpZGVyKTsKKyAgICAgICAgcFRyYWNrLT5idWZmZXJQcm92aWRlciA9IHBUcmFjay0+ZG93bm1peGVyQnVmZmVyUHJvdmlkZXI7CisgICAgfQogfQogCiB2b2lkIEF1ZGlvTWl4ZXI6OmRlbGV0ZVRyYWNrTmFtZShpbnQgbmFtZSkKQEAgLTM4NSw2ICs2ODgsOCBAQAogICAgIHRyYWNrLnJlc2FtcGxlciA9IE5VTEw7CiAgICAgLy8gZGVsZXRlIHRoZSBkb3dubWl4ZXIKICAgICB1bnByZXBhcmVUcmFja0ZvckRvd25taXgoJm1TdGF0ZS50cmFja3NbbmFtZV0sIG5hbWUpOworICAgIC8vIGRlbGV0ZSB0aGUgcmVmb3JtYXR0ZXIKKyAgICB1bnByZXBhcmVUcmFja0ZvclJlZm9ybWF0KCZtU3RhdGUudHJhY2tzW25hbWVdLCBuYW1lKTsKIAogICAgIG1UcmFja05hbWVzICY9IH4oMTw8bmFtZSk7CiB9CkBAIC00MTUsMjkgKzcyMCw5MSBAQAogICAgIH0KIH0KIAorLyogU2V0cyB0aGUgdm9sdW1lIHJhbXAgdmFyaWFibGVzIGZvciB0aGUgQXVkaW9NaXhlci4KKyAqCisgKiBUaGUgdm9sdW1lIHJhbXAgdmFyaWFibGVzIGFyZSB1c2VkIHRvIHRyYW5zaXRpb24gZnJvbSB0aGUgcHJldmlvdXMKKyAqIHZvbHVtZSB0byB0aGUgc2V0IHZvbHVtZS4gIHJhbXAgY29udHJvbHMgdGhlIGR1cmF0aW9uIG9mIHRoZSB0cmFuc2l0aW9uLgorICogSXRzIHZhbHVlIGlzIHR5cGljYWxseSBvbmUgc3RhdGUgZnJhbWVjb3VudCBwZXJpb2QsIGJ1dCBtYXkgYWxzbyBiZSAwLAorICogbWVhbmluZyAiaW1tZWRpYXRlLiIKKyAqCisgKiBGSVhNRTogMSkgVm9sdW1lIHJhbXAgaXMgZW5hYmxlZCBvbmx5IGlmIHRoZXJlIGlzIGEgbm9uemVybyBpbnRlZ2VyIGluY3JlbWVudAorICogZXZlbiBpZiB0aGVyZSBpcyBhIG5vbnplcm8gZmxvYXRpbmcgcG9pbnQgaW5jcmVtZW50IChpbiB0aGF0IGNhc2UsIHRoZSB2b2x1bWUKKyAqIGNoYW5nZSBpcyBpbW1lZGlhdGUpLiAgVGhpcyByZXN0cmljdGlvbiBzaG91bGQgYmUgY2hhbmdlZCB3aGVuIHRoZSBsZWdhY3kgbWl4ZXIKKyAqIGlzIHJlbW92ZWQgKHNlZSAjMikuCisgKiBGSVhNRTogMikgSW50ZWdlciB2b2x1bWUgdmFyaWFibGVzIGFyZSB1c2VkIGZvciBMZWdhY3kgbWl4aW5nIGFuZCBzaG91bGQgYmUgcmVtb3ZlZAorICogd2hlbiBubyBsb25nZXIgbmVlZGVkLgorICoKKyAqIEBwYXJhbSBuZXdWb2x1bWUgc2V0IHZvbHVtZSB0YXJnZXQgaW4gZmxvYXRpbmcgcG9pbnQgWzAuMCwgMS4wXS4KKyAqIEBwYXJhbSByYW1wIG51bWJlciBvZiBmcmFtZXMgdG8gaW5jcmVtZW50IG92ZXIuIGlmIHJhbXAgaXMgMCwgdGhlIHZvbHVtZQorICogc2hvdWxkIGJlIHNldCBpbW1lZGlhdGVseS4gIEN1cnJlbnRseSByYW1wIHNob3VsZCBub3QgZXhjZWVkIDY1NTM1IChmcmFtZXMpLgorICogQHBhcmFtIHBJbnRTZXRWb2x1bWUgcG9pbnRlciB0byB0aGUgVTQuMTIgaW50ZWdlciB0YXJnZXQgdm9sdW1lLCBzZXQgb24gcmV0dXJuLgorICogQHBhcmFtIHBJbnRQcmV2Vm9sdW1lIHBvaW50ZXIgdG8gdGhlIFU0LjI4IGludGVnZXIgcHJldmlvdXMgdm9sdW1lLCBzZXQgb24gcmV0dXJuLgorICogQHBhcmFtIHBJbnRWb2x1bWVJbmMgcG9pbnRlciB0byB0aGUgVTQuMjggaW5jcmVtZW50IHBlciBvdXRwdXQgYXVkaW8gZnJhbWUsIHNldCBvbiByZXR1cm4uCisgKiBAcGFyYW0gcFNldFZvbHVtZSBwb2ludGVyIHRvIHRoZSBmbG9hdCB0YXJnZXQgdm9sdW1lLCBzZXQgb24gcmV0dXJuLgorICogQHBhcmFtIHBQcmV2Vm9sdW1lIHBvaW50ZXIgdG8gdGhlIGZsb2F0IHByZXZpb3VzIHZvbHVtZSwgc2V0IG9uIHJldHVybi4KKyAqIEBwYXJhbSBwVm9sdW1lSW5jIHBvaW50ZXIgdG8gdGhlIGZsb2F0IGluY3JlbWVudCBwZXIgb3V0cHV0IGF1ZGlvIGZyYW1lLCBzZXQgb24gcmV0dXJuLgorICogQHJldHVybiB0cnVlIGlmIHRoZSB2b2x1bWUgaGFzIGNoYW5nZWQsIGZhbHNlIGlmIHZvbHVtZSBpcyBzYW1lLgorICovCitzdGF0aWMgaW5saW5lIGJvb2wgc2V0Vm9sdW1lUmFtcFZhcmlhYmxlcyhmbG9hdCBuZXdWb2x1bWUsIGludDMyX3QgcmFtcCwKKyAgICAgICAgaW50MTZfdCAqcEludFNldFZvbHVtZSwgaW50MzJfdCAqcEludFByZXZWb2x1bWUsIGludDMyX3QgKnBJbnRWb2x1bWVJbmMsCisgICAgICAgIGZsb2F0ICpwU2V0Vm9sdW1lLCBmbG9hdCAqcFByZXZWb2x1bWUsIGZsb2F0ICpwVm9sdW1lSW5jKSB7CisgICAgaWYgKG5ld1ZvbHVtZSA9PSAqcFNldFZvbHVtZSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8qIHNldCB0aGUgZmxvYXRpbmcgcG9pbnQgdm9sdW1lIHZhcmlhYmxlcyAqLworICAgIGlmIChyYW1wICE9IDApIHsKKyAgICAgICAgKnBWb2x1bWVJbmMgPSAobmV3Vm9sdW1lIC0gKnBTZXRWb2x1bWUpIC8gcmFtcDsKKyAgICAgICAgKnBQcmV2Vm9sdW1lID0gKnBTZXRWb2x1bWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKnBWb2x1bWVJbmMgPSAwOworICAgICAgICAqcFByZXZWb2x1bWUgPSBuZXdWb2x1bWU7CisgICAgfQorICAgICpwU2V0Vm9sdW1lID0gbmV3Vm9sdW1lOworCisgICAgLyogc2V0IHRoZSBsZWdhY3kgaW50ZWdlciB2b2x1bWUgdmFyaWFibGVzICovCisgICAgaW50MzJfdCBpbnRWb2x1bWUgPSBuZXdWb2x1bWUgKiBBdWRpb01peGVyOjpVTklUWV9HQUlOX0lOVDsKKyAgICBpZiAoaW50Vm9sdW1lID4gQXVkaW9NaXhlcjo6VU5JVFlfR0FJTl9JTlQpIHsKKyAgICAgICAgaW50Vm9sdW1lID0gQXVkaW9NaXhlcjo6VU5JVFlfR0FJTl9JTlQ7CisgICAgfSBlbHNlIGlmIChpbnRWb2x1bWUgPCAwKSB7CisgICAgICAgIEFMT0dFKCJuZWdhdGl2ZSB2b2x1bWUgJS43ZyIsIG5ld1ZvbHVtZSk7CisgICAgICAgIGludFZvbHVtZSA9IDA7IC8vIHNob3VsZCBuZXZlciBoYXBwZW4sIGJ1dCBmb3Igc2FmZXR5IGNoZWNrLgorICAgIH0KKyAgICBpZiAoaW50Vm9sdW1lID09ICpwSW50U2V0Vm9sdW1lKSB7CisgICAgICAgICpwSW50Vm9sdW1lSW5jID0gMDsKKyAgICAgICAgLyogVE9ETzogaW50ZWdlci9mbG9hdCB3b3JrYXJvdW5kOiBpZ25vcmUgZmxvYXRpbmcgdm9sdW1lIHJhbXAgKi8KKyAgICAgICAgKnBWb2x1bWVJbmMgPSAwOworICAgICAgICAqcFByZXZWb2x1bWUgPSBuZXdWb2x1bWU7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAocmFtcCAhPSAwKSB7CisgICAgICAgICpwSW50Vm9sdW1lSW5jID0gKChpbnRWb2x1bWUgLSAqcEludFNldFZvbHVtZSkgPDwgMTYpIC8gcmFtcDsKKyAgICAgICAgKnBJbnRQcmV2Vm9sdW1lID0gKCpwSW50Vm9sdW1lSW5jID09IDAgPyBpbnRWb2x1bWUgOiAqcEludFNldFZvbHVtZSkgPDwgMTY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKnBJbnRWb2x1bWVJbmMgPSAwOworICAgICAgICAqcEludFByZXZWb2x1bWUgPSBpbnRWb2x1bWUgPDwgMTY7CisgICAgfQorICAgICpwSW50U2V0Vm9sdW1lID0gaW50Vm9sdW1lOworICAgIHJldHVybiB0cnVlOworfQorCiB2b2lkIEF1ZGlvTWl4ZXI6OnNldFBhcmFtZXRlcihpbnQgbmFtZSwgaW50IHRhcmdldCwgaW50IHBhcmFtLCB2b2lkICp2YWx1ZSkKIHsKICAgICBuYW1lIC09IFRSQUNLMDsKICAgICBBTE9HX0FTU0VSVCh1aW50MzJfdChuYW1lKSA8IE1BWF9OVU1fVFJBQ0tTLCAiYmFkIHRyYWNrIG5hbWUgJWQiLCBuYW1lKTsKICAgICB0cmFja190JiB0cmFjayA9IG1TdGF0ZS50cmFja3NbbmFtZV07CiAKLSAgICBpbnQgdmFsdWVJbnQgPSAoaW50KXZhbHVlOwotICAgIGludDMyX3QgKnZhbHVlQnVmID0gKGludDMyX3QgKil2YWx1ZTsKKyAgICBpbnQgdmFsdWVJbnQgPSBzdGF0aWNfY2FzdDxpbnQ+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90Pih2YWx1ZSkpOworICAgIGludDMyX3QgKnZhbHVlQnVmID0gcmVpbnRlcnByZXRfY2FzdDxpbnQzMl90Kj4odmFsdWUpOwogCiAgICAgc3dpdGNoICh0YXJnZXQpIHsKIAogICAgIGNhc2UgVFJBQ0s6CiAgICAgICAgIHN3aXRjaCAocGFyYW0pIHsKICAgICAgICAgY2FzZSBDSEFOTkVMX01BU0s6IHsKLSAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1hc2sgPSAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpIHZhbHVlOwotICAgICAgICAgICAgaWYgKHRyYWNrLmNoYW5uZWxNYXNrICE9IG1hc2spIHsKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBwb3Bjb3VudChtYXNrKTsKLSAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVCgoY2hhbm5lbENvdW50IDw9IE1BWF9OVU1fQ0hBTk5FTFNfVE9fRE9XTk1JWCkgJiYgY2hhbm5lbENvdW50KTsKLSAgICAgICAgICAgICAgICB0cmFjay5jaGFubmVsTWFzayA9IG1hc2s7Ci0gICAgICAgICAgICAgICAgdHJhY2suY2hhbm5lbENvdW50ID0gY2hhbm5lbENvdW50OwotICAgICAgICAgICAgICAgIC8vIHRoZSBtYXNrIGhhcyBjaGFuZ2VkLCBkb2VzIHRoaXMgdHJhY2sgbmVlZCBhIGRvd25taXhlcj8KLSAgICAgICAgICAgICAgICBpbml0VHJhY2tEb3dubWl4KCZtU3RhdGUudHJhY2tzW25hbWVdLCBuYW1lLCBtYXNrKTsKLSAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFRSQUNLLCBDSEFOTkVMX01BU0ssICV4KSIsIG1hc2spOworICAgICAgICAgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgdHJhY2tDaGFubmVsTWFzayA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KHZhbHVlSW50KTsKKyAgICAgICAgICAgIGlmIChzZXRDaGFubmVsTWFza3MobmFtZSwgdHJhY2tDaGFubmVsTWFzaywgdHJhY2subU1peGVyQ2hhbm5lbE1hc2spKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoInNldFBhcmFtZXRlcihUUkFDSywgQ0hBTk5FTF9NQVNLLCAleCkiLCB0cmFja0NoYW5uZWxNYXNrKTsKICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlU3RhdGUoMSA8PCBuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gYnJlYWs7CkBAIC00NTUsMTUgKzgyMiwzNyBAQAogICAgICAgICAgICAgICAgIGludmFsaWRhdGVTdGF0ZSgxIDw8IG5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRk9STUFUOgotICAgICAgICAgICAgQUxPR19BU1NFUlQodmFsdWVJbnQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRk9STUFUOiB7CisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBzdGF0aWNfY2FzdDxhdWRpb19mb3JtYXRfdD4odmFsdWVJbnQpOworICAgICAgICAgICAgaWYgKHRyYWNrLm1Gb3JtYXQgIT0gZm9ybWF0KSB7CisgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpLCAiSW52YWxpZCBmb3JtYXQgJSN4IiwgZm9ybWF0KTsKKyAgICAgICAgICAgICAgICB0cmFjay5tRm9ybWF0ID0gZm9ybWF0OworICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoVFJBQ0ssIEZPUk1BVCwgJSN4KSIsIGZvcm1hdCk7CisgICAgICAgICAgICAgICAgcHJlcGFyZVRyYWNrRm9yUmVmb3JtYXQoJnRyYWNrLCBuYW1lKTsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlU3RhdGUoMSA8PCBuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIC8vIEZJWE1FIGRvIHdlIHdhbnQgdG8gc3VwcG9ydCBzZXR0aW5nIHRoZSBkb3dubWl4IHR5cGUgZnJvbSBBdWRpb0ZsaW5nZXI/CiAgICAgICAgIC8vICAgICAgICAgZm9yIGEgc3BlY2lmaWMgdHJhY2s/IG9yIHBlciBtaXhlcj8KICAgICAgICAgLyogY2FzZSBET1dOTUlYX1RZUEU6CiAgICAgICAgICAgICBicmVhayAgICAgICAgICAqLworICAgICAgICBjYXNlIE1JWEVSX0ZPUk1BVDogeworICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KHZhbHVlSW50KTsKKyAgICAgICAgICAgIGlmICh0cmFjay5tTWl4ZXJGb3JtYXQgIT0gZm9ybWF0KSB7CisgICAgICAgICAgICAgICAgdHJhY2subU1peGVyRm9ybWF0ID0gZm9ybWF0OworICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoVFJBQ0ssIE1JWEVSX0ZPUk1BVCwgJSN4KSIsIGZvcm1hdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIE1JWEVSX0NIQU5ORUxfTUFTSzogeworICAgICAgICAgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbWl4ZXJDaGFubmVsTWFzayA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190Pih2YWx1ZUludCk7CisgICAgICAgICAgICBpZiAoc2V0Q2hhbm5lbE1hc2tzKG5hbWUsIHRyYWNrLmNoYW5uZWxNYXNrLCBtaXhlckNoYW5uZWxNYXNrKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoVFJBQ0ssIE1JWEVSX0NIQU5ORUxfTUFTSywgJSN4KSIsIG1peGVyQ2hhbm5lbE1hc2spOworICAgICAgICAgICAgICAgIGludmFsaWRhdGVTdGF0ZSgxIDw8IG5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBicmVhazsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIExPR19GQVRBTCgiYmFkIHBhcmFtIik7CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJzZXRQYXJhbWV0ZXIgdHJhY2s6IGJhZCBwYXJhbSAlZCIsIHBhcmFtKTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKIApAQCAtNDg4LDg1ICs4NzcsNzcgQEAKICAgICAgICAgICAgIGludmFsaWRhdGVTdGF0ZSgxIDw8IG5hbWUpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBMT0dfRkFUQUwoImJhZCBwYXJhbSIpOworICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgic2V0UGFyYW1ldGVyIHJlc2FtcGxlOiBiYWQgcGFyYW0gJWQiLCBwYXJhbSk7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIFJBTVBfVk9MVU1FOgogICAgIGNhc2UgVk9MVU1FOgogICAgICAgICBzd2l0Y2ggKHBhcmFtKSB7Ci0gICAgICAgIGNhc2UgVk9MVU1FMDoKLSAgICAgICAgY2FzZSBWT0xVTUUxOgotICAgICAgICAgICAgaWYgKHRyYWNrLnZvbHVtZVtwYXJhbS1WT0xVTUUwXSAhPSB2YWx1ZUludCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoVk9MVU1FLCBWT0xVTUUwLzE6ICUwNHgpIiwgdmFsdWVJbnQpOwotICAgICAgICAgICAgICAgIHRyYWNrLnByZXZWb2x1bWVbcGFyYW0tVk9MVU1FMF0gPSB0cmFjay52b2x1bWVbcGFyYW0tVk9MVU1FMF0gPDwgMTY7Ci0gICAgICAgICAgICAgICAgdHJhY2sudm9sdW1lW3BhcmFtLVZPTFVNRTBdID0gdmFsdWVJbnQ7Ci0gICAgICAgICAgICAgICAgaWYgKHRhcmdldCA9PSBWT0xVTUUpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJhY2sucHJldlZvbHVtZVtwYXJhbS1WT0xVTUUwXSA9IHZhbHVlSW50IDw8IDE2OwotICAgICAgICAgICAgICAgICAgICB0cmFjay52b2x1bWVJbmNbcGFyYW0tVk9MVU1FMF0gPSAwOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgZCA9ICh2YWx1ZUludDw8MTYpIC0gdHJhY2sucHJldlZvbHVtZVtwYXJhbS1WT0xVTUUwXTsKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2b2xJbmMgPSBkIC8gaW50MzJfdChtU3RhdGUuZnJhbWVDb3VudCk7Ci0gICAgICAgICAgICAgICAgICAgIHRyYWNrLnZvbHVtZUluY1twYXJhbS1WT0xVTUUwXSA9IHZvbEluYzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZvbEluYyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFjay5wcmV2Vm9sdW1lW3BhcmFtLVZPTFVNRTBdID0gdmFsdWVJbnQgPDwgMTY7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW52YWxpZGF0ZVN0YXRlKDEgPDwgbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBVVhMRVZFTDoKLSAgICAgICAgICAgIC8vQUxPR19BU1NFUlQoMCA8PSB2YWx1ZUludCAmJiB2YWx1ZUludCA8PSBNQVhfR0FJTl9JTlQsICJiYWQgYXV4IGxldmVsICVkIiwgdmFsdWVJbnQpOwotICAgICAgICAgICAgaWYgKHRyYWNrLmF1eExldmVsICE9IHZhbHVlSW50KSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInNldFBhcmFtZXRlcihWT0xVTUUsIEFVWExFVkVMOiAlMDR4KSIsIHZhbHVlSW50KTsKLSAgICAgICAgICAgICAgICB0cmFjay5wcmV2QXV4TGV2ZWwgPSB0cmFjay5hdXhMZXZlbCA8PCAxNjsKLSAgICAgICAgICAgICAgICB0cmFjay5hdXhMZXZlbCA9IHZhbHVlSW50OwotICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgPT0gVk9MVU1FKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyYWNrLnByZXZBdXhMZXZlbCA9IHZhbHVlSW50IDw8IDE2OwotICAgICAgICAgICAgICAgICAgICB0cmFjay5hdXhJbmMgPSAwOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgZCA9ICh2YWx1ZUludDw8MTYpIC0gdHJhY2sucHJldkF1eExldmVsOwotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZvbEluYyA9IGQgLyBpbnQzMl90KG1TdGF0ZS5mcmFtZUNvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgdHJhY2suYXV4SW5jID0gdm9sSW5jOwotICAgICAgICAgICAgICAgICAgICBpZiAodm9sSW5jID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLnByZXZBdXhMZXZlbCA9IHZhbHVlSW50IDw8IDE2OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNldFZvbHVtZVJhbXBWYXJpYWJsZXMoKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQqPih2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9PSBSQU1QX1ZPTFVNRSA/IG1TdGF0ZS5mcmFtZUNvdW50IDogMCwKKyAgICAgICAgICAgICAgICAgICAgJnRyYWNrLmF1eExldmVsLCAmdHJhY2sucHJldkF1eExldmVsLCAmdHJhY2suYXV4SW5jLAorICAgICAgICAgICAgICAgICAgICAmdHJhY2subUF1eExldmVsLCAmdHJhY2subVByZXZBdXhMZXZlbCwgJnRyYWNrLm1BdXhJbmMpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoInNldFBhcmFtZXRlciglcywgQVVYTEVWRUw6ICUwNHgpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9PSBWT0xVTUUgPyAiVk9MVU1FIiA6ICJSQU1QX1ZPTFVNRSIsIHRyYWNrLmF1eExldmVsKTsKICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlU3RhdGUoMSA8PCBuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTE9HX0ZBVEFMKCJiYWQgcGFyYW0iKTsKKyAgICAgICAgICAgIGlmICgodW5zaWduZWQpcGFyYW0gPj0gVk9MVU1FMCAmJiAodW5zaWduZWQpcGFyYW0gPCBWT0xVTUUwICsgTUFYX05VTV9WT0xVTUVTKSB7CisgICAgICAgICAgICAgICAgaWYgKHNldFZvbHVtZVJhbXBWYXJpYWJsZXMoKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQqPih2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPT0gUkFNUF9WT0xVTUUgPyBtU3RhdGUuZnJhbWVDb3VudCA6IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAmdHJhY2sudm9sdW1lW3BhcmFtIC0gVk9MVU1FMF0sICZ0cmFjay5wcmV2Vm9sdW1lW3BhcmFtIC0gVk9MVU1FMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAmdHJhY2sudm9sdW1lSW5jW3BhcmFtIC0gVk9MVU1FMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAmdHJhY2subVZvbHVtZVtwYXJhbSAtIFZPTFVNRTBdLCAmdHJhY2subVByZXZWb2x1bWVbcGFyYW0gLSBWT0xVTUUwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFjay5tVm9sdW1lSW5jW3BhcmFtIC0gVk9MVU1FMF0pKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoJXMsIFZPTFVNRSVkOiAlMDR4KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID09IFZPTFVNRSA/ICJWT0xVTUUiIDogIlJBTVBfVk9MVU1FIiwgcGFyYW0gLSBWT0xVTUUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2sudm9sdW1lW3BhcmFtIC0gVk9MVU1FMF0pOworICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlU3RhdGUoMSA8PCBuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoInNldFBhcmFtZXRlciB2b2x1bWU6IGJhZCBwYXJhbSAlZCIsIHBhcmFtKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBicmVhazsKIAogICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPR19GQVRBTCgiYmFkIHRhcmdldCIpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJzZXRQYXJhbWV0ZXI6IGJhZCB0YXJnZXQgJWQiLCB0YXJnZXQpOwogICAgIH0KIH0KIAotYm9vbCBBdWRpb01peGVyOjp0cmFja190OjpzZXRSZXNhbXBsZXIodWludDMyX3QgdmFsdWUsIHVpbnQzMl90IGRldlNhbXBsZVJhdGUpCitib29sIEF1ZGlvTWl4ZXI6OnRyYWNrX3Q6OnNldFJlc2FtcGxlcih1aW50MzJfdCB0cmFja1NhbXBsZVJhdGUsIHVpbnQzMl90IGRldlNhbXBsZVJhdGUpCiB7Ci0gICAgaWYgKHZhbHVlICE9IGRldlNhbXBsZVJhdGUgfHwgcmVzYW1wbGVyICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKHNhbXBsZVJhdGUgIT0gdmFsdWUpIHsKLSAgICAgICAgICAgIHNhbXBsZVJhdGUgPSB2YWx1ZTsKKyAgICBpZiAodHJhY2tTYW1wbGVSYXRlICE9IGRldlNhbXBsZVJhdGUgfHwgcmVzYW1wbGVyICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHNhbXBsZVJhdGUgIT0gdHJhY2tTYW1wbGVSYXRlKSB7CisgICAgICAgICAgICBzYW1wbGVSYXRlID0gdHJhY2tTYW1wbGVSYXRlOwogICAgICAgICAgICAgaWYgKHJlc2FtcGxlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImNyZWF0aW5nIHJlc2FtcGxlciBmcm9tIHRyYWNrICVkIEh6IHRvIGRldmljZSAlZCBIeiIsIHZhbHVlLCBkZXZTYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiQ3JlYXRpbmcgcmVzYW1wbGVyIGZyb20gdHJhY2sgJWQgSHogdG8gZGV2aWNlICVkIEh6IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrU2FtcGxlUmF0ZSwgZGV2U2FtcGxlUmF0ZSk7CiAgICAgICAgICAgICAgICAgQXVkaW9SZXNhbXBsZXI6OnNyY19xdWFsaXR5IHF1YWxpdHk7CiAgICAgICAgICAgICAgICAgLy8gZm9yY2UgbG93ZXN0IHF1YWxpdHkgbGV2ZWwgcmVzYW1wbGVyIGlmIHVzZSBjYXNlIGlzbid0IG11c2ljIG9yIHZpZGVvCiAgICAgICAgICAgICAgICAgLy8gRklYTUUgdGhpcyBpcyBmbGF3ZWQgZm9yIGR5bmFtaWMgc2FtcGxlIHJhdGVzLCBhcyB3ZSBjaG9vc2UgdGhlIHJlc2FtcGxlcgogICAgICAgICAgICAgICAgIC8vIHF1YWxpdHkgbGV2ZWwgYmFzZWQgb24gdGhlIGluaXRpYWwgcmF0aW8sIGJ1dCB0aGF0IGNvdWxkIGNoYW5nZSBsYXRlci4KICAgICAgICAgICAgICAgICAvLyBTaG91bGQgaGF2ZSBhIHdheSB0byBkaXN0aW5ndWlzaCB0cmFja3Mgd2l0aCBzdGF0aWMgcmF0aW9zIHZzLiBkeW5hbWljIHJhdGlvcy4KLSAgICAgICAgICAgICAgICBpZiAoISgodmFsdWUgPT0gNDQxMDAgJiYgZGV2U2FtcGxlUmF0ZSA9PSA0ODAwMCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAodmFsdWUgPT0gNDgwMDAgJiYgZGV2U2FtcGxlUmF0ZSA9PSA0NDEwMCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHF1YWxpdHkgPSBBdWRpb1Jlc2FtcGxlcjo6TE9XX1FVQUxJVFk7CisgICAgICAgICAgICAgICAgaWYgKCEoKHRyYWNrU2FtcGxlUmF0ZSA9PSA0NDEwMCAmJiBkZXZTYW1wbGVSYXRlID09IDQ4MDAwKSB8fAorICAgICAgICAgICAgICAgICAgICAgICh0cmFja1NhbXBsZVJhdGUgPT0gNDgwMDAgJiYgZGV2U2FtcGxlUmF0ZSA9PSA0NDEwMCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHF1YWxpdHkgPSBBdWRpb1Jlc2FtcGxlcjo6RFlOX0xPV19RVUFMSVRZOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHkgPSBBdWRpb1Jlc2FtcGxlcjo6REVGQVVMVF9RVUFMSVRZOwogICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFRPRE86IFJlbW92ZSBNT05PX0hBQ0suIFJlc2FtcGxlciBzZWVzICNjaGFubmVscyBhZnRlciB0aGUgZG93bm1peGVyCisgICAgICAgICAgICAgICAgLy8gYnV0IGlmIG5vbmUgZXhpc3RzLCBpdCBpcyB0aGUgY2hhbm5lbCBjb3VudCAoMSBmb3IgbW9ubykuCisgICAgICAgICAgICAgICAgY29uc3QgaW50IHJlc2FtcGxlckNoYW5uZWxDb3VudCA9IGRvd25taXhlckJ1ZmZlclByb3ZpZGVyICE9IE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgID8gbU1peGVyQ2hhbm5lbENvdW50IDogY2hhbm5lbENvdW50OworICAgICAgICAgICAgICAgIEFMT0dWVigiQ3JlYXRpbmcgcmVzYW1wbGVyOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgZm9ybWF0KCUjeCkgY2hhbm5lbHMoJWQpIGRldlNhbXBsZVJhdGUoJXUpIHF1YWxpdHkoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgbU1peGVySW5Gb3JtYXQsIHJlc2FtcGxlckNoYW5uZWxDb3VudCwgZGV2U2FtcGxlUmF0ZSwgcXVhbGl0eSk7CiAgICAgICAgICAgICAgICAgcmVzYW1wbGVyID0gQXVkaW9SZXNhbXBsZXI6OmNyZWF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZXNhbXBsZXIgc2VlcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIGFmdGVyIHRoZSBkb3dubWl4ZXIsIGlmIGFueQotICAgICAgICAgICAgICAgICAgICAgICAgZG93bm1peGVyQnVmZmVyUHJvdmlkZXIgIT0gTlVMTCA/IE1BWF9OVU1fQ0hBTk5FTFMgOiBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICBtTWl4ZXJJbkZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc2FtcGxlckNoYW5uZWxDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgIGRldlNhbXBsZVJhdGUsIHF1YWxpdHkpOwogICAgICAgICAgICAgICAgIHJlc2FtcGxlci0+c2V0TG9jYWxUaW1lRnJlcShzTG9jYWxUaW1lRnJlcSk7CiAgICAgICAgICAgICB9CkBAIC01NzYsMjEgKzk1Nyw1NyBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAotaW5saW5lCi12b2lkIEF1ZGlvTWl4ZXI6OnRyYWNrX3Q6OmFkanVzdFZvbHVtZVJhbXAoYm9vbCBhdXgpCisvKiBDaGVja3MgdG8gc2VlIGlmIHRoZSB2b2x1bWUgcmFtcCBoYXMgY29tcGxldGVkIGFuZCBjbGVhcnMgdGhlIGluY3JlbWVudAorICogdmFyaWFibGVzIGFwcHJvcHJpYXRlbHkuCisgKgorICogRklYTUU6IFRoZXJlIGlzIGNvZGUgdG8gaGFuZGxlIGludC9mbG9hdCByYW1wIHZhcmlhYmxlIHN3aXRjaG92ZXIgc2hvdWxkIGl0IG5vdAorICogY29tcGxldGUgd2l0aGluIGEgbWl4ZXIgYnVmZmVyIHByb2Nlc3NpbmcgY2FsbCwgYnV0IGl0IGlzIHByZWZlcnJlZCB0byBhdm9pZCBzd2l0Y2hvdmVyCisgKiBkdWUgdG8gcHJlY2lzaW9uIGlzc3Vlcy4gIFRoZSBzd2l0Y2hvdmVyIGNvZGUgaXMgaW5jbHVkZWQgZm9yIGxlZ2FjeSBjb2RlIHB1cnBvc2VzCisgKiBhbmQgY2FuIGJlIHJlbW92ZWQgb25jZSB0aGUgaW50ZWdlciB2b2x1bWUgaXMgcmVtb3ZlZC4KKyAqCisgKiBJdCBpcyBub3Qgc3VmZmljaWVudCB0byBjbGVhciBvbmx5IHRoZSB2b2x1bWVJbmMgaW50ZWdlciB2YXJpYWJsZSBiZWNhdXNlCisgKiBpZiBvbmUgY2hhbm5lbCByZXF1aXJlcyByYW1waW5nLCBhbGwgY2hhbm5lbHMgYXJlIHJhbXBlZC4KKyAqCisgKiBUaGVyZSBpcyBhIGJpdCBvZiBkdXBsaWNhdGVkIGNvZGUgaGVyZSwgYnV0IGl0IGtlZXBzIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisgKi8KK2lubGluZSB2b2lkIEF1ZGlvTWl4ZXI6OnRyYWNrX3Q6OmFkanVzdFZvbHVtZVJhbXAoYm9vbCBhdXgsIGJvb2wgdXNlRmxvYXQpCiB7Ci0gICAgZm9yICh1aW50MzJfdCBpPTAgOyBpPE1BWF9OVU1fQ0hBTk5FTFMgOyBpKyspIHsKLSAgICAgICAgaWYgKCgodm9sdW1lSW5jW2ldPjApICYmICgoKHByZXZWb2x1bWVbaV0rdm9sdW1lSW5jW2ldKT4+MTYpID49IHZvbHVtZVtpXSkpIHx8Ci0gICAgICAgICAgICAoKHZvbHVtZUluY1tpXTwwKSAmJiAoKChwcmV2Vm9sdW1lW2ldK3ZvbHVtZUluY1tpXSk+PjE2KSA8PSB2b2x1bWVbaV0pKSkgewotICAgICAgICAgICAgdm9sdW1lSW5jW2ldID0gMDsKLSAgICAgICAgICAgIHByZXZWb2x1bWVbaV0gPSB2b2x1bWVbaV08PDE2OworICAgIGlmICh1c2VGbG9hdCkgeworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgTUFYX05VTV9WT0xVTUVTOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChtVm9sdW1lSW5jW2ldICE9IDAgJiYgZmFicyhtVm9sdW1lW2ldIC0gbVByZXZWb2x1bWVbaV0pIDw9IGZhYnMobVZvbHVtZUluY1tpXSkpIHsKKyAgICAgICAgICAgICAgICB2b2x1bWVJbmNbaV0gPSAwOworICAgICAgICAgICAgICAgIHByZXZWb2x1bWVbaV0gPSB2b2x1bWVbaV0gPDwgMTY7CisgICAgICAgICAgICAgICAgbVZvbHVtZUluY1tpXSA9IDAuOworICAgICAgICAgICAgICAgIG1QcmV2Vm9sdW1lW2ldID0gbVZvbHVtZVtpXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy9BTE9HVigicmFtcDogJWYgJWYgJWYiLCBtVm9sdW1lW2ldLCBtUHJldlZvbHVtZVtpXSwgbVZvbHVtZUluY1tpXSk7CisgICAgICAgICAgICAgICAgcHJldlZvbHVtZVtpXSA9IHU0XzI4X2Zyb21fZmxvYXQobVByZXZWb2x1bWVbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IE1BWF9OVU1fVk9MVU1FUzsgaSsrKSB7CisgICAgICAgICAgICBpZiAoKCh2b2x1bWVJbmNbaV0+MCkgJiYgKCgocHJldlZvbHVtZVtpXSt2b2x1bWVJbmNbaV0pPj4xNikgPj0gdm9sdW1lW2ldKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKCh2b2x1bWVJbmNbaV08MCkgJiYgKCgocHJldlZvbHVtZVtpXSt2b2x1bWVJbmNbaV0pPj4xNikgPD0gdm9sdW1lW2ldKSkpIHsKKyAgICAgICAgICAgICAgICB2b2x1bWVJbmNbaV0gPSAwOworICAgICAgICAgICAgICAgIHByZXZWb2x1bWVbaV0gPSB2b2x1bWVbaV0gPDwgMTY7CisgICAgICAgICAgICAgICAgbVZvbHVtZUluY1tpXSA9IDAuOworICAgICAgICAgICAgICAgIG1QcmV2Vm9sdW1lW2ldID0gbVZvbHVtZVtpXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy9BTE9HVigicmFtcDogJWQgJWQgJWQiLCB2b2x1bWVbaV0gPDwgMTYsIHByZXZWb2x1bWVbaV0sIHZvbHVtZUluY1tpXSk7CisgICAgICAgICAgICAgICAgbVByZXZWb2x1bWVbaV0gID0gZmxvYXRfZnJvbV91NF8yOChwcmV2Vm9sdW1lW2ldKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KKyAgICAvKiBUT0RPOiBhdXggaXMgYWx3YXlzIGludGVnZXIgcmVnYXJkbGVzcyBvZiBvdXRwdXQgYnVmZmVyIHR5cGUgKi8KICAgICBpZiAoYXV4KSB7CiAgICAgICAgIGlmICgoKGF1eEluYz4wKSAmJiAoKChwcmV2QXV4TGV2ZWwrYXV4SW5jKT4+MTYpID49IGF1eExldmVsKSkgfHwKLSAgICAgICAgICAgICgoYXV4SW5jPDApICYmICgoKHByZXZBdXhMZXZlbCthdXhJbmMpPj4xNikgPD0gYXV4TGV2ZWwpKSkgeworICAgICAgICAgICAgICAgICgoYXV4SW5jPDApICYmICgoKHByZXZBdXhMZXZlbCthdXhJbmMpPj4xNikgPD0gYXV4TGV2ZWwpKSkgewogICAgICAgICAgICAgYXV4SW5jID0gMDsKLSAgICAgICAgICAgIHByZXZBdXhMZXZlbCA9IGF1eExldmVsPDwxNjsKKyAgICAgICAgICAgIHByZXZBdXhMZXZlbCA9IGF1eExldmVsIDw8IDE2OworICAgICAgICAgICAgbUF1eEluYyA9IDAuOworICAgICAgICAgICAgbVByZXZBdXhMZXZlbCA9IG1BdXhMZXZlbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vQUxPR1YoImF1eCByYW1wOiAlZCAlZCAlZCIsIGF1eExldmVsIDw8IDE2LCBwcmV2QXV4TGV2ZWwsIGF1eEluYyk7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC02MDksMjEgKzEwMjYsMTYgQEAKICAgICBuYW1lIC09IFRSQUNLMDsKICAgICBBTE9HX0FTU0VSVCh1aW50MzJfdChuYW1lKSA8IE1BWF9OVU1fVFJBQ0tTLCAiYmFkIHRyYWNrIG5hbWUgJWQiLCBuYW1lKTsKIAotICAgIGlmIChtU3RhdGUudHJhY2tzW25hbWVdLmRvd25taXhlckJ1ZmZlclByb3ZpZGVyICE9IE5VTEwpIHsKLSAgICAgICAgLy8gdXBkYXRlIHJlcXVpcmVkPwotICAgICAgICBpZiAobVN0YXRlLnRyYWNrc1tuYW1lXS5kb3dubWl4ZXJCdWZmZXJQcm92aWRlci0+bVRyYWNrQnVmZmVyUHJvdmlkZXIgIT0gYnVmZmVyUHJvdmlkZXIpIHsKLSAgICAgICAgICAgIEFMT0dWKCJBdWRpb01peGVyOjpzZXRCdWZmZXJQcm92aWRlciglcCkgZm9yIGRvd25taXgiLCBidWZmZXJQcm92aWRlcik7Ci0gICAgICAgICAgICAvLyBzZXR0aW5nIHRoZSBidWZmZXIgcHJvdmlkZXIgZm9yIGEgdHJhY2sgdGhhdCBnZXRzIGRvd25taXhlZCBjb25zaXN0cyBpbjoKLSAgICAgICAgICAgIC8vICAxLyBzZXR0aW5nIHRoZSBidWZmZXIgcHJvdmlkZXIgdG8gdGhlICJkb3dubWl4IC8gYnVmZmVyIHByb3ZpZGVyIiB3cmFwcGVyCi0gICAgICAgICAgICAvLyAgICAgc28gaXQncyB0aGUgb25lIHRoYXQgZ2V0cyBjYWxsZWQgd2hlbiB0aGUgYnVmZmVyIHByb3ZpZGVyIGlzIG5lZWRlZCwKLSAgICAgICAgICAgIG1TdGF0ZS50cmFja3NbbmFtZV0uYnVmZmVyUHJvdmlkZXIgPSBtU3RhdGUudHJhY2tzW25hbWVdLmRvd25taXhlckJ1ZmZlclByb3ZpZGVyOwotICAgICAgICAgICAgLy8gIDIvIHNhdmluZyB0aGUgYnVmZmVyIHByb3ZpZGVyIGZvciB0aGUgdHJhY2sgc28gdGhlIHdyYXBwZXIgY2FuIHVzZSBpdAotICAgICAgICAgICAgLy8gICAgIHdoZW4gaXQgZG93bm1peGVzLgotICAgICAgICAgICAgbVN0YXRlLnRyYWNrc1tuYW1lXS5kb3dubWl4ZXJCdWZmZXJQcm92aWRlci0+bVRyYWNrQnVmZmVyUHJvdmlkZXIgPSBidWZmZXJQcm92aWRlcjsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1TdGF0ZS50cmFja3NbbmFtZV0uYnVmZmVyUHJvdmlkZXIgPSBidWZmZXJQcm92aWRlcjsKKyAgICBpZiAobVN0YXRlLnRyYWNrc1tuYW1lXS5tSW5wdXRCdWZmZXJQcm92aWRlciA9PSBidWZmZXJQcm92aWRlcikgeworICAgICAgICByZXR1cm47IC8vIGRvbid0IHJlc2V0IGFueSBidWZmZXIgcHJvdmlkZXJzIGlmIGlkZW50aWNhbC4KICAgICB9CisgICAgaWYgKG1TdGF0ZS50cmFja3NbbmFtZV0ubVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIgIT0gTlVMTCkgeworICAgICAgICBtU3RhdGUudHJhY2tzW25hbWVdLm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLT5yZXNldCgpOworICAgIH0gZWxzZSBpZiAobVN0YXRlLnRyYWNrc1tuYW1lXS5kb3dubWl4ZXJCdWZmZXJQcm92aWRlciAhPSBOVUxMKSB7CisgICAgfQorCisgICAgbVN0YXRlLnRyYWNrc1tuYW1lXS5tSW5wdXRCdWZmZXJQcm92aWRlciA9IGJ1ZmZlclByb3ZpZGVyOworICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCZtU3RhdGUudHJhY2tzW25hbWVdKTsKIH0KIAogCkBAIC02NTYsNiArMTA2OCw5IEBACiAKICAgICAvLyBjb21wdXRlIGV2ZXJ5dGhpbmcgd2UgbmVlZC4uLgogICAgIGludCBjb3VudEFjdGl2ZVRyYWNrcyA9IDA7CisgICAgLy8gVE9ETzogZml4IGFsbDE2Qml0c1N0ZXJlTm9SZXNhbXBsZSBsb2dpYyB0bworICAgIC8vIGVpdGhlciBwcm9wZXJseSBoYW5kbGUgbXV0ZWQgdHJhY2tzIChpdCBzaG91bGQgaWdub3JlIHRoZW0pCisgICAgLy8gb3IgcmVtb3ZlIGFsdG9nZXRoZXIgYXMgYW4gb2Jzb2xldGUgb3B0aW1pemF0aW9uLgogICAgIGJvb2wgYWxsMTZCaXRzU3RlcmVvTm9SZXNhbXBsZSA9IHRydWU7CiAgICAgYm9vbCByZXNhbXBsaW5nID0gZmFsc2U7CiAgICAgYm9vbCB2b2x1bWVSYW1wID0gZmFsc2U7CkBAIC02NjcsMzkgKzEwODIsNDcgQEAKICAgICAgICAgY291bnRBY3RpdmVUcmFja3MrKzsKICAgICAgICAgdHJhY2tfdCYgdCA9IHN0YXRlLT50cmFja3NbaV07CiAgICAgICAgIHVpbnQzMl90IG4gPSAwOworICAgICAgICAvLyBGSVhNRSBjYW4gb3ZlcmZsb3cgKG1hc2sgaXMgb25seSAzIGJpdHMpCiAgICAgICAgIG4gfD0gTkVFRFNfQ0hBTk5FTF8xICsgdC5jaGFubmVsQ291bnQgLSAxOwotICAgICAgICBuIHw9IE5FRURTX0ZPUk1BVF8xNjsKLSAgICAgICAgbiB8PSB0LmRvZXNSZXNhbXBsZSgpID8gTkVFRFNfUkVTQU1QTEVfRU5BQkxFRCA6IE5FRURTX1JFU0FNUExFX0RJU0FCTEVEOworICAgICAgICBpZiAodC5kb2VzUmVzYW1wbGUoKSkgeworICAgICAgICAgICAgbiB8PSBORUVEU19SRVNBTVBMRTsKKyAgICAgICAgfQogICAgICAgICBpZiAodC5hdXhMZXZlbCAhPSAwICYmIHQuYXV4QnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG4gfD0gTkVFRFNfQVVYX0VOQUJMRUQ7CisgICAgICAgICAgICBuIHw9IE5FRURTX0FVWDsKICAgICAgICAgfQogCiAgICAgICAgIGlmICh0LnZvbHVtZUluY1swXXx0LnZvbHVtZUluY1sxXSkgewogICAgICAgICAgICAgdm9sdW1lUmFtcCA9IHRydWU7CiAgICAgICAgIH0gZWxzZSBpZiAoIXQuZG9lc1Jlc2FtcGxlKCkgJiYgdC52b2x1bWVSTCA9PSAwKSB7Ci0gICAgICAgICAgICBuIHw9IE5FRURTX01VVEVfRU5BQkxFRDsKKyAgICAgICAgICAgIG4gfD0gTkVFRFNfTVVURTsKICAgICAgICAgfQogICAgICAgICB0Lm5lZWRzID0gbjsKIAotICAgICAgICBpZiAoKG4gJiBORUVEU19NVVRFX19NQVNLKSA9PSBORUVEU19NVVRFX0VOQUJMRUQpIHsKKyAgICAgICAgaWYgKG4gJiBORUVEU19NVVRFKSB7CiAgICAgICAgICAgICB0Lmhvb2sgPSB0cmFja19fbm9wOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKChuICYgTkVFRFNfQVVYX19NQVNLKSA9PSBORUVEU19BVVhfRU5BQkxFRCkgeworICAgICAgICAgICAgaWYgKG4gJiBORUVEU19BVVgpIHsKICAgICAgICAgICAgICAgICBhbGwxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxlID0gZmFsc2U7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKG4gJiBORUVEU19SRVNBTVBMRV9fTUFTSykgPT0gTkVFRFNfUkVTQU1QTEVfRU5BQkxFRCkgeworICAgICAgICAgICAgaWYgKG4gJiBORUVEU19SRVNBTVBMRSkgewogICAgICAgICAgICAgICAgIGFsbDE2Qml0c1N0ZXJlb05vUmVzYW1wbGUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICByZXNhbXBsaW5nID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB0Lmhvb2sgPSB0cmFja19fZ2VuZXJpY1Jlc2FtcGxlOworICAgICAgICAgICAgICAgIHQuaG9vayA9IGdldFRyYWNrSG9vayhUUkFDS1RZUEVfUkVTQU1QTEUsIHQubU1peGVyQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgdC5tTWl4ZXJJbkZvcm1hdCwgdC5tTWl4ZXJGb3JtYXQpOwogICAgICAgICAgICAgICAgIEFMT0dWX0lGKChuICYgTkVFRFNfQ0hBTk5FTF9DT1VOVF9fTUFTSykgPiBORUVEU19DSEFOTkVMXzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiVHJhY2sgJWQgbmVlZHMgZG93bm1peCArIHJlc2FtcGxlIiwgaSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmICgobiAmIE5FRURTX0NIQU5ORUxfQ09VTlRfX01BU0spID09IE5FRURTX0NIQU5ORUxfMSl7Ci0gICAgICAgICAgICAgICAgICAgIHQuaG9vayA9IHRyYWNrX18xNkJpdHNNb25vOworICAgICAgICAgICAgICAgICAgICB0Lmhvb2sgPSBnZXRUcmFja0hvb2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5tTWl4ZXJDaGFubmVsQ291bnQgPT0gMiAvLyBUT0RPOiBNT05PX0hBQ0suCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gVFJBQ0tUWVBFX05PUkVTQU1QTEVNT05PIDogVFJBQ0tUWVBFX05PUkVTQU1QTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5tTWl4ZXJDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5tTWl4ZXJJbkZvcm1hdCwgdC5tTWl4ZXJGb3JtYXQpOwogICAgICAgICAgICAgICAgICAgICBhbGwxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmICgobiAmIE5FRURTX0NIQU5ORUxfQ09VTlRfX01BU0spID49IE5FRURTX0NIQU5ORUxfMil7Ci0gICAgICAgICAgICAgICAgICAgIHQuaG9vayA9IHRyYWNrX18xNkJpdHNTdGVyZW87CisgICAgICAgICAgICAgICAgICAgIHQuaG9vayA9IGdldFRyYWNrSG9vayhUUkFDS1RZUEVfTk9SRVNBTVBMRSwgdC5tTWl4ZXJDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5tTWl4ZXJJbkZvcm1hdCwgdC5tTWl4ZXJGb3JtYXQpOwogICAgICAgICAgICAgICAgICAgICBBTE9HVl9JRigobiAmIE5FRURTX0NIQU5ORUxfQ09VTlRfX01BU0spID4gTkVFRFNfQ0hBTk5FTF8yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUcmFjayAlZCBuZWVkcyBkb3dubWl4IiwgaSk7CiAgICAgICAgICAgICAgICAgfQpAQCAtNzA5LDcgKzExMzIsNyBAQAogCiAgICAgLy8gc2VsZWN0IHRoZSBwcm9jZXNzaW5nIGhvb2tzCiAgICAgc3RhdGUtPmhvb2sgPSBwcm9jZXNzX19ub3A7Ci0gICAgaWYgKGNvdW50QWN0aXZlVHJhY2tzKSB7CisgICAgaWYgKGNvdW50QWN0aXZlVHJhY2tzID4gMCkgewogICAgICAgICBpZiAocmVzYW1wbGluZykgewogICAgICAgICAgICAgaWYgKCFzdGF0ZS0+b3V0cHV0VGVtcCkgewogICAgICAgICAgICAgICAgIHN0YXRlLT5vdXRwdXRUZW1wID0gbmV3IGludDMyX3RbTUFYX05VTV9DSEFOTkVMUyAqIHN0YXRlLT5mcmFtZUNvdW50XTsKQEAgLTczMCw3ICsxMTUzLDE3IEBACiAgICAgICAgICAgICBzdGF0ZS0+aG9vayA9IHByb2Nlc3NfX2dlbmVyaWNOb1Jlc2FtcGxpbmc7CiAgICAgICAgICAgICBpZiAoYWxsMTZCaXRzU3RlcmVvTm9SZXNhbXBsZSAmJiAhdm9sdW1lUmFtcCkgewogICAgICAgICAgICAgICAgIGlmIChjb3VudEFjdGl2ZVRyYWNrcyA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlLT5ob29rID0gcHJvY2Vzc19fT25lVHJhY2sxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxpbmc7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KHN0YXRlLT5lbmFibGVkVHJhY2tzKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhY2tfdCYgdCA9IHN0YXRlLT50cmFja3NbaV07CisgICAgICAgICAgICAgICAgICAgIGlmICgodC5uZWVkcyAmIE5FRURTX01VVEUpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjaGVjayBwcmV2ZW50cyBhIG11dGVkIHRyYWNrIGZyb20gYWNxdWlyaW5nIGEgcHJvY2VzcyBob29rLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgZGFuZ2Vyb3VzIGlmIHRoZSB0cmFjayBpcyBNT05PIGFzIHRoYXQgcmVxdWlyZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSBoYW5kbGluZyBkdWUgdG8gaW1wbGljaXQgY2hhbm5lbCBkdXBsaWNhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0ZXJlbyBvciBNdWx0aWNoYW5uZWwgc2hvdWxkIGFjdHVhbGx5IGJlIGZpbmUgaGVyZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5ob29rID0gZ2V0UHJvY2Vzc0hvb2soUFJPQ0VTU1RZUEVfTk9SRVNBTVBMRU9ORVRSQUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Lm1NaXhlckNoYW5uZWxDb3VudCwgdC5tTWl4ZXJJbkZvcm1hdCwgdC5tTWl4ZXJGb3JtYXQpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC03NDUsMTYgKzExNzgsMTUgQEAKIAogICAgIC8vIE5vdyB0aGF0IHRoZSB2b2x1bWUgcmFtcCBoYXMgYmVlbiBkb25lLCBzZXQgb3B0aW1hbCBzdGF0ZSBhbmQKICAgICAvLyB0cmFjayBob29rcyBmb3Igc3Vic2VxdWVudCBtaXhlciBwcm9jZXNzCi0gICAgaWYgKGNvdW50QWN0aXZlVHJhY2tzKSB7CisgICAgaWYgKGNvdW50QWN0aXZlVHJhY2tzID4gMCkgewogICAgICAgICBib29sIGFsbE11dGVkID0gdHJ1ZTsKICAgICAgICAgdWludDMyX3QgZW4gPSBzdGF0ZS0+ZW5hYmxlZFRyYWNrczsKICAgICAgICAgd2hpbGUgKGVuKSB7CiAgICAgICAgICAgICBjb25zdCBpbnQgaSA9IDMxIC0gX19idWlsdGluX2Nseihlbik7CiAgICAgICAgICAgICBlbiAmPSB+KDE8PGkpOwogICAgICAgICAgICAgdHJhY2tfdCYgdCA9IHN0YXRlLT50cmFja3NbaV07Ci0gICAgICAgICAgICBpZiAoIXQuZG9lc1Jlc2FtcGxlKCkgJiYgdC52b2x1bWVSTCA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHQubmVlZHMgfD0gTkVFRFNfTVVURV9FTkFCTEVEOworICAgICAgICAgICAgaWYgKCF0LmRvZXNSZXNhbXBsZSgpICYmIHQudm9sdW1lUkwgPT0gMCkgeworICAgICAgICAgICAgICAgIHQubmVlZHMgfD0gTkVFRFNfTVVURTsKICAgICAgICAgICAgICAgICB0Lmhvb2sgPSB0cmFja19fbm9wOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBhbGxNdXRlZCA9IGZhbHNlOwpAQCAtNzY0LDcgKzExOTYsMTEgQEAKICAgICAgICAgICAgIHN0YXRlLT5ob29rID0gcHJvY2Vzc19fbm9wOwogICAgICAgICB9IGVsc2UgaWYgKGFsbDE2Qml0c1N0ZXJlb05vUmVzYW1wbGUpIHsKICAgICAgICAgICAgIGlmIChjb3VudEFjdGl2ZVRyYWNrcyA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPmhvb2sgPSBwcm9jZXNzX19PbmVUcmFjazE2Qml0c1N0ZXJlb05vUmVzYW1wbGluZzsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgaSA9IDMxIC0gX19idWlsdGluX2NseihzdGF0ZS0+ZW5hYmxlZFRyYWNrcyk7CisgICAgICAgICAgICAgICAgdHJhY2tfdCYgdCA9IHN0YXRlLT50cmFja3NbaV07CisgICAgICAgICAgICAgICAgLy8gTXV0ZWQgc2luZ2xlIHRyYWNrcyBoYW5kbGVkIGJ5IGFsbE11dGVkIGFib3ZlLgorICAgICAgICAgICAgICAgIHN0YXRlLT5ob29rID0gZ2V0UHJvY2Vzc0hvb2soUFJPQ0VTU1RZUEVfTk9SRVNBTVBMRU9ORVRSQUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgdC5tTWl4ZXJDaGFubmVsQ291bnQsIHQubU1peGVySW5Gb3JtYXQsIHQubU1peGVyRm9ybWF0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTc3NCwxNSArMTIxMCwxNSBAQAogdm9pZCBBdWRpb01peGVyOjp0cmFja19fZ2VuZXJpY1Jlc2FtcGxlKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCiAgICAgICAgIGludDMyX3QqIHRlbXAsIGludDMyX3QqIGF1eCkKIHsKKyAgICBBTE9HVlYoInRyYWNrX19nZW5lcmljUmVzYW1wbGVcbiIpOwogICAgIHQtPnJlc2FtcGxlci0+c2V0U2FtcGxlUmF0ZSh0LT5zYW1wbGVSYXRlKTsKIAogICAgIC8vIHJhbXAgZ2FpbiAtIHJlc2FtcGxlIHRvIHRlbXAgYnVmZmVyIGFuZCBzY2FsZS9taXggaW4gMm5kIHN0ZXAKICAgICBpZiAoYXV4ICE9IE5VTEwpIHsKICAgICAgICAgLy8gYWx3YXlzIHJlc2FtcGxlIHdpdGggdW5pdHkgZ2FpbiB3aGVuIHNlbmRpbmcgdG8gYXV4aWxpYXJ5IGJ1ZmZlciB0byBiZSBhYmxlCiAgICAgICAgIC8vIHRvIGFwcGx5IHNlbmQgbGV2ZWwgYWZ0ZXIgcmVzYW1wbGluZwotICAgICAgICAvLyBUT0RPOiBtb2RpZnkgZWFjaCByZXNhbXBsZXIgdG8gc3VwcG9ydCBhdXggY2hhbm5lbD8KLSAgICAgICAgdC0+cmVzYW1wbGVyLT5zZXRWb2x1bWUoVU5JVFlfR0FJTiwgVU5JVFlfR0FJTik7Ci0gICAgICAgIG1lbXNldCh0ZW1wLCAwLCBvdXRGcmFtZUNvdW50ICogTUFYX05VTV9DSEFOTkVMUyAqIHNpemVvZihpbnQzMl90KSk7CisgICAgICAgIHQtPnJlc2FtcGxlci0+c2V0Vm9sdW1lKFVOSVRZX0dBSU5fRkxPQVQsIFVOSVRZX0dBSU5fRkxPQVQpOworICAgICAgICBtZW1zZXQodGVtcCwgMCwgb3V0RnJhbWVDb3VudCAqIHQtPm1NaXhlckNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQzMl90KSk7CiAgICAgICAgIHQtPnJlc2FtcGxlci0+cmVzYW1wbGUodGVtcCwgb3V0RnJhbWVDb3VudCwgdC0+YnVmZmVyUHJvdmlkZXIpOwogICAgICAgICBpZiAoQ0NfVU5MSUtFTFkodC0+dm9sdW1lSW5jWzBdfHQtPnZvbHVtZUluY1sxXXx0LT5hdXhJbmMpKSB7CiAgICAgICAgICAgICB2b2x1bWVSYW1wU3RlcmVvKHQsIG91dCwgb3V0RnJhbWVDb3VudCwgdGVtcCwgYXV4KTsKQEAgLTc5MSw3ICsxMjI3LDcgQEAKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChDQ19VTkxJS0VMWSh0LT52b2x1bWVJbmNbMF18dC0+dm9sdW1lSW5jWzFdKSkgewotICAgICAgICAgICAgdC0+cmVzYW1wbGVyLT5zZXRWb2x1bWUoVU5JVFlfR0FJTiwgVU5JVFlfR0FJTik7CisgICAgICAgICAgICB0LT5yZXNhbXBsZXItPnNldFZvbHVtZShVTklUWV9HQUlOX0ZMT0FULCBVTklUWV9HQUlOX0ZMT0FUKTsKICAgICAgICAgICAgIG1lbXNldCh0ZW1wLCAwLCBvdXRGcmFtZUNvdW50ICogTUFYX05VTV9DSEFOTkVMUyAqIHNpemVvZihpbnQzMl90KSk7CiAgICAgICAgICAgICB0LT5yZXNhbXBsZXItPnJlc2FtcGxlKHRlbXAsIG91dEZyYW1lQ291bnQsIHQtPmJ1ZmZlclByb3ZpZGVyKTsKICAgICAgICAgICAgIHZvbHVtZVJhbXBTdGVyZW8odCwgb3V0LCBvdXRGcmFtZUNvdW50LCB0ZW1wLCBhdXgpOwpAQCAtNzk5LDE0ICsxMjM1LDE0IEBACiAKICAgICAgICAgLy8gY29uc3RhbnQgZ2FpbgogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHQtPnJlc2FtcGxlci0+c2V0Vm9sdW1lKHQtPnZvbHVtZVswXSwgdC0+dm9sdW1lWzFdKTsKKyAgICAgICAgICAgIHQtPnJlc2FtcGxlci0+c2V0Vm9sdW1lKHQtPm1Wb2x1bWVbMF0sIHQtPm1Wb2x1bWVbMV0pOwogICAgICAgICAgICAgdC0+cmVzYW1wbGVyLT5yZXNhbXBsZShvdXQsIG91dEZyYW1lQ291bnQsIHQtPmJ1ZmZlclByb3ZpZGVyKTsKICAgICAgICAgfQogICAgIH0KIH0KIAotdm9pZCBBdWRpb01peGVyOjp0cmFja19fbm9wKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsIGludDMyX3QqIHRlbXAsCi0gICAgICAgIGludDMyX3QqIGF1eCkKK3ZvaWQgQXVkaW9NaXhlcjo6dHJhY2tfX25vcCh0cmFja190KiB0IF9fdW51c2VkLCBpbnQzMl90KiBvdXQgX191bnVzZWQsCisgICAgICAgIHNpemVfdCBvdXRGcmFtZUNvdW50IF9fdW51c2VkLCBpbnQzMl90KiB0ZW1wIF9fdW51c2VkLCBpbnQzMl90KiBhdXggX191bnVzZWQpCiB7CiB9CiAKQEAgLTg4Miw5ICsxMzE4LDEwIEBACiAgICAgfQogfQogCi12b2lkIEF1ZGlvTWl4ZXI6OnRyYWNrX18xNkJpdHNTdGVyZW8odHJhY2tfdCogdCwgaW50MzJfdCogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwgaW50MzJfdCogdGVtcCwKLSAgICAgICAgaW50MzJfdCogYXV4KQordm9pZCBBdWRpb01peGVyOjp0cmFja19fMTZCaXRzU3RlcmVvKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgIGludDMyX3QqIHRlbXAgX191bnVzZWQsIGludDMyX3QqIGF1eCkKIHsKKyAgICBBTE9HVlYoInRyYWNrX18xNkJpdHNTdGVyZW9cbiIpOwogICAgIGNvbnN0IGludDE2X3QgKmluID0gc3RhdGljX2Nhc3Q8Y29uc3QgaW50MTZfdCAqPih0LT5pbik7CiAKICAgICBpZiAoQ0NfVU5MSUtFTFkoYXV4ICE9IE5VTEwpKSB7CkBAIC05NzMsOSArMTQxMCwxMCBAQAogICAgIHQtPmluID0gaW47CiB9CiAKLXZvaWQgQXVkaW9NaXhlcjo6dHJhY2tfXzE2Qml0c01vbm8odHJhY2tfdCogdCwgaW50MzJfdCogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwgaW50MzJfdCogdGVtcCwKLSAgICAgICAgaW50MzJfdCogYXV4KQordm9pZCBBdWRpb01peGVyOjp0cmFja19fMTZCaXRzTW9ubyh0cmFja190KiB0LCBpbnQzMl90KiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICBpbnQzMl90KiB0ZW1wIF9fdW51c2VkLCBpbnQzMl90KiBhdXgpCiB7CisgICAgQUxPR1ZWKCJ0cmFja19fMTZCaXRzTW9ub1xuIik7CiAgICAgY29uc3QgaW50MTZfdCAqaW4gPSBzdGF0aWNfY2FzdDxpbnQxNl90IGNvbnN0ICo+KHQtPmluKTsKIAogICAgIGlmIChDQ19VTkxJS0VMWShhdXggIT0gTlVMTCkpIHsKQEAgLTEwNjMsOCArMTUwMSw4IEBACiAvLyBuby1vcCBjYXNlCiB2b2lkIEF1ZGlvTWl4ZXI6OnByb2Nlc3NfX25vcChzdGF0ZV90KiBzdGF0ZSwgaW50NjRfdCBwdHMpCiB7CisgICAgQUxPR1ZWKCJwcm9jZXNzX19ub3BcbiIpOwogICAgIHVpbnQzMl90IGUwID0gc3RhdGUtPmVuYWJsZWRUcmFja3M7Ci0gICAgc2l6ZV90IGJ1ZlNpemUgPSBzdGF0ZS0+ZnJhbWVDb3VudCAqIHNpemVvZihpbnQxNl90KSAqIE1BWF9OVU1fQ0hBTk5FTFM7CiAgICAgd2hpbGUgKGUwKSB7CiAgICAgICAgIC8vIHByb2Nlc3MgYnkgZ3JvdXAgb2YgdHJhY2tzIHdpdGggc2FtZSBvdXRwdXQgYnVmZmVyIHRvCiAgICAgICAgIC8vIGF2b2lkIG11bHRpcGxlIG1lbXNldCgpIG9uIHNhbWUgYnVmZmVyCkBAIC0xMDgzLDcgKzE1MjEsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgZTAgJj0gfihlMSk7CiAKLSAgICAgICAgICAgIG1lbXNldCh0MS5tYWluQnVmZmVyLCAwLCBidWZTaXplKTsKKyAgICAgICAgICAgIG1lbXNldCh0MS5tYWluQnVmZmVyLCAwLCBzdGF0ZS0+ZnJhbWVDb3VudCAqIHQxLm1NaXhlckNoYW5uZWxDb3VudAorICAgICAgICAgICAgICAgICAgICAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUodDEubU1peGVyRm9ybWF0KSk7CiAgICAgICAgIH0KIAogICAgICAgICB3aGlsZSAoZTEpIHsKQEAgLTExMDksNiArMTU0OCw3IEBACiAvLyBnZW5lcmljIGNvZGUgd2l0aG91dCByZXNhbXBsaW5nCiB2b2lkIEF1ZGlvTWl4ZXI6OnByb2Nlc3NfX2dlbmVyaWNOb1Jlc2FtcGxpbmcoc3RhdGVfdCogc3RhdGUsIGludDY0X3QgcHRzKQogeworICAgIEFMT0dWVigicHJvY2Vzc19fZ2VuZXJpY05vUmVzYW1wbGluZ1xuIik7CiAgICAgaW50MzJfdCBvdXRUZW1wW0JMT0NLU0laRSAqIE1BWF9OVU1fQ0hBTk5FTFNdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMzIpKSk7CiAKICAgICAvLyBhY3F1aXJlIGVhY2ggdHJhY2sncyBidWZmZXIKQEAgLTExNTMsNyArMTU5Myw3IEBACiAgICAgICAgICAgICAgICAgdHJhY2tfdCYgdCA9IHN0YXRlLT50cmFja3NbaV07CiAgICAgICAgICAgICAgICAgc2l6ZV90IG91dEZyYW1lcyA9IEJMT0NLU0laRTsKICAgICAgICAgICAgICAgICBpbnQzMl90ICphdXggPSBOVUxMOwotICAgICAgICAgICAgICAgIGlmIChDQ19VTkxJS0VMWSgodC5uZWVkcyAmIE5FRURTX0FVWF9fTUFTSykgPT0gTkVFRFNfQVVYX0VOQUJMRUQpKSB7CisgICAgICAgICAgICAgICAgaWYgKENDX1VOTElLRUxZKHQubmVlZHMgJiBORUVEU19BVVgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGF1eCA9IHQuYXV4QnVmZmVyICsgbnVtRnJhbWVzOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB3aGlsZSAob3V0RnJhbWVzKSB7CkBAIC0xMTY1LDkgKzE2MDUsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluRnJhbWVzID0gKHQuZnJhbWVDb3VudCA+IG91dEZyYW1lcyk/b3V0RnJhbWVzOnQuZnJhbWVDb3VudDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluRnJhbWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0Lmhvb2soJnQsIG91dFRlbXAgKyAoQkxPQ0tTSVpFLW91dEZyYW1lcykqTUFYX05VTV9DSEFOTkVMUywgaW5GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5yZXNhbXBsZVRlbXAsIGF1eCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbkZyYW1lcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHQuaG9vaygmdCwgb3V0VGVtcCArIChCTE9DS1NJWkUgLSBvdXRGcmFtZXMpICogdC5tTWl4ZXJDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRnJhbWVzLCBzdGF0ZS0+cmVzYW1wbGVUZW1wLCBhdXgpOwogICAgICAgICAgICAgICAgICAgICAgICAgdC5mcmFtZUNvdW50IC09IGluRnJhbWVzOwogICAgICAgICAgICAgICAgICAgICAgICAgb3V0RnJhbWVzIC09IGluRnJhbWVzOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENDX1VOTElLRUxZKGF1eCAhPSBOVUxMKSkgewpAQCAtMTE5MSw4ICsxNjMxLDEzIEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBkaXRoZXJBbmRDbGFtcChvdXQsIG91dFRlbXAsIEJMT0NLU0laRSk7Ci0gICAgICAgICAgICBvdXQgKz0gQkxPQ0tTSVpFOworCisgICAgICAgICAgICBjb252ZXJ0TWl4ZXJGb3JtYXQob3V0LCB0MS5tTWl4ZXJGb3JtYXQsIG91dFRlbXAsIHQxLm1NaXhlckluRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICBCTE9DS1NJWkUgKiB0MS5tTWl4ZXJDaGFubmVsQ291bnQpOworICAgICAgICAgICAgLy8gVE9ETzogZml4IHVnbHkgY2FzdGluZyBkdWUgdG8gY2hvaWNlIG9mIG91dCBwb2ludGVyIHR5cGUKKyAgICAgICAgICAgIG91dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdCo+KCh1aW50OF90KilvdXQKKyAgICAgICAgICAgICAgICAgICAgKyBCTE9DS1NJWkUgKiB0MS5tTWl4ZXJDaGFubmVsQ291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZSh0MS5tTWl4ZXJGb3JtYXQpKTsKICAgICAgICAgICAgIG51bUZyYW1lcyArPSBCTE9DS1NJWkU7CiAgICAgICAgIH0gd2hpbGUgKG51bUZyYW1lcyA8IHN0YXRlLT5mcmFtZUNvdW50KTsKICAgICB9CkBAIC0xMjExLDEwICsxNjU2LDkgQEAKIC8vIGdlbmVyaWMgY29kZSB3aXRoIHJlc2FtcGxpbmcKIHZvaWQgQXVkaW9NaXhlcjo6cHJvY2Vzc19fZ2VuZXJpY1Jlc2FtcGxpbmcoc3RhdGVfdCogc3RhdGUsIGludDY0X3QgcHRzKQogeworICAgIEFMT0dWVigicHJvY2Vzc19fZ2VuZXJpY1Jlc2FtcGxpbmdcbiIpOwogICAgIC8vIHRoaXMgY29uc3QganVzdCBtZWFucyB0aGF0IGxvY2FsIHZhcmlhYmxlIG91dFRlbXAgZG9lc24ndCBjaGFuZ2UKICAgICBpbnQzMl90KiBjb25zdCBvdXRUZW1wID0gc3RhdGUtPm91dHB1dFRlbXA7Ci0gICAgY29uc3Qgc2l6ZV90IHNpemUgPSBzaXplb2YoaW50MzJfdCkgKiBNQVhfTlVNX0NIQU5ORUxTICogc3RhdGUtPmZyYW1lQ291bnQ7Ci0KICAgICBzaXplX3QgbnVtRnJhbWVzID0gc3RhdGUtPmZyYW1lQ291bnQ7CiAKICAgICB1aW50MzJfdCBlMCA9IHN0YXRlLT5lbmFibGVkVHJhY2tzOwpAQCAtMTIzNSwyMCArMTY3OSwyMCBAQAogICAgICAgICB9CiAgICAgICAgIGUwICY9IH4oZTEpOwogICAgICAgICBpbnQzMl90ICpvdXQgPSB0MS5tYWluQnVmZmVyOwotICAgICAgICBtZW1zZXQob3V0VGVtcCwgMCwgc2l6ZSk7CisgICAgICAgIG1lbXNldChvdXRUZW1wLCAwLCBzaXplb2YoKm91dFRlbXApICogdDEubU1peGVyQ2hhbm5lbENvdW50ICogc3RhdGUtPmZyYW1lQ291bnQpOwogICAgICAgICB3aGlsZSAoZTEpIHsKICAgICAgICAgICAgIGNvbnN0IGludCBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KGUxKTsKICAgICAgICAgICAgIGUxICY9IH4oMTw8aSk7CiAgICAgICAgICAgICB0cmFja190JiB0ID0gc3RhdGUtPnRyYWNrc1tpXTsKICAgICAgICAgICAgIGludDMyX3QgKmF1eCA9IE5VTEw7Ci0gICAgICAgICAgICBpZiAoQ0NfVU5MSUtFTFkoKHQubmVlZHMgJiBORUVEU19BVVhfX01BU0spID09IE5FRURTX0FVWF9FTkFCTEVEKSkgeworICAgICAgICAgICAgaWYgKENDX1VOTElLRUxZKHQubmVlZHMgJiBORUVEU19BVVgpKSB7CiAgICAgICAgICAgICAgICAgYXV4ID0gdC5hdXhCdWZmZXI7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBsaXR0bGUgZ29vZnksIG9uIHRoZSByZXNhbXBsaW5nIGNhc2Ugd2UgZG9uJ3QKICAgICAgICAgICAgIC8vIGFjcXVpcmUvcmVsZWFzZSB0aGUgYnVmZmVycyBiZWNhdXNlIGl0J3MgZG9uZSBieQogICAgICAgICAgICAgLy8gdGhlIHJlc2FtcGxlci4KLSAgICAgICAgICAgIGlmICgodC5uZWVkcyAmIE5FRURTX1JFU0FNUExFX19NQVNLKSA9PSBORUVEU19SRVNBTVBMRV9FTkFCTEVEKSB7CisgICAgICAgICAgICBpZiAodC5uZWVkcyAmIE5FRURTX1JFU0FNUExFKSB7CiAgICAgICAgICAgICAgICAgdC5yZXNhbXBsZXItPnNldFBUUyhwdHMpOwogICAgICAgICAgICAgICAgIHQuaG9vaygmdCwgb3V0VGVtcCwgbnVtRnJhbWVzLCBzdGF0ZS0+cmVzYW1wbGVUZW1wLCBhdXgpOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTEyNjcsMTQgKzE3MTEsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKENDX1VOTElLRUxZKGF1eCAhPSBOVUxMKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgYXV4ICs9IG91dEZyYW1lczsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0Lmhvb2soJnQsIG91dFRlbXAgKyBvdXRGcmFtZXMqTUFYX05VTV9DSEFOTkVMUywgdC5idWZmZXIuZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgdC5ob29rKCZ0LCBvdXRUZW1wICsgb3V0RnJhbWVzICogdC5tTWl4ZXJDaGFubmVsQ291bnQsIHQuYnVmZmVyLmZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPnJlc2FtcGxlVGVtcCwgYXV4KTsKICAgICAgICAgICAgICAgICAgICAgb3V0RnJhbWVzICs9IHQuYnVmZmVyLmZyYW1lQ291bnQ7CiAgICAgICAgICAgICAgICAgICAgIHQuYnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJnQuYnVmZmVyKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgZGl0aGVyQW5kQ2xhbXAob3V0LCBvdXRUZW1wLCBudW1GcmFtZXMpOworICAgICAgICBjb252ZXJ0TWl4ZXJGb3JtYXQob3V0LCB0MS5tTWl4ZXJGb3JtYXQsCisgICAgICAgICAgICAgICAgb3V0VGVtcCwgdDEubU1peGVySW5Gb3JtYXQsIG51bUZyYW1lcyAqIHQxLm1NaXhlckNoYW5uZWxDb3VudCk7CiAgICAgfQogfQogCkBAIC0xMjgyLDYgKzE3MjcsNyBAQAogdm9pZCBBdWRpb01peGVyOjpwcm9jZXNzX19PbmVUcmFjazE2Qml0c1N0ZXJlb05vUmVzYW1wbGluZyhzdGF0ZV90KiBzdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwdHMpCiB7CisgICAgQUxPR1ZWKCJwcm9jZXNzX19PbmVUcmFjazE2Qml0c1N0ZXJlb05vUmVzYW1wbGluZ1xuIik7CiAgICAgLy8gVGhpcyBtZXRob2QgaXMgb25seSBjYWxsZWQgd2hlbiBzdGF0ZS0+ZW5hYmxlZFRyYWNrcyBoYXMgZXhhY3RseQogICAgIC8vIG9uZSBiaXQgc2V0LiAgVGhlIGFzc2VydHMgYmVsb3cgd291bGQgdmVyaWZ5IHRoaXMsIGJ1dCBhcmUgY29tbWVudGVkIG91dAogICAgIC8vIHNpbmNlIHRoZSB3aG9sZSBwb2ludCBvZiB0aGlzIG1ldGhvZCBpcyB0byBvcHRpbWl6ZSBwZXJmb3JtYW5jZS4KQEAgLTEyOTMsNiArMTczOSw3IEBACiAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyJiBiKHQuYnVmZmVyKTsKIAogICAgIGludDMyX3QqIG91dCA9IHQubWFpbkJ1ZmZlcjsKKyAgICBmbG9hdCAqZm91dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQqPihvdXQpOwogICAgIHNpemVfdCBudW1GcmFtZXMgPSBzdGF0ZS0+ZnJhbWVDb3VudDsKIAogICAgIGNvbnN0IGludDE2X3QgdmwgPSB0LnZvbHVtZVswXTsKQEAgLTEzMDYsMTUwICsxNzUzLDY4IEBACiAKICAgICAgICAgLy8gaW4gPT0gTlVMTCBjYW4gaGFwcGVuIGlmIHRoZSB0cmFjayB3YXMgZmx1c2hlZCBqdXN0IGFmdGVyIGhhdmluZwogICAgICAgICAvLyBiZWVuIGVuYWJsZWQgZm9yIG1peGluZy4KLSAgICAgICAgaWYgKGluID09IE5VTEwgfHwgKCh1bnNpZ25lZCBsb25nKWluICYgMykpIHsKLSAgICAgICAgICAgIG1lbXNldChvdXQsIDAsIG51bUZyYW1lcypNQVhfTlVNX0NIQU5ORUxTKnNpemVvZihpbnQxNl90KSk7Ci0gICAgICAgICAgICBBTE9HRV9JRigoKHVuc2lnbmVkIGxvbmcpaW4gJiAzKSwgInByb2Nlc3Mgc3RlcmVvIHRyYWNrOiBpbnB1dCBidWZmZXIgYWxpZ25tZW50IHBiOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1ZmZlciAlcCB0cmFjayAlZCwgY2hhbm5lbHMgJWQsIG5lZWRzICUwOHgiLAotICAgICAgICAgICAgICAgICAgICBpbiwgaSwgdC5jaGFubmVsQ291bnQsIHQubmVlZHMpOworICAgICAgICBpZiAoaW4gPT0gTlVMTCB8fCAoKCh1aW50cHRyX3QpaW4pICYgMykpIHsKKyAgICAgICAgICAgIG1lbXNldChvdXQsIDAsIG51bUZyYW1lcworICAgICAgICAgICAgICAgICAgICAqIHQubU1peGVyQ2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZSh0Lm1NaXhlckZvcm1hdCkpOworICAgICAgICAgICAgQUxPR0VfSUYoKCgodWludHB0cl90KWluKSAmIDMpLAorICAgICAgICAgICAgICAgICAgICAicHJvY2Vzc19fT25lVHJhY2sxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxpbmc6IG1pc2FsaWduZWQgYnVmZmVyIgorICAgICAgICAgICAgICAgICAgICAiICVwIHRyYWNrICVkLCBjaGFubmVscyAlZCwgbmVlZHMgJTA4eCwgdm9sdW1lICUwOHggdmZsICVmIHZmciAlZiIsCisgICAgICAgICAgICAgICAgICAgIGluLCBpLCB0LmNoYW5uZWxDb3VudCwgdC5uZWVkcywgdnJsLCB0Lm1Wb2x1bWVbMF0sIHQubVZvbHVtZVsxXSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgc2l6ZV90IG91dEZyYW1lcyA9IGIuZnJhbWVDb3VudDsKIAotICAgICAgICBpZiAoQ0NfVU5MSUtFTFkodWludDMyX3QodmwpID4gVU5JVFlfR0FJTiB8fCB1aW50MzJfdCh2cikgPiBVTklUWV9HQUlOKSkgewotICAgICAgICAgICAgLy8gdm9sdW1lIGlzIGJvb3N0ZWQsIHNvIHdlIG1pZ2h0IG5lZWQgdG8gY2xhbXAgZXZlbiB0aG91Z2gKLSAgICAgICAgICAgIC8vIHdlIHByb2Nlc3Mgb25seSBvbmUgdHJhY2suCisgICAgICAgIHN3aXRjaCAodC5tTWl4ZXJGb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgogICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgIHVpbnQzMl90IHJsID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QgKj4oaW4pOwogICAgICAgICAgICAgICAgIGluICs9IDI7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCBsID0gbXVsUkwoMSwgcmwsIHZybCkgPj4gMTI7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCByID0gbXVsUkwoMCwgcmwsIHZybCkgPj4gMTI7Ci0gICAgICAgICAgICAgICAgLy8gY2xhbXBpbmcuLi4KLSAgICAgICAgICAgICAgICBsID0gY2xhbXAxNihsKTsKLSAgICAgICAgICAgICAgICByID0gY2xhbXAxNihyKTsKLSAgICAgICAgICAgICAgICAqb3V0KysgPSAocjw8MTYpIHwgKGwgJiAweEZGRkYpOworICAgICAgICAgICAgICAgIGludDMyX3QgbCA9IG11bFJMKDEsIHJsLCB2cmwpOworICAgICAgICAgICAgICAgIGludDMyX3QgciA9IG11bFJMKDAsIHJsLCB2cmwpOworICAgICAgICAgICAgICAgICpmb3V0KysgPSBmbG9hdF9mcm9tX3E0XzI3KGwpOworICAgICAgICAgICAgICAgICpmb3V0KysgPSBmbG9hdF9mcm9tX3E0XzI3KHIpOworICAgICAgICAgICAgICAgIC8vIE5vdGU6IEluIGNhc2Ugb2YgbGF0ZXIgaW50MTZfdCBzaW5rIG91dHB1dCwKKyAgICAgICAgICAgICAgICAvLyBjb252ZXJzaW9uIGFuZCBjbGFtcGluZyBpcyBkb25lIGJ5IG1lbWNweV90b19pMTZfZnJvbV9mbG9hdCgpLgogICAgICAgICAgICAgfSB3aGlsZSAoLS1vdXRGcmFtZXMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIHVpbnQzMl90IHJsID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QgKj4oaW4pOwotICAgICAgICAgICAgICAgIGluICs9IDI7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCBsID0gbXVsUkwoMSwgcmwsIHZybCkgPj4gMTI7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCByID0gbXVsUkwoMCwgcmwsIHZybCkgPj4gMTI7Ci0gICAgICAgICAgICAgICAgKm91dCsrID0gKHI8PDE2KSB8IChsICYgMHhGRkZGKTsKLSAgICAgICAgICAgIH0gd2hpbGUgKC0tb3V0RnJhbWVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICAgICAgaWYgKENDX1VOTElLRUxZKHVpbnQzMl90KHZsKSA+IFVOSVRZX0dBSU5fSU5UIHx8IHVpbnQzMl90KHZyKSA+IFVOSVRZX0dBSU5fSU5UKSkgeworICAgICAgICAgICAgICAgIC8vIHZvbHVtZSBpcyBib29zdGVkLCBzbyB3ZSBtaWdodCBuZWVkIHRvIGNsYW1wIGV2ZW4gdGhvdWdoCisgICAgICAgICAgICAgICAgLy8gd2UgcHJvY2VzcyBvbmx5IG9uZSB0cmFjay4KKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJsID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QgKj4oaW4pOworICAgICAgICAgICAgICAgICAgICBpbiArPSAyOworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGwgPSBtdWxSTCgxLCBybCwgdnJsKSA+PiAxMjsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByID0gbXVsUkwoMCwgcmwsIHZybCkgPj4gMTI7CisgICAgICAgICAgICAgICAgICAgIC8vIGNsYW1waW5nLi4uCisgICAgICAgICAgICAgICAgICAgIGwgPSBjbGFtcDE2KGwpOworICAgICAgICAgICAgICAgICAgICByID0gY2xhbXAxNihyKTsKKyAgICAgICAgICAgICAgICAgICAgKm91dCsrID0gKHI8PDE2KSB8IChsICYgMHhGRkZGKTsKKyAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW91dEZyYW1lcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmwgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCAqPihpbik7CisgICAgICAgICAgICAgICAgICAgIGluICs9IDI7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbCA9IG11bFJMKDEsIHJsLCB2cmwpID4+IDEyOworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHIgPSBtdWxSTCgwLCBybCwgdnJsKSA+PiAxMjsKKyAgICAgICAgICAgICAgICAgICAgKm91dCsrID0gKHI8PDE2KSB8IChsICYgMHhGRkZGKTsKKyAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW91dEZyYW1lcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCBtaXhlciBmb3JtYXQ6ICVkIiwgdC5tTWl4ZXJGb3JtYXQpOwogICAgICAgICB9CiAgICAgICAgIG51bUZyYW1lcyAtPSBiLmZyYW1lQ291bnQ7CiAgICAgICAgIHQuYnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJmIpOwogICAgIH0KIH0KIAotI2lmIDAKLS8vIDIgdHJhY2tzIGlzIGFsc28gYSBjb21tb24gY2FzZQotLy8gTkVWRVIgdXNlZCBpbiBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIHByb2Nlc3NfX3ZhbGlkYXRlKCkKLS8vIG9ubHkgdXNlIGlmIHRoZSAyIHRyYWNrcyBoYXZlIHRoZSBzYW1lIG91dHB1dCBidWZmZXIKLXZvaWQgQXVkaW9NaXhlcjo6cHJvY2Vzc19fVHdvVHJhY2tzMTZCaXRzU3RlcmVvTm9SZXNhbXBsaW5nKHN0YXRlX3QqIHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwdHMpCi17Ci0gICAgaW50IGk7Ci0gICAgdWludDMyX3QgZW4gPSBzdGF0ZS0+ZW5hYmxlZFRyYWNrczsKLQotICAgIGkgPSAzMSAtIF9fYnVpbHRpbl9jbHooZW4pOwotICAgIGNvbnN0IHRyYWNrX3QmIHQwID0gc3RhdGUtPnRyYWNrc1tpXTsKLSAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXImIGIwKHQwLmJ1ZmZlcik7Ci0KLSAgICBlbiAmPSB+KDE8PGkpOwotICAgIGkgPSAzMSAtIF9fYnVpbHRpbl9jbHooZW4pOwotICAgIGNvbnN0IHRyYWNrX3QmIHQxID0gc3RhdGUtPnRyYWNrc1tpXTsKLSAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXImIGIxKHQxLmJ1ZmZlcik7Ci0KLSAgICBjb25zdCBpbnQxNl90ICppbjA7Ci0gICAgY29uc3QgaW50MTZfdCB2bDAgPSB0MC52b2x1bWVbMF07Ci0gICAgY29uc3QgaW50MTZfdCB2cjAgPSB0MC52b2x1bWVbMV07Ci0gICAgc2l6ZV90IGZyYW1lQ291bnQwID0gMDsKLQotICAgIGNvbnN0IGludDE2X3QgKmluMTsKLSAgICBjb25zdCBpbnQxNl90IHZsMSA9IHQxLnZvbHVtZVswXTsKLSAgICBjb25zdCBpbnQxNl90IHZyMSA9IHQxLnZvbHVtZVsxXTsKLSAgICBzaXplX3QgZnJhbWVDb3VudDEgPSAwOwotCi0gICAgLy9GSVhNRTogb25seSB3b3JrcyBpZiB0d28gdHJhY2tzIHVzZSBzYW1lIGJ1ZmZlcgotICAgIGludDMyX3QqIG91dCA9IHQwLm1haW5CdWZmZXI7Ci0gICAgc2l6ZV90IG51bUZyYW1lcyA9IHN0YXRlLT5mcmFtZUNvdW50OwotICAgIGNvbnN0IGludDE2X3QgKmJ1ZmYgPSBOVUxMOwotCi0KLSAgICB3aGlsZSAobnVtRnJhbWVzKSB7Ci0KLSAgICAgICAgaWYgKGZyYW1lQ291bnQwID09IDApIHsKLSAgICAgICAgICAgIGIwLmZyYW1lQ291bnQgPSBudW1GcmFtZXM7Ci0gICAgICAgICAgICBpbnQ2NF90IG91dHB1dFBUUyA9IGNhbGN1bGF0ZU91dHB1dFBUUyh0MCwgcHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0IC0gdDAubWFpbkJ1ZmZlcik7Ci0gICAgICAgICAgICB0MC5idWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmYjAsIG91dHB1dFBUUyk7Ci0gICAgICAgICAgICBpZiAoYjAuaTE2ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpZiAoYnVmZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmYgPSBuZXcgaW50MTZfdFtNQVhfTlVNX0NIQU5ORUxTICogc3RhdGUtPmZyYW1lQ291bnRdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbjAgPSBidWZmOwotICAgICAgICAgICAgICAgIGIwLmZyYW1lQ291bnQgPSBudW1GcmFtZXM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGluMCA9IGIwLmkxNjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZyYW1lQ291bnQwID0gYjAuZnJhbWVDb3VudDsKLSAgICAgICAgfQotICAgICAgICBpZiAoZnJhbWVDb3VudDEgPT0gMCkgewotICAgICAgICAgICAgYjEuZnJhbWVDb3VudCA9IG51bUZyYW1lczsKLSAgICAgICAgICAgIGludDY0X3Qgb3V0cHV0UFRTID0gY2FsY3VsYXRlT3V0cHV0UFRTKHQxLCBwdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQgLSB0MC5tYWluQnVmZmVyKTsKLSAgICAgICAgICAgIHQxLmJ1ZmZlclByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZiMSwgb3V0cHV0UFRTKTsKLSAgICAgICAgICAgIGlmIChiMS5pMTYgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGlmIChidWZmID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmZiA9IG5ldyBpbnQxNl90W01BWF9OVU1fQ0hBTk5FTFMgKiBzdGF0ZS0+ZnJhbWVDb3VudF07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGluMSA9IGJ1ZmY7Ci0gICAgICAgICAgICAgICAgYjEuZnJhbWVDb3VudCA9IG51bUZyYW1lczsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW4xID0gYjEuaTE2OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnJhbWVDb3VudDEgPSBiMS5mcmFtZUNvdW50OwotICAgICAgICB9Ci0KLSAgICAgICAgc2l6ZV90IG91dEZyYW1lcyA9IGZyYW1lQ291bnQwIDwgZnJhbWVDb3VudDE/ZnJhbWVDb3VudDA6ZnJhbWVDb3VudDE7Ci0KLSAgICAgICAgbnVtRnJhbWVzIC09IG91dEZyYW1lczsKLSAgICAgICAgZnJhbWVDb3VudDAgLT0gb3V0RnJhbWVzOwotICAgICAgICBmcmFtZUNvdW50MSAtPSBvdXRGcmFtZXM7Ci0KLSAgICAgICAgZG8gewotICAgICAgICAgICAgaW50MzJfdCBsMCA9ICppbjArKzsKLSAgICAgICAgICAgIGludDMyX3QgcjAgPSAqaW4wKys7Ci0gICAgICAgICAgICBsMCA9IG11bChsMCwgdmwwKTsKLSAgICAgICAgICAgIHIwID0gbXVsKHIwLCB2cjApOwotICAgICAgICAgICAgaW50MzJfdCBsID0gKmluMSsrOwotICAgICAgICAgICAgaW50MzJfdCByID0gKmluMSsrOwotICAgICAgICAgICAgbCA9IG11bEFkZChsLCB2bDEsIGwwKSA+PiAxMjsKLSAgICAgICAgICAgIHIgPSBtdWxBZGQociwgdnIxLCByMCkgPj4gMTI7Ci0gICAgICAgICAgICAvLyBjbGFtcGluZy4uLgotICAgICAgICAgICAgbCA9IGNsYW1wMTYobCk7Ci0gICAgICAgICAgICByID0gY2xhbXAxNihyKTsKLSAgICAgICAgICAgICpvdXQrKyA9IChyPDwxNikgfCAobCAmIDB4RkZGRik7Ci0gICAgICAgIH0gd2hpbGUgKC0tb3V0RnJhbWVzKTsKLQotICAgICAgICBpZiAoZnJhbWVDb3VudDAgPT0gMCkgewotICAgICAgICAgICAgdDAuYnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJmIwKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZnJhbWVDb3VudDEgPT0gMCkgewotICAgICAgICAgICAgdDEuYnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJmIxKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGRlbGV0ZSBbXSBidWZmOwotfQotI2VuZGlmCi0KIGludDY0X3QgQXVkaW9NaXhlcjo6Y2FsY3VsYXRlT3V0cHV0UFRTKGNvbnN0IHRyYWNrX3QmIHQsIGludDY0X3QgYmFzZVBUUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRwdXRGcmFtZUluZGV4KQogewotICAgIGlmIChBdWRpb0J1ZmZlclByb3ZpZGVyOjprSW52YWxpZFBUUyA9PSBiYXNlUFRTKQorICAgIGlmIChBdWRpb0J1ZmZlclByb3ZpZGVyOjprSW52YWxpZFBUUyA9PSBiYXNlUFRTKSB7CiAgICAgICAgIHJldHVybiBBdWRpb0J1ZmZlclByb3ZpZGVyOjprSW52YWxpZFBUUzsKKyAgICB9CiAKICAgICByZXR1cm4gYmFzZVBUUyArICgob3V0cHV0RnJhbWVJbmRleCAqIHNMb2NhbFRpbWVGcmVxKSAvIHQuc2FtcGxlUmF0ZSk7CiB9CkBAIC0xNDYwLDcgKzE4MjUsNDE0IEBACiAvKnN0YXRpYyovIHZvaWQgQXVkaW9NaXhlcjo6c0luaXRSb3V0aW5lKCkKIHsKICAgICBMb2NhbENsb2NrIGxjOwotICAgIHNMb2NhbFRpbWVGcmVxID0gbGMuZ2V0TG9jYWxGcmVxKCk7CisgICAgc0xvY2FsVGltZUZyZXEgPSBsYy5nZXRMb2NhbEZyZXEoKTsgLy8gZm9yIHRoZSByZXNhbXBsZXIKKworICAgIERvd25taXhlckJ1ZmZlclByb3ZpZGVyOjppbml0KCk7IC8vIGZvciB0aGUgZG93bm1peGVyCit9CisKKy8qIFRPRE86IGNvbnNpZGVyIHdoZXRoZXIgdGhpcyBsZXZlbCBvZiBvcHRpbWl6YXRpb24gaXMgbmVjZXNzYXJ5LgorICogUGVyaGFwcyBqdXN0IHN0aWNrIHdpdGggYSBzaW5nbGUgZm9yIGxvb3AuCisgKi8KKworLy8gTmVlZHMgdG8gZGVyaXZlIGEgY29tcGlsZSB0aW1lIGNvbnN0YW50IChjb25zdGV4cHIpLiAgQ291bGQgYmUgdGFyZ2V0ZWQgdG8gZ28KKy8vIHRvIGEgTU9OT1ZPTCBtaXh0eXBlIGJhc2VkIG9uIE1BWF9OVU1fVk9MVU1FUywgYnV0IHRoYXQncyBhbiB1bm5lY2Vzc2FyeSBjb21wbGljYXRpb24uCisjZGVmaW5lIE1JWFRZUEVfTU9OT1ZPTChtaXh0eXBlKSAobWl4dHlwZSA9PSBNSVhUWVBFX01VTFRJID8gTUlYVFlQRV9NVUxUSV9NT05PVk9MIDogXAorICAgICAgICBtaXh0eXBlID09IE1JWFRZUEVfTVVMVElfU0FWRU9OTFkgPyBNSVhUWVBFX01VTFRJX1NBVkVPTkxZX01PTk9WT0wgOiBtaXh0eXBlKQorCisvKiBNSVhUWVBFICAgICAoc2VlIEF1ZGlvTWl4ZXJPcHMuaCBNSVhUWVBFXyogZW51bWVyYXRpb24pCisgKiBUTzogaW50MzJfdCAoUTQuMjcpIG9yIGZsb2F0CisgKiBUSTogaW50MzJfdCAoUTQuMjcpIG9yIGludDE2X3QgKFEwLjE1KSBvciBmbG9hdAorICogVEE6IGludDMyX3QgKFE0LjI3KQorICovCit0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsCisgICAgICAgIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVFYsIHR5cGVuYW1lIFRBLCB0eXBlbmFtZSBUQVY+CitzdGF0aWMgdm9pZCB2b2x1bWVSYW1wTXVsdGkodWludDMyX3QgY2hhbm5lbHMsIFRPKiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICBjb25zdCBUSSogaW4sIFRBKiBhdXgsIFRWICp2b2wsIGNvbnN0IFRWICp2b2xpbmMsIFRBViAqdm9sYSwgVEFWIHZvbGFpbmMpCit7CisgICAgc3dpdGNoIChjaGFubmVscykgeworICAgIGNhc2UgMToKKyAgICAgICAgdm9sdW1lUmFtcE11bHRpPE1JWFRZUEUsIDE+KG91dCwgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xpbmMsIHZvbGEsIHZvbGFpbmMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIHZvbHVtZVJhbXBNdWx0aTxNSVhUWVBFLCAyPihvdXQsIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9saW5jLCB2b2xhLCB2b2xhaW5jKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICB2b2x1bWVSYW1wTXVsdGk8TUlYVFlQRV9NT05PVk9MKE1JWFRZUEUpLCAzPihvdXQsCisgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xpbmMsIHZvbGEsIHZvbGFpbmMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICAgIHZvbHVtZVJhbXBNdWx0aTxNSVhUWVBFX01PTk9WT0woTUlYVFlQRSksIDQ+KG91dCwKKyAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBpbiwgYXV4LCB2b2wsIHZvbGluYywgdm9sYSwgdm9sYWluYyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICAgICAgdm9sdW1lUmFtcE11bHRpPE1JWFRZUEVfTU9OT1ZPTChNSVhUWVBFKSwgNT4ob3V0LAorICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9saW5jLCB2b2xhLCB2b2xhaW5jKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA2OgorICAgICAgICB2b2x1bWVSYW1wTXVsdGk8TUlYVFlQRV9NT05PVk9MKE1JWFRZUEUpLCA2PihvdXQsCisgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xpbmMsIHZvbGEsIHZvbGFpbmMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDc6CisgICAgICAgIHZvbHVtZVJhbXBNdWx0aTxNSVhUWVBFX01PTk9WT0woTUlYVFlQRSksIDc+KG91dCwKKyAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBpbiwgYXV4LCB2b2wsIHZvbGluYywgdm9sYSwgdm9sYWluYyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgODoKKyAgICAgICAgdm9sdW1lUmFtcE11bHRpPE1JWFRZUEVfTU9OT1ZPTChNSVhUWVBFKSwgOD4ob3V0LAorICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9saW5jLCB2b2xhLCB2b2xhaW5jKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKiBNSVhUWVBFICAgICAoc2VlIEF1ZGlvTWl4ZXJPcHMuaCBNSVhUWVBFXyogZW51bWVyYXRpb24pCisgKiBUTzogaW50MzJfdCAoUTQuMjcpIG9yIGZsb2F0CisgKiBUSTogaW50MzJfdCAoUTQuMjcpIG9yIGludDE2X3QgKFEwLjE1KSBvciBmbG9hdAorICogVEE6IGludDMyX3QgKFE0LjI3KQorICovCit0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsCisgICAgICAgIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVFYsIHR5cGVuYW1lIFRBLCB0eXBlbmFtZSBUQVY+CitzdGF0aWMgdm9pZCB2b2x1bWVNdWx0aSh1aW50MzJfdCBjaGFubmVscywgVE8qIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgIGNvbnN0IFRJKiBpbiwgVEEqIGF1eCwgY29uc3QgVFYgKnZvbCwgVEFWIHZvbGEpCit7CisgICAgc3dpdGNoIChjaGFubmVscykgeworICAgIGNhc2UgMToKKyAgICAgICAgdm9sdW1lTXVsdGk8TUlYVFlQRSwgMT4ob3V0LCBmcmFtZUNvdW50LCBpbiwgYXV4LCB2b2wsIHZvbGEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIHZvbHVtZU11bHRpPE1JWFRZUEUsIDI+KG91dCwgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xhKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICB2b2x1bWVNdWx0aTxNSVhUWVBFX01PTk9WT0woTUlYVFlQRSksIDM+KG91dCwgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xhKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgICB2b2x1bWVNdWx0aTxNSVhUWVBFX01PTk9WT0woTUlYVFlQRSksIDQ+KG91dCwgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xhKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgICB2b2x1bWVNdWx0aTxNSVhUWVBFX01PTk9WT0woTUlYVFlQRSksIDU+KG91dCwgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xhKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA2OgorICAgICAgICB2b2x1bWVNdWx0aTxNSVhUWVBFX01PTk9WT0woTUlYVFlQRSksIDY+KG91dCwgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xhKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA3OgorICAgICAgICB2b2x1bWVNdWx0aTxNSVhUWVBFX01PTk9WT0woTUlYVFlQRSksIDc+KG91dCwgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xhKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA4OgorICAgICAgICB2b2x1bWVNdWx0aTxNSVhUWVBFX01PTk9WT0woTUlYVFlQRSksIDg+KG91dCwgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xhKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKiBNSVhUWVBFICAgICAoc2VlIEF1ZGlvTWl4ZXJPcHMuaCBNSVhUWVBFXyogZW51bWVyYXRpb24pCisgKiBVU0VGTE9BVFZPTCAoc2V0IHRvIHRydWUgaWYgZmxvYXQgdm9sdW1lIGlzIHVzZWQpCisgKiBBREpVU1RWT0wgICAoc2V0IHRvIHRydWUgaWYgdm9sdW1lIHJhbXAgcGFyYW1ldGVycyBuZWVkcyBhZGp1c3RtZW50IGFmdGVyd2FyZHMpCisgKiBUTzogaW50MzJfdCAoUTQuMjcpIG9yIGZsb2F0CisgKiBUSTogaW50MzJfdCAoUTQuMjcpIG9yIGludDE2X3QgKFEwLjE1KSBvciBmbG9hdAorICogVEE6IGludDMyX3QgKFE0LjI3KQorICovCit0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsIGJvb2wgVVNFRkxPQVRWT0wsIGJvb2wgQURKVVNUVk9MLAorICAgIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVEE+Cit2b2lkIEF1ZGlvTWl4ZXI6OnZvbHVtZU1peChUTyAqb3V0LCBzaXplX3Qgb3V0RnJhbWVzLAorICAgICAgICBjb25zdCBUSSAqaW4sIFRBICphdXgsIGJvb2wgcmFtcCwgQXVkaW9NaXhlcjo6dHJhY2tfdCAqdCkKK3sKKyAgICBpZiAoVVNFRkxPQVRWT0wpIHsKKyAgICAgICAgaWYgKHJhbXApIHsKKyAgICAgICAgICAgIHZvbHVtZVJhbXBNdWx0aTxNSVhUWVBFPih0LT5tTWl4ZXJDaGFubmVsQ291bnQsIG91dCwgb3V0RnJhbWVzLCBpbiwgYXV4LAorICAgICAgICAgICAgICAgICAgICB0LT5tUHJldlZvbHVtZSwgdC0+bVZvbHVtZUluYywgJnQtPnByZXZBdXhMZXZlbCwgdC0+YXV4SW5jKTsKKyAgICAgICAgICAgIGlmIChBREpVU1RWT0wpIHsKKyAgICAgICAgICAgICAgICB0LT5hZGp1c3RWb2x1bWVSYW1wKGF1eCAhPSBOVUxMLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZvbHVtZU11bHRpPE1JWFRZUEU+KHQtPm1NaXhlckNoYW5uZWxDb3VudCwgb3V0LCBvdXRGcmFtZXMsIGluLCBhdXgsCisgICAgICAgICAgICAgICAgICAgIHQtPm1Wb2x1bWUsIHQtPmF1eExldmVsKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChyYW1wKSB7CisgICAgICAgICAgICB2b2x1bWVSYW1wTXVsdGk8TUlYVFlQRT4odC0+bU1peGVyQ2hhbm5lbENvdW50LCBvdXQsIG91dEZyYW1lcywgaW4sIGF1eCwKKyAgICAgICAgICAgICAgICAgICAgdC0+cHJldlZvbHVtZSwgdC0+dm9sdW1lSW5jLCAmdC0+cHJldkF1eExldmVsLCB0LT5hdXhJbmMpOworICAgICAgICAgICAgaWYgKEFESlVTVFZPTCkgeworICAgICAgICAgICAgICAgIHQtPmFkanVzdFZvbHVtZVJhbXAoYXV4ICE9IE5VTEwpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdm9sdW1lTXVsdGk8TUlYVFlQRT4odC0+bU1peGVyQ2hhbm5lbENvdW50LCBvdXQsIG91dEZyYW1lcywgaW4sIGF1eCwKKyAgICAgICAgICAgICAgICAgICAgdC0+dm9sdW1lLCB0LT5hdXhMZXZlbCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIFRoaXMgcHJvY2VzcyBob29rIGlzIGNhbGxlZCB3aGVuIHRoZXJlIGlzIGEgc2luZ2xlIHRyYWNrIHdpdGhvdXQKKyAqIGF1eCBidWZmZXIsIHZvbHVtZSByYW1wLCBvciByZXNhbXBsaW5nLgorICogVE9ETzogVXBkYXRlIHRoZSBob29rIHNlbGVjdGlvbjogdGhpcyBjYW4gcHJvcGVybHkgaGFuZGxlIGF1eCBhbmQgcmFtcC4KKyAqCisgKiBNSVhUWVBFICAgICAoc2VlIEF1ZGlvTWl4ZXJPcHMuaCBNSVhUWVBFXyogZW51bWVyYXRpb24pCisgKiBUTzogaW50MzJfdCAoUTQuMjcpIG9yIGZsb2F0CisgKiBUSTogaW50MzJfdCAoUTQuMjcpIG9yIGludDE2X3QgKFEwLjE1KSBvciBmbG9hdAorICogVEE6IGludDMyX3QgKFE0LjI3KQorICovCit0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVEE+Cit2b2lkIEF1ZGlvTWl4ZXI6OnByb2Nlc3NfTm9SZXNhbXBsZU9uZVRyYWNrKHN0YXRlX3QqIHN0YXRlLCBpbnQ2NF90IHB0cykKK3sKKyAgICBBTE9HVlYoInByb2Nlc3NfTm9SZXNhbXBsZU9uZVRyYWNrXG4iKTsKKyAgICAvLyBDTFogaXMgZmFzdGVyIHRoYW4gQ1RaIG9uIEFSTSwgdGhvdWdoIHJlYWxseSBub3Qgc3VyZSBpZiB0cnVlIGFmdGVyIDMxIC0gY2x6LgorICAgIGNvbnN0IGludCBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KHN0YXRlLT5lbmFibGVkVHJhY2tzKTsKKyAgICBBTE9HX0FTU0VSVCgoMSA8PCBpKSA9PSBzdGF0ZS0+ZW5hYmxlZFRyYWNrcywgIm1vcmUgdGhhbiAxIHRyYWNrIGVuYWJsZWQiKTsKKyAgICB0cmFja190ICp0ID0gJnN0YXRlLT50cmFja3NbaV07CisgICAgY29uc3QgdWludDMyX3QgY2hhbm5lbHMgPSB0LT5tTWl4ZXJDaGFubmVsQ291bnQ7CisgICAgVE8qIG91dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8VE8qPih0LT5tYWluQnVmZmVyKTsKKyAgICBUQSogYXV4ID0gcmVpbnRlcnByZXRfY2FzdDxUQSo+KHQtPmF1eEJ1ZmZlcik7CisgICAgY29uc3QgYm9vbCByYW1wID0gdC0+bmVlZHNSYW1wKCk7CisKKyAgICBmb3IgKHNpemVfdCBudW1GcmFtZXMgPSBzdGF0ZS0+ZnJhbWVDb3VudDsgbnVtRnJhbWVzOyApIHsKKyAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyJiBiKHQtPmJ1ZmZlcik7CisgICAgICAgIC8vIGdldCBpbnB1dCBidWZmZXIKKyAgICAgICAgYi5mcmFtZUNvdW50ID0gbnVtRnJhbWVzOworICAgICAgICBjb25zdCBpbnQ2NF90IG91dHB1dFBUUyA9IGNhbGN1bGF0ZU91dHB1dFBUUygqdCwgcHRzLCBzdGF0ZS0+ZnJhbWVDb3VudCAtIG51bUZyYW1lcyk7CisgICAgICAgIHQtPmJ1ZmZlclByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZiLCBvdXRwdXRQVFMpOworICAgICAgICBjb25zdCBUSSAqaW4gPSByZWludGVycHJldF9jYXN0PFRJKj4oYi5yYXcpOworCisgICAgICAgIC8vIGluID09IE5VTEwgY2FuIGhhcHBlbiBpZiB0aGUgdHJhY2sgd2FzIGZsdXNoZWQganVzdCBhZnRlciBoYXZpbmcKKyAgICAgICAgLy8gYmVlbiBlbmFibGVkIGZvciBtaXhpbmcuCisgICAgICAgIGlmIChpbiA9PSBOVUxMIHx8ICgoKHVpbnRwdHJfdClpbikgJiAzKSkgeworICAgICAgICAgICAgbWVtc2V0KG91dCwgMCwgbnVtRnJhbWVzCisgICAgICAgICAgICAgICAgICAgICogY2hhbm5lbHMgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKHQtPm1NaXhlckZvcm1hdCkpOworICAgICAgICAgICAgQUxPR0VfSUYoKCgodWludHB0cl90KWluKSAmIDMpLCAicHJvY2Vzc19Ob1Jlc2FtcGxlT25lVHJhY2s6IGJ1cyBlcnJvcjogIgorICAgICAgICAgICAgICAgICAgICAiYnVmZmVyICVwIHRyYWNrICVwLCBjaGFubmVscyAlZCwgbmVlZHMgJSN4IiwKKyAgICAgICAgICAgICAgICAgICAgaW4sIHQsIHQtPmNoYW5uZWxDb3VudCwgdC0+bmVlZHMpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgY29uc3Qgc2l6ZV90IG91dEZyYW1lcyA9IGIuZnJhbWVDb3VudDsKKyAgICAgICAgdm9sdW1lTWl4PE1JWFRZUEUsIGlzX3NhbWU8VEksIGZsb2F0Pjo6dmFsdWUsIGZhbHNlPiAoCisgICAgICAgICAgICAgICAgb3V0LCBvdXRGcmFtZXMsIGluLCBhdXgsIHJhbXAsIHQpOworCisgICAgICAgIG91dCArPSBvdXRGcmFtZXMgKiBjaGFubmVsczsKKyAgICAgICAgaWYgKGF1eCAhPSBOVUxMKSB7CisgICAgICAgICAgICBhdXggKz0gY2hhbm5lbHM7CisgICAgICAgIH0KKyAgICAgICAgbnVtRnJhbWVzIC09IGIuZnJhbWVDb3VudDsKKworICAgICAgICAvLyByZWxlYXNlIGJ1ZmZlcgorICAgICAgICB0LT5idWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmYik7CisgICAgfQorICAgIGlmIChyYW1wKSB7CisgICAgICAgIHQtPmFkanVzdFZvbHVtZVJhbXAoYXV4ICE9IE5VTEwsIGlzX3NhbWU8VEksIGZsb2F0Pjo6dmFsdWUpOworICAgIH0KK30KKworLyogVGhpcyB0cmFjayBob29rIGlzIGNhbGxlZCB0byBkbyByZXNhbXBsaW5nIHRoZW4gbWl4aW5nLAorICogcHVsbGluZyBmcm9tIHRoZSB0cmFjaydzIHVwc3RyZWFtIEF1ZGlvQnVmZmVyUHJvdmlkZXIuCisgKgorICogTUlYVFlQRSAgICAgKHNlZSBBdWRpb01peGVyT3BzLmggTUlYVFlQRV8qIGVudW1lcmF0aW9uKQorICogVE86IGludDMyX3QgKFE0LjI3KSBvciBmbG9hdAorICogVEk6IGludDMyX3QgKFE0LjI3KSBvciBpbnQxNl90IChRMC4xNSkgb3IgZmxvYXQKKyAqIFRBOiBpbnQzMl90IChRNC4yNykKKyAqLwordGVtcGxhdGUgPGludCBNSVhUWVBFLCB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRBPgordm9pZCBBdWRpb01peGVyOjp0cmFja19fUmVzYW1wbGUodHJhY2tfdCogdCwgVE8qIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsIFRPKiB0ZW1wLCBUQSogYXV4KQoreworICAgIEFMT0dWVigidHJhY2tfX1Jlc2FtcGxlXG4iKTsKKyAgICB0LT5yZXNhbXBsZXItPnNldFNhbXBsZVJhdGUodC0+c2FtcGxlUmF0ZSk7CisgICAgY29uc3QgYm9vbCByYW1wID0gdC0+bmVlZHNSYW1wKCk7CisgICAgaWYgKHJhbXAgfHwgYXV4ICE9IE5VTEwpIHsKKyAgICAgICAgLy8gaWYgcmFtcDogICAgICAgIHJlc2FtcGxlIHdpdGggdW5pdHkgZ2FpbiB0byB0ZW1wIGJ1ZmZlciBhbmQgc2NhbGUvbWl4IGluIDJuZCBzdGVwLgorICAgICAgICAvLyBpZiBhdXggIT0gTlVMTDogcmVzYW1wbGUgd2l0aCB1bml0eSBnYWluIHRvIHRlbXAgYnVmZmVyIHRoZW4gYXBwbHkgc2VuZCBsZXZlbC4KKworICAgICAgICB0LT5yZXNhbXBsZXItPnNldFZvbHVtZShVTklUWV9HQUlOX0ZMT0FULCBVTklUWV9HQUlOX0ZMT0FUKTsKKyAgICAgICAgbWVtc2V0KHRlbXAsIDAsIG91dEZyYW1lQ291bnQgKiB0LT5tTWl4ZXJDaGFubmVsQ291bnQgKiBzaXplb2YoVE8pKTsKKyAgICAgICAgdC0+cmVzYW1wbGVyLT5yZXNhbXBsZSgoaW50MzJfdCopdGVtcCwgb3V0RnJhbWVDb3VudCwgdC0+YnVmZmVyUHJvdmlkZXIpOworCisgICAgICAgIHZvbHVtZU1peDxNSVhUWVBFLCBpc19zYW1lPFRJLCBmbG9hdD46OnZhbHVlLCB0cnVlPigKKyAgICAgICAgICAgICAgICBvdXQsIG91dEZyYW1lQ291bnQsIHRlbXAsIGF1eCwgcmFtcCwgdCk7CisKKyAgICB9IGVsc2UgeyAvLyBjb25zdGFudCB2b2x1bWUgZ2FpbgorICAgICAgICB0LT5yZXNhbXBsZXItPnNldFZvbHVtZSh0LT5tVm9sdW1lWzBdLCB0LT5tVm9sdW1lWzFdKTsKKyAgICAgICAgdC0+cmVzYW1wbGVyLT5yZXNhbXBsZSgoaW50MzJfdCopb3V0LCBvdXRGcmFtZUNvdW50LCB0LT5idWZmZXJQcm92aWRlcik7CisgICAgfQorfQorCisvKiBUaGlzIHRyYWNrIGhvb2sgaXMgY2FsbGVkIHRvIG1peCBhIHRyYWNrLCB3aGVuIG5vIHJlc2FtcGxpbmcgaXMgcmVxdWlyZWQuCisgKiBUaGUgaW5wdXQgYnVmZmVyIHNob3VsZCBiZSBwcmVzZW50IGluIHQtPmluLgorICoKKyAqIE1JWFRZUEUgICAgIChzZWUgQXVkaW9NaXhlck9wcy5oIE1JWFRZUEVfKiBlbnVtZXJhdGlvbikKKyAqIFRPOiBpbnQzMl90IChRNC4yNykgb3IgZmxvYXQKKyAqIFRJOiBpbnQzMl90IChRNC4yNykgb3IgaW50MTZfdCAoUTAuMTUpIG9yIGZsb2F0CisgKiBUQTogaW50MzJfdCAoUTQuMjcpCisgKi8KK3RlbXBsYXRlIDxpbnQgTUlYVFlQRSwgdHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUQT4KK3ZvaWQgQXVkaW9NaXhlcjo6dHJhY2tfX05vUmVzYW1wbGUodHJhY2tfdCogdCwgVE8qIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgIFRPKiB0ZW1wIF9fdW51c2VkLCBUQSogYXV4KQoreworICAgIEFMT0dWVigidHJhY2tfX05vUmVzYW1wbGVcbiIpOworICAgIGNvbnN0IFRJICppbiA9IHN0YXRpY19jYXN0PGNvbnN0IFRJICo+KHQtPmluKTsKKworICAgIHZvbHVtZU1peDxNSVhUWVBFLCBpc19zYW1lPFRJLCBmbG9hdD46OnZhbHVlLCB0cnVlPigKKyAgICAgICAgICAgIG91dCwgZnJhbWVDb3VudCwgaW4sIGF1eCwgdC0+bmVlZHNSYW1wKCksIHQpOworCisgICAgLy8gTUlYVFlQRV9NT05PRVhQQU5EIHJlYWRzIGEgc2luZ2xlIGlucHV0IGNoYW5uZWwgYW5kIGV4cGFuZHMgdG8gTkNIQU4gb3V0cHV0IGNoYW5uZWxzLgorICAgIC8vIE1JWFRZUEVfTVVMVEkgcmVhZHMgTkNIQU4gaW5wdXQgY2hhbm5lbHMgYW5kIHBsYWNlcyB0byBOQ0hBTiBvdXRwdXQgY2hhbm5lbHMuCisgICAgaW4gKz0gKE1JWFRZUEUgPT0gTUlYVFlQRV9NT05PRVhQQU5EKSA/IGZyYW1lQ291bnQgOiBmcmFtZUNvdW50ICogdC0+bU1peGVyQ2hhbm5lbENvdW50OworICAgIHQtPmluID0gaW47Cit9CisKKy8qIFRoZSBNaXhlciBlbmdpbmUgZ2VuZXJhdGVzIGVpdGhlciBpbnQzMl90IChRNF8yNykgb3IgZmxvYXQgZGF0YS4KKyAqIFdlIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGNvbnZlcnQgdGhlIGVuZ2luZSBidWZmZXJzCisgKiB0byB0aGUgZGVzaXJlZCBtaXhlciBvdXRwdXQgZm9ybWF0LCBlaXRoZXIgaW50MTZfdCAoUS4xNSkgb3IgZmxvYXQuCisgKi8KK3ZvaWQgQXVkaW9NaXhlcjo6Y29udmVydE1peGVyRm9ybWF0KHZvaWQgKm91dCwgYXVkaW9fZm9ybWF0X3QgbWl4ZXJPdXRGb3JtYXQsCisgICAgICAgIHZvaWQgKmluLCBhdWRpb19mb3JtYXRfdCBtaXhlckluRm9ybWF0LCBzaXplX3Qgc2FtcGxlQ291bnQpCit7CisgICAgc3dpdGNoIChtaXhlckluRm9ybWF0KSB7CisgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgorICAgICAgICBzd2l0Y2ggKG1peGVyT3V0Rm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgICAgIG1lbWNweShvdXQsIGluLCBzYW1wbGVDb3VudCAqIHNpemVvZihmbG9hdCkpOyAvLyBNRU1DUFkuIFRPRE8gb3B0aW1pemUgb3V0CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9mbG9hdCgoaW50MTZfdCopb3V0LCAoZmxvYXQqKWluLCBzYW1wbGVDb3VudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCBtaXhlck91dEZvcm1hdDogJSN4IiwgbWl4ZXJPdXRGb3JtYXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgc3dpdGNoIChtaXhlck91dEZvcm1hdCkgeworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CisgICAgICAgICAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9xNF8yNygoZmxvYXQqKW91dCwgKGludDMyX3QqKWluLCBzYW1wbGVDb3VudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgICAgIC8vIHR3byBpbnQxNl90IGFyZSBwcm9kdWNlZCBwZXIgaXRlcmF0aW9uCisgICAgICAgICAgICBkaXRoZXJBbmRDbGFtcCgoaW50MzJfdCopb3V0LCAoaW50MzJfdCopaW4sIHNhbXBsZUNvdW50ID4+IDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJiYWQgbWl4ZXJPdXRGb3JtYXQ6ICUjeCIsIG1peGVyT3V0Rm9ybWF0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCBtaXhlckluRm9ybWF0OiAlI3giLCBtaXhlckluRm9ybWF0KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKiBSZXR1cm5zIHRoZSBwcm9wZXIgdHJhY2sgaG9vayB0byB1c2UgZm9yIG1peGluZyB0aGUgdHJhY2sgaW50byB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAqLworQXVkaW9NaXhlcjo6aG9va190IEF1ZGlvTWl4ZXI6OmdldFRyYWNrSG9vayhpbnQgdHJhY2tUeXBlLCB1aW50MzJfdCBjaGFubmVsQ291bnQsCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IG1peGVySW5Gb3JtYXQsIGF1ZGlvX2Zvcm1hdF90IG1peGVyT3V0Rm9ybWF0IF9fdW51c2VkKQoreworICAgIGlmICgha1VzZU5ld01peGVyICYmIGNoYW5uZWxDb3VudCA9PSBGQ0NfMiAmJiBtaXhlckluRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7CisgICAgICAgIHN3aXRjaCAodHJhY2tUeXBlKSB7CisgICAgICAgIGNhc2UgVFJBQ0tUWVBFX05PUDoKKyAgICAgICAgICAgIHJldHVybiB0cmFja19fbm9wOworICAgICAgICBjYXNlIFRSQUNLVFlQRV9SRVNBTVBMRToKKyAgICAgICAgICAgIHJldHVybiB0cmFja19fZ2VuZXJpY1Jlc2FtcGxlOworICAgICAgICBjYXNlIFRSQUNLVFlQRV9OT1JFU0FNUExFTU9OTzoKKyAgICAgICAgICAgIHJldHVybiB0cmFja19fMTZCaXRzTW9ubzsKKyAgICAgICAgY2FzZSBUUkFDS1RZUEVfTk9SRVNBTVBMRToKKyAgICAgICAgICAgIHJldHVybiB0cmFja19fMTZCaXRzU3RlcmVvOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIHRyYWNrVHlwZTogJWQiLCB0cmFja1R5cGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihjaGFubmVsQ291bnQgPiBNQVhfTlVNX0NIQU5ORUxTKTsKKyAgICBzd2l0Y2ggKHRyYWNrVHlwZSkgeworICAgIGNhc2UgVFJBQ0tUWVBFX05PUDoKKyAgICAgICAgcmV0dXJuIHRyYWNrX19ub3A7CisgICAgY2FzZSBUUkFDS1RZUEVfUkVTQU1QTEU6CisgICAgICAgIHN3aXRjaCAobWl4ZXJJbkZvcm1hdCkgeworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CisgICAgICAgICAgICByZXR1cm4gKEF1ZGlvTWl4ZXI6Omhvb2tfdCkKKyAgICAgICAgICAgICAgICAgICAgdHJhY2tfX1Jlc2FtcGxlPE1JWFRZUEVfTVVMVEksIGZsb2F0IC8qVE8qLywgZmxvYXQgLypUSSovLCBpbnQzMl90IC8qVEEqLz47CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgICAgICByZXR1cm4gKEF1ZGlvTWl4ZXI6Omhvb2tfdClcCisgICAgICAgICAgICAgICAgICAgIHRyYWNrX19SZXNhbXBsZTxNSVhUWVBFX01VTFRJLCBpbnQzMl90LCBpbnQxNl90LCBpbnQzMl90PjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCBtaXhlckluRm9ybWF0OiAlI3giLCBtaXhlckluRm9ybWF0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVFJBQ0tUWVBFX05PUkVTQU1QTEVNT05POgorICAgICAgICBzd2l0Y2ggKG1peGVySW5Gb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgorICAgICAgICAgICAgcmV0dXJuIChBdWRpb01peGVyOjpob29rX3QpCisgICAgICAgICAgICAgICAgICAgIHRyYWNrX19Ob1Jlc2FtcGxlPE1JWFRZUEVfTU9OT0VYUEFORCwgZmxvYXQsIGZsb2F0LCBpbnQzMl90PjsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgICAgIHJldHVybiAoQXVkaW9NaXhlcjo6aG9va190KQorICAgICAgICAgICAgICAgICAgICB0cmFja19fTm9SZXNhbXBsZTxNSVhUWVBFX01PTk9FWFBBTkQsIGludDMyX3QsIGludDE2X3QsIGludDMyX3Q+OworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIG1peGVySW5Gb3JtYXQ6ICUjeCIsIG1peGVySW5Gb3JtYXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUUkFDS1RZUEVfTk9SRVNBTVBMRToKKyAgICAgICAgc3dpdGNoIChtaXhlckluRm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgICAgIHJldHVybiAoQXVkaW9NaXhlcjo6aG9va190KQorICAgICAgICAgICAgICAgICAgICB0cmFja19fTm9SZXNhbXBsZTxNSVhUWVBFX01VTFRJLCBmbG9hdCwgZmxvYXQsIGludDMyX3Q+OworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICAgICAgcmV0dXJuIChBdWRpb01peGVyOjpob29rX3QpCisgICAgICAgICAgICAgICAgICAgIHRyYWNrX19Ob1Jlc2FtcGxlPE1JWFRZUEVfTVVMVEksIGludDMyX3QsIGludDE2X3QsIGludDMyX3Q+OworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIG1peGVySW5Gb3JtYXQ6ICUjeCIsIG1peGVySW5Gb3JtYXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIHRyYWNrVHlwZTogJWQiLCB0cmFja1R5cGUpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIFJldHVybnMgdGhlIHByb3BlciBwcm9jZXNzIGhvb2sgZm9yIG1peGluZyB0cmFja3MuIEN1cnJlbnRseSB3b3JrcyBvbmx5IGZvcgorICogUFJPQ0VTU1RZUEVfTk9SRVNBTVBMRU9ORVRSQUNLLCBhIG1peCBpbnZvbHZpbmcgb25lIHRyYWNrLCBubyByZXNhbXBsaW5nLgorICoKKyAqIFRPRE86IER1ZSB0byB0aGUgc3BlY2lhbCBtaXhpbmcgY29uc2lkZXJhdGlvbnMgb2YgZHVwbGljYXRpbmcgdG8KKyAqIGEgc3RlcmVvIG91dHB1dCB0cmFjaywgdGhlIGlucHV0IHRyYWNrIGNhbm5vdCBiZSBNT05PLiAgVGhpcyBzaG91bGQgYmUKKyAqIHByZXZlbnRlZCBieSB0aGUgY2FsbGVyLgorICovCitBdWRpb01peGVyOjpwcm9jZXNzX2hvb2tfdCBBdWRpb01peGVyOjpnZXRQcm9jZXNzSG9vayhpbnQgcHJvY2Vzc1R5cGUsIHVpbnQzMl90IGNoYW5uZWxDb3VudCwKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgbWl4ZXJJbkZvcm1hdCwgYXVkaW9fZm9ybWF0X3QgbWl4ZXJPdXRGb3JtYXQpCit7CisgICAgaWYgKHByb2Nlc3NUeXBlICE9IFBST0NFU1NUWVBFX05PUkVTQU1QTEVPTkVUUkFDSykgeyAvLyBPbmx5IE5PUkVTQU1QTEVPTkVUUkFDSworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJiYWQgcHJvY2Vzc1R5cGU6ICVkIiwgcHJvY2Vzc1R5cGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCFrVXNlTmV3TWl4ZXIgJiYgY2hhbm5lbENvdW50ID09IEZDQ18yICYmIG1peGVySW5Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKKyAgICAgICAgcmV0dXJuIHByb2Nlc3NfX09uZVRyYWNrMTZCaXRzU3RlcmVvTm9SZXNhbXBsaW5nOworICAgIH0KKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGNoYW5uZWxDb3VudCA+IE1BWF9OVU1fQ0hBTk5FTFMpOworICAgIHN3aXRjaCAobWl4ZXJJbkZvcm1hdCkgeworICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgc3dpdGNoIChtaXhlck91dEZvcm1hdCkgeworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CisgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc19Ob1Jlc2FtcGxlT25lVHJhY2s8TUlYVFlQRV9NVUxUSV9TQVZFT05MWSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgLypUTyovLCBmbG9hdCAvKlRJKi8sIGludDMyX3QgLypUQSovPjsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgICAgIHJldHVybiBwcm9jZXNzX05vUmVzYW1wbGVPbmVUcmFjazxNSVhUWVBFX01VTFRJX1NBVkVPTkxZLAorICAgICAgICAgICAgICAgICAgICBpbnQxNl90LCBmbG9hdCwgaW50MzJfdD47CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJiYWQgbWl4ZXJPdXRGb3JtYXQ6ICUjeCIsIG1peGVyT3V0Rm9ybWF0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgIHN3aXRjaCAobWl4ZXJPdXRGb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgorICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NfTm9SZXNhbXBsZU9uZVRyYWNrPE1JWFRZUEVfTVVMVElfU0FWRU9OTFksCisgICAgICAgICAgICAgICAgICAgIGZsb2F0LCBpbnQxNl90LCBpbnQzMl90PjsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgICAgIHJldHVybiBwcm9jZXNzX05vUmVzYW1wbGVPbmVUcmFjazxNSVhUWVBFX01VTFRJX1NBVkVPTkxZLAorICAgICAgICAgICAgICAgICAgICBpbnQxNl90LCBpbnQxNl90LCBpbnQzMl90PjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCBtaXhlck91dEZvcm1hdDogJSN4IiwgbWl4ZXJPdXRGb3JtYXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIG1peGVySW5Gb3JtYXQ6ICUjeCIsIG1peGVySW5Gb3JtYXQpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5oCmluZGV4IDQzYWViODYuLjNiOTcyYmIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuaApAQCAtMjYsMTAgKzI2LDEzIEBACiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oPgogI2luY2x1ZGUgIkF1ZGlvUmVzYW1wbGVyLmgiCiAKLSNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9kb3dubWl4Lmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fZWZmZWN0Lmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJMb2cuaD4KIAorLy8gRklYTUUgVGhpcyBpcyBhY3R1YWxseSB1bml0eSBnYWluLCB3aGljaCBtaWdodCBub3QgYmUgbWF4IGluIGZ1dHVyZSwgZXhwcmVzc2VkIGluIFUuMTIKKyNkZWZpbmUgTUFYX0dBSU5fSU5UIEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU5fSU5UCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNDgsMTQgKzUxLDE0IEBACiAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IE1BWF9OVU1fVFJBQ0tTID0gMzI7CiAgICAgLy8gbWF4aW11bSBudW1iZXIgb2YgY2hhbm5lbHMgc3VwcG9ydGVkIGJ5IHRoZSBtaXhlcgogCi0gICAgLy8gVGhpcyBtaXhlciBoYXMgYSBoYXJkLWNvZGVkIHVwcGVyIGxpbWl0IG9mIDIgY2hhbm5lbHMgZm9yIG91dHB1dC4KLSAgICAvLyBUaGVyZSBpcyBzdXBwb3J0IGZvciA+IDIgY2hhbm5lbCB0cmFja3MgZG93bi1taXhlZCB0byAyIGNoYW5uZWwgb3V0cHV0IHZpYSBhIGRvd24tbWl4IGVmZmVjdC4KLSAgICAvLyBBZGRpbmcgc3VwcG9ydCBmb3IgPiAyIGNoYW5uZWwgb3V0cHV0IHdvdWxkIHJlcXVpcmUgbW9yZSB0aGFuIHNpbXBseSBjaGFuZ2luZyB0aGlzIHZhbHVlLgotICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBNQVhfTlVNX0NIQU5ORUxTID0gMjsKKyAgICAvLyBUaGlzIG1peGVyIGhhcyBhIGhhcmQtY29kZWQgdXBwZXIgbGltaXQgb2YgOCBjaGFubmVscyBmb3Igb3V0cHV0LgorICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBNQVhfTlVNX0NIQU5ORUxTID0gODsKKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgTUFYX05VTV9WT0xVTUVTID0gMjsgLy8gc3RlcmVvIHZvbHVtZSBvbmx5CiAgICAgLy8gbWF4aW11bSBudW1iZXIgb2YgY2hhbm5lbHMgc3VwcG9ydGVkIGZvciB0aGUgY29udGVudAotICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBNQVhfTlVNX0NIQU5ORUxTX1RPX0RPV05NSVggPSA4OworICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBNQVhfTlVNX0NIQU5ORUxTX1RPX0RPV05NSVggPSBBVURJT19DSEFOTkVMX0NPVU5UX01BWDsKIAotICAgIHN0YXRpYyBjb25zdCB1aW50MTZfdCBVTklUWV9HQUlOID0gMHgxMDAwOworICAgIHN0YXRpYyBjb25zdCB1aW50MTZfdCBVTklUWV9HQUlOX0lOVCA9IDB4MTAwMDsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgICAgVU5JVFlfR0FJTl9GTE9BVCA9IDEuMGY7CiAKICAgICBlbnVtIHsgLy8gbmFtZXMKIApAQCAtNzcsNiArODAsOCBAQAogICAgICAgICBNQUlOX0JVRkZFUiAgICAgPSAweDQwMDIsCiAgICAgICAgIEFVWF9CVUZGRVIgICAgICA9IDB4NDAwMywKICAgICAgICAgRE9XTk1JWF9UWVBFICAgID0gMFg0MDA0LAorICAgICAgICBNSVhFUl9GT1JNQVQgICAgPSAweDQwMDUsIC8vIEFVRElPX0ZPUk1BVF9QQ01fKEZMT0FUfDE2X0JJVCkKKyAgICAgICAgTUlYRVJfQ0hBTk5FTF9NQVNLID0gMHg0MDA2LCAvLyBDaGFubmVsIG1hc2sgZm9yIG1peGVyIG91dHB1dAogICAgICAgICAvLyBmb3IgdGFyZ2V0IFJFU0FNUExFCiAgICAgICAgIFNBTVBMRV9SQVRFICAgICA9IDB4NDEwMCwgLy8gQ29uZmlndXJlIHNhbXBsZSByYXRlIGNvbnZlcnNpb24gb24gdGhpcyB0cmFjayBuYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhcmFtZXRlciAndmFsdWUnIGlzIHRoZSBuZXcgc2FtcGxlIHJhdGUgaW4gSHouCkBAIC05MCw2ICs5NSw3IEBACiAgICAgICAgIFJFTU9WRSAgICAgICAgICA9IDB4NDEwMiwgLy8gUmVtb3ZlIHRoZSBzYW1wbGUgcmF0ZSBjb252ZXJ0ZXIgb24gdGhpcyB0cmFjayBuYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0cmFjayBpcyByZXN0b3JlZCB0byB0aGUgbWl4IHNhbXBsZSByYXRlLgogICAgICAgICAvLyBmb3IgdGFyZ2V0IFJBTVBfVk9MVU1FIGFuZCBWT0xVTUUgKDggY2hhbm5lbHMgbWF4KQorICAgICAgICAvLyBGSVhNRSB1c2UgZmxvYXQgZm9yIHRoZXNlIDMgdG8gaW1wcm92ZSB0aGUgZHluYW1pYyByYW5nZQogICAgICAgICBWT0xVTUUwICAgICAgICAgPSAweDQyMDAsCiAgICAgICAgIFZPTFVNRTEgICAgICAgICA9IDB4NDIwMSwKICAgICAgICAgQVVYTEVWRUwgICAgICAgID0gMHg0MjEwLApAQCAtOTksNyArMTA1LDEwIEBACiAgICAgLy8gRm9yIGFsbCBBUElzIHdpdGggIm5hbWUiOiBUUkFDSzAgPD0gbmFtZSA8IFRSQUNLMCArIE1BWF9OVU1fVFJBQ0tTCiAKICAgICAvLyBBbGxvY2F0ZSBhIHRyYWNrIG5hbWUuICBSZXR1cm5zIG5ldyB0cmFjayBuYW1lIGlmIHN1Y2Nlc3NmdWwsIC0xIG9uIGZhaWx1cmUuCi0gICAgaW50ICAgICAgICAgZ2V0VHJhY2tOYW1lKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBpbnQgc2Vzc2lvbklkKTsKKyAgICAvLyBUaGUgZmFpbHVyZSBjb3VsZCBiZSBiZWNhdXNlIG9mIGFuIGludmFsaWQgY2hhbm5lbE1hc2sgb3IgZm9ybWF0LCBvciB0aGF0CisgICAgLy8gdGhlIHRyYWNrIGNhcGFjaXR5IG9mIHRoZSBtaXhlciBpcyBleGNlZWRlZC4KKyAgICBpbnQgICAgICAgICBnZXRUcmFja05hbWUoYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50IHNlc3Npb25JZCk7CiAKICAgICAvLyBGcmVlIGFuIGFsbG9jYXRlZCB0cmFjayBieSBuYW1lCiAgICAgdm9pZCAgICAgICAgZGVsZXRlVHJhY2tOYW1lKGludCBuYW1lKTsKQEAgLTExNywzNSArMTI2LDM0IEBACiAKICAgICBzaXplX3QgICAgICBnZXRVbnJlbGVhc2VkRnJhbWVzKGludCBuYW1lKSBjb25zdDsKIAorICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc1ZhbGlkUGNtVHJhY2tGb3JtYXQoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7CisgICAgICAgIHJldHVybiBmb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgfHwKKyAgICAgICAgICAgICAgICBmb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEIHx8CisgICAgICAgICAgICAgICAgZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMzJfQklUIHx8CisgICAgICAgICAgICAgICAgZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisgICAgfQorCiBwcml2YXRlOgogCiAgICAgZW51bSB7CisgICAgICAgIC8vIEZJWE1FIHRoaXMgcmVwcmVzZW50YXRpb24gcGVybWl0cyB1cCB0byA4IGNoYW5uZWxzCiAgICAgICAgIE5FRURTX0NIQU5ORUxfQ09VTlRfX01BU0sgICA9IDB4MDAwMDAwMDcsCi0gICAgICAgIE5FRURTX0ZPUk1BVF9fTUFTSyAgICAgICAgICA9IDB4MDAwMDAwRjAsCi0gICAgICAgIE5FRURTX01VVEVfX01BU0sgICAgICAgICAgICA9IDB4MDAwMDAxMDAsCi0gICAgICAgIE5FRURTX1JFU0FNUExFX19NQVNLICAgICAgICA9IDB4MDAwMDEwMDAsCi0gICAgICAgIE5FRURTX0FVWF9fTUFTSyAgICAgICAgICAgICA9IDB4MDAwMTAwMDAsCiAgICAgfTsKIAogICAgIGVudW0gewotICAgICAgICBORUVEU19DSEFOTkVMXzEgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAotICAgICAgICBORUVEU19DSEFOTkVMXzIgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICAgICAgICBORUVEU19DSEFOTkVMXzEgICAgICAgICAgICAgPSAweDAwMDAwMDAwLCAgIC8vIG1vbm8KKyAgICAgICAgTkVFRFNfQ0hBTk5FTF8yICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwgICAvLyBzdGVyZW8KIAotICAgICAgICBORUVEU19GT1JNQVRfMTYgICAgICAgICAgICAgPSAweDAwMDAwMDEwLAorICAgICAgICAvLyBzYW1wbGUgZm9ybWF0IGlzIG5vdCBleHBsaWNpdGx5IHNwZWNpZmllZCwgYW5kIGlzIGFzc3VtZWQgdG8gYmUgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQKIAotICAgICAgICBORUVEU19NVVRFX0RJU0FCTEVEICAgICAgICAgPSAweDAwMDAwMDAwLAotICAgICAgICBORUVEU19NVVRFX0VOQUJMRUQgICAgICAgICAgPSAweDAwMDAwMTAwLAotCi0gICAgICAgIE5FRURTX1JFU0FNUExFX0RJU0FCTEVEICAgICA9IDB4MDAwMDAwMDAsCi0gICAgICAgIE5FRURTX1JFU0FNUExFX0VOQUJMRUQgICAgICA9IDB4MDAwMDEwMDAsCi0KLSAgICAgICAgTkVFRFNfQVVYX0RJU0FCTEVEICAgICA9IDB4MDAwMDAwMDAsCi0gICAgICAgIE5FRURTX0FVWF9FTkFCTEVEICAgICAgPSAweDAwMDEwMDAwLAorICAgICAgICBORUVEU19NVVRFICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMTAwLAorICAgICAgICBORUVEU19SRVNBTVBMRSAgICAgICAgICAgICAgPSAweDAwMDAxMDAwLAorICAgICAgICBORUVEU19BVVggICAgICAgICAgICAgICAgICAgPSAweDAwMDEwMDAwLAogICAgIH07CiAKICAgICBzdHJ1Y3Qgc3RhdGVfdDsKICAgICBzdHJ1Y3QgdHJhY2tfdDsKLSAgICBjbGFzcyBEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjsKKyAgICBjbGFzcyBDb3B5QnVmZmVyUHJvdmlkZXI7CiAKICAgICB0eXBlZGVmIHZvaWQgKCpob29rX3QpKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dHB1dCwgc2l6ZV90IG51bU91dEZyYW1lcywgaW50MzJfdCogdGVtcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGF1eCk7CkBAIC0xNTQsMTYgKzE2MiwxNyBAQAogICAgIHN0cnVjdCB0cmFja190IHsKICAgICAgICAgdWludDMyX3QgICAgbmVlZHM7CiAKKyAgICAgICAgLy8gVE9ETzogRXZlbnR1YWxseSByZW1vdmUgbGVnYWN5IGludGVnZXIgdm9sdW1lIHNldHRpbmdzCiAgICAgICAgIHVuaW9uIHsKLSAgICAgICAgaW50MTZfdCAgICAgdm9sdW1lW01BWF9OVU1fQ0hBTk5FTFNdOyAvLyBbMF0zLjEyIGZpeGVkIHBvaW50CisgICAgICAgIGludDE2X3QgICAgIHZvbHVtZVtNQVhfTlVNX1ZPTFVNRVNdOyAvLyBVNC4xMiBmaXhlZCBwb2ludCAodG9wIGJpdCBzaG91bGQgYmUgemVybykKICAgICAgICAgaW50MzJfdCAgICAgdm9sdW1lUkw7CiAgICAgICAgIH07CiAKLSAgICAgICAgaW50MzJfdCAgICAgcHJldlZvbHVtZVtNQVhfTlVNX0NIQU5ORUxTXTsKKyAgICAgICAgaW50MzJfdCAgICAgcHJldlZvbHVtZVtNQVhfTlVNX1ZPTFVNRVNdOwogCiAgICAgICAgIC8vIDE2LWJ5dGUgYm91bmRhcnkKIAotICAgICAgICBpbnQzMl90ICAgICB2b2x1bWVJbmNbTUFYX05VTV9DSEFOTkVMU107CisgICAgICAgIGludDMyX3QgICAgIHZvbHVtZUluY1tNQVhfTlVNX1ZPTFVNRVNdOwogICAgICAgICBpbnQzMl90ICAgICBhdXhJbmM7CiAgICAgICAgIGludDMyX3QgICAgIHByZXZBdXhMZXZlbDsKIApAQCAtMTczLDcgKzE4Miw3IEBACiAgICAgICAgIHVpbnQxNl90ICAgIGZyYW1lQ291bnQ7CiAKICAgICAgICAgdWludDhfdCAgICAgY2hhbm5lbENvdW50OyAgIC8vIDEgb3IgMiwgcmVkdW5kYW50IHdpdGggKG5lZWRzICYgTkVFRFNfQ0hBTk5FTF9DT1VOVF9fTUFTSykKLSAgICAgICAgdWludDhfdCAgICAgZm9ybWF0OyAgICAgICAgIC8vIGFsd2F5cyAxNgorICAgICAgICB1aW50OF90ICAgICB1bnVzZWRfcGFkZGluZzsgLy8gZm9ybWVybHkgZm9ybWF0LCB3YXMgYWx3YXlzIDE2CiAgICAgICAgIHVpbnQxNl90ICAgIGVuYWJsZWQ7ICAgICAgICAvLyBhY3R1YWxseSBib29sCiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrOwogCkBAIC0xOTYsNDggKzIwNSwxNTkgQEAKICAgICAgICAgaW50MzJfdCogICAgICAgICAgIGF1eEJ1ZmZlcjsKIAogICAgICAgICAvLyAxNi1ieXRlIGJvdW5kYXJ5Ci0KLSAgICAgICAgRG93bm1peGVyQnVmZmVyUHJvdmlkZXIqIGRvd25taXhlckJ1ZmZlclByb3ZpZGVyOyAvLyA0IGJ5dGVzCisgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqICAgICBtSW5wdXRCdWZmZXJQcm92aWRlcjsgICAgLy8gZXh0ZXJuYWxseSBwcm92aWRlZCBidWZmZXIgcHJvdmlkZXIuCisgICAgICAgIENvcHlCdWZmZXJQcm92aWRlciogICAgICBtUmVmb3JtYXRCdWZmZXJQcm92aWRlcjsgLy8gcHJvdmlkZXIgd3JhcHBlciBmb3IgcmVmb3JtYXR0aW5nLgorICAgICAgICBDb3B5QnVmZmVyUHJvdmlkZXIqICAgICAgZG93bm1peGVyQnVmZmVyUHJvdmlkZXI7IC8vIHdyYXBwZXIgZm9yIGNoYW5uZWwgY29udmVyc2lvbi4KIAogICAgICAgICBpbnQzMl90ICAgICBzZXNzaW9uSWQ7CiAKLSAgICAgICAgaW50MzJfdCAgICAgcGFkZGluZ1syXTsKKyAgICAgICAgLy8gMTYtYnl0ZSBib3VuZGFyeQorICAgICAgICBhdWRpb19mb3JtYXRfdCBtTWl4ZXJGb3JtYXQ7ICAgICAvLyBvdXRwdXQgbWl4IGZvcm1hdDogQVVESU9fRk9STUFUX1BDTV8oRkxPQVR8MTZfQklUKQorICAgICAgICBhdWRpb19mb3JtYXRfdCBtRm9ybWF0OyAgICAgICAgICAvLyBpbnB1dCB0cmFjayBmb3JtYXQKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgbU1peGVySW5Gb3JtYXQ7ICAgLy8gbWl4IGludGVybmFsIGZvcm1hdCBBVURJT19GT1JNQVRfUENNXyhGTE9BVHwxNl9CSVQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVhY2ggdHJhY2sgbXVzdCBiZSBjb252ZXJ0ZWQgdG8gdGhpcyBmb3JtYXQuCisKKyAgICAgICAgZmxvYXQgICAgICAgICAgbVZvbHVtZVtNQVhfTlVNX1ZPTFVNRVNdOyAgICAgLy8gZmxvYXRpbmcgcG9pbnQgc2V0IHZvbHVtZQorICAgICAgICBmbG9hdCAgICAgICAgICBtUHJldlZvbHVtZVtNQVhfTlVNX1ZPTFVNRVNdOyAvLyBmbG9hdGluZyBwb2ludCBwcmV2aW91cyB2b2x1bWUKKyAgICAgICAgZmxvYXQgICAgICAgICAgbVZvbHVtZUluY1tNQVhfTlVNX1ZPTFVNRVNdOyAgLy8gZmxvYXRpbmcgcG9pbnQgdm9sdW1lIGluY3JlbWVudAorCisgICAgICAgIGZsb2F0ICAgICAgICAgIG1BdXhMZXZlbDsgICAgICAgICAgICAgICAgICAgICAvLyBmbG9hdGluZyBwb2ludCBzZXQgYXV4IGxldmVsCisgICAgICAgIGZsb2F0ICAgICAgICAgIG1QcmV2QXV4TGV2ZWw7ICAgICAgICAgICAgICAgICAvLyBmbG9hdGluZyBwb2ludCBwcmV2IGF1eCBsZXZlbAorICAgICAgICBmbG9hdCAgICAgICAgICBtQXV4SW5jOyAgICAgICAgICAgICAgICAgICAgICAgLy8gZmxvYXRpbmcgcG9pbnQgYXV4IGluY3JlbWVudAogCiAgICAgICAgIC8vIDE2LWJ5dGUgYm91bmRhcnkKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbU1peGVyQ2hhbm5lbE1hc2s7CisgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgIG1NaXhlckNoYW5uZWxDb3VudDsKIAotICAgICAgICBib29sICAgICAgICBzZXRSZXNhbXBsZXIodWludDMyX3Qgc2FtcGxlUmF0ZSwgdWludDMyX3QgZGV2U2FtcGxlUmF0ZSk7CisgICAgICAgIGJvb2wgICAgICAgIG5lZWRzUmFtcCgpIHsgcmV0dXJuICh2b2x1bWVJbmNbMF0gfCB2b2x1bWVJbmNbMV0gfCBhdXhJbmMpICE9IDA7IH0KKyAgICAgICAgYm9vbCAgICAgICAgc2V0UmVzYW1wbGVyKHVpbnQzMl90IHRyYWNrU2FtcGxlUmF0ZSwgdWludDMyX3QgZGV2U2FtcGxlUmF0ZSk7CiAgICAgICAgIGJvb2wgICAgICAgIGRvZXNSZXNhbXBsZSgpIGNvbnN0IHsgcmV0dXJuIHJlc2FtcGxlciAhPSBOVUxMOyB9CiAgICAgICAgIHZvaWQgICAgICAgIHJlc2V0UmVzYW1wbGVyKCkgeyBpZiAocmVzYW1wbGVyICE9IE5VTEwpIHJlc2FtcGxlci0+cmVzZXQoKTsgfQotICAgICAgICB2b2lkICAgICAgICBhZGp1c3RWb2x1bWVSYW1wKGJvb2wgYXV4KTsKKyAgICAgICAgdm9pZCAgICAgICAgYWRqdXN0Vm9sdW1lUmFtcChib29sIGF1eCwgYm9vbCB1c2VGbG9hdCA9IGZhbHNlKTsKICAgICAgICAgc2l6ZV90ICAgICAgZ2V0VW5yZWxlYXNlZEZyYW1lcygpIGNvbnN0IHsgcmV0dXJuIHJlc2FtcGxlciAhPSBOVUxMID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNhbXBsZXItPmdldFVucmVsZWFzZWRGcmFtZXMoKSA6IDA7IH07CiAgICAgfTsKIAorICAgIHR5cGVkZWYgdm9pZCAoKnByb2Nlc3NfaG9va190KShzdGF0ZV90KiBzdGF0ZSwgaW50NjRfdCBwdHMpOworCiAgICAgLy8gcGFkIHRvIDMyLWJ5dGVzIHRvIGZpbGwgY2FjaGUgbGluZQogICAgIHN0cnVjdCBzdGF0ZV90IHsKICAgICAgICAgdWludDMyX3QgICAgICAgIGVuYWJsZWRUcmFja3M7CiAgICAgICAgIHVpbnQzMl90ICAgICAgICBuZWVkc0NoYW5nZWQ7CiAgICAgICAgIHNpemVfdCAgICAgICAgICBmcmFtZUNvdW50OwotICAgICAgICB2b2lkICAgICAgICAgICAgKCpob29rKShzdGF0ZV90KiBzdGF0ZSwgaW50NjRfdCBwdHMpOyAgIC8vIG9uZSBvZiBwcm9jZXNzX18qLCBuZXZlciBOVUxMCisgICAgICAgIHByb2Nlc3NfaG9va190ICBob29rOyAgIC8vIG9uZSBvZiBwcm9jZXNzX18qLCBuZXZlciBOVUxMCiAgICAgICAgIGludDMyX3QgICAgICAgICAqb3V0cHV0VGVtcDsKICAgICAgICAgaW50MzJfdCAgICAgICAgICpyZXNhbXBsZVRlbXA7CiAgICAgICAgIE5CTG9nOjpXcml0ZXIqICBtTG9nOwogICAgICAgICBpbnQzMl90ICAgICAgICAgcmVzZXJ2ZWRbMV07CiAgICAgICAgIC8vIEZJWE1FIGFsbG9jYXRlIGR5bmFtaWNhbGx5IHRvIHNhdmUgc29tZSBtZW1vcnkgd2hlbiBtYXhOdW1UcmFja3MgPCBNQVhfTlVNX1RSQUNLUwotICAgICAgICB0cmFja190ICAgICAgICAgdHJhY2tzW01BWF9OVU1fVFJBQ0tTXTsgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgzMikpKTsKKyAgICAgICAgdHJhY2tfdCAgICAgICAgIHRyYWNrc1tNQVhfTlVNX1RSQUNLU10gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgzMikpKTsKICAgICB9OwogCi0gICAgLy8gQXVkaW9CdWZmZXJQcm92aWRlciB0aGF0IHdyYXBzIGEgdHJhY2sgQXVkaW9CdWZmZXJQcm92aWRlciBieSBhIGNhbGwgdG8gYSBkb3dubWl4IGVmZmVjdAotICAgIGNsYXNzIERvd25taXhlckJ1ZmZlclByb3ZpZGVyIDogcHVibGljIEF1ZGlvQnVmZmVyUHJvdmlkZXIgeworICAgIC8vIEJhc2UgQXVkaW9CdWZmZXJQcm92aWRlciBjbGFzcyB1c2VkIGZvciBEb3duTWl4ZXJCdWZmZXJQcm92aWRlciwgUmVtaXhCdWZmZXJQcm92aWRlciwKKyAgICAvLyBhbmQgUmVmb3JtYXRCdWZmZXJQcm92aWRlci4KKyAgICAvLyBJdCBoYW5kbGVzIGEgcHJpdmF0ZSBidWZmZXIgZm9yIHVzZSBpbiBjb252ZXJ0aW5nIGZvcm1hdCBvciBjaGFubmVsIG1hc2tzIGZyb20gdGhlCisgICAgLy8gaW5wdXQgZGF0YSB0byBhIGZvcm0gYWNjZXB0YWJsZSBieSB0aGUgbWl4ZXIuCisgICAgLy8gVE9ETzogTWFrZSBhIFJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyIHdoZW4gaW50ZWdlcnMgYXJlIGVudGlyZWx5IHJlbW92ZWQgZnJvbSB0aGUKKyAgICAvLyBwcm9jZXNzaW5nIHBpcGVsaW5lLgorICAgIGNsYXNzIENvcHlCdWZmZXJQcm92aWRlciA6IHB1YmxpYyBBdWRpb0J1ZmZlclByb3ZpZGVyIHsKICAgICBwdWJsaWM6CisgICAgICAgIC8vIFVzZSBhIHByaXZhdGUgYnVmZmVyIG9mIGJ1ZmZlckZyYW1lQ291bnQgZnJhbWVzIChlYWNoIGZyYW1lIGlzIG91dHB1dEZyYW1lU2l6ZSBieXRlcykuCisgICAgICAgIC8vIElmIGJ1ZmZlckZyYW1lQ291bnQgaXMgMCwgbm8gcHJpdmF0ZSBidWZmZXIgaXMgY3JlYXRlZCBhbmQgaW4tcGxhY2UgbW9kaWZpY2F0aW9uIG9mCisgICAgICAgIC8vIHRoZSB1cHN0cmVhbSBidWZmZXIgcHJvdmlkZXIncyBidWZmZXJzIGlzIHBlcmZvcm1lZCBieSBjb3B5RnJhbWVzKCkuCisgICAgICAgIENvcHlCdWZmZXJQcm92aWRlcihzaXplX3QgaW5wdXRGcmFtZVNpemUsIHNpemVfdCBvdXRwdXRGcmFtZVNpemUsCisgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlckZyYW1lQ291bnQpOworICAgICAgICB2aXJ0dWFsIH5Db3B5QnVmZmVyUHJvdmlkZXIoKTsKKworICAgICAgICAvLyBPdmVycmlkZXMgQXVkaW9CdWZmZXJQcm92aWRlciBtZXRob2RzCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dEJ1ZmZlcihCdWZmZXIqIGJ1ZmZlciwgaW50NjRfdCBwdHMpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUJ1ZmZlcihCdWZmZXIqIGJ1ZmZlcik7Ci0gICAgICAgIERvd25taXhlckJ1ZmZlclByb3ZpZGVyKCk7Ci0gICAgICAgIHZpcnR1YWwgfkRvd25taXhlckJ1ZmZlclByb3ZpZGVyKCk7CiAKKyAgICAgICAgLy8gT3RoZXIgcHVibGljIG1ldGhvZHMKKworICAgICAgICAvLyBjYWxsIHRoaXMgdG8gcmVsZWFzZSB0aGUgYnVmZmVyIHRvIHRoZSB1cHN0cmVhbSBwcm92aWRlci4KKyAgICAgICAgLy8gdHJlYXQgaXQgYXMgYW4gYXVkaW8gZGlzY29udGludWl0eSBmb3IgZnV0dXJlIHNhbXBsZXMuCisgICAgICAgIHZpcnR1YWwgdm9pZCByZXNldCgpOworCisgICAgICAgIC8vIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHN1cHBsaWVkIGJ5IHRoZSBkZXJpdmVkIGNsYXNzLiAgSXQgY29udmVydHMKKyAgICAgICAgLy8gI2ZyYW1lcyBpbiB0aGUgKnNyYyBwb2ludGVyIHRvIHRoZSAqZHN0IHBvaW50ZXIuICBJdCBpcyBwdWJsaWMgYmVjYXVzZQorICAgICAgICAvLyBzb21lIHByb3ZpZGVycyB3aWxsIGFsbG93IHRoaXMgdG8gd29yayBvbiBhcmJpdHJhcnkgYnVmZmVycyBvdXRzaWRlCisgICAgICAgIC8vIG9mIHRoZSBpbnRlcm5hbCBidWZmZXJzLgorICAgICAgICB2aXJ0dWFsIHZvaWQgY29weUZyYW1lcyh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcykgPSAwOworCisgICAgICAgIC8vIHNldCB0aGUgdXBzdHJlYW0gYnVmZmVyIHByb3ZpZGVyLiBDb25zaWRlciBjYWxsaW5nICJyZXNldCIgYmVmb3JlIHRoaXMgZnVuY3Rpb24uCisgICAgICAgIHZvaWQgc2V0QnVmZmVyUHJvdmlkZXIoQXVkaW9CdWZmZXJQcm92aWRlciAqcCkgeworICAgICAgICAgICAgbVRyYWNrQnVmZmVyUHJvdmlkZXIgPSBwOworICAgICAgICB9CisKKyAgICBwcm90ZWN0ZWQ6CiAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIG1UcmFja0J1ZmZlclByb3ZpZGVyOworICAgICAgICBjb25zdCBzaXplX3QgICAgICAgICBtSW5wdXRGcmFtZVNpemU7CisgICAgICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1PdXRwdXRGcmFtZVNpemU7CisgICAgcHJpdmF0ZToKKyAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyIG1CdWZmZXI7CisgICAgICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1Mb2NhbEJ1ZmZlckZyYW1lQ291bnQ7CisgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgIG1Mb2NhbEJ1ZmZlckRhdGE7CisgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgIG1Db25zdW1lZDsKKyAgICB9OworCisgICAgLy8gRG93bm1peGVyQnVmZmVyUHJvdmlkZXIgd3JhcHMgYSB0cmFjayBBdWRpb0J1ZmZlclByb3ZpZGVyIHRvIHByb3ZpZGUKKyAgICAvLyBwb3NpdGlvbiBkZXBlbmRlbnQgZG93bm1peGluZyBieSBhbiBBdWRpbyBFZmZlY3QuCisgICAgY2xhc3MgRG93bm1peGVyQnVmZmVyUHJvdmlkZXIgOiBwdWJsaWMgQ29weUJ1ZmZlclByb3ZpZGVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIERvd25taXhlckJ1ZmZlclByb3ZpZGVyKGF1ZGlvX2NoYW5uZWxfbWFza190IGlucHV0Q2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgb3V0cHV0Q2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IHNlc3Npb25JZCwgc2l6ZV90IGJ1ZmZlckZyYW1lQ291bnQpOworICAgICAgICB2aXJ0dWFsIH5Eb3dubWl4ZXJCdWZmZXJQcm92aWRlcigpOworICAgICAgICB2aXJ0dWFsIHZvaWQgY29weUZyYW1lcyh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcyk7CisgICAgICAgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIG1Eb3dubWl4SGFuZGxlICE9IE5VTEw7IH0KKworICAgICAgICBzdGF0aWMgc3RhdHVzX3QgaW5pdCgpOworICAgICAgICBzdGF0aWMgYm9vbCBpc011bHRpY2hhbm5lbENhcGFibGUoKSB7IHJldHVybiBzSXNNdWx0aWNoYW5uZWxDYXBhYmxlOyB9CisKKyAgICBwcm90ZWN0ZWQ6CiAgICAgICAgIGVmZmVjdF9oYW5kbGVfdCAgICBtRG93bm1peEhhbmRsZTsKICAgICAgICAgZWZmZWN0X2NvbmZpZ190ICAgIG1Eb3dubWl4Q29uZmlnOworCisgICAgICAgIC8vIGVmZmVjdCBkZXNjcmlwdG9yIGZvciB0aGUgZG93bm1peGVyIHVzZWQgYnkgdGhlIG1peGVyCisgICAgICAgIHN0YXRpYyBlZmZlY3RfZGVzY3JpcHRvcl90IHNEd25tRnhEZXNjOworICAgICAgICAvLyBpbmRpY2F0ZXMgd2hldGhlciBhIGRvd25taXggZWZmZWN0IGhhcyBiZWVuIGZvdW5kIGFuZCBpcyB1c2FibGUgYnkgdGhpcyBtaXhlcgorICAgICAgICBzdGF0aWMgYm9vbCAgICAgICAgICAgICAgICBzSXNNdWx0aWNoYW5uZWxDYXBhYmxlOworICAgICAgICAvLyBGSVhNRTogc2hvdWxkIHdlIGFsbG93IGVmZmVjdHMgb3V0c2lkZSBvZiB0aGUgZnJhbWV3b3JrPworICAgICAgICAvLyBXZSBuZWVkIHRvIGhlcmUuIEEgc3BlY2lhbCBpb0lkIHRoYXQgbXVzdCBiZSA8PSAtMiBzbyBpdCBkb2VzIG5vdCBtYXAgdG8gYSBzZXNzaW9uLgorICAgICAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBTRVNTSU9OX0lEX0lOVkFMSURfQU5EX0lHTk9SRUQgPSAtMjsKKyAgICB9OworCisgICAgLy8gUmVtaXhCdWZmZXJQcm92aWRlciB3cmFwcyBhIHRyYWNrIEF1ZGlvQnVmZmVyUHJvdmlkZXIgdG8gcGVyZm9ybSBhbgorICAgIC8vIHVwbWl4IG9yIGRvd25taXggdG8gdGhlIHByb3BlciBjaGFubmVsIGNvdW50IGFuZCBtYXNrLgorICAgIGNsYXNzIFJlbWl4QnVmZmVyUHJvdmlkZXIgOiBwdWJsaWMgQ29weUJ1ZmZlclByb3ZpZGVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFJlbWl4QnVmZmVyUHJvdmlkZXIoYXVkaW9fY2hhbm5lbF9tYXNrX3QgaW5wdXRDaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBvdXRwdXRDaGFubmVsTWFzaywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJGcmFtZUNvdW50KTsKKyAgICAgICAgdmlydHVhbCB2b2lkIGNvcHlGcmFtZXModm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBmcmFtZXMpOworCisgICAgcHJvdGVjdGVkOgorICAgICAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBtRm9ybWF0OworICAgICAgICBjb25zdCBzaXplX3QgICAgICAgICBtU2FtcGxlU2l6ZTsKKyAgICAgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbUlucHV0Q2hhbm5lbHM7CisgICAgICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1PdXRwdXRDaGFubmVsczsKKyAgICAgICAgaW50OF90ICAgICAgICAgICAgICAgbUlkeEFyeVtzaXplb2YodWludDMyX3QpKjhdOyAvLyAzMiBiaXRzID0+IGNoYW5uZWwgaW5kaWNlcworICAgIH07CisKKyAgICAvLyBSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyIHdyYXBzIGEgdHJhY2sgQXVkaW9CdWZmZXJQcm92aWRlciB0byBjb252ZXJ0IHRoZSBpbnB1dCBkYXRhCisgICAgLy8gdG8gYW4gYWNjZXB0YWJsZSBtaXhlciBpbnB1dCBmb3JtYXQgdHlwZS4KKyAgICBjbGFzcyBSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyIDogcHVibGljIENvcHlCdWZmZXJQcm92aWRlciB7CisgICAgcHVibGljOgorICAgICAgICBSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyKGludDMyX3QgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgaW5wdXRGb3JtYXQsIGF1ZGlvX2Zvcm1hdF90IG91dHB1dEZvcm1hdCwKKyAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyRnJhbWVDb3VudCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBjb3B5RnJhbWVzKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZnJhbWVzKTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgY29uc3QgaW50MzJfdCAgICAgICAgbUNoYW5uZWxzOworICAgICAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBtSW5wdXRGb3JtYXQ7CisgICAgICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IG1PdXRwdXRGb3JtYXQ7CiAgICAgfTsKIAogICAgIC8vIGJpdG1hc2sgb2YgYWxsb2NhdGVkIHRyYWNrIG5hbWVzLCB3aGVyZSBiaXQgMCBjb3JyZXNwb25kcyB0byBUUkFDSzAgZXRjLgpAQCAtMjU1LDE4ICszNzUsMjAgQEAKIHByaXZhdGU6CiAgICAgc3RhdGVfdCAgICAgICAgIG1TdGF0ZSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDMyKSkpOwogCi0gICAgLy8gZWZmZWN0IGRlc2NyaXB0b3IgZm9yIHRoZSBkb3dubWl4ZXIgdXNlZCBieSB0aGUgbWl4ZXIKLSAgICBzdGF0aWMgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkd25tRnhEZXNjOwotICAgIC8vIGluZGljYXRlcyB3aGV0aGVyIGEgZG93bm1peCBlZmZlY3QgaGFzIGJlZW4gZm91bmQgYW5kIGlzIHVzYWJsZSBieSB0aGlzIG1peGVyCi0gICAgc3RhdGljIGJvb2wgICAgICAgICAgICAgICAgaXNNdWx0aWNoYW5uZWxDYXBhYmxlOwotCiAgICAgLy8gQ2FsbCBhZnRlciBjaGFuZ2luZyBlaXRoZXIgdGhlIGVuYWJsZWQgc3RhdHVzIG9mIGEgdHJhY2ssIG9yIHBhcmFtZXRlcnMgb2YgYW4gZW5hYmxlZCB0cmFjay4KICAgICAvLyBPSyB0byBjYWxsIG1vcmUgb2Z0ZW4gdGhhbiB0aGF0LCBidXQgdW5uZWNlc3NhcnkuCiAgICAgdm9pZCBpbnZhbGlkYXRlU3RhdGUodWludDMyX3QgbWFzayk7CiAKLSAgICBzdGF0aWMgc3RhdHVzX3QgaW5pdFRyYWNrRG93bm1peCh0cmFja190KiBwVHJhY2ssIGludCB0cmFja051bSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbWFzayk7CisgICAgYm9vbCBzZXRDaGFubmVsTWFza3MoaW50IG5hbWUsCisgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCB0cmFja0NoYW5uZWxNYXNrLCBhdWRpb19jaGFubmVsX21hc2tfdCBtaXhlckNoYW5uZWxNYXNrKTsKKworICAgIC8vIFRPRE86IHJlbW92ZSB1bnVzZWQgdHJhY2tOYW1lL3RyYWNrTnVtIGZyb20gZnVuY3Rpb25zIGJlbG93LgorICAgIHN0YXRpYyBzdGF0dXNfdCBpbml0VHJhY2tEb3dubWl4KHRyYWNrX3QqIHBUcmFjaywgaW50IHRyYWNrTmFtZSk7CiAgICAgc3RhdGljIHN0YXR1c190IHByZXBhcmVUcmFja0ZvckRvd25taXgodHJhY2tfdCogcFRyYWNrLCBpbnQgdHJhY2tOdW0pOwogICAgIHN0YXRpYyB2b2lkIHVucHJlcGFyZVRyYWNrRm9yRG93bm1peCh0cmFja190KiBwVHJhY2ssIGludCB0cmFja05hbWUpOworICAgIHN0YXRpYyBzdGF0dXNfdCBwcmVwYXJlVHJhY2tGb3JSZWZvcm1hdCh0cmFja190KiBwVHJhY2ssIGludCB0cmFja051bSk7CisgICAgc3RhdGljIHZvaWQgdW5wcmVwYXJlVHJhY2tGb3JSZWZvcm1hdCh0cmFja190KiBwVHJhY2ssIGludCB0cmFja05hbWUpOworICAgIHN0YXRpYyB2b2lkIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKHRyYWNrX3QqIHBUcmFjayk7CiAKICAgICBzdGF0aWMgdm9pZCB0cmFja19fZ2VuZXJpY1Jlc2FtcGxlKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dCwgc2l6ZV90IG51bUZyYW1lcywgaW50MzJfdCogdGVtcCwKICAgICAgICAgICAgIGludDMyX3QqIGF1eCk7CkBAIC0yODYsMTAgKzQwOCw2IEBACiAgICAgc3RhdGljIHZvaWQgcHJvY2Vzc19fZ2VuZXJpY1Jlc2FtcGxpbmcoc3RhdGVfdCogc3RhdGUsIGludDY0X3QgcHRzKTsKICAgICBzdGF0aWMgdm9pZCBwcm9jZXNzX19PbmVUcmFjazE2Qml0c1N0ZXJlb05vUmVzYW1wbGluZyhzdGF0ZV90KiBzdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHB0cyk7Ci0jaWYgMAotICAgIHN0YXRpYyB2b2lkIHByb2Nlc3NfX1R3b1RyYWNrczE2Qml0c1N0ZXJlb05vUmVzYW1wbGluZyhzdGF0ZV90KiBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwdHMpOwotI2VuZGlmCiAKICAgICBzdGF0aWMgaW50NjRfdCBjYWxjdWxhdGVPdXRwdXRQVFMoY29uc3QgdHJhY2tfdCYgdCwgaW50NjRfdCBiYXNlUFRTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0cHV0RnJhbWVJbmRleCk7CkBAIC0yOTcsNiArNDE1LDUzIEBACiAgICAgc3RhdGljIHVpbnQ2NF90ICAgICAgICAgc0xvY2FsVGltZUZyZXE7CiAgICAgc3RhdGljIHB0aHJlYWRfb25jZV90ICAgc09uY2VDb250cm9sOwogICAgIHN0YXRpYyB2b2lkICAgICAgICAgICAgIHNJbml0Um91dGluZSgpOworCisgICAgLyogbXVsdGktZm9ybWF0IHZvbHVtZSBtaXhpbmcgZnVuY3Rpb24gKGNhbGxzIHRlbXBsYXRlIGZ1bmN0aW9ucworICAgICAqIGluIEF1ZGlvTWl4ZXJPcHMuaCkuICBUaGUgdGVtcGxhdGUgcGFyYW1ldGVycyBhcmUgYXMgZm9sbG93czoKKyAgICAgKgorICAgICAqICAgTUlYVFlQRSAgICAgKHNlZSBBdWRpb01peGVyT3BzLmggTUlYVFlQRV8qIGVudW1lcmF0aW9uKQorICAgICAqICAgVVNFRkxPQVRWT0wgKHNldCB0byB0cnVlIGlmIGZsb2F0IHZvbHVtZSBpcyB1c2VkKQorICAgICAqICAgQURKVVNUVk9MICAgKHNldCB0byB0cnVlIGlmIHZvbHVtZSByYW1wIHBhcmFtZXRlcnMgbmVlZHMgYWRqdXN0bWVudCBhZnRlcndhcmRzKQorICAgICAqICAgVE86IGludDMyX3QgKFE0LjI3KSBvciBmbG9hdAorICAgICAqICAgVEk6IGludDMyX3QgKFE0LjI3KSBvciBpbnQxNl90IChRMC4xNSkgb3IgZmxvYXQKKyAgICAgKiAgIFRBOiBpbnQzMl90IChRNC4yNykKKyAgICAgKi8KKyAgICB0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsIGJvb2wgVVNFRkxPQVRWT0wsIGJvb2wgQURKVVNUVk9MLAorICAgICAgICB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRBPgorICAgIHN0YXRpYyB2b2lkIHZvbHVtZU1peChUTyAqb3V0LCBzaXplX3Qgb3V0RnJhbWVzLAorICAgICAgICAgICAgY29uc3QgVEkgKmluLCBUQSAqYXV4LCBib29sIHJhbXAsIEF1ZGlvTWl4ZXI6OnRyYWNrX3QgKnQpOworCisgICAgLy8gbXVsdGktZm9ybWF0IHByb2Nlc3MgaG9va3MKKyAgICB0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVEE+CisgICAgc3RhdGljIHZvaWQgcHJvY2Vzc19Ob1Jlc2FtcGxlT25lVHJhY2soc3RhdGVfdCogc3RhdGUsIGludDY0X3QgcHRzKTsKKworICAgIC8vIG11bHRpLWZvcm1hdCB0cmFjayBob29rcworICAgIHRlbXBsYXRlIDxpbnQgTUlYVFlQRSwgdHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUQT4KKyAgICBzdGF0aWMgdm9pZCB0cmFja19fUmVzYW1wbGUodHJhY2tfdCogdCwgVE8qIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgICAgICBUTyogdGVtcCBfX3VudXNlZCwgVEEqIGF1eCk7CisgICAgdGVtcGxhdGUgPGludCBNSVhUWVBFLCB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRBPgorICAgIHN0YXRpYyB2b2lkIHRyYWNrX19Ob1Jlc2FtcGxlKHRyYWNrX3QqIHQsIFRPKiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICAgICAgVE8qIHRlbXAgX191bnVzZWQsIFRBKiBhdXgpOworCisgICAgc3RhdGljIHZvaWQgY29udmVydE1peGVyRm9ybWF0KHZvaWQgKm91dCwgYXVkaW9fZm9ybWF0X3QgbWl4ZXJPdXRGb3JtYXQsCisgICAgICAgICAgICB2b2lkICppbiwgYXVkaW9fZm9ybWF0X3QgbWl4ZXJJbkZvcm1hdCwgc2l6ZV90IHNhbXBsZUNvdW50KTsKKworICAgIC8vIGhvb2sgdHlwZXMKKyAgICBlbnVtIHsKKyAgICAgICAgUFJPQ0VTU1RZUEVfTk9SRVNBTVBMRU9ORVRSQUNLLAorICAgIH07CisgICAgZW51bSB7CisgICAgICAgIFRSQUNLVFlQRV9OT1AsCisgICAgICAgIFRSQUNLVFlQRV9SRVNBTVBMRSwKKyAgICAgICAgVFJBQ0tUWVBFX05PUkVTQU1QTEUsCisgICAgICAgIFRSQUNLVFlQRV9OT1JFU0FNUExFTU9OTywKKyAgICB9OworCisgICAgLy8gZnVuY3Rpb25zIGZvciBkZXRlcm1pbmluZyB0aGUgcHJvcGVyIHByb2Nlc3MgYW5kIHRyYWNrIGhvb2tzLgorICAgIHN0YXRpYyBwcm9jZXNzX2hvb2tfdCBnZXRQcm9jZXNzSG9vayhpbnQgcHJvY2Vzc1R5cGUsIHVpbnQzMl90IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IG1peGVySW5Gb3JtYXQsIGF1ZGlvX2Zvcm1hdF90IG1peGVyT3V0Rm9ybWF0KTsKKyAgICBzdGF0aWMgaG9va190IGdldFRyYWNrSG9vayhpbnQgdHJhY2tUeXBlLCB1aW50MzJfdCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBtaXhlckluRm9ybWF0LCBhdWRpb19mb3JtYXRfdCBtaXhlck91dEZvcm1hdCk7CiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlck9wcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXJPcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzM3NmE4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXJPcHMuaApAQCAtMCwwICsxLDQ1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9BVURJT19NSVhFUl9PUFNfSAorI2RlZmluZSBBTkRST0lEX0FVRElPX01JWEVSX09QU19ICisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyogQmVoYXZpb3Igb2YgaXNfc2FtZTw+Ojp2YWx1ZSBpcyB0cnVlIGlmIHRoZSB0eXBlcyBhcmUgaWRlbnRpY2FsLAorICogZmFsc2Ugb3RoZXJ3aXNlLiBJZGVudGljYWwgdG8gdGhlIFNUTCBzdGQ6OmlzX3NhbWUuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CitzdHJ1Y3QgaXNfc2FtZQoreworICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gZmFsc2U7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IGlzX3NhbWU8VCwgVD4gIC8vIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24KK3sKKyAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7Cit9OworCisKKy8qIE1peE11bCBpcyBhIG11bHRpcGxpY2F0aW9uIG9wZXJhdG9yIHRvIHNjYWxlIGFuIGF1ZGlvIGlucHV0IHNpZ25hbAorICogYnkgYSB2b2x1bWUgZ2Fpbiwgd2l0aCB0aGUgZm9ybXVsYToKKyAqCisgKiBPKHV0cHV0KSA9IEkobnB1dCkgKiBWKG9sdW1lKQorICoKKyAqIFRoZSBvdXRwdXQsIGlucHV0LCBhbmQgdm9sdW1lIG1heSBoYXZlIGRpZmZlcmVudCB0eXBlcy4KKyAqIFRoZXJlIGFyZSAyNyB2YXJpYW50cywgb2Ygd2hpY2ggMTQgYXJlIGFjdHVhbGx5IGRlZmluZWQgaW4gYW4KKyAqIGV4cGxpY2l0bHkgdGVtcGxhdGVkIGNsYXNzLgorICoKKyAqIFRoZSBmb2xsb3dpbmcgdHlwZSB2YXJpYWJsZXMgYW5kIHRoZSB1bmRlcmx5aW5nIG1lYW5pbmc6CisgKgorICogT3V0cHV0IHR5cGUgICAgICAgVE86IGludDMyX3QgKFE0LjI3KSBvciBpbnQxNl90IChRLjE1KSBvciBmbG9hdCBbLTEsMV0KKyAqIElucHV0IHNpZ25hbCB0eXBlIFRJOiBpbnQzMl90IChRNC4yNykgb3IgaW50MTZfdCAoUS4xNSkgb3IgZmxvYXQgWy0xLDFdCisgKiBWb2x1bWUgdHlwZSAgICAgICBUVjogaW50MzJfdCAoVTQuMjgpIG9yIGludDE2X3QgKFU0LjEyKSBvciBmbG9hdCBbLTEsMV0KKyAqCisgKiBGb3IgaGlnaCBwcmVjaXNpb24gYXVkaW8sIG9ubHkgdGhlIDxUTywgVEksIFRWPiA9IDxmbG9hdCwgZmxvYXQsIGZsb2F0PgorICogbmVlZHMgdG8gYmUgYWNjZWxlcmF0ZWQuIFRoaXMgaXMgcGVyaGFwcyB0aGUgZWFzaWVzdCBmb3JtIHRvIGRvIHF1aWNrbHkgYXMgd2VsbC4KKyAqLworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUVj4KK2lubGluZSBUTyBNaXhNdWwoVEkgdmFsdWUsIFRWIHZvbHVtZSkgeworICAgIENPTVBJTEVfVElNRV9BU1NFUlRfRlVOQ1RJT05fU0NPUEUoZmFsc2UpOworICAgIC8vIHNob3VsZCBub3QgYmUgaGVyZSA6LSkuCisgICAgLy8gVG8gYXZvaWQgbWlzdGFrZXMsIHRoaXMgdGVtcGxhdGUgaXMgYWx3YXlzIHNwZWNpYWxpemVkLgorICAgIHJldHVybiB2YWx1ZSAqIHZvbHVtZTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBpbnQzMl90IE1peE11bDxpbnQzMl90LCBpbnQxNl90LCBpbnQxNl90PihpbnQxNl90IHZhbHVlLCBpbnQxNl90IHZvbHVtZSkgeworICAgIHJldHVybiB2YWx1ZSAqIHZvbHVtZTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBpbnQzMl90IE1peE11bDxpbnQzMl90LCBpbnQzMl90LCBpbnQxNl90PihpbnQzMl90IHZhbHVlLCBpbnQxNl90IHZvbHVtZSkgeworICAgIHJldHVybiAodmFsdWUgPj4gMTIpICogdm9sdW1lOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGludDMyX3QgTWl4TXVsPGludDMyX3QsIGludDE2X3QsIGludDMyX3Q+KGludDE2X3QgdmFsdWUsIGludDMyX3Qgdm9sdW1lKSB7CisgICAgcmV0dXJuIHZhbHVlICogKHZvbHVtZSA+PiAxNik7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgaW50MzJfdCBNaXhNdWw8aW50MzJfdCwgaW50MzJfdCwgaW50MzJfdD4oaW50MzJfdCB2YWx1ZSwgaW50MzJfdCB2b2x1bWUpIHsKKyAgICByZXR1cm4gKHZhbHVlID4+IDEyKSAqICh2b2x1bWUgPj4gMTYpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGZsb2F0IE1peE11bDxmbG9hdCwgZmxvYXQsIGludDE2X3Q+KGZsb2F0IHZhbHVlLCBpbnQxNl90IHZvbHVtZSkgeworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBub3JtID0gMS4gLyAoMSA8PCAxMik7CisgICAgcmV0dXJuIHZhbHVlICogdm9sdW1lICogbm9ybTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBmbG9hdCBNaXhNdWw8ZmxvYXQsIGZsb2F0LCBpbnQzMl90PihmbG9hdCB2YWx1ZSwgaW50MzJfdCB2b2x1bWUpIHsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgbm9ybSA9IDEuIC8gKDEgPDwgMjgpOworICAgIHJldHVybiB2YWx1ZSAqIHZvbHVtZSAqIG5vcm07Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgaW50MTZfdCBNaXhNdWw8aW50MTZfdCwgZmxvYXQsIGludDE2X3Q+KGZsb2F0IHZhbHVlLCBpbnQxNl90IHZvbHVtZSkgeworICAgIHJldHVybiBjbGFtcDE2X2Zyb21fZmxvYXQoTWl4TXVsPGZsb2F0LCBmbG9hdCwgaW50MTZfdD4odmFsdWUsIHZvbHVtZSkpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGludDE2X3QgTWl4TXVsPGludDE2X3QsIGZsb2F0LCBpbnQzMl90PihmbG9hdCB2YWx1ZSwgaW50MzJfdCB2b2x1bWUpIHsKKyAgICByZXR1cm4gY2xhbXAxNl9mcm9tX2Zsb2F0KE1peE11bDxmbG9hdCwgZmxvYXQsIGludDMyX3Q+KHZhbHVlLCB2b2x1bWUpKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBmbG9hdCBNaXhNdWw8ZmxvYXQsIGludDE2X3QsIGludDE2X3Q+KGludDE2X3QgdmFsdWUsIGludDE2X3Qgdm9sdW1lKSB7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IG5vcm0gPSAxLiAvICgxIDw8ICgxNSArIDEyKSk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGZsb2F0Pih2YWx1ZSkgKiBzdGF0aWNfY2FzdDxmbG9hdD4odm9sdW1lKSAqIG5vcm07Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgZmxvYXQgTWl4TXVsPGZsb2F0LCBpbnQxNl90LCBpbnQzMl90PihpbnQxNl90IHZhbHVlLCBpbnQzMl90IHZvbHVtZSkgeworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBub3JtID0gMS4gLyAoMVVMTCA8PCAoMTUgKyAyOCkpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxmbG9hdD4odmFsdWUpICogc3RhdGljX2Nhc3Q8ZmxvYXQ+KHZvbHVtZSkgKiBub3JtOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGludDE2X3QgTWl4TXVsPGludDE2X3QsIGludDE2X3QsIGludDE2X3Q+KGludDE2X3QgdmFsdWUsIGludDE2X3Qgdm9sdW1lKSB7CisgICAgcmV0dXJuIGNsYW1wMTYoTWl4TXVsPGludDMyX3QsIGludDE2X3QsIGludDE2X3Q+KHZhbHVlLCB2b2x1bWUpID4+IDEyKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBpbnQxNl90IE1peE11bDxpbnQxNl90LCBpbnQzMl90LCBpbnQxNl90PihpbnQzMl90IHZhbHVlLCBpbnQxNl90IHZvbHVtZSkgeworICAgIHJldHVybiBjbGFtcDE2KE1peE11bDxpbnQzMl90LCBpbnQzMl90LCBpbnQxNl90Pih2YWx1ZSwgdm9sdW1lKSA+PiAxMik7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgaW50MTZfdCBNaXhNdWw8aW50MTZfdCwgaW50MTZfdCwgaW50MzJfdD4oaW50MTZfdCB2YWx1ZSwgaW50MzJfdCB2b2x1bWUpIHsKKyAgICByZXR1cm4gY2xhbXAxNihNaXhNdWw8aW50MzJfdCwgaW50MTZfdCwgaW50MzJfdD4odmFsdWUsIHZvbHVtZSkgPj4gMTIpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGludDE2X3QgTWl4TXVsPGludDE2X3QsIGludDMyX3QsIGludDMyX3Q+KGludDMyX3QgdmFsdWUsIGludDMyX3Qgdm9sdW1lKSB7CisgICAgcmV0dXJuIGNsYW1wMTYoTWl4TXVsPGludDMyX3QsIGludDMyX3QsIGludDMyX3Q+KHZhbHVlLCB2b2x1bWUpID4+IDEyKTsKK30KKworLyogUmVxdWlyZWQgZm9yIGZsb2F0aW5nIHBvaW50IHZvbHVtZS4gIFNvbWUgYXJlIG5lZWRlZCBmb3IgY29tcGlsYXRpb24gYnV0CisgKiBhcmUgbm90IG5lZWRlZCBpbiBleGVjdXRpb24gYW5kIHNob3VsZCBiZSByZW1vdmVkIGZyb20gdGhlIGZpbmFsIGJ1aWxkIGJ5CisgKiBhbiBvcHRpbWl6aW5nIGNvbXBpbGVyLgorICovCit0ZW1wbGF0ZSA8PgoraW5saW5lIGZsb2F0IE1peE11bDxmbG9hdCwgZmxvYXQsIGZsb2F0PihmbG9hdCB2YWx1ZSwgZmxvYXQgdm9sdW1lKSB7CisgICAgcmV0dXJuIHZhbHVlICogdm9sdW1lOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGZsb2F0IE1peE11bDxmbG9hdCwgaW50MTZfdCwgZmxvYXQ+KGludDE2X3QgdmFsdWUsIGZsb2F0IHZvbHVtZSkgeworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBmbG9hdF9mcm9tX3FfMTUgPSAxLiAvICgxIDw8IDE1KTsKKyAgICByZXR1cm4gdmFsdWUgKiB2b2x1bWUgKiBmbG9hdF9mcm9tX3FfMTU7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgaW50MzJfdCBNaXhNdWw8aW50MzJfdCwgaW50MzJfdCwgZmxvYXQ+KGludDMyX3QgdmFsdWUsIGZsb2F0IHZvbHVtZSkgeworICAgIExPR19BTFdBWVNfRkFUQUwoIk1peE11bDxpbnQzMl90LCBpbnQzMl90LCBmbG9hdD4gUnVudGltZSBTaG91bGQgbm90IGJlIGhlcmUiKTsKKyAgICByZXR1cm4gdmFsdWUgKiB2b2x1bWU7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgaW50MzJfdCBNaXhNdWw8aW50MzJfdCwgaW50MTZfdCwgZmxvYXQ+KGludDE2X3QgdmFsdWUsIGZsb2F0IHZvbHVtZSkgeworICAgIExPR19BTFdBWVNfRkFUQUwoIk1peE11bDxpbnQzMl90LCBpbnQxNl90LCBmbG9hdD4gUnVudGltZSBTaG91bGQgbm90IGJlIGhlcmUiKTsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgdTRfMTJfZnJvbV9mbG9hdCA9ICgxIDw8IDEyKTsKKyAgICByZXR1cm4gdmFsdWUgKiB2b2x1bWUgKiB1NF8xMl9mcm9tX2Zsb2F0OworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGludDE2X3QgTWl4TXVsPGludDE2X3QsIGludDE2X3QsIGZsb2F0PihpbnQxNl90IHZhbHVlLCBmbG9hdCB2b2x1bWUpIHsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMKCJNaXhNdWw8aW50MTZfdCwgaW50MTZfdCwgZmxvYXQ+IFJ1bnRpbWUgU2hvdWxkIG5vdCBiZSBoZXJlIik7CisgICAgcmV0dXJuIHZhbHVlICogdm9sdW1lOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGludDE2X3QgTWl4TXVsPGludDE2X3QsIGZsb2F0LCBmbG9hdD4oZmxvYXQgdmFsdWUsIGZsb2F0IHZvbHVtZSkgeworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBxXzE1X2Zyb21fZmxvYXQgPSAoMSA8PCAxNSk7CisgICAgcmV0dXJuIHZhbHVlICogdm9sdW1lICogcV8xNV9mcm9tX2Zsb2F0OworfQorCisvKgorICogTWl4QWNjdW0gaXMgdXNlZCB0byBhZGQgaW50byBhbiBhY2N1bXVsYXRvciByZWdpc3RlciBvZiBhIHBvc3NpYmx5IGRpZmZlcmVudAorICogdHlwZS4gVGhlIFRPIGFuZCBUSSB0eXBlcyBhcmUgdGhlIHNhbWUgYXMgTWl4TXVsLgorICovCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEk+CitpbmxpbmUgdm9pZCBNaXhBY2N1bShUTyAqYXV4YWNjdW0sIFRJIHZhbHVlKSB7CisgICAgaWYgKCFpc19zYW1lPFRPLCBUST46OnZhbHVlKSB7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIk1peEFjY3VtIHR5cGUgbm90IHByb3Blcmx5IHNwZWNpYWxpemVkOiAlenUgJXp1XG4iLAorICAgICAgICAgICAgICAgIHNpemVvZihUTyksIHNpemVvZihUSSkpOworICAgIH0KKyAgICAqYXV4YWNjdW0gKz0gdmFsdWU7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSB2b2lkIE1peEFjY3VtPGZsb2F0LCBpbnQxNl90PihmbG9hdCAqYXV4YWNjdW0sIGludDE2X3QgdmFsdWUpIHsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgbm9ybSA9IDEuIC8gKDEgPDwgMTUpOworICAgICphdXhhY2N1bSArPSBub3JtICogdmFsdWU7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSB2b2lkIE1peEFjY3VtPGZsb2F0LCBpbnQzMl90PihmbG9hdCAqYXV4YWNjdW0sIGludDMyX3QgdmFsdWUpIHsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgbm9ybSA9IDEuIC8gKDEgPDwgMjcpOworICAgICphdXhhY2N1bSArPSBub3JtICogdmFsdWU7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSB2b2lkIE1peEFjY3VtPGludDMyX3QsIGludDE2X3Q+KGludDMyX3QgKmF1eGFjY3VtLCBpbnQxNl90IHZhbHVlKSB7CisgICAgKmF1eGFjY3VtICs9IHZhbHVlIDw8IDEyOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgdm9pZCBNaXhBY2N1bTxpbnQzMl90LCBmbG9hdD4oaW50MzJfdCAqYXV4YWNjdW0sIGZsb2F0IHZhbHVlKSB7CisgICAgKmF1eGFjY3VtICs9IGNsYW1wcTRfMjdfZnJvbV9mbG9hdCh2YWx1ZSk7Cit9CisKKy8qIE1peE11bEF1eCBpcyBqdXN0IGxpa2UgTWl4TXVsIGV4Y2VwdCBpdCBjb21iaW5lcyB3aXRoCisgKiBhbiBhY2N1bXVsYXRvciBvcGVyYXRpb24gTWl4QWNjdW0uCisgKi8KKwordGVtcGxhdGUgPHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVFYsIHR5cGVuYW1lIFRBPgoraW5saW5lIFRPIE1peE11bEF1eChUSSB2YWx1ZSwgVFYgdm9sdW1lLCBUQSAqYXV4YWNjdW0pIHsKKyAgICBNaXhBY2N1bTxUQSwgVEk+KGF1eGFjY3VtLCB2YWx1ZSk7CisgICAgcmV0dXJuIE1peE11bDxUTywgVEksIFRWPih2YWx1ZSwgdm9sdW1lKTsKK30KKworLyogTUlYVFlQRSBpcyB1c2VkIHRvIGRldGVybWluZSBob3cgdGhlIHNhbXBsZXMgaW4gdGhlIGlucHV0IGZyYW1lCisgKiBhcmUgbWl4ZWQgd2l0aCB2b2x1bWUgZ2FpbiBpbnRvIHRoZSBvdXRwdXQgZnJhbWUuCisgKiBTZWUgdGhlIHZvbHVtZVJhbXBNdWx0aSBmdW5jdGlvbnMgYmVsb3cgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworZW51bSB7CisgICAgTUlYVFlQRV9NVUxUSSwKKyAgICBNSVhUWVBFX01PTk9FWFBBTkQsCisgICAgTUlYVFlQRV9NVUxUSV9TQVZFT05MWSwKKyAgICBNSVhUWVBFX01VTFRJX01PTk9WT0wsCisgICAgTUlYVFlQRV9NVUxUSV9TQVZFT05MWV9NT05PVk9MLAorfTsKKworLyoKKyAqIFRoZSB2b2x1bWVSYW1wTXVsdGkgYW5kIHZvbHVtZVJhbXAgZnVuY3Rpb25zIHRha2UgYSBNSVhUWVBFCisgKiB3aGljaCBpbmRpY2F0ZXMgdGhlIHBlci1mcmFtZSBtaXhpbmcgYW5kIGFjY3VtdWxhdGlvbiBzdHJhdGVneS4KKyAqCisgKiBNSVhUWVBFX01VTFRJOgorICogICBOQ0hBTiByZXByZXNlbnRzIG51bWJlciBvZiBpbnB1dCBhbmQgb3V0cHV0IGNoYW5uZWxzLgorICogICBUTzogaW50MzJfdCAoUTQuMjcpIG9yIGZsb2F0CisgKiAgIFRJOiBpbnQzMl90IChRNC4yNykgb3IgaW50MTZfdCAoUTAuMTUpIG9yIGZsb2F0CisgKiAgIFRWOiBpbnQzMl90IChVNC4yOCkgb3IgaW50MTZfdCAoVTQuMTIpIG9yIGZsb2F0CisgKiAgIHZvbDogcmVwcmVzZW50cyBhIHZvbHVtZSBhcnJheS4KKyAqCisgKiAgIFRoaXMgYWNjdW11bGF0ZXMgaW50byB0aGUgb3V0IHBvaW50ZXIuCisgKgorICogTUlYVFlQRV9NT05PRVhQQU5EOgorICogICBTaW5nbGUgaW5wdXQgY2hhbm5lbC4gTkNIQU4gcmVwcmVzZW50cyBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzLgorICogICBUTzogaW50MzJfdCAoUTQuMjcpIG9yIGZsb2F0CisgKiAgIFRJOiBpbnQzMl90IChRNC4yNykgb3IgaW50MTZfdCAoUTAuMTUpIG9yIGZsb2F0CisgKiAgIFRWOiBpbnQzMl90IChVNC4yOCkgb3IgaW50MTZfdCAoVTQuMTIpIG9yIGZsb2F0CisgKiAgIElucHV0IGNoYW5uZWwgY291bnQgaXMgMS4KKyAqICAgdm9sOiByZXByZXNlbnRzIHZvbHVtZSBhcnJheS4KKyAqCisgKiAgIFRoaXMgYWNjdW11bGF0ZXMgaW50byB0aGUgb3V0IHBvaW50ZXIuCisgKgorICogTUlYVFlQRV9NVUxUSV9TQVZFT05MWToKKyAqICAgTkNIQU4gcmVwcmVzZW50cyBudW1iZXIgb2YgaW5wdXQgYW5kIG91dHB1dCBjaGFubmVscy4KKyAqICAgVE86IGludDE2X3QgKFEuMTUpIG9yIGZsb2F0CisgKiAgIFRJOiBpbnQzMl90IChRNC4yNykgb3IgaW50MTZfdCAoUTAuMTUpIG9yIGZsb2F0CisgKiAgIFRWOiBpbnQzMl90IChVNC4yOCkgb3IgaW50MTZfdCAoVTQuMTIpIG9yIGZsb2F0CisgKiAgIHZvbDogcmVwcmVzZW50cyBhIHZvbHVtZSBhcnJheS4KKyAqCisgKiAgIE1JWFRZUEVfTVVMVElfU0FWRU9OTFkgZG9lcyBub3QgYWNjdW11bGF0ZSBpbnRvIHRoZSBvdXQgcG9pbnRlci4KKyAqCisgKiBNSVhUWVBFX01VTFRJX01PTk9WT0w6CisgKiAgIFNhbWUgYXMgTUlYVFlQRV9NVUxUSSwgYnV0IHVzZXMgb25seSB2b2x1bWVbMF0uCisgKgorICogTUlYVFlQRV9NVUxUSV9TQVZFT05MWV9NT05PVk9MOgorICogICBTYW1lIGFzIE1JWFRZUEVfTVVMVElfU0FWRU9OTFksIGJ1dCB1c2VzIG9ubHkgdm9sdW1lWzBdLgorICoKKyAqLworCit0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsIGludCBOQ0hBTiwKKyAgICAgICAgdHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUViwgdHlwZW5hbWUgVEEsIHR5cGVuYW1lIFRBVj4KK2lubGluZSB2b2lkIHZvbHVtZVJhbXBNdWx0aShUTyogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgY29uc3QgVEkqIGluLCBUQSogYXV4LCBUViAqdm9sLCBjb25zdCBUViAqdm9saW5jLCBUQVYgKnZvbGEsIFRBViB2b2xhaW5jKQoreworI2lmZGVmIEFMT0dWVgorICAgIEFMT0dWVigidm9sdW1lUmFtcE11bHRpLCBNSVhUWVBFOiVkXG4iLCBNSVhUWVBFKTsKKyNlbmRpZgorICAgIGlmIChhdXggIT0gTlVMTCkgeworICAgICAgICBkbyB7CisgICAgICAgICAgICBUQSBhdXhhY2N1bSA9IDA7CisgICAgICAgICAgICBzd2l0Y2ggKE1JWFRZUEUpIHsKKyAgICAgICAgICAgIGNhc2UgTUlYVFlQRV9NVUxUSToKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5DSEFOOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgKm91dCsrICs9IE1peE11bEF1eDxUTywgVEksIFRWLCBUQT4oKmluKyssIHZvbFtpXSwgJmF1eGFjY3VtKTsKKyAgICAgICAgICAgICAgICAgICAgdm9sW2ldICs9IHZvbGluY1tpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1JWFRZUEVfTU9OT0VYUEFORDoKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5DSEFOOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgKm91dCsrICs9IE1peE11bEF1eDxUTywgVEksIFRWLCBUQT4oKmluLCB2b2xbaV0sICZhdXhhY2N1bSk7CisgICAgICAgICAgICAgICAgICAgIHZvbFtpXSArPSB2b2xpbmNbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluKys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1JWFRZUEVfTVVMVElfU0FWRU9OTFk6CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0hBTjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXQrKyA9IE1peE11bEF1eDxUTywgVEksIFRWLCBUQT4oKmluKyssIHZvbFtpXSwgJmF1eGFjY3VtKTsKKyAgICAgICAgICAgICAgICAgICAgdm9sW2ldICs9IHZvbGluY1tpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1JWFRZUEVfTVVMVElfTU9OT1ZPTDoKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5DSEFOOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgKm91dCsrICs9IE1peE11bEF1eDxUTywgVEksIFRWLCBUQT4oKmluKyssIHZvbFswXSwgJmF1eGFjY3VtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdm9sWzBdICs9IHZvbGluY1swXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTUlYVFlQRV9NVUxUSV9TQVZFT05MWV9NT05PVk9MOgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgeworICAgICAgICAgICAgICAgICAgICAqb3V0KysgPSBNaXhNdWxBdXg8VE8sIFRJLCBUViwgVEE+KCppbisrLCB2b2xbMF0sICZhdXhhY2N1bSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZvbFswXSArPSB2b2xpbmNbMF07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImludmFsaWQgbWl4dHlwZSAlZCIsIE1JWFRZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXV4YWNjdW0gLz0gTkNIQU47CisgICAgICAgICAgICAqYXV4KysgKz0gTWl4TXVsPFRBLCBUQSwgVEFWPihhdXhhY2N1bSwgKnZvbGEpOworICAgICAgICAgICAgdm9sYVswXSArPSB2b2xhaW5jOworICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHN3aXRjaCAoTUlYVFlQRSkgeworICAgICAgICAgICAgY2FzZSBNSVhUWVBFX01VTFRJOgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgeworICAgICAgICAgICAgICAgICAgICAqb3V0KysgKz0gTWl4TXVsPFRPLCBUSSwgVFY+KCppbisrLCB2b2xbaV0pOworICAgICAgICAgICAgICAgICAgICB2b2xbaV0gKz0gdm9saW5jW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTUlYVFlQRV9NT05PRVhQQU5EOgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgeworICAgICAgICAgICAgICAgICAgICAqb3V0KysgKz0gTWl4TXVsPFRPLCBUSSwgVFY+KCppbiwgdm9sW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgdm9sW2ldICs9IHZvbGluY1tpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW4rKzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTUlYVFlQRV9NVUxUSV9TQVZFT05MWToKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5DSEFOOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgKm91dCsrID0gTWl4TXVsPFRPLCBUSSwgVFY+KCppbisrLCB2b2xbaV0pOworICAgICAgICAgICAgICAgICAgICB2b2xbaV0gKz0gdm9saW5jW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTUlYVFlQRV9NVUxUSV9NT05PVk9MOgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgeworICAgICAgICAgICAgICAgICAgICAqb3V0KysgKz0gTWl4TXVsPFRPLCBUSSwgVFY+KCppbisrLCB2b2xbMF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2b2xbMF0gKz0gdm9saW5jWzBdOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNSVhUWVBFX01VTFRJX1NBVkVPTkxZX01PTk9WT0w6CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0hBTjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXQrKyA9IE1peE11bDxUTywgVEksIFRWPigqaW4rKywgdm9sWzBdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdm9sWzBdICs9IHZvbGluY1swXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiaW52YWxpZCBtaXh0eXBlICVkIiwgTUlYVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKC0tZnJhbWVDb3VudCk7CisgICAgfQorfQorCit0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsIGludCBOQ0hBTiwKKyAgICAgICAgdHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUViwgdHlwZW5hbWUgVEEsIHR5cGVuYW1lIFRBVj4KK2lubGluZSB2b2lkIHZvbHVtZU11bHRpKFRPKiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICBjb25zdCBUSSogaW4sIFRBKiBhdXgsIGNvbnN0IFRWICp2b2wsIFRBViB2b2xhKQoreworI2lmZGVmIEFMT0dWVgorICAgIEFMT0dWVigidm9sdW1lTXVsdGkgTUlYVFlQRTolZFxuIiwgTUlYVFlQRSk7CisjZW5kaWYKKyAgICBpZiAoYXV4ICE9IE5VTEwpIHsKKyAgICAgICAgZG8geworICAgICAgICAgICAgVEEgYXV4YWNjdW0gPSAwOworICAgICAgICAgICAgc3dpdGNoIChNSVhUWVBFKSB7CisgICAgICAgICAgICBjYXNlIE1JWFRZUEVfTVVMVEk6CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0hBTjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXQrKyArPSBNaXhNdWxBdXg8VE8sIFRJLCBUViwgVEE+KCppbisrLCB2b2xbaV0sICZhdXhhY2N1bSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNSVhUWVBFX01PTk9FWFBBTkQ6CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0hBTjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXQrKyArPSBNaXhNdWxBdXg8VE8sIFRJLCBUViwgVEE+KCppbiwgdm9sW2ldLCAmYXV4YWNjdW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbisrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNSVhUWVBFX01VTFRJX1NBVkVPTkxZOgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgeworICAgICAgICAgICAgICAgICAgICAqb3V0KysgPSBNaXhNdWxBdXg8VE8sIFRJLCBUViwgVEE+KCppbisrLCB2b2xbaV0sICZhdXhhY2N1bSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNSVhUWVBFX01VTFRJX01PTk9WT0w6CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0hBTjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXQrKyArPSBNaXhNdWxBdXg8VE8sIFRJLCBUViwgVEE+KCppbisrLCB2b2xbMF0sICZhdXhhY2N1bSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNSVhUWVBFX01VTFRJX1NBVkVPTkxZX01PTk9WT0w6CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0hBTjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXQrKyA9IE1peE11bEF1eDxUTywgVEksIFRWLCBUQT4oKmluKyssIHZvbFswXSwgJmF1eGFjY3VtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImludmFsaWQgbWl4dHlwZSAlZCIsIE1JWFRZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXV4YWNjdW0gLz0gTkNIQU47CisgICAgICAgICAgICAqYXV4KysgKz0gTWl4TXVsPFRBLCBUQSwgVEFWPihhdXhhY2N1bSwgdm9sYSk7CisgICAgICAgIH0gd2hpbGUgKC0tZnJhbWVDb3VudCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZG8geworICAgICAgICAgICAgc3dpdGNoIChNSVhUWVBFKSB7CisgICAgICAgICAgICBjYXNlIE1JWFRZUEVfTVVMVEk6CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0hBTjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXQrKyArPSBNaXhNdWw8VE8sIFRJLCBUVj4oKmluKyssIHZvbFtpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNSVhUWVBFX01PTk9FWFBBTkQ6CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0hBTjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXQrKyArPSBNaXhNdWw8VE8sIFRJLCBUVj4oKmluLCB2b2xbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbisrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNSVhUWVBFX01VTFRJX1NBVkVPTkxZOgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgeworICAgICAgICAgICAgICAgICAgICAqb3V0KysgPSBNaXhNdWw8VE8sIFRJLCBUVj4oKmluKyssIHZvbFtpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNSVhUWVBFX01VTFRJX01PTk9WT0w6CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0hBTjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXQrKyArPSBNaXhNdWw8VE8sIFRJLCBUVj4oKmluKyssIHZvbFswXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNSVhUWVBFX01VTFRJX1NBVkVPTkxZX01PTk9WT0w6CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0hBTjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXQrKyA9IE1peE11bDxUTywgVEksIFRWPigqaW4rKywgdm9sWzBdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImludmFsaWQgbWl4dHlwZSAlZCIsIE1JWFRZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOworICAgIH0KK30KKworfTsKKworI2VuZGlmIC8qIEFORFJPSURfQVVESU9fTUlYRVJfT1BTX0ggKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1BvbGljeVNlcnZpY2UuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5U2VydmljZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNDUyYzguLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5U2VydmljZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkF1ZGlvUG9saWN5U2VydmljZSIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKLSN1bmRlZiBfX1NUUklDVF9BTlNJX18KLSNkZWZpbmUgX19TVERJTlRfTElNSVRTCi0jZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MKLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSAiQXVkaW9Qb2xpY3lTZXJ2aWNlLmgiCi0jaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgotI2luY2x1ZGUgPGhhcmR3YXJlX2xlZ2FjeS9wb3dlci5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaD4KLQotI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX3BvbGljeS5oPgotI2luY2x1ZGUgPGF1ZGlvX2VmZmVjdHMvYXVkaW9fZWZmZWN0c19jb25mLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgY29uc3QgY2hhciBrRGVhZGxvY2tlZFN0cmluZ1tdID0gIkF1ZGlvUG9saWN5U2VydmljZSBtYXkgYmUgZGVhZGxvY2tlZFxuIjsKLXN0YXRpYyBjb25zdCBjaGFyIGtDbWREZWFkbG9ja2VkU3RyaW5nW10gPSAiQXVkaW9Qb2xpY3lTZXJ2aWNlIGNvbW1hbmQgdGhyZWFkIG1heSBiZSBkZWFkbG9ja2VkXG4iOwotCi1zdGF0aWMgY29uc3QgaW50IGtEdW1wTG9ja1JldHJpZXMgPSA1MDsKLXN0YXRpYyBjb25zdCBpbnQga0R1bXBMb2NrU2xlZXBVcyA9IDIwMDAwOwotCi1zdGF0aWMgY29uc3QgbnNlY3NfdCBrQXVkaW9Db21tYW5kVGltZW91dCA9IDMwMDAwMDAwMDBMTDsgLy8gMyBzZWNvbmRzCi0KLW5hbWVzcGFjZSB7Ci0gICAgZXh0ZXJuIHN0cnVjdCBhdWRpb19wb2xpY3lfc2VydmljZV9vcHMgYXBzX29wczsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeVNlcnZpY2UoKQotICAgIDogQm5BdWRpb1BvbGljeVNlcnZpY2UoKSAsIG1wQXVkaW9Qb2xpY3lEZXYoTlVMTCkgLCBtcEF1ZGlvUG9saWN5KE5VTEwpCi17Ci0gICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIGNvbnN0IHN0cnVjdCBod19tb2R1bGVfdCAqbW9kdWxlOwotICAgIGludCBmb3JjZWRfdmFsOwotICAgIGludCByYzsKLQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0KLSAgICAvLyBzdGFydCB0b25lIHBsYXliYWNrIHRocmVhZAotICAgIG1Ub25lUGxheWJhY2tUaHJlYWQgPSBuZXcgQXVkaW9Db21tYW5kVGhyZWFkKFN0cmluZzgoIkFwbVRvbmUiKSwgdGhpcyk7Ci0gICAgLy8gc3RhcnQgYXVkaW8gY29tbWFuZHMgdGhyZWFkCi0gICAgbUF1ZGlvQ29tbWFuZFRocmVhZCA9IG5ldyBBdWRpb0NvbW1hbmRUaHJlYWQoU3RyaW5nOCgiQXBtQXVkaW8iKSwgdGhpcyk7Ci0gICAgLy8gc3RhcnQgb3V0cHV0IGFjdGl2aXR5IGNvbW1hbmQgdGhyZWFkCi0gICAgbU91dHB1dENvbW1hbmRUaHJlYWQgPSBuZXcgQXVkaW9Db21tYW5kVGhyZWFkKFN0cmluZzgoIkFwbU91dHB1dCIpLCB0aGlzKTsKLSAgICAvKiBpbnN0YW50aWF0ZSB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgKi8KLSAgICByYyA9IGh3X2dldF9tb2R1bGUoQVVESU9fUE9MSUNZX0hBUkRXQVJFX01PRFVMRV9JRCwgJm1vZHVsZSk7Ci0gICAgaWYgKHJjKQotICAgICAgICByZXR1cm47Ci0KLSAgICByYyA9IGF1ZGlvX3BvbGljeV9kZXZfb3Blbihtb2R1bGUsICZtcEF1ZGlvUG9saWN5RGV2KTsKLSAgICBBTE9HRV9JRihyYywgImNvdWxkbid0IG9wZW4gYXVkaW8gcG9saWN5IGRldmljZSAoJXMpIiwgc3RyZXJyb3IoLXJjKSk7Ci0gICAgaWYgKHJjKQotICAgICAgICByZXR1cm47Ci0KLSAgICByYyA9IG1wQXVkaW9Qb2xpY3lEZXYtPmNyZWF0ZV9hdWRpb19wb2xpY3kobXBBdWRpb1BvbGljeURldiwgJmFwc19vcHMsIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtcEF1ZGlvUG9saWN5KTsKLSAgICBBTE9HRV9JRihyYywgImNvdWxkbid0IGNyZWF0ZSBhdWRpbyBwb2xpY3kgKCVzKSIsIHN0cmVycm9yKC1yYykpOwotICAgIGlmIChyYykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgcmMgPSBtcEF1ZGlvUG9saWN5LT5pbml0X2NoZWNrKG1wQXVkaW9Qb2xpY3kpOwotICAgIEFMT0dFX0lGKHJjLCAiY291bGRuJ3QgaW5pdF9jaGVjayB0aGUgYXVkaW8gcG9saWN5ICglcykiLCBzdHJlcnJvcigtcmMpKTsKLSAgICBpZiAocmMpCi0gICAgICAgIHJldHVybjsKLQotICAgIEFMT0dJKCJMb2FkZWQgYXVkaW8gcG9saWN5IGZyb20gJXMgKCVzKSIsIG1vZHVsZS0+bmFtZSwgbW9kdWxlLT5pZCk7Ci0KLSAgICAvLyBsb2FkIGF1ZGlvIHByZSBwcm9jZXNzaW5nIG1vZHVsZXMKLSAgICBpZiAoYWNjZXNzKEFVRElPX0VGRkVDVF9WRU5ET1JfQ09ORklHX0ZJTEUsIFJfT0spID09IDApIHsKLSAgICAgICAgbG9hZFByZVByb2Nlc3NvckNvbmZpZyhBVURJT19FRkZFQ1RfVkVORE9SX0NPTkZJR19GSUxFKTsKLSAgICB9IGVsc2UgaWYgKGFjY2VzcyhBVURJT19FRkZFQ1RfREVGQVVMVF9DT05GSUdfRklMRSwgUl9PSykgPT0gMCkgewotICAgICAgICBsb2FkUHJlUHJvY2Vzc29yQ29uZmlnKEFVRElPX0VGRkVDVF9ERUZBVUxUX0NPTkZJR19GSUxFKTsKLSAgICB9Ci19Ci0KLUF1ZGlvUG9saWN5U2VydmljZTo6fkF1ZGlvUG9saWN5U2VydmljZSgpCi17Ci0gICAgbVRvbmVQbGF5YmFja1RocmVhZC0+ZXhpdCgpOwotICAgIG1Ub25lUGxheWJhY2tUaHJlYWQuY2xlYXIoKTsKLSAgICBtQXVkaW9Db21tYW5kVGhyZWFkLT5leGl0KCk7Ci0gICAgbUF1ZGlvQ29tbWFuZFRocmVhZC5jbGVhcigpOwotCi0KLSAgICAvLyByZWxlYXNlIGF1ZGlvIHByZSBwcm9jZXNzaW5nIHJlc291cmNlcwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0U291cmNlcy5zaXplKCk7IGkrKykgewotICAgICAgICBkZWxldGUgbUlucHV0U291cmNlcy52YWx1ZUF0KGkpOwotICAgIH0KLSAgICBtSW5wdXRTb3VyY2VzLmNsZWFyKCk7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbUlucHV0cy52YWx1ZUF0KGkpLT5tRWZmZWN0cy5jbGVhcigpOwotICAgICAgICBkZWxldGUgbUlucHV0cy52YWx1ZUF0KGkpOwotICAgIH0KLSAgICBtSW5wdXRzLmNsZWFyKCk7Ci0KLSAgICBpZiAobXBBdWRpb1BvbGljeSAhPSBOVUxMICYmIG1wQXVkaW9Qb2xpY3lEZXYgIT0gTlVMTCkKLSAgICAgICAgbXBBdWRpb1BvbGljeURldi0+ZGVzdHJveV9hdWRpb19wb2xpY3kobXBBdWRpb1BvbGljeURldiwgbXBBdWRpb1BvbGljeSk7Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3lEZXYgIT0gTlVMTCkKLSAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9jbG9zZShtcEF1ZGlvUG9saWN5RGV2KTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykKLXsKLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgaWYgKCFhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkgJiYgIWF1ZGlvX2lzX2lucHV0X2RldmljZShkZXZpY2UpKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIGlmIChzdGF0ZSAhPSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSAmJgotICAgICAgICAgICAgc3RhdGUgIT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSIpOwotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnNldF9kZXZpY2VfY29ubmVjdGlvbl9zdGF0ZShtcEF1ZGlvUG9saWN5LCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwgZGV2aWNlX2FkZHJlc3MpOwotfQotCi1hdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEU7Ci0gICAgfQotICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5nZXRfZGV2aWNlX2Nvbm5lY3Rpb25fc3RhdGUobXBBdWRpb1BvbGljeSwgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2FkZHJlc3MpOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IHN0YXRlKQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIGlmICghc2V0dGluZ3NBbGxvd2VkKCkpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLSAgICBpZiAodWludDMyX3Qoc3RhdGUpID49IEFVRElPX01PREVfQ05UKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgQUxPR1YoInNldFBob25lU3RhdGUoKSIpOwotCi0gICAgLy8gVE9ETzogY2hlY2sgaWYgaXQgaXMgbW9yZSBhcHByb3ByaWF0ZSB0byBkbyBpdCBpbiBwbGF0Zm9ybSBzcGVjaWZpYyBwb2xpY3kgbWFuYWdlcgotICAgIEF1ZGlvU3lzdGVtOjpzZXRNb2RlKHN0YXRlKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgbXBBdWRpb1BvbGljeS0+c2V0X3Bob25lX3N0YXRlKG1wQXVkaW9Qb2xpY3ksIHN0YXRlKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykKLXsKLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgaWYgKHVzYWdlIDwgMCB8fCB1c2FnZSA+PSBBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBpZiAoY29uZmlnIDwgMCB8fCBjb25maWcgPj0gQVVESU9fUE9MSUNZX0ZPUkNFX0NGR19DTlQpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgQUxPR1YoInNldEZvcmNlVXNlKCkiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIG1wQXVkaW9Qb2xpY3ktPnNldF9mb3JjZV91c2UobXBBdWRpb1BvbGljeSwgdXNhZ2UsIGNvbmZpZyk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1hdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9GT1JDRV9OT05FOwotICAgIH0KLSAgICBpZiAodXNhZ2UgPCAwIHx8IHVzYWdlID49IEFVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UKSB7Ci0gICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORTsKLSAgICB9Ci0gICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmdldF9mb3JjZV91c2UobXBBdWRpb1BvbGljeSwgdXNhZ2UpOwotfQotCi1hdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCi17Ci0gICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgQUxPR1YoImdldE91dHB1dCgpIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+Z2V0X291dHB1dChtcEF1ZGlvUG9saWN5LCBzdHJlYW0sIHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZsYWdzLCBvZmZsb2FkSW5mbyk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCi17Ci0gICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBBTE9HVigic3RhcnRPdXRwdXQoKSIpOwotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnN0YXJ0X291dHB1dChtcEF1ZGlvUG9saWN5LCBvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCi17Ci0gICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBBTE9HVigic3RvcE91dHB1dCgpIik7Ci0gICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnN0b3BPdXRwdXRDb21tYW5kKG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190ICBBdWRpb1BvbGljeVNlcnZpY2U6OmRvU3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbikKLXsKLSAgICBBTE9HVigiZG9TdG9wT3V0cHV0IGZyb20gdGlkICVkIiwgZ2V0dGlkKCkpOwotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnN0b3Bfb3V0cHV0KG1wQXVkaW9Qb2xpY3ksIG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBBTE9HVigicmVsZWFzZU91dHB1dCgpIik7Ci0gICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnJlbGVhc2VPdXRwdXRDb21tYW5kKG91dHB1dCk7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb1JlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQotewotICAgIEFMT0dWKCJkb1JlbGVhc2VPdXRwdXQgZnJvbSB0aWQgJWQiLCBnZXR0aWQoKSk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBtcEF1ZGlvUG9saWN5LT5yZWxlYXNlX291dHB1dChtcEF1ZGlvUG9saWN5LCBvdXRwdXQpOwotfQotCi1hdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldElucHV0KGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9TZXNzaW9uKQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIC8vIGFscmVhZHkgY2hlY2tlZCBieSBjbGllbnQsIGJ1dCBkb3VibGUtY2hlY2sgaW4gY2FzZSB0aGUgY2xpZW50IHdyYXBwZXIgaXMgYnlwYXNzZWQKLSAgICBpZiAoaW5wdXRTb3VyY2UgPj0gQVVESU9fU09VUkNFX0NOVCAmJiBpbnB1dFNvdXJjZSAhPSBBVURJT19TT1VSQ0VfSE9UV09SRCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZiAoKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSAmJiAhY2FwdHVyZUhvdHdvcmRBbGxvd2VkKCkpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAvLyB0aGUgYXVkaW9faW5fYWNvdXN0aWNzX3QgcGFyYW1ldGVyIGlzIGlnbm9yZWQgYnkgZ2V0X2lucHV0KCkKLSAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IG1wQXVkaW9Qb2xpY3ktPmdldF9pbnB1dChtcEF1ZGlvUG9saWN5LCBpbnB1dFNvdXJjZSwgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBjaGFubmVsTWFzaywgKGF1ZGlvX2luX2Fjb3VzdGljc190KSAwKTsKLQotICAgIGlmIChpbnB1dCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBpbnB1dDsKLSAgICB9Ci0gICAgLy8gY3JlYXRlIGF1ZGlvIHByZSBwcm9jZXNzb3JzIGFjY29yZGluZyB0byBpbnB1dCBzb3VyY2UKLSAgICBhdWRpb19zb3VyY2VfdCBhbGlhc1NvdXJjZSA9IChpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OIDogaW5wdXRTb3VyY2U7Ci0KLSAgICBzc2l6ZV90IGluZGV4ID0gbUlucHV0U291cmNlcy5pbmRleE9mS2V5KGFsaWFzU291cmNlKTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybiBpbnB1dDsKLSAgICB9Ci0gICAgc3NpemVfdCBpZHggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW5wdXQpOwotICAgIElucHV0RGVzYyAqaW5wdXREZXNjOwotICAgIGlmIChpZHggPCAwKSB7Ci0gICAgICAgIGlucHV0RGVzYyA9IG5ldyBJbnB1dERlc2MoYXVkaW9TZXNzaW9uKTsKLSAgICAgICAgbUlucHV0cy5hZGQoaW5wdXQsIGlucHV0RGVzYyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGlkeCk7Ci0gICAgfQotCi0gICAgVmVjdG9yIDxFZmZlY3REZXNjICo+IGVmZmVjdHMgPSBtSW5wdXRTb3VyY2VzLnZhbHVlQXQoaW5kZXgpLT5tRWZmZWN0czsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgRWZmZWN0RGVzYyAqZWZmZWN0ID0gZWZmZWN0c1tpXTsKLSAgICAgICAgc3A8QXVkaW9FZmZlY3Q+IGZ4ID0gbmV3IEF1ZGlvRWZmZWN0KE5VTEwsICZlZmZlY3QtPm1VdWlkLCAtMSwgMCwgMCwgYXVkaW9TZXNzaW9uLCBpbnB1dCk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGZ4LT5pbml0Q2hlY2soKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiBzdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKLSAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gY3JlYXRlIEZ4ICVzIG9uIGlucHV0ICVkIiwgZWZmZWN0LT5tTmFtZSwgaW5wdXQpOwotICAgICAgICAgICAgLy8gZnggZ29lcyBvdXQgb2Ygc2NvcGUgYW5kIHN0cm9uZyByZWYgb24gQXVkaW9FZmZlY3QgaXMgcmVsZWFzZWQKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgZWZmZWN0LT5tUGFyYW1zLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICBmeC0+c2V0UGFyYW1ldGVyKGVmZmVjdC0+bVBhcmFtc1tqXSk7Ci0gICAgICAgIH0KLSAgICAgICAgaW5wdXREZXNjLT5tRWZmZWN0cy5hZGQoZngpOwotICAgIH0KLSAgICBzZXRQcmVQcm9jZXNzb3JFbmFibGVkKGlucHV0RGVzYywgdHJ1ZSk7Ci0gICAgcmV0dXJuIGlucHV0OwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpCi17Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLQotICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5zdGFydF9pbnB1dChtcEF1ZGlvUG9saWN5LCBpbnB1dCk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0KLSAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+c3RvcF9pbnB1dChtcEF1ZGlvUG9saWN5LCBpbnB1dCk7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpCi17Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgbXBBdWRpb1BvbGljeS0+cmVsZWFzZV9pbnB1dChtcEF1ZGlvUG9saWN5LCBpbnB1dCk7Ci0KLSAgICBzc2l6ZV90IGluZGV4ID0gbUlucHV0cy5pbmRleE9mS2V5KGlucHV0KTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgSW5wdXREZXNjICppbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpOwotICAgIHNldFByZVByb2Nlc3NvckVuYWJsZWQoaW5wdXREZXNjLCBmYWxzZSk7Ci0gICAgZGVsZXRlIGlucHV0RGVzYzsKLSAgICBtSW5wdXRzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWF4KQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIGlmICghc2V0dGluZ3NBbGxvd2VkKCkpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLSAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgbXBBdWRpb1BvbGljeS0+aW5pdF9zdHJlYW1fdm9sdW1lKG1wQXVkaW9Qb2xpY3ksIHN0cmVhbSwgaW5kZXhNaW4sIGluZGV4TWF4KTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKLXsKLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtcEF1ZGlvUG9saWN5LT5zZXRfc3RyZWFtX3ZvbHVtZV9pbmRleF9mb3JfZGV2aWNlKSB7Ci0gICAgICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5zZXRfc3RyZWFtX3ZvbHVtZV9pbmRleF9mb3JfZGV2aWNlKG1wQXVkaW9Qb2xpY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnNldF9zdHJlYW1fdm9sdW1lX2luZGV4KG1wQXVkaW9Qb2xpY3ksIHN0cmVhbSwgaW5kZXgpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKLXsKLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3ktPmdldF9zdHJlYW1fdm9sdW1lX2luZGV4X2Zvcl9kZXZpY2UpIHsKLSAgICAgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmdldF9zdHJlYW1fdm9sdW1lX2luZGV4X2Zvcl9kZXZpY2UobXBBdWRpb1BvbGljeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+Z2V0X3N0cmVhbV92b2x1bWVfaW5kZXgobXBBdWRpb1BvbGljeSwgc3RyZWFtLCBpbmRleCk7Ci0gICAgfQotfQotCi11aW50MzJfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotewotICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5nZXRfc3RyYXRlZ3lfZm9yX3N0cmVhbShtcEF1ZGlvUG9saWN5LCBzdHJlYW0pOwotfQotCi0vL2F1ZGlvIHBvbGljeTogdXNlIGF1ZGlvX2RldmljZV90IGFwcHJvcHJpYXRlbHkKLQotYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKLXsKLSAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7Ci0gICAgICAgIHJldHVybiAoYXVkaW9fZGV2aWNlc190KTA7Ci0gICAgfQotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIChhdWRpb19kZXZpY2VzX3QpMDsKLSAgICB9Ci0gICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmdldF9kZXZpY2VzX2Zvcl9zdHJlYW0obXBBdWRpb1BvbGljeSwgc3RyZWFtKTsKLX0KLQotYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRPdXRwdXRGb3JFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYykKLXsKLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5nZXRfb3V0cHV0X2Zvcl9lZmZlY3QobXBBdWRpb1BvbGljeSwgZGVzYyk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cmVnaXN0ZXJFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkKQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5yZWdpc3Rlcl9lZmZlY3QobXBBdWRpb1BvbGljeSwgZGVzYywgaW8sIHN0cmF0ZWd5LCBzZXNzaW9uLCBpZCk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6dW5yZWdpc3RlckVmZmVjdChpbnQgaWQpCi17Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnVucmVnaXN0ZXJfZWZmZWN0KG1wQXVkaW9Qb2xpY3ksIGlkKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRFZmZlY3RFbmFibGVkKGludCBpZCwgYm9vbCBlbmFibGVkKQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5zZXRfZWZmZWN0X2VuYWJsZWQobXBBdWRpb1BvbGljeSwgaWQsIGVuYWJsZWQpOwotfQotCi1ib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAotewotICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+aXNfc3RyZWFtX2FjdGl2ZShtcEF1ZGlvUG9saWN5LCBzdHJlYW0sIGluUGFzdE1zKTsKLX0KLQotYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OmlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmlzX3N0cmVhbV9hY3RpdmVfcmVtb3RlbHkobXBBdWRpb1BvbGljeSwgc3RyZWFtLCBpblBhc3RNcyk7Ci19Ci0KLWJvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0Ci17Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChtcEF1ZGlvUG9saWN5LT5pc19zb3VyY2VfYWN0aXZlID09IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5pc19zb3VyY2VfYWN0aXZlKG1wQXVkaW9Qb2xpY3ksIHNvdXJjZSk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZyhpbnQgYXVkaW9TZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3JzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjb3VudCkKLXsKLQotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgKmNvdW50ID0gMDsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0KLSAgICBzaXplX3QgaW5kZXg7Ci0gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbUlucHV0cy5zaXplKCk7IGluZGV4KyspIHsKLSAgICAgICAgaWYgKG1JbnB1dHMudmFsdWVBdChpbmRleCktPm1TZXNzaW9uSWQgPT0gYXVkaW9TZXNzaW9uKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoaW5kZXggPT0gbUlucHV0cy5zaXplKCkpIHsKLSAgICAgICAgKmNvdW50ID0gMDsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgVmVjdG9yPCBzcDxBdWRpb0VmZmVjdD4gPiBlZmZlY3RzID0gbUlucHV0cy52YWx1ZUF0KGluZGV4KS0+bUVmZmVjdHM7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkZXNjID0gZWZmZWN0c1tpXS0+ZGVzY3JpcHRvcigpOwotICAgICAgICBpZiAoaSA8ICpjb3VudCkgewotICAgICAgICAgICAgZGVzY3JpcHRvcnNbaV0gPSBkZXNjOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChlZmZlY3RzLnNpemUoKSA+ICpjb3VudCkgewotICAgICAgICBzdGF0dXMgPSBOT19NRU1PUlk7Ci0gICAgfQotICAgICpjb3VudCA9IGVmZmVjdHMuc2l6ZSgpOwotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pIHsKLSAgICBBTE9HVygiYmluZGVyRGllZCgpICVwLCBjYWxsaW5nIHBpZCAlZCIsIHdoby51bnNhZmVfZ2V0KCksCi0gICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpOwotfQotCi1zdGF0aWMgYm9vbCB0cnlMb2NrKE11dGV4JiBtdXRleCkKLXsKLSAgICBib29sIGxvY2tlZCA9IGZhbHNlOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwga0R1bXBMb2NrUmV0cmllczsgKytpKSB7Ci0gICAgICAgIGlmIChtdXRleC50cnlMb2NrKCkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIGxvY2tlZCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICB1c2xlZXAoa0R1bXBMb2NrU2xlZXBVcyk7Ci0gICAgfQotICAgIHJldHVybiBsb2NrZWQ7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6ZHVtcEludGVybmFscyhpbnQgZmQpCi17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJQb2xpY3lNYW5hZ2VyIEludGVyZmFjZTogJXBcbiIsIG1wQXVkaW9Qb2xpY3kpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJDb21tYW5kIFRocmVhZDogJXBcbiIsIG1BdWRpb0NvbW1hbmRUaHJlYWQuZ2V0KCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJUb25lcyBUaHJlYWQ6ICVwXG4iLCBtVG9uZVBsYXliYWNrVGhyZWFkLmdldCgpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCi17Ci0gICAgaWYgKCFkdW1wQWxsb3dlZCgpKSB7Ci0gICAgICAgIGR1bXBQZXJtaXNzaW9uRGVuaWFsKGZkKTsKLSAgICB9IGVsc2UgewotICAgICAgICBib29sIGxvY2tlZCA9IHRyeUxvY2sobUxvY2spOwotICAgICAgICBpZiAoIWxvY2tlZCkgewotICAgICAgICAgICAgU3RyaW5nOCByZXN1bHQoa0RlYWRsb2NrZWRTdHJpbmcpOwotICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBkdW1wSW50ZXJuYWxzKGZkKTsKLSAgICAgICAgaWYgKG1BdWRpb0NvbW1hbmRUaHJlYWQgIT0gMCkgewotICAgICAgICAgICAgbUF1ZGlvQ29tbWFuZFRocmVhZC0+ZHVtcChmZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Ub25lUGxheWJhY2tUaHJlYWQgIT0gMCkgewotICAgICAgICAgICAgbVRvbmVQbGF5YmFja1RocmVhZC0+ZHVtcChmZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobXBBdWRpb1BvbGljeSkgewotICAgICAgICAgICAgbXBBdWRpb1BvbGljeS0+ZHVtcChtcEF1ZGlvUG9saWN5LCBmZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobG9ja2VkKSBtTG9jay51bmxvY2soKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmR1bXBQZXJtaXNzaW9uRGVuaWFsKGludCBmZCkKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJQZXJtaXNzaW9uIERlbmlhbDogIgotICAgICAgICAgICAgImNhbid0IGR1bXAgQXVkaW9Qb2xpY3lTZXJ2aWNlIGZyb20gcGlkPSVkLCB1aWQ9JWRcbiIsCi0gICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCi0gICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRQcmVQcm9jZXNzb3JFbmFibGVkKGNvbnN0IElucHV0RGVzYyAqaW5wdXREZXNjLCBib29sIGVuYWJsZWQpCi17Ci0gICAgY29uc3QgVmVjdG9yPHNwPEF1ZGlvRWZmZWN0PiA+ICZmeFZlY3RvciA9IGlucHV0RGVzYy0+bUVmZmVjdHM7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmeFZlY3Rvci5zaXplKCk7IGkrKykgewotICAgICAgICBmeFZlY3Rvci5pdGVtQXQoaSktPnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6Om9uVHJhbnNhY3QoCi0gICAgICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgcmV0dXJuIEJuQXVkaW9Qb2xpY3lTZXJ2aWNlOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Ci19Ci0KLQotLy8gLS0tLS0tLS0tLS0gIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkIGltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0KLQotQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OkF1ZGlvQ29tbWFuZFRocmVhZChTdHJpbmc4IG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdwPEF1ZGlvUG9saWN5U2VydmljZT4mIHNlcnZpY2UpCi0gICAgOiBUaHJlYWQoZmFsc2UpLCBtTmFtZShuYW1lKSwgbVNlcnZpY2Uoc2VydmljZSkKLXsKLSAgICBtcFRvbmVHZW5lcmF0b3IgPSBOVUxMOwotfQotCi0KLUF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjp+QXVkaW9Db21tYW5kVGhyZWFkKCkKLXsKLSAgICBpZiAoIW1BdWRpb0NvbW1hbmRzLmlzRW1wdHkoKSkgewotICAgICAgICByZWxlYXNlX3dha2VfbG9jayhtTmFtZS5zdHJpbmcoKSk7Ci0gICAgfQotICAgIG1BdWRpb0NvbW1hbmRzLmNsZWFyKCk7Ci0gICAgZGVsZXRlIG1wVG9uZUdlbmVyYXRvcjsKLX0KLQotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6b25GaXJzdFJlZigpCi17Ci0gICAgcnVuKG1OYW1lLnN0cmluZygpLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKLX0KLQotYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6dGhyZWFkTG9vcCgpCi17Ci0gICAgbnNlY3NfdCB3YWl0VGltZSA9IElOVDY0X01BWDsKLQotICAgIG1Mb2NrLmxvY2soKTsKLSAgICB3aGlsZSAoIWV4aXRQZW5kaW5nKCkpCi0gICAgewotICAgICAgICB3aGlsZSAoIW1BdWRpb0NvbW1hbmRzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgbnNlY3NfdCBjdXJUaW1lID0gc3lzdGVtVGltZSgpOwotICAgICAgICAgICAgLy8gY29tbWFuZHMgYXJlIHNvcnRlZCBieSBpbmNyZWFzaW5nIHRpbWUgc3RhbXA6IGV4ZWN1dGUgdGhlbSBmcm9tIGluZGV4IDAgYW5kIHVwCi0gICAgICAgICAgICBpZiAobUF1ZGlvQ29tbWFuZHNbMF0tPm1UaW1lIDw9IGN1clRpbWUpIHsKLSAgICAgICAgICAgICAgICBBdWRpb0NvbW1hbmQgKmNvbW1hbmQgPSBtQXVkaW9Db21tYW5kc1swXTsKLSAgICAgICAgICAgICAgICBtQXVkaW9Db21tYW5kcy5yZW1vdmVBdCgwKTsKLSAgICAgICAgICAgICAgICBtTGFzdENvbW1hbmQgPSAqY29tbWFuZDsKLQotICAgICAgICAgICAgICAgIHN3aXRjaCAoY29tbWFuZC0+bUNvbW1hbmQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNUQVJUX1RPTkU6IHsKLSAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIFRvbmVEYXRhICpkYXRhID0gKFRvbmVEYXRhICopY29tbWFuZC0+bVBhcmFtOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzdGFydCB0b25lICVkIG9uIHN0cmVhbSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bVR5cGUsIGRhdGEtPm1TdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICBkZWxldGUgbXBUb25lR2VuZXJhdG9yOwotICAgICAgICAgICAgICAgICAgICBtcFRvbmVHZW5lcmF0b3IgPSBuZXcgVG9uZUdlbmVyYXRvcihkYXRhLT5tU3RyZWFtLCAxLjApOwotICAgICAgICAgICAgICAgICAgICBtcFRvbmVHZW5lcmF0b3ItPnN0YXJ0VG9uZShkYXRhLT5tVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBkYXRhOwotICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIH1icmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNUT1BfVE9ORTogewotICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc3RvcCB0b25lIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtcFRvbmVHZW5lcmF0b3IgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbXBUb25lR2VuZXJhdG9yLT5zdG9wVG9uZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1wVG9uZUdlbmVyYXRvcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1wVG9uZUdlbmVyYXRvciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwotICAgICAgICAgICAgICAgICAgICB9YnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTRVRfVk9MVU1FOiB7Ci0gICAgICAgICAgICAgICAgICAgIFZvbHVtZURhdGEgKmRhdGEgPSAoVm9sdW1lRGF0YSAqKWNvbW1hbmQtPm1QYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc2V0IHZvbHVtZSBzdHJlYW0gJWQsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWUgJWYsIG91dHB1dCAlZCIsIGRhdGEtPm1TdHJlYW0sIGRhdGEtPm1Wb2x1bWUsIGRhdGEtPm1JTyk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBBdWRpb1N5c3RlbTo6c2V0U3RyZWFtVm9sdW1lKGRhdGEtPm1TdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1Wb2x1bWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1JTyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb21tYW5kLT5tV2FpdFN0YXR1cykgewotICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bUNvbmQuc2lnbmFsKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tQ29uZC53YWl0UmVsYXRpdmUobUxvY2ssIGtBdWRpb0NvbW1hbmRUaW1lb3V0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkZWxldGUgZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU0VUX1BBUkFNRVRFUlM6IHsKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyc0RhdGEgKmRhdGEgPSAoUGFyYW1ldGVyc0RhdGEgKiljb21tYW5kLT5tUGFyYW07Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHNldCBwYXJhbWV0ZXJzIHN0cmluZyAlcywgaW8gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1LZXlWYWx1ZVBhaXJzLnN0cmluZygpLCBkYXRhLT5tSU8pOwotICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gQXVkaW9TeXN0ZW06OnNldFBhcmFtZXRlcnMoZGF0YS0+bUlPLCBkYXRhLT5tS2V5VmFsdWVQYWlycyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb21tYW5kLT5tV2FpdFN0YXR1cykgewotICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bUNvbmQuc2lnbmFsKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tQ29uZC53YWl0UmVsYXRpdmUobUxvY2ssIGtBdWRpb0NvbW1hbmRUaW1lb3V0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkZWxldGUgZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU0VUX1ZPSUNFX1ZPTFVNRTogewotICAgICAgICAgICAgICAgICAgICBWb2ljZVZvbHVtZURhdGEgKmRhdGEgPSAoVm9pY2VWb2x1bWVEYXRhICopY29tbWFuZC0+bVBhcmFtOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzZXQgdm9pY2Ugdm9sdW1lIHZvbHVtZSAlZiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bVZvbHVtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBBdWRpb1N5c3RlbTo6c2V0Vm9pY2VWb2x1bWUoZGF0YS0+bVZvbHVtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb21tYW5kLT5tV2FpdFN0YXR1cykgewotICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bUNvbmQuc2lnbmFsKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tQ29uZC53YWl0UmVsYXRpdmUobUxvY2ssIGtBdWRpb0NvbW1hbmRUaW1lb3V0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkZWxldGUgZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU1RPUF9PVVRQVVQ6IHsKLSAgICAgICAgICAgICAgICAgICAgU3RvcE91dHB1dERhdGEgKmRhdGEgPSAoU3RvcE91dHB1dERhdGEgKiljb21tYW5kLT5tUGFyYW07Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHN0b3Agb3V0cHV0ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tSU8pOwotICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb1BvbGljeVNlcnZpY2U+IHN2YyA9IG1TZXJ2aWNlLnByb21vdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN2YyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb1N0b3BPdXRwdXQoZGF0YS0+bUlPLCBkYXRhLT5tU3RyZWFtLCBkYXRhLT5tU2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGRhdGE7Ci0gICAgICAgICAgICAgICAgICAgIH1icmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFJFTEVBU0VfT1VUUFVUOiB7Ci0gICAgICAgICAgICAgICAgICAgIFJlbGVhc2VPdXRwdXREYXRhICpkYXRhID0gKFJlbGVhc2VPdXRwdXREYXRhICopY29tbWFuZC0+bVBhcmFtOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyByZWxlYXNlIG91dHB1dCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bUlPKTsKLSAgICAgICAgICAgICAgICAgICAgc3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiBzdmMgPSBtU2VydmljZS5wcm9tb3RlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdmMgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIHN2Yy0+ZG9SZWxlYXNlT3V0cHV0KGRhdGEtPm1JTyk7Ci0gICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGRhdGE7Ci0gICAgICAgICAgICAgICAgICAgIH1icmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBBTE9HVygiQXVkaW9Db21tYW5kVGhyZWFkKCkgdW5rbm93biBjb21tYW5kICVkIiwgY29tbWFuZC0+bUNvbW1hbmQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZWxldGUgY29tbWFuZDsKLSAgICAgICAgICAgICAgICB3YWl0VGltZSA9IElOVDY0X01BWDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgd2FpdFRpbWUgPSBtQXVkaW9Db21tYW5kc1swXS0+bVRpbWUgLSBjdXJUaW1lOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIHJlbGVhc2UgZGVsYXllZCBjb21tYW5kcyB3YWtlIGxvY2sKLSAgICAgICAgaWYgKG1BdWRpb0NvbW1hbmRzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmVsZWFzZV93YWtlX2xvY2sobU5hbWUuc3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBnb2luZyB0byBzbGVlcCIpOwotICAgICAgICBtV2FpdFdvcmtDVi53YWl0UmVsYXRpdmUobUxvY2ssIHdhaXRUaW1lKTsKLSAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHdha2luZyB1cCIpOwotICAgIH0KLSAgICBtTG9jay51bmxvY2soKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpkdW1wKGludCBmZCkKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkF1ZGlvQ29tbWFuZFRocmVhZCAlcCBEdW1wXG4iLCB0aGlzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0KLSAgICBib29sIGxvY2tlZCA9IHRyeUxvY2sobUxvY2spOwotICAgIGlmICghbG9ja2VkKSB7Ci0gICAgICAgIFN0cmluZzggcmVzdWx0MihrQ21kRGVhZGxvY2tlZFN0cmluZyk7Ci0gICAgICAgIHdyaXRlKGZkLCByZXN1bHQyLnN0cmluZygpLCByZXN1bHQyLnNpemUoKSk7Ci0gICAgfQotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBDb21tYW5kczpcbiIpOwotICAgIHJlc3VsdCA9IFN0cmluZzgoYnVmZmVyKTsKLSAgICByZXN1bHQuYXBwZW5kKCIgICBDb21tYW5kIFRpbWUgICAgICAgIFdhaXQgcFBhcmFtXG4iKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb0NvbW1hbmRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG1BdWRpb0NvbW1hbmRzW2ldLT5kdW1wKGJ1ZmZlciwgU0laRSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB9Ci0gICAgcmVzdWx0LmFwcGVuZCgiICBMYXN0IENvbW1hbmRcbiIpOwotICAgIG1MYXN0Q29tbWFuZC5kdW1wKGJ1ZmZlciwgU0laRSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0KLSAgICBpZiAobG9ja2VkKSBtTG9jay51bmxvY2soKTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6c3RhcnRUb25lQ29tbWFuZChUb25lR2VuZXJhdG9yOjp0b25lX3R5cGUgdHlwZSwKLSAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCi17Ci0gICAgQXVkaW9Db21tYW5kICpjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOwotICAgIGNvbW1hbmQtPm1Db21tYW5kID0gU1RBUlRfVE9ORTsKLSAgICBUb25lRGF0YSAqZGF0YSA9IG5ldyBUb25lRGF0YSgpOwotICAgIGRhdGEtPm1UeXBlID0gdHlwZTsKLSAgICBkYXRhLT5tU3RyZWFtID0gc3RyZWFtOwotICAgIGNvbW1hbmQtPm1QYXJhbSA9ICh2b2lkICopZGF0YTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGluc2VydENvbW1hbmRfbChjb21tYW5kKTsKLSAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHRvbmUgc3RhcnQgdHlwZSAlZCwgc3RyZWFtICVkIiwgdHlwZSwgc3RyZWFtKTsKLSAgICBtV2FpdFdvcmtDVi5zaWduYWwoKTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6c3RvcFRvbmVDb21tYW5kKCkKLXsKLSAgICBBdWRpb0NvbW1hbmQgKmNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7Ci0gICAgY29tbWFuZC0+bUNvbW1hbmQgPSBTVE9QX1RPTkU7Ci0gICAgY29tbWFuZC0+bVBhcmFtID0gTlVMTDsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGluc2VydENvbW1hbmRfbChjb21tYW5kKTsKLSAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHRvbmUgc3RvcCIpOwotICAgIG1XYWl0V29ya0NWLnNpZ25hbCgpOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6dm9sdW1lQ29tbWFuZChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQotewotICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotCi0gICAgQXVkaW9Db21tYW5kICpjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOwotICAgIGNvbW1hbmQtPm1Db21tYW5kID0gU0VUX1ZPTFVNRTsKLSAgICBWb2x1bWVEYXRhICpkYXRhID0gbmV3IFZvbHVtZURhdGEoKTsKLSAgICBkYXRhLT5tU3RyZWFtID0gc3RyZWFtOwotICAgIGRhdGEtPm1Wb2x1bWUgPSB2b2x1bWU7Ci0gICAgZGF0YS0+bUlPID0gb3V0cHV0OwotICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpbnNlcnRDb21tYW5kX2woY29tbWFuZCwgZGVsYXlNcyk7Ci0gICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyBzZXQgdm9sdW1lIHN0cmVhbSAlZCwgdm9sdW1lICVmLCBvdXRwdXQgJWQiLAotICAgICAgICAgICAgc3RyZWFtLCB2b2x1bWUsIG91dHB1dCk7Ci0gICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7Ci0gICAgaWYgKGNvbW1hbmQtPm1XYWl0U3RhdHVzKSB7Ci0gICAgICAgIGNvbW1hbmQtPm1Db25kLndhaXQobUxvY2spOwotICAgICAgICBzdGF0dXMgPSAgY29tbWFuZC0+bVN0YXR1czsKLSAgICAgICAgY29tbWFuZC0+bUNvbmQuc2lnbmFsKCk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpwYXJhbWV0ZXJzQ29tbWFuZChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXlWYWx1ZVBhaXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQotewotICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotCi0gICAgQXVkaW9Db21tYW5kICpjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOwotICAgIGNvbW1hbmQtPm1Db21tYW5kID0gU0VUX1BBUkFNRVRFUlM7Ci0gICAgUGFyYW1ldGVyc0RhdGEgKmRhdGEgPSBuZXcgUGFyYW1ldGVyc0RhdGEoKTsKLSAgICBkYXRhLT5tSU8gPSBpb0hhbmRsZTsKLSAgICBkYXRhLT5tS2V5VmFsdWVQYWlycyA9IFN0cmluZzgoa2V5VmFsdWVQYWlycyk7Ci0gICAgY29tbWFuZC0+bVBhcmFtID0gZGF0YTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGluc2VydENvbW1hbmRfbChjb21tYW5kLCBkZWxheU1zKTsKLSAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHNldCBwYXJhbWV0ZXIgc3RyaW5nICVzLCBpbyAlZCAsZGVsYXkgJWQiLAotICAgICAgICAgICAga2V5VmFsdWVQYWlycywgaW9IYW5kbGUsIGRlbGF5TXMpOwotICAgIG1XYWl0V29ya0NWLnNpZ25hbCgpOwotICAgIGlmIChjb21tYW5kLT5tV2FpdFN0YXR1cykgewotICAgICAgICBjb21tYW5kLT5tQ29uZC53YWl0KG1Mb2NrKTsKLSAgICAgICAgc3RhdHVzID0gIGNvbW1hbmQtPm1TdGF0dXM7Ci0gICAgICAgIGNvbW1hbmQtPm1Db25kLnNpZ25hbCgpOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6dm9pY2VWb2x1bWVDb21tYW5kKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5TXMpCi17Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0KLSAgICBBdWRpb0NvbW1hbmQgKmNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7Ci0gICAgY29tbWFuZC0+bUNvbW1hbmQgPSBTRVRfVk9JQ0VfVk9MVU1FOwotICAgIFZvaWNlVm9sdW1lRGF0YSAqZGF0YSA9IG5ldyBWb2ljZVZvbHVtZURhdGEoKTsKLSAgICBkYXRhLT5tVm9sdW1lID0gdm9sdW1lOwotICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpbnNlcnRDb21tYW5kX2woY29tbWFuZCwgZGVsYXlNcyk7Ci0gICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyBzZXQgdm9pY2Ugdm9sdW1lIHZvbHVtZSAlZiIsIHZvbHVtZSk7Ci0gICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7Ci0gICAgaWYgKGNvbW1hbmQtPm1XYWl0U3RhdHVzKSB7Ci0gICAgICAgIGNvbW1hbmQtPm1Db25kLndhaXQobUxvY2spOwotICAgICAgICBzdGF0dXMgPSAgY29tbWFuZC0+bVN0YXR1czsKLSAgICAgICAgY29tbWFuZC0+bUNvbmQuc2lnbmFsKCk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnN0b3BPdXRwdXRDb21tYW5kKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCi17Ci0gICAgQXVkaW9Db21tYW5kICpjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOwotICAgIGNvbW1hbmQtPm1Db21tYW5kID0gU1RPUF9PVVRQVVQ7Ci0gICAgU3RvcE91dHB1dERhdGEgKmRhdGEgPSBuZXcgU3RvcE91dHB1dERhdGEoKTsKLSAgICBkYXRhLT5tSU8gPSBvdXRwdXQ7Ci0gICAgZGF0YS0+bVN0cmVhbSA9IHN0cmVhbTsKLSAgICBkYXRhLT5tU2Vzc2lvbiA9IHNlc3Npb247Ci0gICAgY29tbWFuZC0+bVBhcmFtID0gKHZvaWQgKilkYXRhOwotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaW5zZXJ0Q29tbWFuZF9sKGNvbW1hbmQpOwotICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgc3RvcCBvdXRwdXQgJWQiLCBvdXRwdXQpOwotICAgIG1XYWl0V29ya0NWLnNpZ25hbCgpOwotfQotCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpyZWxlYXNlT3V0cHV0Q29tbWFuZChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCi17Ci0gICAgQXVkaW9Db21tYW5kICpjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOwotICAgIGNvbW1hbmQtPm1Db21tYW5kID0gUkVMRUFTRV9PVVRQVVQ7Ci0gICAgUmVsZWFzZU91dHB1dERhdGEgKmRhdGEgPSBuZXcgUmVsZWFzZU91dHB1dERhdGEoKTsKLSAgICBkYXRhLT5tSU8gPSBvdXRwdXQ7Ci0gICAgY29tbWFuZC0+bVBhcmFtID0gKHZvaWQgKilkYXRhOwotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaW5zZXJ0Q29tbWFuZF9sKGNvbW1hbmQpOwotICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgcmVsZWFzZSBvdXRwdXQgJWQiLCBvdXRwdXQpOwotICAgIG1XYWl0V29ya0NWLnNpZ25hbCgpOwotfQotCi0vLyBpbnNlcnRDb21tYW5kX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIG1Mb2NrIGhlbGQKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6Omluc2VydENvbW1hbmRfbChBdWRpb0NvbW1hbmQgKmNvbW1hbmQsIGludCBkZWxheU1zKQotewotICAgIHNzaXplX3QgaTsgIC8vIG5vdCBzaXplX3QgYmVjYXVzZSBpIHdpbGwgY291bnQgZG93biB0byAtMQotICAgIFZlY3RvciA8QXVkaW9Db21tYW5kICo+IHJlbW92ZWRDb21tYW5kczsKLSAgICBjb21tYW5kLT5tVGltZSA9IHN5c3RlbVRpbWUoKSArIG1pbGxpc2Vjb25kcyhkZWxheU1zKTsKLQotICAgIC8vIGFjcXVpcmUgd2FrZSBsb2NrIHRvIG1ha2Ugc3VyZSBkZWxheWVkIGNvbW1hbmRzIGFyZSBwcm9jZXNzZWQKLSAgICBpZiAobUF1ZGlvQ29tbWFuZHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIGFjcXVpcmVfd2FrZV9sb2NrKFBBUlRJQUxfV0FLRV9MT0NLLCBtTmFtZS5zdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgLy8gY2hlY2sgc2FtZSBwZW5kaW5nIGNvbW1hbmRzIHdpdGggbGF0ZXIgdGltZSBzdGFtcHMgYW5kIGVsaW1pbmF0ZSB0aGVtCi0gICAgZm9yIChpID0gbUF1ZGlvQ29tbWFuZHMuc2l6ZSgpLTE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgIEF1ZGlvQ29tbWFuZCAqY29tbWFuZDIgPSBtQXVkaW9Db21tYW5kc1tpXTsKLSAgICAgICAgLy8gY29tbWFuZHMgYXJlIHNvcnRlZCBieSBpbmNyZWFzaW5nIHRpbWUgc3RhbXA6IG5vIG5lZWQgdG8gc2NhbiB0aGUgcmVzdCBvZiBtQXVkaW9Db21tYW5kcwotICAgICAgICBpZiAoY29tbWFuZDItPm1UaW1lIDw9IGNvbW1hbmQtPm1UaW1lKSBicmVhazsKLSAgICAgICAgaWYgKGNvbW1hbmQyLT5tQ29tbWFuZCAhPSBjb21tYW5kLT5tQ29tbWFuZCkgY29udGludWU7Ci0KLSAgICAgICAgc3dpdGNoIChjb21tYW5kLT5tQ29tbWFuZCkgewotICAgICAgICBjYXNlIFNFVF9QQVJBTUVURVJTOiB7Ci0gICAgICAgICAgICBQYXJhbWV0ZXJzRGF0YSAqZGF0YSA9IChQYXJhbWV0ZXJzRGF0YSAqKWNvbW1hbmQtPm1QYXJhbTsKLSAgICAgICAgICAgIFBhcmFtZXRlcnNEYXRhICpkYXRhMiA9IChQYXJhbWV0ZXJzRGF0YSAqKWNvbW1hbmQyLT5tUGFyYW07Ci0gICAgICAgICAgICBpZiAoZGF0YS0+bUlPICE9IGRhdGEyLT5tSU8pIGJyZWFrOwotICAgICAgICAgICAgQUxPR1YoIkNvbXBhcmluZyBwYXJhbWV0ZXIgY29tbWFuZCAlcyB0byBuZXcgY29tbWFuZCAlcyIsCi0gICAgICAgICAgICAgICAgICAgIGRhdGEyLT5tS2V5VmFsdWVQYWlycy5zdHJpbmcoKSwgZGF0YS0+bUtleVZhbHVlUGFpcnMuc3RyaW5nKCkpOwotICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihkYXRhLT5tS2V5VmFsdWVQYWlycyk7Ci0gICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbTIgPSBBdWRpb1BhcmFtZXRlcihkYXRhMi0+bUtleVZhbHVlUGFpcnMpOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBwYXJhbS5zaXplKCk7IGorKykgewotICAgICAgICAgICAgICAgIFN0cmluZzgga2V5OwotICAgICAgICAgICAgICAgIFN0cmluZzggdmFsdWU7Ci0gICAgICAgICAgICAgICAgcGFyYW0uZ2V0QXQoaiwga2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBwYXJhbTIuc2l6ZSgpOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBrZXkyOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IHZhbHVlMjsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW0yLmdldEF0KGssIGtleTIsIHZhbHVlMik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChrZXkyID09IGtleSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0yLnJlbW92ZShrZXkyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJGaWx0ZXJpbmcgb3V0IHBhcmFtZXRlciAlcyIsIGtleTIuc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBpZiBhbGwga2V5cyBoYXZlIGJlZW4gZmlsdGVyZWQgb3V0LCByZW1vdmUgdGhlIGNvbW1hbmQuCi0gICAgICAgICAgICAvLyBvdGhlcndpc2UsIHVwZGF0ZSB0aGUga2V5IHZhbHVlIHBhaXJzCi0gICAgICAgICAgICBpZiAocGFyYW0yLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlZENvbW1hbmRzLmFkZChjb21tYW5kMik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRhdGEyLT5tS2V5VmFsdWVQYWlycyA9IHBhcmFtMi50b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29tbWFuZC0+bVRpbWUgPSBjb21tYW5kMi0+bVRpbWU7Ci0gICAgICAgICAgICAvLyBmb3JjZSBkZWxheU1zIHRvIG5vbiAwIHNvIHRoYXQgY29kZSBiZWxvdyBkb2VzIG5vdCByZXF1ZXN0IHRvIHdhaXQgZm9yCi0gICAgICAgICAgICAvLyBjb21tYW5kIHN0YXR1cyBhcyB0aGUgY29tbWFuZCBpcyBub3cgZGVsYXllZAotICAgICAgICAgICAgZGVsYXlNcyA9IDE7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBTRVRfVk9MVU1FOiB7Ci0gICAgICAgICAgICBWb2x1bWVEYXRhICpkYXRhID0gKFZvbHVtZURhdGEgKiljb21tYW5kLT5tUGFyYW07Ci0gICAgICAgICAgICBWb2x1bWVEYXRhICpkYXRhMiA9IChWb2x1bWVEYXRhICopY29tbWFuZDItPm1QYXJhbTsKLSAgICAgICAgICAgIGlmIChkYXRhLT5tSU8gIT0gZGF0YTItPm1JTykgYnJlYWs7Ci0gICAgICAgICAgICBpZiAoZGF0YS0+bVN0cmVhbSAhPSBkYXRhMi0+bVN0cmVhbSkgYnJlYWs7Ci0gICAgICAgICAgICBBTE9HVigiRmlsdGVyaW5nIG91dCB2b2x1bWUgY29tbWFuZCBvbiBvdXRwdXQgJWQgZm9yIHN0cmVhbSAlZCIsCi0gICAgICAgICAgICAgICAgICAgIGRhdGEtPm1JTywgZGF0YS0+bVN0cmVhbSk7Ci0gICAgICAgICAgICByZW1vdmVkQ29tbWFuZHMuYWRkKGNvbW1hbmQyKTsKLSAgICAgICAgICAgIGNvbW1hbmQtPm1UaW1lID0gY29tbWFuZDItPm1UaW1lOwotICAgICAgICAgICAgLy8gZm9yY2UgZGVsYXlNcyB0byBub24gMCBzbyB0aGF0IGNvZGUgYmVsb3cgZG9lcyBub3QgcmVxdWVzdCB0byB3YWl0IGZvcgotICAgICAgICAgICAgLy8gY29tbWFuZCBzdGF0dXMgYXMgdGhlIGNvbW1hbmQgaXMgbm93IGRlbGF5ZWQKLSAgICAgICAgICAgIGRlbGF5TXMgPSAxOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFNUQVJUX1RPTkU6Ci0gICAgICAgIGNhc2UgU1RPUF9UT05FOgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyByZW1vdmUgZmlsdGVyZWQgY29tbWFuZHMKLSAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHJlbW92ZWRDb21tYW5kcy5zaXplKCk7IGorKykgewotICAgICAgICAvLyByZW1vdmVkIGNvbW1hbmRzIGFsd2F5cyBoYXZlIHRpbWUgc3RhbXBzIGdyZWF0ZXIgdGhhbiBjdXJyZW50IGNvbW1hbmQKLSAgICAgICAgZm9yIChzaXplX3QgayA9IGkgKyAxOyBrIDwgbUF1ZGlvQ29tbWFuZHMuc2l6ZSgpOyBrKyspIHsKLSAgICAgICAgICAgIGlmIChtQXVkaW9Db21tYW5kc1trXSA9PSByZW1vdmVkQ29tbWFuZHNbal0pIHsKLSAgICAgICAgICAgICAgICBBTE9HVigic3VwcHJlc3NpbmcgY29tbWFuZDogJWQiLCBtQXVkaW9Db21tYW5kc1trXS0+bUNvbW1hbmQpOwotICAgICAgICAgICAgICAgIG1BdWRpb0NvbW1hbmRzLnJlbW92ZUF0KGspOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJlbW92ZWRDb21tYW5kcy5jbGVhcigpOwotCi0gICAgLy8gd2FpdCBmb3Igc3RhdHVzIG9ubHkgaWYgZGVsYXkgaXMgMAotICAgIGlmIChkZWxheU1zID09IDApIHsKLSAgICAgICAgY29tbWFuZC0+bVdhaXRTdGF0dXMgPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvbW1hbmQtPm1XYWl0U3RhdHVzID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gaW5zZXJ0IGNvbW1hbmQgYXQgdGhlIHJpZ2h0IHBsYWNlIGFjY29yZGluZyB0byBpdHMgdGltZSBzdGFtcAotICAgIEFMT0dWKCJpbnNlcnRpbmcgY29tbWFuZDogJWQgYXQgaW5kZXggJWQsIG51bSBjb21tYW5kcyAlZCIsCi0gICAgICAgICAgICBjb21tYW5kLT5tQ29tbWFuZCwgKGludClpKzEsIG1BdWRpb0NvbW1hbmRzLnNpemUoKSk7Ci0gICAgbUF1ZGlvQ29tbWFuZHMuaW5zZXJ0QXQoY29tbWFuZCwgaSArIDEpOwotfQotCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpleGl0KCkKLXsKLSAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkOjpleGl0Iik7Ci0gICAgewotICAgICAgICBBdXRvTXV0ZXggX2wobUxvY2spOwotICAgICAgICByZXF1ZXN0RXhpdCgpOwotICAgICAgICBtV2FpdFdvcmtDVi5zaWduYWwoKTsKLSAgICB9Ci0gICAgcmVxdWVzdEV4aXRBbmRXYWl0KCk7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OkF1ZGlvQ29tbWFuZDo6ZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplKQotewotICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIiAgICUwMmQgICAgICAlMDZkLiUwM2QgICUwMXUgICAgJXBcbiIsCi0gICAgICAgICAgICBtQ29tbWFuZCwKLSAgICAgICAgICAgIChpbnQpbnMycyhtVGltZSksCi0gICAgICAgICAgICAoaW50KW5zMm1zKG1UaW1lKSUxMDAwLAotICAgICAgICAgICAgbVdhaXRTdGF0dXMsCi0gICAgICAgICAgICBtUGFyYW0pOwotfQotCi0vKioqKioqKiBoZWxwZXJzIGZvciB0aGUgc2VydmljZV9vcHMgY2FsbGJhY2tzIGRlZmluZWQgYmVsb3cgKioqKioqKioqLwotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXlWYWx1ZVBhaXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpCi17Ci0gICAgbUF1ZGlvQ29tbWFuZFRocmVhZC0+cGFyYW1ldGVyc0NvbW1hbmQoaW9IYW5kbGUsIGtleVZhbHVlUGFpcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlNcyk7Ci19Ci0KLWludCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2b2x1bWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQotewotICAgIHJldHVybiAoaW50KW1BdWRpb0NvbW1hbmRUaHJlYWQtPnZvbHVtZUNvbW1hbmQoc3RyZWFtLCB2b2x1bWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsIGRlbGF5TXMpOwotfQotCi1pbnQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydFRvbmUoYXVkaW9fcG9saWN5X3RvbmVfdCB0b25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotewotICAgIGlmICh0b25lICE9IEFVRElPX1BPTElDWV9UT05FX0lOX0NBTExfTk9USUZJQ0FUSU9OKQotICAgICAgICBBTE9HRSgic3RhcnRUb25lOiBpbGxlZ2FsIHRvbmUgcmVxdWVzdGVkICglZCkiLCB0b25lKTsKLSAgICBpZiAoc3RyZWFtICE9IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKQotICAgICAgICBBTE9HRSgic3RhcnRUb25lOiBpbGxlZ2FsIHN0cmVhbSAoJWQpIHJlcXVlc3RlZCBmb3IgdG9uZSAlZCIsIHN0cmVhbSwKLSAgICAgICAgICAgIHRvbmUpOwotICAgIG1Ub25lUGxheWJhY2tUaHJlYWQtPnN0YXJ0VG9uZUNvbW1hbmQoVG9uZUdlbmVyYXRvcjo6VE9ORV9TVVBfQ0FMTF9XQUlUSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpOwotICAgIHJldHVybiAwOwotfQotCi1pbnQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wVG9uZSgpCi17Ci0gICAgbVRvbmVQbGF5YmFja1RocmVhZC0+c3RvcFRvbmVDb21tYW5kKCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5TXMpCi17Ci0gICAgcmV0dXJuIChpbnQpbUF1ZGlvQ29tbWFuZFRocmVhZC0+dm9pY2VWb2x1bWVDb21tYW5kKHZvbHVtZSwgZGVsYXlNcyk7Ci19Ci0KLWJvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc09mZmxvYWRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QmIGluZm8pCi17Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICBBTE9HVigibXBBdWRpb1BvbGljeSA9PSBOVUxMIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAobXBBdWRpb1BvbGljeS0+aXNfb2ZmbG9hZF9zdXBwb3J0ZWQgPT0gTlVMTCkgewotICAgICAgICBBTE9HVigiSEFMIGRvZXMgbm90IGltcGxlbWVudCBpc19vZmZsb2FkX3N1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmlzX29mZmxvYWRfc3VwcG9ydGVkKG1wQXVkaW9Qb2xpY3ksICZpbmZvKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQXVkaW8gcHJlLXByb2Nlc3NpbmcgY29uZmlndXJhdGlvbgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vKnN0YXRpYyovIGNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BvbGljeVNlcnZpY2U6OmtJbnB1dFNvdXJjZU5hbWVzW0FVRElPX1NPVVJDRV9DTlQgLTFdID0gewotICAgIE1JQ19TUkNfVEFHLAotICAgIFZPSUNFX1VMX1NSQ19UQUcsCi0gICAgVk9JQ0VfRExfU1JDX1RBRywKLSAgICBWT0lDRV9DQUxMX1NSQ19UQUcsCi0gICAgQ0FNQ09SREVSX1NSQ19UQUcsCi0gICAgVk9JQ0VfUkVDX1NSQ19UQUcsCi0gICAgVk9JQ0VfQ09NTV9TUkNfVEFHCi19OwotCi0vLyByZXR1cm5zIHRoZSBhdWRpb19zb3VyY2VfdCBlbnVtIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGlucHV0IHNvdXJjZSBuYW1lIG9yCi0vLyBBVURJT19TT1VSQ0VfQ05UIGlzIG5vIG1hdGNoIGZvdW5kCi1hdWRpb19zb3VyY2VfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmlucHV0U291cmNlTmFtZVRvRW51bShjb25zdCBjaGFyICpuYW1lKQotewotICAgIGludCBpOwotICAgIGZvciAoaSA9IEFVRElPX1NPVVJDRV9NSUM7IGkgPCBBVURJT19TT1VSQ0VfQ05UOyBpKyspIHsKLSAgICAgICAgaWYgKHN0cmNtcChuYW1lLCBrSW5wdXRTb3VyY2VOYW1lc1tpIC0gQVVESU9fU09VUkNFX01JQ10pID09IDApIHsKLSAgICAgICAgICAgIEFMT0dWKCJpbnB1dFNvdXJjZU5hbWVUb0VudW0gZm91bmQgc291cmNlICVzICVkIiwgbmFtZSwgaSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gKGF1ZGlvX3NvdXJjZV90KWk7Ci19Ci0KLXNpemVfdCBBdWRpb1BvbGljeVNlcnZpY2U6Omdyb3dQYXJhbVNpemUoY2hhciAqcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmN1clNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqdG90U2l6ZSkKLXsKLSAgICAvLyAqY3VyU2l6ZSBpcyBhdCBsZWFzdCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgMiAqIHNpemVvZihpbnQpCi0gICAgc2l6ZV90IHBvcyA9ICgoKmN1clNpemUgLSAxICkgLyBzaXplICsgMSkgKiBzaXplOwotCi0gICAgaWYgKHBvcyArIHNpemUgPiAqdG90U2l6ZSkgewotICAgICAgICB3aGlsZSAocG9zICsgc2l6ZSA+ICp0b3RTaXplKSB7Ci0gICAgICAgICAgICAqdG90U2l6ZSArPSAoKCp0b3RTaXplICsgNykgLyA4KSAqIDQ7Ci0gICAgICAgIH0KLSAgICAgICAgcGFyYW0gPSAoY2hhciAqKXJlYWxsb2MocGFyYW0sICp0b3RTaXplKTsKLSAgICB9Ci0gICAgKmN1clNpemUgPSBwb3MgKyBzaXplOwotICAgIHJldHVybiBwb3M7Ci19Ci0KLXNpemVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlYWRQYXJhbVZhbHVlKGNub2RlICpub2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmN1clNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnRvdFNpemUpCi17Ci0gICAgaWYgKHN0cm5jbXAobm9kZS0+bmFtZSwgU0hPUlRfVEFHLCBzaXplb2YoU0hPUlRfVEFHKSArIDEpID09IDApIHsKLSAgICAgICAgc2l6ZV90IHBvcyA9IGdyb3dQYXJhbVNpemUocGFyYW0sIHNpemVvZihzaG9ydCksIGN1clNpemUsIHRvdFNpemUpOwotICAgICAgICAqKHNob3J0ICopKChjaGFyICopcGFyYW0gKyBwb3MpID0gKHNob3J0KWF0b2kobm9kZS0+dmFsdWUpOwotICAgICAgICBBTE9HVigicmVhZFBhcmFtVmFsdWUoKSByZWFkaW5nIHNob3J0ICVkIiwgKihzaG9ydCAqKSgoY2hhciAqKXBhcmFtICsgcG9zKSk7Ci0gICAgICAgIHJldHVybiBzaXplb2Yoc2hvcnQpOwotICAgIH0gZWxzZSBpZiAoc3RybmNtcChub2RlLT5uYW1lLCBJTlRfVEFHLCBzaXplb2YoSU5UX1RBRykgKyAxKSA9PSAwKSB7Ci0gICAgICAgIHNpemVfdCBwb3MgPSBncm93UGFyYW1TaXplKHBhcmFtLCBzaXplb2YoaW50KSwgY3VyU2l6ZSwgdG90U2l6ZSk7Ci0gICAgICAgICooaW50ICopKChjaGFyICopcGFyYW0gKyBwb3MpID0gYXRvaShub2RlLT52YWx1ZSk7Ci0gICAgICAgIEFMT0dWKCJyZWFkUGFyYW1WYWx1ZSgpIHJlYWRpbmcgaW50ICVkIiwgKihpbnQgKikoKGNoYXIgKilwYXJhbSArIHBvcykpOwotICAgICAgICByZXR1cm4gc2l6ZW9mKGludCk7Ci0gICAgfSBlbHNlIGlmIChzdHJuY21wKG5vZGUtPm5hbWUsIEZMT0FUX1RBRywgc2l6ZW9mKEZMT0FUX1RBRykgKyAxKSA9PSAwKSB7Ci0gICAgICAgIHNpemVfdCBwb3MgPSBncm93UGFyYW1TaXplKHBhcmFtLCBzaXplb2YoZmxvYXQpLCBjdXJTaXplLCB0b3RTaXplKTsKLSAgICAgICAgKihmbG9hdCAqKSgoY2hhciAqKXBhcmFtICsgcG9zKSA9IChmbG9hdClhdG9mKG5vZGUtPnZhbHVlKTsKLSAgICAgICAgQUxPR1YoInJlYWRQYXJhbVZhbHVlKCkgcmVhZGluZyBmbG9hdCAlZiIsKihmbG9hdCAqKSgoY2hhciAqKXBhcmFtICsgcG9zKSk7Ci0gICAgICAgIHJldHVybiBzaXplb2YoZmxvYXQpOwotICAgIH0gZWxzZSBpZiAoc3RybmNtcChub2RlLT5uYW1lLCBCT09MX1RBRywgc2l6ZW9mKEJPT0xfVEFHKSArIDEpID09IDApIHsKLSAgICAgICAgc2l6ZV90IHBvcyA9IGdyb3dQYXJhbVNpemUocGFyYW0sIHNpemVvZihib29sKSwgY3VyU2l6ZSwgdG90U2l6ZSk7Ci0gICAgICAgIGlmIChzdHJuY21wKG5vZGUtPnZhbHVlLCAiZmFsc2UiLCBzdHJsZW4oImZhbHNlIikgKyAxKSA9PSAwKSB7Ci0gICAgICAgICAgICAqKGJvb2wgKikoKGNoYXIgKilwYXJhbSArIHBvcykgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICooYm9vbCAqKSgoY2hhciAqKXBhcmFtICsgcG9zKSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoInJlYWRQYXJhbVZhbHVlKCkgcmVhZGluZyBib29sICVzIiwqKGJvb2wgKikoKGNoYXIgKilwYXJhbSArIHBvcykgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgICAgcmV0dXJuIHNpemVvZihib29sKTsKLSAgICB9IGVsc2UgaWYgKHN0cm5jbXAobm9kZS0+bmFtZSwgU1RSSU5HX1RBRywgc2l6ZW9mKFNUUklOR19UQUcpICsgMSkgPT0gMCkgewotICAgICAgICBzaXplX3QgbGVuID0gc3Rybmxlbihub2RlLT52YWx1ZSwgRUZGRUNUX1NUUklOR19MRU5fTUFYKTsKLSAgICAgICAgaWYgKCpjdXJTaXplICsgbGVuICsgMSA+ICp0b3RTaXplKSB7Ci0gICAgICAgICAgICAqdG90U2l6ZSA9ICpjdXJTaXplICsgbGVuICsgMTsKLSAgICAgICAgICAgIHBhcmFtID0gKGNoYXIgKilyZWFsbG9jKHBhcmFtLCAqdG90U2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc3RybmNweShwYXJhbSArICpjdXJTaXplLCBub2RlLT52YWx1ZSwgbGVuKTsKLSAgICAgICAgKmN1clNpemUgKz0gbGVuOwotICAgICAgICBwYXJhbVsqY3VyU2l6ZV0gPSAnXDAnOwotICAgICAgICBBTE9HVigicmVhZFBhcmFtVmFsdWUoKSByZWFkaW5nIHN0cmluZyAlcyIsIHBhcmFtICsgKmN1clNpemUgLSBsZW4pOwotICAgICAgICByZXR1cm4gbGVuOwotICAgIH0KLSAgICBBTE9HVygicmVhZFBhcmFtVmFsdWUoKSB1bmtub3duIHBhcmFtIHR5cGUgJXMiLCBub2RlLT5uYW1lKTsKLSAgICByZXR1cm4gMDsKLX0KLQotZWZmZWN0X3BhcmFtX3QgKkF1ZGlvUG9saWN5U2VydmljZTo6bG9hZEVmZmVjdFBhcmFtZXRlcihjbm9kZSAqcm9vdCkKLXsKLSAgICBjbm9kZSAqcGFyYW07Ci0gICAgY25vZGUgKnZhbHVlOwotICAgIHNpemVfdCBjdXJTaXplID0gc2l6ZW9mKGVmZmVjdF9wYXJhbV90KTsKLSAgICBzaXplX3QgdG90U2l6ZSA9IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyAyICogc2l6ZW9mKGludCk7Ci0gICAgZWZmZWN0X3BhcmFtX3QgKmZ4X3BhcmFtID0gKGVmZmVjdF9wYXJhbV90ICopbWFsbG9jKHRvdFNpemUpOwotCi0gICAgcGFyYW0gPSBjb25maWdfZmluZChyb290LCBQQVJBTV9UQUcpOwotICAgIHZhbHVlID0gY29uZmlnX2ZpbmQocm9vdCwgVkFMVUVfVEFHKTsKLSAgICBpZiAocGFyYW0gPT0gTlVMTCAmJiB2YWx1ZSA9PSBOVUxMKSB7Ci0gICAgICAgIC8vIHRyeSB0byBwYXJzZSBzaW1wbGUgcGFyYW1ldGVyIGZvcm0ge2ludCBpbnR9Ci0gICAgICAgIHBhcmFtID0gcm9vdC0+Zmlyc3RfY2hpbGQ7Ci0gICAgICAgIGlmIChwYXJhbSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAvLyBOb3RlOiB0aGF0IGEgcGFpciBvZiByYW5kb20gc3RyaW5ncyBpcyByZWFkIGFzIDAgMAotICAgICAgICAgICAgaW50ICpwdHIgPSAoaW50ICopZnhfcGFyYW0tPmRhdGE7Ci0gICAgICAgICAgICBpbnQgKnB0cjIgPSAoaW50ICopKChjaGFyICopcGFyYW0gKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpKTsKLSAgICAgICAgICAgIEFMT0dXKCJsb2FkRWZmZWN0UGFyYW1ldGVyKCkgcHRyICVwIHB0cjIgJXAiLCBwdHIsIHB0cjIpOwotICAgICAgICAgICAgKnB0cisrID0gYXRvaShwYXJhbS0+bmFtZSk7Ci0gICAgICAgICAgICAqcHRyID0gYXRvaShwYXJhbS0+dmFsdWUpOwotICAgICAgICAgICAgZnhfcGFyYW0tPnBzaXplID0gc2l6ZW9mKGludCk7Ci0gICAgICAgICAgICBmeF9wYXJhbS0+dnNpemUgPSBzaXplb2YoaW50KTsKLSAgICAgICAgICAgIHJldHVybiBmeF9wYXJhbTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAocGFyYW0gPT0gTlVMTCB8fCB2YWx1ZSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCJsb2FkRWZmZWN0UGFyYW1ldGVyKCkgaW52YWxpZCBwYXJhbWV0ZXIgZGVzY3JpcHRpb24gJXMiLCByb290LT5uYW1lKTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICBmeF9wYXJhbS0+cHNpemUgPSAwOwotICAgIHBhcmFtID0gcGFyYW0tPmZpcnN0X2NoaWxkOwotICAgIHdoaWxlIChwYXJhbSkgewotICAgICAgICBBTE9HVigibG9hZEVmZmVjdFBhcmFtZXRlcigpIHJlYWRpbmcgcGFyYW0gb2YgdHlwZSAlcyIsIHBhcmFtLT5uYW1lKTsKLSAgICAgICAgc2l6ZV90IHNpemUgPSByZWFkUGFyYW1WYWx1ZShwYXJhbSwgKGNoYXIgKilmeF9wYXJhbSwgJmN1clNpemUsICZ0b3RTaXplKTsKLSAgICAgICAgaWYgKHNpemUgPT0gMCkgewotICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgfQotICAgICAgICBmeF9wYXJhbS0+cHNpemUgKz0gc2l6ZTsKLSAgICAgICAgcGFyYW0gPSBwYXJhbS0+bmV4dDsKLSAgICB9Ci0KLSAgICAvLyBhbGlnbiBzdGFydCBvZiB2YWx1ZSBmaWVsZCBvbiAzMiBiaXQgYm91bmRhcnkKLSAgICBjdXJTaXplID0gKChjdXJTaXplIC0gMSApIC8gc2l6ZW9mKGludCkgKyAxKSAqIHNpemVvZihpbnQpOwotCi0gICAgZnhfcGFyYW0tPnZzaXplID0gMDsKLSAgICB2YWx1ZSA9IHZhbHVlLT5maXJzdF9jaGlsZDsKLSAgICB3aGlsZSAodmFsdWUpIHsKLSAgICAgICAgQUxPR1YoImxvYWRFZmZlY3RQYXJhbWV0ZXIoKSByZWFkaW5nIHZhbHVlIG9mIHR5cGUgJXMiLCB2YWx1ZS0+bmFtZSk7Ci0gICAgICAgIHNpemVfdCBzaXplID0gcmVhZFBhcmFtVmFsdWUodmFsdWUsIChjaGFyICopZnhfcGFyYW0sICZjdXJTaXplLCAmdG90U2l6ZSk7Ci0gICAgICAgIGlmIChzaXplID09IDApIHsKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIH0KLSAgICAgICAgZnhfcGFyYW0tPnZzaXplICs9IHNpemU7Ci0gICAgICAgIHZhbHVlID0gdmFsdWUtPm5leHQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZ4X3BhcmFtOwotCi1lcnJvcjoKLSAgICBkZWxldGUgZnhfcGFyYW07Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpsb2FkRWZmZWN0UGFyYW1ldGVycyhjbm9kZSAqcm9vdCwgVmVjdG9yIDxlZmZlY3RfcGFyYW1fdCAqPiYgcGFyYW1zKQotewotICAgIGNub2RlICpub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7Ci0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgQUxPR1YoImxvYWRFZmZlY3RQYXJhbWV0ZXJzKCkgbG9hZGluZyBwYXJhbSAlcyIsIG5vZGUtPm5hbWUpOwotICAgICAgICBlZmZlY3RfcGFyYW1fdCAqcGFyYW0gPSBsb2FkRWZmZWN0UGFyYW1ldGVyKG5vZGUpOwotICAgICAgICBpZiAocGFyYW0gPT0gTlVMTCkgewotICAgICAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBwYXJhbXMuYWRkKHBhcmFtKTsKLSAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgfQotfQotCi1BdWRpb1BvbGljeVNlcnZpY2U6OklucHV0U291cmNlRGVzYyAqQXVkaW9Qb2xpY3lTZXJ2aWNlOjpsb2FkSW5wdXRTb3VyY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbm9kZSAqcm9vdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvciA8RWZmZWN0RGVzYyAqPiYgZWZmZWN0cykKLXsKLSAgICBjbm9kZSAqbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOwotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coImxvYWRJbnB1dFNvdXJjZSgpIGVtcHR5IGVsZW1lbnQgJXMiLCByb290LT5uYW1lKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIElucHV0U291cmNlRGVzYyAqc291cmNlID0gbmV3IElucHV0U291cmNlRGVzYygpOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIHNpemVfdCBpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZWZmZWN0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKHN0cm5jbXAoZWZmZWN0c1tpXS0+bU5hbWUsIG5vZGUtPm5hbWUsIEVGRkVDVF9TVFJJTkdfTEVOX01BWCkgPT0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJsb2FkSW5wdXRTb3VyY2UoKSBmb3VuZCBlZmZlY3QgJXMgaW4gbGlzdCIsIG5vZGUtPm5hbWUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChpID09IGVmZmVjdHMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBBTE9HVigibG9hZElucHV0U291cmNlKCkgZWZmZWN0ICVzIG5vdCBpbiBsaXN0Iiwgbm9kZS0+bmFtZSk7Ci0gICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIEVmZmVjdERlc2MgKmVmZmVjdCA9IG5ldyBFZmZlY3REZXNjKCplZmZlY3RzW2ldKTsgICAvLyBkZWVwIGNvcHkKLSAgICAgICAgbG9hZEVmZmVjdFBhcmFtZXRlcnMobm9kZSwgZWZmZWN0LT5tUGFyYW1zKTsKLSAgICAgICAgQUxPR1YoImxvYWRJbnB1dFNvdXJjZSgpIGFkZGluZyBlZmZlY3QgJXMgdXVpZCAlMDh4IiwgZWZmZWN0LT5tTmFtZSwgZWZmZWN0LT5tVXVpZC50aW1lTG93KTsKLSAgICAgICAgc291cmNlLT5tRWZmZWN0cy5hZGQoZWZmZWN0KTsKLSAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgfQotICAgIGlmIChzb3VyY2UtPm1FZmZlY3RzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCJsb2FkSW5wdXRTb3VyY2UoKSBubyB2YWxpZCBlZmZlY3RzIGZvdW5kIGluIHNvdXJjZSAlcyIsIHJvb3QtPm5hbWUpOwotICAgICAgICBkZWxldGUgc291cmNlOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIHNvdXJjZTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpsb2FkSW5wdXRTb3VyY2VzKGNub2RlICpyb290LCBjb25zdCBWZWN0b3IgPEVmZmVjdERlc2MgKj4mIGVmZmVjdHMpCi17Ci0gICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBQUkVQUk9DRVNTSU5HX1RBRyk7Ci0gICAgaWYgKG5vZGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0VOVDsKLSAgICB9Ci0gICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9IGlucHV0U291cmNlTmFtZVRvRW51bShub2RlLT5uYW1lKTsKLSAgICAgICAgaWYgKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfQ05UKSB7Ci0gICAgICAgICAgICBBTE9HVygibG9hZElucHV0U291cmNlcygpIGludmFsaWQgaW5wdXQgc291cmNlICVzIiwgbm9kZS0+bmFtZSk7Ci0gICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJsb2FkSW5wdXRTb3VyY2VzKCkgbG9hZGluZyBpbnB1dCBzb3VyY2UgJXMiLCBub2RlLT5uYW1lKTsKLSAgICAgICAgSW5wdXRTb3VyY2VEZXNjICpkZXNjID0gbG9hZElucHV0U291cmNlKG5vZGUsIGVmZmVjdHMpOwotICAgICAgICBpZiAoZGVzYyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIG1JbnB1dFNvdXJjZXMuYWRkKHNvdXJjZSwgZGVzYyk7Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLUF1ZGlvUG9saWN5U2VydmljZTo6RWZmZWN0RGVzYyAqQXVkaW9Qb2xpY3lTZXJ2aWNlOjpsb2FkRWZmZWN0KGNub2RlICpyb290KQotewotICAgIGNub2RlICpub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgVVVJRF9UQUcpOwotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGVmZmVjdF91dWlkX3QgdXVpZDsKLSAgICBpZiAoQXVkaW9FZmZlY3Q6OnN0cmluZ1RvR3VpZChub2RlLT52YWx1ZSwgJnV1aWQpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dXKCJsb2FkRWZmZWN0KCkgaW52YWxpZCB1dWlkICVzIiwgbm9kZS0+dmFsdWUpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBFZmZlY3REZXNjKHJvb3QtPm5hbWUsIHV1aWQpOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmxvYWRFZmZlY3RzKGNub2RlICpyb290LCBWZWN0b3IgPEVmZmVjdERlc2MgKj4mIGVmZmVjdHMpCi17Ci0gICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBFRkZFQ1RTX1RBRyk7Ci0gICAgaWYgKG5vZGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0VOVDsKLSAgICB9Ci0gICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIEFMT0dWKCJsb2FkRWZmZWN0cygpIGxvYWRpbmcgZWZmZWN0ICVzIiwgbm9kZS0+bmFtZSk7Ci0gICAgICAgIEVmZmVjdERlc2MgKmVmZmVjdCA9IGxvYWRFZmZlY3Qobm9kZSk7Ci0gICAgICAgIGlmIChlZmZlY3QgPT0gTlVMTCkgewotICAgICAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBlZmZlY3RzLmFkZChlZmZlY3QpOwotICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmxvYWRQcmVQcm9jZXNzb3JDb25maWcoY29uc3QgY2hhciAqcGF0aCkKLXsKLSAgICBjbm9kZSAqcm9vdDsKLSAgICBjaGFyICpkYXRhOwotCi0gICAgZGF0YSA9IChjaGFyICopbG9hZF9maWxlKHBhdGgsIE5VTEwpOwotICAgIGlmIChkYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHJvb3QgPSBjb25maWdfbm9kZSgiIiwgIiIpOwotICAgIGNvbmZpZ19sb2FkKHJvb3QsIGRhdGEpOwotCi0gICAgVmVjdG9yIDxFZmZlY3REZXNjICo+IGVmZmVjdHM7Ci0gICAgbG9hZEVmZmVjdHMocm9vdCwgZWZmZWN0cyk7Ci0gICAgbG9hZElucHV0U291cmNlcyhyb290LCBlZmZlY3RzKTsKLQotICAgIC8vIGRlbGV0ZSBlZmZlY3RzIHRvIGZpeCBtZW1vcnkgbGVhay4KLSAgICAvLyBhcyBlZmZlY3RzIGlzIGxvY2FsIHZhciBhbmQgdmFsZ3JpbmQgd291bGQgdHJlYXQgdGhpcyBhcyBtZW1vcnkgbGVhawotICAgIC8vIGFuZCBhbHRob3VnaCBpdCBvbmx5IGRpZCBpbiBtZWRpYXNlcnZlciBpbml0LCBidXQgZnJlZSBpdCBpbiBjYXNlIG1lZGlhc2VydmVyIHJlYm9vdAotICAgIHNpemVfdCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBlZmZlY3RzLnNpemUoKTsgaSsrKSB7Ci0gICAgICBkZWxldGUgZWZmZWN0c1tpXTsKLSAgICB9Ci0KLSAgICBjb25maWdfZnJlZShyb290KTsKLSAgICBmcmVlKHJvb3QpOwotICAgIGZyZWUoZGF0YSk7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8qIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcmZhY2UgdG8gdGhlIHBvbGljeSBtYW5hZ2VyICovCi1leHRlcm4gIkMiIHsKLQotCi1zdGF0aWMgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGFwc19sb2FkX2h3X21vZHVsZSh2b2lkICpzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIGlmIChhZiA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHJldHVybiBhZi0+bG9hZEh3TW9kdWxlKG5hbWUpOwotfQotCi0vLyBkZXByZWNhdGVkOiByZXBsYWNlZCBieSBhcHNfb3Blbl9vdXRwdXRfb25fbW9kdWxlKCkKLXN0YXRpYyBhdWRpb19pb19oYW5kbGVfdCBhcHNfb3Blbl9vdXRwdXQodm9pZCAqc2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpwRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcExhdGVuY3lNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpCi17Ci0gICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKLSAgICBpZiAoYWYgPT0gMCkgewotICAgICAgICBBTE9HVygiJXM6IGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIiwgX19mdW5jX18pOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gYWYtPm9wZW5PdXRwdXQoKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCkwLCBwRGV2aWNlcywgcFNhbXBsaW5nUmF0ZSwgcEZvcm1hdCwgcENoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwTGF0ZW5jeU1zLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBhdWRpb19pb19oYW5kbGVfdCBhcHNfb3Blbl9vdXRwdXRfb25fbW9kdWxlKHZvaWQgKnNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnBGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBMYXRlbmN5TXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykKLXsKLSAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIGlmIChhZiA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gYWYtPm9wZW5PdXRwdXQobW9kdWxlLCBwRGV2aWNlcywgcFNhbXBsaW5nUmF0ZSwgcEZvcm1hdCwgcENoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwTGF0ZW5jeU1zLCBmbGFncywgb2ZmbG9hZEluZm8pOwotfQotCi1zdGF0aWMgYXVkaW9faW9faGFuZGxlX3QgYXBzX29wZW5fZHVwX291dHB1dCh2b2lkICpzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MikKLXsKLSAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIGlmIChhZiA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gYWYtPm9wZW5EdXBsaWNhdGVPdXRwdXQob3V0cHV0MSwgb3V0cHV0Mik7Ci19Ci0KLXN0YXRpYyBpbnQgYXBzX2Nsb3NlX291dHB1dCh2b2lkICpzZXJ2aWNlLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCi17Ci0gICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKLSAgICBpZiAoYWYgPT0gMCkKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotCi0gICAgcmV0dXJuIGFmLT5jbG9zZU91dHB1dChvdXRwdXQpOwotfQotCi1zdGF0aWMgaW50IGFwc19zdXNwZW5kX291dHB1dCh2b2lkICpzZXJ2aWNlLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCi17Ci0gICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKLSAgICBpZiAoYWYgPT0gMCkgewotICAgICAgICBBTE9HVygiJXM6IGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIiwgX19mdW5jX18pOwotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIGFmLT5zdXNwZW5kT3V0cHV0KG91dHB1dCk7Ci19Ci0KLXN0YXRpYyBpbnQgYXBzX3Jlc3RvcmVfb3V0cHV0KHZvaWQgKnNlcnZpY2UsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKLXsKLSAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIGlmIChhZiA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gYWYtPnJlc3RvcmVPdXRwdXQob3V0cHV0KTsKLX0KLQotLy8gZGVwcmVjYXRlZDogcmVwbGFjZWQgYnkgYXBzX29wZW5faW5wdXRfb25fbW9kdWxlKCksIGFuZCBhY291c3RpY3MgcGFyYW1ldGVyIGlzIGlnbm9yZWQKLXN0YXRpYyBhdWRpb19pb19oYW5kbGVfdCBhcHNfb3Blbl9pbnB1dCh2b2lkICpzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqcERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnBGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKnBDaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbl9hY291c3RpY3NfdCBhY291c3RpY3MpCi17Ci0gICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKLSAgICBpZiAoYWYgPT0gMCkgewotICAgICAgICBBTE9HVygiJXM6IGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIiwgX19mdW5jX18pOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gYWYtPm9wZW5JbnB1dCgoYXVkaW9fbW9kdWxlX2hhbmRsZV90KTAsIHBEZXZpY2VzLCBwU2FtcGxpbmdSYXRlLCBwRm9ybWF0LCBwQ2hhbm5lbE1hc2spOwotfQotCi1zdGF0aWMgYXVkaW9faW9faGFuZGxlX3QgYXBzX29wZW5faW5wdXRfb25fbW9kdWxlKHZvaWQgKnNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqcERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqcEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKnBDaGFubmVsTWFzaykKLXsKLSAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIGlmIChhZiA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHJldHVybiBhZi0+b3BlbklucHV0KG1vZHVsZSwgcERldmljZXMsIHBTYW1wbGluZ1JhdGUsIHBGb3JtYXQsIHBDaGFubmVsTWFzayk7Ci19Ci0KLXN0YXRpYyBpbnQgYXBzX2Nsb3NlX2lucHV0KHZvaWQgKnNlcnZpY2UsIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQotewotICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7Ci0gICAgaWYgKGFmID09IDApCi0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLQotICAgIHJldHVybiBhZi0+Y2xvc2VJbnB1dChpbnB1dCk7Ci19Ci0KLXN0YXRpYyBpbnQgYXBzX3NldF9zdHJlYW1fb3V0cHV0KHZvaWQgKnNlcnZpY2UsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKLXsKLSAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIGlmIChhZiA9PSAwKQotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0KLSAgICByZXR1cm4gYWYtPnNldFN0cmVhbU91dHB1dChzdHJlYW0sIG91dHB1dCk7Ci19Ci0KLXN0YXRpYyBpbnQgYXBzX21vdmVfZWZmZWN0cyh2b2lkICpzZXJ2aWNlLCBpbnQgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgc3JjX291dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0X291dHB1dCkKLXsKLSAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIGlmIChhZiA9PSAwKQotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0KLSAgICByZXR1cm4gYWYtPm1vdmVFZmZlY3RzKHNlc3Npb24sIHNyY19vdXRwdXQsIGRzdF9vdXRwdXQpOwotfQotCi1zdGF0aWMgY2hhciAqIGFwc19nZXRfcGFyYW1ldGVycyh2b2lkICpzZXJ2aWNlLCBhdWRpb19pb19oYW5kbGVfdCBpb19oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5cykKLXsKLSAgICBTdHJpbmc4IHJlc3VsdCA9IEF1ZGlvU3lzdGVtOjpnZXRQYXJhbWV0ZXJzKGlvX2hhbmRsZSwgU3RyaW5nOChrZXlzKSk7Ci0gICAgcmV0dXJuIHN0cmR1cChyZXN1bHQuc3RyaW5nKCkpOwotfQotCi1zdGF0aWMgdm9pZCBhcHNfc2V0X3BhcmFtZXRlcnModm9pZCAqc2VydmljZSwgYXVkaW9faW9faGFuZGxlX3QgaW9faGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprdl9wYWlycywgaW50IGRlbGF5X21zKQotewotICAgIEF1ZGlvUG9saWN5U2VydmljZSAqYXVkaW9Qb2xpY3lTZXJ2aWNlID0gKEF1ZGlvUG9saWN5U2VydmljZSAqKXNlcnZpY2U7Ci0KLSAgICBhdWRpb1BvbGljeVNlcnZpY2UtPnNldFBhcmFtZXRlcnMoaW9faGFuZGxlLCBrdl9wYWlycywgZGVsYXlfbXMpOwotfQotCi1zdGF0aWMgaW50IGFwc19zZXRfc3RyZWFtX3ZvbHVtZSh2b2lkICpzZXJ2aWNlLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2b2x1bWUsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlfbXMpCi17Ci0gICAgQXVkaW9Qb2xpY3lTZXJ2aWNlICphdWRpb1BvbGljeVNlcnZpY2UgPSAoQXVkaW9Qb2xpY3lTZXJ2aWNlICopc2VydmljZTsKLQotICAgIHJldHVybiBhdWRpb1BvbGljeVNlcnZpY2UtPnNldFN0cmVhbVZvbHVtZShzdHJlYW0sIHZvbHVtZSwgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheV9tcyk7Ci19Ci0KLXN0YXRpYyBpbnQgYXBzX3N0YXJ0X3RvbmUodm9pZCAqc2VydmljZSwgYXVkaW9fcG9saWN5X3RvbmVfdCB0b25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCi17Ci0gICAgQXVkaW9Qb2xpY3lTZXJ2aWNlICphdWRpb1BvbGljeVNlcnZpY2UgPSAoQXVkaW9Qb2xpY3lTZXJ2aWNlICopc2VydmljZTsKLQotICAgIHJldHVybiBhdWRpb1BvbGljeVNlcnZpY2UtPnN0YXJ0VG9uZSh0b25lLCBzdHJlYW0pOwotfQotCi1zdGF0aWMgaW50IGFwc19zdG9wX3RvbmUodm9pZCAqc2VydmljZSkKLXsKLSAgICBBdWRpb1BvbGljeVNlcnZpY2UgKmF1ZGlvUG9saWN5U2VydmljZSA9IChBdWRpb1BvbGljeVNlcnZpY2UgKilzZXJ2aWNlOwotCi0gICAgcmV0dXJuIGF1ZGlvUG9saWN5U2VydmljZS0+c3RvcFRvbmUoKTsKLX0KLQotc3RhdGljIGludCBhcHNfc2V0X3ZvaWNlX3ZvbHVtZSh2b2lkICpzZXJ2aWNlLCBmbG9hdCB2b2x1bWUsIGludCBkZWxheV9tcykKLXsKLSAgICBBdWRpb1BvbGljeVNlcnZpY2UgKmF1ZGlvUG9saWN5U2VydmljZSA9IChBdWRpb1BvbGljeVNlcnZpY2UgKilzZXJ2aWNlOwotCi0gICAgcmV0dXJuIGF1ZGlvUG9saWN5U2VydmljZS0+c2V0Vm9pY2VWb2x1bWUodm9sdW1lLCBkZWxheV9tcyk7Ci19Ci0KLX07IC8vIGV4dGVybiAiQyIKLQotbmFtZXNwYWNlIHsKLSAgICBzdHJ1Y3QgYXVkaW9fcG9saWN5X3NlcnZpY2Vfb3BzIGFwc19vcHMgPSB7Ci0gICAgICAgIG9wZW5fb3V0cHV0ICAgICAgICAgICA6IGFwc19vcGVuX291dHB1dCwKLSAgICAgICAgb3Blbl9kdXBsaWNhdGVfb3V0cHV0IDogYXBzX29wZW5fZHVwX291dHB1dCwKLSAgICAgICAgY2xvc2Vfb3V0cHV0ICAgICAgICAgIDogYXBzX2Nsb3NlX291dHB1dCwKLSAgICAgICAgc3VzcGVuZF9vdXRwdXQgICAgICAgIDogYXBzX3N1c3BlbmRfb3V0cHV0LAotICAgICAgICByZXN0b3JlX291dHB1dCAgICAgICAgOiBhcHNfcmVzdG9yZV9vdXRwdXQsCi0gICAgICAgIG9wZW5faW5wdXQgICAgICAgICAgICA6IGFwc19vcGVuX2lucHV0LAotICAgICAgICBjbG9zZV9pbnB1dCAgICAgICAgICAgOiBhcHNfY2xvc2VfaW5wdXQsCi0gICAgICAgIHNldF9zdHJlYW1fdm9sdW1lICAgICA6IGFwc19zZXRfc3RyZWFtX3ZvbHVtZSwKLSAgICAgICAgc2V0X3N0cmVhbV9vdXRwdXQgICAgIDogYXBzX3NldF9zdHJlYW1fb3V0cHV0LAotICAgICAgICBzZXRfcGFyYW1ldGVycyAgICAgICAgOiBhcHNfc2V0X3BhcmFtZXRlcnMsCi0gICAgICAgIGdldF9wYXJhbWV0ZXJzICAgICAgICA6IGFwc19nZXRfcGFyYW1ldGVycywKLSAgICAgICAgc3RhcnRfdG9uZSAgICAgICAgICAgIDogYXBzX3N0YXJ0X3RvbmUsCi0gICAgICAgIHN0b3BfdG9uZSAgICAgICAgICAgICA6IGFwc19zdG9wX3RvbmUsCi0gICAgICAgIHNldF92b2ljZV92b2x1bWUgICAgICA6IGFwc19zZXRfdm9pY2Vfdm9sdW1lLAotICAgICAgICBtb3ZlX2VmZmVjdHMgICAgICAgICAgOiBhcHNfbW92ZV9lZmZlY3RzLAotICAgICAgICBsb2FkX2h3X21vZHVsZSAgICAgICAgOiBhcHNfbG9hZF9od19tb2R1bGUsCi0gICAgICAgIG9wZW5fb3V0cHV0X29uX21vZHVsZSA6IGFwc19vcGVuX291dHB1dF9vbl9tb2R1bGUsCi0gICAgICAgIG9wZW5faW5wdXRfb25fbW9kdWxlICA6IGFwc19vcGVuX2lucHV0X29uX21vZHVsZSwKLSAgICB9OwotfTsgLy8gbmFtZXNwYWNlIDx1bm5hbWVkPgotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5U2VydmljZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5U2VydmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTA1M2E5Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1BvbGljeVNlcnZpY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0FVRElPUE9MSUNZU0VSVklDRV9ICi0jZGVmaW5lIEFORFJPSURfQVVESU9QT0xJQ1lTRVJWSUNFX0gKLQotI2luY2x1ZGUgPGN1dGlscy9taXNjLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL2NvbmZpZ191dGlscy5oPgotI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDxiaW5kZXIvQmluZGVyU2VydmljZS5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19wb2xpY3kuaD4KLSNpbmNsdWRlIDxtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvVG9uZUdlbmVyYXRvci5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBBdWRpb1BvbGljeVNlcnZpY2UgOgotICAgIHB1YmxpYyBCaW5kZXJTZXJ2aWNlPEF1ZGlvUG9saWN5U2VydmljZT4sCi0gICAgcHVibGljIEJuQXVkaW9Qb2xpY3lTZXJ2aWNlLAotLy8gICAgcHVibGljIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlLAotICAgIHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudAotewotICAgIGZyaWVuZCBjbGFzcyBCaW5kZXJTZXJ2aWNlPEF1ZGlvUG9saWN5U2VydmljZT47Ci0KLXB1YmxpYzoKLSAgICAvLyBmb3IgQmluZGVyU2VydmljZQotICAgIHN0YXRpYyBjb25zdCBjaGFyICpnZXRTZXJ2aWNlTmFtZSgpIEFORFJPSURfQVBJIHsgcmV0dXJuICJtZWRpYS5hdWRpb19wb2xpY3kiOyB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKLQotICAgIC8vCi0gICAgLy8gQm5BdWRpb1BvbGljeVNlcnZpY2UgKHNlZSBBdWRpb1BvbGljeUludGVyZmFjZSBmb3IgbWV0aG9kIGRlc2NyaXB0aW9ucykKLSAgICAvLwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpOwotICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IGdldERldmljZUNvbm5lY3Rpb25TdGF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IHN0YXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpOwotICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpOwotICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uID0gMCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uID0gMCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKLSAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldElucHV0KGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvU2Vzc2lvbiA9IDApOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpOwotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNYXgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOwotCi0gICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7Ci0gICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7Ci0KLSAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dEZvckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5yZWdpc3RlckVmZmVjdChpbnQgaWQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCk7Ci0gICAgdmlydHVhbCBib29sIGlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBpc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBpc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0OwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeURlZmF1bHRQcmVQcm9jZXNzaW5nKGludCBhdWRpb1Nlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNvdW50KTsKLSAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBvblRyYW5zYWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKTsKLQotICAgIC8vIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50Ci0gICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKTsKLQotICAgIC8vCi0gICAgLy8gSGVscGVycyBmb3IgdGhlIHN0cnVjdCBhdWRpb19wb2xpY3lfc2VydmljZV9vcHMgaW1wbGVtZW50YXRpb24uCi0gICAgLy8gVGhpcyBpcyB1c2VkIGJ5IHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciBmb3IgY2VydGFpbiBvcGVyYXRpb25zIHRoYXQKLSAgICAvLyBhcmUgaW1wbGVtZW50ZWQgYnkgdGhlIHBvbGljeSBzZXJ2aWNlLgotICAgIC8vCi0gICAgdmlydHVhbCB2b2lkIHNldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5VmFsdWVQYWlycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2b2x1bWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydFRvbmUoYXVkaW9fcG9saWN5X3RvbmVfdCB0b25lLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wVG9uZSgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlNcyA9IDApOwotICAgIHZpcnR1YWwgYm9vbCBpc09mZmxvYWRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgJmNvbmZpZyk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGRvU3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24gPSAwKTsKLSAgICAgICAgICAgIHZvaWQgZG9SZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7Ci0KLXByaXZhdGU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeVNlcnZpY2UoKSBBTkRST0lEX0FQSTsKLSAgICB2aXJ0dWFsICAgICAgICAgICAgIH5BdWRpb1BvbGljeVNlcnZpY2UoKTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgZHVtcEludGVybmFscyhpbnQgZmQpOwotCi0gICAgLy8gVGhyZWFkIHVzZWQgZm9yIHRvbmUgcGxheWJhY2sgYW5kIHRvIHNlbmQgYXVkaW8gY29uZmlnIGNvbW1hbmRzIHRvIGF1ZGlvIGZsaW5nZXIKLSAgICAvLyBGb3IgdG9uZSBwbGF5YmFjaywgdXNpbmcgYSBzZXBhcmF0ZSB0aHJlYWQgaXMgbmVjZXNzYXJ5IHRvIGF2b2lkIGRlYWRsb2NrIHdpdGggbUxvY2sgYmVjYXVzZQotICAgIC8vIHN0YXJ0VG9uZSgpIGFuZCBzdG9wVG9uZSgpIGFyZSBub3JtYWxseSBjYWxsZWQgd2l0aCBtTG9jayBsb2NrZWQgYW5kIHJlcXVlc3RpbmcgYSB0b25lIHN0YXJ0Ci0gICAgLy8gb3Igc3RvcCB3aWxsIGNhdXNlIGNhbGxzIHRvIEF1ZGlvUG9saWN5U2VydmljZSBhbmQgYW4gYXR0ZW1wdCB0byBsb2NrIG1Mb2NrLgotICAgIC8vIEZvciBhdWRpbyBjb25maWcgY29tbWFuZHMsIGl0IGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGF1ZGlvIGZsaW5nZXIgcmVxdWlyZXMgdGhhdCB0aGUgY2FsbGluZwotICAgIC8vIHByb2Nlc3MgKHVzZXIpIGhhcyBwZXJtaXNzaW9uIHRvIG1vZGlmeSBhdWRpbyBzZXR0aW5ncy4KLSAgICBjbGFzcyBBdWRpb0NvbW1hbmRUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKLSAgICAgICAgY2xhc3MgQXVkaW9Db21tYW5kOwotICAgIHB1YmxpYzoKLQotICAgICAgICAvLyBjb21tYW5kcyBmb3IgdG9uZSBBdWRpb0NvbW1hbmQKLSAgICAgICAgZW51bSB7Ci0gICAgICAgICAgICBTVEFSVF9UT05FLAotICAgICAgICAgICAgU1RPUF9UT05FLAotICAgICAgICAgICAgU0VUX1ZPTFVNRSwKLSAgICAgICAgICAgIFNFVF9QQVJBTUVURVJTLAotICAgICAgICAgICAgU0VUX1ZPSUNFX1ZPTFVNRSwKLSAgICAgICAgICAgIFNUT1BfT1VUUFVULAotICAgICAgICAgICAgUkVMRUFTRV9PVVRQVVQKLSAgICAgICAgfTsKLQotICAgICAgICBBdWRpb0NvbW1hbmRUaHJlYWQgKFN0cmluZzggbmFtZSwgY29uc3Qgd3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiYgc2VydmljZSk7Ci0gICAgICAgIHZpcnR1YWwgICAgICAgICAgICAgfkF1ZGlvQ29tbWFuZFRocmVhZCgpOwotCi0gICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKTsKLQotICAgICAgICAvLyBUaHJlYWQgdmlydHVhbHMKLSAgICAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgb25GaXJzdFJlZigpOwotICAgICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICB0aHJlYWRMb29wKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZXhpdCgpOwotICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzdGFydFRvbmVDb21tYW5kKFRvbmVHZW5lcmF0b3I6OnRvbmVfdHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc3RvcFRvbmVDb21tYW5kKCk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHZvbHVtZUNvbW1hbmQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGZsb2F0IHZvbHVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBpbnQgZGVsYXlNcyA9IDApOwotICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBwYXJhbWV0ZXJzQ29tbWFuZChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5VmFsdWVQYWlycywgaW50IGRlbGF5TXMgPSAwKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgdm9pY2VWb2x1bWVDb21tYW5kKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5TXMgPSAwKTsKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc3RvcE91dHB1dENvbW1hbmQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pOwotICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICByZWxlYXNlT3V0cHV0Q29tbWFuZChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOwotCi0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGluc2VydENvbW1hbmRfbChBdWRpb0NvbW1hbmQgKmNvbW1hbmQsIGludCBkZWxheU1zID0gMCk7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICAvLyBkZXNjcmlwdG9yIGZvciByZXF1ZXN0ZWQgdG9uZSBwbGF5YmFjayBldmVudAotICAgICAgICBjbGFzcyBBdWRpb0NvbW1hbmQgewotCi0gICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgIEF1ZGlvQ29tbWFuZCgpCi0gICAgICAgICAgICA6IG1Db21tYW5kKC0xKSB7fQotCi0gICAgICAgICAgICB2b2lkIGR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICAgICAgICAgIGludCBtQ29tbWFuZDsgICAvLyBTVEFSVF9UT05FLCBTVE9QX1RPTkUgLi4uCi0gICAgICAgICAgICBuc2Vjc190IG1UaW1lOyAgLy8gdGltZSBzdGFtcAotICAgICAgICAgICAgQ29uZGl0aW9uIG1Db25kOyAvLyBjb25kaXRpb24gZm9yIHN0YXR1cyByZXR1cm4KLSAgICAgICAgICAgIHN0YXR1c190IG1TdGF0dXM7IC8vIGNvbW1hbmQgc3RhdHVzCi0gICAgICAgICAgICBib29sIG1XYWl0U3RhdHVzOyAvLyB0cnVlIGlmIGNhbGxlciBpcyB3YWl0aW5nIGZvciBzdGF0dXMKLSAgICAgICAgICAgIHZvaWQgKm1QYXJhbTsgICAgIC8vIGNvbW1hbmQgcGFyYW1ldGVyIChUb25lRGF0YSwgVm9sdW1lRGF0YSwgUGFyYW1ldGVyc0RhdGEpCi0gICAgICAgIH07Ci0KLSAgICAgICAgY2xhc3MgVG9uZURhdGEgewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBUb25lR2VuZXJhdG9yOjp0b25lX3R5cGUgbVR5cGU7IC8vIHRvbmUgdHlwZSAoU1RBUlRfVE9ORSBvbmx5KQotICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBtU3RyZWFtOyAgICAvLyBzdHJlYW0gdHlwZSAoU1RBUlRfVE9ORSBvbmx5KQotICAgICAgICB9OwotCi0gICAgICAgIGNsYXNzIFZvbHVtZURhdGEgewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IG1TdHJlYW07Ci0gICAgICAgICAgICBmbG9hdCBtVm9sdW1lOwotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgbUlPOwotICAgICAgICB9OwotCi0gICAgICAgIGNsYXNzIFBhcmFtZXRlcnNEYXRhIHsKLSAgICAgICAgcHVibGljOgotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgbUlPOwotICAgICAgICAgICAgU3RyaW5nOCBtS2V5VmFsdWVQYWlyczsKLSAgICAgICAgfTsKLQotICAgICAgICBjbGFzcyBWb2ljZVZvbHVtZURhdGEgewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBmbG9hdCBtVm9sdW1lOwotICAgICAgICB9OwotCi0gICAgICAgIGNsYXNzIFN0b3BPdXRwdXREYXRhIHsKLSAgICAgICAgcHVibGljOgotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgbUlPOwotICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBtU3RyZWFtOwotICAgICAgICAgICAgaW50IG1TZXNzaW9uOwotICAgICAgICB9OwotCi0gICAgICAgIGNsYXNzIFJlbGVhc2VPdXRwdXREYXRhIHsKLSAgICAgICAgcHVibGljOgotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgbUlPOwotICAgICAgICB9OwotCi0gICAgICAgIE11dGV4ICAgbUxvY2s7Ci0gICAgICAgIENvbmRpdGlvbiBtV2FpdFdvcmtDVjsKLSAgICAgICAgVmVjdG9yIDxBdWRpb0NvbW1hbmQgKj4gbUF1ZGlvQ29tbWFuZHM7IC8vIGxpc3Qgb2YgcGVuZGluZyBjb21tYW5kcwotICAgICAgICBUb25lR2VuZXJhdG9yICptcFRvbmVHZW5lcmF0b3I7ICAgICAvLyB0aGUgdG9uZSBnZW5lcmF0b3IKLSAgICAgICAgQXVkaW9Db21tYW5kIG1MYXN0Q29tbWFuZDsgICAgICAgICAgLy8gbGFzdCBwcm9jZXNzZWQgY29tbWFuZCAodXNlZCBieSBkdW1wKQotICAgICAgICBTdHJpbmc4IG1OYW1lOyAgICAgICAgICAgICAgICAgICAgICAvLyBzdHJpbmcgdXNlZCBieSB3YWtlIGxvY2sgZm8gZGVsYXllZCBjb21tYW5kcwotICAgICAgICB3cDxBdWRpb1BvbGljeVNlcnZpY2U+IG1TZXJ2aWNlOwotICAgIH07Ci0KLSAgICBjbGFzcyBFZmZlY3REZXNjIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIEVmZmVjdERlc2MoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgZWZmZWN0X3V1aWRfdCYgdXVpZCkgOgotICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUoc3RyZHVwKG5hbWUpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1VdWlkKHV1aWQpIHsgfQotICAgICAgICBFZmZlY3REZXNjKGNvbnN0IEVmZmVjdERlc2MmIG9yaWcpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lKHN0cmR1cChvcmlnLm1OYW1lKSksCi0gICAgICAgICAgICAgICAgICAgICAgICBtVXVpZChvcmlnLm1VdWlkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVlcCBjb3B5IG1QYXJhbXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IG9yaWcubVBhcmFtcy5zaXplKCk7IGsrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCAqb3JpZ1BhcmFtID0gb3JpZy5tUGFyYW1zW2tdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwc2l6ZSBhbmQgdnNpemUgYXJlIHJvdW5kZWQgdXAgdG8gYW4gaW50IGJvdW5kYXJ5IGZvciBhbGxvY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvcmlnU2l6ZSA9IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG9yaWdQYXJhbS0+cHNpemUgKyAzKSAmIH4zKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgob3JpZ1BhcmFtLT52c2l6ZSArIDMpICYgfjMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCAqZHVwUGFyYW0gPSAoZWZmZWN0X3BhcmFtX3QgKikgbWFsbG9jKG9yaWdTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGR1cFBhcmFtLCBvcmlnUGFyYW0sIG9yaWdTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyB3b3JrcyBiZWNhdXNlIHRoZSBwYXJhbSBidWZmZXIgYWxsb2NhdGlvbiBpcyBhbHNvIGRvbmUgYnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVsdGlwbGVzIG9mIDQgYnl0ZXMgb3JpZ2luYWxseS4gSW4gdGhlb3J5IHdlIHNob3VsZCBtZW1jcHkgb25seQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYWN0dWFsIHBhcmFtIHNpemUsIHRoYXQgaXMgd2l0aG91dCByb3VuZGluZyB2c2l6ZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhcmFtcy5hZGQoZHVwUGFyYW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgLyp2aXJ0dWFsKi8gfkVmZmVjdERlc2MoKSB7Ci0gICAgICAgICAgICBmcmVlKG1OYW1lKTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgbVBhcmFtcy5zaXplKCk7IGsrKykgewotICAgICAgICAgICAgICAgIGZyZWUobVBhcmFtc1trXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2hhciAqbU5hbWU7Ci0gICAgICAgIGVmZmVjdF91dWlkX3QgbVV1aWQ7Ci0gICAgICAgIFZlY3RvciA8ZWZmZWN0X3BhcmFtX3QgKj4gbVBhcmFtczsKLSAgICB9OwotCi0gICAgY2xhc3MgSW5wdXRTb3VyY2VEZXNjIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIElucHV0U291cmNlRGVzYygpIHt9Ci0gICAgICAgIC8qdmlydHVhbCovIH5JbnB1dFNvdXJjZURlc2MoKSB7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1FZmZlY3RzLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIG1FZmZlY3RzW2pdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFZlY3RvciA8RWZmZWN0RGVzYyAqPiBtRWZmZWN0czsKLSAgICB9OwotCi0KLSAgICBjbGFzcyBJbnB1dERlc2MgewotICAgIHB1YmxpYzoKLSAgICAgICAgSW5wdXREZXNjKGludCBzZXNzaW9uKSA6IG1TZXNzaW9uSWQoc2Vzc2lvbikge30KLSAgICAgICAgLyp2aXJ0dWFsKi8gfklucHV0RGVzYygpIHt9Ci0gICAgICAgIGNvbnN0IGludCBtU2Vzc2lvbklkOwotICAgICAgICBWZWN0b3I8IHNwPEF1ZGlvRWZmZWN0PiA+bUVmZmVjdHM7Ci0gICAgfTsKLQotICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga0lucHV0U291cmNlTmFtZXNbQVVESU9fU09VUkNFX0NOVCAtMV07Ci0KLSAgICB2b2lkIHNldFByZVByb2Nlc3NvckVuYWJsZWQoY29uc3QgSW5wdXREZXNjICppbnB1dERlc2MsIGJvb2wgZW5hYmxlZCk7Ci0gICAgc3RhdHVzX3QgbG9hZFByZVByb2Nlc3NvckNvbmZpZyhjb25zdCBjaGFyICpwYXRoKTsKLSAgICBzdGF0dXNfdCBsb2FkRWZmZWN0cyhjbm9kZSAqcm9vdCwgVmVjdG9yIDxFZmZlY3REZXNjICo+JiBlZmZlY3RzKTsKLSAgICBFZmZlY3REZXNjICpsb2FkRWZmZWN0KGNub2RlICpyb290KTsKLSAgICBzdGF0dXNfdCBsb2FkSW5wdXRTb3VyY2VzKGNub2RlICpyb290LCBjb25zdCBWZWN0b3IgPEVmZmVjdERlc2MgKj4mIGVmZmVjdHMpOwotICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlTmFtZVRvRW51bShjb25zdCBjaGFyICpuYW1lKTsKLSAgICBJbnB1dFNvdXJjZURlc2MgKmxvYWRJbnB1dFNvdXJjZShjbm9kZSAqcm9vdCwgY29uc3QgVmVjdG9yIDxFZmZlY3REZXNjICo+JiBlZmZlY3RzKTsKLSAgICB2b2lkIGxvYWRFZmZlY3RQYXJhbWV0ZXJzKGNub2RlICpyb290LCBWZWN0b3IgPGVmZmVjdF9wYXJhbV90ICo+JiBwYXJhbXMpOwotICAgIGVmZmVjdF9wYXJhbV90ICpsb2FkRWZmZWN0UGFyYW1ldGVyKGNub2RlICpyb290KTsKLSAgICBzaXplX3QgcmVhZFBhcmFtVmFsdWUoY25vZGUgKm5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmN1clNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqdG90U2l6ZSk7Ci0gICAgc2l6ZV90IGdyb3dQYXJhbVNpemUoY2hhciAqcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpjdXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqdG90U2l6ZSk7Ci0KLSAgICAvLyBJbnRlcm5hbCBkdW1wIHV0aWxpdGllcy4KLSAgICBzdGF0dXNfdCBkdW1wUGVybWlzc2lvbkRlbmlhbChpbnQgZmQpOwotCi0KLSAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOyAgICAvLyBwcmV2ZW50cyBjb25jdXJyZW50IGFjY2VzcyB0byBBdWRpb1BvbGljeSBtYW5hZ2VyIGZ1bmN0aW9ucyBjaGFuZ2luZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRldmljZSBjb25uZWN0aW9uIHN0YXRlICBvciByb3V0aW5nCi0gICAgc3A8QXVkaW9Db21tYW5kVGhyZWFkPiBtQXVkaW9Db21tYW5kVGhyZWFkOyAgICAgLy8gYXVkaW8gY29tbWFuZHMgdGhyZWFkCi0gICAgc3A8QXVkaW9Db21tYW5kVGhyZWFkPiBtVG9uZVBsYXliYWNrVGhyZWFkOyAgICAgLy8gdG9uZSBwbGF5YmFjayB0aHJlYWQKLSAgICBzcDxBdWRpb0NvbW1hbmRUaHJlYWQ+IG1PdXRwdXRDb21tYW5kVGhyZWFkOyAgICAvLyBwcm9jZXNzIHN0b3AgYW5kIHJlbGVhc2Ugb3V0cHV0Ci0gICAgc3RydWN0IGF1ZGlvX3BvbGljeV9kZXZpY2UgKm1wQXVkaW9Qb2xpY3lEZXY7Ci0gICAgc3RydWN0IGF1ZGlvX3BvbGljeSAqbXBBdWRpb1BvbGljeTsKLSAgICBLZXllZFZlY3RvcjwgYXVkaW9fc291cmNlX3QsIElucHV0U291cmNlRGVzYyogPiBtSW5wdXRTb3VyY2VzOwotICAgIEtleWVkVmVjdG9yPCBhdWRpb19pb19oYW5kbGVfdCwgSW5wdXREZXNjKiA+IG1JbnB1dHM7Ci19OwotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9BVURJT1BPTElDWVNFUlZJQ0VfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlci5jcHAKaW5kZXggMmMzYzcxOS4uMWY3YTYxMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXIuY3BwCkBAIC0yMiw5ICsyMiwxMSBAQAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KICNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlci5oIgogI2luY2x1ZGUgIkF1ZGlvUmVzYW1wbGVyU2luYy5oIgogI2luY2x1ZGUgIkF1ZGlvUmVzYW1wbGVyQ3ViaWMuaCIKKyNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlckR5bi5oIgogCiAjaWZkZWYgX19hcm1fXwogI2luY2x1ZGUgPG1hY2hpbmUvY3B1LWZlYXR1cmVzLmg+CkBAIC0zOSw4ICs0MSw4IEBACiAKIGNsYXNzIEF1ZGlvUmVzYW1wbGVyT3JkZXIxIDogcHVibGljIEF1ZGlvUmVzYW1wbGVyIHsKIHB1YmxpYzoKLSAgICBBdWRpb1Jlc2FtcGxlck9yZGVyMShpbnQgYml0RGVwdGgsIGludCBpbkNoYW5uZWxDb3VudCwgaW50MzJfdCBzYW1wbGVSYXRlKSA6Ci0gICAgICAgIEF1ZGlvUmVzYW1wbGVyKGJpdERlcHRoLCBpbkNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSwgTE9XX1FVQUxJVFkpLCBtWDBMKDApLCBtWDBSKDApIHsKKyAgICBBdWRpb1Jlc2FtcGxlck9yZGVyMShpbnQgaW5DaGFubmVsQ291bnQsIGludDMyX3Qgc2FtcGxlUmF0ZSkgOgorICAgICAgICBBdWRpb1Jlc2FtcGxlcihpbkNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSwgTE9XX1FVQUxJVFkpLCBtWDBMKDApLCBtWDBSKDApIHsKICAgICB9CiAgICAgdmlydHVhbCB2b2lkIHJlc2FtcGxlKGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCiAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBwcm92aWRlcik7CkBAIC03Nyw2ICs3OSw5IEBACiAgICAgaW50IG1YMFI7CiB9OwogCisvKnN0YXRpYyovCitjb25zdCBkb3VibGUgQXVkaW9SZXNhbXBsZXI6OmtQaGFzZU11bHRpcGxpZXIgPSAxTCA8PCBBdWRpb1Jlc2FtcGxlcjo6a051bVBoYXNlQml0czsKKwogYm9vbCBBdWRpb1Jlc2FtcGxlcjo6cXVhbGl0eUlzU3VwcG9ydGVkKHNyY19xdWFsaXR5IHF1YWxpdHkpCiB7CiAgICAgc3dpdGNoIChxdWFsaXR5KSB7CkBAIC04NSw2ICs5MCw5IEBACiAgICAgY2FzZSBNRURfUVVBTElUWToKICAgICBjYXNlIEhJR0hfUVVBTElUWToKICAgICBjYXNlIFZFUllfSElHSF9RVUFMSVRZOgorICAgIGNhc2UgRFlOX0xPV19RVUFMSVRZOgorICAgIGNhc2UgRFlOX01FRF9RVUFMSVRZOgorICAgIGNhc2UgRFlOX0hJR0hfUVVBTElUWToKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgZGVmYXVsdDoKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTA1LDcgKzExMyw3IEBACiAgICAgICAgIGlmICgqZW5kcHRyID09ICdcMCcpIHsKICAgICAgICAgICAgIGRlZmF1bHRRdWFsaXR5ID0gKHNyY19xdWFsaXR5KSBsOwogICAgICAgICAgICAgQUxPR0QoImZvcmNpbmcgQXVkaW9SZXNhbXBsZXIgcXVhbGl0eSB0byAlZCIsIGRlZmF1bHRRdWFsaXR5KTsKLSAgICAgICAgICAgIGlmIChkZWZhdWx0UXVhbGl0eSA8IERFRkFVTFRfUVVBTElUWSB8fCBkZWZhdWx0UXVhbGl0eSA+IFZFUllfSElHSF9RVUFMSVRZKSB7CisgICAgICAgICAgICBpZiAoZGVmYXVsdFF1YWxpdHkgPCBERUZBVUxUX1FVQUxJVFkgfHwgZGVmYXVsdFF1YWxpdHkgPiBEWU5fSElHSF9RVUFMSVRZKSB7CiAgICAgICAgICAgICAgICAgZGVmYXVsdFF1YWxpdHkgPSBERUZBVUxUX1FVQUxJVFk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTEyNSw2ICsxMzMsMTIgQEAKICAgICAgICAgcmV0dXJuIDIwOwogICAgIGNhc2UgVkVSWV9ISUdIX1FVQUxJVFk6CiAgICAgICAgIHJldHVybiAzNDsKKyAgICBjYXNlIERZTl9MT1dfUVVBTElUWToKKyAgICAgICAgcmV0dXJuIDQ7CisgICAgY2FzZSBEWU5fTUVEX1FVQUxJVFk6CisgICAgICAgIHJldHVybiA2OworICAgIGNhc2UgRFlOX0hJR0hfUVVBTElUWToKKyAgICAgICAgcmV0dXJuIDEyOwogICAgIH0KIH0KIApAQCAtMTMyLDcgKzE0Niw3IEBACiBzdGF0aWMgcHRocmVhZF9tdXRleF90IG11dGV4ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKIHN0YXRpYyB1aW50MzJfdCBjdXJyZW50TUh6ID0gMDsKIAotQXVkaW9SZXNhbXBsZXIqIEF1ZGlvUmVzYW1wbGVyOjpjcmVhdGUoaW50IGJpdERlcHRoLCBpbnQgaW5DaGFubmVsQ291bnQsCitBdWRpb1Jlc2FtcGxlciogQXVkaW9SZXNhbXBsZXI6OmNyZWF0ZShhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGludCBpbkNoYW5uZWxDb3VudCwKICAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlLCBzcmNfcXVhbGl0eSBxdWFsaXR5KSB7CiAKICAgICBib29sIGF0RmluYWxRdWFsaXR5OwpAQCAtMTQ4LDYgKzE2MiwxNiBAQAogICAgICAgICBhdEZpbmFsUXVhbGl0eSA9IHRydWU7CiAgICAgfQogCisgICAgLyogaWYgdGhlIGNhbGxlciByZXF1ZXN0cyBERUZBVUxUX1FVQUxJVFkgYW5kIGFmLnJlc2FtcGxlci5wcm9wZXJ0eQorICAgICAqIGhhcyBub3QgYmVlbiBzZXQsIHRoZSB0YXJnZXQgcmVzYW1wbGVyIHF1YWxpdHkgaXMgc2V0IHRvIERZTl9NRURfUVVBTElUWSwKKyAgICAgKiBhbmQgYWxsb3dlZCB0byAidGhyb3R0bGUiIGRvd24gdG8gRFlOX0xPV19RVUFMSVRZIGlmIG5lY2Vzc2FyeQorICAgICAqIGR1ZSB0byBlc3RpbWF0ZWQgQ1BVIGxvYWQgb2YgaGF2aW5nIHRvbyBtYW55IGFjdGl2ZSByZXNhbXBsZXJzCisgICAgICogKHRoZSBjb2RlIGJlbG93IHRoZSBpZikuCisgICAgICovCisgICAgaWYgKHF1YWxpdHkgPT0gREVGQVVMVF9RVUFMSVRZKSB7CisgICAgICAgIHF1YWxpdHkgPSBEWU5fTUVEX1FVQUxJVFk7CisgICAgfQorCiAgICAgLy8gbmFpdmUgaW1wbGVtZW50YXRpb24gb2YgQ1BVIGxvYWQgdGhyb3R0bGluZyBkb2Vzbid0IGFjY291bnQgZm9yIHdoZXRoZXIgcmVzYW1wbGVyIGlzIGFjdGl2ZQogICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXgpOwogICAgIGZvciAoOzspIHsKQEAgLTE2Miw3ICsxODYsNiBAQAogICAgICAgICAvLyBub3QgZW5vdWdoIENQVSBhdmFpbGFibGUgZm9yIHByb3Bvc2VkIHF1YWxpdHkgbGV2ZWwsIHNvIHRyeSBuZXh0IGxvd2VzdCBsZXZlbAogICAgICAgICBzd2l0Y2ggKHF1YWxpdHkpIHsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgY2FzZSBERUZBVUxUX1FVQUxJVFk6CiAgICAgICAgIGNhc2UgTE9XX1FVQUxJVFk6CiAgICAgICAgICAgICBhdEZpbmFsUXVhbGl0eSA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKQEAgLTE3NSw2ICsxOTgsMTUgQEAKICAgICAgICAgY2FzZSBWRVJZX0hJR0hfUVVBTElUWToKICAgICAgICAgICAgIHF1YWxpdHkgPSBISUdIX1FVQUxJVFk7CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEWU5fTE9XX1FVQUxJVFk6CisgICAgICAgICAgICBhdEZpbmFsUXVhbGl0eSA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEWU5fTUVEX1FVQUxJVFk6CisgICAgICAgICAgICBxdWFsaXR5ID0gRFlOX0xPV19RVUFMSVRZOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRFlOX0hJR0hfUVVBTElUWToKKyAgICAgICAgICAgIHF1YWxpdHkgPSBEWU5fTUVEX1FVQUxJVFk7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXgpOwpAQCAtMTgzLDIyICsyMTUsNDMgQEAKIAogICAgIHN3aXRjaCAocXVhbGl0eSkgewogICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSBERUZBVUxUX1FVQUxJVFk6CiAgICAgY2FzZSBMT1dfUVVBTElUWToKICAgICAgICAgQUxPR1YoIkNyZWF0ZSBsaW5lYXIgUmVzYW1wbGVyIik7Ci0gICAgICAgIHJlc2FtcGxlciA9IG5ldyBBdWRpb1Jlc2FtcGxlck9yZGVyMShiaXREZXB0aCwgaW5DaGFubmVsQ291bnQsIHNhbXBsZVJhdGUpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCk7CisgICAgICAgIHJlc2FtcGxlciA9IG5ldyBBdWRpb1Jlc2FtcGxlck9yZGVyMShpbkNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSk7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgTUVEX1FVQUxJVFk6CiAgICAgICAgIEFMT0dWKCJDcmVhdGUgY3ViaWMgUmVzYW1wbGVyIik7Ci0gICAgICAgIHJlc2FtcGxlciA9IG5ldyBBdWRpb1Jlc2FtcGxlckN1YmljKGJpdERlcHRoLCBpbkNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKTsKKyAgICAgICAgcmVzYW1wbGVyID0gbmV3IEF1ZGlvUmVzYW1wbGVyQ3ViaWMoaW5DaGFubmVsQ291bnQsIHNhbXBsZVJhdGUpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEhJR0hfUVVBTElUWToKICAgICAgICAgQUxPR1YoIkNyZWF0ZSBISUdIX1FVQUxJVFkgc2luYyBSZXNhbXBsZXIiKTsKLSAgICAgICAgcmVzYW1wbGVyID0gbmV3IEF1ZGlvUmVzYW1wbGVyU2luYyhiaXREZXB0aCwgaW5DaGFubmVsQ291bnQsIHNhbXBsZVJhdGUpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCk7CisgICAgICAgIHJlc2FtcGxlciA9IG5ldyBBdWRpb1Jlc2FtcGxlclNpbmMoaW5DaGFubmVsQ291bnQsIHNhbXBsZVJhdGUpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIFZFUllfSElHSF9RVUFMSVRZOgogICAgICAgICBBTE9HVigiQ3JlYXRlIFZFUllfSElHSF9RVUFMSVRZIHNpbmMgUmVzYW1wbGVyID0gJWQiLCBxdWFsaXR5KTsKLSAgICAgICAgcmVzYW1wbGVyID0gbmV3IEF1ZGlvUmVzYW1wbGVyU2luYyhiaXREZXB0aCwgaW5DaGFubmVsQ291bnQsIHNhbXBsZVJhdGUsIHF1YWxpdHkpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCk7CisgICAgICAgIHJlc2FtcGxlciA9IG5ldyBBdWRpb1Jlc2FtcGxlclNpbmMoaW5DaGFubmVsQ291bnQsIHNhbXBsZVJhdGUsIHF1YWxpdHkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERZTl9MT1dfUVVBTElUWToKKyAgICBjYXNlIERZTl9NRURfUVVBTElUWToKKyAgICBjYXNlIERZTl9ISUdIX1FVQUxJVFk6CisgICAgICAgIEFMT0dWKCJDcmVhdGUgZHluYW1pYyBSZXNhbXBsZXIgPSAlZCIsIHF1YWxpdHkpOworICAgICAgICBpZiAoZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKKyAgICAgICAgICAgIHJlc2FtcGxlciA9IG5ldyBBdWRpb1Jlc2FtcGxlckR5bjxmbG9hdCwgZmxvYXQsIGZsb2F0PihpbkNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgcXVhbGl0eSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCk7CisgICAgICAgICAgICBpZiAocXVhbGl0eSA9PSBEWU5fSElHSF9RVUFMSVRZKSB7CisgICAgICAgICAgICAgICAgcmVzYW1wbGVyID0gbmV3IEF1ZGlvUmVzYW1wbGVyRHluPGludDMyX3QsIGludDE2X3QsIGludDMyX3Q+KGluQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgcXVhbGl0eSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlc2FtcGxlciA9IG5ldyBBdWRpb1Jlc2FtcGxlckR5bjxpbnQxNl90LCBpbnQxNl90LCBpbnQzMl90PihpbkNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIHF1YWxpdHkpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIH0KIApAQCAtMjA3LDI2ICsyNjAsMjYgQEAKICAgICByZXR1cm4gcmVzYW1wbGVyOwogfQogCi1BdWRpb1Jlc2FtcGxlcjo6QXVkaW9SZXNhbXBsZXIoaW50IGJpdERlcHRoLCBpbnQgaW5DaGFubmVsQ291bnQsCitBdWRpb1Jlc2FtcGxlcjo6QXVkaW9SZXNhbXBsZXIoaW50IGluQ2hhbm5lbENvdW50LAogICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGUsIHNyY19xdWFsaXR5IHF1YWxpdHkpIDoKLSAgICBtQml0RGVwdGgoYml0RGVwdGgpLCBtQ2hhbm5lbENvdW50KGluQ2hhbm5lbENvdW50KSwKLSAgICAgICAgICAgIG1TYW1wbGVSYXRlKHNhbXBsZVJhdGUpLCBtSW5TYW1wbGVSYXRlKHNhbXBsZVJhdGUpLCBtSW5wdXRJbmRleCgwKSwKLSAgICAgICAgICAgIG1QaGFzZUZyYWN0aW9uKDApLCBtTG9jYWxUaW1lRnJlcSgwKSwKLSAgICAgICAgICAgIG1QVFMoQXVkaW9CdWZmZXJQcm92aWRlcjo6a0ludmFsaWRQVFMpLCBtUXVhbGl0eShxdWFsaXR5KSB7Ci0gICAgLy8gc2FuaXR5IGNoZWNrIG9uIGZvcm1hdAotICAgIGlmICgoYml0RGVwdGggIT0gMTYpIHx8KGluQ2hhbm5lbENvdW50IDwgMSkgfHwgKGluQ2hhbm5lbENvdW50ID4gMikpIHsKLSAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIHNhbXBsZSBmb3JtYXQsICVkIGJpdHMsICVkIGNoYW5uZWxzIiwgYml0RGVwdGgsCi0gICAgICAgICAgICAgICAgaW5DaGFubmVsQ291bnQpOwotICAgICAgICAvLyBBTE9HX0FTU0VSVCgwKTsKKyAgICAgICAgbUNoYW5uZWxDb3VudChpbkNoYW5uZWxDb3VudCksCisgICAgICAgIG1TYW1wbGVSYXRlKHNhbXBsZVJhdGUpLCBtSW5TYW1wbGVSYXRlKHNhbXBsZVJhdGUpLCBtSW5wdXRJbmRleCgwKSwKKyAgICAgICAgbVBoYXNlRnJhY3Rpb24oMCksIG1Mb2NhbFRpbWVGcmVxKDApLAorICAgICAgICBtUFRTKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OmtJbnZhbGlkUFRTKSwgbVF1YWxpdHkocXVhbGl0eSkgeworCisgICAgY29uc3QgaW50IG1heENoYW5uZWxzID0gcXVhbGl0eSA8IERZTl9MT1dfUVVBTElUWSA/IDIgOiA4OworICAgIGlmIChpbkNoYW5uZWxDb3VudCA8IDEKKyAgICAgICAgICAgIHx8IGluQ2hhbm5lbENvdW50ID4gbWF4Q2hhbm5lbHMpIHsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5zdXBwb3J0ZWQgc2FtcGxlIGZvcm1hdCAlZCBxdWFsaXR5ICVkIGNoYW5uZWxzIiwKKyAgICAgICAgICAgICAgICBxdWFsaXR5LCBpbkNoYW5uZWxDb3VudCk7CiAgICAgfQogICAgIGlmIChzYW1wbGVSYXRlIDw9IDApIHsKLSAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIHNhbXBsZSByYXRlICVkIEh6Iiwgc2FtcGxlUmF0ZSk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlVuc3VwcG9ydGVkIHNhbXBsZSByYXRlICVkIEh6Iiwgc2FtcGxlUmF0ZSk7CiAgICAgfQogCiAgICAgLy8gaW5pdGlhbGl6ZSBjb21tb24gbWVtYmVycwogICAgIG1Wb2x1bWVbMF0gPSBtVm9sdW1lWzFdID0gMDsKICAgICBtQnVmZmVyLmZyYW1lQ291bnQgPSAwOwotCiB9CiAKIEF1ZGlvUmVzYW1wbGVyOjp+QXVkaW9SZXNhbXBsZXIoKSB7CkBAIC0yNDYsMTAgKzI5OSwxMiBAQAogICAgIG1QaGFzZUluY3JlbWVudCA9ICh1aW50MzJfdCkoKGtQaGFzZU11bHRpcGxpZXIgKiBpblNhbXBsZVJhdGUpIC8gbVNhbXBsZVJhdGUpOwogfQogCi12b2lkIEF1ZGlvUmVzYW1wbGVyOjpzZXRWb2x1bWUoaW50MTZfdCBsZWZ0LCBpbnQxNl90IHJpZ2h0KSB7Cit2b2lkIEF1ZGlvUmVzYW1wbGVyOjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHsKICAgICAvLyBUT0RPOiBJbXBsZW1lbnQgYW50aS16aXBwZXIgZmlsdGVyCi0gICAgbVZvbHVtZVswXSA9IGxlZnQ7Ci0gICAgbVZvbHVtZVsxXSA9IHJpZ2h0OworICAgIC8vIGNvbnZlcnQgdG8gVTQuMTIgZm9yIGludGVybmFsIGludGVnZXIgdXNlIChyb3VuZCBkb3duKQorICAgIC8vIGludGVnZXIgdm9sdW1lIHZhbHVlcyBhcmUgY2xhbXBlZCB0byAwIHRvIFVOSVRZX0dBSU4uCisgICAgbVZvbHVtZVswXSA9IHU0XzEyX2Zyb21fZmxvYXQoY2xhbXBGbG9hdFZvbChsZWZ0KSk7CisgICAgbVZvbHVtZVsxXSA9IHU0XzEyX2Zyb21fZmxvYXQoY2xhbXBGbG9hdFZvbChyaWdodCkpOwogfQogCiB2b2lkIEF1ZGlvUmVzYW1wbGVyOjpzZXRMb2NhbFRpbWVGcmVxKHVpbnQ2NF90IGZyZXEpIHsKQEAgLTMwNSw3ICszNjAsNyBAQAogICAgIHVpbnQzMl90IHBoYXNlSW5jcmVtZW50ID0gbVBoYXNlSW5jcmVtZW50OwogICAgIHNpemVfdCBvdXRwdXRJbmRleCA9IDA7CiAgICAgc2l6ZV90IG91dHB1dFNhbXBsZUNvdW50ID0gb3V0RnJhbWVDb3VudCAqIDI7Ci0gICAgc2l6ZV90IGluRnJhbWVDb3VudCA9IChvdXRGcmFtZUNvdW50Km1JblNhbXBsZVJhdGUpL21TYW1wbGVSYXRlOworICAgIHNpemVfdCBpbkZyYW1lQ291bnQgPSBnZXRJbkZyYW1lQ291bnRSZXF1aXJlZChvdXRGcmFtZUNvdW50KTsKIAogICAgIC8vIEFMT0dFKCJzdGFydGluZyByZXNhbXBsZSAlZCBmcmFtZXMsIGlucHV0SW5kZXg9JWQsIHBoYXNlRnJhY3Rpb249JWQsIHBoYXNlSW5jcmVtZW50PSVkIiwKICAgICAvLyAgICAgIG91dEZyYW1lQ291bnQsIGlucHV0SW5kZXgsIHBoYXNlRnJhY3Rpb24sIHBoYXNlSW5jcmVtZW50KTsKQEAgLTMzOSw4ICszOTQsOSBAQAogICAgICAgICAgICAgb3V0W291dHB1dEluZGV4KytdICs9IHZsICogSW50ZXJwKG1YMEwsIGluWzBdLCBwaGFzZUZyYWN0aW9uKTsKICAgICAgICAgICAgIG91dFtvdXRwdXRJbmRleCsrXSArPSB2ciAqIEludGVycChtWDBSLCBpblsxXSwgcGhhc2VGcmFjdGlvbik7CiAgICAgICAgICAgICBBZHZhbmNlKCZpbnB1dEluZGV4LCAmcGhhc2VGcmFjdGlvbiwgcGhhc2VJbmNyZW1lbnQpOwotICAgICAgICAgICAgaWYgKG91dHB1dEluZGV4ID09IG91dHB1dFNhbXBsZUNvdW50KQorICAgICAgICAgICAgaWYgKG91dHB1dEluZGV4ID09IG91dHB1dFNhbXBsZUNvdW50KSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvLyBwcm9jZXNzIGlucHV0IHNhbXBsZXMKQEAgLTQwMiw3ICs0NTgsNyBAQAogICAgIHVpbnQzMl90IHBoYXNlSW5jcmVtZW50ID0gbVBoYXNlSW5jcmVtZW50OwogICAgIHNpemVfdCBvdXRwdXRJbmRleCA9IDA7CiAgICAgc2l6ZV90IG91dHB1dFNhbXBsZUNvdW50ID0gb3V0RnJhbWVDb3VudCAqIDI7Ci0gICAgc2l6ZV90IGluRnJhbWVDb3VudCA9IChvdXRGcmFtZUNvdW50Km1JblNhbXBsZVJhdGUpL21TYW1wbGVSYXRlOworICAgIHNpemVfdCBpbkZyYW1lQ291bnQgPSBnZXRJbkZyYW1lQ291bnRSZXF1aXJlZChvdXRGcmFtZUNvdW50KTsKIAogICAgIC8vIEFMT0dFKCJzdGFydGluZyByZXNhbXBsZSAlZCBmcmFtZXMsIGlucHV0SW5kZXg9JWQsIHBoYXNlRnJhY3Rpb249JWQsIHBoYXNlSW5jcmVtZW50PSVkIiwKICAgICAvLyAgICAgIG91dEZyYW1lQ291bnQsIGlucHV0SW5kZXgsIHBoYXNlRnJhY3Rpb24sIHBoYXNlSW5jcmVtZW50KTsKQEAgLTQzNCw4ICs0OTAsOSBAQAogICAgICAgICAgICAgb3V0W291dHB1dEluZGV4KytdICs9IHZsICogc2FtcGxlOwogICAgICAgICAgICAgb3V0W291dHB1dEluZGV4KytdICs9IHZyICogc2FtcGxlOwogICAgICAgICAgICAgQWR2YW5jZSgmaW5wdXRJbmRleCwgJnBoYXNlRnJhY3Rpb24sIHBoYXNlSW5jcmVtZW50KTsKLSAgICAgICAgICAgIGlmIChvdXRwdXRJbmRleCA9PSBvdXRwdXRTYW1wbGVDb3VudCkKKyAgICAgICAgICAgIGlmIChvdXRwdXRJbmRleCA9PSBvdXRwdXRTYW1wbGVDb3VudCkgewogICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLy8gcHJvY2VzcyBpbnB1dCBzYW1wbGVzCkBAIC01MTQsNiArNTcxLDE2IEBACiAgICAgICAgICAgICBzaXplX3QgJm91dHB1dEluZGV4LCBpbnQzMl90KiBvdXQsIHNpemVfdCAmaW5wdXRJbmRleCwgaW50MzJfdCB2bCwgaW50MzJfdCB2ciwKICAgICAgICAgICAgIHVpbnQzMl90ICZwaGFzZUZyYWN0aW9uLCB1aW50MzJfdCBwaGFzZUluY3JlbWVudCkKIHsKKyAgICAodm9pZCltYXhPdXRQdDsgLy8gcmVtb3ZlIHVudXNlZCBwYXJhbWV0ZXIgd2FybmluZ3MKKyAgICAodm9pZCltYXhJbklkeDsKKyAgICAodm9pZClvdXRwdXRJbmRleDsKKyAgICAodm9pZClvdXQ7CisgICAgKHZvaWQpaW5wdXRJbmRleDsKKyAgICAodm9pZCl2bDsKKyAgICAodm9pZCl2cjsKKyAgICAodm9pZClwaGFzZUZyYWN0aW9uOworICAgICh2b2lkKXBoYXNlSW5jcmVtZW50OworICAgICh2b2lkKWluOwogI2RlZmluZSBNT19QQVJBTTUgICAiMzYiICAgICAgICAvLyBvZmZzZXQgb2YgcGFyYW1ldGVyIDUgKG91dHB1dEluZGV4KQogCiAgICAgYXNtKApAQCAtNTI2LDcgKzU5Myw3IEBACiAgICAgICAgICIgICBsZHIgcjgsIFtzcCwgIyIgTU9fUEFSQU01ICIgKyA0XVxuIiAgICAgLy8gb3V0CiAgICAgICAgICIgICBsZHIgcjAsIFtzcCwgIyIgTU9fUEFSQU01ICIgKyAwXVxuIiAgICAgLy8gJm91dHB1dEluZGV4CiAgICAgICAgICIgICBsZHIgcjAsIFtyMF1cbiIgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0cHV0SW5kZXgKLSAgICAgICAgIiAgIGFkZCByOCwgcjAsIGFzbCAjMlxuIiAgICAgICAgICAgICAgICAgICAvLyBjdXJPdXQKKyAgICAgICAgIiAgIGFkZCByOCwgcjgsIHIwLCBhc2wgIzJcbiIgICAgICAgICAgICAgICAvLyBjdXJPdXQKICAgICAgICAgIiAgIGxkciByOSwgW3NwLCAjIiBNT19QQVJBTTUgIiArIDI0XVxuIiAgICAvLyBwaGFzZUluY3JlbWVudAogICAgICAgICAiICAgbGRyIHIxMCwgW3NwLCAjIiBNT19QQVJBTTUgIiArIDEyXVxuIiAgIC8vIHZsCiAgICAgICAgICIgICBsZHIgcjExLCBbc3AsICMiIE1PX1BBUkFNNSAiICsgMTZdXG4iICAgLy8gdnIKQEAgLTYyNSw2ICs2OTIsMTYgQEAKICAgICAgICAgICAgIHNpemVfdCAmb3V0cHV0SW5kZXgsIGludDMyX3QqIG91dCwgc2l6ZV90ICZpbnB1dEluZGV4LCBpbnQzMl90IHZsLCBpbnQzMl90IHZyLAogICAgICAgICAgICAgdWludDMyX3QgJnBoYXNlRnJhY3Rpb24sIHVpbnQzMl90IHBoYXNlSW5jcmVtZW50KQogeworICAgICh2b2lkKW1heE91dFB0OyAvLyByZW1vdmUgdW51c2VkIHBhcmFtZXRlciB3YXJuaW5ncworICAgICh2b2lkKW1heEluSWR4OworICAgICh2b2lkKW91dHB1dEluZGV4OworICAgICh2b2lkKW91dDsKKyAgICAodm9pZClpbnB1dEluZGV4OworICAgICh2b2lkKXZsOworICAgICh2b2lkKXZyOworICAgICh2b2lkKXBoYXNlRnJhY3Rpb247CisgICAgKHZvaWQpcGhhc2VJbmNyZW1lbnQ7CisgICAgKHZvaWQpaW47CiAjZGVmaW5lIFNUX1BBUkFNNSAgICAiNDAiICAgICAvLyBvZmZzZXQgb2YgcGFyYW1ldGVyIDUgKG91dHB1dEluZGV4KQogICAgIGFzbSgKICAgICAgICAgInN0bWZkICBzcCEsIHtyNCwgcjUsIHI2LCByNywgcjgsIHI5LCByMTAsIHIxMSwgcjEyLCBscn1cbiIKQEAgLTYzNiw3ICs3MTMsNyBAQAogICAgICAgICAiICAgbGRyIHI4LCBbc3AsICMiIFNUX1BBUkFNNSAiICsgNF1cbiIgICAgIC8vIG91dAogICAgICAgICAiICAgbGRyIHIwLCBbc3AsICMiIFNUX1BBUkFNNSAiICsgMF1cbiIgICAgIC8vICZvdXRwdXRJbmRleAogICAgICAgICAiICAgbGRyIHIwLCBbcjBdXG4iICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG91dHB1dEluZGV4Ci0gICAgICAgICIgICBhZGQgcjgsIHIwLCBhc2wgIzJcbiIgICAgICAgICAgICAgICAgICAgLy8gY3VyT3V0CisgICAgICAgICIgICBhZGQgcjgsIHI4LCByMCwgYXNsICMyXG4iICAgICAgICAgICAgICAgLy8gY3VyT3V0CiAgICAgICAgICIgICBsZHIgcjksIFtzcCwgIyIgU1RfUEFSQU01ICIgKyAyNF1cbiIgICAgLy8gcGhhc2VJbmNyZW1lbnQKICAgICAgICAgIiAgIGxkciByMTAsIFtzcCwgIyIgU1RfUEFSQU01ICIgKyAxMl1cbiIgICAvLyB2bAogICAgICAgICAiICAgbGRyIHIxMSwgW3NwLCAjIiBTVF9QQVJBTTUgIiArIDE2XVxuIiAgIC8vIHZyCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlci5oCmluZGV4IDMzZTY0Y2UuLmNkYzZkOTIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlci5oCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+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+CitpbmxpbmUKK3ZvaWQgUHJvY2VzczwyLCA4PihpbnQzMl90KiBjb25zdCBvdXQsCisgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNQLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc04sCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzUDEsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzTjEsCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNQLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzTiwKKyAgICAgICAgdWludDMyX3QgbGVycFAsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvbnN0IHZvbHVtZUxSKQoreworICAgIGNvbnN0IGludCBDSEFOTkVMUyA9IDI7IC8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGRvZXMgbm90IHByZXNlcnZlIHBhcmFtcworICAgIGNvbnN0IGludCBTVFJJREUgPSA4OworICAgIHNQIC09IENIQU5ORUxTKigoU1RSSURFPj4xKS0xKTsKKyAgICBhc20gKAorICAgICAgICAidm1vdi4zMiAgICAgICAgZDJbMF0sICVbbGVycFBdICAgICAgICAgIFxuIi8vIGxvYWQgdGhlIHBvc2l0aXZlIHBoYXNlCisgICAgICAgICJ2ZW9yICAgICAgICAgICBxMCwgcTAsIHEwICAgICAgICAgICAgICAgXG4iLy8gcmVzdWx0LCBpbml0aWFsaXplIHRvIDAKKyAgICAgICAgInZlb3IgICAgICAgICAgIHE0LCBxNCwgcTQgICAgICAgICAgICAgICBcbiIvLyByZXN1bHQsIGluaXRpYWxpemUgdG8gMAorCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICJ2bGQyLjE2ICAgICAgICB7ZDQsIGQ1fSwgWyVbc1BdXSAgICAgICAgXG4iLy8gbG9hZCA0IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKKyAgICAgICAgInZsZDIuMTYgICAgICAgIHtkNiwgZDd9LCBbJVtzTl1dISAgICAgICBcbiIvLyBsb2FkIDQgMTYtYml0cyBzdGVyZW8gc2FtcGxlcworICAgICAgICAidmxkMS4zMiAgICAgICAge3E4fSwgWyVbY29lZnNQMF06MTI4XSEgIFxuIi8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzCisgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTl9LCBbJVtjb2Vmc1AxXToxMjhdISAgXG4iLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMgZm9yIGludGVycG9sYXRpb24KKyAgICAgICAgInZsZDEuMzIgICAgICAgIHtxMTB9LCBbJVtjb2Vmc04xXToxMjhdISBcbiIvLyBsb2FkIDQgMzItYml0cyBjb2VmcworICAgICAgICAidmxkMS4zMiAgICAgICAge3ExMX0sIFslW2NvZWZzTjBdOjEyOF0hIFxuIi8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzIGZvciBpbnRlcnBvbGF0aW9uCisKKyAgICAgICAgInZyZXY2NC4xNiAgICAgIHEyLCBxMiAgICAgICAgICAgICAgICAgICBcbiIvLyAocmV2ZXJzZWQpIDIgZnJhbWVzIG9mIHRoZSBwb3NpdGl2ZSBzaWRlCisKKyAgICAgICAgInZzdWIuczMyICAgICAgIHE5LCBxOSwgcTggICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDEpIDFzdCBzZXQgb2YgY29lZnMKKyAgICAgICAgInZzdWIuczMyICAgICAgIHExMSwgcTExLCBxMTAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDEpIDJuZCBzZXQgb2YgY29ldHMKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMiwgZDQsICMxNSAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTMsIGQ1LCAjMTUgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxOSwgcTksIGQyWzBdICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAyKSAxc3Qgc2V0IG9mIGNvZWZzCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTEsIHExMSwgZDJbMV0gICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAzKSAybmQgc2V0IG9mIGNvZWZzCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTQsIGQ2LCAjMTUgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworICAgICAgICAidnNobGwuczE2ICAgICAgcTE1LCBkNywgIzE1ICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKworICAgICAgICAidmFkZC5zMzIgICAgICAgcTgsIHE4LCBxOSAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMykgMXN0IHNldAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTEwLCBxMTAsIHExMSAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwNCkgMm5kIHNldAorCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTIsIHExMiwgcTggICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorICAgICAgICAidnFyZG11bGguczMyICAgcTEzLCBxMTMsIHE4ICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNCwgcTE0LCBxMTAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTUsIHExNSwgcTEwICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorCisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExMiAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHE0LCBxNCwgcTEzICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTQgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxNCwgcTQsIHExNSAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKworICAgICAgICAic3VicyAgICAgICAgICAgJVtjb3VudF0sICVbY291bnRdLCAjNCAgIFxuIi8vIHVwZGF0ZSBsb29wIGNvdW50ZXIKKyAgICAgICAgInN1YiAgICAgICAgICAgICVbc1BdLCAlW3NQXSwgIzE2ICAgICAgICBcbiIvLyBtb3ZlIHBvaW50ZXIgdG8gbmV4dCBzZXQgb2Ygc2FtcGxlcworCisgICAgICAgICJibmUgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gbG9vcAorCisgICAgICAgIEFTU0VNQkxZX0FDQ1VNVUxBVEVfU1RFUkVPCisKKyAgICAgICAgOiBbb3V0XSAgICAgIj1VdiIgKG91dFswXSksCisgICAgICAgICAgW2NvdW50XSAgICIrciIgKGNvdW50KSwKKyAgICAgICAgICBbY29lZnNQMF0gIityIiAoY29lZnNQKSwKKyAgICAgICAgICBbY29lZnNQMV0gIityIiAoY29lZnNQMSksCisgICAgICAgICAgW2NvZWZzTjBdICIrciIgKGNvZWZzTiksCisgICAgICAgICAgW2NvZWZzTjFdICIrciIgKGNvZWZzTjEpLAorICAgICAgICAgIFtzUF0gICAgICAiK3IiIChzUCksCisgICAgICAgICAgW3NOXSAgICAgICIrciIgKHNOKQorICAgICAgICA6IFtsZXJwUF0gICAiciIgKGxlcnBQKSwKKyAgICAgICAgICBbdkxSXSAgICAgInIiICh2b2x1bWVMUikKKyAgICAgICAgOiAiY2MiLCAibWVtb3J5IiwKKyAgICAgICAgICAicTAiLCAicTEiLCAicTIiLCAicTMiLCAicTQiLAorICAgICAgICAgICJxOCIsICJxOSIsICJxMTAiLCAicTExIiwKKyAgICAgICAgICAicTEyIiwgInExMyIsICJxMTQiLCAicTE1IgorICAgICk7Cit9CisKKyNlbmRpZiAvL1VTRV9ORU9OCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvKkFORFJPSURfQVVESU9fUkVTQU1QTEVSX0ZJUl9QUk9DRVNTX05FT05fSCovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlclNpbmMuY3BwCmluZGV4IDIwN2YyNmIuLmQwM2U1NzggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlclNpbmMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlclNpbmMuY3BwCkBAIC0xNyw2ICsxNyw3IEBACiAjZGVmaW5lIExPR19UQUcgIkF1ZGlvUmVzYW1wbGVyU2luYyIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAorI2RlZmluZSBfX1NURENfQ09OU1RBTlRfTUFDUk9TCiAjaW5jbHVkZSA8bWFsbG9jLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CkBAIC0yNiw2ICsyNyw3IEBACiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KIAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KIAogI2luY2x1ZGUgIkF1ZGlvUmVzYW1wbGVyU2luYy5oIgogCkBAIC0zNywxMiArMzksMTQgQEAKICNkZWZpbmUgVVNFX0lOTElORV9BU1NFTUJMWSAoZmFsc2UpCiAjZW5kaWYKIAotI2lmIFVTRV9JTkxJTkVfQVNTRU1CTFkgJiYgZGVmaW5lZChfX0FSTV9ORU9OX18pCi0jZGVmaW5lIFVTRV9ORU9OICh0cnVlKQorI2lmIGRlZmluZWQoX19hYXJjaDY0X18pIHx8IGRlZmluZWQoX19BUk1fTkVPTl9fKQorI2luY2x1ZGUgPGFybV9uZW9uLmg+CisjZGVmaW5lIFVTRV9ORU9OCiAjZWxzZQotI2RlZmluZSBVU0VfTkVPTiAoZmFsc2UpCisjdW5kZWYgVVNFX05FT04KICNlbmRpZgogCisjZGVmaW5lIFVOVVNFRCh4KSAoKHZvaWQpKHgpKQogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC00NDksOSArNDUzLDkgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1BdWRpb1Jlc2FtcGxlclNpbmM6OkF1ZGlvUmVzYW1wbGVyU2luYyhpbnQgYml0RGVwdGgsCitBdWRpb1Jlc2FtcGxlclNpbmM6OkF1ZGlvUmVzYW1wbGVyU2luYygKICAgICAgICAgaW50IGluQ2hhbm5lbENvdW50LCBpbnQzMl90IHNhbXBsZVJhdGUsIHNyY19xdWFsaXR5IHF1YWxpdHkpCi0gICAgOiBBdWRpb1Jlc2FtcGxlcihiaXREZXB0aCwgaW5DaGFubmVsQ291bnQsIHNhbXBsZVJhdGUsIHF1YWxpdHkpLAorICAgIDogQXVkaW9SZXNhbXBsZXIoaW5DaGFubmVsQ291bnQsIHNhbXBsZVJhdGUsIHF1YWxpdHkpLAogICAgIG1TdGF0ZSgwKSwgbUltcHVsc2UoMCksIG1SaW5nRnVsbCgwKSwgbUZpckNvZWZzKDApCiB7CiAgICAgLyoKQEAgLTQ5NywxMCArNTAxLDEyIEBACiAgICAgbVJpbmdGdWxsID0gbUltcHVsc2UgKyAobnVtQ29lZnMrMSkqbUNoYW5uZWxDb3VudDsKIH0KIAotdm9pZCBBdWRpb1Jlc2FtcGxlclNpbmM6OnNldFZvbHVtZShpbnQxNl90IGxlZnQsIGludDE2X3QgcmlnaHQpIHsKK3ZvaWQgQXVkaW9SZXNhbXBsZXJTaW5jOjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHsKICAgICBBdWRpb1Jlc2FtcGxlcjo6c2V0Vm9sdW1lKGxlZnQsIHJpZ2h0KTsKLSAgICBtVm9sdW1lU0lNRFswXSA9IGludDMyX3QobGVmdCk8PDE2OwotICAgIG1Wb2x1bWVTSU1EWzFdID0gaW50MzJfdChyaWdodCk8PDE2OworICAgIC8vIGNvbnZlcnQgdG8gVTRfMjggKHJvdW5kaW5nIGRvd24pLgorICAgIC8vIGludGVnZXIgdm9sdW1lIHZhbHVlcyBhcmUgY2xhbXBlZCB0byAwIHRvIFVOSVRZX0dBSU4uCisgICAgbVZvbHVtZVNJTURbMF0gPSB1NF8yOF9mcm9tX2Zsb2F0KGNsYW1wRmxvYXRWb2wobGVmdCkpOworICAgIG1Wb2x1bWVTSU1EWzFdID0gdTRfMjhfZnJvbV9mbG9hdChjbGFtcEZsb2F0Vm9sKHJpZ2h0KSk7CiB9CiAKIHZvaWQgQXVkaW9SZXNhbXBsZXJTaW5jOjpyZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LApAQCAtNTQwLDcgKzU0Niw3IEBACiAgICAgdWludDMyX3QgcGhhc2VJbmNyZW1lbnQgPSBtUGhhc2VJbmNyZW1lbnQ7CiAgICAgc2l6ZV90IG91dHB1dEluZGV4ID0gMDsKICAgICBzaXplX3Qgb3V0cHV0U2FtcGxlQ291bnQgPSBvdXRGcmFtZUNvdW50ICogMjsKLSAgICBzaXplX3QgaW5GcmFtZUNvdW50ID0gKG91dEZyYW1lQ291bnQqbUluU2FtcGxlUmF0ZSkvbVNhbXBsZVJhdGU7CisgICAgc2l6ZV90IGluRnJhbWVDb3VudCA9IGdldEluRnJhbWVDb3VudFJlcXVpcmVkKG91dEZyYW1lQ291bnQpOwogCiAgICAgd2hpbGUgKG91dHB1dEluZGV4IDwgb3V0cHV0U2FtcGxlQ291bnQpIHsKICAgICAgICAgLy8gYnVmZmVyIGlzIGVtcHR5LCBmZXRjaCBhIG5ldyBvbmUKQEAgLTYzNCw4ICs2NDAsOCBAQAogfQogCiB0ZW1wbGF0ZTxpbnQgQ0hBTk5FTFM+Ci12b2lkIEF1ZGlvUmVzYW1wbGVyU2luYzo6ZmlsdGVyQ29lZmZpY2llbnQoCi0gICAgICAgIGludDMyX3QqIG91dCwgdWludDMyX3QgcGhhc2UsIGNvbnN0IGludDE2X3QgKnNhbXBsZXMsIHVpbnQzMl90IHZSTCkKK3ZvaWQgQXVkaW9SZXNhbXBsZXJTaW5jOjpmaWx0ZXJDb2VmZmljaWVudChpbnQzMl90KiBvdXQsIHVpbnQzMl90IHBoYXNlLAorICAgICAgICAgY29uc3QgaW50MTZfdCAqc2FtcGxlcywgdWludDMyX3QgdlJMKQogewogICAgIC8vIE5PVEU6IGJlIHZlcnkgY2FyZWZ1bCB3aGVuIG1vZGlmeWluZyB0aGUgY29kZSBoZXJlLiByZWdpc3RlcgogICAgIC8vIHByZXNzdXJlIGlzIHZlcnkgaGlnaCBhbmQgYSBzbWFsbCBjaGFuZ2UgbWlnaHQgY2F1c2UgdGhlIGNvbXBpbGVyCkBAIC02NjIsMTYwICs2NjgsMTcxIEBACiAKICAgICBzaXplX3QgY291bnQgPSBvZmZzZXQ7CiAKLSAgICBpZiAoIVVTRV9ORU9OKSB7Ci0gICAgICAgIGludDMyX3QgbCA9IDA7Ci0gICAgICAgIGludDMyX3QgciA9IDA7Ci0gICAgICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8Y291bnQgOyBpKyspIHsKLSAgICAgICAgICAgIGludGVycG9sYXRlPENIQU5ORUxTPihsLCByLCBjb2Vmc1ArKywgb2Zmc2V0LCBsZXJwUCwgc1ApOwotICAgICAgICAgICAgc1AgLT0gQ0hBTk5FTFM7Ci0gICAgICAgICAgICBpbnRlcnBvbGF0ZTxDSEFOTkVMUz4obCwgciwgY29lZnNOKyssIG9mZnNldCwgbGVycE4sIHNOKTsKLSAgICAgICAgICAgIHNOICs9IENIQU5ORUxTOwotICAgICAgICB9Ci0gICAgICAgIG91dFswXSArPSAyICogbXVsUkwoMSwgbCwgdlJMKTsKLSAgICAgICAgb3V0WzFdICs9IDIgKiBtdWxSTCgwLCByLCB2UkwpOwotICAgIH0gZWxzZSBpZiAoQ0hBTk5FTFMgPT0gMSkgeworI2lmbmRlZiBVU0VfTkVPTgorICAgIGludDMyX3QgbCA9IDA7CisgICAgaW50MzJfdCByID0gMDsKKyAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7CisgICAgICAgIGludGVycG9sYXRlPENIQU5ORUxTPihsLCByLCBjb2Vmc1ArKywgb2Zmc2V0LCBsZXJwUCwgc1ApOworICAgICAgICBzUCAtPSBDSEFOTkVMUzsKKyAgICAgICAgaW50ZXJwb2xhdGU8Q0hBTk5FTFM+KGwsIHIsIGNvZWZzTisrLCBvZmZzZXQsIGxlcnBOLCBzTik7CisgICAgICAgIHNOICs9IENIQU5ORUxTOworICAgIH0KKyAgICBvdXRbMF0gKz0gMiAqIG11bFJMKDEsIGwsIHZSTCk7CisgICAgb3V0WzFdICs9IDIgKiBtdWxSTCgwLCByLCB2UkwpOworI2Vsc2UKKyAgICBVTlVTRUQodlJMKTsKKyAgICBpZiAoQ0hBTk5FTFMgPT0gMSkgewogICAgICAgICBpbnQzMl90IGNvbnN0KiBjb2Vmc1AxID0gY29lZnNQICsgb2Zmc2V0OwogICAgICAgICBpbnQzMl90IGNvbnN0KiBjb2Vmc04xID0gY29lZnNOICsgb2Zmc2V0OwogICAgICAgICBzUCAtPSBDSEFOTkVMUyozOwotICAgICAgICBhc20gKAotICAgICAgICAgICAgInZtb3YuMzIgICAgICAgIGQyWzBdLCAlW2xlcnBQXSAgICAgICAgICBcbiIgICAgLy8gbG9hZCB0aGUgcG9zaXRpdmUgcGhhc2UKLSAgICAgICAgICAgICJ2bW92LjMyICAgICAgICBkMlsxXSwgJVtsZXJwTl0gICAgICAgICAgXG4iICAgIC8vIGxvYWQgdGhlIG5lZ2F0aXZlIHBoYXNlCi0gICAgICAgICAgICAidmVvciAgICAgICAgICAgcTAsIHEwLCBxMCAgICAgICAgICAgICAgIFxuIiAgICAvLyByZXN1bHQsIGluaXRpYWxpemUgdG8gMAotICAgICAgICAgICAgInZzaGwuczMyICAgICAgIGQyLCBkMiwgIzE2ICAgICAgICAgICAgICBcbiIgICAgLy8gY29udmVydCB0byAzMiBiaXRzCiAKLSAgICAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCi0gICAgICAgICAgICAidmxkMS4xNiAgICAgICAgeyBkNH0sIFslW3NQXV0gICAgICAgICAgIFxuIiAgICAvLyBsb2FkIDQgMTYtYml0cyBzdGVyZW8gc2FtcGxlcwotICAgICAgICAgICAgInZsZDEuMzIgICAgICAgIHsgcTh9LCBbJVtjb2Vmc1AwXToxMjhdISBcbiIgICAgLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMKLSAgICAgICAgICAgICJ2bGQxLjMyICAgICAgICB7IHE5fSwgWyVbY29lZnNQMV06MTI4XSEgXG4iICAgIC8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzIGZvciBpbnRlcnBvbGF0aW9uCi0gICAgICAgICAgICAidmxkMS4xNiAgICAgICAgeyBkNn0sIFslW3NOXV0hICAgICAgICAgIFxuIiAgICAvLyBsb2FkIDQgMTYtYml0cyBzdGVyZW8gc2FtcGxlcwotICAgICAgICAgICAgInZsZDEuMzIgICAgICAgIHtxMTB9LCBbJVtjb2Vmc04wXToxMjhdISBcbiIgICAgLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMKLSAgICAgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTExfSwgWyVbY29lZnNOMV06MTI4XSEgXG4iICAgIC8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzIGZvciBpbnRlcnBvbGF0aW9uCisgICAgICAgIGludDMyeDRfdCBzdW07CisgICAgICAgIGludDMyeDJfdCBsZXJwUE47CisgICAgICAgIGxlcnBQTiA9IHZkdXBfbl9zMzIoMCk7CisgICAgICAgIGxlcnBQTiA9IHZsZDFfbGFuZV9zMzIoKGludDMyX3QgKikmbGVycFAsIGxlcnBQTiwgMCk7CisgICAgICAgIGxlcnBQTiA9IHZsZDFfbGFuZV9zMzIoKGludDMyX3QgKikmbGVycE4sIGxlcnBQTiwgMSk7CisgICAgICAgIGxlcnBQTiA9IHZzaGxfbl9zMzIobGVycFBOLCAxNik7CisgICAgICAgIHN1bSA9IHZkdXBxX25fczMyKDApOwogCi0gICAgICAgICAgICAidnJldjY0LjE2ICAgICAgZDQsIGQ0ICAgICAgICAgICAgICAgICAgIFxuIiAgICAvLyByZXZlcnNlIDIgZnJhbWVzIG9mIHRoZSBwb3NpdGl2ZSBzaWRlCisgICAgICAgIGludDE2eDRfdCBzYW1wbGVQLCBzYW1wbGVOOworICAgICAgICBpbnQzMng0X3Qgc2FtcGxlUEV4dCwgc2FtcGxlTkV4dDsKKyAgICAgICAgaW50MzJ4NF90IGNvZWZzUFYwLCBjb2Vmc1BWMSwgY29lZnNOVjAsIGNvZWZzTlYxOwogCi0gICAgICAgICAgICAidnN1Yi5zMzIgICAgICAgIHE5LCAgcTksICBxOCAgICAgICAgICAgIFxuIiAgICAvLyBpbnRlcnBvbGF0ZSAoc3RlcDEpIDFzdCBzZXQgb2YgY29lZnMKLSAgICAgICAgICAgICJ2c3ViLnMzMiAgICAgICBxMTEsIHExMSwgcTEwICAgICAgICAgICAgXG4iICAgIC8vIGludGVycG9sYXRlIChzdGVwMSkgMm5kIHNldCBvZiBjb2V0cwotICAgICAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMiwgIGQ0LCAjMTUgICAgICAgICAgICBcbiIgICAgLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworICAgICAgICBjb2Vmc1AgPSAoY29uc3QgaW50MzJfdCopX19idWlsdGluX2Fzc3VtZV9hbGlnbmVkKGNvZWZzUCwgMTYpOworICAgICAgICBjb2Vmc04gPSAoY29uc3QgaW50MzJfdCopX19idWlsdGluX2Fzc3VtZV9hbGlnbmVkKGNvZWZzTiwgMTYpOworICAgICAgICBjb2Vmc1AxID0gKGNvbnN0IGludDMyX3QqKV9fYnVpbHRpbl9hc3N1bWVfYWxpZ25lZChjb2Vmc1AxLCAxNik7CisgICAgICAgIGNvZWZzTjEgPSAoY29uc3QgaW50MzJfdCopX19idWlsdGluX2Fzc3VtZV9hbGlnbmVkKGNvZWZzTjEsIDE2KTsKKyAgICAgICAgZm9yICg7IGNvdW50ID4gMDsgY291bnQgLT0gNCkgeworICAgICAgICAgICAgc2FtcGxlUCA9IHZsZDFfczE2KHNQKTsKKyAgICAgICAgICAgIHNhbXBsZU4gPSB2bGQxX3MxNihzTik7CisgICAgICAgICAgICBjb2Vmc1BWMCA9IHZsZDFxX3MzMihjb2Vmc1ApOworICAgICAgICAgICAgY29lZnNOVjAgPSB2bGQxcV9zMzIoY29lZnNOKTsKKyAgICAgICAgICAgIGNvZWZzUFYxID0gdmxkMXFfczMyKGNvZWZzUDEpOworICAgICAgICAgICAgY29lZnNOVjEgPSB2bGQxcV9zMzIoY29lZnNOMSk7CisgICAgICAgICAgICBzUCAtPSA0OworICAgICAgICAgICAgc04gKz0gNDsKKyAgICAgICAgICAgIGNvZWZzUCArPSA0OworICAgICAgICAgICAgY29lZnNOICs9IDQ7CisgICAgICAgICAgICBjb2Vmc1AxICs9IDQ7CisgICAgICAgICAgICBjb2Vmc04xICs9IDQ7CiAKLSAgICAgICAgICAgICJ2cXJkbXVsaC5zMzIgICAgcTksICBxOSwgZDJbMF0gICAgICAgICAgXG4iICAgIC8vIGludGVycG9sYXRlIChzdGVwMikgMXN0IHNldCBvZiBjb2VmcwotICAgICAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMSwgcTExLCBkMlsxXSAgICAgICAgICBcbiIgICAgLy8gaW50ZXJwb2xhdGUgKHN0ZXAzKSAybmQgc2V0IG9mIGNvZWZzCi0gICAgICAgICAgICAidnNobGwuczE2ICAgICAgcTE0LCAgZDYsICMxNSAgICAgICAgICAgIFxuIiAgICAvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisgICAgICAgICAgICBzYW1wbGVQID0gdnJldjY0X3MxNihzYW1wbGVQKTsKIAotICAgICAgICAgICAgInZhZGQuczMyICAgICAgICBxOCwgIHE4LCAgcTkgICAgICAgICAgICBcbiIgICAgLy8gaW50ZXJwb2xhdGUgKHN0ZXAzKSAxc3Qgc2V0Ci0gICAgICAgICAgICAidmFkZC5zMzIgICAgICAgcTEwLCBxMTAsIHExMSAgICAgICAgICAgIFxuIiAgICAvLyBpbnRlcnBvbGF0ZSAoc3RlcDQpIDJuZCBzZXQKLSAgICAgICAgICAgICJzdWJzICAgICAgICAgICAlW2NvdW50XSwgJVtjb3VudF0sICM0ICAgXG4iICAgIC8vIHVwZGF0ZSBsb29wIGNvdW50ZXIKKyAgICAgICAgICAgIC8vIGludGVycG9sYXRlIChzdGVwMSkKKyAgICAgICAgICAgIGNvZWZzUFYxID0gdnN1YnFfczMyKGNvZWZzUFYxLCBjb2Vmc1BWMCk7CisgICAgICAgICAgICBjb2Vmc05WMSA9IHZzdWJxX3MzMihjb2Vmc05WMSwgY29lZnNOVjApOworICAgICAgICAgICAgc2FtcGxlUEV4dCA9IHZzaGxsX25fczE2KHNhbXBsZVAsIDE1KTsKKyAgICAgICAgICAgIC8vIGludGVycG9sYXRlIChzdGVwMikKKyAgICAgICAgICAgIGNvZWZzUFYxID0gdnFyZG11bGhxX2xhbmVfczMyKGNvZWZzUFYxLCBsZXJwUE4sIDApOworICAgICAgICAgICAgY29lZnNOVjEgPSB2cXJkbXVsaHFfbGFuZV9zMzIoY29lZnNOVjEsIGxlcnBQTiwgMSk7CisgICAgICAgICAgICBzYW1wbGVORXh0ID0gdnNobGxfbl9zMTYoc2FtcGxlTiwgMTUpOworICAgICAgICAgICAgLy8gaW50ZXJwb2xhdGUgKHN0ZXAzKQorICAgICAgICAgICAgY29lZnNQVjAgPSB2YWRkcV9zMzIoY29lZnNQVjAsIGNvZWZzUFYxKTsKKyAgICAgICAgICAgIGNvZWZzTlYwID0gdmFkZHFfczMyKGNvZWZzTlYwLCBjb2Vmc05WMSk7CiAKLSAgICAgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTIsIHExMiwgcTggICAgICAgICAgICAgXG4iICAgIC8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKLSAgICAgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTQsIHExNCwgcTEwICAgICAgICAgICAgXG4iICAgIC8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKLSAgICAgICAgICAgICJzdWIgICAgICAgICAgICAlW3NQXSwgJVtzUF0sICM4ICAgICAgICAgXG4iICAgIC8vIG1vdmUgcG9pbnRlciB0byBuZXh0IHNldCBvZiBzYW1wbGVzCisgICAgICAgICAgICBzYW1wbGVQRXh0ID0gdnFyZG11bGhxX3MzMihzYW1wbGVQRXh0LCBjb2Vmc1BWMCk7CisgICAgICAgICAgICBzYW1wbGVORXh0ID0gdnFyZG11bGhxX3MzMihzYW1wbGVORXh0LCBjb2Vmc05WMCk7CisgICAgICAgICAgICBzdW0gPSB2YWRkcV9zMzIoc3VtLCBzYW1wbGVQRXh0KTsKKyAgICAgICAgICAgIHN1bSA9IHZhZGRxX3MzMihzdW0sIHNhbXBsZU5FeHQpOworICAgICAgICB9CisgICAgICAgIGludDMyeDJfdCB2b2x1bWVzViwgb3V0VjsKKyAgICAgICAgdm9sdW1lc1YgPSB2bGQxX3MzMihtVm9sdW1lU0lNRCk7CisgICAgICAgIG91dFYgPSB2bGQxX3MzMihvdXQpOwogCi0gICAgICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTIgICAgICAgICAgICAgIFxuIiAgICAvLyBhY2N1bXVsYXRlIHJlc3VsdAotICAgICAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTE0ICAgICAgICAgICAgICBcbiIgICAgLy8gYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgLy9hZGQgYWxsIDQgcGFydGlhbCBzdW1zCisgICAgICAgIGludDMyeDJfdCBzdW1Mb3csIHN1bUhpZ2g7CisgICAgICAgIHN1bUxvdyA9IHZnZXRfbG93X3MzMihzdW0pOworICAgICAgICBzdW1IaWdoID0gdmdldF9oaWdoX3MzMihzdW0pOworICAgICAgICBzdW1Mb3cgPSB2cGFkZF9zMzIoc3VtTG93LCBzdW1IaWdoKTsKKyAgICAgICAgc3VtTG93ID0gdnBhZGRfczMyKHN1bUxvdywgc3VtTG93KTsKIAotICAgICAgICAgICAgImJuZSAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICBcbiIgICAgLy8gbG9vcAotCi0gICAgICAgICAgICAidmxkMS5zMzIgICAgICAge2QyfSwgWyVbdkxSXV0gICAgICAgICAgIFxuIiAgICAvLyBsb2FkIHZvbHVtZXMKLSAgICAgICAgICAgICJ2bGQxLnMzMiAgICAgICB7ZDN9LCAlW291dF0gICAgICAgICAgICAgXG4iICAgIC8vIGxvYWQgdGhlIG91dHB1dAotICAgICAgICAgICAgInZwYWRkLnMzMiAgICAgIGQwLCBkMCwgZDEgICAgICAgICAgICAgICBcbiIgICAgLy8gYWRkIGFsbCA0IHBhcnRpYWwgc3VtcwotICAgICAgICAgICAgInZwYWRkLnMzMiAgICAgIGQwLCBkMCwgZDAgICAgICAgICAgICAgICBcbiIgICAgLy8gdG9nZXRoZXIKLSAgICAgICAgICAgICJ2ZHVwLmkzMiAgICAgICBkMCwgZDBbMF0gICAgICAgICAgICAgICAgXG4iICAgIC8vIGludGVybGVhdmUgTCxSIGNoYW5uZWxzCi0gICAgICAgICAgICAidnFyZG11bGguczMyICAgZDAsIGQwLCBkMiAgICAgICAgICAgICAgIFxuIiAgICAvLyBhcHBseSB2b2x1bWUKLSAgICAgICAgICAgICJ2YWRkLnMzMiAgICAgICBkMywgZDMsIGQwICAgICAgICAgICAgICAgXG4iICAgIC8vIGFjY3VtdWxhdGUgcmVzdWx0Ci0gICAgICAgICAgICAidnN0MS5zMzIgICAgICAge2QzfSwgJVtvdXRdICAgICAgICAgICAgIFxuIiAgICAvLyBzdG9yZSByZXN1bHQKLQotICAgICAgICAgICAgOiBbb3V0XSAgICAgIj1VdiIgKG91dFswXSksCi0gICAgICAgICAgICAgIFtjb3VudF0gICAiK3IiIChjb3VudCksCi0gICAgICAgICAgICAgIFtjb2Vmc1AwXSAiK3IiIChjb2Vmc1ApLAotICAgICAgICAgICAgICBbY29lZnNQMV0gIityIiAoY29lZnNQMSksCi0gICAgICAgICAgICAgIFtjb2Vmc04wXSAiK3IiIChjb2Vmc04pLAotICAgICAgICAgICAgICBbY29lZnNOMV0gIityIiAoY29lZnNOMSksCi0gICAgICAgICAgICAgIFtzUF0gICAgICAiK3IiIChzUCksCi0gICAgICAgICAgICAgIFtzTl0gICAgICAiK3IiIChzTikKLSAgICAgICAgICAgIDogW2xlcnBQXSAgICJyIiAobGVycFApLAotICAgICAgICAgICAgICBbbGVycE5dICAgInIiIChsZXJwTiksCi0gICAgICAgICAgICAgIFt2TFJdICAgICAiciIgKG1Wb2x1bWVTSU1EKQotICAgICAgICAgICAgOiAiY2MiLCAibWVtb3J5IiwKLSAgICAgICAgICAgICAgInEwIiwgInExIiwgInEyIiwgInEzIiwKLSAgICAgICAgICAgICAgInE4IiwgInE5IiwgInExMCIsICJxMTEiLAotICAgICAgICAgICAgICAicTEyIiwgInExNCIKLSAgICAgICAgKTsKKyAgICAgICAgc3VtTG93ID0gdnFyZG11bGhfczMyKHN1bUxvdywgdm9sdW1lc1YpOworICAgICAgICBvdXRWID0gdmFkZF9zMzIob3V0Viwgc3VtTG93KTsKKyAgICAgICAgdnN0MV9zMzIob3V0LCBvdXRWKTsKICAgICB9IGVsc2UgaWYgKENIQU5ORUxTID09IDIpIHsKICAgICAgICAgaW50MzJfdCBjb25zdCogY29lZnNQMSA9IGNvZWZzUCArIG9mZnNldDsKICAgICAgICAgaW50MzJfdCBjb25zdCogY29lZnNOMSA9IGNvZWZzTiArIG9mZnNldDsKICAgICAgICAgc1AgLT0gQ0hBTk5FTFMqMzsKLSAgICAgICAgYXNtICgKLSAgICAgICAgICAgICJ2bW92LjMyICAgICAgICBkMlswXSwgJVtsZXJwUF0gICAgICAgICAgXG4iICAgIC8vIGxvYWQgdGhlIHBvc2l0aXZlIHBoYXNlCi0gICAgICAgICAgICAidm1vdi4zMiAgICAgICAgZDJbMV0sICVbbGVycE5dICAgICAgICAgIFxuIiAgICAvLyBsb2FkIHRoZSBuZWdhdGl2ZSBwaGFzZQotICAgICAgICAgICAgInZlb3IgICAgICAgICAgIHEwLCBxMCwgcTAgICAgICAgICAgICAgICBcbiIgICAgLy8gcmVzdWx0LCBpbml0aWFsaXplIHRvIDAKLSAgICAgICAgICAgICJ2ZW9yICAgICAgICAgICBxNCwgcTQsIHE0ICAgICAgICAgICAgICAgXG4iICAgIC8vIHJlc3VsdCwgaW5pdGlhbGl6ZSB0byAwCi0gICAgICAgICAgICAidnNobC5zMzIgICAgICAgZDIsIGQyLCAjMTYgICAgICAgICAgICAgIFxuIiAgICAvLyBjb252ZXJ0IHRvIDMyIGJpdHMKIAotICAgICAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKLSAgICAgICAgICAgICJ2bGQyLjE2ICAgICAgICB7ZDQsZDV9LCBbJVtzUF1dICAgICAgICAgXG4iICAgIC8vIGxvYWQgNCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCi0gICAgICAgICAgICAidmxkMS4zMiAgICAgICAgeyBxOH0sIFslW2NvZWZzUDBdOjEyOF0hIFxuIiAgICAvLyBsb2FkIDQgMzItYml0cyBjb2VmcwotICAgICAgICAgICAgInZsZDEuMzIgICAgICAgIHsgcTl9LCBbJVtjb2Vmc1AxXToxMjhdISBcbiIgICAgLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMgZm9yIGludGVycG9sYXRpb24KLSAgICAgICAgICAgICJ2bGQyLjE2ICAgICAgICB7ZDYsZDd9LCBbJVtzTl1dISAgICAgICAgXG4iICAgIC8vIGxvYWQgNCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCi0gICAgICAgICAgICAidmxkMS4zMiAgICAgICAge3ExMH0sIFslW2NvZWZzTjBdOjEyOF0hIFxuIiAgICAvLyBsb2FkIDQgMzItYml0cyBjb2VmcwotICAgICAgICAgICAgInZsZDEuMzIgICAgICAgIHtxMTF9LCBbJVtjb2Vmc04xXToxMjhdISBcbiIgICAgLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMgZm9yIGludGVycG9sYXRpb24KKyAgICAgICAgaW50MzJ4NF90IHN1bTAsIHN1bTE7CisgICAgICAgIGludDMyeDJfdCBsZXJwUE47CiAKLSAgICAgICAgICAgICJ2cmV2NjQuMTYgICAgICBkNCwgZDQgICAgICAgICAgICAgICAgICAgXG4iICAgIC8vIHJldmVyc2UgMiBmcmFtZXMgb2YgdGhlIHBvc2l0aXZlIHNpZGUKLSAgICAgICAgICAgICJ2cmV2NjQuMTYgICAgICBkNSwgZDUgICAgICAgICAgICAgICAgICAgXG4iICAgIC8vIHJldmVyc2UgMiBmcmFtZXMgb2YgdGhlIHBvc2l0aXZlIHNpZGUKKyAgICAgICAgbGVycFBOID0gdmR1cF9uX3MzMigwKTsKKyAgICAgICAgbGVycFBOID0gdmxkMV9sYW5lX3MzMigoaW50MzJfdCAqKSZsZXJwUCwgbGVycFBOLCAwKTsKKyAgICAgICAgbGVycFBOID0gdmxkMV9sYW5lX3MzMigoaW50MzJfdCAqKSZsZXJwTiwgbGVycFBOLCAxKTsKKyAgICAgICAgbGVycFBOID0gdnNobF9uX3MzMihsZXJwUE4sIDE2KTsKKyAgICAgICAgc3VtMCA9IHZkdXBxX25fczMyKDApOworICAgICAgICBzdW0xID0gdmR1cHFfbl9zMzIoMCk7CiAKLSAgICAgICAgICAgICJ2c3ViLnMzMiAgICAgICAgcTksICBxOSwgIHE4ICAgICAgICAgICAgXG4iICAgIC8vIGludGVycG9sYXRlIChzdGVwMSkgMXN0IHNldCBvZiBjb2VmcwotICAgICAgICAgICAgInZzdWIuczMyICAgICAgIHExMSwgcTExLCBxMTAgICAgICAgICAgICBcbiIgICAgLy8gaW50ZXJwb2xhdGUgKHN0ZXAxKSAybmQgc2V0IG9mIGNvZXRzCi0gICAgICAgICAgICAidnNobGwuczE2ICAgICAgcTEyLCAgZDQsICMxNSAgICAgICAgICAgIFxuIiAgICAvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCi0gICAgICAgICAgICAidnNobGwuczE2ICAgICAgcTEzLCAgZDUsICMxNSAgICAgICAgICAgIFxuIiAgICAvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisgICAgICAgIGludDE2eDR4Ml90IHNhbXBsZVAsIHNhbXBsZU47CisgICAgICAgIGludDMyeDR4Ml90IHNhbXBsZVBFeHQsIHNhbXBsZU5FeHQ7CisgICAgICAgIGludDMyeDRfdCBjb2Vmc1BWMCwgY29lZnNQVjEsIGNvZWZzTlYwLCBjb2Vmc05WMTsKIAotICAgICAgICAgICAgInZxcmRtdWxoLnMzMiAgICBxOSwgIHE5LCBkMlswXSAgICAgICAgICBcbiIgICAgLy8gaW50ZXJwb2xhdGUgKHN0ZXAyKSAxc3Qgc2V0IG9mIGNvZWZzCi0gICAgICAgICAgICAidnFyZG11bGguczMyICAgcTExLCBxMTEsIGQyWzFdICAgICAgICAgIFxuIiAgICAvLyBpbnRlcnBvbGF0ZSAoc3RlcDMpIDJuZCBzZXQgb2YgY29lZnMKLSAgICAgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTQsICBkNiwgIzE1ICAgICAgICAgICAgXG4iICAgIC8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKLSAgICAgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTUsICBkNywgIzE1ICAgICAgICAgICAgXG4iICAgIC8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKyAgICAgICAgY29lZnNQID0gKGNvbnN0IGludDMyX3QqKV9fYnVpbHRpbl9hc3N1bWVfYWxpZ25lZChjb2Vmc1AsIDE2KTsKKyAgICAgICAgY29lZnNOID0gKGNvbnN0IGludDMyX3QqKV9fYnVpbHRpbl9hc3N1bWVfYWxpZ25lZChjb2Vmc04sIDE2KTsKKyAgICAgICAgY29lZnNQMSA9IChjb25zdCBpbnQzMl90KilfX2J1aWx0aW5fYXNzdW1lX2FsaWduZWQoY29lZnNQMSwgMTYpOworICAgICAgICBjb2Vmc04xID0gKGNvbnN0IGludDMyX3QqKV9fYnVpbHRpbl9hc3N1bWVfYWxpZ25lZChjb2Vmc04xLCAxNik7CisgICAgICAgIGZvciAoOyBjb3VudCA+IDA7IGNvdW50IC09IDQpIHsKKyAgICAgICAgICAgIHNhbXBsZVAgPSB2bGQyX3MxNihzUCk7CisgICAgICAgICAgICBzYW1wbGVOID0gdmxkMl9zMTYoc04pOworICAgICAgICAgICAgY29lZnNQVjAgPSB2bGQxcV9zMzIoY29lZnNQKTsKKyAgICAgICAgICAgIGNvZWZzTlYwID0gdmxkMXFfczMyKGNvZWZzTik7CisgICAgICAgICAgICBjb2Vmc1BWMSA9IHZsZDFxX3MzMihjb2Vmc1AxKTsKKyAgICAgICAgICAgIGNvZWZzTlYxID0gdmxkMXFfczMyKGNvZWZzTjEpOworICAgICAgICAgICAgc1AgLT0gODsKKyAgICAgICAgICAgIHNOICs9IDg7CisgICAgICAgICAgICBjb2Vmc1AgKz0gNDsKKyAgICAgICAgICAgIGNvZWZzTiArPSA0OworICAgICAgICAgICAgY29lZnNQMSArPSA0OworICAgICAgICAgICAgY29lZnNOMSArPSA0OwogCi0gICAgICAgICAgICAidmFkZC5zMzIgICAgICAgIHE4LCAgcTgsICBxOSAgICAgICAgICAgIFxuIiAgICAvLyBpbnRlcnBvbGF0ZSAoc3RlcDMpIDFzdCBzZXQKLSAgICAgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMTAsIHExMCwgcTExICAgICAgICAgICAgXG4iICAgIC8vIGludGVycG9sYXRlIChzdGVwNCkgMm5kIHNldAotICAgICAgICAgICAgInN1YnMgICAgICAgICAgICVbY291bnRdLCAlW2NvdW50XSwgIzQgICBcbiIgICAgLy8gdXBkYXRlIGxvb3AgY291bnRlcgorICAgICAgICAgICAgc2FtcGxlUC52YWxbMF0gPSB2cmV2NjRfczE2KHNhbXBsZVAudmFsWzBdKTsKKyAgICAgICAgICAgIHNhbXBsZVAudmFsWzFdID0gdnJldjY0X3MxNihzYW1wbGVQLnZhbFsxXSk7CiAKLSAgICAgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTIsIHExMiwgcTggICAgICAgICAgICAgXG4iICAgIC8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKLSAgICAgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTMsIHExMywgcTggICAgICAgICAgICAgXG4iICAgIC8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKLSAgICAgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTQsIHExNCwgcTEwICAgICAgICAgICAgXG4iICAgIC8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKLSAgICAgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTUsIHExNSwgcTEwICAgICAgICAgICAgXG4iICAgIC8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKLSAgICAgICAgICAgICJzdWIgICAgICAgICAgICAlW3NQXSwgJVtzUF0sICMxNiAgICAgICAgXG4iICAgIC8vIG1vdmUgcG9pbnRlciB0byBuZXh0IHNldCBvZiBzYW1wbGVzCisgICAgICAgICAgICAvLyBpbnRlcnBvbGF0ZSAoc3RlcDEpCisgICAgICAgICAgICBjb2Vmc1BWMSA9IHZzdWJxX3MzMihjb2Vmc1BWMSwgY29lZnNQVjApOworICAgICAgICAgICAgY29lZnNOVjEgPSB2c3VicV9zMzIoY29lZnNOVjEsIGNvZWZzTlYwKTsKKyAgICAgICAgICAgIHNhbXBsZVBFeHQudmFsWzBdID0gdnNobGxfbl9zMTYoc2FtcGxlUC52YWxbMF0sIDE1KTsKKyAgICAgICAgICAgIHNhbXBsZVBFeHQudmFsWzFdID0gdnNobGxfbl9zMTYoc2FtcGxlUC52YWxbMV0sIDE1KTsKKyAgICAgICAgICAgIC8vIGludGVycG9sYXRlIChzdGVwMikKKyAgICAgICAgICAgIGNvZWZzUFYxID0gdnFyZG11bGhxX2xhbmVfczMyKGNvZWZzUFYxLCBsZXJwUE4sIDApOworICAgICAgICAgICAgY29lZnNOVjEgPSB2cXJkbXVsaHFfbGFuZV9zMzIoY29lZnNOVjEsIGxlcnBQTiwgMSk7CisgICAgICAgICAgICBzYW1wbGVORXh0LnZhbFswXSA9IHZzaGxsX25fczE2KHNhbXBsZU4udmFsWzBdLCAxNSk7CisgICAgICAgICAgICBzYW1wbGVORXh0LnZhbFsxXSA9IHZzaGxsX25fczE2KHNhbXBsZU4udmFsWzFdLCAxNSk7CisgICAgICAgICAgICAvLyBpbnRlcnBvbGF0ZSAoc3RlcDMpCisgICAgICAgICAgICBjb2Vmc1BWMCA9IHZhZGRxX3MzMihjb2Vmc1BWMCwgY29lZnNQVjEpOworICAgICAgICAgICAgY29lZnNOVjAgPSB2YWRkcV9zMzIoY29lZnNOVjAsIGNvZWZzTlYxKTsKIAotICAgICAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTEyICAgICAgICAgICAgICBcbiIgICAgLy8gYWNjdW11bGF0ZSByZXN1bHQKLSAgICAgICAgICAgICJ2YWRkLnMzMiAgICAgICBxNCwgcTQsIHExMyAgICAgICAgICAgICAgXG4iICAgIC8vIGFjY3VtdWxhdGUgcmVzdWx0Ci0gICAgICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTQgICAgICAgICAgICAgIFxuIiAgICAvLyBhY2N1bXVsYXRlIHJlc3VsdAotICAgICAgICAgICAgInZhZGQuczMyICAgICAgIHE0LCBxNCwgcTE1ICAgICAgICAgICAgICBcbiIgICAgLy8gYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgICAgIHNhbXBsZVBFeHQudmFsWzBdID0gdnFyZG11bGhxX3MzMihzYW1wbGVQRXh0LnZhbFswXSwgY29lZnNQVjApOworICAgICAgICAgICAgc2FtcGxlUEV4dC52YWxbMV0gPSB2cXJkbXVsaHFfczMyKHNhbXBsZVBFeHQudmFsWzFdLCBjb2Vmc1BWMCk7CisgICAgICAgICAgICBzYW1wbGVORXh0LnZhbFswXSA9IHZxcmRtdWxocV9zMzIoc2FtcGxlTkV4dC52YWxbMF0sIGNvZWZzTlYwKTsKKyAgICAgICAgICAgIHNhbXBsZU5FeHQudmFsWzFdID0gdnFyZG11bGhxX3MzMihzYW1wbGVORXh0LnZhbFsxXSwgY29lZnNOVjApOworICAgICAgICAgICAgc3VtMCA9IHZhZGRxX3MzMihzdW0wLCBzYW1wbGVQRXh0LnZhbFswXSk7CisgICAgICAgICAgICBzdW0xID0gdmFkZHFfczMyKHN1bTEsIHNhbXBsZVBFeHQudmFsWzFdKTsKKyAgICAgICAgICAgIHN1bTAgPSB2YWRkcV9zMzIoc3VtMCwgc2FtcGxlTkV4dC52YWxbMF0pOworICAgICAgICAgICAgc3VtMSA9IHZhZGRxX3MzMihzdW0xLCBzYW1wbGVORXh0LnZhbFsxXSk7CisgICAgICAgIH0KKyAgICAgICAgaW50MzJ4Ml90IHZvbHVtZXNWLCBvdXRWOworICAgICAgICB2b2x1bWVzViA9IHZsZDFfczMyKG1Wb2x1bWVTSU1EKTsKKyAgICAgICAgb3V0ViA9IHZsZDFfczMyKG91dCk7CiAKLSAgICAgICAgICAgICJibmUgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgXG4iICAgIC8vIGxvb3AKKyAgICAgICAgLy9hZGQgYWxsIDQgcGFydGlhbCBzdW1zCisgICAgICAgIGludDMyeDJfdCBzdW1Mb3cwLCBzdW1IaWdoMCwgc3VtTG93MSwgc3VtSGlnaDE7CisgICAgICAgIHN1bUxvdzAgPSB2Z2V0X2xvd19zMzIoc3VtMCk7CisgICAgICAgIHN1bUhpZ2gwID0gdmdldF9oaWdoX3MzMihzdW0wKTsKKyAgICAgICAgc3VtTG93MSA9IHZnZXRfbG93X3MzMihzdW0xKTsKKyAgICAgICAgc3VtSGlnaDEgPSB2Z2V0X2hpZ2hfczMyKHN1bTEpOworICAgICAgICBzdW1Mb3cwID0gdnBhZGRfczMyKHN1bUxvdzAsIHN1bUhpZ2gwKTsKKyAgICAgICAgc3VtTG93MCA9IHZwYWRkX3MzMihzdW1Mb3cwLCBzdW1Mb3cwKTsKKyAgICAgICAgc3VtTG93MSA9IHZwYWRkX3MzMihzdW1Mb3cxLCBzdW1IaWdoMSk7CisgICAgICAgIHN1bUxvdzEgPSB2cGFkZF9zMzIoc3VtTG93MSwgc3VtTG93MSk7CiAKLSAgICAgICAgICAgICJ2bGQxLnMzMiAgICAgICB7ZDJ9LCBbJVt2TFJdXSAgICAgICAgICAgXG4iICAgIC8vIGxvYWQgdm9sdW1lcwotICAgICAgICAgICAgInZsZDEuczMyICAgICAgIHtkM30sICVbb3V0XSAgICAgICAgICAgICBcbiIgICAgLy8gbG9hZCB0aGUgb3V0cHV0Ci0gICAgICAgICAgICAidnBhZGQuczMyICAgICAgZDAsIGQwLCBkMSAgICAgICAgICAgICAgIFxuIiAgICAvLyBhZGQgYWxsIDQgcGFydGlhbCBzdW1zIGZyb20gcTAKLSAgICAgICAgICAgICJ2cGFkZC5zMzIgICAgICBkOCwgZDgsIGQ5ICAgICAgICAgICAgICAgXG4iICAgIC8vIGFkZCBhbGwgNCBwYXJ0aWFsIHN1bXMgZnJvbSBxNAotICAgICAgICAgICAgInZwYWRkLnMzMiAgICAgIGQwLCBkMCwgZDAgICAgICAgICAgICAgICBcbiIgICAgLy8gdG9nZXRoZXIKLSAgICAgICAgICAgICJ2cGFkZC5zMzIgICAgICBkOCwgZDgsIGQ4ICAgICAgICAgICAgICAgXG4iICAgIC8vIHRvZ2V0aGVyCi0gICAgICAgICAgICAidnRybi5zMzIgICAgICAgZDAsIGQ4ICAgICAgICAgICAgICAgICAgIFxuIiAgICAvLyBpbnRlcmxhY2UgTCxSIGNoYW5uZWxzCi0gICAgICAgICAgICAidnFyZG11bGguczMyICAgZDAsIGQwLCBkMiAgICAgICAgICAgICAgIFxuIiAgICAvLyBhcHBseSB2b2x1bWUKLSAgICAgICAgICAgICJ2YWRkLnMzMiAgICAgICBkMywgZDMsIGQwICAgICAgICAgICAgICAgXG4iICAgIC8vIGFjY3VtdWxhdGUgcmVzdWx0Ci0gICAgICAgICAgICAidnN0MS5zMzIgICAgICAge2QzfSwgJVtvdXRdICAgICAgICAgICAgIFxuIiAgICAvLyBzdG9yZSByZXN1bHQKLQotICAgICAgICAgICAgOiBbb3V0XSAgICAgIj1VdiIgKG91dFswXSksCi0gICAgICAgICAgICAgIFtjb3VudF0gICAiK3IiIChjb3VudCksCi0gICAgICAgICAgICAgIFtjb2Vmc1AwXSAiK3IiIChjb2Vmc1ApLAotICAgICAgICAgICAgICBbY29lZnNQMV0gIityIiAoY29lZnNQMSksCi0gICAgICAgICAgICAgIFtjb2Vmc04wXSAiK3IiIChjb2Vmc04pLAotICAgICAgICAgICAgICBbY29lZnNOMV0gIityIiAoY29lZnNOMSksCi0gICAgICAgICAgICAgIFtzUF0gICAgICAiK3IiIChzUCksCi0gICAgICAgICAgICAgIFtzTl0gICAgICAiK3IiIChzTikKLSAgICAgICAgICAgIDogW2xlcnBQXSAgICJyIiAobGVycFApLAotICAgICAgICAgICAgICBbbGVycE5dICAgInIiIChsZXJwTiksCi0gICAgICAgICAgICAgIFt2TFJdICAgICAiciIgKG1Wb2x1bWVTSU1EKQotICAgICAgICAgICAgOiAiY2MiLCAibWVtb3J5IiwKLSAgICAgICAgICAgICAgInEwIiwgInExIiwgInEyIiwgInEzIiwgInE0IiwKLSAgICAgICAgICAgICAgInE4IiwgInE5IiwgInExMCIsICJxMTEiLAotICAgICAgICAgICAgICAicTEyIiwgInExMyIsICJxMTQiLCAicTE1IgotICAgICAgICApOworICAgICAgICBzdW1Mb3cwID0gdnRybl9zMzIoc3VtTG93MCwgc3VtTG93MSkudmFsWzBdOworICAgICAgICBzdW1Mb3cwID0gdnFyZG11bGhfczMyKHN1bUxvdzAsIHZvbHVtZXNWKTsKKyAgICAgICAgb3V0ViA9IHZhZGRfczMyKG91dFYsIHN1bUxvdzApOworICAgICAgICB2c3QxX3MzMihvdXQsIG91dFYpOwogICAgIH0KKyNlbmRpZgogfQogCiB0ZW1wbGF0ZTxpbnQgQ0hBTk5FTFM+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJTaW5jLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJTaW5jLmgKaW5kZXggMWVhNDQ3NC4uNDY5MWQwYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyU2luYy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlclNpbmMuaApAQCAtMzQsNyArMzQsNyBAQAogCiBjbGFzcyBBdWRpb1Jlc2FtcGxlclNpbmMgOiBwdWJsaWMgQXVkaW9SZXNhbXBsZXIgewogcHVibGljOgotICAgIEF1ZGlvUmVzYW1wbGVyU2luYyhpbnQgYml0RGVwdGgsIGludCBpbkNoYW5uZWxDb3VudCwgaW50MzJfdCBzYW1wbGVSYXRlLAorICAgIEF1ZGlvUmVzYW1wbGVyU2luYyhpbnQgaW5DaGFubmVsQ291bnQsIGludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgIHNyY19xdWFsaXR5IHF1YWxpdHkgPSBISUdIX1FVQUxJVFkpOwogCiAgICAgdmlydHVhbCB+QXVkaW9SZXNhbXBsZXJTaW5jKCk7CkBAIC00NCw3ICs0NCw3IEBACiBwcml2YXRlOgogICAgIHZvaWQgaW5pdCgpOwogCi0gICAgdmlydHVhbCB2b2lkIHNldFZvbHVtZShpbnQxNl90IGxlZnQsIGludDE2X3QgcmlnaHQpOworICAgIHZpcnR1YWwgdm9pZCBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOwogCiAgICAgdGVtcGxhdGU8aW50IENIQU5ORUxTPgogICAgIHZvaWQgcmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1dhdGNoZG9nLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1dhdGNoZG9nLmNwcAppbmRleCA5M2QxODVlLi44NzdlNzc2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9XYXRjaGRvZy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvV2F0Y2hkb2cuY3BwCkBAIC0zNCw3ICszNCw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgc3RyY3B5KGJ1ZiwgIk4vQVxuIik7CiAgICAgfQotICAgIGZkcHJpbnRmKGZkLCAiV2F0Y2hkb2c6IHVuZGVycnVucz0ldSwgbG9ncz0ldSwgbW9zdCByZWNlbnQgdW5kZXJydW4gbG9nIGF0ICVzIiwKKyAgICBkcHJpbnRmKGZkLCAiV2F0Y2hkb2c6IHVuZGVycnVucz0ldSwgbG9ncz0ldSwgbW9zdCByZWNlbnQgdW5kZXJydW4gbG9nIGF0ICVzIiwKICAgICAgICAgICAgIG1VbmRlcnJ1bnMsIG1Mb2dzLCBidWYpOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQ29uZmlndXJhdGlvbi5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0NvbmZpZ3VyYXRpb24uaAppbmRleCBiYzIwMzhhLi42YThhZWIxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQ29uZmlndXJhdGlvbi5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9Db25maWd1cmF0aW9uLmgKQEAgLTMxLDkgKzMxLDcgQEAKIAogLy8gdW5jb21tZW50IHRvIGVuYWJsZSBmYXN0IG1peGVyIHRvIHRha2UgcGVyZm9ybWFuY2Ugc2FtcGxlcyBmb3IgbGF0ZXIgc3RhdGlzdGljYWwgYW5hbHlzaXMKICNkZWZpbmUgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCi0KLS8vIHVuY29tbWVudCB0byBhbGxvdyBmYXN0IHRyYWNrcyBhdCBub24tbmF0aXZlIHNhbXBsZSByYXRlCi0vLyNkZWZpbmUgRkFTVF9UUkFDS1NfQVRfTk9OX05BVElWRV9TQU1QTEVfUkFURQorLy8gRklYTUUgcmVuYW1lIHRvIEZBU1RfVEhSRUFEX1NUQVRJU1RJQ1MKIAogLy8gdW5jb21tZW50IGZvciBkZWJ1Z2dpbmcgdGltaW5nIHByb2JsZW1zIHJlbGF0ZWQgdG8gU3RhdGVRdWV1ZTo6cHVzaCgpCiAvLyNkZWZpbmUgU1RBVEVfUVVFVUVfRFVNUApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwCmluZGV4IDcyMGU0M2IuLjJkZDZmZjUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAKQEAgLTQ0LDYgKzQ0LDggQEAKICNkZWZpbmUgQUxPR1ZWKGEuLi4pIGRvIHsgfSB3aGlsZSgwKQogI2VuZGlmCiAKKyNkZWZpbmUgbWluKGEsIGIpICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNjYsNyArNjgsOCBAQAogICAgICAgbVN0YXR1cyhOT19JTklUKSwgbVN0YXRlKElETEUpLAogICAgICAgLy8gbU1heERpc2FibGVXYWl0Q250IGlzIHNldCBieSBjb25maWd1cmUoKSBhbmQgbm90IHVzZWQgYmVmb3JlIHRoZW4KICAgICAgIC8vIG1EaXNhYmxlV2FpdENudCBpcyBzZXQgYnkgcHJvY2VzcygpIGFuZCB1cGRhdGVTdGF0ZSgpIGFuZCBub3QgdXNlZCBiZWZvcmUgdGhlbgotICAgICAgbVN1c3BlbmRlZChmYWxzZSkKKyAgICAgIG1TdXNwZW5kZWQoZmFsc2UpLAorICAgICAgbUF1ZGlvRmxpbmdlcih0aHJlYWQtPm1BdWRpb0ZsaW5nZXIpCiB7CiAgICAgQUxPR1YoIkNvbnN0cnVjdG9yICVwIiwgdGhpcyk7CiAgICAgaW50IGxTdGF0dXM7CkBAIC0xMTYsOCArMTE5LDkgQEAKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAgICAgICAgIC8vIGZpcnN0IG5vbiBkZXN0cm95ZWQgaGFuZGxlIGlzIGNvbnNpZGVyZWQgaW4gY29udHJvbAotICAgICAgICBpZiAoY29udHJvbEhhbmRsZSA9PSBOVUxMKQorICAgICAgICBpZiAoY29udHJvbEhhbmRsZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBjb250cm9sSGFuZGxlID0gaDsKKyAgICAgICAgfQogICAgICAgICBpZiAoaC0+cHJpb3JpdHkoKSA8PSBwcmlvcml0eSkgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTE5NCw5ICsxOTgsMTkgQEAKICAgICAvLyBkZXN0cnVjdG9yIGJlZm9yZSB3ZSBleGl0CiAgICAgc3A8RWZmZWN0TW9kdWxlPiBrZWVwKHRoaXMpOwogICAgIHsKLSAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7Ci0gICAgICAgIGlmICh0aHJlYWQgIT0gMCkgewotICAgICAgICAgICAgdGhyZWFkLT5kaXNjb25uZWN0RWZmZWN0KGtlZXAsIGhhbmRsZSwgdW5waW5JZkxhc3QpOworICAgICAgICBpZiAocmVtb3ZlSGFuZGxlKGhhbmRsZSkgPT0gMCkgeworICAgICAgICAgICAgaWYgKCFpc1Bpbm5lZCgpIHx8IHVucGluSWZMYXN0KSB7CisgICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgaWYgKHRocmVhZCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbCh0aHJlYWQtPm1Mb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkLT5yZW1vdmVFZmZlY3RfbCh0aGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3A8QXVkaW9GbGluZ2VyPiBhZiA9IG1BdWRpb0ZsaW5nZXIucHJvbW90ZSgpOworICAgICAgICAgICAgICAgIGlmIChhZiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGFmLT51cGRhdGVPcnBoYW5FZmZlY3RDaGFpbnModGhpcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjp1bnJlZ2lzdGVyRWZmZWN0KG1JZCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIG1IYW5kbGVzLnNpemUoKTsKQEAgLTQyNiw2ICs0NDAsMjAgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjphZGRFZmZlY3RUb0hhbF9sKCkKK3sKKyAgICBpZiAoKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19UWVBFX1BSRV9QUk9DIHx8CisgICAgICAgICAobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfUE9TVF9QUk9DKSB7CisgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOworICAgICAgICBpZiAodGhyZWFkICE9IDApIHsKKyAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90ICpzdHJlYW0gPSB0aHJlYWQtPnN0cmVhbSgpOworICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtLT5hZGRfYXVkaW9fZWZmZWN0KHN0cmVhbSwgbUVmZmVjdEludGVyZmFjZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjpzdGFydCgpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTQ1MSwxNSArNDc5LDExIEBACiAgICAgaWYgKHN0YXR1cyA9PSAwKSB7CiAgICAgICAgIHN0YXR1cyA9IGNtZFN0YXR1czsKICAgICB9Ci0gICAgaWYgKHN0YXR1cyA9PSAwICYmCi0gICAgICAgICAgICAoKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19UWVBFX1BSRV9QUk9DIHx8Ci0gICAgICAgICAgICAgKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19UWVBFX1BPU1RfUFJPQykpIHsKLSAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7Ci0gICAgICAgIGlmICh0aHJlYWQgIT0gMCkgewotICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3QgKnN0cmVhbSA9IHRocmVhZC0+c3RyZWFtKCk7Ci0gICAgICAgICAgICBpZiAoc3RyZWFtICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBzdHJlYW0tPmFkZF9hdWRpb19lZmZlY3Qoc3RyZWFtLCBtRWZmZWN0SW50ZXJmYWNlKTsKLSAgICAgICAgICAgIH0KKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgYWRkRWZmZWN0VG9IYWxfbCgpOworICAgICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBtQ2hhaW4ucHJvbW90ZSgpOworICAgICAgICBpZiAoY2hhaW4gIT0gMCkgeworICAgICAgICAgICAgY2hhaW4tPmZvcmNlVm9sdW1lKCk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTgzMyw3ICs4NTcsMTEyIEBACiAgICAgcmV0dXJuIG1PZmZsb2FkZWQ7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQorU3RyaW5nOCBlZmZlY3RGbGFnc1RvU3RyaW5nKHVpbnQzMl90IGZsYWdzKSB7CisgICAgU3RyaW5nOCBzOworCisgICAgcy5hcHBlbmQoImNvbm4uIG1vZGU6ICIpOworICAgIHN3aXRjaCAoZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spIHsKKyAgICBjYXNlIEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUOiBzLmFwcGVuZCgiaW5zZXJ0Iik7IGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlk6IHMuYXBwZW5kKCJhdXhpbGlhcnkiKTsgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19UWVBFX1JFUExBQ0U6IHMuYXBwZW5kKCJyZXBsYWNlIik7IGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0ZMQUdfVFlQRV9QUkVfUFJPQzogcy5hcHBlbmQoInByZXByb2MiKTsgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19UWVBFX1BPU1RfUFJPQzogcy5hcHBlbmQoInBvc3Rwcm9jIik7IGJyZWFrOworICAgIGRlZmF1bHQ6IHMuYXBwZW5kKCJ1bmtub3duL3Jlc2VydmVkIik7IGJyZWFrOworICAgIH0KKyAgICBzLmFwcGVuZCgiLCAiKTsKKworICAgIHMuYXBwZW5kKCJpbnNlcnQgcHJlZjogIik7CisgICAgc3dpdGNoIChmbGFncyAmIEVGRkVDVF9GTEFHX0lOU0VSVF9NQVNLKSB7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19JTlNFUlRfQU5ZOiBzLmFwcGVuZCgiYW55Iik7IGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0ZMQUdfSU5TRVJUX0ZJUlNUOiBzLmFwcGVuZCgiZmlyc3QiKTsgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19JTlNFUlRfTEFTVDogcy5hcHBlbmQoImxhc3QiKTsgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19JTlNFUlRfRVhDTFVTSVZFOiBzLmFwcGVuZCgiZXhjbHVzaXZlIik7IGJyZWFrOworICAgIGRlZmF1bHQ6IHMuYXBwZW5kKCJ1bmtub3duL3Jlc2VydmVkIik7IGJyZWFrOworICAgIH0KKyAgICBzLmFwcGVuZCgiLCAiKTsKKworICAgIHMuYXBwZW5kKCJ2b2x1bWUgbWdtdDogIik7CisgICAgc3dpdGNoIChmbGFncyAmIEVGRkVDVF9GTEFHX1ZPTFVNRV9NQVNLKSB7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19WT0xVTUVfTk9ORTogcy5hcHBlbmQoIm5vbmUiKTsgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTDogcy5hcHBlbmQoImltcGxlbWVudHMgY29udHJvbCIpOyBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9GTEFHX1ZPTFVNRV9JTkQ6IHMuYXBwZW5kKCJyZXF1aXJlcyBpbmRpY2F0aW9uIik7IGJyZWFrOworICAgIGRlZmF1bHQ6IHMuYXBwZW5kKCJ1bmtub3duL3Jlc2VydmVkIik7IGJyZWFrOworICAgIH0KKyAgICBzLmFwcGVuZCgiLCAiKTsKKworICAgIHVpbnQzMl90IGRldmluZCA9IGZsYWdzICYgRUZGRUNUX0ZMQUdfREVWSUNFX01BU0s7CisgICAgaWYgKGRldmluZCkgeworICAgICAgICBzLmFwcGVuZCgiZGV2aWNlIGluZGljYXRpb246ICIpOworICAgICAgICBzd2l0Y2ggKGRldmluZCkgeworICAgICAgICBjYXNlIEVGRkVDVF9GTEFHX0RFVklDRV9JTkQ6IHMuYXBwZW5kKCJyZXF1aXJlcyB1cGRhdGVzIik7IGJyZWFrOworICAgICAgICBkZWZhdWx0OiBzLmFwcGVuZCgidW5rbm93bi9yZXNlcnZlZCIpOyBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzLmFwcGVuZCgiLCAiKTsKKyAgICB9CisKKyAgICBzLmFwcGVuZCgiaW5wdXQgbW9kZTogIik7CisgICAgc3dpdGNoIChmbGFncyAmIEVGRkVDVF9GTEFHX0lOUFVUX01BU0spIHsKKyAgICBjYXNlIEVGRkVDVF9GTEFHX0lOUFVUX0RJUkVDVDogcy5hcHBlbmQoImRpcmVjdCIpOyBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9GTEFHX0lOUFVUX1BST1ZJREVSOiBzLmFwcGVuZCgicHJvdmlkZXIiKTsgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19JTlBVVF9CT1RIOiBzLmFwcGVuZCgiZGlyZWN0K3Byb3ZpZGVyIik7IGJyZWFrOworICAgIGRlZmF1bHQ6IHMuYXBwZW5kKCJub3Qgc2V0Iik7IGJyZWFrOworICAgIH0KKyAgICBzLmFwcGVuZCgiLCAiKTsKKworICAgIHMuYXBwZW5kKCJvdXRwdXQgbW9kZTogIik7CisgICAgc3dpdGNoIChmbGFncyAmIEVGRkVDVF9GTEFHX09VVFBVVF9NQVNLKSB7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19PVVRQVVRfRElSRUNUOiBzLmFwcGVuZCgiZGlyZWN0Iik7IGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0ZMQUdfT1VUUFVUX1BST1ZJREVSOiBzLmFwcGVuZCgicHJvdmlkZXIiKTsgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19PVVRQVVRfQk9USDogcy5hcHBlbmQoImRpcmVjdCtwcm92aWRlciIpOyBicmVhazsKKyAgICBkZWZhdWx0OiBzLmFwcGVuZCgibm90IHNldCIpOyBicmVhazsKKyAgICB9CisgICAgcy5hcHBlbmQoIiwgIik7CisKKyAgICB1aW50MzJfdCBhY2NlbCA9IGZsYWdzICYgRUZGRUNUX0ZMQUdfSFdfQUNDX01BU0s7CisgICAgaWYgKGFjY2VsKSB7CisgICAgICAgIHMuYXBwZW5kKCJoYXJkd2FyZSBhY2NlbGVyYXRpb246ICIpOworICAgICAgICBzd2l0Y2ggKGFjY2VsKSB7CisgICAgICAgIGNhc2UgRUZGRUNUX0ZMQUdfSFdfQUNDX1NJTVBMRTogcy5hcHBlbmQoIm5vbi10dW5uZWxlZCIpOyBicmVhazsKKyAgICAgICAgY2FzZSBFRkZFQ1RfRkxBR19IV19BQ0NfVFVOTkVMOiBzLmFwcGVuZCgidHVubmVsZWQiKTsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IHMuYXBwZW5kKCJ1bmtub3duL3Jlc2VydmVkIik7IGJyZWFrOworICAgICAgICB9CisgICAgICAgIHMuYXBwZW5kKCIsICIpOworICAgIH0KKworICAgIHVpbnQzMl90IG1vZGVpbmQgPSBmbGFncyAmIEVGRkVDVF9GTEFHX0FVRElPX01PREVfTUFTSzsKKyAgICBpZiAobW9kZWluZCkgeworICAgICAgICBzLmFwcGVuZCgibW9kZSBpbmRpY2F0aW9uOiAiKTsKKyAgICAgICAgc3dpdGNoIChtb2RlaW5kKSB7CisgICAgICAgIGNhc2UgRUZGRUNUX0ZMQUdfQVVESU9fTU9ERV9JTkQ6IHMuYXBwZW5kKCJyZXF1aXJlZCIpOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogcy5hcHBlbmQoInVua25vd24vcmVzZXJ2ZWQiKTsgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcy5hcHBlbmQoIiwgIik7CisgICAgfQorCisgICAgdWludDMyX3Qgc3JjaW5kID0gZmxhZ3MgJiBFRkZFQ1RfRkxBR19BVURJT19TT1VSQ0VfTUFTSzsKKyAgICBpZiAoc3JjaW5kKSB7CisgICAgICAgIHMuYXBwZW5kKCJzb3VyY2UgaW5kaWNhdGlvbjogIik7CisgICAgICAgIHN3aXRjaCAoc3JjaW5kKSB7CisgICAgICAgIGNhc2UgRUZGRUNUX0ZMQUdfQVVESU9fU09VUkNFX0lORDogcy5hcHBlbmQoInJlcXVpcmVkIik7IGJyZWFrOworICAgICAgICBkZWZhdWx0OiBzLmFwcGVuZCgidW5rbm93bi9yZXNlcnZlZCIpOyBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzLmFwcGVuZCgiLCAiKTsKKyAgICB9CisKKyAgICBpZiAoZmxhZ3MgJiBFRkZFQ1RfRkxBR19PRkZMT0FEX01BU0spIHsKKyAgICAgICAgcy5hcHBlbmQoIm9mZmxvYWRhYmxlLCAiKTsKKyAgICB9CisKKyAgICBpbnQgbGVuID0gcy5sZW5ndGgoKTsKKyAgICBpZiAocy5sZW5ndGgoKSA+IDIpIHsKKyAgICAgICAgY2hhciAqc3RyID0gcy5sb2NrQnVmZmVyKGxlbik7CisgICAgICAgIHMudW5sb2NrQnVmZmVyKGxlbiAtIDIpOworICAgIH0KKyAgICByZXR1cm4gczsKK30KKworCit2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKIHsKICAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKQEAgLTg0OSw4ICs5NzgsOCBAQAogICAgIH0KIAogICAgIHJlc3VsdC5hcHBlbmQoIlx0XHRTZXNzaW9uIFN0YXR1cyBTdGF0ZSBFbmdpbmU6XG4iKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0JTA1ZCAgICUwM2QgICAgJTAzZCAgIDB4JTA4eFxuIiwKLSAgICAgICAgICAgIG1TZXNzaW9uSWQsIG1TdGF0dXMsIG1TdGF0ZSwgKHVpbnQzMl90KW1FZmZlY3RJbnRlcmZhY2UpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHQlMDVkICAgJTAzZCAgICAlMDNkICAgJXBcbiIsCisgICAgICAgICAgICBtU2Vzc2lvbklkLCBtU3RhdHVzLCBtU3RhdGUsIG1FZmZlY3RJbnRlcmZhY2UpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKIAogICAgIHJlc3VsdC5hcHBlbmQoIlx0XHREZXNjcmlwdG9yOlxuIik7CkBAIC04NjcsOSArOTk2LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIG1EZXNjcmlwdG9yLnR5cGUubm9kZVsyXSwKICAgICAgICAgICAgICAgICBtRGVzY3JpcHRvci50eXBlLm5vZGVbM10sbURlc2NyaXB0b3IudHlwZS5ub2RlWzRdLG1EZXNjcmlwdG9yLnR5cGUubm9kZVs1XSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHQtIGFwaVZlcnNpb246ICUwOFhcblx0XHQtIGZsYWdzOiAlMDhYXG4iLAorICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHQtIGFwaVZlcnNpb246ICUwOFhcblx0XHQtIGZsYWdzOiAlMDhYICglcylcbiIsCiAgICAgICAgICAgICBtRGVzY3JpcHRvci5hcGlWZXJzaW9uLAotICAgICAgICAgICAgbURlc2NyaXB0b3IuZmxhZ3MpOworICAgICAgICAgICAgbURlc2NyaXB0b3IuZmxhZ3MsCisgICAgICAgICAgICBlZmZlY3RGbGFnc1RvU3RyaW5nKG1EZXNjcmlwdG9yLmZsYWdzKS5zdHJpbmcoKSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHQtIG5hbWU6ICVzXG4iLAogICAgICAgICAgICAgbURlc2NyaXB0b3IubmFtZSk7CkBAIC04NzksMzggKzEwMDksMzggQEAKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAKICAgICByZXN1bHQuYXBwZW5kKCJcdFx0LSBJbnB1dCBjb25maWd1cmF0aW9uOlxuIik7Ci0gICAgcmVzdWx0LmFwcGVuZCgiXHRcdFx0QnVmZmVyICAgICBGcmFtZXMgIFNtcCByYXRlIENoYW5uZWxzIEZvcm1hdFxuIik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRcdFx0MHglMDh4ICUwNWQgICAlMDVkICAgICUwOHggJWRcbiIsCi0gICAgICAgICAgICAodWludDMyX3QpbUNvbmZpZy5pbnB1dENmZy5idWZmZXIucmF3LAorICAgIHJlc3VsdC5hcHBlbmQoIlx0XHRcdEZyYW1lcyAgU21wIHJhdGUgQ2hhbm5lbHMgRm9ybWF0IEJ1ZmZlclxuIik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRcdFx0JTA1enUgICAlMDVkICAgICUwOHggJTZkICglcykgJXBcbiIsCiAgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50LAogICAgICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzLAotICAgICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5mb3JtYXQpOworICAgICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5mb3JtYXQsCisgICAgICAgICAgICBmb3JtYXRUb1N0cmluZygoYXVkaW9fZm9ybWF0X3QpbUNvbmZpZy5pbnB1dENmZy5mb3JtYXQpLAorICAgICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5idWZmZXIucmF3KTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAKICAgICByZXN1bHQuYXBwZW5kKCJcdFx0LSBPdXRwdXQgY29uZmlndXJhdGlvbjpcbiIpOwogICAgIHJlc3VsdC5hcHBlbmQoIlx0XHRcdEJ1ZmZlciAgICAgRnJhbWVzICBTbXAgcmF0ZSBDaGFubmVscyBGb3JtYXRcbiIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHRcdDB4JTA4eCAlMDVkICAgJTA1ZCAgICAlMDh4ICVkXG4iLAotICAgICAgICAgICAgKHVpbnQzMl90KW1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5yYXcsCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRcdFx0JXAgJTA1enUgICAlMDVkICAgICUwOHggJWQgKCVzKVxuIiwKKyAgICAgICAgICAgIG1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5yYXcsCiAgICAgICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5idWZmZXIuZnJhbWVDb3VudCwKICAgICAgICAgICAgIG1Db25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgIG1Db25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzLAotICAgICAgICAgICAgbUNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0KTsKKyAgICAgICAgICAgIG1Db25maWcub3V0cHV0Q2ZnLmZvcm1hdCwKKyAgICAgICAgICAgIGZvcm1hdFRvU3RyaW5nKChhdWRpb19mb3JtYXRfdCltQ29uZmlnLm91dHB1dENmZy5mb3JtYXQpKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0JWQgQ2xpZW50czpcbiIsIG1IYW5kbGVzLnNpemUoKSk7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRcdCV6dSBDbGllbnRzOlxuIiwgbUhhbmRsZXMuc2l6ZSgpKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgcmVzdWx0LmFwcGVuZCgiXHRcdFx0UGlkICAgUHJpb3JpdHkgQ3RybCBMb2NrZWQgY2xpZW50IHNlcnZlclxuIik7CisgICAgcmVzdWx0LmFwcGVuZCgiXHRcdFx0ICBQaWQgUHJpb3JpdHkgQ3RybCBMb2NrZWQgY2xpZW50IHNlcnZlclxuIik7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSGFuZGxlcy5zaXplKCk7ICsraSkgewogICAgICAgICBFZmZlY3RIYW5kbGUgKmhhbmRsZSA9IG1IYW5kbGVzW2ldOwogICAgICAgICBpZiAoaGFuZGxlICE9IE5VTEwgJiYgIWhhbmRsZS0+ZGVzdHJveWVkX2woKSkgewotICAgICAgICAgICAgaGFuZGxlLT5kdW1wKGJ1ZmZlciwgU0laRSk7CisgICAgICAgICAgICBoYW5kbGUtPmR1bXBUb0J1ZmZlcihidWZmZXIsIFNJWkUpOwogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKLQogICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5sZW5ndGgoKSk7CiAKICAgICBpZiAobG9ja2VkKSB7CkBAIC05NDAsMTggKzEwNzAsMTUgQEAKICAgICB9CiAgICAgaW50IGJ1Zk9mZnNldCA9ICgoc2l6ZW9mKGVmZmVjdF9wYXJhbV9jYmxrX3QpIC0gMSkgLyBzaXplb2YoaW50KSArIDEpICogc2l6ZW9mKGludCk7CiAgICAgbUNibGtNZW1vcnkgPSBjbGllbnQtPmhlYXAoKS0+YWxsb2NhdGUoRUZGRUNUX1BBUkFNX0JVRkZFUl9TSVpFICsgYnVmT2Zmc2V0KTsKLSAgICBpZiAobUNibGtNZW1vcnkgIT0gMCkgewotICAgICAgICBtQ2JsayA9IHN0YXRpY19jYXN0PGVmZmVjdF9wYXJhbV9jYmxrX3QgKj4obUNibGtNZW1vcnktPnBvaW50ZXIoKSk7Ci0KLSAgICAgICAgaWYgKG1DYmxrICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG5ldyhtQ2JsaykgZWZmZWN0X3BhcmFtX2NibGtfdCgpOwotICAgICAgICAgICAgbUJ1ZmZlciA9ICh1aW50OF90ICopbUNibGsgKyBidWZPZmZzZXQ7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgeworICAgIGlmIChtQ2Jsa01lbW9yeSA9PSAwIHx8CisgICAgICAgICAgICAobUNibGsgPSBzdGF0aWNfY2FzdDxlZmZlY3RfcGFyYW1fY2Jsa190ICo+KG1DYmxrTWVtb3J5LT5wb2ludGVyKCkpKSA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJub3QgZW5vdWdoIG1lbW9yeSBmb3IgRWZmZWN0IHNpemU9JXUiLCBFRkZFQ1RfUEFSQU1fQlVGRkVSX1NJWkUgKwogICAgICAgICAgICAgICAgIHNpemVvZihlZmZlY3RfcGFyYW1fY2Jsa190KSk7CisgICAgICAgIG1DYmxrTWVtb3J5LmNsZWFyKCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CisgICAgbmV3KG1DYmxrKSBlZmZlY3RfcGFyYW1fY2Jsa190KCk7CisgICAgbUJ1ZmZlciA9ICh1aW50OF90ICopbUNibGsgKyBidWZPZmZzZXQ7CiB9CiAKIEF1ZGlvRmxpbmdlcjo6RWZmZWN0SGFuZGxlOjp+RWZmZWN0SGFuZGxlKCkKQEAgLTk2OCw2ICsxMDk1LDExIEBACiAgICAgZGlzY29ubmVjdChmYWxzZSk7CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0SGFuZGxlOjppbml0Q2hlY2soKQoreworICAgIHJldHVybiBtQ2xpZW50ID09IDAgfHwgbUNibGtNZW1vcnkgIT0gMCA/IE9LIDogTk9fTUVNT1JZOworfQorCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZTo6ZW5hYmxlKCkKIHsKICAgICBBTE9HVigiZW5hYmxlICVwIiwgdGhpcyk7CkBAIC0xMDgyLDggKzEyMTQsOCBAQAogICAgICAgICAgICAgbUNibGstPn5lZmZlY3RfcGFyYW1fY2Jsa190KCk7ICAgLy8gZGVzdHJveSBvdXIgc2hhcmVkLXN0cnVjdHVyZS4KICAgICAgICAgfQogICAgICAgICBtQ2Jsa01lbW9yeS5jbGVhcigpOyAgICAvLyBmcmVlIHRoZSBzaGFyZWQgbWVtb3J5IGJlZm9yZSByZWxlYXNpbmcgdGhlIGhlYXAgaXQgYmVsb25ncyB0bwotICAgICAgICAvLyBDbGllbnQgZGVzdHJ1Y3RvciBtdXN0IHJ1biB3aXRoIEF1ZGlvRmxpbmdlciBtdXRleCBsb2NrZWQKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1DbGllbnQtPmF1ZGlvRmxpbmdlcigpLT5tTG9jayk7CisgICAgICAgIC8vIENsaWVudCBkZXN0cnVjdG9yIG11c3QgcnVuIHdpdGggQXVkaW9GbGluZ2VyIGNsaWVudCBtdXRleCBsb2NrZWQKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1DbGllbnQtPmF1ZGlvRmxpbmdlcigpLT5tQ2xpZW50TG9jayk7CiAgICAgICAgIG1DbGllbnQuY2xlYXIoKTsKICAgICB9CiB9CkBAIC0xMjA4LDE1ICsxMzQwLDE1IEBACiB9CiAKIAotdm9pZCBBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZTo6ZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplKQordm9pZCBBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZTo6ZHVtcFRvQnVmZmVyKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpCiB7CiAgICAgYm9vbCBsb2NrZWQgPSBtQ2JsayAhPSBOVUxMICYmIEF1ZGlvRmxpbmdlcjo6ZHVtcFRyeUxvY2sobUNibGstPmxvY2spOwogCi0gICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiXHRcdFx0JTA1ZCAlMDVkICAgICUwMXUgICAgJTAxdSAgICAgICUwNXUgICUwNXVcbiIsCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiXHRcdFx0JTVkICAgICU1ZCAgJTNzICAgICUzcyAgJTV1ICAlNXVcbiIsCiAgICAgICAgICAgICAobUNsaWVudCA9PSAwKSA/IGdldHBpZF9jYWNoZWQgOiBtQ2xpZW50LT5waWQoKSwKICAgICAgICAgICAgIG1Qcmlvcml0eSwKLSAgICAgICAgICAgIG1IYXNDb250cm9sLAotICAgICAgICAgICAgIWxvY2tlZCwKKyAgICAgICAgICAgIG1IYXNDb250cm9sID8gInllcyIgOiAibm8iLAorICAgICAgICAgICAgbG9ja2VkID8gInllcyIgOiAibm8iLAogICAgICAgICAgICAgbUNibGsgPyBtQ2Jsay0+Y2xpZW50SW5kZXggOiAwLAogICAgICAgICAgICAgbUNibGsgPyBtQ2Jsay0+c2VydmVySW5kZXggOiAwCiAgICAgICAgICAgICApOwpAQCAtMTIzMyw3ICsxMzY1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkKQogICAgIDogbVRocmVhZCh0aHJlYWQpLCBtU2Vzc2lvbklkKHNlc3Npb25JZCksIG1BY3RpdmVUcmFja0NudCgwKSwgbVRyYWNrQ250KDApLCBtVGFpbEJ1ZmZlckNvdW50KDApLAogICAgICAgbU93bkluQnVmZmVyKGZhbHNlKSwgbVZvbHVtZUN0cmxJZHgoLTEpLCBtTGVmdFZvbHVtZShVSU5UX01BWCksIG1SaWdodFZvbHVtZShVSU5UX01BWCksCi0gICAgICBtTmV3TGVmdFZvbHVtZShVSU5UX01BWCksIG1OZXdSaWdodFZvbHVtZShVSU5UX01BWCkKKyAgICAgIG1OZXdMZWZ0Vm9sdW1lKFVJTlRfTUFYKSwgbU5ld1JpZ2h0Vm9sdW1lKFVJTlRfTUFYKSwgbUZvcmNlVm9sdW1lKGZhbHNlKQogewogICAgIG1TdHJhdGVneSA9IEF1ZGlvU3lzdGVtOjpnZXRTdHJhdGVneUZvclN0cmVhbShBVURJT19TVFJFQU1fTVVTSUMpOwogICAgIGlmICh0aHJlYWQgPT0gTlVMTCkgewpAQCAtMTMwNyw3ICsxNDM5LDEzIEBACiAvLyBNdXN0IGJlIGNhbGxlZCB3aXRoIEVmZmVjdENoYWluOjptTG9jayBsb2NrZWQKIHZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6Y2xlYXJJbnB1dEJ1ZmZlcl9sKHNwPFRocmVhZEJhc2U+IHRocmVhZCkKIHsKLSAgICBtZW1zZXQobUluQnVmZmVyLCAwLCB0aHJlYWQtPmZyYW1lQ291bnQoKSAqIHRocmVhZC0+ZnJhbWVTaXplKCkpOworICAgIC8vIFRPRE86IFRoaXMgd2lsbCBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSwgZGVwZW5kaW5nIG9uIG11bHRpY2hhbm5lbAorICAgIC8vIGFuZCBzYW1wbGUgZm9ybWF0IGNoYW5nZXMgZm9yIGVmZmVjdHMuCisgICAgLy8gQ3VycmVudGx5IGVmZmVjdHMgcHJvY2Vzc2luZyBpcyBvbmx5IGF2YWlsYWJsZSBmb3Igc3RlcmVvLCBBVURJT19GT1JNQVRfUENNXzE2X0JJVAorICAgIC8vICg0IGJ5dGVzIGZyYW1lIHNpemUpCisgICAgY29uc3Qgc2l6ZV90IGZyYW1lU2l6ZSA9CisgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSAqIG1pbihGQ0NfMiwgdGhyZWFkLT5jaGFubmVsQ291bnQoKSk7CisgICAgbWVtc2V0KG1JbkJ1ZmZlciwgMCwgdGhyZWFkLT5mcmFtZUNvdW50KCkgKiBmcmFtZVNpemUpOwogfQogCiAvLyBNdXN0IGJlIGNhbGxlZCB3aXRoIEVmZmVjdENoYWluOjptTG9jayBsb2NrZWQKQEAgLTE1NTAsNyArMTY4OCw4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoY3RybElkeCA9PSBtVm9sdW1lQ3RybElkeCAmJiAqbGVmdCA9PSBtTGVmdFZvbHVtZSAmJiAqcmlnaHQgPT0gbVJpZ2h0Vm9sdW1lKSB7CisgICAgaWYgKCFpc1ZvbHVtZUZvcmNlZCgpICYmIGN0cmxJZHggPT0gbVZvbHVtZUN0cmxJZHggJiYKKyAgICAgICAgICAgICpsZWZ0ID09IG1MZWZ0Vm9sdW1lICYmICpyaWdodCA9PSBtUmlnaHRWb2x1bWUpIHsKICAgICAgICAgaWYgKGhhc0NvbnRyb2wpIHsKICAgICAgICAgICAgICpsZWZ0ID0gbU5ld0xlZnRWb2x1bWU7CiAgICAgICAgICAgICAqcmlnaHQgPSBtTmV3UmlnaHRWb2x1bWU7CkBAIC0xNTkxLDM5ICsxNzMwLDUyIEBACiAgICAgcmV0dXJuIGhhc0NvbnRyb2w7CiB9CiAKK3ZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6c3luY0hhbEVmZmVjdHNTdGF0ZSgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtRWZmZWN0c1tpXS0+c3RhdGUoKSA9PSBFZmZlY3RNb2R1bGU6OkFDVElWRSB8fAorICAgICAgICAgICAgICAgIG1FZmZlY3RzW2ldLT5zdGF0ZSgpID09IEVmZmVjdE1vZHVsZTo6U1RPUFBJTkcpIHsKKyAgICAgICAgICAgIG1FZmZlY3RzW2ldLT5hZGRFZmZlY3RUb0hhbF9sKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKIHZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCiB7CiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CiAgICAgY2hhciBidWZmZXJbU0laRV07CiAgICAgU3RyaW5nOCByZXN1bHQ7CiAKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJFZmZlY3RzIGZvciBzZXNzaW9uICVkOlxuIiwgbVNlc3Npb25JZCk7CisgICAgc2l6ZV90IG51bUVmZmVjdHMgPSBtRWZmZWN0cy5zaXplKCk7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICVkIGVmZmVjdHMgZm9yIHNlc3Npb24gJWRcbiIsIG51bUVmZmVjdHMsIG1TZXNzaW9uSWQpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKIAotICAgIGJvb2wgbG9ja2VkID0gQXVkaW9GbGluZ2VyOjpkdW1wVHJ5TG9jayhtTG9jayk7Ci0gICAgLy8gZmFpbGVkIHRvIGxvY2sgLSBBdWRpb0ZsaW5nZXIgaXMgcHJvYmFibHkgZGVhZGxvY2tlZAotICAgIGlmICghbG9ja2VkKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIlx0Q291bGQgbm90IGxvY2sgbXV0ZXg6XG4iKTsKLSAgICB9Ci0KLSAgICByZXN1bHQuYXBwZW5kKCJcdE51bSBmeCBJbiBidWZmZXIgICBPdXQgYnVmZmVyICAgQWN0aXZlIHRyYWNrczpcbiIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0JTAyZCAgICAgMHglMDh4ICAweCUwOHggICAlZFxuIiwKLSAgICAgICAgICAgIG1FZmZlY3RzLnNpemUoKSwKLSAgICAgICAgICAgICh1aW50MzJfdCltSW5CdWZmZXIsCi0gICAgICAgICAgICAodWludDMyX3QpbU91dEJ1ZmZlciwKLSAgICAgICAgICAgIG1BY3RpdmVUcmFja0NudCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0cy5zaXplKCk7ICsraSkgewotICAgICAgICBzcDxFZmZlY3RNb2R1bGU+IGVmZmVjdCA9IG1FZmZlY3RzW2ldOwotICAgICAgICBpZiAoZWZmZWN0ICE9IDApIHsKLSAgICAgICAgICAgIGVmZmVjdC0+ZHVtcChmZCwgYXJncyk7CisgICAgaWYgKG51bUVmZmVjdHMpIHsKKyAgICAgICAgYm9vbCBsb2NrZWQgPSBBdWRpb0ZsaW5nZXI6OmR1bXBUcnlMb2NrKG1Mb2NrKTsKKyAgICAgICAgLy8gZmFpbGVkIHRvIGxvY2sgLSBBdWRpb0ZsaW5nZXIgaXMgcHJvYmFibHkgZGVhZGxvY2tlZAorICAgICAgICBpZiAoIWxvY2tlZCkgeworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXHRDb3VsZCBub3QgbG9jayBtdXRleDpcbiIpOwogICAgICAgICB9Ci0gICAgfQogCi0gICAgaWYgKGxvY2tlZCkgewotICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiXHRJbiBidWZmZXIgICBPdXQgYnVmZmVyICAgQWN0aXZlIHRyYWNrczpcbiIpOworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdCVwICAlcCAgICVkXG4iLAorICAgICAgICAgICAgICAgIG1JbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICBtT3V0QnVmZmVyLAorICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFja0NudCk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1FZmZlY3RzOyArK2kpIHsKKyAgICAgICAgICAgIHNwPEVmZmVjdE1vZHVsZT4gZWZmZWN0ID0gbUVmZmVjdHNbaV07CisgICAgICAgICAgICBpZiAoZWZmZWN0ICE9IDApIHsKKyAgICAgICAgICAgICAgICBlZmZlY3QtPmR1bXAoZmQsIGFyZ3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGxvY2tlZCkgeworICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgIH0KICAgICB9CiB9CiAKQEAgLTE4MjEsNCArMTk3MywxMyBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpzZXRUaHJlYWQoY29uc3Qgc3A8VGhyZWFkQmFzZT4mIHRocmVhZCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1UaHJlYWQgPSB0aHJlYWQ7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0cy5zaXplKCk7IGkrKykgeworICAgICAgICBtRWZmZWN0c1tpXS0+c2V0VGhyZWFkKHRocmVhZCk7CisgICAgfQorfQorCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmgKaW5kZXggYjcxNzg1Ny4uNmY5M2Y4MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5oCkBAIC0xMTksNiArMTE5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX09GRkxPQURfU1VQUE9SVEVEKSAhPSAwOyB9CiAgICAgc3RhdHVzX3QgICAgICAgICBzZXRPZmZsb2FkZWQoYm9vbCBvZmZsb2FkZWQsIGF1ZGlvX2lvX2hhbmRsZV90IGlvKTsKICAgICBib29sICAgICAgICAgICAgIGlzT2ZmbG9hZGVkKCkgY29uc3Q7CisgICAgdm9pZCAgICAgICAgICAgICBhZGRFZmZlY3RUb0hhbF9sKCk7CiAKICAgICB2b2lkICAgICAgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIApAQCAtMTUzLDYgKzE1NCw3IEBACiAgICAgdWludDMyX3QgbURpc2FibGVXYWl0Q250OyAgICAgICAvLyBjdXJyZW50IHByb2Nlc3MoKSBjYWxscyBjb3VudCBkdXJpbmcgZGlzYWJsZSBwZXJpb2QuCiAgICAgYm9vbCAgICAgbVN1c3BlbmRlZDsgICAgICAgICAgICAvLyBlZmZlY3QgaXMgc3VzcGVuZGVkOiB0ZW1wb3JhcmlseSBkaXNhYmxlZCBieSBmcmFtZXdvcmsKICAgICBib29sICAgICBtT2ZmbG9hZGVkOyAgICAgICAgICAgIC8vIGVmZmVjdCBpcyBjdXJyZW50bHkgb2ZmbG9hZGVkIHRvIHRoZSBhdWRpbyBEU1AKKyAgICB3cDxBdWRpb0ZsaW5nZXI+ICAgIG1BdWRpb0ZsaW5nZXI7CiB9OwogCiAvLyBUaGUgRWZmZWN0SGFuZGxlIGNsYXNzIGltcGxlbWVudHMgdGhlIElFZmZlY3QgaW50ZXJmYWNlLiBJdCBwcm92aWRlcyByZXNvdXJjZXMKQEAgLTE2OSw2ICsxNzEsNyBAQAogICAgICAgICAgICAgY29uc3Qgc3A8SUVmZmVjdENsaWVudD4mIGVmZmVjdENsaWVudCwKICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHkpOwogICAgIHZpcnR1YWwgfkVmZmVjdEhhbmRsZSgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCk7CiAKICAgICAvLyBJRWZmZWN0CiAgICAgdmlydHVhbCBzdGF0dXNfdCBlbmFibGUoKTsKQEAgLTIwOCw3ICsyMTEsNyBAQAogICAgIC8vIGRlc3Ryb3llZF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgYXNzb2NpYXRlZCBFZmZlY3RNb2R1bGUgbUxvY2sgaGVsZAogICAgIGJvb2wgZGVzdHJveWVkX2woKSBjb25zdCB7IHJldHVybiBtRGVzdHJveWVkOyB9CiAKLSAgICB2b2lkIGR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CisgICAgdm9pZCBkdW1wVG9CdWZmZXIoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CiAKIHByb3RlY3RlZDoKICAgICBmcmllbmQgY2xhc3MgQXVkaW9GbGluZ2VyOyAgICAgICAgICAvLyBmb3IgbUVmZmVjdCwgbUhhc0NvbnRyb2wsIG1FbmFibGVkCkBAIC0yNjksNiArMjcyLDcgQEAKICAgICBzcDxFZmZlY3RNb2R1bGU+IGdldEVmZmVjdEZyb21EZXNjX2woZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcik7CiAgICAgc3A8RWZmZWN0TW9kdWxlPiBnZXRFZmZlY3RGcm9tSWRfbChpbnQgaWQpOwogICAgIHNwPEVmZmVjdE1vZHVsZT4gZ2V0RWZmZWN0RnJvbVR5cGVfbChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlKTsKKyAgICAvLyBGSVhNRSB1c2UgZmxvYXQgdG8gaW1wcm92ZSB0aGUgZHluYW1pYyByYW5nZQogICAgIGJvb2wgc2V0Vm9sdW1lX2wodWludDMyX3QgKmxlZnQsIHVpbnQzMl90ICpyaWdodCk7CiAgICAgdm9pZCBzZXREZXZpY2VfbChhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKICAgICB2b2lkIHNldE1vZGVfbChhdWRpb19tb2RlX3QgbW9kZSk7CkBAIC0zMTUsNiArMzE5LDE0IEBACiAgICAgLy8gQXQgbGVhc3Qgb25lIG5vbiBvZmZsb2FkYWJsZSBlZmZlY3QgaW4gdGhlIGNoYWluIGlzIGVuYWJsZWQKICAgICBib29sIGlzTm9uT2ZmbG9hZGFibGVFbmFibGVkKCk7CiAKKyAgICAvLyB1c2UgcmVsZWFzZV9jYXMgYmVjYXVzZSB3ZSBkb24ndCBjYXJlIGFib3V0IHRoZSBvYnNlcnZlZCB2YWx1ZSwganVzdCB3YW50IHRvIG1ha2Ugc3VyZSB0aGUKKyAgICAvLyBuZXcgdmFsdWUgaXMgb2JzZXJ2YWJsZS4KKyAgICB2b2lkIGZvcmNlVm9sdW1lKCkgeyBhbmRyb2lkX2F0b21pY19yZWxlYXNlX2NhcyhmYWxzZSwgdHJ1ZSwgJm1Gb3JjZVZvbHVtZSk7IH0KKyAgICAvLyB1c2UgYWNxdWlyZV9jYXMgYmVjYXVzZSB3ZSBhcmUgaW50ZXJlc3RlZCBpbiB0aGUgb2JzZXJ2ZWQgdmFsdWUgYW5kCisgICAgLy8gd2UgYXJlIHRoZSBvbmx5IG9ic2VydmVycy4KKyAgICBib29sIGlzVm9sdW1lRm9yY2VkKCkgeyByZXR1cm4gKGFuZHJvaWRfYXRvbWljX2FjcXVpcmVfY2FzKHRydWUsIGZhbHNlLCAmbUZvcmNlVm9sdW1lKSA9PSAwKTsgfQorCisgICAgdm9pZCBzeW5jSGFsRWZmZWN0c1N0YXRlKCk7CiAKICAgICB2b2lkIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIApAQCAtMzQ1LDYgKzM1Nyw4IEBACiAKICAgICB2b2lkIGNsZWFySW5wdXRCdWZmZXJfbChzcDxUaHJlYWRCYXNlPiB0aHJlYWQpOwogCisgICAgdm9pZCBzZXRUaHJlYWQoY29uc3Qgc3A8VGhyZWFkQmFzZT4mIHRocmVhZCk7CisKICAgICB3cDxUaHJlYWRCYXNlPiBtVGhyZWFkOyAgICAgLy8gcGFyZW50IG1peGVyIHRocmVhZAogICAgIE11dGV4IG1Mb2NrOyAgICAgICAgICAgICAgICAvLyBtdXRleCBwcm90ZWN0aW5nIGVmZmVjdCBsaXN0CiAgICAgVmVjdG9yPCBzcDxFZmZlY3RNb2R1bGU+ID4gbUVmZmVjdHM7IC8vIGxpc3Qgb2YgZWZmZWN0IG1vZHVsZXMKQEAgLTM3MCw0ICszODQsNSBAQAogICAgIC8vIHRpbWVMb3cgZmllbGRzIGFtb25nIGVmZmVjdCB0eXBlIFVVSURzLgogICAgIC8vIFVwZGF0ZWQgYnkgdXBkYXRlU3VzcGVuZGVkU2Vzc2lvbnNfbCgpIG9ubHkuCiAgICAgS2V5ZWRWZWN0b3I8IGludCwgc3A8U3VzcGVuZGVkRWZmZWN0RGVzYz4gPiBtU3VzcGVuZGVkRWZmZWN0czsKKyAgICB2b2xhdGlsZSBpbnQzMl90IG1Gb3JjZVZvbHVtZTsgLy8gZm9yY2UgbmV4dCB2b2x1bWUgY29tbWFuZCBiZWNhdXNlIGEgbmV3IGVmZmVjdCB3YXMgZW5hYmxlZAogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MTNlMjYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmUuY3BwCkBAIC0wLDAgKzEsMjIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJGYXN0Q2FwdHVyZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQVVESU8KKworI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKKyNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisjaW5jbHVkZSAiRmFzdENhcHR1cmUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKnN0YXRpYyovIGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgRmFzdENhcHR1cmU6OmluaXRpYWw7CisKK0Zhc3RDYXB0dXJlOjpGYXN0Q2FwdHVyZSgpIDogRmFzdFRocmVhZCgpLAorICAgIGlucHV0U291cmNlKE5VTEwpLCBpbnB1dFNvdXJjZUdlbigwKSwgcGlwZVNpbmsoTlVMTCksIHBpcGVTaW5rR2VuKDApLAorICAgIHJlYWRCdWZmZXIoTlVMTCksIHJlYWRCdWZmZXJTdGF0ZSgtMSksIGZvcm1hdChGb3JtYXRfSW52YWxpZCksIHNhbXBsZVJhdGUoMCksCisgICAgLy8gZHVtbXlEdW1wU3RhdGUKKyAgICB0b3RhbE5hdGl2ZUZyYW1lc1JlYWQoMCkKK3sKKyAgICBwcmV2aW91cyA9ICZpbml0aWFsOworICAgIGN1cnJlbnQgPSAmaW5pdGlhbDsKKworICAgIG1EdW1teUR1bXBTdGF0ZSA9ICZkdW1teUR1bXBTdGF0ZTsKK30KKworRmFzdENhcHR1cmU6On5GYXN0Q2FwdHVyZSgpCit7Cit9CisKK0Zhc3RDYXB0dXJlU3RhdGVRdWV1ZSogRmFzdENhcHR1cmU6OnNxKCkKK3sKKyAgICByZXR1cm4gJm1TUTsKK30KKworY29uc3QgRmFzdFRocmVhZFN0YXRlICpGYXN0Q2FwdHVyZTo6cG9sbCgpCit7CisgICAgcmV0dXJuIG1TUS5wb2xsKCk7Cit9CisKK3ZvaWQgRmFzdENhcHR1cmU6OnNldExvZyhOQkxvZzo6V3JpdGVyICpsb2dXcml0ZXIgX191bnVzZWQpCit7Cit9CisKK3ZvaWQgRmFzdENhcHR1cmU6Om9uSWRsZSgpCit7CisgICAgcHJlSWRsZSA9ICooY29uc3QgRmFzdENhcHR1cmVTdGF0ZSAqKWN1cnJlbnQ7CisgICAgY3VycmVudCA9ICZwcmVJZGxlOworfQorCit2b2lkIEZhc3RDYXB0dXJlOjpvbkV4aXQoKQoreworICAgIGRlbGV0ZVtdIHJlYWRCdWZmZXI7Cit9CisKK2Jvb2wgRmFzdENhcHR1cmU6OmlzU3ViQ2xhc3NDb21tYW5kKEZhc3RUaHJlYWRTdGF0ZTo6Q29tbWFuZCBjb21tYW5kKQoreworICAgIHN3aXRjaCAoKEZhc3RDYXB0dXJlU3RhdGU6OkNvbW1hbmQpIGNvbW1hbmQpIHsKKyAgICBjYXNlIEZhc3RDYXB0dXJlU3RhdGU6OlJFQUQ6CisgICAgY2FzZSBGYXN0Q2FwdHVyZVN0YXRlOjpXUklURToKKyAgICBjYXNlIEZhc3RDYXB0dXJlU3RhdGU6OlJFQURfV1JJVEU6CisgICAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK3ZvaWQgRmFzdENhcHR1cmU6Om9uU3RhdGVDaGFuZ2UoKQoreworICAgIGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgKiBjb25zdCBjdXJyZW50ID0gKGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgKikgdGhpcy0+Y3VycmVudDsKKyAgICBjb25zdCBGYXN0Q2FwdHVyZVN0YXRlICogY29uc3QgcHJldmlvdXMgPSAoY29uc3QgRmFzdENhcHR1cmVTdGF0ZSAqKSB0aGlzLT5wcmV2aW91czsKKyAgICBGYXN0Q2FwdHVyZUR1bXBTdGF0ZSAqIGNvbnN0IGR1bXBTdGF0ZSA9IChGYXN0Q2FwdHVyZUR1bXBTdGF0ZSAqKSB0aGlzLT5kdW1wU3RhdGU7CisgICAgY29uc3Qgc2l6ZV90IGZyYW1lQ291bnQgPSBjdXJyZW50LT5tRnJhbWVDb3VudDsKKworICAgIGJvb2wgZWl0aGVyQ2hhbmdlZCA9IGZhbHNlOworCisgICAgLy8gY2hlY2sgZm9yIGNoYW5nZSBpbiBpbnB1dCBIQUwgY29uZmlndXJhdGlvbgorICAgIE5CQUlPX0Zvcm1hdCBwcmV2aW91c0Zvcm1hdCA9IGZvcm1hdDsKKyAgICBpZiAoY3VycmVudC0+bUlucHV0U291cmNlR2VuICE9IGlucHV0U291cmNlR2VuKSB7CisgICAgICAgIGlucHV0U291cmNlID0gY3VycmVudC0+bUlucHV0U291cmNlOworICAgICAgICBpbnB1dFNvdXJjZUdlbiA9IGN1cnJlbnQtPm1JbnB1dFNvdXJjZUdlbjsKKyAgICAgICAgaWYgKGlucHV0U291cmNlID09IE5VTEwpIHsKKyAgICAgICAgICAgIGZvcm1hdCA9IEZvcm1hdF9JbnZhbGlkOworICAgICAgICAgICAgc2FtcGxlUmF0ZSA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3JtYXQgPSBpbnB1dFNvdXJjZS0+Zm9ybWF0KCk7CisgICAgICAgICAgICBzYW1wbGVSYXRlID0gRm9ybWF0X3NhbXBsZVJhdGUoZm9ybWF0KTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxDb3VudCA9IEZvcm1hdF9jaGFubmVsQ291bnQoZm9ybWF0KTsKKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKGNoYW5uZWxDb3VudCA9PSAxIHx8IGNoYW5uZWxDb3VudCA9PSAyKTsKKyAgICAgICAgfQorICAgICAgICBkdW1wU3RhdGUtPm1TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKKyAgICAgICAgZWl0aGVyQ2hhbmdlZCA9IHRydWU7CisgICAgfQorCisgICAgLy8gY2hlY2sgZm9yIGNoYW5nZSBpbiBwaXBlCisgICAgaWYgKGN1cnJlbnQtPm1QaXBlU2lua0dlbiAhPSBwaXBlU2lua0dlbikgeworICAgICAgICBwaXBlU2luayA9IGN1cnJlbnQtPm1QaXBlU2luazsKKyAgICAgICAgcGlwZVNpbmtHZW4gPSBjdXJyZW50LT5tUGlwZVNpbmtHZW47CisgICAgICAgIGVpdGhlckNoYW5nZWQgPSB0cnVlOworICAgIH0KKworICAgIC8vIGlucHV0IHNvdXJjZSBhbmQgcGlwZSBzaW5rIG11c3QgYmUgY29tcGF0aWJsZQorICAgIGlmIChlaXRoZXJDaGFuZ2VkICYmIGlucHV0U291cmNlICE9IE5VTEwgJiYgcGlwZVNpbmsgIT0gTlVMTCkgeworICAgICAgICBBTE9HX0FTU0VSVChGb3JtYXRfaXNFcXVhbChmb3JtYXQsIHBpcGVTaW5rLT5mb3JtYXQoKSkpOworICAgIH0KKworICAgIGlmICgoIUZvcm1hdF9pc0VxdWFsKGZvcm1hdCwgcHJldmlvdXNGb3JtYXQpKSB8fCAoZnJhbWVDb3VudCAhPSBwcmV2aW91cy0+bUZyYW1lQ291bnQpKSB7CisgICAgICAgIC8vIEZJWE1FIHRvIGF2b2lkIHByaW9yaXR5IGludmVyc2lvbiwgZG9uJ3QgZGVsZXRlIGhlcmUKKyAgICAgICAgZGVsZXRlW10gcmVhZEJ1ZmZlcjsKKyAgICAgICAgcmVhZEJ1ZmZlciA9IE5VTEw7CisgICAgICAgIGlmIChmcmFtZUNvdW50ID4gMCAmJiBzYW1wbGVSYXRlID4gMCkgeworICAgICAgICAgICAgLy8gRklYTUUgbmV3IG1heSBibG9jayBmb3IgdW5ib3VuZGVkIHRpbWUgYXQgaW50ZXJuYWwgbXV0ZXggb2YgdGhlIGhlYXAKKyAgICAgICAgICAgIC8vICAgICAgIGltcGxlbWVudGF0aW9uOyBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gaGF2ZSBub3JtYWwgY2FwdHVyZSB0aHJlYWQgYWxsb2NhdGUgZm9yCisgICAgICAgICAgICAvLyAgICAgICB1cyB0byBhdm9pZCBibG9ja2luZyBoZXJlIGFuZCB0byBwcmV2ZW50IHBvc3NpYmxlIHByaW9yaXR5IGludmVyc2lvbgorICAgICAgICAgICAgdW5zaWduZWQgY2hhbm5lbENvdW50ID0gRm9ybWF0X2NoYW5uZWxDb3VudChmb3JtYXQpOworICAgICAgICAgICAgLy8gRklYTUUgZnJhbWVTaXplCisgICAgICAgICAgICByZWFkQnVmZmVyID0gbmV3IHNob3J0W2ZyYW1lQ291bnQgKiBjaGFubmVsQ291bnRdOworICAgICAgICAgICAgbWVtc2V0KHJlYWRCdWZmZXIsIDAsIGZyYW1lQ291bnQgKiBjaGFubmVsQ291bnQgKiBzaXplb2YocmVhZEJ1ZmZlclswXSkpOworICAgICAgICAgICAgcGVyaW9kTnMgPSAoZnJhbWVDb3VudCAqIDEwMDAwMDAwMDBMTCkgLyBzYW1wbGVSYXRlOyAgICAvLyAxLjAwCisgICAgICAgICAgICB1bmRlcnJ1bk5zID0gKGZyYW1lQ291bnQgKiAxNzUwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgIC8vIDEuNzUKKyAgICAgICAgICAgIG92ZXJydW5OcyA9IChmcmFtZUNvdW50ICogNTAwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgICAgLy8gMC41MAorICAgICAgICAgICAgZm9yY2VOcyA9IChmcmFtZUNvdW50ICogOTUwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgICAgICAvLyAwLjk1CisgICAgICAgICAgICB3YXJtdXBOcyA9IChmcmFtZUNvdW50ICogNTAwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgICAgIC8vIDAuNTAKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBlcmlvZE5zID0gMDsKKyAgICAgICAgICAgIHVuZGVycnVuTnMgPSAwOworICAgICAgICAgICAgb3ZlcnJ1bk5zID0gMDsKKyAgICAgICAgICAgIGZvcmNlTnMgPSAwOworICAgICAgICAgICAgd2FybXVwTnMgPSAwOworICAgICAgICB9CisgICAgICAgIHJlYWRCdWZmZXJTdGF0ZSA9IC0xOworICAgICAgICBkdW1wU3RhdGUtPm1GcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyAgICB9CisKK30KKwordm9pZCBGYXN0Q2FwdHVyZTo6b25Xb3JrKCkKK3sKKyAgICBjb25zdCBGYXN0Q2FwdHVyZVN0YXRlICogY29uc3QgY3VycmVudCA9IChjb25zdCBGYXN0Q2FwdHVyZVN0YXRlICopIHRoaXMtPmN1cnJlbnQ7CisgICAgRmFzdENhcHR1cmVEdW1wU3RhdGUgKiBjb25zdCBkdW1wU3RhdGUgPSAoRmFzdENhcHR1cmVEdW1wU3RhdGUgKikgdGhpcy0+ZHVtcFN0YXRlOworICAgIGNvbnN0IEZhc3RDYXB0dXJlU3RhdGU6OkNvbW1hbmQgY29tbWFuZCA9IHRoaXMtPmNvbW1hbmQ7CisgICAgY29uc3Qgc2l6ZV90IGZyYW1lQ291bnQgPSBjdXJyZW50LT5tRnJhbWVDb3VudDsKKworICAgIGlmICgoY29tbWFuZCAmIEZhc3RDYXB0dXJlU3RhdGU6OlJFQUQpIC8qJiYgaXNXYXJtKi8pIHsKKyAgICAgICAgQUxPR19BU1NFUlQoaW5wdXRTb3VyY2UgIT0gTlVMTCk7CisgICAgICAgIEFMT0dfQVNTRVJUKHJlYWRCdWZmZXIgIT0gTlVMTCk7CisgICAgICAgIGR1bXBTdGF0ZS0+bVJlYWRTZXF1ZW5jZSsrOworICAgICAgICBBVFJBQ0VfQkVHSU4oInJlYWQiKTsKKyAgICAgICAgc3NpemVfdCBmcmFtZXNSZWFkID0gaW5wdXRTb3VyY2UtPnJlYWQocmVhZEJ1ZmZlciwgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjprSW52YWxpZFBUUyk7CisgICAgICAgIEFUUkFDRV9FTkQoKTsKKyAgICAgICAgZHVtcFN0YXRlLT5tUmVhZFNlcXVlbmNlKys7CisgICAgICAgIGlmIChmcmFtZXNSZWFkID49IDApIHsKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKHNpemVfdCkgZnJhbWVzUmVhZCA+IGZyYW1lQ291bnQpOworICAgICAgICAgICAgdG90YWxOYXRpdmVGcmFtZXNSZWFkICs9IGZyYW1lc1JlYWQ7CisgICAgICAgICAgICBkdW1wU3RhdGUtPm1GcmFtZXNSZWFkID0gdG90YWxOYXRpdmVGcmFtZXNSZWFkOworICAgICAgICAgICAgcmVhZEJ1ZmZlclN0YXRlID0gZnJhbWVzUmVhZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGR1bXBTdGF0ZS0+bVJlYWRFcnJvcnMrKzsKKyAgICAgICAgICAgIHJlYWRCdWZmZXJTdGF0ZSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgLy8gRklYTUUgcmVuYW1lIHRvIGF0dGVtcHRlZElPCisgICAgICAgIGF0dGVtcHRlZFdyaXRlID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoY29tbWFuZCAmIEZhc3RDYXB0dXJlU3RhdGU6OldSSVRFKSB7CisgICAgICAgIEFMT0dfQVNTRVJUKHBpcGVTaW5rICE9IE5VTEwpOworICAgICAgICBBTE9HX0FTU0VSVChyZWFkQnVmZmVyICE9IE5VTEwpOworICAgICAgICBpZiAocmVhZEJ1ZmZlclN0YXRlIDwgMCkgeworICAgICAgICAgICAgdW5zaWduZWQgY2hhbm5lbENvdW50ID0gRm9ybWF0X2NoYW5uZWxDb3VudChmb3JtYXQpOworICAgICAgICAgICAgLy8gRklYTUUgZnJhbWVTaXplCisgICAgICAgICAgICBtZW1zZXQocmVhZEJ1ZmZlciwgMCwgZnJhbWVDb3VudCAqIGNoYW5uZWxDb3VudCAqIHNpemVvZihzaG9ydCkpOworICAgICAgICAgICAgcmVhZEJ1ZmZlclN0YXRlID0gZnJhbWVDb3VudDsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVhZEJ1ZmZlclN0YXRlID4gMCkgeworICAgICAgICAgICAgc3NpemVfdCBmcmFtZXNXcml0dGVuID0gcGlwZVNpbmstPndyaXRlKHJlYWRCdWZmZXIsIHJlYWRCdWZmZXJTdGF0ZSk7CisgICAgICAgICAgICAvLyBGSVhNRSBUaGlzIHN1cHBvcnRzIGF0IG1vc3Qgb25lIGZhc3QgY2FwdHVyZSBjbGllbnQuCisgICAgICAgICAgICAvLyAgICAgICBUbyBoYW5kbGUgbXVsdGlwbGUgY2xpZW50cyB0aGlzIGNvdWxkIGJlIGNvbnZlcnRlZCB0byBhbiBhcnJheSwKKyAgICAgICAgICAgIC8vICAgICAgIG9yIHdpdGggYSBsb3QgbW9yZSB3b3JrIHRoZSBjb250cm9sIGJsb2NrIGNvdWxkIGJlIHNoYXJlZCBieSBhbGwgY2xpZW50cy4KKyAgICAgICAgICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsayA9IGN1cnJlbnQtPm1DYmxrOworICAgICAgICAgICAgaWYgKGNibGsgIT0gTlVMTCAmJiBmcmFtZXNXcml0dGVuID4gMCkgeworICAgICAgICAgICAgICAgIGludDMyX3QgcmVhciA9IGNibGstPnUubVN0cmVhbWluZy5tUmVhcjsKKyAgICAgICAgICAgICAgICBhbmRyb2lkX2F0b21pY19yZWxlYXNlX3N0b3JlKGZyYW1lc1dyaXR0ZW4gKyByZWFyLCAmY2Jsay0+dS5tU3RyZWFtaW5nLm1SZWFyKTsKKyAgICAgICAgICAgICAgICBjYmxrLT5tU2VydmVyICs9IGZyYW1lc1dyaXR0ZW47CisgICAgICAgICAgICAgICAgaW50MzJfdCBvbGQgPSBhbmRyb2lkX2F0b21pY19vcihDQkxLX0ZVVEVYX1dBS0UsICZjYmxrLT5tRnV0ZXgpOworICAgICAgICAgICAgICAgIGlmICghKG9sZCAmIENCTEtfRlVURVhfV0FLRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2xpZW50IGlzIG5ldmVyIGluIHNlcnZlciBwcm9jZXNzLCBzbyBkb24ndCB1c2UgRlVURVhfV0FLRV9QUklWQVRFCisgICAgICAgICAgICAgICAgICAgICh2b2lkKSBzeXNjYWxsKF9fTlJfZnV0ZXgsICZjYmxrLT5tRnV0ZXgsIEZVVEVYX1dBS0UsIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworRmFzdENhcHR1cmVEdW1wU3RhdGU6OkZhc3RDYXB0dXJlRHVtcFN0YXRlKCkgOiBGYXN0VGhyZWFkRHVtcFN0YXRlKCksCisgICAgbVJlYWRTZXF1ZW5jZSgwKSwgbUZyYW1lc1JlYWQoMCksIG1SZWFkRXJyb3JzKDApLCBtU2FtcGxlUmF0ZSgwKSwgbUZyYW1lQ291bnQoMCkKK3sKK30KKworRmFzdENhcHR1cmVEdW1wU3RhdGU6On5GYXN0Q2FwdHVyZUR1bXBTdGF0ZSgpCit7Cit9CisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTM1YjlkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlLmgKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9BVURJT19GQVNUX0NBUFRVUkVfSAorI2RlZmluZSBBTkRST0lEX0FVRElPX0ZBU1RfQ0FQVFVSRV9ICisKKyNpbmNsdWRlICJGYXN0VGhyZWFkLmgiCisjaW5jbHVkZSAiU3RhdGVRdWV1ZS5oIgorI2luY2x1ZGUgIkZhc3RDYXB0dXJlU3RhdGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit0eXBlZGVmIFN0YXRlUXVldWU8RmFzdENhcHR1cmVTdGF0ZT4gRmFzdENhcHR1cmVTdGF0ZVF1ZXVlOworCitzdHJ1Y3QgRmFzdENhcHR1cmVEdW1wU3RhdGUgOiBGYXN0VGhyZWFkRHVtcFN0YXRlIHsKKyAgICBGYXN0Q2FwdHVyZUR1bXBTdGF0ZSgpOworICAgIC8qdmlydHVhbCovIH5GYXN0Q2FwdHVyZUR1bXBTdGF0ZSgpOworCisgICAgLy8gRklYTUUgYnkgcmVuYW1pbmcsIGNvdWxkIHB1bGwgdXAgbWFueSBvZiB0aGVzZSB0byBGYXN0VGhyZWFkRHVtcFN0YXRlCisgICAgdWludDMyX3QgbVJlYWRTZXF1ZW5jZTsgICAgIC8vIGluY3JlbWVudGVkIGJlZm9yZSBhbmQgYWZ0ZXIgZWFjaCByZWFkKCkKKyAgICB1aW50MzJfdCBtRnJhbWVzUmVhZDsgICAgICAgLy8gdG90YWwgbnVtYmVyIG9mIGZyYW1lcyByZWFkIHN1Y2Nlc3NmdWxseQorICAgIHVpbnQzMl90IG1SZWFkRXJyb3JzOyAgICAgICAvLyB0b3RhbCBudW1iZXIgb2YgcmVhZCgpIGVycm9ycworICAgIHVpbnQzMl90IG1TYW1wbGVSYXRlOworICAgIHNpemVfdCAgIG1GcmFtZUNvdW50OworfTsKKworY2xhc3MgRmFzdENhcHR1cmUgOiBwdWJsaWMgRmFzdFRocmVhZCB7CisKK3B1YmxpYzoKKyAgICAgICAgICAgIEZhc3RDYXB0dXJlKCk7CisgICAgdmlydHVhbCB+RmFzdENhcHR1cmUoKTsKKworICAgICAgICAgICAgRmFzdENhcHR1cmVTdGF0ZVF1ZXVlKiAgc3EoKTsKKworcHJpdmF0ZToKKyAgICAgICAgICAgIEZhc3RDYXB0dXJlU3RhdGVRdWV1ZSAgIG1TUTsKKworICAgIC8vIGNhbGxvdXRzCisgICAgdmlydHVhbCBjb25zdCBGYXN0VGhyZWFkU3RhdGUgKnBvbGwoKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0TG9nKE5CTG9nOjpXcml0ZXIgKmxvZ1dyaXRlcik7CisgICAgdmlydHVhbCB2b2lkIG9uSWRsZSgpOworICAgIHZpcnR1YWwgdm9pZCBvbkV4aXQoKTsKKyAgICB2aXJ0dWFsIGJvb2wgaXNTdWJDbGFzc0NvbW1hbmQoRmFzdFRocmVhZFN0YXRlOjpDb21tYW5kIGNvbW1hbmQpOworICAgIHZpcnR1YWwgdm9pZCBvblN0YXRlQ2hhbmdlKCk7CisgICAgdmlydHVhbCB2b2lkIG9uV29yaygpOworCisgICAgc3RhdGljIGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgaW5pdGlhbDsKKyAgICBGYXN0Q2FwdHVyZVN0YXRlIHByZUlkbGU7IC8vIGNvcHkgb2Ygc3RhdGUgYmVmb3JlIHdlIHdlbnQgaW50byBpZGxlCisgICAgLy8gRklYTUUgYnkgcmVuYW1pbmcsIGNvdWxkIHB1bGwgdXAgbWFueSBvZiB0aGVzZSB0byBGYXN0VGhyZWFkCisgICAgTkJBSU9fU291cmNlICppbnB1dFNvdXJjZTsKKyAgICBpbnQgaW5wdXRTb3VyY2VHZW47CisgICAgTkJBSU9fU2luayAqcGlwZVNpbms7CisgICAgaW50IHBpcGVTaW5rR2VuOworICAgIHNob3J0ICpyZWFkQnVmZmVyOworICAgIHNzaXplX3QgcmVhZEJ1ZmZlclN0YXRlOyAgICAvLyBudW1iZXIgb2YgaW5pdGlhbGl6ZWQgZnJhbWVzIGluIHJlYWRCdWZmZXIsIG9yIC0xIHRvIGNsZWFyCisgICAgTkJBSU9fRm9ybWF0IGZvcm1hdDsKKyAgICB1bnNpZ25lZCBzYW1wbGVSYXRlOworICAgIEZhc3RDYXB0dXJlRHVtcFN0YXRlIGR1bW15RHVtcFN0YXRlOworICAgIHVpbnQzMl90IHRvdGFsTmF0aXZlRnJhbWVzUmVhZDsgLy8gY29waWVkIHRvIGR1bXBTdGF0ZS0+bUZyYW1lc1JlYWQKKworfTsgIC8vIGNsYXNzIEZhc3RDYXB0dXJlCisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQVVESU9fRkFTVF9DQVBUVVJFX0gKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZVN0YXRlLmNwcApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggNjMlCmNvcHkgZnJvbSBsaWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKY29weSB0byBzZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmVTdGF0ZS5jcHAKaW5kZXggMTNjYWM2ZC4uMWQwMjliNwotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlU3RhdGUuY3BwCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTQsMTMgKzE0LDE3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaWZuZGVmIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSAotI2RlZmluZSBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0gKKyNpbmNsdWRlICJGYXN0Q2FwdHVyZVN0YXRlLmgiCiAKLS8qIC0tLS0tIE1haW4gZmVhdHVyZXMgLS0tLS0gKi8KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzX01DUy5oIiAvKiBUcmFuc2NvZGVyICovCituYW1lc3BhY2UgYW5kcm9pZCB7CiAKLS8qIC0tLS0tIEFkZC1vbnMgLS0tLS0gKi8KK0Zhc3RDYXB0dXJlU3RhdGU6OkZhc3RDYXB0dXJlU3RhdGUoKSA6IEZhc3RUaHJlYWRTdGF0ZSgpLAorICAgIG1JbnB1dFNvdXJjZShOVUxMKSwgbUlucHV0U291cmNlR2VuKDApLCBtUGlwZVNpbmsoTlVMTCksIG1QaXBlU2lua0dlbigwKSwgbUZyYW1lQ291bnQoMCkKK3sKK30KIAotI2VuZGlmIC8qIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSCAqLworRmFzdENhcHR1cmVTdGF0ZTo6fkZhc3RDYXB0dXJlU3RhdGUoKQoreworfQogCit9ICAgLy8gYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlU3RhdGUuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZVN0YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjljODY1YQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZVN0YXRlLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9BVURJT19GQVNUX0NBUFRVUkVfU1RBVEVfSAorI2RlZmluZSBBTkRST0lEX0FVRElPX0ZBU1RfQ0FQVFVSRV9TVEFURV9ICisKKyNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkFJTy5oPgorI2luY2x1ZGUgIkZhc3RUaHJlYWRTdGF0ZS5oIgorI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIFJlcHJlc2VudCBhIHNpbmdsZSBzdGF0ZSBvZiB0aGUgZmFzdCBjYXB0dXJlCitzdHJ1Y3QgRmFzdENhcHR1cmVTdGF0ZSA6IEZhc3RUaHJlYWRTdGF0ZSB7CisgICAgICAgICAgICAgICAgRmFzdENhcHR1cmVTdGF0ZSgpOworICAgIC8qdmlydHVhbCovIH5GYXN0Q2FwdHVyZVN0YXRlKCk7CisKKyAgICAvLyBhbGwgcG9pbnRlciBmaWVsZHMgdXNlIHJhdyBwb2ludGVyczsgb2JqZWN0cyBhcmUgb3duZWQgYW5kIHJlZi1jb3VudGVkIGJ5IFJlY29yZFRocmVhZAorICAgIE5CQUlPX1NvdXJjZSAgICAqbUlucHV0U291cmNlOyAgICAgIC8vIEhBTCBpbnB1dCBkZXZpY2UsIG11c3QgYWxyZWFkeSBiZSBuZWdvdGlhdGVkCisgICAgLy8gRklYTUUgYnkgcmVuYW1pbmcsIGNvdWxkIHB1bGwgdXAgdGhlc2UgZmllbGRzIHRvIEZhc3RUaHJlYWRTdGF0ZQorICAgIGludCAgICAgICAgICAgICBtSW5wdXRTb3VyY2VHZW47ICAgIC8vIGluY3JlbWVudCB3aGVuIG1JbnB1dFNvdXJjZSBpcyBhc3NpZ25lZAorICAgIE5CQUlPX1NpbmsgICAgICAqbVBpcGVTaW5rOyAgICAgICAgIC8vIGFmdGVyIHJlYWRpbmcgZnJvbSBpbnB1dCBzb3VyY2UsIHdyaXRlIHRvIHRoaXMgcGlwZSBzaW5rCisgICAgaW50ICAgICAgICAgICAgIG1QaXBlU2lua0dlbjsgICAgICAgLy8gaW5jcmVtZW50IHdoZW4gbVBpcGVTaW5rIGlzIGFzc2lnbmVkCisgICAgc2l6ZV90ICAgICAgICAgIG1GcmFtZUNvdW50OyAgICAgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyBwZXIgZmFzdCBjYXB0dXJlIGJ1ZmZlcgorICAgIGF1ZGlvX3RyYWNrX2NibGtfdCAgKm1DYmxrOyAgICAgICAgIC8vIGNvbnRyb2wgYmxvY2sgZm9yIHRoZSBzaW5nbGUgZmFzdCBjbGllbnQsIG9yIE5VTEwKKworICAgIC8vIEV4dGVuZHMgRmFzdFRocmVhZFN0YXRlOjpDb21tYW5kCisgICAgc3RhdGljIGNvbnN0IENvbW1hbmQKKyAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBjb21tYW5kcyBhbHNvIHByb2Nlc3MgY29uZmlndXJhdGlvbiBjaGFuZ2VzLCBhbmQgY2FuIGJlICJvciJlZDoKKyAgICAgICAgUkVBRCA9IDB4OCwgICAgICAgICAgICAgLy8gcmVhZCBmcm9tIGlucHV0IHNvdXJjZQorICAgICAgICBXUklURSA9IDB4MTAsICAgICAgICAgICAvLyB3cml0ZSB0byBwaXBlIHNpbmsKKyAgICAgICAgUkVBRF9XUklURSA9IDB4MTg7ICAgICAgLy8gcmVhZCBmcm9tIGlucHV0IHNvdXJjZSBhbmQgd3JpdGUgdG8gcGlwZSBzaW5rCisKK307ICAvLyBzdHJ1Y3QgRmFzdENhcHR1cmVTdGF0ZQorCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0FVRElPX0ZBU1RfQ0FQVFVSRV9TVEFURV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwCmluZGV4IGYyN2VhMTcuLjI2NzhjYmYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwCkBAIC0yNiw3ICsyNiw2IEBACiAjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19BVURJTwogCiAjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgotI2luY2x1ZGUgPHN5cy9hdG9taWNzLmg+CiAjaW5jbHVkZSA8dGltZS5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CkBAIC0zNyw2MzkgKzM2LDQzNiBAQAogI2luY2x1ZGUgPGNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmg+CiAjZW5kaWYKICNlbmRpZgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Zvcm1hdC5oPgogI2luY2x1ZGUgIkF1ZGlvTWl4ZXIuaCIKICNpbmNsdWRlICJGYXN0TWl4ZXIuaCIKIAotI2RlZmluZSBGQVNUX0hPVF9JRExFX05TICAgICAxMDAwMDAwTCAgIC8vIDEgbXM6IHRpbWUgdG8gc2xlZXAgd2hpbGUgaG90IGlkbGluZwotI2RlZmluZSBGQVNUX0RFRkFVTFRfTlMgICAgOTk5OTk5OTk5TCAgIC8vIH4xIHNlYzogZGVmYXVsdCB0aW1lIHRvIHNsZWVwCi0jZGVmaW5lIE1JTl9XQVJNVVBfQ1lDTEVTICAgICAgICAgIDIgICAgLy8gbWluaW11bSBudW1iZXIgb2YgbG9vcCBjeWNsZXMgdG8gd2FpdCBmb3Igd2FybXVwCi0jZGVmaW5lIE1BWF9XQVJNVVBfQ1lDTEVTICAgICAgICAgMTAgICAgLy8gbWF4aW11bSBudW1iZXIgb2YgbG9vcCBjeWNsZXMgdG8gd2FpdCBmb3Igd2FybXVwCi0KICNkZWZpbmUgRkNDXzIgICAgICAgICAgICAgICAgICAgICAgIDIgICAvLyBmaXhlZCBjaGFubmVsIGNvdW50IGFzc3VtcHRpb24KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi0vLyBGYXN0IG1peGVyIHRocmVhZAotYm9vbCBGYXN0TWl4ZXI6OnRocmVhZExvb3AoKQorLypzdGF0aWMqLyBjb25zdCBGYXN0TWl4ZXJTdGF0ZSBGYXN0TWl4ZXI6OmluaXRpYWw7CisKK0Zhc3RNaXhlcjo6RmFzdE1peGVyKCkgOiBGYXN0VGhyZWFkKCksCisgICAgc2xvcE5zKDApLAorICAgIC8vIGZhc3RUcmFja05hbWVzCisgICAgLy8gZ2VuZXJhdGlvbnMKKyAgICBvdXRwdXRTaW5rKE5VTEwpLAorICAgIG91dHB1dFNpbmtHZW4oMCksCisgICAgbWl4ZXIoTlVMTCksCisgICAgbVNpbmtCdWZmZXIoTlVMTCksCisgICAgbVNpbmtCdWZmZXJTaXplKDApLAorICAgIG1TaW5rQ2hhbm5lbENvdW50KEZDQ18yKSwKKyAgICBtTWl4ZXJCdWZmZXIoTlVMTCksCisgICAgbU1peGVyQnVmZmVyU2l6ZSgwKSwKKyAgICBtTWl4ZXJCdWZmZXJGb3JtYXQoQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpLAorICAgIG1NaXhlckJ1ZmZlclN0YXRlKFVOREVGSU5FRCksCisgICAgZm9ybWF0KEZvcm1hdF9JbnZhbGlkKSwKKyAgICBzYW1wbGVSYXRlKDApLAorICAgIGZhc3RUcmFja3NHZW4oMCksCisgICAgdG90YWxOYXRpdmVGcmFtZXNXcml0dGVuKDApLAorICAgIC8vIHRpbWVzdGFtcAorICAgIG5hdGl2ZUZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQoMCkgICAvLyB0aGUgPSAwIGlzIHRvIHNpbGVuY2UgdGhlIGNvbXBpbGVyCiB7Ci0gICAgc3RhdGljIGNvbnN0IEZhc3RNaXhlclN0YXRlIGluaXRpYWw7Ci0gICAgY29uc3QgRmFzdE1peGVyU3RhdGUgKnByZXZpb3VzID0gJmluaXRpYWwsICpjdXJyZW50ID0gJmluaXRpYWw7Ci0gICAgRmFzdE1peGVyU3RhdGUgcHJlSWRsZTsgLy8gY29weSBvZiBzdGF0ZSBiZWZvcmUgd2Ugd2VudCBpbnRvIGlkbGUKLSAgICBzdHJ1Y3QgdGltZXNwZWMgb2xkVHMgPSB7MCwgMH07Ci0gICAgYm9vbCBvbGRUc1ZhbGlkID0gZmFsc2U7Ci0gICAgbG9uZyBzbG9wTnMgPSAwOyAgICAvLyBhY2N1bXVsYXRlZCB0aW1lIHdlJ3ZlIHdva2VuIHVwIHRvbyBlYXJseSAoPiAwKSBvciB0b28gbGF0ZSAoPCAwKQotICAgIGxvbmcgc2xlZXBOcyA9IC0xOyAgLy8gLTE6IGJ1c3kgd2FpdCwgMDogc2NoZWRfeWllbGQsID4gMDogbmFub3NsZWVwCi0gICAgaW50IGZhc3RUcmFja05hbWVzW0Zhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrc107IC8vIGhhbmRsZXMgdXNlZCBieSBtaXhlciB0byBpZGVudGlmeSB0cmFja3MKLSAgICBpbnQgZ2VuZXJhdGlvbnNbRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzXTsgICAgLy8gbGFzdCBvYnNlcnZlZCBtRmFzdFRyYWNrc1tpXS5tR2VuZXJhdGlvbgorICAgIC8vIEZJWE1FIHBhc3MgaW5pdGlhbCBhcyBwYXJhbWV0ZXIgdG8gYmFzZSBjbGFzcyBjb25zdHJ1Y3RvciwgYW5kIG1ha2UgaXQgc3RhdGljIGxvY2FsCisgICAgcHJldmlvdXMgPSAmaW5pdGlhbDsKKyAgICBjdXJyZW50ID0gJmluaXRpYWw7CisKKyAgICBtRHVtbXlEdW1wU3RhdGUgPSAmZHVtbXlEdW1wU3RhdGU7CisgICAgLy8gVE9ETzogQWRkIGNoYW5uZWwgbWFzayB0byBOQkFJT19Gb3JtYXQuCisgICAgLy8gV2UgYXNzdW1lIHRoYXQgdGhlIGNoYW5uZWwgbWFzayBtdXN0IGJlIGEgdmFsaWQgcG9zaXRpb25hbCBjaGFubmVsIG1hc2suCisgICAgbVNpbmtDaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChtU2lua0NoYW5uZWxDb3VudCk7CisKICAgICB1bnNpZ25lZCBpOwogICAgIGZvciAoaSA9IDA7IGkgPCBGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3M7ICsraSkgewogICAgICAgICBmYXN0VHJhY2tOYW1lc1tpXSA9IC0xOwogICAgICAgICBnZW5lcmF0aW9uc1tpXSA9IDA7CiAgICAgfQotICAgIE5CQUlPX1NpbmsgKm91dHB1dFNpbmsgPSBOVUxMOwotICAgIGludCBvdXRwdXRTaW5rR2VuID0gMDsKLSAgICBBdWRpb01peGVyKiBtaXhlciA9IE5VTEw7Ci0gICAgc2hvcnQgKm1peEJ1ZmZlciA9IE5VTEw7Ci0gICAgZW51bSB7VU5ERUZJTkVELCBNSVhFRCwgWkVST0VEfSBtaXhCdWZmZXJTdGF0ZSA9IFVOREVGSU5FRDsKLSAgICBOQkFJT19Gb3JtYXQgZm9ybWF0ID0gRm9ybWF0X0ludmFsaWQ7Ci0gICAgdW5zaWduZWQgc2FtcGxlUmF0ZSA9IDA7Ci0gICAgaW50IGZhc3RUcmFja3NHZW4gPSAwOwotICAgIGxvbmcgcGVyaW9kTnMgPSAwOyAgICAgIC8vIGV4cGVjdGVkIHBlcmlvZDsgdGhlIHRpbWUgcmVxdWlyZWQgdG8gcmVuZGVyIG9uZSBtaXggYnVmZmVyCi0gICAgbG9uZyB1bmRlcnJ1bk5zID0gMDsgICAgLy8gdW5kZXJydW4gbGlrZWx5IHdoZW4gd3JpdGUgY3ljbGUgaXMgZ3JlYXRlciB0aGFuIHRoaXMgdmFsdWUKLSAgICBsb25nIG92ZXJydW5OcyA9IDA7ICAgICAvLyBvdmVycnVuIGxpa2VseSB3aGVuIHdyaXRlIGN5Y2xlIGlzIGxlc3MgdGhhbiB0aGlzIHZhbHVlCi0gICAgbG9uZyBmb3JjZU5zID0gMDsgICAgICAgLy8gaWYgb3ZlcnJ1biBkZXRlY3RlZCwgZm9yY2UgdGhlIHdyaXRlIGN5Y2xlIHRvIHRha2UgdGhpcyBtdWNoIHRpbWUKLSAgICBsb25nIHdhcm11cE5zID0gMDsgICAgICAvLyB3YXJtdXAgY29tcGxldGUgd2hlbiB3cml0ZSBjeWNsZSBpcyBncmVhdGVyIHRoYW4gdG8gdGhpcyB2YWx1ZQotICAgIEZhc3RNaXhlckR1bXBTdGF0ZSBkdW1teUR1bXBTdGF0ZSwgKmR1bXBTdGF0ZSA9ICZkdW1teUR1bXBTdGF0ZTsKLSAgICBib29sIGlnbm9yZU5leHRPdmVycnVuID0gdHJ1ZTsgIC8vIHVzZWQgdG8gaWdub3JlIGluaXRpYWwgb3ZlcnJ1biBhbmQgZmlyc3QgYWZ0ZXIgYW4gdW5kZXJydW4KICNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKLSAgICBzdHJ1Y3QgdGltZXNwZWMgb2xkTG9hZCA9IHswLCAwfTsgICAgLy8gcHJldmlvdXMgdmFsdWUgb2YgY2xvY2tfZ2V0dGltZShDTE9DS19USFJFQURfQ1BVVElNRV9JRCkKLSAgICBib29sIG9sZExvYWRWYWxpZCA9IGZhbHNlOyAgLy8gd2hldGhlciBvbGRMb2FkIGlzIHZhbGlkCi0gICAgdWludDMyX3QgYm91bmRzID0gMDsKLSAgICBib29sIGZ1bGwgPSBmYWxzZTsgICAgICAvLyB3aGV0aGVyIHdlIGhhdmUgY29sbGVjdGVkIGF0IGxlYXN0IG1TYW1wbGluZ04gc2FtcGxlcwotI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUwotICAgIFRocmVhZENwdVVzYWdlIHRjdTsgICAgIC8vIGZvciByZWFkaW5nIHRoZSBjdXJyZW50IENQVSBjbG9jayBmcmVxdWVuY3kgaW4ga0h6CisgICAgb2xkTG9hZC50dl9zZWMgPSAwOworICAgIG9sZExvYWQudHZfbnNlYyA9IDA7CiAjZW5kaWYKLSNlbmRpZgotICAgIHVuc2lnbmVkIGNvbGRHZW4gPSAwOyAgIC8vIGxhc3Qgb2JzZXJ2ZWQgbUNvbGRHZW4KLSAgICBib29sIGlzV2FybSA9IGZhbHNlOyAgICAvLyB0cnVlIG1lYW5zIHJlYWR5IHRvIG1peCwgZmFsc2UgbWVhbnMgd2FpdCBmb3Igd2FybXVwIGJlZm9yZSBtaXhpbmcKLSAgICBzdHJ1Y3QgdGltZXNwZWMgbWVhc3VyZWRXYXJtdXBUcyA9IHswLCAwfTsgIC8vIGhvdyBsb25nIGRpZCBpdCB0YWtlIGZvciB3YXJtdXAgdG8gY29tcGxldGUKLSAgICB1aW50MzJfdCB3YXJtdXBDeWNsZXMgPSAwOyAgLy8gY291bnRlciBvZiBudW1iZXIgb2YgbG9vcCBjeWNsZXMgcmVxdWlyZWQgdG8gd2FybXVwCi0gICAgTkJBSU9fU2luayogdGVlU2luayA9IE5VTEw7IC8vIGlmIG5vbi1OVUxMLCB0aGVuIGR1cGxpY2F0ZSB3cml0ZSgpIHRvIHRoaXMgbm9uLWJsb2NraW5nIHNpbmsKLSAgICBOQkxvZzo6V3JpdGVyIGR1bW15TG9nV3JpdGVyLCAqbG9nV3JpdGVyID0gJmR1bW15TG9nV3JpdGVyOwotICAgIHVpbnQzMl90IHRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbiA9IDA7ICAvLyBjb3BpZWQgdG8gZHVtcFN0YXRlLT5tRnJhbWVzV3JpdHRlbgorfQogCi0gICAgLy8gbmV4dCAyIGZpZWxkcyBhcmUgdmFsaWQgb25seSB3aGVuIHRpbWVzdGFtcFN0YXR1cyA9PSBOT19FUlJPUgotICAgIEF1ZGlvVGltZXN0YW1wIHRpbWVzdGFtcDsKLSAgICB1aW50MzJfdCBuYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkID0gMDsgICAgLy8gdGhlID0gMCBpcyB0byBzaWxlbmNlIHRoZSBjb21waWxlcgotICAgIHN0YXR1c190IHRpbWVzdGFtcFN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworRmFzdE1peGVyOjp+RmFzdE1peGVyKCkKK3sKK30KIAotICAgIGZvciAoOzspIHsKK0Zhc3RNaXhlclN0YXRlUXVldWUqIEZhc3RNaXhlcjo6c3EoKQoreworICAgIHJldHVybiAmbVNROworfQogCi0gICAgICAgIC8vIGVpdGhlciBuYW5vc2xlZXAsIHNjaGVkX3lpZWxkLCBvciBidXN5IHdhaXQKLSAgICAgICAgaWYgKHNsZWVwTnMgPj0gMCkgewotICAgICAgICAgICAgaWYgKHNsZWVwTnMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoc2xlZXBOcyA8IDEwMDAwMDAwMDApOwotICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyByZXEgPSB7MCwgc2xlZXBOc307Ci0gICAgICAgICAgICAgICAgbmFub3NsZWVwKCZyZXEsIE5VTEwpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzY2hlZF95aWVsZCgpOworY29uc3QgRmFzdFRocmVhZFN0YXRlICpGYXN0TWl4ZXI6OnBvbGwoKQoreworICAgIHJldHVybiBtU1EucG9sbCgpOworfQorCit2b2lkIEZhc3RNaXhlcjo6c2V0TG9nKE5CTG9nOjpXcml0ZXIgKmxvZ1dyaXRlcikKK3sKKyAgICBpZiAobWl4ZXIgIT0gTlVMTCkgeworICAgICAgICBtaXhlci0+c2V0TG9nKGxvZ1dyaXRlcik7CisgICAgfQorfQorCit2b2lkIEZhc3RNaXhlcjo6b25JZGxlKCkKK3sKKyAgICBwcmVJZGxlID0gKihjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqKWN1cnJlbnQ7CisgICAgY3VycmVudCA9ICZwcmVJZGxlOworfQorCit2b2lkIEZhc3RNaXhlcjo6b25FeGl0KCkKK3sKKyAgICBkZWxldGUgbWl4ZXI7CisgICAgZnJlZShtTWl4ZXJCdWZmZXIpOworICAgIGZyZWUobVNpbmtCdWZmZXIpOworfQorCitib29sIEZhc3RNaXhlcjo6aXNTdWJDbGFzc0NvbW1hbmQoRmFzdFRocmVhZFN0YXRlOjpDb21tYW5kIGNvbW1hbmQpCit7CisgICAgc3dpdGNoICgoRmFzdE1peGVyU3RhdGU6OkNvbW1hbmQpIGNvbW1hbmQpIHsKKyAgICBjYXNlIEZhc3RNaXhlclN0YXRlOjpNSVg6CisgICAgY2FzZSBGYXN0TWl4ZXJTdGF0ZTo6V1JJVEU6CisgICAgY2FzZSBGYXN0TWl4ZXJTdGF0ZTo6TUlYX1dSSVRFOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCit2b2lkIEZhc3RNaXhlcjo6b25TdGF0ZUNoYW5nZSgpCit7CisgICAgY29uc3QgRmFzdE1peGVyU3RhdGUgKiBjb25zdCBjdXJyZW50ID0gKGNvbnN0IEZhc3RNaXhlclN0YXRlICopIHRoaXMtPmN1cnJlbnQ7CisgICAgY29uc3QgRmFzdE1peGVyU3RhdGUgKiBjb25zdCBwcmV2aW91cyA9IChjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqKSB0aGlzLT5wcmV2aW91czsKKyAgICBGYXN0TWl4ZXJEdW1wU3RhdGUgKiBjb25zdCBkdW1wU3RhdGUgPSAoRmFzdE1peGVyRHVtcFN0YXRlICopIHRoaXMtPmR1bXBTdGF0ZTsKKyAgICBjb25zdCBzaXplX3QgZnJhbWVDb3VudCA9IGN1cnJlbnQtPm1GcmFtZUNvdW50OworCisgICAgLy8gaGFuZGxlIHN0YXRlIGNoYW5nZSBoZXJlLCBidXQgc2luY2Ugd2Ugd2FudCB0byBkaWZmIHRoZSBzdGF0ZSwKKyAgICAvLyB3ZSdyZSBwcmVwYXJlZCBmb3IgcHJldmlvdXMgPT0gJmluaXRpYWwgdGhlIGZpcnN0IHRpbWUgdGhyb3VnaAorICAgIHVuc2lnbmVkIHByZXZpb3VzVHJhY2tNYXNrOworCisgICAgLy8gY2hlY2sgZm9yIGNoYW5nZSBpbiBvdXRwdXQgSEFMIGNvbmZpZ3VyYXRpb24KKyAgICBOQkFJT19Gb3JtYXQgcHJldmlvdXNGb3JtYXQgPSBmb3JtYXQ7CisgICAgaWYgKGN1cnJlbnQtPm1PdXRwdXRTaW5rR2VuICE9IG91dHB1dFNpbmtHZW4pIHsKKyAgICAgICAgb3V0cHV0U2luayA9IGN1cnJlbnQtPm1PdXRwdXRTaW5rOworICAgICAgICBvdXRwdXRTaW5rR2VuID0gY3VycmVudC0+bU91dHB1dFNpbmtHZW47CisgICAgICAgIGlmIChvdXRwdXRTaW5rID09IE5VTEwpIHsKKyAgICAgICAgICAgIGZvcm1hdCA9IEZvcm1hdF9JbnZhbGlkOworICAgICAgICAgICAgc2FtcGxlUmF0ZSA9IDA7CisgICAgICAgICAgICBtU2lua0NoYW5uZWxDb3VudCA9IDA7CisgICAgICAgICAgICBtU2lua0NoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9ybWF0ID0gb3V0cHV0U2luay0+Zm9ybWF0KCk7CisgICAgICAgICAgICBzYW1wbGVSYXRlID0gRm9ybWF0X3NhbXBsZVJhdGUoZm9ybWF0KTsKKyAgICAgICAgICAgIG1TaW5rQ2hhbm5lbENvdW50ID0gRm9ybWF0X2NoYW5uZWxDb3VudChmb3JtYXQpOworICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtU2lua0NoYW5uZWxDb3VudCA+IEF1ZGlvTWl4ZXI6Ok1BWF9OVU1fQ0hBTk5FTFMpOworCisgICAgICAgICAgICAvLyBUT0RPOiBBZGQgY2hhbm5lbCBtYXNrIHRvIE5CQUlPX0Zvcm1hdAorICAgICAgICAgICAgLy8gV2UgYXNzdW1lIHRoYXQgdGhlIGNoYW5uZWwgbWFzayBtdXN0IGJlIGEgdmFsaWQgcG9zaXRpb25hbCBjaGFubmVsIG1hc2suCisgICAgICAgICAgICBtU2lua0NoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KG1TaW5rQ2hhbm5lbENvdW50KTsKKyAgICAgICAgfQorICAgICAgICBkdW1wU3RhdGUtPm1TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKKyAgICB9CisKKyAgICBpZiAoKCFGb3JtYXRfaXNFcXVhbChmb3JtYXQsIHByZXZpb3VzRm9ybWF0KSkgfHwgKGZyYW1lQ291bnQgIT0gcHJldmlvdXMtPm1GcmFtZUNvdW50KSkgeworICAgICAgICAvLyBGSVhNRSB0byBhdm9pZCBwcmlvcml0eSBpbnZlcnNpb24sIGRvbid0IGRlbGV0ZSBoZXJlCisgICAgICAgIGRlbGV0ZSBtaXhlcjsKKyAgICAgICAgbWl4ZXIgPSBOVUxMOworICAgICAgICBmcmVlKG1NaXhlckJ1ZmZlcik7CisgICAgICAgIG1NaXhlckJ1ZmZlciA9IE5VTEw7CisgICAgICAgIGZyZWUobVNpbmtCdWZmZXIpOworICAgICAgICBtU2lua0J1ZmZlciA9IE5VTEw7CisgICAgICAgIGlmIChmcmFtZUNvdW50ID4gMCAmJiBzYW1wbGVSYXRlID4gMCkgeworICAgICAgICAgICAgLy8gRklYTUUgbmV3IG1heSBibG9jayBmb3IgdW5ib3VuZGVkIHRpbWUgYXQgaW50ZXJuYWwgbXV0ZXggb2YgdGhlIGhlYXAKKyAgICAgICAgICAgIC8vICAgICAgIGltcGxlbWVudGF0aW9uOyBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gaGF2ZSBub3JtYWwgbWl4ZXIgYWxsb2NhdGUgZm9yIHVzCisgICAgICAgICAgICAvLyAgICAgICB0byBhdm9pZCBibG9ja2luZyBoZXJlIGFuZCB0byBwcmV2ZW50IHBvc3NpYmxlIHByaW9yaXR5IGludmVyc2lvbgorICAgICAgICAgICAgbWl4ZXIgPSBuZXcgQXVkaW9NaXhlcihmcmFtZUNvdW50LCBzYW1wbGVSYXRlLCBGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3MpOworICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG1peGVyRnJhbWVTaXplID0gbVNpbmtDaGFubmVsQ291bnQKKyAgICAgICAgICAgICAgICAgICAgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKG1NaXhlckJ1ZmZlckZvcm1hdCk7CisgICAgICAgICAgICBtTWl4ZXJCdWZmZXJTaXplID0gbWl4ZXJGcmFtZVNpemUgKiBmcmFtZUNvdW50OworICAgICAgICAgICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24oJm1NaXhlckJ1ZmZlciwgMzIsIG1NaXhlckJ1ZmZlclNpemUpOworICAgICAgICAgICAgY29uc3Qgc2l6ZV90IHNpbmtGcmFtZVNpemUgPSBtU2lua0NoYW5uZWxDb3VudAorICAgICAgICAgICAgICAgICAgICAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0Lm1Gb3JtYXQpOworICAgICAgICAgICAgaWYgKHNpbmtGcmFtZVNpemUgPiBtaXhlckZyYW1lU2l6ZSkgeyAvLyBuZWVkIGEgc2luayBidWZmZXIKKyAgICAgICAgICAgICAgICBtU2lua0J1ZmZlclNpemUgPSBzaW5rRnJhbWVTaXplICogZnJhbWVDb3VudDsKKyAgICAgICAgICAgICAgICAodm9pZClwb3NpeF9tZW1hbGlnbigmbVNpbmtCdWZmZXIsIDMyLCBtU2lua0J1ZmZlclNpemUpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgcGVyaW9kTnMgPSAoZnJhbWVDb3VudCAqIDEwMDAwMDAwMDBMTCkgLyBzYW1wbGVSYXRlOyAgICAvLyAxLjAwCisgICAgICAgICAgICB1bmRlcnJ1bk5zID0gKGZyYW1lQ291bnQgKiAxNzUwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgIC8vIDEuNzUKKyAgICAgICAgICAgIG92ZXJydW5OcyA9IChmcmFtZUNvdW50ICogNTAwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgICAgLy8gMC41MAorICAgICAgICAgICAgZm9yY2VOcyA9IChmcmFtZUNvdW50ICogOTUwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgICAgICAvLyAwLjk1CisgICAgICAgICAgICB3YXJtdXBOcyA9IChmcmFtZUNvdW50ICogNTAwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgICAgIC8vIDAuNTAKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBlcmlvZE5zID0gMDsKKyAgICAgICAgICAgIHVuZGVycnVuTnMgPSAwOworICAgICAgICAgICAgb3ZlcnJ1bk5zID0gMDsKKyAgICAgICAgICAgIGZvcmNlTnMgPSAwOworICAgICAgICAgICAgd2FybXVwTnMgPSAwOwogICAgICAgICB9Ci0gICAgICAgIC8vIGRlZmF1bHQgdG8gbG9uZyBzbGVlcCBmb3IgbmV4dCBjeWNsZQotICAgICAgICBzbGVlcE5zID0gRkFTVF9ERUZBVUxUX05TOwotCi0gICAgICAgIC8vIHBvbGwgZm9yIHN0YXRlIGNoYW5nZQotICAgICAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqbmV4dCA9IG1TUS5wb2xsKCk7Ci0gICAgICAgIGlmIChuZXh0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIC8vIGNvbnRpbnVlIHRvIHVzZSB0aGUgZGVmYXVsdCBpbml0aWFsIHN0YXRlIHVudGlsIGEgcmVhbCBzdGF0ZSBpcyBhdmFpbGFibGUKLSAgICAgICAgICAgIEFMT0dfQVNTRVJUKGN1cnJlbnQgPT0gJmluaXRpYWwgJiYgcHJldmlvdXMgPT0gJmluaXRpYWwpOwotICAgICAgICAgICAgbmV4dCA9IGN1cnJlbnQ7CisgICAgICAgIG1NaXhlckJ1ZmZlclN0YXRlID0gVU5ERUZJTkVEOworI2lmICFMT0dfTkRFQlVHCisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3M7ICsraSkgeworICAgICAgICAgICAgZmFzdFRyYWNrTmFtZXNbaV0gPSAtMTsKICAgICAgICAgfQorI2VuZGlmCisgICAgICAgIC8vIHdlIG5lZWQgdG8gcmVjb25maWd1cmUgYWxsIGFjdGl2ZSB0cmFja3MKKyAgICAgICAgcHJldmlvdXNUcmFja01hc2sgPSAwOworICAgICAgICBmYXN0VHJhY2tzR2VuID0gY3VycmVudC0+bUZhc3RUcmFja3NHZW4gLSAxOworICAgICAgICBkdW1wU3RhdGUtPm1GcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmV2aW91c1RyYWNrTWFzayA9IHByZXZpb3VzLT5tVHJhY2tNYXNrOworICAgIH0KIAotICAgICAgICBGYXN0TWl4ZXJTdGF0ZTo6Q29tbWFuZCBjb21tYW5kID0gbmV4dC0+bUNvbW1hbmQ7Ci0gICAgICAgIGlmIChuZXh0ICE9IGN1cnJlbnQpIHsKKyAgICAvLyBjaGVjayBmb3IgY2hhbmdlIGluIGFjdGl2ZSB0cmFjayBzZXQKKyAgICBjb25zdCB1bnNpZ25lZCBjdXJyZW50VHJhY2tNYXNrID0gY3VycmVudC0+bVRyYWNrTWFzazsKKyAgICBkdW1wU3RhdGUtPm1UcmFja01hc2sgPSBjdXJyZW50VHJhY2tNYXNrOworICAgIGlmIChjdXJyZW50LT5tRmFzdFRyYWNrc0dlbiAhPSBmYXN0VHJhY2tzR2VuKSB7CisgICAgICAgIEFMT0dfQVNTRVJUKG1NaXhlckJ1ZmZlciAhPSBOVUxMKTsKKyAgICAgICAgaW50IG5hbWU7CiAKLSAgICAgICAgICAgIC8vIEFzIHNvb24gYXMgcG9zc2libGUgb2YgbGVhcm5pbmcgb2YgYSBuZXcgZHVtcCBhcmVhLCBzdGFydCB1c2luZyBpdAotICAgICAgICAgICAgZHVtcFN0YXRlID0gbmV4dC0+bUR1bXBTdGF0ZSAhPSBOVUxMID8gbmV4dC0+bUR1bXBTdGF0ZSA6ICZkdW1teUR1bXBTdGF0ZTsKLSAgICAgICAgICAgIHRlZVNpbmsgPSBuZXh0LT5tVGVlU2luazsKLSAgICAgICAgICAgIGxvZ1dyaXRlciA9IG5leHQtPm1OQkxvZ1dyaXRlciAhPSBOVUxMID8gbmV4dC0+bU5CTG9nV3JpdGVyIDogJmR1bW15TG9nV3JpdGVyOworICAgICAgICAvLyBwcm9jZXNzIHJlbW92ZWQgdHJhY2tzIGZpcnN0IHRvIGF2b2lkIHJ1bm5pbmcgb3V0IG9mIHRyYWNrIG5hbWVzCisgICAgICAgIHVuc2lnbmVkIHJlbW92ZWRUcmFja3MgPSBwcmV2aW91c1RyYWNrTWFzayAmIH5jdXJyZW50VHJhY2tNYXNrOworICAgICAgICB3aGlsZSAocmVtb3ZlZFRyYWNrcyAhPSAwKSB7CisgICAgICAgICAgICBpbnQgaSA9IF9fYnVpbHRpbl9jdHoocmVtb3ZlZFRyYWNrcyk7CisgICAgICAgICAgICByZW1vdmVkVHJhY2tzICY9IH4oMSA8PCBpKTsKKyAgICAgICAgICAgIGNvbnN0IEZhc3RUcmFjayogZmFzdFRyYWNrID0gJmN1cnJlbnQtPm1GYXN0VHJhY2tzW2ldOworICAgICAgICAgICAgQUxPR19BU1NFUlQoZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXIgPT0gTlVMTCk7CiAgICAgICAgICAgICBpZiAobWl4ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG1peGVyLT5zZXRMb2cobG9nV3JpdGVyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gV2Ugd2FudCB0byBhbHdheXMgaGF2ZSBhIHZhbGlkIHJlZmVyZW5jZSB0byB0aGUgcHJldmlvdXMgKG5vbi1pZGxlKSBzdGF0ZS4KLSAgICAgICAgICAgIC8vIEhvd2V2ZXIsIHRoZSBzdGF0ZSBxdWV1ZSBvbmx5IGd1YXJhbnRlZXMgYWNjZXNzIHRvIGN1cnJlbnQgYW5kIHByZXZpb3VzIHN0YXRlcy4KLSAgICAgICAgICAgIC8vIFNvIHdoZW4gdGhlcmUgaXMgYSB0cmFuc2l0aW9uIGZyb20gYSBub24taWRsZSBzdGF0ZSBpbnRvIGFuIGlkbGUgc3RhdGUsIHdlIG1ha2UgYQotICAgICAgICAgICAgLy8gY29weSBvZiB0aGUgbGFzdCBrbm93biBub24taWRsZSBzdGF0ZSBzbyBpdCBpcyBzdGlsbCBhdmFpbGFibGUgb24gcmV0dXJuIGZyb20gaWRsZS4KLSAgICAgICAgICAgIC8vIFRoZSBwb3NzaWJsZSB0cmFuc2l0aW9ucyBhcmU6Ci0gICAgICAgICAgICAvLyAgbm9uLWlkbGUgLT4gbm9uLWlkbGUgICAgdXBkYXRlIHByZXZpb3VzIGZyb20gY3VycmVudCBpbi1wbGFjZQotICAgICAgICAgICAgLy8gIG5vbi1pZGxlIC0+IGlkbGUgICAgICAgIHVwZGF0ZSBwcmV2aW91cyBmcm9tIGNvcHkgb2YgY3VycmVudAotICAgICAgICAgICAgLy8gIGlkbGUgICAgIC0+IGlkbGUgICAgICAgIGRvbid0IHVwZGF0ZSBwcmV2aW91cwotICAgICAgICAgICAgLy8gIGlkbGUgICAgIC0+IG5vbi1pZGxlICAgIGRvbid0IHVwZGF0ZSBwcmV2aW91cwotICAgICAgICAgICAgaWYgKCEoY3VycmVudC0+bUNvbW1hbmQgJiBGYXN0TWl4ZXJTdGF0ZTo6SURMRSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoY29tbWFuZCAmIEZhc3RNaXhlclN0YXRlOjpJRExFKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZUlkbGUgPSAqY3VycmVudDsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9ICZwcmVJZGxlOwotICAgICAgICAgICAgICAgICAgICBvbGRUc1ZhbGlkID0gZmFsc2U7Ci0jaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCi0gICAgICAgICAgICAgICAgICAgIG9sZExvYWRWYWxpZCA9IGZhbHNlOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgIGlnbm9yZU5leHRPdmVycnVuID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHJldmlvdXMgPSBjdXJyZW50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY3VycmVudCA9IG5leHQ7Ci0gICAgICAgIH0KLSNpZiAhTE9HX05ERUJVRwotICAgICAgICBuZXh0ID0gTlVMTDsgICAgLy8gbm90IHJlZmVyZW5jZWQgYWdhaW4KLSNlbmRpZgotCi0gICAgICAgIGR1bXBTdGF0ZS0+bUNvbW1hbmQgPSBjb21tYW5kOwotCi0gICAgICAgIHN3aXRjaCAoY29tbWFuZCkgewotICAgICAgICBjYXNlIEZhc3RNaXhlclN0YXRlOjpJTklUSUFMOgotICAgICAgICBjYXNlIEZhc3RNaXhlclN0YXRlOjpIT1RfSURMRToKLSAgICAgICAgICAgIHNsZWVwTnMgPSBGQVNUX0hPVF9JRExFX05TOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGNhc2UgRmFzdE1peGVyU3RhdGU6OkNPTERfSURMRToKLSAgICAgICAgICAgIC8vIG9ubHkgcGVyZm9ybSBhIGNvbGQgaWRsZSBjb21tYW5kIG9uY2UKLSAgICAgICAgICAgIC8vIEZJWE1FIGNvbnNpZGVyIGNoZWNraW5nIHByZXZpb3VzIHN0YXRlIGFuZCBvbmx5IHBlcmZvcm0gaWYgcHJldmlvdXMgIT0gQ09MRF9JRExFCi0gICAgICAgICAgICBpZiAoY3VycmVudC0+bUNvbGRHZW4gIT0gY29sZEdlbikgewotICAgICAgICAgICAgICAgIGludDMyX3QgKmNvbGRGdXRleEFkZHIgPSBjdXJyZW50LT5tQ29sZEZ1dGV4QWRkcjsKLSAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChjb2xkRnV0ZXhBZGRyICE9IE5VTEwpOwotICAgICAgICAgICAgICAgIGludDMyX3Qgb2xkID0gYW5kcm9pZF9hdG9taWNfZGVjKGNvbGRGdXRleEFkZHIpOwotICAgICAgICAgICAgICAgIGlmIChvbGQgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICBfX2Z1dGV4X3N5c2NhbGw0KGNvbGRGdXRleEFkZHIsIEZVVEVYX1dBSVRfUFJJVkFURSwgb2xkIC0gMSwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGludCBwb2xpY3kgPSBzY2hlZF9nZXRzY2hlZHVsZXIoMCk7Ci0gICAgICAgICAgICAgICAgaWYgKCEocG9saWN5ID09IFNDSEVEX0ZJRk8gfHwgcG9saWN5ID09IFNDSEVEX1JSKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZGlkIG5vdCByZWNlaXZlIGV4cGVjdGVkIHByaW9yaXR5IGJvb3N0Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFRoaXMgbWF5IGJlIG92ZXJseSBjb25zZXJ2YXRpdmU7IHRoZXJlIGNvdWxkIGJlIHRpbWVzIHRoYXQgdGhlIG5vcm1hbCBtaXhlcgotICAgICAgICAgICAgICAgIC8vIHJlcXVlc3RzIHN1Y2ggYSBicmllZiBjb2xkIGlkbGUgdGhhdCBpdCBkb2Vzbid0IHJlcXVpcmUgcmVzZXR0aW5nIHRoaXMgZmxhZy4KLSAgICAgICAgICAgICAgICBpc1dhcm0gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBtZWFzdXJlZFdhcm11cFRzLnR2X3NlYyA9IDA7Ci0gICAgICAgICAgICAgICAgbWVhc3VyZWRXYXJtdXBUcy50dl9uc2VjID0gMDsKLSAgICAgICAgICAgICAgICB3YXJtdXBDeWNsZXMgPSAwOwotICAgICAgICAgICAgICAgIHNsZWVwTnMgPSAtMTsKLSAgICAgICAgICAgICAgICBjb2xkR2VuID0gY3VycmVudC0+bUNvbGRHZW47Ci0jaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCi0gICAgICAgICAgICAgICAgYm91bmRzID0gMDsKLSAgICAgICAgICAgICAgICBmdWxsID0gZmFsc2U7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICBvbGRUc1ZhbGlkID0gIWNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmb2xkVHMpOwotICAgICAgICAgICAgICAgIHRpbWVzdGFtcFN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzbGVlcE5zID0gRkFTVF9IT1RfSURMRV9OUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBjYXNlIEZhc3RNaXhlclN0YXRlOjpFWElUOgotICAgICAgICAgICAgZGVsZXRlIG1peGVyOwotICAgICAgICAgICAgZGVsZXRlW10gbWl4QnVmZmVyOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBjYXNlIEZhc3RNaXhlclN0YXRlOjpNSVg6Ci0gICAgICAgIGNhc2UgRmFzdE1peGVyU3RhdGU6OldSSVRFOgotICAgICAgICBjYXNlIEZhc3RNaXhlclN0YXRlOjpNSVhfV1JJVEU6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIExPR19GQVRBTCgiYmFkIGNvbW1hbmQgJWQiLCBjb21tYW5kKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHRoZXJlIGlzIGEgbm9uLWlkbGUgc3RhdGUgYXZhaWxhYmxlIHRvIHVzOyBkaWQgdGhlIHN0YXRlIGNoYW5nZT8KLSAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSBjdXJyZW50LT5tRnJhbWVDb3VudDsKLSAgICAgICAgaWYgKGN1cnJlbnQgIT0gcHJldmlvdXMpIHsKLQotICAgICAgICAgICAgLy8gaGFuZGxlIHN0YXRlIGNoYW5nZSBoZXJlLCBidXQgc2luY2Ugd2Ugd2FudCB0byBkaWZmIHRoZSBzdGF0ZSwKLSAgICAgICAgICAgIC8vIHdlJ3JlIHByZXBhcmVkIGZvciBwcmV2aW91cyA9PSAmaW5pdGlhbCB0aGUgZmlyc3QgdGltZSB0aHJvdWdoCi0gICAgICAgICAgICB1bnNpZ25lZCBwcmV2aW91c1RyYWNrTWFzazsKLQotICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGNoYW5nZSBpbiBvdXRwdXQgSEFMIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgIE5CQUlPX0Zvcm1hdCBwcmV2aW91c0Zvcm1hdCA9IGZvcm1hdDsKLSAgICAgICAgICAgIGlmIChjdXJyZW50LT5tT3V0cHV0U2lua0dlbiAhPSBvdXRwdXRTaW5rR2VuKSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0U2luayA9IGN1cnJlbnQtPm1PdXRwdXRTaW5rOwotICAgICAgICAgICAgICAgIG91dHB1dFNpbmtHZW4gPSBjdXJyZW50LT5tT3V0cHV0U2lua0dlbjsKLSAgICAgICAgICAgICAgICBpZiAob3V0cHV0U2luayA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IEZvcm1hdF9JbnZhbGlkOwotICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlID0gMDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBvdXRwdXRTaW5rLT5mb3JtYXQoKTsKLSAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSA9IEZvcm1hdF9zYW1wbGVSYXRlKGZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKEZvcm1hdF9jaGFubmVsQ291bnQoZm9ybWF0KSA9PSBGQ0NfMik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bVNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoKGZvcm1hdCAhPSBwcmV2aW91c0Zvcm1hdCkgfHwgKGZyYW1lQ291bnQgIT0gcHJldmlvdXMtPm1GcmFtZUNvdW50KSkgewotICAgICAgICAgICAgICAgIC8vIEZJWE1FIHRvIGF2b2lkIHByaW9yaXR5IGludmVyc2lvbiwgZG9uJ3QgZGVsZXRlIGhlcmUKLSAgICAgICAgICAgICAgICBkZWxldGUgbWl4ZXI7Ci0gICAgICAgICAgICAgICAgbWl4ZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgIGRlbGV0ZVtdIG1peEJ1ZmZlcjsKLSAgICAgICAgICAgICAgICBtaXhCdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgIGlmIChmcmFtZUNvdW50ID4gMCAmJiBzYW1wbGVSYXRlID4gMCkgewotICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSBuZXcgbWF5IGJsb2NrIGZvciB1bmJvdW5kZWQgdGltZSBhdCBpbnRlcm5hbCBtdXRleCBvZiB0aGUgaGVhcAotICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBpbXBsZW1lbnRhdGlvbjsgaXQgd291bGQgYmUgYmV0dGVyIHRvIGhhdmUgbm9ybWFsIG1peGVyIGFsbG9jYXRlIGZvciB1cwotICAgICAgICAgICAgICAgICAgICAvLyAgICAgICB0byBhdm9pZCBibG9ja2luZyBoZXJlIGFuZCB0byBwcmV2ZW50IHBvc3NpYmxlIHByaW9yaXR5IGludmVyc2lvbgotICAgICAgICAgICAgICAgICAgICBtaXhlciA9IG5ldyBBdWRpb01peGVyKGZyYW1lQ291bnQsIHNhbXBsZVJhdGUsIEZhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrcyk7Ci0gICAgICAgICAgICAgICAgICAgIG1peEJ1ZmZlciA9IG5ldyBzaG9ydFtmcmFtZUNvdW50ICogRkNDXzJdOwotICAgICAgICAgICAgICAgICAgICBwZXJpb2ROcyA9IChmcmFtZUNvdW50ICogMTAwMDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAgIC8vIDEuMDAKLSAgICAgICAgICAgICAgICAgICAgdW5kZXJydW5OcyA9IChmcmFtZUNvdW50ICogMTc1MDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAvLyAxLjc1Ci0gICAgICAgICAgICAgICAgICAgIG92ZXJydW5OcyA9IChmcmFtZUNvdW50ICogNTAwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgICAgLy8gMC41MAotICAgICAgICAgICAgICAgICAgICBmb3JjZU5zID0gKGZyYW1lQ291bnQgKiA5NTAwMDAwMDBMTCkgLyBzYW1wbGVSYXRlOyAgICAgIC8vIDAuOTUKLSAgICAgICAgICAgICAgICAgICAgd2FybXVwTnMgPSAoZnJhbWVDb3VudCAqIDUwMDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAgICAvLyAwLjUwCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcGVyaW9kTnMgPSAwOwotICAgICAgICAgICAgICAgICAgICB1bmRlcnJ1bk5zID0gMDsKLSAgICAgICAgICAgICAgICAgICAgb3ZlcnJ1bk5zID0gMDsKLSAgICAgICAgICAgICAgICAgICAgZm9yY2VOcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHdhcm11cE5zID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWl4QnVmZmVyU3RhdGUgPSBVTkRFRklORUQ7Ci0jaWYgIUxPR19OREVCVUcKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrTmFtZXNbaV0gPSAtMTsKLSAgICAgICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIHJlY29uZmlndXJlIGFsbCBhY3RpdmUgdHJhY2tzCi0gICAgICAgICAgICAgICAgcHJldmlvdXNUcmFja01hc2sgPSAwOwotICAgICAgICAgICAgICAgIGZhc3RUcmFja3NHZW4gPSBjdXJyZW50LT5tRmFzdFRyYWNrc0dlbiAtIDE7Ci0gICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHByZXZpb3VzVHJhY2tNYXNrID0gcHJldmlvdXMtPm1UcmFja01hc2s7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIGZvciBjaGFuZ2UgaW4gYWN0aXZlIHRyYWNrIHNldAotICAgICAgICAgICAgdW5zaWduZWQgY3VycmVudFRyYWNrTWFzayA9IGN1cnJlbnQtPm1UcmFja01hc2s7Ci0gICAgICAgICAgICBkdW1wU3RhdGUtPm1UcmFja01hc2sgPSBjdXJyZW50VHJhY2tNYXNrOwotICAgICAgICAgICAgaWYgKGN1cnJlbnQtPm1GYXN0VHJhY2tzR2VuICE9IGZhc3RUcmFja3NHZW4pIHsKLSAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChtaXhCdWZmZXIgIT0gTlVMTCk7Ci0gICAgICAgICAgICAgICAgaW50IG5hbWU7Ci0KLSAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIHJlbW92ZWQgdHJhY2tzIGZpcnN0IHRvIGF2b2lkIHJ1bm5pbmcgb3V0IG9mIHRyYWNrIG5hbWVzCi0gICAgICAgICAgICAgICAgdW5zaWduZWQgcmVtb3ZlZFRyYWNrcyA9IHByZXZpb3VzVHJhY2tNYXNrICYgfmN1cnJlbnRUcmFja01hc2s7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHJlbW92ZWRUcmFja3MgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpID0gX19idWlsdGluX2N0eihyZW1vdmVkVHJhY2tzKTsKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZFRyYWNrcyAmPSB+KDEgPDwgaSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IEZhc3RUcmFjayogZmFzdFRyYWNrID0gJmN1cnJlbnQtPm1GYXN0VHJhY2tzW2ldOwotICAgICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChmYXN0VHJhY2stPm1CdWZmZXJQcm92aWRlciA9PSBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1peGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBmYXN0VHJhY2tOYW1lc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKG5hbWUgPj0gMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtaXhlci0+ZGVsZXRlVHJhY2tOYW1lKG5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0jaWYgIUxPR19OREVCVUcKLSAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrTmFtZXNbaV0gPSAtMTsKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCByZXNldCB0cmFjayBkdW1wIHN0YXRlLCBzaW5jZSBvdGhlciBzaWRlIGlzIGlnbm9yaW5nIGl0Ci0gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb25zW2ldID0gZmFzdFRyYWNrLT5tR2VuZXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBub3cgcHJvY2VzcyBhZGRlZCB0cmFja3MKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBhZGRlZFRyYWNrcyA9IGN1cnJlbnRUcmFja01hc2sgJiB+cHJldmlvdXNUcmFja01hc2s7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGFkZGVkVHJhY2tzICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaSA9IF9fYnVpbHRpbl9jdHooYWRkZWRUcmFja3MpOwotICAgICAgICAgICAgICAgICAgICBhZGRlZFRyYWNrcyAmPSB+KDEgPDwgaSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IEZhc3RUcmFjayogZmFzdFRyYWNrID0gJmN1cnJlbnQtPm1GYXN0VHJhY2tzW2ldOwotICAgICAgICAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyICpidWZmZXJQcm92aWRlciA9IGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyOwotICAgICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChidWZmZXJQcm92aWRlciAhPSBOVUxMICYmIGZhc3RUcmFja05hbWVzW2ldID09IC0xKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1peGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxpbmcgZ2V0VHJhY2tOYW1lIHdpdGggZGVmYXVsdCBjaGFubmVsIG1hc2sgYW5kIGEgcmFuZG9tIGludmFsaWQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgc2Vzc2lvbklkIChubyBlZmZlY3RzIGhlcmUpCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gbWl4ZXItPmdldFRyYWNrTmFtZShBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sIC01NTUpOwotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQobmFtZSA+PSAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFja05hbWVzW2ldID0gbmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRCdWZmZXJQcm92aWRlcihuYW1lLCBidWZmZXJQcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpNQUlOX0JVRkZFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgbWl4QnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ld2x5IGFsbG9jYXRlZCB0cmFjayBuYW1lcyBkZWZhdWx0IHRvIGZ1bGwgc2NhbGUgdm9sdW1lCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFzdFRyYWNrLT5tU2FtcGxlUmF0ZSAhPSAwICYmIGZhc3RUcmFjay0+bVNhbXBsZVJhdGUgIT0gc2FtcGxlUmF0ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6UkVTQU1QTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpTQU1QTEVfUkFURSwgKHZvaWQqKSBmYXN0VHJhY2stPm1TYW1wbGVSYXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkNIQU5ORUxfTUFTSywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2spOwotICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZXItPmVuYWJsZShuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uc1tpXSA9IGZhc3RUcmFjay0+bUdlbmVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gZmluYWxseSBwcm9jZXNzIChwb3RlbnRpYWxseSkgbW9kaWZpZWQgdHJhY2tzOyB0aGVzZSB1c2UgdGhlIHNhbWUgc2xvdAotICAgICAgICAgICAgICAgIC8vIGJ1dCBtYXkgaGF2ZSBhIGRpZmZlcmVudCBidWZmZXIgcHJvdmlkZXIgb3Igdm9sdW1lIHByb3ZpZGVyCi0gICAgICAgICAgICAgICAgdW5zaWduZWQgbW9kaWZpZWRUcmFja3MgPSBjdXJyZW50VHJhY2tNYXNrICYgcHJldmlvdXNUcmFja01hc2s7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKG1vZGlmaWVkVHJhY2tzICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaSA9IF9fYnVpbHRpbl9jdHoobW9kaWZpZWRUcmFja3MpOwotICAgICAgICAgICAgICAgICAgICBtb2RpZmllZFRyYWNrcyAmPSB+KDEgPDwgaSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IEZhc3RUcmFjayogZmFzdFRyYWNrID0gJmN1cnJlbnQtPm1GYXN0VHJhY2tzW2ldOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmFzdFRyYWNrLT5tR2VuZXJhdGlvbiAhPSBnZW5lcmF0aW9uc1tpXSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyB0cmFjayB3YXMgYWN0dWFsbHkgbW9kaWZpZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIgKmJ1ZmZlclByb3ZpZGVyID0gZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChidWZmZXJQcm92aWRlciAhPSBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtaXhlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGZhc3RUcmFja05hbWVzW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKG5hbWUgPj0gMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldEJ1ZmZlclByb3ZpZGVyKG5hbWUsIGJ1ZmZlclByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFzdFRyYWNrLT5tVm9sdW1lUHJvdmlkZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKTB4MTAwMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopMHgxMDAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhc3RUcmFjay0+bVNhbXBsZVJhdGUgIT0gMCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tU2FtcGxlUmF0ZSAhPSBzYW1wbGVSYXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6UkVTQU1QTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6U0FNUExFX1JBVEUsICh2b2lkKikgZmFzdFRyYWNrLT5tU2FtcGxlUmF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpSRVNBTVBMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpSRU1PVkUsIE5VTEwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpDSEFOTkVMX01BU0ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSBmYXN0VHJhY2stPm1DaGFubmVsTWFzayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBlbmFibGVkCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uc1tpXSA9IGZhc3RUcmFjay0+bUdlbmVyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmYXN0VHJhY2tzR2VuID0gY3VycmVudC0+bUZhc3RUcmFja3NHZW47Ci0KLSAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1OdW1UcmFja3MgPSBwb3Bjb3VudChjdXJyZW50VHJhY2tNYXNrKTsKLSAgICAgICAgICAgIH0KLQotI2lmIDEgICAvLyBGSVhNRSBzaG91bGRuJ3QgbmVlZCB0aGlzCi0gICAgICAgICAgICAvLyBvbmx5IHByb2Nlc3Mgc3RhdGUgY2hhbmdlIG9uY2UKLSAgICAgICAgICAgIHByZXZpb3VzID0gY3VycmVudDsKLSNlbmRpZgotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZG8gd29yayB1c2luZyBjdXJyZW50IHN0YXRlIGhlcmUKLSAgICAgICAgaWYgKChjb21tYW5kICYgRmFzdE1peGVyU3RhdGU6Ok1JWCkgJiYgKG1peGVyICE9IE5VTEwpICYmIGlzV2FybSkgewotICAgICAgICAgICAgQUxPR19BU1NFUlQobWl4QnVmZmVyICE9IE5VTEwpOwotICAgICAgICAgICAgLy8gZm9yIGVhY2ggdHJhY2ssIHVwZGF0ZSB2b2x1bWUgYW5kIGNoZWNrIGZvciB1bmRlcnJ1bgotICAgICAgICAgICAgdW5zaWduZWQgY3VycmVudFRyYWNrTWFzayA9IGN1cnJlbnQtPm1UcmFja01hc2s7Ci0gICAgICAgICAgICB3aGlsZSAoY3VycmVudFRyYWNrTWFzayAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgaSA9IF9fYnVpbHRpbl9jdHooY3VycmVudFRyYWNrTWFzayk7Ci0gICAgICAgICAgICAgICAgY3VycmVudFRyYWNrTWFzayAmPSB+KDEgPDwgaSk7Ci0gICAgICAgICAgICAgICAgY29uc3QgRmFzdFRyYWNrKiBmYXN0VHJhY2sgPSAmY3VycmVudC0+bUZhc3RUcmFja3NbaV07Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWZyZXNoIHRoZSBwZXItdHJhY2sgdGltZXN0YW1wCi0gICAgICAgICAgICAgICAgaWYgKHRpbWVzdGFtcFN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0cmFja0ZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQ7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRyYWNrU2FtcGxlUmF0ZSA9IGZhc3RUcmFjay0+bVNhbXBsZVJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIGN1cnJlbnRseSBubyBzYW1wbGUgcmF0ZSBjb252ZXJzaW9uIGZvciBmYXN0IHRyYWNrcyBjdXJyZW50bHkKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrU2FtcGxlUmF0ZSAhPSAwICYmIHRyYWNrU2FtcGxlUmF0ZSAhPSBzYW1wbGVSYXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFja0ZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGludDY0X3QpIG5hdGl2ZUZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQgKiB0cmFja1NhbXBsZVJhdGUpIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZCA9IG5hdGl2ZUZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHJhY2tGcmFtZXNXcml0dGVuID0gZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXItPmZyYW1lc1JlbGVhc2VkKCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENhbid0IHByb3ZpZGUgYW4gQXVkaW9UaW1lc3RhbXAgYmVmb3JlIGZpcnN0IGZyYW1lIHByZXNlbnRlZCwKLSAgICAgICAgICAgICAgICAgICAgLy8gb3IgZHVyaW5nIHRoZSBicmllZiAzMi1iaXQgd3JhcGFyb3VuZCB3aW5kb3cKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrRnJhbWVzV3JpdHRlbiA+PSB0cmFja0ZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVGltZXN0YW1wIHBlclRyYWNrVGltZXN0YW1wOwotICAgICAgICAgICAgICAgICAgICAgICAgcGVyVHJhY2tUaW1lc3RhbXAubVBvc2l0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tGcmFtZXNXcml0dGVuIC0gdHJhY2tGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkOwotICAgICAgICAgICAgICAgICAgICAgICAgcGVyVHJhY2tUaW1lc3RhbXAubVRpbWUgPSB0aW1lc3RhbXAubVRpbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1CdWZmZXJQcm92aWRlci0+b25UaW1lc3RhbXAocGVyVHJhY2tUaW1lc3RhbXApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaW50IG5hbWUgPSBmYXN0VHJhY2tOYW1lc1tpXTsKKyAgICAgICAgICAgICAgICBuYW1lID0gZmFzdFRyYWNrTmFtZXNbaV07CiAgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQobmFtZSA+PSAwKTsKLSAgICAgICAgICAgICAgICBpZiAoZmFzdFRyYWNrLT5tVm9sdW1lUHJvdmlkZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2bHIgPSBmYXN0VHJhY2stPm1Wb2x1bWVQcm92aWRlci0+Z2V0Vm9sdW1lTFIoKTsKLSAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikodmxyICYgMHhGRkZGKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHZsciA+PiAxNikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBGSVhNRSBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiBmcmFtZXNSZWFkeSgpIGZvciBmYXN0IHRyYWNrcwotICAgICAgICAgICAgICAgIC8vIHRha2VzIGEgdHJ5TG9jaywgd2hpY2ggY2FuIGJsb2NrCi0gICAgICAgICAgICAgICAgLy8gdXAgdG8gMSBtcy4gIElmIGVub3VnaCBhY3RpdmUgdHJhY2tzIGFsbCBibG9ja2VkIGluIHNlcXVlbmNlLCB0aGlzIHdvdWxkIHJlc3VsdAotICAgICAgICAgICAgICAgIC8vIGluIHRoZSBvdmVyYWxsIGZhc3QgbWl4IGN5Y2xlIGJlaW5nIGRlbGF5ZWQuICBTaG91bGQgdXNlIGEgbm9uLWJsb2NraW5nIEZJRk8uCi0gICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lc1JlYWR5ID0gZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXItPmZyYW1lc1JlYWR5KCk7Ci0gICAgICAgICAgICAgICAgaWYgKEFUUkFDRV9FTkFCTEVEKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSSB3aXNoIHdlIGhhZCBmb3JtYXR0ZWQgdHJhY2UgbmFtZXMKLSAgICAgICAgICAgICAgICAgICAgY2hhciB0cmFjZU5hbWVbMTZdOwotICAgICAgICAgICAgICAgICAgICBzdHJjcHkodHJhY2VOYW1lLCAiZlJkeSIpOwotICAgICAgICAgICAgICAgICAgICB0cmFjZU5hbWVbNF0gPSBpICsgKGkgPCAxMCA/ICcwJyA6ICdBJyAtIDEwKTsKLSAgICAgICAgICAgICAgICAgICAgdHJhY2VOYW1lWzVdID0gJ1wwJzsKLSAgICAgICAgICAgICAgICAgICAgQVRSQUNFX0lOVCh0cmFjZU5hbWUsIGZyYW1lc1JlYWR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRmFzdFRyYWNrRHVtcCAqZnREdW1wID0gJmR1bXBTdGF0ZS0+bVRyYWNrc1tpXTsKLSAgICAgICAgICAgICAgICBGYXN0VHJhY2tVbmRlcnJ1bnMgdW5kZXJydW5zID0gZnREdW1wLT5tVW5kZXJydW5zOwotICAgICAgICAgICAgICAgIGlmIChmcmFtZXNSZWFkeSA8IGZyYW1lQ291bnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lc1JlYWR5ID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVycnVucy5tQml0RmllbGRzLm1FbXB0eSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXJydW5zLm1CaXRGaWVsZHMubU1vc3RSZWNlbnQgPSBVTkRFUlJVTl9FTVBUWTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1peGVyLT5kaXNhYmxlKG5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgbWl4aW5nIHBhcnRpYWwgYnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICAgICB1bmRlcnJ1bnMubUJpdEZpZWxkcy5tUGFydGlhbCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXJydW5zLm1CaXRGaWVsZHMubU1vc3RSZWNlbnQgPSBVTkRFUlJVTl9QQVJUSUFMOwotICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZXItPmVuYWJsZShuYW1lKTsKKyAgICAgICAgICAgICAgICBtaXhlci0+ZGVsZXRlVHJhY2tOYW1lKG5hbWUpOworICAgICAgICAgICAgfQorI2lmICFMT0dfTkRFQlVHCisgICAgICAgICAgICBmYXN0VHJhY2tOYW1lc1tpXSA9IC0xOworI2VuZGlmCisgICAgICAgICAgICAvLyBkb24ndCByZXNldCB0cmFjayBkdW1wIHN0YXRlLCBzaW5jZSBvdGhlciBzaWRlIGlzIGlnbm9yaW5nIGl0CisgICAgICAgICAgICBnZW5lcmF0aW9uc1tpXSA9IGZhc3RUcmFjay0+bUdlbmVyYXRpb247CisgICAgICAgIH0KKworICAgICAgICAvLyBub3cgcHJvY2VzcyBhZGRlZCB0cmFja3MKKyAgICAgICAgdW5zaWduZWQgYWRkZWRUcmFja3MgPSBjdXJyZW50VHJhY2tNYXNrICYgfnByZXZpb3VzVHJhY2tNYXNrOworICAgICAgICB3aGlsZSAoYWRkZWRUcmFja3MgIT0gMCkgeworICAgICAgICAgICAgaW50IGkgPSBfX2J1aWx0aW5fY3R6KGFkZGVkVHJhY2tzKTsKKyAgICAgICAgICAgIGFkZGVkVHJhY2tzICY9IH4oMSA8PCBpKTsKKyAgICAgICAgICAgIGNvbnN0IEZhc3RUcmFjayogZmFzdFRyYWNrID0gJmN1cnJlbnQtPm1GYXN0VHJhY2tzW2ldOworICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciAqYnVmZmVyUHJvdmlkZXIgPSBmYXN0VHJhY2stPm1CdWZmZXJQcm92aWRlcjsKKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKGJ1ZmZlclByb3ZpZGVyICE9IE5VTEwgJiYgZmFzdFRyYWNrTmFtZXNbaV0gPT0gLTEpOworICAgICAgICAgICAgaWYgKG1peGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBuYW1lID0gbWl4ZXItPmdldFRyYWNrTmFtZShmYXN0VHJhY2stPm1DaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bUZvcm1hdCwgQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKTsKKyAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChuYW1lID49IDApOworICAgICAgICAgICAgICAgIGZhc3RUcmFja05hbWVzW2ldID0gbmFtZTsKKyAgICAgICAgICAgICAgICBtaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIobmFtZSwgYnVmZmVyUHJvdmlkZXIpOworICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6Ok1BSU5fQlVGRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltTWl4ZXJCdWZmZXIpOworICAgICAgICAgICAgICAgIC8vIG5ld2x5IGFsbG9jYXRlZCB0cmFjayBuYW1lcyBkZWZhdWx0IHRvIGZ1bGwgc2NhbGUgdm9sdW1lCisgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1JWEVSX0ZPUk1BVCwgKHZvaWQgKiltTWl4ZXJCdWZmZXJGb3JtYXQpOworICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkZPUk1BVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdClmYXN0VHJhY2stPm1Gb3JtYXQpOworICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkNIQU5ORUxfTUFTSywKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdClmYXN0VHJhY2stPm1DaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6TUlYRVJfQ0hBTk5FTF9NQVNLLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KW1TaW5rQ2hhbm5lbE1hc2spOworICAgICAgICAgICAgICAgIG1peGVyLT5lbmFibGUobmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnZW5lcmF0aW9uc1tpXSA9IGZhc3RUcmFjay0+bUdlbmVyYXRpb247CisgICAgICAgIH0KKworICAgICAgICAvLyBmaW5hbGx5IHByb2Nlc3MgKHBvdGVudGlhbGx5KSBtb2RpZmllZCB0cmFja3M7IHRoZXNlIHVzZSB0aGUgc2FtZSBzbG90CisgICAgICAgIC8vIGJ1dCBtYXkgaGF2ZSBhIGRpZmZlcmVudCBidWZmZXIgcHJvdmlkZXIgb3Igdm9sdW1lIHByb3ZpZGVyCisgICAgICAgIHVuc2lnbmVkIG1vZGlmaWVkVHJhY2tzID0gY3VycmVudFRyYWNrTWFzayAmIHByZXZpb3VzVHJhY2tNYXNrOworICAgICAgICB3aGlsZSAobW9kaWZpZWRUcmFja3MgIT0gMCkgeworICAgICAgICAgICAgaW50IGkgPSBfX2J1aWx0aW5fY3R6KG1vZGlmaWVkVHJhY2tzKTsKKyAgICAgICAgICAgIG1vZGlmaWVkVHJhY2tzICY9IH4oMSA8PCBpKTsKKyAgICAgICAgICAgIGNvbnN0IEZhc3RUcmFjayogZmFzdFRyYWNrID0gJmN1cnJlbnQtPm1GYXN0VHJhY2tzW2ldOworICAgICAgICAgICAgaWYgKGZhc3RUcmFjay0+bUdlbmVyYXRpb24gIT0gZ2VuZXJhdGlvbnNbaV0pIHsKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHRyYWNrIHdhcyBhY3R1YWxseSBtb2RpZmllZAorICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIgKmJ1ZmZlclByb3ZpZGVyID0gZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXI7CisgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoYnVmZmVyUHJvdmlkZXIgIT0gTlVMTCk7CisgICAgICAgICAgICAgICAgaWYgKG1peGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGZhc3RUcmFja05hbWVzW2ldOworICAgICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChuYW1lID49IDApOworICAgICAgICAgICAgICAgICAgICBtaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIobmFtZSwgYnVmZmVyUHJvdmlkZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAoZmFzdFRyYWNrLT5tVm9sdW1lUHJvdmlkZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZiA9IEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU5fRkxPQVQ7CisgICAgICAgICAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwgJmYpOworICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTEsICZmKTsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlJFU0FNUExFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlJFTU9WRSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNSVhFUl9GT1JNQVQsICh2b2lkICopbU1peGVyQnVmZmVyRm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6Rk9STUFULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdClmYXN0VHJhY2stPm1Gb3JtYXQpOworICAgICAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpDSEFOTkVMX01BU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KWZhc3RUcmFjay0+bUNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6TUlYRVJfQ0hBTk5FTF9NQVNLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdCltU2lua0NoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBlbmFibGVkCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdlbmVyYXRpb25zW2ldID0gZmFzdFRyYWNrLT5tR2VuZXJhdGlvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZhc3RUcmFja3NHZW4gPSBjdXJyZW50LT5tRmFzdFRyYWNrc0dlbjsKKworICAgICAgICBkdW1wU3RhdGUtPm1OdW1UcmFja3MgPSBwb3Bjb3VudChjdXJyZW50VHJhY2tNYXNrKTsKKyAgICB9Cit9CisKK3ZvaWQgRmFzdE1peGVyOjpvbldvcmsoKQoreworICAgIGNvbnN0IEZhc3RNaXhlclN0YXRlICogY29uc3QgY3VycmVudCA9IChjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqKSB0aGlzLT5jdXJyZW50OworICAgIEZhc3RNaXhlckR1bXBTdGF0ZSAqIGNvbnN0IGR1bXBTdGF0ZSA9IChGYXN0TWl4ZXJEdW1wU3RhdGUgKikgdGhpcy0+ZHVtcFN0YXRlOworICAgIGNvbnN0IEZhc3RNaXhlclN0YXRlOjpDb21tYW5kIGNvbW1hbmQgPSB0aGlzLT5jb21tYW5kOworICAgIGNvbnN0IHNpemVfdCBmcmFtZUNvdW50ID0gY3VycmVudC0+bUZyYW1lQ291bnQ7CisKKyAgICBpZiAoKGNvbW1hbmQgJiBGYXN0TWl4ZXJTdGF0ZTo6TUlYKSAmJiAobWl4ZXIgIT0gTlVMTCkgJiYgaXNXYXJtKSB7CisgICAgICAgIEFMT0dfQVNTRVJUKG1NaXhlckJ1ZmZlciAhPSBOVUxMKTsKKyAgICAgICAgLy8gZm9yIGVhY2ggdHJhY2ssIHVwZGF0ZSB2b2x1bWUgYW5kIGNoZWNrIGZvciB1bmRlcnJ1bgorICAgICAgICB1bnNpZ25lZCBjdXJyZW50VHJhY2tNYXNrID0gY3VycmVudC0+bVRyYWNrTWFzazsKKyAgICAgICAgd2hpbGUgKGN1cnJlbnRUcmFja01hc2sgIT0gMCkgeworICAgICAgICAgICAgaW50IGkgPSBfX2J1aWx0aW5fY3R6KGN1cnJlbnRUcmFja01hc2spOworICAgICAgICAgICAgY3VycmVudFRyYWNrTWFzayAmPSB+KDEgPDwgaSk7CisgICAgICAgICAgICBjb25zdCBGYXN0VHJhY2sqIGZhc3RUcmFjayA9ICZjdXJyZW50LT5tRmFzdFRyYWNrc1tpXTsKKworICAgICAgICAgICAgLy8gUmVmcmVzaCB0aGUgcGVyLXRyYWNrIHRpbWVzdGFtcAorICAgICAgICAgICAgaWYgKHRpbWVzdGFtcFN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHRyYWNrRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZCA9CisgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQ7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdHJhY2tGcmFtZXNXcml0dGVuID0gZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXItPmZyYW1lc1JlbGVhc2VkKCk7CisgICAgICAgICAgICAgICAgLy8gQ2FuJ3QgcHJvdmlkZSBhbiBBdWRpb1RpbWVzdGFtcCBiZWZvcmUgZmlyc3QgZnJhbWUgcHJlc2VudGVkLAorICAgICAgICAgICAgICAgIC8vIG9yIGR1cmluZyB0aGUgYnJpZWYgMzItYml0IHdyYXBhcm91bmQgd2luZG93CisgICAgICAgICAgICAgICAgaWYgKHRyYWNrRnJhbWVzV3JpdHRlbiA+PSB0cmFja0ZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgQXVkaW9UaW1lc3RhbXAgcGVyVHJhY2tUaW1lc3RhbXA7CisgICAgICAgICAgICAgICAgICAgIHBlclRyYWNrVGltZXN0YW1wLm1Qb3NpdGlvbiA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tGcmFtZXNXcml0dGVuIC0gdHJhY2tGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkOworICAgICAgICAgICAgICAgICAgICBwZXJUcmFja1RpbWVzdGFtcC5tVGltZSA9IHRpbWVzdGFtcC5tVGltZTsKKyAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXItPm9uVGltZXN0YW1wKHBlclRyYWNrVGltZXN0YW1wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBuYW1lID0gZmFzdFRyYWNrTmFtZXNbaV07CisgICAgICAgICAgICBBTE9HX0FTU0VSVChuYW1lID49IDApOworICAgICAgICAgICAgaWYgKGZhc3RUcmFjay0+bVZvbHVtZVByb3ZpZGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBnYWluX21pbmlmbG9hdF9wYWNrZWRfdCB2bHIgPSBmYXN0VHJhY2stPm1Wb2x1bWVQcm92aWRlci0+Z2V0Vm9sdW1lTFIoKTsKKyAgICAgICAgICAgICAgICBmbG9hdCB2bGYgPSBmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX2xlZnQodmxyKSk7CisgICAgICAgICAgICAgICAgZmxvYXQgdnJmID0gZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19yaWdodCh2bHIpKTsKKworICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUwLCAmdmxmKTsKKyAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMSwgJnZyZik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBGSVhNRSBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiBmcmFtZXNSZWFkeSgpIGZvciBmYXN0IHRyYWNrcworICAgICAgICAgICAgLy8gdGFrZXMgYSB0cnlMb2NrLCB3aGljaCBjYW4gYmxvY2sKKyAgICAgICAgICAgIC8vIHVwIHRvIDEgbXMuICBJZiBlbm91Z2ggYWN0aXZlIHRyYWNrcyBhbGwgYmxvY2tlZCBpbiBzZXF1ZW5jZSwgdGhpcyB3b3VsZCByZXN1bHQKKyAgICAgICAgICAgIC8vIGluIHRoZSBvdmVyYWxsIGZhc3QgbWl4IGN5Y2xlIGJlaW5nIGRlbGF5ZWQuICBTaG91bGQgdXNlIGEgbm9uLWJsb2NraW5nIEZJRk8uCisgICAgICAgICAgICBzaXplX3QgZnJhbWVzUmVhZHkgPSBmYXN0VHJhY2stPm1CdWZmZXJQcm92aWRlci0+ZnJhbWVzUmVhZHkoKTsKKyAgICAgICAgICAgIGlmIChBVFJBQ0VfRU5BQkxFRCgpKSB7CisgICAgICAgICAgICAgICAgLy8gSSB3aXNoIHdlIGhhZCBmb3JtYXR0ZWQgdHJhY2UgbmFtZXMKKyAgICAgICAgICAgICAgICBjaGFyIHRyYWNlTmFtZVsxNl07CisgICAgICAgICAgICAgICAgc3RyY3B5KHRyYWNlTmFtZSwgImZSZHkiKTsKKyAgICAgICAgICAgICAgICB0cmFjZU5hbWVbNF0gPSBpICsgKGkgPCAxMCA/ICcwJyA6ICdBJyAtIDEwKTsKKyAgICAgICAgICAgICAgICB0cmFjZU5hbWVbNV0gPSAnXDAnOworICAgICAgICAgICAgICAgIEFUUkFDRV9JTlQodHJhY2VOYW1lLCBmcmFtZXNSZWFkeSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGYXN0VHJhY2tEdW1wICpmdER1bXAgPSAmZHVtcFN0YXRlLT5tVHJhY2tzW2ldOworICAgICAgICAgICAgRmFzdFRyYWNrVW5kZXJydW5zIHVuZGVycnVucyA9IGZ0RHVtcC0+bVVuZGVycnVuczsKKyAgICAgICAgICAgIGlmIChmcmFtZXNSZWFkeSA8IGZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgICAgICBpZiAoZnJhbWVzUmVhZHkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICB1bmRlcnJ1bnMubUJpdEZpZWxkcy5tRW1wdHkrKzsKKyAgICAgICAgICAgICAgICAgICAgdW5kZXJydW5zLm1CaXRGaWVsZHMubU1vc3RSZWNlbnQgPSBVTkRFUlJVTl9FTVBUWTsKKyAgICAgICAgICAgICAgICAgICAgbWl4ZXItPmRpc2FibGUobmFtZSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdW5kZXJydW5zLm1CaXRGaWVsZHMubUZ1bGwrKzsKLSAgICAgICAgICAgICAgICAgICAgdW5kZXJydW5zLm1CaXRGaWVsZHMubU1vc3RSZWNlbnQgPSBVTkRFUlJVTl9GVUxMOworICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBtaXhpbmcgcGFydGlhbCBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgdW5kZXJydW5zLm1CaXRGaWVsZHMubVBhcnRpYWwrKzsKKyAgICAgICAgICAgICAgICAgICAgdW5kZXJydW5zLm1CaXRGaWVsZHMubU1vc3RSZWNlbnQgPSBVTkRFUlJVTl9QQVJUSUFMOwogICAgICAgICAgICAgICAgICAgICBtaXhlci0+ZW5hYmxlKG5hbWUpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmdER1bXAtPm1VbmRlcnJ1bnMgPSB1bmRlcnJ1bnM7Ci0gICAgICAgICAgICAgICAgZnREdW1wLT5tRnJhbWVzUmVhZHkgPSBmcmFtZXNSZWFkeTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50NjRfdCBwdHM7Ci0gICAgICAgICAgICBpZiAob3V0cHV0U2luayA9PSBOVUxMIHx8IChPSyAhPSBvdXRwdXRTaW5rLT5nZXROZXh0V3JpdGVUaW1lc3RhbXAoJnB0cykpKQotICAgICAgICAgICAgICAgIHB0cyA9IEF1ZGlvQnVmZmVyUHJvdmlkZXI6OmtJbnZhbGlkUFRTOwotCi0gICAgICAgICAgICAvLyBwcm9jZXNzKCkgaXMgQ1BVLWJvdW5kCi0gICAgICAgICAgICBtaXhlci0+cHJvY2VzcyhwdHMpOwotICAgICAgICAgICAgbWl4QnVmZmVyU3RhdGUgPSBNSVhFRDsKLSAgICAgICAgfSBlbHNlIGlmIChtaXhCdWZmZXJTdGF0ZSA9PSBNSVhFRCkgewotICAgICAgICAgICAgbWl4QnVmZmVyU3RhdGUgPSBVTkRFRklORUQ7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbCBhdHRlbXB0ZWRXcml0ZSA9IGZhbHNlOwotICAgICAgICAvL2Jvb2wgZGlkRnVsbFdyaXRlID0gZmFsc2U7ICAgIC8vIGR1bXBzeXMgY291bGQgZGlzcGxheSBhIGNvdW50IG9mIHBhcnRpYWwgd3JpdGVzCi0gICAgICAgIGlmICgoY29tbWFuZCAmIEZhc3RNaXhlclN0YXRlOjpXUklURSkgJiYgKG91dHB1dFNpbmsgIT0gTlVMTCkgJiYgKG1peEJ1ZmZlciAhPSBOVUxMKSkgewotICAgICAgICAgICAgaWYgKG1peEJ1ZmZlclN0YXRlID09IFVOREVGSU5FRCkgewotICAgICAgICAgICAgICAgIG1lbXNldChtaXhCdWZmZXIsIDAsIGZyYW1lQ291bnQgKiBGQ0NfMiAqIHNpemVvZihzaG9ydCkpOwotICAgICAgICAgICAgICAgIG1peEJ1ZmZlclN0YXRlID0gWkVST0VEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRlZVNpbmsgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICh2b2lkKSB0ZWVTaW5rLT53cml0ZShtaXhCdWZmZXIsIGZyYW1lQ291bnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gRklYTUUgd3JpdGUoKSBpcyBub24tYmxvY2tpbmcgYW5kIGxvY2stZnJlZSBmb3IgYSBwcm9wZXJseSBpbXBsZW1lbnRlZCBOQkFJTyBzaW5rLAotICAgICAgICAgICAgLy8gICAgICAgYnV0IHRoaXMgY29kZSBzaG91bGQgYmUgbW9kaWZpZWQgdG8gaGFuZGxlIGJvdGggbm9uLWJsb2NraW5nIGFuZCBibG9ja2luZyBzaW5rcwotICAgICAgICAgICAgZHVtcFN0YXRlLT5tV3JpdGVTZXF1ZW5jZSsrOwotICAgICAgICAgICAgQVRSQUNFX0JFR0lOKCJ3cml0ZSIpOwotICAgICAgICAgICAgc3NpemVfdCBmcmFtZXNXcml0dGVuID0gb3V0cHV0U2luay0+d3JpdGUobWl4QnVmZmVyLCBmcmFtZUNvdW50KTsKLSAgICAgICAgICAgIEFUUkFDRV9FTkQoKTsKLSAgICAgICAgICAgIGR1bXBTdGF0ZS0+bVdyaXRlU2VxdWVuY2UrKzsKLSAgICAgICAgICAgIGlmIChmcmFtZXNXcml0dGVuID49IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVCgoc2l6ZV90KSBmcmFtZXNXcml0dGVuIDw9IGZyYW1lQ291bnQpOwotICAgICAgICAgICAgICAgIHRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbiArPSBmcmFtZXNXcml0dGVuOwotICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bUZyYW1lc1dyaXR0ZW4gPSB0b3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW47Ci0gICAgICAgICAgICAgICAgLy9pZiAoKHNpemVfdCkgZnJhbWVzV3JpdHRlbiA9PSBmcmFtZUNvdW50KSB7Ci0gICAgICAgICAgICAgICAgLy8gICAgZGlkRnVsbFdyaXRlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAvL30KICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tV3JpdGVFcnJvcnMrKzsKKyAgICAgICAgICAgICAgICB1bmRlcnJ1bnMubUJpdEZpZWxkcy5tRnVsbCsrOworICAgICAgICAgICAgICAgIHVuZGVycnVucy5tQml0RmllbGRzLm1Nb3N0UmVjZW50ID0gVU5ERVJSVU5fRlVMTDsKKyAgICAgICAgICAgICAgICBtaXhlci0+ZW5hYmxlKG5hbWUpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYXR0ZW1wdGVkV3JpdGUgPSB0cnVlOwotICAgICAgICAgICAgLy8gRklYTUUgY291bnQgIyBvZiB3cml0ZXMgYmxvY2tlZCBleGNlc3NpdmVseSwgQ1BVIHVzYWdlLCBldGMuIGZvciBkdW1wCi0KLSAgICAgICAgICAgIHRpbWVzdGFtcFN0YXR1cyA9IG91dHB1dFNpbmstPmdldFRpbWVzdGFtcCh0aW1lc3RhbXApOwotICAgICAgICAgICAgaWYgKHRpbWVzdGFtcFN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHVpbnQzMl90IHRvdGFsTmF0aXZlRnJhbWVzUHJlc2VudGVkID0gdGltZXN0YW1wLm1Qb3NpdGlvbjsKLSAgICAgICAgICAgICAgICBpZiAodG90YWxOYXRpdmVGcmFtZXNQcmVzZW50ZWQgPD0gdG90YWxOYXRpdmVGcmFtZXNXcml0dGVuKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5hdGl2ZUZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxOYXRpdmVGcmFtZXNXcml0dGVuIC0gdG90YWxOYXRpdmVGcmFtZXNQcmVzZW50ZWQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSEFMIHJlcG9ydGVkIHRoYXQgbW9yZSBmcmFtZXMgd2VyZSBwcmVzZW50ZWQgdGhhbiB3ZXJlIHdyaXR0ZW4KLSAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wU3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICAgICAgZnREdW1wLT5tVW5kZXJydW5zID0gdW5kZXJydW5zOworICAgICAgICAgICAgZnREdW1wLT5tRnJhbWVzUmVhZHkgPSBmcmFtZXNSZWFkeTsKICAgICAgICAgfQogCi0gICAgICAgIC8vIFRvIGJlIGV4YWN0bHkgcGVyaW9kaWMsIGNvbXB1dGUgdGhlIG5leHQgc2xlZXAgdGltZSBiYXNlZCBvbiBjdXJyZW50IHRpbWUuCi0gICAgICAgIC8vIFRoaXMgY29kZSBkb2Vzbid0IGhhdmUgbG9uZy10ZXJtIHN0YWJpbGl0eSB3aGVuIHRoZSBzaW5rIGlzIG5vbi1ibG9ja2luZy4KLSAgICAgICAgLy8gRklYTUUgVG8gYXZvaWQgZHJpZnQsIHVzZSB0aGUgbG9jYWwgYXVkaW8gY2xvY2sgb3Igd2F0Y2ggdGhlIHNpbmsncyBmaWxsIHN0YXR1cy4KLSAgICAgICAgc3RydWN0IHRpbWVzcGVjIG5ld1RzOwotICAgICAgICBpbnQgcmMgPSBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJm5ld1RzKTsKLSAgICAgICAgaWYgKHJjID09IDApIHsKLSAgICAgICAgICAgIC8vbG9nV3JpdGVyLT5sb2dUaW1lc3RhbXAobmV3VHMpOwotICAgICAgICAgICAgaWYgKG9sZFRzVmFsaWQpIHsKLSAgICAgICAgICAgICAgICB0aW1lX3Qgc2VjID0gbmV3VHMudHZfc2VjIC0gb2xkVHMudHZfc2VjOwotICAgICAgICAgICAgICAgIGxvbmcgbnNlYyA9IG5ld1RzLnR2X25zZWMgLSBvbGRUcy50dl9uc2VjOwotICAgICAgICAgICAgICAgIEFMT0dFX0lGKHNlYyA8IDAgfHwgKHNlYyA9PSAwICYmIG5zZWMgPCAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQykgZmFpbGVkOiB3YXMgJWxkLiUwOWxkIGJ1dCBub3cgJWxkLiUwOWxkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9sZFRzLnR2X3NlYywgb2xkVHMudHZfbnNlYywgbmV3VHMudHZfc2VjLCBuZXdUcy50dl9uc2VjKTsKLSAgICAgICAgICAgICAgICBpZiAobnNlYyA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLS1zZWM7Ci0gICAgICAgICAgICAgICAgICAgIG5zZWMgKz0gMTAwMDAwMDAwMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gVG8gYXZvaWQgYW4gaW5pdGlhbCB1bmRlcnJ1biBvbiBmYXN0IHRyYWNrcyBhZnRlciBleGl0aW5nIHN0YW5kYnksCi0gICAgICAgICAgICAgICAgLy8gZG8gbm90IHN0YXJ0IHB1bGxpbmcgZGF0YSBmcm9tIHRyYWNrcyBhbmQgbWl4aW5nIHVudGlsIHdhcm11cCBpcyBjb21wbGV0ZS4KLSAgICAgICAgICAgICAgICAvLyBXYXJtdXAgaXMgY29uc2lkZXJlZCBjb21wbGV0ZSBhZnRlciB0aGUgZWFybGllciBvZjoKLSAgICAgICAgICAgICAgICAvLyAgICAgIE1JTl9XQVJNVVBfQ1lDTEVTIHdyaXRlKCkgYXR0ZW1wdHMgYW5kIGxhc3Qgb25lIGJsb2NrcyBmb3IgYXQgbGVhc3Qgd2FybXVwTnMKLSAgICAgICAgICAgICAgICAvLyAgICAgIE1BWF9XQVJNVVBfQ1lDTEVTIHdyaXRlKCkgYXR0ZW1wdHMuCi0gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBvdmVybHkgY29uc2VydmF0aXZlLCBidXQgdG8gZ2V0IGJldHRlciBhY2N1cmFjeSByZXF1aXJlcyBhIG5ldyBIQUwgQVBJLgotICAgICAgICAgICAgICAgIGlmICghaXNXYXJtICYmIGF0dGVtcHRlZFdyaXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lYXN1cmVkV2FybXVwVHMudHZfc2VjICs9IHNlYzsKLSAgICAgICAgICAgICAgICAgICAgbWVhc3VyZWRXYXJtdXBUcy50dl9uc2VjICs9IG5zZWM7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgPj0gMTAwMDAwMDAwMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZWRXYXJtdXBUcy50dl9zZWMrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVkV2FybXVwVHMudHZfbnNlYyAtPSAxMDAwMDAwMDAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICsrd2FybXVwQ3ljbGVzOwotICAgICAgICAgICAgICAgICAgICBpZiAoKG5zZWMgPiB3YXJtdXBOcyAmJiB3YXJtdXBDeWNsZXMgPj0gTUlOX1dBUk1VUF9DWUNMRVMpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdhcm11cEN5Y2xlcyA+PSBNQVhfV0FSTVVQX0NZQ0xFUykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzV2FybSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1NZWFzdXJlZFdhcm11cFRzID0gbWVhc3VyZWRXYXJtdXBUczsKLSAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bVdhcm11cEN5Y2xlcyA9IHdhcm11cEN5Y2xlczsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzbGVlcE5zID0gLTE7Ci0gICAgICAgICAgICAgICAgaWYgKGlzV2FybSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2VjID4gMCB8fCBuc2VjID4gdW5kZXJydW5OcykgewotICAgICAgICAgICAgICAgICAgICAgICAgQVRSQUNFX05BTUUoInVuZGVycnVuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSBvbmx5IGxvZyBvY2Nhc2lvbmFsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJ1bmRlcnJ1bjogdGltZSBzaW5jZSBsYXN0IGN5Y2xlICVkLiUwM2xkIHNlYyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIHNlYywgbnNlYyAvIDEwMDAwMDBMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bVVuZGVycnVucysrOwotICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlTmV4dE92ZXJydW4gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5zZWMgPCBvdmVycnVuTnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZ25vcmVOZXh0T3ZlcnJ1bikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZU5leHRPdmVycnVuID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIG9ubHkgbG9nIG9jY2FzaW9uYWxseQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJvdmVycnVuOiB0aW1lIHNpbmNlIGxhc3QgY3ljbGUgJWQuJTAzbGQgc2VjIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIHNlYywgbnNlYyAvIDEwMDAwMDBMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1PdmVycnVucysrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBmb3JjZXMgYSBtaW5pbXVtIGN5Y2xlIHRpbWUuIEl0OgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gY29tcGVuc2F0ZXMgZm9yIGFuIGF1ZGlvIEhBTCB3aXRoIGppdHRlciBkdWUgdG8gc2FtcGxlIHJhdGUgY29udmVyc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gd29ya3Mgd2l0aCBhIHZhcmlhYmxlIGJ1ZmZlciBkZXB0aCBhdWRpbyBIQUwgdGhhdCBuZXZlciBwdWxscyBhdCBhCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICByYXRlIDwgdGhhbiBvdmVycnVuTnMgcGVyIGJ1ZmZlci4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICAtIHJlY292ZXJzIGZyb20gb3ZlcnJ1biBpbW1lZGlhdGVseSBhZnRlciB1bmRlcnJ1bgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXQgZG9lc24ndCB3b3JrIHdpdGggYSBub24tYmxvY2tpbmcgYXVkaW8gSEFMLgotICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXBOcyA9IGZvcmNlTnMgLSBuc2VjOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlTmV4dE92ZXJydW4gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKLSAgICAgICAgICAgICAgICBpZiAoaXNXYXJtKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGFkdmFuY2UgdGhlIEZJRk8gcXVldWUgYm91bmRzCi0gICAgICAgICAgICAgICAgICAgIHNpemVfdCBpID0gYm91bmRzICYgKGR1bXBTdGF0ZS0+bVNhbXBsaW5nTiAtIDEpOwotICAgICAgICAgICAgICAgICAgICBib3VuZHMgPSAoYm91bmRzICYgMHhGRkZGMDAwMCkgfCAoKGJvdW5kcyArIDEpICYgMHhGRkZGKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcyArPSAweDEwMDAwOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCEoYm91bmRzICYgKGR1bXBTdGF0ZS0+bVNhbXBsaW5nTiAtIDEpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZnVsbCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gY29tcHV0ZSB0aGUgZGVsdGEgdmFsdWUgb2YgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMpCi0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1vbm90b25pY05zID0gbnNlYzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlYyA+IDAgJiYgc2VjIDwgNCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbW9ub3RvbmljTnMgKz0gc2VjICogMTAwMDAwMDAwMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBjb21wdXRlIHJhdyBDUFUgbG9hZCA9IGRlbHRhIHZhbHVlIG9mIGNsb2NrX2dldHRpbWUoQ0xPQ0tfVEhSRUFEX0NQVVRJTUVfSUQpCi0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxvYWROcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1lc3BlYyBuZXdMb2FkOwotICAgICAgICAgICAgICAgICAgICByYyA9IGNsb2NrX2dldHRpbWUoQ0xPQ0tfVEhSRUFEX0NQVVRJTUVfSUQsICZuZXdMb2FkKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJjID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbGRMb2FkVmFsaWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWMgPSBuZXdMb2FkLnR2X3NlYyAtIG9sZExvYWQudHZfc2VjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWMgPSBuZXdMb2FkLnR2X25zZWMgLSBvbGRMb2FkLnR2X25zZWM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5zZWMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tc2VjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2VjICs9IDEwMDAwMDAwMDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWROcyA9IG5zZWM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlYyA+IDAgJiYgc2VjIDwgNCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkTnMgKz0gc2VjICogMTAwMDAwMDAwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IHRpbWUgdGhyb3VnaCB0aGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZExvYWRWYWxpZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBvbGRMb2FkID0gbmV3TG9hZDsKLSAgICAgICAgICAgICAgICAgICAgfQotI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUwotICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGFic29sdXRlIHZhbHVlIG9mIENQVSBjbG9jayBmcmVxdWVuY3kgaW4ga0h6Ci0gICAgICAgICAgICAgICAgICAgIGludCBjcHVOdW0gPSBzY2hlZF9nZXRjcHUoKTsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qga0h6ID0gdGN1LmdldENwdWtIeihjcHVOdW0pOwotICAgICAgICAgICAgICAgICAgICBrSHogPSAoa0h6IDw8IDQpIHwgKGNwdU51bSAmIDB4Rik7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSB2YWx1ZXMgaW4gRklGTyBxdWV1ZXMgZm9yIGR1bXBzeXMKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlc2Ugc3RvcmVzICMxLCAjMiwgIzMgYXJlIG5vdCBhdG9taWMgd2l0aCByZXNwZWN0IHRvIGVhY2ggb3RoZXIsCi0gICAgICAgICAgICAgICAgICAgIC8vIG9yIHdpdGggcmVzcGVjdCB0byBzdG9yZSAjNCBiZWxvdwotICAgICAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1Nb25vdG9uaWNOc1tpXSA9IG1vbm90b25pY05zOwotICAgICAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1Mb2FkTnNbaV0gPSBsb2FkTnM7Ci0jaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCi0gICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bUNwdWtIeltpXSA9IGtIejsKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHN0b3JlICM0IGlzIG5vdCBhdG9taWMgd2l0aCByZXNwZWN0IHRvIHN0b3JlcyAjMSwgIzIsICMzIGFib3ZlLCBidXQKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG5ld2VzdCBvcGVuICYgb2xkZXN0IGNsb3NlZCBoYWx2ZXMgYXJlIGF0b21pYyB3aXRoIHJlc3BlY3QgdG8gZWFjaCBvdGhlcgotICAgICAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1Cb3VuZHMgPSBib3VuZHM7Ci0gICAgICAgICAgICAgICAgICAgIEFUUkFDRV9JTlQoImN5Y2xlX21zIiwgbW9ub3RvbmljTnMgLyAxMDAwMDAwKTsKLSAgICAgICAgICAgICAgICAgICAgQVRSQUNFX0lOVCgibG9hZF91cyIsIGxvYWROcyAvIDEwMDApOwotICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBmaXJzdCB0aW1lIHRocm91Z2ggdGhlIGxvb3AKLSAgICAgICAgICAgICAgICBvbGRUc1ZhbGlkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBzbGVlcE5zID0gcGVyaW9kTnM7Ci0gICAgICAgICAgICAgICAgaWdub3JlTmV4dE92ZXJydW4gPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb2xkVHMgPSBuZXdUczsKKyAgICAgICAgaW50NjRfdCBwdHM7CisgICAgICAgIGlmIChvdXRwdXRTaW5rID09IE5VTEwgfHwgKE9LICE9IG91dHB1dFNpbmstPmdldE5leHRXcml0ZVRpbWVzdGFtcCgmcHRzKSkpIHsKKyAgICAgICAgICAgIHB0cyA9IEF1ZGlvQnVmZmVyUHJvdmlkZXI6OmtJbnZhbGlkUFRTOworICAgICAgICB9CisKKyAgICAgICAgLy8gcHJvY2VzcygpIGlzIENQVS1ib3VuZAorICAgICAgICBtaXhlci0+cHJvY2VzcyhwdHMpOworICAgICAgICBtTWl4ZXJCdWZmZXJTdGF0ZSA9IE1JWEVEOworICAgIH0gZWxzZSBpZiAobU1peGVyQnVmZmVyU3RhdGUgPT0gTUlYRUQpIHsKKyAgICAgICAgbU1peGVyQnVmZmVyU3RhdGUgPSBVTkRFRklORUQ7CisgICAgfQorICAgIC8vYm9vbCBkaWRGdWxsV3JpdGUgPSBmYWxzZTsgICAgLy8gZHVtcHN5cyBjb3VsZCBkaXNwbGF5IGEgY291bnQgb2YgcGFydGlhbCB3cml0ZXMKKyAgICBpZiAoKGNvbW1hbmQgJiBGYXN0TWl4ZXJTdGF0ZTo6V1JJVEUpICYmIChvdXRwdXRTaW5rICE9IE5VTEwpICYmIChtTWl4ZXJCdWZmZXIgIT0gTlVMTCkpIHsKKyAgICAgICAgaWYgKG1NaXhlckJ1ZmZlclN0YXRlID09IFVOREVGSU5FRCkgeworICAgICAgICAgICAgbWVtc2V0KG1NaXhlckJ1ZmZlciwgMCwgbU1peGVyQnVmZmVyU2l6ZSk7CisgICAgICAgICAgICBtTWl4ZXJCdWZmZXJTdGF0ZSA9IFpFUk9FRDsKKyAgICAgICAgfQorICAgICAgICB2b2lkICpidWZmZXIgPSBtU2lua0J1ZmZlciAhPSBOVUxMID8gbVNpbmtCdWZmZXIgOiBtTWl4ZXJCdWZmZXI7CisgICAgICAgIGlmIChmb3JtYXQubUZvcm1hdCAhPSBtTWl4ZXJCdWZmZXJGb3JtYXQpIHsgLy8gc2luayBmb3JtYXQgbm90IHRoZSBzYW1lIGFzIG1peGVyIGZvcm1hdAorICAgICAgICAgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdChidWZmZXIsIGZvcm1hdC5tRm9ybWF0LCBtTWl4ZXJCdWZmZXIsIG1NaXhlckJ1ZmZlckZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCAqIEZvcm1hdF9jaGFubmVsQ291bnQoZm9ybWF0KSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gaWYgbm9uLU5VTEwsIHRoZW4gZHVwbGljYXRlIHdyaXRlKCkgdG8gdGhpcyBub24tYmxvY2tpbmcgc2luaworICAgICAgICBOQkFJT19TaW5rKiB0ZWVTaW5rOworICAgICAgICBpZiAoKHRlZVNpbmsgPSBjdXJyZW50LT5tVGVlU2luaykgIT0gTlVMTCkgeworICAgICAgICAgICAgKHZvaWQpIHRlZVNpbmstPndyaXRlKGJ1ZmZlciwgZnJhbWVDb3VudCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gRklYTUUgd3JpdGUoKSBpcyBub24tYmxvY2tpbmcgYW5kIGxvY2stZnJlZSBmb3IgYSBwcm9wZXJseSBpbXBsZW1lbnRlZCBOQkFJTyBzaW5rLAorICAgICAgICAvLyAgICAgICBidXQgdGhpcyBjb2RlIHNob3VsZCBiZSBtb2RpZmllZCB0byBoYW5kbGUgYm90aCBub24tYmxvY2tpbmcgYW5kIGJsb2NraW5nIHNpbmtzCisgICAgICAgIGR1bXBTdGF0ZS0+bVdyaXRlU2VxdWVuY2UrKzsKKyAgICAgICAgQVRSQUNFX0JFR0lOKCJ3cml0ZSIpOworICAgICAgICBzc2l6ZV90IGZyYW1lc1dyaXR0ZW4gPSBvdXRwdXRTaW5rLT53cml0ZShidWZmZXIsIGZyYW1lQ291bnQpOworICAgICAgICBBVFJBQ0VfRU5EKCk7CisgICAgICAgIGR1bXBTdGF0ZS0+bVdyaXRlU2VxdWVuY2UrKzsKKyAgICAgICAgaWYgKGZyYW1lc1dyaXR0ZW4gPj0gMCkgeworICAgICAgICAgICAgQUxPR19BU1NFUlQoKHNpemVfdCkgZnJhbWVzV3JpdHRlbiA8PSBmcmFtZUNvdW50KTsKKyAgICAgICAgICAgIHRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbiArPSBmcmFtZXNXcml0dGVuOworICAgICAgICAgICAgZHVtcFN0YXRlLT5tRnJhbWVzV3JpdHRlbiA9IHRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbjsKKyAgICAgICAgICAgIC8vaWYgKChzaXplX3QpIGZyYW1lc1dyaXR0ZW4gPT0gZnJhbWVDb3VudCkgeworICAgICAgICAgICAgLy8gICAgZGlkRnVsbFdyaXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIC8vfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gbW9ub3RvbmljIGNsb2NrIGlzIGJyb2tlbgotICAgICAgICAgICAgb2xkVHNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgc2xlZXBOcyA9IHBlcmlvZE5zOworICAgICAgICAgICAgZHVtcFN0YXRlLT5tV3JpdGVFcnJvcnMrKzsKICAgICAgICAgfQorICAgICAgICBhdHRlbXB0ZWRXcml0ZSA9IHRydWU7CisgICAgICAgIC8vIEZJWE1FIGNvdW50ICMgb2Ygd3JpdGVzIGJsb2NrZWQgZXhjZXNzaXZlbHksIENQVSB1c2FnZSwgZXRjLiBmb3IgZHVtcAogCi0KLSAgICB9ICAgLy8gZm9yICg7OykKLQotICAgIC8vIG5ldmVyIHJldHVybiAndHJ1ZSc7IFRocmVhZDo6X3RocmVhZExvb3AoKSBsb2NrcyBtdXRleCB3aGljaCBjYW4gcmVzdWx0IGluIHByaW9yaXR5IGludmVyc2lvbgorICAgICAgICB0aW1lc3RhbXBTdGF0dXMgPSBvdXRwdXRTaW5rLT5nZXRUaW1lc3RhbXAodGltZXN0YW1wKTsKKyAgICAgICAgaWYgKHRpbWVzdGFtcFN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgdWludDMyX3QgdG90YWxOYXRpdmVGcmFtZXNQcmVzZW50ZWQgPSB0aW1lc3RhbXAubVBvc2l0aW9uOworICAgICAgICAgICAgaWYgKHRvdGFsTmF0aXZlRnJhbWVzUHJlc2VudGVkIDw9IHRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbikgeworICAgICAgICAgICAgICAgIG5hdGl2ZUZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQgPQorICAgICAgICAgICAgICAgICAgICB0b3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW4gLSB0b3RhbE5hdGl2ZUZyYW1lc1ByZXNlbnRlZDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gSEFMIHJlcG9ydGVkIHRoYXQgbW9yZSBmcmFtZXMgd2VyZSBwcmVzZW50ZWQgdGhhbiB3ZXJlIHdyaXR0ZW4KKyAgICAgICAgICAgICAgICB0aW1lc3RhbXBTdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIH0KIAogRmFzdE1peGVyRHVtcFN0YXRlOjpGYXN0TWl4ZXJEdW1wU3RhdGUoCiAjaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCiAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nTgogI2VuZGlmCi0gICAgICAgICkgOgotICAgIG1Db21tYW5kKEZhc3RNaXhlclN0YXRlOjpJTklUSUFMKSwgbVdyaXRlU2VxdWVuY2UoMCksIG1GcmFtZXNXcml0dGVuKDApLAotICAgIG1OdW1UcmFja3MoMCksIG1Xcml0ZUVycm9ycygwKSwgbVVuZGVycnVucygwKSwgbU92ZXJydW5zKDApLAotICAgIG1TYW1wbGVSYXRlKDApLCBtRnJhbWVDb3VudCgwKSwgLyogbU1lYXN1cmVkV2FybXVwVHMoezAsIDB9KSwgKi8gbVdhcm11cEN5Y2xlcygwKSwKKyAgICAgICAgKSA6IEZhc3RUaHJlYWREdW1wU3RhdGUoKSwKKyAgICBtV3JpdGVTZXF1ZW5jZSgwKSwgbUZyYW1lc1dyaXR0ZW4oMCksCisgICAgbU51bVRyYWNrcygwKSwgbVdyaXRlRXJyb3JzKDApLAorICAgIG1TYW1wbGVSYXRlKDApLCBtRnJhbWVDb3VudCgwKSwKICAgICBtVHJhY2tNYXNrKDApCi0jaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCi0gICAgLCBtU2FtcGxpbmdOKDApLCBtQm91bmRzKDApCi0jZW5kaWYKIHsKLSAgICBtTWVhc3VyZWRXYXJtdXBUcy50dl9zZWMgPSAwOwotICAgIG1NZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgPSAwOwogI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUwogICAgIGluY3JlYXNlU2FtcGxpbmdOKHNhbXBsaW5nTik7CiAjZW5kaWYKQEAgLTcxNCw3ICs1MTAsNyBAQAogdm9pZCBGYXN0TWl4ZXJEdW1wU3RhdGU6OmR1bXAoaW50IGZkKSBjb25zdAogewogICAgIGlmIChtQ29tbWFuZCA9PSBGYXN0TWl4ZXJTdGF0ZTo6SU5JVElBTCkgewotICAgICAgICBmZHByaW50ZihmZCwgIkZhc3RNaXhlciBub3QgaW5pdGlhbGl6ZWRcbiIpOworICAgICAgICBkcHJpbnRmKGZkLCAiICBGYXN0TWl4ZXIgbm90IGluaXRpYWxpemVkXG4iKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICNkZWZpbmUgQ09NTUFORF9NQVggMzIKQEAgLTc0OCwxMCArNTQ0LDEwIEBACiAgICAgZG91YmxlIG1lYXN1cmVkV2FybXVwTXMgPSAobU1lYXN1cmVkV2FybXVwVHMudHZfc2VjICogMTAwMC4wKSArCiAgICAgICAgICAgICAobU1lYXN1cmVkV2FybXVwVHMudHZfbnNlYyAvIDEwMDAwMDAuMCk7CiAgICAgZG91YmxlIG1peFBlcmlvZFNlYyA9IChkb3VibGUpIG1GcmFtZUNvdW50IC8gKGRvdWJsZSkgbVNhbXBsZVJhdGU7Ci0gICAgZmRwcmludGYoZmQsICJGYXN0TWl4ZXIgY29tbWFuZD0lcyB3cml0ZVNlcXVlbmNlPSV1IGZyYW1lc1dyaXR0ZW49JXVcbiIKLSAgICAgICAgICAgICAgICAgIiAgICAgICAgICBudW1UcmFja3M9JXUgd3JpdGVFcnJvcnM9JXUgdW5kZXJydW5zPSV1IG92ZXJydW5zPSV1XG4iCi0gICAgICAgICAgICAgICAgICIgICAgICAgICAgc2FtcGxlUmF0ZT0ldSBmcmFtZUNvdW50PSV1IG1lYXN1cmVkV2FybXVwPSUuM2cgbXMsIHdhcm11cEN5Y2xlcz0ldVxuIgotICAgICAgICAgICAgICAgICAiICAgICAgICAgIG1peFBlcmlvZD0lLjJmIG1zXG4iLAorICAgIGRwcmludGYoZmQsICIgIEZhc3RNaXhlciBjb21tYW5kPSVzIHdyaXRlU2VxdWVuY2U9JXUgZnJhbWVzV3JpdHRlbj0ldVxuIgorICAgICAgICAgICAgICAgICIgICAgICAgICAgICBudW1UcmFja3M9JXUgd3JpdGVFcnJvcnM9JXUgdW5kZXJydW5zPSV1IG92ZXJydW5zPSV1XG4iCisgICAgICAgICAgICAgICAgIiAgICAgICAgICAgIHNhbXBsZVJhdGU9JXUgZnJhbWVDb3VudD0lenUgbWVhc3VyZWRXYXJtdXA9JS4zZyBtcywgd2FybXVwQ3ljbGVzPSV1XG4iCisgICAgICAgICAgICAgICAgIiAgICAgICAgICAgIG1peFBlcmlvZD0lLjJmIG1zXG4iLAogICAgICAgICAgICAgICAgICBzdHJpbmcsIG1Xcml0ZVNlcXVlbmNlLCBtRnJhbWVzV3JpdHRlbiwKICAgICAgICAgICAgICAgICAgbU51bVRyYWNrcywgbVdyaXRlRXJyb3JzLCBtVW5kZXJydW5zLCBtT3ZlcnJ1bnMsCiAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBtRnJhbWVDb3VudCwgbWVhc3VyZWRXYXJtdXBNcywgbVdhcm11cEN5Y2xlcywKQEAgLTgwMiwyMSArNTk4LDI3IEBACiAgICAgICAgIHByZXZpb3VzQ3B1a0h6ID0gc2FtcGxlQ3B1a0h6OwogI2VuZGlmCiAgICAgfQotICAgIGZkcHJpbnRmKGZkLCAiU2ltcGxlIG1vdmluZyBzdGF0aXN0aWNzIG92ZXIgbGFzdCAlLjFmIHNlY29uZHM6XG4iLCB3YWxsLm4oKSAqIG1peFBlcmlvZFNlYyk7Ci0gICAgZmRwcmludGYoZmQsICIgIHdhbGwgY2xvY2sgdGltZSBpbiBtcyBwZXIgbWl4IGN5Y2xlOlxuIgotICAgICAgICAgICAgICAgICAiICAgIG1lYW49JS4yZiBtaW49JS4yZiBtYXg9JS4yZiBzdGRkZXY9JS4yZlxuIiwKLSAgICAgICAgICAgICAgICAgd2FsbC5tZWFuKCkqMWUtNiwgd2FsbC5taW5pbXVtKCkqMWUtNiwgd2FsbC5tYXhpbXVtKCkqMWUtNiwgd2FsbC5zdGRkZXYoKSoxZS02KTsKLSAgICBmZHByaW50ZihmZCwgIiAgcmF3IENQVSBsb2FkIGluIHVzIHBlciBtaXggY3ljbGU6XG4iCi0gICAgICAgICAgICAgICAgICIgICAgbWVhbj0lLjBmIG1pbj0lLjBmIG1heD0lLjBmIHN0ZGRldj0lLjBmXG4iLAotICAgICAgICAgICAgICAgICBsb2FkTnMubWVhbigpKjFlLTMsIGxvYWROcy5taW5pbXVtKCkqMWUtMywgbG9hZE5zLm1heGltdW0oKSoxZS0zLAotICAgICAgICAgICAgICAgICBsb2FkTnMuc3RkZGV2KCkqMWUtMyk7CisgICAgaWYgKG4pIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgU2ltcGxlIG1vdmluZyBzdGF0aXN0aWNzIG92ZXIgbGFzdCAlLjFmIHNlY29uZHM6XG4iLAorICAgICAgICAgICAgICAgICAgICB3YWxsLm4oKSAqIG1peFBlcmlvZFNlYyk7CisgICAgICAgIGRwcmludGYoZmQsICIgICAgd2FsbCBjbG9jayB0aW1lIGluIG1zIHBlciBtaXggY3ljbGU6XG4iCisgICAgICAgICAgICAgICAgICAgICIgICAgICBtZWFuPSUuMmYgbWluPSUuMmYgbWF4PSUuMmYgc3RkZGV2PSUuMmZcbiIsCisgICAgICAgICAgICAgICAgICAgIHdhbGwubWVhbigpKjFlLTYsIHdhbGwubWluaW11bSgpKjFlLTYsIHdhbGwubWF4aW11bSgpKjFlLTYsCisgICAgICAgICAgICAgICAgICAgIHdhbGwuc3RkZGV2KCkqMWUtNik7CisgICAgICAgIGRwcmludGYoZmQsICIgICAgcmF3IENQVSBsb2FkIGluIHVzIHBlciBtaXggY3ljbGU6XG4iCisgICAgICAgICAgICAgICAgICAgICIgICAgICBtZWFuPSUuMGYgbWluPSUuMGYgbWF4PSUuMGYgc3RkZGV2PSUuMGZcbiIsCisgICAgICAgICAgICAgICAgICAgIGxvYWROcy5tZWFuKCkqMWUtMywgbG9hZE5zLm1pbmltdW0oKSoxZS0zLCBsb2FkTnMubWF4aW11bSgpKjFlLTMsCisgICAgICAgICAgICAgICAgICAgIGxvYWROcy5zdGRkZXYoKSoxZS0zKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkcHJpbnRmKGZkLCAiICBObyBGYXN0TWl4ZXIgc3RhdGlzdGljcyBhdmFpbGFibGUgY3VycmVudGx5XG4iKTsKKyAgICB9CiAjaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCi0gICAgZmRwcmludGYoZmQsICIgIENQVSBjbG9jayBmcmVxdWVuY3kgaW4gTUh6OlxuIgotICAgICAgICAgICAgICAgICAiICAgIG1lYW49JS4wZiBtaW49JS4wZiBtYXg9JS4wZiBzdGRkZXY9JS4wZlxuIiwKLSAgICAgICAgICAgICAgICAga0h6Lm1lYW4oKSoxZS0zLCBrSHoubWluaW11bSgpKjFlLTMsIGtIei5tYXhpbXVtKCkqMWUtMywga0h6LnN0ZGRldigpKjFlLTMpOwotICAgIGZkcHJpbnRmKGZkLCAiICBhZGp1c3RlZCBDUFUgbG9hZCBpbiBNSHogKGkuZS4gbm9ybWFsaXplZCBmb3IgQ1BVIGNsb2NrIGZyZXF1ZW5jeSk6XG4iCi0gICAgICAgICAgICAgICAgICIgICAgbWVhbj0lLjFmIG1pbj0lLjFmIG1heD0lLjFmIHN0ZGRldj0lLjFmXG4iLAotICAgICAgICAgICAgICAgICBsb2FkTUh6Lm1lYW4oKSwgbG9hZE1Iei5taW5pbXVtKCksIGxvYWRNSHoubWF4aW11bSgpLCBsb2FkTUh6LnN0ZGRldigpKTsKKyAgICBkcHJpbnRmKGZkLCAiICBDUFUgY2xvY2sgZnJlcXVlbmN5IGluIE1IejpcbiIKKyAgICAgICAgICAgICAgICAiICAgIG1lYW49JS4wZiBtaW49JS4wZiBtYXg9JS4wZiBzdGRkZXY9JS4wZlxuIiwKKyAgICAgICAgICAgICAgICBrSHoubWVhbigpKjFlLTMsIGtIei5taW5pbXVtKCkqMWUtMywga0h6Lm1heGltdW0oKSoxZS0zLCBrSHouc3RkZGV2KCkqMWUtMyk7CisgICAgZHByaW50ZihmZCwgIiAgYWRqdXN0ZWQgQ1BVIGxvYWQgaW4gTUh6IChpLmUuIG5vcm1hbGl6ZWQgZm9yIENQVSBjbG9jayBmcmVxdWVuY3kpOlxuIgorICAgICAgICAgICAgICAgICIgICAgbWVhbj0lLjFmIG1pbj0lLjFmIG1heD0lLjFmIHN0ZGRldj0lLjFmXG4iLAorICAgICAgICAgICAgICAgIGxvYWRNSHoubWVhbigpLCBsb2FkTUh6Lm1pbmltdW0oKSwgbG9hZE1Iei5tYXhpbXVtKCksIGxvYWRNSHouc3RkZGV2KCkpOwogI2VuZGlmCiAgICAgaWYgKHRhaWwgIT0gTlVMTCkgewogICAgICAgICBxc29ydCh0YWlsLCBuLCBzaXplb2YodWludDMyX3QpLCBjb21wYXJlX3VpbnQzMl90KTsKQEAgLTgyNywxMiArNjI5LDEyIEBACiAgICAgICAgICAgICBsZWZ0LnNhbXBsZSh0YWlsW2ldKTsKICAgICAgICAgICAgIHJpZ2h0LnNhbXBsZSh0YWlsW24gLSAoaSArIDEpXSk7CiAgICAgICAgIH0KLSAgICAgICAgZmRwcmludGYoZmQsICJEaXN0cmlidXRpb24gb2YgbWl4IGN5Y2xlIHRpbWVzIGluIG1zIGZvciB0aGUgdGFpbHMgKD4gfjMgc3RkZGV2IG91dGxpZXJzKTpcbiIKLSAgICAgICAgICAgICAgICAgICAgICIgIGxlZnQgdGFpbDogbWVhbj0lLjJmIG1pbj0lLjJmIG1heD0lLjJmIHN0ZGRldj0lLjJmXG4iCi0gICAgICAgICAgICAgICAgICAgICAiICByaWdodCB0YWlsOiBtZWFuPSUuMmYgbWluPSUuMmYgbWF4PSUuMmYgc3RkZGV2PSUuMmZcbiIsCi0gICAgICAgICAgICAgICAgICAgICBsZWZ0Lm1lYW4oKSoxZS02LCBsZWZ0Lm1pbmltdW0oKSoxZS02LCBsZWZ0Lm1heGltdW0oKSoxZS02LCBsZWZ0LnN0ZGRldigpKjFlLTYsCi0gICAgICAgICAgICAgICAgICAgICByaWdodC5tZWFuKCkqMWUtNiwgcmlnaHQubWluaW11bSgpKjFlLTYsIHJpZ2h0Lm1heGltdW0oKSoxZS02LAotICAgICAgICAgICAgICAgICAgICAgcmlnaHQuc3RkZGV2KCkqMWUtNik7CisgICAgICAgIGRwcmludGYoZmQsICIgIERpc3RyaWJ1dGlvbiBvZiBtaXggY3ljbGUgdGltZXMgaW4gbXMgZm9yIHRoZSB0YWlscyAoPiB+MyBzdGRkZXYgb3V0bGllcnMpOlxuIgorICAgICAgICAgICAgICAgICAgICAiICAgIGxlZnQgdGFpbDogbWVhbj0lLjJmIG1pbj0lLjJmIG1heD0lLjJmIHN0ZGRldj0lLjJmXG4iCisgICAgICAgICAgICAgICAgICAgICIgICAgcmlnaHQgdGFpbDogbWVhbj0lLjJmIG1pbj0lLjJmIG1heD0lLjJmIHN0ZGRldj0lLjJmXG4iLAorICAgICAgICAgICAgICAgICAgICBsZWZ0Lm1lYW4oKSoxZS02LCBsZWZ0Lm1pbmltdW0oKSoxZS02LCBsZWZ0Lm1heGltdW0oKSoxZS02LCBsZWZ0LnN0ZGRldigpKjFlLTYsCisgICAgICAgICAgICAgICAgICAgIHJpZ2h0Lm1lYW4oKSoxZS02LCByaWdodC5taW5pbXVtKCkqMWUtNiwgcmlnaHQubWF4aW11bSgpKjFlLTYsCisgICAgICAgICAgICAgICAgICAgIHJpZ2h0LnN0ZGRldigpKjFlLTYpOwogICAgICAgICBkZWxldGVbXSB0YWlsOwogICAgIH0KICNlbmRpZgpAQCAtODQyLDkgKzY0NCw5IEBACiAgICAgLy8gSW5zdGVhZCB3ZSBhbHdheXMgZGlzcGxheSBhbGwgdHJhY2tzLCB3aXRoIGFuIGluZGljYXRpb24KICAgICAvLyBvZiB3aGV0aGVyIHdlIHRoaW5rIHRoZSB0cmFjayBpcyBhY3RpdmUuCiAgICAgdWludDMyX3QgdHJhY2tNYXNrID0gbVRyYWNrTWFzazsKLSAgICBmZHByaW50ZihmZCwgIkZhc3QgdHJhY2tzOiBrTWF4RmFzdFRyYWNrcz0ldSBhY3RpdmVNYXNrPSUjeFxuIiwKKyAgICBkcHJpbnRmKGZkLCAiICBGYXN0IHRyYWNrczoga01heEZhc3RUcmFja3M9JXUgYWN0aXZlTWFzaz0lI3hcbiIsCiAgICAgICAgICAgICBGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3MsIHRyYWNrTWFzayk7Ci0gICAgZmRwcmludGYoZmQsICJJbmRleCBBY3RpdmUgRnVsbCBQYXJ0aWFsIEVtcHR5ICBSZWNlbnQgUmVhZHlcbiIpOworICAgIGRwcmludGYoZmQsICIgIEluZGV4IEFjdGl2ZSBGdWxsIFBhcnRpYWwgRW1wdHkgIFJlY2VudCBSZWFkeVxuIik7CiAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IEZhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrczsgKytpLCB0cmFja01hc2sgPj49IDEpIHsKICAgICAgICAgYm9vbCBpc0FjdGl2ZSA9IHRyYWNrTWFzayAmIDE7CiAgICAgICAgIGNvbnN0IEZhc3RUcmFja0R1bXAgKmZ0RHVtcCA9ICZtVHJhY2tzW2ldOwpAQCAtODY0LDcgKzY2Niw3IEBACiAgICAgICAgICAgICBtb3N0UmVjZW50ID0gIj8iOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgZmRwcmludGYoZmQsICIlNXUgJTZzICU0dSAlN3UgJTV1ICU3cyAlNXVcbiIsIGksIGlzQWN0aXZlID8gInllcyIgOiAibm8iLAorICAgICAgICBkcHJpbnRmKGZkLCAiICAlNXUgJTZzICU0dSAlN3UgJTV1ICU3cyAlNXp1XG4iLCBpLCBpc0FjdGl2ZSA/ICJ5ZXMiIDogIm5vIiwKICAgICAgICAgICAgICAgICAodW5kZXJydW5zLm1CaXRGaWVsZHMubUZ1bGwpICYgVU5ERVJSVU5fTUFTSywKICAgICAgICAgICAgICAgICAodW5kZXJydW5zLm1CaXRGaWVsZHMubVBhcnRpYWwpICYgVU5ERVJSVU5fTUFTSywKICAgICAgICAgICAgICAgICAodW5kZXJydW5zLm1CaXRGaWVsZHMubUVtcHR5KSAmIFVOREVSUlVOX01BU0ssCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmgKaW5kZXggNjE1ODkyNS4uZmRlOGMyYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuaApAQCAtMTcsMTI0ICsxNyw3NCBAQAogI2lmbmRlZiBBTkRST0lEX0FVRElPX0ZBU1RfTUlYRVJfSAogI2RlZmluZSBBTkRST0lEX0FVRElPX0ZBU1RfTUlYRVJfSAogCisjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgogI2luY2x1ZGUgPHV0aWxzL0RlYnVnLmg+CisjaW5jbHVkZSAiRmFzdFRocmVhZC5oIgogI2luY2x1ZGUgPHV0aWxzL1RocmVhZC5oPgotZXh0ZXJuICJDIiB7Ci0jaW5jbHVkZSAiLi4vcHJpdmF0ZS9iaW9uaWNfZnV0ZXguaCIKLX0KICNpbmNsdWRlICJTdGF0ZVF1ZXVlLmgiCiAjaW5jbHVkZSAiRmFzdE1peGVyU3RhdGUuaCIKKyNpbmNsdWRlICJGYXN0TWl4ZXJEdW1wU3RhdGUuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitjbGFzcyBBdWRpb01peGVyOworCiB0eXBlZGVmIFN0YXRlUXVldWU8RmFzdE1peGVyU3RhdGU+IEZhc3RNaXhlclN0YXRlUXVldWU7CiAKLWNsYXNzIEZhc3RNaXhlciA6IHB1YmxpYyBUaHJlYWQgeworY2xhc3MgRmFzdE1peGVyIDogcHVibGljIEZhc3RUaHJlYWQgewogCiBwdWJsaWM6Ci0gICAgICAgICAgICBGYXN0TWl4ZXIoKSA6IFRocmVhZChmYWxzZSAvKmNhbkNhbGxKYXZhKi8pIHsgfQotICAgIHZpcnR1YWwgfkZhc3RNaXhlcigpIHsgfQorICAgICAgICAgICAgRmFzdE1peGVyKCk7CisgICAgdmlydHVhbCB+RmFzdE1peGVyKCk7CiAKLSAgICAgICAgICAgIEZhc3RNaXhlclN0YXRlUXVldWUqIHNxKCkgeyByZXR1cm4gJm1TUTsgfQorICAgICAgICAgICAgRmFzdE1peGVyU3RhdGVRdWV1ZSogc3EoKTsKIAogcHJpdmF0ZToKLSAgICB2aXJ0dWFsIGJvb2wgICAgICAgICAgICAgICAgdGhyZWFkTG9vcCgpOwogICAgICAgICAgICAgRmFzdE1peGVyU3RhdGVRdWV1ZSBtU1E7CiAKKyAgICAvLyBjYWxsb3V0cworICAgIHZpcnR1YWwgY29uc3QgRmFzdFRocmVhZFN0YXRlICpwb2xsKCk7CisgICAgdmlydHVhbCB2b2lkIHNldExvZyhOQkxvZzo6V3JpdGVyICpsb2dXcml0ZXIpOworICAgIHZpcnR1YWwgdm9pZCBvbklkbGUoKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25FeGl0KCk7CisgICAgdmlydHVhbCBib29sIGlzU3ViQ2xhc3NDb21tYW5kKEZhc3RUaHJlYWRTdGF0ZTo6Q29tbWFuZCBjb21tYW5kKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25TdGF0ZUNoYW5nZSgpOworICAgIHZpcnR1YWwgdm9pZCBvbldvcmsoKTsKKworICAgIC8vIEZJWE1FIHRoZXNlIGZvcm1lciBsb2NhbCB2YXJpYWJsZXMgbmVlZCBjb21tZW50cyBhbmQgdG8gYmUgcmVuYW1lZCB0byBoYXZlICJtIiBwcmVmaXgKKyAgICBzdGF0aWMgY29uc3QgRmFzdE1peGVyU3RhdGUgaW5pdGlhbDsKKyAgICBGYXN0TWl4ZXJTdGF0ZSBwcmVJZGxlOyAvLyBjb3B5IG9mIHN0YXRlIGJlZm9yZSB3ZSB3ZW50IGludG8gaWRsZQorICAgIGxvbmcgc2xvcE5zOyAgICAgICAgLy8gYWNjdW11bGF0ZWQgdGltZSB3ZSd2ZSB3b2tlbiB1cCB0b28gZWFybHkgKD4gMCkgb3IgdG9vIGxhdGUgKDwgMCkKKyAgICBpbnQgZmFzdFRyYWNrTmFtZXNbRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzXTsgLy8gaGFuZGxlcyB1c2VkIGJ5IG1peGVyIHRvIGlkZW50aWZ5IHRyYWNrcworICAgIGludCBnZW5lcmF0aW9uc1tGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3NdOyAgICAvLyBsYXN0IG9ic2VydmVkIG1GYXN0VHJhY2tzW2ldLm1HZW5lcmF0aW9uCisgICAgTkJBSU9fU2luayAqb3V0cHV0U2luazsKKyAgICBpbnQgb3V0cHV0U2lua0dlbjsKKyAgICBBdWRpb01peGVyKiBtaXhlcjsKKworICAgIC8vIG1TaW5rQnVmZmVyIGF1ZGlvIGZvcm1hdCBpcyBzdG9yZWQgaW4gZm9ybWF0Lm1Gb3JtYXQuCisgICAgdm9pZCogbVNpbmtCdWZmZXI7ICAgICAgICAgICAgICAgICAgLy8gdXNlZCBmb3IgbWl4ZXIgb3V0cHV0IGZvcm1hdCB0cmFuc2xhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHNpbmsgZm9ybWF0IGlzIGRpZmZlcmVudCB0aGFuIG1peGVyIG91dHB1dC4KKyAgICBzaXplX3QgbVNpbmtCdWZmZXJTaXplOworICAgIHVpbnQzMl90IG1TaW5rQ2hhbm5lbENvdW50OworICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1TaW5rQ2hhbm5lbE1hc2s7CisgICAgdm9pZCogbU1peGVyQnVmZmVyOyAgICAgICAgICAgICAgICAgLy8gbWl4ZXIgb3V0cHV0IGJ1ZmZlci4KKyAgICBzaXplX3QgbU1peGVyQnVmZmVyU2l6ZTsKKyAgICBhdWRpb19mb3JtYXRfdCBtTWl4ZXJCdWZmZXJGb3JtYXQ7ICAvLyBtaXhlciBvdXRwdXQgZm9ybWF0OiBBVURJT19GT1JNQVRfUENNXygxNl9CSVR8RkxPQVQpLgorCisgICAgZW51bSB7VU5ERUZJTkVELCBNSVhFRCwgWkVST0VEfSBtTWl4ZXJCdWZmZXJTdGF0ZTsKKyAgICBOQkFJT19Gb3JtYXQgZm9ybWF0OworICAgIHVuc2lnbmVkIHNhbXBsZVJhdGU7CisgICAgaW50IGZhc3RUcmFja3NHZW47CisgICAgRmFzdE1peGVyRHVtcFN0YXRlIGR1bW15RHVtcFN0YXRlOworICAgIHVpbnQzMl90IHRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbjsgIC8vIGNvcGllZCB0byBkdW1wU3RhdGUtPm1GcmFtZXNXcml0dGVuCisKKyAgICAvLyBuZXh0IDIgZmllbGRzIGFyZSB2YWxpZCBvbmx5IHdoZW4gdGltZXN0YW1wU3RhdHVzID09IE5PX0VSUk9SCisgICAgQXVkaW9UaW1lc3RhbXAgdGltZXN0YW1wOworICAgIHVpbnQzMl90IG5hdGl2ZUZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQ7CisKIH07ICAvLyBjbGFzcyBGYXN0TWl4ZXIKIAotLy8gRGVzY3JpYmVzIHRoZSB1bmRlcnJ1biBzdGF0dXMgZm9yIGEgc2luZ2xlICJwdWxsIiBhdHRlbXB0Ci1lbnVtIEZhc3RUcmFja1VuZGVycnVuU3RhdHVzIHsKLSAgICBVTkRFUlJVTl9GVUxMLCAgICAgIC8vIGZyYW1lc1JlYWR5KCkgaXMgZnVsbCBmcmFtZSBjb3VudCwgbm8gdW5kZXJydW4KLSAgICBVTkRFUlJVTl9QQVJUSUFMLCAgIC8vIGZyYW1lc1JlYWR5KCkgaXMgbm9uLXplcm8gYnV0IDwgZnVsbCBmcmFtZSBjb3VudCwgcGFydGlhbCB1bmRlcnJ1bgotICAgIFVOREVSUlVOX0VNUFRZLCAgICAgLy8gZnJhbWVzUmVhZHkoKSBpcyB6ZXJvLCB0b3RhbCB1bmRlcnJ1bgotfTsKLQotLy8gVW5kZXJydW4gY291bnRlcnMgYXJlIG5vdCByZXNldCB0byB6ZXJvIGZvciBuZXcgdHJhY2tzIG9yIGlmIHRyYWNrIGdlbmVyYXRpb24gY2hhbmdlcy4KLS8vIFRoaXMgcGFja2VkIHJlcHJlc2VudGF0aW9uIGlzIHVzZWQgdG8ga2VlcCB0aGUgaW5mb3JtYXRpb24gYXRvbWljLgotdW5pb24gRmFzdFRyYWNrVW5kZXJydW5zIHsKLSAgICBGYXN0VHJhY2tVbmRlcnJ1bnMoKSB7IG1BdG9taWMgPSAwOwotICAgICAgICAgICAgQ09NUElMRV9USU1FX0FTU0VSVF9GVU5DVElPTl9TQ09QRShzaXplb2YoRmFzdFRyYWNrVW5kZXJydW5zKSA9PSBzaXplb2YodWludDMyX3QpKTsgfQotICAgIEZhc3RUcmFja1VuZGVycnVucyhjb25zdCBGYXN0VHJhY2tVbmRlcnJ1bnMmIGNvcHlGcm9tKSA6IG1BdG9taWMoY29weUZyb20ubUF0b21pYykgeyB9Ci0gICAgRmFzdFRyYWNrVW5kZXJydW5zJiBvcGVyYXRvcj0oY29uc3QgRmFzdFRyYWNrVW5kZXJydW5zJiByaHMpCi0gICAgICAgICAgICB7IGlmICh0aGlzICE9ICZyaHMpIG1BdG9taWMgPSByaHMubUF0b21pYzsgcmV0dXJuICp0aGlzOyB9Ci0gICAgc3RydWN0IHsKLSNkZWZpbmUgVU5ERVJSVU5fQklUUyAxMAotI2RlZmluZSBVTkRFUlJVTl9NQVNLICgoMSA8PCBVTkRFUlJVTl9CSVRTKSAtIDEpCi0gICAgICAgIHVpbnQzMl90IG1GdWxsICAgIDogVU5ERVJSVU5fQklUUzsgLy8gZnJhbWVzUmVhZHkoKSBpcyBmdWxsIGZyYW1lIGNvdW50Ci0gICAgICAgIHVpbnQzMl90IG1QYXJ0aWFsIDogVU5ERVJSVU5fQklUUzsgLy8gZnJhbWVzUmVhZHkoKSBpcyBub24temVybyBidXQgPCBmdWxsIGZyYW1lIGNvdW50Ci0gICAgICAgIHVpbnQzMl90IG1FbXB0eSAgIDogVU5ERVJSVU5fQklUUzsgLy8gZnJhbWVzUmVhZHkoKSBpcyB6ZXJvCi0gICAgICAgIEZhc3RUcmFja1VuZGVycnVuU3RhdHVzIG1Nb3N0UmVjZW50IDogMjsgICAgLy8gc3RhdHVzIG9mIG1vc3QgcmVjZW50IGZyYW1lc1JlYWR5KCkKLSAgICB9ICAgICAgICBtQml0RmllbGRzOwotcHJpdmF0ZToKLSAgICB1aW50MzJfdCBtQXRvbWljOwotfTsKLQotLy8gUmVwcmVzZW50cyB0aGUgZHVtcCBzdGF0ZSBvZiBhIGZhc3QgdHJhY2sKLXN0cnVjdCBGYXN0VHJhY2tEdW1wIHsKLSAgICBGYXN0VHJhY2tEdW1wKCkgOiBtRnJhbWVzUmVhZHkoMCkgeyB9Ci0gICAgLyp2aXJ0dWFsKi8gfkZhc3RUcmFja0R1bXAoKSB7IH0KLSAgICBGYXN0VHJhY2tVbmRlcnJ1bnMgbVVuZGVycnVuczsKLSAgICBzaXplX3QgbUZyYW1lc1JlYWR5OyAgICAgICAgLy8gbW9zdCByZWNlbnQgdmFsdWUgb25seTsgbm8gbG9uZy10ZXJtIHN0YXRpc3RpY3Mga2VwdAotfTsKLQotLy8gVGhlIEZhc3RNaXhlckR1bXBTdGF0ZSBrZWVwcyBhIGNhY2hlIG9mIEZhc3RNaXhlciBzdGF0aXN0aWNzIHRoYXQgY2FuIGJlIGxvZ2dlZCBieSBkdW1wc3lzLgotLy8gRWFjaCBpbmRpdmlkdWFsIG5hdGl2ZSB3b3JkLXNpemVkIGZpZWxkIGlzIGFjY2Vzc2VkIGF0b21pY2FsbHkuICBCdXQgdGhlCi0vLyBvdmVyYWxsIHN0cnVjdHVyZSBpcyBub24tYXRvbWljLCB0aGF0IGlzIHRoZXJlIG1heSBiZSBhbiBpbmNvbnNpc3RlbmN5IGJldHdlZW4gZmllbGRzLgotLy8gTm8gYmFycmllcnMgb3IgbG9ja3MgYXJlIHVzZWQgZm9yIGVpdGhlciB3cml0aW5nIG9yIHJlYWRpbmcuCi0vLyBPbmx5IFBPRCB0eXBlcyBhcmUgcGVybWl0dGVkLCBhbmQgdGhlIGNvbnRlbnRzIHNob3VsZG4ndCBiZSB0cnVzdGVkIChpLmUuIGRvIHJhbmdlIGNoZWNrcykuCi0vLyBJdCBoYXMgYSBkaWZmZXJlbnQgbGlmZXRpbWUgdGhhbiB0aGUgRmFzdE1peGVyLCBhbmQgc28gaXQgY2FuJ3QgYmUgYSBtZW1iZXIgb2YgRmFzdE1peGVyLgotc3RydWN0IEZhc3RNaXhlckR1bXBTdGF0ZSB7Ci0gICAgRmFzdE1peGVyRHVtcFN0YXRlKAotI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUwotICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdOID0ga1NhbXBsaW5nTmZvckxvd1JhbURldmljZQotI2VuZGlmCi0gICAgICAgICAgICApOwotICAgIC8qdmlydHVhbCovIH5GYXN0TWl4ZXJEdW1wU3RhdGUoKTsKLQotICAgIHZvaWQgZHVtcChpbnQgZmQpIGNvbnN0OyAgICAvLyBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gYSBzdGFibGUgY29weSwgbm90IHRoZSBvcmlnaW5hbAotCi0gICAgRmFzdE1peGVyU3RhdGU6OkNvbW1hbmQgbUNvbW1hbmQ7ICAgLy8gY3VycmVudCBjb21tYW5kCi0gICAgdWludDMyX3QgbVdyaXRlU2VxdWVuY2U7ICAgIC8vIGluY3JlbWVudGVkIGJlZm9yZSBhbmQgYWZ0ZXIgZWFjaCB3cml0ZSgpCi0gICAgdWludDMyX3QgbUZyYW1lc1dyaXR0ZW47ICAgIC8vIHRvdGFsIG51bWJlciBvZiBmcmFtZXMgd3JpdHRlbiBzdWNjZXNzZnVsbHkKLSAgICB1aW50MzJfdCBtTnVtVHJhY2tzOyAgICAgICAgLy8gdG90YWwgbnVtYmVyIG9mIGFjdGl2ZSBmYXN0IHRyYWNrcwotICAgIHVpbnQzMl90IG1Xcml0ZUVycm9yczsgICAgICAvLyB0b3RhbCBudW1iZXIgb2Ygd3JpdGUoKSBlcnJvcnMKLSAgICB1aW50MzJfdCBtVW5kZXJydW5zOyAgICAgICAgLy8gdG90YWwgbnVtYmVyIG9mIHVuZGVycnVucwotICAgIHVpbnQzMl90IG1PdmVycnVuczsgICAgICAgICAvLyB0b3RhbCBudW1iZXIgb2Ygb3ZlcnJ1bnMKLSAgICB1aW50MzJfdCBtU2FtcGxlUmF0ZTsKLSAgICBzaXplX3QgICBtRnJhbWVDb3VudDsKLSAgICBzdHJ1Y3QgdGltZXNwZWMgbU1lYXN1cmVkV2FybXVwVHM7ICAvLyBtZWFzdXJlZCB3YXJtdXAgdGltZQotICAgIHVpbnQzMl90IG1XYXJtdXBDeWNsZXM7ICAgICAvLyBudW1iZXIgb2YgbG9vcCBjeWNsZXMgcmVxdWlyZWQgdG8gd2FybXVwCi0gICAgdWludDMyX3QgbVRyYWNrTWFzazsgICAgICAgIC8vIG1hc2sgb2YgYWN0aXZlIHRyYWNrcwotICAgIEZhc3RUcmFja0R1bXAgICBtVHJhY2tzW0Zhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrc107Ci0KLSNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKLSAgICAvLyBSZWNlbnRseSBjb2xsZWN0ZWQgc2FtcGxlcyBvZiBwZXItY3ljbGUgbW9ub3RvbmljIHRpbWUsIHRocmVhZCBDUFUgdGltZSwgYW5kIENQVSBmcmVxdWVuY3kuCi0gICAgLy8ga1NhbXBsaW5nTiBpcyBtYXggc2l6ZSBvZiBzYW1wbGluZyBmcmFtZSAoc3RhdGlzdGljcyksIGFuZCBtdXN0IGJlIGEgcG93ZXIgb2YgMiA8PSAweDgwMDAuCi0gICAgLy8gVGhlIHNhbXBsZSBhcnJheXMgYXJlIHZpcnR1YWxseSBhbGxvY2F0ZWQgYmFzZWQgb24gdGhpcyBjb21waWxlLXRpbWUgY29uc3RhbnQsCi0gICAgLy8gYnV0IGFyZSBvbmx5IGluaXRpYWxpemVkIGFuZCB1c2VkIGJhc2VkIG9uIHRoZSBydW50aW1lIHBhcmFtZXRlciBtU2FtcGxpbmdOLgotICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrU2FtcGxpbmdOID0gMHg4MDAwOwotICAgIC8vIENvbXBpbGUtdGltZSBjb25zdGFudCBmb3IgYSAibG93IFJBTSBkZXZpY2UiLCBtdXN0IGJlIGEgcG93ZXIgb2YgMiA8PSBrU2FtcGxpbmdOLgotICAgIC8vIFRoaXMgdmFsdWUgd2FzIGNob3NlbiBzdWNoIHRoYXQgZWFjaCBhcnJheSB1c2VzIDEgc21hbGwgcGFnZSAoNCBLYnl0ZXMpLgotICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrU2FtcGxpbmdOZm9yTG93UmFtRGV2aWNlID0gMHg0MDA7Ci0gICAgLy8gQ29ycmVzcG9uZGluZyBydW50aW1lIG1heGltdW0gc2l6ZSBvZiBzYW1wbGUgYXJyYXlzLCBtdXN0IGJlIGEgcG93ZXIgb2YgMiA8PSBrU2FtcGxpbmdOLgotICAgIHVpbnQzMl90IG1TYW1wbGluZ047Ci0gICAgLy8gVGhlIGJvdW5kcyBkZWZpbmUgdGhlIGludGVydmFsIG9mIHZhbGlkIHNhbXBsZXMsIGFuZCBhcmUgcmVwcmVzZW50ZWQgYXMgZm9sbG93czoKLSAgICAvLyAgICAgIG5ld2VzdCBvcGVuIChleGNsdWRlZCkgZW5kcG9pbnQgICA9IGxvd2VyIDE2IGJpdHMgb2YgYm91bmRzLCBtb2R1bG8gTgotICAgIC8vICAgICAgb2xkZXN0IGNsb3NlZCAoaW5jbHVkZWQpIGVuZHBvaW50ID0gdXBwZXIgMTYgYml0cyBvZiBib3VuZHMsIG1vZHVsbyBOCi0gICAgLy8gTnVtYmVyIG9mIHZhbGlkIHNhbXBsZXMgaXMgbmV3ZXN0IC0gb2xkZXN0LgotICAgIHVpbnQzMl90IG1Cb3VuZHM7ICAgICAgICAgICAgICAgICAgIC8vIGJvdW5kcyBmb3IgbU1vbm90b25pY05zLCBtVGhyZWFkQ3B1TnMsIGFuZCBtQ3B1a0h6Ci0gICAgLy8gVGhlIGVsZW1lbnRzIGluIHRoZSAqTnMgYXJyYXlzIGFyZSBpbiB1bml0cyBvZiBuYW5vc2Vjb25kcyA8PSAzOTk5OTk5OTk5LgotICAgIHVpbnQzMl90IG1Nb25vdG9uaWNOc1trU2FtcGxpbmdOXTsgIC8vIGRlbHRhIG1vbm90b25pYyAod2FsbCBjbG9jaykgdGltZQotICAgIHVpbnQzMl90IG1Mb2FkTnNba1NhbXBsaW5nTl07ICAgICAgIC8vIGRlbHRhIENQVSBsb2FkIGluIHRpbWUKLSNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKLSAgICB1aW50MzJfdCBtQ3B1a0h6W2tTYW1wbGluZ05dOyAgICAgICAvLyBhYnNvbHV0ZSBDUFUgY2xvY2sgZnJlcXVlbmN5IGluIGtIeiwgYml0cyAwLTMgYXJlIENQVSMKLSNlbmRpZgotICAgIC8vIEluY3JlYXNlIHNhbXBsaW5nIHdpbmRvdyBhZnRlciBjb25zdHJ1Y3Rpb24sIG11c3QgYmUgYSBwb3dlciBvZiAyIDw9IGtTYW1wbGluZ04KLSAgICB2b2lkICAgIGluY3JlYXNlU2FtcGxpbmdOKHVpbnQzMl90IHNhbXBsaW5nTik7Ci0jZW5kaWYKLX07Ci0KIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgIC8vIEFORFJPSURfQVVESU9fRkFTVF9NSVhFUl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmExZTQ2NDkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmgKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9BVURJT19GQVNUX01JWEVSX0RVTVBfU1RBVEVfSAorI2RlZmluZSBBTkRST0lEX0FVRElPX0ZBU1RfTUlYRVJfRFVNUF9TVEFURV9ICisKKyNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gRGVzY3JpYmVzIHRoZSB1bmRlcnJ1biBzdGF0dXMgZm9yIGEgc2luZ2xlICJwdWxsIiBhdHRlbXB0CitlbnVtIEZhc3RUcmFja1VuZGVycnVuU3RhdHVzIHsKKyAgICBVTkRFUlJVTl9GVUxMLCAgICAgIC8vIGZyYW1lc1JlYWR5KCkgaXMgZnVsbCBmcmFtZSBjb3VudCwgbm8gdW5kZXJydW4KKyAgICBVTkRFUlJVTl9QQVJUSUFMLCAgIC8vIGZyYW1lc1JlYWR5KCkgaXMgbm9uLXplcm8gYnV0IDwgZnVsbCBmcmFtZSBjb3VudCwgcGFydGlhbCB1bmRlcnJ1bgorICAgIFVOREVSUlVOX0VNUFRZLCAgICAgLy8gZnJhbWVzUmVhZHkoKSBpcyB6ZXJvLCB0b3RhbCB1bmRlcnJ1bgorfTsKKworLy8gVW5kZXJydW4gY291bnRlcnMgYXJlIG5vdCByZXNldCB0byB6ZXJvIGZvciBuZXcgdHJhY2tzIG9yIGlmIHRyYWNrIGdlbmVyYXRpb24gY2hhbmdlcy4KKy8vIFRoaXMgcGFja2VkIHJlcHJlc2VudGF0aW9uIGlzIHVzZWQgdG8ga2VlcCB0aGUgaW5mb3JtYXRpb24gYXRvbWljLgordW5pb24gRmFzdFRyYWNrVW5kZXJydW5zIHsKKyAgICBGYXN0VHJhY2tVbmRlcnJ1bnMoKSB7IG1BdG9taWMgPSAwOworICAgICAgICAgICAgQ09NUElMRV9USU1FX0FTU0VSVF9GVU5DVElPTl9TQ09QRShzaXplb2YoRmFzdFRyYWNrVW5kZXJydW5zKSA9PSBzaXplb2YodWludDMyX3QpKTsgfQorICAgIEZhc3RUcmFja1VuZGVycnVucyhjb25zdCBGYXN0VHJhY2tVbmRlcnJ1bnMmIGNvcHlGcm9tKSA6IG1BdG9taWMoY29weUZyb20ubUF0b21pYykgeyB9CisgICAgRmFzdFRyYWNrVW5kZXJydW5zJiBvcGVyYXRvcj0oY29uc3QgRmFzdFRyYWNrVW5kZXJydW5zJiByaHMpCisgICAgICAgICAgICB7IGlmICh0aGlzICE9ICZyaHMpIG1BdG9taWMgPSByaHMubUF0b21pYzsgcmV0dXJuICp0aGlzOyB9CisgICAgc3RydWN0IHsKKyNkZWZpbmUgVU5ERVJSVU5fQklUUyAxMAorI2RlZmluZSBVTkRFUlJVTl9NQVNLICgoMSA8PCBVTkRFUlJVTl9CSVRTKSAtIDEpCisgICAgICAgIHVpbnQzMl90IG1GdWxsICAgIDogVU5ERVJSVU5fQklUUzsgLy8gZnJhbWVzUmVhZHkoKSBpcyBmdWxsIGZyYW1lIGNvdW50CisgICAgICAgIHVpbnQzMl90IG1QYXJ0aWFsIDogVU5ERVJSVU5fQklUUzsgLy8gZnJhbWVzUmVhZHkoKSBpcyBub24temVybyBidXQgPCBmdWxsIGZyYW1lIGNvdW50CisgICAgICAgIHVpbnQzMl90IG1FbXB0eSAgIDogVU5ERVJSVU5fQklUUzsgLy8gZnJhbWVzUmVhZHkoKSBpcyB6ZXJvCisgICAgICAgIEZhc3RUcmFja1VuZGVycnVuU3RhdHVzIG1Nb3N0UmVjZW50IDogMjsgICAgLy8gc3RhdHVzIG9mIG1vc3QgcmVjZW50IGZyYW1lc1JlYWR5KCkKKyAgICB9ICAgICAgICBtQml0RmllbGRzOworcHJpdmF0ZToKKyAgICB1aW50MzJfdCBtQXRvbWljOworfTsKKworLy8gUmVwcmVzZW50cyB0aGUgZHVtcCBzdGF0ZSBvZiBhIGZhc3QgdHJhY2sKK3N0cnVjdCBGYXN0VHJhY2tEdW1wIHsKKyAgICBGYXN0VHJhY2tEdW1wKCkgOiBtRnJhbWVzUmVhZHkoMCkgeyB9CisgICAgLyp2aXJ0dWFsKi8gfkZhc3RUcmFja0R1bXAoKSB7IH0KKyAgICBGYXN0VHJhY2tVbmRlcnJ1bnMgbVVuZGVycnVuczsKKyAgICBzaXplX3QgbUZyYW1lc1JlYWR5OyAgICAgICAgLy8gbW9zdCByZWNlbnQgdmFsdWUgb25seTsgbm8gbG9uZy10ZXJtIHN0YXRpc3RpY3Mga2VwdAorfTsKKworLy8gVGhlIEZhc3RNaXhlckR1bXBTdGF0ZSBrZWVwcyBhIGNhY2hlIG9mIEZhc3RNaXhlciBzdGF0aXN0aWNzIHRoYXQgY2FuIGJlIGxvZ2dlZCBieSBkdW1wc3lzLgorLy8gRWFjaCBpbmRpdmlkdWFsIG5hdGl2ZSB3b3JkLXNpemVkIGZpZWxkIGlzIGFjY2Vzc2VkIGF0b21pY2FsbHkuICBCdXQgdGhlCisvLyBvdmVyYWxsIHN0cnVjdHVyZSBpcyBub24tYXRvbWljLCB0aGF0IGlzIHRoZXJlIG1heSBiZSBhbiBpbmNvbnNpc3RlbmN5IGJldHdlZW4gZmllbGRzLgorLy8gTm8gYmFycmllcnMgb3IgbG9ja3MgYXJlIHVzZWQgZm9yIGVpdGhlciB3cml0aW5nIG9yIHJlYWRpbmcuCisvLyBPbmx5IFBPRCB0eXBlcyBhcmUgcGVybWl0dGVkLCBhbmQgdGhlIGNvbnRlbnRzIHNob3VsZG4ndCBiZSB0cnVzdGVkIChpLmUuIGRvIHJhbmdlIGNoZWNrcykuCisvLyBJdCBoYXMgYSBkaWZmZXJlbnQgbGlmZXRpbWUgdGhhbiB0aGUgRmFzdE1peGVyLCBhbmQgc28gaXQgY2FuJ3QgYmUgYSBtZW1iZXIgb2YgRmFzdE1peGVyLgorc3RydWN0IEZhc3RNaXhlckR1bXBTdGF0ZSA6IEZhc3RUaHJlYWREdW1wU3RhdGUgeworICAgIEZhc3RNaXhlckR1bXBTdGF0ZSgKKyNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKKyAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nTiA9IGtTYW1wbGluZ05mb3JMb3dSYW1EZXZpY2UKKyNlbmRpZgorICAgICAgICAgICAgKTsKKyAgICAvKnZpcnR1YWwqLyB+RmFzdE1peGVyRHVtcFN0YXRlKCk7CisKKyAgICB2b2lkIGR1bXAoaW50IGZkKSBjb25zdDsgICAgLy8gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIGEgc3RhYmxlIGNvcHksIG5vdCB0aGUgb3JpZ2luYWwKKworICAgIHVpbnQzMl90IG1Xcml0ZVNlcXVlbmNlOyAgICAvLyBpbmNyZW1lbnRlZCBiZWZvcmUgYW5kIGFmdGVyIGVhY2ggd3JpdGUoKQorICAgIHVpbnQzMl90IG1GcmFtZXNXcml0dGVuOyAgICAvLyB0b3RhbCBudW1iZXIgb2YgZnJhbWVzIHdyaXR0ZW4gc3VjY2Vzc2Z1bGx5CisgICAgdWludDMyX3QgbU51bVRyYWNrczsgICAgICAgIC8vIHRvdGFsIG51bWJlciBvZiBhY3RpdmUgZmFzdCB0cmFja3MKKyAgICB1aW50MzJfdCBtV3JpdGVFcnJvcnM7ICAgICAgLy8gdG90YWwgbnVtYmVyIG9mIHdyaXRlKCkgZXJyb3JzCisgICAgdWludDMyX3QgbVNhbXBsZVJhdGU7CisgICAgc2l6ZV90ICAgbUZyYW1lQ291bnQ7CisgICAgdWludDMyX3QgbVRyYWNrTWFzazsgICAgICAgIC8vIG1hc2sgb2YgYWN0aXZlIHRyYWNrcworICAgIEZhc3RUcmFja0R1bXAgICBtVHJhY2tzW0Zhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrc107CisKKyNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKKyAgICAvLyBDb21waWxlLXRpbWUgY29uc3RhbnQgZm9yIGEgImxvdyBSQU0gZGV2aWNlIiwgbXVzdCBiZSBhIHBvd2VyIG9mIDIgPD0ga1NhbXBsaW5nTi4KKyAgICAvLyBUaGlzIHZhbHVlIHdhcyBjaG9zZW4gc3VjaCB0aGF0IGVhY2ggYXJyYXkgdXNlcyAxIHNtYWxsIHBhZ2UgKDQgS2J5dGVzKS4KKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga1NhbXBsaW5nTmZvckxvd1JhbURldmljZSA9IDB4NDAwOworICAgIC8vIEluY3JlYXNlIHNhbXBsaW5nIHdpbmRvdyBhZnRlciBjb25zdHJ1Y3Rpb24sIG11c3QgYmUgYSBwb3dlciBvZiAyIDw9IGtTYW1wbGluZ04KKyAgICB2b2lkICAgIGluY3JlYXNlU2FtcGxpbmdOKHVpbnQzMl90IHNhbXBsaW5nTik7CisjZW5kaWYKK307CisKK30gICAvLyBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9BVURJT19GQVNUX01JWEVSX0RVTVBfU1RBVEVfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5jcHAKaW5kZXggNzM3ZGU5Ny4uM2FhOGRhZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuY3BwCkBAIC0xNCwxNCArMTQsMTMgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCiAjaW5jbHVkZSAiRmFzdE1peGVyU3RhdGUuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBGYXN0VHJhY2s6OkZhc3RUcmFjaygpIDoKLSAgICBtQnVmZmVyUHJvdmlkZXIoTlVMTCksIG1Wb2x1bWVQcm92aWRlcihOVUxMKSwgbVNhbXBsZVJhdGUoMCksCi0gICAgbUNoYW5uZWxNYXNrKEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyksIG1HZW5lcmF0aW9uKDApCisgICAgbUJ1ZmZlclByb3ZpZGVyKE5VTEwpLCBtVm9sdW1lUHJvdmlkZXIoTlVMTCksCisgICAgbUNoYW5uZWxNYXNrKEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyksIG1Gb3JtYXQoQVVESU9fRk9STUFUX0lOVkFMSUQpLCBtR2VuZXJhdGlvbigwKQogewogfQogCkBAIC0yOSwxMCArMjgsMTAgQEAKIHsKIH0KIAotRmFzdE1peGVyU3RhdGU6OkZhc3RNaXhlclN0YXRlKCkgOgorRmFzdE1peGVyU3RhdGU6OkZhc3RNaXhlclN0YXRlKCkgOiBGYXN0VGhyZWFkU3RhdGUoKSwKKyAgICAvLyBtRmFzdFRyYWNrcwogICAgIG1GYXN0VHJhY2tzR2VuKDApLCBtVHJhY2tNYXNrKDApLCBtT3V0cHV0U2luayhOVUxMKSwgbU91dHB1dFNpbmtHZW4oMCksCi0gICAgbUZyYW1lQ291bnQoMCksIG1Db21tYW5kKElOSVRJQUwpLCBtQ29sZEZ1dGV4QWRkcihOVUxMKSwgbUNvbGRHZW4oMCksCi0gICAgbUR1bXBTdGF0ZShOVUxMKSwgbVRlZVNpbmsoTlVMTCksIG1OQkxvZ1dyaXRlcihOVUxMKQorICAgIG1GcmFtZUNvdW50KDApLCBtVGVlU2luayhOVUxMKQogewogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5oCmluZGV4IGY2ZTc5MDMuLjY2MWM5Y2EgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5oCkBAIC0xNywxMCArMTcsMTIgQEAKICNpZm5kZWYgQU5EUk9JRF9BVURJT19GQVNUX01JWEVSX1NUQVRFX0gKICNkZWZpbmUgQU5EUk9JRF9BVURJT19GQVNUX01JWEVSX1NUQVRFX0gKIAorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL21pbmlmbG9hdC5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPG1lZGlhL0V4dGVuZGVkQXVkaW9CdWZmZXJQcm92aWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CQUlPLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJMb2cuaD4KKyNpbmNsdWRlICJGYXN0VGhyZWFkU3RhdGUuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0yOCw5ICszMCw4IEBACiAKIGNsYXNzIFZvbHVtZVByb3ZpZGVyIHsKIHB1YmxpYzoKLSAgICAvLyBSZXR1cm4gdGhlIHRyYWNrIHZvbHVtZSBpbiBVNF8xMiBmb3JtYXQ6IGxlZnQgaW4gbG93ZXIgaGFsZiwgcmlnaHQgaW4gdXBwZXIgaGFsZi4gVGhlCi0gICAgLy8gcHJvdmlkZXIgaW1wbGVtZW50YXRpb24gaXMgcmVzcG9uc2libGUgZm9yIHZhbGlkYXRpbmcgdGhhdCB0aGUgcmV0dXJuIHZhbHVlIGlzIGluIHJhbmdlLgotICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0Vm9sdW1lTFIoKSA9IDA7CisgICAgLy8gVGhlIHByb3ZpZGVyIGltcGxlbWVudGF0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciB2YWxpZGF0aW5nIHRoYXQgdGhlIHJldHVybiB2YWx1ZSBpcyBpbiByYW5nZS4KKyAgICB2aXJ0dWFsIGdhaW5fbWluaWZsb2F0X3BhY2tlZF90IGdldFZvbHVtZUxSKCkgPSAwOwogcHJvdGVjdGVkOgogICAgIFZvbHVtZVByb3ZpZGVyKCkgeyB9CiAgICAgdmlydHVhbCB+Vm9sdW1lUHJvdmlkZXIoKSB7IH0KQEAgLTQzLDEzICs0NCwxMyBAQAogCiAgICAgRXh0ZW5kZWRBdWRpb0J1ZmZlclByb3ZpZGVyKiBtQnVmZmVyUHJvdmlkZXI7IC8vIG11c3QgYmUgTlVMTCBpZiBpbmFjdGl2ZSwgb3Igbm9uLU5VTEwgaWYgYWN0aXZlCiAgICAgVm9sdW1lUHJvdmlkZXIqICAgICAgICAgbVZvbHVtZVByb3ZpZGVyOyAvLyBvcHRpb25hbDsgaWYgTlVMTCB0aGVuIGZ1bGwtc2NhbGUKLSAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZTsgICAgIC8vIG9wdGlvbmFsOyBpZiB6ZXJvIHRoZW4gdXNlIG1peGVyIHNhbXBsZSByYXRlCiAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgICAgbUNoYW5uZWxNYXNrOyAgICAvLyBBVURJT19DSEFOTkVMX09VVF9NT05PIG9yIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTworICAgIGF1ZGlvX2Zvcm1hdF90ICAgICAgICAgIG1Gb3JtYXQ7ICAgICAgICAgLy8gdHJhY2sgZm9ybWF0CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbUdlbmVyYXRpb247ICAgICAvLyBpbmNyZW1lbnQgd2hlbiBhbnkgZmllbGQgaXMgYXNzaWduZWQKIH07CiAKIC8vIFJlcHJlc2VudHMgYSBzaW5nbGUgc3RhdGUgb2YgdGhlIGZhc3QgbWl4ZXIKLXN0cnVjdCBGYXN0TWl4ZXJTdGF0ZSB7CitzdHJ1Y3QgRmFzdE1peGVyU3RhdGUgOiBGYXN0VGhyZWFkU3RhdGUgewogICAgICAgICAgICAgICAgIEZhc3RNaXhlclN0YXRlKCk7CiAgICAgLyp2aXJ0dWFsKi8gfkZhc3RNaXhlclN0YXRlKCk7CiAKQEAgLTYyLDIzICs2MywxNiBAQAogICAgIE5CQUlPX1NpbmsqIG1PdXRwdXRTaW5rOyAgICAvLyBIQUwgb3V0cHV0IGRldmljZSwgbXVzdCBhbHJlYWR5IGJlIG5lZ290aWF0ZWQKICAgICBpbnQgICAgICAgICBtT3V0cHV0U2lua0dlbjsgLy8gaW5jcmVtZW50IHdoZW4gbU91dHB1dFNpbmsgaXMgYXNzaWduZWQKICAgICBzaXplX3QgICAgICBtRnJhbWVDb3VudDsgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyBwZXIgZmFzdCBtaXggYnVmZmVyCi0gICAgZW51bSBDb21tYW5kIHsKLSAgICAgICAgSU5JVElBTCA9IDAsICAgICAgICAgICAgLy8gdXNlZCBvbmx5IGZvciB0aGUgaW5pdGlhbCBzdGF0ZQotICAgICAgICBIT1RfSURMRSA9IDEsICAgICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgICAgIENPTERfSURMRSA9IDIsICAgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBmdXRleAotICAgICAgICBJRExFID0gMywgICAgICAgICAgICAgICAvLyBlaXRoZXIgSE9UX0lETEUgb3IgQ09MRF9JRExFCi0gICAgICAgIEVYSVQgPSA0LCAgICAgICAgICAgICAgIC8vIGV4aXQgZnJvbSB0aHJlYWQKKworICAgIC8vIEV4dGVuZHMgRmFzdFRocmVhZFN0YXRlOjpDb21tYW5kCisgICAgc3RhdGljIGNvbnN0IENvbW1hbmQKICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBjb21tYW5kcyBhbHNvIHByb2Nlc3MgY29uZmlndXJhdGlvbiBjaGFuZ2VzLCBhbmQgY2FuIGJlICJvciJlZDoKICAgICAgICAgTUlYID0gMHg4LCAgICAgICAgICAgICAgLy8gbWl4IHRyYWNrcwogICAgICAgICBXUklURSA9IDB4MTAsICAgICAgICAgICAvLyB3cml0ZSB0byBvdXRwdXQgc2luawotICAgICAgICBNSVhfV1JJVEUgPSAweDE4LCAgICAgICAvLyBtaXggdHJhY2tzIGFuZCB3cml0ZSB0byBvdXRwdXQgc2luawotICAgIH0gbUNvbW1hbmQ7Ci0gICAgaW50MzJfdCogICAgbUNvbGRGdXRleEFkZHI7IC8vIGZvciBDT0xEX0lETEUgb25seSwgcG9pbnRlciB0byB0aGUgYXNzb2NpYXRlZCBmdXRleAotICAgIHVuc2lnbmVkICAgIG1Db2xkR2VuOyAgICAgICAvLyBpbmNyZW1lbnQgd2hlbiBDT0xEX0lETEUgaXMgcmVxdWVzdGVkIHNvIGl0J3Mgb25seSBwZXJmb3JtZWQgb25jZQorICAgICAgICBNSVhfV1JJVEUgPSAweDE4OyAgICAgICAvLyBtaXggdHJhY2tzIGFuZCB3cml0ZSB0byBvdXRwdXQgc2luaworCiAgICAgLy8gVGhpcyBtaWdodCBiZSBhIG9uZS10aW1lIGNvbmZpZ3VyYXRpb24gcmF0aGVyIHRoYW4gcGVyLXN0YXRlCi0gICAgRmFzdE1peGVyRHVtcFN0YXRlKiBtRHVtcFN0YXRlOyAvLyBpZiBub24tTlVMTCwgdGhlbiB1cGRhdGUgZHVtcCBzdGF0ZSBwZXJpb2RpY2FsbHkKICAgICBOQkFJT19TaW5rKiBtVGVlU2luazsgICAgICAgLy8gaWYgbm9uLU5VTEwsIHRoZW4gZHVwbGljYXRlIHdyaXRlKClzIHRvIHRoaXMgbm9uLWJsb2NraW5nIHNpbmsKLSAgICBOQkxvZzo6V3JpdGVyKiBtTkJMb2dXcml0ZXI7IC8vIG5vbi1ibG9ja2luZyBsb2dnZXIKIH07ICAvLyBzdHJ1Y3QgRmFzdE1peGVyU3RhdGUKIAogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE2ZGFjZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkLmNwcApAQCAtMCwwICsxLDM0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRmFzdFRocmVhZCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQVVESU8KKworI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKKyNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+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+JiBldmVudCk7CisgICAgICAgICAgICB2b2lkICAgICAgICBjbGVhclN5bmNTdGFydEV2ZW50KCk7CiAKIHByaXZhdGU6CiAgICAgZnJpZW5kIGNsYXNzIEF1ZGlvRmxpbmdlcjsgIC8vIGZvciBtU3RhdGUKQEAgLTU5LDUgKzY1LDY0IEBACiAgICAgLy8gcmVsZWFzZUJ1ZmZlcigpIG5vdCBvdmVycmlkZGVuCiAKICAgICBib29sICAgICAgICAgICAgICAgIG1PdmVyZmxvdzsgIC8vIG92ZXJmbG93IG9uIG1vc3QgcmVjZW50IGF0dGVtcHQgdG8gZmlsbCBjbGllbnQgYnVmZmVyCi0gICAgQXVkaW9SZWNvcmRTZXJ2ZXJQcm94eSogbUF1ZGlvUmVjb3JkU2VydmVyUHJveHk7CisKKyAgICAgICAgICAgLy8gdXBkYXRlZCBieSBSZWNvcmRUaHJlYWQ6OnJlYWRJbnB1dFBhcmFtZXRlcnNfbCgpCisgICAgICAgICAgICBBdWRpb1Jlc2FtcGxlciAgICAgICAgICAgICAgICAgICAgICAqbVJlc2FtcGxlcjsKKworICAgICAgICAgICAgLy8gaW50ZXJsZWF2ZWQgc3RlcmVvIHBhaXJzIG9mIGZpeGVkLXBvaW50IFE0LjI3CisgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbVJzbXBPdXRCdWZmZXI7CisgICAgICAgICAgICAvLyBjdXJyZW50IGFsbG9jYXRlZCBmcmFtZSBjb3VudCBmb3IgdGhlIGFib3ZlLCB3aGljaCBtYXkgYmUgbGFyZ2VyIHRoYW4gbmVlZGVkCisgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUnNtcE91dEZyYW1lQ291bnQ7CisKKyAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sc21wSW5VbnJlbDsgICAvLyB1bnJlbGVhc2VkIGZyYW1lcyByZW1haW5pbmcgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vc3QgcmVjZW50IGdldE5leHRCdWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZGVidWcgb25seQorCisgICAgICAgICAgICAvLyByb2xsaW5nIGNvdW50ZXIgdGhhdCBpcyBuZXZlciBjbGVhcmVkCisgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUnNtcEluRnJvbnQ7ICAgLy8gbmV4dCBhdmFpbGFibGUgZnJhbWUKKworICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyIG1TaW5rOyAgLy8gcmVmZXJlbmNlcyBjbGllbnQncyBidWZmZXIgc2luayBpbiBzaGFyZWQgbWVtb3J5CisKKyAgICAgICAgICAgIC8vIHN5bmMgZXZlbnQgdHJpZ2dlcmluZyBhY3R1YWwgYXVkaW8gY2FwdHVyZS4gRnJhbWVzIHJlYWQgYmVmb3JlIHRoaXMgZXZlbnQgd2lsbAorICAgICAgICAgICAgLy8gYmUgZHJvcHBlZCBhbmQgdGhlcmVmb3JlIG5vdCByZWFkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKyAgICAgICAgICAgIHNwPFN5bmNFdmVudD4gICAgICAgICAgICAgICAgICAgICAgIG1TeW5jU3RhcnRFdmVudDsKKworICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGNhcHR1cmVkIGZyYW1lcyB0byBkcm9wIGFmdGVyIHRoZSBzdGFydCBzeW5jIGV2ZW50IGhhcyBiZWVuIHJlY2VpdmVkLgorICAgICAgICAgICAgLy8gd2hlbiA8IDAsIG1heGltdW0gZnJhbWVzIHRvIGRyb3AgYmVmb3JlIHN0YXJ0aW5nIGNhcHR1cmUgZXZlbiBpZiBzeW5jIGV2ZW50IGlzCisgICAgICAgICAgICAvLyBub3QgcmVjZWl2ZWQKKyAgICAgICAgICAgIHNzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXNUb0Ryb3A7CisKKyAgICAgICAgICAgIC8vIHVzZWQgYnkgcmVzYW1wbGVyIHRvIGZpbmQgc291cmNlIGZyYW1lcworICAgICAgICAgICAgUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIgKm1SZXNhbXBsZXJCdWZmZXJQcm92aWRlcjsKIH07CisKKy8vIHBsYXliYWNrIHRyYWNrLCB1c2VkIGJ5IFBhdGNoUGFuZWwKK2NsYXNzIFBhdGNoUmVjb3JkIDogdmlydHVhbCBwdWJsaWMgUmVjb3JkVHJhY2ssIHB1YmxpYyBQYXRjaFByb3h5QnVmZmVyUHJvdmlkZXIgeworcHVibGljOgorCisgICAgUGF0Y2hSZWNvcmQoUmVjb3JkVGhyZWFkICpyZWNvcmRUaHJlYWQsCisgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAorICAgICAgICAgICAgICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgZmxhZ3MpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgflBhdGNoUmVjb3JkKCk7CisKKyAgICAvLyBBdWRpb0J1ZmZlclByb3ZpZGVyIGludGVyZmFjZQorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dEJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwdHMpOworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKTsKKworICAgIC8vIFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9idGFpbkJ1ZmZlcihQcm94eTo6QnVmZmVyICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0aW1lT3V0ID0gTlVMTCk7CisgICAgdmlydHVhbCB2b2lkICAgICAgICByZWxlYXNlQnVmZmVyKFByb3h5OjpCdWZmZXIgKmJ1ZmZlcik7CisKKyAgICB2b2lkIHNldFBlZXJQcm94eShQYXRjaFByb3h5QnVmZmVyUHJvdmlkZXIgKnByb3h5KSB7IG1QZWVyUHJveHkgPSBwcm94eTsgfQorCitwcml2YXRlOgorICAgIHNwPENsaWVudFByb3h5PiAgICAgICAgICAgICBtUHJveHk7CisgICAgUGF0Y2hQcm94eUJ1ZmZlclByb3ZpZGVyKiAgIG1QZWVyUHJveHk7CisgICAgc3RydWN0IHRpbWVzcGVjICAgICAgICAgICAgIG1QZWVyVGltZW91dDsKK307ICAvLyBlbmQgb2YgUGF0Y2hSZWNvcmQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmNwcAppbmRleCAxNTI0NTVkLi44MjQ2ZmVmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuY3BwCkBAIC01OSw2ICs1OSwxMyBAQAogICAgIHJldHVybiBvazsKIH0KIAorYm9vbCBtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCkgeworICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzTW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgiYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9BVURJT19ST1VUSU5HIik7CisgICAgYm9vbCBvayA9IGNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc01vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQpOworICAgIGlmICghb2spIEFMT0dFKCJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1JPVVRJTkciKTsKKyAgICByZXR1cm4gb2s7Cit9CisKIGJvb2wgZHVtcEFsbG93ZWQoKSB7CiAgICAgLy8gZG9uJ3Qgb3B0aW1pemUgZm9yIHNhbWUgcGlkLCBzaW5jZSBtZWRpYXNlcnZlciBuZXZlciBkdW1wcyBpdHNlbGYKICAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0R1bXAoImFuZHJvaWQucGVybWlzc2lvbi5EVU1QIik7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuaAppbmRleCA1MzFiYzU2Li5kZjZmNmY0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmgKQEAgLTI0LDYgKzI0LDcgQEAKIGJvb2wgY2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZCgpOwogYm9vbCBjYXB0dXJlSG90d29yZEFsbG93ZWQoKTsKIGJvb2wgc2V0dGluZ3NBbGxvd2VkKCk7Citib29sIG1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKTsKIGJvb2wgZHVtcEFsbG93ZWQoKTsKIAogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1N0YXRlUXVldWUuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1N0YXRlUXVldWUuY3BwCmluZGV4IGMyZDNiYmQuLjQwZDdiY2QgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TdGF0ZVF1ZXVlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU3RhdGVRdWV1ZS5jcHAKQEAgLTI4LDEyICsyOCwxMiBAQAogI2lmZGVmIFNUQVRFX1FVRVVFX0RVTVAKIHZvaWQgU3RhdGVRdWV1ZU9ic2VydmVyRHVtcDo6ZHVtcChpbnQgZmQpCiB7Ci0gICAgZmRwcmludGYoZmQsICJTdGF0ZSBxdWV1ZSBvYnNlcnZlcjogc3RhdGVDaGFuZ2VzPSV1XG4iLCBtU3RhdGVDaGFuZ2VzKTsKKyAgICBkcHJpbnRmKGZkLCAiU3RhdGUgcXVldWUgb2JzZXJ2ZXI6IHN0YXRlQ2hhbmdlcz0ldVxuIiwgbVN0YXRlQ2hhbmdlcyk7CiB9CiAKIHZvaWQgU3RhdGVRdWV1ZU11dGF0b3JEdW1wOjpkdW1wKGludCBmZCkKIHsKLSAgICBmZHByaW50ZihmZCwgIlN0YXRlIHF1ZXVlIG11dGF0b3I6IHB1c2hEaXJ0eT0ldSBwdXNoQWNrPSV1IGJsb2NrZWRTZXF1ZW5jZT0ldVxuIiwKKyAgICBkcHJpbnRmKGZkLCAiU3RhdGUgcXVldWUgbXV0YXRvcjogcHVzaERpcnR5PSV1IHB1c2hBY2s9JXUgYmxvY2tlZFNlcXVlbmNlPSV1XG4iLAogICAgICAgICAgICAgbVB1c2hEaXJ0eSwgbVB1c2hBY2ssIG1CbG9ja2VkU2VxdWVuY2UpOwogfQogI2VuZGlmCkBAIC00MSwxMyArNDEsMTQgQEAKIC8vIENvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yCiAKIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IFN0YXRlUXVldWU8VD46OlN0YXRlUXVldWUoKSA6Ci0gICAgbU5leHQoTlVMTCksIG1BY2soTlVMTCksIG1DdXJyZW50KE5VTEwpLAorICAgIG1BY2soTlVMTCksIG1DdXJyZW50KE5VTEwpLAogICAgIG1NdXRhdGluZygmbVN0YXRlc1swXSksIG1FeHBlY3RpbmcoTlVMTCksCiAgICAgbUluTXV0YXRpb24oZmFsc2UpLCBtSXNEaXJ0eShmYWxzZSksIG1Jc0luaXRpYWxpemVkKGZhbHNlKQogI2lmZGVmIFNUQVRFX1FVRVVFX0RVTVAKICAgICAsIG1PYnNlcnZlckR1bXAoJm1PYnNlcnZlckR1bW15RHVtcCksIG1NdXRhdG9yRHVtcCgmbU11dGF0b3JEdW1teUR1bXApCiAjZW5kaWYKIHsKKyAgICBhdG9taWNfaW5pdCgmbU5leHQsIDApOwogfQogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBTdGF0ZVF1ZXVlPFQ+Ojp+U3RhdGVRdWV1ZSgpCkBAIC01OCw3ICs1OSw4IEBACiAKIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNvbnN0IFQqIFN0YXRlUXVldWU8VD46OnBvbGwoKQogewotICAgIGNvbnN0IFQgKm5leHQgPSAoY29uc3QgVCAqKSBhbmRyb2lkX2F0b21pY19hY3F1aXJlX2xvYWQoKHZvbGF0aWxlIGludDMyX3QgKikgJm1OZXh0KTsKKyAgICBjb25zdCBUICpuZXh0ID0gKGNvbnN0IFQgKikgYXRvbWljX2xvYWRfZXhwbGljaXQoJm1OZXh0LCBtZW1vcnlfb3JkZXJfYWNxdWlyZSk7CisKICAgICBpZiAobmV4dCAhPSBtQ3VycmVudCkgewogICAgICAgICBtQWNrID0gbmV4dDsgICAgLy8gbm8gYWRkaXRpb25hbCBiYXJyaWVyIG5lZWRlZAogICAgICAgICBtQ3VycmVudCA9IG5leHQ7CkBAIC0xNDAsNyArMTQyLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIHB1Ymxpc2gKLSAgICAgICAgYW5kcm9pZF9hdG9taWNfcmVsZWFzZV9zdG9yZSgoaW50MzJfdCkgbU11dGF0aW5nLCAodm9sYXRpbGUgaW50MzJfdCAqKSAmbU5leHQpOworICAgICAgICBhdG9taWNfc3RvcmVfZXhwbGljaXQoJm1OZXh0LCAodWludHB0cl90KW1NdXRhdGluZywgbWVtb3J5X29yZGVyX3JlbGVhc2UpOwogICAgICAgICBtRXhwZWN0aW5nID0gbU11dGF0aW5nOwogCiAgICAgICAgIC8vIGNvcHkgd2l0aCBjaXJjdWxhciB3cmFwYXJvdW5kCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU3RhdGVRdWV1ZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1N0YXRlUXVldWUuaAppbmRleCA5Y2RlNjQyLi4yN2Y2YTI4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU3RhdGVRdWV1ZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TdGF0ZVF1ZXVlLmgKQEAgLTE3LDYgKzE3LDggQEAKICNpZm5kZWYgQU5EUk9JRF9BVURJT19TVEFURV9RVUVVRV9ICiAjZGVmaW5lIEFORFJPSURfQVVESU9fU1RBVEVfUVVFVUVfSAogCisjaW5jbHVkZSA8c3RkYXRvbWljLmg+CisKIC8vIFRoZSBzdGF0ZSBxdWV1ZSB0ZW1wbGF0ZSBjbGFzcyB3YXMgb3JpZ2luYWxseSBkcml2ZW4gYnkgdGhpcyB1c2UgY2FzZSAvIHJlcXVpcmVtZW50czoKIC8vICBUaGVyZSBhcmUgdHdvIHRocmVhZHM6IGEgZmFzdCBtaXhlciwgYW5kIGEgbm9ybWFsIG1peGVyLCBhbmQgdGhleSBzaGFyZSBzdGF0ZS4KIC8vICBUaGUgaW50ZXJlc3RpbmcgcGFydCBvZiB0aGUgc2hhcmVkIHN0YXRlIGlzIGEgc2V0IG9mIGFjdGl2ZSBmYXN0IHRyYWNrcywKQEAgLTg5LDYgKzkxLDggQEAKIC8vICBhcml0aG1ldGljIG9uIHRoZSBzdGF0ZSBwb2ludGVycy4gIEhvd2V2ZXIgdG8gdGhlIG11dGF0b3IsIHRoZSBzdGF0ZSBwb2ludGVycwogLy8gIGFyZSBpbiBhIGRlZmluaXRlIGNpcmN1bGFyIG9yZGVyLgogCisjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKICNpZmRlZiBTVEFURV9RVUVVRV9EVU1QCkBAIC0xODQsNyArMTg4LDcgQEAKICAgICBUICAgICAgICAgICAgICAgICBtU3RhdGVzW2tOXTsgICAgICAvLyB3cml0dGVuIGJ5IG11dGF0b3IsIHJlYWQgYnkgb2JzZXJ2ZXIKIAogICAgIC8vICJ2b2xhdGlsZSIgaXMgbWVhbmluZ2xlc3Mgd2l0aCBTTVAsIGJ1dCBoZXJlIGl0IGluZGljYXRlcyB0aGF0IHdlJ3JlIHVzaW5nIGF0b21pYyBvcHMKLSAgICB2b2xhdGlsZSBjb25zdCBUKiBtTmV4dDsgLy8gd3JpdHRlbiBieSBtdXRhdG9yIHRvIGFkdmFuY2UgbmV4dCwgcmVhZCBieSBvYnNlcnZlcgorICAgIGF0b21pY191aW50cHRyX3QgIG1OZXh0OyAvLyB3cml0dGVuIGJ5IG11dGF0b3IgdG8gYWR2YW5jZSBuZXh0LCByZWFkIGJ5IG9ic2VydmVyCiAgICAgdm9sYXRpbGUgY29uc3QgVCogbUFjazsgIC8vIHdyaXR0ZW4gYnkgb2JzZXJ2ZXIgdG8gYWNrbm93bGVkZ2UgYWR2YW5jZSBvZiBuZXh0LCByZWFkIGJ5IG11dGF0b3IKIAogICAgIC8vIG9ubHkgdXNlZCBieSBvYnNlcnZlcgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1N0YXRlUXVldWVJbnN0YW50aWF0aW9ucy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU3RhdGVRdWV1ZUluc3RhbnRpYXRpb25zLmNwcAppbmRleCAwZDVjZDBjLi42ZjQ1MDVlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU3RhdGVRdWV1ZUluc3RhbnRpYXRpb25zLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU3RhdGVRdWV1ZUluc3RhbnRpYXRpb25zLmNwcApAQCAtMTYsMTIgKzE2LDE0IEBACiAKICNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCiAjaW5jbHVkZSAiRmFzdE1peGVyU3RhdGUuaCIKKyNpbmNsdWRlICJGYXN0Q2FwdHVyZVN0YXRlLmgiCiAjaW5jbHVkZSAiU3RhdGVRdWV1ZS5oIgogCiAvLyBGSVhNRSBoYWNrIGZvciBnY2MKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi10ZW1wbGF0ZSBjbGFzcyBTdGF0ZVF1ZXVlPEZhc3RNaXhlclN0YXRlPjsgIC8vIHR5cGVkZWYgRmFzdE1peGVyU3RhdGVRdWV1ZQordGVtcGxhdGUgY2xhc3MgU3RhdGVRdWV1ZTxGYXN0TWl4ZXJTdGF0ZT47ICAgICAgLy8gdHlwZWRlZiBGYXN0TWl4ZXJTdGF0ZVF1ZXVlCit0ZW1wbGF0ZSBjbGFzcyBTdGF0ZVF1ZXVlPEZhc3RDYXB0dXJlU3RhdGU+OyAgICAvLyB0eXBlZGVmIEZhc3RDYXB0dXJlU3RhdGVRdWV1ZQogCiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAKaW5kZXggOTk0YzdkYi4uNjNmZWVhYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcApAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+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+IDIpIHsKKyAgICAgICAgY2hhciAqc3RyID0gcy5sb2NrQnVmZmVyKGxlbik7CisgICAgICAgIHMudW5sb2NrQnVmZmVyKGxlbiAtIDIpOworICAgIH0KKyAgICByZXR1cm4gczsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmR1bXBCYXNlKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKIHsKICAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKQEAgLTQxMyw0OCArNTc3LDMyIEBACiAKICAgICBib29sIGxvY2tlZCA9IEF1ZGlvRmxpbmdlcjo6ZHVtcFRyeUxvY2sobUxvY2spOwogICAgIGlmICghbG9ja2VkKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgInRocmVhZCAlcCBtYXliZSBkZWFkIGxvY2tlZFxuIiwgdGhpcyk7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICAgICAgZHByaW50ZihmZCwgInRocmVhZCAlcCBtYXliZSBkZWFkIGxvY2tlZFxuIiwgdGhpcyk7CiAgICAgfQogCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiaW8gaGFuZGxlOiAlZFxuIiwgbUlkKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiVElEOiAlZFxuIiwgZ2V0VGlkKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJzdGFuZGJ5OiAlZFxuIiwgbVN0YW5kYnkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJTYW1wbGUgcmF0ZTogJXVcbiIsIG1TYW1wbGVSYXRlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiSEFMIGZyYW1lIGNvdW50OiAlZFxuIiwgbUZyYW1lQ291bnQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJDaGFubmVsIENvdW50OiAldVxuIiwgbUNoYW5uZWxDb3VudCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkNoYW5uZWwgTWFzazogMHglMDh4XG4iLCBtQ2hhbm5lbE1hc2spOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJGb3JtYXQ6ICVkXG4iLCBtRm9ybWF0KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiRnJhbWUgc2l6ZTogJXVcbiIsIG1GcmFtZVNpemUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuUGVuZGluZyBzZXRQYXJhbWV0ZXJzIGNvbW1hbmRzOiBcbiIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICByZXN1bHQuYXBwZW5kKCIgSW5kZXggQ29tbWFuZCIpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU5ld1BhcmFtZXRlcnMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG4gJTAyZCAgICAiLCBpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKG1OZXdQYXJhbWV0ZXJzW2ldKTsKKyAgICBkcHJpbnRmKGZkLCAiICBJL08gaGFuZGxlOiAlZFxuIiwgbUlkKTsKKyAgICBkcHJpbnRmKGZkLCAiICBUSUQ6ICVkXG4iLCBnZXRUaWQoKSk7CisgICAgZHByaW50ZihmZCwgIiAgU3RhbmRieTogJXNcbiIsIG1TdGFuZGJ5ID8gInllcyIgOiAibm8iKTsKKyAgICBkcHJpbnRmKGZkLCAiICBTYW1wbGUgcmF0ZTogJXVcbiIsIG1TYW1wbGVSYXRlKTsKKyAgICBkcHJpbnRmKGZkLCAiICBIQUwgZnJhbWUgY291bnQ6ICV6dVxuIiwgbUZyYW1lQ291bnQpOworICAgIGRwcmludGYoZmQsICIgIEhBTCBidWZmZXIgc2l6ZTogJXUgYnl0ZXNcbiIsIG1CdWZmZXJTaXplKTsKKyAgICBkcHJpbnRmKGZkLCAiICBDaGFubmVsIENvdW50OiAldVxuIiwgbUNoYW5uZWxDb3VudCk7CisgICAgZHByaW50ZihmZCwgIiAgQ2hhbm5lbCBNYXNrOiAweCUwOHggKCVzKVxuIiwgbUNoYW5uZWxNYXNrLAorICAgICAgICAgICAgY2hhbm5lbE1hc2tUb1N0cmluZyhtQ2hhbm5lbE1hc2ssIG1UeXBlICE9IFJFQ09SRCkuc3RyaW5nKCkpOworICAgIGRwcmludGYoZmQsICIgIEZvcm1hdDogMHgleCAoJXMpXG4iLCBtSEFMRm9ybWF0LCBmb3JtYXRUb1N0cmluZyhtSEFMRm9ybWF0KSk7CisgICAgZHByaW50ZihmZCwgIiAgRnJhbWUgc2l6ZTogJXp1XG4iLCBtRnJhbWVTaXplKTsKKyAgICBkcHJpbnRmKGZkLCAiICBQZW5kaW5nIGNvbmZpZyBldmVudHM6Iik7CisgICAgc2l6ZV90IG51bUNvbmZpZyA9IG1Db25maWdFdmVudHMuc2l6ZSgpOworICAgIGlmIChudW1Db25maWcpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1Db25maWc7IGkrKykgeworICAgICAgICAgICAgbUNvbmZpZ0V2ZW50c1tpXS0+ZHVtcChidWZmZXIsIFNJWkUpOworICAgICAgICAgICAgZHByaW50ZihmZCwgIlxuICAgICVzIiwgYnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgICBkcHJpbnRmKGZkLCAiXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkcHJpbnRmKGZkLCAiIG5vbmVcbiIpOwogICAgIH0KIAotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuXG5QZW5kaW5nIGNvbmZpZyBldmVudHM6IFxuIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvbmZpZ0V2ZW50cy5zaXplKCk7IGkrKykgewotICAgICAgICBtQ29uZmlnRXZlbnRzW2ldLT5kdW1wKGJ1ZmZlciwgU0laRSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB9Ci0gICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKLQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotCiAgICAgaWYgKGxvY2tlZCkgewogICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICB9CkBAIC00NjYsMTAgKzYxNCwxMSBAQAogICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogICAgIFN0cmluZzggcmVzdWx0OwogCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG4tICVkIEVmZmVjdCBDaGFpbnM6XG4iLCBtRWZmZWN0Q2hhaW5zLnNpemUoKSk7CisgICAgc2l6ZV90IG51bUVmZmVjdENoYWlucyA9IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgJXp1IEVmZmVjdCBDaGFpbnNcbiIsIG51bUVmZmVjdENoYWlucyk7CiAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwogCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0Q2hhaW5zLnNpemUoKTsgKytpKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1FZmZlY3RDaGFpbnM7ICsraSkgewogICAgICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBtRWZmZWN0Q2hhaW5zW2ldOwogICAgICAgICBpZiAoY2hhaW4gIT0gMCkgewogICAgICAgICAgICAgY2hhaW4tPmR1bXAoZmQsIGFyZ3MpOwpAQCAtNTEzLDEyICs2NjIsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgYmluZGVyLAogICAgICAgICAgICAgICAgICAgICBnZXRXYWtlTG9ja1RhZygpLAogICAgICAgICAgICAgICAgICAgICBTdHJpbmcxNigibWVkaWEiKSwKLSAgICAgICAgICAgICAgICAgICAgdWlkKTsKKyAgICAgICAgICAgICAgICAgICAgdWlkLAorICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIEZJWE1FIGZvcmNlIG9uZXdheSBjb250cmFyeSB0byAuYWlkbCAqLyk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzdGF0dXMgPSBtUG93ZXJNYW5hZ2VyLT5hY3F1aXJlV2FrZUxvY2soUE9XRVJNQU5BR0VSX1BBUlRJQUxfV0FLRV9MT0NLLAogICAgICAgICAgICAgICAgICAgICBiaW5kZXIsCiAgICAgICAgICAgICAgICAgICAgIGdldFdha2VMb2NrVGFnKCksCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZzE2KCJtZWRpYSIpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nMTYoIm1lZGlhIiksCisgICAgICAgICAgICAgICAgICAgIHRydWUgLyogRklYTUUgZm9yY2Ugb25ld2F5IGNvbnRyYXJ5IHRvIC5haWRsICovKTsKICAgICAgICAgfQogICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBtV2FrZUxvY2tUb2tlbiA9IGJpbmRlcjsKQEAgLTUzOCw3ICs2ODksOCBAQAogICAgIGlmIChtV2FrZUxvY2tUb2tlbiAhPSAwKSB7CiAgICAgICAgIEFMT0dWKCJyZWxlYXNlV2FrZUxvY2tfbCgpICVzIiwgbU5hbWUpOwogICAgICAgICBpZiAobVBvd2VyTWFuYWdlciAhPSAwKSB7Ci0gICAgICAgICAgICBtUG93ZXJNYW5hZ2VyLT5yZWxlYXNlV2FrZUxvY2sobVdha2VMb2NrVG9rZW4sIDApOworICAgICAgICAgICAgbVBvd2VyTWFuYWdlci0+cmVsZWFzZVdha2VMb2NrKG1XYWtlTG9ja1Rva2VuLCAwLAorICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIEZJWE1FIGZvcmNlIG9uZXdheSBjb250cmFyeSB0byAuYWlkbCAqLyk7CiAgICAgICAgIH0KICAgICAgICAgbVdha2VMb2NrVG9rZW4uY2xlYXIoKTsKICAgICB9CkBAIC01NzQsNyArNzI2LDggQEAKICAgICBpZiAobVBvd2VyTWFuYWdlciAhPSAwKSB7CiAgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IG5ldyBCQmluZGVyKCk7CiAgICAgICAgIHN0YXR1c190IHN0YXR1czsKLSAgICAgICAgc3RhdHVzID0gbVBvd2VyTWFuYWdlci0+dXBkYXRlV2FrZUxvY2tVaWRzKG1XYWtlTG9ja1Rva2VuLCB1aWRzLnNpemUoKSwgdWlkcy5hcnJheSgpKTsKKyAgICAgICAgc3RhdHVzID0gbVBvd2VyTWFuYWdlci0+dXBkYXRlV2FrZUxvY2tVaWRzKG1XYWtlTG9ja1Rva2VuLCB1aWRzLnNpemUoKSwgdWlkcy5hcnJheSgpLAorICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIEZJWE1FIGZvcmNlIG9uZXdheSBjb250cmFyeSB0byAuYWlkbCAqLyk7CiAgICAgICAgIEFMT0dWKCJhY3F1aXJlV2FrZUxvY2tfbCgpICVzIHN0YXR1cyAlZCIsIG1OYW1lLCBzdGF0dXMpOwogICAgIH0KIH0KQEAgLTU4Niw3ICs3MzksNyBAQAogICAgIG1Qb3dlck1hbmFnZXIuY2xlYXIoKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OlBNRGVhdGhSZWNpcGllbnQ6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykKK3ZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpQTURlYXRoUmVjaXBpZW50OjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpCiB7CiAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CiAgICAgaWYgKHRocmVhZCAhPSAwKSB7CkBAIC03MzksOCArODkyLDcgQEAKICAgICAgICAgaW50IHNlc3Npb25JZCwKICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKICAgICAgICAgaW50ICplbmFibGVkLAotICAgICAgICBzdGF0dXNfdCAqc3RhdHVzCi0gICAgICAgICkKKyAgICAgICAgc3RhdHVzX3QgKnN0YXR1cykKIHsKICAgICBzcDxFZmZlY3RNb2R1bGU+IGVmZmVjdDsKICAgICBzcDxFZmZlY3RIYW5kbGU+IGhhbmRsZTsKQEAgLTc1Niw2ICs5MDgsMjQgQEAKICAgICAgICAgZ290byBFeGl0OwogICAgIH0KIAorICAgIC8vIFJlamVjdCBhbnkgZWZmZWN0IG9uIERpcmVjdCBvdXRwdXQgdGhyZWFkcyBmb3Igbm93LCBzaW5jZSB0aGUgZm9ybWF0IG9mCisgICAgLy8gbVNpbmtCdWZmZXIgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgY29tcGF0aWJsZSB3aXRoIGVmZmVjdCBwcm9jZXNzaW5nIChQQ00gMTYgc3RlcmVvKS4KKyAgICBpZiAobVR5cGUgPT0gRElSRUNUKSB7CisgICAgICAgIEFMT0dXKCJjcmVhdGVFZmZlY3RfbCgpIENhbm5vdCBhZGQgZWZmZWN0ICVzIG9uIERpcmVjdCBvdXRwdXQgdHlwZSB0aHJlYWQgJXMiLAorICAgICAgICAgICAgICAgIGRlc2MtPm5hbWUsIG1OYW1lKTsKKyAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgZ290byBFeGl0OworICAgIH0KKworICAgIC8vIFJlamVjdCBhbnkgZWZmZWN0IG9uIG1peGVyIG9yIGR1cGxpY2F0aW5nIG11bHRpY2hhbm5lbCBzaW5rcy4KKyAgICAvLyBUT0RPOiBmaXggYm90aCBmb3JtYXQgYW5kIG11bHRpY2hhbm5lbCBpc3N1ZXMgd2l0aCBlZmZlY3RzLgorICAgIGlmICgobVR5cGUgPT0gTUlYRVIgfHwgbVR5cGUgPT0gRFVQTElDQVRJTkcpICYmIG1DaGFubmVsQ291bnQgIT0gRkNDXzIpIHsKKyAgICAgICAgQUxPR1coImNyZWF0ZUVmZmVjdF9sKCkgQ2Fubm90IGFkZCBlZmZlY3QgJXMgZm9yIG11bHRpY2hhbm5lbCglZCkgJXMgdGhyZWFkcyIsCisgICAgICAgICAgICAgICAgZGVzYy0+bmFtZSwgbUNoYW5uZWxDb3VudCwgbVR5cGUgPT0gTUlYRVIgPyAiTUlYRVIiIDogIkRVUExJQ0FUSU5HIik7CisgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKICAgICAvLyBBbGxvdyBnbG9iYWwgZWZmZWN0cyBvbmx5IG9uIG9mZmxvYWRlZCBhbmQgbWl4ZXIgdGhyZWFkcwogICAgIGlmIChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKSB7CiAgICAgICAgIHN3aXRjaCAobVR5cGUpIHsKQEAgLTgyOSw3ICs5OTksMTAgQEAKICAgICAgICAgfQogICAgICAgICAvLyBjcmVhdGUgZWZmZWN0IGhhbmRsZSBhbmQgY29ubmVjdCBpdCB0byBlZmZlY3QgbW9kdWxlCiAgICAgICAgIGhhbmRsZSA9IG5ldyBFZmZlY3RIYW5kbGUoZWZmZWN0LCBjbGllbnQsIGVmZmVjdENsaWVudCwgcHJpb3JpdHkpOwotICAgICAgICBsU3RhdHVzID0gZWZmZWN0LT5hZGRIYW5kbGUoaGFuZGxlLmdldCgpKTsKKyAgICAgICAgbFN0YXR1cyA9IGhhbmRsZS0+aW5pdENoZWNrKCk7CisgICAgICAgIGlmIChsU3RhdHVzID09IE9LKSB7CisgICAgICAgICAgICBsU3RhdHVzID0gZWZmZWN0LT5hZGRIYW5kbGUoaGFuZGxlLmdldCgpKTsKKyAgICAgICAgfQogICAgICAgICBpZiAoZW5hYmxlZCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAqZW5hYmxlZCA9IChpbnQpZWZmZWN0LT5pc0VuYWJsZWQoKTsKICAgICAgICAgfQpAQCAtODUwLDkgKzEwMjMsNyBAQAogICAgICAgICBoYW5kbGUuY2xlYXIoKTsKICAgICB9CiAKLSAgICBpZiAoc3RhdHVzICE9IE5VTEwpIHsKLSAgICAgICAgKnN0YXR1cyA9IGxTdGF0dXM7Ci0gICAgfQorICAgICpzdGF0dXMgPSBsU3RhdHVzOwogICAgIHJldHVybiBoYW5kbGU7CiB9CiAKQEAgLTk3NiwyMSArMTE0NywxOCBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmRpc2Nvbm5lY3RFZmZlY3QoY29uc3Qgc3A8RWZmZWN0TW9kdWxlPiYgZWZmZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdEhhbmRsZSAqaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdW5waW5JZkxhc3QpIHsKLQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgQUxPR1YoImRpc2Nvbm5lY3RFZmZlY3QoKSAlcCBlZmZlY3QgJXAiLCB0aGlzLCBlZmZlY3QuZ2V0KCkpOwotICAgIC8vIGRlbGV0ZSB0aGUgZWZmZWN0IG1vZHVsZSBpZiByZW1vdmluZyBsYXN0IGhhbmRsZSBvbiBpdAotICAgIGlmIChlZmZlY3QtPnJlbW92ZUhhbmRsZShoYW5kbGUpID09IDApIHsKLSAgICAgICAgaWYgKCFlZmZlY3QtPmlzUGlubmVkKCkgfHwgdW5waW5JZkxhc3QpIHsKLSAgICAgICAgICAgIHJlbW92ZUVmZmVjdF9sKGVmZmVjdCk7Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6dW5yZWdpc3RlckVmZmVjdChlZmZlY3QtPmlkKCkpOwotICAgICAgICB9Ci0gICAgfQordm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmdldEF1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKK3sKKyAgICBjb25maWctPnR5cGUgPSBBVURJT19QT1JUX1RZUEVfTUlYOworICAgIGNvbmZpZy0+ZXh0Lm1peC5oYW5kbGUgPSBtSWQ7CisgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSA9IG1TYW1wbGVSYXRlOworICAgIGNvbmZpZy0+Zm9ybWF0ID0gbUZvcm1hdDsKKyAgICBjb25maWctPmNoYW5uZWxfbWFzayA9IG1DaGFubmVsTWFzazsKKyAgICBjb25maWctPmNvbmZpZ19tYXNrID0gQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEV8QVVESU9fUE9SVF9DT05GSUdfQ0hBTk5FTF9NQVNLfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPUlRfQ09ORklHX0ZPUk1BVDsKIH0KIAorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyAgICAgIFBsYXliYWNrCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMDAxLDggKzExNjksMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlX3QgdHlwZSkKICAgICA6ICAgVGhyZWFkQmFzZShhdWRpb0ZsaW5nZXIsIGlkLCBkZXZpY2UsIEFVRElPX0RFVklDRV9OT05FLCB0eXBlKSwKLSAgICAgICAgbU5vcm1hbEZyYW1lQ291bnQoMCksIG1NaXhCdWZmZXIoTlVMTCksCi0gICAgICAgIG1BbGxvY01peEJ1ZmZlcihOVUxMKSwgbVN1c3BlbmRlZCgwKSwgbUJ5dGVzV3JpdHRlbigwKSwKKyAgICAgICAgbU5vcm1hbEZyYW1lQ291bnQoMCksIG1TaW5rQnVmZmVyKE5VTEwpLAorICAgICAgICBtTWl4ZXJCdWZmZXJFbmFibGVkKEF1ZGlvRmxpbmdlcjo6a0VuYWJsZUV4dGVuZGVkUHJlY2lzaW9uKSwKKyAgICAgICAgbU1peGVyQnVmZmVyKE5VTEwpLAorICAgICAgICBtTWl4ZXJCdWZmZXJTaXplKDApLAorICAgICAgICBtTWl4ZXJCdWZmZXJGb3JtYXQoQVVESU9fRk9STUFUX0lOVkFMSUQpLAorICAgICAgICBtTWl4ZXJCdWZmZXJWYWxpZChmYWxzZSksCisgICAgICAgIG1FZmZlY3RCdWZmZXJFbmFibGVkKEF1ZGlvRmxpbmdlcjo6a0VuYWJsZUV4dGVuZGVkUHJlY2lzaW9uKSwKKyAgICAgICAgbUVmZmVjdEJ1ZmZlcihOVUxMKSwKKyAgICAgICAgbUVmZmVjdEJ1ZmZlclNpemUoMCksCisgICAgICAgIG1FZmZlY3RCdWZmZXJGb3JtYXQoQVVESU9fRk9STUFUX0lOVkFMSUQpLAorICAgICAgICBtRWZmZWN0QnVmZmVyVmFsaWQoZmFsc2UpLAorICAgICAgICBtU3VzcGVuZGVkKDApLCBtQnl0ZXNXcml0dGVuKDApLAogICAgICAgICBtQWN0aXZlVHJhY2tzR2VuZXJhdGlvbigwKSwKICAgICAgICAgLy8gbVN0cmVhbVR5cGVzW10gaW5pdGlhbGl6ZWQgaW4gY29uc3RydWN0b3IgYm9keQogICAgICAgICBtT3V0cHV0KG91dHB1dCksCkBAIC0xMDQ0LDExICsxMjIyLDExIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZWFkT3V0cHV0UGFyYW1ldGVycygpOworICAgIHJlYWRPdXRwdXRQYXJhbWV0ZXJzX2woKTsKIAogICAgIC8vIG1TdHJlYW1UeXBlc1tBVURJT19TVFJFQU1fQ05UXSBpcyBpbml0aWFsaXplZCBieSBzdHJlYW1fdHlwZV90IGRlZmF1bHQgY29uc3RydWN0b3IKICAgICAvLyBUaGVyZSBpcyBubyBBVURJT19TVFJFQU1fTUlOLCBhbmQgKysgb3BlcmF0b3IgZG9lcyBub3QgY29tcGlsZQotICAgIGZvciAoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSAoYXVkaW9fc3RyZWFtX3R5cGVfdCkgMDsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0NOVDsKKyAgICBmb3IgKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gQVVESU9fU1RSRUFNX01JTjsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0NOVDsKICAgICAgICAgICAgIHN0cmVhbSA9IChhdWRpb19zdHJlYW1fdHlwZV90KSAoc3RyZWFtICsgMSkpIHsKICAgICAgICAgbVN0cmVhbVR5cGVzW3N0cmVhbV0udm9sdW1lID0gbUF1ZGlvRmxpbmdlci0+c3RyZWFtVm9sdW1lX2woc3RyZWFtKTsKICAgICAgICAgbVN0cmVhbVR5cGVzW3N0cmVhbV0ubXV0ZSA9IG1BdWRpb0ZsaW5nZXItPnN0cmVhbU11dGVfbChzdHJlYW0pOwpAQCAtMTA2MCw3ICsxMjM4LDkgQEAKIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6On5QbGF5YmFja1RocmVhZCgpCiB7CiAgICAgbUF1ZGlvRmxpbmdlci0+dW5yZWdpc3RlcldyaXRlcihtTkJMb2dXcml0ZXIpOwotICAgIGRlbGV0ZSBbXSBtQWxsb2NNaXhCdWZmZXI7CisgICAgZnJlZShtU2lua0J1ZmZlcik7CisgICAgZnJlZShtTWl4ZXJCdWZmZXIpOworICAgIGZyZWUobUVmZmVjdEJ1ZmZlcik7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCkBAIC0xMDcwLDEzICsxMjUwLDEzIEBACiAgICAgZHVtcEVmZmVjdENoYWlucyhmZCwgYXJncyk7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6ZHVtcFRyYWNrcyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmR1bXBUcmFja3MoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQogewogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwogICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogICAgIFN0cmluZzggcmVzdWx0OwogCi0gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiT3V0cHV0IHRocmVhZCAlcCBzdHJlYW0gdm9sdW1lcyBpbiBkQjpcbiAgICAiLCB0aGlzKTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIFN0cmVhbSB2b2x1bWVzIGluIGRCOiAiKTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IEFVRElPX1NUUkVBTV9DTlQ7ICsraSkgewogICAgICAgICBjb25zdCBzdHJlYW1fdHlwZV90ICpzdCA9ICZtU3RyZWFtVHlwZXNbaV07CiAgICAgICAgIGlmIChpID4gMCkgewpAQCAtMTA5MSw3NSArMTI3MSw2OCBAQAogICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5sZW5ndGgoKSk7CiAgICAgcmVzdWx0LmNsZWFyKCk7CiAKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJPdXRwdXQgdGhyZWFkICVwIHRyYWNrc1xuIiwgdGhpcyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIHNwPFRyYWNrPiB0cmFjayA9IG1UcmFja3NbaV07Ci0gICAgICAgIGlmICh0cmFjayAhPSAwKSB7Ci0gICAgICAgICAgICB0cmFjay0+ZHVtcChidWZmZXIsIFNJWkUpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiT3V0cHV0IHRocmVhZCAlcCBhY3RpdmUgdHJhY2tzXG4iLCB0aGlzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BY3RpdmVUcmFja3Muc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgc3A8VHJhY2s+IHRyYWNrID0gbUFjdGl2ZVRyYWNrc1tpXS5wcm9tb3RlKCk7Ci0gICAgICAgIGlmICh0cmFjayAhPSAwKSB7Ci0gICAgICAgICAgICB0cmFjay0+ZHVtcChidWZmZXIsIFNJWkUpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICB9Ci0gICAgfQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotCiAgICAgLy8gVGhlc2UgdmFsdWVzIGFyZSAicmF3IjsgdGhleSB3aWxsIHdyYXAgYXJvdW5kLiAgU2VlIHByZXBhcmVUcmFja3NfbCgpIGZvciBhIGJldHRlciB3YXkuCiAgICAgRmFzdFRyYWNrVW5kZXJydW5zIHVuZGVycnVucyA9IGdldEZhc3RUcmFja1VuZGVycnVucygwKTsKLSAgICBmZHByaW50ZihmZCwgIk5vcm1hbCBtaXhlciByYXcgdW5kZXJydW4gY291bnRlcnM6IHBhcnRpYWw9JXUgZW1wdHk9JXVcbiIsCisgICAgZHByaW50ZihmZCwgIiAgTm9ybWFsIG1peGVyIHJhdyB1bmRlcnJ1biBjb3VudGVyczogcGFydGlhbD0ldSBlbXB0eT0ldVxuIiwKICAgICAgICAgICAgIHVuZGVycnVucy5tQml0RmllbGRzLm1QYXJ0aWFsLCB1bmRlcnJ1bnMubUJpdEZpZWxkcy5tRW1wdHkpOworCisgICAgc2l6ZV90IG51bXRyYWNrcyA9IG1UcmFja3Muc2l6ZSgpOworICAgIHNpemVfdCBudW1hY3RpdmUgPSBtQWN0aXZlVHJhY2tzLnNpemUoKTsKKyAgICBkcHJpbnRmKGZkLCAiICAlZCBUcmFja3MiLCBudW10cmFja3MpOworICAgIHNpemVfdCBudW1hY3RpdmVzZWVuID0gMDsKKyAgICBpZiAobnVtdHJhY2tzKSB7CisgICAgICAgIGRwcmludGYoZmQsICIgb2Ygd2hpY2ggJWQgYXJlIGFjdGl2ZVxuIiwgbnVtYWN0aXZlKTsKKyAgICAgICAgVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW10cmFja3M7ICsraSkgeworICAgICAgICAgICAgc3A8VHJhY2s+IHRyYWNrID0gbVRyYWNrc1tpXTsKKyAgICAgICAgICAgIGlmICh0cmFjayAhPSAwKSB7CisgICAgICAgICAgICAgICAgYm9vbCBhY3RpdmUgPSBtQWN0aXZlVHJhY2tzLmluZGV4T2YodHJhY2spID49IDA7CisgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZSkgeworICAgICAgICAgICAgICAgICAgICBudW1hY3RpdmVzZWVuKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyYWNrLT5kdW1wKGJ1ZmZlciwgU0laRSwgYWN0aXZlKTsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworICAgIH0KKyAgICBpZiAobnVtYWN0aXZlc2VlbiAhPSBudW1hY3RpdmUpIHsKKyAgICAgICAgLy8gc29tZSB0cmFja3MgaW4gdGhlIGFjdGl2ZSBsaXN0IHdlcmUgbm90IGluIHRoZSB0cmFja3MgbGlzdAorICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgIFRoZSBmb2xsb3dpbmcgdHJhY2tzIGFyZSBpbiB0aGUgYWN0aXZlIGxpc3QgYnV0IgorICAgICAgICAgICAgICAgICIgbm90IGluIHRoZSB0cmFjayBsaXN0XG4iKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bWFjdGl2ZTsgKytpKSB7CisgICAgICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBtQWN0aXZlVHJhY2tzW2ldLnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmICh0cmFjayAhPSAwICYmIG1UcmFja3MuaW5kZXhPZih0cmFjaykgPCAwKSB7CisgICAgICAgICAgICAgICAgdHJhY2stPmR1bXAoYnVmZmVyLCBTSVpFLCB0cnVlKTsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuT3V0cHV0IHRocmVhZCAlcCBpbnRlcm5hbHNcbiIsIHRoaXMpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJOb3JtYWwgZnJhbWUgY291bnQ6ICVkXG4iLCBtTm9ybWFsRnJhbWVDb3VudCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgImxhc3Qgd3JpdGUgb2NjdXJyZWQgKG1zZWNzKTogJWxsdVxuIiwKLSAgICAgICAgICAgIG5zMm1zKHN5c3RlbVRpbWUoKSAtIG1MYXN0V3JpdGVUaW1lKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgInRvdGFsIHdyaXRlczogJWRcbiIsIG1OdW1Xcml0ZXMpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJkZWxheWVkIHdyaXRlczogJWRcbiIsIG1OdW1EZWxheWVkV3JpdGVzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiYmxvY2tlZCBpbiB3cml0ZTogJWRcbiIsIG1JbldyaXRlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAic3VzcGVuZCBjb3VudDogJWRcbiIsIG1TdXNwZW5kZWQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJtaXggYnVmZmVyIDogJXBcbiIsIG1NaXhCdWZmZXIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICBmZHByaW50ZihmZCwgIkZhc3QgdHJhY2sgYXZhaWxNYXNrPSUjeFxuIiwgbUZhc3RUcmFja0F2YWlsTWFzayk7CisgICAgZHByaW50ZihmZCwgIlxuT3V0cHV0IHRocmVhZCAlcDpcbiIsIHRoaXMpOworICAgIGRwcmludGYoZmQsICIgIE5vcm1hbCBmcmFtZSBjb3VudDogJXp1XG4iLCBtTm9ybWFsRnJhbWVDb3VudCk7CisgICAgZHByaW50ZihmZCwgIiAgTGFzdCB3cml0ZSBvY2N1cnJlZCAobXNlY3MpOiAlbGx1XG4iLCBuczJtcyhzeXN0ZW1UaW1lKCkgLSBtTGFzdFdyaXRlVGltZSkpOworICAgIGRwcmludGYoZmQsICIgIFRvdGFsIHdyaXRlczogJWRcbiIsIG1OdW1Xcml0ZXMpOworICAgIGRwcmludGYoZmQsICIgIERlbGF5ZWQgd3JpdGVzOiAlZFxuIiwgbU51bURlbGF5ZWRXcml0ZXMpOworICAgIGRwcmludGYoZmQsICIgIEJsb2NrZWQgaW4gd3JpdGU6ICVzXG4iLCBtSW5Xcml0ZSA/ICJ5ZXMiIDogIm5vIik7CisgICAgZHByaW50ZihmZCwgIiAgU3VzcGVuZCBjb3VudDogJWRcbiIsIG1TdXNwZW5kZWQpOworICAgIGRwcmludGYoZmQsICIgIFNpbmsgYnVmZmVyIDogJXBcbiIsIG1TaW5rQnVmZmVyKTsKKyAgICBkcHJpbnRmKGZkLCAiICBNaXhlciBidWZmZXI6ICVwXG4iLCBtTWl4ZXJCdWZmZXIpOworICAgIGRwcmludGYoZmQsICIgIEVmZmVjdCBidWZmZXI6ICVwXG4iLCBtRWZmZWN0QnVmZmVyKTsKKyAgICBkcHJpbnRmKGZkLCAiICBGYXN0IHRyYWNrIGF2YWlsTWFzaz0lI3hcbiIsIG1GYXN0VHJhY2tBdmFpbE1hc2spOwogCiAgICAgZHVtcEJhc2UoZmQsIGFyZ3MpOwogfQogCiAvLyBUaHJlYWQgdmlydHVhbHMKLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnJlYWR5VG9SdW4oKQotewotICAgIHN0YXR1c190IHN0YXR1cyA9IGluaXRDaGVjaygpOwotICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0koIkF1ZGlvRmxpbmdlcidzIHRocmVhZCAlcCByZWFkeSB0byBydW4iLCB0aGlzKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiTm8gd29ya2luZyBhdWRpbyBkcml2ZXIgZm91bmQuIik7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6b25GaXJzdFJlZigpCiB7CkBAIC0xMTgyLDcgKzEzNTUsNyBAQAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgc2l6ZV90ICpwRnJhbWVDb3VudCwKICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgaW50IHNlc3Npb25JZCwKICAgICAgICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCAqZmxhZ3MsCkBAIC0xMTkwLDYgKzEzNjMsNyBAQAogICAgICAgICBpbnQgdWlkLAogICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKQogeworICAgIHNpemVfdCBmcmFtZUNvdW50ID0gKnBGcmFtZUNvdW50OwogICAgIHNwPFRyYWNrPiB0cmFjazsKICAgICBzdGF0dXNfdCBsU3RhdHVzOwogCkBAIC0xMjE1LDEzICsxMzg5LDEyIEBACiAgICAgICAgICAgICApICYmCiAgICAgICAgICAgICAvLyBQQ00gZGF0YQogICAgICAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpICYmCi0gICAgICAgICAgICAvLyBtb25vIG9yIHN0ZXJlbwotICAgICAgICAgICAgKCAoY2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTykgfHwKLSAgICAgICAgICAgICAgKGNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTykgKSAmJgotI2lmbmRlZiBGQVNUX1RSQUNLU19BVF9OT05fTkFUSVZFX1NBTVBMRV9SQVRFCisgICAgICAgICAgICAvLyBpZGVudGljYWwgY2hhbm5lbCBtYXNrIHRvIHNpbmssIG9yIG1vbm8gaW4gYW5kIHN0ZXJlbyBzaW5rCisgICAgICAgICAgICAoY2hhbm5lbE1hc2sgPT0gbUNoYW5uZWxNYXNrIHx8CisgICAgICAgICAgICAgICAgICAgIChjaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX09VVF9NT05PICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTykpICYmCiAgICAgICAgICAgICAvLyBoYXJkd2FyZSBzYW1wbGUgcmF0ZQogICAgICAgICAgICAgKHNhbXBsZVJhdGUgPT0gbVNhbXBsZVJhdGUpICYmCi0jZW5kaWYKICAgICAgICAgICAgIC8vIG5vcm1hbCBtaXhlciBoYXMgYW4gYXNzb2NpYXRlZCBmYXN0IG1peGVyCiAgICAgICAgICAgICBoYXNGYXN0TWl4ZXIoKSAmJgogICAgICAgICAgICAgLy8gdGhlcmUgYXJlIHN1ZmZpY2llbnQgZmFzdCB0cmFjayBzbG90cyBhdmFpbGFibGUKQEAgLTEyMzEsMTUgKzE0MDQsMjEgQEAKICAgICAgICAgKSB7CiAgICAgICAgIC8vIGlmIGZyYW1lQ291bnQgbm90IHNwZWNpZmllZCwgdGhlbiBpdCBkZWZhdWx0cyB0byBmYXN0IG1peGVyIChIQUwpIGZyYW1lIGNvdW50CiAgICAgICAgIGlmIChmcmFtZUNvdW50ID09IDApIHsKLSAgICAgICAgICAgIGZyYW1lQ291bnQgPSBtRnJhbWVDb3VudCAqIGtGYXN0VHJhY2tNdWx0aXBsaWVyOworICAgICAgICAgICAgLy8gcmVhZCB0aGUgZmFzdCB0cmFjayBtdWx0aXBsaWVyIHByb3BlcnR5IHRoZSBmaXJzdCB0aW1lIGl0IGlzIG5lZWRlZAorICAgICAgICAgICAgaW50IG9rID0gcHRocmVhZF9vbmNlKCZzRmFzdFRyYWNrTXVsdGlwbGllck9uY2UsIHNGYXN0VHJhY2tNdWx0aXBsaWVySW5pdCk7CisgICAgICAgICAgICBpZiAob2sgIT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlcyBwdGhyZWFkX29uY2UgZmFpbGVkOiAlZCIsIF9fZnVuY19fLCBvayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmFtZUNvdW50ID0gbUZyYW1lQ291bnQgKiBzRmFzdFRyYWNrTXVsdGlwbGllcjsKICAgICAgICAgfQogICAgICAgICBBTE9HVigiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBhY2NlcHRlZDogZnJhbWVDb3VudD0lZCBtRnJhbWVDb3VudD0lZCIsCiAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgbUZyYW1lQ291bnQpOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR1YoIkFVRElPX09VVFBVVF9GTEFHX0ZBU1QgZGVuaWVkOiBpc1RpbWVkPSVkIHNoYXJlZEJ1ZmZlcj0lcCBmcmFtZUNvdW50PSVkICIKLSAgICAgICAgICAgICAgICAibUZyYW1lQ291bnQ9JWQgZm9ybWF0PSVkIGlzTGluZWFyPSVkIGNoYW5uZWxNYXNrPSUjeCBzYW1wbGVSYXRlPSV1IG1TYW1wbGVSYXRlPSV1ICIKKyAgICAgICAgICAgICAgICAibUZyYW1lQ291bnQ9JWQgZm9ybWF0PSUjeCBtRm9ybWF0PSUjeCBpc0xpbmVhcj0lZCBjaGFubmVsTWFzaz0lI3ggIgorICAgICAgICAgICAgICAgICJzYW1wbGVSYXRlPSV1IG1TYW1wbGVSYXRlPSV1ICIKICAgICAgICAgICAgICAgICAiaGFzRmFzdE1peGVyPSVkIHRpZD0lZCBmYXN0VHJhY2tBdmFpbE1hc2s9JSN4IiwKLSAgICAgICAgICAgICAgICBpc1RpbWVkLCBzaGFyZWRCdWZmZXIuZ2V0KCksIGZyYW1lQ291bnQsIG1GcmFtZUNvdW50LCBmb3JtYXQsCisgICAgICAgICAgICAgICAgaXNUaW1lZCwgc2hhcmVkQnVmZmVyLmdldCgpLCBmcmFtZUNvdW50LCBtRnJhbWVDb3VudCwgZm9ybWF0LCBtRm9ybWF0LAogICAgICAgICAgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSwKICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgc2FtcGxlUmF0ZSwgbVNhbXBsZVJhdGUsIGhhc0Zhc3RNaXhlcigpLCB0aWQsIG1GYXN0VHJhY2tBdmFpbE1hc2spOwogICAgICAgICAqZmxhZ3MgJj0gfklBdWRpb0ZsaW5nZXI6OlRSQUNLX0ZBU1Q7CkBAIC0xMjU4LDQ0ICsxNDM3LDUyIEBACiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CisgICAgKnBGcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKIAotICAgIGlmIChtVHlwZSA9PSBESVJFQ1QpIHsKLSAgICAgICAgaWYgKChmb3JtYXQgJiBBVURJT19GT1JNQVRfTUFJTl9NQVNLKSA9PSBBVURJT19GT1JNQVRfUENNKSB7CisgICAgc3dpdGNoIChtVHlwZSkgeworCisgICAgY2FzZSBESVJFQ1Q6CisgICAgICAgIGlmIChhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpIHsKICAgICAgICAgICAgIGlmIChzYW1wbGVSYXRlICE9IG1TYW1wbGVSYXRlIHx8IGZvcm1hdCAhPSBtRm9ybWF0IHx8IGNoYW5uZWxNYXNrICE9IG1DaGFubmVsTWFzaykgewotICAgICAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFja19sKCkgQmFkIHBhcmFtZXRlcjogc2FtcGxlUmF0ZSAldSBmb3JtYXQgJWQsIGNoYW5uZWxNYXNrIDB4JTA4eCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiZm9yIG91dHB1dCAlcCB3aXRoIGZvcm1hdCAlZCIsCisgICAgICAgICAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrX2woKSBCYWQgcGFyYW1ldGVyOiBzYW1wbGVSYXRlICV1IGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrIDB4JTA4eCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIG91dHB1dCAlcCB3aXRoIGZvcm1hdCAlI3giLAogICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgbU91dHB1dCwgbUZvcm1hdCk7CiAgICAgICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG1UeXBlID09IE9GRkxPQUQpIHsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9GRkxPQUQ6CiAgICAgICAgIGlmIChzYW1wbGVSYXRlICE9IG1TYW1wbGVSYXRlIHx8IGZvcm1hdCAhPSBtRm9ybWF0IHx8IGNoYW5uZWxNYXNrICE9IG1DaGFubmVsTWFzaykgewotICAgICAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrX2woKSBCYWQgcGFyYW1ldGVyOiBzYW1wbGVSYXRlICVkIGZvcm1hdCAlZCwgY2hhbm5lbE1hc2sgMHglMDh4IFwiIgotICAgICAgICAgICAgICAgICAgICAiZm9yIG91dHB1dCAlcCB3aXRoIGZvcm1hdCAlZCIsCisgICAgICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2tfbCgpIEJhZCBwYXJhbWV0ZXI6IHNhbXBsZVJhdGUgJWQgZm9ybWF0ICUjeCwgY2hhbm5lbE1hc2sgMHglMDh4IFwiIgorICAgICAgICAgICAgICAgICAgICAiZm9yIG91dHB1dCAlcCB3aXRoIGZvcm1hdCAlI3giLAogICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBtT3V0cHV0LCBtRm9ybWF0KTsKICAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoKGZvcm1hdCAmIEFVRElPX0ZPUk1BVF9NQUlOX01BU0spICE9IEFVRElPX0ZPUk1BVF9QQ00pIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2tfbCgpIEJhZCBwYXJhbWV0ZXI6IGZvcm1hdCAlZCBcIiIKLSAgICAgICAgICAgICAgICAgICAgICAgICJmb3Igb3V0cHV0ICVwIHdpdGggZm9ybWF0ICVkIiwKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFja19sKCkgQmFkIHBhcmFtZXRlcjogZm9ybWF0ICUjeCBcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJmb3Igb3V0cHV0ICVwIHdpdGggZm9ybWF0ICUjeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIG1PdXRwdXQsIG1Gb3JtYXQpOwogICAgICAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgZ290byBFeGl0OwogICAgICAgICB9Ci0gICAgICAgIC8vIFJlc2FtcGxlciBpbXBsZW1lbnRhdGlvbiBsaW1pdHMgaW5wdXQgc2FtcGxpbmcgcmF0ZSB0byAyIHggb3V0cHV0IHNhbXBsaW5nIHJhdGUuCi0gICAgICAgIGlmIChzYW1wbGVSYXRlID4gbVNhbXBsZVJhdGUqMikgeworICAgICAgICBpZiAoc2FtcGxlUmF0ZSA+IG1TYW1wbGVSYXRlICogQVVESU9fUkVTQU1QTEVSX0RPV05fUkFUSU9fTUFYKSB7CiAgICAgICAgICAgICBBTE9HRSgiU2FtcGxlIHJhdGUgb3V0IG9mIHJhbmdlOiAldSBtU2FtcGxlUmF0ZSAldSIsIHNhbXBsZVJhdGUsIG1TYW1wbGVSYXRlKTsKICAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKICAgICB9CiAKICAgICBsU3RhdHVzID0gaW5pdENoZWNrKCk7CiAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvIGRyaXZlciBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFja19sKCkgYXVkaW8gZHJpdmVyIG5vdCBpbml0aWFsaXplZCIpOwogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQogCkBAIC0xMzA4LDcgKzE0OTUsNyBAQAogICAgICAgICB1aW50MzJfdCBzdHJhdGVneSA9IEF1ZGlvU3lzdGVtOjpnZXRTdHJhdGVneUZvclN0cmVhbShzdHJlYW1UeXBlKTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgKytpKSB7CiAgICAgICAgICAgICBzcDxUcmFjaz4gdCA9IG1UcmFja3NbaV07Ci0gICAgICAgICAgICBpZiAodCAhPSAwICYmICF0LT5pc091dHB1dFRyYWNrKCkpIHsKKyAgICAgICAgICAgIGlmICh0ICE9IDAgJiYgdC0+aXNFeHRlcm5hbFRyYWNrKCkpIHsKICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3R1YWwgPSBBdWRpb1N5c3RlbTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0odC0+c3RyZWFtVHlwZSgpKTsKICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbklkID09IHQtPnNlc3Npb25JZCgpICYmIHN0cmF0ZWd5ICE9IGFjdHVhbCkgewogICAgICAgICAgICAgICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2tfbCgpIG1pc21hdGNoZWQgc3RyYXRlZ3k7IGV4cGVjdGVkICV1IGJ1dCBmb3VuZCAldSIsCkBAIC0xMzIxLDE4ICsxNTA4LDIxIEBACiAKICAgICAgICAgaWYgKCFpc1RpbWVkKSB7CiAgICAgICAgICAgICB0cmFjayA9IG5ldyBUcmFjayh0aGlzLCBjbGllbnQsIHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIHNoYXJlZEJ1ZmZlciwgc2Vzc2lvbklkLCB1aWQsICpmbGFncyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgTlVMTCwgc2hhcmVkQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCB1aWQsICpmbGFncywgVHJhY2tCYXNlOjpUWVBFX0RFRkFVTFQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdHJhY2sgPSBUaW1lZFRyYWNrOjpjcmVhdGUodGhpcywgY2xpZW50LCBzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBzaGFyZWRCdWZmZXIsIHNlc3Npb25JZCwgdWlkKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICh0cmFjayA9PSAwIHx8IHRyYWNrLT5nZXRDYmxrKCkgPT0gTlVMTCB8fCB0cmFjay0+bmFtZSgpIDwgMCkgewotICAgICAgICAgICAgbFN0YXR1cyA9IE5PX01FTU9SWTsKKyAgICAgICAgLy8gbmV3IFRyYWNrIGFsd2F5cyByZXR1cm5zIG5vbi1OVUxMLAorICAgICAgICAvLyBidXQgVGltZWRUcmFjazo6Y3JlYXRlKCkgaXMgYSBmYWN0b3J5IHRoYXQgY291bGQgZmFpbCBieSByZXR1cm5pbmcgTlVMTAorICAgICAgICBsU3RhdHVzID0gdHJhY2sgIT0gMCA/IHRyYWNrLT5pbml0Q2hlY2soKSA6IChzdGF0dXNfdCkgTk9fTUVNT1JZOworICAgICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrX2woKSBpbml0Q2hlY2sgZmFpbGVkICVkOyBubyBjb250cm9sIGJsb2NrPyIsIGxTdGF0dXMpOwogICAgICAgICAgICAgLy8gdHJhY2sgbXVzdCBiZSBjbGVhcmVkIGZyb20gdGhlIGNhbGxlciBhcyB0aGUgY2FsbGVyIGhhcyB0aGUgQUYgbG9jawogICAgICAgICAgICAgZ290byBFeGl0OwogICAgICAgICB9Ci0KICAgICAgICAgbVRyYWNrcy5hZGQodHJhY2spOwogCiAgICAgICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IGdldEVmZmVjdENoYWluX2woc2Vzc2lvbklkKTsKQEAgLTEzNTQsOSArMTU0NCw3IEBACiAgICAgbFN0YXR1cyA9IE5PX0VSUk9SOwogCiBFeGl0OgotICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgKnN0YXR1cyA9IGxTdGF0dXM7Ci0gICAgfQorICAgICpzdGF0dXMgPSBsU3RhdHVzOwogICAgIHJldHVybiB0cmFjazsKIH0KIApAQCAtMTQzNCw3ICsxNjIyLDcgQEAKICAgICAgICAgLy8gdGhlIHRyYWNrIGlzIG5ld2x5IGFkZGVkLCBtYWtlIHN1cmUgaXQgZmlsbHMgdXAgYWxsIGl0cwogICAgICAgICAvLyBidWZmZXJzIGJlZm9yZSBwbGF5aW5nLiBUaGlzIGlzIHRvIGVuc3VyZSB0aGUgY2xpZW50IHdpbGwKICAgICAgICAgLy8gZWZmZWN0aXZlbHkgZ2V0IHRoZSBsYXRlbmN5IGl0IHJlcXVlc3RlZC4KLSAgICAgICAgaWYgKCF0cmFjay0+aXNPdXRwdXRUcmFjaygpKSB7CisgICAgICAgIGlmICh0cmFjay0+aXNFeHRlcm5hbFRyYWNrKCkpIHsKICAgICAgICAgICAgIFRyYWNrQmFzZTo6dHJhY2tfc3RhdGUgc3RhdGUgPSB0cmFjay0+bVN0YXRlOwogICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6c3RhcnRPdXRwdXQobUlkLCB0cmFjay0+c3RyZWFtVHlwZSgpLCB0cmFjay0+c2Vzc2lvbklkKCkpOwpAQCAtMTQ3NSw5ICsxNjYzLDcgQEAKICAgICAgICAgc3RhdHVzID0gTk9fRVJST1I7CiAgICAgfQogCi0gICAgQUxPR1YoInNpZ25hbCBwbGF5YmFjayB0aHJlYWQiKTsKLSAgICBicm9hZGNhc3RfbCgpOwotCisgICAgb25BZGROZXdUcmFja19sKCk7CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMTQ4OSw3ICsxNjc1LDcgQEAKICAgICB0cmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpTVE9QUEVEOwogICAgIGlmICghdHJhY2tBY3RpdmUpIHsKICAgICAgICAgcmVtb3ZlVHJhY2tfbCh0cmFjayk7Ci0gICAgfSBlbHNlIGlmICh0cmFjay0+aXNGYXN0VHJhY2soKSB8fCB0cmFjay0+aXNPZmZsb2FkZWQoKSkgeworICAgIH0gZWxzZSBpZiAodHJhY2stPmlzRmFzdFRyYWNrKCkgfHwgdHJhY2stPmlzT2ZmbG9hZGVkKCkgfHwgdHJhY2stPmlzRGlyZWN0KCkpIHsKICAgICAgICAgdHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6U1RPUFBJTkdfMTsKICAgICB9CiAKQEAgLTE1NDAsMTIgKzE3MjYsMTEgQEAKICAgICByZXR1cm4gb3V0X3M4OwogfQogCi0vLyBhdWRpb0NvbmZpZ0NoYW5nZWRfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBoZWxkCi12b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmF1ZGlvQ29uZmlnQ2hhbmdlZF9sKGludCBldmVudCwgaW50IHBhcmFtKSB7Cit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmF1ZGlvQ29uZmlnQ2hhbmdlZChpbnQgZXZlbnQsIGludCBwYXJhbSkgewogICAgIEF1ZGlvU3lzdGVtOjpPdXRwdXREZXNjcmlwdG9yIGRlc2M7CiAgICAgdm9pZCAqcGFyYW0yID0gTlVMTDsKIAotICAgIEFMT0dWKCJQbGF5YmFja1RocmVhZDo6YXVkaW9Db25maWdDaGFuZ2VkX2wsIHRocmVhZCAlcCwgZXZlbnQgJWQsIHBhcmFtICVkIiwgdGhpcywgZXZlbnQsCisgICAgQUxPR1YoIlBsYXliYWNrVGhyZWFkOjphdWRpb0NvbmZpZ0NoYW5nZWQsIHRocmVhZCAlcCwgZXZlbnQgJWQsIHBhcmFtICVkIiwgdGhpcywgZXZlbnQsCiAgICAgICAgICAgICBwYXJhbSk7CiAKICAgICBzd2l0Y2ggKGV2ZW50KSB7CkBAIC0xNTU2LDcgKzE3NDEsNyBAQAogICAgICAgICBkZXNjLmZvcm1hdCA9IG1Gb3JtYXQ7CiAgICAgICAgIGRlc2MuZnJhbWVDb3VudCA9IG1Ob3JtYWxGcmFtZUNvdW50OyAvLyBGSVhNRSBzZWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF1ZGlvRmxpbmdlcjo6ZnJhbWVDb3VudChhdWRpb19pb19oYW5kbGVfdCkKLSAgICAgICAgZGVzYy5sYXRlbmN5ID0gbGF0ZW5jeSgpOworICAgICAgICBkZXNjLmxhdGVuY3kgPSBsYXRlbmN5X2woKTsKICAgICAgICAgcGFyYW0yID0gJmRlc2M7CiAgICAgICAgIGJyZWFrOwogCkBAIC0xNTY2LDcgKzE3NTEsNyBAQAogICAgIGRlZmF1bHQ6CiAgICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBtQXVkaW9GbGluZ2VyLT5hdWRpb0NvbmZpZ0NoYW5nZWRfbChldmVudCwgbUlkLCBwYXJhbTIpOworICAgIG1BdWRpb0ZsaW5nZXItPmF1ZGlvQ29uZmlnQ2hhbmdlZChldmVudCwgbUlkLCBwYXJhbTIpOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OndyaXRlQ2FsbGJhY2soKQpAQCAtMTYwMyw3ICsxNzg4LDcgQEAKIAogLy8gc3RhdGljCiBpbnQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6YXN5bmNDYWxsYmFjayhzdHJlYW1fY2FsbGJhY2tfZXZlbnRfdCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcGFyYW0gX191bnVzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb29raWUpCiB7CiAgICAgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZCAqbWUgPSAoQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZCAqKWNvb2tpZTsKQEAgLTE2MjIsMjkgKzE4MDcsMzMgQEAKICAgICByZXR1cm4gMDsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpyZWFkT3V0cHV0UGFyYW1ldGVycygpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnJlYWRPdXRwdXRQYXJhbWV0ZXJzX2woKQogewotICAgIC8vIHVuZm9ydHVuYXRlbHkgd2UgaGF2ZSBubyB3YXkgb2YgcmVjb3ZlcmluZyBmcm9tIGVycm9ycyBoZXJlLCBoZW5jZSB0aGUgTE9HX0ZBVEFMCisgICAgLy8gdW5mb3J0dW5hdGVseSB3ZSBoYXZlIG5vIHdheSBvZiByZWNvdmVyaW5nIGZyb20gZXJyb3JzIGhlcmUsIGhlbmNlIHRoZSBMT0dfQUxXQVlTX0ZBVEFMCiAgICAgbVNhbXBsZVJhdGUgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfc2FtcGxlX3JhdGUoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKTsKICAgICBtQ2hhbm5lbE1hc2sgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfY2hhbm5lbHMoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKTsKICAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9jaGFubmVsKG1DaGFubmVsTWFzaykpIHsKLSAgICAgICAgTE9HX0ZBVEFMKCJIQUwgY2hhbm5lbCBtYXNrICUjeCBub3QgdmFsaWQgZm9yIG91dHB1dCIsIG1DaGFubmVsTWFzayk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIkhBTCBjaGFubmVsIG1hc2sgJSN4IG5vdCB2YWxpZCBmb3Igb3V0cHV0IiwgbUNoYW5uZWxNYXNrKTsKICAgICB9Ci0gICAgaWYgKChtVHlwZSA9PSBNSVhFUiB8fCBtVHlwZSA9PSBEVVBMSUNBVElORykgJiYgbUNoYW5uZWxNYXNrICE9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTykgewotICAgICAgICBMT0dfRkFUQUwoIkhBTCBjaGFubmVsIG1hc2sgJSN4IG5vdCBzdXBwb3J0ZWQgZm9yIG1peGVkIG91dHB1dDsgIgotICAgICAgICAgICAgICAgICJtdXN0IGJlIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIsIG1DaGFubmVsTWFzayk7CisgICAgaWYgKChtVHlwZSA9PSBNSVhFUiB8fCBtVHlwZSA9PSBEVVBMSUNBVElORykKKyAgICAgICAgICAgICYmICFpc1ZhbGlkUGNtU2lua0NoYW5uZWxNYXNrKG1DaGFubmVsTWFzaykpIHsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiSEFMIGNoYW5uZWwgbWFzayAlI3ggbm90IHN1cHBvcnRlZCBmb3IgbWl4ZWQgb3V0cHV0IiwKKyAgICAgICAgICAgICAgICBtQ2hhbm5lbE1hc2spOwogICAgIH0KLSAgICBtQ2hhbm5lbENvdW50ID0gcG9wY291bnQobUNoYW5uZWxNYXNrKTsKLSAgICBtRm9ybWF0ID0gbU91dHB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2Zvcm1hdCgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOworICAgIG1DaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobUNoYW5uZWxNYXNrKTsKKyAgICBtSEFMRm9ybWF0ID0gbU91dHB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2Zvcm1hdCgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOworICAgIG1Gb3JtYXQgPSBtSEFMRm9ybWF0OwogICAgIGlmICghYXVkaW9faXNfdmFsaWRfZm9ybWF0KG1Gb3JtYXQpKSB7Ci0gICAgICAgIExPR19GQVRBTCgiSEFMIGZvcm1hdCAlZCBub3QgdmFsaWQgZm9yIG91dHB1dCIsIG1Gb3JtYXQpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJIQUwgZm9ybWF0ICUjeCBub3QgdmFsaWQgZm9yIG91dHB1dCIsIG1Gb3JtYXQpOwogICAgIH0KLSAgICBpZiAoKG1UeXBlID09IE1JWEVSIHx8IG1UeXBlID09IERVUExJQ0FUSU5HKSAmJiBtRm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7Ci0gICAgICAgIExPR19GQVRBTCgiSEFMIGZvcm1hdCAlZCBub3Qgc3VwcG9ydGVkIGZvciBtaXhlZCBvdXRwdXQ7IG11c3QgYmUgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiLAorICAgIGlmICgobVR5cGUgPT0gTUlYRVIgfHwgbVR5cGUgPT0gRFVQTElDQVRJTkcpCisgICAgICAgICAgICAmJiAhaXNWYWxpZFBjbVNpbmtGb3JtYXQobUZvcm1hdCkpIHsKKyAgICAgICAgTE9HX0ZBVEFMKCJIQUwgZm9ybWF0ICUjeCBub3Qgc3VwcG9ydGVkIGZvciBtaXhlZCBvdXRwdXQiLAogICAgICAgICAgICAgICAgIG1Gb3JtYXQpOwogICAgIH0KLSAgICBtRnJhbWVTaXplID0gYXVkaW9fc3RyZWFtX2ZyYW1lX3NpemUoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKTsKLSAgICBtRnJhbWVDb3VudCA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9idWZmZXJfc2l6ZSgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pIC8gbUZyYW1lU2l6ZTsKKyAgICBtRnJhbWVTaXplID0gYXVkaW9fc3RyZWFtX291dF9mcmFtZV9zaXplKG1PdXRwdXQtPnN0cmVhbSk7CisgICAgbUJ1ZmZlclNpemUgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfYnVmZmVyX3NpemUoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKTsKKyAgICBtRnJhbWVDb3VudCA9IG1CdWZmZXJTaXplIC8gbUZyYW1lU2l6ZTsKICAgICBpZiAobUZyYW1lQ291bnQgJiAxNSkgewogICAgICAgICBBTE9HVygiSEFMIG91dHB1dCBidWZmZXIgc2l6ZSBpcyAldSBmcmFtZXMgYnV0IEF1ZGlvTWl4ZXIgcmVxdWlyZXMgbXVsdGlwbGVzIG9mIDE2IGZyYW1lcyIsCiAgICAgICAgICAgICAgICAgbUZyYW1lQ291bnQpOwpAQCAtMTY1OSwxMiArMTg0OCwxMiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gQ2FsY3VsYXRlIHNpemUgb2Ygbm9ybWFsIG1peCBidWZmZXIgcmVsYXRpdmUgdG8gdGhlIEhBTCBvdXRwdXQgYnVmZmVyIHNpemUKKyAgICAvLyBDYWxjdWxhdGUgc2l6ZSBvZiBub3JtYWwgc2luayBidWZmZXIgcmVsYXRpdmUgdG8gdGhlIEhBTCBvdXRwdXQgYnVmZmVyIHNpemUKICAgICBkb3VibGUgbXVsdGlwbGllciA9IDEuMDsKICAgICBpZiAobVR5cGUgPT0gTUlYRVIgJiYgKGtVc2VGYXN0TWl4ZXIgPT0gRmFzdE1peGVyX1N0YXRpYyB8fAogICAgICAgICAgICAga1VzZUZhc3RNaXhlciA9PSBGYXN0TWl4ZXJfRHluYW1pYykpIHsKLSAgICAgICAgc2l6ZV90IG1pbk5vcm1hbEZyYW1lQ291bnQgPSAoa01pbk5vcm1hbE1peEJ1ZmZlclNpemVNcyAqIG1TYW1wbGVSYXRlKSAvIDEwMDA7Ci0gICAgICAgIHNpemVfdCBtYXhOb3JtYWxGcmFtZUNvdW50ID0gKGtNYXhOb3JtYWxNaXhCdWZmZXJTaXplTXMgKiBtU2FtcGxlUmF0ZSkgLyAxMDAwOworICAgICAgICBzaXplX3QgbWluTm9ybWFsRnJhbWVDb3VudCA9IChrTWluTm9ybWFsU2lua0J1ZmZlclNpemVNcyAqIG1TYW1wbGVSYXRlKSAvIDEwMDA7CisgICAgICAgIHNpemVfdCBtYXhOb3JtYWxGcmFtZUNvdW50ID0gKGtNYXhOb3JtYWxTaW5rQnVmZmVyU2l6ZU1zICogbVNhbXBsZVJhdGUpIC8gMTAwMDsKICAgICAgICAgLy8gcm91bmQgdXAgbWluaW11bSBhbmQgcm91bmQgZG93biBtYXhpbXVtIHRvIG5lYXJlc3QgMTYgZnJhbWVzIHRvIHNhdGlzZnkgQXVkaW9NaXhlcgogICAgICAgICBtaW5Ob3JtYWxGcmFtZUNvdW50ID0gKG1pbk5vcm1hbEZyYW1lQ291bnQgKyAxNSkgJiB+MTU7CiAgICAgICAgIG1heE5vcm1hbEZyYW1lQ291bnQgPSBtYXhOb3JtYWxGcmFtZUNvdW50ICYgfjE1OwpAQCAtMTY4Miw3ICsxODcxLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIHByZWZlciBhbiBldmVuIG11bHRpcGxpZXIsIGZvciBjb21wYXRpYmlsaXR5IHdpdGggZG91Ymxpbmcgb2YgZmFzdCB0cmFja3MgZHVlIHRvIEhBTAotICAgICAgICAgICAgLy8gU1JDIChpdCB3b3VsZCBiZSB1bnVzdWFsIGZvciB0aGUgbm9ybWFsIG1peCBidWZmZXIgc2l6ZSB0byBub3QgYmUgYSBtdWx0aXBsZSBvZiBmYXN0CisgICAgICAgICAgICAvLyBTUkMgKGl0IHdvdWxkIGJlIHVudXN1YWwgZm9yIHRoZSBub3JtYWwgc2luayBidWZmZXIgc2l6ZSB0byBub3QgYmUgYSBtdWx0aXBsZSBvZiBmYXN0CiAgICAgICAgICAgICAvLyB0cmFjaywgYnV0IHdlIHNvbWV0aW1lcyBoYXZlIHRvIGRvIHRoaXMgdG8gc2F0aXNmeSB0aGUgbWF4aW11bSBmcmFtZSBjb3VudAogICAgICAgICAgICAgLy8gY29uc3RyYWludCkKICAgICAgICAgICAgIC8vIEZJWE1FIHRoaXMgcm91bmRpbmcgdXAgc2hvdWxkIG5vdCBiZSBkb25lIGlmIG5vIEhBTCBTUkMKQEAgLTE2OTcsMTkgKzE4ODYsNDMgQEAKICAgICB9CiAgICAgbU5vcm1hbEZyYW1lQ291bnQgPSBtdWx0aXBsaWVyICogbUZyYW1lQ291bnQ7CiAgICAgLy8gcm91bmQgdXAgdG8gbmVhcmVzdCAxNiBmcmFtZXMgdG8gc2F0aXNmeSBBdWRpb01peGVyCi0gICAgbU5vcm1hbEZyYW1lQ291bnQgPSAobU5vcm1hbEZyYW1lQ291bnQgKyAxNSkgJiB+MTU7Ci0gICAgQUxPR0koIkhBTCBvdXRwdXQgYnVmZmVyIHNpemUgJXUgZnJhbWVzLCBub3JtYWwgbWl4IGJ1ZmZlciBzaXplICV1IGZyYW1lcyIsIG1GcmFtZUNvdW50LAorICAgIGlmIChtVHlwZSA9PSBNSVhFUiB8fCBtVHlwZSA9PSBEVVBMSUNBVElORykgeworICAgICAgICBtTm9ybWFsRnJhbWVDb3VudCA9IChtTm9ybWFsRnJhbWVDb3VudCArIDE1KSAmIH4xNTsKKyAgICB9CisgICAgQUxPR0koIkhBTCBvdXRwdXQgYnVmZmVyIHNpemUgJXUgZnJhbWVzLCBub3JtYWwgc2luayBidWZmZXIgc2l6ZSAldSBmcmFtZXMiLCBtRnJhbWVDb3VudCwKICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50KTsKIAotICAgIGRlbGV0ZVtdIG1BbGxvY01peEJ1ZmZlcjsKLSAgICBzaXplX3QgYWxpZ24gPSAobUZyYW1lU2l6ZSA8IHNpemVvZihpbnQxNl90KSkgPyBzaXplb2YoaW50MTZfdCkgOiBtRnJhbWVTaXplOwotICAgIG1BbGxvY01peEJ1ZmZlciA9IG5ldyBpbnQ4X3RbbU5vcm1hbEZyYW1lQ291bnQgKiBtRnJhbWVTaXplICsgYWxpZ24gLSAxXTsKLSAgICBtTWl4QnVmZmVyID0gKGludDE2X3QgKikgKCgoKHNpemVfdCltQWxsb2NNaXhCdWZmZXIgKyBhbGlnbiAtIDEpIC8gYWxpZ24pICogYWxpZ24pOwotICAgIG1lbXNldChtTWl4QnVmZmVyLCAwLCBtTm9ybWFsRnJhbWVDb3VudCAqIG1GcmFtZVNpemUpOworICAgIC8vIG1TaW5rQnVmZmVyIGlzIHRoZSBzaW5rIGJ1ZmZlci4gIFNpemUgaXMgYWx3YXlzIG11bHRpcGxlLW9mLTE2IGZyYW1lcy4KKyAgICAvLyBPcmlnaW5hbGx5IHRoaXMgd2FzIGludDE2X3RbXSBhcnJheSwgbmVlZCB0byByZW1vdmUgbGVnYWN5IGltcGxpY2F0aW9ucy4KKyAgICBmcmVlKG1TaW5rQnVmZmVyKTsKKyAgICBtU2lua0J1ZmZlciA9IE5VTEw7CisgICAgLy8gRm9yIHNpbmsgYnVmZmVyIHNpemUsIHdlIHVzZSB0aGUgZnJhbWUgc2l6ZSBmcm9tIHRoZSBkb3duc3RyZWFtIHNpbmsgdG8gYXZvaWQgcHJvYmxlbXMKKyAgICAvLyB3aXRoIG5vbiBQQ00gZm9ybWF0cyBmb3IgY29tcHJlc3NlZCBtdXNpYywgZS5nLiBBQUMsIGFuZCBPZmZsb2FkIHRocmVhZHMuCisgICAgY29uc3Qgc2l6ZV90IHNpbmtCdWZmZXJTaXplID0gbU5vcm1hbEZyYW1lQ291bnQgKiBtRnJhbWVTaXplOworICAgICh2b2lkKXBvc2l4X21lbWFsaWduKCZtU2lua0J1ZmZlciwgMzIsIHNpbmtCdWZmZXJTaXplKTsKKworICAgIC8vIFdlIHJlc2l6ZSB0aGUgbU1peGVyQnVmZmVyIGFjY29yZGluZyB0byB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoZSBzaW5rIGJ1ZmZlciB3aGljaAorICAgIC8vIGRyaXZlcyB0aGUgb3V0cHV0LgorICAgIGZyZWUobU1peGVyQnVmZmVyKTsKKyAgICBtTWl4ZXJCdWZmZXIgPSBOVUxMOworICAgIGlmIChtTWl4ZXJCdWZmZXJFbmFibGVkKSB7CisgICAgICAgIG1NaXhlckJ1ZmZlckZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7IC8vIGFsc28gdmFsaWQ6IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULgorICAgICAgICBtTWl4ZXJCdWZmZXJTaXplID0gbU5vcm1hbEZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50CisgICAgICAgICAgICAgICAgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKG1NaXhlckJ1ZmZlckZvcm1hdCk7CisgICAgICAgICh2b2lkKXBvc2l4X21lbWFsaWduKCZtTWl4ZXJCdWZmZXIsIDMyLCBtTWl4ZXJCdWZmZXJTaXplKTsKKyAgICB9CisgICAgZnJlZShtRWZmZWN0QnVmZmVyKTsKKyAgICBtRWZmZWN0QnVmZmVyID0gTlVMTDsKKyAgICBpZiAobUVmZmVjdEJ1ZmZlckVuYWJsZWQpIHsKKyAgICAgICAgbUVmZmVjdEJ1ZmZlckZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOyAvLyBOb3RlOiBFZmZlY3RzIHN1cHBvcnQgMTZiIG9ubHkKKyAgICAgICAgbUVmZmVjdEJ1ZmZlclNpemUgPSBtTm9ybWFsRnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnQKKyAgICAgICAgICAgICAgICAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobUVmZmVjdEJ1ZmZlckZvcm1hdCk7CisgICAgICAgICh2b2lkKXBvc2l4X21lbWFsaWduKCZtRWZmZWN0QnVmZmVyLCAzMiwgbUVmZmVjdEJ1ZmZlclNpemUpOworICAgIH0KIAogICAgIC8vIGZvcmNlIHJlY29uZmlndXJhdGlvbiBvZiBlZmZlY3QgY2hhaW5zIGFuZCBlbmdpbmVzIHRvIHRha2UgbmV3IGJ1ZmZlciBzaXplIGFuZCBhdWRpbwogICAgIC8vIHBhcmFtZXRlcnMgaW50byBhY2NvdW50Ci0gICAgLy8gTm90ZSB0aGF0IG1Mb2NrIGlzIG5vdCBoZWxkIHdoZW4gcmVhZE91dHB1dFBhcmFtZXRlcnMoKSBpcyBjYWxsZWQgZnJvbSB0aGUgY29uc3RydWN0b3IKKyAgICAvLyBOb3RlIHRoYXQgbUxvY2sgaXMgbm90IGhlbGQgd2hlbiByZWFkT3V0cHV0UGFyYW1ldGVyc19sKCkgaXMgY2FsbGVkIGZyb20gdGhlIGNvbnN0cnVjdG9yCiAgICAgLy8gYnV0IGluIHRoaXMgY2FzZSBub3RoaW5nIGlzIGRvbmUgYmVsb3cgYXMgbm8gYXVkaW8gc2Vzc2lvbnMgaGF2ZSBlZmZlY3QgeWV0IHNvIGl0IGRvZXNuJ3QKICAgICAvLyBtYXR0ZXIuCiAgICAgLy8gY3JlYXRlIGEgY29weSBvZiBtRWZmZWN0Q2hhaW5zIGFzIGNhbGxpbmcgbW92ZUVmZmVjdENoYWluX2woKSBjYW4gcmVvcmRlciBzb21lIGVmZmVjdCBjaGFpbnMKQEAgLTE3MjAsNyArMTkzMyw3IEBACiB9CiAKIAotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6Z2V0UmVuZGVyUG9zaXRpb24oc2l6ZV90ICpoYWxGcmFtZXMsIHNpemVfdCAqZHNwRnJhbWVzKQorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6Z2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmhhbEZyYW1lcywgdWludDMyX3QgKmRzcEZyYW1lcykKIHsKICAgICBpZiAoaGFsRnJhbWVzID09IE5VTEwgfHwgZHNwRnJhbWVzID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTE3MzgsNyArMTk1MSwxMSBAQAogICAgICAgICAqZHNwRnJhbWVzID0gZnJhbWVzV3JpdHRlbiA+PSBsYXRlbmN5RnJhbWVzID8gZnJhbWVzV3JpdHRlbiAtIGxhdGVuY3lGcmFtZXMgOiAwOwogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG1PdXRwdXQtPnN0cmVhbS0+Z2V0X3JlbmRlcl9wb3NpdGlvbihtT3V0cHV0LT5zdHJlYW0sIGRzcEZyYW1lcyk7CisgICAgICAgIHN0YXR1c190IHN0YXR1czsKKyAgICAgICAgdWludDMyX3QgZnJhbWVzOworICAgICAgICBzdGF0dXMgPSBtT3V0cHV0LT5zdHJlYW0tPmdldF9yZW5kZXJfcG9zaXRpb24obU91dHB1dC0+c3RyZWFtLCAmZnJhbWVzKTsKKyAgICAgICAgKmRzcEZyYW1lcyA9IChzaXplX3QpZnJhbWVzOworICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIH0KIApAQCAtMTgzOSwxMCArMjA1NiwxMCBAQAogICAgICAgICBjb25zdCBWZWN0b3I8IHNwPFRyYWNrPiA+JiB0cmFja3NUb1JlbW92ZSkKIHsKICAgICBzaXplX3QgY291bnQgPSB0cmFja3NUb1JlbW92ZS5zaXplKCk7Ci0gICAgaWYgKGNvdW50KSB7CisgICAgaWYgKGNvdW50ID4gMCkgewogICAgICAgICBmb3IgKHNpemVfdCBpID0gMCA7IGkgPCBjb3VudCA7IGkrKykgewogICAgICAgICAgICAgY29uc3Qgc3A8VHJhY2s+JiB0cmFjayA9IHRyYWNrc1RvUmVtb3ZlLml0ZW1BdChpKTsKLSAgICAgICAgICAgIGlmICghdHJhY2stPmlzT3V0cHV0VHJhY2soKSkgeworICAgICAgICAgICAgaWYgKHRyYWNrLT5pc0V4dGVybmFsVHJhY2soKSkgewogICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wT3V0cHV0KG1JZCwgdHJhY2stPnN0cmVhbVR5cGUoKSwgdHJhY2stPnNlc3Npb25JZCgpKTsKICNpZmRlZiBBRERfQkFUVEVSWV9EQVRBCiAgICAgICAgICAgICAgICAgLy8gdG8gdHJhY2sgdGhlIHNwZWFrZXIgdXNhZ2UKQEAgLTE4ODAsMTIgKzIwOTcsMTMgQEAKICAgICBtTGFzdFdyaXRlVGltZSA9IHN5c3RlbVRpbWUoKTsKICAgICBtSW5Xcml0ZSA9IHRydWU7CiAgICAgc3NpemVfdCBieXRlc1dyaXR0ZW47CisgICAgY29uc3Qgc2l6ZV90IG9mZnNldCA9IG1DdXJyZW50V3JpdGVMZW5ndGggLSBtQnl0ZXNSZW1haW5pbmc7CiAKICAgICAvLyBJZiBhbiBOQkFJTyBzaW5rIGlzIHByZXNlbnQsIHVzZSBpdCB0byB3cml0ZSB0aGUgbm9ybWFsIG1peGVyJ3Mgc3VibWl4CiAgICAgaWYgKG1Ob3JtYWxTaW5rICE9IDApIHsKLSNkZWZpbmUgbUJpdFNoaWZ0IDIgLy8gRklYTUUKLSAgICAgICAgc2l6ZV90IGNvdW50ID0gbUJ5dGVzUmVtYWluaW5nID4+IG1CaXRTaGlmdDsKLSAgICAgICAgc2l6ZV90IG9mZnNldCA9IChtQ3VycmVudFdyaXRlTGVuZ3RoIC0gbUJ5dGVzUmVtYWluaW5nKSA+PiAxOworCisgICAgICAgIGNvbnN0IHNpemVfdCBjb3VudCA9IG1CeXRlc1JlbWFpbmluZyAvIG1GcmFtZVNpemU7CisKICAgICAgICAgQVRSQUNFX0JFR0lOKCJ3cml0ZSIpOwogICAgICAgICAvLyB1cGRhdGUgdGhlIHNldHBvaW50IHdoZW4gQXVkaW9GbGluZ2VyOjptU2NyZWVuU3RhdGUgY2hhbmdlcwogICAgICAgICB1aW50MzJfdCBzY3JlZW5TdGF0ZSA9IEF1ZGlvRmxpbmdlcjo6bVNjcmVlblN0YXRlOwpAQCAtMTg5NywxMCArMjExNSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKHBpcGUtPm1heEZyYW1lcygpICogNykgLyA4IDogbU5vcm1hbEZyYW1lQ291bnQgKiAyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBzc2l6ZV90IGZyYW1lc1dyaXR0ZW4gPSBtTm9ybWFsU2luay0+d3JpdGUobU1peEJ1ZmZlciArIG9mZnNldCwgY291bnQpOworICAgICAgICBzc2l6ZV90IGZyYW1lc1dyaXR0ZW4gPSBtTm9ybWFsU2luay0+d3JpdGUoKGNoYXIgKiltU2lua0J1ZmZlciArIG9mZnNldCwgY291bnQpOwogICAgICAgICBBVFJBQ0VfRU5EKCk7CiAgICAgICAgIGlmIChmcmFtZXNXcml0dGVuID4gMCkgewotICAgICAgICAgICAgYnl0ZXNXcml0dGVuID0gZnJhbWVzV3JpdHRlbiA8PCBtQml0U2hpZnQ7CisgICAgICAgICAgICBieXRlc1dyaXR0ZW4gPSBmcmFtZXNXcml0dGVuICogbUZyYW1lU2l6ZTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGJ5dGVzV3JpdHRlbiA9IGZyYW1lc1dyaXR0ZW47CiAgICAgICAgIH0KQEAgLTE5MDksMTMgKzIxMjcsMTQgQEAKICAgICAgICAgICAgIHNpemVfdCB0b3RhbEZyYW1lc1dyaXR0ZW4gPSBtTm9ybWFsU2luay0+ZnJhbWVzV3JpdHRlbigpOwogICAgICAgICAgICAgaWYgKHRvdGFsRnJhbWVzV3JpdHRlbiA+PSBtTGF0Y2hELm1UaW1lc3RhbXAubVBvc2l0aW9uKSB7CiAgICAgICAgICAgICAgICAgbUxhdGNoRC5tVW5wcmVzZW50ZWRGcmFtZXMgPSB0b3RhbEZyYW1lc1dyaXR0ZW4gLSBtTGF0Y2hELm1UaW1lc3RhbXAubVBvc2l0aW9uOworICAgICAgICAgICAgICAgIC8vIG1MYXRjaEQubUZyYW1lc1JlbGVhc2VkIGlzIHNldCBpbW1lZGlhdGVseSBiZWZvcmUgRCBpcyBjbG9ja2VkIGludG8gUQogICAgICAgICAgICAgICAgIG1MYXRjaERWYWxpZCA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAvLyBvdGhlcndpc2UgdXNlIHRoZSBIQUwgLyBBdWRpb1N0cmVhbU91dCBkaXJlY3RseQogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIERpcmVjdCBvdXRwdXQgYW5kIG9mZmxvYWQgdGhyZWFkcwotICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gKG1DdXJyZW50V3JpdGVMZW5ndGggLSBtQnl0ZXNSZW1haW5pbmcpOworCiAgICAgICAgIGlmIChtVXNlQXN5bmNXcml0ZSkgewogICAgICAgICAgICAgQUxPR1dfSUYobVdyaXRlQWNrU2VxdWVuY2UgJiAxLCAidGhyZWFkTG9vcF93cml0ZSgpOiBvdXQgb2Ygc2VxdWVuY2Ugd3JpdGUgcmVxdWVzdCIpOwogICAgICAgICAgICAgbVdyaXRlQWNrU2VxdWVuY2UgKz0gMjsKQEAgLTE5MjYsNyArMjE0NSw3IEBACiAgICAgICAgIC8vIEZJWE1FIFdlIHNob3VsZCBoYXZlIGFuIGltcGxlbWVudGF0aW9uIG9mIHRpbWVzdGFtcHMgZm9yIGRpcmVjdCBvdXRwdXQgdGhyZWFkcy4KICAgICAgICAgLy8gVGhleSBhcmUgdXNlZCBlLmcgZm9yIG11bHRpY2hhbm5lbCBQQ00gcGxheWJhY2sgb3ZlciBIRE1JLgogICAgICAgICBieXRlc1dyaXR0ZW4gPSBtT3V0cHV0LT5zdHJlYW0tPndyaXRlKG1PdXRwdXQtPnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopbU1peEJ1ZmZlciArIG9mZnNldCwgbUJ5dGVzUmVtYWluaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopbVNpbmtCdWZmZXIgKyBvZmZzZXQsIG1CeXRlc1JlbWFpbmluZyk7CiAgICAgICAgIGlmIChtVXNlQXN5bmNXcml0ZSAmJgogICAgICAgICAgICAgICAgICgoYnl0ZXNXcml0dGVuIDwgMCkgfHwgKGJ5dGVzV3JpdHRlbiA9PSAoc3NpemVfdCltQnl0ZXNSZW1haW5pbmcpKSkgewogICAgICAgICAgICAgLy8gZG8gbm90IHdhaXQgZm9yIGFzeW5jIGNhbGxiYWNrIGluIGNhc2Ugb2YgZXJyb3Igb2YgZnVsbCB3cml0ZQpAQCAtMTk2NSw3ICsyMTg0LDcgQEAKIAogLyoKIFRoZSBkZXJpdmVkIHZhbHVlcyB0aGF0IGFyZSBjYWNoZWQ6Ci0gLSBtaXhCdWZmZXJTaXplIGZyb20gZnJhbWUgY291bnQgKiBmcmFtZSBzaXplCisgLSBtU2lua0J1ZmZlclNpemUgZnJvbSBmcmFtZSBjb3VudCAqIGZyYW1lIHNpemUKICAtIGFjdGl2ZVNsZWVwVGltZSBmcm9tIGFjdGl2ZVNsZWVwVGltZVVzKCkKICAtIGlkbGVTbGVlcFRpbWUgZnJvbSBpZGxlU2xlZXBUaW1lVXMoKQogIC0gc3RhbmRieURlbGF5IGZyb20gbUFjdGl2ZVNsZWVwVGltZVVzIChESVJFQ1Qgb25seSkKQEAgLTE5ODQsNyArMjIwMyw3IEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6Y2FjaGVQYXJhbWV0ZXJzX2woKQogewotICAgIG1peEJ1ZmZlclNpemUgPSBtTm9ybWFsRnJhbWVDb3VudCAqIG1GcmFtZVNpemU7CisgICAgbVNpbmtCdWZmZXJTaXplID0gbU5vcm1hbEZyYW1lQ291bnQgKiBtRnJhbWVTaXplOwogICAgIGFjdGl2ZVNsZWVwVGltZSA9IGFjdGl2ZVNsZWVwVGltZVVzKCk7CiAgICAgaWRsZVNsZWVwVGltZSA9IGlkbGVTbGVlcFRpbWVVcygpOwogfQpAQCAtMjAwNywxMyArMjIyNiwxNCBAQAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6YWRkRWZmZWN0Q2hhaW5fbChjb25zdCBzcDxFZmZlY3RDaGFpbj4mIGNoYWluKQogewogICAgIGludCBzZXNzaW9uID0gY2hhaW4tPnNlc3Npb25JZCgpOwotICAgIGludDE2X3QgKmJ1ZmZlciA9IG1NaXhCdWZmZXI7CisgICAgaW50MTZfdCogYnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90Kj4obUVmZmVjdEJ1ZmZlckVuYWJsZWQKKyAgICAgICAgICAgID8gbUVmZmVjdEJ1ZmZlciA6IG1TaW5rQnVmZmVyKTsKICAgICBib29sIG93bnNCdWZmZXIgPSBmYWxzZTsKIAogICAgIEFMT0dWKCJhZGRFZmZlY3RDaGFpbl9sKCkgJXAgb24gdGhyZWFkICVwIGZvciBzZXNzaW9uICVkIiwgY2hhaW4uZ2V0KCksIHRoaXMsIHNlc3Npb24pOwogICAgIGlmIChzZXNzaW9uID4gMCkgewogICAgICAgICAvLyBPbmx5IG9uZSBlZmZlY3QgY2hhaW4gY2FuIGJlIHByZXNlbnQgaW4gZGlyZWN0IG91dHB1dCB0aHJlYWQgYW5kIGl0IHVzZXMKLSAgICAgICAgLy8gdGhlIG1peCBidWZmZXIgYXMgaW5wdXQKKyAgICAgICAgLy8gdGhlIHNpbmsgYnVmZmVyIGFzIGlucHV0CiAgICAgICAgIGlmIChtVHlwZSAhPSBESVJFQ1QpIHsKICAgICAgICAgICAgIHNpemVfdCBudW1TYW1wbGVzID0gbU5vcm1hbEZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50OwogICAgICAgICAgICAgYnVmZmVyID0gbmV3IGludDE2X3RbbnVtU2FtcGxlc107CkBAIC0yMDQ1LDkgKzIyNjUsMTAgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLQorICAgIGNoYWluLT5zZXRUaHJlYWQodGhpcyk7CiAgICAgY2hhaW4tPnNldEluQnVmZmVyKGJ1ZmZlciwgb3duc0J1ZmZlcik7Ci0gICAgY2hhaW4tPnNldE91dEJ1ZmZlcihtTWl4QnVmZmVyKTsKKyAgICBjaGFpbi0+c2V0T3V0QnVmZmVyKHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCo+KG1FZmZlY3RCdWZmZXJFbmFibGVkCisgICAgICAgICAgICA/IG1FZmZlY3RCdWZmZXIgOiBtU2lua0J1ZmZlcikpOwogICAgIC8vIEVmZmVjdCBjaGFpbiBmb3Igc2Vzc2lvbiBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSBpcyBpbnNlcnRlZCBhdCBlbmQgb2YgZWZmZWN0CiAgICAgLy8gY2hhaW5zIGxpc3QgaW4gb3JkZXIgdG8gYmUgcHJvY2Vzc2VkIGxhc3QgYXMgaXQgY29udGFpbnMgb3V0cHV0IHN0YWdlIGVmZmVjdHMKICAgICAvLyBFZmZlY3QgY2hhaW4gZm9yIHNlc3Npb24gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYIGlzIGluc2VydGVkIGJlZm9yZQpAQCAtMjA5Nyw3ICsyMzE4LDcgQEAKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7ICsraSkgewogICAgICAgICAgICAgICAgIHNwPFRyYWNrPiB0cmFjayA9IG1UcmFja3NbaV07CiAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gdHJhY2stPnNlc3Npb25JZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zZXRNYWluQnVmZmVyKG1NaXhCdWZmZXIpOworICAgICAgICAgICAgICAgICAgICB0cmFjay0+c2V0TWFpbkJ1ZmZlcihyZWludGVycHJldF9jYXN0PGludDE2X3QqPihtU2lua0J1ZmZlcikpOwogICAgICAgICAgICAgICAgICAgICBjaGFpbi0+ZGVjVHJhY2tDbnQoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0yMTg3LDI4ICsyNDA4LDM2IEBACiAKICAgICAgICAgVmVjdG9yPCBzcDxFZmZlY3RDaGFpbj4gPiBlZmZlY3RDaGFpbnM7CiAKLSAgICAgICAgcHJvY2Vzc0NvbmZpZ0V2ZW50cygpOwotCiAgICAgICAgIHsgLy8gc2NvcGUgZm9yIG1Mb2NrCiAKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAKKyAgICAgICAgICAgIHByb2Nlc3NDb25maWdFdmVudHNfbCgpOworCiAgICAgICAgICAgICBpZiAobG9nU3RyaW5nICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBtTkJMb2dXcml0ZXItPmxvZ1RpbWVzdGFtcCgpOwogICAgICAgICAgICAgICAgIG1OQkxvZ1dyaXRlci0+bG9nKGxvZ1N0cmluZyk7CiAgICAgICAgICAgICAgICAgbG9nU3RyaW5nID0gTlVMTDsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgLy8gR2F0aGVyIHRoZSBmcmFtZXNSZWxlYXNlZCBjb3VudGVycyBmb3IgYWxsIGFjdGl2ZSB0cmFja3MsCisgICAgICAgICAgICAvLyBhbmQgbGF0Y2ggdGhlbSBhdG9taWNhbGx5IHdpdGggdGhlIHRpbWVzdGFtcC4KKyAgICAgICAgICAgIC8vIEZJWE1FIFdlJ3JlIHVzaW5nIHJhdyBwb2ludGVycyBhcyBpbmRpY2VzLiBBIHVuaXF1ZSB0cmFjayBJRCB3b3VsZCBiZSBhIGJldHRlciBpbmRleC4KKyAgICAgICAgICAgIG1MYXRjaEQubUZyYW1lc1JlbGVhc2VkLmNsZWFyKCk7CisgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IG1BY3RpdmVUcmFja3Muc2l6ZSgpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzcDxUcmFjaz4gdCA9IG1BY3RpdmVUcmFja3NbaV0ucHJvbW90ZSgpOworICAgICAgICAgICAgICAgIGlmICh0ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbUxhdGNoRC5tRnJhbWVzUmVsZWFzZWQuYWRkKHQuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzUmVsZWFzZWQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG1MYXRjaERWYWxpZCkgewogICAgICAgICAgICAgICAgIG1MYXRjaFEgPSBtTGF0Y2hEOwogICAgICAgICAgICAgICAgIG1MYXRjaERWYWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIG1MYXRjaFFWYWxpZCA9IHRydWU7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChjaGVja0Zvck5ld1BhcmFtZXRlcnNfbCgpKSB7Ci0gICAgICAgICAgICAgICAgY2FjaGVQYXJhbWV0ZXJzX2woKTsKLSAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgc2F2ZU91dHB1dFRyYWNrcygpOwogICAgICAgICAgICAgaWYgKG1TaWduYWxQZW5kaW5nKSB7CiAgICAgICAgICAgICAgICAgLy8gQSBzaWduYWwgd2FzIHJhaXNlZCB3aGlsZSB3ZSB3ZXJlIHVubG9ja2VkCkBAIC0yMzAwLDE0ICsyNTI5LDMyIEBACiAgICAgICAgICAgICAgICAgLy8gbXVzdCBiZSB3cml0dGVuIHRvIEhBTAogICAgICAgICAgICAgICAgIHRocmVhZExvb3Bfc2xlZXBUaW1lKCk7CiAgICAgICAgICAgICAgICAgaWYgKHNsZWVwVGltZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50V3JpdGVMZW5ndGggPSBtaXhCdWZmZXJTaXplOworICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFdyaXRlTGVuZ3RoID0gbVNpbmtCdWZmZXJTaXplOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEVpdGhlciB0aHJlYWRMb29wX21peCgpIG9yIHRocmVhZExvb3Bfc2xlZXBUaW1lKCkgc2hvdWxkIGhhdmUgc2V0CisgICAgICAgICAgICAvLyBtTWl4ZXJCdWZmZXIgd2l0aCBkYXRhIGlmIG1NaXhlckJ1ZmZlclZhbGlkIGlzIHRydWUgYW5kIHNsZWVwVGltZSA9PSAwLgorICAgICAgICAgICAgLy8gTWVyZ2UgbU1peGVyQnVmZmVyIGRhdGEgaW50byBtRWZmZWN0QnVmZmVyIChpZiBhbnkgZWZmZWN0cyBhcmUgdmFsaWQpCisgICAgICAgICAgICAvLyBvciBtU2lua0J1ZmZlciAoaWYgdGhlcmUgYXJlIG5vIGVmZmVjdHMpLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFRoaXMgaXMgZG9uZSBwcmUtZWZmZWN0cyBjb21wdXRhdGlvbjsgaWYgZWZmZWN0cyBjaGFuZ2UgdG8KKyAgICAgICAgICAgIC8vIHN1cHBvcnQgaGlnaGVyIHByZWNpc2lvbiwgdGhpcyBuZWVkcyB0byBtb3ZlLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIG1NaXhlckJ1ZmZlclZhbGlkIGlzIG9ubHkgc2V0IHRydWUgYnkgTWl4ZXJUaHJlYWQ6OnByZXBhcmVUcmFja3NfbCgpLgorICAgICAgICAgICAgLy8gVE9ETyB1c2Ugc2xlZXBUaW1lID09IDAgYXMgYW4gYWRkaXRpb25hbCBjb25kaXRpb24uCisgICAgICAgICAgICBpZiAobU1peGVyQnVmZmVyVmFsaWQpIHsKKyAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIgPSBtRWZmZWN0QnVmZmVyVmFsaWQgPyBtRWZmZWN0QnVmZmVyIDogbVNpbmtCdWZmZXI7CisgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gbUVmZmVjdEJ1ZmZlclZhbGlkID8gbUVmZmVjdEJ1ZmZlckZvcm1hdCA6IG1Gb3JtYXQ7CisKKyAgICAgICAgICAgICAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KGJ1ZmZlciwgZm9ybWF0LCBtTWl4ZXJCdWZmZXIsIG1NaXhlckJ1ZmZlckZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIG1CeXRlc1JlbWFpbmluZyA9IG1DdXJyZW50V3JpdGVMZW5ndGg7CiAgICAgICAgICAgICBpZiAoaXNTdXNwZW5kZWQoKSkgewogICAgICAgICAgICAgICAgIHNsZWVwVGltZSA9IHN1c3BlbmRTbGVlcFRpbWVVcygpOwogICAgICAgICAgICAgICAgIC8vIHNpbXVsYXRlIHdyaXRlIHRvIEhBTCB3aGVuIHN1c3BlbmRlZAotICAgICAgICAgICAgICAgIG1CeXRlc1dyaXR0ZW4gKz0gbWl4QnVmZmVyU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnl0ZXNXcml0dGVuICs9IG1TaW5rQnVmZmVyU2l6ZTsKICAgICAgICAgICAgICAgICBtQnl0ZXNSZW1haW5pbmcgPSAwOwogICAgICAgICAgICAgfQogCkBAIC0yMzI4LDYgKzI1NzUsMTYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIC8vIE9ubHkgaWYgdGhlIEVmZmVjdHMgYnVmZmVyIGlzIGVuYWJsZWQgYW5kIHRoZXJlIGlzIGRhdGEgaW4gdGhlCisgICAgICAgIC8vIEVmZmVjdHMgYnVmZmVyIChidWZmZXIgdmFsaWQpLCB3ZSBuZWVkIHRvCisgICAgICAgIC8vIGNvcHkgaW50byB0aGUgc2luayBidWZmZXIuCisgICAgICAgIC8vIFRPRE8gdXNlIHNsZWVwVGltZSA9PSAwIGFzIGFuIGFkZGl0aW9uYWwgY29uZGl0aW9uLgorICAgICAgICBpZiAobUVmZmVjdEJ1ZmZlclZhbGlkKSB7CisgICAgICAgICAgICAvL0FMT0dWKCJ3cml0aW5nIGVmZmVjdCBidWZmZXIgdG8gc2luayBidWZmZXIgZm9ybWF0ICUjeCIsIG1Gb3JtYXQpOworICAgICAgICAgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdChtU2lua0J1ZmZlciwgbUZvcm1hdCwgbUVmZmVjdEJ1ZmZlciwgbUVmZmVjdEJ1ZmZlckZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgbU5vcm1hbEZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50KTsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIGVuYWJsZSBjaGFuZ2VzIGluIGVmZmVjdCBjaGFpbgogICAgICAgICB1bmxvY2tFZmZlY3RDaGFpbnMoZWZmZWN0Q2hhaW5zKTsKIApAQCAtMjM0NiwyMCArMjYwMywyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKG1NaXhlclN0YXR1cyA9PSBNSVhFUl9EUkFJTl9BTEwpKSB7CiAgICAgICAgICAgICAgICAgICAgIHRocmVhZExvb3BfZHJhaW4oKTsKICAgICAgICAgICAgICAgICB9Ci1pZiAobVR5cGUgPT0gTUlYRVIpIHsKLSAgICAgICAgICAgICAgICAvLyB3cml0ZSBibG9ja2VkIGRldGVjdGlvbgotICAgICAgICAgICAgICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZSgpOwotICAgICAgICAgICAgICAgIG5zZWNzX3QgZGVsdGEgPSBub3cgLSBtTGFzdFdyaXRlVGltZTsKLSAgICAgICAgICAgICAgICBpZiAoIW1TdGFuZGJ5ICYmIGRlbHRhID4gbWF4UGVyaW9kKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1OdW1EZWxheWVkV3JpdGVzKys7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgobm93IC0gbGFzdFdhcm5pbmcpID4ga1dhcm5pbmdUaHJvdHRsZU5zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBVFJBQ0VfTkFNRSgidW5kZXJydW4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJ3cml0ZSBibG9ja2VkIGZvciAlbGx1IG1zZWNzLCAlZCBkZWxheWVkIHdyaXRlcywgdGhyZWFkICVwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnMybXMoZGVsdGEpLCBtTnVtRGVsYXllZFdyaXRlcywgdGhpcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYXN0V2FybmluZyA9IG5vdzsKKyAgICAgICAgICAgICAgICBpZiAobVR5cGUgPT0gTUlYRVIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgYmxvY2tlZCBkZXRlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICAgICAgICAgICAgIG5zZWNzX3QgZGVsdGEgPSBub3cgLSBtTGFzdFdyaXRlVGltZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtU3RhbmRieSAmJiBkZWx0YSA+IG1heFBlcmlvZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbU51bURlbGF5ZWRXcml0ZXMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobm93IC0gbGFzdFdhcm5pbmcpID4ga1dhcm5pbmdUaHJvdHRsZU5zKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRSQUNFX05BTUUoInVuZGVycnVuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIndyaXRlIGJsb2NrZWQgZm9yICVsbHUgbXNlY3MsICVkIGRlbGF5ZWQgd3JpdGVzLCB0aHJlYWQgJXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnMybXMoZGVsdGEpLCBtTnVtRGVsYXllZFdyaXRlcywgdGhpcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFdhcm5pbmcgPSBub3c7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci19CiAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgdXNsZWVwKHNsZWVwVGltZSk7CkBAIC0yMzg3LDEyICsyNjQ0LDkgQEAKIAogICAgIHRocmVhZExvb3BfZXhpdCgpOwogCi0gICAgLy8gZm9yIER1cGxpY2F0aW5nVGhyZWFkLCBzdGFuZGJ5IG1vZGUgaXMgaGFuZGxlZCBieSB0aGUgb3V0cHV0VHJhY2tzLCBvdGhlcndpc2UgLi4uCi0gICAgaWYgKG1UeXBlID09IE1JWEVSIHx8IG1UeXBlID09IERJUkVDVCB8fCBtVHlwZSA9PSBPRkZMT0FEKSB7Ci0gICAgICAgIC8vIHB1dCBvdXRwdXQgc3RyZWFtIGludG8gc3RhbmRieSBtb2RlCi0gICAgICAgIGlmICghbVN0YW5kYnkpIHsKLSAgICAgICAgICAgIG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLnN0YW5kYnkoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKTsKLSAgICAgICAgfQorICAgIGlmICghbVN0YW5kYnkpIHsKKyAgICAgICAgdGhyZWFkTG9vcF9zdGFuZGJ5KCk7CisgICAgICAgIG1TdGFuZGJ5ID0gdHJ1ZTsKICAgICB9CiAKICAgICByZWxlYXNlV2FrZUxvY2soKTsKQEAgLTI0MDcsNyArMjY2MSw3IEBACiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnJlbW92ZVRyYWNrc19sKGNvbnN0IFZlY3Rvcjwgc3A8VHJhY2s+ID4mIHRyYWNrc1RvUmVtb3ZlKQogewogICAgIHNpemVfdCBjb3VudCA9IHRyYWNrc1RvUmVtb3ZlLnNpemUoKTsKLSAgICBpZiAoY291bnQpIHsKKyAgICBpZiAoY291bnQgPiAwKSB7CiAgICAgICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8Y291bnQgOyBpKyspIHsKICAgICAgICAgICAgIGNvbnN0IHNwPFRyYWNrPiYgdHJhY2sgPSB0cmFja3NUb1JlbW92ZS5pdGVtQXQoaSk7CiAgICAgICAgICAgICBtQWN0aXZlVHJhY2tzLnJlbW92ZSh0cmFjayk7CkBAIC0yNDMzLDcgKzI2ODcsNyBAQAogICAgIGlmIChtTm9ybWFsU2luayAhPSAwKSB7CiAgICAgICAgIHJldHVybiBtTm9ybWFsU2luay0+Z2V0VGltZXN0YW1wKHRpbWVzdGFtcCk7CiAgICAgfQotICAgIGlmIChtVHlwZSA9PSBPRkZMT0FEICYmIG1PdXRwdXQtPnN0cmVhbS0+Z2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbikgeworICAgIGlmICgobVR5cGUgPT0gT0ZGTE9BRCB8fCBtVHlwZSA9PSBESVJFQ1QpICYmIG1PdXRwdXQtPnN0cmVhbS0+Z2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbikgewogICAgICAgICB1aW50NjRfdCBwb3NpdGlvbjY0OwogICAgICAgICBpbnQgcmV0ID0gbU91dHB1dC0+c3RyZWFtLT5nZXRfcHJlc2VudGF0aW9uX3Bvc2l0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dC0+c3RyZWFtLCAmcG9zaXRpb242NCwgJnRpbWVzdGFtcC5tVGltZSk7CkBAIC0yNDQ0LDYgKzI2OTgsNjcgQEAKICAgICB9CiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpjcmVhdGVBdWRpb1BhdGNoX2woY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIGlmIChtT3V0cHV0LT5hdWRpb0h3RGV2LT52ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgeworICAgICAgICAvLyBzdG9yZSBuZXcgZGV2aWNlIGFuZCBzZW5kIHRvIGVmZmVjdHMKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBwYXRjaC0+bnVtX3NpbmtzOyBpKyspIHsKKyAgICAgICAgICAgIHR5cGUgfD0gcGF0Y2gtPnNpbmtzW2ldLmV4dC5kZXZpY2UudHlwZTsKKyAgICAgICAgfQorICAgICAgICBtT3V0RGV2aWNlID0gdHlwZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0Q2hhaW5zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBtRWZmZWN0Q2hhaW5zW2ldLT5zZXREZXZpY2VfbChtT3V0RGV2aWNlKTsKKyAgICAgICAgfQorCisgICAgICAgIGF1ZGlvX2h3X2RldmljZV90ICpod0RldmljZSA9IG1PdXRwdXQtPmF1ZGlvSHdEZXYtPmh3RGV2aWNlKCk7CisgICAgICAgIHN0YXR1cyA9IGh3RGV2aWNlLT5jcmVhdGVfYXVkaW9fcGF0Y2goaHdEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5udW1fc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5udW1fc2lua3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HX0FTU0VSVChmYWxzZSwgImNyZWF0ZUF1ZGlvUGF0Y2hfbCgpIGNhbGxlZCBvbiBhIHByZSAzLjAgSEFMIik7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnJlbGVhc2VBdWRpb1BhdGNoX2woY29uc3QgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIGlmIChtT3V0cHV0LT5hdWRpb0h3RGV2LT52ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgeworICAgICAgICBhdWRpb19od19kZXZpY2VfdCAqaHdEZXZpY2UgPSBtT3V0cHV0LT5hdWRpb0h3RGV2LT5od0RldmljZSgpOworICAgICAgICBzdGF0dXMgPSBod0RldmljZS0+cmVsZWFzZV9hdWRpb19wYXRjaChod0RldmljZSwgaGFuZGxlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HX0FTU0VSVChmYWxzZSwgInJlbGVhc2VBdWRpb1BhdGNoX2woKSBjYWxsZWQgb24gYSBwcmUgMy4wIEhBTCIpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmFkZFBhdGNoVHJhY2soY29uc3Qgc3A8UGF0Y2hUcmFjaz4mIHRyYWNrKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbVRyYWNrcy5hZGQodHJhY2spOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmRlbGV0ZVBhdGNoVHJhY2soY29uc3Qgc3A8UGF0Y2hUcmFjaz4mIHRyYWNrKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgZGVzdHJveVRyYWNrX2wodHJhY2spOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmdldEF1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKK3sKKyAgICBUaHJlYWRCYXNlOjpnZXRBdWRpb1BvcnRDb25maWcoY29uZmlnKTsKKyAgICBjb25maWctPnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU09VUkNFOworICAgIGNvbmZpZy0+ZXh0Lm1peC5od19tb2R1bGUgPSBtT3V0cHV0LT5hdWRpb0h3RGV2LT5oYW5kbGUoKTsKKyAgICBjb25maWctPmV4dC5taXgudXNlY2FzZS5zdHJlYW0gPSBBVURJT19TVFJFQU1fREVGQVVMVDsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkOjpNaXhlclRocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsCkBAIC0yNDYzLDE1ICsyNzc4LDEwIEBACiAgICAgICAgICAgICBtTm9ybWFsRnJhbWVDb3VudCk7CiAgICAgbUF1ZGlvTWl4ZXIgPSBuZXcgQXVkaW9NaXhlcihtTm9ybWFsRnJhbWVDb3VudCwgbVNhbXBsZVJhdGUpOwogCi0gICAgLy8gRklYTUUgLSBDdXJyZW50IG1peGVyIGltcGxlbWVudGF0aW9uIG9ubHkgc3VwcG9ydHMgc3RlcmVvIG91dHB1dAotICAgIGlmIChtQ2hhbm5lbENvdW50ICE9IEZDQ18yKSB7Ci0gICAgICAgIEFMT0dFKCJJbnZhbGlkIGF1ZGlvIGhhcmR3YXJlIGNoYW5uZWwgY291bnQgJWQiLCBtQ2hhbm5lbENvdW50KTsKLSAgICB9Ci0KICAgICAvLyBjcmVhdGUgYW4gTkJBSU8gc2luayBmb3IgdGhlIEhBTCBvdXRwdXQgc3RyZWFtLCBhbmQgbmVnb3RpYXRlCiAgICAgbU91dHB1dFNpbmsgPSBuZXcgQXVkaW9TdHJlYW1PdXRTaW5rKG91dHB1dC0+c3RyZWFtKTsKICAgICBzaXplX3QgbnVtQ291bnRlck9mZmVycyA9IDA7Ci0gICAgY29uc3QgTkJBSU9fRm9ybWF0IG9mZmVyc1sxXSA9IHtGb3JtYXRfZnJvbV9TUl9DKG1TYW1wbGVSYXRlLCBtQ2hhbm5lbENvdW50KX07CisgICAgY29uc3QgTkJBSU9fRm9ybWF0IG9mZmVyc1sxXSA9IHtGb3JtYXRfZnJvbV9TUl9DKG1TYW1wbGVSYXRlLCBtQ2hhbm5lbENvdW50LCBtRm9ybWF0KX07CiAgICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRTaW5rLT5uZWdvdGlhdGUob2ZmZXJzLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKICAgICBBTE9HX0FTU0VSVChpbmRleCA9PSAwKTsKIApAQCAtMjQ5MCw5ICsyODAwLDI4IEBACiAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICBpZiAoaW5pdEZhc3RNaXhlcikgeworICAgICAgICBhdWRpb19mb3JtYXRfdCBmYXN0TWl4ZXJGb3JtYXQ7CisgICAgICAgIGlmIChtTWl4ZXJCdWZmZXJFbmFibGVkICYmIG1FZmZlY3RCdWZmZXJFbmFibGVkKSB7CisgICAgICAgICAgICBmYXN0TWl4ZXJGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmFzdE1peGVyRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Gb3JtYXQgIT0gZmFzdE1peGVyRm9ybWF0KSB7CisgICAgICAgICAgICAvLyBjaGFuZ2Ugb3VyIFNpbmsgZm9ybWF0IHRvIGFjY2VwdCBvdXIgaW50ZXJtZWRpYXRlIHByZWNpc2lvbgorICAgICAgICAgICAgbUZvcm1hdCA9IGZhc3RNaXhlckZvcm1hdDsKKyAgICAgICAgICAgIGZyZWUobVNpbmtCdWZmZXIpOworICAgICAgICAgICAgbUZyYW1lU2l6ZSA9IG1DaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKG1Gb3JtYXQpOworICAgICAgICAgICAgY29uc3Qgc2l6ZV90IHNpbmtCdWZmZXJTaXplID0gbU5vcm1hbEZyYW1lQ291bnQgKiBtRnJhbWVTaXplOworICAgICAgICAgICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24oJm1TaW5rQnVmZmVyLCAzMiwgc2lua0J1ZmZlclNpemUpOworICAgICAgICB9CiAKICAgICAgICAgLy8gY3JlYXRlIGEgTW9ub1BpcGUgdG8gY29ubmVjdCBvdXIgc3VibWl4IHRvIEZhc3RNaXhlcgogICAgICAgICBOQkFJT19Gb3JtYXQgZm9ybWF0ID0gbU91dHB1dFNpbmstPmZvcm1hdCgpOworICAgICAgICBOQkFJT19Gb3JtYXQgb3JpZ2Zvcm1hdCA9IGZvcm1hdDsKKyAgICAgICAgLy8gYWRqdXN0IGZvcm1hdCB0byBtYXRjaCB0aGF0IG9mIHRoZSBGYXN0IE1peGVyCisgICAgICAgIGZvcm1hdC5tRm9ybWF0ID0gZmFzdE1peGVyRm9ybWF0OworICAgICAgICBmb3JtYXQubUZyYW1lU2l6ZSA9IGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0Lm1Gb3JtYXQpICogZm9ybWF0Lm1DaGFubmVsQ291bnQ7CisKICAgICAgICAgLy8gVGhpcyBwaXBlIGRlcHRoIGNvbXBlbnNhdGVzIGZvciBzY2hlZHVsaW5nIGxhdGVuY3kgb2YgdGhlIG5vcm1hbCBtaXhlciB0aHJlYWQuCiAgICAgICAgIC8vIFdoZW4gaXQgd2FrZXMgdXAgYWZ0ZXIgYSBtYXhpbXVtIGxhdGVuY3ksIGl0IHJ1bnMgYSBmZXcgY3ljbGVzIHF1aWNrbHkgYmVmb3JlCiAgICAgICAgIC8vIGZpbmFsbHkgYmxvY2tpbmcuICBOb3RlIHRoZSBwaXBlIGltcGxlbWVudGF0aW9uIHJvdW5kcyB1cCB0aGUgcmVxdWVzdCB0byBhIHBvd2VyIG9mIDIuCkBAIC0yNTA4LDE0ICsyODM3LDE1IEBACiAjaWZkZWYgVEVFX1NJTksKICAgICAgICAgaWYgKG1UZWVTaW5rT3V0cHV0RW5hYmxlZCkgewogICAgICAgICAgICAgLy8gY3JlYXRlIGEgUGlwZSB0byBhcmNoaXZlIGEgY29weSBvZiBGYXN0TWl4ZXIncyBvdXRwdXQgZm9yIGR1bXBzeXMKLSAgICAgICAgICAgIFBpcGUgKnRlZVNpbmsgPSBuZXcgUGlwZShtVGVlU2lua091dHB1dEZyYW1lcywgZm9ybWF0KTsKKyAgICAgICAgICAgIFBpcGUgKnRlZVNpbmsgPSBuZXcgUGlwZShtVGVlU2lua091dHB1dEZyYW1lcywgb3JpZ2Zvcm1hdCk7CisgICAgICAgICAgICBjb25zdCBOQkFJT19Gb3JtYXQgb2ZmZXJzMlsxXSA9IHtvcmlnZm9ybWF0fTsKICAgICAgICAgICAgIG51bUNvdW50ZXJPZmZlcnMgPSAwOwotICAgICAgICAgICAgaW5kZXggPSB0ZWVTaW5rLT5uZWdvdGlhdGUob2ZmZXJzLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKKyAgICAgICAgICAgIGluZGV4ID0gdGVlU2luay0+bmVnb3RpYXRlKG9mZmVyczIsIDEsIE5VTEwsIG51bUNvdW50ZXJPZmZlcnMpOwogICAgICAgICAgICAgQUxPR19BU1NFUlQoaW5kZXggPT0gMCk7CiAgICAgICAgICAgICBtVGVlU2luayA9IHRlZVNpbms7CiAgICAgICAgICAgICBQaXBlUmVhZGVyICp0ZWVTb3VyY2UgPSBuZXcgUGlwZVJlYWRlcigqdGVlU2luayk7CiAgICAgICAgICAgICBudW1Db3VudGVyT2ZmZXJzID0gMDsKLSAgICAgICAgICAgIGluZGV4ID0gdGVlU291cmNlLT5uZWdvdGlhdGUob2ZmZXJzLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKKyAgICAgICAgICAgIGluZGV4ID0gdGVlU291cmNlLT5uZWdvdGlhdGUob2ZmZXJzMiwgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7CiAgICAgICAgICAgICBBTE9HX0FTU0VSVChpbmRleCA9PSAwKTsKICAgICAgICAgICAgIG1UZWVTb3VyY2UgPSB0ZWVTb3VyY2U7CiAgICAgICAgIH0KQEAgLTI1MzMsNiArMjg2Myw4IEBACiAgICAgICAgIC8vIHdyYXAgdGhlIHNvdXJjZSBzaWRlIG9mIHRoZSBNb25vUGlwZSB0byBtYWtlIGl0IGFuIEF1ZGlvQnVmZmVyUHJvdmlkZXIKICAgICAgICAgZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXIgPSBuZXcgU291cmNlQXVkaW9CdWZmZXJQcm92aWRlcihuZXcgTW9ub1BpcGVSZWFkZXIobW9ub1BpcGUpKTsKICAgICAgICAgZmFzdFRyYWNrLT5tVm9sdW1lUHJvdmlkZXIgPSBOVUxMOworICAgICAgICBmYXN0VHJhY2stPm1DaGFubmVsTWFzayA9IG1DaGFubmVsTWFzazsgLy8gbVBpcGVTaW5rIGNoYW5uZWwgbWFzayBmb3IgYXVkaW8gdG8gRmFzdE1peGVyCisgICAgICAgIGZhc3RUcmFjay0+bUZvcm1hdCA9IG1Gb3JtYXQ7IC8vIG1QaXBlU2luayBmb3JtYXQgZm9yIGF1ZGlvIHRvIEZhc3RNaXhlcgogICAgICAgICBmYXN0VHJhY2stPm1HZW5lcmF0aW9uKys7CiAgICAgICAgIHN0YXRlLT5tRmFzdFRyYWNrc0dlbisrOwogICAgICAgICBzdGF0ZS0+bVRyYWNrTWFzayA9IDE7CkBAIC0yNTc2LDggKzI5MDgsNiBAQAogICAgICAgICB9CiAjZW5kaWYKIAotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1GYXN0TWl4ZXIgPSBOVUxMOwogICAgIH0KIAogICAgIHN3aXRjaCAoa1VzZUZhc3RNaXhlcikgewpAQCAtMjU5NiwxMyArMjkyNiwxMyBAQAogCiBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkOjp+TWl4ZXJUaHJlYWQoKQogewotICAgIGlmIChtRmFzdE1peGVyICE9IE5VTEwpIHsKKyAgICBpZiAobUZhc3RNaXhlciAhPSAwKSB7CiAgICAgICAgIEZhc3RNaXhlclN0YXRlUXVldWUgKnNxID0gbUZhc3RNaXhlci0+c3EoKTsKICAgICAgICAgRmFzdE1peGVyU3RhdGUgKnN0YXRlID0gc3EtPmJlZ2luKCk7CiAgICAgICAgIGlmIChzdGF0ZS0+bUNvbW1hbmQgPT0gRmFzdE1peGVyU3RhdGU6OkNPTERfSURMRSkgewogICAgICAgICAgICAgaW50MzJfdCBvbGQgPSBhbmRyb2lkX2F0b21pY19pbmMoJm1GYXN0TWl4ZXJGdXRleCk7CiAgICAgICAgICAgICBpZiAob2xkID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgX19mdXRleF9zeXNjYWxsMygmbUZhc3RNaXhlckZ1dGV4LCBGVVRFWF9XQUtFX1BSSVZBVEUsIDEpOworICAgICAgICAgICAgICAgICh2b2lkKSBzeXNjYWxsKF9fTlJfZnV0ZXgsICZtRmFzdE1peGVyRnV0ZXgsIEZVVEVYX1dBS0VfUFJJVkFURSwgMSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgc3RhdGUtPm1Db21tYW5kID0gRmFzdE1peGVyU3RhdGU6OkVYSVQ7CkBAIC0yNjE4LDcgKzI5NDgsNyBAQAogICAgICAgICBBTE9HX0FTU0VSVChmYXN0VHJhY2stPm1CdWZmZXJQcm92aWRlciAhPSBOVUxMKTsKICAgICAgICAgZGVsZXRlIGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyOwogICAgICAgICBzcS0+ZW5kKGZhbHNlIC8qZGlkTW9kaWZ5Ki8pOwotICAgICAgICBkZWxldGUgbUZhc3RNaXhlcjsKKyAgICAgICAgbUZhc3RNaXhlci5jbGVhcigpOwogI2lmZGVmIEFVRElPX1dBVENIRE9HCiAgICAgICAgIGlmIChtQXVkaW9XYXRjaGRvZyAhPSAwKSB7CiAgICAgICAgICAgICBtQXVkaW9XYXRjaGRvZy0+cmVxdWVzdEV4aXQoKTsKQEAgLTI2MzQsNyArMjk2NCw3IEBACiAKIHVpbnQzMl90IEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6OmNvcnJlY3RMYXRlbmN5X2wodWludDMyX3QgbGF0ZW5jeSkgY29uc3QKIHsKLSAgICBpZiAobUZhc3RNaXhlciAhPSBOVUxMKSB7CisgICAgaWYgKG1GYXN0TWl4ZXIgIT0gMCkgewogICAgICAgICBNb25vUGlwZSAqcGlwZSA9IChNb25vUGlwZSAqKW1QaXBlU2luay5nZXQoKTsKICAgICAgICAgbGF0ZW5jeSArPSAocGlwZS0+Z2V0QXZnRnJhbWVzKCkgKiAxMDAwKSAvIG1TYW1wbGVSYXRlOwogICAgIH0KQEAgLTI2NTEsNyArMjk4MSw3IEBACiB7CiAgICAgLy8gRklYTUUgd2Ugc2hvdWxkIG9ubHkgZG8gb25lIHB1c2ggcGVyIGN5Y2xlOyBjb25maXJtIHRoaXMgaXMgdHJ1ZQogICAgIC8vIFN0YXJ0IHRoZSBmYXN0IG1peGVyIGlmIGl0J3Mgbm90IGFscmVhZHkgcnVubmluZwotICAgIGlmIChtRmFzdE1peGVyICE9IE5VTEwpIHsKKyAgICBpZiAobUZhc3RNaXhlciAhPSAwKSB7CiAgICAgICAgIEZhc3RNaXhlclN0YXRlUXVldWUgKnNxID0gbUZhc3RNaXhlci0+c3EoKTsKICAgICAgICAgRmFzdE1peGVyU3RhdGUgKnN0YXRlID0gc3EtPmJlZ2luKCk7CiAgICAgICAgIGlmIChzdGF0ZS0+bUNvbW1hbmQgIT0gRmFzdE1peGVyU3RhdGU6Ok1JWF9XUklURSAmJgpAQCAtMjY1OSw3ICsyOTg5LDcgQEAKICAgICAgICAgICAgIGlmIChzdGF0ZS0+bUNvbW1hbmQgPT0gRmFzdE1peGVyU3RhdGU6OkNPTERfSURMRSkgewogICAgICAgICAgICAgICAgIGludDMyX3Qgb2xkID0gYW5kcm9pZF9hdG9taWNfaW5jKCZtRmFzdE1peGVyRnV0ZXgpOwogICAgICAgICAgICAgICAgIGlmIChvbGQgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgX19mdXRleF9zeXNjYWxsMygmbUZhc3RNaXhlckZ1dGV4LCBGVVRFWF9XQUtFX1BSSVZBVEUsIDEpOworICAgICAgICAgICAgICAgICAgICAodm9pZCkgc3lzY2FsbChfX05SX2Z1dGV4LCAmbUZhc3RNaXhlckZ1dGV4LCBGVVRFWF9XQUtFX1BSSVZBVEUsIDEpOwogICAgICAgICAgICAgICAgIH0KICNpZmRlZiBBVURJT19XQVRDSERPRwogICAgICAgICAgICAgICAgIGlmIChtQXVkaW9XYXRjaGRvZyAhPSAwKSB7CkBAIC0yNjg1LDcgKzMwMTUsNyBAQAogdm9pZCBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkOjp0aHJlYWRMb29wX3N0YW5kYnkoKQogewogICAgIC8vIElkbGUgdGhlIGZhc3QgbWl4ZXIgaWYgaXQncyBjdXJyZW50bHkgcnVubmluZwotICAgIGlmIChtRmFzdE1peGVyICE9IE5VTEwpIHsKKyAgICBpZiAobUZhc3RNaXhlciAhPSAwKSB7CiAgICAgICAgIEZhc3RNaXhlclN0YXRlUXVldWUgKnNxID0gbUZhc3RNaXhlci0+c3EoKTsKICAgICAgICAgRmFzdE1peGVyU3RhdGUgKnN0YXRlID0gc3EtPmJlZ2luKCk7CiAgICAgICAgIGlmICghKHN0YXRlLT5tQ29tbWFuZCAmIEZhc3RNaXhlclN0YXRlOjpJRExFKSkgewpAQCAtMjcxMSwxMiArMzA0MSw2IEBACiAgICAgUGxheWJhY2tUaHJlYWQ6OnRocmVhZExvb3Bfc3RhbmRieSgpOwogfQogCi0vLyBFbXB0eSBpbXBsZW1lbnRhdGlvbiBmb3Igc3RhbmRhcmQgbWl4ZXIKLS8vIE92ZXJyaWRkZW4gZm9yIG9mZmxvYWRlZCBwbGF5YmFjawotdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpmbHVzaE91dHB1dF9sKCkKLXsKLX0KLQogYm9vbCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjp3YWl0aW5nQXN5bmNDYWxsYmFja19sKCkKIHsKICAgICByZXR1cm4gZmFsc2U7CkBAIC0yNzQ4LDYgKzMwNzIsMTIgQEAKICAgICB9CiB9CiAKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6b25BZGROZXdUcmFja19sKCkKK3sKKyAgICBBTE9HVigic2lnbmFsIHBsYXliYWNrIHRocmVhZCIpOworICAgIGJyb2FkY2FzdF9sKCk7Cit9CisKIHZvaWQgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6dGhyZWFkTG9vcF9taXgoKQogewogICAgIC8vIG9idGFpbiB0aGUgcHJlc2VudGF0aW9uIHRpbWVzdGFtcCBvZiB0aGUgbmV4dCBvdXRwdXQgYnVmZmVyCkBAIC0yNzY2LDcgKzMwOTYsNyBAQAogCiAgICAgLy8gbWl4IGJ1ZmZlcnMuLi4KICAgICBtQXVkaW9NaXhlci0+cHJvY2VzcyhwdHMpOwotICAgIG1DdXJyZW50V3JpdGVMZW5ndGggPSBtaXhCdWZmZXJTaXplOworICAgIG1DdXJyZW50V3JpdGVMZW5ndGggPSBtU2lua0J1ZmZlclNpemU7CiAgICAgLy8gaW5jcmVhc2Ugc2xlZXAgdGltZSBwcm9ncmVzc2l2ZWx5IHdoZW4gYXBwbGljYXRpb24gdW5kZXJydW4gY29uZGl0aW9uIGNsZWFycy4KICAgICAvLyBPbmx5IGluY3JlYXNlIHNsZWVwIHRpbWUgaWYgdGhlIG1peGVyIGlzIHJlYWR5IGZvciB0d28gY29uc2VjdXRpdmUgdGltZXMgdG8gYXZvaWQKICAgICAvLyB0aGF0IGEgc3RlYWR5IHN0YXRlIG9mIGFsdGVybmF0aW5nIHJlYWR5L25vdCByZWFkeSBjb25kaXRpb25zIGtlZXBzIHRoZSBzbGVlcCB0aW1lCkBAIC0yNzc3LDYgKzMxMDcsNyBAQAogICAgIHNsZWVwVGltZSA9IDA7CiAgICAgc3RhbmRieVRpbWUgPSBzeXN0ZW1UaW1lKCkgKyBzdGFuZGJ5RGVsYXk7CiAgICAgLy9UT0RPOiBkZWxheSBzdGFuZGJ5IHdoZW4gZWZmZWN0cyBoYXZlIGEgdGFpbAorCiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6dGhyZWFkTG9vcF9zbGVlcFRpbWUoKQpAQCAtMjgwMCw3ICszMTMxLDEzIEBACiAgICAgICAgICAgICBzbGVlcFRpbWUgPSBpZGxlU2xlZXBUaW1lOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChtQnl0ZXNXcml0dGVuICE9IDAgfHwgKG1NaXhlclN0YXR1cyA9PSBNSVhFUl9UUkFDS1NfRU5BQkxFRCkpIHsKLSAgICAgICAgbWVtc2V0IChtTWl4QnVmZmVyLCAwLCBtaXhCdWZmZXJTaXplKTsKKyAgICAgICAgLy8gY2xlYXIgb3V0IG1NaXhlckJ1ZmZlciBvciBtU2lua0J1ZmZlciwgdG8gZW5zdXJlIGJ1ZmZlcnMgYXJlIGNsZWFyZWQKKyAgICAgICAgLy8gYmVmb3JlIGVmZmVjdHMgcHJvY2Vzc2luZyBvciBvdXRwdXQuCisgICAgICAgIGlmIChtTWl4ZXJCdWZmZXJWYWxpZCkgeworICAgICAgICAgICAgbWVtc2V0KG1NaXhlckJ1ZmZlciwgMCwgbU1peGVyQnVmZmVyU2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZW1zZXQobVNpbmtCdWZmZXIsIDAsIG1TaW5rQnVmZmVyU2l6ZSk7CisgICAgICAgIH0KICAgICAgICAgc2xlZXBUaW1lID0gMDsKICAgICAgICAgQUxPR1ZfSUYobUJ5dGVzV3JpdHRlbiA9PSAwICYmIChtTWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX0VOQUJMRUQpLAogICAgICAgICAgICAgICAgICJhbnRpY2lwYXRlZCBzdGFydCIpOwpAQCAtMjg0MiwxMSArMzE3OSwxNCBAQAogICAgIEZhc3RNaXhlclN0YXRlICpzdGF0ZSA9IE5VTEw7CiAgICAgYm9vbCBkaWRNb2RpZnkgPSBmYWxzZTsKICAgICBGYXN0TWl4ZXJTdGF0ZVF1ZXVlOjpibG9ja190IGJsb2NrID0gRmFzdE1peGVyU3RhdGVRdWV1ZTo6QkxPQ0tfVU5USUxfUFVTSEVEOwotICAgIGlmIChtRmFzdE1peGVyICE9IE5VTEwpIHsKKyAgICBpZiAobUZhc3RNaXhlciAhPSAwKSB7CiAgICAgICAgIHNxID0gbUZhc3RNaXhlci0+c3EoKTsKICAgICAgICAgc3RhdGUgPSBzcS0+YmVnaW4oKTsKICAgICB9CiAKKyAgICBtTWl4ZXJCdWZmZXJWYWxpZCA9IGZhbHNlOyAgLy8gbU1peGVyQnVmZmVyIGhhcyBubyB2YWxpZCBkYXRhIHVudGlsIGFwcHJvcHJpYXRlIHRyYWNrcyBmb3VuZC4KKyAgICBtRWZmZWN0QnVmZmVyVmFsaWQgPSBmYWxzZTsgLy8gbUVmZmVjdEJ1ZmZlciBoYXMgbm8gdmFsaWQgZGF0YSB1bnRpbCB0cmFja3MgZm91bmQuCisKICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7CiAgICAgICAgIGNvbnN0IHNwPFRyYWNrPiB0ID0gbUFjdGl2ZVRyYWNrc1tpXS5wcm9tb3RlKCk7CiAgICAgICAgIGlmICh0ID09IDApIHsKQEAgLTI5NjUsNyArMzMwNSw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFRyYWNrQmFzZTo6SURMRToKICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgTE9HX0ZBVEFMKCJ1bmV4cGVjdGVkIHRyYWNrIHN0YXRlICVkIiwgdHJhY2stPm1TdGF0ZSk7CisgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgidW5leHBlY3RlZCB0cmFjayBzdGF0ZSAlZCIsIHRyYWNrLT5tU3RhdGUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoaXNBY3RpdmUpIHsKQEAgLTI5NzUsOCArMzMxNSw4IEBACiAgICAgICAgICAgICAgICAgICAgIFZvbHVtZVByb3ZpZGVyICp2cCA9IHRyYWNrOwogICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1CdWZmZXJQcm92aWRlciA9IGVhYnA7CiAgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bVZvbHVtZVByb3ZpZGVyID0gdnA7Ci0gICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bVNhbXBsZVJhdGUgPSB0cmFjay0+bVNhbXBsZVJhdGU7CiAgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bUNoYW5uZWxNYXNrID0gdHJhY2stPm1DaGFubmVsTWFzazsKKyAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tRm9ybWF0ID0gdHJhY2stPm1Gb3JtYXQ7CiAgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bUdlbmVyYXRpb24rKzsKICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1UcmFja01hc2sgfD0gMSA8PCBqOwogICAgICAgICAgICAgICAgICAgICBkaWRNb2RpZnkgPSB0cnVlOwpAQCAtMjk5Nyw3ICszMzM3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB3ZSdyZSBhYm91dCB0byBkZWNyZW1lbnQgdGhlIGxhc3Qgc3A8PiBvbiB0aG9zZSB0cmFja3MuCiAgICAgICAgICAgICAgICAgICAgIGJsb2NrID0gRmFzdE1peGVyU3RhdGVRdWV1ZTo6QkxPQ0tfVU5USUxfQUNLRUQ7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HX0ZBVEFMKCJmYXN0IHRyYWNrICVkIHNob3VsZCBoYXZlIGJlZW4gYWN0aXZlIiwgaik7CisgICAgICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImZhc3QgdHJhY2sgJWQgc2hvdWxkIGhhdmUgYmVlbiBhY3RpdmUiLCBqKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgdHJhY2tzVG9SZW1vdmUtPmFkZCh0cmFjayk7CiAgICAgICAgICAgICAgICAgLy8gQXZvaWRzIGEgbWlzbGVhZGluZyBkaXNwbGF5IGluIGR1bXBzeXMKQEAgLTMwMjYsMTIgKzMzNjYsMTQgQEAKICAgICAgICAgICAgIC8vICsxIGZvciByb3VuZGluZyBhbmQgKzEgZm9yIGFkZGl0aW9uYWwgc2FtcGxlIG5lZWRlZCBmb3IgaW50ZXJwb2xhdGlvbgogICAgICAgICAgICAgZGVzaXJlZEZyYW1lcyA9IChtTm9ybWFsRnJhbWVDb3VudCAqIHNyKSAvIG1TYW1wbGVSYXRlICsgMSArIDE7CiAgICAgICAgICAgICAvLyBhZGQgZnJhbWVzIGFscmVhZHkgY29uc3VtZWQgYnV0IG5vdCB5ZXQgcmVsZWFzZWQgYnkgdGhlIHJlc2FtcGxlcgotICAgICAgICAgICAgLy8gYmVjYXVzZSBjYmxrLT5mcmFtZXNSZWFkeSgpIHdpbGwgaW5jbHVkZSB0aGVzZSBmcmFtZXMKKyAgICAgICAgICAgIC8vIGJlY2F1c2UgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzUmVhZHkoKSB3aWxsIGluY2x1ZGUgdGhlc2UgZnJhbWVzCiAgICAgICAgICAgICBkZXNpcmVkRnJhbWVzICs9IG1BdWRpb01peGVyLT5nZXRVbnJlbGVhc2VkRnJhbWVzKHRyYWNrLT5uYW1lKCkpOworI2lmIDAKICAgICAgICAgICAgIC8vIHRoZSBtaW5pbXVtIHRyYWNrIGJ1ZmZlciBzaXplIGlzIG5vcm1hbGx5IHR3aWNlIHRoZSBudW1iZXIgb2YgZnJhbWVzIG5lY2Vzc2FyeQogICAgICAgICAgICAgLy8gdG8gZmlsbCBvbmUgYnVmZmVyIGFuZCB0aGUgcmVzYW1wbGVyIHNob3VsZCBub3QgbGVhdmUgbW9yZSB0aGFuIG9uZSBidWZmZXIgd29ydGgKICAgICAgICAgICAgIC8vIG9mIHVucmVsZWFzZWQgZnJhbWVzIGFmdGVyIGVhY2ggcGFzcywgYnV0IGp1c3QgaW4gY2FzZS4uLgogICAgICAgICAgICAgQUxPR19BU1NFUlQoZGVzaXJlZEZyYW1lcyA8PSBjYmxrLT5mcmFtZUNvdW50Xyk7CisjZW5kaWYKICAgICAgICAgfQogICAgICAgICB1aW50MzJfdCBtaW5GcmFtZXMgPSAxOwogICAgICAgICBpZiAoKHRyYWNrLT5zaGFyZWRCdWZmZXIoKSA9PSAwKSAmJiAhdHJhY2stPmlzU3RvcHBlZCgpICYmICF0cmFjay0+aXNQYXVzaW5nKCkgJiYKQEAgLTMwNDcsMTAgKzMzODksMTQgQEAKIAogICAgICAgICAgICAgbWl4ZWRUcmFja3MrKzsKIAotICAgICAgICAgICAgLy8gdHJhY2stPm1haW5CdWZmZXIoKSAhPSBtTWl4QnVmZmVyIG1lYW5zIHRoZXJlIGlzIGFuIGVmZmVjdCBjaGFpbgotICAgICAgICAgICAgLy8gY29ubmVjdGVkIHRvIHRoZSB0cmFjaworICAgICAgICAgICAgLy8gdHJhY2stPm1haW5CdWZmZXIoKSAhPSBtU2lua0J1ZmZlciBvciBtTWl4ZXJCdWZmZXIgbWVhbnMKKyAgICAgICAgICAgIC8vIHRoZXJlIGlzIGFuIGVmZmVjdCBjaGFpbiBjb25uZWN0ZWQgdG8gdGhlIHRyYWNrCiAgICAgICAgICAgICBjaGFpbi5jbGVhcigpOwotICAgICAgICAgICAgaWYgKHRyYWNrLT5tYWluQnVmZmVyKCkgIT0gbU1peEJ1ZmZlcikgeworICAgICAgICAgICAgaWYgKHRyYWNrLT5tYWluQnVmZmVyKCkgIT0gbVNpbmtCdWZmZXIgJiYKKyAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1haW5CdWZmZXIoKSAhPSBtTWl4ZXJCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBpZiAobUVmZmVjdEJ1ZmZlckVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbUVmZmVjdEJ1ZmZlclZhbGlkID0gdHJ1ZTsgLy8gTGF0ZXIgY2FuIHNldCBkaXJlY3RseS4KKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2hhaW4gPSBnZXRFZmZlY3RDaGFpbl9sKHRyYWNrLT5zZXNzaW9uSWQoKSk7CiAgICAgICAgICAgICAgICAgLy8gRGVsZWdhdGUgdm9sdW1lIGNvbnRyb2wgdG8gZWZmZWN0IGluIHRyYWNrIGVmZmVjdCBjaGFpbiBpZiBuZWVkZWQKICAgICAgICAgICAgICAgICBpZiAoY2hhaW4gIT0gMCkgewpAQCAtMzA4MCw5ICszNDI2LDExIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIGNvbXB1dGUgdm9sdW1lIGZvciB0aGlzIHRyYWNrCi0gICAgICAgICAgICB1aW50MzJfdCB2bCwgdnIsIHZhOworICAgICAgICAgICAgdWludDMyX3QgdmwsIHZyOyAgICAgICAvLyBpbiBVOC4yNCBpbnRlZ2VyIGZvcm1hdAorICAgICAgICAgICAgZmxvYXQgdmxmLCB2cmYsIHZhZjsgICAvLyBpbiBbMC4wLCAxLjBdIGZsb2F0IGZvcm1hdAogICAgICAgICAgICAgaWYgKHRyYWNrLT5pc1BhdXNpbmcoKSB8fCBtU3RyZWFtVHlwZXNbdHJhY2stPnN0cmVhbVR5cGUoKV0ubXV0ZSkgewotICAgICAgICAgICAgICAgIHZsID0gdnIgPSB2YSA9IDA7CisgICAgICAgICAgICAgICAgdmwgPSB2ciA9IDA7CisgICAgICAgICAgICAgICAgdmxmID0gdnJmID0gdmFmID0gMC47CiAgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5pc1BhdXNpbmcoKSkgewogICAgICAgICAgICAgICAgICAgICB0cmFjay0+c2V0UGF1c2VkKCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMzA5MiwzNyArMzQ0MCw0NCBAQAogICAgICAgICAgICAgICAgIGZsb2F0IHR5cGVWb2x1bWUgPSBtU3RyZWFtVHlwZXNbdHJhY2stPnN0cmVhbVR5cGUoKV0udm9sdW1lOwogICAgICAgICAgICAgICAgIGZsb2F0IHYgPSBtYXN0ZXJWb2x1bWUgKiB0eXBlVm9sdW1lOwogICAgICAgICAgICAgICAgIEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eSAqcHJveHkgPSB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eTsKLSAgICAgICAgICAgICAgICB1aW50MzJfdCB2bHIgPSBwcm94eS0+Z2V0Vm9sdW1lTFIoKTsKLSAgICAgICAgICAgICAgICB2bCA9IHZsciAmIDB4RkZGRjsKLSAgICAgICAgICAgICAgICB2ciA9IHZsciA+PiAxNjsKKyAgICAgICAgICAgICAgICBnYWluX21pbmlmbG9hdF9wYWNrZWRfdCB2bHIgPSBwcm94eS0+Z2V0Vm9sdW1lTFIoKTsKKyAgICAgICAgICAgICAgICB2bGYgPSBmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX2xlZnQodmxyKSk7CisgICAgICAgICAgICAgICAgdnJmID0gZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19yaWdodCh2bHIpKTsKICAgICAgICAgICAgICAgICAvLyB0cmFjayB2b2x1bWVzIGNvbWUgZnJvbSBzaGFyZWQgbWVtb3J5LCBzbyBjYW4ndCBiZSB0cnVzdGVkIGFuZCBtdXN0IGJlIGNsYW1wZWQKLSAgICAgICAgICAgICAgICBpZiAodmwgPiBNQVhfR0FJTl9JTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlRyYWNrIGxlZnQgdm9sdW1lIG91dCBvZiByYW5nZTogJTA0WCIsIHZsKTsKLSAgICAgICAgICAgICAgICAgICAgdmwgPSBNQVhfR0FJTl9JTlQ7CisgICAgICAgICAgICAgICAgaWYgKHZsZiA+IEdBSU5fRkxPQVRfVU5JVFkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlRyYWNrIGxlZnQgdm9sdW1lIG91dCBvZiByYW5nZTogJS4zZyIsIHZsZik7CisgICAgICAgICAgICAgICAgICAgIHZsZiA9IEdBSU5fRkxPQVRfVU5JVFk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh2ciA+IE1BWF9HQUlOX0lOVCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiVHJhY2sgcmlnaHQgdm9sdW1lIG91dCBvZiByYW5nZTogJTA0WCIsIHZyKTsKLSAgICAgICAgICAgICAgICAgICAgdnIgPSBNQVhfR0FJTl9JTlQ7CisgICAgICAgICAgICAgICAgaWYgKHZyZiA+IEdBSU5fRkxPQVRfVU5JVFkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlRyYWNrIHJpZ2h0IHZvbHVtZSBvdXQgb2YgcmFuZ2U6ICUuM2ciLCB2cmYpOworICAgICAgICAgICAgICAgICAgICB2cmYgPSBHQUlOX0ZMT0FUX1VOSVRZOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAvLyBub3cgYXBwbHkgdGhlIG1hc3RlciB2b2x1bWUgYW5kIHN0cmVhbSB0eXBlIHZvbHVtZQotICAgICAgICAgICAgICAgIHZsID0gKHVpbnQzMl90KSh2ICogdmwpIDw8IDEyOwotICAgICAgICAgICAgICAgIHZyID0gKHVpbnQzMl90KSh2ICogdnIpIDw8IDEyOworICAgICAgICAgICAgICAgIHZsZiAqPSB2OworICAgICAgICAgICAgICAgIHZyZiAqPSB2OwogICAgICAgICAgICAgICAgIC8vIGFzc3VtaW5nIG1hc3RlciB2b2x1bWUgYW5kIHN0cmVhbSB0eXBlIHZvbHVtZSBlYWNoIGdvIHVwIHRvIDEuMCwKLSAgICAgICAgICAgICAgICAvLyB2bCBhbmQgdnIgYXJlIG5vdyBpbiA4LjI0IGZvcm1hdAotCisgICAgICAgICAgICAgICAgLy8gdGhlbiBkZXJpdmUgdmwgYW5kIHZyIGFzIFU4LjI0IHZlcnNpb25zIGZvciB0aGUgZWZmZWN0IGNoYWluCisgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgc2NhbGV0bzhfMjQgPSBNQVhfR0FJTl9JTlQgKiBNQVhfR0FJTl9JTlQ7CisgICAgICAgICAgICAgICAgdmwgPSAodWludDMyX3QpIChzY2FsZXRvOF8yNCAqIHZsZik7CisgICAgICAgICAgICAgICAgdnIgPSAodWludDMyX3QpIChzY2FsZXRvOF8yNCAqIHZyZik7CisgICAgICAgICAgICAgICAgLy8gdmwgYW5kIHZyIGFyZSBub3cgaW4gVTguMjQgZm9ybWF0CiAgICAgICAgICAgICAgICAgdWludDE2X3Qgc2VuZExldmVsID0gcHJveHktPmdldFNlbmRMZXZlbF9VNF8xMigpOwogICAgICAgICAgICAgICAgIC8vIHNlbmQgbGV2ZWwgY29tZXMgZnJvbSBzaGFyZWQgbWVtb3J5IGFuZCBzbyBtYXkgYmUgY29ycnVwdAogICAgICAgICAgICAgICAgIGlmIChzZW5kTGV2ZWwgPiBNQVhfR0FJTl9JTlQpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlRyYWNrIHNlbmQgbGV2ZWwgb3V0IG9mIHJhbmdlOiAlMDRYIiwgc2VuZExldmVsKTsKICAgICAgICAgICAgICAgICAgICAgc2VuZExldmVsID0gTUFYX0dBSU5fSU5UOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB2YSA9ICh1aW50MzJfdCkodiAqIHNlbmRMZXZlbCk7CisgICAgICAgICAgICAgICAgLy8gdmFmIGlzIHJlcHJlc2VudGVkIGFzIFswLjAsIDEuMF0gZmxvYXQgYnkgcmVzY2FsaW5nIHNlbmRMZXZlbAorICAgICAgICAgICAgICAgIHZhZiA9IHYgKiBzZW5kTGV2ZWwgKiAoMS4gLyBNQVhfR0FJTl9JTlQpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBEZWxlZ2F0ZSB2b2x1bWUgY29udHJvbCB0byBlZmZlY3QgaW4gdHJhY2sgZWZmZWN0IGNoYWluIGlmIG5lZWRlZAogICAgICAgICAgICAgaWYgKGNoYWluICE9IDAgJiYgY2hhaW4tPnNldFZvbHVtZV9sKCZ2bCwgJnZyKSkgewogICAgICAgICAgICAgICAgIC8vIERvIG5vdCByYW1wIHZvbHVtZSBpZiB2b2x1bWUgaXMgY29udHJvbGxlZCBieSBlZmZlY3QKICAgICAgICAgICAgICAgICBwYXJhbSA9IEF1ZGlvTWl4ZXI6OlZPTFVNRTsKKyAgICAgICAgICAgICAgICAvLyBVcGRhdGUgcmVtYWluaW5nIGZsb2F0aW5nIHBvaW50IHZvbHVtZSBsZXZlbHMKKyAgICAgICAgICAgICAgICB2bGYgPSAoZmxvYXQpdmwgLyAoMSA8PCAyNCk7CisgICAgICAgICAgICAgICAgdnJmID0gKGZsb2F0KXZyIC8gKDEgPDwgMjQpOwogICAgICAgICAgICAgICAgIHRyYWNrLT5tSGFzVm9sdW1lQ29udHJvbGxlciA9IHRydWU7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIGZvcmNlIG5vIHZvbHVtZSByYW1wIHdoZW4gdm9sdW1lIGNvbnRyb2xsZXIgd2FzIGp1c3QgZGlzYWJsZWQgb3IgcmVtb3ZlZApAQCAtMzEzMywyOCArMzQ4OCwxMyBAQAogICAgICAgICAgICAgICAgIHRyYWNrLT5tSGFzVm9sdW1lQ29udHJvbGxlciA9IGZhbHNlOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBDb252ZXJ0IHZvbHVtZXMgZnJvbSA4LjI0IHRvIDQuMTIgZm9ybWF0Ci0gICAgICAgICAgICAvLyBUaGlzIGFkZGl0aW9uYWwgY2xhbXBpbmcgaXMgbmVlZGVkIGluIGNhc2UgY2hhaW4tPnNldFZvbHVtZV9sKCkgb3ZlcnNob3QKLSAgICAgICAgICAgIHZsID0gKHZsICsgKDEgPDwgMTEpKSA+PiAxMjsKLSAgICAgICAgICAgIGlmICh2bCA+IE1BWF9HQUlOX0lOVCkgewotICAgICAgICAgICAgICAgIHZsID0gTUFYX0dBSU5fSU5UOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdnIgPSAodnIgKyAoMSA8PCAxMSkpID4+IDEyOwotICAgICAgICAgICAgaWYgKHZyID4gTUFYX0dBSU5fSU5UKSB7Ci0gICAgICAgICAgICAgICAgdnIgPSBNQVhfR0FJTl9JTlQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh2YSA+IE1BWF9HQUlOX0lOVCkgewotICAgICAgICAgICAgICAgIHZhID0gTUFYX0dBSU5fSU5UOyAgIC8vIHZhIGlzIHVpbnQzMl90LCBzbyBubyBuZWVkIHRvIGNoZWNrIGZvciAtCi0gICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIC8vIFhYWDogdGhlc2UgdGhpbmdzIERPTidUIG5lZWQgdG8gYmUgZG9uZSBlYWNoIHRpbWUKICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRCdWZmZXJQcm92aWRlcihuYW1lLCB0cmFjayk7CiAgICAgICAgICAgICBtQXVkaW9NaXhlci0+ZW5hYmxlKG5hbWUpOwogCi0gICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIHBhcmFtLCBBdWRpb01peGVyOjpWT0xVTUUwLCAodm9pZCAqKXZsKTsKLSAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgcGFyYW0sIEF1ZGlvTWl4ZXI6OlZPTFVNRTEsICh2b2lkICopdnIpOwotICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBwYXJhbSwgQXVkaW9NaXhlcjo6QVVYTEVWRUwsICh2b2lkICopdmEpOworICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBwYXJhbSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwgJnZsZik7CisgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIHBhcmFtLCBBdWRpb01peGVyOjpWT0xVTUUxLCAmdnJmKTsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgcGFyYW0sIEF1ZGlvTWl4ZXI6OkFVWExFVkVMLCAmdmFmKTsKICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKQEAgLTMxNjIsOSArMzUwMiwxMyBAQAogICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKICAgICAgICAgICAgICAgICBuYW1lLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAotICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OkNIQU5ORUxfTUFTSywgKHZvaWQgKil0cmFjay0+Y2hhbm5lbE1hc2soKSk7CisgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6Q0hBTk5FTF9NQVNLLCAodm9pZCAqKSh1aW50cHRyX3QpdHJhY2stPmNoYW5uZWxNYXNrKCkpOworICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAorICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1JWEVSX0NIQU5ORUxfTUFTSywgKHZvaWQgKikodWludHB0cl90KW1DaGFubmVsTWFzayk7CiAgICAgICAgICAgICAvLyBsaW1pdCB0cmFjayBzYW1wbGUgcmF0ZSB0byAyIHggb3V0cHV0IHNhbXBsZSByYXRlLCB3aGljaCBjaGFuZ2VzIGF0IHJlLWNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgIHVpbnQzMl90IG1heFNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZSAqIDI7CisgICAgICAgICAgICB1aW50MzJfdCBtYXhTYW1wbGVSYXRlID0gbVNhbXBsZVJhdGUgKiBBVURJT19SRVNBTVBMRVJfRE9XTl9SQVRJT19NQVg7CiAgICAgICAgICAgICB1aW50MzJfdCByZXFTYW1wbGVSYXRlID0gdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldFNhbXBsZVJhdGUoKTsKICAgICAgICAgICAgIGlmIChyZXFTYW1wbGVSYXRlID09IDApIHsKICAgICAgICAgICAgICAgICByZXFTYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7CkBAIC0zMTc1LDExICszNTE5LDQyIEBACiAgICAgICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpSRVNBTVBMRSwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpTQU1QTEVfUkFURSwKLSAgICAgICAgICAgICAgICAodm9pZCAqKXJlcVNhbXBsZVJhdGUpOwotICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICBuYW1lLAotICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAotICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1BSU5fQlVGRkVSLCAodm9pZCAqKXRyYWNrLT5tYWluQnVmZmVyKCkpOworICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdClyZXFTYW1wbGVSYXRlKTsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBTZWxlY3QgdGhlIGFwcHJvcHJpYXRlIG91dHB1dCBidWZmZXIgZm9yIHRoZSB0cmFjay4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBUcmFja3Mgd2l0aCBlZmZlY3RzIGdvIGludG8gdGhlaXIgb3duIGVmZmVjdHMgY2hhaW4gYnVmZmVyCisgICAgICAgICAgICAgKiBhbmQgZnJvbSB0aGVyZSBpbnRvIGVpdGhlciBtRWZmZWN0QnVmZmVyIG9yIG1TaW5rQnVmZmVyLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIE90aGVyIHRyYWNrcyBjYW4gdXNlIG1NaXhlckJ1ZmZlciBmb3IgaGlnaGVyIHByZWNpc2lvbgorICAgICAgICAgICAgICogY2hhbm5lbCBhY2N1bXVsYXRpb24uICBJZiB0aGlzIGJ1ZmZlciBpcyBlbmFibGVkCisgICAgICAgICAgICAgKiAobU1peGVyQnVmZmVyRW5hYmxlZCB0cnVlKSwgdGhlbiBzZWxlY3RlZCB0cmFja3Mgd2lsbCBhY2N1bXVsYXRlCisgICAgICAgICAgICAgKiBpbnRvIGl0LgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKG1NaXhlckJ1ZmZlckVuYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgJiYgKHRyYWNrLT5tYWluQnVmZmVyKCkgPT0gbVNpbmtCdWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB0cmFjay0+bWFpbkJ1ZmZlcigpID09IG1NaXhlckJ1ZmZlcikpIHsKKyAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUlYRVJfRk9STUFULCAodm9pZCAqKW1NaXhlckJ1ZmZlckZvcm1hdCk7CisgICAgICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1BSU5fQlVGRkVSLCAodm9pZCAqKW1NaXhlckJ1ZmZlcik7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogb3ZlcnJpZGUgdHJhY2stPm1haW5CdWZmZXIoKT8KKyAgICAgICAgICAgICAgICBtTWl4ZXJCdWZmZXJWYWxpZCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNSVhFUl9GT1JNQVQsICh2b2lkICopQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpOworICAgICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNQUlOX0JVRkZFUiwgKHZvaWQgKil0cmFjay0+bWFpbkJ1ZmZlcigpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKQEAgLTMyOTMsMTMgKzM2NjgsMzUgQEAKICAgICAvLyByZW1vdmUgYWxsIHRoZSB0cmFja3MgdGhhdCBuZWVkIHRvIGJlLi4uCiAgICAgcmVtb3ZlVHJhY2tzX2woKnRyYWNrc1RvUmVtb3ZlKTsKIAotICAgIC8vIG1peCBidWZmZXIgbXVzdCBiZSBjbGVhcmVkIGlmIGFsbCB0cmFja3MgYXJlIGNvbm5lY3RlZCB0byBhbgotICAgIC8vIGVmZmVjdCBjaGFpbiBhcyBpbiB0aGlzIGNhc2UgdGhlIG1peGVyIHdpbGwgbm90IHdyaXRlIHRvCi0gICAgLy8gbWl4IGJ1ZmZlciBhbmQgdHJhY2sgZWZmZWN0cyB3aWxsIGFjY3VtdWxhdGUgaW50byBpdAorICAgIGlmIChnZXRFZmZlY3RDaGFpbl9sKEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCkgIT0gMCkgeworICAgICAgICBtRWZmZWN0QnVmZmVyVmFsaWQgPSB0cnVlOworICAgIH0KKworICAgIGlmIChtRWZmZWN0QnVmZmVyVmFsaWQpIHsKKyAgICAgICAgLy8gYXMgbG9uZyBhcyB0aGVyZSBhcmUgZWZmZWN0cyB3ZSBzaG91bGQgY2xlYXIgdGhlIGVmZmVjdHMgYnVmZmVyLCB0byBhdm9pZAorICAgICAgICAvLyBwYXNzaW5nIGEgbm9uLWNsZWFuIGJ1ZmZlciB0byB0aGUgZWZmZWN0IGNoYWluCisgICAgICAgIG1lbXNldChtRWZmZWN0QnVmZmVyLCAwLCBtRWZmZWN0QnVmZmVyU2l6ZSk7CisgICAgfQorICAgIC8vIHNpbmsgb3IgbWl4IGJ1ZmZlciBtdXN0IGJlIGNsZWFyZWQgaWYgYWxsIHRyYWNrcyBhcmUgY29ubmVjdGVkIHRvIGFuCisgICAgLy8gZWZmZWN0IGNoYWluIGFzIGluIHRoaXMgY2FzZSB0aGUgbWl4ZXIgd2lsbCBub3Qgd3JpdGUgdG8gdGhlIHNpbmsgb3IgbWl4IGJ1ZmZlcgorICAgIC8vIGFuZCB0cmFjayBlZmZlY3RzIHdpbGwgYWNjdW11bGF0ZSBpbnRvIGl0CiAgICAgaWYgKChtQnl0ZXNSZW1haW5pbmcgPT0gMCkgJiYgKChtaXhlZFRyYWNrcyAhPSAwICYmIG1peGVkVHJhY2tzID09IHRyYWNrc1dpdGhFZmZlY3QpIHx8CiAgICAgICAgICAgICAobWl4ZWRUcmFja3MgPT0gMCAmJiBmYXN0VHJhY2tzID4gMCkpKSB7CiAgICAgICAgIC8vIEZJWE1FIGFzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLCBzaG91bGQgcmVtZW1iZXIgcHJldmlvdXMgemVybyBzdGF0dXMKLSAgICAgICAgbWVtc2V0KG1NaXhCdWZmZXIsIDAsIG1Ob3JtYWxGcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KSk7CisgICAgICAgIGlmIChtTWl4ZXJCdWZmZXJWYWxpZCkgeworICAgICAgICAgICAgbWVtc2V0KG1NaXhlckJ1ZmZlciwgMCwgbU1peGVyQnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAvLyBUT0RPOiBJbiB0ZXN0aW5nLCBtU2lua0J1ZmZlciBiZWxvdyBuZWVkIG5vdCBiZSBjbGVhcmVkIGJlY2F1c2UKKyAgICAgICAgICAgIC8vIHRoZSBQbGF5YmFja1RocmVhZDo6dGhyZWFkTG9vcCgpIGNvcGllcyBtTWl4ZXJCdWZmZXIgaW50byBtU2lua0J1ZmZlcgorICAgICAgICAgICAgLy8gYWZ0ZXIgbWl4aW5nLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFRvIGVuZm9yY2UgdGhpcyBndWFyYW50ZWU6CisgICAgICAgICAgICAvLyAoKG1peGVkVHJhY2tzICE9IDAgJiYgbWl4ZWRUcmFja3MgPT0gdHJhY2tzV2l0aEVmZmVjdCkgfHwKKyAgICAgICAgICAgIC8vIChtaXhlZFRyYWNrcyA9PSAwICYmIGZhc3RUcmFja3MgPiAwKSkKKyAgICAgICAgICAgIC8vIG11c3QgaW1wbHkgTUlYRVJfVFJBQ0tTX1JFQURZLgorICAgICAgICAgICAgLy8gTGF0ZXIsIHdlIG1heSBjbGVhciBidWZmZXJzIHJlZ2FyZGxlc3MsIGFuZCBza2lwIG11Y2ggb2YgdGhpcyBsb2dpYy4KKyAgICAgICAgfQorICAgICAgICAvLyBGSVhNRSBhcyBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiwgc2hvdWxkIHJlbWVtYmVyIHByZXZpb3VzIHplcm8gc3RhdHVzCisgICAgICAgIG1lbXNldChtU2lua0J1ZmZlciwgMCwgbU5vcm1hbEZyYW1lQ291bnQgKiBtRnJhbWVTaXplKTsKICAgICB9CiAKICAgICAvLyBpZiBhbnkgZmFzdCB0cmFja3MsIHRoZW4gc3RhdHVzIGlzIHJlYWR5CkBAIC0zMzExLDkgKzM3MDgsMTAgQEAKIH0KIAogLy8gZ2V0VHJhY2tOYW1lX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKLWludCBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkOjpnZXRUcmFja05hbWVfbChhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgaW50IHNlc3Npb25JZCkKK2ludCBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkOjpnZXRUcmFja05hbWVfbChhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBpbnQgc2Vzc2lvbklkKQogewotICAgIHJldHVybiBtQXVkaW9NaXhlci0+Z2V0VHJhY2tOYW1lKGNoYW5uZWxNYXNrLCBzZXNzaW9uSWQpOworICAgIHJldHVybiBtQXVkaW9NaXhlci0+Z2V0VHJhY2tOYW1lKGNoYW5uZWxNYXNrLCBmb3JtYXQsIHNlc3Npb25JZCk7CiB9CiAKIC8vIGRlbGV0ZVRyYWNrTmFtZV9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCkBAIC0zMzIzLDEzMCArMzcyMSwxMjIgQEAKICAgICBtQXVkaW9NaXhlci0+ZGVsZXRlVHJhY2tOYW1lKG5hbWUpOwogfQogCi0vLyBjaGVja0Zvck5ld1BhcmFtZXRlcnNfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAotYm9vbCBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkOjpjaGVja0Zvck5ld1BhcmFtZXRlcnNfbCgpCisvLyBjaGVja0Zvck5ld1BhcmFtZXRlcl9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCitib29sIEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6OmNoZWNrRm9yTmV3UGFyYW1ldGVyX2woY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190JiBzdGF0dXMpCiB7Ci0gICAgLy8gaWYgISZJRExFLCBob2xkcyB0aGUgRmFzdE1peGVyIHN0YXRlIHRvIHJlc3RvcmUgYWZ0ZXIgbmV3IHBhcmFtZXRlcnMgcHJvY2Vzc2VkCi0gICAgRmFzdE1peGVyU3RhdGU6OkNvbW1hbmQgcHJldmlvdXNDb21tYW5kID0gRmFzdE1peGVyU3RhdGU6OkhPVF9JRExFOwogICAgIGJvb2wgcmVjb25maWcgPSBmYWxzZTsKIAotICAgIHdoaWxlICghbU5ld1BhcmFtZXRlcnMuaXNFbXB0eSgpKSB7CisgICAgc3RhdHVzID0gTk9fRVJST1I7CiAKLSAgICAgICAgaWYgKG1GYXN0TWl4ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgRmFzdE1peGVyU3RhdGVRdWV1ZSAqc3EgPSBtRmFzdE1peGVyLT5zcSgpOwotICAgICAgICAgICAgRmFzdE1peGVyU3RhdGUgKnN0YXRlID0gc3EtPmJlZ2luKCk7Ci0gICAgICAgICAgICBpZiAoIShzdGF0ZS0+bUNvbW1hbmQgJiBGYXN0TWl4ZXJTdGF0ZTo6SURMRSkpIHsKLSAgICAgICAgICAgICAgICBwcmV2aW91c0NvbW1hbmQgPSBzdGF0ZS0+bUNvbW1hbmQ7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPm1Db21tYW5kID0gRmFzdE1peGVyU3RhdGU6OkhPVF9JRExFOwotICAgICAgICAgICAgICAgIHNxLT5lbmQoKTsKLSAgICAgICAgICAgICAgICBzcS0+cHVzaChGYXN0TWl4ZXJTdGF0ZVF1ZXVlOjpCTE9DS19VTlRJTF9BQ0tFRCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNxLT5lbmQoZmFsc2UgLypkaWRNb2RpZnkqLyk7Ci0gICAgICAgICAgICB9CisgICAgLy8gaWYgISZJRExFLCBob2xkcyB0aGUgRmFzdE1peGVyIHN0YXRlIHRvIHJlc3RvcmUgYWZ0ZXIgbmV3IHBhcmFtZXRlcnMgcHJvY2Vzc2VkCisgICAgRmFzdE1peGVyU3RhdGU6OkNvbW1hbmQgcHJldmlvdXNDb21tYW5kID0gRmFzdE1peGVyU3RhdGU6OkhPVF9JRExFOworICAgIGlmIChtRmFzdE1peGVyICE9IDApIHsKKyAgICAgICAgRmFzdE1peGVyU3RhdGVRdWV1ZSAqc3EgPSBtRmFzdE1peGVyLT5zcSgpOworICAgICAgICBGYXN0TWl4ZXJTdGF0ZSAqc3RhdGUgPSBzcS0+YmVnaW4oKTsKKyAgICAgICAgaWYgKCEoc3RhdGUtPm1Db21tYW5kICYgRmFzdE1peGVyU3RhdGU6OklETEUpKSB7CisgICAgICAgICAgICBwcmV2aW91c0NvbW1hbmQgPSBzdGF0ZS0+bUNvbW1hbmQ7CisgICAgICAgICAgICBzdGF0ZS0+bUNvbW1hbmQgPSBGYXN0TWl4ZXJTdGF0ZTo6SE9UX0lETEU7CisgICAgICAgICAgICBzcS0+ZW5kKCk7CisgICAgICAgICAgICBzcS0+cHVzaChGYXN0TWl4ZXJTdGF0ZVF1ZXVlOjpCTE9DS19VTlRJTF9BQ0tFRCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzcS0+ZW5kKGZhbHNlIC8qZGlkTW9kaWZ5Ki8pOwogICAgICAgICB9CisgICAgfQogCi0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotICAgICAgICBTdHJpbmc4IGtleVZhbHVlUGFpciA9IG1OZXdQYXJhbWV0ZXJzWzBdOwotICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGtleVZhbHVlUGFpcik7Ci0gICAgICAgIGludCB2YWx1ZTsKLQotICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVNhbXBsaW5nUmF0ZSksIHZhbHVlKSA9PSBOT19FUlJPUikgeworICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoa2V5VmFsdWVQYWlyKTsKKyAgICBpbnQgdmFsdWU7CisgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTYW1wbGluZ1JhdGUpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmVjb25maWcgPSB0cnVlOworICAgIH0KKyAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleUZvcm1hdCksIHZhbHVlKSA9PSBOT19FUlJPUikgeworICAgICAgICBpZiAoIWlzVmFsaWRQY21TaW5rRm9ybWF0KChhdWRpb19mb3JtYXRfdCkgdmFsdWUpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBubyBuZWVkIHRvIHNhdmUgdmFsdWUsIHNpbmNlIGl0J3MgY29uc3RhbnQKICAgICAgICAgICAgIHJlY29uZmlnID0gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleUZvcm1hdCksIHZhbHVlKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgaWYgKChhdWRpb19mb3JtYXRfdCkgdmFsdWUgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlY29uZmlnID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlDaGFubmVscyksIHZhbHVlKSA9PSBOT19FUlJPUikgeworICAgICAgICBpZiAoIWlzVmFsaWRQY21TaW5rQ2hhbm5lbE1hc2soKGF1ZGlvX2NoYW5uZWxfbWFza190KSB2YWx1ZSkpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gc2F2ZSB2YWx1ZSwgc2luY2UgaXQncyBjb25zdGFudAorICAgICAgICAgICAgcmVjb25maWcgPSB0cnVlOwogICAgICAgICB9Ci0gICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Q2hhbm5lbHMpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIGlmICgoYXVkaW9fY2hhbm5lbF9tYXNrX3QpIHZhbHVlICE9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTykgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVjb25maWcgPSB0cnVlOwotICAgICAgICAgICAgfQorICAgIH0KKyAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleUZyYW1lQ291bnQpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgLy8gZG8gbm90IGFjY2VwdCBmcmFtZSBjb3VudCBjaGFuZ2VzIGlmIHRyYWNrcyBhcmUgb3BlbiBhcyB0aGUgdHJhY2sgYnVmZmVyCisgICAgICAgIC8vIHNpemUgZGVwZW5kcyBvbiBmcmFtZSBjb3VudCBhbmQgY29ycmVjdCBiZWhhdmlvciB3b3VsZCBub3QgYmUgZ3VhcmFudGVlZAorICAgICAgICAvLyBpZiBmcmFtZSBjb3VudCBpcyBjaGFuZ2VkIGFmdGVyIHRyYWNrIGNyZWF0aW9uCisgICAgICAgIGlmICghbVRyYWNrcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVjb25maWcgPSB0cnVlOwogICAgICAgICB9Ci0gICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5RnJhbWVDb3VudCksIHZhbHVlKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgLy8gZG8gbm90IGFjY2VwdCBmcmFtZSBjb3VudCBjaGFuZ2VzIGlmIHRyYWNrcyBhcmUgb3BlbiBhcyB0aGUgdHJhY2sgYnVmZmVyCi0gICAgICAgICAgICAvLyBzaXplIGRlcGVuZHMgb24gZnJhbWUgY291bnQgYW5kIGNvcnJlY3QgYmVoYXZpb3Igd291bGQgbm90IGJlIGd1YXJhbnRlZWQKLSAgICAgICAgICAgIC8vIGlmIGZyYW1lIGNvdW50IGlzIGNoYW5nZWQgYWZ0ZXIgdHJhY2sgY3JlYXRpb24KLSAgICAgICAgICAgIGlmICghbVRyYWNrcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVjb25maWcgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Um91dGluZyksIHZhbHVlKSA9PSBOT19FUlJPUikgeworICAgIH0KKyAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKICNpZmRlZiBBRERfQkFUVEVSWV9EQVRBCi0gICAgICAgICAgICAvLyB3aGVuIGNoYW5naW5nIHRoZSBhdWRpbyBvdXRwdXQgZGV2aWNlLCBjYWxsIGFkZEJhdHRlcnlEYXRhIHRvIG5vdGlmeQotICAgICAgICAgICAgLy8gdGhlIGNoYW5nZQotICAgICAgICAgICAgaWYgKG1PdXREZXZpY2UgIT0gdmFsdWUpIHsKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBwYXJhbXMgPSAwOwotICAgICAgICAgICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgc3BlYWtlciBpcyBvbgotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUikgewotICAgICAgICAgICAgICAgICAgICBwYXJhbXMgfD0gSU1lZGlhUGxheWVyU2VydmljZTo6a0JhdHRlcnlEYXRhU3BlYWtlck9uOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VXaXRob3V0U3BlYWtlcgotICAgICAgICAgICAgICAgICAgICA9IEFVRElPX0RFVklDRV9PVVRfQUxMICYgfkFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKLSAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiBhbnkgb3RoZXIgZGV2aWNlIChleGNlcHQgc3BlYWtlcikgaXMgb24KLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgJiBkZXZpY2VXaXRob3V0U3BlYWtlciApIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1zIHw9IElNZWRpYVBsYXllclNlcnZpY2U6OmtCYXR0ZXJ5RGF0YU90aGVyQXVkaW9EZXZpY2VPbjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocGFyYW1zICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkQmF0dGVyeURhdGEocGFyYW1zKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIC8vIHdoZW4gY2hhbmdpbmcgdGhlIGF1ZGlvIG91dHB1dCBkZXZpY2UsIGNhbGwgYWRkQmF0dGVyeURhdGEgdG8gbm90aWZ5CisgICAgICAgIC8vIHRoZSBjaGFuZ2UKKyAgICAgICAgaWYgKG1PdXREZXZpY2UgIT0gdmFsdWUpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHBhcmFtcyA9IDA7CisgICAgICAgICAgICAvLyBjaGVjayB3aGV0aGVyIHNwZWFrZXIgaXMgb24KKyAgICAgICAgICAgIGlmICh2YWx1ZSAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUikgeworICAgICAgICAgICAgICAgIHBhcmFtcyB8PSBJTWVkaWFQbGF5ZXJTZXJ2aWNlOjprQmF0dGVyeURhdGFTcGVha2VyT247CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VXaXRob3V0U3BlYWtlcgorICAgICAgICAgICAgICAgID0gQVVESU9fREVWSUNFX09VVF9BTEwgJiB+QVVESU9fREVWSUNFX09VVF9TUEVBS0VSOworICAgICAgICAgICAgLy8gY2hlY2sgaWYgYW55IG90aGVyIGRldmljZSAoZXhjZXB0IHNwZWFrZXIpIGlzIG9uCisgICAgICAgICAgICBpZiAodmFsdWUgJiBkZXZpY2VXaXRob3V0U3BlYWtlciApIHsKKyAgICAgICAgICAgICAgICBwYXJhbXMgfD0gSU1lZGlhUGxheWVyU2VydmljZTo6a0JhdHRlcnlEYXRhT3RoZXJBdWRpb0RldmljZU9uOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocGFyYW1zICE9IDApIHsKKyAgICAgICAgICAgICAgICBhZGRCYXR0ZXJ5RGF0YShwYXJhbXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAjZW5kaWYKIAotICAgICAgICAgICAgLy8gZm9yd2FyZCBkZXZpY2UgY2hhbmdlIHRvIGVmZmVjdHMgdGhhdCBoYXZlIHJlcXVlc3RlZCB0byBiZQotICAgICAgICAgICAgLy8gYXdhcmUgb2YgYXR0YWNoZWQgYXVkaW8gZGV2aWNlLgotICAgICAgICAgICAgaWYgKHZhbHVlICE9IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgbU91dERldmljZSA9IHZhbHVlOwotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdENoYWlucy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBtRWZmZWN0Q2hhaW5zW2ldLT5zZXREZXZpY2VfbChtT3V0RGV2aWNlKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIC8vIGZvcndhcmQgZGV2aWNlIGNoYW5nZSB0byBlZmZlY3RzIHRoYXQgaGF2ZSByZXF1ZXN0ZWQgdG8gYmUKKyAgICAgICAgLy8gYXdhcmUgb2YgYXR0YWNoZWQgYXVkaW8gZGV2aWNlLgorICAgICAgICBpZiAodmFsdWUgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgIG1PdXREZXZpY2UgPSB2YWx1ZTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdENoYWlucy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIG1FZmZlY3RDaGFpbnNbaV0tPnNldERldmljZV9sKG1PdXREZXZpY2UpOwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgfQogCi0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIHN0YXR1cyA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLnNldF9wYXJhbWV0ZXJzKCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlUGFpci5zdHJpbmcoKSk7CisgICAgICAgIGlmICghbVN0YW5kYnkgJiYgc3RhdHVzID09IElOVkFMSURfT1BFUkFUSU9OKSB7CisgICAgICAgICAgICBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zdGFuZGJ5KCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbik7CisgICAgICAgICAgICBtU3RhbmRieSA9IHRydWU7CisgICAgICAgICAgICBtQnl0ZXNXcml0dGVuID0gMDsKICAgICAgICAgICAgIHN0YXR1cyA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLnNldF9wYXJhbWV0ZXJzKCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZVBhaXIuc3RyaW5nKCkpOwotICAgICAgICAgICAgaWYgKCFtU3RhbmRieSAmJiBzdGF0dXMgPT0gSU5WQUxJRF9PUEVSQVRJT04pIHsKLSAgICAgICAgICAgICAgICBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zdGFuZGJ5KCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbik7Ci0gICAgICAgICAgICAgICAgbVN0YW5kYnkgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1CeXRlc1dyaXR0ZW4gPSAwOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLnNldF9wYXJhbWV0ZXJzKCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZVBhaXIuc3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiByZWNvbmZpZykgewotICAgICAgICAgICAgICAgIHJlYWRPdXRwdXRQYXJhbWV0ZXJzKCk7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIG1BdWRpb01peGVyOwotICAgICAgICAgICAgICAgIG1BdWRpb01peGVyID0gbmV3IEF1ZGlvTWl4ZXIobU5vcm1hbEZyYW1lQ291bnQsIG1TYW1wbGVSYXRlKTsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpIDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBuYW1lID0gZ2V0VHJhY2tOYW1lX2wobVRyYWNrc1tpXS0+bUNoYW5uZWxNYXNrLCBtVHJhY2tzW2ldLT5tU2Vzc2lvbklkKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtVHJhY2tzW2ldLT5tTmFtZSA9IG5hbWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woQXVkaW9TeXN0ZW06Ok9VVFBVVF9DT05GSUdfQ0hBTkdFRCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZVBhaXIuc3RyaW5nKCkpOwogICAgICAgICB9Ci0KLSAgICAgICAgbU5ld1BhcmFtZXRlcnMucmVtb3ZlQXQoMCk7Ci0KLSAgICAgICAgbVBhcmFtU3RhdHVzID0gc3RhdHVzOwotICAgICAgICBtUGFyYW1Db25kLnNpZ25hbCgpOwotICAgICAgICAvLyB3YWl0IGZvciBjb25kaXRpb24gd2l0aCB0aW1lIG91dCBpbiBjYXNlIHRoZSB0aHJlYWQgY2FsbGluZyBUaHJlYWRCYXNlOjpzZXRQYXJhbWV0ZXJzKCkKLSAgICAgICAgLy8gYWxyZWFkeSB0aW1lZCBvdXQgd2FpdGluZyBmb3IgdGhlIHN0YXR1cyBhbmQgd2lsbCBuZXZlciBzaWduYWwgdGhlIGNvbmRpdGlvbi4KLSAgICAgICAgbVdhaXRXb3JrQ1Yud2FpdFJlbGF0aXZlKG1Mb2NrLCBrU2V0UGFyYW1ldGVyc1RpbWVvdXROcyk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgcmVjb25maWcpIHsKKyAgICAgICAgICAgIHJlYWRPdXRwdXRQYXJhbWV0ZXJzX2woKTsKKyAgICAgICAgICAgIGRlbGV0ZSBtQXVkaW9NaXhlcjsKKyAgICAgICAgICAgIG1BdWRpb01peGVyID0gbmV3IEF1ZGlvTWl4ZXIobU5vcm1hbEZyYW1lQ291bnQsIG1TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCkgOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgbmFtZSA9IGdldFRyYWNrTmFtZV9sKG1UcmFja3NbaV0tPm1DaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFja3NbaV0tPm1Gb3JtYXQsIG1UcmFja3NbaV0tPm1TZXNzaW9uSWQpOworICAgICAgICAgICAgICAgIGlmIChuYW1lIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVRyYWNrc1tpXS0+bU5hbWUgPSBuYW1lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2VuZElvQ29uZmlnRXZlbnRfbChBdWRpb1N5c3RlbTo6T1VUUFVUX0NPTkZJR19DSEFOR0VEKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmICghKHByZXZpb3VzQ29tbWFuZCAmIEZhc3RNaXhlclN0YXRlOjpJRExFKSkgewotICAgICAgICBBTE9HX0FTU0VSVChtRmFzdE1peGVyICE9IE5VTEwpOworICAgICAgICBBTE9HX0FTU0VSVChtRmFzdE1peGVyICE9IDApOwogICAgICAgICBGYXN0TWl4ZXJTdGF0ZVF1ZXVlICpzcSA9IG1GYXN0TWl4ZXItPnNxKCk7CiAgICAgICAgIEZhc3RNaXhlclN0YXRlICpzdGF0ZSA9IHNxLT5iZWdpbigpOwogICAgICAgICBBTE9HX0FTU0VSVChzdGF0ZS0+bUNvbW1hbmQgPT0gRmFzdE1peGVyU3RhdGU6OkhPVF9JRExFKTsKQEAgLTM0NjcsOSArMzg1Nyw3IEBACiAKICAgICBQbGF5YmFja1RocmVhZDo6ZHVtcEludGVybmFscyhmZCwgYXJncyk7CiAKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJBdWRpb01peGVyIHRyYWNrczogJTA4eFxuIiwgbUF1ZGlvTWl4ZXItPnRyYWNrTmFtZXMoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIGRwcmludGYoZmQsICIgIEF1ZGlvTWl4ZXIgdHJhY2tzOiAweCUwOHhcbiIsIG1BdWRpb01peGVyLT50cmFja05hbWVzKCkpOwogCiAgICAgLy8gTWFrZSBhIG5vbi1hdG9taWMgY29weSBvZiBmYXN0IG1peGVyIGR1bXAgc3RhdGUgc28gaXQgd29uJ3QgY2hhbmdlIHVuZGVybmVhdGggdXMKICAgICBjb25zdCBGYXN0TWl4ZXJEdW1wU3RhdGUgY29weShtRmFzdE1peGVyRHVtcFN0YXRlKTsKQEAgLTM1NTAsMTMgKzM5MzgsMTcgQEAKICAgICAgICAgZmxvYXQgdHlwZVZvbHVtZSA9IG1TdHJlYW1UeXBlc1t0cmFjay0+c3RyZWFtVHlwZSgpXS52b2x1bWU7CiAgICAgICAgIGZsb2F0IHYgPSBtTWFzdGVyVm9sdW1lICogdHlwZVZvbHVtZTsKICAgICAgICAgQXVkaW9UcmFja1NlcnZlclByb3h5ICpwcm94eSA9IHRyYWNrLT5tQXVkaW9UcmFja1NlcnZlclByb3h5OwotICAgICAgICB1aW50MzJfdCB2bHIgPSBwcm94eS0+Z2V0Vm9sdW1lTFIoKTsKLSAgICAgICAgZmxvYXQgdl9jbGFtcGVkID0gdiAqICh2bHIgJiAweEZGRkYpOwotICAgICAgICBpZiAodl9jbGFtcGVkID4gTUFYX0dBSU4pIHZfY2xhbXBlZCA9IE1BWF9HQUlOOwotICAgICAgICBsZWZ0ID0gdl9jbGFtcGVkL01BWF9HQUlOOwotICAgICAgICB2X2NsYW1wZWQgPSB2ICogKHZsciA+PiAxNik7Ci0gICAgICAgIGlmICh2X2NsYW1wZWQgPiBNQVhfR0FJTikgdl9jbGFtcGVkID0gTUFYX0dBSU47Ci0gICAgICAgIHJpZ2h0ID0gdl9jbGFtcGVkL01BWF9HQUlOOworICAgICAgICBnYWluX21pbmlmbG9hdF9wYWNrZWRfdCB2bHIgPSBwcm94eS0+Z2V0Vm9sdW1lTFIoKTsKKyAgICAgICAgbGVmdCA9IGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfbGVmdCh2bHIpKTsKKyAgICAgICAgaWYgKGxlZnQgPiBHQUlOX0ZMT0FUX1VOSVRZKSB7CisgICAgICAgICAgICBsZWZ0ID0gR0FJTl9GTE9BVF9VTklUWTsKKyAgICAgICAgfQorICAgICAgICBsZWZ0ICo9IHY7CisgICAgICAgIHJpZ2h0ID0gZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19yaWdodCh2bHIpKTsKKyAgICAgICAgaWYgKHJpZ2h0ID4gR0FJTl9GTE9BVF9VTklUWSkgeworICAgICAgICAgICAgcmlnaHQgPSBHQUlOX0ZMT0FUX1VOSVRZOworICAgICAgICB9CisgICAgICAgIHJpZ2h0ICo9IHY7CiAgICAgfQogCiAgICAgaWYgKGxhc3RUcmFjaykgewpAQCAtMzYxMSwxNCArNDAwMywxNCBAQAogICAgICAgICAvLyBUaGUgZmlyc3QgdGltZSBhIHRyYWNrIGlzIGFkZGVkIHdlIHdhaXQKICAgICAgICAgLy8gZm9yIGFsbCBpdHMgYnVmZmVycyB0byBiZSBmaWxsZWQgYmVmb3JlIHByb2Nlc3NpbmcgaXQKICAgICAgICAgdWludDMyX3QgbWluRnJhbWVzOwotICAgICAgICBpZiAoKHRyYWNrLT5zaGFyZWRCdWZmZXIoKSA9PSAwKSAmJiAhdHJhY2stPmlzU3RvcHBlZCgpICYmICF0cmFjay0+aXNQYXVzaW5nKCkpIHsKKyAgICAgICAgaWYgKCh0cmFjay0+c2hhcmVkQnVmZmVyKCkgPT0gMCkgJiYgIXRyYWNrLT5pc1N0b3BwaW5nXzEoKSAmJiAhdHJhY2stPmlzUGF1c2luZygpKSB7CiAgICAgICAgICAgICBtaW5GcmFtZXMgPSBtTm9ybWFsRnJhbWVDb3VudDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1pbkZyYW1lcyA9IDE7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoKHRyYWNrLT5mcmFtZXNSZWFkeSgpID49IG1pbkZyYW1lcykgJiYgdHJhY2stPmlzUmVhZHkoKSAmJgotICAgICAgICAgICAgICAgICF0cmFjay0+aXNQYXVzZWQoKSAmJiAhdHJhY2stPmlzVGVybWluYXRlZCgpKQorICAgICAgICBpZiAoKHRyYWNrLT5mcmFtZXNSZWFkeSgpID49IG1pbkZyYW1lcykgJiYgdHJhY2stPmlzUmVhZHkoKSAmJiAhdHJhY2stPmlzUGF1c2VkKCkgJiYKKyAgICAgICAgICAgICAgICAhdHJhY2stPmlzU3RvcHBpbmdfMigpICYmICF0cmFjay0+aXNTdG9wcGVkKCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIEFMT0dWVigidHJhY2sgJWQgcz0lMDh4IFtPS10iLCB0cmFjay0+bmFtZSgpLCBjYmxrLT5tU2VydmVyKTsKIApAQCAtMzY0NSwxOCArNDAzNywzMCBAQAogICAgICAgICAgICAgaWYgKCFtRWZmZWN0Q2hhaW5zLmlzRW1wdHkoKSAmJiBsYXN0KSB7CiAgICAgICAgICAgICAgICAgbUVmZmVjdENoYWluc1swXS0+Y2xlYXJJbnB1dEJ1ZmZlcigpOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBTE9HVlYoInRyYWNrICVkIHM9JTA4eCBbTk9UIFJFQURZXSIsIHRyYWNrLT5uYW1lKCksIGNibGstPm1TZXJ2ZXIpOwotICAgICAgICAgICAgaWYgKCh0cmFjay0+c2hhcmVkQnVmZmVyKCkgIT0gMCkgfHwgdHJhY2stPmlzVGVybWluYXRlZCgpIHx8Ci0gICAgICAgICAgICAgICAgICAgIHRyYWNrLT5pc1N0b3BwZWQoKSB8fCB0cmFjay0+aXNQYXVzZWQoKSkgeworICAgICAgICAgICAgaWYgKHRyYWNrLT5pc1N0b3BwaW5nXzEoKSkgeworICAgICAgICAgICAgICAgIHRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OlNUT1BQSU5HXzI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHRyYWNrLT5zaGFyZWRCdWZmZXIoKSAhPSAwKSB8fCB0cmFjay0+aXNTdG9wcGVkKCkgfHwKKyAgICAgICAgICAgICAgICAgICAgdHJhY2stPmlzU3RvcHBpbmdfMigpIHx8IHRyYWNrLT5pc1BhdXNlZCgpKSB7CiAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBjb25zdW1lZCBhbGwgdGhlIGJ1ZmZlcnMgb2YgdGhpcyB0cmFjay4KICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgaXQgZnJvbSB0aGUgbGlzdCBvZiBhY3RpdmUgdHJhY2tzLgotICAgICAgICAgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCBiZWhhdmlvciBmb3IgY29tcHJlc3NlZCBhdWRpbwotICAgICAgICAgICAgICAgIHNpemVfdCBhdWRpb0hBTEZyYW1lcyA9IChsYXRlbmN5X2woKSAqIG1TYW1wbGVSYXRlKSAvIDEwMDA7CisgICAgICAgICAgICAgICAgc2l6ZV90IGF1ZGlvSEFMRnJhbWVzOworICAgICAgICAgICAgICAgIGlmIChhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgICAgIGF1ZGlvSEFMRnJhbWVzID0gKGxhdGVuY3lfbCgpICogbVNhbXBsZVJhdGUpIC8gMTAwMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhdWRpb0hBTEZyYW1lcyA9IDA7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lc1dyaXR0ZW4gPSBtQnl0ZXNXcml0dGVuIC8gbUZyYW1lU2l6ZTsKICAgICAgICAgICAgICAgICBpZiAobVN0YW5kYnkgfHwgIWxhc3QgfHwKICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5wcmVzZW50YXRpb25Db21wbGV0ZShmcmFtZXNXcml0dGVuLCBhdWRpb0hBTEZyYW1lcykpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5pc1N0b3BwaW5nXzIoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6U1RPUFBFRDsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2stPmlzU3RvcHBlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2stPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OkZMVVNIRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHVzaEh3X2woKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5yZXNldCgpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHRyYWNrc1RvUmVtb3ZlLT5hZGQodHJhY2spOwpAQCAtMzY4Nyw3ICs0MDkxLDcgQEAKIHZvaWQgQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OnRocmVhZExvb3BfbWl4KCkKIHsKICAgICBzaXplX3QgZnJhbWVDb3VudCA9IG1GcmFtZUNvdW50OwotICAgIGludDhfdCAqY3VyQnVmID0gKGludDhfdCAqKW1NaXhCdWZmZXI7CisgICAgaW50OF90ICpjdXJCdWYgPSAoaW50OF90ICopbVNpbmtCdWZmZXI7CiAgICAgLy8gb3V0cHV0IGF1ZGlvIHRvIGhhcmR3YXJlCiAgICAgd2hpbGUgKGZyYW1lQ291bnQpIHsKICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyIGJ1ZmZlcjsKQEAgLTM3MDIsNyArNDEwNiw3IEBACiAgICAgICAgIGN1ckJ1ZiArPSBidWZmZXIuZnJhbWVDb3VudCAqIG1GcmFtZVNpemU7CiAgICAgICAgIG1BY3RpdmVUcmFjay0+cmVsZWFzZUJ1ZmZlcigmYnVmZmVyKTsKICAgICB9Ci0gICAgbUN1cnJlbnRXcml0ZUxlbmd0aCA9IGN1ckJ1ZiAtIChpbnQ4X3QgKiltTWl4QnVmZmVyOworICAgIG1DdXJyZW50V3JpdGVMZW5ndGggPSBjdXJCdWYgLSAoaW50OF90ICopbVNpbmtCdWZmZXI7CiAgICAgc2xlZXBUaW1lID0gMDsKICAgICBzdGFuZGJ5VGltZSA9IHN5c3RlbVRpbWUoKSArIHN0YW5kYnlEZWxheTsKICAgICBtQWN0aXZlVHJhY2suY2xlYXIoKTsKQEAgLTM3MTcsNjggKzQxMjEsNjkgQEAKICAgICAgICAgICAgIHNsZWVwVGltZSA9IGlkbGVTbGVlcFRpbWU7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG1CeXRlc1dyaXR0ZW4gIT0gMCAmJiBhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpKSB7Ci0gICAgICAgIG1lbXNldChtTWl4QnVmZmVyLCAwLCBtRnJhbWVDb3VudCAqIG1GcmFtZVNpemUpOworICAgICAgICBtZW1zZXQobVNpbmtCdWZmZXIsIDAsIG1GcmFtZUNvdW50ICogbUZyYW1lU2l6ZSk7CiAgICAgICAgIHNsZWVwVGltZSA9IDA7CiAgICAgfQogfQogCiAvLyBnZXRUcmFja05hbWVfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAotaW50IEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpnZXRUcmFja05hbWVfbChhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgaW50IHNlc3Npb25JZCkKK2ludCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6Z2V0VHJhY2tOYW1lX2woYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgX191bnVzZWQsCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCBfX3VudXNlZCwgaW50IHNlc3Npb25JZCBfX3VudXNlZCkKIHsKICAgICByZXR1cm4gMDsKIH0KIAogLy8gZGVsZXRlVHJhY2tOYW1lX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKLXZvaWQgQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OmRlbGV0ZVRyYWNrTmFtZV9sKGludCBuYW1lKQordm9pZCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6ZGVsZXRlVHJhY2tOYW1lX2woaW50IG5hbWUgX191bnVzZWQpCiB7CiB9CiAKLS8vIGNoZWNrRm9yTmV3UGFyYW1ldGVyc19sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCi1ib29sIEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpjaGVja0Zvck5ld1BhcmFtZXRlcnNfbCgpCisvLyBjaGVja0Zvck5ld1BhcmFtZXRlcl9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCitib29sIEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpjaGVja0Zvck5ld1BhcmFtZXRlcl9sKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QmIHN0YXR1cykKIHsKICAgICBib29sIHJlY29uZmlnID0gZmFsc2U7CiAKLSAgICB3aGlsZSAoIW1OZXdQYXJhbWV0ZXJzLmlzRW1wdHkoKSkgewotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICAgICAgU3RyaW5nOCBrZXlWYWx1ZVBhaXIgPSBtTmV3UGFyYW1ldGVyc1swXTsKLSAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihrZXlWYWx1ZVBhaXIpOwotICAgICAgICBpbnQgdmFsdWU7CisgICAgc3RhdHVzID0gTk9fRVJST1I7CiAKLSAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlGcmFtZUNvdW50KSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAvLyBkbyBub3QgYWNjZXB0IGZyYW1lIGNvdW50IGNoYW5nZXMgaWYgdHJhY2tzIGFyZSBvcGVuIGFzIHRoZSB0cmFjayBidWZmZXIKLSAgICAgICAgICAgIC8vIHNpemUgZGVwZW5kcyBvbiBmcmFtZSBjb3VudCBhbmQgY29ycmVjdCBiZWhhdmlvciB3b3VsZCBub3QgYmUgZ2FyYW50aWVkCi0gICAgICAgICAgICAvLyBpZiBmcmFtZSBjb3VudCBpcyBjaGFuZ2VkIGFmdGVyIHRyYWNrIGNyZWF0aW9uCi0gICAgICAgICAgICBpZiAoIW1UcmFja3MuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlY29uZmlnID0gdHJ1ZTsKKyAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGtleVZhbHVlUGFpcik7CisgICAgaW50IHZhbHVlOworICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Um91dGluZyksIHZhbHVlKSA9PSBOT19FUlJPUikgeworICAgICAgICAvLyBmb3J3YXJkIGRldmljZSBjaGFuZ2UgdG8gZWZmZWN0cyB0aGF0IGhhdmUgcmVxdWVzdGVkIHRvIGJlCisgICAgICAgIC8vIGF3YXJlIG9mIGF0dGFjaGVkIGF1ZGlvIGRldmljZS4KKyAgICAgICAgaWYgKHZhbHVlICE9IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICBtT3V0RGV2aWNlID0gdmFsdWU7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtRWZmZWN0Q2hhaW5zW2ldLT5zZXREZXZpY2VfbChtT3V0RGV2aWNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zZXRfcGFyYW1ldGVycygmbU91dHB1dC0+c3RyZWFtLT5jb21tb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5VmFsdWVQYWlyLnN0cmluZygpKTsKLSAgICAgICAgICAgIGlmICghbVN0YW5kYnkgJiYgc3RhdHVzID09IElOVkFMSURfT1BFUkFUSU9OKSB7Ci0gICAgICAgICAgICAgICAgbU91dHB1dC0+c3RyZWFtLT5jb21tb24uc3RhbmRieSgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOwotICAgICAgICAgICAgICAgIG1TdGFuZGJ5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtQnl0ZXNXcml0dGVuID0gMDsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zZXRfcGFyYW1ldGVycygmbU91dHB1dC0+c3RyZWFtLT5jb21tb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5VmFsdWVQYWlyLnN0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgcmVjb25maWcpIHsKLSAgICAgICAgICAgICAgICByZWFkT3V0cHV0UGFyYW1ldGVycygpOwotICAgICAgICAgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woQXVkaW9TeXN0ZW06Ok9VVFBVVF9DT05GSUdfQ0hBTkdFRCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtTmV3UGFyYW1ldGVycy5yZW1vdmVBdCgwKTsKLQotICAgICAgICBtUGFyYW1TdGF0dXMgPSBzdGF0dXM7Ci0gICAgICAgIG1QYXJhbUNvbmQuc2lnbmFsKCk7Ci0gICAgICAgIC8vIHdhaXQgZm9yIGNvbmRpdGlvbiB3aXRoIHRpbWUgb3V0IGluIGNhc2UgdGhlIHRocmVhZCBjYWxsaW5nIFRocmVhZEJhc2U6OnNldFBhcmFtZXRlcnMoKQotICAgICAgICAvLyBhbHJlYWR5IHRpbWVkIG91dCB3YWl0aW5nIGZvciB0aGUgc3RhdHVzIGFuZCB3aWxsIG5ldmVyIHNpZ25hbCB0aGUgY29uZGl0aW9uLgotICAgICAgICBtV2FpdFdvcmtDVi53YWl0UmVsYXRpdmUobUxvY2ssIGtTZXRQYXJhbWV0ZXJzVGltZW91dE5zKTsKICAgICB9CisgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlGcmFtZUNvdW50KSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CisgICAgICAgIC8vIGRvIG5vdCBhY2NlcHQgZnJhbWUgY291bnQgY2hhbmdlcyBpZiB0cmFja3MgYXJlIG9wZW4gYXMgdGhlIHRyYWNrIGJ1ZmZlcgorICAgICAgICAvLyBzaXplIGRlcGVuZHMgb24gZnJhbWUgY291bnQgYW5kIGNvcnJlY3QgYmVoYXZpb3Igd291bGQgbm90IGJlIGdhcmFudGllZAorICAgICAgICAvLyBpZiBmcmFtZSBjb3VudCBpcyBjaGFuZ2VkIGFmdGVyIHRyYWNrIGNyZWF0aW9uCisgICAgICAgIGlmICghbVRyYWNrcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVjb25maWcgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgc3RhdHVzID0gbU91dHB1dC0+c3RyZWFtLT5jb21tb24uc2V0X3BhcmFtZXRlcnMoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5VmFsdWVQYWlyLnN0cmluZygpKTsKKyAgICAgICAgaWYgKCFtU3RhbmRieSAmJiBzdGF0dXMgPT0gSU5WQUxJRF9PUEVSQVRJT04pIHsKKyAgICAgICAgICAgIG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLnN0YW5kYnkoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKTsKKyAgICAgICAgICAgIG1TdGFuZGJ5ID0gdHJ1ZTsKKyAgICAgICAgICAgIG1CeXRlc1dyaXR0ZW4gPSAwOworICAgICAgICAgICAgc3RhdHVzID0gbU91dHB1dC0+c3RyZWFtLT5jb21tb24uc2V0X3BhcmFtZXRlcnMoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5VmFsdWVQYWlyLnN0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIHJlY29uZmlnKSB7CisgICAgICAgICAgICByZWFkT3V0cHV0UGFyYW1ldGVyc19sKCk7CisgICAgICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKEF1ZGlvU3lzdGVtOjpPVVRQVVRfQ09ORklHX0NIQU5HRUQpOworICAgICAgICB9CisgICAgfQorCiAgICAgcmV0dXJuIHJlY29uZmlnOwogfQogCkBAIC0zODI4LDYgKzQyMzMsMTIgQEAKICAgICB9CiB9CiAKK3ZvaWQgQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OmZsdXNoSHdfbCgpCit7CisgICAgaWYgKG1PdXRwdXQtPnN0cmVhbS0+Zmx1c2ggIT0gTlVMTCkKKyAgICAgICAgbU91dHB1dC0+c3RyZWFtLT5mbHVzaChtT3V0cHV0LT5zdHJlYW0pOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIEF1ZGlvRmxpbmdlcjo6QXN5bmNDYWxsYmFja1RocmVhZDo6QXN5bmNDYWxsYmFja1RocmVhZCgKQEAgLTM5NTEsNyArNDM2MiwxMCBAQAogICAgICAgICBtTWl4ZXJTdGF0dXMgPSBNSVhFUl9EUkFJTl9BTEw7CiAgICAgICAgIHRocmVhZExvb3BfZHJhaW4oKTsKICAgICB9Ci0gICAgbUNhbGxiYWNrVGhyZWFkLT5leGl0KCk7CisgICAgaWYgKG1Vc2VBc3luY1dyaXRlKSB7CisgICAgICAgIEFMT0dfQVNTRVJUKG1DYWxsYmFja1RocmVhZCAhPSAwKTsKKyAgICAgICAgbUNhbGxiYWNrVGhyZWFkLT5leGl0KCk7CisgICAgfQogICAgIFBsYXliYWNrVGhyZWFkOjp0aHJlYWRMb29wX2V4aXQoKTsKIH0KIApAQCAtMzk4Myw2ICs0Mzk3LDE3IEBACiAgICAgICAgIHNwPFRyYWNrPiBsID0gbUxhdGVzdEFjdGl2ZVRyYWNrLnByb21vdGUoKTsKICAgICAgICAgYm9vbCBsYXN0ID0gbC5nZXQoKSA9PSB0cmFjazsKIAorICAgICAgICBpZiAodHJhY2stPmlzSW52YWxpZCgpKSB7CisgICAgICAgICAgICBBTE9HVygiQW4gaW52YWxpZGF0ZWQgdHJhY2sgc2hvdWxkbid0IGJlIGluIGFjdGl2ZSBsaXN0Iik7CisgICAgICAgICAgICB0cmFja3NUb1JlbW92ZS0+YWRkKHRyYWNrKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpJRExFKSB7CisgICAgICAgICAgICBBTE9HVygiQW4gaWRsZSB0cmFjayBzaG91bGRuJ3QgYmUgaW4gYWN0aXZlIGxpc3QiKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKICAgICAgICAgaWYgKHRyYWNrLT5pc1BhdXNpbmcoKSkgewogICAgICAgICAgICAgdHJhY2stPnNldFBhdXNlZCgpOwogICAgICAgICAgICAgaWYgKGxhc3QpIHsKQEAgLTQwMDEsMzIgKzQ0MjYsMzkgQEAKICAgICAgICAgICAgICAgICBtQnl0ZXNSZW1haW5pbmcgPSAwOyAgICAvLyBzdG9wIHdyaXRpbmcKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRyYWNrc1RvUmVtb3ZlLT5hZGQodHJhY2spOwotICAgICAgICB9IGVsc2UgaWYgKHRyYWNrLT5mcmFtZXNSZWFkeSgpICYmIHRyYWNrLT5pc1JlYWR5KCkgJiYKKyAgICAgICAgfSBlbHNlIGlmICh0cmFjay0+aXNGbHVzaFBlbmRpbmcoKSkgeworICAgICAgICAgICAgdHJhY2stPmZsdXNoQWNrKCk7CisgICAgICAgICAgICBpZiAobGFzdCkgeworICAgICAgICAgICAgICAgIG1GbHVzaFBlbmRpbmcgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHRyYWNrLT5pc1Jlc3VtZVBlbmRpbmcoKSl7CisgICAgICAgICAgICB0cmFjay0+cmVzdW1lQWNrKCk7CisgICAgICAgICAgICBpZiAobGFzdCkgeworICAgICAgICAgICAgICAgIGlmIChtUGF1c2VkQnl0ZXNSZW1haW5pbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTmVlZCB0byBjb250aW51ZSB3cml0ZSB0aGF0IHdhcyBpbnRlcnJ1cHRlZAorICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFdyaXRlTGVuZ3RoID0gbVBhdXNlZFdyaXRlTGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBtQnl0ZXNSZW1haW5pbmcgPSBtUGF1c2VkQnl0ZXNSZW1haW5pbmc7CisgICAgICAgICAgICAgICAgICAgIG1QYXVzZWRCeXRlc1JlbWFpbmluZyA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtSHdQYXVzZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgZG9Id1Jlc3VtZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG1Id1BhdXNlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAvLyB0aHJlYWRMb29wX21peCgpIHdpbGwgaGFuZGxlIHRoZSBjYXNlIHRoYXQgd2UgbmVlZCB0bworICAgICAgICAgICAgICAgICAgICAvLyByZXN1bWUgYW4gaW50ZXJydXB0ZWQgd3JpdGUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gZW5hYmxlIHdyaXRlIHRvIGF1ZGlvIEhBTAorICAgICAgICAgICAgICAgIHNsZWVwVGltZSA9IDA7CisKKyAgICAgICAgICAgICAgICAvLyBEbyBub3QgaGFuZGxlIG5ldyBkYXRhIGluIHRoaXMgaXRlcmF0aW9uIGV2ZW4gaWYgdHJhY2stPmZyYW1lc1JlYWR5KCkKKyAgICAgICAgICAgICAgICBtaXhlclN0YXR1cyA9IE1JWEVSX1RSQUNLU19FTkFCTEVEOworICAgICAgICAgICAgfQorICAgICAgICB9ICBlbHNlIGlmICh0cmFjay0+ZnJhbWVzUmVhZHkoKSAmJiB0cmFjay0+aXNSZWFkeSgpICYmCiAgICAgICAgICAgICAgICAgIXRyYWNrLT5pc1BhdXNlZCgpICYmICF0cmFjay0+aXNUZXJtaW5hdGVkKCkgJiYgIXRyYWNrLT5pc1N0b3BwaW5nXzIoKSkgewogICAgICAgICAgICAgQUxPR1ZWKCJPZmZsb2FkVGhyZWFkOiB0cmFjayAlZCBzPSUwOHggW09LXSIsIHRyYWNrLT5uYW1lKCksIGNibGstPm1TZXJ2ZXIpOwogICAgICAgICAgICAgaWYgKHRyYWNrLT5tRmlsbGluZ1VwU3RhdHVzID09IFRyYWNrOjpGU19GSUxMRUQpIHsKICAgICAgICAgICAgICAgICB0cmFjay0+bUZpbGxpbmdVcFN0YXR1cyA9IFRyYWNrOjpGU19BQ1RJVkU7CiAgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHByb2Nlc3NWb2x1bWVfbCgpIHdpbGwgYXBwbHkgbmV3IHZvbHVtZSBldmVuIGlmIDAKICAgICAgICAgICAgICAgICBtTGVmdFZvbEZsb2F0ID0gbVJpZ2h0Vm9sRmxvYXQgPSAtMS4wOwotICAgICAgICAgICAgICAgIGlmICh0cmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6UkVTVU1JTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6QUNUSVZFOwotICAgICAgICAgICAgICAgICAgICBpZiAobGFzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1QYXVzZWRCeXRlc1JlbWFpbmluZykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gY29udGludWUgd3JpdGUgdGhhdCB3YXMgaW50ZXJydXB0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFdyaXRlTGVuZ3RoID0gbVBhdXNlZFdyaXRlTGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CeXRlc1JlbWFpbmluZyA9IG1QYXVzZWRCeXRlc1JlbWFpbmluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGF1c2VkQnl0ZXNSZW1haW5pbmcgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Id1BhdXNlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvSHdSZXN1bWUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Id1BhdXNlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocmVhZExvb3BfbWl4KCkgd2lsbCBoYW5kbGUgdGhlIGNhc2UgdGhhdCB3ZSBuZWVkIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdW1lIGFuIGludGVycnVwdGVkIHdyaXRlCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbmFibGUgd3JpdGUgdG8gYXVkaW8gSEFMCi0gICAgICAgICAgICAgICAgICAgICAgICBzbGVlcFRpbWUgPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobGFzdCkgewpAQCAtNDA1MCw3ICs0NDgyLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlZWsgd2hlbiByZXN1bWluZy4KICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c1RyYWNrLT5zZXNzaW9uSWQoKSAhPSB0cmFjay0+c2Vzc2lvbklkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1RyYWNrLT5pbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoUGVuZGluZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC00MDk2LDcgKzQ1MjcsNyBAQAogICAgICAgICAgICAgICAgICAgICBzaXplX3QgYXVkaW9IQUxGcmFtZXMgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtT3V0cHV0LT5zdHJlYW0tPmdldF9sYXRlbmN5KG1PdXRwdXQtPnN0cmVhbSkqbVNhbXBsZVJhdGUpIC8gMTAwMDsKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lc1dyaXR0ZW4gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CeXRlc1dyaXR0ZW4gLyBhdWRpb19zdHJlYW1fZnJhbWVfc2l6ZSgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CeXRlc1dyaXR0ZW4gLyBhdWRpb19zdHJlYW1fb3V0X2ZyYW1lX3NpemUobU91dHB1dC0+c3RyZWFtKTsKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnByZXNlbnRhdGlvbkNvbXBsZXRlKGZyYW1lc1dyaXR0ZW4sIGF1ZGlvSEFMRnJhbWVzKTsKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnJlc2V0KCk7CiAgICAgICAgICAgICAgICAgICAgIHRyYWNrc1RvUmVtb3ZlLT5hZGQodHJhY2spOwpAQCAtNDEyNiw5ICs0NTU3LDYgQEAKICAgICAvLyBpZiByZXN1bWUgaXMgcmVjZWl2ZWQgYmVmb3JlIHBhdXNlIGlzIGV4ZWN1dGVkLgogICAgIGlmICghbVN0YW5kYnkgJiYgKGRvSHdQYXVzZSB8fCAobUZsdXNoUGVuZGluZyAmJiAhbUh3UGF1c2VkICYmIChjb3VudCAhPSAwKSkpKSB7CiAgICAgICAgIG1PdXRwdXQtPnN0cmVhbS0+cGF1c2UobU91dHB1dC0+c3RyZWFtKTsKLSAgICAgICAgaWYgKCFkb0h3UGF1c2UpIHsKLSAgICAgICAgICAgIGRvSHdSZXN1bWUgPSB0cnVlOwotICAgICAgICB9CiAgICAgfQogICAgIGlmIChtRmx1c2hQZW5kaW5nKSB7CiAgICAgICAgIGZsdXNoSHdfbCgpOwpAQCAtNDE0NCwxMSArNDU3Miw2IEBACiAgICAgcmV0dXJuIG1peGVyU3RhdHVzOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6T2ZmbG9hZFRocmVhZDo6Zmx1c2hPdXRwdXRfbCgpCi17Ci0gICAgbUZsdXNoUGVuZGluZyA9IHRydWU7Ci19Ci0KIC8vIG11c3QgYmUgY2FsbGVkIHdpdGggdGhyZWFkIG11dGV4IGxvY2tlZAogYm9vbCBBdWRpb0ZsaW5nZXI6Ok9mZmxvYWRUaHJlYWQ6OndhaXRpbmdBc3luY0NhbGxiYWNrX2woKQogewpAQCAtNDE2MywxNSArNDU4NiwxNSBAQAogLy8gbXVzdCBiZSBjYWxsZWQgd2l0aCB0aHJlYWQgbXV0ZXggbG9ja2VkCiBib29sIEF1ZGlvRmxpbmdlcjo6T2ZmbG9hZFRocmVhZDo6c2hvdWxkU3RhbmRieV9sKCkKIHsKLSAgICBib29sIFRyYWNrUGF1c2VkID0gZmFsc2U7CisgICAgYm9vbCB0cmFja1BhdXNlZCA9IGZhbHNlOwogCiAgICAgLy8gZG8gbm90IHB1dCB0aGUgSEFMIGluIHN0YW5kYnkgd2hlbiBwYXVzZWQuIEF3ZXNvbWVQbGF5ZXIgY2xlYXIgdGhlIG9mZmxvYWRlZCBBdWRpb1RyYWNrCiAgICAgLy8gYWZ0ZXIgYSB0aW1lb3V0IGFuZCB3ZSB3aWxsIGVudGVyIHN0YW5kYnkgdGhlbi4KICAgICBpZiAobVRyYWNrcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgIFRyYWNrUGF1c2VkID0gbVRyYWNrc1ttVHJhY2tzLnNpemUoKSAtIDFdLT5pc1BhdXNlZCgpOworICAgICAgICB0cmFja1BhdXNlZCA9IG1UcmFja3NbbVRyYWNrcy5zaXplKCkgLSAxXS0+aXNQYXVzZWQoKTsKICAgICB9CiAKLSAgICByZXR1cm4gIW1TdGFuZGJ5ICYmICFUcmFja1BhdXNlZDsKKyAgICByZXR1cm4gIW1TdGFuZGJ5ICYmICF0cmFja1BhdXNlZDsKIH0KIAogCkBAIC00MTgzLDEyICs0NjA2LDE0IEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpPZmZsb2FkVGhyZWFkOjpmbHVzaEh3X2woKQogewotICAgIG1PdXRwdXQtPnN0cmVhbS0+Zmx1c2gobU91dHB1dC0+c3RyZWFtKTsKKyAgICBEaXJlY3RPdXRwdXRUaHJlYWQ6OmZsdXNoSHdfbCgpOwogICAgIC8vIEZsdXNoIGFueXRoaW5nIHN0aWxsIHdhaXRpbmcgaW4gdGhlIG1peGJ1ZmZlcgogICAgIG1DdXJyZW50V3JpdGVMZW5ndGggPSAwOwogICAgIG1CeXRlc1JlbWFpbmluZyA9IDA7CiAgICAgbVBhdXNlZFdyaXRlTGVuZ3RoID0gMDsKICAgICBtUGF1c2VkQnl0ZXNSZW1haW5pbmcgPSAwOworICAgIG1Id1BhdXNlZCA9IGZhbHNlOworCiAgICAgaWYgKG1Vc2VBc3luY1dyaXRlKSB7CiAgICAgICAgIC8vIGRpc2NhcmQgYW55IHBlbmRpbmcgZHJhaW4gb3Igd3JpdGUgYWNrIGJ5IGluY3JlbWVudGluZyBzZXF1ZW5jZQogICAgICAgICBtV3JpdGVBY2tTZXF1ZW5jZSA9IChtV3JpdGVBY2tTZXF1ZW5jZSArIDIpICYgfjE7CkBAIC00MTk5LDYgKzQ2MjQsMTggQEAKICAgICB9CiB9CiAKK3ZvaWQgQXVkaW9GbGluZ2VyOjpPZmZsb2FkVGhyZWFkOjpvbkFkZE5ld1RyYWNrX2woKQoreworICAgIHNwPFRyYWNrPiBwcmV2aW91c1RyYWNrID0gbVByZXZpb3VzVHJhY2sucHJvbW90ZSgpOworICAgIHNwPFRyYWNrPiBsYXRlc3RUcmFjayA9IG1MYXRlc3RBY3RpdmVUcmFjay5wcm9tb3RlKCk7CisKKyAgICBpZiAocHJldmlvdXNUcmFjayAhPSAwICYmIGxhdGVzdFRyYWNrICE9IDAgJiYKKyAgICAgICAgKHByZXZpb3VzVHJhY2stPnNlc3Npb25JZCgpICE9IGxhdGVzdFRyYWNrLT5zZXNzaW9uSWQoKSkpIHsKKyAgICAgICAgbUZsdXNoUGVuZGluZyA9IHRydWU7CisgICAgfQorICAgIFBsYXliYWNrVGhyZWFkOjpvbkFkZE5ld1RyYWNrX2woKTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBBdWRpb0ZsaW5nZXI6OkR1cGxpY2F0aW5nVGhyZWFkOjpEdXBsaWNhdGluZ1RocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsCkBAIC00MjIzLDExICs0NjYwLDE1IEBACiAgICAgaWYgKG91dHB1dHNSZWFkeShvdXRwdXRUcmFja3MpKSB7CiAgICAgICAgIG1BdWRpb01peGVyLT5wcm9jZXNzKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OmtJbnZhbGlkUFRTKTsKICAgICB9IGVsc2UgewotICAgICAgICBtZW1zZXQobU1peEJ1ZmZlciwgMCwgbWl4QnVmZmVyU2l6ZSk7CisgICAgICAgIGlmIChtTWl4ZXJCdWZmZXJWYWxpZCkgeworICAgICAgICAgICAgbWVtc2V0KG1NaXhlckJ1ZmZlciwgMCwgbU1peGVyQnVmZmVyU2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZW1zZXQobVNpbmtCdWZmZXIsIDAsIG1TaW5rQnVmZmVyU2l6ZSk7CisgICAgICAgIH0KICAgICB9CiAgICAgc2xlZXBUaW1lID0gMDsKICAgICB3cml0ZUZyYW1lcyA9IG1Ob3JtYWxGcmFtZUNvdW50OwotICAgIG1DdXJyZW50V3JpdGVMZW5ndGggPSBtaXhCdWZmZXJTaXplOworICAgIG1DdXJyZW50V3JpdGVMZW5ndGggPSBtU2lua0J1ZmZlclNpemU7CiAgICAgc3RhbmRieVRpbWUgPSBzeXN0ZW1UaW1lKCkgKyBzdGFuZGJ5RGVsYXk7CiB9CiAKQEAgLTQyNDIsNyArNDY4Myw3IEBACiAgICAgfSBlbHNlIGlmIChtQnl0ZXNXcml0dGVuICE9IDApIHsKICAgICAgICAgaWYgKG1NaXhlclN0YXR1cyA9PSBNSVhFUl9UUkFDS1NfRU5BQkxFRCkgewogICAgICAgICAgICAgd3JpdGVGcmFtZXMgPSBtTm9ybWFsRnJhbWVDb3VudDsKLSAgICAgICAgICAgIG1lbXNldChtTWl4QnVmZmVyLCAwLCBtaXhCdWZmZXJTaXplKTsKKyAgICAgICAgICAgIG1lbXNldChtU2lua0J1ZmZlciwgMCwgbVNpbmtCdWZmZXJTaXplKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIGZsdXNoIHJlbWFpbmluZyBvdmVyZmxvdyBidWZmZXJzIGluIG91dHB1dCB0cmFja3MKICAgICAgICAgICAgIHdyaXRlRnJhbWVzID0gMDsKQEAgLTQyNTQsMTAgKzQ2OTUsMTggQEAKIHNzaXplX3QgQXVkaW9GbGluZ2VyOjpEdXBsaWNhdGluZ1RocmVhZDo6dGhyZWFkTG9vcF93cml0ZSgpCiB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRUcmFja3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgb3V0cHV0VHJhY2tzW2ldLT53cml0ZShtTWl4QnVmZmVyLCB3cml0ZUZyYW1lcyk7CisgICAgICAgIC8vIFdlIGNvbnZlcnQgdGhlIGR1cGxpY2F0aW5nIHRocmVhZCBmb3JtYXQgdG8gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQKKyAgICAgICAgLy8gZm9yIGRlbGl2ZXJ5IGRvd25zdHJlYW0gYXMgbmVlZGVkLiBUaGlzIGluLXBsYWNlIGNvbnZlcnNpb24gaXMgc2FmZSBhcworICAgICAgICAvLyBBVURJT19GT1JNQVRfUENNXzE2X0JJVCBpcyBzbWFsbGVyIHRoYW4gYW55IG90aGVyIHN1cHBvcnRlZCBmb3JtYXQKKyAgICAgICAgLy8gKEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQgaXMgbm90IGFsbG93ZWQgaGVyZSkuCisgICAgICAgIGlmIChtRm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7CisgICAgICAgICAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KG1TaW5rQnVmZmVyLCBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKKyAgICAgICAgICAgICAgICAgICAgbVNpbmtCdWZmZXIsIG1Gb3JtYXQsIHdyaXRlRnJhbWVzICogbUNoYW5uZWxDb3VudCk7CisgICAgICAgIH0KKyAgICAgICAgb3V0cHV0VHJhY2tzW2ldLT53cml0ZShyZWludGVycHJldF9jYXN0PGludDE2X3QqPihtU2lua0J1ZmZlciksIHdyaXRlRnJhbWVzKTsKICAgICB9CiAgICAgbVN0YW5kYnkgPSBmYWxzZTsKLSAgICByZXR1cm4gKHNzaXplX3QpbWl4QnVmZmVyU2l6ZTsKKyAgICByZXR1cm4gKHNzaXplX3QpbVNpbmtCdWZmZXJTaXplOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6RHVwbGljYXRpbmdUaHJlYWQ6OnRocmVhZExvb3Bfc3RhbmRieSgpCkBAIC00MjgzLDEwICs0NzMyLDE2IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICAvLyBGSVhNRSBleHBsYWluIHRoaXMgZm9ybXVsYQogICAgIHNpemVfdCBmcmFtZUNvdW50ID0gKDMgKiBtTm9ybWFsRnJhbWVDb3VudCAqIG1TYW1wbGVSYXRlKSAvIHRocmVhZC0+c2FtcGxlUmF0ZSgpOworICAgIC8vIE91dHB1dFRyYWNrIGlzIGZvcmNlZCB0byBBVURJT19GT1JNQVRfUENNXzE2X0JJVCByZWdhcmRsZXNzIG9mIG1Gb3JtYXQKKyAgICAvLyBkdWUgdG8gY3VycmVudCB1c2FnZSBjYXNlIGFuZCByZXN0cmljdGlvbnMgb24gdGhlIEF1ZGlvQnVmZmVyUHJvdmlkZXIuCisgICAgLy8gQWN0dWFsIGJ1ZmZlciBjb252ZXJzaW9uIGlzIGRvbmUgaW4gdGhyZWFkTG9vcF93cml0ZSgpLgorICAgIC8vCisgICAgLy8gVE9ETzogVGhpcyBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUsIGRlcGVuZGluZyBvbiBtdWx0aWNoYW5uZWwKKyAgICAvLyAoYW5kIG5vbiBpbnQxNl90Kikgc3VwcG9ydCBvbiBBRjo6UGxheWJhY2tUaHJlYWQ6Ok91dHB1dFRyYWNrCiAgICAgT3V0cHV0VHJhY2sgKm91dHB1dFRyYWNrID0gbmV3IE91dHB1dFRyYWNrKHRocmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7CkBAIC00MzcxLDggKzQ4MjYsNiBAQAogCiBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1JbiAqaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG91dERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGluRGV2aWNlCkBAIC00MzgxLDI3ICs0ODM0LDE2MiBAQAogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgOgogICAgIFRocmVhZEJhc2UoYXVkaW9GbGluZ2VyLCBpZCwgb3V0RGV2aWNlLCBpbkRldmljZSwgUkVDT1JEKSwKLSAgICBtSW5wdXQoaW5wdXQpLCBtUmVzYW1wbGVyKE5VTEwpLCBtUnNtcE91dEJ1ZmZlcihOVUxMKSwgbVJzbXBJbkJ1ZmZlcihOVUxMKSwKLSAgICAvLyBtUnNtcEluSW5kZXggYW5kIG1CdWZmZXJTaXplIHNldCBieSByZWFkSW5wdXRQYXJhbWV0ZXJzKCkKLSAgICBtUmVxQ2hhbm5lbENvdW50KHBvcGNvdW50KGNoYW5uZWxNYXNrKSksCi0gICAgbVJlcVNhbXBsZVJhdGUoc2FtcGxlUmF0ZSkKLSAgICAvLyBtQnl0ZXNSZWFkIGlzIG9ubHkgbWVhbmluZ2Z1bCB3aGlsZSBhY3RpdmUsIGFuZCBzbyBpcyBjbGVhcmVkIGluIHN0YXJ0KCkKLSAgICAvLyAoYnV0IG1pZ2h0IGJlIGJldHRlciB0byBhbHNvIGNsZWFyIGhlcmUgZm9yIGR1bXA/KQorICAgIG1JbnB1dChpbnB1dCksIG1BY3RpdmVUcmFja3NHZW4oMCksIG1Sc21wSW5CdWZmZXIoTlVMTCksCisgICAgLy8gbVJzbXBJbkZyYW1lcyBhbmQgbVJzbXBJbkZyYW1lc1AyIGFyZSBzZXQgYnkgcmVhZElucHV0UGFyYW1ldGVyc19sKCkKKyAgICBtUnNtcEluUmVhcigwKQogI2lmZGVmIFRFRV9TSU5LCiAgICAgLCBtVGVlU2luayh0ZWVTaW5rKQogI2VuZGlmCisgICAgLCBtUmVhZE9ubHlIZWFwKG5ldyBNZW1vcnlEZWFsZXIoa1JlY29yZFRocmVhZFJlYWRPbmx5SGVhcFNpemUsCisgICAgICAgICAgICAiUmVjb3JkVGhyZWFkUk8iLCBNZW1vcnlIZWFwQmFzZTo6UkVBRF9PTkxZKSkKKyAgICAvLyBtRmFzdENhcHR1cmUgYmVsb3cKKyAgICAsIG1GYXN0Q2FwdHVyZUZ1dGV4KDApCisgICAgLy8gbUlucHV0U291cmNlCisgICAgLy8gbVBpcGVTaW5rCisgICAgLy8gbVBpcGVTb3VyY2UKKyAgICAsIG1QaXBlRnJhbWVzUDIoMCkKKyAgICAvLyBtUGlwZU1lbW9yeQorICAgIC8vIG1GYXN0Q2FwdHVyZU5CTG9nV3JpdGVyCisgICAgLCBtRmFzdFRyYWNrQXZhaWwoZmFsc2UpCiB7CiAgICAgc25wcmludGYobU5hbWUsIGtOYW1lTGVuZ3RoLCAiQXVkaW9Jbl8lWCIsIGlkKTsKKyAgICBtTkJMb2dXcml0ZXIgPSBhdWRpb0ZsaW5nZXItPm5ld1dyaXRlcl9sKGtMb2dTaXplLCBtTmFtZSk7CiAKLSAgICByZWFkSW5wdXRQYXJhbWV0ZXJzKCk7CisgICAgcmVhZElucHV0UGFyYW1ldGVyc19sKCk7CisKKyAgICAvLyBjcmVhdGUgYW4gTkJBSU8gc291cmNlIGZvciB0aGUgSEFMIGlucHV0IHN0cmVhbSwgYW5kIG5lZ290aWF0ZQorICAgIG1JbnB1dFNvdXJjZSA9IG5ldyBBdWRpb1N0cmVhbUluU291cmNlKGlucHV0LT5zdHJlYW0pOworICAgIHNpemVfdCBudW1Db3VudGVyT2ZmZXJzID0gMDsKKyAgICBjb25zdCBOQkFJT19Gb3JtYXQgb2ZmZXJzWzFdID0ge0Zvcm1hdF9mcm9tX1NSX0MobVNhbXBsZVJhdGUsIG1DaGFubmVsQ291bnQsIG1Gb3JtYXQpfTsKKyAgICBzc2l6ZV90IGluZGV4ID0gbUlucHV0U291cmNlLT5uZWdvdGlhdGUob2ZmZXJzLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKKyAgICBBTE9HX0FTU0VSVChpbmRleCA9PSAwKTsKKworICAgIC8vIGluaXRpYWxpemUgZmFzdCBjYXB0dXJlIGRlcGVuZGluZyBvbiBjb25maWd1cmF0aW9uCisgICAgYm9vbCBpbml0RmFzdENhcHR1cmU7CisgICAgc3dpdGNoIChrVXNlRmFzdENhcHR1cmUpIHsKKyAgICBjYXNlIEZhc3RDYXB0dXJlX05ldmVyOgorICAgICAgICBpbml0RmFzdENhcHR1cmUgPSBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGYXN0Q2FwdHVyZV9BbHdheXM6CisgICAgICAgIGluaXRGYXN0Q2FwdHVyZSA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRmFzdENhcHR1cmVfU3RhdGljOgorICAgICAgICB1aW50MzJfdCBwcmltYXJ5T3V0cHV0U2FtcGxlUmF0ZTsKKyAgICAgICAgeworICAgICAgICAgICAgQXV0b011dGV4IF9sKGF1ZGlvRmxpbmdlci0+bUhhcmR3YXJlTG9jayk7CisgICAgICAgICAgICBwcmltYXJ5T3V0cHV0U2FtcGxlUmF0ZSA9IGF1ZGlvRmxpbmdlci0+bVByaW1hcnlPdXRwdXRTYW1wbGVSYXRlOworICAgICAgICB9CisgICAgICAgIGluaXRGYXN0Q2FwdHVyZSA9CisgICAgICAgICAgICAgICAgLy8gZWl0aGVyIGNhcHR1cmUgc2FtcGxlIHJhdGUgaXMgc2FtZSBhcyAoYSByZWFzb25hYmxlKSBwcmltYXJ5IG91dHB1dCBzYW1wbGUgcmF0ZQorICAgICAgICAgICAgICAgICgoKHByaW1hcnlPdXRwdXRTYW1wbGVSYXRlID09IDQ0MTAwIHx8IHByaW1hcnlPdXRwdXRTYW1wbGVSYXRlID09IDQ4MDAwKSAmJgorICAgICAgICAgICAgICAgICAgICAobVNhbXBsZVJhdGUgPT0gcHJpbWFyeU91dHB1dFNhbXBsZVJhdGUpKSB8fAorICAgICAgICAgICAgICAgIC8vIG9yIHByaW1hcnkgb3V0cHV0IHNhbXBsZSByYXRlIGlzIHVua25vd24sIGFuZCBjYXB0dXJlIHNhbXBsZSByYXRlIGlzIHJlYXNvbmFibGUKKyAgICAgICAgICAgICAgICAoKHByaW1hcnlPdXRwdXRTYW1wbGVSYXRlID09IDApICYmCisgICAgICAgICAgICAgICAgICAgICgobVNhbXBsZVJhdGUgPT0gNDQxMDAgfHwgbVNhbXBsZVJhdGUgPT0gNDgwMDApKSkpICYmCisgICAgICAgICAgICAgICAgLy8gYW5kIHRoZSBidWZmZXIgc2l6ZSBpcyA8IDEyIG1zCisgICAgICAgICAgICAgICAgKG1GcmFtZUNvdW50ICogMTAwMCkgLyBtU2FtcGxlUmF0ZSA8IDEyOworICAgICAgICBicmVhazsKKyAgICAvLyBjYXNlIEZhc3RDYXB0dXJlX0R5bmFtaWM6CisgICAgfQorCisgICAgaWYgKGluaXRGYXN0Q2FwdHVyZSkgeworICAgICAgICAvLyBjcmVhdGUgYSBQaXBlIGZvciBGYXN0TWl4ZXIgdG8gd3JpdGUgdG8sIGFuZCBmb3IgdXMgYW5kIGZhc3QgdHJhY2tzIHRvIHJlYWQgZnJvbQorICAgICAgICBOQkFJT19Gb3JtYXQgZm9ybWF0ID0gbUlucHV0U291cmNlLT5mb3JtYXQoKTsKKyAgICAgICAgc2l6ZV90IHBpcGVGcmFtZXNQMiA9IHJvdW5kdXAobVNhbXBsZVJhdGUgLyAyNSk7ICAgIC8vIGRvdWJsZS1idWZmZXJpbmcgb2YgMjAgbXMgZWFjaAorICAgICAgICBzaXplX3QgcGlwZVNpemUgPSBwaXBlRnJhbWVzUDIgKiBGb3JtYXRfZnJhbWVTaXplKGZvcm1hdCk7CisgICAgICAgIHZvaWQgKnBpcGVCdWZmZXI7CisgICAgICAgIGNvbnN0IHNwPE1lbW9yeURlYWxlcj4gcm9IZWFwKHJlYWRPbmx5SGVhcCgpKTsKKyAgICAgICAgc3A8SU1lbW9yeT4gcGlwZU1lbW9yeTsKKyAgICAgICAgaWYgKChyb0hlYXAgPT0gMCkgfHwKKyAgICAgICAgICAgICAgICAocGlwZU1lbW9yeSA9IHJvSGVhcC0+YWxsb2NhdGUocGlwZVNpemUpKSA9PSAwIHx8CisgICAgICAgICAgICAgICAgKHBpcGVCdWZmZXIgPSBwaXBlTWVtb3J5LT5wb2ludGVyKCkpID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCJub3QgZW5vdWdoIG1lbW9yeSBmb3IgcGlwZSBidWZmZXIgc2l6ZT0lenUiLCBwaXBlU2l6ZSk7CisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorICAgICAgICAvLyBwaXBlIHdpbGwgYmUgc2hhcmVkIGRpcmVjdGx5IHdpdGggZmFzdCBjbGllbnRzLCBzbyBjbGVhciB0byBhdm9pZCBsZWFraW5nIG9sZCBpbmZvcm1hdGlvbgorICAgICAgICBtZW1zZXQocGlwZUJ1ZmZlciwgMCwgcGlwZVNpemUpOworICAgICAgICBQaXBlICpwaXBlID0gbmV3IFBpcGUocGlwZUZyYW1lc1AyLCBmb3JtYXQsIHBpcGVCdWZmZXIpOworICAgICAgICBjb25zdCBOQkFJT19Gb3JtYXQgb2ZmZXJzWzFdID0ge2Zvcm1hdH07CisgICAgICAgIHNpemVfdCBudW1Db3VudGVyT2ZmZXJzID0gMDsKKyAgICAgICAgc3NpemVfdCBpbmRleCA9IHBpcGUtPm5lZ290aWF0ZShvZmZlcnMsIDEsIE5VTEwsIG51bUNvdW50ZXJPZmZlcnMpOworICAgICAgICBBTE9HX0FTU0VSVChpbmRleCA9PSAwKTsKKyAgICAgICAgbVBpcGVTaW5rID0gcGlwZTsKKyAgICAgICAgUGlwZVJlYWRlciAqcGlwZVJlYWRlciA9IG5ldyBQaXBlUmVhZGVyKCpwaXBlKTsKKyAgICAgICAgbnVtQ291bnRlck9mZmVycyA9IDA7CisgICAgICAgIGluZGV4ID0gcGlwZVJlYWRlci0+bmVnb3RpYXRlKG9mZmVycywgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7CisgICAgICAgIEFMT0dfQVNTRVJUKGluZGV4ID09IDApOworICAgICAgICBtUGlwZVNvdXJjZSA9IHBpcGVSZWFkZXI7CisgICAgICAgIG1QaXBlRnJhbWVzUDIgPSBwaXBlRnJhbWVzUDI7CisgICAgICAgIG1QaXBlTWVtb3J5ID0gcGlwZU1lbW9yeTsKKworICAgICAgICAvLyBjcmVhdGUgZmFzdCBjYXB0dXJlCisgICAgICAgIG1GYXN0Q2FwdHVyZSA9IG5ldyBGYXN0Q2FwdHVyZSgpOworICAgICAgICBGYXN0Q2FwdHVyZVN0YXRlUXVldWUgKnNxID0gbUZhc3RDYXB0dXJlLT5zcSgpOworI2lmZGVmIFNUQVRFX1FVRVVFX0RVTVAKKyAgICAgICAgLy8gRklYTUUKKyNlbmRpZgorICAgICAgICBGYXN0Q2FwdHVyZVN0YXRlICpzdGF0ZSA9IHNxLT5iZWdpbigpOworICAgICAgICBzdGF0ZS0+bUNibGsgPSBOVUxMOworICAgICAgICBzdGF0ZS0+bUlucHV0U291cmNlID0gbUlucHV0U291cmNlLmdldCgpOworICAgICAgICBzdGF0ZS0+bUlucHV0U291cmNlR2VuKys7CisgICAgICAgIHN0YXRlLT5tUGlwZVNpbmsgPSBwaXBlOworICAgICAgICBzdGF0ZS0+bVBpcGVTaW5rR2VuKys7CisgICAgICAgIHN0YXRlLT5tRnJhbWVDb3VudCA9IG1GcmFtZUNvdW50OworICAgICAgICBzdGF0ZS0+bUNvbW1hbmQgPSBGYXN0Q2FwdHVyZVN0YXRlOjpDT0xEX0lETEU7CisgICAgICAgIC8vIGFscmVhZHkgZG9uZSBpbiBjb25zdHJ1Y3RvciBpbml0aWFsaXphdGlvbiBsaXN0CisgICAgICAgIC8vbUZhc3RDYXB0dXJlRnV0ZXggPSAwOworICAgICAgICBzdGF0ZS0+bUNvbGRGdXRleEFkZHIgPSAmbUZhc3RDYXB0dXJlRnV0ZXg7CisgICAgICAgIHN0YXRlLT5tQ29sZEdlbisrOworICAgICAgICBzdGF0ZS0+bUR1bXBTdGF0ZSA9ICZtRmFzdENhcHR1cmVEdW1wU3RhdGU7CisjaWZkZWYgVEVFX1NJTksKKyAgICAgICAgLy8gRklYTUUKKyNlbmRpZgorICAgICAgICBtRmFzdENhcHR1cmVOQkxvZ1dyaXRlciA9IGF1ZGlvRmxpbmdlci0+bmV3V3JpdGVyX2woa0Zhc3RDYXB0dXJlTG9nU2l6ZSwgIkZhc3RDYXB0dXJlIik7CisgICAgICAgIHN0YXRlLT5tTkJMb2dXcml0ZXIgPSBtRmFzdENhcHR1cmVOQkxvZ1dyaXRlci5nZXQoKTsKKyAgICAgICAgc3EtPmVuZCgpOworICAgICAgICBzcS0+cHVzaChGYXN0Q2FwdHVyZVN0YXRlUXVldWU6OkJMT0NLX1VOVElMX1BVU0hFRCk7CisKKyAgICAgICAgLy8gc3RhcnQgdGhlIGZhc3QgY2FwdHVyZQorICAgICAgICBtRmFzdENhcHR1cmUtPnJ1bigiRmFzdENhcHR1cmUiLCBBTkRST0lEX1BSSU9SSVRZX1VSR0VOVF9BVURJTyk7CisgICAgICAgIHBpZF90IHRpZCA9IG1GYXN0Q2FwdHVyZS0+Z2V0VGlkKCk7CisgICAgICAgIGludCBlcnIgPSByZXF1ZXN0UHJpb3JpdHkoZ2V0cGlkX2NhY2hlZCwgdGlkLCBrUHJpb3JpdHlGYXN0TWl4ZXIpOworICAgICAgICBpZiAoZXJyICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJQb2xpY3kgU0NIRURfRklGTyBwcmlvcml0eSAlZCBpcyB1bmF2YWlsYWJsZSBmb3IgcGlkICVkIHRpZCAlZDsgZXJyb3IgJWQiLAorICAgICAgICAgICAgICAgICAgICBrUHJpb3JpdHlGYXN0Q2FwdHVyZSwgZ2V0cGlkX2NhY2hlZCwgdGlkLCBlcnIpOworICAgICAgICB9CisKKyNpZmRlZiBBVURJT19XQVRDSERPRworICAgICAgICAvLyBGSVhNRQorI2VuZGlmCisKKyAgICAgICAgbUZhc3RUcmFja0F2YWlsID0gdHJ1ZTsKKyAgICB9CitmYWlsZWQ6IDsKKworICAgIC8vIEZJWE1FIG1Ob3JtYWxTb3VyY2UKIH0KIAogCiBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6flJlY29yZFRocmVhZCgpCiB7CisgICAgaWYgKG1GYXN0Q2FwdHVyZSAhPSAwKSB7CisgICAgICAgIEZhc3RDYXB0dXJlU3RhdGVRdWV1ZSAqc3EgPSBtRmFzdENhcHR1cmUtPnNxKCk7CisgICAgICAgIEZhc3RDYXB0dXJlU3RhdGUgKnN0YXRlID0gc3EtPmJlZ2luKCk7CisgICAgICAgIGlmIChzdGF0ZS0+bUNvbW1hbmQgPT0gRmFzdENhcHR1cmVTdGF0ZTo6Q09MRF9JRExFKSB7CisgICAgICAgICAgICBpbnQzMl90IG9sZCA9IGFuZHJvaWRfYXRvbWljX2luYygmbUZhc3RDYXB0dXJlRnV0ZXgpOworICAgICAgICAgICAgaWYgKG9sZCA9PSAtMSkgeworICAgICAgICAgICAgICAgICh2b2lkKSBzeXNjYWxsKF9fTlJfZnV0ZXgsICZtRmFzdENhcHR1cmVGdXRleCwgRlVURVhfV0FLRV9QUklWQVRFLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdGF0ZS0+bUNvbW1hbmQgPSBGYXN0Q2FwdHVyZVN0YXRlOjpFWElUOworICAgICAgICBzcS0+ZW5kKCk7CisgICAgICAgIHNxLT5wdXNoKEZhc3RDYXB0dXJlU3RhdGVRdWV1ZTo6QkxPQ0tfVU5USUxfUFVTSEVEKTsKKyAgICAgICAgbUZhc3RDYXB0dXJlLT5qb2luKCk7CisgICAgICAgIG1GYXN0Q2FwdHVyZS5jbGVhcigpOworICAgIH0KKyAgICBtQXVkaW9GbGluZ2VyLT51bnJlZ2lzdGVyV3JpdGVyKG1GYXN0Q2FwdHVyZU5CTG9nV3JpdGVyKTsKKyAgICBtQXVkaW9GbGluZ2VyLT51bnJlZ2lzdGVyV3JpdGVyKG1OQkxvZ1dyaXRlcik7CiAgICAgZGVsZXRlW10gbVJzbXBJbkJ1ZmZlcjsKLSAgICBkZWxldGUgbVJlc2FtcGxlcjsKLSAgICBkZWxldGVbXSBtUnNtcE91dEJ1ZmZlcjsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6b25GaXJzdFJlZigpCkBAIC00NDA5LDIzMCArNDk5Nyw0ODIgQEAKICAgICBydW4obU5hbWUsIFBSSU9SSVRZX1VSR0VOVF9BVURJTyk7CiB9CiAKLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpyZWFkeVRvUnVuKCkKLXsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbml0Q2hlY2soKTsKLSAgICBBTE9HV19JRihzdGF0dXMgIT0gTk9fRVJST1IsIlJlY29yZFRocmVhZCAlcCBjb3VsZCBub3QgaW5pdGlhbGl6ZSIsIHRoaXMpOwotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KIGJvb2wgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnRocmVhZExvb3AoKQogewotICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciBidWZmZXI7Ci0gICAgc3A8UmVjb3JkVHJhY2s+IGFjdGl2ZVRyYWNrOwotICAgIFZlY3Rvcjwgc3A8RWZmZWN0Q2hhaW4+ID4gZWZmZWN0Q2hhaW5zOwotCiAgICAgbnNlY3NfdCBsYXN0V2FybmluZyA9IDA7CiAKICAgICBpbnB1dFN0YW5kQnkoKTsKKworcmVhY3F1aXJlX3dha2Vsb2NrOgorICAgIHNwPFJlY29yZFRyYWNrPiBhY3RpdmVUcmFjazsKKyAgICBpbnQgYWN0aXZlVHJhY2tzR2VuOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgYWN0aXZlVHJhY2sgPSBtQWN0aXZlVHJhY2s7Ci0gICAgICAgIGFjcXVpcmVXYWtlTG9ja19sKGFjdGl2ZVRyYWNrICE9IDAgPyBhY3RpdmVUcmFjay0+dWlkKCkgOiAtMSk7CisgICAgICAgIHNpemVfdCBzaXplID0gbUFjdGl2ZVRyYWNrcy5zaXplKCk7CisgICAgICAgIGFjdGl2ZVRyYWNrc0dlbiA9IG1BY3RpdmVUcmFja3NHZW47CisgICAgICAgIGlmIChzaXplID4gMCkgeworICAgICAgICAgICAgLy8gRklYTUUgYW4gYXJiaXRyYXJ5IGNob2ljZQorICAgICAgICAgICAgYWN0aXZlVHJhY2sgPSBtQWN0aXZlVHJhY2tzWzBdOworICAgICAgICAgICAgYWNxdWlyZVdha2VMb2NrX2woYWN0aXZlVHJhY2stPnVpZCgpKTsKKyAgICAgICAgICAgIGlmIChzaXplID4gMSkgeworICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxpbnQ+IHRtcDsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgICAgICB0bXAuYWRkKG1BY3RpdmVUcmFja3NbaV0tPnVpZCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdXBkYXRlV2FrZUxvY2tVaWRzX2wodG1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFjcXVpcmVXYWtlTG9ja19sKC0xKTsKKyAgICAgICAgfQogICAgIH0KIAotICAgIC8vIHVzZWQgdG8gdmVyaWZ5IHdlJ3ZlIHJlYWQgYXQgbGVhc3Qgb25jZSBiZWZvcmUgZXZhbHVhdGluZyBob3cgbWFueSBieXRlcyB3ZXJlIHJlYWQKLSAgICBib29sIHJlYWRPbmNlID0gZmFsc2U7CisgICAgLy8gdXNlZCB0byByZXF1ZXN0IGEgZGVmZXJyZWQgc2xlZXAsIHRvIGJlIGV4ZWN1dGVkIGxhdGVyIHdoaWxlIG11dGV4IGlzIHVubG9ja2VkCisgICAgdWludDMyX3Qgc2xlZXBVcyA9IDA7CiAKLSAgICAvLyBzdGFydCByZWNvcmRpbmcKLSAgICB3aGlsZSAoIWV4aXRQZW5kaW5nKCkpIHsKKyAgICAvLyBsb29wIHdoaWxlIHRoZXJlIGlzIHdvcmsgdG8gZG8KKyAgICBmb3IgKDs7KSB7CisgICAgICAgIFZlY3Rvcjwgc3A8RWZmZWN0Q2hhaW4+ID4gZWZmZWN0Q2hhaW5zOwogCi0gICAgICAgIHByb2Nlc3NDb25maWdFdmVudHMoKTsKKyAgICAgICAgLy8gc2xlZXAgd2l0aCBtdXRleCB1bmxvY2tlZAorICAgICAgICBpZiAoc2xlZXBVcyA+IDApIHsKKyAgICAgICAgICAgIHVzbGVlcChzbGVlcFVzKTsKKyAgICAgICAgICAgIHNsZWVwVXMgPSAwOworICAgICAgICB9CisKKyAgICAgICAgLy8gYWN0aXZlVHJhY2tzIGFjY3VtdWxhdGVzIGEgY29weSBvZiBhIHN1YnNldCBvZiBtQWN0aXZlVHJhY2tzCisgICAgICAgIFZlY3Rvcjwgc3A8UmVjb3JkVHJhY2s+ID4gYWN0aXZlVHJhY2tzOworCisgICAgICAgIC8vIHJlZmVyZW5jZSB0byB0aGUgKGZpcnN0IGFuZCBvbmx5KSBhY3RpdmUgZmFzdCB0cmFjaworICAgICAgICBzcDxSZWNvcmRUcmFjaz4gZmFzdFRyYWNrOworCisgICAgICAgIC8vIHJlZmVyZW5jZSB0byBhIGZhc3QgdHJhY2sgd2hpY2ggaXMgYWJvdXQgdG8gYmUgcmVtb3ZlZAorICAgICAgICBzcDxSZWNvcmRUcmFjaz4gZmFzdFRyYWNrVG9SZW1vdmU7CiAKICAgICAgICAgeyAvLyBzY29wZSBmb3IgbUxvY2sKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgICAgICBjaGVja0Zvck5ld1BhcmFtZXRlcnNfbCgpOwotICAgICAgICAgICAgaWYgKG1BY3RpdmVUcmFjayAhPSAwICYmIGFjdGl2ZVRyYWNrICE9IG1BY3RpdmVUcmFjaykgewotICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxpbnQ+IHRtcDsKLSAgICAgICAgICAgICAgICB0bXAuYWRkKG1BY3RpdmVUcmFjay0+dWlkKCkpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVdha2VMb2NrVWlkc19sKHRtcCk7CisKKyAgICAgICAgICAgIHByb2Nlc3NDb25maWdFdmVudHNfbCgpOworCisgICAgICAgICAgICAvLyBjaGVjayBleGl0UGVuZGluZyBoZXJlIGJlY2F1c2UgY2hlY2tGb3JOZXdQYXJhbWV0ZXJzX2woKSBhbmQKKyAgICAgICAgICAgIC8vIGNoZWNrRm9yTmV3UGFyYW1ldGVyc19sKCkgY2FuIHRlbXBvcmFyaWx5IHJlbGVhc2UgbUxvY2sKKyAgICAgICAgICAgIGlmIChleGl0UGVuZGluZygpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBhY3RpdmVUcmFjayA9IG1BY3RpdmVUcmFjazsKLSAgICAgICAgICAgIGlmIChtQWN0aXZlVHJhY2sgPT0gMCAmJiBtQ29uZmlnRXZlbnRzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHN0YW5kYnkoKTsKIAotICAgICAgICAgICAgICAgIGlmIChleGl0UGVuZGluZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQorICAgICAgICAgICAgLy8gaWYgbm8gYWN0aXZlIHRyYWNrKHMpLCB0aGVuIHN0YW5kYnkgYW5kIHJlbGVhc2Ugd2FrZWxvY2sKKyAgICAgICAgICAgIHNpemVfdCBzaXplID0gbUFjdGl2ZVRyYWNrcy5zaXplKCk7CisgICAgICAgICAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgc3RhbmRieUlmTm90QWxyZWFkeUluU3RhbmRieSgpOworICAgICAgICAgICAgICAgIC8vIGV4aXRQZW5kaW5nKCkgY2FuJ3QgYmVjb21lIHRydWUgaGVyZQogICAgICAgICAgICAgICAgIHJlbGVhc2VXYWtlTG9ja19sKCk7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlJlY29yZFRocmVhZDogbG9vcCBzdG9wcGluZyIpOwogICAgICAgICAgICAgICAgIC8vIGdvIHRvIHNsZWVwCiAgICAgICAgICAgICAgICAgbVdhaXRXb3JrQ1Yud2FpdChtTG9jayk7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlJlY29yZFRocmVhZDogbG9vcCBzdGFydGluZyIpOwotICAgICAgICAgICAgICAgIGFjcXVpcmVXYWtlTG9ja19sKG1BY3RpdmVUcmFjayAhPSAwID8gbUFjdGl2ZVRyYWNrLT51aWQoKSA6IC0xKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBnb3RvIHJlYWNxdWlyZV93YWtlbG9jazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtQWN0aXZlVHJhY2sgIT0gMCkgewotICAgICAgICAgICAgICAgIGlmIChtQWN0aXZlVHJhY2stPmlzVGVybWluYXRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbW92ZVRyYWNrX2wobUFjdGl2ZVRyYWNrKTsKLSAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtQWN0aXZlVHJhY2stPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OlBBVVNJTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhbmRieSgpOwotICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2suY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXJ0U3RvcENvbmQuYnJvYWRjYXN0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtQWN0aXZlVHJhY2stPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OlJFU1VNSU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtUmVxQ2hhbm5lbENvdW50ICE9IG1BY3RpdmVUcmFjay0+Y2hhbm5lbENvdW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFjay5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0U3RvcENvbmQuYnJvYWRjYXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVhZE9uY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY29yZCBzdGFydCBzdWNjZWVkcyBvbmx5IGlmIGZpcnN0IHJlYWQgZnJvbSBhdWRpbyBpbnB1dAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VjY2VlZHMKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQnl0ZXNSZWFkID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6QUNUSVZFOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2suY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydFN0b3BDb25kLmJyb2FkY2FzdCgpOworCisgICAgICAgICAgICBpZiAobUFjdGl2ZVRyYWNrc0dlbiAhPSBhY3RpdmVUcmFja3NHZW4pIHsKKyAgICAgICAgICAgICAgICBhY3RpdmVUcmFja3NHZW4gPSBtQWN0aXZlVHJhY2tzR2VuOworICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxpbnQ+IHRtcDsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgICAgICB0bXAuYWRkKG1BY3RpdmVUcmFja3NbaV0tPnVpZCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdXBkYXRlV2FrZUxvY2tVaWRzX2wodG1wKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9vbCBkb0Jyb2FkY2FzdCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyApIHsKKworICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrID0gbUFjdGl2ZVRyYWNrc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAoYWN0aXZlVHJhY2stPmlzVGVybWluYXRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVUcmFjay0+aXNGYXN0VHJhY2soKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoZmFzdFRyYWNrVG9SZW1vdmUgPT0gMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2tUb1JlbW92ZSA9IGFjdGl2ZVRyYWNrOwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZVRyYWNrX2woYWN0aXZlVHJhY2spOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2tzLnJlbW92ZShhY3RpdmVUcmFjayk7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFja3NHZW4rKzsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZS0tOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBUcmFja0Jhc2U6OnRyYWNrX3N0YXRlIGFjdGl2ZVRyYWNrU3RhdGUgPSBhY3RpdmVUcmFjay0+bVN0YXRlOworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWN0aXZlVHJhY2tTdGF0ZSkgeworCisgICAgICAgICAgICAgICAgY2FzZSBUcmFja0Jhc2U6OlBBVVNJTkc6CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFja3MucmVtb3ZlKGFjdGl2ZVRyYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrc0dlbisrOworICAgICAgICAgICAgICAgICAgICBkb0Jyb2FkY2FzdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHNpemUtLTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRyYWNrQmFzZTo6U1RBUlRJTkdfMToKKyAgICAgICAgICAgICAgICAgICAgc2xlZXBVcyA9IDEwMDAwOworICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgY2FzZSBUcmFja0Jhc2U6OlNUQVJUSU5HXzI6CisgICAgICAgICAgICAgICAgICAgIGRvQnJvYWRjYXN0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgbVN0YW5kYnkgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6QUNUSVZFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgVHJhY2tCYXNlOjpBQ1RJVkU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBUcmFja0Jhc2U6OklETEU6CisgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbmV4cGVjdGVkIGFjdGl2ZVRyYWNrU3RhdGUgJWQiLCBhY3RpdmVUcmFja1N0YXRlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBhY3RpdmVUcmFja3MuYWRkKGFjdGl2ZVRyYWNrKTsKKyAgICAgICAgICAgICAgICBpKys7CisKKyAgICAgICAgICAgICAgICBpZiAoYWN0aXZlVHJhY2stPmlzRmFzdFRyYWNrKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoIW1GYXN0VHJhY2tBdmFpbCk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGZhc3RUcmFjayA9PSAwKTsKKyAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrID0gYWN0aXZlVHJhY2s7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRvQnJvYWRjYXN0KSB7CisgICAgICAgICAgICAgICAgbVN0YXJ0U3RvcENvbmQuYnJvYWRjYXN0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHNsZWVwIGlmIHRoZXJlIGFyZSBubyBhY3RpdmUgdHJhY2tzIHRvIHByb2Nlc3MKKyAgICAgICAgICAgIGlmIChhY3RpdmVUcmFja3Muc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoc2xlZXBVcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNsZWVwVXMgPSBrUmVjb3JkVGhyZWFkU2xlZXBVczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzbGVlcFVzID0gMDsKIAogICAgICAgICAgICAgbG9ja0VmZmVjdENoYWluc19sKGVmZmVjdENoYWlucyk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobUFjdGl2ZVRyYWNrICE9IDApIHsKLSAgICAgICAgICAgIGlmIChtQWN0aXZlVHJhY2stPm1TdGF0ZSAhPSBUcmFja0Jhc2U6OkFDVElWRSAmJgotICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFjay0+bVN0YXRlICE9IFRyYWNrQmFzZTo6UkVTVU1JTkcpIHsKLSAgICAgICAgICAgICAgICB1bmxvY2tFZmZlY3RDaGFpbnMoZWZmZWN0Q2hhaW5zKTsKLSAgICAgICAgICAgICAgICB1c2xlZXAoa1JlY29yZFRocmVhZFNsZWVwVXMpOworICAgICAgICAvLyB0aHJlYWQgbXV0ZXggaXMgbm93IHVubG9ja2VkLCBtQWN0aXZlVHJhY2tzIHVua25vd24sIGFjdGl2ZVRyYWNrcy5zaXplKCkgPiAwCisKKyAgICAgICAgc2l6ZV90IHNpemUgPSBlZmZlY3RDaGFpbnMuc2l6ZSgpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgLy8gdGhyZWFkIG11dGV4IGlzIG5vdCBsb2NrZWQsIGJ1dCBlZmZlY3QgY2hhaW4gaXMgbG9ja2VkCisgICAgICAgICAgICBlZmZlY3RDaGFpbnNbaV0tPnByb2Nlc3NfbCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUHVzaCBhIG5ldyBmYXN0IGNhcHR1cmUgc3RhdGUgaWYgZmFzdCBjYXB0dXJlIGlzIG5vdCBhbHJlYWR5IHJ1bm5pbmcsIG9yIGNibGsgY2hhbmdlCisgICAgICAgIGlmIChtRmFzdENhcHR1cmUgIT0gMCkgeworICAgICAgICAgICAgRmFzdENhcHR1cmVTdGF0ZVF1ZXVlICpzcSA9IG1GYXN0Q2FwdHVyZS0+c3EoKTsKKyAgICAgICAgICAgIEZhc3RDYXB0dXJlU3RhdGUgKnN0YXRlID0gc3EtPmJlZ2luKCk7CisgICAgICAgICAgICBib29sIGRpZE1vZGlmeSA9IGZhbHNlOworICAgICAgICAgICAgRmFzdENhcHR1cmVTdGF0ZVF1ZXVlOjpibG9ja190IGJsb2NrID0gRmFzdENhcHR1cmVTdGF0ZVF1ZXVlOjpCTE9DS19VTlRJTF9QVVNIRUQ7CisgICAgICAgICAgICBpZiAoc3RhdGUtPm1Db21tYW5kICE9IEZhc3RDYXB0dXJlU3RhdGU6OlJFQURfV1JJVEUgLyogRklYTUUgJiYKKyAgICAgICAgICAgICAgICAgICAgKGtVc2VGYXN0TWl4ZXIgIT0gRmFzdE1peGVyX0R5bmFtaWMgfHwgc3RhdGUtPm1UcmFja01hc2sgPiAxKSovKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5tQ29tbWFuZCA9PSBGYXN0Q2FwdHVyZVN0YXRlOjpDT0xEX0lETEUpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvbGQgPSBhbmRyb2lkX2F0b21pY19pbmMoJm1GYXN0Q2FwdHVyZUZ1dGV4KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9sZCA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpIHN5c2NhbGwoX19OUl9mdXRleCwgJm1GYXN0Q2FwdHVyZUZ1dGV4LCBGVVRFWF9XQUtFX1BSSVZBVEUsIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YXRlLT5tQ29tbWFuZCA9IEZhc3RDYXB0dXJlU3RhdGU6OlJFQURfV1JJVEU7CisjaWYgMCAgIC8vIEZJWE1FCisgICAgICAgICAgICAgICAgbUZhc3RDYXB0dXJlRHVtcFN0YXRlLmluY3JlYXNlU2FtcGxpbmdOKG1BdWRpb0ZsaW5nZXItPmlzTG93UmFtRGV2aWNlKCkgPworICAgICAgICAgICAgICAgICAgICAgICAgRmFzdENhcHR1cmVEdW1wU3RhdGU6OmtTYW1wbGluZ05mb3JMb3dSYW1EZXZpY2UgOiBGYXN0TWl4ZXJEdW1wU3RhdGU6OmtTYW1wbGluZ04pOworI2VuZGlmCisgICAgICAgICAgICAgICAgZGlkTW9kaWZ5ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1ZGlvX3RyYWNrX2NibGtfdCAqY2Jsa09sZCA9IHN0YXRlLT5tQ2JsazsKKyAgICAgICAgICAgIGF1ZGlvX3RyYWNrX2NibGtfdCAqY2Jsa05ldyA9IGZhc3RUcmFjayAhPSAwID8gZmFzdFRyYWNrLT5jYmxrKCkgOiBOVUxMOworICAgICAgICAgICAgaWYgKGNibGtOZXcgIT0gY2Jsa09sZCkgeworICAgICAgICAgICAgICAgIHN0YXRlLT5tQ2JsayA9IGNibGtOZXc7CisgICAgICAgICAgICAgICAgLy8gYmxvY2sgdW50aWwgYWNrZWQgaWYgcmVtb3ZpbmcgYSBmYXN0IHRyYWNrCisgICAgICAgICAgICAgICAgaWYgKGNibGtPbGQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBibG9jayA9IEZhc3RDYXB0dXJlU3RhdGVRdWV1ZTo6QkxPQ0tfVU5USUxfQUNLRUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRpZE1vZGlmeSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcS0+ZW5kKGRpZE1vZGlmeSk7CisgICAgICAgICAgICBpZiAoZGlkTW9kaWZ5KSB7CisgICAgICAgICAgICAgICAgc3EtPnB1c2goYmxvY2spOworI2lmIDAKKyAgICAgICAgICAgICAgICBpZiAoa1VzZUZhc3RDYXB0dXJlID09IEZhc3RDYXB0dXJlX0R5bmFtaWMpIHsKKyAgICAgICAgICAgICAgICAgICAgbU5vcm1hbFNvdXJjZSA9IG1QaXBlU291cmNlOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gbm93IHJ1biB0aGUgZmFzdCB0cmFjayBkZXN0cnVjdG9yIHdpdGggdGhyZWFkIG11dGV4IHVubG9ja2VkCisgICAgICAgIGZhc3RUcmFja1RvUmVtb3ZlLmNsZWFyKCk7CisKKyAgICAgICAgLy8gUmVhZCBmcm9tIEhBTCB0byBrZWVwIHVwIHdpdGggZmFzdGVzdCBjbGllbnQgaWYgbXVsdGlwbGUgYWN0aXZlIHRyYWNrcywgbm90IHNsb3dlc3Qgb25lLgorICAgICAgICAvLyBPbmx5IHRoZSBjbGllbnQocykgdGhhdCBhcmUgdG9vIHNsb3cgd2lsbCBvdmVycnVuLiBCdXQgaWYgZXZlbiB0aGUgZmFzdGVzdCBjbGllbnQgaXMgdG9vCisgICAgICAgIC8vIHNsb3csIHRoZW4gdGhpcyBSZWNvcmRUaHJlYWQgd2lsbCBvdmVycnVuIGJ5IG5vdCBjYWxsaW5nIEhBTCByZWFkIG9mdGVuIGVub3VnaC4KKyAgICAgICAgLy8gSWYgZGVzdGluYXRpb24gaXMgbm9uLWNvbnRpZ3VvdXMsIGZpcnN0IHJlYWQgcGFzdCB0aGUgbm9taW5hbCBlbmQgb2YgYnVmZmVyLCB0aGVuCisgICAgICAgIC8vIGNvcHkgdG8gdGhlIHJpZ2h0IHBsYWNlLiAgUGVybWl0dGVkIGJlY2F1c2UgbVJzbXBJbkJ1ZmZlciB3YXMgb3Zlci1hbGxvY2F0ZWQuCisKKyAgICAgICAgaW50MzJfdCByZWFyID0gbVJzbXBJblJlYXIgJiAobVJzbXBJbkZyYW1lc1AyIC0gMSk7CisgICAgICAgIHNzaXplX3QgZnJhbWVzUmVhZDsKKworICAgICAgICAvLyBJZiBhbiBOQkFJTyBzb3VyY2UgaXMgcHJlc2VudCwgdXNlIGl0IHRvIHJlYWQgdGhlIG5vcm1hbCBjYXB0dXJlJ3MgZGF0YQorICAgICAgICBpZiAobVBpcGVTb3VyY2UgIT0gMCkgeworICAgICAgICAgICAgc2l6ZV90IGZyYW1lc1RvUmVhZCA9IG1CdWZmZXJTaXplIC8gbUZyYW1lU2l6ZTsKKyAgICAgICAgICAgIGZyYW1lc1JlYWQgPSBtUGlwZVNvdXJjZS0+cmVhZCgmbVJzbXBJbkJ1ZmZlcltyZWFyICogbUNoYW5uZWxDb3VudF0sCisgICAgICAgICAgICAgICAgICAgIGZyYW1lc1RvUmVhZCwgQXVkaW9CdWZmZXJQcm92aWRlcjo6a0ludmFsaWRQVFMpOworICAgICAgICAgICAgaWYgKGZyYW1lc1JlYWQgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIHNpbmNlIHBpcGUgaXMgbm9uLWJsb2NraW5nLCBzaW11bGF0ZSBibG9ja2luZyBpbnB1dAorICAgICAgICAgICAgICAgIHNsZWVwVXMgPSAoZnJhbWVzVG9SZWFkICogMTAwMDAwMExMKSAvIG1TYW1wbGVSYXRlOworICAgICAgICAgICAgfQorICAgICAgICAvLyBvdGhlcndpc2UgdXNlIHRoZSBIQUwgLyBBdWRpb1N0cmVhbUluIGRpcmVjdGx5CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzc2l6ZV90IGJ5dGVzUmVhZCA9IG1JbnB1dC0+c3RyZWFtLT5yZWFkKG1JbnB1dC0+c3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAmbVJzbXBJbkJ1ZmZlcltyZWFyICogbUNoYW5uZWxDb3VudF0sIG1CdWZmZXJTaXplKTsKKyAgICAgICAgICAgIGlmIChieXRlc1JlYWQgPCAwKSB7CisgICAgICAgICAgICAgICAgZnJhbWVzUmVhZCA9IGJ5dGVzUmVhZDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZnJhbWVzUmVhZCA9IGJ5dGVzUmVhZCAvIG1GcmFtZVNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZnJhbWVzUmVhZCA8IDAgfHwgKGZyYW1lc1JlYWQgPT0gMCAmJiBtUGlwZVNvdXJjZSA9PSAwKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgZmFpbGVkOiBmcmFtZXNSZWFkPSVkIiwgZnJhbWVzUmVhZCk7CisgICAgICAgICAgICAvLyBGb3JjZSBpbnB1dCBpbnRvIHN0YW5kYnkgc28gdGhhdCBpdCB0cmllcyB0byByZWNvdmVyIGF0IG5leHQgcmVhZCBhdHRlbXB0CisgICAgICAgICAgICBpbnB1dFN0YW5kQnkoKTsKKyAgICAgICAgICAgIHNsZWVwVXMgPSBrUmVjb3JkVGhyZWFkU2xlZXBVczsKKyAgICAgICAgfQorICAgICAgICBpZiAoZnJhbWVzUmVhZCA8PSAwKSB7CisgICAgICAgICAgICBnb3RvIHVubG9jazsKKyAgICAgICAgfQorICAgICAgICBBTE9HX0FTU0VSVChmcmFtZXNSZWFkID4gMCk7CisKKyAgICAgICAgaWYgKG1UZWVTaW5rICE9IDApIHsKKyAgICAgICAgICAgICh2b2lkKSBtVGVlU2luay0+d3JpdGUoJm1Sc21wSW5CdWZmZXJbcmVhciAqIG1DaGFubmVsQ291bnRdLCBmcmFtZXNSZWFkKTsKKyAgICAgICAgfQorICAgICAgICAvLyBJZiBkZXN0aW5hdGlvbiBpcyBub24tY29udGlndW91cywgd2Ugbm93IGNvcnJlY3QgZm9yIHJlYWRpbmcgcGFzdCBlbmQgb2YgYnVmZmVyLgorICAgICAgICB7CisgICAgICAgICAgICBzaXplX3QgcGFydDEgPSBtUnNtcEluRnJhbWVzUDIgLSByZWFyOworICAgICAgICAgICAgaWYgKChzaXplX3QpIGZyYW1lc1JlYWQgPiBwYXJ0MSkgeworICAgICAgICAgICAgICAgIG1lbWNweShtUnNtcEluQnVmZmVyLCAmbVJzbXBJbkJ1ZmZlclttUnNtcEluRnJhbWVzUDIgKiBtQ2hhbm5lbENvdW50XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChmcmFtZXNSZWFkIC0gcGFydDEpICogbUZyYW1lU2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmVhciA9IG1Sc21wSW5SZWFyICs9IGZyYW1lc1JlYWQ7CisKKyAgICAgICAgc2l6ZSA9IGFjdGl2ZVRyYWNrcy5zaXplKCk7CisgICAgICAgIC8vIGxvb3Agb3ZlciBlYWNoIGFjdGl2ZSB0cmFjaworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgYWN0aXZlVHJhY2sgPSBhY3RpdmVUcmFja3NbaV07CisKKyAgICAgICAgICAgIC8vIHNraXAgZmFzdCB0cmFja3MsIGFzIHRob3NlIGFyZSBoYW5kbGVkIGRpcmVjdGx5IGJ5IEZhc3RDYXB0dXJlCisgICAgICAgICAgICBpZiAoYWN0aXZlVHJhY2stPmlzRmFzdFRyYWNrKCkpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZWZmZWN0Q2hhaW5zLnNpemUoKTsgaSArKykgewotICAgICAgICAgICAgICAgIGVmZmVjdENoYWluc1tpXS0+cHJvY2Vzc19sKCk7Ci0gICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGJ1ZmZlci5mcmFtZUNvdW50ID0gbUZyYW1lQ291bnQ7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQWN0aXZlVHJhY2stPmdldE5leHRCdWZmZXIoJmJ1ZmZlcik7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmVhZE9uY2UgPSB0cnVlOwotICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZXNPdXQgPSBidWZmZXIuZnJhbWVDb3VudDsKLSAgICAgICAgICAgICAgICBpZiAobVJlc2FtcGxlciA9PSBOVUxMKSB7CisgICAgICAgICAgICBlbnVtIHsKKyAgICAgICAgICAgICAgICBPVkVSUlVOX1VOS05PV04sCisgICAgICAgICAgICAgICAgT1ZFUlJVTl9UUlVFLAorICAgICAgICAgICAgICAgIE9WRVJSVU5fRkFMU0UKKyAgICAgICAgICAgIH0gb3ZlcnJ1biA9IE9WRVJSVU5fVU5LTk9XTjsKKworICAgICAgICAgICAgLy8gbG9vcCBvdmVyIGdldE5leHRCdWZmZXIgdG8gaGFuZGxlIGNpcmN1bGFyIHNpbmsKKyAgICAgICAgICAgIGZvciAoOzspIHsKKworICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tU2luay5mcmFtZUNvdW50ID0gfjA7CisgICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYWN0aXZlVHJhY2stPmdldE5leHRCdWZmZXIoJmFjdGl2ZVRyYWNrLT5tU2luayk7CisgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lc091dCA9IGFjdGl2ZVRyYWNrLT5tU2luay5mcmFtZUNvdW50OworICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKHN0YXR1cyA9PSBPSykgIT0gKGZyYW1lc091dCA+IDApKTsKKworICAgICAgICAgICAgICAgIGludDMyX3QgZnJvbnQgPSBhY3RpdmVUcmFjay0+bVJzbXBJbkZyb250OworICAgICAgICAgICAgICAgIHNzaXplX3QgZmlsbGVkID0gcmVhciAtIGZyb250OworICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZXNJbjsKKworICAgICAgICAgICAgICAgIGlmIChmaWxsZWQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBub3QgaGFwcGVuLCBidXQgdHJlYXQgbGlrZSBhIG1hc3NpdmUgb3ZlcnJ1biBhbmQgcmUtc3luYworICAgICAgICAgICAgICAgICAgICBmcmFtZXNJbiA9IDA7CisgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tUnNtcEluRnJvbnQgPSByZWFyOworICAgICAgICAgICAgICAgICAgICBvdmVycnVuID0gT1ZFUlJVTl9UUlVFOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHNpemVfdCkgZmlsbGVkIDw9IG1Sc21wSW5GcmFtZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW4gPSAoc2l6ZV90KSBmaWxsZWQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2xpZW50IGlzIG5vdCBrZWVwaW5nIHVwIHdpdGggc2VydmVyLCBidXQgZ2l2ZSBpdCBsYXRlc3QgZGF0YQorICAgICAgICAgICAgICAgICAgICBmcmFtZXNJbiA9IG1Sc21wSW5GcmFtZXM7CisgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tUnNtcEluRnJvbnQgPSBmcm9udCA9IHJlYXIgLSBmcmFtZXNJbjsKKyAgICAgICAgICAgICAgICAgICAgb3ZlcnJ1biA9IE9WRVJSVU5fVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZnJhbWVzT3V0ID09IDAgfHwgZnJhbWVzSW4gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoYWN0aXZlVHJhY2stPm1SZXNhbXBsZXIgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAvLyBubyByZXNhbXBsaW5nCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChmcmFtZXNPdXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZXNJbiA9IG1GcmFtZUNvdW50IC0gbVJzbXBJbkluZGV4OwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lc0luKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50OF90ICpzcmMgPSAoaW50OF90ICopbVJzbXBJbkJ1ZmZlciArIG1Sc21wSW5JbmRleCAqIG1GcmFtZVNpemU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50OF90ICpkc3QgPSBidWZmZXIuaTggKyAoYnVmZmVyLmZyYW1lQ291bnQgLSBmcmFtZXNPdXQpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFjay0+bUZyYW1lU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVzSW4gPiBmcmFtZXNPdXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luID0gZnJhbWVzT3V0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sc21wSW5JbmRleCArPSBmcmFtZXNJbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNPdXQgLT0gZnJhbWVzSW47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1DaGFubmVsQ291bnQgPT0gbVJlcUNoYW5uZWxDb3VudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIGZyYW1lc0luICogbUZyYW1lU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1DaGFubmVsQ291bnQgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBtaXhfdG9fc3RlcmVvX2kxNl9mcm9tX21vbm9faTE2KChpbnQxNl90ICopZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCAqKXNyYywgZnJhbWVzSW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bm1peF90b19tb25vX2kxNl9mcm9tX3N0ZXJlb19pMTYoKGludDE2X3QgKilkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQxNl90ICopc3JjLCBmcmFtZXNJbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVzT3V0ICYmIG1GcmFtZUNvdW50ID09IG1Sc21wSW5JbmRleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlYWRJbnRvOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZXNPdXQgPT0gbUZyYW1lQ291bnQgJiYgbUNoYW5uZWxDb3VudCA9PSBtUmVxQ2hhbm5lbENvdW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRJbnRvID0gYnVmZmVyLnJhdzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzT3V0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkSW50byA9IG1Sc21wSW5CdWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sc21wSW5JbmRleCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CeXRlc1JlYWQgPSBtSW5wdXQtPnN0cmVhbS0+cmVhZChtSW5wdXQtPnN0cmVhbSwgcmVhZEludG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnVmZmVyU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1CeXRlc1JlYWQgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG1CeXRlc1JlYWQgPCAwKSAmJiAobUFjdGl2ZVRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpBQ1RJVkUpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRXJyb3IgcmVhZGluZyBhdWRpbyBpbnB1dCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yY2UgaW5wdXQgaW50byBzdGFuZGJ5IHNvIHRoYXQgaXQgdHJpZXMgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY292ZXIgYXQgbmV4dCByZWFkIGF0dGVtcHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U3RhbmRCeSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNsZWVwKGtSZWNvcmRUaHJlYWRTbGVlcFVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUnNtcEluSW5kZXggPSBtRnJhbWVDb3VudDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzT3V0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmZyYW1lQ291bnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSNpZmRlZiBURUVfU0lOSwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1UZWVTaW5rICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpIG1UZWVTaW5rLT53cml0ZShyZWFkSW50bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnl0ZXNSZWFkID4+IEZvcm1hdF9mcmFtZUJpdFNoaWZ0KG1UZWVTaW5rLT5mb3JtYXQoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVzSW4gPiBmcmFtZXNPdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luID0gZnJhbWVzT3V0OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzT3V0ID0gZnJhbWVzSW47CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW50OF90ICpkc3QgPSBhY3RpdmVUcmFjay0+bVNpbmsuaTg7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChmcmFtZXNJbiA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyb250ICY9IG1Sc21wSW5GcmFtZXNQMiAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcGFydDEgPSBtUnNtcEluRnJhbWVzUDIgLSBmcm9udDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0MSA+IGZyYW1lc0luKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydDEgPSBmcmFtZXNJbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCAqc3JjID0gKGludDhfdCAqKW1Sc21wSW5CdWZmZXIgKyAoZnJvbnQgKiBtRnJhbWVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ2hhbm5lbENvdW50ID09IGFjdGl2ZVRyYWNrLT5tQ2hhbm5lbENvdW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCBwYXJ0MSAqIG1GcmFtZVNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtQ2hhbm5lbENvdW50ID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cG1peF90b19zdGVyZW9faTE2X2Zyb21fbW9ub19pMTYoKGludDE2X3QgKilkc3QsIChjb25zdCBpbnQxNl90ICopc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydDEpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3dubWl4X3RvX21vbm9faTE2X2Zyb21fc3RlcmVvX2kxNigoaW50MTZfdCAqKWRzdCwgKGNvbnN0IGludDE2X3QgKilzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0MSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBkc3QgKz0gcGFydDEgKiBhY3RpdmVUcmFjay0+bUZyYW1lU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyb250ICs9IHBhcnQxOworICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW4gLT0gcGFydDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1Sc21wSW5Gcm9udCArPSBmcmFtZXNPdXQ7CisKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAvLyByZXNhbXBsaW5nCisgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIGZyYW1lc0luTmVlZGVkIHNob3VsZCByZWFsbHkgYmUgcGFydCBvZiByZXNhbXBsZXIgQVBJLCBhbmQgc2hvdWxkCisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIGRlcGVuZCBvbiB0aGUgU1JDIHJhdGlvCisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHRvIGtlZXAgbVJzbXBJbkJ1ZmZlciBmdWxsIHNvIHJlc2FtcGxlciBhbHdheXMgaGFzIHN1ZmZpY2llbnQgaW5wdXQKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lc0luTmVlZGVkOworICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSBvbmx5IHJlLWNhbGN1bGF0ZSB3aGVuIGl0IGNoYW5nZXMsIGFuZCBvcHRpbWl6ZSBmb3IgY29tbW9uIHJhdGlvcworICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3QgcHJlY29tcHV0ZSBpbi9vdXQgYmVjYXVzZSBmbG9hdGluZyBwb2ludCBpcyBub3QgYXNzb2NpYXRpdmUKKyAgICAgICAgICAgICAgICAgICAgLy8gZS5nLiBhKmIvYyAhPSBhKihiL2MpLgorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgaW4obVNhbXBsZVJhdGUpOworICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgb3V0KGFjdGl2ZVRyYWNrLT5tU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luTmVlZGVkID0gY2VpbChmcmFtZXNPdXQgKiBpbiAvIG91dCkgKyAxOworICAgICAgICAgICAgICAgICAgICBBTE9HVigibmVlZCAldSBmcmFtZXMgaW4gdG8gcHJvZHVjZSAldSBvdXQgZ2l2ZW4gaW4vb3V0IHJhdGlvIG9mICUuNGciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNJbk5lZWRlZCwgZnJhbWVzT3V0LCBpbiAvIG91dCk7CisgICAgICAgICAgICAgICAgICAgIC8vIEFsdGhvdWdoIHdlIHRoZW9yZXRpY2FsbHkgaGF2ZSBmcmFtZXNJbiBpbiBjaXJjdWxhciBidWZmZXIsIHNvbWUgb2YgdGhvc2UgYXJlCisgICAgICAgICAgICAgICAgICAgIC8vIHVucmVsZWFzZWQgZnJhbWVzLCBhbmQgdGh1cyBtdXN0IGJlIGRpc2NvdW50ZWQgZm9yIHB1cnBvc2Ugb2YgYnVkZ2V0aW5nLgorICAgICAgICAgICAgICAgICAgICBzaXplX3QgdW5yZWxlYXNlZCA9IGFjdGl2ZVRyYWNrLT5tUnNtcEluVW5yZWw7CisgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luID0gZnJhbWVzSW4gPiB1bnJlbGVhc2VkID8gZnJhbWVzSW4gLSB1bnJlbGVhc2VkIDogMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lc0luIDwgZnJhbWVzSW5OZWVkZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJub3QgZW5vdWdoIHRvIHJlc2FtcGxlOiBoYXZlICV1IGZyYW1lcyBpbiBidXQgbmVlZCAldSBpbiB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9kdWNlICV1IG91dCBnaXZlbiBpbi9vdXQgcmF0aW8gb2YgJS40ZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luLCBmcmFtZXNJbk5lZWRlZCwgZnJhbWVzT3V0LCBpbiAvIG91dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbmV3RnJhbWVzT3V0ID0gZnJhbWVzSW4gPiAwID8gZmxvb3IoKGZyYW1lc0luIC0gMSkgKiBvdXQgLyBpbikgOiAwOworICAgICAgICAgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihuZXdGcmFtZXNPdXQgPj0gZnJhbWVzT3V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdGcmFtZXNPdXQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW5OZWVkZWQgPSBjZWlsKG5ld0ZyYW1lc091dCAqIGluIC8gb3V0KSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigibm93IG5lZWQgJXUgZnJhbWVzIGluIHRvIHByb2R1Y2UgJXUgb3V0IGdpdmVuIG91dC9pbiByYXRpbyBvZiAlLjRnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW5OZWVkZWQsIG5ld0ZyYW1lc091dCwgb3V0IC8gaW4pOworICAgICAgICAgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihmcmFtZXNJbiA8IGZyYW1lc0luTmVlZGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJzdWNjZXNzIDI6IGhhdmUgJXUgZnJhbWVzIGluIGFuZCBuZWVkICV1IGluIHRvIHByb2R1Y2UgJXUgb3V0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnaXZlbiBpbi9vdXQgcmF0aW8gb2YgJS40ZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNJbiwgZnJhbWVzSW5OZWVkZWQsIG5ld0ZyYW1lc091dCwgaW4gLyBvdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzT3V0ID0gbmV3RnJhbWVzT3V0OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInN1Y2Nlc3MgMTogaGF2ZSAldSBpbiBhbmQgbmVlZCAldSBpbiB0byBwcm9kdWNlICV1IG91dCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdpdmVuIGluL291dCByYXRpbyBvZiAlLjRnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNJbiwgZnJhbWVzSW5OZWVkZWQsIGZyYW1lc091dCwgaW4gLyBvdXQpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVhbGxvY2F0ZSBtUnNtcE91dEJ1ZmZlciBhcyBuZWVkZWQ7IHdlIHdpbGwgZ3JvdyBidXQgbmV2ZXIgc2hyaW5rCisgICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVUcmFjay0+bVJzbXBPdXRGcmFtZUNvdW50IDwgZnJhbWVzT3V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSB3aHkgZG9lcyBlYWNoIHRyYWNrIG5lZWQgaXQncyBvd24gbVJzbXBPdXRCdWZmZXI/IGNhbid0IHRoZXkgc2hhcmU/CisgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVbXSBhY3RpdmVUcmFjay0+bVJzbXBPdXRCdWZmZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNhbXBsZXIgYWx3YXlzIG91dHB1dHMgc3RlcmVvCisgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVJzbXBPdXRCdWZmZXIgPSBuZXcgaW50MzJfdFtmcmFtZXNPdXQgKiBGQ0NfMl07CisgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVJzbXBPdXRGcmFtZUNvdW50ID0gZnJhbWVzT3V0OworICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgLy8gcmVzYW1wbGVyIGFjY3VtdWxhdGVzLCBidXQgd2Ugb25seSBoYXZlIG9uZSBzb3VyY2UgdHJhY2sKLSAgICAgICAgICAgICAgICAgICAgbWVtc2V0KG1Sc21wT3V0QnVmZmVyLCAwLCBmcmFtZXNPdXQgKiBGQ0NfMiAqIHNpemVvZihpbnQzMl90KSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGFsdGVyIG91dHB1dCBmcmFtZSBjb3VudCBhcyBpZiB3ZSB3ZXJlIGV4cGVjdGluZyBzdGVyZW8gc2FtcGxlcwotICAgICAgICAgICAgICAgICAgICBpZiAobUNoYW5uZWxDb3VudCA9PSAxICYmIG1SZXFDaGFubmVsQ291bnQgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzT3V0ID4+PSAxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1SZXNhbXBsZXItPnJlc2FtcGxlKG1Sc21wT3V0QnVmZmVyLCBmcmFtZXNPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyAvKiBBdWRpb0J1ZmZlclByb3ZpZGVyKiAqLyk7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldChhY3RpdmVUcmFjay0+bVJzbXBPdXRCdWZmZXIsIDAsIGZyYW1lc091dCAqIEZDQ18yICogc2l6ZW9mKGludDMyX3QpKTsKKyAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1SZXNhbXBsZXItPnJlc2FtcGxlKGFjdGl2ZVRyYWNrLT5tUnNtcE91dEJ1ZmZlciwgZnJhbWVzT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIGhvdyBhYm91dCBoYXZpbmcgYWN0aXZlVHJhY2sgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGl0c2VsZj8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0aGlzKi8gLyogQXVkaW9CdWZmZXJQcm92aWRlciogKi8pOwogICAgICAgICAgICAgICAgICAgICAvLyBkaXRoZXJBbmRDbGFtcCgpIHdvcmtzIGFzIGxvbmcgYXMgYWxsIGJ1ZmZlcnMgcmV0dXJuZWQgYnkKLSAgICAgICAgICAgICAgICAgICAgLy8gbUFjdGl2ZVRyYWNrLT5nZXROZXh0QnVmZmVyKCkgYXJlIDMyIGJpdCBhbGlnbmVkIHdoaWNoIHNob3VsZCBiZSBhbHdheXMgdHJ1ZS4KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1DaGFubmVsQ291bnQgPT0gMiAmJiBtUmVxQ2hhbm5lbENvdW50ID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlbXBvcmFyaWx5IHR5cGUgcHVuIG1Sc21wT3V0QnVmZmVyIGZyb20gUTE5LjEyIHRvIGludDE2X3QKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpdGhlckFuZENsYW1wKG1Sc21wT3V0QnVmZmVyLCBtUnNtcE91dEJ1ZmZlciwgZnJhbWVzT3V0KTsKKyAgICAgICAgICAgICAgICAgICAgLy8gYWN0aXZlVHJhY2stPmdldE5leHRCdWZmZXIoKSBhcmUgMzIgYml0IGFsaWduZWQgd2hpY2ggc2hvdWxkIGJlIGFsd2F5cyB0cnVlLgorICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlVHJhY2stPm1DaGFubmVsQ291bnQgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVtcG9yYXJpbHkgdHlwZSBwdW4gbVJzbXBPdXRCdWZmZXIgZnJvbSBRNC4yNyB0byBpbnQxNl90CisgICAgICAgICAgICAgICAgICAgICAgICBkaXRoZXJBbmRDbGFtcChhY3RpdmVUcmFjay0+bVJzbXBPdXRCdWZmZXIsIGFjdGl2ZVRyYWNrLT5tUnNtcE91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzT3V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZXNhbXBsZXIgYWx3YXlzIG91dHB1dHMgc3RlcmVvIHNhbXBsZXM6CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBwb3N0IHN0ZXJlbyB0byBtb25vIGNvbnZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIGRvd25taXhfdG9fbW9ub19pMTZfZnJvbV9zdGVyZW9faTE2KGJ1ZmZlci5pMTYsIChpbnQxNl90ICopbVJzbXBPdXRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc091dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkb3dubWl4X3RvX21vbm9faTE2X2Zyb21fc3RlcmVvX2kxNihhY3RpdmVUcmFjay0+bVNpbmsuaTE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKWFjdGl2ZVRyYWNrLT5tUnNtcE91dEJ1ZmZlciwgZnJhbWVzT3V0KTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpdGhlckFuZENsYW1wKChpbnQzMl90ICopYnVmZmVyLnJhdywgbVJzbXBPdXRCdWZmZXIsIGZyYW1lc091dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkaXRoZXJBbmRDbGFtcCgoaW50MzJfdCAqKWFjdGl2ZVRyYWNrLT5tU2luay5yYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tUnNtcE91dEJ1ZmZlciwgZnJhbWVzT3V0KTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAvLyBub3cgZG9uZSB3aXRoIG1Sc21wT3V0QnVmZmVyCiAKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1GcmFtZXN0b0Ryb3AgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2stPnJlbGVhc2VCdWZmZXIoJmJ1ZmZlcik7CisKKyAgICAgICAgICAgICAgICBpZiAoZnJhbWVzT3V0ID4gMCAmJiAob3ZlcnJ1biA9PSBPVkVSUlVOX1VOS05PV04pKSB7CisgICAgICAgICAgICAgICAgICAgIG92ZXJydW4gPSBPVkVSUlVOX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChhY3RpdmVUcmFjay0+bUZyYW1lc1RvRHJvcCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZXNPdXQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVNpbmsuZnJhbWVDb3VudCA9IGZyYW1lc091dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5yZWxlYXNlQnVmZmVyKCZhY3RpdmVUcmFjay0+bVNpbmspOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1GcmFtZXN0b0Ryb3AgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzdG9Ecm9wIC09IGJ1ZmZlci5mcmFtZUNvdW50OwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1GcmFtZXN0b0Ryb3AgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgY291bGQgZG8gYSBwYXJ0aWFsIGRyb3Agb2YgZnJhbWVzT3V0CisgICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVUcmFjay0+bUZyYW1lc1RvRHJvcCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tRnJhbWVzVG9Ecm9wIC09IGZyYW1lc091dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVUcmFjay0+bUZyYW1lc1RvRHJvcCA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPmNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXN0b0Ryb3AgKz0gYnVmZmVyLmZyYW1lQ291bnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUZyYW1lc3RvRHJvcCA+PSAwIHx8IG1TeW5jU3RhcnRFdmVudCA9PSAwIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TeW5jU3RhcnRFdmVudC0+aXNDYW5jZWxsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1GcmFtZXNUb0Ryb3AgKz0gZnJhbWVzT3V0OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVRyYWNrLT5tRnJhbWVzVG9Ecm9wID49IDAgfHwgYWN0aXZlVHJhY2stPm1TeW5jU3RhcnRFdmVudCA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tU3luY1N0YXJ0RXZlbnQtPmlzQ2FuY2VsbGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiU3luY2VkIHJlY29yZCAlcywgc2Vzc2lvbiAlZCwgdHJpZ2dlciBzZXNzaW9uICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobUZyYW1lc3RvRHJvcCA+PSAwKSA/ICJ0aW1lZCBvdXQiIDogImNhbmNlbGxlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrLT5zZXNzaW9uSWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVN5bmNTdGFydEV2ZW50ICE9IDApID8gbVN5bmNTdGFydEV2ZW50LT50cmlnZ2VyU2Vzc2lvbigpIDogMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJTeW5jU3RhcnRFdmVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhY3RpdmVUcmFjay0+bUZyYW1lc1RvRHJvcCA+PSAwKSA/ICJ0aW1lZCBvdXQiIDogImNhbmNlbGxlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPnNlc3Npb25JZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhY3RpdmVUcmFjay0+bVN5bmNTdGFydEV2ZW50ICE9IDApID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tU3luY1N0YXJ0RXZlbnQtPnRyaWdnZXJTZXNzaW9uKCkgOiAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+Y2xlYXJTeW5jU3RhcnRFdmVudCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFjay0+Y2xlYXJPdmVyZmxvdygpOworCisgICAgICAgICAgICAgICAgaWYgKGZyYW1lc091dCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGNsaWVudCBpc24ndCByZXRyaWV2aW5nIGJ1ZmZlcnMgZmFzdCBlbm91Z2gKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGlmICghbUFjdGl2ZVRyYWNrLT5zZXRPdmVyZmxvdygpKSB7CisKKyAgICAgICAgICAgIHN3aXRjaCAob3ZlcnJ1bikgeworICAgICAgICAgICAgY2FzZSBPVkVSUlVOX1RSVUU6CisgICAgICAgICAgICAgICAgLy8gY2xpZW50IGlzbid0IHJldHJpZXZpbmcgYnVmZmVycyBmYXN0IGVub3VnaAorICAgICAgICAgICAgICAgIGlmICghYWN0aXZlVHJhY2stPnNldE92ZXJmbG93KCkpIHsKICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIHNob3VsZCBsYXN0V2FybmluZyBwZXIgdHJhY2s/CiAgICAgICAgICAgICAgICAgICAgIGlmICgobm93IC0gbGFzdFdhcm5pbmcpID4ga1dhcm5pbmdUaHJvdHRsZU5zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiUmVjb3JkVGhyZWFkOiBidWZmZXIgb3ZlcmZsb3ciKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RXYXJuaW5nID0gbm93OwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFJlbGVhc2UgdGhlIHByb2Nlc3NvciBmb3IgYSB3aGlsZSBiZWZvcmUgYXNraW5nIGZvciBhIG5ldyBidWZmZXIuCi0gICAgICAgICAgICAgICAgLy8gVGhpcyB3aWxsIGdpdmUgdGhlIGFwcGxpY2F0aW9uIG1vcmUgY2hhbmNlIHRvIHJlYWQgZnJvbSB0aGUgYnVmZmVyIGFuZAotICAgICAgICAgICAgICAgIC8vIGNsZWFyIHRoZSBvdmVyZmxvdy4KLSAgICAgICAgICAgICAgICB1c2xlZXAoa1JlY29yZFRocmVhZFNsZWVwVXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPVkVSUlVOX0ZBTFNFOgorICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5jbGVhck92ZXJmbG93KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9WRVJSVU5fVU5LTk9XTjoKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KKwogICAgICAgICB9CisKK3VubG9jazoKICAgICAgICAgLy8gZW5hYmxlIGNoYW5nZXMgaW4gZWZmZWN0IGNoYWluCiAgICAgICAgIHVubG9ja0VmZmVjdENoYWlucyhlZmZlY3RDaGFpbnMpOwotICAgICAgICBlZmZlY3RDaGFpbnMuY2xlYXIoKTsKKyAgICAgICAgLy8gZWZmZWN0Q2hhaW5zIGRvZXNuJ3QgbmVlZCB0byBiZSBjbGVhcmVkLCBzaW5jZSBpdCBpcyBjbGVhcmVkIGJ5IGRlc3RydWN0b3IgYXQgc2NvcGUgZW5kCiAgICAgfQogCi0gICAgc3RhbmRieSgpOworICAgIHN0YW5kYnlJZk5vdEFscmVhZHlJblN0YW5kYnkoKTsKIAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTQ2NDAsNyArNTQ4MCw4IEBACiAgICAgICAgICAgICBzcDxSZWNvcmRUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOwogICAgICAgICAgICAgdHJhY2stPmludmFsaWRhdGUoKTsKICAgICAgICAgfQotICAgICAgICBtQWN0aXZlVHJhY2suY2xlYXIoKTsKKyAgICAgICAgbUFjdGl2ZVRyYWNrcy5jbGVhcigpOworICAgICAgICBtQWN0aXZlVHJhY2tzR2VuKys7CiAgICAgICAgIG1TdGFydFN0b3BDb25kLmJyb2FkY2FzdCgpOwogICAgIH0KIApAQCAtNDY1MCw3ICs1NDkxLDcgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnN0YW5kYnkoKQordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6c3RhbmRieUlmTm90QWxyZWFkeUluU3RhbmRieSgpCiB7CiAgICAgaWYgKCFtU3RhbmRieSkgewogICAgICAgICBpbnB1dFN0YW5kQnkoKTsKQEAgLTQ2NjAsOTEgKzU1MDEsMTMwIEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmlucHV0U3RhbmRCeSgpCiB7CisgICAgLy8gSWRsZSB0aGUgZmFzdCBjYXB0dXJlIGlmIGl0J3MgY3VycmVudGx5IHJ1bm5pbmcKKyAgICBpZiAobUZhc3RDYXB0dXJlICE9IDApIHsKKyAgICAgICAgRmFzdENhcHR1cmVTdGF0ZVF1ZXVlICpzcSA9IG1GYXN0Q2FwdHVyZS0+c3EoKTsKKyAgICAgICAgRmFzdENhcHR1cmVTdGF0ZSAqc3RhdGUgPSBzcS0+YmVnaW4oKTsKKyAgICAgICAgaWYgKCEoc3RhdGUtPm1Db21tYW5kICYgRmFzdENhcHR1cmVTdGF0ZTo6SURMRSkpIHsKKyAgICAgICAgICAgIHN0YXRlLT5tQ29tbWFuZCA9IEZhc3RDYXB0dXJlU3RhdGU6OkNPTERfSURMRTsKKyAgICAgICAgICAgIHN0YXRlLT5tQ29sZEZ1dGV4QWRkciA9ICZtRmFzdENhcHR1cmVGdXRleDsKKyAgICAgICAgICAgIHN0YXRlLT5tQ29sZEdlbisrOworICAgICAgICAgICAgbUZhc3RDYXB0dXJlRnV0ZXggPSAwOworICAgICAgICAgICAgc3EtPmVuZCgpOworICAgICAgICAgICAgLy8gQkxPQ0tfVU5USUxfUFVTSEVEIHdvdWxkIGJlIGluc3VmZmljaWVudCwgYXMgd2UgbmVlZCBpdCB0byBzdG9wIGRvaW5nIEkvTyBub3cKKyAgICAgICAgICAgIHNxLT5wdXNoKEZhc3RDYXB0dXJlU3RhdGVRdWV1ZTo6QkxPQ0tfVU5USUxfQUNLRUQpOworI2lmIDAKKyAgICAgICAgICAgIGlmIChrVXNlRmFzdENhcHR1cmUgPT0gRmFzdENhcHR1cmVfRHluYW1pYykgeworICAgICAgICAgICAgICAgIC8vIEZJWE1FCisgICAgICAgICAgICB9CisjZW5kaWYKKyNpZmRlZiBBVURJT19XQVRDSERPRworICAgICAgICAgICAgLy8gRklYTUUKKyNlbmRpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3EtPmVuZChmYWxzZSAvKmRpZE1vZGlmeSovKTsKKyAgICAgICAgfQorICAgIH0KICAgICBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLnN0YW5kYnkoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pOwogfQogCi1zcDxBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s+ICBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6Y3JlYXRlUmVjb3JkVHJhY2tfbCgKKy8vIFJlY29yZFRocmVhZDo6Y3JlYXRlUmVjb3JkVHJhY2tfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBoZWxkCitzcDxBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s+IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpjcmVhdGVSZWNvcmRUcmFja19sKAogICAgICAgICBjb25zdCBzcDxBdWRpb0ZsaW5nZXI6OkNsaWVudD4mIGNsaWVudCwKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgIHNpemVfdCAqcEZyYW1lQ291bnQsCiAgICAgICAgIGludCBzZXNzaW9uSWQsCisgICAgICAgIHNpemVfdCAqbm90aWZpY2F0aW9uRnJhbWVzLAogICAgICAgICBpbnQgdWlkLAogICAgICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190ICpmbGFncywKICAgICAgICAgcGlkX3QgdGlkLAogICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKQogeworICAgIHNpemVfdCBmcmFtZUNvdW50ID0gKnBGcmFtZUNvdW50OwogICAgIHNwPFJlY29yZFRyYWNrPiB0cmFjazsKICAgICBzdGF0dXNfdCBsU3RhdHVzOwogCisgICAgLy8gY2xpZW50IGV4cHJlc3NlcyBhIHByZWZlcmVuY2UgZm9yIEZBU1QsIGJ1dCB3ZSBnZXQgdGhlIGZpbmFsIHNheQorICAgIGlmICgqZmxhZ3MgJiBJQXVkaW9GbGluZ2VyOjpUUkFDS19GQVNUKSB7CisgICAgICBpZiAoCisgICAgICAgICAgICAvLyB1c2UgY2FzZTogY2FsbGJhY2sgaGFuZGxlcgorICAgICAgICAgICAgKHRpZCAhPSAtMSkgJiYKKyAgICAgICAgICAgIC8vIGZyYW1lIGNvdW50IGlzIG5vdCBzcGVjaWZpZWQsIG9yIGlzIGV4YWN0bHkgdGhlIHBpcGUgZGVwdGgKKyAgICAgICAgICAgICgoZnJhbWVDb3VudCA9PSAwKSB8fCAoZnJhbWVDb3VudCA9PSBtUGlwZUZyYW1lc1AyKSkgJiYKKyAgICAgICAgICAgIC8vIFBDTSBkYXRhCisgICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkgJiYKKyAgICAgICAgICAgIC8vIG5hdGl2ZSBmb3JtYXQKKyAgICAgICAgICAgIChmb3JtYXQgPT0gbUZvcm1hdCkgJiYKKyAgICAgICAgICAgIC8vIG5hdGl2ZSBjaGFubmVsIG1hc2sKKyAgICAgICAgICAgIChjaGFubmVsTWFzayA9PSBtQ2hhbm5lbE1hc2spICYmCisgICAgICAgICAgICAvLyBuYXRpdmUgaGFyZHdhcmUgc2FtcGxlIHJhdGUKKyAgICAgICAgICAgIChzYW1wbGVSYXRlID09IG1TYW1wbGVSYXRlKSAmJgorICAgICAgICAgICAgLy8gcmVjb3JkIHRocmVhZCBoYXMgYW4gYXNzb2NpYXRlZCBmYXN0IGNhcHR1cmUKKyAgICAgICAgICAgIGhhc0Zhc3RDYXB0dXJlKCkgJiYKKyAgICAgICAgICAgIC8vIHRoZXJlIGFyZSBzdWZmaWNpZW50IGZhc3QgdHJhY2sgc2xvdHMgYXZhaWxhYmxlCisgICAgICAgICAgICBtRmFzdFRyYWNrQXZhaWwKKyAgICAgICAgKSB7CisgICAgICAgIEFMT0dWKCJBVURJT19JTlBVVF9GTEFHX0ZBU1QgYWNjZXB0ZWQ6IGZyYW1lQ291bnQ9JXUgbUZyYW1lQ291bnQ9JXUiLAorICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIG1GcmFtZUNvdW50KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJBVURJT19JTlBVVF9GTEFHX0ZBU1QgZGVuaWVkOiBmcmFtZUNvdW50PSV1IG1GcmFtZUNvdW50PSV1IG1QaXBlRnJhbWVzUDI9JXUgIgorICAgICAgICAgICAgICAgICJmb3JtYXQ9JSN4IGlzTGluZWFyPSVkIGNoYW5uZWxNYXNrPSUjeCBzYW1wbGVSYXRlPSV1IG1TYW1wbGVSYXRlPSV1ICIKKyAgICAgICAgICAgICAgICAiaGFzRmFzdENhcHR1cmU9JWQgdGlkPSVkIG1GYXN0VHJhY2tBdmFpbD0lZCIsCisgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgbUZyYW1lQ291bnQsIG1QaXBlRnJhbWVzUDIsCisgICAgICAgICAgICAgICAgZm9ybWF0LCBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCksIGNoYW5uZWxNYXNrLCBzYW1wbGVSYXRlLCBtU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICBoYXNGYXN0Q2FwdHVyZSgpLCB0aWQsIG1GYXN0VHJhY2tBdmFpbCk7CisgICAgICAgICpmbGFncyAmPSB+SUF1ZGlvRmxpbmdlcjo6VFJBQ0tfRkFTVDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBjb21wdXRlIHRyYWNrIGJ1ZmZlciBzaXplIGluIGZyYW1lcywgYW5kIHN1Z2dlc3QgdGhlIG5vdGlmaWNhdGlvbiBmcmFtZSBjb3VudAorICAgIGlmICgqZmxhZ3MgJiBJQXVkaW9GbGluZ2VyOjpUUkFDS19GQVNUKSB7CisgICAgICAgIC8vIGZhc3QgdHJhY2s6IGZyYW1lIGNvdW50IGlzIGV4YWN0bHkgdGhlIHBpcGUgZGVwdGgKKyAgICAgICAgZnJhbWVDb3VudCA9IG1QaXBlRnJhbWVzUDI7CisgICAgICAgIC8vIGlnbm9yZSByZXF1ZXN0ZWQgbm90aWZpY2F0aW9uRnJhbWVzLCBhbmQgYWx3YXlzIG5vdGlmeSBleGFjdGx5IG9uY2UgZXZlcnkgSEFMIGJ1ZmZlcgorICAgICAgICAqbm90aWZpY2F0aW9uRnJhbWVzID0gbUZyYW1lQ291bnQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gbm90IGZhc3QgdHJhY2s6IG1heCBub3RpZmljYXRpb24gcGVyaW9kIGlzIHJlc2FtcGxlZCBlcXVpdmFsZW50IG9mIG9uZSBIQUwgYnVmZmVyIHRpbWUKKyAgICAgICAgLy8gICAgICAgICAgICAgICAgIG9yIDIwIG1zIGlmIHRoZXJlIGlzIGEgZmFzdCBjYXB0dXJlCisgICAgICAgIC8vIFRPRE8gVGhpcyBjb3VsZCBiZSBhIHJvdW5kdXBSYXRpbyBpbmxpbmUsIGFuZCBjb25zdAorICAgICAgICBzaXplX3QgbWF4Tm90aWZpY2F0aW9uRnJhbWVzID0gKChpbnQ2NF90KSAoaGFzRmFzdENhcHR1cmUoKSA/IG1TYW1wbGVSYXRlLzUwIDogbUZyYW1lQ291bnQpCisgICAgICAgICAgICAgICAgKiBzYW1wbGVSYXRlICsgbVNhbXBsZVJhdGUgLSAxKSAvIG1TYW1wbGVSYXRlOworICAgICAgICAvLyBtaW5pbXVtIG51bWJlciBvZiBub3RpZmljYXRpb24gcGVyaW9kcyBpcyBhdCBsZWFzdCBrTWluTm90aWZpY2F0aW9ucywKKyAgICAgICAgLy8gYW5kIGF0IGxlYXN0IGtNaW5NcyByb3VuZGVkIHVwIHRvIGEgd2hvbGUgbm90aWZpY2F0aW9uIHBlcmlvZCAobWluTm90aWZpY2F0aW9uc0J5TXMpCisgICAgICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01pbk5vdGlmaWNhdGlvbnMgPSAzOworICAgICAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga01pbk1zID0gMzA7CisgICAgICAgIC8vIFRPRE8gVGhpcyBjb3VsZCBiZSBhIHJvdW5kdXBSYXRpbyBpbmxpbmUKKyAgICAgICAgY29uc3Qgc2l6ZV90IG1pbkZyYW1lc0J5TXMgPSAoc2FtcGxlUmF0ZSAqIGtNaW5NcyArIDEwMDAgLSAxKSAvIDEwMDA7CisgICAgICAgIC8vIFRPRE8gVGhpcyBjb3VsZCBiZSBhIHJvdW5kdXBSYXRpbyBpbmxpbmUKKyAgICAgICAgY29uc3Qgc2l6ZV90IG1pbk5vdGlmaWNhdGlvbnNCeU1zID0gKG1pbkZyYW1lc0J5TXMgKyBtYXhOb3RpZmljYXRpb25GcmFtZXMgLSAxKSAvCisgICAgICAgICAgICAgICAgbWF4Tm90aWZpY2F0aW9uRnJhbWVzOworICAgICAgICBjb25zdCBzaXplX3QgbWluRnJhbWVDb3VudCA9IG1heE5vdGlmaWNhdGlvbkZyYW1lcyAqCisgICAgICAgICAgICAgICAgbWF4KGtNaW5Ob3RpZmljYXRpb25zLCBtaW5Ob3RpZmljYXRpb25zQnlNcyk7CisgICAgICAgIGZyYW1lQ291bnQgPSBtYXgoZnJhbWVDb3VudCwgbWluRnJhbWVDb3VudCk7CisgICAgICAgIGlmICgqbm90aWZpY2F0aW9uRnJhbWVzID09IDAgfHwgKm5vdGlmaWNhdGlvbkZyYW1lcyA+IG1heE5vdGlmaWNhdGlvbkZyYW1lcykgeworICAgICAgICAgICAgKm5vdGlmaWNhdGlvbkZyYW1lcyA9IG1heE5vdGlmaWNhdGlvbkZyYW1lczsKKyAgICAgICAgfQorICAgIH0KKyAgICAqcEZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworCiAgICAgbFN0YXR1cyA9IGluaXRDaGVjaygpOwogICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIEFMT0dFKCJjcmVhdGVSZWNvcmRUcmFja19sKCkgYXVkaW8gZHJpdmVyIG5vdCBpbml0aWFsaXplZCIpOwogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQotICAgIC8vIGNsaWVudCBleHByZXNzZXMgYSBwcmVmZXJlbmNlIGZvciBGQVNULCBidXQgd2UgZ2V0IHRoZSBmaW5hbCBzYXkKLSAgICBpZiAoKmZsYWdzICYgSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfRkFTVCkgewotICAgICAgaWYgKAotICAgICAgICAgICAgLy8gdXNlIGNhc2U6IGNhbGxiYWNrIGhhbmRsZXIgYW5kIGZyYW1lIGNvdW50IGlzIGRlZmF1bHQgb3IgYXQgbGVhc3QgYXMgbGFyZ2UgYXMgSEFMCi0gICAgICAgICAgICAoCi0gICAgICAgICAgICAgICAgKHRpZCAhPSAtMSkgJiYKLSAgICAgICAgICAgICAgICAoKGZyYW1lQ291bnQgPT0gMCkgfHwKLSAgICAgICAgICAgICAgICAoZnJhbWVDb3VudCA+PSBtRnJhbWVDb3VudCkpCi0gICAgICAgICAgICApICYmCi0gICAgICAgICAgICAvLyBGSVhNRSB3aGVuIHJlY29yZCBzdXBwb3J0cyBub24tUENNIGRhdGEsIGFsc28gY2hlY2sgZm9yIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KQotICAgICAgICAgICAgLy8gbW9ubyBvciBzdGVyZW8KLSAgICAgICAgICAgICggKGNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfT1VUX01PTk8pIHx8Ci0gICAgICAgICAgICAgIChjaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pICkgJiYKLSAgICAgICAgICAgIC8vIGhhcmR3YXJlIHNhbXBsZSByYXRlCi0gICAgICAgICAgICAoc2FtcGxlUmF0ZSA9PSBtU2FtcGxlUmF0ZSkgJiYKLSAgICAgICAgICAgIC8vIHJlY29yZCB0aHJlYWQgaGFzIGFuIGFzc29jaWF0ZWQgZmFzdCByZWNvcmRlcgotICAgICAgICAgICAgaGFzRmFzdFJlY29yZGVyKCkKLSAgICAgICAgICAgIC8vIEZJWE1FIHRlc3QgdGhhdCBSZWNvcmRUaHJlYWQgZm9yIHRoaXMgZmFzdCB0cmFjayBoYXMgYSBjYXBhYmxlIG91dHB1dCBIQUwKLSAgICAgICAgICAgIC8vIEZJWE1FIGFkZCBhIHBlcm1pc3Npb24gdGVzdCBhbHNvPwotICAgICAgICApIHsKLSAgICAgICAgLy8gaWYgZnJhbWVDb3VudCBub3Qgc3BlY2lmaWVkLCB0aGVuIGl0IGRlZmF1bHRzIHRvIGZhc3QgcmVjb3JkZXIgKEhBTCkgZnJhbWUgY291bnQKLSAgICAgICAgaWYgKGZyYW1lQ291bnQgPT0gMCkgewotICAgICAgICAgICAgZnJhbWVDb3VudCA9IG1GcmFtZUNvdW50ICoga0Zhc3RUcmFja011bHRpcGxpZXI7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoIkFVRElPX0lOUFVUX0ZMQUdfRkFTVCBhY2NlcHRlZDogZnJhbWVDb3VudD0lZCBtRnJhbWVDb3VudD0lZCIsCi0gICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgbUZyYW1lQ291bnQpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIkFVRElPX0lOUFVUX0ZMQUdfRkFTVCBkZW5pZWQ6IGZyYW1lQ291bnQ9JWQgIgotICAgICAgICAgICAgICAgICJtRnJhbWVDb3VudD0lZCBmb3JtYXQ9JWQgaXNMaW5lYXI9JWQgY2hhbm5lbE1hc2s9JSN4IHNhbXBsZVJhdGU9JXUgbVNhbXBsZVJhdGU9JXUgIgotICAgICAgICAgICAgICAgICJoYXNGYXN0UmVjb3JkZXI9JWQgdGlkPSVkIiwKLSAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBtRnJhbWVDb3VudCwgZm9ybWF0LAotICAgICAgICAgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSwKLSAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgc2FtcGxlUmF0ZSwgbVNhbXBsZVJhdGUsIGhhc0Zhc3RSZWNvcmRlcigpLCB0aWQpOwotICAgICAgICAqZmxhZ3MgJj0gfklBdWRpb0ZsaW5nZXI6OlRSQUNLX0ZBU1Q7Ci0gICAgICAgIC8vIEZvciBjb21wYXRpYmlsaXR5IHdpdGggQXVkaW9SZWNvcmQgY2FsY3VsYXRpb24sIGJ1ZmZlciBkZXB0aCBpcyBmb3JjZWQKLSAgICAgICAgLy8gdG8gYmUgYXQgbGVhc3QgMiB4IHRoZSByZWNvcmQgdGhyZWFkIGZyYW1lIGNvdW50IGFuZCBjb3ZlciBhdWRpbyBoYXJkd2FyZSBsYXRlbmN5LgotICAgICAgICAvLyBUaGlzIGlzIHByb2JhYmx5IHRvbyBjb25zZXJ2YXRpdmUsIGJ1dCBsZWdhY3kgYXBwbGljYXRpb24gY29kZSBtYXkgZGVwZW5kIG9uIGl0LgotICAgICAgICAvLyBJZiB5b3UgY2hhbmdlIHRoaXMgY2FsY3VsYXRpb24sIGFsc28gcmV2aWV3IHRoZSBzdGFydCB0aHJlc2hvbGQgd2hpY2ggaXMgcmVsYXRlZC4KLSAgICAgICAgdWludDMyX3QgbGF0ZW5jeU1zID0gNTA7IC8vIEZJWE1FIG1JbnB1dC0+c3RyZWFtLT5nZXRfbGF0ZW5jeShtSW5wdXQtPnN0cmVhbSk7Ci0gICAgICAgIHNpemVfdCBtTm9ybWFsRnJhbWVDb3VudCA9IDIwNDg7IC8vIEZJWE1FCi0gICAgICAgIHVpbnQzMl90IG1pbkJ1ZkNvdW50ID0gbGF0ZW5jeU1zIC8gKCgxMDAwICogbU5vcm1hbEZyYW1lQ291bnQpIC8gbVNhbXBsZVJhdGUpOwotICAgICAgICBpZiAobWluQnVmQ291bnQgPCAyKSB7Ci0gICAgICAgICAgICBtaW5CdWZDb3VudCA9IDI7Ci0gICAgICAgIH0KLSAgICAgICAgc2l6ZV90IG1pbkZyYW1lQ291bnQgPSBtTm9ybWFsRnJhbWVDb3VudCAqIG1pbkJ1ZkNvdW50OwotICAgICAgICBpZiAoZnJhbWVDb3VudCA8IG1pbkZyYW1lQ291bnQpIHsKLSAgICAgICAgICAgIGZyYW1lQ291bnQgPSBtaW5GcmFtZUNvdW50OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gRklYTUUgdXNlIGZsYWdzIGFuZCB0aWQgc2ltaWxhciB0byBjcmVhdGVUcmFja19sKCkKIAogICAgIHsgLy8gc2NvcGUgZm9yIG1Mb2NrCiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAKICAgICAgICAgdHJhY2sgPSBuZXcgUmVjb3JkVHJhY2sodGhpcywgY2xpZW50LCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIHNlc3Npb25JZCwgdWlkKTsKKyAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBOVUxMLCBzZXNzaW9uSWQsIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAqZmxhZ3MsIFRyYWNrQmFzZTo6VFlQRV9ERUZBVUxUKTsKIAotICAgICAgICBpZiAodHJhY2stPmdldENibGsoKSA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiY3JlYXRlUmVjb3JkVHJhY2tfbCgpIG5vIGNvbnRyb2wgYmxvY2siKTsKLSAgICAgICAgICAgIGxTdGF0dXMgPSBOT19NRU1PUlk7CisgICAgICAgIGxTdGF0dXMgPSB0cmFjay0+aW5pdENoZWNrKCk7CisgICAgICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgiY3JlYXRlUmVjb3JkVHJhY2tfbCgpIGluaXRDaGVjayBmYWlsZWQgJWQ7IG5vIGNvbnRyb2wgYmxvY2s/IiwgbFN0YXR1cyk7CiAgICAgICAgICAgICAvLyB0cmFjayBtdXN0IGJlIGNsZWFyZWQgZnJvbSB0aGUgY2FsbGVyIGFzIHRoZSBjYWxsZXIgaGFzIHRoZSBBRiBsb2NrCiAgICAgICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICAgIH0KQEAgLTQ3NjMsMTIgKzU2NDMsMTEgQEAKICAgICAgICAgICAgIHNlbmRQcmlvQ29uZmlnRXZlbnRfbChjYWxsaW5nUGlkLCB0aWQsIGtQcmlvcml0eUF1ZGlvQXBwKTsKICAgICAgICAgfQogICAgIH0KKwogICAgIGxTdGF0dXMgPSBOT19FUlJPUjsKIAogRXhpdDoKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgICpzdGF0dXMgPSBsU3RhdHVzOwotICAgIH0KKyAgICAqc3RhdHVzID0gbFN0YXR1czsKICAgICByZXR1cm4gdHJhY2s7CiB9CiAKQEAgLTQ3ODEsODIgKzU2NjAsODYgQEAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKIAogICAgIGlmIChldmVudCA9PSBBdWRpb1N5c3RlbTo6U1lOQ19FVkVOVF9OT05FKSB7Ci0gICAgICAgIGNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKKyAgICAgICAgcmVjb3JkVHJhY2stPmNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKICAgICB9IGVsc2UgaWYgKGV2ZW50ICE9IEF1ZGlvU3lzdGVtOjpTWU5DX0VWRU5UX1NBTUUpIHsKLSAgICAgICAgbVN5bmNTdGFydEV2ZW50ID0gbUF1ZGlvRmxpbmdlci0+Y3JlYXRlU3luY0V2ZW50KGV2ZW50LAorICAgICAgICByZWNvcmRUcmFjay0+bVN5bmNTdGFydEV2ZW50ID0gbUF1ZGlvRmxpbmdlci0+Y3JlYXRlU3luY0V2ZW50KGV2ZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlclNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRUcmFjay0+c2Vzc2lvbklkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jU3RhcnRFdmVudENhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRUcmFjayk7CiAgICAgICAgIC8vIFN5bmMgZXZlbnQgY2FuIGJlIGNhbmNlbGxlZCBieSB0aGUgdHJpZ2dlciBzZXNzaW9uIGlmIHRoZSB0cmFjayBpcyBub3QgaW4gYQogICAgICAgICAvLyBjb21wYXRpYmxlIHN0YXRlIGluIHdoaWNoIGNhc2Ugd2Ugc3RhcnQgcmVjb3JkIGltbWVkaWF0ZWx5Ci0gICAgICAgIGlmIChtU3luY1N0YXJ0RXZlbnQtPmlzQ2FuY2VsbGVkKCkpIHsKLSAgICAgICAgICAgIGNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKKyAgICAgICAgaWYgKHJlY29yZFRyYWNrLT5tU3luY1N0YXJ0RXZlbnQtPmlzQ2FuY2VsbGVkKCkpIHsKKyAgICAgICAgICAgIHJlY29yZFRyYWNrLT5jbGVhclN5bmNTdGFydEV2ZW50KCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBkbyBub3Qgd2FpdCBmb3IgdGhlIGV2ZW50IGZvciBtb3JlIHRoYW4gQXVkaW9TeXN0ZW06OmtTeW5jUmVjb3JkU3RhcnRUaW1lT3V0TXMKLSAgICAgICAgICAgIG1GcmFtZXN0b0Ryb3AgPSAtICgoQXVkaW9TeXN0ZW06OmtTeW5jUmVjb3JkU3RhcnRUaW1lT3V0TXMgKiBtUmVxU2FtcGxlUmF0ZSkgLyAxMDAwKTsKKyAgICAgICAgICAgIHJlY29yZFRyYWNrLT5tRnJhbWVzVG9Ecm9wID0gLQorICAgICAgICAgICAgICAgICAgICAoKEF1ZGlvU3lzdGVtOjprU3luY1JlY29yZFN0YXJ0VGltZU91dE1zICogcmVjb3JkVHJhY2stPm1TYW1wbGVSYXRlKSAvIDEwMDApOwogICAgICAgICB9CiAgICAgfQogCiAgICAgeworICAgICAgICAvLyBUaGlzIHNlY3Rpb24gaXMgYSByZW5kZXp2b3VzIGJldHdlZW4gYmluZGVyIHRocmVhZCBleGVjdXRpbmcgc3RhcnQoKSBhbmQgUmVjb3JkVGhyZWFkCiAgICAgICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICAgICAgaWYgKG1BY3RpdmVUcmFjayAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAocmVjb3JkVHJhY2sgIT0gbUFjdGl2ZVRyYWNrLmdldCgpKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gLUVCVVNZOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtQWN0aXZlVHJhY2stPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OlBBVVNJTkcpIHsKLSAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6QUNUSVZFOworICAgICAgICBpZiAobUFjdGl2ZVRyYWNrcy5pbmRleE9mKHJlY29yZFRyYWNrKSA+PSAwKSB7CisgICAgICAgICAgICBpZiAocmVjb3JkVHJhY2stPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OlBBVVNJTkcpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiYWN0aXZlIHJlY29yZCB0cmFjayBQQVVTSU5HIC0+IEFDVElWRSIpOworICAgICAgICAgICAgICAgIHJlY29yZFRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OkFDVElWRTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImFjdGl2ZSByZWNvcmQgdHJhY2sgc3RhdGUgJWQiLCByZWNvcmRUcmFjay0+bVN0YXRlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgIH0KIAotICAgICAgICByZWNvcmRUcmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpJRExFOwotICAgICAgICBtQWN0aXZlVHJhY2sgPSByZWNvcmRUcmFjazsKLSAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzdGFydElucHV0KG1JZCk7Ci0gICAgICAgIG1Mb2NrLmxvY2soKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgbUFjdGl2ZVRyYWNrLmNsZWFyKCk7Ci0gICAgICAgICAgICBjbGVhclN5bmNTdGFydEV2ZW50KCk7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAvLyBUT0RPIGNvbnNpZGVyIG90aGVyIHdheXMgb2YgaGFuZGxpbmcgdGhpcywgc3VjaCBhcyBjaGFuZ2luZyB0aGUgc3RhdGUgdG8gOlNUQVJUSU5HIGFuZAorICAgICAgICAvLyAgICAgIGFkZGluZyB0aGUgdHJhY2sgdG8gbUFjdGl2ZVRyYWNrcyBhZnRlciByZXR1cm5pbmcgZnJvbSBBdWRpb1N5c3RlbTo6c3RhcnRJbnB1dCgpLAorICAgICAgICAvLyAgICAgIG9yIHVzaW5nIGEgc2VwYXJhdGUgY29tbWFuZCB0aHJlYWQKKyAgICAgICAgcmVjb3JkVHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6U1RBUlRJTkdfMTsKKyAgICAgICAgbUFjdGl2ZVRyYWNrcy5hZGQocmVjb3JkVHJhY2spOworICAgICAgICBtQWN0aXZlVHJhY2tzR2VuKys7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgICAgICBpZiAocmVjb3JkVHJhY2stPmlzRXh0ZXJuYWxUcmFjaygpKSB7CisgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzdGFydElucHV0KG1JZCwgKGF1ZGlvX3Nlc3Npb25fdClyZWNvcmRUcmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICAgICAgLy8gRklYTUUgc2hvdWxkIHZlcmlmeSB0aGF0IHJlY29yZFRyYWNrIGlzIHN0aWxsIGluIG1BY3RpdmVUcmFja3MKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2tzLnJlbW92ZShyZWNvcmRUcmFjayk7CisgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrc0dlbisrOworICAgICAgICAgICAgICAgIHJlY29yZFRyYWNrLT5jbGVhclN5bmNTdGFydEV2ZW50KCk7CisgICAgICAgICAgICAgICAgQUxPR1YoIlJlY29yZFRocmVhZDo6c3RhcnQgZXJyb3IgJWQiLCBzdGF0dXMpOworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgbVJzbXBJbkluZGV4ID0gbUZyYW1lQ291bnQ7Ci0gICAgICAgIG1CeXRlc1JlYWQgPSAwOwotICAgICAgICBpZiAobVJlc2FtcGxlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtUmVzYW1wbGVyLT5yZXNldCgpOworICAgICAgICAvLyBDYXRjaCB1cCB3aXRoIGN1cnJlbnQgYnVmZmVyIGluZGljZXMgaWYgdGhyZWFkIGlzIGFscmVhZHkgcnVubmluZy4KKyAgICAgICAgLy8gVGhpcyBpcyB3aGF0IG1ha2VzIGEgbmV3IGNsaWVudCBkaXNjYXJkIGFsbCBidWZmZXJlZCBkYXRhLiAgSWYgdGhlIHRyYWNrJ3MgbVJzbXBJbkZyb250CisgICAgICAgIC8vIHdhcyBpbml0aWFsaXplZCB0byBzb21lIHZhbHVlIGNsb3NlciB0byB0aGUgdGhyZWFkJ3MgbVJzbXBJbkZyb250LCB0aGVuIHRoZSB0cmFjayBjb3VsZAorICAgICAgICAvLyBzZWUgcHJldmlvdXNseSBidWZmZXJlZCBkYXRhIGJlZm9yZSBpdCBjYWxsZWQgc3RhcnQoKSwgYnV0IHdpdGggZ3JlYXRlciByaXNrIG9mIG92ZXJydW4uCisKKyAgICAgICAgcmVjb3JkVHJhY2stPm1Sc21wSW5Gcm9udCA9IG1Sc21wSW5SZWFyOworICAgICAgICByZWNvcmRUcmFjay0+bVJzbXBJblVucmVsID0gMDsKKyAgICAgICAgLy8gRklYTUUgd2h5IHJlc2V0PworICAgICAgICBpZiAocmVjb3JkVHJhY2stPm1SZXNhbXBsZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgcmVjb3JkVHJhY2stPm1SZXNhbXBsZXItPnJlc2V0KCk7CiAgICAgICAgIH0KLSAgICAgICAgbUFjdGl2ZVRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OlJFU1VNSU5HOworICAgICAgICByZWNvcmRUcmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpTVEFSVElOR18yOwogICAgICAgICAvLyBzaWduYWwgdGhyZWFkIHRvIHN0YXJ0Ci0gICAgICAgIEFMT0dWKCJTaWduYWwgcmVjb3JkIHRocmVhZCIpOwogICAgICAgICBtV2FpdFdvcmtDVi5icm9hZGNhc3QoKTsKLSAgICAgICAgLy8gZG8gbm90IHdhaXQgZm9yIG1TdGFydFN0b3BDb25kIGlmIGV4aXRpbmcKLSAgICAgICAgaWYgKGV4aXRQZW5kaW5nKCkpIHsKLSAgICAgICAgICAgIG1BY3RpdmVUcmFjay5jbGVhcigpOwotICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICBnb3RvIHN0YXJ0RXJyb3I7Ci0gICAgICAgIH0KLSAgICAgICAgbVN0YXJ0U3RvcENvbmQud2FpdChtTG9jayk7Ci0gICAgICAgIGlmIChtQWN0aXZlVHJhY2sgPT0gMCkgeworICAgICAgICBpZiAobUFjdGl2ZVRyYWNrcy5pbmRleE9mKHJlY29yZFRyYWNrKSA8IDApIHsKICAgICAgICAgICAgIEFMT0dWKCJSZWNvcmQgZmFpbGVkIHRvIHN0YXJ0Iik7CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICBnb3RvIHN0YXJ0RXJyb3I7CiAgICAgICAgIH0KLSAgICAgICAgQUxPR1YoIlJlY29yZCBzdGFydGVkIE9LIik7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCiBzdGFydEVycm9yOgotICAgIEF1ZGlvU3lzdGVtOjpzdG9wSW5wdXQobUlkKTsKLSAgICBjbGVhclN5bmNTdGFydEV2ZW50KCk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6Y2xlYXJTeW5jU3RhcnRFdmVudCgpCi17Ci0gICAgaWYgKG1TeW5jU3RhcnRFdmVudCAhPSAwKSB7Ci0gICAgICAgIG1TeW5jU3RhcnRFdmVudC0+Y2FuY2VsKCk7CisgICAgaWYgKHJlY29yZFRyYWNrLT5pc0V4dGVybmFsVHJhY2soKSkgeworICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcElucHV0KG1JZCwgKGF1ZGlvX3Nlc3Npb25fdClyZWNvcmRUcmFjay0+c2Vzc2lvbklkKCkpOwogICAgIH0KLSAgICBtU3luY1N0YXJ0RXZlbnQuY2xlYXIoKTsKLSAgICBtRnJhbWVzdG9Ecm9wID0gMDsKKyAgICByZWNvcmRUcmFjay0+Y2xlYXJTeW5jU3RhcnRFdmVudCgpOworICAgIC8vIEZJWE1FIEkgd29uZGVyIHdoeSB3ZSBkbyBub3QgcmVzZXQgdGhlIHN0YXRlIGhlcmU/CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6c3luY1N0YXJ0RXZlbnRDYWxsYmFjayhjb25zdCB3cDxTeW5jRXZlbnQ+JiBldmVudCkKQEAgLTQ4NjQsNDYgKzU3NDcsNDIgQEAKICAgICBzcDxTeW5jRXZlbnQ+IHN0cm9uZ0V2ZW50ID0gZXZlbnQucHJvbW90ZSgpOwogCiAgICAgaWYgKHN0cm9uZ0V2ZW50ICE9IDApIHsKLSAgICAgICAgUmVjb3JkVGhyZWFkICptZSA9IChSZWNvcmRUaHJlYWQgKilzdHJvbmdFdmVudC0+Y29va2llKCk7Ci0gICAgICAgIG1lLT5oYW5kbGVTeW5jU3RhcnRFdmVudChzdHJvbmdFdmVudCk7Ci0gICAgfQotfQotCi12b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpoYW5kbGVTeW5jU3RhcnRFdmVudChjb25zdCBzcDxTeW5jRXZlbnQ+JiBldmVudCkKLXsKLSAgICBpZiAoZXZlbnQgPT0gbVN5bmNTdGFydEV2ZW50KSB7Ci0gICAgICAgIC8vIFRPRE86IHVzZSBhY3R1YWwgYnVmZmVyIGZpbGxpbmcgc3RhdHVzIGluc3RlYWQgb2YgMiBidWZmZXJzIHdoZW4gaW5mbyBpcyBhdmFpbGFibGUKLSAgICAgICAgLy8gZnJvbSBhdWRpbyBIQUwKLSAgICAgICAgbUZyYW1lc3RvRHJvcCA9IG1GcmFtZUNvdW50ICogMjsKKyAgICAgICAgc3A8UmVmQmFzZT4gcHRyID0gc3Ryb25nRXZlbnQtPmNvb2tpZSgpLnByb21vdGUoKTsKKyAgICAgICAgaWYgKHB0ciAhPSAwKSB7CisgICAgICAgICAgICBSZWNvcmRUcmFjayAqcmVjb3JkVHJhY2sgPSAoUmVjb3JkVHJhY2sgKilwdHIuZ2V0KCk7CisgICAgICAgICAgICByZWNvcmRUcmFjay0+aGFuZGxlU3luY1N0YXJ0RXZlbnQoc3Ryb25nRXZlbnQpOworICAgICAgICB9CiAgICAgfQogfQogCiBib29sIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpzdG9wKFJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2sqIHJlY29yZFRyYWNrKSB7CiAgICAgQUxPR1YoIlJlY29yZFRocmVhZDo6c3RvcCIpOwogICAgIEF1dG9NdXRleCBfbChtTG9jayk7Ci0gICAgaWYgKHJlY29yZFRyYWNrICE9IG1BY3RpdmVUcmFjay5nZXQoKSB8fCByZWNvcmRUcmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6UEFVU0lORykgeworICAgIGlmIChtQWN0aXZlVHJhY2tzLmluZGV4T2YocmVjb3JkVHJhY2spICE9IDAgfHwgcmVjb3JkVHJhY2stPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OlBBVVNJTkcpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KKyAgICAvLyBub3RlIHRoYXQgdGhyZWFkTG9vcCBtYXkgc3RpbGwgYmUgcHJvY2Vzc2luZyB0aGUgdHJhY2sgYXQgdGhpcyBwb2ludCBbd2l0aG91dCBsb2NrXQogICAgIHJlY29yZFRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OlBBVVNJTkc7CiAgICAgLy8gZG8gbm90IHdhaXQgZm9yIG1TdGFydFN0b3BDb25kIGlmIGV4aXRpbmcKICAgICBpZiAoZXhpdFBlbmRpbmcoKSkgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CisgICAgLy8gRklYTUUgaW5jb3JyZWN0IHVzYWdlIG9mIHdhaXQ6IG5vIGV4cGxpY2l0IHByZWRpY2F0ZSBvciBsb29wCiAgICAgbVN0YXJ0U3RvcENvbmQud2FpdChtTG9jayk7Ci0gICAgLy8gaWYgd2UgaGF2ZSBiZWVuIHJlc3RhcnRlZCwgcmVjb3JkVHJhY2sgPT0gbUFjdGl2ZVRyYWNrLmdldCgpIGhlcmUKLSAgICBpZiAoZXhpdFBlbmRpbmcoKSB8fCByZWNvcmRUcmFjayAhPSBtQWN0aXZlVHJhY2suZ2V0KCkpIHsKKyAgICAvLyBpZiB3ZSBoYXZlIGJlZW4gcmVzdGFydGVkLCByZWNvcmRUcmFjayBpcyBpbiBtQWN0aXZlVHJhY2tzIGhlcmUKKyAgICBpZiAoZXhpdFBlbmRpbmcoKSB8fCBtQWN0aXZlVHJhY2tzLmluZGV4T2YocmVjb3JkVHJhY2spICE9IDApIHsKICAgICAgICAgQUxPR1YoIlJlY29yZCBzdG9wcGVkIE9LIik7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLWJvb2wgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmlzVmFsaWRTeW5jRXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQpIGNvbnN0Citib29sIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjppc1ZhbGlkU3luY0V2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50IF9fdW51c2VkKSBjb25zdAogewogICAgIHJldHVybiBmYWxzZTsKIH0KIAotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnNldFN5bmNFdmVudChjb25zdCBzcDxTeW5jRXZlbnQ+JiBldmVudCkKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpzZXRTeW5jRXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQgX191bnVzZWQpCiB7CiAjaWYgMCAgIC8vIFRoaXMgYnJhbmNoIGlzIGN1cnJlbnRseSBkZWFkIGNvZGUsIGJ1dCBpcyBwcmVzZXJ2ZWQgaW4gY2FzZSBpdCB3aWxsIGJlIG5lZWRlZCBpbiBmdXR1cmUKICAgICBpZiAoIWlzVmFsaWRTeW5jRXZlbnQoZXZlbnQpKSB7CkBAIC00OTM0LDcgKzU4MTMsNyBAQAogICAgIHRyYWNrLT50ZXJtaW5hdGUoKTsKICAgICB0cmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpTVE9QUEVEOwogICAgIC8vIGFjdGl2ZSB0cmFja3MgYXJlIHJlbW92ZWQgYnkgdGhyZWFkTG9vcCgpCi0gICAgaWYgKG1BY3RpdmVUcmFjayAhPSB0cmFjaykgeworICAgIGlmIChtQWN0aXZlVHJhY2tzLmluZGV4T2YodHJhY2spIDwgMCkgewogICAgICAgICByZW1vdmVUcmFja19sKHRyYWNrKTsKICAgICB9CiB9CkBAIC00OTQzLDYgKzU4MjIsMTAgQEAKIHsKICAgICBtVHJhY2tzLnJlbW92ZSh0cmFjayk7CiAgICAgLy8gbmVlZCBhbnl0aGluZyByZWxhdGVkIHRvIGVmZmVjdHMgaGVyZT8KKyAgICBpZiAodHJhY2stPmlzRmFzdFRyYWNrKCkpIHsKKyAgICAgICAgQUxPR19BU1NFUlQoIW1GYXN0VHJhY2tBdmFpbCk7CisgICAgICAgIG1GYXN0VHJhY2tBdmFpbCA9IHRydWU7CisgICAgfQogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKQEAgLTQ5NTQsMjE3ICs1ODM3LDIzNiBAQAogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKKyAgICBkcHJpbnRmKGZkLCAiXG5JbnB1dCB0aHJlYWQgJXA6XG4iLCB0aGlzKTsKIAotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuSW5wdXQgdGhyZWFkICVwIGludGVybmFsc1xuIiwgdGhpcyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0gICAgaWYgKG1BY3RpdmVUcmFjayAhPSAwKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkluIGluZGV4OiAlZFxuIiwgbVJzbXBJbkluZGV4KTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJCdWZmZXIgc2l6ZTogJXUgYnl0ZXNcbiIsIG1CdWZmZXJTaXplKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJSZXNhbXBsaW5nOiAlZFxuIiwgKG1SZXNhbXBsZXIgIT0gTlVMTCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIk91dCBjaGFubmVsIGNvdW50OiAldVxuIiwgbVJlcUNoYW5uZWxDb3VudCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiT3V0IHNhbXBsZSByYXRlOiAldVxuIiwgbVJlcVNhbXBsZVJhdGUpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgaWYgKG1BY3RpdmVUcmFja3Muc2l6ZSgpID4gMCkgeworICAgICAgICBkcHJpbnRmKGZkLCAiICBCdWZmZXIgc2l6ZTogJXp1IGJ5dGVzXG4iLCBtQnVmZmVyU2l6ZSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiTm8gYWN0aXZlIHJlY29yZCBjbGllbnRcbiIpOworICAgICAgICBkcHJpbnRmKGZkLCAiICBObyBhY3RpdmUgcmVjb3JkIGNsaWVudHNcbiIpOwogICAgIH0KLQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIGRwcmludGYoZmQsICIgIEZhc3QgY2FwdHVyZSB0aHJlYWQ6ICVzXG4iLCBoYXNGYXN0Q2FwdHVyZSgpID8gInllcyIgOiAibm8iKTsKKyAgICBkcHJpbnRmKGZkLCAiICBGYXN0IHRyYWNrIGF2YWlsYWJsZTogJXNcbiIsIG1GYXN0VHJhY2tBdmFpbCA/ICJ5ZXMiIDogIm5vIik7CiAKICAgICBkdW1wQmFzZShmZCwgYXJncyk7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmR1bXBUcmFja3MoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6ZHVtcFRyYWNrcyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCiB7CiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CiAgICAgY2hhciBidWZmZXJbU0laRV07CiAgICAgU3RyaW5nOCByZXN1bHQ7CiAKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJJbnB1dCB0aHJlYWQgJXAgdHJhY2tzXG4iLCB0aGlzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgUmVjb3JkVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgc3A8UmVjb3JkVHJhY2s+IHRyYWNrID0gbVRyYWNrc1tpXTsKLSAgICAgICAgaWYgKHRyYWNrICE9IDApIHsKLSAgICAgICAgICAgIHRyYWNrLT5kdW1wKGJ1ZmZlciwgU0laRSk7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc2l6ZV90IG51bXRyYWNrcyA9IG1UcmFja3Muc2l6ZSgpOworICAgIHNpemVfdCBudW1hY3RpdmUgPSBtQWN0aXZlVHJhY2tzLnNpemUoKTsKKyAgICBzaXplX3QgbnVtYWN0aXZlc2VlbiA9IDA7CisgICAgZHByaW50ZihmZCwgIiAgJWQgVHJhY2tzIiwgbnVtdHJhY2tzKTsKKyAgICBpZiAobnVtdHJhY2tzKSB7CisgICAgICAgIGRwcmludGYoZmQsICIgb2Ygd2hpY2ggJWQgYXJlIGFjdGl2ZVxuIiwgbnVtYWN0aXZlKTsKKyAgICAgICAgUmVjb3JkVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW10cmFja3MgOyArK2kpIHsKKyAgICAgICAgICAgIHNwPFJlY29yZFRyYWNrPiB0cmFjayA9IG1UcmFja3NbaV07CisgICAgICAgICAgICBpZiAodHJhY2sgIT0gMCkgeworICAgICAgICAgICAgICAgIGJvb2wgYWN0aXZlID0gbUFjdGl2ZVRyYWNrcy5pbmRleE9mKHRyYWNrKSA+PSAwOworICAgICAgICAgICAgICAgIGlmIChhY3RpdmUpIHsKKyAgICAgICAgICAgICAgICAgICAgbnVtYWN0aXZlc2VlbisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cmFjay0+ZHVtcChidWZmZXIsIFNJWkUsIGFjdGl2ZSk7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHByaW50ZihmZCwgIlxuIik7CiAgICAgfQogCi0gICAgaWYgKG1BY3RpdmVUcmFjayAhPSAwKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuSW5wdXQgdGhyZWFkICVwIGFjdGl2ZSB0cmFja3NcbiIsIHRoaXMpOworICAgIGlmIChudW1hY3RpdmVzZWVuICE9IG51bWFjdGl2ZSkgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgIFRoZSBmb2xsb3dpbmcgdHJhY2tzIGFyZSBpbiB0aGUgYWN0aXZlIGxpc3QgYnV0IgorICAgICAgICAgICAgICAgICIgbm90IGluIHRoZSB0cmFjayBsaXN0XG4iKTsKICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgICAgICBSZWNvcmRUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOwotICAgICAgICBtQWN0aXZlVHJhY2stPmR1bXAoYnVmZmVyLCBTSVpFKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bWFjdGl2ZTsgKytpKSB7CisgICAgICAgICAgICBzcDxSZWNvcmRUcmFjaz4gdHJhY2sgPSBtQWN0aXZlVHJhY2tzW2ldOworICAgICAgICAgICAgaWYgKG1UcmFja3MuaW5kZXhPZih0cmFjaykgPCAwKSB7CisgICAgICAgICAgICAgICAgdHJhY2stPmR1bXAoYnVmZmVyLCBTSVpFLCB0cnVlKTsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAogICAgIH0KICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKIH0KIAogLy8gQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpnZXROZXh0QnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyLCBpbnQ2NF90IHB0cykKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZXNhbXBsZXJCdWZmZXJQcm92aWRlcjo6Z2V0TmV4dEJ1ZmZlcigKKyAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIsIGludDY0X3QgcHRzIF9fdW51c2VkKQogewotICAgIHNpemVfdCBmcmFtZXNSZXEgPSBidWZmZXItPmZyYW1lQ291bnQ7Ci0gICAgc2l6ZV90IGZyYW1lc1JlYWR5ID0gbUZyYW1lQ291bnQgLSBtUnNtcEluSW5kZXg7Ci0gICAgaW50IGNoYW5uZWxDb3VudDsKLQotICAgIGlmIChmcmFtZXNSZWFkeSA9PSAwKSB7Ci0gICAgICAgIG1CeXRlc1JlYWQgPSBtSW5wdXQtPnN0cmVhbS0+cmVhZChtSW5wdXQtPnN0cmVhbSwgbVJzbXBJbkJ1ZmZlciwgbUJ1ZmZlclNpemUpOwotICAgICAgICBpZiAobUJ5dGVzUmVhZCA8PSAwKSB7Ci0gICAgICAgICAgICBpZiAoKG1CeXRlc1JlYWQgPCAwKSAmJiAobUFjdGl2ZVRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpBQ1RJVkUpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIlJlY29yZFRocmVhZDo6Z2V0TmV4dEJ1ZmZlcigpIEVycm9yIHJlYWRpbmcgYXVkaW8gaW5wdXQiKTsKLSAgICAgICAgICAgICAgICAvLyBGb3JjZSBpbnB1dCBpbnRvIHN0YW5kYnkgc28gdGhhdCBpdCB0cmllcyB0bwotICAgICAgICAgICAgICAgIC8vIHJlY292ZXIgYXQgbmV4dCByZWFkIGF0dGVtcHQKLSAgICAgICAgICAgICAgICBpbnB1dFN0YW5kQnkoKTsKLSAgICAgICAgICAgICAgICB1c2xlZXAoa1JlY29yZFRocmVhZFNsZWVwVXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVmZmVyLT5yYXcgPSBOVUxMOwotICAgICAgICAgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gMDsKLSAgICAgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7Ci0gICAgICAgIH0KLSAgICAgICAgbVJzbXBJbkluZGV4ID0gMDsKLSAgICAgICAgZnJhbWVzUmVhZHkgPSBtRnJhbWVDb3VudDsKKyAgICBSZWNvcmRUcmFjayAqYWN0aXZlVHJhY2sgPSBtUmVjb3JkVHJhY2s7CisgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkQmFzZSA9IGFjdGl2ZVRyYWNrLT5tVGhyZWFkLnByb21vdGUoKTsKKyAgICBpZiAodGhyZWFkQmFzZSA9PSAwKSB7CisgICAgICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IDA7CisgICAgICAgIGJ1ZmZlci0+cmF3ID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKKyAgICB9CisgICAgUmVjb3JkVGhyZWFkICpyZWNvcmRUaHJlYWQgPSAoUmVjb3JkVGhyZWFkICopIHRocmVhZEJhc2UuZ2V0KCk7CisgICAgaW50MzJfdCByZWFyID0gcmVjb3JkVGhyZWFkLT5tUnNtcEluUmVhcjsKKyAgICBpbnQzMl90IGZyb250ID0gYWN0aXZlVHJhY2stPm1Sc21wSW5Gcm9udDsKKyAgICBzc2l6ZV90IGZpbGxlZCA9IHJlYXIgLSBmcm9udDsKKyAgICAvLyBGSVhNRSBzaG91bGQgbm90IGJlIFAyIChkb24ndCB3YW50IHRvIGluY3JlYXNlIGxhdGVuY3kpCisgICAgLy8gRklYTUUgaWYgY2xpZW50IG5vdCBrZWVwaW5nIHVwLCBkaXNjYXJkCisgICAgTE9HX0FMV0FZU19GQVRBTF9JRighKDAgPD0gZmlsbGVkICYmIChzaXplX3QpIGZpbGxlZCA8PSByZWNvcmRUaHJlYWQtPm1Sc21wSW5GcmFtZXMpKTsKKyAgICAvLyAnZmlsbGVkJyBtYXkgYmUgbm9uLWNvbnRpZ3VvdXMsIHNvIHJldHVybiBvbmx5IHRoZSBmaXJzdCBjb250aWd1b3VzIGNodW5rCisgICAgZnJvbnQgJj0gcmVjb3JkVGhyZWFkLT5tUnNtcEluRnJhbWVzUDIgLSAxOworICAgIHNpemVfdCBwYXJ0MSA9IHJlY29yZFRocmVhZC0+bVJzbXBJbkZyYW1lc1AyIC0gZnJvbnQ7CisgICAgaWYgKHBhcnQxID4gKHNpemVfdCkgZmlsbGVkKSB7CisgICAgICAgIHBhcnQxID0gZmlsbGVkOworICAgIH0KKyAgICBzaXplX3QgYXNrID0gYnVmZmVyLT5mcmFtZUNvdW50OworICAgIEFMT0dfQVNTRVJUKGFzayA+IDApOworICAgIGlmIChwYXJ0MSA+IGFzaykgeworICAgICAgICBwYXJ0MSA9IGFzazsKKyAgICB9CisgICAgaWYgKHBhcnQxID09IDApIHsKKyAgICAgICAgLy8gSGlnaGVyLWxldmVsIHNob3VsZCBrZWVwIG1Sc21wSW5CdWZmZXIgZnVsbCwgYW5kIG5vdCBjYWxsIHJlc2FtcGxlciBpZiBlbXB0eQorICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJSZWNvcmRUaHJlYWQ6OmdldE5leHRCdWZmZXIoKSBzdGFydmVkIik7CisgICAgICAgIGJ1ZmZlci0+cmF3ID0gTlVMTDsKKyAgICAgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gMDsKKyAgICAgICAgYWN0aXZlVHJhY2stPm1Sc21wSW5VbnJlbCA9IDA7CisgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CiAgICAgfQogCi0gICAgaWYgKGZyYW1lc1JlcSA+IGZyYW1lc1JlYWR5KSB7Ci0gICAgICAgIGZyYW1lc1JlcSA9IGZyYW1lc1JlYWR5OwotICAgIH0KLQotICAgIGlmIChtQ2hhbm5lbENvdW50ID09IDEgJiYgbVJlcUNoYW5uZWxDb3VudCA9PSAyKSB7Ci0gICAgICAgIGNoYW5uZWxDb3VudCA9IDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgY2hhbm5lbENvdW50ID0gMjsKLSAgICB9Ci0gICAgYnVmZmVyLT5yYXcgPSBtUnNtcEluQnVmZmVyICsgbVJzbXBJbkluZGV4ICogY2hhbm5lbENvdW50OwotICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IGZyYW1lc1JlcTsKKyAgICBidWZmZXItPnJhdyA9IHJlY29yZFRocmVhZC0+bVJzbXBJbkJ1ZmZlciArIGZyb250ICogcmVjb3JkVGhyZWFkLT5tQ2hhbm5lbENvdW50OworICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IHBhcnQxOworICAgIGFjdGl2ZVRyYWNrLT5tUnNtcEluVW5yZWwgPSBwYXJ0MTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIC8vIEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlCi12b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpyZWxlYXNlQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKQordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVzYW1wbGVyQnVmZmVyUHJvdmlkZXI6OnJlbGVhc2VCdWZmZXIoCisgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKQogewotICAgIG1Sc21wSW5JbmRleCArPSBidWZmZXItPmZyYW1lQ291bnQ7CisgICAgUmVjb3JkVHJhY2sgKmFjdGl2ZVRyYWNrID0gbVJlY29yZFRyYWNrOworICAgIHNpemVfdCBzdGVwQ291bnQgPSBidWZmZXItPmZyYW1lQ291bnQ7CisgICAgaWYgKHN0ZXBDb3VudCA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR19BU1NFUlQoc3RlcENvdW50IDw9IGFjdGl2ZVRyYWNrLT5tUnNtcEluVW5yZWwpOworICAgIGFjdGl2ZVRyYWNrLT5tUnNtcEluVW5yZWwgLT0gc3RlcENvdW50OworICAgIGFjdGl2ZVRyYWNrLT5tUnNtcEluRnJvbnQgKz0gc3RlcENvdW50OworICAgIGJ1ZmZlci0+cmF3ID0gTlVMTDsKICAgICBidWZmZXItPmZyYW1lQ291bnQgPSAwOwogfQogCi1ib29sIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpjaGVja0Zvck5ld1BhcmFtZXRlcnNfbCgpCitib29sIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpjaGVja0Zvck5ld1BhcmFtZXRlcl9sKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QmIHN0YXR1cykKIHsKICAgICBib29sIHJlY29uZmlnID0gZmFsc2U7CiAKLSAgICB3aGlsZSAoIW1OZXdQYXJhbWV0ZXJzLmlzRW1wdHkoKSkgewotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICAgICAgU3RyaW5nOCBrZXlWYWx1ZVBhaXIgPSBtTmV3UGFyYW1ldGVyc1swXTsKLSAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihrZXlWYWx1ZVBhaXIpOwotICAgICAgICBpbnQgdmFsdWU7Ci0gICAgICAgIGF1ZGlvX2Zvcm1hdF90IHJlcUZvcm1hdCA9IG1Gb3JtYXQ7Ci0gICAgICAgIHVpbnQzMl90IHJlcVNhbXBsaW5nUmF0ZSA9IG1SZXFTYW1wbGVSYXRlOwotICAgICAgICB1aW50MzJfdCByZXFDaGFubmVsQ291bnQgPSBtUmVxQ2hhbm5lbENvdW50OworICAgIHN0YXR1cyA9IE5PX0VSUk9SOwogCi0gICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U2FtcGxpbmdSYXRlKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXFTYW1wbGluZ1JhdGUgPSB2YWx1ZTsKKyAgICBhdWRpb19mb3JtYXRfdCByZXFGb3JtYXQgPSBtRm9ybWF0OworICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IG1TYW1wbGVSYXRlOworICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9pbl9tYXNrX2Zyb21fY291bnQobUNoYW5uZWxDb3VudCk7CisKKyAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGtleVZhbHVlUGFpcik7CisgICAgaW50IHZhbHVlOworICAgIC8vIFRPRE8gSW52ZXN0aWdhdGUgd2hlbiB0aGlzIGNvZGUgcnVucy4gQ2hlY2sgd2l0aCBhdWRpbyBwb2xpY3kgd2hlbiBhIHNhbXBsZSByYXRlIGFuZAorICAgIC8vICAgICAgY2hhbm5lbCBjb3VudCBjaGFuZ2UgY2FuIGJlIHJlcXVlc3RlZC4gRG8gd2UgbWFuZGF0ZSB0aGUgZmlyc3QgY2xpZW50IGRlZmluZXMgdGhlCisgICAgLy8gICAgICBIQUwgc2FtcGxpbmcgcmF0ZSBhbmQgY2hhbm5lbCBjb3VudCBvciBkbyB3ZSBhbGxvdyBjaGFuZ2VzIG9uIHRoZSBmbHk/CisgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTYW1wbGluZ1JhdGUpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgc2FtcGxpbmdSYXRlID0gdmFsdWU7CisgICAgICAgIHJlY29uZmlnID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlGb3JtYXQpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgaWYgKChhdWRpb19mb3JtYXRfdCkgdmFsdWUgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlcUZvcm1hdCA9IChhdWRpb19mb3JtYXRfdCkgdmFsdWU7CiAgICAgICAgICAgICByZWNvbmZpZyA9IHRydWU7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlGb3JtYXQpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIGlmICgoYXVkaW9fZm9ybWF0X3QpIHZhbHVlICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXFGb3JtYXQgPSAoYXVkaW9fZm9ybWF0X3QpIHZhbHVlOwotICAgICAgICAgICAgICAgIHJlY29uZmlnID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleUNoYW5uZWxzKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXFDaGFubmVsQ291bnQgPSBwb3Bjb3VudCh2YWx1ZSk7CisgICAgfQorICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Q2hhbm5lbHMpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbWFzayA9IChhdWRpb19jaGFubmVsX21hc2tfdCkgdmFsdWU7CisgICAgICAgIGlmIChtYXNrICE9IEFVRElPX0NIQU5ORUxfSU5fTU9OTyAmJiBtYXNrICE9IEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjaGFubmVsTWFzayA9IG1hc2s7CiAgICAgICAgICAgICByZWNvbmZpZyA9IHRydWU7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlGcmFtZUNvdW50KSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAvLyBkbyBub3QgYWNjZXB0IGZyYW1lIGNvdW50IGNoYW5nZXMgaWYgdHJhY2tzIGFyZSBvcGVuIGFzIHRoZSB0cmFjayBidWZmZXIKLSAgICAgICAgICAgIC8vIHNpemUgZGVwZW5kcyBvbiBmcmFtZSBjb3VudCBhbmQgY29ycmVjdCBiZWhhdmlvciB3b3VsZCBub3QgYmUgZ3VhcmFudGVlZAotICAgICAgICAgICAgLy8gaWYgZnJhbWUgY291bnQgaXMgY2hhbmdlZCBhZnRlciB0cmFjayBjcmVhdGlvbgotICAgICAgICAgICAgaWYgKG1BY3RpdmVUcmFjayAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlY29uZmlnID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlGcmFtZUNvdW50KSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CisgICAgICAgIC8vIGRvIG5vdCBhY2NlcHQgZnJhbWUgY291bnQgY2hhbmdlcyBpZiB0cmFja3MgYXJlIG9wZW4gYXMgdGhlIHRyYWNrIGJ1ZmZlcgorICAgICAgICAvLyBzaXplIGRlcGVuZHMgb24gZnJhbWUgY291bnQgYW5kIGNvcnJlY3QgYmVoYXZpb3Igd291bGQgbm90IGJlIGd1YXJhbnRlZWQKKyAgICAgICAgLy8gaWYgZnJhbWUgY291bnQgaXMgY2hhbmdlZCBhZnRlciB0cmFjayBjcmVhdGlvbgorICAgICAgICBpZiAobUFjdGl2ZVRyYWNrcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlY29uZmlnID0gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIC8vIGZvcndhcmQgZGV2aWNlIGNoYW5nZSB0byBlZmZlY3RzIHRoYXQgaGF2ZSByZXF1ZXN0ZWQgdG8gYmUKLSAgICAgICAgICAgIC8vIGF3YXJlIG9mIGF0dGFjaGVkIGF1ZGlvIGRldmljZS4KLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdENoYWlucy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIG1FZmZlY3RDaGFpbnNbaV0tPnNldERldmljZV9sKHZhbHVlKTsKLSAgICAgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CisgICAgICAgIC8vIGZvcndhcmQgZGV2aWNlIGNoYW5nZSB0byBlZmZlY3RzIHRoYXQgaGF2ZSByZXF1ZXN0ZWQgdG8gYmUKKyAgICAgICAgLy8gYXdhcmUgb2YgYXR0YWNoZWQgYXVkaW8gZGV2aWNlLgorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIG1FZmZlY3RDaGFpbnNbaV0tPnNldERldmljZV9sKHZhbHVlKTsKKyAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBzdG9yZSBpbnB1dCBkZXZpY2UgYW5kIG91dHB1dCBkZXZpY2UgYnV0IGRvIG5vdCBmb3J3YXJkIG91dHB1dCBkZXZpY2UgdG8gYXVkaW8gSEFMLgotICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHN0YXR1cyBpcyBpZ25vcmVkIGJ5IHRoZSBjYWxsZXIgZm9yIG91dHB1dCBkZXZpY2UKLSAgICAgICAgICAgIC8vIChzZWUgQXVkaW9GbGluZ2VyOjpzZXRQYXJhbWV0ZXJzKCkKLSAgICAgICAgICAgIGlmIChhdWRpb19pc19vdXRwdXRfZGV2aWNlcyh2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICBtT3V0RGV2aWNlID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtSW5EZXZpY2UgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAvLyBkaXNhYmxlIEFFQyBhbmQgTlMgaWYgdGhlIGRldmljZSBpcyBhIEJUIFNDTyBoZWFkc2V0IHN1cHBvcnRpbmcgdGhvc2UKLSAgICAgICAgICAgICAgICAvLyBwcmUgcHJvY2Vzc2luZ3MKLSAgICAgICAgICAgICAgICBpZiAobVRyYWNrcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2wgc3VzcGVuZCA9IGF1ZGlvX2lzX2JsdWV0b290aF9zY29fZGV2aWNlKG1JbkRldmljZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9GbGluZ2VyLT5idE5yZWNJc09mZigpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwPFJlY29yZFRyYWNrPiB0cmFjayA9IG1UcmFja3NbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRFZmZlY3RTdXNwZW5kZWRfbChGWF9JSURfQUVDLCBzdXNwZW5kLCB0cmFjay0+c2Vzc2lvbklkKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWZmZWN0U3VzcGVuZGVkX2woRlhfSUlEX05TLCBzdXNwZW5kLCB0cmFjay0+c2Vzc2lvbklkKCkpOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgIC8vIHN0b3JlIGlucHV0IGRldmljZSBhbmQgb3V0cHV0IGRldmljZSBidXQgZG8gbm90IGZvcndhcmQgb3V0cHV0IGRldmljZSB0byBhdWRpbyBIQUwuCisgICAgICAgIC8vIE5vdGUgdGhhdCBzdGF0dXMgaXMgaWdub3JlZCBieSB0aGUgY2FsbGVyIGZvciBvdXRwdXQgZGV2aWNlCisgICAgICAgIC8vIChzZWUgQXVkaW9GbGluZ2VyOjpzZXRQYXJhbWV0ZXJzKCkKKyAgICAgICAgaWYgKGF1ZGlvX2lzX291dHB1dF9kZXZpY2VzKHZhbHVlKSkgeworICAgICAgICAgICAgbU91dERldmljZSA9IHZhbHVlOworICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUluRGV2aWNlID0gdmFsdWU7CisgICAgICAgICAgICAvLyBkaXNhYmxlIEFFQyBhbmQgTlMgaWYgdGhlIGRldmljZSBpcyBhIEJUIFNDTyBoZWFkc2V0IHN1cHBvcnRpbmcgdGhvc2UKKyAgICAgICAgICAgIC8vIHByZSBwcm9jZXNzaW5ncworICAgICAgICAgICAgaWYgKG1UcmFja3Muc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIGJvb2wgc3VzcGVuZCA9IGF1ZGlvX2lzX2JsdWV0b290aF9zY29fZGV2aWNlKG1JbkRldmljZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0ZsaW5nZXItPmJ0TnJlY0lzT2ZmKCk7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHNwPFJlY29yZFRyYWNrPiB0cmFjayA9IG1UcmFja3NbaV07CisgICAgICAgICAgICAgICAgICAgIHNldEVmZmVjdFN1c3BlbmRlZF9sKEZYX0lJRF9BRUMsIHN1c3BlbmQsIHRyYWNrLT5zZXNzaW9uSWQoKSk7CisgICAgICAgICAgICAgICAgICAgIHNldEVmZmVjdFN1c3BlbmRlZF9sKEZYX0lJRF9OUywgc3VzcGVuZCwgdHJhY2stPnNlc3Npb25JZCgpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlJbnB1dFNvdXJjZSksIHZhbHVlKSA9PSBOT19FUlJPUiAmJgotICAgICAgICAgICAgICAgIG1BdWRpb1NvdXJjZSAhPSAoYXVkaW9fc291cmNlX3QpdmFsdWUpIHsKLSAgICAgICAgICAgIC8vIGZvcndhcmQgZGV2aWNlIGNoYW5nZSB0byBlZmZlY3RzIHRoYXQgaGF2ZSByZXF1ZXN0ZWQgdG8gYmUKLSAgICAgICAgICAgIC8vIGF3YXJlIG9mIGF0dGFjaGVkIGF1ZGlvIGRldmljZS4KLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdENoYWlucy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIG1FZmZlY3RDaGFpbnNbaV0tPnNldEF1ZGlvU291cmNlX2woKGF1ZGlvX3NvdXJjZV90KXZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1BdWRpb1NvdXJjZSA9IChhdWRpb19zb3VyY2VfdCl2YWx1ZTsKKyAgICB9CisgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlJbnB1dFNvdXJjZSksIHZhbHVlKSA9PSBOT19FUlJPUiAmJgorICAgICAgICAgICAgbUF1ZGlvU291cmNlICE9IChhdWRpb19zb3VyY2VfdCl2YWx1ZSkgeworICAgICAgICAvLyBmb3J3YXJkIGRldmljZSBjaGFuZ2UgdG8gZWZmZWN0cyB0aGF0IGhhdmUgcmVxdWVzdGVkIHRvIGJlCisgICAgICAgIC8vIGF3YXJlIG9mIGF0dGFjaGVkIGF1ZGlvIGRldmljZS4KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0Q2hhaW5zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBtRWZmZWN0Q2hhaW5zW2ldLT5zZXRBdWRpb1NvdXJjZV9sKChhdWRpb19zb3VyY2VfdCl2YWx1ZSk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBtQXVkaW9Tb3VyY2UgPSAoYXVkaW9fc291cmNlX3QpdmFsdWU7CisgICAgfQorCisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBzdGF0dXMgPSBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLnNldF9wYXJhbWV0ZXJzKCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLAorICAgICAgICAgICAgICAgIGtleVZhbHVlUGFpci5zdHJpbmcoKSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gSU5WQUxJRF9PUEVSQVRJT04pIHsKKyAgICAgICAgICAgIGlucHV0U3RhbmRCeSgpOwogICAgICAgICAgICAgc3RhdHVzID0gbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5zZXRfcGFyYW1ldGVycygmbUlucHV0LT5zdHJlYW0tPmNvbW1vbiwKICAgICAgICAgICAgICAgICAgICAga2V5VmFsdWVQYWlyLnN0cmluZygpKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gSU5WQUxJRF9PUEVSQVRJT04pIHsKLSAgICAgICAgICAgICAgICBpbnB1dFN0YW5kQnkoKTsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLnNldF9wYXJhbWV0ZXJzKCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLAotICAgICAgICAgICAgICAgICAgICAgICAga2V5VmFsdWVQYWlyLnN0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVjb25maWcpIHsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQkFEX1ZBTFVFICYmCisgICAgICAgICAgICAgICAgcmVxRm9ybWF0ID09IG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2Zvcm1hdCgmbUlucHV0LT5zdHJlYW0tPmNvbW1vbikgJiYKKyAgICAgICAgICAgICAgICByZXFGb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgJiYKKyAgICAgICAgICAgICAgICAobUlucHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfc2FtcGxlX3JhdGUoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pCisgICAgICAgICAgICAgICAgICAgICAgICA8PSAoMiAqIHNhbXBsaW5nUmF0ZSkpICYmCisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soCisgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9jaGFubmVscygmbUlucHV0LT5zdHJlYW0tPmNvbW1vbikpIDw9IEZDQ18yICYmCisgICAgICAgICAgICAgICAgKGNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfSU5fTU9OTyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8pKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gTk9fRVJST1I7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmVjb25maWcpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IEJBRF9WQUxVRSAmJgotICAgICAgICAgICAgICAgICAgICByZXFGb3JtYXQgPT0gbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfZm9ybWF0KCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKSAmJgotICAgICAgICAgICAgICAgICAgICByZXFGb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgJiYKLSAgICAgICAgICAgICAgICAgICAgKG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X3NhbXBsZV9yYXRlKCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw9ICgyICogcmVxU2FtcGxpbmdSYXRlKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgcG9wY291bnQobUlucHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfY2hhbm5lbHMoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw9IEZDQ18yICYmCi0gICAgICAgICAgICAgICAgICAgIChyZXFDaGFubmVsQ291bnQgPD0gRkNDXzIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IE5PX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlYWRJbnB1dFBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgc2VuZElvQ29uZmlnRXZlbnRfbChBdWRpb1N5c3RlbTo6SU5QVVRfQ09ORklHX0NIQU5HRUQpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZWFkSW5wdXRQYXJhbWV0ZXJzX2woKTsKKyAgICAgICAgICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKEF1ZGlvU3lzdGVtOjpJTlBVVF9DT05GSUdfQ0hBTkdFRCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQotICAgICAgICBtTmV3UGFyYW1ldGVycy5yZW1vdmVBdCgwKTsKLQotICAgICAgICBtUGFyYW1TdGF0dXMgPSBzdGF0dXM7Ci0gICAgICAgIG1QYXJhbUNvbmQuc2lnbmFsKCk7Ci0gICAgICAgIC8vIHdhaXQgZm9yIGNvbmRpdGlvbiB3aXRoIHRpbWUgb3V0IGluIGNhc2UgdGhlIHRocmVhZCBjYWxsaW5nIFRocmVhZEJhc2U6OnNldFBhcmFtZXRlcnMoKQotICAgICAgICAvLyBhbHJlYWR5IHRpbWVkIG91dCB3YWl0aW5nIGZvciB0aGUgc3RhdHVzIGFuZCB3aWxsIG5ldmVyIHNpZ25hbCB0aGUgY29uZGl0aW9uLgotICAgICAgICBtV2FpdFdvcmtDVi53YWl0UmVsYXRpdmUobUxvY2ssIGtTZXRQYXJhbWV0ZXJzVGltZW91dE5zKTsKICAgICB9CisKICAgICByZXR1cm4gcmVjb25maWc7CiB9CiAKQEAgLTUxODEsOSArNjA4Myw5IEBACiAgICAgcmV0dXJuIG91dF9zODsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6YXVkaW9Db25maWdDaGFuZ2VkX2woaW50IGV2ZW50LCBpbnQgcGFyYW0pIHsKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmF1ZGlvQ29uZmlnQ2hhbmdlZChpbnQgZXZlbnQsIGludCBwYXJhbSBfX3VudXNlZCkgewogICAgIEF1ZGlvU3lzdGVtOjpPdXRwdXREZXNjcmlwdG9yIGRlc2M7Ci0gICAgdm9pZCAqcGFyYW0yID0gTlVMTDsKKyAgICBjb25zdCB2b2lkICpwYXJhbTIgPSBOVUxMOwogCiAgICAgc3dpdGNoIChldmVudCkgewogICAgIGNhc2UgQXVkaW9TeXN0ZW06OklOUFVUX09QRU5FRDoKQEAgLTUyMDAsNTcgKzYxMDIsNDkgQEAKICAgICBkZWZhdWx0OgogICAgICAgICBicmVhazsKICAgICB9Ci0gICAgbUF1ZGlvRmxpbmdlci0+YXVkaW9Db25maWdDaGFuZ2VkX2woZXZlbnQsIG1JZCwgcGFyYW0yKTsKKyAgICBtQXVkaW9GbGluZ2VyLT5hdWRpb0NvbmZpZ0NoYW5nZWQoZXZlbnQsIG1JZCwgcGFyYW0yKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6cmVhZElucHV0UGFyYW1ldGVycygpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpyZWFkSW5wdXRQYXJhbWV0ZXJzX2woKQogewotICAgIGRlbGV0ZVtdIG1Sc21wSW5CdWZmZXI7Ci0gICAgLy8gbVJzbXBJbkJ1ZmZlciBpcyBhbHdheXMgYXNzaWduZWQgYSBuZXdbXSBiZWxvdwotICAgIGRlbGV0ZVtdIG1Sc21wT3V0QnVmZmVyOwotICAgIG1Sc21wT3V0QnVmZmVyID0gTlVMTDsKLSAgICBkZWxldGUgbVJlc2FtcGxlcjsKLSAgICBtUmVzYW1wbGVyID0gTlVMTDsKLQogICAgIG1TYW1wbGVSYXRlID0gbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfc2FtcGxlX3JhdGUoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pOwogICAgIG1DaGFubmVsTWFzayA9IG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2NoYW5uZWxzKCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKTsKLSAgICBtQ2hhbm5lbENvdW50ID0gcG9wY291bnQobUNoYW5uZWxNYXNrKTsKLSAgICBtRm9ybWF0ID0gbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfZm9ybWF0KCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKTsKKyAgICBtQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2sobUNoYW5uZWxNYXNrKTsKKyAgICBtSEFMRm9ybWF0ID0gbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfZm9ybWF0KCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKTsKKyAgICBtRm9ybWF0ID0gbUhBTEZvcm1hdDsKICAgICBpZiAobUZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgewotICAgICAgICBBTE9HRSgiSEFMIGZvcm1hdCAlZCBub3Qgc3VwcG9ydGVkOyBtdXN0IGJlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIiwgbUZvcm1hdCk7CisgICAgICAgIEFMT0dFKCJIQUwgZm9ybWF0ICUjeCBub3Qgc3VwcG9ydGVkOyBtdXN0IGJlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIiwgbUZvcm1hdCk7CiAgICAgfQotICAgIG1GcmFtZVNpemUgPSBhdWRpb19zdHJlYW1fZnJhbWVfc2l6ZSgmbUlucHV0LT5zdHJlYW0tPmNvbW1vbik7CisgICAgbUZyYW1lU2l6ZSA9IGF1ZGlvX3N0cmVhbV9pbl9mcmFtZV9zaXplKG1JbnB1dC0+c3RyZWFtKTsKICAgICBtQnVmZmVyU2l6ZSA9IG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2J1ZmZlcl9zaXplKCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKTsKICAgICBtRnJhbWVDb3VudCA9IG1CdWZmZXJTaXplIC8gbUZyYW1lU2l6ZTsKLSAgICBtUnNtcEluQnVmZmVyID0gbmV3IGludDE2X3RbbUZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50XTsKLSAgICBtZW1zZXQobVJzbXBJbkJ1ZmZlciwgMCwgbUZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50ICogc2l6ZW9mKG1Sc21wSW5CdWZmZXJbMF0pKTsKKyAgICAvLyBUaGlzIGlzIHRoZSBmb3JtdWxhIGZvciBjYWxjdWxhdGluZyB0aGUgdGVtcG9yYXJ5IGJ1ZmZlciBzaXplLgorICAgIC8vIFdpdGggNyBIQUwgYnVmZmVycywgd2UgY2FuIGd1YXJhbnRlZSBhYmlsaXR5IHRvIGRvd24tc2FtcGxlIHRoZSBpbnB1dCBieSByYXRpbyBvZiA2OjEgdG8KKyAgICAvLyAxIGZ1bGwgb3V0cHV0IGJ1ZmZlciwgcmVnYXJkbGVzcyBvZiB0aGUgYWxpZ25tZW50IG9mIHRoZSBhdmFpbGFibGUgaW5wdXQuCisgICAgLy8gVGhlIHZhbHVlIGlzIHNvbWV3aGF0IGFyYml0cmFyeSwgYW5kIGNvdWxkIHByb2JhYmx5IGJlIGV2ZW4gbGFyZ2VyLgorICAgIC8vIEEgbGFyZ2VyIHZhbHVlIHNob3VsZCBhbGxvdyBtb3JlIG9sZCBkYXRhIHRvIGJlIHJlYWQgYWZ0ZXIgYSB0cmFjayBjYWxscyBzdGFydCgpLAorICAgIC8vIHdpdGhvdXQgaW5jcmVhc2luZyBsYXRlbmN5LgorICAgIG1Sc21wSW5GcmFtZXMgPSBtRnJhbWVDb3VudCAqIDc7CisgICAgbVJzbXBJbkZyYW1lc1AyID0gcm91bmR1cChtUnNtcEluRnJhbWVzKTsKKyAgICBkZWxldGVbXSBtUnNtcEluQnVmZmVyOwogCi0gICAgaWYgKG1TYW1wbGVSYXRlICE9IG1SZXFTYW1wbGVSYXRlICYmIG1DaGFubmVsQ291bnQgPD0gRkNDXzIgJiYgbVJlcUNoYW5uZWxDb3VudCA8PSBGQ0NfMikKLSAgICB7Ci0gICAgICAgIGludCBjaGFubmVsQ291bnQ7Ci0gICAgICAgIC8vIG9wdGltaXphdGlvbjogaWYgbW9ubyB0byBtb25vLCB1c2UgdGhlIHJlc2FtcGxlciBpbiBzdGVyZW8gdG8gc3RlcmVvIG1vZGUgdG8gYXZvaWQKLSAgICAgICAgLy8gc3RlcmVvIHRvIG1vbm8gcG9zdCBwcm9jZXNzIGFzIHRoZSByZXNhbXBsZXIgYWx3YXlzIG91dHB1dHMgc3RlcmVvLgotICAgICAgICBpZiAobUNoYW5uZWxDb3VudCA9PSAxICYmIG1SZXFDaGFubmVsQ291bnQgPT0gMikgewotICAgICAgICAgICAgY2hhbm5lbENvdW50ID0gMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNoYW5uZWxDb3VudCA9IDI7Ci0gICAgICAgIH0KLSAgICAgICAgbVJlc2FtcGxlciA9IEF1ZGlvUmVzYW1wbGVyOjpjcmVhdGUoMTYsIGNoYW5uZWxDb3VudCwgbVJlcVNhbXBsZVJhdGUpOwotICAgICAgICBtUmVzYW1wbGVyLT5zZXRTYW1wbGVSYXRlKG1TYW1wbGVSYXRlKTsKLSAgICAgICAgbVJlc2FtcGxlci0+c2V0Vm9sdW1lKEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU4sIEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU4pOwotICAgICAgICBtUnNtcE91dEJ1ZmZlciA9IG5ldyBpbnQzMl90W21GcmFtZUNvdW50ICogRkNDXzJdOworICAgIC8vIFRPRE8gb3B0aW1pemUgYXVkaW8gY2FwdHVyZSBidWZmZXIgc2l6ZXMgLi4uCisgICAgLy8gSGVyZSB3ZSBjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIHNsaWRpbmcgYnVmZmVyIHVzZWQgYXMgYSBzb3VyY2UKKyAgICAvLyBmb3IgcmVzYW1wbGluZy4gIG1Sc21wSW5GcmFtZXNQMiBpcyBjdXJyZW50bHkgcm91bmR1cChtRnJhbWVDb3VudCAqIDcpLgorICAgIC8vIEZvciBjdXJyZW50IEhBTCBmcmFtZSBjb3VudHMsIHRoaXMgaXMgdXN1YWxseSAyMDQ4ID0gNDAgbXMuICBJdCB3b3VsZAorICAgIC8vIGJlIGJldHRlciB0byBoYXZlIGl0IGRlcml2ZWQgZnJvbSB0aGUgcGlwZSBkZXB0aCBpbiB0aGUgbG9uZyB0ZXJtLgorICAgIC8vIFRoZSBjdXJyZW50IHZhbHVlIGlzIGhpZ2hlciB0aGFuIG5lY2Vzc2FyeS4gIEhvd2V2ZXIgaXQgc2hvdWxkIG5vdCBhZGQgdG8gbGF0ZW5jeS4KIAotICAgICAgICAvLyBvcHRtaXphdGlvbjogaWYgbW9ubyB0byBtb25vLCBhbHRlciBpbnB1dCBmcmFtZSBjb3VudCBhcyBpZiB3ZSB3ZXJlIGlucHV0aW5nCi0gICAgICAgIC8vIHN0ZXJlbyBzYW1wbGVzCi0gICAgICAgIGlmIChtQ2hhbm5lbENvdW50ID09IDEgJiYgbVJlcUNoYW5uZWxDb3VudCA9PSAxKSB7Ci0gICAgICAgICAgICBtRnJhbWVDb3VudCA+Pj0gMTsKLSAgICAgICAgfQorICAgIC8vIE92ZXItYWxsb2NhdGUgYmV5b25kIG1Sc21wSW5GcmFtZXNQMiB0byBwZXJtaXQgYSBIQUwgcmVhZCBwYXN0IGVuZCBvZiBidWZmZXIKKyAgICBzaXplX3QgYnVmZmVyU2l6ZUluU2hvcnRzID0gKG1Sc21wSW5GcmFtZXNQMiArIG1GcmFtZUNvdW50IC0gMSkgKiBtQ2hhbm5lbENvdW50OworICAgIG1Sc21wSW5CdWZmZXIgPSBuZXcgaW50MTZfdFtidWZmZXJTaXplSW5TaG9ydHNdOworICAgIG1lbXNldChtUnNtcEluQnVmZmVyLCAwLCBidWZmZXJTaXplSW5TaG9ydHMgKiBzaXplb2YobVJzbXBJbkJ1ZmZlclswXSkpOwogCi0gICAgfQotICAgIG1Sc21wSW5JbmRleCA9IG1GcmFtZUNvdW50OworICAgIC8vIEF1ZGlvUmVjb3JkIG1TYW1wbGVSYXRlIGFuZCBtQ2hhbm5lbENvdW50IGFyZSBjb25zdGFudCBkdWUgdG8gQXVkaW9SZWNvcmQgQVBJIGNvbnN0cmFpbnRzLgorICAgIC8vIEJ1dCBpZiB0aHJlYWQncyBtU2FtcGxlUmF0ZSBvciBtQ2hhbm5lbENvdW50IGNoYW5nZXMsIGhvdyB3aWxsIHRoYXQgYWZmZWN0IGFjdGl2ZSB0cmFja3M/CiB9CiAKLXVuc2lnbmVkIGludCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6Z2V0SW5wdXRGcmFtZXNMb3N0KCkKK3VpbnQzMl90IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpnZXRJbnB1dEZyYW1lc0xvc3QoKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKGluaXRDaGVjaygpICE9IE5PX0VSUk9SKSB7CkBAIC01MzEzLDE1ICs2MjA3LDIwIEBACiB7CiAgICAgLy8gb25seSBvbmUgY2hhaW4gcGVyIGlucHV0IHRocmVhZAogICAgIGlmIChtRWZmZWN0Q2hhaW5zLnNpemUoKSAhPSAwKSB7CisgICAgICAgIEFMT0dXKCJhZGRFZmZlY3RDaGFpbl9sKCkgYWxyZWFkeSBvbmUgY2hhaW4gJXAgb24gdGhyZWFkICVwIiwgY2hhaW4uZ2V0KCksIHRoaXMpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIEFMT0dWKCJhZGRFZmZlY3RDaGFpbl9sKCkgJXAgb24gdGhyZWFkICVwIiwgY2hhaW4uZ2V0KCksIHRoaXMpOwotCisgICAgY2hhaW4tPnNldFRocmVhZCh0aGlzKTsKICAgICBjaGFpbi0+c2V0SW5CdWZmZXIoTlVMTCk7CiAgICAgY2hhaW4tPnNldE91dEJ1ZmZlcihOVUxMKTsKIAogICAgIGNoZWNrU3VzcGVuZE9uQWRkRWZmZWN0Q2hhaW5fbChjaGFpbik7CiAKKyAgICAvLyBtYWtlIHN1cmUgZW5hYmxlZCBwcmUgcHJvY2Vzc2luZyBlZmZlY3RzIHN0YXRlIGlzIGNvbW11bmljYXRlZCB0byB0aGUgSEFMIGFzIHdlCisgICAgLy8ganVzdCBtb3ZlZCB0aGVtIHRvIGEgbmV3IGlucHV0IHN0cmVhbS4KKyAgICBjaGFpbi0+c3luY0hhbEVmZmVjdHNTdGF0ZSgpOworCiAgICAgbUVmZmVjdENoYWlucy5hZGQoY2hhaW4pOwogCiAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtNTMzOSw0ICs2MjM4LDgwIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpjcmVhdGVBdWRpb1BhdGNoX2woY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIGlmIChtSW5wdXQtPmF1ZGlvSHdEZXYtPnZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7CisgICAgICAgIC8vIHN0b3JlIG5ldyBkZXZpY2UgYW5kIHNlbmQgdG8gZWZmZWN0cworICAgICAgICBtSW5EZXZpY2UgPSBwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLnR5cGU7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdENoYWlucy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgbUVmZmVjdENoYWluc1tpXS0+c2V0RGV2aWNlX2wobUluRGV2aWNlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRpc2FibGUgQUVDIGFuZCBOUyBpZiB0aGUgZGV2aWNlIGlzIGEgQlQgU0NPIGhlYWRzZXQgc3VwcG9ydGluZyB0aG9zZQorICAgICAgICAvLyBwcmUgcHJvY2Vzc2luZ3MKKyAgICAgICAgaWYgKG1UcmFja3Muc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgYm9vbCBzdXNwZW5kID0gYXVkaW9faXNfYmx1ZXRvb3RoX3Njb19kZXZpY2UobUluRGV2aWNlKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9GbGluZ2VyLT5idE5yZWNJc09mZigpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3A8UmVjb3JkVHJhY2s+IHRyYWNrID0gbVRyYWNrc1tpXTsKKyAgICAgICAgICAgICAgICBzZXRFZmZlY3RTdXNwZW5kZWRfbChGWF9JSURfQUVDLCBzdXNwZW5kLCB0cmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICAgICAgICAgIHNldEVmZmVjdFN1c3BlbmRlZF9sKEZYX0lJRF9OUywgc3VzcGVuZCwgdHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHN0b3JlIG5ldyBzb3VyY2UgYW5kIHNlbmQgdG8gZWZmZWN0cworICAgICAgICBpZiAobUF1ZGlvU291cmNlICE9IHBhdGNoLT5zaW5rc1swXS5leHQubWl4LnVzZWNhc2Uuc291cmNlKSB7CisgICAgICAgICAgICBtQXVkaW9Tb3VyY2UgPSBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC51c2VjYXNlLnNvdXJjZTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdENoYWlucy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIG1FZmZlY3RDaGFpbnNbaV0tPnNldEF1ZGlvU291cmNlX2wobUF1ZGlvU291cmNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGF1ZGlvX2h3X2RldmljZV90ICpod0RldmljZSA9IG1JbnB1dC0+YXVkaW9Id0Rldi0+aHdEZXZpY2UoKTsKKyAgICAgICAgc3RhdHVzID0gaHdEZXZpY2UtPmNyZWF0ZV9hdWRpb19wYXRjaChod0RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm51bV9zb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm51bV9zaW5rcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dfQVNTRVJUKGZhbHNlLCAiY3JlYXRlQXVkaW9QYXRjaF9sKCkgY2FsbGVkIG9uIGEgcHJlIDMuMCBIQUwiKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnJlbGVhc2VBdWRpb1BhdGNoX2woY29uc3QgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIGlmIChtSW5wdXQtPmF1ZGlvSHdEZXYtPnZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7CisgICAgICAgIGF1ZGlvX2h3X2RldmljZV90ICpod0RldmljZSA9IG1JbnB1dC0+YXVkaW9Id0Rldi0+aHdEZXZpY2UoKTsKKyAgICAgICAgc3RhdHVzID0gaHdEZXZpY2UtPnJlbGVhc2VfYXVkaW9fcGF0Y2goaHdEZXZpY2UsIGhhbmRsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR19BU1NFUlQoZmFsc2UsICJyZWxlYXNlQXVkaW9QYXRjaF9sKCkgY2FsbGVkIG9uIGEgcHJlIDMuMCBIQUwiKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6YWRkUGF0Y2hSZWNvcmQoY29uc3Qgc3A8UGF0Y2hSZWNvcmQ+JiByZWNvcmQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtVHJhY2tzLmFkZChyZWNvcmQpOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpkZWxldGVQYXRjaFJlY29yZChjb25zdCBzcDxQYXRjaFJlY29yZD4mIHJlY29yZCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGRlc3Ryb3lUcmFja19sKHJlY29yZCk7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmdldEF1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKK3sKKyAgICBUaHJlYWRCYXNlOjpnZXRBdWRpb1BvcnRDb25maWcoY29uZmlnKTsKKyAgICBjb25maWctPnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU0lOSzsKKyAgICBjb25maWctPmV4dC5taXguaHdfbW9kdWxlID0gbUlucHV0LT5hdWRpb0h3RGV2LT5oYW5kbGUoKTsKKyAgICBjb25maWctPmV4dC5taXgudXNlY2FzZS5zb3VyY2UgPSBtQXVkaW9Tb3VyY2U7Cit9CisKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaAppbmRleCBiYjkyZGYxLi5lY2I4ZTRlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmgKQEAgLTM2LDYgKzM2LDggQEAKICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0RGV2aWNlLCBhdWRpb19kZXZpY2VzX3QgaW5EZXZpY2UsIHR5cGVfdCB0eXBlKTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5UaHJlYWRCYXNlKCk7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHJlYWR5VG9SdW4oKTsKKwogICAgIHZvaWQgZHVtcEJhc2UoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKICAgICB2b2lkIGR1bXBFZmZlY3RDaGFpbnMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIApAQCAtNDQsNjAgKzQ2LDE2OSBAQAogICAgIC8vIGJhc2UgZm9yIHJlY29yZCBhbmQgcGxheWJhY2sKICAgICBlbnVtIHsKICAgICAgICAgQ0ZHX0VWRU5UX0lPLAotICAgICAgICBDRkdfRVZFTlRfUFJJTworICAgICAgICBDRkdfRVZFTlRfUFJJTywKKyAgICAgICAgQ0ZHX0VWRU5UX1NFVF9QQVJBTUVURVIsCisgICAgICAgIENGR19FVkVOVF9DUkVBVEVfQVVESU9fUEFUQ0gsCisgICAgICAgIENGR19FVkVOVF9SRUxFQVNFX0FVRElPX1BBVENILAogICAgIH07CiAKLSAgICBjbGFzcyBDb25maWdFdmVudCB7CisgICAgY2xhc3MgQ29uZmlnRXZlbnREYXRhOiBwdWJsaWMgUmVmQmFzZSB7CiAgICAgcHVibGljOgotICAgICAgICBDb25maWdFdmVudChpbnQgdHlwZSkgOiBtVHlwZSh0eXBlKSB7fQotICAgICAgICB2aXJ0dWFsIH5Db25maWdFdmVudCgpIHt9Ci0KLSAgICAgICAgICAgICAgICAgaW50IHR5cGUoKSBjb25zdCB7IHJldHVybiBtVHlwZTsgfQorICAgICAgICB2aXJ0dWFsIH5Db25maWdFdmVudERhdGEoKSB7fQogCiAgICAgICAgIHZpcnR1YWwgIHZvaWQgZHVtcChjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKSA9IDA7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBjb25zdCBpbnQgbVR5cGU7CisgICAgcHJvdGVjdGVkOgorICAgICAgICBDb25maWdFdmVudERhdGEoKSB7fQogICAgIH07CiAKLSAgICBjbGFzcyBJb0NvbmZpZ0V2ZW50IDogcHVibGljIENvbmZpZ0V2ZW50IHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIElvQ29uZmlnRXZlbnQoaW50IGV2ZW50LCBpbnQgcGFyYW0pIDoKLSAgICAgICAgICAgIENvbmZpZ0V2ZW50KENGR19FVkVOVF9JTyksIG1FdmVudChldmVudCksIG1QYXJhbShldmVudCkge30KLSAgICAgICAgdmlydHVhbCB+SW9Db25maWdFdmVudCgpIHt9CisgICAgLy8gQ29uZmlnIGV2ZW50IHNlcXVlbmNlIGJ5IGNsaWVudCBpZiBzdGF0dXMgbmVlZGVkIChlLmcgYmluZGVyIHRocmVhZCBjYWxsaW5nIHNldFBhcmFtZXRlcnMoKSk6CisgICAgLy8gIDEuIGNyZWF0ZSBTZXRQYXJhbWV0ZXJDb25maWdFdmVudC4gVGhpcyBzZXRzIG1XYWl0U3RhdHVzIGluIGNvbmZpZyBldmVudAorICAgIC8vICAyLiBMb2NrIG1Mb2NrCisgICAgLy8gIDMuIENhbGwgc2VuZENvbmZpZ0V2ZW50X2woKTogQXBwZW5kIHRvIG1Db25maWdFdmVudHMgYW5kIG1XYWl0V29ya0NWLnNpZ25hbAorICAgIC8vICA0LiBzZW5kQ29uZmlnRXZlbnRfbCgpIHJlYWRzIHN0YXR1cyBmcm9tIGV2ZW50LT5tU3RhdHVzOworICAgIC8vICA1LiBzZW5kQ29uZmlnRXZlbnRfbCgpIHJldHVybnMgc3RhdHVzCisgICAgLy8gIDYuIFVubG9jaworICAgIC8vCisgICAgLy8gUGFyYW1ldGVyIHNlcXVlbmNlIGJ5IHNlcnZlcjogdGhyZWFkTG9vcCBjYWxsaW5nIHByb2Nlc3NDb25maWdFdmVudHNfbCgpOgorICAgIC8vIDEuIExvY2sgbUxvY2sKKyAgICAvLyAyLiBJZiB0aGVyZSBpcyBhbiBlbnRyeSBpbiBtQ29uZmlnRXZlbnRzIHByb2NlZWQgLi4uCisgICAgLy8gMy4gUmVhZCBmaXJzdCBlbnRyeSBpbiBtQ29uZmlnRXZlbnRzCisgICAgLy8gNC4gUmVtb3ZlIGZpcnN0IGVudHJ5IGZyb20gbUNvbmZpZ0V2ZW50cworICAgIC8vIDUuIFByb2Nlc3MKKyAgICAvLyA2LiBTZXQgZXZlbnQtPm1TdGF0dXMKKyAgICAvLyA3LiBldmVudC0+bUNvbmQuc2lnbmFsCisgICAgLy8gOC4gVW5sb2NrCiAKLSAgICAgICAgICAgICAgICBpbnQgZXZlbnQoKSBjb25zdCB7IHJldHVybiBtRXZlbnQ7IH0KLSAgICAgICAgICAgICAgICBpbnQgcGFyYW0oKSBjb25zdCB7IHJldHVybiBtUGFyYW07IH0KKyAgICBjbGFzcyBDb25maWdFdmVudDogcHVibGljIFJlZkJhc2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB+Q29uZmlnRXZlbnQoKSB7fQorCisgICAgICAgIHZvaWQgZHVtcChjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKSB7IG1EYXRhLT5kdW1wKGJ1ZmZlciwgc2l6ZSk7IH0KKworICAgICAgICBjb25zdCBpbnQgbVR5cGU7IC8vIGV2ZW50IHR5cGUgZS5nLiBDRkdfRVZFTlRfSU8KKyAgICAgICAgTXV0ZXggbUxvY2s7ICAgICAvLyBtdXRleCBhc3NvY2lhdGVkIHdpdGggbUNvbmQKKyAgICAgICAgQ29uZGl0aW9uIG1Db25kOyAvLyBjb25kaXRpb24gZm9yIHN0YXR1cyByZXR1cm4KKyAgICAgICAgc3RhdHVzX3QgbVN0YXR1czsgLy8gc3RhdHVzIGNvbW11bmljYXRlZCB0byBzZW5kZXIKKyAgICAgICAgYm9vbCBtV2FpdFN0YXR1czsgLy8gdHJ1ZSBpZiBzZW5kZXIgaXMgd2FpdGluZyBmb3Igc3RhdHVzCisgICAgICAgIHNwPENvbmZpZ0V2ZW50RGF0YT4gbURhdGE7ICAgICAvLyBldmVudCBzcGVjaWZpYyBwYXJhbWV0ZXIgZGF0YQorCisgICAgcHJvdGVjdGVkOgorICAgICAgICBDb25maWdFdmVudChpbnQgdHlwZSkgOiBtVHlwZSh0eXBlKSwgbVN0YXR1cyhOT19FUlJPUiksIG1XYWl0U3RhdHVzKGZhbHNlKSwgbURhdGEoTlVMTCkge30KKyAgICB9OworCisgICAgY2xhc3MgSW9Db25maWdFdmVudERhdGEgOiBwdWJsaWMgQ29uZmlnRXZlbnREYXRhIHsKKyAgICBwdWJsaWM6CisgICAgICAgIElvQ29uZmlnRXZlbnREYXRhKGludCBldmVudCwgaW50IHBhcmFtKSA6CisgICAgICAgICAgICBtRXZlbnQoZXZlbnQpLCBtUGFyYW0ocGFyYW0pIHt9CiAKICAgICAgICAgdmlydHVhbCAgdm9pZCBkdW1wKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpIHsKICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIklPIGV2ZW50OiBldmVudCAlZCwgcGFyYW0gJWRcbiIsIG1FdmVudCwgbVBhcmFtKTsKICAgICAgICAgfQogCi0gICAgcHJpdmF0ZToKICAgICAgICAgY29uc3QgaW50IG1FdmVudDsKICAgICAgICAgY29uc3QgaW50IG1QYXJhbTsKICAgICB9OwogCi0gICAgY2xhc3MgUHJpb0NvbmZpZ0V2ZW50IDogcHVibGljIENvbmZpZ0V2ZW50IHsKKyAgICBjbGFzcyBJb0NvbmZpZ0V2ZW50IDogcHVibGljIENvbmZpZ0V2ZW50IHsKICAgICBwdWJsaWM6Ci0gICAgICAgIFByaW9Db25maWdFdmVudChwaWRfdCBwaWQsIHBpZF90IHRpZCwgaW50MzJfdCBwcmlvKSA6Ci0gICAgICAgICAgICBDb25maWdFdmVudChDRkdfRVZFTlRfUFJJTyksIG1QaWQocGlkKSwgbVRpZCh0aWQpLCBtUHJpbyhwcmlvKSB7fQotICAgICAgICB2aXJ0dWFsIH5QcmlvQ29uZmlnRXZlbnQoKSB7fQorICAgICAgICBJb0NvbmZpZ0V2ZW50KGludCBldmVudCwgaW50IHBhcmFtKSA6CisgICAgICAgICAgICBDb25maWdFdmVudChDRkdfRVZFTlRfSU8pIHsKKyAgICAgICAgICAgIG1EYXRhID0gbmV3IElvQ29uZmlnRXZlbnREYXRhKGV2ZW50LCBwYXJhbSk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB+SW9Db25maWdFdmVudCgpIHt9CisgICAgfTsKIAotICAgICAgICAgICAgICAgIHBpZF90IHBpZCgpIGNvbnN0IHsgcmV0dXJuIG1QaWQ7IH0KLSAgICAgICAgICAgICAgICBwaWRfdCB0aWQoKSBjb25zdCB7IHJldHVybiBtVGlkOyB9Ci0gICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvKCkgY29uc3QgeyByZXR1cm4gbVByaW87IH0KKyAgICBjbGFzcyBQcmlvQ29uZmlnRXZlbnREYXRhIDogcHVibGljIENvbmZpZ0V2ZW50RGF0YSB7CisgICAgcHVibGljOgorICAgICAgICBQcmlvQ29uZmlnRXZlbnREYXRhKHBpZF90IHBpZCwgcGlkX3QgdGlkLCBpbnQzMl90IHByaW8pIDoKKyAgICAgICAgICAgIG1QaWQocGlkKSwgbVRpZCh0aWQpLCBtUHJpbyhwcmlvKSB7fQogCiAgICAgICAgIHZpcnR1YWwgIHZvaWQgZHVtcChjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKSB7CiAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICJQcmlvIGV2ZW50OiBwaWQgJWQsIHRpZCAlZCwgcHJpbyAlZFxuIiwgbVBpZCwgbVRpZCwgbVByaW8pOwogICAgICAgICB9CiAKLSAgICBwcml2YXRlOgogICAgICAgICBjb25zdCBwaWRfdCBtUGlkOwogICAgICAgICBjb25zdCBwaWRfdCBtVGlkOwogICAgICAgICBjb25zdCBpbnQzMl90IG1QcmlvOwogICAgIH07CiAKKyAgICBjbGFzcyBQcmlvQ29uZmlnRXZlbnQgOiBwdWJsaWMgQ29uZmlnRXZlbnQgeworICAgIHB1YmxpYzoKKyAgICAgICAgUHJpb0NvbmZpZ0V2ZW50KHBpZF90IHBpZCwgcGlkX3QgdGlkLCBpbnQzMl90IHByaW8pIDoKKyAgICAgICAgICAgIENvbmZpZ0V2ZW50KENGR19FVkVOVF9QUklPKSB7CisgICAgICAgICAgICBtRGF0YSA9IG5ldyBQcmlvQ29uZmlnRXZlbnREYXRhKHBpZCwgdGlkLCBwcmlvKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIH5QcmlvQ29uZmlnRXZlbnQoKSB7fQorICAgIH07CisKKyAgICBjbGFzcyBTZXRQYXJhbWV0ZXJDb25maWdFdmVudERhdGEgOiBwdWJsaWMgQ29uZmlnRXZlbnREYXRhIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFNldFBhcmFtZXRlckNvbmZpZ0V2ZW50RGF0YShTdHJpbmc4IGtleVZhbHVlUGFpcnMpIDoKKyAgICAgICAgICAgIG1LZXlWYWx1ZVBhaXJzKGtleVZhbHVlUGFpcnMpIHt9CisKKyAgICAgICAgdmlydHVhbCAgdm9pZCBkdW1wKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIktleVZhbHVlOiAlc1xuIiwgbUtleVZhbHVlUGFpcnMuc3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgU3RyaW5nOCBtS2V5VmFsdWVQYWlyczsKKyAgICB9OworCisgICAgY2xhc3MgU2V0UGFyYW1ldGVyQ29uZmlnRXZlbnQgOiBwdWJsaWMgQ29uZmlnRXZlbnQgeworICAgIHB1YmxpYzoKKyAgICAgICAgU2V0UGFyYW1ldGVyQ29uZmlnRXZlbnQoU3RyaW5nOCBrZXlWYWx1ZVBhaXJzKSA6CisgICAgICAgICAgICBDb25maWdFdmVudChDRkdfRVZFTlRfU0VUX1BBUkFNRVRFUikgeworICAgICAgICAgICAgbURhdGEgPSBuZXcgU2V0UGFyYW1ldGVyQ29uZmlnRXZlbnREYXRhKGtleVZhbHVlUGFpcnMpOworICAgICAgICAgICAgbVdhaXRTdGF0dXMgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgflNldFBhcmFtZXRlckNvbmZpZ0V2ZW50KCkge30KKyAgICB9OworCisgICAgY2xhc3MgQ3JlYXRlQXVkaW9QYXRjaENvbmZpZ0V2ZW50RGF0YSA6IHB1YmxpYyBDb25maWdFdmVudERhdGEgeworICAgIHB1YmxpYzoKKyAgICAgICAgQ3JlYXRlQXVkaW9QYXRjaENvbmZpZ0V2ZW50RGF0YShjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKSA6CisgICAgICAgICAgICBtUGF0Y2gocGF0Y2gpLCBtSGFuZGxlKGhhbmRsZSkge30KKworICAgICAgICB2aXJ0dWFsICB2b2lkIGR1bXAoY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkgeworICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiUGF0Y2ggaGFuZGxlOiAldVxuIiwgbUhhbmRsZSk7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggbVBhdGNoOworICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtSGFuZGxlOworICAgIH07CisKKyAgICBjbGFzcyBDcmVhdGVBdWRpb1BhdGNoQ29uZmlnRXZlbnQgOiBwdWJsaWMgQ29uZmlnRXZlbnQgeworICAgIHB1YmxpYzoKKyAgICAgICAgQ3JlYXRlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgOgorICAgICAgICAgICAgQ29uZmlnRXZlbnQoQ0ZHX0VWRU5UX0NSRUFURV9BVURJT19QQVRDSCkgeworICAgICAgICAgICAgbURhdGEgPSBuZXcgQ3JlYXRlQXVkaW9QYXRjaENvbmZpZ0V2ZW50RGF0YShwYXRjaCwgaGFuZGxlKTsKKyAgICAgICAgICAgIG1XYWl0U3RhdHVzID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIH5DcmVhdGVBdWRpb1BhdGNoQ29uZmlnRXZlbnQoKSB7fQorICAgIH07CisKKyAgICBjbGFzcyBSZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50RGF0YSA6IHB1YmxpYyBDb25maWdFdmVudERhdGEgeworICAgIHB1YmxpYzoKKyAgICAgICAgUmVsZWFzZUF1ZGlvUGF0Y2hDb25maWdFdmVudERhdGEoY29uc3QgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKSA6CisgICAgICAgICAgICBtSGFuZGxlKGhhbmRsZSkge30KKworICAgICAgICB2aXJ0dWFsICB2b2lkIGR1bXAoY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkgeworICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiUGF0Y2ggaGFuZGxlOiAldVxuIiwgbUhhbmRsZSk7CisgICAgICAgIH0KKworICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtSGFuZGxlOworICAgIH07CisKKyAgICBjbGFzcyBSZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50IDogcHVibGljIENvbmZpZ0V2ZW50IHsKKyAgICBwdWJsaWM6CisgICAgICAgIFJlbGVhc2VBdWRpb1BhdGNoQ29uZmlnRXZlbnQoY29uc3QgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKSA6CisgICAgICAgICAgICBDb25maWdFdmVudChDRkdfRVZFTlRfUkVMRUFTRV9BVURJT19QQVRDSCkgeworICAgICAgICAgICAgbURhdGEgPSBuZXcgUmVsZWFzZUF1ZGlvUGF0Y2hDb25maWdFdmVudERhdGEoaGFuZGxlKTsKKyAgICAgICAgICAgIG1XYWl0U3RhdHVzID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIH5SZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KCkge30KKyAgICB9OwogCiAgICAgY2xhc3MgUE1EZWF0aFJlY2lwaWVudCA6IHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCB7CiAgICAgcHVibGljOgpAQCAtMTI0LDkgKzIzNSw5IEBACiAKICAgICAgICAgICAgICAgICAvLyBkeW5hbWljIGV4dGVybmFsbHktdmlzaWJsZQogICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgIHNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiBtU2FtcGxlUmF0ZTsgfQotICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgIGNoYW5uZWxDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsQ291bnQ7IH0KICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaygpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsTWFzazsgfQotICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIG1Gb3JtYXQ7IH0KKyAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQoKSBjb25zdCB7IHJldHVybiBtSEFMRm9ybWF0OyB9CisgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbENvdW50KCkgY29uc3QgeyByZXR1cm4gbUNoYW5uZWxDb3VudDsgfQogICAgICAgICAgICAgICAgIC8vIENhbGxlZCBieSBBdWRpb0ZsaW5nZXI6OmZyYW1lQ291bnQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBhbmQgZWZmZWN0cywKICAgICAgICAgICAgICAgICAvLyBhbmQgcmV0dXJucyB0aGUgW25vcm1hbCBtaXhdIGJ1ZmZlcidzIGZyYW1lIGNvdW50LgogICAgIHZpcnR1YWwgICAgIHNpemVfdCAgICAgIGZyYW1lQ291bnQoKSBjb25zdCA9IDA7CkBAIC0xMzUsMTQgKzI0NiwyOSBAQAogICAgIC8vIFNob3VsZCBiZSAidmlydHVhbCBzdGF0dXNfdCByZXF1ZXN0RXhpdEFuZFdhaXQoKSIgYW5kIG92ZXJyaWRlIHNhbWUKICAgICAvLyBtZXRob2QgaW4gVGhyZWFkLCBidXQgVGhyZWFkOjpyZXF1ZXN0RXhpdEFuZFdhaXQoKSBpcyBub3QgeWV0IHZpcnR1YWwuCiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZXhpdCgpOwotICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGNoZWNrRm9yTmV3UGFyYW1ldGVyc19sKCkgPSAwOworICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGNoZWNrRm9yTmV3UGFyYW1ldGVyX2woY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190JiBzdGF0dXMpID0gMDsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOwogICAgIHZpcnR1YWwgICAgIFN0cmluZzggICAgIGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cykgPSAwOwotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGF1ZGlvQ29uZmlnQ2hhbmdlZF9sKGludCBldmVudCwgaW50IHBhcmFtID0gMCkgPSAwOworICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGF1ZGlvQ29uZmlnQ2hhbmdlZChpbnQgZXZlbnQsIGludCBwYXJhbSA9IDApID0gMDsKKyAgICAgICAgICAgICAgICAvLyBzZW5kQ29uZmlnRXZlbnRfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAorICAgICAgICAgICAgICAgIC8vIENhbiB0ZW1wb3JhcmlseSByZWxlYXNlIHRoZSBsb2NrIGlmIHdhaXRpbmcgZm9yIGEgcmVwbHkgZnJvbQorICAgICAgICAgICAgICAgIC8vIHByb2Nlc3NDb25maWdFdmVudHNfbCgpLgorICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHNlbmRDb25maWdFdmVudF9sKHNwPENvbmZpZ0V2ZW50PiYgZXZlbnQpOwogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50KGludCBldmVudCwgaW50IHBhcmFtID0gMCk7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2VuZElvQ29uZmlnRXZlbnRfbChpbnQgZXZlbnQsIGludCBwYXJhbSA9IDApOwogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHNlbmRQcmlvQ29uZmlnRXZlbnRfbChwaWRfdCBwaWQsIHBpZF90IHRpZCwgaW50MzJfdCBwcmlvKTsKLSAgICAgICAgICAgICAgICB2b2lkICAgICAgICBwcm9jZXNzQ29uZmlnRXZlbnRzKCk7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc2VuZFNldFBhcmFtZXRlckNvbmZpZ0V2ZW50X2woY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlyKTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZW5kQ3JlYXRlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZW5kUmVsZWFzZUF1ZGlvUGF0Y2hDb25maWdFdmVudChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOworICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHByb2Nlc3NDb25maWdFdmVudHNfbCgpOworICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGNhY2hlUGFyYW1ldGVyc19sKCkgPSAwOworICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIGNyZWF0ZUF1ZGlvUGF0Y2hfbChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKSA9IDA7CisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgcmVsZWFzZUF1ZGlvUGF0Y2hfbChjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpID0gMDsKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBnZXRBdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpID0gMDsKKwogCiAgICAgICAgICAgICAgICAgLy8gc2VlIG5vdGUgYXQgZGVjbGFyYXRpb24gb2YgbVN0YW5kYnksIG1PdXREZXZpY2UgYW5kIG1JbkRldmljZQogICAgICAgICAgICAgICAgIGJvb2wgICAgICAgIHN0YW5kYnkoKSBjb25zdCB7IHJldHVybiBtU3RhbmRieTsgfQpAQCAtMTU4LDEwICsyODQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmVuYWJsZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKTsKLSAgICAgICAgICAgICAgICB2b2lkIGRpc2Nvbm5lY3RFZmZlY3QoY29uc3Qgc3A8IEVmZmVjdE1vZHVsZT4mIGVmZmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWZmZWN0SGFuZGxlICpoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdW5waW5JZkxhc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cyAvKm5vbi1OVUxMKi8pOwogCiAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHZhbHVlcyBmb3IgaGFzQXVkaW9TZXNzaW9uIChiaXQgZmllbGQpCiAgICAgICAgICAgICAgICAgZW51bSBlZmZlY3Rfc3RhdGUgewpAQCAtMjAwLDEzICszMjMsMTMgQEAKICAgICAgICAgICAgICAgICAvLyBlZmZlY3QKICAgICAgICAgICAgICAgICB2b2lkIHJlbW92ZUVmZmVjdF9sKGNvbnN0IHNwPCBFZmZlY3RNb2R1bGU+JiBlZmZlY3QpOwogICAgICAgICAgICAgICAgIC8vIGRldGFjaCBhbGwgdHJhY2tzIGNvbm5lY3RlZCB0byBhbiBhdXhpbGlhcnkgZWZmZWN0Ci0gICAgdmlydHVhbCAgICAgdm9pZCBkZXRhY2hBdXhFZmZlY3RfbChpbnQgZWZmZWN0SWQpIHt9CisgICAgdmlydHVhbCAgICAgdm9pZCBkZXRhY2hBdXhFZmZlY3RfbChpbnQgZWZmZWN0SWQgX191bnVzZWQpIHt9CiAgICAgICAgICAgICAgICAgLy8gcmV0dXJucyBlaXRoZXIgRUZGRUNUX1NFU1NJT04gaWYgZWZmZWN0cyBvbiB0aGlzIGF1ZGlvIHNlc3Npb24gZXhpc3QgaW4gb25lCiAgICAgICAgICAgICAgICAgLy8gY2hhaW4sIG9yIFRSQUNLX1NFU1NJT04gaWYgdHJhY2tzIG9uIHRoaXMgYXVkaW8gc2Vzc2lvbiBleGlzdCwgb3IgYm90aAogICAgICAgICAgICAgICAgIHZpcnR1YWwgdWludDMyX3QgaGFzQXVkaW9TZXNzaW9uKGludCBzZXNzaW9uSWQpIGNvbnN0ID0gMDsKICAgICAgICAgICAgICAgICAvLyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBub3QgaW1wb3J0YW50IGFzIHRoZQogICAgICAgICAgICAgICAgIC8vIHN0cmF0ZWd5IGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3IgUGxheWJhY2tUaHJlYWQgd2hpY2ggaW1wbGVtZW50cyB0aGlzIG1ldGhvZAotICAgICAgICAgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTZXNzaW9uX2woaW50IHNlc3Npb25JZCkgeyByZXR1cm4gMDsgfQorICAgICAgICAgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTZXNzaW9uX2woaW50IHNlc3Npb25JZCBfX3VudXNlZCkgeyByZXR1cm4gMDsgfQogCiAgICAgICAgICAgICAgICAgLy8gc3VzcGVuZCBvciByZXN0b3JlIGVmZmVjdCBhY2NvcmRpbmcgdG8gdGhlIHR5cGUgb2YgZWZmZWN0IHBhc3NlZC4gYSBOVUxMCiAgICAgICAgICAgICAgICAgLy8gdHlwZSBwb2ludGVyIG1lYW5zIHN1c3BlbmQgYWxsIGVmZmVjdHMgaW4gdGhlIHNlc3Npb24KQEAgLTIyNSw2ICszNDgsMTUgQEAKICAgICAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFN5bmNFdmVudChjb25zdCBzcDxTeW5jRXZlbnQ+JiBldmVudCkgPSAwOwogICAgICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCAgICAgICAgaXNWYWxpZFN5bmNFdmVudChjb25zdCBzcDxTeW5jRXZlbnQ+JiBldmVudCkgY29uc3QgPSAwOwogCisgICAgICAgICAgICAgICAgLy8gUmV0dXJuIGEgcmVmZXJlbmNlIHRvIGEgcGVyLXRocmVhZCBoZWFwIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGFsbG9jYXRlIElNZW1vcnkKKyAgICAgICAgICAgICAgICAvLyBvYmplY3RzIHRoYXQgd2lsbCBiZSByZWFkLW9ubHkgdG8gY2xpZW50IHByb2Nlc3NlcywgcmVhZC93cml0ZSB0byBtZWRpYXNlcnZlciwKKyAgICAgICAgICAgICAgICAvLyBhbmQgc2hhcmVkIGJ5IGFsbCBjbGllbnQgcHJvY2Vzc2VzIG9mIHRoZSB0aHJlYWQuCisgICAgICAgICAgICAgICAgLy8gVGhlIGhlYXAgaXMgcGVyLXRocmVhZCByYXRoZXIgdGhhbiBjb21tb24gYWNyb3NzIGFsbCB0aHJlYWRzLCBiZWNhdXNlCisgICAgICAgICAgICAgICAgLy8gY2xpZW50cyBjYW4ndCBiZSB0cnVzdGVkIG5vdCB0byBtb2RpZnkgdGhlIG9mZnNldCBvZiB0aGUgSU1lbW9yeSB0aGV5IHJlY2VpdmUuCisgICAgICAgICAgICAgICAgLy8gSWYgYSB0aHJlYWQgZG9lcyBub3QgaGF2ZSBzdWNoIGEgaGVhcCwgdGhpcyBtZXRob2QgcmV0dXJucyAwLgorICAgICAgICAgICAgICAgIHZpcnR1YWwgc3A8TWVtb3J5RGVhbGVyPiAgICByZWFkT25seUhlYXAoKSBjb25zdCB7IHJldHVybiAwOyB9CisKKyAgICAgICAgICAgICAgICB2aXJ0dWFsIHNwPElNZW1vcnk+IHBpcGVNZW1vcnkoKSBjb25zdCB7IHJldHVybiAwOyB9CiAKICAgICBtdXRhYmxlICAgICBNdXRleCAgICAgICAgICAgICAgICAgICBtTG9jazsKIApAQCAtMjY5LDQ4ICs0MDEsMjkgQEAKIAogICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4gIG1BdWRpb0ZsaW5nZXI7CiAKLSAgICAgICAgICAgICAgICAvLyB1cGRhdGVkIGJ5IFBsYXliYWNrVGhyZWFkOjpyZWFkT3V0cHV0UGFyYW1ldGVycygpIG9yCi0gICAgICAgICAgICAgICAgLy8gUmVjb3JkVGhyZWFkOjpyZWFkSW5wdXRQYXJhbWV0ZXJzKCkKKyAgICAgICAgICAgICAgICAvLyB1cGRhdGVkIGJ5IFBsYXliYWNrVGhyZWFkOjpyZWFkT3V0cHV0UGFyYW1ldGVyc19sKCkgb3IKKyAgICAgICAgICAgICAgICAvLyBSZWNvcmRUaHJlYWQ6OnJlYWRJbnB1dFBhcmFtZXRlcnNfbCgpCiAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGU7CiAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgbUZyYW1lQ291bnQ7ICAgICAgIC8vIG91dHB1dCBIQUwsIGRpcmVjdCBvdXRwdXQsIHJlY29yZAogICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICAgIG1DaGFubmVsTWFzazsKICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtQ2hhbm5lbENvdW50OwogICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZVNpemU7Ci0gICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgICAgICAgICAgbUZvcm1hdDsKKyAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAgICAgICAgICBtRm9ybWF0OyAgICAgICAgICAgLy8gU291cmNlIGZvcm1hdCBmb3IgUmVjb3JkaW5nIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaW5rIGZvcm1hdCBmb3IgUGxheWJhY2suCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbmsgZm9ybWF0IG1heSBiZSBkaWZmZXJlbnQgdGhhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIQUwgZm9ybWF0IGlmIEZhc3RtaXhlciBpcyB1c2VkLgorICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICAgICAgICAgIG1IQUxGb3JtYXQ7CisgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgbUJ1ZmZlclNpemU7ICAgICAgIC8vIEhBTCBidWZmZXIgc2l6ZSBmb3IgcmVhZCgpIG9yIHdyaXRlKCkKIAotICAgICAgICAgICAgICAgIC8vIFBhcmFtZXRlciBzZXF1ZW5jZSBieSBjbGllbnQ6IGJpbmRlciB0aHJlYWQgY2FsbGluZyBzZXRQYXJhbWV0ZXJzKCk6Ci0gICAgICAgICAgICAgICAgLy8gIDEuIExvY2sgbUxvY2sKLSAgICAgICAgICAgICAgICAvLyAgMi4gQXBwZW5kIHRvIG1OZXdQYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgLy8gIDMuIG1XYWl0V29ya0NWLnNpZ25hbAotICAgICAgICAgICAgICAgIC8vICA0LiBtUGFyYW1Db25kLndhaXRSZWxhdGl2ZSB3aXRoIHRpbWVvdXQKLSAgICAgICAgICAgICAgICAvLyAgNS4gcmVhZCBtUGFyYW1TdGF0dXMKLSAgICAgICAgICAgICAgICAvLyAgNi4gbVdhaXRXb3JrQ1Yuc2lnbmFsCi0gICAgICAgICAgICAgICAgLy8gIDcuIFVubG9jawotICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgLy8gUGFyYW1ldGVyIHNlcXVlbmNlIGJ5IHNlcnZlcjogdGhyZWFkTG9vcCBjYWxsaW5nIGNoZWNrRm9yTmV3UGFyYW1ldGVyc19sKCk6Ci0gICAgICAgICAgICAgICAgLy8gMS4gTG9jayBtTG9jawotICAgICAgICAgICAgICAgIC8vIDIuIElmIHRoZXJlIGlzIGFuIGVudHJ5IGluIG1OZXdQYXJhbWV0ZXJzIHByb2NlZWQgLi4uCi0gICAgICAgICAgICAgICAgLy8gMi4gUmVhZCBmaXJzdCBlbnRyeSBpbiBtTmV3UGFyYW1ldGVycwotICAgICAgICAgICAgICAgIC8vIDMuIFByb2Nlc3MKLSAgICAgICAgICAgICAgICAvLyA0LiBSZW1vdmUgZmlyc3QgZW50cnkgZnJvbSBtTmV3UGFyYW1ldGVycwotICAgICAgICAgICAgICAgIC8vIDUuIFNldCBtUGFyYW1TdGF0dXMKLSAgICAgICAgICAgICAgICAvLyA2LiBtUGFyYW1Db25kLnNpZ25hbAotICAgICAgICAgICAgICAgIC8vIDcuIG1XYWl0V29ya0NWLndhaXQgd2l0aCB0aW1lb3V0ICh0aGlzIGlzIHRvIGF2b2lkIG92ZXJ3cml0aW5nIG1QYXJhbVN0YXR1cykKLSAgICAgICAgICAgICAgICAvLyA4LiBVbmxvY2sKLSAgICAgICAgICAgICAgICBDb25kaXRpb24gICAgICAgICAgICAgICBtUGFyYW1Db25kOwotICAgICAgICAgICAgICAgIFZlY3RvcjxTdHJpbmc4PiAgICAgICAgIG1OZXdQYXJhbWV0ZXJzOwotICAgICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIG1QYXJhbVN0YXR1czsKLQotICAgICAgICAgICAgICAgIC8vIHZlY3RvciBvd25zIGVhY2ggQ29uZmlnRXZlbnQgKiwgc28gbXVzdCBkZWxldGUgYWZ0ZXIgcmVtb3ZpbmcKLSAgICAgICAgICAgICAgICBWZWN0b3I8Q29uZmlnRXZlbnQgKj4gICAgIG1Db25maWdFdmVudHM7CisgICAgICAgICAgICAgICAgVmVjdG9yPCBzcDxDb25maWdFdmVudD4gPiAgICAgbUNvbmZpZ0V2ZW50czsKIAogICAgICAgICAgICAgICAgIC8vIFRoZXNlIGZpZWxkcyBhcmUgd3JpdHRlbiBhbmQgcmVhZCBieSB0aHJlYWQgaXRzZWxmIHdpdGhvdXQgbG9jayBvciBiYXJyaWVyLAotICAgICAgICAgICAgICAgIC8vIGFuZCByZWFkIGJ5IG90aGVyIHRocmVhZHMgd2l0aG91dCBsb2NrIG9yIGJhcnJpZXIgdmlhIHN0YW5kYnkoKSAsIG91dERldmljZSgpCisgICAgICAgICAgICAgICAgLy8gYW5kIHJlYWQgYnkgb3RoZXIgdGhyZWFkcyB3aXRob3V0IGxvY2sgb3IgYmFycmllciB2aWEgc3RhbmRieSgpLCBvdXREZXZpY2UoKQogICAgICAgICAgICAgICAgIC8vIGFuZCBpbkRldmljZSgpLgogICAgICAgICAgICAgICAgIC8vIEJlY2F1c2Ugb2YgdGhlIGFic2VuY2Ugb2YgYSBsb2NrIG9yIGJhcnJpZXIsIGFueSBvdGhlciB0aHJlYWQgdGhhdCByZWFkcwogICAgICAgICAgICAgICAgIC8vIHRoZXNlIGZpZWxkcyBtdXN0IHVzZSB0aGUgaW5mb3JtYXRpb24gaW4gaXNvbGF0aW9uLCBvciBiZSBwcmVwYXJlZCB0byBkZWFsCiAgICAgICAgICAgICAgICAgLy8gd2l0aCBwb3NzaWJpbGl0eSB0aGF0IGl0IG1pZ2h0IGJlIGluY29uc2lzdGVudCB3aXRoIG90aGVyIGluZm9ybWF0aW9uLgotICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1TdGFuZGJ5OyAgIC8vIFdoZXRoZXIgdGhyZWFkIGlzIGN1cnJlbnRseSBpbiBzdGFuZGJ5LgorICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1TdGFuZGJ5OyAgICAgLy8gV2hldGhlciB0aHJlYWQgaXMgY3VycmVudGx5IGluIHN0YW5kYnkuCiAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICAgICAgICAgbU91dERldmljZTsgICAvLyBvdXRwdXQgZGV2aWNlCiAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICAgICAgICAgbUluRGV2aWNlOyAgICAvLyBpbnB1dCBkZXZpY2UKICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCAgICAgICAgICBtQXVkaW9Tb3VyY2U7IC8vIChzZWUgYXVkaW8uaCwgYXVkaW9fc291cmNlX3QpCkBAIC0zNjAsNyArNDczLDYgQEAKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKICAgICAvLyBUaHJlYWQgdmlydHVhbHMKLSAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICByZWFkeVRvUnVuKCk7CiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgdGhyZWFkTG9vcCgpOwogCiAgICAgLy8gUmVmQmFzZQpAQCAtMzkzLDcgKzUwNSw3IEBACiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgd2FpdGluZ0FzeW5jQ2FsbGJhY2soKTsKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICB3YWl0aW5nQXN5bmNDYWxsYmFja19sKCk7CiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgc2hvdWxkU3RhbmRieV9sKCk7Ci0KKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBvbkFkZE5ld1RyYWNrX2woKTsKIAogICAgIC8vIFRocmVhZEJhc2UgdmlydHVhbHMKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBwcmVFeGl0KCk7CkBAIC00MjEsMTMgKzUzMywxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpwRnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCAqZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHRpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMgLypub24tTlVMTCovKTsKIAogICAgICAgICAgICAgICAgIEF1ZGlvU3RyZWFtT3V0KiBnZXRPdXRwdXQoKSBjb25zdDsKICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbU91dCogY2xlYXJPdXRwdXQoKTsKQEAgLTQ0Nyw5ICs1NTksMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9sb2FkKCZtU3VzcGVuZGVkKSA+IDA7IH0KIAogICAgIHZpcnR1YWwgICAgIFN0cmluZzggICAgIGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cyk7Ci0gICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgYXVkaW9Db25maWdDaGFuZ2VkX2woaW50IGV2ZW50LCBpbnQgcGFyYW0gPSAwKTsKLSAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXRSZW5kZXJQb3NpdGlvbihzaXplX3QgKmhhbEZyYW1lcywgc2l6ZV90ICpkc3BGcmFtZXMpOwotICAgICAgICAgICAgICAgIGludDE2X3QgICAgICptaXhCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtTWl4QnVmZmVyOyB9OworICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGF1ZGlvQ29uZmlnQ2hhbmdlZChpbnQgZXZlbnQsIGludCBwYXJhbSA9IDApOworICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpoYWxGcmFtZXMsIHVpbnQzMl90ICpkc3BGcmFtZXMpOworICAgICAgICAgICAgICAgIC8vIEZJWE1FIHJlbmFtZSBtaXhCdWZmZXIoKSB0byBzaW5rQnVmZmVyKCkgYW5kIHJlbW92ZSBpbnQxNl90KiBkZXBlbmRlbmN5LgorICAgICAgICAgICAgICAgIC8vIENvbnNpZGVyIGFsc28gcmVtb3ZpbmcgYW5kIHBhc3NpbmcgYW4gZXhwbGljaXQgbU1haW5CdWZmZXIgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgICAgICAgICAvLyBwYXJhbWV0ZXIgdG8gQUY6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6VHJhY2soKS4KKyAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAqbWl4QnVmZmVyKCkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90ICo+KG1TaW5rQnVmZmVyKTsgfTsKIAogICAgIHZpcnR1YWwgICAgIHZvaWQgZGV0YWNoQXV4RWZmZWN0X2woaW50IGVmZmVjdElkKTsKICAgICAgICAgICAgICAgICBzdGF0dXNfdCBhdHRhY2hBdXhFZmZlY3QoY29uc3Qgc3A8QXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s+IHRyYWNrLApAQCAtNDc0LDE0ICs1OTAsNzYgQEAKICAgICAgICAgICAgICAgICAvLyBSZXR1cm4ncyB0aGUgSEFMJ3MgZnJhbWUgY291bnQgaS5lLiBmYXN0IG1peGVyIGJ1ZmZlciBzaXplLgogICAgICAgICAgICAgICAgIHNpemVfdCAgICAgIGZyYW1lQ291bnRIQUwoKSBjb25zdCB7IHJldHVybiBtRnJhbWVDb3VudDsgfQogCi0gICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgICBnZXRUaW1lc3RhbXBfbChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXRUaW1lc3RhbXBfbChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKTsKKworICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGFkZFBhdGNoVHJhY2soY29uc3Qgc3A8UGF0Y2hUcmFjaz4mIHRyYWNrKTsKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkZWxldGVQYXRjaFRyYWNrKGNvbnN0IHNwPFBhdGNoVHJhY2s+JiB0cmFjayk7CisKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBnZXRBdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOwogCiBwcm90ZWN0ZWQ6Ci0gICAgLy8gdXBkYXRlZCBieSByZWFkT3V0cHV0UGFyYW1ldGVycygpCisgICAgLy8gdXBkYXRlZCBieSByZWFkT3V0cHV0UGFyYW1ldGVyc19sKCkKICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50OyAgLy8gbm9ybWFsIG1peGVyIGFuZCBlZmZlY3RzCiAKLSAgICBpbnQxNl90KiAgICAgICAgICAgICAgICAgICAgICAgIG1NaXhCdWZmZXI7ICAgICAgICAgLy8gZnJhbWUgc2l6ZSBhbGlnbmVkIG1peCBidWZmZXIKLSAgICBpbnQ4X3QqICAgICAgICAgICAgICAgICAgICAgICAgIG1BbGxvY01peEJ1ZmZlcjsgICAgLy8gbWl4ZXIgYnVmZmVyIGFsbG9jYXRpb24gYWRkcmVzcworICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNpbmtCdWZmZXI7ICAgICAgICAgLy8gZnJhbWUgc2l6ZSBhbGlnbmVkIHNpbmsgYnVmZmVyCisKKyAgICAvLyBUT0RPOgorICAgIC8vIFJlYXJyYW5nZSB0aGUgYnVmZmVyIGluZm8gaW50byBhIHN0cnVjdC9jbGFzcyB3aXRoCisgICAgLy8gY2xlYXIsIGNvcHksIGNvbnN0cnVjdGlvbiwgZGVzdHJ1Y3Rpb24gbWV0aG9kcy4KKyAgICAvLworICAgIC8vIG1TaW5rQnVmZmVyIGFsc28gaGFzIGFzc29jaWF0ZWQgd2l0aCBpdDoKKyAgICAvLworICAgIC8vIG1TaW5rQnVmZmVyU2l6ZTogU2luayBCdWZmZXIgU2l6ZQorICAgIC8vIG1Gb3JtYXQ6IFNpbmsgQnVmZmVyIEZvcm1hdAorCisgICAgLy8gTWl4ZXIgQnVmZmVyIChtTWl4ZXJCdWZmZXIqKQorICAgIC8vCisgICAgLy8gSW4gdGhlIGNhc2Ugb2YgZmxvYXRpbmcgcG9pbnQgb3IgbXVsdGljaGFubmVsIGRhdGEsIHdoaWNoIGlzIG5vdCBpbiB0aGUKKyAgICAvLyBzaW5rIGZvcm1hdCwgaXQgaXMgcmVxdWlyZWQgdG8gYWNjdW11bGF0ZSBpbiBhIGhpZ2hlciBwcmVjaXNpb24gb3IgZ3JlYXRlciBjaGFubmVsIGNvdW50CisgICAgLy8gYnVmZmVyIGJlZm9yZSBkb3dubWl4aW5nIG9yIGRhdGEgY29udmVyc2lvbiB0byB0aGUgc2luayBidWZmZXIuCisKKyAgICAvLyBTZXQgdG8gInRydWUiIHRvIGVuYWJsZSB0aGUgTWl4ZXIgQnVmZmVyIG90aGVyd2lzZSBtaXhlciBvdXRwdXQgZ29lcyB0byBzaW5rIGJ1ZmZlci4KKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NaXhlckJ1ZmZlckVuYWJsZWQ7CisKKyAgICAvLyBTdG9yYWdlLCAzMiBieXRlIGFsaWduZWQgKG1heSBtYWtlIHRoaXMgYWxpZ25tZW50IGEgcmVxdWlyZW1lbnQgbGF0ZXIpLgorICAgIC8vIER1ZSB0byBjb25zdHJhaW50cyBvbiBtTm9ybWFsRnJhbWVDb3VudCwgdGhlIGJ1ZmZlciBzaXplIGlzIGEgbXVsdGlwbGUgb2YgMTYgZnJhbWVzLgorICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1peGVyQnVmZmVyOworCisgICAgLy8gU2l6ZSBvZiBtTWl4ZXJCdWZmZXIgaW4gYnl0ZXM6IG1Ob3JtYWxGcmFtZUNvdW50ICogI2NoYW5uZWxzICogc2FtcHNpemUuCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICBtTWl4ZXJCdWZmZXJTaXplOworCisgICAgLy8gVGhlIGF1ZGlvIGZvcm1hdCBvZiBtTWl4ZXJCdWZmZXIuIFNldCB0byBBVURJT19GT1JNQVRfUENNXyhGTE9BVHwxNl9CSVQpIG9ubHkuCisgICAgYXVkaW9fZm9ybWF0X3QgICAgICAgICAgICAgICAgICBtTWl4ZXJCdWZmZXJGb3JtYXQ7CisKKyAgICAvLyBBbiBpbnRlcm5hbCBmbGFnIHNldCB0byB0cnVlIGJ5IE1peGVyVGhyZWFkOjpwcmVwYXJlVHJhY2tzX2woKQorICAgIC8vIHdoZW4gbU1peGVyQnVmZmVyIGNvbnRhaW5zIHZhbGlkIGRhdGEgYWZ0ZXIgbWl4aW5nLgorICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1peGVyQnVmZmVyVmFsaWQ7CisKKyAgICAvLyBFZmZlY3RzIEJ1ZmZlciAobUVmZmVjdHNCdWZmZXIqKQorICAgIC8vCisgICAgLy8gSW4gdGhlIGNhc2Ugb2YgZWZmZWN0cyBkYXRhLCB3aGljaCBpcyBub3QgaW4gdGhlIHNpbmsgZm9ybWF0LAorICAgIC8vIGl0IGlzIHJlcXVpcmVkIHRvIGFjY3VtdWxhdGUgaW4gYSBkaWZmZXJlbnQgYnVmZmVyIGJlZm9yZSBkYXRhIGNvbnZlcnNpb24KKyAgICAvLyB0byB0aGUgc2luayBidWZmZXIuCisKKyAgICAvLyBTZXQgdG8gInRydWUiIHRvIGVuYWJsZSB0aGUgRWZmZWN0cyBCdWZmZXIgb3RoZXJ3aXNlIGVmZmVjdHMgb3V0cHV0IGdvZXMgdG8gc2luayBidWZmZXIuCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWZmZWN0QnVmZmVyRW5hYmxlZDsKKworICAgIC8vIFN0b3JhZ2UsIDMyIGJ5dGUgYWxpZ25lZCAobWF5IG1ha2UgdGhpcyBhbGlnbm1lbnQgYSByZXF1aXJlbWVudCBsYXRlcikuCisgICAgLy8gRHVlIHRvIGNvbnN0cmFpbnRzIG9uIG1Ob3JtYWxGcmFtZUNvdW50LCB0aGUgYnVmZmVyIHNpemUgaXMgYSBtdWx0aXBsZSBvZiAxNiBmcmFtZXMuCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICBtRWZmZWN0QnVmZmVyOworCisgICAgLy8gU2l6ZSBvZiBtRWZmZWN0c0J1ZmZlciBpbiBieXRlczogbU5vcm1hbEZyYW1lQ291bnQgKiAjY2hhbm5lbHMgKiBzYW1wc2l6ZS4KKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZmZlY3RCdWZmZXJTaXplOworCisgICAgLy8gVGhlIGF1ZGlvIGZvcm1hdCBvZiBtRWZmZWN0c0J1ZmZlci4gU2V0IHRvIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIG9ubHkuCisgICAgYXVkaW9fZm9ybWF0X3QgICAgICAgICAgICAgICAgICBtRWZmZWN0QnVmZmVyRm9ybWF0OworCisgICAgLy8gQW4gaW50ZXJuYWwgZmxhZyBzZXQgdG8gdHJ1ZSBieSBNaXhlclRocmVhZDo6cHJlcGFyZVRyYWNrc19sKCkKKyAgICAvLyB3aGVuIG1FZmZlY3RzQnVmZmVyIGNvbnRhaW5zIHZhbGlkIGRhdGEgYWZ0ZXIgbWl4aW5nLgorICAgIC8vCisgICAgLy8gV2hlbiB0aGlzIGlzIHNldCwgYWxsIG1peGVyIGRhdGEgaXMgcm91dGVkIGludG8gdGhlIGVmZmVjdHMgYnVmZmVyCisgICAgLy8gZm9yIGFueSBwcm9jZXNzaW5nIChpbmNsdWRpbmcgb3V0cHV0IHByb2Nlc3NpbmcpLgorICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVmZmVjdEJ1ZmZlclZhbGlkOwogCiAgICAgLy8gc3VzcGVuZCBjb3VudCwgPiAwIG1lYW5zIHN1c3BlbmRlZC4gIFdoaWxlIHN1c3BlbmRlZCwgdGhlIHRocmVhZCBjb250aW51ZXMgdG8gcHVsbCBmcm9tCiAgICAgLy8gdHJhY2tzIGFuZCBtaXgsIGJ1dCBkb2Vzbid0IHdyaXRlIHRvIEhBTC4gIEEyRFAgYW5kIFNDTyBIQUwgaW1wbGVtZW50YXRpb25zIGNhbid0IGhhbmRsZQpAQCAtNTA3LDcgKzY4NSw4IEBACiAKICAgICAvLyBBbGxvY2F0ZSBhIHRyYWNrIG5hbWUgZm9yIGEgZ2l2ZW4gY2hhbm5lbCBtYXNrLgogICAgIC8vICAgUmV0dXJucyBuYW1lID49IDAgaWYgc3VjY2Vzc2Z1bCwgLTEgb24gZmFpbHVyZS4KLSAgICB2aXJ0dWFsIGludCAgICAgICAgICAgICBnZXRUcmFja05hbWVfbChhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgaW50IHNlc3Npb25JZCkgPSAwOworICAgIHZpcnR1YWwgaW50ICAgICAgICAgICAgIGdldFRyYWNrTmFtZV9sKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50IHNlc3Npb25JZCkgPSAwOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIGRlbGV0ZVRyYWNrTmFtZV9sKGludCBuYW1lKSA9IDA7CiAKICAgICAvLyBUaW1lIHRvIHNsZWVwIGJldHdlZW4gY3ljbGVzIHdoZW46CkBAIC01MjksMTEgKzcwOCwxNCBAQAogCiAgICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgY29ycmVjdExhdGVuY3lfbCh1aW50MzJfdCBsYXRlbmN5KSBjb25zdDsKIAorICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIGNyZWF0ZUF1ZGlvUGF0Y2hfbChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKTsKKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICByZWxlYXNlQXVkaW9QYXRjaF9sKGNvbnN0IGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7CisKIHByaXZhdGU6CiAKICAgICBmcmllbmQgY2xhc3MgQXVkaW9GbGluZ2VyOyAgICAgIC8vIGZvciBudW1lcm91cwogCi0gICAgUGxheWJhY2tUaHJlYWQoY29uc3QgQ2xpZW50Jik7CiAgICAgUGxheWJhY2tUaHJlYWQmIG9wZXJhdG9yID0gKGNvbnN0IFBsYXliYWNrVGhyZWFkJik7CiAKICAgICBzdGF0dXNfdCAgICBhZGRUcmFja19sKGNvbnN0IHNwPFRyYWNrPiYgdHJhY2spOwpAQCAtNTQxLDcgKzcyMyw3IEBACiAgICAgdm9pZCAgICAgICAgcmVtb3ZlVHJhY2tfbChjb25zdCBzcDxUcmFjaz4mIHRyYWNrKTsKICAgICB2b2lkICAgICAgICBicm9hZGNhc3RfbCgpOwogCi0gICAgdm9pZCAgICAgICAgcmVhZE91dHB1dFBhcmFtZXRlcnMoKTsKKyAgICB2b2lkICAgICAgICByZWFkT3V0cHV0UGFyYW1ldGVyc19sKCk7CiAKICAgICB2aXJ0dWFsIHZvaWQgZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogICAgIHZvaWQgICAgICAgIGR1bXBUcmFja3MoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKQEAgLTU2MCw3ICs3NDIsNyBAQAogCiAgICAgLy8gRklYTUUgcmVuYW1lIHRoZXNlIGZvcm1lciBsb2NhbCB2YXJpYWJsZXMgb2YgdGhyZWFkTG9vcCB0byBzdGFuZGFyZCAibSIgbmFtZXMKICAgICBuc2Vjc190ICAgICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYnlUaW1lOwotICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4QnVmZmVyU2l6ZTsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgIG1TaW5rQnVmZmVyU2l6ZTsKIAogICAgIC8vIGNhY2hlZCBjb3BpZXMgb2YgYWN0aXZlU2xlZXBUaW1lVXMoKSBhbmQgaWRsZVNsZWVwVGltZVVzKCkgbWFkZSBieSBjYWNoZVBhcmFtZXRlcnNfbCgpCiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVTbGVlcFRpbWU7CkBAIC02MjUsMTMgKzgwNywxMiBAQAogICAgIHNwPE5CTG9nOjpXcml0ZXI+ICAgICAgIG1GYXN0TWl4ZXJOQkxvZ1dyaXRlcjsKIHB1YmxpYzoKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBoYXNGYXN0TWl4ZXIoKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCAgICAgRmFzdFRyYWNrVW5kZXJydW5zIGdldEZhc3RUcmFja1VuZGVycnVucyhzaXplX3QgZmFzdEluZGV4KSBjb25zdAorICAgIHZpcnR1YWwgICAgIEZhc3RUcmFja1VuZGVycnVucyBnZXRGYXN0VHJhY2tVbmRlcnJ1bnMoc2l6ZV90IGZhc3RJbmRleCBfX3VudXNlZCkgY29uc3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBGYXN0VHJhY2tVbmRlcnJ1bnMgZHVtbXk7IHJldHVybiBkdW1teTsgfQogCiBwcm90ZWN0ZWQ6CiAgICAgICAgICAgICAgICAgLy8gYWNjZXNzZWQgYnkgYm90aCBiaW5kZXIgdGhyZWFkcyBhbmQgd2l0aGluIHRocmVhZExvb3AoKSwgbG9jayBvbiBtdXRleCBuZWVkZWQKICAgICAgICAgICAgICAgICB1bnNpZ25lZCAgICBtRmFzdFRyYWNrQXZhaWxNYXNrOyAgICAvLyBiaXQgaSBzZXQgaWYgZmFzdCB0cmFjayBbaV0gaXMgYXZhaWxhYmxlCi0gICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZmx1c2hPdXRwdXRfbCgpOwogCiBwcml2YXRlOgogICAgIC8vIHRpbWVzdGFtcCBsYXRjaDoKQEAgLTY0MCw4ICs4MjEsMTEgQEAKICAgICBzdHJ1Y3QgewogICAgICAgICBBdWRpb1RpbWVzdGFtcCAgbVRpbWVzdGFtcDsKICAgICAgICAgdWludDMyX3QgICAgICAgIG1VbnByZXNlbnRlZEZyYW1lczsKKyAgICAgICAgS2V5ZWRWZWN0b3I8VHJhY2sgKiwgdWludDMyX3Q+IG1GcmFtZXNSZWxlYXNlZDsKICAgICB9IG1MYXRjaEQsIG1MYXRjaFE7Ci0gICAgYm9vbCBtTGF0Y2hEVmFsaWQ7ICAvLyB0cnVlIG1lYW5zIG1MYXRjaEQgaXMgdmFsaWQsIGFuZCBjbG9jayBpdCBpbnRvIGxhdGNoIGF0IG5leHQgb3Bwb3J0dW5pdHkKKyAgICBib29sIG1MYXRjaERWYWxpZDsgIC8vIHRydWUgbWVhbnMgbUxhdGNoRCBpcyB2YWxpZAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIChleGNlcHQgZm9yIG1GcmFtZXNSZWxlYXNlZCB3aGljaCBpcyBmaWxsZWQgaW4gbGF0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGFuZCBjbG9jayBpdCBpbnRvIGxhdGNoIGF0IG5leHQgb3Bwb3J0dW5pdHkKICAgICBib29sIG1MYXRjaFFWYWxpZDsgIC8vIHRydWUgbWVhbnMgbUxhdGNoUSBpcyB2YWxpZAogfTsKIApAQCAtNjU2LDEyICs4NDAsMTQgQEAKIAogICAgIC8vIFRocmVhZCB2aXJ0dWFscwogCi0gICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgY2hlY2tGb3JOZXdQYXJhbWV0ZXJzX2woKTsKKyAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBjaGVja0Zvck5ld1BhcmFtZXRlcl9sKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190JiBzdGF0dXMpOwogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgICAgIG1peGVyX3N0YXRlIHByZXBhcmVUcmFja3NfbChWZWN0b3I8IHNwPFRyYWNrPiA+ICp0cmFja3NUb1JlbW92ZSk7Ci0gICAgdmlydHVhbCAgICAgaW50ICAgICAgICAgZ2V0VHJhY2tOYW1lX2woYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssIGludCBzZXNzaW9uSWQpOworICAgIHZpcnR1YWwgICAgIGludCAgICAgICAgIGdldFRyYWNrTmFtZV9sKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50IHNlc3Npb25JZCk7CiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZGVsZXRlVHJhY2tOYW1lX2woaW50IG5hbWUpOwogICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIGlkbGVTbGVlcFRpbWVVcygpIGNvbnN0OwogICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIHN1c3BlbmRTbGVlcFRpbWVVcygpIGNvbnN0OwpAQCAtNjc4LDcgKzg2NCw3IEBACiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlciogbUF1ZGlvTWl4ZXI7ICAgIC8vIG5vcm1hbCBtaXhlcgogcHJpdmF0ZToKICAgICAgICAgICAgICAgICAvLyBvbmUtdGltZSBpbml0aWFsaXphdGlvbiwgbm8gbG9ja3MgcmVxdWlyZWQKLSAgICAgICAgICAgICAgICBGYXN0TWl4ZXIqICBtRmFzdE1peGVyOyAgICAgICAgIC8vIG5vbi1OVUxMIGlmIHRoZXJlIGlzIGFsc28gYSBmYXN0IG1peGVyCisgICAgICAgICAgICAgICAgc3A8RmFzdE1peGVyPiAgICAgbUZhc3RNaXhlcjsgICAgIC8vIG5vbi0wIGlmIHRoZXJlIGlzIGFsc28gYSBmYXN0IG1peGVyCiAgICAgICAgICAgICAgICAgc3A8QXVkaW9XYXRjaGRvZz4gbUF1ZGlvV2F0Y2hkb2c7IC8vIG5vbi0wIGlmIHRoZXJlIGlzIGFuIGF1ZGlvIHdhdGNoZG9nIHRocmVhZAogCiAgICAgICAgICAgICAgICAgLy8gY29udGVudHMgYXJlIG5vdCBndWFyYW50ZWVkIHRvIGJlIGNvbnNpc3RlbnQsIG5vIGxvY2tzIHJlcXVpcmVkCkBAIC02OTQsMTEgKzg4MCwxMiBAQAogICAgICAgICAgICAgICAgIGludDMyX3QgICAgIG1GYXN0TWl4ZXJGdXRleDsgICAgLy8gZm9yIGNvbGQgaWRsZQogCiBwdWJsaWM6Ci0gICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgaGFzRmFzdE1peGVyKCkgY29uc3QgeyByZXR1cm4gbUZhc3RNaXhlciAhPSBOVUxMOyB9CisgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgaGFzRmFzdE1peGVyKCkgY29uc3QgeyByZXR1cm4gbUZhc3RNaXhlciAhPSAwOyB9CiAgICAgdmlydHVhbCAgICAgRmFzdFRyYWNrVW5kZXJydW5zIGdldEZhc3RUcmFja1VuZGVycnVucyhzaXplX3QgZmFzdEluZGV4KSBjb25zdCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChmYXN0SW5kZXggPCBGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3MpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1GYXN0TWl4ZXJEdW1wU3RhdGUubVRyYWNrc1tmYXN0SW5kZXhdLm1VbmRlcnJ1bnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCiB9OwogCiBjbGFzcyBEaXJlY3RPdXRwdXRUaHJlYWQgOiBwdWJsaWMgUGxheWJhY2tUaHJlYWQgewpAQCAtNzEwLDEwICs4OTcsMTMgQEAKIAogICAgIC8vIFRocmVhZCB2aXJ0dWFscwogCi0gICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgY2hlY2tGb3JOZXdQYXJhbWV0ZXJzX2woKTsKKyAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBjaGVja0Zvck5ld1BhcmFtZXRlcl9sKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190JiBzdGF0dXMpOworICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGZsdXNoSHdfbCgpOwogCiBwcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCAgICAgaW50ICAgICAgICAgZ2V0VHJhY2tOYW1lX2woYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssIGludCBzZXNzaW9uSWQpOworICAgIHZpcnR1YWwgICAgIGludCAgICAgICAgIGdldFRyYWNrTmFtZV9sKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50IHNlc3Npb25JZCk7CiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZGVsZXRlVHJhY2tOYW1lX2woaW50IG5hbWUpOwogICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIGFjdGl2ZVNsZWVwVGltZVVzKCkgY29uc3Q7CiAgICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgaWRsZVNsZWVwVGltZVVzKCkgY29uc3Q7CkBAIC03NDUsMTkgKzkzNSwxNyBAQAogICAgIE9mZmxvYWRUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLCBBdWRpb1N0cmVhbU91dCogb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaWQsIHVpbnQzMl90IGRldmljZSk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgfk9mZmxvYWRUaHJlYWQoKSB7fTsKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBmbHVzaEh3X2woKTsKIAogcHJvdGVjdGVkOgogICAgIC8vIHRocmVhZExvb3Agc25pcHBldHMKICAgICB2aXJ0dWFsICAgICBtaXhlcl9zdGF0ZSBwcmVwYXJlVHJhY2tzX2woVmVjdG9yPCBzcDxUcmFjaz4gPiAqdHJhY2tzVG9SZW1vdmUpOwogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHRocmVhZExvb3BfZXhpdCgpOwotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGZsdXNoT3V0cHV0X2woKTsKIAogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIHdhaXRpbmdBc3luY0NhbGxiYWNrKCk7CiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgd2FpdGluZ0FzeW5jQ2FsbGJhY2tfbCgpOwogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIHNob3VsZFN0YW5kYnlfbCgpOwotCi1wcml2YXRlOgotICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGZsdXNoSHdfbCgpOworICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIG9uQWRkTmV3VHJhY2tfbCgpOwogCiBwcml2YXRlOgogICAgIGJvb2wgICAgICAgIG1Id1BhdXNlZDsKQEAgLTg0MCwxNyArMTAyOCwyOCBAQAogCiAKIC8vIHJlY29yZCB0aHJlYWQKLWNsYXNzIFJlY29yZFRocmVhZCA6IHB1YmxpYyBUaHJlYWRCYXNlLCBwdWJsaWMgQXVkaW9CdWZmZXJQcm92aWRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVyaXZlcyBmcm9tIEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlIGZvciB1c2UgYnkgcmVzYW1wbGVyCitjbGFzcyBSZWNvcmRUaHJlYWQgOiBwdWJsaWMgVGhyZWFkQmFzZQogewogcHVibGljOgogCisgICAgY2xhc3MgUmVjb3JkVHJhY2s7CisgICAgY2xhc3MgUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIgOiBwdWJsaWMgQXVkaW9CdWZmZXJQcm92aWRlcgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVyaXZlcyBmcm9tIEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlIGZvciB1c2UgYnkgcmVzYW1wbGVyCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgICAgUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIoUmVjb3JkVHJhY2sqIHJlY29yZFRyYWNrKSA6IG1SZWNvcmRUcmFjayhyZWNvcmRUcmFjaykgeyB9CisgICAgICAgIHZpcnR1YWwgflJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyKCkgeyB9CisgICAgICAgIC8vIEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0TmV4dEJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlciwgaW50NjRfdCBwdHMpOworICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHJlbGVhc2VCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpOworICAgIHByaXZhdGU6CisgICAgICAgIFJlY29yZFRyYWNrICogY29uc3QgbVJlY29yZFRyYWNrOworICAgIH07CisKICNpbmNsdWRlICJSZWNvcmRUcmFja3MuaCIKIAogICAgICAgICAgICAgUmVjb3JkVGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwKICAgICAgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1JbiAqaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwKICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG91dERldmljZSwKICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGluRGV2aWNlCkBAIC04NjksMjMgKzEwNjgsMjggQEAKIAogICAgIC8vIFRocmVhZCB2aXJ0dWFscwogICAgIHZpcnR1YWwgYm9vbCAgICAgICAgdGhyZWFkTG9vcCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcmVhZHlUb1J1bigpOwogCiAgICAgLy8gUmVmQmFzZQogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgb25GaXJzdFJlZigpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBpbml0Q2hlY2soKSBjb25zdCB7IHJldHVybiAobUlucHV0ID09IE5VTEwpID8gTk9fSU5JVCA6IE5PX0VSUk9SOyB9CisKKyAgICB2aXJ0dWFsIHNwPE1lbW9yeURlYWxlcj4gICAgcmVhZE9ubHlIZWFwKCkgY29uc3QgeyByZXR1cm4gbVJlYWRPbmx5SGVhcDsgfQorCisgICAgdmlydHVhbCBzcDxJTWVtb3J5PiBwaXBlTWVtb3J5KCkgY29uc3QgeyByZXR1cm4gbVBpcGVNZW1vcnk7IH0KKwogICAgICAgICAgICAgc3A8QXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrPiAgY3JlYXRlUmVjb3JkVHJhY2tfbCgKICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9GbGluZ2VyOjpDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnBGcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICBzaXplX3QgKm5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgaW50IHVpZCwKICAgICAgICAgICAgICAgICAgICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCAqZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgIHBpZF90IHRpZCwKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMgLypub24tTlVMTCovKTsKIAogICAgICAgICAgICAgc3RhdHVzX3QgICAgc3RhcnQoUmVjb3JkVHJhY2sqIHJlY29yZFRyYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCBldmVudCwKQEAgLTg5OSwxNSArMTEwMywyMSBAQAogICAgICAgICAgICAgQXVkaW9TdHJlYW1JbiogY2xlYXJJbnB1dCgpOwogICAgICAgICAgICAgdmlydHVhbCBhdWRpb19zdHJlYW1fdCogc3RyZWFtKCkgY29uc3Q7CiAKLSAgICAvLyBBdWRpb0J1ZmZlclByb3ZpZGVyIGludGVyZmFjZQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0TmV4dEJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlciwgaW50NjRfdCBwdHMpOwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgcmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcik7CiAKLSAgICB2aXJ0dWFsIGJvb2wgICAgICAgIGNoZWNrRm9yTmV3UGFyYW1ldGVyc19sKCk7CisgICAgdmlydHVhbCBib29sICAgICAgICBjaGVja0Zvck5ld1BhcmFtZXRlcl9sKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QmIHN0YXR1cyk7CisgICAgdmlydHVhbCB2b2lkICAgICAgICBjYWNoZVBhcmFtZXRlcnNfbCgpIHt9CiAgICAgdmlydHVhbCBTdHJpbmc4ICAgICBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpOwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgYXVkaW9Db25maWdDaGFuZ2VkX2woaW50IGV2ZW50LCBpbnQgcGFyYW0gPSAwKTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgIHJlYWRJbnB1dFBhcmFtZXRlcnMoKTsKLSAgICB2aXJ0dWFsIHVuc2lnbmVkIGludCAgZ2V0SW5wdXRGcmFtZXNMb3N0KCk7CisgICAgdmlydHVhbCB2b2lkICAgICAgICBhdWRpb0NvbmZpZ0NoYW5nZWQoaW50IGV2ZW50LCBpbnQgcGFyYW0gPSAwKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGNyZWF0ZUF1ZGlvUGF0Y2hfbChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcmVsZWFzZUF1ZGlvUGF0Y2hfbChjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOworCisgICAgICAgICAgICB2b2lkICAgICAgICBhZGRQYXRjaFJlY29yZChjb25zdCBzcDxQYXRjaFJlY29yZD4mIHJlY29yZCk7CisgICAgICAgICAgICB2b2lkICAgICAgICBkZWxldGVQYXRjaFJlY29yZChjb25zdCBzcDxQYXRjaFJlY29yZD4mIHJlY29yZCk7CisKKyAgICAgICAgICAgIHZvaWQgICAgICAgIHJlYWRJbnB1dFBhcmFtZXRlcnNfbCgpOworICAgIHZpcnR1YWwgdWludDMyX3QgICAgZ2V0SW5wdXRGcmFtZXNMb3N0KCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGFkZEVmZmVjdENoYWluX2woY29uc3Qgc3A8RWZmZWN0Q2hhaW4+JiBjaGFpbik7CiAgICAgdmlydHVhbCBzaXplX3QgcmVtb3ZlRWZmZWN0Q2hhaW5fbChjb25zdCBzcDxFZmZlY3RDaGFpbj4mIGNoYWluKTsKQEAgLTkyMiw0NSArMTEzMiw3MyBAQAogICAgIHZpcnR1YWwgYm9vbCAgICAgaXNWYWxpZFN5bmNFdmVudChjb25zdCBzcDxTeW5jRXZlbnQ+JiBldmVudCkgY29uc3Q7CiAKICAgICBzdGF0aWMgdm9pZCBzeW5jU3RhcnRFdmVudENhbGxiYWNrKGNvbnN0IHdwPFN5bmNFdmVudD4mIGV2ZW50KTsKLSAgICAgICAgICAgdm9pZCBoYW5kbGVTeW5jU3RhcnRFdmVudChjb25zdCBzcDxTeW5jRXZlbnQ+JiBldmVudCk7CiAKICAgICB2aXJ0dWFsIHNpemVfdCAgICAgIGZyYW1lQ291bnQoKSBjb25zdCB7IHJldHVybiBtRnJhbWVDb3VudDsgfQotICAgICAgICAgICAgYm9vbCAgICAgICAgaGFzRmFzdFJlY29yZGVyKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgICAgIGJvb2wgICAgICAgIGhhc0Zhc3RDYXB0dXJlKCkgY29uc3QgeyByZXR1cm4gbUZhc3RDYXB0dXJlICE9IDA7IH0KKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGdldEF1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CiAKIHByaXZhdGU6Ci0gICAgICAgICAgICB2b2lkIGNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKLQogICAgICAgICAgICAgLy8gRW50ZXIgc3RhbmRieSBpZiBub3QgYWxyZWFkeSBpbiBzdGFuZGJ5LCBhbmQgc2V0IG1TdGFuZGJ5IGZsYWcKLSAgICAgICAgICAgIHZvaWQgc3RhbmRieSgpOworICAgICAgICAgICAgdm9pZCAgICBzdGFuZGJ5SWZOb3RBbHJlYWR5SW5TdGFuZGJ5KCk7CiAKICAgICAgICAgICAgIC8vIENhbGwgdGhlIEhBTCBzdGFuZGJ5IG1ldGhvZCB1bmNvbmRpdGlvbmFsbHksIGFuZCBkb24ndCBjaGFuZ2UgbVN0YW5kYnkgZmxhZwotICAgICAgICAgICAgdm9pZCBpbnB1dFN0YW5kQnkoKTsKKyAgICAgICAgICAgIHZvaWQgICAgaW5wdXRTdGFuZEJ5KCk7CiAKICAgICAgICAgICAgIEF1ZGlvU3RyZWFtSW4gICAgICAgICAgICAgICAgICAgICAgICptSW5wdXQ7CiAgICAgICAgICAgICBTb3J0ZWRWZWN0b3IgPCBzcDxSZWNvcmRUcmFjaz4gPiAgICBtVHJhY2tzOwotICAgICAgICAgICAgLy8gbUFjdGl2ZVRyYWNrIGhhcyBkdWFsIHJvbGVzOiAgaXQgaW5kaWNhdGVzIHRoZSBjdXJyZW50IGFjdGl2ZSB0cmFjaywgYW5kCisgICAgICAgICAgICAvLyBtQWN0aXZlVHJhY2tzIGhhcyBkdWFsIHJvbGVzOiAgaXQgaW5kaWNhdGVzIHRoZSBjdXJyZW50IGFjdGl2ZSB0cmFjayhzKSwgYW5kCiAgICAgICAgICAgICAvLyBpcyB1c2VkIHRvZ2V0aGVyIHdpdGggbVN0YXJ0U3RvcENvbmQgdG8gaW5kaWNhdGUgc3RhcnQoKS9zdG9wKCkgcHJvZ3Jlc3MKLSAgICAgICAgICAgIHNwPFJlY29yZFRyYWNrPiAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFjazsKKyAgICAgICAgICAgIFNvcnRlZFZlY3Rvcjwgc3A8UmVjb3JkVHJhY2s+ID4gICAgIG1BY3RpdmVUcmFja3M7CisgICAgICAgICAgICAvLyBnZW5lcmF0aW9uIGNvdW50ZXIgZm9yIG1BY3RpdmVUcmFja3MKKyAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFja3NHZW47CiAgICAgICAgICAgICBDb25kaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnRTdG9wQ29uZDsKIAotICAgICAgICAgICAgLy8gdXBkYXRlZCBieSBSZWNvcmRUaHJlYWQ6OnJlYWRJbnB1dFBhcmFtZXRlcnMoKQotICAgICAgICAgICAgQXVkaW9SZXNhbXBsZXIgICAgICAgICAgICAgICAgICAgICAgKm1SZXNhbXBsZXI7Ci0gICAgICAgICAgICAvLyBpbnRlcmxlYXZlZCBzdGVyZW8gcGFpcnMgb2YgZml4ZWQtcG9pbnQgc2lnbmVkIFExOS4xMgotICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1Sc21wT3V0QnVmZmVyOwotICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1Sc21wSW5CdWZmZXI7IC8vIFttRnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnRdCi0gICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUnNtcEluSW5kZXg7Ci0gICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnVmZmVyU2l6ZTsgICAgLy8gc3RyZWFtIGJ1ZmZlciBzaXplIGZvciByZWFkKCkKLSAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgIG1SZXFDaGFubmVsQ291bnQ7Ci0gICAgICAgICAgICBjb25zdCB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICBtUmVxU2FtcGxlUmF0ZTsKLSAgICAgICAgICAgIHNzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CeXRlc1JlYWQ7Ci0gICAgICAgICAgICAvLyBzeW5jIGV2ZW50IHRyaWdnZXJpbmcgYWN0dWFsIGF1ZGlvIGNhcHR1cmUuIEZyYW1lcyByZWFkIGJlZm9yZSB0aGlzIGV2ZW50IHdpbGwKLSAgICAgICAgICAgIC8vIGJlIGRyb3BwZWQgYW5kIHRoZXJlZm9yZSBub3QgcmVhZCBieSB0aGUgYXBwbGljYXRpb24uCi0gICAgICAgICAgICBzcDxTeW5jRXZlbnQ+ICAgICAgICAgICAgICAgICAgICAgICBtU3luY1N0YXJ0RXZlbnQ7Ci0gICAgICAgICAgICAvLyBudW1iZXIgb2YgY2FwdHVyZWQgZnJhbWVzIHRvIGRyb3AgYWZ0ZXIgdGhlIHN0YXJ0IHN5bmMgZXZlbnQgaGFzIGJlZW4gcmVjZWl2ZWQuCi0gICAgICAgICAgICAvLyB3aGVuIDwgMCwgbWF4aW11bSBmcmFtZXMgdG8gZHJvcCBiZWZvcmUgc3RhcnRpbmcgY2FwdHVyZSBldmVuIGlmIHN5bmMgZXZlbnQgaXMKLSAgICAgICAgICAgIC8vIG5vdCByZWNlaXZlZAotICAgICAgICAgICAgc3NpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc3RvRHJvcDsKKyAgICAgICAgICAgIC8vIHJlc2FtcGxlciBjb252ZXJ0cyBpbnB1dCBhdCBIQUwgSHogdG8gb3V0cHV0IGF0IEF1ZGlvUmVjb3JkIGNsaWVudCBIegorICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1Sc21wSW5CdWZmZXI7IC8vIHNlZSBuZXdbXSBmb3IgZGV0YWlscyBvbiB0aGUgc2l6ZQorICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJzbXBJbkZyYW1lczsgIC8vIHNpemUgb2YgcmVzYW1wbGVyIGlucHV0IGluIGZyYW1lcworICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJzbXBJbkZyYW1lc1AyOy8vIHNpemUgcm91bmRlZCB1cCB0byBhIHBvd2VyLW9mLTIKKworICAgICAgICAgICAgLy8gcm9sbGluZyBpbmRleCB0aGF0IGlzIG5ldmVyIGNsZWFyZWQKKyAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sc21wSW5SZWFyOyAgICAvLyBsYXN0IGZpbGxlZCBmcmFtZSArIDEKIAogICAgICAgICAgICAgLy8gRm9yIGR1bXBzeXMKICAgICAgICAgICAgIGNvbnN0IHNwPE5CQUlPX1Npbms+ICAgICAgICAgICAgICAgIG1UZWVTaW5rOworCisgICAgICAgICAgICBjb25zdCBzcDxNZW1vcnlEZWFsZXI+ICAgICAgICAgICAgICBtUmVhZE9ubHlIZWFwOworCisgICAgICAgICAgICAvLyBvbmUtdGltZSBpbml0aWFsaXphdGlvbiwgbm8gbG9ja3MgcmVxdWlyZWQKKyAgICAgICAgICAgIHNwPEZhc3RDYXB0dXJlPiAgICAgICAgICAgICAgICAgICAgIG1GYXN0Q2FwdHVyZTsgICAvLyBub24tMCBpZiB0aGVyZSBpcyBhbHNvIGEgZmFzdCBjYXB0dXJlCisgICAgICAgICAgICAvLyBGSVhNRSBhdWRpbyB3YXRjaGRvZyB0aHJlYWQKKworICAgICAgICAgICAgLy8gY29udGVudHMgYXJlIG5vdCBndWFyYW50ZWVkIHRvIGJlIGNvbnNpc3RlbnQsIG5vIGxvY2tzIHJlcXVpcmVkCisgICAgICAgICAgICBGYXN0Q2FwdHVyZUR1bXBTdGF0ZSAgICAgICAgICAgICAgICBtRmFzdENhcHR1cmVEdW1wU3RhdGU7CisjaWZkZWYgU1RBVEVfUVVFVUVfRFVNUAorICAgICAgICAgICAgLy8gRklYTUUgU3RhdGVRdWV1ZSBvYnNlcnZlciBhbmQgbXV0YXRvciBkdW1wIGZpZWxkcworI2VuZGlmCisgICAgICAgICAgICAvLyBGSVhNRSBhdWRpbyB3YXRjaGRvZyBkdW1wCisKKyAgICAgICAgICAgIC8vIGFjY2Vzc2libGUgb25seSB3aXRoaW4gdGhlIHRocmVhZExvb3AoKSwgbm8gbG9ja3MgcmVxdWlyZWQKKyAgICAgICAgICAgIC8vICAgICAgICAgIG1GYXN0Q2FwdHVyZS0+c3EoKSAgICAgIC8vIGZvciBtdXRhdGluZyBhbmQgcHVzaGluZyBzdGF0ZQorICAgICAgICAgICAgaW50MzJfdCAgICAgbUZhc3RDYXB0dXJlRnV0ZXg7ICAgICAgLy8gZm9yIGNvbGQgaWRsZQorCisgICAgICAgICAgICAvLyBUaGUgSEFMIGlucHV0IHNvdXJjZSBpcyB0cmVhdGVkIGFzIG5vbi1ibG9ja2luZywKKyAgICAgICAgICAgIC8vIGJ1dCBjdXJyZW50IGltcGxlbWVudGF0aW9uIGlzIGJsb2NraW5nCisgICAgICAgICAgICBzcDxOQkFJT19Tb3VyY2U+ICAgICAgICAgICAgICAgICAgICBtSW5wdXRTb3VyY2U7CisgICAgICAgICAgICAvLyBUaGUgc291cmNlIGZvciB0aGUgbm9ybWFsIGNhcHR1cmUgdGhyZWFkIHRvIHJlYWQgZnJvbTogbUlucHV0U291cmNlIG9yIG1QaXBlU291cmNlCisgICAgICAgICAgICBzcDxOQkFJT19Tb3VyY2U+ICAgICAgICAgICAgICAgICAgICBtTm9ybWFsU291cmNlOworICAgICAgICAgICAgLy8gSWYgYSBmYXN0IGNhcHR1cmUgaXMgcHJlc2VudCwgdGhlIG5vbi1ibG9ja2luZyBwaXBlIHNpbmsgd3JpdHRlbiB0byBieSBmYXN0IGNhcHR1cmUsCisgICAgICAgICAgICAvLyBvdGhlcndpc2UgY2xlYXIKKyAgICAgICAgICAgIHNwPE5CQUlPX1Npbms+ICAgICAgICAgICAgICAgICAgICAgIG1QaXBlU2luazsKKyAgICAgICAgICAgIC8vIElmIGEgZmFzdCBjYXB0dXJlIGlzIHByZXNlbnQsIHRoZSBub24tYmxvY2tpbmcgcGlwZSBzb3VyY2UgcmVhZCBieSBub3JtYWwgdGhyZWFkLAorICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGNsZWFyCisgICAgICAgICAgICBzcDxOQkFJT19Tb3VyY2U+ICAgICAgICAgICAgICAgICAgICBtUGlwZVNvdXJjZTsKKyAgICAgICAgICAgIC8vIERlcHRoIG9mIHBpcGUgZnJvbSBmYXN0IGNhcHR1cmUgdG8gbm9ybWFsIHRocmVhZCBhbmQgZmFzdCBjbGllbnRzLCBhbHdheXMgcG93ZXIgb2YgMgorICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBpcGVGcmFtZXNQMjsKKyAgICAgICAgICAgIC8vIElmIGEgZmFzdCBjYXB0dXJlIGlzIHByZXNlbnQsIHRoZSBQaXBlIGFzIElNZW1vcnksIG90aGVyd2lzZSBjbGVhcgorICAgICAgICAgICAgc3A8SU1lbW9yeT4gICAgICAgICAgICAgICAgICAgICAgICAgbVBpcGVNZW1vcnk7CisKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBzaXplX3QgICAgICAgICAgICAgICAgIGtGYXN0Q2FwdHVyZUxvZ1NpemUgPSA0ICogMTAyNDsKKyAgICAgICAgICAgIHNwPE5CTG9nOjpXcml0ZXI+ICAgICAgICAgICAgICAgICAgIG1GYXN0Q2FwdHVyZU5CTG9nV3JpdGVyOworCisgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmFzdFRyYWNrQXZhaWw7ICAgIC8vIHRydWUgaWYgZmFzdCB0cmFjayBhdmFpbGFibGUKIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tCYXNlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tCYXNlLmgKaW5kZXggY2QyMDFkOS4uOThiZjk2ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrQmFzZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja0Jhc2UuaApAQCAtMzQsNyArMzQsMjUgQEAKICAgICAgICAgUkVTVU1JTkcsCiAgICAgICAgIEFDVElWRSwKICAgICAgICAgUEFVU0lORywKLSAgICAgICAgUEFVU0VECisgICAgICAgIFBBVVNFRCwKKyAgICAgICAgU1RBUlRJTkdfMSwgICAgIC8vIGZvciBSZWNvcmRUcmFjayBvbmx5CisgICAgICAgIFNUQVJUSU5HXzIsICAgICAvLyBmb3IgUmVjb3JkVHJhY2sgb25seQorICAgIH07CisKKyAgICAvLyB3aGVyZSB0byBhbGxvY2F0ZSB0aGUgZGF0YSBidWZmZXIKKyAgICBlbnVtIGFsbG9jX3R5cGUgeworICAgICAgICBBTExPQ19DQkxLLCAgICAgLy8gYWxsb2NhdGUgaW1tZWRpYXRlbHkgYWZ0ZXIgY29udHJvbCBibG9jaworICAgICAgICBBTExPQ19SRUFET05MWSwgLy8gYWxsb2NhdGUgZnJvbSBhIHNlcGFyYXRlIHJlYWQtb25seSBoZWFwIHBlciB0aHJlYWQKKyAgICAgICAgQUxMT0NfUElQRSwgICAgIC8vIGRvIG5vdCBhbGxvY2F0ZTsgdXNlIHRoZSBwaXBlIGJ1ZmZlcgorICAgICAgICBBTExPQ19MT0NBTCwgICAgLy8gYWxsb2NhdGUgYSBsb2NhbCBidWZmZXIKKyAgICAgICAgQUxMT0NfTk9ORSwgICAgIC8vIGRvIG5vdCBhbGxvY2F0ZTp1c2UgdGhlIGJ1ZmZlciBwYXNzZWQgdG8gVHJhY2tCYXNlIGNvbnN0cnVjdG9yCisgICAgfTsKKworICAgIGVudW0gdHJhY2tfdHlwZSB7CisgICAgICAgIFRZUEVfREVGQVVMVCwKKyAgICAgICAgVFlQRV9USU1FRCwKKyAgICAgICAgVFlQRV9PVVRQVVQsCisgICAgICAgIFRZUEVfUEFUQ0gsCiAgICAgfTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tCYXNlKFRocmVhZEJhc2UgKnRocmVhZCwKQEAgLTQzLDExICs2MSwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzT3V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NfdHlwZSBhbGxvYyA9IEFMTE9DX0NCTEssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrX3R5cGUgdHlwZSA9IFRZUEVfREVGQVVMVCk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICB+VHJhY2tCYXNlKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBpbml0Q2hlY2soKSBjb25zdDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhcnQoQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCBldmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyaWdnZXJTZXNzaW9uKSA9IDA7CkBAIC01OCw2ICs4MCwxNCBAQAogICAgICAgICAgICAgaW50ICAgICAgICAgdWlkKCkgY29uc3QgeyByZXR1cm4gbVVpZDsgfQogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0U3luY0V2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50KTsKIAorICAgICAgICAgICAgc3A8SU1lbW9yeT4gZ2V0QnVmZmVycygpIGNvbnN0IHsgcmV0dXJuIG1CdWZmZXJNZW1vcnk7IH0KKyAgICAgICAgICAgIHZvaWQqICAgICAgIGJ1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIG1CdWZmZXI7IH0KKyAgICAgICAgICAgIGJvb2wgICAgICAgIGlzRmFzdFRyYWNrKCkgY29uc3QgeyByZXR1cm4gKG1GbGFncyAmIElBdWRpb0ZsaW5nZXI6OlRSQUNLX0ZBU1QpICE9IDA7IH0KKyAgICAgICAgICAgIGJvb2wgICAgICAgIGlzVGltZWRUcmFjaygpIGNvbnN0IHsgcmV0dXJuIChtVHlwZSA9PSBUWVBFX1RJTUVEKTsgfQorICAgICAgICAgICAgYm9vbCAgICAgICAgaXNPdXRwdXRUcmFjaygpIGNvbnN0IHsgcmV0dXJuIChtVHlwZSA9PSBUWVBFX09VVFBVVCk7IH0KKyAgICAgICAgICAgIGJvb2wgICAgICAgIGlzUGF0Y2hUcmFjaygpIGNvbnN0IHsgcmV0dXJuIChtVHlwZSA9PSBUWVBFX1BBVENIKTsgfQorICAgICAgICAgICAgYm9vbCAgICAgICAgaXNFeHRlcm5hbFRyYWNrKCkgY29uc3QgeyByZXR1cm4gIWlzT3V0cHV0VHJhY2soKSAmJiAhaXNQYXRjaFRyYWNrKCk7IH0KKwogcHJvdGVjdGVkOgogICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tCYXNlKGNvbnN0IFRyYWNrQmFzZSYpOwogICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tCYXNlJiBvcGVyYXRvciA9IChjb25zdCBUcmFja0Jhc2UmKTsKQEAgLTc4LDE1ICsxMDgsNiBAQAogCiAgICAgdmlydHVhbCB1aW50MzJfdCBzYW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gbVNhbXBsZVJhdGU7IH0KIAotICAgIC8vIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGEgY29udGlndW91cyBzbGljZSBvZiB0aGUgdHJhY2sgYnVmZmVyLgotICAgIC8vIFBhcmFtZXRlciAnb2Zmc2V0JyBpcyB0aGUgcmVxdWVzdGVkIHN0YXJ0IHBvc2l0aW9uLCBleHByZXNzZWQgaW4KLSAgICAvLyBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgZnJhbWUgdW5pdHMgcmVsYXRpdmUgdG8gdGhlIHRyYWNrIGVwb2NoLgotICAgIC8vIFBhcmFtZXRlciAnZnJhbWVzJyBpcyB0aGUgcmVxdWVzdGVkIGxlbmd0aCwgYWxzbyBpbiBmcmFtZSB1bml0cy4KLSAgICAvLyBBbHdheXMgcmV0dXJucyBub24tTlVMTC4gIEl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0bwotICAgIC8vIHZlcmlmeSB0aGF0IHRoaXMgd2lsbCBiZSBzdWNjZXNzZnVsOyB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhpcwotICAgIC8vIGZ1bmN0aW9uIHdpdGggaW52YWxpZCAnb2Zmc2V0JyBvciAnZnJhbWVzJyBpcyB1bmRlZmluZWQuCi0gICAgdm9pZCogZ2V0QnVmZmVyKHVpbnQzMl90IG9mZnNldCwgdWludDMyX3QgZnJhbWVzKSBjb25zdDsKLQogICAgIGJvb2wgaXNTdG9wcGVkKCkgY29uc3QgewogICAgICAgICByZXR1cm4gKG1TdGF0ZSA9PSBTVE9QUEVEIHx8IG1TdGF0ZSA9PSBGTFVTSEVEKTsKICAgICB9CkBAIC0xMTgsNiArMTM5LDcgQEAKICAgICAvKmNvbnN0Ki8gc3A8Q2xpZW50PiBtQ2xpZW50OyAgIC8vIHNlZSBleHBsYW5hdGlvbiBhdCB+VHJhY2tCYXNlKCkgd2h5IG5vdCBjb25zdAogICAgIHNwPElNZW1vcnk+ICAgICAgICAgbUNibGtNZW1vcnk7CiAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBtQ2JsazsKKyAgICBzcDxJTWVtb3J5PiAgICAgICAgIG1CdWZmZXJNZW1vcnk7ICAvLyBjdXJyZW50bHkgbm9uLTAgZm9yIGZhc3QgUmVjb3JkVHJhY2sgb25seQogICAgIHZvaWQqICAgICAgICAgICAgICAgbUJ1ZmZlcjsgICAgLy8gc3RhcnQgb2YgdHJhY2sgYnVmZmVyLCB0eXBpY2FsbHkgaW4gc2hhcmVkIG1lbW9yeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhjZXB0IGZvciBPdXRwdXRUcmFjayB3aGVuIGl0IGlzIGluIGxvY2FsIG1lbW9yeQogICAgIC8vIHdlIGRvbid0IHJlYWxseSBuZWVkIGEgbG9jayBmb3IgdGhlc2UKQEAgLTEzNiwxMCArMTU4LDI2IEBACiAgICAgY29uc3QgaW50ICAgICAgICAgICBtU2Vzc2lvbklkOwogICAgIGludCAgICAgICAgICAgICAgICAgbVVpZDsKICAgICBWZWN0b3IgPCBzcDxTeW5jRXZlbnQ+ID5tU3luY0V2ZW50czsKKyAgICBjb25zdCBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190IG1GbGFnczsKICAgICBjb25zdCBib29sICAgICAgICAgIG1Jc091dDsKICAgICBTZXJ2ZXJQcm94eSogICAgICAgIG1TZXJ2ZXJQcm94eTsKICAgICBjb25zdCBpbnQgICAgICAgICAgIG1JZDsKICAgICBzcDxOQkFJT19TaW5rPiAgICAgIG1UZWVTaW5rOwogICAgIHNwPE5CQUlPX1NvdXJjZT4gICAgbVRlZVNvdXJjZTsKICAgICBib29sICAgICAgICAgICAgICAgIG1UZXJtaW5hdGVkOworICAgIHRyYWNrX3R5cGUgICAgICAgICAgbVR5cGU7ICAgICAgLy8gbXVzdCBiZSBvbmUgb2YgVFlQRV9ERUZBVUxULCBUWVBFX09VVFBVVCwgVFlQRV9QQVRDSCAuLi4KKyAgICBhdWRpb19pb19oYW5kbGVfdCAgIG1UaHJlYWRJb0hhbmRsZTsgLy8gSS9PIGhhbmRsZSBvZiB0aGUgdGhyZWFkIHRoZSB0cmFjayBpcyBhdHRhY2hlZCB0bworfTsKKworLy8gUGF0Y2hQcm94eUJ1ZmZlclByb3ZpZGVyIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBQYXRjaFRyYWNrIGFuZCBQYXRjaFJlY29yZC4KKy8vIGl0IHByb3ZpZGVzIGJ1ZmZlciBhY2Nlc3MgbWV0aG9kcyB0aGF0IG1hcCB0aG9zZSBvZiBhIENsaWVudFByb3h5IChzZWUgQXVkaW9UcmFja1NoYXJlZC5oKQorY2xhc3MgUGF0Y2hQcm94eUJ1ZmZlclByb3ZpZGVyCit7CitwdWJsaWM6CisKKyAgICB2aXJ0dWFsIH5QYXRjaFByb3h5QnVmZmVyUHJvdmlkZXIoKSB7fQorCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBvYnRhaW5CdWZmZXIoUHJveHk6OkJ1ZmZlciogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqcmVxdWVzdGVkID0gTlVMTCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgcmVsZWFzZUJ1ZmZlcihQcm94eTo6QnVmZmVyKiBidWZmZXIpID0gMDsKIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCmluZGV4IGQ2Yjk5MDguLmI5MzA4ZmEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCkBAIC0yMSw2ICsyMSw3IEBACiAKICNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCiAjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaD4KQEAgLTM0LDYgKzM1LDcgQEAKIAogI2luY2x1ZGUgPG1lZGlhL25iYWlvL1BpcGUuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmFpby9QaXBlUmVhZGVyLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvbWluaWZsb2F0Lmg+CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtNjYsMTAgKzY4LDEzIEBACiAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAotICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKKyAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCiAgICAgICAgICAgICBpbnQgY2xpZW50VWlkLAotICAgICAgICAgICAgYm9vbCBpc091dCkKKyAgICAgICAgICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICBib29sIGlzT3V0LAorICAgICAgICAgICAgYWxsb2NfdHlwZSBhbGxvYywKKyAgICAgICAgICAgIHRyYWNrX3R5cGUgdHlwZSkKICAgICA6ICAgUmVmQmFzZSgpLAogICAgICAgICBtVGhyZWFkKHRocmVhZCksCiAgICAgICAgIG1DbGllbnQoY2xpZW50KSwKQEAgLTc5LDE1ICs4NCwyMCBAQAogICAgICAgICBtU2FtcGxlUmF0ZShzYW1wbGVSYXRlKSwKICAgICAgICAgbUZvcm1hdChmb3JtYXQpLAogICAgICAgICBtQ2hhbm5lbE1hc2soY2hhbm5lbE1hc2spLAotICAgICAgICBtQ2hhbm5lbENvdW50KHBvcGNvdW50KGNoYW5uZWxNYXNrKSksCisgICAgICAgIG1DaGFubmVsQ291bnQoaXNPdXQgPworICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzaykgOgorICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGNoYW5uZWxNYXNrKSksCiAgICAgICAgIG1GcmFtZVNpemUoYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpID8KICAgICAgICAgICAgICAgICBtQ2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpIDogc2l6ZW9mKGludDhfdCkpLAogICAgICAgICBtRnJhbWVDb3VudChmcmFtZUNvdW50KSwKICAgICAgICAgbVNlc3Npb25JZChzZXNzaW9uSWQpLAorICAgICAgICBtRmxhZ3MoZmxhZ3MpLAogICAgICAgICBtSXNPdXQoaXNPdXQpLAogICAgICAgICBtU2VydmVyUHJveHkoTlVMTCksCiAgICAgICAgIG1JZChhbmRyb2lkX2F0b21pY19pbmMoJm5leHRUcmFja0lkKSksCi0gICAgICAgIG1UZXJtaW5hdGVkKGZhbHNlKQorICAgICAgICBtVGVybWluYXRlZChmYWxzZSksCisgICAgICAgIG1UeXBlKHR5cGUpLAorICAgICAgICBtVGhyZWFkSW9IYW5kbGUodGhyZWFkLT5pZCgpKQogewogICAgIC8vIGlmIHRoZSBjYWxsZXIgaXMgdXMsIHRydXN0IHRoZSBzcGVjaWZpZWQgdWlkCiAgICAgaWYgKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSAhPSBnZXRwaWRfY2FjaGVkIHx8IGNsaWVudFVpZCA9PSAtMSkgewpAQCAtMTAxLDI3ICsxMTEsMjAgQEAKICAgICAvLyBiYXR0ZXJ5IHVzYWdlIG9uIGl0LgogICAgIG1VaWQgPSBjbGllbnRVaWQ7CiAKLSAgICAvLyBjbGllbnQgPT0gMCBpbXBsaWVzIHNoYXJlZEJ1ZmZlciA9PSAwCi0gICAgQUxPR19BU1NFUlQoIShjbGllbnQgPT0gMCAmJiBzaGFyZWRCdWZmZXIgIT0gMCkpOwotCi0gICAgQUxPR1ZfSUYoc2hhcmVkQnVmZmVyICE9IDAsICJzaGFyZWRCdWZmZXI6ICVwLCBzaXplOiAlZCIsIHNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpLAotICAgICAgICAgICAgc2hhcmVkQnVmZmVyLT5zaXplKCkpOwotCiAgICAgLy8gQUxPR0QoIkNyZWF0aW5nIHRyYWNrIHdpdGggJWQgYnVmZmVycyBAICVkIGJ5dGVzIiwgYnVmZmVyQ291bnQsIGJ1ZmZlclNpemUpOwogICAgIHNpemVfdCBzaXplID0gc2l6ZW9mKGF1ZGlvX3RyYWNrX2NibGtfdCk7Ci0gICAgc2l6ZV90IGJ1ZmZlclNpemUgPSAoc2hhcmVkQnVmZmVyID09IDAgPyByb3VuZHVwKGZyYW1lQ291bnQpIDogZnJhbWVDb3VudCkgKiBtRnJhbWVTaXplOwotICAgIGlmIChzaGFyZWRCdWZmZXIgPT0gMCkgeworICAgIHNpemVfdCBidWZmZXJTaXplID0gKGJ1ZmZlciA9PSBOVUxMID8gcm91bmR1cChmcmFtZUNvdW50KSA6IGZyYW1lQ291bnQpICogbUZyYW1lU2l6ZTsKKyAgICBpZiAoYnVmZmVyID09IE5VTEwgJiYgYWxsb2MgPT0gQUxMT0NfQ0JMSykgewogICAgICAgICBzaXplICs9IGJ1ZmZlclNpemU7CiAgICAgfQogCiAgICAgaWYgKGNsaWVudCAhPSAwKSB7CiAgICAgICAgIG1DYmxrTWVtb3J5ID0gY2xpZW50LT5oZWFwKCktPmFsbG9jYXRlKHNpemUpOwotICAgICAgICBpZiAobUNibGtNZW1vcnkgIT0gMCkgewotICAgICAgICAgICAgbUNibGsgPSBzdGF0aWNfY2FzdDxhdWRpb190cmFja19jYmxrX3QgKj4obUNibGtNZW1vcnktPnBvaW50ZXIoKSk7Ci0gICAgICAgICAgICAvLyBjYW4ndCBhc3N1bWUgbUNibGsgIT0gTlVMTAotICAgICAgICB9IGVsc2UgeworICAgICAgICBpZiAobUNibGtNZW1vcnkgPT0gMCB8fAorICAgICAgICAgICAgICAgIChtQ2JsayA9IHN0YXRpY19jYXN0PGF1ZGlvX3RyYWNrX2NibGtfdCAqPihtQ2Jsa01lbW9yeS0+cG9pbnRlcigpKSkgPT0gTlVMTCkgewogICAgICAgICAgICAgQUxPR0UoIm5vdCBlbm91Z2ggbWVtb3J5IGZvciBBdWRpb1RyYWNrIHNpemU9JXUiLCBzaXplKTsKICAgICAgICAgICAgIGNsaWVudC0+aGVhcCgpLT5kdW1wKCJBdWRpb1RyYWNrIik7CisgICAgICAgICAgICBtQ2Jsa01lbW9yeS5jbGVhcigpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKQEAgLTEzMywyMiArMTM2LDU1IEBACiAgICAgLy8gY29uc3RydWN0IHRoZSBzaGFyZWQgc3RydWN0dXJlIGluLXBsYWNlLgogICAgIGlmIChtQ2JsayAhPSBOVUxMKSB7CiAgICAgICAgIG5ldyhtQ2JsaykgYXVkaW9fdHJhY2tfY2Jsa190KCk7Ci0gICAgICAgIC8vIGNsZWFyIGFsbCBidWZmZXJzCi0gICAgICAgIG1DYmxrLT5mcmFtZUNvdW50XyA9IGZyYW1lQ291bnQ7Ci0gICAgICAgIGlmIChzaGFyZWRCdWZmZXIgPT0gMCkgewotICAgICAgICAgICAgbUJ1ZmZlciA9IChjaGFyKiltQ2JsayArIHNpemVvZihhdWRpb190cmFja19jYmxrX3QpOworICAgICAgICBzd2l0Y2ggKGFsbG9jKSB7CisgICAgICAgIGNhc2UgQUxMT0NfUkVBRE9OTFk6IHsKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lbW9yeURlYWxlcj4gcm9IZWFwKHRocmVhZC0+cmVhZE9ubHlIZWFwKCkpOworICAgICAgICAgICAgaWYgKHJvSGVhcCA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgIChtQnVmZmVyTWVtb3J5ID0gcm9IZWFwLT5hbGxvY2F0ZShidWZmZXJTaXplKSkgPT0gMCB8fAorICAgICAgICAgICAgICAgICAgICAobUJ1ZmZlciA9IG1CdWZmZXJNZW1vcnktPnBvaW50ZXIoKSkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJub3QgZW5vdWdoIG1lbW9yeSBmb3IgcmVhZC1vbmx5IGJ1ZmZlciBzaXplPSV6dSIsIGJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgIGlmIChyb0hlYXAgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICByb0hlYXAtPmR1bXAoImJ1ZmZlciIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ2Jsa01lbW9yeS5jbGVhcigpOworICAgICAgICAgICAgICAgIG1CdWZmZXJNZW1vcnkuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtZW1zZXQobUJ1ZmZlciwgMCwgYnVmZmVyU2l6ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQnVmZmVyID0gc2hhcmVkQnVmZmVyLT5wb2ludGVyKCk7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEFMTE9DX1BJUEU6CisgICAgICAgICAgICBtQnVmZmVyTWVtb3J5ID0gdGhyZWFkLT5waXBlTWVtb3J5KCk7CisgICAgICAgICAgICAvLyBtQnVmZmVyIGlzIHRoZSB2aXJ0dWFsIGFkZHJlc3MgYXMgc2VlbiBmcm9tIGN1cnJlbnQgcHJvY2VzcyAobWVkaWFzZXJ2ZXIpLAorICAgICAgICAgICAgLy8gYW5kIHNob3VsZCBub3JtYWxseSBiZSBjb21pbmcgZnJvbSBtQnVmZmVyTWVtb3J5LT5wb2ludGVyKCkuCisgICAgICAgICAgICAvLyBIb3dldmVyIGluIHRoaXMgY2FzZSB0aGUgVHJhY2tCYXNlIGRvZXMgbm90IHJlZmVyZW5jZSB0aGUgYnVmZmVyIGRpcmVjdGx5LgorICAgICAgICAgICAgLy8gSXQgc2hvdWxkIHJlZmVyZW5jZXMgdGhlIGJ1ZmZlciB2aWEgdGhlIHBpcGUuCisgICAgICAgICAgICAvLyBUaGVyZWZvcmUsIHRvIGRldGVjdCBpbmNvcnJlY3QgdXNhZ2Ugb2YgdGhlIGJ1ZmZlciwgd2Ugc2V0IG1CdWZmZXIgdG8gTlVMTC4KKyAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUxMT0NfQ0JMSzoKKyAgICAgICAgICAgIC8vIGNsZWFyIGFsbCBidWZmZXJzCisgICAgICAgICAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtQnVmZmVyID0gKGNoYXIqKW1DYmxrICsgc2l6ZW9mKGF1ZGlvX3RyYWNrX2NibGtfdCk7CisgICAgICAgICAgICAgICAgbWVtc2V0KG1CdWZmZXIsIDAsIGJ1ZmZlclNpemUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtQnVmZmVyID0gYnVmZmVyOwogI2lmIDAKLSAgICAgICAgICAgIG1DYmxrLT5tRmxhZ3MgPSBDQkxLX0ZPUkNFUkVBRFk7ICAgIC8vIEZJWE1FIGhhY2ssIG5lZWQgdG8gZml4IHRoZSB0cmFjayByZWFkeSBsb2dpYworICAgICAgICAgICAgICAgIG1DYmxrLT5tRmxhZ3MgPSBDQkxLX0ZPUkNFUkVBRFk7ICAgIC8vIEZJWE1FIGhhY2ssIG5lZWQgdG8gZml4IHRoZSB0cmFjayByZWFkeSBsb2dpYwogI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBTExPQ19MT0NBTDoKKyAgICAgICAgICAgIG1CdWZmZXIgPSBjYWxsb2MoMSwgYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBTExPQ19OT05FOgorICAgICAgICAgICAgbUJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICNpZmRlZiBURUVfU0lOSwogICAgICAgICBpZiAobVRlZVNpbmtUcmFja0VuYWJsZWQpIHsKLSAgICAgICAgICAgIE5CQUlPX0Zvcm1hdCBwaXBlRm9ybWF0ID0gRm9ybWF0X2Zyb21fU1JfQyhtU2FtcGxlUmF0ZSwgbUNoYW5uZWxDb3VudCk7Ci0gICAgICAgICAgICBpZiAocGlwZUZvcm1hdCAhPSBGb3JtYXRfSW52YWxpZCkgeworICAgICAgICAgICAgTkJBSU9fRm9ybWF0IHBpcGVGb3JtYXQgPSBGb3JtYXRfZnJvbV9TUl9DKG1TYW1wbGVSYXRlLCBtQ2hhbm5lbENvdW50LCBtRm9ybWF0KTsKKyAgICAgICAgICAgIGlmIChGb3JtYXRfaXNWYWxpZChwaXBlRm9ybWF0KSkgewogICAgICAgICAgICAgICAgIFBpcGUgKnBpcGUgPSBuZXcgUGlwZShtVGVlU2lua1RyYWNrRnJhbWVzLCBwaXBlRm9ybWF0KTsKICAgICAgICAgICAgICAgICBzaXplX3QgbnVtQ291bnRlck9mZmVycyA9IDA7CiAgICAgICAgICAgICAgICAgY29uc3QgTkJBSU9fRm9ybWF0IG9mZmVyc1sxXSA9IHtwaXBlRm9ybWF0fTsKQEAgLTE2Nyw2ICsyMDMsMTcgQEAKICAgICB9CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6VHJhY2tCYXNlOjppbml0Q2hlY2soKSBjb25zdAoreworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBpZiAobVR5cGUgPT0gVFlQRV9PVVRQVVQgfHwgbVR5cGUgPT0gVFlQRV9QQVRDSCkgeworICAgICAgICBzdGF0dXMgPSBjYmxrKCkgIT0gTlVMTCA/IE5PX0VSUk9SIDogTk9fTUVNT1JZOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1cyA9IGdldENibGsoKSAhPSAwID8gTk9fRVJST1IgOiBOT19NRU1PUlk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6VHJhY2tCYXNlOjp+VHJhY2tCYXNlKCkKIHsKICNpZmRlZiBURUVfU0lOSwpAQCAtMTgzLDEzICsyMzAsMTUgQEAKICAgICB9CiAgICAgbUNibGtNZW1vcnkuY2xlYXIoKTsgICAgLy8gZnJlZSB0aGUgc2hhcmVkIG1lbW9yeSBiZWZvcmUgcmVsZWFzaW5nIHRoZSBoZWFwIGl0IGJlbG9uZ3MgdG8KICAgICBpZiAobUNsaWVudCAhPSAwKSB7Ci0gICAgICAgIC8vIENsaWVudCBkZXN0cnVjdG9yIG11c3QgcnVuIHdpdGggQXVkaW9GbGluZ2VyIG11dGV4IGxvY2tlZAotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNsaWVudC0+YXVkaW9GbGluZ2VyKCktPm1Mb2NrKTsKKyAgICAgICAgLy8gQ2xpZW50IGRlc3RydWN0b3IgbXVzdCBydW4gd2l0aCBBdWRpb0ZsaW5nZXIgY2xpZW50IG11dGV4IGxvY2tlZAorICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNsaWVudC0+YXVkaW9GbGluZ2VyKCktPm1DbGllbnRMb2NrKTsKICAgICAgICAgLy8gSWYgdGhlIGNsaWVudCdzIHJlZmVyZW5jZSBjb3VudCBkcm9wcyB0byB6ZXJvLCB0aGUgYXNzb2NpYXRlZCBkZXN0cnVjdG9yCiAgICAgICAgIC8vIG11c3QgcnVuIHdpdGggQXVkaW9GbGluZ2VyIGxvY2sgaGVsZC4gVGh1cyB0aGUgZXhwbGljaXQgY2xlYXIoKSByYXRoZXIgdGhhbgogICAgICAgICAvLyByZWx5aW5nIG9uIHRoZSBhdXRvbWF0aWMgY2xlYXIoKSBhdCBlbmQgb2Ygc2NvcGUuCiAgICAgICAgIG1DbGllbnQuY2xlYXIoKTsKICAgICB9CisgICAgLy8gZmx1c2ggdGhlIGJpbmRlciBjb21tYW5kIGJ1ZmZlcgorICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKIH0KIAogLy8gQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKQEAgLTI3NSw2ICszMjQsMTEgQEAKICAgICBpZiAoIW1UcmFjay0+aXNUaW1lZFRyYWNrKCkpCiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIAorICAgIGlmIChidWZmZXIgPT0gMCB8fCBidWZmZXItPnBvaW50ZXIoKSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJxdWV1ZVRpbWVkQnVmZmVyKCkgYnVmZmVyIGlzIDAgb3IgaGFzIE5VTEwgcG9pbnRlcigpIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCiAgICAgUGxheWJhY2tUaHJlYWQ6OlRpbWVkVHJhY2sqIHR0ID0KICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UGxheWJhY2tUaHJlYWQ6OlRpbWVkVHJhY2sqPihtVHJhY2suZ2V0KCkpOwogICAgIHJldHVybiB0dC0+cXVldWVUaW1lZEJ1ZmZlcihidWZmZXIsIHB0cyk7CkBAIC0zMjQsMTIgKzM3OCwxNyBAQAogICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCiAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkLAogICAgICAgICAgICAgaW50IHVpZCwKLSAgICAgICAgICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgZmxhZ3MpCi0gICAgOiAgIFRyYWNrQmFzZSh0aHJlYWQsIGNsaWVudCwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgc2hhcmVkQnVmZmVyLAotICAgICAgICAgICAgc2Vzc2lvbklkLCB1aWQsIHRydWUgLyppc091dCovKSwKKyAgICAgICAgICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICB0cmFja190eXBlIHR5cGUpCisgICAgOiAgIFRyYWNrQmFzZSh0aHJlYWQsIGNsaWVudCwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgIChzaGFyZWRCdWZmZXIgIT0gMCkgPyBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSA6IGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgdWlkLCBmbGFncywgdHJ1ZSAvKmlzT3V0Ki8sCisgICAgICAgICAgICAgICAgICAodHlwZSA9PSBUWVBFX1BBVENIKSA/ICggYnVmZmVyID09IE5VTEwgPyBBTExPQ19MT0NBTCA6IEFMTE9DX05PTkUpIDogQUxMT0NfQ0JMSywKKyAgICAgICAgICAgICAgICAgIHR5cGUpLAogICAgIG1GaWxsaW5nVXBTdGF0dXMoRlNfSU5WQUxJRCksCiAgICAgLy8gbVJldHJ5Q291bnQgaW5pdGlhbGl6ZWQgbGF0ZXIgd2hlbiBuZWVkZWQKICAgICBtU2hhcmVkQnVmZmVyKHNoYXJlZEJ1ZmZlciksCkBAIC0zMzksNDYgKzM5OCw1NSBAQAogICAgIG1BdXhCdWZmZXIoTlVMTCksCiAgICAgbUF1eEVmZmVjdElkKDApLCBtSGFzVm9sdW1lQ29udHJvbGxlcihmYWxzZSksCiAgICAgbVByZXNlbnRhdGlvbkNvbXBsZXRlRnJhbWVzKDApLAotICAgIG1GbGFncyhmbGFncyksCiAgICAgbUZhc3RJbmRleCgtMSksCiAgICAgbUNhY2hlZFZvbHVtZSgxLjApLAogICAgIG1Jc0ludmFsaWQoZmFsc2UpLAogICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHkoTlVMTCksCi0gICAgbVJlc3VtZVRvU3RvcHBpbmcoZmFsc2UpCisgICAgbVJlc3VtZVRvU3RvcHBpbmcoZmFsc2UpLAorICAgIG1GbHVzaEh3UGVuZGluZyhmYWxzZSksCisgICAgbVByZXZpb3VzVmFsaWQoZmFsc2UpLAorICAgIG1QcmV2aW91c0ZyYW1lc1dyaXR0ZW4oMCkKKyAgICAvLyBtUHJldmlvdXNUaW1lc3RhbXAKIHsKLSAgICBpZiAobUNibGsgIT0gTlVMTCkgewotICAgICAgICBpZiAoc2hhcmVkQnVmZmVyID09IDApIHsKLSAgICAgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHkgPSBuZXcgQXVkaW9UcmFja1NlcnZlclByb3h5KG1DYmxrLCBtQnVmZmVyLCBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgICAgICBtRnJhbWVTaXplKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHkgPSBuZXcgU3RhdGljQXVkaW9UcmFja1NlcnZlclByb3h5KG1DYmxrLCBtQnVmZmVyLCBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgICAgICBtRnJhbWVTaXplKTsKLSAgICAgICAgfQotICAgICAgICBtU2VydmVyUHJveHkgPSBtQXVkaW9UcmFja1NlcnZlclByb3h5OwotICAgICAgICAvLyB0byBhdm9pZCBsZWFraW5nIGEgdHJhY2sgbmFtZSwgZG8gbm90IGFsbG9jYXRlIG9uZSB1bmxlc3MgdGhlcmUgaXMgYW4gbUNibGsKLSAgICAgICAgbU5hbWUgPSB0aHJlYWQtPmdldFRyYWNrTmFtZV9sKGNoYW5uZWxNYXNrLCBzZXNzaW9uSWQpOwotICAgICAgICBpZiAobU5hbWUgPCAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgibm8gbW9yZSB0cmFjayBuYW1lcyBhdmFpbGFibGUiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAvLyBvbmx5IGFsbG9jYXRlIGEgZmFzdCB0cmFjayBpbmRleCBpZiB3ZSB3ZXJlIGFibGUgdG8gYWxsb2NhdGUgYSBub3JtYWwgdHJhY2sgbmFtZQotICAgICAgICBpZiAoZmxhZ3MgJiBJQXVkaW9GbGluZ2VyOjpUUkFDS19GQVNUKSB7Ci0gICAgICAgICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNSZWFkeUlzQ2FsbGVkQnlNdWx0aXBsZVRocmVhZHMoKTsKLSAgICAgICAgICAgIEFMT0dfQVNTRVJUKHRocmVhZC0+bUZhc3RUcmFja0F2YWlsTWFzayAhPSAwKTsKLSAgICAgICAgICAgIGludCBpID0gX19idWlsdGluX2N0eih0aHJlYWQtPm1GYXN0VHJhY2tBdmFpbE1hc2spOwotICAgICAgICAgICAgQUxPR19BU1NFUlQoMCA8IGkgJiYgaSA8IChpbnQpRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzKTsKLSAgICAgICAgICAgIC8vIEZJWE1FIFRoaXMgaXMgdG9vIGVhZ2VyLiAgV2UgYWxsb2NhdGUgYSBmYXN0IHRyYWNrIGluZGV4IGJlZm9yZSB0aGUKLSAgICAgICAgICAgIC8vICAgICAgIGZhc3QgdHJhY2sgYmVjb21lcyBhY3RpdmUuICBTaW5jZSBmYXN0IHRyYWNrcyBhcmUgYSBzY2FyY2UgcmVzb3VyY2UsCi0gICAgICAgICAgICAvLyAgICAgICB0aGlzIG1lYW5zIHdlIGFyZSBwb3RlbnRpYWxseSBkZW55aW5nIG90aGVyIG1vcmUgaW1wb3J0YW50IGZhc3QgdHJhY2tzIGZyb20KLSAgICAgICAgICAgIC8vICAgICAgIGJlaW5nIGNyZWF0ZWQuICBJdCB3b3VsZCBiZSBiZXR0ZXIgdG8gYWxsb2NhdGUgdGhlIGluZGV4IGR5bmFtaWNhbGx5LgotICAgICAgICAgICAgbUZhc3RJbmRleCA9IGk7Ci0gICAgICAgICAgICAvLyBSZWFkIHRoZSBpbml0aWFsIHVuZGVycnVucyBiZWNhdXNlIHRoaXMgZmllbGQgaXMgbmV2ZXIgY2xlYXJlZCBieSB0aGUgZmFzdCBtaXhlcgotICAgICAgICAgICAgbU9ic2VydmVkVW5kZXJydW5zID0gdGhyZWFkLT5nZXRGYXN0VHJhY2tVbmRlcnJ1bnMoaSk7Ci0gICAgICAgICAgICB0aHJlYWQtPm1GYXN0VHJhY2tBdmFpbE1hc2sgJj0gfigxIDw8IGkpOwotICAgICAgICB9CisgICAgLy8gY2xpZW50ID09IDAgaW1wbGllcyBzaGFyZWRCdWZmZXIgPT0gMAorICAgIEFMT0dfQVNTRVJUKCEoY2xpZW50ID09IDAgJiYgc2hhcmVkQnVmZmVyICE9IDApKTsKKworICAgIEFMT0dWX0lGKHNoYXJlZEJ1ZmZlciAhPSAwLCAic2hhcmVkQnVmZmVyOiAlcCwgc2l6ZTogJWQiLCBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSwKKyAgICAgICAgICAgIHNoYXJlZEJ1ZmZlci0+c2l6ZSgpKTsKKworICAgIGlmIChtQ2JsayA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgQUxPR1YoIlRyYWNrIGNvbnN0cnVjdG9yIG5hbWUgJWQsIGNhbGxpbmcgcGlkICVkIiwgbU5hbWUsCi0gICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpOworCisgICAgaWYgKHNoYXJlZEJ1ZmZlciA9PSAwKSB7CisgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHkgPSBuZXcgQXVkaW9UcmFja1NlcnZlclByb3h5KG1DYmxrLCBtQnVmZmVyLCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgIG1GcmFtZVNpemUsICFpc0V4dGVybmFsVHJhY2soKSwgc2FtcGxlUmF0ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eSA9IG5ldyBTdGF0aWNBdWRpb1RyYWNrU2VydmVyUHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgbUZyYW1lU2l6ZSk7CisgICAgfQorICAgIG1TZXJ2ZXJQcm94eSA9IG1BdWRpb1RyYWNrU2VydmVyUHJveHk7CisKKyAgICBtTmFtZSA9IHRocmVhZC0+Z2V0VHJhY2tOYW1lX2woY2hhbm5lbE1hc2ssIGZvcm1hdCwgc2Vzc2lvbklkKTsKKyAgICBpZiAobU5hbWUgPCAwKSB7CisgICAgICAgIEFMT0dFKCJubyBtb3JlIHRyYWNrIG5hbWVzIGF2YWlsYWJsZSIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIG9ubHkgYWxsb2NhdGUgYSBmYXN0IHRyYWNrIGluZGV4IGlmIHdlIHdlcmUgYWJsZSB0byBhbGxvY2F0ZSBhIG5vcm1hbCB0cmFjayBuYW1lCisgICAgaWYgKGZsYWdzICYgSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfRkFTVCkgeworICAgICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNSZWFkeUlzQ2FsbGVkQnlNdWx0aXBsZVRocmVhZHMoKTsKKyAgICAgICAgQUxPR19BU1NFUlQodGhyZWFkLT5tRmFzdFRyYWNrQXZhaWxNYXNrICE9IDApOworICAgICAgICBpbnQgaSA9IF9fYnVpbHRpbl9jdHoodGhyZWFkLT5tRmFzdFRyYWNrQXZhaWxNYXNrKTsKKyAgICAgICAgQUxPR19BU1NFUlQoMCA8IGkgJiYgaSA8IChpbnQpRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzKTsKKyAgICAgICAgLy8gRklYTUUgVGhpcyBpcyB0b28gZWFnZXIuICBXZSBhbGxvY2F0ZSBhIGZhc3QgdHJhY2sgaW5kZXggYmVmb3JlIHRoZQorICAgICAgICAvLyAgICAgICBmYXN0IHRyYWNrIGJlY29tZXMgYWN0aXZlLiAgU2luY2UgZmFzdCB0cmFja3MgYXJlIGEgc2NhcmNlIHJlc291cmNlLAorICAgICAgICAvLyAgICAgICB0aGlzIG1lYW5zIHdlIGFyZSBwb3RlbnRpYWxseSBkZW55aW5nIG90aGVyIG1vcmUgaW1wb3J0YW50IGZhc3QgdHJhY2tzIGZyb20KKyAgICAgICAgLy8gICAgICAgYmVpbmcgY3JlYXRlZC4gIEl0IHdvdWxkIGJlIGJldHRlciB0byBhbGxvY2F0ZSB0aGUgaW5kZXggZHluYW1pY2FsbHkuCisgICAgICAgIG1GYXN0SW5kZXggPSBpOworICAgICAgICAvLyBSZWFkIHRoZSBpbml0aWFsIHVuZGVycnVucyBiZWNhdXNlIHRoaXMgZmllbGQgaXMgbmV2ZXIgY2xlYXJlZCBieSB0aGUgZmFzdCBtaXhlcgorICAgICAgICBtT2JzZXJ2ZWRVbmRlcnJ1bnMgPSB0aHJlYWQtPmdldEZhc3RUcmFja1VuZGVycnVucyhpKTsKKyAgICAgICAgdGhyZWFkLT5tRmFzdFRyYWNrQXZhaWxNYXNrICY9IH4oMSA8PCBpKTsKKyAgICB9CiB9CiAKIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjp+VHJhY2soKQpAQCAtMzkxLDExICs0NTksMTggQEAKICAgICAvLyBUaGlzIHByZXZlbnRzIHRoYXQgbGVhay4KICAgICBpZiAobVNoYXJlZEJ1ZmZlciAhPSAwKSB7CiAgICAgICAgIG1TaGFyZWRCdWZmZXIuY2xlYXIoKTsKLSAgICAgICAgLy8gZmx1c2ggdGhlIGJpbmRlciBjb21tYW5kIGJ1ZmZlcgotICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CiAgICAgfQogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6aW5pdENoZWNrKCkgY29uc3QKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBUcmFja0Jhc2U6OmluaXRDaGVjaygpOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgbU5hbWUgPCAwKSB7CisgICAgICAgIHN0YXR1cyA9IE5PX01FTU9SWTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6ZGVzdHJveSgpCiB7CiAgICAgLy8gTk9URTogZGVzdHJveVRyYWNrX2woKSBjYW4gcmVtb3ZlIGEgc3Ryb25nIHJlZmVyZW5jZSB0byB0aGlzIFRyYWNrCkBAIC00MDgsMzEgKzQ4MywzNCBAQAogICAgIC8vIHRoaXMgVHJhY2sgd2l0aCBpdHMgbWVtYmVyIG1UcmFjay4KICAgICBzcDxUcmFjaz4ga2VlcCh0aGlzKTsKICAgICB7IC8vIHNjb3BlIGZvciBtTG9jaworICAgICAgICBib29sIHdhc0FjdGl2ZSA9IGZhbHNlOwogICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKICAgICAgICAgaWYgKHRocmVhZCAhPSAwKSB7CiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodGhyZWFkLT5tTG9jayk7CiAgICAgICAgICAgICBQbGF5YmFja1RocmVhZCAqcGxheWJhY2tUaHJlYWQgPSAoUGxheWJhY2tUaHJlYWQgKil0aHJlYWQuZ2V0KCk7Ci0gICAgICAgICAgICBib29sIHdhc0FjdGl2ZSA9IHBsYXliYWNrVGhyZWFkLT5kZXN0cm95VHJhY2tfbCh0aGlzKTsKLSAgICAgICAgICAgIGlmICghaXNPdXRwdXRUcmFjaygpICYmICF3YXNBY3RpdmUpIHsKLSAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dCh0aHJlYWQtPmlkKCkpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgd2FzQWN0aXZlID0gcGxheWJhY2tUaHJlYWQtPmRlc3Ryb3lUcmFja19sKHRoaXMpOworICAgICAgICB9CisgICAgICAgIGlmIChpc0V4dGVybmFsVHJhY2soKSAmJiAhd2FzQWN0aXZlKSB7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChtVGhyZWFkSW9IYW5kbGUpOwogICAgICAgICB9CiAgICAgfQogfQogCiAvKnN0YXRpYyovIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KQogewotICAgIHJlc3VsdC5hcHBlbmQoIiAgIE5hbWUgQ2xpZW50IFR5cGUgICAgICBGbXQgQ2huIG1hc2sgU2Vzc2lvbiBmQ291bnQgUyBGIFNSYXRlICAiCisgICAgcmVzdWx0LmFwcGVuZCgiICAgIE5hbWUgQWN0aXZlIENsaWVudCBUeXBlICAgICAgRm10IENobiBtYXNrIFNlc3Npb24gZkNvdW50IFMgRiBTUmF0ZSAgIgogICAgICAgICAgICAgICAgICAgIkwgZEIgIFIgZEIgICAgU2VydmVyIE1haW4gYnVmICBBdXggQnVmIEZsYWdzIFVuZEZybUNudFxuIik7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSwgYm9vbCBhY3RpdmUpCiB7Ci0gICAgdWludDMyX3QgdmxyID0gbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+Z2V0Vm9sdW1lTFIoKTsKKyAgICBnYWluX21pbmlmbG9hdF9wYWNrZWRfdCB2bHIgPSBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5nZXRWb2x1bWVMUigpOwogICAgIGlmIChpc0Zhc3RUcmFjaygpKSB7Ci0gICAgICAgIHNwcmludGYoYnVmZmVyLCAiICAgRiAlMmQiLCBtRmFzdEluZGV4KTsKKyAgICAgICAgc3ByaW50ZihidWZmZXIsICIgICAgRiAlMmQiLCBtRmFzdEluZGV4KTsKKyAgICB9IGVsc2UgaWYgKG1OYW1lID49IEF1ZGlvTWl4ZXI6OlRSQUNLMCkgeworICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIiAgICAlNGQiLCBtTmFtZSAtIEF1ZGlvTWl4ZXI6OlRSQUNLMCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgc3ByaW50ZihidWZmZXIsICIgICAlNGQiLCBtTmFtZSAtIEF1ZGlvTWl4ZXI6OlRSQUNLMCk7CisgICAgICAgIHNwcmludGYoYnVmZmVyLCAiICAgIG5vbmUiKTsKICAgICB9CiAgICAgdHJhY2tfc3RhdGUgc3RhdGUgPSBtU3RhdGU7CiAgICAgY2hhciBzdGF0ZUNoYXI7CkBAIC00ODcsOCArNTY1LDkgQEAKICAgICAgICAgbm93SW5VbmRlcnJ1biA9ICc/JzsKICAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIHNucHJpbnRmKCZidWZmZXJbN10sIHNpemUtNywgIiAlNnUgJTR1ICUwOFggJTA4WCAlN3UgJTZ1ICUxYyAlMWQgJTV1ICU1LjJnICU1LjJnICAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJTA4WCAlMDhYICUwOFggMHglMDNYICU5dSVjXG4iLAorICAgIHNucHJpbnRmKCZidWZmZXJbOF0sIHNpemUtOCwgIiAlNnMgJTZ1ICU0dSAlMDhYICUwOFggJTd1ICU2enUgJTFjICUxZCAlNXUgJTUuMmcgJTUuMmcgICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMDhYICVwICVwIDB4JTAzWCAlOXUlY1xuIiwKKyAgICAgICAgICAgIGFjdGl2ZSA/ICJ5ZXMiIDogIm5vIiwKICAgICAgICAgICAgIChtQ2xpZW50ID09IDApID8gZ2V0cGlkX2NhY2hlZCA6IG1DbGllbnQtPnBpZCgpLAogICAgICAgICAgICAgbVN0cmVhbVR5cGUsCiAgICAgICAgICAgICBtRm9ybWF0LApAQCAtNDk4LDExICs1NzcsMTEgQEAKICAgICAgICAgICAgIHN0YXRlQ2hhciwKICAgICAgICAgICAgIG1GaWxsaW5nVXBTdGF0dXMsCiAgICAgICAgICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5nZXRTYW1wbGVSYXRlKCksCi0gICAgICAgICAgICAyMC4wICogbG9nMTAoKHZsciAmIDB4RkZGRikgLyA0MDk2LjApLAotICAgICAgICAgICAgMjAuMCAqIGxvZzEwKCh2bHIgPj4gMTYpIC8gNDA5Ni4wKSwKKyAgICAgICAgICAgIDIwLjAgKiBsb2cxMChmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX2xlZnQodmxyKSkpLAorICAgICAgICAgICAgMjAuMCAqIGxvZzEwKGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfcmlnaHQodmxyKSkpLAogICAgICAgICAgICAgbUNibGstPm1TZXJ2ZXIsCi0gICAgICAgICAgICAoaW50KW1NYWluQnVmZmVyLAotICAgICAgICAgICAgKGludCltQXV4QnVmZmVyLAorICAgICAgICAgICAgbU1haW5CdWZmZXIsCisgICAgICAgICAgICBtQXV4QnVmZmVyLAogICAgICAgICAgICAgbUNibGstPm1GbGFncywKICAgICAgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldFVuZGVycnVuRnJhbWVzKCksCiAgICAgICAgICAgICBub3dJblVuZGVycnVuKTsKQEAgLTUxNCw3ICs1OTMsNyBAQAogCiAvLyBBdWRpb0J1ZmZlclByb3ZpZGVyIGludGVyZmFjZQogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmdldE5leHRCdWZmZXIoCi0gICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyLCBpbnQ2NF90IHB0cykKKyAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIsIGludDY0X3QgcHRzIF9fdW51c2VkKQogewogICAgIFNlcnZlclByb3h5OjpCdWZmZXIgYnVmOwogICAgIHNpemVfdCBkZXNpcmVkRnJhbWVzID0gYnVmZmVyLT5mcmFtZUNvdW50OwpAQCAtNTUxLDcgKzYzMCwxNCBAQAogCiAvLyBEb24ndCBjYWxsIGZvciBmYXN0IHRyYWNrczsgdGhlIGZyYW1lc1JlYWR5KCkgY291bGQgcmVzdWx0IGluIHByaW9yaXR5IGludmVyc2lvbgogYm9vbCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6aXNSZWFkeSgpIGNvbnN0IHsKLSAgICBpZiAobUZpbGxpbmdVcFN0YXR1cyAhPSBGU19GSUxMSU5HIHx8IGlzU3RvcHBlZCgpIHx8IGlzUGF1c2luZygpIHx8IGlzU3RvcHBpbmcoKSkgeworICAgIGlmIChtRmlsbGluZ1VwU3RhdHVzICE9IEZTX0ZJTExJTkcgfHwgaXNTdG9wcGVkKCkgfHwgaXNQYXVzaW5nKCkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKGlzU3RvcHBpbmcoKSkgeworICAgICAgICBpZiAoZnJhbWVzUmVhZHkoKSA+IDApIHsKKyAgICAgICAgICAgIG1GaWxsaW5nVXBTdGF0dXMgPSBGU19GSUxMRUQ7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCkBAIC01NjQsOCArNjUwLDggQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpzdGFydChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmlnZ2VyU2Vzc2lvbikKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpzdGFydChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50IF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmlnZ2VyU2Vzc2lvbiBfX3VudXNlZCkKIHsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKICAgICBBTE9HVigic3RhcnQoJWQpLCBjYWxsaW5nIHBpZCAlZCBzZXNzaW9uICVkIiwKQEAgLTU4OCw3ICs2NzQsMTAgQEAKICAgICAgICAgLy8gaGVyZSB0aGUgdHJhY2sgY291bGQgYmUgZWl0aGVyIG5ldywgb3IgcmVzdGFydGVkCiAgICAgICAgIC8vIGluIGJvdGggY2FzZXMgInVuc3RvcCIgdGhlIHRyYWNrCiAKLSAgICAgICAgaWYgKHN0YXRlID09IFBBVVNFRCkgeworICAgICAgICAvLyBpbml0aWFsIHN0YXRlLXN0b3BwaW5nLiBuZXh0IHN0YXRlLXBhdXNpbmcuCisgICAgICAgIC8vIFdoYXQgaWYgcmVzdW1lIGlzIGNhbGxlZCA/CisKKyAgICAgICAgaWYgKHN0YXRlID09IFBBVVNFRCB8fCBzdGF0ZSA9PSBQQVVTSU5HKSB7CiAgICAgICAgICAgICBpZiAobVJlc3VtZVRvU3RvcHBpbmcpIHsKICAgICAgICAgICAgICAgICAvLyBoYXBwZW5lZCB3ZSBuZWVkIHRvIHJlc3VtZSB0byBTVE9QUElOR18xCiAgICAgICAgICAgICAgICAgbVN0YXRlID0gVHJhY2tCYXNlOjpTVE9QUElOR18xOwpAQCAtNjQzLDcgKzczMiw3IEBACiAgICAgICAgICAgICBpZiAocGxheWJhY2tUaHJlYWQtPm1BY3RpdmVUcmFja3MuaW5kZXhPZih0aGlzKSA8IDApIHsKICAgICAgICAgICAgICAgICByZXNldCgpOwogICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUT1BQRUQ7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFpc0Zhc3RUcmFjaygpICYmICFpc09mZmxvYWRlZCgpKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc0Zhc3RUcmFjaygpICYmICFpc09mZmxvYWRlZCgpICYmICFpc0RpcmVjdCgpKSB7CiAgICAgICAgICAgICAgICAgbVN0YXRlID0gU1RPUFBFRDsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gRm9yIGZhc3QgdHJhY2tzIHByZXBhcmVUcmFja3NfbCgpIHdpbGwgc2V0IHN0YXRlIHRvIFNUT1BQSU5HXzIKQEAgLTcxOSw2ICs4MDgsNyBAQAogICAgICAgICAgICAgICAgIG1SZXRyeUNvdW50ID0gUGxheWJhY2tUaHJlYWQ6OmtNYXhUcmFja1JldHJpZXNPZmZsb2FkOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBtRmx1c2hId1BlbmRpbmcgPSB0cnVlOwogICAgICAgICAgICAgbVJlc3VtZVRvU3RvcHBpbmcgPSBmYWxzZTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gU1RPUFBJTkdfMSAmJiBtU3RhdGUgIT0gU1RPUFBJTkdfMiAmJiBtU3RhdGUgIT0gU1RPUFBFRCAmJgpAQCAtNzM0LDE2ICs4MjQsMjggQEAKICAgICAgICAgICAgIC8vIHJlbW92ZSBmcm9tIGFjdGl2ZSB0cmFjayBsaXN0LCByZXNldCgpLCBhbmQgdHJpZ2dlciBwcmVzZW50YXRpb24gY29tcGxldGUKICAgICAgICAgICAgIGlmIChwbGF5YmFja1RocmVhZC0+bUFjdGl2ZVRyYWNrcy5pbmRleE9mKHRoaXMpIDwgMCkgewogICAgICAgICAgICAgICAgIHJlc2V0KCk7CisgICAgICAgICAgICAgICAgaWYgKHRocmVhZC0+dHlwZSgpID09IFRocmVhZEJhc2U6OkRJUkVDVCkgeworICAgICAgICAgICAgICAgICAgICBEaXJlY3RPdXRwdXRUaHJlYWQgKnQgPSAoRGlyZWN0T3V0cHV0VGhyZWFkICopcGxheWJhY2tUaHJlYWQ7CisgICAgICAgICAgICAgICAgICAgIHQtPmZsdXNoSHdfbCgpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAvLyBQcmV2ZW50IGZsdXNoIGJlaW5nIGxvc3QgaWYgdGhlIHRyYWNrIGlzIGZsdXNoZWQgYW5kIHRoZW4gcmVzdW1lZAogICAgICAgICAvLyBiZWZvcmUgbWl4ZXIgdGhyZWFkIGNhbiBydW4uIFRoaXMgaXMgaW1wb3J0YW50IHdoZW4gb2ZmbG9hZGluZwogICAgICAgICAvLyBiZWNhdXNlIHRoZSBoYXJkd2FyZSBidWZmZXIgY291bGQgaG9sZCBhIGxhcmdlIGFtb3VudCBvZiBhdWRpbwotICAgICAgICBwbGF5YmFja1RocmVhZC0+Zmx1c2hPdXRwdXRfbCgpOwogICAgICAgICBwbGF5YmFja1RocmVhZC0+YnJvYWRjYXN0X2woKTsKICAgICB9CiB9CiAKKy8vIG11c3QgYmUgY2FsbGVkIHdpdGggdGhyZWFkIGxvY2sgaGVsZAordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6Zmx1c2hBY2soKQoreworICAgIGlmICghaXNPZmZsb2FkZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbUZsdXNoSHdQZW5kaW5nID0gZmFsc2U7Cit9CisKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnJlc2V0KCkKIHsKICAgICAvLyBEbyBub3QgcmVzZXQgdHdpY2UgdG8gYXZvaWQgZGlzY2FyZGluZyBkYXRhIHdyaXR0ZW4ganVzdCBhZnRlciBhIGZsdXNoIGFuZCBiZWZvcmUKQEAgLTc3OCwyNyArODgwLDYwIEBACiB7CiAgICAgLy8gQ2xpZW50IHNob3VsZCBpbXBsZW1lbnQgdGhpcyB1c2luZyBTU1E7IHRoZSB1bnByZXNlbnRlZCBmcmFtZSBjb3VudCBpbiBsYXRjaCBpcyBpcnJlbGV2YW50CiAgICAgaWYgKGlzRmFzdFRyYWNrKCkpIHsKKyAgICAgICAgLy8gRklYTUUgbm8gbG9jayBoZWxkIHRvIHNldCBtUHJldmlvdXNWYWxpZCA9IGZhbHNlCiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CiAgICAgaWYgKHRocmVhZCA9PSAwKSB7CisgICAgICAgIC8vIEZJWE1FIG5vIGxvY2sgaGVsZCB0byBzZXQgbVByZXZpb3VzVmFsaWQgPSBmYWxzZQogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbCh0aHJlYWQtPm1Mb2NrKTsKICAgICBQbGF5YmFja1RocmVhZCAqcGxheWJhY2tUaHJlYWQgPSAoUGxheWJhY2tUaHJlYWQgKil0aHJlYWQuZ2V0KCk7Ci0gICAgaWYgKCFpc09mZmxvYWRlZCgpKSB7CisgICAgaWYgKCFpc09mZmxvYWRlZCgpICYmICFpc0RpcmVjdCgpKSB7CiAgICAgICAgIGlmICghcGxheWJhY2tUaHJlYWQtPm1MYXRjaFFWYWxpZCkgeworICAgICAgICAgICAgbVByZXZpb3VzVmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfQogICAgICAgICB1aW50MzJfdCB1bnByZXNlbnRlZEZyYW1lcyA9CiAgICAgICAgICAgICAgICAgKChpbnQ2NF90KSBwbGF5YmFja1RocmVhZC0+bUxhdGNoUS5tVW5wcmVzZW50ZWRGcmFtZXMgKiBtU2FtcGxlUmF0ZSkgLwogICAgICAgICAgICAgICAgIHBsYXliYWNrVGhyZWFkLT5tU2FtcGxlUmF0ZTsKLSAgICAgICAgdWludDMyX3QgZnJhbWVzV3JpdHRlbiA9IG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc1JlbGVhc2VkKCk7CisgICAgICAgIC8vIEZJWE1FIFNpbmNlIHdlJ3JlIHVzaW5nIGEgcmF3IHBvaW50ZXIgYXMgdGhlIGtleSwgaXQgaXMgdGhlb3JldGljYWxseSBwb3NzaWJsZQorICAgICAgICAvLyAgICAgICBmb3IgYSBicmFuZCBuZXcgdHJhY2sgdG8gc2hhcmUgdGhlIHNhbWUgYWRkcmVzcyBhcyBhIHJlY2VudGx5IGRlc3Ryb3llZAorICAgICAgICAvLyAgICAgICB0cmFjaywgYW5kIHRodXMgZm9yIHVzIHRvIGdldCB0aGUgZnJhbWVzIHJlbGVhc2VkIG9mIHRoZSB3cm9uZyB0cmFjay4KKyAgICAgICAgLy8gICAgICAgSXQgaXMgdW5saWtlbHkgdGhhdCB3ZSB3b3VsZCBiZSBhYmxlIHRvIGNhbGwgZ2V0VGltZXN0YW1wKCkgc28gcXVpY2tseQorICAgICAgICAvLyAgICAgICByaWdodCBhZnRlciBjcmVhdGluZyBhIG5ldyB0cmFjay4gIE5ldmVydGhlbGVzcywgdGhlIGluZGV4IGhlcmUgc2hvdWxkCisgICAgICAgIC8vICAgICAgIGJlIGNoYW5nZWQgdG8gc29tZXRoaW5nIHRoYXQgaXMgdW5pcXVlLiAgT3IgdXNlIGEgY29tcGxldGVseSBkaWZmZXJlbnQgc3RyYXRlZ3kuCisgICAgICAgIHNzaXplX3QgaSA9IHBsYXliYWNrVGhyZWFkLT5tTGF0Y2hRLm1GcmFtZXNSZWxlYXNlZC5pbmRleE9mS2V5KHRoaXMpOworICAgICAgICB1aW50MzJfdCBmcmFtZXNXcml0dGVuID0gaSA+PSAwID8KKyAgICAgICAgICAgICAgICBwbGF5YmFja1RocmVhZC0+bUxhdGNoUS5tRnJhbWVzUmVsZWFzZWRbaV0gOgorICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc1JlbGVhc2VkKCk7CisgICAgICAgIGJvb2wgY2hlY2tQcmV2aW91c1RpbWVzdGFtcCA9IG1QcmV2aW91c1ZhbGlkICYmIGZyYW1lc1dyaXR0ZW4gPj0gbVByZXZpb3VzRnJhbWVzV3JpdHRlbjsKICAgICAgICAgaWYgKGZyYW1lc1dyaXR0ZW4gPCB1bnByZXNlbnRlZEZyYW1lcykgeworICAgICAgICAgICAgbVByZXZpb3VzVmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfQotICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uID0gZnJhbWVzV3JpdHRlbiAtIHVucHJlc2VudGVkRnJhbWVzOwotICAgICAgICB0aW1lc3RhbXAubVRpbWUgPSBwbGF5YmFja1RocmVhZC0+bUxhdGNoUS5tVGltZXN0YW1wLm1UaW1lOworICAgICAgICBtUHJldmlvdXNGcmFtZXNXcml0dGVuID0gZnJhbWVzV3JpdHRlbjsKKyAgICAgICAgdWludDMyX3QgcG9zaXRpb24gPSBmcmFtZXNXcml0dGVuIC0gdW5wcmVzZW50ZWRGcmFtZXM7CisgICAgICAgIHN0cnVjdCB0aW1lc3BlYyB0aW1lID0gcGxheWJhY2tUaHJlYWQtPm1MYXRjaFEubVRpbWVzdGFtcC5tVGltZTsKKyAgICAgICAgaWYgKGNoZWNrUHJldmlvdXNUaW1lc3RhbXApIHsKKyAgICAgICAgICAgIGlmICh0aW1lLnR2X3NlYyA8IG1QcmV2aW91c1RpbWVzdGFtcC5tVGltZS50dl9zZWMgfHwKKyAgICAgICAgICAgICAgICAgICAgKHRpbWUudHZfc2VjID09IG1QcmV2aW91c1RpbWVzdGFtcC5tVGltZS50dl9zZWMgJiYKKyAgICAgICAgICAgICAgICAgICAgdGltZS50dl9uc2VjIDwgbVByZXZpb3VzVGltZXN0YW1wLm1UaW1lLnR2X25zZWMpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIlRpbWUgaXMgZ29pbmcgYmFja3dhcmRzIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBwb3NpdGlvbiBjYW4gYm9iYmxlIHNsaWdodGx5IGFzIGFuIGFydGlmYWN0OyB0aGlzIGhpZGVzIHRoZSBib2JibGUKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBNSU5JTVVNX1BPU0lUSU9OX0RFTFRBID0gOHU7CisgICAgICAgICAgICBpZiAoKHBvc2l0aW9uIDw9IG1QcmV2aW91c1RpbWVzdGFtcC5tUG9zaXRpb24pIHx8CisgICAgICAgICAgICAgICAgICAgIChwb3NpdGlvbiAtIG1QcmV2aW91c1RpbWVzdGFtcC5tUG9zaXRpb24pIDwgTUlOSU1VTV9QT1NJVElPTl9ERUxUQSkgeworICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gbVByZXZpb3VzVGltZXN0YW1wLm1Qb3NpdGlvbjsKKyAgICAgICAgICAgICAgICB0aW1lID0gbVByZXZpb3VzVGltZXN0YW1wLm1UaW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb24gPSBwb3NpdGlvbjsKKyAgICAgICAgdGltZXN0YW1wLm1UaW1lID0gdGltZTsKKyAgICAgICAgbVByZXZpb3VzVGltZXN0YW1wID0gdGltZXN0YW1wOworICAgICAgICBtUHJldmlvdXNWYWxpZCA9IHRydWU7CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAKQEAgLTg4NCw4ICsxMDE5LDYgQEAKICAgICB9CiAKICAgICBpZiAoZnJhbWVzV3JpdHRlbiA+PSBtUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMgfHwgaXNPZmZsb2FkZWQoKSkgewotICAgICAgICBBTE9HVigicHJlc2VudGF0aW9uQ29tcGxldGUoKSBzZXNzaW9uICVkIGNvbXBsZXRlOiBmcmFtZXNXcml0dGVuICVkIiwKLSAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsIGZyYW1lc1dyaXR0ZW4pOwogICAgICAgICB0cmlnZ2VyRXZlbnRzKEF1ZGlvU3lzdGVtOjpTWU5DX0VWRU5UX1BSRVNFTlRBVElPTl9DT01QTEVURSk7CiAgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPnNldFN0cmVhbUVuZERvbmUoKTsKICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC04OTUsNyArMTAyOCw3IEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnRyaWdnZXJFdmVudHMoQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCB0eXBlKQogewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludCltU3luY0V2ZW50cy5zaXplKCk7IGkrKykgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVN5bmNFdmVudHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgaWYgKG1TeW5jRXZlbnRzW2ldLT50eXBlKCkgPT0gdHlwZSkgewogICAgICAgICAgICAgbVN5bmNFdmVudHNbaV0tPnRyaWdnZXIoKTsKICAgICAgICAgICAgIG1TeW5jRXZlbnRzLnJlbW92ZUF0KGkpOwpAQCAtOTA2LDI3ICsxMDM5LDI3IEBACiAKIC8vIGltcGxlbWVudCBWb2x1bWVCdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKIAotdWludDMyX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmdldFZvbHVtZUxSKCkKK2dhaW5fbWluaWZsb2F0X3BhY2tlZF90IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpnZXRWb2x1bWVMUigpCiB7CiAgICAgLy8gY2FsbGVkIGJ5IEZhc3RNaXhlciwgc28gbm90IGFsbG93ZWQgdG8gdGFrZSBhbnkgbG9ja3MsIGJsb2NrLCBvciBkbyBJL08gaW5jbHVkaW5nIGxvZ3MKICAgICBBTE9HX0FTU0VSVChpc0Zhc3RUcmFjaygpICYmIChtQ2JsayAhPSBOVUxMKSk7Ci0gICAgdWludDMyX3QgdmxyID0gbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+Z2V0Vm9sdW1lTFIoKTsKLSAgICB1aW50MzJfdCB2bCA9IHZsciAmIDB4RkZGRjsKLSAgICB1aW50MzJfdCB2ciA9IHZsciA+PiAxNjsKKyAgICBnYWluX21pbmlmbG9hdF9wYWNrZWRfdCB2bHIgPSBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5nZXRWb2x1bWVMUigpOworICAgIGZsb2F0IHZsID0gZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19sZWZ0KHZscikpOworICAgIGZsb2F0IHZyID0gZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19yaWdodCh2bHIpKTsKICAgICAvLyB0cmFjayB2b2x1bWVzIGNvbWUgZnJvbSBzaGFyZWQgbWVtb3J5LCBzbyBjYW4ndCBiZSB0cnVzdGVkIGFuZCBtdXN0IGJlIGNsYW1wZWQKLSAgICBpZiAodmwgPiBNQVhfR0FJTl9JTlQpIHsKLSAgICAgICAgdmwgPSBNQVhfR0FJTl9JTlQ7CisgICAgaWYgKHZsID4gR0FJTl9GTE9BVF9VTklUWSkgeworICAgICAgICB2bCA9IEdBSU5fRkxPQVRfVU5JVFk7CiAgICAgfQotICAgIGlmICh2ciA+IE1BWF9HQUlOX0lOVCkgewotICAgICAgICB2ciA9IE1BWF9HQUlOX0lOVDsKKyAgICBpZiAodnIgPiBHQUlOX0ZMT0FUX1VOSVRZKSB7CisgICAgICAgIHZyID0gR0FJTl9GTE9BVF9VTklUWTsKICAgICB9CiAgICAgLy8gbm93IGFwcGx5IHRoZSBjYWNoZWQgbWFzdGVyIHZvbHVtZSBhbmQgc3RyZWFtIHR5cGUgdm9sdW1lOwogICAgIC8vIHRoaXMgaXMgdHJ1c3RlZCBidXQgbGFja3MgYW55IHN5bmNocm9uaXphdGlvbiBvciBiYXJyaWVyIHNvIG1heSBiZSBzdGFsZQogICAgIGZsb2F0IHYgPSBtQ2FjaGVkVm9sdW1lOwogICAgIHZsICo9IHY7CiAgICAgdnIgKj0gdjsKLSAgICAvLyByZS1jb21iaW5lIGludG8gVTQuMTYKLSAgICB2bHIgPSAodnIgPDwgMTYpIHwgKHZsICYgMHhGRkZGKTsKKyAgICAvLyByZS1jb21iaW5lIGludG8gcGFja2VkIG1pbmlmbG9hdAorICAgIHZsciA9IGdhaW5fbWluaWZsb2F0X3BhY2soZ2Fpbl9mcm9tX2Zsb2F0KHZsKSwgZ2Fpbl9mcm9tX2Zsb2F0KHZyKSk7CiAgICAgLy8gRklYTUUgbG9vayBhdCBtdXRlLCBwYXVzZSwgYW5kIHN0b3AgZmxhZ3MKICAgICByZXR1cm4gdmxyOwogfQpAQCAtOTUyLDcgKzEwODUsNyBAQAogICAgIGFuZHJvaWRfYXRvbWljX29yKENCTEtfSU5WQUxJRCwgJmNibGstPm1GbGFncyk7CiAgICAgYW5kcm9pZF9hdG9taWNfcmVsZWFzZV9zdG9yZSgweDQwMDAwMDAwLCAmY2Jsay0+bUZ1dGV4KTsKICAgICAvLyBjbGllbnQgaXMgbm90IGluIHNlcnZlciwgc28gRlVURVhfV0FLRSBpcyBuZWVkZWQgaW5zdGVhZCBvZiBGVVRFWF9XQUtFX1BSSVZBVEUKLSAgICAodm9pZCkgX19mdXRleF9zeXNjYWxsMygmY2Jsay0+bUZ1dGV4LCBGVVRFWF9XQUtFLCBJTlRfTUFYKTsKKyAgICAodm9pZCkgc3lzY2FsbChfX05SX2Z1dGV4LCAmY2Jsay0+bUZ1dGV4LCBGVVRFWF9XQUtFLCBJTlRfTUFYKTsKICAgICBtSXNJbnZhbGlkID0gdHJ1ZTsKIH0KIApAQCAtOTY2LDYgKzEwOTksMzMgQEAKICAgICB9CiB9CiAKKy8vVG8gYmUgY2FsbGVkIHdpdGggdGhyZWFkIGxvY2sgaGVsZAorYm9vbCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6aXNSZXN1bWVQZW5kaW5nKCkgeworCisgICAgaWYgKG1TdGF0ZSA9PSBSRVNVTUlORykKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgLyogUmVzdW1lIGlzIHBlbmRpbmcgaWYgdHJhY2sgd2FzIHN0b3BwaW5nIGJlZm9yZSBwYXVzZSB3YXMgY2FsbGVkICovCisgICAgaWYgKG1TdGF0ZSA9PSBTVE9QUElOR18xICYmCisgICAgICAgIG1SZXN1bWVUb1N0b3BwaW5nKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIHJldHVybiBmYWxzZTsKK30KKworLy9UbyBiZSBjYWxsZWQgd2l0aCB0aHJlYWQgbG9jayBoZWxkCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpyZXN1bWVBY2soKSB7CisKKworICAgIGlmIChtU3RhdGUgPT0gUkVTVU1JTkcpCisgICAgICAgIG1TdGF0ZSA9IEFDVElWRTsKKworICAgIC8vIE90aGVyIHBvc3NpYmlsaXR5IG9mICBwZW5kaW5nIHJlc3VtZSBpcyBzdG9wcGluZ18xIHN0YXRlCisgICAgLy8gRG8gbm90IHVwZGF0ZSB0aGUgc3RhdGUgZnJvbSBzdG9wcGluZyBhcyB0aGlzIHByZXZlbnRzCisgICAgLy8gZHJhaW4gYmVpbmcgY2FsbGVkLgorICAgIGlmIChtU3RhdGUgPT0gU1RPUFBJTkdfMSkgeworICAgICAgICBtUmVzdW1lVG9TdG9wcGluZyA9IGZhbHNlOworICAgIH0KK30KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3A8QXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VGltZWRUcmFjaz4KQEAgLTk3OSw3ICsxMTM5LDggQEAKICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCi0gICAgICAgICAgICBpbnQgdWlkKSB7CisgICAgICAgICAgICBpbnQgdWlkKQorewogICAgIGlmICghY2xpZW50LT5yZXNlcnZlVGltZWRUcmFjaygpKQogICAgICAgICByZXR1cm4gMDsKIApAQCAtMTAwMCw3ICsxMTYxLDggQEAKICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCiAgICAgICAgICAgICBpbnQgdWlkKQogICAgIDogVHJhY2sodGhyZWFkLCBjbGllbnQsIHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICBmcmFtZUNvdW50LCBzaGFyZWRCdWZmZXIsIHNlc3Npb25JZCwgdWlkLCBJQXVkaW9GbGluZ2VyOjpUUkFDS19USU1FRCksCisgICAgICAgICAgICBmcmFtZUNvdW50LCAoc2hhcmVkQnVmZmVyICE9IDApID8gc2hhcmVkQnVmZmVyLT5wb2ludGVyKCkgOiBOVUxMLCBzaGFyZWRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgdWlkLCBJQXVkaW9GbGluZ2VyOjpUUkFDS19USU1FRCwgVFlQRV9USU1FRCksCiAgICAgICBtUXVldWVIZWFkSW5GbGlnaHQoZmFsc2UpLAogICAgICAgbVRyaW1RdWV1ZUhlYWRPblJlbGVhc2UoZmFsc2UpLAogICAgICAgbUZyYW1lc1BlbmRpbmdJblF1ZXVlKDApLApAQCAtMTA0NSwxNSArMTIwNywxNCBAQAogCiAgICAgICAgIG1UaW1lZE1lbW9yeURlYWxlciA9IG5ldyBNZW1vcnlEZWFsZXIoa1RpbWVkQnVmZmVySGVhcFNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF1ZGlvRmxpbmdlclRpbWVkIik7Ci0gICAgICAgIGlmIChtVGltZWRNZW1vcnlEZWFsZXIgPT0gTlVMTCkKKyAgICAgICAgaWYgKG1UaW1lZE1lbW9yeURlYWxlciA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CiAgICAgfQogCiAgICAgc3A8SU1lbW9yeT4gbmV3QnVmZmVyID0gbVRpbWVkTWVtb3J5RGVhbGVyLT5hbGxvY2F0ZShzaXplKTsKLSAgICBpZiAobmV3QnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgbmV3QnVmZmVyID0gbVRpbWVkTWVtb3J5RGVhbGVyLT5hbGxvY2F0ZShzaXplKTsKLSAgICAgICAgaWYgKG5ld0J1ZmZlciA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICBpZiAobmV3QnVmZmVyID09IDAgfHwgbmV3QnVmZmVyLT5wb2ludGVyKCkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwogICAgIH0KIAogICAgICpidWZmZXIgPSBuZXdCdWZmZXI7CkBAIC0xMTUyLDcgKzEzMTMsNyBAQAogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRpbWVkVHJhY2s6OnVwZGF0ZUZyYW1lc1BlbmRpbmdBZnRlclRyaW1fbCgKICAgICAgICAgY29uc3QgVGltZWRCdWZmZXImIGJ1ZiwKLSAgICAgICAgY29uc3QgY2hhciogbG9nVGFnKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIGxvZ1RhZyBfX3VudXNlZCkgewogICAgIHVpbnQzMl90IGJ1ZkJ5dGVzICAgICAgICA9IGJ1Zi5idWZmZXIoKS0+c2l6ZSgpOwogICAgIHVpbnQzMl90IGNvbnN1bWVkQWxyZWFkeSA9IGJ1Zi5wb3NpdGlvbigpOwogCkBAIC0xNDYzLDcgKzE2MjQsNyBAQAogICAgICAgICAgICAgbVRyaW1RdWV1ZUhlYWRPblJlbGVhc2UgPSBmYWxzZTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIExPR19GQVRBTCgiVGltZWRUcmFjazo6cmVsZWFzZUJ1ZmZlciBvZiBub24tc2lsZW5jZSBidWZmZXIgd2l0aCBubyIKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVGltZWRUcmFjazo6cmVsZWFzZUJ1ZmZlciBvZiBub24tc2lsZW5jZSBidWZmZXIgd2l0aCBubyIKICAgICAgICAgICAgICAgICAgICIgYnVmZmVycyBpbiB0aGUgdGltZWQgYnVmZmVyIHF1ZXVlIik7CiAgICAgfQogCkBAIC0xNDk2LDcgKzE2NTcsNyBAQAogICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgICAgICBpbnQgdWlkKQogICAgIDogICBUcmFjayhwbGF5YmFja1RocmVhZCwgTlVMTCwgQVVESU9fU1RSRUFNX0NOVCwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICBOVUxMLCAwLCB1aWQsIElBdWRpb0ZsaW5nZXI6OlRSQUNLX0RFRkFVTFQpLAorICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIHVpZCwgSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfREVGQVVMVCwgVFlQRV9PVVRQVVQpLAogICAgIG1BY3RpdmUoZmFsc2UpLCBtU291cmNlVGhyZWFkKHNvdXJjZVRocmVhZCksIG1DbGllbnRQcm94eShOVUxMKQogewogCkBAIC0xNTA0LDE3ICsxNjY1LDE2IEBACiAgICAgICAgIG1PdXRCdWZmZXIuZnJhbWVDb3VudCA9IDA7CiAgICAgICAgIHBsYXliYWNrVGhyZWFkLT5tVHJhY2tzLmFkZCh0aGlzKTsKICAgICAgICAgQUxPR1YoIk91dHB1dFRyYWNrIGNvbnN0cnVjdG9yIG1DYmxrICVwLCBtQnVmZmVyICVwLCAiCi0gICAgICAgICAgICAgICAgIm1DYmxrLT5mcmFtZUNvdW50XyAldSwgbUNoYW5uZWxNYXNrIDB4JTA4eCIsCisgICAgICAgICAgICAgICAgImZyYW1lQ291bnQgJXUsIG1DaGFubmVsTWFzayAweCUwOHgiLAogICAgICAgICAgICAgICAgIG1DYmxrLCBtQnVmZmVyLAotICAgICAgICAgICAgICAgIG1DYmxrLT5mcmFtZUNvdW50XywgbUNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBtQ2hhbm5lbE1hc2spOwogICAgICAgICAvLyBzaW5jZSBjbGllbnQgYW5kIHNlcnZlciBhcmUgaW4gdGhlIHNhbWUgcHJvY2VzcywKICAgICAgICAgLy8gdGhlIGJ1ZmZlciBoYXMgdGhlIHNhbWUgdmlydHVhbCBhZGRyZXNzIG9uIGJvdGggc2lkZXMKLSAgICAgICAgbUNsaWVudFByb3h5ID0gbmV3IEF1ZGlvVHJhY2tDbGllbnRQcm94eShtQ2JsaywgbUJ1ZmZlciwgbUZyYW1lQ291bnQsIG1GcmFtZVNpemUpOwotICAgICAgICBtQ2xpZW50UHJveHktPnNldFZvbHVtZUxSKCh1aW50MzJfdCh1aW50MTZfdCgweDEwMDApKSA8PCAxNikgfCB1aW50MTZfdCgweDEwMDApKTsKLSAgICAgICAgbUNsaWVudFByb3h5LT5zZXRTZW5kTGV2ZWwoMC4wKTsKLSAgICAgICAgbUNsaWVudFByb3h5LT5zZXRTYW1wbGVSYXRlKHNhbXBsZVJhdGUpOwogICAgICAgICBtQ2xpZW50UHJveHkgPSBuZXcgQXVkaW9UcmFja0NsaWVudFByb3h5KG1DYmxrLCBtQnVmZmVyLCBtRnJhbWVDb3VudCwgbUZyYW1lU2l6ZSwKICAgICAgICAgICAgICAgICB0cnVlIC8qY2xpZW50SW5TZXJ2ZXIqLyk7CisgICAgICAgIG1DbGllbnRQcm94eS0+c2V0Vm9sdW1lTFIoR0FJTl9NSU5JRkxPQVRfUEFDS0VEX1VOSVRZKTsKKyAgICAgICAgbUNsaWVudFByb3h5LT5zZXRTZW5kTGV2ZWwoMC4wKTsKKyAgICAgICAgbUNsaWVudFByb3h5LT5zZXRTYW1wbGVSYXRlKHNhbXBsZVJhdGUpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dXKCJFcnJvciBjcmVhdGluZyBvdXRwdXQgdHJhY2sgb24gdGhyZWFkICVwIiwgcGxheWJhY2tUaHJlYWQpOwogICAgIH0KQEAgLTE3MDUsNiArMTg2NSw3NSBAQAogfQogCiAKK0F1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s6OlBhdGNoVHJhY2soUGxheWJhY2tUaHJlYWQgKnBsYXliYWNrVGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190IGZsYWdzKQorICAgIDogICBUcmFjayhwbGF5YmFja1RocmVhZCwgTlVMTCwgQVVESU9fU1RSRUFNX0NOVCwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgYnVmZmVyLCAwLCAwLCBnZXR1aWQoKSwgZmxhZ3MsIFRZUEVfUEFUQ0gpLAorICAgICAgICAgICAgICBtUHJveHkobmV3IENsaWVudFByb3h5KG1DYmxrLCBtQnVmZmVyLCBmcmFtZUNvdW50LCBtRnJhbWVTaXplLCB0cnVlLCB0cnVlKSkKK3sKKyAgICB1aW50NjRfdCBtaXhCdWZmZXJOcyA9ICgodWludDY0X3QpMiAqIHBsYXliYWNrVGhyZWFkLT5mcmFtZUNvdW50KCkgKiAxMDAwMDAwMDAwKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrVGhyZWFkLT5zYW1wbGVSYXRlKCk7CisgICAgbVBlZXJUaW1lb3V0LnR2X3NlYyA9IG1peEJ1ZmZlck5zIC8gMTAwMDAwMDAwMDsKKyAgICBtUGVlclRpbWVvdXQudHZfbnNlYyA9IChpbnQpIChtaXhCdWZmZXJOcyAlIDEwMDAwMDAwMDApOworCisgICAgQUxPR1YoIlBhdGNoVHJhY2sgJXAgc2FtcGxlUmF0ZSAlZCBtUGVlclRpbWVvdXQgJWQuJTAzZCBzZWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KW1QZWVyVGltZW91dC50dl9zZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKG1QZWVyVGltZW91dC50dl9uc2VjIC8gMTAwMDAwMCkpOworfQorCitBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrOjp+UGF0Y2hUcmFjaygpCit7Cit9CisKKy8vIEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrOjpnZXROZXh0QnVmZmVyKAorICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlciwgaW50NjRfdCBwdHMpCit7CisgICAgQUxPR19BU1NFUlQobVBlZXJQcm94eSAhPSAwLCAiUGF0Y2hUcmFjazo6Z2V0TmV4dEJ1ZmZlcigpIGNhbGxlZCB3aXRob3V0IHBlZXIgcHJveHkiKTsKKyAgICBQcm94eTo6QnVmZmVyIGJ1ZjsKKyAgICBidWYubUZyYW1lQ291bnQgPSBidWZmZXItPmZyYW1lQ291bnQ7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVBlZXJQcm94eS0+b2J0YWluQnVmZmVyKCZidWYsICZtUGVlclRpbWVvdXQpOworICAgIEFMT0dWX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwgIlBhdGNoVHJhY2soKSAlcCBnZXROZXh0QnVmZmVyIHN0YXR1cyAlZCIsIHRoaXMsIHN0YXR1cyk7CisgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gYnVmLm1GcmFtZUNvdW50OworICAgIGlmIChidWYubUZyYW1lQ291bnQgPT0gMCkgeworICAgICAgICByZXR1cm4gV09VTERfQkxPQ0s7CisgICAgfQorICAgIHN0YXR1cyA9IFRyYWNrOjpnZXROZXh0QnVmZmVyKGJ1ZmZlciwgcHRzKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s6OnJlbGVhc2VCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpCit7CisgICAgQUxPR19BU1NFUlQobVBlZXJQcm94eSAhPSAwLCAiUGF0Y2hUcmFjazo6cmVsZWFzZUJ1ZmZlcigpIGNhbGxlZCB3aXRob3V0IHBlZXIgcHJveHkiKTsKKyAgICBQcm94eTo6QnVmZmVyIGJ1ZjsKKyAgICBidWYubUZyYW1lQ291bnQgPSBidWZmZXItPmZyYW1lQ291bnQ7CisgICAgYnVmLm1SYXcgPSBidWZmZXItPnJhdzsKKyAgICBtUGVlclByb3h5LT5yZWxlYXNlQnVmZmVyKCZidWYpOworICAgIFRyYWNrQmFzZTo6cmVsZWFzZUJ1ZmZlcihidWZmZXIpOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrOjpvYnRhaW5CdWZmZXIoUHJveHk6OkJ1ZmZlciogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqdGltZU91dCkKK3sKKyAgICByZXR1cm4gbVByb3h5LT5vYnRhaW5CdWZmZXIoYnVmZmVyLCB0aW1lT3V0KTsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrOjpyZWxlYXNlQnVmZmVyKFByb3h5OjpCdWZmZXIqIGJ1ZmZlcikKK3sKKyAgICBtUHJveHktPnJlbGVhc2VCdWZmZXIoYnVmZmVyKTsKKyAgICBpZiAoYW5kcm9pZF9hdG9taWNfYW5kKH5DQkxLX0RJU0FCTEVELCAmbUNibGstPm1GbGFncykgJiBDQkxLX0RJU0FCTEVEKSB7CisgICAgICAgIEFMT0dXKCJQYXRjaFRyYWNrOjpyZWxlYXNlQnVmZmVyKCkgZGlzYWJsZWQgZHVlIHRvIHByZXZpb3VzIHVuZGVycnVuLCByZXN0YXJ0aW5nIik7CisgICAgICAgIHN0YXJ0KCk7CisgICAgfQorICAgIGFuZHJvaWRfYXRvbWljX29yKENCTEtfRk9SQ0VSRUFEWSwgJm1DYmxrLT5tRmxhZ3MpOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyAgICAgIFJlY29yZAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTcyMSwxMCArMTk1MCw2IEBACiAgICAgbVJlY29yZFRyYWNrLT5kZXN0cm95KCk7CiB9CiAKLXNwPElNZW1vcnk+IEF1ZGlvRmxpbmdlcjo6UmVjb3JkSGFuZGxlOjpnZXRDYmxrKCkgY29uc3QgewotICAgIHJldHVybiBtUmVjb3JkVHJhY2stPmdldENibGsoKTsKLX0KLQogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRIYW5kbGU6OnN0YXJ0KGludCAvKkF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QqLyBldmVudCwKICAgICAgICAgaW50IHRyaWdnZXJTZXNzaW9uKSB7CiAgICAgQUxPR1YoIlJlY29yZEhhbmRsZTo6c3RhcnQoKSIpOwpAQCAtMTc0OCw3ICsxOTczLDcgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0vLyBSZWNvcmRUcmFjayBjb25zdHJ1Y3RvciBtdXN0IGJlIGNhbGxlZCB3aXRoIEF1ZGlvRmxpbmdlcjo6bUxvY2sgaGVsZAorLy8gUmVjb3JkVHJhY2sgY29uc3RydWN0b3IgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGFuZCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCiBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OlJlY29yZFRyYWNrKAogICAgICAgICAgICAgUmVjb3JkVGhyZWFkICp0aHJlYWQsCiAgICAgICAgICAgICBjb25zdCBzcDxDbGllbnQ+JiBjbGllbnQsCkBAIC0xNzU2LDI4ICsxOTgxLDU5IEBACiAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAogICAgICAgICAgICAgaW50IHNlc3Npb25JZCwKLSAgICAgICAgICAgIGludCB1aWQpCisgICAgICAgICAgICBpbnQgdWlkLAorICAgICAgICAgICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgIHRyYWNrX3R5cGUgdHlwZSkKICAgICA6ICAgVHJhY2tCYXNlKHRocmVhZCwgY2xpZW50LCBzYW1wbGVSYXRlLCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgMCAvKnNoYXJlZEJ1ZmZlciovLCBzZXNzaW9uSWQsIHVpZCwgZmFsc2UgLyppc091dCovKSwKLSAgICAgICAgbU92ZXJmbG93KGZhbHNlKQorICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIGJ1ZmZlciwgc2Vzc2lvbklkLCB1aWQsCisgICAgICAgICAgICAgICAgICBmbGFncywgZmFsc2UgLyppc091dCovLAorICAgICAgICAgICAgICAgICAgKHR5cGUgPT0gVFlQRV9ERUZBVUxUKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICgoZmxhZ3MgJiBJQXVkaW9GbGluZ2VyOjpUUkFDS19GQVNUKSA/IEFMTE9DX1BJUEUgOiBBTExPQ19DQkxLKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICgoYnVmZmVyID09IE5VTEwpID8gQUxMT0NfTE9DQUwgOiBBTExPQ19OT05FKSwKKyAgICAgICAgICAgICAgICAgIHR5cGUpLAorICAgICAgICBtT3ZlcmZsb3coZmFsc2UpLCBtUmVzYW1wbGVyKE5VTEwpLCBtUnNtcE91dEJ1ZmZlcihOVUxMKSwgbVJzbXBPdXRGcmFtZUNvdW50KDApLAorICAgICAgICAvLyBTZWUgcmVhbCBpbml0aWFsaXphdGlvbiBvZiBtUnNtcEluRnJvbnQgYXQgUmVjb3JkVGhyZWFkOjpzdGFydCgpCisgICAgICAgIG1Sc21wSW5VbnJlbCgwKSwgbVJzbXBJbkZyb250KDApLCBtRnJhbWVzVG9Ecm9wKDApLCBtUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIoTlVMTCkKIHsKLSAgICBBTE9HVigiUmVjb3JkVHJhY2sgY29uc3RydWN0b3IiKTsKLSAgICBpZiAobUNibGsgIT0gTlVMTCkgewotICAgICAgICBtQXVkaW9SZWNvcmRTZXJ2ZXJQcm94eSA9IG5ldyBBdWRpb1JlY29yZFNlcnZlclByb3h5KG1DYmxrLCBtQnVmZmVyLCBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgIG1GcmFtZVNpemUpOwotICAgICAgICBtU2VydmVyUHJveHkgPSBtQXVkaW9SZWNvcmRTZXJ2ZXJQcm94eTsKKyAgICBpZiAobUNibGsgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbVNlcnZlclByb3h5ID0gbmV3IEF1ZGlvUmVjb3JkU2VydmVyUHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lU2l6ZSwgIWlzRXh0ZXJuYWxUcmFjaygpKTsKKworICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGNoYW5uZWxNYXNrKTsKKyAgICAvLyBGSVhNRSBJIGRvbid0IHVuZGVyc3RhbmQgZWl0aGVyIG9mIHRoZSBjaGFubmVsIGNvdW50IGNoZWNrcworICAgIGlmICh0aHJlYWQtPm1TYW1wbGVSYXRlICE9IHNhbXBsZVJhdGUgJiYgdGhyZWFkLT5tQ2hhbm5lbENvdW50IDw9IEZDQ18yICYmCisgICAgICAgICAgICBjaGFubmVsQ291bnQgPD0gRkNDXzIpIHsKKyAgICAgICAgLy8gc2luayBTUgorICAgICAgICBtUmVzYW1wbGVyID0gQXVkaW9SZXNhbXBsZXI6OmNyZWF0ZShBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKKyAgICAgICAgICAgICAgICB0aHJlYWQtPm1DaGFubmVsQ291bnQsIHNhbXBsZVJhdGUpOworICAgICAgICAvLyBzb3VyY2UgU1IKKyAgICAgICAgbVJlc2FtcGxlci0+c2V0U2FtcGxlUmF0ZSh0aHJlYWQtPm1TYW1wbGVSYXRlKTsKKyAgICAgICAgbVJlc2FtcGxlci0+c2V0Vm9sdW1lKEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU5fRkxPQVQsIEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU5fRkxPQVQpOworICAgICAgICBtUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIgPSBuZXcgUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIodGhpcyk7CisgICAgfQorCisgICAgaWYgKGZsYWdzICYgSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfRkFTVCkgeworICAgICAgICBBTE9HX0FTU0VSVCh0aHJlYWQtPm1GYXN0VHJhY2tBdmFpbCk7CisgICAgICAgIHRocmVhZC0+bUZhc3RUcmFja0F2YWlsID0gZmFsc2U7CiAgICAgfQogfQogCiBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6On5SZWNvcmRUcmFjaygpCiB7CiAgICAgQUxPR1YoIiVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBtUmVzYW1wbGVyOworICAgIGRlbGV0ZVtdIG1Sc21wT3V0QnVmZmVyOworICAgIGRlbGV0ZSBtUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXI7CiB9CiAKIC8vIEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OmdldE5leHRCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIsCi0gICAgICAgIGludDY0X3QgcHRzKQorICAgICAgICBpbnQ2NF90IHB0cyBfX3VudXNlZCkKIHsKICAgICBTZXJ2ZXJQcm94eTo6QnVmZmVyIGJ1ZjsKICAgICBidWYubUZyYW1lQ291bnQgPSBidWZmZXItPmZyYW1lQ291bnQ7CkBAIC0xODA4LDggKzIwNjQsOCBAQAogICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOwogICAgIGlmICh0aHJlYWQgIT0gMCkgewogICAgICAgICBSZWNvcmRUaHJlYWQgKnJlY29yZFRocmVhZCA9IChSZWNvcmRUaHJlYWQgKil0aHJlYWQuZ2V0KCk7Ci0gICAgICAgIGlmIChyZWNvcmRUaHJlYWQtPnN0b3AodGhpcykpIHsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wSW5wdXQocmVjb3JkVGhyZWFkLT5pZCgpKTsKKyAgICAgICAgaWYgKHJlY29yZFRocmVhZC0+c3RvcCh0aGlzKSAmJiBpc0V4dGVybmFsVHJhY2soKSkgeworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BJbnB1dChtVGhyZWFkSW9IYW5kbGUsIChhdWRpb19zZXNzaW9uX3QpbVNlc3Npb25JZCk7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0xODE5LDEyICsyMDc1LDE0IEBACiAgICAgLy8gc2VlIGNvbW1lbnRzIGF0IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpkZXN0cm95KCkKICAgICBzcDxSZWNvcmRUcmFjaz4ga2VlcCh0aGlzKTsKICAgICB7CisgICAgICAgIGlmIChpc0V4dGVybmFsVHJhY2soKSkgeworICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBBQ1RJVkUgfHwgbVN0YXRlID09IFJFU1VNSU5HKSB7CisgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BJbnB1dChtVGhyZWFkSW9IYW5kbGUsIChhdWRpb19zZXNzaW9uX3QpbVNlc3Npb25JZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUlucHV0KG1UaHJlYWRJb0hhbmRsZSwgKGF1ZGlvX3Nlc3Npb25fdCltU2Vzc2lvbklkKTsKKyAgICAgICAgfQogICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKICAgICAgICAgaWYgKHRocmVhZCAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAobVN0YXRlID09IEFDVElWRSB8fCBtU3RhdGUgPT0gUkVTVU1JTkcpIHsKLSAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcElucHV0KHRocmVhZC0+aWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUlucHV0KHRocmVhZC0+aWQoKSk7CiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodGhyZWFkLT5tTG9jayk7CiAgICAgICAgICAgICBSZWNvcmRUaHJlYWQgKnJlY29yZFRocmVhZCA9IChSZWNvcmRUaHJlYWQgKikgdGhyZWFkLmdldCgpOwogICAgICAgICAgICAgcmVjb3JkVGhyZWFkLT5kZXN0cm95VHJhY2tfbCh0aGlzKTsKQEAgLTE4MzksMjUgKzIwOTcsMTE3IEBACiAgICAgYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19JTlZBTElELCAmY2Jsay0+bUZsYWdzKTsKICAgICBhbmRyb2lkX2F0b21pY19yZWxlYXNlX3N0b3JlKDB4NDAwMDAwMDAsICZjYmxrLT5tRnV0ZXgpOwogICAgIC8vIGNsaWVudCBpcyBub3QgaW4gc2VydmVyLCBzbyBGVVRFWF9XQUtFIGlzIG5lZWRlZCBpbnN0ZWFkIG9mIEZVVEVYX1dBS0VfUFJJVkFURQotICAgICh2b2lkKSBfX2Z1dGV4X3N5c2NhbGwzKCZjYmxrLT5tRnV0ZXgsIEZVVEVYX1dBS0UsIElOVF9NQVgpOworICAgICh2b2lkKSBzeXNjYWxsKF9fTlJfZnV0ZXgsICZjYmxrLT5tRnV0ZXgsIEZVVEVYX1dBS0UsIElOVF9NQVgpOwogfQogCiAKIC8qc3RhdGljKi8gdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KQogewotICAgIHJlc3VsdC5hcHBlbmQoIkNsaWVudCBGbXQgQ2huIG1hc2sgU2Vzc2lvbiBTICAgU2VydmVyIGZDb3VudFxuIik7CisgICAgcmVzdWx0LmFwcGVuZCgiICAgIEFjdGl2ZSBDbGllbnQgRm10IENobiBtYXNrIFNlc3Npb24gUyAgIFNlcnZlciBmQ291bnQgU1JhdGVcbiIpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6ZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplKQordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OmR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSwgYm9vbCBhY3RpdmUpCiB7Ci0gICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiJTZ1ICUzdSAlMDhYICU3dSAlMWQgJTA4WCAlNnVcbiIsCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiICAgICU2cyAlNnUgJTN1ICUwOFggJTd1ICUxZCAlMDhYICU2enUgJTV1XG4iLAorICAgICAgICAgICAgYWN0aXZlID8gInllcyIgOiAibm8iLAogICAgICAgICAgICAgKG1DbGllbnQgPT0gMCkgPyBnZXRwaWRfY2FjaGVkIDogbUNsaWVudC0+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+QXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UoKSB7fQorCisgICAgLy8KKyAgICAvLyBBdWRpbyBIVyBtb2R1bGUgZnVuY3Rpb25zCisgICAgLy8KKworICAgIC8vIGxvYWRzIGEgSFcgbW9kdWxlLgorICAgIHZpcnR1YWwgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGxvYWRId01vZHVsZShjb25zdCBjaGFyICpuYW1lKSA9IDA7CisKKyAgICAvLworICAgIC8vIEF1ZGlvIG91dHB1dCBDb250cm9sIGZ1bmN0aW9ucworICAgIC8vCisKKyAgICAvLyBvcGVucyBhbiBhdWRpbyBvdXRwdXQgd2l0aCB0aGUgcmVxdWVzdGVkIHBhcmFtZXRlcnMuIFRoZSBwYXJhbWV0ZXIgdmFsdWVzIGNhbiBpbmRpY2F0ZSB0byB1c2UgdGhlIGRlZmF1bHQgdmFsdWVzCisgICAgLy8gaW4gY2FzZSB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgaGFzIG5vIHNwZWNpZmljIHJlcXVpcmVtZW50cyBmb3IgdGhlIG91dHB1dCBiZWluZyBvcGVuZWQuCisgICAgLy8gV2hlbiB0aGUgZnVuY3Rpb24gcmV0dXJucywgdGhlIHBhcmFtZXRlciB2YWx1ZXMgcmVmbGVjdCB0aGUgYWN0dWFsIHZhbHVlcyB1c2VkIGJ5IHRoZSBhdWRpbyBoYXJkd2FyZSBvdXRwdXQgc3RyZWFtLgorICAgIC8vIFRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciBjYW4gY2hlY2sgaWYgdGhlIHByb3Bvc2VkIHBhcmFtZXRlcnMgYXJlIHN1aXRhYmxlIG9yIG5vdCBhbmQgYWN0IGFjY29yZGluZ2x5LgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3Blbk91dHB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpsYXRlbmN5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKSA9IDA7CisgICAgLy8gY3JlYXRlcyBhIHNwZWNpYWwgb3V0cHV0IHRoYXQgaXMgZHVwbGljYXRlZCB0byB0aGUgdHdvIG91dHB1dHMgcGFzc2VkIGFzIGFyZ3VtZW50cy4gVGhlIGR1cGxpY2F0aW9uIGlzIHBlcmZvcm1lZCBieQorICAgIC8vIGEgc3BlY2lhbCBtaXhlciB0aHJlYWQgaW4gdGhlIEF1ZGlvRmxpbmdlci4KKyAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IG9wZW5EdXBsaWNhdGVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MikgPSAwOworICAgIC8vIGNsb3NlcyB0aGUgb3V0cHV0IHN0cmVhbQorICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSA9IDA7CisgICAgLy8gc3VzcGVuZHMgdGhlIG91dHB1dC4gV2hlbiBhbiBvdXRwdXQgaXMgc3VzcGVuZGVkLCB0aGUgY29ycmVzcG9uZGluZyBhdWRpbyBoYXJkd2FyZSBvdXRwdXQgc3RyZWFtIGlzIHBsYWNlZCBpbgorICAgIC8vIHN0YW5kYnkgYW5kIHRoZSBBdWRpb1RyYWNrcyBhdHRhY2hlZCB0byB0aGUgbWl4ZXIgdGhyZWFkIGFyZSBzdGlsbCBwcm9jZXNzZWQgYnV0IHRoZSBvdXRwdXQgbWl4IGlzIGRpc2NhcmRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1c3BlbmRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSA9IDA7CisgICAgLy8gcmVzdG9yZXMgYSBzdXNwZW5kZWQgb3V0cHV0LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdG9yZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpID0gMDsKKworICAgIC8vCisgICAgLy8gQXVkaW8gaW5wdXQgQ29udHJvbCBmdW5jdGlvbnMKKyAgICAvLworCisgICAgLy8gb3BlbnMgYW4gYXVkaW8gaW5wdXQKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5JbnB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpID0gMDsKKyAgICAvLyBjbG9zZXMgYW4gYXVkaW8gaW5wdXQKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpID0gMDsKKyAgICAvLworICAgIC8vIG1pc2MgY29udHJvbCBmdW5jdGlvbnMKKyAgICAvLworCisgICAgLy8gc2V0IGEgc3RyZWFtIHZvbHVtZSBmb3IgYSBwYXJ0aWN1bGFyIG91dHB1dC4gRm9yIHRoZSBzYW1lIHVzZXIgc2V0dGluZywgYSBnaXZlbiBzdHJlYW0gdHlwZSBjYW4gaGF2ZSBkaWZmZXJlbnQgdm9sdW1lcworICAgIC8vIGZvciBlYWNoIG91dHB1dCAoZGVzdGluYXRpb24gZGV2aWNlKSBpdCBpcyBhdHRhY2hlZCB0by4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgZmxvYXQgdm9sdW1lLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIGludCBkZWxheU1zID0gMCkgPSAwOworCisgICAgLy8gaW52YWxpZGF0ZSBhIHN0cmVhbSB0eXBlLCBjYXVzaW5nIGEgcmVyb3V0ZSB0byBhbiB1bnNwZWNpZmllZCBuZXcgb3V0cHV0CisgICAgdmlydHVhbCBzdGF0dXNfdCBpbnZhbGlkYXRlU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSA9IDA7CisKKyAgICAvLyBmdW5jdGlvbiBlbmFibGluZyB0byBzZW5kIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9ucyBkaXJlY3RseSBmcm9tIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRvIGF1ZGlvIGhhcmR3YXJlIGludGVyZmFjZS4KKyAgICB2aXJ0dWFsIHZvaWQgc2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycywgaW50IGRlbGF5TXMgPSAwKSA9IDA7CisgICAgLy8gZnVuY3Rpb24gZW5hYmxpbmcgdG8gcmVjZWl2ZSBwcm9wcmlldGFyeSBpbmZvcm1hdGlvbnMgZGlyZWN0bHkgZnJvbSBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UgdG8gYXVkaW8gcG9saWN5IG1hbmFnZXIuCisgICAgdmlydHVhbCBTdHJpbmc4IGdldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IFN0cmluZzgmIGtleXMpID0gMDsKKworICAgIC8vIHJlcXVlc3QgdGhlIHBsYXliYWNrIG9mIGEgdG9uZSBvbiB0aGUgc3BlY2lmaWVkIHN0cmVhbTogdXNlZCBmb3IgaW5zdGFuY2UgdG8gcmVwbGFjZSBub3RpZmljYXRpb24gc291bmRzIHdoZW4gcGxheWluZworICAgIC8vIG92ZXIgYSB0ZWxlcGhvbnkgZGV2aWNlIGR1cmluZyBhIHBob25lIGNhbGwuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydFRvbmUoYXVkaW9fcG9saWN5X3RvbmVfdCB0b25lLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcFRvbmUoKSA9IDA7CisKKyAgICAvLyBzZXQgZG93biBsaW5rIGF1ZGlvIHZvbHVtZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5TXMgPSAwKSA9IDA7CisKKyAgICAvLyBtb3ZlIGVmZmVjdCB0byB0aGUgc3BlY2lmaWVkIG91dHB1dAorICAgIHZpcnR1YWwgc3RhdHVzX3QgbW92ZUVmZmVjdHMoaW50IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgc3JjT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGRzdE91dHB1dCkgPSAwOworCisgICAgLyogQ3JlYXRlIGEgcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cyAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKSA9IDA7CisKKyAgICAvKiBSZWxlYXNlIGEgcGF0Y2ggKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKSA9IDA7CisKKyAgICAvKiBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcsIGludCBkZWxheU1zKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1BvcnRMaXN0VXBkYXRlKCkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKSA9IDA7CisKKyAgICB2aXJ0dWFsIGF1ZGlvX3VuaXF1ZV9pZF90IG5ld0F1ZGlvVW5pcXVlSWQoKSA9IDA7Cit9OworCitleHRlcm4gIkMiIEF1ZGlvUG9saWN5SW50ZXJmYWNlKiBjcmVhdGVBdWRpb1BvbGljeU1hbmFnZXIoQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSk7CitleHRlcm4gIkMiIHZvaWQgZGVzdHJveUF1ZGlvUG9saWN5TWFuYWdlcihBdWRpb1BvbGljeUludGVyZmFjZSAqaW50ZXJmYWNlKTsKKworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9BVURJT1BPTElDWV9JTlRFUkZBQ0VfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYzOWM2ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAKQEAgLTAsMCArMSw2MDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvUG9saWN5SW50ZWZhY2VJbXBsIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSAiQXVkaW9Qb2xpY3lTZXJ2aWNlLmgiCisjaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGlmICghc2V0dGluZ3NBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSAmJiAhYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKHN0YXRlICE9IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFICYmCisgICAgICAgICAgICBzdGF0ZSAhPSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLCBkZXZpY2VfYWRkcmVzcyk7Cit9CisKK2F1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldERldmljZUNvbm5lY3Rpb25TdGF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRTsKKyAgICB9CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfYWRkcmVzcyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIGlmICh1aW50MzJfdChzdGF0ZSkgPj0gQVVESU9fTU9ERV9DTlQpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBBTE9HVigic2V0UGhvbmVTdGF0ZSgpIik7CisKKyAgICAvLyBUT0RPOiBjaGVjayBpZiBpdCBpcyBtb3JlIGFwcHJvcHJpYXRlIHRvIGRvIGl0IGluIHBsYXRmb3JtIHNwZWNpZmljIHBvbGljeSBtYW5hZ2VyCisgICAgQXVkaW9TeXN0ZW06OnNldE1vZGUoc3RhdGUpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXRQaG9uZVN0YXRlKHN0YXRlKTsKKyAgICBtUGhvbmVTdGF0ZSA9IHN0YXRlOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworYXVkaW9fbW9kZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0UGhvbmVTdGF0ZSgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbVBob25lU3RhdGU7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgaWYgKHVzYWdlIDwgMCB8fCB1c2FnZSA+PSBBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAoY29uZmlnIDwgMCB8fCBjb25maWcgPj0gQVVESU9fUE9MSUNZX0ZPUkNFX0NGR19DTlQpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgQUxPR1YoInNldEZvcmNlVXNlKCkiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldEZvcmNlVXNlKHVzYWdlLCBjb25maWcpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORTsKKyAgICB9CisgICAgaWYgKHVzYWdlIDwgMCB8fCB1c2FnZSA+PSBBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVCkgeworICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkU7CisgICAgfQorICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRGb3JjZVVzZSh1c2FnZSk7Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0T3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykKK3sKKyAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7CisgICAgICAgIHJldHVybiBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICB9CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgfQorICAgIEFMT0dWKCJnZXRPdXRwdXQoKSIpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldE91dHB1dChzdHJlYW0sIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZsYWdzLCBvZmZsb2FkSW5mbyk7Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIEFMT0dWKCJnZXRPdXRwdXQoKSIpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldE91dHB1dEZvckF0dHIoYXR0ciwgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBjaGFubmVsTWFzaywgZmxhZ3MsIG9mZmxvYWRJbmZvKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbikKK3sKKyAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIEFMT0dWKCJzdGFydE91dHB1dCgpIik7CisgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIGF1ZGlvUG9saWN5RWZmZWN0cyA9IG1BdWRpb1BvbGljeUVmZmVjdHM7CisgICAgfQorICAgIGlmIChhdWRpb1BvbGljeUVmZmVjdHMgIT0gMCkgeworICAgICAgICAvLyBjcmVhdGUgYXVkaW8gcHJvY2Vzc29ycyBhY2NvcmRpbmcgdG8gc3RyZWFtCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9saWN5RWZmZWN0cy0+YWRkT3V0cHV0U2Vzc2lvbkVmZmVjdHMob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SICYmIHN0YXR1cyAhPSBBTFJFQURZX0VYSVNUUykgeworICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byBhZGQgZWZmZWN0cyBvbiBzZXNzaW9uICVkIiwgc2Vzc2lvbik7CisgICAgICAgIH0KKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RhcnRPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKQoreworICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgQUxPR1YoInN0b3BPdXRwdXQoKSIpOworICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT5zdG9wT3V0cHV0Q29tbWFuZChvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCAgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb1N0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCit7CisgICAgQUxPR1YoImRvU3RvcE91dHB1dCBmcm9tIHRpZCAlZCIsIGdldHRpZCgpKTsKKyAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgYXVkaW9Qb2xpY3lFZmZlY3RzID0gbUF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICB9CisgICAgaWYgKGF1ZGlvUG9saWN5RWZmZWN0cyAhPSAwKSB7CisgICAgICAgIC8vIHJlbGVhc2UgYXVkaW8gcHJvY2Vzc29ycyBmcm9tIHRoZSBzdHJlYW0KKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXVkaW9Qb2xpY3lFZmZlY3RzLT5yZWxlYXNlT3V0cHV0U2Vzc2lvbkVmZmVjdHMob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SICYmIHN0YXR1cyAhPSBBTFJFQURZX0VYSVNUUykgeworICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byByZWxlYXNlIGVmZmVjdHMgb24gc2Vzc2lvbiAlZCIsIHNlc3Npb24pOworICAgICAgICB9CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnN0b3BPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6cmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dWKCJyZWxlYXNlT3V0cHV0KCkiKTsKKyAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+cmVsZWFzZU91dHB1dENvbW1hbmQob3V0cHV0KTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmRvUmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCit7CisgICAgQUxPR1YoImRvUmVsZWFzZU91dHB1dCBmcm9tIHRpZCAlZCIsIGdldHRpZCgpKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VPdXRwdXQob3V0cHV0KTsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnB1dChhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLy8gYWxyZWFkeSBjaGVja2VkIGJ5IGNsaWVudCwgYnV0IGRvdWJsZS1jaGVjayBpbiBjYXNlIHRoZSBjbGllbnQgd3JhcHBlciBpcyBieXBhc3NlZAorICAgIGlmIChpbnB1dFNvdXJjZSA+PSBBVURJT19TT1VSQ0VfQ05UICYmIGlucHV0U291cmNlICE9IEFVRElPX1NPVVJDRV9IT1RXT1JEKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICgoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpICYmICFjYXB0dXJlSG90d29yZEFsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQ7CisgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIC8vIHRoZSBhdWRpb19pbl9hY291c3RpY3NfdCBwYXJhbWV0ZXIgaXMgaWdub3JlZCBieSBnZXRfaW5wdXQoKQorICAgICAgICBpbnB1dCA9IG1BdWRpb1BvbGljeU1hbmFnZXItPmdldElucHV0KGlucHV0U291cmNlLCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fc2Vzc2lvbl90KWF1ZGlvU2Vzc2lvbiwgZmxhZ3MpOworICAgICAgICBhdWRpb1BvbGljeUVmZmVjdHMgPSBtQXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIH0KKyAgICBpZiAoaW5wdXQgPT0gMCkgeworICAgICAgICByZXR1cm4gaW5wdXQ7CisgICAgfQorICAgIGlmIChhdWRpb1BvbGljeUVmZmVjdHMgIT0gMCkgeworICAgICAgICAvLyBjcmVhdGUgYXVkaW8gcHJlIHByb2Nlc3NvcnMgYWNjb3JkaW5nIHRvIGlucHV0IHNvdXJjZQorICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdWRpb1BvbGljeUVmZmVjdHMtPmFkZElucHV0RWZmZWN0cyhpbnB1dCwgaW5wdXRTb3VyY2UsIGF1ZGlvU2Vzc2lvbik7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgJiYgc3RhdHVzICE9IEFMUkVBRFlfRVhJU1RTKSB7CisgICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGFkZCBlZmZlY3RzIG9uIGlucHV0ICVkIiwgaW5wdXQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbnB1dDsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RhcnRJbnB1dChpbnB1dCwgc2Vzc2lvbik7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdG9wSW5wdXQoaW5wdXQsIHNlc3Npb24pOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6cmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VJbnB1dChpbnB1dCwgc2Vzc2lvbik7CisgICAgICAgIGF1ZGlvUG9saWN5RWZmZWN0cyA9IG1BdWRpb1BvbGljeUVmZmVjdHM7CisgICAgfQorICAgIGlmIChhdWRpb1BvbGljeUVmZmVjdHMgIT0gMCkgeworICAgICAgICAvLyByZWxlYXNlIGF1ZGlvIHByb2Nlc3NvcnMgZnJvbSB0aGUgaW5wdXQKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXVkaW9Qb2xpY3lFZmZlY3RzLT5yZWxlYXNlSW5wdXRFZmZlY3RzKGlucHV0KTsKKyAgICAgICAgaWYoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIHJlbGVhc2UgZWZmZWN0cyBvbiBpbnB1dCAlZCIsIGlucHV0KTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1heCkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPmluaXRTdHJlYW1Wb2x1bWUoc3RyZWFtLCBpbmRleE1pbiwgaW5kZXhNYXgpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGlmICghc2V0dGluZ3NBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldFN0cmVhbVZvbHVtZUluZGV4KHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0U3RyZWFtVm9sdW1lSW5kZXgoc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7Cit9CisKK3VpbnQzMl90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCit7CisgICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldFN0cmF0ZWd5Rm9yU3RyZWFtKHN0cmVhbSk7Cit9CisKKy8vYXVkaW8gcG9saWN5OiB1c2UgYXVkaW9fZGV2aWNlX3QgYXBwcm9wcmlhdGVseQorCithdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQoreworICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX0RFVklDRV9OT05FOworICAgIH0KKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICB9CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldERldmljZXNGb3JTdHJlYW0oc3RyZWFtKTsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRPdXRwdXRGb3JFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYykKK3sKKyAgICAvLyBGSVhNRSBjaGFuZ2UgcmV0dXJuIHR5cGUgdG8gc3RhdHVzX3QsIGFuZCByZXR1cm4gTk9fSU5JVCBoZXJlCisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0T3V0cHV0Rm9yRWZmZWN0KGRlc2MpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlZ2lzdGVyRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVnaXN0ZXJFZmZlY3QoZGVzYywgaW8sIHN0cmF0ZWd5LCBzZXNzaW9uLCBpZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6dW5yZWdpc3RlckVmZmVjdChpbnQgaWQpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnVucmVnaXN0ZXJFZmZlY3QoaWQpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEVmZmVjdEVuYWJsZWQoaW50IGlkLCBib29sIGVuYWJsZWQpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldEVmZmVjdEVuYWJsZWQoaWQsIGVuYWJsZWQpOworfQorCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAoreworICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+aXNTdHJlYW1BY3RpdmUoc3RyZWFtLCBpblBhc3RNcyk7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKK3sKKyAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoc3RyZWFtLCBpblBhc3RNcyk7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0Cit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmlzU291cmNlQWN0aXZlKHNvdXJjZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZyhpbnQgYXVkaW9TZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjb3VudCkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgICpjb3VudCA9IDA7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgYXVkaW9Qb2xpY3lFZmZlY3RzID0gbUF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICB9CisgICAgaWYgKGF1ZGlvUG9saWN5RWZmZWN0cyA9PSAwKSB7CisgICAgICAgICpjb3VudCA9IDA7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gYXVkaW9Qb2xpY3lFZmZlY3RzLT5xdWVyeURlZmF1bHRJbnB1dEVmZmVjdHMoYXVkaW9TZXNzaW9uLCBkZXNjcmlwdG9ycywgY291bnQpOworfQorCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBpbmZvKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1YoIm1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmlzT2ZmbG9hZFN1cHBvcnRlZChpbmZvKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZighbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+bGlzdEF1ZGlvUG9ydHMocm9sZSwgdHlwZSwgbnVtX3BvcnRzLCBwb3J0cywgZ2VuZXJhdGlvbik7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYoIW1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldEF1ZGlvUG9ydChwb3J0KTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZighbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmNyZWF0ZUF1ZGlvUGF0Y2gocGF0Y2gsIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZighbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVsZWFzZUF1ZGlvUGF0Y2goaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6Omxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywKKyAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzLAorICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZighbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+bGlzdEF1ZGlvUGF0Y2hlcyhudW1fcGF0Y2hlcywgcGF0Y2hlcywgZ2VuZXJhdGlvbik7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYoIW1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldEF1ZGlvUG9ydENvbmZpZyhjb25maWcpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKHNlc3Npb24sIGlvSGFuZGxlLCBkZXZpY2UpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbGVhc2VTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VTb3VuZFRyaWdnZXJTZXNzaW9uKHNlc3Npb24pOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsTGVnYWN5LmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbExlZ2FjeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNiNmEyNAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbExlZ2FjeS5jcHAKQEAgLTAsMCArMSw1NzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvUG9saWN5U2VydmljZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgIkF1ZGlvUG9saWN5U2VydmljZS5oIgorI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKKworI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19wb2xpY3kuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKQoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGlmICghc2V0dGluZ3NBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSAmJiAhYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKHN0YXRlICE9IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFICYmCisgICAgICAgICAgICBzdGF0ZSAhPSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+c2V0X2RldmljZV9jb25uZWN0aW9uX3N0YXRlKG1wQXVkaW9Qb2xpY3ksIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLCBkZXZpY2VfYWRkcmVzcyk7Cit9CisKK2F1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldERldmljZUNvbm5lY3Rpb25TdGF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpCit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRTsKKyAgICB9CisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmdldF9kZXZpY2VfY29ubmVjdGlvbl9zdGF0ZShtcEF1ZGlvUG9saWN5LCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfYWRkcmVzcyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpCit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIGlmICh1aW50MzJfdChzdGF0ZSkgPj0gQVVESU9fTU9ERV9DTlQpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBBTE9HVigic2V0UGhvbmVTdGF0ZSgpIik7CisKKyAgICAvLyBUT0RPOiBjaGVjayBpZiBpdCBpcyBtb3JlIGFwcHJvcHJpYXRlIHRvIGRvIGl0IGluIHBsYXRmb3JtIHNwZWNpZmljIHBvbGljeSBtYW5hZ2VyCisgICAgQXVkaW9TeXN0ZW06OnNldE1vZGUoc3RhdGUpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtcEF1ZGlvUG9saWN5LT5zZXRfcGhvbmVfc3RhdGUobXBBdWRpb1BvbGljeSwgc3RhdGUpOworICAgIG1QaG9uZVN0YXRlID0gc3RhdGU7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCithdWRpb19tb2RlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRQaG9uZVN0YXRlKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtUGhvbmVTdGF0ZTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKQoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGlmICghc2V0dGluZ3NBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICBpZiAodXNhZ2UgPCAwIHx8IHVzYWdlID49IEFVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmIChjb25maWcgPCAwIHx8IGNvbmZpZyA+PSBBVURJT19QT0xJQ1lfRk9SQ0VfQ0ZHX0NOVCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HVigic2V0Rm9yY2VVc2UoKSIpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbXBBdWRpb1BvbGljeS0+c2V0X2ZvcmNlX3VzZShtcEF1ZGlvUG9saWN5LCB1c2FnZSwgY29uZmlnKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2F1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpCit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkU7CisgICAgfQorICAgIGlmICh1c2FnZSA8IDAgfHwgdXNhZ2UgPj0gQVVESU9fUE9MSUNZX0ZPUkNFX1VTRV9DTlQpIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9GT1JDRV9OT05FOworICAgIH0KKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+Z2V0X2ZvcmNlX3VzZShtcEF1ZGlvUG9saWN5LCB1c2FnZSk7Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0T3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykKK3sKKyAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7CisgICAgICAgIHJldHVybiBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICB9CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgfQorICAgIEFMT0dWKCJnZXRPdXRwdXQoKSIpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmdldF9vdXRwdXQobXBBdWRpb1BvbGljeSwgc3RyZWFtLCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmbGFncywgb2ZmbG9hZEluZm8pOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKQoreworICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgQUxPR1YoInN0YXJ0T3V0cHV0KCkiKTsKKyAgICAvLyBjcmVhdGUgYXVkaW8gcHJvY2Vzc29ycyBhY2NvcmRpbmcgdG8gc3RyZWFtCisgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIGF1ZGlvUG9saWN5RWZmZWN0cyA9IG1BdWRpb1BvbGljeUVmZmVjdHM7CisgICAgfQorICAgIGlmIChhdWRpb1BvbGljeUVmZmVjdHMgIT0gMCkgeworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdWRpb1BvbGljeUVmZmVjdHMtPmFkZE91dHB1dFNlc3Npb25FZmZlY3RzKG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiBzdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKKyAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gYWRkIGVmZmVjdHMgb24gc2Vzc2lvbiAlZCIsIHNlc3Npb24pOworICAgICAgICB9CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+c3RhcnRfb3V0cHV0KG1wQXVkaW9Qb2xpY3ksIG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbikKK3sKKyAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIEFMT0dWKCJzdG9wT3V0cHV0KCkiKTsKKyAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+c3RvcE91dHB1dENvbW1hbmQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgIEF1ZGlvUG9saWN5U2VydmljZTo6ZG9TdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKQoreworICAgIEFMT0dWKCJkb1N0b3BPdXRwdXQgZnJvbSB0aWQgJWQiLCBnZXR0aWQoKSk7CisgICAgLy8gcmVsZWFzZSBhdWRpbyBwcm9jZXNzb3JzIGZyb20gdGhlIHN0cmVhbQorICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBhdWRpb1BvbGljeUVmZmVjdHMgPSBtQXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIH0KKyAgICBpZiAoYXVkaW9Qb2xpY3lFZmZlY3RzICE9IDApIHsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXVkaW9Qb2xpY3lFZmZlY3RzLT5yZWxlYXNlT3V0cHV0U2Vzc2lvbkVmZmVjdHMob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SICYmIHN0YXR1cyAhPSBBTFJFQURZX0VYSVNUUykgeworICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byByZWxlYXNlIGVmZmVjdHMgb24gc2Vzc2lvbiAlZCIsIHNlc3Npb24pOworICAgICAgICB9CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnN0b3Bfb3V0cHV0KG1wQXVkaW9Qb2xpY3ksIG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HVigicmVsZWFzZU91dHB1dCgpIik7CisgICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnJlbGVhc2VPdXRwdXRDb21tYW5kKG91dHB1dCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb1JlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQoreworICAgIEFMT0dWKCJkb1JlbGVhc2VPdXRwdXQgZnJvbSB0aWQgJWQiLCBnZXR0aWQoKSk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtcEF1ZGlvUG9saWN5LT5yZWxlYXNlX291dHB1dChtcEF1ZGlvUG9saWN5LCBvdXRwdXQpOworfQorCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldElucHV0KGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9TZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyBfX3VudXNlZCkKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAvLyBhbHJlYWR5IGNoZWNrZWQgYnkgY2xpZW50LCBidXQgZG91YmxlLWNoZWNrIGluIGNhc2UgdGhlIGNsaWVudCB3cmFwcGVyIGlzIGJ5cGFzc2VkCisgICAgaWYgKGlucHV0U291cmNlID49IEFVRElPX1NPVVJDRV9DTlQgJiYgaW5wdXRTb3VyY2UgIT0gQVVESU9fU09VUkNFX0hPVFdPUkQpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKChpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgJiYgIWNhcHR1cmVIb3R3b3JkQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0OworICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICAvLyB0aGUgYXVkaW9faW5fYWNvdXN0aWNzX3QgcGFyYW1ldGVyIGlzIGlnbm9yZWQgYnkgZ2V0X2lucHV0KCkKKyAgICAgICAgaW5wdXQgPSBtcEF1ZGlvUG9saWN5LT5nZXRfaW5wdXQobXBBdWRpb1BvbGljeSwgaW5wdXRTb3VyY2UsIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgY2hhbm5lbE1hc2ssIChhdWRpb19pbl9hY291c3RpY3NfdCkgMCk7CisgICAgICAgIGF1ZGlvUG9saWN5RWZmZWN0cyA9IG1BdWRpb1BvbGljeUVmZmVjdHM7CisgICAgfQorICAgIGlmIChpbnB1dCA9PSAwKSB7CisgICAgICAgIHJldHVybiBpbnB1dDsKKyAgICB9CisKKyAgICBpZiAoYXVkaW9Qb2xpY3lFZmZlY3RzICE9IDApIHsKKyAgICAgICAgLy8gY3JlYXRlIGF1ZGlvIHByZSBwcm9jZXNzb3JzIGFjY29yZGluZyB0byBpbnB1dCBzb3VyY2UKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXVkaW9Qb2xpY3lFZmZlY3RzLT5hZGRJbnB1dEVmZmVjdHMoaW5wdXQsIGlucHV0U291cmNlLCBhdWRpb1Nlc3Npb24pOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SICYmIHN0YXR1cyAhPSBBTFJFQURZX0VYSVNUUykgeworICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byBhZGQgZWZmZWN0cyBvbiBpbnB1dCAlZCIsIGlucHV0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaW5wdXQ7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiBfX3VudXNlZCkKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnN0YXJ0X2lucHV0KG1wQXVkaW9Qb2xpY3ksIGlucHV0KTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiBfX3VudXNlZCkKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnN0b3BfaW5wdXQobXBBdWRpb1BvbGljeSwgaW5wdXQpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6cmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiBfX3VudXNlZCkKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgbXBBdWRpb1BvbGljeS0+cmVsZWFzZV9pbnB1dChtcEF1ZGlvUG9saWN5LCBpbnB1dCk7CisgICAgICAgIGF1ZGlvUG9saWN5RWZmZWN0cyA9IG1BdWRpb1BvbGljeUVmZmVjdHM7CisgICAgfQorICAgIGlmIChhdWRpb1BvbGljeUVmZmVjdHMgIT0gMCkgeworICAgICAgICAvLyByZWxlYXNlIGF1ZGlvIHByb2Nlc3NvcnMgZnJvbSB0aGUgaW5wdXQKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXVkaW9Qb2xpY3lFZmZlY3RzLT5yZWxlYXNlSW5wdXRFZmZlY3RzKGlucHV0KTsKKyAgICAgICAgaWYoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIHJlbGVhc2UgZWZmZWN0cyBvbiBpbnB1dCAlZCIsIGlucHV0KTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1heCkKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1wQXVkaW9Qb2xpY3ktPmluaXRfc3RyZWFtX3ZvbHVtZShtcEF1ZGlvUG9saWN5LCBzdHJlYW0sIGluZGV4TWluLCBpbmRleE1heCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobXBBdWRpb1BvbGljeS0+c2V0X3N0cmVhbV92b2x1bWVfaW5kZXhfZm9yX2RldmljZSkgeworICAgICAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+c2V0X3N0cmVhbV92b2x1bWVfaW5kZXhfZm9yX2RldmljZShtcEF1ZGlvUG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5zZXRfc3RyZWFtX3ZvbHVtZV9pbmRleChtcEF1ZGlvUG9saWN5LCBzdHJlYW0sIGluZGV4KTsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtcEF1ZGlvUG9saWN5LT5nZXRfc3RyZWFtX3ZvbHVtZV9pbmRleF9mb3JfZGV2aWNlKSB7CisgICAgICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5nZXRfc3RyZWFtX3ZvbHVtZV9pbmRleF9mb3JfZGV2aWNlKG1wQXVkaW9Qb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmdldF9zdHJlYW1fdm9sdW1lX2luZGV4KG1wQXVkaW9Qb2xpY3ksIHN0cmVhbSwgaW5kZXgpOworICAgIH0KK30KKwordWludDMyX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKK3sKKyAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+Z2V0X3N0cmF0ZWd5X2Zvcl9zdHJlYW0obXBBdWRpb1BvbGljeSwgc3RyZWFtKTsKK30KKworLy9hdWRpbyBwb2xpY3k6IHVzZSBhdWRpb19kZXZpY2VfdCBhcHByb3ByaWF0ZWx5CisKK2F1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCit7CisgICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgeworICAgICAgICByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7CisgICAgfQorICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX0RFVklDRV9OT05FOworICAgIH0KKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+Z2V0X2RldmljZXNfZm9yX3N0cmVhbShtcEF1ZGlvUG9saWN5LCBzdHJlYW0pOworfQorCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldE91dHB1dEZvckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjKQoreworICAgIC8vIEZJWE1FIGNoYW5nZSByZXR1cm4gdHlwZSB0byBzdGF0dXNfdCwgYW5kIHJldHVybiBOT19JTklUIGhlcmUKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5nZXRfb3V0cHV0X2Zvcl9lZmZlY3QobXBBdWRpb1BvbGljeSwgZGVzYyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cmVnaXN0ZXJFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkKQoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5yZWdpc3Rlcl9lZmZlY3QobXBBdWRpb1BvbGljeSwgZGVzYywgaW8sIHN0cmF0ZWd5LCBzZXNzaW9uLCBpZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6dW5yZWdpc3RlckVmZmVjdChpbnQgaWQpCit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnVucmVnaXN0ZXJfZWZmZWN0KG1wQXVkaW9Qb2xpY3ksIGlkKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRFZmZlY3RFbmFibGVkKGludCBpZCwgYm9vbCBlbmFibGVkKQoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5zZXRfZWZmZWN0X2VuYWJsZWQobXBBdWRpb1BvbGljeSwgaWQsIGVuYWJsZWQpOworfQorCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAoreworICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+aXNfc3RyZWFtX2FjdGl2ZShtcEF1ZGlvUG9saWN5LCBzdHJlYW0sIGluUGFzdE1zKTsKK30KKworYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OmlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAoreworICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+aXNfc3RyZWFtX2FjdGl2ZV9yZW1vdGVseShtcEF1ZGlvUG9saWN5LCBzdHJlYW0sIGluUGFzdE1zKTsKK30KKworYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OmlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3QKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKG1wQXVkaW9Qb2xpY3ktPmlzX3NvdXJjZV9hY3RpdmUgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmlzX3NvdXJjZV9hY3RpdmUobXBBdWRpb1BvbGljeSwgc291cmNlKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpxdWVyeURlZmF1bHRQcmVQcm9jZXNzaW5nKGludCBhdWRpb1Nlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNvdW50KQoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgKmNvdW50ID0gMDsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBhdWRpb1BvbGljeUVmZmVjdHMgPSBtQXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIH0KKyAgICBpZiAoYXVkaW9Qb2xpY3lFZmZlY3RzID09IDApIHsKKyAgICAgICAgKmNvdW50ID0gMDsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBhdWRpb1BvbGljeUVmZmVjdHMtPnF1ZXJ5RGVmYXVsdElucHV0RWZmZWN0cyhhdWRpb1Nlc3Npb24sIGRlc2NyaXB0b3JzLCBjb3VudCk7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc09mZmxvYWRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QmIGluZm8pCit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICBBTE9HVigibXBBdWRpb1BvbGljeSA9PSBOVUxMIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAobXBBdWRpb1BvbGljeS0+aXNfb2ZmbG9hZF9zdXBwb3J0ZWQgPT0gTlVMTCkgeworICAgICAgICBBTE9HVigiSEFMIGRvZXMgbm90IGltcGxlbWVudCBpc19vZmZsb2FkX3N1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmlzX29mZmxvYWRfc3VwcG9ydGVkKG1wQXVkaW9Qb2xpY3ksICZpbmZvKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnRzIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24gX191bnVzZWQpCit7CisgICAgKm51bV9wb3J0cyA9IDA7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCBfX3VudXNlZCkKK3sKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Y3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoIF9fdW51c2VkLAorICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlIF9fdW51c2VkKQoreworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUgX191bnVzZWQpCit7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6Omxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywKKyAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzIF9fdW51c2VkLAorICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24gX191bnVzZWQpCit7CisgICAgKm51bV9wYXRjaGVzID0gMDsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnIF9fdW51c2VkKQoreworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCit7CisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKGF0dHIpOworCisgICAgcmV0dXJuIGdldE91dHB1dChzdHJlYW0sIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZmxhZ3MsIG9mZmxvYWRJbmZvKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjphY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3QgKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZSkKK3sKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cmVsZWFzZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM2OTg3YQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAKQEAgLTAsMCArMSw3MjU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBdWRpb1BvbGljeU1hbmFnZXIiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKy8vI2RlZmluZSBWRVJZX1ZFUkJPU0VfTE9HR0lORworI2lmZGVmIFZFUllfVkVSQk9TRV9MT0dHSU5HCisjZGVmaW5lIEFMT0dWViBBTE9HVgorI2Vsc2UKKyNkZWZpbmUgQUxPR1ZWKGEuLi4pIGRvIHsgfSB3aGlsZSgwKQorI2VuZGlmCisKKy8vIEEgZGV2aWNlIG1hc2sgZm9yIGFsbCBhdWRpbyBpbnB1dCBkZXZpY2VzIHRoYXQgYXJlIGNvbnNpZGVyZWQgInZpcnR1YWwiIHdoZW4gZXZhbHVhdGluZworLy8gYWN0aXZlIGlucHV0cyBpbiBnZXRBY3RpdmVJbnB1dCgpCisjZGVmaW5lIEFQTV9BVURJT19JTl9ERVZJQ0VfVklSVFVBTF9BTEwgIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYCisvLyBBIGRldmljZSBtYXNrIGZvciBhbGwgYXVkaW8gb3V0cHV0IGRldmljZXMgdGhhdCBhcmUgY29uc2lkZXJlZCAicmVtb3RlIiB3aGVuIGV2YWx1YXRpbmcKKy8vIGFjdGl2ZSBvdXRwdXQgZGV2aWNlcyBpbiBpc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KCkKKyNkZWZpbmUgQVBNX0FVRElPX09VVF9ERVZJQ0VfUkVNT1RFX0FMTCAgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYCisvLyBBIGRldmljZSBtYXNrIGZvciBhbGwgYXVkaW8gaW5wdXQgYW5kIG91dHB1dCBkZXZpY2VzIHdoZXJlIG1hdGNoaW5nIGlucHV0cy9vdXRwdXRzIG9uIGRldmljZQorLy8gdHlwZSBhbG9uZSBpcyBub3QgZW5vdWdoOiB0aGUgYWRkcmVzcyBtdXN0IG1hdGNoIHRvbworI2RlZmluZSBBUE1fQVVESU9fREVWSUNFX01BVENIX0FERFJFU1NfQUxMIChBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYKQorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fZWZmZWN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KKyNpbmNsdWRlIDxzb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmg+CisjaW5jbHVkZSAiQXVkaW9Qb2xpY3lNYW5hZ2VyLmgiCisjaW5jbHVkZSAiYXVkaW9fcG9saWN5X2NvbmYuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEZWZpbml0aW9ucyBmb3IgYXVkaW9fcG9saWN5LmNvbmYgZmlsZSBwYXJzaW5nCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0cnVjdCBTdHJpbmdUb0VudW0geworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgdWludDMyX3QgdmFsdWU7Cit9OworCisjZGVmaW5lIFNUUklOR19UT19FTlVNKHN0cmluZykgeyAjc3RyaW5nLCBzdHJpbmcgfQorI2RlZmluZSBBUlJBWV9TSVpFKGEpIChzaXplb2YoYSkgLyBzaXplb2YoKGEpWzBdKSkKKworY29uc3QgU3RyaW5nVG9FbnVtIHNEZXZpY2VOYW1lVG9FbnVtVGFibGVbXSA9IHsKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0VBUlBJRUNFKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ08pLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19IRUFEU0VUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0FMTF9TQ08pLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFApLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0FVWF9ESUdJVEFMKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0hETUkpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQU5MR19ET0NLX0hFQURTRVQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfREdUTF9ET0NLX0hFQURTRVQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfVVNCX0FDQ0VTU09SWSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0FMTF9VU0IpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfTElORSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9IRE1JX0FSQyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9TUERJRiksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9GTSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9BVVhfTElORSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0FNQklFTlQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0FMTF9TQ08pLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fQVVYX0RJR0lUQUwpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9IRE1JKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fVk9JQ0VfQ0FMTCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0JBQ0tfTUlDKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0FOTEdfRE9DS19IRUFEU0VUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fREdUTF9ET0NLX0hFQURTRVQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9VU0JfQUNDRVNTT1JZKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0ZNX1RVTkVSKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fVFZfVFVORVIpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9MSU5FKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fU1BESUYpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0xPT1BCQUNLKSwKK307CisKK2NvbnN0IFN0cmluZ1RvRW51bSBzT3V0cHV0RmxhZ05hbWVUb0VudW1UYWJsZVtdID0geworICAgIFNUUklOR19UT19FTlVNKEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVIpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX09VVFBVVF9GTEFHX05PTl9CTE9DS0lORyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQyksCit9OworCitjb25zdCBTdHJpbmdUb0VudW0gc0lucHV0RmxhZ05hbWVUb0VudW1UYWJsZVtdID0geworICAgIFNUUklOR19UT19FTlVNKEFVRElPX0lOUFVUX0ZMQUdfRkFTVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fSU5QVVRfRkxBR19IV19IT1RXT1JEKSwKK307CisKK2NvbnN0IFN0cmluZ1RvRW51bSBzRm9ybWF0TmFtZVRvRW51bVRhYmxlW10gPSB7CisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9QQ01fMzJfQklUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfUENNXzhfMjRfQklUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfUENNX0ZMT0FUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9NUDMpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQUMpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQUNfTUFJTiksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0FBQ19MQyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0FBQ19TU1IpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQUNfTFRQKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX0hFX1YxKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX1NDQUxBQkxFKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX0VSTEMpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQUNfTEQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQUNfSEVfVjIpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQUNfRUxEKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfVk9SQklTKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfSEVfQUFDX1YxKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfSEVfQUFDX1YyKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfT1BVUyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0FDMyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0VfQUMzKSwKK307CisKK2NvbnN0IFN0cmluZ1RvRW51bSBzT3V0Q2hhbm5lbHNOYW1lVG9FbnVtVGFibGVbXSA9IHsKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX09VVF9NT05PKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0NIQU5ORUxfT1VUX1FVQUQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEpLAorfTsKKworY29uc3QgU3RyaW5nVG9FbnVtIHNJbkNoYW5uZWxzTmFtZVRvRW51bVRhYmxlW10gPSB7CisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl9NT05PKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX0lOX1NURVJFTyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl9GUk9OVF9CQUNLKSwKK307CisKK2NvbnN0IFN0cmluZ1RvRW51bSBzR2Fpbk1vZGVOYW1lVG9FbnVtVGFibGVbXSA9IHsKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19HQUlOX01PREVfSk9JTlQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0dBSU5fTU9ERV9DSEFOTkVMUyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fR0FJTl9NT0RFX1JBTVApLAorfTsKKworCit1aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0cmluZ1RvRW51bShjb25zdCBzdHJ1Y3QgU3RyaW5nVG9FbnVtICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIGlmIChzdHJjbXAodGFibGVbaV0ubmFtZSwgbmFtZSkgPT0gMCkgeworICAgICAgICAgICAgQUxPR1YoInN0cmluZ1RvRW51bSgpIGZvdW5kICVzIiwgdGFibGVbaV0ubmFtZSk7CisgICAgICAgICAgICByZXR1cm4gdGFibGVbaV0udmFsdWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2NvbnN0IGNoYXIgKkF1ZGlvUG9saWN5TWFuYWdlcjo6ZW51bVRvU3RyaW5nKGNvbnN0IHN0cnVjdCBTdHJpbmdUb0VudW0gKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIGlmICh0YWJsZVtpXS52YWx1ZSA9PSB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHRhYmxlW2ldLm5hbWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICIiOworfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RyaW5nVG9Cb29sKGNvbnN0IGNoYXIgKnZhbHVlKQoreworICAgIHJldHVybiAoKHN0cmNhc2VjbXAoInRydWUiLCB2YWx1ZSkgPT0gMCkgfHwgKHN0cmNtcCgiMSIsIHZhbHVlKSA9PSAwKSk7Cit9CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQXVkaW9Qb2xpY3lJbnRlcmZhY2UgaW1wbGVtZW50YXRpb24KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpCit7CisgICAgU3RyaW5nOCBhZGRyZXNzID0gKGRldmljZV9hZGRyZXNzID09IE5VTEwpID8gU3RyaW5nOCgiIikgOiBTdHJpbmc4KGRldmljZV9hZGRyZXNzKTsKKworICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBkZXZpY2U6ICV4LCBzdGF0ZSAlZCwgYWRkcmVzcyAlcyIsCisgICAgICAgICAgICBkZXZpY2UsIHN0YXRlLCBhZGRyZXNzLnN0cmluZygpKTsKKworICAgIC8vIGNvbm5lY3QvZGlzY29ubmVjdCBvbmx5IDEgZGV2aWNlIGF0IGEgdGltZQorICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpICYmICFhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlKSkgcmV0dXJuIEJBRF9WQUxVRTsKKworICAgIC8vIGhhbmRsZSBvdXRwdXQgZGV2aWNlcworICAgIGlmIChhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgU29ydGVkVmVjdG9yIDxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0czsKKworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0gbmV3IERldmljZURlc2NyaXB0b3IoU3RyaW5nOCgiIiksIGRldmljZSk7CisgICAgICAgIGRldkRlc2MtPm1BZGRyZXNzID0gYWRkcmVzczsKKyAgICAgICAgc3NpemVfdCBpbmRleCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmluZGV4T2YoZGV2RGVzYyk7CisKKyAgICAgICAgLy8gc2F2ZSBhIGNvcHkgb2YgdGhlIG9wZW5lZCBvdXRwdXQgZGVzY3JpcHRvcnMgYmVmb3JlIGFueSBvdXRwdXQgaXMgb3BlbmVkIG9yIGNsb3NlZAorICAgICAgICAvLyBieSBjaGVja091dHB1dHNGb3JEZXZpY2UoKS4gVGhpcyB3aWxsIGJlIG5lZWRlZCBieSBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKQorICAgICAgICBtUHJldmlvdXNPdXRwdXRzID0gbU91dHB1dHM7CisgICAgICAgIHN3aXRjaCAoc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgLy8gaGFuZGxlIG91dHB1dCBkZXZpY2UgY29ubmVjdGlvbgorICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFOgorICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGV2aWNlIGFscmVhZHkgY29ubmVjdGVkOiAleCIsIGRldmljZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGNvbm5lY3RpbmcgZGV2aWNlICV4IiwgZGV2aWNlKTsKKworICAgICAgICAgICAgLy8gcmVnaXN0ZXIgbmV3IGRldmljZSBhcyBhdmFpbGFibGUKKyAgICAgICAgICAgIGluZGV4ID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuYWRkKGRldkRlc2MpOworICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICBzcDxId01vZHVsZT4gbW9kdWxlID0gZ2V0TW9kdWxlRm9yRGV2aWNlKGRldmljZSk7CisgICAgICAgICAgICAgICAgaWYgKG1vZHVsZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBjb3VsZCBub3QgZmluZCBIVyBtb2R1bGUgZm9yIGRldmljZSAlMDh4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMucmVtb3ZlKGRldkRlc2MpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2luZGV4XS0+bUlkID0gbmV4dFVuaXF1ZUlkKCk7CisgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXNbaW5kZXhdLT5tTW9kdWxlID0gbW9kdWxlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2hlY2tPdXRwdXRzRm9yRGV2aWNlKGRldkRlc2MsIHN0YXRlLCBvdXRwdXRzLCBhZGRyZXNzKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnJlbW92ZShkZXZEZXNjKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBvdXRwdXRzIHNob3VsZCBuZXZlciBiZSBlbXB0eSBoZXJlCisgICAgICAgICAgICBBTE9HX0FTU0VSVChvdXRwdXRzLnNpemUoKSAhPSAwLCAic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCk6IgorICAgICAgICAgICAgICAgICAgICAiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgcmV0dXJuZWQgbm8gb3V0cHV0cyBidXQgc3RhdHVzIE9LIik7CisgICAgICAgICAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgcmV0dXJuZWQgJXp1IG91dHB1dHMiLAorICAgICAgICAgICAgICAgICAgb3V0cHV0cy5zaXplKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8vIGhhbmRsZSBvdXRwdXQgZGV2aWNlIGRpc2Nvbm5lY3Rpb24KKyAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOiB7CisgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRldmljZSBub3QgY29ubmVjdGVkOiAleCIsIGRldmljZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGlzY29ubmVjdGluZyBvdXRwdXQgZGV2aWNlICV4IiwgZGV2aWNlKTsKKworICAgICAgICAgICAgLy8gU2V0IERpc2Nvbm5lY3QgdG8gSEFMcworICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihhZGRyZXNzKTsKKyAgICAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9ERVZJQ0VfRElTQ09OTkVDVCksIGRldmljZSk7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhBVURJT19JT19IQU5ETEVfTk9ORSwgcGFyYW0udG9TdHJpbmcoKSk7CisKKyAgICAgICAgICAgIC8vIHJlbW92ZSBkZXZpY2UgZnJvbSBhdmFpbGFibGUgb3V0cHV0IGRldmljZXMKKyAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnJlbW92ZShkZXZEZXNjKTsKKworICAgICAgICAgICAgY2hlY2tPdXRwdXRzRm9yRGV2aWNlKGRldkRlc2MsIHN0YXRlLCBvdXRwdXRzLCBhZGRyZXNzKTsKKyAgICAgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBpbnZhbGlkIHN0YXRlOiAleCIsIHN0YXRlKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICAvLyBjaGVja0EyZHBTdXNwZW5kIG11c3QgcnVuIGJlZm9yZSBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMgc28gdGhhdCBBMkRQCisgICAgICAgIC8vIG91dHB1dCBpcyBzdXNwZW5kZWQgYmVmb3JlIGFueSB0cmFja3MgYXJlIG1vdmVkIHRvIGl0CisgICAgICAgIGNoZWNrQTJkcFN1c3BlbmQoKTsKKyAgICAgICAgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCk7CisgICAgICAgIC8vIG91dHB1dHMgbXVzdCBiZSBjbG9zZWQgYWZ0ZXIgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCkgaXMgZXhlY3V0ZWQKKyAgICAgICAgaWYgKCFvdXRwdXRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0c1tpXSk7CisgICAgICAgICAgICAgICAgLy8gY2xvc2UgdW51c2VkIG91dHB1dHMgYWZ0ZXIgZGV2aWNlIGRpc2Nvbm5lY3Rpb24gb3IgZGlyZWN0IG91dHB1dHMgdGhhdCBoYXZlIGJlZW4KKyAgICAgICAgICAgICAgICAvLyBvcGVuZWQgYnkgY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgdG8gcXVlcnkgZHluYW1pYyBwYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgaWYgKChzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKCgoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSAhPSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIChkZXNjLT5tRGlyZWN0T3BlbkNvdW50ID09IDApKSkgeworICAgICAgICAgICAgICAgICAgICBjbG9zZU91dHB1dChvdXRwdXRzW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBjaGVjayBhZ2FpbiBhZnRlciBjbG9zaW5nIEEyRFAgb3V0cHV0IHRvIHJlc2V0IG1BMmRwU3VzcGVuZGVkIGlmIG5lZWRlZAorICAgICAgICAgICAgY2hlY2tBMmRwU3VzcGVuZCgpOworICAgICAgICB9CisKKyAgICAgICAgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKKyAgICAgICAgaWYgKG1QaG9uZVN0YXRlID09IEFVRElPX01PREVfSU5fQ0FMTCkgeworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShtUHJpbWFyeU91dHB1dCwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgICAgICB1cGRhdGVDYWxsUm91dGluZyhuZXdEZXZpY2UpOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IG1PdXRwdXRzLmtleUF0KGkpOworICAgICAgICAgICAgaWYgKChtUGhvbmVTdGF0ZSAhPSBBVURJT19NT0RFX0lOX0NBTEwpIHx8IChvdXRwdXQgIT0gbVByaW1hcnlPdXRwdXQpKSB7CisgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShtT3V0cHV0cy5rZXlBdChpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgICAgICAgICAgLy8gZG8gbm90IGZvcmNlIGRldmljZSBjaGFuZ2Ugb24gZHVwbGljYXRlZCBvdXRwdXQgYmVjYXVzZSBpZiBkZXZpY2UgaXMgMCwgaXQgd2lsbAorICAgICAgICAgICAgICAgIC8vIGFsc28gZm9yY2UgYSBkZXZpY2UgMCBmb3IgdGhlIHR3byBvdXRwdXRzIGl0IGlzIGR1cGxpY2F0ZWQgdG8gd2hpY2ggbWF5IG92ZXJyaWRlCisgICAgICAgICAgICAgICAgLy8gYSB2YWxpZCBkZXZpY2Ugc2VsZWN0aW9uIG9uIHRob3NlIG91dHB1dHMuCisgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSA9ICFtT3V0cHV0cy52YWx1ZUF0KGkpLT5pc0R1cGxpY2F0ZWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCFkZXZpY2VEaXN0aW5ndWlzaGVzT25BZGRyZXNzKGRldmljZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWx3YXlzIGZvcmNlIHdoZW4gZGlzY29ubmVjdGluZyAoYSBub24tZHVwbGljYXRlZCBkZXZpY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFKSk7CisgICAgICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dCwgbmV3RGV2aWNlLCBmb3JjZSwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9ICAvLyBlbmQgaWYgaXMgb3V0cHV0IGRldmljZQorCisgICAgLy8gaGFuZGxlIGlucHV0IGRldmljZXMKKyAgICBpZiAoYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgU29ydGVkVmVjdG9yIDxhdWRpb19pb19oYW5kbGVfdD4gaW5wdXRzOworCisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihTdHJpbmc4KCIiKSwgZGV2aWNlKTsKKyAgICAgICAgZGV2RGVzYy0+bUFkZHJlc3MgPSBhZGRyZXNzOworICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5pbmRleE9mKGRldkRlc2MpOworICAgICAgICBzd2l0Y2ggKHN0YXRlKQorICAgICAgICB7CisgICAgICAgIC8vIGhhbmRsZSBpbnB1dCBkZXZpY2UgY29ubmVjdGlvbgorICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFOiB7CisgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBkZXZpY2UgYWxyZWFkeSBjb25uZWN0ZWQ6ICVkIiwgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxId01vZHVsZT4gbW9kdWxlID0gZ2V0TW9kdWxlRm9yRGV2aWNlKGRldmljZSk7CisgICAgICAgICAgICBpZiAobW9kdWxlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCk6IGNvdWxkIG5vdCBmaW5kIEhXIG1vZHVsZSBmb3IgZGV2aWNlICUwOHgiLAorICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNoZWNrSW5wdXRzRm9yRGV2aWNlKGRldmljZSwgc3RhdGUsIGlucHV0cywgYWRkcmVzcykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGluZGV4ID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5hZGQoZGV2RGVzYyk7CisgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXNbaW5kZXhdLT5tSWQgPSBuZXh0VW5pcXVlSWQoKTsKKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2luZGV4XS0+bU1vZHVsZSA9IG1vZHVsZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBoYW5kbGUgaW5wdXQgZGV2aWNlIGRpc2Nvbm5lY3Rpb24KKyAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOiB7CisgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRldmljZSBub3QgY29ubmVjdGVkOiAlZCIsIGRldmljZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGlzY29ubmVjdGluZyBpbnB1dCBkZXZpY2UgJXgiLCBkZXZpY2UpOworCisgICAgICAgICAgICAvLyBTZXQgRGlzY29ubmVjdCB0byBIQUxzCisgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGFkZHJlc3MpOworICAgICAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX0RFVklDRV9ESVNDT05ORUNUKSwgZGV2aWNlKTsKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKEFVRElPX0lPX0hBTkRMRV9OT05FLCBwYXJhbS50b1N0cmluZygpKTsKKworICAgICAgICAgICAgY2hlY2tJbnB1dHNGb3JEZXZpY2UoZGV2aWNlLCBzdGF0ZSwgaW5wdXRzLCBhZGRyZXNzKTsKKyAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMucmVtb3ZlKGRldkRlc2MpOworCisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBpbnZhbGlkIHN0YXRlOiAleCIsIHN0YXRlKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBjbG9zZUFsbElucHV0cygpOworCisgICAgICAgIGlmIChtUGhvbmVTdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEwpIHsKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICAgICAgdXBkYXRlQ2FsbFJvdXRpbmcobmV3RGV2aWNlKTsKKyAgICAgICAgfQorCisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0gLy8gZW5kIGlmIGlzIGlucHV0IGRldmljZQorCisgICAgQUxPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGludmFsaWQgZGV2aWNlOiAleCIsIGRldmljZSk7CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKQoreworICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSA9IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEU7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKFN0cmluZzgoIiIpLCBkZXZpY2UpOworICAgIGRldkRlc2MtPm1BZGRyZXNzID0gKGRldmljZV9hZGRyZXNzID09IE5VTEwpID8gU3RyaW5nOCgiIikgOiBTdHJpbmc4KGRldmljZV9hZGRyZXNzKTsKKyAgICBzc2l6ZV90IGluZGV4OworICAgIERldmljZVZlY3RvciAqZGV2aWNlVmVjdG9yOworCisgICAgaWYgKGF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSkgeworICAgICAgICBkZXZpY2VWZWN0b3IgPSAmbUF2YWlsYWJsZU91dHB1dERldmljZXM7CisgICAgfSBlbHNlIGlmIChhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlKSkgeworICAgICAgICBkZXZpY2VWZWN0b3IgPSAmbUF2YWlsYWJsZUlucHV0RGV2aWNlczsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVygiZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgaW52YWxpZCBkZXZpY2UgdHlwZSAlMDh4IiwgZGV2aWNlKTsKKyAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEU7CisgICAgfQorCisgICAgaW5kZXggPSBkZXZpY2VWZWN0b3ItPmluZGV4T2YoZGV2RGVzYyk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnVwZGF0ZUNhbGxSb3V0aW5nKGF1ZGlvX2RldmljZXNfdCByeERldmljZSwgaW50IGRlbGF5TXMpCit7CisgICAgYm9vbCBjcmVhdGVUeFBhdGNoID0gZmFsc2U7CisgICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoOworICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMTsKKyAgICBwYXRjaC5udW1fc2lua3MgPSAxOworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBhZlBhdGNoSGFuZGxlOworICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0OworCisgICAgYXVkaW9fZGV2aWNlc190IHR4RGV2aWNlID0gZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04pOworICAgIEFMT0dWKCJ1cGRhdGVDYWxsUm91dGluZyBkZXZpY2UgcnhEZXZpY2UgJTA4eCB0eERldmljZSAlMDh4IiwgcnhEZXZpY2UsIHR4RGV2aWNlKTsKKworICAgIC8vIHJlbGVhc2UgZXhpc3RpbmcgUlggcGF0Y2ggaWYgYW55CisgICAgaWYgKG1DYWxsUnhQYXRjaCAhPSAwKSB7CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChtQ2FsbFJ4UGF0Y2gtPm1BZlBhdGNoSGFuZGxlLCAwKTsKKyAgICAgICAgbUNhbGxSeFBhdGNoLmNsZWFyKCk7CisgICAgfQorICAgIC8vIHJlbGVhc2UgVFggcGF0Y2ggaWYgYW55CisgICAgaWYgKG1DYWxsVHhQYXRjaCAhPSAwKSB7CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChtQ2FsbFR4UGF0Y2gtPm1BZlBhdGNoSGFuZGxlLCAwKTsKKyAgICAgICAgbUNhbGxUeFBhdGNoLmNsZWFyKCk7CisgICAgfQorCisgICAgLy8gSWYgdGhlIFJYIGRldmljZSBpcyBvbiB0aGUgcHJpbWFyeSBIVyBtb2R1bGUsIHRoZW4gdXNlIGxlZ2FjeSByb3V0aW5nIG1ldGhvZCBmb3Igdm9pY2UgY2FsbHMKKyAgICAvLyB2aWEgc2V0T3V0cHV0RGV2aWNlKCkgb24gcHJpbWFyeSBvdXRwdXQuCisgICAgLy8gT3RoZXJ3aXNlLCBjcmVhdGUgdHdvIGF1ZGlvIHBhdGNoZXMgZm9yIFRYIGFuZCBSWCBwYXRoLgorICAgIGlmIChhdmFpbGFibGVQcmltYXJ5T3V0cHV0RGV2aWNlcygpICYgcnhEZXZpY2UpIHsKKyAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG1QcmltYXJ5T3V0cHV0LCByeERldmljZSwgdHJ1ZSwgZGVsYXlNcyk7CisgICAgICAgIC8vIElmIHRoZSBUWCBkZXZpY2UgaXMgYWxzbyBvbiB0aGUgcHJpbWFyeSBIVyBtb2R1bGUsIHNldE91dHB1dERldmljZSgpIHdpbGwgdGFrZSBjYXJlCisgICAgICAgIC8vIG9mIGl0IGR1ZSB0byBsZWdhY3kgaW1wbGVtZW50YXRpb24uIElmIG5vdCwgY3JlYXRlIGEgcGF0Y2guCisgICAgICAgIGlmICgoYXZhaWxhYmxlUHJpbWFyeUlucHV0RGV2aWNlcygpICYgdHhEZXZpY2UgJiB+QVVESU9fREVWSUNFX0JJVF9JTikKKyAgICAgICAgICAgICAgICA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgY3JlYXRlVHhQYXRjaCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBjcmVhdGUgUlggcGF0aCBhdWRpbyBwYXRjaAorICAgICAgICBkZXZpY2VMaXN0ID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKHJ4RGV2aWNlKTsKKyAgICAgICAgQUxPR19BU1NFUlQoIWRldmljZUxpc3QuaXNFbXB0eSgpLAorICAgICAgICAgICAgICAgICAgICAidXBkYXRlQ2FsbFJvdXRpbmcoKSBzZWxlY3RlZCBkZXZpY2Ugbm90IGluIG91dHB1dCBkZXZpY2UgbGlzdCIpOworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiByeFNpbmtEZXZpY2VEZXNjID0gZGV2aWNlTGlzdC5pdGVtQXQoMCk7CisgICAgICAgIGRldmljZUxpc3QgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYKTsKKyAgICAgICAgQUxPR19BU1NFUlQoIWRldmljZUxpc3QuaXNFbXB0eSgpLAorICAgICAgICAgICAgICAgICAgICAidXBkYXRlQ2FsbFJvdXRpbmcoKSBubyB0ZWxlcGhvbnkgUlggZGV2aWNlIik7CisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHJ4U291cmNlRGV2aWNlRGVzYyA9IGRldmljZUxpc3QuaXRlbUF0KDApOworCisgICAgICAgIHJ4U291cmNlRGV2aWNlRGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNvdXJjZXNbMF0pOworICAgICAgICByeFNpbmtEZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc2lua3NbMF0pOworCisgICAgICAgIC8vIHJlcXVlc3QgdG8gcmV1c2UgZXhpc3Rpbmcgb3V0cHV0IHN0cmVhbSBpZiBvbmUgaXMgYWxyZWFkeSBvcGVuZWQgdG8gcmVhY2ggdGhlIFJYIGRldmljZQorICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXRzRm9yRGV2aWNlKHJ4RGV2aWNlLCBtT3V0cHV0cyk7CisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IHNlbGVjdE91dHB1dChvdXRwdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9JTlZBTElEKTsKKyAgICAgICAgaWYgKG91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ1cGRhdGVDYWxsUm91dGluZygpIFJYIGRldmljZSBvdXRwdXQgaXMgZHVwbGljYXRlZCIpOworICAgICAgICAgICAgb3V0cHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNvdXJjZXNbMV0pOworICAgICAgICAgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAyOworICAgICAgICB9CisKKyAgICAgICAgYWZQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsICZhZlBhdGNoSGFuZGxlLCAwKTsKKyAgICAgICAgQUxPR1dfSUYoc3RhdHVzICE9IE5PX0VSUk9SLCAidXBkYXRlQ2FsbFJvdXRpbmcoKSBlcnJvciAlZCBjcmVhdGluZyBSWCBhdWRpbyBwYXRjaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIG1DYWxsUnhQYXRjaCA9IG5ldyBBdWRpb1BhdGNoKChhdWRpb19wYXRjaF9oYW5kbGVfdCluZXh0VW5pcXVlSWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXRjaCwgbVVpZENhY2hlZCk7CisgICAgICAgICAgICBtQ2FsbFJ4UGF0Y2gtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKKyAgICAgICAgICAgIG1DYWxsUnhQYXRjaC0+bVVpZCA9IG1VaWRDYWNoZWQ7CisgICAgICAgIH0KKyAgICAgICAgY3JlYXRlVHhQYXRjaCA9IHRydWU7CisgICAgfQorICAgIGlmIChjcmVhdGVUeFBhdGNoKSB7CisKKyAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoOworICAgICAgICBwYXRjaC5udW1fc291cmNlcyA9IDE7CisgICAgICAgIHBhdGNoLm51bV9zaW5rcyA9IDE7CisgICAgICAgIGRldmljZUxpc3QgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZSh0eERldmljZSk7CisgICAgICAgIEFMT0dfQVNTRVJUKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSwKKyAgICAgICAgICAgICAgICAgICAgInVwZGF0ZUNhbGxSb3V0aW5nKCkgc2VsZWN0ZWQgZGV2aWNlIG5vdCBpbiBpbnB1dCBkZXZpY2UgbGlzdCIpOworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiB0eFNvdXJjZURldmljZURlc2MgPSBkZXZpY2VMaXN0Lml0ZW1BdCgwKTsKKyAgICAgICAgdHhTb3VyY2VEZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc291cmNlc1swXSk7CisgICAgICAgIGRldmljZUxpc3QgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgpOworICAgICAgICBBTE9HX0FTU0VSVCghZGV2aWNlTGlzdC5pc0VtcHR5KCksCisgICAgICAgICAgICAgICAgICAgICJ1cGRhdGVDYWxsUm91dGluZygpIG5vIHRlbGVwaG9ueSBUWCBkZXZpY2UiKTsKKyAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gdHhTaW5rRGV2aWNlRGVzYyA9IGRldmljZUxpc3QuaXRlbUF0KDApOworICAgICAgICB0eFNpbmtEZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc2lua3NbMF0pOworCisgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dHNGb3JEZXZpY2UoQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgsIG1PdXRwdXRzKTsKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0lOVkFMSUQpOworICAgICAgICAvLyByZXF1ZXN0IHRvIHJldXNlIGV4aXN0aW5nIG91dHB1dCBzdHJlYW0gaWYgb25lIGlzIGFscmVhZHkgb3BlbmVkIHRvIHJlYWNoIHRoZSBUWAorICAgICAgICAvLyBwYXRoIG91dHB1dCBkZXZpY2UKKyAgICAgICAgaWYgKG91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ1cGRhdGVDYWxsUm91dGluZygpIFJYIGRldmljZSBvdXRwdXQgaXMgZHVwbGljYXRlZCIpOworICAgICAgICAgICAgb3V0cHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNvdXJjZXNbMV0pOworICAgICAgICAgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAyOworICAgICAgICB9CisKKyAgICAgICAgYWZQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsICZhZlBhdGNoSGFuZGxlLCAwKTsKKyAgICAgICAgQUxPR1dfSUYoc3RhdHVzICE9IE5PX0VSUk9SLCAic2V0UGhvbmVTdGF0ZSgpIGVycm9yICVkIGNyZWF0aW5nIFRYIGF1ZGlvIHBhdGNoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgbUNhbGxUeFBhdGNoID0gbmV3IEF1ZGlvUGF0Y2goKGF1ZGlvX3BhdGNoX2hhbmRsZV90KW5leHRVbmlxdWVJZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGNoLCBtVWlkQ2FjaGVkKTsKKyAgICAgICAgICAgIG1DYWxsVHhQYXRjaC0+bUFmUGF0Y2hIYW5kbGUgPSBhZlBhdGNoSGFuZGxlOworICAgICAgICAgICAgbUNhbGxUeFBhdGNoLT5tVWlkID0gbVVpZENhY2hlZDsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IHN0YXRlKQoreworICAgIEFMT0dWKCJzZXRQaG9uZVN0YXRlKCkgc3RhdGUgJWQiLCBzdGF0ZSk7CisgICAgaWYgKHN0YXRlIDwgMCB8fCBzdGF0ZSA+PSBBVURJT19NT0RFX0NOVCkgeworICAgICAgICBBTE9HVygic2V0UGhvbmVTdGF0ZSgpIGludmFsaWQgc3RhdGUgJWQiLCBzdGF0ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoc3RhdGUgPT0gbVBob25lU3RhdGUgKSB7CisgICAgICAgIEFMT0dXKCJzZXRQaG9uZVN0YXRlKCkgc2V0dGluZyBzYW1lIHN0YXRlICVkIiwgc3RhdGUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gaWYgbGVhdmluZyBjYWxsIHN0YXRlLCBoYW5kbGUgc3BlY2lhbCBjYXNlIG9mIGFjdGl2ZSBzdHJlYW1zCisgICAgLy8gcGVydGFpbmluZyB0byBzb25pZmljYXRpb24gc3RyYXRlZ3kgc2VlIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpCisgICAgaWYgKGlzSW5DYWxsKCkpIHsKKyAgICAgICAgQUxPR1YoInNldFBob25lU3RhdGUoKSBpbiBjYWxsIHN0YXRlIG1hbmFnZW1lbnQ6IG5ldyBzdGF0ZSBpcyAlZCIsIHN0YXRlKTsKKyAgICAgICAgZm9yIChpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0NOVDsgc3RyZWFtKyspIHsKKyAgICAgICAgICAgIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0sIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHN0b3JlIHByZXZpb3VzIHBob25lIHN0YXRlIGZvciBtYW5hZ2VtZW50IG9mIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBiZWxvdworICAgIGludCBvbGRTdGF0ZSA9IG1QaG9uZVN0YXRlOworICAgIG1QaG9uZVN0YXRlID0gc3RhdGU7CisgICAgYm9vbCBmb3JjZSA9IGZhbHNlOworCisgICAgLy8gYXJlIHdlIGVudGVyaW5nIG9yIHN0YXJ0aW5nIGEgY2FsbAorICAgIGlmICghaXNTdGF0ZUluQ2FsbChvbGRTdGF0ZSkgJiYgaXNTdGF0ZUluQ2FsbChzdGF0ZSkpIHsKKyAgICAgICAgQUxPR1YoIiAgRW50ZXJpbmcgY2FsbCBpbiBzZXRQaG9uZVN0YXRlKCkiKTsKKyAgICAgICAgLy8gZm9yY2Ugcm91dGluZyBjb21tYW5kIHRvIGF1ZGlvIGhhcmR3YXJlIHdoZW4gc3RhcnRpbmcgYSBjYWxsCisgICAgICAgIC8vIGV2ZW4gaWYgbm8gZGV2aWNlIGNoYW5nZSBpcyBuZWVkZWQKKyAgICAgICAgZm9yY2UgPSB0cnVlOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IERFVklDRV9DQVRFR09SWV9DTlQ7IGorKykgeworICAgICAgICAgICAgbVN0cmVhbXNbQVVESU9fU1RSRUFNX0RUTUZdLm1Wb2x1bWVDdXJ2ZVtqXSA9CisgICAgICAgICAgICAgICAgICAgIHNWb2x1bWVQcm9maWxlc1tBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTF1bal07CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGlzU3RhdGVJbkNhbGwob2xkU3RhdGUpICYmICFpc1N0YXRlSW5DYWxsKHN0YXRlKSkgeworICAgICAgICBBTE9HVigiICBFeGl0aW5nIGNhbGwgaW4gc2V0UGhvbmVTdGF0ZSgpIik7CisgICAgICAgIC8vIGZvcmNlIHJvdXRpbmcgY29tbWFuZCB0byBhdWRpbyBoYXJkd2FyZSB3aGVuIGV4aXRpbmcgYSBjYWxsCisgICAgICAgIC8vIGV2ZW4gaWYgbm8gZGV2aWNlIGNoYW5nZSBpcyBuZWVkZWQKKyAgICAgICAgZm9yY2UgPSB0cnVlOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IERFVklDRV9DQVRFR09SWV9DTlQ7IGorKykgeworICAgICAgICAgICAgbVN0cmVhbXNbQVVESU9fU1RSRUFNX0RUTUZdLm1Wb2x1bWVDdXJ2ZVtqXSA9CisgICAgICAgICAgICAgICAgICAgIHNWb2x1bWVQcm9maWxlc1tBVURJT19TVFJFQU1fRFRNRl1bal07CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGlzU3RhdGVJbkNhbGwoc3RhdGUpICYmIChzdGF0ZSAhPSBvbGRTdGF0ZSkpIHsKKyAgICAgICAgQUxPR1YoIiAgU3dpdGNoaW5nIGJldHdlZW4gdGVsZXBob255IGFuZCBWb0lQIGluIHNldFBob25lU3RhdGUoKSIpOworICAgICAgICAvLyBmb3JjZSByb3V0aW5nIGNvbW1hbmQgdG8gYXVkaW8gaGFyZHdhcmUgd2hlbiBzd2l0Y2hpbmcgYmV0d2VlbiB0ZWxlcGhvbnkgYW5kIFZvSVAKKyAgICAgICAgLy8gZXZlbiBpZiBubyBkZXZpY2UgY2hhbmdlIGlzIG5lZWRlZAorICAgICAgICBmb3JjZSA9IHRydWU7CisgICAgfQorCisgICAgLy8gY2hlY2sgZm9yIGRldmljZSBhbmQgb3V0cHV0IGNoYW5nZXMgdHJpZ2dlcmVkIGJ5IG5ldyBwaG9uZSBzdGF0ZQorICAgIGNoZWNrQTJkcFN1c3BlbmQoKTsKKyAgICBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKTsKKyAgICB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpOworCisgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBod091dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihtUHJpbWFyeU91dHB1dCk7CisKKyAgICBpbnQgZGVsYXlNcyA9IDA7CisgICAgaWYgKGlzU3RhdGVJbkNhbGwoc3RhdGUpKSB7CisgICAgICAgIG5zZWNzX3Qgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIC8vIG11dGUgbWVkaWEgYW5kIHNvbmlmaWNhdGlvbiBzdHJhdGVnaWVzIGFuZCBkZWxheSBkZXZpY2Ugc3dpdGNoIGJ5IHRoZSBsYXJnZXN0CisgICAgICAgICAgICAvLyBsYXRlbmN5IG9mIGFueSBvdXRwdXQgd2hlcmUgZWl0aGVyIHN0cmF0ZWd5IGlzIGFjdGl2ZS4KKyAgICAgICAgICAgIC8vIFRoaXMgYXZvaWQgc2VuZGluZyB0aGUgcmluZyB0b25lIG9yIG11c2ljIHRhaWwgaW50byB0aGUgZWFycGllY2Ugb3IgaGVhZHNldC4KKyAgICAgICAgICAgIGlmICgoZGVzYy0+aXNTdHJhdGVneUFjdGl2ZShTVFJBVEVHWV9NRURJQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT05JRklDQVRJT05fSEVBRFNFVF9NVVNJQ19ERUxBWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXNUaW1lKSB8fAorICAgICAgICAgICAgICAgICAgICBkZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKFNUUkFURUdZX1NPTklGSUNBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09OSUZJQ0FUSU9OX0hFQURTRVRfTVVTSUNfREVMQVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c1RpbWUpKSAmJgorICAgICAgICAgICAgICAgICAgICAoZGVsYXlNcyA8IChpbnQpZGVzYy0+bUxhdGVuY3kqMikpIHsKKyAgICAgICAgICAgICAgICBkZWxheU1zID0gZGVzYy0+bUxhdGVuY3kqMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShTVFJBVEVHWV9NRURJQSwgdHJ1ZSwgbU91dHB1dHMua2V5QXQoaSkpOworICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX01FRElBLCBmYWxzZSwgbU91dHB1dHMua2V5QXQoaSksIE1VVEVfVElNRV9NUywKKyAgICAgICAgICAgICAgICBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSwgdHJ1ZSAvKmZyb21DYWNoZSovKSk7CisgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCB0cnVlLCBtT3V0cHV0cy5rZXlBdChpKSk7CisgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCBmYWxzZSwgbU91dHB1dHMua2V5QXQoaSksIE1VVEVfVElNRV9NUywKKyAgICAgICAgICAgICAgICBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT04sIHRydWUgLypmcm9tQ2FjaGUqLykpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gTm90ZSB0aGF0IGRlc3BpdGUgdGhlIGZhY3QgdGhhdCBnZXROZXdPdXRwdXREZXZpY2UoKSBpcyBjYWxsZWQgb24gdGhlIHByaW1hcnkgb3V0cHV0LAorICAgIC8vIHRoZSBkZXZpY2UgcmV0dXJuZWQgaXMgbm90IG5lY2Vzc2FyaWx5IHJlYWNoYWJsZSB2aWEgdGhpcyBvdXRwdXQKKyAgICBhdWRpb19kZXZpY2VzX3QgcnhEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgIC8vIGZvcmNlIHJvdXRpbmcgY29tbWFuZCB0byBhdWRpbyBoYXJkd2FyZSB3aGVuIGVuZGluZyBjYWxsCisgICAgLy8gZXZlbiBpZiBubyBkZXZpY2UgY2hhbmdlIGlzIG5lZWRlZAorICAgIGlmIChpc1N0YXRlSW5DYWxsKG9sZFN0YXRlKSAmJiByeERldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICByeERldmljZSA9IGh3T3V0cHV0RGVzYy0+ZGV2aWNlKCk7CisgICAgfQorCisgICAgaWYgKHN0YXRlID09IEFVRElPX01PREVfSU5fQ0FMTCkgeworICAgICAgICB1cGRhdGVDYWxsUm91dGluZyhyeERldmljZSwgZGVsYXlNcyk7CisgICAgfSBlbHNlIGlmIChvbGRTdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEwpIHsKKyAgICAgICAgaWYgKG1DYWxsUnhQYXRjaCAhPSAwKSB7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gobUNhbGxSeFBhdGNoLT5tQWZQYXRjaEhhbmRsZSwgMCk7CisgICAgICAgICAgICBtQ2FsbFJ4UGF0Y2guY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUNhbGxUeFBhdGNoICE9IDApIHsKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChtQ2FsbFR4UGF0Y2gtPm1BZlBhdGNoSGFuZGxlLCAwKTsKKyAgICAgICAgICAgIG1DYWxsVHhQYXRjaC5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIHNldE91dHB1dERldmljZShtUHJpbWFyeU91dHB1dCwgcnhEZXZpY2UsIGZvcmNlLCAwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzZXRPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIHJ4RGV2aWNlLCBmb3JjZSwgMCk7CisgICAgfQorICAgIC8vIGlmIGVudGVyaW5nIGluIGNhbGwgc3RhdGUsIGhhbmRsZSBzcGVjaWFsIGNhc2Ugb2YgYWN0aXZlIHN0cmVhbXMKKyAgICAvLyBwZXJ0YWluaW5nIHRvIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBzZWUgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkKKyAgICBpZiAoaXNTdGF0ZUluQ2FsbChzdGF0ZSkpIHsKKyAgICAgICAgQUxPR1YoInNldFBob25lU3RhdGUoKSBpbiBjYWxsIHN0YXRlIG1hbmFnZW1lbnQ6IG5ldyBzdGF0ZSBpcyAlZCIsIHN0YXRlKTsKKyAgICAgICAgZm9yIChpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0NOVDsgc3RyZWFtKyspIHsKKyAgICAgICAgICAgIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0sIHRydWUsIHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRmxhZyB0aGF0IHJpbmd0b25lIHZvbHVtZSBtdXN0IGJlIGxpbWl0ZWQgdG8gbXVzaWMgdm9sdW1lIHVudGlsIHdlIGV4aXQgTU9ERV9SSU5HVE9ORQorICAgIGlmIChzdGF0ZSA9PSBBVURJT19NT0RFX1JJTkdUT05FICYmCisgICAgICAgIGlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9NVVNJQywgU09OSUZJQ0FUSU9OX0hFQURTRVRfTVVTSUNfREVMQVkpKSB7CisgICAgICAgIG1MaW1pdFJpbmd0b25lVm9sdW1lID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtTGltaXRSaW5ndG9uZVZvbHVtZSA9IGZhbHNlOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpCit7CisgICAgQUxPR1YoInNldEZvcmNlVXNlKCkgdXNhZ2UgJWQsIGNvbmZpZyAlZCwgbVBob25lU3RhdGUgJWQiLCB1c2FnZSwgY29uZmlnLCBtUGhvbmVTdGF0ZSk7CisKKyAgICBib29sIGZvcmNlVm9sdW1lUmVldmFsID0gZmFsc2U7CisgICAgc3dpdGNoKHVzYWdlKSB7CisgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT046CisgICAgICAgIGlmIChjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NQRUFLRVIgJiYgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08gJiYKKyAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSkgeworICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEZPUl9DT01NVU5JQ0FUSU9OIiwgY29uZmlnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmb3JjZVZvbHVtZVJlZXZhbCA9IHRydWU7CisgICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQToKKyAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfSEVBRFBIT05FUyAmJiBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX0EyRFAgJiYKKyAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfV0lSRURfQUNDRVNTT1JZICYmCisgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0FOQUxPR19ET0NLICYmCisgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0RJR0lUQUxfRE9DSyAmJiBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUgJiYKKyAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9fQlRfQTJEUCkgeworICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEZPUl9NRURJQSIsIGNvbmZpZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRDoKKyAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPICYmIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfV0lSRURfQUNDRVNTT1JZICYmCisgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUpIHsKKyAgICAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgY29uZmlnICVkIGZvciBGT1JfUkVDT1JEIiwgY29uZmlnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRE9DSzoKKyAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSAmJiBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX0NBUl9ET0NLICYmCisgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX0RFU0tfRE9DSyAmJgorICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9XSVJFRF9BQ0NFU1NPUlkgJiYKKyAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQU5BTE9HX0RPQ0sgJiYKKyAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfRElHSVRBTF9ET0NLKSB7CisgICAgICAgICAgICBBTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIGNvbmZpZyAlZCBmb3IgRk9SX0RPQ0siLCBjb25maWcpOworICAgICAgICB9CisgICAgICAgIGZvcmNlVm9sdW1lUmVldmFsID0gdHJ1ZTsKKyAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTToKKyAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSAmJgorICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpIHsKKyAgICAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgY29uZmlnICVkIGZvciBGT1JfU1lTVEVNIiwgY29uZmlnKTsKKyAgICAgICAgfQorICAgICAgICBmb3JjZVZvbHVtZVJlZXZhbCA9IHRydWU7CisgICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9IRE1JX1NZU1RFTV9BVURJTzoKKyAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSAmJgorICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9IRE1JX1NZU1RFTV9BVURJT19FTkZPUkNFRCkgeworICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9ySERNSV9TWVNURU1fQVVESU8iLCBjb25maWcpOworICAgICAgICB9CisgICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgdXNhZ2UgJWQiLCB1c2FnZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIGNoZWNrIGZvciBkZXZpY2UgYW5kIG91dHB1dCBjaGFuZ2VzIHRyaWdnZXJlZCBieSBuZXcgZm9yY2UgdXNhZ2UKKyAgICBjaGVja0EyZHBTdXNwZW5kKCk7CisgICAgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCk7CisgICAgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKKyAgICBpZiAobVBob25lU3RhdGUgPT0gQVVESU9fTU9ERV9JTl9DQUxMKSB7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIHRydWUgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIHVwZGF0ZUNhbGxSb3V0aW5nKG5ld0RldmljZSk7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gbU91dHB1dHMua2V5QXQoaSk7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2Uob3V0cHV0LCB0cnVlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICBpZiAoKG1QaG9uZVN0YXRlICE9IEFVRElPX01PREVfSU5fQ0FMTCkgfHwgKG91dHB1dCAhPSBtUHJpbWFyeU91dHB1dCkpIHsKKyAgICAgICAgICAgIHNldE91dHB1dERldmljZShvdXRwdXQsIG5ld0RldmljZSwgKG5ld0RldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JjZVZvbHVtZVJlZXZhbCAmJiAobmV3RGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSkgeworICAgICAgICAgICAgYXBwbHlTdHJlYW1Wb2x1bWVzKG91dHB1dCwgbmV3RGV2aWNlLCAwLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGFjdGl2ZUlucHV0ID0gZ2V0QWN0aXZlSW5wdXQoKTsKKyAgICBpZiAoYWN0aXZlSW5wdXQgIT0gMCkgeworICAgICAgICBzZXRJbnB1dERldmljZShhY3RpdmVJbnB1dCwgZ2V0TmV3SW5wdXREZXZpY2UoYWN0aXZlSW5wdXQpKTsKKyAgICB9CisKK30KKworYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkKK3sKKyAgICByZXR1cm4gbUZvcmNlVXNlW3VzYWdlXTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFN5c3RlbVByb3BlcnR5KGNvbnN0IGNoYXIqIHByb3BlcnR5LCBjb25zdCBjaGFyKiB2YWx1ZSkKK3sKKyAgICBBTE9HVigic2V0U3lzdGVtUHJvcGVydHkoKSBwcm9wZXJ0eSAlcywgdmFsdWUgJXMiLCBwcm9wZXJ0eSwgdmFsdWUpOworfQorCisvLyBGaW5kIGEgZGlyZWN0IG91dHB1dCBwcm9maWxlIGNvbXBhdGlibGUgd2l0aCB0aGUgcGFyYW1ldGVycyBwYXNzZWQsIGV2ZW4gaWYgdGhlIGlucHV0IGZsYWdzIGRvCisvLyBub3QgZXhwbGljaXRseSByZXF1ZXN0IGEgZGlyZWN0IG91dHB1dAorc3A8QXVkaW9Qb2xpY3lNYW5hZ2VyOjpJT1Byb2ZpbGU+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0UHJvZmlsZUZvckRpcmVjdE91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobUh3TW9kdWxlc1tpXS0+bUhhbmRsZSA9PSAwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlcy5zaXplKCk7IGorKykgeworICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzW2pdOworICAgICAgICAgICAgYm9vbCBmb3VuZCA9IHByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoZGV2aWNlLCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgIE5VTEwgLyp1cGRhdGVkU2FtcGxpbmdSYXRlKi8sIGZvcm1hdCwgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgIGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCA/CisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEIDogQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKKyAgICAgICAgICAgIGlmIChmb3VuZCAmJiAobUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSAmIHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHByb2ZpbGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0T3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykKK3sKKworICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSBnZXRTdHJhdGVneShzdHJlYW0pOworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgQUxPR1YoImdldE91dHB1dCgpIGRldmljZSAlZCwgc3RyZWFtICVkLCBzYW1wbGluZ1JhdGUgJWQsIGZvcm1hdCAleCwgY2hhbm5lbE1hc2sgJXgsIGZsYWdzICV4IiwKKyAgICAgICAgICBkZXZpY2UsIHN0cmVhbSwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmbGFncyk7CisKKyAgICByZXR1cm4gZ2V0T3V0cHV0Rm9yRGV2aWNlKGRldmljZSwgc3RyZWFtLCBzYW1wbGluZ1JhdGUsZm9ybWF0LCBjaGFubmVsTWFzaywgZmxhZ3MsCisgICAgICAgICAgICBvZmZsb2FkSW5mbyk7Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQoreworICAgIGlmIChhdHRyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImdldE91dHB1dEZvckF0dHIoKSBjYWxsZWQgd2l0aCBOVUxMIGF1ZGlvIGF0dHJpYnV0ZXMiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIEFMT0dWKCJnZXRPdXRwdXRGb3JBdHRyKCkgdXNhZ2U9JWQsIGNvbnRlbnQ9JWQsIHRhZz0lcyBmbGFncz0lMDh4IiwKKyAgICAgICAgICAgIGF0dHItPnVzYWdlLCBhdHRyLT5jb250ZW50X3R5cGUsIGF0dHItPnRhZ3MsIGF0dHItPmZsYWdzKTsKKworICAgIC8vIFRPRE8gdGhpcyBpcyB3aGVyZSBmaWx0ZXJpbmcgZm9yIGN1c3RvbSBwb2xpY2llcyAocmVyb3V0aW5nLCBkeW5hbWljIHNvdXJjZXMpIHdpbGwgZ28KKyAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5ID0gKHJvdXRpbmdfc3RyYXRlZ3kpIGdldFN0cmF0ZWd5Rm9yQXR0cihhdHRyKTsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworCisgICAgaWYgKChhdHRyLT5mbGFncyAmIEFVRElPX0ZMQUdfSFdfQVZfU1lOQykgIT0gMCkgeworICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoZmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DKTsKKyAgICB9CisKKyAgICBBTE9HVigiZ2V0T3V0cHV0Rm9yQXR0cigpIGRldmljZSAlZCwgc2FtcGxpbmdSYXRlICVkLCBmb3JtYXQgJXgsIGNoYW5uZWxNYXNrICV4LCBmbGFncyAleCIsCisgICAgICAgICAgZGV2aWNlLCBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZsYWdzKTsKKworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gc3RyZWFtVHlwZWZyb21BdHRyaWJ1dGVzSW50KGF0dHIpOworICAgIHJldHVybiBnZXRPdXRwdXRGb3JEZXZpY2UoZGV2aWNlLCBzdHJlYW0sIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZmxhZ3MsCisgICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8pOworfQorCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dEZvckRldmljZSgKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykKK3sKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICB1aW50MzJfdCBsYXRlbmN5ID0gMDsKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisKKyNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAorICAgIGlmIChtQ3VyT3V0cHV0ICE9IDApIHsKKyAgICAgICAgQUxPR1YoImdldE91dHB1dCgpIHRlc3Qgb3V0cHV0IG1DdXJPdXRwdXQgJWQsIHNhbXBsaW5nUmF0ZSAlZCwgZm9ybWF0ICVkLCBjaGFubmVsTWFzayAleCwgbURpcmVjdE91dHB1dCAlZCIsCisgICAgICAgICAgICAgICAgbUN1ck91dHB1dCwgbVRlc3RTYW1wbGluZ1JhdGUsIG1UZXN0Rm9ybWF0LCBtVGVzdENoYW5uZWxzLCBtRGlyZWN0T3V0cHV0KTsKKworICAgICAgICBpZiAobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdID09IDApIHsKKyAgICAgICAgICAgIEFMT0dWKCJnZXRPdXRwdXQoKSBvcGVuaW5nIHRlc3Qgb3V0cHV0Iik7CisgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBuZXcgQXVkaW9PdXRwdXREZXNjcmlwdG9yKE5VTEwpOworICAgICAgICAgICAgb3V0cHV0RGVzYy0+bURldmljZSA9IG1UZXN0RGV2aWNlOworICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUxhdGVuY3kgPSBtVGVzdExhdGVuY3lNczsKKyAgICAgICAgICAgIG91dHB1dERlc2MtPm1GbGFncyA9CisgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkobURpcmVjdE91dHB1dCA/IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCA6IDApOworICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPSAwOworICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gbVRlc3RTYW1wbGluZ1JhdGU7CisgICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gbVRlc3RDaGFubmVsczsKKyAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBtVGVzdEZvcm1hdDsKKyAgICAgICAgICAgIGlmIChvZmZsb2FkSW5mbyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mbyA9ICpvZmZsb2FkSW5mbzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuT3V0cHV0KDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1MYXRlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRmxhZ3MpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7CisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7CisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKKyAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBvdXRwdXRDbWQgPSBBdWRpb1BhcmFtZXRlcigpOworICAgICAgICAgICAgICAgIG91dHB1dENtZC5hZGRJbnQoU3RyaW5nOCgic2V0X2lkIiksbUN1ck91dHB1dCk7CisgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdLG91dHB1dENtZC50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBhZGRPdXRwdXQobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdLCBvdXRwdXREZXNjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdOworICAgIH0KKyNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCisKKyAgICAvLyBvcGVuIGEgZGlyZWN0IG91dHB1dCBpZiByZXF1aXJlZCBieSBzcGVjaWZpZWQgcGFyYW1ldGVycworICAgIC8vZm9yY2UgZGlyZWN0IGZsYWcgaWYgb2ZmbG9hZCBmbGFnIGlzIHNldDogb2ZmbG9hZGluZyBpbXBsaWVzIGEgZGlyZWN0IG91dHB1dCBzdHJlYW0KKyAgICAvLyBhbmQgYWxsIGNvbW1vbiBiZWhhdmlvcnMgYXJlIGRyaXZlbiBieSBjaGVja2luZyBvbmx5IHRoZSBkaXJlY3QgZmxhZworICAgIC8vIHRoaXMgc2hvdWxkIG5vcm1hbGx5IGJlIHNldCBhcHByb3ByaWF0ZWx5IGluIHRoZSBwb2xpY3kgY29uZmlndXJhdGlvbiBmaWxlCisgICAgaWYgKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDApIHsKKyAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKGZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKKyAgICB9CisgICAgaWYgKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMpICE9IDApIHsKKyAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKGZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKKyAgICB9CisKKyAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGU7CisKKyAgICAvLyBza2lwIGRpcmVjdCBvdXRwdXQgc2VsZWN0aW9uIGlmIHRoZSByZXF1ZXN0IGNhbiBvYnZpb3VzbHkgYmUgYXR0YWNoZWQgdG8gYSBtaXhlZCBvdXRwdXQKKyAgICAvLyBhbmQgbm90IGV4cGxpY2l0bHkgcmVxdWVzdGVkCisgICAgaWYgKCgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpID09IDApICYmCisgICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkgJiYgc2FtcGxpbmdSYXRlIDw9IE1BWF9NSVhFUl9TQU1QTElOR19SQVRFICYmCisgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spIDw9IDIpIHsKKyAgICAgICAgZ290byBub25fZGlyZWN0X291dHB1dDsKKyAgICB9CisKKyAgICAvLyBEbyBub3QgYWxsb3cgb2ZmbG9hZGluZyBpZiBvbmUgbm9uIG9mZmxvYWRhYmxlIGVmZmVjdCBpcyBlbmFibGVkLiBUaGlzIHByZXZlbnRzIGZyb20KKyAgICAvLyBjcmVhdGluZyBhbiBvZmZsb2FkZWQgdHJhY2sgYW5kIHRlYXJpbmcgaXQgZG93biBpbW1lZGlhdGVseSBhZnRlciBzdGFydCB3aGVuIGF1ZGlvZmxpbmdlcgorICAgIC8vIGRldGVjdHMgdGhlcmUgaXMgYW4gYWN0aXZlIG5vbiBvZmZsb2FkYWJsZSBlZmZlY3QuCisgICAgLy8gRklYTUU6IFdlIHNob3VsZCBjaGVjayB0aGUgYXVkaW8gc2Vzc2lvbiBoZXJlIGJ1dCB3ZSBkbyBub3QgaGF2ZSBpdCBpbiB0aGlzIGNvbnRleHQuCisgICAgLy8gVGhpcyBtYXkgcHJldmVudCBvZmZsb2FkaW5nIGluIHJhcmUgc2l0dWF0aW9ucyB3aGVyZSBlZmZlY3RzIGFyZSBsZWZ0IGFjdGl2ZSBieSBhcHBzCisgICAgLy8gaW4gdGhlIGJhY2tncm91bmQuCisKKyAgICBpZiAoKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpID09IDApIHx8CisgICAgICAgICAgICAhaXNOb25PZmZsb2FkYWJsZUVmZmVjdEVuYWJsZWQoKSkgeworICAgICAgICBwcm9maWxlID0gZ2V0UHJvZmlsZUZvckRpcmVjdE91dHB1dChkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpZmxhZ3MpOworICAgIH0KKworICAgIGlmIChwcm9maWxlICE9IDApIHsKKyAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gTlVMTDsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgaWYgKCFkZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJiAocHJvZmlsZSA9PSBkZXNjLT5tUHJvZmlsZSkpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjID0gZGVzYzsKKyAgICAgICAgICAgICAgICAvLyByZXVzZSBkaXJlY3Qgb3V0cHV0IGlmIGN1cnJlbnRseSBvcGVuIGFuZCBjb25maWd1cmVkIHdpdGggc2FtZSBwYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgaWYgKChzYW1wbGluZ1JhdGUgPT0gb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChmb3JtYXQgPT0gb3V0cHV0RGVzYy0+bUZvcm1hdCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChjaGFubmVsTWFzayA9PSBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2spKSB7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1EaXJlY3RPcGVuQ291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImdldE91dHB1dCgpIHJldXNpbmcgZGlyZWN0IG91dHB1dCAlZCIsIG1PdXRwdXRzLmtleUF0KGkpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1PdXRwdXRzLmtleUF0KGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBjbG9zZSBkaXJlY3Qgb3V0cHV0IGlmIGN1cnJlbnRseSBvcGVuIGFuZCBjb25maWd1cmVkIHdpdGggZGlmZmVyZW50IHBhcmFtZXRlcnMKKyAgICAgICAgaWYgKG91dHB1dERlc2MgIT0gTlVMTCkgeworICAgICAgICAgICAgY2xvc2VPdXRwdXQob3V0cHV0RGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBvdXRwdXREZXNjID0gbmV3IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcihwcm9maWxlKTsKKyAgICAgICAgb3V0cHV0RGVzYy0+bURldmljZSA9IGRldmljZTsKKyAgICAgICAgb3V0cHV0RGVzYy0+bUxhdGVuY3kgPSAwOworICAgICAgICBvdXRwdXREZXNjLT5tRmxhZ3MgPShhdWRpb19vdXRwdXRfZmxhZ3NfdCkgKG91dHB1dERlc2MtPm1GbGFncyB8IGZsYWdzKTsKKyAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBzYW1wbGluZ1JhdGU7CisgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBjaGFubmVsTWFzazsKKyAgICAgICAgY29uZmlnLmZvcm1hdCA9IGZvcm1hdDsKKyAgICAgICAgaWYgKG9mZmxvYWRJbmZvICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8gPSAqb2ZmbG9hZEluZm87CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5PdXRwdXQocHJvZmlsZS0+bU1vZHVsZS0+bUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bUxhdGVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1GbGFncyk7CisKKyAgICAgICAgLy8gb25seSBhY2NlcHQgYW4gb3V0cHV0IHdpdGggdGhlIHJlcXVlc3RlZCBwYXJhbWV0ZXJzCisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwKKyAgICAgICAgICAgIChzYW1wbGluZ1JhdGUgIT0gMCAmJiBzYW1wbGluZ1JhdGUgIT0gY29uZmlnLnNhbXBsZV9yYXRlKSB8fAorICAgICAgICAgICAgKGZvcm1hdCAhPSBBVURJT19GT1JNQVRfREVGQVVMVCAmJiBmb3JtYXQgIT0gY29uZmlnLmZvcm1hdCkgfHwKKyAgICAgICAgICAgIChjaGFubmVsTWFzayAhPSAwICYmIGNoYW5uZWxNYXNrICE9IGNvbmZpZy5jaGFubmVsX21hc2spKSB7CisgICAgICAgICAgICBBTE9HVigiZ2V0T3V0cHV0KCkgZmFpbGVkIG9wZW5pbmcgZGlyZWN0IG91dHB1dDogb3V0cHV0ICVkIHNhbXBsaW5nUmF0ZSAlZCAlZCwiCisgICAgICAgICAgICAgICAgICAgICJmb3JtYXQgJWQgJWQsIGNoYW5uZWxNYXNrICUwNHggJTA0eCIsIG91dHB1dCwgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlLCBmb3JtYXQsIG91dHB1dERlc2MtPm1Gb3JtYXQsIGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2spOworICAgICAgICAgICAgaWYgKG91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChvdXRwdXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICB9CisgICAgICAgIG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7CisgICAgICAgIG91dHB1dERlc2MtPm1DaGFubmVsTWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7CisgICAgICAgIG91dHB1dERlc2MtPm1Gb3JtYXQgPSBjb25maWcuZm9ybWF0OworICAgICAgICBvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSA9IDA7CisgICAgICAgIG91dHB1dERlc2MtPm1TdG9wVGltZVtzdHJlYW1dID0gMDsKKyAgICAgICAgb3V0cHV0RGVzYy0+bURpcmVjdE9wZW5Db3VudCA9IDE7CisKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgc3JjT3V0cHV0ID0gZ2V0T3V0cHV0Rm9yRWZmZWN0KCk7CisgICAgICAgIGFkZE91dHB1dChvdXRwdXQsIG91dHB1dERlc2MpOworICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkc3RPdXRwdXQgPSBnZXRPdXRwdXRGb3JFZmZlY3QoKTsKKyAgICAgICAgaWYgKGRzdE91dHB1dCA9PSBvdXRwdXQpIHsKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5tb3ZlRWZmZWN0cyhBVURJT19TRVNTSU9OX09VVFBVVF9NSVgsIHNyY091dHB1dCwgZHN0T3V0cHV0KTsKKyAgICAgICAgfQorICAgICAgICBtUHJldmlvdXNPdXRwdXRzID0gbU91dHB1dHM7CisgICAgICAgIEFMT0dWKCJnZXRPdXRwdXQoKSByZXR1cm5zIG5ldyBkaXJlY3Qgb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOworICAgICAgICByZXR1cm4gb3V0cHV0OworICAgIH0KKworbm9uX2RpcmVjdF9vdXRwdXQ6CisKKyAgICAvLyBpZ25vcmluZyBjaGFubmVsIG1hc2sgZHVlIHRvIGRvd25taXggY2FwYWJpbGl0eSBpbiBtaXhlcgorCisgICAgLy8gb3BlbiBhIG5vbiBkaXJlY3Qgb3V0cHV0CisKKyAgICAvLyBmb3Igbm9uIGRpcmVjdCBvdXRwdXRzLCBvbmx5IFBDTSBpcyBzdXBwb3J0ZWQKKyAgICBpZiAoYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7CisgICAgICAgIC8vIGdldCB3aGljaCBvdXRwdXQgaXMgc3VpdGFibGUgZm9yIHRoZSBzcGVjaWZpZWQgc3RyZWFtLiBUaGUgYWN0dWFsCisgICAgICAgIC8vIHJvdXRpbmcgY2hhbmdlIHdpbGwgaGFwcGVuIHdoZW4gc3RhcnRPdXRwdXQoKSB3aWxsIGJlIGNhbGxlZAorICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKGRldmljZSwgbU91dHB1dHMpOworCisgICAgICAgIC8vIGF0IHRoaXMgc3RhZ2Ugd2Ugc2hvdWxkIGlnbm9yZSB0aGUgRElSRUNUIGZsYWcgYXMgbm8gZGlyZWN0IG91dHB1dCBjb3VsZCBiZSBmb3VuZCBlYXJsaWVyCisgICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShmbGFncyAmIH5BVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOworICAgICAgICBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cywgZmxhZ3MsIGZvcm1hdCk7CisgICAgfQorICAgIEFMT0dXX0lGKChvdXRwdXQgPT0gMCksICJnZXRPdXRwdXQoKSBjb3VsZCBub3QgZmluZCBvdXRwdXQgZm9yIHN0cmVhbSAlZCwgc2FtcGxpbmdSYXRlICVkLCIKKyAgICAgICAgICAgICJmb3JtYXQgJWQsIGNoYW5uZWxzICV4LCBmbGFncyAleCIsIHN0cmVhbSwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmbGFncyk7CisKKyAgICBBTE9HVigiZ2V0T3V0cHV0KCkgcmV0dXJucyBvdXRwdXQgJWQiLCBvdXRwdXQpOworCisgICAgcmV0dXJuIG91dHB1dDsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZWxlY3RPdXRwdXQoY29uc3QgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQpCit7CisgICAgLy8gc2VsZWN0IG9uZSBvdXRwdXQgYW1vbmcgc2V2ZXJhbCB0aGF0IHByb3ZpZGUgYSBwYXRoIHRvIGEgcGFydGljdWxhciBkZXZpY2Ugb3Igc2V0IG9mCisgICAgLy8gZGV2aWNlcyAodGhlIGxpc3Qgd2FzIHByZXZpb3VzbHkgYnVpbGQgYnkgZ2V0T3V0cHV0c0ZvckRldmljZSgpKS4KKyAgICAvLyBUaGUgcHJpb3JpdHkgaXMgYXMgZm9sbG93czoKKyAgICAvLyAxOiB0aGUgb3V0cHV0IHdpdGggdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIHJlcXVlc3RlZCBwb2xpY3kgZmxhZ3MKKyAgICAvLyAyOiB0aGUgcHJpbWFyeSBvdXRwdXQKKyAgICAvLyAzOiB0aGUgZmlyc3Qgb3V0cHV0IGluIHRoZSBsaXN0CisKKyAgICBpZiAob3V0cHV0cy5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKG91dHB1dHMuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgcmV0dXJuIG91dHB1dHNbMF07CisgICAgfQorCisgICAgaW50IG1heENvbW1vbkZsYWdzID0gMDsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRGbGFncyA9IDA7CisgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0UHJpbWFyeSA9IDA7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0c1tpXSk7CisgICAgICAgIGlmICghb3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgICAgIC8vIGlmIGEgdmFsaWQgZm9ybWF0IGlzIHNwZWNpZmllZCwgc2tpcCBvdXRwdXQgaWYgbm90IGNvbXBhdGlibGUKKyAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gQVVESU9fRk9STUFUX0lOVkFMSUQpIHsKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gb3V0cHV0RGVzYy0+bUZvcm1hdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgY29tbW9uRmxhZ3MgPSBwb3Bjb3VudChvdXRwdXREZXNjLT5tUHJvZmlsZS0+bUZsYWdzICYgZmxhZ3MpOworICAgICAgICAgICAgaWYgKGNvbW1vbkZsYWdzID4gbWF4Q29tbW9uRmxhZ3MpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRGbGFncyA9IG91dHB1dHNbaV07CisgICAgICAgICAgICAgICAgbWF4Q29tbW9uRmxhZ3MgPSBjb21tb25GbGFnczsKKyAgICAgICAgICAgICAgICBBTE9HVigic2VsZWN0T3V0cHV0KCkgY29tbW9uRmxhZ3MgZm9yIG91dHB1dCAlZCwgJTA0eCIsIG91dHB1dHNbaV0sIGNvbW1vbkZsYWdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5tUHJvZmlsZS0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSkgeworICAgICAgICAgICAgICAgIG91dHB1dFByaW1hcnkgPSBvdXRwdXRzW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG91dHB1dEZsYWdzICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG91dHB1dEZsYWdzOworICAgIH0KKyAgICBpZiAob3V0cHV0UHJpbWFyeSAhPSAwKSB7CisgICAgICAgIHJldHVybiBvdXRwdXRQcmltYXJ5OworICAgIH0KKworICAgIHJldHVybiBvdXRwdXRzWzBdOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCit7CisgICAgQUxPR1YoInN0YXJ0T3V0cHV0KCkgb3V0cHV0ICVkLCBzdHJlYW0gJWQsIHNlc3Npb24gJWQiLCBvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRzLmluZGV4T2ZLZXkob3V0cHV0KTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dXKCJzdGFydE91dHB1dCgpIHVua25vd24gb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGluZGV4KTsKKworICAgIC8vIGluY3JlbWVudCB1c2FnZSBjb3VudCBmb3IgdGhpcyBzdHJlYW0gb24gdGhlIHJlcXVlc3RlZCBvdXRwdXQ6CisgICAgLy8gTk9URSB0aGF0IHRoZSB1c2FnZSBjb3VudCBpcyB0aGUgc2FtZSBmb3IgZHVwbGljYXRlZCBvdXRwdXQgYW5kIGhhcmR3YXJlIG91dHB1dCB3aGljaCBpcworICAgIC8vIG5lY2Vzc2FyeSBmb3IgYSBjb3JyZWN0IGNvbnRyb2wgb2YgaGFyZHdhcmUgb3V0cHV0IHJvdXRpbmcgYnkgc3RhcnRPdXRwdXQoKSBhbmQgc3RvcE91dHB1dCgpCisgICAgb3V0cHV0RGVzYy0+Y2hhbmdlUmVmQ291bnQoc3RyZWFtLCAxKTsKKworICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSA9PSAxKSB7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2Uob3V0cHV0LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSA9IGdldFN0cmF0ZWd5KHN0cmVhbSk7CisgICAgICAgIGJvb2wgc2hvdWxkV2FpdCA9IChzdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT04pIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMKTsKKyAgICAgICAgdWludDMyX3Qgd2FpdE1zID0gMDsKKyAgICAgICAgYm9vbCBmb3JjZSA9IGZhbHNlOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgaWYgKGRlc2MgIT0gb3V0cHV0RGVzYykgeworICAgICAgICAgICAgICAgIC8vIGZvcmNlIGEgZGV2aWNlIGNoYW5nZSBpZiBhbnkgb3RoZXIgb3V0cHV0IGlzIG1hbmFnZWQgYnkgdGhlIHNhbWUgaHcKKyAgICAgICAgICAgICAgICAvLyBtb2R1bGUgYW5kIGhhcyBhIGN1cnJlbnQgZGV2aWNlIHNlbGVjdGlvbiB0aGF0IGRpZmZlcnMgZnJvbSBzZWxlY3RlZCBkZXZpY2UuCisgICAgICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB0aGUgYXVkaW8gSEFMIG11c3QgcmVjZWl2ZSB0aGUgbmV3IGRldmljZSBzZWxlY3Rpb24gc28gdGhhdCBpdCBjYW4KKyAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgdGhlIGRldmljZSBjdXJyZW50bHkgc2VsZWN0ZWQgYnkgdGhlIG90aGVyIGFjdGl2ZSBvdXRwdXQuCisgICAgICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPnNoYXJlc0h3TW9kdWxlV2l0aChkZXNjKSAmJgorICAgICAgICAgICAgICAgICAgICBkZXNjLT5kZXZpY2UoKSAhPSBuZXdEZXZpY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yY2UgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyB3YWl0IGZvciBhdWRpbyBvbiBvdGhlciBhY3RpdmUgb3V0cHV0cyB0byBiZSBwcmVzZW50ZWQgd2hlbiBzdGFydGluZworICAgICAgICAgICAgICAgIC8vIGEgbm90aWZpY2F0aW9uIHNvIHRoYXQgYXVkaW8gZm9jdXMgZWZmZWN0IGNhbiBwcm9wYWdhdGUuCisgICAgICAgICAgICAgICAgdWludDMyX3QgbGF0ZW5jeSA9IGRlc2MtPmxhdGVuY3koKTsKKyAgICAgICAgICAgICAgICBpZiAoc2hvdWxkV2FpdCAmJiBkZXNjLT5pc0FjdGl2ZShsYXRlbmN5ICogMikgJiYgKHdhaXRNcyA8IGxhdGVuY3kpKSB7CisgICAgICAgICAgICAgICAgICAgIHdhaXRNcyA9IGxhdGVuY3k7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHVpbnQzMl90IG11dGVXYWl0TXMgPSBzZXRPdXRwdXREZXZpY2Uob3V0cHV0LCBuZXdEZXZpY2UsIGZvcmNlKTsKKworICAgICAgICAvLyBoYW5kbGUgc3BlY2lhbCBjYXNlIGZvciBzb25pZmljYXRpb24gd2hpbGUgaW4gY2FsbAorICAgICAgICBpZiAoaXNJbkNhbGwoKSkgeworICAgICAgICAgICAgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKHN0cmVhbSwgdHJ1ZSwgZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gYXBwbHkgdm9sdW1lIHJ1bGVzIGZvciBjdXJyZW50IHN0cmVhbSBhbmQgZGV2aWNlIGlmIG5lY2Vzc2FyeQorICAgICAgICBjaGVja0FuZFNldFZvbHVtZShzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1zW3N0cmVhbV0uZ2V0Vm9sdW1lSW5kZXgobmV3RGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdEZXZpY2UpOworCisgICAgICAgIC8vIHVwZGF0ZSB0aGUgb3V0cHV0cyBpZiBzdGFydGluZyBhbiBvdXRwdXQgd2l0aCBhIHN0cmVhbSB0aGF0IGNhbiBhZmZlY3Qgbm90aWZpY2F0aW9uCisgICAgICAgIC8vIHJvdXRpbmcKKyAgICAgICAgaGFuZGxlTm90aWZpY2F0aW9uUm91dGluZ0ZvclN0cmVhbShzdHJlYW0pOworICAgICAgICBpZiAod2FpdE1zID4gbXV0ZVdhaXRNcykgeworICAgICAgICAgICAgdXNsZWVwKCh3YWl0TXMgLSBtdXRlV2FpdE1zKSAqIDIgKiAxMDAwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKQoreworICAgIEFMT0dWKCJzdG9wT3V0cHV0KCkgb3V0cHV0ICVkLCBzdHJlYW0gJWQsIHNlc3Npb24gJWQiLCBvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRzLmluZGV4T2ZLZXkob3V0cHV0KTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dXKCJzdG9wT3V0cHV0KCkgdW5rbm93biBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaW5kZXgpOworCisgICAgLy8gaGFuZGxlIHNwZWNpYWwgY2FzZSBmb3Igc29uaWZpY2F0aW9uIHdoaWxlIGluIGNhbGwKKyAgICBpZiAoaXNJbkNhbGwoKSkgeworICAgICAgICBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oc3RyZWFtLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSA+IDApIHsKKyAgICAgICAgLy8gZGVjcmVtZW50IHVzYWdlIGNvdW50IG9mIHRoaXMgc3RyZWFtIG9uIHRoZSBvdXRwdXQKKyAgICAgICAgb3V0cHV0RGVzYy0+Y2hhbmdlUmVmQ291bnQoc3RyZWFtLCAtMSk7CisgICAgICAgIC8vIHN0b3JlIHRpbWUgYXQgd2hpY2ggdGhlIHN0cmVhbSB3YXMgc3RvcHBlZCAtIHNlZSBpc1N0cmVhbUFjdGl2ZSgpCisgICAgICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSA9PSAwKSB7CisgICAgICAgICAgICBvdXRwdXREZXNjLT5tU3RvcFRpbWVbc3RyZWFtXSA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2Uob3V0cHV0LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgICAgIC8vIGRlbGF5IHRoZSBkZXZpY2Ugc3dpdGNoIGJ5IHR3aWNlIHRoZSBsYXRlbmN5IGJlY2F1c2Ugc3RvcE91dHB1dCgpIGlzIGV4ZWN1dGVkIHdoZW4KKyAgICAgICAgICAgIC8vIHRoZSB0cmFjayBzdG9wKCkgY29tbWFuZCBpcyByZWNlaXZlZCBhbmQgYXQgdGhhdCB0aW1lIHRoZSBhdWRpbyB0cmFjayBidWZmZXIgY2FuCisgICAgICAgICAgICAvLyBzdGlsbCBjb250YWluIGRhdGEgdGhhdCBuZWVkcyB0byBiZSBkcmFpbmVkLiBUaGUgbGF0ZW5jeSBvbmx5IGNvdmVycyB0aGUgYXVkaW8gSEFMCisgICAgICAgICAgICAvLyBhbmQga2VybmVsIGJ1ZmZlcnMuIEFsc28gdGhlIGxhdGVuY3kgZG9lcyBub3QgYWx3YXlzIGluY2x1ZGUgYWRkaXRpb25hbCBkZWxheSBpbiB0aGUKKyAgICAgICAgICAgIC8vIGF1ZGlvIHBhdGggKGF1ZGlvIERTUCwgQ09ERUMgLi4uKQorICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dCwgbmV3RGV2aWNlLCBmYWxzZSwgb3V0cHV0RGVzYy0+bUxhdGVuY3kqMik7CisKKyAgICAgICAgICAgIC8vIGZvcmNlIHJlc3RvcmluZyB0aGUgZGV2aWNlIHNlbGVjdGlvbiBvbiBvdGhlciBhY3RpdmUgb3V0cHV0cyBpZiBpdCBkaWZmZXJzIGZyb20gdGhlCisgICAgICAgICAgICAvLyBvbmUgYmVpbmcgc2VsZWN0ZWQgZm9yIHRoaXMgb3V0cHV0CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgY3VyT3V0cHV0ID0gbU91dHB1dHMua2V5QXQoaSk7CisgICAgICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgICAgICBpZiAoY3VyT3V0cHV0ICE9IG91dHB1dCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+aXNBY3RpdmUoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+c2hhcmVzSHdNb2R1bGVXaXRoKGRlc2MpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAobmV3RGV2aWNlICE9IGRlc2MtPmRldmljZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2UoY3VyT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TmV3T3V0cHV0RGV2aWNlKGN1ck91dHB1dCwgZmFsc2UgLypmcm9tQ2FjaGUqLyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUxhdGVuY3kqMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBvdXRwdXRzIGlmIHN0b3BwaW5nIG9uZSB3aXRoIGEgc3RyZWFtIHRoYXQgY2FuIGFmZmVjdCBub3RpZmljYXRpb24gcm91dGluZworICAgICAgICAgICAgaGFuZGxlTm90aWZpY2F0aW9uUm91dGluZ0ZvclN0cmVhbShzdHJlYW0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVygic3RvcE91dHB1dCgpIHJlZmNvdW50IGlzIGFscmVhZHkgMCBmb3Igb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQoreworICAgIEFMT0dWKCJyZWxlYXNlT3V0cHV0KCkgJWQiLCBvdXRwdXQpOworICAgIHNzaXplX3QgaW5kZXggPSBtT3V0cHV0cy5pbmRleE9mS2V5KG91dHB1dCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVygicmVsZWFzZU91dHB1dCgpIHJlbGVhc2luZyB1bmtub3duIG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAorICAgIGludCB0ZXN0SW5kZXggPSB0ZXN0T3V0cHV0SW5kZXgob3V0cHV0KTsKKyAgICBpZiAodGVzdEluZGV4ICE9IDApIHsKKyAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpbmRleCk7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc0FjdGl2ZSgpKSB7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgICAgIG1PdXRwdXRzLnJlbW92ZUl0ZW0ob3V0cHV0KTsKKyAgICAgICAgICAgIG1UZXN0T3V0cHV0c1t0ZXN0SW5kZXhdID0gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmIC8vQVVESU9fUE9MSUNZX1RFU1QKKworICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaW5kZXgpOworICAgIGlmIChkZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpIHsKKyAgICAgICAgaWYgKGRlc2MtPm1EaXJlY3RPcGVuQ291bnQgPD0gMCkgeworICAgICAgICAgICAgQUxPR1coInJlbGVhc2VPdXRwdXQoKSBpbnZhbGlkIG9wZW4gY291bnQgJWQgZm9yIG91dHB1dCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1EaXJlY3RPcGVuQ291bnQsIG91dHB1dCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKC0tZGVzYy0+bURpcmVjdE9wZW5Db3VudCA9PSAwKSB7CisgICAgICAgICAgICBjbG9zZU91dHB1dChvdXRwdXQpOworICAgICAgICAgICAgLy8gSWYgZWZmZWN0cyB3aGVyZSBwcmVzZW50IG9uIHRoZSBvdXRwdXQsIGF1ZGlvZmxpbmdlciBtb3ZlZCB0aGVtIHRvIHRoZSBwcmltYXJ5CisgICAgICAgICAgICAvLyBvdXRwdXQgYnkgZGVmYXVsdDogbW92ZSB0aGVtIGJhY2sgdG8gdGhlIGFwcHJvcHJpYXRlIG91dHB1dC4KKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGRzdE91dHB1dCA9IGdldE91dHB1dEZvckVmZmVjdCgpOworICAgICAgICAgICAgaWYgKGRzdE91dHB1dCAhPSBtUHJpbWFyeU91dHB1dCkgeworICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5tb3ZlRWZmZWN0cyhBVURJT19TRVNTSU9OX09VVFBVVF9NSVgsIG1QcmltYXJ5T3V0cHV0LCBkc3RPdXRwdXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOworICAgICAgICB9CisgICAgfQorfQorCisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0SW5wdXQoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykKK3sKKyAgICBBTE9HVigiZ2V0SW5wdXQoKSBpbnB1dFNvdXJjZSAlZCwgc2FtcGxpbmdSYXRlICVkLCBmb3JtYXQgJWQsIGNoYW5uZWxNYXNrICV4LCBzZXNzaW9uICVkLCAiCisgICAgICAgICAgImZsYWdzICUjeCIsCisgICAgICAgICAgaW5wdXRTb3VyY2UsIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgc2Vzc2lvbiwgZmxhZ3MpOworCisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGdldERldmljZUZvcklucHV0U291cmNlKGlucHV0U291cmNlKTsKKworICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgQUxPR1coImdldElucHV0KCkgY291bGQgbm90IGZpbmQgZGV2aWNlIGZvciBpbnB1dFNvdXJjZSAlZCIsIGlucHV0U291cmNlKTsKKyAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgIH0KKworICAgIC8vIGFkYXB0IGNoYW5uZWwgc2VsZWN0aW9uIHRvIGlucHV0IHNvdXJjZQorICAgIHN3aXRjaCAoaW5wdXRTb3VyY2UpIHsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9VUExJTks6CisgICAgICAgIGNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9VUExJTks7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0RPV05MSU5LOgorICAgICAgICBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfRE5MSU5LOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9DQUxMOgorICAgICAgICBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfVVBMSU5LIHwgQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9ETkxJTks7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgYm9vbCBpc1NvdW5kVHJpZ2dlciA9IGZhbHNlOworICAgIGF1ZGlvX3NvdXJjZV90IGhhbElucHV0U291cmNlID0gaW5wdXRTb3VyY2U7CisgICAgaWYgKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSB7CisgICAgICAgIHNzaXplX3QgaW5kZXggPSBtU291bmRUcmlnZ2VyU2Vzc2lvbnMuaW5kZXhPZktleShzZXNzaW9uKTsKKyAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgIGlucHV0ID0gbVNvdW5kVHJpZ2dlclNlc3Npb25zLnZhbHVlRm9yKHNlc3Npb24pOworICAgICAgICAgICAgaXNTb3VuZFRyaWdnZXIgPSB0cnVlOworICAgICAgICAgICAgZmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkoZmxhZ3MgfCBBVURJT19JTlBVVF9GTEFHX0hXX0hPVFdPUkQpOworICAgICAgICAgICAgQUxPR1YoIlNvdW5kVHJpZ2dlciBjYXB0dXJlIG9uIHNlc3Npb24gJWQgaW5wdXQgJWQiLCBzZXNzaW9uLCBpbnB1dCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBoYWxJbnB1dFNvdXJjZSA9IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IGdldElucHV0UHJvZmlsZShkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIGlmIChwcm9maWxlID09IDApIHsKKyAgICAgICAgLy9yZXRyeSB3aXRob3V0IGZsYWdzCisgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgbG9nX2ZsYWdzID0gZmxhZ3M7CisgICAgICAgIGZsYWdzID0gQVVESU9fSU5QVVRfRkxBR19OT05FOworICAgICAgICBwcm9maWxlID0gZ2V0SW5wdXRQcm9maWxlKGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgICAgICBpZiAocHJvZmlsZSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVygiZ2V0SW5wdXQoKSBjb3VsZCBub3QgZmluZCBwcm9maWxlIGZvciBkZXZpY2UgMHglWCwgc2FtcGxpbmdSYXRlICV1LCBmb3JtYXQgJSN4LCAiCisgICAgICAgICAgICAgICAgICAgICJjaGFubmVsTWFzayAweCVYLCBmbGFncyAlI3giLAorICAgICAgICAgICAgICAgICAgICBkZXZpY2UsIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgbG9nX2ZsYWdzKTsKKyAgICAgICAgICAgIHJldHVybiBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwcm9maWxlLT5tTW9kdWxlLT5tSGFuZGxlID09IDApIHsKKyAgICAgICAgQUxPR0UoImdldElucHV0KCk6IEhXIG1vZHVsZSAlcyBub3Qgb3BlbmVkIiwgcHJvZmlsZS0+bU1vZHVsZS0+bU5hbWUpOworICAgICAgICByZXR1cm4gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgfQorCisgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IHNhbXBsaW5nUmF0ZTsKKyAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gY2hhbm5lbE1hc2s7CisgICAgY29uZmlnLmZvcm1hdCA9IGZvcm1hdDsKKworICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuSW5wdXQocHJvZmlsZS0+bU1vZHVsZS0+bUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxJbnB1dFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKworICAgIC8vIG9ubHkgYWNjZXB0IGlucHV0IHdpdGggdGhlIGV4YWN0IHJlcXVlc3RlZCBzZXQgb2YgcGFyYW1ldGVycworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwKKyAgICAgICAgKHNhbXBsaW5nUmF0ZSAhPSBjb25maWcuc2FtcGxlX3JhdGUpIHx8CisgICAgICAgIChmb3JtYXQgIT0gY29uZmlnLmZvcm1hdCkgfHwKKyAgICAgICAgKGNoYW5uZWxNYXNrICE9IGNvbmZpZy5jaGFubmVsX21hc2spKSB7CisgICAgICAgIEFMT0dXKCJnZXRJbnB1dCgpIGZhaWxlZCBvcGVuaW5nIGlucHV0OiBzYW1wbGluZ1JhdGUgJWQsIGZvcm1hdCAlZCwgY2hhbm5lbE1hc2sgJXgiLAorICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzayk7CisgICAgICAgIGlmIChpbnB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlSW5wdXQoaW5wdXQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICB9CisKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbmV3IEF1ZGlvSW5wdXREZXNjcmlwdG9yKHByb2ZpbGUpOworICAgIGlucHV0RGVzYy0+bUlucHV0U291cmNlID0gaW5wdXRTb3VyY2U7CisgICAgaW5wdXREZXNjLT5tUmVmQ291bnQgPSAwOworICAgIGlucHV0RGVzYy0+bU9wZW5SZWZDb3VudCA9IDE7CisgICAgaW5wdXREZXNjLT5tU2FtcGxpbmdSYXRlID0gc2FtcGxpbmdSYXRlOworICAgIGlucHV0RGVzYy0+bUZvcm1hdCA9IGZvcm1hdDsKKyAgICBpbnB1dERlc2MtPm1DaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrOworICAgIGlucHV0RGVzYy0+bURldmljZSA9IGRldmljZTsKKyAgICBpbnB1dERlc2MtPm1TZXNzaW9ucy5hZGQoc2Vzc2lvbik7CisgICAgaW5wdXREZXNjLT5tSXNTb3VuZFRyaWdnZXIgPSBpc1NvdW5kVHJpZ2dlcjsKKworICAgIGFkZElucHV0KGlucHV0LCBpbnB1dERlc2MpOworICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKKyAgICByZXR1cm4gaW5wdXQ7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3sKKyAgICBBTE9HVigic3RhcnRJbnB1dCgpIGlucHV0ICVkIiwgaW5wdXQpOworICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW5wdXQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInN0YXJ0SW5wdXQoKSB1bmtub3duIGlucHV0ICVkIiwgaW5wdXQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGluZGV4KTsKKworICAgIGluZGV4ID0gaW5wdXREZXNjLT5tU2Vzc2lvbnMuaW5kZXhPZihzZXNzaW9uKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dXKCJzdGFydElucHV0KCkgdW5rbm93biBzZXNzaW9uICVkIG9uIGlucHV0ICVkIiwgc2Vzc2lvbiwgaW5wdXQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIHZpcnR1YWwgaW5wdXQgZGV2aWNlcyBhcmUgY29tcGF0aWJsZSB3aXRoIG90aGVyIGlucHV0IGRldmljZXMKKyAgICBpZiAoIWlzVmlydHVhbElucHV0RGV2aWNlKGlucHV0RGVzYy0+bURldmljZSkpIHsKKworICAgICAgICAvLyBmb3IgYSBub24tdmlydHVhbCBpbnB1dCBkZXZpY2UsIGNoZWNrIGlmIHRoZXJlIGlzIGFub3RoZXIgKG5vbi12aXJ0dWFsKSBhY3RpdmUgaW5wdXQKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgYWN0aXZlSW5wdXQgPSBnZXRBY3RpdmVJbnB1dCgpOworICAgICAgICBpZiAoYWN0aXZlSW5wdXQgIT0gMCAmJiBhY3RpdmVJbnB1dCAhPSBpbnB1dCkgeworCisgICAgICAgICAgICAvLyBJZiB0aGUgYWxyZWFkeSBhY3RpdmUgaW5wdXQgdXNlcyBBVURJT19TT1VSQ0VfSE9UV09SRCB0aGVuIGl0IGlzIGNsb3NlZCwKKyAgICAgICAgICAgIC8vIG90aGVyd2lzZSB0aGUgYWN0aXZlIGlucHV0IGNvbnRpbnVlcyBhbmQgdGhlIG5ldyBpbnB1dCBjYW5ub3QgYmUgc3RhcnRlZC4KKyAgICAgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBhY3RpdmVEZXNjID0gbUlucHV0cy52YWx1ZUZvcihhY3RpdmVJbnB1dCk7CisgICAgICAgICAgICBpZiAoYWN0aXZlRGVzYy0+bUlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSB7CisgICAgICAgICAgICAgICAgQUxPR1coInN0YXJ0SW5wdXQoJWQpIHByZWVtcHRpbmcgbG93LXByaW9yaXR5IGlucHV0ICVkIiwgaW5wdXQsIGFjdGl2ZUlucHV0KTsKKyAgICAgICAgICAgICAgICBzdG9wSW5wdXQoYWN0aXZlSW5wdXQsIGFjdGl2ZURlc2MtPm1TZXNzaW9ucy5pdGVtQXQoMCkpOworICAgICAgICAgICAgICAgIHJlbGVhc2VJbnB1dChhY3RpdmVJbnB1dCwgYWN0aXZlRGVzYy0+bVNlc3Npb25zLml0ZW1BdCgwKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCJzdGFydElucHV0KCVkKSBmYWlsZWQ6IG90aGVyIGlucHV0ICVkIGFscmVhZHkgc3RhcnRlZCIsIGlucHV0LCBhY3RpdmVJbnB1dCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGlucHV0RGVzYy0+bVJlZkNvdW50ID09IDApIHsKKyAgICAgICAgaWYgKGFjdGl2ZUlucHV0c0NvdW50KCkgPT0gMCkgeworICAgICAgICAgICAgU291bmRUcmlnZ2VyOjpzZXRDYXB0dXJlU3RhdGUodHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgc2V0SW5wdXREZXZpY2UoaW5wdXQsIGdldE5ld0lucHV0RGV2aWNlKGlucHV0KSwgdHJ1ZSAvKiBmb3JjZSAqLyk7CisKKyAgICAgICAgLy8gQXV0b21hdGljYWxseSBlbmFibGUgdGhlIHJlbW90ZSBzdWJtaXggb3V0cHV0IHdoZW4gaW5wdXQgaXMgc3RhcnRlZC4KKyAgICAgICAgLy8gRm9yIHJlbW90ZSBzdWJtaXggKGEgdmlydHVhbCBkZXZpY2UpLCB3ZSBvcGVuIG9ubHkgb25lIGlucHV0IHBlciBjYXB0dXJlIHJlcXVlc3QuCisgICAgICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShpbnB1dERlc2MtPm1EZXZpY2UpKSB7CisgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYLAorICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwgQVVESU9fUkVNT1RFX1NVQk1JWF9ERVZJQ0VfQUREUkVTUyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HVigiQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydElucHV0KCkgaW5wdXQgc291cmNlID0gJWQiLCBpbnB1dERlc2MtPm1JbnB1dFNvdXJjZSk7CisKKyAgICBpbnB1dERlc2MtPm1SZWZDb3VudCsrOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3sKKyAgICBBTE9HVigic3RvcElucHV0KCkgaW5wdXQgJWQiLCBpbnB1dCk7CisgICAgc3NpemVfdCBpbmRleCA9IG1JbnB1dHMuaW5kZXhPZktleShpbnB1dCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVygic3RvcElucHV0KCkgdW5rbm93biBpbnB1dCAlZCIsIGlucHV0KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbmRleCk7CisKKyAgICBpbmRleCA9IGlucHV0RGVzYy0+bVNlc3Npb25zLmluZGV4T2Yoc2Vzc2lvbik7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVygic3RvcElucHV0KCkgdW5rbm93biBzZXNzaW9uICVkIG9uIGlucHV0ICVkIiwgc2Vzc2lvbiwgaW5wdXQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmIChpbnB1dERlc2MtPm1SZWZDb3VudCA9PSAwKSB7CisgICAgICAgIEFMT0dXKCJzdG9wSW5wdXQoKSBpbnB1dCAlZCBhbHJlYWR5IHN0b3BwZWQiLCBpbnB1dCk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpbnB1dERlc2MtPm1SZWZDb3VudC0tOworICAgIGlmIChpbnB1dERlc2MtPm1SZWZDb3VudCA9PSAwKSB7CisKKyAgICAgICAgLy8gYXV0b21hdGljYWxseSBkaXNhYmxlIHRoZSByZW1vdGUgc3VibWl4IG91dHB1dCB3aGVuIGlucHV0IGlzIHN0b3BwZWQKKyAgICAgICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKGlucHV0RGVzYy0+bURldmljZSkpIHsKKyAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsCisgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsIEFVRElPX1JFTU9URV9TVUJNSVhfREVWSUNFX0FERFJFU1MpOworICAgICAgICB9CisKKyAgICAgICAgcmVzZXRJbnB1dERldmljZShpbnB1dCk7CisKKyAgICAgICAgaWYgKGFjdGl2ZUlucHV0c0NvdW50KCkgPT0gMCkgeworICAgICAgICAgICAgU291bmRUcmlnZ2VyOjpzZXRDYXB0dXJlU3RhdGUoZmFsc2UpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit7CisgICAgQUxPR1YoInJlbGVhc2VJbnB1dCgpICVkIiwgaW5wdXQpOworICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW5wdXQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInJlbGVhc2VJbnB1dCgpIHJlbGVhc2luZyB1bmtub3duIGlucHV0ICVkIiwgaW5wdXQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpOworICAgIEFMT0dfQVNTRVJUKGlucHV0RGVzYyAhPSAwKTsKKworICAgIGluZGV4ID0gaW5wdXREZXNjLT5tU2Vzc2lvbnMuaW5kZXhPZihzZXNzaW9uKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dXKCJyZWxlYXNlSW5wdXQoKSB1bmtub3duIHNlc3Npb24gJWQgb24gaW5wdXQgJWQiLCBzZXNzaW9uLCBpbnB1dCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW5wdXREZXNjLT5tU2Vzc2lvbnMucmVtb3ZlKHNlc3Npb24pOworICAgIGlmIChpbnB1dERlc2MtPm1PcGVuUmVmQ291bnQgPT0gMCkgeworICAgICAgICBBTE9HVygicmVsZWFzZUlucHV0KCkgaW52YWxpZCBvcGVuIHJlZiBjb3VudCAlZCIsIGlucHV0RGVzYy0+bU9wZW5SZWZDb3VudCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW5wdXREZXNjLT5tT3BlblJlZkNvdW50LS07CisgICAgaWYgKGlucHV0RGVzYy0+bU9wZW5SZWZDb3VudCA+IDApIHsKKyAgICAgICAgQUxPR1YoInJlbGVhc2VJbnB1dCgpIGV4aXQgPiAwIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjbG9zZUlucHV0KGlucHV0KTsKKyAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CisgICAgQUxPR1YoInJlbGVhc2VJbnB1dCgpIGV4aXQiKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNsb3NlQWxsSW5wdXRzKCkgeworICAgIGJvb2wgcGF0Y2hSZW1vdmVkID0gZmFsc2U7CisKKyAgICBmb3Ioc2l6ZV90IGlucHV0X2luZGV4ID0gMDsgaW5wdXRfaW5kZXggPCBtSW5wdXRzLnNpemUoKTsgaW5wdXRfaW5kZXgrKykgeworICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGlucHV0X2luZGV4KTsKKyAgICAgICAgc3NpemVfdCBwYXRjaF9pbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShpbnB1dERlc2MtPm1QYXRjaEhhbmRsZSk7CisgICAgICAgIGlmIChwYXRjaF9pbmRleCA+PSAwKSB7CisgICAgICAgICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQocGF0Y2hfaW5kZXgpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUsIDApOworICAgICAgICAgICAgbUF1ZGlvUGF0Y2hlcy5yZW1vdmVJdGVtc0F0KHBhdGNoX2luZGV4KTsKKyAgICAgICAgICAgIHBhdGNoUmVtb3ZlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlSW5wdXQobUlucHV0cy5rZXlBdChpbnB1dF9pbmRleCkpOworICAgIH0KKyAgICBtSW5wdXRzLmNsZWFyKCk7CisgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKKworICAgIGlmIChwYXRjaFJlbW92ZWQpIHsKKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1heCkKK3sKKyAgICBBTE9HVigiaW5pdFN0cmVhbVZvbHVtZSgpIHN0cmVhbSAlZCwgbWluICVkLCBtYXggJWQiLCBzdHJlYW0gLCBpbmRleE1pbiwgaW5kZXhNYXgpOworICAgIGlmIChpbmRleE1pbiA8IDAgfHwgaW5kZXhNaW4gPj0gaW5kZXhNYXgpIHsKKyAgICAgICAgQUxPR1coImluaXRTdHJlYW1Wb2x1bWUoKSBpbnZhbGlkIGluZGV4IGxpbWl0cyBmb3Igc3RyZWFtICVkLCBtaW4gJWQsIG1heCAlZCIsIHN0cmVhbSAsIGluZGV4TWluLCBpbmRleE1heCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhNaW4gPSBpbmRleE1pbjsKKyAgICBtU3RyZWFtc1tzdHJlYW1dLm1JbmRleE1heCA9IGluZGV4TWF4OworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKworICAgIGlmICgoaW5kZXggPCBtU3RyZWFtc1tzdHJlYW1dLm1JbmRleE1pbikgfHwgKGluZGV4ID4gbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhNYXgpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gRm9yY2UgbWF4IHZvbHVtZSBpZiBzdHJlYW0gY2Fubm90IGJlIG11dGVkCisgICAgaWYgKCFtU3RyZWFtc1tzdHJlYW1dLm1DYW5CZU11dGVkKSBpbmRleCA9IG1TdHJlYW1zW3N0cmVhbV0ubUluZGV4TWF4OworCisgICAgQUxPR1YoInNldFN0cmVhbVZvbHVtZUluZGV4KCkgc3RyZWFtICVkLCBkZXZpY2UgJTA0eCwgaW5kZXggJWQiLAorICAgICAgICAgIHN0cmVhbSwgZGV2aWNlLCBpbmRleCk7CisKKyAgICAvLyBpZiBkZXZpY2UgaXMgQVVESU9fREVWSUNFX09VVF9ERUZBVUxUIHNldCBkZWZhdWx0IHZhbHVlIGFuZAorICAgIC8vIGNsZWFyIGFsbCBkZXZpY2Ugc3BlY2lmaWMgdmFsdWVzCisgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQpIHsKKyAgICAgICAgbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhDdXIuY2xlYXIoKTsKKyAgICB9CisgICAgbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhDdXIuYWRkKGRldmljZSwgaW5kZXgpOworCisgICAgLy8gY29tcHV0ZSBhbmQgYXBwbHkgc3RyZWFtIHZvbHVtZSBvbiBhbGwgb3V0cHV0cyBhY2NvcmRpbmcgdG8gY29ubmVjdGVkIGRldmljZQorICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGN1ckRldmljZSA9CisgICAgICAgICAgICAgICAgZ2V0RGV2aWNlRm9yVm9sdW1lKG1PdXRwdXRzLnZhbHVlQXQoaSktPmRldmljZSgpKTsKKyAgICAgICAgaWYgKChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUKSB8fCAoZGV2aWNlID09IGN1ckRldmljZSkpIHsKKyAgICAgICAgICAgIHN0YXR1c190IHZvbFN0YXR1cyA9IGNoZWNrQW5kU2V0Vm9sdW1lKHN0cmVhbSwgaW5kZXgsIG1PdXRwdXRzLmtleUF0KGkpLCBjdXJEZXZpY2UpOworICAgICAgICAgICAgaWYgKHZvbFN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHZvbFN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgaWYgKGluZGV4ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKCFhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgLy8gaWYgZGV2aWNlIGlzIEFVRElPX0RFVklDRV9PVVRfREVGQVVMVCwgcmV0dXJuIHZvbHVtZSBmb3IgZGV2aWNlIGNvcnJlc3BvbmRpbmcgdG8KKyAgICAvLyB0aGUgc3RyYXRlZ3kgdGhlIHN0cmVhbSBiZWxvbmdzIHRvLgorICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUKSB7CisgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KGdldFN0cmF0ZWd5KHN0cmVhbSksIHRydWUgLypmcm9tQ2FjaGUqLyk7CisgICAgfQorICAgIGRldmljZSA9IGdldERldmljZUZvclZvbHVtZShkZXZpY2UpOworCisgICAgKmluZGV4ID0gIG1TdHJlYW1zW3N0cmVhbV0uZ2V0Vm9sdW1lSW5kZXgoZGV2aWNlKTsKKyAgICBBTE9HVigiZ2V0U3RyZWFtVm9sdW1lSW5kZXgoKSBzdHJlYW0gJWQgZGV2aWNlICUwOHggaW5kZXggJWQiLCBzdHJlYW0sIGRldmljZSwgKmluZGV4KTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2VsZWN0T3V0cHV0Rm9yRWZmZWN0cygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cykKK3sKKyAgICAvLyBzZWxlY3Qgb25lIG91dHB1dCBhbW9uZyBzZXZlcmFsIHN1aXRhYmxlIGZvciBnbG9iYWwgZWZmZWN0cy4KKyAgICAvLyBUaGUgcHJpb3JpdHkgaXMgYXMgZm9sbG93czoKKyAgICAvLyAxOiBBbiBvZmZsb2FkZWQgb3V0cHV0LiBJZiB0aGUgZWZmZWN0IGVuZHMgdXAgbm90IGJlaW5nIG9mZmxvYWRhYmxlLAorICAgIC8vICAgIEF1ZGlvRmxpbmdlciB3aWxsIGludmFsaWRhdGUgdGhlIHRyYWNrIGFuZCB0aGUgb2ZmbG9hZGVkIG91dHB1dAorICAgIC8vICAgIHdpbGwgYmUgY2xvc2VkIGNhdXNpbmcgdGhlIGVmZmVjdCB0byBiZSBtb3ZlZCB0byBhIFBDTSBvdXRwdXQuCisgICAgLy8gMjogQSBkZWVwIGJ1ZmZlciBvdXRwdXQKKyAgICAvLyAzOiB0aGUgZmlyc3Qgb3V0cHV0IGluIHRoZSBsaXN0CisKKyAgICBpZiAob3V0cHV0cy5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRPZmZsb2FkZWQgPSAwOworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dERlZXBCdWZmZXIgPSAwOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dHNbaV0pOworICAgICAgICBBTE9HVigic2VsZWN0T3V0cHV0Rm9yRWZmZWN0cyBvdXRwdXRzWyV6dV0gZmxhZ3MgJXgiLCBpLCBkZXNjLT5tRmxhZ3MpOworICAgICAgICBpZiAoKGRlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDApIHsKKyAgICAgICAgICAgIG91dHB1dE9mZmxvYWRlZCA9IG91dHB1dHNbaV07CisgICAgICAgIH0KKyAgICAgICAgaWYgKChkZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ERUVQX0JVRkZFUikgIT0gMCkgeworICAgICAgICAgICAgb3V0cHV0RGVlcEJ1ZmZlciA9IG91dHB1dHNbaV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HVigic2VsZWN0T3V0cHV0Rm9yRWZmZWN0cyBvdXRwdXRPZmZsb2FkZWQgJWQgb3V0cHV0RGVlcEJ1ZmZlciAlZCIsCisgICAgICAgICAgb3V0cHV0T2ZmbG9hZGVkLCBvdXRwdXREZWVwQnVmZmVyKTsKKyAgICBpZiAob3V0cHV0T2ZmbG9hZGVkICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG91dHB1dE9mZmxvYWRlZDsKKyAgICB9CisgICAgaWYgKG91dHB1dERlZXBCdWZmZXIgIT0gMCkgeworICAgICAgICByZXR1cm4gb3V0cHV0RGVlcEJ1ZmZlcjsKKyAgICB9CisKKyAgICByZXR1cm4gb3V0cHV0c1swXTsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXRGb3JFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYykKK3sKKyAgICAvLyBhcHBseSBzaW1wbGUgcnVsZSB3aGVyZSBnbG9iYWwgZWZmZWN0cyBhcmUgYXR0YWNoZWQgdG8gdGhlIHNhbWUgb3V0cHV0IGFzIE1VU0lDIHN0cmVhbXMKKworICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSBnZXRTdHJhdGVneShBVURJT19TVFJFQU1fTVVTSUMpOworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBkc3RPdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShkZXZpY2UsIG1PdXRwdXRzKTsKKworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IHNlbGVjdE91dHB1dEZvckVmZmVjdHMoZHN0T3V0cHV0cyk7CisgICAgQUxPR1YoImdldE91dHB1dEZvckVmZmVjdCgpIGdvdCBvdXRwdXQgJWQgZm9yIGZ4ICVzIGZsYWdzICV4IiwKKyAgICAgICAgICBvdXRwdXQsIChkZXNjID09IE5VTEwpID8gInVuc3BlY2lmaWVkIiA6IGRlc2MtPm5hbWUsICAoZGVzYyA9PSBOVUxMKSA/IDAgOiBkZXNjLT5mbGFncyk7CisKKyAgICByZXR1cm4gb3V0cHV0OworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlZ2lzdGVyRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCkKK3sKKyAgICBzc2l6ZV90IGluZGV4ID0gbU91dHB1dHMuaW5kZXhPZktleShpbyk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBpbmRleCA9IG1JbnB1dHMuaW5kZXhPZktleShpbyk7CisgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJyZWdpc3RlckVmZmVjdCgpIHVua25vd24gaW8gJWQiLCBpbyk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobVRvdGFsRWZmZWN0c01lbW9yeSArIGRlc2MtPm1lbW9yeVVzYWdlID4gZ2V0TWF4RWZmZWN0c01lbW9yeSgpKSB7CisgICAgICAgIEFMT0dXKCJyZWdpc3RlckVmZmVjdCgpIG1lbW9yeSBsaW1pdCBleGNlZWRlZCBmb3IgRnggJXMsIE1lbW9yeSAlZCBLQiIsCisgICAgICAgICAgICAgICAgZGVzYy0+bmFtZSwgZGVzYy0+bWVtb3J5VXNhZ2UpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIG1Ub3RhbEVmZmVjdHNNZW1vcnkgKz0gZGVzYy0+bWVtb3J5VXNhZ2U7CisgICAgQUxPR1YoInJlZ2lzdGVyRWZmZWN0KCkgZWZmZWN0ICVzLCBpbyAlZCwgc3RyYXRlZ3kgJWQgc2Vzc2lvbiAlZCBpZCAlZCIsCisgICAgICAgICAgICBkZXNjLT5uYW1lLCBpbywgc3RyYXRlZ3ksIHNlc3Npb24sIGlkKTsKKyAgICBBTE9HVigicmVnaXN0ZXJFZmZlY3QoKSBtZW1vcnkgJWQsIHRvdGFsIG1lbW9yeSAlZCIsIGRlc2MtPm1lbW9yeVVzYWdlLCBtVG90YWxFZmZlY3RzTWVtb3J5KTsKKworICAgIHNwPEVmZmVjdERlc2NyaXB0b3I+IGVmZmVjdERlc2MgPSBuZXcgRWZmZWN0RGVzY3JpcHRvcigpOworICAgIG1lbWNweSAoJmVmZmVjdERlc2MtPm1EZXNjLCBkZXNjLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworICAgIGVmZmVjdERlc2MtPm1JbyA9IGlvOworICAgIGVmZmVjdERlc2MtPm1TdHJhdGVneSA9IChyb3V0aW5nX3N0cmF0ZWd5KXN0cmF0ZWd5OworICAgIGVmZmVjdERlc2MtPm1TZXNzaW9uID0gc2Vzc2lvbjsKKyAgICBlZmZlY3REZXNjLT5tRW5hYmxlZCA9IGZhbHNlOworCisgICAgbUVmZmVjdHMuYWRkKGlkLCBlZmZlY3REZXNjKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCkKK3sKKyAgICBzc2l6ZV90IGluZGV4ID0gbUVmZmVjdHMuaW5kZXhPZktleShpZCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVygidW5yZWdpc3RlckVmZmVjdCgpIHVua25vd24gZWZmZWN0IElEICVkIiwgaWQpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gZWZmZWN0RGVzYyA9IG1FZmZlY3RzLnZhbHVlQXQoaW5kZXgpOworCisgICAgc2V0RWZmZWN0RW5hYmxlZChlZmZlY3REZXNjLCBmYWxzZSk7CisKKyAgICBpZiAobVRvdGFsRWZmZWN0c01lbW9yeSA8IGVmZmVjdERlc2MtPm1EZXNjLm1lbW9yeVVzYWdlKSB7CisgICAgICAgIEFMT0dXKCJ1bnJlZ2lzdGVyRWZmZWN0KCkgbWVtb3J5ICVkIHRvbyBiaWcgZm9yIHRvdGFsICVkIiwKKyAgICAgICAgICAgICAgICBlZmZlY3REZXNjLT5tRGVzYy5tZW1vcnlVc2FnZSwgbVRvdGFsRWZmZWN0c01lbW9yeSk7CisgICAgICAgIGVmZmVjdERlc2MtPm1EZXNjLm1lbW9yeVVzYWdlID0gbVRvdGFsRWZmZWN0c01lbW9yeTsKKyAgICB9CisgICAgbVRvdGFsRWZmZWN0c01lbW9yeSAtPSBlZmZlY3REZXNjLT5tRGVzYy5tZW1vcnlVc2FnZTsKKyAgICBBTE9HVigidW5yZWdpc3RlckVmZmVjdCgpIGVmZmVjdCAlcywgSUQgJWQsIG1lbW9yeSAlZCB0b3RhbCBtZW1vcnkgJWQiLAorICAgICAgICAgICAgZWZmZWN0RGVzYy0+bURlc2MubmFtZSwgaWQsIGVmZmVjdERlc2MtPm1EZXNjLm1lbW9yeVVzYWdlLCBtVG90YWxFZmZlY3RzTWVtb3J5KTsKKworICAgIG1FZmZlY3RzLnJlbW92ZUl0ZW0oaWQpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldEVmZmVjdEVuYWJsZWQoaW50IGlkLCBib29sIGVuYWJsZWQpCit7CisgICAgc3NpemVfdCBpbmRleCA9IG1FZmZlY3RzLmluZGV4T2ZLZXkoaWQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInVucmVnaXN0ZXJFZmZlY3QoKSB1bmtub3duIGVmZmVjdCBJRCAlZCIsIGlkKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHJldHVybiBzZXRFZmZlY3RFbmFibGVkKG1FZmZlY3RzLnZhbHVlQXQoaW5kZXgpLCBlbmFibGVkKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRFZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdERlc2NyaXB0b3I+JiBlZmZlY3REZXNjLCBib29sIGVuYWJsZWQpCit7CisgICAgaWYgKGVuYWJsZWQgPT0gZWZmZWN0RGVzYy0+bUVuYWJsZWQpIHsKKyAgICAgICAgQUxPR1YoInNldEVmZmVjdEVuYWJsZWQoJXMpIGVmZmVjdCBhbHJlYWR5ICVzIiwKKyAgICAgICAgICAgICBlbmFibGVkPyJ0cnVlIjoiZmFsc2UiLCBlbmFibGVkPyJlbmFibGVkIjoiZGlzYWJsZWQiKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgIGlmIChtVG90YWxFZmZlY3RzQ3B1TG9hZCArIGVmZmVjdERlc2MtPm1EZXNjLmNwdUxvYWQgPiBnZXRNYXhFZmZlY3RzQ3B1TG9hZCgpKSB7CisgICAgICAgICAgICBBTE9HVygic2V0RWZmZWN0RW5hYmxlZCh0cnVlKSBDUFUgTG9hZCBsaW1pdCBleGNlZWRlZCBmb3IgRnggJXMsIENQVSAlZiBNSVBTIiwKKyAgICAgICAgICAgICAgICAgZWZmZWN0RGVzYy0+bURlc2MubmFtZSwgKGZsb2F0KWVmZmVjdERlc2MtPm1EZXNjLmNwdUxvYWQvMTApOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIG1Ub3RhbEVmZmVjdHNDcHVMb2FkICs9IGVmZmVjdERlc2MtPm1EZXNjLmNwdUxvYWQ7CisgICAgICAgIEFMT0dWKCJzZXRFZmZlY3RFbmFibGVkKHRydWUpIHRvdGFsIENQVSAlZCIsIG1Ub3RhbEVmZmVjdHNDcHVMb2FkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobVRvdGFsRWZmZWN0c0NwdUxvYWQgPCBlZmZlY3REZXNjLT5tRGVzYy5jcHVMb2FkKSB7CisgICAgICAgICAgICBBTE9HVygic2V0RWZmZWN0RW5hYmxlZChmYWxzZSkgQ1BVIGxvYWQgJWQgdG9vIGhpZ2ggZm9yIHRvdGFsICVkIiwKKyAgICAgICAgICAgICAgICAgICAgZWZmZWN0RGVzYy0+bURlc2MuY3B1TG9hZCwgbVRvdGFsRWZmZWN0c0NwdUxvYWQpOworICAgICAgICAgICAgZWZmZWN0RGVzYy0+bURlc2MuY3B1TG9hZCA9IG1Ub3RhbEVmZmVjdHNDcHVMb2FkOworICAgICAgICB9CisgICAgICAgIG1Ub3RhbEVmZmVjdHNDcHVMb2FkIC09IGVmZmVjdERlc2MtPm1EZXNjLmNwdUxvYWQ7CisgICAgICAgIEFMT0dWKCJzZXRFZmZlY3RFbmFibGVkKGZhbHNlKSB0b3RhbCBDUFUgJWQiLCBtVG90YWxFZmZlY3RzQ3B1TG9hZCk7CisgICAgfQorICAgIGVmZmVjdERlc2MtPm1FbmFibGVkID0gZW5hYmxlZDsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc05vbk9mZmxvYWRhYmxlRWZmZWN0RW5hYmxlZCgpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxFZmZlY3REZXNjcmlwdG9yPiBlZmZlY3REZXNjID0gbUVmZmVjdHMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKGVmZmVjdERlc2MtPm1FbmFibGVkICYmIChlZmZlY3REZXNjLT5tU3RyYXRlZ3kgPT0gU1RSQVRFR1lfTUVESUEpICYmCisgICAgICAgICAgICAgICAgKChlZmZlY3REZXNjLT5tRGVzYy5mbGFncyAmIEVGRkVDVF9GTEFHX09GRkxPQURfU1VQUE9SVEVEKSA9PSAwKSkgeworICAgICAgICAgICAgQUxPR1YoImlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCkgbm9uIG9mZmxvYWRhYmxlIGVmZmVjdCAlcyBlbmFibGVkIG9uIHNlc3Npb24gJWQiLAorICAgICAgICAgICAgICAgICAgZWZmZWN0RGVzYy0+bURlc2MubmFtZSwgZWZmZWN0RGVzYy0+bVNlc3Npb24pOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAoreworICAgIG5zZWNzX3Qgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc1N0cmVhbUFjdGl2ZShzdHJlYW0sIGluUGFzdE1zLCBzeXNUaW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNTdHJlYW1BY3RpdmVSZW1vdGVseShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKK3sKKyAgICBuc2Vjc190IHN5c1RpbWUgPSBzeXN0ZW1UaW1lKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoKChvdXRwdXREZXNjLT5kZXZpY2UoKSAmIEFQTV9BVURJT19PVVRfREVWSUNFX1JFTU9URV9BTEwpICE9IDApICYmCisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+aXNTdHJlYW1BY3RpdmUoc3RyZWFtLCBpblBhc3RNcywgc3lzVGltZSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3QKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+ICBpbnB1dERlc2NyaXB0b3IgPSBtSW5wdXRzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmICgoaW5wdXREZXNjcmlwdG9yLT5tSW5wdXRTb3VyY2UgPT0gKGludClzb3VyY2UgfHwKKyAgICAgICAgICAgICAgICAoc291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTiAmJgorICAgICAgICAgICAgICAgICBpbnB1dERlc2NyaXB0b3ItPm1JbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkpCisgICAgICAgICAgICAgJiYgKGlucHV0RGVzY3JpcHRvci0+bVJlZkNvdW50ID4gMCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmR1bXAoaW50IGZkKQoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5BdWRpb1BvbGljeU1hbmFnZXIgRHVtcDogJXBcbiIsIHRoaXMpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBQcmltYXJ5IE91dHB1dDogJWRcbiIsIG1QcmltYXJ5T3V0cHV0KTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFBob25lIHN0YXRlOiAlZFxuIiwgbVBob25lU3RhdGUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciBjb21tdW5pY2F0aW9ucyAlZFxuIiwKKyAgICAgICAgICAgICBtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OXSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIG1lZGlhICVkXG4iLCBtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQV0pOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciByZWNvcmQgJWRcbiIsIG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRF0pOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciBkb2NrICVkXG4iLCBtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9ET0NLXSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIHN5c3RlbSAlZFxuIiwgbUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNXSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIGhkbWkgc3lzdGVtIGF1ZGlvICVkXG4iLAorICAgICAgICAgICAgbUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfSERNSV9TWVNURU1fQVVESU9dKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgQXZhaWxhYmxlIG91dHB1dCBkZXZpY2VzOlxuIik7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF2YWlsYWJsZU91dHB1dERldmljZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXNbaV0tPmR1bXAoZmQsIDIsIGkpOworICAgIH0KKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbiBBdmFpbGFibGUgaW5wdXQgZGV2aWNlczpcbiIpOworICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdmFpbGFibGVJbnB1dERldmljZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+ZHVtcChmZCwgMiwgaSk7CisgICAgfQorCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5IVyBNb2R1bGVzIGR1bXA6XG4iKTsKKyAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gSFcgTW9kdWxlICV6dTpcbiIsIGkgKyAxKTsKKyAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgICAgICBtSHdNb2R1bGVzW2ldLT5kdW1wKGZkKTsKKyAgICB9CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbk91dHB1dHMgZHVtcDpcbiIpOworICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gT3V0cHV0ICVkIGR1bXA6XG4iLCBtT3V0cHV0cy5rZXlBdChpKSk7CisgICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICAgICAgbU91dHB1dHMudmFsdWVBdChpKS0+ZHVtcChmZCk7CisgICAgfQorCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5JbnB1dHMgZHVtcDpcbiIpOworICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBJbnB1dCAlZCBkdW1wOlxuIiwgbUlucHV0cy5rZXlBdChpKSk7CisgICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICAgICAgbUlucHV0cy52YWx1ZUF0KGkpLT5kdW1wKGZkKTsKKyAgICB9CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcblN0cmVhbXMgZHVtcDpcbiIpOworICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsCisgICAgICAgICAgICAgIiBTdHJlYW0gIENhbiBiZSBtdXRlZCAgSW5kZXggTWluICBJbmRleCBNYXggIEluZGV4IEN1ciBbZGV2aWNlIDogaW5kZXhdLi4uXG4iKTsKKyAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBVURJT19TVFJFQU1fQ05UOyBpKyspIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICUwMnp1ICAgICAgIiwgaSk7CisgICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICAgICAgbVN0cmVhbXNbaV0uZHVtcChmZCk7CisgICAgfQorCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5Ub3RhbCBFZmZlY3RzIENQVTogJWYgTUlQUywgVG90YWwgRWZmZWN0cyBtZW1vcnk6ICVkIEtCXG4iLAorICAgICAgICAgICAgKGZsb2F0KW1Ub3RhbEVmZmVjdHNDcHVMb2FkLzEwLCBtVG90YWxFZmZlY3RzTWVtb3J5KTsKKyAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJSZWdpc3RlcmVkIGVmZmVjdHM6XG4iKTsKKyAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICItIEVmZmVjdCAlZCBkdW1wOlxuIiwgbUVmZmVjdHMua2V5QXQoaSkpOworICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgICAgIG1FZmZlY3RzLnZhbHVlQXQoaSktPmR1bXAoZmQpOworICAgIH0KKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuQXVkaW8gUGF0Y2hlczpcbiIpOworICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb1BhdGNoZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUF1ZGlvUGF0Y2hlc1tpXS0+ZHVtcChmZCwgMiwgaSk7CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvLyBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBmb3IgdGhlIHBhcmFtZXRlcnMgd2hpY2ggY2FuIGJlIG9mZmxvYWRlZC4KKy8vIFRoaXMgY2FuIGJlIGVuaGFuY2VkIGRlcGVuZGluZyBvbiB0aGUgY2FwYWJpbGl0eSBvZiB0aGUgRFNQIGFuZCBwb2xpY3kKKy8vIG9mIHRoZSBzeXN0ZW0uCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBvZmZsb2FkSW5mbykKK3sKKyAgICBBTE9HVigiaXNPZmZsb2FkU3VwcG9ydGVkOiBTUj0ldSwgQ009MHgleCwgRm9ybWF0PTB4JXgsIFN0cmVhbVR5cGU9JWQsIgorICAgICAiIEJpdFJhdGU9JXUsIGR1cmF0aW9uPSUiIFBSSWQ2NCAiIHVzLCBoYXNfdmlkZW89JWQiLAorICAgICBvZmZsb2FkSW5mby5zYW1wbGVfcmF0ZSwgb2ZmbG9hZEluZm8uY2hhbm5lbF9tYXNrLAorICAgICBvZmZsb2FkSW5mby5mb3JtYXQsCisgICAgIG9mZmxvYWRJbmZvLnN0cmVhbV90eXBlLCBvZmZsb2FkSW5mby5iaXRfcmF0ZSwgb2ZmbG9hZEluZm8uZHVyYXRpb25fdXMsCisgICAgIG9mZmxvYWRJbmZvLmhhc192aWRlbyk7CisKKyAgICAvLyBDaGVjayBpZiBvZmZsb2FkIGhhcyBiZWVuIGRpc2FibGVkCisgICAgY2hhciBwcm9wVmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBpZiAocHJvcGVydHlfZ2V0KCJhdWRpby5vZmZsb2FkLmRpc2FibGUiLCBwcm9wVmFsdWUsICIwIikpIHsKKyAgICAgICAgaWYgKGF0b2kocHJvcFZhbHVlKSAhPSAwKSB7CisgICAgICAgICAgICBBTE9HVigib2ZmbG9hZCBkaXNhYmxlZCBieSBhdWRpby5vZmZsb2FkLmRpc2FibGU9JXMiLCBwcm9wVmFsdWUgKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENoZWNrIGlmIHN0cmVhbSB0eXBlIGlzIG11c2ljLCB0aGVuIG9ubHkgYWxsb3cgb2ZmbG9hZCBhcyBvZiBub3cuCisgICAgaWYgKG9mZmxvYWRJbmZvLnN0cmVhbV90eXBlICE9IEFVRElPX1NUUkVBTV9NVVNJQykKKyAgICB7CisgICAgICAgIEFMT0dWKCJpc09mZmxvYWRTdXBwb3J0ZWQ6IHN0cmVhbV90eXBlICE9IE1VU0lDLCByZXR1cm5pbmcgZmFsc2UiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vVE9ETzogZW5hYmxlIGF1ZGlvIG9mZmxvYWRpbmcgd2l0aCB2aWRlbyB3aGVuIHJlYWR5CisgICAgaWYgKG9mZmxvYWRJbmZvLmhhc192aWRlbykKKyAgICB7CisgICAgICAgIEFMT0dWKCJpc09mZmxvYWRTdXBwb3J0ZWQ6IGhhc192aWRlbyA9PSB0cnVlLCByZXR1cm5pbmcgZmFsc2UiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vSWYgZHVyYXRpb24gaXMgbGVzcyB0aGFuIG1pbmltdW0gdmFsdWUgZGVmaW5lZCBpbiBwcm9wZXJ0eSwgcmV0dXJuIGZhbHNlCisgICAgaWYgKHByb3BlcnR5X2dldCgiYXVkaW8ub2ZmbG9hZC5taW4uZHVyYXRpb24uc2VjcyIsIHByb3BWYWx1ZSwgTlVMTCkpIHsKKyAgICAgICAgaWYgKG9mZmxvYWRJbmZvLmR1cmF0aW9uX3VzIDwgKGF0b2kocHJvcFZhbHVlKSAqIDEwMDAwMDAgKSkgeworICAgICAgICAgICAgQUxPR1YoIk9mZmxvYWQgZGVuaWVkIGJ5IGR1cmF0aW9uIDwgYXVkaW8ub2ZmbG9hZC5taW4uZHVyYXRpb24uc2Vjcyg9JXMpIiwgcHJvcFZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAob2ZmbG9hZEluZm8uZHVyYXRpb25fdXMgPCBPRkZMT0FEX0RFRkFVTFRfTUlOX0RVUkFUSU9OX1NFQ1MgKiAxMDAwMDAwKSB7CisgICAgICAgIEFMT0dWKCJPZmZsb2FkIGRlbmllZCBieSBkdXJhdGlvbiA8IGRlZmF1bHQgbWluKD0ldSkiLCBPRkZMT0FEX0RFRkFVTFRfTUlOX0RVUkFUSU9OX1NFQ1MpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gRG8gbm90IGFsbG93IG9mZmxvYWRpbmcgaWYgb25lIG5vbiBvZmZsb2FkYWJsZSBlZmZlY3QgaXMgZW5hYmxlZC4gVGhpcyBwcmV2ZW50cyBmcm9tCisgICAgLy8gY3JlYXRpbmcgYW4gb2ZmbG9hZGVkIHRyYWNrIGFuZCB0ZWFyaW5nIGl0IGRvd24gaW1tZWRpYXRlbHkgYWZ0ZXIgc3RhcnQgd2hlbiBhdWRpb2ZsaW5nZXIKKyAgICAvLyBkZXRlY3RzIHRoZXJlIGlzIGFuIGFjdGl2ZSBub24gb2ZmbG9hZGFibGUgZWZmZWN0LgorICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgY2hlY2sgdGhlIGF1ZGlvIHNlc3Npb24gaGVyZSBidXQgd2UgZG8gbm90IGhhdmUgaXQgaW4gdGhpcyBjb250ZXh0LgorICAgIC8vIFRoaXMgbWF5IHByZXZlbnQgb2ZmbG9hZGluZyBpbiByYXJlIHNpdHVhdGlvbnMgd2hlcmUgZWZmZWN0cyBhcmUgbGVmdCBhY3RpdmUgYnkgYXBwcworICAgIC8vIGluIHRoZSBiYWNrZ3JvdW5kLgorICAgIGlmIChpc05vbk9mZmxvYWRhYmxlRWZmZWN0RW5hYmxlZCgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBTZWUgaWYgdGhlcmUgaXMgYSBwcm9maWxlIHRvIHN1cHBvcnQgdGhpcy4KKyAgICAvLyBBVURJT19ERVZJQ0VfTk9ORQorICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IGdldFByb2ZpbGVGb3JEaXJlY3RPdXRwdXQoQVVESU9fREVWSUNFX05PTkUgLyppZ25vcmUgZGV2aWNlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZsb2FkSW5mby5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8uZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZsb2FkSW5mby5jaGFubmVsX21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpOworICAgIEFMT0dWKCJpc09mZmxvYWRTdXBwb3J0ZWQoKSBwcm9maWxlICVzZm91bmQiLCBwcm9maWxlICE9IDAgPyAiIiA6ICJOT1QgIik7CisgICAgcmV0dXJuIChwcm9maWxlICE9IDApOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6Omxpc3RBdWRpb1BvcnRzKGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZ2VuZXJhdGlvbikKK3sKKyAgICBpZiAobnVtX3BvcnRzID09IE5VTEwgfHwgKCpudW1fcG9ydHMgIT0gMCAmJiBwb3J0cyA9PSBOVUxMKSB8fAorICAgICAgICAgICAgZ2VuZXJhdGlvbiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dWKCJsaXN0QXVkaW9Qb3J0cygpIHJvbGUgJWQgdHlwZSAlZCBudW1fcG9ydHMgJWQgcG9ydHMgJXAiLCByb2xlLCB0eXBlLCAqbnVtX3BvcnRzLCBwb3J0cyk7CisgICAgaWYgKHBvcnRzID09IE5VTEwpIHsKKyAgICAgICAgKm51bV9wb3J0cyA9IDA7CisgICAgfQorCisgICAgc2l6ZV90IHBvcnRzV3JpdHRlbiA9IDA7CisgICAgc2l6ZV90IHBvcnRzTWF4ID0gKm51bV9wb3J0czsKKyAgICAqbnVtX3BvcnRzID0gMDsKKyAgICBpZiAodHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTk9ORSB8fCB0eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgaWYgKHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTksgfHwgcm9sZSA9PSBBVURJT19QT1JUX1JPTEVfTk9ORSkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGkgIDwgbUF2YWlsYWJsZU91dHB1dERldmljZXMuc2l6ZSgpICYmIHBvcnRzV3JpdHRlbiA8IHBvcnRzTWF4OyBpKyspIHsKKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpXS0+dG9BdWRpb1BvcnQoJnBvcnRzW3BvcnRzV3JpdHRlbisrXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqbnVtX3BvcnRzICs9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnNpemUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFIHx8IHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX05PTkUpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOworICAgICAgICAgICAgICAgICAgICBpICA8IG1BdmFpbGFibGVJbnB1dERldmljZXMuc2l6ZSgpICYmIHBvcnRzV3JpdHRlbiA8IHBvcnRzTWF4OyBpKyspIHsKKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT50b0F1ZGlvUG9ydCgmcG9ydHNbcG9ydHNXcml0dGVuKytdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpudW1fcG9ydHMgKz0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5zaXplKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX05PTkUgfHwgdHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7CisgICAgICAgIGlmIChyb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LIHx8IHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX05PTkUpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCkgJiYgcG9ydHNXcml0dGVuIDwgcG9ydHNNYXg7IGkrKykgeworICAgICAgICAgICAgICAgIG1JbnB1dHNbaV0tPnRvQXVkaW9Qb3J0KCZwb3J0c1twb3J0c1dyaXR0ZW4rK10pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKm51bV9wb3J0cyArPSBtSW5wdXRzLnNpemUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFIHx8IHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX05PTkUpIHsKKyAgICAgICAgICAgIHNpemVfdCBudW1PdXRwdXRzID0gMDsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1PdXRwdXRzW2ldLT5pc0R1cGxpY2F0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBudW1PdXRwdXRzKys7CisgICAgICAgICAgICAgICAgICAgIGlmIChwb3J0c1dyaXR0ZW4gPCBwb3J0c01heCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dHNbaV0tPnRvQXVkaW9Qb3J0KCZwb3J0c1twb3J0c1dyaXR0ZW4rK10pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgKm51bV9wb3J0cyArPSBudW1PdXRwdXRzOworICAgICAgICB9CisgICAgfQorICAgICpnZW5lcmF0aW9uID0gY3VyQXVkaW9Qb3J0R2VuZXJhdGlvbigpOworICAgIEFMT0dWKCJsaXN0QXVkaW9Qb3J0cygpIGdvdCAlenUgcG9ydHMgbmVlZGVkICVkIiwgcG9ydHNXcml0dGVuLCAqbnVtX3BvcnRzKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0IF9fdW51c2VkKQoreworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3A8QXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb091dHB1dERlc2NyaXB0b3I+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0T3V0cHV0RnJvbUlkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGlkKSBjb25zdAoreworICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IE5VTEw7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPm1JZCA9PSBpZCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG91dHB1dERlc2M7Cit9CisKK3NwPEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9JbnB1dERlc2NyaXB0b3I+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0SW5wdXRGcm9tSWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgaWQpIGNvbnN0Cit7CisgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IE5VTEw7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKGlucHV0RGVzYy0+bUlkID09IGlkKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaW5wdXREZXNjOworfQorCitzcCA8QXVkaW9Qb2xpY3lNYW5hZ2VyOjpId01vZHVsZT4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRNb2R1bGVGb3JEZXZpY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0Cit7CisgICAgc3AgPEh3TW9kdWxlPiBtb2R1bGU7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Id01vZHVsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1Id01vZHVsZXNbaV0tPm1IYW5kbGUgPT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlc1tqXS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIGRldmljZSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUh3TW9kdWxlc1tpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1Id01vZHVsZXNbaV0tPm1JbnB1dFByb2ZpbGVzLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Id01vZHVsZXNbaV0tPm1JbnB1dFByb2ZpbGVzW2pdLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSAmIH5BVURJT19ERVZJQ0VfQklUX0lOKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtSHdNb2R1bGVzW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbW9kdWxlOworfQorCitzcCA8QXVkaW9Qb2xpY3lNYW5hZ2VyOjpId01vZHVsZT4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRNb2R1bGVGcm9tTmFtZShjb25zdCBjaGFyICpuYW1lKSBjb25zdAoreworICAgIHNwIDxId01vZHVsZT4gbW9kdWxlOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKHN0cmNtcChtSHdNb2R1bGVzW2ldLT5tTmFtZSwgbmFtZSkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIG1Id01vZHVsZXNbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1vZHVsZTsKK30KKworYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6YXZhaWxhYmxlUHJpbWFyeU91dHB1dERldmljZXMoKQoreworICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG1QcmltYXJ5T3V0cHV0KTsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyA9IG91dHB1dERlc2MtPm1Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpOworICAgIHJldHVybiBkZXZpY2VzICYgbUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKTsKK30KKworYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6YXZhaWxhYmxlUHJpbWFyeUlucHV0RGV2aWNlcygpCit7CisgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IHByaW1hcnlIYW5kbGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0cy52YWx1ZUZvcihtUHJpbWFyeU91dHB1dCktPm1Qcm9maWxlLT5tTW9kdWxlLT5tSGFuZGxlOworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT5tTW9kdWxlLT5tSGFuZGxlID09IHByaW1hcnlIYW5kbGUpIHsKKyAgICAgICAgICAgIGRldmljZXMgfD0gbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+bURldmljZVR5cGU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRldmljZXM7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCit7CisgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSIpOworCisgICAgaWYgKGhhbmRsZSA9PSBOVUxMIHx8IHBhdGNoID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBudW0gc291cmNlcyAlZCBudW0gc2lua3MgJWQiLCBwYXRjaC0+bnVtX3NvdXJjZXMsIHBhdGNoLT5udW1fc2lua3MpOworCisgICAgaWYgKHBhdGNoLT5udW1fc291cmNlcyA9PSAwIHx8IHBhdGNoLT5udW1fc291cmNlcyA+IEFVRElPX1BBVENIX1BPUlRTX01BWCB8fAorICAgICAgICAgICAgcGF0Y2gtPm51bV9zaW5rcyA9PSAwIHx8IHBhdGNoLT5udW1fc2lua3MgPiBBVURJT19QQVRDSF9QT1JUU19NQVgpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgLy8gb25seSBvbmUgc291cmNlIHBlciBhdWRpbyBwYXRjaCBzdXBwb3J0ZWQgZm9yIG5vdworICAgIGlmIChwYXRjaC0+bnVtX3NvdXJjZXMgPiAxKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAocGF0Y2gtPnNvdXJjZXNbMF0ucm9sZSAhPSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXRjaC0+bnVtX3NpbmtzOyBpKyspIHsKKyAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1tpXS5yb2xlICE9IEFVRElPX1BPUlRfUk9MRV9TSU5LKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2M7CisgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleSgqaGFuZGxlKTsKKworICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoIHNvdXJjZSBpZCAlZCByb2xlICVkIHR5cGUgJWQiLCBwYXRjaC0+c291cmNlc1swXS5pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0ucm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0udHlwZSk7CisjaWYgTE9HX05ERUJVRyA9PSAwCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXRjaC0+bnVtX3NpbmtzOyBpKyspIHsKKyAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2ggc2luayAlZDogaWQgJWQgcm9sZSAlZCB0eXBlICVkIiwgaSwgcGF0Y2gtPnNpbmtzW2ldLmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1tpXS5yb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1tpXS50eXBlKTsKKyAgICB9CisjZW5kaWYKKworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7CisgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgbVVpZENhY2hlZCAlZCBwYXRjaERlc2MtPm1VaWQgJWQgdWlkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1VaWRDYWNoZWQsIHBhdGNoRGVzYy0+bVVpZCwgdWlkKTsKKyAgICAgICAgaWYgKHBhdGNoRGVzYy0+bVVpZCAhPSBtVWlkQ2FjaGVkICYmIHVpZCAhPSBwYXRjaERlc2MtPm1VaWQpIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgICpoYW5kbGUgPSAwOworICAgIH0KKworICAgIGlmIChwYXRjaC0+c291cmNlc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKKyAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gZ2V0T3V0cHV0RnJvbUlkKHBhdGNoLT5zb3VyY2VzWzBdLmlkKTsKKyAgICAgICAgaWYgKG91dHB1dERlc2MgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBvdXRwdXQgbm90IGZvdW5kIGZvciBpZCAlZCIsIHBhdGNoLT5zb3VyY2VzWzBdLmlkKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgQUxPR19BU1NFUlQoIW91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpLCJkdXBsaWNhdGVkIG91dHB1dCAlZCBpbiBzb3VyY2UgaW4gcG9ydHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgaWYgKHBhdGNoRGVzYyAhPSAwKSB7CisgICAgICAgICAgICBpZiAocGF0Y2hEZXNjLT5tUGF0Y2guc291cmNlc1swXS5pZCAhPSBwYXRjaC0+c291cmNlc1swXS5pZCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgc291cmNlIGlkIGRpZmZlcnMgZm9yIHBhdGNoIGN1cnJlbnQgaWQgJWQgbmV3IGlkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bVBhdGNoLnNvdXJjZXNbMF0uaWQsIHBhdGNoLT5zb3VyY2VzWzBdLmlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIERldmljZVZlY3RvciBkZXZpY2VzOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhdGNoLT5udW1fc2lua3M7IGkrKykgeworICAgICAgICAgICAgLy8gT25seSBzdXBwb3J0IG1peCB0byBkZXZpY2VzIGNvbm5lY3Rpb24KKyAgICAgICAgICAgIC8vIFRPRE8gYWRkIHN1cHBvcnQgZm9yIG1peCB0byBtaXggY29ubmVjdGlvbgorICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1tpXS50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHNvdXJjZSBtaXggYnV0IHNpbmsgaXMgbm90IGEgZGV2aWNlIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9CisgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZUZyb21JZChwYXRjaC0+c2lua3NbaV0uaWQpOworICAgICAgICAgICAgaWYgKGRldkRlc2MgPT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgb3V0IGRldmljZSBub3QgZm91bmQgZm9yIGlkICVkIiwgcGF0Y2gtPnNpbmtzW2ldLmlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIW91dHB1dERlc2MtPm1Qcm9maWxlLT5pc0NvbXBhdGlibGVQcm9maWxlKGRldkRlc2MtPm1EZXZpY2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAvLyB1cGRhdGVkU2FtcGxpbmdSYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5jaGFubmVsX21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FIC8qRklYTUUqLykpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHByb2ZpbGUgbm90IHN1cHBvcnRlZCBmb3IgZGV2aWNlICUwOHgiLAorICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPm1EZXZpY2VUeXBlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXZpY2VzLmFkZChkZXZEZXNjKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGV2aWNlcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETzogcmVjb25maWd1cmUgb3V0cHV0IGZvcm1hdCBhbmQgY2hhbm5lbHMgaGVyZQorICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHNldHRpbmcgZGV2aWNlICUwOHggb24gb3V0cHV0ICVkIiwKKyAgICAgICAgICAgICAgZGV2aWNlcy50eXBlcygpLCBvdXRwdXREZXNjLT5tSW9IYW5kbGUpOworICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYy0+bUlvSGFuZGxlLCBkZXZpY2VzLnR5cGVzKCksIHRydWUsIDAsIGhhbmRsZSk7CisgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KCpoYW5kbGUpOworICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgaWYgKHBhdGNoRGVzYyAhPSAwICYmIHBhdGNoRGVzYyAhPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBzZXRPdXRwdXREZXZpY2UoKSBkaWQgbm90IHJldXNlIHRoZSBwYXRjaCBwcm92aWRlZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgICAgIHBhdGNoRGVzYy0+bVVpZCA9IHVpZDsKKyAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgc3VjY2VzcyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBzZXRPdXRwdXREZXZpY2UoKSBmYWlsZWQgdG8gY3JlYXRlIGEgcGF0Y2giKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAocGF0Y2gtPnNvdXJjZXNbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgIGlmIChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7CisgICAgICAgICAgICAvLyBpbnB1dCBkZXZpY2UgdG8gaW5wdXQgbWl4IGNvbm5lY3Rpb24KKyAgICAgICAgICAgIC8vIG9ubHkgb25lIHNpbmsgc3VwcG9ydGVkIHdoZW4gY29ubmVjdGluZyBhbiBpbnB1dCBkZXZpY2UgdG8gYSBtaXgKKyAgICAgICAgICAgIGlmIChwYXRjaC0+bnVtX3NpbmtzID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBnZXRJbnB1dEZyb21JZChwYXRjaC0+c2lua3NbMF0uaWQpOworICAgICAgICAgICAgaWYgKGlucHV0RGVzYyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYXRjaERlc2MgIT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChwYXRjaERlc2MtPm1QYXRjaC5zaW5rc1swXS5pZCAhPSBwYXRjaC0+c2lua3NbMF0uaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0KKyAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQocGF0Y2gtPnNvdXJjZXNbMF0uaWQpOworICAgICAgICAgICAgaWYgKGRldkRlc2MgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghaW5wdXREZXNjLT5tUHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShkZXZEZXNjLT5tRGV2aWNlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIC8qdXBkYXRlZFNhbXBsZVJhdGUqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5jaGFubmVsX21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSBmb3IgdGhlIHBhcmFtZXRlciB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZSBOT05FCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19JTlBVVF9GTEFHX05PTkUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVE9ETzogcmVjb25maWd1cmUgb3V0cHV0IGZvcm1hdCBhbmQgY2hhbm5lbHMgaGVyZQorICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBzZXR0aW5nIGRldmljZSAlMDh4IG9uIG91dHB1dCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPm1EZXZpY2VUeXBlLCBpbnB1dERlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICBzZXRJbnB1dERldmljZShpbnB1dERlc2MtPm1Jb0hhbmRsZSwgZGV2RGVzYy0+bURldmljZVR5cGUsIHRydWUsIGhhbmRsZSk7CisgICAgICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleSgqaGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHBhdGNoRGVzYyAhPSAwICYmIHBhdGNoRGVzYyAhPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgc2V0SW5wdXREZXZpY2UoKSBkaWQgbm90IHJldXNlIHRoZSBwYXRjaCBwcm92aWRlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bVVpZCA9IHVpZDsKKyAgICAgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHN1Y2Nlc3MiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBzZXRJbnB1dERldmljZSgpIGZhaWxlZCB0byBjcmVhdGUgYSBwYXRjaCIpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgICAgICAvLyBkZXZpY2UgdG8gZGV2aWNlIGNvbm5lY3Rpb24KKyAgICAgICAgICAgIGlmIChwYXRjaERlc2MgIT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChwYXRjaERlc2MtPm1QYXRjaC5zb3VyY2VzWzBdLmlkICE9IHBhdGNoLT5zb3VyY2VzWzBdLmlkKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc3JjRGV2aWNlRGVzYyA9CisgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKHBhdGNoLT5zb3VyY2VzWzBdLmlkKTsKKyAgICAgICAgICAgIGlmIChzcmNEZXZpY2VEZXNjID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL3VwZGF0ZSBzb3VyY2UgYW5kIHNpbmsgd2l0aCBvdXIgb3duIGRhdGEgYXMgdGhlIGRhdGEgcGFzc2VkIGluIHRoZSBwYXRjaCBtYXkKKyAgICAgICAgICAgIC8vIGJlIGluY29tcGxldGUuCisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggbmV3UGF0Y2ggPSAqcGF0Y2g7CisgICAgICAgICAgICBzcmNEZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmbmV3UGF0Y2guc291cmNlc1swXSwgJnBhdGNoLT5zb3VyY2VzWzBdKTsKKworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXRjaC0+bnVtX3NpbmtzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzW2ldLnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHNvdXJjZSBkZXZpY2UgYnV0IG9uZSBzaW5rIGlzIG5vdCBhIGRldmljZSIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc2lua0RldmljZURlc2MgPQorICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKHBhdGNoLT5zaW5rc1tpXS5pZCk7CisgICAgICAgICAgICAgICAgaWYgKHNpbmtEZXZpY2VEZXNjID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2lua0RldmljZURlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZuZXdQYXRjaC5zaW5rc1tpXSwgJnBhdGNoLT5zaW5rc1tpXSk7CisKKyAgICAgICAgICAgICAgICBpZiAoc3JjRGV2aWNlRGVzYy0+bU1vZHVsZSAhPSBzaW5rRGV2aWNlRGVzYy0+bU1vZHVsZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IG9uZSBzaW5rIHN1cHBvcnRlZCB3aGVuIGNvbm5lY3RlZCBkZXZpY2VzIGFjcm9zcyBIVyBtb2R1bGVzCisgICAgICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+bnVtX3NpbmtzID4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dHNGb3JEZXZpY2Uoc2lua0RldmljZURlc2MtPm1EZXZpY2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRzKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHNpbmsgZGV2aWNlIGlzIHJlYWNoYWJsZSB2aWEgYW4gb3BlbmVkIG91dHB1dCBzdHJlYW0sIHJlcXVlc3QgdG8gZ28gdmlhCisgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgb3V0cHV0IHN0cmVhbSBieSBhZGRpbmcgYSBzZWNvbmQgc291cmNlIHRvIHRoZSBwYXRjaCBkZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfSU5WQUxJRCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmbmV3UGF0Y2guc291cmNlc1sxXSwgJnBhdGNoLT5zb3VyY2VzWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhdGNoLm51bV9zb3VyY2VzID0gMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRPRE86IGNoZWNrIGZyb20gcm91dGluZyBjYXBhYmlsaXRpZXMgaW4gY29uZmlnIGZpbGUgYW5kIG90aGVyIGNvbmZsaWN0aW5nIHBhdGNoZXMKKworICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgYWZQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICBhZlBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goJm5ld1BhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmUGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgcGF0Y2ggcGFuZWwgcmV0dXJuZWQgJWQgcGF0Y2hIYW5kbGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCBhZlBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHBhdGNoRGVzYyA9IG5ldyBBdWRpb1BhdGNoKChhdWRpb19wYXRjaF9oYW5kbGVfdCluZXh0VW5pcXVlSWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld1BhdGNoLCB1aWQpOworICAgICAgICAgICAgICAgICAgICBhZGRBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUhhbmRsZSwgcGF0Y2hEZXNjKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1QYXRjaCA9IG5ld1BhdGNoOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKKyAgICAgICAgICAgICAgICAqaGFuZGxlID0gcGF0Y2hEZXNjLT5tSGFuZGxlOworICAgICAgICAgICAgICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBwYXRjaCBwYW5lbCBjb3VsZCBub3QgY29ubmVjdCBkZXZpY2UgcGF0Y2gsIGVycm9yICVkIiwKKyAgICAgICAgICAgICAgICBzdGF0dXMpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCit7CisgICAgQUxPR1YoInJlbGVhc2VBdWRpb1BhdGNoKCkgcGF0Y2ggJWQiLCBoYW5kbGUpOworCisgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShoYW5kbGUpOworCisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOworICAgIEFMT0dWKCJyZWxlYXNlQXVkaW9QYXRjaCgpIG1VaWRDYWNoZWQgJWQgcGF0Y2hEZXNjLT5tVWlkICVkIHVpZCAlZCIsCisgICAgICAgICAgbVVpZENhY2hlZCwgcGF0Y2hEZXNjLT5tVWlkLCB1aWQpOworICAgIGlmIChwYXRjaERlc2MtPm1VaWQgIT0gbVVpZENhY2hlZCAmJiB1aWQgIT0gcGF0Y2hEZXNjLT5tVWlkKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoID0gJnBhdGNoRGVzYy0+bVBhdGNoOworICAgIHBhdGNoRGVzYy0+bVVpZCA9IG1VaWRDYWNoZWQ7CisgICAgaWYgKHBhdGNoLT5zb3VyY2VzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgeworICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBnZXRPdXRwdXRGcm9tSWQocGF0Y2gtPnNvdXJjZXNbMF0uaWQpOworICAgICAgICBpZiAob3V0cHV0RGVzYyA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HVigicmVsZWFzZUF1ZGlvUGF0Y2goKSBvdXRwdXQgbm90IGZvdW5kIGZvciBpZCAlZCIsIHBhdGNoLT5zb3VyY2VzWzBdLmlkKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYy0+bUlvSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TmV3T3V0cHV0RGV2aWNlKG91dHB1dERlc2MtPm1Jb0hhbmRsZSwgdHJ1ZSAvKmZyb21DYWNoZSovKSwKKyAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfSBlbHNlIGlmIChwYXRjaC0+c291cmNlc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKKyAgICAgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBnZXRJbnB1dEZyb21JZChwYXRjaC0+c2lua3NbMF0uaWQpOworICAgICAgICAgICAgaWYgKGlucHV0RGVzYyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoInJlbGVhc2VBdWRpb1BhdGNoKCkgaW5wdXQgbm90IGZvdW5kIGZvciBpZCAlZCIsIHBhdGNoLT5zaW5rc1swXS5pZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldElucHV0RGV2aWNlKGlucHV0RGVzYy0+bUlvSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TmV3SW5wdXREZXZpY2UoaW5wdXREZXNjLT5tSW9IYW5kbGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICB9IGVsc2UgaWYgKHBhdGNoLT5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUsIDApOworICAgICAgICAgICAgQUxPR1YoInJlbGVhc2VBdWRpb1BhdGNoKCkgcGF0Y2ggcGFuZWwgcmV0dXJuZWQgJWQgcGF0Y2hIYW5kbGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgcmVtb3ZlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUpOworICAgICAgICAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6Omxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKQoreworICAgIGlmIChudW1fcGF0Y2hlcyA9PSBOVUxMIHx8ICgqbnVtX3BhdGNoZXMgIT0gMCAmJiBwYXRjaGVzID09IE5VTEwpIHx8CisgICAgICAgICAgICBnZW5lcmF0aW9uID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgQUxPR1YoImxpc3RBdWRpb1BhdGNoZXMoKSBudW1fcGF0Y2hlcyAlZCBwYXRjaGVzICVwIGF2YWlsYWJsZSBwYXRjaGVzICV6dSIsCisgICAgICAgICAgKm51bV9wYXRjaGVzLCBwYXRjaGVzLCBtQXVkaW9QYXRjaGVzLnNpemUoKSk7CisgICAgaWYgKHBhdGNoZXMgPT0gTlVMTCkgeworICAgICAgICAqbnVtX3BhdGNoZXMgPSAwOworICAgIH0KKworICAgIHNpemVfdCBwYXRjaGVzV3JpdHRlbiA9IDA7CisgICAgc2l6ZV90IHBhdGNoZXNNYXggPSAqbnVtX3BhdGNoZXM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7CisgICAgICAgICAgICBpICA8IG1BdWRpb1BhdGNoZXMuc2l6ZSgpICYmIHBhdGNoZXNXcml0dGVuIDwgcGF0Y2hlc01heDsgaSsrKSB7CisgICAgICAgIHBhdGNoZXNbcGF0Y2hlc1dyaXR0ZW5dID0gbUF1ZGlvUGF0Y2hlc1tpXS0+bVBhdGNoOworICAgICAgICBwYXRjaGVzW3BhdGNoZXNXcml0dGVuKytdLmlkID0gbUF1ZGlvUGF0Y2hlc1tpXS0+bUhhbmRsZTsKKyAgICAgICAgQUxPR1YoImxpc3RBdWRpb1BhdGNoZXMoKSBwYXRjaCAlenUgbnVtX3NvdXJjZXMgJWQgbnVtX3NpbmtzICVkIiwKKyAgICAgICAgICAgICAgaSwgbUF1ZGlvUGF0Y2hlc1tpXS0+bVBhdGNoLm51bV9zb3VyY2VzLCBtQXVkaW9QYXRjaGVzW2ldLT5tUGF0Y2gubnVtX3NpbmtzKTsKKyAgICB9CisgICAgKm51bV9wYXRjaGVzID0gbUF1ZGlvUGF0Y2hlcy5zaXplKCk7CisKKyAgICAqZ2VuZXJhdGlvbiA9IGN1ckF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKKyAgICBBTE9HVigibGlzdEF1ZGlvUGF0Y2hlcygpIGdvdCAlenUgcGF0Y2hlcyBuZWVkZWQgJWQiLCBwYXRjaGVzV3JpdHRlbiwgKm51bV9wYXRjaGVzKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQoreworICAgIEFMT0dWKCJzZXRBdWRpb1BvcnRDb25maWcoKSIpOworCisgICAgaWYgKGNvbmZpZyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dWKCJzZXRBdWRpb1BvcnRDb25maWcoKSBvbiBwb3J0IGhhbmRsZSAlZCIsIGNvbmZpZy0+aWQpOworICAgIC8vIE9ubHkgc3VwcG9ydCBnYWluIGNvbmZpZ3VyYXRpb24gZm9yIG5vdworICAgIGlmIChjb25maWctPmNvbmZpZ19tYXNrICE9IEFVRElPX1BPUlRfQ09ORklHX0dBSU4pIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHNwPEF1ZGlvUG9ydENvbmZpZz4gYXVkaW9Qb3J0Q29uZmlnOworICAgIGlmIChjb25maWctPnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgeworICAgICAgICBpZiAoY29uZmlnLT5yb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpIHsKKyAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IGdldE91dHB1dEZyb21JZChjb25maWctPmlkKTsKKyAgICAgICAgICAgIGlmIChvdXRwdXREZXNjID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR19BU1NFUlQoIW91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgInNldEF1ZGlvUG9ydENvbmZpZygpIGNhbGxlZCBvbiBkdXBsaWNhdGVkIG91dHB1dCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgYXVkaW9Qb3J0Q29uZmlnID0gb3V0cHV0RGVzYzsKKyAgICAgICAgfSBlbHNlIGlmIChjb25maWctPnJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTkspIHsKKyAgICAgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBnZXRJbnB1dEZyb21JZChjb25maWctPmlkKTsKKyAgICAgICAgICAgIGlmIChpbnB1dERlc2MgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdWRpb1BvcnRDb25maWcgPSBpbnB1dERlc2M7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChjb25maWctPnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgeworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjOworICAgICAgICBpZiAoY29uZmlnLT5yb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpIHsKKyAgICAgICAgICAgIGRldmljZURlc2MgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZUZyb21JZChjb25maWctPmlkKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb25maWctPnJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTkspIHsKKyAgICAgICAgICAgIGRldmljZURlc2MgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQoY29uZmlnLT5pZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGlmIChkZXZpY2VEZXNjID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgYXVkaW9Qb3J0Q29uZmlnID0gZGV2aWNlRGVzYzsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBiYWNrdXBDb25maWc7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXVkaW9Qb3J0Q29uZmlnLT5hcHBseUF1ZGlvUG9ydENvbmZpZyhjb25maWcsICZiYWNrdXBDb25maWcpOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIG5ld0NvbmZpZzsKKyAgICAgICAgYXVkaW9Qb3J0Q29uZmlnLT50b0F1ZGlvUG9ydENvbmZpZygmbmV3Q29uZmlnLCBjb25maWcpOworICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+c2V0QXVkaW9Qb3J0Q29uZmlnKCZuZXdDb25maWcsIDApOworICAgIH0KKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIGF1ZGlvUG9ydENvbmZpZy0+YXBwbHlBdWRpb1BvcnRDb25maWcoJmJhY2t1cENvbmZpZyk7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNsZWFyQXVkaW9QYXRjaGVzKHVpZF90IHVpZCkKK3sKKyAgICBmb3IgKHNzaXplX3QgaSA9IDA7IGkgPCAoc3NpemVfdCltQXVkaW9QYXRjaGVzLnNpemUoKTsgaSsrKSAgeworICAgICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChwYXRjaERlc2MtPm1VaWQgPT0gdWlkKSB7CisgICAgICAgICAgICAvLyByZWxlYXNlQXVkaW9QYXRjaCgpIHJlbW92ZXMgdGhlIHBhdGNoIGZyb20gbUF1ZGlvUGF0Y2hlcworICAgICAgICAgICAgaWYgKHJlbGVhc2VBdWRpb1BhdGNoKG1BdWRpb1BhdGNoZXMua2V5QXQoaSksIHVpZCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBpLS07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6YWNxdWlyZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90ICpzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlvSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UpCit7CisgICAgKnNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KW1wQ2xpZW50SW50ZXJmYWNlLT5uZXdBdWRpb1VuaXF1ZUlkKCk7CisgICAgKmlvSGFuZGxlID0gKGF1ZGlvX2lvX2hhbmRsZV90KW1wQ2xpZW50SW50ZXJmYWNlLT5uZXdBdWRpb1VuaXF1ZUlkKCk7CisgICAgKmRldmljZSA9IGdldERldmljZUZvcklucHV0U291cmNlKEFVRElPX1NPVVJDRV9IT1RXT1JEKTsKKworICAgIG1Tb3VuZFRyaWdnZXJTZXNzaW9ucy5hZGQoKnNlc3Npb24sICppb0hhbmRsZSk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVsZWFzZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit7CisgICAgc3NpemVfdCBpbmRleCA9IG1Tb3VuZFRyaWdnZXJTZXNzaW9ucy5pbmRleE9mS2V5KHNlc3Npb24pOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coImFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKCkgc2Vzc2lvbiAlZCBub3QgcmVnaXN0ZXJlZCIsIHNlc3Npb24pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIG1Tb3VuZFRyaWdnZXJTZXNzaW9ucy5yZW1vdmVJdGVtKHNlc3Npb24pOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjphZGRBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1BhdGNoPiYgcGF0Y2gpCit7CisgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShoYW5kbGUpOworCisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgQUxPR1coImFkZEF1ZGlvUGF0Y2goKSBwYXRjaCAlZCBhbHJlYWR5IGluIiwgaGFuZGxlKTsKKyAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOworICAgIH0KKyAgICBtQXVkaW9QYXRjaGVzLmFkZChoYW5kbGUsIHBhdGNoKTsKKyAgICBBTE9HVigiYWRkQXVkaW9QYXRjaCgpIGhhbmRsZSAlZCBhZiBoYW5kbGUgJWQgbnVtX3NvdXJjZXMgJWQgbnVtX3NpbmtzICVkIHNvdXJjZSBoYW5kbGUgJWQiCisgICAgICAgICAgICAic2luayBoYW5kbGUgJWQiLAorICAgICAgICAgIGhhbmRsZSwgcGF0Y2gtPm1BZlBhdGNoSGFuZGxlLCBwYXRjaC0+bVBhdGNoLm51bV9zb3VyY2VzLCBwYXRjaC0+bVBhdGNoLm51bV9zaW5rcywKKyAgICAgICAgICBwYXRjaC0+bVBhdGNoLnNvdXJjZXNbMF0uaWQsIHBhdGNoLT5tUGF0Y2guc2lua3NbMF0uaWQpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZW1vdmVBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGhhbmRsZSk7CisKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dXKCJyZW1vdmVBdWRpb1BhdGNoKCkgcGF0Y2ggJWQgbm90IGluIiwgaGFuZGxlKTsKKyAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOworICAgIH0KKyAgICBBTE9HVigicmVtb3ZlQXVkaW9QYXRjaCgpIGhhbmRsZSAlZCBhZiBoYW5kbGUgJWQiLCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KS0+bUFmUGF0Y2hIYW5kbGUpOworICAgIG1BdWRpb1BhdGNoZXMucmVtb3ZlSXRlbXNBdChpbmRleCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBdWRpb1BvbGljeU1hbmFnZXIKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpuZXh0VW5pcXVlSWQoKQoreworICAgIHJldHVybiBhbmRyb2lkX2F0b21pY19pbmMoJm1OZXh0VW5pcXVlSWQpOworfQorCit1aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6Om5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCkKK3sKKyAgICByZXR1cm4gYW5kcm9pZF9hdG9taWNfaW5jKCZtQXVkaW9Qb3J0R2VuZXJhdGlvbik7Cit9CisKK0F1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb2xpY3lNYW5hZ2VyKEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpCisgICAgOgorI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCisgICAgVGhyZWFkKGZhbHNlKSwKKyNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCisgICAgbVByaW1hcnlPdXRwdXQoKGF1ZGlvX2lvX2hhbmRsZV90KTApLAorICAgIG1QaG9uZVN0YXRlKEFVRElPX01PREVfTk9STUFMKSwKKyAgICBtTGltaXRSaW5ndG9uZVZvbHVtZShmYWxzZSksIG1MYXN0Vm9pY2VWb2x1bWUoLTEuMGYpLAorICAgIG1Ub3RhbEVmZmVjdHNDcHVMb2FkKDApLCBtVG90YWxFZmZlY3RzTWVtb3J5KDApLAorICAgIG1BMmRwU3VzcGVuZGVkKGZhbHNlKSwKKyAgICBtU3BlYWtlckRyY0VuYWJsZWQoZmFsc2UpLCBtTmV4dFVuaXF1ZUlkKDEpLAorICAgIG1BdWRpb1BvcnRHZW5lcmF0aW9uKDEpCit7CisgICAgbVVpZENhY2hlZCA9IGdldHVpZCgpOworICAgIG1wQ2xpZW50SW50ZXJmYWNlID0gY2xpZW50SW50ZXJmYWNlOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVDsgaSsrKSB7CisgICAgICAgIG1Gb3JjZVVzZVtpXSA9IEFVRElPX1BPTElDWV9GT1JDRV9OT05FOworICAgIH0KKworICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlID0gbmV3IERldmljZURlc2NyaXB0b3IoU3RyaW5nOCgiIiksIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUik7CisgICAgaWYgKGxvYWRBdWRpb1BvbGljeUNvbmZpZyhBVURJT19QT0xJQ1lfVkVORE9SX0NPTkZJR19GSUxFKSAhPSBOT19FUlJPUikgeworICAgICAgICBpZiAobG9hZEF1ZGlvUG9saWN5Q29uZmlnKEFVRElPX1BPTElDWV9DT05GSUdfRklMRSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJjb3VsZCBub3QgbG9hZCBhdWRpbyBwb2xpY3kgY29uZmlndXJhdGlvbiBmaWxlLCBzZXR0aW5nIGRlZmF1bHRzIik7CisgICAgICAgICAgICBkZWZhdWx0QXVkaW9Qb2xpY3lDb25maWcoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBhbmQgbUF2YWlsYWJsZUlucHV0RGV2aWNlcyBub3cgY29udGFpbiBhbGwgYXR0YWNoZWQgZGV2aWNlcworCisgICAgLy8gbXVzdCBiZSBkb25lIGFmdGVyIHJlYWRpbmcgdGhlIHBvbGljeQorICAgIGluaXRpYWxpemVWb2x1bWVDdXJ2ZXMoKTsKKworICAgIC8vIG9wZW4gYWxsIG91dHB1dCBzdHJlYW1zIG5lZWRlZCB0byBhY2Nlc3MgYXR0YWNoZWQgZGV2aWNlcworICAgIGF1ZGlvX2RldmljZXNfdCBvdXRwdXREZXZpY2VUeXBlcyA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCk7CisgICAgYXVkaW9fZGV2aWNlc190IGlucHV0RGV2aWNlVHlwZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkgJiB+QVVESU9fREVWSUNFX0JJVF9JTjsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Id01vZHVsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUh3TW9kdWxlc1tpXS0+bUhhbmRsZSA9IG1wQ2xpZW50SW50ZXJmYWNlLT5sb2FkSHdNb2R1bGUobUh3TW9kdWxlc1tpXS0+bU5hbWUpOworICAgICAgICBpZiAobUh3TW9kdWxlc1tpXS0+bUhhbmRsZSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVygiY291bGQgbm90IG9wZW4gSFcgbW9kdWxlICVzIiwgbUh3TW9kdWxlc1tpXS0+bU5hbWUpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gb3BlbiBhbGwgb3V0cHV0IHN0cmVhbXMgbmVlZGVkIHRvIGFjY2VzcyBhdHRhY2hlZCBkZXZpY2VzCisgICAgICAgIC8vIGV4Y2VwdCBmb3IgZGlyZWN0IG91dHB1dCBzdHJlYW1zIHRoYXQgYXJlIG9ubHkgb3BlbmVkIHdoZW4gdGhleSBhcmUgYWN0dWFsbHkKKyAgICAgICAgLy8gcmVxdWlyZWQgYnkgYW4gYXBwLgorICAgICAgICAvLyBUaGlzIGFsc28gdmFsaWRhdGVzIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzIGxpc3QKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IHNwPElPUHJvZmlsZT4gb3V0UHJvZmlsZSA9IG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlc1tqXTsKKworICAgICAgICAgICAgaWYgKG91dFByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJPdXRwdXQgcHJvZmlsZSBjb250YWlucyBubyBkZXZpY2Ugb24gbW9kdWxlICVzIiwgbUh3TW9kdWxlc1tpXS0+bU5hbWUpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKG91dFByb2ZpbGUtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgIT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHByb2ZpbGVUeXBlID0gb3V0UHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKTsKKyAgICAgICAgICAgIGlmICgocHJvZmlsZVR5cGUgJiBtRGVmYXVsdE91dHB1dERldmljZS0+bURldmljZVR5cGUpICE9IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICAgICAgcHJvZmlsZVR5cGUgPSBtRGVmYXVsdE91dHB1dERldmljZS0+bURldmljZVR5cGU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGNob3NlIGZpcnN0IGRldmljZSBwcmVzZW50IGluIG1TdXBwb3J0ZWREZXZpY2VzIGFsc28gcGFydCBvZgorICAgICAgICAgICAgICAgIC8vIG91dHB1dERldmljZVR5cGVzCisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgIDwgb3V0UHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuc2l6ZSgpOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvZmlsZVR5cGUgPSBvdXRQcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlc1trXS0+bURldmljZVR5cGU7CisgICAgICAgICAgICAgICAgICAgIGlmICgocHJvZmlsZVR5cGUgJiBvdXRwdXREZXZpY2VUeXBlcykgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHByb2ZpbGVUeXBlICYgb3V0cHV0RGV2aWNlVHlwZXMpID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG5ldyBBdWRpb091dHB1dERlc2NyaXB0b3Iob3V0UHJvZmlsZSk7CisKKyAgICAgICAgICAgIG91dHB1dERlc2MtPm1EZXZpY2UgPSBwcm9maWxlVHlwZTsKKyAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKKyAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGU7CisgICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrOworICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IG91dHB1dERlc2MtPm1Gb3JtYXQ7CisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuT3V0cHV0KG91dFByb2ZpbGUtPm1Nb2R1bGUtPm1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bUxhdGVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRmxhZ3MpOworCisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIkNhbm5vdCBvcGVuIG91dHB1dCBzdHJlYW0gZm9yIGRldmljZSAlMDh4IG9uIGh3IG1vZHVsZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICBtSHdNb2R1bGVzW2ldLT5tTmFtZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7CisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKKworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrICA8IG91dFByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnNpemUoKTsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlID0gb3V0UHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXNba10tPm1EZXZpY2VUeXBlOworICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5pbmRleE9mKG91dFByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzW2tdKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gZ2l2ZSBhIHZhbGlkIElEIHRvIGFuIGF0dGFjaGVkIGRldmljZSBvbmNlIGNvbmZpcm1lZCBpdCBpcyByZWFjaGFibGUKKyAgICAgICAgICAgICAgICAgICAgaWYgKChpbmRleCA+PSAwKSAmJiAobUF2YWlsYWJsZU91dHB1dERldmljZXNbaW5kZXhdLT5tSWQgPT0gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2luZGV4XS0+bUlkID0gbmV4dFVuaXF1ZUlkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpbmRleF0tPm1Nb2R1bGUgPSBtSHdNb2R1bGVzW2ldOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtUHJpbWFyeU91dHB1dCA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRQcm9maWxlLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19QUklNQVJZKSB7CisgICAgICAgICAgICAgICAgICAgIG1QcmltYXJ5T3V0cHV0ID0gb3V0cHV0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhZGRPdXRwdXQob3V0cHV0LCBvdXRwdXREZXNjKTsKKyAgICAgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBvcGVuIGlucHV0IHN0cmVhbXMgbmVlZGVkIHRvIGFjY2VzcyBhdHRhY2hlZCBkZXZpY2VzIHRvIHZhbGlkYXRlCisgICAgICAgIC8vIG1BdmFpbGFibGVJbnB1dERldmljZXMgbGlzdAorICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1Id01vZHVsZXNbaV0tPm1JbnB1dFByb2ZpbGVzLnNpemUoKTsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBzcDxJT1Byb2ZpbGU+IGluUHJvZmlsZSA9IG1Id01vZHVsZXNbaV0tPm1JbnB1dFByb2ZpbGVzW2pdOworCisgICAgICAgICAgICBpZiAoaW5Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiSW5wdXQgcHJvZmlsZSBjb250YWlucyBubyBkZXZpY2Ugb24gbW9kdWxlICVzIiwgbUh3TW9kdWxlc1tpXS0+bU5hbWUpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gY2hvc2UgZmlyc3QgZGV2aWNlIHByZXNlbnQgaW4gbVN1cHBvcnRlZERldmljZXMgYWxzbyBwYXJ0IG9mCisgICAgICAgICAgICAvLyBpbnB1dERldmljZVR5cGVzCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgcHJvZmlsZVR5cGUgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrICA8IGluUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuc2l6ZSgpOyBrKyspIHsKKyAgICAgICAgICAgICAgICBwcm9maWxlVHlwZSA9IGluUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXNba10tPm1EZXZpY2VUeXBlOworICAgICAgICAgICAgICAgIGlmIChwcm9maWxlVHlwZSAmIGlucHV0RGV2aWNlVHlwZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChwcm9maWxlVHlwZSAmIGlucHV0RGV2aWNlVHlwZXMpID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBuZXcgQXVkaW9JbnB1dERlc2NyaXB0b3IoaW5Qcm9maWxlKTsKKworICAgICAgICAgICAgaW5wdXREZXNjLT5tSW5wdXRTb3VyY2UgPSBBVURJT19TT1VSQ0VfTUlDOworICAgICAgICAgICAgaW5wdXREZXNjLT5tRGV2aWNlID0gcHJvZmlsZVR5cGU7CisKKyAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKKyAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IGlucHV0RGVzYy0+bVNhbXBsaW5nUmF0ZTsKKyAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBpbnB1dERlc2MtPm1DaGFubmVsTWFzazsKKyAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBpbnB1dERlc2MtPm1Gb3JtYXQ7CisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5JbnB1dChpblByb2ZpbGUtPm1Nb2R1bGUtPm1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0RGVzYy0+bURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9NSUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0lOUFVUX0ZMQUdfTk9ORSk7CisKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayAgPCBpblByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnNpemUoKTsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlID0gaW5Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlc1trXS0+bURldmljZVR5cGU7CisgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuaW5kZXhPZihpblByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzW2tdKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gZ2l2ZSBhIHZhbGlkIElEIHRvIGFuIGF0dGFjaGVkIGRldmljZSBvbmNlIGNvbmZpcm1lZCBpdCBpcyByZWFjaGFibGUKKyAgICAgICAgICAgICAgICAgICAgaWYgKChpbmRleCA+PSAwKSAmJiAobUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpbmRleF0tPm1JZCA9PSAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpbmRleF0tPm1JZCA9IG5leHRVbmlxdWVJZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpbmRleF0tPm1Nb2R1bGUgPSBtSHdNb2R1bGVzW2ldOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZUlucHV0KGlucHV0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coIkNhbm5vdCBvcGVuIGlucHV0IHN0cmVhbSBmb3IgZGV2aWNlICUwOHggb24gaHcgbW9kdWxlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnB1dERlc2MtPm1EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgbUh3TW9kdWxlc1tpXS0+bU5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8vIG1ha2Ugc3VyZSBhbGwgYXR0YWNoZWQgZGV2aWNlcyBoYXZlIGJlZW4gYWxsb2NhdGVkIGEgdW5pcXVlIElECisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIDwgbUF2YWlsYWJsZU91dHB1dERldmljZXMuc2l6ZSgpOykgeworICAgICAgICBpZiAobUF2YWlsYWJsZU91dHB1dERldmljZXNbaV0tPm1JZCA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVygiSW5wdXQgZGV2aWNlICUwOHggdW5yZWFjaGFibGUiLCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpXS0+bURldmljZVR5cGUpOworICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMucmVtb3ZlKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2ldKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGkrKzsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIDwgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5zaXplKCk7KSB7CisgICAgICAgIGlmIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT5tSWQgPT0gMCkgeworICAgICAgICAgICAgQUxPR1coIklucHV0IGRldmljZSAlMDh4IHVucmVhY2hhYmxlIiwgbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+bURldmljZVR5cGUpOworICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5yZW1vdmUobUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpKys7CisgICAgfQorICAgIC8vIG1ha2Ugc3VyZSBkZWZhdWx0IGRldmljZSBpcyByZWFjaGFibGUKKyAgICBpZiAobUF2YWlsYWJsZU91dHB1dERldmljZXMuaW5kZXhPZihtRGVmYXVsdE91dHB1dERldmljZSkgPCAwKSB7CisgICAgICAgIEFMT0dFKCJEZWZhdWx0IGRldmljZSAlMDh4IGlzIHVucmVhY2hhYmxlIiwgbURlZmF1bHRPdXRwdXREZXZpY2UtPm1EZXZpY2VUeXBlKTsKKyAgICB9CisKKyAgICBBTE9HRV9JRigobVByaW1hcnlPdXRwdXQgPT0gMCksICJGYWlsZWQgdG8gb3BlbiBwcmltYXJ5IG91dHB1dCIpOworCisgICAgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKKworI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCisgICAgaWYgKG1QcmltYXJ5T3V0cHV0ICE9IDApIHsKKyAgICAgICAgQXVkaW9QYXJhbWV0ZXIgb3V0cHV0Q21kID0gQXVkaW9QYXJhbWV0ZXIoKTsKKyAgICAgICAgb3V0cHV0Q21kLmFkZEludChTdHJpbmc4KCJzZXRfaWQiKSwgMCk7CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG1QcmltYXJ5T3V0cHV0LCBvdXRwdXRDbWQudG9TdHJpbmcoKSk7CisKKyAgICAgICAgbVRlc3REZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CisgICAgICAgIG1UZXN0U2FtcGxpbmdSYXRlID0gNDQxMDA7CisgICAgICAgIG1UZXN0Rm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgICAgIG1UZXN0Q2hhbm5lbHMgPSAgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICAgICAgICBtVGVzdExhdGVuY3lNcyA9IDA7CisgICAgICAgIG1DdXJPdXRwdXQgPSAwOworICAgICAgICBtRGlyZWN0T3V0cHV0ID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1RFU1RfT1VUUFVUUzsgaSsrKSB7CisgICAgICAgICAgICBtVGVzdE91dHB1dHNbaV0gPSAwOworICAgICAgICB9CisKKyAgICAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJBdWRpb1BvbGljeU1hbmFnZXJUZXN0Iik7CisgICAgICAgIHJ1bihidWZmZXIsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOworICAgIH0KKyNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCit9CisKK0F1ZGlvUG9saWN5TWFuYWdlcjo6fkF1ZGlvUG9saWN5TWFuYWdlcigpCit7CisjaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKKyAgICBleGl0KCk7CisjZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAorICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQobU91dHB1dHMua2V5QXQoaSkpOworICAgfQorICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZUlucHV0KG1JbnB1dHMua2V5QXQoaSkpOworICAgfQorICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuY2xlYXIoKTsKKyAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuY2xlYXIoKTsKKyAgIG1PdXRwdXRzLmNsZWFyKCk7CisgICBtSW5wdXRzLmNsZWFyKCk7CisgICBtSHdNb2R1bGVzLmNsZWFyKCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6aW5pdENoZWNrKCkKK3sKKyAgICByZXR1cm4gKG1QcmltYXJ5T3V0cHV0ID09IDApID8gTk9fSU5JVCA6IE5PX0VSUk9SOworfQorCisjaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp0aHJlYWRMb29wKCkKK3sKKyAgICBBTE9HVigiZW50ZXJpbmcgdGhyZWFkTG9vcCgpIik7CisgICAgd2hpbGUgKCFleGl0UGVuZGluZygpKQorICAgIHsKKyAgICAgICAgU3RyaW5nOCBjb21tYW5kOworICAgICAgICBpbnQgdmFsdWVJbnQ7CisgICAgICAgIFN0cmluZzggdmFsdWU7CisKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgbVdhaXRXb3JrQ1Yud2FpdFJlbGF0aXZlKG1Mb2NrLCBtaWxsaXNlY29uZHMoNTApKTsKKworICAgICAgICBjb21tYW5kID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMoMCwgU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5IikpOworICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGNvbW1hbmQpOworCisgICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5IiksIHZhbHVlSW50KSA9PSBOT19FUlJPUiAmJgorICAgICAgICAgICAgdmFsdWVJbnQgIT0gMCkgeworICAgICAgICAgICAgQUxPR1YoIlRlc3QgY29tbWFuZCAlcyByZWNlaXZlZCIsIGNvbW1hbmQuc3RyaW5nKCkpOworICAgICAgICAgICAgU3RyaW5nOCB0YXJnZXQ7CisgICAgICAgICAgICBpZiAocGFyYW0uZ2V0KFN0cmluZzgoInRhcmdldCIpLCB0YXJnZXQpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgdGFyZ2V0ID0gIk1hbmFnZXIiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfb3V0cHV0IiksIHZhbHVlSW50KSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHBhcmFtLnJlbW92ZShTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfb3V0cHV0IikpOworICAgICAgICAgICAgICAgIG1DdXJPdXRwdXQgPSB2YWx1ZUludDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYXJhbS5nZXQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2RpcmVjdCIpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBwYXJhbS5yZW1vdmUoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2RpcmVjdCIpKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gImZhbHNlIikgeworICAgICAgICAgICAgICAgICAgICBtRGlyZWN0T3V0cHV0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAidHJ1ZSIpIHsKKyAgICAgICAgICAgICAgICAgICAgbURpcmVjdE91dHB1dCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfaW5wdXQiKSwgdmFsdWVJbnQpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9pbnB1dCIpKTsKKyAgICAgICAgICAgICAgICBtVGVzdElucHV0ID0gdmFsdWVJbnQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwYXJhbS5nZXQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2Zvcm1hdCIpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBwYXJhbS5yZW1vdmUoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2Zvcm1hdCIpKTsKKyAgICAgICAgICAgICAgICBpbnQgZm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09ICJQQ00gMTYgYml0cyIpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAiUENNIDggYml0cyIpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV84X0JJVDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09ICJDb21wcmVzc2VkIE1QMyIpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gQVVESU9fRk9STUFUX01QMzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSBBVURJT19GT1JNQVRfSU5WQUxJRCkgeworICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID09ICJNYW5hZ2VyIikgeworICAgICAgICAgICAgICAgICAgICAgICAgbVRlc3RGb3JtYXQgPSBmb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIG91dHB1dFBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBhcmFtLmFkZEludChTdHJpbmc4KCJmb3JtYXQiKSwgZm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSwgb3V0cHV0UGFyYW0udG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGFyYW0uZ2V0KFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9jaGFubmVscyIpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBwYXJhbS5yZW1vdmUoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2NoYW5uZWxzIikpOworICAgICAgICAgICAgICAgIGludCBjaGFubmVscyA9IDA7CisKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gIkNoYW5uZWxzIFN0ZXJlbyIpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMgPSAgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gIkNoYW5uZWxzIE1vbm8iKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzID0gIEFVRElPX0NIQU5ORUxfT1VUX01PTk87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjaGFubmVscyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgPT0gIk1hbmFnZXIiKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtVGVzdENoYW5uZWxzID0gY2hhbm5lbHM7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIG91dHB1dFBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBhcmFtLmFkZEludChTdHJpbmc4KCJjaGFubmVscyIpLCBjaGFubmVscyk7CisgICAgICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0sIG91dHB1dFBhcmFtLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfc2FtcGxlUmF0ZSIpLCB2YWx1ZUludCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBwYXJhbS5yZW1vdmUoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X3NhbXBsZVJhdGUiKSk7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlSW50ID49IDAgJiYgdmFsdWVJbnQgPD0gOTYwMDApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHNhbXBsaW5nUmF0ZSA9IHZhbHVlSW50OworICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID09ICJNYW5hZ2VyIikgeworICAgICAgICAgICAgICAgICAgICAgICAgbVRlc3RTYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIG91dHB1dFBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBhcmFtLmFkZEludChTdHJpbmc4KCJzYW1wbGluZ19yYXRlIiksIHNhbXBsaW5nUmF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0sIG91dHB1dFBhcmFtLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocGFyYW0uZ2V0KFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9yZW9wZW4iKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9yZW9wZW4iKSk7CisKKyAgICAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihtUHJpbWFyeU91dHB1dCk7CisgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG1QcmltYXJ5T3V0cHV0KTsKKworICAgICAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGVIYW5kbGUgPSBvdXRwdXREZXNjLT5tTW9kdWxlLT5tSGFuZGxlOworCisgICAgICAgICAgICAgICAgbU91dHB1dHMucmVtb3ZlSXRlbShtUHJpbWFyeU91dHB1dCk7CisKKyAgICAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBuZXcgQXVkaW9PdXRwdXREZXNjcmlwdG9yKE5VTEwpOworICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1EZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CisgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgICAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGU7CisgICAgICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IG91dHB1dERlc2MtPm1DaGFubmVsTWFzazsKKyAgICAgICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gb3V0cHV0RGVzYy0+bUZvcm1hdDsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dChtb2R1bGVIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1QcmltYXJ5T3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1MYXRlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1GbGFncyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJlb3BlbiBoYXJkd2FyZSBvdXRwdXQgc3RyZWFtLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAic2FtcGxpbmdSYXRlOiAlZCwgZm9ybWF0ICVkLCBjaGFubmVscyAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlLCBvdXRwdXREZXNjLT5tRm9ybWF0LCBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2spOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1DaGFubmVsTWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Gb3JtYXQgPSBjb25maWcuZm9ybWF0OworICAgICAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBvdXRwdXRDbWQgPSBBdWRpb1BhcmFtZXRlcigpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRDbWQuYWRkSW50KFN0cmluZzgoInNldF9pZCIpLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMobVByaW1hcnlPdXRwdXQsIG91dHB1dENtZC50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkT3V0cHV0KG1QcmltYXJ5T3V0cHV0LCBvdXRwdXREZXNjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoMCwgU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5PSIpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpleGl0KCkKK3sKKyAgICB7CisgICAgICAgIEF1dG9NdXRleCBfbChtTG9jayk7CisgICAgICAgIHJlcXVlc3RFeGl0KCk7CisgICAgICAgIG1XYWl0V29ya0NWLnNpZ25hbCgpOworICAgIH0KKyAgICByZXF1ZXN0RXhpdEFuZFdhaXQoKTsKK30KKworaW50IEF1ZGlvUG9saWN5TWFuYWdlcjo6dGVzdE91dHB1dEluZGV4KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKK3sKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9URVNUX09VVFBVVFM7IGkrKykgeworICAgICAgICBpZiAob3V0cHV0ID09IG1UZXN0T3V0cHV0c1tpXSkgcmV0dXJuIGk7CisgICAgfQorICAgIHJldHVybiAwOworfQorI2VuZGlmIC8vQVVESU9fUE9MSUNZX1RFU1QKKworLy8gLS0tCisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjphZGRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MpCit7CisgICAgb3V0cHV0RGVzYy0+bUlvSGFuZGxlID0gb3V0cHV0OworICAgIG91dHB1dERlc2MtPm1JZCA9IG5leHRVbmlxdWVJZCgpOworICAgIG1PdXRwdXRzLmFkZChvdXRwdXQsIG91dHB1dERlc2MpOworICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjphZGRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYykKK3sKKyAgICBpbnB1dERlc2MtPm1Jb0hhbmRsZSA9IGlucHV0OworICAgIGlucHV0RGVzYy0+bUlkID0gbmV4dFVuaXF1ZUlkKCk7CisgICAgbUlucHV0cy5hZGQoaW5wdXQsIGlucHV0RGVzYyk7CisgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmZpbmRJb0hhbmRsZXNCeUFkZHJlc3Moc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjIC8qaW4qLywKKyAgICAgICAgY29uc3QgU3RyaW5nOCBhZGRyZXNzIC8qaW4qLywKKyAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cyAvKm91dCovKSB7CisgICAgLy8gbG9vayBmb3IgYSBtYXRjaCBvbiB0aGUgZ2l2ZW4gYWRkcmVzcyBvbiB0aGUgYWRkcmVzc2VzIG9mIHRoZSBvdXRwdXRzOgorICAgIC8vIGZpbmQgdGhlIGFkZHJlc3MgYnkgZmluZGluZyB0aGUgcGF0Y2ggdGhhdCBtYXBzIHRvIHRoaXMgb3V0cHV0CisgICAgc3NpemVfdCBwYXRjaElkeCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShkZXNjLT5tUGF0Y2hIYW5kbGUpOworICAgIC8vQUxPR1YoIiAgICBpbnNwZWN0aW5nIG91dHB1dCAlZCAocGF0Y2ggJWQpIGZvciBzdXBwb3J0ZWQgZGV2aWNlPTB4JXgiLAorICAgIC8vICAgICAgICBvdXRwdXRJZHgsIHBhdGNoSWR4LCAgZGVzYy0+bVByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkpOworICAgIGlmIChwYXRjaElkeCA+PSAwKSB7CisgICAgICAgIGNvbnN0IHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChwYXRjaElkeCk7CisgICAgICAgIGNvbnN0IGludCBudW1TaW5rcyA9IHBhdGNoRGVzYy0+bVBhdGNoLm51bV9zaW5rczsKKyAgICAgICAgZm9yIChzc2l6ZV90IGo9MDsgaiA8IG51bVNpbmtzOyBqKyspIHsKKyAgICAgICAgICAgIGlmIChwYXRjaERlc2MtPm1QYXRjaC5zaW5rc1tqXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXRjaEFkZHIgPQorICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tUGF0Y2guc2lua3Nbal0uZXh0LmRldmljZS5hZGRyZXNzOworICAgICAgICAgICAgICAgIGlmIChzdHJuY21wKHBhdGNoQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Muc3RyaW5nKCksIEFVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU4pID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImZpbmRJb0hhbmRsZXNCeUFkZHJlc3MoKTogYWRkaW5nIG9wZW5lZCBvdXRwdXQgJWQgb24gc2FtZSBhZGRyZXNzICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5tSW9IYW5kbGUsICBwYXRjaERlc2MtPm1QYXRjaC5zaW5rc1tqXS5leHQuZGV2aWNlLmFkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRzLmFkZChkZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tPdXRwdXRzRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCBhZGRyZXNzKQoreworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBkZXZEZXNjLT5tRGV2aWNlVHlwZTsKKyAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2M7CisgICAgLy8gZXJhc2UgYWxsIGN1cnJlbnQgc2FtcGxlIHJhdGVzLCBmb3JtYXRzIGFuZCBjaGFubmVsIG1hc2tzCisgICAgZGV2RGVzYy0+Y2xlYXJDYXBhYmlsaXRpZXMoKTsKKworICAgIGlmIChzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSkgeworICAgICAgICAvLyBmaXJzdCBsaXN0IGFscmVhZHkgb3BlbiBvdXRwdXRzIHRoYXQgY2FuIGJlIHJvdXRlZCB0byB0aGlzIGRldmljZQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIGlmICghZGVzYy0+aXNEdXBsaWNhdGVkKCkgJiYgKGRlc2MtPm1Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgZGV2aWNlKSkgeworICAgICAgICAgICAgICAgIGlmICghZGV2aWNlRGlzdGluZ3Vpc2hlc09uQWRkcmVzcyhkZXZpY2UpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIG9wZW5lZCBvdXRwdXQgJWQiLCBtT3V0cHV0cy5rZXlBdChpKSk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dHMuYWRkKG1PdXRwdXRzLmtleUF0KGkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiICBjaGVja2luZyBhZGRyZXNzIG1hdGNoIGR1ZSB0byBkZXZpY2UgMHgleCIsIGRldmljZSk7CisgICAgICAgICAgICAgICAgICAgIGZpbmRJb0hhbmRsZXNCeUFkZHJlc3MoZGVzYywgYWRkcmVzcywgb3V0cHV0cyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIHRoZW4gbG9vayBmb3Igb3V0cHV0IHByb2ZpbGVzIHRoYXQgY2FuIGJlIHJvdXRlZCB0byB0aGlzIGRldmljZQorICAgICAgICBTb3J0ZWRWZWN0b3I8IHNwPElPUHJvZmlsZT4gPiBwcm9maWxlczsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobUh3TW9kdWxlc1tpXS0+bUhhbmRsZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlcy5zaXplKCk7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzW2pdLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgZGV2aWNlKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIHByb2ZpbGUgJXp1IGZyb20gbW9kdWxlICV6dSIsIGosIGkpOworICAgICAgICAgICAgICAgICAgICBwcm9maWxlcy5hZGQobUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzW2pdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBBTE9HVigiICBmb3VuZCAlZCBwcm9maWxlcywgJWQgb3V0cHV0cyIsIHByb2ZpbGVzLnNpemUoKSwgb3V0cHV0cy5zaXplKCkpOworCisgICAgICAgIGlmIChwcm9maWxlcy5pc0VtcHR5KCkgJiYgb3V0cHV0cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dXKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogTm8gb3V0cHV0IGF2YWlsYWJsZSBmb3IgZGV2aWNlICUwNHgiLCBkZXZpY2UpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG9wZW4gb3V0cHV0cyBmb3IgbWF0Y2hpbmcgcHJvZmlsZXMgaWYgbmVlZGVkLiBEaXJlY3Qgb3V0cHV0cyBhcmUgYWxzbyBvcGVuZWQgdG8KKyAgICAgICAgLy8gcXVlcnkgZm9yIGR5bmFtaWMgcGFyYW1ldGVycyBhbmQgd2lsbCBiZSBjbG9zZWQgbGF0ZXIgYnkgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkKKyAgICAgICAgZm9yIChzc2l6ZV90IHByb2ZpbGVfaW5kZXggPSAwOyBwcm9maWxlX2luZGV4IDwgKHNzaXplX3QpcHJvZmlsZXMuc2l6ZSgpOyBwcm9maWxlX2luZGV4KyspIHsKKyAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IHByb2ZpbGVzW3Byb2ZpbGVfaW5kZXhdOworCisgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGlmIG9uZSBvdXRwdXQgaXMgYWxyZWFkeSBvcGVuZWQgZm9yIHRoaXMgcHJvZmlsZQorICAgICAgICAgICAgc2l6ZV90IGo7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgb3V0cHV0cy5zaXplKCk7IGorKykgeworICAgICAgICAgICAgICAgIGRlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXRzLml0ZW1BdChqKSk7CisgICAgICAgICAgICAgICAgaWYgKCFkZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJiBkZXNjLT5tUHJvZmlsZSA9PSBwcm9maWxlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG1hdGNoaW5nIHByb2ZpbGU6IHNhdmUgdGhlIHNhbXBsZSByYXRlcywgZm9ybWF0IGFuZCBjaGFubmVsIG1hc2tzIHN1cHBvcnRlZAorICAgICAgICAgICAgICAgICAgICAvLyBieSB0aGUgcHJvZmlsZSBpbiBvdXIgZGV2aWNlIGRlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+aW1wb3J0QXVkaW9Qb3J0KHByb2ZpbGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaiAhPSBvdXRwdXRzLnNpemUoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBTE9HVigib3BlbmluZyBvdXRwdXQgZm9yIGRldmljZSAlMDh4IHdpdGggcGFyYW1zICVzIHByb2ZpbGUgJXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLCBhZGRyZXNzLnN0cmluZygpLCBwcm9maWxlLmdldCgpKTsKKyAgICAgICAgICAgIGRlc2MgPSBuZXcgQXVkaW9PdXRwdXREZXNjcmlwdG9yKHByb2ZpbGUpOworICAgICAgICAgICAgZGVzYy0+bURldmljZSA9IGRldmljZTsKKyAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKKyAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IGRlc2MtPm1TYW1wbGluZ1JhdGU7CisgICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gZGVzYy0+bUNoYW5uZWxNYXNrOworICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IGRlc2MtPm1Gb3JtYXQ7CisgICAgICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvLnNhbXBsZV9yYXRlID0gZGVzYy0+bVNhbXBsaW5nUmF0ZTsKKyAgICAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uY2hhbm5lbF9tYXNrID0gZGVzYy0+bUNoYW5uZWxNYXNrOworICAgICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mby5mb3JtYXQgPSBkZXNjLT5tRm9ybWF0OworICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dChwcm9maWxlLT5tTW9kdWxlLT5tSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzYy0+bURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzYy0+bUxhdGVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5tRmxhZ3MpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGRlc2MtPm1TYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7CisgICAgICAgICAgICAgICAgZGVzYy0+bUNoYW5uZWxNYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKKyAgICAgICAgICAgICAgICBkZXNjLT5tRm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKKworICAgICAgICAgICAgICAgIC8vIEhlcmUgaXMgd2hlcmUgdGhlIG91dF9zZXRfcGFyYW1ldGVycygpIGZvciBjYXJkICYgZGV2aWNlIGdldHMgY2FsbGVkCisgICAgICAgICAgICAgICAgaWYgKCFhZGRyZXNzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBjaGFyICpwYXJhbSA9IGF1ZGlvX2RldmljZV9hZGRyZXNzX3RvX3BhcmFtZXRlcihkZXZpY2UsIGFkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhvdXRwdXQsIFN0cmluZzgocGFyYW0pKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZShwYXJhbSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gSGVyZSBpcyB3aGVyZSB3ZSBzdGVwIHRocm91Z2ggYW5kIHJlc29sdmUgYW55ICJkeW5hbWljIiBmaWVsZHMKKyAgICAgICAgICAgICAgICBTdHJpbmc4IHJlcGx5OworICAgICAgICAgICAgICAgIGNoYXIgKnZhbHVlOworICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tU2FtcGxpbmdSYXRlc1swXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5ID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMob3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fU1VQX1NBTVBMSU5HX1JBVEVTKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBzdXBwb3J0ZWQgc2FtcGxpbmcgcmF0ZXMgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHkuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cnBicmsoKGNoYXIgKilyZXBseS5zdHJpbmcoKSwgIj0iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRTYW1wbGluZ1JhdGVzKHZhbHVlICsgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1Gb3JtYXRzWzBdID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5ID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMob3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChBVURJT19QQVJBTUVURVJfU1RSRUFNX1NVUF9GT1JNQVRTKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBzdXBwb3J0ZWQgZm9ybWF0cyAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc3RycGJyaygoY2hhciAqKXJlcGx5LnN0cmluZygpLCAiPSIpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bG9hZEZvcm1hdHModmFsdWUgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bUNoYW5uZWxNYXNrc1swXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5ID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMob3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fU1VQX0NIQU5ORUxTKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBzdXBwb3J0ZWQgY2hhbm5lbCBtYXNrcyAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc3RycGJyaygoY2hhciAqKXJlcGx5LnN0cmluZygpLCAiPSIpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bG9hZE91dENoYW5uZWxzKHZhbHVlICsgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCgocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXNbMF0gPT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuc2l6ZSgpIDwgMikpIHx8CisgICAgICAgICAgICAgICAgICAgICAoKHByb2ZpbGUtPm1Gb3JtYXRzWzBdID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9maWxlLT5tRm9ybWF0cy5zaXplKCkgPCAyKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICgocHJvZmlsZS0+bUNoYW5uZWxNYXNrc1swXSA9PSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLnNpemUoKSA8IDIpKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgbWlzc2luZyBwYXJhbSIpOworICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9maWxlLT5tU2FtcGxpbmdSYXRlc1swXSA9PSAwIHx8IHByb2ZpbGUtPm1Gb3JtYXRzWzBdID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tQ2hhbm5lbE1hc2tzWzBdID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IHByb2ZpbGUtPnBpY2tTYW1wbGluZ1JhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IHByb2ZpbGUtPnBpY2tDaGFubmVsTWFzaygpOworICAgICAgICAgICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gcHJvZmlsZS0+cGlja0Zvcm1hdCgpOworICAgICAgICAgICAgICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvLnNhbXBsZV9yYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOworICAgICAgICAgICAgICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvLmNoYW5uZWxfbWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uZm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5PdXRwdXQocHJvZmlsZS0+bU1vZHVsZS0+bUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2MtPm1EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjLT5tTGF0ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bUZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bVNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1DaGFubmVsTWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5tRm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgICAgICBhZGRPdXRwdXQob3V0cHV0LCBkZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChkZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGR1cGxpY2F0ZWRPdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGluaXRpYWwgc3RyZWFtIHZvbHVtZSBmb3IgZGV2aWNlCisgICAgICAgICAgICAgICAgICAgICAgICBhcHBseVN0cmVhbVZvbHVtZXMob3V0cHV0LCBkZXZpY2UsIDAsIHRydWUpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE86IGNvbmZpZ3VyZSBhdWRpbyBlZmZlY3Qgb3V0cHV0IHN0YWdlIGhlcmUKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3BlbiBhIGR1cGxpY2F0aW5nIG91dHB1dCB0aHJlYWQgZm9yIHRoZSBuZXcgb3V0cHV0IGFuZCB0aGUgcHJpbWFyeSBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZWRPdXRwdXQgPSBtcENsaWVudEludGVyZmFjZS0+b3BlbkR1cGxpY2F0ZU91dHB1dChvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByaW1hcnlPdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR1cGxpY2F0ZWRPdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgZHVwbGljYXRlZCBvdXRwdXQgZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZHVwT3V0cHV0RGVzYyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXVkaW9PdXRwdXREZXNjcmlwdG9yKE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cE91dHB1dERlc2MtPm1PdXRwdXQxID0gbU91dHB1dHMudmFsdWVGb3IobVByaW1hcnlPdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cE91dHB1dERlc2MtPm1PdXRwdXQyID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlID0gZGVzYy0+bVNhbXBsaW5nUmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tRm9ybWF0ID0gZGVzYy0+bUZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2sgPSBkZXNjLT5tQ2hhbm5lbE1hc2s7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwT3V0cHV0RGVzYy0+bUxhdGVuY3kgPSBkZXNjLT5tTGF0ZW5jeTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRPdXRwdXQoZHVwbGljYXRlZE91dHB1dCwgZHVwT3V0cHV0RGVzYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlTdHJlYW1Wb2x1bWVzKGR1cGxpY2F0ZWRPdXRwdXQsIGRldmljZSwgMCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBjb3VsZCBub3Qgb3BlbiBkdXAgb3V0cHV0IGZvciAlZCBhbmQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByaW1hcnlPdXRwdXQsIG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dHMucmVtb3ZlSXRlbShvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBjb3VsZCBub3Qgb3BlbiBvdXRwdXQgZm9yIGRldmljZSAleCIsIGRldmljZSk7CisgICAgICAgICAgICAgICAgcHJvZmlsZXMucmVtb3ZlQXQocHJvZmlsZV9pbmRleCk7CisgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleC0tOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRzLmFkZChvdXRwdXQpOworICAgICAgICAgICAgICAgIGRldkRlc2MtPmltcG9ydEF1ZGlvUG9ydChwcm9maWxlKTsKKworICAgICAgICAgICAgICAgIGlmIChkZXZpY2VEaXN0aW5ndWlzaGVzT25BZGRyZXNzKGRldmljZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBzZXRPdXRwdXREZXZpY2UoZGV2PTB4JXgsIGFkZHI9JXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsIGFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0LCBkZXZpY2UsIHRydWUvKmZvcmNlKi8sIDAvKmRlbGF5Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTC8qcGF0Y2ggaGFuZGxlKi8sIGFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IGFkZGluZyBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHByb2ZpbGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR1coImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBObyBvdXRwdXQgYXZhaWxhYmxlIGZvciBkZXZpY2UgJTA0eCIsIGRldmljZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfSBlbHNlIHsgLy8gRGlzY29ubmVjdAorICAgICAgICAvLyBjaGVjayBpZiBvbmUgb3BlbmVkIG91dHB1dCBpcyBub3QgbmVlZGVkIGFueSBtb3JlIGFmdGVyIGRpc2Nvbm5lY3Rpbmcgb25lIGRldmljZQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIGlmICghZGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAgKCEoZGVzYy0+bVByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICYgbUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBkaXNjb25uZWN0aW5nIGFkZGluZyBvdXRwdXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRzLmtleUF0KGkpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0cy5hZGQobU91dHB1dHMua2V5QXQoaSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGV2aWNlRGlzdGluZ3Vpc2hlc09uQWRkcmVzcyhkZXZpY2UpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBleGFjdCBtYXRjaCBvbiBkZXZpY2UKKyAgICAgICAgICAgICAgICAgICAgICAgIChkZXNjLT5tUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSA9PSBkZXZpY2UpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmRJb0hhbmRsZXNCeUFkZHJlc3MoZGVzYywgYWRkcmVzcywgb3V0cHV0cyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIENsZWFyIGFueSBwcm9maWxlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGRpc2Nvbm5lY3RlZCBkZXZpY2UuCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1Id01vZHVsZXNbaV0tPm1IYW5kbGUgPT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzW2pdOworICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgZGV2aWNlKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGVhcmluZyBkaXJlY3Qgb3V0cHV0IHByb2ZpbGUgJXp1IG9uIG1vZHVsZSAlenUiLCBqLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzWzBdID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5hZGQoMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1Gb3JtYXRzWzBdID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tRm9ybWF0cy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bUZvcm1hdHMuYWRkKEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bUNoYW5uZWxNYXNrc1swXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLmFkZCgwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tJbnB1dHNGb3JEZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIGlucHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggYWRkcmVzcykKK3sKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gZGVzYzsKKyAgICBpZiAoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpIHsKKyAgICAgICAgLy8gZmlyc3QgbGlzdCBhbHJlYWR5IG9wZW4gaW5wdXRzIHRoYXQgY2FuIGJlIHJvdXRlZCB0byB0aGlzIGRldmljZQorICAgICAgICBmb3IgKHNpemVfdCBpbnB1dF9pbmRleCA9IDA7IGlucHV0X2luZGV4IDwgbUlucHV0cy5zaXplKCk7IGlucHV0X2luZGV4KyspIHsKKyAgICAgICAgICAgIGRlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5wdXRfaW5kZXgpOworICAgICAgICAgICAgaWYgKGRlc2MtPm1Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgKGRldmljZSAmIH5BVURJT19ERVZJQ0VfQklUX0lOKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBhZGRpbmcgb3BlbmVkIGlucHV0ICVkIiwgbUlucHV0cy5rZXlBdChpbnB1dF9pbmRleCkpOworICAgICAgICAgICAgICAgaW5wdXRzLmFkZChtSW5wdXRzLmtleUF0KGlucHV0X2luZGV4KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyB0aGVuIGxvb2sgZm9yIGlucHV0IHByb2ZpbGVzIHRoYXQgY2FuIGJlIHJvdXRlZCB0byB0aGlzIGRldmljZQorICAgICAgICBTb3J0ZWRWZWN0b3I8IHNwPElPUHJvZmlsZT4gPiBwcm9maWxlczsKKyAgICAgICAgZm9yIChzaXplX3QgbW9kdWxlX2lkeCA9IDA7IG1vZHVsZV9pZHggPCBtSHdNb2R1bGVzLnNpemUoKTsgbW9kdWxlX2lkeCsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobUh3TW9kdWxlc1ttb2R1bGVfaWR4XS0+bUhhbmRsZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKHNpemVfdCBwcm9maWxlX2luZGV4ID0gMDsKKyAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCA8IG1Id01vZHVsZXNbbW9kdWxlX2lkeF0tPm1JbnB1dFByb2ZpbGVzLnNpemUoKTsKKyAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtSHdNb2R1bGVzW21vZHVsZV9pZHhdLT5tSW5wdXRQcm9maWxlc1twcm9maWxlX2luZGV4XS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgJiAoZGV2aWNlICYgfkFVRElPX0RFVklDRV9CSVRfSU4pKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBhZGRpbmcgcHJvZmlsZSAlenUgZnJvbSBtb2R1bGUgJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCwgbW9kdWxlX2lkeCk7CisgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVzLmFkZChtSHdNb2R1bGVzW21vZHVsZV9pZHhdLT5tSW5wdXRQcm9maWxlc1twcm9maWxlX2luZGV4XSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHByb2ZpbGVzLmlzRW1wdHkoKSAmJiBpbnB1dHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBBTE9HVygiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogTm8gaW5wdXQgYXZhaWxhYmxlIGZvciBkZXZpY2UgMHglWCIsIGRldmljZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgLy8gb3BlbiBpbnB1dHMgZm9yIG1hdGNoaW5nIHByb2ZpbGVzIGlmIG5lZWRlZC4gRGlyZWN0IGlucHV0cyBhcmUgYWxzbyBvcGVuZWQgdG8KKyAgICAgICAgLy8gcXVlcnkgZm9yIGR5bmFtaWMgcGFyYW1ldGVycyBhbmQgd2lsbCBiZSBjbG9zZWQgbGF0ZXIgYnkgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkKKyAgICAgICAgZm9yIChzc2l6ZV90IHByb2ZpbGVfaW5kZXggPSAwOyBwcm9maWxlX2luZGV4IDwgKHNzaXplX3QpcHJvZmlsZXMuc2l6ZSgpOyBwcm9maWxlX2luZGV4KyspIHsKKworICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gcHJvZmlsZXNbcHJvZmlsZV9pbmRleF07CisgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGlmIG9uZSBpbnB1dCBpcyBhbHJlYWR5IG9wZW5lZCBmb3IgdGhpcyBwcm9maWxlCisgICAgICAgICAgICBzaXplX3QgaW5wdXRfaW5kZXg7CisgICAgICAgICAgICBmb3IgKGlucHV0X2luZGV4ID0gMDsgaW5wdXRfaW5kZXggPCBtSW5wdXRzLnNpemUoKTsgaW5wdXRfaW5kZXgrKykgeworICAgICAgICAgICAgICAgIGRlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5wdXRfaW5kZXgpOworICAgICAgICAgICAgICAgIGlmIChkZXNjLT5tUHJvZmlsZSA9PSBwcm9maWxlKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbnB1dF9pbmRleCAhPSBtSW5wdXRzLnNpemUoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBTE9HVigib3BlbmluZyBpbnB1dCBmb3IgZGV2aWNlIDB4JVggd2l0aCBwYXJhbXMgJXMiLCBkZXZpY2UsIGFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICAgICAgZGVzYyA9IG5ldyBBdWRpb0lucHV0RGVzY3JpcHRvcihwcm9maWxlKTsKKyAgICAgICAgICAgIGRlc2MtPm1EZXZpY2UgPSBkZXZpY2U7CisgICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBkZXNjLT5tU2FtcGxpbmdSYXRlOworICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IGRlc2MtPm1DaGFubmVsTWFzazsKKyAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBkZXNjLT5tRm9ybWF0OworICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuSW5wdXQocHJvZmlsZS0+bU1vZHVsZS0+bUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzYy0+bURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX01JQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fSU5QVVRfRkxBR19OT05FIC8qRklYTUUqLyk7CisKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBkZXNjLT5tU2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOworICAgICAgICAgICAgICAgIGRlc2MtPm1DaGFubmVsTWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7CisgICAgICAgICAgICAgICAgZGVzYy0+bUZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7CisKKyAgICAgICAgICAgICAgICBpZiAoIWFkZHJlc3MuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgKnBhcmFtID0gYXVkaW9fZGV2aWNlX2FkZHJlc3NfdG9fcGFyYW1ldGVyKGRldmljZSwgYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKGlucHV0LCBTdHJpbmc4KHBhcmFtKSk7CisgICAgICAgICAgICAgICAgICAgIGZyZWUocGFyYW0pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEhlcmUgaXMgd2hlcmUgd2Ugc3RlcCB0aHJvdWdoIGFuZCByZXNvbHZlIGFueSAiZHluYW1pYyIgZmllbGRzCisgICAgICAgICAgICAgICAgU3RyaW5nOCByZXBseTsKKyAgICAgICAgICAgICAgICBjaGFyICp2YWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXNbMF0gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXBseSA9IG1wQ2xpZW50SW50ZXJmYWNlLT5nZXRQYXJhbWV0ZXJzKGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fU1VQX1NBTVBMSU5HX1JBVEVTKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpIGRpcmVjdCBpbnB1dCBzdXAgc2FtcGxpbmcgcmF0ZXMgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHkuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cnBicmsoKGNoYXIgKilyZXBseS5zdHJpbmcoKSwgIj0iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRTYW1wbGluZ1JhdGVzKHZhbHVlICsgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1Gb3JtYXRzWzBdID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5ID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMoaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fU1VQX0ZPUk1BVFMpKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCkgZGlyZWN0IGlucHV0IHN1cCBmb3JtYXRzICVzIiwgcmVwbHkuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cnBicmsoKGNoYXIgKilyZXBseS5zdHJpbmcoKSwgIj0iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRGb3JtYXRzKHZhbHVlICsgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1DaGFubmVsTWFza3NbMF0gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXBseSA9IG1wQ2xpZW50SW50ZXJmYWNlLT5nZXRQYXJhbWV0ZXJzKGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fU1VQX0NIQU5ORUxTKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpIGRpcmVjdCBpbnB1dCBzdXAgY2hhbm5lbCBtYXNrcyAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc3RycGJyaygoY2hhciAqKXJlcGx5LnN0cmluZygpLCAiPSIpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bG9hZEluQ2hhbm5lbHModmFsdWUgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKChwcm9maWxlLT5tU2FtcGxpbmdSYXRlc1swXSA9PSAwKSAmJiAocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuc2l6ZSgpIDwgMikpIHx8CisgICAgICAgICAgICAgICAgICAgICAoKHByb2ZpbGUtPm1Gb3JtYXRzWzBdID09IDApICYmIChwcm9maWxlLT5tRm9ybWF0cy5zaXplKCkgPCAyKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICgocHJvZmlsZS0+bUNoYW5uZWxNYXNrc1swXSA9PSAwKSAmJiAocHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5zaXplKCkgPCAyKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coImNoZWNrSW5wdXRzRm9yRGV2aWNlKCkgZGlyZWN0IGlucHV0IG1pc3NpbmcgcGFyYW0iKTsKKyAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlSW5wdXQoaW5wdXQpOworICAgICAgICAgICAgICAgICAgICBpbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChpbnB1dCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZElucHV0KGlucHV0LCBkZXNjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IC8vIGVuZGlmIGlucHV0ICE9IDAKKworICAgICAgICAgICAgaWYgKGlucHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImNoZWNrSW5wdXRzRm9yRGV2aWNlKCkgY291bGQgbm90IG9wZW4gaW5wdXQgZm9yIGRldmljZSAweCVYIiwgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICBwcm9maWxlcy5yZW1vdmVBdChwcm9maWxlX2luZGV4KTsKKyAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4LS07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlucHV0cy5hZGQoaW5wdXQpOworICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBhZGRpbmcgaW5wdXQgJWQiLCBpbnB1dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gLy8gZW5kIHNjYW4gcHJvZmlsZXMKKworICAgICAgICBpZiAocHJvZmlsZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBBTE9HVygiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogTm8gaW5wdXQgYXZhaWxhYmxlIGZvciBkZXZpY2UgMHglWCIsIGRldmljZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRGlzY29ubmVjdAorICAgICAgICAvLyBjaGVjayBpZiBvbmUgb3BlbmVkIGlucHV0IGlzIG5vdCBuZWVkZWQgYW55IG1vcmUgYWZ0ZXIgZGlzY29ubmVjdGluZyBvbmUgZGV2aWNlCisgICAgICAgIGZvciAoc2l6ZV90IGlucHV0X2luZGV4ID0gMDsgaW5wdXRfaW5kZXggPCBtSW5wdXRzLnNpemUoKTsgaW5wdXRfaW5kZXgrKykgeworICAgICAgICAgICAgZGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbnB1dF9pbmRleCk7CisgICAgICAgICAgICBpZiAoIShkZXNjLT5tUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIG1BdmFpbGFibGVJbnB1dERldmljZXMudHlwZXMoKSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogZGlzY29ubmVjdGluZyBhZGRpbmcgaW5wdXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dHMua2V5QXQoaW5wdXRfaW5kZXgpKTsKKyAgICAgICAgICAgICAgICBpbnB1dHMuYWRkKG1JbnB1dHMua2V5QXQoaW5wdXRfaW5kZXgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBDbGVhciBhbnkgcHJvZmlsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBkaXNjb25uZWN0ZWQgZGV2aWNlLgorICAgICAgICBmb3IgKHNpemVfdCBtb2R1bGVfaW5kZXggPSAwOyBtb2R1bGVfaW5kZXggPCBtSHdNb2R1bGVzLnNpemUoKTsgbW9kdWxlX2luZGV4KyspIHsKKyAgICAgICAgICAgIGlmIChtSHdNb2R1bGVzW21vZHVsZV9pbmRleF0tPm1IYW5kbGUgPT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChzaXplX3QgcHJvZmlsZV9pbmRleCA9IDA7CisgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXggPCBtSHdNb2R1bGVzW21vZHVsZV9pbmRleF0tPm1JbnB1dFByb2ZpbGVzLnNpemUoKTsKKyAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCsrKSB7CisgICAgICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbUh3TW9kdWxlc1ttb2R1bGVfaW5kZXhdLT5tSW5wdXRQcm9maWxlc1twcm9maWxlX2luZGV4XTsKKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIGRldmljZSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogY2xlYXJpbmcgZGlyZWN0IGlucHV0IHByb2ZpbGUgJXp1IG9uIG1vZHVsZSAlenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4LCBtb2R1bGVfaW5kZXgpOworICAgICAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXNbMF0gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLmFkZCgwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bUZvcm1hdHNbMF0gPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1Gb3JtYXRzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tRm9ybWF0cy5hZGQoQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tQ2hhbm5lbE1hc2tzWzBdID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1DaGFubmVsTWFza3MuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1DaGFubmVsTWFza3MuYWRkKDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSAvLyBlbmQgZGlzY29ubmVjdAorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbG9zZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCit7CisgICAgQUxPR1YoImNsb3NlT3V0cHV0KCVkKSIsIG91dHB1dCk7CisKKyAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOworICAgIGlmIChvdXRwdXREZXNjID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coImNsb3NlT3V0cHV0KCkgdW5rbm93biBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gbG9vayBmb3IgZHVwbGljYXRlZCBvdXRwdXRzIGNvbm5lY3RlZCB0byB0aGUgb3V0cHV0IGJlaW5nIHJlbW92ZWQuCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGR1cE91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoZHVwT3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkgJiYKKyAgICAgICAgICAgICAgICAoZHVwT3V0cHV0RGVzYy0+bU91dHB1dDEgPT0gb3V0cHV0RGVzYyB8fAorICAgICAgICAgICAgICAgIGR1cE91dHB1dERlc2MtPm1PdXRwdXQyID09IG91dHB1dERlc2MpKSB7CisgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MyOworICAgICAgICAgICAgaWYgKGR1cE91dHB1dERlc2MtPm1PdXRwdXQxID09IG91dHB1dERlc2MpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjMiA9IGR1cE91dHB1dERlc2MtPm1PdXRwdXQyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjMiA9IGR1cE91dHB1dERlc2MtPm1PdXRwdXQxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQXMgYWxsIGFjdGl2ZSB0cmFja3Mgb24gZHVwbGljYXRlZCBvdXRwdXQgd2lsbCBiZSBkZWxldGVkLAorICAgICAgICAgICAgLy8gYW5kIGFzIHRoZXkgd2VyZSBhbHNvIHJlZmVyZW5jZWQgb24gdGhlIG90aGVyIG91dHB1dCwgdGhlIHJlZmVyZW5jZQorICAgICAgICAgICAgLy8gY291bnQgZm9yIHRoZWlyIHN0cmVhbSB0eXBlIG11c3QgYmUgYWRqdXN0ZWQgYWNjb3JkaW5nbHkgb24KKyAgICAgICAgICAgIC8vIHRoZSBvdGhlciBvdXRwdXQuCisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IEFVRElPX1NUUkVBTV9DTlQ7IGorKykgeworICAgICAgICAgICAgICAgIGludCByZWZDb3VudCA9IGR1cE91dHB1dERlc2MtPm1SZWZDb3VudFtqXTsKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjMi0+Y2hhbmdlUmVmQ291bnQoKGF1ZGlvX3N0cmVhbV90eXBlX3QpaiwtcmVmQ291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHVwbGljYXRlZE91dHB1dCA9IG1PdXRwdXRzLmtleUF0KGkpOworICAgICAgICAgICAgQUxPR1YoImNsb3NlT3V0cHV0KCkgY2xvc2luZyBhbHNvIGR1cGxpY2F0ZWQgb3V0cHV0ICVkIiwgZHVwbGljYXRlZE91dHB1dCk7CisKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChkdXBsaWNhdGVkT3V0cHV0KTsKKyAgICAgICAgICAgIG1PdXRwdXRzLnJlbW92ZUl0ZW0oZHVwbGljYXRlZE91dHB1dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOworCisgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShvdXRwdXREZXNjLT5tUGF0Y2hIYW5kbGUpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlLCAwKTsKKyAgICAgICAgbUF1ZGlvUGF0Y2hlcy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICB9CisKKyAgICBBdWRpb1BhcmFtZXRlciBwYXJhbTsKKyAgICBwYXJhbS5hZGQoU3RyaW5nOCgiY2xvc2luZyIpLCBTdHJpbmc4KCJ0cnVlIikpOworICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG91dHB1dCwgcGFyYW0udG9TdHJpbmcoKSk7CisKKyAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQob3V0cHV0KTsKKyAgICBtT3V0cHV0cy5yZW1vdmVJdGVtKG91dHB1dCk7CisgICAgbVByZXZpb3VzT3V0cHV0cyA9IG1PdXRwdXRzOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xvc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKK3sKKyAgICBBTE9HVigiY2xvc2VJbnB1dCglZCkiLCBpbnB1dCk7CisKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUZvcihpbnB1dCk7CisgICAgaWYgKGlucHV0RGVzYyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJjbG9zZUlucHV0KCkgdW5rbm93biBpbnB1dCAlZCIsIGlucHV0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisKKyAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGlucHV0RGVzYy0+bVBhdGNoSGFuZGxlKTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSwgMCk7CisgICAgICAgIG1BdWRpb1BhdGNoZXMucmVtb3ZlSXRlbXNBdChpbmRleCk7CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgfQorCisgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlSW5wdXQoaW5wdXQpOworICAgIG1JbnB1dHMucmVtb3ZlSXRlbShpbnB1dCk7Cit9CisKK1NvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXRzRm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3QsIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gPiBvcGVuT3V0cHV0cykKK3sKKyAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHM7CisKKyAgICBBTE9HVlYoImdldE91dHB1dHNGb3JEZXZpY2UoKSBkZXZpY2UgJTA0eCIsIGRldmljZSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvcGVuT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBBTE9HVlYoIm91dHB1dCAlZCBpc0R1cGxpY2F0ZWQ9JWQgZGV2aWNlPSUwNHgiLAorICAgICAgICAgICAgICAgIGksIG9wZW5PdXRwdXRzLnZhbHVlQXQoaSktPmlzRHVwbGljYXRlZCgpLCBvcGVuT3V0cHV0cy52YWx1ZUF0KGkpLT5zdXBwb3J0ZWREZXZpY2VzKCkpOworICAgICAgICBpZiAoKGRldmljZSAmIG9wZW5PdXRwdXRzLnZhbHVlQXQoaSktPnN1cHBvcnRlZERldmljZXMoKSkgPT0gZGV2aWNlKSB7CisgICAgICAgICAgICBBTE9HVlYoImdldE91dHB1dHNGb3JEZXZpY2UoKSBmb3VuZCBvdXRwdXQgJWQiLCBvcGVuT3V0cHV0cy5rZXlBdChpKSk7CisgICAgICAgICAgICBvdXRwdXRzLmFkZChvcGVuT3V0cHV0cy5rZXlBdChpKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG91dHB1dHM7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp2ZWN0b3JzRXF1YWwoU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0czEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMyKQoreworICAgIGlmIChvdXRwdXRzMS5zaXplKCkgIT0gb3V0cHV0czIuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRzMS5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAob3V0cHV0czFbaV0gIT0gb3V0cHV0czJbaV0pIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3kocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkKK3sKKyAgICBhdWRpb19kZXZpY2VzX3Qgb2xkRGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIHRydWUgLypmcm9tQ2FjaGUqLyk7CisgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IHNyY091dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKG9sZERldmljZSwgbVByZXZpb3VzT3V0cHV0cyk7CisgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBkc3RPdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShuZXdEZXZpY2UsIG1PdXRwdXRzKTsKKworICAgIGlmICghdmVjdG9yc0VxdWFsKHNyY091dHB1dHMsZHN0T3V0cHV0cykpIHsKKyAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koKSBzdHJhdGVneSAlZCwgbW92aW5nIGZyb20gb3V0cHV0ICVkIHRvIG91dHB1dCAlZCIsCisgICAgICAgICAgICAgIHN0cmF0ZWd5LCBzcmNPdXRwdXRzWzBdLCBkc3RPdXRwdXRzWzBdKTsKKyAgICAgICAgLy8gbXV0ZSBzdHJhdGVneSB3aGlsZSBtb3ZpbmcgdHJhY2tzIGZyb20gb25lIG91dHB1dCB0byBhbm90aGVyCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3JjT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVGb3Ioc3JjT3V0cHV0c1tpXSk7CisgICAgICAgICAgICBpZiAoZGVzYy0+aXNTdHJhdGVneUFjdGl2ZShzdHJhdGVneSkpIHsKKyAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoc3RyYXRlZ3ksIHRydWUsIHNyY091dHB1dHNbaV0pOworICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShzdHJhdGVneSwgZmFsc2UsIHNyY091dHB1dHNbaV0sIE1VVEVfVElNRV9NUywgbmV3RGV2aWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIE1vdmUgZWZmZWN0cyBhc3NvY2lhdGVkIHRvIHRoaXMgc3RyYXRlZ3kgZnJvbSBwcmV2aW91cyBvdXRwdXQgdG8gbmV3IG91dHB1dAorICAgICAgICBpZiAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfTUVESUEpIHsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGZ4T3V0cHV0ID0gc2VsZWN0T3V0cHV0Rm9yRWZmZWN0cyhkc3RPdXRwdXRzKTsKKyAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gbW92ZWQ7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gZWZmZWN0RGVzYyA9IG1FZmZlY3RzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGVmZmVjdERlc2MtPm1TZXNzaW9uID09IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0RGVzYy0+bUlvICE9IGZ4T3V0cHV0KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtb3ZlZC5pbmRleE9mKGVmZmVjdERlc2MtPm1JbykgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRGb3JTdHJhdGVneSgpIG1vdmluZyBlZmZlY3QgJWQgdG8gb3V0cHV0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzLmtleUF0KGkpLCBmeE91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+bW92ZUVmZmVjdHMoQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYLCBlZmZlY3REZXNjLT5tSW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnhPdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgbW92ZWQuYWRkKGVmZmVjdERlc2MtPm1Jbyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWZmZWN0RGVzYy0+bUlvID0gZnhPdXRwdXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIE1vdmUgdHJhY2tzIGFzc29jaWF0ZWQgdG8gdGhpcyBzdHJhdGVneSBmcm9tIHByZXZpb3VzIG91dHB1dCB0byBuZXcgb3V0cHV0CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQVVESU9fU1RSRUFNX0NOVDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZ2V0U3RyYXRlZ3koKGF1ZGlvX3N0cmVhbV90eXBlX3QpaSkgPT0gc3RyYXRlZ3kpIHsKKyAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+aW52YWxpZGF0ZVN0cmVhbSgoYXVkaW9fc3RyZWFtX3R5cGVfdClpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpCit7CisgICAgaWYgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTV0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkKKyAgICAgICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFKTsKKyAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX1BIT05FKTsKKyAgICBpZiAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNXSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEKQorICAgICAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpOworICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OKTsKKyAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMKTsKKyAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX01FRElBKTsKKyAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX0RUTUYpOworfQorCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldEEyZHBPdXRwdXQoKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJiBvdXRwdXREZXNjLT5kZXZpY2UoKSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApIHsKKyAgICAgICAgICAgIHJldHVybiBtT3V0cHV0cy5rZXlBdChpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tBMmRwU3VzcGVuZCgpCit7CisgICAgYXVkaW9faW9faGFuZGxlX3QgYTJkcE91dHB1dCA9IGdldEEyZHBPdXRwdXQoKTsKKyAgICBpZiAoYTJkcE91dHB1dCA9PSAwKSB7CisgICAgICAgIG1BMmRwU3VzcGVuZGVkID0gZmFsc2U7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIGlzU2NvQ29ubmVjdGVkID0KKyAgICAgICAgICAgIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUKSAhPSAwOworICAgIC8vIHN1c3BlbmQgQTJEUCBvdXRwdXQgaWY6CisgICAgLy8gICAgICAoTk9UIGFscmVhZHkgc3VzcGVuZGVkKSAmJgorICAgIC8vICAgICAgKChTQ08gZGV2aWNlIGlzIGNvbm5lY3RlZCAmJgorICAgIC8vICAgICAgIChmb3JjZWQgdXNhZ2UgZm9yIGNvbW11bmljYXRpb24gfHwgZm9yIHJlY29yZCBpcyBTQ08pKSkgfHwKKyAgICAvLyAgICAgIChwaG9uZSBzdGF0ZSBpcyByaW5naW5nIHx8IGluIGNhbGwpCisgICAgLy8KKyAgICAvLyByZXN0b3JlIEEyRFAgb3V0cHV0IGlmOgorICAgIC8vICAgICAgKEFscmVhZHkgc3VzcGVuZGVkKSAmJgorICAgIC8vICAgICAgKChTQ08gZGV2aWNlIGlzIE5PVCBjb25uZWN0ZWQgfHwKKyAgICAvLyAgICAgICAoZm9yY2VkIHVzYWdlIE5PVCBmb3IgY29tbXVuaWNhdGlvbiAmJiBOT1QgZm9yIHJlY29yZCBpcyBTQ08pKSkgJiYKKyAgICAvLyAgICAgIChwaG9uZSBzdGF0ZSBpcyBOT1QgcmluZ2luZyAmJiBOT1QgaW4gY2FsbCkKKyAgICAvLworICAgIGlmIChtQTJkcFN1c3BlbmRlZCkgeworICAgICAgICBpZiAoKCFpc1Njb0Nvbm5lY3RlZCB8fAorICAgICAgICAgICAgICgobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTl0gIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykgJiYKKyAgICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRF0gIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykpKSAmJgorICAgICAgICAgICAgICgobVBob25lU3RhdGUgIT0gQVVESU9fTU9ERV9JTl9DQUxMKSAmJgorICAgICAgICAgICAgICAobVBob25lU3RhdGUgIT0gQVVESU9fTU9ERV9SSU5HVE9ORSkpKSB7CisKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5yZXN0b3JlT3V0cHV0KGEyZHBPdXRwdXQpOworICAgICAgICAgICAgbUEyZHBTdXNwZW5kZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgoaXNTY29Db25uZWN0ZWQgJiYKKyAgICAgICAgICAgICAoKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pIHx8CisgICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkRdID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pKSkgfHwKKyAgICAgICAgICAgICAoKG1QaG9uZVN0YXRlID09IEFVRElPX01PREVfSU5fQ0FMTCkgfHwKKyAgICAgICAgICAgICAgKG1QaG9uZVN0YXRlID09IEFVRElPX01PREVfUklOR1RPTkUpKSkgeworCisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c3VzcGVuZE91dHB1dChhMmRwT3V0cHV0KTsKKyAgICAgICAgICAgIG1BMmRwU3VzcGVuZGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKworYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TmV3T3V0cHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgYm9vbCBmcm9tQ2FjaGUpCit7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IEFVRElPX0RFVklDRV9OT05FOworCisgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKKworICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkob3V0cHV0RGVzYy0+bVBhdGNoSGFuZGxlKTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICBpZiAocGF0Y2hEZXNjLT5tVWlkICE9IG1VaWRDYWNoZWQpIHsKKyAgICAgICAgICAgIEFMT0dWKCJnZXROZXdPdXRwdXREZXZpY2UoKSBkZXZpY2UgJTA4eCBmb3JjZWQgYnkgcGF0Y2ggJWQiLAorICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+ZGV2aWNlKCksIG91dHB1dERlc2MtPm1QYXRjaEhhbmRsZSk7CisgICAgICAgICAgICByZXR1cm4gb3V0cHV0RGVzYy0+ZGV2aWNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBjaGVjayB0aGUgZm9sbG93aW5nIGJ5IG9yZGVyIG9mIHByaW9yaXR5IHRvIHJlcXVlc3QgYSByb3V0aW5nIGNoYW5nZSBpZiBuZWNlc3Nhcnk6CisgICAgLy8gMTogdGhlIHN0cmF0ZWd5IGVuZm9yY2VkIGF1ZGlibGUgaXMgYWN0aXZlIGFuZCBlbmZvcmNlZCBvbiB0aGUgb3V0cHV0OgorICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgZW5mb3JjZWQgYXVkaWJsZQorICAgIC8vIDI6IHdlIGFyZSBpbiBjYWxsIG9yIHRoZSBzdHJhdGVneSBwaG9uZSBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKKyAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IHBob25lCisgICAgLy8gMzogdGhlIHN0cmF0ZWd5IGZvciBlbmZvcmNlZCBhdWRpYmxlIGlzIGFjdGl2ZSBidXQgbm90IGVuZm9yY2VkIG9uIHRoZSBvdXRwdXQ6CisgICAgLy8gICAgICB1c2UgdGhlIGRldmljZSBmb3Igc3RyYXRlZ3kgZW5mb3JjZWQgYXVkaWJsZQorICAgIC8vIDQ6IHRoZSBzdHJhdGVneSBzb25pZmljYXRpb24gaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6CisgICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBzb25pZmljYXRpb24KKyAgICAvLyA1OiB0aGUgc3RyYXRlZ3kgInJlc3BlY3RmdWwiIHNvbmlmaWNhdGlvbiBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKKyAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5ICJyZXNwZWN0ZnVsIiBzb25pZmljYXRpb24KKyAgICAvLyA2OiB0aGUgc3RyYXRlZ3kgbWVkaWEgaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6CisgICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBtZWRpYQorICAgIC8vIDc6IHRoZSBzdHJhdGVneSBEVE1GIGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0OgorICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgRFRNRgorICAgIGlmIChvdXRwdXREZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpICYmCisgICAgICAgIG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTV0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkgeworICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFLCBmcm9tQ2FjaGUpOworICAgIH0gZWxzZSBpZiAoaXNJbkNhbGwoKSB8fAorICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKFNUUkFURUdZX1BIT05FKSkgeworICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9QSE9ORSwgZnJvbUNhY2hlKTsKKyAgICB9IGVsc2UgaWYgKG91dHB1dERlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSkpIHsKKyAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSwgZnJvbUNhY2hlKTsKKyAgICB9IGVsc2UgaWYgKG91dHB1dERlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSkgeworICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT04sIGZyb21DYWNoZSk7CisgICAgfSBlbHNlIGlmIChvdXRwdXREZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMKSkgeworICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCwgZnJvbUNhY2hlKTsKKyAgICB9IGVsc2UgaWYgKG91dHB1dERlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoU1RSQVRFR1lfTUVESUEpKSB7CisgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX01FRElBLCBmcm9tQ2FjaGUpOworICAgIH0gZWxzZSBpZiAob3V0cHV0RGVzYy0+aXNTdHJhdGVneUFjdGl2ZShTVFJBVEVHWV9EVE1GKSkgeworICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9EVE1GLCBmcm9tQ2FjaGUpOworICAgIH0KKworICAgIEFMT0dWKCJnZXROZXdPdXRwdXREZXZpY2UoKSBzZWxlY3RlZCBkZXZpY2UgJXgiLCBkZXZpY2UpOworICAgIHJldHVybiBkZXZpY2U7Cit9CisKK2F1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE5ld0lucHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQoreworICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlRm9yKGlucHV0KTsKKworICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaW5wdXREZXNjLT5tUGF0Y2hIYW5kbGUpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7CisgICAgICAgIGlmIChwYXRjaERlc2MtPm1VaWQgIT0gbVVpZENhY2hlZCkgeworICAgICAgICAgICAgQUxPR1YoImdldE5ld0lucHV0RGV2aWNlKCkgZGV2aWNlICUwOHggZm9yY2VkIGJ5IHBhdGNoICVkIiwKKyAgICAgICAgICAgICAgICAgIGlucHV0RGVzYy0+bURldmljZSwgaW5wdXREZXNjLT5tUGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgcmV0dXJuIGlucHV0RGVzYy0+bURldmljZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShpbnB1dERlc2MtPm1JbnB1dFNvdXJjZSk7CisKKyAgICBBTE9HVigiZ2V0TmV3SW5wdXREZXZpY2UoKSBzZWxlY3RlZCBkZXZpY2UgJXgiLCBkZXZpY2UpOworICAgIHJldHVybiBkZXZpY2U7Cit9CisKK3VpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIHsKKyAgICByZXR1cm4gKHVpbnQzMl90KWdldFN0cmF0ZWd5KHN0cmVhbSk7Cit9CisKK2F1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIHsKKyAgICAvLyBCeSBjaGVja2luZyB0aGUgcmFuZ2Ugb2Ygc3RyZWFtIGJlZm9yZSBjYWxsaW5nIGdldFN0cmF0ZWd5LCB3ZSBhdm9pZAorICAgIC8vIGdldFN0cmF0ZWd5J3MgYmVoYXZpb3IgZm9yIGludmFsaWQgc3RyZWFtcy4gIGdldFN0cmF0ZWd5IHdvdWxkIGRvIGEgQUxPR0UKKyAgICAvLyBhbmQgdGhlbiByZXR1cm4gU1RSQVRFR1lfTUVESUEsIGJ1dCB3ZSB3YW50IHRvIHJldHVybiB0aGUgZW1wdHkgc2V0LgorICAgIGlmIChzdHJlYW0gPCAoYXVkaW9fc3RyZWFtX3R5cGVfdCkgMCB8fCBzdHJlYW0gPj0gQVVESU9fU1RSRUFNX0NOVCkgeworICAgICAgICByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7CisgICAgfQorICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzOworICAgIEF1ZGlvUG9saWN5TWFuYWdlcjo6cm91dGluZ19zdHJhdGVneSBzdHJhdGVneSA9IGdldFN0cmF0ZWd5KHN0cmVhbSk7CisgICAgZGV2aWNlcyA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCB0cnVlIC8qZnJvbUNhY2hlKi8pOworICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2UoZGV2aWNlcywgbU91dHB1dHMpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXRzW2ldKTsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoc3RyYXRlZ3kpKSB7CisgICAgICAgICAgICBkZXZpY2VzID0gb3V0cHV0RGVzYy0+ZGV2aWNlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qRmlsdGVyIFNQRUFLRVJfU0FGRSBvdXQgb2YgcmVzdWx0cywgYXMgQXVkaW9TZXJ2aWNlIGRvZXNuJ3Qga25vdyBhYm91dCBpdAorICAgICAgYW5kIGRvZXNuJ3QgcmVhbGx5IG5lZWQgdG8uKi8KKyAgICBpZiAoZGV2aWNlcyAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFKSB7CisgICAgICAgIGRldmljZXMgfD0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOworICAgICAgICBkZXZpY2VzICY9IH5BVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRTsKKyAgICB9CisKKyAgICByZXR1cm4gZGV2aWNlczsKK30KKworQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyb3V0aW5nX3N0cmF0ZWd5IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U3RyYXRlZ3koCisgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSB7CisgICAgLy8gc3RyZWFtIHRvIHN0cmF0ZWd5IG1hcHBpbmcKKyAgICBzd2l0Y2ggKHN0cmVhbSkgeworICAgIGNhc2UgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEw6CisgICAgY2FzZSBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTzoKKyAgICAgICAgcmV0dXJuIFNUUkFURUdZX1BIT05FOworICAgIGNhc2UgQVVESU9fU1RSRUFNX1JJTkc6CisgICAgY2FzZSBBVURJT19TVFJFQU1fQUxBUk06CisgICAgICAgIHJldHVybiBTVFJBVEVHWV9TT05JRklDQVRJT047CisgICAgY2FzZSBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OOgorICAgICAgICByZXR1cm4gU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUw7CisgICAgY2FzZSBBVURJT19TVFJFQU1fRFRNRjoKKyAgICAgICAgcmV0dXJuIFNUUkFURUdZX0RUTUY7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR0UoInVua25vd24gc3RyZWFtIHR5cGUiKTsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9TWVNURU06CisgICAgICAgIC8vIE5PVEU6IFNZU1RFTSBzdHJlYW0gdXNlcyBNRURJQSBzdHJhdGVneSBiZWNhdXNlIG11dGluZyBtdXNpYyBhbmQgc3dpdGNoaW5nIG91dHB1dHMKKyAgICAgICAgLy8gd2hpbGUga2V5IGNsaWNrcyBhcmUgcGxheWVkIHByb2R1Y2VzIGEgcG9vciByZXN1bHQKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9UVFM6CisgICAgY2FzZSBBVURJT19TVFJFQU1fTVVTSUM6CisgICAgICAgIHJldHVybiBTVFJBVEVHWV9NRURJQTsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFOgorICAgICAgICByZXR1cm4gU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRTsKKyAgICB9Cit9CisKK3VpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U3RyYXRlZ3lGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cikgeworICAgIC8vIGZsYWdzIHRvIHN0cmF0ZWd5IG1hcHBpbmcKKyAgICBpZiAoKGF0dHItPmZsYWdzICYgQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSA9PSBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQpIHsKKyAgICAgICAgcmV0dXJuICh1aW50MzJfdCkgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRTsKKyAgICB9CisKKyAgICAvLyB1c2FnZSB0byBzdHJhdGVneSBtYXBwaW5nCisgICAgc3dpdGNoIChhdHRyLT51c2FnZSkgeworICAgIGNhc2UgQVVESU9fVVNBR0VfTUVESUE6CisgICAgY2FzZSBBVURJT19VU0FHRV9HQU1FOgorICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZOgorICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFOgorICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT046CisgICAgICAgIHJldHVybiAodWludDMyX3QpIFNUUkFURUdZX01FRElBOworCisgICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OOgorICAgICAgICByZXR1cm4gKHVpbnQzMl90KSBTVFJBVEVHWV9QSE9ORTsKKworICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HOgorICAgICAgICByZXR1cm4gKHVpbnQzMl90KSBTVFJBVEVHWV9EVE1GOworCisgICAgY2FzZSBBVURJT19VU0FHRV9BTEFSTToKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkU6CisgICAgICAgIHJldHVybiAodWludDMyX3QpIFNUUkFURUdZX1NPTklGSUNBVElPTjsKKworICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVDoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQ6CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVEOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UOgorICAgICAgICByZXR1cm4gKHVpbnQzMl90KSBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTDsKKworICAgIGNhc2UgQVVESU9fVVNBR0VfVU5LTk9XTjoKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gKHVpbnQzMl90KSBTVFJBVEVHWV9NRURJQTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpoYW5kbGVOb3RpZmljYXRpb25Sb3V0aW5nRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSB7CisgICAgc3dpdGNoKHN0cmVhbSkgeworICAgIGNhc2UgQVVESU9fU1RSRUFNX01VU0lDOgorICAgICAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMKTsKKyAgICAgICAgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCithdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlKQoreworICAgIHVpbnQzMl90IGRldmljZSA9IEFVRElPX0RFVklDRV9OT05FOworCisgICAgaWYgKGZyb21DYWNoZSkgeworICAgICAgICBBTE9HVlYoImdldERldmljZUZvclN0cmF0ZWd5KCkgZnJvbSBjYWNoZSBzdHJhdGVneSAlZCwgZGV2aWNlICV4IiwKKyAgICAgICAgICAgICAgc3RyYXRlZ3ksIG1EZXZpY2VGb3JTdHJhdGVneVtzdHJhdGVneV0pOworICAgICAgICByZXR1cm4gbURldmljZUZvclN0cmF0ZWd5W3N0cmF0ZWd5XTsKKyAgICB9CisgICAgYXVkaW9fZGV2aWNlc190IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKTsKKyAgICBzd2l0Y2ggKHN0cmF0ZWd5KSB7CisKKyAgICBjYXNlIFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMOgorICAgICAgICBpZiAoaXNJbkNhbGwoKSkgeworICAgICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgfSBlbHNlIGlmIChpc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KEFVRElPX1NUUkVBTV9NVVNJQywKKyAgICAgICAgICAgICAgICBTT05JRklDQVRJT05fUkVTUEVDVEZVTF9BRlRFUl9NVVNJQ19ERUxBWSkpIHsKKyAgICAgICAgICAgIC8vIHdoaWxlIG1lZGlhIGlzIHBsYXlpbmcgb24gYSByZW1vdGUgZGV2aWNlLCB1c2UgdGhlIHRoZSBzb25pZmljYXRpb24gYmVoYXZpb3IuCisgICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2UgdGVzdCB0aGlzIHVzZWNhc2UgYmVmb3JlIHRlc3RpbmcgaWYgbWVkaWEgaXMgcGxheWluZyBiZWNhdXNlCisgICAgICAgICAgICAvLyAgIHRoZSBpc1N0cmVhbUFjdGl2ZSgpIG1ldGhvZCBvbmx5IGluZm9ybXMgYWJvdXQgdGhlIGFjdGl2aXR5IG9mIGEgc3RyZWFtLCBub3QKKyAgICAgICAgICAgIC8vICAgaWYgaXQncyBmb3IgbG9jYWwgcGxheWJhY2suIE5vdGUgYWxzbyB0aGF0IHdlIHVzZSB0aGUgc2FtZSBkZWxheSBiZXR3ZWVuIGJvdGggdGVzdHMKKyAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTiwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgICAgICAvL3VzZXIgInNhZmUiIHNwZWFrZXIgaWYgYXZhaWxhYmxlIGluc3RlYWQgb2Ygbm9ybWFsIHNwZWFrZXIgdG8gYXZvaWQgdHJpZ2dlcmluZworICAgICAgICAgICAgLy9vdGhlciBhY291c3RpYyBzYWZldHkgbWVjaGFuaXNtcyBmb3Igbm90aWZpY2F0aW9uCisgICAgICAgICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUiAmJiAoYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRSkpCisgICAgICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkU7CisgICAgICAgIH0gZWxzZSBpZiAoaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX01VU0lDLCBTT05JRklDQVRJT05fUkVTUEVDVEZVTF9BRlRFUl9NVVNJQ19ERUxBWSkpIHsKKyAgICAgICAgICAgIC8vIHdoaWxlIG1lZGlhIGlzIHBsYXlpbmcgKG9yIGhhcyByZWNlbnRseSBwbGF5ZWQpLCB1c2UgdGhlIHNhbWUgZGV2aWNlCisgICAgICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyB3aGVuIG1lZGlhIGlzIG5vdCBwbGF5aW5nIGFueW1vcmUsIGZhbGwgYmFjayBvbiB0aGUgc29uaWZpY2F0aW9uIGJlaGF2aW9yCisgICAgICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT04sIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICAgICAgLy91c2VyICJzYWZlIiBzcGVha2VyIGlmIGF2YWlsYWJsZSBpbnN0ZWFkIG9mIG5vcm1hbCBzcGVha2VyIHRvIGF2b2lkIHRyaWdnZXJpbmcKKyAgICAgICAgICAgIC8vb3RoZXIgYWNvdXN0aWMgc2FmZXR5IG1lY2hhbmlzbXMgZm9yIG5vdGlmaWNhdGlvbgorICAgICAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIgJiYgKGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUpKQorICAgICAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNUUkFURUdZX0RUTUY6CisgICAgICAgIGlmICghaXNJbkNhbGwoKSkgeworICAgICAgICAgICAgLy8gd2hlbiBvZmYgY2FsbCwgRFRNRiBzdHJhdGVneSBmb2xsb3dzIHRoZSBzYW1lIHJ1bGVzIGFzIE1FRElBIHN0cmF0ZWd5CisgICAgICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvLyB3aGVuIGluIGNhbGwsIERUTUYgYW5kIFBIT05FIHN0cmF0ZWdpZXMgZm9sbG93IHRoZSBzYW1lIHJ1bGVzCisgICAgICAgIC8vIEZBTEwgVEhST1VHSAorCisgICAgY2FzZSBTVFJBVEVHWV9QSE9ORToKKyAgICAgICAgLy8gRm9yY2UgdXNlIG9mIG9ubHkgZGV2aWNlcyBvbiBwcmltYXJ5IG91dHB1dCBpZjoKKyAgICAgICAgLy8gLSBpbiBjYWxsIEFORAorICAgICAgICAvLyAgIC0gY2Fubm90IHJvdXRlIGZyb20gdm9pY2UgY2FsbCBSWCBPUgorICAgICAgICAvLyAgIC0gYXVkaW8gSEFMIHZlcnNpb24gaXMgPCAzLjAgYW5kIFRYIGRldmljZSBpcyBvbiB0aGUgcHJpbWFyeSBIVyBtb2R1bGUKKyAgICAgICAgaWYgKG1QaG9uZVN0YXRlID09IEFVRElPX01PREVfSU5fQ0FMTCkgeworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHR4RGV2aWNlID0gZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04pOworICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBod091dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihtUHJpbWFyeU91dHB1dCk7CisgICAgICAgICAgICBpZiAoKChtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkgJgorICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYICYgfkFVRElPX0RFVklDRV9CSVRfSU4pID09IDApIHx8CisgICAgICAgICAgICAgICAgICAgICgoKHR4RGV2aWNlICYgYXZhaWxhYmxlUHJpbWFyeUlucHV0RGV2aWNlcygpICYgfkFVRElPX0RFVklDRV9CSVRfSU4pICE9IDApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgKGh3T3V0cHV0RGVzYy0+Z2V0QXVkaW9Qb3J0KCktPm1Nb2R1bGUtPm1IYWxWZXJzaW9uIDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkpKSB7CisgICAgICAgICAgICAgICAgYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgPSBhdmFpbGFibGVQcmltYXJ5T3V0cHV0RGV2aWNlcygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGZvciBwaG9uZSBzdHJhdGVneSwgd2UgZmlyc3QgY29uc2lkZXIgdGhlIGZvcmNlZCB1c2UgYW5kIHRoZW4gdGhlIGF2YWlsYWJsZSBkZXZpY2VzIGJ5IG9yZGVyCisgICAgICAgIC8vIG9mIHByaW9yaXR5CisgICAgICAgIHN3aXRjaCAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTl0pIHsKKyAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPOgorICAgICAgICAgICAgaWYgKCFpc0luQ2FsbCgpIHx8IHN0cmF0ZWd5ICE9IFNUUkFURUdZX0RUTUYpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQ7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19IRUFEU0VUOworICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDTzsKKyAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgLy8gaWYgU0NPIGRldmljZSBpcyByZXF1ZXN0ZWQgYnV0IG5vIFNDTyBkZXZpY2UgaXMgYXZhaWxhYmxlLCBmYWxsIGJhY2sgdG8gZGVmYXVsdCBjYXNlCisgICAgICAgICAgICAvLyBGQUxMIFRIUk9VR0gKKworICAgICAgICBkZWZhdWx0OiAgICAvLyBGT1JDRV9OT05FCisgICAgICAgICAgICAvLyB3aGVuIG5vdCBpbiBhIHBob25lIGNhbGwsIHBob25lIHN0cmF0ZWd5IHNob3VsZCByb3V0ZSBTVFJFQU1fVk9JQ0VfQ0FMTCB0byBBMkRQCisgICAgICAgICAgICBpZiAoIWlzSW5DYWxsKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBXSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9fQlRfQTJEUCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKGdldEEyZHBPdXRwdXQoKSAhPSAwKSAmJiAhbUEyZHBTdXNwZW5kZWQpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFA7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVM7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FOworICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFNFVDsKKyAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1VTQl9ERVZJQ0U7CisgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgIGlmIChtUGhvbmVTdGF0ZSAhPSBBVURJT19NT0RFX0lOX0NBTEwpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfVVNCX0FDQ0VTU09SWTsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfREdUTF9ET0NLX0hFQURTRVQ7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0FVWF9ESUdJVEFMOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9BTkxHX0RPQ0tfSEVBRFNFVDsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRTsKKyAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgZGV2aWNlID0gbURlZmF1bHRPdXRwdXREZXZpY2UtPm1EZXZpY2VUeXBlOworICAgICAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJnZXREZXZpY2VGb3JTdHJhdGVneSgpIG5vIGRldmljZSBmb3VuZCBmb3IgU1RSQVRFR1lfUEhPTkUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX1NQRUFLRVI6CisgICAgICAgICAgICAvLyB3aGVuIG5vdCBpbiBhIHBob25lIGNhbGwsIHBob25lIHN0cmF0ZWd5IHNob3VsZCByb3V0ZSBTVFJFQU1fVk9JQ0VfQ0FMTCB0bworICAgICAgICAgICAgLy8gQTJEUCBzcGVha2VyIHdoZW4gZm9yY2luZyB0byBzcGVha2VyIG91dHB1dAorICAgICAgICAgICAgaWYgKCFpc0luQ2FsbCgpICYmCisgICAgICAgICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQV0gIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PX0JUX0EyRFApICYmCisgICAgICAgICAgICAgICAgICAgIChnZXRBMmRwT3V0cHV0KCkgIT0gMCkgJiYgIW1BMmRwU3VzcGVuZGVkKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVI7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVBob25lU3RhdGUgIT0gQVVESU9fTU9ERV9JTl9DQUxMKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1VTQl9BQ0NFU1NPUlk7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1VTQl9ERVZJQ0U7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0RHVExfRE9DS19IRUFEU0VUOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9BVVhfRElHSVRBTDsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQU5MR19ET0NLX0hFQURTRVQ7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfTElORTsKKyAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CisgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgIGRldmljZSA9IG1EZWZhdWx0T3V0cHV0RGV2aWNlLT5tRGV2aWNlVHlwZTsKKyAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBubyBkZXZpY2UgZm91bmQgZm9yIFNUUkFURUdZX1BIT05FLCBGT1JDRV9TUEVBS0VSIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGJyZWFrOworCisgICAgY2FzZSBTVFJBVEVHWV9TT05JRklDQVRJT046CisKKyAgICAgICAgLy8gSWYgaW5jYWxsLCBqdXN0IHNlbGVjdCB0aGUgU1RSQVRFR1lfUEhPTkUgZGV2aWNlOiBUaGUgcmVzdCBvZiB0aGUgYmVoYXZpb3IgaXMgaGFuZGxlZCBieQorICAgICAgICAvLyBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKS4KKyAgICAgICAgaWYgKGlzSW5DYWxsKCkpIHsKKyAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1BIT05FLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vIEZBTEwgVEhST1VHSAorCisgICAgY2FzZSBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFOgorICAgICAgICAvLyBzdHJhdGVneSBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFIHVzZXMgc2FtZSByb3V0aW5nIHBvbGljeSBhcyBTVFJBVEVHWV9TT05JRklDQVRJT04KKyAgICAgICAgLy8gZXhjZXB0OgorICAgICAgICAvLyAgIC0gd2hlbiBpbiBjYWxsIHdoZXJlIGl0IGRvZXNuJ3QgZGVmYXVsdCB0byBTVFJBVEVHWV9QSE9ORSBiZWhhdmlvcgorICAgICAgICAvLyAgIC0gaW4gY291bnRyaWVzIHdoZXJlIG5vdCBlbmZvcmNlZCBpbiB3aGljaCBjYXNlIGl0IGZvbGxvd3MgU1RSQVRFR1lfTUVESUEKKworICAgICAgICBpZiAoKHN0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTikgfHwKKyAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEKSkgeworICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CisgICAgICAgICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImdldERldmljZUZvclN0cmF0ZWd5KCkgc3BlYWtlciBkZXZpY2Ugbm90IGZvdW5kIGZvciBTVFJBVEVHWV9TT05JRklDQVRJT04iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBUaGUgc2Vjb25kIGRldmljZSB1c2VkIGZvciBzb25pZmljYXRpb24gaXMgdGhlIHNhbWUgYXMgdGhlIGRldmljZSB1c2VkIGJ5IG1lZGlhIHN0cmF0ZWd5CisgICAgICAgIC8vIEZBTEwgVEhST1VHSAorCisgICAgY2FzZSBTVFJBVEVHWV9NRURJQTogeworICAgICAgICB1aW50MzJfdCBkZXZpY2UyID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgICAgIGlmIChzdHJhdGVneSAhPSBTVFJBVEVHWV9TT05JRklDQVRJT04pIHsKKyAgICAgICAgICAgIC8vIG5vIHNvbmlmaWNhdGlvbiBvbiByZW1vdGUgc3VibWl4IChlLmcuIFdGRCkKKyAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpICYmCisgICAgICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBXSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9fQlRfQTJEUCkgJiYKKyAgICAgICAgICAgICAgICAoZ2V0QTJkcE91dHB1dCgpICE9IDApICYmICFtQTJkcFN1c3BlbmRlZCkgeworICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUDsKKyAgICAgICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FOworICAgICAgICB9CisgICAgICAgIGlmICgoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkpIHsKKyAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfTElORTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VUOworICAgICAgICB9CisgICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1VTQl9BQ0NFU1NPUlk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfVVNCX0RFVklDRTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9ER1RMX0RPQ0tfSEVBRFNFVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpICYmIChzdHJhdGVneSAhPSBTVFJBVEVHWV9TT05JRklDQVRJT04pKSB7CisgICAgICAgICAgICAvLyBubyBzb25pZmljYXRpb24gb24gYXV4IGRpZ2l0YWwgKGUuZy4gSERNSSkKKyAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQVVYX0RJR0lUQUw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSAmJgorICAgICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9ET0NLXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQU5BTE9HX0RPQ0spKSB7CisgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0FOTEdfRE9DS19IRUFEU0VUOworICAgICAgICB9CisgICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CisgICAgICAgIH0KKyAgICAgICAgaW50IGRldmljZTMgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICAgICAgaWYgKHN0cmF0ZWd5ID09IFNUUkFURUdZX01FRElBKSB7CisgICAgICAgICAgICAvLyBBUkMsIFNQRElGIGFuZCBBVVhfTElORSBjYW4gY28tZXhpc3Qgd2l0aCBvdGhlcnMuCisgICAgICAgICAgICBkZXZpY2UzID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0hETUlfQVJDOworICAgICAgICAgICAgZGV2aWNlMyB8PSAoYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1NQRElGKTsKKyAgICAgICAgICAgIGRldmljZTMgfD0gKGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9BVVhfTElORSk7CisgICAgICAgIH0KKworICAgICAgICBkZXZpY2UyIHw9IGRldmljZTM7CisgICAgICAgIC8vIGRldmljZSBpcyBERVZJQ0VfT1VUX1NQRUFLRVIgaWYgd2UgY29tZSBmcm9tIGNhc2UgU1RSQVRFR1lfU09OSUZJQ0FUSU9OIG9yCisgICAgICAgIC8vIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUsIEFVRElPX0RFVklDRV9OT05FIG90aGVyd2lzZQorICAgICAgICBkZXZpY2UgfD0gZGV2aWNlMjsKKworICAgICAgICAvLyBJZiBoZG1pIHN5c3RlbSBhdWRpbyBtb2RlIGlzIG9uLCByZW1vdmUgc3BlYWtlciBvdXQgb2Ygb3V0cHV0IGxpc3QuCisgICAgICAgIGlmICgoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfTUVESUEpICYmCisgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfSERNSV9TWVNURU1fQVVESU9dID09CisgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0ZPUkNFX0hETUlfU1lTVEVNX0FVRElPX0VORk9SQ0VEKSkgeworICAgICAgICAgICAgZGV2aWNlICY9IH5BVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgZGV2aWNlID0gbURlZmF1bHRPdXRwdXREZXZpY2UtPm1EZXZpY2VUeXBlOworICAgICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICBBTE9HRSgiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBubyBkZXZpY2UgZm91bmQgZm9yIFNUUkFURUdZX01FRElBIik7CisgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dXKCJnZXREZXZpY2VGb3JTdHJhdGVneSgpIHVua25vd24gc3RyYXRlZ3k6ICVkIiwgc3RyYXRlZ3kpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBBTE9HVlYoImdldERldmljZUZvclN0cmF0ZWd5KCkgc3RyYXRlZ3kgJWQsIGRldmljZSAleCIsIHN0cmF0ZWd5LCBkZXZpY2UpOworICAgIHJldHVybiBkZXZpY2U7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpCit7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fU1RSQVRFR0lFUzsgaSsrKSB7CisgICAgICAgIG1EZXZpY2VGb3JTdHJhdGVneVtpXSA9IGdldERldmljZUZvclN0cmF0ZWd5KChyb3V0aW5nX3N0cmF0ZWd5KWksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgIH0KKyAgICBtUHJldmlvdXNPdXRwdXRzID0gbU91dHB1dHM7Cit9CisKK3VpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcyhzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHByZXZEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVsYXlNcykKK3sKKyAgICAvLyBtdXRlL3VubXV0ZSBzdHJhdGVnaWVzIHVzaW5nIGFuIGluY29tcGF0aWJsZSBkZXZpY2UgY29tYmluYXRpb24KKyAgICAvLyBpZiBtdXRpbmcsIHdhaXQgZm9yIHRoZSBhdWRpbyBpbiBwY20gYnVmZmVyIHRvIGJlIGRyYWluZWQgYmVmb3JlIHByb2NlZWRpbmcKKyAgICAvLyBpZiB1bm11dGluZywgdW5tdXRlIG9ubHkgYWZ0ZXIgdGhlIHNwZWNpZmllZCBkZWxheQorICAgIGlmIChvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB1aW50MzJfdCBtdXRlV2FpdE1zID0gMDsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gb3V0cHV0RGVzYy0+ZGV2aWNlKCk7CisgICAgYm9vbCBzaG91bGRNdXRlID0gb3V0cHV0RGVzYy0+aXNBY3RpdmUoKSAmJiAocG9wY291bnQoZGV2aWNlKSA+PSAyKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTlVNX1NUUkFURUdJRVM7IGkrKykgeworICAgICAgICBhdWRpb19kZXZpY2VzX3QgY3VyRGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKHJvdXRpbmdfc3RyYXRlZ3kpaSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIGJvb2wgbXV0ZSA9IHNob3VsZE11dGUgJiYgKGN1ckRldmljZSAmIGRldmljZSkgJiYgKGN1ckRldmljZSAhPSBkZXZpY2UpOworICAgICAgICBib29sIGRvTXV0ZSA9IGZhbHNlOworCisgICAgICAgIGlmIChtdXRlICYmICFvdXRwdXREZXNjLT5tU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlW2ldKSB7CisgICAgICAgICAgICBkb011dGUgPSB0cnVlOworICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVN0cmF0ZWd5TXV0ZWRCeURldmljZVtpXSA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoIW11dGUgJiYgb3V0cHV0RGVzYy0+bVN0cmF0ZWd5TXV0ZWRCeURldmljZVtpXSl7CisgICAgICAgICAgICBkb011dGUgPSB0cnVlOworICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVN0cmF0ZWd5TXV0ZWRCeURldmljZVtpXSA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChkb011dGUpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbU91dHB1dHMuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGopOworICAgICAgICAgICAgICAgIC8vIHNraXAgb3V0cHV0IGlmIGl0IGRvZXMgbm90IHNoYXJlIGFueSBkZXZpY2Ugd2l0aCBjdXJyZW50IG91dHB1dAorICAgICAgICAgICAgICAgIGlmICgoZGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpICYgb3V0cHV0RGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpKQorICAgICAgICAgICAgICAgICAgICAgICAgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGN1ck91dHB1dCA9IG1PdXRwdXRzLmtleUF0KGopOworICAgICAgICAgICAgICAgIEFMT0dWVigiY2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcygpICVzIHN0cmF0ZWd5ICVkIChjdXJEZXZpY2UgJTA0eCkgb24gb3V0cHV0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBtdXRlID8gIm11dGluZyIgOiAidW5tdXRpbmciLCBpLCBjdXJEZXZpY2UsIGN1ck91dHB1dCk7CisgICAgICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKChyb3V0aW5nX3N0cmF0ZWd5KWksIG11dGUsIGN1ck91dHB1dCwgbXV0ZSA/IDAgOiBkZWxheU1zKTsKKyAgICAgICAgICAgICAgICBpZiAoZGVzYy0+aXNTdHJhdGVneUFjdGl2ZSgocm91dGluZ19zdHJhdGVneSlpKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobXV0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IHNob3VsZCBub3QgbmVlZCB0byBkb3VibGUgbGF0ZW5jeSBpZiB2b2x1bWUgY291bGQgYmUgYXBwbGllZAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1tZWRpYXRlbHkgYnkgdGhlIGF1ZGlvZmxpbmdlciBtaXhlci4gV2UgbXVzdCBhY2NvdW50IGZvciB0aGUgZGVsYXkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJldHdlZW4gbm93IGFuZCB0aGUgbmV4dCB0aW1lIHRoZSBhdWRpb2ZsaW5nZXIgdGhyZWFkIGZvciB0aGlzIG91dHB1dAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBwcm9jZXNzIGEgYnVmZmVyICh3aGljaCBjb3JyZXNwb25kcyB0byBvbmUgYnVmZmVyIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c3VhbGx5IDEvMiBvciAxLzQgb2YgdGhlIGxhdGVuY3kpLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG11dGVXYWl0TXMgPCBkZXNjLT5sYXRlbmN5KCkgKiAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZVdhaXRNcyA9IGRlc2MtPmxhdGVuY3koKSAqIDI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB0ZW1wb3JhcnkgbXV0ZSBvdXRwdXQgaWYgZGV2aWNlIHNlbGVjdGlvbiBjaGFuZ2VzIHRvIGF2b2lkIHZvbHVtZSBidXJzdHMgZHVlIHRvCisgICAgLy8gZGlmZmVyZW50IHBlciBkZXZpY2Ugdm9sdW1lcworICAgIGlmIChvdXRwdXREZXNjLT5pc0FjdGl2ZSgpICYmIChkZXZpY2UgIT0gcHJldkRldmljZSkpIHsKKyAgICAgICAgaWYgKG11dGVXYWl0TXMgPCBvdXRwdXREZXNjLT5sYXRlbmN5KCkgKiAyKSB7CisgICAgICAgICAgICBtdXRlV2FpdE1zID0gb3V0cHV0RGVzYy0+bGF0ZW5jeSgpICogMjsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE5VTV9TVFJBVEVHSUVTOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKChyb3V0aW5nX3N0cmF0ZWd5KWkpKSB7CisgICAgICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKChyb3V0aW5nX3N0cmF0ZWd5KWksIHRydWUsIG91dHB1dERlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICAgICAgLy8gZG8gdGVtcE11dGUgdW5tdXRlIGFmdGVyIHR3aWNlIHRoZSBtdXRlIHdhaXQgdGltZQorICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZSgocm91dGluZ19zdHJhdGVneSlpLCBmYWxzZSwgb3V0cHV0RGVzYy0+bUlvSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRlV2FpdE1zICoyLCBkZXZpY2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gd2FpdCBmb3IgdGhlIFBDTSBvdXRwdXQgYnVmZmVycyB0byBlbXB0eSBiZWZvcmUgcHJvY2VlZGluZyB3aXRoIHRoZSByZXN0IG9mIHRoZSBjb21tYW5kCisgICAgaWYgKG11dGVXYWl0TXMgPiBkZWxheU1zKSB7CisgICAgICAgIG11dGVXYWl0TXMgLT0gZGVsYXlNczsKKyAgICAgICAgdXNsZWVwKG11dGVXYWl0TXMgKiAxMDAwKTsKKyAgICAgICAgcmV0dXJuIG11dGVXYWl0TXM7CisgICAgfQorICAgIHJldHVybiAwOworfQorCit1aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldE91dHB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWRkcmVzcykKK3sKKyAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlKCkgb3V0cHV0ICVkIGRldmljZSAlMDR4IGRlbGF5TXMgJWQiLCBvdXRwdXQsIGRldmljZSwgZGVsYXlNcyk7CisgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKKyAgICBBdWRpb1BhcmFtZXRlciBwYXJhbTsKKyAgICB1aW50MzJfdCBtdXRlV2FpdE1zOworCisgICAgaWYgKG91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgIG11dGVXYWl0TXMgPSBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYy0+bU91dHB1dDEtPm1Jb0hhbmRsZSwgZGV2aWNlLCBmb3JjZSwgZGVsYXlNcyk7CisgICAgICAgIG11dGVXYWl0TXMgKz0gc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MtPm1PdXRwdXQyLT5tSW9IYW5kbGUsIGRldmljZSwgZm9yY2UsIGRlbGF5TXMpOworICAgICAgICByZXR1cm4gbXV0ZVdhaXRNczsKKyAgICB9CisgICAgLy8gbm8gbmVlZCB0byBwcm9jZWVkIGlmIG5ldyBkZXZpY2UgaXMgbm90IEFVRElPX0RFVklDRV9OT05FIGFuZCBub3Qgc3VwcG9ydGVkIGJ5IGN1cnJlbnQKKyAgICAvLyBvdXRwdXQgcHJvZmlsZQorICAgIGlmICgoZGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSAmJgorICAgICAgICAgICAgKChkZXZpY2UgJiBvdXRwdXREZXNjLT5tUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSkgPT0gMCkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gZmlsdGVyIGRldmljZXMgYWNjb3JkaW5nIHRvIG91dHB1dCBzZWxlY3RlZAorICAgIGRldmljZSA9IChhdWRpb19kZXZpY2VzX3QpKGRldmljZSAmIG91dHB1dERlc2MtPm1Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpKTsKKworICAgIGF1ZGlvX2RldmljZXNfdCBwcmV2RGV2aWNlID0gb3V0cHV0RGVzYy0+bURldmljZTsKKworICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2UoKSBwcmV2RGV2aWNlICUwNHgiLCBwcmV2RGV2aWNlKTsKKworICAgIGlmIChkZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgb3V0cHV0RGVzYy0+bURldmljZSA9IGRldmljZTsKKyAgICB9CisgICAgbXV0ZVdhaXRNcyA9IGNoZWNrRGV2aWNlTXV0ZVN0cmF0ZWdpZXMob3V0cHV0RGVzYywgcHJldkRldmljZSwgZGVsYXlNcyk7CisKKyAgICAvLyBEbyBub3QgY2hhbmdlIHRoZSByb3V0aW5nIGlmOgorICAgIC8vICAtIHRoZSByZXF1ZXN0ZWQgZGV2aWNlIGlzIEFVRElPX0RFVklDRV9OT05FCisgICAgLy8gIC0gdGhlIHJlcXVlc3RlZCBkZXZpY2UgaXMgdGhlIHNhbWUgYXMgY3VycmVudCBkZXZpY2UgYW5kIGZvcmNlIGlzIG5vdCBzcGVjaWZpZWQuCisgICAgLy8gRG9pbmcgdGhpcyBjaGVjayBoZXJlIGFsbG93cyB0aGUgY2FsbGVyIHRvIGNhbGwgc2V0T3V0cHV0RGV2aWNlKCkgd2l0aG91dCBjb25kaXRpb25zCisgICAgaWYgKChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUgfHwgZGV2aWNlID09IHByZXZEZXZpY2UpICYmICFmb3JjZSkgeworICAgICAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlKCkgc2V0dGluZyBzYW1lIGRldmljZSAlMDR4IG9yIG51bGwgZGV2aWNlIGZvciBvdXRwdXQgJWQiLCBkZXZpY2UsIG91dHB1dCk7CisgICAgICAgIHJldHVybiBtdXRlV2FpdE1zOworICAgIH0KKworICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2UoKSBjaGFuZ2luZyBkZXZpY2UiKTsKKworICAgIC8vIGRvIHRoZSByb3V0aW5nCisgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICByZXNldE91dHB1dERldmljZShvdXRwdXQsIGRlbGF5TXMsIE5VTEwpOworICAgIH0gZWxzZSB7CisgICAgICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0ID0gKGFkZHJlc3MgPT0gTlVMTCkgPworICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpCisgICAgICAgICAgICAgICAgOiBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVBZGRyKGRldmljZSwgU3RyaW5nOChhZGRyZXNzKSk7CisgICAgICAgIGlmICghZGV2aWNlTGlzdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDsKKyAgICAgICAgICAgIG91dHB1dERlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zb3VyY2VzWzBdKTsKKyAgICAgICAgICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMTsKKyAgICAgICAgICAgIHBhdGNoLm51bV9zaW5rcyA9IDA7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRldmljZUxpc3Quc2l6ZSgpICYmIGkgPCBBVURJT19QQVRDSF9QT1JUU19NQVg7IGkrKykgeworICAgICAgICAgICAgICAgIGRldmljZUxpc3QuaXRlbUF0KGkpLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc2lua3NbaV0pOworICAgICAgICAgICAgICAgIHBhdGNoLm51bV9zaW5rcysrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3NpemVfdCBpbmRleDsKKyAgICAgICAgICAgIGlmIChwYXRjaEhhbmRsZSAmJiAqcGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleSgqcGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShvdXRwdXREZXNjLT5tUGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8IEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYzsKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgICAgICAgICBhZlBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZlBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5TXMpOworICAgICAgICAgICAgQUxPR1YoInNldE91dHB1dERldmljZSgpIGNyZWF0ZUF1ZGlvUGF0Y2ggcmV0dXJuZWQgJWQgcGF0Y2hIYW5kbGUgJWQiCisgICAgICAgICAgICAgICAgICAgICJudW1fc291cmNlcyAlZCBudW1fc2lua3MgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCBhZlBhdGNoSGFuZGxlLCBwYXRjaC5udW1fc291cmNlcywgcGF0Y2gubnVtX3NpbmtzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHBhdGNoRGVzYyA9IG5ldyBBdWRpb1BhdGNoKChhdWRpb19wYXRjaF9oYW5kbGVfdCluZXh0VW5pcXVlSWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGNoLCBtVWlkQ2FjaGVkKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUsIHBhdGNoRGVzYyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tUGF0Y2ggPSBwYXRjaDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7CisgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tVWlkID0gbVVpZENhY2hlZDsKKyAgICAgICAgICAgICAgICBpZiAocGF0Y2hIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgKnBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tSGFuZGxlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tUGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1IYW5kbGU7CisgICAgICAgICAgICAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKKyAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gaW5mb3JtIGFsbCBpbnB1dCBhcyB3ZWxsCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+ICBpbnB1dERlc2NyaXB0b3IgPSBtSW5wdXRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBpZiAoIWlzVmlydHVhbElucHV0RGV2aWNlKGlucHV0RGVzY3JpcHRvci0+bURldmljZSkpIHsKKyAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBpbnB1dENtZCA9IEF1ZGlvUGFyYW1ldGVyKCk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBpbmZvcm0gaW5wdXQgJWQgb2YgZGV2aWNlOiVkIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICAgICAgaW5wdXREZXNjcmlwdG9yLT5tSW9IYW5kbGUsIGRldmljZSk7CisgICAgICAgICAgICAgICAgaW5wdXRDbWQuYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLGRldmljZSk7CisgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoaW5wdXREZXNjcmlwdG9yLT5tSW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRDbWQudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheU1zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHVwZGF0ZSBzdHJlYW0gdm9sdW1lcyBhY2NvcmRpbmcgdG8gbmV3IGRldmljZQorICAgIGFwcGx5U3RyZWFtVm9sdW1lcyhvdXRwdXQsIGRldmljZSwgZGVsYXlNcyk7CisKKyAgICByZXR1cm4gbXV0ZVdhaXRNczsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZXNldE91dHB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUpCit7CisgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKKyAgICBzc2l6ZV90IGluZGV4OworICAgIGlmIChwYXRjaEhhbmRsZSkgeworICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleSgqcGF0Y2hIYW5kbGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KG91dHB1dERlc2MtPm1QYXRjaEhhbmRsZSk7CisgICAgfQorICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBzcDwgQXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSwgZGVsYXlNcyk7CisgICAgQUxPR1YoInJlc2V0T3V0cHV0RGV2aWNlKCkgcmVsZWFzZUF1ZGlvUGF0Y2ggcmV0dXJuZWQgJWQiLCBzdGF0dXMpOworICAgIG91dHB1dERlc2MtPm1QYXRjaEhhbmRsZSA9IDA7CisgICAgcmVtb3ZlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUpOworICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldElucHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUZvcihpbnB1dCk7CisgICAgaWYgKChkZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpICYmICgoZGV2aWNlICE9IGlucHV0RGVzYy0+bURldmljZSkgfHwgZm9yY2UpKSB7CisgICAgICAgIGlucHV0RGVzYy0+bURldmljZSA9IGRldmljZTsKKworICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdCA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSk7CisgICAgICAgIGlmICghZGV2aWNlTGlzdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDsKKyAgICAgICAgICAgIGlucHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNpbmtzWzBdKTsKKyAgICAgICAgICAgIC8vIEFVRElPX1NPVVJDRV9IT1RXT1JEIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seToKKyAgICAgICAgICAgIC8vIGhhbmRsZWQgYXMgQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OIGJ5IHRoZSBhdWRpbyBIQUwKKyAgICAgICAgICAgIGlmIChwYXRjaC5zaW5rc1swXS5leHQubWl4LnVzZWNhc2Uuc291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEICYmCisgICAgICAgICAgICAgICAgICAgICFpbnB1dERlc2MtPm1Jc1NvdW5kVHJpZ2dlcikgeworICAgICAgICAgICAgICAgIHBhdGNoLnNpbmtzWzBdLmV4dC5taXgudXNlY2FzZS5zb3VyY2UgPSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXRjaC5udW1fc2lua3MgPSAxOworICAgICAgICAgICAgLy9vbmx5IG9uZSBpbnB1dCBkZXZpY2UgZm9yIG5vdworICAgICAgICAgICAgZGV2aWNlTGlzdC5pdGVtQXQoMCktPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zb3VyY2VzWzBdKTsKKyAgICAgICAgICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMTsKKyAgICAgICAgICAgIHNzaXplX3QgaW5kZXg7CisgICAgICAgICAgICBpZiAocGF0Y2hIYW5kbGUgJiYgKnBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoKnBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaW5wdXREZXNjLT5tUGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8IEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYzsKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgICAgICAgICBhZlBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmUGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAgIEFMT0dWKCJzZXRJbnB1dERldmljZSgpIGNyZWF0ZUF1ZGlvUGF0Y2ggcmV0dXJuZWQgJWQgcGF0Y2hIYW5kbGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIGFmUGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbmV3IEF1ZGlvUGF0Y2goKGF1ZGlvX3BhdGNoX2hhbmRsZV90KW5leHRVbmlxdWVJZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0Y2gsIG1VaWRDYWNoZWQpOworICAgICAgICAgICAgICAgICAgICBhZGRBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUhhbmRsZSwgcGF0Y2hEZXNjKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1QYXRjaCA9IHBhdGNoOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKKyAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1VaWQgPSBtVWlkQ2FjaGVkOworICAgICAgICAgICAgICAgIGlmIChwYXRjaEhhbmRsZSkgeworICAgICAgICAgICAgICAgICAgICAqcGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1IYW5kbGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlucHV0RGVzYy0+bVBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tSGFuZGxlOworICAgICAgICAgICAgICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlc2V0SW5wdXREZXZpY2UoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlKQoreworICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlRm9yKGlucHV0KTsKKyAgICBzc2l6ZV90IGluZGV4OworICAgIGlmIChwYXRjaEhhbmRsZSkgeworICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleSgqcGF0Y2hIYW5kbGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGlucHV0RGVzYy0+bVBhdGNoSGFuZGxlKTsKKyAgICB9CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIHNwPCBBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlLCAwKTsKKyAgICBBTE9HVigicmVzZXRJbnB1dERldmljZSgpIHJlbGVhc2VBdWRpb1BhdGNoIHJldHVybmVkICVkIiwgc3RhdHVzKTsKKyAgICBpbnB1dERlc2MtPm1QYXRjaEhhbmRsZSA9IDA7CisgICAgcmVtb3ZlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUpOworICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzcDxBdWRpb1BvbGljeU1hbmFnZXI6OklPUHJvZmlsZT4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRJbnB1dFByb2ZpbGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpCit7CisgICAgLy8gQ2hvb3NlIGFuIGlucHV0IHByb2ZpbGUgYmFzZWQgb24gdGhlIHJlcXVlc3RlZCBjYXB0dXJlIHBhcmFtZXRlcnM6IHNlbGVjdCB0aGUgZmlyc3QgYXZhaWxhYmxlCisgICAgLy8gcHJvZmlsZSBzdXBwb3J0aW5nIGFsbCByZXF1ZXN0ZWQgcGFyYW1ldGVycy4KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChtSHdNb2R1bGVzW2ldLT5tSGFuZGxlID09IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbUh3TW9kdWxlc1tpXS0+bUlucHV0UHJvZmlsZXMuc2l6ZSgpOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IG1Id01vZHVsZXNbaV0tPm1JbnB1dFByb2ZpbGVzW2pdOworICAgICAgICAgICAgLy8gcHJvZmlsZS0+bG9nKCk7CisgICAgICAgICAgICBpZiAocHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShkZXZpY2UsIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGluZ1JhdGUgLyp1cGRhdGVkU2FtcGxpbmdSYXRlKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGNoYW5uZWxNYXNrLCAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpIGZsYWdzKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBwcm9maWxlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCithdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSkKK3sKKyAgICB1aW50MzJfdCBkZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxhYmxlRGV2aWNlVHlwZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+QVVESU9fREVWSUNFX0JJVF9JTjsKKyAgICBzd2l0Y2ggKGlucHV0U291cmNlKSB7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LOgorICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1ZPSUNFX0NBTEwpIHsKKyAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fVk9JQ0VfQ0FMTDsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBBVURJT19TT1VSQ0VfREVGQVVMVDoKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9NSUM6CisgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQKSB7CisgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUDsKKyAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQpIHsKKyAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQ7CisgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFKSB7CisgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFOworICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpIHsKKyAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDOworICAgIH0KKyAgICBicmVhazsKKworICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT046CisgICAgICAgIC8vIEFsbG93IG9ubHkgdXNlIG9mIGRldmljZXMgb24gcHJpbWFyeSBpbnB1dCBpZiBpbiBjYWxsIGFuZCBIQUwgZG9lcyBub3Qgc3VwcG9ydCByb3V0aW5nCisgICAgICAgIC8vIHRvIHZvaWNlIGNhbGwgcGF0aC4KKyAgICAgICAgaWYgKChtUGhvbmVTdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEwpICYmCisgICAgICAgICAgICAgICAgKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCkgJiBBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWCkgPT0gMCkgeworICAgICAgICAgICAgYXZhaWxhYmxlRGV2aWNlVHlwZXMgPSBhdmFpbGFibGVQcmltYXJ5SW5wdXREZXZpY2VzKCkgJiB+QVVESU9fREVWSUNFX0JJVF9JTjsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTl0pIHsKKyAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPOgorICAgICAgICAgICAgLy8gaWYgU0NPIGRldmljZSBpcyByZXF1ZXN0ZWQgYnV0IG5vIFNDTyBkZXZpY2UgaXMgYXZhaWxhYmxlLCBmYWxsIGJhY2sgdG8gZGVmYXVsdCBjYXNlCisgICAgICAgICAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEZBTEwgVEhST1VHSAorCisgICAgICAgIGRlZmF1bHQ6ICAgIC8vIEZPUkNFX05PTkUKKyAgICAgICAgICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0UpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9TUEVBS0VSOgorICAgICAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JBQ0tfTUlDKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JBQ0tfTUlDOworICAgICAgICAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQykgeworICAgICAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT046CisgICAgY2FzZSBBVURJT19TT1VSQ0VfSE9UV09SRDoKKyAgICAgICAgaWYgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRF0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTyAmJgorICAgICAgICAgICAgICAgIGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCkgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVDsKKyAgICAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVDsKKyAgICAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRTsKKyAgICAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQykgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fU09VUkNFX0NBTUNPUkRFUjoKKyAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JBQ0tfTUlDKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQkFDS19NSUM7CisgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9ET1dOTElOSzoKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9DQUxMOgorICAgICAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fVk9JQ0VfQ0FMTCkgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1ZPSUNFX0NBTEw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWDoKKyAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgpIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dXKCJnZXREZXZpY2VGb3JJbnB1dFNvdXJjZSgpIGludmFsaWQgaW5wdXQgc291cmNlICVkIiwgaW5wdXRTb3VyY2UpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgQUxPR1YoImdldERldmljZUZvcklucHV0U291cmNlKClpbnB1dCBzb3VyY2UgJWQsIGRldmljZSAlMDh4IiwgaW5wdXRTb3VyY2UsIGRldmljZSk7CisgICAgcmV0dXJuIGRldmljZTsKK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzVmlydHVhbElucHV0RGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgaWYgKChkZXZpY2UgJiBBVURJT19ERVZJQ0VfQklUX0lOKSAhPSAwKSB7CisgICAgICAgIGRldmljZSAmPSB+QVVESU9fREVWSUNFX0JJVF9JTjsKKyAgICAgICAgaWYgKChwb3Bjb3VudChkZXZpY2UpID09IDEpICYmICgoZGV2aWNlICYgfkFQTV9BVURJT19JTl9ERVZJQ0VfVklSVFVBTF9BTEwpID09IDApKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmRldmljZURpc3Rpbmd1aXNoZXNPbkFkZHJlc3MoYXVkaW9fZGV2aWNlc190IGRldmljZSkgeworICAgIHJldHVybiAoKGRldmljZSAmIEFQTV9BVURJT19ERVZJQ0VfTUFUQ0hfQUREUkVTU19BTEwpICE9IDApOworfQorCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldEFjdGl2ZUlucHV0KGJvb2wgaWdub3JlVmlydHVhbElucHV0cykKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+ICBpbnB1dF9kZXNjcmlwdG9yID0gbUlucHV0cy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoKGlucHV0X2Rlc2NyaXB0b3ItPm1SZWZDb3VudCA+IDApCisgICAgICAgICAgICAgICAgJiYgKCFpZ25vcmVWaXJ0dWFsSW5wdXRzIHx8ICFpc1ZpcnR1YWxJbnB1dERldmljZShpbnB1dF9kZXNjcmlwdG9yLT5tRGV2aWNlKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBtSW5wdXRzLmtleUF0KGkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCit1aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmFjdGl2ZUlucHV0c0NvdW50KCkgY29uc3QKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiAgZGVzYyA9IG1JbnB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKGRlc2MtPm1SZWZDb3VudCA+IDApIHsKKyAgICAgICAgICAgIHJldHVybiBjb3VudCsrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjb3VudDsKK30KKworCithdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VGb3JWb2x1bWUoYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgIC8vIHRoaXMgaGFwcGVucyB3aGVuIGZvcmNpbmcgYSByb3V0ZSB1cGRhdGUgYW5kIG5vIHRyYWNrIGlzIGFjdGl2ZSBvbiBhbiBvdXRwdXQuCisgICAgICAgIC8vIEluIHRoaXMgY2FzZSB0aGUgcmV0dXJuZWQgY2F0ZWdvcnkgaXMgbm90IGltcG9ydGFudC4KKyAgICAgICAgZGV2aWNlID0gIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKKyAgICB9IGVsc2UgaWYgKHBvcGNvdW50KGRldmljZSkgPiAxKSB7CisgICAgICAgIC8vIE11bHRpcGxlIGRldmljZSBzZWxlY3Rpb24gaXMgZWl0aGVyOgorICAgICAgICAvLyAgLSBzcGVha2VyICsgb25lIG90aGVyIGRldmljZTogZ2l2ZSBwcmlvcml0eSB0byBzcGVha2VyIGluIHRoaXMgY2FzZS4KKyAgICAgICAgLy8gIC0gb25lIEEyRFAgZGV2aWNlICsgYW5vdGhlciBkZXZpY2U6IGhhcHBlbnMgd2l0aCBkdXBsaWNhdGVkIG91dHB1dC4gSW4gdGhpcyBjYXNlCisgICAgICAgIC8vIHJldGFpbiB0aGUgZGV2aWNlIG9uIHRoZSBBMkRQIG91dHB1dCBhcyB0aGUgb3RoZXIgbXVzdCBub3QgY29ycmVzcG9uZCB0byBhbiBhY3RpdmUKKyAgICAgICAgLy8gc2VsZWN0aW9uIGlmIG5vdCB0aGUgc3BlYWtlci4KKyAgICAgICAgLy8gIC0gSERNSS1DRUMgc3lzdGVtIGF1ZGlvIG1vZGUgb25seSBvdXRwdXQ6IGdpdmUgcHJpb3JpdHkgdG8gYXZhaWxhYmxlIGl0ZW0gaW4gb3JkZXIuCisgICAgICAgIGlmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKKyAgICAgICAgfSBlbHNlIGlmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0hETUlfQVJDKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX0hETUlfQVJDOworICAgICAgICB9IGVsc2UgaWYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQVVYX0xJTkUpIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9PVVRfQVVYX0xJTkU7CisgICAgICAgIH0gZWxzZSBpZiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9TUERJRikgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9TUERJRjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRldmljZSA9IChhdWRpb19kZXZpY2VzX3QpKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApOworICAgICAgICB9CisgICAgfQorCisgICAgLypTUEVBS0VSX1NBRkUgaXMgYW4gYWxpYXMgb2YgU1BFQUtFUiBmb3IgcHVycG9zZXMgb2Ygdm9sdW1lIGNvbnRyb2wqLworICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUpCisgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKKworICAgIEFMT0dXX0lGKHBvcGNvdW50KGRldmljZSkgIT0gMSwKKyAgICAgICAgICAgICJnZXREZXZpY2VGb3JWb2x1bWUoKSBpbnZhbGlkIGRldmljZSBjb21iaW5hdGlvbjogJTA4eCIsCisgICAgICAgICAgICBkZXZpY2UpOworCisgICAgcmV0dXJuIGRldmljZTsKK30KKworQXVkaW9Qb2xpY3lNYW5hZ2VyOjpkZXZpY2VfY2F0ZWdvcnkgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VDYXRlZ29yeShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIHN3aXRjaChnZXREZXZpY2VGb3JWb2x1bWUoZGV2aWNlKSkgeworICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfRUFSUElFQ0U6CisgICAgICAgICAgICByZXR1cm4gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFOworICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFNFVDoKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORToKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ086CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0hFQURTRVQ6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUDoKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVM6CisgICAgICAgICAgICByZXR1cm4gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQ7CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9MSU5FOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQVVYX0RJR0lUQUw6CisgICAgICAgIC8qVVNCPyAgUmVtb3RlIHN1Ym1peD8qLworICAgICAgICAgICAgcmV0dXJuIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUE7CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQ6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfVVNCX0FDQ0VTU09SWToKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1VTQl9ERVZJQ0U6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIERFVklDRV9DQVRFR09SWV9TUEVBS0VSOworICAgIH0KK30KKworZmxvYXQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp2b2xJbmRleFRvQW1wbChhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBjb25zdCBTdHJlYW1EZXNjcmlwdG9yJiBzdHJlYW1EZXNjLAorICAgICAgICBpbnQgaW5kZXhJblVpKQoreworICAgIGRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSA9IGdldERldmljZUNhdGVnb3J5KGRldmljZSk7CisgICAgY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqY3VydmUgPSBzdHJlYW1EZXNjLm1Wb2x1bWVDdXJ2ZVtkZXZpY2VDYXRlZ29yeV07CisKKyAgICAvLyB0aGUgdm9sdW1lIGluZGV4IGluIHRoZSBVSSBpcyByZWxhdGl2ZSB0byB0aGUgbWluIGFuZCBtYXggdm9sdW1lIGluZGljZXMgZm9yIHRoaXMgc3RyZWFtIHR5cGUKKyAgICBpbnQgbmJTdGVwcyA9IDEgKyBjdXJ2ZVtWT0xNQVhdLm1JbmRleCAtCisgICAgICAgICAgICBjdXJ2ZVtWT0xNSU5dLm1JbmRleDsKKyAgICBpbnQgdm9sSWR4ID0gKG5iU3RlcHMgKiAoaW5kZXhJblVpIC0gc3RyZWFtRGVzYy5tSW5kZXhNaW4pKSAvCisgICAgICAgICAgICAoc3RyZWFtRGVzYy5tSW5kZXhNYXggLSBzdHJlYW1EZXNjLm1JbmRleE1pbik7CisKKyAgICAvLyBmaW5kIHdoYXQgcGFydCBvZiB0aGUgY3VydmUgdGhpcyBpbmRleCB2b2x1bWUgYmVsb25ncyB0bywgb3IgaWYgaXQncyBvdXQgb2YgYm91bmRzCisgICAgaW50IHNlZ21lbnQgPSAwOworICAgIGlmICh2b2xJZHggPCBjdXJ2ZVtWT0xNSU5dLm1JbmRleCkgeyAgICAgICAgIC8vIG91dCBvZiBib3VuZHMKKyAgICAgICAgcmV0dXJuIDAuMGY7CisgICAgfSBlbHNlIGlmICh2b2xJZHggPCBjdXJ2ZVtWT0xLTkVFMV0ubUluZGV4KSB7CisgICAgICAgIHNlZ21lbnQgPSAwOworICAgIH0gZWxzZSBpZiAodm9sSWR4IDwgY3VydmVbVk9MS05FRTJdLm1JbmRleCkgeworICAgICAgICBzZWdtZW50ID0gMTsKKyAgICB9IGVsc2UgaWYgKHZvbElkeCA8PSBjdXJ2ZVtWT0xNQVhdLm1JbmRleCkgeworICAgICAgICBzZWdtZW50ID0gMjsKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG91dCBvZiBib3VuZHMKKyAgICAgICAgcmV0dXJuIDEuMGY7CisgICAgfQorCisgICAgLy8gbGluZWFyIGludGVycG9sYXRpb24gaW4gdGhlIGF0dGVudWF0aW9uIHRhYmxlIGluIGRCCisgICAgZmxvYXQgZGVjaWJlbHMgPSBjdXJ2ZVtzZWdtZW50XS5tREJBdHRlbnVhdGlvbiArCisgICAgICAgICAgICAoKGZsb2F0KSh2b2xJZHggLSBjdXJ2ZVtzZWdtZW50XS5tSW5kZXgpKSAqCisgICAgICAgICAgICAgICAgKCAoY3VydmVbc2VnbWVudCsxXS5tREJBdHRlbnVhdGlvbiAtCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJ2ZVtzZWdtZW50XS5tREJBdHRlbnVhdGlvbikgLworICAgICAgICAgICAgICAgICAgICAoKGZsb2F0KShjdXJ2ZVtzZWdtZW50KzFdLm1JbmRleCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VydmVbc2VnbWVudF0ubUluZGV4KSkgKTsKKworICAgIGZsb2F0IGFtcGxpZmljYXRpb24gPSBleHAoIGRlY2liZWxzICogMC4xMTUxMjlmKTsgLy8gZXhwKCBkQiAqIGxuKDEwKSAvIDIwICkKKworICAgIEFMT0dWVigiVk9MVU1FIHZvbCBpbmRleD1bJWQgJWQgJWRdLCBkQj1bJS4xZiAlLjFmICUuMWZdIGFtcGw9JS41ZiIsCisgICAgICAgICAgICBjdXJ2ZVtzZWdtZW50XS5tSW5kZXgsIHZvbElkeCwKKyAgICAgICAgICAgIGN1cnZlW3NlZ21lbnQrMV0ubUluZGV4LAorICAgICAgICAgICAgY3VydmVbc2VnbWVudF0ubURCQXR0ZW51YXRpb24sCisgICAgICAgICAgICBkZWNpYmVscywKKyAgICAgICAgICAgIGN1cnZlW3NlZ21lbnQrMV0ubURCQXR0ZW51YXRpb24sCisgICAgICAgICAgICBhbXBsaWZpY2F0aW9uKTsKKworICAgIHJldHVybiBhbXBsaWZpY2F0aW9uOworfQorCitjb25zdCBBdWRpb1BvbGljeU1hbmFnZXI6OlZvbHVtZUN1cnZlUG9pbnQKKyAgICBBdWRpb1BvbGljeU1hbmFnZXI6OnNEZWZhdWx0Vm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdID0geworICAgIHsxLCAtNDkuNWZ9LCB7MzMsIC0zMy41Zn0sIHs2NiwgLTE3LjBmfSwgezEwMCwgMC4wZn0KK307CisKK2NvbnN0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Vm9sdW1lQ3VydmVQb2ludAorICAgIEF1ZGlvUG9saWN5TWFuYWdlcjo6c0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXSA9IHsKKyAgICB7MSwgLTU4LjBmfSwgezIwLCAtNDAuMGZ9LCB7NjAsIC0xNy4wZn0sIHsxMDAsIDAuMGZ9Cit9OworCitjb25zdCBBdWRpb1BvbGljeU1hbmFnZXI6OlZvbHVtZUN1cnZlUG9pbnQKKyAgICBBdWRpb1BvbGljeU1hbmFnZXI6OnNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXSA9IHsKKyAgICB7MSwgLTU4LjBmfSwgezIwLCAtNDAuMGZ9LCB7NjAsIC0yMS4wZn0sIHsxMDAsIC0xMC4wZn0KK307CisKK2NvbnN0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Vm9sdW1lQ3VydmVQb2ludAorICAgIEF1ZGlvUG9saWN5TWFuYWdlcjo6c1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXSA9IHsKKyAgICB7MSwgLTU2LjBmfSwgezIwLCAtMzQuMGZ9LCB7NjAsIC0xMS4wZn0sIHsxMDAsIDAuMGZ9Cit9OworCitjb25zdCBBdWRpb1BvbGljeU1hbmFnZXI6OlZvbHVtZUN1cnZlUG9pbnQKKyAgICBBdWRpb1BvbGljeU1hbmFnZXI6OnNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZURyY1tBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF0gPSB7CisgICAgezEsIC01NS4wZn0sIHsyMCwgLTQzLjBmfSwgezg2LCAtMTIuMGZ9LCB7MTAwLCAwLjBmfQorfTsKKworY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50CisgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXSA9IHsKKyAgICB7MSwgLTI5LjdmfSwgezMzLCAtMjAuMWZ9LCB7NjYsIC0xMC4yZn0sIHsxMDAsIDAuMGZ9Cit9OworCitjb25zdCBBdWRpb1BvbGljeU1hbmFnZXI6OlZvbHVtZUN1cnZlUG9pbnQKKyAgICBBdWRpb1BvbGljeU1hbmFnZXI6OnNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVEcmNbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdID0geworICAgIHsxLCAtMzUuN2Z9LCB7MzMsIC0yNi4xZn0sIHs2NiwgLTEzLjJmfSwgezEwMCwgMC4wZn0KK307CisKKy8vIEFVRElPX1NUUkVBTV9TWVNURU0sIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFIGFuZCBBVURJT19TVFJFQU1fRFRNRiB2b2x1bWUgdHJhY2tzCisvLyBBVURJT19TVFJFQU1fUklORyBvbiBwaG9uZXMgYW5kIEFVRElPX1NUUkVBTV9NVVNJQyBvbiB0YWJsZXRzLgorLy8gQVVESU9fU1RSRUFNX0RUTUYgdHJhY2tzIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMIHdoaWxlIGluIGNhbGwgKFNlZSBBdWRpb1NlcnZpY2UuamF2YSkuCisvLyBUaGUgcmFuZ2UgaXMgY29uc3RyYWluZWQgYmV0d2VlbiAtMjRkQiBhbmQgLTZkQiBvdmVyIHNwZWFrZXIgYW5kIC0zMGRCIGFuZCAtMThkQiBvdmVyIGhlYWRzZXQuCisKK2NvbnN0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Vm9sdW1lQ3VydmVQb2ludAorICAgIEF1ZGlvUG9saWN5TWFuYWdlcjo6c0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF0gPSB7CisgICAgezEsIC0yNC4wZn0sIHszMywgLTE4LjBmfSwgezY2LCAtMTIuMGZ9LCB7MTAwLCAtNi4wZn0KK307CisKK2NvbnN0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Vm9sdW1lQ3VydmVQb2ludAorICAgIEF1ZGlvUG9saWN5TWFuYWdlcjo6c0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZURyY1tBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF0gPSB7CisgICAgezEsIC0zNC4wZn0sIHszMywgLTI0LjBmfSwgezY2LCAtMTUuMGZ9LCB7MTAwLCAtNi4wZn0KK307CisKK2NvbnN0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Vm9sdW1lQ3VydmVQb2ludAorICAgIEF1ZGlvUG9saWN5TWFuYWdlcjo6c0hlYWRzZXRTeXN0ZW1Wb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF0gPSB7CisgICAgezEsIC0zMC4wZn0sIHszMywgLTI2LjBmfSwgezY2LCAtMjIuMGZ9LCB7MTAwLCAtMTguMGZ9Cit9OworCitjb25zdCBBdWRpb1BvbGljeU1hbmFnZXI6OlZvbHVtZUN1cnZlUG9pbnQKKyAgICBBdWRpb1BvbGljeU1hbmFnZXI6OnNEZWZhdWx0Vm9pY2VWb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF0gPSB7CisgICAgezAsIC00Mi4wZn0sIHszMywgLTI4LjBmfSwgezY2LCAtMTQuMGZ9LCB7MTAwLCAwLjBmfQorfTsKKworY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50CisgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzU3BlYWtlclZvaWNlVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdID0geworICAgIHswLCAtMjQuMGZ9LCB7MzMsIC0xNi4wZn0sIHs2NiwgLTguMGZ9LCB7MTAwLCAwLjBmfQorfTsKKworY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50CisgICAgICAgICAgICAqQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzVm9sdW1lUHJvZmlsZXNbQVVESU9fU1RSRUFNX0NOVF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtBdWRpb1BvbGljeU1hbmFnZXI6OkRFVklDRV9DQVRFR09SWV9DTlRdID0geworICAgIHsgLy8gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwKKyAgICAgICAgc0RlZmF1bHRWb2ljZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAorICAgICAgICBzU3BlYWtlclZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCisgICAgICAgIHNEZWZhdWx0Vm9pY2VWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCisgICAgICAgIHNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQorICAgIH0sCisgICAgeyAvLyBBVURJT19TVFJFQU1fU1lTVEVNCisgICAgICAgIHNIZWFkc2V0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCisgICAgICAgIHNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCisgICAgICAgIHNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsICAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKKyAgICAgICAgc0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICB9LAorICAgIHsgLy8gQVVESU9fU1RSRUFNX1JJTkcKKyAgICAgICAgc0RlZmF1bHRWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKKyAgICAgICAgc1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKKyAgICAgICAgc0RlZmF1bHRWb2x1bWVDdXJ2ZSwgIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgICAgICBzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQorICAgIH0sCisgICAgeyAvLyBBVURJT19TVFJFQU1fTVVTSUMKKyAgICAgICAgc0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAorICAgICAgICBzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCisgICAgICAgIHNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCisgICAgICAgIHNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQorICAgIH0sCisgICAgeyAvLyBBVURJT19TVFJFQU1fQUxBUk0KKyAgICAgICAgc0RlZmF1bHRWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKKyAgICAgICAgc1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKKyAgICAgICAgc0RlZmF1bHRWb2x1bWVDdXJ2ZSwgIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgICAgICBzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQorICAgIH0sCisgICAgeyAvLyBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OCisgICAgICAgIHNEZWZhdWx0Vm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCisgICAgICAgIHNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCisgICAgICAgIHNEZWZhdWx0Vm9sdW1lQ3VydmUsICAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKKyAgICAgICAgc0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICB9LAorICAgIHsgLy8gQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08KKyAgICAgICAgc0RlZmF1bHRWb2ljZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAorICAgICAgICBzU3BlYWtlclZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCisgICAgICAgIHNEZWZhdWx0Vm9pY2VWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCisgICAgICAgIHNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQorICAgIH0sCisgICAgeyAvLyBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRQorICAgICAgICBzSGVhZHNldFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAorICAgICAgICBzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgorICAgICAgICBzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKKyAgICAgICAgc0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICB9LAorICAgIHsgIC8vIEFVRElPX1NUUkVBTV9EVE1GCisgICAgICAgIHNIZWFkc2V0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCisgICAgICAgIHNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCisgICAgICAgIHNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgICAgICBzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQorICAgIH0sCisgICAgeyAvLyBBVURJT19TVFJFQU1fVFRTCisgICAgICAgIHNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKKyAgICAgICAgc1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgorICAgICAgICBzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgICAgICBzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICB9LAorfTsKKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmluaXRpYWxpemVWb2x1bWVDdXJ2ZXMoKQoreworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQVVESU9fU1RSRUFNX0NOVDsgaSsrKSB7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgREVWSUNFX0NBVEVHT1JZX0NOVDsgaisrKSB7CisgICAgICAgICAgICBtU3RyZWFtc1tpXS5tVm9sdW1lQ3VydmVbal0gPQorICAgICAgICAgICAgICAgICAgICBzVm9sdW1lUHJvZmlsZXNbaV1bal07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDaGVjayBhdmFpbGFiaWxpdHkgb2YgRFJDIG9uIHNwZWFrZXIgcGF0aDogaWYgYXZhaWxhYmxlLCBvdmVycmlkZSBzb21lIG9mIHRoZSBzcGVha2VyIGN1cnZlcworICAgIGlmIChtU3BlYWtlckRyY0VuYWJsZWQpIHsKKyAgICAgICAgbVN0cmVhbXNbQVVESU9fU1RSRUFNX1NZU1RFTV0ubVZvbHVtZUN1cnZlW0RFVklDRV9DQVRFR09SWV9TUEVBS0VSXSA9CisgICAgICAgICAgICAgICAgc0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZURyYzsKKyAgICAgICAgbVN0cmVhbXNbQVVESU9fU1RSRUFNX1JJTkddLm1Wb2x1bWVDdXJ2ZVtERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl0gPQorICAgICAgICAgICAgICAgIHNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVEcmM7CisgICAgICAgIG1TdHJlYW1zW0FVRElPX1NUUkVBTV9BTEFSTV0ubVZvbHVtZUN1cnZlW0RFVklDRV9DQVRFR09SWV9TUEVBS0VSXSA9CisgICAgICAgICAgICAgICAgc1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZURyYzsKKyAgICAgICAgbVN0cmVhbXNbQVVESU9fU1RSRUFNX05PVElGSUNBVElPTl0ubVZvbHVtZUN1cnZlW0RFVklDRV9DQVRFR09SWV9TUEVBS0VSXSA9CisgICAgICAgICAgICAgICAgc1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZURyYzsKKyAgICAgICAgbVN0cmVhbXNbQVVESU9fU1RSRUFNX01VU0lDXS5tVm9sdW1lQ3VydmVbREVWSUNFX0NBVEVHT1JZX1NQRUFLRVJdID0KKyAgICAgICAgICAgICAgICBzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmVEcmM7CisgICAgfQorfQorCitmbG9hdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNvbXB1dGVWb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIGZsb2F0IHZvbHVtZSA9IDEuMDsKKyAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOworICAgIFN0cmVhbURlc2NyaXB0b3IgJnN0cmVhbURlc2MgPSBtU3RyZWFtc1tzdHJlYW1dOworCisgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICBkZXZpY2UgPSBvdXRwdXREZXNjLT5kZXZpY2UoKTsKKyAgICB9CisKKyAgICB2b2x1bWUgPSB2b2xJbmRleFRvQW1wbChkZXZpY2UsIHN0cmVhbURlc2MsIGluZGV4KTsKKworICAgIC8vIGlmIGEgaGVhZHNldCBpcyBjb25uZWN0ZWQsIGFwcGx5IHRoZSBmb2xsb3dpbmcgcnVsZXMgdG8gcmluZyB0b25lcyBhbmQgbm90aWZpY2F0aW9ucworICAgIC8vIHRvIGF2b2lkIHNvdW5kIGxldmVsIGJ1cnN0cyBpbiB1c2VyJ3MgZWFyczoKKyAgICAvLyAtIGFsd2F5cyBhdHRlbnVhdGUgcmluZyB0b25lcyBhbmQgbm90aWZpY2F0aW9ucyB2b2x1bWUgYnkgNmRCCisgICAgLy8gLSBpZiBtdXNpYyBpcyBwbGF5aW5nLCBhbHdheXMgbGltaXQgdGhlIHZvbHVtZSB0byBjdXJyZW50IG11c2ljIHZvbHVtZSwKKyAgICAvLyB3aXRoIGEgbWluaW11bSB0aHJlc2hvbGQgYXQgLTM2ZEIgc28gdGhhdCBub3RpZmljYXRpb24gaXMgYWx3YXlzIHBlcmNlaXZlZC4KKyAgICBjb25zdCByb3V0aW5nX3N0cmF0ZWd5IHN0cmVhbV9zdHJhdGVneSA9IGdldFN0cmF0ZWd5KHN0cmVhbSk7CisgICAgaWYgKChkZXZpY2UgJiAoQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCB8CisgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMgfAorICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VUIHwKKyAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FKSkgJiYKKyAgICAgICAgKChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKQorICAgICAgICAgICAgICAgIHx8IChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwpCisgICAgICAgICAgICAgICAgfHwgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fU1lTVEVNKQorICAgICAgICAgICAgICAgIHx8ICgoc3RyZWFtX3N0cmF0ZWd5ID09IFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpICYmCisgICAgICAgICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU1dID09IEFVRElPX1BPTElDWV9GT1JDRV9OT05FKSkpICYmCisgICAgICAgIHN0cmVhbURlc2MubUNhbkJlTXV0ZWQpIHsKKyAgICAgICAgdm9sdW1lICo9IFNPTklGSUNBVElPTl9IRUFEU0VUX1ZPTFVNRV9GQUNUT1I7CisgICAgICAgIC8vIHdoZW4gdGhlIHBob25lIGlzIHJpbmdpbmcgd2UgbXVzdCBjb25zaWRlciB0aGF0IG11c2ljIGNvdWxkIGhhdmUgYmVlbiBwYXVzZWQganVzdCBiZWZvcmUKKyAgICAgICAgLy8gYnkgdGhlIG11c2ljIGFwcGxpY2F0aW9uIGFuZCBiZWhhdmUgYXMgaWYgbXVzaWMgd2FzIGFjdGl2ZSBpZiB0aGUgbGFzdCBtdXNpYyB0cmFjayB3YXMKKyAgICAgICAgLy8ganVzdCBzdG9wcGVkCisgICAgICAgIGlmIChpc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fTVVTSUMsIFNPTklGSUNBVElPTl9IRUFEU0VUX01VU0lDX0RFTEFZKSB8fAorICAgICAgICAgICAgICAgIG1MaW1pdFJpbmd0b25lVm9sdW1lKSB7CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbXVzaWNEZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSwgdHJ1ZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgICAgIGZsb2F0IG11c2ljVm9sID0gY29tcHV0ZVZvbHVtZShBVURJT19TVFJFQU1fTVVTSUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbXNbQVVESU9fU1RSRUFNX01VU0lDXS5nZXRWb2x1bWVJbmRleChtdXNpY0RldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c2ljRGV2aWNlKTsKKyAgICAgICAgICAgIGZsb2F0IG1pblZvbCA9IChtdXNpY1ZvbCA+IFNPTklGSUNBVElPTl9IRUFEU0VUX1ZPTFVNRV9NSU4pID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzaWNWb2wgOiBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfTUlOOworICAgICAgICAgICAgaWYgKHZvbHVtZSA+IG1pblZvbCkgeworICAgICAgICAgICAgICAgIHZvbHVtZSA9IG1pblZvbDsKKyAgICAgICAgICAgICAgICBBTE9HVigiY29tcHV0ZVZvbHVtZSBsaW1pdGluZyB2b2x1bWUgdG8gJWYgbXVzaWNWb2wgJWYiLCBtaW5Wb2wsIG11c2ljVm9sKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB2b2x1bWU7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tBbmRTZXRWb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlKQoreworCisgICAgLy8gZG8gbm90IGNoYW5nZSBhY3R1YWwgc3RyZWFtIHZvbHVtZSBpZiB0aGUgc3RyZWFtIGlzIG11dGVkCisgICAgaWYgKG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCktPm1NdXRlQ291bnRbc3RyZWFtXSAhPSAwKSB7CisgICAgICAgIEFMT0dWVigiY2hlY2tBbmRTZXRWb2x1bWUoKSBzdHJlYW0gJWQgbXV0ZWQgY291bnQgJWQiLAorICAgICAgICAgICAgICBzdHJlYW0sIG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCktPm1NdXRlQ291bnRbc3RyZWFtXSk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICAvLyBkbyBub3QgY2hhbmdlIGluIGNhbGwgdm9sdW1lIGlmIGJsdWV0b290aCBpcyBjb25uZWN0ZWQgYW5kIHZpY2UgdmVyc2EKKyAgICBpZiAoKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCAmJgorICAgICAgICAgICAgbUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTl0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykgfHwKKyAgICAgICAgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTyAmJgorICAgICAgICAgICAgICAgIG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pKSB7CisgICAgICAgIEFMT0dWKCJjaGVja0FuZFNldFZvbHVtZSgpIGNhbm5vdCBzZXQgc3RyZWFtICVkIHZvbHVtZSB3aXRoIGZvcmNlIHVzZSA9ICVkIGZvciBjb21tIiwKKyAgICAgICAgICAgICBzdHJlYW0sIG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGZsb2F0IHZvbHVtZSA9IGNvbXB1dGVWb2x1bWUoc3RyZWFtLCBpbmRleCwgb3V0cHV0LCBkZXZpY2UpOworICAgIC8vIFdlIGFjdHVhbGx5IGNoYW5nZSB0aGUgdm9sdW1lIGlmOgorICAgIC8vIC0gdGhlIGZsb2F0IHZhbHVlIHJldHVybmVkIGJ5IGNvbXB1dGVWb2x1bWUoKSBjaGFuZ2VkCisgICAgLy8gLSB0aGUgZm9yY2UgZmxhZyBpcyBzZXQKKyAgICBpZiAodm9sdW1lICE9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCktPm1DdXJWb2x1bWVbc3RyZWFtXSB8fAorICAgICAgICAgICAgZm9yY2UpIHsKKyAgICAgICAgbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KS0+bUN1clZvbHVtZVtzdHJlYW1dID0gdm9sdW1lOworICAgICAgICBBTE9HVlYoImNoZWNrQW5kU2V0Vm9sdW1lKCkgZm9yIG91dHB1dCAlZCBzdHJlYW0gJWQsIHZvbHVtZSAlZiwgZGVsYXkgJWQiLCBvdXRwdXQsIHN0cmVhbSwgdm9sdW1lLCBkZWxheU1zKTsKKyAgICAgICAgLy8gRm9yY2UgVk9JQ0VfQ0FMTCB0byB0cmFjayBCTFVFVE9PVEhfU0NPIHN0cmVhbSB2b2x1bWUgd2hlbiBibHVldG9vdGggYXVkaW8gaXMKKyAgICAgICAgLy8gZW5hYmxlZAorICAgICAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPKSB7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0U3RyZWFtVm9sdW1lKEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMLCB2b2x1bWUsIG91dHB1dCwgZGVsYXlNcyk7CisgICAgICAgIH0KKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFN0cmVhbVZvbHVtZShzdHJlYW0sIHZvbHVtZSwgb3V0cHV0LCBkZWxheU1zKTsKKyAgICB9CisKKyAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMIHx8CisgICAgICAgIHN0cmVhbSA9PSBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTykgeworICAgICAgICBmbG9hdCB2b2ljZVZvbHVtZTsKKyAgICAgICAgLy8gRm9yY2Ugdm9pY2Ugdm9sdW1lIHRvIG1heCBmb3IgYmx1ZXRvb3RoIFNDTyBhcyB2b2x1bWUgaXMgbWFuYWdlZCBieSB0aGUgaGVhZHNldAorICAgICAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSB7CisgICAgICAgICAgICB2b2ljZVZvbHVtZSA9IChmbG9hdClpbmRleC8oZmxvYXQpbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhNYXg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2b2ljZVZvbHVtZSA9IDEuMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2b2ljZVZvbHVtZSAhPSBtTGFzdFZvaWNlVm9sdW1lICYmIG91dHB1dCA9PSBtUHJpbWFyeU91dHB1dCkgeworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFZvaWNlVm9sdW1lKHZvaWNlVm9sdW1lLCBkZWxheU1zKTsKKyAgICAgICAgICAgIG1MYXN0Vm9pY2VWb2x1bWUgPSB2b2ljZVZvbHVtZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmFwcGx5U3RyZWFtVm9sdW1lcyhhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlKQoreworICAgIEFMT0dWVigiYXBwbHlTdHJlYW1Wb2x1bWVzKCkgZm9yIG91dHB1dCAlZCBhbmQgZGV2aWNlICV4Iiwgb3V0cHV0LCBkZXZpY2UpOworCisgICAgZm9yIChpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0NOVDsgc3RyZWFtKyspIHsKKyAgICAgICAgY2hlY2tBbmRTZXRWb2x1bWUoKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtc1tzdHJlYW1dLmdldFZvbHVtZUluZGV4KGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZSk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0U3RyYXRlZ3lNdXRlKHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIEFMT0dWVigic2V0U3RyYXRlZ3lNdXRlKCkgc3RyYXRlZ3kgJWQsIG11dGUgJWQsIG91dHB1dCAlZCIsIHN0cmF0ZWd5LCBvbiwgb3V0cHV0KTsKKyAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fQ05UOyBzdHJlYW0rKykgeworICAgICAgICBpZiAoZ2V0U3RyYXRlZ3koKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtKSA9PSBzdHJhdGVneSkgeworICAgICAgICAgICAgc2V0U3RyZWFtTXV0ZSgoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0sIG9uLCBvdXRwdXQsIGRlbGF5TXMsIGRldmljZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRTdHJlYW1NdXRlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgU3RyZWFtRGVzY3JpcHRvciAmc3RyZWFtRGVzYyA9IG1TdHJlYW1zW3N0cmVhbV07CisgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKKyAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgIGRldmljZSA9IG91dHB1dERlc2MtPmRldmljZSgpOworICAgIH0KKworICAgIEFMT0dWVigic2V0U3RyZWFtTXV0ZSgpIHN0cmVhbSAlZCwgbXV0ZSAlZCwgb3V0cHV0ICVkLCBtTXV0ZUNvdW50ICVkIGRldmljZSAlMDR4IiwKKyAgICAgICAgICBzdHJlYW0sIG9uLCBvdXRwdXQsIG91dHB1dERlc2MtPm1NdXRlQ291bnRbc3RyZWFtXSwgZGV2aWNlKTsKKworICAgIGlmIChvbikgeworICAgICAgICBpZiAob3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dID09IDApIHsKKyAgICAgICAgICAgIGlmIChzdHJlYW1EZXNjLm1DYW5CZU11dGVkICYmCisgICAgICAgICAgICAgICAgICAgICgoc3RyZWFtICE9IEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFKSB8fAorICAgICAgICAgICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTV0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUpKSkgeworICAgICAgICAgICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKHN0cmVhbSwgMCwgb3V0cHV0LCBkZXZpY2UsIGRlbGF5TXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGluY3JlbWVudCBtTXV0ZUNvdW50IGFmdGVyIGNhbGxpbmcgY2hlY2tBbmRTZXRWb2x1bWUoKSBzbyB0aGF0IHZvbHVtZSBjaGFuZ2UgaXMgbm90IGlnbm9yZWQKKyAgICAgICAgb3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dKys7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPm1NdXRlQ291bnRbc3RyZWFtXSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVigic2V0U3RyZWFtTXV0ZSgpIHVubXV0aW5nIG5vbiBtdXRlZCBzdHJlYW0hIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKC0tb3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dID09IDApIHsKKyAgICAgICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2MuZ2V0Vm9sdW1lSW5kZXgoZGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5TXMpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6aGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdGFydGluZywgYm9vbCBzdGF0ZUNoYW5nZSkKK3sKKyAgICAvLyBpZiB0aGUgc3RyZWFtIHBlcnRhaW5zIHRvIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBhbmQgd2UgYXJlIGluIGNhbGwgd2UgbXVzdAorICAgIC8vIG11dGUgdGhlIHN0cmVhbSBpZiBpdCBpcyBsb3cgdmlzaWJpbGl0eS4gSWYgaXQgaXMgaGlnaCB2aXNpYmlsaXR5LCB3ZSBtdXN0IHBsYXkgYSB0b25lCisgICAgLy8gaW4gdGhlIGRldmljZSB1c2VkIGZvciBwaG9uZSBzdHJhdGVneSBhbmQgcGxheSB0aGUgdG9uZSBpZiB0aGUgc2VsZWN0ZWQgZGV2aWNlIGRvZXMgbm90CisgICAgLy8gaW50ZXJmZXJlIHdpdGggdGhlIGRldmljZSB1c2VkIGZvciBwaG9uZSBzdHJhdGVneQorICAgIC8vIGlmIHN0YXRlQ2hhbmdlIGlzIHRydWUsIHdlIGFyZSBjYWxsZWQgZnJvbSBzZXRQaG9uZVN0YXRlKCkgYW5kIHdlIG11c3QgbXV0ZSBvciB1bm11dGUgYXMKKyAgICAvLyBtYW55IHRpbWVzIGFzIHRoZXJlIGFyZSBhY3RpdmUgdHJhY2tzIG9uIHRoZSBvdXRwdXQKKyAgICBjb25zdCByb3V0aW5nX3N0cmF0ZWd5IHN0cmVhbV9zdHJhdGVneSA9IGdldFN0cmF0ZWd5KHN0cmVhbSk7CisgICAgaWYgKChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSB8fAorICAgICAgICAgICAgKChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwpKSkgeworICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihtUHJpbWFyeU91dHB1dCk7CisgICAgICAgIEFMT0dWKCJoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKSBzdHJlYW0gJWQgc3RhcnRpbmcgJWQgZGV2aWNlICV4IHN0YXRlQ2hhbmdlICVkIiwKKyAgICAgICAgICAgICAgICBzdHJlYW0sIHN0YXJ0aW5nLCBvdXRwdXREZXNjLT5tRGV2aWNlLCBzdGF0ZUNoYW5nZSk7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSkgeworICAgICAgICAgICAgaW50IG11dGVDb3VudCA9IDE7CisgICAgICAgICAgICBpZiAoc3RhdGVDaGFuZ2UpIHsKKyAgICAgICAgICAgICAgICBtdXRlQ291bnQgPSBvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhdWRpb19pc19sb3dfdmlzaWJpbGl0eShzdHJlYW0pKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpIGxvdyB2aXNpYmlsaXR5LCBtdXRlQ291bnQgJWQiLCBtdXRlQ291bnQpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXV0ZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0U3RyZWFtTXV0ZShzdHJlYW0sIHN0YXJ0aW5nLCBtUHJpbWFyeU91dHB1dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkgaGlnaCB2aXNpYmlsaXR5Iik7CisgICAgICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPmRldmljZSgpICYKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1BIT05FLCB0cnVlIC8qZnJvbUNhY2hlKi8pKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKSBoaWdoIHZpc2liaWxpdHkgbXV0ZWQsIG11dGVDb3VudCAlZCIsIG11dGVDb3VudCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXV0ZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0cmVhbU11dGUoc3RyZWFtLCBzdGFydGluZywgbVByaW1hcnlPdXRwdXQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzdGFydGluZykgeworICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c3RhcnRUb25lKEFVRElPX1BPTElDWV9UT05FX0lOX0NBTExfTk9USUZJQ0FUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c3RvcFRvbmUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc0luQ2FsbCgpCit7CisgICAgcmV0dXJuIGlzU3RhdGVJbkNhbGwobVBob25lU3RhdGUpOworfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNTdGF0ZUluQ2FsbChpbnQgc3RhdGUpIHsKKyAgICByZXR1cm4gKChzdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEwpIHx8CisgICAgICAgICAgICAoc3RhdGUgPT0gQVVESU9fTU9ERV9JTl9DT01NVU5JQ0FUSU9OKSk7Cit9CisKK3VpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TWF4RWZmZWN0c0NwdUxvYWQoKQoreworICAgIHJldHVybiBNQVhfRUZGRUNUU19DUFVfTE9BRDsKK30KKwordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRNYXhFZmZlY3RzTWVtb3J5KCkKK3sKKyAgICByZXR1cm4gTUFYX0VGRkVDVFNfTUVNT1JZOworfQorCisKKy8vIC0tLSBBdWRpb091dHB1dERlc2NyaXB0b3IgY2xhc3MgaW1wbGVtZW50YXRpb24KKworQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcigKKyAgICAgICAgY29uc3Qgc3A8SU9Qcm9maWxlPiYgcHJvZmlsZSkKKyAgICA6IG1JZCgwKSwgbUlvSGFuZGxlKDApLCBtTGF0ZW5jeSgwKSwKKyAgICBtRmxhZ3MoKGF1ZGlvX291dHB1dF9mbGFnc190KTApLCBtRGV2aWNlKEFVRElPX0RFVklDRV9OT05FKSwgbVBhdGNoSGFuZGxlKDApLAorICAgIG1PdXRwdXQxKDApLCBtT3V0cHV0MigwKSwgbVByb2ZpbGUocHJvZmlsZSksIG1EaXJlY3RPcGVuQ291bnQoMCkKK3sKKyAgICAvLyBjbGVhciB1c2FnZSBjb3VudCBmb3IgYWxsIHN0cmVhbSB0eXBlcworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQVVESU9fU1RSRUFNX0NOVDsgaSsrKSB7CisgICAgICAgIG1SZWZDb3VudFtpXSA9IDA7CisgICAgICAgIG1DdXJWb2x1bWVbaV0gPSAtMS4wOworICAgICAgICBtTXV0ZUNvdW50W2ldID0gMDsKKyAgICAgICAgbVN0b3BUaW1lW2ldID0gMDsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fU1RSQVRFR0lFUzsgaSsrKSB7CisgICAgICAgIG1TdHJhdGVneU11dGVkQnlEZXZpY2VbaV0gPSBmYWxzZTsKKyAgICB9CisgICAgaWYgKHByb2ZpbGUgIT0gTlVMTCkgeworICAgICAgICBtRmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpcHJvZmlsZS0+bUZsYWdzOworICAgICAgICBtU2FtcGxpbmdSYXRlID0gcHJvZmlsZS0+cGlja1NhbXBsaW5nUmF0ZSgpOworICAgICAgICBtRm9ybWF0ID0gcHJvZmlsZS0+cGlja0Zvcm1hdCgpOworICAgICAgICBtQ2hhbm5lbE1hc2sgPSBwcm9maWxlLT5waWNrQ2hhbm5lbE1hc2soKTsKKyAgICAgICAgaWYgKHByb2ZpbGUtPm1HYWlucy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBwcm9maWxlLT5tR2FpbnNbMF0tPmdldERlZmF1bHRDb25maWcoJm1HYWluKTsKKyAgICAgICAgfQorICAgIH0KK30KKworYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkZXZpY2UoKSBjb25zdAoreworICAgIGlmIChpc0R1cGxpY2F0ZWQoKSkgeworICAgICAgICByZXR1cm4gKGF1ZGlvX2RldmljZXNfdCkobU91dHB1dDEtPm1EZXZpY2UgfCBtT3V0cHV0Mi0+bURldmljZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG1EZXZpY2U7CisgICAgfQorfQorCit1aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6bGF0ZW5jeSgpCit7CisgICAgaWYgKGlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgIHJldHVybiAobU91dHB1dDEtPm1MYXRlbmN5ID4gbU91dHB1dDItPm1MYXRlbmN5KSA/IG1PdXRwdXQxLT5tTGF0ZW5jeSA6IG1PdXRwdXQyLT5tTGF0ZW5jeTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbUxhdGVuY3k7CisgICAgfQorfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzaGFyZXNId01vZHVsZVdpdGgoCisgICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYykKK3sKKyAgICBpZiAoaXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIG1PdXRwdXQxLT5zaGFyZXNId01vZHVsZVdpdGgob3V0cHV0RGVzYykgfHwgbU91dHB1dDItPnNoYXJlc0h3TW9kdWxlV2l0aChvdXRwdXREZXNjKTsKKyAgICB9IGVsc2UgaWYgKG91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpKXsKKyAgICAgICAgcmV0dXJuIHNoYXJlc0h3TW9kdWxlV2l0aChvdXRwdXREZXNjLT5tT3V0cHV0MSkgfHwgc2hhcmVzSHdNb2R1bGVXaXRoKG91dHB1dERlc2MtPm1PdXRwdXQyKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gKG1Qcm9maWxlLT5tTW9kdWxlID09IG91dHB1dERlc2MtPm1Qcm9maWxlLT5tTW9kdWxlKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OmNoYW5nZVJlZkNvdW50KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWx0YSkKK3sKKyAgICAvLyBmb3J3YXJkIHVzYWdlIGNvdW50IGNoYW5nZSB0byBhdHRhY2hlZCBvdXRwdXRzCisgICAgaWYgKGlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgIG1PdXRwdXQxLT5jaGFuZ2VSZWZDb3VudChzdHJlYW0sIGRlbHRhKTsKKyAgICAgICAgbU91dHB1dDItPmNoYW5nZVJlZkNvdW50KHN0cmVhbSwgZGVsdGEpOworICAgIH0KKyAgICBpZiAoKGRlbHRhICsgKGludCltUmVmQ291bnRbc3RyZWFtXSkgPCAwKSB7CisgICAgICAgIEFMT0dXKCJjaGFuZ2VSZWZDb3VudCgpIGludmFsaWQgZGVsdGEgJWQgZm9yIHN0cmVhbSAlZCwgcmVmQ291bnQgJWQiLAorICAgICAgICAgICAgICBkZWx0YSwgc3RyZWFtLCBtUmVmQ291bnRbc3RyZWFtXSk7CisgICAgICAgIG1SZWZDb3VudFtzdHJlYW1dID0gMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtUmVmQ291bnRbc3RyZWFtXSArPSBkZWx0YTsKKyAgICBBTE9HVigiY2hhbmdlUmVmQ291bnQoKSBzdHJlYW0gJWQsIGNvdW50ICVkIiwgc3RyZWFtLCBtUmVmQ291bnRbc3RyZWFtXSk7Cit9CisKK2F1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c3VwcG9ydGVkRGV2aWNlcygpCit7CisgICAgaWYgKGlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgIHJldHVybiAoYXVkaW9fZGV2aWNlc190KShtT3V0cHV0MS0+c3VwcG9ydGVkRGV2aWNlcygpIHwgbU91dHB1dDItPnN1cHBvcnRlZERldmljZXMoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG1Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpIDsKKyAgICB9Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OmlzQWN0aXZlKHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAoreworICAgIHJldHVybiBpc1N0cmF0ZWd5QWN0aXZlKE5VTV9TVFJBVEVHSUVTLCBpblBhc3RNcyk7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OmlzU3RyYXRlZ3lBY3RpdmUocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5QYXN0TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3Qgc3lzVGltZSkgY29uc3QKK3sKKyAgICBpZiAoKHN5c1RpbWUgPT0gMCkgJiYgKGluUGFzdE1zICE9IDApKSB7CisgICAgICAgIHN5c1RpbWUgPSBzeXN0ZW1UaW1lKCk7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClBVURJT19TVFJFQU1fQ05UOyBpKyspIHsKKyAgICAgICAgaWYgKCgoZ2V0U3RyYXRlZ3koKGF1ZGlvX3N0cmVhbV90eXBlX3QpaSkgPT0gc3RyYXRlZ3kpIHx8CisgICAgICAgICAgICAgICAgKE5VTV9TVFJBVEVHSUVTID09IHN0cmF0ZWd5KSkgJiYKKyAgICAgICAgICAgICAgICBpc1N0cmVhbUFjdGl2ZSgoYXVkaW9fc3RyZWFtX3R5cGVfdClpLCBpblBhc3RNcywgc3lzVGltZSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6aXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHN5c1RpbWUpIGNvbnN0Cit7CisgICAgaWYgKG1SZWZDb3VudFtzdHJlYW1dICE9IDApIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChpblBhc3RNcyA9PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHN5c1RpbWUgPT0gMCkgeworICAgICAgICBzeXNUaW1lID0gc3lzdGVtVGltZSgpOworICAgIH0KKyAgICBpZiAobnMybXMoc3lzVGltZSAtIG1TdG9wVGltZVtzdHJlYW1dKSA8IGluUGFzdE1zKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0Q29uZmlnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnKSBjb25zdAoreworICAgIEFMT0dfQVNTRVJUKCFpc0R1cGxpY2F0ZWQoKSwgInRvQXVkaW9Qb3J0Q29uZmlnKCkgY2FsbGVkIG9uIGR1cGxpY2F0ZWQgb3V0cHV0ICVkIiwgbUlvSGFuZGxlKTsKKworICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgPSBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURXxBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0t8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUfEFVRElPX1BPUlRfQ09ORklHX0dBSU47CisgICAgaWYgKHNyY0NvbmZpZyAhPSBOVUxMKSB7CisgICAgICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgfD0gc3JjQ29uZmlnLT5jb25maWdfbWFzazsKKyAgICB9CisgICAgQXVkaW9Qb3J0Q29uZmlnOjp0b0F1ZGlvUG9ydENvbmZpZyhkc3RDb25maWcsIHNyY0NvbmZpZyk7CisKKyAgICBkc3RDb25maWctPmlkID0gbUlkOworICAgIGRzdENvbmZpZy0+cm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0U7CisgICAgZHN0Q29uZmlnLT50eXBlID0gQVVESU9fUE9SVF9UWVBFX01JWDsKKyAgICBkc3RDb25maWctPmV4dC5taXguaHdfbW9kdWxlID0gbVByb2ZpbGUtPm1Nb2R1bGUtPm1IYW5kbGU7CisgICAgZHN0Q29uZmlnLT5leHQubWl4LmhhbmRsZSA9IG1Jb0hhbmRsZTsKKyAgICBkc3RDb25maWctPmV4dC5taXgudXNlY2FzZS5zdHJlYW0gPSBBVURJT19TVFJFQU1fREVGQVVMVDsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6dG9BdWRpb1BvcnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0Cit7CisgICAgQUxPR19BU1NFUlQoIWlzRHVwbGljYXRlZCgpLCAidG9BdWRpb1BvcnQoKSBjYWxsZWQgb24gZHVwbGljYXRlZCBvdXRwdXQgJWQiLCBtSW9IYW5kbGUpOworICAgIG1Qcm9maWxlLT50b0F1ZGlvUG9ydChwb3J0KTsKKyAgICBwb3J0LT5pZCA9IG1JZDsKKyAgICB0b0F1ZGlvUG9ydENvbmZpZygmcG9ydC0+YWN0aXZlX2NvbmZpZyk7CisgICAgcG9ydC0+ZXh0Lm1peC5od19tb2R1bGUgPSBtUHJvZmlsZS0+bU1vZHVsZS0+bUhhbmRsZTsKKyAgICBwb3J0LT5leHQubWl4LmhhbmRsZSA9IG1Jb0hhbmRsZTsKKyAgICBwb3J0LT5leHQubWl4LmxhdGVuY3lfY2xhc3MgPQorICAgICAgICAgICAgbUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCA/IEFVRElPX0xBVEVOQ1lfTE9XIDogQVVESU9fTEFURU5DWV9OT1JNQUw7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKGludCBmZCkKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBJRDogJWRcbiIsIG1JZCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBTYW1wbGluZyByYXRlOiAlZFxuIiwgbVNhbXBsaW5nUmF0ZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JtYXQ6ICUwOHhcbiIsIG1Gb3JtYXQpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgQ2hhbm5lbHM6ICUwOHhcbiIsIG1DaGFubmVsTWFzayk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBMYXRlbmN5OiAlZFxuIiwgbUxhdGVuY3kpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRmxhZ3MgJTA4eFxuIiwgbUZsYWdzKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIERldmljZXMgJTA4eFxuIiwgZGV2aWNlKCkpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU3RyZWFtIHZvbHVtZSByZWZDb3VudCBtdXRlQ291bnRcbiIpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpQVVESU9fU1RSRUFNX0NOVDsgaSsrKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAlMDJkICAgICAlLjAzZiAgICAgJTAyZCAgICAgICAlMDJkXG4iLAorICAgICAgICAgICAgICAgICBpLCBtQ3VyVm9sdW1lW2ldLCBtUmVmQ291bnRbaV0sIG1NdXRlQ291bnRbaV0pOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgfQorICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvLyAtLS0gQXVkaW9JbnB1dERlc2NyaXB0b3IgY2xhc3MgaW1wbGVtZW50YXRpb24KKworQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb0lucHV0RGVzY3JpcHRvcjo6QXVkaW9JbnB1dERlc2NyaXB0b3IoY29uc3Qgc3A8SU9Qcm9maWxlPiYgcHJvZmlsZSkKKyAgICA6IG1JZCgwKSwgbUlvSGFuZGxlKDApLAorICAgICAgbURldmljZShBVURJT19ERVZJQ0VfTk9ORSksIG1QYXRjaEhhbmRsZSgwKSwgbVJlZkNvdW50KDApLAorICAgICAgbUlucHV0U291cmNlKEFVRElPX1NPVVJDRV9ERUZBVUxUKSwgbVByb2ZpbGUocHJvZmlsZSksIG1Jc1NvdW5kVHJpZ2dlcihmYWxzZSkKK3sKKyAgICBpZiAocHJvZmlsZSAhPSBOVUxMKSB7CisgICAgICAgIG1TYW1wbGluZ1JhdGUgPSBwcm9maWxlLT5waWNrU2FtcGxpbmdSYXRlKCk7CisgICAgICAgIG1Gb3JtYXQgPSBwcm9maWxlLT5waWNrRm9ybWF0KCk7CisgICAgICAgIG1DaGFubmVsTWFzayA9IHByb2ZpbGUtPnBpY2tDaGFubmVsTWFzaygpOworICAgICAgICBpZiAocHJvZmlsZS0+bUdhaW5zLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIHByb2ZpbGUtPm1HYWluc1swXS0+Z2V0RGVmYXVsdENvbmZpZygmbUdhaW4pOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9JbnB1dERlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0Q29uZmlnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZykgY29uc3QKK3sKKyAgICBBTE9HX0FTU0VSVChtUHJvZmlsZSAhPSAwLAorICAgICAgICAgICAgICAgICJ0b0F1ZGlvUG9ydENvbmZpZygpIGNhbGxlZCBvbiBpbnB1dCB3aXRoIG51bGwgcHJvZmlsZSAlZCIsIG1Jb0hhbmRsZSk7CisgICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayA9IEFVRElPX1BPUlRfQ09ORklHX1NBTVBMRV9SQVRFfEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTS3wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT1JUX0NPTkZJR19GT1JNQVR8QVVESU9fUE9SVF9DT05GSUdfR0FJTjsKKyAgICBpZiAoc3JjQ29uZmlnICE9IE5VTEwpIHsKKyAgICAgICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayB8PSBzcmNDb25maWctPmNvbmZpZ19tYXNrOworICAgIH0KKworICAgIEF1ZGlvUG9ydENvbmZpZzo6dG9BdWRpb1BvcnRDb25maWcoZHN0Q29uZmlnLCBzcmNDb25maWcpOworCisgICAgZHN0Q29uZmlnLT5pZCA9IG1JZDsKKyAgICBkc3RDb25maWctPnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU0lOSzsKKyAgICBkc3RDb25maWctPnR5cGUgPSBBVURJT19QT1JUX1RZUEVfTUlYOworICAgIGRzdENvbmZpZy0+ZXh0Lm1peC5od19tb2R1bGUgPSBtUHJvZmlsZS0+bU1vZHVsZS0+bUhhbmRsZTsKKyAgICBkc3RDb25maWctPmV4dC5taXguaGFuZGxlID0gbUlvSGFuZGxlOworICAgIGRzdENvbmZpZy0+ZXh0Lm1peC51c2VjYXNlLnNvdXJjZSA9IG1JbnB1dFNvdXJjZTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvSW5wdXREZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3QKK3sKKyAgICBBTE9HX0FTU0VSVChtUHJvZmlsZSAhPSAwLCAidG9BdWRpb1BvcnQoKSBjYWxsZWQgb24gaW5wdXQgd2l0aCBudWxsIHByb2ZpbGUgJWQiLCBtSW9IYW5kbGUpOworCisgICAgbVByb2ZpbGUtPnRvQXVkaW9Qb3J0KHBvcnQpOworICAgIHBvcnQtPmlkID0gbUlkOworICAgIHRvQXVkaW9Qb3J0Q29uZmlnKCZwb3J0LT5hY3RpdmVfY29uZmlnKTsKKyAgICBwb3J0LT5leHQubWl4Lmh3X21vZHVsZSA9IG1Qcm9maWxlLT5tTW9kdWxlLT5tSGFuZGxlOworICAgIHBvcnQtPmV4dC5taXguaGFuZGxlID0gbUlvSGFuZGxlOworICAgIHBvcnQtPmV4dC5taXgubGF0ZW5jeV9jbGFzcyA9IEFVRElPX0xBVEVOQ1lfTk9STUFMOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvSW5wdXREZXNjcmlwdG9yOjpkdW1wKGludCBmZCkKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBJRDogJWRcbiIsIG1JZCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBTYW1wbGluZyByYXRlOiAlZFxuIiwgbVNhbXBsaW5nUmF0ZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JtYXQ6ICVkXG4iLCBtRm9ybWF0KTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIENoYW5uZWxzOiAlMDh4XG4iLCBtQ2hhbm5lbE1hc2spOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRGV2aWNlcyAlMDh4XG4iLCBtRGV2aWNlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFJlZiBDb3VudCAlZFxuIiwgbVJlZkNvdW50KTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIE9wZW4gUmVmIENvdW50ICVkXG4iLCBtT3BlblJlZkNvdW50KTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisKKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLy8gLS0tIFN0cmVhbURlc2NyaXB0b3IgY2xhc3MgaW1wbGVtZW50YXRpb24KKworQXVkaW9Qb2xpY3lNYW5hZ2VyOjpTdHJlYW1EZXNjcmlwdG9yOjpTdHJlYW1EZXNjcmlwdG9yKCkKKyAgICA6ICAgbUluZGV4TWluKDApLCBtSW5kZXhNYXgoMSksIG1DYW5CZU11dGVkKHRydWUpCit7CisgICAgbUluZGV4Q3VyLmFkZChBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQsIDApOworfQorCitpbnQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpTdHJlYW1EZXNjcmlwdG9yOjpnZXRWb2x1bWVJbmRleChhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIGRldmljZSA9IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlRm9yVm9sdW1lKGRldmljZSk7CisgICAgLy8gdGhlcmUgaXMgYWx3YXlzIGEgdmFsaWQgZW50cnkgZm9yIEFVRElPX0RFVklDRV9PVVRfREVGQVVMVAorICAgIGlmIChtSW5kZXhDdXIuaW5kZXhPZktleShkZXZpY2UpIDwgMCkgeworICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQ7CisgICAgfQorICAgIHJldHVybiBtSW5kZXhDdXIudmFsdWVGb3IoZGV2aWNlKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OlN0cmVhbURlc2NyaXB0b3I6OmR1bXAoaW50IGZkKQoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJXMgICAgICAgICAlMDJkICAgICAgICAgJTAyZCAgICAgICAgICIsCisgICAgICAgICAgICAgbUNhbkJlTXV0ZWQgPyAidHJ1ZSAiIDogImZhbHNlIiwgbUluZGV4TWluLCBtSW5kZXhNYXgpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbmRleEN1ci5zaXplKCk7IGkrKykgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlMDR4IDogJTAyZCwgIiwKKyAgICAgICAgICAgICAgICAgbUluZGV4Q3VyLmtleUF0KGkpLAorICAgICAgICAgICAgICAgICBtSW5kZXhDdXIudmFsdWVBdChpKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB9CisgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKworICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworfQorCisvLyAtLS0gRWZmZWN0RGVzY3JpcHRvciBjbGFzcyBpbXBsZW1lbnRhdGlvbgorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkVmZmVjdERlc2NyaXB0b3I6OmR1bXAoaW50IGZkKQoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEkvTzogJWRcbiIsIG1Jbyk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBTdHJhdGVneTogJWRcbiIsIG1TdHJhdGVneSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBTZXNzaW9uOiAlZFxuIiwgbVNlc3Npb24pOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgTmFtZTogJXNcbiIsICBtRGVzYy5uYW1lKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICVzXG4iLCAgbUVuYWJsZWQgPyAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8vIC0tLSBId01vZHVsZSBjbGFzcyBpbXBsZW1lbnRhdGlvbgorCitBdWRpb1BvbGljeU1hbmFnZXI6Okh3TW9kdWxlOjpId01vZHVsZShjb25zdCBjaGFyICpuYW1lKQorICAgIDogbU5hbWUoc3RybmR1cChuYW1lLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTUFYX0xFTikpLAorICAgICAgbUhhbFZlcnNpb24oQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OX01JTiksIG1IYW5kbGUoMCkKK3sKK30KKworQXVkaW9Qb2xpY3lNYW5hZ2VyOjpId01vZHVsZTo6fkh3TW9kdWxlKCkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRQcm9maWxlcy5zaXplKCk7IGkrKykgeworICAgICAgICBtT3V0cHV0UHJvZmlsZXNbaV0tPm1TdXBwb3J0ZWREZXZpY2VzLmNsZWFyKCk7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0UHJvZmlsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUlucHV0UHJvZmlsZXNbaV0tPm1TdXBwb3J0ZWREZXZpY2VzLmNsZWFyKCk7CisgICAgfQorICAgIGZyZWUoKHZvaWQgKiltTmFtZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6SHdNb2R1bGU6OmxvYWRJbnB1dChjbm9kZSAqcm9vdCkKK3sKKyAgICBjbm9kZSAqbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOworCisgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbmV3IElPUHJvZmlsZShTdHJpbmc4KHJvb3QtPm5hbWUpLCBBVURJT19QT1JUX1JPTEVfU0lOSywgdGhpcyk7CisKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgICBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIFNBTVBMSU5HX1JBVEVTX1RBRykgPT0gMCkgeworICAgICAgICAgICAgcHJvZmlsZS0+bG9hZFNhbXBsaW5nUmF0ZXMoKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEZPUk1BVFNfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBwcm9maWxlLT5sb2FkRm9ybWF0cygoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgQ0hBTk5FTFNfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBwcm9maWxlLT5sb2FkSW5DaGFubmVscygoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgREVWSUNFU19UQUcpID09IDApIHsKKyAgICAgICAgICAgIHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmxvYWREZXZpY2VzRnJvbU5hbWUoKGNoYXIgKilub2RlLT52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURlY2xhcmVkRGV2aWNlcyk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEZMQUdTX1RBRykgPT0gMCkgeworICAgICAgICAgICAgcHJvZmlsZS0+bUZsYWdzID0gcGFyc2VJbnB1dEZsYWdOYW1lcygoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTlNfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBwcm9maWxlLT5sb2FkR2FpbnMobm9kZSk7CisgICAgICAgIH0KKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgfQorICAgIEFMT0dXX0lGKHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmlzRW1wdHkoKSwKKyAgICAgICAgICAgICJsb2FkSW5wdXQoKSBpbnZhbGlkIHN1cHBvcnRlZCBkZXZpY2VzIik7CisgICAgQUxPR1dfSUYocHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5zaXplKCkgPT0gMCwKKyAgICAgICAgICAgICJsb2FkSW5wdXQoKSBpbnZhbGlkIHN1cHBvcnRlZCBjaGFubmVsIG1hc2tzIik7CisgICAgQUxPR1dfSUYocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuc2l6ZSgpID09IDAsCisgICAgICAgICAgICAibG9hZElucHV0KCkgaW52YWxpZCBzdXBwb3J0ZWQgc2FtcGxpbmcgcmF0ZXMiKTsKKyAgICBBTE9HV19JRihwcm9maWxlLT5tRm9ybWF0cy5zaXplKCkgPT0gMCwKKyAgICAgICAgICAgICJsb2FkSW5wdXQoKSBpbnZhbGlkIHN1cHBvcnRlZCBmb3JtYXRzIik7CisgICAgaWYgKCFwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5pc0VtcHR5KCkgJiYKKyAgICAgICAgICAgIChwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLnNpemUoKSAhPSAwKSAmJgorICAgICAgICAgICAgKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLnNpemUoKSAhPSAwKSAmJgorICAgICAgICAgICAgKHByb2ZpbGUtPm1Gb3JtYXRzLnNpemUoKSAhPSAwKSkgeworCisgICAgICAgIEFMT0dWKCJsb2FkSW5wdXQoKSBhZGRpbmcgaW5wdXQgU3VwcG9ydGVkIERldmljZXMgJTA0eCIsCisgICAgICAgICAgICAgIHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkpOworCisgICAgICAgIG1JbnB1dFByb2ZpbGVzLmFkZChwcm9maWxlKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6Okh3TW9kdWxlOjpsb2FkT3V0cHV0KGNub2RlICpyb290KQoreworICAgIGNub2RlICpub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7CisKKyAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBuZXcgSU9Qcm9maWxlKFN0cmluZzgocm9vdC0+bmFtZSksIEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UsIHRoaXMpOworCisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBTQU1QTElOR19SQVRFU19UQUcpID09IDApIHsKKyAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRTYW1wbGluZ1JhdGVzKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBGT1JNQVRTX1RBRykgPT0gMCkgeworICAgICAgICAgICAgcHJvZmlsZS0+bG9hZEZvcm1hdHMoKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIENIQU5ORUxTX1RBRykgPT0gMCkgeworICAgICAgICAgICAgcHJvZmlsZS0+bG9hZE91dENoYW5uZWxzKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBERVZJQ0VTX1RBRykgPT0gMCkgeworICAgICAgICAgICAgcHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMubG9hZERldmljZXNGcm9tTmFtZSgoY2hhciAqKW5vZGUtPnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGVjbGFyZWREZXZpY2VzKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgRkxBR1NfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBwcm9maWxlLT5tRmxhZ3MgPSBwYXJzZU91dHB1dEZsYWdOYW1lcygoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTlNfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBwcm9maWxlLT5sb2FkR2FpbnMobm9kZSk7CisgICAgICAgIH0KKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgfQorICAgIEFMT0dXX0lGKHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmlzRW1wdHkoKSwKKyAgICAgICAgICAgICJsb2FkT3V0cHV0KCkgaW52YWxpZCBzdXBwb3J0ZWQgZGV2aWNlcyIpOworICAgIEFMT0dXX0lGKHByb2ZpbGUtPm1DaGFubmVsTWFza3Muc2l6ZSgpID09IDAsCisgICAgICAgICAgICAibG9hZE91dHB1dCgpIGludmFsaWQgc3VwcG9ydGVkIGNoYW5uZWwgbWFza3MiKTsKKyAgICBBTE9HV19JRihwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5zaXplKCkgPT0gMCwKKyAgICAgICAgICAgICJsb2FkT3V0cHV0KCkgaW52YWxpZCBzdXBwb3J0ZWQgc2FtcGxpbmcgcmF0ZXMiKTsKKyAgICBBTE9HV19JRihwcm9maWxlLT5tRm9ybWF0cy5zaXplKCkgPT0gMCwKKyAgICAgICAgICAgICJsb2FkT3V0cHV0KCkgaW52YWxpZCBzdXBwb3J0ZWQgZm9ybWF0cyIpOworICAgIGlmICghcHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuaXNFbXB0eSgpICYmCisgICAgICAgICAgICAocHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5zaXplKCkgIT0gMCkgJiYKKyAgICAgICAgICAgIChwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5zaXplKCkgIT0gMCkgJiYKKyAgICAgICAgICAgIChwcm9maWxlLT5tRm9ybWF0cy5zaXplKCkgIT0gMCkpIHsKKworICAgICAgICBBTE9HVigibG9hZE91dHB1dCgpIGFkZGluZyBvdXRwdXQgU3VwcG9ydGVkIERldmljZXMgJTA0eCwgbUZsYWdzICUwNHgiLAorICAgICAgICAgICAgICBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpLCBwcm9maWxlLT5tRmxhZ3MpOworCisgICAgICAgIG1PdXRwdXRQcm9maWxlcy5hZGQocHJvZmlsZSk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpId01vZHVsZTo6bG9hZERldmljZShjbm9kZSAqcm9vdCkKK3sKKyAgICBjbm9kZSAqbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOworCisgICAgYXVkaW9fZGV2aWNlc190IHR5cGUgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgICBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIERFVklDRV9UWVBFKSA9PSAwKSB7CisgICAgICAgICAgICB0eXBlID0gcGFyc2VEZXZpY2VOYW1lcygoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KKyAgICBpZiAodHlwZSA9PSBBVURJT19ERVZJQ0VfTk9ORSB8fAorICAgICAgICAgICAgKCFhdWRpb19pc19pbnB1dF9kZXZpY2UodHlwZSkgJiYgIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UodHlwZSkpKSB7CisgICAgICAgIEFMT0dXKCJsb2FkRGV2aWNlKCkgYmFkIHR5cGUgJTA4eCIsIHR5cGUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0gbmV3IERldmljZURlc2NyaXB0b3IoU3RyaW5nOChyb290LT5uYW1lKSwgdHlwZSk7CisgICAgZGV2aWNlRGVzYy0+bU1vZHVsZSA9IHRoaXM7CisKKyAgICBub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7CisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBERVZJQ0VfQUREUkVTUykgPT0gMCkgeworICAgICAgICAgICAgZGV2aWNlRGVzYy0+bUFkZHJlc3MgPSBTdHJpbmc4KChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBDSEFOTkVMU19UQUcpID09IDApIHsKKyAgICAgICAgICAgIGlmIChhdWRpb19pc19pbnB1dF9kZXZpY2UodHlwZSkpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2VEZXNjLT5sb2FkSW5DaGFubmVscygoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGV2aWNlRGVzYy0+bG9hZE91dENoYW5uZWxzKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOU19UQUcpID09IDApIHsKKyAgICAgICAgICAgIGRldmljZURlc2MtPmxvYWRHYWlucyhub2RlKTsKKyAgICAgICAgfQorICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICB9CisKKyAgICBBTE9HVigibG9hZERldmljZSgpIGFkZGluZyBkZXZpY2UgbmFtZSAlcyB0eXBlICUwOHggYWRkcmVzcyAlcyIsCisgICAgICAgICAgZGV2aWNlRGVzYy0+bU5hbWUuc3RyaW5nKCksIHR5cGUsIGRldmljZURlc2MtPm1BZGRyZXNzLnN0cmluZygpKTsKKworICAgIG1EZWNsYXJlZERldmljZXMuYWRkKGRldmljZURlc2MpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6SHdNb2R1bGU6OmR1bXAoaW50IGZkKQoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAtIG5hbWU6ICVzXG4iLCBtTmFtZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgLSBoYW5kbGU6ICVkXG4iLCBtSGFuZGxlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAtIHZlcnNpb246ICV1LiV1XG4iLCBtSGFsVmVyc2lvbiA+PiA4LCBtSGFsVmVyc2lvbiAmIDB4RkYpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICBpZiAobU91dHB1dFByb2ZpbGVzLnNpemUoKSkgeworICAgICAgICB3cml0ZShmZCwgIiAgLSBvdXRwdXRzOlxuIiwgc3RybGVuKCIgIC0gb3V0cHV0czpcbiIpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICBvdXRwdXQgJXp1OlxuIiwgaSk7CisgICAgICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgICAgICAgICBtT3V0cHV0UHJvZmlsZXNbaV0tPmR1bXAoZmQpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChtSW5wdXRQcm9maWxlcy5zaXplKCkpIHsKKyAgICAgICAgd3JpdGUoZmQsICIgIC0gaW5wdXRzOlxuIiwgc3RybGVuKCIgIC0gaW5wdXRzOlxuIikpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dFByb2ZpbGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgaW5wdXQgJXp1OlxuIiwgaSk7CisgICAgICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgICAgICAgICBtSW5wdXRQcm9maWxlc1tpXS0+ZHVtcChmZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1EZWNsYXJlZERldmljZXMuc2l6ZSgpKSB7CisgICAgICAgIHdyaXRlKGZkLCAiICAtIGRldmljZXM6XG4iLCBzdHJsZW4oIiAgLSBkZXZpY2VzOlxuIikpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1EZWNsYXJlZERldmljZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIG1EZWNsYXJlZERldmljZXNbaV0tPmR1bXAoZmQsIDQsIGkpOworICAgICAgICB9CisgICAgfQorfQorCisvLyAtLS0gQXVkaW9Qb3J0IGNsYXNzIGltcGxlbWVudGF0aW9uCisKKworQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OkF1ZGlvUG9ydChjb25zdCBTdHJpbmc4JiBuYW1lLCBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAorICAgICAgICAgIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsIGNvbnN0IHNwPEh3TW9kdWxlPiYgbW9kdWxlKSA6CisgICAgbU5hbWUobmFtZSksIG1UeXBlKHR5cGUpLCBtUm9sZShyb2xlKSwgbU1vZHVsZShtb2R1bGUpLCBtRmxhZ3MoMCkKK3sKKyAgICBtVXNlSW5DaGFubmVsTWFzayA9ICgodHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSAmJiAocm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKCh0eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpICYmIChyb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LKSk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OnRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdAoreworICAgIHBvcnQtPnJvbGUgPSBtUm9sZTsKKyAgICBwb3J0LT50eXBlID0gbVR5cGU7CisgICAgdW5zaWduZWQgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IG1TYW1wbGluZ1JhdGVzLnNpemUoKSAmJiBpIDwgQVVESU9fUE9SVF9NQVhfU0FNUExJTkdfUkFURVM7IGkrKykgeworICAgICAgICBpZiAobVNhbXBsaW5nUmF0ZXNbaV0gIT0gMCkgeworICAgICAgICAgICAgcG9ydC0+c2FtcGxlX3JhdGVzW2ldID0gbVNhbXBsaW5nUmF0ZXNbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgcG9ydC0+bnVtX3NhbXBsZV9yYXRlcyA9IGk7CisgICAgZm9yIChpID0gMDsgaSA8IG1DaGFubmVsTWFza3Muc2l6ZSgpICYmIGkgPCBBVURJT19QT1JUX01BWF9DSEFOTkVMX01BU0tTOyBpKyspIHsKKyAgICAgICAgaWYgKG1DaGFubmVsTWFza3NbaV0gIT0gMCkgeworICAgICAgICAgICAgcG9ydC0+Y2hhbm5lbF9tYXNrc1tpXSA9IG1DaGFubmVsTWFza3NbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgcG9ydC0+bnVtX2NoYW5uZWxfbWFza3MgPSBpOworICAgIGZvciAoaSA9IDA7IGkgPCBtRm9ybWF0cy5zaXplKCkgJiYgaSA8IEFVRElPX1BPUlRfTUFYX0ZPUk1BVFM7IGkrKykgeworICAgICAgICBpZiAobUZvcm1hdHNbaV0gIT0gMCkgeworICAgICAgICAgICAgcG9ydC0+Zm9ybWF0c1tpXSA9IG1Gb3JtYXRzW2ldOworICAgICAgICB9CisgICAgfQorICAgIHBvcnQtPm51bV9mb3JtYXRzID0gaTsKKworICAgIEFMT0dWKCJBdWRpb1BvcnQ6OnRvQXVkaW9Qb3J0KCkgbnVtIGdhaW5zICV6dSIsIG1HYWlucy5zaXplKCkpOworCisgICAgZm9yIChpID0gMDsgaSA8IG1HYWlucy5zaXplKCkgJiYgaSA8IEFVRElPX1BPUlRfTUFYX0dBSU5TOyBpKyspIHsKKyAgICAgICAgcG9ydC0+Z2FpbnNbaV0gPSBtR2FpbnNbaV0tPm1HYWluOworICAgIH0KKyAgICBwb3J0LT5udW1fZ2FpbnMgPSBpOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjppbXBvcnRBdWRpb1BvcnQoY29uc3Qgc3A8QXVkaW9Qb3J0PiBwb3J0KSB7CisgICAgZm9yIChzaXplX3QgayA9IDAgOyBrIDwgcG9ydC0+bVNhbXBsaW5nUmF0ZXMuc2l6ZSgpIDsgaysrKSB7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IHJhdGUgPSBwb3J0LT5tU2FtcGxpbmdSYXRlcy5pdGVtQXQoayk7CisgICAgICAgIGlmIChyYXRlICE9IDApIHsgLy8gc2tpcCAiZHluYW1pYyIgcmF0ZXMKKyAgICAgICAgICAgIGJvb2wgaGFzUmF0ZSA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChzaXplX3QgbCA9IDAgOyBsIDwgbVNhbXBsaW5nUmF0ZXMuc2l6ZSgpIDsgbCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHJhdGUgPT0gbVNhbXBsaW5nUmF0ZXMuaXRlbUF0KGwpKSB7CisgICAgICAgICAgICAgICAgICAgIGhhc1JhdGUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWhhc1JhdGUpIHsgLy8gbmV2ZXIgaW1wb3J0IGEgc2FtcGxpbmcgcmF0ZSB0d2ljZQorICAgICAgICAgICAgICAgIG1TYW1wbGluZ1JhdGVzLmFkZChyYXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKHNpemVfdCBrID0gMCA7IGsgPCBwb3J0LT5tQ2hhbm5lbE1hc2tzLnNpemUoKSA7IGsrKykgeworICAgICAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBtYXNrID0gcG9ydC0+bUNoYW5uZWxNYXNrcy5pdGVtQXQoayk7CisgICAgICAgIGlmIChtYXNrICE9IDApIHsgLy8gc2tpcCAiZHluYW1pYyIgbWFza3MKKyAgICAgICAgICAgIGJvb2wgaGFzTWFzayA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChzaXplX3QgbCA9IDAgOyBsIDwgbUNoYW5uZWxNYXNrcy5zaXplKCkgOyBsKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobWFzayA9PSBtQ2hhbm5lbE1hc2tzLml0ZW1BdChsKSkgeworICAgICAgICAgICAgICAgICAgICBoYXNNYXNrID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFoYXNNYXNrKSB7IC8vIG5ldmVyIGltcG9ydCBhIGNoYW5uZWwgbWFzayB0d2ljZQorICAgICAgICAgICAgICAgIG1DaGFubmVsTWFza3MuYWRkKG1hc2spOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGZvciAoc2l6ZV90IGsgPSAwIDsgayA8IHBvcnQtPm1Gb3JtYXRzLnNpemUoKSA7IGsrKykgeworICAgICAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBwb3J0LT5tRm9ybWF0cy5pdGVtQXQoayk7CisgICAgICAgIGlmIChmb3JtYXQgIT0gMCkgeyAvLyBza2lwICJkeW5hbWljIiBmb3JtYXRzCisgICAgICAgICAgICBib29sIGhhc0Zvcm1hdCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChzaXplX3QgbCA9IDAgOyBsIDwgbUZvcm1hdHMuc2l6ZSgpIDsgbCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGZvcm1hdCA9PSBtRm9ybWF0cy5pdGVtQXQobCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaGFzRm9ybWF0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFoYXNGb3JtYXQpIHsgLy8gbmV2ZXIgaW1wb3J0IGEgY2hhbm5lbCBtYXNrIHR3aWNlCisgICAgICAgICAgICAgICAgbUZvcm1hdHMuYWRkKGZvcm1hdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OmNsZWFyQ2FwYWJpbGl0aWVzKCkgeworICAgIG1DaGFubmVsTWFza3MuY2xlYXIoKTsKKyAgICBtRm9ybWF0cy5jbGVhcigpOworICAgIG1TYW1wbGluZ1JhdGVzLmNsZWFyKCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OmxvYWRTYW1wbGluZ1JhdGVzKGNoYXIgKm5hbWUpCit7CisgICAgY2hhciAqc3RyID0gc3RydG9rKG5hbWUsICJ8Iik7CisKKyAgICAvLyBieSBjb252ZW50aW9uLCAiMCcgaW4gdGhlIGZpcnN0IGVudHJ5IGluIG1TYW1wbGluZ1JhdGVzIGluZGljYXRlcyB0aGUgc3VwcG9ydGVkIHNhbXBsaW5nCisgICAgLy8gcmF0ZXMgc2hvdWxkIGJlIHJlYWQgZnJvbSB0aGUgb3V0cHV0IHN0cmVhbSBhZnRlciBpdCBpcyBvcGVuZWQgZm9yIHRoZSBmaXJzdCB0aW1lCisgICAgaWYgKHN0ciAhPSBOVUxMICYmIHN0cmNtcChzdHIsIERZTkFNSUNfVkFMVUVfVEFHKSA9PSAwKSB7CisgICAgICAgIG1TYW1wbGluZ1JhdGVzLmFkZCgwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdoaWxlIChzdHIgIT0gTlVMTCkgeworICAgICAgICB1aW50MzJfdCByYXRlID0gYXRvaShzdHIpOworICAgICAgICBpZiAocmF0ZSAhPSAwKSB7CisgICAgICAgICAgICBBTE9HVigibG9hZFNhbXBsaW5nUmF0ZXMoKSBhZGRpbmcgcmF0ZSAlZCIsIHJhdGUpOworICAgICAgICAgICAgbVNhbXBsaW5nUmF0ZXMuYWRkKHJhdGUpOworICAgICAgICB9CisgICAgICAgIHN0ciA9IHN0cnRvayhOVUxMLCAifCIpOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6bG9hZEZvcm1hdHMoY2hhciAqbmFtZSkKK3sKKyAgICBjaGFyICpzdHIgPSBzdHJ0b2sobmFtZSwgInwiKTsKKworICAgIC8vIGJ5IGNvbnZlbnRpb24sICIwJyBpbiB0aGUgZmlyc3QgZW50cnkgaW4gbUZvcm1hdHMgaW5kaWNhdGVzIHRoZSBzdXBwb3J0ZWQgZm9ybWF0cworICAgIC8vIHNob3VsZCBiZSByZWFkIGZyb20gdGhlIG91dHB1dCBzdHJlYW0gYWZ0ZXIgaXQgaXMgb3BlbmVkIGZvciB0aGUgZmlyc3QgdGltZQorICAgIGlmIChzdHIgIT0gTlVMTCAmJiBzdHJjbXAoc3RyLCBEWU5BTUlDX1ZBTFVFX1RBRykgPT0gMCkgeworICAgICAgICBtRm9ybWF0cy5hZGQoQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgd2hpbGUgKHN0ciAhPSBOVUxMKSB7CisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IChhdWRpb19mb3JtYXRfdClzdHJpbmdUb0VudW0oc0Zvcm1hdE5hbWVUb0VudW1UYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNGb3JtYXROYW1lVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cik7CisgICAgICAgIGlmIChmb3JtYXQgIT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKKyAgICAgICAgICAgIG1Gb3JtYXRzLmFkZChmb3JtYXQpOworICAgICAgICB9CisgICAgICAgIHN0ciA9IHN0cnRvayhOVUxMLCAifCIpOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6bG9hZEluQ2hhbm5lbHMoY2hhciAqbmFtZSkKK3sKKyAgICBjb25zdCBjaGFyICpzdHIgPSBzdHJ0b2sobmFtZSwgInwiKTsKKworICAgIEFMT0dWKCJsb2FkSW5DaGFubmVscygpICVzIiwgbmFtZSk7CisKKyAgICBpZiAoc3RyICE9IE5VTEwgJiYgc3RyY21wKHN0ciwgRFlOQU1JQ19WQUxVRV9UQUcpID09IDApIHsKKyAgICAgICAgbUNoYW5uZWxNYXNrcy5hZGQoMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB3aGlsZSAoc3RyICE9IE5VTEwpIHsKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPQorICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdClzdHJpbmdUb0VudW0oc0luQ2hhbm5lbHNOYW1lVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNJbkNoYW5uZWxzTmFtZVRvRW51bVRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cik7CisgICAgICAgIGlmIChjaGFubmVsTWFzayAhPSAwKSB7CisgICAgICAgICAgICBBTE9HVigibG9hZEluQ2hhbm5lbHMoKSBhZGRpbmcgY2hhbm5lbE1hc2sgJTA0eCIsIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgIG1DaGFubmVsTWFza3MuYWRkKGNoYW5uZWxNYXNrKTsKKyAgICAgICAgfQorICAgICAgICBzdHIgPSBzdHJ0b2soTlVMTCwgInwiKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OmxvYWRPdXRDaGFubmVscyhjaGFyICpuYW1lKQoreworICAgIGNvbnN0IGNoYXIgKnN0ciA9IHN0cnRvayhuYW1lLCAifCIpOworCisgICAgQUxPR1YoImxvYWRPdXRDaGFubmVscygpICVzIiwgbmFtZSk7CisKKyAgICAvLyBieSBjb252ZW50aW9uLCAiMCcgaW4gdGhlIGZpcnN0IGVudHJ5IGluIG1DaGFubmVsTWFza3MgaW5kaWNhdGVzIHRoZSBzdXBwb3J0ZWQgY2hhbm5lbAorICAgIC8vIG1hc2tzIHNob3VsZCBiZSByZWFkIGZyb20gdGhlIG91dHB1dCBzdHJlYW0gYWZ0ZXIgaXQgaXMgb3BlbmVkIGZvciB0aGUgZmlyc3QgdGltZQorICAgIGlmIChzdHIgIT0gTlVMTCAmJiBzdHJjbXAoc3RyLCBEWU5BTUlDX1ZBTFVFX1RBRykgPT0gMCkgeworICAgICAgICBtQ2hhbm5lbE1hc2tzLmFkZCgwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdoaWxlIChzdHIgIT0gTlVMTCkgeworICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9CisgICAgICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KXN0cmluZ1RvRW51bShzT3V0Q2hhbm5lbHNOYW1lVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNPdXRDaGFubmVsc05hbWVUb0VudW1UYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIpOworICAgICAgICBpZiAoY2hhbm5lbE1hc2sgIT0gMCkgeworICAgICAgICAgICAgbUNoYW5uZWxNYXNrcy5hZGQoY2hhbm5lbE1hc2spOworICAgICAgICB9CisgICAgICAgIHN0ciA9IHN0cnRvayhOVUxMLCAifCIpOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK2F1ZGlvX2dhaW5fbW9kZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0Ojpsb2FkR2Fpbk1vZGUoY2hhciAqbmFtZSkKK3sKKyAgICBjb25zdCBjaGFyICpzdHIgPSBzdHJ0b2sobmFtZSwgInwiKTsKKworICAgIEFMT0dWKCJsb2FkR2Fpbk1vZGUoKSAlcyIsIG5hbWUpOworICAgIGF1ZGlvX2dhaW5fbW9kZV90IG1vZGUgPSAwOworICAgIHdoaWxlIChzdHIgIT0gTlVMTCkgeworICAgICAgICBtb2RlIHw9IChhdWRpb19nYWluX21vZGVfdClzdHJpbmdUb0VudW0oc0dhaW5Nb2RlTmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzR2Fpbk1vZGVOYW1lVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKTsKKyAgICAgICAgc3RyID0gc3RydG9rKE5VTEwsICJ8Iik7CisgICAgfQorICAgIHJldHVybiBtb2RlOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0Ojpsb2FkR2Fpbihjbm9kZSAqcm9vdCwgaW50IGluZGV4KQoreworICAgIGNub2RlICpub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7CisKKyAgICBzcDxBdWRpb0dhaW4+IGdhaW4gPSBuZXcgQXVkaW9HYWluKGluZGV4LCBtVXNlSW5DaGFubmVsTWFzayk7CisKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgICBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fTU9ERSkgPT0gMCkgeworICAgICAgICAgICAgZ2Fpbi0+bUdhaW4ubW9kZSA9IGxvYWRHYWluTW9kZSgoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9DSEFOTkVMUykgPT0gMCkgeworICAgICAgICAgICAgaWYgKG1Vc2VJbkNoYW5uZWxNYXNrKSB7CisgICAgICAgICAgICAgICAgZ2Fpbi0+bUdhaW4uY2hhbm5lbF9tYXNrID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdClzdHJpbmdUb0VudW0oc0luQ2hhbm5lbHNOYW1lVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0luQ2hhbm5lbHNOYW1lVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZ2Fpbi0+bUdhaW4uY2hhbm5lbF9tYXNrID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdClzdHJpbmdUb0VudW0oc091dENoYW5uZWxzTmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNPdXRDaGFubmVsc05hbWVUb0VudW1UYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX01JTl9WQUxVRSkgPT0gMCkgeworICAgICAgICAgICAgZ2Fpbi0+bUdhaW4ubWluX3ZhbHVlID0gYXRvaSgoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9NQVhfVkFMVUUpID09IDApIHsKKyAgICAgICAgICAgIGdhaW4tPm1HYWluLm1heF92YWx1ZSA9IGF0b2koKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fREVGQVVMVF9WQUxVRSkgPT0gMCkgeworICAgICAgICAgICAgZ2Fpbi0+bUdhaW4uZGVmYXVsdF92YWx1ZSA9IGF0b2koKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fU1RFUF9WQUxVRSkgPT0gMCkgeworICAgICAgICAgICAgZ2Fpbi0+bUdhaW4uc3RlcF92YWx1ZSA9IGF0b2koKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fTUlOX1JBTVBfTVMpID09IDApIHsKKyAgICAgICAgICAgIGdhaW4tPm1HYWluLm1pbl9yYW1wX21zID0gYXRvaSgoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9NQVhfUkFNUF9NUykgPT0gMCkgeworICAgICAgICAgICAgZ2Fpbi0+bUdhaW4ubWF4X3JhbXBfbXMgPSBhdG9pKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICB9CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KKworICAgIEFMT0dWKCJsb2FkR2FpbigpIGFkZGluZyBuZXcgZ2FpbiBtb2RlICUwOHggY2hhbm5lbCBtYXNrICUwOHggbWluIG1CICVkIG1heCBtQiAlZCIsCisgICAgICAgICAgZ2Fpbi0+bUdhaW4ubW9kZSwgZ2Fpbi0+bUdhaW4uY2hhbm5lbF9tYXNrLCBnYWluLT5tR2Fpbi5taW5fdmFsdWUsIGdhaW4tPm1HYWluLm1heF92YWx1ZSk7CisKKyAgICBpZiAoZ2Fpbi0+bUdhaW4ubW9kZSA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUdhaW5zLmFkZChnYWluKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6bG9hZEdhaW5zKGNub2RlICpyb290KQoreworICAgIGNub2RlICpub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7CisgICAgaW50IGluZGV4ID0gMDsKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgICBBTE9HVigibG9hZEdhaW5zKCkgbG9hZGluZyBnYWluICVzIiwgbm9kZS0+bmFtZSk7CisgICAgICAgIGxvYWRHYWluKG5vZGUsIGluZGV4KyspOworICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpjaGVja0V4YWN0U2FtcGxpbmdSYXRlKHVpbnQzMl90IHNhbXBsaW5nUmF0ZSkgY29uc3QKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TYW1wbGluZ1JhdGVzLnNpemUoKTsgaSArKykgeworICAgICAgICBpZiAobVNhbXBsaW5nUmF0ZXNbaV0gPT0gc2FtcGxpbmdSYXRlKSB7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OmNoZWNrQ29tcGF0aWJsZVNhbXBsaW5nUmF0ZSh1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgIHVpbnQzMl90ICp1cGRhdGVkU2FtcGxpbmdSYXRlKSBjb25zdAoreworICAgIC8vIFNlYXJjaCBmb3IgdGhlIGNsb3Nlc3Qgc3VwcG9ydGVkIHNhbXBsaW5nIHJhdGUgdGhhdCBpcyBhYm92ZSAocHJlZmVycmVkKQorICAgIC8vIG9yIGJlbG93IChhY2NlcHRhYmxlKSB0aGUgZGVzaXJlZCBzYW1wbGluZyByYXRlLCB3aXRoaW4gYSBwZXJtaXR0ZWQgcmF0aW8uCisgICAgLy8gVGhlIHNhbXBsaW5nIHJhdGVzIGRvIG5vdCBuZWVkIHRvIGJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIuCisgICAgc3NpemVfdCBtYXhCZWxvdyA9IC0xOworICAgIHNzaXplX3QgbWluQWJvdmUgPSAtMTsKKyAgICB1aW50MzJfdCBjYW5kaWRhdGU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2FtcGxpbmdSYXRlcy5zaXplKCk7IGkrKykgeworICAgICAgICBjYW5kaWRhdGUgPSBtU2FtcGxpbmdSYXRlc1tpXTsKKyAgICAgICAgaWYgKGNhbmRpZGF0ZSA9PSBzYW1wbGluZ1JhdGUpIHsKKyAgICAgICAgICAgIGlmICh1cGRhdGVkU2FtcGxpbmdSYXRlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAqdXBkYXRlZFNhbXBsaW5nUmF0ZSA9IGNhbmRpZGF0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICAvLyBjYW5kaWRhdGUgPCBkZXNpcmVkCisgICAgICAgIGlmIChjYW5kaWRhdGUgPCBzYW1wbGluZ1JhdGUpIHsKKyAgICAgICAgICAgIGlmIChtYXhCZWxvdyA8IDAgfHwgY2FuZGlkYXRlID4gbVNhbXBsaW5nUmF0ZXNbbWF4QmVsb3ddKSB7CisgICAgICAgICAgICAgICAgbWF4QmVsb3cgPSBpOworICAgICAgICAgICAgfQorICAgICAgICAvLyBjYW5kaWRhdGUgPiBkZXNpcmVkCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobWluQWJvdmUgPCAwIHx8IGNhbmRpZGF0ZSA8IG1TYW1wbGluZ1JhdGVzW21pbkFib3ZlXSkgeworICAgICAgICAgICAgICAgIG1pbkFib3ZlID0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBUaGlzIHVzZXMgaGFyZC1jb2RlZCBrbm93bGVkZ2UgYWJvdXQgQXVkaW9GbGluZ2VyIHJlc2FtcGxpbmcgcmF0aW9zLgorICAgIC8vIFRPRE8gTW92ZSB0aGVzZSBhc3N1bXB0aW9ucyBvdXQuCisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNYXhEb3duU2FtcGxlUmF0aW8gPSA2OyAgLy8gYmV5b25kIHRoaXMgYWxpYXNpbmcgb2NjdXJzCisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNYXhVcFNhbXBsZVJhdGlvID0gMjU2OyAgLy8gYmV5b25kIHRoaXMgc2FtcGxlIHJhdGUgaW5hY2N1cmFjaWVzIG9jY3VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVlIHRvIGFwcHJveGltYXRpb24gYnkgYW4gaW50MzJfdCBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwaGFzZSBpbmNyZW1lbnRzCisgICAgLy8gUHJlZmVyIHRvIGRvd24tc2FtcGxlIGZyb20gYSBoaWdoZXIgc2FtcGxpbmcgcmF0ZSwgYXMgd2UgZ2V0IHRoZSBkZXNpcmVkIGZyZXF1ZW5jeSBzcGVjdHJ1bS4KKyAgICBpZiAobWluQWJvdmUgPj0gMCkgeworICAgICAgICBjYW5kaWRhdGUgPSBtU2FtcGxpbmdSYXRlc1ttaW5BYm92ZV07CisgICAgICAgIGlmIChjYW5kaWRhdGUgLyBrTWF4RG93blNhbXBsZVJhdGlvIDw9IHNhbXBsaW5nUmF0ZSkgeworICAgICAgICAgICAgaWYgKHVwZGF0ZWRTYW1wbGluZ1JhdGUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICp1cGRhdGVkU2FtcGxpbmdSYXRlID0gY2FuZGlkYXRlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorICAgIC8vIEJ1dCBpZiB3ZSBoYXZlIHRvIHVwLXNhbXBsZSBmcm9tIGEgbG93ZXIgc2FtcGxpbmcgcmF0ZSwgdGhhdCdzIE9LLgorICAgIGlmIChtYXhCZWxvdyA+PSAwKSB7CisgICAgICAgIGNhbmRpZGF0ZSA9IG1TYW1wbGluZ1JhdGVzW21heEJlbG93XTsKKyAgICAgICAgaWYgKGNhbmRpZGF0ZSAqIGtNYXhVcFNhbXBsZVJhdGlvID49IHNhbXBsaW5nUmF0ZSkgeworICAgICAgICAgICAgaWYgKHVwZGF0ZWRTYW1wbGluZ1JhdGUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICp1cGRhdGVkU2FtcGxpbmdSYXRlID0gY2FuZGlkYXRlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorICAgIC8vIGxlYXZlIHVwZGF0ZWRTYW1wbGluZ1JhdGUgdW5tb2RpZmllZAorICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpjaGVja0V4YWN0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2spIGNvbnN0Cit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ2hhbm5lbE1hc2tzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtQ2hhbm5lbE1hc2tzW2ldID09IGNoYW5uZWxNYXNrKSB7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OmNoZWNrQ29tcGF0aWJsZUNoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKQorICAgICAgICBjb25zdAoreworICAgIGNvbnN0IGJvb2wgaXNSZWNvcmRUaHJlYWQgPSBtVHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYICYmIG1Sb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNoYW5uZWxNYXNrcy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgLy8gRklYTUUgRG9lcyBub3QgaGFuZGxlIG11bHRpLWNoYW5uZWwgYXV0b21hdGljIGNvbnZlcnNpb25zIHlldAorICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBzdXBwb3J0ZWQgPSBtQ2hhbm5lbE1hc2tzW2ldOworICAgICAgICBpZiAoc3VwcG9ydGVkID09IGNoYW5uZWxNYXNrKSB7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzUmVjb3JkVGhyZWFkKSB7CisgICAgICAgICAgICAvLyBUaGlzIHVzZXMgaGFyZC1jb2RlZCBrbm93bGVkZ2UgdGhhdCBBdWRpb0ZsaW5nZXIgY2FuIHNpbGVudGx5IGRvd24tbWl4IGFuZCB1cC1taXguCisgICAgICAgICAgICAvLyBGSVhNRSBBYnN0cmFjdCB0aGlzIG91dCB0byBhIHRhYmxlLgorICAgICAgICAgICAgaWYgKCgoc3VwcG9ydGVkID09IEFVRElPX0NIQU5ORUxfSU5fRlJPTlRfQkFDSyB8fCBzdXBwb3J0ZWQgPT0gQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8pCisgICAgICAgICAgICAgICAgICAgICYmIGNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfSU5fTU9OTykgfHwKKyAgICAgICAgICAgICAgICAoc3VwcG9ydGVkID09IEFVRElPX0NIQU5ORUxfSU5fTU9OTyAmJiAoY2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9JTl9GUk9OVF9CQUNLCisgICAgICAgICAgICAgICAgICAgIHx8IGNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OmNoZWNrRm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3QKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Gb3JtYXRzLnNpemUoKTsgaSArKykgeworICAgICAgICBpZiAobUZvcm1hdHNbaV0gPT0gZm9ybWF0KSB7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworCit1aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6cGlja1NhbXBsaW5nUmF0ZSgpIGNvbnN0Cit7CisgICAgLy8gc3BlY2lhbCBjYXNlIGZvciB1bmluaXRpYWxpemVkIGR5bmFtaWMgcHJvZmlsZQorICAgIGlmIChtU2FtcGxpbmdSYXRlcy5zaXplKCkgPT0gMSAmJiBtU2FtcGxpbmdSYXRlc1swXSA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIEZvciBkaXJlY3Qgb3V0cHV0cywgcGljayBtaW5pbXVtIHNhbXBsaW5nIHJhdGU6IHRoaXMgaGVscHMgZW5zdXJpbmcgdGhhdCB0aGUKKyAgICAvLyBjaGFubmVsIGNvdW50IC8gc2FtcGxpbmcgcmF0ZSBjb21iaW5hdGlvbiBjaG9zZW4gd2lsbCBiZSBzdXBwb3J0ZWQgYnkgdGhlIGNvbm5lY3RlZAorICAgIC8vIHNpbmsKKyAgICBpZiAoKG1UeXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpICYmIChtUm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSAmJgorICAgICAgICAgICAgKG1GbGFncyAmIChBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QgfCBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSkpIHsKKyAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gVUlOVF9NQVg7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNhbXBsaW5nUmF0ZXMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgICAgICBpZiAoKG1TYW1wbGluZ1JhdGVzW2ldIDwgc2FtcGxpbmdSYXRlKSAmJiAobVNhbXBsaW5nUmF0ZXNbaV0gPiAwKSkgeworICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSA9IG1TYW1wbGluZ1JhdGVzW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoc2FtcGxpbmdSYXRlID09IFVJTlRfTUFYKSA/IDAgOiBzYW1wbGluZ1JhdGU7CisgICAgfQorCisgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gMDsKKyAgICB1aW50MzJfdCBtYXhSYXRlID0gTUFYX01JWEVSX1NBTVBMSU5HX1JBVEU7CisKKyAgICAvLyBGb3IgbWl4ZWQgb3V0cHV0IGFuZCBpbnB1dHMsIHVzZSBtYXggbWl4ZXIgc2FtcGxpbmcgcmF0ZXMuIERvIG5vdAorICAgIC8vIGxpbWl0IHNhbXBsaW5nIHJhdGUgb3RoZXJ3aXNlCisgICAgaWYgKG1UeXBlICE9IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKKyAgICAgICAgbWF4UmF0ZSA9IFVJTlRfTUFYOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TYW1wbGluZ1JhdGVzLnNpemUoKTsgaSArKykgeworICAgICAgICBpZiAoKG1TYW1wbGluZ1JhdGVzW2ldID4gc2FtcGxpbmdSYXRlKSAmJiAobVNhbXBsaW5nUmF0ZXNbaV0gPD0gbWF4UmF0ZSkpIHsKKyAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSA9IG1TYW1wbGluZ1JhdGVzW2ldOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzYW1wbGluZ1JhdGU7Cit9CisKK2F1ZGlvX2NoYW5uZWxfbWFza190IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpwaWNrQ2hhbm5lbE1hc2soKSBjb25zdAoreworICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgdW5pbml0aWFsaXplZCBkeW5hbWljIHByb2ZpbGUKKyAgICBpZiAobUNoYW5uZWxNYXNrcy5zaXplKCkgPT0gMSAmJiBtQ2hhbm5lbE1hc2tzWzBdID09IDApIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX0NIQU5ORUxfTk9ORTsKKyAgICB9CisgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7CisKKyAgICAvLyBGb3IgZGlyZWN0IG91dHB1dHMsIHBpY2sgbWluaW11bSBjaGFubmVsIGNvdW50OiB0aGlzIGhlbHBzIGVuc3VyaW5nIHRoYXQgdGhlCisgICAgLy8gY2hhbm5lbCBjb3VudCAvIHNhbXBsaW5nIHJhdGUgY29tYmluYXRpb24gY2hvc2VuIHdpbGwgYmUgc3VwcG9ydGVkIGJ5IHRoZSBjb25uZWN0ZWQKKyAgICAvLyBzaW5rCisgICAgaWYgKChtVHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSAmJiAobVJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkgJiYKKyAgICAgICAgICAgIChtRmxhZ3MgJiAoQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUIHwgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkpKSB7CisgICAgICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IFVJTlRfTUFYOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DaGFubmVsTWFza3Muc2l6ZSgpOyBpICsrKSB7CisgICAgICAgICAgICB1aW50MzJfdCBjbmxDb3VudDsKKyAgICAgICAgICAgIGlmIChtVXNlSW5DaGFubmVsTWFzaykgeworICAgICAgICAgICAgICAgIGNubENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2sobUNoYW5uZWxNYXNrc1tpXSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNubENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1DaGFubmVsTWFza3NbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChjbmxDb3VudCA8IGNoYW5uZWxDb3VudCkgJiYgKGNubENvdW50ID4gMCkpIHsKKyAgICAgICAgICAgICAgICBjaGFubmVsTWFzayA9IG1DaGFubmVsTWFza3NbaV07CisgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50ID0gY25sQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNoYW5uZWxNYXNrOworICAgIH0KKworICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IDA7CisgICAgdWludDMyX3QgbWF4Q291bnQgPSBNQVhfTUlYRVJfQ0hBTk5FTF9DT1VOVDsKKworICAgIC8vIEZvciBtaXhlZCBvdXRwdXQgYW5kIGlucHV0cywgdXNlIG1heCBtaXhlciBjaGFubmVsIGNvdW50LiBEbyBub3QKKyAgICAvLyBsaW1pdCBjaGFubmVsIGNvdW50IG90aGVyd2lzZQorICAgIGlmIChtVHlwZSAhPSBBVURJT19QT1JUX1RZUEVfTUlYKSB7CisgICAgICAgIG1heENvdW50ID0gVUlOVF9NQVg7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNoYW5uZWxNYXNrcy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgdWludDMyX3QgY25sQ291bnQ7CisgICAgICAgIGlmIChtVXNlSW5DaGFubmVsTWFzaykgeworICAgICAgICAgICAgY25sQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhtQ2hhbm5lbE1hc2tzW2ldKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNubENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1DaGFubmVsTWFza3NbaV0pOworICAgICAgICB9CisgICAgICAgIGlmICgoY25sQ291bnQgPiBjaGFubmVsQ291bnQpICYmIChjbmxDb3VudCA8PSBtYXhDb3VudCkpIHsKKyAgICAgICAgICAgIGNoYW5uZWxNYXNrID0gbUNoYW5uZWxNYXNrc1tpXTsKKyAgICAgICAgICAgIGNoYW5uZWxDb3VudCA9IGNubENvdW50OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjaGFubmVsTWFzazsKK30KKworLyogZm9ybWF0IGluIG9yZGVyIG9mIGluY3JlYXNpbmcgcHJlZmVyZW5jZSAqLworY29uc3QgYXVkaW9fZm9ybWF0X3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OnNQY21Gb3JtYXRDb21wYXJlVGFibGVbXSA9IHsKKyAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQsCisgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAorICAgICAgICBBVURJT19GT1JNQVRfUENNXzhfMjRfQklULAorICAgICAgICBBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQsCisgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMzJfQklULAorICAgICAgICBBVURJT19GT1JNQVRfUENNX0ZMT0FULAorfTsKKworaW50IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0Ojpjb21wYXJlRm9ybWF0cyhhdWRpb19mb3JtYXRfdCBmb3JtYXQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQyKQoreworICAgIC8vIE5PVEU6IEFVRElPX0ZPUk1BVF9JTlZBTElEIGlzIGFsc28gY29uc2lkZXJlZCBub3QgUENNIGFuZCB3aWxsIGJlIGNvbXBhcmVkIGVxdWFsIHRvIGFueQorICAgIC8vIGNvbXByZXNzZWQgZm9ybWF0IGFuZCBiZXR0ZXIgdGhhbiBhbnkgUENNIGZvcm1hdC4gVGhpcyBpcyBieSBkZXNpZ24gb2YgcGlja0Zvcm1hdCgpCisgICAgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdDEpKSB7CisgICAgICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQyKSkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQyKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaW50IGluZGV4MSA9IC0xLCBpbmRleDIgPSAtMTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsKKyAgICAgICAgICAgIChpIDwgQVJSQVlfU0laRShzUGNtRm9ybWF0Q29tcGFyZVRhYmxlKSkgJiYgKChpbmRleDEgPT0gLTEpIHx8IChpbmRleDIgPT0gLTEpKTsKKyAgICAgICAgICAgIGkgKyspIHsKKyAgICAgICAgaWYgKHNQY21Gb3JtYXRDb21wYXJlVGFibGVbaV0gPT0gZm9ybWF0MSkgeworICAgICAgICAgICAgaW5kZXgxID0gaTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc1BjbUZvcm1hdENvbXBhcmVUYWJsZVtpXSA9PSBmb3JtYXQyKSB7CisgICAgICAgICAgICBpbmRleDIgPSBpOworICAgICAgICB9CisgICAgfQorICAgIC8vIGZvcm1hdDEgbm90IGZvdW5kID0+IGluZGV4MSA8IDAgPT4gZm9ybWF0MiA+IGZvcm1hdDEKKyAgICAvLyBmb3JtYXQyIG5vdCBmb3VuZCA9PiBpbmRleDIgPCAwID0+IGZvcm1hdDIgPCBmb3JtYXQxCisgICAgcmV0dXJuIGluZGV4MSAtIGluZGV4MjsKK30KKworYXVkaW9fZm9ybWF0X3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OnBpY2tGb3JtYXQoKSBjb25zdAoreworICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgdW5pbml0aWFsaXplZCBkeW5hbWljIHByb2ZpbGUKKyAgICBpZiAobUZvcm1hdHMuc2l6ZSgpID09IDEgJiYgbUZvcm1hdHNbMF0gPT0gMCkgeworICAgICAgICByZXR1cm4gQVVESU9fRk9STUFUX0RFRkFVTFQ7CisgICAgfQorCisgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQ7CisgICAgYXVkaW9fZm9ybWF0X3QgYmVzdEZvcm1hdCA9CisgICAgICAgICAgICBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6c1BjbUZvcm1hdENvbXBhcmVUYWJsZVsKKyAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpzUGNtRm9ybWF0Q29tcGFyZVRhYmxlKSAtIDFdOworICAgIC8vIEZvciBtaXhlZCBvdXRwdXQgYW5kIGlucHV0cywgdXNlIGJlc3QgbWl4ZXIgb3V0cHV0IGZvcm1hdC4gRG8gbm90CisgICAgLy8gbGltaXQgZm9ybWF0IG90aGVyd2lzZQorICAgIGlmICgobVR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX01JWCkgfHwKKyAgICAgICAgICAgICgobVJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkgJiYKKyAgICAgICAgICAgICAoKChtRmxhZ3MgJiAoQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUIHwgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkpICE9IDApKSkpIHsKKyAgICAgICAgYmVzdEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZvcm1hdHMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIGlmICgoY29tcGFyZUZvcm1hdHMobUZvcm1hdHNbaV0sIGZvcm1hdCkgPiAwKSAmJgorICAgICAgICAgICAgICAgIChjb21wYXJlRm9ybWF0cyhtRm9ybWF0c1tpXSwgYmVzdEZvcm1hdCkgPD0gMCkpIHsKKyAgICAgICAgICAgIGZvcm1hdCA9IG1Gb3JtYXRzW2ldOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmb3JtYXQ7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpjaGVja0dhaW4oY29uc3Qgc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnICpnYWluQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIGNvbnN0Cit7CisgICAgaWYgKGluZGV4IDwgMCB8fCAoc2l6ZV90KWluZGV4ID49IG1HYWlucy5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIG1HYWluc1tpbmRleF0tPmNoZWNrQ29uZmlnKGdhaW5Db25maWcpOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3QKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIGlmIChtTmFtZS5zaXplKCkgIT0gMCkgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG5hbWU6ICVzXG4iLCBzcGFjZXMsICIiLCBtTmFtZS5zdHJpbmcoKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB9CisKKyAgICBpZiAobVNhbXBsaW5nUmF0ZXMuc2l6ZSgpICE9IDApIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBzYW1wbGluZyByYXRlczogIiwgc3BhY2VzLCAiIik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2FtcGxpbmdSYXRlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGkgPT0gMCAmJiBtU2FtcGxpbmdSYXRlc1tpXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiRHluYW1pYyIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlZCIsIG1TYW1wbGluZ1JhdGVzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoaSA9PSAobVNhbXBsaW5nUmF0ZXMuc2l6ZSgpIC0gMSkgPyAiIiA6ICIsICIpOworICAgICAgICB9CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CisgICAgfQorCisgICAgaWYgKG1DaGFubmVsTWFza3Muc2l6ZSgpICE9IDApIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBjaGFubmVsIG1hc2tzOiAiLCBzcGFjZXMsICIiKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DaGFubmVsTWFza3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIEFMT0dWKCJBdWRpb1BvcnQ6OmR1bXAgbUNoYW5uZWxNYXNrcyAlenUgJTA4eCIsIGksIG1DaGFubmVsTWFza3NbaV0pOworCisgICAgICAgICAgICBpZiAoaSA9PSAwICYmIG1DaGFubmVsTWFza3NbaV0gPT0gMCkgeworICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkR5bmFtaWMiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiMHglMDR4IiwgbUNoYW5uZWxNYXNrc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGkgPT0gKG1DaGFubmVsTWFza3Muc2l6ZSgpIC0gMSkgPyAiIiA6ICIsICIpOworICAgICAgICB9CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CisgICAgfQorCisgICAgaWYgKG1Gb3JtYXRzLnNpemUoKSAhPSAwKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gZm9ybWF0czogIiwgc3BhY2VzLCAiIik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRm9ybWF0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0U3RyID0gZW51bVRvU3RyaW5nKHNGb3JtYXROYW1lVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzRm9ybWF0TmFtZVRvRW51bVRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRm9ybWF0c1tpXSk7CisgICAgICAgICAgICBpZiAoaSA9PSAwICYmIHN0cmNtcChmb3JtYXRTdHIsICIiKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiRHluYW1pYyIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlcyIsIGZvcm1hdFN0cik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGkgPT0gKG1Gb3JtYXRzLnNpemUoKSAtIDEpID8gIiIgOiAiLCAiKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworICAgIH0KKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICBpZiAobUdhaW5zLnNpemUoKSAhPSAwKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gZ2FpbnM6XG4iLCBzcGFjZXMsICIiKTsKKyAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikgKyAxKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1HYWlucy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgbUdhaW5zW2ldLT5kdW1wKGZkLCBzcGFjZXMgKyAyLCBpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gLS0tIEF1ZGlvR2FpbiBjbGFzcyBpbXBsZW1lbnRhdGlvbgorCitBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvR2Fpbjo6QXVkaW9HYWluKGludCBpbmRleCwgYm9vbCB1c2VJbkNoYW5uZWxNYXNrKQoreworICAgIG1JbmRleCA9IGluZGV4OworICAgIG1Vc2VJbkNoYW5uZWxNYXNrID0gdXNlSW5DaGFubmVsTWFzazsKKyAgICBtZW1zZXQoJm1HYWluLCAwLCBzaXplb2Yoc3RydWN0IGF1ZGlvX2dhaW4pKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvR2Fpbjo6Z2V0RGVmYXVsdENvbmZpZyhzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgKmNvbmZpZykKK3sKKyAgICBjb25maWctPmluZGV4ID0gbUluZGV4OworICAgIGNvbmZpZy0+bW9kZSA9IG1HYWluLm1vZGU7CisgICAgY29uZmlnLT5jaGFubmVsX21hc2sgPSBtR2Fpbi5jaGFubmVsX21hc2s7CisgICAgaWYgKChtR2Fpbi5tb2RlICYgQVVESU9fR0FJTl9NT0RFX0pPSU5UKSA9PSBBVURJT19HQUlOX01PREVfSk9JTlQpIHsKKyAgICAgICAgY29uZmlnLT52YWx1ZXNbMF0gPSBtR2Fpbi5kZWZhdWx0X3ZhbHVlOworICAgIH0gZWxzZSB7CisgICAgICAgIHVpbnQzMl90IG51bVZhbHVlczsKKyAgICAgICAgaWYgKG1Vc2VJbkNoYW5uZWxNYXNrKSB7CisgICAgICAgICAgICBudW1WYWx1ZXMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhtR2Fpbi5jaGFubmVsX21hc2spOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbnVtVmFsdWVzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1HYWluLmNoYW5uZWxfbWFzayk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1WYWx1ZXM7IGkrKykgeworICAgICAgICAgICAgY29uZmlnLT52YWx1ZXNbaV0gPSBtR2Fpbi5kZWZhdWx0X3ZhbHVlOworICAgICAgICB9CisgICAgfQorICAgIGlmICgobUdhaW4ubW9kZSAmIEFVRElPX0dBSU5fTU9ERV9SQU1QKSA9PSBBVURJT19HQUlOX01PREVfUkFNUCkgeworICAgICAgICBjb25maWctPnJhbXBfZHVyYXRpb25fbXMgPSBtR2Fpbi5taW5fcmFtcF9tczsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9HYWluOjpjaGVja0NvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgKmNvbmZpZykKK3sKKyAgICBpZiAoKGNvbmZpZy0+bW9kZSAmIH5tR2Fpbi5tb2RlKSAhPSAwKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmICgoY29uZmlnLT5tb2RlICYgQVVESU9fR0FJTl9NT0RFX0pPSU5UKSA9PSBBVURJT19HQUlOX01PREVfSk9JTlQpIHsKKyAgICAgICAgaWYgKChjb25maWctPnZhbHVlc1swXSA8IG1HYWluLm1pbl92YWx1ZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKGNvbmZpZy0+dmFsdWVzWzBdID4gbUdhaW4ubWF4X3ZhbHVlKSkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgoY29uZmlnLT5jaGFubmVsX21hc2sgJiB+bUdhaW4uY2hhbm5lbF9tYXNrKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIHVpbnQzMl90IG51bVZhbHVlczsKKyAgICAgICAgaWYgKG1Vc2VJbkNoYW5uZWxNYXNrKSB7CisgICAgICAgICAgICBudW1WYWx1ZXMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjb25maWctPmNoYW5uZWxfbWFzayk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBudW1WYWx1ZXMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY29uZmlnLT5jaGFubmVsX21hc2spOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyBpKyspIHsKKyAgICAgICAgICAgIGlmICgoY29uZmlnLT52YWx1ZXNbaV0gPCBtR2Fpbi5taW5fdmFsdWUpIHx8CisgICAgICAgICAgICAgICAgICAgIChjb25maWctPnZhbHVlc1tpXSA+IG1HYWluLm1heF92YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmICgoY29uZmlnLT5tb2RlICYgQVVESU9fR0FJTl9NT0RFX1JBTVApID09IEFVRElPX0dBSU5fTU9ERV9SQU1QKSB7CisgICAgICAgIGlmICgoY29uZmlnLT5yYW1wX2R1cmF0aW9uX21zIDwgbUdhaW4ubWluX3JhbXBfbXMpIHx8CisgICAgICAgICAgICAgICAgICAgIChjb25maWctPnJhbXBfZHVyYXRpb25fbXMgPiBtR2Fpbi5tYXhfcmFtcF9tcykpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9HYWluOjpkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzR2FpbiAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4KzEpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG1vZGU6ICUwOHhcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1vZGUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGNoYW5uZWxfbWFzazogJTA4eFxuIiwgc3BhY2VzLCAiIiwgbUdhaW4uY2hhbm5lbF9tYXNrKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBtaW5fdmFsdWU6ICVkIG1CXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5taW5fdmFsdWUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG1heF92YWx1ZTogJWQgbUJcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1heF92YWx1ZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gZGVmYXVsdF92YWx1ZTogJWQgbUJcbiIsIHNwYWNlcywgIiIsIG1HYWluLmRlZmF1bHRfdmFsdWUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIHN0ZXBfdmFsdWU6ICVkIG1CXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5zdGVwX3ZhbHVlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBtaW5fcmFtcF9tczogJWQgbXNcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1pbl9yYW1wX21zKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBtYXhfcmFtcF9tczogJWQgbXNcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1heF9yYW1wX21zKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisKKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKK30KKworLy8gLS0tIEF1ZGlvUG9ydENvbmZpZyBjbGFzcyBpbXBsZW1lbnRhdGlvbgorCitBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydENvbmZpZzo6QXVkaW9Qb3J0Q29uZmlnKCkKK3sKKyAgICBtU2FtcGxpbmdSYXRlID0gMDsKKyAgICBtQ2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7CisgICAgbUZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOworICAgIG1HYWluLmluZGV4ID0gLTE7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0Q29uZmlnOjphcHBseUF1ZGlvUG9ydENvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqYmFja3VwQ29uZmlnKQoreworICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBsb2NhbEJhY2t1cENvbmZpZzsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKworICAgIGxvY2FsQmFja3VwQ29uZmlnLmNvbmZpZ19tYXNrID0gY29uZmlnLT5jb25maWdfbWFzazsKKyAgICB0b0F1ZGlvUG9ydENvbmZpZygmbG9jYWxCYWNrdXBDb25maWcpOworCisgICAgc3A8QXVkaW9Qb3J0PiBhdWRpb3BvcnQgPSBnZXRBdWRpb1BvcnQoKTsKKyAgICBpZiAoYXVkaW9wb3J0ID09IDApIHsKKyAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKyAgICBpZiAoY29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX1NBTVBMRV9SQVRFKSB7CisgICAgICAgIHN0YXR1cyA9IGF1ZGlvcG9ydC0+Y2hlY2tFeGFjdFNhbXBsaW5nUmF0ZShjb25maWctPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisgICAgICAgIG1TYW1wbGluZ1JhdGUgPSBjb25maWctPnNhbXBsZV9yYXRlOworICAgIH0KKyAgICBpZiAoY29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSykgeworICAgICAgICBzdGF0dXMgPSBhdWRpb3BvcnQtPmNoZWNrRXhhY3RDaGFubmVsTWFzayhjb25maWctPmNoYW5uZWxfbWFzayk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorICAgICAgICBtQ2hhbm5lbE1hc2sgPSBjb25maWctPmNoYW5uZWxfbWFzazsKKyAgICB9CisgICAgaWYgKGNvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQpIHsKKyAgICAgICAgc3RhdHVzID0gYXVkaW9wb3J0LT5jaGVja0Zvcm1hdChjb25maWctPmZvcm1hdCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorICAgICAgICBtRm9ybWF0ID0gY29uZmlnLT5mb3JtYXQ7CisgICAgfQorICAgIGlmIChjb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfR0FJTikgeworICAgICAgICBzdGF0dXMgPSBhdWRpb3BvcnQtPmNoZWNrR2FpbigmY29uZmlnLT5nYWluLCBjb25maWctPmdhaW4uaW5kZXgpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKyAgICAgICAgbUdhaW4gPSBjb25maWctPmdhaW47CisgICAgfQorCitleGl0OgorICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgYXBwbHlBdWRpb1BvcnRDb25maWcoJmxvY2FsQmFja3VwQ29uZmlnKTsKKyAgICB9CisgICAgaWYgKGJhY2t1cENvbmZpZyAhPSBOVUxMKSB7CisgICAgICAgICpiYWNrdXBDb25maWcgPSBsb2NhbEJhY2t1cENvbmZpZzsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydENvbmZpZzo6dG9BdWRpb1BvcnRDb25maWcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcpIGNvbnN0Cit7CisgICAgaWYgKGRzdENvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURSkgeworICAgICAgICBkc3RDb25maWctPnNhbXBsZV9yYXRlID0gbVNhbXBsaW5nUmF0ZTsKKyAgICAgICAgaWYgKChzcmNDb25maWcgIT0gTlVMTCkgJiYgKHNyY0NvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURSkpIHsKKyAgICAgICAgICAgIGRzdENvbmZpZy0+c2FtcGxlX3JhdGUgPSBzcmNDb25maWctPnNhbXBsZV9yYXRlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHN0Q29uZmlnLT5zYW1wbGVfcmF0ZSA9IDA7CisgICAgfQorICAgIGlmIChkc3RDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfQ0hBTk5FTF9NQVNLKSB7CisgICAgICAgIGRzdENvbmZpZy0+Y2hhbm5lbF9tYXNrID0gbUNoYW5uZWxNYXNrOworICAgICAgICBpZiAoKHNyY0NvbmZpZyAhPSBOVUxMKSAmJiAoc3JjQ29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSykpIHsKKyAgICAgICAgICAgIGRzdENvbmZpZy0+Y2hhbm5lbF9tYXNrID0gc3JjQ29uZmlnLT5jaGFubmVsX21hc2s7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBkc3RDb25maWctPmNoYW5uZWxfbWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORTsKKyAgICB9CisgICAgaWYgKGRzdENvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQpIHsKKyAgICAgICAgZHN0Q29uZmlnLT5mb3JtYXQgPSBtRm9ybWF0OworICAgICAgICBpZiAoKHNyY0NvbmZpZyAhPSBOVUxMKSAmJiAoc3JjQ29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0ZPUk1BVCkpIHsKKyAgICAgICAgICAgIGRzdENvbmZpZy0+Zm9ybWF0ID0gc3JjQ29uZmlnLT5mb3JtYXQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBkc3RDb25maWctPmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOworICAgIH0KKyAgICBpZiAoZHN0Q29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0dBSU4pIHsKKyAgICAgICAgZHN0Q29uZmlnLT5nYWluID0gbUdhaW47CisgICAgICAgIGlmICgoc3JjQ29uZmlnICE9IE5VTEwpICYmIChzcmNDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfR0FJTikpIHsKKyAgICAgICAgICAgIGRzdENvbmZpZy0+Z2FpbiA9IHNyY0NvbmZpZy0+Z2FpbjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGRzdENvbmZpZy0+Z2Fpbi5pbmRleCA9IC0xOworICAgIH0KKyAgICBpZiAoZHN0Q29uZmlnLT5nYWluLmluZGV4ICE9IC0xKSB7CisgICAgICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgfD0gQVVESU9fUE9SVF9DT05GSUdfR0FJTjsKKyAgICB9IGVsc2UgeworICAgICAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrICY9IH5BVURJT19QT1JUX0NPTkZJR19HQUlOOworICAgIH0KK30KKworLy8gLS0tIElPUHJvZmlsZSBjbGFzcyBpbXBsZW1lbnRhdGlvbgorCitBdWRpb1BvbGljeU1hbmFnZXI6OklPUHJvZmlsZTo6SU9Qcm9maWxlKGNvbnN0IFN0cmluZzgmIG5hbWUsIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEh3TW9kdWxlPiYgbW9kdWxlKQorICAgIDogQXVkaW9Qb3J0KG5hbWUsIEFVRElPX1BPUlRfVFlQRV9NSVgsIHJvbGUsIG1vZHVsZSkKK3sKK30KKworQXVkaW9Qb2xpY3lNYW5hZ2VyOjpJT1Byb2ZpbGU6On5JT1Byb2ZpbGUoKQoreworfQorCisvLyBjaGVja3MgaWYgdGhlIElPIHByb2ZpbGUgaXMgY29tcGF0aWJsZSB3aXRoIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgorLy8gU2FtcGxpbmcgcmF0ZSwgZm9ybWF0IGFuZCBjaGFubmVsIG1hc2sgbXVzdCBiZSBzcGVjaWZpZWQgaW4gb3JkZXIgdG8KKy8vIGdldCBhIHZhbGlkIGEgbWF0Y2gKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpJT1Byb2ZpbGU6OmlzQ29tcGF0aWJsZVByb2ZpbGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICp1cGRhdGVkU2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncykgY29uc3QKK3sKKyAgICBjb25zdCBib29sIGlzUGxheWJhY2tUaHJlYWQgPSBtVHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYICYmIG1Sb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0U7CisgICAgY29uc3QgYm9vbCBpc1JlY29yZFRocmVhZCA9IG1UeXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVggJiYgbVJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTks7CisgICAgQUxPR19BU1NFUlQoaXNQbGF5YmFja1RocmVhZCAhPSBpc1JlY29yZFRocmVhZCk7CisKKyAgICBpZiAoKG1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkgJiBkZXZpY2UpICE9IGRldmljZSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHNhbXBsaW5nUmF0ZSA9PSAwKSB7CisgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHVpbnQzMl90IG15VXBkYXRlZFNhbXBsaW5nUmF0ZSA9IHNhbXBsaW5nUmF0ZTsKKyAgICBpZiAoaXNQbGF5YmFja1RocmVhZCAmJiBjaGVja0V4YWN0U2FtcGxpbmdSYXRlKHNhbXBsaW5nUmF0ZSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGlzUmVjb3JkVGhyZWFkICYmIGNoZWNrQ29tcGF0aWJsZVNhbXBsaW5nUmF0ZShzYW1wbGluZ1JhdGUsICZteVVwZGF0ZWRTYW1wbGluZ1JhdGUpICE9CisgICAgICAgICAgICBOT19FUlJPUikgeworICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghYXVkaW9faXNfdmFsaWRfZm9ybWF0KGZvcm1hdCkgfHwgY2hlY2tGb3JtYXQoZm9ybWF0KSAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGlzUGxheWJhY2tUaHJlYWQgJiYgKCFhdWRpb19pc19vdXRwdXRfY2hhbm5lbChjaGFubmVsTWFzaykgfHwKKyAgICAgICAgICAgIGNoZWNrRXhhY3RDaGFubmVsTWFzayhjaGFubmVsTWFzaykgIT0gTk9fRVJST1IpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGlzUmVjb3JkVGhyZWFkICYmICghYXVkaW9faXNfaW5wdXRfY2hhbm5lbChjaGFubmVsTWFzaykgfHwKKyAgICAgICAgICAgIGNoZWNrQ29tcGF0aWJsZUNoYW5uZWxNYXNrKGNoYW5uZWxNYXNrKSAhPSBOT19FUlJPUikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChpc1BsYXliYWNrVGhyZWFkICYmIChtRmxhZ3MgJiBmbGFncykgIT0gZmxhZ3MpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBUaGUgb25seSBpbnB1dCBmbGFnIHRoYXQgaXMgYWxsb3dlZCB0byBiZSBkaWZmZXJlbnQgaXMgdGhlIGZhc3QgZmxhZy4KKyAgICAvLyBBbiBleGlzdGluZyBmYXN0IHN0cmVhbSBpcyBjb21wYXRpYmxlIHdpdGggYSBub3JtYWwgdHJhY2sgcmVxdWVzdC4KKyAgICAvLyBBbiBleGlzdGluZyBub3JtYWwgc3RyZWFtIGlzIGNvbXBhdGlibGUgd2l0aCBhIGZhc3QgdHJhY2sgcmVxdWVzdCwKKyAgICAvLyBidXQgdGhlIGZhc3QgcmVxdWVzdCB3aWxsIGJlIGRlbmllZCBieSBBdWRpb0ZsaW5nZXIgYW5kIGNvbnZlcnRlZCB0byBub3JtYWwgdHJhY2suCisgICAgaWYgKGlzUmVjb3JkVGhyZWFkICYmICgobUZsYWdzIF4gZmxhZ3MpICYKKyAgICAgICAgICAgIH5BVURJT19JTlBVVF9GTEFHX0ZBU1QpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAodXBkYXRlZFNhbXBsaW5nUmF0ZSAhPSBOVUxMKSB7CisgICAgICAgICp1cGRhdGVkU2FtcGxpbmdSYXRlID0gbXlVcGRhdGVkU2FtcGxpbmdSYXRlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OklPUHJvZmlsZTo6ZHVtcChpbnQgZmQpCit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKyAgICBBdWRpb1BvcnQ6OmR1bXAoZmQsIDQpOworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgIC0gZmxhZ3M6IDB4JTA0eFxuIiwgbUZsYWdzKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgIC0gZGV2aWNlczpcbiIpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TdXBwb3J0ZWREZXZpY2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1TdXBwb3J0ZWREZXZpY2VzW2ldLT5kdW1wKGZkLCA2LCBpKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpJT1Byb2ZpbGU6OmxvZygpCit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKyAgICBBTE9HVigiICAgIC0gc2FtcGxpbmcgcmF0ZXM6ICIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNhbXBsaW5nUmF0ZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgQUxPR1YoIiAgJWQiLCBtU2FtcGxpbmdSYXRlc1tpXSk7CisgICAgfQorCisgICAgQUxPR1YoIiAgICAtIGNoYW5uZWwgbWFza3M6ICIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNoYW5uZWxNYXNrcy5zaXplKCk7IGkrKykgeworICAgICAgICBBTE9HVigiICAweCUwNHgiLCBtQ2hhbm5lbE1hc2tzW2ldKTsKKyAgICB9CisKKyAgICBBTE9HVigiICAgIC0gZm9ybWF0czogIik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRm9ybWF0cy5zaXplKCk7IGkrKykgeworICAgICAgICBBTE9HVigiICAweCUwOHgiLCBtRm9ybWF0c1tpXSk7CisgICAgfQorCisgICAgQUxPR1YoIiAgICAtIGRldmljZXM6IDB4JTA0eFxuIiwgbVN1cHBvcnRlZERldmljZXMudHlwZXMoKSk7CisgICAgQUxPR1YoIiAgICAtIGZsYWdzOiAweCUwNHhcbiIsIG1GbGFncyk7Cit9CisKKworLy8gLS0tIERldmljZURlc2NyaXB0b3IgaW1wbGVtZW50YXRpb24KKworCitBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZURlc2NyaXB0b3I6OkRldmljZURlc2NyaXB0b3IoY29uc3QgU3RyaW5nOCYgbmFtZSwgYXVkaW9fZGV2aWNlc190IHR5cGUpIDoKKyAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9ydChuYW1lLCBBVURJT19QT1JUX1RZUEVfREVWSUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lzX291dHB1dF9kZXZpY2UodHlwZSkgPyBBVURJT19QT1JUX1JPTEVfU0lOSyA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpLAorICAgICAgICAgICAgICAgICAgICAgbURldmljZVR5cGUodHlwZSksIG1BZGRyZXNzKCIiKSwgbUlkKDApCit7CisgICAgaWYgKG1HYWlucy5zaXplKCkgPiAwKSB7CisgICAgICAgIG1HYWluc1swXS0+Z2V0RGVmYXVsdENvbmZpZygmbUdhaW4pOworICAgIH0KK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZURlc2NyaXB0b3I6OmVxdWFscyhjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgb3RoZXIpIGNvbnN0Cit7CisgICAgLy8gRGV2aWNlcyBhcmUgY29uc2lkZXJlZCBlcXVhbCBpZiB0aGV5OgorICAgIC8vIC0gYXJlIG9mIHRoZSBzYW1lIHR5cGUgKGEgZGV2aWNlIHR5cGUgY2Fubm90IGJlIEFVRElPX0RFVklDRV9OT05FKQorICAgIC8vIC0gaGF2ZSB0aGUgc2FtZSBhZGRyZXNzIG9yIG9uZSBkZXZpY2UgZG9lcyBub3Qgc3BlY2lmeSB0aGUgYWRkcmVzcworICAgIC8vIC0gaGF2ZSB0aGUgc2FtZSBjaGFubmVsIG1hc2sgb3Igb25lIGRldmljZSBkb2VzIG5vdCBzcGVjaWZ5IHRoZSBjaGFubmVsIG1hc2sKKyAgICByZXR1cm4gKG1EZXZpY2VUeXBlID09IG90aGVyLT5tRGV2aWNlVHlwZSkgJiYKKyAgICAgICAgICAgKG1BZGRyZXNzID09ICIiIHx8IG90aGVyLT5tQWRkcmVzcyA9PSAiIiB8fCBtQWRkcmVzcyA9PSBvdGhlci0+bUFkZHJlc3MpICYmCisgICAgICAgICAgIChtQ2hhbm5lbE1hc2sgPT0gMCB8fCBvdGhlci0+bUNoYW5uZWxNYXNrID09IDAgfHwKKyAgICAgICAgICAgICAgICBtQ2hhbm5lbE1hc2sgPT0gb3RoZXItPm1DaGFubmVsTWFzayk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VWZWN0b3I6OnJlZnJlc2hUeXBlcygpCit7CisgICAgbURldmljZVR5cGVzID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIG1EZXZpY2VUeXBlcyB8PSBpdGVtQXQoaSktPm1EZXZpY2VUeXBlOworICAgIH0KKyAgICBBTE9HVigiRGV2aWNlVmVjdG9yOjpyZWZyZXNoVHlwZXMoKSBtRGV2aWNlVHlwZXMgJTA4eCIsIG1EZXZpY2VUeXBlcyk7Cit9CisKK3NzaXplX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VWZWN0b3I6OmluZGV4T2YoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pIGNvbnN0Cit7CisgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChpdGVtLT5lcXVhbHMoaXRlbUF0KGkpKSkgeworICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCitzc2l6ZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlVmVjdG9yOjphZGQoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pCit7CisgICAgc3NpemVfdCByZXQgPSBpbmRleE9mKGl0ZW0pOworCisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgcmV0ID0gU29ydGVkVmVjdG9yOjphZGQoaXRlbSk7CisgICAgICAgIGlmIChyZXQgPj0gMCkgeworICAgICAgICAgICAgcmVmcmVzaFR5cGVzKCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVygiRGV2aWNlVmVjdG9yOjphZGQgZGV2aWNlICUwOHggYWxyZWFkeSBpbiIsIGl0ZW0tPm1EZXZpY2VUeXBlKTsKKyAgICAgICAgcmV0ID0gLTE7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3NzaXplX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VWZWN0b3I6OnJlbW92ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgaXRlbSkKK3sKKyAgICBzaXplX3QgaTsKKyAgICBzc2l6ZV90IHJldCA9IGluZGV4T2YoaXRlbSk7CisKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBBTE9HVygiRGV2aWNlVmVjdG9yOjpyZW1vdmUgZGV2aWNlICUwOHggbm90IGluIiwgaXRlbS0+bURldmljZVR5cGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IFNvcnRlZFZlY3Rvcjo6cmVtb3ZlQXQocmV0KTsKKyAgICAgICAgaWYgKHJldCA+PSAwKSB7CisgICAgICAgICAgICByZWZyZXNoVHlwZXMoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlVmVjdG9yOjpsb2FkRGV2aWNlc0Zyb21UeXBlKGF1ZGlvX2RldmljZXNfdCB0eXBlcykKK3sKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdDsKKworICAgIHVpbnQzMl90IHJvbGVfYml0ID0gQVVESU9fREVWSUNFX0JJVF9JTiAmIHR5cGVzOworICAgIHR5cGVzICY9IH5yb2xlX2JpdDsKKworICAgIHdoaWxlICh0eXBlcykgeworICAgICAgICB1aW50MzJfdCBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KHR5cGVzKTsKKyAgICAgICAgdWludDMyX3QgdHlwZSA9IDEgPDwgaTsKKyAgICAgICAgdHlwZXMgJj0gfnR5cGU7CisgICAgICAgIGFkZChuZXcgRGV2aWNlRGVzY3JpcHRvcihTdHJpbmc4KCIiKSwgdHlwZSB8IHJvbGVfYml0KSk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlVmVjdG9yOjpsb2FkRGV2aWNlc0Zyb21OYW1lKGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciYgZGVjbGFyZWREZXZpY2VzKQoreworICAgIGNoYXIgKmRldk5hbWUgPSBzdHJ0b2sobmFtZSwgInwiKTsKKyAgICB3aGlsZSAoZGV2TmFtZSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChzdHJsZW4oZGV2TmFtZSkgIT0gMCkgeworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUgPSBzdHJpbmdUb0VudW0oc0RldmljZU5hbWVUb0VudW1UYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0RldmljZU5hbWVUb0VudW1UYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZOYW1lKTsKKyAgICAgICAgICAgIGlmICh0eXBlICE9IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICAgICAgYWRkKG5ldyBEZXZpY2VEZXNjcmlwdG9yKFN0cmluZzgoIiIpLCB0eXBlKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZURlc2MgPQorICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyZWREZXZpY2VzLmdldERldmljZUZyb21OYW1lKFN0cmluZzgoZGV2TmFtZSkpOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2VEZXNjICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkKGRldmljZURlc2MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgZGV2TmFtZSA9IHN0cnRvayhOVUxMLCAifCIpOworICAgICB9Cit9CisKK3NwPEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlRGVzY3JpcHRvcj4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VWZWN0b3I6OmdldERldmljZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUsIFN0cmluZzggYWRkcmVzcykgY29uc3QKK3sKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2U7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBpZiAoaXRlbUF0KGkpLT5tRGV2aWNlVHlwZSA9PSB0eXBlKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBpdGVtQXQoaSk7CisgICAgICAgICAgICBpZiAoaXRlbUF0KGkpLT5tQWRkcmVzcyA9IGFkZHJlc3MpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVigiRGV2aWNlVmVjdG9yOjpnZXREZXZpY2UoKSBmb3IgdHlwZSAlZCBhZGRyZXNzICVzIGZvdW5kICVwIiwKKyAgICAgICAgICB0eXBlLCBhZGRyZXNzLnN0cmluZygpLCBkZXZpY2UuZ2V0KCkpOworICAgIHJldHVybiBkZXZpY2U7Cit9CisKK3NwPEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlRGVzY3JpcHRvcj4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VWZWN0b3I6OmdldERldmljZUZyb21JZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBpZCkgY29uc3QKK3sKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2U7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBBTE9HVigiRGV2aWNlVmVjdG9yOjpnZXREZXZpY2VGcm9tSWQoJWQpIGl0ZW1BdCglenUpLT5tSWQgJWQiLCBpZCwgaSwgaXRlbUF0KGkpLT5tSWQpOworICAgICAgICBpZiAoaXRlbUF0KGkpLT5tSWQgPT0gaWQpIHsKKyAgICAgICAgICAgIGRldmljZSA9IGl0ZW1BdChpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkZXZpY2U7Cit9CisKK0F1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlVmVjdG9yIEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlVmVjdG9yOjpnZXREZXZpY2VzRnJvbVR5cGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSkgY29uc3QKK3sKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgKGkgPCBzaXplKCkpICYmICh0eXBlICE9IEFVRElPX0RFVklDRV9OT05FKTsgaSsrKSB7CisgICAgICAgIGlmIChpdGVtQXQoaSktPm1EZXZpY2VUeXBlICYgdHlwZSAmIH5BVURJT19ERVZJQ0VfQklUX0lOKSB7CisgICAgICAgICAgICBkZXZpY2VzLmFkZChpdGVtQXQoaSkpOworICAgICAgICAgICAgdHlwZSAmPSB+aXRlbUF0KGkpLT5tRGV2aWNlVHlwZTsKKyAgICAgICAgICAgIEFMT0dWKCJEZXZpY2VWZWN0b3I6OmdldERldmljZXNGcm9tVHlwZSgpIGZvciB0eXBlICV4IGZvdW5kICVwIiwKKyAgICAgICAgICAgICAgICAgIGl0ZW1BdChpKS0+bURldmljZVR5cGUsIGl0ZW1BdChpKS5nZXQoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRldmljZXM7Cit9CisKK0F1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlVmVjdG9yIEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlVmVjdG9yOjpnZXREZXZpY2VzRnJvbVR5cGVBZGRyKAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSwgU3RyaW5nOCBhZGRyZXNzKSBjb25zdAoreworICAgIERldmljZVZlY3RvciBkZXZpY2VzOworICAgIC8vQUxPR1YoIiAgIGxvb2tpbmcgZm9yIGRldmljZT0leCwgYWRkcj0lcyIsIHR5cGUsIGFkZHJlc3Muc3RyaW5nKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgLy9BTE9HVigiICAgICBhdCBpPSVkOiBkZXZpY2U9JXgsIGFkZHI9JXMiLAorICAgICAgICAvLyAgICAgICAgaSwgaXRlbUF0KGkpLT5tRGV2aWNlVHlwZSwgaXRlbUF0KGkpLT5tQWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgIGlmIChpdGVtQXQoaSktPm1EZXZpY2VUeXBlID09IHR5cGUpIHsKKyAgICAgICAgICAgIGlmIChpdGVtQXQoaSktPm1BZGRyZXNzID09IGFkZHJlc3MpIHsKKyAgICAgICAgICAgICAgICAvL0FMT0dWKCIgICAgICBmb3VuZCBtYXRjaGluZyBhZGRyZXNzICVzIiwgYWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgZGV2aWNlcy5hZGQoaXRlbUF0KGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGV2aWNlczsKK30KKworc3A8QXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VEZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZVZlY3Rvcjo6Z2V0RGV2aWNlRnJvbU5hbWUoCisgICAgICAgIGNvbnN0IFN0cmluZzgmIG5hbWUpIGNvbnN0Cit7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGl0ZW1BdChpKS0+bU5hbWUgPT0gbmFtZSkgeworICAgICAgICAgICAgZGV2aWNlID0gaXRlbUF0KGkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRldmljZTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZURlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0Q29uZmlnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnKSBjb25zdAoreworICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgPSBBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0t8QVVESU9fUE9SVF9DT05GSUdfR0FJTjsKKyAgICBpZiAoc3JjQ29uZmlnICE9IE5VTEwpIHsKKyAgICAgICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayB8PSBzcmNDb25maWctPmNvbmZpZ19tYXNrOworICAgIH0KKworICAgIEF1ZGlvUG9ydENvbmZpZzo6dG9BdWRpb1BvcnRDb25maWcoZHN0Q29uZmlnLCBzcmNDb25maWcpOworCisgICAgZHN0Q29uZmlnLT5pZCA9IG1JZDsKKyAgICBkc3RDb25maWctPnJvbGUgPSBhdWRpb19pc19vdXRwdXRfZGV2aWNlKG1EZXZpY2VUeXBlKSA/CisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT1JUX1JPTEVfU0lOSyA6IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0U7CisgICAgZHN0Q29uZmlnLT50eXBlID0gQVVESU9fUE9SVF9UWVBFX0RFVklDRTsKKyAgICBkc3RDb25maWctPmV4dC5kZXZpY2UudHlwZSA9IG1EZXZpY2VUeXBlOworICAgIGRzdENvbmZpZy0+ZXh0LmRldmljZS5od19tb2R1bGUgPSBtTW9kdWxlLT5tSGFuZGxlOworICAgIHN0cm5jcHkoZHN0Q29uZmlnLT5leHQuZGV2aWNlLmFkZHJlc3MsIG1BZGRyZXNzLnN0cmluZygpLCBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZURlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdAoreworICAgIEFMT0dWKCJEZXZpY2VEZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydCgpIGhhbmRsZSAlZCB0eXBlICV4IiwgbUlkLCBtRGV2aWNlVHlwZSk7CisgICAgQXVkaW9Qb3J0Ojp0b0F1ZGlvUG9ydChwb3J0KTsKKyAgICBwb3J0LT5pZCA9IG1JZDsKKyAgICB0b0F1ZGlvUG9ydENvbmZpZygmcG9ydC0+YWN0aXZlX2NvbmZpZyk7CisgICAgcG9ydC0+ZXh0LmRldmljZS50eXBlID0gbURldmljZVR5cGU7CisgICAgcG9ydC0+ZXh0LmRldmljZS5od19tb2R1bGUgPSBtTW9kdWxlLT5tSGFuZGxlOworICAgIHN0cm5jcHkocG9ydC0+ZXh0LmRldmljZS5hZGRyZXNzLCBtQWRkcmVzcy5zdHJpbmcoKSwgQVVESU9fREVWSUNFX01BWF9BRERSRVNTX0xFTik7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlRGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqc0RldmljZSAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4KzEpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBpZiAobUlkICE9IDApIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBpZDogJTJkXG4iLCBzcGFjZXMsICIiLCBtSWQpOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgfQorICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gdHlwZTogJS00OHNcbiIsIHNwYWNlcywgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bVRvU3RyaW5nKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0RldmljZU5hbWVUb0VudW1UYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VUeXBlKSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIGlmIChtQWRkcmVzcy5zaXplKCkgIT0gMCkgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGFkZHJlc3M6ICUtMzJzXG4iLCBzcGFjZXMsICIiLCBtQWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB9CisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgQXVkaW9Qb3J0OjpkdW1wKGZkLCBzcGFjZXMpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUGF0Y2g6OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0Cit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqc0F1ZGlvIHBhdGNoICVkOlxuIiwgc3BhY2VzLCAiIiwgaW5kZXgrMSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gaGFuZGxlOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1IYW5kbGUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGF1ZGlvIGZsaW5nZXIgaGFuZGxlOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1BZlBhdGNoSGFuZGxlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBvd25lciB1aWQ6ICUyZFxuIiwgc3BhY2VzLCAiIiwgbVVpZCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gJWQgc291cmNlczpcbiIsIHNwYWNlcywgIiIsIG1QYXRjaC5udW1fc291cmNlcyk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBhdGNoLm51bV9zb3VyY2VzOyBpKyspIHsKKyAgICAgICAgaWYgKG1QYXRjaC5zb3VyY2VzW2ldLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgeworICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBEZXZpY2UgSUQgJWQgJXNcbiIsIHNwYWNlcyArIDIsICIiLAorICAgICAgICAgICAgICAgICAgICAgbVBhdGNoLnNvdXJjZXNbaV0uaWQsIGVudW1Ub1N0cmluZyhzRGV2aWNlTmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGF0Y2guc291cmNlc1tpXS5leHQuZGV2aWNlLnR5cGUpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gTWl4IElEICVkIEkvTyBoYW5kbGUgJWRcbiIsIHNwYWNlcyArIDIsICIiLAorICAgICAgICAgICAgICAgICAgICAgbVBhdGNoLnNvdXJjZXNbaV0uaWQsIG1QYXRjaC5zb3VyY2VzW2ldLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgfQorICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gJWQgc2lua3M6XG4iLCBzcGFjZXMsICIiLCBtUGF0Y2gubnVtX3NpbmtzKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGF0Y2gubnVtX3NpbmtzOyBpKyspIHsKKyAgICAgICAgaWYgKG1QYXRjaC5zaW5rc1tpXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gRGV2aWNlIElEICVkICVzXG4iLCBzcGFjZXMgKyAyLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgIG1QYXRjaC5zaW5rc1tpXS5pZCwgZW51bVRvU3RyaW5nKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0RldmljZU5hbWVUb0VudW1UYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYXRjaC5zaW5rc1tpXS5leHQuZGV2aWNlLnR5cGUpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gTWl4IElEICVkIEkvTyBoYW5kbGUgJWRcbiIsIHNwYWNlcyArIDIsICIiLAorICAgICAgICAgICAgICAgICAgICAgbVBhdGNoLnNpbmtzW2ldLmlkLCBtUGF0Y2guc2lua3NbaV0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICB9CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB9CisKKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8vIC0tLSBhdWRpb19wb2xpY3kuY29uZiBmaWxlIHBhcnNpbmcKKwordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpwYXJzZU91dHB1dEZsYWdOYW1lcyhjaGFyICpuYW1lKQoreworICAgIHVpbnQzMl90IGZsYWcgPSAwOworCisgICAgLy8gaXQgaXMgT0sgdG8gY2FzdCBuYW1lIHRvIG5vbiBjb25zdCBoZXJlIGFzIHdlIGFyZSBub3QgZ29pbmcgdG8gdXNlIGl0IGFmdGVyCisgICAgLy8gc3RydG9rKCkgbW9kaWZpZXMgaXQKKyAgICBjaGFyICpmbGFnTmFtZSA9IHN0cnRvayhuYW1lLCAifCIpOworICAgIHdoaWxlIChmbGFnTmFtZSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChzdHJsZW4oZmxhZ05hbWUpICE9IDApIHsKKyAgICAgICAgICAgIGZsYWcgfD0gc3RyaW5nVG9FbnVtKHNPdXRwdXRGbGFnTmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc091dHB1dEZsYWdOYW1lVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdOYW1lKTsKKyAgICAgICAgfQorICAgICAgICBmbGFnTmFtZSA9IHN0cnRvayhOVUxMLCAifCIpOworICAgIH0KKyAgICAvL2ZvcmNlIGRpcmVjdCBmbGFnIGlmIG9mZmxvYWQgZmxhZyBpcyBzZXQ6IG9mZmxvYWRpbmcgaW1wbGllcyBhIGRpcmVjdCBvdXRwdXQgc3RyZWFtCisgICAgLy8gYW5kIGFsbCBjb21tb24gYmVoYXZpb3JzIGFyZSBkcml2ZW4gYnkgY2hlY2tpbmcgb25seSB0aGUgZGlyZWN0IGZsYWcKKyAgICAvLyB0aGlzIHNob3VsZCBub3JtYWxseSBiZSBzZXQgYXBwcm9wcmlhdGVseSBpbiB0aGUgcG9saWN5IGNvbmZpZ3VyYXRpb24gZmlsZQorICAgIGlmICgoZmxhZyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDApIHsKKyAgICAgICAgZmxhZyB8PSBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1Q7CisgICAgfQorCisgICAgcmV0dXJuIGZsYWc7Cit9CisKK3VpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6cGFyc2VJbnB1dEZsYWdOYW1lcyhjaGFyICpuYW1lKQoreworICAgIHVpbnQzMl90IGZsYWcgPSAwOworCisgICAgLy8gaXQgaXMgT0sgdG8gY2FzdCBuYW1lIHRvIG5vbiBjb25zdCBoZXJlIGFzIHdlIGFyZSBub3QgZ29pbmcgdG8gdXNlIGl0IGFmdGVyCisgICAgLy8gc3RydG9rKCkgbW9kaWZpZXMgaXQKKyAgICBjaGFyICpmbGFnTmFtZSA9IHN0cnRvayhuYW1lLCAifCIpOworICAgIHdoaWxlIChmbGFnTmFtZSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChzdHJsZW4oZmxhZ05hbWUpICE9IDApIHsKKyAgICAgICAgICAgIGZsYWcgfD0gc3RyaW5nVG9FbnVtKHNJbnB1dEZsYWdOYW1lVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzSW5wdXRGbGFnTmFtZVRvRW51bVRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgZmxhZ05hbWUgPSBzdHJ0b2soTlVMTCwgInwiKTsKKyAgICB9CisgICAgcmV0dXJuIGZsYWc7Cit9CisKK2F1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnBhcnNlRGV2aWNlTmFtZXMoY2hhciAqbmFtZSkKK3sKKyAgICB1aW50MzJfdCBkZXZpY2UgPSAwOworCisgICAgY2hhciAqZGV2TmFtZSA9IHN0cnRvayhuYW1lLCAifCIpOworICAgIHdoaWxlIChkZXZOYW1lICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHN0cmxlbihkZXZOYW1lKSAhPSAwKSB7CisgICAgICAgICAgICBkZXZpY2UgfD0gc3RyaW5nVG9FbnVtKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2TmFtZSk7CisgICAgICAgICB9CisgICAgICAgIGRldk5hbWUgPSBzdHJ0b2soTlVMTCwgInwiKTsKKyAgICAgfQorICAgIHJldHVybiBkZXZpY2U7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsb2FkSHdNb2R1bGUoY25vZGUgKnJvb3QpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTkFNRV9OT1RfRk9VTkQ7CisgICAgY25vZGUgKm5vZGU7CisgICAgc3A8SHdNb2R1bGU+IG1vZHVsZSA9IG5ldyBId01vZHVsZShyb290LT5uYW1lKTsKKworICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBERVZJQ0VTX1RBRyk7CisgICAgaWYgKG5vZGUgIT0gTlVMTCkgeworICAgICAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7CisgICAgICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgICAgICBBTE9HVigibG9hZEh3TW9kdWxlKCkgbG9hZGluZyBkZXZpY2UgJXMiLCBub2RlLT5uYW1lKTsKKyAgICAgICAgICAgIHN0YXR1c190IHRtcFN0YXR1cyA9IG1vZHVsZS0+bG9hZERldmljZShub2RlKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTkFNRV9OT1RfRk9VTkQgfHwgc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gdG1wU3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgICAgIH0KKyAgICB9CisgICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIE9VVFBVVFNfVEFHKTsKKyAgICBpZiAobm9kZSAhPSBOVUxMKSB7CisgICAgICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKKyAgICAgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgICAgIEFMT0dWKCJsb2FkSHdNb2R1bGUoKSBsb2FkaW5nIG91dHB1dCAlcyIsIG5vZGUtPm5hbWUpOworICAgICAgICAgICAgc3RhdHVzX3QgdG1wU3RhdHVzID0gbW9kdWxlLT5sb2FkT3V0cHV0KG5vZGUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOQU1FX05PVF9GT1VORCB8fCBzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSB0bXBTdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICAgICAgfQorICAgIH0KKyAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgSU5QVVRTX1RBRyk7CisgICAgaWYgKG5vZGUgIT0gTlVMTCkgeworICAgICAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7CisgICAgICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgICAgICBBTE9HVigibG9hZEh3TW9kdWxlKCkgbG9hZGluZyBpbnB1dCAlcyIsIG5vZGUtPm5hbWUpOworICAgICAgICAgICAgc3RhdHVzX3QgdG1wU3RhdHVzID0gbW9kdWxlLT5sb2FkSW5wdXQobm9kZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5BTUVfTk9UX0ZPVU5EIHx8IHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRtcFN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgICAgICB9CisgICAgfQorICAgIGxvYWRHbG9iYWxDb25maWcocm9vdCwgbW9kdWxlKTsKKworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgbUh3TW9kdWxlcy5hZGQobW9kdWxlKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsb2FkSHdNb2R1bGVzKGNub2RlICpyb290KQoreworICAgIGNub2RlICpub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgQVVESU9fSFdfTU9EVUxFX1RBRyk7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIEFMT0dWKCJsb2FkSHdNb2R1bGVzKCkgbG9hZGluZyBtb2R1bGUgJXMiLCBub2RlLT5uYW1lKTsKKyAgICAgICAgbG9hZEh3TW9kdWxlKG5vZGUpOworICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsb2FkR2xvYmFsQ29uZmlnKGNub2RlICpyb290LCBjb25zdCBzcDxId01vZHVsZT4mIG1vZHVsZSkKK3sKKyAgICBjbm9kZSAqbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIEdMT0JBTF9DT05GSUdfVEFHKTsKKworICAgIGlmIChub2RlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBEZXZpY2VWZWN0b3IgZGVjbGFyZWREZXZpY2VzOworICAgIGlmIChtb2R1bGUgIT0gTlVMTCkgeworICAgICAgICBkZWNsYXJlZERldmljZXMgPSBtb2R1bGUtPm1EZWNsYXJlZERldmljZXM7CisgICAgfQorCisgICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIGlmIChzdHJjbXAoQVRUQUNIRURfT1VUUFVUX0RFVklDRVNfVEFHLCBub2RlLT5uYW1lKSA9PSAwKSB7CisgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5sb2FkRGV2aWNlc0Zyb21OYW1lKChjaGFyICopbm9kZS0+dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmVkRGV2aWNlcyk7CisgICAgICAgICAgICBBTE9HVigibG9hZEdsb2JhbENvbmZpZygpIEF0dGFjaGVkIE91dHB1dCBEZXZpY2VzICUwOHgiLAorICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKERFRkFVTFRfT1VUUFVUX0RFVklDRV9UQUcsIG5vZGUtPm5hbWUpID09IDApIHsKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSAoYXVkaW9fZGV2aWNlc190KXN0cmluZ1RvRW51bShzRGV2aWNlTmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0RldmljZU5hbWVUb0VudW1UYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgICAgICBpZiAoZGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2UgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihTdHJpbmc4KCIiKSwgZGV2aWNlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coImxvYWRHbG9iYWxDb25maWcoKSBkZWZhdWx0IGRldmljZSBub3Qgc3BlY2lmaWVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigibG9hZEdsb2JhbENvbmZpZygpIG1EZWZhdWx0T3V0cHV0RGV2aWNlICUwOHgiLCBtRGVmYXVsdE91dHB1dERldmljZS0+bURldmljZVR5cGUpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChBVFRBQ0hFRF9JTlBVVF9ERVZJQ0VTX1RBRywgbm9kZS0+bmFtZSkgPT0gMCkgeworICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5sb2FkRGV2aWNlc0Zyb21OYW1lKChjaGFyICopbm9kZS0+dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyZWREZXZpY2VzKTsKKyAgICAgICAgICAgIEFMT0dWKCJsb2FkR2xvYmFsQ29uZmlnKCkgQXZhaWxhYmxlIElucHV0RGV2aWNlcyAlMDh4IiwgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoU1BFQUtFUl9EUkNfRU5BQkxFRF9UQUcsIG5vZGUtPm5hbWUpID09IDApIHsKKyAgICAgICAgICAgIG1TcGVha2VyRHJjRW5hYmxlZCA9IHN0cmluZ1RvQm9vbCgoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgICAgIEFMT0dWKCJsb2FkR2xvYmFsQ29uZmlnKCkgbVNwZWFrZXJEcmNFbmFibGVkID0gJWQiLCBtU3BlYWtlckRyY0VuYWJsZWQpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChBVURJT19IQUxfVkVSU0lPTl9UQUcsIG5vZGUtPm5hbWUpID09IDApIHsKKyAgICAgICAgICAgIHVpbnQzMl90IG1ham9yLCBtaW5vcjsKKyAgICAgICAgICAgIHNzY2FuZigoY2hhciAqKW5vZGUtPnZhbHVlLCAiJXUuJXUiLCAmbWFqb3IsICZtaW5vcik7CisgICAgICAgICAgICBtb2R1bGUtPm1IYWxWZXJzaW9uID0gSEFSRFdBUkVfREVWSUNFX0FQSV9WRVJTSU9OKG1ham9yLCBtaW5vcik7CisgICAgICAgICAgICBBTE9HVigibG9hZEdsb2JhbENvbmZpZygpIG1IYWxWZXJzaW9uID0gJTA0eCBtYWpvciAldSBtaW5vciAldSIsCisgICAgICAgICAgICAgICAgICBtb2R1bGUtPm1IYWxWZXJzaW9uLCBtYWpvciwgbWlub3IpOworICAgICAgICB9CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsb2FkQXVkaW9Qb2xpY3lDb25maWcoY29uc3QgY2hhciAqcGF0aCkKK3sKKyAgICBjbm9kZSAqcm9vdDsKKyAgICBjaGFyICpkYXRhOworCisgICAgZGF0YSA9IChjaGFyICopbG9hZF9maWxlKHBhdGgsIE5VTEwpOworICAgIGlmIChkYXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgfQorICAgIHJvb3QgPSBjb25maWdfbm9kZSgiIiwgIiIpOworICAgIGNvbmZpZ19sb2FkKHJvb3QsIGRhdGEpOworCisgICAgbG9hZEh3TW9kdWxlcyhyb290KTsKKyAgICAvLyBsZWdhY3kgYXVkaW9fcG9saWN5LmNvbmYgZmlsZXMgaGF2ZSBvbmUgZ2xvYmFsX2NvbmZpZ3VyYXRpb24gc2VjdGlvbgorICAgIGxvYWRHbG9iYWxDb25maWcocm9vdCwgZ2V0TW9kdWxlRnJvbU5hbWUoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1BSSU1BUlkpKTsKKyAgICBjb25maWdfZnJlZShyb290KTsKKyAgICBmcmVlKHJvb3QpOworICAgIGZyZWUoZGF0YSk7CisKKyAgICBBTE9HSSgibG9hZEF1ZGlvUG9saWN5Q29uZmlnKCkgbG9hZGVkICVzXG4iLCBwYXRoKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmRlZmF1bHRBdWRpb1BvbGljeUNvbmZpZyh2b2lkKQoreworICAgIHNwPEh3TW9kdWxlPiBtb2R1bGU7CisgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlOworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRlZmF1bHRJbnB1dERldmljZSA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKFN0cmluZzgoIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQyk7CisgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuYWRkKG1EZWZhdWx0T3V0cHV0RGV2aWNlKTsKKyAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmFkZChkZWZhdWx0SW5wdXREZXZpY2UpOworCisgICAgbW9kdWxlID0gbmV3IEh3TW9kdWxlKCJwcmltYXJ5Iik7CisKKyAgICBwcm9maWxlID0gbmV3IElPUHJvZmlsZShTdHJpbmc4KCJwcmltYXJ5IiksIEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UsIG1vZHVsZSk7CisgICAgcHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuYWRkKDQ0MTAwKTsKKyAgICBwcm9maWxlLT5tRm9ybWF0cy5hZGQoQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpOworICAgIHByb2ZpbGUtPm1DaGFubmVsTWFza3MuYWRkKEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyk7CisgICAgcHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuYWRkKG1EZWZhdWx0T3V0cHV0RGV2aWNlKTsKKyAgICBwcm9maWxlLT5tRmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19QUklNQVJZOworICAgIG1vZHVsZS0+bU91dHB1dFByb2ZpbGVzLmFkZChwcm9maWxlKTsKKworICAgIHByb2ZpbGUgPSBuZXcgSU9Qcm9maWxlKFN0cmluZzgoInByaW1hcnkiKSwgQVVESU9fUE9SVF9ST0xFX1NJTkssIG1vZHVsZSk7CisgICAgcHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuYWRkKDgwMDApOworICAgIHByb2ZpbGUtPm1Gb3JtYXRzLmFkZChBVURJT19GT1JNQVRfUENNXzE2X0JJVCk7CisgICAgcHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5hZGQoQVVESU9fQ0hBTk5FTF9JTl9NT05PKTsKKyAgICBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5hZGQoZGVmYXVsdElucHV0RGV2aWNlKTsKKyAgICBtb2R1bGUtPm1JbnB1dFByb2ZpbGVzLmFkZChwcm9maWxlKTsKKworICAgIG1Id01vZHVsZXMuYWRkKG1vZHVsZSk7Cit9CisKK2F1ZGlvX3N0cmVhbV90eXBlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKQoreworICAgIC8vIGZsYWdzIHRvIHN0cmVhbSB0eXBlIG1hcHBpbmcKKyAgICBpZiAoKGF0dHItPmZsYWdzICYgQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSA9PSBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQpIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFOworICAgIH0KKyAgICBpZiAoKGF0dHItPmZsYWdzICYgQVVESU9fRkxBR19TQ08pID09IEFVRElPX0ZMQUdfU0NPKSB7CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTzsKKyAgICB9CisKKyAgICAvLyB1c2FnZSB0byBzdHJlYW0gdHlwZSBtYXBwaW5nCisgICAgc3dpdGNoIChhdHRyLT51c2FnZSkgeworICAgIGNhc2UgQVVESU9fVVNBR0VfTUVESUE6CisgICAgY2FzZSBBVURJT19VU0FHRV9HQU1FOgorICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZOgorICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFOgorICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX01VU0lDOworICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT046CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fU1lTVEVNOworICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTjoKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMOworCisgICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkc6CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fRFRNRjsKKworICAgIGNhc2UgQVVESU9fVVNBR0VfQUxBUk06CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fQUxBUk07CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FOgorICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1JJTkc7CisKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTjoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1Q6CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRDoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVDoKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT047CisKKyAgICBjYXNlIEFVRElPX1VTQUdFX1VOS05PV046CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9NVVNJQzsKKyAgICB9Cit9Cit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lNYW5hZ2VyLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeU1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWE3Yjk3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lNYW5hZ2VyLmgKQEAgLTAsMCArMSw4NTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxjdXRpbHMvY29uZmlnX3V0aWxzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL21pc2MuaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgorI2luY2x1ZGUgIkF1ZGlvUG9saWN5SW50ZXJmYWNlLmgiCisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEF0dGVudWF0aW9uIGFwcGxpZWQgdG8gU1RSQVRFR1lfU09OSUZJQ0FUSU9OIHN0cmVhbXMgd2hlbiBhIGhlYWRzZXQgaXMgY29ubmVjdGVkOiA2ZEIKKyNkZWZpbmUgU09OSUZJQ0FUSU9OX0hFQURTRVRfVk9MVU1FX0ZBQ1RPUiAwLjUKKy8vIE1pbiB2b2x1bWUgZm9yIFNUUkFURUdZX1NPTklGSUNBVElPTiBzdHJlYW1zIHdoZW4gbGltaXRlZCBieSBtdXNpYyB2b2x1bWU6IC0zNmRCCisjZGVmaW5lIFNPTklGSUNBVElPTl9IRUFEU0VUX1ZPTFVNRV9NSU4gIDAuMDE2CisvLyBUaW1lIGluIG1pbGxpc2Vjb25kcyBkdXJpbmcgd2hpY2ggd2UgY29uc2lkZXIgdGhhdCBtdXNpYyBpcyBzdGlsbCBhY3RpdmUgYWZ0ZXIgYSBtdXNpYworLy8gdHJhY2sgd2FzIHN0b3BwZWQgLSBzZWUgY29tcHV0ZVZvbHVtZSgpCisjZGVmaW5lIFNPTklGSUNBVElPTl9IRUFEU0VUX01VU0lDX0RFTEFZICA1MDAwCisvLyBUaW1lIGluIG1pbGxpc2Vjb25kcyBhZnRlciBtZWRpYSBzdG9wcGVkIHBsYXlpbmcgZHVyaW5nIHdoaWNoIHdlIGNvbnNpZGVyIHRoYXQgdGhlCisvLyBzb25pZmljYXRpb24gc2hvdWxkIGJlIGFzIHVub2J0cnVzaXZlIGFzIGR1cmluZyB0aGUgdGltZSBtZWRpYSB3YXMgcGxheWluZy4KKyNkZWZpbmUgU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUxfQUZURVJfTVVTSUNfREVMQVkgNTAwMAorLy8gVGltZSBpbiBtaWxsaXNlY29uZHMgZHVyaW5nIHdpdGNoIHNvbWUgc3RyZWFtcyBhcmUgbXV0ZWQgd2hpbGUgdGhlIGF1ZGlvIHBhdGgKKy8vIGlzIHN3aXRjaGVkCisjZGVmaW5lIE1VVEVfVElNRV9NUyAyMDAwCisKKyNkZWZpbmUgTlVNX1RFU1RfT1VUUFVUUyA1CisKKyNkZWZpbmUgTlVNX1ZPTF9DVVJWRV9LTkVFUyAyCisKKy8vIERlZmF1bHQgbWluaW11bSBsZW5ndGggYWxsb3dlZCBmb3Igb2ZmbG9hZGluZyBhIGNvbXByZXNzZWQgdHJhY2sKKy8vIENhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSBhdWRpby5vZmZsb2FkLm1pbi5kdXJhdGlvbi5zZWNzIHByb3BlcnR5CisjZGVmaW5lIE9GRkxPQURfREVGQVVMVF9NSU5fRFVSQVRJT05fU0VDUyA2MAorCisjZGVmaW5lIE1BWF9NSVhFUl9TQU1QTElOR19SQVRFIDQ4MDAwCisjZGVmaW5lIE1BWF9NSVhFUl9DSEFOTkVMX0NPVU5UIDgKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQXVkaW9Qb2xpY3lNYW5hZ2VyIGltcGxlbWVudHMgYXVkaW8gcG9saWN5IG1hbmFnZXIgYmVoYXZpb3IgY29tbW9uIHRvIGFsbCBwbGF0Zm9ybXMuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIEF1ZGlvUG9saWN5TWFuYWdlcjogcHVibGljIEF1ZGlvUG9saWN5SW50ZXJmYWNlCisjaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKKyAgICAsIHB1YmxpYyBUaHJlYWQKKyNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCit7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICBBdWRpb1BvbGljeU1hbmFnZXIoQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSk7CisgICAgICAgIHZpcnR1YWwgfkF1ZGlvUG9saWN5TWFuYWdlcigpOworCisgICAgICAgIC8vIEF1ZGlvUG9saWN5SW50ZXJmYWNlCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKTsKKyAgICAgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZyk7CisgICAgICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0U3lzdGVtUHJvcGVydHkoY29uc3QgY2hhciogcHJvcGVydHksIGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKTsKKyAgICAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyk7CisgICAgICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uID0gMCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uID0gMCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CisgICAgICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0SW5wdXQoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpOworCisgICAgICAgIC8vIGluZGljYXRlcyB0byB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgdGhhdCB0aGUgaW5wdXQgc3RhcnRzIGJlaW5nIHVzZWQuCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKworICAgICAgICAvLyBpbmRpY2F0ZXMgdG8gdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRoYXQgdGhlIGlucHV0IHN0b3BzIGJlaW5nIHVzZWQuCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisgICAgICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgICAgICB2aXJ0dWFsIHZvaWQgY2xvc2VBbGxJbnB1dHMoKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1heCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSk7CisKKyAgICAgICAgLy8gcmV0dXJuIHRoZSBzdHJhdGVneSBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gc3RyZWFtIHR5cGUKKyAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CisgICAgICAgIC8vIHJldHVybiB0aGUgc3RyYXRlZ3kgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYXVkaW8gYXR0cmlidXRlcworICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIpOworCisgICAgICAgIC8vIHJldHVybiB0aGUgZW5hYmxlZCBvdXRwdXQgZGV2aWNlcyBmb3IgdGhlIGdpdmVuIHN0cmVhbSB0eXBlCisgICAgICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOworCisgICAgICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MgPSBOVUxMKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5yZWdpc3RlckVmZmVjdChpbnQgaWQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEVmZmVjdEVuYWJsZWQoaW50IGlkLCBib29sIGVuYWJsZWQpOworCisgICAgICAgIHZpcnR1YWwgYm9vbCBpc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKKyAgICAgICAgLy8gcmV0dXJuIHdoZXRoZXIgYSBzdHJlYW0gaXMgcGxheWluZyByZW1vdGVseSwgb3ZlcnJpZGUgdG8gY2hhbmdlIHRoZSBkZWZpbml0aW9uIG9mCisgICAgICAgIC8vICAgbG9jYWwvcmVtb3RlIHBsYXliYWNrLCB1c2VkIGZvciBpbnN0YW5jZSBieSBub3RpZmljYXRpb24gbWFuYWdlciB0byBub3QgbWFrZQorICAgICAgICAvLyAgIG1lZGlhIHBsYXllcnMgbG9zZSBhdWRpbyBmb2N1cyB3aGVuIG5vdCBwbGF5aW5nIGxvY2FsbHkKKyAgICAgICAgdmlydHVhbCBib29sIGlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7CisgICAgICAgIHZpcnR1YWwgYm9vbCBpc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0OworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOworCisgICAgICAgIHZpcnR1YWwgYm9vbCBpc09mZmxvYWRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QmIG9mZmxvYWRJbmZvKTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BvcnRzKGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOworICAgICAgICB2aXJ0dWFsIHZvaWQgY2xlYXJBdWRpb1BhdGNoZXModWlkX3QgdWlkKTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlvSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZSk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisKK3Byb3RlY3RlZDoKKworICAgICAgICBlbnVtIHJvdXRpbmdfc3RyYXRlZ3kgeworICAgICAgICAgICAgU1RSQVRFR1lfTUVESUEsCisgICAgICAgICAgICBTVFJBVEVHWV9QSE9ORSwKKyAgICAgICAgICAgIFNUUkFURUdZX1NPTklGSUNBVElPTiwKKyAgICAgICAgICAgIFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMLAorICAgICAgICAgICAgU1RSQVRFR1lfRFRNRiwKKyAgICAgICAgICAgIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUsCisgICAgICAgICAgICBOVU1fU1RSQVRFR0lFUworICAgICAgICB9OworCisgICAgICAgIC8vIDQgcG9pbnRzIHRvIGRlZmluZSB0aGUgdm9sdW1lIGF0dGVudWF0aW9uIGN1cnZlLCBlYWNoIGNoYXJhY3Rlcml6ZWQgYnkgdGhlIHZvbHVtZQorICAgICAgICAvLyBpbmRleCAoZnJvbSAwIHRvIDEwMCkgYXQgd2hpY2ggdGhleSBhcHBseSwgYW5kIHRoZSBhdHRlbnVhdGlvbiBpbiBkQiBhdCB0aGF0IGluZGV4LgorICAgICAgICAvLyB3ZSB1c2UgMTAwIHN0ZXBzIHRvIGF2b2lkIHJvdW5kaW5nIGVycm9ycyB3aGVuIGNvbXB1dGluZyB0aGUgdm9sdW1lIGluIHZvbEluZGV4VG9BbXBsKCkKKworICAgICAgICBlbnVtIHsgVk9MTUlOID0gMCwgVk9MS05FRTEgPSAxLCBWT0xLTkVFMiA9IDIsIFZPTE1BWCA9IDMsIFZPTENOVCA9IDR9OworCisgICAgICAgIGNsYXNzIFZvbHVtZUN1cnZlUG9pbnQKKyAgICAgICAgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBpbnQgbUluZGV4OworICAgICAgICAgICAgZmxvYXQgbURCQXR0ZW51YXRpb247CisgICAgICAgIH07CisKKyAgICAgICAgLy8gZGV2aWNlIGNhdGVnb3JpZXMgdXNlZCBmb3Igdm9sdW1lIGN1cnZlIG1hbmFnZW1lbnQuCisgICAgICAgIGVudW0gZGV2aWNlX2NhdGVnb3J5IHsKKyAgICAgICAgICAgIERFVklDRV9DQVRFR09SWV9IRUFEU0VULAorICAgICAgICAgICAgREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIsCisgICAgICAgICAgICBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UsCisgICAgICAgICAgICBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBLAorICAgICAgICAgICAgREVWSUNFX0NBVEVHT1JZX0NOVAorICAgICAgICB9OworCisgICAgICAgIGNsYXNzIEh3TW9kdWxlOworCisgICAgICAgIGNsYXNzIEF1ZGlvR2FpbjogcHVibGljIFJlZkJhc2UKKyAgICAgICAgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBBdWRpb0dhaW4oaW50IGluZGV4LCBib29sIHVzZUluQ2hhbm5lbE1hc2spOworICAgICAgICAgICAgdmlydHVhbCB+QXVkaW9HYWluKCkge30KKworICAgICAgICAgICAgdm9pZCBkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKKworICAgICAgICAgICAgdm9pZCBnZXREZWZhdWx0Q29uZmlnKHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyAqY29uZmlnKTsKKyAgICAgICAgICAgIHN0YXR1c190IGNoZWNrQ29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyAqY29uZmlnKTsKKyAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIG1JbmRleDsKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19nYWluIG1HYWluOworICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgbVVzZUluQ2hhbm5lbE1hc2s7CisgICAgICAgIH07CisKKyAgICAgICAgY2xhc3MgQXVkaW9Qb3J0OiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlCisgICAgICAgIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgQXVkaW9Qb3J0KGNvbnN0IFN0cmluZzgmIG5hbWUsIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwgY29uc3Qgc3A8SHdNb2R1bGU+JiBtb2R1bGUpOworICAgICAgICAgICAgdmlydHVhbCB+QXVkaW9Qb3J0KCkge30KKworICAgICAgICAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdDsKKworICAgICAgICAgICAgdm9pZCBpbXBvcnRBdWRpb1BvcnQoY29uc3Qgc3A8QXVkaW9Qb3J0PiBwb3J0KTsKKyAgICAgICAgICAgIHZvaWQgY2xlYXJDYXBhYmlsaXRpZXMoKTsKKworICAgICAgICAgICAgdm9pZCBsb2FkU2FtcGxpbmdSYXRlcyhjaGFyICpuYW1lKTsKKyAgICAgICAgICAgIHZvaWQgbG9hZEZvcm1hdHMoY2hhciAqbmFtZSk7CisgICAgICAgICAgICB2b2lkIGxvYWRPdXRDaGFubmVscyhjaGFyICpuYW1lKTsKKyAgICAgICAgICAgIHZvaWQgbG9hZEluQ2hhbm5lbHMoY2hhciAqbmFtZSk7CisKKyAgICAgICAgICAgIGF1ZGlvX2dhaW5fbW9kZV90IGxvYWRHYWluTW9kZShjaGFyICpuYW1lKTsKKyAgICAgICAgICAgIHZvaWQgbG9hZEdhaW4oY25vZGUgKnJvb3QsIGludCBpbmRleCk7CisgICAgICAgICAgICB2b2lkIGxvYWRHYWlucyhjbm9kZSAqcm9vdCk7CisKKyAgICAgICAgICAgIC8vIHNlYXJjaGVzIGZvciBhbiBleGFjdCBtYXRjaAorICAgICAgICAgICAgc3RhdHVzX3QgY2hlY2tFeGFjdFNhbXBsaW5nUmF0ZSh1aW50MzJfdCBzYW1wbGluZ1JhdGUpIGNvbnN0OworICAgICAgICAgICAgLy8gc2VhcmNoZXMgZm9yIGEgY29tcGF0aWJsZSBtYXRjaCwgYW5kIHJldHVybnMgdGhlIGJlc3QgbWF0Y2ggdmlhIHVwZGF0ZWRTYW1wbGluZ1JhdGUKKyAgICAgICAgICAgIHN0YXR1c190IGNoZWNrQ29tcGF0aWJsZVNhbXBsaW5nUmF0ZSh1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICp1cGRhdGVkU2FtcGxpbmdSYXRlKSBjb25zdDsKKyAgICAgICAgICAgIC8vIHNlYXJjaGVzIGZvciBhbiBleGFjdCBtYXRjaAorICAgICAgICAgICAgc3RhdHVzX3QgY2hlY2tFeGFjdENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKSBjb25zdDsKKyAgICAgICAgICAgIC8vIHNlYXJjaGVzIGZvciBhIGNvbXBhdGlibGUgbWF0Y2gsIGN1cnJlbnRseSBpbXBsZW1lbnRlZCBmb3IgaW5wdXQgY2hhbm5lbCBtYXNrcyBvbmx5CisgICAgICAgICAgICBzdGF0dXNfdCBjaGVja0NvbXBhdGlibGVDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaykgY29uc3Q7CisgICAgICAgICAgICBzdGF0dXNfdCBjaGVja0Zvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0OworICAgICAgICAgICAgc3RhdHVzX3QgY2hlY2tHYWluKGNvbnN0IHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyAqZ2FpbkNvbmZpZywgaW50IGluZGV4KSBjb25zdDsKKworICAgICAgICAgICAgdWludDMyX3QgcGlja1NhbXBsaW5nUmF0ZSgpIGNvbnN0OworICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgcGlja0NoYW5uZWxNYXNrKCkgY29uc3Q7CisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBwaWNrRm9ybWF0KCkgY29uc3Q7CisKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBhdWRpb19mb3JtYXRfdCBzUGNtRm9ybWF0Q29tcGFyZVRhYmxlW107CisgICAgICAgICAgICBzdGF0aWMgaW50IGNvbXBhcmVGb3JtYXRzKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdDEsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdDIpOworCisgICAgICAgICAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdDsKKworICAgICAgICAgICAgU3RyaW5nOCAgICAgICAgICAgbU5hbWU7CisgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCBtVHlwZTsKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfcm9sZV90IG1Sb2xlOworICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgbVVzZUluQ2hhbm5lbE1hc2s7CisgICAgICAgICAgICAvLyBieSBjb252ZW50aW9uLCAiMCcgaW4gdGhlIGZpcnN0IGVudHJ5IGluIG1TYW1wbGluZ1JhdGVzLCBtQ2hhbm5lbE1hc2tzIG9yIG1Gb3JtYXRzCisgICAgICAgICAgICAvLyBpbmRpY2F0ZXMgdGhlIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIHNob3VsZCBiZSByZWFkIGZyb20gdGhlIG91dHB1dCBzdHJlYW0KKyAgICAgICAgICAgIC8vIGFmdGVyIGl0IGlzIG9wZW5lZCBmb3IgdGhlIGZpcnN0IHRpbWUKKyAgICAgICAgICAgIFZlY3RvciA8dWludDMyX3Q+IG1TYW1wbGluZ1JhdGVzOyAvLyBzdXBwb3J0ZWQgc2FtcGxpbmcgcmF0ZXMKKyAgICAgICAgICAgIFZlY3RvciA8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+IG1DaGFubmVsTWFza3M7IC8vIHN1cHBvcnRlZCBjaGFubmVsIG1hc2tzCisgICAgICAgICAgICBWZWN0b3IgPGF1ZGlvX2Zvcm1hdF90PiBtRm9ybWF0czsgLy8gc3VwcG9ydGVkIGF1ZGlvIGZvcm1hdHMKKyAgICAgICAgICAgIFZlY3RvciA8IHNwPEF1ZGlvR2Fpbj4gPiBtR2FpbnM7IC8vIGdhaW4gY29udHJvbGxlcnMKKyAgICAgICAgICAgIHNwPEh3TW9kdWxlPiBtTW9kdWxlOyAgICAgICAgICAgICAgICAgLy8gYXVkaW8gSFcgbW9kdWxlIGV4cG9zaW5nIHRoaXMgSS9PIHN0cmVhbQorICAgICAgICAgICAgdWludDMyX3QgbUZsYWdzOyAvLyBhdHRyaWJ1dGUgZmxhZ3MgKGUuZyBwcmltYXJ5IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpcmVjdCBvdXRwdXQuLi4pLgorICAgICAgICB9OworCisgICAgICAgIGNsYXNzIEF1ZGlvUG9ydENvbmZpZzogcHVibGljIHZpcnR1YWwgUmVmQmFzZQorICAgICAgICB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIEF1ZGlvUG9ydENvbmZpZygpOworICAgICAgICAgICAgdmlydHVhbCB+QXVkaW9Qb3J0Q29uZmlnKCkge30KKworICAgICAgICAgICAgc3RhdHVzX3QgYXBwbHlBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmJhY2t1cENvbmZpZyA9IE5VTEwpOworICAgICAgICAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZyA9IE5VTEwpIGNvbnN0ID0gMDsKKyAgICAgICAgICAgIHZpcnR1YWwgc3A8QXVkaW9Qb3J0PiBnZXRBdWRpb1BvcnQoKSBjb25zdCA9IDA7CisgICAgICAgICAgICB1aW50MzJfdCBtU2FtcGxpbmdSYXRlOworICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgbUZvcm1hdDsKKyAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1DaGFubmVsTWFzazsKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyBtR2FpbjsKKyAgICAgICAgfTsKKworCisgICAgICAgIGNsYXNzIEF1ZGlvUGF0Y2g6IHB1YmxpYyBSZWZCYXNlCisgICAgICAgIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsIHVpZF90IHVpZCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhhbmRsZShoYW5kbGUpLCBtUGF0Y2goKnBhdGNoKSwgbVVpZCh1aWQpLCBtQWZQYXRjaEhhbmRsZSgwKSB7fQorCisgICAgICAgICAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKKworICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbUhhbmRsZTsKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBtUGF0Y2g7CisgICAgICAgICAgICB1aWRfdCBtVWlkOworICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbUFmUGF0Y2hIYW5kbGU7CisgICAgICAgIH07CisKKyAgICAgICAgY2xhc3MgRGV2aWNlRGVzY3JpcHRvcjogcHVibGljIEF1ZGlvUG9ydCwgcHVibGljIEF1ZGlvUG9ydENvbmZpZworICAgICAgICB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIERldmljZURlc2NyaXB0b3IoY29uc3QgU3RyaW5nOCYgbmFtZSwgYXVkaW9fZGV2aWNlc190IHR5cGUpOworCisgICAgICAgICAgICB2aXJ0dWFsIH5EZXZpY2VEZXNjcmlwdG9yKCkge30KKworICAgICAgICAgICAgYm9vbCBlcXVhbHMoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIG90aGVyKSBjb25zdDsKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcgPSBOVUxMKSBjb25zdDsKKyAgICAgICAgICAgIHZpcnR1YWwgc3A8QXVkaW9Qb3J0PiBnZXRBdWRpb1BvcnQoKSBjb25zdCB7IHJldHVybiAoQXVkaW9Qb3J0KikgdGhpczsgfQorCisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0OworCisgICAgICAgICAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKKworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG1EZXZpY2VUeXBlOworICAgICAgICAgICAgU3RyaW5nOCBtQWRkcmVzczsKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgbUlkOworICAgICAgICB9OworCisgICAgICAgIGNsYXNzIERldmljZVZlY3RvciA6IHB1YmxpYyBTb3J0ZWRWZWN0b3I8IHNwPERldmljZURlc2NyaXB0b3I+ID4KKyAgICAgICAgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBEZXZpY2VWZWN0b3IoKSA6IFNvcnRlZFZlY3RvcigpLCBtRGV2aWNlVHlwZXMoQVVESU9fREVWSUNFX05PTkUpIHt9CisKKyAgICAgICAgICAgIHNzaXplX3QgICAgICAgICBhZGQoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pOworICAgICAgICAgICAgc3NpemVfdCAgICAgICAgIHJlbW92ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgaXRlbSk7CisgICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgaW5kZXhPZihjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgaXRlbSkgY29uc3Q7CisKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlcygpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2VUeXBlczsgfQorCisgICAgICAgICAgICB2b2lkIGxvYWREZXZpY2VzRnJvbVR5cGUoYXVkaW9fZGV2aWNlc190IHR5cGVzKTsKKyAgICAgICAgICAgIHZvaWQgbG9hZERldmljZXNGcm9tTmFtZShjaGFyICpuYW1lLCBjb25zdCBEZXZpY2VWZWN0b3ImIGRlY2xhcmVkRGV2aWNlcyk7CisKKyAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZShhdWRpb19kZXZpY2VzX3QgdHlwZSwgU3RyaW5nOCBhZGRyZXNzKSBjb25zdDsKKyAgICAgICAgICAgIERldmljZVZlY3RvciBnZXREZXZpY2VzRnJvbVR5cGUoYXVkaW9fZGV2aWNlc190IHR5cGVzKSBjb25zdDsKKyAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZUZyb21JZChhdWRpb19wb3J0X2hhbmRsZV90IGlkKSBjb25zdDsKKyAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZUZyb21OYW1lKGNvbnN0IFN0cmluZzgmIG5hbWUpIGNvbnN0OworICAgICAgICAgICAgRGV2aWNlVmVjdG9yIGdldERldmljZXNGcm9tVHlwZUFkZHIoYXVkaW9fZGV2aWNlc190IHR5cGUsIFN0cmluZzggYWRkcmVzcykKKyAgICAgICAgICAgICAgICAgICAgY29uc3Q7CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIHZvaWQgcmVmcmVzaFR5cGVzKCk7CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbURldmljZVR5cGVzOworICAgICAgICB9OworCisgICAgICAgIC8vIHRoZSBJT1Byb2ZpbGUgY2xhc3MgZGVzY3JpYmVzIHRoZSBjYXBhYmlsaXRpZXMgb2YgYW4gb3V0cHV0IG9yIGlucHV0IHN0cmVhbS4KKyAgICAgICAgLy8gSXQgaXMgY3VycmVudGx5IGFzc3VtZWQgdGhhdCBhbGwgY29tYmluYXRpb24gb2YgbGlzdGVkIHBhcmFtZXRlcnMgYXJlIHN1cHBvcnRlZC4KKyAgICAgICAgLy8gSXQgaXMgdXNlZCBieSB0aGUgcG9saWN5IG1hbmFnZXIgdG8gZGV0ZXJtaW5lIGlmIGFuIG91dHB1dCBvciBpbnB1dCBpcyBzdWl0YWJsZSBmb3IKKyAgICAgICAgLy8gYSBnaXZlbiB1c2UgY2FzZSwgIG9wZW4vY2xvc2UgaXQgYWNjb3JkaW5nbHkgYW5kIGNvbm5lY3QvZGlzY29ubmVjdCBhdWRpbyB0cmFja3MKKyAgICAgICAgLy8gdG8vZnJvbSBpdC4KKyAgICAgICAgY2xhc3MgSU9Qcm9maWxlIDogcHVibGljIEF1ZGlvUG9ydAorICAgICAgICB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIElPUHJvZmlsZShjb25zdCBTdHJpbmc4JiBuYW1lLCBhdWRpb19wb3J0X3JvbGVfdCByb2xlLCBjb25zdCBzcDxId01vZHVsZT4mIG1vZHVsZSk7CisgICAgICAgICAgICB2aXJ0dWFsIH5JT1Byb2ZpbGUoKTsKKworICAgICAgICAgICAgLy8gVGhpcyBtZXRob2QgaXMgdXNlZCBmb3IgYm90aCBvdXRwdXQgYW5kIGlucHV0LgorICAgICAgICAgICAgLy8gSWYgcGFyYW1ldGVyIHVwZGF0ZWRTYW1wbGluZ1JhdGUgaXMgbm9uLU5VTEwsIGl0IGlzIGFzc2lnbmVkIHRoZSBhY3R1YWwgc2FtcGxlIHJhdGUuCisgICAgICAgICAgICAvLyBGb3IgaW5wdXQsIGZsYWdzIGlzIGludGVycHJldGVkIGFzIGF1ZGlvX2lucHV0X2ZsYWdzX3QuCisgICAgICAgICAgICAvLyBUT0RPOiBtZXJnZSBhdWRpb19vdXRwdXRfZmxhZ3NfdCBhbmQgYXVkaW9faW5wdXRfZmxhZ3NfdC4KKyAgICAgICAgICAgIGJvb2wgaXNDb21wYXRpYmxlUHJvZmlsZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqdXBkYXRlZFNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpIGNvbnN0OworCisgICAgICAgICAgICB2b2lkIGR1bXAoaW50IGZkKTsKKyAgICAgICAgICAgIHZvaWQgbG9nKCk7CisKKyAgICAgICAgICAgIERldmljZVZlY3RvciAgbVN1cHBvcnRlZERldmljZXM7IC8vIHN1cHBvcnRlZCBkZXZpY2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoZGV2aWNlcyB0aGlzIG91dHB1dCBjYW4gYmUgcm91dGVkIHRvKQorICAgICAgICB9OworCisgICAgICAgIGNsYXNzIEh3TW9kdWxlIDogcHVibGljIFJlZkJhc2UKKyAgICAgICAgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgIEh3TW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUpOworICAgICAgICAgICAgICAgICAgICB+SHdNb2R1bGUoKTsKKworICAgICAgICAgICAgc3RhdHVzX3QgbG9hZE91dHB1dChjbm9kZSAqcm9vdCk7CisgICAgICAgICAgICBzdGF0dXNfdCBsb2FkSW5wdXQoY25vZGUgKnJvb3QpOworICAgICAgICAgICAgc3RhdHVzX3QgbG9hZERldmljZShjbm9kZSAqcm9vdCk7CisKKyAgICAgICAgICAgIHZvaWQgZHVtcChpbnQgZmQpOworCisgICAgICAgICAgICBjb25zdCBjaGFyICpjb25zdCAgICAgICAgbU5hbWU7IC8vIGJhc2UgbmFtZSBvZiB0aGUgYXVkaW8gSFcgbW9kdWxlIChwcmltYXJ5LCBhMmRwIC4uLikKKyAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICBtSGFsVmVyc2lvbjsgLy8gYXVkaW8gSEFMIEFQSSB2ZXJzaW9uCisgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgICAgbUhhbmRsZTsKKyAgICAgICAgICAgIFZlY3RvciA8IHNwPElPUHJvZmlsZT4gPiBtT3V0cHV0UHJvZmlsZXM7IC8vIG91dHB1dCBwcm9maWxlcyBleHBvc2VkIGJ5IHRoaXMgbW9kdWxlCisgICAgICAgICAgICBWZWN0b3IgPCBzcDxJT1Byb2ZpbGU+ID4gbUlucHV0UHJvZmlsZXM7ICAvLyBpbnB1dCBwcm9maWxlcyBleHBvc2VkIGJ5IHRoaXMgbW9kdWxlCisgICAgICAgICAgICBEZXZpY2VWZWN0b3IgICAgICAgICAgICAgbURlY2xhcmVkRGV2aWNlczsgLy8gZGV2aWNlcyBkZWNsYXJlZCBpbiBhdWRpb19wb2xpY3kuY29uZgorCisgICAgICAgIH07CisKKyAgICAgICAgLy8gZGVmYXVsdCB2b2x1bWUgY3VydmUKKyAgICAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0RlZmF1bHRWb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF07CisgICAgICAgIC8vIGRlZmF1bHQgdm9sdW1lIGN1cnZlIGZvciBtZWRpYSBzdHJhdGVneQorICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOworICAgICAgICAvLyB2b2x1bWUgY3VydmUgZm9yIG5vbi1tZWRpYSBhdWRpbyBvbiBleHQgbWVkaWEgb3V0cHV0cyAoSERNSSwgTGluZSwgZXRjKQorICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF07CisgICAgICAgIC8vIHZvbHVtZSBjdXJ2ZSBmb3IgbWVkaWEgc3RyYXRlZ3kgb24gc3BlYWtlcnMKKyAgICAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXTsKKyAgICAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlRHJjW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXTsKKyAgICAgICAgLy8gdm9sdW1lIGN1cnZlIGZvciBzb25pZmljYXRpb24gc3RyYXRlZ3kgb24gc3BlYWtlcnMKKyAgICAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF07CisgICAgICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVEcmNbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOworICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXTsKKyAgICAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZURyY1tBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF07CisgICAgICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNIZWFkc2V0U3lzdGVtVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOworICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOworICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU3BlYWtlclZvaWNlVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOworICAgICAgICAvLyBkZWZhdWx0IHZvbHVtZSBjdXJ2ZXMgcGVyIHN0cmVhbSBhbmQgZGV2aWNlIGNhdGVnb3J5LiBTZWUgaW5pdGlhbGl6ZVZvbHVtZUN1cnZlcygpCisgICAgICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpzVm9sdW1lUHJvZmlsZXNbQVVESU9fU1RSRUFNX0NOVF1bREVWSUNFX0NBVEVHT1JZX0NOVF07CisKKyAgICAgICAgLy8gZGVzY3JpcHRvciBmb3IgYXVkaW8gb3V0cHV0cy4gVXNlZCB0byBtYWludGFpbiBjdXJyZW50IGNvbmZpZ3VyYXRpb24gb2YgZWFjaCBvcGVuZWQgYXVkaW8gb3V0cHV0CisgICAgICAgIC8vIGFuZCBrZWVwIHRyYWNrIG9mIHRoZSB1c2FnZSBvZiB0aGlzIG91dHB1dCBieSBlYWNoIGF1ZGlvIHN0cmVhbSB0eXBlLgorICAgICAgICBjbGFzcyBBdWRpb091dHB1dERlc2NyaXB0b3I6IHB1YmxpYyBBdWRpb1BvcnRDb25maWcKKyAgICAgICAgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBBdWRpb091dHB1dERlc2NyaXB0b3IoY29uc3Qgc3A8SU9Qcm9maWxlPiYgcHJvZmlsZSk7CisKKyAgICAgICAgICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKTsKKworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSgpIGNvbnN0OworICAgICAgICAgICAgdm9pZCBjaGFuZ2VSZWZDb3VudChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGRlbHRhKTsKKworICAgICAgICAgICAgYm9vbCBpc0R1cGxpY2F0ZWQoKSBjb25zdCB7IHJldHVybiAobU91dHB1dDEgIT0gTlVMTCAmJiBtT3V0cHV0MiAhPSBOVUxMKTsgfQorICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHN1cHBvcnRlZERldmljZXMoKTsKKyAgICAgICAgICAgIHVpbnQzMl90IGxhdGVuY3koKTsKKyAgICAgICAgICAgIGJvb2wgc2hhcmVzSHdNb2R1bGVXaXRoKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyk7CisgICAgICAgICAgICBib29sIGlzQWN0aXZlKHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7CisgICAgICAgICAgICBib29sIGlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3Qgc3lzVGltZSA9IDApIGNvbnN0OworICAgICAgICAgICAgYm9vbCBpc1N0cmF0ZWd5QWN0aXZlKHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCBzeXNUaW1lID0gMCkgY29uc3Q7CisKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcgPSBOVUxMKSBjb25zdDsKKyAgICAgICAgICAgIHZpcnR1YWwgc3A8QXVkaW9Qb3J0PiBnZXRBdWRpb1BvcnQoKSBjb25zdCB7IHJldHVybiBtUHJvZmlsZTsgfQorICAgICAgICAgICAgdm9pZCB0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3Q7CisKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgbUlkOworICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgbUlvSGFuZGxlOyAgICAgICAgICAgICAgLy8gb3V0cHV0IGhhbmRsZQorICAgICAgICAgICAgdWludDMyX3QgbUxhdGVuY3k7ICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IG1GbGFnczsgICAvLworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG1EZXZpY2U7ICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgZGV2aWNlIHRoaXMgb3V0cHV0IGlzIHJvdXRlZCB0bworICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbVBhdGNoSGFuZGxlOworICAgICAgICAgICAgdWludDMyX3QgbVJlZkNvdW50W0FVRElPX1NUUkVBTV9DTlRdOyAvLyBudW1iZXIgb2Ygc3RyZWFtcyBvZiBlYWNoIHR5cGUgdXNpbmcgdGhpcyBvdXRwdXQKKyAgICAgICAgICAgIG5zZWNzX3QgbVN0b3BUaW1lW0FVRElPX1NUUkVBTV9DTlRdOworICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtT3V0cHV0MTsgICAgLy8gdXNlZCBieSBkdXBsaWNhdGVkIG91dHB1dHM6IGZpcnN0IG91dHB1dAorICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtT3V0cHV0MjsgICAgLy8gdXNlZCBieSBkdXBsaWNhdGVkIG91dHB1dHM6IHNlY29uZCBvdXRwdXQKKyAgICAgICAgICAgIGZsb2F0IG1DdXJWb2x1bWVbQVVESU9fU1RSRUFNX0NOVF07ICAgLy8gY3VycmVudCBzdHJlYW0gdm9sdW1lCisgICAgICAgICAgICBpbnQgbU11dGVDb3VudFtBVURJT19TVFJFQU1fQ05UXTsgICAgIC8vIG11dGUgcmVxdWVzdCBjb3VudGVyCisgICAgICAgICAgICBjb25zdCBzcDxJT1Byb2ZpbGU+IG1Qcm9maWxlOyAgICAgICAgICAvLyBJL08gcHJvZmlsZSB0aGlzIG91dHB1dCBkZXJpdmVzIGZyb20KKyAgICAgICAgICAgIGJvb2wgbVN0cmF0ZWd5TXV0ZWRCeURldmljZVtOVU1fU1RSQVRFR0lFU107IC8vIHN0cmF0ZWdpZXMgbXV0ZWQgYmVjYXVzZSBvZiBpbmNvbXBhdGlibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRldmljZSBzZWxlY3Rpb24uIFNlZSBjaGVja0RldmljZU11dGVTdHJhdGVnaWVzKCkKKyAgICAgICAgICAgIHVpbnQzMl90IG1EaXJlY3RPcGVuQ291bnQ7IC8vIG51bWJlciBvZiBjbGllbnRzIHVzaW5nIHRoaXMgb3V0cHV0IChkaXJlY3Qgb3V0cHV0cyBvbmx5KQorICAgICAgICB9OworCisgICAgICAgIC8vIGRlc2NyaXB0b3IgZm9yIGF1ZGlvIGlucHV0cy4gVXNlZCB0byBtYWludGFpbiBjdXJyZW50IGNvbmZpZ3VyYXRpb24gb2YgZWFjaCBvcGVuZWQgYXVkaW8gaW5wdXQKKyAgICAgICAgLy8gYW5kIGtlZXAgdHJhY2sgb2YgdGhlIHVzYWdlIG9mIHRoaXMgaW5wdXQuCisgICAgICAgIGNsYXNzIEF1ZGlvSW5wdXREZXNjcmlwdG9yOiBwdWJsaWMgQXVkaW9Qb3J0Q29uZmlnCisgICAgICAgIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgQXVkaW9JbnB1dERlc2NyaXB0b3IoY29uc3Qgc3A8SU9Qcm9maWxlPiYgcHJvZmlsZSk7CisKKyAgICAgICAgICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKTsKKworICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgICAgICAgbUlkOworICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgICAgICAgICAgICAgbUlvSGFuZGxlOyAgICAgICAvLyBpbnB1dCBoYW5kbGUKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAgICAgICAgICAgICAgIG1EZXZpY2U7ICAgICAgICAgLy8gY3VycmVudCBkZXZpY2UgdGhpcyBpbnB1dCBpcyByb3V0ZWQgdG8KKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICAgICAgICAgIG1QYXRjaEhhbmRsZTsKKyAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgIG1SZWZDb3VudDsgICAgICAgLy8gbnVtYmVyIG9mIEF1ZGlvUmVjb3JkIGNsaWVudHMgdXNpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpbnB1dAorICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgbU9wZW5SZWZDb3VudDsKKyAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90ICAgICAgICAgICAgICAgIG1JbnB1dFNvdXJjZTsgICAgLy8gaW5wdXQgc291cmNlIHNlbGVjdGVkIGJ5IGFwcGxpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vKG1lZGlhcmVjb3JkZXIuaCkKKyAgICAgICAgICAgIGNvbnN0IHNwPElPUHJvZmlsZT4gICAgICAgICAgIG1Qcm9maWxlOyAgICAgICAgLy8gSS9PIHByb2ZpbGUgdGhpcyBvdXRwdXQgZGVyaXZlcyBmcm9tCisgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9fc2Vzc2lvbl90PiBtU2Vzc2lvbnM7ICAgICAgIC8vIGF1ZGlvIHNlc3Npb25zIGF0dGFjaGVkIHRvIHRoaXMgaW5wdXQKKyAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgIG1Jc1NvdW5kVHJpZ2dlcjsgLy8gdXNlZCBieSBhIHNvdW5kdHJpZ2dlciBjYXB0dXJlCisKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcgPSBOVUxMKSBjb25zdDsKKyAgICAgICAgICAgIHZpcnR1YWwgc3A8QXVkaW9Qb3J0PiBnZXRBdWRpb1BvcnQoKSBjb25zdCB7IHJldHVybiBtUHJvZmlsZTsgfQorICAgICAgICAgICAgdm9pZCB0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3Q7CisgICAgICAgIH07CisKKyAgICAgICAgLy8gc3RyZWFtIGRlc2NyaXB0b3IgdXNlZCBmb3Igdm9sdW1lIGNvbnRyb2wKKyAgICAgICAgY2xhc3MgU3RyZWFtRGVzY3JpcHRvcgorICAgICAgICB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIFN0cmVhbURlc2NyaXB0b3IoKTsKKworICAgICAgICAgICAgaW50IGdldFZvbHVtZUluZGV4KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOworICAgICAgICAgICAgdm9pZCBkdW1wKGludCBmZCk7CisKKyAgICAgICAgICAgIGludCBtSW5kZXhNaW47ICAgICAgLy8gbWluIHZvbHVtZSBpbmRleAorICAgICAgICAgICAgaW50IG1JbmRleE1heDsgICAgICAvLyBtYXggdm9sdW1lIGluZGV4CisgICAgICAgICAgICBLZXllZFZlY3RvcjxhdWRpb19kZXZpY2VzX3QsIGludD4gbUluZGV4Q3VyOyAgIC8vIGN1cnJlbnQgdm9sdW1lIGluZGV4IHBlciBkZXZpY2UKKyAgICAgICAgICAgIGJvb2wgbUNhbkJlTXV0ZWQ7ICAgLy8gdHJ1ZSBpcyB0aGUgc3RyZWFtIGNhbiBiZSBtdXRlZAorCisgICAgICAgICAgICBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICptVm9sdW1lQ3VydmVbREVWSUNFX0NBVEVHT1JZX0NOVF07CisgICAgICAgIH07CisKKyAgICAgICAgLy8gc3RyZWFtIGRlc2NyaXB0b3IgdXNlZCBmb3Igdm9sdW1lIGNvbnRyb2wKKyAgICAgICAgY2xhc3MgRWZmZWN0RGVzY3JpcHRvciA6IHB1YmxpYyBSZWZCYXNlCisgICAgICAgIHsKKyAgICAgICAgcHVibGljOgorCisgICAgICAgICAgICBzdGF0dXNfdCBkdW1wKGludCBmZCk7CisKKyAgICAgICAgICAgIGludCBtSW87ICAgICAgICAgICAgICAgIC8vIGlvIHRoZSBlZmZlY3QgaXMgYXR0YWNoZWQgdG8KKyAgICAgICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgbVN0cmF0ZWd5OyAvLyByb3V0aW5nIHN0cmF0ZWd5IHRoZSBlZmZlY3QgaXMgYXNzb2NpYXRlZCB0bworICAgICAgICAgICAgaW50IG1TZXNzaW9uOyAgICAgICAgICAgICAgIC8vIGF1ZGlvIHNlc3Npb24gdGhlIGVmZmVjdCBpcyBvbgorICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBtRGVzYzsgIC8vIGVmZmVjdCBkZXNjcmlwdG9yCisgICAgICAgICAgICBib29sIG1FbmFibGVkOyAgICAgICAgICAgICAgLy8gZW5hYmxlZCBzdGF0ZTogQ1BVIGxvYWQgYmVpbmcgdXNlZCBvciBub3QKKyAgICAgICAgfTsKKworICAgICAgICB2b2lkIGFkZE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyk7CisgICAgICAgIHZvaWQgYWRkSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MpOworCisgICAgICAgIC8vIHJldHVybiB0aGUgc3RyYXRlZ3kgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIHN0cmVhbSB0eXBlCisgICAgICAgIHN0YXRpYyByb3V0aW5nX3N0cmF0ZWd5IGdldFN0cmF0ZWd5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKKworICAgICAgICAvLyByZXR1cm4gYXBwcm9wcmlhdGUgZGV2aWNlIGZvciBzdHJlYW1zIGhhbmRsZWQgYnkgdGhlIHNwZWNpZmllZCBzdHJhdGVneSBhY2NvcmRpbmcgdG8gY3VycmVudAorICAgICAgICAvLyBwaG9uZSBzdGF0ZSwgY29ubmVjdGVkIGRldmljZXMuLi4KKyAgICAgICAgLy8gaWYgZnJvbUNhY2hlIGlzIHRydWUsIHRoZSBkZXZpY2UgaXMgcmV0dXJuZWQgZnJvbSBtRGV2aWNlRm9yU3RyYXRlZ3lbXSwKKyAgICAgICAgLy8gb3RoZXJ3aXNlIGl0IGlzIGRldGVybWluZSBieSBjdXJyZW50IHN0YXRlCisgICAgICAgIC8vIChkZXZpY2UgY29ubmVjdGVkLHBob25lIHN0YXRlLCBmb3JjZSB1c2UsIGEyZHAgb3V0cHV0Li4uKQorICAgICAgICAvLyBUaGlzIGFsbG93cyB0bzoKKyAgICAgICAgLy8gIDEgc3BlZWQgdXAgcHJvY2VzcyB3aGVuIHRoZSBzdGF0ZSBpcyBzdGFibGUgKHdoZW4gc3RhcnRpbmcgb3Igc3RvcHBpbmcgYW4gb3V0cHV0KQorICAgICAgICAvLyAgMiBhY2Nlc3MgdG8gZWl0aGVyIGN1cnJlbnQgZGV2aWNlIHNlbGVjdGlvbiAoZnJvbUNhY2hlID09IHRydWUpIG9yCisgICAgICAgIC8vICJmdXR1cmUiIGRldmljZSBzZWxlY3Rpb24gKGZyb21DYWNoZSA9PSBmYWxzZSkgd2hlbiBjYWxsZWQgZnJvbSBhIGNvbnRleHQKKyAgICAgICAgLy8gIHdoZXJlIGNvbmRpdGlvbnMgYXJlIGNoYW5naW5nIChzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSwgc2V0UGhvbmVTdGF0ZSgpLi4uKSBBTkQKKyAgICAgICAgLy8gIGJlZm9yZSB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpIGlzIGNhbGxlZC4KKyAgICAgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9yU3RyYXRlZ3kocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUpOworCisgICAgICAgIC8vIGNoYW5nZSB0aGUgcm91dGUgb2YgdGhlIHNwZWNpZmllZCBvdXRwdXQuIFJldHVybnMgdGhlIG51bWJlciBvZiBtcyB3ZSBoYXZlIHNsZXB0IHRvCisgICAgICAgIC8vIGFsbG93IG5ldyByb3V0aW5nIHRvIHRha2UgZWZmZWN0IGluIGNlcnRhaW4gY2FzZXMuCisgICAgICAgIHVpbnQzMl90IHNldE91dHB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhZGRyZXNzID0gTlVMTCk7CisgICAgICAgIHN0YXR1c190IHJlc2V0T3V0cHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUgPSBOVUxMKTsKKyAgICAgICAgc3RhdHVzX3Qgc2V0SW5wdXREZXZpY2UoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlID0gTlVMTCk7CisgICAgICAgIHN0YXR1c190IHJlc2V0SW5wdXREZXZpY2UoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlID0gTlVMTCk7CisKKyAgICAgICAgLy8gc2VsZWN0IGlucHV0IGRldmljZSBjb3JyZXNwb25kaW5nIHRvIHJlcXVlc3RlZCBhdWRpbyBzb3VyY2UKKyAgICAgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UpOworCisgICAgICAgIC8vIHJldHVybiBpbyBoYW5kbGUgb2YgYWN0aXZlIGlucHV0IG9yIDAgaWYgbm8gaW5wdXQgaXMgYWN0aXZlCisgICAgICAgIC8vICAgIE9ubHkgY29uc2lkZXJzIGlucHV0cyBmcm9tIHBoeXNpY2FsIGRldmljZXMgKGUuZy4gbWFpbiBtaWMsIGhlYWRzZXQgbWljKSB3aGVuCisgICAgICAgIC8vICAgIGlnbm9yZVZpcnR1YWxJbnB1dHMgaXMgdHJ1ZS4KKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZ2V0QWN0aXZlSW5wdXQoYm9vbCBpZ25vcmVWaXJ0dWFsSW5wdXRzID0gdHJ1ZSk7CisKKyAgICAgICAgdWludDMyX3QgYWN0aXZlSW5wdXRzQ291bnQoKSBjb25zdDsKKworICAgICAgICAvLyBpbml0aWFsaXplIHZvbHVtZSBjdXJ2ZXMgZm9yIGVhY2ggc3RyYXRlZ3kgYW5kIGRldmljZSBjYXRlZ29yeQorICAgICAgICB2b2lkIGluaXRpYWxpemVWb2x1bWVDdXJ2ZXMoKTsKKworICAgICAgICAvLyBjb21wdXRlIHRoZSBhY3R1YWwgdm9sdW1lIGZvciBhIGdpdmVuIHN0cmVhbSBhY2NvcmRpbmcgdG8gdGhlIHJlcXVlc3RlZCBpbmRleCBhbmQgYSBwYXJ0aWN1bGFyCisgICAgICAgIC8vIGRldmljZQorICAgICAgICB2aXJ0dWFsIGZsb2F0IGNvbXB1dGVWb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgYXVkaW9fZGV2aWNlc190IGRldmljZSk7CisKKyAgICAgICAgLy8gY2hlY2sgdGhhdCB2b2x1bWUgY2hhbmdlIGlzIHBlcm1pdHRlZCwgY29tcHV0ZSBhbmQgc2VuZCBuZXcgdm9sdW1lIHRvIGF1ZGlvIGhhcmR3YXJlCisgICAgICAgIHN0YXR1c190IGNoZWNrQW5kU2V0Vm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgaW5kZXgsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwgaW50IGRlbGF5TXMgPSAwLCBib29sIGZvcmNlID0gZmFsc2UpOworCisgICAgICAgIC8vIGFwcGx5IGFsbCBzdHJlYW0gdm9sdW1lcyB0byB0aGUgc3BlY2lmaWVkIG91dHB1dCBhbmQgZGV2aWNlCisgICAgICAgIHZvaWQgYXBwbHlTdHJlYW1Wb2x1bWVzKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgYXVkaW9fZGV2aWNlc190IGRldmljZSwgaW50IGRlbGF5TXMgPSAwLCBib29sIGZvcmNlID0gZmFsc2UpOworCisgICAgICAgIC8vIE11dGUgb3IgdW5tdXRlIGFsbCBzdHJlYW1zIGhhbmRsZWQgYnkgdGhlIHNwZWNpZmllZCBzdHJhdGVneSBvbiB0aGUgc3BlY2lmaWVkIG91dHB1dAorICAgICAgICB2b2lkIHNldFN0cmF0ZWd5TXV0ZShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IChhdWRpb19kZXZpY2VzX3QpMCk7CisKKyAgICAgICAgLy8gTXV0ZSBvciB1bm11dGUgdGhlIHN0cmVhbSBvbiB0aGUgc3BlY2lmaWVkIG91dHB1dAorICAgICAgICB2b2lkIHNldFN0cmVhbU11dGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IChhdWRpb19kZXZpY2VzX3QpMCk7CisKKyAgICAgICAgLy8gaGFuZGxlIHNwZWNpYWwgY2FzZXMgZm9yIHNvbmlmaWNhdGlvbiBzdHJhdGVneSB3aGlsZSBpbiBjYWxsOiBtdXRlIHN0cmVhbXMgb3IgcmVwbGFjZSBieQorICAgICAgICAvLyBhIHNwZWNpYWwgdG9uZSBpbiB0aGUgZGV2aWNlIHVzZWQgZm9yIGNvbW11bmljYXRpb24KKyAgICAgICAgdm9pZCBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGJvb2wgc3RhcnRpbmcsIGJvb2wgc3RhdGVDaGFuZ2UpOworCisgICAgICAgIC8vIHRydWUgaWYgZGV2aWNlIGlzIGluIGEgdGVsZXBob255IG9yIFZvSVAgY2FsbAorICAgICAgICB2aXJ0dWFsIGJvb2wgaXNJbkNhbGwoKTsKKworICAgICAgICAvLyB0cnVlIGlmIGdpdmVuIHN0YXRlIHJlcHJlc2VudHMgYSBkZXZpY2UgaW4gYSB0ZWxlcGhvbnkgb3IgVm9JUCBjYWxsCisgICAgICAgIHZpcnR1YWwgYm9vbCBpc1N0YXRlSW5DYWxsKGludCBzdGF0ZSk7CisKKyAgICAgICAgLy8gd2hlbiBhIGRldmljZSBpcyBjb25uZWN0ZWQsIGNoZWNrcyBpZiBhbiBvcGVuIG91dHB1dCBjYW4gYmUgcm91dGVkCisgICAgICAgIC8vIHRvIHRoaXMgZGV2aWNlLiBJZiBub25lIGlzIG9wZW4sIHRyaWVzIHRvIG9wZW4gb25lIG9mIHRoZSBhdmFpbGFibGUgb3V0cHV0cy4KKyAgICAgICAgLy8gUmV0dXJucyBhbiBvdXRwdXQgc3VpdGFibGUgdG8gdGhpcyBkZXZpY2Ugb3IgMC4KKyAgICAgICAgLy8gd2hlbiBhIGRldmljZSBpcyBkaXNjb25uZWN0ZWQsIGNoZWNrcyBpZiBhbiBvdXRwdXQgaXMgbm90IHVzZWQgYW55IG1vcmUgYW5kCisgICAgICAgIC8vIHJldHVybnMgaXRzIGhhbmRsZSBpZiBhbnkuCisgICAgICAgIC8vIHRyYW5zZmVycyB0aGUgYXVkaW8gdHJhY2tzIGFuZCBlZmZlY3RzIGZyb20gb25lIG91dHB1dCB0aHJlYWQgdG8gYW5vdGhlciBhY2NvcmRpbmdseS4KKyAgICAgICAgc3RhdHVzX3QgY2hlY2tPdXRwdXRzRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCBhZGRyZXNzKTsKKworICAgICAgICBzdGF0dXNfdCBjaGVja0lucHV0c0ZvckRldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIGlucHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCBhZGRyZXNzKTsKKworICAgICAgICAvLyBjbG9zZSBhbiBvdXRwdXQgYW5kIGl0cyBjb21wYW5pb24gZHVwbGljYXRpbmcgb3V0cHV0LgorICAgICAgICB2b2lkIGNsb3NlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CisKKyAgICAgICAgLy8gY2xvc2UgYW4gaW5wdXQuCisgICAgICAgIHZvaWQgY2xvc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7CisKKyAgICAgICAgLy8gY2hlY2tzIGFuZCBpZiBuZWNlc3NhcnkgY2hhbmdlcyBvdXRwdXRzIHVzZWQgZm9yIGFsbCBzdHJhdGVnaWVzLgorICAgICAgICAvLyBtdXN0IGJlIGNhbGxlZCBldmVyeSB0aW1lIGEgY29uZGl0aW9uIHRoYXQgYWZmZWN0cyB0aGUgb3V0cHV0IGNob2ljZSBmb3IgYSBnaXZlbiBzdHJhdGVneQorICAgICAgICAvLyBjaGFuZ2VzOiBjb25uZWN0ZWQgZGV2aWNlLCBwaG9uZSBzdGF0ZSwgZm9yY2UgdXNlLi4uCisgICAgICAgIC8vIE11c3QgYmUgY2FsbGVkIGJlZm9yZSB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpCisgICAgICAgIHZvaWQgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KTsKKworICAgICAgICAvLyBTYW1lIGFzIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koKSBidXQgZm9yIGEgYWxsIHN0cmF0ZWdpZXMgaW4gb3JkZXIgb2YgcHJpb3JpdHkKKyAgICAgICAgdm9pZCBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKTsKKworICAgICAgICAvLyBtYW5hZ2VzIEEyRFAgb3V0cHV0IHN1c3BlbmQvcmVzdG9yZSBhY2NvcmRpbmcgdG8gcGhvbmUgc3RhdGUgYW5kIEJUIFNDTyB1c2FnZQorICAgICAgICB2b2lkIGNoZWNrQTJkcFN1c3BlbmQoKTsKKworICAgICAgICAvLyByZXR1cm5zIHRoZSBBMkRQIG91dHB1dCBoYW5kbGUgaWYgaXQgaXMgb3BlbiBvciAwIG90aGVyd2lzZQorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBnZXRBMmRwT3V0cHV0KCk7CisKKyAgICAgICAgLy8gc2VsZWN0cyB0aGUgbW9zdCBhcHByb3ByaWF0ZSBkZXZpY2Ugb24gb3V0cHV0IGZvciBjdXJyZW50IHN0YXRlCisgICAgICAgIC8vIG11c3QgYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgYSBjb25kaXRpb24gdGhhdCBhZmZlY3RzIHRoZSBkZXZpY2UgY2hvaWNlIGZvciBhIGdpdmVuIG91dHB1dCBpcworICAgICAgICAvLyBjaGFuZ2VkOiBjb25uZWN0ZWQgZGV2aWNlLCBwaG9uZSBzdGF0ZSwgZm9yY2UgdXNlLCBvdXRwdXQgc3RhcnQsIG91dHB1dCBzdG9wLi4KKyAgICAgICAgLy8gc2VlIGdldERldmljZUZvclN0cmF0ZWd5KCkgZm9yIHRoZSB1c2Ugb2YgZnJvbUNhY2hlIHBhcmFtZXRlcgorICAgICAgICBhdWRpb19kZXZpY2VzX3QgZ2V0TmV3T3V0cHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgYm9vbCBmcm9tQ2FjaGUpOworCisgICAgICAgIC8vIHVwZGF0ZXMgY2FjaGUgb2YgZGV2aWNlIHVzZWQgYnkgYWxsIHN0cmF0ZWdpZXMgKG1EZXZpY2VGb3JTdHJhdGVneVtdKQorICAgICAgICAvLyBtdXN0IGJlIGNhbGxlZCBldmVyeSB0aW1lIGEgY29uZGl0aW9uIHRoYXQgYWZmZWN0cyB0aGUgZGV2aWNlIGNob2ljZSBmb3IgYSBnaXZlbiBzdHJhdGVneSBpcworICAgICAgICAvLyBjaGFuZ2VkOiBjb25uZWN0ZWQgZGV2aWNlLCBwaG9uZSBzdGF0ZSwgZm9yY2UgdXNlLi4uCisgICAgICAgIC8vIGNhY2hlZCB2YWx1ZXMgYXJlIHVzZWQgYnkgZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBpZiBwYXJhbWV0ZXIgZnJvbUNhY2hlIGlzIHRydWUuCisgICAgICAgICAvLyBNdXN0IGJlIGNhbGxlZCBhZnRlciBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKQorICAgICAgICB2b2lkIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7CisKKyAgICAgICAgLy8gc2VsZWN0cyB0aGUgbW9zdCBhcHByb3ByaWF0ZSBkZXZpY2Ugb24gaW5wdXQgZm9yIGN1cnJlbnQgc3RhdGUKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGdldE5ld0lucHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKKworICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldE1heEVmZmVjdHNDcHVMb2FkKCk7CisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0TWF4RWZmZWN0c01lbW9yeSgpOworI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCisgICAgICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIHRocmVhZExvb3AoKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZXhpdCgpOworICAgICAgICBpbnQgdGVzdE91dHB1dEluZGV4KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CisjZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAorCisgICAgICAgIHN0YXR1c190IHNldEVmZmVjdEVuYWJsZWQoY29uc3Qgc3A8RWZmZWN0RGVzY3JpcHRvcj4mIGVmZmVjdERlc2MsIGJvb2wgZW5hYmxlZCk7CisKKyAgICAgICAgLy8gcmV0dXJucyB0aGUgY2F0ZWdvcnkgdGhlIGRldmljZSBiZWxvbmdzIHRvIHdpdGggcmVnYXJkIHRvIHZvbHVtZSBjdXJ2ZSBtYW5hZ2VtZW50CisgICAgICAgIHN0YXRpYyBkZXZpY2VfY2F0ZWdvcnkgZ2V0RGV2aWNlQ2F0ZWdvcnkoYXVkaW9fZGV2aWNlc190IGRldmljZSk7CisKKyAgICAgICAgLy8gZXh0cmFjdCBvbmUgZGV2aWNlIHJlbGV2YW50IGZvciB2b2x1bWUgY29udHJvbCBmcm9tIG11bHRpcGxlIGRldmljZSBzZWxlY3Rpb24KKyAgICAgICAgc3RhdGljIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VGb3JWb2x1bWUoYXVkaW9fZGV2aWNlc190IGRldmljZSk7CisKKyAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBnZXRPdXRwdXRzRm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3QsIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gPiBvcGVuT3V0cHV0cyk7CisgICAgICAgIGJvb2wgdmVjdG9yc0VxdWFsKFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMyKTsKKworICAgICAgICAvLyBtdXRlL3VubXV0ZSBzdHJhdGVnaWVzIHVzaW5nIGFuIGluY29tcGF0aWJsZSBkZXZpY2UgY29tYmluYXRpb24KKyAgICAgICAgLy8gaWYgbXV0aW5nLCB3YWl0IGZvciB0aGUgYXVkaW8gaW4gcGNtIGJ1ZmZlciB0byBiZSBkcmFpbmVkIGJlZm9yZSBwcm9jZWVkaW5nCisgICAgICAgIC8vIGlmIHVubXV0aW5nLCB1bm11dGUgb25seSBhZnRlciB0aGUgc3BlY2lmaWVkIGRlbGF5CisgICAgICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBtcyB3YWl0ZWQKKyAgICAgICAgdWludDMyX3QgIGNoZWNrRGV2aWNlTXV0ZVN0cmF0ZWdpZXMoc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgcHJldkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVsYXlNcyk7CisKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgc2VsZWN0T3V0cHV0KGNvbnN0IFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCk7CisgICAgICAgIC8vIHNhbXBsaW5nUmF0ZSBwYXJhbWV0ZXIgaXMgYW4gaW4vb3V0IGFuZCBzbyBtYXkgYmUgbW9kaWZpZWQKKyAgICAgICAgc3A8SU9Qcm9maWxlPiBnZXRJbnB1dFByb2ZpbGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyk7CisgICAgICAgIHNwPElPUHJvZmlsZT4gZ2V0UHJvZmlsZUZvckRpcmVjdE91dHB1dChhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpOworCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHNlbGVjdE91dHB1dEZvckVmZmVjdHMoY29uc3QgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cyk7CisKKyAgICAgICAgYm9vbCBpc05vbk9mZmxvYWRhYmxlRWZmZWN0RW5hYmxlZCgpOworCisgICAgICAgIHN0YXR1c190IGFkZEF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvUGF0Y2g+JiBwYXRjaCk7CisgICAgICAgIHN0YXR1c190IHJlbW92ZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKKworICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGdldE91dHB1dEZyb21JZChhdWRpb19wb3J0X2hhbmRsZV90IGlkKSBjb25zdDsKKyAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGdldElucHV0RnJvbUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgaWQpIGNvbnN0OworICAgICAgICBzcDxId01vZHVsZT4gZ2V0TW9kdWxlRm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0OworICAgICAgICBzcDxId01vZHVsZT4gZ2V0TW9kdWxlRnJvbU5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3Q7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbGFibGVQcmltYXJ5T3V0cHV0RGV2aWNlcygpOworICAgICAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxhYmxlUHJpbWFyeUlucHV0RGV2aWNlcygpOworCisgICAgICAgIHZvaWQgdXBkYXRlQ2FsbFJvdXRpbmcoYXVkaW9fZGV2aWNlc190IHJ4RGV2aWNlLCBpbnQgZGVsYXlNcyA9IDApOworCisgICAgICAgIC8vCisgICAgICAgIC8vIEF1ZGlvIHBvbGljeSBjb25maWd1cmF0aW9uIGZpbGUgcGFyc2luZyAoYXVkaW9fcG9saWN5LmNvbmYpCisgICAgICAgIC8vCisgICAgICAgIHN0YXRpYyB1aW50MzJfdCBzdHJpbmdUb0VudW0oY29uc3Qgc3RydWN0IFN0cmluZ1RvRW51bSAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSk7CisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyICplbnVtVG9TdHJpbmcoY29uc3Qgc3RydWN0IFN0cmluZ1RvRW51bSAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZSk7CisgICAgICAgIHN0YXRpYyBib29sIHN0cmluZ1RvQm9vbChjb25zdCBjaGFyICp2YWx1ZSk7CisgICAgICAgIHN0YXRpYyB1aW50MzJfdCBwYXJzZU91dHB1dEZsYWdOYW1lcyhjaGFyICpuYW1lKTsKKyAgICAgICAgc3RhdGljIHVpbnQzMl90IHBhcnNlSW5wdXRGbGFnTmFtZXMoY2hhciAqbmFtZSk7CisgICAgICAgIHN0YXRpYyBhdWRpb19kZXZpY2VzX3QgcGFyc2VEZXZpY2VOYW1lcyhjaGFyICpuYW1lKTsKKyAgICAgICAgdm9pZCBsb2FkSHdNb2R1bGUoY25vZGUgKnJvb3QpOworICAgICAgICB2b2lkIGxvYWRId01vZHVsZXMoY25vZGUgKnJvb3QpOworICAgICAgICB2b2lkIGxvYWRHbG9iYWxDb25maWcoY25vZGUgKnJvb3QsIGNvbnN0IHNwPEh3TW9kdWxlPiYgbW9kdWxlKTsKKyAgICAgICAgc3RhdHVzX3QgbG9hZEF1ZGlvUG9saWN5Q29uZmlnKGNvbnN0IGNoYXIgKnBhdGgpOworICAgICAgICB2b2lkIGRlZmF1bHRBdWRpb1BvbGljeUNvbmZpZyh2b2lkKTsKKworCisgICAgICAgIHVpZF90IG1VaWRDYWNoZWQ7CisgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICptcENsaWVudEludGVyZmFjZTsgIC8vIGF1ZGlvIHBvbGljeSBjbGllbnQgaW50ZXJmYWNlCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG1QcmltYXJ5T3V0cHV0OyAgICAgICAgICAgICAgLy8gcHJpbWFyeSBvdXRwdXQgaGFuZGxlCisgICAgICAgIC8vIGxpc3Qgb2YgZGVzY3JpcHRvcnMgZm9yIG91dHB1dHMgY3VycmVudGx5IG9wZW5lZAorICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3QsIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gPiBtT3V0cHV0czsKKyAgICAgICAgLy8gY29weSBvZiBtT3V0cHV0cyBiZWZvcmUgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgb3BlbnMgbmV3IG91dHB1dHMKKyAgICAgICAgLy8gcmVzZXQgdG8gbU91dHB1dHMgd2hlbiB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpIGlzIGNhbGxlZC4KKyAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90LCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+ID4gbVByZXZpb3VzT3V0cHV0czsKKyAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90LCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gPiBtSW5wdXRzOyAgICAgLy8gbGlzdCBvZiBpbnB1dCBkZXNjcmlwdG9ycworICAgICAgICBEZXZpY2VWZWN0b3IgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzOyAvLyBhbGwgYXZhaWxhYmxlIG91dHB1dCBkZXZpY2VzCisgICAgICAgIERldmljZVZlY3RvciAgbUF2YWlsYWJsZUlucHV0RGV2aWNlczsgIC8vIGFsbCBhdmFpbGFibGUgaW5wdXQgZGV2aWNlcworICAgICAgICBpbnQgbVBob25lU3RhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgcGhvbmUgc3RhdGUKKyAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX1VTRV9DTlRdOyAgIC8vIGN1cnJlbnQgZm9yY2VkIHVzZSBjb25maWd1cmF0aW9uCisKKyAgICAgICAgU3RyZWFtRGVzY3JpcHRvciBtU3RyZWFtc1tBVURJT19TVFJFQU1fQ05UXTsgICAgICAgICAgIC8vIHN0cmVhbSBkZXNjcmlwdG9ycyBmb3Igdm9sdW1lIGNvbnRyb2wKKyAgICAgICAgYm9vbCAgICBtTGltaXRSaW5ndG9uZVZvbHVtZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaW1pdCByaW5ndG9uZSB2b2x1bWUgdG8gbXVzaWMgdm9sdW1lIGlmIGhlYWRzZXQgY29ubmVjdGVkCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBtRGV2aWNlRm9yU3RyYXRlZ3lbTlVNX1NUUkFURUdJRVNdOworICAgICAgICBmbG9hdCAgIG1MYXN0Vm9pY2VWb2x1bWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhc3Qgdm9pY2Ugdm9sdW1lIHZhbHVlIHNlbnQgdG8gYXVkaW8gSEFMCisKKyAgICAgICAgLy8gTWF4aW11bSBDUFUgbG9hZCBhbGxvY2F0ZWQgdG8gYXVkaW8gZWZmZWN0cyBpbiAwLjEgTUlQUyAoQVJNdjVURSwgMCBXUyBtZW1vcnkpIHVuaXRzCisgICAgICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBNQVhfRUZGRUNUU19DUFVfTE9BRCA9IDEwMDA7CisgICAgICAgIC8vIE1heGltdW0gbWVtb3J5IGFsbG9jYXRlZCB0byBhdWRpbyBlZmZlY3RzIGluIEtCCisgICAgICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBNQVhfRUZGRUNUU19NRU1PUlkgPSA1MTI7CisgICAgICAgIHVpbnQzMl90IG1Ub3RhbEVmZmVjdHNDcHVMb2FkOyAvLyBjdXJyZW50IENQVSBsb2FkIHVzZWQgYnkgZWZmZWN0cworICAgICAgICB1aW50MzJfdCBtVG90YWxFZmZlY3RzTWVtb3J5OyAgLy8gY3VycmVudCBtZW1vcnkgdXNlZCBieSBlZmZlY3RzCisgICAgICAgIEtleWVkVmVjdG9yPGludCwgc3A8RWZmZWN0RGVzY3JpcHRvcj4gPiBtRWZmZWN0czsgIC8vIGxpc3Qgb2YgcmVnaXN0ZXJlZCBhdWRpbyBlZmZlY3RzCisgICAgICAgIGJvb2wgICAgbUEyZHBTdXNwZW5kZWQ7ICAvLyB0cnVlIGlmIEEyRFAgb3V0cHV0IGlzIHN1c3BlbmRlZAorICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBtRGVmYXVsdE91dHB1dERldmljZTsgLy8gb3V0cHV0IGRldmljZSBzZWxlY3RlZCBieSBkZWZhdWx0IGF0IGJvb3QgdGltZQorICAgICAgICBib29sIG1TcGVha2VyRHJjRW5hYmxlZDsvLyB0cnVlIG9uIGRldmljZXMgdGhhdCB1c2UgRFJDIG9uIHRoZSBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiBwYXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGJvb3N0IHNvZnQgc291bmRzLCB1c2VkIHRvIGFkanVzdCB2b2x1bWUgY3VydmVzIGFjY29yZGluZ2x5CisKKyAgICAgICAgVmVjdG9yIDwgc3A8SHdNb2R1bGU+ID4gbUh3TW9kdWxlczsKKyAgICAgICAgdm9sYXRpbGUgaW50MzJfdCBtTmV4dFVuaXF1ZUlkOworICAgICAgICB2b2xhdGlsZSBpbnQzMl90IG1BdWRpb1BvcnRHZW5lcmF0aW9uOworCisgICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19wYXRjaF9oYW5kbGVfdCwgc3A8QXVkaW9QYXRjaD4gPiBtQXVkaW9QYXRjaGVzOworCisgICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19zZXNzaW9uX3QsIGF1ZGlvX2lvX2hhbmRsZV90PiBtU291bmRUcmlnZ2VyU2Vzc2lvbnM7CisKKyAgICAgICAgc3A8QXVkaW9QYXRjaD4gbUNhbGxUeFBhdGNoOworICAgICAgICBzcDxBdWRpb1BhdGNoPiBtQ2FsbFJ4UGF0Y2g7CisKKyNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAorICAgICAgICBNdXRleCAgIG1Mb2NrOworICAgICAgICBDb25kaXRpb24gbVdhaXRXb3JrQ1Y7CisKKyAgICAgICAgaW50ICAgICAgICAgICAgIG1DdXJPdXRwdXQ7CisgICAgICAgIGJvb2wgICAgICAgICAgICBtRGlyZWN0T3V0cHV0OworICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBtVGVzdE91dHB1dHNbTlVNX1RFU1RfT1VUUFVUU107CisgICAgICAgIGludCAgICAgICAgICAgICBtVGVzdElucHV0OworICAgICAgICB1aW50MzJfdCAgICAgICAgbVRlc3REZXZpY2U7CisgICAgICAgIHVpbnQzMl90ICAgICAgICBtVGVzdFNhbXBsaW5nUmF0ZTsKKyAgICAgICAgdWludDMyX3QgICAgICAgIG1UZXN0Rm9ybWF0OworICAgICAgICB1aW50MzJfdCAgICAgICAgbVRlc3RDaGFubmVsczsKKyAgICAgICAgdWludDMyX3QgICAgICAgIG1UZXN0TGF0ZW5jeU1zOworI2VuZGlmIC8vQVVESU9fUE9MSUNZX1RFU1QKKworcHJpdmF0ZToKKyAgICAgICAgc3RhdGljIGZsb2F0IHZvbEluZGV4VG9BbXBsKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGNvbnN0IFN0cmVhbURlc2NyaXB0b3ImIHN0cmVhbURlc2MsCisgICAgICAgICAgICAgICAgaW50IGluZGV4SW5VaSk7CisgICAgICAgIC8vIHVwZGF0ZXMgZGV2aWNlIGNhY2hpbmcgYW5kIG91dHB1dCBmb3Igc3RyZWFtcyB0aGF0IGNhbiBpbmZsdWVuY2UgdGhlCisgICAgICAgIC8vICAgIHJvdXRpbmcgb2Ygbm90aWZpY2F0aW9ucworICAgICAgICB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvblJvdXRpbmdGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOworICAgICAgICBzdGF0aWMgYm9vbCBpc1ZpcnR1YWxJbnB1dERldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKyAgICAgICAgc3RhdGljIGJvb2wgZGV2aWNlRGlzdGluZ3Vpc2hlc09uQWRkcmVzcyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKyAgICAgICAgLy8gZmluZCB0aGUgb3V0cHV0cyBvbiBhIGdpdmVuIG91dHB1dCBkZXNjcmlwdG9yIHRoYXQgaGF2ZSB0aGUgZ2l2ZW4gYWRkcmVzcy4KKyAgICAgICAgLy8gdG8gYmUgY2FsbGVkIG9uIGFuIEF1ZGlvT3V0cHV0RGVzY3JpcHRvciB3aG9zZSBzdXBwb3J0ZWQgZGV2aWNlcyAoYXMgZGVmaW5lZAorICAgICAgICAvLyAgIGluIG1Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcykgbWF0Y2hlcyB0aGUgZGV2aWNlIHdob3NlIGFkZHJlc3MgaXMgdG8gYmUgbWF0Y2hlZC4KKyAgICAgICAgLy8gc2VlIGRldmljZURpc3Rpbmd1aXNoZXNPbkFkZHJlc3MoYXVkaW9fZGV2aWNlc190KSBmb3Igd2hldGhlciB0aGUgZGV2aWNlIHR5cGUgaXMgb25lCisgICAgICAgIC8vICAgd2hlcmUgYWRkcmVzc2VzIGFyZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gb25lIGNvbm5lY3RlZCBkZXZpY2UgYW5kIGFub3RoZXIuCisgICAgICAgIHZvaWQgZmluZElvSGFuZGxlc0J5QWRkcmVzcyhzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgLyppbiovLAorICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggYWRkcmVzcyAvKmluKi8sCisgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cyAvKm91dCovKTsKKyAgICAgICAgdWludDMyX3QgbmV4dFVuaXF1ZUlkKCk7CisgICAgICAgIHVpbnQzMl90IG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisgICAgICAgIHVpbnQzMl90IGN1ckF1ZGlvUG9ydEdlbmVyYXRpb24oKSBjb25zdCB7IHJldHVybiBtQXVkaW9Qb3J0R2VuZXJhdGlvbjsgfQorICAgICAgICAvLyBpbnRlcm5hbCBtZXRob2QgdG8gcmV0dXJuIHRoZSBvdXRwdXQgaGFuZGxlIGZvciB0aGUgZ2l2ZW4gZGV2aWNlIGFuZCBmb3JtYXQKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yRGV2aWNlKAorICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pOworICAgICAgICAvLyBpbnRlcm5hbCBmdW5jdGlvbiB0byBkZXJpdmUgYSBzdHJlYW0gdHlwZSB2YWx1ZSBmcm9tIGF1ZGlvIGF0dHJpYnV0ZXMKKyAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKTsKK307CisKK307CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDQwNjdmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcApAQCAtMCwwICsxLDEwNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvUG9saWN5U2VydmljZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKKyN1bmRlZiBfX1NUUklDVF9BTlNJX18KKyNkZWZpbmUgX19TVERJTlRfTElNSVRTCisjZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisjaW5jbHVkZSAiQXVkaW9Qb2xpY3lTZXJ2aWNlLmgiCisjaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgorI2luY2x1ZGUgPGhhcmR3YXJlX2xlZ2FjeS9wb3dlci5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaD4KKworI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX3BvbGljeS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBjb25zdCBjaGFyIGtEZWFkbG9ja2VkU3RyaW5nW10gPSAiQXVkaW9Qb2xpY3lTZXJ2aWNlIG1heSBiZSBkZWFkbG9ja2VkXG4iOworc3RhdGljIGNvbnN0IGNoYXIga0NtZERlYWRsb2NrZWRTdHJpbmdbXSA9ICJBdWRpb1BvbGljeVNlcnZpY2UgY29tbWFuZCB0aHJlYWQgbWF5IGJlIGRlYWRsb2NrZWRcbiI7CisKK3N0YXRpYyBjb25zdCBpbnQga0R1bXBMb2NrUmV0cmllcyA9IDUwOworc3RhdGljIGNvbnN0IGludCBrRHVtcExvY2tTbGVlcFVzID0gMjAwMDA7CisKK3N0YXRpYyBjb25zdCBuc2Vjc190IGtBdWRpb0NvbW1hbmRUaW1lb3V0TnMgPSBzZWNvbmRzKDMpOyAvLyAzIHNlY29uZHMKKworbmFtZXNwYWNlIHsKKyAgICBleHRlcm4gc3RydWN0IGF1ZGlvX3BvbGljeV9zZXJ2aWNlX29wcyBhcHNfb3BzOworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5U2VydmljZSgpCisgICAgOiBCbkF1ZGlvUG9saWN5U2VydmljZSgpLCBtcEF1ZGlvUG9saWN5RGV2KE5VTEwpLCBtcEF1ZGlvUG9saWN5KE5VTEwpLAorICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlcihOVUxMKSwgbUF1ZGlvUG9saWN5Q2xpZW50KE5VTEwpLCBtUGhvbmVTdGF0ZShBVURJT19NT0RFX0lOVkFMSUQpCit7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpvbkZpcnN0UmVmKCkKK3sKKyAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgY29uc3Qgc3RydWN0IGh3X21vZHVsZV90ICptb2R1bGU7CisgICAgaW50IGZvcmNlZF92YWw7CisgICAgaW50IHJjOworCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgICAgIC8vIHN0YXJ0IHRvbmUgcGxheWJhY2sgdGhyZWFkCisgICAgICAgIG1Ub25lUGxheWJhY2tUaHJlYWQgPSBuZXcgQXVkaW9Db21tYW5kVGhyZWFkKFN0cmluZzgoIkFwbVRvbmUiKSwgdGhpcyk7CisgICAgICAgIC8vIHN0YXJ0IGF1ZGlvIGNvbW1hbmRzIHRocmVhZAorICAgICAgICBtQXVkaW9Db21tYW5kVGhyZWFkID0gbmV3IEF1ZGlvQ29tbWFuZFRocmVhZChTdHJpbmc4KCJBcG1BdWRpbyIpLCB0aGlzKTsKKyAgICAgICAgLy8gc3RhcnQgb3V0cHV0IGFjdGl2aXR5IGNvbW1hbmQgdGhyZWFkCisgICAgICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkID0gbmV3IEF1ZGlvQ29tbWFuZFRocmVhZChTdHJpbmc4KCJBcG1PdXRwdXQiKSwgdGhpcyk7CisKKyNpZmRlZiBVU0VfTEVHQUNZX0FVRElPX1BPTElDWQorICAgICAgICBBTE9HSSgiQXVkaW9Qb2xpY3lTZXJ2aWNlIENTVE9SIGluIGxlZ2FjeSBtb2RlIik7CisKKyAgICAgICAgLyogaW5zdGFudGlhdGUgdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyICovCisgICAgICAgIHJjID0gaHdfZ2V0X21vZHVsZShBVURJT19QT0xJQ1lfSEFSRFdBUkVfTU9EVUxFX0lELCAmbW9kdWxlKTsKKyAgICAgICAgaWYgKHJjKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcmMgPSBhdWRpb19wb2xpY3lfZGV2X29wZW4obW9kdWxlLCAmbXBBdWRpb1BvbGljeURldik7CisgICAgICAgIEFMT0dFX0lGKHJjLCAiY291bGRuJ3Qgb3BlbiBhdWRpbyBwb2xpY3kgZGV2aWNlICglcykiLCBzdHJlcnJvcigtcmMpKTsKKyAgICAgICAgaWYgKHJjKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICByYyA9IG1wQXVkaW9Qb2xpY3lEZXYtPmNyZWF0ZV9hdWRpb19wb2xpY3kobXBBdWRpb1BvbGljeURldiwgJmFwc19vcHMsIHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXBBdWRpb1BvbGljeSk7CisgICAgICAgIEFMT0dFX0lGKHJjLCAiY291bGRuJ3QgY3JlYXRlIGF1ZGlvIHBvbGljeSAoJXMpIiwgc3RyZXJyb3IoLXJjKSk7CisgICAgICAgIGlmIChyYykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgcmMgPSBtcEF1ZGlvUG9saWN5LT5pbml0X2NoZWNrKG1wQXVkaW9Qb2xpY3kpOworICAgICAgICBBTE9HRV9JRihyYywgImNvdWxkbid0IGluaXRfY2hlY2sgdGhlIGF1ZGlvIHBvbGljeSAoJXMpIiwgc3RyZXJyb3IoLXJjKSk7CisgICAgICAgIGlmIChyYykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEFMT0dJKCJMb2FkZWQgYXVkaW8gcG9saWN5IGZyb20gJXMgKCVzKSIsIG1vZHVsZS0+bmFtZSwgbW9kdWxlLT5pZCk7CisjZWxzZQorICAgICAgICBBTE9HSSgiQXVkaW9Qb2xpY3lTZXJ2aWNlIENTVE9SIGluIG5ldyBtb2RlIik7CisKKyAgICAgICAgbUF1ZGlvUG9saWN5Q2xpZW50ID0gbmV3IEF1ZGlvUG9saWN5Q2xpZW50KHRoaXMpOworICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyID0gY3JlYXRlQXVkaW9Qb2xpY3lNYW5hZ2VyKG1BdWRpb1BvbGljeUNsaWVudCk7CisjZW5kaWYKKyAgICB9CisgICAgLy8gbG9hZCBhdWRpbyBwcm9jZXNzaW5nIG1vZHVsZXMKKyAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzID0gbmV3IEF1ZGlvUG9saWN5RWZmZWN0cygpOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgbUF1ZGlvUG9saWN5RWZmZWN0cyA9IGF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICB9Cit9CisKK0F1ZGlvUG9saWN5U2VydmljZTo6fkF1ZGlvUG9saWN5U2VydmljZSgpCit7CisgICAgbVRvbmVQbGF5YmFja1RocmVhZC0+ZXhpdCgpOworICAgIG1BdWRpb0NvbW1hbmRUaHJlYWQtPmV4aXQoKTsKKyAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+ZXhpdCgpOworCisjaWZkZWYgVVNFX0xFR0FDWV9BVURJT19QT0xJQ1kKKyAgICBpZiAobXBBdWRpb1BvbGljeSAhPSBOVUxMICYmIG1wQXVkaW9Qb2xpY3lEZXYgIT0gTlVMTCkgeworICAgICAgICBtcEF1ZGlvUG9saWN5RGV2LT5kZXN0cm95X2F1ZGlvX3BvbGljeShtcEF1ZGlvUG9saWN5RGV2LCBtcEF1ZGlvUG9saWN5KTsKKyAgICB9CisgICAgaWYgKG1wQXVkaW9Qb2xpY3lEZXYgIT0gTlVMTCkgeworICAgICAgICBhdWRpb19wb2xpY3lfZGV2X2Nsb3NlKG1wQXVkaW9Qb2xpY3lEZXYpOworICAgIH0KKyNlbHNlCisgICAgZGVzdHJveUF1ZGlvUG9saWN5TWFuYWdlcihtQXVkaW9Qb2xpY3lNYW5hZ2VyKTsKKyAgICBkZWxldGUgbUF1ZGlvUG9saWN5Q2xpZW50OworI2VuZGlmCisKKyAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy5jbGVhcigpOworICAgIG1BdWRpb1BvbGljeUVmZmVjdHMuY2xlYXIoKTsKK30KKworLy8gQSBub3RpZmljYXRpb24gY2xpZW50IGlzIGFsd2F5cyByZWdpc3RlcmVkIGJ5IEF1ZGlvU3lzdGVtIHdoZW4gdGhlIGNsaWVudCBwcm9jZXNzCisvLyBjb25uZWN0cyB0byBBdWRpb1BvbGljeVNlcnZpY2UuCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6cmVnaXN0ZXJDbGllbnQoY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4mIGNsaWVudCkKK3sKKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICB1aWRfdCB1aWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CisgICAgaWYgKG1Ob3RpZmljYXRpb25DbGllbnRzLmluZGV4T2ZLZXkodWlkKSA8IDApIHsKKyAgICAgICAgc3A8Tm90aWZpY2F0aW9uQ2xpZW50PiBub3RpZmljYXRpb25DbGllbnQgPSBuZXcgTm90aWZpY2F0aW9uQ2xpZW50KHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWQpOworICAgICAgICBBTE9HVigicmVnaXN0ZXJDbGllbnQoKSBjbGllbnQgJXAsIHVpZCAlZCIsIGNsaWVudC5nZXQoKSwgdWlkKTsKKworICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy5hZGQodWlkLCBub3RpZmljYXRpb25DbGllbnQpOworCisgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IGNsaWVudC0+YXNCaW5kZXIoKTsKKyAgICAgICAgYmluZGVyLT5saW5rVG9EZWF0aChub3RpZmljYXRpb25DbGllbnQpOworICAgIH0KK30KKworLy8gcmVtb3ZlTm90aWZpY2F0aW9uQ2xpZW50KCkgaXMgY2FsbGVkIHdoZW4gdGhlIGNsaWVudCBwcm9jZXNzIGRpZXMuCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6cmVtb3ZlTm90aWZpY2F0aW9uQ2xpZW50KHVpZF90IHVpZCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMucmVtb3ZlSXRlbSh1aWQpOworCisjaWZuZGVmIFVTRV9MRUdBQ1lfQVVESU9fUE9MSUNZCisgICAgICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyKSB7CisgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5jbGVhckF1ZGlvUGF0Y2hlcyh1aWQpOworICAgICAgICB9CisjZW5kaWYKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Om9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpCit7CisgICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnVwZGF0ZUF1ZGlvUG9ydExpc3RDb21tYW5kKCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb09uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Ob3RpZmljYXRpb25DbGllbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnZhbHVlQXQoaSktPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Om9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKQoreworICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT51cGRhdGVBdWRpb1BhdGNoTGlzdENvbW1hbmQoKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpjbGllbnRDcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpCit7CisgICAgcmV0dXJuIG1BdWRpb0NvbW1hbmRUaHJlYWQtPmNyZWF0ZUF1ZGlvUGF0Y2hDb21tYW5kKHBhdGNoLCBoYW5kbGUsIGRlbGF5TXMpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmNsaWVudFJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcykKK3sKKyAgICByZXR1cm4gbUF1ZGlvQ29tbWFuZFRocmVhZC0+cmVsZWFzZUF1ZGlvUGF0Y2hDb21tYW5kKGhhbmRsZSwgZGVsYXlNcyk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb09uQXVkaW9QYXRjaExpc3RVcGRhdGUoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTm90aWZpY2F0aW9uQ2xpZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy52YWx1ZUF0KGkpLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmNsaWVudFNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQoreworICAgIHJldHVybiBtQXVkaW9Db21tYW5kVGhyZWFkLT5zZXRBdWRpb1BvcnRDb25maWdDb21tYW5kKGNvbmZpZywgZGVsYXlNcyk7Cit9CisKK0F1ZGlvUG9saWN5U2VydmljZTo6Tm90aWZpY2F0aW9uQ2xpZW50OjpOb3RpZmljYXRpb25DbGllbnQoY29uc3Qgc3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiYgc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKQorICAgIDogbVNlcnZpY2Uoc2VydmljZSksIG1VaWQodWlkKSwgbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudChjbGllbnQpCit7Cit9CisKK0F1ZGlvUG9saWN5U2VydmljZTo6Tm90aWZpY2F0aW9uQ2xpZW50Ojp+Tm90aWZpY2F0aW9uQ2xpZW50KCkKK3sKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Ok5vdGlmaWNhdGlvbkNsaWVudDo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKQoreworICAgIHNwPE5vdGlmaWNhdGlvbkNsaWVudD4ga2VlcCh0aGlzKTsKKyAgICBzcDxBdWRpb1BvbGljeVNlcnZpY2U+IHNlcnZpY2UgPSBtU2VydmljZS5wcm9tb3RlKCk7CisgICAgaWYgKHNlcnZpY2UgIT0gMCkgeworICAgICAgICBzZXJ2aWNlLT5yZW1vdmVOb3RpZmljYXRpb25DbGllbnQobVVpZCk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6Tm90aWZpY2F0aW9uQ2xpZW50OjpvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50ICE9IDApIHsKKyAgICAgICAgbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6Tm90aWZpY2F0aW9uQ2xpZW50OjpvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCAhPSAwKSB7CisgICAgICAgIG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pIHsKKyAgICBBTE9HVygiYmluZGVyRGllZCgpICVwLCBjYWxsaW5nIHBpZCAlZCIsIHdoby51bnNhZmVfZ2V0KCksCisgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpOworfQorCitzdGF0aWMgYm9vbCB0cnlMb2NrKE11dGV4JiBtdXRleCkKK3sKKyAgICBib29sIGxvY2tlZCA9IGZhbHNlOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga0R1bXBMb2NrUmV0cmllczsgKytpKSB7CisgICAgICAgIGlmIChtdXRleC50cnlMb2NrKCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGxvY2tlZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB1c2xlZXAoa0R1bXBMb2NrU2xlZXBVcyk7CisgICAgfQorICAgIHJldHVybiBsb2NrZWQ7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6ZHVtcEludGVybmFscyhpbnQgZmQpCit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKyNpZmRlZiBVU0VfTEVHQUNZX0FVRElPX1BPTElDWQorICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlBvbGljeU1hbmFnZXIgSW50ZXJmYWNlOiAlcFxuIiwgbXBBdWRpb1BvbGljeSk7CisjZWxzZQorICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkF1ZGlvUG9saWN5TWFuYWdlcjogJXBcbiIsIG1BdWRpb1BvbGljeU1hbmFnZXIpOworI2VuZGlmCisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkNvbW1hbmQgVGhyZWFkOiAlcFxuIiwgbUF1ZGlvQ29tbWFuZFRocmVhZC5nZXQoKSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlRvbmVzIFRocmVhZDogJXBcbiIsIG1Ub25lUGxheWJhY2tUaHJlYWQuZ2V0KCkpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKworICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKK3sKKyAgICBpZiAoIWR1bXBBbGxvd2VkKCkpIHsKKyAgICAgICAgZHVtcFBlcm1pc3Npb25EZW5pYWwoZmQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGJvb2wgbG9ja2VkID0gdHJ5TG9jayhtTG9jayk7CisgICAgICAgIGlmICghbG9ja2VkKSB7CisgICAgICAgICAgICBTdHJpbmc4IHJlc3VsdChrRGVhZGxvY2tlZFN0cmluZyk7CisgICAgICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGR1bXBJbnRlcm5hbHMoZmQpOworICAgICAgICBpZiAobUF1ZGlvQ29tbWFuZFRocmVhZCAhPSAwKSB7CisgICAgICAgICAgICBtQXVkaW9Db21tYW5kVGhyZWFkLT5kdW1wKGZkKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVRvbmVQbGF5YmFja1RocmVhZCAhPSAwKSB7CisgICAgICAgICAgICBtVG9uZVBsYXliYWNrVGhyZWFkLT5kdW1wKGZkKTsKKyAgICAgICAgfQorCisjaWZkZWYgVVNFX0xFR0FDWV9BVURJT19QT0xJQ1kKKyAgICAgICAgaWYgKG1wQXVkaW9Qb2xpY3kpIHsKKyAgICAgICAgICAgIG1wQXVkaW9Qb2xpY3ktPmR1bXAobXBBdWRpb1BvbGljeSwgZmQpOworICAgICAgICB9CisjZWxzZQorICAgICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlcikgeworICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+ZHVtcChmZCk7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIGlmIChsb2NrZWQpIG1Mb2NrLnVubG9jaygpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6ZHVtcFBlcm1pc3Npb25EZW5pYWwoaW50IGZkKQoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlBlcm1pc3Npb24gRGVuaWFsOiAiCisgICAgICAgICAgICAiY2FuJ3QgZHVtcCBBdWRpb1BvbGljeVNlcnZpY2UgZnJvbSBwaWQ9JWQsIHVpZD0lZFxuIiwKKyAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKKyAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpvblRyYW5zYWN0KAorICAgICAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQoreworICAgIHJldHVybiBCbkF1ZGlvUG9saWN5U2VydmljZTo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOworfQorCisKKy8vIC0tLS0tLS0tLS0tICBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZCBpbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tCisKK0F1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpBdWRpb0NvbW1hbmRUaHJlYWQoU3RyaW5nOCBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3cDxBdWRpb1BvbGljeVNlcnZpY2U+JiBzZXJ2aWNlKQorICAgIDogVGhyZWFkKGZhbHNlKSwgbU5hbWUobmFtZSksIG1TZXJ2aWNlKHNlcnZpY2UpCit7CisgICAgbXBUb25lR2VuZXJhdG9yID0gTlVMTDsKK30KKworCitBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6fkF1ZGlvQ29tbWFuZFRocmVhZCgpCit7CisgICAgaWYgKCFtQXVkaW9Db21tYW5kcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgcmVsZWFzZV93YWtlX2xvY2sobU5hbWUuc3RyaW5nKCkpOworICAgIH0KKyAgICBtQXVkaW9Db21tYW5kcy5jbGVhcigpOworICAgIGRlbGV0ZSBtcFRvbmVHZW5lcmF0b3I7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6Om9uRmlyc3RSZWYoKQoreworICAgIHJ1bihtTmFtZS5zdHJpbmcoKSwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnRocmVhZExvb3AoKQoreworICAgIG5zZWNzX3Qgd2FpdFRpbWUgPSBJTlQ2NF9NQVg7CisKKyAgICBtTG9jay5sb2NrKCk7CisgICAgd2hpbGUgKCFleGl0UGVuZGluZygpKQorICAgIHsKKyAgICAgICAgc3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiBzdmM7CisgICAgICAgIHdoaWxlICghbUF1ZGlvQ29tbWFuZHMuaXNFbXB0eSgpICYmICFleGl0UGVuZGluZygpKSB7CisgICAgICAgICAgICBuc2Vjc190IGN1clRpbWUgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICAgICAvLyBjb21tYW5kcyBhcmUgc29ydGVkIGJ5IGluY3JlYXNpbmcgdGltZSBzdGFtcDogZXhlY3V0ZSB0aGVtIGZyb20gaW5kZXggMCBhbmQgdXAKKyAgICAgICAgICAgIGlmIChtQXVkaW9Db21tYW5kc1swXS0+bVRpbWUgPD0gY3VyVGltZSkgeworICAgICAgICAgICAgICAgIHNwPEF1ZGlvQ29tbWFuZD4gY29tbWFuZCA9IG1BdWRpb0NvbW1hbmRzWzBdOworICAgICAgICAgICAgICAgIG1BdWRpb0NvbW1hbmRzLnJlbW92ZUF0KDApOworICAgICAgICAgICAgICAgIG1MYXN0Q29tbWFuZCA9IGNvbW1hbmQ7CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvbW1hbmQtPm1Db21tYW5kKSB7CisgICAgICAgICAgICAgICAgY2FzZSBTVEFSVF9UT05FOiB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgICAgICBUb25lRGF0YSAqZGF0YSA9IChUb25lRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc3RhcnQgdG9uZSAlZCBvbiBzdHJlYW0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1UeXBlLCBkYXRhLT5tU3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1wVG9uZUdlbmVyYXRvcjsKKyAgICAgICAgICAgICAgICAgICAgbXBUb25lR2VuZXJhdG9yID0gbmV3IFRvbmVHZW5lcmF0b3IoZGF0YS0+bVN0cmVhbSwgMS4wKTsKKyAgICAgICAgICAgICAgICAgICAgbXBUb25lR2VuZXJhdG9yLT5zdGFydFRvbmUoZGF0YS0+bVR5cGUpOworICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIH1icmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNUT1BfVE9ORTogeworICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc3RvcCB0b25lIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChtcFRvbmVHZW5lcmF0b3IgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbXBUb25lR2VuZXJhdG9yLT5zdG9wVG9uZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1wVG9uZUdlbmVyYXRvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1wVG9uZUdlbmVyYXRvciA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTRVRfVk9MVU1FOiB7CisgICAgICAgICAgICAgICAgICAgIFZvbHVtZURhdGEgKmRhdGEgPSAoVm9sdW1lRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc2V0IHZvbHVtZSBzdHJlYW0gJWQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWUgJWYsIG91dHB1dCAlZCIsIGRhdGEtPm1TdHJlYW0sIGRhdGEtPm1Wb2x1bWUsIGRhdGEtPm1JTyk7CisgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBBdWRpb1N5c3RlbTo6c2V0U3RyZWFtVm9sdW1lKGRhdGEtPm1TdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1Wb2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1JTyk7CisgICAgICAgICAgICAgICAgICAgIH1icmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNFVF9QQVJBTUVURVJTOiB7CisgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcnNEYXRhICpkYXRhID0gKFBhcmFtZXRlcnNEYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzZXQgcGFyYW1ldGVycyBzdHJpbmcgJXMsIGlvICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tS2V5VmFsdWVQYWlycy5zdHJpbmcoKSwgZGF0YS0+bUlPKTsKKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzZXRQYXJhbWV0ZXJzKGRhdGEtPm1JTywgZGF0YS0+bUtleVZhbHVlUGFpcnMpOworICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTRVRfVk9JQ0VfVk9MVU1FOiB7CisgICAgICAgICAgICAgICAgICAgIFZvaWNlVm9sdW1lRGF0YSAqZGF0YSA9IChWb2ljZVZvbHVtZURhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHNldCB2b2ljZSB2b2x1bWUgdm9sdW1lICVmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tVm9sdW1lKTsKKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzZXRWb2ljZVZvbHVtZShkYXRhLT5tVm9sdW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfWJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU1RPUF9PVVRQVVQ6IHsKKyAgICAgICAgICAgICAgICAgICAgU3RvcE91dHB1dERhdGEgKmRhdGEgPSAoU3RvcE91dHB1dERhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHN0b3Agb3V0cHV0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tSU8pOworICAgICAgICAgICAgICAgICAgICBzdmMgPSBtU2VydmljZS5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdmMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIHN2Yy0+ZG9TdG9wT3V0cHV0KGRhdGEtPm1JTywgZGF0YS0+bVN0cmVhbSwgZGF0YS0+bVNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIH1icmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFJFTEVBU0VfT1VUUFVUOiB7CisgICAgICAgICAgICAgICAgICAgIFJlbGVhc2VPdXRwdXREYXRhICpkYXRhID0gKFJlbGVhc2VPdXRwdXREYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyByZWxlYXNlIG91dHB1dCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bUlPKTsKKyAgICAgICAgICAgICAgICAgICAgc3ZjID0gbVNlcnZpY2UucHJvbW90ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3ZjID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgICAgICBzdmMtPmRvUmVsZWFzZU91dHB1dChkYXRhLT5tSU8pOworICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIH1icmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENSRUFURV9BVURJT19QQVRDSDogeworICAgICAgICAgICAgICAgICAgICBDcmVhdGVBdWRpb1BhdGNoRGF0YSAqZGF0YSA9IChDcmVhdGVBdWRpb1BhdGNoRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3NpbmcgY3JlYXRlIGF1ZGlvIHBhdGNoIik7CisgICAgICAgICAgICAgICAgICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhZiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gYWYtPmNyZWF0ZUF1ZGlvUGF0Y2goJmRhdGEtPm1QYXRjaCwgJmRhdGEtPm1IYW5kbGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSRUxFQVNFX0FVRElPX1BBVENIOiB7CisgICAgICAgICAgICAgICAgICAgIFJlbGVhc2VBdWRpb1BhdGNoRGF0YSAqZGF0YSA9IChSZWxlYXNlQXVkaW9QYXRjaERhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHJlbGVhc2UgYXVkaW8gcGF0Y2giKTsKKyAgICAgICAgICAgICAgICAgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBhZi0+cmVsZWFzZUF1ZGlvUGF0Y2goZGF0YS0+bUhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFVQREFURV9BVURJT1BPUlRfTElTVDogeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyB1cGRhdGUgYXVkaW8gcG9ydCBsaXN0Iik7CisgICAgICAgICAgICAgICAgICAgIHN2YyA9IG1TZXJ2aWNlLnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN2YyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb09uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOworICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIH1icmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFVQREFURV9BVURJT1BBVENIX0xJU1Q6IHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3NpbmcgdXBkYXRlIGF1ZGlvIHBhdGNoIGxpc3QiKTsKKyAgICAgICAgICAgICAgICAgICAgc3ZjID0gbVNlcnZpY2UucHJvbW90ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3ZjID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgICAgICBzdmMtPmRvT25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIH1icmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNFVF9BVURJT1BPUlRfQ09ORklHOiB7CisgICAgICAgICAgICAgICAgICAgIFNldEF1ZGlvUG9ydENvbmZpZ0RhdGEgKmRhdGEgPSAoU2V0QXVkaW9Qb3J0Q29uZmlnRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc2V0IHBvcnQgY29uZmlnIik7CisgICAgICAgICAgICAgICAgICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhZiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gYWYtPnNldEF1ZGlvUG9ydENvbmZpZygmZGF0YS0+bUNvbmZpZyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBBTE9HVygiQXVkaW9Db21tYW5kVGhyZWFkKCkgdW5rbm93biBjb21tYW5kICVkIiwgY29tbWFuZC0+bUNvbW1hbmQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChjb21tYW5kLT5tTG9jayk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb21tYW5kLT5tV2FpdFN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVdhaXRTdGF0dXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1Db25kLnNpZ25hbCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdhaXRUaW1lID0gSU5UNjRfTUFYOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB3YWl0VGltZSA9IG1BdWRpb0NvbW1hbmRzWzBdLT5tVGltZSAtIGN1clRpbWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gcmVsZWFzZSBtTG9jayBiZWZvcmUgcmVsZWFzaW5nIHN0cm9uZyByZWZlcmVuY2Ugb24gdGhlIHNlcnZpY2UgYXMKKyAgICAgICAgLy8gQXVkaW9Qb2xpY3lTZXJ2aWNlIGRlc3RydWN0b3IgY2FsbHMgQXVkaW9Db21tYW5kVGhyZWFkOjpleGl0KCkgd2hpY2ggYWNxdWlyZXMgbUxvY2suCisgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICBzdmMuY2xlYXIoKTsKKyAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICBpZiAoIWV4aXRQZW5kaW5nKCkgJiYgbUF1ZGlvQ29tbWFuZHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAvLyByZWxlYXNlIGRlbGF5ZWQgY29tbWFuZHMgd2FrZSBsb2NrCisgICAgICAgICAgICByZWxlYXNlX3dha2VfbG9jayhtTmFtZS5zdHJpbmcoKSk7CisgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgZ29pbmcgdG8gc2xlZXAiKTsKKyAgICAgICAgICAgIG1XYWl0V29ya0NWLndhaXRSZWxhdGl2ZShtTG9jaywgd2FpdFRpbWUpOworICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHdha2luZyB1cCIpOworICAgICAgICB9CisgICAgfQorICAgIC8vIHJlbGVhc2UgZGVsYXllZCBjb21tYW5kcyB3YWtlIGxvY2sgYmVmb3JlIHF1aXR0aW5nCisgICAgaWYgKCFtQXVkaW9Db21tYW5kcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgcmVsZWFzZV93YWtlX2xvY2sobU5hbWUuc3RyaW5nKCkpOworICAgIH0KKyAgICBtTG9jay51bmxvY2soKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpkdW1wKGludCBmZCkKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkF1ZGlvQ29tbWFuZFRocmVhZCAlcCBEdW1wXG4iLCB0aGlzKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisKKyAgICBib29sIGxvY2tlZCA9IHRyeUxvY2sobUxvY2spOworICAgIGlmICghbG9ja2VkKSB7CisgICAgICAgIFN0cmluZzggcmVzdWx0MihrQ21kRGVhZGxvY2tlZFN0cmluZyk7CisgICAgICAgIHdyaXRlKGZkLCByZXN1bHQyLnN0cmluZygpLCByZXN1bHQyLnNpemUoKSk7CisgICAgfQorCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBDb21tYW5kczpcbiIpOworICAgIHJlc3VsdCA9IFN0cmluZzgoYnVmZmVyKTsKKyAgICByZXN1bHQuYXBwZW5kKCIgICBDb21tYW5kIFRpbWUgICAgICAgIFdhaXQgcFBhcmFtXG4iKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb0NvbW1hbmRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1BdWRpb0NvbW1hbmRzW2ldLT5kdW1wKGJ1ZmZlciwgU0laRSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB9CisgICAgcmVzdWx0LmFwcGVuZCgiICBMYXN0IENvbW1hbmRcbiIpOworICAgIGlmIChtTGFzdENvbW1hbmQgIT0gMCkgeworICAgICAgICBtTGFzdENvbW1hbmQtPmR1bXAoYnVmZmVyLCBTSVpFKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgICAgbm9uZVxuIik7CisgICAgfQorCisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisKKyAgICBpZiAobG9ja2VkKSBtTG9jay51bmxvY2soKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6c3RhcnRUb25lQ29tbWFuZChUb25lR2VuZXJhdG9yOjp0b25lX3R5cGUgdHlwZSwKKyAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCit7CisgICAgc3A8QXVkaW9Db21tYW5kPiBjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOworICAgIGNvbW1hbmQtPm1Db21tYW5kID0gU1RBUlRfVE9ORTsKKyAgICBzcDxUb25lRGF0YT4gZGF0YSA9IG5ldyBUb25lRGF0YSgpOworICAgIGRhdGEtPm1UeXBlID0gdHlwZTsKKyAgICBkYXRhLT5tU3RyZWFtID0gc3RyZWFtOworICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7CisgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyB0b25lIHN0YXJ0IHR5cGUgJWQsIHN0cmVhbSAlZCIsIHR5cGUsIHN0cmVhbSk7CisgICAgc2VuZENvbW1hbmQoY29tbWFuZCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnN0b3BUb25lQ29tbWFuZCgpCit7CisgICAgc3A8QXVkaW9Db21tYW5kPiBjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOworICAgIGNvbW1hbmQtPm1Db21tYW5kID0gU1RPUF9UT05FOworICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgdG9uZSBzdG9wIik7CisgICAgc2VuZENvbW1hbmQoY29tbWFuZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjp2b2x1bWVDb21tYW5kKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpCit7CisgICAgc3A8QXVkaW9Db21tYW5kPiBjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOworICAgIGNvbW1hbmQtPm1Db21tYW5kID0gU0VUX1ZPTFVNRTsKKyAgICBzcDxWb2x1bWVEYXRhPiBkYXRhID0gbmV3IFZvbHVtZURhdGEoKTsKKyAgICBkYXRhLT5tU3RyZWFtID0gc3RyZWFtOworICAgIGRhdGEtPm1Wb2x1bWUgPSB2b2x1bWU7CisgICAgZGF0YS0+bUlPID0gb3V0cHV0OworICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7CisgICAgY29tbWFuZC0+bVdhaXRTdGF0dXMgPSB0cnVlOworICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgc2V0IHZvbHVtZSBzdHJlYW0gJWQsIHZvbHVtZSAlZiwgb3V0cHV0ICVkIiwKKyAgICAgICAgICAgIHN0cmVhbSwgdm9sdW1lLCBvdXRwdXQpOworICAgIHJldHVybiBzZW5kQ29tbWFuZChjb21tYW5kLCBkZWxheU1zKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnBhcmFtZXRlcnNDb21tYW5kKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtleVZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpCit7CisgICAgc3A8QXVkaW9Db21tYW5kPiBjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOworICAgIGNvbW1hbmQtPm1Db21tYW5kID0gU0VUX1BBUkFNRVRFUlM7CisgICAgc3A8UGFyYW1ldGVyc0RhdGE+IGRhdGEgPSBuZXcgUGFyYW1ldGVyc0RhdGEoKTsKKyAgICBkYXRhLT5tSU8gPSBpb0hhbmRsZTsKKyAgICBkYXRhLT5tS2V5VmFsdWVQYWlycyA9IFN0cmluZzgoa2V5VmFsdWVQYWlycyk7CisgICAgY29tbWFuZC0+bVBhcmFtID0gZGF0YTsKKyAgICBjb21tYW5kLT5tV2FpdFN0YXR1cyA9IHRydWU7CisgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyBzZXQgcGFyYW1ldGVyIHN0cmluZyAlcywgaW8gJWQgLGRlbGF5ICVkIiwKKyAgICAgICAgICAgIGtleVZhbHVlUGFpcnMsIGlvSGFuZGxlLCBkZWxheU1zKTsKKyAgICByZXR1cm4gc2VuZENvbW1hbmQoY29tbWFuZCwgZGVsYXlNcyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjp2b2ljZVZvbHVtZUNvbW1hbmQoZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlNcykKK3sKKyAgICBzcDxBdWRpb0NvbW1hbmQ+IGNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7CisgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBTRVRfVk9JQ0VfVk9MVU1FOworICAgIHNwPFZvaWNlVm9sdW1lRGF0YT4gZGF0YSA9IG5ldyBWb2ljZVZvbHVtZURhdGEoKTsKKyAgICBkYXRhLT5tVm9sdW1lID0gdm9sdW1lOworICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7CisgICAgY29tbWFuZC0+bVdhaXRTdGF0dXMgPSB0cnVlOworICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgc2V0IHZvaWNlIHZvbHVtZSB2b2x1bWUgJWYiLCB2b2x1bWUpOworICAgIHJldHVybiBzZW5kQ29tbWFuZChjb21tYW5kLCBkZWxheU1zKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6c3RvcE91dHB1dENvbW1hbmQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbikKK3sKKyAgICBzcDxBdWRpb0NvbW1hbmQ+IGNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7CisgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBTVE9QX09VVFBVVDsKKyAgICBzcDxTdG9wT3V0cHV0RGF0YT4gZGF0YSA9IG5ldyBTdG9wT3V0cHV0RGF0YSgpOworICAgIGRhdGEtPm1JTyA9IG91dHB1dDsKKyAgICBkYXRhLT5tU3RyZWFtID0gc3RyZWFtOworICAgIGRhdGEtPm1TZXNzaW9uID0gc2Vzc2lvbjsKKyAgICBjb21tYW5kLT5tUGFyYW0gPSBkYXRhOworICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgc3RvcCBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgIHNlbmRDb21tYW5kKGNvbW1hbmQpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpyZWxlYXNlT3V0cHV0Q29tbWFuZChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCit7CisgICAgc3A8QXVkaW9Db21tYW5kPiBjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOworICAgIGNvbW1hbmQtPm1Db21tYW5kID0gUkVMRUFTRV9PVVRQVVQ7CisgICAgc3A8UmVsZWFzZU91dHB1dERhdGE+IGRhdGEgPSBuZXcgUmVsZWFzZU91dHB1dERhdGEoKTsKKyAgICBkYXRhLT5tSU8gPSBvdXRwdXQ7CisgICAgY29tbWFuZC0+bVBhcmFtID0gZGF0YTsKKyAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHJlbGVhc2Ugb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICBzZW5kQ29tbWFuZChjb21tYW5kKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OmNyZWF0ZUF1ZGlvUGF0Y2hDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcykKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKworICAgIHNwPEF1ZGlvQ29tbWFuZD4gY29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKKyAgICBjb21tYW5kLT5tQ29tbWFuZCA9IENSRUFURV9BVURJT19QQVRDSDsKKyAgICBDcmVhdGVBdWRpb1BhdGNoRGF0YSAqZGF0YSA9IG5ldyBDcmVhdGVBdWRpb1BhdGNoRGF0YSgpOworICAgIGRhdGEtPm1QYXRjaCA9ICpwYXRjaDsKKyAgICBkYXRhLT5tSGFuZGxlID0gKmhhbmRsZTsKKyAgICBjb21tYW5kLT5tUGFyYW0gPSBkYXRhOworICAgIGNvbW1hbmQtPm1XYWl0U3RhdHVzID0gdHJ1ZTsKKyAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIGNyZWF0ZSBwYXRjaCBkZWxheSAlZCIsIGRlbGF5TXMpOworICAgIHN0YXR1cyA9IHNlbmRDb21tYW5kKGNvbW1hbmQsIGRlbGF5TXMpOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgKmhhbmRsZSA9IGRhdGEtPm1IYW5kbGU7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpyZWxlYXNlQXVkaW9QYXRjaENvbW1hbmQoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQoreworICAgIHNwPEF1ZGlvQ29tbWFuZD4gY29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKKyAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFJFTEVBU0VfQVVESU9fUEFUQ0g7CisgICAgUmVsZWFzZUF1ZGlvUGF0Y2hEYXRhICpkYXRhID0gbmV3IFJlbGVhc2VBdWRpb1BhdGNoRGF0YSgpOworICAgIGRhdGEtPm1IYW5kbGUgPSBoYW5kbGU7CisgICAgY29tbWFuZC0+bVBhcmFtID0gZGF0YTsKKyAgICBjb21tYW5kLT5tV2FpdFN0YXR1cyA9IHRydWU7CisgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyByZWxlYXNlIHBhdGNoIGRlbGF5ICVkIiwgZGVsYXlNcyk7CisgICAgcmV0dXJuIHNlbmRDb21tYW5kKGNvbW1hbmQsIGRlbGF5TXMpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjp1cGRhdGVBdWRpb1BvcnRMaXN0Q29tbWFuZCgpCit7CisgICAgc3A8QXVkaW9Db21tYW5kPiBjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOworICAgIGNvbW1hbmQtPm1Db21tYW5kID0gVVBEQVRFX0FVRElPUE9SVF9MSVNUOworICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgdXBkYXRlIGF1ZGlvIHBvcnQgbGlzdCIpOworICAgIHNlbmRDb21tYW5kKGNvbW1hbmQpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjp1cGRhdGVBdWRpb1BhdGNoTGlzdENvbW1hbmQoKQoreworICAgIHNwPEF1ZGlvQ29tbWFuZD5jb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOworICAgIGNvbW1hbmQtPm1Db21tYW5kID0gVVBEQVRFX0FVRElPUEFUQ0hfTElTVDsKKyAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHVwZGF0ZSBhdWRpbyBwYXRjaCBsaXN0Iik7CisgICAgc2VuZENvbW1hbmQoY29tbWFuZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpzZXRBdWRpb1BvcnRDb25maWdDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZywgaW50IGRlbGF5TXMpCit7CisgICAgc3A8QXVkaW9Db21tYW5kPiBjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOworICAgIGNvbW1hbmQtPm1Db21tYW5kID0gU0VUX0FVRElPUE9SVF9DT05GSUc7CisgICAgU2V0QXVkaW9Qb3J0Q29uZmlnRGF0YSAqZGF0YSA9IG5ldyBTZXRBdWRpb1BvcnRDb25maWdEYXRhKCk7CisgICAgZGF0YS0+bUNvbmZpZyA9ICpjb25maWc7CisgICAgY29tbWFuZC0+bVBhcmFtID0gZGF0YTsKKyAgICBjb21tYW5kLT5tV2FpdFN0YXR1cyA9IHRydWU7CisgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyBzZXQgcG9ydCBjb25maWcgZGVsYXkgJWQiLCBkZWxheU1zKTsKKyAgICByZXR1cm4gc2VuZENvbW1hbmQoY29tbWFuZCwgZGVsYXlNcyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpzZW5kQ29tbWFuZChzcDxBdWRpb0NvbW1hbmQ+JiBjb21tYW5kLCBpbnQgZGVsYXlNcykKK3sKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIGluc2VydENvbW1hbmRfbChjb21tYW5kLCBkZWxheU1zKTsKKyAgICAgICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChjb21tYW5kLT5tTG9jayk7CisgICAgd2hpbGUgKGNvbW1hbmQtPm1XYWl0U3RhdHVzKSB7CisgICAgICAgIG5zZWNzX3QgdGltZU91dE5zID0ga0F1ZGlvQ29tbWFuZFRpbWVvdXROcyArIG1pbGxpc2Vjb25kcyhkZWxheU1zKTsKKyAgICAgICAgaWYgKGNvbW1hbmQtPm1Db25kLndhaXRSZWxhdGl2ZShjb21tYW5kLT5tTG9jaywgdGltZU91dE5zKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IFRJTUVEX09VVDsKKyAgICAgICAgICAgIGNvbW1hbmQtPm1XYWl0U3RhdHVzID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNvbW1hbmQtPm1TdGF0dXM7Cit9CisKKy8vIGluc2VydENvbW1hbmRfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggbUxvY2sgaGVsZAordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6aW5zZXJ0Q29tbWFuZF9sKHNwPEF1ZGlvQ29tbWFuZD4mIGNvbW1hbmQsIGludCBkZWxheU1zKQoreworICAgIHNzaXplX3QgaTsgIC8vIG5vdCBzaXplX3QgYmVjYXVzZSBpIHdpbGwgY291bnQgZG93biB0byAtMQorICAgIFZlY3RvciA8IHNwPEF1ZGlvQ29tbWFuZD4gPiByZW1vdmVkQ29tbWFuZHM7CisgICAgY29tbWFuZC0+bVRpbWUgPSBzeXN0ZW1UaW1lKCkgKyBtaWxsaXNlY29uZHMoZGVsYXlNcyk7CisKKyAgICAvLyBhY3F1aXJlIHdha2UgbG9jayB0byBtYWtlIHN1cmUgZGVsYXllZCBjb21tYW5kcyBhcmUgcHJvY2Vzc2VkCisgICAgaWYgKG1BdWRpb0NvbW1hbmRzLmlzRW1wdHkoKSkgeworICAgICAgICBhY3F1aXJlX3dha2VfbG9jayhQQVJUSUFMX1dBS0VfTE9DSywgbU5hbWUuc3RyaW5nKCkpOworICAgIH0KKworICAgIC8vIGNoZWNrIHNhbWUgcGVuZGluZyBjb21tYW5kcyB3aXRoIGxhdGVyIHRpbWUgc3RhbXBzIGFuZCBlbGltaW5hdGUgdGhlbQorICAgIGZvciAoaSA9IG1BdWRpb0NvbW1hbmRzLnNpemUoKS0xOyBpID49IDA7IGktLSkgeworICAgICAgICBzcDxBdWRpb0NvbW1hbmQ+IGNvbW1hbmQyID0gbUF1ZGlvQ29tbWFuZHNbaV07CisgICAgICAgIC8vIGNvbW1hbmRzIGFyZSBzb3J0ZWQgYnkgaW5jcmVhc2luZyB0aW1lIHN0YW1wOiBubyBuZWVkIHRvIHNjYW4gdGhlIHJlc3Qgb2YgbUF1ZGlvQ29tbWFuZHMKKyAgICAgICAgaWYgKGNvbW1hbmQyLT5tVGltZSA8PSBjb21tYW5kLT5tVGltZSkgYnJlYWs7CisKKyAgICAgICAgLy8gY3JlYXRlIGF1ZGlvIHBhdGNoIG9yIHJlbGVhc2UgYXVkaW8gcGF0Y2ggY29tbWFuZHMgYXJlIGVxdWl2YWxlbnQKKyAgICAgICAgLy8gd2l0aCByZWdhcmQgdG8gZmlsdGVyaW5nCisgICAgICAgIGlmICgoY29tbWFuZC0+bUNvbW1hbmQgPT0gQ1JFQVRFX0FVRElPX1BBVENIKSB8fAorICAgICAgICAgICAgICAgIChjb21tYW5kLT5tQ29tbWFuZCA9PSBSRUxFQVNFX0FVRElPX1BBVENIKSkgeworICAgICAgICAgICAgaWYgKChjb21tYW5kMi0+bUNvbW1hbmQgIT0gQ1JFQVRFX0FVRElPX1BBVENIKSAmJgorICAgICAgICAgICAgICAgICAgICAoY29tbWFuZDItPm1Db21tYW5kICE9IFJFTEVBU0VfQVVESU9fUEFUQ0gpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZDItPm1Db21tYW5kICE9IGNvbW1hbmQtPm1Db21tYW5kKSBjb250aW51ZTsKKworICAgICAgICBzd2l0Y2ggKGNvbW1hbmQtPm1Db21tYW5kKSB7CisgICAgICAgIGNhc2UgU0VUX1BBUkFNRVRFUlM6IHsKKyAgICAgICAgICAgIFBhcmFtZXRlcnNEYXRhICpkYXRhID0gKFBhcmFtZXRlcnNEYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpOworICAgICAgICAgICAgUGFyYW1ldGVyc0RhdGEgKmRhdGEyID0gKFBhcmFtZXRlcnNEYXRhICopY29tbWFuZDItPm1QYXJhbS5nZXQoKTsKKyAgICAgICAgICAgIGlmIChkYXRhLT5tSU8gIT0gZGF0YTItPm1JTykgYnJlYWs7CisgICAgICAgICAgICBBTE9HVigiQ29tcGFyaW5nIHBhcmFtZXRlciBjb21tYW5kICVzIHRvIG5ldyBjb21tYW5kICVzIiwKKyAgICAgICAgICAgICAgICAgICAgZGF0YTItPm1LZXlWYWx1ZVBhaXJzLnN0cmluZygpLCBkYXRhLT5tS2V5VmFsdWVQYWlycy5zdHJpbmcoKSk7CisgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGRhdGEtPm1LZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtMiA9IEF1ZGlvUGFyYW1ldGVyKGRhdGEyLT5tS2V5VmFsdWVQYWlycyk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHBhcmFtLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nOCBrZXk7CisgICAgICAgICAgICAgICAgU3RyaW5nOCB2YWx1ZTsKKyAgICAgICAgICAgICAgICBwYXJhbS5nZXRBdChqLCBrZXksIHZhbHVlKTsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IHBhcmFtMi5zaXplKCk7IGsrKykgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGtleTI7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZzggdmFsdWUyOworICAgICAgICAgICAgICAgICAgICBwYXJhbTIuZ2V0QXQoaywga2V5MiwgdmFsdWUyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGtleTIgPT0ga2V5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbTIucmVtb3ZlKGtleTIpOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkZpbHRlcmluZyBvdXQgcGFyYW1ldGVyICVzIiwga2V5Mi5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGlmIGFsbCBrZXlzIGhhdmUgYmVlbiBmaWx0ZXJlZCBvdXQsIHJlbW92ZSB0aGUgY29tbWFuZC4KKyAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgdXBkYXRlIHRoZSBrZXkgdmFsdWUgcGFpcnMKKyAgICAgICAgICAgIGlmIChwYXJhbTIuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICByZW1vdmVkQ29tbWFuZHMuYWRkKGNvbW1hbmQyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGF0YTItPm1LZXlWYWx1ZVBhaXJzID0gcGFyYW0yLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb21tYW5kLT5tVGltZSA9IGNvbW1hbmQyLT5tVGltZTsKKyAgICAgICAgICAgIC8vIGZvcmNlIGRlbGF5TXMgdG8gbm9uIDAgc28gdGhhdCBjb2RlIGJlbG93IGRvZXMgbm90IHJlcXVlc3QgdG8gd2FpdCBmb3IKKyAgICAgICAgICAgIC8vIGNvbW1hbmQgc3RhdHVzIGFzIHRoZSBjb21tYW5kIGlzIG5vdyBkZWxheWVkCisgICAgICAgICAgICBkZWxheU1zID0gMTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIFNFVF9WT0xVTUU6IHsKKyAgICAgICAgICAgIFZvbHVtZURhdGEgKmRhdGEgPSAoVm9sdW1lRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKKyAgICAgICAgICAgIFZvbHVtZURhdGEgKmRhdGEyID0gKFZvbHVtZURhdGEgKiljb21tYW5kMi0+bVBhcmFtLmdldCgpOworICAgICAgICAgICAgaWYgKGRhdGEtPm1JTyAhPSBkYXRhMi0+bUlPKSBicmVhazsKKyAgICAgICAgICAgIGlmIChkYXRhLT5tU3RyZWFtICE9IGRhdGEyLT5tU3RyZWFtKSBicmVhazsKKyAgICAgICAgICAgIEFMT0dWKCJGaWx0ZXJpbmcgb3V0IHZvbHVtZSBjb21tYW5kIG9uIG91dHB1dCAlZCBmb3Igc3RyZWFtICVkIiwKKyAgICAgICAgICAgICAgICAgICAgZGF0YS0+bUlPLCBkYXRhLT5tU3RyZWFtKTsKKyAgICAgICAgICAgIHJlbW92ZWRDb21tYW5kcy5hZGQoY29tbWFuZDIpOworICAgICAgICAgICAgY29tbWFuZC0+bVRpbWUgPSBjb21tYW5kMi0+bVRpbWU7CisgICAgICAgICAgICAvLyBmb3JjZSBkZWxheU1zIHRvIG5vbiAwIHNvIHRoYXQgY29kZSBiZWxvdyBkb2VzIG5vdCByZXF1ZXN0IHRvIHdhaXQgZm9yCisgICAgICAgICAgICAvLyBjb21tYW5kIHN0YXR1cyBhcyB0aGUgY29tbWFuZCBpcyBub3cgZGVsYXllZAorICAgICAgICAgICAgZGVsYXlNcyA9IDE7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBDUkVBVEVfQVVESU9fUEFUQ0g6CisgICAgICAgIGNhc2UgUkVMRUFTRV9BVURJT19QQVRDSDogeworICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlOworICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoOworICAgICAgICAgICAgaWYgKGNvbW1hbmQtPm1Db21tYW5kID09IENSRUFURV9BVURJT19QQVRDSCkgeworICAgICAgICAgICAgICAgIGhhbmRsZSA9ICgoQ3JlYXRlQXVkaW9QYXRjaERhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCkpLT5tSGFuZGxlOworICAgICAgICAgICAgICAgIHBhdGNoID0gKChDcmVhdGVBdWRpb1BhdGNoRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKSktPm1QYXRjaDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaGFuZGxlID0gKChSZWxlYXNlQXVkaW9QYXRjaERhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCkpLT5tSGFuZGxlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlMjsKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDI7CisgICAgICAgICAgICBpZiAoY29tbWFuZDItPm1Db21tYW5kID09IENSRUFURV9BVURJT19QQVRDSCkgeworICAgICAgICAgICAgICAgIGhhbmRsZTIgPSAoKENyZWF0ZUF1ZGlvUGF0Y2hEYXRhICopY29tbWFuZDItPm1QYXJhbS5nZXQoKSktPm1IYW5kbGU7CisgICAgICAgICAgICAgICAgcGF0Y2gyID0gKChDcmVhdGVBdWRpb1BhdGNoRGF0YSAqKWNvbW1hbmQyLT5tUGFyYW0uZ2V0KCkpLT5tUGF0Y2g7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGhhbmRsZTIgPSAoKFJlbGVhc2VBdWRpb1BhdGNoRGF0YSAqKWNvbW1hbmQyLT5tUGFyYW0uZ2V0KCkpLT5tSGFuZGxlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGhhbmRsZSAhPSBoYW5kbGUyKSBicmVhazsKKyAgICAgICAgICAgIC8qIEZpbHRlciBDUkVBVEVfQVVESU9fUEFUQ0ggY29tbWFuZHMgb25seSB3aGVuIHRoZXkgYXJlIGlzc3VlZCBmb3IKKyAgICAgICAgICAgICAgIHNhbWUgb3V0cHV0LiAqLworICAgICAgICAgICAgaWYoIChjb21tYW5kLT5tQ29tbWFuZCA9PSBDUkVBVEVfQVVESU9fUEFUQ0gpICYmCisgICAgICAgICAgICAgICAgKGNvbW1hbmQyLT5tQ29tbWFuZCA9PSBDUkVBVEVfQVVESU9fUEFUQ0gpICkgeworICAgICAgICAgICAgICAgIGJvb2wgaXNPdXRwdXREaWZmID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKHBhdGNoLm51bV9zb3VyY2VzID09IHBhdGNoMi5udW1fc291cmNlcykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGNvdW50ID0gMDsgY291bnQgPCBwYXRjaC5udW1fc291cmNlczsgY291bnQrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLnNvdXJjZXNbY291bnRdLmlkICE9IHBhdGNoMi5zb3VyY2VzW2NvdW50XS5pZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzT3V0cHV0RGlmZiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzT3V0cHV0RGlmZikKKyAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoIkZpbHRlcmluZyBvdXQgJXMgYXVkaW8gcGF0Y2ggY29tbWFuZCBmb3IgaGFuZGxlICVkIiwKKyAgICAgICAgICAgICAgICAgIChjb21tYW5kLT5tQ29tbWFuZCA9PSBDUkVBVEVfQVVESU9fUEFUQ0gpID8gImNyZWF0ZSIgOiAicmVsZWFzZSIsIGhhbmRsZSk7CisgICAgICAgICAgICByZW1vdmVkQ29tbWFuZHMuYWRkKGNvbW1hbmQyKTsKKyAgICAgICAgICAgIGNvbW1hbmQtPm1UaW1lID0gY29tbWFuZDItPm1UaW1lOworICAgICAgICAgICAgLy8gZm9yY2UgZGVsYXlNcyB0byBub24gMCBzbyB0aGF0IGNvZGUgYmVsb3cgZG9lcyBub3QgcmVxdWVzdCB0byB3YWl0IGZvcgorICAgICAgICAgICAgLy8gY29tbWFuZCBzdGF0dXMgYXMgdGhlIGNvbW1hbmQgaXMgbm93IGRlbGF5ZWQKKyAgICAgICAgICAgIGRlbGF5TXMgPSAxOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGNhc2UgU1RBUlRfVE9ORToKKyAgICAgICAgY2FzZSBTVE9QX1RPTkU6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHJlbW92ZSBmaWx0ZXJlZCBjb21tYW5kcworICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcmVtb3ZlZENvbW1hbmRzLnNpemUoKTsgaisrKSB7CisgICAgICAgIC8vIHJlbW92ZWQgY29tbWFuZHMgYWx3YXlzIGhhdmUgdGltZSBzdGFtcHMgZ3JlYXRlciB0aGFuIGN1cnJlbnQgY29tbWFuZAorICAgICAgICBmb3IgKHNpemVfdCBrID0gaSArIDE7IGsgPCBtQXVkaW9Db21tYW5kcy5zaXplKCk7IGsrKykgeworICAgICAgICAgICAgaWYgKG1BdWRpb0NvbW1hbmRzW2tdLmdldCgpID09IHJlbW92ZWRDb21tYW5kc1tqXS5nZXQoKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJzdXBwcmVzc2luZyBjb21tYW5kOiAlZCIsIG1BdWRpb0NvbW1hbmRzW2tdLT5tQ29tbWFuZCk7CisgICAgICAgICAgICAgICAgbUF1ZGlvQ29tbWFuZHMucmVtb3ZlQXQoayk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmVtb3ZlZENvbW1hbmRzLmNsZWFyKCk7CisKKyAgICAvLyBEaXNhYmxlIHdhaXQgZm9yIHN0YXR1cyBpZiBkZWxheSBpcyBub3QgMAorICAgIGlmIChkZWxheU1zICE9IDApIHsKKyAgICAgICAgY29tbWFuZC0+bVdhaXRTdGF0dXMgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBpbnNlcnQgY29tbWFuZCBhdCB0aGUgcmlnaHQgcGxhY2UgYWNjb3JkaW5nIHRvIGl0cyB0aW1lIHN0YW1wCisgICAgQUxPR1YoImluc2VydGluZyBjb21tYW5kOiAlZCBhdCBpbmRleCAlemQsIG51bSBjb21tYW5kcyAlenUiLAorICAgICAgICAgICAgY29tbWFuZC0+bUNvbW1hbmQsIGkrMSwgbUF1ZGlvQ29tbWFuZHMuc2l6ZSgpKTsKKyAgICBtQXVkaW9Db21tYW5kcy5pbnNlcnRBdChjb21tYW5kLCBpICsgMSk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OmV4aXQoKQoreworICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQ6OmV4aXQiKTsKKyAgICB7CisgICAgICAgIEF1dG9NdXRleCBfbChtTG9jayk7CisgICAgICAgIHJlcXVlc3RFeGl0KCk7CisgICAgICAgIG1XYWl0V29ya0NWLnNpZ25hbCgpOworICAgIH0KKyAgICByZXF1ZXN0RXhpdEFuZFdhaXQoKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6QXVkaW9Db21tYW5kOjpkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpCit7CisgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiICAgJTAyZCAgICAgICUwNmQuJTAzZCAgJTAxdSAgICAlcFxuIiwKKyAgICAgICAgICAgIG1Db21tYW5kLAorICAgICAgICAgICAgKGludCluczJzKG1UaW1lKSwKKyAgICAgICAgICAgIChpbnQpbnMybXMobVRpbWUpJTEwMDAsCisgICAgICAgICAgICBtV2FpdFN0YXR1cywKKyAgICAgICAgICAgIG1QYXJhbS5nZXQoKSk7Cit9CisKKy8qKioqKioqIGhlbHBlcnMgZm9yIHRoZSBzZXJ2aWNlX29wcyBjYWxsYmFja3MgZGVmaW5lZCBiZWxvdyAqKioqKioqKiovCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtleVZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcykKK3sKKyAgICBtQXVkaW9Db21tYW5kVGhyZWFkLT5wYXJhbWV0ZXJzQ29tbWFuZChpb0hhbmRsZSwga2V5VmFsdWVQYWlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheU1zKTsKK30KKworaW50IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpCit7CisgICAgcmV0dXJuIChpbnQpbUF1ZGlvQ29tbWFuZFRocmVhZC0+dm9sdW1lQ29tbWFuZChzdHJlYW0sIHZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwgZGVsYXlNcyk7Cit9CisKK2ludCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0VG9uZShhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCit7CisgICAgaWYgKHRvbmUgIT0gQVVESU9fUE9MSUNZX1RPTkVfSU5fQ0FMTF9OT1RJRklDQVRJT04pIHsKKyAgICAgICAgQUxPR0UoInN0YXJ0VG9uZTogaWxsZWdhbCB0b25lIHJlcXVlc3RlZCAoJWQpIiwgdG9uZSk7CisgICAgfQorICAgIGlmIChzdHJlYW0gIT0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpIHsKKyAgICAgICAgQUxPR0UoInN0YXJ0VG9uZTogaWxsZWdhbCBzdHJlYW0gKCVkKSByZXF1ZXN0ZWQgZm9yIHRvbmUgJWQiLCBzdHJlYW0sCisgICAgICAgICAgICB0b25lKTsKKyAgICB9CisgICAgbVRvbmVQbGF5YmFja1RocmVhZC0+c3RhcnRUb25lQ29tbWFuZChUb25lR2VuZXJhdG9yOjpUT05FX1NVUF9DQUxMX1dBSVRJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0b3BUb25lKCkKK3sKKyAgICBtVG9uZVBsYXliYWNrVGhyZWFkLT5zdG9wVG9uZUNvbW1hbmQoKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlNcykKK3sKKyAgICByZXR1cm4gKGludCltQXVkaW9Db21tYW5kVGhyZWFkLT52b2ljZVZvbHVtZUNvbW1hbmQodm9sdW1lLCBkZWxheU1zKTsKK30KKworZXh0ZXJuICJDIiB7CithdWRpb19tb2R1bGVfaGFuZGxlX3QgYXBzX2xvYWRfaHdfbW9kdWxlKHZvaWQgKnNlcnZpY2UgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKTsKK2F1ZGlvX2lvX2hhbmRsZV90IGFwc19vcGVuX291dHB1dCh2b2lkICpzZXJ2aWNlIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKnBEZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnBGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICpwQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwTGF0ZW5jeU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyk7CisKK2F1ZGlvX2lvX2hhbmRsZV90IGFwc19vcGVuX291dHB1dF9vbl9tb2R1bGUodm9pZCAqc2VydmljZSBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKnBEZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqcEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICpwQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcExhdGVuY3lNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKTsKK2F1ZGlvX2lvX2hhbmRsZV90IGFwc19vcGVuX2R1cF9vdXRwdXQodm9pZCAqc2VydmljZSBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDIpOworaW50IGFwc19jbG9zZV9vdXRwdXQodm9pZCAqc2VydmljZSBfX3VudXNlZCwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKK2ludCBhcHNfc3VzcGVuZF9vdXRwdXQodm9pZCAqc2VydmljZSBfX3VudXNlZCwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKK2ludCBhcHNfcmVzdG9yZV9vdXRwdXQodm9pZCAqc2VydmljZSBfX3VudXNlZCwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKK2F1ZGlvX2lvX2hhbmRsZV90IGFwc19vcGVuX2lucHV0KHZvaWQgKnNlcnZpY2UgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqcEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2luX2Fjb3VzdGljc190IGFjb3VzdGljcyBfX3VudXNlZCk7CithdWRpb19pb19oYW5kbGVfdCBhcHNfb3Blbl9pbnB1dF9vbl9tb2R1bGUodm9pZCAqc2VydmljZSBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpwRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrKTsKK2ludCBhcHNfY2xvc2VfaW5wdXQodm9pZCAqc2VydmljZSBfX3VudXNlZCwgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpOworaW50IGFwc19pbnZhbGlkYXRlX3N0cmVhbSh2b2lkICpzZXJ2aWNlIF9fdW51c2VkLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CitpbnQgYXBzX21vdmVfZWZmZWN0cyh2b2lkICpzZXJ2aWNlIF9fdW51c2VkLCBpbnQgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgc3JjX291dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0X291dHB1dCk7CitjaGFyICogYXBzX2dldF9wYXJhbWV0ZXJzKHZvaWQgKnNlcnZpY2UgX191bnVzZWQsIGF1ZGlvX2lvX2hhbmRsZV90IGlvX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXlzKTsKK3ZvaWQgYXBzX3NldF9wYXJhbWV0ZXJzKHZvaWQgKnNlcnZpY2UsIGF1ZGlvX2lvX2hhbmRsZV90IGlvX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa3ZfcGFpcnMsIGludCBkZWxheV9tcyk7CitpbnQgYXBzX3NldF9zdHJlYW1fdm9sdW1lKHZvaWQgKnNlcnZpY2UsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheV9tcyk7CitpbnQgYXBzX3N0YXJ0X3RvbmUodm9pZCAqc2VydmljZSwgYXVkaW9fcG9saWN5X3RvbmVfdCB0b25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOworaW50IGFwc19zdG9wX3RvbmUodm9pZCAqc2VydmljZSk7CitpbnQgYXBzX3NldF92b2ljZV92b2x1bWUodm9pZCAqc2VydmljZSwgZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlfbXMpOworfTsKKworbmFtZXNwYWNlIHsKKyAgICBzdHJ1Y3QgYXVkaW9fcG9saWN5X3NlcnZpY2Vfb3BzIGFwc19vcHMgPSB7CisgICAgICAgIC5vcGVuX291dHB1dCAgICAgICAgICAgPSBhcHNfb3Blbl9vdXRwdXQsCisgICAgICAgIC5vcGVuX2R1cGxpY2F0ZV9vdXRwdXQgPSBhcHNfb3Blbl9kdXBfb3V0cHV0LAorICAgICAgICAuY2xvc2Vfb3V0cHV0ICAgICAgICAgID0gYXBzX2Nsb3NlX291dHB1dCwKKyAgICAgICAgLnN1c3BlbmRfb3V0cHV0ICAgICAgICA9IGFwc19zdXNwZW5kX291dHB1dCwKKyAgICAgICAgLnJlc3RvcmVfb3V0cHV0ICAgICAgICA9IGFwc19yZXN0b3JlX291dHB1dCwKKyAgICAgICAgLm9wZW5faW5wdXQgICAgICAgICAgICA9IGFwc19vcGVuX2lucHV0LAorICAgICAgICAuY2xvc2VfaW5wdXQgICAgICAgICAgID0gYXBzX2Nsb3NlX2lucHV0LAorICAgICAgICAuc2V0X3N0cmVhbV92b2x1bWUgICAgID0gYXBzX3NldF9zdHJlYW1fdm9sdW1lLAorICAgICAgICAuaW52YWxpZGF0ZV9zdHJlYW0gICAgID0gYXBzX2ludmFsaWRhdGVfc3RyZWFtLAorICAgICAgICAuc2V0X3BhcmFtZXRlcnMgICAgICAgID0gYXBzX3NldF9wYXJhbWV0ZXJzLAorICAgICAgICAuZ2V0X3BhcmFtZXRlcnMgICAgICAgID0gYXBzX2dldF9wYXJhbWV0ZXJzLAorICAgICAgICAuc3RhcnRfdG9uZSAgICAgICAgICAgID0gYXBzX3N0YXJ0X3RvbmUsCisgICAgICAgIC5zdG9wX3RvbmUgICAgICAgICAgICAgPSBhcHNfc3RvcF90b25lLAorICAgICAgICAuc2V0X3ZvaWNlX3ZvbHVtZSAgICAgID0gYXBzX3NldF92b2ljZV92b2x1bWUsCisgICAgICAgIC5tb3ZlX2VmZmVjdHMgICAgICAgICAgPSBhcHNfbW92ZV9lZmZlY3RzLAorICAgICAgICAubG9hZF9od19tb2R1bGUgICAgICAgID0gYXBzX2xvYWRfaHdfbW9kdWxlLAorICAgICAgICAub3Blbl9vdXRwdXRfb25fbW9kdWxlID0gYXBzX29wZW5fb3V0cHV0X29uX21vZHVsZSwKKyAgICAgICAgLm9wZW5faW5wdXRfb25fbW9kdWxlICA9IGFwc19vcGVuX2lucHV0X29uX21vZHVsZSwKKyAgICB9OworfTsgLy8gbmFtZXNwYWNlIDx1bm5hbWVkPgorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lTZXJ2aWNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeVNlcnZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTY4YWIxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKQEAgLTAsMCArMSw1MDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQVVESU9QT0xJQ1lTRVJWSUNFX0gKKyNkZWZpbmUgQU5EUk9JRF9BVURJT1BPTElDWVNFUlZJQ0VfSAorCisjaW5jbHVkZSA8Y3V0aWxzL21pc2MuaD4KKyNpbmNsdWRlIDxjdXRpbHMvY29uZmlnX3V0aWxzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgorI2luY2x1ZGUgPGJpbmRlci9CaW5kZXJTZXJ2aWNlLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX3BvbGljeS5oPgorI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9Ub25lR2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9FZmZlY3QuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZV9sZWdhY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlICJBdWRpb1BvbGljeUVmZmVjdHMuaCIKKyNpbmNsdWRlICJBdWRpb1BvbGljeU1hbmFnZXIuaCIKKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgQXVkaW9Qb2xpY3lTZXJ2aWNlIDoKKyAgICBwdWJsaWMgQmluZGVyU2VydmljZTxBdWRpb1BvbGljeVNlcnZpY2U+LAorICAgIHB1YmxpYyBCbkF1ZGlvUG9saWN5U2VydmljZSwKKyAgICBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKK3sKKyAgICBmcmllbmQgY2xhc3MgQmluZGVyU2VydmljZTxBdWRpb1BvbGljeVNlcnZpY2U+OworCitwdWJsaWM6CisgICAgLy8gZm9yIEJpbmRlclNlcnZpY2UKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0U2VydmljZU5hbWUoKSBBTkRST0lEX0FQSSB7IHJldHVybiAibWVkaWEuYXVkaW9fcG9saWN5IjsgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CisKKyAgICAvLworICAgIC8vIEJuQXVkaW9Qb2xpY3lTZXJ2aWNlIChzZWUgQXVkaW9Qb2xpY3lJbnRlcmZhY2UgZm9yIG1ldGhvZCBkZXNjcmlwdGlvbnMpCisgICAgLy8KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKTsKKyAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKTsKKyAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZ2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKTsKKyAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IE5VTEwpOworICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uID0gMCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uID0gMCk7CisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKKyAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldElucHV0KGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9TZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1heCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSk7CisKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKKyAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKKworICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVnaXN0ZXJFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCB1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRFZmZlY3RFbmFibGVkKGludCBpZCwgYm9vbCBlbmFibGVkKTsKKyAgICB2aXJ0dWFsIGJvb2wgaXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7CisgICAgdmlydHVhbCBib29sIGlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7CisgICAgdmlydHVhbCBib29sIGlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5RGVmYXVsdFByZVByb2Nlc3NpbmcoaW50IGF1ZGlvU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY291bnQpOworICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpOworCisgICAgLy8gSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pOworCisgICAgLy8gUmVmQmFzZQorICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIG9uRmlyc3RSZWYoKTsKKworICAgIC8vCisgICAgLy8gSGVscGVycyBmb3IgdGhlIHN0cnVjdCBhdWRpb19wb2xpY3lfc2VydmljZV9vcHMgaW1wbGVtZW50YXRpb24uCisgICAgLy8gVGhpcyBpcyB1c2VkIGJ5IHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciBmb3IgY2VydGFpbiBvcGVyYXRpb25zIHRoYXQKKyAgICAvLyBhcmUgaW1wbGVtZW50ZWQgYnkgdGhlIHBvbGljeSBzZXJ2aWNlLgorICAgIC8vCisgICAgdmlydHVhbCB2b2lkIHNldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5VmFsdWVQYWlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2b2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydFRvbmUoYXVkaW9fcG9saWN5X3RvbmVfdCB0b25lLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wVG9uZSgpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlNcyA9IDApOworICAgIHZpcnR1YWwgYm9vbCBpc09mZmxvYWRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgJmNvbmZpZyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BvcnRzKGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpudW1fcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKworICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlckNsaWVudChjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiYgY2xpZW50KTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWNxdWlyZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90ICpzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKworICAgIHZpcnR1YWwgYXVkaW9fbW9kZV90IGdldFBob25lU3RhdGUoKTsKKworICAgICAgICAgICAgc3RhdHVzX3QgZG9TdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IDApOworICAgICAgICAgICAgdm9pZCBkb1JlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKKworICAgICAgICAgICAgc3RhdHVzX3QgY2xpZW50Q3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyk7CisgICAgICAgICAgICBzdGF0dXNfdCBjbGllbnRSZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyk7CisgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNsaWVudFNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKTsKKworICAgICAgICAgICAgdm9pZCByZW1vdmVOb3RpZmljYXRpb25DbGllbnQodWlkX3QgdWlkKTsKKyAgICAgICAgICAgIHZvaWQgb25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CisgICAgICAgICAgICB2b2lkIGRvT25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CisgICAgICAgICAgICB2b2lkIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICAgICAgICAgIHZvaWQgZG9PbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisKK3ByaXZhdGU6CisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeVNlcnZpY2UoKSBBTkRST0lEX0FQSTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgIH5BdWRpb1BvbGljeVNlcnZpY2UoKTsKKworICAgICAgICAgICAgc3RhdHVzX3QgZHVtcEludGVybmFscyhpbnQgZmQpOworCisgICAgLy8gVGhyZWFkIHVzZWQgZm9yIHRvbmUgcGxheWJhY2sgYW5kIHRvIHNlbmQgYXVkaW8gY29uZmlnIGNvbW1hbmRzIHRvIGF1ZGlvIGZsaW5nZXIKKyAgICAvLyBGb3IgdG9uZSBwbGF5YmFjaywgdXNpbmcgYSBzZXBhcmF0ZSB0aHJlYWQgaXMgbmVjZXNzYXJ5IHRvIGF2b2lkIGRlYWRsb2NrIHdpdGggbUxvY2sgYmVjYXVzZQorICAgIC8vIHN0YXJ0VG9uZSgpIGFuZCBzdG9wVG9uZSgpIGFyZSBub3JtYWxseSBjYWxsZWQgd2l0aCBtTG9jayBsb2NrZWQgYW5kIHJlcXVlc3RpbmcgYSB0b25lIHN0YXJ0CisgICAgLy8gb3Igc3RvcCB3aWxsIGNhdXNlIGNhbGxzIHRvIEF1ZGlvUG9saWN5U2VydmljZSBhbmQgYW4gYXR0ZW1wdCB0byBsb2NrIG1Mb2NrLgorICAgIC8vIEZvciBhdWRpbyBjb25maWcgY29tbWFuZHMsIGl0IGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGF1ZGlvIGZsaW5nZXIgcmVxdWlyZXMgdGhhdCB0aGUgY2FsbGluZworICAgIC8vIHByb2Nlc3MgKHVzZXIpIGhhcyBwZXJtaXNzaW9uIHRvIG1vZGlmeSBhdWRpbyBzZXR0aW5ncy4KKyAgICBjbGFzcyBBdWRpb0NvbW1hbmRUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKKyAgICAgICAgY2xhc3MgQXVkaW9Db21tYW5kOworICAgIHB1YmxpYzoKKworICAgICAgICAvLyBjb21tYW5kcyBmb3IgdG9uZSBBdWRpb0NvbW1hbmQKKyAgICAgICAgZW51bSB7CisgICAgICAgICAgICBTVEFSVF9UT05FLAorICAgICAgICAgICAgU1RPUF9UT05FLAorICAgICAgICAgICAgU0VUX1ZPTFVNRSwKKyAgICAgICAgICAgIFNFVF9QQVJBTUVURVJTLAorICAgICAgICAgICAgU0VUX1ZPSUNFX1ZPTFVNRSwKKyAgICAgICAgICAgIFNUT1BfT1VUUFVULAorICAgICAgICAgICAgUkVMRUFTRV9PVVRQVVQsCisgICAgICAgICAgICBDUkVBVEVfQVVESU9fUEFUQ0gsCisgICAgICAgICAgICBSRUxFQVNFX0FVRElPX1BBVENILAorICAgICAgICAgICAgVVBEQVRFX0FVRElPUE9SVF9MSVNULAorICAgICAgICAgICAgVVBEQVRFX0FVRElPUEFUQ0hfTElTVCwKKyAgICAgICAgICAgIFNFVF9BVURJT1BPUlRfQ09ORklHLAorICAgICAgICB9OworCisgICAgICAgIEF1ZGlvQ29tbWFuZFRocmVhZCAoU3RyaW5nOCBuYW1lLCBjb25zdCB3cDxBdWRpb1BvbGljeVNlcnZpY2U+JiBzZXJ2aWNlKTsKKyAgICAgICAgdmlydHVhbCAgICAgICAgICAgICB+QXVkaW9Db21tYW5kVGhyZWFkKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQpOworCisgICAgICAgIC8vIFRocmVhZCB2aXJ0dWFscworICAgICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBvbkZpcnN0UmVmKCk7CisgICAgICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIHRocmVhZExvb3AoKTsKKworICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBleGl0KCk7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHN0YXJ0VG9uZUNvbW1hbmQoVG9uZUdlbmVyYXRvcjo6dG9uZV90eXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOworICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzdG9wVG9uZUNvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgdm9sdW1lQ29tbWFuZChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgZmxvYXQgdm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIGludCBkZWxheU1zID0gMCk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHBhcmFtZXRlcnNDb21tYW5kKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXlWYWx1ZVBhaXJzLCBpbnQgZGVsYXlNcyA9IDApOworICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICB2b2ljZVZvbHVtZUNvbW1hbmQoZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlNcyA9IDApOworICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzdG9wT3V0cHV0Q29tbWFuZChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHJlbGVhc2VPdXRwdXRDb21tYW5kKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHNlbmRDb21tYW5kKHNwPEF1ZGlvQ29tbWFuZD4mIGNvbW1hbmQsIGludCBkZWxheU1zID0gMCk7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGluc2VydENvbW1hbmRfbChzcDxBdWRpb0NvbW1hbmQ+JiBjb21tYW5kLCBpbnQgZGVsYXlNcyA9IDApOworICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBjcmVhdGVBdWRpb1BhdGNoQ29tbWFuZChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHJlbGVhc2VBdWRpb1BhdGNoQ29tbWFuZChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyk7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHVwZGF0ZUF1ZGlvUG9ydExpc3RDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHVwZGF0ZUF1ZGlvUGF0Y2hMaXN0Q29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRBdWRpb1BvcnRDb25maWdDb21tYW5kKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgaW5zZXJ0Q29tbWFuZF9sKEF1ZGlvQ29tbWFuZCAqY29tbWFuZCwgaW50IGRlbGF5TXMgPSAwKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIGNsYXNzIEF1ZGlvQ29tbWFuZERhdGE7CisKKyAgICAgICAgLy8gZGVzY3JpcHRvciBmb3IgcmVxdWVzdGVkIHRvbmUgcGxheWJhY2sgZXZlbnQKKyAgICAgICAgY2xhc3MgQXVkaW9Db21tYW5kOiBwdWJsaWMgUmVmQmFzZSB7CisKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgQXVkaW9Db21tYW5kKCkKKyAgICAgICAgICAgIDogbUNvbW1hbmQoLTEpLCBtU3RhdHVzKE5PX0VSUk9SKSwgbVdhaXRTdGF0dXMoZmFsc2UpIHt9CisKKyAgICAgICAgICAgIHZvaWQgZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplKTsKKworICAgICAgICAgICAgaW50IG1Db21tYW5kOyAgIC8vIFNUQVJUX1RPTkUsIFNUT1BfVE9ORSAuLi4KKyAgICAgICAgICAgIG5zZWNzX3QgbVRpbWU7ICAvLyB0aW1lIHN0YW1wCisgICAgICAgICAgICBNdXRleCBtTG9jazsgICAgLy8gbXV0ZXggYXNzb2NpYXRlZCB0byBtQ29uZAorICAgICAgICAgICAgQ29uZGl0aW9uIG1Db25kOyAvLyBjb25kaXRpb24gZm9yIHN0YXR1cyByZXR1cm4KKyAgICAgICAgICAgIHN0YXR1c190IG1TdGF0dXM7IC8vIGNvbW1hbmQgc3RhdHVzCisgICAgICAgICAgICBib29sIG1XYWl0U3RhdHVzOyAvLyB0cnVlIGlmIGNhbGxlciBpcyB3YWl0aW5nIGZvciBzdGF0dXMKKyAgICAgICAgICAgIHNwPEF1ZGlvQ29tbWFuZERhdGE+IG1QYXJhbTsgICAgIC8vIGNvbW1hbmQgc3BlY2lmaWMgcGFyYW1ldGVyIGRhdGEKKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBBdWRpb0NvbW1hbmREYXRhOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIHZpcnR1YWwgfkF1ZGlvQ29tbWFuZERhdGEoKSB7fQorICAgICAgICBwcm90ZWN0ZWQ6CisgICAgICAgICAgICBBdWRpb0NvbW1hbmREYXRhKCkge30KKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBUb25lRGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgVG9uZUdlbmVyYXRvcjo6dG9uZV90eXBlIG1UeXBlOyAvLyB0b25lIHR5cGUgKFNUQVJUX1RPTkUgb25seSkKKyAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbVN0cmVhbTsgICAgLy8gc3RyZWFtIHR5cGUgKFNUQVJUX1RPTkUgb25seSkKKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBWb2x1bWVEYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IG1TdHJlYW07CisgICAgICAgICAgICBmbG9hdCBtVm9sdW1lOworICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgbUlPOworICAgICAgICB9OworCisgICAgICAgIGNsYXNzIFBhcmFtZXRlcnNEYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBtSU87CisgICAgICAgICAgICBTdHJpbmc4IG1LZXlWYWx1ZVBhaXJzOworICAgICAgICB9OworCisgICAgICAgIGNsYXNzIFZvaWNlVm9sdW1lRGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgZmxvYXQgbVZvbHVtZTsKKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBTdG9wT3V0cHV0RGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgbUlPOworICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBtU3RyZWFtOworICAgICAgICAgICAgaW50IG1TZXNzaW9uOworICAgICAgICB9OworCisgICAgICAgIGNsYXNzIFJlbGVhc2VPdXRwdXREYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBtSU87CisgICAgICAgIH07CisKKyAgICAgICAgY2xhc3MgQ3JlYXRlQXVkaW9QYXRjaERhdGEgOiBwdWJsaWMgQXVkaW9Db21tYW5kRGF0YSB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBtUGF0Y2g7CisgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtSGFuZGxlOworICAgICAgICB9OworCisgICAgICAgIGNsYXNzIFJlbGVhc2VBdWRpb1BhdGNoRGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbUhhbmRsZTsKKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBTZXRBdWRpb1BvcnRDb25maWdEYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgbUNvbmZpZzsKKyAgICAgICAgfTsKKworICAgICAgICBNdXRleCAgIG1Mb2NrOworICAgICAgICBDb25kaXRpb24gbVdhaXRXb3JrQ1Y7CisgICAgICAgIFZlY3RvciA8IHNwPEF1ZGlvQ29tbWFuZD4gPiBtQXVkaW9Db21tYW5kczsgLy8gbGlzdCBvZiBwZW5kaW5nIGNvbW1hbmRzCisgICAgICAgIFRvbmVHZW5lcmF0b3IgKm1wVG9uZUdlbmVyYXRvcjsgICAgIC8vIHRoZSB0b25lIGdlbmVyYXRvcgorICAgICAgICBzcDxBdWRpb0NvbW1hbmQ+IG1MYXN0Q29tbWFuZDsgICAgICAvLyBsYXN0IHByb2Nlc3NlZCBjb21tYW5kICh1c2VkIGJ5IGR1bXApCisgICAgICAgIFN0cmluZzggbU5hbWU7ICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cmluZyB1c2VkIGJ5IHdha2UgbG9jayBmbyBkZWxheWVkIGNvbW1hbmRzCisgICAgICAgIHdwPEF1ZGlvUG9saWN5U2VydmljZT4gbVNlcnZpY2U7CisgICAgfTsKKworICAgIGNsYXNzIEF1ZGlvUG9saWN5Q2xpZW50IDogcHVibGljIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlCisgICAgeworICAgICBwdWJsaWM6CisgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50KEF1ZGlvUG9saWN5U2VydmljZSAqc2VydmljZSkgOiBtQXVkaW9Qb2xpY3lTZXJ2aWNlKHNlcnZpY2UpIHt9CisgICAgICAgIHZpcnR1YWwgfkF1ZGlvUG9saWN5Q2xpZW50KCkge30KKworICAgICAgICAvLworICAgICAgICAvLyBBdWRpbyBIVyBtb2R1bGUgZnVuY3Rpb25zCisgICAgICAgIC8vCisKKyAgICAgICAgLy8gbG9hZHMgYSBIVyBtb2R1bGUuCisgICAgICAgIHZpcnR1YWwgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGxvYWRId01vZHVsZShjb25zdCBjaGFyICpuYW1lKTsKKworICAgICAgICAvLworICAgICAgICAvLyBBdWRpbyBvdXRwdXQgQ29udHJvbCBmdW5jdGlvbnMKKyAgICAgICAgLy8KKworICAgICAgICAvLyBvcGVucyBhbiBhdWRpbyBvdXRwdXQgd2l0aCB0aGUgcmVxdWVzdGVkIHBhcmFtZXRlcnMuIFRoZSBwYXJhbWV0ZXIgdmFsdWVzIGNhbiBpbmRpY2F0ZSB0byB1c2UgdGhlIGRlZmF1bHQgdmFsdWVzCisgICAgICAgIC8vIGluIGNhc2UgdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGhhcyBubyBzcGVjaWZpYyByZXF1aXJlbWVudHMgZm9yIHRoZSBvdXRwdXQgYmVpbmcgb3BlbmVkLgorICAgICAgICAvLyBXaGVuIHRoZSBmdW5jdGlvbiByZXR1cm5zLCB0aGUgcGFyYW1ldGVyIHZhbHVlcyByZWZsZWN0IHRoZSBhY3R1YWwgdmFsdWVzIHVzZWQgYnkgdGhlIGF1ZGlvIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0uCisgICAgICAgIC8vIFRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciBjYW4gY2hlY2sgaWYgdGhlIHByb3Bvc2VkIHBhcmFtZXRlcnMgYXJlIHN1aXRhYmxlIG9yIG5vdCBhbmQgYWN0IGFjY29yZGluZ2x5LgorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5PdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpsYXRlbmN5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyk7CisgICAgICAgIC8vIGNyZWF0ZXMgYSBzcGVjaWFsIG91dHB1dCB0aGF0IGlzIGR1cGxpY2F0ZWQgdG8gdGhlIHR3byBvdXRwdXRzIHBhc3NlZCBhcyBhcmd1bWVudHMuIFRoZSBkdXBsaWNhdGlvbiBpcyBwZXJmb3JtZWQgYnkKKyAgICAgICAgLy8gYSBzcGVjaWFsIG1peGVyIHRocmVhZCBpbiB0aGUgQXVkaW9GbGluZ2VyLgorICAgICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IG9wZW5EdXBsaWNhdGVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0Mik7CisgICAgICAgIC8vIGNsb3NlcyB0aGUgb3V0cHV0IHN0cmVhbQorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CisgICAgICAgIC8vIHN1c3BlbmRzIHRoZSBvdXRwdXQuIFdoZW4gYW4gb3V0cHV0IGlzIHN1c3BlbmRlZCwgdGhlIGNvcnJlc3BvbmRpbmcgYXVkaW8gaGFyZHdhcmUgb3V0cHV0IHN0cmVhbSBpcyBwbGFjZWQgaW4KKyAgICAgICAgLy8gc3RhbmRieSBhbmQgdGhlIEF1ZGlvVHJhY2tzIGF0dGFjaGVkIHRvIHRoZSBtaXhlciB0aHJlYWQgYXJlIHN0aWxsIHByb2Nlc3NlZCBidXQgdGhlIG91dHB1dCBtaXggaXMgZGlzY2FyZGVkLgorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN1c3BlbmRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKKyAgICAgICAgLy8gcmVzdG9yZXMgYSBzdXNwZW5kZWQgb3V0cHV0LgorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3RvcmVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKKworICAgICAgICAvLworICAgICAgICAvLyBBdWRpbyBpbnB1dCBDb250cm9sIGZ1bmN0aW9ucworICAgICAgICAvLworCisgICAgICAgIC8vIG9wZW5zIGFuIGF1ZGlvIGlucHV0CisgICAgICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3Qgb3BlbklucHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpOworICAgICAgICAvLyBjbG9zZXMgYW4gYXVkaW8gaW5wdXQKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gbWlzYyBjb250cm9sIGZ1bmN0aW9ucworICAgICAgICAvLworCisgICAgICAgIC8vIHNldCBhIHN0cmVhbSB2b2x1bWUgZm9yIGEgcGFydGljdWxhciBvdXRwdXQuIEZvciB0aGUgc2FtZSB1c2VyIHNldHRpbmcsIGEgZ2l2ZW4gc3RyZWFtIHR5cGUgY2FuIGhhdmUgZGlmZmVyZW50IHZvbHVtZXMKKyAgICAgICAgLy8gZm9yIGVhY2ggb3V0cHV0IChkZXN0aW5hdGlvbiBkZXZpY2UpIGl0IGlzIGF0dGFjaGVkIHRvLgorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgZmxvYXQgdm9sdW1lLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIGludCBkZWxheU1zID0gMCk7CisKKyAgICAgICAgLy8gaW52YWxpZGF0ZSBhIHN0cmVhbSB0eXBlLCBjYXVzaW5nIGEgcmVyb3V0ZSB0byBhbiB1bnNwZWNpZmllZCBuZXcgb3V0cHV0CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgaW52YWxpZGF0ZVN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CisKKyAgICAgICAgLy8gZnVuY3Rpb24gZW5hYmxpbmcgdG8gc2VuZCBwcm9wcmlldGFyeSBpbmZvcm1hdGlvbnMgZGlyZWN0bHkgZnJvbSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0byBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UuCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzLCBpbnQgZGVsYXlNcyA9IDApOworICAgICAgICAvLyBmdW5jdGlvbiBlbmFibGluZyB0byByZWNlaXZlIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9ucyBkaXJlY3RseSBmcm9tIGF1ZGlvIGhhcmR3YXJlIGludGVyZmFjZSB0byBhdWRpbyBwb2xpY3kgbWFuYWdlci4KKyAgICAgICAgdmlydHVhbCBTdHJpbmc4IGdldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IFN0cmluZzgmIGtleXMpOworCisgICAgICAgIC8vIHJlcXVlc3QgdGhlIHBsYXliYWNrIG9mIGEgdG9uZSBvbiB0aGUgc3BlY2lmaWVkIHN0cmVhbTogdXNlZCBmb3IgaW5zdGFuY2UgdG8gcmVwbGFjZSBub3RpZmljYXRpb24gc291bmRzIHdoZW4gcGxheWluZworICAgICAgICAvLyBvdmVyIGEgdGVsZXBob255IGRldmljZSBkdXJpbmcgYSBwaG9uZSBjYWxsLgorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0VG9uZShhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wVG9uZSgpOworCisgICAgICAgIC8vIHNldCBkb3duIGxpbmsgYXVkaW8gdm9sdW1lLgorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5TXMgPSAwKTsKKworICAgICAgICAvLyBtb3ZlIGVmZmVjdCB0byB0aGUgc3BlY2lmaWVkIG91dHB1dAorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IG1vdmVFZmZlY3RzKGludCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzcmNPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGRzdE91dHB1dCk7CisKKyAgICAgICAgLyogQ3JlYXRlIGEgcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cyAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKTsKKworICAgICAgICAvKiBSZWxlYXNlIGEgcGF0Y2ggKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpOworCisgICAgICAgIC8qIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24gKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcsIGludCBkZWxheU1zKTsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisKKyAgICAgICAgdmlydHVhbCBhdWRpb191bmlxdWVfaWRfdCBuZXdBdWRpb1VuaXF1ZUlkKCk7CisKKyAgICAgcHJpdmF0ZToKKyAgICAgICAgQXVkaW9Qb2xpY3lTZXJ2aWNlICptQXVkaW9Qb2xpY3lTZXJ2aWNlOworICAgIH07CisKKyAgICAvLyAtLS0gTm90aWZpY2F0aW9uIENsaWVudCAtLS0KKyAgICBjbGFzcyBOb3RpZmljYXRpb25DbGllbnQgOiBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgeworICAgIHB1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DbGllbnQoY29uc3Qgc3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiYgc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpOworICAgICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5Ob3RpZmljYXRpb25DbGllbnQoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKworICAgICAgICAgICAgICAgIC8vIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50CisgICAgICAgICAgICAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKTsKKworICAgIHByaXZhdGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ2xpZW50KGNvbnN0IE5vdGlmaWNhdGlvbkNsaWVudCYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkNsaWVudCYgb3BlcmF0b3IgPSAoY29uc3QgTm90aWZpY2F0aW9uQ2xpZW50Jik7CisKKyAgICAgICAgY29uc3Qgd3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiAgICAgICAgbVNlcnZpY2U7CisgICAgICAgIGNvbnN0IHVpZF90ICAgICAgICAgICAgICAgICAgICAgICAgIG1VaWQ7CisgICAgICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+IG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ7CisgICAgfTsKKworICAgIC8vIEludGVybmFsIGR1bXAgdXRpbGl0aWVzLgorICAgIHN0YXR1c190IGR1bXBQZXJtaXNzaW9uRGVuaWFsKGludCBmZCk7CisKKworICAgIG11dGFibGUgTXV0ZXggbUxvY2s7ICAgIC8vIHByZXZlbnRzIGNvbmN1cnJlbnQgYWNjZXNzIHRvIEF1ZGlvUG9saWN5IG1hbmFnZXIgZnVuY3Rpb25zIGNoYW5naW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGV2aWNlIGNvbm5lY3Rpb24gc3RhdGUgIG9yIHJvdXRpbmcKKyAgICBzcDxBdWRpb0NvbW1hbmRUaHJlYWQ+IG1BdWRpb0NvbW1hbmRUaHJlYWQ7ICAgICAvLyBhdWRpbyBjb21tYW5kcyB0aHJlYWQKKyAgICBzcDxBdWRpb0NvbW1hbmRUaHJlYWQ+IG1Ub25lUGxheWJhY2tUaHJlYWQ7ICAgICAvLyB0b25lIHBsYXliYWNrIHRocmVhZAorICAgIHNwPEF1ZGlvQ29tbWFuZFRocmVhZD4gbU91dHB1dENvbW1hbmRUaHJlYWQ7ICAgIC8vIHByb2Nlc3Mgc3RvcCBhbmQgcmVsZWFzZSBvdXRwdXQKKyAgICBzdHJ1Y3QgYXVkaW9fcG9saWN5X2RldmljZSAqbXBBdWRpb1BvbGljeURldjsKKyAgICBzdHJ1Y3QgYXVkaW9fcG9saWN5ICptcEF1ZGlvUG9saWN5OworICAgIEF1ZGlvUG9saWN5SW50ZXJmYWNlICptQXVkaW9Qb2xpY3lNYW5hZ2VyOworICAgIEF1ZGlvUG9saWN5Q2xpZW50ICptQXVkaW9Qb2xpY3lDbGllbnQ7CisKKyAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8IHVpZF90LCBzcDxOb3RpZmljYXRpb25DbGllbnQ+ID4gICAgbU5vdGlmaWNhdGlvbkNsaWVudHM7CisKKyAgICAvLyBNYW5hZ2UgYWxsIGVmZmVjdHMgY29uZmlndXJlZCBpbiBhdWRpb19lZmZlY3RzLmNvbmYKKyAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+IG1BdWRpb1BvbGljeUVmZmVjdHM7CisgICAgYXVkaW9fbW9kZV90IG1QaG9uZVN0YXRlOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfQVVESU9QT0xJQ1lTRVJWSUNFX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2F1ZGlvX3BvbGljeS5jb25mIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvYXVkaW9fcG9saWN5LmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI4M2ZlZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2F1ZGlvX3BvbGljeS5jb25mCkBAIC0wLDAgKzEsMTQ1IEBACisjCisjIFRlbXBsYXRlIGF1ZGlvIHBvbGljeSBjb25maWd1cmF0aW9uIGZpbGUKKyMKKworIyBHbG9iYWwgY29uZmlndXJhdGlvbiBzZWN0aW9uOgorIyAtIGJlZm9yZSBhdWRpbyBIQUwgdmVyc2lvbiAzLjA6CisjICAgbGlzdHMgaW5wdXQgYW5kIG91dHB1dCBkZXZpY2VzIGFsd2F5cyBwcmVzZW50IG9uIHRoZSBkZXZpY2UKKyMgICBhcyB3ZWxsIGFzIHRoZSBvdXRwdXQgZGV2aWNlIHNlbGVjdGVkIGJ5IGRlZmF1bHQuCisjICAgRGV2aWNlcyBhcmUgZGVzaWduYXRlZCBieSBhIHN0cmluZyB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBlbnVtIGluIGF1ZGlvLmgKKyMKKyMgIGdsb2JhbF9jb25maWd1cmF0aW9uIHsKKyMgICAgYXR0YWNoZWRfb3V0cHV0X2RldmljZXMgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSCisjICAgIGRlZmF1bHRfb3V0cHV0X2RldmljZSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIKKyMgICAgYXR0YWNoZWRfaW5wdXRfZGV2aWNlcyBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUN8QVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgKKyMgIH0KKyMKKyMgLSBhZnRlciBhbmQgaW5jbHVkaW5nIGF1ZGlvIEhBTCAzLjAgdGhlIGdsb2JhbF9jb25maWd1cmF0aW9uIHNlY3Rpb24gaXMgaW5jbHVkZWQgaW4gZWFjaAorIyAgIGhhcmR3YXJlIG1vZHVsZSBzZWN0aW9uLgorIyAgIGl0IGFsc28gaW5jbHVkZXMgdGhlIGF1ZGlvIEhBTCB2ZXJzaW9uIG9mIHRoaXMgaHcgbW9kdWxlOgorIyAgZ2xvYmFsX2NvbmZpZ3VyYXRpb24geworIyAgICAuLi4KKyMgICAgIGF1ZGlvX2hhbF92ZXJzaW9uIDxtYWpvci5taW5vcj4gICMgYXVkaW8gSEFMIHZlcnNpb24gaW4gZS5nLiAzLjAKKyMgIH0KKyMgICBvdGhlciBhdHRyaWJ1dGVzIChhdHRhY2hlZCBkZXZpY2VzLCBkZWZhdWx0IGRldmljZSkgaGF2ZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUKKyMgICBnbG9iYWxfY29uZmlndXJhdGlvbiBzZWN0aW9uIG9mIGVhY2ggaGFyZHdhcmUgbW9kdWxlCisKKworIyBhdWRpbyBoYXJkd2FyZSBtb2R1bGUgc2VjdGlvbjogY29udGFpbnMgZGVzY3JpcHRvcnMgZm9yIGFsbCBhdWRpbyBodyBtb2R1bGVzIHByZXNlbnQgb24gdGhlCisjIGRldmljZS4gRWFjaCBodyBtb2R1bGUgbm9kZSBpcyBuYW1lZCBhZnRlciB0aGUgY29ycmVzcG9uZGluZyBodyBtb2R1bGUgbGlicmFyeSBiYXNlIG5hbWUuCisjIEZvciBpbnN0YW5jZSwgInByaW1hcnkiIGNvcnJlc3BvbmRzIHRvIGF1ZGlvLnByaW1hcnkuPGRldmljZT4uc28uCisjIFRoZSAicHJpbWFyeSIgbW9kdWxlIGlzIG1hbmRhdG9yeSBhbmQgbXVzdCBpbmNsdWRlIGF0IGxlYXN0IG9uZSBvdXRwdXQgd2l0aAorIyBBVURJT19PVVRQVVRfRkxBR19QUklNQVJZIGZsYWcuCisjIEVhY2ggbW9kdWxlIGRlc2NyaXB0b3IgY29udGFpbnMgb25lIG9yIG1vcmUgb3V0cHV0IHByb2ZpbGUgZGVzY3JpcHRvcnMgYW5kIHplcm8gb3IgbW9yZQorIyBpbnB1dCBwcm9maWxlIGRlc2NyaXB0b3JzLiBFYWNoIHByb2ZpbGUgbGlzdHMgYWxsIHRoZSBwYXJhbWV0ZXJzIHN1cHBvcnRlZCBieSBhIGdpdmVuIG91dHB1dAorIyBvciBpbnB1dCBzdHJlYW0gY2F0ZWdvcnkuCisjIFRoZSAiY2hhbm5lbF9tYXNrcyIsICJmb3JtYXRzIiwgImRldmljZXMiIGFuZCAiZmxhZ3MiIGFyZSBzcGVjaWZpZWQgdXNpbmcgc3RyaW5ncyBjb3JyZXNwb25kaW5nCisjIHRvIGVudW1zIGluIGF1ZGlvLmggYW5kIGF1ZGlvX3BvbGljeS5oLiBUaGV5IGFyZSBjb25jYXRlbmF0ZWQgYnkgdXNlIG9mICJ8IiB3aXRob3V0IHNwYWNlIG9yICJcbiIuCisjCisjIEZvciBhdWRpbyBIQUwgdmVyc2lvbiBwb3N0ZXJpb3IgdG8gMy4wIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnMgb3Igc3ViIHNlY3Rpb25zIGNhbiBiZSBwcmVzZW50IGluCisjIGEgaHcgbW9kdWxlIHNlY3Rpb246CisjIC0gQSAiZ2xvYmFsX2NvbmZpZ3VyYXRpb24iIHNlY3Rpb246IHNlZSBhYm92ZQorIyAtIE9wdGlvbmFsbHkgYSAiZGV2aWNlcyIgc2VjdGlvbjoKKyMgICBUaGlzIHNlY3Rpb24gY29udGFpbnMgZGVzY3JpcHRvcnMgZm9yIGF1ZGlvIGRldmljZXMgd2l0aCBhdHRyaWJ1dGVzIGxpa2UgYW4gYWRkcmVzcyBvciBhCisjICAgZ2FpbiBjb250cm9sbGVyLiBUaGUgc3ludGF4IGZvciB0aGUgZGV2aWNlcyBzZWN0aW9uIGFuZCBkZXZpY2UgZGVzY3JpcHRvciBpcyBhcyBmb2xsb3dzOgorIyAgICBkZXZpY2VzIHsKKyMgICAgICA8ZGV2aWNlIG5hbWU+IHsgICAgICAgICAgICAgICMgPGRldmljZSBuYW1lPjogYW55IHN0cmluZyB3aXRob3V0IHNwYWNlCisjICAgICAgICB0eXBlIDxkZXZpY2UgdHlwZT4gICAgICAgICAjIDxkZXZpY2UgdHlwZT4gZS5nLiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIKKyMgICAgICAgIGFkZHJlc3MgPGFkZHJlc3M+ICAgICAgICAgICMgb3B0aW9uYWw6IGRldmljZSBhZGRyZXNzLCBjaGFyIHN0cmluZyBsZXNzIHRoYW4gNjQgaW4gbGVuZ3RoCisjICAgICAgfQorIyAgICB9CisjIC0gb25lIG9yIG1vcmUgImdhaW5zIiBzZWN0aW9ucyBjYW4gYmUgcHJlc2VudCBpbiBhIGRldmljZSBkZXNjcmlwdG9yIHNlY3Rpb24uCisjICAgSWYgcHJlc2VudCwgdGhleSBkZXNjcmliZSB0aGUgY2FwYWJpbGl0aWVzIG9mIGdhaW4gY29udHJvbGxlcnMgYXR0YWNoZWQgdG8gdGhpcyBpbnB1dCBvcgorIyAgIG91dHB1dCBkZXZpY2UuIGUuZy4gOgorIyAgIDxkZXZpY2UgbmFtZT4geyAgICAgICAgICAgICAgICAgICMgPGRldmljZSBuYW1lPjogYW55IHN0cmluZyB3aXRob3V0IHNwYWNlCisjICAgICB0eXBlIDxkZXZpY2UgdHlwZT4gICAgICAgICAgICAgIyA8ZGV2aWNlIHR5cGU+IGUuZy4gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSCisjICAgICBhZGRyZXNzIDxhZGRyZXNzPiAgICAgICAgICAgICAgIyBvcHRpb25hbDogZGV2aWNlIGFkZHJlc3MsIGNoYXIgc3RyaW5nIGxlc3MgdGhhbiA2NCBpbiBsZW5ndGgKKyMgICAgIGdhaW5zIHsKKyMgICAgICAgPGdhaW4gbmFtZT4geworIyAgICAgICAgIG1vZGUgPGdhaW4gbW9kZXMgc3VwcG9ydGVkPiAgICAgICAgICAgICAgIyBlLmcuIEFVRElPX0dBSU5fTU9ERV9DSEFOTkVMUworIyAgICAgICAgIGNoYW5uZWxfbWFzayA8Y29udHJvbGxlZCBjaGFubmVscz4gICAgICAgIyBuZWVkZWQgaWYgbW9kZSBBVURJT19HQUlOX01PREVfQ0hBTk5FTFMKKyMgICAgICAgICBtaW5fdmFsdWVfbUIgPG1pbiB2YWx1ZSBpbiBtaWxsaWJlbD4KKyMgICAgICAgICBtYXhfdmFsdWVfbUIgPG1heCB2YWx1ZSBpbiBtaWxsaWJlbD4KKyMgICAgICAgICBkZWZhdWx0X3ZhbHVlX21CIDxkZWZhdWx0IHZhbHVlIGluIG1pbGxpYmVsPgorIyAgICAgICAgIHN0ZXBfdmFsdWVfbUIgPHN0ZXAgdmFsdWUgaW4gbWlsbGliZWw+CisjICAgICAgICAgbWluX3JhbXBfbXMgPG1pbiBkdXJhdGlvbiBpbiBtcz4gICAgICAgICAjIG5lZWRlZCBpZiBtb2RlIEFVRElPX0dBSU5fTU9ERV9SQU1QCisjICAgICAgICAgbWF4X3JhbXBfbXMgPG1heCBkdXJhdGlvbiBtcz4gICAgICAgICAgICAjIG5lZWRlZCBpZiBtb2RlIEFVRElPX0dBSU5fTU9ERV9SQU1QCisjICAgICAgIH0KKyMgICAgIH0KKyMgICB9CisjIC0gd2hlbiBhIGRldmljZSBkZXNjcmlwdG9yIGlzIHByZXNlbnQsIG91dHB1dCBhbmQgaW5wdXQgcHJvZmlsZXMgY2FuIHJlZmVyIHRvIHRoaXMgZGV2aWNlIGJ5CisjIGl0cyBuYW1lIGluIHRoZWlyICJkZXZpY2VzIiBzZWN0aW9uIGluc3RlYWQgb2Ygc3BlY2lmeWluZyBhIGRldmljZSB0eXBlLiBlLmcuIDoKKyMgICBvdXRwdXRzIHsKKyMgICAgIHByaW1hcnkgeworIyAgICAgICBzYW1wbGluZ19yYXRlcyA0NDEwMAorIyAgICAgICBjaGFubmVsX21hc2tzIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTworIyAgICAgICBmb3JtYXRzIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUCisjICAgICAgIGRldmljZXMgPGRldmljZSBuYW1lPgorIyAgICAgICBmbGFncyBBVURJT19PVVRQVVRfRkxBR19QUklNQVJZCisjICAgICB9CisjICAgfQorIyBzYW1wbGUgYXVkaW9fcG9saWN5LmNvbmYgZmlsZSBiZWxvdworCithdWRpb19od19tb2R1bGVzIHsKKyAgcHJpbWFyeSB7CisgICAgZ2xvYmFsX2NvbmZpZ3VyYXRpb24geworICAgICAgYXR0YWNoZWRfb3V0cHV0X2RldmljZXMgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSCisgICAgICBkZWZhdWx0X291dHB1dF9kZXZpY2UgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSCisgICAgICBhdHRhY2hlZF9pbnB1dF9kZXZpY2VzIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQworICAgICAgYXVkaW9faGFsX3ZlcnNpb24gMy4wCisgICAgfQorICAgIGRldmljZXMgeworICAgICAgc3BlYWtlciB7CisgICAgICAgIHR5cGUgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSCisgICAgICAgIGdhaW5zIHsKKyAgICAgICAgICBnYWluXzEgeworICAgICAgICAgICAgbW9kZSBBVURJT19HQUlOX01PREVfSk9JTlQKKyAgICAgICAgICAgIG1pbl92YWx1ZV9tQiAtODQwMAorICAgICAgICAgICAgbWF4X3ZhbHVlX21CIDQwMDAKKyAgICAgICAgICAgIGRlZmF1bHRfdmFsdWVfbUIgMAorICAgICAgICAgICAgc3RlcF92YWx1ZV9tQiAxMDAKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgb3V0cHV0cyB7CisgICAgICBwcmltYXJ5IHsKKyAgICAgICAgc2FtcGxpbmdfcmF0ZXMgNDgwMDAKKyAgICAgICAgY2hhbm5lbF9tYXNrcyBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8KKyAgICAgICAgZm9ybWF0cyBBVURJT19GT1JNQVRfUENNXzE2X0JJVAorICAgICAgICBkZXZpY2VzIHNwZWFrZXIKKyAgICAgICAgZmxhZ3MgQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWQorICAgICAgfQorICAgIH0KKyAgICBpbnB1dHMgeworICAgICAgcHJpbWFyeSB7CisgICAgICAgIHNhbXBsaW5nX3JhdGVzIDgwMDB8MTYwMDAKKyAgICAgICAgY2hhbm5lbF9tYXNrcyBBVURJT19DSEFOTkVMX0lOX01PTk8KKyAgICAgICAgZm9ybWF0cyBBVURJT19GT1JNQVRfUENNXzE2X0JJVAorICAgICAgICBkZXZpY2VzIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQworICAgICAgfQorICAgIH0KKyAgfQorICByX3N1Ym1peCB7CisgICAgZ2xvYmFsX2NvbmZpZ3VyYXRpb24geworICAgICAgYXR0YWNoZWRfaW5wdXRfZGV2aWNlcyBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWAorICAgICAgYXVkaW9faGFsX3ZlcnNpb24gMi4wCisgICAgfQorICAgIG91dHB1dHMgeworICAgICAgc3VibWl4IHsKKyAgICAgICAgc2FtcGxpbmdfcmF0ZXMgNDgwMDAKKyAgICAgICAgY2hhbm5lbF9tYXNrcyBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8KKyAgICAgICAgZm9ybWF0cyBBVURJT19GT1JNQVRfUENNXzE2X0JJVAorICAgICAgICBkZXZpY2VzIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWAorICAgICAgfQorICAgIH0KKyAgICBpbnB1dHMgeworICAgICAgc3VibWl4IHsKKyAgICAgICAgc2FtcGxpbmdfcmF0ZXMgNDgwMDAKKyAgICAgICAgY2hhbm5lbF9tYXNrcyBBVURJT19DSEFOTkVMX0lOX1NURVJFTworICAgICAgICBmb3JtYXRzIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUCisgICAgICAgIGRldmljZXMgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgKKyAgICAgIH0KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2F1ZGlvX3BvbGljeV9jb25mLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9hdWRpb19wb2xpY3lfY29uZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MzVhNjcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9hdWRpb19wb2xpY3lfY29uZi5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNpZm5kZWYgQU5EUk9JRF9BVURJT19QT0xJQ1lfQ09ORl9ICisjZGVmaW5lIEFORFJPSURfQVVESU9fUE9MSUNZX0NPTkZfSAorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgICAgRGVmaW5pdGlvbnMgZm9yIGF1ZGlvIHBvbGljeSBjb25maWd1cmF0aW9uIGZpbGUgKGF1ZGlvX3BvbGljeS5jb25mKQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjZGVmaW5lIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NQVhfTEVOIDMyCisKKyNkZWZpbmUgQVVESU9fUE9MSUNZX0NPTkZJR19GSUxFICIvc3lzdGVtL2V0Yy9hdWRpb19wb2xpY3kuY29uZiIKKyNkZWZpbmUgQVVESU9fUE9MSUNZX1ZFTkRPUl9DT05GSUdfRklMRSAiL3ZlbmRvci9ldGMvYXVkaW9fcG9saWN5LmNvbmYiCisKKy8vIGdsb2JhbCBjb25maWd1cmF0aW9uCisjZGVmaW5lIEdMT0JBTF9DT05GSUdfVEFHICJnbG9iYWxfY29uZmlndXJhdGlvbiIKKworI2RlZmluZSBBVFRBQ0hFRF9PVVRQVVRfREVWSUNFU19UQUcgImF0dGFjaGVkX291dHB1dF9kZXZpY2VzIgorI2RlZmluZSBERUZBVUxUX09VVFBVVF9ERVZJQ0VfVEFHICJkZWZhdWx0X291dHB1dF9kZXZpY2UiCisjZGVmaW5lIEFUVEFDSEVEX0lOUFVUX0RFVklDRVNfVEFHICJhdHRhY2hlZF9pbnB1dF9kZXZpY2VzIgorI2RlZmluZSBTUEVBS0VSX0RSQ19FTkFCTEVEX1RBRyAic3BlYWtlcl9kcmNfZW5hYmxlZCIKKyNkZWZpbmUgQVVESU9fSEFMX1ZFUlNJT05fVEFHICJhdWRpb19oYWxfdmVyc2lvbiIKKworLy8gaHcgbW9kdWxlcyBkZXNjcmlwdGlvbnMKKyNkZWZpbmUgQVVESU9fSFdfTU9EVUxFX1RBRyAiYXVkaW9faHdfbW9kdWxlcyIKKworI2RlZmluZSBPVVRQVVRTX1RBRyAib3V0cHV0cyIKKyNkZWZpbmUgSU5QVVRTX1RBRyAiaW5wdXRzIgorCisjZGVmaW5lIFNBTVBMSU5HX1JBVEVTX1RBRyAic2FtcGxpbmdfcmF0ZXMiCisjZGVmaW5lIEZPUk1BVFNfVEFHICJmb3JtYXRzIgorI2RlZmluZSBDSEFOTkVMU19UQUcgImNoYW5uZWxfbWFza3MiCisjZGVmaW5lIERFVklDRVNfVEFHICJkZXZpY2VzIgorI2RlZmluZSBGTEFHU19UQUcgImZsYWdzIgorCisjZGVmaW5lIERZTkFNSUNfVkFMVUVfVEFHICJkeW5hbWljIiAvLyBzcGVjaWFsIHZhbHVlIGZvciAiY2hhbm5lbF9tYXNrcyIsICJzYW1wbGluZ19yYXRlcyIgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAiZm9ybWF0cyIgaW4gb3V0cHV0cyBkZXNjcmlwdG9ycyBpbmRpY2F0aW5nIHRoYXQgc3VwcG9ydGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZXMgc2hvdWxkIGJlIHF1ZXJpZWQgYWZ0ZXIgb3BlbmluZyB0aGUgb3V0cHV0LgorCisjZGVmaW5lIERFVklDRVNfVEFHICJkZXZpY2VzIgorI2RlZmluZSBERVZJQ0VfVFlQRSAidHlwZSIKKyNkZWZpbmUgREVWSUNFX0FERFJFU1MgImFkZHJlc3MiCisKKyNkZWZpbmUgTUlYRVJTX1RBRyAibWl4ZXJzIgorI2RlZmluZSBNSVhFUl9UWVBFICJ0eXBlIgorI2RlZmluZSBNSVhFUl9UWVBFX01VWCAibXV4IgorI2RlZmluZSBNSVhFUl9UWVBFX01JWCAibWl4IgorCisjZGVmaW5lIEdBSU5TX1RBRyAiZ2FpbnMiCisjZGVmaW5lIEdBSU5fTU9ERSAibW9kZSIKKyNkZWZpbmUgR0FJTl9DSEFOTkVMUyAiY2hhbm5lbF9tYXNrIgorI2RlZmluZSBHQUlOX01JTl9WQUxVRSAibWluX3ZhbHVlX21CIgorI2RlZmluZSBHQUlOX01BWF9WQUxVRSAibWF4X3ZhbHVlX21CIgorI2RlZmluZSBHQUlOX0RFRkFVTFRfVkFMVUUgImRlZmF1bHRfdmFsdWVfbUIiCisjZGVmaW5lIEdBSU5fU1RFUF9WQUxVRSAic3RlcF92YWx1ZV9tQiIKKyNkZWZpbmUgR0FJTl9NSU5fUkFNUF9NUyAibWluX3JhbXBfbXMiCisjZGVmaW5lIEdBSU5fTUFYX1JBTVBfTVMgIm1heF9yYW1wX21zIgorCisKKworI2VuZGlmICAvLyBBTkRST0lEX0FVRElPX1BPTElDWV9DT05GX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rCmluZGV4IDUxYmE2OTguLmUxODRkOTcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5tawpAQCAtMSwzICsxLDE3IEBACisjIENvcHlyaWdodCAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKIExPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQogCiAjCkBAIC0yMCw2ICszNCw3IEBACiAgICAgYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwIFwKICAgICBhcGkxL2NsaWVudDIvQ2FsbGJhY2tQcm9jZXNzb3IuY3BwIFwKICAgICBhcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmNwcCBcCisgICAgYXBpMS9jbGllbnQyL1pzbFByb2Nlc3NvckludGVyZmFjZS5jcHAgXAogICAgIGFwaTEvY2xpZW50Mi9CdXJzdENhcHR1cmUuY3BwIFwKICAgICBhcGkxL2NsaWVudDIvSnBlZ0NvbXByZXNzb3IuY3BwIFwKICAgICBhcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5jcHAgXApAQCAtMzMsNiArNDgsNyBAQAogICAgIGRldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcCBcCiAgICAgZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcCBcCiAgICAgZGV2aWNlMy9DYW1lcmEzWnNsU3RyZWFtLmNwcCBcCisgICAgZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uY3BwIFwKICAgICBkZXZpY2UzL1N0YXR1c1RyYWNrZXIuY3BwIFwKICAgICBndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmNwcCBcCiAgICAgdXRpbHMvQ2FtZXJhVHJhY2VzLmNwcCBcCkBAIC01Myw2ICs2OSw3IEBACiAKIExPQ0FMX0NfSU5DTFVERVMgKz0gXAogICAgIHN5c3RlbS9tZWRpYS9jYW1lcmEvaW5jbHVkZSBcCisgICAgc3lzdGVtL21lZGlhL3ByaXZhdGUvY2FtZXJhL2luY2x1ZGUgXAogICAgIGV4dGVybmFsL2pwZWcKIAogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFEZXZpY2VGYWN0b3J5LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYURldmljZUZhY3RvcnkuY3BwCmluZGV4IDdmZGYzMDQuLmJmZWY1MGUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYURldmljZUZhY3RvcnkuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYURldmljZUZhY3RvcnkuY3BwCkBAIC00Niw2ICs0Niw4IEBACiAgICAgICAgICAgICBkZXZpY2UgPSBuZXcgQ2FtZXJhMkRldmljZShjYW1lcmFJZCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMDoKKyAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMToKKyAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMjoKICAgICAgICAgICAgIGRldmljZSA9IG5ldyBDYW1lcmEzRGV2aWNlKGNhbWVyYUlkKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcAppbmRleCA0ZTNiYjE5Li5hODI3ZTA3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcApAQCAtMSwyNCArMSwyNCBAQAogLyoKLSoqCi0qKiBDb3B5cmlnaHQgKEMpIDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwogCiAjZGVmaW5lIExPR19UQUcgIkNhbWVyYVNlcnZpY2UiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKICNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHB0aHJlYWQuaD4KIApAQCAtMzIsMTAgKzMyLDE1IEBACiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KICNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllci5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vY2FtZXJhX3ZlbmRvcl90YWdzLmg+CisjaW5jbHVkZSA8c3lzdGVtL2NhbWVyYV9tZXRhZGF0YS5oPgorI2luY2x1ZGUgPHN5c3RlbS9jYW1lcmEuaD4KIAogI2luY2x1ZGUgIkNhbWVyYVNlcnZpY2UuaCIKICNpbmNsdWRlICJhcGkxL0NhbWVyYUNsaWVudC5oIgpAQCAtMTMwLDYgKzEzNSwxMiBAQAogICAgICAgICAgICAgbU1vZHVsZS0+c2V0X2NhbGxiYWNrcyh0aGlzKTsKICAgICAgICAgfQogCisgICAgICAgIFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNsZWFyR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvcigpOworCisgICAgICAgIGlmIChtTW9kdWxlLT5jb21tb24ubW9kdWxlX2FwaV92ZXJzaW9uID49IENBTUVSQV9NT0RVTEVfQVBJX1ZFUlNJT05fMl8yKSB7CisgICAgICAgICAgICBzZXRVcFZlbmRvclRhZ3MoKTsKKyAgICAgICAgfQorCiAgICAgICAgIENhbWVyYURldmljZUZhY3Rvcnk6OnJlZ2lzdGVyU2VydmljZSh0aGlzKTsKICAgICB9CiB9CkBAIC0xNDEsNiArMTUyLDcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNsZWFyR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvcigpOwogICAgIGdDYW1lcmFTZXJ2aWNlID0gTlVMTDsKIH0KIApAQCAtMTY4LDYgKzE4MCw5IEBACiAgICAgICAgIHsKICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1TZXJ2aWNlTG9jayk7CiAKKyAgICAgICAgICAgLyogUmVtb3ZlIGNhY2hlZCBwYXJhbWV0ZXJzIGZyb20gc2hpbSBjYWNoZSAqLworICAgICAgICAgICBtU2hpbVBhcmFtcy5yZW1vdmVJdGVtKGNhbWVyYUlkKTsKKwogICAgICAgICAgICAvKiBGaW5kIGFsbCBjbGllbnRzIHRoYXQgd2UgbmVlZCB0byBkaXNjb25uZWN0ICovCiAgICAgICAgICAgIHNwPEJhc2ljQ2xpZW50PiBjbGllbnQgPSBtQ2xpZW50W2NhbWVyYUlkXS5wcm9tb3RlKCk7CiAgICAgICAgICAgIGlmIChjbGllbnQuZ2V0KCkgIT0gTlVMTCkgewpAQCAtMTk2LDcgKzIxMSw3IEBACiAgICAgICAgICAgICAgKi8KICAgICAgICAgfQogCi0gICAgICAgIEFMT0dWKCIlczogQWZ0ZXIgdW5wbHVnLCBkaXNjb25uZWN0ZWQgJWQgY2xpZW50cyIsCisgICAgICAgIEFMT0dWKCIlczogQWZ0ZXIgdW5wbHVnLCBkaXNjb25uZWN0ZWQgJXp1IGNsaWVudHMiLAogICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNsaWVudHNUb0Rpc2Nvbm5lY3Quc2l6ZSgpKTsKICAgICB9CiAKQEAgLTIyMCwxMiArMjM1LDk5IEBACiAgICAgfQogCiAgICAgc3RydWN0IGNhbWVyYV9pbmZvIGluZm87Ci0gICAgc3RhdHVzX3QgcmMgPSBtTW9kdWxlLT5nZXRfY2FtZXJhX2luZm8oY2FtZXJhSWQsICZpbmZvKTsKKyAgICBzdGF0dXNfdCByYyA9IGZpbHRlckdldEluZm9FcnJvckNvZGUoCisgICAgICAgIG1Nb2R1bGUtPmdldF9jYW1lcmFfaW5mbyhjYW1lcmFJZCwgJmluZm8pKTsKICAgICBjYW1lcmFJbmZvLT5mYWNpbmcgPSBpbmZvLmZhY2luZzsKICAgICBjYW1lcmFJbmZvLT5vcmllbnRhdGlvbiA9IGluZm8ub3JpZW50YXRpb247CiAgICAgcmV0dXJuIHJjOwogfQogCisKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OmdlbmVyYXRlU2hpbU1ldGFkYXRhKGludCBjYW1lcmFJZCwgLypvdXQqL0NhbWVyYU1ldGFkYXRhKiBjYW1lcmFJbmZvKSB7CisgICAgc3RhdHVzX3QgcmV0ID0gT0s7CisgICAgc3RydWN0IENhbWVyYUluZm8gaW5mbzsKKyAgICBpZiAoKHJldCA9IGdldENhbWVyYUluZm8oY2FtZXJhSWQsICZpbmZvKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBDYW1lcmFNZXRhZGF0YSBzaGltSW5mbzsKKyAgICBpbnQzMl90IG9yaWVudGF0aW9uID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oaW5mby5vcmllbnRhdGlvbik7CisgICAgaWYgKChyZXQgPSBzaGltSW5mby51cGRhdGUoQU5EUk9JRF9TRU5TT1JfT1JJRU5UQVRJT04sICZvcmllbnRhdGlvbiwgMSkpICE9IE9LKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgdWludDhfdCBmYWNpbmcgPSAoaW5mby5mYWNpbmcgPT0gQ0FNRVJBX0ZBQ0lOR19GUk9OVCkgPworICAgICAgICAgICAgQU5EUk9JRF9MRU5TX0ZBQ0lOR19GUk9OVCA6IEFORFJPSURfTEVOU19GQUNJTkdfQkFDSzsKKyAgICBpZiAoKHJldCA9IHNoaW1JbmZvLnVwZGF0ZShBTkRST0lEX0xFTlNfRkFDSU5HLCAmZmFjaW5nLCAxKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBDYW1lcmFQYXJhbWV0ZXJzIHNoaW1QYXJhbXM7CisgICAgaWYgKChyZXQgPSBnZXRMZWdhY3lQYXJhbWV0ZXJzTGF6eShjYW1lcmFJZCwgLypvdXQqLyZzaGltUGFyYW1zKSkgIT0gT0spIHsKKyAgICAgICAgLy8gRXJyb3IgbG9nZ2VkIGJ5IGNhbGxlZQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIFZlY3RvcjxTaXplPiBzaXplczsKKyAgICBWZWN0b3I8U2l6ZT4ganBlZ1NpemVzOworICAgIFZlY3RvcjxpbnQzMl90PiBmb3JtYXRzOworICAgIGNvbnN0IGNoYXIqIHN1cHBvcnRlZFByZXZpZXdGb3JtYXRzOworICAgIHsKKyAgICAgICAgc2hpbVBhcmFtcy5nZXRTdXBwb3J0ZWRQcmV2aWV3U2l6ZXMoLypvdXQqL3NpemVzKTsKKyAgICAgICAgc2hpbVBhcmFtcy5nZXRTdXBwb3J0ZWRQcmV2aWV3Rm9ybWF0cygvKm91dCovZm9ybWF0cyk7CisgICAgICAgIHNoaW1QYXJhbXMuZ2V0U3VwcG9ydGVkUGljdHVyZVNpemVzKC8qb3V0Ki9qcGVnU2l6ZXMpOworICAgIH0KKworICAgIC8vIEFsd2F5cyBpbmNsdWRlIElNUExFTUVOVEFUSU9OX0RFRklORUQKKyAgICBmb3JtYXRzLmFkZChIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQpOworCisgICAgY29uc3Qgc2l6ZV90IElOVFNfUEVSX0NPTkZJRyA9IDQ7CisKKyAgICAvLyBCdWlsZCBhdmFpbGFibGUgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIG1ldGFkYXRhCisgICAgc2l6ZV90IHN0cmVhbUNvbmZpZ1NpemUgPSAoc2l6ZXMuc2l6ZSgpICogZm9ybWF0cy5zaXplKCkgKyBqcGVnU2l6ZXMuc2l6ZSgpKSAqIElOVFNfUEVSX0NPTkZJRzsKKworICAgIFZlY3RvcjxpbnQzMl90PiBzdHJlYW1Db25maWdzOworICAgIHN0cmVhbUNvbmZpZ3Muc2V0Q2FwYWNpdHkoc3RyZWFtQ29uZmlnU2l6ZSk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZvcm1hdHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzaXplcy5zaXplKCk7ICsraikgeworICAgICAgICAgICAgc3RyZWFtQ29uZmlncy5hZGQoZm9ybWF0c1tpXSk7CisgICAgICAgICAgICBzdHJlYW1Db25maWdzLmFkZChzaXplc1tqXS53aWR0aCk7CisgICAgICAgICAgICBzdHJlYW1Db25maWdzLmFkZChzaXplc1tqXS5oZWlnaHQpOworICAgICAgICAgICAgc3RyZWFtQ29uZmlncy5hZGQoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OU19PVVRQVVQpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBqcGVnU2l6ZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgc3RyZWFtQ29uZmlncy5hZGQoSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKTsKKyAgICAgICAgc3RyZWFtQ29uZmlncy5hZGQoanBlZ1NpemVzW2ldLndpZHRoKTsKKyAgICAgICAgc3RyZWFtQ29uZmlncy5hZGQoanBlZ1NpemVzW2ldLmhlaWdodCk7CisgICAgICAgIHN0cmVhbUNvbmZpZ3MuYWRkKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlNfT1VUUFVUKTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IHNoaW1JbmZvLnVwZGF0ZShBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TLAorICAgICAgICAgICAgc3RyZWFtQ29uZmlncy5hcnJheSgpLCBzdHJlYW1Db25maWdTaXplKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpbnQ2NF90IGZha2VNaW5GcmFtZXNbMF07CisgICAgLy8gVE9ETzogRml4bWUsIGRvbid0IGZha2UgbWluIGZyYW1lIGR1cmF0aW9ucy4KKyAgICBpZiAoKHJldCA9IHNoaW1JbmZvLnVwZGF0ZShBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfTUlOX0ZSQU1FX0RVUkFUSU9OUywKKyAgICAgICAgICAgIGZha2VNaW5GcmFtZXMsIDApKSAhPSBPSykgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGludDY0X3QgZmFrZVN0YWxsc1swXTsKKyAgICAvLyBUT0RPOiBGaXhtZSwgZG9uJ3QgZmFrZSBzdGFsbCBkdXJhdGlvbnMuCisgICAgaWYgKChyZXQgPSBzaGltSW5mby51cGRhdGUoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUQUxMX0RVUkFUSU9OUywKKyAgICAgICAgICAgIGZha2VTdGFsbHMsIDApKSAhPSBPSykgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgICpjYW1lcmFJbmZvID0gc2hpbUluZm87CisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoaW50IGNhbWVyYUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEqIGNhbWVyYUluZm8pIHsKICAgICBpZiAoIWNhbWVyYUluZm8pIHsKQEAgLTIzOCwzNyArMzQwLDUxIEBACiAgICAgICAgIHJldHVybiAtRU5PREVWOwogICAgIH0KIAotICAgIGlmIChtTW9kdWxlLT5jb21tb24ubW9kdWxlX2FwaV92ZXJzaW9uIDwgQ0FNRVJBX01PRFVMRV9BUElfVkVSU0lPTl8yXzApIHsKLSAgICAgICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgY2hlY2sgb25jZSBIQUwxIHNoaW0gaXMgaW4gcGxhY2UuCi0gICAgICAgIEFMT0dFKCIlczogT25seSBIQUwgbW9kdWxlIHZlcnNpb24gVjIgb3IgaGlnaGVyIHN1cHBvcnRzIHN0YXRpYyBtZXRhZGF0YSIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCiAgICAgaWYgKGNhbWVyYUlkIDwgMCB8fCBjYW1lcmFJZCA+PSBtTnVtYmVyT2ZDYW1lcmFzKSB7CiAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBjYW1lcmEgaWQ6ICVkIiwgX19GVU5DVElPTl9fLCBjYW1lcmFJZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgaW50IGZhY2luZzsKLSAgICBpZiAoZ2V0RGV2aWNlVmVyc2lvbihjYW1lcmFJZCwgJmZhY2luZykgPT0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzApIHsKLSAgICAgICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgY2hlY2sgb25jZSBIQUwxIHNoaW0gaXMgaW4gcGxhY2UuCi0gICAgICAgIEFMT0dFKCIlczogSEFMMSBkb2Vzbid0IHN1cHBvcnQgc3RhdGljIG1ldGFkYXRhIHlldCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQorICAgIHN0YXR1c190IHJldCA9IE9LOworICAgIGlmIChtTW9kdWxlLT5jb21tb24ubW9kdWxlX2FwaV92ZXJzaW9uIDwgQ0FNRVJBX01PRFVMRV9BUElfVkVSU0lPTl8yXzAgfHwKKyAgICAgICAgICAgIGdldERldmljZVZlcnNpb24oY2FtZXJhSWQsICZmYWNpbmcpIDw9IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8xICkgeworICAgICAgICAvKioKKyAgICAgICAgICogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgbW9kZSBmb3Igb2xkIEhBTHM6CisgICAgICAgICAqIC0gQ29udmVydCBDYW1lcmFJbmZvIGludG8gc3RhdGljIENhbWVyYU1ldGFkYXRhIHByb3BlcnRpZXMuCisgICAgICAgICAqIC0gUmV0cmlldmUgY2FjaGVkIENhbWVyYVBhcmFtZXRlcnMgZm9yIHRoaXMgY2FtZXJhLiAgSWYgbm9uZSBleGlzdCwKKyAgICAgICAgICogICBhdHRlbXB0IHRvIG9wZW4gQ2FtZXJhQ2xpZW50IGFuZCByZXRyaWV2ZSB0aGUgQ2FtZXJhUGFyYW1ldGVycy4KKyAgICAgICAgICogLSBDb252ZXJ0IGNhY2hlZCBDYW1lcmFQYXJhbWV0ZXJzIGludG8gc3RhdGljIENhbWVyYU1ldGFkYXRhCisgICAgICAgICAqICAgcHJvcGVydGllcy4KKyAgICAgICAgICovCisgICAgICAgIEFMT0dJKCIlczogU3dpdGNoaW5nIHRvIEhBTDEgc2hpbSBpbXBsZW1lbnRhdGlvbi4uLiIsIF9fRlVOQ1RJT05fXyk7CiAKLSAgICBpZiAoZ2V0RGV2aWNlVmVyc2lvbihjYW1lcmFJZCwgJmZhY2luZykgPD0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8yXzEpIHsKLSAgICAgICAgLy8gRGlzYWJsZSBIQUwyLnggc3VwcG9ydCBmb3IgY2FtZXJhMiBBUEkgZm9yIG5vdy4KLSAgICAgICAgQUxPR1coIiVzOiBIQUwyLnggZG9lc24ndCBzdXBwb3J0IGdldENhbWVyYUNoYXJhY3RlcmlzdGljcyBmb3Igbm93IiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9CisgICAgICAgIGlmICgocmV0ID0gZ2VuZXJhdGVTaGltTWV0YWRhdGEoY2FtZXJhSWQsIGNhbWVyYUluZm8pKSAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQogCi0gICAgc3RydWN0IGNhbWVyYV9pbmZvIGluZm87Ci0gICAgc3RhdHVzX3QgcmV0ID0gbU1vZHVsZS0+Z2V0X2NhbWVyYV9pbmZvKGNhbWVyYUlkLCAmaW5mbyk7Ci0gICAgKmNhbWVyYUluZm8gPSBpbmZvLnN0YXRpY19jYW1lcmFfY2hhcmFjdGVyaXN0aWNzOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBOb3JtYWwgSEFMIDIuMSsgY29kZXBhdGguCisgICAgICAgICAqLworICAgICAgICBzdHJ1Y3QgY2FtZXJhX2luZm8gaW5mbzsKKyAgICAgICAgcmV0ID0gZmlsdGVyR2V0SW5mb0Vycm9yQ29kZShtTW9kdWxlLT5nZXRfY2FtZXJhX2luZm8oY2FtZXJhSWQsICZpbmZvKSk7CisgICAgICAgICpjYW1lcmFJbmZvID0gaW5mby5zdGF0aWNfY2FtZXJhX2NoYXJhY3RlcmlzdGljczsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0OwogfQogCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpnZXRDYW1lcmFWZW5kb3JUYWdEZXNjcmlwdG9yKC8qb3V0Ki9zcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiYgZGVzYykgeworICAgIGlmICghbU1vZHVsZSkgeworICAgICAgICBBTE9HRSgiJXM6IGNhbWVyYSBoYXJkd2FyZSBtb2R1bGUgZG9lc24ndCBleGlzdCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiAtRU5PREVWOworICAgIH0KKworICAgIGRlc2MgPSBWZW5kb3JUYWdEZXNjcmlwdG9yOjpnZXRHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKCk7CisgICAgcmV0dXJuIE9LOworfQorCiBpbnQgQ2FtZXJhU2VydmljZTo6Z2V0RGV2aWNlVmVyc2lvbihpbnQgY2FtZXJhSWQsIGludCogZmFjaW5nKSB7CiAgICAgc3RydWN0IGNhbWVyYV9pbmZvIGluZm87CiAgICAgaWYgKG1Nb2R1bGUtPmdldF9jYW1lcmFfaW5mbyhjYW1lcmFJZCwgJmluZm8pICE9IE9LKSB7CkBAIC0yODksMjEgKzQwNSwxNjIgQEAKICAgICByZXR1cm4gZGV2aWNlVmVyc2lvbjsKIH0KIAotYm9vbCBDYW1lcmFTZXJ2aWNlOjppc1ZhbGlkQ2FtZXJhSWQoaW50IGNhbWVyYUlkKSB7Ci0gICAgaW50IGZhY2luZzsKLSAgICBpbnQgZGV2aWNlVmVyc2lvbiA9IGdldERldmljZVZlcnNpb24oY2FtZXJhSWQsICZmYWNpbmcpOworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6ZmlsdGVyT3BlbkVycm9yQ29kZShzdGF0dXNfdCBlcnIpIHsKKyAgICBzd2l0Y2goZXJyKSB7CisgICAgICAgIGNhc2UgTk9fRVJST1I6CisgICAgICAgIGNhc2UgLUVCVVNZOgorICAgICAgICBjYXNlIC1FSU5WQUw6CisgICAgICAgIGNhc2UgLUVVU0VSUzoKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIC1FTk9ERVY7Cit9CiAKLSAgICBzd2l0Y2goZGV2aWNlVmVyc2lvbikgewotICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMDoKLSAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8yXzA6Ci0gICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8xOgotICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMDoKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBkZWZhdWx0Ogorc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6ZmlsdGVyR2V0SW5mb0Vycm9yQ29kZShzdGF0dXNfdCBlcnIpIHsKKyAgICBzd2l0Y2goZXJyKSB7CisgICAgICAgIGNhc2UgTk9fRVJST1I6CisgICAgICAgIGNhc2UgLUVJTlZBTDoKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIC1FTk9ERVY7Cit9CisKK2Jvb2wgQ2FtZXJhU2VydmljZTo6c2V0VXBWZW5kb3JUYWdzKCkgeworICAgIHZlbmRvcl90YWdfb3BzX3Qgdk9wcyA9IHZlbmRvcl90YWdfb3BzX3QoKTsKKworICAgIC8vIENoZWNrIGlmIHZlbmRvciBvcGVyYXRpb25zIGhhdmUgYmVlbiBpbXBsZW1lbnRlZAorICAgIGlmIChtTW9kdWxlLT5nZXRfdmVuZG9yX3RhZ19vcHMgPT0gTlVMTCkgeworICAgICAgICBBTE9HSSgiJXM6IE5vIHZlbmRvciB0YWdzIGRlZmluZWQgZm9yIHRoaXMgZGV2aWNlLiIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICByZXR1cm4gZmFsc2U7CisgICAgQVRSQUNFX0JFR0lOKCJjYW1lcmEzLT5nZXRfbWV0YWRhdGFfdmVuZG9yX3RhZ19vcHMiKTsKKyAgICBtTW9kdWxlLT5nZXRfdmVuZG9yX3RhZ19vcHMoJnZPcHMpOworICAgIEFUUkFDRV9FTkQoKTsKKworICAgIC8vIEVuc3VyZSBhbGwgdmVuZG9yIG9wZXJhdGlvbnMgYXJlIHByZXNlbnQKKyAgICBpZiAodk9wcy5nZXRfdGFnX2NvdW50ID09IE5VTEwgfHwgdk9wcy5nZXRfYWxsX3RhZ3MgPT0gTlVMTCB8fAorICAgICAgICAgICAgdk9wcy5nZXRfc2VjdGlvbl9uYW1lID09IE5VTEwgfHwgdk9wcy5nZXRfdGFnX25hbWUgPT0gTlVMTCB8fAorICAgICAgICAgICAgdk9wcy5nZXRfdGFnX3R5cGUgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IFZlbmRvciB0YWcgb3BlcmF0aW9ucyBub3QgZnVsbHkgZGVmaW5lZC4gSWdub3JpbmcgZGVmaW5pdGlvbnMuIgorICAgICAgICAgICAgICAgLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gUmVhZCBhbGwgdmVuZG9yIHRhZyBkZWZpbml0aW9ucyBpbnRvIGEgZGVzY3JpcHRvcgorICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IGRlc2M7CisgICAgc3RhdHVzX3QgcmVzOworICAgIGlmICgocmVzID0gVmVuZG9yVGFnRGVzY3JpcHRvcjo6Y3JlYXRlRGVzY3JpcHRvckZyb21PcHMoJnZPcHMsIC8qb3V0Ki9kZXNjKSkKKyAgICAgICAgICAgICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IGdlbmVyYXRlIGRlc2NyaXB0b3IgZnJvbSB2ZW5kb3IgdGFnIG9wZXJhdGlvbnMsIgorICAgICAgICAgICAgICAicmVjZWl2ZWQgZXJyb3IgJXMgKCVkKS4gQ2FtZXJhIGNsaWVudHMgd2lsbCBub3QgYmUgYWJsZSB0byB1c2UiCisgICAgICAgICAgICAgICJ2ZW5kb3IgdGFncyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IocmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFNldCB0aGUgZ2xvYmFsIGRlc2NyaXB0b3IgdG8gdXNlIHdpdGggY2FtZXJhIG1ldGFkYXRhCisgICAgVmVuZG9yVGFnRGVzY3JpcHRvcjo6c2V0QXNHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKGRlc2MpOworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjppbml0aWFsaXplU2hpbU1ldGFkYXRhKGludCBjYW1lcmFJZCkgeworICAgIGludCBwaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IHVpZCA9IGdldENhbGxpbmdVaWQoKTsKKyAgICBzdGF0dXNfdCByZXQgPSB2YWxpZGF0ZUNvbm5lY3QoY2FtZXJhSWQsIHVpZCk7CisgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICAvLyBFcnJvciBhbHJlYWR5IGxvZ2dlZCBieSBjYWxsZWUKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBib29sIG5lZWRzTmV3Q2xpZW50ID0gZmFsc2U7CisgICAgc3A8Q2xpZW50PiBjbGllbnQ7CisKKyAgICBTdHJpbmcxNiBpbnRlcm5hbFBhY2thZ2VOYW1lKCJtZWRpYSIpOworICAgIHsgICAvLyBTY29wZSBmb3Igc2VydmljZSBsb2NrCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXJ2aWNlTG9jayk7CisgICAgICAgIGlmIChtQ2xpZW50W2NhbWVyYUlkXSAhPSBOVUxMKSB7CisgICAgICAgICAgICBjbGllbnQgPSBzdGF0aWNfY2FzdDxDbGllbnQqPihtQ2xpZW50W2NhbWVyYUlkXS5wcm9tb3RlKCkuZ2V0KCkpOworICAgICAgICB9CisgICAgICAgIGlmIChjbGllbnQgPT0gTlVMTCkgeworICAgICAgICAgICAgbmVlZHNOZXdDbGllbnQgPSB0cnVlOworICAgICAgICAgICAgcmV0ID0gY29ubmVjdEhlbHBlckxvY2tlZCgvKm91dCovY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmNhbWVyYUNsaWVudCovTlVMTCwgLy8gRW1wdHkgYmluZGVyIGNhbGxiYWNrcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWQpOworCisgICAgICAgICAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgICAgICAgICAgLy8gRXJyb3IgYWxyZWFkeSBsb2dnZWQgYnkgY2FsbGVlCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChjbGllbnQgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgY29ubmVjdCB0byBjbGllbnQgY2FtZXJhIGRldmljZS4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZzggcmF3UGFyYW1zID0gY2xpZW50LT5nZXRQYXJhbWV0ZXJzKCk7CisgICAgICAgIENhbWVyYVBhcmFtZXRlcnMgcGFyYW1zKHJhd1BhcmFtcyk7CisgICAgICAgIG1TaGltUGFyYW1zLmFkZChjYW1lcmFJZCwgcGFyYW1zKTsKKyAgICB9CisKKyAgICAvLyBDbG9zZSBjbGllbnQgaWYgb25lIHdhcyBvcGVuZWQgc29sZWx5IGZvciB0aGlzIGNhbGwKKyAgICBpZiAobmVlZHNOZXdDbGllbnQpIHsKKyAgICAgICAgY2xpZW50LT5kaXNjb25uZWN0KCk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Z2V0TGVnYWN5UGFyYW1ldGVyc0xhenkoaW50IGNhbWVyYUlkLAorICAgICAgICAvKm91dCovCisgICAgICAgIENhbWVyYVBhcmFtZXRlcnMqIHBhcmFtZXRlcnMpIHsKKworICAgIEFMT0dWKCIlczogZm9yIGNhbWVyYUlkOiAlZCIsIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQpOworCisgICAgc3RhdHVzX3QgcmV0ID0gMDsKKworICAgIGlmIChwYXJhbWV0ZXJzID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBwYXJhbWV0ZXJzIG11c3Qgbm90IGJlIG51bGwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNzaXplX3QgaW5kZXggPSAtMTsKKyAgICB7ICAgLy8gU2NvcGUgZm9yIHNlcnZpY2UgbG9jaworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VydmljZUxvY2spOworICAgICAgICBpbmRleCA9IG1TaGltUGFyYW1zLmluZGV4T2ZLZXkoY2FtZXJhSWQpOworICAgICAgICAvLyBSZWxlYXNlIHNlcnZpY2UgbG9jayBzbyBpbml0aWFsaXplU2hpbU1ldGFkYXRhIGNhbiBiZSBjYWxsZWQgY29ycmVjdGx5LgorCisgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAqcGFyYW1ldGVycyA9IG1TaGltUGFyYW1zW2luZGV4XTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgIHJldCA9IGluaXRpYWxpemVTaGltTWV0YWRhdGEoY2FtZXJhSWQpOworICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKyAgICAgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICAgICAgLy8gRXJyb3IgYWxyZWFkeSBsb2dnZWQgYnkgY2FsbGVlCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgeyAgIC8vIFNjb3BlIGZvciBzZXJ2aWNlIGxvY2sKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXJ2aWNlTG9jayk7CisgICAgICAgICAgICBpbmRleCA9IG1TaGltUGFyYW1zLmluZGV4T2ZLZXkoY2FtZXJhSWQpOworCisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGluZGV4IDwgMCwgImluZGV4IHNob3VsZCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQiKTsKKworICAgICAgICAgICAgKnBhcmFtZXRlcnMgPSBtU2hpbVBhcmFtc1tpbmRleF07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OnZhbGlkYXRlQ29ubmVjdChpbnQgY2FtZXJhSWQsCkBAIC00MDIsNiArNjU5LDc3IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OmNvbm5lY3RIZWxwZXJMb2NrZWQoCisgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgc3A8Q2xpZW50PiYgY2xpZW50LAorICAgICAgICAvKmluKi8KKyAgICAgICAgY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCwKKyAgICAgICAgaW50IGNhbWVyYUlkLAorICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCisgICAgICAgIGludCBjbGllbnRVaWQsCisgICAgICAgIGludCBjYWxsaW5nUGlkLAorICAgICAgICBpbnQgaGFsVmVyc2lvbiwKKyAgICAgICAgYm9vbCBsZWdhY3lNb2RlKSB7CisKKyAgICBpbnQgZmFjaW5nID0gLTE7CisgICAgaW50IGRldmljZVZlcnNpb24gPSBnZXREZXZpY2VWZXJzaW9uKGNhbWVyYUlkLCAmZmFjaW5nKTsKKworICAgIGlmIChoYWxWZXJzaW9uIDwgMCB8fCBoYWxWZXJzaW9uID09IGRldmljZVZlcnNpb24pIHsKKyAgICAgICAgLy8gRGVmYXVsdCBwYXRoOiBIQUwgdmVyc2lvbiBpcyB1bnNwZWNpZmllZCBieSBjYWxsZXIsIGNyZWF0ZSBDYW1lcmFDbGllbnQKKyAgICAgICAgLy8gYmFzZWQgb24gZGV2aWNlIHZlcnNpb24gcmVwb3J0ZWQgYnkgdGhlIEhBTC4KKyAgICAgICAgc3dpdGNoKGRldmljZVZlcnNpb24pIHsKKyAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wOgorICAgICAgICAgICAgY2xpZW50ID0gbmV3IENhbWVyYUNsaWVudCh0aGlzLCBjYW1lcmFDbGllbnQsCisgICAgICAgICAgICAgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lLCBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgZmFjaW5nLCBjYWxsaW5nUGlkLCBjbGllbnRVaWQsIGdldHBpZCgpLCBsZWdhY3lNb2RlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8yXzA6CisgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMToKKyAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOgorICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzE6CisgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMjoKKyAgICAgICAgICAgIGNsaWVudCA9IG5ldyBDYW1lcmEyQ2xpZW50KHRoaXMsIGNhbWVyYUNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50UGFja2FnZU5hbWUsIGNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICBmYWNpbmcsIGNhbGxpbmdQaWQsIGNsaWVudFVpZCwgZ2V0cGlkKCksIGxlZ2FjeU1vZGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAtMToKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGNhbWVyYSBpZCAlZCIsIGNhbWVyYUlkKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJVbmtub3duIGNhbWVyYSBkZXZpY2UgSEFMIHZlcnNpb246ICVkIiwgZGV2aWNlVmVyc2lvbik7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBBIHBhcnRpY3VsYXIgSEFMIHZlcnNpb24gaXMgcmVxdWVzdGVkIGJ5IGNhbGxlci4gQ3JlYXRlIENhbWVyYUNsaWVudAorICAgICAgICAvLyBiYXNlZCBvbiB0aGUgcmVxdWVzdGVkIEhBTCB2ZXJzaW9uLgorICAgICAgICBpZiAoZGV2aWNlVmVyc2lvbiA+IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wICYmCisgICAgICAgICAgICBoYWxWZXJzaW9uID09IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wKSB7CisgICAgICAgICAgICAvLyBPbmx5IHN1cHBvcnQgaGlnaGVyIEhBTCB2ZXJzaW9uIGRldmljZSBvcGVuZWQgYXMgSEFMMS4wIGRldmljZS4KKyAgICAgICAgICAgIGNsaWVudCA9IG5ldyBDYW1lcmFDbGllbnQodGhpcywgY2FtZXJhQ2xpZW50LAorICAgICAgICAgICAgICAgICAgICBjbGllbnRQYWNrYWdlTmFtZSwgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgIGZhY2luZywgY2FsbGluZ1BpZCwgY2xpZW50VWlkLCBnZXRwaWQoKSwgbGVnYWN5TW9kZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBPdGhlciBjb21iaW5hdGlvbnMgKGUuZy4gSEFMMy54IG9wZW4gYXMgSEFMMi54KSBhcmUgbm90IHN1cHBvcnRlZCB5ZXQuCisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBjYW1lcmEgSEFMIHZlcnNpb24gJXg6IEhBTCAleCBkZXZpY2UgY2FuIG9ubHkgYmUiCisgICAgICAgICAgICAgICAgICAgICIgb3BlbmVkIGFzIEhBTCAleCBkZXZpY2UiLCBoYWxWZXJzaW9uLCBkZXZpY2VWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMCk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBjb25uZWN0RmluaXNoVW5zYWZlKGNsaWVudCwgY2xpZW50LT5nZXRSZW1vdGUoKSk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAvLyB0aGlzIGlzIHByb2JhYmx5IG5vdCByZWNvdmVyYWJsZS4uIG1heWJlIHRoZSBjbGllbnQgY2FuIHRyeSBhZ2FpbgorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIG1DbGllbnRbY2FtZXJhSWRdID0gY2xpZW50OworICAgIExPRzEoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgWCAoaWQgJWQsIHRoaXMgcGlkIGlzICVkKSIsIGNhbWVyYUlkLAorICAgICAgICAgZ2V0cGlkKCkpOworCisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpjb25uZWN0KAogICAgICAgICBjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LAogICAgICAgICBpbnQgY2FtZXJhSWQsCkBAIC00MzUsNTAgKzc2Myw4MSBAQAogICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9CiAKLSAgICAgICAgaW50IGZhY2luZyA9IC0xOwotICAgICAgICBpbnQgZGV2aWNlVmVyc2lvbiA9IGdldERldmljZVZlcnNpb24oY2FtZXJhSWQsICZmYWNpbmcpOwotCi0gICAgICAgIC8vIElmIHRoZXJlIGFyZSBvdGhlciBub24tZXhjbHVzaXZlIHVzZXJzIG9mIHRoZSBjYW1lcmEsCi0gICAgICAgIC8vICB0aGlzIHdpbGwgdGVhciB0aGVtIGRvd24gYmVmb3JlIHdlIGNhbiByZXVzZSB0aGUgY2FtZXJhCi0gICAgICAgIGlmIChpc1ZhbGlkQ2FtZXJhSWQoY2FtZXJhSWQpKSB7Ci0gICAgICAgICAgICAvLyB0cmFuc2l0aW9uIGZyb20gUFJFU0VOVCAtPiBOT1RfQVZBSUxBQkxFCi0gICAgICAgICAgICB1cGRhdGVTdGF0dXMoSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX05PVF9BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoKGRldmljZVZlcnNpb24pIHsKLSAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wOgotICAgICAgICAgICAgY2xpZW50ID0gbmV3IENhbWVyYUNsaWVudCh0aGlzLCBjYW1lcmFDbGllbnQsCi0gICAgICAgICAgICAgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lLCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICAgICAgZmFjaW5nLCBjYWxsaW5nUGlkLCBjbGllbnRVaWQsIGdldHBpZCgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8yXzA6Ci0gICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMToKLSAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOgotICAgICAgICAgICAgY2xpZW50ID0gbmV3IENhbWVyYTJDbGllbnQodGhpcywgY2FtZXJhQ2xpZW50LAotICAgICAgICAgICAgICAgICAgICBjbGllbnRQYWNrYWdlTmFtZSwgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgIGZhY2luZywgY2FsbGluZ1BpZCwgY2xpZW50VWlkLCBnZXRwaWQoKSwKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlVmVyc2lvbik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIC0xOgotICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgY2FtZXJhIGlkICVkIiwgY2FtZXJhSWQpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoIlVua25vd24gY2FtZXJhIGRldmljZSBIQUwgdmVyc2lvbjogJWQiLCBkZXZpY2VWZXJzaW9uKTsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGNvbm5lY3RGaW5pc2hVbnNhZmUoY2xpZW50LCBjbGllbnQtPmdldFJlbW90ZSgpKTsKKyAgICAgICAgc3RhdHVzID0gY29ubmVjdEhlbHBlckxvY2tlZCgvKm91dCovY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRVaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGluZ1BpZCk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgICAgIC8vIHRoaXMgaXMgcHJvYmFibHkgbm90IHJlY292ZXJhYmxlLi4gbWF5YmUgdGhlIGNsaWVudCBjYW4gdHJ5IGFnYWluCi0gICAgICAgICAgICAvLyBPSzogd2UgY2FuIG9ubHkgZ2V0IGhlcmUgaWYgd2Ugd2VyZSBvcmlnaW5hbGx5IGluIFBSRVNFTlQgc3RhdGUKLSAgICAgICAgICAgIHVwZGF0ZVN0YXR1cyhJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfUFJFU0VOVCwgY2FtZXJhSWQpOwogICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgfQogCi0gICAgICAgIG1DbGllbnRbY2FtZXJhSWRdID0gY2xpZW50OwotICAgICAgICBMT0cxKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IFggKGlkICVkLCB0aGlzIHBpZCBpcyAlZCkiLCBjYW1lcmFJZCwKLSAgICAgICAgICAgICBnZXRwaWQoKSk7CisgICAgfQorICAgIC8vIGltcG9ydGFudDogcmVsZWFzZSB0aGUgbXV0ZXggaGVyZSBzbyB0aGUgY2xpZW50IGNhbiBjYWxsIGJhY2sKKyAgICAvLyAgICBpbnRvIHRoZSBzZXJ2aWNlIGZyb20gaXRzIGRlc3RydWN0b3IgKGNhbiBiZSBhdCB0aGUgZW5kIG9mIHRoZSBjYWxsKQorCisgICAgZGV2aWNlID0gY2xpZW50OworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Y29ubmVjdExlZ2FjeSgKKyAgICAgICAgY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCwKKyAgICAgICAgaW50IGNhbWVyYUlkLCBpbnQgaGFsVmVyc2lvbiwKKyAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICBpbnQgY2xpZW50VWlkLAorICAgICAgICAvKm91dCovCisgICAgICAgIHNwPElDYW1lcmE+JiBkZXZpY2UpIHsKKworICAgIGlmIChoYWxWZXJzaW9uICE9IENBTUVSQV9IQUxfQVBJX1ZFUlNJT05fVU5TUEVDSUZJRUQgJiYKKyAgICAgICAgICAgIG1Nb2R1bGUtPmNvbW1vbi5tb2R1bGVfYXBpX3ZlcnNpb24gPCBDQU1FUkFfTU9EVUxFX0FQSV9WRVJTSU9OXzJfMykgeworICAgICAgICAvKgorICAgICAgICAgKiBFaXRoZXIgdGhlIEhBTCB2ZXJzaW9uIGlzIHVuc3BlY2lmaWVkIGluIHdoaWNoIGNhc2UgdGhpcyBqdXN0IGNyZWF0ZXMKKyAgICAgICAgICogYSBjYW1lcmEgY2xpZW50IHNlbGVjdGVkIGJ5IHRoZSBsYXRlc3QgZGV2aWNlIHZlcnNpb24sIG9yCisgICAgICAgICAqIGl0J3MgYSBwYXJ0aWN1bGFyIHZlcnNpb24gaW4gd2hpY2ggY2FzZSB0aGUgSEFMIG11c3Qgc3VwcG9ydGVkCisgICAgICAgICAqIHRoZSBvcGVuX2xlZ2FjeSBjYWxsCisgICAgICAgICAqLworICAgICAgICBBTE9HRSgiJXM6IGNhbWVyYSBIQUwgbW9kdWxlIHZlcnNpb24gJXggZG9lc24ndCBzdXBwb3J0IGNvbm5lY3RpbmcgdG8gbGVnYWN5IEhBTCBkZXZpY2VzISIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtTW9kdWxlLT5jb21tb24ubW9kdWxlX2FwaV92ZXJzaW9uKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIFN0cmluZzggY2xpZW50TmFtZTgoY2xpZW50UGFja2FnZU5hbWUpOworICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworCisgICAgTE9HMSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBsZWdhY3kgRSAocGlkICVkIFwiJXNcIiwgaWQgJWQpIiwgY2FsbGluZ1BpZCwKKyAgICAgICAgICAgIGNsaWVudE5hbWU4LnN0cmluZygpLCBjYW1lcmFJZCk7CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSB2YWxpZGF0ZUNvbm5lY3QoY2FtZXJhSWQsIC8qaW5vdXQqL2NsaWVudFVpZCk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHNwPENsaWVudD4gY2xpZW50OworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlcnZpY2VMb2NrKTsKKyAgICAgICAgc3A8QmFzaWNDbGllbnQ+IGNsaWVudFRtcDsKKyAgICAgICAgaWYgKCFjYW5Db25uZWN0VW5zYWZlKGNhbWVyYUlkLCBjbGllbnRQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUNsaWVudC0+YXNCaW5kZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki9jbGllbnRUbXApKSB7CisgICAgICAgICAgICByZXR1cm4gLUVCVVNZOworICAgICAgICB9IGVsc2UgaWYgKGNsaWVudC5nZXQoKSAhPSBOVUxMKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBzdGF0aWNfY2FzdDxDbGllbnQqPihjbGllbnRUbXAuZ2V0KCkpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzID0gY29ubmVjdEhlbHBlckxvY2tlZCgvKm91dCovY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRVaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGluZ1BpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbGVnYWN5TW9kZSovdHJ1ZSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKwogICAgIH0KICAgICAvLyBpbXBvcnRhbnQ6IHJlbGVhc2UgdGhlIG11dGV4IGhlcmUgc28gdGhlIGNsaWVudCBjYW4gY2FsbCBiYWNrCiAgICAgLy8gICAgaW50byB0aGUgc2VydmljZSBmcm9tIGl0cyBkZXN0cnVjdG9yIChjYW4gYmUgYXQgdGhlIGVuZCBvZiB0aGUgY2FsbCkKQEAgLTQ5Myw4ICs4NTIsOSBAQAogICAgIGlmIChzdGF0dXMgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9Ci0KLSAgICByZW1vdGVDYWxsYmFjay0+bGlua1RvRGVhdGgodGhpcyk7CisgICAgaWYgKHJlbW90ZUNhbGxiYWNrICE9IE5VTEwpIHsKKyAgICAgICAgcmVtb3RlQ2FsbGJhY2stPmxpbmtUb0RlYXRoKHRoaXMpOworICAgIH0KIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTUwNyw2ICs4NjcsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SVByb0NhbWVyYVVzZXI+JiBkZXZpY2UpCiB7CisgICAgaWYgKGNhbWVyYUNiID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYWxsYmFjayBtdXN0IG5vdCBiZSBudWxsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKICAgICBTdHJpbmc4IGNsaWVudE5hbWU4KGNsaWVudFBhY2thZ2VOYW1lKTsKICAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKIApAQCAtNTQxLDYgKzkwNiw4IEBACiAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMDoKICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8xOgogICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzA6CisgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMToKKyAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yOgogICAgICAgICAgICAgY2xpZW50ID0gbmV3IFByb0NhbWVyYTJDbGllbnQodGhpcywgY2FtZXJhQ2IsIGNsaWVudFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgZmFjaW5nLCBjYWxsaW5nUGlkLCBjbGllbnRVaWQsIGdldHBpZCgpKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNjAzLDE0ICs5NzAsNiBAQAogICAgICAgICBpbnQgZmFjaW5nID0gLTE7CiAgICAgICAgIGludCBkZXZpY2VWZXJzaW9uID0gZ2V0RGV2aWNlVmVyc2lvbihjYW1lcmFJZCwgJmZhY2luZyk7CiAKLSAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG90aGVyIG5vbi1leGNsdXNpdmUgdXNlcnMgb2YgdGhlIGNhbWVyYSwKLSAgICAgICAgLy8gIHRoaXMgd2lsbCB0ZWFyIHRoZW0gZG93biBiZWZvcmUgd2UgY2FuIHJldXNlIHRoZSBjYW1lcmEKLSAgICAgICAgaWYgKGlzVmFsaWRDYW1lcmFJZChjYW1lcmFJZCkpIHsKLSAgICAgICAgICAgIC8vIHRyYW5zaXRpb24gZnJvbSBQUkVTRU5UIC0+IE5PVF9BVkFJTEFCTEUKLSAgICAgICAgICAgIHVwZGF0ZVN0YXR1cyhJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfTk9UX0FWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCk7Ci0gICAgICAgIH0KLQogICAgICAgICBzd2l0Y2goZGV2aWNlVmVyc2lvbikgewogICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzA6CiAgICAgICAgICAgICBBTE9HVygiQ2FtZXJhIHVzaW5nIG9sZCBIQUwgdmVyc2lvbjogJWQiLCBkZXZpY2VWZXJzaW9uKTsKQEAgLTYxOSw2ICs5NzgsOCBAQAogICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8yXzA6CiAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMToKICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOgorICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzE6CisgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMjoKICAgICAgICAgICAgIGNsaWVudCA9IG5ldyBDYW1lcmFEZXZpY2VDbGllbnQodGhpcywgY2FtZXJhQ2IsIGNsaWVudFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgZmFjaW5nLCBjYWxsaW5nUGlkLCBjbGllbnRVaWQsIGdldHBpZCgpKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNjMzLDggKzk5NCw2IEBACiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGNvbm5lY3RGaW5pc2hVbnNhZmUoY2xpZW50LCBjbGllbnQtPmdldFJlbW90ZSgpKTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgewogICAgICAgICAgICAgLy8gdGhpcyBpcyBwcm9iYWJseSBub3QgcmVjb3ZlcmFibGUuLiBtYXliZSB0aGUgY2xpZW50IGNhbiB0cnkgYWdhaW4KLSAgICAgICAgICAgIC8vIE9LOiB3ZSBjYW4gb25seSBnZXQgaGVyZSBpZiB3ZSB3ZXJlIG9yaWdpbmFsbHkgaW4gUFJFU0VOVCBzdGF0ZQotICAgICAgICAgICAgdXBkYXRlU3RhdHVzKElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19QUkVTRU5ULCBjYW1lcmFJZCk7CiAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICB9CiAKQEAgLTcwOSw2ICsxMDY4LDc4IEBACiAgICAgcmV0dXJuIEJBRF9WQUxVRTsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Z2V0TGVnYWN5UGFyYW1ldGVycygKKyAgICAgICAgICAgIGludCBjYW1lcmFJZCwKKyAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgIFN0cmluZzE2KiBwYXJhbWV0ZXJzKSB7CisgICAgQUxPR1YoIiVzOiBmb3IgY2FtZXJhIElEID0gJWQiLCBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkKTsKKworICAgIGlmIChwYXJhbWV0ZXJzID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBwYXJhbWV0ZXJzIG11c3Qgbm90IGJlIG51bGwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0YXR1c190IHJldCA9IDA7CisKKyAgICBDYW1lcmFQYXJhbWV0ZXJzIHNoaW1QYXJhbXM7CisgICAgaWYgKChyZXQgPSBnZXRMZWdhY3lQYXJhbWV0ZXJzTGF6eShjYW1lcmFJZCwgLypvdXQqLyZzaGltUGFyYW1zKSkgIT0gT0spIHsKKyAgICAgICAgLy8gRXJyb3IgbG9nZ2VkIGJ5IGNhbGxlcgorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIFN0cmluZzggc2hpbVBhcmFtc1N0cmluZzggPSBzaGltUGFyYW1zLmZsYXR0ZW4oKTsKKyAgICBTdHJpbmcxNiBzaGltUGFyYW1zU3RyaW5nMTYgPSBTdHJpbmcxNihzaGltUGFyYW1zU3RyaW5nOCk7CisKKyAgICAqcGFyYW1ldGVycyA9IHNoaW1QYXJhbXNTdHJpbmcxNjsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6c3VwcG9ydHNDYW1lcmFBcGkoaW50IGNhbWVyYUlkLCBpbnQgYXBpVmVyc2lvbikgeworICAgIEFMT0dWKCIlczogZm9yIGNhbWVyYSBJRCA9ICVkIiwgX19GVU5DVElPTl9fLCBjYW1lcmFJZCk7CisKKyAgICBzd2l0Y2ggKGFwaVZlcnNpb24pIHsKKyAgICAgICAgY2FzZSBBUElfVkVSU0lPTl8xOgorICAgICAgICBjYXNlIEFQSV9WRVJTSU9OXzI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCIlczogQmFkIEFQSSB2ZXJzaW9uICVkIiwgX19GVU5DVElPTl9fLCBhcGlWZXJzaW9uKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaW50IGZhY2luZyA9IC0xOworICAgIGludCBkZXZpY2VWZXJzaW9uID0gZ2V0RGV2aWNlVmVyc2lvbihjYW1lcmFJZCwgJmZhY2luZyk7CisKKyAgICBzd2l0Y2goZGV2aWNlVmVyc2lvbikgeworICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMDoKKyAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8yXzA6CisgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8xOgorICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMDoKKyAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzE6CisgICAgICAgIGlmIChhcGlWZXJzaW9uID09IEFQSV9WRVJTSU9OXzIpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhIGlkICVkIHVzZXMgSEFMIHByaW9yIHRvIEhBTDMuMiwgZG9lc24ndCBzdXBwb3J0IGFwaTIgd2l0aG91dCBzaGltIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZCk7CisgICAgICAgICAgICByZXR1cm4gLUVPUE5PVFNVUFA7CisgICAgICAgIH0gZWxzZSB7IC8vIGlmIChhcGlWZXJzaW9uID09IEFQSV9WRVJTSU9OXzEpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhIGlkICVkIHVzZXMgb2xkZXIgSEFMIGJlZm9yZSAzLjIsIGJ1dCBhcGkxIGlzIGFsd2F5cyBzdXBwb3J0ZWQiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMjoKKyAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgaWQgJWQgdXNlcyBIQUwzLjIgb3IgbmV3ZXIsIHN1cHBvcnRzIGFwaTEvYXBpMiBkaXJlY3RseSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZCk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICAgIGNhc2UgLTE6CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBjYW1lcmEgaWQgJWQiLCBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dFKCIlczogVW5rbm93biBjYW1lcmEgZGV2aWNlIEhBTCB2ZXJzaW9uOiAlZCIsIF9fRlVOQ1RJT05fXywgZGV2aWNlVmVyc2lvbik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKIHZvaWQgQ2FtZXJhU2VydmljZTo6cmVtb3ZlQ2xpZW50QnlSZW1vdGUoY29uc3Qgd3A8SUJpbmRlcj4mIHJlbW90ZUJpbmRlcikgewogICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOwogICAgIExPRzEoIkNhbWVyYVNlcnZpY2U6OnJlbW92ZUNsaWVudEJ5UmVtb3RlIEUgKHBpZCAlZCkiLCBjYWxsaW5nUGlkKTsKQEAgLTcyMyw5ICsxMTU0LDEzIEBACiAgICAgaWYgKGNsaWVudCAhPSAwKSB7CiAgICAgICAgIC8vIEZvdW5kIG91ciBjYW1lcmEsIGNsZWFyIGFuZCBsZWF2ZS4KICAgICAgICAgTE9HMSgicmVtb3ZlQ2xpZW50OiBjbGVhciBjYW1lcmEgJWQiLCBvdXRJbmRleCk7Ci0gICAgICAgIG1DbGllbnRbb3V0SW5kZXhdLmNsZWFyKCk7CiAKLSAgICAgICAgY2xpZW50LT5nZXRSZW1vdGUoKS0+dW5saW5rVG9EZWF0aCh0aGlzKTsKKyAgICAgICAgc3A8SUJpbmRlcj4gcmVtb3RlID0gY2xpZW50LT5nZXRSZW1vdGUoKTsKKyAgICAgICAgaWYgKHJlbW90ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICByZW1vdGUtPnVubGlua1RvRGVhdGgodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBtQ2xpZW50W291dEluZGV4XS5jbGVhcigpOwogICAgIH0gZWxzZSB7CiAKICAgICAgICAgc3A8UHJvQ2xpZW50PiBjbGllbnRQcm8gPSBmaW5kUHJvQ2xpZW50VW5zYWZlKHJlbW90ZUJpbmRlcik7CkBAIC04MzUsNiArMTI3MCw3IEBACiAgICAgICAgIGNhc2UgQm5DYW1lcmFTZXJ2aWNlOjpDT05ORUNUOgogICAgICAgICBjYXNlIEJuQ2FtZXJhU2VydmljZTo6Q09OTkVDVF9QUk86CiAgICAgICAgIGNhc2UgQm5DYW1lcmFTZXJ2aWNlOjpDT05ORUNUX0RFVklDRToKKyAgICAgICAgY2FzZSBCbkNhbWVyYVNlcnZpY2U6OkNPTk5FQ1RfTEVHQUNZOgogICAgICAgICAgICAgY29uc3QgaW50IHBpZCA9IGdldENhbGxpbmdQaWQoKTsKICAgICAgICAgICAgIGNvbnN0IGludCBzZWxmX3BpZCA9IGdldHBpZCgpOwogICAgICAgICAgICAgaWYgKHBpZCAhPSBzZWxmX3BpZCkgewpAQCAtODc3LDcgKzEzMTMsNyBAQAogCiBNZWRpYVBsYXllciogQ2FtZXJhU2VydmljZTo6bmV3TWVkaWFQbGF5ZXIoY29uc3QgY2hhciAqZmlsZSkgewogICAgIE1lZGlhUGxheWVyKiBtcCA9IG5ldyBNZWRpYVBsYXllcigpOwotICAgIGlmIChtcC0+c2V0RGF0YVNvdXJjZShmaWxlLCBOVUxMKSA9PSBOT19FUlJPUikgeworICAgIGlmIChtcC0+c2V0RGF0YVNvdXJjZShOVUxMIC8qIGh0dHBTZXJ2aWNlICovLCBmaWxlLCBOVUxMKSA9PSBOT19FUlJPUikgewogICAgICAgICBtcC0+c2V0QXVkaW9TdHJlYW1UeXBlKEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFKTsKICAgICAgICAgbXAtPnByZXBhcmUoKTsKICAgICB9IGVsc2UgewpAQCAtOTgxLDYgKzE0MTcsOCBAQAogdm9pZCBDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudDo6ZGlzY29ubmVjdCgpIHsKICAgICBBTE9HVigiQmFzaWNDbGllbnQ6OmRpc2Nvbm5lY3QiKTsKICAgICBtQ2FtZXJhU2VydmljZS0+cmVtb3ZlQ2xpZW50QnlSZW1vdGUobVJlbW90ZUJpbmRlcik7CisKKyAgICBmaW5pc2hDYW1lcmFPcHMoKTsKICAgICAvLyBjbGllbnQgc2hvdWxkbid0IGJlIGFibGUgdG8gY2FsbCBpbnRvIHVzIGFueW1vcmUKICAgICBtQ2xpZW50UGlkID0gMDsKIH0KQEAgLTk5NSw3ICsxNDMzLDcgQEAKIAogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQ6OnN0YXJ0Q2FtZXJhT3BzKCkgewogICAgIGludDMyX3QgcmVzOwotCisgICAgLy8gTm90aWZ5IGFwcCBvcHMgdGhhdCB0aGUgY2FtZXJhIGlzIG5vdCBhdmFpbGFibGUKICAgICBtT3BzQ2FsbGJhY2sgPSBuZXcgT3BzQ2FsbGJhY2sodGhpcyk7CiAKICAgICB7CkBAIC0xMDEzLDE2ICsxNDUxLDM5IEBACiAgICAgICAgICAgICAgICAgbUNhbWVyYUlkLCBTdHJpbmc4KG1DbGllbnRQYWNrYWdlTmFtZSkuc3RyaW5nKCkpOwogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQorCiAgICAgbU9wc0FjdGl2ZSA9IHRydWU7CisKKyAgICAvLyBUcmFuc2l0aW9uIGRldmljZSBhdmFpbGFiaWxpdHkgbGlzdGVuZXJzIGZyb20gUFJFU0VOVCAtPiBOT1RfQVZBSUxBQkxFCisgICAgbUNhbWVyYVNlcnZpY2UtPnVwZGF0ZVN0YXR1cyhJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfTk9UX0FWQUlMQUJMRSwKKyAgICAgICAgICAgIG1DYW1lcmFJZCk7CisKICAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50OjpmaW5pc2hDYW1lcmFPcHMoKSB7CisgICAgLy8gQ2hlY2sgaWYgc3RhcnRDYW1lcmFPcHMgc3VjY2VlZGVkLCBhbmQgaWYgc28sIGZpbmlzaCB0aGUgY2FtZXJhIG9wCiAgICAgaWYgKG1PcHNBY3RpdmUpIHsKKyAgICAgICAgLy8gTm90aWZ5IGFwcCBvcHMgdGhhdCB0aGUgY2FtZXJhIGlzIGF2YWlsYWJsZSBhZ2FpbgogICAgICAgICBtQXBwT3BzTWFuYWdlci5maW5pc2hPcChBcHBPcHNNYW5hZ2VyOjpPUF9DQU1FUkEsIG1DbGllbnRVaWQsCiAgICAgICAgICAgICAgICAgbUNsaWVudFBhY2thZ2VOYW1lKTsKICAgICAgICAgbU9wc0FjdGl2ZSA9IGZhbHNlOworCisgICAgICAgIC8vIE5vdGlmeSBkZXZpY2UgYXZhaWxhYmlsaXR5IGxpc3RlbmVycyB0aGF0IHRoaXMgY2FtZXJhIGlzIGF2YWlsYWJsZQorICAgICAgICAvLyBhZ2FpbgorCisgICAgICAgIFN0YXR1c1ZlY3RvciByZWplY3RTb3VyY2VTdGF0ZXM7CisgICAgICAgIHJlamVjdFNvdXJjZVN0YXRlcy5wdXNoX2JhY2soSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX05PVF9QUkVTRU5UKTsKKyAgICAgICAgcmVqZWN0U291cmNlU3RhdGVzLnB1c2hfYmFjayhJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfRU5VTUVSQVRJTkcpOworCisgICAgICAgIC8vIFRyYW5zaXRpb24gdG8gUFJFU0VOVCBpZiB0aGUgY2FtZXJhIGlzIG5vdCBpbiBlaXRoZXIgb2YgYWJvdmUgMgorICAgICAgICAvLyBzdGF0ZXMKKyAgICAgICAgbUNhbWVyYVNlcnZpY2UtPnVwZGF0ZVN0YXR1cyhJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfUFJFU0VOVCwKKyAgICAgICAgICAgICAgICBtQ2FtZXJhSWQsCisgICAgICAgICAgICAgICAgJnJlamVjdFNvdXJjZVN0YXRlcyk7CisKICAgICB9CisgICAgLy8gQWx3YXlzIHN0b3Agd2F0Y2hpbmcsIGV2ZW4gaWYgbm8gY2FtZXJhIG9wIGlzIGFjdGl2ZQogICAgIG1BcHBPcHNNYW5hZ2VyLnN0b3BXYXRjaGluZ01vZGUobU9wc0NhbGxiYWNrKTsKICAgICBtT3BzQ2FsbGJhY2suY2xlYXIoKTsKIApAQCAtMTA1Myw3ICsxNTE0LDggQEAKICAgICAgICAgLy8gUmVzZXQgdGhlIGNsaWVudCBQSUQgdG8gYWxsb3cgc2VydmVyLWluaXRpYXRlZCBkaXNjb25uZWN0LAogICAgICAgICAvLyBhbmQgdG8gcHJldmVudCBmdXJ0aGVyIGNhbGxzIGJ5IGNsaWVudC4KICAgICAgICAgbUNsaWVudFBpZCA9IGdldENhbGxpbmdQaWQoKTsKLSAgICAgICAgbm90aWZ5RXJyb3IoKTsKKyAgICAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcyByZXN1bHRFeHRyYXM7IC8vIGEgZHVtbXkgcmVzdWx0IChpbnZhbGlkKQorICAgICAgICBub3RpZnlFcnJvcihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfU0VSVklDRSwgcmVzdWx0RXh0cmFzKTsKICAgICAgICAgZGlzY29ubmVjdCgpOwogICAgIH0KIH0KQEAgLTEwNjEsMTMgKzE1MjMsMTMgQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogTXV0ZXgqIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6Z2V0Q2xpZW50TG9ja0Zyb21Db29raWUodm9pZCogdXNlcikgewotICAgIHJldHVybiBnQ2FtZXJhU2VydmljZS0+Z2V0Q2xpZW50TG9ja0J5SWQoKGludCkgdXNlcik7CisgICAgcmV0dXJuIGdDYW1lcmFTZXJ2aWNlLT5nZXRDbGllbnRMb2NrQnlJZCgoaW50KShpbnRwdHJfdCkgdXNlcik7CiB9CiAKIC8vIFByb3ZpZGUgY2xpZW50IHBvaW50ZXIgZm9yIGNhbGxiYWNrcy4gQ2xpZW50IGxvY2sgcmV0dXJuZWQgZnJvbSBnZXRDbGllbnRMb2NrRnJvbUNvb2tpZSBzaG91bGQKIC8vIGJlIGFjcXVpcmVkIGZvciB0aGlzIHRvIGJlIHNhZmUKIENhbWVyYVNlcnZpY2U6OkNsaWVudCogQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpnZXRDbGllbnRGcm9tQ29va2llKHZvaWQqIHVzZXIpIHsKLSAgICBCYXNpY0NsaWVudCAqYmFzaWNDbGllbnQgPSBnQ2FtZXJhU2VydmljZS0+Z2V0Q2xpZW50QnlJZFVuc2FmZSgoaW50KSB1c2VyKTsKKyAgICBCYXNpY0NsaWVudCAqYmFzaWNDbGllbnQgPSBnQ2FtZXJhU2VydmljZS0+Z2V0Q2xpZW50QnlJZFVuc2FmZSgoaW50KShpbnRwdHJfdCkgdXNlcik7CiAgICAgLy8gT0s6IG9ubHkgQ2FtZXJhQ2xpZW50IGNhbGxzIHRoaXMsIGFuZCB0aGV5IGFscmVhZHkgY2FzdCBhbnl3YXkuCiAgICAgQ2xpZW50KiBjbGllbnQgPSBzdGF0aWNfY2FzdDxDbGllbnQqPihiYXNpY0NsaWVudCk7CiAKQEAgLTEwODIsNyArMTU0NCw4IEBACiAgICAgcmV0dXJuIGNsaWVudDsKIH0KIAotdm9pZCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6Om5vdGlmeUVycm9yKCkgewordm9pZCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6Om5vdGlmeUVycm9yKElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkNhbWVyYUVycm9yQ29kZSBlcnJvckNvZGUsCisgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgewogICAgIG1SZW1vdGVDYWxsYmFjay0+bm90aWZ5Q2FsbGJhY2soQ0FNRVJBX01TR19FUlJPUiwgQ0FNRVJBX0VSUk9SX1JFTEVBU0VELCAwKTsKIH0KIApAQCAtMTA5MSwxNSArMTU1NCw2IEBACiAgICAgQUxPR1YoIkNsaWVudDo6ZGlzY29ubmVjdCIpOwogICAgIEJhc2ljQ2xpZW50OjpkaXNjb25uZWN0KCk7CiAgICAgbUNhbWVyYVNlcnZpY2UtPnNldENhbWVyYUZyZWUobUNhbWVyYUlkKTsKLQotICAgIFN0YXR1c1ZlY3RvciByZWplY3RTb3VyY2VTdGF0ZXM7Ci0gICAgcmVqZWN0U291cmNlU3RhdGVzLnB1c2hfYmFjayhJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfTk9UX1BSRVNFTlQpOwotICAgIHJlamVjdFNvdXJjZVN0YXRlcy5wdXNoX2JhY2soSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX0VOVU1FUkFUSU5HKTsKLQotICAgIC8vIFRyYW5zaXRpb24gdG8gUFJFU0VOVCBpZiB0aGUgY2FtZXJhIGlzIG5vdCBpbiBlaXRoZXIgb2YgYWJvdmUgMiBzdGF0ZXMKLSAgICBtQ2FtZXJhU2VydmljZS0+dXBkYXRlU3RhdHVzKElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19QUkVTRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlamVjdFNvdXJjZVN0YXRlcyk7CiB9CiAKIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6T3BzQ2FsbGJhY2s6Ok9wc0NhbGxiYWNrKHdwPEJhc2ljQ2xpZW50PiBjbGllbnQpOgpAQCAtMTEzNiw3ICsxNTkwLDggQEAKIENhbWVyYVNlcnZpY2U6OlByb0NsaWVudDo6flByb0NsaWVudCgpIHsKIH0KIAotdm9pZCBDYW1lcmFTZXJ2aWNlOjpQcm9DbGllbnQ6Om5vdGlmeUVycm9yKCkgewordm9pZCBDYW1lcmFTZXJ2aWNlOjpQcm9DbGllbnQ6Om5vdGlmeUVycm9yKElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkNhbWVyYUVycm9yQ29kZSBlcnJvckNvZGUsCisgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgewogICAgIG1SZW1vdGVDYWxsYmFjay0+bm90aWZ5Q2FsbGJhY2soQ0FNRVJBX01TR19FUlJPUiwgQ0FNRVJBX0VSUk9SX1JFTEVBU0VELCAwKTsKIH0KIApAQCAtMTE3OCw2ICsxNjMzLDcgQEAKICAgICAgICAgaWYgKCFtTW9kdWxlKSB7CiAgICAgICAgICAgICByZXN1bHQgPSBTdHJpbmc4Ojpmb3JtYXQoIk5vIGNhbWVyYSBtb2R1bGUgYXZhaWxhYmxlIVxuIik7CiAgICAgICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICAgICAgICAgIGlmIChsb2NrZWQpIG1TZXJ2aWNlTG9jay51bmxvY2soKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQogCkBAIC0xMTkwLDcgKzE2NDYsMjAgQEAKICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiQ2FtZXJhIG1vZHVsZSBhdXRob3I6ICVzXG4iLAogICAgICAgICAgICAgICAgIG1Nb2R1bGUtPmNvbW1vbi5hdXRob3IpOwogICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJOdW1iZXIgb2YgY2FtZXJhIGRldmljZXM6ICVkXG5cbiIsIG1OdW1iZXJPZkNhbWVyYXMpOworCisgICAgICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IGRlc2MgPSBWZW5kb3JUYWdEZXNjcmlwdG9yOjpnZXRHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKCk7CisgICAgICAgIGlmIChkZXNjID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIlZlbmRvciB0YWdzIGxlZnQgdW5pbXBsZW1lbnRlZC5cbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiVmVuZG9yIHRhZyBkZWZpbml0aW9uczpcbiIpOworICAgICAgICB9CisKICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisKKyAgICAgICAgaWYgKGRlc2MgIT0gTlVMTCkgeworICAgICAgICAgICAgZGVzYy0+ZHVtcChmZCwgLyp2ZXJib3NpdHkqLzIsIC8qaW5kZW50YXRpb24qLzQpOworICAgICAgICB9CisKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtYmVyT2ZDYW1lcmFzOyBpKyspIHsKICAgICAgICAgICAgIHJlc3VsdCA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVkIHN0YXRpYyBpbmZvcm1hdGlvbjpcbiIsIGkpOwogICAgICAgICAgICAgY2FtZXJhX2luZm8gaW5mbzsKQEAgLTEyMTUsNyArMTY4NCw3IEBACiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgRGV2aWNlIHN0YXRpYyBtZXRhZGF0YTpcbiIpOwogICAgICAgICAgICAgICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKICAgICAgICAgICAgICAgICAgICAgZHVtcF9pbmRlbnRlZF9jYW1lcmFfbWV0YWRhdGEoaW5mby5zdGF0aWNfY2FtZXJhX2NoYXJhY3RlcmlzdGljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZCwgMiwgNCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmQsIC8qdmVyYm9zaXR5Ki8yLCAvKmluZGVudGF0aW9uKi80KTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKaW5kZXggN2YzNjkxYS4uOGEzZGIwOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaApAQCAtMSwyNCArMSwyNCBAQAogLyoKLSoqCi0qKiBDb3B5cmlnaHQgKEMpIDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwogCiAjaWZuZGVmIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBU0VSVklDRV9ICiAjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBU0VSVklDRV9ICiAKICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPGJpbmRlci9BcHBPcHNNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL0JpbmRlclNlcnZpY2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvSUFwcE9wc0NhbGxiYWNrLmg+CkBAIC0zMSw2ICszMSw5IEBACiAjaW5jbHVkZSA8Y2FtZXJhL0lQcm9DYW1lcmFDYWxsYmFja3MuaD4KICNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5oPgogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KKyNpbmNsdWRlIDxjYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYXB0dXJlUmVzdWx0Lmg+CisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaD4KIAogI2luY2x1ZGUgPGNhbWVyYS9JQ2FtZXJhU2VydmljZUxpc3RlbmVyLmg+CiAKQEAgLTc2LDEyICs3OSwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ2FtZXJhSW5mbyogY2FtZXJhSW5mbyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoaW50IGNhbWVyYUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhKiBjYW1lcmFJbmZvKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldENhbWVyYVZlbmRvclRhZ0Rlc2NyaXB0b3IoLypvdXQqLyBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiYgZGVzYyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbm5lY3QoY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCwgaW50IGNhbWVyYUlkLAogICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLCBpbnQgY2xpZW50VWlkLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8SUNhbWVyYT4mIGRldmljZSk7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNvbm5lY3RMZWdhY3koY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCwgaW50IGNhbWVyYUlkLAorICAgICAgICAgICAgaW50IGhhbFZlcnNpb24sIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwgaW50IGNsaWVudFVpZCwKKyAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgIHNwPElDYW1lcmE+JiBkZXZpY2UpOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25uZWN0UHJvKGNvbnN0IHNwPElQcm9DYW1lcmFDYWxsYmFja3M+JiBjYW1lcmFDYiwKICAgICAgICAgICAgIGludCBjYW1lcmFJZCwgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLCBpbnQgY2xpZW50VWlkLAogICAgICAgICAgICAgLypvdXQqLwpAQCAtOTksNiArMTA4LDE1IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICByZW1vdmVMaXN0ZW5lcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+JiBsaXN0ZW5lcik7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldExlZ2FjeVBhcmFtZXRlcnMoCisgICAgICAgICAgICBpbnQgY2FtZXJhSWQsCisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBTdHJpbmcxNiogcGFyYW1ldGVycyk7CisKKyAgICAvLyBPSyA9IHN1cHBvcnRzIGFwaSBvZiB0aGF0IHZlcnNpb24sIC1FT1BOT1RTVVBQID0gZG9lcyBub3Qgc3VwcG9ydAorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3VwcG9ydHNDYW1lcmFBcGkoCisgICAgICAgICAgICBpbnQgY2FtZXJhSWQsIGludCBhcGlWZXJzaW9uKTsKKwogICAgIC8vIEV4dHJhIHBlcm1pc3Npb25zIGNoZWNrcwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCh1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKTsKQEAgLTEyMyw2ICsxNDEsMTAgQEAKICAgICAvLyBDYW1lcmFEZXZpY2VGYWN0b3J5IGZ1bmN0aW9uYWxpdHkKICAgICBpbnQgICAgICAgICAgICAgICAgIGdldERldmljZVZlcnNpb24oaW50IGNhbWVyYUlkLCBpbnQqIGZhY2luZyA9IE5VTEwpOwogCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gU2hhcmVkIHV0aWxpdGllcworICAgIHN0YXRpYyBzdGF0dXNfdCAgICAgZmlsdGVyT3BlbkVycm9yQ29kZShzdGF0dXNfdCBlcnIpOworICAgIHN0YXRpYyBzdGF0dXNfdCAgICAgZmlsdGVyR2V0SW5mb0Vycm9yQ29kZShzdGF0dXNfdCBlcnIpOwogCiAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgLy8gQ2FtZXJhQ2xpZW50IGZ1bmN0aW9uYWxpdHkKQEAgLTEzNCwxNiArMTU2LDE1IEBACiAKICAgICBjbGFzcyBCYXNpY0NsaWVudCA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UgewogICAgIHB1YmxpYzoKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplKGNhbWVyYV9tb2R1bGVfdCAqbW9kdWxlKSA9IDA7Ci0KLSAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgIGRpc2Nvbm5lY3QoKSA9IDA7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgaW5pdGlhbGl6ZShjYW1lcmFfbW9kdWxlX3QgKm1vZHVsZSkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGRpc2Nvbm5lY3QoKTsKIAogICAgICAgICAvLyBiZWNhdXNlIHdlIGNhbid0IHZpcnR1YWxseSBpbmhlcml0IElJbnRlcmZhY2UsIHdoaWNoIGJyZWFrcwogICAgICAgICAvLyB2aXJ0dWFsIGluaGVyaXRhbmNlCiAgICAgICAgIHZpcnR1YWwgc3A8SUJpbmRlcj4gYXNCaW5kZXJXcmFwcGVyKCkgPSAwOwogCiAgICAgICAgIC8vIFJldHVybiB0aGUgcmVtb3RlIGNhbGxiYWNrIGJpbmRlciBvYmplY3QgKGUuZy4gSVByb0NhbWVyYUNhbGxiYWNrcykKLSAgICAgICAgc3A8SUJpbmRlcj4gICAgIGdldFJlbW90ZSgpIHsKKyAgICAgICAgc3A8SUJpbmRlcj4gICAgICAgICBnZXRSZW1vdGUoKSB7CiAgICAgICAgICAgICByZXR1cm4gbVJlbW90ZUJpbmRlcjsKICAgICAgICAgfQogCkBAIC0xODcsNyArMjA4LDkgQEAKICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hDYW1lcmFPcHMoKTsKIAogICAgICAgICAvLyBOb3RpZnkgY2xpZW50IGFib3V0IGEgZmF0YWwgZXJyb3IKLSAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgICAgICAgICBub3RpZnlFcnJvcigpID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgICAgICAgICBub3RpZnlFcnJvcigKKyAgICAgICAgICAgICAgICBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpDYW1lcmFFcnJvckNvZGUgZXJyb3JDb2RlLAorICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgPSAwOwogICAgIHByaXZhdGU6CiAgICAgICAgIEFwcE9wc01hbmFnZXIgICAgICAgICAgICAgICAgICAgbUFwcE9wc01hbmFnZXI7CiAKQEAgLTI2NCw3ICsyODcsOCBAQAogICAgICAgICAvLyBjb252ZXJ0IGNsaWVudCBmcm9tIGNvb2tpZS4gQ2xpZW50IGxvY2sgc2hvdWxkIGJlIGFjcXVpcmVkIGJlZm9yZSBnZXR0aW5nIENsaWVudC4KICAgICAgICAgc3RhdGljIENsaWVudCogICAgICAgZ2V0Q2xpZW50RnJvbUNvb2tpZSh2b2lkKiB1c2VyKTsKIAotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICBub3RpZnlFcnJvcigpOworICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICBub3RpZnlFcnJvcihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpDYW1lcmFFcnJvckNvZGUgZXJyb3JDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpOwogCiAgICAgICAgIC8vIEluaXRpYWxpemVkIGluIGNvbnN0cnVjdG9yCiAKQEAgLTMxMiw3ICszMzYsOCBAQAogICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgb25FeGNsdXNpdmVMb2NrU3RvbGVuKCkgPSAwOwogCiAgICAgcHJvdGVjdGVkOgotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgbm90aWZ5RXJyb3IoKTsKKyAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeUVycm9yKElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkNhbWVyYUVycm9yQ29kZSBlcnJvckNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpOwogCiAgICAgICAgIHNwPElQcm9DYW1lcmFDYWxsYmFja3M+IG1SZW1vdGVDYWxsYmFjazsKICAgICB9OyAvLyBjbGFzcyBQcm9DbGllbnQKQEAgLTM5Myw2ICs0MTgsNTcgQEAKICAgICAvLyBIZWxwZXJzCiAKICAgICBib29sICAgICAgICAgICAgICAgIGlzVmFsaWRDYW1lcmFJZChpbnQgY2FtZXJhSWQpOworCisgICAgYm9vbCAgICAgICAgICAgICAgICBzZXRVcFZlbmRvclRhZ3MoKTsKKworICAgIC8qKgorICAgICAqIEEgbWFwcGluZyBvZiBjYW1lcmEgaWRzIHRvIENhbWVyYVBhcmFtZXRlcnMgcmV0dXJuZWQgYnkgdGhhdCBjYW1lcmEgZGV2aWNlLgorICAgICAqCisgICAgICogVGhpcyBjYWNoZSBpcyB1c2VkIHRvIGdlbmVyYXRlIENhbWVyYUNoYXJhY3RlcmlzdGljIG1ldGFkYXRhIHdoZW4gdXNpbmcKKyAgICAgKiB0aGUgSEFMMSBzaGltLgorICAgICAqLworICAgIEtleWVkVmVjdG9yPGludCwgQ2FtZXJhUGFyYW1ldGVycz4gICAgbVNoaW1QYXJhbXM7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIGFuZCBjYWNoZSB0aGUgbWV0YWRhdGEgdXNlZCBieSB0aGUgSEFMMSBzaGltIGZvciBhIGdpdmVuIGNhbWVyYUlkLgorICAgICAqCisgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICovCisgICAgc3RhdHVzX3QgICAgICAgICAgICBpbml0aWFsaXplU2hpbU1ldGFkYXRhKGludCBjYW1lcmFJZCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNhY2hlZCBDYW1lcmFQYXJhbWV0ZXJzIGZvciB0aGUgY2FtZXJhLiBJZiB0aGV5IGhhdmVuJ3QgYmVlbgorICAgICAqIGNhY2hlZCB5ZXQsIHRoZW4gaW5pdGlhbGl6ZSB0aGVtIGZvciB0aGUgZmlyc3QgdGltZS4KKyAgICAgKgorICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAqLworICAgIHN0YXR1c190ICAgICAgICAgICAgZ2V0TGVnYWN5UGFyYW1ldGVyc0xhenkoaW50IGNhbWVyYUlkLCAvKm91dCovQ2FtZXJhUGFyYW1ldGVycyogcGFyYW1ldGVycyk7CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZSB0aGUgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzIG1ldGFkYXRhIHJlcXVpcmVkIGJ5IHRoZSBDYW1lcmEyIEFQSQorICAgICAqIGZyb20gdGhlIGF2YWlsYWJsZSBIQUwxIENhbWVyYVBhcmFtZXRlcnMgYW5kIENhbWVyYUluZm8uCisgICAgICoKKyAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCAgICAgICAgICAgIGdlbmVyYXRlU2hpbU1ldGFkYXRhKGludCBjYW1lcmFJZCwgLypvdXQqL0NhbWVyYU1ldGFkYXRhKiBjYW1lcmFJbmZvKTsKKworICAgIC8qKgorICAgICAqIENvbm5lY3QgYSBuZXcgY2FtZXJhIGNsaWVudC4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGlsZSBob2xkaW5nIHRoZQorICAgICAqIG11dGV4IGZvciBtU2VydmljZUxvY2suCisgICAgICoKKyAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCAgICAgICAgICAgIGNvbm5lY3RIZWxwZXJMb2NrZWQoCisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBzcDxDbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICAvKmluKi8KKyAgICAgICAgICAgIGNvbnN0IHNwPElDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsCisgICAgICAgICAgICBpbnQgY2FtZXJhSWQsCisgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCisgICAgICAgICAgICBpbnQgY2xpZW50VWlkLAorICAgICAgICAgICAgaW50IGNhbGxpbmdQaWQsCisgICAgICAgICAgICBpbnQgaGFsVmVyc2lvbiA9IENBTUVSQV9IQUxfQVBJX1ZFUlNJT05fVU5TUEVDSUZJRUQsCisgICAgICAgICAgICBib29sIGxlZ2FjeU1vZGUgPSBmYWxzZSk7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcAppbmRleCAxMzEwNDhlLi4zNjRiMTQxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5jcHAKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogCkBAIC01MywxNiArNTQsMTcgQEAKICAgICAgICAgaW50IGNsaWVudFBpZCwKICAgICAgICAgdWlkX3QgY2xpZW50VWlkLAogICAgICAgICBpbnQgc2VydmljZVBpZCwKLSAgICAgICAgaW50IGRldmljZVZlcnNpb24pOgorICAgICAgICBib29sIGxlZ2FjeU1vZGUpOgogICAgICAgICBDYW1lcmEyQ2xpZW50QmFzZShjYW1lcmFTZXJ2aWNlLCBjYW1lcmFDbGllbnQsIGNsaWVudFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBjYW1lcmFGYWNpbmcsIGNsaWVudFBpZCwgY2xpZW50VWlkLCBzZXJ2aWNlUGlkKSwKLSAgICAgICAgbVBhcmFtZXRlcnMoY2FtZXJhSWQsIGNhbWVyYUZhY2luZyksCi0gICAgICAgIG1EZXZpY2VWZXJzaW9uKGRldmljZVZlcnNpb24pCisgICAgICAgIG1QYXJhbWV0ZXJzKGNhbWVyYUlkLCBjYW1lcmFGYWNpbmcpCiB7CiAgICAgQVRSQUNFX0NBTEwoKTsKIAogICAgIFNoYXJlZFBhcmFtZXRlcnM6OkxvY2sgbChtUGFyYW1ldGVycyk7CiAgICAgbC5tUGFyYW1ldGVycy5zdGF0ZSA9IFBhcmFtZXRlcnM6OkRJU0NPTk5FQ1RFRDsKKworICAgIG1MZWdhY3lNb2RlID0gbGVnYWN5TW9kZTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhMkNsaWVudDo6aW5pdGlhbGl6ZShjYW1lcmFfbW9kdWxlX3QgKm1vZHVsZSkKQEAgLTc5LDcgKzgxLDcgQEAKICAgICB7CiAgICAgICAgIFNoYXJlZFBhcmFtZXRlcnM6OkxvY2sgbChtUGFyYW1ldGVycyk7CiAKLSAgICAgICAgcmVzID0gbC5tUGFyYW1ldGVycy5pbml0aWFsaXplKCYobURldmljZS0+aW5mbygpKSk7CisgICAgICAgIHJlcyA9IGwubVBhcmFtZXRlcnMuaW5pdGlhbGl6ZSgmKG1EZXZpY2UtPmluZm8oKSksIG1EZXZpY2VWZXJzaW9uKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IHVuYWJsZSB0byBidWlsZCBkZWZhdWx0czogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKQEAgLTExNyw3ICsxMTksOSBAQAogICAgICAgICAgICAgbVpzbFByb2Nlc3NvclRocmVhZCA9IHpzbFByb2M7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOnsKKyAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMDoKKyAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMToKKyAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMjogewogICAgICAgICAgICAgc3A8WnNsUHJvY2Vzc29yMz4genNsUHJvYyA9CiAgICAgICAgICAgICAgICAgICAgIG5ldyBac2xQcm9jZXNzb3IzKHRoaXMsIG1DYXB0dXJlU2VxdWVuY2VyKTsKICAgICAgICAgICAgIG1ac2xQcm9jZXNzb3IgPSB6c2xQcm9jOwpAQCAtMTk3LDcgKzIwMSw3IEBACiAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgICBHUFMgbGF0IHggbG9uZyB4IGFsdDogJWYgeCAlZiB4ICVmXG4iLAogICAgICAgICAgICAgICAgIHAuZ3BzQ29vcmRpbmF0ZXNbMF0sIHAuZ3BzQ29vcmRpbmF0ZXNbMV0sCiAgICAgICAgICAgICAgICAgcC5ncHNDb29yZGluYXRlc1syXSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgICBHUFMgdGltZXN0YW1wOiAlbGxkXG4iLAorICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgICAgR1BTIHRpbWVzdGFtcDogJSIgUFJJZDY0ICJcbiIsCiAgICAgICAgICAgICAgICAgcC5ncHNUaW1lc3RhbXApOwogICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgICAgR1BTIHByb2Nlc3NpbmcgbWV0aG9kOiAlc1xuIiwKICAgICAgICAgICAgICAgICBwLmdwc1Byb2Nlc3NpbmdNZXRob2Quc3RyaW5nKCkpOwpAQCAtMjQxLDcgKzI0NSw3IEBACiAKICAgICByZXN1bHQuYXBwZW5kKCIgICAgU2NlbmUgbW9kZTogIik7CiAgICAgc3dpdGNoIChwLnNjZW5lTW9kZSkgewotICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX1VOU1VQUE9SVEVEOgorICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX0RJU0FCTEVEOgogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiQVVUT1xuIik7IGJyZWFrOwogICAgICAgICBDQVNFX0FQUEVORF9FTlVNKEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX0FDVElPTikKICAgICAgICAgQ0FTRV9BUFBFTkRfRU5VTShBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9QT1JUUkFJVCkKQEAgLTQxOSwxMiArNDIzLDIwIEBACiAKICAgICBBTE9HVigiQ2FtZXJhICVkOiBXYWl0aW5nIGZvciB0aHJlYWRzIiwgbUNhbWVyYUlkKTsKIAotICAgIG1TdHJlYW1pbmdQcm9jZXNzb3ItPmpvaW4oKTsKLSAgICBtRnJhbWVQcm9jZXNzb3ItPmpvaW4oKTsKLSAgICBtQ2FwdHVyZVNlcXVlbmNlci0+am9pbigpOwotICAgIG1KcGVnUHJvY2Vzc29yLT5qb2luKCk7Ci0gICAgbVpzbFByb2Nlc3NvclRocmVhZC0+am9pbigpOwotICAgIG1DYWxsYmFja1Byb2Nlc3Nvci0+am9pbigpOworICAgIHsKKyAgICAgICAgLy8gRG9uJ3Qgd2FpdCB3aXRoIGxvY2sgaGVsZCwgaW4gY2FzZSB0aGUgb3RoZXIgdGhyZWFkcyBuZWVkIHRvCisgICAgICAgIC8vIGNvbXBsZXRlIGNhbGxiYWNrcyB0aGF0IHJlLWVudGVyIENhbWVyYTJDbGllbnQKKyAgICAgICAgbUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrLnVubG9jaygpOworCisgICAgICAgIG1TdHJlYW1pbmdQcm9jZXNzb3ItPmpvaW4oKTsKKyAgICAgICAgbUZyYW1lUHJvY2Vzc29yLT5qb2luKCk7CisgICAgICAgIG1DYXB0dXJlU2VxdWVuY2VyLT5qb2luKCk7CisgICAgICAgIG1KcGVnUHJvY2Vzc29yLT5qb2luKCk7CisgICAgICAgIG1ac2xQcm9jZXNzb3JUaHJlYWQtPmpvaW4oKTsKKyAgICAgICAgbUNhbGxiYWNrUHJvY2Vzc29yLT5qb2luKCk7CisKKyAgICAgICAgbUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrLmxvY2soKTsKKyAgICB9CiAKICAgICBBTE9HVigiQ2FtZXJhICVkOiBEZWxldGluZyBzdHJlYW1zIiwgbUNhbWVyYUlkKTsKIApAQCAtNDM0LDYgKzQ0Niw5IEBACiAgICAgbUNhbGxiYWNrUHJvY2Vzc29yLT5kZWxldGVTdHJlYW0oKTsKICAgICBtWnNsUHJvY2Vzc29yLT5kZWxldGVTdHJlYW0oKTsKIAorICAgIC8vIFJlbW92ZSBhbGwgWlNMIHN0cmVhbSBzdGF0ZSBiZWZvcmUgZGlzY29ubmVjdDsgbmVlZGVkIHRvIHdvcmsgYXJvdW5kIGIvMTU0MDgxMjguCisgICAgbVpzbFByb2Nlc3Nvci0+ZGlzY29ubmVjdCgpOworCiAgICAgQUxPR1YoIkNhbWVyYSAlZDogRGlzY29ubmVjdGluZyBkZXZpY2UiLCBtQ2FtZXJhSWQpOwogCiAgICAgbURldmljZS0+ZGlzY29ubmVjdCgpOwpAQCAtNzU2LDYgKzc3MSw3IEBACiAgICAgLy8gZXZlciB0YWtlIGEgcGljdHVyZS4KICAgICAvLyBUT0RPOiBGaW5kIGEgYmV0dGVyIGNvbXByb21pc2UsIHRob3VnaCB0aGlzIGxpa2VseSB3b3VsZCBpbnZvbHZlIEhBTAogICAgIC8vIGNoYW5nZXMuCisgICAgaW50IGxhc3RKcGVnU3RyZWFtSWQgPSBtSnBlZ1Byb2Nlc3Nvci0+Z2V0U3RyZWFtSWQoKTsKICAgICByZXMgPSB1cGRhdGVQcm9jZXNzb3JTdHJlYW0obUpwZWdQcm9jZXNzb3IsIHBhcmFtcyk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgcHJlLWNvbmZpZ3VyZSBzdGlsbCBpbWFnZSAiCkBAIC03NjMsNiArNzc5LDcgQEAKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQorICAgIGJvb2wganBlZ1N0cmVhbUNoYW5nZWQgPSBtSnBlZ1Byb2Nlc3Nvci0+Z2V0U3RyZWFtSWQoKSAhPSBsYXN0SnBlZ1N0cmVhbUlkOwogCiAgICAgVmVjdG9yPGludDMyX3Q+IG91dHB1dFN0cmVhbXM7CiAgICAgYm9vbCBjYWxsYmFja3NFbmFibGVkID0gKHBhcmFtcy5wcmV2aWV3Q2FsbGJhY2tGbGFncyAmCkBAIC04MTEsMTQgKzgyOCwyNCBAQAogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQogICAgIH0KLSAgICBpZiAocGFyYW1zLnpzbE1vZGUgJiYgIXBhcmFtcy5yZWNvcmRpbmdIaW50KSB7CisKKyAgICBpZiAocGFyYW1zLnpzbE1vZGUgJiYgIXBhcmFtcy5yZWNvcmRpbmdIaW50ICYmCisgICAgICAgICAgICBnZXRSZWNvcmRpbmdTdHJlYW1JZCgpID09IE5PX1NUUkVBTSkgewogICAgICAgICByZXMgPSB1cGRhdGVQcm9jZXNzb3JTdHJlYW0obVpzbFByb2Nlc3NvciwgcGFyYW1zKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFVuYWJsZSB0byB1cGRhdGUgWlNMIHN0cmVhbTogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KKworICAgICAgICBpZiAoanBlZ1N0cmVhbUNoYW5nZWQpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBDbGVhciBaU0wgYnVmZmVyIHF1ZXVlIHdoZW4gSnBlZyBzaXplIGlzIGNoYW5nZWQiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7CisgICAgICAgICAgICBtWnNsUHJvY2Vzc29yLT5jbGVhclpzbFF1ZXVlKCk7CisgICAgICAgIH0KICAgICAgICAgb3V0cHV0U3RyZWFtcy5wdXNoKGdldFpzbFN0cmVhbUlkKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1ac2xQcm9jZXNzb3ItPmRlbGV0ZVN0cmVhbSgpOwogICAgIH0KIAogICAgIG91dHB1dFN0cmVhbXMucHVzaChnZXRQcmV2aWV3U3RyZWFtSWQoKSk7CkBAIC04OTksNiArOTI2LDIwIEBACiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFdhaXRpbmcgdG8gc3RvcCBzdHJlYW1pbmcgZmFpbGVkOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIENsZWFuIHVwIHJlY29yZGluZyBzdHJlYW0KKyAgICAgICAgICAgIHJlcyA9IG1TdHJlYW1pbmdQcm9jZXNzb3ItPmRlbGV0ZVJlY29yZGluZ1N0cmVhbSgpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBVbmFibGUgdG8gZGVsZXRlIHJlY29yZGluZyBzdHJlYW0gYmVmb3JlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJzdG9wIHByZXZpZXc6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIElkZWFsbHkgd2Ugc2hvdWxkIHJlY292ZXIgdGhlIG92ZXJyaWRlIGFmdGVyIHJlY29yZGluZyBzdG9wcGVkLCBidXQKKyAgICAgICAgICAgICAgICAvLyByaWdodCBub3cgcmVjb3JkaW5nIHN0cmVhbSB3aWxsIGxpdmUgdW50aWwgaGVyZSwgc28gd2UgYXJlIGZvcmNlZCB0bworICAgICAgICAgICAgICAgIC8vIHJlY292ZXIgaGVyZS4gVE9ETzogZmluZCBhIGJldHRlciB3YXkgdG8gaGFuZGxlIHRoYXQgKGIvMTc0OTUxNjUpCisgICAgICAgICAgICAgICAgU2hhcmVkUGFyYW1ldGVyczo6TG9jayBsKG1QYXJhbWV0ZXJzKTsKKyAgICAgICAgICAgICAgICBsLm1QYXJhbWV0ZXJzLnJlY292ZXJPdmVycmlkZGVuSnBlZ1NpemUoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIG5vIGJyZWFrCiAgICAgICAgIGNhc2UgUGFyYW1ldGVyczo6V0FJVElOR19GT1JfUFJFVklFV19XSU5ET1c6IHsKICAgICAgICAgICAgIFNoYXJlZFBhcmFtZXRlcnM6OkxvY2sgbChtUGFyYW1ldGVycyk7CkBAIC05NjYsNiArMTAwNywxMCBAQAogICAgICAgICBjYXNlIFBhcmFtZXRlcnM6OlNUT1BQRUQ6CiAgICAgICAgICAgICByZXMgPSBzdGFydFByZXZpZXdMKHBhcmFtcywgZmFsc2UpOwogICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBmaXJzdCBwcmV2aWV3IHJlcXVlc3QgaXMgc3VibWl0dGVkIHRvIHRoZSBIQUwgZGV2aWNlIHRvIGF2b2lkCisgICAgICAgICAgICAvLyB0d28gY29uc2VjdXRpdmUgc2V0IG9mIGNvbmZpZ3VyZV9zdHJlYW1zIGJlaW5nIGNhbGxlZCBpbnRvIHRoZSBIQUwuCisgICAgICAgICAgICAvLyBUT0RPOiBSZWZhY3RvciB0aGlzIHRvIGF2b2lkIGluaXRpYWwgcHJldmlldyBjb25maWd1cmF0aW9uLgorICAgICAgICAgICAgc3luY1dpdGhEZXZpY2UoKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFBhcmFtZXRlcnM6OlBSRVZJRVc6CiAgICAgICAgICAgICAvLyBSZWFkeSB0byBnbwpAQCAtMTAxOSwxOCArMTA2NCw5NSBAQAogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQogICAgIH0KKworICAgIC8vIE9uIGN1cnJlbnQgSEFMcywgY2xlYW4gdXAgWlNMIGJlZm9yZSB0cmFuc2l0aW9uaW5nIGludG8gcmVjb3JkaW5nCisgICAgaWYgKG1EZXZpY2VWZXJzaW9uICE9IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8wKSB7CisgICAgICAgIGlmIChtWnNsUHJvY2Vzc29yLT5nZXRTdHJlYW1JZCgpICE9IE5PX1NUUkVBTSkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IENsZWFyaW5nIG91dCB6c2wgc3RyZWFtIGJlZm9yZSAiCisgICAgICAgICAgICAgICAgICAgICJjcmVhdGluZyByZWNvcmRpbmcgc3RyZWFtIiwgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOworICAgICAgICAgICAgcmVzID0gbVN0cmVhbWluZ1Byb2Nlc3Nvci0+c3RvcFN0cmVhbSgpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBzdG9wIHN0cmVhbWluZyB0byBkZWxldGUgY2FsbGJhY2sgc3RyZWFtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzID0gbURldmljZS0+d2FpdFVudGlsRHJhaW5lZCgpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBXYWl0aW5nIHRvIHN0b3Agc3RyZWFtaW5nIGZhaWxlZDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXMgPSBtWnNsUHJvY2Vzc29yLT5jbGVhclpzbFF1ZXVlKCk7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IGNsZWFyIHpzbCBxdWV1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcyA9IG1ac2xQcm9jZXNzb3ItPmRlbGV0ZVN0cmVhbSgpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBVbmFibGUgdG8gZGVsZXRlIHpzbCBzdHJlYW0gYmVmb3JlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZWNvcmQ6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICAvLyBEaXNhYmxlIGNhbGxiYWNrcyBpZiB0aGV5J3JlIGVuYWJsZWQ7IGNhbid0IHJlY29yZCBhbmQgdXNlIGNhbGxiYWNrcywKICAgICAvLyBhbmQgd2UgY2FuJ3QgZmFpbCByZWNvcmQgc3RhcnQgd2l0aG91dCBzdGFnZWZyaWdodCBhc3NlcnRpbmcuCiAgICAgcGFyYW1zLnByZXZpZXdDYWxsYmFja0ZsYWdzID0gMDsKIAotICAgIHJlcyA9IHVwZGF0ZVByb2Nlc3NvclN0cmVhbTwKLSAgICAgICAgICAgIFN0cmVhbWluZ1Byb2Nlc3NvciwKLSAgICAgICAgICAgICZTdHJlYW1pbmdQcm9jZXNzb3I6OnVwZGF0ZVJlY29yZGluZ1N0cmVhbT4obVN0cmVhbWluZ1Byb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zKTsKLSAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBVbmFibGUgdG8gdXBkYXRlIHJlY29yZGluZyBzdHJlYW06ICVzICglZCkiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICAgICAgcmV0dXJuIHJlczsKKyAgICBpZiAobURldmljZVZlcnNpb24gIT0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8yXzApIHsKKyAgICAgICAgLy8gRm9yIG5ld2VyIGRldmljZXMsIG1heSBuZWVkIHRvIHJlY29uZmlndXJlIHZpZGVvIHNuYXBzaG90IEpQRUcgc2l6ZXMKKyAgICAgICAgLy8gZHVyaW5nIHJlY29yZGluZyBzdGFydHVwLCBzbyBuZWVkIGEgbW9yZSBjb21wbGV4IHNlcXVlbmNlIGhlcmUgdG8KKyAgICAgICAgLy8gZW5zdXJlIGFuIGVhcmx5IHN0cmVhbSByZWNvbmZpZ3VyYXRpb24gZG9lc24ndCBoYXBwZW4KKyAgICAgICAgYm9vbCByZWNvcmRpbmdTdHJlYW1OZWVkc1VwZGF0ZTsKKyAgICAgICAgcmVzID0gbVN0cmVhbWluZ1Byb2Nlc3Nvci0+cmVjb3JkaW5nU3RyZWFtTmVlZHNVcGRhdGUocGFyYW1zLCAmcmVjb3JkaW5nU3RyZWFtTmVlZHNVcGRhdGUpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgcXVlcnkgcmVjb3JkaW5nIHN0cmVhbSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVjb3JkaW5nU3RyZWFtTmVlZHNVcGRhdGUpIHsKKyAgICAgICAgICAgIC8vIE5lZWQgdG8gc3RvcCBzdHJlYW0gaGVyZSBzbyB1cGRhdGVQcm9jZXNzb3JTdHJlYW0gd29uJ3QgdHJpZ2dlciBjb25maWd1cmVTdHJlYW0KKyAgICAgICAgICAgIC8vIFJpZ2h0IG5vdyBjYW1lcmEgZGV2aWNlIGNhbm5vdCBoYW5kbGUgY29uZmlndXJlU3RyZWFtIGZhaWx1cmUgZ3JhY2VmdWxseQorICAgICAgICAgICAgLy8gd2hlbiBkZXZpY2UgaXMgc3RyZWFtaW5nCisgICAgICAgICAgICByZXMgPSBtU3RyZWFtaW5nUHJvY2Vzc29yLT5zdG9wU3RyZWFtKCk7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IHN0b3Agc3RyZWFtaW5nIHRvIHVwZGF0ZSByZWNvcmQgIgorICAgICAgICAgICAgICAgICAgICAgICAgInN0cmVhbSIsIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzID0gbURldmljZS0+d2FpdFVudGlsRHJhaW5lZCgpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBXYWl0aW5nIHRvIHN0b3Agc3RyZWFtaW5nIGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgIiVzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXMgPSB1cGRhdGVQcm9jZXNzb3JTdHJlYW08CisgICAgICAgICAgICAgICAgICAgIFN0cmVhbWluZ1Byb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgJlN0cmVhbWluZ1Byb2Nlc3Nvcjo6dXBkYXRlUmVjb3JkaW5nU3RyZWFtPigKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1pbmdQcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBVbmFibGUgdG8gdXBkYXRlIHJlY29yZGluZyBzdHJlYW06ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gTWFpbnRhaW4gY2FsbCBzZXF1ZW5jaW5nIGZvciBIQUx2MiBkZXZpY2VzLgorICAgICAgICByZXMgPSB1cGRhdGVQcm9jZXNzb3JTdHJlYW08CisgICAgICAgICAgICAgICAgU3RyZWFtaW5nUHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICZTdHJlYW1pbmdQcm9jZXNzb3I6OnVwZGF0ZVJlY29yZGluZ1N0cmVhbT4obVN0cmVhbWluZ1Byb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFVuYWJsZSB0byB1cGRhdGUgcmVjb3JkaW5nIHN0cmVhbTogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KICAgICB9CiAKICAgICBWZWN0b3I8aW50MzJfdD4gb3V0cHV0U3RyZWFtczsKQEAgLTEwMzksNiArMTE2MSwxNiBAQAogCiAgICAgcmVzID0gbVN0cmVhbWluZ1Byb2Nlc3Nvci0+c3RhcnRTdHJlYW0oU3RyZWFtaW5nUHJvY2Vzc29yOjpSRUNPUkQsCiAgICAgICAgICAgICBvdXRwdXRTdHJlYW1zKTsKKworICAgIC8vIHN0YXJ0U3RyZWFtIG1pZ2h0IHRyaWdnZXIgYSBjb25maWd1cmVTdHJlYW0gY2FsbCBhbmQgZGV2aWNlIG1pZ2h0IGZhaWwKKyAgICAvLyBjb25maWd1cmVTdHJlYW0gZHVlIHRvIGpwZWcgc2l6ZSA+IHZpZGVvIHNpemUuIFRyeSBhZ2FpbiB3aXRoIGpwZWcgc2l6ZSBvdmVycmlkZGVuCisgICAgLy8gdG8gdmlkZW8gc2l6ZS4KKyAgICBpZiAocmVzID09IEJBRF9WQUxVRSkgeworICAgICAgICBvdmVycmlkZVZpZGVvU25hcHNob3RTaXplKHBhcmFtcyk7CisgICAgICAgIHJlcyA9IG1TdHJlYW1pbmdQcm9jZXNzb3ItPnN0YXJ0U3RyZWFtKFN0cmVhbWluZ1Byb2Nlc3Nvcjo6UkVDT1JELAorICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbXMpOworICAgIH0KKwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFVuYWJsZSB0byBzdGFydCByZWNvcmRpbmcgc3RyZWFtOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CkBAIC0xMTIzLDYgKzEyNTUsOCBAQAogICAgIHsKICAgICAgICAgU2hhcmVkUGFyYW1ldGVyczo6TG9jayBsKG1QYXJhbWV0ZXJzKTsKICAgICAgICAgaWYgKGwubVBhcmFtZXRlcnMuc3RhdGUgPCBQYXJhbWV0ZXJzOjpQUkVWSUVXKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FsbCBhdXRvRm9jdXMgd2hlbiBwcmV2aWV3IGlzIGluYWN0aXZlIChzdGF0ZSA9ICVkKS4iLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgbC5tUGFyYW1ldGVycy5zdGF0ZSk7CiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIH0KIApAQCAtMTE2NSw3ICsxMjk5LDcgQEAKICAgICAgICAgICogSGFuZGxlIHF1aXJrIG1vZGUgZm9yIEFGIGluIHNjZW5lIG1vZGVzCiAgICAgICAgICAqLwogICAgICAgICBpZiAobC5tUGFyYW1ldGVycy5xdWlya3MudHJpZ2dlckFmV2l0aEF1dG8gJiYKLSAgICAgICAgICAgICAgICBsLm1QYXJhbWV0ZXJzLnNjZW5lTW9kZSAhPSBBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9VTlNVUFBPUlRFRCAmJgorICAgICAgICAgICAgICAgIGwubVBhcmFtZXRlcnMuc2NlbmVNb2RlICE9IEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX0RJU0FCTEVEICYmCiAgICAgICAgICAgICAgICAgbC5tUGFyYW1ldGVycy5mb2N1c01vZGUgIT0gUGFyYW1ldGVyczo6Rk9DVVNfTU9ERV9BVVRPICYmCiAgICAgICAgICAgICAgICAgIWwubVBhcmFtZXRlcnMuZm9jdXNpbmdBcmVhc1swXS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIEFMT0dWKCIlczogUXVpcms6IFN3aXRjaGluZyBmcm9tIGZvY3VzTW9kZSAlZCB0byBBVVRPIiwKQEAgLTEyMjIsNiArMTM1Niw5IEBACiAKICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQorICAgICAgICBpZiAobC5tUGFyYW1ldGVycy56c2xNb2RlKSB7CisgICAgICAgICAgICBtWnNsUHJvY2Vzc29yLT5jbGVhclpzbFF1ZXVlKCk7CisgICAgICAgIH0KICAgICB9CiAgICAgc3luY1dpdGhEZXZpY2UoKTsKIApAQCAtMTI2OSwxMyArMTQwNiwyOCBAQAogCiAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBTdGFydGluZyBwaWN0dXJlIGNhcHR1cmUiLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7CiAKKyAgICAgICAgaW50IGxhc3RKcGVnU3RyZWFtSWQgPSBtSnBlZ1Byb2Nlc3Nvci0+Z2V0U3RyZWFtSWQoKTsKICAgICAgICAgcmVzID0gdXBkYXRlUHJvY2Vzc29yU3RyZWFtKG1KcGVnUHJvY2Vzc29yLCBsLm1QYXJhbWV0ZXJzKTsKKyAgICAgICAgLy8gSWYgdmlkZW8gc25hcHNob3QgZmFpbCB0byBjb25maWd1cmVTdHJlYW0sIHRyeSBvdmVycmlkZSB2aWRlbyBzbmFwc2hvdCBzaXplIHRvCisgICAgICAgIC8vIHZpZGVvIHNpemUKKyAgICAgICAgaWYgKHJlcyA9PSBCQURfVkFMVUUgJiYgbC5tUGFyYW1ldGVycy5zdGF0ZSA9PSBQYXJhbWV0ZXJzOjpWSURFT19TTkFQU0hPVCkgeworICAgICAgICAgICAgb3ZlcnJpZGVWaWRlb1NuYXBzaG90U2l6ZShsLm1QYXJhbWV0ZXJzKTsKKyAgICAgICAgICAgIHJlcyA9IHVwZGF0ZVByb2Nlc3NvclN0cmVhbShtSnBlZ1Byb2Nlc3NvciwgbC5tUGFyYW1ldGVycyk7CisgICAgICAgIH0KICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IHNldCB1cCBzdGlsbCBpbWFnZSBzdHJlYW06ICVzICglZCkiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CiAgICAgICAgIHRha2VQaWN0dXJlQ291bnRlciA9ICsrbC5tUGFyYW1ldGVycy50YWtlUGljdHVyZUNvdW50ZXI7CisKKyAgICAgICAgLy8gQ2xlYXIgWlNMIGJ1ZmZlciBxdWV1ZSB3aGVuIEpwZWcgc2l6ZSBpcyBjaGFuZ2VkLgorICAgICAgICBib29sIGpwZWdTdHJlYW1DaGFuZ2VkID0gbUpwZWdQcm9jZXNzb3ItPmdldFN0cmVhbUlkKCkgIT0gbGFzdEpwZWdTdHJlYW1JZDsKKyAgICAgICAgaWYgKGwubVBhcmFtZXRlcnMuenNsTW9kZSAmJiBqcGVnU3RyZWFtQ2hhbmdlZCkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IENsZWFyIFpTTCBidWZmZXIgcXVldWUgd2hlbiBKcGVnIHNpemUgaXMgY2hhbmdlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKKyAgICAgICAgICAgIG1ac2xQcm9jZXNzb3ItPmNsZWFyWnNsUXVldWUoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEFUUkFDRV9BU1lOQ19CRUdJTihrVGFrZXBpY3R1cmVMYWJlbCwgdGFrZVBpY3R1cmVDb3VudGVyKTsKQEAgLTEzMDEsOCArMTQ1MywxNCBAQAogCiAgICAgU2hhcmVkUGFyYW1ldGVyczo6TG9jayBsKG1QYXJhbWV0ZXJzKTsKIAorICAgIFBhcmFtZXRlcnM6OmZvY3VzTW9kZV90IGZvY3VzTW9kZUJlZm9yZSA9IGwubVBhcmFtZXRlcnMuZm9jdXNNb2RlOwogICAgIHJlcyA9IGwubVBhcmFtZXRlcnMuc2V0KHBhcmFtcyk7CiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKKyAgICBQYXJhbWV0ZXJzOjpmb2N1c01vZGVfdCBmb2N1c01vZGVBZnRlciA9IGwubVBhcmFtZXRlcnMuZm9jdXNNb2RlOworCisgICAgaWYgKGwubVBhcmFtZXRlcnMuenNsTW9kZSAmJiBmb2N1c01vZGVBZnRlciAhPSBmb2N1c01vZGVCZWZvcmUpIHsKKyAgICAgICAgbVpzbFByb2Nlc3Nvci0+Y2xlYXJac2xRdWV1ZSgpOworICAgIH0KIAogICAgIHJlcyA9IHVwZGF0ZVJlcXVlc3RzKGwubVBhcmFtZXRlcnMpOwogCkBAIC0xMzEzLDcgKzE0NzEsOCBAQAogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQiLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOwotICAgIGlmICggY2hlY2tQaWQoX19GVU5DVElPTl9fKSAhPSBPSykgcmV0dXJuIFN0cmluZzgoKTsKKyAgICAvLyBUaGUgY2FtZXJhIHNlcnZpY2UgY2FuIHVuY29uZGl0aW9uYWxseSBnZXQgdGhlIHBhcmFtZXRlcnMgYXQgYWxsIHRpbWVzCisgICAgaWYgKGdldENhbGxpbmdQaWQoKSAhPSBtU2VydmljZVBpZCAmJiBjaGVja1BpZChfX0ZVTkNUSU9OX18pICE9IE9LKSByZXR1cm4gU3RyaW5nOCgpOwogCiAgICAgU2hhcmVkUGFyYW1ldGVyczo6UmVhZExvY2sgbChtUGFyYW1ldGVycyk7CiAKQEAgLTEzOTMsNiArMTU1MiwxMyBAQAogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCisgICAgLy8gdGhlIGNhbWVyYTIgYXBpIGxlZ2FjeSBtb2RlIGNhbiB1bmNvbmRpdGlvbmFsbHkgZGlzYWJsZSB0aGUgc2h1dHRlciBzb3VuZAorICAgIGlmIChtTGVnYWN5TW9kZSkgeworICAgICAgICBBTE9HVigiJXM6IERpc2FibGUgc2h1dHRlciBzb3VuZCBpbiBsZWdhY3kgbW9kZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGwubVBhcmFtZXRlcnMucGxheVNodXR0ZXJTb3VuZCA9IGZhbHNlOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCiAgICAgLy8gRGlzYWJsaW5nIHNodXR0ZXIgc291bmQgbWF5IG5vdCBiZSBhbGxvd2VkLiBJbiB0aGF0IGNhc2Ugb25seQogICAgIC8vIGFsbG93IHRoZSBtZWRpYXNlcnZlciBwcm9jZXNzIHRvIGRpc2FibGUgdGhlIHNvdW5kLgogICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKQEAgLTE2NTgsOCArMTgyNCw4IEBACiB9CiAKIHN0YXR1c190IENhbWVyYTJDbGllbnQ6OnJlZ2lzdGVyRnJhbWVMaXN0ZW5lcihpbnQzMl90IG1pbklkLCBpbnQzMl90IG1heElkLAotICAgICAgICB3cDxjYW1lcmEyOjpGcmFtZVByb2Nlc3Nvcjo6RmlsdGVyZWRMaXN0ZW5lcj4gbGlzdGVuZXIpIHsKLSAgICByZXR1cm4gbUZyYW1lUHJvY2Vzc29yLT5yZWdpc3Rlckxpc3RlbmVyKG1pbklkLCBtYXhJZCwgbGlzdGVuZXIpOworICAgICAgICB3cDxjYW1lcmEyOjpGcmFtZVByb2Nlc3Nvcjo6RmlsdGVyZWRMaXN0ZW5lcj4gbGlzdGVuZXIsIGJvb2wgc2VuZFBhcnRpYWxzKSB7CisgICAgcmV0dXJuIG1GcmFtZVByb2Nlc3Nvci0+cmVnaXN0ZXJMaXN0ZW5lcihtaW5JZCwgbWF4SWQsIGxpc3RlbmVyLCBzZW5kUGFydGlhbHMpOwogfQogCiBzdGF0dXNfdCBDYW1lcmEyQ2xpZW50OjpyZW1vdmVGcmFtZUxpc3RlbmVyKGludDMyX3QgbWluSWQsIGludDMyX3QgbWF4SWQsCkBAIC0xODI4LDYgKzE5OTQsMTggQEAKICAgICByZXR1cm4gcmVzOwogfQogCitzdGF0dXNfdCBDYW1lcmEyQ2xpZW50OjpvdmVycmlkZVZpZGVvU25hcHNob3RTaXplKFBhcmFtZXRlcnMgJnBhcmFtcykgeworICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBjb25maWd1cmUgc3RpbGwgc2l6ZSB0byB2aWRlbyBzaXplIGJlZm9yZSByZWNvcmRpbmciCisgICAgICAgICAgICAsIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKKyAgICBwYXJhbXMub3ZlcnJpZGVKcGVnU2l6ZUJ5VmlkZW9TaXplKCk7CisgICAgc3RhdHVzX3QgcmVzID0gdXBkYXRlUHJvY2Vzc29yU3RyZWFtKG1KcGVnUHJvY2Vzc29yLCBwYXJhbXMpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IG92ZXJyaWRlIHZpZGVvIHNuYXBzaG90IHNpemUgdG8gdmlkZW8gc2l6ZTogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCiBjb25zdCBjaGFyKiBDYW1lcmEyQ2xpZW50OjprQXV0b2ZvY3VzTGFiZWwgPSAiYXV0b2ZvY3VzIjsKIGNvbnN0IGNoYXIqIENhbWVyYTJDbGllbnQ6OmtUYWtlcGljdHVyZUxhYmVsID0gInRha2VfcGljdHVyZSI7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmgKaW5kZXggZGZjZjgzNi4uYWJlZTc5NyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmgKQEAgLTkwLDcgKzkwLDcgQEAKICAgICAgICAgICAgIGludCBjbGllbnRQaWQsCiAgICAgICAgICAgICB1aWRfdCBjbGllbnRVaWQsCiAgICAgICAgICAgICBpbnQgc2VydmljZVBpZCwKLSAgICAgICAgICAgIGludCBkZXZpY2VWZXJzaW9uKTsKKyAgICAgICAgICAgIGJvb2wgbGVnYWN5TW9kZSk7CiAKICAgICB2aXJ0dWFsIH5DYW1lcmEyQ2xpZW50KCk7CiAKQEAgLTEyMCw3ICsxMjAsOCBAQAogICAgIGludCBnZXRac2xTdHJlYW1JZCgpIGNvbnN0OwogCiAgICAgc3RhdHVzX3QgcmVnaXN0ZXJGcmFtZUxpc3RlbmVyKGludDMyX3QgbWluSWQsIGludDMyX3QgbWF4SWQsCi0gICAgICAgICAgICB3cDxjYW1lcmEyOjpGcmFtZVByb2Nlc3Nvcjo6RmlsdGVyZWRMaXN0ZW5lcj4gbGlzdGVuZXIpOworICAgICAgICAgICAgd3A8Y2FtZXJhMjo6RnJhbWVQcm9jZXNzb3I6OkZpbHRlcmVkTGlzdGVuZXI+IGxpc3RlbmVyLAorICAgICAgICAgICAgYm9vbCBzZW5kUGFydGlhbHMgPSB0cnVlKTsKICAgICBzdGF0dXNfdCByZW1vdmVGcmFtZUxpc3RlbmVyKGludDMyX3QgbWluSWQsIGludDMyX3QgbWF4SWQsCiAgICAgICAgICAgICB3cDxjYW1lcmEyOjpGcmFtZVByb2Nlc3Nvcjo6RmlsdGVyZWRMaXN0ZW5lcj4gbGlzdGVuZXIpOwogCkBAIC0xNzIsNyArMTczLDYgQEAKIAogICAgIHZvaWQgICAgIHNldFByZXZpZXdDYWxsYmFja0ZsYWdMKFBhcmFtZXRlcnMgJnBhcmFtcywgaW50IGZsYWcpOwogICAgIHN0YXR1c190IHVwZGF0ZVJlcXVlc3RzKFBhcmFtZXRlcnMgJnBhcmFtcyk7Ci0gICAgaW50IG1EZXZpY2VWZXJzaW9uOwogCiAgICAgLy8gVXNlZCB3aXRoIHN0cmVhbSBJRHMKICAgICBzdGF0aWMgY29uc3QgaW50IE5PX1NUUkVBTSA9IC0xOwpAQCAtMjA2LDkgKzIwNiwxMyBAQAogICAgIGJvb2wgbUFmSW5Nb3Rpb247CiAKICAgICAvKiogVXRpbGl0eSBtZW1iZXJzICovCisgICAgYm9vbCBtTGVnYWN5TW9kZTsKIAogICAgIC8vIFdhaXQgdW50aWwgdGhlIGNhbWVyYSBkZXZpY2UgaGFzIHJlY2VpdmVkIHRoZSBsYXRlc3QgY29udHJvbCBzZXR0aW5ncwogICAgIHN0YXR1c190IHN5bmNXaXRoRGV2aWNlKCk7CisKKyAgICAvLyBWaWRlbyBzbmFwc2hvdCBqcGVnIHNpemUgb3ZlcnJpZGluZyBoZWxwZXIgZnVuY3Rpb24KKyAgICBzdGF0dXNfdCBvdmVycmlkZVZpZGVvU25hcHNob3RTaXplKFBhcmFtZXRlcnMgJnBhcmFtcyk7CiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuY3BwCmluZGV4IDJlM2EyZWQuLjc1YjNiNzIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5jcHAKQEAgLTM4LDcgKzM4LDcgQEAKICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAogICAgICAgICBpbnQgY2FtZXJhSWQsIGludCBjYW1lcmFGYWNpbmcsCiAgICAgICAgIGludCBjbGllbnRQaWQsIGludCBjbGllbnRVaWQsCi0gICAgICAgIGludCBzZXJ2aWNlUGlkKToKKyAgICAgICAgaW50IHNlcnZpY2VQaWQsIGJvb2wgbGVnYWN5TW9kZSk6CiAgICAgICAgIENsaWVudChjYW1lcmFTZXJ2aWNlLCBjYW1lcmFDbGllbnQsIGNsaWVudFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBjYW1lcmFGYWNpbmcsIGNsaWVudFBpZCwgY2xpZW50VWlkLCBzZXJ2aWNlUGlkKQogewpAQCAtNTQsNiArNTQsNyBAQAogICAgIC8vIENhbGxiYWNrIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQKICAgICBtUHJldmlld0NhbGxiYWNrRmxhZyA9IENBTUVSQV9GUkFNRV9DQUxMQkFDS19GTEFHX05PT1A7CiAgICAgbU9yaWVudGF0aW9uID0gZ2V0T3JpZW50YXRpb24oMCwgbUNhbWVyYUZhY2luZyA9PSBDQU1FUkFfRkFDSU5HX0ZST05UKTsKKyAgICBtTGVnYWN5TW9kZSA9IGxlZ2FjeU1vZGU7CiAgICAgbVBsYXlTaHV0dGVyU291bmQgPSB0cnVlOwogICAgIExPRzEoIkNhbWVyYUNsaWVudDo6Q2FtZXJhQ2xpZW50IFggKHBpZCAlZCwgaWQgJWQpIiwgY2FsbGluZ1BpZCwgY2FtZXJhSWQpOwogfQpAQCAtNzksMTMgKzgwLDEzIEBACiAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiB1bmFibGUgdG8gaW5pdGlhbGl6ZSBkZXZpY2U6ICVzICglZCkiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgbUhhcmR3YXJlLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAogICAgIG1IYXJkd2FyZS0+c2V0Q2FsbGJhY2tzKG5vdGlmeUNhbGxiYWNrLAogICAgICAgICAgICAgZGF0YUNhbGxiYWNrLAogICAgICAgICAgICAgZGF0YUNhbGxiYWNrVGltZXN0YW1wLAotICAgICAgICAgICAgKHZvaWQgKiltQ2FtZXJhSWQpOworICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KW1DYW1lcmFJZCk7CiAKICAgICAvLyBFbmFibGUgem9vbSwgZXJyb3IsIGZvY3VzLCBhbmQgbWV0YWRhdGEgbWVzc2FnZXMgYnkgZGVmYXVsdAogICAgIGVuYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19FUlJPUiB8IENBTUVSQV9NU0dfWk9PTSB8IENBTUVSQV9NU0dfRk9DVVMgfApAQCAtMTI1LDYgKzEyNiwxNiBAQAogICAgICAgICAgICAgbUNsaWVudFBpZCk7CiAgICAgbGVuID0gKGxlbiA+IFNJWkUgLSAxKSA/IFNJWkUgLSAxIDogbGVuOwogICAgIHdyaXRlKGZkLCBidWZmZXIsIGxlbik7CisKKyAgICBsZW4gPSBzbnByaW50ZihidWZmZXIsIFNJWkUsICJMYXRlc3Qgc2V0IHBhcmFtZXRlcnM6XG4iKTsKKyAgICBsZW4gPSAobGVuID4gU0laRSAtIDEpID8gU0laRSAtIDEgOiBsZW47CisgICAgd3JpdGUoZmQsIGJ1ZmZlciwgbGVuKTsKKworICAgIG1MYXRlc3RTZXRQYXJhbWV0ZXJzLmR1bXAoZmQsIGFyZ3MpOworCisgICAgY29uc3QgY2hhciAqZW5kZHVtcCA9ICJcblxuIjsKKyAgICB3cml0ZShmZCwgZW5kZHVtcCwgc3RybGVuKGVuZGR1bXApKTsKKwogICAgIHJldHVybiBtSGFyZHdhcmUtPmR1bXAoZmQsIGFyZ3MpOwogfQogCkBAIC01NTMsNiArNTY0LDcgQEAKICAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZEFuZEhhcmR3YXJlKCk7CiAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgcmV0dXJuIHJlc3VsdDsKIAorICAgIG1MYXRlc3RTZXRQYXJhbWV0ZXJzID0gQ2FtZXJhUGFyYW1ldGVycyhwYXJhbXMpOwogICAgIENhbWVyYVBhcmFtZXRlcnMgcChwYXJhbXMpOwogICAgIHJldHVybiBtSGFyZHdhcmUtPnNldFBhcmFtZXRlcnMocCk7CiB9CkBAIC01NjAsNyArNTcyLDggQEAKIC8vIGdldCBwcmV2aWV3L2NhcHR1cmUgcGFyYW1ldGVycyAtIGtleS92YWx1ZSBwYWlycwogU3RyaW5nOCBDYW1lcmFDbGllbnQ6OmdldFBhcmFtZXRlcnMoKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHJldHVybiBTdHJpbmc4KCk7CisgICAgLy8gVGhlIGNhbWVyYSBzZXJ2aWNlIGNhbiB1bmNvbmRpdGlvbmFsbHkgZ2V0IHRoZSBwYXJhbWV0ZXJzIGF0IGFsbCB0aW1lcworICAgIGlmIChnZXRDYWxsaW5nUGlkKCkgIT0gbVNlcnZpY2VQaWQgJiYgY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSByZXR1cm4gU3RyaW5nOCgpOwogCiAgICAgU3RyaW5nOCBwYXJhbXMobUhhcmR3YXJlLT5nZXRQYXJhbWV0ZXJzKCkuZmxhdHRlbigpKTsKICAgICBMT0cxKCJnZXRQYXJhbWV0ZXJzIChwaWQgJWQpICglcykiLCBnZXRDYWxsaW5nUGlkKCksIHBhcmFtcy5zdHJpbmcoKSk7CkBAIC01NzksNiArNTkyLDEzIEBACiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKKyAgICAvLyB0aGUgY2FtZXJhMiBhcGkgbGVnYWN5IG1vZGUgY2FuIHVuY29uZGl0aW9uYWxseSBkaXNhYmxlIHRoZSBzaHV0dGVyIHNvdW5kCisgICAgaWYgKG1MZWdhY3lNb2RlKSB7CisgICAgICAgIEFMT0dWKCIlczogRGlzYWJsZSBzaHV0dGVyIHNvdW5kIGluIGxlZ2FjeSBtb2RlIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgbVBsYXlTaHV0dGVyU291bmQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKwogICAgIC8vIERpc2FibGluZyBzaHV0dGVyIHNvdW5kIG1heSBub3QgYmUgYWxsb3dlZC4gSW4gdGhhdCBjYXNlIG9ubHkKICAgICAvLyBhbGxvdyB0aGUgbWVkaWFzZXJ2ZXIgcHJvY2VzcyB0byBkaXNhYmxlIHRoZSBzb3VuZC4KICAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CkBAIC05MzMsNyArOTUzLDIwIEBACiAgICAgfQogICAgIHByZXZpZXdCdWZmZXIgPSBtUHJldmlld0J1ZmZlcjsKIAotICAgIG1lbWNweShwcmV2aWV3QnVmZmVyLT5iYXNlKCksICh1aW50OF90ICopaGVhcC0+YmFzZSgpICsgb2Zmc2V0LCBzaXplKTsKKyAgICB2b2lkKiBwcmV2aWV3QnVmZmVyQmFzZSA9IHByZXZpZXdCdWZmZXItPmJhc2UoKTsKKyAgICB2b2lkKiBoZWFwQmFzZSA9IGhlYXAtPmJhc2UoKTsKKworICAgIGlmIChoZWFwQmFzZSA9PSBNQVBfRkFJTEVEKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIG1tYXAgaGVhcCBmb3IgcHJldmlldyBmcmFtZS4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAocHJldmlld0J1ZmZlckJhc2UgPT0gTUFQX0ZBSUxFRCkgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBtbWFwIHByZXZpZXcgYnVmZmVyIGZvciBwcmV2aWV3IGZyYW1lLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbWVtY3B5KHByZXZpZXdCdWZmZXJCYXNlLCAodWludDhfdCAqKSBoZWFwQmFzZSArIG9mZnNldCwgc2l6ZSk7CiAKICAgICBzcDxNZW1vcnlCYXNlPiBmcmFtZSA9IG5ldyBNZW1vcnlCYXNlKHByZXZpZXdCdWZmZXIsIDAsIHNpemUpOwogICAgIGlmIChmcmFtZSA9PSAwKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuaAppbmRleCBhMjcwZjkwLi5lZGExYTlmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmgKQEAgLTY0LDcgKzY0LDggQEAKICAgICAgICAgICAgIGludCBjYW1lcmFGYWNpbmcsCiAgICAgICAgICAgICBpbnQgY2xpZW50UGlkLAogICAgICAgICAgICAgaW50IGNsaWVudFVpZCwKLSAgICAgICAgICAgIGludCBzZXJ2aWNlUGlkKTsKKyAgICAgICAgICAgIGludCBzZXJ2aWNlUGlkLAorICAgICAgICAgICAgYm9vbCBsZWdhY3lNb2RlID0gZmFsc2UpOwogICAgIH5DYW1lcmFDbGllbnQoKTsKIAogICAgIHN0YXR1c190IGluaXRpYWxpemUoY2FtZXJhX21vZHVsZV90ICptb2R1bGUpOwpAQCAtMTMxLDYgKzEzMiw3IEBACiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJldmlld0NhbGxiYWNrRmxhZzsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PcmllbnRhdGlvbjsgICAgIC8vIEN1cnJlbnQgZGlzcGxheSBvcmllbnRhdGlvbgogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXlTaHV0dGVyU291bmQ7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGVnYWN5TW9kZTsgLy8gY2FtZXJhMiBhcGkgbGVnYWN5IG1vZGU/CiAKICAgICAvLyBFbnN1cmVzIGF0b21pY2l0eSBhbW9uZyB0aGUgcHVibGljIG1ldGhvZHMKICAgICBtdXRhYmxlIE11dGV4ICAgICAgICAgICAgICAgICAgIG1Mb2NrOwpAQCAtMTQyLDYgKzE0NCw5IEBACiAgICAgLy8gb2YgdGhlIG9yaWdpbmFsIG9uZSksIHdlIGFsbG9jYXRlIG1QcmV2aWV3QnVmZmVyIGFuZCByZXVzZSBpdCBpZiBwb3NzaWJsZS4KICAgICBzcDxNZW1vcnlIZWFwQmFzZT4gICAgICAgICAgICAgIG1QcmV2aWV3QnVmZmVyOwogCisgICAgLy8gRGVidWdnaW5nIGluZm9ybWF0aW9uCisgICAgQ2FtZXJhUGFyYW1ldGVycyAgICAgICAgICAgICAgICBtTGF0ZXN0U2V0UGFyYW1ldGVyczsKKwogICAgIC8vIFdlIG5lZWQgdG8gYXZvaWQgdGhlIGRlYWRsb2NrIHdoZW4gdGhlIGluY29taW5nIGNvbW1hbmQgdGhyZWFkIGFuZAogICAgIC8vIHRoZSBDYW1lcmFIYXJkd2FyZUludGVyZmFjZSBjYWxsYmFjayB0aHJlYWQgYm90aCB3YW50IHRvIGdyYWIgbUxvY2suCiAgICAgLy8gQW4gZXh0cmEgZmxhZyBpcyB1c2VkIHRvIHRlbGwgdGhlIGNhbGxiYWNrIHRocmVhZCB0aGF0IGl0IHNob3VsZCBzdG9wCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FsbGJhY2tQcm9jZXNzb3IuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhbGxiYWNrUHJvY2Vzc29yLmNwcAppbmRleCBkMmFjNzljLi5iZjMzMThlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FsbGJhY2tQcm9jZXNzb3IuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5jcHAKQEAgLTExMCwxMSArMTEwLDEzIEBACiAgICAgaWYgKCFtQ2FsbGJhY2tUb0FwcCAmJiBtQ2FsbGJhY2tDb25zdW1lciA9PSAwKSB7CiAgICAgICAgIC8vIENyZWF0ZSBDUFUgYnVmZmVyIHF1ZXVlIGVuZHBvaW50LCBzaW5jZSBhcHAgaGFzbid0IGdpdmVuIHVzIG9uZQogICAgICAgICAvLyBNYWtlIGl0IGFzeW5jIHRvIGF2b2lkIGRpc2Nvbm5lY3QgZGVhZGxvY2tzCi0gICAgICAgIHNwPEJ1ZmZlclF1ZXVlPiBicSA9IG5ldyBCdWZmZXJRdWV1ZSgpOwotICAgICAgICBtQ2FsbGJhY2tDb25zdW1lciA9IG5ldyBDcHVDb25zdW1lcihicSwga0NhbGxiYWNrSGVhcENvdW50KTsKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gcHJvZHVjZXI7CisgICAgICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IGNvbnN1bWVyOworICAgICAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJnByb2R1Y2VyLCAmY29uc3VtZXIpOworICAgICAgICBtQ2FsbGJhY2tDb25zdW1lciA9IG5ldyBDcHVDb25zdW1lcihjb25zdW1lciwga0NhbGxiYWNrSGVhcENvdW50KTsKICAgICAgICAgbUNhbGxiYWNrQ29uc3VtZXItPnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIodGhpcyk7CiAgICAgICAgIG1DYWxsYmFja0NvbnN1bWVyLT5zZXROYW1lKFN0cmluZzgoIkNhbWVyYTJDbGllbnQ6OkNhbGxiYWNrQ29uc3VtZXIiKSk7Ci0gICAgICAgIG1DYWxsYmFja1dpbmRvdyA9IG5ldyBTdXJmYWNlKGJxKTsKKyAgICAgICAgbUNhbGxiYWNrV2luZG93ID0gbmV3IFN1cmZhY2UocHJvZHVjZXIpOwogICAgIH0KIAogICAgIGlmIChtQ2FsbGJhY2tTdHJlYW1JZCAhPSBOT19TVFJFQU0pIHsKQEAgLTE1Myw3ICsxNTUsNyBAQAogICAgICAgICAgICAgICAgIGNhbGxiYWNrRm9ybWF0LCBwYXJhbXMucHJldmlld0Zvcm1hdCk7CiAgICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlU3RyZWFtKG1DYWxsYmFja1dpbmRvdywKICAgICAgICAgICAgICAgICBwYXJhbXMucHJldmlld1dpZHRoLCBwYXJhbXMucHJldmlld0hlaWdodCwKLSAgICAgICAgICAgICAgICBjYWxsYmFja0Zvcm1hdCwgMCwgJm1DYWxsYmFja1N0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICBjYWxsYmFja0Zvcm1hdCwgJm1DYWxsYmFja1N0cmVhbUlkKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IGNyZWF0ZSBvdXRwdXQgc3RyZWFtIGZvciBjYWxsYmFja3M6ICIKICAgICAgICAgICAgICAgICAgICAgIiVzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1JZCwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmNwcAppbmRleCA4YTRjZTRlLi45ODQ5ZjRkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuY3BwCkBAIC0xOCw2ICsxOCw4IEBACiAjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgpAQCAtMTA0LDEzICsxMDYsMTIgQEAKICAgICB9CiB9CiAKLXZvaWQgQ2FwdHVyZVNlcXVlbmNlcjo6b25GcmFtZUF2YWlsYWJsZShpbnQzMl90IHJlcXVlc3RJZCwKLSAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmZyYW1lKSB7Ci0gICAgQUxPR1YoIiVzOiBMaXN0ZW5lciBmb3VuZCBuZXcgZnJhbWUiLCBfX0ZVTkNUSU9OX18pOwordm9pZCBDYXB0dXJlU2VxdWVuY2VyOjpvblJlc3VsdEF2YWlsYWJsZShjb25zdCBDYXB0dXJlUmVzdWx0ICZyZXN1bHQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOworICAgIEFMT0dWKCIlczogTmV3IHJlc3VsdCBhdmFpbGFibGUuIiwgX19GVU5DVElPTl9fKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5wdXRNdXRleCk7Ci0gICAgbU5ld0ZyYW1lSWQgPSByZXF1ZXN0SWQ7Ci0gICAgbU5ld0ZyYW1lID0gZnJhbWU7CisgICAgbU5ld0ZyYW1lSWQgPSByZXN1bHQubVJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQ7CisgICAgbU5ld0ZyYW1lID0gcmVzdWx0Lm1NZXRhZGF0YTsKICAgICBpZiAoIW1OZXdGcmFtZVJlY2VpdmVkKSB7CiAgICAgICAgIG1OZXdGcmFtZVJlY2VpdmVkID0gdHJ1ZTsKICAgICAgICAgbU5ld0ZyYW1lU2lnbmFsLnNpZ25hbCgpOwpAQCAtMzQ5LDggKzM1MCwxMCBAQAogICAgICAgICByZXR1cm4gRE9ORTsKICAgICB9CiAKKyAgICAvLyBXZSBkb24ndCB3YW50IHRvIGdldCBwYXJ0aWFsIHJlc3VsdHMgZm9yIFpTTCBjYXB0dXJlLgogICAgIGNsaWVudC0+cmVnaXN0ZXJGcmFtZUxpc3RlbmVyKG1DYXB0dXJlSWQsIG1DYXB0dXJlSWQgKyAxLAotICAgICAgICAgICAgdGhpcyk7CisgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgLypzZW5kUGFydGlhbHMqL2ZhbHNlKTsKIAogICAgIC8vIFRPRE86IEFjdHVhbGx5IHNlbGVjdCB0aGUgcmlnaHQgdGhpbmcgaGVyZS4KICAgICByZXMgPSBwcm9jZXNzb3ItPnB1c2hUb1JlcHJvY2VzcyhtQ2FwdHVyZUlkKTsKQEAgLTM5Miw4ICszOTUsMTQgQEAKIAogICAgIGJvb2wgaXNBZUNvbnZlcmdlZCA9IGZhbHNlOwogICAgIC8vIEdldCB0aGUgb25GcmFtZUF2YWlsYWJsZSBjYWxsYmFjayB3aGVuIHRoZSByZXF1ZXN0SUQgPT0gbUNhcHR1cmVJZAorICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gZ2V0IHBhcnRpYWwgcmVzdWx0cyBmb3Igbm9ybWFsIGNhcHR1cmUsIGFzIHdlIG5lZWQKKyAgICAvLyBHZXQgQU5EUk9JRF9TRU5TT1JfVElNRVNUQU1QIGZyb20gdGhlIGNhcHR1cmUgcmVzdWx0LCBidXQgcGFydGlhbAorICAgIC8vIHJlc3VsdCBkb2Vzbid0IGhhdmUgdG8gaGF2ZSB0aGlzIG1ldGFkYXRhIGF2YWlsYWJsZS4KKyAgICAvLyBUT0RPOiBVcGRhdGUgdG8gdXNlIHRoZSBIQUx2MyBzaHV0dGVyIG5vdGlmaWNhdGlvbiBmb3IgcmVtb3ZlIHRoZQorICAgIC8vIG5lZWQgZm9yIHRoaXMgbGlzdGVuZXIgYW5kIG1ha2UgaXQgZmFzdGVyLiBzZWUgYnVnIDEyNTMwNjI4LgogICAgIGNsaWVudC0+cmVnaXN0ZXJGcmFtZUxpc3RlbmVyKG1DYXB0dXJlSWQsIG1DYXB0dXJlSWQgKyAxLAotICAgICAgICAgICAgdGhpcyk7CisgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgLypzZW5kUGFydGlhbHMqL2ZhbHNlKTsKIAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUlucHV0TXV0ZXgpOwpAQCAtNDM2LDExICs0NDUsMTggQEAKICAgICBpZiAobU5ld0FFU3RhdGUpIHsKICAgICAgICAgaWYgKCFtQWVJblByZWNhcHR1cmUpIHsKICAgICAgICAgICAgIC8vIFdhaXRpbmcgdG8gc2VlIFBSRUNBUFRVUkUgc3RhdGUKLSAgICAgICAgICAgIGlmIChtQUVUcmlnZ2VySWQgPT0gbVRyaWdnZXJJZCAmJgotICAgICAgICAgICAgICAgICAgICBtQUVTdGF0ZSA9PSBBTkRST0lEX0NPTlRST0xfQUVfU1RBVEVfUFJFQ0FQVFVSRSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCIlczogR290IHByZWNhcHR1cmUgc3RhcnQiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICAgICAgICAgIG1BZUluUHJlY2FwdHVyZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbVRpbWVvdXRDb3VudCA9IGtNYXhUaW1lb3V0c0ZvclByZWNhcHR1cmVFbmQ7CisgICAgICAgICAgICBpZiAobUFFVHJpZ2dlcklkID09IG1UcmlnZ2VySWQpIHsKKyAgICAgICAgICAgICAgICBpZiAobUFFU3RhdGUgPT0gQU5EUk9JRF9DT05UUk9MX0FFX1NUQVRFX1BSRUNBUFRVUkUpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBHb3QgcHJlY2FwdHVyZSBzdGFydCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgIG1BZUluUHJlY2FwdHVyZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG1UaW1lb3V0Q291bnQgPSBrTWF4VGltZW91dHNGb3JQcmVjYXB0dXJlRW5kOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUFFU3RhdGUgPT0gQU5EUk9JRF9DT05UUk9MX0FFX1NUQVRFX0NPTlZFUkdFRCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgbUFFU3RhdGUgPT0gQU5EUk9JRF9DT05UUk9MX0FFX1NUQVRFX0ZMQVNIX1JFUVVJUkVEKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEl0IGlzIGxlZ2FsIHRvIHRyYW5zaXQgdG8gQ09OVkVSR0VEIG9yIEZMQVNIX1JFUVVJUkVECisgICAgICAgICAgICAgICAgICAgIC8vIGRpcmVjdGx5IGFmdGVyIGEgdHJpZ2dlci4KKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBBRSBpcyBhbHJlYWR5IGluIGdvb2Qgc3RhdGUsIHN0YXJ0IGNhcHR1cmUiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1RBTkRBUkRfQ0FQVFVSRTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBXYWl0aW5nIHRvIHNlZSBQUkVDQVBUVVJFIHN0YXRlIGVuZApAQCAtNTgzLDEyICs1OTksMTUgQEAKICAgICAgICAgZW50cnkgPSBtTmV3RnJhbWUuZmluZChBTkRST0lEX1NFTlNPUl9USU1FU1RBTVApOwogICAgICAgICBpZiAoZW50cnkuY291bnQgPT0gMCkgewogICAgICAgICAgICAgQUxPR0UoIk5vIHRpbWVzdGFtcCBmaWVsZCBpbiBjYXB0dXJlIGZyYW1lISIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChlbnRyeS5kYXRhLmk2NFswXSAhPSBtQ2FwdHVyZVRpbWVzdGFtcCkgewotICAgICAgICAgICAgQUxPR1coIk1pc21hdGNoZWQgY2FwdHVyZSB0aW1lc3RhbXBzOiBNZXRhZGF0YSBmcmFtZSAlbGxkLCIKLSAgICAgICAgICAgICAgICAgICAgIiBjYXB0dXJlZCBidWZmZXIgJWxsZCIsCi0gICAgICAgICAgICAgICAgICAgIGVudHJ5LmRhdGEuaTY0WzBdLAotICAgICAgICAgICAgICAgICAgICBtQ2FwdHVyZVRpbWVzdGFtcCk7CisgICAgICAgIH0gZWxzZSBpZiAoZW50cnkuY291bnQgPT0gMSkgeworICAgICAgICAgICAgaWYgKGVudHJ5LmRhdGEuaTY0WzBdICE9IG1DYXB0dXJlVGltZXN0YW1wKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIk1pc21hdGNoZWQgY2FwdHVyZSB0aW1lc3RhbXBzOiBNZXRhZGF0YSBmcmFtZSAlIiBQUklkNjQgIiwiCisgICAgICAgICAgICAgICAgICAgICAgICAiIGNhcHR1cmVkIGJ1ZmZlciAlIiBQUklkNjQsCisgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5kYXRhLmk2NFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DYXB0dXJlVGltZXN0YW1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJUaW1lc3RhbXAgbWV0YWRhdGEgaXMgbWFsZm9ybWVkISIpOwogICAgICAgICB9CiAgICAgICAgIGNsaWVudC0+cmVtb3ZlRnJhbWVMaXN0ZW5lcihtQ2FwdHVyZUlkLCBtQ2FwdHVyZUlkICsgMSwgdGhpcyk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5oCmluZGV4IDlmYjRlZTcuLmQ0MmFiMTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuaApAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvQ29uZGl0aW9uLmg+CiAjaW5jbHVkZSAiY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmgiCisjaW5jbHVkZSAiY2FtZXJhL0NhcHR1cmVSZXN1bHQuaCIKICNpbmNsdWRlICJQYXJhbWV0ZXJzLmgiCiAjaW5jbHVkZSAiRnJhbWVQcm9jZXNzb3IuaCIKIApAQCAtNjEsOCArNjIsOCBAQAogICAgIC8vIE5vdGlmaWNhdGlvbnMgYWJvdXQgQUUgc3RhdGUgY2hhbmdlcwogICAgIHZvaWQgbm90aWZ5QXV0b0V4cG9zdXJlKHVpbnQ4X3QgbmV3U3RhdGUsIGludCB0cmlnZ2VySWQpOwogCi0gICAgLy8gTm90aWZpY2F0aW9ucyBmcm9tIHRoZSBmcmFtZSBwcm9jZXNzb3IKLSAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZUF2YWlsYWJsZShpbnQzMl90IHJlcXVlc3RJZCwgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmZyYW1lKTsKKyAgICAvLyBOb3RpZmljYXRpb24gZnJvbSB0aGUgZnJhbWUgcHJvY2Vzc29yCisgICAgdmlydHVhbCB2b2lkIG9uUmVzdWx0QXZhaWxhYmxlKGNvbnN0IENhcHR1cmVSZXN1bHQgJnJlc3VsdCk7CiAKICAgICAvLyBOb3RpZmljYXRpb25zIGZyb20gdGhlIEpQRUcgcHJvY2Vzc29yCiAgICAgdm9pZCBvbkNhcHR1cmVBdmFpbGFibGUobnNlY3NfdCB0aW1lc3RhbXAsIHNwPE1lbW9yeUJhc2U+IGNhcHR1cmVCdWZmZXIpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5jcHAKaW5kZXggMTlhY2FlNC4uMzEyYTc4YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuY3BwCkBAIC00MCw3ICs0MCwxMiBAQAogCiAgICAgewogICAgICAgICBTaGFyZWRQYXJhbWV0ZXJzOjpMb2NrIGwoY2xpZW50LT5nZXRQYXJhbWV0ZXJzKCkpOwotICAgICAgICBtVXNlUGFydGlhbFF1aXJrID0gbC5tUGFyYW1ldGVycy5xdWlya3MucGFydGlhbFJlc3VsdHM7CisKKyAgICAgICAgaWYgKGNsaWVudC0+Z2V0Q2FtZXJhRGV2aWNlVmVyc2lvbigpID49IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yKSB7CisgICAgICAgICAgICBtVXNlUGFydGlhbFJlc3VsdCA9IChtTnVtUGFydGlhbFJlc3VsdHMgPiAxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Vc2VQYXJ0aWFsUmVzdWx0ID0gbC5tUGFyYW1ldGVycy5xdWlya3MucGFydGlhbFJlc3VsdHM7CisgICAgICAgIH0KIAogICAgICAgICAvLyBJbml0aWFsaXplIHN0YXJ0aW5nIDNBIHN0YXRlCiAgICAgICAgIG0zYVN0YXRlLmFmVHJpZ2dlcklkID0gbC5tUGFyYW1ldGVycy5hZlRyaWdnZXJDb3VudGVyOwpAQCAtNTUsNyArNjAsNyBAQAogRnJhbWVQcm9jZXNzb3I6On5GcmFtZVByb2Nlc3NvcigpIHsKIH0KIAotYm9vbCBGcmFtZVByb2Nlc3Nvcjo6cHJvY2Vzc1NpbmdsZUZyYW1lKENhbWVyYU1ldGFkYXRhICZmcmFtZSwKK2Jvb2wgRnJhbWVQcm9jZXNzb3I6OnByb2Nlc3NTaW5nbGVGcmFtZShDYXB0dXJlUmVzdWx0ICZmcmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxDYW1lcmFEZXZpY2VCYXNlPiAmZGV2aWNlKSB7CiAKICAgICBzcDxDYW1lcmEyQ2xpZW50PiBjbGllbnQgPSBtQ2xpZW50LnByb21vdGUoKTsKQEAgLTYzLDE3ICs2OCwyMSBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgYm9vbCBwYXJ0aWFsUmVzdWx0ID0gZmFsc2U7Ci0gICAgaWYgKG1Vc2VQYXJ0aWFsUXVpcmspIHsKLSAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgZW50cnk7Ci0gICAgICAgIGVudHJ5ID0gZnJhbWUuZmluZChBTkRST0lEX1FVSVJLU19QQVJUSUFMX1JFU1VMVCk7Ci0gICAgICAgIGlmIChlbnRyeS5jb3VudCA+IDAgJiYKLSAgICAgICAgICAgICAgICBlbnRyeS5kYXRhLnU4WzBdID09IEFORFJPSURfUVVJUktTX1BBUlRJQUxfUkVTVUxUX1BBUlRJQUwpIHsKLSAgICAgICAgICAgIHBhcnRpYWxSZXN1bHQgPSB0cnVlOworICAgIGJvb2wgaXNQYXJ0aWFsUmVzdWx0ID0gZmFsc2U7CisgICAgaWYgKG1Vc2VQYXJ0aWFsUmVzdWx0KSB7CisgICAgICAgIGlmIChjbGllbnQtPmdldENhbWVyYURldmljZVZlcnNpb24oKSA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgeworICAgICAgICAgICAgaXNQYXJ0aWFsUmVzdWx0ID0gZnJhbWUubVJlc3VsdEV4dHJhcy5wYXJ0aWFsUmVzdWx0Q291bnQgPCBtTnVtUGFydGlhbFJlc3VsdHM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBlbnRyeTsKKyAgICAgICAgICAgIGVudHJ5ID0gZnJhbWUubU1ldGFkYXRhLmZpbmQoQU5EUk9JRF9RVUlSS1NfUEFSVElBTF9SRVNVTFQpOworICAgICAgICAgICAgaWYgKGVudHJ5LmNvdW50ID4gMCAmJgorICAgICAgICAgICAgICAgICAgICBlbnRyeS5kYXRhLnU4WzBdID09IEFORFJPSURfUVVJUktTX1BBUlRJQUxfUkVTVUxUX1BBUlRJQUwpIHsKKyAgICAgICAgICAgICAgICBpc1BhcnRpYWxSZXN1bHQgPSB0cnVlOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKCFwYXJ0aWFsUmVzdWx0ICYmIHByb2Nlc3NGYWNlRGV0ZWN0KGZyYW1lLCBjbGllbnQpICE9IE9LKSB7CisgICAgaWYgKCFpc1BhcnRpYWxSZXN1bHQgJiYgcHJvY2Vzc0ZhY2VEZXRlY3QoZnJhbWUubU1ldGFkYXRhLCBjbGllbnQpICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKQEAgLTE2OCw3ICsxNzcsNyBAQAogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGZhY2VTY29yZXNbaV0gPiAxMDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiJXM6IEZhY2UgaW5kZXggJWQgd2l0aCBvdXQgb2YgcmFuZ2Ugc2NvcmUgJWQiLAorICAgICAgICAgICAgICAgIEFMT0dXKCIlczogRmFjZSBpbmRleCAlenUgd2l0aCBvdXQgb2YgcmFuZ2Ugc2NvcmUgJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpLCBmYWNlU2NvcmVzW2ldKTsKICAgICAgICAgICAgIH0KIApAQCAtMjEyLDE0ICsyMjEsMTUgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IEZyYW1lUHJvY2Vzc29yOjpwcm9jZXNzM2FTdGF0ZShjb25zdCBDYW1lcmFNZXRhZGF0YSAmZnJhbWUsCitzdGF0dXNfdCBGcmFtZVByb2Nlc3Nvcjo6cHJvY2VzczNhU3RhdGUoY29uc3QgQ2FwdHVyZVJlc3VsdCAmZnJhbWUsCiAgICAgICAgIGNvbnN0IHNwPENhbWVyYTJDbGllbnQ+ICZjbGllbnQpIHsKIAogICAgIEFUUkFDRV9DQUxMKCk7CisgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJm1ldGFkYXRhID0gZnJhbWUubU1ldGFkYXRhOwogICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGVudHJ5OwogICAgIGludCBjYW1lcmFJZCA9IGNsaWVudC0+Z2V0Q2FtZXJhSWQoKTsKIAotICAgIGVudHJ5ID0gZnJhbWUuZmluZChBTkRST0lEX1JFUVVFU1RfRlJBTUVfQ09VTlQpOworICAgIGVudHJ5ID0gbWV0YWRhdGEuZmluZChBTkRST0lEX1JFUVVFU1RfRlJBTUVfQ09VTlQpOwogICAgIGludDMyX3QgZnJhbWVOdW1iZXIgPSBlbnRyeS5kYXRhLmkzMlswXTsKIAogICAgIC8vIERvbid0IHNlbmQgM0Egbm90aWZpY2F0aW9ucyBmb3IgdGhlIHNhbWUgZnJhbWUgbnVtYmVyIHR3aWNlCkBAIC0yMzgsMjYgKzI0OCwzMSBAQAogCiAgICAgLy8gVE9ETzogQWxzbyB1c2UgQUUgbW9kZSwgQUUgdHJpZ2dlciBJRAogCi0gICAgZ290QWxsU3RhdGVzICY9IGdldDNhUmVzdWx0PHVpbnQ4X3Q+KGZyYW1lLCBBTkRST0lEX0NPTlRST0xfQUZfTU9ERSwKKyAgICBnb3RBbGxTdGF0ZXMgJj0gZ2V0M2FSZXN1bHQ8dWludDhfdD4obWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BRl9NT0RFLAogICAgICAgICAgICAgJm5ldzNhU3RhdGUuYWZNb2RlLCBmcmFtZU51bWJlciwgY2FtZXJhSWQpOwogCi0gICAgZ290QWxsU3RhdGVzICY9IGdldDNhUmVzdWx0PHVpbnQ4X3Q+KGZyYW1lLCBBTkRST0lEX0NPTlRST0xfQVdCX01PREUsCisgICAgZ290QWxsU3RhdGVzICY9IGdldDNhUmVzdWx0PHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQVdCX01PREUsCiAgICAgICAgICAgICAmbmV3M2FTdGF0ZS5hd2JNb2RlLCBmcmFtZU51bWJlciwgY2FtZXJhSWQpOwogCi0gICAgZ290QWxsU3RhdGVzICY9IGdldDNhUmVzdWx0PHVpbnQ4X3Q+KGZyYW1lLCBBTkRST0lEX0NPTlRST0xfQUVfU1RBVEUsCisgICAgZ290QWxsU3RhdGVzICY9IGdldDNhUmVzdWx0PHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUVfU1RBVEUsCiAgICAgICAgICAgICAmbmV3M2FTdGF0ZS5hZVN0YXRlLCBmcmFtZU51bWJlciwgY2FtZXJhSWQpOwogCi0gICAgZ290QWxsU3RhdGVzICY9IGdldDNhUmVzdWx0PHVpbnQ4X3Q+KGZyYW1lLCBBTkRST0lEX0NPTlRST0xfQUZfU1RBVEUsCisgICAgZ290QWxsU3RhdGVzICY9IGdldDNhUmVzdWx0PHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUZfU1RBVEUsCiAgICAgICAgICAgICAmbmV3M2FTdGF0ZS5hZlN0YXRlLCBmcmFtZU51bWJlciwgY2FtZXJhSWQpOwogCi0gICAgZ290QWxsU3RhdGVzICY9IGdldDNhUmVzdWx0PHVpbnQ4X3Q+KGZyYW1lLCBBTkRST0lEX0NPTlRST0xfQVdCX1NUQVRFLAorICAgIGdvdEFsbFN0YXRlcyAmPSBnZXQzYVJlc3VsdDx1aW50OF90PihtZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FXQl9TVEFURSwKICAgICAgICAgICAgICZuZXczYVN0YXRlLmF3YlN0YXRlLCBmcmFtZU51bWJlciwgY2FtZXJhSWQpOwogCi0gICAgZ290QWxsU3RhdGVzICY9IGdldDNhUmVzdWx0PGludDMyX3Q+KGZyYW1lLCBBTkRST0lEX0NPTlRST0xfQUZfVFJJR0dFUl9JRCwKLSAgICAgICAgICAgICZuZXczYVN0YXRlLmFmVHJpZ2dlcklkLCBmcmFtZU51bWJlciwgY2FtZXJhSWQpOworICAgIGlmIChjbGllbnQtPmdldENhbWVyYURldmljZVZlcnNpb24oKSA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgeworICAgICAgICBuZXczYVN0YXRlLmFmVHJpZ2dlcklkID0gZnJhbWUubVJlc3VsdEV4dHJhcy5hZlRyaWdnZXJJZDsKKyAgICAgICAgbmV3M2FTdGF0ZS5hZVRyaWdnZXJJZCA9IGZyYW1lLm1SZXN1bHRFeHRyYXMucHJlY2FwdHVyZVRyaWdnZXJJZDsKKyAgICB9IGVsc2UgeworICAgICAgICBnb3RBbGxTdGF0ZXMgJj0gZ2V0M2FSZXN1bHQ8aW50MzJfdD4obWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BRl9UUklHR0VSX0lELAorICAgICAgICAgICAgICAgICAmbmV3M2FTdGF0ZS5hZlRyaWdnZXJJZCwgZnJhbWVOdW1iZXIsIGNhbWVyYUlkKTsKIAotICAgIGdvdEFsbFN0YXRlcyAmPSBnZXQzYVJlc3VsdDxpbnQzMl90PihmcmFtZSwgQU5EUk9JRF9DT05UUk9MX0FFX1BSRUNBUFRVUkVfSUQsCi0gICAgICAgICAgICAmbmV3M2FTdGF0ZS5hZVRyaWdnZXJJZCwgZnJhbWVOdW1iZXIsIGNhbWVyYUlkKTsKKyAgICAgICAgZ290QWxsU3RhdGVzICY9IGdldDNhUmVzdWx0PGludDMyX3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUVfUFJFQ0FQVFVSRV9JRCwKKyAgICAgICAgICAgICAgICAgJm5ldzNhU3RhdGUuYWVUcmlnZ2VySWQsIGZyYW1lTnVtYmVyLCBjYW1lcmFJZCk7CisgICAgfQogCiAgICAgaWYgKCFnb3RBbGxTdGF0ZXMpIHJldHVybiBCQURfVkFMVUU7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmgKaW5kZXggODU2YWQzMi4uNjhjZjU1YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmgKQEAgLTUxLDE0ICs1MSwxNCBAQAogCiAgICAgdm9pZCBwcm9jZXNzTmV3RnJhbWVzKGNvbnN0IHNwPENhbWVyYTJDbGllbnQ+ICZjbGllbnQpOwogCi0gICAgdmlydHVhbCBib29sIHByb2Nlc3NTaW5nbGVGcmFtZShDYW1lcmFNZXRhZGF0YSAmZnJhbWUsCisgICAgdmlydHVhbCBib29sIHByb2Nlc3NTaW5nbGVGcmFtZShDYXB0dXJlUmVzdWx0ICZmcmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPENhbWVyYURldmljZUJhc2U+ICZkZXZpY2UpOwogCiAgICAgc3RhdHVzX3QgcHJvY2Vzc0ZhY2VEZXRlY3QoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmZyYW1lLAogICAgICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhMkNsaWVudD4gJmNsaWVudCk7CiAKICAgICAvLyBTZW5kIDNBIHN0YXRlIGNoYW5nZSBub3RpZmljYXRpb25zIHRvIGNsaWVudCBiYXNlZCBvbiBmcmFtZSBtZXRhZGF0YQotICAgIHN0YXR1c190IHByb2Nlc3MzYVN0YXRlKGNvbnN0IENhbWVyYU1ldGFkYXRhICZmcmFtZSwKKyAgICBzdGF0dXNfdCBwcm9jZXNzM2FTdGF0ZShjb25zdCBDYXB0dXJlUmVzdWx0ICZmcmFtZSwKICAgICAgICAgICAgIGNvbnN0IHNwPENhbWVyYTJDbGllbnQ+ICZjbGllbnQpOwogCiAgICAgLy8gSGVscGVyIGZvciBwcm9jZXNzM2FTdGF0ZQpAQCAtOTEsOCArOTEsOCBAQAogICAgICAgICB9CiAgICAgfSBtM2FTdGF0ZTsKIAotICAgIC8vIFdoZXRoZXIgdGhlIHBhcnRpYWwgcmVzdWx0IHF1aXJrIGlzIGVuYWJsZWQgZm9yIHRoaXMgZGV2aWNlCi0gICAgYm9vbCBtVXNlUGFydGlhbFF1aXJrOworICAgIC8vIFdoZXRoZXIgdGhlIHBhcnRpYWwgcmVzdWx0IGlzIGVuYWJsZWQgZm9yIHRoaXMgZGV2aWNlCisgICAgYm9vbCBtVXNlUGFydGlhbFJlc3VsdDsKIAogICAgIC8vIFRyYWNrIG1vc3QgcmVjZW50IGZyYW1lIG51bWJlciBmb3Igd2hpY2ggM0Egbm90aWZpY2F0aW9ucyB3ZXJlIHNlbnQgZm9yLgogICAgIC8vIFVzZWQgdG8gZmlsdGVyIGFnYWluc3Qgc2VuZGluZyAzQSBub3RpZmljYXRpb25zIGZvciB0aGUgc2FtZSBmcmFtZQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdDb21wcmVzc29yLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnQ29tcHJlc3Nvci5jcHAKaW5kZXggMmYwYzY3ZC4uOWVjYWI3MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdDb21wcmVzc29yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ0NvbXByZXNzb3IuY3BwCkBAIC0xOTcsNyArMTk3LDcgQEAKIHZvaWQgSnBlZ0NvbXByZXNzb3I6OmpwZWdJbml0RGVzdGluYXRpb24oal9jb21wcmVzc19wdHIgY2luZm8pIHsKICAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOwogICAgIEpwZWdEZXN0aW5hdGlvbiAqZGVzdD0gc3RhdGljX2Nhc3Q8SnBlZ0Rlc3RpbmF0aW9uKj4oY2luZm8tPmRlc3QpOwotICAgIEFMT0dWKCIlczogU2V0dGluZyBkZXN0aW5hdGlvbiB0byAlcCwgc2l6ZSAlZCIsCisgICAgQUxPR1YoIiVzOiBTZXR0aW5nIGRlc3RpbmF0aW9uIHRvICVwLCBzaXplICV6dSIsCiAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRlc3QtPnBhcmVudC0+bUpwZWdCdWZmZXItPmRhdGEsIGtNYXhKcGVnU2l6ZSk7CiAgICAgZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZSA9IChKT0NURVQqKShkZXN0LT5wYXJlbnQtPm1KcGVnQnVmZmVyLT5kYXRhKTsKICAgICBkZXN0LT5mcmVlX2luX2J1ZmZlciA9IGtNYXhKcGVnU2l6ZTsKQEAgLTIxMyw3ICsyMTMsNyBAQAogdm9pZCBKcGVnQ29tcHJlc3Nvcjo6anBlZ1Rlcm1EZXN0aW5hdGlvbihqX2NvbXByZXNzX3B0ciBjaW5mbykgewogICAgICh2b2lkKSBjaW5mbzsgLy8gVE9ETzogY2xlYW4gdXAKICAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOwotICAgIEFMT0dWKCIlczogRG9uZSB3cml0aW5nIEpQRUcgZGF0YS4gJWQgYnl0ZXMgbGVmdCBpbiBidWZmZXIiLAorICAgIEFMT0dWKCIlczogRG9uZSB3cml0aW5nIEpQRUcgZGF0YS4gJXp1IGJ5dGVzIGxlZnQgaW4gYnVmZmVyIiwKICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2luZm8tPmRlc3QtPmZyZWVfaW5fYnVmZmVyKTsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwCmluZGV4IGVjODE0NTYuLmI0MzM3ODEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5jcHAKQEAgLTczLDMwICs3Myw0MyBAQAogICAgIH0KIAogICAgIC8vIEZpbmQgb3V0IGJ1ZmZlciBzaXplIGZvciBKUEVHCi0gICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgbWF4SnBlZ1NpemUgPQotICAgICAgICAgICAgcGFyYW1zLnN0YXRpY0luZm8oQU5EUk9JRF9KUEVHX01BWF9TSVpFKTsKLSAgICBpZiAobWF4SnBlZ1NpemUuY291bnQgPT0gMCkgewotICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgZmluZCBBTkRST0lEX0pQRUdfTUFYX1NJWkUhIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCk7CisgICAgc3NpemVfdCBtYXhKcGVnU2l6ZSA9IGRldmljZS0+Z2V0SnBlZ0J1ZmZlclNpemUocGFyYW1zLnBpY3R1cmVXaWR0aCwgcGFyYW1zLnBpY3R1cmVIZWlnaHQpOworICAgIGlmIChtYXhKcGVnU2l6ZSA8PSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBKcGVnIGJ1ZmZlciBzaXplICglenUpIGlzIGludmFsaWQgIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgbWF4SnBlZ1NpemUpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCiAgICAgaWYgKG1DYXB0dXJlQ29uc3VtZXIgPT0gMCkgewogICAgICAgICAvLyBDcmVhdGUgQ1BVIGJ1ZmZlciBxdWV1ZSBlbmRwb2ludAotICAgICAgICBzcDxCdWZmZXJRdWV1ZT4gYnEgPSBuZXcgQnVmZmVyUXVldWUoKTsKLSAgICAgICAgbUNhcHR1cmVDb25zdW1lciA9IG5ldyBDcHVDb25zdW1lcihicSwgMSk7CisgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IHByb2R1Y2VyOworICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBjb25zdW1lcjsKKyAgICAgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZwcm9kdWNlciwgJmNvbnN1bWVyKTsKKyAgICAgICAgbUNhcHR1cmVDb25zdW1lciA9IG5ldyBDcHVDb25zdW1lcihjb25zdW1lciwgMSk7CiAgICAgICAgIG1DYXB0dXJlQ29uc3VtZXItPnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIodGhpcyk7CiAgICAgICAgIG1DYXB0dXJlQ29uc3VtZXItPnNldE5hbWUoU3RyaW5nOCgiQ2FtZXJhMkNsaWVudDo6Q2FwdHVyZUNvbnN1bWVyIikpOwotICAgICAgICBtQ2FwdHVyZVdpbmRvdyA9IG5ldyBTdXJmYWNlKGJxKTsKKyAgICAgICAgbUNhcHR1cmVXaW5kb3cgPSBuZXcgU3VyZmFjZShwcm9kdWNlcik7CisgICAgfQorCisgICAgLy8gU2luY2UgYXNobWVtIGhlYXBzIGFyZSByb3VuZGVkIHVwIHRvIHBhZ2Ugc2l6ZSwgZG9uJ3QgcmVhbGxvY2F0ZSBpZgorICAgIC8vIHRoZSBjYXB0dXJlIGhlYXAgaXNuJ3QgZXhhY3RseSB0aGUgc2FtZSBzaXplIGFzIHRoZSByZXF1aXJlZCBKUEVHIGJ1ZmZlcgorICAgIGNvbnN0IHNpemVfdCBIRUFQX1NMQUNLX0ZBQ1RPUiA9IDI7CisgICAgaWYgKG1DYXB0dXJlSGVhcCA9PSAwIHx8CisgICAgICAgICAgICAobUNhcHR1cmVIZWFwLT5nZXRTaXplKCkgPCBzdGF0aWNfY2FzdDxzaXplX3Q+KG1heEpwZWdTaXplKSkgfHwKKyAgICAgICAgICAgIChtQ2FwdHVyZUhlYXAtPmdldFNpemUoKSA+CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHNpemVfdD4obWF4SnBlZ1NpemUpICogSEVBUF9TTEFDS19GQUNUT1IpICkgewogICAgICAgICAvLyBDcmVhdGUgbWVtb3J5IGZvciBBUEkgY29uc3VtcHRpb24KLSAgICAgICAgbUNhcHR1cmVIZWFwID0gbmV3IE1lbW9yeUhlYXBCYXNlKG1heEpwZWdTaXplLmRhdGEuaTMyWzBdLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbWVyYTJDbGllbnQ6OkNhcHR1cmVIZWFwIik7CisgICAgICAgIG1DYXB0dXJlSGVhcC5jbGVhcigpOworICAgICAgICBtQ2FwdHVyZUhlYXAgPQorICAgICAgICAgICAgICAgIG5ldyBNZW1vcnlIZWFwQmFzZShtYXhKcGVnU2l6ZSwgMCwgIkNhbWVyYTJDbGllbnQ6OkNhcHR1cmVIZWFwIik7CiAgICAgICAgIGlmIChtQ2FwdHVyZUhlYXAtPmdldFNpemUoKSA9PSAwKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgY2FwdHVyZSIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkKTsKICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CiAgICAgICAgIH0KICAgICB9CisgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IEpQRUcgY2FwdHVyZSBoZWFwIG5vdyAlZCBieXRlczsgcmVxdWVzdGVkICVkIGJ5dGVzIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBtQ2FwdHVyZUhlYXAtPmdldFNpemUoKSwgbWF4SnBlZ1NpemUpOwogCiAgICAgaWYgKG1DYXB0dXJlU3RyZWFtSWQgIT0gTk9fU1RSRUFNKSB7CiAgICAgICAgIC8vIENoZWNrIGlmIHN0cmVhbSBwYXJhbWV0ZXJzIGhhdmUgdG8gY2hhbmdlCkBAIC0xMzIsOCArMTQ1LDcgQEAKICAgICAgICAgLy8gQ3JlYXRlIHN0cmVhbSBmb3IgSEFMIHByb2R1Y3Rpb24KICAgICAgICAgcmVzID0gZGV2aWNlLT5jcmVhdGVTdHJlYW0obUNhcHR1cmVXaW5kb3csCiAgICAgICAgICAgICAgICAgcGFyYW1zLnBpY3R1cmVXaWR0aCwgcGFyYW1zLnBpY3R1cmVIZWlnaHQsCi0gICAgICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9CTE9CLCBtYXhKcGVnU2l6ZS5kYXRhLmkzMlswXSwKLSAgICAgICAgICAgICAgICAmbUNhcHR1cmVTdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9CTE9CLCAmbUNhcHR1cmVTdHJlYW1JZCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBjcmVhdGUgb3V0cHV0IHN0cmVhbSBmb3IgY2FwdHVyZTogIgogICAgICAgICAgICAgICAgICAgICAiJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgbUlkLApAQCAtMjQxLDcgKzI1Myw3IEBACiAgICAgICAgIHNpemVfdCBoZWFwU2l6ZSA9IG1DYXB0dXJlSGVhcC0+Z2V0U2l6ZSgpOwogICAgICAgICBpZiAoanBlZ1NpemUgPiBoZWFwU2l6ZSkgewogICAgICAgICAgICAgQUxPR1coIiVzOiBKUEVHIGltYWdlIGlzIGxhcmdlciB0aGFuIGV4cGVjdGVkLCB0cnVuY2F0aW5nICIKLSAgICAgICAgICAgICAgICAgICAgIihnb3QgJWQsIGV4cGVjdGVkIGF0IG1vc3QgJWQgYnl0ZXMpIiwKKyAgICAgICAgICAgICAgICAgICAgIihnb3QgJXp1LCBleHBlY3RlZCBhdCBtb3N0ICV6dSBieXRlcykiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGpwZWdTaXplLCBoZWFwU2l6ZSk7CiAgICAgICAgICAgICBqcGVnU2l6ZSA9IGhlYXBTaXplOwogICAgICAgICB9CkBAIC0zMzUsMTMgKzM0NywxMyBAQAogICAgICAgICAgICAgc2l6ZV90IG9mZnNldCA9IHNpemUgLSBNQVJLRVJfTEVOR1RIOwogICAgICAgICAgICAgdWludDhfdCAqZW5kID0ganBlZ0J1ZmZlciArIG9mZnNldDsKICAgICAgICAgICAgIGlmIChjaGVja0pwZWdTdGFydChqcGVnQnVmZmVyKSAmJiBjaGVja0pwZWdFbmQoZW5kKSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJGb3VuZCBKUEVHIHRyYW5zcG9ydCBoZWFkZXIsIGltZyBzaXplICVkIiwgc2l6ZSk7CisgICAgICAgICAgICAgICAgQUxPR1YoIkZvdW5kIEpQRUcgdHJhbnNwb3J0IGhlYWRlciwgaW1nIHNpemUgJXp1Iiwgc2l6ZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHNpemU7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIEFMT0dXKCJGb3VuZCBKUEVHIHRyYW5zcG9ydCBoZWFkZXIgd2l0aCBiYWQgSW1hZ2UgU3RhcnQvRW5kIik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVygiRm91bmQgSlBFRyB0cmFuc3BvcnQgaGVhZGVyIHdpdGggYmFkIHNpemUgJWQiLCBzaXplKTsKKyAgICAgICAgICAgIEFMT0dXKCJGb3VuZCBKUEVHIHRyYW5zcG9ydCBoZWFkZXIgd2l0aCBiYWQgc2l6ZSAlenUiLCBzaXplKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzU3LDE1ICszNjksMTUgQEAKICAgICAgICAgc2VnbWVudF90ICpzZWdtZW50ID0gKHNlZ21lbnRfdCopKGpwZWdCdWZmZXIgKyBzaXplKTsKICAgICAgICAgdWludDhfdCB0eXBlID0gY2hlY2tKcGVnTWFya2VyKHNlZ21lbnQtPm1hcmtlcik7CiAgICAgICAgIGlmICh0eXBlID09IDApIHsgLy8gaW52YWxpZCBtYXJrZXIsIG5vIG1vcmUgc2VnbWVudHMsIGJlZ2luIEpQRUcgZGF0YQotICAgICAgICAgICAgQUxPR1YoIkpQRUcgc3RyZWFtIGZvdW5kIGJlZ2lubmluZyBhdCBvZmZzZXQgJWQiLCBzaXplKTsKKyAgICAgICAgICAgIEFMT0dWKCJKUEVHIHN0cmVhbSBmb3VuZCBiZWdpbm5pbmcgYXQgb2Zmc2V0ICV6dSIsIHNpemUpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHR5cGUgPT0gRU9JIHx8IHNpemUgPiBtYXhTaXplIC0gc2l6ZW9mKHNlZ21lbnRfdCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJHb3QgcHJlbWF0dXJlIEVuZCBiZWZvcmUgSlBFRyBkYXRhLCBvZmZzZXQgJWQiLCBzaXplKTsKKyAgICAgICAgICAgIEFMT0dFKCJHb3QgcHJlbWF0dXJlIEVuZCBiZWZvcmUgSlBFRyBkYXRhLCBvZmZzZXQgJXp1Iiwgc2l6ZSk7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQogICAgICAgICBzaXplX3QgbGVuZ3RoID0gbnRvaHMoc2VnbWVudC0+bGVuZ3RoKTsKLSAgICAgICAgQUxPR1YoIkpGSUYgU2VnbWVudCwgdHlwZSAleCBsZW5ndGggJXgiLCB0eXBlLCBsZW5ndGgpOworICAgICAgICBBTE9HVigiSkZJRiBTZWdtZW50LCB0eXBlICV4IGxlbmd0aCAlengiLCB0eXBlLCBsZW5ndGgpOwogICAgICAgICBzaXplICs9IGxlbmd0aCArIE1BUktFUl9MRU5HVEg7CiAgICAgfQogCkBAIC0zODUsMTAgKzM5NywxMCBAQAogICAgIH0KIAogICAgIGlmIChzaXplID4gbWF4U2l6ZSkgewotICAgICAgICBBTE9HVygiSlBFRyBzaXplICVkIHRvbyBsYXJnZSwgcmVkdWNpbmcgdG8gbWF4U2l6ZSAlZCIsIHNpemUsIG1heFNpemUpOworICAgICAgICBBTE9HVygiSlBFRyBzaXplICV6dSB0b28gbGFyZ2UsIHJlZHVjaW5nIHRvIG1heFNpemUgJXp1Iiwgc2l6ZSwgbWF4U2l6ZSk7CiAgICAgICAgIHNpemUgPSBtYXhTaXplOwogICAgIH0KLSAgICBBTE9HVigiRmluYWwgSlBFRyBzaXplICVkIiwgc2l6ZSk7CisgICAgQUxPR1YoIkZpbmFsIEpQRUcgc2l6ZSAlenUiLCBzaXplKTsKICAgICByZXR1cm4gc2l6ZTsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwCmluZGV4IDYxZTM1ODguLjdiOTBkMjggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAKQEAgLTI5LDYgKzI5LDkgQEAKIAogI2luY2x1ZGUgIlBhcmFtZXRlcnMuaCIKICNpbmNsdWRlICJzeXN0ZW0vY2FtZXJhLmgiCisjaW5jbHVkZSAiaGFyZHdhcmUvY2FtZXJhX2NvbW1vbi5oIgorI2luY2x1ZGUgPG1lZGlhL01lZGlhUHJvZmlsZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBjYW1lcmEyIHsKQEAgLTQzLDcgKzQ2LDcgQEAKIFBhcmFtZXRlcnM6On5QYXJhbWV0ZXJzKCkgewogfQogCi1zdGF0dXNfdCBQYXJhbWV0ZXJzOjppbml0aWFsaXplKGNvbnN0IENhbWVyYU1ldGFkYXRhICppbmZvKSB7CitzdGF0dXNfdCBQYXJhbWV0ZXJzOjppbml0aWFsaXplKGNvbnN0IENhbWVyYU1ldGFkYXRhICppbmZvLCBpbnQgZGV2aWNlVmVyc2lvbikgewogICAgIHN0YXR1c190IHJlczsKIAogICAgIGlmIChpbmZvLT5lbnRyeUNvdW50KCkgPT0gMCkgewpAQCAtNTEsNiArNTQsNyBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBQYXJhbWV0ZXJzOjppbmZvID0gaW5mbzsKKyAgICBtRGV2aWNlVmVyc2lvbiA9IGRldmljZVZlcnNpb247CiAKICAgICByZXMgPSBidWlsZEZhc3RJbmZvKCk7CiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKQEAgLTU5LDEyICs2Myw0MiBAQAogICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CiAKICAgICBjb25zdCBTaXplIE1BWF9QUkVWSUVXX1NJWkUgPSB7IE1BWF9QUkVWSUVXX1dJRFRILCBNQVhfUFJFVklFV19IRUlHSFQgfTsKLSAgICByZXMgPSBnZXRGaWx0ZXJlZFByZXZpZXdTaXplcyhNQVhfUFJFVklFV19TSVpFLCAmYXZhaWxhYmxlUHJldmlld1NpemVzKTsKKyAgICAvLyBUcmVhdCB0aGUgSC4yNjQgbWF4IHNpemUgYXMgdGhlIG1heCBzdXBwb3J0ZWQgdmlkZW8gc2l6ZS4KKyAgICBNZWRpYVByb2ZpbGVzICp2aWRlb0VuY29kZXJQcm9maWxlcyA9IE1lZGlhUHJvZmlsZXM6OmdldEluc3RhbmNlKCk7CisgICAgaW50MzJfdCBtYXhWaWRlb1dpZHRoID0gdmlkZW9FbmNvZGVyUHJvZmlsZXMtPmdldFZpZGVvRW5jb2RlclBhcmFtQnlOYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmMudmlkLndpZHRoLm1heCIsIFZJREVPX0VOQ09ERVJfSDI2NCk7CisgICAgaW50MzJfdCBtYXhWaWRlb0hlaWdodCA9IHZpZGVvRW5jb2RlclByb2ZpbGVzLT5nZXRWaWRlb0VuY29kZXJQYXJhbUJ5TmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5jLnZpZC5oZWlnaHQubWF4IiwgVklERU9fRU5DT0RFUl9IMjY0KTsKKyAgICBjb25zdCBTaXplIE1BWF9WSURFT19TSVpFID0ge21heFZpZGVvV2lkdGgsIG1heFZpZGVvSGVpZ2h0fTsKKworICAgIHJlcyA9IGdldEZpbHRlcmVkU2l6ZXMoTUFYX1BSRVZJRVdfU0laRSwgJmF2YWlsYWJsZVByZXZpZXdTaXplcyk7CisgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKKyAgICByZXMgPSBnZXRGaWx0ZXJlZFNpemVzKE1BWF9WSURFT19TSVpFLCAmYXZhaWxhYmxlVmlkZW9TaXplcyk7CiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKIAotICAgIC8vIFRPRE86IFBpY2sgbW9yZSBpbnRlbGxpZ2VudGx5Ci0gICAgcHJldmlld1dpZHRoID0gYXZhaWxhYmxlUHJldmlld1NpemVzWzBdLndpZHRoOwotICAgIHByZXZpZXdIZWlnaHQgPSBhdmFpbGFibGVQcmV2aWV3U2l6ZXNbMF0uaGVpZ2h0OworICAgIC8vIFNlbGVjdCBpbml0aWFsIHByZXZpZXcgYW5kIHZpZGVvIHNpemUgdGhhdCdzIHVuZGVyIHRoZSBpbml0aWFsIGJvdW5kIGFuZAorICAgIC8vIG9uIHRoZSBsaXN0IG9mIGJvdGggcHJldmlldyBhbmQgcmVjb3JkaW5nIHNpemVzCisgICAgcHJldmlld1dpZHRoID0gMDsKKyAgICBwcmV2aWV3SGVpZ2h0ID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMCA7IGkgPCBhdmFpbGFibGVQcmV2aWV3U2l6ZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaW50IG5ld1dpZHRoID0gYXZhaWxhYmxlUHJldmlld1NpemVzW2ldLndpZHRoOworICAgICAgICBpbnQgbmV3SGVpZ2h0ID0gYXZhaWxhYmxlUHJldmlld1NpemVzW2ldLmhlaWdodDsKKyAgICAgICAgaWYgKG5ld1dpZHRoID49IHByZXZpZXdXaWR0aCAmJiBuZXdIZWlnaHQgPj0gcHJldmlld0hlaWdodCAmJgorICAgICAgICAgICAgICAgIG5ld1dpZHRoIDw9IE1BWF9JTklUSUFMX1BSRVZJRVdfV0lEVEggJiYKKyAgICAgICAgICAgICAgICBuZXdIZWlnaHQgPD0gTUFYX0lOSVRJQUxfUFJFVklFV19IRUlHSFQpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgYXZhaWxhYmxlVmlkZW9TaXplcy5zaXplKCk7IGorKykgeworICAgICAgICAgICAgICAgIGlmIChhdmFpbGFibGVWaWRlb1NpemVzW2pdLndpZHRoID09IG5ld1dpZHRoICYmCisgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVWaWRlb1NpemVzW2pdLmhlaWdodCA9PSBuZXdIZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJldmlld1dpZHRoID0gbmV3V2lkdGg7CisgICAgICAgICAgICAgICAgICAgIHByZXZpZXdIZWlnaHQgPSBuZXdIZWlnaHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChwcmV2aWV3V2lkdGggPT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IE5vIGluaXRpYWwgcHJldmlldyBzaXplIGNhbiBiZSBmb3VuZCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KICAgICB2aWRlb1dpZHRoID0gcHJldmlld1dpZHRoOwogICAgIHZpZGVvSGVpZ2h0ID0gcHJldmlld0hlaWdodDsKIApAQCAtODQsOCArMTE4LDE3IEBACiAgICAgICAgIEFMT0dWKCJTdXBwb3J0ZWQgcHJldmlldyBzaXplcyBhcmU6ICVzIiwgc3VwcG9ydGVkUHJldmlld1NpemVzLnN0cmluZygpKTsKICAgICAgICAgcGFyYW1zLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfU1VQUE9SVEVEX1BSRVZJRVdfU0laRVMsCiAgICAgICAgICAgICAgICAgc3VwcG9ydGVkUHJldmlld1NpemVzKTsKKworICAgICAgICBTdHJpbmc4IHN1cHBvcnRlZFZpZGVvU2l6ZXM7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXZhaWxhYmxlVmlkZW9TaXplcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGkgIT0gMCkgc3VwcG9ydGVkVmlkZW9TaXplcyArPSAiLCI7CisgICAgICAgICAgICBzdXBwb3J0ZWRWaWRlb1NpemVzICs9IFN0cmluZzg6OmZvcm1hdCgiJWR4JWQiLAorICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVWaWRlb1NpemVzW2ldLndpZHRoLAorICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVWaWRlb1NpemVzW2ldLmhlaWdodCk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIlN1cHBvcnRlZCB2aWRlbyBzaXplcyBhcmU6ICVzIiwgc3VwcG9ydGVkVmlkZW9TaXplcy5zdHJpbmcoKSk7CiAgICAgICAgIHBhcmFtcy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1NVUFBPUlRFRF9WSURFT19TSVpFUywKLSAgICAgICAgICAgICAgICBzdXBwb3J0ZWRQcmV2aWV3U2l6ZXMpOworICAgICAgICAgICAgICAgIHN1cHBvcnRlZFZpZGVvU2l6ZXMpOwogICAgIH0KIAogICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGF2YWlsYWJsZUZwc1JhbmdlcyA9CkBAIC05OSwxNiArMTQyLDE0IEBACiAgICAgcHJldmlld1RyYW5zZm9ybSA9IGRlZ1RvVHJhbnNmb3JtKDAsCiAgICAgICAgICAgICBjYW1lcmFGYWNpbmcgPT0gQ0FNRVJBX0ZBQ0lOR19GUk9OVCk7CiAKLSAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVGb3JtYXRzID0KLSAgICAgICAgc3RhdGljSW5mbyhBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfRk9STUFUUyk7Ci0KICAgICB7CiAgICAgICAgIFN0cmluZzggc3VwcG9ydGVkUHJldmlld0Zvcm1hdHM7CisgICAgICAgIFNvcnRlZFZlY3RvcjxpbnQzMl90PiBvdXRwdXRGb3JtYXRzID0gZ2V0QXZhaWxhYmxlT3V0cHV0Rm9ybWF0cygpOwogICAgICAgICBib29sIGFkZENvbW1hID0gZmFsc2U7Ci0gICAgICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IGF2YWlsYWJsZUZvcm1hdHMuY291bnQ7IGkrKykgeworICAgICAgICBmb3IgKHNpemVfdCBpPTA7IGkgPCBvdXRwdXRGb3JtYXRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBpZiAoYWRkQ29tbWEpIHN1cHBvcnRlZFByZXZpZXdGb3JtYXRzICs9ICIsIjsKICAgICAgICAgICAgIGFkZENvbW1hID0gdHJ1ZTsKLSAgICAgICAgICAgIHN3aXRjaCAoYXZhaWxhYmxlRm9ybWF0cy5kYXRhLmkzMltpXSkgeworICAgICAgICAgICAgc3dpdGNoIChvdXRwdXRGb3JtYXRzW2ldKSB7CiAgICAgICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIyX1NQOgogICAgICAgICAgICAgICAgIHN1cHBvcnRlZFByZXZpZXdGb3JtYXRzICs9CiAgICAgICAgICAgICAgICAgICAgIENhbWVyYVBhcmFtZXRlcnM6OlBJWEVMX0ZPUk1BVF9ZVVY0MjJTUDsKQEAgLTE1MCw3ICsxOTEsNyBAQAogCiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIEFMT0dXKCIlczogQ2FtZXJhICVkOiBVbmtub3duIHByZXZpZXcgZm9ybWF0OiAleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLCBhdmFpbGFibGVGb3JtYXRzLmRhdGEuaTMyW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQsIG91dHB1dEZvcm1hdHNbaV0pOwogICAgICAgICAgICAgICAgIGFkZENvbW1hID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC0yMjIsMjQgKzI2MywyNiBAQAogICAgICAgICAgICAgICAgIHN1cHBvcnRlZFByZXZpZXdGcmFtZVJhdGVzKTsKICAgICB9CiAKLSAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVKcGVnU2l6ZXMgPQotICAgICAgICBzdGF0aWNJbmZvKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9KUEVHX1NJWkVTLCAyKTsKLSAgICBpZiAoIWF2YWlsYWJsZUpwZWdTaXplcy5jb3VudCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgVmVjdG9yPFNpemU+IGF2YWlsYWJsZUpwZWdTaXplcyA9IGdldEF2YWlsYWJsZUpwZWdTaXplcygpOworICAgIGlmICghYXZhaWxhYmxlSnBlZ1NpemVzLnNpemUoKSkgcmV0dXJuIE5PX0lOSVQ7CiAKICAgICAvLyBUT0RPOiBQaWNrIG1heGltdW0KLSAgICBwaWN0dXJlV2lkdGggPSBhdmFpbGFibGVKcGVnU2l6ZXMuZGF0YS5pMzJbMF07Ci0gICAgcGljdHVyZUhlaWdodCA9IGF2YWlsYWJsZUpwZWdTaXplcy5kYXRhLmkzMlsxXTsKKyAgICBwaWN0dXJlV2lkdGggPSBhdmFpbGFibGVKcGVnU2l6ZXNbMF0ud2lkdGg7CisgICAgcGljdHVyZUhlaWdodCA9IGF2YWlsYWJsZUpwZWdTaXplc1swXS5oZWlnaHQ7CisgICAgcGljdHVyZVdpZHRoTGFzdFNldCA9IHBpY3R1cmVXaWR0aDsKKyAgICBwaWN0dXJlSGVpZ2h0TGFzdFNldCA9IHBpY3R1cmVIZWlnaHQ7CisgICAgcGljdHVyZVNpemVPdmVycmlkZW4gPSBmYWxzZTsKIAogICAgIHBhcmFtcy5zZXRQaWN0dXJlU2l6ZShwaWN0dXJlV2lkdGgsCiAgICAgICAgICAgICBwaWN0dXJlSGVpZ2h0KTsKIAogICAgIHsKICAgICAgICAgU3RyaW5nOCBzdXBwb3J0ZWRQaWN0dXJlU2l6ZXM7Ci0gICAgICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IGF2YWlsYWJsZUpwZWdTaXplcy5jb3VudDsgaSArPSAyKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IGF2YWlsYWJsZUpwZWdTaXplcy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgaWYgKGkgIT0gMCkgc3VwcG9ydGVkUGljdHVyZVNpemVzICs9ICIsIjsKICAgICAgICAgICAgIHN1cHBvcnRlZFBpY3R1cmVTaXplcyArPSBTdHJpbmc4Ojpmb3JtYXQoIiVkeCVkIiwKLSAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSnBlZ1NpemVzLmRhdGEuaTMyW2ldLAotICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVKcGVnU2l6ZXMuZGF0YS5pMzJbaSsxXSk7CisgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUpwZWdTaXplc1tpXS53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSnBlZ1NpemVzW2ldLmhlaWdodCk7CiAgICAgICAgIH0KICAgICAgICAgcGFyYW1zLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfU1VQUE9SVEVEX1BJQ1RVUkVfU0laRVMsCiAgICAgICAgICAgICAgICAgc3VwcG9ydGVkUGljdHVyZVNpemVzKTsKQEAgLTQ3MCw3ICs1MTMsNyBAQAogICAgICAgICAgICAgICAgIHN1cHBvcnRlZEFudGliYW5kaW5nKTsKICAgICB9CiAKLSAgICBzY2VuZU1vZGUgPSBBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9VTlNVUFBPUlRFRDsKKyAgICBzY2VuZU1vZGUgPSBBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9ESVNBQkxFRDsKICAgICBwYXJhbXMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9TQ0VORV9NT0RFLAogICAgICAgICAgICAgQ2FtZXJhUGFyYW1ldGVyczo6U0NFTkVfTU9ERV9BVVRPKTsKIApAQCAtNDg2LDcgKzUyOSw3IEBACiAgICAgICAgICAgICBpZiAoYWRkQ29tbWEpIHN1cHBvcnRlZFNjZW5lTW9kZXMgKz0gIiwiOwogICAgICAgICAgICAgYWRkQ29tbWEgPSB0cnVlOwogICAgICAgICAgICAgc3dpdGNoIChhdmFpbGFibGVTY2VuZU1vZGVzLmRhdGEudThbaV0pIHsKLSAgICAgICAgICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX1VOU1VQUE9SVEVEOgorICAgICAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfRElTQUJMRUQ6CiAgICAgICAgICAgICAgICAgICAgIG5vU2NlbmVNb2RlcyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfRkFDRV9QUklPUklUWToKQEAgLTU3OSw4ICs2MjIsOCBAQAogICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGF2YWlsYWJsZUFlTW9kZXMgPQogICAgICAgICBzdGF0aWNJbmZvKEFORFJPSURfQ09OVFJPTF9BRV9BVkFJTEFCTEVfTU9ERVMsIDAsIDAsIGZhbHNlKTsKIAorICAgIGZsYXNoTW9kZSA9IFBhcmFtZXRlcnM6OkZMQVNIX01PREVfT0ZGOwogICAgIGlmIChpc0ZsYXNoQXZhaWxhYmxlKSB7Ci0gICAgICAgIGZsYXNoTW9kZSA9IFBhcmFtZXRlcnM6OkZMQVNIX01PREVfT0ZGOwogICAgICAgICBwYXJhbXMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9GTEFTSF9NT0RFLAogICAgICAgICAgICAgICAgIENhbWVyYVBhcmFtZXRlcnM6OkZMQVNIX01PREVfT0ZGKTsKIApAQCAtNjAwLDExICs2NDMsMTAgQEAKICAgICAgICAgcGFyYW1zLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfU1VQUE9SVEVEX0ZMQVNIX01PREVTLAogICAgICAgICAgICAgICAgIHN1cHBvcnRlZEZsYXNoTW9kZXMpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGZsYXNoTW9kZSA9IFBhcmFtZXRlcnM6OkZMQVNIX01PREVfT0ZGOwotICAgICAgICBwYXJhbXMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9GTEFTSF9NT0RFLAotICAgICAgICAgICAgICAgIENhbWVyYVBhcmFtZXRlcnM6OkZMQVNIX01PREVfT0ZGKTsKLSAgICAgICAgcGFyYW1zLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfU1VQUE9SVEVEX0ZMQVNIX01PREVTLAotICAgICAgICAgICAgICAgIENhbWVyYVBhcmFtZXRlcnM6OkZMQVNIX01PREVfT0ZGKTsKKyAgICAgICAgLy8gTm8gZmxhc2ggbWVhbnMgbnVsbCBmbGFzaCBtb2RlIGFuZCBzdXBwb3J0ZWQgZmxhc2ggbW9kZXMga2V5cywgc28KKyAgICAgICAgLy8gcmVtb3ZlIHRoZW0ganVzdCB0byBiZSBzYWZlCisgICAgICAgIHBhcmFtcy5yZW1vdmUoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0ZMQVNIX01PREUpOworICAgICAgICBwYXJhbXMucmVtb3ZlKENhbWVyYVBhcmFtZXRlcnM6OktFWV9TVVBQT1JURURfRkxBU0hfTU9ERVMpOwogICAgIH0KIAogICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IG1pbkZvY3VzRGlzdGFuY2UgPQpAQCAtNjI0LDggKzY2NiwxNyBAQAogICAgICAgICBmb2N1c01vZGUgPSBQYXJhbWV0ZXJzOjpGT0NVU19NT0RFX0FVVE87CiAgICAgICAgIHBhcmFtcy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0ZPQ1VTX01PREUsCiAgICAgICAgICAgICAgICAgQ2FtZXJhUGFyYW1ldGVyczo6Rk9DVVNfTU9ERV9BVVRPKTsKLSAgICAgICAgU3RyaW5nOCBzdXBwb3J0ZWRGb2N1c01vZGVzKENhbWVyYVBhcmFtZXRlcnM6OkZPQ1VTX01PREVfSU5GSU5JVFkpOwotICAgICAgICBib29sIGFkZENvbW1hID0gdHJ1ZTsKKyAgICAgICAgU3RyaW5nOCBzdXBwb3J0ZWRGb2N1c01vZGVzOworICAgICAgICBib29sIGFkZENvbW1hID0gZmFsc2U7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGZvY3VzRGlzdGFuY2VDYWxpYnJhdGlvbiA9CisgICAgICAgICAgICBzdGF0aWNJbmZvKEFORFJPSURfTEVOU19JTkZPX0ZPQ1VTX0RJU1RBTkNFX0NBTElCUkFUSU9OLCAwLCAwLCBmYWxzZSk7CisKKyAgICAgICAgaWYgKGZvY3VzRGlzdGFuY2VDYWxpYnJhdGlvbi5jb3VudCAmJgorICAgICAgICAgICAgICAgIGZvY3VzRGlzdGFuY2VDYWxpYnJhdGlvbi5kYXRhLnU4WzBdICE9CisgICAgICAgICAgICAgICAgQU5EUk9JRF9MRU5TX0lORk9fRk9DVVNfRElTVEFOQ0VfQ0FMSUJSQVRJT05fVU5DQUxJQlJBVEVEKSB7CisgICAgICAgICAgICBzdXBwb3J0ZWRGb2N1c01vZGVzICs9IENhbWVyYVBhcmFtZXRlcnM6OkZPQ1VTX01PREVfSU5GSU5JVFk7CisgICAgICAgICAgICBhZGRDb21tYSA9IHRydWU7CisgICAgICAgIH0KIAogICAgICAgICBmb3IgKHNpemVfdCBpPTA7IGkgPCBhdmFpbGFibGVBZk1vZGVzLmNvdW50OyBpKyspIHsKICAgICAgICAgICAgIGlmIChhZGRDb21tYSkgc3VwcG9ydGVkRm9jdXNNb2RlcyArPSAiLCI7CkBAIC02NjgsMTMgKzcxOSwxMyBAQAogICAgIGZvY3VzU3RhdGUgPSBBTkRST0lEX0NPTlRST0xfQUZfU1RBVEVfSU5BQ1RJVkU7CiAgICAgc2hhZG93Rm9jdXNNb2RlID0gRk9DVVNfTU9ERV9JTlZBTElEOwogCi0gICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgbWF4M2FSZWdpb25zID0KLSAgICAgICAgc3RhdGljSW5mbyhBTkRST0lEX0NPTlRST0xfTUFYX1JFR0lPTlMsIDEsIDEpOwotICAgIGlmICghbWF4M2FSZWdpb25zLmNvdW50KSByZXR1cm4gTk9fSU5JVDsKKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBtYXgzYVJlZ2lvbnMgPSBzdGF0aWNJbmZvKEFORFJPSURfQ09OVFJPTF9NQVhfUkVHSU9OUywKKyAgICAgICAgICAgIFBhcmFtZXRlcnM6Ok5VTV9SRUdJT04sIFBhcmFtZXRlcnM6Ok5VTV9SRUdJT04pOworICAgIGlmIChtYXgzYVJlZ2lvbnMuY291bnQgIT0gUGFyYW1ldGVyczo6TlVNX1JFR0lPTikgcmV0dXJuIE5PX0lOSVQ7CiAKICAgICBpbnQzMl90IG1heE51bUZvY3VzQXJlYXMgPSAwOwogICAgIGlmIChmb2N1c01vZGUgIT0gUGFyYW1ldGVyczo6Rk9DVVNfTU9ERV9GSVhFRCkgewotICAgICAgICBtYXhOdW1Gb2N1c0FyZWFzID0gbWF4M2FSZWdpb25zLmRhdGEuaTMyWzBdOworICAgICAgICBtYXhOdW1Gb2N1c0FyZWFzID0gbWF4M2FSZWdpb25zLmRhdGEuaTMyW1BhcmFtZXRlcnM6OlJFR0lPTl9BRl07CiAgICAgfQogICAgIHBhcmFtcy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX01BWF9OVU1fRk9DVVNfQVJFQVMsIG1heE51bUZvY3VzQXJlYXMpOwogICAgIHBhcmFtcy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0ZPQ1VTX0FSRUFTLApAQCAtNzM0LDcgKzc4NSw3IEBACiAKICAgICBtZXRlcmluZ0FyZWFzLmFkZChQYXJhbWV0ZXJzOjpBcmVhKDAsIDAsIDAsIDAsIDApKTsKICAgICBwYXJhbXMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9NQVhfTlVNX01FVEVSSU5HX0FSRUFTLAotICAgICAgICAgICAgbWF4M2FSZWdpb25zLmRhdGEuaTMyWzBdKTsKKyAgICAgICAgICAgIG1heDNhUmVnaW9ucy5kYXRhLmkzMltQYXJhbWV0ZXJzOjpSRUdJT05fQUVdKTsKICAgICBwYXJhbXMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9NRVRFUklOR19BUkVBUywKICAgICAgICAgICAgICIoMCwwLDAsMCwwKSIpOwogCkBAIC05MzEsMTMgKzk4MiwxOSBAQAogICAgIGJvb2wgZml4ZWRMZW5zID0gbWluRm9jdXNEaXN0YW5jZS5jb3VudCA9PSAwIHx8CiAgICAgICAgIG1pbkZvY3VzRGlzdGFuY2UuZGF0YS5mWzBdID09IDA7CiAKKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBmb2N1c0Rpc3RhbmNlQ2FsaWJyYXRpb24gPQorICAgICAgICAgICAgc3RhdGljSW5mbyhBTkRST0lEX0xFTlNfSU5GT19GT0NVU19ESVNUQU5DRV9DQUxJQlJBVElPTiwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgIGJvb2wgY2FuRm9jdXNJbmZpbml0eSA9IChmb2N1c0Rpc3RhbmNlQ2FsaWJyYXRpb24uY291bnQgJiYKKyAgICAgICAgICAgIGZvY3VzRGlzdGFuY2VDYWxpYnJhdGlvbi5kYXRhLnU4WzBdICE9CisgICAgICAgICAgICBBTkRST0lEX0xFTlNfSU5GT19GT0NVU19ESVNUQU5DRV9DQUxJQlJBVElPTl9VTkNBTElCUkFURUQpOworCiAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgYXZhaWxhYmxlRm9jYWxMZW5ndGhzID0KICAgICAgICAgc3RhdGljSW5mbyhBTkRST0lEX0xFTlNfSU5GT19BVkFJTEFCTEVfRk9DQUxfTEVOR1RIUyk7CiAgICAgaWYgKCFhdmFpbGFibGVGb2NhbExlbmd0aHMuY291bnQpIHJldHVybiBOT19JTklUOwogCi0gICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgYXZhaWxhYmxlRm9ybWF0cyA9Ci0gICAgICAgIHN0YXRpY0luZm8oQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX0ZPUk1BVFMpOwotICAgIGlmICghYXZhaWxhYmxlRm9ybWF0cy5jb3VudCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgU29ydGVkVmVjdG9yPGludDMyX3Q+IGF2YWlsYWJsZUZvcm1hdHMgPSBnZXRBdmFpbGFibGVPdXRwdXRGb3JtYXRzKCk7CisgICAgaWYgKCFhdmFpbGFibGVGb3JtYXRzLnNpemUoKSkgcmV0dXJuIE5PX0lOSVQ7CiAKIAogICAgIGlmIChzY2VuZU1vZGVPdmVycmlkZXMuY291bnQgPiAwKSB7CkBAIC05NDgsNyArMTAwNSw3IEBACiAgICAgICAgIGlmIChzY2VuZU1vZGVPdmVycmlkZXMuY291bnQgIT0KICAgICAgICAgICAgICAgICBhdmFpbGFibGVTY2VuZU1vZGVzLmNvdW50ICoga01vZGVzUGVyU2NlbmVNb2RlKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogU2NlbmUgbW9kZSBvdmVycmlkZSBsaXN0IGlzIGFuICIKLSAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQgc2l6ZTogJWQgKGV4cGVjdGVkICVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQgc2l6ZTogJXp1IChleHBlY3RlZCAlenUpIiwgX19GVU5DVElPTl9fLAogICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgc2NlbmVNb2RlT3ZlcnJpZGVzLmNvdW50LAogICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVTY2VuZU1vZGVzLmNvdW50KTsKICAgICAgICAgICAgIHJldHVybiBOT19JTklUOwpAQCAtOTgyLDYgKzEwMzksMTMgQEAKICAgICAgICAgICAgICAgICAgICAgc2NlbmVNb2RlT3ZlcnJpZGVzLmRhdGEudThbaSAqIGtNb2Rlc1BlclNjZW5lTW9kZSArIDJdOwogICAgICAgICAgICAgc3dpdGNoKGFmTW9kZSkgewogICAgICAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9DT05UUk9MX0FGX01PREVfT0ZGOgorICAgICAgICAgICAgICAgICAgICBpZiAoIWZpeGVkTGVucyAmJiAhY2FuRm9jdXNJbmZpbml0eSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFNjZW5lIG1vZGUgb3ZlcnJpZGUgbGlzdHMgYXNrcyBmb3IiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZml4ZWQgZm9jdXMgb24gYSBkZXZpY2Ugd2l0aCBmb2N1c2VyIGJ1dCBub3QiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgY2FsaWJyYXRlZCBmb3IgaW5maW5pdHkgZm9jdXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIG1vZGVzLmZvY3VzTW9kZSA9IGZpeGVkTGVucyA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9DVVNfTU9ERV9GSVhFRCA6IEZPQ1VTX01PREVfSU5GSU5JVFk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTAyMSw4ICsxMDg1LDggQEAKIAogICAgIC8vIENoZWNrIGlmIHRoZSBIQUwgc3VwcG9ydHMgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfODg4CiAgICAgZmFzdEluZm8udXNlRmxleGlibGVZdXYgPSBmYWxzZTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGF2YWlsYWJsZUZvcm1hdHMuY291bnQ7IGkrKykgewotICAgICAgICBpZiAoYXZhaWxhYmxlRm9ybWF0cy5kYXRhLmkzMltpXSA9PSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF84ODgpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGF2YWlsYWJsZUZvcm1hdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGF2YWlsYWJsZUZvcm1hdHNbaV0gPT0gSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfODg4KSB7CiAgICAgICAgICAgICBmYXN0SW5mby51c2VGbGV4aWJsZVl1diA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTA3OCw3ICsxMTQyLDcgQEAKICAgICAgICAgY29uc3QgY2hhciogdGFnTmFtZSA9IGdldF9jYW1lcmFfbWV0YWRhdGFfdGFnX25hbWUodGFnKTsKICAgICAgICAgaWYgKHRhZ05hbWUgPT0gTlVMTCkgdGFnTmFtZSA9ICI8dW5rbm93bj4iOwogICAgICAgICBBTE9HRSgiTWFsZm9ybWVkIHN0YXRpYyBtZXRhZGF0YSBlbnRyeSAnJXMuJXMnICgleCk6IgotICAgICAgICAgICAgICAgICJFeHBlY3RlZCBiZXR3ZWVuICVkIGFuZCAlZCB2YWx1ZXMsIGJ1dCBnb3QgJWQgdmFsdWVzIiwKKyAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgYmV0d2VlbiAlenUgYW5kICV6dSB2YWx1ZXMsIGJ1dCBnb3QgJXp1IHZhbHVlcyIsCiAgICAgICAgICAgICAgICAgdGFnU2VjdGlvbiwgdGFnTmFtZSwgdGFnLCBtaW5Db3VudCwgbWF4Q291bnQsIGVudHJ5LmNvdW50KTsKICAgICB9CiAKQEAgLTEyMjUsOCArMTI4OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICJpcyBhY3RpdmUhIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KLSAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgYXZhaWxhYmxlRm9ybWF0cyA9Ci0gICAgICAgICAgICBzdGF0aWNJbmZvKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9GT1JNQVRTKTsKKyAgICAgICAgU29ydGVkVmVjdG9yPGludDMyX3Q+IGF2YWlsYWJsZUZvcm1hdHMgPSBnZXRBdmFpbGFibGVPdXRwdXRGb3JtYXRzKCk7CiAgICAgICAgIC8vIElmIHVzaW5nIGZsZXhpYmxlIFlVViwgYWx3YXlzIHN1cHBvcnQgTlYyMS9ZVjEyLiBPdGhlcndpc2UsIGNoZWNrCiAgICAgICAgIC8vIEhBTCdzIGxpc3QuCiAgICAgICAgIGlmICghIChmYXN0SW5mby51c2VGbGV4aWJsZVl1diAmJgpAQCAtMTIzNSwxMSArMTI5OCwxMCBAQAogICAgICAgICAgICAgICAgICB2YWxpZGF0ZWRQYXJhbXMucHJldmlld0Zvcm1hdCA9PQogICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyKSApICkgewogICAgICAgICAgICAgLy8gTm90IHVzaW5nIGZsZXhpYmxlIFlVViBmb3JtYXQsIHNvIGNoZWNrIGV4cGxpY2l0bHkKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdmFpbGFibGVGb3JtYXRzLmNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoYXZhaWxhYmxlRm9ybWF0cy5kYXRhLmkzMltpXSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLnByZXZpZXdGb3JtYXQpIGJyZWFrOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGF2YWlsYWJsZUZvcm1hdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoYXZhaWxhYmxlRm9ybWF0c1tpXSA9PSB2YWxpZGF0ZWRQYXJhbXMucHJldmlld0Zvcm1hdCkgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaSA9PSBhdmFpbGFibGVGb3JtYXRzLmNvdW50KSB7CisgICAgICAgICAgICBpZiAoaSA9PSBhdmFpbGFibGVGb3JtYXRzLnNpemUoKSkgewogICAgICAgICAgICAgICAgIEFMT0dFKCIlczogUmVxdWVzdGVkIHByZXZpZXcgZm9ybWF0ICVzICgweCV4KSBpcyBub3Qgc3VwcG9ydGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbmV3UGFyYW1zLmdldFByZXZpZXdGb3JtYXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlZFBhcmFtcy5wcmV2aWV3Rm9ybWF0KTsKQEAgLTEzNTUsMTcgKzE0MTcsMTYgQEAKICAgICAvLyBQSUNUVVJFX1NJWkUKICAgICBuZXdQYXJhbXMuZ2V0UGljdHVyZVNpemUoJnZhbGlkYXRlZFBhcmFtcy5waWN0dXJlV2lkdGgsCiAgICAgICAgICAgICAmdmFsaWRhdGVkUGFyYW1zLnBpY3R1cmVIZWlnaHQpOwotICAgIGlmICh2YWxpZGF0ZWRQYXJhbXMucGljdHVyZVdpZHRoID09IHBpY3R1cmVXaWR0aCB8fAotICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLnBpY3R1cmVIZWlnaHQgPT0gcGljdHVyZUhlaWdodCkgewotICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVQaWN0dXJlU2l6ZXMgPQotICAgICAgICAgICAgc3RhdGljSW5mbyhBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfSlBFR19TSVpFUyk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdmFpbGFibGVQaWN0dXJlU2l6ZXMuY291bnQ7IGkrPTIpIHsKLSAgICAgICAgICAgIGlmICgoYXZhaWxhYmxlUGljdHVyZVNpemVzLmRhdGEuaTMyW2ldID09CisgICAgaWYgKHZhbGlkYXRlZFBhcmFtcy5waWN0dXJlV2lkdGggIT0gcGljdHVyZVdpZHRoIHx8CisgICAgICAgICAgICB2YWxpZGF0ZWRQYXJhbXMucGljdHVyZUhlaWdodCAhPSBwaWN0dXJlSGVpZ2h0KSB7CisgICAgICAgIFZlY3RvcjxTaXplPiBhdmFpbGFibGVQaWN0dXJlU2l6ZXMgPSBnZXRBdmFpbGFibGVKcGVnU2l6ZXMoKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGF2YWlsYWJsZVBpY3R1cmVTaXplcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKChhdmFpbGFibGVQaWN0dXJlU2l6ZXNbaV0ud2lkdGggPT0KICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLnBpY3R1cmVXaWR0aCkgJiYKLSAgICAgICAgICAgICAgICAoYXZhaWxhYmxlUGljdHVyZVNpemVzLmRhdGEuaTMyW2krMV0gPT0KKyAgICAgICAgICAgICAgICAoYXZhaWxhYmxlUGljdHVyZVNpemVzW2ldLmhlaWdodCA9PQogICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZWRQYXJhbXMucGljdHVyZUhlaWdodCkpIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGlmIChpID09IGF2YWlsYWJsZVBpY3R1cmVTaXplcy5jb3VudCkgeworICAgICAgICBpZiAoaSA9PSBhdmFpbGFibGVQaWN0dXJlU2l6ZXMuc2l6ZSgpKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IFJlcXVlc3RlZCBwaWN0dXJlIHNpemUgJWQgeCAlZCBpcyBub3Qgc3VwcG9ydGVkIiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB2YWxpZGF0ZWRQYXJhbXMucGljdHVyZVdpZHRoLAogICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZWRQYXJhbXMucGljdHVyZUhlaWdodCk7CkBAIC0xNTIyLDcgKzE1ODMsNyBAQAogICAgICAgICBuZXdQYXJhbXMuZ2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9TQ0VORV9NT0RFKSApOwogICAgIGlmICh2YWxpZGF0ZWRQYXJhbXMuc2NlbmVNb2RlICE9IHNjZW5lTW9kZSAmJgogICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLnNjZW5lTW9kZSAhPQotICAgICAgICAgICAgQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfVU5TVVBQT1JURUQpIHsKKyAgICAgICAgICAgIEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX0RJU0FCTEVEKSB7CiAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGF2YWlsYWJsZVNjZW5lTW9kZXMgPQogICAgICAgICAgICAgc3RhdGljSW5mbyhBTkRST0lEX0NPTlRST0xfQVZBSUxBQkxFX1NDRU5FX01PREVTKTsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IGF2YWlsYWJsZVNjZW5lTW9kZXMuY291bnQ7IGkrKykgewpAQCAtMTUzNyw3ICsxNTk4LDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBib29sIHNjZW5lTW9kZVNldCA9Ci0gICAgICAgICAgICB2YWxpZGF0ZWRQYXJhbXMuc2NlbmVNb2RlICE9IEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLnNjZW5lTW9kZSAhPSBBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9ESVNBQkxFRDsKIAogICAgIC8vIEZMQVNIX01PREUKICAgICBpZiAoc2NlbmVNb2RlU2V0KSB7CkBAIC0xNTU1LDcgKzE2MTYsOSBAQAogICAgIGlmICh2YWxpZGF0ZWRQYXJhbXMuZmxhc2hNb2RlICE9IGZsYXNoTW9kZSkgewogICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBmbGFzaEF2YWlsYWJsZSA9CiAgICAgICAgICAgICBzdGF0aWNJbmZvKEFORFJPSURfRkxBU0hfSU5GT19BVkFJTEFCTEUsIDEsIDEpOwotICAgICAgICBpZiAoIWZsYXNoQXZhaWxhYmxlLmRhdGEudThbMF0gJiYKKyAgICAgICAgYm9vbCBpc0ZsYXNoQXZhaWxhYmxlID0KKyAgICAgICAgICAgICAgICBmbGFzaEF2YWlsYWJsZS5kYXRhLnU4WzBdID09IEFORFJPSURfRkxBU0hfSU5GT19BVkFJTEFCTEVfVFJVRTsKKyAgICAgICAgaWYgKCFpc0ZsYXNoQXZhaWxhYmxlICYmCiAgICAgICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLmZsYXNoTW9kZSAhPSBQYXJhbWV0ZXJzOjpGTEFTSF9NT0RFX09GRikgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBSZXF1ZXN0ZWQgZmxhc2ggbW9kZSBcIiVzXCIgaXMgbm90IHN1cHBvcnRlZDogIgogICAgICAgICAgICAgICAgICAgICAiTm8gZmxhc2ggb24gZGV2aWNlIiwgX19GVU5DVElPTl9fLApAQCAtMTU4MCw5ICsxNjQzLDExIEBACiAgICAgICAgICAgICAgICAgICAgIG5ld1BhcmFtcy5nZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0ZMQVNIX01PREUpKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KLSAgICAgICAgLy8gVXBkYXRlIGluIGNhc2Ugb2Ygb3ZlcnJpZGUKLSAgICAgICAgbmV3UGFyYW1zLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfRkxBU0hfTU9ERSwKLSAgICAgICAgICAgICAgICBmbGFzaE1vZGVFbnVtVG9TdHJpbmcodmFsaWRhdGVkUGFyYW1zLmZsYXNoTW9kZSkpOworICAgICAgICAvLyBVcGRhdGUgaW4gY2FzZSBvZiBvdmVycmlkZSwgYnV0IG9ubHkgaWYgZmxhc2ggaXMgc3VwcG9ydGVkCisgICAgICAgIGlmIChpc0ZsYXNoQXZhaWxhYmxlKSB7CisgICAgICAgICAgICBuZXdQYXJhbXMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9GTEFTSF9NT0RFLAorICAgICAgICAgICAgICAgICAgICBmbGFzaE1vZGVFbnVtVG9TdHJpbmcodmFsaWRhdGVkUGFyYW1zLmZsYXNoTW9kZSkpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gV0hJVEVfQkFMQU5DRQpAQCAtMTY2NywxMCArMTczMiwxMSBAQAogICAgIC8vIEZPQ1VTX0FSRUFTCiAgICAgcmVzID0gcGFyc2VBcmVhcyhuZXdQYXJhbXMuZ2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9GT0NVU19BUkVBUyksCiAgICAgICAgICAgICAmdmFsaWRhdGVkUGFyYW1zLmZvY3VzaW5nQXJlYXMpOwotICAgIHNpemVfdCBtYXgzYVJlZ2lvbnMgPQotICAgICAgICAoc2l6ZV90KXN0YXRpY0luZm8oQU5EUk9JRF9DT05UUk9MX01BWF9SRUdJT05TLCAxLCAxKS5kYXRhLmkzMlswXTsKKyAgICBzaXplX3QgbWF4QWZSZWdpb25zID0gKHNpemVfdClzdGF0aWNJbmZvKEFORFJPSURfQ09OVFJPTF9NQVhfUkVHSU9OUywKKyAgICAgICAgICAgICAgUGFyYW1ldGVyczo6TlVNX1JFR0lPTiwgUGFyYW1ldGVyczo6TlVNX1JFR0lPTikuCisgICAgICAgICAgICAgIGRhdGEuaTMyW1BhcmFtZXRlcnM6OlJFR0lPTl9BRl07CiAgICAgaWYgKHJlcyA9PSBPSykgcmVzID0gdmFsaWRhdGVBcmVhcyh2YWxpZGF0ZWRQYXJhbXMuZm9jdXNpbmdBcmVhcywKLSAgICAgICAgICAgIG1heDNhUmVnaW9ucywgQVJFQV9LSU5EX0ZPQ1VTKTsKKyAgICAgICAgICAgIG1heEFmUmVnaW9ucywgQVJFQV9LSU5EX0ZPQ1VTKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogUmVxdWVzdGVkIGZvY3VzIGFyZWFzIGFyZSBtYWxmb3JtZWQ6ICVzIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG5ld1BhcmFtcy5nZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0ZPQ1VTX0FSRUFTKSk7CkBAIC0xNzAwLDEwICsxNzY2LDEzIEBACiAgICAgICAgIG5ld1BhcmFtcy5nZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0FVVE9fV0hJVEVCQUxBTkNFX0xPQ0spKTsKIAogICAgIC8vIE1FVEVSSU5HX0FSRUFTCisgICAgc2l6ZV90IG1heEFlUmVnaW9ucyA9IChzaXplX3Qpc3RhdGljSW5mbyhBTkRST0lEX0NPTlRST0xfTUFYX1JFR0lPTlMsCisgICAgICAgICAgICBQYXJhbWV0ZXJzOjpOVU1fUkVHSU9OLCBQYXJhbWV0ZXJzOjpOVU1fUkVHSU9OKS4KKyAgICAgICAgICAgIGRhdGEuaTMyW1BhcmFtZXRlcnM6OlJFR0lPTl9BRV07CiAgICAgcmVzID0gcGFyc2VBcmVhcyhuZXdQYXJhbXMuZ2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9NRVRFUklOR19BUkVBUyksCiAgICAgICAgICAgICAmdmFsaWRhdGVkUGFyYW1zLm1ldGVyaW5nQXJlYXMpOwogICAgIGlmIChyZXMgPT0gT0spIHsKLSAgICAgICAgcmVzID0gdmFsaWRhdGVBcmVhcyh2YWxpZGF0ZWRQYXJhbXMubWV0ZXJpbmdBcmVhcywgbWF4M2FSZWdpb25zLAorICAgICAgICByZXMgPSB2YWxpZGF0ZUFyZWFzKHZhbGlkYXRlZFBhcmFtcy5tZXRlcmluZ0FyZWFzLCBtYXhBZVJlZ2lvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJFQV9LSU5EX01FVEVSSU5HKTsKICAgICB9CiAgICAgaWYgKHJlcyAhPSBPSykgewpAQCAtMTcyOCwyMSArMTc5NywyNiBAQAogICAgIGlmICh2YWxpZGF0ZWRQYXJhbXMudmlkZW9XaWR0aCAhPSB2aWRlb1dpZHRoIHx8CiAgICAgICAgICAgICB2YWxpZGF0ZWRQYXJhbXMudmlkZW9IZWlnaHQgIT0gdmlkZW9IZWlnaHQpIHsKICAgICAgICAgaWYgKHN0YXRlID09IFJFQ09SRCkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBWaWRlbyBzaXplIGNhbm5vdCBiZSB1cGRhdGVkIHdoZW4gcmVjb3JkaW5nIGlzIGFjdGl2ZSEiLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXZhaWxhYmxlUHJldmlld1NpemVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoKGF2YWlsYWJsZVByZXZpZXdTaXplc1tpXS53aWR0aCA9PQotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZWRQYXJhbXMudmlkZW9XaWR0aCkgJiYKLSAgICAgICAgICAgICAgICAoYXZhaWxhYmxlUHJldmlld1NpemVzW2ldLmhlaWdodCA9PQotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZWRQYXJhbXMudmlkZW9IZWlnaHQpKSBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoaSA9PSBhdmFpbGFibGVQcmV2aWV3U2l6ZXMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IFJlcXVlc3RlZCB2aWRlbyBzaXplICVkIHggJWQgaXMgbm90IHN1cHBvcnRlZCIsCi0gICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdmFsaWRhdGVkUGFyYW1zLnZpZGVvV2lkdGgsCisgICAgICAgICAgICBBTE9HVygiJXM6IFZpZGVvIHNpemUgY2Fubm90IGJlIHVwZGF0ZWQgKGZyb20gJWQgeCAlZCB0byAlZCB4ICVkKSIKKyAgICAgICAgICAgICAgICAgICAgIiB3aGVuIHJlY29yZGluZyBpcyBhY3RpdmUhIElnbm9yZSB0aGUgc2l6ZSB1cGRhdGUhIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCwgdmFsaWRhdGVkUGFyYW1zLnZpZGVvV2lkdGgsCiAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlZFBhcmFtcy52aWRlb0hlaWdodCk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLnZpZGVvV2lkdGggPSB2aWRlb1dpZHRoOworICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLnZpZGVvSGVpZ2h0ID0gdmlkZW9IZWlnaHQ7CisgICAgICAgICAgICBuZXdQYXJhbXMuc2V0VmlkZW9TaXplKHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdmFpbGFibGVWaWRlb1NpemVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKChhdmFpbGFibGVWaWRlb1NpemVzW2ldLndpZHRoID09CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZWRQYXJhbXMudmlkZW9XaWR0aCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKGF2YWlsYWJsZVZpZGVvU2l6ZXNbaV0uaGVpZ2h0ID09CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZWRQYXJhbXMudmlkZW9IZWlnaHQpKSBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpID09IGF2YWlsYWJsZVZpZGVvU2l6ZXMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBSZXF1ZXN0ZWQgdmlkZW8gc2l6ZSAlZCB4ICVkIGlzIG5vdCBzdXBwb3J0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB2YWxpZGF0ZWRQYXJhbXMudmlkZW9XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlZFBhcmFtcy52aWRlb0hlaWdodCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMTc2NCw2ICsxODM4LDcgQEAKICAgICAvKiogVXBkYXRlIGludGVybmFsIHBhcmFtZXRlcnMgKi8KIAogICAgICp0aGlzID0gdmFsaWRhdGVkUGFyYW1zOworICAgIHVwZGF0ZU92ZXJyaWRkZW5KcGVnU2l6ZSgpOwogCiAgICAgLyoqIFVwZGF0ZSBleHRlcm5hbCBwYXJhbWV0ZXJzIGNhbGN1bGF0ZWQgZnJvbSB0aGUgaW50ZXJuYWwgb25lcyAqLwogCkBAIC0xODI2LDYgKzE5MDEsOSBAQAogCiAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgaW50ZW50ID0KICAgICAgICAgICAgIHJlcXVlc3QtPmZpbmQoQU5EUk9JRF9DT05UUk9MX0NBUFRVUkVfSU5URU5UKTsKKworICAgIGlmIChpbnRlbnQuY291bnQgPT0gMCkgcmV0dXJuIEJBRF9WQUxVRTsKKwogICAgIGlmIChpbnRlbnQuZGF0YS51OFswXSA9PSBBTkRST0lEX0NPTlRST0xfQ0FQVFVSRV9JTlRFTlRfU1RJTExfQ0FQVFVSRSkgewogICAgICAgICByZXMgPSByZXF1ZXN0LT51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0FFX1RBUkdFVF9GUFNfUkFOR0UsCiAgICAgICAgICAgICAgICAgZmFzdEluZm8uYmVzdFN0aWxsQ2FwdHVyZUZwc1JhbmdlLCAyKTsKQEAgLTE4NTIsNyArMTkzMCw3IEBACiAgICAgLy8gKGZhY2UgZGV0ZWN0aW9uIHN0YXRpc3RpY3MgYW5kIGZhY2UgcHJpb3JpdHkgc2NlbmUgbW9kZSkuIE1hcCBmcm9tIG90aGVyCiAgICAgLy8gdG8gdGhlIG90aGVyLgogICAgIGJvb2wgc2NlbmVNb2RlQWN0aXZlID0KLSAgICAgICAgICAgIHNjZW5lTW9kZSAhPSAodWludDhfdClBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9VTlNVUFBPUlRFRDsKKyAgICAgICAgICAgIHNjZW5lTW9kZSAhPSAodWludDhfdClBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9ESVNBQkxFRDsKICAgICB1aW50OF90IHJlcUNvbnRyb2xNb2RlID0gQU5EUk9JRF9DT05UUk9MX01PREVfQVVUTzsKICAgICBpZiAoZW5hYmxlRmFjZURldGVjdCB8fCBzY2VuZU1vZGVBY3RpdmUpIHsKICAgICAgICAgcmVxQ29udHJvbE1vZGUgPSBBTkRST0lEX0NPTlRST0xfTU9ERV9VU0VfU0NFTkVfTU9ERTsKQEAgLTE4NjQsNyArMTk0Miw3IEBACiAgICAgdWludDhfdCByZXFTY2VuZU1vZGUgPQogICAgICAgICAgICAgc2NlbmVNb2RlQWN0aXZlID8gc2NlbmVNb2RlIDoKICAgICAgICAgICAgIGVuYWJsZUZhY2VEZXRlY3QgPyAodWludDhfdClBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9GQUNFX1BSSU9SSVRZIDoKLSAgICAgICAgICAgICh1aW50OF90KUFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgKHVpbnQ4X3QpQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfRElTQUJMRUQ7CiAgICAgcmVzID0gcmVxdWVzdC0+dXBkYXRlKEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFLAogICAgICAgICAgICAgJnJlcVNjZW5lTW9kZSwgMSk7CiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKQEAgLTE5ODUsNiArMjA2MywyMyBAQAogICAgICAgICAgICAgcmVxTWV0ZXJpbmdBcmVhcywgcmVxTWV0ZXJpbmdBcmVhc1NpemUpOwogICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CiAKKyAgICAvLyBTZXQgYXdiIHJlZ2lvbnMgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIG1ldGVyaW5nIHJlZ2lvbnMgaWYgYWxsb3dlZAorICAgIHNpemVfdCBtYXhBd2JSZWdpb25zID0gKHNpemVfdClzdGF0aWNJbmZvKEFORFJPSURfQ09OVFJPTF9NQVhfUkVHSU9OUywKKyAgICAgICAgICAgIFBhcmFtZXRlcnM6Ok5VTV9SRUdJT04sIFBhcmFtZXRlcnM6Ok5VTV9SRUdJT04pLgorICAgICAgICAgICAgZGF0YS5pMzJbUGFyYW1ldGVyczo6UkVHSU9OX0FXQl07CisgICAgaWYgKG1heEF3YlJlZ2lvbnMgPiAwKSB7CisgICAgICAgIGlmIChtYXhBd2JSZWdpb25zID49IG1ldGVyaW5nQXJlYXMuc2l6ZSgpKSB7CisgICAgICAgICAgICByZXMgPSByZXF1ZXN0LT51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0FXQl9SRUdJT05TLAorICAgICAgICAgICAgICAgICAgICByZXFNZXRlcmluZ0FyZWFzLCByZXFNZXRlcmluZ0FyZWFzU2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBFbnN1cmUgdGhlIGF3YiByZWdpb25zIGFyZSB6ZXJvZWQgaWYgdGhlIHJlZ2lvbiBjb3VudCBpcyB0b28gaGlnaC4KKyAgICAgICAgICAgIGludDMyX3QgemVyb2VkQXdiQXJlYXNbNV0gPSB7MCwgMCwgMCwgMCwgMH07CisgICAgICAgICAgICByZXMgPSByZXF1ZXN0LT51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0FXQl9SRUdJT05TLAorICAgICAgICAgICAgICAgICAgICB6ZXJvZWRBd2JBcmVhcywgc2l6ZW9mKHplcm9lZEF3YkFyZWFzKS9zaXplb2YoaW50MzJfdCkpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CisgICAgfQorCiAgICAgZGVsZXRlW10gcmVxTWV0ZXJpbmdBcmVhczsKIAogICAgIC8qIGRvbid0IGluY2x1ZGUganBlZyB0aHVtYm5haWwgc2l6ZSAtIGl0J3MgdmFsaWQgZm9yCkBAIC0yMDYxLDYgKzIxNTYsNTIgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IFBhcmFtZXRlcnM6Om92ZXJyaWRlSnBlZ1NpemVCeVZpZGVvU2l6ZSgpIHsKKyAgICBpZiAocGljdHVyZVNpemVPdmVycmlkZW4pIHsKKyAgICAgICAgQUxPR1YoIlBpY3R1cmUgc2l6ZSBoYXMgYmVlbiBvdmVycmlkZGVuLiBTa2lwIG92ZXJyaWRpbmciKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHBpY3R1cmVTaXplT3ZlcnJpZGVuID0gdHJ1ZTsKKyAgICBwaWN0dXJlV2lkdGhMYXN0U2V0ID0gcGljdHVyZVdpZHRoOworICAgIHBpY3R1cmVIZWlnaHRMYXN0U2V0ID0gcGljdHVyZUhlaWdodDsKKyAgICBwaWN0dXJlV2lkdGggPSB2aWRlb1dpZHRoOworICAgIHBpY3R1cmVIZWlnaHQgPSB2aWRlb0hlaWdodDsKKyAgICAvLyBUaGlzIGNoYW5nZSBvZiBwaWN0dXJlIHNpemUgaXMgaW52aXNpYmxlIHRvIGFwcCBsYXllci4KKyAgICAvLyBEbyBub3QgdXBkYXRlIGFwcCB2aXNpYmxlIHBhcmFtcworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgUGFyYW1ldGVyczo6dXBkYXRlT3ZlcnJpZGRlbkpwZWdTaXplKCkgeworICAgIGlmICghcGljdHVyZVNpemVPdmVycmlkZW4pIHsKKyAgICAgICAgQUxPR1YoIlBpY3R1cmUgc2l6ZSBoYXMgbm90IGJlZW4gb3ZlcnJpZGRlbi4gU2tpcCBjaGVja2luZyIpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgcGljdHVyZVdpZHRoTGFzdFNldCA9IHBpY3R1cmVXaWR0aDsKKyAgICBwaWN0dXJlSGVpZ2h0TGFzdFNldCA9IHBpY3R1cmVIZWlnaHQ7CisKKyAgICBpZiAocGljdHVyZVdpZHRoIDw9IHZpZGVvV2lkdGggJiYgcGljdHVyZUhlaWdodCA8PSB2aWRlb0hlaWdodCkgeworICAgICAgICAvLyBQaWN0dXJlIHNpemUgaXMgbm93IHNtYWxsZXIgdGhhbiB2aWRlbyBzaXplLiBObyBuZWVkIHRvIG92ZXJyaWRlIGFueW1vcmUKKyAgICAgICAgcmV0dXJuIHJlY292ZXJPdmVycmlkZGVuSnBlZ1NpemUoKTsKKyAgICB9CisKKyAgICBwaWN0dXJlV2lkdGggPSB2aWRlb1dpZHRoOworICAgIHBpY3R1cmVIZWlnaHQgPSB2aWRlb0hlaWdodDsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgUGFyYW1ldGVyczo6cmVjb3Zlck92ZXJyaWRkZW5KcGVnU2l6ZSgpIHsKKyAgICBpZiAoIXBpY3R1cmVTaXplT3ZlcnJpZGVuKSB7CisgICAgICAgIEFMT0dWKCJQaWN0dXJlIHNpemUgaGFzIG5vdCBiZWVuIG92ZXJyaWRkZW4uIFNraXAgcmVjb3ZlcmluZyIpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIHBpY3R1cmVTaXplT3ZlcnJpZGVuID0gZmFsc2U7CisgICAgcGljdHVyZVdpZHRoID0gcGljdHVyZVdpZHRoTGFzdFNldDsKKyAgICBwaWN0dXJlSGVpZ2h0ID0gcGljdHVyZUhlaWdodExhc3RTZXQ7CisgICAgcmV0dXJuIE9LOworfQogCiBjb25zdCBjaGFyKiBQYXJhbWV0ZXJzOjpnZXRTdGF0ZU5hbWUoU3RhdGUgc3RhdGUpIHsKICNkZWZpbmUgQ0FTRV9FTlVNX1RPX0NIQVIoeCkgY2FzZSB4OiByZXR1cm4oI3gpOyBicmVhazsKQEAgLTIwODAsMjQgKzIyMjEsNyBAQAogfQogCiBpbnQgUGFyYW1ldGVyczo6Zm9ybWF0U3RyaW5nVG9FbnVtKGNvbnN0IGNoYXIgKmZvcm1hdCkgewotICAgIHJldHVybgotICAgICAgICAhZm9ybWF0ID8KLSAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWUNyQ2JfNDIwX1NQIDoKLSAgICAgICAgIXN0cmNtcChmb3JtYXQsIENhbWVyYVBhcmFtZXRlcnM6OlBJWEVMX0ZPUk1BVF9ZVVY0MjJTUCkgPwotICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjJfU1AgOiAvLyBOVjE2Ci0gICAgICAgICFzdHJjbXAoZm9ybWF0LCBDYW1lcmFQYXJhbWV0ZXJzOjpQSVhFTF9GT1JNQVRfWVVWNDIwU1ApID8KLSAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWUNyQ2JfNDIwX1NQIDogLy8gTlYyMQotICAgICAgICAhc3RyY21wKGZvcm1hdCwgQ2FtZXJhUGFyYW1ldGVyczo6UElYRUxfRk9STUFUX1lVVjQyMkkpID8KLSAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIyX0kgOiAgLy8gWVVZMgotICAgICAgICAhc3RyY21wKGZvcm1hdCwgQ2FtZXJhUGFyYW1ldGVyczo6UElYRUxfRk9STUFUX1lVVjQyMFApID8KLSAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWVYxMiA6ICAgICAgICAgLy8gWVYxMgotICAgICAgICAhc3RyY21wKGZvcm1hdCwgQ2FtZXJhUGFyYW1ldGVyczo6UElYRUxfRk9STUFUX1JHQjU2NSkgPwotICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1IDogICAgICAvLyBSR0I1NjUKLSAgICAgICAgIXN0cmNtcChmb3JtYXQsIENhbWVyYVBhcmFtZXRlcnM6OlBJWEVMX0ZPUk1BVF9SR0JBODg4OCkgPwotICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODggOiAgICAvLyBSR0I4ODg4Ci0gICAgICAgICFzdHJjbXAoZm9ybWF0LCBDYW1lcmFQYXJhbWV0ZXJzOjpQSVhFTF9GT1JNQVRfQkFZRVJfUkdHQikgPwotICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9SQVdfU0VOU09SIDogICAvLyBSYXcgc2Vuc29yIGRhdGEKLSAgICAgICAgLTE7CisgICAgcmV0dXJuIENhbWVyYVBhcmFtZXRlcnM6OnByZXZpZXdGb3JtYXRUb0VudW0oZm9ybWF0KTsKIH0KIAogY29uc3QgY2hhciogUGFyYW1ldGVyczo6Zm9ybWF0RW51bVRvU3RyaW5nKGludCBmb3JtYXQpIHsKQEAgLTIyMjUsOSArMjM0OSw5IEBACiBpbnQgUGFyYW1ldGVyczo6c2NlbmVNb2RlU3RyaW5nVG9FbnVtKGNvbnN0IGNoYXIgKnNjZW5lTW9kZSkgewogICAgIHJldHVybgogICAgICAgICAhc2NlbmVNb2RlID8KLSAgICAgICAgICAgIEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX1VOU1VQUE9SVEVEIDoKKyAgICAgICAgICAgIEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX0RJU0FCTEVEIDoKICAgICAgICAgIXN0cmNtcChzY2VuZU1vZGUsIENhbWVyYVBhcmFtZXRlcnM6OlNDRU5FX01PREVfQVVUTykgPwotICAgICAgICAgICAgQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfVU5TVVBQT1JURUQgOgorICAgICAgICAgICAgQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfRElTQUJMRUQgOgogICAgICAgICAhc3RyY21wKHNjZW5lTW9kZSwgQ2FtZXJhUGFyYW1ldGVyczo6U0NFTkVfTU9ERV9BQ1RJT04pID8KICAgICAgICAgICAgIEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX0FDVElPTiA6CiAgICAgICAgICFzdHJjbXAoc2NlbmVNb2RlLCBDYW1lcmFQYXJhbWV0ZXJzOjpTQ0VORV9NT0RFX1BPUlRSQUlUKSA/CkBAIC0yMjY1LDcgKzIzODksNyBAQAogICAgICAgICBjb25zdCBjaGFyICpmbGFzaE1vZGUpIHsKICAgICByZXR1cm4KICAgICAgICAgIWZsYXNoTW9kZSA/Ci0gICAgICAgICAgICBQYXJhbWV0ZXJzOjpGTEFTSF9NT0RFX0lOVkFMSUQgOgorICAgICAgICAgICAgUGFyYW1ldGVyczo6RkxBU0hfTU9ERV9PRkYgOgogICAgICAgICAhc3RyY21wKGZsYXNoTW9kZSwgQ2FtZXJhUGFyYW1ldGVyczo6RkxBU0hfTU9ERV9PRkYpID8KICAgICAgICAgICAgIFBhcmFtZXRlcnM6OkZMQVNIX01PREVfT0ZGIDoKICAgICAgICAgIXN0cmNtcChmbGFzaE1vZGUsIENhbWVyYVBhcmFtZXRlcnM6OkZMQVNIX01PREVfQVVUTykgPwpAQCAtMjQwNiw3ICsyNTMwLDcgQEAKICAgICB9CiAKICAgICBpZiAoYXJlYXMuc2l6ZSgpID4gbWF4UmVnaW9ucykgewotICAgICAgICBBTE9HRSgiJXM6IFRvbyBtYW55IGFyZWFzIHJlcXVlc3RlZDogJWQiLAorICAgICAgICBBTE9HRSgiJXM6IFRvbyBtYW55IGFyZWFzIHJlcXVlc3RlZDogJXp1IiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGFyZWFzLnNpemUoKSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQpAQCAtMjU2Niw3ICsyNjkwLDcgQEAKICAgICByZXR1cm4gY3JvcFlUb0FycmF5KG5vcm1hbGl6ZWRZVG9Dcm9wKHkpKTsKIH0KIAotc3RhdHVzX3QgUGFyYW1ldGVyczo6Z2V0RmlsdGVyZWRQcmV2aWV3U2l6ZXMoU2l6ZSBsaW1pdCwgVmVjdG9yPFNpemU+ICpzaXplcykgeworc3RhdHVzX3QgUGFyYW1ldGVyczo6Z2V0RmlsdGVyZWRTaXplcyhTaXplIGxpbWl0LCBWZWN0b3I8U2l6ZT4gKnNpemVzKSB7CiAgICAgaWYgKGluZm8gPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiJXM6IFN0YXRpYyBtZXRhZGF0YSBpcyBub3QgaW5pdGlhbGl6ZWQiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm4gTk9fSU5JVDsKQEAgLTI1NzUsMjIgKzI2OTksMzcgQEAKICAgICAgICAgQUxPR0UoIiVzOiBJbnB1dCBzaXplIGlzIG51bGwiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KKyAgICBzaXplcy0+Y2xlYXIoKTsKIAotICAgIGNvbnN0IHNpemVfdCBTSVpFX0NPVU5UID0gc2l6ZW9mKFNpemUpIC8gc2l6ZW9mKGludCk7Ci0gICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgYXZhaWxhYmxlUHJvY2Vzc2VkU2l6ZXMgPQotICAgICAgICBzdGF0aWNJbmZvKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9QUk9DRVNTRURfU0laRVMsIFNJWkVfQ09VTlQpOwotICAgIGlmIChhdmFpbGFibGVQcm9jZXNzZWRTaXplcy5jb3VudCA8IFNJWkVfQ09VTlQpIHJldHVybiBCQURfVkFMVUU7Ci0KLSAgICBTaXplIHByZXZpZXdTaXplOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXZhaWxhYmxlUHJvY2Vzc2VkU2l6ZXMuY291bnQ7IGkgKz0gU0laRV9DT1VOVCkgewotICAgICAgICBwcmV2aWV3U2l6ZS53aWR0aCA9IGF2YWlsYWJsZVByb2Nlc3NlZFNpemVzLmRhdGEuaTMyW2ldOwotICAgICAgICBwcmV2aWV3U2l6ZS5oZWlnaHQgPSBhdmFpbGFibGVQcm9jZXNzZWRTaXplcy5kYXRhLmkzMltpKzFdOwotICAgICAgICAgICAgLy8gTmVlZCBza2lwIHRoZSBwcmV2aWV3IHNpemVzIHRoYXQgYXJlIHRvbyBsYXJnZS4KLSAgICAgICAgICAgIGlmIChwcmV2aWV3U2l6ZS53aWR0aCA8PSBsaW1pdC53aWR0aCAmJgotICAgICAgICAgICAgICAgICAgICBwcmV2aWV3U2l6ZS5oZWlnaHQgPD0gbGltaXQuaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgc2l6ZXMtPnB1c2gocHJldmlld1NpemUpOworICAgIGlmIChtRGV2aWNlVmVyc2lvbiA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgeworICAgICAgICBWZWN0b3I8U3RyZWFtQ29uZmlndXJhdGlvbj4gc2NzID0gZ2V0U3RyZWFtQ29uZmlndXJhdGlvbnMoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaT0wOyBpIDwgc2NzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBTdHJlYW1Db25maWd1cmF0aW9uICZzYyA9IHNjc1tpXTsKKyAgICAgICAgICAgIGlmIChzYy5pc0lucHV0ID09IEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlNfT1VUUFVUICYmCisgICAgICAgICAgICAgICAgICAgIHNjLmZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQgJiYKKyAgICAgICAgICAgICAgICAgICAgc2Mud2lkdGggPD0gbGltaXQud2lkdGggJiYgc2MuaGVpZ2h0IDw9IGxpbWl0LmhlaWdodCkgeworICAgICAgICAgICAgICAgIFNpemUgc3ogPSB7c2Mud2lkdGgsIHNjLmhlaWdodH07CisgICAgICAgICAgICAgICAgc2l6ZXMtPnB1c2goc3opOwogICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3Qgc2l6ZV90IFNJWkVfQ09VTlQgPSBzaXplb2YoU2l6ZSkgLyBzaXplb2YoaW50KTsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgYXZhaWxhYmxlUHJvY2Vzc2VkU2l6ZXMgPQorICAgICAgICAgICAgc3RhdGljSW5mbyhBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfUFJPQ0VTU0VEX1NJWkVTLCBTSVpFX0NPVU5UKTsKKyAgICAgICAgaWYgKGF2YWlsYWJsZVByb2Nlc3NlZFNpemVzLmNvdW50IDwgU0laRV9DT1VOVCkgcmV0dXJuIEJBRF9WQUxVRTsKKworICAgICAgICBTaXplIGZpbHRlcmVkU2l6ZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhdmFpbGFibGVQcm9jZXNzZWRTaXplcy5jb3VudDsgaSArPSBTSVpFX0NPVU5UKSB7CisgICAgICAgICAgICBmaWx0ZXJlZFNpemUud2lkdGggPSBhdmFpbGFibGVQcm9jZXNzZWRTaXplcy5kYXRhLmkzMltpXTsKKyAgICAgICAgICAgIGZpbHRlcmVkU2l6ZS5oZWlnaHQgPSBhdmFpbGFibGVQcm9jZXNzZWRTaXplcy5kYXRhLmkzMltpKzFdOworICAgICAgICAgICAgICAgIC8vIE5lZWQgc2tpcCB0aGUgcHJldmlldyBzaXplcyB0aGF0IGFyZSB0b28gbGFyZ2UuCisgICAgICAgICAgICAgICAgaWYgKGZpbHRlcmVkU2l6ZS53aWR0aCA8PSBsaW1pdC53aWR0aCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRTaXplLmhlaWdodCA8PSBsaW1pdC5oZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZXMtPnB1c2goZmlsdGVyZWRTaXplKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CisKICAgICBpZiAoc2l6ZXMtPmlzRW1wdHkoKSkgewogICAgICAgICBBTE9HRSgiZ2VuZXJhdGVkIHByZXZpZXcgc2l6ZSBsaXN0IGlzIGVtcHR5ISEiKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTI2MjQsNiArMjc2Myw3OCBAQAogICAgIHJldHVybiBtYXhTaXplOwogfQogCitWZWN0b3I8UGFyYW1ldGVyczo6U3RyZWFtQ29uZmlndXJhdGlvbj4gUGFyYW1ldGVyczo6Z2V0U3RyZWFtQ29uZmlndXJhdGlvbnMoKSB7CisgICAgY29uc3QgaW50IFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUgPSA0OworICAgIGNvbnN0IGludCBTVFJFQU1fRk9STUFUX09GRlNFVCA9IDA7CisgICAgY29uc3QgaW50IFNUUkVBTV9XSURUSF9PRkZTRVQgPSAxOworICAgIGNvbnN0IGludCBTVFJFQU1fSEVJR0hUX09GRlNFVCA9IDI7CisgICAgY29uc3QgaW50IFNUUkVBTV9JU19JTlBVVF9PRkZTRVQgPSAzOworICAgIFZlY3RvcjxTdHJlYW1Db25maWd1cmF0aW9uPiBzY3M7CisgICAgaWYgKG1EZXZpY2VWZXJzaW9uIDwgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzIpIHsKKyAgICAgICAgQUxPR0UoIlN0cmVhbUNvbmZpZ3VyYXRpb24gaXMgb25seSB2YWxpZCBhZnRlciBkZXZpY2UgSEFMIDMuMiEiKTsKKyAgICAgICAgcmV0dXJuIHNjczsKKyAgICB9CisKKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVTdHJlYW1Db25maWdzID0KKyAgICAgICAgICAgICAgICBzdGF0aWNJbmZvKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMpOworICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuY291bnQ7IGkrPSBTVFJFQU1fQ09ORklHVVJBVElPTl9TSVpFKSB7CisgICAgICAgIGludDMyX3QgZm9ybWF0ID0gYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX0ZPUk1BVF9PRkZTRVRdOworICAgICAgICBpbnQzMl90IHdpZHRoID0gYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX1dJRFRIX09GRlNFVF07CisgICAgICAgIGludDMyX3QgaGVpZ2h0ID0gYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX0hFSUdIVF9PRkZTRVRdOworICAgICAgICBpbnQzMl90IGlzSW5wdXQgPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fSVNfSU5QVVRfT0ZGU0VUXTsKKyAgICAgICAgU3RyZWFtQ29uZmlndXJhdGlvbiBzYyA9IHtmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGlzSW5wdXR9OworICAgICAgICBzY3MuYWRkKHNjKTsKKyAgICB9CisgICAgcmV0dXJuIHNjczsKK30KKworU29ydGVkVmVjdG9yPGludDMyX3Q+IFBhcmFtZXRlcnM6OmdldEF2YWlsYWJsZU91dHB1dEZvcm1hdHMoKSB7CisgICAgU29ydGVkVmVjdG9yPGludDMyX3Q+IG91dHB1dEZvcm1hdHM7IC8vIE5vbi1kdXBsaWNhdGVkIG91dHB1dCBmb3JtYXRzCisgICAgaWYgKG1EZXZpY2VWZXJzaW9uID49IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yKSB7CisgICAgICAgIFZlY3RvcjxTdHJlYW1Db25maWd1cmF0aW9uPiBzY3MgPSBnZXRTdHJlYW1Db25maWd1cmF0aW9ucygpOworICAgICAgICBmb3IgKHNpemVfdCBpPTA7IGkgPCBzY3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IFN0cmVhbUNvbmZpZ3VyYXRpb24gJnNjID0gc2NzW2ldOworICAgICAgICAgICAgaWYgKHNjLmlzSW5wdXQgPT0gQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OU19PVVRQVVQpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRGb3JtYXRzLmFkZChzYy5mb3JtYXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgYXZhaWxhYmxlRm9ybWF0cyA9IHN0YXRpY0luZm8oQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX0ZPUk1BVFMpOworICAgICAgICBmb3IgKHNpemVfdCBpPTA7IGkgPCBhdmFpbGFibGVGb3JtYXRzLmNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIG91dHB1dEZvcm1hdHMuYWRkKGF2YWlsYWJsZUZvcm1hdHMuZGF0YS5pMzJbaV0pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBvdXRwdXRGb3JtYXRzOworfQorCitWZWN0b3I8UGFyYW1ldGVyczo6U2l6ZT4gUGFyYW1ldGVyczo6Z2V0QXZhaWxhYmxlSnBlZ1NpemVzKCkgeworICAgIFZlY3RvcjxQYXJhbWV0ZXJzOjpTaXplPiBqcGVnU2l6ZXM7CisgICAgaWYgKG1EZXZpY2VWZXJzaW9uID49IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yKSB7CisgICAgICAgIFZlY3RvcjxTdHJlYW1Db25maWd1cmF0aW9uPiBzY3MgPSBnZXRTdHJlYW1Db25maWd1cmF0aW9ucygpOworICAgICAgICBmb3IgKHNpemVfdCBpPTA7IGkgPCBzY3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IFN0cmVhbUNvbmZpZ3VyYXRpb24gJnNjID0gc2NzW2ldOworICAgICAgICAgICAgaWYgKHNjLmlzSW5wdXQgPT0gQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OU19PVVRQVVQgJiYKKyAgICAgICAgICAgICAgICAgICAgc2MuZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgeworICAgICAgICAgICAgICAgIFNpemUgc3ogPSB7c2Mud2lkdGgsIHNjLmhlaWdodH07CisgICAgICAgICAgICAgICAganBlZ1NpemVzLmFkZChzeik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBpbnQgSlBFR19TSVpFX0VOVFJZX0NPVU5UID0gMjsKKyAgICAgICAgY29uc3QgaW50IFdJRFRIX09GRlNFVCA9IDA7CisgICAgICAgIGNvbnN0IGludCBIRUlHSFRfT0ZGU0VUID0gMTsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgYXZhaWxhYmxlSnBlZ1NpemVzID0KKyAgICAgICAgICAgIHN0YXRpY0luZm8oQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX0pQRUdfU0laRVMpOworICAgICAgICBmb3IgKHNpemVfdCBpPTA7IGkgPCBhdmFpbGFibGVKcGVnU2l6ZXMuY291bnQ7IGkrPSBKUEVHX1NJWkVfRU5UUllfQ09VTlQpIHsKKyAgICAgICAgICAgIGludCB3aWR0aCA9IGF2YWlsYWJsZUpwZWdTaXplcy5kYXRhLmkzMltpICsgV0lEVEhfT0ZGU0VUXTsKKyAgICAgICAgICAgIGludCBoZWlnaHQgPSBhdmFpbGFibGVKcGVnU2l6ZXMuZGF0YS5pMzJbaSArIEhFSUdIVF9PRkZTRVRdOworICAgICAgICAgICAgU2l6ZSBzeiA9IHt3aWR0aCwgaGVpZ2h0fTsKKyAgICAgICAgICAgIGpwZWdTaXplcy5hZGQoc3opOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBqcGVnU2l6ZXM7Cit9CisKIFBhcmFtZXRlcnM6OkNyb3BSZWdpb24gUGFyYW1ldGVyczo6Y2FsY3VsYXRlQ3JvcFJlZ2lvbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJzOjpDcm9wUmVnaW9uOjpPdXRwdXRzIG91dHB1dHMpIGNvbnN0IHsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmgKaW5kZXggZGEwN2NjZi4uODE1Y2M1NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5oCkBAIC01Miw2ICs1Miw5IEBACiAgICAgaW50IHByZXZpZXdUcmFuc2Zvcm07IC8vIHNldCBieSBDQU1FUkFfQ01EX1NFVF9ESVNQTEFZX09SSUVOVEFUSU9OCiAKICAgICBpbnQgcGljdHVyZVdpZHRoLCBwaWN0dXJlSGVpZ2h0OworICAgIC8vIFN0b3JlIHRoZSBwaWN0dXJlIHNpemUgYmVmb3JlIHRoZXkgYXJlIG92ZXJyaWRlbiBieSB2aWRlbyBzbmFwc2hvdAorICAgIGludCBwaWN0dXJlV2lkdGhMYXN0U2V0LCBwaWN0dXJlSGVpZ2h0TGFzdFNldDsKKyAgICBib29sIHBpY3R1cmVTaXplT3ZlcnJpZGVuOwogCiAgICAgaW50MzJfdCBqcGVnVGh1bWJTaXplWzJdOwogICAgIHVpbnQ4X3QganBlZ1F1YWxpdHksIGpwZWdUaHVtYlF1YWxpdHk7CkBAIC0xMTQsNiArMTE3LDE0IEBACiAgICAgYm9vbCBhdXRvRXhwb3N1cmVMb2NrOwogICAgIGJvb2wgYXV0b1doaXRlQmFsYW5jZUxvY2s7CiAKKyAgICAvLyAzQSByZWdpb24gdHlwZXMsIGZvciB1c2Ugd2l0aCBBTkRST0lEX0NPTlRST0xfTUFYX1JFR0lPTlMKKyAgICBlbnVtIHJlZ2lvbl90IHsKKyAgICAgICAgUkVHSU9OX0FFID0gMCwKKyAgICAgICAgUkVHSU9OX0FXQiwKKyAgICAgICAgUkVHSU9OX0FGLAorICAgICAgICBOVU1fUkVHSU9OIC8vIE51bWJlciBvZiByZWdpb24gdHlwZXMKKyAgICB9IHJlZ2lvbjsKKwogICAgIFZlY3RvcjxBcmVhPiBtZXRlcmluZ0FyZWFzOwogCiAgICAgaW50IHpvb207CkBAIC0xNjgsOCArMTc5LDEzIEBACiAgICAgLy8gTnVtYmVyIG9mIHpvb20gc3RlcHMgdG8gc2ltdWxhdGUKICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IE5VTV9aT09NX1NURVBTID0gMTAwOwogICAgIC8vIE1heCBwcmV2aWV3IHNpemUgYWxsb3dlZAorICAgIC8vIFRoaXMgaXMgc2V0IHRvIGEgMToxIHZhbHVlIHRvIGFsbG93IGZvciBhbnkgYXNwZWN0IHJhdGlvIHRoYXQgaGFzCisgICAgLy8gYSBtYXggbG9uZyBzaWRlIG9mIDE5MjAgcGl4ZWxzCiAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBNQVhfUFJFVklFV19XSURUSCA9IDE5MjA7Ci0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBNQVhfUFJFVklFV19IRUlHSFQgPSAxMDgwOworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgTUFYX1BSRVZJRVdfSEVJR0hUID0gMTkyMDsKKyAgICAvLyBJbml0aWFsIG1heCBwcmV2aWV3L3JlY29yZGluZyBzaXplIGJvdW5kCisgICAgc3RhdGljIGNvbnN0IGludCBNQVhfSU5JVElBTF9QUkVWSUVXX1dJRFRIID0gMTkyMDsKKyAgICBzdGF0aWMgY29uc3QgaW50IE1BWF9JTklUSUFMX1BSRVZJRVdfSEVJR0hUID0gMTA4MDsKICAgICAvLyBBc3BlY3QgcmF0aW8gdG9sZXJhbmNlCiAgICAgc3RhdGljIGNvbnN0IGZsb2F0IEFTUEVDVF9SQVRJT19UT0xFUkFOQ0UgPSAwLjAwMTsKIApAQCAtMjE5LDcgKzIzNSw3IEBACiAgICAgflBhcmFtZXRlcnMoKTsKIAogICAgIC8vIFNldHMgdXAgZGVmYXVsdCBwYXJhbWV0ZXJzCi0gICAgc3RhdHVzX3QgaW5pdGlhbGl6ZShjb25zdCBDYW1lcmFNZXRhZGF0YSAqaW5mbyk7CisgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZShjb25zdCBDYW1lcmFNZXRhZGF0YSAqaW5mbywgaW50IGRldmljZVZlcnNpb24pOwogCiAgICAgLy8gQnVpbGQgZmFzdC1hY2Nlc3MgZGV2aWNlIHN0YXRpYyBpbmZvIGZyb20gc3RhdGljIGluZm8KICAgICBzdGF0dXNfdCBidWlsZEZhc3RJbmZvKCk7CkBAIC0yNDUsNiArMjYxLDEyIEBACiAgICAgLy8gQWRkL3VwZGF0ZSBKUEVHIGVudHJpZXMgaW4gbWV0YWRhdGEKICAgICBzdGF0dXNfdCB1cGRhdGVSZXF1ZXN0SnBlZyhDYW1lcmFNZXRhZGF0YSAqcmVxdWVzdCkgY29uc3Q7CiAKKyAgICAvKiBIZWxwZXIgZnVuY3Rpb25zIHRvIG92ZXJyaWRlIGpwZWcgc2l6ZSBmb3IgdmlkZW8gc25hcHNob3QgKi8KKyAgICAvLyBPdmVycmlkZSBqcGVnIHNpemUgYnkgdmlkZW8gc2l6ZS4gQ2FsbGVkIGR1cmluZyBzdGFydFJlY29yZGluZy4KKyAgICBzdGF0dXNfdCBvdmVycmlkZUpwZWdTaXplQnlWaWRlb1NpemUoKTsKKyAgICAvLyBSZWNvdmVyIG92ZXJyaWRkZW4ganBlZyBzaXplLiAgQ2FsbGVkIGR1cmluZyBzdG9wUmVjb3JkaW5nLgorICAgIHN0YXR1c190IHJlY292ZXJPdmVycmlkZGVuSnBlZ1NpemUoKTsKKwogICAgIC8vIENhbGN1bGF0ZSB0aGUgY3JvcCByZWdpb24gcmVjdGFuZ2xlIGJhc2VkIG9uIGN1cnJlbnQgc3RyZWFtIHNpemVzCiAgICAgc3RydWN0IENyb3BSZWdpb24gewogICAgICAgICBmbG9hdCBsZWZ0OwpAQCAtMzM0LDEwICszNTYsMzUgQEAKICAgICBpbnQgbm9ybWFsaXplZFlUb0Nyb3AoaW50IHkpIGNvbnN0OwogCiAgICAgVmVjdG9yPFNpemU+IGF2YWlsYWJsZVByZXZpZXdTaXplczsKKyAgICBWZWN0b3I8U2l6ZT4gYXZhaWxhYmxlVmlkZW9TaXplczsKICAgICAvLyBHZXQgc2l6ZSBsaXN0ICh0aGF0IGFyZSBubyBsYXJnZXIgdGhhbiBsaW1pdCkgZnJvbSBzdGF0aWMgbWV0YWRhdGEuCi0gICAgc3RhdHVzX3QgZ2V0RmlsdGVyZWRQcmV2aWV3U2l6ZXMoU2l6ZSBsaW1pdCwgVmVjdG9yPFNpemU+ICpzaXplcyk7CisgICAgc3RhdHVzX3QgZ2V0RmlsdGVyZWRTaXplcyhTaXplIGxpbWl0LCBWZWN0b3I8U2l6ZT4gKnNpemVzKTsKICAgICAvLyBHZXQgbWF4IHNpemUgKGZyb20gdGhlIHNpemUgYXJyYXkpIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gYXNwZWN0IHJhdGlvLgogICAgIFNpemUgZ2V0TWF4U2l6ZUZvclJhdGlvKGZsb2F0IHJhdGlvLCBjb25zdCBpbnQzMl90KiBzaXplQXJyYXksIHNpemVfdCBjb3VudCk7CisKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIG92ZXJyaWRpbmcganBlZyBzaXplIGZvciB2aWRlbyBzbmFwc2hvdAorICAgIC8vIENoZWNrIGlmIG92ZXJyaWRkZW4ganBlZyBzaXplIG5lZWRzIHRvIGJlIHVwZGF0ZWQgYWZ0ZXIgUGFyYW1ldGVyczo6c2V0LgorICAgIC8vIFRoZSBiZWhhdmlvciBvZiB0aGlzIGZ1bmN0aW9uIGlzIHRhaWxvcmVkIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBQYXJhbWV0ZXJzOjpzZXQuCisgICAgLy8gRG8gbm90IHVzZSB0aGlzIGZ1bmN0aW9uIGZvciBvdGhlciBwdXJwb3NlLgorICAgIHN0YXR1c190IHVwZGF0ZU92ZXJyaWRkZW5KcGVnU2l6ZSgpOworCisgICAgc3RydWN0IFN0cmVhbUNvbmZpZ3VyYXRpb24geworICAgICAgICBpbnQzMl90IGZvcm1hdDsKKyAgICAgICAgaW50MzJfdCB3aWR0aDsKKyAgICAgICAgaW50MzJfdCBoZWlnaHQ7CisgICAgICAgIGludDMyX3QgaXNJbnB1dDsKKyAgICB9OworICAgIC8vIEhlbHBlciBmdW5jdGlvbiBleHRyYWN0IGF2YWlsYWJsZSBzdHJlYW0gY29uZmlndXJhdGlvbgorICAgIC8vIE9ubHkgdmFsaWQgc2luY2UgZGV2aWNlIEhBTCB2ZXJzaW9uIDMuMgorICAgIC8vIHJldHVybnMgYW4gZW1wdHkgVmVjdG9yIGlmIGRldmljZSBIQUwgdmVyc2lvbiBkb2VzIHN1cHBvcnQgaXQKKyAgICBWZWN0b3I8U3RyZWFtQ29uZmlndXJhdGlvbj4gZ2V0U3RyZWFtQ29uZmlndXJhdGlvbnMoKTsKKworICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgbm9uLWR1cGxpY2F0ZWQgYXZhaWxhYmxlIG91dHB1dCBmb3JtYXRzCisgICAgU29ydGVkVmVjdG9yPGludDMyX3Q+IGdldEF2YWlsYWJsZU91dHB1dEZvcm1hdHMoKTsKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IGF2YWlsYWJsZSBvdXRwdXQganBlZyBzaXplcworICAgIFZlY3RvcjxTaXplPiBnZXRBdmFpbGFibGVKcGVnU2l6ZXMoKTsKKworICAgIGludCBtRGV2aWNlVmVyc2lvbjsKIH07CiAKIC8vIFRoaXMgY2xhc3MgZW5jYXBzdWxhdGVzIHRoZSBQYXJhbWV0ZXJzIGNsYXNzIHNvIHRoYXQgaXQgY2FuIG9ubHkgYmUgYWNjZXNzZWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9TdHJlYW1pbmdQcm9jZXNzb3IuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1N0cmVhbWluZ1Byb2Nlc3Nvci5jcHAKaW5kZXggZjY4MzRjNS4uMzdkZjI0ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1N0cmVhbWluZ1Byb2Nlc3Nvci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1N0cmVhbWluZ1Byb2Nlc3Nvci5jcHAKQEAgLTkwLDggKzkwLDI2IEBACiAKICAgICBNdXRleDo6QXV0b2xvY2sgbShtTXV0ZXgpOwogICAgIGlmIChtUHJldmlld1JlcXVlc3QuZW50cnlDb3VudCgpID09IDApIHsKLSAgICAgICAgcmVzID0gZGV2aWNlLT5jcmVhdGVEZWZhdWx0UmVxdWVzdChDQU1FUkEyX1RFTVBMQVRFX1BSRVZJRVcsCi0gICAgICAgICAgICAgICAgJm1QcmV2aWV3UmVxdWVzdCk7CisgICAgICAgIHNwPENhbWVyYTJDbGllbnQ+IGNsaWVudCA9IG1DbGllbnQucHJvbW90ZSgpOworICAgICAgICBpZiAoY2xpZW50ID09IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDbGllbnQgZG9lcyBub3QgZXhpc3QiLCBfX0ZVTkNUSU9OX18sIG1JZCk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKworICAgICAgICAvLyBVc2UgQ0FNRVJBM19URU1QTEFURV9aRVJPX1NIVVRURVJfTEFHIGZvciBaU0wgc3RyZWFtaW5nIGNhc2UuCisgICAgICAgIGlmIChjbGllbnQtPmdldENhbWVyYURldmljZVZlcnNpb24oKSA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgeworICAgICAgICAgICAgaWYgKHBhcmFtcy56c2xNb2RlICYmICFwYXJhbXMucmVjb3JkaW5nSGludCkgeworICAgICAgICAgICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlRGVmYXVsdFJlcXVlc3QoQ0FNRVJBM19URU1QTEFURV9aRVJPX1NIVVRURVJfTEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgJm1QcmV2aWV3UmVxdWVzdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlRGVmYXVsdFJlcXVlc3QoQ0FNRVJBM19URU1QTEFURV9QUkVWSUVXLAorICAgICAgICAgICAgICAgICAgICAgICAgJm1QcmV2aWV3UmVxdWVzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXMgPSBkZXZpY2UtPmNyZWF0ZURlZmF1bHRSZXF1ZXN0KENBTUVSQTJfVEVNUExBVEVfUFJFVklFVywKKyAgICAgICAgICAgICAgICAgICAgJm1QcmV2aWV3UmVxdWVzdCk7CisgICAgICAgIH0KKwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogVW5hYmxlIHRvIGNyZWF0ZSBkZWZhdWx0IHByZXZpZXcgcmVxdWVzdDogIgogICAgICAgICAgICAgICAgICAgICAiJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKQEAgLTE2NCw4ICsxODIsNyBAQAogICAgIGlmIChtUHJldmlld1N0cmVhbUlkID09IE5PX1NUUkVBTSkgewogICAgICAgICByZXMgPSBkZXZpY2UtPmNyZWF0ZVN0cmVhbShtUHJldmlld1dpbmRvdywKICAgICAgICAgICAgICAgICBwYXJhbXMucHJldmlld1dpZHRoLCBwYXJhbXMucHJldmlld0hlaWdodCwKLSAgICAgICAgICAgICAgICBDQU1FUkEyX0hBTF9QSVhFTF9GT1JNQVRfT1BBUVVFLCAwLAotICAgICAgICAgICAgICAgICZtUHJldmlld1N0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICBDQU1FUkEyX0hBTF9QSVhFTF9GT1JNQVRfT1BBUVVFLCAmbVByZXZpZXdTdHJlYW1JZCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBVbmFibGUgdG8gY3JlYXRlIHByZXZpZXcgc3RyZWFtOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwpAQCAtMjI2LDE0ICsyNDMsMTQgQEAKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIC8vIE1ha2Ugc3VyZSB3ZSBjYW4gc3VwcG9ydCB0aGlzIG1hbnkgYnVmZmVyIHNsb3RzCiAgICAgaWYgKGNvdW50ID4gQnVmZmVyUXVldWU6Ok5VTV9CVUZGRVJfU0xPVFMpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFRvbyBtYW55IHJlY29yZGluZyBidWZmZXJzIHJlcXVlc3RlZDogJWQsIG1heCAlZCIsCisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBUb28gbWFueSByZWNvcmRpbmcgYnVmZmVycyByZXF1ZXN0ZWQ6ICV6dSwgbWF4ICVkIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgY291bnQsIEJ1ZmZlclF1ZXVlOjpOVU1fQlVGRkVSX1NMT1RTKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbShtTXV0ZXgpOwogCi0gICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IE5ldyByZWNvcmRpbmcgYnVmZmVyIGNvdW50IGZyb20gZW5jb2RlcjogJWQiLAorICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBOZXcgcmVjb3JkaW5nIGJ1ZmZlciBjb3VudCBmcm9tIGVuY29kZXI6ICV6dSIsCiAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgY291bnQpOwogCiAgICAgLy8gTmVlZCB0byByZS1zaXplIGNvbnN1bWVyIGFuZCBoZWFwCkBAIC0zMDIsNiArMzE5LDQ0IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBTdHJlYW1pbmdQcm9jZXNzb3I6OnJlY29yZGluZ1N0cmVhbU5lZWRzVXBkYXRlKAorICAgICAgICBjb25zdCBQYXJhbWV0ZXJzICZwYXJhbXMsIGJvb2wgKm5lZWRzVXBkYXRlKSB7CisgICAgc3RhdHVzX3QgcmVzOworCisgICAgaWYgKG5lZWRzVXBkYXRlID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IGludmFsaWQgYXJndW1lbnQiLCBfX0ZVTkNUSU9OX18sIG1JZCk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAobVJlY29yZGluZ1N0cmVhbUlkID09IE5PX1NUUkVBTSkgeworICAgICAgICAqbmVlZHNVcGRhdGUgPSB0cnVlOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gZGV2aWNlID0gbURldmljZS5wcm9tb3RlKCk7CisgICAgaWYgKGRldmljZSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBEZXZpY2UgZG9lcyBub3QgZXhpc3QiLCBfX0ZVTkNUSU9OX18sIG1JZCk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICB1aW50MzJfdCBjdXJyZW50V2lkdGgsIGN1cnJlbnRIZWlnaHQ7CisgICAgcmVzID0gZGV2aWNlLT5nZXRTdHJlYW1JbmZvKG1SZWNvcmRpbmdTdHJlYW1JZCwKKyAgICAgICAgICAgICZjdXJyZW50V2lkdGgsICZjdXJyZW50SGVpZ2h0LCAwKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBFcnJvciBxdWVyeWluZyByZWNvcmRpbmcgb3V0cHV0IHN0cmVhbSBpbmZvOiAiCisgICAgICAgICAgICAgICAgIiVzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1JZCwKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBpZiAobVJlY29yZGluZ0NvbnN1bWVyID09IDAgfHwgY3VycmVudFdpZHRoICE9ICh1aW50MzJfdClwYXJhbXMudmlkZW9XaWR0aCB8fAorICAgICAgICAgICAgY3VycmVudEhlaWdodCAhPSAodWludDMyX3QpcGFyYW1zLnZpZGVvSGVpZ2h0KSB7CisgICAgICAgICpuZWVkc1VwZGF0ZSA9IHRydWU7CisgICAgfQorICAgICpuZWVkc1VwZGF0ZSA9IGZhbHNlOworICAgIHJldHVybiByZXM7Cit9CisKIHN0YXR1c190IFN0cmVhbWluZ1Byb2Nlc3Nvcjo6dXBkYXRlUmVjb3JkaW5nU3RyZWFtKGNvbnN0IFBhcmFtZXRlcnMgJnBhcmFtcykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgc3RhdHVzX3QgcmVzOwpAQCAtMzE1LDE4ICszNzAsMjAgQEAKIAogICAgIGJvb2wgbmV3Q29uc3VtZXIgPSBmYWxzZTsKICAgICBpZiAobVJlY29yZGluZ0NvbnN1bWVyID09IDApIHsKLSAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IENyZWF0aW5nIHJlY29yZGluZyBjb25zdW1lciB3aXRoICVkICsgMSAiCisgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBDcmVhdGluZyByZWNvcmRpbmcgY29uc3VtZXIgd2l0aCAlenUgKyAxICIKICAgICAgICAgICAgICAgICAiY29uc3VtZXItc2lkZSBidWZmZXJzIiwgX19GVU5DVElPTl9fLCBtSWQsIG1SZWNvcmRpbmdIZWFwQ291bnQpOwogICAgICAgICAvLyBDcmVhdGUgQ1BVIGJ1ZmZlciBxdWV1ZSBlbmRwb2ludC4gV2UgbmVlZCBvbmUgbW9yZSBidWZmZXIgaGVyZSBzbyB0aGF0IHdlIGNhbgogICAgICAgICAvLyBhbHdheXMgYWNxdWlyZSBhbmQgZnJlZSBhIGJ1ZmZlciB3aGVuIHRoZSBoZWFwIGlzIGZ1bGw7IG90aGVyd2lzZSB0aGUgY29uc3VtZXIKICAgICAgICAgLy8gd2lsbCBoYXZlIGJ1ZmZlcnMgaW4gZmxpZ2h0IHdlJ2xsIG5ldmVyIGNsZWFyIG91dC4KLSAgICAgICAgc3A8QnVmZmVyUXVldWU+IGJxID0gbmV3IEJ1ZmZlclF1ZXVlKCk7Ci0gICAgICAgIG1SZWNvcmRpbmdDb25zdW1lciA9IG5ldyBCdWZmZXJJdGVtQ29uc3VtZXIoYnEsCisgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IHByb2R1Y2VyOworICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBjb25zdW1lcjsKKyAgICAgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZwcm9kdWNlciwgJmNvbnN1bWVyKTsKKyAgICAgICAgbVJlY29yZGluZ0NvbnN1bWVyID0gbmV3IEJ1ZmZlckl0ZW1Db25zdW1lcihjb25zdW1lciwKICAgICAgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVIsCiAgICAgICAgICAgICAgICAgbVJlY29yZGluZ0hlYXBDb3VudCArIDEpOwogICAgICAgICBtUmVjb3JkaW5nQ29uc3VtZXItPnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIodGhpcyk7CiAgICAgICAgIG1SZWNvcmRpbmdDb25zdW1lci0+c2V0TmFtZShTdHJpbmc4KCJDYW1lcmEyLVJlY29yZGluZ0NvbnN1bWVyIikpOwotICAgICAgICBtUmVjb3JkaW5nV2luZG93ID0gbmV3IFN1cmZhY2UoYnEpOworICAgICAgICBtUmVjb3JkaW5nV2luZG93ID0gbmV3IFN1cmZhY2UocHJvZHVjZXIpOwogICAgICAgICBuZXdDb25zdW1lciA9IHRydWU7CiAgICAgICAgIC8vIEFsbG9jYXRlIG1lbW9yeSBsYXRlciwgc2luY2Ugd2UgZG9uJ3Qga25vdyBidWZmZXIgc2l6ZSB1bnRpbCByZWNlaXB0CiAgICAgfQpAQCAtMzY2LDcgKzQyMyw3IEBACiAgICAgICAgIG1SZWNvcmRpbmdGcmFtZUNvdW50ID0gMDsKICAgICAgICAgcmVzID0gZGV2aWNlLT5jcmVhdGVTdHJlYW0obVJlY29yZGluZ1dpbmRvdywKICAgICAgICAgICAgICAgICBwYXJhbXMudmlkZW9XaWR0aCwgcGFyYW1zLnZpZGVvSGVpZ2h0LAotICAgICAgICAgICAgICAgIENBTUVSQTJfSEFMX1BJWEVMX0ZPUk1BVF9PUEFRVUUsIDAsICZtUmVjb3JkaW5nU3RyZWFtSWQpOworICAgICAgICAgICAgICAgIENBTUVSQTJfSEFMX1BJWEVMX0ZPUk1BVF9PUEFRVUUsICZtUmVjb3JkaW5nU3RyZWFtSWQpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgY3JlYXRlIG91dHB1dCBzdHJlYW0gZm9yIHJlY29yZGluZzogIgogICAgICAgICAgICAgICAgICAgICAiJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgbUlkLApAQCAtNDI5LDE0ICs0ODYsMTcgQEAKIAogICAgIE11dGV4OjpBdXRvbG9jayBtKG1NdXRleCk7CiAKLSAgICAvLyBJZiBhIHJlY29yZGluZyBzdHJlYW0gaXMgYmVpbmcgc3RhcnRlZCB1cCwgZnJlZSB1cCBhbnkKLSAgICAvLyBvdXRzdGFuZGluZyBidWZmZXJzIGxlZnQgZnJvbSB0aGUgcHJldmlvdXMgcmVjb3JkaW5nIHNlc3Npb24uCi0gICAgLy8gVGhlcmUgc2hvdWxkIG5ldmVyIGJlIGFueSwgc28gaWYgdGhlcmUgYXJlLCB3YXJuIGFib3V0IGl0LgotICAgIGlmIChpc1N0cmVhbUFjdGl2ZShvdXRwdXRTdHJlYW1zLCBtUmVjb3JkaW5nU3RyZWFtSWQpKSB7CisgICAgLy8gSWYgYSByZWNvcmRpbmcgc3RyZWFtIGlzIGJlaW5nIHN0YXJ0ZWQgdXAgYW5kIG5vIHJlY29yZGluZworICAgIC8vIHN0cmVhbSBpcyBhY3RpdmUgeWV0LCBmcmVlIHVwIGFueSBvdXRzdGFuZGluZyBidWZmZXJzIGxlZnQKKyAgICAvLyBmcm9tIHRoZSBwcmV2aW91cyByZWNvcmRpbmcgc2Vzc2lvbi4gVGhlcmUgc2hvdWxkIG5ldmVyIGJlCisgICAgLy8gYW55LCBzbyBpZiB0aGVyZSBhcmUsIHdhcm4gYWJvdXQgaXQuCisgICAgYm9vbCBpc1JlY29yZGluZ1N0cmVhbUlkbGUgPSAhaXNTdHJlYW1BY3RpdmUobUFjdGl2ZVN0cmVhbUlkcywgbVJlY29yZGluZ1N0cmVhbUlkKTsKKyAgICBib29sIHN0YXJ0UmVjb3JkaW5nU3RyZWFtID0gaXNTdHJlYW1BY3RpdmUob3V0cHV0U3RyZWFtcywgbVJlY29yZGluZ1N0cmVhbUlkKTsKKyAgICBpZiAoc3RhcnRSZWNvcmRpbmdTdHJlYW0gJiYgaXNSZWNvcmRpbmdTdHJlYW1JZGxlKSB7CiAgICAgICAgIHJlbGVhc2VBbGxSZWNvcmRpbmdGcmFtZXNMb2NrZWQoKTsKICAgICB9CiAKLSAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogJXMgc3RhcnRlZCwgcmVjb3JkaW5nIGhlYXAgaGFzICVkIGZyZWUgb2YgJWQiLAorICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiAlcyBzdGFydGVkLCByZWNvcmRpbmcgaGVhcCBoYXMgJXp1IGZyZWUgb2YgJXp1IiwKICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCAodHlwZSA9PSBQUkVWSUVXKSA/ICJwcmV2aWV3IiA6ICJyZWNvcmRpbmciLAogICAgICAgICAgICAgbVJlY29yZGluZ0hlYXBGcmVlLCBtUmVjb3JkaW5nSGVhcENvdW50KTsKIApAQCAtNjU5LDggKzcxOSw4IEBACiAKICAgICAgICAgaWYgKG1SZWNvcmRpbmdIZWFwID09IDApIHsKICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBidWZmZXJTaXplID0gNCArIHNpemVvZihidWZmZXJfaGFuZGxlX3QpOwotICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IENyZWF0aW5nIHJlY29yZGluZyBoZWFwIHdpdGggJWQgYnVmZmVycyBvZiAiCi0gICAgICAgICAgICAgICAgICAgICJzaXplICVkIGJ5dGVzIiwgX19GVU5DVElPTl9fLCBtSWQsCisgICAgICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogQ3JlYXRpbmcgcmVjb3JkaW5nIGhlYXAgd2l0aCAlenUgYnVmZmVycyBvZiAiCisgICAgICAgICAgICAgICAgICAgICJzaXplICV6dSBieXRlcyIsIF9fRlVOQ1RJT05fXywgbUlkLAogICAgICAgICAgICAgICAgICAgICBtUmVjb3JkaW5nSGVhcENvdW50LCBidWZmZXJTaXplKTsKIAogICAgICAgICAgICAgbVJlY29yZGluZ0hlYXAgPSBuZXcgQ2FtZXJhMkhlYXAoYnVmZmVyU2l6ZSwgbVJlY29yZGluZ0hlYXBDb3VudCwKQEAgLTgyNSwxMCArODg1LDEwIEBACiAgICAgfQogCiAgICAgaWYgKHJlbGVhc2VkQ291bnQgPiAwKSB7Ci0gICAgICAgIEFMT0dXKCIlczogQ2FtZXJhICVkOiBGb3JjZS1mcmVlZCAlZCBvdXRzdGFuZGluZyBidWZmZXJzICIKKyAgICAgICAgQUxPR1coIiVzOiBDYW1lcmEgJWQ6IEZvcmNlLWZyZWVkICV6dSBvdXRzdGFuZGluZyBidWZmZXJzICIKICAgICAgICAgICAgICAgICAiZnJvbSBwcmV2aW91cyByZWNvcmRpbmcgc2Vzc2lvbiIsIF9fRlVOQ1RJT05fXywgbUlkLCByZWxlYXNlZENvdW50KTsKICAgICAgICAgQUxPR0VfSUYocmVsZWFzZWRDb3VudCAhPSBtUmVjb3JkaW5nSGVhcENvdW50IC0gbVJlY29yZGluZ0hlYXBGcmVlLAotICAgICAgICAgICAgIiVzOiBDYW1lcmEgJWQ6IEZvcmNlLWZyZWVkICVkIGJ1ZmZlcnMsIGJ1dCBleHBlY3RlZCAlZCIsCisgICAgICAgICAgICAiJXM6IENhbWVyYSAlZDogRm9yY2UtZnJlZWQgJXp1IGJ1ZmZlcnMsIGJ1dCBleHBlY3RlZCAlenUiLAogICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHJlbGVhc2VkQ291bnQsIG1SZWNvcmRpbmdIZWFwQ291bnQgLSBtUmVjb3JkaW5nSGVhcEZyZWUpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1N0cmVhbWluZ1Byb2Nlc3Nvci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1N0cmVhbWluZ1Byb2Nlc3Nvci5oCmluZGV4IDgzM2JiOGYuLjg0NjZhZjQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9TdHJlYW1pbmdQcm9jZXNzb3IuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmgKQEAgLTU0LDYgKzU0LDkgQEAKIAogICAgIHN0YXR1c190IHNldFJlY29yZGluZ0J1ZmZlckNvdW50KHNpemVfdCBjb3VudCk7CiAgICAgc3RhdHVzX3QgdXBkYXRlUmVjb3JkaW5nUmVxdWVzdChjb25zdCBQYXJhbWV0ZXJzICZwYXJhbXMpOworICAgIC8vIElmIG5lZWRzVXBkYXRlIGlzIHNldCB0byB0cnVlLCBhIHVwZGF0ZVJlY29yZGluZ1N0cmVhbSBjYWxsIHdpdGggcGFyYW1zIHdpbGwgcmVjcmVhdGUKKyAgICAvLyByZWNvcmRpbmcgc3RyZWFtCisgICAgc3RhdHVzX3QgcmVjb3JkaW5nU3RyZWFtTmVlZHNVcGRhdGUoY29uc3QgUGFyYW1ldGVycyAmcGFyYW1zLCBib29sICpuZWVkc1VwZGF0ZSk7CiAgICAgc3RhdHVzX3QgdXBkYXRlUmVjb3JkaW5nU3RyZWFtKGNvbnN0IFBhcmFtZXRlcnMgJnBhcmFtcyk7CiAgICAgc3RhdHVzX3QgZGVsZXRlUmVjb3JkaW5nU3RyZWFtKCk7CiAgICAgaW50IGdldFJlY29yZGluZ1N0cmVhbUlkKCkgY29uc3Q7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuY3BwCmluZGV4IDQyMDdiYTkuLjhmNzgxMDMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuY3BwCkBAIC0yNSw2ICsyNSw4IEBACiAjZGVmaW5lIEFMT0dWViguLi4pICgodm9pZCkwKQogI2VuZGlmCiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgpAQCAtNDYsNiArNDgsNyBAQAogICAgICAgICBtRGV2aWNlKGNsaWVudC0+Z2V0Q2FtZXJhRGV2aWNlKCkpLAogICAgICAgICBtU2VxdWVuY2VyKHNlcXVlbmNlciksCiAgICAgICAgIG1JZChjbGllbnQtPmdldENhbWVyYUlkKCkpLAorICAgICAgICBtRGVsZXRlZChmYWxzZSksCiAgICAgICAgIG1ac2xCdWZmZXJBdmFpbGFibGUoZmFsc2UpLAogICAgICAgICBtWnNsU3RyZWFtSWQoTk9fU1RSRUFNKSwKICAgICAgICAgbVpzbFJlcHJvY2Vzc1N0cmVhbUlkKE5PX1NUUkVBTSksCkBAIC02MCw3ICs2Myw3IEBACiAKIFpzbFByb2Nlc3Nvcjo6flpzbFByb2Nlc3NvcigpIHsKICAgICBBTE9HVigiJXM6IEV4aXQiLCBfX0ZVTkNUSU9OX18pOwotICAgIGRlbGV0ZVN0cmVhbSgpOworICAgIGRpc2Nvbm5lY3QoKTsKIH0KIAogdm9pZCBac2xQcm9jZXNzb3I6Om9uRnJhbWVBdmFpbGFibGUoKSB7CkBAIC03MSwxOCArNzQsMTkgQEAKICAgICB9CiB9CiAKLXZvaWQgWnNsUHJvY2Vzc29yOjpvbkZyYW1lQXZhaWxhYmxlKGludDMyX3QgLypyZXF1ZXN0SWQqLywKLSAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmZyYW1lKSB7Cit2b2lkIFpzbFByb2Nlc3Nvcjo6b25SZXN1bHRBdmFpbGFibGUoY29uc3QgQ2FwdHVyZVJlc3VsdCAmcmVzdWx0KSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBBTE9HVigiJXM6IiwgX19GVU5DVElPTl9fKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5wdXRNdXRleCk7CiAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZW50cnk7Ci0gICAgZW50cnkgPSBmcmFtZS5maW5kKEFORFJPSURfU0VOU09SX1RJTUVTVEFNUCk7CisgICAgZW50cnkgPSByZXN1bHQubU1ldGFkYXRhLmZpbmQoQU5EUk9JRF9TRU5TT1JfVElNRVNUQU1QKTsKICAgICBuc2Vjc190IHRpbWVzdGFtcCA9IGVudHJ5LmRhdGEuaTY0WzBdOwogICAgICh2b2lkKXRpbWVzdGFtcDsKLSAgICBBTE9HVlYoIkdvdCBwcmV2aWV3IGZyYW1lIGZvciB0aW1lc3RhbXAgJWxsZCIsIHRpbWVzdGFtcCk7CisgICAgQUxPR1ZWKCJHb3QgcHJldmlldyBmcmFtZSBmb3IgdGltZXN0YW1wICUiIFBSSWQ2NCwgdGltZXN0YW1wKTsKIAogICAgIGlmIChtU3RhdGUgIT0gUlVOTklORykgcmV0dXJuOwogCi0gICAgbUZyYW1lTGlzdC5lZGl0SXRlbUF0KG1GcmFtZUxpc3RIZWFkKSA9IGZyYW1lOworICAgIG1GcmFtZUxpc3QuZWRpdEl0ZW1BdChtRnJhbWVMaXN0SGVhZCkgPSByZXN1bHQubU1ldGFkYXRhOwogICAgIG1GcmFtZUxpc3RIZWFkID0gKG1GcmFtZUxpc3RIZWFkICsgMSkgJSBrRnJhbWVMaXN0RGVwdGg7CiAKICAgICBmaW5kTWF0Y2hlc0xvY2tlZCgpOwpAQCAtMTI4LDEzICsxMzIsMTUgQEAKIAogICAgIGlmIChtWnNsQ29uc3VtZXIgPT0gMCkgewogICAgICAgICAvLyBDcmVhdGUgQ1BVIGJ1ZmZlciBxdWV1ZSBlbmRwb2ludAotICAgICAgICBzcDxCdWZmZXJRdWV1ZT4gYnEgPSBuZXcgQnVmZmVyUXVldWUoKTsKLSAgICAgICAgbVpzbENvbnN1bWVyID0gbmV3IEJ1ZmZlckl0ZW1Db25zdW1lcihicSwKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gcHJvZHVjZXI7CisgICAgICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IGNvbnN1bWVyOworICAgICAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJnByb2R1Y2VyLCAmY29uc3VtZXIpOworICAgICAgICBtWnNsQ29uc3VtZXIgPSBuZXcgQnVmZmVySXRlbUNvbnN1bWVyKGNvbnN1bWVyLAogICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9IV19DQU1FUkFfWlNMLAogICAgICAgICAgICAga1pzbEJ1ZmZlckRlcHRoKTsKICAgICAgICAgbVpzbENvbnN1bWVyLT5zZXRGcmFtZUF2YWlsYWJsZUxpc3RlbmVyKHRoaXMpOwogICAgICAgICBtWnNsQ29uc3VtZXItPnNldE5hbWUoU3RyaW5nOCgiQ2FtZXJhMkNsaWVudDo6WnNsQ29uc3VtZXIiKSk7Ci0gICAgICAgIG1ac2xXaW5kb3cgPSBuZXcgU3VyZmFjZShicSk7CisgICAgICAgIG1ac2xXaW5kb3cgPSBuZXcgU3VyZmFjZShwcm9kdWNlcik7CiAgICAgfQogCiAgICAgaWYgKG1ac2xTdHJlYW1JZCAhPSBOT19TVFJFQU0pIHsKQEAgLTE3MCw2ICsxNzYsOCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgbURlbGV0ZWQgPSBmYWxzZTsKKwogICAgIGlmIChtWnNsU3RyZWFtSWQgPT0gTk9fU1RSRUFNKSB7CiAgICAgICAgIC8vIENyZWF0ZSBzdHJlYW0gZm9yIEhBTCBwcm9kdWN0aW9uCiAgICAgICAgIC8vIFRPRE86IFNvcnQgb3V0IGJldHRlciB3YXkgdG8gc2VsZWN0IHJlc29sdXRpb24gZm9yIFpTTApAQCAtMTc4LDggKzE4Niw3IEBACiAgICAgICAgICAgICAgICAgKGludClIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ7CiAgICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlU3RyZWFtKG1ac2xXaW5kb3csCiAgICAgICAgICAgICAgICAgcGFyYW1zLmZhc3RJbmZvLmFycmF5V2lkdGgsIHBhcmFtcy5mYXN0SW5mby5hcnJheUhlaWdodCwKLSAgICAgICAgICAgICAgICBzdHJlYW1UeXBlLCAwLAotICAgICAgICAgICAgICAgICZtWnNsU3RyZWFtSWQpOworICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUsICZtWnNsU3RyZWFtSWQpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgY3JlYXRlIG91dHB1dCBzdHJlYW0gZm9yIFpTTDogIgogICAgICAgICAgICAgICAgICAgICAiJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgbUlkLApAQCAtMTk3LDEzICsyMDQsMjIgQEAKICAgICB9CiAgICAgY2xpZW50LT5yZWdpc3RlckZyYW1lTGlzdGVuZXIoQ2FtZXJhMkNsaWVudDo6a1ByZXZpZXdSZXF1ZXN0SWRTdGFydCwKICAgICAgICAgICAgIENhbWVyYTJDbGllbnQ6OmtQcmV2aWV3UmVxdWVzdElkRW5kLAotICAgICAgICAgICAgdGhpcyk7CisgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgLypzZW5kUGFydGlhbHMqL2ZhbHNlKTsKIAogICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgWnNsUHJvY2Vzc29yOjpkZWxldGVTdHJlYW0oKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5wdXRNdXRleCk7CisgICAgLy8gV0FSKGIvMTU0MDgxMjgpOiBkbyBub3QgZGVsZXRlIHN0cmVhbSB1bmxlc3MgY2xpZW50IGlzIGJlaW5nIGRpc2Nvbm5lY3RlZC4KKyAgICBtRGVsZXRlZCA9IHRydWU7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBac2xQcm9jZXNzb3I6OmRpc2Nvbm5lY3QoKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKICAgICBzdGF0dXNfdCByZXM7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5wdXRNdXRleCk7CkBAIC00NjEsNyArNDc3LDcgQEAKIAogICAgIG1ac2xRdWV1ZUhlYWQgPSAobVpzbFF1ZXVlSGVhZCArIDEpICUga1pzbEJ1ZmZlckRlcHRoOwogCi0gICAgQUxPR1ZWKCIgIEFjcXVpcmVkIGJ1ZmZlciwgdGltZXN0YW1wICVsbGQiLCBxdWV1ZUhlYWQuYnVmZmVyLm1UaW1lc3RhbXApOworICAgIEFMT0dWVigiICBBY3F1aXJlZCBidWZmZXIsIHRpbWVzdGFtcCAlIiBQUklkNjQsIHF1ZXVlSGVhZC5idWZmZXIubVRpbWVzdGFtcCk7CiAKICAgICBmaW5kTWF0Y2hlc0xvY2tlZCgpOwogCkBAIC00ODAsNyArNDk2LDcgQEAKICAgICAgICAgICAgICAgICBlbnRyeSA9IHF1ZXVlRW50cnkuZnJhbWUuZmluZChBTkRST0lEX1NFTlNPUl9USU1FU1RBTVApOwogICAgICAgICAgICAgICAgIGZyYW1lVGltZXN0YW1wID0gZW50cnkuZGF0YS5pNjRbMF07CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVlYoIiAgICVkOiBiOiAlbGxkXHRmOiAlbGxkIiwgaSwKKyAgICAgICAgICAgIEFMT0dWVigiICAgJWQ6IGI6ICUiIFBSSWQ2NCAiXHRmOiAlIiBQUklkNjQsIGksCiAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclRpbWVzdGFtcCwgZnJhbWVUaW1lc3RhbXAgKTsKICAgICAgICAgfQogICAgICAgICBpZiAocXVldWVFbnRyeS5mcmFtZS5pc0VtcHR5KCkgJiYgYnVmZmVyVGltZXN0YW1wICE9IDApIHsKQEAgLTQ5OCwxMyArNTE0LDEzIEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCBmcmFtZVRpbWVzdGFtcCA9IGVudHJ5LmRhdGEuaTY0WzBdOwogICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyVGltZXN0YW1wID09IGZyYW1lVGltZXN0YW1wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVlYoIiVzOiBGb3VuZCBtYXRjaCAlbGxkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1ZWKCIlczogRm91bmQgbWF0Y2ggJSIgUFJJZDY0LCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lVGltZXN0YW1wKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZGVsdGEgPSBhYnMoYnVmZmVyVGltZXN0YW1wIC0gZnJhbWVUaW1lc3RhbXApOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBkZWx0YSA8IDEwMDAwMDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVlYoIiVzOiBGb3VuZCBjbG9zZSBtYXRjaCAlbGxkIChkZWx0YSAlbGxkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1ZWKCIlczogRm91bmQgY2xvc2UgbWF0Y2ggJSIgUFJJZDY0ICIgKGRlbHRhICUiIFBSSWQ2NCAiKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1ZmZlclRpbWVzdGFtcCwgZGVsdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTU0MCw3ICs1NTYsNyBAQAogICAgICAgICAgICAgaWYgKGVudHJ5LmNvdW50ID4gMCkgZnJhbWVBZVN0YXRlID0gZW50cnkuZGF0YS51OFswXTsKICAgICAgICAgfQogICAgICAgICBTdHJpbmc4IHJlc3VsdCA9Ci0gICAgICAgICAgICAgICAgU3RyaW5nODo6Zm9ybWF0KCIgICAlZDogYjogJWxsZFx0ZjogJWxsZCwgQUUgc3RhdGU6ICVkIiwgaSwKKyAgICAgICAgICAgICAgICBTdHJpbmc4Ojpmb3JtYXQoIiAgICV6dTogYjogJSIgUFJJZDY0ICJcdGY6ICUiIFBSSWQ2NCAiLCBBRSBzdGF0ZTogJWQiLCBpLAogICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyVGltZXN0YW1wLCBmcmFtZVRpbWVzdGFtcCwgZnJhbWVBZVN0YXRlKTsKICAgICAgICAgQUxPR1YoIiVzIiwgcmVzdWx0LnN0cmluZygpKTsKICAgICAgICAgaWYgKGZkICE9IC0xKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmgKaW5kZXggNmQzY2I4NS4uYjY1MzNjZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuaApAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPHV0aWxzL0NvbmRpdGlvbi5oPgogI2luY2x1ZGUgPGd1aS9CdWZmZXJJdGVtQ29uc3VtZXIuaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KKyNpbmNsdWRlIDxjYW1lcmEvQ2FwdHVyZVJlc3VsdC5oPgogCiAjaW5jbHVkZSAiY29tbW9uL0NhbWVyYURldmljZUJhc2UuaCIKICNpbmNsdWRlICJhcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29ySW50ZXJmYWNlLmgiCkBAIC01NCw3ICs1NSw3IEBACiAgICAgLy8gRnJvbSBtWnNsQ29uc3VtZXIKICAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZUF2YWlsYWJsZSgpOwogICAgIC8vIEZyb20gRnJhbWVQcm9jZXNzb3IKLSAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZUF2YWlsYWJsZShpbnQzMl90IHJlcXVlc3RJZCwgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmZyYW1lKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25SZXN1bHRBdmFpbGFibGUoY29uc3QgQ2FwdHVyZVJlc3VsdCAmcmVzdWx0KTsKIAogICAgIHZpcnR1YWwgdm9pZCBvbkJ1ZmZlclJlbGVhc2VkKGJ1ZmZlcl9oYW5kbGVfdCAqaGFuZGxlKTsKIApAQCAtNjYsNiArNjcsNyBAQAogCiAgICAgc3RhdHVzX3QgdXBkYXRlU3RyZWFtKGNvbnN0IFBhcmFtZXRlcnMgJnBhcmFtcyk7CiAgICAgc3RhdHVzX3QgZGVsZXRlU3RyZWFtKCk7CisgICAgc3RhdHVzX3QgZGlzY29ubmVjdCgpOwogICAgIGludCBnZXRTdHJlYW1JZCgpIGNvbnN0OwogCiAgICAgc3RhdHVzX3QgcHVzaFRvUmVwcm9jZXNzKGludDMyX3QgcmVxdWVzdElkKTsKQEAgLTg1LDYgKzg3LDggQEAKICAgICB3cDxDYXB0dXJlU2VxdWVuY2VyPiBtU2VxdWVuY2VyOwogICAgIGludCBtSWQ7CiAKKyAgICBib29sIG1EZWxldGVkOworCiAgICAgbXV0YWJsZSBNdXRleCBtSW5wdXRNdXRleDsKICAgICBib29sIG1ac2xCdWZmZXJBdmFpbGFibGU7CiAgICAgQ29uZGl0aW9uIG1ac2xCdWZmZXJBdmFpbGFibGVTaWduYWw7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yMy5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yMy5jcHAKaW5kZXggNzc2ZWJlMi4uZjExMGI2NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3NvcjMuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IzLmNwcApAQCAtMjUsNiArMjUsOCBAQAogI2RlZmluZSBBTE9HVlYoLi4uKSAoKHZvaWQpMCkKICNlbmRpZgogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KQEAgLTQyLDYgKzQ0LDcgQEAKICAgICBzcDxDYW1lcmEyQ2xpZW50PiBjbGllbnQsCiAgICAgd3A8Q2FwdHVyZVNlcXVlbmNlcj4gc2VxdWVuY2VyKToKICAgICAgICAgVGhyZWFkKGZhbHNlKSwKKyAgICAgICAgbUxhdGVzdENsZWFyZWRCdWZmZXJUaW1lc3RhbXAoMCksCiAgICAgICAgIG1TdGF0ZShSVU5OSU5HKSwKICAgICAgICAgbUNsaWVudChjbGllbnQpLAogICAgICAgICBtU2VxdWVuY2VyKHNlcXVlbmNlciksCkBAIC00OSw5ICs1Miw0MiBAQAogICAgICAgICBtWnNsU3RyZWFtSWQoTk9fU1RSRUFNKSwKICAgICAgICAgbUZyYW1lTGlzdEhlYWQoMCksCiAgICAgICAgIG1ac2xRdWV1ZUhlYWQoMCksCi0gICAgICAgIG1ac2xRdWV1ZVRhaWwoMCkgewotICAgIG1ac2xRdWV1ZS5pbnNlcnRBdCgwLCBrWnNsQnVmZmVyRGVwdGgpOwotICAgIG1GcmFtZUxpc3QuaW5zZXJ0QXQoMCwga0ZyYW1lTGlzdERlcHRoKTsKKyAgICAgICAgbVpzbFF1ZXVlVGFpbCgwKSwKKyAgICAgICAgbUhhc0ZvY3VzZXIoZmFsc2UpIHsKKyAgICAvLyBJbml0aWFsaXplIGJ1ZmZlciBxdWV1ZSBhbmQgZnJhbWUgbGlzdCBiYXNlZCBvbiBwaXBlbGluZSBtYXggZGVwdGguCisgICAgc2l6ZV90IHBpcGVsaW5lTWF4RGVwdGggPSBrRGVmYXVsdE1heFBpcGVsaW5lRGVwdGg7CisgICAgaWYgKGNsaWVudCAhPSAwKSB7CisgICAgICAgIHNwPENhbWVyYTNEZXZpY2U+IGRldmljZSA9CisgICAgICAgIHN0YXRpY19jYXN0PENhbWVyYTNEZXZpY2UqPihjbGllbnQtPmdldENhbWVyYURldmljZSgpLmdldCgpKTsKKyAgICAgICAgaWYgKGRldmljZSAhPSAwKSB7CisgICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlbnRyeSA9CisgICAgICAgICAgICAgICAgZGV2aWNlLT5pbmZvKCkuZmluZChBTkRST0lEX1JFUVVFU1RfUElQRUxJTkVfTUFYX0RFUFRIKTsKKyAgICAgICAgICAgIGlmIChlbnRyeS5jb3VudCA9PSAxKSB7CisgICAgICAgICAgICAgICAgcGlwZWxpbmVNYXhEZXB0aCA9IGVudHJ5LmRhdGEudThbMF07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlczogVW5hYmxlIHRvIGZpbmQgdGhlIGFuZHJvaWQucmVxdWVzdC5waXBlbGluZU1heERlcHRoLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgdXNlIGRlZmF1bHQgcGlwZWxpbmUgbWF4IGRlcHRoICV6dSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgIGtEZWZhdWx0TWF4UGlwZWxpbmVEZXB0aCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVudHJ5ID0gZGV2aWNlLT5pbmZvKCkuZmluZChBTkRST0lEX0xFTlNfSU5GT19NSU5JTVVNX0ZPQ1VTX0RJU1RBTkNFKTsKKyAgICAgICAgICAgIGlmIChlbnRyeS5jb3VudCA+IDAgJiYgZW50cnkuZGF0YS5mWzBdICE9IDAuKSB7CisgICAgICAgICAgICAgICAgbUhhc0ZvY3VzZXIgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoIiVzOiBJbml0aWFsaXplIGJ1ZmZlciBxdWV1ZSBhbmQgZnJhbWUgbGlzdCBkZXB0aCBiYXNlZCBvbiBtYXggcGlwZWxpbmUgZGVwdGggKCVkKSIsCisgICAgICAgICAgX19GVU5DVElPTl9fLCBwaXBlbGluZU1heERlcHRoKTsKKyAgICAvLyBOZWVkIHRvIGtlZXAgYnVmZmVyIHF1ZXVlIGxvbmdlciB0aGFuIG1ldGFkYXRhIHF1ZXVlIGJlY2F1c2Ugc29tZXRpbWVzIGJ1ZmZlciBhcnJpdmVzCisgICAgLy8gZWFybGllciB0aGFuIG1ldGFkYXRhIHdoaWNoIGNhdXNlcyB0aGUgYnVmZmVyIGNvcnJlc3BvbmRpbmcgdG8gb2xkZXN0IG1ldGFkYXRhIGJlaW5nCisgICAgLy8gcmVtb3ZlZC4KKyAgICBtRnJhbWVMaXN0RGVwdGggPSBwaXBlbGluZU1heERlcHRoOworICAgIG1CdWZmZXJRdWV1ZURlcHRoID0gbUZyYW1lTGlzdERlcHRoICsgMTsKKworCisgICAgbVpzbFF1ZXVlLmluc2VydEF0KDAsIG1CdWZmZXJRdWV1ZURlcHRoKTsKKyAgICBtRnJhbWVMaXN0Lmluc2VydEF0KDAsIG1GcmFtZUxpc3REZXB0aCk7CiAgICAgc3A8Q2FwdHVyZVNlcXVlbmNlcj4gY2FwdHVyZVNlcXVlbmNlciA9IG1TZXF1ZW5jZXIucHJvbW90ZSgpOwogICAgIGlmIChjYXB0dXJlU2VxdWVuY2VyICE9IDApIGNhcHR1cmVTZXF1ZW5jZXItPnNldFpzbFByb2Nlc3Nvcih0aGlzKTsKIH0KQEAgLTYxLDE5ICs5NywzNCBAQAogICAgIGRlbGV0ZVN0cmVhbSgpOwogfQogCi12b2lkIFpzbFByb2Nlc3NvcjM6Om9uRnJhbWVBdmFpbGFibGUoaW50MzJfdCAvKnJlcXVlc3RJZCovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhICZmcmFtZSkgewordm9pZCBac2xQcm9jZXNzb3IzOjpvblJlc3VsdEF2YWlsYWJsZShjb25zdCBDYXB0dXJlUmVzdWx0ICZyZXN1bHQpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIEFMT0dWKCIlczoiLCBfX0ZVTkNUSU9OX18pOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1JbnB1dE11dGV4KTsKICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlbnRyeTsKLSAgICBlbnRyeSA9IGZyYW1lLmZpbmQoQU5EUk9JRF9TRU5TT1JfVElNRVNUQU1QKTsKKyAgICBlbnRyeSA9IHJlc3VsdC5tTWV0YWRhdGEuZmluZChBTkRST0lEX1NFTlNPUl9USU1FU1RBTVApOwogICAgIG5zZWNzX3QgdGltZXN0YW1wID0gZW50cnkuZGF0YS5pNjRbMF07Ci0gICAgKHZvaWQpdGltZXN0YW1wOwotICAgIEFMT0dWVigiR290IHByZXZpZXcgbWV0YWRhdGEgZm9yIHRpbWVzdGFtcCAlbGxkIiwgdGltZXN0YW1wKTsKKyAgICBpZiAoZW50cnkuY291bnQgPT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IG1ldGFkYXRhIGRvZXNuJ3QgaGF2ZSB0aW1lc3RhbXAsIHNraXAgdGhpcyByZXN1bHQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZW50cnkgPSByZXN1bHQubU1ldGFkYXRhLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0ZSQU1FX0NPVU5UKTsKKyAgICBpZiAoZW50cnkuY291bnQgPT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IG1ldGFkYXRhIGRvZXNuJ3QgaGF2ZSBmcmFtZSBudW1iZXIsIHNraXAgdGhpcyByZXN1bHQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGludDMyX3QgZnJhbWVOdW1iZXIgPSBlbnRyeS5kYXRhLmkzMlswXTsKKworICAgIEFMT0dWVigiR290IHByZXZpZXcgbWV0YWRhdGEgZm9yIGZyYW1lICVkIHdpdGggdGltZXN0YW1wICUiIFBSSWQ2NCwgZnJhbWVOdW1iZXIsIHRpbWVzdGFtcCk7CiAKICAgICBpZiAobVN0YXRlICE9IFJVTk5JTkcpIHJldHVybjsKIAotICAgIG1GcmFtZUxpc3QuZWRpdEl0ZW1BdChtRnJhbWVMaXN0SGVhZCkgPSBmcmFtZTsKLSAgICBtRnJhbWVMaXN0SGVhZCA9IChtRnJhbWVMaXN0SGVhZCArIDEpICUga0ZyYW1lTGlzdERlcHRoOworICAgIC8vIENvcnJlc3BvbmRpbmcgYnVmZmVyIGhhcyBiZWVuIGNsZWFyZWQuIE5vIG5lZWQgdG8gcHVzaCBpbnRvIG1GcmFtZUxpc3QKKyAgICBpZiAodGltZXN0YW1wIDw9IG1MYXRlc3RDbGVhcmVkQnVmZmVyVGltZXN0YW1wKSByZXR1cm47CisKKyAgICBtRnJhbWVMaXN0LmVkaXRJdGVtQXQobUZyYW1lTGlzdEhlYWQpID0gcmVzdWx0Lm1NZXRhZGF0YTsKKyAgICBtRnJhbWVMaXN0SGVhZCA9IChtRnJhbWVMaXN0SGVhZCArIDEpICUgbUZyYW1lTGlzdERlcHRoOwogfQogCiBzdGF0dXNfdCBac2xQcm9jZXNzb3IzOjp1cGRhdGVTdHJlYW0oY29uc3QgUGFyYW1ldGVycyAmcGFyYW1zKSB7CkBAIC0xMzMsNyArMTg0LDcgQEAKICAgICAgICAgLy8gTm90ZSB0aGF0IGZvcm1hdCBzcGVjaWZpZWQgaW50ZXJuYWxseSBpbiBDYW1lcmEzWnNsU3RyZWFtCiAgICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlWnNsU3RyZWFtKAogICAgICAgICAgICAgICAgIHBhcmFtcy5mYXN0SW5mby5hcnJheVdpZHRoLCBwYXJhbXMuZmFzdEluZm8uYXJyYXlIZWlnaHQsCi0gICAgICAgICAgICAgICAga1pzbEJ1ZmZlckRlcHRoLAorICAgICAgICAgICAgICAgIG1CdWZmZXJRdWV1ZURlcHRoLAogICAgICAgICAgICAgICAgICZtWnNsU3RyZWFtSWQsCiAgICAgICAgICAgICAgICAgJm1ac2xTdHJlYW0pOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CkBAIC0xNDIsMTAgKzE5MywxNSBAQAogICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KKworICAgICAgICAvLyBPbmx5IGFkZCB0aGUgY2FtZXJhMyBidWZmZXIgbGlzdGVuZXIgd2hlbiB0aGUgc3RyZWFtIGlzIGNyZWF0ZWQuCisgICAgICAgIG1ac2xTdHJlYW0tPmFkZEJ1ZmZlckxpc3RlbmVyKHRoaXMpOwogICAgIH0KKwogICAgIGNsaWVudC0+cmVnaXN0ZXJGcmFtZUxpc3RlbmVyKENhbWVyYTJDbGllbnQ6OmtQcmV2aWV3UmVxdWVzdElkU3RhcnQsCiAgICAgICAgICAgICBDYW1lcmEyQ2xpZW50OjprUHJldmlld1JlcXVlc3RJZEVuZCwKLSAgICAgICAgICAgIHRoaXMpOworICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgIC8qc2VuZFBhcnRpYWxzKi9mYWxzZSk7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0xODgsNiArMjQ0LDQ2IEBACiAgICAgcmV0dXJuIG1ac2xTdHJlYW1JZDsKIH0KIAorc3RhdHVzX3QgWnNsUHJvY2Vzc29yMzo6dXBkYXRlUmVxdWVzdFdpdGhEZWZhdWx0U3RpbGxSZXF1ZXN0KENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0KSBjb25zdCB7CisgICAgc3A8Q2FtZXJhMkNsaWVudD4gY2xpZW50ID0gbUNsaWVudC5wcm9tb3RlKCk7CisgICAgaWYgKGNsaWVudCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDbGllbnQgZG9lcyBub3QgZXhpc3QiLCBfX0ZVTkNUSU9OX18sIG1JZCk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgc3A8Q2FtZXJhM0RldmljZT4gZGV2aWNlID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8Q2FtZXJhM0RldmljZSo+KGNsaWVudC0+Z2V0Q2FtZXJhRGV2aWNlKCkuZ2V0KCkpOworICAgIGlmIChkZXZpY2UgPT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogRGV2aWNlIGRvZXMgbm90IGV4aXN0IiwgX19GVU5DVElPTl9fLCBtSWQpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgQ2FtZXJhTWV0YWRhdGEgc3RpbGxUZW1wbGF0ZTsKKyAgICBkZXZpY2UtPmNyZWF0ZURlZmF1bHRSZXF1ZXN0KENBTUVSQTNfVEVNUExBVEVfU1RJTExfQ0FQVFVSRSwgJnN0aWxsVGVtcGxhdGUpOworCisgICAgLy8gRmluZCBzb21lIG9mIHRoZSBwb3N0LXByb2Nlc3NpbmcgdGFncywgYW5kIGFzc2lnbiB0aGUgdmFsdWUgZnJvbSB0ZW1wbGF0ZSB0byB0aGUgcmVxdWVzdC4KKyAgICAvLyBPbmx5IGNoZWNrIHRoZSBhYmVycmF0aW9uIG1vZGUgYW5kIG5vaXNlIHJlZHVjdGlvbiBtb2RlIGZvciBub3csIGFzIHRoZXkgYXJlIHZlcnkgaW1wb3J0YW50CisgICAgLy8gZm9yIGltYWdlIHF1YWxpdHkuCisgICAgdWludDMyX3QgcG9zdFByb2Nlc3NpbmdUYWdzW10gPSB7CisgICAgICAgICAgICBBTkRST0lEX05PSVNFX1JFRFVDVElPTl9NT0RFLAorICAgICAgICAgICAgQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX0FCRVJSQVRJT05fTU9ERSwKKyAgICAgICAgICAgIEFORFJPSURfQ09MT1JfQ09SUkVDVElPTl9NT0RFLAorICAgICAgICAgICAgQU5EUk9JRF9UT05FTUFQX01PREUsCisgICAgICAgICAgICBBTkRST0lEX1NIQURJTkdfTU9ERSwKKyAgICAgICAgICAgIEFORFJPSURfSE9UX1BJWEVMX01PREUsCisgICAgICAgICAgICBBTkRST0lEX0VER0VfTU9ERQorICAgIH07CisKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBlbnRyeTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZihwb3N0UHJvY2Vzc2luZ1RhZ3MpIC8gc2l6ZW9mKHVpbnQzMl90KTsgaSsrKSB7CisgICAgICAgIGVudHJ5ID0gc3RpbGxUZW1wbGF0ZS5maW5kKHBvc3RQcm9jZXNzaW5nVGFnc1tpXSk7CisgICAgICAgIGlmIChlbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAgICAgIHJlcXVlc3QudXBkYXRlKHBvc3RQcm9jZXNzaW5nVGFnc1tpXSwgZW50cnkuZGF0YS51OCwgMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IFpzbFByb2Nlc3NvcjM6OnB1c2hUb1JlcHJvY2VzcyhpbnQzMl90IHJlcXVlc3RJZCkgewogICAgIEFMT0dWKCIlczogU2VuZCBpbiByZXByb2Nlc3MgcmVxdWVzdCB3aXRoIGlkICVkIiwKICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVxdWVzdElkKTsKQEAgLTI0NywxOCArMzQzLDQ1IEBACiAgICAgICAgIHVpbnQ4X3QgcmVxdWVzdFR5cGUgPSBBTkRST0lEX1JFUVVFU1RfVFlQRV9SRVBST0NFU1M7CiAgICAgICAgIHJlcyA9IHJlcXVlc3QudXBkYXRlKEFORFJPSURfUkVRVUVTVF9UWVBFLAogICAgICAgICAgICAgICAgICZyZXF1ZXN0VHlwZSwgMSk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHVwZGF0ZSByZXF1ZXN0IHR5cGUiLAorICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorCiAgICAgICAgIGludDMyX3QgaW5wdXRTdHJlYW1zWzFdID0KICAgICAgICAgICAgICAgICB7IG1ac2xTdHJlYW1JZCB9OwotICAgICAgICBpZiAocmVzID09IE9LKSByZXF1ZXN0LnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfSU5QVVRfU1RSRUFNUywKKyAgICAgICAgcmVzID0gcmVxdWVzdC51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX0lOUFVUX1NUUkVBTVMsCiAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW1zLCAxKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gdXBkYXRlIHJlcXVlc3QgaW5wdXQgc3RyZWFtcyIsCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisKKyAgICAgICAgdWludDhfdCBjYXB0dXJlSW50ZW50ID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PihBTkRST0lEX0NPTlRST0xfQ0FQVFVSRV9JTlRFTlRfU1RJTExfQ0FQVFVSRSk7CisgICAgICAgIHJlcyA9IHJlcXVlc3QudXBkYXRlKEFORFJPSURfQ09OVFJPTF9DQVBUVVJFX0lOVEVOVCwKKyAgICAgICAgICAgICAgICAmY2FwdHVyZUludGVudCwgMSk7CisgICAgICAgIGlmIChyZXMgIT0gT0sgKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byB1cGRhdGUgcmVxdWVzdCBjYXB0dXJlIGludGVudCIsCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisKICAgICAgICAgLy8gVE9ETzogU2hvdWxkbid0IHdlIGFsc28gdXBkYXRlIHRoZSBsYXRlc3QgcHJldmlldyBmcmFtZT8KICAgICAgICAgaW50MzJfdCBvdXRwdXRTdHJlYW1zWzFdID0KICAgICAgICAgICAgICAgICB7IGNsaWVudC0+Z2V0Q2FwdHVyZVN0cmVhbUlkKCkgfTsKLSAgICAgICAgaWYgKHJlcyA9PSBPSykgcmVxdWVzdC51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX09VVFBVVF9TVFJFQU1TLAorICAgICAgICByZXMgPSByZXF1ZXN0LnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfT1VUUFVUX1NUUkVBTVMsCiAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtcywgMSk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHVwZGF0ZSByZXF1ZXN0IG91dHB1dCBzdHJlYW1zIiwKKyAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKwogICAgICAgICByZXMgPSByZXF1ZXN0LnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfSUQsCiAgICAgICAgICAgICAgICAgJnJlcXVlc3RJZCwgMSk7Ci0KICAgICAgICAgaWYgKHJlcyAhPSBPSyApIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHVwZGF0ZSBmcmFtZSB0byBhIHJlcHJvY2VzcyByZXF1ZXN0IiwKICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CkBAIC0yODYsNiArNDA5LDEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICAvLyBVcGRhdGUgcG9zdC1wcm9jZXNzaW5nIHNldHRpbmdzCisgICAgICAgIHJlcyA9IHVwZGF0ZVJlcXVlc3RXaXRoRGVmYXVsdFN0aWxsUmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR1coIiVzOiBVbmFibGUgdG8gdXBkYXRlIHBvc3QtcHJvY2Vzc2luZyB0YWdzLCB0aGUgcmVwcm9jZXNzZWQgaW1hZ2UgcXVhbGl0eSAiCisgICAgICAgICAgICAgICAgICAgICJtYXkgYmUgY29tcHJvbWlzZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICB9CisKICAgICAgICAgbUxhdGVzdENhcHR1cmVkUmVxdWVzdCA9IHJlcXVlc3Q7CiAgICAgICAgIHJlcyA9IGNsaWVudC0+Z2V0Q2FtZXJhRGV2aWNlKCktPmNhcHR1cmUocmVxdWVzdCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0sgKSB7CkBAIC0zMTAsMTEgKzQ0MCwxOSBAQAogCiBzdGF0dXNfdCBac2xQcm9jZXNzb3IzOjpjbGVhclpzbFF1ZXVlTG9ja2VkKCkgewogICAgIGlmIChtWnNsU3RyZWFtICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG1ac2xTdHJlYW0tPmNsZWFySW5wdXRSaW5nQnVmZmVyKCk7CisgICAgICAgIC8vIGNsZWFyIHJlc3VsdCBtZXRhZGF0YSBsaXN0IGZpcnN0LgorICAgICAgICBjbGVhclpzbFJlc3VsdFF1ZXVlTG9ja2VkKCk7CisgICAgICAgIHJldHVybiBtWnNsU3RyZWFtLT5jbGVhcklucHV0UmluZ0J1ZmZlcigmbUxhdGVzdENsZWFyZWRCdWZmZXJUaW1lc3RhbXApOwogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CiAKK3ZvaWQgWnNsUHJvY2Vzc29yMzo6Y2xlYXJac2xSZXN1bHRRdWV1ZUxvY2tlZCgpIHsKKyAgICBtRnJhbWVMaXN0LmNsZWFyKCk7CisgICAgbUZyYW1lTGlzdEhlYWQgPSAwOworICAgIG1GcmFtZUxpc3QuaW5zZXJ0QXQoMCwgbUZyYW1lTGlzdERlcHRoKTsKK30KKwogdm9pZCBac2xQcm9jZXNzb3IzOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgLyphcmdzKi8pIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5wdXRNdXRleCk7CiAgICAgaWYgKCFtTGF0ZXN0Q2FwdHVyZWRSZXF1ZXN0LmlzRW1wdHkoKSkgewpAQCAtMzU1LDcgKzQ5Myw3IEBACiAgICAgICAgICAgICBpZiAoZW50cnkuY291bnQgPiAwKSBmcmFtZUFlU3RhdGUgPSBlbnRyeS5kYXRhLnU4WzBdOwogICAgICAgICB9CiAgICAgICAgIFN0cmluZzggcmVzdWx0ID0KLSAgICAgICAgICAgICAgICBTdHJpbmc4Ojpmb3JtYXQoIiAgICVkOiBiOiAlbGxkXHRmOiAlbGxkLCBBRSBzdGF0ZTogJWQiLCBpLAorICAgICAgICAgICAgICAgIFN0cmluZzg6OmZvcm1hdCgiICAgJXp1OiBiOiAlIiBQUklkNjQgIlx0ZjogJSIgUFJJZDY0ICIsIEFFIHN0YXRlOiAlZCIsIGksCiAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJUaW1lc3RhbXAsIGZyYW1lVGltZXN0YW1wLCBmcmFtZUFlU3RhdGUpOwogICAgICAgICBBTE9HVigiJXMiLCByZXN1bHQuc3RyaW5nKCkpOwogICAgICAgICBpZiAoZmQgIT0gLTEpIHsKQEAgLTM2Niw2ICs1MDQsMjMgQEAKICAgICB9CiB9CiAKK2Jvb2wgWnNsUHJvY2Vzc29yMzo6aXNGaXhlZEZvY3VzTW9kZSh1aW50OF90IGFmTW9kZSkgY29uc3QgeworICAgIHN3aXRjaCAoYWZNb2RlKSB7CisgICAgICAgIGNhc2UgQU5EUk9JRF9DT05UUk9MX0FGX01PREVfQVVUTzoKKyAgICAgICAgY2FzZSBBTkRST0lEX0NPTlRST0xfQUZfTU9ERV9DT05USU5VT1VTX1ZJREVPOgorICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9BRl9NT0RFX0NPTlRJTlVPVVNfUElDVFVSRToKKyAgICAgICAgY2FzZSBBTkRST0lEX0NPTlRST0xfQUZfTU9ERV9NQUNSTzoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9BRl9NT0RFX09GRjoKKyAgICAgICAgY2FzZSBBTkRST0lEX0NPTlRST0xfQUZfTU9ERV9FRE9GOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiJXM6IHVua25vd24gZm9jdXMgbW9kZSAlZCIsIF9fRlVOQ1RJT05fXywgYWZNb2RlKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKIG5zZWNzX3QgWnNsUHJvY2Vzc29yMzo6Z2V0Q2FuZGlkYXRlVGltZXN0YW1wTG9ja2VkKHNpemVfdCogbWV0YWRhdGFJZHgpIGNvbnN0IHsKICAgICAvKioKICAgICAgKiBGaW5kIHRoZSBzbWFsbGVzdCB0aW1lc3RhbXAgd2Uga25vdyBhYm91dCBzbyBmYXIKQEAgLTQxMSwxMSArNTY2LDQzIEBACiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIGVudHJ5ID0gZnJhbWUuZmluZChBTkRST0lEX0NPTlRST0xfQUZfTU9ERSk7CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzOiBaU0wgcXVldWUgZnJhbWUgaGFzIG5vIEFGIG1vZGUgZmllbGQhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdWludDhfdCBhZk1vZGUgPSBlbnRyeS5kYXRhLnU4WzBdOworICAgICAgICAgICAgICAgIGlmIChhZk1vZGUgPT0gQU5EUk9JRF9DT05UUk9MX0FGX01PREVfT0ZGKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgYWxsIHRoZSBaU0wgYnVmZmVyIGZvciBtYW51YWwgQUYgbW9kZSwgYXMgd2UgZG9uJ3QgcmVhbGx5CisgICAgICAgICAgICAgICAgICAgIC8vIGtub3cgdGhlIGFmIHN0YXRlLgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBDaGVjayBBRiBzdGF0ZSBpZiBkZXZpY2UgaGFzIGZvY3VzZXIgYW5kIGZvY3VzIG1vZGUgaXNuJ3QgZml4ZWQKKyAgICAgICAgICAgICAgICBpZiAobUhhc0ZvY3VzZXIgJiYgIWlzRml4ZWRGb2N1c01vZGUoYWZNb2RlKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGNhbmRpZGF0ZSBmcmFtZSBoYXMgZ29vZCBmb2N1cy4KKyAgICAgICAgICAgICAgICAgICAgZW50cnkgPSBmcmFtZS5maW5kKEFORFJPSURfQ09OVFJPTF9BRl9TVEFURSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS5jb3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXM6IFpTTCBxdWV1ZSBmcmFtZSBoYXMgbm8gQUYgc3RhdGUgZmllbGQhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYWZTdGF0ZSA9IGVudHJ5LmRhdGEudThbMF07CisgICAgICAgICAgICAgICAgICAgIGlmIChhZlN0YXRlICE9IEFORFJPSURfQ09OVFJPTF9BRl9TVEFURV9QQVNTSVZFX0ZPQ1VTRUQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZlN0YXRlICE9IEFORFJPSURfQ09OVFJPTF9BRl9TVEFURV9GT0NVU0VEX0xPQ0tFRCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmU3RhdGUgIT0gQU5EUk9JRF9DT05UUk9MX0FGX1NUQVRFX05PVF9GT0NVU0VEX0xPQ0tFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzOiBaU0wgcXVldWUgZnJhbWUgQUYgc3RhdGUgaXMgJWQgaXMgbm90IGdvb2QgZm9yIGNhcHR1cmUsIHNraXAgaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGFmU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBtaW5UaW1lc3RhbXAgPSBmcmFtZVRpbWVzdGFtcDsKICAgICAgICAgICAgICAgICBpZHggPSBqOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBBTE9HVlYoIiVzOiBTYXcgdGltZXN0YW1wICVsbGQiLCBfX0ZVTkNUSU9OX18sIGZyYW1lVGltZXN0YW1wKTsKKyAgICAgICAgICAgIEFMT0dWVigiJXM6IFNhdyB0aW1lc3RhbXAgJSIgUFJJZDY0LCBfX0ZVTkNUSU9OX18sIGZyYW1lVGltZXN0YW1wKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNDM1LDcgKzYyMiw3IEBACiAgICAgICAgIEFMT0dXKCIlczogWlNMIHF1ZXVlIGhhcyBubyBtZXRhZGF0YSBmcmFtZXMiLCBfX0ZVTkNUSU9OX18pOwogICAgIH0KIAotICAgIEFMT0dWKCIlczogQ2FuZGlkYXRlIHRpbWVzdGFtcCAlbGxkIChpZHggJWQpLCBlbXB0eSBmcmFtZXM6ICVkIiwKKyAgICBBTE9HVigiJXM6IENhbmRpZGF0ZSB0aW1lc3RhbXAgJSIgUFJJZDY0ICIgKGlkeCAlenUpLCBlbXB0eSBmcmFtZXM6ICV6dSIsCiAgICAgICAgICAgX19GVU5DVElPTl9fLCBtaW5UaW1lc3RhbXAsIGlkeCwgZW1wdHlDb3VudCk7CiAKICAgICBpZiAobWV0YWRhdGFJZHgpIHsKQEAgLTQ1MSwxMyArNjM4LDE1IEBACiB9CiAKIHZvaWQgWnNsUHJvY2Vzc29yMzo6b25CdWZmZXJSZWxlYXNlZChjb25zdCBCdWZmZXJJbmZvJiBidWZmZXJJbmZvKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGwobUlucHV0TXV0ZXgpOwogCiAgICAgLy8gaWdub3JlIG91dHB1dCBidWZmZXJzCiAgICAgaWYgKGJ1ZmZlckluZm8ubU91dHB1dCkgewogICAgICAgICByZXR1cm47CiAgICAgfQogCisgICAgLy8gTG9jayBtdXRleCBvbmx5IG9uY2Ugd2Uga25vdyB0aGlzIGlzIGFuIGlucHV0IGJ1ZmZlciByZXR1cm5lZCB0byBhdm9pZAorICAgIC8vIHBvdGVudGlhbCBkZWFkbG9jaworICAgIE11dGV4OjpBdXRvbG9jayBsKG1JbnB1dE11dGV4KTsKICAgICAvLyBUT0RPOiBWZXJpZnkgdGhhdCB0aGUgYnVmZmVyIGlzIGluIG91ciBxdWV1ZSBieSBsb29raW5nIGF0IHRpbWVzdGFtcAogICAgIC8vIHRoZW9yZXRpY2FsbHkgdW5uZWNlc3NhcnkgdW5sZXNzIHdlIGNoYW5nZSB0aGUgZm9sbG93aW5nIGFzc3VtcHRpb25zOgogICAgIC8vIC0tIG9ubHkgMSBidWZmZXIgcmVwcm9jZXNzZWQgYXQgYSB0aW1lICh3aGljaCBpcyB0aGUgY2FzZSBub3cpCkBAIC00NjgsMTEgKzY1NywxNyBAQAogICAgIC8vIFdlIG5lZWQgdG8gZ3VhcmFudGVlIHRoYXQgaWYgd2UgZG8gdHdvIGJhY2stdG8tYmFjayBjYXB0dXJlcywKICAgICAvLyB0aGUgc2Vjb25kIHdvbid0IHVzZSBhIGJ1ZmZlciB0aGF0J3Mgb2xkZXIvdGhlIHNhbWUgYXMgdGhlIGZpcnN0LCB3aGljaAogICAgIC8vIGlzIHRoZW9yZXRpY2FsbHkgcG9zc2libGUgaWYgd2UgZG9uJ3QgY2xlYXIgb3V0IHRoZSBxdWV1ZSBhbmQgdGhlCi0gICAgLy8gc2VsZWN0aW9uIGNyaXRlcmlhIGlzIHNvbWV0aGluZyBsaWtlICduZXdlc3QnLiBDbGVhcmluZyBvdXQgdGhlIHF1ZXVlCi0gICAgLy8gb24gYSBjb21wbGV0ZWQgY2FwdHVyZSBlbnN1cmVzIHdlJ2xsIG9ubHkgdXNlIG5ldyBkYXRhLgorICAgIC8vIHNlbGVjdGlvbiBjcml0ZXJpYSBpcyBzb21ldGhpbmcgbGlrZSAnbmV3ZXN0Jy4gQ2xlYXJpbmcgb3V0IHRoZSByZXN1bHQKKyAgICAvLyBtZXRhZGF0YSBxdWV1ZSBvbiBhIGNvbXBsZXRlZCBjYXB0dXJlIGVuc3VyZXMgd2UnbGwgb25seSB1c2UgbmV3IHRpbWVzdGFtcC4KKyAgICAvLyBDYWxsaW5nIGNsZWFyWnNsUXVldWVMb2NrZWQgaXMgYSBndWFyYW50ZWVkIGRlYWRsb2NrIGJlY2F1c2UgdGhpcyBjYWxsYmFjaworICAgIC8vIGhvbGRzIHRoZSBDYW1lcmEzU3RyZWFtIGludGVybmFsIGxvY2sgKG1Mb2NrKSwgYW5kIGNsZWFyWnNsUXVldWVMb2NrZWQgcmVxdWlyZXMKKyAgICAvLyB0byBob2xkIHRoZSBzYW1lIGxvY2suCisgICAgLy8gVE9ETzogbmVlZCBmaWd1cmUgb3V0IGEgd2F5IHRvIGNsZWFyIHRoZSBac2wgYnVmZmVyIHF1ZXVlIHByb3Blcmx5LiBSaWdodCBub3cKKyAgICAvLyBpdCBpcyBzYWZlIG5vdCB0byBkbyBzbywgYXMgYmFjayB0byBiYWNrIFpTTCBjYXB0dXJlIHJlcXVpcmVzIHN0b3AgYW5kIHN0YXJ0CisgICAgLy8gcHJldmlldywgd2hpY2ggd2lsbCBmbHVzaCBaU0wgcXVldWUgYXV0b21hdGljYWxseS4KICAgICBBTE9HVigiJXM6IE1lbW9yeSBvcHRpbWl6YXRpb24sIGNsZWFyaW5nIFpTTCBxdWV1ZSIsCiAgICAgICAgICAgX19GVU5DVElPTl9fKTsKLSAgICBjbGVhclpzbFF1ZXVlTG9ja2VkKCk7CisgICAgY2xlYXJac2xSZXN1bHRRdWV1ZUxvY2tlZCgpOwogCiAgICAgLy8gUmVxdWlyZWQgc28gd2UgYWNjZXB0IG1vcmUgWlNMIHJlcXVlc3RzCiAgICAgbVN0YXRlID0gUlVOTklORzsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IzLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yMy5oCmluZGV4IGQyZjgzMjIuLmZjOWY3MGMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IzLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3NvcjMuaApAQCAtNTAsOCArNTAsOCBAQAogICAgIFpzbFByb2Nlc3NvcjMoc3A8Q2FtZXJhMkNsaWVudD4gY2xpZW50LCB3cDxDYXB0dXJlU2VxdWVuY2VyPiBzZXF1ZW5jZXIpOwogICAgIH5ac2xQcm9jZXNzb3IzKCk7CiAKLSAgICAvLyBGcm9tIEZyYW1lUHJvY2Vzc29yCi0gICAgdmlydHVhbCB2b2lkIG9uRnJhbWVBdmFpbGFibGUoaW50MzJfdCByZXF1ZXN0SWQsIGNvbnN0IENhbWVyYU1ldGFkYXRhICZmcmFtZSk7CisgICAgLy8gRnJvbSBGcmFtZVByb2Nlc3Nvcjo6RmlsdGVyZWRMaXN0ZW5lcgorICAgIHZpcnR1YWwgdm9pZCBvblJlc3VsdEF2YWlsYWJsZShjb25zdCBDYXB0dXJlUmVzdWx0ICZyZXN1bHQpOwogCiAgICAgLyoqCiAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTgyLDYgKzgyLDcgQEAKIAogICBwcml2YXRlOgogICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtXYWl0RHVyYXRpb24gPSAxMDAwMDAwMDsgLy8gMTAgbXMKKyAgICBuc2Vjc190IG1MYXRlc3RDbGVhcmVkQnVmZmVyVGltZXN0YW1wOwogCiAgICAgZW51bSB7CiAgICAgICAgIFJVTk5JTkcsCkBAIC0xMDcsOCArMTA4LDkgQEAKICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgZnJhbWU7CiAgICAgfTsKIAotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1pzbEJ1ZmZlckRlcHRoID0gNDsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtGcmFtZUxpc3REZXB0aCA9IGtac2xCdWZmZXJEZXB0aCAqIDI7CisgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga0RlZmF1bHRNYXhQaXBlbGluZURlcHRoID0gNDsKKyAgICBzaXplX3QgbUJ1ZmZlclF1ZXVlRGVwdGg7CisgICAgc2l6ZV90IG1GcmFtZUxpc3REZXB0aDsKICAgICBWZWN0b3I8Q2FtZXJhTWV0YWRhdGE+IG1GcmFtZUxpc3Q7CiAgICAgc2l6ZV90IG1GcmFtZUxpc3RIZWFkOwogCkBAIC0xMjAsMTMgKzEyMiwyMiBAQAogCiAgICAgQ2FtZXJhTWV0YWRhdGEgbUxhdGVzdENhcHR1cmVkUmVxdWVzdDsKIAorICAgIGJvb2wgbUhhc0ZvY3VzZXI7CisKICAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpOwogCiAgICAgc3RhdHVzX3QgY2xlYXJac2xRdWV1ZUxvY2tlZCgpOwogCisgICAgdm9pZCBjbGVhclpzbFJlc3VsdFF1ZXVlTG9ja2VkKCk7CisKICAgICB2b2lkIGR1bXBac2xRdWV1ZShpbnQgaWQpIGNvbnN0OwogCiAgICAgbnNlY3NfdCBnZXRDYW5kaWRhdGVUaW1lc3RhbXBMb2NrZWQoc2l6ZV90KiBtZXRhZGF0YUlkeCkgY29uc3Q7CisKKyAgICBib29sIGlzRml4ZWRGb2N1c01vZGUodWludDhfdCBhZk1vZGUpIGNvbnN0OworCisgICAgLy8gVXBkYXRlIHRoZSBwb3N0LXByb2Nlc3NpbmcgbWV0YWRhdGEgd2l0aCB0aGUgZGVmYXVsdCBzdGlsbCBjYXB0dXJlIHJlcXVlc3QgdGVtcGxhdGUKKyAgICBzdGF0dXNfdCB1cGRhdGVSZXF1ZXN0V2l0aERlZmF1bHRTdGlsbFJlcXVlc3QoQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QpIGNvbnN0OwogfTsKIAogCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29ySW50ZXJmYWNlLmNwcApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggNjYlCmNvcHkgZnJvbSBsaWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKY29weSB0byBzZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29ySW50ZXJmYWNlLmNwcAppbmRleCAxM2NhYzZkLi45ZWZlYWJhCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29ySW50ZXJmYWNlLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDEzICsxNCwxNSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2lmbmRlZiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0gKLSNkZWZpbmUgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19ICisjaW5jbHVkZSAiWnNsUHJvY2Vzc29ySW50ZXJmYWNlLmgiCiAKLS8qIC0tLS0tIE1haW4gZmVhdHVyZXMgLS0tLS0gKi8KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzX01DUy5oIiAvKiBUcmFuc2NvZGVyICovCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY2FtZXJhMiB7CiAKLS8qIC0tLS0tIEFkZC1vbnMgLS0tLS0gKi8KK3N0YXR1c190IFpzbFByb2Nlc3NvckludGVyZmFjZTo6ZGlzY29ubmVjdCgpIHsKKyAgICByZXR1cm4gT0s7Cit9CiAKLSNlbmRpZiAvKiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0ggKi8KK307IC8vbmFtZXNwYWNlIGNhbWVyYTIKK307IC8vbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3NvckludGVyZmFjZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3NvckludGVyZmFjZS5oCmluZGV4IDE4M2MwYzIuLjllMjY2ZTcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3JJbnRlcmZhY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29ySW50ZXJmYWNlLmgKQEAgLTE5LDYgKzE5LDggQEAKIAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgY2FtZXJhMiB7CkBAIC0zNyw2ICszOSw5IEBACiAgICAgLy8gRGVsZXRlIHRoZSB1bmRlcmx5aW5nIENhbWVyYURldmljZSBzdHJlYW1zCiAgICAgdmlydHVhbCBzdGF0dXNfdCBkZWxldGVTdHJlYW0oKSA9IDA7CiAKKyAgICAvLyBDbGVhciBhbnkgYWRkaXRpb25hbCBzdGF0ZSBuZWNlc3NhcnkgYmVmb3JlIHRoZSBDYW1lcmFEZXZpY2UgaXMgZGlzY29ubmVjdGVkCisgICAgdmlydHVhbCBzdGF0dXNfdCBkaXNjb25uZWN0KCk7CisKICAgICAvKioKICAgICAgKiBTdWJtaXRzIGEgWlNMIGNhcHR1cmUgcmVxdWVzdCAoaWQgPSByZXF1ZXN0SWQpCiAgICAgICoKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcAppbmRleCBhYjcwNTdmLi5hZGQ2N2Y0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwCkBAIC0xNiwxMyArMTYsMTQgQEAKIAogI2RlZmluZSBMT0dfVEFHICJDYW1lcmFEZXZpY2VDbGllbnQiCiAjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKLS8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KICNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9DYXB0dXJlUmVxdWVzdC5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFVdGlscy5oPgogCiAjaW5jbHVkZSAiY29tbW9uL0NhbWVyYURldmljZUJhc2UuaCIKICNpbmNsdWRlICJhcGkyL0NhbWVyYURldmljZUNsaWVudC5oIgpAQCAtODIsNyArODMsNyBAQAogICAgIG1GcmFtZVByb2Nlc3Nvci0+cmVnaXN0ZXJMaXN0ZW5lcihGUkFNRV9QUk9DRVNTT1JfTElTVEVORVJfTUlOX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRV9QUk9DRVNTT1JfTElTVEVORVJfTUFYX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmxpc3RlbmVyKi90aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnF1aXJrU2VuZFBhcnRpYWxzKi90cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypzZW5kUGFydGlhbHMqL3RydWUpOwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtOTEsNzkgKzkyLDEwMSBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OnN1Ym1pdFJlcXVlc3Qoc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyZWFtaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyZWFtaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqIGxhc3RGcmFtZU51bWJlcikgeworICAgIExpc3Q8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4gcmVxdWVzdExpc3Q7CisgICAgcmVxdWVzdExpc3QucHVzaF9iYWNrKHJlcXVlc3QpOworICAgIHJldHVybiBzdWJtaXRSZXF1ZXN0TGlzdChyZXF1ZXN0TGlzdCwgc3RyZWFtaW5nLCBsYXN0RnJhbWVOdW1iZXIpOworfQorCitzdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OnN1Ym1pdFJlcXVlc3RMaXN0KExpc3Q8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4gcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyZWFtaW5nLCBpbnQ2NF90KiBsYXN0RnJhbWVOdW1iZXIpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgQUxPR1YoIiVzLXN0YXJ0IG9mIGZ1bmN0aW9uLiBSZXF1ZXN0IGxpc3Qgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIHJlcXVlc3RzLnNpemUoKSk7CiAKICAgICBzdGF0dXNfdCByZXM7Ci0KICAgICBpZiAoIChyZXMgPSBjaGVja1BpZChfX0ZVTkNUSU9OX18pICkgIT0gT0spIHJldHVybiByZXM7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7CiAKICAgICBpZiAoIW1EZXZpY2UuZ2V0KCkpIHJldHVybiBERUFEX09CSkVDVDsKIAotICAgIGlmIChyZXF1ZXN0ID09IDApIHsKKyAgICBpZiAocmVxdWVzdHMuZW1wdHkoKSkgewogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogU2VudCBudWxsIHJlcXVlc3QuIFJlamVjdGluZyByZXF1ZXN0LiIsCiAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YShyZXF1ZXN0LT5tTWV0YWRhdGEpOworICAgIExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+IG1ldGFkYXRhUmVxdWVzdExpc3Q7CisgICAgaW50MzJfdCByZXF1ZXN0SWQgPSBtUmVxdWVzdElkQ291bnRlcjsKKyAgICB1aW50MzJfdCBsb29wQ291bnRlciA9IDA7CiAKLSAgICBpZiAobWV0YWRhdGEuaXNFbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBTZW50IGVtcHR5IG1ldGFkYXRhIHBhY2tldC4gUmVqZWN0aW5nIHJlcXVlc3QuIiwKLSAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9IGVsc2UgaWYgKHJlcXVlc3QtPm1TdXJmYWNlTGlzdC5zaXplKCkgPT0gMCkgewotICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogUmVxdWVzdHMgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBzdXJmYWNlIHRhcmdldC4gIgotICAgICAgICAgICAgICAiUmVqZWN0aW5nIHJlcXVlc3QuIiwgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIGlmICghZW5mb3JjZVJlcXVlc3RQZXJtaXNzaW9ucyhtZXRhZGF0YSkpIHsKLSAgICAgICAgLy8gQ2FsbGVlIGxvZ3MKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlIGluIHRoZSBvdXRwdXQgc3RyZWFtIElEcyB3aGljaCB3ZSBjYWxjdWxhdGUgZnJvbQotICAgICAqIHRoZSBjYXB0dXJlIHJlcXVlc3QncyBsaXN0IG9mIHN1cmZhY2UgdGFyZ2V0cwotICAgICAqLwotICAgIFZlY3RvcjxpbnQzMl90PiBvdXRwdXRTdHJlYW1JZHM7Ci0gICAgb3V0cHV0U3RyZWFtSWRzLnNldENhcGFjaXR5KHJlcXVlc3QtPm1TdXJmYWNlTGlzdC5zaXplKCkpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVxdWVzdC0+bVN1cmZhY2VMaXN0LnNpemUoKTsgKytpKSB7Ci0gICAgICAgIHNwPFN1cmZhY2U+IHN1cmZhY2UgPSByZXF1ZXN0LT5tU3VyZmFjZUxpc3RbaV07Ci0KLSAgICAgICAgaWYgKHN1cmZhY2UgPT0gMCkgY29udGludWU7Ci0KLSAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gZ2JwID0gc3VyZmFjZS0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpOwotICAgICAgICBpbnQgaWR4ID0gbVN0cmVhbU1hcC5pbmRleE9mS2V5KGdicC0+YXNCaW5kZXIoKSk7Ci0KLSAgICAgICAgLy8gVHJ5aW5nIHRvIHN1Ym1pdCByZXF1ZXN0IHdpdGggc3VyZmFjZSB0aGF0IHdhc24ndCBjcmVhdGVkCi0gICAgICAgIGlmIChpZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBUcmllZCB0byBzdWJtaXQgYSByZXF1ZXN0IHdpdGggYSBzdXJmYWNlIHRoYXQiCi0gICAgICAgICAgICAgICAgICAiIHdlIGhhdmUgbm90IGNhbGxlZCBjcmVhdGVTdHJlYW0gb24iLAotICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOworICAgIGZvciAoTGlzdDxzcDxDYXB0dXJlUmVxdWVzdD4gPjo6aXRlcmF0b3IgaXQgPSByZXF1ZXN0cy5iZWdpbigpOyBpdCAhPSByZXF1ZXN0cy5lbmQoKTsgKytpdCkgeworICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCA9ICppdDsKKyAgICAgICAgaWYgKHJlcXVlc3QgPT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFNlbnQgbnVsbCByZXF1ZXN0LiIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KIAotICAgICAgICBpbnQgc3RyZWFtSWQgPSBtU3RyZWFtTWFwLnZhbHVlQXQoaWR4KTsKLSAgICAgICAgb3V0cHV0U3RyZWFtSWRzLnB1c2hfYmFjayhzdHJlYW1JZCk7Ci0gICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBBcHBlbmRpbmcgb3V0cHV0IHN0cmVhbSAlZCB0byByZXF1ZXN0IiwKLSAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVhbUlkKTsKKyAgICAgICAgQ2FtZXJhTWV0YWRhdGEgbWV0YWRhdGEocmVxdWVzdC0+bU1ldGFkYXRhKTsKKyAgICAgICAgaWYgKG1ldGFkYXRhLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFNlbnQgZW1wdHkgbWV0YWRhdGEgcGFja2V0LiBSZWplY3RpbmcgcmVxdWVzdC4iLAorICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0gZWxzZSBpZiAocmVxdWVzdC0+bVN1cmZhY2VMaXN0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFJlcXVlc3RzIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgc3VyZmFjZSB0YXJnZXQuICIKKyAgICAgICAgICAgICAgICAgICJSZWplY3RpbmcgcmVxdWVzdC4iLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFlbmZvcmNlUmVxdWVzdFBlcm1pc3Npb25zKG1ldGFkYXRhKSkgeworICAgICAgICAgICAgLy8gQ2FsbGVlIGxvZ3MKKyAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBXcml0ZSBpbiB0aGUgb3V0cHV0IHN0cmVhbSBJRHMgd2hpY2ggd2UgY2FsY3VsYXRlIGZyb20KKyAgICAgICAgICogdGhlIGNhcHR1cmUgcmVxdWVzdCdzIGxpc3Qgb2Ygc3VyZmFjZSB0YXJnZXRzCisgICAgICAgICAqLworICAgICAgICBWZWN0b3I8aW50MzJfdD4gb3V0cHV0U3RyZWFtSWRzOworICAgICAgICBvdXRwdXRTdHJlYW1JZHMuc2V0Q2FwYWNpdHkocmVxdWVzdC0+bVN1cmZhY2VMaXN0LnNpemUoKSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVxdWVzdC0+bVN1cmZhY2VMaXN0LnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBzcDxTdXJmYWNlPiBzdXJmYWNlID0gcmVxdWVzdC0+bVN1cmZhY2VMaXN0W2ldOworICAgICAgICAgICAgaWYgKHN1cmZhY2UgPT0gMCkgY29udGludWU7CisKKyAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGdicCA9IHN1cmZhY2UtPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKTsKKyAgICAgICAgICAgIGludCBpZHggPSBtU3RyZWFtTWFwLmluZGV4T2ZLZXkoZ2JwLT5hc0JpbmRlcigpKTsKKworICAgICAgICAgICAgLy8gVHJ5aW5nIHRvIHN1Ym1pdCByZXF1ZXN0IHdpdGggc3VyZmFjZSB0aGF0IHdhc24ndCBjcmVhdGVkCisgICAgICAgICAgICBpZiAoaWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFRyaWVkIHRvIHN1Ym1pdCBhIHJlcXVlc3Qgd2l0aCBhIHN1cmZhY2UgdGhhdCIKKyAgICAgICAgICAgICAgICAgICAgICAiIHdlIGhhdmUgbm90IGNhbGxlZCBjcmVhdGVTdHJlYW0gb24iLAorICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgc3RyZWFtSWQgPSBtU3RyZWFtTWFwLnZhbHVlQXQoaWR4KTsKKyAgICAgICAgICAgIG91dHB1dFN0cmVhbUlkcy5wdXNoX2JhY2soc3RyZWFtSWQpOworICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IEFwcGVuZGluZyBvdXRwdXQgc3RyZWFtICVkIHRvIHJlcXVlc3QiLAorICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVhbUlkKTsKKyAgICAgICAgfQorCisgICAgICAgIG1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfT1VUUFVUX1NUUkVBTVMsICZvdXRwdXRTdHJlYW1JZHNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW1JZHMuc2l6ZSgpKTsKKworICAgICAgICBtZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX0lELCAmcmVxdWVzdElkLCAvKnNpemUqLzEpOworICAgICAgICBsb29wQ291bnRlcisrOyAvLyBsb29wQ291bnRlciBzdGFydHMgZnJvbSAxCisgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBDcmVhdGluZyByZXF1ZXN0IHdpdGggSUQgJWQgKCVkIG9mICV6dSkiLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgcmVxdWVzdElkLCBsb29wQ291bnRlciwgcmVxdWVzdHMuc2l6ZSgpKTsKKworICAgICAgICBtZXRhZGF0YVJlcXVlc3RMaXN0LnB1c2hfYmFjayhtZXRhZGF0YSk7CiAgICAgfQotCi0gICAgbWV0YWRhdGEudXBkYXRlKEFORFJPSURfUkVRVUVTVF9PVVRQVVRfU1RSRUFNUywgJm91dHB1dFN0cmVhbUlkc1swXSwKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtSWRzLnNpemUoKSk7Ci0KLSAgICBpbnQzMl90IHJlcXVlc3RJZCA9IG1SZXF1ZXN0SWRDb3VudGVyKys7Ci0gICAgbWV0YWRhdGEudXBkYXRlKEFORFJPSURfUkVRVUVTVF9JRCwgJnJlcXVlc3RJZCwgLypzaXplKi8xKTsKLSAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogU3VibWl0dGluZyByZXF1ZXN0IHdpdGggSUQgJWQiLAotICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCByZXF1ZXN0SWQpOworICAgIG1SZXF1ZXN0SWRDb3VudGVyKys7CiAKICAgICBpZiAoc3RyZWFtaW5nKSB7Ci0gICAgICAgIHJlcyA9IG1EZXZpY2UtPnNldFN0cmVhbWluZ1JlcXVlc3QobWV0YWRhdGEpOworICAgICAgICByZXMgPSBtRGV2aWNlLT5zZXRTdHJlYW1pbmdSZXF1ZXN0TGlzdChtZXRhZGF0YVJlcXVlc3RMaXN0LCBsYXN0RnJhbWVOdW1iZXIpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogIEdvdCBlcnJvciAlZCBhZnRlciB0cnlpbmcgdG8gc2V0IHN0cmVhbWluZyAiCiAgICAgICAgICAgICAgICAgICAicmVxdWVzdCIsIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCByZXMpOwpAQCAtMTcxLDExICsxOTQsMTIgQEAKICAgICAgICAgICAgIG1TdHJlYW1pbmdSZXF1ZXN0TGlzdC5wdXNoX2JhY2socmVxdWVzdElkKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlcyA9IG1EZXZpY2UtPmNhcHR1cmUobWV0YWRhdGEpOworICAgICAgICByZXMgPSBtRGV2aWNlLT5jYXB0dXJlTGlzdChtZXRhZGF0YVJlcXVlc3RMaXN0LCBsYXN0RnJhbWVOdW1iZXIpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogR290IGVycm9yICVkIGFmdGVyIHRyeWluZyB0byBzZXQgY2FwdHVyZSIsCi0gICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgcmVzKTsKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgcmVzKTsKICAgICAgICAgfQorICAgICAgICBBTE9HVigiJXM6IHJlcXVlc3RJZCA9ICVkICIsIF9fRlVOQ1RJT05fXywgcmVxdWVzdElkKTsKICAgICB9CiAKICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogRW5kIG9mIGZ1bmN0aW9uIiwgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOwpAQCAtMTg2LDcgKzIxMCw3IEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50OjpjYW5jZWxSZXF1ZXN0KGludCByZXF1ZXN0SWQpIHsKK3N0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6Y2FuY2VsUmVxdWVzdChpbnQgcmVxdWVzdElkLCBpbnQ2NF90KiBsYXN0RnJhbWVOdW1iZXIpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlcywgcmVxdWVzdElkID0gJWQiLCBfX0ZVTkNUSU9OX18sIHJlcXVlc3RJZCk7CiAKQEAgLTIxMiw3ICsyMzYsNyBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIHJlcyA9IG1EZXZpY2UtPmNsZWFyU3RyZWFtaW5nUmVxdWVzdCgpOworICAgIHJlcyA9IG1EZXZpY2UtPmNsZWFyU3RyZWFtaW5nUmVxdWVzdChsYXN0RnJhbWVOdW1iZXIpOwogCiAgICAgaWYgKHJlcyA9PSBPSykgewogICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogU3VjY2Vzc2Z1bGx5IGNsZWFyZWQgc3RyZWFtaW5nIHJlcXVlc3QiLApAQCAtMjIzLDYgKzI0NywyNiBAQAogICAgIHJldHVybiByZXM7CiB9CiAKK3N0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6YmVnaW5Db25maWd1cmUoKSB7CisgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMuCisgICAgQUxPR0UoIiVzOiBOb3QgaW1wbGVtZW50ZWQgeWV0LiIsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OmVuZENvbmZpZ3VyZSgpIHsKKyAgICBBTE9HVigiJXM6IGVuZGluZyBjb25maWd1cmUgKCV6dSBzdHJlYW1zKSIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1TdHJlYW1NYXAuc2l6ZSgpKTsKKworICAgIHN0YXR1c190IHJlczsKKyAgICBpZiAoIChyZXMgPSBjaGVja1BpZChfX0ZVTkNUSU9OX18pICkgIT0gT0spIHJldHVybiByZXM7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7CisKKyAgICBpZiAoIW1EZXZpY2UuZ2V0KCkpIHJldHVybiBERUFEX09CSkVDVDsKKworICAgIHJldHVybiBtRGV2aWNlLT5jb25maWd1cmVTdHJlYW1zKCk7Cit9CisKIHN0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6ZGVsZXRlU3RyZWFtKGludCBzdHJlYW1JZCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR1YoIiVzIChzdHJlYW1JZCA9IDB4JXgpIiwgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7CkBAIC0yNTksOCArMzAzLDYgQEAKICAgICB9IGVsc2UgaWYgKHJlcyA9PSBPSykgewogICAgICAgICBtU3RyZWFtTWFwLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOwogCi0gICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBTdWNjZXNzZnVsbHkgZGVsZXRlZCBzdHJlYW0gSUQgKCVkKSIsCi0gICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlYW1JZCk7CiAgICAgfQogCiAgICAgcmV0dXJuIHJlczsKQEAgLTI3Nyw2ICszMTksMTAgQEAKIAogICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKIAorICAgIGlmIChidWZmZXJQcm9kdWNlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogYnVmZmVyUHJvZHVjZXIgbXVzdCBub3QgYmUgbnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQogICAgIGlmICghbURldmljZS5nZXQoKSkgcmV0dXJuIERFQURfT0JKRUNUOwogCiAgICAgLy8gRG9uJ3QgY3JlYXRlIG11bHRpcGxlIHN0cmVhbXMgZm9yIHRoZSBzYW1lIHRhcmdldCBzdXJmYWNlCkBAIC0yODQsNyArMzMwLDcgQEAKICAgICAgICAgc3NpemVfdCBpbmRleCA9IG1TdHJlYW1NYXAuaW5kZXhPZktleShidWZmZXJQcm9kdWNlci0+YXNCaW5kZXIoKSk7CiAgICAgICAgIGlmIChpbmRleCAhPSBOQU1FX05PVF9GT1VORCkgewogICAgICAgICAgICAgQUxPR1coIiVzOiBDYW1lcmEgJWQ6IEJ1ZmZlciBwcm9kdWNlciBhbHJlYWR5IGhhcyBhIHN0cmVhbSBmb3IgaXQgIgotICAgICAgICAgICAgICAgICAgIihJRCAlZCkiLAorICAgICAgICAgICAgICAgICAgIihJRCAlemQpIiwKICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBpbmRleCk7CiAgICAgICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7CiAgICAgICAgIH0KQEAgLTM0NiwyMyArMzkyLDcgQEAKICAgICAvLyBhZnRlciBlYWNoIGNhbGwsIGJ1dCBvbmx5IG9uY2Ugd2UgYXJlIGRvbmUgd2l0aCBhbGwuCiAKICAgICBpbnQgc3RyZWFtSWQgPSAtMTsKLSAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgewotICAgICAgICAvLyBKUEVHIGJ1ZmZlcnMgbmVlZCB0byBiZSBzaXplZCBmb3IgbWF4aW11bSBwb3NzaWJsZSBjb21wcmVzc2VkIHNpemUKLSAgICAgICAgQ2FtZXJhTWV0YWRhdGEgc3RhdGljSW5mbyA9IG1EZXZpY2UtPmluZm8oKTsKLSAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgZW50cnkgPSBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9KUEVHX01BWF9TSVpFKTsKLSAgICAgICAgaWYgKGVudHJ5LmNvdW50ID09IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBmaW5kIG1heGltdW0gSlBFRyBzaXplIGluICIKLSAgICAgICAgICAgICAgICAgICAgInN0YXRpYyBtZXRhZGF0YSEiLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0KLSAgICAgICAgaW50MzJfdCBtYXhKcGVnU2l6ZSA9IGVudHJ5LmRhdGEuaTMyWzBdOwotICAgICAgICByZXMgPSBtRGV2aWNlLT5jcmVhdGVTdHJlYW0oYW53LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIG1heEpwZWdTaXplLAotICAgICAgICAgICAgICAgICZzdHJlYW1JZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gQWxsIG90aGVyIHN0cmVhbXMgYXJlIGEga25vd24gc2l6ZQotICAgICAgICByZXMgPSBtRGV2aWNlLT5jcmVhdGVTdHJlYW0oYW53LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIC8qc2l6ZSovMCwKLSAgICAgICAgICAgICAgICAmc3RyZWFtSWQpOwotICAgIH0KKyAgICByZXMgPSBtRGV2aWNlLT5jcmVhdGVTdHJlYW0oYW53LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsICZzdHJlYW1JZCk7CiAKICAgICBpZiAocmVzID09IE9LKSB7CiAgICAgICAgIG1TdHJlYW1NYXAuYWRkKGJ1ZmZlclByb2R1Y2VyLT5hc0JpbmRlcigpLCBzdHJlYW1JZCk7CkBAIC00NjUsNyArNDk1LDcgQEAKICAgICByZXR1cm4gcmVzOwogfQogCi1zdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OmZsdXNoKCkgeworc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50OjpmbHVzaChpbnQ2NF90KiBsYXN0RnJhbWVOdW1iZXIpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7CiAKQEAgLTQ3Niw3ICs1MDYsOCBAQAogCiAgICAgaWYgKCFtRGV2aWNlLmdldCgpKSByZXR1cm4gREVBRF9PQkpFQ1Q7CiAKLSAgICByZXR1cm4gbURldmljZS0+Zmx1c2goKTsKKyAgICBtU3RyZWFtaW5nUmVxdWVzdExpc3QuY2xlYXIoKTsKKyAgICByZXR1cm4gbURldmljZS0+Zmx1c2gobGFzdEZyYW1lTnVtYmVyKTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50OjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgewpAQCAtNDg1LDI1ICs1MTYsMzcgQEAKIAogc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50OjpkdW1wQ2xpZW50KGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgewogICAgIFN0cmluZzggcmVzdWx0OwotICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIkNhbWVyYURldmljZUNsaWVudFslZF0gKCVwKSBQSUQ6ICVkLCBkdW1wOlxuIiwKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJDYW1lcmFEZXZpY2VDbGllbnRbJWRdICglcCkgZHVtcDpcbiIsCiAgICAgICAgICAgICBtQ2FtZXJhSWQsCi0gICAgICAgICAgICBnZXRSZW1vdGVDYWxsYmFjaygpLT5hc0JpbmRlcigpLmdldCgpLAotICAgICAgICAgICAgbUNsaWVudFBpZCk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiICBTdGF0ZTogIik7CisgICAgICAgICAgICBnZXRSZW1vdGVDYWxsYmFjaygpLT5hc0JpbmRlcigpLmdldCgpKTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIEN1cnJlbnQgY2xpZW50OiAlcyAoUElEICVkLCBVSUQgJXUpXG4iLAorICAgICAgICAgICAgU3RyaW5nOChtQ2xpZW50UGFja2FnZU5hbWUpLnN0cmluZygpLAorICAgICAgICAgICAgbUNsaWVudFBpZCwgbUNsaWVudFVpZCk7CiAKKyAgICByZXN1bHQuYXBwZW5kKCIgIFN0YXRlOlxuIik7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICAgIFJlcXVlc3QgSUQgY291bnRlcjogJWRcbiIsIG1SZXF1ZXN0SWRDb3VudGVyKTsKKyAgICBpZiAoIW1TdHJlYW1NYXAuaXNFbXB0eSgpKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgICBDdXJyZW50IHN0cmVhbSBJRHM6XG4iKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3RyZWFtTWFwLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgICAgICBTdHJlYW0gJWRcbiIsIG1TdHJlYW1NYXAudmFsdWVBdChpKSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQuYXBwZW5kKCIgICAgTm8gc3RyZWFtcyBjb25maWd1cmVkLlxuIik7CisgICAgfQorICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogICAgIC8vIFRPRE86IHByaW50IGR5bmFtaWMvcmVxdWVzdCBzZWN0aW9uIGZyb20gbW9zdCByZWNlbnQgcmVxdWVzdHMKICAgICBtRnJhbWVQcm9jZXNzb3ItPmR1bXAoZmQsIGFyZ3MpOwogCiAgICAgcmV0dXJuIGR1bXBEZXZpY2UoZmQsIGFyZ3MpOwogfQogCi0KLXZvaWQgQ2FtZXJhRGV2aWNlQ2xpZW50Ojpub3RpZnlFcnJvcigpIHsKK3ZvaWQgQ2FtZXJhRGV2aWNlQ2xpZW50Ojpub3RpZnlFcnJvcihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpDYW1lcmFFcnJvckNvZGUgZXJyb3JDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgewogICAgIC8vIFRocmVhZCBzYWZlLiBEb24ndCBib3RoZXIgbG9ja2luZy4KICAgICBzcDxJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiByZW1vdGVDYiA9IGdldFJlbW90ZUNhbGxiYWNrKCk7CiAKICAgICBpZiAocmVtb3RlQ2IgIT0gMCkgewotICAgICAgICByZW1vdGVDYi0+b25EZXZpY2VFcnJvcihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfREVWSUNFKTsKKyAgICAgICAgcmVtb3RlQ2ItPm9uRGV2aWNlRXJyb3IoZXJyb3JDb2RlLCByZXN1bHRFeHRyYXMpOwogICAgIH0KIH0KIApAQCAtNTE2LDEyICs1NTksMTIgQEAKICAgICB9CiB9CiAKLXZvaWQgQ2FtZXJhRGV2aWNlQ2xpZW50Ojpub3RpZnlTaHV0dGVyKGludCByZXF1ZXN0SWQsCit2b2lkIENhbWVyYURldmljZUNsaWVudDo6bm90aWZ5U2h1dHRlcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCiAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKSB7CiAgICAgLy8gVGhyZWFkIHNhZmUuIERvbid0IGJvdGhlciBsb2NraW5nLgogICAgIHNwPElDYW1lcmFEZXZpY2VDYWxsYmFja3M+IHJlbW90ZUNiID0gZ2V0UmVtb3RlQ2FsbGJhY2soKTsKICAgICBpZiAocmVtb3RlQ2IgIT0gMCkgewotICAgICAgICByZW1vdGVDYi0+b25DYXB0dXJlU3RhcnRlZChyZXF1ZXN0SWQsIHRpbWVzdGFtcCk7CisgICAgICAgIHJlbW90ZUNiLT5vbkNhcHR1cmVTdGFydGVkKHJlc3VsdEV4dHJhcywgdGltZXN0YW1wKTsKICAgICB9CiB9CiAKQEAgLTU1NiwxNiArNTk5LDE0IEBACiB9CiAKIC8qKiBEZXZpY2UtcmVsYXRlZCBtZXRob2RzICovCi12b2lkIENhbWVyYURldmljZUNsaWVudDo6b25GcmFtZUF2YWlsYWJsZShpbnQzMl90IHJlcXVlc3RJZCwKLSAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGZyYW1lKSB7Cit2b2lkIENhbWVyYURldmljZUNsaWVudDo6b25SZXN1bHRBdmFpbGFibGUoY29uc3QgQ2FwdHVyZVJlc3VsdCYgcmVzdWx0KSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOwogCiAgICAgLy8gVGhyZWFkLXNhZmUuIE5vIGxvY2sgbmVjZXNzYXJ5LgogICAgIHNwPElDYW1lcmFEZXZpY2VDYWxsYmFja3M+IHJlbW90ZUNiID0gbVJlbW90ZUNhbGxiYWNrOwogICAgIGlmIChyZW1vdGVDYiAhPSBOVUxMKSB7Ci0gICAgICAgIEFMT0dWKCIlczogZnJhbWUgPSAlcCAiLCBfX0ZVTkNUSU9OX18sICZmcmFtZSk7Ci0gICAgICAgIHJlbW90ZUNiLT5vblJlc3VsdFJlY2VpdmVkKHJlcXVlc3RJZCwgZnJhbWUpOworICAgICAgICByZW1vdGVDYi0+b25SZXN1bHRSZWNlaXZlZChyZXN1bHQubU1ldGFkYXRhLCByZXN1bHQubVJlc3VsdEV4dHJhcyk7CiAgICAgfQogfQogCkBAIC02MjQsNjEgKzY2NSw4IEBACiBzdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OmdldFJvdGF0aW9uVHJhbnNmb3JtTG9ja2VkKGludDMyX3QqIHRyYW5zZm9ybSkgewogICAgIEFMT0dWKCIlczogYmVnaW4iLCBfX0ZVTkNUSU9OX18pOwogCi0gICAgaWYgKHRyYW5zZm9ybSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCIlczogbnVsbCB0cmFuc2Zvcm0iLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgICp0cmFuc2Zvcm0gPSAwOwotCiAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHN0YXRpY0luZm8gPSBtRGV2aWNlLT5pbmZvKCk7Ci0gICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZW50cnkgPSBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9TRU5TT1JfT1JJRU5UQVRJT04pOwotICAgIGlmIChlbnRyeS5jb3VudCA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBmaW5kIGFuZHJvaWQuc2Vuc29yLm9yaWVudGF0aW9uIGluICIKLSAgICAgICAgICAgICAgICAic3RhdGljIG1ldGFkYXRhISIsIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIGludDMyX3QmIGZsYWdzID0gKnRyYW5zZm9ybTsKLQotICAgIGludCBvcmllbnRhdGlvbiA9IGVudHJ5LmRhdGEuaTMyWzBdOwotICAgIHN3aXRjaCAob3JpZW50YXRpb24pIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgZmxhZ3MgPSAwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgOTA6Ci0gICAgICAgICAgICBmbGFncyA9IE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX1JPVF85MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE4MDoKLSAgICAgICAgICAgIGZsYWdzID0gTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fUk9UXzE4MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI3MDoKLSAgICAgICAgICAgIGZsYWdzID0gTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fUk9UXzI3MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIEhBTCBhbmRyb2lkLnNlbnNvci5vcmllbnRhdGlvbiB2YWx1ZTogJWQiLAotICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBvcmllbnRhdGlvbik7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtYWdpYyBmbGFnIG1ha2VzIHN1cmZhY2VmbGluZ2VyIHVuLXJvdGF0ZSB0aGUgYnVmZmVycwotICAgICAqIHRvIGNvdW50ZXIgdGhlIGV4dHJhIGdsb2JhbCBkZXZpY2UgVUkgcm90YXRpb24gd2hlbmV2ZXIgdGhlIHVzZXIKLSAgICAgKiBwaHlzaWNhbGx5IHJvdGF0ZXMgdGhlIGRldmljZS4KLSAgICAgKgotICAgICAqIEJ5IGRvaW5nIHRoaXMsIHRoZSBjYW1lcmEgYnVmZmVyIGFsd2F5cyBlbmRzIHVwIGFsaWduZWQKLSAgICAgKiB3aXRoIHRoZSBwaHlzaWNhbCBjYW1lcmEgZm9yIGEgInNlZSB0aHJvdWdoIiBlZmZlY3QuCi0gICAgICoKLSAgICAgKiBJbiBlc3NlbmNlLCB0aGUgYnVmZmVyIG9ubHkgZ2V0cyByb3RhdGVkIGR1cmluZyBwcmV2aWV3IHVzZS1jYXNlcy4KLSAgICAgKiBUaGUgdXNlciBpcyBzdGlsbCByZXNwb25zaWJsZSB0byByZS1jcmVhdGUgc3RyZWFtcyBvZiB0aGUgcHJvcGVyCi0gICAgICogYXNwZWN0IHJhdGlvLCBvciB0aGUgcHJldmlldyB3aWxsIGVuZCB1cCBsb29raW5nIG5vbi11bmlmb3JtbHkKLSAgICAgKiBzdHJldGNoZWQuCi0gICAgICovCi0gICAgZmxhZ3MgfD0gTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fSU5WRVJTRV9ESVNQTEFZOwotCi0gICAgQUxPR1YoIiVzOiBmaW5hbCB0cmFuc2Zvcm0gPSAweCV4IiwgX19GVU5DVElPTl9fLCBmbGFncyk7Ci0KLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIENhbWVyYVV0aWxzOjpnZXRSb3RhdGlvblRyYW5zZm9ybShzdGF0aWNJbmZvLCB0cmFuc2Zvcm0pOwogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaAppbmRleCA5OWRmMzg2Li4xYWVhZTZiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgKQEAgLTYzLDkgKzYzLDIyIEBACiAgICAgICovCiAKICAgICAvLyBOb3RlIHRoYXQgdGhlIGNhbGxlZSBnZXRzIGEgY29weSBvZiB0aGUgbWV0YWRhdGEuCi0gICAgdmlydHVhbCBpbnQgICAgICAgICAgIHN1Ym1pdFJlcXVlc3Qoc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJlYW1pbmcgPSBmYWxzZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGNhbmNlbFJlcXVlc3QoaW50IHJlcXVlc3RJZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgc3VibWl0UmVxdWVzdChzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyZWFtaW5nID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiBsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKKyAgICAvLyBMaXN0IG9mIHJlcXVlc3RzIGFyZSBjb3BpZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgc3VibWl0UmVxdWVzdExpc3QoTGlzdDxzcDxDYXB0dXJlUmVxdWVzdD4gPiByZXF1ZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cmVhbWluZyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiBsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgY2FuY2VsUmVxdWVzdChpbnQgcmVxdWVzdElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiBsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgYmVnaW5Db25maWd1cmUoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5kQ29uZmlndXJlKCk7CiAKICAgICAvLyBSZXR1cm5zIC1FQlVTWSBpZiBkZXZpY2UgaXMgbm90IGlkbGUKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgZGVsZXRlU3RyZWFtKGludCBzdHJlYW1JZCk7CkBAIC04OSw3ICsxMDIsOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICB3YWl0VW50aWxJZGxlKCk7CiAKICAgICAvLyBGbHVzaCBhbGwgYWN0aXZlIGFuZCBwZW5kaW5nIHJlcXVlc3RzIGFzIGZhc3QgYXMgcG9zc2libGUKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgZmx1c2goKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgZmx1c2goLypvdXQqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiBsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKIAogICAgIC8qKgogICAgICAqIEludGVyZmFjZSB1c2VkIGJ5IENhbWVyYVNlcnZpY2UKQEAgLTExNiwxNiArMTMwLDE2IEBACiAgICAgICovCiAKICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5SWRsZSgpOwotICAgIHZpcnR1YWwgdm9pZCBub3RpZnlFcnJvcigpOwotICAgIHZpcnR1YWwgdm9pZCBub3RpZnlTaHV0dGVyKGludCByZXF1ZXN0SWQsIG5zZWNzX3QgdGltZXN0YW1wKTsKKyAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5RXJyb3IoSUNhbWVyYURldmljZUNhbGxiYWNrczo6Q2FtZXJhRXJyb3JDb2RlIGVycm9yQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKTsKKyAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5U2h1dHRlcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsIG5zZWNzX3QgdGltZXN0YW1wKTsKIAogICAgIC8qKgogICAgICAqIEludGVyZmFjZSB1c2VkIGJ5IGluZGVwZW5kZW50IGNvbXBvbmVudHMgb2YgQ2FtZXJhRGV2aWNlQ2xpZW50LgogICAgICAqLwogcHJvdGVjdGVkOgogICAgIC8qKiBGaWx0ZXJlZExpc3RlbmVyIGltcGxlbWVudGF0aW9uICoqLwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBvbkZyYW1lQXZhaWxhYmxlKGludDMyX3QgcmVxdWVzdElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBmcmFtZSk7CisgICAgdmlydHVhbCB2b2lkICAgICAgICAgIG9uUmVzdWx0QXZhaWxhYmxlKGNvbnN0IENhcHR1cmVSZXN1bHQmIHJlc3VsdCk7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgIGRldGFjaERldmljZSgpOwogCiAgICAgLy8gQ2FsY3VsYXRlIHRoZSBBTmF0aXZlV2luZG93IHRyYW5zZm9ybSBmcm9tIGFuZHJvaWQuc2Vuc29yLm9yaWVudGF0aW9uCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGlfcHJvL1Byb0NhbWVyYTJDbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpX3Byby9Qcm9DYW1lcmEyQ2xpZW50LmNwcAppbmRleCAyNzE1NmIxLi42YWIyNWUyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGlfcHJvL1Byb0NhbWVyYTJDbGllbnQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaV9wcm8vUHJvQ2FtZXJhMkNsaWVudC5jcHAKQEAgLTI4MCw3ICsyODAsNyBAQAogICAgICAgICB3aW5kb3cgPSBuZXcgU3VyZmFjZShidWZmZXJQcm9kdWNlcik7CiAgICAgfQogCi0gICAgcmV0dXJuIG1EZXZpY2UtPmNyZWF0ZVN0cmVhbSh3aW5kb3csIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgLypzaXplKi8xLAorICAgIHJldHVybiBtRGV2aWNlLT5jcmVhdGVTdHJlYW0od2luZG93LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JZCk7CiB9CiAKQEAgLTM0MCwxMSArMzQwLDExIEBACiAgICAgICAgICAgICBtQ2FtZXJhSWQsCiAgICAgICAgICAgICBnZXRSZW1vdGVDYWxsYmFjaygpLT5hc0JpbmRlcigpLmdldCgpLAogICAgICAgICAgICAgbUNsaWVudFBpZCk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiICBTdGF0ZTogIik7CisgICAgcmVzdWx0LmFwcGVuZCgiICBTdGF0ZTpcbiIpOworICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogCiAgICAgLy8gVE9ETzogcHJpbnQgZHluYW1pYy9yZXF1ZXN0IHNlY3Rpb24gZnJvbSBtb3N0IHJlY2VudCByZXF1ZXN0cwogICAgIG1GcmFtZVByb2Nlc3Nvci0+ZHVtcChmZCwgYXJncyk7Ci0KICAgICByZXR1cm4gZHVtcERldmljZShmZCwgYXJncyk7CiB9CiAKQEAgLTM3Nyw5ICszNzcsNyBAQAogICAgIENhbWVyYTJDbGllbnRCYXNlOjpkZXRhY2hEZXZpY2UoKTsKIH0KIAotLyoqIERldmljZS1yZWxhdGVkIG1ldGhvZHMgKi8KLXZvaWQgUHJvQ2FtZXJhMkNsaWVudDo6b25GcmFtZUF2YWlsYWJsZShpbnQzMl90IHJlcXVlc3RJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgZnJhbWUpIHsKK3ZvaWQgUHJvQ2FtZXJhMkNsaWVudDo6b25SZXN1bHRBdmFpbGFibGUoY29uc3QgQ2FwdHVyZVJlc3VsdCYgcmVzdWx0KSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOwogCkBAIC0zODcsMTMgKzM4NSwxMiBAQAogICAgIFNoYXJlZENhbWVyYUNhbGxiYWNrczo6TG9jayBsKG1TaGFyZWRDYW1lcmFDYWxsYmFja3MpOwogCiAgICAgaWYgKG1SZW1vdGVDYWxsYmFjayAhPSBOVUxMKSB7Ci0gICAgICAgIENhbWVyYU1ldGFkYXRhIHRtcChmcmFtZSk7CisgICAgICAgIENhbWVyYU1ldGFkYXRhIHRtcChyZXN1bHQubU1ldGFkYXRhKTsKICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3QqIG1ldGEgPSB0bXAucmVsZWFzZSgpOwogICAgICAgICBBTE9HVigiJXM6IG1ldGEgPSAlcCAiLCBfX0ZVTkNUSU9OX18sIG1ldGEpOwotICAgICAgICBtUmVtb3RlQ2FsbGJhY2stPm9uUmVzdWx0UmVjZWl2ZWQocmVxdWVzdElkLCBtZXRhKTsKKyAgICAgICAgbVJlbW90ZUNhbGxiYWNrLT5vblJlc3VsdFJlY2VpdmVkKHJlc3VsdC5tUmVzdWx0RXh0cmFzLnJlcXVlc3RJZCwgbWV0YSk7CiAgICAgICAgIHRtcC5hY3F1aXJlKG1ldGEpOwogICAgIH0KLQogfQogCiBib29sIFByb0NhbWVyYTJDbGllbnQ6OmVuZm9yY2VSZXF1ZXN0UGVybWlzc2lvbnMoQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGlfcHJvL1Byb0NhbWVyYTJDbGllbnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaV9wcm8vUHJvQ2FtZXJhMkNsaWVudC5oCmluZGV4IDEzN2MyNzIuLmZiZDg2OWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaV9wcm8vUHJvQ2FtZXJhMkNsaWVudC5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaV9wcm8vUHJvQ2FtZXJhMkNsaWVudC5oCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSAiY29tbW9uL0ZyYW1lUHJvY2Vzc29yQmFzZS5oIgogI2luY2x1ZGUgImNvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5oIgogI2luY2x1ZGUgImRldmljZTIvQ2FtZXJhMkRldmljZS5oIgorI2luY2x1ZGUgImNhbWVyYS9DYXB0dXJlUmVzdWx0LmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtOTksOCArMTAwLDggQEAKIAogcHJvdGVjdGVkOgogICAgIC8qKiBGaWx0ZXJlZExpc3RlbmVyIGltcGxlbWVudGF0aW9uICoqLwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBvbkZyYW1lQXZhaWxhYmxlKGludDMyX3QgcmVxdWVzdElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBmcmFtZSk7CisgICAgdmlydHVhbCB2b2lkIG9uUmVzdWx0QXZhaWxhYmxlKGNvbnN0IENhcHR1cmVSZXN1bHQmIHJlc3VsdCk7CisKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgZGV0YWNoRGV2aWNlKCk7CiAKIHByaXZhdGU6CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcAppbmRleCBiNmFkMDQyLi4zYmU2Mzk4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAKQEAgLTE4LDYgKzE4LDggQEAKICNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAKQEAgLTUyLDEwICs1NCwxMyBAQAogICAgICAgICBpbnQgc2VydmljZVBpZCk6CiAgICAgICAgIFRDbGllbnRCYXNlKGNhbWVyYVNlcnZpY2UsIHJlbW90ZUNhbGxiYWNrLCBjbGllbnRQYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgY2FtZXJhRmFjaW5nLCBjbGllbnRQaWQsIGNsaWVudFVpZCwgc2VydmljZVBpZCksCi0gICAgICAgIG1TaGFyZWRDYW1lcmFDYWxsYmFja3MocmVtb3RlQ2FsbGJhY2spCisgICAgICAgIG1TaGFyZWRDYW1lcmFDYWxsYmFja3MocmVtb3RlQ2FsbGJhY2spLAorICAgICAgICBtRGV2aWNlVmVyc2lvbihjYW1lcmFTZXJ2aWNlLT5nZXREZXZpY2VWZXJzaW9uKGNhbWVyYUlkKSkKIHsKLSAgICBBTE9HSSgiQ2FtZXJhICVkOiBPcGVuZWQiLCBjYW1lcmFJZCk7CisgICAgQUxPR0koIkNhbWVyYSAlZDogT3BlbmVkLiBDbGllbnQ6ICVzIChQSUQgJWQsIFVJRCAlZCkiLCBjYW1lcmFJZCwKKyAgICAgICAgICAgIFN0cmluZzgoY2xpZW50UGFja2FnZU5hbWUpLnN0cmluZygpLCBjbGllbnRQaWQsIGNsaWVudFVpZCk7CiAKKyAgICBtSW5pdGlhbENsaWVudFBpZCA9IGNsaWVudFBpZDsKICAgICBtRGV2aWNlID0gQ2FtZXJhRGV2aWNlRmFjdG9yeTo6Y3JlYXRlRGV2aWNlKGNhbWVyYUlkKTsKICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1EZXZpY2UgPT0gMCwgIkRldmljZSBzaG91bGQgbmV2ZXIgYmUgTlVMTCBoZXJlLiIpOwogfQpAQCAtMTA5LDExICsxMTQsMTIgQEAKIAogICAgIFRDbGllbnRCYXNlOjptRGVzdHJ1Y3Rpb25TdGFydGVkID0gdHJ1ZTsKIAotICAgIFRDbGllbnRCYXNlOjpmaW5pc2hDYW1lcmFPcHMoKTsKLQogICAgIGRpc2Nvbm5lY3QoKTsKIAotICAgIEFMT0dJKCJDbG9zZWQgQ2FtZXJhICVkIiwgVENsaWVudEJhc2U6Om1DYW1lcmFJZCk7CisgICAgQUxPR0koIkNsb3NlZCBDYW1lcmEgJWQuIENsaWVudCB3YXM6ICVzIChQSUQgJWQsIFVJRCAldSkiLAorICAgICAgICAgICAgVENsaWVudEJhc2U6Om1DYW1lcmFJZCwKKyAgICAgICAgICAgIFN0cmluZzgoVENsaWVudEJhc2U6Om1DbGllbnRQYWNrYWdlTmFtZSkuc3RyaW5nKCksCisgICAgICAgICAgICBtSW5pdGlhbENsaWVudFBpZCwgVENsaWVudEJhc2U6Om1DbGllbnRVaWQpOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVENsaWVudEJhc2U+CkBAIC0yMTksMTAgKzIyNSwxMSBAQAogLyoqIERldmljZS1yZWxhdGVkIG1ldGhvZHMgKi8KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFRDbGllbnRCYXNlPgotdm9pZCBDYW1lcmEyQ2xpZW50QmFzZTxUQ2xpZW50QmFzZT46Om5vdGlmeUVycm9yKGludCBlcnJvckNvZGUsIGludCBhcmcxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcmcyKSB7Ci0gICAgQUxPR0UoIkVycm9yIGNvbmRpdGlvbiAlZCByZXBvcnRlZCBieSBIQUwsIGFyZ3VtZW50cyAlZCwgJWQiLCBlcnJvckNvZGUsCi0gICAgICAgICAgYXJnMSwgYXJnMik7Cit2b2lkIENhbWVyYTJDbGllbnRCYXNlPFRDbGllbnRCYXNlPjo6bm90aWZ5RXJyb3IoCisgICAgICAgIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkNhbWVyYUVycm9yQ29kZSBlcnJvckNvZGUsCisgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgeworICAgIEFMT0dFKCJFcnJvciBjb25kaXRpb24gJWQgcmVwb3J0ZWQgYnkgSEFMLCByZXF1ZXN0SWQgJSIgUFJJZDMyLCBlcnJvckNvZGUsCisgICAgICAgICAgcmVzdWx0RXh0cmFzLnJlcXVlc3RJZCk7CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUQ2xpZW50QmFzZT4KQEAgLTIzMSwxMyArMjM4LDEzIEBACiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUQ2xpZW50QmFzZT4KLXZvaWQgQ2FtZXJhMkNsaWVudEJhc2U8VENsaWVudEJhc2U+Ojpub3RpZnlTaHV0dGVyKGludCByZXF1ZXN0SWQsCit2b2lkIENhbWVyYTJDbGllbnRCYXNlPFRDbGllbnRCYXNlPjo6bm90aWZ5U2h1dHRlcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCkgewotICAgICh2b2lkKXJlcXVlc3RJZDsKKyAgICAodm9pZClyZXN1bHRFeHRyYXM7CiAgICAgKHZvaWQpdGltZXN0YW1wOwogCi0gICAgQUxPR1YoIiVzOiBTaHV0dGVyIG5vdGlmaWNhdGlvbiBmb3IgcmVxdWVzdCBpZCAlZCBhdCB0aW1lICVsbGQiLAotICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXF1ZXN0SWQsIHRpbWVzdGFtcCk7CisgICAgQUxPR1YoIiVzOiBTaHV0dGVyIG5vdGlmaWNhdGlvbiBmb3IgcmVxdWVzdCBpZCAlIiBQUklkMzIgIiBhdCB0aW1lICUiIFBSSWQ2NCwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVzdWx0RXh0cmFzLnJlcXVlc3RJZCwgdGltZXN0YW1wKTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFRDbGllbnRCYXNlPgpAQCAtMjc3LDYgKzI4NCwxMSBAQAogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVENsaWVudEJhc2U+CitpbnQgQ2FtZXJhMkNsaWVudEJhc2U8VENsaWVudEJhc2U+OjpnZXRDYW1lcmFEZXZpY2VWZXJzaW9uKCkgY29uc3QgeworICAgIHJldHVybiBtRGV2aWNlVmVyc2lvbjsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFRDbGllbnRCYXNlPgogY29uc3Qgc3A8Q2FtZXJhRGV2aWNlQmFzZT4mIENhbWVyYTJDbGllbnRCYXNlPFRDbGllbnRCYXNlPjo6Z2V0Q2FtZXJhRGV2aWNlKCkgewogICAgIHJldHVybiBtRGV2aWNlOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaAppbmRleCBjMTI3OTNhLi5jZWJiOWE3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQTJDTElFTlRfQkFTRV9ICiAKICNpbmNsdWRlICJjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oIgorI2luY2x1ZGUgImNhbWVyYS9DYXB0dXJlUmVzdWx0LmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNjEsOSArNjIsMTEgQEAKICAgICAgKiBDYW1lcmFEZXZpY2VCYXNlOjpOb3RpZmljYXRpb25MaXN0ZW5lciBpbXBsZW1lbnRhdGlvbgogICAgICAqLwogCi0gICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeUVycm9yKGludCBlcnJvckNvZGUsIGludCBhcmcxLCBpbnQgYXJnMik7CisgICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeUVycm9yKElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkNhbWVyYUVycm9yQ29kZSBlcnJvckNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcyk7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeUlkbGUoKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgbm90aWZ5U2h1dHRlcihpbnQgcmVxdWVzdElkLCBuc2Vjc190IHRpbWVzdGFtcCk7CisgICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeVNodXR0ZXIoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKTsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgbm90aWZ5QXV0b0ZvY3VzKHVpbnQ4X3QgbmV3U3RhdGUsIGludCB0cmlnZ2VySWQpOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBub3RpZnlBdXRvRXhwb3N1cmUodWludDhfdCBuZXdTdGF0ZSwgaW50IHRyaWdnZXJJZCk7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeUF1dG9XaGl0ZWJhbGFuY2UodWludDhfdCBuZXdTdGF0ZSwKQEAgLTczLDYgKzc2LDcgQEAKICAgICBpbnQgICAgICAgICAgICAgICAgICAgZ2V0Q2FtZXJhSWQoKSBjb25zdDsKICAgICBjb25zdCBzcDxDYW1lcmFEZXZpY2VCYXNlPiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2FtZXJhRGV2aWNlKCk7CisgICAgaW50ICAgICAgICAgICAgICAgICAgIGdldENhbWVyYURldmljZVZlcnNpb24oKSBjb25zdDsKICAgICBjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2FtZXJhU2VydmljZSgpOwogCkBAIC0xMDMsNiArMTA3LDkgQEAKIAogcHJvdGVjdGVkOgogCisgICAgLy8gVGhlIFBJRCBwcm92aWRlZCBpbiB0aGUgY29uc3RydWN0b3IgY2FsbAorICAgIHBpZF90IG1Jbml0aWFsQ2xpZW50UGlkOworCiAgICAgdmlydHVhbCBzcDxJQmluZGVyPiBhc0JpbmRlcldyYXBwZXIoKSB7CiAgICAgICAgIHJldHVybiBJSW50ZXJmYWNlOjphc0JpbmRlcigpOwogICAgIH0KQEAgLTExOSw2ICsxMjYsNyBAQAogCiAgICAgLyoqIENhbWVyYURldmljZUJhc2UgaW5zdGFuY2Ugd3JhcHBpbmcgSEFMMisgZW50cnkgKi8KIAorICAgIGNvbnN0IGludCBtRGV2aWNlVmVyc2lvbjsKICAgICBzcDxDYW1lcmFEZXZpY2VCYXNlPiAgbURldmljZTsKIAogICAgIC8qKiBVdGlsaXR5IG1lbWJlcnMgKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oCmluZGV4IGU4MGFiZjEuLmQyNmUyMGMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYURldmljZUJhc2UuaApAQCAtMjIsOSArMjIsMTMgQEAKICNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KIAorI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KICNpbmNsdWRlICJoYXJkd2FyZS9jYW1lcmEyLmgiCisjaW5jbHVkZSAiaGFyZHdhcmUvY2FtZXJhMy5oIgogI2luY2x1ZGUgImNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oIgorI2luY2x1ZGUgImNhbWVyYS9DYXB0dXJlUmVzdWx0LmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDQsNyArNDgsNyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZShjYW1lcmFfbW9kdWxlX3QgKm1vZHVsZSkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGlzY29ubmVjdCgpID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBUaGUgZGV2aWNlJ3Mgc3RhdGljIGNoYXJhY3RlcmlzdGljcyBtZXRhZGF0YSBidWZmZXIKQEAgLTU0LDE5ICs1OCwzNyBAQAogICAgIC8qKgogICAgICAqIFN1Ym1pdCByZXF1ZXN0IGZvciBjYXB0dXJlLiBUaGUgQ2FtZXJhRGV2aWNlIHRha2VzIG93bmVyc2hpcCBvZiB0aGUKICAgICAgKiBwYXNzZWQtaW4gYnVmZmVyLgorICAgICAqIE91dHB1dCBsYXN0RnJhbWVOdW1iZXIgaXMgdGhlIGV4cGVjdGVkIGZyYW1lIG51bWJlciBvZiB0aGlzIHJlcXVlc3QuCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjYXB0dXJlKENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjYXB0dXJlKENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0LCBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTdWJtaXQgYSBsaXN0IG9mIHJlcXVlc3RzLgorICAgICAqIE91dHB1dCBsYXN0RnJhbWVOdW1iZXIgaXMgdGhlIGV4cGVjdGVkIGxhc3QgZnJhbWUgbnVtYmVyIG9mIHRoZSBsaXN0IG9mIHJlcXVlc3RzLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FwdHVyZUxpc3QoY29uc3QgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gJnJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCkgPSAwOwogCiAgICAgLyoqCiAgICAgICogU3VibWl0IHJlcXVlc3QgZm9yIHN0cmVhbWluZy4gVGhlIENhbWVyYURldmljZSBtYWtlcyBhIGNvcHkgb2YgdGhlCiAgICAgICogcGFzc2VkLWluIGJ1ZmZlciBhbmQgdGhlIGNhbGxlciByZXRhaW5zIG93bmVyc2hpcC4KKyAgICAgKiBPdXRwdXQgbGFzdEZyYW1lTnVtYmVyIGlzIHRoZSBsYXN0IGZyYW1lIG51bWJlciBvZiB0aGUgcHJldmlvdXMgc3RyZWFtaW5nIHJlcXVlc3QuCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1pbmdSZXF1ZXN0KGNvbnN0IENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1pbmdSZXF1ZXN0KGNvbnN0IENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTdWJtaXQgYSBsaXN0IG9mIHJlcXVlc3RzIGZvciBzdHJlYW1pbmcuCisgICAgICogT3V0cHV0IGxhc3RGcmFtZU51bWJlciBpcyB0aGUgbGFzdCBmcmFtZSBudW1iZXIgb2YgdGhlIHByZXZpb3VzIHN0cmVhbWluZyByZXF1ZXN0LgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtaW5nUmVxdWVzdExpc3QoY29uc3QgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gJnJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCkgPSAwOwogCiAgICAgLyoqCiAgICAgICogQ2xlYXIgdGhlIHN0cmVhbWluZyByZXF1ZXN0IHNsb3QuCisgICAgICogT3V0cHV0IGxhc3RGcmFtZU51bWJlciBpcyB0aGUgbGFzdCBmcmFtZSBudW1iZXIgb2YgdGhlIHByZXZpb3VzIHN0cmVhbWluZyByZXF1ZXN0LgogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xlYXJTdHJlYW1pbmdSZXF1ZXN0KCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xlYXJTdHJlYW1pbmdSZXF1ZXN0KGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpID0gMDsKIAogICAgIC8qKgogICAgICAqIFdhaXQgdW50aWwgYSByZXF1ZXN0IHdpdGggdGhlIGdpdmVuIElEIGhhcyBiZWVuIGRlcXVldWVkIGJ5IHRoZQpAQCAtODcsOCArMTA5LDcgQEAKICAgICAgKiBvdGhlciBmb3JtYXRzLCB0aGUgc2l6ZSBwYXJhbWV0ZXIgaXMgaWdub3JlZC4KICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVN0cmVhbShzcDxBTmF0aXZlV2luZG93PiBjb25zdW1lciwKLSAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgaW50ICppZCkgPSAwOworICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwgaW50ICppZCkgPSAwOwogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGFuIGlucHV0IHJlcHJvY2VzcyBzdHJlYW0gdGhhdCB1c2VzIGJ1ZmZlcnMgZnJvbSBhbiBleGlzdGluZwpAQCAtMTIwLDYgKzE0MSwxOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVsZXRlUmVwcm9jZXNzU3RyZWFtKGludCBpZCkgPSAwOwogCiAgICAgLyoqCisgICAgICogVGFrZSB0aGUgY3VycmVudGx5LWRlZmluZWQgc2V0IG9mIHN0cmVhbXMgYW5kIGNvbmZpZ3VyZSB0aGUgSEFMIHRvIHVzZQorICAgICAqIHRoZW0uIFRoaXMgaXMgYSBsb25nLXJ1bm5pbmcgb3BlcmF0aW9uIChtYXkgYmUgc2V2ZXJhbCBodW5kZXJlZCBtcykuCisgICAgICoKKyAgICAgKiBUaGUgZGV2aWNlIG11c3QgYmUgaWRsZSAoc2VlIHdhaXRVbnRpbERyYWluZWQpIGJlZm9yZSBjYWxsaW5nIHRoaXMuCisgICAgICoKKyAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3M7IG90aGVyd2lzZSBvbiBlcnJvcjoKKyAgICAgKiAtIEJBRF9WQUxVRSBpZiB0aGUgc2V0IG9mIHN0cmVhbXMgd2FzIGludmFsaWQgKGUuZy4gZm10cyBvciBzaXplcykKKyAgICAgKiAtIElOVkFMSURfT1BFUkFUSU9OIGlmIHRoZSBkZXZpY2Ugd2FzIGluIHRoZSB3cm9uZyBzdGF0ZQorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlU3RyZWFtcygpID0gMDsKKworICAgIC8qKgogICAgICAqIENyZWF0ZSBhIG1ldGFkYXRhIGJ1ZmZlciB3aXRoIGZpZWxkcyB0aGF0IHRoZSBIQUwgZGV2aWNlIGJlbGlldmVzIGFyZQogICAgICAqIGJlc3QgZm9yIHRoZSBnaXZlbiB1c2UgY2FzZQogICAgICAqLwpAQCAtMTM0LDYgKzE2NywxMiBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgd2FpdFVudGlsRHJhaW5lZCgpID0gMDsKIAogICAgIC8qKgorICAgICAqIEdldCBKcGVnIGJ1ZmZlciBzaXplIGZvciBhIGdpdmVuIGpwZWcgcmVzb2x1dGlvbi4KKyAgICAgKiBOZWdhdGl2ZSB2YWx1ZXMgYXJlIGVycm9yIGNvZGVzLgorICAgICAqLworICAgIHZpcnR1YWwgc3NpemVfdCBnZXRKcGVnQnVmZmVyU2l6ZSh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSBjb25zdCA9IDA7CisKKyAgICAvKioKICAgICAgKiBBYnN0cmFjdCBjbGFzcyBmb3IgSEFMIG5vdGlmaWNhdGlvbiBsaXN0ZW5lcnMKICAgICAgKi8KICAgICBjbGFzcyBOb3RpZmljYXRpb25MaXN0ZW5lciB7CkBAIC0xNDIsMTEgKzE4MSwxMiBAQAogICAgICAgICAvLyBBUEkxIGFuZCBBUEkyLgogCiAgICAgICAgIC8vIFJlcXVpcmVkIGZvciBBUEkgMSBhbmQgMgotICAgICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5RXJyb3IoaW50IGVycm9yQ29kZSwgaW50IGFyZzEsIGludCBhcmcyKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBub3RpZnlFcnJvcihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpDYW1lcmFFcnJvckNvZGUgZXJyb3JDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyAmcmVzdWx0RXh0cmFzKSA9IDA7CiAKICAgICAgICAgLy8gUmVxdWlyZWQgb25seSBmb3IgQVBJMgogICAgICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5SWRsZSgpID0gMDsKLSAgICAgICAgdmlydHVhbCB2b2lkIG5vdGlmeVNodXR0ZXIoaW50IHJlcXVlc3RJZCwKKyAgICAgICAgdmlydHVhbCB2b2lkIG5vdGlmeVNodXR0ZXIoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyAmcmVzdWx0RXh0cmFzLAogICAgICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKSA9IDA7CiAKICAgICAgICAgLy8gUmVxdWlyZWQgb25seSBmb3IgQVBJMQpAQCAtMTc5LDExICsyMTksMTIgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHdhaXRGb3JOZXh0RnJhbWUobnNlY3NfdCB0aW1lb3V0KSA9IDA7CiAKICAgICAvKioKLSAgICAgKiBHZXQgbmV4dCBtZXRhZGF0YSBmcmFtZSBmcm9tIHRoZSBmcmFtZSBxdWV1ZS4gUmV0dXJucyBOVUxMIGlmIHRoZSBxdWV1ZQotICAgICAqIGlzIGVtcHR5OyBjYWxsZXIgdGFrZXMgb3duZXJzaGlwIG9mIHRoZSBtZXRhZGF0YSBidWZmZXIuCi0gICAgICogTWF5IGJlIGNhbGxlZCBjb25jdXJyZW50bHkgdG8gbW9zdCBtZXRob2RzLCBleGNlcHQgZm9yIHdhaXRGb3JOZXh0RnJhbWUKKyAgICAgKiBHZXQgbmV4dCBjYXB0dXJlIHJlc3VsdCBmcmFtZSBmcm9tIHRoZSByZXN1bHQgcXVldWUuIFJldHVybnMgTk9UX0VOT1VHSF9EQVRBCisgICAgICogaWYgdGhlIHF1ZXVlIGlzIGVtcHR5OyBjYWxsZXIgdGFrZXMgb3duZXJzaGlwIG9mIHRoZSBtZXRhZGF0YSBidWZmZXIgaW5zaWRlCisgICAgICogdGhlIGNhcHR1cmUgcmVzdWx0IG9iamVjdCdzIG1ldGFkYXRhIGZpZWxkLgorICAgICAqIE1heSBiZSBjYWxsZWQgY29uY3VycmVudGx5IHRvIG1vc3QgbWV0aG9kcywgZXhjZXB0IGZvciB3YWl0Rm9yTmV4dEZyYW1lLgogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dEZyYW1lKENhbWVyYU1ldGFkYXRhICpmcmFtZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dFJlc3VsdChDYXB0dXJlUmVzdWx0ICpmcmFtZSkgPSAwOwogCiAgICAgLyoqCiAgICAgICogVHJpZ2dlciBhdXRvLWZvY3VzLiBUaGUgbGF0ZXN0IElEIHVzZWQgaW4gYSB0cmlnZ2VyIGF1dG9mb2N1cyBvciBjYW5jZWwKQEAgLTIyNCw5ICsyNjUsMTQgQEAKICAgICAvKioKICAgICAgKiBGbHVzaCBhbGwgcGVuZGluZyBhbmQgaW4tZmxpZ2h0IHJlcXVlc3RzLiBCbG9ja3MgdW50aWwgZmx1c2ggaXMKICAgICAgKiBjb21wbGV0ZS4KKyAgICAgKiBPdXRwdXQgbGFzdEZyYW1lTnVtYmVyIGlzIHRoZSBsYXN0IGZyYW1lIG51bWJlciBvZiB0aGUgcHJldmlvdXMgc3RyZWFtaW5nIHJlcXVlc3QuCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaCgpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpID0gMDsKIAorICAgIC8qKgorICAgICAqIEdldCB0aGUgSEFMIGRldmljZSB2ZXJzaW9uLgorICAgICAqLworICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0RGV2aWNlVmVyc2lvbigpID0gMDsKIH07CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vRnJhbWVQcm9jZXNzb3JCYXNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuY3BwCmluZGV4IGYyMDY0ZmIuLjI5ZWI3OGYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuY3BwCkBAIC0yOSw3ICsyOSwxNyBAQAogCiBGcmFtZVByb2Nlc3NvckJhc2U6OkZyYW1lUHJvY2Vzc29yQmFzZSh3cDxDYW1lcmFEZXZpY2VCYXNlPiBkZXZpY2UpIDoKICAgICBUaHJlYWQoLypjYW5DYWxsSmF2YSovZmFsc2UpLAotICAgIG1EZXZpY2UoZGV2aWNlKSB7CisgICAgbURldmljZShkZXZpY2UpLAorICAgIG1OdW1QYXJ0aWFsUmVzdWx0cygxKSB7CisgICAgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gY2FtZXJhRGV2aWNlID0gZGV2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoY2FtZXJhRGV2aWNlICE9IDAgJiYKKyAgICAgICAgICAgIGNhbWVyYURldmljZS0+Z2V0RGV2aWNlVmVyc2lvbigpID49IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yKSB7CisgICAgICAgIENhbWVyYU1ldGFkYXRhIHN0YXRpY0luZm8gPSBjYW1lcmFEZXZpY2UtPmluZm8oKTsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgZW50cnkgPSBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9SRVFVRVNUX1BBUlRJQUxfUkVTVUxUX0NPVU5UKTsKKyAgICAgICAgaWYgKGVudHJ5LmNvdW50ID4gMCkgeworICAgICAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzID0gZW50cnkuZGF0YS5pMzJbMF07CisgICAgICAgIH0KKyAgICB9CiB9CiAKIEZyYW1lUHJvY2Vzc29yQmFzZTo6fkZyYW1lUHJvY2Vzc29yQmFzZSgpIHsKQEAgLTM3LDExICs0NywyMyBAQAogfQogCiBzdGF0dXNfdCBGcmFtZVByb2Nlc3NvckJhc2U6OnJlZ2lzdGVyTGlzdGVuZXIoaW50MzJfdCBtaW5JZCwKLSAgICAgICAgaW50MzJfdCBtYXhJZCwgd3A8RmlsdGVyZWRMaXN0ZW5lcj4gbGlzdGVuZXIsIGJvb2wgcXVpcmtTZW5kUGFydGlhbHMpIHsKKyAgICAgICAgaW50MzJfdCBtYXhJZCwgd3A8RmlsdGVyZWRMaXN0ZW5lcj4gbGlzdGVuZXIsIGJvb2wgc2VuZFBhcnRpYWxzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUlucHV0TXV0ZXgpOworICAgIExpc3Q8UmFuZ2VMaXN0ZW5lcj46Oml0ZXJhdG9yIGl0ZW0gPSBtUmFuZ2VMaXN0ZW5lcnMuYmVnaW4oKTsKKyAgICB3aGlsZSAoaXRlbSAhPSBtUmFuZ2VMaXN0ZW5lcnMuZW5kKCkpIHsKKyAgICAgICAgaWYgKGl0ZW0tPm1pbklkID09IG1pbklkICYmCisgICAgICAgICAgICAgICAgaXRlbS0+bWF4SWQgPT0gbWF4SWQgJiYKKyAgICAgICAgICAgICAgICBpdGVtLT5saXN0ZW5lciA9PSBsaXN0ZW5lcikgeworICAgICAgICAgICAgLy8gYWxyZWFkeSByZWdpc3RlcmVkLCBqdXN0IHJldHVybgorICAgICAgICAgICAgQUxPR1YoIiVzOiBBdHRlbXB0IHRvIHJlZ2lzdGVyIHRoZSBzYW1lIGNsaWVudCB0d2ljZSwgaWdub3JpbmciLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgICAgIGl0ZW0rKzsKKyAgICB9CiAgICAgQUxPR1YoIiVzOiBSZWdpc3RlcmluZyBsaXN0ZW5lciBmb3IgZnJhbWUgaWQgcmFuZ2UgJWQgLSAlZCIsCiAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1pbklkLCBtYXhJZCk7Ci0gICAgUmFuZ2VMaXN0ZW5lciByTGlzdGVuZXIgPSB7IG1pbklkLCBtYXhJZCwgbGlzdGVuZXIsIHF1aXJrU2VuZFBhcnRpYWxzIH07CisgICAgUmFuZ2VMaXN0ZW5lciByTGlzdGVuZXIgPSB7IG1pbklkLCBtYXhJZCwgbGlzdGVuZXIsIHNlbmRQYXJ0aWFscyB9OwogICAgIG1SYW5nZUxpc3RlbmVycy5wdXNoX2JhY2sockxpc3RlbmVyKTsKICAgICByZXR1cm4gT0s7CiB9CkBAIC05OSwxNSArMTIxLDE3IEBACiB2b2lkIEZyYW1lUHJvY2Vzc29yQmFzZTo6cHJvY2Vzc05ld0ZyYW1lcyhjb25zdCBzcDxDYW1lcmFEZXZpY2VCYXNlPiAmZGV2aWNlKSB7CiAgICAgc3RhdHVzX3QgcmVzOwogICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgQ2FtZXJhTWV0YWRhdGEgZnJhbWU7CisgICAgQ2FwdHVyZVJlc3VsdCByZXN1bHQ7CiAKICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogUHJvY2VzcyBuZXcgZnJhbWVzIiwgX19GVU5DVElPTl9fLCBkZXZpY2UtPmdldElkKCkpOwogCi0gICAgd2hpbGUgKCAocmVzID0gZGV2aWNlLT5nZXROZXh0RnJhbWUoJmZyYW1lKSkgPT0gT0spIHsKKyAgICB3aGlsZSAoIChyZXMgPSBkZXZpY2UtPmdldE5leHRSZXN1bHQoJnJlc3VsdCkpID09IE9LKSB7CiAKKyAgICAgICAgLy8gVE9ETzogaW5zdGVhZCBvZiBnZXR0aW5nIGZyYW1lIG51bWJlciBmcm9tIG1ldGFkYXRhLCB3ZSBzaG91bGQgcmVhZAorICAgICAgICAvLyB0aGlzIGZyb20gcmVzdWx0Lm1SZXN1bHRFeHRyYXMgd2hlbiBDYW1lcmFEZXZpY2VCYXNlIGludGVyZmFjZSBpcyBmaXhlZC4KICAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgZW50cnk7CiAKLSAgICAgICAgZW50cnkgPSBmcmFtZS5maW5kKEFORFJPSURfUkVRVUVTVF9GUkFNRV9DT1VOVCk7CisgICAgICAgIGVudHJ5ID0gcmVzdWx0Lm1NZXRhZGF0YS5maW5kKEFORFJPSURfUkVRVUVTVF9GUkFNRV9DT1VOVCk7CiAgICAgICAgIGlmIChlbnRyeS5jb3VudCA9PSAwKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogRXJyb3IgcmVhZGluZyBmcmFtZSBudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRldmljZS0+Z2V0SWQoKSk7CkBAIC0xMTUsMTMgKzEzOSwxMyBAQAogICAgICAgICB9CiAgICAgICAgIEFUUkFDRV9JTlQoImNhbTJfZnJhbWUiLCBlbnRyeS5kYXRhLmkzMlswXSk7CiAKLSAgICAgICAgaWYgKCFwcm9jZXNzU2luZ2xlRnJhbWUoZnJhbWUsIGRldmljZSkpIHsKKyAgICAgICAgaWYgKCFwcm9jZXNzU2luZ2xlRnJhbWUocmVzdWx0LCBkZXZpY2UpKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghZnJhbWUuaXNFbXB0eSgpKSB7CisgICAgICAgIGlmICghcmVzdWx0Lm1NZXRhZGF0YS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtTGFzdEZyYW1lTXV0ZXgpOwotICAgICAgICAgICAgbUxhc3RGcmFtZS5hY3F1aXJlKGZyYW1lKTsKKyAgICAgICAgICAgIG1MYXN0RnJhbWUuYWNxdWlyZShyZXN1bHQubU1ldGFkYXRhKTsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAocmVzICE9IE5PVF9FTk9VR0hfREFUQSkgewpAQCAtMTMzLDMyICsxNTcsNDAgQEAKICAgICByZXR1cm47CiB9CiAKLWJvb2wgRnJhbWVQcm9jZXNzb3JCYXNlOjpwcm9jZXNzU2luZ2xlRnJhbWUoQ2FtZXJhTWV0YWRhdGEgJmZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPENhbWVyYURldmljZUJhc2U+ICZkZXZpY2UpIHsKK2Jvb2wgRnJhbWVQcm9jZXNzb3JCYXNlOjpwcm9jZXNzU2luZ2xlRnJhbWUoQ2FwdHVyZVJlc3VsdCAmcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxDYW1lcmFEZXZpY2VCYXNlPiAmZGV2aWNlKSB7CiAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IFByb2Nlc3Mgc2luZ2xlIGZyYW1lIChpcyBlbXB0eT8gJWQpIiwKLSAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRldmljZS0+Z2V0SWQoKSwgZnJhbWUuaXNFbXB0eSgpKTsKLSAgICByZXR1cm4gcHJvY2Vzc0xpc3RlbmVycyhmcmFtZSwgZGV2aWNlKSA9PSBPSzsKKyAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRldmljZS0+Z2V0SWQoKSwgcmVzdWx0Lm1NZXRhZGF0YS5pc0VtcHR5KCkpOworICAgIHJldHVybiBwcm9jZXNzTGlzdGVuZXJzKHJlc3VsdCwgZGV2aWNlKSA9PSBPSzsKIH0KIAotc3RhdHVzX3QgRnJhbWVQcm9jZXNzb3JCYXNlOjpwcm9jZXNzTGlzdGVuZXJzKGNvbnN0IENhbWVyYU1ldGFkYXRhICZmcmFtZSwKK3N0YXR1c190IEZyYW1lUHJvY2Vzc29yQmFzZTo6cHJvY2Vzc0xpc3RlbmVycyhjb25zdCBDYXB0dXJlUmVzdWx0ICZyZXN1bHQsCiAgICAgICAgIGNvbnN0IHNwPENhbWVyYURldmljZUJhc2U+ICZkZXZpY2UpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOworCiAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZW50cnk7CiAKLSAgICAvLyBRdWlya3M6IERvbid0IGRlbGl2ZXIgcGFydGlhbCByZXN1bHRzIHRvIGxpc3RlbmVycyB0aGF0IGRvbid0IHdhbnQgdGhlbQotICAgIGJvb2wgcXVpcmtJc1BhcnRpYWwgPSBmYWxzZTsKLSAgICBlbnRyeSA9IGZyYW1lLmZpbmQoQU5EUk9JRF9RVUlSS1NfUEFSVElBTF9SRVNVTFQpOwotICAgIGlmIChlbnRyeS5jb3VudCAhPSAwICYmCi0gICAgICAgICAgICBlbnRyeS5kYXRhLnU4WzBdID09IEFORFJPSURfUVVJUktTX1BBUlRJQUxfUkVTVUxUX1BBUlRJQUwpIHsKLSAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IE5vdCBmb3J3YXJkaW5nIHBhcnRpYWwgcmVzdWx0IHRvIGxpc3RlbmVycyIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZXZpY2UtPmdldElkKCkpOwotICAgICAgICBxdWlya0lzUGFydGlhbCA9IHRydWU7CisgICAgLy8gQ2hlY2sgaWYgdGhpcyByZXN1bHQgaXMgcGFydGlhbC4KKyAgICBib29sIGlzUGFydGlhbFJlc3VsdCA9IGZhbHNlOworICAgIGlmIChkZXZpY2UtPmdldERldmljZVZlcnNpb24oKSA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgeworICAgICAgICBpc1BhcnRpYWxSZXN1bHQgPSByZXN1bHQubVJlc3VsdEV4dHJhcy5wYXJ0aWFsUmVzdWx0Q291bnQgPCBtTnVtUGFydGlhbFJlc3VsdHM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZW50cnkgPSByZXN1bHQubU1ldGFkYXRhLmZpbmQoQU5EUk9JRF9RVUlSS1NfUEFSVElBTF9SRVNVTFQpOworICAgICAgICBpZiAoZW50cnkuY291bnQgIT0gMCAmJgorICAgICAgICAgICAgICAgIGVudHJ5LmRhdGEudThbMF0gPT0gQU5EUk9JRF9RVUlSS1NfUEFSVElBTF9SRVNVTFRfUEFSVElBTCkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IFRoaXMgaXMgYSBwYXJ0aWFsIHJlc3VsdCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGV2aWNlLT5nZXRJZCgpKTsKKyAgICAgICAgICAgIGlzUGFydGlhbFJlc3VsdCA9IHRydWU7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBlbnRyeSA9IGZyYW1lLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0lEKTsKKyAgICAvLyBUT0RPOiBpbnN0ZWFkIG9mIGdldHRpbmcgcmVxdWVzdElEIGZyb20gQ2FtZXJhTWV0YWRhdGEsIHdlIHNob3VsZCBnZXQgaXQKKyAgICAvLyBmcm9tIENhcHR1cmVSZXN1bHRFeHRyYXMuIFRoaXMgd2lsbCByZXF1aXJlIGNoYW5naW5nIENhbWVyYTJEZXZpY2UuCisgICAgLy8gQ3VycmVudGx5IENhbWVyYTJEZXZpY2UgdXNlcyBNZXRhZGF0YVF1ZXVlIHRvIHN0b3JlIHJlc3VsdHMsIHdoaWNoIGRvZXMgbm90CisgICAgLy8gaW5jbHVkZSBDYXB0dXJlUmVzdWx0RXh0cmFzLgorICAgIGVudHJ5ID0gcmVzdWx0Lm1NZXRhZGF0YS5maW5kKEFORFJPSURfUkVRVUVTVF9JRCk7CiAgICAgaWYgKGVudHJ5LmNvdW50ID09IDApIHsKLSAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IEVycm9yIHJlYWRpbmcgZnJhbWUgaWQiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGV2aWNlLT5nZXRJZCgpKTsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IEVycm9yIHJlYWRpbmcgZnJhbWUgaWQiLCBfX0ZVTkNUSU9OX18sIGRldmljZS0+Z2V0SWQoKSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIGludDMyX3QgcmVxdWVzdElkID0gZW50cnkuZGF0YS5pMzJbMF07CkBAIC0xNjgsMTAgKzIwMCwxMCBAQAogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5wdXRNdXRleCk7CiAKICAgICAgICAgTGlzdDxSYW5nZUxpc3RlbmVyPjo6aXRlcmF0b3IgaXRlbSA9IG1SYW5nZUxpc3RlbmVycy5iZWdpbigpOworICAgICAgICAvLyBEb24ndCBkZWxpdmVyIHBhcnRpYWwgcmVzdWx0cyB0byBsaXN0ZW5lcnMgdGhhdCBkb24ndCB3YW50IHRoZW0KICAgICAgICAgd2hpbGUgKGl0ZW0gIT0gbVJhbmdlTGlzdGVuZXJzLmVuZCgpKSB7Ci0gICAgICAgICAgICBpZiAocmVxdWVzdElkID49IGl0ZW0tPm1pbklkICYmCi0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCA8IGl0ZW0tPm1heElkICYmCi0gICAgICAgICAgICAgICAgICAgICghcXVpcmtJc1BhcnRpYWwgfHwgaXRlbS0+cXVpcmtTZW5kUGFydGlhbHMpICkgeworICAgICAgICAgICAgaWYgKHJlcXVlc3RJZCA+PSBpdGVtLT5taW5JZCAmJiByZXF1ZXN0SWQgPCBpdGVtLT5tYXhJZCAmJgorICAgICAgICAgICAgICAgICAgICAoIWlzUGFydGlhbFJlc3VsdCB8fCBpdGVtLT5zZW5kUGFydGlhbHMpKSB7CiAgICAgICAgICAgICAgICAgc3A8RmlsdGVyZWRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBpdGVtLT5saXN0ZW5lci5wcm9tb3RlKCk7CiAgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgaXRlbSA9IG1SYW5nZUxpc3RlbmVycy5lcmFzZShpdGVtKTsKQEAgLTE4MywxMCArMjE1LDEyIEBACiAgICAgICAgICAgICBpdGVtKys7CiAgICAgICAgIH0KICAgICB9Ci0gICAgQUxPR1YoIkdvdCAlZCByYW5nZSBsaXN0ZW5lcnMgb3V0IG9mICVkIiwgbGlzdGVuZXJzLnNpemUoKSwgbVJhbmdlTGlzdGVuZXJzLnNpemUoKSk7CisgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IEdvdCAlenUgcmFuZ2UgbGlzdGVuZXJzIG91dCBvZiAlenUiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgZGV2aWNlLT5nZXRJZCgpLCBsaXN0ZW5lcnMuc2l6ZSgpLCBtUmFuZ2VMaXN0ZW5lcnMuc2l6ZSgpKTsKKwogICAgIExpc3Q8c3A8RmlsdGVyZWRMaXN0ZW5lcj4gPjo6aXRlcmF0b3IgaXRlbSA9IGxpc3RlbmVycy5iZWdpbigpOwogICAgIGZvciAoOyBpdGVtICE9IGxpc3RlbmVycy5lbmQoKTsgaXRlbSsrKSB7Ci0gICAgICAgICgqaXRlbSktPm9uRnJhbWVBdmFpbGFibGUocmVxdWVzdElkLCBmcmFtZSk7CisgICAgICAgICgqaXRlbSktPm9uUmVzdWx0QXZhaWxhYmxlKHJlc3VsdCk7CiAgICAgfQogICAgIHJldHVybiBPSzsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuaAppbmRleCA4OWI2MDhhLi5hNjE4ZDg0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vRnJhbWVQcm9jZXNzb3JCYXNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0ZyYW1lUHJvY2Vzc29yQmFzZS5oCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYU1ldGFkYXRhLmg+CisjaW5jbHVkZSA8Y2FtZXJhL0NhcHR1cmVSZXN1bHQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zOSwxNiArNDAsMTYgQEAKICAgICB2aXJ0dWFsIH5GcmFtZVByb2Nlc3NvckJhc2UoKTsKIAogICAgIHN0cnVjdCBGaWx0ZXJlZExpc3RlbmVyOiB2aXJ0dWFsIHB1YmxpYyBSZWZCYXNlIHsKLSAgICAgICAgdmlydHVhbCB2b2lkIG9uRnJhbWVBdmFpbGFibGUoaW50MzJfdCByZXF1ZXN0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhICZmcmFtZSkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgb25SZXN1bHRBdmFpbGFibGUoY29uc3QgQ2FwdHVyZVJlc3VsdCAmcmVzdWx0KSA9IDA7CiAgICAgfTsKIAogICAgIC8vIFJlZ2lzdGVyIGEgbGlzdGVuZXIgZm9yIGEgcmFuZ2Ugb2YgSURzIFttaW5JZCwgbWF4SWQpLiBNdWx0aXBsZSBsaXN0ZW5lcnMKLSAgICAvLyBjYW4gYmUgbGlzdGVuaW5nIHRvIHRoZSBzYW1lIHJhbmdlLgotICAgIC8vIFFVSVJLOiBzZW5kUGFydGlhbHMgY29udHJvbHMgd2hldGhlciBwYXJ0aWFsIHJlc3VsdHMgd2lsbCBiZSBzZW50LgorICAgIC8vIGNhbiBiZSBsaXN0ZW5pbmcgdG8gdGhlIHNhbWUgcmFuZ2UuIFJlZ2lzdGVyaW5nIHRoZSBzYW1lIGxpc3RlbmVyIHdpdGgKKyAgICAvLyB0aGUgc2FtZSByYW5nZSBvZiBJRHMgaGFzIG5vIGVmZmVjdC4KKyAgICAvLyBzZW5kUGFydGlhbHMgY29udHJvbHMgd2hldGhlciBwYXJ0aWFsIHJlc3VsdHMgd2lsbCBiZSBzZW50LgogICAgIHN0YXR1c190IHJlZ2lzdGVyTGlzdGVuZXIoaW50MzJfdCBtaW5JZCwgaW50MzJfdCBtYXhJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdwPEZpbHRlcmVkTGlzdGVuZXI+IGxpc3RlbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBxdWlya1NlbmRQYXJ0aWFscyA9IHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzZW5kUGFydGlhbHMgPSB0cnVlKTsKICAgICBzdGF0dXNfdCByZW1vdmVMaXN0ZW5lcihpbnQzMl90IG1pbklkLCBpbnQzMl90IG1heElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdwPEZpbHRlcmVkTGlzdGVuZXI+IGxpc3RlbmVyKTsKIApAQCAtNjYsMTYgKzY3LDE5IEBACiAgICAgICAgIGludDMyX3QgbWluSWQ7CiAgICAgICAgIGludDMyX3QgbWF4SWQ7CiAgICAgICAgIHdwPEZpbHRlcmVkTGlzdGVuZXI+IGxpc3RlbmVyOwotICAgICAgICBib29sIHF1aXJrU2VuZFBhcnRpYWxzOworICAgICAgICBib29sIHNlbmRQYXJ0aWFsczsKICAgICB9OwogICAgIExpc3Q8UmFuZ2VMaXN0ZW5lcj4gbVJhbmdlTGlzdGVuZXJzOwogCisgICAgLy8gTnVtYmVyIG9mIHBhcnRpYWwgcmVzdWx0IHRoZSBIQUwgd2lsbCBwb3RlbnRpYWxseSBzZW5kLgorICAgIGludDMyX3QgbU51bVBhcnRpYWxSZXN1bHRzOworCiAgICAgdm9pZCBwcm9jZXNzTmV3RnJhbWVzKGNvbnN0IHNwPENhbWVyYURldmljZUJhc2U+ICZkZXZpY2UpOwogCi0gICAgdmlydHVhbCBib29sIHByb2Nlc3NTaW5nbGVGcmFtZShDYW1lcmFNZXRhZGF0YSAmZnJhbWUsCisgICAgdmlydHVhbCBib29sIHByb2Nlc3NTaW5nbGVGcmFtZShDYXB0dXJlUmVzdWx0ICZyZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxDYW1lcmFEZXZpY2VCYXNlPiAmZGV2aWNlKTsKIAotICAgIHN0YXR1c190IHByb2Nlc3NMaXN0ZW5lcnMoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmZyYW1lLAorICAgIHN0YXR1c190IHByb2Nlc3NMaXN0ZW5lcnMoY29uc3QgQ2FwdHVyZVJlc3VsdCAmcmVzdWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gJmRldmljZSk7CiAKICAgICBDYW1lcmFNZXRhZGF0YSBtTGFzdEZyYW1lOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oCmluZGV4IDg3YjI4MDcuLjYzODY4MzggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UxL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmgKQEAgLTkyLDggKzkyLDIyIEBACiAgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZShod19tb2R1bGVfdCAqbW9kdWxlKQogICAgIHsKICAgICAgICAgQUxPR0koIk9wZW5pbmcgY2FtZXJhICVzIiwgbU5hbWUuc3RyaW5nKCkpOwotICAgICAgICBpbnQgcmMgPSBtb2R1bGUtPm1ldGhvZHMtPm9wZW4obW9kdWxlLCBtTmFtZS5zdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChod19kZXZpY2VfdCAqKikmbURldmljZSk7CisgICAgICAgIGNhbWVyYV9tb2R1bGVfdCAqY2FtZXJhTW9kdWxlID0gcmVpbnRlcnByZXRfY2FzdDxjYW1lcmFfbW9kdWxlX3QgKj4obW9kdWxlKTsKKyAgICAgICAgY2FtZXJhX2luZm8gaW5mbzsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gY2FtZXJhTW9kdWxlLT5nZXRfY2FtZXJhX2luZm8oYXRvaShtTmFtZS5zdHJpbmcoKSksICZpbmZvKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKKworICAgICAgICBpbnQgcmMgPSBPSzsKKyAgICAgICAgaWYgKG1vZHVsZS0+bW9kdWxlX2FwaV92ZXJzaW9uID49IENBTUVSQV9NT0RVTEVfQVBJX1ZFUlNJT05fMl8zICYmCisgICAgICAgICAgICBpbmZvLmRldmljZV92ZXJzaW9uID4gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzApIHsKKyAgICAgICAgICAgIC8vIE9wZW4gaGlnaGVyIHZlcnNpb24gY2FtZXJhIGRldmljZSBhcyBIQUwxLjAgZGV2aWNlLgorICAgICAgICAgICAgcmMgPSBjYW1lcmFNb2R1bGUtPm9wZW5fbGVnYWN5KG1vZHVsZSwgbU5hbWUuc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaHdfZGV2aWNlX3QgKiopJm1EZXZpY2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmMgPSBDYW1lcmFTZXJ2aWNlOjpmaWx0ZXJPcGVuRXJyb3JDb2RlKG1vZHVsZS0+bWV0aG9kcy0+b3BlbigKKyAgICAgICAgICAgICAgICBtb2R1bGUsIG1OYW1lLnN0cmluZygpLCAoaHdfZGV2aWNlX3QgKiopJm1EZXZpY2UpKTsKKyAgICAgICAgfQogICAgICAgICBpZiAocmMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCJDb3VsZCBub3Qgb3BlbiBjYW1lcmEgJXM6ICVkIiwgbU5hbWUuc3RyaW5nKCksIHJjKTsKICAgICAgICAgICAgIHJldHVybiByYzsKQEAgLTYxMSw5ICs2MjUsMTQgQEAKICAgICBzdGF0aWMgaW50IF9fc2V0X2J1ZmZlcnNfZ2VvbWV0cnkoc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyogdywKICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmb3JtYXQpCiAgICAgeworICAgICAgICBpbnQgcmM7CiAgICAgICAgIEFOYXRpdmVXaW5kb3cgKmEgPSBhbncodyk7Ci0gICAgICAgIHJldHVybiBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCk7CisKKyAgICAgICAgcmMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2RpbWVuc2lvbnMoYSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIGlmICghcmMpIHsKKyAgICAgICAgICAgIHJjID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19mb3JtYXQoYSwgZm9ybWF0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmM7CiAgICAgfQogCiAgICAgc3RhdGljIGludCBfX3NldF9jcm9wKHN0cnVjdCBwcmV2aWV3X3N0cmVhbV9vcHMgKncsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UyL0NhbWVyYTJEZXZpY2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMi9DYW1lcmEyRGV2aWNlLmNwcAppbmRleCAyYmMxYThhLi44Y2FhZGQ2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UyL0NhbWVyYTJEZXZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTIvQ2FtZXJhMkRldmljZS5jcHAKQEAgLTI1LDEwICsyNSwxMiBAQAogI2RlZmluZSBBTE9HVlYoLi4uKSAoKHZvaWQpMCkKICNlbmRpZgogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgogI2luY2x1ZGUgIkNhbWVyYTJEZXZpY2UuaCIKKyNpbmNsdWRlICJDYW1lcmFTZXJ2aWNlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNjYsOCArNjgsOCBAQAogCiAgICAgY2FtZXJhMl9kZXZpY2VfdCAqZGV2aWNlOwogCi0gICAgcmVzID0gbW9kdWxlLT5jb21tb24ubWV0aG9kcy0+b3BlbigmbW9kdWxlLT5jb21tb24sIG5hbWUsCi0gICAgICAgICAgICByZWludGVycHJldF9jYXN0PGh3X2RldmljZV90Kio+KCZkZXZpY2UpKTsKKyAgICByZXMgPSBDYW1lcmFTZXJ2aWNlOjpmaWx0ZXJPcGVuRXJyb3JDb2RlKG1vZHVsZS0+Y29tbW9uLm1ldGhvZHMtPm9wZW4oCisgICAgICAgICZtb2R1bGUtPmNvbW1vbiwgbmFtZSwgcmVpbnRlcnByZXRfY2FzdDxod19kZXZpY2VfdCoqPigmZGV2aWNlKSkpOwogCiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBvcGVuIGNhbWVyYSAlZDogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKQEAgLTExMSwyMCArMTEzLDYgQEAKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKLSAgICByZXMgPSBkZXZpY2UtPm9wcy0+Z2V0X21ldGFkYXRhX3ZlbmRvcl90YWdfb3BzKGRldmljZSwgJm1WZW5kb3JUYWdPcHMpOwotICAgIGlmIChyZXMgIT0gT0sgKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBVbmFibGUgdG8gcmV0cmlldmUgdGFnIG9wcyBmcm9tIGRldmljZTogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICBkZXZpY2UtPmNvbW1vbi5jbG9zZSgmZGV2aWNlLT5jb21tb24pOwotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLSAgICByZXMgPSBzZXRfY2FtZXJhX21ldGFkYXRhX3ZlbmRvcl90YWdfb3BzKG1WZW5kb3JUYWdPcHMpOwotICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFVuYWJsZSB0byBzZXQgdGFnIG9wczogJXMgKCVkKSIsCi0gICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgIGRldmljZS0+Y29tbW9uLmNsb3NlKCZkZXZpY2UtPmNvbW1vbik7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQogICAgIHJlcyA9IGRldmljZS0+b3BzLT5zZXRfbm90aWZ5X2NhbGxiYWNrKGRldmljZSwgbm90aWZpY2F0aW9uQ2FsbGJhY2ssCiAgICAgICAgICAgICBOVUxMKTsKICAgICBpZiAocmVzICE9IE9LKSB7CkBAIC0xMzYsNiArMTI0LDcgQEAKIAogICAgIG1EZXZpY2VJbmZvID0gaW5mby5zdGF0aWNfY2FtZXJhX2NoYXJhY3RlcmlzdGljczsKICAgICBtSGFsMkRldmljZSA9IGRldmljZTsKKyAgICBtRGV2aWNlVmVyc2lvbiA9IGRldmljZS0+Y29tbW9uLnZlcnNpb247CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0yMTIsNyArMjAxLDcgQEAKICAgICByZXR1cm4gbURldmljZUluZm87CiB9CiAKLXN0YXR1c190IENhbWVyYTJEZXZpY2U6OmNhcHR1cmUoQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QpIHsKK3N0YXR1c190IENhbWVyYTJEZXZpY2U6OmNhcHR1cmUoQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QsIGludDY0X3QqIC8qbGFzdEZyYW1lTnVtYmVyKi8pIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlczogRSIsIF9fRlVOQ1RJT05fXyk7CiAKQEAgLTIyMCwxNSArMjA5LDI5IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjpjYXB0dXJlTGlzdChjb25zdCBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiAmcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiAvKmxhc3RGcmFtZU51bWJlciovKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBBTE9HRSgiJXM6IENhbWVyYTJEZXZpY2UgYnVyc3QgY2FwdHVyZSBub3QgaW1wbGVtZW50ZWQiLCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KIAotc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6c2V0U3RyZWFtaW5nUmVxdWVzdChjb25zdCBDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCkgeworc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6c2V0U3RyZWFtaW5nUmVxdWVzdChjb25zdCBDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogLypsYXN0RnJhbWVOdW1iZXIqLykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR1YoIiVzOiBFIiwgX19GVU5DVElPTl9fKTsKICAgICBDYW1lcmFNZXRhZGF0YSBzdHJlYW1SZXF1ZXN0KHJlcXVlc3QpOwogICAgIHJldHVybiBtUmVxdWVzdFF1ZXVlLnNldFN0cmVhbVNsb3Qoc3RyZWFtUmVxdWVzdC5yZWxlYXNlKCkpOwogfQogCi1zdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjpjbGVhclN0cmVhbWluZ1JlcXVlc3QoKSB7CitzdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjpzZXRTdHJlYW1pbmdSZXF1ZXN0TGlzdChjb25zdCBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiAmcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiAvKmxhc3RGcmFtZU51bWJlciovKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBBTE9HRSgiJXMsIENhbWVyYTJEZXZpY2Ugc3RyZWFtaW5nIGJ1cnN0IG5vdCBpbXBsZW1lbnRlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjpjbGVhclN0cmVhbWluZ1JlcXVlc3QoaW50NjRfdCogLypsYXN0RnJhbWVOdW1iZXIqLykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgcmV0dXJuIG1SZXF1ZXN0UXVldWUuc2V0U3RyZWFtU2xvdChOVUxMKTsKIH0KQEAgLTIzOSwxMyArMjQyLDE2IEBACiB9CiAKIHN0YXR1c190IENhbWVyYTJEZXZpY2U6OmNyZWF0ZVN0cmVhbShzcDxBTmF0aXZlV2luZG93PiBjb25zdW1lciwKLSAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwgc2l6ZV90IHNpemUsIGludCAqaWQpIHsKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwgaW50ICppZCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgc3RhdHVzX3QgcmVzOwogICAgIEFMT0dWKCIlczogRSIsIF9fRlVOQ1RJT05fXyk7CiAKICAgICBzcDxTdHJlYW1BZGFwdGVyPiBzdHJlYW0gPSBuZXcgU3RyZWFtQWRhcHRlcihtSGFsMkRldmljZSk7Ci0KKyAgICBzaXplX3Qgc2l6ZSA9IDA7CisgICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IpIHsKKyAgICAgICAgc2l6ZSA9IGdldEpwZWdCdWZmZXJTaXplKHdpZHRoLCBoZWlnaHQpOworICAgIH0KICAgICByZXMgPSBzdHJlYW0tPmNvbm5lY3RUb0RldmljZShjb25zdW1lciwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBzaXplKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBVbmFibGUgdG8gY3JlYXRlIHN0cmVhbSAoJWQgeCAlZCwgZm9ybWF0ICV4KToiCkBAIC0yNjAsNiArMjY2LDE3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzc2l6ZV90IENhbWVyYTJEZXZpY2U6OmdldEpwZWdCdWZmZXJTaXplKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIGNvbnN0IHsKKyAgICAvLyBBbHdheXMgZ2l2ZSB0aGUgbWF4IGpwZWcgYnVmZmVyIHNpemUgcmVnYXJkbGVzcyBvZiB0aGUgYWN0dWFsIGpwZWcgcmVzb2x1dGlvbi4KKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkganBlZ0J1Zk1heFNpemUgPSBtRGV2aWNlSW5mby5maW5kKEFORFJPSURfSlBFR19NQVhfU0laRSk7CisgICAgaWYgKGpwZWdCdWZNYXhTaXplLmNvdW50ID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IGZpbmQgbWF4aW11bSBKUEVHIHNpemUgaW4gc3RhdGljIG1ldGFkYXRhISIsIF9fRlVOQ1RJT05fXywgbUlkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICByZXR1cm4ganBlZ0J1Zk1heFNpemUuZGF0YS5pMzJbMF07Cit9CisKIHN0YXR1c190IENhbWVyYTJEZXZpY2U6OmNyZWF0ZVJlcHJvY2Vzc1N0cmVhbUZyb21TdHJlYW0oaW50IG91dHB1dElkLCBpbnQgKmlkKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBzdGF0dXNfdCByZXM7CkBAIC0zOTgsNiArNDE1LDE5IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjpjb25maWd1cmVTdHJlYW1zKCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgQUxPR1YoIiVzOiBFIiwgX19GVU5DVElPTl9fKTsKKworICAgIC8qKgorICAgICAqIEhBTDIgZGV2aWNlcyBkbyBub3QgbmVlZCB0byBjb25maWd1cmUgc3RyZWFtczsKKyAgICAgKiBzdHJlYW1zIGFyZSBjcmVhdGVkIG9uIHRoZSBmbHkuCisgICAgICovCisgICAgQUxPR1coIiVzOiBOby1vcCBmb3IgSEFMMiBkZXZpY2VzIiwgX19GVU5DVElPTl9fKTsKKworICAgIHJldHVybiBPSzsKK30KKwogCiBzdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjpjcmVhdGVEZWZhdWx0UmVxdWVzdChpbnQgdGVtcGxhdGVJZCwKICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgKnJlcXVlc3QpIHsKQEAgLTQ2MSw3ICs0OTEsMTMgQEAKICAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgewogICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKSB7CiAgICAgICAgICAgICBjYXNlIENBTUVSQTJfTVNHX0VSUk9SOgotICAgICAgICAgICAgICAgIGxpc3RlbmVyLT5ub3RpZnlFcnJvcihleHQxLCBleHQyLCBleHQzKTsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBUaGlzIG5lZWRzIHRvIGJlIGZpeGVkLiBleHQyIGFuZCBleHQzIG5lZWQgdG8gYmUgY29uc2lkZXJlZC4KKyAgICAgICAgICAgICAgICBsaXN0ZW5lci0+bm90aWZ5RXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAoKGV4dDEgPT0gQ0FNRVJBMl9NU0dfRVJST1JfREVWSUNFKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGV4dDEgPT0gQ0FNRVJBMl9NU0dfRVJST1JfSEFSRFdBUkUpKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9ERVZJQ0UgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfU0VSVklDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENhcHR1cmVSZXN1bHRFeHRyYXMoKSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIENBTUVSQTJfTVNHX1NIVVRURVI6IHsKICAgICAgICAgICAgICAgICAvLyBUT0RPOiBPbmx5IG5lZWRlZCBmb3IgY2FtZXJhMiBBUEksIHdoaWNoIGlzIHVuc3VwcG9ydGVkCkBAIC00OTAsMTYgKzUyNiwyMiBAQAogICAgIHJldHVybiBtRnJhbWVRdWV1ZS53YWl0Rm9yQnVmZmVyKHRpbWVvdXQpOwogfQogCi1zdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjpnZXROZXh0RnJhbWUoQ2FtZXJhTWV0YWRhdGEgKmZyYW1lKSB7CitzdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjpnZXROZXh0UmVzdWx0KENhcHR1cmVSZXN1bHQgKnJlc3VsdCkgewogICAgIEFUUkFDRV9DQUxMKCk7CisgICAgQUxPR1YoIiVzOiBnZXQgQ2FwdHVyZVJlc3VsdCIsIF9fRlVOQ1RJT05fXyk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogcmVzdWx0IHBvaW50ZXIgaXMgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQogICAgIHN0YXR1c190IHJlczsKICAgICBjYW1lcmFfbWV0YWRhdGFfdCAqcmF3RnJhbWU7CiAgICAgcmVzID0gbUZyYW1lUXVldWUuZGVxdWV1ZSgmcmF3RnJhbWUpOwotICAgIGlmIChyYXdGcmFtZSAgPT0gTlVMTCkgeworICAgIGlmIChyYXdGcmFtZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CiAgICAgfSBlbHNlIGlmIChyZXMgPT0gT0spIHsKLSAgICAgICAgZnJhbWUtPmFjcXVpcmUocmF3RnJhbWUpOworICAgICAgICByZXN1bHQtPm1NZXRhZGF0YS5hY3F1aXJlKHJhd0ZyYW1lKTsKICAgICB9CisKICAgICByZXR1cm4gcmVzOwogfQogCkBAIC01NjksMTMgKzYxMSwxOCBAQAogICAgIHJldHVybiByZXM7CiB9CiAKLXN0YXR1c190IENhbWVyYTJEZXZpY2U6OmZsdXNoKCkgeworc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6Zmx1c2goaW50NjRfdCogLypsYXN0RnJhbWVOdW1iZXIqLykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAKICAgICBtUmVxdWVzdFF1ZXVlLmNsZWFyKCk7CiAgICAgcmV0dXJuIHdhaXRVbnRpbERyYWluZWQoKTsKIH0KIAordWludDMyX3QgQ2FtZXJhMkRldmljZTo6Z2V0RGV2aWNlVmVyc2lvbigpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIHJldHVybiBtRGV2aWNlVmVyc2lvbjsKK30KKwogLyoqCiAgKiBDYW1lcmEyRGV2aWNlOjpNZXRhZGF0YVF1ZXVlCiAgKi8KQEAgLTgyMiw3ICs4NjksNyBAQAogICAgICAgICByZXN1bHQuYXBwZW5kKCIgICAgICBTdHJlYW0gc2xvdDogRW1wdHlcbiIpOwogICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKICAgICB9IGVsc2UgewotICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgICAgICBTdHJlYW0gc2xvdDogJWQgZW50cmllc1xuIiwKKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICAgICAgU3RyZWFtIHNsb3Q6ICV6dSBlbnRyaWVzXG4iLAogICAgICAgICAgICAgICAgIG1TdHJlYW1TbG90LnNpemUoKSk7CiAgICAgICAgIGludCBpID0gMDsKICAgICAgICAgZm9yIChMaXN0PGNhbWVyYV9tZXRhZGF0YV90Kj46Oml0ZXJhdG9yIHIgPSBtU3RyZWFtU2xvdC5iZWdpbigpOwpAQCAtODM3LDcgKzg4NCw3IEBACiAgICAgICAgIHJlc3VsdCA9ICIgICAgICBNYWluIHF1ZXVlIGlzIGVtcHR5XG4iOwogICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKICAgICB9IGVsc2UgewotICAgICAgICByZXN1bHQgPSBTdHJpbmc4Ojpmb3JtYXQoIiAgICAgIE1haW4gcXVldWUgaGFzICVkIGVudHJpZXM6XG4iLAorICAgICAgICByZXN1bHQgPSBTdHJpbmc4Ojpmb3JtYXQoIiAgICAgIE1haW4gcXVldWUgaGFzICV6dSBlbnRyaWVzOlxuIiwKICAgICAgICAgICAgICAgICBtRW50cmllcy5zaXplKCkpOwogICAgICAgICBpbnQgaSA9IDA7CiAgICAgICAgIGZvciAoTGlzdDxjYW1lcmFfbWV0YWRhdGFfdCo+OjppdGVyYXRvciByID0gbUVudHJpZXMuYmVnaW4oKTsKQEAgLTEwMDAsNyArMTA0Nyw3IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgQUxPR1YoIiVzOiBOZXcgc3RyZWFtIHBhcmFtZXRlcnMgJWQgeCAlZCwgZm9ybWF0IDB4JXgsIHNpemUgJWQiLAorICAgIEFMT0dWKCIlczogTmV3IHN0cmVhbSBwYXJhbWV0ZXJzICVkIHggJWQsIGZvcm1hdCAweCV4LCBzaXplICV6dSIsCiAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgc2l6ZSk7CiAKICAgICBtQ29uc3VtZXJJbnRlcmZhY2UgPSBjb25zdW1lcjsKQEAgLTEwNjgsMjUgKzExMTUsMzMgQEAKICAgICB9CiAKICAgICBpZiAobUZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IpIHsKLSAgICAgICAgcmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeShtQ29uc3VtZXJJbnRlcmZhY2UuZ2V0KCksCi0gICAgICAgICAgICAgICAgbVNpemUsIDEsIG1Gb3JtYXQpOworICAgICAgICByZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2RpbWVuc2lvbnMobUNvbnN1bWVySW50ZXJmYWNlLmdldCgpLAorICAgICAgICAgICAgICAgIG1TaXplLCAxKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY29uZmlndXJlIGNvbXByZXNzZWQgc3RyZWFtIGJ1ZmZlciBnZW9tZXRyeSIKLSAgICAgICAgICAgICAgICAgICAgIiAlZCB4ICVkLCBzaXplICVkIGZvciBzdHJlYW0gJWQiLAorICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY29uZmlndXJlIGNvbXByZXNzZWQgc3RyZWFtIGJ1ZmZlciBkaW1lbnNpb25zIgorICAgICAgICAgICAgICAgICAgICAiICVkIHggJWQsIHNpemUgJXp1IGZvciBzdHJlYW0gJWQiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1XaWR0aCwgbUhlaWdodCwgbVNpemUsIG1JZCk7CiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeShtQ29uc3VtZXJJbnRlcmZhY2UuZ2V0KCksCi0gICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0LCBtRm9ybWF0KTsKKyAgICAgICAgcmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19kaW1lbnNpb25zKG1Db25zdW1lckludGVyZmFjZS5nZXQoKSwKKyAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25maWd1cmUgc3RyZWFtIGJ1ZmZlciBnZW9tZXRyeSIKLSAgICAgICAgICAgICAgICAgICAgIiAlZCB4ICVkLCBmb3JtYXQgMHgleCBmb3Igc3RyZWFtICVkIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtV2lkdGgsIG1IZWlnaHQsIG1Gb3JtYXQsIG1JZCk7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25maWd1cmUgc3RyZWFtIGJ1ZmZlciBkaW1lbnNpb25zIgorICAgICAgICAgICAgICAgICAgICAiICVkIHggJWQgZm9yIHN0cmVhbSAlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVdpZHRoLCBtSGVpZ2h0LCBtSWQpOwogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQogICAgIH0KIAorICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZm9ybWF0KG1Db25zdW1lckludGVyZmFjZS5nZXQoKSwgbUZvcm1hdCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25maWd1cmUgc3RyZWFtIGJ1ZmZlciBmb3JtYXQiCisgICAgICAgICAgICAgICAgIiAlI3ggZm9yIHN0cmVhbSAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtRm9ybWF0LCBtSWQpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKwogICAgIGludCBtYXhDb25zdW1lckJ1ZmZlcnM7CiAgICAgcmVzID0gbUNvbnN1bWVySW50ZXJmYWNlLT5xdWVyeShtQ29uc3VtZXJJbnRlcmZhY2UuZ2V0KCksCiAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX01JTl9VTkRFUVVFVUVEX0JVRkZFUlMsICZtYXhDb25zdW1lckJ1ZmZlcnMpOwpAQCAtMTIxNCwxMSArMTI2OSwxMSBAQAogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgU3RyaW5nOCByZXN1bHQgPSBTdHJpbmc4Ojpmb3JtYXQoIiAgICAgIFN0cmVhbSAlZDogJWQgeCAlZCwgZm9ybWF0IDB4JXhcbiIsCiAgICAgICAgICAgICBtSWQsIG1XaWR0aCwgbUhlaWdodCwgbUZvcm1hdCk7Ci0gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICAgICAgICBzaXplICVkLCB1c2FnZSAweCV4LCByZXF1ZXN0ZWQgZm9ybWF0IDB4JXhcbiIsCisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICAgICAgICBzaXplICV6dSwgdXNhZ2UgMHgleCwgcmVxdWVzdGVkIGZvcm1hdCAweCV4XG4iLAogICAgICAgICAgICAgbVNpemUsIG1Vc2FnZSwgbUZvcm1hdFJlcXVlc3RlZCk7CiAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICAgICAgICB0b3RhbCBidWZmZXJzOiAlZCwgZGVxdWV1ZWQgYnVmZmVyczogJWRcbiIsCiAgICAgICAgICAgICBtVG90YWxCdWZmZXJzLCBtQWN0aXZlQnVmZmVycyk7Ci0gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICAgICAgICBmcmFtZSBjb3VudDogJWQsIGxhc3QgdGltZXN0YW1wICVsbGRcbiIsCisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICAgICAgICBmcmFtZSBjb3VudDogJWQsIGxhc3QgdGltZXN0YW1wICUiIFBSSWQ2NCAiXG4iLAogICAgICAgICAgICAgbUZyYW1lQ291bnQsIG1MYXN0VGltZXN0YW1wKTsKICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKICAgICByZXR1cm4gT0s7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UyL0NhbWVyYTJEZXZpY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTIvQ2FtZXJhMkRldmljZS5oCmluZGV4IDFmNTNjNTYuLjJhM2YxZDkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTIvQ2FtZXJhMkRldmljZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTIvQ2FtZXJhMkRldmljZS5oCkBAIC00NywzOCArNDcsNDggQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGRpc2Nvbm5lY3QoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKICAgICB2aXJ0dWFsIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBpbmZvKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBjYXB0dXJlKENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbWluZ1JlcXVlc3QoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xlYXJTdHJlYW1pbmdSZXF1ZXN0KCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjYXB0dXJlKENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0LCBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNhcHR1cmVMaXN0KGNvbnN0IExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+ICZyZXF1ZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtaW5nUmVxdWVzdChjb25zdCBDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1pbmdSZXF1ZXN0TGlzdChjb25zdCBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiAmcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNsZWFyU3RyZWFtaW5nUmVxdWVzdChpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHdhaXRVbnRpbFJlcXVlc3RSZWNlaXZlZChpbnQzMl90IHJlcXVlc3RJZCwgbnNlY3NfdCB0aW1lb3V0KTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVN0cmVhbShzcDxBTmF0aXZlV2luZG93PiBjb25zdW1lciwKLSAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgaW50ICppZCk7CisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LCBpbnQgKmlkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVJlcHJvY2Vzc1N0cmVhbUZyb21TdHJlYW0oaW50IG91dHB1dElkLCBpbnQgKmlkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN0cmVhbUluZm8oaW50IGlkLAogICAgICAgICAgICAgdWludDMyX3QgKndpZHRoLCB1aW50MzJfdCAqaGVpZ2h0LCB1aW50MzJfdCAqZm9ybWF0KTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbVRyYW5zZm9ybShpbnQgaWQsIGludCB0cmFuc2Zvcm0pOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVsZXRlU3RyZWFtKGludCBpZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBkZWxldGVSZXByb2Nlc3NTdHJlYW0oaW50IGlkKTsKKyAgICAvLyBOby1vcCBvbiBIQUwyIGRldmljZXMKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVN0cmVhbXMoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZURlZmF1bHRSZXF1ZXN0KGludCB0ZW1wbGF0ZUlkLCBDYW1lcmFNZXRhZGF0YSAqcmVxdWVzdCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCB3YWl0VW50aWxEcmFpbmVkKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXROb3RpZnlDYWxsYmFjayhOb3RpZmljYXRpb25MaXN0ZW5lciAqbGlzdGVuZXIpOwogICAgIHZpcnR1YWwgYm9vbCAgICAgd2lsbE5vdGlmeTNBKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCB3YWl0Rm9yTmV4dEZyYW1lKG5zZWNzX3QgdGltZW91dCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0RnJhbWUoQ2FtZXJhTWV0YWRhdGEgKmZyYW1lKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRSZXN1bHQoQ2FwdHVyZVJlc3VsdCAqZnJhbWUpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgdHJpZ2dlckF1dG9mb2N1cyh1aW50MzJfdCBpZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCB0cmlnZ2VyQ2FuY2VsQXV0b2ZvY3VzKHVpbnQzMl90IGlkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHRyaWdnZXJQcmVjYXB0dXJlTWV0ZXJpbmcodWludDMyX3QgaWQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcHVzaFJlcHJvY2Vzc0J1ZmZlcihpbnQgcmVwcm9jZXNzU3RyZWFtSWQsCiAgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlciwgd3A8QnVmZmVyUmVsZWFzZWRMaXN0ZW5lcj4gbGlzdGVuZXIpOwogICAgIC8vIEZsdXNoIGltcGxlbWVudGVkIGFzIGp1c3QgYSB3YWl0Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZmx1c2goaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CisgICAgdmlydHVhbCB1aW50MzJfdCBnZXREZXZpY2VWZXJzaW9uKCk7CisgICAgdmlydHVhbCBzc2l6ZV90IGdldEpwZWdCdWZmZXJTaXplKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIGNvbnN0OworCiAgIHByaXZhdGU6CiAgICAgY29uc3QgaW50IG1JZDsKICAgICBjYW1lcmEyX2RldmljZV90ICptSGFsMkRldmljZTsKIAogICAgIENhbWVyYU1ldGFkYXRhIG1EZXZpY2VJbmZvOwotICAgIHZlbmRvcl90YWdfcXVlcnlfb3BzX3QgKm1WZW5kb3JUYWdPcHM7CisKKyAgICB1aW50MzJfdCBtRGV2aWNlVmVyc2lvbjsKIAogICAgIC8qKgogICAgICAqIFF1ZXVlIGNsYXNzIGZvciBib3RoIHNlbmRpbmcgcmVxdWVzdHMgdG8gYSBjYW1lcmEyIGRldmljZSwgYW5kIGZvcgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAKaW5kZXggN2VlZjA5NC4uNTFkNTNlMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwCkBAIC0zNyw2ICszNyw4IEBACiAgICAgIiVzOiAiIGZtdCwgX19GVU5DVElPTl9fLCAgICAgICAgICAgICAgICAgICAgXAogICAgICMjX19WQV9BUkdTX18pCiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KICNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KQEAgLTQ3LDYgKzQ5LDggQEAKICNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaCIKICNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oIgogI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM1pzbFN0cmVhbS5oIgorI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmgiCisjaW5jbHVkZSAiQ2FtZXJhU2VydmljZS5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6Y2FtZXJhMzsKIApAQCAtNTYsNyArNjAsOCBAQAogICAgICAgICBtSWQoaWQpLAogICAgICAgICBtSGFsM0RldmljZShOVUxMKSwKICAgICAgICAgbVN0YXR1cyhTVEFUVVNfVU5JTklUSUFMSVpFRCksCi0gICAgICAgIG1Vc2VQYXJ0aWFsUmVzdWx0UXVpcmsoZmFsc2UpLAorICAgICAgICBtVXNlUGFydGlhbFJlc3VsdChmYWxzZSksCisgICAgICAgIG1OdW1QYXJ0aWFsUmVzdWx0cygxKSwKICAgICAgICAgbU5leHRSZXN1bHRGcmFtZU51bWJlcigwKSwKICAgICAgICAgbU5leHRTaHV0dGVyRnJhbWVOdW1iZXIoMCksCiAgICAgICAgIG1MaXN0ZW5lcihOVUxMKQpAQCAtMTAxLDggKzEwNiwxMSBAQAogCiAgICAgY2FtZXJhM19kZXZpY2VfdCAqZGV2aWNlOwogCi0gICAgcmVzID0gbW9kdWxlLT5jb21tb24ubWV0aG9kcy0+b3BlbigmbW9kdWxlLT5jb21tb24sIGRldmljZU5hbWUuc3RyaW5nKCksCi0gICAgICAgICAgICByZWludGVycHJldF9jYXN0PGh3X2RldmljZV90Kio+KCZkZXZpY2UpKTsKKyAgICBBVFJBQ0VfQkVHSU4oImNhbWVyYTMtPm9wZW4iKTsKKyAgICByZXMgPSBDYW1lcmFTZXJ2aWNlOjpmaWx0ZXJPcGVuRXJyb3JDb2RlKG1vZHVsZS0+Y29tbW9uLm1ldGhvZHMtPm9wZW4oCisgICAgICAgICZtb2R1bGUtPmNvbW1vbiwgZGV2aWNlTmFtZS5zdHJpbmcoKSwKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxod19kZXZpY2VfdCoqPigmZGV2aWNlKSkpOworICAgIEFUUkFDRV9FTkQoKTsKIAogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgU0VUX0VSUl9MKCJDb3VsZCBub3Qgb3BlbiBjYW1lcmE6ICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKQEAgLTExMCwxMCArMTE4LDkgQEAKICAgICB9CiAKICAgICAvKiogQ3Jvc3MtY2hlY2sgZGV2aWNlIHZlcnNpb24gKi8KLQotICAgIGlmIChkZXZpY2UtPmNvbW1vbi52ZXJzaW9uICE9IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7CisgICAgaWYgKGRldmljZS0+Y29tbW9uLnZlcnNpb24gPCBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgewogICAgICAgICBTRVRfRVJSX0woIkNvdWxkIG5vdCBvcGVuIGNhbWVyYTogIgotICAgICAgICAgICAgICAgICJDYW1lcmEgZGV2aWNlIGlzIG5vdCB2ZXJzaW9uICV4LCByZXBvcnRzICV4IGluc3RlYWQiLAorICAgICAgICAgICAgICAgICJDYW1lcmEgZGV2aWNlIHNob3VsZCBiZSBhdCBsZWFzdCAleCwgcmVwb3J0cyAleCBpbnN0ZWFkIiwKICAgICAgICAgICAgICAgICBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMCwKICAgICAgICAgICAgICAgICBkZXZpY2UtPmNvbW1vbi52ZXJzaW9uKTsKICAgICAgICAgZGV2aWNlLT5jb21tb24uY2xvc2UoJmRldmljZS0+Y29tbW9uKTsKQEAgLTEyMSwxMyArMTI4LDE0IEBACiAgICAgfQogCiAgICAgY2FtZXJhX2luZm8gaW5mbzsKLSAgICByZXMgPSBtb2R1bGUtPmdldF9jYW1lcmFfaW5mbyhtSWQsICZpbmZvKTsKKyAgICByZXMgPSBDYW1lcmFTZXJ2aWNlOjpmaWx0ZXJHZXRJbmZvRXJyb3JDb2RlKG1vZHVsZS0+Z2V0X2NhbWVyYV9pbmZvKAorICAgICAgICBtSWQsICZpbmZvKSk7CiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKIAogICAgIGlmIChpbmZvLmRldmljZV92ZXJzaW9uICE9IGRldmljZS0+Y29tbW9uLnZlcnNpb24pIHsKICAgICAgICAgU0VUX0VSUl9MKCJIQUwgcmVwb3J0aW5nIG1pc21hdGNoZWQgY2FtZXJhX2luZm8gdmVyc2lvbiAoJXgpIgogICAgICAgICAgICAgICAgICIgYW5kIGRldmljZSB2ZXJzaW9uICgleCkuIiwKLSAgICAgICAgICAgICAgICBkZXZpY2UtPmNvbW1vbi52ZXJzaW9uLCBpbmZvLmRldmljZV92ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICBpbmZvLmRldmljZV92ZXJzaW9uLCBkZXZpY2UtPmNvbW1vbi52ZXJzaW9uKTsKICAgICAgICAgZGV2aWNlLT5jb21tb24uY2xvc2UoJmRldmljZS0+Y29tbW9uKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CkBAIC0xNDUsMjQgKzE1Myw2IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgLyoqIEdldCB2ZW5kb3IgbWV0YWRhdGEgdGFncyAqLwotCi0gICAgbVZlbmRvclRhZ09wcy5nZXRfY2FtZXJhX3ZlbmRvcl9zZWN0aW9uX25hbWUgPSBOVUxMOwotCi0gICAgQVRSQUNFX0JFR0lOKCJjYW1lcmEzLT5nZXRfbWV0YWRhdGFfdmVuZG9yX3RhZ19vcHMiKTsKLSAgICBkZXZpY2UtPm9wcy0+Z2V0X21ldGFkYXRhX3ZlbmRvcl90YWdfb3BzKGRldmljZSwgJm1WZW5kb3JUYWdPcHMpOwotICAgIEFUUkFDRV9FTkQoKTsKLQotICAgIGlmIChtVmVuZG9yVGFnT3BzLmdldF9jYW1lcmFfdmVuZG9yX3NlY3Rpb25fbmFtZSAhPSBOVUxMKSB7Ci0gICAgICAgIHJlcyA9IHNldF9jYW1lcmFfbWV0YWRhdGFfdmVuZG9yX3RhZ19vcHMoJm1WZW5kb3JUYWdPcHMpOwotICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICBTRVRfRVJSX0woIlVuYWJsZSB0byBzZXQgdGFnIG9wczogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICAgICAgZGV2aWNlLT5jb21tb24uY2xvc2UoJmRldmljZS0+Y29tbW9uKTsKLSAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICAvKiogU3RhcnQgdXAgc3RhdHVzIHRyYWNrZXIgdGhyZWFkICovCiAgICAgbVN0YXR1c1RyYWNrZXIgPSBuZXcgU3RhdHVzVHJhY2tlcih0aGlzKTsKICAgICByZXMgPSBtU3RhdHVzVHJhY2tlci0+cnVuKFN0cmluZzg6OmZvcm1hdCgiQzNEZXYtJWQtU3RhdHVzIiwgbUlkKS5zdHJpbmcoKSk7CkBAIC0xODgsMjAgKzE3OCwyOSBAQAogCiAgICAgLyoqIEV2ZXJ5dGhpbmcgaXMgZ29vZCB0byBnbyAqLwogCisgICAgbURldmljZVZlcnNpb24gPSBkZXZpY2UtPmNvbW1vbi52ZXJzaW9uOwogICAgIG1EZXZpY2VJbmZvID0gaW5mby5zdGF0aWNfY2FtZXJhX2NoYXJhY3RlcmlzdGljczsKICAgICBtSGFsM0RldmljZSA9IGRldmljZTsKICAgICBtU3RhdHVzID0gU1RBVFVTX1VOQ09ORklHVVJFRDsKICAgICBtTmV4dFN0cmVhbUlkID0gMDsKKyAgICBtRHVtbXlTdHJlYW1JZCA9IE5PX1NUUkVBTTsKICAgICBtTmVlZENvbmZpZyA9IHRydWU7CiAgICAgbVBhdXNlU3RhdGVOb3RpZnkgPSBmYWxzZTsKIAotICAgIC8qKiBDaGVjayBmb3IgcXVpcmtzICovCi0KICAgICAvLyBXaWxsIHRoZSBIQUwgYmUgc2VuZGluZyBpbiBlYXJseSBwYXJ0aWFsIHJlc3VsdCBtZXRhZGF0YT8KLSAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgcGFydGlhbFJlc3VsdHNRdWlyayA9Ci0gICAgICAgICAgICBtRGV2aWNlSW5mby5maW5kKEFORFJPSURfUVVJUktTX1VTRV9QQVJUSUFMX1JFU1VMVCk7Ci0gICAgaWYgKHBhcnRpYWxSZXN1bHRzUXVpcmsuY291bnQgPiAwICYmIHBhcnRpYWxSZXN1bHRzUXVpcmsuZGF0YS51OFswXSA9PSAxKSB7Ci0gICAgICAgIG1Vc2VQYXJ0aWFsUmVzdWx0UXVpcmsgPSB0cnVlOworICAgIGlmIChtRGV2aWNlVmVyc2lvbiA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgeworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgcGFydGlhbFJlc3VsdHNDb3VudCA9CisgICAgICAgICAgICAgICAgbURldmljZUluZm8uZmluZChBTkRST0lEX1JFUVVFU1RfUEFSVElBTF9SRVNVTFRfQ09VTlQpOworICAgICAgICBpZiAocGFydGlhbFJlc3VsdHNDb3VudC5jb3VudCA+IDApIHsKKyAgICAgICAgICAgIG1OdW1QYXJ0aWFsUmVzdWx0cyA9IHBhcnRpYWxSZXN1bHRzQ291bnQuZGF0YS5pMzJbMF07CisgICAgICAgICAgICBtVXNlUGFydGlhbFJlc3VsdCA9IChtTnVtUGFydGlhbFJlc3VsdHMgPiAxKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBwYXJ0aWFsUmVzdWx0c1F1aXJrID0KKyAgICAgICAgICAgICAgICBtRGV2aWNlSW5mby5maW5kKEFORFJPSURfUVVJUktTX1VTRV9QQVJUSUFMX1JFU1VMVCk7CisgICAgICAgIGlmIChwYXJ0aWFsUmVzdWx0c1F1aXJrLmNvdW50ID4gMCAmJiBwYXJ0aWFsUmVzdWx0c1F1aXJrLmRhdGEudThbMF0gPT0gMSkgeworICAgICAgICAgICAgbVVzZVBhcnRpYWxSZXN1bHQgPSB0cnVlOworICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwpAQCAtMjcwLDcgKzI2OSw5IEBACiAgICAgICAgIG1TdGF0dXNUcmFja2VyLmNsZWFyKCk7CiAKICAgICAgICAgaWYgKG1IYWwzRGV2aWNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIEFUUkFDRV9CRUdJTigiY2FtZXJhMy0+Y2xvc2UiKTsKICAgICAgICAgICAgIG1IYWwzRGV2aWNlLT5jb21tb24uY2xvc2UoJm1IYWwzRGV2aWNlLT5jb21tb24pOworICAgICAgICAgICAgQVRSQUNFX0VORCgpOwogICAgICAgICAgICAgbUhhbDNEZXZpY2UgPSBOVUxMOwogICAgICAgICB9CiAKQEAgLTI5Nyw2ICsyOTgsODUgQEAKICAgICByZXR1cm4gZ290TG9jazsKIH0KIAorQ2FtZXJhM0RldmljZTo6U2l6ZSBDYW1lcmEzRGV2aWNlOjpnZXRNYXhKcGVnUmVzb2x1dGlvbigpIGNvbnN0IHsKKyAgICBpbnQzMl90IG1heEpwZWdXaWR0aCA9IDAsIG1heEpwZWdIZWlnaHQgPSAwOworICAgIGlmIChtRGV2aWNlVmVyc2lvbiA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgeworICAgICAgICBjb25zdCBpbnQgU1RSRUFNX0NPTkZJR1VSQVRJT05fU0laRSA9IDQ7CisgICAgICAgIGNvbnN0IGludCBTVFJFQU1fRk9STUFUX09GRlNFVCA9IDA7CisgICAgICAgIGNvbnN0IGludCBTVFJFQU1fV0lEVEhfT0ZGU0VUID0gMTsKKyAgICAgICAgY29uc3QgaW50IFNUUkVBTV9IRUlHSFRfT0ZGU0VUID0gMjsKKyAgICAgICAgY29uc3QgaW50IFNUUkVBTV9JU19JTlBVVF9PRkZTRVQgPSAzOworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVTdHJlYW1Db25maWdzID0KKyAgICAgICAgICAgICAgICBtRGV2aWNlSW5mby5maW5kKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMpOworICAgICAgICBpZiAoYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5jb3VudCA9PSAwIHx8CisgICAgICAgICAgICAgICAgYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5jb3VudCAlIFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIFNpemUoMCwgMCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBHZXQgbWF4IGpwZWcgc2l6ZSAoYXJlYS13aXNlKS4KKyAgICAgICAgZm9yIChzaXplX3QgaT0wOyBpIDwgYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5jb3VudDsgaSs9IFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUpIHsKKyAgICAgICAgICAgIGludDMyX3QgZm9ybWF0ID0gYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX0ZPUk1BVF9PRkZTRVRdOworICAgICAgICAgICAgaW50MzJfdCB3aWR0aCA9IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9XSURUSF9PRkZTRVRdOworICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQgPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fSEVJR0hUX09GRlNFVF07CisgICAgICAgICAgICBpbnQzMl90IGlzSW5wdXQgPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fSVNfSU5QVVRfT0ZGU0VUXTsKKyAgICAgICAgICAgIGlmIChpc0lucHV0ID09IEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlNfT1VUUFVUCisgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IgJiYKKyAgICAgICAgICAgICAgICAgICAgKHdpZHRoICogaGVpZ2h0ID4gbWF4SnBlZ1dpZHRoICogbWF4SnBlZ0hlaWdodCkpIHsKKyAgICAgICAgICAgICAgICBtYXhKcGVnV2lkdGggPSB3aWR0aDsKKyAgICAgICAgICAgICAgICBtYXhKcGVnSGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGF2YWlsYWJsZUpwZWdTaXplcyA9CisgICAgICAgICAgICAgICAgbURldmljZUluZm8uZmluZChBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfSlBFR19TSVpFUyk7CisgICAgICAgIGlmIChhdmFpbGFibGVKcGVnU2l6ZXMuY291bnQgPT0gMCB8fCBhdmFpbGFibGVKcGVnU2l6ZXMuY291bnQgJSAyICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBTaXplKDAsIDApOworICAgICAgICB9CisKKyAgICAgICAgLy8gR2V0IG1heCBqcGVnIHNpemUgKGFyZWEtd2lzZSkuCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXZhaWxhYmxlSnBlZ1NpemVzLmNvdW50OyBpICs9IDIpIHsKKyAgICAgICAgICAgIGlmICgoYXZhaWxhYmxlSnBlZ1NpemVzLmRhdGEuaTMyW2ldICogYXZhaWxhYmxlSnBlZ1NpemVzLmRhdGEuaTMyW2kgKyAxXSkKKyAgICAgICAgICAgICAgICAgICAgPiAobWF4SnBlZ1dpZHRoICogbWF4SnBlZ0hlaWdodCkpIHsKKyAgICAgICAgICAgICAgICBtYXhKcGVnV2lkdGggPSBhdmFpbGFibGVKcGVnU2l6ZXMuZGF0YS5pMzJbaV07CisgICAgICAgICAgICAgICAgbWF4SnBlZ0hlaWdodCA9IGF2YWlsYWJsZUpwZWdTaXplcy5kYXRhLmkzMltpICsgMV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFNpemUobWF4SnBlZ1dpZHRoLCBtYXhKcGVnSGVpZ2h0KTsKK30KKworc3NpemVfdCBDYW1lcmEzRGV2aWNlOjpnZXRKcGVnQnVmZmVyU2l6ZSh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSBjb25zdCB7CisgICAgLy8gR2V0IG1heCBqcGVnIHNpemUgKGFyZWEtd2lzZSkuCisgICAgU2l6ZSBtYXhKcGVnUmVzb2x1dGlvbiA9IGdldE1heEpwZWdSZXNvbHV0aW9uKCk7CisgICAgaWYgKG1heEpwZWdSZXNvbHV0aW9uLndpZHRoID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IGZpbmQgZmluZCB2YWxpZCBhdmFpbGFibGUganBlZyBzaXplcyBpbiBzdGF0aWMgbWV0YWRhdGEhIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gR2V0IG1heCBqcGVnIGJ1ZmZlciBzaXplCisgICAgc3NpemVfdCBtYXhKcGVnQnVmZmVyU2l6ZSA9IDA7CisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGpwZWdCdWZNYXhTaXplID0gbURldmljZUluZm8uZmluZChBTkRST0lEX0pQRUdfTUFYX1NJWkUpOworICAgIGlmIChqcGVnQnVmTWF4U2l6ZS5jb3VudCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBmaW5kIG1heGltdW0gSlBFRyBzaXplIGluIHN0YXRpYyBtZXRhZGF0YSEiLCBfX0ZVTkNUSU9OX18sIG1JZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIG1heEpwZWdCdWZmZXJTaXplID0ganBlZ0J1Zk1heFNpemUuZGF0YS5pMzJbMF07CisKKyAgICAvLyBDYWxjdWxhdGUgZmluYWwganBlZyBidWZmZXIgc2l6ZSBmb3IgdGhlIGdpdmVuIHJlc29sdXRpb24uCisgICAgZmxvYXQgc2NhbGVGYWN0b3IgPSAoKGZsb2F0KSAod2lkdGggKiBoZWlnaHQpKSAvCisgICAgICAgICAgICAobWF4SnBlZ1Jlc29sdXRpb24ud2lkdGggKiBtYXhKcGVnUmVzb2x1dGlvbi5oZWlnaHQpOworICAgIHNzaXplX3QganBlZ0J1ZmZlclNpemUgPSBzY2FsZUZhY3RvciAqIG1heEpwZWdCdWZmZXJTaXplOworICAgIC8vIEJvdW5kIHRoZSBidWZmZXIgc2l6ZSB0byBbTUlOX0pQRUdfQlVGRkVSX1NJWkUsIG1heEpwZWdCdWZmZXJTaXplXS4KKyAgICBpZiAoanBlZ0J1ZmZlclNpemUgPiBtYXhKcGVnQnVmZmVyU2l6ZSkgeworICAgICAgICBqcGVnQnVmZmVyU2l6ZSA9IG1heEpwZWdCdWZmZXJTaXplOworICAgIH0gZWxzZSBpZiAoanBlZ0J1ZmZlclNpemUgPCBrTWluSnBlZ0J1ZmZlclNpemUpIHsKKyAgICAgICAganBlZ0J1ZmZlclNpemUgPSBrTWluSnBlZ0J1ZmZlclNpemU7CisgICAgfQorCisgICAgcmV0dXJuIGpwZWdCdWZmZXJTaXplOworfQorCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgKHZvaWQpYXJnczsKQEAgLTM0Niw3ICs0MjYsNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUluRmxpZ2h0TWFwLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBJbkZsaWdodFJlcXVlc3QgciA9IG1JbkZsaWdodE1hcC52YWx1ZUF0KGkpOwotICAgICAgICAgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBGcmFtZSAlZCB8ICBUaW1lc3RhbXA6ICVsbGQsIG1ldGFkYXRhIgorICAgICAgICAgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBGcmFtZSAlZCB8ICBUaW1lc3RhbXA6ICUiIFBSSWQ2NCAiLCBtZXRhZGF0YSIKICAgICAgICAgICAgICAgICAgICAgIiBhcnJpdmVkOiAlcywgYnVmZmVycyBsZWZ0OiAlZFxuIiwgbUluRmxpZ2h0TWFwLmtleUF0KGkpLAogICAgICAgICAgICAgICAgICAgICByLmNhcHR1cmVUaW1lc3RhbXAsIHIuaGF2ZVJlc3VsdE1ldGFkYXRhID8gInRydWUiIDogImZhbHNlIiwKICAgICAgICAgICAgICAgICAgICAgci5udW1CdWZmZXJzTGVmdCk7CkBAIC0zODUsMTQgKzQ2NSw3IEBACiAgICAgcmV0dXJuIG1EZXZpY2VJbmZvOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjYXB0dXJlKENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0KSB7Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBzdGF0dXNfdCByZXM7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7Ci0KLSAgICAvLyBUT0RPOiB0YWtlIG93bmVyc2hpcCBvZiB0aGUgcmVxdWVzdAotCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjaGVja1N0YXR1c09rVG9DYXB0dXJlTG9ja2VkKCkgewogICAgIHN3aXRjaCAobVN0YXR1cykgewogICAgICAgICBjYXNlIFNUQVRVU19FUlJPUjoKICAgICAgICAgICAgIENMT0dFKCJEZXZpY2UgaGFzIGVuY291bnRlcmVkIGEgc2VyaW91cyBlcnJvciIpOwpAQCAtNDAxLDcgKzQ3NCw2IEBACiAgICAgICAgICAgICBDTE9HRSgiRGV2aWNlIG5vdCBpbml0aWFsaXplZCIpOwogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICBjYXNlIFNUQVRVU19VTkNPTkZJR1VSRUQ6Ci0gICAgICAgICAgICAvLyBNYXkgYmUgbGF6aWx5IGNvbmZpZ3VyaW5nIHN0cmVhbXMsIHdpbGwgY2hlY2sgZHVyaW5nIHNldHVwCiAgICAgICAgIGNhc2UgU1RBVFVTX0NPTkZJR1VSRUQ6CiAgICAgICAgIGNhc2UgU1RBVFVTX0FDVElWRToKICAgICAgICAgICAgIC8vIE9LCkBAIC00MTAsNzEgKzQ4MiwxMTkgQEAKICAgICAgICAgICAgIFNFVF9FUlJfTCgiVW5leHBlY3RlZCBzdGF0dXM6ICVkIiwgbVN0YXR1cyk7CiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQorICAgIHJldHVybiBPSzsKK30KIAotICAgIHNwPENhcHR1cmVSZXF1ZXN0PiBuZXdSZXF1ZXN0ID0gc2V0VXBSZXF1ZXN0TG9ja2VkKHJlcXVlc3QpOwotICAgIGlmIChuZXdSZXF1ZXN0ID09IE5VTEwpIHsKLSAgICAgICAgQ0xPR0UoIkNhbid0IGNyZWF0ZSBjYXB0dXJlIHJlcXVlc3QiKTsKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OmNvbnZlcnRNZXRhZGF0YUxpc3RUb1JlcXVlc3RMaXN0TG9ja2VkKAorICAgICAgICBjb25zdCBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiAmbWV0YWRhdGFMaXN0LCBSZXF1ZXN0TGlzdCAqcmVxdWVzdExpc3QpIHsKKyAgICBpZiAocmVxdWVzdExpc3QgPT0gTlVMTCkgeworICAgICAgICBDTE9HRSgicmVxdWVzdExpc3QgY2Fubm90IGJlIE5VTEwuIik7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgcmVzID0gbVJlcXVlc3RUaHJlYWQtPnF1ZXVlUmVxdWVzdChuZXdSZXF1ZXN0KTsKLSAgICBpZiAocmVzID09IE9LKSB7Ci0gICAgICAgIHdhaXRVbnRpbFN0YXRlVGhlblJlbG9jaygvKmFjdGl2ZSovIHRydWUsIGtBY3RpdmVUaW1lb3V0KTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgU0VUX0VSUl9MKCJDYW4ndCB0cmFuc2l0aW9uIHRvIGFjdGl2ZSBpbiAlZiBzZWNvbmRzISIsCi0gICAgICAgICAgICAgICAgICAgIGtBY3RpdmVUaW1lb3V0LzFlOSk7CisgICAgaW50MzJfdCBidXJzdElkID0gMDsKKyAgICBmb3IgKExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1ldGFkYXRhTGlzdC5iZWdpbigpOworICAgICAgICAgICAgaXQgIT0gbWV0YWRhdGFMaXN0LmVuZCgpOyArK2l0KSB7CisgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiBuZXdSZXF1ZXN0ID0gc2V0VXBSZXF1ZXN0TG9ja2VkKCppdCk7CisgICAgICAgIGlmIChuZXdSZXF1ZXN0ID09IDApIHsKKyAgICAgICAgICAgIENMT0dFKCJDYW4ndCBjcmVhdGUgY2FwdHVyZSByZXF1ZXN0Iik7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJDYW1lcmEgJWQ6IENhcHR1cmUgcmVxdWVzdCBlbnF1ZXVlZCIsIG1JZCk7CisKKyAgICAgICAgLy8gU2V0dXAgYnVyc3QgSWQgYW5kIHJlcXVlc3QgSWQKKyAgICAgICAgbmV3UmVxdWVzdC0+bVJlc3VsdEV4dHJhcy5idXJzdElkID0gYnVyc3RJZCsrOworICAgICAgICBpZiAoaXQtPmV4aXN0cyhBTkRST0lEX1JFUVVFU1RfSUQpKSB7CisgICAgICAgICAgICBpZiAoaXQtPmZpbmQoQU5EUk9JRF9SRVFVRVNUX0lEKS5jb3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgQ0xPR0UoIlJlcXVlc3RJRCBlbnRyeSBleGlzdHM7IGJ1dCBtdXN0IG5vdCBiZSBlbXB0eSBpbiBtZXRhZGF0YSIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXdSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLnJlcXVlc3RJZCA9IGl0LT5maW5kKEFORFJPSURfUkVRVUVTVF9JRCkuZGF0YS5pMzJbMF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDTE9HRSgiUmVxdWVzdElEIGRvZXMgbm90IGV4aXN0IGluIG1ldGFkYXRhIik7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgcmVxdWVzdExpc3QtPnB1c2hfYmFjayhuZXdSZXF1ZXN0KTsKKworICAgICAgICBBTE9HVigiJXM6IHJlcXVlc3RJZCA9ICUiIFBSSWQzMiwgX19GVU5DVElPTl9fLCBuZXdSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLnJlcXVlc3RJZCk7CiAgICAgfQotICAgIHJldHVybiByZXM7CisgICAgcmV0dXJuIE9LOwogfQogCi0KLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OnNldFN0cmVhbWluZ1JlcXVlc3QoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QpIHsKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OmNhcHR1cmUoQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QsIGludDY0X3QqIC8qbGFzdEZyYW1lTnVtYmVyKi8pIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIHN0YXR1c190IHJlczsKKworICAgIExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+IHJlcXVlc3RzOworICAgIHJlcXVlc3RzLnB1c2hfYmFjayhyZXF1ZXN0KTsKKyAgICByZXR1cm4gY2FwdHVyZUxpc3QocmVxdWVzdHMsIC8qbGFzdEZyYW1lTnVtYmVyKi9OVUxMKTsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6c3VibWl0UmVxdWVzdHNIZWxwZXIoCisgICAgICAgIGNvbnN0IExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+ICZyZXF1ZXN0cywgYm9vbCByZXBlYXRpbmcsCisgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKIAotICAgIHN3aXRjaCAobVN0YXR1cykgewotICAgICAgICBjYXNlIFNUQVRVU19FUlJPUjoKLSAgICAgICAgICAgIENMT0dFKCJEZXZpY2UgaGFzIGVuY291bnRlcmVkIGEgc2VyaW91cyBlcnJvciIpOwotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICBjYXNlIFNUQVRVU19VTklOSVRJQUxJWkVEOgotICAgICAgICAgICAgQ0xPR0UoIkRldmljZSBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgY2FzZSBTVEFUVVNfVU5DT05GSUdVUkVEOgotICAgICAgICAgICAgLy8gTWF5IGJlIGxhemlseSBjb25maWd1cmluZyBzdHJlYW1zLCB3aWxsIGNoZWNrIGR1cmluZyBzZXR1cAotICAgICAgICBjYXNlIFNUQVRVU19DT05GSUdVUkVEOgotICAgICAgICBjYXNlIFNUQVRVU19BQ1RJVkU6Ci0gICAgICAgICAgICAvLyBPSwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBTRVRfRVJSX0woIlVuZXhwZWN0ZWQgc3RhdHVzOiAlZCIsIG1TdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHN0YXR1c190IHJlcyA9IGNoZWNrU3RhdHVzT2tUb0NhcHR1cmVMb2NrZWQoKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIC8vIGVycm9yIGxvZ2dlZCBieSBwcmV2aW91cyBjYWxsCisgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCi0gICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IG5ld1JlcGVhdGluZ1JlcXVlc3QgPSBzZXRVcFJlcXVlc3RMb2NrZWQocmVxdWVzdCk7Ci0gICAgaWYgKG5ld1JlcGVhdGluZ1JlcXVlc3QgPT0gTlVMTCkgewotICAgICAgICBDTE9HRSgiQ2FuJ3QgY3JlYXRlIHJlcGVhdGluZyByZXF1ZXN0Iik7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgUmVxdWVzdExpc3QgcmVxdWVzdExpc3Q7CisKKyAgICByZXMgPSBjb252ZXJ0TWV0YWRhdGFMaXN0VG9SZXF1ZXN0TGlzdExvY2tlZChyZXF1ZXN0cywgLypvdXQqLyZyZXF1ZXN0TGlzdCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAvLyBlcnJvciBsb2dnZWQgYnkgcHJldmlvdXMgY2FsbAorICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAotICAgIFJlcXVlc3RMaXN0IG5ld1JlcGVhdGluZ1JlcXVlc3RzOwotICAgIG5ld1JlcGVhdGluZ1JlcXVlc3RzLnB1c2hfYmFjayhuZXdSZXBlYXRpbmdSZXF1ZXN0KTsKKyAgICBpZiAocmVwZWF0aW5nKSB7CisgICAgICAgIHJlcyA9IG1SZXF1ZXN0VGhyZWFkLT5zZXRSZXBlYXRpbmdSZXF1ZXN0cyhyZXF1ZXN0TGlzdCwgbGFzdEZyYW1lTnVtYmVyKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXMgPSBtUmVxdWVzdFRocmVhZC0+cXVldWVSZXF1ZXN0TGlzdChyZXF1ZXN0TGlzdCwgbGFzdEZyYW1lTnVtYmVyKTsKKyAgICB9CiAKLSAgICByZXMgPSBtUmVxdWVzdFRocmVhZC0+c2V0UmVwZWF0aW5nUmVxdWVzdHMobmV3UmVwZWF0aW5nUmVxdWVzdHMpOwogICAgIGlmIChyZXMgPT0gT0spIHsKLSAgICAgICAgd2FpdFVudGlsU3RhdGVUaGVuUmVsb2NrKC8qYWN0aXZlKi8gdHJ1ZSwga0FjdGl2ZVRpbWVvdXQpOworICAgICAgICB3YWl0VW50aWxTdGF0ZVRoZW5SZWxvY2soLyphY3RpdmUqL3RydWUsIGtBY3RpdmVUaW1lb3V0KTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgU0VUX0VSUl9MKCJDYW4ndCB0cmFuc2l0aW9uIHRvIGFjdGl2ZSBpbiAlZiBzZWNvbmRzISIsCiAgICAgICAgICAgICAgICAgICAgIGtBY3RpdmVUaW1lb3V0LzFlOSk7CiAgICAgICAgIH0KLSAgICAgICAgQUxPR1YoIkNhbWVyYSAlZDogUmVwZWF0aW5nIHJlcXVlc3Qgc2V0IiwgbUlkKTsKKyAgICAgICAgQUxPR1YoIkNhbWVyYSAlZDogQ2FwdHVyZSByZXF1ZXN0ICUiIFBSSWQzMiAiIGVucXVldWVkIiwgbUlkLAorICAgICAgICAgICAgICAoKihyZXF1ZXN0TGlzdC5iZWdpbigpKSktPm1SZXN1bHRFeHRyYXMucmVxdWVzdElkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBDTE9HRSgiQ2Fubm90IHF1ZXVlIHJlcXVlc3QuIEltcG9zc2libGUuIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQorCiAgICAgcmV0dXJuIHJlczsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y2FwdHVyZUxpc3QoY29uc3QgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gJnJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKworICAgIHJldHVybiBzdWJtaXRSZXF1ZXN0c0hlbHBlcihyZXF1ZXN0cywgLypyZXBlYXRpbmcqL2ZhbHNlLCBsYXN0RnJhbWVOdW1iZXIpOworfQorCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpzZXRTdHJlYW1pbmdSZXF1ZXN0KGNvbnN0IENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiAvKmxhc3RGcmFtZU51bWJlciovKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKworICAgIExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+IHJlcXVlc3RzOworICAgIHJlcXVlc3RzLnB1c2hfYmFjayhyZXF1ZXN0KTsKKyAgICByZXR1cm4gc2V0U3RyZWFtaW5nUmVxdWVzdExpc3QocmVxdWVzdHMsIC8qbGFzdEZyYW1lTnVtYmVyKi9OVUxMKTsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6c2V0U3RyZWFtaW5nUmVxdWVzdExpc3QoY29uc3QgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gJnJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKworICAgIHJldHVybiBzdWJtaXRSZXF1ZXN0c0hlbHBlcihyZXF1ZXN0cywgLypyZXBlYXRpbmcqL3RydWUsIGxhc3RGcmFtZU51bWJlcik7Cit9CiAKIHNwPENhbWVyYTNEZXZpY2U6OkNhcHR1cmVSZXF1ZXN0PiBDYW1lcmEzRGV2aWNlOjpzZXRVcFJlcXVlc3RMb2NrZWQoCiAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0KSB7CkBAIC00ODIsMTAgKzYwMiwxOCBAQAogCiAgICAgaWYgKG1TdGF0dXMgPT0gU1RBVFVTX1VOQ09ORklHVVJFRCB8fCBtTmVlZENvbmZpZykgewogICAgICAgICByZXMgPSBjb25maWd1cmVTdHJlYW1zTG9ja2VkKCk7CisgICAgICAgIC8vIFN0cmVhbSBjb25maWd1cmF0aW9uIGZhaWxlZCBkdWUgdG8gdW5zdXBwb3J0ZWQgY29uZmlndXJhdGlvbi4KKyAgICAgICAgLy8gRGV2aWNlIGJhY2sgdG8gdW5jb25maWd1cmVkIHN0YXRlLiBDbGllbnQgbWlnaHQgdHJ5IG90aGVyIGNvbmZpZ3VyYWl0b25zCisgICAgICAgIGlmIChyZXMgPT0gQkFEX1ZBTFVFICYmIG1TdGF0dXMgPT0gU1RBVFVTX1VOQ09ORklHVVJFRCkgeworICAgICAgICAgICAgQ0xPR0UoIk5vIHN0cmVhbXMgY29uZmlndXJlZCIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgLy8gU3RyZWFtIGNvbmZpZ3VyYXRpb24gZmFpbGVkIGZvciBvdGhlciByZWFzb24uIEZhdGFsLgogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBTRVRfRVJSX0woIkNhbid0IHNldCB1cCBzdHJlYW1zOiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQorICAgICAgICAvLyBTdHJlYW0gY29uZmlndXJhdGlvbiBzdWNjZXNzZnVsbHkgY29uZmlndXJlIHRvIGVtcHR5IHN0cmVhbSBjb25maWd1cmF0aW9uLgogICAgICAgICBpZiAobVN0YXR1cyA9PSBTVEFUVVNfVU5DT05GSUdVUkVEKSB7CiAgICAgICAgICAgICBDTE9HRSgiTm8gc3RyZWFtcyBjb25maWd1cmVkIik7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTQ5Niw3ICs2MjQsNyBAQAogICAgIHJldHVybiBuZXdSZXF1ZXN0OwogfQogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjbGVhclN0cmVhbWluZ1JlcXVlc3QoKSB7CitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjbGVhclN0cmVhbWluZ1JlcXVlc3QoaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKQEAgLTUxOCw3ICs2NDYsOCBAQAogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICBBTE9HVigiQ2FtZXJhICVkOiBDbGVhcmluZyByZXBlYXRpbmcgcmVxdWVzdCIsIG1JZCk7Ci0gICAgcmV0dXJuIG1SZXF1ZXN0VGhyZWFkLT5jbGVhclJlcGVhdGluZ1JlcXVlc3RzKCk7CisKKyAgICByZXR1cm4gbVJlcXVlc3RUaHJlYWQtPmNsZWFyUmVwZWF0aW5nUmVxdWVzdHMobGFzdEZyYW1lTnVtYmVyKTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6d2FpdFVudGlsUmVxdWVzdFJlY2VpdmVkKGludDMyX3QgcmVxdWVzdElkLCBuc2Vjc190IHRpbWVvdXQpIHsKQEAgLTY1Myw2ICs3ODIsOCBAQAogICAgIH0KICAgICBtSW5wdXRTdHJlYW0gPSBuZXdTdHJlYW07CiAKKyAgICBtTmVlZENvbmZpZyA9IHRydWU7CisKICAgICAqaWQgPSBtTmV4dFN0cmVhbUlkKys7CiAgICAgKnpzbFN0cmVhbSA9IG5ld1N0cmVhbTsKIApAQCAtNjczLDEyICs4MDQsMTIgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y3JlYXRlU3RyZWFtKHNwPEFOYXRpdmVXaW5kb3c+IGNvbnN1bWVyLAotICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LCBzaXplX3Qgc2l6ZSwgaW50ICppZCkgeworICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LCBpbnQgKmlkKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKLSAgICBBTE9HVigiQ2FtZXJhICVkOiBDcmVhdGluZyBuZXcgc3RyZWFtICVkOiAlZCB4ICVkLCBmb3JtYXQgJWQsIHNpemUgJWQiLAotICAgICAgICAgICAgbUlkLCBtTmV4dFN0cmVhbUlkLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHNpemUpOworICAgIEFMT0dWKCJDYW1lcmEgJWQ6IENyZWF0aW5nIG5ldyBzdHJlYW0gJWQ6ICVkIHggJWQsIGZvcm1hdCAlZCIsCisgICAgICAgICAgICBtSWQsIG1OZXh0U3RyZWFtSWQsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCk7CiAKICAgICBzdGF0dXNfdCByZXM7CiAgICAgYm9vbCB3YXNBY3RpdmUgPSBmYWxzZTsKQEAgLTcxMSw4ICs4NDIsMTQgQEAKIAogICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW0+IG5ld1N0cmVhbTsKICAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgeworICAgICAgICBzc2l6ZV90IGpwZWdCdWZmZXJTaXplID0gZ2V0SnBlZ0J1ZmZlclNpemUod2lkdGgsIGhlaWdodCk7CisgICAgICAgIGlmIChqcGVnQnVmZmVyU2l6ZSA8PSAwKSB7CisgICAgICAgICAgICBTRVRfRVJSX0woIkludmFsaWQganBlZyBidWZmZXIgc2l6ZSAlemQiLCBqcGVnQnVmZmVyU2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKICAgICAgICAgbmV3U3RyZWFtID0gbmV3IENhbWVyYTNPdXRwdXRTdHJlYW0obU5leHRTdHJlYW1JZCwgY29uc3VtZXIsCi0gICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgc2l6ZSwgZm9ybWF0KTsKKyAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBqcGVnQnVmZmVyU2l6ZSwgZm9ybWF0KTsKICAgICB9IGVsc2UgewogICAgICAgICBuZXdTdHJlYW0gPSBuZXcgQ2FtZXJhM091dHB1dFN0cmVhbShtTmV4dFN0cmVhbUlkLCBjb25zdW1lciwKICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQpOwpAQCAtODM3LDE2ICs5NzQsMjAgQEAKICAgICB9CiAKICAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBkZWxldGVkU3RyZWFtOworICAgIHNzaXplX3Qgb3V0cHV0U3RyZWFtSWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShpZCk7CiAgICAgaWYgKG1JbnB1dFN0cmVhbSAhPSBOVUxMICYmIGlkID09IG1JbnB1dFN0cmVhbS0+Z2V0SWQoKSkgewogICAgICAgICBkZWxldGVkU3RyZWFtID0gbUlucHV0U3RyZWFtOwogICAgICAgICBtSW5wdXRTdHJlYW0uY2xlYXIoKTsKICAgICB9IGVsc2UgewotICAgICAgICBzc2l6ZV90IGlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoaWQpOwotICAgICAgICBpZiAoaWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIGlmIChvdXRwdXRTdHJlYW1JZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKICAgICAgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgZG9lcyBub3QgZXhpc3QiLCBpZCk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9Ci0gICAgICAgIGRlbGV0ZWRTdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5lZGl0VmFsdWVBdChpZHgpOworICAgIH0KKworICAgIC8vIERlbGV0ZSBvdXRwdXQgc3RyZWFtIG9yIHRoZSBvdXRwdXQgcGFydCBvZiBhIGJpLWRpcmVjdGlvbmFsIHN0cmVhbS4KKyAgICBpZiAob3V0cHV0U3RyZWFtSWR4ICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIGRlbGV0ZWRTdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5lZGl0VmFsdWVBdChvdXRwdXRTdHJlYW1JZHgpOwogICAgICAgICBtT3V0cHV0U3RyZWFtcy5yZW1vdmVJdGVtKGlkKTsKICAgICB9CiAKQEAgLTg3MCw2ICsxMDExLDE1IEBACiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQogCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjb25maWd1cmVTdHJlYW1zKCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgQUxPR1YoIiVzOiBFIiwgX19GVU5DVElPTl9fKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworCisgICAgcmV0dXJuIGNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQoKTsKK30KIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y3JlYXRlRGVmYXVsdFJlcXVlc3QoaW50IHRlbXBsYXRlSWQsCiAgICAgICAgIENhbWVyYU1ldGFkYXRhICpyZXF1ZXN0KSB7CkBAIC05MDIsNiArMTA1MiwxMSBAQAogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAorICAgIGlmICghbVJlcXVlc3RUZW1wbGF0ZUNhY2hlW3RlbXBsYXRlSWRdLmlzRW1wdHkoKSkgeworICAgICAgICAqcmVxdWVzdCA9IG1SZXF1ZXN0VGVtcGxhdGVDYWNoZVt0ZW1wbGF0ZUlkXTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKwogICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpyYXdSZXF1ZXN0OwogICAgIEFUUkFDRV9CRUdJTigiY2FtZXJhMy0+Y29uc3RydWN0X2RlZmF1bHRfcmVxdWVzdF9zZXR0aW5ncyIpOwogICAgIHJhd1JlcXVlc3QgPSBtSGFsM0RldmljZS0+b3BzLT5jb25zdHJ1Y3RfZGVmYXVsdF9yZXF1ZXN0X3NldHRpbmdzKApAQCAtOTEzLDYgKzEwNjgsNyBAQAogICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CiAgICAgfQogICAgICpyZXF1ZXN0ID0gcmF3UmVxdWVzdDsKKyAgICBtUmVxdWVzdFRlbXBsYXRlQ2FjaGVbdGVtcGxhdGVJZF0gPSByYXdSZXF1ZXN0OwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtOTIyLDYgKzEwNzgsMTAgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKIAorICAgIHJldHVybiB3YWl0VW50aWxEcmFpbmVkTG9ja2VkKCk7Cit9CisKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OndhaXRVbnRpbERyYWluZWRMb2NrZWQoKSB7CiAgICAgc3dpdGNoIChtU3RhdHVzKSB7CiAgICAgICAgIGNhc2UgU1RBVFVTX1VOSU5JVElBTElaRUQ6CiAgICAgICAgIGNhc2UgU1RBVFVTX1VOQ09ORklHVVJFRDoKQEAgLTk0MCw2ICsxMTAwLDEwIEBACiAKICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogV2FpdGluZyB1bnRpbCBpZGxlIiwgX19GVU5DVElPTl9fLCBtSWQpOwogICAgIHN0YXR1c190IHJlcyA9IHdhaXRVbnRpbFN0YXRlVGhlblJlbG9jaygvKmFjdGl2ZSovIGZhbHNlLCBrU2h1dGRvd25UaW1lb3V0KTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIFNFVF9FUlJfTCgiRXJyb3Igd2FpdGluZyBmb3IgSEFMIHRvIGRyYWluOiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksCisgICAgICAgICAgICAgICAgcmVzKTsKKyAgICB9CiAgICAgcmV0dXJuIHJlczsKIH0KIApAQCAtMTAwOSw2ICsxMTczLDcgQEAKICAgICAgICAgQUxPR1coIiVzOiBSZXBsYWNpbmcgb2xkIGNhbGxiYWNrIGxpc3RlbmVyIiwgX19GVU5DVElPTl9fKTsKICAgICB9CiAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgbVJlcXVlc3RUaHJlYWQtPnNldE5vdGlmeUNhbGxiYWNrKGxpc3RlbmVyKTsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTEwMjYsNyArMTE5MSw3IEBACiAgICAgICAgIGlmIChyZXMgPT0gVElNRURfT1VUKSB7CiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9IGVsc2UgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgQUxPR1coIiVzOiBDYW1lcmEgJWQ6IE5vIGZyYW1lIGluICVsbGQgbnM6ICVzICglZCkiLAorICAgICAgICAgICAgQUxPR1coIiVzOiBDYW1lcmEgJWQ6IE5vIGZyYW1lIGluICUiIFBSSWQ2NCAiIG5zOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHRpbWVvdXQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQpAQCAtMTAzNCw3ICsxMTk5LDcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OmdldE5leHRGcmFtZShDYW1lcmFNZXRhZGF0YSAqZnJhbWUpIHsKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OmdldE5leHRSZXN1bHQoQ2FwdHVyZVJlc3VsdCAqZnJhbWUpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1PdXRwdXRMb2NrKTsKIApAQCAtMTA0Miw4ICsxMjA3LDE0IEBACiAgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CiAgICAgfQogCi0gICAgQ2FtZXJhTWV0YWRhdGEgJnJlc3VsdCA9ICoobVJlc3VsdFF1ZXVlLmJlZ2luKCkpOwotICAgIGZyYW1lLT5hY3F1aXJlKHJlc3VsdCk7CisgICAgaWYgKGZyYW1lID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBhcmd1bWVudCBjYW5ub3QgYmUgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgQ2FwdHVyZVJlc3VsdCAmcmVzdWx0ID0gKihtUmVzdWx0UXVldWUuYmVnaW4oKSk7CisgICAgZnJhbWUtPm1SZXN1bHRFeHRyYXMgPSByZXN1bHQubVJlc3VsdEV4dHJhczsKKyAgICBmcmFtZS0+bU1ldGFkYXRhLmFjcXVpcmUocmVzdWx0Lm1NZXRhZGF0YSk7CiAgICAgbVJlc3VsdFF1ZXVlLmVyYXNlKG1SZXN1bHRRdWV1ZS5iZWdpbigpKTsKIAogICAgIHJldHVybiBPSzsKQEAgLTEwNjMsNyArMTIzNCw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIEFORFJPSURfQ09OVFJPTF9BRl9UUklHR0VSX0lELAogICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oaWQpCi0gICAgICAgIH0sCisgICAgICAgIH0KICAgICB9OwogCiAgICAgcmV0dXJuIG1SZXF1ZXN0VGhyZWFkLT5xdWV1ZVRyaWdnZXIodHJpZ2dlciwKQEAgLTEwODQsNyArMTI1NSw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIEFORFJPSURfQ09OVFJPTF9BRl9UUklHR0VSX0lELAogICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oaWQpCi0gICAgICAgIH0sCisgICAgICAgIH0KICAgICB9OwogCiAgICAgcmV0dXJuIG1SZXF1ZXN0VGhyZWFkLT5xdWV1ZVRyaWdnZXIodHJpZ2dlciwKQEAgLTExMDUsNyArMTI3Niw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIEFORFJPSURfQ09OVFJPTF9BRV9QUkVDQVBUVVJFX0lELAogICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oaWQpCi0gICAgICAgIH0sCisgICAgICAgIH0KICAgICB9OwogCiAgICAgcmV0dXJuIG1SZXF1ZXN0VGhyZWFkLT5xdWV1ZVRyaWdnZXIodHJpZ2dlciwKQEAgLTExMjEsMTQgKzEyOTIsMzcgQEAKICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CiAKLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OmZsdXNoKCkgeworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Zmx1c2goaW50NjRfdCAqZnJhbWVOdW1iZXIpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBGbHVzaGluZyBhbGwgcmVxdWVzdHMiLCBfX0ZVTkNUSU9OX18sIG1JZCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKLSAgICBtUmVxdWVzdFRocmVhZC0+Y2xlYXIoKTsKLSAgICByZXR1cm4gbUhhbDNEZXZpY2UtPm9wcy0+Zmx1c2gobUhhbDNEZXZpY2UpOworICAgIE5vdGlmaWNhdGlvbkxpc3RlbmVyKiBsaXN0ZW5lcjsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1PdXRwdXRMb2NrKTsKKyAgICAgICAgbGlzdGVuZXIgPSBtTGlzdGVuZXI7CisgICAgfQorCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgICAgIG1SZXF1ZXN0VGhyZWFkLT5jbGVhcihsaXN0ZW5lciwgLypvdXQqL2ZyYW1lTnVtYmVyKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCByZXM7CisgICAgaWYgKG1IYWwzRGV2aWNlLT5jb21tb24udmVyc2lvbiA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMSkgeworICAgICAgICByZXMgPSBtSGFsM0RldmljZS0+b3BzLT5mbHVzaChtSGFsM0RldmljZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgICAgICByZXMgPSB3YWl0VW50aWxEcmFpbmVkTG9ja2VkKCk7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKwordWludDMyX3QgQ2FtZXJhM0RldmljZTo6Z2V0RGV2aWNlVmVyc2lvbigpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CisgICAgcmV0dXJuIG1EZXZpY2VWZXJzaW9uOwogfQogCiAvKioKQEAgLTEyNTIsNiArMTQ0NiwxNSBAQAogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCisgICAgLy8gV29ya2Fyb3VuZCBmb3IgZGV2aWNlIEhBTHYzLjIgb3Igb2xkZXIgc3BlYyBidWcgLSB6ZXJvIHN0cmVhbXMgcmVxdWlyZXMKKyAgICAvLyBhZGRpbmcgYSBkdW1teSBzdHJlYW0gaW5zdGVhZC4KKyAgICAvLyBUT0RPOiBCdWc6IDE3MzIxNDA0IGZvciBmaXhpbmcgdGhlIEhBTCBzcGVjIGFuZCByZW1vdmluZyB0aGlzIHdvcmthcm91bmQuCisgICAgaWYgKG1PdXRwdXRTdHJlYW1zLnNpemUoKSA9PSAwKSB7CisgICAgICAgIGFkZER1bW15U3RyZWFtTG9ja2VkKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdHJ5UmVtb3ZlRHVtbXlTdHJlYW1Mb2NrZWQoKTsKKyAgICB9CisKICAgICAvLyBTdGFydCBjb25maWd1cmluZyB0aGUgc3RyZWFtcwogICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBTdGFydGluZyBzdHJlYW0gY29uZmlndXJhdGlvbiIsIF9fRlVOQ1RJT05fXywgbUlkKTsKIApAQCAtMTI5OSw3ICsxNTAyLDQyIEBACiAgICAgcmVzID0gbUhhbDNEZXZpY2UtPm9wcy0+Y29uZmlndXJlX3N0cmVhbXMobUhhbDNEZXZpY2UsICZjb25maWcpOwogICAgIEFUUkFDRV9FTkQoKTsKIAotICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICBpZiAocmVzID09IEJBRF9WQUxVRSkgeworICAgICAgICAvLyBIQUwgcmVqZWN0ZWQgdGhpcyBzZXQgb2Ygc3RyZWFtcyBhcyB1bnN1cHBvcnRlZCwgY2xlYW4gdXAgY29uZmlnCisgICAgICAgIC8vIGF0dGVtcHQgYW5kIHJldHVybiB0byB1bmNvbmZpZ3VyZWQgc3RhdGUKKyAgICAgICAgaWYgKG1JbnB1dFN0cmVhbSAhPSBOVUxMICYmIG1JbnB1dFN0cmVhbS0+aXNDb25maWd1cmluZygpKSB7CisgICAgICAgICAgICByZXMgPSBtSW5wdXRTdHJlYW0tPmNhbmNlbENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBTRVRfRVJSX0woIkNhbid0IGNhbmNlbCBjb25maWd1cmluZyBpbnB1dCBzdHJlYW0gJWQ6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0U3RyZWFtLT5nZXRJZCgpLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0U3RyZWFtcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gb3V0cHV0U3RyZWFtID0KKyAgICAgICAgICAgICAgICAgICAgbU91dHB1dFN0cmVhbXMuZWRpdFZhbHVlQXQoaSk7CisgICAgICAgICAgICBpZiAob3V0cHV0U3RyZWFtLT5pc0NvbmZpZ3VyaW5nKCkpIHsKKyAgICAgICAgICAgICAgICByZXMgPSBvdXRwdXRTdHJlYW0tPmNhbmNlbENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIFNFVF9FUlJfTCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBjYW5jZWwgY29uZmlndXJpbmcgb3V0cHV0IHN0cmVhbSAlZDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0tPmdldElkKCksIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJldHVybiBzdGF0ZSB0byB0aGF0IGF0IHN0YXJ0IG9mIGNhbGwsIHNvIHRoYXQgZnV0dXJlIGNvbmZpZ3VyZXMKKyAgICAgICAgLy8gcHJvcGVybHkgY2xlYW4gdGhpbmdzIHVwCisgICAgICAgIG1TdGF0dXMgPSBTVEFUVVNfVU5DT05GSUdVUkVEOworICAgICAgICBtTmVlZENvbmZpZyA9IHRydWU7CisKKyAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IFN0cmVhbSBjb25maWd1cmF0aW9uIGZhaWxlZCIsIF9fRlVOQ1RJT05fXywgbUlkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9IGVsc2UgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAvLyBTb21lIG90aGVyIGtpbmQgb2YgZXJyb3IgZnJvbSBjb25maWd1cmVfc3RyZWFtcyAtIHRoaXMgaXMgbm90CisgICAgICAgIC8vIGV4cGVjdGVkCiAgICAgICAgIFNFVF9FUlJfTCgiVW5hYmxlIHRvIGNvbmZpZ3VyZSBzdHJlYW1zIHdpdGggSEFMOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgcmV0dXJuIHJlczsKQEAgLTEzMzksNyArMTU3Nyw3IEBACiAKICAgICBtTmVlZENvbmZpZyA9IGZhbHNlOwogCi0gICAgaWYgKGNvbmZpZy5udW1fc3RyZWFtcyA+IDApIHsKKyAgICBpZiAobUR1bW15U3RyZWFtSWQgPT0gTk9fU1RSRUFNKSB7CiAgICAgICAgIG1TdGF0dXMgPSBTVEFUVVNfQ09ORklHVVJFRDsKICAgICB9IGVsc2UgewogICAgICAgICBtU3RhdHVzID0gU1RBVFVTX1VOQ09ORklHVVJFRDsKQEAgLTEzNDcsOSArMTU4NSw3NSBAQAogCiAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IFN0cmVhbSBjb25maWd1cmF0aW9uIGNvbXBsZXRlIiwgX19GVU5DVElPTl9fLCBtSWQpOwogCisgICAgLy8gdGVhciBkb3duIHRoZSBkZWxldGVkIHN0cmVhbXMgYWZ0ZXIgY29uZmlndXJlIHN0cmVhbXMuCisgICAgbURlbGV0ZWRTdHJlYW1zLmNsZWFyKCk7CisKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OmFkZER1bW15U3RyZWFtTG9ja2VkKCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgc3RhdHVzX3QgcmVzOworCisgICAgaWYgKG1EdW1teVN0cmVhbUlkICE9IE5PX1NUUkVBTSkgeworICAgICAgICAvLyBTaG91bGQgbmV2ZXIgYmUgYWRkaW5nIGEgc2Vjb25kIGR1bW15IHN0cmVhbSB3aGVuIG9uZSBpcyBhbHJlYWR5CisgICAgICAgIC8vIGFjdGl2ZQorICAgICAgICBTRVRfRVJSX0woIiVzOiBDYW1lcmEgJWQ6IEEgZHVtbXkgc3RyZWFtIGFscmVhZHkgZXhpc3RzISIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IEFkZGluZyBhIGR1bW15IHN0cmVhbSIsIF9fRlVOQ1RJT05fXywgbUlkKTsKKworICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IGR1bW15U3RyZWFtID0KKyAgICAgICAgICAgIG5ldyBDYW1lcmEzRHVtbXlTdHJlYW0obU5leHRTdHJlYW1JZCk7CisKKyAgICByZXMgPSBtT3V0cHV0U3RyZWFtcy5hZGQobU5leHRTdHJlYW1JZCwgZHVtbXlTdHJlYW0pOworICAgIGlmIChyZXMgPCAwKSB7CisgICAgICAgIFNFVF9FUlJfTCgiQ2FuJ3QgYWRkIGR1bW15IHN0cmVhbSB0byBzZXQ6ICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBtRHVtbXlTdHJlYW1JZCA9IG1OZXh0U3RyZWFtSWQ7CisgICAgbU5leHRTdHJlYW1JZCsrOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjp0cnlSZW1vdmVEdW1teVN0cmVhbUxvY2tlZCgpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIHN0YXR1c190IHJlczsKKworICAgIGlmIChtRHVtbXlTdHJlYW1JZCA9PSBOT19TVFJFQU0pIHJldHVybiBPSzsKKyAgICBpZiAobU91dHB1dFN0cmVhbXMuc2l6ZSgpID09IDEpIHJldHVybiBPSzsKKworICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBSZW1vdmluZyB0aGUgZHVtbXkgc3RyZWFtIiwgX19GVU5DVElPTl9fLCBtSWQpOworCisgICAgLy8gT2ssIGhhdmUgYSBkdW1teSBzdHJlYW0gYW5kIHRoZXJlJ3MgYXQgbGVhc3Qgb25lIG90aGVyIG91dHB1dCBzdHJlYW0sCisgICAgLy8gc28gcmVtb3ZlIHRoZSBkdW1teQorCisgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gZGVsZXRlZFN0cmVhbTsKKyAgICBzc2l6ZV90IG91dHB1dFN0cmVhbUlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkobUR1bW15U3RyZWFtSWQpOworICAgIGlmIChvdXRwdXRTdHJlYW1JZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgU0VUX0VSUl9MKCJEdW1teSBzdHJlYW0gJWQgZG9lcyBub3QgYXBwZWFyIHRvIGV4aXN0IiwgbUR1bW15U3RyZWFtSWQpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgZGVsZXRlZFN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmVkaXRWYWx1ZUF0KG91dHB1dFN0cmVhbUlkeCk7CisgICAgbU91dHB1dFN0cmVhbXMucmVtb3ZlSXRlbXNBdChvdXRwdXRTdHJlYW1JZHgpOworCisgICAgLy8gRnJlZSB1cCB0aGUgc3RyZWFtIGVuZHBvaW50IHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgYnkgc29tZSBvdGhlciBzdHJlYW0KKyAgICByZXMgPSBkZWxldGVkU3RyZWFtLT5kaXNjb25uZWN0KCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBTRVRfRVJSX0woIkNhbid0IGRpc2Nvbm5lY3QgZGVsZXRlZCBkdW1teSBzdHJlYW0gJWQiLCBtRHVtbXlTdHJlYW1JZCk7CisgICAgICAgIC8vIGZhbGwgdGhyb3VnaCBzaW5jZSB3ZSB3YW50IHRvIHN0aWxsIGxpc3QgdGhlIHN0cmVhbSBhcyBkZWxldGVkLgorICAgIH0KKyAgICBtRGVsZXRlZFN0cmVhbXMuYWRkKGRlbGV0ZWRTdHJlYW0pOworICAgIG1EdW1teVN0cmVhbUlkID0gTk9fU1RSRUFNOworCisgICAgcmV0dXJuIHJlczsKK30KKwogdm9pZCBDYW1lcmEzRGV2aWNlOjpzZXRFcnJvclN0YXRlKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogICAgIHZhX2xpc3QgYXJnczsKQEAgLTEzODIsNDAgKzE2ODYsNDUgQEAKICAgICAvLyBCdXQgb25seSBkbyBlcnJvciBzdGF0ZSB0cmFuc2l0aW9uIHN0ZXBzIGZvciB0aGUgZmlyc3QgZXJyb3IKICAgICBpZiAobVN0YXR1cyA9PSBTVEFUVVNfRVJST1IgfHwgbVN0YXR1cyA9PSBTVEFUVVNfVU5JTklUSUFMSVpFRCkgcmV0dXJuOwogCi0gICAgLy8gU2F2ZSBzdGFjayB0cmFjZS4gVmlldyBieSBkdW1waW5nIGl0IGxhdGVyLgotICAgIENhbWVyYVRyYWNlczo6c2F2ZVRyYWNlKCk7Ci0gICAgLy8gVE9ETzogY29uc2lkZXIgYWRkaW5nIGVycm9yQ2F1c2UgYW5kIGNsaWVudCBwaWQvcHJvY25hbWUKLQogICAgIG1FcnJvckNhdXNlID0gZXJyb3JDYXVzZTsKIAogICAgIG1SZXF1ZXN0VGhyZWFkLT5zZXRQYXVzZWQodHJ1ZSk7CiAgICAgbVN0YXR1cyA9IFNUQVRVU19FUlJPUjsKKworICAgIC8vIE5vdGlmeSB1cHN0cmVhbSBhYm91dCBhIGRldmljZSBlcnJvcgorICAgIGlmIChtTGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICBtTGlzdGVuZXItPm5vdGlmeUVycm9yKElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9ERVZJQ0UsCisgICAgICAgICAgICAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcygpKTsKKyAgICB9CisKKyAgICAvLyBTYXZlIHN0YWNrIHRyYWNlLiBWaWV3IGJ5IGR1bXBpbmcgaXQgbGF0ZXIuCisgICAgQ2FtZXJhVHJhY2VzOjpzYXZlVHJhY2UoKTsKKyAgICAvLyBUT0RPOiBjb25zaWRlciBhZGRpbmcgZXJyb3JDYXVzZSBhbmQgY2xpZW50IHBpZC9wcm9jbmFtZQogfQogCiAvKioKICAqIEluLWZsaWdodCByZXF1ZXN0IG1hbmFnZW1lbnQKICAqLwogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpyZWdpc3RlckluRmxpZ2h0KGludDMyX3QgZnJhbWVOdW1iZXIsCi0gICAgICAgIGludDMyX3QgcmVxdWVzdElkLCBpbnQzMl90IG51bUJ1ZmZlcnMpIHsKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OnJlZ2lzdGVySW5GbGlnaHQodWludDMyX3QgZnJhbWVOdW1iZXIsCisgICAgICAgIGludDMyX3QgbnVtQnVmZmVycywgQ2FwdHVyZVJlc3VsdEV4dHJhcyByZXN1bHRFeHRyYXMsIGJvb2wgaGFzSW5wdXQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1JbkZsaWdodExvY2spOwogCiAgICAgc3NpemVfdCByZXM7Ci0gICAgcmVzID0gbUluRmxpZ2h0TWFwLmFkZChmcmFtZU51bWJlciwgSW5GbGlnaHRSZXF1ZXN0KHJlcXVlc3RJZCwgbnVtQnVmZmVycykpOworICAgIHJlcyA9IG1JbkZsaWdodE1hcC5hZGQoZnJhbWVOdW1iZXIsIEluRmxpZ2h0UmVxdWVzdChudW1CdWZmZXJzLCByZXN1bHRFeHRyYXMsIGhhc0lucHV0KSk7CiAgICAgaWYgKHJlcyA8IDApIHJldHVybiByZXM7CiAKICAgICByZXR1cm4gT0s7CiB9CiAKIC8qKgotICogUVVJUksocGFydGlhbCByZXN1bHRzKQogICogQ2hlY2sgaWYgYWxsIDNBIGZpZWxkcyBhcmUgcmVhZHksIGFuZCBzZW5kIG9mZiBhIHBhcnRpYWwgM0Etb25seSByZXN1bHQKICAqIHRvIHRoZSBvdXRwdXQgZnJhbWUgcXVldWUKICAqLwotYm9vbCBDYW1lcmEzRGV2aWNlOjpwcm9jZXNzUGFydGlhbDNBUXVpcmsoCi0gICAgICAgIGludDMyX3QgZnJhbWVOdW1iZXIsIGludDMyX3QgcmVxdWVzdElkLAotICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgcGFydGlhbCkgeworYm9vbCBDYW1lcmEzRGV2aWNlOjpwcm9jZXNzUGFydGlhbDNBUmVzdWx0KAorICAgICAgICB1aW50MzJfdCBmcmFtZU51bWJlciwKKyAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHBhcnRpYWwsIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgewogCiAgICAgLy8gQ2hlY2sgaWYgYWxsIDNBIHN0YXRlcyBhcmUgcHJlc2VudAogICAgIC8vIFRoZSBmdWxsIGxpc3Qgb2YgZmllbGRzIGlzCkBAIC0xNDM1LDggKzE3NDQsNiBAQAogICAgIHVpbnQ4X3QgYWVTdGF0ZTsKICAgICB1aW50OF90IGFmU3RhdGU7CiAgICAgdWludDhfdCBhd2JTdGF0ZTsKLSAgICBpbnQzMl90IGFmVHJpZ2dlcklkOwotICAgIGludDMyX3QgYWVUcmlnZ2VySWQ7CiAKICAgICBnb3RBbGxTdGF0ZXMgJj0gZ2V0M0FSZXN1bHQocGFydGlhbCwgQU5EUk9JRF9DT05UUk9MX0FGX01PREUsCiAgICAgICAgICZhZk1vZGUsIGZyYW1lTnVtYmVyKTsKQEAgLTE0NTMsODggKzE3NjAsOTIgQEAKICAgICBnb3RBbGxTdGF0ZXMgJj0gZ2V0M0FSZXN1bHQocGFydGlhbCwgQU5EUk9JRF9DT05UUk9MX0FXQl9TVEFURSwKICAgICAgICAgJmF3YlN0YXRlLCBmcmFtZU51bWJlcik7CiAKLSAgICBnb3RBbGxTdGF0ZXMgJj0gZ2V0M0FSZXN1bHQocGFydGlhbCwgQU5EUk9JRF9DT05UUk9MX0FGX1RSSUdHRVJfSUQsCi0gICAgICAgICZhZlRyaWdnZXJJZCwgZnJhbWVOdW1iZXIpOwotCi0gICAgZ290QWxsU3RhdGVzICY9IGdldDNBUmVzdWx0KHBhcnRpYWwsIEFORFJPSURfQ09OVFJPTF9BRV9QUkVDQVBUVVJFX0lELAotICAgICAgICAmYWVUcmlnZ2VySWQsIGZyYW1lTnVtYmVyKTsKLQogICAgIGlmICghZ290QWxsU3RhdGVzKSByZXR1cm4gZmFsc2U7CiAKICAgICBBTE9HVlYoIiVzOiBDYW1lcmEgJWQ6IEZyYW1lICVkLCBSZXF1ZXN0IElEICVkOiBBRiBtb2RlICVkLCBBV0IgbW9kZSAlZCwgIgogICAgICAgICAiQUYgc3RhdGUgJWQsIEFFIHN0YXRlICVkLCBBV0Igc3RhdGUgJWQsICIKICAgICAgICAgIkFGIHRyaWdnZXIgJWQsIEFFIHByZWNhcHR1cmUgdHJpZ2dlciAlZCIsCi0gICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBmcmFtZU51bWJlciwgcmVxdWVzdElkLAorICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgZnJhbWVOdW1iZXIsIHJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQsCiAgICAgICAgIGFmTW9kZSwgYXdiTW9kZSwKICAgICAgICAgYWZTdGF0ZSwgYWVTdGF0ZSwgYXdiU3RhdGUsCi0gICAgICAgIGFmVHJpZ2dlcklkLCBhZVRyaWdnZXJJZCk7CisgICAgICAgIHJlc3VsdEV4dHJhcy5hZlRyaWdnZXJJZCwgcmVzdWx0RXh0cmFzLnByZWNhcHR1cmVUcmlnZ2VySWQpOwogCiAgICAgLy8gR290IGFsbCBzdGF0ZXMsIHNvIGNvbnN0cnVjdCBhIG1pbmltYWwgcmVzdWx0IHRvIHNlbmQKICAgICAvLyBJbiBhZGRpdGlvbiB0byB0aGUgYWJvdmUgZmllbGRzLCB0aGlzIG1lYW5zIGFkZGluZyBpbgogICAgIC8vICAgYW5kcm9pZC5yZXF1ZXN0LmZyYW1lQ291bnQKICAgICAvLyAgIGFuZHJvaWQucmVxdWVzdC5yZXF1ZXN0SWQKLSAgICAvLyAgIGFuZHJvaWQucXVpcmtzLnBhcnRpYWxSZXN1bHQKKyAgICAvLyAgIGFuZHJvaWQucXVpcmtzLnBhcnRpYWxSZXN1bHQgKGZvciBIQUwgdmVyc2lvbiBiZWxvdyBIQUwzLjIpCiAKICAgICBjb25zdCBzaXplX3Qga01pbmltYWwzQVJlc3VsdEVudHJpZXMgPSAxMDsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsKG1PdXRwdXRMb2NrKTsKIAotICAgIENhbWVyYU1ldGFkYXRhJiBtaW4zQVJlc3VsdCA9Ci0gICAgICAgICAgICAqbVJlc3VsdFF1ZXVlLmluc2VydCgKLSAgICAgICAgICAgICAgICBtUmVzdWx0UXVldWUuZW5kKCksCi0gICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEoa01pbmltYWwzQVJlc3VsdEVudHJpZXMsIC8qZGF0YUNhcGFjaXR5Ki8gMCkpOworICAgIENhcHR1cmVSZXN1bHQgY2FwdHVyZVJlc3VsdDsKKyAgICBjYXB0dXJlUmVzdWx0Lm1SZXN1bHRFeHRyYXMgPSByZXN1bHRFeHRyYXM7CisgICAgY2FwdHVyZVJlc3VsdC5tTWV0YWRhdGEgPSBDYW1lcmFNZXRhZGF0YShrTWluaW1hbDNBUmVzdWx0RW50cmllcywgLypkYXRhQ2FwYWNpdHkqLyAwKTsKKyAgICAvLyBUT0RPOiBjaGFuZ2UgdGhpcyB0byBzcDxDYXB0dXJlUmVzdWx0Pi4gVGhpcyB3aWxsIG5lZWQgb3RoZXIgY2hhbmdlcywgaW5jbHVkaW5nLAorICAgIC8vIGJ1dCBub3QgbGltaXRlZCB0byBDYW1lcmFEZXZpY2VCYXNlOjpnZXROZXh0UmVzdWx0CisgICAgQ2FwdHVyZVJlc3VsdCYgbWluM0FSZXN1bHQgPQorICAgICAgICAgICAgKm1SZXN1bHRRdWV1ZS5pbnNlcnQobVJlc3VsdFF1ZXVlLmVuZCgpLCBjYXB0dXJlUmVzdWx0KTsKIAotICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQsIEFORFJPSURfUkVRVUVTVF9GUkFNRV9DT1VOVCwKLSAgICAgICAgICAgICZmcmFtZU51bWJlciwgZnJhbWVOdW1iZXIpKSB7CisgICAgaWYgKCFpbnNlcnQzQVJlc3VsdChtaW4zQVJlc3VsdC5tTWV0YWRhdGEsIEFORFJPSURfUkVRVUVTVF9GUkFNRV9DT1VOVCwKKyAgICAgICAgICAgIC8vIFRPRE86IFRoaXMgaXMgcHJvYmxlbWF0aWMgY2FzdGluZy4gTmVlZCB0byBmaXggQ2FtZXJhTWV0YWRhdGEuCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGludDMyX3QqPigmZnJhbWVOdW1iZXIpLCBmcmFtZU51bWJlcikpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQsIEFORFJPSURfUkVRVUVTVF9JRCwKKyAgICBpbnQzMl90IHJlcXVlc3RJZCA9IHJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQ7CisgICAgaWYgKCFpbnNlcnQzQVJlc3VsdChtaW4zQVJlc3VsdC5tTWV0YWRhdGEsIEFORFJPSURfUkVRVUVTVF9JRCwKICAgICAgICAgICAgICZyZXF1ZXN0SWQsIGZyYW1lTnVtYmVyKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgcGFydGlhbFJlc3VsdCA9IEFORFJPSURfUVVJUktTX1BBUlRJQUxfUkVTVUxUX1BBUlRJQUw7Ci0gICAgaWYgKCFpbnNlcnQzQVJlc3VsdChtaW4zQVJlc3VsdCwgQU5EUk9JRF9RVUlSS1NfUEFSVElBTF9SRVNVTFQsCi0gICAgICAgICAgICAmcGFydGlhbFJlc3VsdCwgZnJhbWVOdW1iZXIpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAobURldmljZVZlcnNpb24gPCBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgeworICAgICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBwYXJ0aWFsUmVzdWx0ID0gQU5EUk9JRF9RVUlSS1NfUEFSVElBTF9SRVNVTFRfUEFSVElBTDsKKyAgICAgICAgaWYgKCFpbnNlcnQzQVJlc3VsdChtaW4zQVJlc3VsdC5tTWV0YWRhdGEsIEFORFJPSURfUVVJUktTX1BBUlRJQUxfUkVTVUxULAorICAgICAgICAgICAgICAgICZwYXJ0aWFsUmVzdWx0LCBmcmFtZU51bWJlcikpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQogICAgIH0KIAotICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQsIEFORFJPSURfQ09OVFJPTF9BRl9NT0RFLAorICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQubU1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUZfTU9ERSwKICAgICAgICAgICAgICZhZk1vZGUsIGZyYW1lTnVtYmVyKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgaWYgKCFpbnNlcnQzQVJlc3VsdChtaW4zQVJlc3VsdCwgQU5EUk9JRF9DT05UUk9MX0FXQl9NT0RFLAorICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQubU1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQVdCX01PREUsCiAgICAgICAgICAgICAmYXdiTW9kZSwgZnJhbWVOdW1iZXIpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBpZiAoIWluc2VydDNBUmVzdWx0KG1pbjNBUmVzdWx0LCBBTkRST0lEX0NPTlRST0xfQUVfU1RBVEUsCisgICAgaWYgKCFpbnNlcnQzQVJlc3VsdChtaW4zQVJlc3VsdC5tTWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BRV9TVEFURSwKICAgICAgICAgICAgICZhZVN0YXRlLCBmcmFtZU51bWJlcikpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQsIEFORFJPSURfQ09OVFJPTF9BRl9TVEFURSwKKyAgICBpZiAoIWluc2VydDNBUmVzdWx0KG1pbjNBUmVzdWx0Lm1NZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FGX1NUQVRFLAogICAgICAgICAgICAgJmFmU3RhdGUsIGZyYW1lTnVtYmVyKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgaWYgKCFpbnNlcnQzQVJlc3VsdChtaW4zQVJlc3VsdCwgQU5EUk9JRF9DT05UUk9MX0FXQl9TVEFURSwKKyAgICBpZiAoIWluc2VydDNBUmVzdWx0KG1pbjNBUmVzdWx0Lm1NZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FXQl9TVEFURSwKICAgICAgICAgICAgICZhd2JTdGF0ZSwgZnJhbWVOdW1iZXIpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBpZiAoIWluc2VydDNBUmVzdWx0KG1pbjNBUmVzdWx0LCBBTkRST0lEX0NPTlRST0xfQUZfVFJJR0dFUl9JRCwKLSAgICAgICAgICAgICZhZlRyaWdnZXJJZCwgZnJhbWVOdW1iZXIpKSB7CisgICAgaWYgKCFpbnNlcnQzQVJlc3VsdChtaW4zQVJlc3VsdC5tTWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BRl9UUklHR0VSX0lELAorICAgICAgICAgICAgJnJlc3VsdEV4dHJhcy5hZlRyaWdnZXJJZCwgZnJhbWVOdW1iZXIpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBpZiAoIWluc2VydDNBUmVzdWx0KG1pbjNBUmVzdWx0LCBBTkRST0lEX0NPTlRST0xfQUVfUFJFQ0FQVFVSRV9JRCwKLSAgICAgICAgICAgICZhZVRyaWdnZXJJZCwgZnJhbWVOdW1iZXIpKSB7CisgICAgaWYgKCFpbnNlcnQzQVJlc3VsdChtaW4zQVJlc3VsdC5tTWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BRV9QUkVDQVBUVVJFX0lELAorICAgICAgICAgICAgJnJlc3VsdEV4dHJhcy5wcmVjYXB0dXJlVHJpZ2dlcklkLCBmcmFtZU51bWJlcikpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIC8vIFdlIG9ubHkgc2VuZCB0aGUgYWdncmVnYXRlZCBwYXJ0aWFsIHdoZW4gYWxsIDNBIHJlbGF0ZWQgbWV0YWRhdGEgYXJlIGF2YWlsYWJsZQorICAgIC8vIEZvciBib3RoIEFQSTEgYW5kIEFQSTIuCisgICAgLy8gVE9ETzogd2UgcHJvYmFibHkgc2hvdWxkIHBhc3MgdGhyb3VnaCBhbGwgcGFydGlhbHMgdG8gQVBJMiB1bmNvbmRpdGlvbmFsbHkuCiAgICAgbVJlc3VsdFNpZ25hbC5zaWduYWwoKTsKIAogICAgIHJldHVybiB0cnVlOwpAQCAtMTU0Miw3ICsxODUzLDcgQEAKIAogdGVtcGxhdGU8dHlwZW5hbWUgVD4KIGJvb2wgQ2FtZXJhM0RldmljZTo6Z2V0M0FSZXN1bHQoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHJlc3VsdCwgaW50MzJfdCB0YWcsCi0gICAgICAgIFQqIHZhbHVlLCBpbnQzMl90IGZyYW1lTnVtYmVyKSB7CisgICAgICAgIFQqIHZhbHVlLCB1aW50MzJfdCBmcmFtZU51bWJlcikgewogICAgICh2b2lkKSBmcmFtZU51bWJlcjsKIAogICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGVudHJ5OwpAQCAtMTU2Nyw3ICsxODc4LDcgQEAKIAogdGVtcGxhdGU8dHlwZW5hbWUgVD4KIGJvb2wgQ2FtZXJhM0RldmljZTo6aW5zZXJ0M0FSZXN1bHQoQ2FtZXJhTWV0YWRhdGEmIHJlc3VsdCwgaW50MzJfdCB0YWcsCi0gICAgICAgIGNvbnN0IFQqIHZhbHVlLCBpbnQzMl90IGZyYW1lTnVtYmVyKSB7CisgICAgICAgIGNvbnN0IFQqIHZhbHVlLCB1aW50MzJfdCBmcmFtZU51bWJlcikgewogICAgIGlmIChyZXN1bHQudXBkYXRlKHRhZywgdmFsdWUsIDEpICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIG1SZXN1bHRRdWV1ZS5lcmFzZSgtLW1SZXN1bHRRdWV1ZS5lbmQoKSwgbVJlc3VsdFF1ZXVlLmVuZCgpKTsKICAgICAgICAgU0VUX0VSUigiRnJhbWUgJWQ6IEZhaWxlZCB0byBzZXQgJXMgaW4gcGFydGlhbCBtZXRhZGF0YSIsCkBAIC0xNTg3LDE4ICsxODk4LDM0IEBACiAgICAgc3RhdHVzX3QgcmVzOwogCiAgICAgdWludDMyX3QgZnJhbWVOdW1iZXIgPSByZXN1bHQtPmZyYW1lX251bWJlcjsKLSAgICBpZiAocmVzdWx0LT5yZXN1bHQgPT0gTlVMTCAmJiByZXN1bHQtPm51bV9vdXRwdXRfYnVmZmVycyA9PSAwKSB7CisgICAgaWYgKHJlc3VsdC0+cmVzdWx0ID09IE5VTEwgJiYgcmVzdWx0LT5udW1fb3V0cHV0X2J1ZmZlcnMgPT0gMCAmJgorICAgICAgICAgICAgcmVzdWx0LT5pbnB1dF9idWZmZXIgPT0gTlVMTCkgewogICAgICAgICBTRVRfRVJSKCJObyByZXN1bHQgZGF0YSBwcm92aWRlZCBieSBIQUwgZm9yIGZyYW1lICVkIiwKICAgICAgICAgICAgICAgICBmcmFtZU51bWJlcik7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgYm9vbCBwYXJ0aWFsUmVzdWx0UXVpcmsgPSBmYWxzZTsKLSAgICBDYW1lcmFNZXRhZGF0YSBjb2xsZWN0ZWRRdWlya1Jlc3VsdDsKIAotICAgIC8vIEdldCBjYXB0dXJlIHRpbWVzdGFtcCBmcm9tIGxpc3Qgb2YgaW4tZmxpZ2h0IHJlcXVlc3RzLCB3aGVyZSBpdCB3YXMgYWRkZWQKLSAgICAvLyBieSB0aGUgc2h1dHRlciBub3RpZmljYXRpb24gZm9yIHRoaXMgZnJhbWUuIFRoZW4gdXBkYXRlIHRoZSBpbi1mbGlnaHQKLSAgICAvLyBzdGF0dXMgYW5kIHJlbW92ZSB0aGUgaW4tZmxpZ2h0IGVudHJ5IGlmIGFsbCByZXN1bHQgZGF0YSBoYXMgYmVlbgotICAgIC8vIHJlY2VpdmVkLgorICAgIC8vIEZvciBIQUwzLjIgb3IgYWJvdmUsIElmIEhBTCBkb2Vzbid0IHN1cHBvcnQgcGFydGlhbCwgaXQgbXVzdCBhbHdheXMgc2V0CisgICAgLy8gcGFydGlhbF9yZXN1bHQgdG8gMSB3aGVuIG1ldGFkYXRhIGlzIGluY2x1ZGVkIGluIHRoaXMgcmVzdWx0LgorICAgIGlmICghbVVzZVBhcnRpYWxSZXN1bHQgJiYKKyAgICAgICAgICAgIG1EZXZpY2VWZXJzaW9uID49IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yICYmCisgICAgICAgICAgICByZXN1bHQtPnJlc3VsdCAhPSBOVUxMICYmCisgICAgICAgICAgICByZXN1bHQtPnBhcnRpYWxfcmVzdWx0ICE9IDEpIHsKKyAgICAgICAgU0VUX0VSUigiUmVzdWx0IGlzIG1hbGZvcm1lZCBmb3IgZnJhbWUgJWQ6IHBhcnRpYWxfcmVzdWx0ICV1IG11c3QgYmUgMSIKKyAgICAgICAgICAgICAgICAiIGlmIHBhcnRpYWwgcmVzdWx0IGlzIG5vdCBzdXBwb3J0ZWQiLAorICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyLCByZXN1bHQtPnBhcnRpYWxfcmVzdWx0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgaXNQYXJ0aWFsUmVzdWx0ID0gZmFsc2U7CisgICAgQ2FtZXJhTWV0YWRhdGEgY29sbGVjdGVkUGFydGlhbFJlc3VsdDsKKyAgICBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhczsKKyAgICBib29sIGhhc0lucHV0QnVmZmVySW5SZXF1ZXN0ID0gZmFsc2U7CisKKyAgICAvLyBHZXQgY2FwdHVyZSB0aW1lc3RhbXAgYW5kIHJlc3VsdEV4dHJhcyBmcm9tIGxpc3Qgb2YgaW4tZmxpZ2h0IHJlcXVlc3RzLAorICAgIC8vIHdoZXJlIGl0IHdhcyBhZGRlZCBieSB0aGUgc2h1dHRlciBub3RpZmljYXRpb24gZm9yIHRoaXMgZnJhbWUuCisgICAgLy8gVGhlbiB1cGRhdGUgdGhlIGluLWZsaWdodCBzdGF0dXMgYW5kIHJlbW92ZSB0aGUgaW4tZmxpZ2h0IGVudHJ5IGlmCisgICAgLy8gYWxsIHJlc3VsdCBkYXRhIGhhcyBiZWVuIHJlY2VpdmVkLgogICAgIG5zZWNzX3QgdGltZXN0YW1wID0gMDsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1JbkZsaWdodExvY2spOwpAQCAtMTYwOSw3MSArMTkzNiwxMDggQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBJbkZsaWdodFJlcXVlc3QgJnJlcXVlc3QgPSBtSW5GbGlnaHRNYXAuZWRpdFZhbHVlQXQoaWR4KTsKKyAgICAgICAgQUxPR1ZWKCIlczogZ290IEluRmxpZ2h0UmVxdWVzdCByZXF1ZXN0SWQgPSAlIiBQUklkMzIgIiwgZnJhbWVOdW1iZXIgPSAlIiBQUklkNjQKKyAgICAgICAgICAgICAgICAiLCBidXJzdElkID0gJSIgUFJJZDMyLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVxdWVzdC5yZXN1bHRFeHRyYXMucmVxdWVzdElkLCByZXF1ZXN0LnJlc3VsdEV4dHJhcy5mcmFtZU51bWJlciwKKyAgICAgICAgICAgICAgICByZXF1ZXN0LnJlc3VsdEV4dHJhcy5idXJzdElkKTsKKyAgICAgICAgLy8gQWx3YXlzIHVwZGF0ZSB0aGUgcGFydGlhbCBjb3VudCB0byB0aGUgbGF0ZXN0IG9uZS4gV2hlbiBmcmFtZXdvcmsgYWdncmVnYXRlcyBhZGphY2VudAorICAgICAgICAvLyBwYXJ0aWFsIHJlc3VsdHMgaW50byBvbmUsIHRoZSBsYXRlc3QgcGFydGlhbCBjb3VudCB3aWxsIGJlIHVzZWQuCisgICAgICAgIHJlcXVlc3QucmVzdWx0RXh0cmFzLnBhcnRpYWxSZXN1bHRDb3VudCA9IHJlc3VsdC0+cGFydGlhbF9yZXN1bHQ7CiAKICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyByZXN1bHQgY2FycmllcyBvbmx5IHBhcnRpYWwgbWV0YWRhdGEKLSAgICAgICAgaWYgKG1Vc2VQYXJ0aWFsUmVzdWx0UXVpcmsgJiYgcmVzdWx0LT5yZXN1bHQgIT0gTlVMTCkgewotICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgcGFydGlhbFJlc3VsdEVudHJ5OwotICAgICAgICAgICAgcmVzID0gZmluZF9jYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkocmVzdWx0LT5yZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgIEFORFJPSURfUVVJUktTX1BBUlRJQUxfUkVTVUxULCAmcGFydGlhbFJlc3VsdEVudHJ5KTsKLSAgICAgICAgICAgIGlmIChyZXMgIT0gTkFNRV9OT1RfRk9VTkQgJiYKLSAgICAgICAgICAgICAgICAgICAgcGFydGlhbFJlc3VsdEVudHJ5LmNvdW50ID4gMCAmJgotICAgICAgICAgICAgICAgICAgICBwYXJ0aWFsUmVzdWx0RW50cnkuZGF0YS51OFswXSA9PQotICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1FVSVJLU19QQVJUSUFMX1JFU1VMVF9QQVJUSUFMKSB7Ci0gICAgICAgICAgICAgICAgLy8gQSBwYXJ0aWFsIHJlc3VsdC4gRmxhZyB0aGlzIGFzIHN1Y2gsIGFuZCBjb2xsZWN0IHRoaXMKLSAgICAgICAgICAgICAgICAvLyBzZXQgb2YgbWV0YWRhdGEgaW50byB0aGUgaW4tZmxpZ2h0IGVudHJ5LgotICAgICAgICAgICAgICAgIHBhcnRpYWxSZXN1bHRRdWlyayA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdC5wYXJ0aWFsUmVzdWx0UXVpcmsuY29sbGVjdGVkUmVzdWx0LmFwcGVuZCgKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LT5yZXN1bHQpOwotICAgICAgICAgICAgICAgIHJlcXVlc3QucGFydGlhbFJlc3VsdFF1aXJrLmNvbGxlY3RlZFJlc3VsdC5lcmFzZSgKLSAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9RVUlSS1NfUEFSVElBTF9SRVNVTFQpOworICAgICAgICBpZiAobVVzZVBhcnRpYWxSZXN1bHQgJiYgcmVzdWx0LT5yZXN1bHQgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKG1EZXZpY2VWZXJzaW9uID49IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC0+cGFydGlhbF9yZXN1bHQgPiBtTnVtUGFydGlhbFJlc3VsdHMgfHwgcmVzdWx0LT5wYXJ0aWFsX3Jlc3VsdCA8IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgU0VUX0VSUigiUmVzdWx0IGlzIG1hbGZvcm1lZCBmb3IgZnJhbWUgJWQ6IHBhcnRpYWxfcmVzdWx0ICV1IG11c3QgYmUgIGluIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdGhlIHJhbmdlIG9mIFsxLCAlZF0gd2hlbiBtZXRhZGF0YSBpcyBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZU51bWJlciwgcmVzdWx0LT5wYXJ0aWFsX3Jlc3VsdCwgbU51bVBhcnRpYWxSZXN1bHRzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpc1BhcnRpYWxSZXN1bHQgPSAocmVzdWx0LT5wYXJ0aWFsX3Jlc3VsdCA8IG1OdW1QYXJ0aWFsUmVzdWx0cyk7CisgICAgICAgICAgICAgICAgaWYgKGlzUGFydGlhbFJlc3VsdCkgeworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnBhcnRpYWxSZXN1bHQuY29sbGVjdGVkUmVzdWx0LmFwcGVuZChyZXN1bHQtPnJlc3VsdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBwYXJ0aWFsUmVzdWx0RW50cnk7CisgICAgICAgICAgICAgICAgcmVzID0gZmluZF9jYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkocmVzdWx0LT5yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1FVSVJLU19QQVJUSUFMX1JFU1VMVCwgJnBhcnRpYWxSZXN1bHRFbnRyeSk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBOQU1FX05PVF9GT1VORCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgcGFydGlhbFJlc3VsdEVudHJ5LmNvdW50ID4gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgcGFydGlhbFJlc3VsdEVudHJ5LmRhdGEudThbMF0gPT0KKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfUVVJUktTX1BBUlRJQUxfUkVTVUxUX1BBUlRJQUwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQSBwYXJ0aWFsIHJlc3VsdC4gRmxhZyB0aGlzIGFzIHN1Y2gsIGFuZCBjb2xsZWN0IHRoaXMKKyAgICAgICAgICAgICAgICAgICAgLy8gc2V0IG9mIG1ldGFkYXRhIGludG8gdGhlIGluLWZsaWdodCBlbnRyeS4KKyAgICAgICAgICAgICAgICAgICAgaXNQYXJ0aWFsUmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5wYXJ0aWFsUmVzdWx0LmNvbGxlY3RlZFJlc3VsdC5hcHBlbmQoCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQtPnJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QucGFydGlhbFJlc3VsdC5jb2xsZWN0ZWRSZXN1bHQuZXJhc2UoCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1FVSVJLU19QQVJUSUFMX1JFU1VMVCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaXNQYXJ0aWFsUmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgLy8gRmlyZSBvZmYgYSAzQS1vbmx5IHJlc3VsdCBpZiBwb3NzaWJsZQotICAgICAgICAgICAgICAgIGlmICghcmVxdWVzdC5wYXJ0aWFsUmVzdWx0UXVpcmsuaGF2ZVNlbnQzQSkgewotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnBhcnRpYWxSZXN1bHRRdWlyay5oYXZlU2VudDNBID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzUGFydGlhbDNBUXVpcmsoZnJhbWVOdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnJlcXVlc3RJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QucGFydGlhbFJlc3VsdFF1aXJrLmNvbGxlY3RlZFJlc3VsdCk7CisgICAgICAgICAgICAgICAgaWYgKCFyZXF1ZXN0LnBhcnRpYWxSZXN1bHQuaGF2ZVNlbnQzQSkgeworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnBhcnRpYWxSZXN1bHQuaGF2ZVNlbnQzQSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1BhcnRpYWwzQVJlc3VsdChmcmFtZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QucGFydGlhbFJlc3VsdC5jb2xsZWN0ZWRSZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnJlc3VsdEV4dHJhcyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgdGltZXN0YW1wID0gcmVxdWVzdC5jYXB0dXJlVGltZXN0YW1wOworICAgICAgICByZXN1bHRFeHRyYXMgPSByZXF1ZXN0LnJlc3VsdEV4dHJhczsKKyAgICAgICAgaGFzSW5wdXRCdWZmZXJJblJlcXVlc3QgPSByZXF1ZXN0Lmhhc0lucHV0QnVmZmVyOworCiAgICAgICAgIC8qKgogICAgICAgICAgKiBPbmUgb2YgdGhlIGZvbGxvd2luZyBtdXN0IGhhcHBlbiBiZWZvcmUgaXQncyBsZWdhbCB0byBjYWxsIHByb2Nlc3NfY2FwdHVyZV9yZXN1bHQsCiAgICAgICAgICAqIHVubGVzcyBwYXJ0aWFsIG1ldGFkYXRhIGlzIGJlaW5nIHByb3ZpZGVkOgogICAgICAgICAgKiAtIENBTUVSQTNfTVNHX1NIVVRURVIgKGV4cGVjdGVkIGR1cmluZyBub3JtYWwgb3BlcmF0aW9uKQogICAgICAgICAgKiAtIENBTUVSQTNfTVNHX0VSUk9SIChleHBlY3RlZCBkdXJpbmcgZmx1c2gpCiAgICAgICAgICAqLwotICAgICAgICBpZiAocmVxdWVzdC5yZXF1ZXN0U3RhdHVzID09IE9LICYmIHRpbWVzdGFtcCA9PSAwICYmICFwYXJ0aWFsUmVzdWx0UXVpcmspIHsKKyAgICAgICAgaWYgKHJlcXVlc3QucmVxdWVzdFN0YXR1cyA9PSBPSyAmJiB0aW1lc3RhbXAgPT0gMCAmJiAhaXNQYXJ0aWFsUmVzdWx0KSB7CiAgICAgICAgICAgICBTRVRfRVJSKCJDYWxsZWQgYmVmb3JlIHNodXR0ZXIgbm90aWZ5IGZvciBmcmFtZSAlZCIsCiAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCiAgICAgICAgIC8vIERpZCB3ZSBnZXQgdGhlIChmaW5hbCkgcmVzdWx0IG1ldGFkYXRhIGZvciB0aGlzIGNhcHR1cmU/Ci0gICAgICAgIGlmIChyZXN1bHQtPnJlc3VsdCAhPSBOVUxMICYmICFwYXJ0aWFsUmVzdWx0UXVpcmspIHsKKyAgICAgICAgaWYgKHJlc3VsdC0+cmVzdWx0ICE9IE5VTEwgJiYgIWlzUGFydGlhbFJlc3VsdCkgewogICAgICAgICAgICAgaWYgKHJlcXVlc3QuaGF2ZVJlc3VsdE1ldGFkYXRhKSB7CiAgICAgICAgICAgICAgICAgU0VUX0VSUigiQ2FsbGVkIG11bHRpcGxlIHRpbWVzIHdpdGggbWV0YWRhdGEgZm9yIGZyYW1lICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVVzZVBhcnRpYWxSZXN1bHRRdWlyayAmJgotICAgICAgICAgICAgICAgICAgICAhcmVxdWVzdC5wYXJ0aWFsUmVzdWx0UXVpcmsuY29sbGVjdGVkUmVzdWx0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGNvbGxlY3RlZFF1aXJrUmVzdWx0LmFjcXVpcmUoCi0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QucGFydGlhbFJlc3VsdFF1aXJrLmNvbGxlY3RlZFJlc3VsdCk7CisgICAgICAgICAgICBpZiAobVVzZVBhcnRpYWxSZXN1bHQgJiYKKyAgICAgICAgICAgICAgICAgICAgIXJlcXVlc3QucGFydGlhbFJlc3VsdC5jb2xsZWN0ZWRSZXN1bHQuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgY29sbGVjdGVkUGFydGlhbFJlc3VsdC5hY3F1aXJlKAorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnBhcnRpYWxSZXN1bHQuY29sbGVjdGVkUmVzdWx0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJlcXVlc3QuaGF2ZVJlc3VsdE1ldGFkYXRhID0gdHJ1ZTsKICAgICAgICAgfQogCi0gICAgICAgIHJlcXVlc3QubnVtQnVmZmVyc0xlZnQgLT0gcmVzdWx0LT5udW1fb3V0cHV0X2J1ZmZlcnM7Ci0KKyAgICAgICAgdWludDMyX3QgbnVtQnVmZmVyc1JldHVybmVkID0gcmVzdWx0LT5udW1fb3V0cHV0X2J1ZmZlcnM7CisgICAgICAgIGlmIChyZXN1bHQtPmlucHV0X2J1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoaGFzSW5wdXRCdWZmZXJJblJlcXVlc3QpIHsKKyAgICAgICAgICAgICAgICBudW1CdWZmZXJzUmV0dXJuZWQgKz0gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzOiBJbnB1dCBidWZmZXIgc2hvdWxkIGJlIE5VTEwgaWYgdGhlcmUgaXMgbm8gaW5wdXQiCisgICAgICAgICAgICAgICAgICAgICAgICAiIGJ1ZmZlciBzZW50IGluIHRoZSByZXF1ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmVxdWVzdC5udW1CdWZmZXJzTGVmdCAtPSBudW1CdWZmZXJzUmV0dXJuZWQ7CiAgICAgICAgIGlmIChyZXF1ZXN0Lm51bUJ1ZmZlcnNMZWZ0IDwgMCkgewogICAgICAgICAgICAgU0VUX0VSUigiVG9vIG1hbnkgYnVmZmVycyByZXR1cm5lZCBmb3IgZnJhbWUgJWQiLAogICAgICAgICAgICAgICAgICAgICBmcmFtZU51bWJlcik7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICAvLyBDaGVjayBpZiBldmVyeXRoaW5nIGhhcyBhcnJpdmVkIGZvciB0aGlzIHJlc3VsdCAoYnVmZmVycyBhbmQgbWV0YWRhdGEpCi0gICAgICAgIGlmIChyZXF1ZXN0LmhhdmVSZXN1bHRNZXRhZGF0YSAmJiByZXF1ZXN0Lm51bUJ1ZmZlcnNMZWZ0ID09IDApIHsKKyAgICAgICAgLy8gQ2hlY2sgaWYgZXZlcnl0aGluZyBoYXMgYXJyaXZlZCBmb3IgdGhpcyByZXN1bHQgKGJ1ZmZlcnMgYW5kIG1ldGFkYXRhKSwgcmVtb3ZlIGl0IGZyb20KKyAgICAgICAgLy8gSW5GbGlnaHRNYXAgaWYgYm90aCBhcnJpdmVkIG9yIEhBTCByZXBvcnRzIGVycm9yIGZvciB0aGlzIHJlcXVlc3QgKGkuZS4gZHVyaW5nIGZsdXNoKS4KKyAgICAgICAgaWYgKChyZXF1ZXN0LnJlcXVlc3RTdGF0dXMgIT0gT0spIHx8CisgICAgICAgICAgICAgICAgKHJlcXVlc3QuaGF2ZVJlc3VsdE1ldGFkYXRhICYmIHJlcXVlc3QubnVtQnVmZmVyc0xlZnQgPT0gMCkpIHsKICAgICAgICAgICAgIEFUUkFDRV9BU1lOQ19FTkQoImZyYW1lIGNhcHR1cmUiLCBmcmFtZU51bWJlcik7CiAgICAgICAgICAgICBtSW5GbGlnaHRNYXAucmVtb3ZlSXRlbXNBdChpZHgsIDEpOwogICAgICAgICB9CkBAIC0xNjgxLDMxICsyMDQ1LDMzIEBACiAgICAgICAgIC8vIFNhbml0eSBjaGVjayAtIGlmIHdlIGhhdmUgdG9vIG1hbnkgaW4tZmxpZ2h0IGZyYW1lcywgc29tZXRoaW5nIGhhcwogICAgICAgICAvLyBsaWtlbHkgZ29uZSB3cm9uZwogICAgICAgICBpZiAobUluRmxpZ2h0TWFwLnNpemUoKSA+IGtJbkZsaWdodFdhcm5MaW1pdCkgewotICAgICAgICAgICAgQ0xPR0UoIkluLWZsaWdodCBsaXN0IHRvbyBsYXJnZTogJWQiLCBtSW5GbGlnaHRNYXAuc2l6ZSgpKTsKKyAgICAgICAgICAgIENMT0dFKCJJbi1mbGlnaHQgbGlzdCB0b28gbGFyZ2U6ICV6dSIsIG1JbkZsaWdodE1hcC5zaXplKCkpOwogICAgICAgICB9CiAKICAgICB9CiAKICAgICAvLyBQcm9jZXNzIHRoZSByZXN1bHQgbWV0YWRhdGEsIGlmIHByb3ZpZGVkCiAgICAgYm9vbCBnb3RSZXN1bHQgPSBmYWxzZTsKLSAgICBpZiAocmVzdWx0LT5yZXN1bHQgIT0gTlVMTCAmJiAhcGFydGlhbFJlc3VsdFF1aXJrKSB7CisgICAgaWYgKHJlc3VsdC0+cmVzdWx0ICE9IE5VTEwgJiYgIWlzUGFydGlhbFJlc3VsdCkgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtT3V0cHV0TG9jayk7CiAKICAgICAgICAgZ290UmVzdWx0ID0gdHJ1ZTsKIAotICAgICAgICBpZiAoZnJhbWVOdW1iZXIgIT0gbU5leHRSZXN1bHRGcmFtZU51bWJlcikgeworICAgICAgICAvLyBUT0RPOiBuZWVkIHRvIHRyYWNrIGVycm9ycyBmb3IgdGlnaHRlciBib3VuZHMgb24gZXhwZWN0ZWQgZnJhbWUgbnVtYmVyCisgICAgICAgIGlmIChmcmFtZU51bWJlciA8IG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIpIHsKICAgICAgICAgICAgIFNFVF9FUlIoIk91dC1vZi1vcmRlciBjYXB0dXJlIHJlc3VsdCBtZXRhZGF0YSBzdWJtaXR0ZWQhICIKICAgICAgICAgICAgICAgICAgICAgIihnb3QgZnJhbWUgbnVtYmVyICVkLCBleHBlY3RpbmcgJWQpIiwKICAgICAgICAgICAgICAgICAgICAgZnJhbWVOdW1iZXIsIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIrKzsKKyAgICAgICAgbU5leHRSZXN1bHRGcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyICsgMTsKIAotICAgICAgICBDYW1lcmFNZXRhZGF0YSBjYXB0dXJlUmVzdWx0OwotICAgICAgICBjYXB0dXJlUmVzdWx0ID0gcmVzdWx0LT5yZXN1bHQ7CisgICAgICAgIENhcHR1cmVSZXN1bHQgY2FwdHVyZVJlc3VsdDsKKyAgICAgICAgY2FwdHVyZVJlc3VsdC5tUmVzdWx0RXh0cmFzID0gcmVzdWx0RXh0cmFzOworICAgICAgICBjYXB0dXJlUmVzdWx0Lm1NZXRhZGF0YSA9IHJlc3VsdC0+cmVzdWx0OwogCi0gICAgICAgIGlmIChjYXB0dXJlUmVzdWx0LnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfRlJBTUVfQ09VTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdCopJmZyYW1lTnVtYmVyLCAxKSAhPSBPSykgeworICAgICAgICBpZiAoY2FwdHVyZVJlc3VsdC5tTWV0YWRhdGEudXBkYXRlKEFORFJPSURfUkVRVUVTVF9GUkFNRV9DT1VOVCwKKyAgICAgICAgICAgICAgICAoaW50MzJfdCopJmZyYW1lTnVtYmVyLCAxKSAhPSBPSykgewogICAgICAgICAgICAgU0VUX0VSUigiRmFpbGVkIHRvIHNldCBmcmFtZSMgaW4gbWV0YWRhdGEgKCVkKSIsCiAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyKTsKICAgICAgICAgICAgIGdvdFJlc3VsdCA9IGZhbHNlOwpAQCAtMTcxNSwzMiArMjA4MSwzNiBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gQXBwZW5kIGFueSBwcmV2aW91cyBwYXJ0aWFscyB0byBmb3JtIGEgY29tcGxldGUgcmVzdWx0Ci0gICAgICAgIGlmIChtVXNlUGFydGlhbFJlc3VsdFF1aXJrICYmICFjb2xsZWN0ZWRRdWlya1Jlc3VsdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGNhcHR1cmVSZXN1bHQuYXBwZW5kKGNvbGxlY3RlZFF1aXJrUmVzdWx0KTsKKyAgICAgICAgaWYgKG1Vc2VQYXJ0aWFsUmVzdWx0ICYmICFjb2xsZWN0ZWRQYXJ0aWFsUmVzdWx0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgY2FwdHVyZVJlc3VsdC5tTWV0YWRhdGEuYXBwZW5kKGNvbGxlY3RlZFBhcnRpYWxSZXN1bHQpOwogICAgICAgICB9CiAKLSAgICAgICAgY2FwdHVyZVJlc3VsdC5zb3J0KCk7CisgICAgICAgIGNhcHR1cmVSZXN1bHQubU1ldGFkYXRhLnNvcnQoKTsKIAogICAgICAgICAvLyBDaGVjayB0aGF0IHRoZXJlJ3MgYSB0aW1lc3RhbXAgaW4gdGhlIHJlc3VsdCBtZXRhZGF0YQogCiAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBlbnRyeSA9Ci0gICAgICAgICAgICAgICAgY2FwdHVyZVJlc3VsdC5maW5kKEFORFJPSURfU0VOU09SX1RJTUVTVEFNUCk7CisgICAgICAgICAgICAgICAgY2FwdHVyZVJlc3VsdC5tTWV0YWRhdGEuZmluZChBTkRST0lEX1NFTlNPUl9USU1FU1RBTVApOwogICAgICAgICBpZiAoZW50cnkuY291bnQgPT0gMCkgewogICAgICAgICAgICAgU0VUX0VSUigiTm8gdGltZXN0YW1wIHByb3ZpZGVkIGJ5IEhBTCBmb3IgZnJhbWUgJWQhIiwKICAgICAgICAgICAgICAgICAgICAgZnJhbWVOdW1iZXIpOwogICAgICAgICAgICAgZ290UmVzdWx0ID0gZmFsc2U7CiAgICAgICAgIH0gZWxzZSBpZiAodGltZXN0YW1wICE9IGVudHJ5LmRhdGEuaTY0WzBdKSB7CiAgICAgICAgICAgICBTRVRfRVJSKCJUaW1lc3RhbXAgbWlzbWF0Y2ggYmV0d2VlbiBzaHV0dGVyIG5vdGlmeSBhbmQgcmVzdWx0IgotICAgICAgICAgICAgICAgICAgICAiIG1ldGFkYXRhIGZvciBmcmFtZSAlZCAoJWxsZCB2cyAlbGxkIHJlc3BlY3RpdmVseSkiLAorICAgICAgICAgICAgICAgICAgICAiIG1ldGFkYXRhIGZvciBmcmFtZSAlZCAoJSIgUFJJZDY0ICIgdnMgJSIgUFJJZDY0ICIgcmVzcGVjdGl2ZWx5KSIsCiAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyLCB0aW1lc3RhbXAsIGVudHJ5LmRhdGEuaTY0WzBdKTsKICAgICAgICAgICAgIGdvdFJlc3VsdCA9IGZhbHNlOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGdvdFJlc3VsdCkgewogICAgICAgICAgICAgLy8gVmFsaWQgcmVzdWx0LCBpbnNlcnQgaW50byBxdWV1ZQotICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEmIHF1ZXVlZFJlc3VsdCA9Ci0gICAgICAgICAgICAgICAgKm1SZXN1bHRRdWV1ZS5pbnNlcnQobVJlc3VsdFF1ZXVlLmVuZCgpLCBDYW1lcmFNZXRhZGF0YSgpKTsKLSAgICAgICAgICAgIHF1ZXVlZFJlc3VsdC5zd2FwKGNhcHR1cmVSZXN1bHQpOworICAgICAgICAgICAgTGlzdDxDYXB0dXJlUmVzdWx0Pjo6aXRlcmF0b3IgcXVldWVkUmVzdWx0ID0KKyAgICAgICAgICAgICAgICAgICAgbVJlc3VsdFF1ZXVlLmluc2VydChtUmVzdWx0UXVldWUuZW5kKCksIENhcHR1cmVSZXN1bHQoY2FwdHVyZVJlc3VsdCkpOworICAgICAgICAgICAgQUxPR1ZWKCIlczogcmVzdWx0IHJlcXVlc3RJZCA9ICUiIFBSSWQzMiAiLCBmcmFtZU51bWJlciA9ICUiIFBSSWQ2NAorICAgICAgICAgICAgICAgICAgICIsIGJ1cnN0SWQgPSAlIiBQUklkMzIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICBxdWV1ZWRSZXN1bHQtPm1SZXN1bHRFeHRyYXMucmVxdWVzdElkLAorICAgICAgICAgICAgICAgICAgIHF1ZXVlZFJlc3VsdC0+bVJlc3VsdEV4dHJhcy5mcmFtZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICBxdWV1ZWRSZXN1bHQtPm1SZXN1bHRFeHRyYXMuYnVyc3RJZCk7CiAgICAgICAgIH0KICAgICB9IC8vIHNjb3BlIGZvciBtT3V0cHV0TG9jawogCkBAIC0xNzUzLDExICsyMTIzLDMwIEBACiAgICAgICAgIC8vIE5vdGU6IHN0cmVhbSBtYXkgYmUgZGVhbGxvY2F0ZWQgYXQgdGhpcyBwb2ludCwgaWYgdGhpcyBidWZmZXIgd2FzIHRoZQogICAgICAgICAvLyBsYXN0IHJlZmVyZW5jZSB0byBpdC4KICAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIkNhbid0IHJldHVybiBidWZmZXIgJWQgZm9yIGZyYW1lICVkIHRvIGl0cyBzdHJlYW06ICIKKyAgICAgICAgICAgIEFMT0dFKCJDYW4ndCByZXR1cm4gYnVmZmVyICV6dSBmb3IgZnJhbWUgJWQgdG8gaXRzIHN0cmVhbTogIgogICAgICAgICAgICAgICAgICAgICAiICVzICglZCkiLCBpLCBmcmFtZU51bWJlciwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpZiAocmVzdWx0LT5pbnB1dF9idWZmZXIgIT0gTlVMTCkgeworICAgICAgICBpZiAoaGFzSW5wdXRCdWZmZXJJblJlcXVlc3QpIHsKKyAgICAgICAgICAgIENhbWVyYTNTdHJlYW0gKnN0cmVhbSA9CisgICAgICAgICAgICAgICAgQ2FtZXJhM1N0cmVhbTo6Y2FzdChyZXN1bHQtPmlucHV0X2J1ZmZlci0+c3RyZWFtKTsKKyAgICAgICAgICAgIHJlcyA9IHN0cmVhbS0+cmV0dXJuSW5wdXRCdWZmZXIoKihyZXN1bHQtPmlucHV0X2J1ZmZlcikpOworICAgICAgICAgICAgLy8gTm90ZTogc3RyZWFtIG1heSBiZSBkZWFsbG9jYXRlZCBhdCB0aGlzIHBvaW50LCBpZiB0aGlzIGJ1ZmZlciB3YXMgdGhlCisgICAgICAgICAgICAvLyBsYXN0IHJlZmVyZW5jZSB0byBpdC4KKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFJlcXVlc3RUaHJlYWQ6IENhbid0IHJldHVybiBpbnB1dCBidWZmZXIgZm9yIGZyYW1lICVkIHRvIgorICAgICAgICAgICAgICAgICAgICAgICIgIGl0cyBzdHJlYW06JXMgKCVkKSIsICBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgZnJhbWVOdW1iZXIsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIiVzOiBJbnB1dCBidWZmZXIgc2hvdWxkIGJlIE5VTEwgaWYgdGhlcmUgaXMgbm8gaW5wdXQiCisgICAgICAgICAgICAgICAgICAgICIgYnVmZmVyIHNlbnQgaW4gdGhlIHJlcXVlc3QsIHNraXBwaW5nIGlucHV0IGJ1ZmZlciByZXR1cm4uIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIEZpbmFsbHksIHNpZ25hbCBhbnkgd2FpdGVycyBmb3IgbmV3IGZyYW1lcwogCiAgICAgaWYgKGdvdFJlc3VsdCkgewpAQCAtMTc2Niw4ICsyMTU1LDYgQEAKIAogfQogCi0KLQogdm9pZCBDYW1lcmEzRGV2aWNlOjpub3RpZnkoY29uc3QgY2FtZXJhM19ub3RpZnlfbXNnICptc2cpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE5vdGlmaWNhdGlvbkxpc3RlbmVyICpsaXN0ZW5lcjsKQEAgLTE3ODMsNzIgKzIxNzAsMTEgQEAKIAogICAgIHN3aXRjaCAobXNnLT50eXBlKSB7CiAgICAgICAgIGNhc2UgQ0FNRVJBM19NU0dfRVJST1I6IHsKLSAgICAgICAgICAgIGludCBzdHJlYW1JZCA9IDA7Ci0gICAgICAgICAgICBpZiAobXNnLT5tZXNzYWdlLmVycm9yLmVycm9yX3N0cmVhbSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQ2FtZXJhM1N0cmVhbSAqc3RyZWFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgIENhbWVyYTNTdHJlYW06OmNhc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLT5tZXNzYWdlLmVycm9yLmVycm9yX3N0cmVhbSk7Ci0gICAgICAgICAgICAgICAgc3RyZWFtSWQgPSBzdHJlYW0tPmdldElkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiQ2FtZXJhICVkOiAlczogSEFMIGVycm9yLCBmcmFtZSAlZCwgc3RyZWFtICVkOiAlZCIsCi0gICAgICAgICAgICAgICAgICAgIG1JZCwgX19GVU5DVElPTl9fLCBtc2ctPm1lc3NhZ2UuZXJyb3IuZnJhbWVfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICBzdHJlYW1JZCwgbXNnLT5tZXNzYWdlLmVycm9yLmVycm9yX2NvZGUpOwotCi0gICAgICAgICAgICAvLyBTZXQgcmVxdWVzdCBlcnJvciBzdGF0dXMgZm9yIHRoZSByZXF1ZXN0IGluIHRoZSBpbi1mbGlnaHQgdHJhY2tpbmcKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5GbGlnaHRMb2NrKTsKLSAgICAgICAgICAgICAgICBzc2l6ZV90IGlkeCA9IG1JbkZsaWdodE1hcC5pbmRleE9mS2V5KG1zZy0+bWVzc2FnZS5lcnJvci5mcmFtZV9udW1iZXIpOwotICAgICAgICAgICAgICAgIGlmIChpZHggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBtSW5GbGlnaHRNYXAuZWRpdFZhbHVlQXQoaWR4KS5yZXF1ZXN0U3RhdHVzID0gbXNnLT5tZXNzYWdlLmVycm9yLmVycm9yX2NvZGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGxpc3RlbmVyLT5ub3RpZnlFcnJvcihtc2ctPm1lc3NhZ2UuZXJyb3IuZXJyb3JfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZy0+bWVzc2FnZS5lcnJvci5mcmFtZV9udW1iZXIsIHN0cmVhbUlkKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vdGlmeUVycm9yKG1zZy0+bWVzc2FnZS5lcnJvciwgbGlzdGVuZXIpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBDQU1FUkEzX01TR19TSFVUVEVSOiB7Ci0gICAgICAgICAgICBzc2l6ZV90IGlkeDsKLSAgICAgICAgICAgIHVpbnQzMl90IGZyYW1lTnVtYmVyID0gbXNnLT5tZXNzYWdlLnNodXR0ZXIuZnJhbWVfbnVtYmVyOwotICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAgPSBtc2ctPm1lc3NhZ2Uuc2h1dHRlci50aW1lc3RhbXA7Ci0gICAgICAgICAgICAvLyBWZXJpZnkgb3JkZXJpbmcgb2Ygc2h1dHRlciBub3RpZmljYXRpb25zCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU91dHB1dExvY2spOwotICAgICAgICAgICAgICAgIGlmIChmcmFtZU51bWJlciAhPSBtTmV4dFNodXR0ZXJGcmFtZU51bWJlcikgewotICAgICAgICAgICAgICAgICAgICBTRVRfRVJSKCJTaHV0dGVyIG5vdGlmaWNhdGlvbiBvdXQtb2Ytb3JkZXIuIEV4cGVjdGVkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90aWZpY2F0aW9uIGZvciBmcmFtZSAlZCwgZ290IGZyYW1lICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmV4dFNodXR0ZXJGcmFtZU51bWJlciwgZnJhbWVOdW1iZXIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbU5leHRTaHV0dGVyRnJhbWVOdW1iZXIrKzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50MzJfdCByZXF1ZXN0SWQgPSAtMTsKLQotICAgICAgICAgICAgLy8gU2V0IHRpbWVzdGFtcCBmb3IgdGhlIHJlcXVlc3QgaW4gdGhlIGluLWZsaWdodCB0cmFja2luZwotICAgICAgICAgICAgLy8gYW5kIGdldCB0aGUgcmVxdWVzdCBJRCB0byBzZW5kIHVwc3RyZWFtCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUluRmxpZ2h0TG9jayk7Ci0gICAgICAgICAgICAgICAgaWR4ID0gbUluRmxpZ2h0TWFwLmluZGV4T2ZLZXkoZnJhbWVOdW1iZXIpOwotICAgICAgICAgICAgICAgIGlmIChpZHggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBJbkZsaWdodFJlcXVlc3QgJnIgPSBtSW5GbGlnaHRNYXAuZWRpdFZhbHVlQXQoaWR4KTsKLSAgICAgICAgICAgICAgICAgICAgci5jYXB0dXJlVGltZXN0YW1wID0gdGltZXN0YW1wOwotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQgPSByLnJlcXVlc3RJZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaWR4IDwgMCkgewotICAgICAgICAgICAgICAgIFNFVF9FUlIoIlNodXR0ZXIgbm90aWZpY2F0aW9uIGZvciBub24tZXhpc3RlbnQgZnJhbWUgbnVtYmVyICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWVigiQ2FtZXJhICVkOiAlczogU2h1dHRlciBmaXJlZCBmb3IgZnJhbWUgJWQgKGlkICVkKSBhdCAlbGxkIiwKLSAgICAgICAgICAgICAgICAgICAgbUlkLCBfX0ZVTkNUSU9OX18sIGZyYW1lTnVtYmVyLCByZXF1ZXN0SWQsIHRpbWVzdGFtcCk7Ci0gICAgICAgICAgICAvLyBDYWxsIGxpc3RlbmVyLCBpZiBhbnkKLSAgICAgICAgICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbGlzdGVuZXItPm5vdGlmeVNodXR0ZXIocmVxdWVzdElkLCB0aW1lc3RhbXApOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgbm90aWZ5U2h1dHRlcihtc2ctPm1lc3NhZ2Uuc2h1dHRlciwgbGlzdGVuZXIpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgZGVmYXVsdDoKQEAgLTE4NTcsNiArMjE4MywxMjEgQEAKICAgICB9CiB9CiAKK3ZvaWQgQ2FtZXJhM0RldmljZTo6bm90aWZ5RXJyb3IoY29uc3QgY2FtZXJhM19lcnJvcl9tc2dfdCAmbXNnLAorICAgICAgICBOb3RpZmljYXRpb25MaXN0ZW5lciAqbGlzdGVuZXIpIHsKKworICAgIC8vIE1hcCBjYW1lcmEgSEFMIGVycm9yIGNvZGVzIHRvIElDYW1lcmFEZXZpY2VDYWxsYmFjayBlcnJvciBjb2RlcworICAgIC8vIEluZGV4IGludG8gdGhpcyB3aXRoIHRoZSBIQUwgZXJyb3IgY29kZQorICAgIHN0YXRpYyBjb25zdCBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpDYW1lcmFFcnJvckNvZGUKKyAgICAgICAgICAgIGhhbEVycm9yTWFwW0NBTUVSQTNfTVNHX05VTV9FUlJPUlNdID0geworICAgICAgICAvLyAwID0gVW51c2VkIGVycm9yIGNvZGUKKyAgICAgICAgSUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0lOVkFMSURfRVJST1IsCisgICAgICAgIC8vIDEgPSBDQU1FUkEzX01TR19FUlJPUl9ERVZJQ0UKKyAgICAgICAgSUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0RFVklDRSwKKyAgICAgICAgLy8gMiA9IENBTUVSQTNfTVNHX0VSUk9SX1JFUVVFU1QKKyAgICAgICAgSUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFUVVFU1QsCisgICAgICAgIC8vIDMgPSBDQU1FUkEzX01TR19FUlJPUl9SRVNVTFQKKyAgICAgICAgSUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFU1VMVCwKKyAgICAgICAgLy8gNCA9IENBTUVSQTNfTVNHX0VSUk9SX0JVRkZFUgorICAgICAgICBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfQlVGRkVSCisgICAgfTsKKworICAgIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkNhbWVyYUVycm9yQ29kZSBlcnJvckNvZGUgPQorICAgICAgICAgICAgKChtc2cuZXJyb3JfY29kZSA+PSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAobXNnLmVycm9yX2NvZGUgPCBDQU1FUkEzX01TR19OVU1fRVJST1JTKSkgPworICAgICAgICAgICAgaGFsRXJyb3JNYXBbbXNnLmVycm9yX2NvZGVdIDoKKyAgICAgICAgICAgIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9JTlZBTElEX0VSUk9SOworCisgICAgaW50IHN0cmVhbUlkID0gMDsKKyAgICBpZiAobXNnLmVycm9yX3N0cmVhbSAhPSBOVUxMKSB7CisgICAgICAgIENhbWVyYTNTdHJlYW0gKnN0cmVhbSA9CisgICAgICAgICAgICAgICAgQ2FtZXJhM1N0cmVhbTo6Y2FzdChtc2cuZXJyb3Jfc3RyZWFtKTsKKyAgICAgICAgc3RyZWFtSWQgPSBzdHJlYW0tPmdldElkKCk7CisgICAgfQorICAgIEFMT0dWKCJDYW1lcmEgJWQ6ICVzOiBIQUwgZXJyb3IsIGZyYW1lICVkLCBzdHJlYW0gJWQ6ICVkIiwKKyAgICAgICAgICAgIG1JZCwgX19GVU5DVElPTl9fLCBtc2cuZnJhbWVfbnVtYmVyLAorICAgICAgICAgICAgc3RyZWFtSWQsIG1zZy5lcnJvcl9jb2RlKTsKKworICAgIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzOworICAgIHN3aXRjaCAoZXJyb3JDb2RlKSB7CisgICAgICAgIGNhc2UgSUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0RFVklDRToKKyAgICAgICAgICAgIC8vIFNFVF9FUlIgY2FsbHMgbm90aWZ5RXJyb3IKKyAgICAgICAgICAgIFNFVF9FUlIoIkNhbWVyYSBIQUwgcmVwb3J0ZWQgc2VyaW91cyBkZXZpY2UgZXJyb3IiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9SRVFVRVNUOgorICAgICAgICBjYXNlIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9SRVNVTFQ6CisgICAgICAgIGNhc2UgSUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0JVRkZFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5GbGlnaHRMb2NrKTsKKyAgICAgICAgICAgICAgICBzc2l6ZV90IGlkeCA9IG1JbkZsaWdodE1hcC5pbmRleE9mS2V5KG1zZy5mcmFtZV9udW1iZXIpOworICAgICAgICAgICAgICAgIGlmIChpZHggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBJbkZsaWdodFJlcXVlc3QgJnIgPSBtSW5GbGlnaHRNYXAuZWRpdFZhbHVlQXQoaWR4KTsKKyAgICAgICAgICAgICAgICAgICAgci5yZXF1ZXN0U3RhdHVzID0gbXNnLmVycm9yX2NvZGU7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdEV4dHJhcyA9IHIucmVzdWx0RXh0cmFzOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdEV4dHJhcy5mcmFtZU51bWJlciA9IG1zZy5mcmFtZV9udW1iZXI7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDYW1lcmEgJWQ6ICVzOiBjYW5ub3QgZmluZCBpbi1mbGlnaHQgcmVxdWVzdCBvbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZyYW1lICUiIFBSSWQ2NCAiIGVycm9yIiwgbUlkLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGxpc3RlbmVyLT5ub3RpZnlFcnJvcihlcnJvckNvZGUsIHJlc3VsdEV4dHJhcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDYW1lcmEgJWQ6ICVzOiBubyBsaXN0ZW5lciBhdmFpbGFibGUiLCBtSWQsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vIFNFVF9FUlIgY2FsbHMgbm90aWZ5RXJyb3IKKyAgICAgICAgICAgIFNFVF9FUlIoIlVua25vd24gZXJyb3IgbWVzc2FnZSBmcm9tIEhBTDogJWQiLCBtc2cuZXJyb3JfY29kZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgQ2FtZXJhM0RldmljZTo6bm90aWZ5U2h1dHRlcihjb25zdCBjYW1lcmEzX3NodXR0ZXJfbXNnX3QgJm1zZywKKyAgICAgICAgTm90aWZpY2F0aW9uTGlzdGVuZXIgKmxpc3RlbmVyKSB7CisgICAgc3NpemVfdCBpZHg7CisgICAgLy8gVmVyaWZ5IG9yZGVyaW5nIG9mIHNodXR0ZXIgbm90aWZpY2F0aW9ucworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU91dHB1dExvY2spOworICAgICAgICAvLyBUT0RPOiBuZWVkIHRvIHRyYWNrIGVycm9ycyBmb3IgdGlnaHRlciBib3VuZHMgb24gZXhwZWN0ZWQgZnJhbWUgbnVtYmVyLgorICAgICAgICBpZiAobXNnLmZyYW1lX251bWJlciA8IG1OZXh0U2h1dHRlckZyYW1lTnVtYmVyKSB7CisgICAgICAgICAgICBTRVRfRVJSKCJTaHV0dGVyIG5vdGlmaWNhdGlvbiBvdXQtb2Ytb3JkZXIuIEV4cGVjdGVkICIKKyAgICAgICAgICAgICAgICAgICAgIm5vdGlmaWNhdGlvbiBmb3IgZnJhbWUgJWQsIGdvdCBmcmFtZSAlZCIsCisgICAgICAgICAgICAgICAgICAgIG1OZXh0U2h1dHRlckZyYW1lTnVtYmVyLCBtc2cuZnJhbWVfbnVtYmVyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtTmV4dFNodXR0ZXJGcmFtZU51bWJlciA9IG1zZy5mcmFtZV9udW1iZXIgKyAxOworICAgIH0KKworICAgIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzOworCisgICAgLy8gU2V0IHRpbWVzdGFtcCBmb3IgdGhlIHJlcXVlc3QgaW4gdGhlIGluLWZsaWdodCB0cmFja2luZworICAgIC8vIGFuZCBnZXQgdGhlIHJlcXVlc3QgSUQgdG8gc2VuZCB1cHN0cmVhbQorICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUluRmxpZ2h0TG9jayk7CisgICAgICAgIGlkeCA9IG1JbkZsaWdodE1hcC5pbmRleE9mS2V5KG1zZy5mcmFtZV9udW1iZXIpOworICAgICAgICBpZiAoaWR4ID49IDApIHsKKyAgICAgICAgICAgIEluRmxpZ2h0UmVxdWVzdCAmciA9IG1JbkZsaWdodE1hcC5lZGl0VmFsdWVBdChpZHgpOworICAgICAgICAgICAgci5jYXB0dXJlVGltZXN0YW1wID0gbXNnLnRpbWVzdGFtcDsKKyAgICAgICAgICAgIHJlc3VsdEV4dHJhcyA9IHIucmVzdWx0RXh0cmFzOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpZHggPCAwKSB7CisgICAgICAgIFNFVF9FUlIoIlNodXR0ZXIgbm90aWZpY2F0aW9uIGZvciBub24tZXhpc3RlbnQgZnJhbWUgbnVtYmVyICVkIiwKKyAgICAgICAgICAgICAgICBtc2cuZnJhbWVfbnVtYmVyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HVlYoIkNhbWVyYSAlZDogJXM6IFNodXR0ZXIgZmlyZWQgZm9yIGZyYW1lICVkIChpZCAlZCkgYXQgJSIgUFJJZDY0LAorICAgICAgICAgICAgbUlkLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICBtc2cuZnJhbWVfbnVtYmVyLCByZXN1bHRFeHRyYXMucmVxdWVzdElkLCBtc2cudGltZXN0YW1wKTsKKyAgICAvLyBDYWxsIGxpc3RlbmVyLCBpZiBhbnkKKyAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICBsaXN0ZW5lci0+bm90aWZ5U2h1dHRlcihyZXN1bHRFeHRyYXMsIG1zZy50aW1lc3RhbXApOworICAgIH0KK30KKworCiBDYW1lcmFNZXRhZGF0YSBDYW1lcmEzRGV2aWNlOjpnZXRMYXRlc3RSZXF1ZXN0TG9ja2VkKCkgewogICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7CiAKQEAgLTE4NjksNiArMjMxMCw3IEBACiAgICAgcmV0dXJuIHJldFZhbDsKIH0KIAorCiAvKioKICAqIFJlcXVlc3RUaHJlYWQgaW5uZXIgY2xhc3MgbWV0aG9kcwogICovCkBAIC0xODg1LDE5ICsyMzI3LDQwIEBACiAgICAgICAgIG1Eb1BhdXNlKGZhbHNlKSwKICAgICAgICAgbVBhdXNlZCh0cnVlKSwKICAgICAgICAgbUZyYW1lTnVtYmVyKDApLAotICAgICAgICBtTGF0ZXN0UmVxdWVzdElkKE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIG1MYXRlc3RSZXF1ZXN0SWQoTkFNRV9OT1RfRk9VTkQpLAorICAgICAgICBtQ3VycmVudEFmVHJpZ2dlcklkKDApLAorICAgICAgICBtQ3VycmVudFByZUNhcHR1cmVUcmlnZ2VySWQoMCksCisgICAgICAgIG1SZXBlYXRpbmdMYXN0RnJhbWVOdW1iZXIoTk9fSU5fRkxJR0hUX1JFUEVBVElOR19GUkFNRVMpIHsKICAgICBtU3RhdHVzSWQgPSBzdGF0dXNUcmFja2VyLT5hZGRDb21wb25lbnQoKTsKIH0KIAordm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpzZXROb3RpZnlDYWxsYmFjaygKKyAgICAgICAgTm90aWZpY2F0aW9uTGlzdGVuZXIgKmxpc3RlbmVyKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVJlcXVlc3RMb2NrKTsKKyAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKK30KKwogdm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpjb25maWd1cmF0aW9uQ29tcGxldGUoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVJlcXVlc3RMb2NrKTsKICAgICBtUmVjb25maWd1cmVkID0gdHJ1ZTsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6cXVldWVSZXF1ZXN0KAotICAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QpIHsKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OnF1ZXVlUmVxdWVzdExpc3QoCisgICAgICAgIExpc3Q8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4gJnJlcXVlc3RzLAorICAgICAgICAvKm91dCovCisgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlcikgewogICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7Ci0gICAgbVJlcXVlc3RRdWV1ZS5wdXNoX2JhY2socmVxdWVzdCk7CisgICAgZm9yIChMaXN0PHNwPENhcHR1cmVSZXF1ZXN0PiA+OjppdGVyYXRvciBpdCA9IHJlcXVlc3RzLmJlZ2luKCk7IGl0ICE9IHJlcXVlc3RzLmVuZCgpOworICAgICAgICAgICAgKytpdCkgeworICAgICAgICBtUmVxdWVzdFF1ZXVlLnB1c2hfYmFjaygqaXQpOworICAgIH0KKworICAgIGlmIChsYXN0RnJhbWVOdW1iZXIgIT0gTlVMTCkgeworICAgICAgICAqbGFzdEZyYW1lTnVtYmVyID0gbUZyYW1lTnVtYmVyICsgbVJlcXVlc3RRdWV1ZS5zaXplKCkgLSAxOworICAgICAgICBBTE9HVigiJXM6IHJlcXVlc3RJZCAlZCwgbUZyYW1lTnVtYmVyICUiIFBSSWQzMiAiLCBsYXN0RnJhbWVOdW1iZXIgJSIgUFJJZDY0ICIuIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAoKihyZXF1ZXN0cy5iZWdpbigpKSktPm1SZXN1bHRFeHRyYXMucmVxdWVzdElkLCBtRnJhbWVOdW1iZXIsCisgICAgICAgICAgICAgICpsYXN0RnJhbWVOdW1iZXIpOworICAgIH0KIAogICAgIHVucGF1c2VGb3JOZXdSZXF1ZXN0cygpOwogCkBAIC0xOTYxLDI4ICsyNDI0LDcyIEBACiB9CiAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OnNldFJlcGVhdGluZ1JlcXVlc3RzKAotICAgICAgICBjb25zdCBSZXF1ZXN0TGlzdCAmcmVxdWVzdHMpIHsKKyAgICAgICAgY29uc3QgUmVxdWVzdExpc3QgJnJlcXVlc3RzLAorICAgICAgICAvKm91dCovCisgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlcikgewogICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7CisgICAgaWYgKGxhc3RGcmFtZU51bWJlciAhPSBOVUxMKSB7CisgICAgICAgICpsYXN0RnJhbWVOdW1iZXIgPSBtUmVwZWF0aW5nTGFzdEZyYW1lTnVtYmVyOworICAgIH0KICAgICBtUmVwZWF0aW5nUmVxdWVzdHMuY2xlYXIoKTsKICAgICBtUmVwZWF0aW5nUmVxdWVzdHMuaW5zZXJ0KG1SZXBlYXRpbmdSZXF1ZXN0cy5iZWdpbigpLAogICAgICAgICAgICAgcmVxdWVzdHMuYmVnaW4oKSwgcmVxdWVzdHMuZW5kKCkpOwogCiAgICAgdW5wYXVzZUZvck5ld1JlcXVlc3RzKCk7CiAKKyAgICBtUmVwZWF0aW5nTGFzdEZyYW1lTnVtYmVyID0gTk9fSU5fRkxJR0hUX1JFUEVBVElOR19GUkFNRVM7CiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpjbGVhclJlcGVhdGluZ1JlcXVlc3RzKCkgeworYm9vbCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjppc1JlcGVhdGluZ1JlcXVlc3RMb2NrZWQoY29uc3Qgc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3RJbikgeworICAgIGlmIChtUmVwZWF0aW5nUmVxdWVzdHMuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGludDMyX3QgcmVxdWVzdElkID0gcmVxdWVzdEluLT5tUmVzdWx0RXh0cmFzLnJlcXVlc3RJZDsKKyAgICBjb25zdCBSZXF1ZXN0TGlzdCAmcmVwZWF0UmVxdWVzdHMgPSBtUmVwZWF0aW5nUmVxdWVzdHM7CisgICAgLy8gQWxsIHJlcGVhdGluZyByZXF1ZXN0cyBhcmUgZ3VhcmFudGVlZCB0byBoYXZlIHNhbWUgaWQgc28gb25seSBjaGVjayBmaXJzdCBxdWVzdAorICAgIGNvbnN0IHNwPENhcHR1cmVSZXF1ZXN0PiBmaXJzdFJlcXVlc3QgPSAqcmVwZWF0UmVxdWVzdHMuYmVnaW4oKTsKKyAgICByZXR1cm4gKGZpcnN0UmVxdWVzdC0+bVJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQgPT0gcmVxdWVzdElkKTsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6Y2xlYXJSZXBlYXRpbmdSZXF1ZXN0cygvKm91dCovaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVJlcXVlc3RMb2NrKTsKICAgICBtUmVwZWF0aW5nUmVxdWVzdHMuY2xlYXIoKTsKKyAgICBpZiAobGFzdEZyYW1lTnVtYmVyICE9IE5VTEwpIHsKKyAgICAgICAgKmxhc3RGcmFtZU51bWJlciA9IG1SZXBlYXRpbmdMYXN0RnJhbWVOdW1iZXI7CisgICAgfQorICAgIG1SZXBlYXRpbmdMYXN0RnJhbWVOdW1iZXIgPSBOT19JTl9GTElHSFRfUkVQRUFUSU5HX0ZSQU1FUzsKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OmNsZWFyKCkgeworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6Y2xlYXIoCisgICAgICAgIE5vdGlmaWNhdGlvbkxpc3RlbmVyICpsaXN0ZW5lciwKKyAgICAgICAgLypvdXQqL2ludDY0X3QgKmxhc3RGcmFtZU51bWJlcikgewogICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7CisgICAgQUxPR1YoIlJlcXVlc3RUaHJlYWQ6OiVzOiIsIF9fRlVOQ1RJT05fXyk7CisKICAgICBtUmVwZWF0aW5nUmVxdWVzdHMuY2xlYXIoKTsKKworICAgIC8vIFNlbmQgZXJyb3JzIGZvciBhbGwgcmVxdWVzdHMgcGVuZGluZyBpbiB0aGUgcmVxdWVzdCBxdWV1ZSwgaW5jbHVkaW5nCisgICAgLy8gcGVuZGluZyByZXBlYXRpbmcgcmVxdWVzdHMKKyAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICBmb3IgKFJlcXVlc3RMaXN0OjppdGVyYXRvciBpdCA9IG1SZXF1ZXN0UXVldWUuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgaXQgIT0gbVJlcXVlc3RRdWV1ZS5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgLy8gU2V0IHRoZSBmcmFtZSBudW1iZXIgdGhpcyByZXF1ZXN0IHdvdWxkIGhhdmUgaGFkLCBpZiBpdAorICAgICAgICAgICAgLy8gaGFkIGJlZW4gc3VibWl0dGVkOyB0aGlzIGZyYW1lIG51bWJlciB3aWxsIG5vdCBiZSByZXVzZWQuCisgICAgICAgICAgICAvLyBUaGUgcmVxdWVzdElkIGFuZCBidXJzdElkIGZpZWxkcyB3ZXJlIHNldCB3aGVuIHRoZSByZXF1ZXN0IHdhcworICAgICAgICAgICAgLy8gc3VibWl0dGVkIG9yaWdpbmFsbHkgKGluIGNvbnZlcnRNZXRhZGF0YUxpc3RUb1JlcXVlc3RMaXN0TG9ja2VkKQorICAgICAgICAgICAgKCppdCktPm1SZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIgPSBtRnJhbWVOdW1iZXIrKzsKKyAgICAgICAgICAgIGxpc3RlbmVyLT5ub3RpZnlFcnJvcihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfUkVRVUVTVCwKKyAgICAgICAgICAgICAgICAgICAgKCppdCktPm1SZXN1bHRFeHRyYXMpOworICAgICAgICB9CisgICAgfQogICAgIG1SZXF1ZXN0UXVldWUuY2xlYXIoKTsKICAgICBtVHJpZ2dlck1hcC5jbGVhcigpOworICAgIGlmIChsYXN0RnJhbWVOdW1iZXIgIT0gTlVMTCkgeworICAgICAgICAqbGFzdEZyYW1lTnVtYmVyID0gbVJlcGVhdGluZ0xhc3RGcmFtZU51bWJlcjsKKyAgICB9CisgICAgbVJlcGVhdGluZ0xhc3RGcmFtZU51bWJlciA9IE5PX0lOX0ZMSUdIVF9SRVBFQVRJTkdfRlJBTUVTOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMjAzNCw2ICsyNTQxLDcgQEAKIAogICAgIC8vIENyZWF0ZSByZXF1ZXN0IHRvIEhBTAogICAgIGNhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0X3QgcmVxdWVzdCA9IGNhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0X3QoKTsKKyAgICByZXF1ZXN0LmZyYW1lX251bWJlciA9IG5leHRSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyOwogICAgIFZlY3RvcjxjYW1lcmEzX3N0cmVhbV9idWZmZXJfdD4gb3V0cHV0QnVmZmVyczsKIAogICAgIC8vIEdldCB0aGUgcmVxdWVzdCBJRCwgaWYgYW55CkBAIC0yMDU0LDcgKzI1NjIsNyBAQAogICAgIGlmIChyZXMgPCAwKSB7CiAgICAgICAgIFNFVF9FUlIoIlJlcXVlc3RUaHJlYWQ6IFVuYWJsZSB0byBpbnNlcnQgdHJpZ2dlcnMgIgogICAgICAgICAgICAgICAgICIoY2FwdHVyZSByZXF1ZXN0ICVkLCBIQUwgZGV2aWNlOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAobUZyYW1lTnVtYmVyKzEpLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmZyYW1lX251bWJlciwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgIGNsZWFuVXBGYWlsZWRSZXF1ZXN0KHJlcXVlc3QsIG5leHRSZXF1ZXN0LCBvdXRwdXRCdWZmZXJzKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTIwNzIsNyArMjU4MCw3IEBACiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIFNFVF9FUlIoIlJlcXVlc3RUaHJlYWQ6IFVuYWJsZSB0byBpbnNlcnQgZHVtbXkgdHJpZ2dlciBJRHMgIgogICAgICAgICAgICAgICAgICAgICAiKGNhcHR1cmUgcmVxdWVzdCAlZCwgSEFMIGRldmljZTogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgIChtRnJhbWVOdW1iZXIrMSksIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmZyYW1lX251bWJlciwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgICAgICBjbGVhblVwRmFpbGVkUmVxdWVzdChyZXF1ZXN0LCBuZXh0UmVxdWVzdCwgb3V0cHV0QnVmZmVycyk7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KQEAgLTIwOTYsNyArMjYwNCw3IEBACiAgICAgICAgICAgICBpZiAoZS5jb3VudCA+IDApIHsKICAgICAgICAgICAgICAgICBBTE9HVigiJXM6IFJlcXVlc3QgKGZyYW1lIG51bSAlZCkgaGFkIEFGIHRyaWdnZXIgMHgleCIsCiAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZU51bWJlcisxLAorICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZnJhbWVfbnVtYmVyLAogICAgICAgICAgICAgICAgICAgICAgIGUuZGF0YS51OFswXSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTIxMDcsNiArMjYxNSw3IEBACiAgICAgfQogCiAgICAgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3QgaW5wdXRCdWZmZXI7CisgICAgdWludDMyX3QgdG90YWxOdW1CdWZmZXJzID0gMDsKIAogICAgIC8vIEZpbGwgaW4gYnVmZmVycwogCkBAIC0yMTE0LDExICsyNjIzLDIxIEBACiAgICAgICAgIHJlcXVlc3QuaW5wdXRfYnVmZmVyID0gJmlucHV0QnVmZmVyOwogICAgICAgICByZXMgPSBuZXh0UmVxdWVzdC0+bUlucHV0U3RyZWFtLT5nZXRJbnB1dEJ1ZmZlcigmaW5wdXRCdWZmZXIpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAvLyBDYW4ndCBnZXQgaW5wdXQgYnVmZmVyIGZyb20gZ3JhbGxvYyBxdWV1ZSAtIHRoaXMgY291bGQgYmUgZHVlIHRvCisgICAgICAgICAgICAvLyBkaXNjb25uZWN0ZWQgcXVldWUgb3Igb3RoZXIgcHJvZHVjZXIgbWlzYmVoYXZpb3IsIHNvIG5vdCBhIGZhdGFsCisgICAgICAgICAgICAvLyBlcnJvcgogICAgICAgICAgICAgQUxPR0UoIlJlcXVlc3RUaHJlYWQ6IENhbid0IGdldCBpbnB1dCBidWZmZXIsIHNraXBwaW5nIHJlcXVlc3Q6IgogICAgICAgICAgICAgICAgICAgICAiICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7CisgICAgICAgICAgICBpZiAobUxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtTGlzdGVuZXItPm5vdGlmeUVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgSUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFUVVFU1QsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0UmVxdWVzdC0+bVJlc3VsdEV4dHJhcyk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBjbGVhblVwRmFpbGVkUmVxdWVzdChyZXF1ZXN0LCBuZXh0UmVxdWVzdCwgb3V0cHV0QnVmZmVycyk7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQorICAgICAgICB0b3RhbE51bUJ1ZmZlcnMgKz0gMTsKICAgICB9IGVsc2UgewogICAgICAgICByZXF1ZXN0LmlucHV0X2J1ZmZlciA9IE5VTEw7CiAgICAgfQpAQCAtMjEzMCwyNiArMjY0OSw0MSBAQAogICAgICAgICByZXMgPSBuZXh0UmVxdWVzdC0+bU91dHB1dFN0cmVhbXMuZWRpdEl0ZW1BdChpKS0+CiAgICAgICAgICAgICAgICAgZ2V0QnVmZmVyKCZvdXRwdXRCdWZmZXJzLmVkaXRJdGVtQXQoaSkpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAvLyBDYW4ndCBnZXQgb3V0cHV0IGJ1ZmZlciBmcm9tIGdyYWxsb2MgcXVldWUgLSB0aGlzIGNvdWxkIGJlIGR1ZSB0bworICAgICAgICAgICAgLy8gYWJhbmRvbmVkIHF1ZXVlIG9yIG90aGVyIGNvbnN1bWVyIG1pc2JlaGF2aW9yLCBzbyBub3QgYSBmYXRhbAorICAgICAgICAgICAgLy8gZXJyb3IKICAgICAgICAgICAgIEFMT0dFKCJSZXF1ZXN0VGhyZWFkOiBDYW4ndCBnZXQgb3V0cHV0IGJ1ZmZlciwgc2tpcHBpbmcgcmVxdWVzdDoiCiAgICAgICAgICAgICAgICAgICAgICIgJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVJlcXVlc3RMb2NrKTsKKyAgICAgICAgICAgIGlmIChtTGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1MaXN0ZW5lci0+bm90aWZ5RXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfUkVRVUVTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHRSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNsZWFuVXBGYWlsZWRSZXF1ZXN0KHJlcXVlc3QsIG5leHRSZXF1ZXN0LCBvdXRwdXRCdWZmZXJzKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIHJlcXVlc3QubnVtX291dHB1dF9idWZmZXJzKys7CiAgICAgfQotCi0gICAgcmVxdWVzdC5mcmFtZV9udW1iZXIgPSBtRnJhbWVOdW1iZXIrKzsKKyAgICB0b3RhbE51bUJ1ZmZlcnMgKz0gcmVxdWVzdC5udW1fb3V0cHV0X2J1ZmZlcnM7CiAKICAgICAvLyBMb2cgcmVxdWVzdCBpbiB0aGUgaW4tZmxpZ2h0IHF1ZXVlCiAgICAgc3A8Q2FtZXJhM0RldmljZT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CiAgICAgaWYgKHBhcmVudCA9PSBOVUxMKSB7CisgICAgICAgIC8vIFNob3VsZCBub3QgaGFwcGVuLCBhbmQgbm93aGVyZSB0byBzZW5kIGVycm9ycyB0bywgc28ganVzdCBsb2cgaXQKICAgICAgICAgQ0xPR0UoIlJlcXVlc3RUaHJlYWQ6IFBhcmVudCBpcyBnb25lIik7CiAgICAgICAgIGNsZWFuVXBGYWlsZWRSZXF1ZXN0KHJlcXVlc3QsIG5leHRSZXF1ZXN0LCBvdXRwdXRCdWZmZXJzKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHJlcyA9IHBhcmVudC0+cmVnaXN0ZXJJbkZsaWdodChyZXF1ZXN0LmZyYW1lX251bWJlciwgcmVxdWVzdElkLAotICAgICAgICAgICAgcmVxdWVzdC5udW1fb3V0cHV0X2J1ZmZlcnMpOworICAgIHJlcyA9IHBhcmVudC0+cmVnaXN0ZXJJbkZsaWdodChyZXF1ZXN0LmZyYW1lX251bWJlciwKKyAgICAgICAgICAgIHRvdGFsTnVtQnVmZmVycywgbmV4dFJlcXVlc3QtPm1SZXN1bHRFeHRyYXMsCisgICAgICAgICAgICAvKmhhc0lucHV0Ki9yZXF1ZXN0LmlucHV0X2J1ZmZlciAhPSBOVUxMKTsKKyAgICBBTE9HVlYoIiVzOiByZWdpc3RlcmVkIGluIGZsaWdodCByZXF1ZXN0SWQgPSAlIiBQUklkMzIgIiwgZnJhbWVOdW1iZXIgPSAlIiBQUklkNjQKKyAgICAgICAgICAgIiwgYnVyc3RJZCA9ICUiIFBSSWQzMiAiLiIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICBuZXh0UmVxdWVzdC0+bVJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQsIG5leHRSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyLAorICAgICAgICAgICAgbmV4dFJlcXVlc3QtPm1SZXN1bHRFeHRyYXMuYnVyc3RJZCk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBTRVRfRVJSKCJSZXF1ZXN0VGhyZWFkOiBVbmFibGUgdG8gcmVnaXN0ZXIgbmV3IGluLWZsaWdodCByZXF1ZXN0OiIKICAgICAgICAgICAgICAgICAiICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKQEAgLTIxNzIsNiArMjcwNiw5IEBACiAgICAgQVRSQUNFX0VORCgpOwogCiAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAvLyBTaG91bGQgb25seSBnZXQgYSBmYWlsdXJlIGhlcmUgZm9yIG1hbGZvcm1lZCByZXF1ZXN0cyBvciBkZXZpY2UtbGV2ZWwKKyAgICAgICAgLy8gZXJyb3JzLCBzbyBjb25zaWRlciBhbGwgZXJyb3JzIGZhdGFsLiAgQmFkIG1ldGFkYXRhIGZhaWx1cmVzIHNob3VsZAorICAgICAgICAvLyBjb21lIHRocm91Z2ggbm90aWZ5LgogICAgICAgICBTRVRfRVJSKCJSZXF1ZXN0VGhyZWFkOiBVbmFibGUgdG8gc3VibWl0IGNhcHR1cmUgcmVxdWVzdCAlZCB0byBIQUwiCiAgICAgICAgICAgICAgICAgIiBkZXZpY2U6ICVzICglZCkiLCByZXF1ZXN0LmZyYW1lX251bWJlciwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgIGNsZWFuVXBGYWlsZWRSZXF1ZXN0KHJlcXVlc3QsIG5leHRSZXF1ZXN0LCBvdXRwdXRCdWZmZXJzKTsKQEAgLTIyMDAsMjEgKzI3MzcsNiBAQAogICAgIH0KICAgICBtUHJldlRyaWdnZXJzID0gdHJpZ2dlckNvdW50OwogCi0gICAgLy8gUmV0dXJuIGlucHV0IGJ1ZmZlciBiYWNrIHRvIGZyYW1ld29yawotICAgIGlmIChyZXF1ZXN0LmlucHV0X2J1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIENhbWVyYTNTdHJlYW0gKnN0cmVhbSA9Ci0gICAgICAgICAgICBDYW1lcmEzU3RyZWFtOjpjYXN0KHJlcXVlc3QuaW5wdXRfYnVmZmVyLT5zdHJlYW0pOwotICAgICAgICByZXMgPSBzdHJlYW0tPnJldHVybklucHV0QnVmZmVyKCoocmVxdWVzdC5pbnB1dF9idWZmZXIpKTsKLSAgICAgICAgLy8gTm90ZTogc3RyZWFtIG1heSBiZSBkZWFsbG9jYXRlZCBhdCB0aGlzIHBvaW50LCBpZiB0aGlzIGJ1ZmZlciB3YXMgdGhlCi0gICAgICAgIC8vIGxhc3QgcmVmZXJlbmNlIHRvIGl0LgotICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IFJlcXVlc3RUaHJlYWQ6IENhbid0IHJldHVybiBpbnB1dCBidWZmZXIgZm9yIGZyYW1lICVkIHRvIgotICAgICAgICAgICAgICAgICAgICAiICBpdHMgc3RyZWFtOiVzICglZCkiLCAgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmZyYW1lX251bWJlciwgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgICAgICAvLyBUT0RPOiBSZXBvcnQgZXJyb3IgdXBzdHJlYW0KLSAgICAgICAgfQotICAgIH0KLQogICAgIHJldHVybiB0cnVlOwogfQogCkBAIC0yMjI2LDYgKzI3NDgsNyBAQAogICAgIHJldHVybiBtTGF0ZXN0UmVxdWVzdDsKIH0KIAorCiB2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OmNsZWFuVXBGYWlsZWRSZXF1ZXN0KAogICAgICAgICBjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90ICZyZXF1ZXN0LAogICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gJm5leHRSZXF1ZXN0LApAQCAtMjI2Nyw2ICsyNzkwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgKytmaXJzdFJlcXVlc3QsCiAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RzLmVuZCgpKTsKICAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gd2FpdCBhbnkgbG9uZ2VyCisKKyAgICAgICAgICAgIG1SZXBlYXRpbmdMYXN0RnJhbWVOdW1iZXIgPSBtRnJhbWVOdW1iZXIgKyByZXF1ZXN0cy5zaXplKCkgLSAxOworCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0yMzE4LDYgKzI4NDQsMTEgQEAKICAgICAgICAgbVJlY29uZmlndXJlZCA9IGZhbHNlOwogICAgIH0KIAorICAgIGlmIChuZXh0UmVxdWVzdCAhPSBOVUxMKSB7CisgICAgICAgIG5leHRSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyID0gbUZyYW1lTnVtYmVyKys7CisgICAgICAgIG5leHRSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLmFmVHJpZ2dlcklkID0gbUN1cnJlbnRBZlRyaWdnZXJJZDsKKyAgICAgICAgbmV4dFJlcXVlc3QtPm1SZXN1bHRFeHRyYXMucHJlY2FwdHVyZVRyaWdnZXJJZCA9IG1DdXJyZW50UHJlQ2FwdHVyZVRyaWdnZXJJZDsKKyAgICB9CiAgICAgcmV0dXJuIG5leHRSZXF1ZXN0OwogfQogCkBAIC0yMzgwLDEzICsyOTExLDM0IEBACiAKICAgICBNdXRleDo6QXV0b2xvY2sgYWwobVRyaWdnZXJNdXRleCk7CiAKKyAgICBzcDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKKyAgICBpZiAocGFyZW50ID09IE5VTEwpIHsKKyAgICAgICAgQ0xPR0UoIlJlcXVlc3RUaHJlYWQ6IFBhcmVudCBpcyBnb25lIik7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisKICAgICBDYW1lcmFNZXRhZGF0YSAmbWV0YWRhdGEgPSByZXF1ZXN0LT5tU2V0dGluZ3M7CiAgICAgc2l6ZV90IGNvdW50ID0gbVRyaWdnZXJNYXAuc2l6ZSgpOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CiAgICAgICAgIFJlcXVlc3RUcmlnZ2VyIHRyaWdnZXIgPSBtVHJpZ2dlck1hcC52YWx1ZUF0KGkpOwotCiAgICAgICAgIHVpbnQzMl90IHRhZyA9IHRyaWdnZXIubWV0YWRhdGFUYWc7CisKKyAgICAgICAgaWYgKHRhZyA9PSBBTkRST0lEX0NPTlRST0xfQUZfVFJJR0dFUl9JRCB8fCB0YWcgPT0gQU5EUk9JRF9DT05UUk9MX0FFX1BSRUNBUFRVUkVfSUQpIHsKKyAgICAgICAgICAgIGJvb2wgaXNBZVRyaWdnZXIgPSAodHJpZ2dlci5tZXRhZGF0YVRhZyA9PSBBTkRST0lEX0NPTlRST0xfQUVfUFJFQ0FQVFVSRV9JRCk7CisgICAgICAgICAgICB1aW50MzJfdCB0cmlnZ2VySWQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4odHJpZ2dlci5lbnRyeVZhbHVlKTsKKyAgICAgICAgICAgIGlmIChpc0FlVHJpZ2dlcikgeworICAgICAgICAgICAgICAgIHJlcXVlc3QtPm1SZXN1bHRFeHRyYXMucHJlY2FwdHVyZVRyaWdnZXJJZCA9IHRyaWdnZXJJZDsKKyAgICAgICAgICAgICAgICBtQ3VycmVudFByZUNhcHR1cmVUcmlnZ2VySWQgPSB0cmlnZ2VySWQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcXVlc3QtPm1SZXN1bHRFeHRyYXMuYWZUcmlnZ2VySWQgPSB0cmlnZ2VySWQ7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRBZlRyaWdnZXJJZCA9IHRyaWdnZXJJZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYXJlbnQtPm1EZXZpY2VWZXJzaW9uID49IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7IC8vIFRyaWdnZXIgSUQgdGFnIGlzIGRlcHJlY2F0ZWQgc2luY2UgZGV2aWNlIEhBTCAzLjIKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBlbnRyeSA9IG1ldGFkYXRhLmZpbmQodGFnKTsKIAogICAgICAgICBpZiAoZW50cnkuY291bnQgPiAwKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5oCmluZGV4IDQ2OGY2NDEuLmVjNmJiYTEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5oCkBAIC0yNCw2ICsyNCw4IEBACiAjaW5jbHVkZSA8dXRpbHMvVGhyZWFkLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDxoYXJkd2FyZS9jYW1lcmEzLmg+CisjaW5jbHVkZSA8Y2FtZXJhL0NhcHR1cmVSZXN1bHQuaD4KKyNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5oPgogCiAjaW5jbHVkZSAiY29tbW9uL0NhbWVyYURldmljZUJhc2UuaCIKICNpbmNsdWRlICJkZXZpY2UzL1N0YXR1c1RyYWNrZXIuaCIKQEAgLTU0LDcgKzU2LDcgQEAKIH0KIAogLyoqCi0gKiBDYW1lcmFEZXZpY2UgZm9yIEhBTCBkZXZpY2VzIHdpdGggdmVyc2lvbiBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMAorICogQ2FtZXJhRGV2aWNlIGZvciBIQUwgZGV2aWNlcyB3aXRoIHZlcnNpb24gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzAgb3IgaGlnaGVyLgogICovCiBjbGFzcyBDYW1lcmEzRGV2aWNlIDoKICAgICAgICAgICAgIHB1YmxpYyBDYW1lcmFEZXZpY2VCYXNlLApAQCAtNzgsOSArODAsMTQgQEAKIAogICAgIC8vIENhcHR1cmUgYW5kIHNldFN0cmVhbWluZ1JlcXVlc3Qgd2lsbCBjb25maWd1cmUgc3RyZWFtcyBpZiBjdXJyZW50bHkgaW4KICAgICAvLyBpZGxlIHN0YXRlCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjYXB0dXJlKENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbWluZ1JlcXVlc3QoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xlYXJTdHJlYW1pbmdSZXF1ZXN0KCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjYXB0dXJlKENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0LCBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNhcHR1cmVMaXN0KGNvbnN0IExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+ICZyZXF1ZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtaW5nUmVxdWVzdChjb25zdCBDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1pbmdSZXF1ZXN0TGlzdChjb25zdCBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiAmcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNsZWFyU3RyZWFtaW5nUmVxdWVzdChpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgd2FpdFVudGlsUmVxdWVzdFJlY2VpdmVkKGludDMyX3QgcmVxdWVzdElkLCBuc2Vjc190IHRpbWVvdXQpOwogCkBAIC04OCw4ICs5NSw3IEBACiAgICAgLy8gSWYgYWRkaW5nIHN0cmVhbXMgd2hpbGUgYWN0aXZlbHkgY2FwdHVyaW5nLCB3aWxsIHBhdXNlIGRldmljZSBiZWZvcmUgYWRkaW5nCiAgICAgLy8gc3RyZWFtLCByZWNvbmZpZ3VyaW5nIGRldmljZSwgYW5kIHVucGF1c2luZy4KICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVN0cmVhbShzcDxBTmF0aXZlV2luZG93PiBjb25zdW1lciwKLSAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgaW50ICppZCk7CisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LCBpbnQgKmlkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUlucHV0U3RyZWFtKAogICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKICAgICAgICAgICAgIGludCAqaWQpOwpAQCAtMTA4LDYgKzExNCw4IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBkZWxldGVTdHJlYW0oaW50IGlkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGRlbGV0ZVJlcHJvY2Vzc1N0cmVhbShpbnQgaWQpOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVTdHJlYW1zKCk7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZURlZmF1bHRSZXF1ZXN0KGludCB0ZW1wbGF0ZUlkLCBDYW1lcmFNZXRhZGF0YSAqcmVxdWVzdCk7CiAKICAgICAvLyBUcmFuc2l0aW9ucyB0byB0aGUgaWRsZSBzdGF0ZSBvbiBzdWNjZXNzCkBAIC0xMTYsNyArMTI0LDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE5vdGlmeUNhbGxiYWNrKE5vdGlmaWNhdGlvbkxpc3RlbmVyICpsaXN0ZW5lcik7CiAgICAgdmlydHVhbCBib29sICAgICB3aWxsTm90aWZ5M0EoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHdhaXRGb3JOZXh0RnJhbWUobnNlY3NfdCB0aW1lb3V0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRGcmFtZShDYW1lcmFNZXRhZGF0YSAqZnJhbWUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dFJlc3VsdChDYXB0dXJlUmVzdWx0ICpmcmFtZSk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHRyaWdnZXJBdXRvZm9jdXModWludDMyX3QgaWQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgdHJpZ2dlckNhbmNlbEF1dG9mb2N1cyh1aW50MzJfdCBpZCk7CkBAIC0xMjUsNyArMTMzLDExIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBwdXNoUmVwcm9jZXNzQnVmZmVyKGludCByZXByb2Nlc3NTdHJlYW1JZCwKICAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyLCB3cDxCdWZmZXJSZWxlYXNlZExpc3RlbmVyPiBsaXN0ZW5lcik7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaChpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKKworICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0RGV2aWNlVmVyc2lvbigpOworCisgICAgdmlydHVhbCBzc2l6ZV90IGdldEpwZWdCdWZmZXJTaXplKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIGNvbnN0OwogCiAgICAgLy8gTWV0aG9kcyBjYWxsZWQgYnkgc3ViY2xhc3NlcwogICAgIHZvaWQgICAgICAgICAgICAgbm90aWZ5U3RhdHVzKGJvb2wgaWRsZSk7IC8vIHVwZGF0ZXMgZnJvbSBTdGF0dXNUcmFja2VyCkBAIC0xMzcsNiArMTQ5LDEwIEBACiAgICAgc3RhdGljIGNvbnN0IG5zZWNzX3QgICAgICAga1NodXRkb3duVGltZW91dCAgID0gNTAwMDAwMDAwMDsgLy8gNSBzZWMKICAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCAgICAgICBrQWN0aXZlVGltZW91dCAgICAgPSA1MDAwMDAwMDA7ICAvLyA1MDAgbXMKICAgICBzdHJ1Y3QgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0VHJpZ2dlcjsKKyAgICAvLyBtaW5pbWFsIGpwZWcgYnVmZmVyIHNpemU6IDI1NktCICsgYmxvYiBoZWFkZXIKKyAgICBzdGF0aWMgY29uc3Qgc3NpemVfdCAgICAgICBrTWluSnBlZ0J1ZmZlclNpemUgPSAyNTYgKiAxMDI0ICsgc2l6ZW9mKGNhbWVyYTNfanBlZ19ibG9iKTsKKyAgICAvLyBDb25zdGFudCB0byB1c2UgZm9yIHN0cmVhbSBJRCB3aGVuIG9uZSBkb2Vzbid0IGV4aXN0CisgICAgc3RhdGljIGNvbnN0IGludCAgICAgICAgICAgTk9fU1RSRUFNID0gLTE7CiAKICAgICAvLyBBIGxvY2sgdG8gZW5mb3JjZSBzZXJpYWxpemF0aW9uIG9uIHRoZSBpbnB1dC9jb25maWd1cmUgc2lkZQogICAgIC8vIG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLgpAQCAtMTU3LDcgKzE3MywxMCBAQAogICAgIGNhbWVyYTNfZGV2aWNlX3QgICAgICAgICAgKm1IYWwzRGV2aWNlOwogCiAgICAgQ2FtZXJhTWV0YWRhdGEgICAgICAgICAgICAgbURldmljZUluZm87Ci0gICAgdmVuZG9yX3RhZ19xdWVyeV9vcHNfdCAgICAgbVZlbmRvclRhZ09wczsKKworICAgIENhbWVyYU1ldGFkYXRhICAgICAgICAgICAgIG1SZXF1ZXN0VGVtcGxhdGVDYWNoZVtDQU1FUkEzX1RFTVBMQVRFX0NPVU5UXTsKKworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgIG1EZXZpY2VWZXJzaW9uOwogCiAgICAgZW51bSBTdGF0dXMgewogICAgICAgICBTVEFUVVNfRVJST1IsCkBAIC0xODEsNiArMjAwLDggQEAKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBtTmV4dFN0cmVhbUlkOwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgIG1OZWVkQ29uZmlnOwogCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgbUR1bW15U3RyZWFtSWQ7CisKICAgICAvLyBXaGV0aGVyIHRvIHNlbmQgc3RhdGUgdXBkYXRlcyB1cHN0cmVhbQogICAgIC8vIFBhdXNlIHdoZW4gZG9pbmcgdHJhbnNwYXJlbnQgcmVjb25maWd1cmF0aW9uCiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgbVBhdXNlU3RhdGVOb3RpZnk7CkBAIC0xODgsOCArMjA5LDExIEBACiAgICAgLy8gTmVlZCB0byBob2xkIG9uIHRvIHN0cmVhbSByZWZlcmVuY2VzIHVudGlsIGNvbmZpZ3VyZSBjb21wbGV0ZXMuCiAgICAgVmVjdG9yPHNwPGNhbWVyYTM6OkNhbWVyYTNTdHJlYW1JbnRlcmZhY2U+ID4gbURlbGV0ZWRTdHJlYW1zOwogCi0gICAgLy8gV2hldGhlciBxdWlyayBBTkRST0lEX1FVSVJLU19VU0VfUEFSVElBTF9SRVNVTFQgaXMgZW5hYmxlZAotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgIG1Vc2VQYXJ0aWFsUmVzdWx0UXVpcms7CisgICAgLy8gV2hldGhlciB0aGUgSEFMIHdpbGwgc2VuZCBwYXJ0aWFsIHJlc3VsdAorICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgIG1Vc2VQYXJ0aWFsUmVzdWx0OworCisgICAgLy8gTnVtYmVyIG9mIHBhcnRpYWwgcmVzdWx0cyB0aGF0IHdpbGwgYmUgZGVsaXZlcmVkIGJ5IHRoZSBIQUwuCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzOwogCiAgICAgLyoqKiogRW5kIHNjb3BlIGZvciBtTG9jayAqKioqLwogCkBAIC0xOTksOSArMjIzLDIwIEBACiAgICAgICAgIHNwPGNhbWVyYTM6OkNhbWVyYTNTdHJlYW0+ICAgICAgICAgIG1JbnB1dFN0cmVhbTsKICAgICAgICAgVmVjdG9yPHNwPGNhbWVyYTM6OkNhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+ID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dFN0cmVhbXM7CisgICAgICAgIENhcHR1cmVSZXN1bHRFeHRyYXMgICAgICAgICAgICAgICAgIG1SZXN1bHRFeHRyYXM7CiAgICAgfTsKICAgICB0eXBlZGVmIExpc3Q8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4gUmVxdWVzdExpc3Q7CiAKKyAgICBzdGF0dXNfdCBjaGVja1N0YXR1c09rVG9DYXB0dXJlTG9ja2VkKCk7CisKKyAgICBzdGF0dXNfdCBjb252ZXJ0TWV0YWRhdGFMaXN0VG9SZXF1ZXN0TGlzdExvY2tlZCgKKyAgICAgICAgICAgIGNvbnN0IExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+ICZtZXRhZGF0YUxpc3QsCisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBSZXF1ZXN0TGlzdCAqcmVxdWVzdExpc3QpOworCisgICAgc3RhdHVzX3Qgc3VibWl0UmVxdWVzdHNIZWxwZXIoY29uc3QgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gJnJlcXVlc3RzLCBib29sIHJlcGVhdGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKKwogICAgIC8qKgogICAgICAqIEdldCB0aGUgbGFzdCByZXF1ZXN0IHN1Ym1pdHRlZCB0byB0aGUgaGFsIGJ5IHRoZSByZXF1ZXN0IHRocmVhZC4KICAgICAgKgpAQCAtMjM3LDYgKzI3MiwxMyBAQAogICAgIHN0YXR1c190IHdhaXRVbnRpbFN0YXRlVGhlblJlbG9jayhib29sIGFjdGl2ZSwgbnNlY3NfdCB0aW1lb3V0KTsKIAogICAgIC8qKgorICAgICAqIEltcGxlbWVudGF0aW9uIG9mIHdhaXRVbnRpbERyYWluZWQuIE9uIHN1Y2Nlc3MsIHdpbGwgdHJhbnNpdGlvbiB0byBJRExFIHN0YXRlLgorICAgICAqCisgICAgICogTmVlZCB0byBiZSBjYWxsZWQgd2l0aCBtTG9jayBhbmQgbUludGVyZmFjZUxvY2sgaGVsZC4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCB3YWl0VW50aWxEcmFpbmVkTG9ja2VkKCk7CisKKyAgICAvKioKICAgICAgKiBEbyBjb21tb24gd29yayBmb3Igc2V0dGluZyB1cCBhIHN0cmVhbWluZyBvciBzaW5nbGUgY2FwdHVyZSByZXF1ZXN0LgogICAgICAqIE9uIHN1Y2Nlc3MsIHdpbGwgdHJhbnNpdGlvbiB0byBBQ1RJVkUgaWYgaW4gSURMRS4KICAgICAgKi8KQEAgLTI1NSw2ICsyOTcsMTcgQEAKICAgICBzdGF0dXNfdCAgICAgICAgICAgY29uZmlndXJlU3RyZWFtc0xvY2tlZCgpOwogCiAgICAgLyoqCisgICAgICogQWRkIGEgZHVtbXkgc3RyZWFtIHRvIHRoZSBjdXJyZW50IHN0cmVhbSBzZXQgYXMgYSB3b3JrYXJvdW5kIGZvcgorICAgICAqIG5vdCBhbGxvd2luZyAwIHN0cmVhbXMgaW4gdGhlIGNhbWVyYSBIQUwgc3BlYy4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCAgICAgICAgICAgYWRkRHVtbXlTdHJlYW1Mb2NrZWQoKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIGR1bW15IHN0cmVhbSBpZiB0aGUgY3VycmVudCBjb25maWcgaW5jbHVkZXMgcmVhbCBzdHJlYW1zLgorICAgICAqLworICAgIHN0YXR1c190ICAgICAgICAgICB0cnlSZW1vdmVEdW1teVN0cmVhbUxvY2tlZCgpOworCisgICAgLyoqCiAgICAgICogU2V0IGRldmljZSBpbnRvIGFuIGVycm9yIHN0YXRlIGR1ZSB0byBzb21lIGZhdGFsIGZhaWx1cmUsIGFuZCBzZXQgYW4KICAgICAgKiBlcnJvciBtZXNzYWdlIHRvIGluZGljYXRlIHdoeS4gT25seSB0aGUgZmlyc3QgY2FsbCdzIG1lc3NhZ2Ugd2lsbCBiZQogICAgICAqIHVzZWQuIFRoZSBtZXNzYWdlIGlzIGFsc28gc2VudCB0byB0aGUgbG9nLgpAQCAtMjcwLDYgKzMyMywxOCBAQAogICAgICAqLwogICAgIGJvb2wgICAgICAgICAgICAgICB0cnlMb2NrU3BpblJpZ2h0Um91bmQoTXV0ZXgmIGxvY2spOwogCisgICAgc3RydWN0IFNpemUgeworICAgICAgICBpbnQgd2lkdGg7CisgICAgICAgIGludCBoZWlnaHQ7CisgICAgICAgIFNpemUoaW50IHcsIGludCBoKSA6IHdpZHRoKHcpLCBoZWlnaHQoaCl7fQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBsYXJnZXN0IEpwZWcgcmVzb2x1dGlvbiAoaW4gYXJlYSkKKyAgICAgKiBSZXR1cm4gU2l6ZSgwLCAwKSBpZiBzdGF0aWMgbWV0YXRkYXRhIGlzIGludmFsaWQKKyAgICAgKi8KKyAgICBTaXplIGdldE1heEpwZWdSZXNvbHV0aW9uKCkgY29uc3Q7CisKICAgICBzdHJ1Y3QgUmVxdWVzdFRyaWdnZXIgewogICAgICAgICAvLyBNZXRhZGF0YSB0YWcgbnVtYmVyLCBlLmcuIGFuZHJvaWQuY29udHJvbC5hZVByZWNhcHR1cmVUcmlnZ2VyCiAgICAgICAgIHVpbnQzMl90IG1ldGFkYXRhVGFnOwpAQCAtMjk4LDYgKzM2Myw4IEBACiAgICAgICAgICAgICAgICAgc3A8Y2FtZXJhMzo6U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciwKICAgICAgICAgICAgICAgICBjYW1lcmEzX2RldmljZV90ICpoYWwzRGV2aWNlKTsKIAorICAgICAgICB2b2lkICAgICBzZXROb3RpZnlDYWxsYmFjayhOb3RpZmljYXRpb25MaXN0ZW5lciAqbGlzdGVuZXIpOworCiAgICAgICAgIC8qKgogICAgICAgICAgKiBDYWxsIGFmdGVyIHN0cmVhbSAocmUpLWNvbmZpZ3VyYXRpb24gaXMgY29tcGxldGVkLgogICAgICAgICAgKi8KQEAgLTMwOCwxNSArMzc1LDIyIEBACiAgICAgICAgICAqIG9uIGVpdGhlci4gVXNlIHdhaXRVbnRpbFBhdXNlZCB0byB3YWl0IHVudGlsIHJlcXVlc3QgcXVldWUKICAgICAgICAgICogaGFzIGVtcHRpZWQgb3V0LgogICAgICAgICAgKi8KLSAgICAgICAgc3RhdHVzX3Qgc2V0UmVwZWF0aW5nUmVxdWVzdHMoY29uc3QgUmVxdWVzdExpc3QmIHJlcXVlc3RzKTsKLSAgICAgICAgc3RhdHVzX3QgY2xlYXJSZXBlYXRpbmdSZXF1ZXN0cygpOworICAgICAgICBzdGF0dXNfdCBzZXRSZXBlYXRpbmdSZXF1ZXN0cyhjb25zdCBSZXF1ZXN0TGlzdCYgcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CisgICAgICAgIHN0YXR1c190IGNsZWFyUmVwZWF0aW5nUmVxdWVzdHMoLypvdXQqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpOwogCi0gICAgICAgIHN0YXR1c190IHF1ZXVlUmVxdWVzdChzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCk7CisgICAgICAgIHN0YXR1c190IHF1ZXVlUmVxdWVzdExpc3QoTGlzdDxzcDxDYXB0dXJlUmVxdWVzdD4gPiAmcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBSZW1vdmUgYWxsIHF1ZXVlZCBhbmQgcmVwZWF0aW5nIHJlcXVlc3RzLCBhbmQgcGVuZGluZyB0cmlnZ2VycwogICAgICAgICAgKi8KLSAgICAgICAgc3RhdHVzX3QgY2xlYXIoKTsKKyAgICAgICAgc3RhdHVzX3QgY2xlYXIoTm90aWZpY2F0aW9uTGlzdGVuZXIgKmxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBRdWV1ZSBhIHRyaWdnZXIgdG8gYmUgZGlzcGF0Y2hlZCB3aXRoIHRoZSBuZXh0IG91dGdvaW5nCkBAIC0zOTEsMTAgKzQ2NSwxNSBAQAogICAgICAgICAvLyBSZWxheSBlcnJvciB0byBwYXJlbnQgZGV2aWNlIG9iamVjdCBzZXRFcnJvclN0YXRlCiAgICAgICAgIHZvaWQgICAgICAgICAgICAgICBzZXRFcnJvclN0YXRlKGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIAorICAgICAgICAvLyBJZiB0aGUgaW5wdXQgcmVxdWVzdCBpcyBpbiBtUmVwZWF0aW5nUmVxdWVzdHMuIE11c3QgYmUgY2FsbGVkIHdpdGggbVJlcXVlc3RMb2NrIGhvbGQKKyAgICAgICAgYm9vbCBpc1JlcGVhdGluZ1JlcXVlc3RMb2NrZWQoY29uc3Qgc3A8Q2FwdHVyZVJlcXVlc3Q+KTsKKwogICAgICAgICB3cDxDYW1lcmEzRGV2aWNlPiAgbVBhcmVudDsKICAgICAgICAgd3A8Y2FtZXJhMzo6U3RhdHVzVHJhY2tlcj4gIG1TdGF0dXNUcmFja2VyOwogICAgICAgICBjYW1lcmEzX2RldmljZV90ICAqbUhhbDNEZXZpY2U7CiAKKyAgICAgICAgTm90aWZpY2F0aW9uTGlzdGVuZXIgKm1MaXN0ZW5lcjsKKwogICAgICAgICBjb25zdCBpbnQgICAgICAgICAgbUlkOyAgICAgICAvLyBUaGUgY2FtZXJhIElECiAgICAgICAgIGludCAgICAgICAgICAgICAgICBtU3RhdHVzSWQ7IC8vIFRoZSBSZXF1ZXN0VGhyZWFkJ3MgY29tcG9uZW50IElEIGZvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGF0dXMgdHJhY2tpbmcKQEAgLTQyOSw2ICs1MDgsMTAgQEAKICAgICAgICAgVHJpZ2dlck1hcCAgICAgICAgIG1UcmlnZ2VyTWFwOwogICAgICAgICBUcmlnZ2VyTWFwICAgICAgICAgbVRyaWdnZXJSZW1vdmVkTWFwOwogICAgICAgICBUcmlnZ2VyTWFwICAgICAgICAgbVRyaWdnZXJSZXBsYWNlZE1hcDsKKyAgICAgICAgdWludDMyX3QgICAgICAgICAgIG1DdXJyZW50QWZUcmlnZ2VySWQ7CisgICAgICAgIHVpbnQzMl90ICAgICAgICAgICBtQ3VycmVudFByZUNhcHR1cmVUcmlnZ2VySWQ7CisKKyAgICAgICAgaW50NjRfdCAgICAgICAgICAgIG1SZXBlYXRpbmdMYXN0RnJhbWVOdW1iZXI7CiAgICAgfTsKICAgICBzcDxSZXF1ZXN0VGhyZWFkPiBtUmVxdWVzdFRocmVhZDsKIApAQCAtNDM3LDcxICs1MjAsOTAgQEAKICAgICAgKi8KIAogICAgIHN0cnVjdCBJbkZsaWdodFJlcXVlc3QgewotICAgICAgICAvLyBhbmRyb2lkLnJlcXVlc3QuaWQgZm9yIHRoZSByZXF1ZXN0Ci0gICAgICAgIGludCAgICAgcmVxdWVzdElkOwogICAgICAgICAvLyBTZXQgYnkgbm90aWZ5KCkgU0hVVFRFUiBjYWxsLgogICAgICAgICBuc2Vjc190IGNhcHR1cmVUaW1lc3RhbXA7CiAgICAgICAgIGludCAgICAgcmVxdWVzdFN0YXR1czsKICAgICAgICAgLy8gU2V0IGJ5IHByb2Nlc3NfY2FwdHVyZV9yZXN1bHQgY2FsbCB3aXRoIHZhbGlkIG1ldGFkYXRhCiAgICAgICAgIGJvb2wgICAgaGF2ZVJlc3VsdE1ldGFkYXRhOwogICAgICAgICAvLyBEZWNyZW1lbnRlZCBieSBjYWxscyB0byBwcm9jZXNzX2NhcHR1cmVfcmVzdWx0IHdpdGggdmFsaWQgb3V0cHV0Ci0gICAgICAgIC8vIGJ1ZmZlcnMKKyAgICAgICAgLy8gYW5kIGlucHV0IGJ1ZmZlcnMKICAgICAgICAgaW50ICAgICBudW1CdWZmZXJzTGVmdDsKKyAgICAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcyByZXN1bHRFeHRyYXM7CisgICAgICAgIC8vIElmIHRoaXMgcmVxdWVzdCBoYXMgYW55IGlucHV0IGJ1ZmZlcgorICAgICAgICBib29sIGhhc0lucHV0QnVmZmVyOwogCi0gICAgICAgIC8vIEZpZWxkcyB1c2VkIGJ5IHRoZSBwYXJ0aWFsIHJlc3VsdCBxdWlyayBvbmx5Ci0gICAgICAgIHN0cnVjdCBQYXJ0aWFsUmVzdWx0UXVpcmtJbkZsaWdodCB7CisgICAgICAgIC8vIEZpZWxkcyB1c2VkIGJ5IHRoZSBwYXJ0aWFsIHJlc3VsdCBvbmx5CisgICAgICAgIHN0cnVjdCBQYXJ0aWFsUmVzdWx0SW5GbGlnaHQgewogICAgICAgICAgICAgLy8gU2V0IGJ5IHByb2Nlc3NfY2FwdHVyZV9yZXN1bHQgb25jZSAzQSBoYXMgYmVlbiBzZW50IHRvIGNsaWVudHMKICAgICAgICAgICAgIGJvb2wgICAgaGF2ZVNlbnQzQTsKICAgICAgICAgICAgIC8vIFJlc3VsdCBtZXRhZGF0YSBjb2xsZWN0ZWQgc28gZmFyLCB3aGVuIHBhcnRpYWwgcmVzdWx0cyBhcmUgaW4gdXNlCiAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSBjb2xsZWN0ZWRSZXN1bHQ7CiAKLSAgICAgICAgICAgIFBhcnRpYWxSZXN1bHRRdWlya0luRmxpZ2h0KCk6CisgICAgICAgICAgICBQYXJ0aWFsUmVzdWx0SW5GbGlnaHQoKToKICAgICAgICAgICAgICAgICAgICAgaGF2ZVNlbnQzQShmYWxzZSkgewogICAgICAgICAgICAgfQotICAgICAgICB9IHBhcnRpYWxSZXN1bHRRdWlyazsKKyAgICAgICAgfSBwYXJ0aWFsUmVzdWx0OwogCiAgICAgICAgIC8vIERlZmF1bHQgY29uc3RydWN0b3IgbmVlZGVkIGJ5IEtleWVkVmVjdG9yCiAgICAgICAgIEluRmxpZ2h0UmVxdWVzdCgpIDoKLSAgICAgICAgICAgICAgICByZXF1ZXN0SWQoMCksCiAgICAgICAgICAgICAgICAgY2FwdHVyZVRpbWVzdGFtcCgwKSwKICAgICAgICAgICAgICAgICByZXF1ZXN0U3RhdHVzKE9LKSwKICAgICAgICAgICAgICAgICBoYXZlUmVzdWx0TWV0YWRhdGEoZmFsc2UpLAotICAgICAgICAgICAgICAgIG51bUJ1ZmZlcnNMZWZ0KDApIHsKKyAgICAgICAgICAgICAgICBudW1CdWZmZXJzTGVmdCgwKSwKKyAgICAgICAgICAgICAgICBoYXNJbnB1dEJ1ZmZlcihmYWxzZSl7CiAgICAgICAgIH0KIAotICAgICAgICBJbkZsaWdodFJlcXVlc3QoaW50IGlkLCBpbnQgbnVtQnVmZmVycykgOgotICAgICAgICAgICAgICAgIHJlcXVlc3RJZChpZCksCisgICAgICAgIEluRmxpZ2h0UmVxdWVzdChpbnQgbnVtQnVmZmVycykgOgogICAgICAgICAgICAgICAgIGNhcHR1cmVUaW1lc3RhbXAoMCksCiAgICAgICAgICAgICAgICAgcmVxdWVzdFN0YXR1cyhPSyksCiAgICAgICAgICAgICAgICAgaGF2ZVJlc3VsdE1ldGFkYXRhKGZhbHNlKSwKLSAgICAgICAgICAgICAgICBudW1CdWZmZXJzTGVmdChudW1CdWZmZXJzKSB7CisgICAgICAgICAgICAgICAgbnVtQnVmZmVyc0xlZnQobnVtQnVmZmVycyksCisgICAgICAgICAgICAgICAgaGFzSW5wdXRCdWZmZXIoZmFsc2UpewogICAgICAgICB9Ci0gICAgfTsKKworICAgICAgICBJbkZsaWdodFJlcXVlc3QoaW50IG51bUJ1ZmZlcnMsIENhcHR1cmVSZXN1bHRFeHRyYXMgZXh0cmFzKSA6CisgICAgICAgICAgICAgICAgY2FwdHVyZVRpbWVzdGFtcCgwKSwKKyAgICAgICAgICAgICAgICByZXF1ZXN0U3RhdHVzKE9LKSwKKyAgICAgICAgICAgICAgICBoYXZlUmVzdWx0TWV0YWRhdGEoZmFsc2UpLAorICAgICAgICAgICAgICAgIG51bUJ1ZmZlcnNMZWZ0KG51bUJ1ZmZlcnMpLAorICAgICAgICAgICAgICAgIHJlc3VsdEV4dHJhcyhleHRyYXMpLAorICAgICAgICAgICAgICAgIGhhc0lucHV0QnVmZmVyKGZhbHNlKXsKKyAgICAgICAgfQorCisgICAgICAgIEluRmxpZ2h0UmVxdWVzdChpbnQgbnVtQnVmZmVycywgQ2FwdHVyZVJlc3VsdEV4dHJhcyBleHRyYXMsIGJvb2wgaGFzSW5wdXQpIDoKKyAgICAgICAgICAgICAgICBjYXB0dXJlVGltZXN0YW1wKDApLAorICAgICAgICAgICAgICAgIHJlcXVlc3RTdGF0dXMoT0spLAorICAgICAgICAgICAgICAgIGhhdmVSZXN1bHRNZXRhZGF0YShmYWxzZSksCisgICAgICAgICAgICAgICAgbnVtQnVmZmVyc0xlZnQobnVtQnVmZmVycyksCisgICAgICAgICAgICAgICAgcmVzdWx0RXh0cmFzKGV4dHJhcyksCisgICAgICAgICAgICAgICAgaGFzSW5wdXRCdWZmZXIoaGFzSW5wdXQpeworICAgICAgICB9Cit9OwogICAgIC8vIE1hcCBmcm9tIGZyYW1lIG51bWJlciB0byB0aGUgaW4tZmxpZ2h0IHJlcXVlc3Qgc3RhdGUKICAgICB0eXBlZGVmIEtleWVkVmVjdG9yPHVpbnQzMl90LCBJbkZsaWdodFJlcXVlc3Q+IEluRmxpZ2h0TWFwOwogCiAgICAgTXV0ZXggICAgICAgICAgICAgICAgICBtSW5GbGlnaHRMb2NrOyAvLyBQcm90ZWN0cyBtSW5GbGlnaHRNYXAKICAgICBJbkZsaWdodE1hcCAgICAgICAgICAgIG1JbkZsaWdodE1hcDsKIAotICAgIHN0YXR1c190IHJlZ2lzdGVySW5GbGlnaHQoaW50MzJfdCBmcmFtZU51bWJlciwgaW50MzJfdCByZXF1ZXN0SWQsCi0gICAgICAgICAgICBpbnQzMl90IG51bUJ1ZmZlcnMpOworICAgIHN0YXR1c190IHJlZ2lzdGVySW5GbGlnaHQodWludDMyX3QgZnJhbWVOdW1iZXIsCisgICAgICAgICAgICBpbnQzMl90IG51bUJ1ZmZlcnMsIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzLCBib29sIGhhc0lucHV0KTsKIAogICAgIC8qKgotICAgICAqIEZvciB0aGUgcGFydGlhbCByZXN1bHQgcXVpcmssIGNoZWNrIGlmIGFsbCAzQSBzdGF0ZSBmaWVsZHMgYXJlIGF2YWlsYWJsZQorICAgICAqIEZvciB0aGUgcGFydGlhbCByZXN1bHQsIGNoZWNrIGlmIGFsbCAzQSBzdGF0ZSBmaWVsZHMgYXJlIGF2YWlsYWJsZQogICAgICAqIGFuZCBpZiBzbywgcXVldWUgdXAgM0Etb25seSByZXN1bHQgdG8gdGhlIGNsaWVudC4gUmV0dXJucyB0cnVlIGlmIDNBCiAgICAgICogaXMgc2VudC4KICAgICAgKi8KLSAgICBib29sIHByb2Nlc3NQYXJ0aWFsM0FRdWlyayhpbnQzMl90IGZyYW1lTnVtYmVyLCBpbnQzMl90IHJlcXVlc3RJZCwKLSAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBwYXJ0aWFsKTsKKyAgICBib29sIHByb2Nlc3NQYXJ0aWFsM0FSZXN1bHQodWludDMyX3QgZnJhbWVOdW1iZXIsCisgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgcGFydGlhbCwgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKTsKIAogICAgIC8vIEhlbHBlcnMgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgM0EgbWV0YWRhdGEgaW50byB0by9mcm9tIHBhcnRpYWwgcmVzdWx0cwogICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiAgICAgYm9vbCBnZXQzQVJlc3VsdChjb25zdCBDYW1lcmFNZXRhZGF0YSYgcmVzdWx0LCBpbnQzMl90IHRhZywKLSAgICAgICAgICAgIFQqIHZhbHVlLCBpbnQzMl90IGZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgIFQqIHZhbHVlLCB1aW50MzJfdCBmcmFtZU51bWJlcik7CiAKICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICAgIGJvb2wgaW5zZXJ0M0FSZXN1bHQoQ2FtZXJhTWV0YWRhdGEgJnJlc3VsdCwgaW50MzJfdCB0YWcsIGNvbnN0IFQqIHZhbHVlLAotICAgICAgICAgICAgaW50MzJfdCBmcmFtZU51bWJlcik7CisgICAgICAgICAgICB1aW50MzJfdCBmcmFtZU51bWJlcik7CiAgICAgLyoqCiAgICAgICogVHJhY2tpbmcgZm9yIGlkbGUgZGV0ZWN0aW9uCiAgICAgICovCkBAIC01MTgsNyArNjIwLDcgQEAKIAogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgbU5leHRSZXN1bHRGcmFtZU51bWJlcjsKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgIG1OZXh0U2h1dHRlckZyYW1lTnVtYmVyOwotICAgIExpc3Q8Q2FtZXJhTWV0YWRhdGE+ICAgbVJlc3VsdFF1ZXVlOworICAgIExpc3Q8Q2FwdHVyZVJlc3VsdD4gICBtUmVzdWx0UXVldWU7CiAgICAgQ29uZGl0aW9uICAgICAgICAgICAgICBtUmVzdWx0U2lnbmFsOwogICAgIE5vdGlmaWNhdGlvbkxpc3RlbmVyICAqbUxpc3RlbmVyOwogCkBAIC01MzEsNiArNjMzLDEyIEBACiAKICAgICB2b2lkIG5vdGlmeShjb25zdCBjYW1lcmEzX25vdGlmeV9tc2cgKm1zZyk7CiAKKyAgICAvLyBTcGVjaWZpYyBub3RpZnkgaGFuZGxlcnMKKyAgICB2b2lkIG5vdGlmeUVycm9yKGNvbnN0IGNhbWVyYTNfZXJyb3JfbXNnX3QgJm1zZywKKyAgICAgICAgICAgIE5vdGlmaWNhdGlvbkxpc3RlbmVyICpsaXN0ZW5lcik7CisgICAgdm9pZCBub3RpZnlTaHV0dGVyKGNvbnN0IGNhbWVyYTNfc2h1dHRlcl9tc2dfdCAmbXNnLAorICAgICAgICAgICAgTm90aWZpY2F0aW9uTGlzdGVuZXIgKmxpc3RlbmVyKTsKKwogICAgIC8qKgogICAgICAqIFN0YXRpYyBjYWxsYmFjayBmb3J3YXJkaW5nIG1ldGhvZHMgZnJvbSBIQUwgdG8gaW5zdGFuY2UKICAgICAgKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjU2YjA5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uY3BwCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkNhbWVyYTMtRHVtbXlTdHJlYW0iCisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisjaW5jbHVkZSAiQ2FtZXJhM0R1bW15U3RyZWFtLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIGNhbWVyYTMgeworCitDYW1lcmEzRHVtbXlTdHJlYW06OkNhbWVyYTNEdW1teVN0cmVhbShpbnQgaWQpIDoKKyAgICAgICAgQ2FtZXJhM0lPU3RyZWFtQmFzZShpZCwgQ0FNRVJBM19TVFJFQU1fT1VUUFVULCBEVU1NWV9XSURUSCwgRFVNTVlfSEVJR0hULAorICAgICAgICAgICAgICAgIC8qbWF4U2l6ZSovMCwgRFVNTVlfRk9STUFUKSB7CisKK30KKworQ2FtZXJhM0R1bW15U3RyZWFtOjp+Q2FtZXJhM0R1bW15U3RyZWFtKCkgeworCit9CisKK3N0YXR1c190IENhbWVyYTNEdW1teVN0cmVhbTo6Z2V0QnVmZmVyTG9ja2VkKGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAqYnVmZmVyKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogRHVtbXkgc3RyZWFtIGNhbm5vdCBwcm9kdWNlIGJ1ZmZlcnMhIiwgbUlkKTsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IENhbWVyYTNEdW1teVN0cmVhbTo6cmV0dXJuQnVmZmVyTG9ja2VkKAorICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKKyAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBEdW1teSBzdHJlYW0gY2Fubm90IHJldHVybiBidWZmZXJzISIsIG1JZCk7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBDYW1lcmEzRHVtbXlTdHJlYW06OnJldHVybkJ1ZmZlckNoZWNrZWRMb2NrZWQoCisgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKKyAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAorICAgICAgICAgICAgYm9vbCBvdXRwdXQsCisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBzcDxGZW5jZT4gKnJlbGVhc2VGZW5jZU91dCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IER1bW15IHN0cmVhbSBjYW5ub3QgcmV0dXJuIGJ1ZmZlcnMhIiwgbUlkKTsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3ZvaWQgQ2FtZXJhM0R1bW15U3RyZWFtOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgY29uc3QgeworICAgICh2b2lkKSBhcmdzOworICAgIFN0cmluZzggbGluZXM7CisgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgU3RyZWFtWyVkXTogRHVtbXlcbiIsIG1JZCk7CisgICAgd3JpdGUoZmQsIGxpbmVzLnN0cmluZygpLCBsaW5lcy5zaXplKCkpOworCisgICAgQ2FtZXJhM0lPU3RyZWFtQmFzZTo6ZHVtcChmZCwgYXJncyk7Cit9CisKK3N0YXR1c190IENhbWVyYTNEdW1teVN0cmVhbTo6c2V0VHJhbnNmb3JtKGludCB0cmFuc2Zvcm0pIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIC8vIERvIG5vdGhpbmcKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYTNEdW1teVN0cmVhbTo6Y29uZmlndXJlUXVldWVMb2NrZWQoKSB7CisgICAgLy8gRG8gbm90aGluZworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0R1bW15U3RyZWFtOjpkaXNjb25uZWN0TG9ja2VkKCkgeworICAgIG1TdGF0ZSA9IChtU3RhdGUgPT0gU1RBVEVfSU5fUkVDT05GSUcpID8gU1RBVEVfSU5fQ09ORklHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTVEFURV9DT05TVFJVQ1RFRDsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYTNEdW1teVN0cmVhbTo6Z2V0RW5kcG9pbnRVc2FnZSh1aW50MzJfdCAqdXNhZ2UpIHsKKyAgICAqdXNhZ2UgPSBEVU1NWV9VU0FHRTsKKyAgICByZXR1cm4gT0s7Cit9CisKK307IC8vIG5hbWVzcGFjZSBjYW1lcmEzCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTQyNjIzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uaApAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBM19EVU1NWV9TVFJFQU1fSAorI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBM19EVU1NWV9TVFJFQU1fSAorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CisKKyNpbmNsdWRlICJDYW1lcmEzU3RyZWFtLmgiCisjaW5jbHVkZSAiQ2FtZXJhM0lPU3RyZWFtQmFzZS5oIgorI2luY2x1ZGUgIkNhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2UuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNhbWVyYTMgeworCisvKioKKyAqIEEgZHVtbXkgb3V0cHV0IHN0cmVhbSBjbGFzcywgdG8gYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIHdoZW4gbm8gdmFsaWQKKyAqIHN0cmVhbXMgYXJlIGNvbmZpZ3VyZWQgYnkgdGhlIGNsaWVudC4KKyAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgY2FtZXJhIEhBTCB2My4yIG9yIG9sZGVyIGRpc2FsbG93IGNvbmZpZ3VyaW5nCisgKiAwIG91dHB1dCBzdHJlYW1zLCB3aGlsZSB0aGUgcHVibGljIGNhbWVyYTIgQVBJIGFsbG93cyBmb3IgaXQuCisgKi8KK2NsYXNzIENhbWVyYTNEdW1teVN0cmVhbSA6CisgICAgICAgIHB1YmxpYyBDYW1lcmEzSU9TdHJlYW1CYXNlLAorICAgICAgICBwdWJsaWMgQ2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZSB7CisKKyAgcHVibGljOgorICAgIC8qKgorICAgICAqIFNldCB1cCBhIGR1bW15IHN0cmVhbTsgZG9lc24ndCBhY3R1YWxseSBjb25uZWN0IHRvIGFueXRoaW5nLCBhbmQgdXNlcworICAgICAqIGEgZGVmYXVsdCBkdW1teSBmb3JtYXQgYW5kIHNpemUuCisgICAgICovCisgICAgQ2FtZXJhM0R1bW15U3RyZWFtKGludCBpZCk7CisKKyAgICB2aXJ0dWFsIH5DYW1lcmEzRHVtbXlTdHJlYW0oKTsKKworICAgIC8qKgorICAgICAqIENhbWVyYTNTdHJlYW0gaW50ZXJmYWNlCisgICAgICovCisKKyAgICB2aXJ0dWFsIHZvaWQgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSBjb25zdDsKKworICAgIHN0YXR1c190ICAgICAgICAgc2V0VHJhbnNmb3JtKGludCB0cmFuc2Zvcm0pOworCisgIHByb3RlY3RlZDoKKworICAgIC8qKgorICAgICAqIE5vdGUgdGhhdCB3ZSByZWxlYXNlIHRoZSBsb2NrIGJyaWVmbHkgaW4gdGhpcyBmdW5jdGlvbgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuQnVmZmVyQ2hlY2tlZExvY2tlZCgKKyAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAorICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCisgICAgICAgICAgICBib29sIG91dHB1dCwKKyAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgIHNwPEZlbmNlPiAqcmVsZWFzZUZlbmNlT3V0KTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZGlzY29ubmVjdExvY2tlZCgpOworCisgIHByaXZhdGU6CisKKyAgICAvLyBEZWZhdWx0IGR1bW15IHBhcmFtZXRlcnM7IDMyMHgyNDAgaXMgYSByZXF1aXJlZCBzaXplIGZvciBhbGwgZGV2aWNlcywKKyAgICAvLyBvdGhlcndpc2UgYWN0IGxpa2UgYSBTdXJmYWNlVmlldyB3b3VsZC4KKyAgICBzdGF0aWMgY29uc3QgaW50IERVTU1ZX1dJRFRIID0gMzIwOworICAgIHN0YXRpYyBjb25zdCBpbnQgRFVNTVlfSEVJR0hUID0gMjQwOworICAgIHN0YXRpYyBjb25zdCBpbnQgRFVNTVlfRk9STUFUID0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEOworICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBEVU1NWV9VU0FHRSA9IEdSQUxMT0NfVVNBR0VfSFdfQ09NUE9TRVI7CisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBDYW1lcmEzU3RyZWFtIGludGVyZmFjZQorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyTG9ja2VkKGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAqYnVmZmVyKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybkJ1ZmZlckxvY2tlZCgKKyAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAorICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVRdWV1ZUxvY2tlZCgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFbmRwb2ludFVzYWdlKHVpbnQzMl90ICp1c2FnZSk7CisKK307IC8vIGNsYXNzIENhbWVyYTNEdW1teVN0cmVhbQorCit9IC8vIG5hbWVzcGFjZSBjYW1lcmEzCisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcAppbmRleCBkYTUxMjI4Li5jYzY2NDU5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAKQEAgLTE4LDggKzE4LDcgQEAKICNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCi0vLyBUaGlzIGlzIG5lZWRlZCBmb3Igc3RkaW50LmggdG8gZGVmaW5lIElOVDY0X01BWCBpbiBDKysKLSNkZWZpbmUgX19TVERDX0xJTUlUX01BQ1JPUworI2luY2x1ZGUgPGludHR5cGVzLmg+CiAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgpAQCAtMzUsNyArMzQsOCBAQAogICAgICAgICBDYW1lcmEzU3RyZWFtKGlkLCB0eXBlLAogICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIG1heFNpemUsIGZvcm1hdCksCiAgICAgICAgIG1Ub3RhbEJ1ZmZlckNvdW50KDApLAotICAgICAgICBtRGVxdWV1ZWRCdWZmZXJDb3VudCgwKSwKKyAgICAgICAgbUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50KDApLAorICAgICAgICBtSGFuZG91dE91dHB1dEJ1ZmZlckNvdW50KDApLAogICAgICAgICBtRnJhbWVDb3VudCgwKSwKICAgICAgICAgbUxhc3RUaW1lc3RhbXAoMCkgewogCkBAIC01NCwxMCArNTQsMTAgQEAKIAogYm9vbCBDYW1lcmEzSU9TdHJlYW1CYXNlOjpoYXNPdXRzdGFuZGluZ0J1ZmZlcnNMb2NrZWQoKSBjb25zdCB7CiAgICAgbnNlY3NfdCBzaWduYWxUaW1lID0gbUNvbWJpbmVkRmVuY2UtPmdldFNpZ25hbFRpbWUoKTsKLSAgICBBTE9HVigiJXM6IFN0cmVhbSAlZDogSGFzICVkIG91dHN0YW5kaW5nIGJ1ZmZlcnMsIgotICAgICAgICAgICAgIiBidWZmZXIgc2lnbmFsIHRpbWUgaXMgJWxsZCIsCi0gICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgbURlcXVldWVkQnVmZmVyQ291bnQsIHNpZ25hbFRpbWUpOwotICAgIGlmIChtRGVxdWV1ZWRCdWZmZXJDb3VudCA+IDAgfHwgc2lnbmFsVGltZSA9PSBJTlQ2NF9NQVgpIHsKKyAgICBBTE9HVigiJXM6IFN0cmVhbSAlZDogSGFzICV6dSBvdXRzdGFuZGluZyBidWZmZXJzLCIKKyAgICAgICAgICAgICIgYnVmZmVyIHNpZ25hbCB0aW1lIGlzICUiIFBSSWQ2NCwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQsIHNpZ25hbFRpbWUpOworICAgIGlmIChtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQgPiAwIHx8IHNpZ25hbFRpbWUgPT0gSU5UNjRfTUFYKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CkBAIC03MCwxMyArNzAsMTMgQEAKICAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIERpbXM6ICVkIHggJWQsIGZvcm1hdCAweCV4XG4iLAogICAgICAgICAgICAgY2FtZXJhM19zdHJlYW06OndpZHRoLCBjYW1lcmEzX3N0cmVhbTo6aGVpZ2h0LAogICAgICAgICAgICAgY2FtZXJhM19zdHJlYW06OmZvcm1hdCk7Ci0gICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBNYXggc2l6ZTogJWRcbiIsIG1NYXhTaXplKTsKKyAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIE1heCBzaXplOiAlenVcbiIsIG1NYXhTaXplKTsKICAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIFVzYWdlOiAlZCwgbWF4IEhBTCBidWZmZXJzOiAlZFxuIiwKICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtOjp1c2FnZSwgY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzKTsKLSAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIEZyYW1lcyBwcm9kdWNlZDogJWQsIGxhc3QgdGltZXN0YW1wOiAlbGxkIG5zXG4iLAorICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgRnJhbWVzIHByb2R1Y2VkOiAlZCwgbGFzdCB0aW1lc3RhbXA6ICUiIFBSSWQ2NCAiIG5zXG4iLAogICAgICAgICAgICAgbUZyYW1lQ291bnQsIG1MYXN0VGltZXN0YW1wKTsKLSAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIFRvdGFsIGJ1ZmZlcnM6ICVkLCBjdXJyZW50bHkgZGVxdWV1ZWQ6ICVkXG4iLAotICAgICAgICAgICAgbVRvdGFsQnVmZmVyQ291bnQsIG1EZXF1ZXVlZEJ1ZmZlckNvdW50KTsKKyAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIFRvdGFsIGJ1ZmZlcnM6ICV6dSwgY3VycmVudGx5IGRlcXVldWVkOiAlenVcbiIsCisgICAgICAgICAgICBtVG90YWxCdWZmZXJDb3VudCwgbUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50KTsKICAgICB3cml0ZShmZCwgbGluZXMuc3RyaW5nKCksIGxpbmVzLnNpemUoKSk7CiB9CiAKQEAgLTEwNSw2ICsxMDUsMTQgQEAKICAgICByZXR1cm4gbVRvdGFsQnVmZmVyQ291bnQ7CiB9CiAKK3NpemVfdCBDYW1lcmEzSU9TdHJlYW1CYXNlOjpnZXRIYW5kb3V0T3V0cHV0QnVmZmVyQ291bnRMb2NrZWQoKSB7CisgICAgcmV0dXJuIG1IYW5kb3V0T3V0cHV0QnVmZmVyQ291bnQ7Cit9CisKK3NpemVfdCBDYW1lcmEzSU9TdHJlYW1CYXNlOjpnZXRIYW5kb3V0SW5wdXRCdWZmZXJDb3VudExvY2tlZCgpIHsKKyAgICByZXR1cm4gKG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudCAtIG1IYW5kb3V0T3V0cHV0QnVmZmVyQ291bnQpOworfQorCiBzdGF0dXNfdCBDYW1lcmEzSU9TdHJlYW1CYXNlOjpkaXNjb25uZWN0TG9ja2VkKCkgewogICAgIHN3aXRjaCAobVN0YXRlKSB7CiAgICAgICAgIGNhc2UgU1RBVEVfSU5fUkVDT05GSUc6CkBAIC0xMTgsOSArMTI2LDkgQEAKICAgICAgICAgICAgIHJldHVybiAtRU5PVENPTk47CiAgICAgfQogCi0gICAgaWYgKG1EZXF1ZXVlZEJ1ZmZlckNvdW50ID4gMCkgewotICAgICAgICBBTE9HRSgiJXM6IENhbid0IGRpc2Nvbm5lY3Qgd2l0aCAlZCBidWZmZXJzIHN0aWxsIGRlcXVldWVkISIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtRGVxdWV1ZWRCdWZmZXJDb3VudCk7CisgICAgaWYgKG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudCA+IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW4ndCBkaXNjb25uZWN0IHdpdGggJXp1IGJ1ZmZlcnMgc3RpbGwgZGVxdWV1ZWQhIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudCk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKQEAgLTEzMSw3ICsxMzksOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCAqaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY3F1aXJlRmVuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlbGVhc2VGZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmEzX2J1ZmZlcl9zdGF0dXNfdCBzdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmEzX2J1ZmZlcl9zdGF0dXNfdCBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvdXRwdXQpIHsKICAgICAvKioKICAgICAgKiBOb3RlIHRoYXQgYWxsIGZlbmNlcyBhcmUgbm93IG93bmVkIGJ5IEhBTC4KICAgICAgKi8KQEAgLTE0NSwxNCArMTU0LDI1IEBACiAgICAgYnVmZmVyLnN0YXR1cyA9IHN0YXR1czsKIAogICAgIC8vIEluZm9ybSB0cmFja2VyIGFib3V0IGJlY29taW5nIGJ1c3kKLSAgICBpZiAobURlcXVldWVkQnVmZmVyQ291bnQgPT0gMCAmJiBtU3RhdGUgIT0gU1RBVEVfSU5fQ09ORklHICYmCisgICAgaWYgKG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudCA9PSAwICYmIG1TdGF0ZSAhPSBTVEFURV9JTl9DT05GSUcgJiYKICAgICAgICAgICAgIG1TdGF0ZSAhPSBTVEFURV9JTl9SRUNPTkZJRykgeworICAgICAgICAvKioKKyAgICAgICAgICogQXZvaWQgYSBzcHVyaW91cyBJRExFLT5BQ1RJVkUtPklETEUgdHJhbnNpdGlvbiB3aGVuIHVzaW5nIGJ1ZmZlcnMKKyAgICAgICAgICogYmVmb3JlL2FmdGVyIHJlZ2lzdGVyX3N0cmVhbV9idWZmZXJzIGR1cmluZyBpbml0aWFsIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICogb3IgcmUtY29uZmlndXJhdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogVE9ETzogSU5fQ09ORklHIGFuZCBJTl9SRUNPTkZJRyBjaGVja3Mgb25seSBtYWtlIHNlbnNlIGZvciA8SEFMMy4yCisgICAgICAgICAqLwogICAgICAgICBzcDxTdGF0dXNUcmFja2VyPiBzdGF0dXNUcmFja2VyID0gbVN0YXR1c1RyYWNrZXIucHJvbW90ZSgpOwogICAgICAgICBpZiAoc3RhdHVzVHJhY2tlciAhPSAwKSB7CiAgICAgICAgICAgICBzdGF0dXNUcmFja2VyLT5tYXJrQ29tcG9uZW50QWN0aXZlKG1TdGF0dXNJZCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgbURlcXVldWVkQnVmZmVyQ291bnQrKzsKKyAgICBtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQrKzsKKworICAgIGlmIChvdXRwdXQpIHsKKyAgICAgICAgbUhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudCsrOworICAgIH0KIH0KIAogc3RhdHVzX3QgQ2FtZXJhM0lPU3RyZWFtQmFzZTo6Z2V0QnVmZmVyUHJlY29uZGl0aW9uQ2hlY2tMb2NrZWQoKSBjb25zdCB7CkBAIC0xNjQsMTUgKzE4NCw2IEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICAvLyBPbmx5IGxpbWl0IGRlcXVldWUgYW1vdW50IHdoZW4gZnVsbHkgY29uZmlndXJlZAotICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfQ09ORklHVVJFRCAmJgotICAgICAgICAgICAgbURlcXVldWVkQnVmZmVyQ291bnQgPT0gY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzKSB7Ci0gICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBBbHJlYWR5IGRlcXVldWVkIG1heGltdW0gbnVtYmVyIG9mIHNpbXVsdGFuZW91cyIKLSAgICAgICAgICAgICAgICAiIGJ1ZmZlcnMgKCVkKSIsIF9fRlVOQ1RJT05fXywgbUlkLAotICAgICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVycyk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTE4NCw3ICsxOTUsNyBAQAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBtU3RhdGUpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIGlmIChtRGVxdWV1ZWRCdWZmZXJDb3VudCA9PSAwKSB7CisgICAgaWYgKG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudCA9PSAwKSB7CiAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBObyBidWZmZXJzIG91dHN0YW5kaW5nIHRvIHJldHVybiIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgICBtSWQpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC0yMjIsOSArMjMzLDIwIEBACiAgICAgICAgIG1Db21iaW5lZEZlbmNlID0gRmVuY2U6Om1lcmdlKG1OYW1lLCBtQ29tYmluZWRGZW5jZSwgcmVsZWFzZUZlbmNlKTsKICAgICB9CiAKLSAgICBtRGVxdWV1ZWRCdWZmZXJDb3VudC0tOwotICAgIGlmIChtRGVxdWV1ZWRCdWZmZXJDb3VudCA9PSAwICYmIG1TdGF0ZSAhPSBTVEFURV9JTl9DT05GSUcgJiYKKyAgICBpZiAob3V0cHV0KSB7CisgICAgICAgIG1IYW5kb3V0T3V0cHV0QnVmZmVyQ291bnQtLTsKKyAgICB9CisKKyAgICBtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQtLTsKKyAgICBpZiAobUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50ID09IDAgJiYgbVN0YXRlICE9IFNUQVRFX0lOX0NPTkZJRyAmJgogICAgICAgICAgICAgbVN0YXRlICE9IFNUQVRFX0lOX1JFQ09ORklHKSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBBdm9pZCBhIHNwdXJpb3VzIElETEUtPkFDVElWRS0+SURMRSB0cmFuc2l0aW9uIHdoZW4gdXNpbmcgYnVmZmVycworICAgICAgICAgKiBiZWZvcmUvYWZ0ZXIgcmVnaXN0ZXJfc3RyZWFtX2J1ZmZlcnMgZHVyaW5nIGluaXRpYWwgY29uZmlndXJhdGlvbgorICAgICAgICAgKiBvciByZS1jb25maWd1cmF0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBUT0RPOiBJTl9DT05GSUcgYW5kIElOX1JFQ09ORklHIGNoZWNrcyBvbmx5IG1ha2Ugc2Vuc2UgZm9yIDxIQUwzLjIKKyAgICAgICAgICovCiAgICAgICAgIEFMT0dWKCIlczogU3RyZWFtICVkOiBBbGwgYnVmZmVycyByZXR1cm5lZDsgbm93IGlkbGUiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgbUlkKTsKICAgICAgICAgc3A8U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciA9IG1TdGF0dXNUcmFja2VyLnByb21vdGUoKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmgKaW5kZXggZmNiOWQwNC4uYTM1YzI5MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmgKQEAgLTQ4LDcgKzQ4LDEwIEBACiAgIHByb3RlY3RlZDoKICAgICBzaXplX3QgICAgICAgICAgICBtVG90YWxCdWZmZXJDb3VudDsKICAgICAvLyBzdW0gb2YgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIHRoYXQgYXJlIGN1cnJlbnRseSBhY3F1aXJlZCBieSBIQUwKLSAgICBzaXplX3QgICAgICAgICAgICBtRGVxdWV1ZWRCdWZmZXJDb3VudDsKKyAgICBzaXplX3QgICAgICAgICAgICBtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQ7CisgICAgLy8gbnVtYmVyIG9mIG91dHB1dCBidWZmZXJzIHRoYXQgYXJlIGN1cnJlbnRseSBhY3F1aXJlZCBieSBIQUwuIFRoaXMgd2lsbCBiZQorICAgIC8vIFJlZHVuZGFudCB3aGVuIGNhbWVyYTMgc3RyZWFtcyBhcmUgbm8gbG9uZ2VyIGJpZGlyZWN0aW9uYWwgc3RyZWFtcy4KKyAgICBzaXplX3QgICAgICAgICAgICBtSGFuZG91dE91dHB1dEJ1ZmZlckNvdW50OwogICAgIENvbmRpdGlvbiAgICAgICAgIG1CdWZmZXJSZXR1cm5lZFNpZ25hbDsKICAgICB1aW50MzJfdCAgICAgICAgICBtRnJhbWVDb3VudDsKICAgICAvLyBMYXN0IHJlY2VpdmVkIG91dHB1dCBidWZmZXIncyB0aW1lc3RhbXAKQEAgLTc2LDYgKzc5LDEwIEBACiAKICAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEJ1ZmZlckNvdW50TG9ja2VkKCk7CiAKKyAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudExvY2tlZCgpOworCisgICAgdmlydHVhbCBzaXplX3QgICBnZXRIYW5kb3V0SW5wdXRCdWZmZXJDb3VudExvY2tlZCgpOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFbmRwb2ludFVzYWdlKHVpbnQzMl90ICp1c2FnZSkgPSAwOwogCiAgICAgc3RhdHVzX3QgZ2V0QnVmZmVyUHJlY29uZGl0aW9uQ2hlY2tMb2NrZWQoKSBjb25zdDsKQEAgLTkyLDcgKzk5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90ICpoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY3F1aXJlX2ZlbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVsZWFzZV9mZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhM19idWZmZXJfc3RhdHVzX3Qgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhM19idWZmZXJfc3RhdHVzX3Qgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG91dHB1dCk7CiAKIH07IC8vIGNsYXNzIENhbWVyYTNJT1N0cmVhbUJhc2UKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwCmluZGV4IDVhYTlhM2UuLjMxOWJlMWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAKQEAgLTgxLDcgKzgxLDcgQEAKICAgICAgKiBpbiB3aGljaCBjYXNlIHdlIHJlYXNzaWduIGl0IHRvIGFjcXVpcmVfZmVuY2UKICAgICAgKi8KICAgICBoYW5kb3V0QnVmZmVyTG9ja2VkKCpidWZmZXIsICYoYW5iLT5oYW5kbGUpLCAvKmFjcXVpcmVGZW5jZSovZmVuY2VGZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qcmVsZWFzZUZlbmNlKi8tMSwgQ0FNRVJBM19CVUZGRVJfU1RBVFVTX09LKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qcmVsZWFzZUZlbmNlKi8tMSwgQ0FNRVJBM19CVUZGRVJfU1RBVFVTX09LLCAvKm91dHB1dCovZmFsc2UpOwogICAgIG1CdWZmZXJzSW5GbGlnaHQucHVzaF9iYWNrKGJ1ZmZlckl0ZW0pOwogCiAgICAgcmV0dXJuIE9LOwpAQCAtMTk5LDE0ICsxOTksMzYgQEAKICAgICBhc3NlcnQobU1heFNpemUgPT0gMCk7CiAgICAgYXNzZXJ0KGNhbWVyYTNfc3RyZWFtOjpmb3JtYXQgIT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKTsKIAotICAgIG1Ub3RhbEJ1ZmZlckNvdW50ID0gQnVmZmVyUXVldWU6Ok1JTl9VTkRFUVVFVUVEX0JVRkZFUlMgKwotICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzOwotICAgIG1EZXF1ZXVlZEJ1ZmZlckNvdW50ID0gMDsKKyAgICBtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQgPSAwOwogICAgIG1GcmFtZUNvdW50ID0gMDsKIAogICAgIGlmIChtQ29uc3VtZXIuZ2V0KCkgPT0gMCkgewotICAgICAgICBzcDxCdWZmZXJRdWV1ZT4gYnEgPSBuZXcgQnVmZmVyUXVldWUoKTsKLSAgICAgICAgbUNvbnN1bWVyID0gbmV3IEJ1ZmZlckl0ZW1Db25zdW1lcihicSwgY2FtZXJhM19zdHJlYW06OnVzYWdlLAorICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBwcm9kdWNlcjsKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gY29uc3VtZXI7CisgICAgICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmcHJvZHVjZXIsICZjb25zdW1lcik7CisKKyAgICAgICAgaW50IG1pblVuZGVxdWV1ZWRCdWZmZXJzID0gMDsKKyAgICAgICAgcmVzID0gcHJvZHVjZXItPnF1ZXJ5KE5BVElWRV9XSU5ET1dfTUlOX1VOREVRVUVVRURfQlVGRkVSUywgJm1pblVuZGVxdWV1ZWRCdWZmZXJzKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSyB8fCBtaW5VbmRlcXVldWVkQnVmZmVycyA8IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBDb3VsZCBub3QgcXVlcnkgbWluIHVuZGVxdWV1ZWQgYnVmZmVycyAoZXJyb3IgJWQsIGJ1ZkNvdW50ICVkKSIsCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgcmVzLCBtaW5VbmRlcXVldWVkQnVmZmVycyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgICAgIHNpemVfdCBtaW5CdWZzID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihtaW5VbmRlcXVldWVkQnVmZmVycyk7CisgICAgICAgIC8qCisgICAgICAgICAqIFdlIHByb21pc2UgbmV2ZXIgdG8gJ2FjcXVpcmUnIG1vcmUgdGhhbiBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMKKyAgICAgICAgICogYXQgYW55IG9uZSB0aW1lLgorICAgICAgICAgKgorICAgICAgICAgKiBCb29zdCB0aGUgbnVtYmVyIHVwIHRvIG1lZXQgdGhlIG1pbmltdW0gcmVxdWlyZWQgYnVmZmVyIGNvdW50LgorICAgICAgICAgKgorICAgICAgICAgKiAoTm90ZSB0aGF0IHRoaXMgc2V0cyBjb25zdW1lci1zaWRlIGJ1ZmZlciBjb3VudCBvbmx5LAorICAgICAgICAgKiBhbmQgbm90IHRoZSBzdW0gb2YgcHJvZHVjZXIrY29uc3VtZXIgc2lkZSBhcyBpbiBvdGhlciBjYW1lcmEgc3RyZWFtcykuCisgICAgICAgICAqLworICAgICAgICBtVG90YWxCdWZmZXJDb3VudCA9IGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVycyA+IG1pbkJ1ZnMgPworICAgICAgICAgICAgY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzIDogbWluQnVmczsKKyAgICAgICAgLy8gVE9ETzogc29tZWhvdyBzZXQgdGhlIHRvdGFsIGJ1ZmZlciBjb3VudCB3aGVuIHByb2R1Y2VyIGNvbm5lY3RzPworCisgICAgICAgIG1Db25zdW1lciA9IG5ldyBCdWZmZXJJdGVtQ29uc3VtZXIoY29uc3VtZXIsIGNhbWVyYTNfc3RyZWFtOjp1c2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG90YWxCdWZmZXJDb3VudCk7CiAgICAgICAgIG1Db25zdW1lci0+c2V0TmFtZShTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYTMtSW5wdXRTdHJlYW0tJWQiLCBtSWQpKTsKICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaAppbmRleCA2ODFkNjg0Li5hZTQ5NDY3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmgKQEAgLTQ0LDYgKzQ0LDggQEAKIAogICAgIHZpcnR1YWwgdm9pZCAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MpIGNvbnN0OwogCisgICAgLy8gVE9ETzogZXhwb3NlIGFuIGludGVyZmFjZSB0byBnZXQgdGhlIElHcmFwaGljQnVmZmVyUHJvZHVjZXIKKwogICBwcml2YXRlOgogCiAgICAgdHlwZWRlZiBCdWZmZXJJdGVtQ29uc3VtZXI6OkJ1ZmZlckl0ZW0gQnVmZmVySXRlbTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwCmluZGV4IDY4Mjc1NWQuLjc3YWQ1MDMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcApAQCAtMzcsNyArMzcsOCBAQAogICAgICAgICBDYW1lcmEzSU9TdHJlYW1CYXNlKGlkLCBDQU1FUkEzX1NUUkVBTV9PVVRQVVQsIHdpZHRoLCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXhTaXplKi8wLCBmb3JtYXQpLAogICAgICAgICBtQ29uc3VtZXIoY29uc3VtZXIpLAotICAgICAgICBtVHJhbnNmb3JtKDApIHsKKyAgICAgICAgbVRyYW5zZm9ybSgwKSwKKyAgICAgICAgbVRyYWNlRmlyc3RCdWZmZXIodHJ1ZSkgewogCiAgICAgaWYgKG1Db25zdW1lciA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCIlczogQ29uc3VtZXIgaXMgTlVMTCEiLCBfX0ZVTkNUSU9OX18pOwpAQCAtNTEsNyArNTIsOCBAQAogICAgICAgICBDYW1lcmEzSU9TdHJlYW1CYXNlKGlkLCBDQU1FUkEzX1NUUkVBTV9PVVRQVVQsIHdpZHRoLCBoZWlnaHQsIG1heFNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KSwKICAgICAgICAgbUNvbnN1bWVyKGNvbnN1bWVyKSwKLSAgICAgICAgbVRyYW5zZm9ybSgwKSB7CisgICAgICAgIG1UcmFuc2Zvcm0oMCksCisgICAgICAgIG1UcmFjZUZpcnN0QnVmZmVyKHRydWUpIHsKIAogICAgIGlmIChmb3JtYXQgIT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKSB7CiAgICAgICAgIEFMT0dFKCIlczogQmFkIGZvcm1hdCBmb3Igc2l6ZS1vbmx5IHN0cmVhbTogJWQiLCBfX0ZVTkNUSU9OX18sCkBAIC0xMTksNyArMTIxLDcgQEAKICAgICAgKiBpbiB3aGljaCBjYXNlIHdlIHJlYXNzaWduIGl0IHRvIGFjcXVpcmVfZmVuY2UKICAgICAgKi8KICAgICBoYW5kb3V0QnVmZmVyTG9ja2VkKCpidWZmZXIsICYoYW5iLT5oYW5kbGUpLCAvKmFjcXVpcmVGZW5jZSovZmVuY2VGZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qcmVsZWFzZUZlbmNlKi8tMSwgQ0FNRVJBM19CVUZGRVJfU1RBVFVTX09LKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qcmVsZWFzZUZlbmNlKi8tMSwgQ0FNRVJBM19CVUZGRVJfU1RBVFVTX09LLCAvKm91dHB1dCovdHJ1ZSk7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0yMDIsNiArMjA0LDE1IEBACiAgICAgICAgICAgICAgICAgICAiICVzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgeworICAgICAgICBpZiAobVRyYWNlRmlyc3RCdWZmZXIgJiYgKHN0cmVhbV90eXBlID09IENBTUVSQTNfU1RSRUFNX09VVFBVVCkpIHsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyIHRyYWNlTG9nWzQ4XTsKKyAgICAgICAgICAgICAgICBzbnByaW50Zih0cmFjZUxvZywgc2l6ZW9mKHRyYWNlTG9nKSwgIlN0cmVhbSAlZDogZmlyc3QgZnVsbCBidWZmZXJcbiIsIG1JZCk7CisgICAgICAgICAgICAgICAgQVRSQUNFX05BTUUodHJhY2VMb2cpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVRyYWNlRmlyc3RCdWZmZXIgPSBmYWxzZTsKKyAgICAgICAgfQorCiAgICAgICAgIHJlcyA9IGN1cnJlbnRDb25zdW1lci0+cXVldWVCdWZmZXIoY3VycmVudENvbnN1bWVyLmdldCgpLAogICAgICAgICAgICAgICAgIGNvbnRhaW5lcl9vZihidWZmZXIuYnVmZmVyLCBBTmF0aXZlV2luZG93QnVmZmVyLCBoYW5kbGUpLAogICAgICAgICAgICAgICAgIGFud1JlbGVhc2VGZW5jZSk7CkBAIC0yNTcsNiArMjY4LDcgQEAKIHN0YXR1c190IENhbWVyYTNPdXRwdXRTdHJlYW06OmNvbmZpZ3VyZVF1ZXVlTG9ja2VkKCkgewogICAgIHN0YXR1c190IHJlczsKIAorICAgIG1UcmFjZUZpcnN0QnVmZmVyID0gdHJ1ZTsKICAgICBpZiAoKHJlcyA9IENhbWVyYTNJT1N0cmVhbUJhc2U6OmNvbmZpZ3VyZVF1ZXVlTG9ja2VkKCkpICE9IE9LKSB7CiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQpAQCAtMjg5LDIwICszMDEsMjUgQEAKIAogICAgIGlmIChtTWF4U2l6ZSA9PSAwKSB7CiAgICAgICAgIC8vIEZvciBidWZmZXJzIG9mIGtub3duIHNpemUKLSAgICAgICAgcmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeShtQ29uc3VtZXIuZ2V0KCksCi0gICAgICAgICAgICAgICAgY2FtZXJhM19zdHJlYW06OndpZHRoLCBjYW1lcmEzX3N0cmVhbTo6aGVpZ2h0LAotICAgICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtOjpmb3JtYXQpOworICAgICAgICByZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2RpbWVuc2lvbnMobUNvbnN1bWVyLmdldCgpLAorICAgICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtOjp3aWR0aCwgY2FtZXJhM19zdHJlYW06OmhlaWdodCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gRm9yIGJ1ZmZlcnMgd2l0aCBib3VuZGVkIHNpemUKLSAgICAgICAgcmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeShtQ29uc3VtZXIuZ2V0KCksCi0gICAgICAgICAgICAgICAgbU1heFNpemUsIDEsCi0gICAgICAgICAgICAgICAgY2FtZXJhM19zdHJlYW06OmZvcm1hdCk7CisgICAgICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZGltZW5zaW9ucyhtQ29uc3VtZXIuZ2V0KCksCisgICAgICAgICAgICAgICAgbU1heFNpemUsIDEpOwogICAgIH0KICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNvbmZpZ3VyZSBzdHJlYW0gYnVmZmVyIGdlb21ldHJ5IgotICAgICAgICAgICAgICAgICIgJWQgeCAlZCwgZm9ybWF0ICV4IGZvciBzdHJlYW0gJWQiLAorICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25maWd1cmUgc3RyZWFtIGJ1ZmZlciBkaW1lbnNpb25zIgorICAgICAgICAgICAgICAgICIgJWQgeCAlZCAobWF4U2l6ZSAlenUpIGZvciBzdHJlYW0gJWQiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhM19zdHJlYW06OndpZHRoLCBjYW1lcmEzX3N0cmVhbTo6aGVpZ2h0LAotICAgICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtOjpmb3JtYXQsIG1JZCk7CisgICAgICAgICAgICAgICAgbU1heFNpemUsIG1JZCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZm9ybWF0KG1Db25zdW1lci5nZXQoKSwKKyAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtOjpmb3JtYXQpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY29uZmlndXJlIHN0cmVhbSBidWZmZXIgZm9ybWF0ICUjeCBmb3Igc3RyZWFtICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYTNfc3RyZWFtOjpmb3JtYXQsIG1JZCk7CiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCkBAIC0zMjQsNyArMzQxLDcgQEAKICAgICB9CiAKICAgICBtVG90YWxCdWZmZXJDb3VudCA9IG1heENvbnN1bWVyQnVmZmVycyArIGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVyczsKLSAgICBtRGVxdWV1ZWRCdWZmZXJDb3VudCA9IDA7CisgICAgbUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50ID0gMDsKICAgICBtRnJhbWVDb3VudCA9IDA7CiAgICAgbUxhc3RUaW1lc3RhbXAgPSAwOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oCmluZGV4IDZjYmI5ZjQuLmJlMjc4YzUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oCkBAIC03NiwxMiArNzYsMTYgQEAKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIHNwPEZlbmNlPiAqcmVsZWFzZUZlbmNlT3V0KTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZGlzY29ubmVjdExvY2tlZCgpOworCiAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gbUNvbnN1bWVyOwogICBwcml2YXRlOgogICAgIGludCAgICAgICAgICAgICAgIG1UcmFuc2Zvcm07CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICBzZXRUcmFuc2Zvcm1Mb2NrZWQoaW50IHRyYW5zZm9ybSk7CiAKKyAgICBib29sIG1UcmFjZUZpcnN0QnVmZmVyOworCiAgICAgLyoqCiAgICAgICogSW50ZXJuYWwgQ2FtZXJhM1N0cmVhbSBpbnRlcmZhY2UKICAgICAgKi8KQEAgLTkxLDcgKzk1LDYgQEAKICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlUXVldWVMb2NrZWQoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGRpc2Nvbm5lY3RMb2NrZWQoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RW5kcG9pbnRVc2FnZSh1aW50MzJfdCAqdXNhZ2UpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcAppbmRleCA2ZDJjZjk0Li4zYzBlOTA4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAKQEAgLTIzLDYgKzIzLDggQEAKICNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNTdHJlYW0uaCIKICNpbmNsdWRlICJkZXZpY2UzL1N0YXR1c1RyYWNrZXIuaCIKIAorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogbmFtZXNwYWNlIGNhbWVyYTMgewpAQCAtMTM3LDYgKzEzOSw3IEBACiAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9DT05TVFJVQ1RFRCkgewogICAgICAgICBtU3RhdGUgPSBTVEFURV9JTl9DT05GSUc7CiAgICAgfSBlbHNlIHsgLy8gbVN0YXRlID09IFNUQVRFX0NPTkZJR1VSRUQKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtU3RhdGUgIT0gU1RBVEVfQ09ORklHVVJFRCwgIkludmFsaWQgc3RhdGU6IDB4JXgiLCBtU3RhdGUpOwogICAgICAgICBtU3RhdGUgPSBTVEFURV9JTl9SRUNPTkZJRzsKICAgICB9CiAKQEAgLTIwNiwxMSArMjA5LDYxIEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbTo6Y2FuY2VsQ29uZmlndXJhdGlvbigpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICBzd2l0Y2ggKG1TdGF0ZSkgeworICAgICAgICBjYXNlIFNUQVRFX0VSUk9SOgorICAgICAgICAgICAgQUxPR0UoIiVzOiBJbiBlcnJvciBzdGF0ZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIGNhc2UgU1RBVEVfSU5fQ09ORklHOgorICAgICAgICBjYXNlIFNUQVRFX0lOX1JFQ09ORklHOgorICAgICAgICAgICAgLy8gT0sKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNUQVRFX0NPTlNUUlVDVEVEOgorICAgICAgICBjYXNlIFNUQVRFX0NPTkZJR1VSRUQ6CisgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBjYW5jZWwgY29uZmlndXJhdGlvbiB0aGF0IGhhc24ndCBiZWVuIHN0YXJ0ZWQiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmtub3duIHN0YXRlIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBjYW1lcmEzX3N0cmVhbTo6dXNhZ2UgPSBvbGRVc2FnZTsKKyAgICBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMgPSBvbGRNYXhCdWZmZXJzOworCisgICAgbVN0YXRlID0gKG1TdGF0ZSA9PSBTVEFURV9JTl9SRUNPTkZJRykgPyBTVEFURV9DT05GSUdVUkVEIDogU1RBVEVfQ09OU1RSVUNURUQ7CisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpnZXRCdWZmZXIoY2FtZXJhM19zdHJlYW1fYnVmZmVyICpidWZmZXIpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKIAotICAgIHN0YXR1c190IHJlcyA9IGdldEJ1ZmZlckxvY2tlZChidWZmZXIpOworICAgIC8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIG9ubHkgY2FsbGVkIHdoZW4gdGhlIHN0cmVhbSBpcyBjb25maWd1cmVkIGFscmVhZHkuCisgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9DT05GSUdVUkVEKSB7CisgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBDYW4ndCBnZXQgYnVmZmVycyBpZiBzdHJlYW0gaXMgbm90IGluIENPTkZJR1VSRUQgc3RhdGUgJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBtU3RhdGUpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgLy8gV2FpdCBmb3IgbmV3IGJ1ZmZlciByZXR1cm5lZCBiYWNrIGlmIHdlIGFyZSBydW5uaW5nIGludG8gdGhlIGxpbWl0LgorICAgIGlmIChnZXRIYW5kb3V0T3V0cHV0QnVmZmVyQ291bnRMb2NrZWQoKSA9PSBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMpIHsKKyAgICAgICAgQUxPR1YoIiVzOiBBbHJlYWR5IGRlcXVldWVkIG1heCBvdXRwdXQgYnVmZmVycyAoJWQpLCB3YWl0IGZvciBuZXh0IHJldHVybmVkIG9uZS4iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzKTsKKyAgICAgICAgcmVzID0gbU91dHB1dEJ1ZmZlclJldHVybmVkU2lnbmFsLndhaXRSZWxhdGl2ZShtTG9jaywga1dhaXRGb3JCdWZmZXJEdXJhdGlvbik7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIGlmIChyZXMgPT0gVElNRURfT1VUKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiB3YWl0IGZvciBvdXRwdXQgYnVmZmVyIHJldHVybiB0aW1lZCBvdXQgYWZ0ZXIgJWxsZG1zIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAga1dhaXRGb3JCdWZmZXJEdXJhdGlvbiAvIDEwMDAwMDBMTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgcmVzID0gZ2V0QnVmZmVyTG9ja2VkKGJ1ZmZlcik7CiAgICAgaWYgKHJlcyA9PSBPSykgewogICAgICAgICBmaXJlQnVmZmVyTGlzdGVuZXJzTG9ja2VkKCpidWZmZXIsIC8qYWNxdWlyZWQqL3RydWUsIC8qb3V0cHV0Ki90cnVlKTsKICAgICB9CkBAIC0yMjMsOSArMjc2LDE4IEBACiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKKyAgICAvKioKKyAgICAgKiBUT0RPOiBDaGVjayB0aGF0IHRoZSBzdGF0ZSBpcyB2YWxpZCBmaXJzdC4KKyAgICAgKgorICAgICAqIDxIQUwzLjIgSU5fQ09ORklHIGFuZCBJTl9SRUNPTkZJRyBpbiBhZGRpdGlvbiB0byBDT05GSUdVUkVELgorICAgICAqID49IEhBTDMuMiBDT05GSUdVUkVEIG9ubHkKKyAgICAgKgorICAgICAqIERvIHRoaXMgZm9yIGdldEJ1ZmZlciBhcyB3ZWxsLgorICAgICAqLwogICAgIHN0YXR1c190IHJlcyA9IHJldHVybkJ1ZmZlckxvY2tlZChidWZmZXIsIHRpbWVzdGFtcCk7CiAgICAgaWYgKHJlcyA9PSBPSykgewogICAgICAgICBmaXJlQnVmZmVyTGlzdGVuZXJzTG9ja2VkKGJ1ZmZlciwgLyphY3F1aXJlZCovZmFsc2UsIC8qb3V0cHV0Ki90cnVlKTsKKyAgICAgICAgbU91dHB1dEJ1ZmZlclJldHVybmVkU2lnbmFsLnNpZ25hbCgpOwogICAgIH0KIAogICAgIHJldHVybiByZXM7CkBAIC0yMzQsOCArMjk2LDMwIEBACiBzdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpnZXRJbnB1dEJ1ZmZlcihjYW1lcmEzX3N0cmVhbV9idWZmZXIgKmJ1ZmZlcikgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIHN0YXR1c190IHJlcyA9IE9LOwogCi0gICAgc3RhdHVzX3QgcmVzID0gZ2V0SW5wdXRCdWZmZXJMb2NrZWQoYnVmZmVyKTsKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBvbmx5IGNhbGxlZCB3aGVuIHRoZSBzdHJlYW0gaXMgY29uZmlndXJlZCBhbHJlYWR5LgorICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfQ09ORklHVVJFRCkgeworICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogQ2FuJ3QgZ2V0IGlucHV0IGJ1ZmZlcnMgaWYgc3RyZWFtIGlzIG5vdCBpbiBDT05GSUdVUkVEIHN0YXRlICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgbVN0YXRlKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIC8vIFdhaXQgZm9yIG5ldyBidWZmZXIgcmV0dXJuZWQgYmFjayBpZiB3ZSBhcmUgcnVubmluZyBpbnRvIHRoZSBsaW1pdC4KKyAgICBpZiAoZ2V0SGFuZG91dElucHV0QnVmZmVyQ291bnRMb2NrZWQoKSA9PSBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMpIHsKKyAgICAgICAgQUxPR1YoIiVzOiBBbHJlYWR5IGRlcXVldWVkIG1heCBpbnB1dCBidWZmZXJzICglZCksIHdhaXQgZm9yIG5leHQgcmV0dXJuZWQgb25lLiIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMpOworICAgICAgICByZXMgPSBtSW5wdXRCdWZmZXJSZXR1cm5lZFNpZ25hbC53YWl0UmVsYXRpdmUobUxvY2ssIGtXYWl0Rm9yQnVmZmVyRHVyYXRpb24pOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBpZiAocmVzID09IFRJTUVEX09VVCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogd2FpdCBmb3IgaW5wdXQgYnVmZmVyIHJldHVybiB0aW1lZCBvdXQgYWZ0ZXIgJWxsZG1zIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAga1dhaXRGb3JCdWZmZXJEdXJhdGlvbiAvIDEwMDAwMDBMTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgcmVzID0gZ2V0SW5wdXRCdWZmZXJMb2NrZWQoYnVmZmVyKTsKICAgICBpZiAocmVzID09IE9LKSB7CiAgICAgICAgIGZpcmVCdWZmZXJMaXN0ZW5lcnNMb2NrZWQoKmJ1ZmZlciwgLyphY3F1aXJlZCovdHJ1ZSwgLypvdXRwdXQqL2ZhbHNlKTsKICAgICB9CkBAIC0yNTAsNiArMzM0LDcgQEAKICAgICBzdGF0dXNfdCByZXMgPSByZXR1cm5JbnB1dEJ1ZmZlckxvY2tlZChidWZmZXIpOwogICAgIGlmIChyZXMgPT0gT0spIHsKICAgICAgICAgZmlyZUJ1ZmZlckxpc3RlbmVyc0xvY2tlZChidWZmZXIsIC8qYWNxdWlyZWQqL2ZhbHNlLCAvKm91dHB1dCovZmFsc2UpOworICAgICAgICBtSW5wdXRCdWZmZXJSZXR1cm5lZFNpZ25hbC5zaWduYWwoKTsKICAgICB9CiAgICAgcmV0dXJuIHJlczsKIH0KQEAgLTMxNCwxMiArMzk5LDM1IEBACiAKIHN0YXR1c190IENhbWVyYTNTdHJlYW06OnJlZ2lzdGVyQnVmZmVyc0xvY2tlZChjYW1lcmEzX2RldmljZSAqaGFsM0RldmljZSkgewogICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICAvKioKKyAgICAgKiA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMjoKKyAgICAgKgorICAgICAqIGNhbWVyYTNfZGV2aWNlX3QtPm9wcy0+cmVnaXN0ZXJfc3RyZWFtX2J1ZmZlcnMoKSBpcyBub3QgY2FsbGVkIGFuZCBtdXN0CisgICAgICogYmUgTlVMTC4KKyAgICAgKi8KKyAgICBpZiAoaGFsM0RldmljZS0+Y29tbW9uLnZlcnNpb24gPj0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzIpIHsKKyAgICAgICAgQUxPR1YoIiVzOiByZWdpc3Rlcl9zdHJlYW1fYnVmZmVycyB1bnVzZWQgYXMgb2YgSEFMMy4yIiwgX19GVU5DVElPTl9fKTsKKworICAgICAgICBpZiAoaGFsM0RldmljZS0+b3BzLT5yZWdpc3Rlcl9zdHJlYW1fYnVmZmVycyAhPSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHJlZ2lzdGVyX3N0cmVhbV9idWZmZXJzIGlzIGRlcHJlY2F0ZWQgaW4gSEFMMy4yOyAiCisgICAgICAgICAgICAgICAgICAgICJtdXN0IGJlIHNldCB0byBOVUxMIGluIGNhbWVyYTNfZGV2aWNlOjpvcHMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0QoIiVzOiBTa2lwcGluZyBOVUxMIGNoZWNrIGZvciBkZXByZWNhdGVkIHJlZ2lzdGVyX3N0cmVhbV9idWZmZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiJXM6IHJlZ2lzdGVyX3N0cmVhbV9idWZmZXJzIHVzaW5nIGRlcHJlY2F0ZWQgY29kZSBwYXRoIiwgX19GVU5DVElPTl9fKTsKKyAgICB9CisKICAgICBzdGF0dXNfdCByZXM7CiAKICAgICBzaXplX3QgYnVmZmVyQ291bnQgPSBnZXRCdWZmZXJDb3VudExvY2tlZCgpOwogCiAgICAgVmVjdG9yPGJ1ZmZlcl9oYW5kbGVfdCo+IGJ1ZmZlcnM7Ci0gICAgYnVmZmVycy5pbnNlcnRBdChOVUxMLCAwLCBidWZmZXJDb3VudCk7CisgICAgYnVmZmVycy5pbnNlcnRBdCgvKnByb3RvdHlwZV9pdGVtKi9OVUxMLCAvKmluZGV4Ki8wLCBidWZmZXJDb3VudCk7CiAKICAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfc2V0IGJ1ZmZlclNldCA9IGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl9zZXQoKTsKICAgICBidWZmZXJTZXQuc3RyZWFtID0gdGhpczsKQEAgLTMyNyw3ICs0MzUsNyBAQAogICAgIGJ1ZmZlclNldC5idWZmZXJzID0gYnVmZmVycy5lZGl0QXJyYXkoKTsKIAogICAgIFZlY3RvcjxjYW1lcmEzX3N0cmVhbV9idWZmZXJfdD4gc3RyZWFtQnVmZmVyczsKLSAgICBzdHJlYW1CdWZmZXJzLmluc2VydEF0KGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90KCksIDAsIGJ1ZmZlckNvdW50KTsKKyAgICBzdHJlYW1CdWZmZXJzLmluc2VydEF0KGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90KCksIC8qaW5kZXgqLzAsIGJ1ZmZlckNvdW50KTsKIAogICAgIC8vIFJlZ2lzdGVyIGFsbCBidWZmZXJzIHdpdGggdGhlIEhBTC4gVGhpcyBtZWFucyBnZXR0aW5nIGFsbCB0aGUgYnVmZmVycwogICAgIC8vIGZyb20gdGhlIHN0cmVhbSwgcHJvdmlkaW5nIHRoZW0gdG8gdGhlIEhBTCB3aXRoIHRoZQpAQCAtMzUzLDcgKzQ2MSw3IEBACiAgICAgfQogICAgIGlmIChidWZmZXJJZHggPT0gYnVmZmVyQ291bnQpIHsKICAgICAgICAgLy8gR290IGFsbCBidWZmZXJzLCByZWdpc3RlciB3aXRoIEhBTAotICAgICAgICBBTE9HVigiJXM6IFJlZ2lzdGVyaW5nICVkIGJ1ZmZlcnMgd2l0aCBjYW1lcmEgSEFMIiwKKyAgICAgICAgQUxPR1YoIiVzOiBSZWdpc3RlcmluZyAlenUgYnVmZmVycyB3aXRoIGNhbWVyYSBIQUwiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmZmVyQ291bnQpOwogICAgICAgICBBVFJBQ0VfQkVHSU4oImNhbWVyYTMtPnJlZ2lzdGVyX3N0cmVhbV9idWZmZXJzIik7CiAgICAgICAgIHJlcyA9IGhhbDNEZXZpY2UtPm9wcy0+cmVnaXN0ZXJfc3RyZWFtX2J1ZmZlcnMoaGFsM0RldmljZSwKQEAgLTM5NCw2ICs1MDIsMTggQEAKIHZvaWQgQ2FtZXJhM1N0cmVhbTo6YWRkQnVmZmVyTGlzdGVuZXIoCiAgICAgICAgIHdwPENhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lcj4gbGlzdGVuZXIpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisKKyAgICBMaXN0PHdwPENhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lcj4gPjo6aXRlcmF0b3IgaXQsIGVuZDsKKyAgICBmb3IgKGl0ID0gbUJ1ZmZlckxpc3RlbmVyTGlzdC5iZWdpbigpLCBlbmQgPSBtQnVmZmVyTGlzdGVuZXJMaXN0LmVuZCgpOworICAgICAgICAgaXQgIT0gZW5kOworICAgICAgICAgKSB7CisgICAgICAgIGlmICgqaXQgPT0gbGlzdGVuZXIpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVHJ5IHRvIGFkZCB0aGUgc2FtZSBsaXN0ZW5lciB0d2ljZSwgaWdub3JpbmcuLi4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGl0Kys7CisgICAgfQorCiAgICAgbUJ1ZmZlckxpc3RlbmVyTGlzdC5wdXNoX2JhY2sobGlzdGVuZXIpOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5oCmluZGV4IDZlZWI3MjEuLmQwZTEzMzcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5oCkBAIC04Miw2ICs4MiwyMyBAQAogICogICAgU1RBVEVfQ09ORklHVVJFRCAgICAgPT4gU1RBVEVfQ09OU1RSVUNURUQ6CiAgKiAgICAgICAgV2hlbiBkaXNjb25uZWN0KCkgaXMgY2FsbGVkIGFmdGVyIG1ha2luZyBzdXJlIHN0cmVhbSBpcyBpZGxlIHdpdGgKICAqICAgICAgICB3YWl0VW50aWxJZGxlKCkuCisgKgorICogU3RhdHVzIFRyYWNraW5nOgorICogICAgRWFjaCBzdHJlYW0gaXMgdHJhY2tlZCBieSBTdGF0dXNUcmFja2VyIGFzIGEgc2VwYXJhdGUgY29tcG9uZW50LAorICogICAgZGVwZW5kaW5nIG9uIHRoZSBoYW5kZWQgb3V0IGJ1ZmZlciBjb3VudC4gVGhlIHN0YXRlIG11c3QgYmUgU1RBVEVfQ09ORklHVVJFRAorICogICAgaW4gb3JkZXIgZm9yIHRoZSBjb21wb25lbnQgdG8gYmUgbWFya2VkLgorICoKKyAqICAgIEl0J3MgbWFya2VkIGluIG9uZSBvZiB0d28gd2F5czoKKyAqCisgKiAgICAtIEFDVElWRTogT25lIG9yIG1vcmUgYnVmZmVycyBoYXZlIGJlZW4gaGFuZGVkIG91dCAod2l0aCAjZ2V0QnVmZmVyKS4KKyAqICAgIC0gSURMRTogQWxsIGJ1ZmZlcnMgaGF2ZSBiZWVuIHJldHVybmVkICh3aXRoICNyZXR1cm5CdWZmZXIpLCBhbmQgdGhlaXIKKyAqICAgICAgICAgIHJlc3BlY3RpdmUgcmVsZWFzZV9mZW5jZShzKSBoYXZlIGJlZW4gc2lnbmFsZWQuCisgKgorICogICAgQSB0eXBpY2FsIHVzZSBjYXNlIGlzIG91dHB1dCBzdHJlYW1zLiBXaGVuIHRoZSBIQUwgaGFzIGFueSBidWZmZXJzCisgKiAgICBkZXF1ZXVlZCwgdGhlIHN0cmVhbSBpcyBtYXJrZWQgQUNUSVZFLiBXaGVuIHRoZSBIQUwgcmV0dXJucyBhbGwgYnVmZmVycworICogICAgKGUuZy4gaWYgbm8gY2FwdHVyZSByZXF1ZXN0cyBhcmUgYWN0aXZlKSwgdGhlIHN0cmVhbSBpcyBtYXJrZWQgSURMRS4KKyAqICAgIEluIHRoaXMgdXNlIGNhc2UsIHRoZSBhcHAgY29uc3VtZXIgZG9lcyBub3QgYWZmZWN0IHRoZSBjb21wb25lbnQgc3RhdHVzLgorICoKICAqLwogY2xhc3MgQ2FtZXJhM1N0cmVhbSA6CiAgICAgICAgIHByb3RlY3RlZCBjYW1lcmEzX3N0cmVhbSwKQEAgLTE0Miw2ICsxNTksMTMgQEAKICAgICBzdGF0dXNfdCAgICAgICAgIGZpbmlzaENvbmZpZ3VyYXRpb24oY2FtZXJhM19kZXZpY2UgKmhhbDNEZXZpY2UpOwogCiAgICAgLyoqCisgICAgICogQ2FuY2VscyB0aGUgc3RyZWFtIGNvbmZpZ3VyYXRpb24gcHJvY2Vzcy4gVGhpcyByZXR1cm5zIHRoZSBzdHJlYW0gdG8gdGhlCisgICAgICogaW5pdGlhbCBzdGF0ZSwgYWxsb3dpbmcgaXQgdG8gYmUgY29uZmlndXJlZCBhZ2FpbiBsYXRlci4KKyAgICAgKiBUaGlzIGlzIGRvbmUgaWYgdGhlIEhBTCByZWplY3RzIHRoZSBwcm9wb3NlZCBjb21iaW5lZCBzdHJlYW0gY29uZmlndXJhdGlvbgorICAgICAqLworICAgIHN0YXR1c190ICAgICAgICAgY2FuY2VsQ29uZmlndXJhdGlvbigpOworCisgICAgLyoqCiAgICAgICogRmlsbCBpbiB0aGUgY2FtZXJhM19zdHJlYW1fYnVmZmVyIHdpdGggdGhlIG5leHQgdmFsaWQgYnVmZmVyIGZvciB0aGlzCiAgICAgICogc3RyZWFtLCB0byBoYW5kIG92ZXIgdG8gdGhlIEhBTC4KICAgICAgKgpAQCAtMjA5LDggKzIzMywxNyBAQAogICAgICAqLwogICAgIHZpcnR1YWwgdm9pZCAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MpIGNvbnN0ID0gMDsKIAorICAgIC8qKgorICAgICAqIEFkZCBhIGNhbWVyYTMgYnVmZmVyIGxpc3RlbmVyLiBBZGRpbmcgdGhlIHNhbWUgbGlzdGVuZXIgdHdpY2UgaGFzCisgICAgICogbm8gZWZmZWN0LgorICAgICAqLwogICAgIHZvaWQgICAgICAgICAgICAgYWRkQnVmZmVyTGlzdGVuZXIoCiAgICAgICAgICAgICB3cDxDYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXI+IGxpc3RlbmVyKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIGNhbWVyYTMgYnVmZmVyIGxpc3RlbmVyLiBSZW1vdmluZyB0aGUgc2FtZSBsaXN0ZW5lciB0d2ljZQorICAgICAqIG9yIHRoZSBsaXN0ZW5lciB0aGF0IHdhcyBuZXZlciBhZGRlZCBoYXMgbm8gZWZmZWN0LgorICAgICAqLwogICAgIHZvaWQgICAgICAgICAgICAgcmVtb3ZlQnVmZmVyTGlzdGVuZXIoCiAgICAgICAgICAgICBjb25zdCBzcDxDYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXI+JiBsaXN0ZW5lcik7CiAKQEAgLTI2Miw2ICsyOTUsMTIgQEAKICAgICAvLyBHZXQgdGhlIHRvdGFsIG51bWJlciBvZiBidWZmZXJzIGluIHRoZSBxdWV1ZQogICAgIHZpcnR1YWwgc2l6ZV90ICAgZ2V0QnVmZmVyQ291bnRMb2NrZWQoKSA9IDA7CiAKKyAgICAvLyBHZXQgaGFuZG91dCBvdXRwdXQgYnVmZmVyIGNvdW50LgorICAgIHZpcnR1YWwgc2l6ZV90ICAgZ2V0SGFuZG91dE91dHB1dEJ1ZmZlckNvdW50TG9ja2VkKCkgPSAwOworCisgICAgLy8gR2V0IGhhbmRvdXQgaW5wdXQgYnVmZmVyIGNvdW50LgorICAgIHZpcnR1YWwgc2l6ZV90ICAgZ2V0SGFuZG91dElucHV0QnVmZmVyQ291bnRMb2NrZWQoKSA9IDA7CisKICAgICAvLyBHZXQgdGhlIHVzYWdlIGZsYWdzIGZvciB0aGUgb3RoZXIgZW5kcG9pbnQsIG9yIHJldHVybgogICAgIC8vIElOVkFMSURfT1BFUkFUSU9OIGlmIHRoZXkgY2Fubm90IGJlIG9idGFpbmVkLgogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RW5kcG9pbnRVc2FnZSh1aW50MzJfdCAqdXNhZ2UpID0gMDsKQEAgLTI3NCw2ICszMTMsOSBAQAogICBwcml2YXRlOgogICAgIHVpbnQzMl90IG9sZFVzYWdlOwogICAgIHVpbnQzMl90IG9sZE1heEJ1ZmZlcnM7CisgICAgQ29uZGl0aW9uIG1PdXRwdXRCdWZmZXJSZXR1cm5lZFNpZ25hbDsKKyAgICBDb25kaXRpb24gbUlucHV0QnVmZmVyUmV0dXJuZWRTaWduYWw7CisgICAgc3RhdGljIGNvbnN0IG5zZWNzX3Qga1dhaXRGb3JCdWZmZXJEdXJhdGlvbiA9IDMwMDAwMDAwMDBMTDsgLy8gMzAwMCBtcwogCiAgICAgLy8gR2V0cyBhbGwgYnVmZmVycyBmcm9tIGVuZHBvaW50IGFuZCByZWdpc3RlcnMgdGhlbSB3aXRoIHRoZSBIQUwuCiAgICAgc3RhdHVzX3QgcmVnaXN0ZXJCdWZmZXJzTG9ja2VkKGNhbWVyYTNfZGV2aWNlICpoYWwzRGV2aWNlKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtSW50ZXJmYWNlLmgKaW5kZXggYzkzYWUxNS4uZGE5ODljZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtSW50ZXJmYWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtSW50ZXJmYWNlLmgKQEAgLTgyLDYgKzgyLDEzIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBmaW5pc2hDb25maWd1cmF0aW9uKGNhbWVyYTNfZGV2aWNlICpoYWwzRGV2aWNlKSA9IDA7CiAKICAgICAvKioKKyAgICAgKiBDYW5jZWxzIHRoZSBzdHJlYW0gY29uZmlndXJhdGlvbiBwcm9jZXNzLiBUaGlzIHJldHVybnMgdGhlIHN0cmVhbSB0byB0aGUKKyAgICAgKiBpbml0aWFsIHN0YXRlLCBhbGxvd2luZyBpdCB0byBiZSBjb25maWd1cmVkIGFnYWluIGxhdGVyLgorICAgICAqIFRoaXMgaXMgZG9uZSBpZiB0aGUgSEFMIHJlamVjdHMgdGhlIHByb3Bvc2VkIGNvbWJpbmVkIHN0cmVhbSBjb25maWd1cmF0aW9uCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBjYW5jZWxDb25maWd1cmF0aW9uKCkgPSAwOworCisgICAgLyoqCiAgICAgICogRmlsbCBpbiB0aGUgY2FtZXJhM19zdHJlYW1fYnVmZmVyIHdpdGggdGhlIG5leHQgdmFsaWQgYnVmZmVyIGZvciB0aGlzCiAgICAgICogc3RyZWFtLCB0byBoYW5kIG92ZXIgdG8gdGhlIEhBTC4KICAgICAgKgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzWnNsU3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1pzbFN0cmVhbS5jcHAKaW5kZXggMDRmNWRjNS4uODEzMzBlYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzWnNsU3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNac2xTdHJlYW0uY3BwCkBAIC0xOCw2ICsxOCw4IEBACiAjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogI2luY2x1ZGUgIkNhbWVyYTNac2xTdHJlYW0uaCIKQEAgLTEwOSwxNSArMTExLDE3IEBACiB9IC8vIG5hbWVzcGFjZSBhbm9ueW1vdXMKIAogQ2FtZXJhM1pzbFN0cmVhbTo6Q2FtZXJhM1pzbFN0cmVhbShpbnQgaWQsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCi0gICAgICAgIGludCBkZXB0aCkgOgorICAgICAgICBpbnQgYnVmZmVyQ291bnQpIDoKICAgICAgICAgQ2FtZXJhM091dHB1dFN0cmVhbShpZCwgQ0FNRVJBM19TVFJFQU1fQklESVJFQ1RJT05BTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCksCi0gICAgICAgIG1EZXB0aChkZXB0aCkgeworICAgICAgICBtRGVwdGgoYnVmZmVyQ291bnQpIHsKIAotICAgIHNwPEJ1ZmZlclF1ZXVlPiBicSA9IG5ldyBCdWZmZXJRdWV1ZSgpOwotICAgIG1Qcm9kdWNlciA9IG5ldyBSaW5nQnVmZmVyQ29uc3VtZXIoYnEsIEdSQUxMT0NfVVNBR0VfSFdfQ0FNRVJBX1pTTCwgZGVwdGgpOwotICAgIG1Db25zdW1lciA9IG5ldyBTdXJmYWNlKGJxKTsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBwcm9kdWNlcjsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBjb25zdW1lcjsKKyAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJnByb2R1Y2VyLCAmY29uc3VtZXIpOworICAgIG1Qcm9kdWNlciA9IG5ldyBSaW5nQnVmZmVyQ29uc3VtZXIoY29uc3VtZXIsIEdSQUxMT0NfVVNBR0VfSFdfQ0FNRVJBX1pTTCwgYnVmZmVyQ291bnQpOworICAgIG1Db25zdW1lciA9IG5ldyBTdXJmYWNlKHByb2R1Y2VyKTsKIH0KIAogQ2FtZXJhM1pzbFN0cmVhbTo6fkNhbWVyYTNac2xTdHJlYW0oKSB7CkBAIC0xNzIsNyArMTc2LDcgQEAKICAgICAgKiBpbiB3aGljaCBjYXNlIHdlIHJlYXNzaWduIGl0IHRvIGFjcXVpcmVfZmVuY2UKICAgICAgKi8KICAgICBoYW5kb3V0QnVmZmVyTG9ja2VkKCpidWZmZXIsICYoYW5iLT5oYW5kbGUpLCAvKmFjcXVpcmVGZW5jZSovZmVuY2VGZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAvKnJlbGVhc2VGZW5jZSovLTEsIENBTUVSQTNfQlVGRkVSX1NUQVRVU19PSyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgLypyZWxlYXNlRmVuY2UqLy0xLCBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfT0ssIC8qb3V0cHV0Ki9mYWxzZSk7CiAKICAgICBtQnVmZmVyc0luRmxpZ2h0LnB1c2hfYmFjayhidWZmZXJJdGVtKTsKIApAQCAtMjcxLDcgKzI3NSw3IEBACiAgICAgQ2FtZXJhM0lPU3RyZWFtQmFzZTo6ZHVtcChmZCwgYXJncyk7CiAKICAgICBsaW5lcyA9IFN0cmluZzgoKTsKLSAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIElucHV0IGJ1ZmZlcnMgcGVuZGluZzogJWQsIGluIGZsaWdodCAlZFxuIiwKKyAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIElucHV0IGJ1ZmZlcnMgcGVuZGluZzogJXp1LCBpbiBmbGlnaHQgJXp1XG4iLAogICAgICAgICAgICAgbUlucHV0QnVmZmVyUXVldWUuc2l6ZSgpLCBtQnVmZmVyc0luRmxpZ2h0LnNpemUoKSk7CiAgICAgd3JpdGUoZmQsIGxpbmVzLnN0cmluZygpLCBsaW5lcy5zaXplKCkpOwogfQpAQCAtMjk2LDggKzMwMCw5IEBACiAgICAgbnNlY3NfdCBhY3R1YWwgPSBwaW5uZWRCdWZmZXItPmdldEJ1ZmZlckl0ZW0oKS5tVGltZXN0YW1wOwogCiAgICAgaWYgKGFjdHVhbCAhPSB0aW1lc3RhbXApIHsKKyAgICAgICAgLy8gVE9ETzogdGhpcyBpcyBwcm9ibGVtYXRpYywgd2UnbGwgZW5kIHVwIHdpdGggdXNpbmcgd3JvbmcgcmVzdWx0IGZvciB0aGlzIHBpbm5lZCBidWZmZXIuCiAgICAgICAgIEFMT0dXKCIlczogWlNMIGJ1ZmZlciBjYW5kaWRhdGUgc2VhcmNoIGRpZG4ndCBmaW5kIGFuIGV4YWN0IG1hdGNoIC0tIgotICAgICAgICAgICAgICAiIHJlcXVlc3RlZCB0aW1lc3RhbXAgPSAlbGxkLCBhY3R1YWwgdGltZXN0YW1wID0gJWxsZCIsCisgICAgICAgICAgICAgICIgcmVxdWVzdGVkIHRpbWVzdGFtcCA9ICUiIFBSSWQ2NCAiLCBhY3R1YWwgdGltZXN0YW1wID0gJSIgUFJJZDY0LAogICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHRpbWVzdGFtcCwgYWN0dWFsKTsKICAgICB9CiAKQEAgLTMxMCwxNCArMzE1LDI4IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzWnNsU3RyZWFtOjpjbGVhcklucHV0UmluZ0J1ZmZlcigpIHsKK3N0YXR1c190IENhbWVyYTNac2xTdHJlYW06OmNsZWFySW5wdXRSaW5nQnVmZmVyKG5zZWNzX3QqIGxhdGVzdFRpbWVzdGFtcCkgewogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKIAorICAgIHJldHVybiBjbGVhcklucHV0UmluZ0J1ZmZlckxvY2tlZChsYXRlc3RUaW1lc3RhbXApOworfQorCitzdGF0dXNfdCBDYW1lcmEzWnNsU3RyZWFtOjpjbGVhcklucHV0UmluZ0J1ZmZlckxvY2tlZChuc2Vjc190KiBsYXRlc3RUaW1lc3RhbXApIHsKKworICAgIGlmIChsYXRlc3RUaW1lc3RhbXApIHsKKyAgICAgICAgKmxhdGVzdFRpbWVzdGFtcCA9IG1Qcm9kdWNlci0+Z2V0TGF0ZXN0VGltZXN0YW1wKCk7CisgICAgfQogICAgIG1JbnB1dEJ1ZmZlclF1ZXVlLmNsZWFyKCk7CiAKICAgICByZXR1cm4gbVByb2R1Y2VyLT5jbGVhcigpOwogfQogCitzdGF0dXNfdCBDYW1lcmEzWnNsU3RyZWFtOjpkaXNjb25uZWN0TG9ja2VkKCkgeworICAgIGNsZWFySW5wdXRSaW5nQnVmZmVyTG9ja2VkKE5VTEwpOworCisgICAgcmV0dXJuIENhbWVyYTNPdXRwdXRTdHJlYW06OmRpc2Nvbm5lY3RMb2NrZWQoKTsKK30KKwogc3RhdHVzX3QgQ2FtZXJhM1pzbFN0cmVhbTo6c2V0VHJhbnNmb3JtKGludCAvKnRyYW5zZm9ybSovKSB7CiAgICAgQUxPR1YoIiVzOiBOb3QgaW1wbGVtZW50ZWQiLCBfX0ZVTkNUSU9OX18pOwogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1pzbFN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzWnNsU3RyZWFtLmgKaW5kZXggYzdmNDQ5MC4uNTMyM2E0OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzWnNsU3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzWnNsU3RyZWFtLmgKQEAgLTM3LDEwICszNywxMCBAQAogICAgICAgICBwdWJsaWMgQ2FtZXJhM091dHB1dFN0cmVhbSB7CiAgIHB1YmxpYzoKICAgICAvKioKLSAgICAgKiBTZXQgdXAgYSBaU0wgc3RyZWFtIG9mIGEgZ2l2ZW4gcmVzb2x1dGlvbi4gRGVwdGggaXMgdGhlIG51bWJlciBvZiBidWZmZXJzCisgICAgICogU2V0IHVwIGEgWlNMIHN0cmVhbSBvZiBhIGdpdmVuIHJlc29sdXRpb24uIGJ1ZmZlckNvdW50IGlzIHRoZSBudW1iZXIgb2YgYnVmZmVycwogICAgICAqIGNhY2hlZCB3aXRoaW4gdGhlIHN0cmVhbSB0aGF0IGNhbiBiZSByZXRyaWV2ZWQgZm9yIGlucHV0LgogICAgICAqLwotICAgIENhbWVyYTNac2xTdHJlYW0oaW50IGlkLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZGVwdGgpOworICAgIENhbWVyYTNac2xTdHJlYW0oaW50IGlkLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgYnVmZmVyQ291bnQpOwogICAgIH5DYW1lcmEzWnNsU3RyZWFtKCk7CiAKICAgICB2aXJ0dWFsIHZvaWQgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSBjb25zdDsKQEAgLTU5LDggKzU5LDEwIEBACiAKICAgICAvKioKICAgICAgKiBDbGVhcnMgdGhlIGJ1ZmZlcnMgdGhhdCBjYW4gYmUgdXNlZCBieSBlbnF1ZXVlSW5wdXRCdWZmZXJCeVRpbWVzdGFtcAorICAgICAqIGxhdGVzdFRpbWVzdGFtcCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSBsYXJnZXN0IHRpbWVzdGFtcCBvZiBidWZmZXJzCisgICAgICogYmVpbmcgY2xlYXJlZCwgMCBpZiB0aGVyZSBpcyBubyBidWZmZXIgYmVpbmcgY2xlYXIuCiAgICAgICovCi0gICAgc3RhdHVzX3QgY2xlYXJJbnB1dFJpbmdCdWZmZXIoKTsKKyAgICBzdGF0dXNfdCBjbGVhcklucHV0UmluZ0J1ZmZlcihuc2Vjc190KiBsYXRlc3RUaW1lc3RhbXApOwogCiAgIHByb3RlY3RlZDoKIApAQCAtOTYsNiArOTgsMTIgQEAKICAgICAgICAgICAgIGJvb2wgb3V0cHV0LAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8RmVuY2U+ICpyZWxlYXNlRmVuY2VPdXQpOworCisgICAgLy8gRGlzY29ubmV0IHRoZSBDYW1lcmEzWnNsU3RyZWFtIHNwZWNpZmljIGJ1ZmZlclF1ZXVlcy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGRpc2Nvbm5lY3RMb2NrZWQoKTsKKworICAgIHN0YXR1c190IGNsZWFySW5wdXRSaW5nQnVmZmVyTG9ja2VkKG5zZWNzX3QqIGxhdGVzdFRpbWVzdGFtcCk7CisKIH07IC8vIGNsYXNzIENhbWVyYTNac2xTdHJlYW0KIAogfTsgLy8gbmFtZXNwYWNlIGNhbWVyYTMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvU3RhdHVzVHJhY2tlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL1N0YXR1c1RyYWNrZXIuY3BwCmluZGV4IGFiNTQxOWYuLjcyM2I1YzIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvU3RhdHVzVHJhY2tlci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9TdGF0dXNUcmFja2VyLmNwcApAQCAtMTgsOSArMTgsNiBAQAogI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQ0FNRVJBCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKLS8vIFRoaXMgaXMgbmVlZGVkIGZvciBzdGRpbnQuaCB0byBkZWZpbmUgSU5UNjRfTUFYIGluIEMrKwotI2RlZmluZSBfX1NURENfTElNSVRfTUFDUk9TCi0KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogI2luY2x1ZGUgPHVpL0ZlbmNlLmg+CkBAIC01Miw3ICs0OSw3IEBACiAgICAgICAgIEFMT0dWKCIlczogQWRkaW5nIG5ldyBjb21wb25lbnQgJWQiLCBfX0ZVTkNUSU9OX18sIGlkKTsKIAogICAgICAgICBlcnIgPSBtU3RhdGVzLmFkZChpZCwgSURMRSk7Ci0gICAgICAgIEFMT0dFX0lGKGVyciA8IDAsICIlczogQ2FuJ3QgYWRkIG5ldyBjb21wb25lbnQgJWQ6ICVzICglZCkiLAorICAgICAgICBBTE9HRV9JRihlcnIgPCAwLCAiJXM6IENhbid0IGFkZCBuZXcgY29tcG9uZW50ICVkOiAlcyAoJXpkKSIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZCwgc3RyZXJyb3IoLWVyciksIGVycik7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9ndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2d1aS9SaW5nQnVmZmVyQ29uc3VtZXIuY3BwCmluZGV4IDlhNmRjMjguLmY4NTYyZWMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2d1aS9SaW5nQnVmZmVyQ29uc3VtZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2d1aS9SaW5nQnVmZmVyQ29uc3VtZXIuY3BwCkBAIC0xNyw2ICsxNyw5IEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIlJpbmdCdWZmZXJDb25zdW1lciIKICNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0dSQVBISUNTCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmg+CkBAIC0zOCw3ICs0MSw4IEBACiAgICAgICAgIHVpbnQzMl90IGNvbnN1bWVyVXNhZ2UsCiAgICAgICAgIGludCBidWZmZXJDb3VudCkgOgogICAgIENvbnN1bWVyQmFzZShjb25zdW1lciksCi0gICAgbUJ1ZmZlckNvdW50KGJ1ZmZlckNvdW50KQorICAgIG1CdWZmZXJDb3VudChidWZmZXJDb3VudCksCisgICAgbUxhdGVzdFRpbWVzdGFtcCgwKQogewogICAgIG1Db25zdW1lci0+c2V0Q29uc3VtZXJVc2FnZUJpdHMoY29uc3VtZXJVc2FnZSk7CiAgICAgbUNvbnN1bWVyLT5zZXRNYXhBY3F1aXJlZEJ1ZmZlckNvdW50KGJ1ZmZlckNvdW50KTsKQEAgLTE0OSw2ICsxNTMsMTQgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK25zZWNzX3QgUmluZ0J1ZmZlckNvbnN1bWVyOjpnZXRMYXRlc3RUaW1lc3RhbXAoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1NdXRleCk7CisgICAgaWYgKG1CdWZmZXJJdGVtTGlzdC5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIG1MYXRlc3RUaW1lc3RhbXA7Cit9CisKIHZvaWQgUmluZ0J1ZmZlckNvbnN1bWVyOjpwaW5CdWZmZXJMb2NrZWQoY29uc3QgQnVmZmVySXRlbSYgaXRlbSkgewogICAgIExpc3Q8UmluZ0J1ZmZlckl0ZW0+OjppdGVyYXRvciBpdCwgZW5kOwogCkBAIC0xNjQsMTAgKzE3NiwxMCBAQAogICAgIH0KIAogICAgIGlmIChpdCA9PSBlbmQpIHsKLSAgICAgICAgQklfTE9HRSgiRmFpbGVkIHRvIHBpbiBidWZmZXIgKHRpbWVzdGFtcCAlbGxkLCBmcmFtZW51bWJlciAlbGxkKSIsCisgICAgICAgIEJJX0xPR0UoIkZhaWxlZCB0byBwaW4gYnVmZmVyICh0aW1lc3RhbXAgJSIgUFJJZDY0ICIsIGZyYW1lbnVtYmVyICUiIFBSSXU2NCAiKSIsCiAgICAgICAgICAgICAgICAgIGl0ZW0ubVRpbWVzdGFtcCwgaXRlbS5tRnJhbWVOdW1iZXIpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEJJX0xPR1YoIlBpbm5lZCBidWZmZXIgKGZyYW1lICVsbGQsIHRpbWVzdGFtcCAlbGxkKSIsCisgICAgICAgIEJJX0xPR1YoIlBpbm5lZCBidWZmZXIgKGZyYW1lICUiIFBSSXU2NCAiLCB0aW1lc3RhbXAgJSIgUFJJZDY0ICIpIiwKICAgICAgICAgICAgICAgICBpdGVtLm1GcmFtZU51bWJlciwgaXRlbS5tVGltZXN0YW1wKTsKICAgICB9CiB9CkBAIC0yMjIsMTIgKzIzNCwxMiBAQAogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIEJJX0xPR0UoIkZhaWxlZCB0byBhZGQgcmVsZWFzZSBmZW5jZSB0byBidWZmZXIgIgotICAgICAgICAgICAgICAgICAgICAiKHRpbWVzdGFtcCAlbGxkLCBmcmFtZW51bWJlciAlbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgIih0aW1lc3RhbXAgJSIgUFJJZDY0ICIsIGZyYW1lbnVtYmVyICUiIFBSSXU2NCwKICAgICAgICAgICAgICAgICAgICAgaXRlbS5tVGltZXN0YW1wLCBpdGVtLm1GcmFtZU51bWJlcik7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAKLSAgICAgICAgQklfTE9HVigiQXR0ZW1wdGluZyB0byByZWxlYXNlIGJ1ZmZlciB0aW1lc3RhbXAgJWxsZCwgZnJhbWUgJWxsZCIsCisgICAgICAgIEJJX0xPR1YoIkF0dGVtcHRpbmcgdG8gcmVsZWFzZSBidWZmZXIgdGltZXN0YW1wICUiIFBSSWQ2NCAiLCBmcmFtZSAlIiBQUkl1NjQsCiAgICAgICAgICAgICAgICAgaXRlbS5tVGltZXN0YW1wLCBpdGVtLm1GcmFtZU51bWJlcik7CiAKICAgICAgICAgLy8gaXRlbS5tR3JhcGhpY0J1ZmZlciB3YXMgcG9wdWxhdGVkIHdpdGggdGhlIHByb3BlciBncmFwaGljLWJ1ZmZlcgpAQCAtMjQxLDcgKzI1Myw3IEBACiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAKLSAgICAgICAgQklfTE9HVigiQnVmZmVyIHRpbWVzdGFtcCAlbGxkLCBmcmFtZSAlbGxkIGV2aWN0ZWQiLAorICAgICAgICBCSV9MT0dWKCJCdWZmZXIgdGltZXN0YW1wICUiIFBSSWQ2NCAiLCBmcmFtZSAlIiBQUkl1NjQgIiBldmljdGVkIiwKICAgICAgICAgICAgICAgICBpdGVtLm1UaW1lc3RhbXAsIGl0ZW0ubUZyYW1lTnVtYmVyKTsKIAogICAgICAgICBzaXplX3QgY3VycmVudFNpemUgPSBtQnVmZmVySXRlbUxpc3Quc2l6ZSgpOwpAQCAtMjk0LDExICszMDYsMTggQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIEJJX0xPR1YoIk5ldyBidWZmZXIgYWNxdWlyZWQgKHRpbWVzdGFtcCAlbGxkKSwgIgotICAgICAgICAgICAgICAgICJidWZmZXIgaXRlbXMgJXUgb3V0IG9mICVkIiwKKyAgICAgICAgQklfTE9HVigiTmV3IGJ1ZmZlciBhY3F1aXJlZCAodGltZXN0YW1wICUiIFBSSWQ2NCAiKSwgIgorICAgICAgICAgICAgICAgICJidWZmZXIgaXRlbXMgJXp1IG91dCBvZiAlZCIsCiAgICAgICAgICAgICAgICAgaXRlbS5tVGltZXN0YW1wLAogICAgICAgICAgICAgICAgIG1CdWZmZXJJdGVtTGlzdC5zaXplKCksIG1CdWZmZXJDb3VudCk7CiAKKyAgICAgICAgaWYgKGl0ZW0ubVRpbWVzdGFtcCA8IG1MYXRlc3RUaW1lc3RhbXApIHsKKyAgICAgICAgICAgIEJJX0xPR0UoIlRpbWVzdGFtcCAgZGVjcmVhc2VzIGZyb20gJSIgUFJJZDY0ICIgdG8gJSIgUFJJZDY0LAorICAgICAgICAgICAgICAgICAgICBtTGF0ZXN0VGltZXN0YW1wLCBpdGVtLm1UaW1lc3RhbXApOworICAgICAgICB9CisKKyAgICAgICAgbUxhdGVzdFRpbWVzdGFtcCA9IGl0ZW0ubVRpbWVzdGFtcDsKKwogICAgICAgICBpdGVtLm1HcmFwaGljQnVmZmVyID0gbVNsb3RzW2l0ZW0ubUJ1Zl0ubUdyYXBoaWNCdWZmZXI7CiAgICAgfSAvLyBlbmQgb2YgbU11dGV4IGxvY2sKIApAQCAtMzIxLDcgKzM0MCw3IEBACiAKICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgICAgICBCSV9MT0dFKCJGYWlsZWQgdG8gYWRkIHJlbGVhc2UgZmVuY2UgdG8gYnVmZmVyICIKLSAgICAgICAgICAgICAgICAgICAgICAgICIodGltZXN0YW1wICVsbGQsIGZyYW1lbnVtYmVyICVsbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIih0aW1lc3RhbXAgJSIgUFJJZDY0ICIsIGZyYW1lbnVtYmVyICUiIFBSSXU2NCwKICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ubVRpbWVzdGFtcCwgaXRlbS5tRnJhbWVOdW1iZXIpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KQEAgLTMzMywxMCArMzUyLDEwIEBACiAKICAgICBpZiAoaXQgPT0gZW5kKSB7CiAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gSWYgaXQgaGFwcGVucywgd2UgaGF2ZSBhIGJ1Zy4KLSAgICAgICAgQklfTE9HRSgiRmFpbGVkIHRvIHVucGluIGJ1ZmZlciAodGltZXN0YW1wICVsbGQsIGZyYW1lbnVtYmVyICVsbGQpIiwKKyAgICAgICAgQklfTE9HRSgiRmFpbGVkIHRvIHVucGluIGJ1ZmZlciAodGltZXN0YW1wICUiIFBSSWQ2NCAiLCBmcmFtZW51bWJlciAlIiBQUkl1NjQgIikiLAogICAgICAgICAgICAgICAgICBpdGVtLm1UaW1lc3RhbXAsIGl0ZW0ubUZyYW1lTnVtYmVyKTsKICAgICB9IGVsc2UgewotICAgICAgICBCSV9MT0dWKCJVbnBpbm5lZCBidWZmZXIgKHRpbWVzdGFtcCAlbGxkLCBmcmFtZW51bWJlciAlbGxkKSIsCisgICAgICAgIEJJX0xPR1YoIlVucGlubmVkIGJ1ZmZlciAodGltZXN0YW1wICUiIFBSSWQ2NCAiLCBmcmFtZW51bWJlciAlIiBQUkl1NjQgIikiLAogICAgICAgICAgICAgICAgICBpdGVtLm1UaW1lc3RhbXAsIGl0ZW0ubUZyYW1lTnVtYmVyKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9ndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9ndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmgKaW5kZXggYjRhZDgyNC4uZGE5N2ExMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZ3VpL1JpbmdCdWZmZXJDb25zdW1lci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2d1aS9SaW5nQnVmZmVyQ29uc3VtZXIuaApAQCAtNjQsNyArNjQsNyBAQAogICAgIC8vIGJ1ZmZlckNvdW50IHBhcmFtZXRlciBzcGVjaWZpZXMgaG93IG1hbnkgYnVmZmVycyBjYW4gYmUgcGlubmVkIGZvciB1c2VyCiAgICAgLy8gYWNjZXNzIGF0IHRoZSBzYW1lIHRpbWUuCiAgICAgUmluZ0J1ZmZlckNvbnN1bWVyKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+JiBjb25zdW1lciwgdWludDMyX3QgY29uc3VtZXJVc2FnZSwKLSAgICAgICAgICAgIGludCBidWZmZXJDb3VudCA9IEJ1ZmZlclF1ZXVlOjpNSU5fVU5ERVFVRVVFRF9CVUZGRVJTKTsKKyAgICAgICAgICAgIGludCBidWZmZXJDb3VudCk7CiAKICAgICB2aXJ0dWFsIH5SaW5nQnVmZmVyQ29uc3VtZXIoKTsKIApAQCAtMTU5LDYgKzE1OSw5IEBACiAgICAgLy8gUmVsZWFzZSBhbGwgdGhlIG5vbi1waW5uZWQgYnVmZmVycyBpbiB0aGUgcmluZyBidWZmZXIKICAgICBzdGF0dXNfdCBjbGVhcigpOwogCisgICAgLy8gUmV0dXJuIDAgaWYgUmluZ0J1ZmZlciBpcyBlbXB0eSwgb3RoZXJ3aXNlIHJldHVybiB0aW1lc3RhbXAgb2YgbGF0ZXN0IGJ1ZmZlci4KKyAgICBuc2Vjc190IGdldExhdGVzdFRpbWVzdGFtcCgpOworCiAgIHByaXZhdGU6CiAKICAgICAvLyBPdmVycmlkZSBDb25zdW1lckJhc2U6Om9uRnJhbWVBdmFpbGFibGUKQEAgLTE4MCw2ICsxODMsOSBAQAogICAgIC8vIExpc3Qgb2YgYWNxdWlyZWQgYnVmZmVycyBpbiBvdXIgcmluZyBidWZmZXIKICAgICBMaXN0PFJpbmdCdWZmZXJJdGVtPiAgICAgICBtQnVmZmVySXRlbUxpc3Q7CiAgICAgY29uc3QgaW50ICAgICAgICAgICAgICAgICAgbUJ1ZmZlckNvdW50OworCisgICAgLy8gVGltZXN0YW1wIG9mIGxhdGVzdCBidWZmZXIKKyAgICBuc2Vjc190IG1MYXRlc3RUaW1lc3RhbXA7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DYW1lcmFUcmFjZXMuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhVHJhY2VzLmNwcAppbmRleCAzNDZlMTVmLi4zNzRkYzVlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DYW1lcmFUcmFjZXMuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVRyYWNlcy5jcHAKQEAgLTc0LDEwICs3NCwxMCBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIGZkcHJpbnRmKGZkLCAiQ2FtZXJhIHRyYWNlcyAoJXp1KTpcbiIsIHBjc0xpc3Quc2l6ZSgpKTsKKyAgICBkcHJpbnRmKGZkLCAiQ2FtZXJhIHRyYWNlcyAoJXp1KTpcbiIsIHBjc0xpc3Quc2l6ZSgpKTsKIAogICAgIGlmIChwY3NMaXN0LmVtcHR5KCkpIHsKLSAgICAgICAgZmRwcmludGYoZmQsICIgIE5vIGNhbWVyYSB0cmFjZXMgY29sbGVjdGVkLlxuIik7CisgICAgICAgIGRwcmludGYoZmQsICIgIE5vIGNhbWVyYSB0cmFjZXMgY29sbGVjdGVkLlxuIik7CiAgICAgfQogCiAgICAgLy8gUHJpbnQgbmV3ZXN0IGl0ZW1zIGZpcnN0CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWxvZy9BbmRyb2lkLm1rIGIvc2VydmljZXMvbWVkaWFsb2cvQW5kcm9pZC5tawppbmRleCAwODAwNmM4Li45NWYyZmVmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWxvZy9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL21lZGlhbG9nL0FuZHJvaWQubWsKQEAgLTgsNCArOCw2IEBACiAKIExPQ0FMX01PRFVMRTo9IGxpYm1lZGlhbG9nc2VydmljZQogCitMT0NBTF8zMl9CSVRfT05MWSA6PSB0cnVlCisKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbG9nL01lZGlhTG9nU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuY3BwCmluZGV4IDY4M2ZkZjMuLjQxZGFiMWYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbG9nL01lZGlhTG9nU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFsb2cvTWVkaWFMb2dTZXJ2aWNlLmNwcApAQCAtNTQsMTMgKzU0LDEzIEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBNZWRpYUxvZ1NlcnZpY2U6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQorc3RhdHVzX3QgTWVkaWFMb2dTZXJ2aWNlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKIHsKICAgICAvLyBGSVhNRSBtZXJnZSB3aXRoIHNpbWlsYXIgYnV0IG5vdCBpZGVudGljYWwgY29kZSBhdCBzZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5jcHAKICAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0R1bXAoImFuZHJvaWQucGVybWlzc2lvbi5EVU1QIik7CiAgICAgaWYgKCEoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpID09IEFJRF9NRURJQSB8fAogICAgICAgICAgICAgUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNEdW1wKSkpIHsKLSAgICAgICAgZmRwcmludGYoZmQsICJQZXJtaXNzaW9uIERlbmlhbDogY2FuJ3QgZHVtcCBtZWRpYS5sb2cgZnJvbSBwaWQ9JWQsIHVpZD0lZFxuIiwKKyAgICAgICAgZHByaW50ZihmZCwgIlBlcm1pc3Npb24gRGVuaWFsOiBjYW4ndCBkdW1wIG1lZGlhLmxvZyBmcm9tIHBpZD0lZCwgdWlkPSVkXG4iLAogICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpOwogICAgICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC03NCw3ICs3NCw3IEBACiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuYW1lZFJlYWRlcnMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgY29uc3QgTmFtZWRSZWFkZXImIG5hbWVkUmVhZGVyID0gbmFtZWRSZWFkZXJzW2ldOwogICAgICAgICBpZiAoZmQgPj0gMCkgewotICAgICAgICAgICAgZmRwcmludGYoZmQsICJcbiVzOlxuIiwgbmFtZWRSZWFkZXIubmFtZSgpKTsKKyAgICAgICAgICAgIGRwcmludGYoZmQsICJcbiVzOlxuIiwgbmFtZWRSZWFkZXIubmFtZSgpKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dJKCIlczoiLCBuYW1lZFJlYWRlci5uYW1lKCkpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvQW5kcm9pZC5tayBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MmFlNTYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDQ1IEBACisjIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworCitpZmVxICgkKFNPVU5EX1RSSUdHRVJfVVNFX1NUVUJfTU9EVUxFKSwgMSkKKyAgICBMT0NBTF9DRkxBR1MgKz0gLURTT1VORF9UUklHR0VSX1VTRV9TVFVCX01PRFVMRQorZW5kaWYKKworTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgICAgICBcCisgICAgU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTOj0gXAorICAgIGxpYnVpIFwKKyAgICBsaWJsb2cgXAorICAgIGxpYnV0aWxzIFwKKyAgICBsaWJiaW5kZXIgXAorICAgIGxpYmN1dGlscyBcCisgICAgbGliaGFyZHdhcmUgXAorICAgIGxpYnNvdW5kdHJpZ2dlciBcCisgICAgbGlibWVkaWEKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCisgICAgbGlic2VydmljZXV0aWxpdHkKKworTE9DQUxfQ19JTkNMVURFUyArPSBcCisgICAgJChUT1BESVIpZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIKKworTE9DQUxfTU9EVUxFOj0gbGlic291bmR0cmlnZ2Vyc2VydmljZQorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NmIyM2QKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcApAQCAtMCwwICsxLDg0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiU291bmRUcmlnZ2VySHdTZXJ2aWNlIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKyNpbmNsdWRlIDxzeXN0ZW0vc291bmRfdHJpZ2dlci5oPgorI2luY2x1ZGUgPGN1dGlscy9hdG9taWMuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YmluZGVyL01lbW9yeUJhc2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9zb3VuZF90cmlnZ2VyLmg+CisjaW5jbHVkZSA8U2VydmljZVV0aWxpdGllcy5oPgorI2luY2x1ZGUgIlNvdW5kVHJpZ2dlckh3U2VydmljZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNpZmRlZiBTT1VORF9UUklHR0VSX1VTRV9TVFVCX01PRFVMRQorI2RlZmluZSBIV19NT0RVTEVfUFJFRklYICJzdHViIgorI2Vsc2UKKyNkZWZpbmUgSFdfTU9EVUxFX1BSRUZJWCAicHJpbWFyeSIKKyNlbmRpZgorCitTb3VuZFRyaWdnZXJId1NlcnZpY2U6OlNvdW5kVHJpZ2dlckh3U2VydmljZSgpCisgICAgOiBCblNvdW5kVHJpZ2dlckh3U2VydmljZSgpLAorICAgICAgbU5leHRVbmlxdWVJZCgxKSwKKyAgICAgIG1NZW1vcnlEZWFsZXIobmV3IE1lbW9yeURlYWxlcigxMDI0ICogMTAyNCwgIlNvdW5kVHJpZ2dlckh3U2VydmljZSIpKSwKKyAgICAgIG1DYXB0dXJlU3RhdGUoZmFsc2UpCit7Cit9CisKK3ZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpvbkZpcnN0UmVmKCkKK3sKKyAgICBjb25zdCBod19tb2R1bGVfdCAqbW9kOworICAgIGludCByYzsKKyAgICBzb3VuZF90cmlnZ2VyX2h3X2RldmljZSAqZGV2OworCisgICAgcmMgPSBod19nZXRfbW9kdWxlX2J5X2NsYXNzKFNPVU5EX1RSSUdHRVJfSEFSRFdBUkVfTU9EVUxFX0lELCBIV19NT0RVTEVfUFJFRklYLCAmbW9kKTsKKyAgICBpZiAocmMgIT0gMCkgeworICAgICAgICBBTE9HRSgiY291bGRuJ3QgbG9hZCBzb3VuZCB0cmlnZ2VyIG1vZHVsZSAlcy4lcyAoJXMpIiwKKyAgICAgICAgICAgICAgU09VTkRfVFJJR0dFUl9IQVJEV0FSRV9NT0RVTEVfSUQsICJwcmltYXJ5Iiwgc3RyZXJyb3IoLXJjKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcmMgPSBzb3VuZF90cmlnZ2VyX2h3X2RldmljZV9vcGVuKG1vZCwgJmRldik7CisgICAgaWYgKHJjICE9IDApIHsKKyAgICAgICAgQUxPR0UoImNvdWxkbid0IG9wZW4gc291bmQgdHJpZ2dlciBodyBkZXZpY2UgaW4gJXMuJXMgKCVzKSIsCisgICAgICAgICAgICAgIFNPVU5EX1RSSUdHRVJfSEFSRFdBUkVfTU9EVUxFX0lELCAicHJpbWFyeSIsIHN0cmVycm9yKC1yYykpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChkZXYtPmNvbW1vbi52ZXJzaW9uICE9IFNPVU5EX1RSSUdHRVJfREVWSUNFX0FQSV9WRVJTSU9OX0NVUlJFTlQpIHsKKyAgICAgICAgQUxPR0UoIndyb25nIHNvdW5kIHRyaWdnZXIgaHcgZGV2aWNlIHZlcnNpb24gJTA0eCIsIGRldi0+Y29tbW9uLnZlcnNpb24pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciBkZXNjcmlwdG9yOworICAgIHJjID0gZGV2LT5nZXRfcHJvcGVydGllcyhkZXYsICZkZXNjcmlwdG9yLnByb3BlcnRpZXMpOworICAgIGlmIChyYyAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJjb3VsZCBub3QgcmVhZCBpbXBsZW1lbnRhdGlvbiBwcm9wZXJ0aWVzIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZGVzY3JpcHRvci5oYW5kbGUgPQorICAgICAgICAgICAgKHNvdW5kX3RyaWdnZXJfbW9kdWxlX2hhbmRsZV90KWFuZHJvaWRfYXRvbWljX2luYygmbU5leHRVbmlxdWVJZCk7CisgICAgQUxPR0koImxvYWRlZCBkZWZhdWx0IG1vZHVsZSAlcywgaGFuZGxlICVkIiwgZGVzY3JpcHRvci5wcm9wZXJ0aWVzLmRlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuaGFuZGxlKTsKKworICAgIHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+IGNsaWVudDsKKyAgICBzcDxNb2R1bGU+IG1vZHVsZSA9IG5ldyBNb2R1bGUodGhpcywgZGV2LCBkZXNjcmlwdG9yLCBjbGllbnQpOworICAgIG1Nb2R1bGVzLmFkZChkZXNjcmlwdG9yLmhhbmRsZSwgbW9kdWxlKTsKKyAgICBtQ2FsbGJhY2tUaHJlYWQgPSBuZXcgQ2FsbGJhY2tUaHJlYWQodGhpcyk7Cit9CisKK1NvdW5kVHJpZ2dlckh3U2VydmljZTo6flNvdW5kVHJpZ2dlckh3U2VydmljZSgpCit7CisgICAgaWYgKG1DYWxsYmFja1RocmVhZCAhPSAwKSB7CisgICAgICAgIG1DYWxsYmFja1RocmVhZC0+ZXhpdCgpOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Nb2R1bGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNvdW5kX3RyaWdnZXJfaHdfZGV2aWNlX2Nsb3NlKG1Nb2R1bGVzLnZhbHVlQXQoaSktPmh3RGV2aWNlKCkpOworICAgIH0KK30KKworc3RhdHVzX3QgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpsaXN0TW9kdWxlcyhzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciAqbW9kdWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm51bU1vZHVsZXMpCit7CisgICAgQUxPR1YoImxpc3RNb2R1bGVzIik7CisgICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgQXV0b011dGV4IGxvY2sobVNlcnZpY2VMb2NrKTsKKyAgICBpZiAobnVtTW9kdWxlcyA9PSBOVUxMIHx8ICgqbnVtTW9kdWxlcyAhPSAwICYmIG1vZHVsZXMgPT0gTlVMTCkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc2l6ZV90IG1heE1vZHVsZXMgPSAqbnVtTW9kdWxlczsKKyAgICAqbnVtTW9kdWxlcyA9IG1Nb2R1bGVzLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Nb2R1bGVzLnNpemUoKSAmJiBpIDwgbWF4TW9kdWxlczsgaSsrKSB7CisgICAgICAgIG1vZHVsZXNbaV0gPSBtTW9kdWxlcy52YWx1ZUF0KGkpLT5kZXNjcmlwdG9yKCk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjphdHRhY2goY29uc3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SVNvdW5kVHJpZ2dlckNsaWVudD4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPElTb3VuZFRyaWdnZXI+JiBtb2R1bGVJbnRlcmZhY2UpCit7CisgICAgQUxPR1YoImF0dGFjaCBtb2R1bGUgJWQiLCBoYW5kbGUpOworICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIEF1dG9NdXRleCBsb2NrKG1TZXJ2aWNlTG9jayk7CisgICAgbW9kdWxlSW50ZXJmYWNlLmNsZWFyKCk7CisgICAgaWYgKGNsaWVudCA9PSAwKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHNzaXplX3QgaW5kZXggPSBtTW9kdWxlcy5pbmRleE9mS2V5KGhhbmRsZSk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzcDxNb2R1bGU+IG1vZHVsZSA9IG1Nb2R1bGVzLnZhbHVlQXQoaW5kZXgpOworCisgICAgbW9kdWxlLT5zZXRDbGllbnQoY2xpZW50KTsKKyAgICBjbGllbnQtPmFzQmluZGVyKCktPmxpbmtUb0RlYXRoKG1vZHVsZSk7CisgICAgbW9kdWxlSW50ZXJmYWNlID0gbW9kdWxlOworCisgICAgbW9kdWxlLT5zZXRDYXB0dXJlU3RhdGVfbChtQ2FwdHVyZVN0YXRlKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpzZXRDYXB0dXJlU3RhdGUoYm9vbCBhY3RpdmUpCit7CisgICAgQUxPR1YoInNldENhcHR1cmVTdGF0ZSAlZCIsIGFjdGl2ZSk7CisgICAgQXV0b011dGV4IGxvY2sobVNlcnZpY2VMb2NrKTsKKyAgICBtQ2FwdHVyZVN0YXRlID0gYWN0aXZlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbU1vZHVsZXMudmFsdWVBdChpKS0+c2V0Q2FwdHVyZVN0YXRlX2woYWN0aXZlKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisKK3ZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpkZXRhY2hNb2R1bGUoc3A8TW9kdWxlPiBtb2R1bGUpCit7CisgICAgQUxPR1YoImRldGFjaE1vZHVsZSIpOworICAgIEF1dG9NdXRleCBsb2NrKG1TZXJ2aWNlTG9jayk7CisgICAgbW9kdWxlLT5jbGVhckNsaWVudCgpOworfQorCisKK3N0YXRpYyBjb25zdCBpbnQga0R1bXBMb2NrUmV0cmllcyA9IDUwOworc3RhdGljIGNvbnN0IGludCBrRHVtcExvY2tTbGVlcCA9IDYwMDAwOworCitzdGF0aWMgYm9vbCB0cnlMb2NrKE11dGV4JiBtdXRleCkKK3sKKyAgICBib29sIGxvY2tlZCA9IGZhbHNlOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga0R1bXBMb2NrUmV0cmllczsgKytpKSB7CisgICAgICAgIGlmIChtdXRleC50cnlMb2NrKCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGxvY2tlZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB1c2xlZXAoa0R1bXBMb2NrU2xlZXApOworICAgIH0KKyAgICByZXR1cm4gbG9ja2VkOworfQorCitzdGF0dXNfdCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKSB7CisgICAgU3RyaW5nOCByZXN1bHQ7CisgICAgaWYgKGNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5EVU1QIikpID09IGZhbHNlKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIlBlcm1pc3Npb24gRGVuaWFsOiBjYW4ndCBkdW1wIFNvdW5kVHJpZ2dlckh3U2VydmljZSIpOworICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBib29sIGxvY2tlZCA9IHRyeUxvY2sobVNlcnZpY2VMb2NrKTsKKyAgICAgICAgLy8gZmFpbGVkIHRvIGxvY2sgLSBTb3VuZFRyaWdnZXJId1NlcnZpY2UgaXMgcHJvYmFibHkgZGVhZGxvY2tlZAorICAgICAgICBpZiAoIWxvY2tlZCkgeworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiU291bmRUcmlnZ2VySHdTZXJ2aWNlIG1heSBiZSBkZWFkbG9ja2VkXG4iKTsKKyAgICAgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxvY2tlZCkgbVNlcnZpY2VMb2NrLnVubG9jaygpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6b25UcmFuc2FjdCgKKyAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKSB7CisgICAgcmV0dXJuIEJuU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Cit9CisKKworLy8gc3RhdGljCit2b2lkIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6cmVjb2duaXRpb25DYWxsYmFjayhzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9ldmVudCAqZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb29raWUpCit7CisgICAgTW9kdWxlICptb2R1bGUgPSAoTW9kdWxlICopY29va2llOworICAgIGlmIChtb2R1bGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNwPFNvdW5kVHJpZ2dlckh3U2VydmljZT4gc2VydmljZSA9IG1vZHVsZS0+c2VydmljZSgpLnByb21vdGUoKTsKKyAgICBpZiAoc2VydmljZSA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzZXJ2aWNlLT5zZW5kUmVjb2duaXRpb25FdmVudChldmVudCwgbW9kdWxlKTsKK30KKworc3A8SU1lbW9yeT4gU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpwcmVwYXJlUmVjb2duaXRpb25FdmVudF9sKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2V2ZW50ICpldmVudCkKK3sKKyAgICBzcDxJTWVtb3J5PiBldmVudE1lbW9yeTsKKworICAgIC8vc2FuaXRpemUgZXZlbnQKKyAgICBzd2l0Y2ggKGV2ZW50LT50eXBlKSB7CisgICAgY2FzZSBTT1VORF9NT0RFTF9UWVBFX0tFWVBIUkFTRToKKyAgICAgICAgQUxPR1dfSUYoZXZlbnQtPmRhdGFfc2l6ZSAhPSAwICYmIGV2ZW50LT5kYXRhX29mZnNldCAhPQorICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHNvdW5kX3RyaWdnZXJfcGhyYXNlX3JlY29nbml0aW9uX2V2ZW50KSwKKyAgICAgICAgICAgICAgICAgICAgInByZXBhcmVSZWNvZ25pdGlvbkV2ZW50X2woKTogaW52YWxpZCBkYXRhIG9mZnNldCAldSBmb3Iga2V5cGhyYXNlIGV2ZW50IHR5cGUiLAorICAgICAgICAgICAgICAgICAgICBldmVudC0+ZGF0YV9vZmZzZXQpOworICAgICAgICBldmVudC0+ZGF0YV9vZmZzZXQgPSBzaXplb2Yoc3RydWN0IHNvdW5kX3RyaWdnZXJfcGhyYXNlX3JlY29nbml0aW9uX2V2ZW50KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTT1VORF9NT0RFTF9UWVBFX1VOS05PV046CisgICAgICAgIEFMT0dXX0lGKGV2ZW50LT5kYXRhX3NpemUgIT0gMCAmJiBldmVudC0+ZGF0YV9vZmZzZXQgIT0KKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2V2ZW50KSwKKyAgICAgICAgICAgICAgICAgICAgInByZXBhcmVSZWNvZ25pdGlvbkV2ZW50X2woKTogaW52YWxpZCBkYXRhIG9mZnNldCAldSBmb3IgdW5rbm93biBldmVudCB0eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQtPmRhdGFfb2Zmc2V0KTsKKyAgICAgICAgZXZlbnQtPmRhdGFfb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2V2ZW50KTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGV2ZW50TWVtb3J5OworICAgIH0KKworICAgIHNpemVfdCBzaXplID0gZXZlbnQtPmRhdGFfb2Zmc2V0ICsgZXZlbnQtPmRhdGFfc2l6ZTsKKyAgICBldmVudE1lbW9yeSA9IG1NZW1vcnlEZWFsZXItPmFsbG9jYXRlKHNpemUpOworICAgIGlmIChldmVudE1lbW9yeSA9PSAwIHx8IGV2ZW50TWVtb3J5LT5wb2ludGVyKCkgPT0gTlVMTCkgeworICAgICAgICBldmVudE1lbW9yeS5jbGVhcigpOworICAgICAgICByZXR1cm4gZXZlbnRNZW1vcnk7CisgICAgfQorICAgIG1lbWNweShldmVudE1lbW9yeS0+cG9pbnRlcigpLCBldmVudCwgc2l6ZSk7CisKKyAgICByZXR1cm4gZXZlbnRNZW1vcnk7Cit9CisKK3ZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpzZW5kUmVjb2duaXRpb25FdmVudChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9ldmVudCAqZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlICptb2R1bGUpCisgeworICAgICBBdXRvTXV0ZXggbG9jayhtU2VydmljZUxvY2spOworICAgICBpZiAobW9kdWxlID09IE5VTEwpIHsKKyAgICAgICAgIHJldHVybjsKKyAgICAgfQorICAgICBzcDxJTWVtb3J5PiBldmVudE1lbW9yeSA9IHByZXBhcmVSZWNvZ25pdGlvbkV2ZW50X2woZXZlbnQpOworICAgICBpZiAoZXZlbnRNZW1vcnkgPT0gMCkgeworICAgICAgICAgcmV0dXJuOworICAgICB9CisgICAgIHNwPE1vZHVsZT4gc3Ryb25nTW9kdWxlOworICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Nb2R1bGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICBpZiAobU1vZHVsZXMudmFsdWVBdChpKS5nZXQoKSA9PSBtb2R1bGUpIHsKKyAgICAgICAgICAgICBzdHJvbmdNb2R1bGUgPSBtTW9kdWxlcy52YWx1ZUF0KGkpOworICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICB9CisgICAgIGlmIChzdHJvbmdNb2R1bGUgPT0gMCkgeworICAgICAgICAgcmV0dXJuOworICAgICB9CisKKyAgICAgc2VuZENhbGxiYWNrRXZlbnRfbChuZXcgQ2FsbGJhY2tFdmVudChDYWxsYmFja0V2ZW50OjpUWVBFX1JFQ09HTklUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudE1lbW9yeSwgc3Ryb25nTW9kdWxlKSk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6OnNvdW5kTW9kZWxDYWxsYmFjayhzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2RlbF9ldmVudCAqZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvb2tpZSkKK3sKKyAgICBNb2R1bGUgKm1vZHVsZSA9IChNb2R1bGUgKiljb29raWU7CisgICAgaWYgKG1vZHVsZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3A8U291bmRUcmlnZ2VySHdTZXJ2aWNlPiBzZXJ2aWNlID0gbW9kdWxlLT5zZXJ2aWNlKCkucHJvbW90ZSgpOworICAgIGlmIChzZXJ2aWNlID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNlcnZpY2UtPnNlbmRTb3VuZE1vZGVsRXZlbnQoZXZlbnQsIG1vZHVsZSk7Cit9CisKK3NwPElNZW1vcnk+IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6cHJlcGFyZVNvdW5kTW9kZWxFdmVudF9sKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZGVsX2V2ZW50ICpldmVudCkKK3sKKyAgICBzcDxJTWVtb3J5PiBldmVudE1lbW9yeTsKKworICAgIHNpemVfdCBzaXplID0gZXZlbnQtPmRhdGFfb2Zmc2V0ICsgZXZlbnQtPmRhdGFfc2l6ZTsKKyAgICBldmVudE1lbW9yeSA9IG1NZW1vcnlEZWFsZXItPmFsbG9jYXRlKHNpemUpOworICAgIGlmIChldmVudE1lbW9yeSA9PSAwIHx8IGV2ZW50TWVtb3J5LT5wb2ludGVyKCkgPT0gTlVMTCkgeworICAgICAgICBldmVudE1lbW9yeS5jbGVhcigpOworICAgICAgICByZXR1cm4gZXZlbnRNZW1vcnk7CisgICAgfQorICAgIG1lbWNweShldmVudE1lbW9yeS0+cG9pbnRlcigpLCBldmVudCwgc2l6ZSk7CisKKyAgICByZXR1cm4gZXZlbnRNZW1vcnk7Cit9CisKK3ZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpzZW5kU291bmRNb2RlbEV2ZW50KHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZGVsX2V2ZW50ICpldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZSAqbW9kdWxlKQoreworICAgIEF1dG9NdXRleCBsb2NrKG1TZXJ2aWNlTG9jayk7CisgICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnkgPSBwcmVwYXJlU291bmRNb2RlbEV2ZW50X2woZXZlbnQpOworICAgIGlmIChldmVudE1lbW9yeSA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3A8TW9kdWxlPiBzdHJvbmdNb2R1bGU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTW9kdWxlcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobU1vZHVsZXMudmFsdWVBdChpKS5nZXQoKSA9PSBtb2R1bGUpIHsKKyAgICAgICAgICAgIHN0cm9uZ01vZHVsZSA9IG1Nb2R1bGVzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3Ryb25nTW9kdWxlID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzZW5kQ2FsbGJhY2tFdmVudF9sKG5ldyBDYWxsYmFja0V2ZW50KENhbGxiYWNrRXZlbnQ6OlRZUEVfU09VTkRNT0RFTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudE1lbW9yeSwgc3Ryb25nTW9kdWxlKSk7Cit9CisKKworc3A8SU1lbW9yeT4gU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpwcmVwYXJlU2VydmljZVN0YXRlRXZlbnRfbChzb3VuZF90cmlnZ2VyX3NlcnZpY2Vfc3RhdGVfdCBzdGF0ZSkKK3sKKyAgICBzcDxJTWVtb3J5PiBldmVudE1lbW9yeTsKKworICAgIHNpemVfdCBzaXplID0gc2l6ZW9mKHNvdW5kX3RyaWdnZXJfc2VydmljZV9zdGF0ZV90KTsKKyAgICBldmVudE1lbW9yeSA9IG1NZW1vcnlEZWFsZXItPmFsbG9jYXRlKHNpemUpOworICAgIGlmIChldmVudE1lbW9yeSA9PSAwIHx8IGV2ZW50TWVtb3J5LT5wb2ludGVyKCkgPT0gTlVMTCkgeworICAgICAgICBldmVudE1lbW9yeS5jbGVhcigpOworICAgICAgICByZXR1cm4gZXZlbnRNZW1vcnk7CisgICAgfQorICAgICooKHNvdW5kX3RyaWdnZXJfc2VydmljZV9zdGF0ZV90ICopZXZlbnRNZW1vcnktPnBvaW50ZXIoKSkgPSBzdGF0ZTsKKyAgICByZXR1cm4gZXZlbnRNZW1vcnk7Cit9CisKKy8vIGNhbGwgd2l0aCBtU2VydmljZUxvY2sgaGVsZAordm9pZCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6OnNlbmRTZXJ2aWNlU3RhdGVFdmVudF9sKHNvdW5kX3RyaWdnZXJfc2VydmljZV9zdGF0ZV90IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGUgKm1vZHVsZSkKK3sKKyAgICBzcDxJTWVtb3J5PiBldmVudE1lbW9yeSA9IHByZXBhcmVTZXJ2aWNlU3RhdGVFdmVudF9sKHN0YXRlKTsKKyAgICBpZiAoZXZlbnRNZW1vcnkgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNwPE1vZHVsZT4gc3Ryb25nTW9kdWxlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1Nb2R1bGVzLnZhbHVlQXQoaSkuZ2V0KCkgPT0gbW9kdWxlKSB7CisgICAgICAgICAgICBzdHJvbmdNb2R1bGUgPSBtTW9kdWxlcy52YWx1ZUF0KGkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHN0cm9uZ01vZHVsZSA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2VuZENhbGxiYWNrRXZlbnRfbChuZXcgQ2FsbGJhY2tFdmVudChDYWxsYmFja0V2ZW50OjpUWVBFX1NFUlZJQ0VfU1RBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRNZW1vcnksIHN0cm9uZ01vZHVsZSkpOworfQorCisvLyBjYWxsIHdpdGggbVNlcnZpY2VMb2NrIGhlbGQKK3ZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpzZW5kQ2FsbGJhY2tFdmVudF9sKGNvbnN0IHNwPENhbGxiYWNrRXZlbnQ+JiBldmVudCkKK3sKKyAgICBtQ2FsbGJhY2tUaHJlYWQtPnNlbmRDYWxsYmFja0V2ZW50KGV2ZW50KTsKK30KKwordm9pZCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Om9uQ2FsbGJhY2tFdmVudChjb25zdCBzcDxDYWxsYmFja0V2ZW50PiYgZXZlbnQpCit7CisgICAgQUxPR1YoIm9uQ2FsbGJhY2tFdmVudCIpOworICAgIHNwPE1vZHVsZT4gbW9kdWxlOworICAgIHsKKyAgICAgICAgQXV0b011dGV4IGxvY2sobVNlcnZpY2VMb2NrKTsKKyAgICAgICAgbW9kdWxlID0gZXZlbnQtPm1Nb2R1bGUucHJvbW90ZSgpOworICAgICAgICBpZiAobW9kdWxlID09IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBtb2R1bGUtPm9uQ2FsbGJhY2tFdmVudChldmVudCk7CisgICAgeworICAgICAgICBBdXRvTXV0ZXggbG9jayhtU2VydmljZUxvY2spOworICAgICAgICAvLyBjbGVhciBub3cgdG8gZXhlY3V0ZSB3aXRoIG1TZXJ2aWNlTG9jayBsb2NrZWQKKyAgICAgICAgZXZlbnQtPm1NZW1vcnkuY2xlYXIoKTsKKyAgICB9Cit9CisKKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIlNvdW5kVHJpZ2dlckh3U2VydmljZTo6Q2FsbGJhY2tUaHJlYWQiCisKK1NvdW5kVHJpZ2dlckh3U2VydmljZTo6Q2FsbGJhY2tUaHJlYWQ6OkNhbGxiYWNrVGhyZWFkKGNvbnN0IHdwPFNvdW5kVHJpZ2dlckh3U2VydmljZT4mIHNlcnZpY2UpCisgICAgOiBtU2VydmljZShzZXJ2aWNlKQoreworfQorCitTb3VuZFRyaWdnZXJId1NlcnZpY2U6OkNhbGxiYWNrVGhyZWFkOjp+Q2FsbGJhY2tUaHJlYWQoKQoreworICAgIHdoaWxlICghbUV2ZW50UXVldWUuaXNFbXB0eSgpKSB7CisgICAgICAgIG1FdmVudFF1ZXVlWzBdLT5tTWVtb3J5LmNsZWFyKCk7CisgICAgICAgIG1FdmVudFF1ZXVlLnJlbW92ZUF0KDApOworICAgIH0KK30KKwordm9pZCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6OkNhbGxiYWNrVGhyZWFkOjpvbkZpcnN0UmVmKCkKK3sKKyAgICBydW4oInNvdW5kVHJpZ2dlciBjYmsiLCBBTkRST0lEX1BSSU9SSVRZX1VSR0VOVF9BVURJTyk7Cit9CisKK2Jvb2wgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpDYWxsYmFja1RocmVhZDo6dGhyZWFkTG9vcCgpCit7CisgICAgd2hpbGUgKCFleGl0UGVuZGluZygpKSB7CisgICAgICAgIHNwPENhbGxiYWNrRXZlbnQ+IGV2ZW50OworICAgICAgICBzcDxTb3VuZFRyaWdnZXJId1NlcnZpY2U+IHNlcnZpY2U7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ2FsbGJhY2tMb2NrKTsKKyAgICAgICAgICAgIHdoaWxlIChtRXZlbnRRdWV1ZS5pc0VtcHR5KCkgJiYgIWV4aXRQZW5kaW5nKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiQ2FsbGJhY2tUaHJlYWQ6OnRocmVhZExvb3AoKSBzbGVlcCIpOworICAgICAgICAgICAgICAgIG1DYWxsYmFja0NvbmQud2FpdChtQ2FsbGJhY2tMb2NrKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiQ2FsbGJhY2tUaHJlYWQ6OnRocmVhZExvb3AoKSB3YWtlIHVwIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXhpdFBlbmRpbmcoKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXZlbnQgPSBtRXZlbnRRdWV1ZVswXTsKKyAgICAgICAgICAgIG1FdmVudFF1ZXVlLnJlbW92ZUF0KDApOworICAgICAgICAgICAgc2VydmljZSA9IG1TZXJ2aWNlLnByb21vdGUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2VydmljZSAhPSAwKSB7CisgICAgICAgICAgICBzZXJ2aWNlLT5vbkNhbGxiYWNrRXZlbnQoZXZlbnQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6OkNhbGxiYWNrVGhyZWFkOjpleGl0KCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNhbGxiYWNrTG9jayk7CisgICAgcmVxdWVzdEV4aXQoKTsKKyAgICBtQ2FsbGJhY2tDb25kLmJyb2FkY2FzdCgpOworfQorCit2b2lkIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6Q2FsbGJhY2tUaHJlYWQ6OnNlbmRDYWxsYmFja0V2ZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U291bmRUcmlnZ2VySHdTZXJ2aWNlOjpDYWxsYmFja0V2ZW50PiYgZXZlbnQpCit7CisgICAgQXV0b011dGV4IGxvY2sobUNhbGxiYWNrTG9jayk7CisgICAgbUV2ZW50UXVldWUuYWRkKGV2ZW50KTsKKyAgICBtQ2FsbGJhY2tDb25kLnNpZ25hbCgpOworfQorCitTb3VuZFRyaWdnZXJId1NlcnZpY2U6OkNhbGxiYWNrRXZlbnQ6OkNhbGxiYWNrRXZlbnQoZXZlbnRfdHlwZSB0eXBlLCBzcDxJTWVtb3J5PiBtZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3A8TW9kdWxlPiBtb2R1bGUpCisgICAgOiBtVHlwZSh0eXBlKSwgbU1lbW9yeShtZW1vcnkpLCBtTW9kdWxlKG1vZHVsZSkKK3sKK30KKworU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpDYWxsYmFja0V2ZW50Ojp+Q2FsbGJhY2tFdmVudCgpCit7Cit9CisKKworI3VuZGVmIExPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyAiU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGUiCisKK1NvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlOjpNb2R1bGUoY29uc3Qgc3A8U291bmRUcmlnZ2VySHdTZXJ2aWNlPiYgc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmRfdHJpZ2dlcl9od19kZXZpY2UqIGh3RGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+JiBjbGllbnQpCisgOiBtU2VydmljZShzZXJ2aWNlKSwgbUh3RGV2aWNlKGh3RGV2aWNlKSwgbURlc2NyaXB0b3IoZGVzY3JpcHRvciksCisgICBtQ2xpZW50KGNsaWVudCksIG1TZXJ2aWNlU3RhdGUoU09VTkRfVFJJR0dFUl9TVEFURV9OT19JTklUKQoreworfQorCitTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZTo6fk1vZHVsZSgpIHsKK30KKwordm9pZCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZTo6ZGV0YWNoKCkgeworICAgIEFMT0dWKCJkZXRhY2goKSIpOworICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB7CisgICAgICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTW9kZWxzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzcDxNb2RlbD4gbW9kZWwgPSBtTW9kZWxzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBBTE9HVigiZGV0YWNoKCkgdW5sb2FkaW5nIG1vZGVsICVkIiwgbW9kZWwtPm1IYW5kbGUpOworICAgICAgICAgICAgaWYgKG1vZGVsLT5tU3RhdGUgPT0gTW9kZWw6OlNUQVRFX0FDVElWRSkgeworICAgICAgICAgICAgICAgIG1Id0RldmljZS0+c3RvcF9yZWNvZ25pdGlvbihtSHdEZXZpY2UsIG1vZGVsLT5tSGFuZGxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Id0RldmljZS0+dW5sb2FkX3NvdW5kX21vZGVsKG1Id0RldmljZSwgbW9kZWwtPm1IYW5kbGUpOworICAgICAgICB9CisgICAgICAgIG1Nb2RlbHMuY2xlYXIoKTsKKyAgICB9CisgICAgaWYgKG1DbGllbnQgIT0gMCkgeworICAgICAgICBtQ2xpZW50LT5hc0JpbmRlcigpLT51bmxpbmtUb0RlYXRoKHRoaXMpOworICAgIH0KKyAgICBzcDxTb3VuZFRyaWdnZXJId1NlcnZpY2U+IHNlcnZpY2UgPSBtU2VydmljZS5wcm9tb3RlKCk7CisgICAgaWYgKHNlcnZpY2UgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNlcnZpY2UtPmRldGFjaE1vZHVsZSh0aGlzKTsKK30KKworc3RhdHVzX3QgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGU6OmxvYWRTb3VuZE1vZGVsKGNvbnN0IHNwPElNZW1vcnk+JiBtb2RlbE1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmRfbW9kZWxfaGFuZGxlX3QgKmhhbmRsZSkKK3sKKyAgICBBTE9HVigibG9hZFNvdW5kTW9kZWwoKSBoYW5kbGUiKTsKKyAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICBpZiAobW9kZWxNZW1vcnkgPT0gMCB8fCBtb2RlbE1lbW9yeS0+cG9pbnRlcigpID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImxvYWRTb3VuZE1vZGVsKCkgbW9kZWxNZW1vcnkgaXMgMCBvciBoYXMgTlVMTCBwb2ludGVyKCkiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfc291bmRfbW9kZWwgKnNvdW5kX21vZGVsID0KKyAgICAgICAgICAgIChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9zb3VuZF9tb2RlbCAqKW1vZGVsTWVtb3J5LT5wb2ludGVyKCk7CisKKyAgICBzaXplX3Qgc3RydWN0U2l6ZTsKKyAgICBpZiAoc291bmRfbW9kZWwtPnR5cGUgPT0gU09VTkRfTU9ERUxfVFlQRV9LRVlQSFJBU0UpIHsKKyAgICAgICAgc3RydWN0U2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9waHJhc2Vfc291bmRfbW9kZWwpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0cnVjdFNpemUgPSBzaXplb2Yoc3RydWN0IHNvdW5kX3RyaWdnZXJfc291bmRfbW9kZWwpOworICAgIH0KKworICAgIGlmIChzb3VuZF9tb2RlbC0+ZGF0YV9vZmZzZXQgPCBzdHJ1Y3RTaXplIHx8CisgICAgICAgICAgIHNvdW5kX21vZGVsLT5kYXRhX3NpemUgPiAoVUlOVF9NQVggLSBzb3VuZF9tb2RlbC0+ZGF0YV9vZmZzZXQpIHx8CisgICAgICAgICAgIG1vZGVsTWVtb3J5LT5zaXplKCkgPCBzb3VuZF9tb2RlbC0+ZGF0YV9vZmZzZXQgfHwKKyAgICAgICAgICAgc291bmRfbW9kZWwtPmRhdGFfc2l6ZSA+IChtb2RlbE1lbW9yeS0+c2l6ZSgpIC0gc291bmRfbW9kZWwtPmRhdGFfb2Zmc2V0KSkgeworICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjMwMTQ4NTQ2Iik7CisgICAgICAgIEFMT0dFKCJsb2FkU291bmRNb2RlbCgpIGRhdGFfc2l6ZSBpcyB0b28gYmlnIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1Id0RldmljZS0+bG9hZF9zb3VuZF9tb2RlbChtSHdEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kX21vZGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VuZFRyaWdnZXJId1NlcnZpY2U6OnNvdW5kTW9kZWxDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uOworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlOworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2U7CisKKyAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6YWNxdWlyZVNvdW5kVHJpZ2dlclNlc3Npb24oJnNlc3Npb24sICZpb0hhbmRsZSwgJmRldmljZSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHNwPE1vZGVsPiBtb2RlbCA9IG5ldyBNb2RlbCgqaGFuZGxlLCBzZXNzaW9uLCBpb0hhbmRsZSwgZGV2aWNlLCBzb3VuZF9tb2RlbC0+dHlwZSk7CisgICAgbU1vZGVscy5yZXBsYWNlVmFsdWVGb3IoKmhhbmRsZSwgbW9kZWwpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGU6OnVubG9hZFNvdW5kTW9kZWwoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIEFMT0dWKCJ1bmxvYWRTb3VuZE1vZGVsKCkgbW9kZWwgaGFuZGxlICVkIiwgaGFuZGxlKTsKKyAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgc3NpemVfdCBpbmRleCA9IG1Nb2RlbHMuaW5kZXhPZktleShoYW5kbGUpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3A8TW9kZWw+IG1vZGVsID0gbU1vZGVscy52YWx1ZUF0KGluZGV4KTsKKyAgICBtTW9kZWxzLnJlbW92ZUl0ZW0oaGFuZGxlKTsKKyAgICBpZiAobW9kZWwtPm1TdGF0ZSA9PSBNb2RlbDo6U1RBVEVfQUNUSVZFKSB7CisgICAgICAgIG1Id0RldmljZS0+c3RvcF9yZWNvZ25pdGlvbihtSHdEZXZpY2UsIG1vZGVsLT5tSGFuZGxlKTsKKyAgICB9CisgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VTb3VuZFRyaWdnZXJTZXNzaW9uKG1vZGVsLT5tQ2FwdHVyZVNlc3Npb24pOworICAgIHJldHVybiBtSHdEZXZpY2UtPnVubG9hZF9zb3VuZF9tb2RlbChtSHdEZXZpY2UsIGhhbmRsZSk7Cit9CisKK3N0YXR1c190IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlOjpzdGFydFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhTWVtb3J5KQoreworICAgIEFMT0dWKCJzdGFydFJlY29nbml0aW9uKCkgbW9kZWwgaGFuZGxlICVkIiwgaGFuZGxlKTsKKyAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICBpZiAoZGF0YU1lbW9yeSA9PSAwIHx8IGRhdGFNZW1vcnktPnBvaW50ZXIoKSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJzdGFydFJlY29nbml0aW9uKCkgZGF0YU1lbW9yeSBpcyAwIG9yIGhhcyBOVUxMIHBvaW50ZXIoKSIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworCisgICAgfQorCisgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fY29uZmlnICpjb25maWcgPQorICAgICAgICAgICAgKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2NvbmZpZyAqKWRhdGFNZW1vcnktPnBvaW50ZXIoKTsKKworICAgIGlmIChjb25maWctPmRhdGFfb2Zmc2V0IDwgc2l6ZW9mKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2NvbmZpZykgfHwKKyAgICAgICAgICAgIGNvbmZpZy0+ZGF0YV9zaXplID4gKFVJTlRfTUFYIC0gY29uZmlnLT5kYXRhX29mZnNldCkgfHwKKyAgICAgICAgICAgIGRhdGFNZW1vcnktPnNpemUoKSA8IGNvbmZpZy0+ZGF0YV9vZmZzZXQgfHwKKyAgICAgICAgICAgIGNvbmZpZy0+ZGF0YV9zaXplID4gKGRhdGFNZW1vcnktPnNpemUoKSAtIGNvbmZpZy0+ZGF0YV9vZmZzZXQpKSB7CisgICAgICAgIEFMT0dFKCJzdGFydFJlY29nbml0aW9uKCkgZGF0YV9zaXplIGlzIHRvbyBiaWciKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgaWYgKG1TZXJ2aWNlU3RhdGUgPT0gU09VTkRfVFJJR0dFUl9TVEFURV9ESVNBQkxFRCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIHNwPE1vZGVsPiBtb2RlbCA9IGdldE1vZGVsKGhhbmRsZSk7CisgICAgaWYgKG1vZGVsID09IDApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAobW9kZWwtPm1TdGF0ZSA9PSBNb2RlbDo6U1RBVEVfQUNUSVZFKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKworICAgIC8vVE9ETzogZ2V0IGNhcHR1cmUgaGFuZGxlIGFuZCBkZXZpY2UgZnJvbSBhdWRpbyBwb2xpY3kgc2VydmljZQorICAgIGNvbmZpZy0+Y2FwdHVyZV9oYW5kbGUgPSBtb2RlbC0+bUNhcHR1cmVJT0hhbmRsZTsKKyAgICBjb25maWctPmNhcHR1cmVfZGV2aWNlID0gbW9kZWwtPm1DYXB0dXJlRGV2aWNlOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1Id0RldmljZS0+c3RhcnRfcmVjb2duaXRpb24obUh3RGV2aWNlLCBoYW5kbGUsIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VuZFRyaWdnZXJId1NlcnZpY2U6OnJlY29nbml0aW9uQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyk7CisKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIG1vZGVsLT5tU3RhdGUgPSBNb2RlbDo6U1RBVEVfQUNUSVZFOworICAgICAgICBtb2RlbC0+bUNvbmZpZyA9ICpjb25maWc7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGU6OnN0b3BSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgQUxPR1YoInN0b3BSZWNvZ25pdGlvbigpIG1vZGVsIGhhbmRsZSAlZCIsIGhhbmRsZSk7CisgICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIHNwPE1vZGVsPiBtb2RlbCA9IGdldE1vZGVsKGhhbmRsZSk7CisgICAgaWYgKG1vZGVsID09IDApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAobW9kZWwtPm1TdGF0ZSAhPSBNb2RlbDo6U1RBVEVfQUNUSVZFKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgbUh3RGV2aWNlLT5zdG9wX3JlY29nbml0aW9uKG1Id0RldmljZSwgaGFuZGxlKTsKKyAgICBtb2RlbC0+bVN0YXRlID0gTW9kZWw6OlNUQVRFX0lETEU7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisKK3ZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGU6Om9uQ2FsbGJhY2tFdmVudChjb25zdCBzcDxDYWxsYmFja0V2ZW50PiYgZXZlbnQpCit7CisgICAgQUxPR1YoIm9uQ2FsbGJhY2tFdmVudCB0eXBlICVkIiwgZXZlbnQtPm1UeXBlKTsKKworICAgIHNwPElNZW1vcnk+IGV2ZW50TWVtb3J5ID0gZXZlbnQtPm1NZW1vcnk7CisKKyAgICBpZiAoZXZlbnRNZW1vcnkgPT0gMCB8fCBldmVudE1lbW9yeS0+cG9pbnRlcigpID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAobUNsaWVudCA9PSAwKSB7CisgICAgICAgIEFMT0dJKCIlcyBtQ2xpZW50ID09IDAiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGV2ZW50LT5tVHlwZSkgeworICAgIGNhc2UgQ2FsbGJhY2tFdmVudDo6VFlQRV9SRUNPR05JVElPTjogeworICAgICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9ldmVudCAqcmVjb2duaXRpb25FdmVudCA9CisgICAgICAgICAgICAgICAgKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2V2ZW50ICopZXZlbnRNZW1vcnktPnBvaW50ZXIoKTsKKyAgICAgICAgc3A8SVNvdW5kVHJpZ2dlckNsaWVudD4gY2xpZW50OworICAgICAgICB7CisgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgICAgICAgICBzcDxNb2RlbD4gbW9kZWwgPSBnZXRNb2RlbChyZWNvZ25pdGlvbkV2ZW50LT5tb2RlbCk7CisgICAgICAgICAgICBpZiAobW9kZWwgPT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBtb2RlbCA9PSAwIiwgX19mdW5jX18pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtb2RlbC0+bVN0YXRlICE9IE1vZGVsOjpTVEFURV9BQ1RJVkUpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigib25DYWxsYmFja0V2ZW50IG1vZGVsLT5tU3RhdGUgJWQgIT0gTW9kZWw6OlNUQVRFX0FDVElWRSIsIG1vZGVsLT5tU3RhdGUpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVjb2duaXRpb25FdmVudC0+Y2FwdHVyZV9zZXNzaW9uID0gbW9kZWwtPm1DYXB0dXJlU2Vzc2lvbjsKKyAgICAgICAgICAgIG1vZGVsLT5tU3RhdGUgPSBNb2RlbDo6U1RBVEVfSURMRTsKKyAgICAgICAgICAgIGNsaWVudCA9IG1DbGllbnQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNsaWVudCAhPSAwKSB7CisgICAgICAgICAgICBjbGllbnQtPm9uUmVjb2duaXRpb25FdmVudChldmVudE1lbW9yeSk7CisgICAgICAgIH0KKyAgICB9IGJyZWFrOworICAgIGNhc2UgQ2FsbGJhY2tFdmVudDo6VFlQRV9TT1VORE1PREVMOiB7CisgICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZGVsX2V2ZW50ICpzb3VuZG1vZGVsRXZlbnQgPQorICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2RlbF9ldmVudCAqKWV2ZW50TWVtb3J5LT5wb2ludGVyKCk7CisgICAgICAgIHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+IGNsaWVudDsKKyAgICAgICAgeworICAgICAgICAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgICAgICAgICAgc3A8TW9kZWw+IG1vZGVsID0gZ2V0TW9kZWwoc291bmRtb2RlbEV2ZW50LT5tb2RlbCk7CisgICAgICAgICAgICBpZiAobW9kZWwgPT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBtb2RlbCA9PSAwIiwgX19mdW5jX18pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsaWVudCA9IG1DbGllbnQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNsaWVudCAhPSAwKSB7CisgICAgICAgICAgICBjbGllbnQtPm9uU291bmRNb2RlbEV2ZW50KGV2ZW50TWVtb3J5KTsKKyAgICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgY2FzZSBDYWxsYmFja0V2ZW50OjpUWVBFX1NFUlZJQ0VfU1RBVEU6IHsKKyAgICAgICAgc3A8SVNvdW5kVHJpZ2dlckNsaWVudD4gY2xpZW50OworICAgICAgICB7CisgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgICAgICAgICBjbGllbnQgPSBtQ2xpZW50OworICAgICAgICB9CisgICAgICAgIGlmIChjbGllbnQgIT0gMCkgeworICAgICAgICAgICAgY2xpZW50LT5vblNlcnZpY2VTdGF0ZUNoYW5nZShldmVudE1lbW9yeSk7CisgICAgICAgIH0KKyAgICB9IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIm9uQ2FsbGJhY2tFdmVudCB1bmtub3duIGV2ZW50IHR5cGUgJWQiLCBldmVudC0+bVR5cGUpOworICAgIH0KK30KKworc3A8U291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2RlbD4gU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGU6OmdldE1vZGVsKAorICAgICAgICBzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgc3A8TW9kZWw+IG1vZGVsOworICAgIHNzaXplX3QgaW5kZXggPSBtTW9kZWxzLmluZGV4T2ZLZXkoaGFuZGxlKTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBtb2RlbCA9IG1Nb2RlbHMudmFsdWVBdChpbmRleCk7CisgICAgfQorICAgIHJldHVybiBtb2RlbDsKK30KKwordm9pZCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZTo6YmluZGVyRGllZCgKKyAgICBjb25zdCB3cDxJQmluZGVyPiAmd2hvIF9fdW51c2VkKSB7CisgICAgQUxPR1coImNsaWVudCBiaW5kZXIgZGllZCBmb3IgbW9kdWxlICVkIiwgbURlc2NyaXB0b3IuaGFuZGxlKTsKKyAgICBkZXRhY2goKTsKK30KKworLy8gQ2FsbGVkIHdpdGggbVNlcnZpY2VMb2NrIGhlbGQKK3ZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGU6OnNldENhcHR1cmVTdGF0ZV9sKGJvb2wgYWN0aXZlKQoreworICAgIEFMT0dWKCJNb2R1bGU6OnNldENhcHR1cmVTdGF0ZV9sICVkIiwgYWN0aXZlKTsKKyAgICBzcDxTb3VuZFRyaWdnZXJId1NlcnZpY2U+IHNlcnZpY2U7CisgICAgc291bmRfdHJpZ2dlcl9zZXJ2aWNlX3N0YXRlX3Qgc3RhdGU7CisKKyAgICBWZWN0b3I8IHNwPElNZW1vcnk+ID4gZXZlbnRzOworICAgIHsKKyAgICAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgICAgICBzdGF0ZSA9IChhY3RpdmUgJiYgIW1EZXNjcmlwdG9yLnByb3BlcnRpZXMuY29uY3VycmVudF9jYXB0dXJlKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09VTkRfVFJJR0dFUl9TVEFURV9ESVNBQkxFRCA6IFNPVU5EX1RSSUdHRVJfU1RBVEVfRU5BQkxFRDsKKworICAgICAgICBpZiAoc3RhdGUgPT0gbVNlcnZpY2VTdGF0ZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbVNlcnZpY2VTdGF0ZSA9IHN0YXRlOworCisgICAgICAgIHNlcnZpY2UgPSBtU2VydmljZS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChzZXJ2aWNlID09IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdGF0ZSA9PSBTT1VORF9UUklHR0VSX1NUQVRFX0VOQUJMRUQpIHsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1vZGVscy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc3A8TW9kZWw+IG1vZGVsID0gbU1vZGVscy52YWx1ZUF0KGkpOworICAgICAgICAgICAgaWYgKG1vZGVsLT5tU3RhdGUgPT0gTW9kZWw6OlNUQVRFX0FDVElWRSkgeworICAgICAgICAgICAgICAgIG1Id0RldmljZS0+c3RvcF9yZWNvZ25pdGlvbihtSHdEZXZpY2UsIG1vZGVsLT5tSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAvLyBrZWVwIG1vZGVsIGluIEFDVElWRSBzdGF0ZSBzbyB0aGF0IGV2ZW50IGlzIHByb2Nlc3NlZCBieSBvbkNhbGxiYWNrRXZlbnQoKQorICAgICAgICAgICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX3BocmFzZV9yZWNvZ25pdGlvbl9ldmVudCBwaHJhc2VFdmVudDsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG1vZGVsLT5tVHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgU09VTkRfTU9ERUxfVFlQRV9LRVlQSFJBU0U6CisgICAgICAgICAgICAgICAgICAgIHBocmFzZUV2ZW50Lm51bV9waHJhc2VzID0gbW9kZWwtPm1Db25maWcubnVtX3BocmFzZXM7CisgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGhyYXNlRXZlbnQubnVtX3BocmFzZXM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgcGhyYXNlRXZlbnQucGhyYXNlX2V4dHJhc1tpXSA9IG1vZGVsLT5tQ29uZmlnLnBocmFzZXNbaV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTT1VORF9NT0RFTF9UWVBFX1VOS05PV046CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBocmFzZUV2ZW50LmNvbW1vbi5zdGF0dXMgPSBSRUNPR05JVElPTl9TVEFUVVNfQUJPUlQ7CisgICAgICAgICAgICAgICAgcGhyYXNlRXZlbnQuY29tbW9uLnR5cGUgPSBtb2RlbC0+bVR5cGU7CisgICAgICAgICAgICAgICAgcGhyYXNlRXZlbnQuY29tbW9uLm1vZGVsID0gbW9kZWwtPm1IYW5kbGU7CisgICAgICAgICAgICAgICAgcGhyYXNlRXZlbnQuY29tbW9uLmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnkgPSBzZXJ2aWNlLT5wcmVwYXJlUmVjb2duaXRpb25FdmVudF9sKCZwaHJhc2VFdmVudC5jb21tb24pOworICAgICAgICAgICAgICAgIGlmIChldmVudE1lbW9yeSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGV2ZW50cy5hZGQoZXZlbnRNZW1vcnkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZXZlbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNlcnZpY2UtPnNlbmRDYWxsYmFja0V2ZW50X2wobmV3IENhbGxiYWNrRXZlbnQoQ2FsbGJhY2tFdmVudDo6VFlQRV9SRUNPR05JVElPTiwgZXZlbnRzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzKSk7CisgICAgfQorCitleGl0OgorICAgIHNlcnZpY2UtPnNlbmRTZXJ2aWNlU3RhdGVFdmVudF9sKHN0YXRlLCB0aGlzKTsKK30KKworCitTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZGVsOjpNb2RlbChzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZF90cmlnZ2VyX3NvdW5kX21vZGVsX3R5cGVfdCB0eXBlKSA6CisgICAgbUhhbmRsZShoYW5kbGUpLCBtU3RhdGUoU1RBVEVfSURMRSksIG1DYXB0dXJlU2Vzc2lvbihzZXNzaW9uKSwKKyAgICBtQ2FwdHVyZUlPSGFuZGxlKGlvSGFuZGxlKSwgbUNhcHR1cmVEZXZpY2UoZGV2aWNlKSwgbVR5cGUodHlwZSkKK3sKKworfQorCitzdGF0dXNfdCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZTo6ZHVtcChpbnQgZmQgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKSB7CisgICAgU3RyaW5nOCByZXN1bHQ7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5oIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNWRhY2QKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmgKQEAgLTAsMCArMSwyMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU09VTkRUUklHR0VSX0hBTF9TRVJWSUNFX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TT1VORFRSSUdHRVJfSEFMX1NFUlZJQ0VfSAorCisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisvLyNpbmNsdWRlIDxiaW5kZXIvQXBwT3BzTWFuYWdlci5oPgorI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvQmluZGVyU2VydmljZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JQXBwT3BzQ2FsbGJhY2suaD4KKyNpbmNsdWRlIDxzb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckh3U2VydmljZS5oPgorI2luY2x1ZGUgPHNvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmg+CisjaW5jbHVkZSA8c291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJDbGllbnQuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vc291bmRfdHJpZ2dlci5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL3NvdW5kX3RyaWdnZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNZW1vcnlIZWFwQmFzZTsKKworY2xhc3MgU291bmRUcmlnZ2VySHdTZXJ2aWNlIDoKKyAgICBwdWJsaWMgQmluZGVyU2VydmljZTxTb3VuZFRyaWdnZXJId1NlcnZpY2U+LAorICAgIHB1YmxpYyBCblNvdW5kVHJpZ2dlckh3U2VydmljZQoreworICAgIGZyaWVuZCBjbGFzcyBCaW5kZXJTZXJ2aWNlPFNvdW5kVHJpZ2dlckh3U2VydmljZT47CitwdWJsaWM6CisgICAgY2xhc3MgTW9kdWxlOworCisgICAgc3RhdGljIGNoYXIgY29uc3QqIGdldFNlcnZpY2VOYW1lKCkgeyByZXR1cm4gIm1lZGlhLnNvdW5kX3RyaWdnZXJfaHciOyB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFNvdW5kVHJpZ2dlckh3U2VydmljZSgpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgflNvdW5kVHJpZ2dlckh3U2VydmljZSgpOworCisgICAgLy8gSVNvdW5kVHJpZ2dlckh3U2VydmljZQorICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdE1vZHVsZXMoc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IgKm1vZHVsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbnVtTW9kdWxlcyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGF0dGFjaChjb25zdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SVNvdW5kVHJpZ2dlckNsaWVudD4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJU291bmRUcmlnZ2VyPiYgbW9kdWxlKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q2FwdHVyZVN0YXRlKGJvb2wgYWN0aXZlKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCh1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOworCisgICAgY2xhc3MgTW9kZWwgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgIHB1YmxpYzoKKworICAgICAgICBlbnVtIHsKKyAgICAgICAgICAgIFNUQVRFX0lETEUsCisgICAgICAgICAgICBTVEFURV9BQ1RJVkUKKyAgICAgICAgfTsKKworICAgICAgICBNb2RlbChzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLCBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwKKyAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwgc291bmRfdHJpZ2dlcl9zb3VuZF9tb2RlbF90eXBlX3QgdHlwZSk7CisgICAgICAgIH5Nb2RlbCgpIHt9CisKKyAgICAgICAgc291bmRfbW9kZWxfaGFuZGxlX3QgICAgbUhhbmRsZTsKKyAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbVN0YXRlOworICAgICAgICBhdWRpb19zZXNzaW9uX3QgICAgICAgICBtQ2FwdHVyZVNlc3Npb247CisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgICAgIG1DYXB0dXJlSU9IYW5kbGU7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCAgICAgICAgIG1DYXB0dXJlRGV2aWNlOworICAgICAgICBzb3VuZF90cmlnZ2VyX3NvdW5kX21vZGVsX3R5cGVfdCBtVHlwZTsKKyAgICAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fY29uZmlnIG1Db25maWc7CisgICAgfTsKKworICAgIGNsYXNzIENhbGxiYWNrRXZlbnQgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgcHVibGljOgorICAgICAgICB0eXBlZGVmIGVudW0geworICAgICAgICAgICAgVFlQRV9SRUNPR05JVElPTiwKKyAgICAgICAgICAgIFRZUEVfU09VTkRNT0RFTCwKKyAgICAgICAgICAgIFRZUEVfU0VSVklDRV9TVEFURSwKKyAgICAgICAgfSBldmVudF90eXBlOworICAgICAgICBDYWxsYmFja0V2ZW50KGV2ZW50X3R5cGUgdHlwZSwgc3A8SU1lbW9yeT4gbWVtb3J5LCB3cDxNb2R1bGU+IG1vZHVsZSk7CisKKyAgICAgICAgdmlydHVhbCAgICAgICAgICAgICB+Q2FsbGJhY2tFdmVudCgpOworCisgICAgICAgIGV2ZW50X3R5cGUgbVR5cGU7CisgICAgICAgIHNwPElNZW1vcnk+IG1NZW1vcnk7CisgICAgICAgIHdwPE1vZHVsZT4gbU1vZHVsZTsKKyAgICB9OworCisgICAgY2xhc3MgTW9kdWxlIDogcHVibGljIHZpcnR1YWwgUmVmQmFzZSwKKyAgICAgICAgICAgICAgICAgICBwdWJsaWMgQm5Tb3VuZFRyaWdnZXIsCisgICAgICAgICAgICAgICAgICAgcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50ICAgICB7CisgICAgcHVibGljOgorCisgICAgICAgTW9kdWxlKGNvbnN0IHNwPFNvdW5kVHJpZ2dlckh3U2VydmljZT4mIHNlcnZpY2UsCisgICAgICAgICAgICAgIHNvdW5kX3RyaWdnZXJfaHdfZGV2aWNlKiBod0RldmljZSwKKyAgICAgICAgICAgICAgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICBjb25zdCBzcDxJU291bmRUcmlnZ2VyQ2xpZW50PiYgY2xpZW50KTsKKworICAgICAgIHZpcnR1YWwgfk1vZHVsZSgpOworCisgICAgICAgdmlydHVhbCB2b2lkIGRldGFjaCgpOworCisgICAgICAgdmlydHVhbCBzdGF0dXNfdCBsb2FkU291bmRNb2RlbChjb25zdCBzcDxJTWVtb3J5PiYgbW9kZWxNZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZF9tb2RlbF9oYW5kbGVfdCAqaGFuZGxlKTsKKworICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5sb2FkU291bmRNb2RlbChzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOworCisgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFNZW1vcnkpOworICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7CisKKyAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKworCisgICAgICAgc291bmRfdHJpZ2dlcl9od19kZXZpY2UgKmh3RGV2aWNlKCkgY29uc3QgeyByZXR1cm4gbUh3RGV2aWNlOyB9CisgICAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IgZGVzY3JpcHRvcigpIHsgcmV0dXJuIG1EZXNjcmlwdG9yOyB9CisgICAgICAgdm9pZCBzZXRDbGllbnQoc3A8SVNvdW5kVHJpZ2dlckNsaWVudD4gY2xpZW50KSB7IG1DbGllbnQgPSBjbGllbnQ7IH0KKyAgICAgICB2b2lkIGNsZWFyQ2xpZW50KCkgeyBtQ2xpZW50LmNsZWFyKCk7IH0KKyAgICAgICBzcDxJU291bmRUcmlnZ2VyQ2xpZW50PiBjbGllbnQoKSBjb25zdCB7IHJldHVybiBtQ2xpZW50OyB9CisgICAgICAgd3A8U291bmRUcmlnZ2VySHdTZXJ2aWNlPiBzZXJ2aWNlKCkgY29uc3QgeyByZXR1cm4gbVNlcnZpY2U7IH0KKworICAgICAgIHZvaWQgb25DYWxsYmFja0V2ZW50KGNvbnN0IHNwPENhbGxiYWNrRXZlbnQ+JiBldmVudCk7CisKKyAgICAgICBzcDxNb2RlbD4gZ2V0TW9kZWwoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKKworICAgICAgIHZvaWQgc2V0Q2FwdHVyZVN0YXRlX2woYm9vbCBhY3RpdmUpOworCisgICAgICAgLy8gSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgaW1wbGVtZW50YXRpb24KKyAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4gJndobyk7CisKKyAgICBwcml2YXRlOgorCisgICAgICAgIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrOworICAgICAgICB3cDxTb3VuZFRyaWdnZXJId1NlcnZpY2U+ICAgICAgICAgICAgICBtU2VydmljZTsKKyAgICAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfaHdfZGV2aWNlKiAgICAgICAgbUh3RGV2aWNlOworICAgICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciBtRGVzY3JpcHRvcjsKKyAgICAgICAgc3A8SVNvdW5kVHJpZ2dlckNsaWVudD4gICAgICAgICAgICAgICAgbUNsaWVudDsKKyAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPCBzb3VuZF9tb2RlbF9oYW5kbGVfdCwgc3A8TW9kZWw+ID4gICAgIG1Nb2RlbHM7CisgICAgICAgIHNvdW5kX3RyaWdnZXJfc2VydmljZV9zdGF0ZV90ICAgICAgICAgIG1TZXJ2aWNlU3RhdGU7CisgICAgfTsgLy8gY2xhc3MgTW9kdWxlCisKKyAgICBjbGFzcyBDYWxsYmFja1RocmVhZCA6IHB1YmxpYyBUaHJlYWQgeworICAgIHB1YmxpYzoKKworICAgICAgICBDYWxsYmFja1RocmVhZChjb25zdCB3cDxTb3VuZFRyaWdnZXJId1NlcnZpY2U+JiBzZXJ2aWNlKTsKKworICAgICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5DYWxsYmFja1RocmVhZCgpOworCisgICAgICAgIC8vIFRocmVhZCB2aXJ0dWFscworICAgICAgICB2aXJ0dWFsIGJvb2wgICAgICAgIHRocmVhZExvb3AoKTsKKworICAgICAgICAvLyBSZWZCYXNlCisgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgb25GaXJzdFJlZigpOworCisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZXhpdCgpOworICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHNlbmRDYWxsYmFja0V2ZW50KGNvbnN0IHNwPENhbGxiYWNrRXZlbnQ+JiBldmVudCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICB3cDxTb3VuZFRyaWdnZXJId1NlcnZpY2U+ICAgbVNlcnZpY2U7CisgICAgICAgIENvbmRpdGlvbiAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tDb25kOworICAgICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrTG9jazsKKyAgICAgICAgVmVjdG9yPCBzcDxDYWxsYmFja0V2ZW50PiA+IG1FdmVudFF1ZXVlOworICAgIH07CisKKyAgICAgICAgICAgdm9pZCBkZXRhY2hNb2R1bGUoc3A8TW9kdWxlPiBtb2R1bGUpOworCisgICAgc3RhdGljIHZvaWQgcmVjb2duaXRpb25DYWxsYmFjayhzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9ldmVudCAqZXZlbnQsIHZvaWQgKmNvb2tpZSk7CisgICAgICAgICAgIHNwPElNZW1vcnk+IHByZXBhcmVSZWNvZ25pdGlvbkV2ZW50X2woc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fZXZlbnQgKmV2ZW50KTsKKyAgICAgICAgICAgdm9pZCBzZW5kUmVjb2duaXRpb25FdmVudChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9ldmVudCAqZXZlbnQsIE1vZHVsZSAqbW9kdWxlKTsKKworICAgIHN0YXRpYyB2b2lkIHNvdW5kTW9kZWxDYWxsYmFjayhzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2RlbF9ldmVudCAqZXZlbnQsIHZvaWQgKmNvb2tpZSk7CisgICAgICAgICAgIHNwPElNZW1vcnk+IHByZXBhcmVTb3VuZE1vZGVsRXZlbnRfbChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2RlbF9ldmVudCAqZXZlbnQpOworICAgICAgICAgICB2b2lkIHNlbmRTb3VuZE1vZGVsRXZlbnQoc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kZWxfZXZlbnQgKmV2ZW50LCBNb2R1bGUgKm1vZHVsZSk7CisKKyAgICAgICAgICAgc3A8SU1lbW9yeT4gcHJlcGFyZVNlcnZpY2VTdGF0ZUV2ZW50X2woc291bmRfdHJpZ2dlcl9zZXJ2aWNlX3N0YXRlX3Qgc3RhdGUpOworICAgICAgICAgICB2b2lkIHNlbmRTZXJ2aWNlU3RhdGVFdmVudF9sKHNvdW5kX3RyaWdnZXJfc2VydmljZV9zdGF0ZV90IHN0YXRlLCBNb2R1bGUgKm1vZHVsZSk7CisKKyAgICAgICAgICAgdm9pZCBzZW5kQ2FsbGJhY2tFdmVudF9sKGNvbnN0IHNwPENhbGxiYWNrRXZlbnQ+JiBldmVudCk7CisgICAgICAgICAgIHZvaWQgb25DYWxsYmFja0V2ZW50KGNvbnN0IHNwPENhbGxiYWNrRXZlbnQ+JiBldmVudCk7CisKK3ByaXZhdGU6CisKKyAgICB2aXJ0dWFsIHZvaWQgb25GaXJzdFJlZigpOworCisgICAgTXV0ZXggICAgICAgICAgICAgICBtU2VydmljZUxvY2s7CisgICAgdm9sYXRpbGUgaW50MzJfdCAgICBtTmV4dFVuaXF1ZUlkOworICAgIERlZmF1bHRLZXllZFZlY3Rvcjwgc291bmRfdHJpZ2dlcl9tb2R1bGVfaGFuZGxlX3QsIHNwPE1vZHVsZT4gPiAgICAgbU1vZHVsZXM7CisgICAgc3A8Q2FsbGJhY2tUaHJlYWQ+ICBtQ2FsbGJhY2tUaHJlYWQ7CisgICAgc3A8TWVtb3J5RGVhbGVyPiAgICBtTWVtb3J5RGVhbGVyOworICAgIGJvb2wgICAgICAgICAgICAgICAgbUNhcHR1cmVTdGF0ZTsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfU09VTkRUUklHR0VSX0hBTF9TRVJWSUNFX0gKZGlmZiAtLWdpdCBhL3NvdW5kdHJpZ2dlci9BbmRyb2lkLm1rIGIvc291bmR0cmlnZ2VyL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkxYzRjMgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kdHJpZ2dlci9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzggQEAKKyMgQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisJU291bmRUcmlnZ2VyLmNwcCBcCisJSVNvdW5kVHJpZ2dlci5jcHAgXAorCUlTb3VuZFRyaWdnZXJDbGllbnQuY3BwIFwKKwlJU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJjdXRpbHMgXAorCWxpYnV0aWxzIFwKKwlsaWJsb2cgXAorCWxpYmJpbmRlciBcCisJbGliaGFyZHdhcmUKKworI0xPQ0FMX0NfSU5DTFVERVMgKz0gXAorCXN5c3RlbS9tZWRpYS9jYW1lcmEvaW5jbHVkZSBcCisJc3lzdGVtL21lZGlhL3ByaXZhdGUvY2FtZXJhL2luY2x1ZGUKKworTE9DQUxfTU9EVUxFOj0gbGlic291bmR0cmlnZ2VyCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmNwcCBiL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjI4MGQxCi0tLSAvZGV2L251bGwKKysrIGIvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuY3BwCkBAIC0wLDAgKzEsMTc3IEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDE0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjZGVmaW5lIExPR19UQUcgIklTb3VuZFRyaWdnZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxzb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5oPgorI2luY2x1ZGUgPHNvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VySHdTZXJ2aWNlLmg+CisjaW5jbHVkZSA8c291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJDbGllbnQuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vc291bmRfdHJpZ2dlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2VudW0geworICAgIERFVEFDSCA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCisgICAgTE9BRF9TT1VORF9NT0RFTCwKKyAgICBVTkxPQURfU09VTkRfTU9ERUwsCisgICAgU1RBUlRfUkVDT0dOSVRJT04sCisgICAgU1RPUF9SRUNPR05JVElPTiwKK307CisKK2NsYXNzIEJwU291bmRUcmlnZ2VyOiBwdWJsaWMgQnBJbnRlcmZhY2U8SVNvdW5kVHJpZ2dlcj4KK3sKK3B1YmxpYzoKKyAgICBCcFNvdW5kVHJpZ2dlcihjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKKyAgICAgICAgOiBCcEludGVyZmFjZTxJU291bmRUcmlnZ2VyPihpbXBsKQorICAgIHsKKyAgICB9CisKKyAgICB2b2lkIGRldGFjaCgpCisgICAgeworICAgICAgICBBTE9HVigiZGV0YWNoIik7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTb3VuZFRyaWdnZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChERVRBQ0gsIGRhdGEsICZyZXBseSk7CisgICAgfQorCisgICAgc3RhdHVzX3QgbG9hZFNvdW5kTW9kZWwoY29uc3Qgc3A8SU1lbW9yeT4mICBtb2RlbE1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kX21vZGVsX2hhbmRsZV90ICpoYW5kbGUpCisgICAgeworICAgICAgICBpZiAobW9kZWxNZW1vcnkgPT0gMCB8fCBoYW5kbGUgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU291bmRUcmlnZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKG1vZGVsTWVtb3J5LT5hc0JpbmRlcigpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KExPQURfU09VTkRfTU9ERUwsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwKKyAgICAgICAgICAgICAgICAoc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXBseS5yZWFkKGhhbmRsZSwgc2l6ZW9mKHNvdW5kX21vZGVsX2hhbmRsZV90KSk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCB1bmxvYWRTb3VuZE1vZGVsKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTb3VuZFRyaWdnZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGUoJmhhbmRsZSwgc2l6ZW9mKHNvdW5kX21vZGVsX2hhbmRsZV90KSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChVTkxPQURfU09VTkRfTU9ERUwsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhTWVtb3J5KQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVNvdW5kVHJpZ2dlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZSgmaGFuZGxlLCBzaXplb2Yoc291bmRfbW9kZWxfaGFuZGxlX3QpKTsKKyAgICAgICAgaWYgKGRhdGFNZW1vcnkgPT0gMCkgeworICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKGRhdGFNZW1vcnktPnNpemUoKSk7CisgICAgICAgIH0KKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihkYXRhTWVtb3J5LT5hc0JpbmRlcigpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNUQVJUX1JFQ09HTklUSU9OLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU291bmRUcmlnZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKCZoYW5kbGUsIHNpemVvZihzb3VuZF9tb2RlbF9oYW5kbGVfdCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU1RPUF9SRUNPR05JVElPTiwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCit9OworCitJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoU291bmRUcmlnZ2VyLCAiYW5kcm9pZC5oYXJkd2FyZS5JU291bmRUcmlnZ2VyIik7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdHVzX3QgQm5Tb3VuZFRyaWdnZXI6Om9uVHJhbnNhY3QoCisgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKK3sKKyAgICBzd2l0Y2goY29kZSkgeworICAgICAgICBjYXNlIERFVEFDSDogeworICAgICAgICAgICAgQUxPR1YoIkRFVEFDSCIpOworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTb3VuZFRyaWdnZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGRldGFjaCgpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIExPQURfU09VTkRfTU9ERUw6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU291bmRUcmlnZ2VyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzcDxJTWVtb3J5PiBtb2RlbE1lbW9yeSA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KAorICAgICAgICAgICAgICAgIGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGxvYWRTb3VuZE1vZGVsKG1vZGVsTWVtb3J5LCAmaGFuZGxlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKCZoYW5kbGUsIHNpemVvZihzb3VuZF9tb2RlbF9oYW5kbGVfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGNhc2UgVU5MT0FEX1NPVU5EX01PREVMOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVNvdW5kVHJpZ2dlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlOworICAgICAgICAgICAgZGF0YS5yZWFkKCZoYW5kbGUsIHNpemVvZihzb3VuZF9tb2RlbF9oYW5kbGVfdCkpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gdW5sb2FkU291bmRNb2RlbChoYW5kbGUpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFNUQVJUX1JFQ09HTklUSU9OOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVNvdW5kVHJpZ2dlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlOworICAgICAgICAgICAgZGF0YS5yZWFkKCZoYW5kbGUsIHNpemVvZihzb3VuZF9tb2RlbF9oYW5kbGVfdCkpOworICAgICAgICAgICAgc3A8SU1lbW9yeT4gZGF0YU1lbW9yeTsKKyAgICAgICAgICAgIGlmIChkYXRhLnJlYWRJbnQzMigpICE9IDApIHsKKyAgICAgICAgICAgICAgICBkYXRhTWVtb3J5ID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RhcnRSZWNvZ25pdGlvbihoYW5kbGUsIGRhdGFNZW1vcnkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFNUT1BfUkVDT0dOSVRJT046IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU291bmRUcmlnZ2VyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGU7CisgICAgICAgICAgICBkYXRhLnJlYWQoJmhhbmRsZSwgc2l6ZW9mKHNvdW5kX21vZGVsX2hhbmRsZV90KSk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdG9wUmVjb2duaXRpb24oaGFuZGxlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckNsaWVudC5jcHAgYi9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckNsaWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBiNDQyOAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyQ2xpZW50LmNwcApAQCAtMCwwICsxLDExMCBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxzb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckNsaWVudC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2VudW0geworICAgIE9OX1JFQ09HTklUSU9OX0VWRU5UID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKKyAgICBPTl9TT1VORE1PREVMX0VWRU5ULAorICAgIE9OX1NFUlZJQ0VfU1RBVEVfQ0hBTkdFCit9OworCitjbGFzcyBCcFNvdW5kVHJpZ2dlckNsaWVudDogcHVibGljIEJwSW50ZXJmYWNlPElTb3VuZFRyaWdnZXJDbGllbnQ+Cit7CisKK3B1YmxpYzoKKyAgICBCcFNvdW5kVHJpZ2dlckNsaWVudChjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKKyAgICAgICAgOiBCcEludGVyZmFjZTxJU291bmRUcmlnZ2VyQ2xpZW50PihpbXBsKQorICAgIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25SZWNvZ25pdGlvbkV2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTb3VuZFRyaWdnZXJDbGllbnQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoZXZlbnRNZW1vcnktPmFzQmluZGVyKCkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoT05fUkVDT0dOSVRJT05fRVZFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5KTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25Tb3VuZE1vZGVsRXZlbnQoY29uc3Qgc3A8SU1lbW9yeT4mIGV2ZW50TWVtb3J5KQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVNvdW5kVHJpZ2dlckNsaWVudDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihldmVudE1lbW9yeS0+YXNCaW5kZXIoKSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChPTl9TT1VORE1PREVMX0VWRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXBseSk7CisgICAgfQorICAgIHZpcnR1YWwgdm9pZCBvblNlcnZpY2VTdGF0ZUNoYW5nZShjb25zdCBzcDxJTWVtb3J5PiYgZXZlbnRNZW1vcnkpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU291bmRUcmlnZ2VyQ2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGV2ZW50TWVtb3J5LT5hc0JpbmRlcigpKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KE9OX1NFUlZJQ0VfU1RBVEVfQ0hBTkdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXBseSk7CisgICAgfQorfTsKKworSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKFNvdW5kVHJpZ2dlckNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5JU291bmRUcmlnZ2VyQ2xpZW50Iik7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdHVzX3QgQm5Tb3VuZFRyaWdnZXJDbGllbnQ6Om9uVHJhbnNhY3QoCisgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKK3sKKyAgICBzd2l0Y2goY29kZSkgeworICAgICAgICBjYXNlIE9OX1JFQ09HTklUSU9OX0VWRU5UOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVNvdW5kVHJpZ2dlckNsaWVudCwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnkgPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PigKKyAgICAgICAgICAgICAgICBkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBvblJlY29nbml0aW9uRXZlbnQoZXZlbnRNZW1vcnkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIE9OX1NPVU5ETU9ERUxfRVZFTlQ6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU291bmRUcmlnZ2VyQ2xpZW50LCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzcDxJTWVtb3J5PiBldmVudE1lbW9yeSA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KAorICAgICAgICAgICAgICAgIGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIG9uU291bmRNb2RlbEV2ZW50KGV2ZW50TWVtb3J5KTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBPTl9TRVJWSUNFX1NUQVRFX0NIQU5HRTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTb3VuZFRyaWdnZXJDbGllbnQsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHNwPElNZW1vcnk+IGV2ZW50TWVtb3J5ID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4oCisgICAgICAgICAgICAgICAgZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgb25TZXJ2aWNlU3RhdGVDaGFuZ2UoZXZlbnRNZW1vcnkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKKyAgICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcCBiL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTcyOGU5Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCkBAIC0wLDAgKzEsMTcwIEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDE0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjZGVmaW5lIExPR19UQUcgIkJwU291bmRUcmlnZ2VySHdTZXJ2aWNlIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisKKyNpbmNsdWRlIDxzb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckh3U2VydmljZS5oPgorI2luY2x1ZGUgPHNvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmg+CisjaW5jbHVkZSA8c291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJDbGllbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitlbnVtIHsKKyAgICBMSVNUX01PRFVMRVMgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAorICAgIEFUVEFDSCwKKyAgICBTRVRfQ0FQVFVSRV9TVEFURSwKK307CisKK2NsYXNzIEJwU291bmRUcmlnZ2VySHdTZXJ2aWNlOiBwdWJsaWMgQnBJbnRlcmZhY2U8SVNvdW5kVHJpZ2dlckh3U2VydmljZT4KK3sKK3B1YmxpYzoKKyAgICBCcFNvdW5kVHJpZ2dlckh3U2VydmljZShjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKKyAgICAgICAgOiBCcEludGVyZmFjZTxJU291bmRUcmlnZ2VySHdTZXJ2aWNlPihpbXBsKQorICAgIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RNb2R1bGVzKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yICptb2R1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm51bU1vZHVsZXMpCisgICAgeworICAgICAgICBpZiAobnVtTW9kdWxlcyA9PSBOVUxMIHx8ICgqbnVtTW9kdWxlcyAhPSAwICYmIG1vZHVsZXMgPT0gTlVMTCkpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVNvdW5kVHJpZ2dlckh3U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgdW5zaWduZWQgaW50IG51bU1vZHVsZXNSZXEgPSAobW9kdWxlcyA9PSBOVUxMKSA/IDAgOiAqbnVtTW9kdWxlczsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKG51bU1vZHVsZXNSZXEpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoTElTVF9NT0RVTEVTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgICAgICAqbnVtTW9kdWxlcyA9ICh1bnNpZ25lZCBpbnQpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoImxpc3RNb2R1bGVzKCkgc3RhdHVzICVkIGdvdCAqbnVtTW9kdWxlcyAlZCIsIHN0YXR1cywgKm51bU1vZHVsZXMpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBpZiAobnVtTW9kdWxlc1JlcSA+ICpudW1Nb2R1bGVzKSB7CisgICAgICAgICAgICAgICAgbnVtTW9kdWxlc1JlcSA9ICpudW1Nb2R1bGVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG51bU1vZHVsZXNSZXEgPiAwKSB7CisgICAgICAgICAgICAgICAgcmVwbHkucmVhZChtb2R1bGVzLCBudW1Nb2R1bGVzUmVxICogc2l6ZW9mKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGF0dGFjaChjb25zdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SVNvdW5kVHJpZ2dlckNsaWVudD4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJU291bmRUcmlnZ2VyPiYgbW9kdWxlKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVNvdW5kVHJpZ2dlckh3U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZSgmaGFuZGxlLCBzaXplb2Yoc291bmRfdHJpZ2dlcl9tb2R1bGVfaGFuZGxlX3QpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihjbGllbnQtPmFzQmluZGVyKCkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQVRUQUNILCBkYXRhLCAmcmVwbHkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaWYgKHJlcGx5LnJlYWRJbnQzMigpICE9IDApIHsKKyAgICAgICAgICAgIG1vZHVsZSA9IGludGVyZmFjZV9jYXN0PElTb3VuZFRyaWdnZXI+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhcHR1cmVTdGF0ZShib29sIGFjdGl2ZSkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTb3VuZFRyaWdnZXJId1NlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihhY3RpdmUpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0NBUFRVUkVfU1RBVEUsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCit9OworCitJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoU291bmRUcmlnZ2VySHdTZXJ2aWNlLCAiYW5kcm9pZC5oYXJkd2FyZS5JU291bmRUcmlnZ2VySHdTZXJ2aWNlIik7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdHVzX3QgQm5Tb3VuZFRyaWdnZXJId1NlcnZpY2U6Om9uVHJhbnNhY3QoCisgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKK3sKKyAgICBzd2l0Y2goY29kZSkgeworICAgICAgICBjYXNlIExJU1RfTU9EVUxFUzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTb3VuZFRyaWdnZXJId1NlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1Nb2R1bGVzUmVxID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1Nb2R1bGVzID0gbnVtTW9kdWxlc1JlcTsKKyAgICAgICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yICptb2R1bGVzID0KKyAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yICopY2FsbG9jKG51bU1vZHVsZXNSZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IpKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGxpc3RNb2R1bGVzKG1vZHVsZXMsICZudW1Nb2R1bGVzKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihudW1Nb2R1bGVzKTsKKyAgICAgICAgICAgIEFMT0dWKCJMSVNUX01PRFVMRVMgc3RhdHVzICVkIGdvdCBudW1Nb2R1bGVzICVkIiwgc3RhdHVzLCBudW1Nb2R1bGVzKTsKKworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGlmIChudW1Nb2R1bGVzUmVxID4gbnVtTW9kdWxlcykgeworICAgICAgICAgICAgICAgICAgICBudW1Nb2R1bGVzUmVxID0gbnVtTW9kdWxlczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKG1vZHVsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bU1vZHVsZXNSZXEgKiBzaXplb2Yoc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyZWUobW9kdWxlcyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEFUVEFDSDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTb3VuZFRyaWdnZXJId1NlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHNvdW5kX3RyaWdnZXJfbW9kdWxlX2hhbmRsZV90IGhhbmRsZTsKKyAgICAgICAgICAgIGRhdGEucmVhZCgmaGFuZGxlLCBzaXplb2Yoc291bmRfdHJpZ2dlcl9tb2R1bGVfaGFuZGxlX3QpKTsKKyAgICAgICAgICAgIHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+IGNsaWVudCA9CisgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElTb3VuZFRyaWdnZXJDbGllbnQ+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIHNwPElTb3VuZFRyaWdnZXI+IG1vZHVsZTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF0dGFjaChoYW5kbGUsIGNsaWVudCwgbW9kdWxlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICBpZiAobW9kdWxlICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigxKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIobW9kdWxlLT5hc0JpbmRlcigpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBTRVRfQ0FQVFVSRV9TVEFURTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTb3VuZFRyaWdnZXJId1NlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldENhcHR1cmVTdGF0ZSgoYm9vbClkYXRhLnJlYWRJbnQzMigpKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmNwcCBiL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzOWRkYmMKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmNwcApAQCAtMCwwICsxLDI4OCBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgKEMpIDIwMTQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNkZWZpbmUgTE9HX1RBRyAiU291bmRUcmlnZ2VyIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorCisjaW5jbHVkZSA8c291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5oPgorI2luY2x1ZGUgPHNvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmg+CisjaW5jbHVkZSA8c291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJId1NlcnZpY2UuaD4KKyNpbmNsdWRlIDxzb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckNsaWVudC5oPgorI2luY2x1ZGUgPHNvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJDYWxsYmFjay5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisgICAgc3A8SVNvdW5kVHJpZ2dlckh3U2VydmljZT4gZ1NvdW5kVHJpZ2dlckh3U2VydmljZTsKKyAgICBjb25zdCBpbnQgICAgICAgICAgICAgICAgICBrU291bmRUcmlnZ2VySHdTZXJ2aWNlUG9sbERlbGF5ID0gNTAwMDAwOyAvLyAwLjVzCisgICAgY29uc3QgY2hhciogICAgICAgICAgICAgICAga1NvdW5kVHJpZ2dlckh3U2VydmljZU5hbWUgICAgICA9ICJtZWRpYS5zb3VuZF90cmlnZ2VyX2h3IjsKKyAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICBnTG9jazsKKworICAgIGNsYXNzIERlYXRoTm90aWZpZXIgOiBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKKyAgICB7CisgICAgcHVibGljOgorICAgICAgICBEZWF0aE5vdGlmaWVyKCkgeworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyBfX3VudXNlZCkgeworICAgICAgICAgICAgQUxPR1YoImJpbmRlckRpZWQiKTsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9jayk7CisgICAgICAgICAgICBnU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNsZWFyKCk7CisgICAgICAgICAgICBBTE9HVygiU291bmQgdHJpZ2dlciBzZXJ2aWNlIGRpZWQhIik7CisgICAgICAgIH0KKyAgICB9OworCisgICAgc3A8RGVhdGhOb3RpZmllcj4gICAgICAgICBnRGVhdGhOb3RpZmllcjsKK307IC8vIG5hbWVzcGFjZSBhbm9ueW1vdXMKKworY29uc3Qgc3A8SVNvdW5kVHJpZ2dlckh3U2VydmljZT4gU291bmRUcmlnZ2VyOjpnZXRTb3VuZFRyaWdnZXJId1NlcnZpY2UoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9jayk7CisgICAgaWYgKGdTb3VuZFRyaWdnZXJId1NlcnZpY2UuZ2V0KCkgPT0gMCkgeworICAgICAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CisgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlcjsKKyAgICAgICAgZG8geworICAgICAgICAgICAgYmluZGVyID0gc20tPmdldFNlcnZpY2UoU3RyaW5nMTYoa1NvdW5kVHJpZ2dlckh3U2VydmljZU5hbWUpKTsKKyAgICAgICAgICAgIGlmIChiaW5kZXIgIT0gMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1coIlNvdW5kVHJpZ2dlckh3U2VydmljZSBub3QgcHVibGlzaGVkLCB3YWl0aW5nLi4uIik7CisgICAgICAgICAgICB1c2xlZXAoa1NvdW5kVHJpZ2dlckh3U2VydmljZVBvbGxEZWxheSk7CisgICAgICAgIH0gd2hpbGUodHJ1ZSk7CisgICAgICAgIGlmIChnRGVhdGhOb3RpZmllciA9PSBOVUxMKSB7CisgICAgICAgICAgICBnRGVhdGhOb3RpZmllciA9IG5ldyBEZWF0aE5vdGlmaWVyKCk7CisgICAgICAgIH0KKyAgICAgICAgYmluZGVyLT5saW5rVG9EZWF0aChnRGVhdGhOb3RpZmllcik7CisgICAgICAgIGdTb3VuZFRyaWdnZXJId1NlcnZpY2UgPSBpbnRlcmZhY2VfY2FzdDxJU291bmRUcmlnZ2VySHdTZXJ2aWNlPihiaW5kZXIpOworICAgIH0KKyAgICBBTE9HRV9JRihnU291bmRUcmlnZ2VySHdTZXJ2aWNlID09IDAsICJubyBTb3VuZFRyaWdnZXJId1NlcnZpY2UhPyIpOworICAgIHJldHVybiBnU291bmRUcmlnZ2VySHdTZXJ2aWNlOworfQorCisvLyBTdGF0aWMgbWV0aG9kcworc3RhdHVzX3QgU291bmRUcmlnZ2VyOjpsaXN0TW9kdWxlcyhzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciAqbW9kdWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1Nb2R1bGVzKQoreworICAgIEFMT0dWKCJsaXN0TW9kdWxlcygpIik7CisgICAgY29uc3Qgc3A8SVNvdW5kVHJpZ2dlckh3U2VydmljZT4gc2VydmljZSA9IGdldFNvdW5kVHJpZ2dlckh3U2VydmljZSgpOworICAgIGlmIChzZXJ2aWNlID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBzZXJ2aWNlLT5saXN0TW9kdWxlcyhtb2R1bGVzLCBudW1Nb2R1bGVzKTsKK30KKworc3A8U291bmRUcmlnZ2VyPiBTb3VuZFRyaWdnZXI6OmF0dGFjaChjb25zdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFNvdW5kVHJpZ2dlckNhbGxiYWNrPiYgY2FsbGJhY2spCit7CisgICAgQUxPR1YoImF0dGFjaCgpIik7CisgICAgc3A8U291bmRUcmlnZ2VyPiBzb3VuZFRyaWdnZXI7CisgICAgY29uc3Qgc3A8SVNvdW5kVHJpZ2dlckh3U2VydmljZT4gc2VydmljZSA9IGdldFNvdW5kVHJpZ2dlckh3U2VydmljZSgpOworICAgIGlmIChzZXJ2aWNlID09IDApIHsKKyAgICAgICAgcmV0dXJuIHNvdW5kVHJpZ2dlcjsKKyAgICB9CisgICAgc291bmRUcmlnZ2VyID0gbmV3IFNvdW5kVHJpZ2dlcihtb2R1bGUsIGNhbGxiYWNrKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXJ2aWNlLT5hdHRhY2gobW9kdWxlLCBzb3VuZFRyaWdnZXIsIHNvdW5kVHJpZ2dlci0+bUlTb3VuZFRyaWdnZXIpOworCisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiBzb3VuZFRyaWdnZXItPm1JU291bmRUcmlnZ2VyICE9IDApIHsKKyAgICAgICAgc291bmRUcmlnZ2VyLT5tSVNvdW5kVHJpZ2dlci0+YXNCaW5kZXIoKS0+bGlua1RvRGVhdGgoc291bmRUcmlnZ2VyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVygiRXJyb3IgJWQgY29ubmVjdGluZyB0byBzb3VuZCB0cmlnZ2VyIHNlcnZpY2UiLCBzdGF0dXMpOworICAgICAgICBzb3VuZFRyaWdnZXIuY2xlYXIoKTsKKyAgICB9CisgICAgcmV0dXJuIHNvdW5kVHJpZ2dlcjsKK30KKworCitzdGF0dXNfdCBTb3VuZFRyaWdnZXI6OnNldENhcHR1cmVTdGF0ZShib29sIGFjdGl2ZSkKK3sKKyAgICBBTE9HVigic2V0Q2FwdHVyZVN0YXRlKCVkKSIsIGFjdGl2ZSk7CisgICAgY29uc3Qgc3A8SVNvdW5kVHJpZ2dlckh3U2VydmljZT4gc2VydmljZSA9IGdldFNvdW5kVHJpZ2dlckh3U2VydmljZSgpOworICAgIGlmIChzZXJ2aWNlID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBzZXJ2aWNlLT5zZXRDYXB0dXJlU3RhdGUoYWN0aXZlKTsKK30KKworLy8gU291bmRUcmlnZ2VyCitTb3VuZFRyaWdnZXI6OlNvdW5kVHJpZ2dlcihzb3VuZF90cmlnZ2VyX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxTb3VuZFRyaWdnZXJDYWxsYmFjaz4mIGNhbGxiYWNrKQorICAgIDogbU1vZHVsZShtb2R1bGUpLCBtQ2FsbGJhY2soY2FsbGJhY2spCit7Cit9CisKK1NvdW5kVHJpZ2dlcjo6flNvdW5kVHJpZ2dlcigpCit7CisgICAgaWYgKG1JU291bmRUcmlnZ2VyICE9IDApIHsKKyAgICAgICAgbUlTb3VuZFRyaWdnZXItPmRldGFjaCgpOworICAgIH0KK30KKworCit2b2lkIFNvdW5kVHJpZ2dlcjo6ZGV0YWNoKCkgeworICAgIEFMT0dWKCJkZXRhY2goKSIpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbUNhbGxiYWNrLmNsZWFyKCk7CisgICAgaWYgKG1JU291bmRUcmlnZ2VyICE9IDApIHsKKyAgICAgICAgbUlTb3VuZFRyaWdnZXItPmRldGFjaCgpOworICAgICAgICBtSVNvdW5kVHJpZ2dlci0+YXNCaW5kZXIoKS0+dW5saW5rVG9EZWF0aCh0aGlzKTsKKyAgICAgICAgbUlTb3VuZFRyaWdnZXIgPSAwOworICAgIH0KK30KKworc3RhdHVzX3QgU291bmRUcmlnZ2VyOjpsb2FkU291bmRNb2RlbChjb25zdCBzcDxJTWVtb3J5PiYgbW9kZWxNZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kX21vZGVsX2hhbmRsZV90ICpoYW5kbGUpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUlTb3VuZFRyaWdnZXIgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICByZXR1cm4gbUlTb3VuZFRyaWdnZXItPmxvYWRTb3VuZE1vZGVsKG1vZGVsTWVtb3J5LCBoYW5kbGUpOworfQorCitzdGF0dXNfdCBTb3VuZFRyaWdnZXI6OnVubG9hZFNvdW5kTW9kZWwoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1JU291bmRUcmlnZ2VyID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtSVNvdW5kVHJpZ2dlci0+dW5sb2FkU291bmRNb2RlbChoYW5kbGUpOworfQorCitzdGF0dXNfdCBTb3VuZFRyaWdnZXI6OnN0YXJ0UmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhTWVtb3J5KQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1JU291bmRUcmlnZ2VyID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtSVNvdW5kVHJpZ2dlci0+c3RhcnRSZWNvZ25pdGlvbihoYW5kbGUsIGRhdGFNZW1vcnkpOworfQorCitzdGF0dXNfdCBTb3VuZFRyaWdnZXI6OnN0b3BSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUlTb3VuZFRyaWdnZXIgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1JU291bmRUcmlnZ2VyLT5zdG9wUmVjb2duaXRpb24oaGFuZGxlKTsKK30KKworLy8gQnBTb3VuZFRyaWdnZXJDbGllbnQKK3ZvaWQgU291bmRUcmlnZ2VyOjpvblJlY29nbml0aW9uRXZlbnQoY29uc3Qgc3A8SU1lbW9yeT4mIGV2ZW50TWVtb3J5KQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKGV2ZW50TWVtb3J5ID09IDAgfHwgZXZlbnRNZW1vcnktPnBvaW50ZXIoKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobUNhbGxiYWNrICE9IDApIHsKKyAgICAgICAgbUNhbGxiYWNrLT5vblJlY29nbml0aW9uRXZlbnQoCisgICAgICAgICAgICAgICAgKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2V2ZW50ICopZXZlbnRNZW1vcnktPnBvaW50ZXIoKSk7CisgICAgfQorfQorCit2b2lkIFNvdW5kVHJpZ2dlcjo6b25Tb3VuZE1vZGVsRXZlbnQoY29uc3Qgc3A8SU1lbW9yeT4mIGV2ZW50TWVtb3J5KQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKGV2ZW50TWVtb3J5ID09IDAgfHwgZXZlbnRNZW1vcnktPnBvaW50ZXIoKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobUNhbGxiYWNrICE9IDApIHsKKyAgICAgICAgbUNhbGxiYWNrLT5vblNvdW5kTW9kZWxFdmVudCgKKyAgICAgICAgICAgICAgICAoc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kZWxfZXZlbnQgKilldmVudE1lbW9yeS0+cG9pbnRlcigpKTsKKyAgICB9Cit9CisKK3ZvaWQgU291bmRUcmlnZ2VyOjpvblNlcnZpY2VTdGF0ZUNoYW5nZShjb25zdCBzcDxJTWVtb3J5PiYgZXZlbnRNZW1vcnkpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAoZXZlbnRNZW1vcnkgPT0gMCB8fCBldmVudE1lbW9yeS0+cG9pbnRlcigpID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtQ2FsbGJhY2sgIT0gMCkgeworICAgICAgICBtQ2FsbGJhY2stPm9uU2VydmljZVN0YXRlQ2hhbmdlKAorICAgICAgICAgICAgICAgICooKHNvdW5kX3RyaWdnZXJfc2VydmljZV9zdGF0ZV90ICopZXZlbnRNZW1vcnktPnBvaW50ZXIoKSkpOworICAgIH0KK30KKworLy9JQmluZGVyOjpEZWF0aFJlY2lwaWVudAordm9pZCBTb3VuZFRyaWdnZXI6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyBfX3VudXNlZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQUxPR1coIlNvdW5kVHJpZ2dlciBzZXJ2ZXIgYmluZGVyIERpZWQgIik7CisgICAgbUlTb3VuZFRyaWdnZXIgPSAwOworICAgIGlmIChtQ2FsbGJhY2sgIT0gMCkgeworICAgICAgICBtQ2FsbGJhY2stPm9uU2VydmljZURpZWQoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IFNvdW5kVHJpZ2dlcjo6c3RyaW5nVG9HdWlkKGNvbnN0IGNoYXIgKnN0ciwgc291bmRfdHJpZ2dlcl91dWlkX3QgKmd1aWQpCit7CisgICAgaWYgKHN0ciA9PSBOVUxMIHx8IGd1aWQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGludCB0bXBbMTBdOworCisgICAgaWYgKHNzY2FuZihzdHIsICIlMDh4LSUwNHgtJTA0eC0lMDR4LSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCisgICAgICAgICAgICB0bXAsIHRtcCsxLCB0bXArMiwgdG1wKzMsIHRtcCs0LCB0bXArNSwgdG1wKzYsIHRtcCs3LCB0bXArOCwgdG1wKzkpIDwgMTApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgZ3VpZC0+dGltZUxvdyA9ICh1aW50MzJfdCl0bXBbMF07CisgICAgZ3VpZC0+dGltZU1pZCA9ICh1aW50MTZfdCl0bXBbMV07CisgICAgZ3VpZC0+dGltZUhpQW5kVmVyc2lvbiA9ICh1aW50MTZfdCl0bXBbMl07CisgICAgZ3VpZC0+Y2xvY2tTZXEgPSAodWludDE2X3QpdG1wWzNdOworICAgIGd1aWQtPm5vZGVbMF0gPSAodWludDhfdCl0bXBbNF07CisgICAgZ3VpZC0+bm9kZVsxXSA9ICh1aW50OF90KXRtcFs1XTsKKyAgICBndWlkLT5ub2RlWzJdID0gKHVpbnQ4X3QpdG1wWzZdOworICAgIGd1aWQtPm5vZGVbM10gPSAodWludDhfdCl0bXBbN107CisgICAgZ3VpZC0+bm9kZVs0XSA9ICh1aW50OF90KXRtcFs4XTsKKyAgICBndWlkLT5ub2RlWzVdID0gKHVpbnQ4X3QpdG1wWzldOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBTb3VuZFRyaWdnZXI6Omd1aWRUb1N0cmluZyhjb25zdCBzb3VuZF90cmlnZ2VyX3V1aWRfdCAqZ3VpZCwgY2hhciAqc3RyLCBzaXplX3QgbWF4TGVuKQoreworICAgIGlmIChndWlkID09IE5VTEwgfHwgc3RyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzbnByaW50ZihzdHIsIG1heExlbiwgIiUwOHgtJTA0eC0lMDR4LSUwNHgtJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IiwKKyAgICAgICAgICAgIGd1aWQtPnRpbWVMb3csCisgICAgICAgICAgICBndWlkLT50aW1lTWlkLAorICAgICAgICAgICAgZ3VpZC0+dGltZUhpQW5kVmVyc2lvbiwKKyAgICAgICAgICAgIGd1aWQtPmNsb2NrU2VxLAorICAgICAgICAgICAgZ3VpZC0+bm9kZVswXSwKKyAgICAgICAgICAgIGd1aWQtPm5vZGVbMV0sCisgICAgICAgICAgICBndWlkLT5ub2RlWzJdLAorICAgICAgICAgICAgZ3VpZC0+bm9kZVszXSwKKyAgICAgICAgICAgIGd1aWQtPm5vZGVbNF0sCisgICAgICAgICAgICBndWlkLT5ub2RlWzVdKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rvb2xzL3Jlc2FtcGxlcl90b29scy9maXIuY3BwIGIvdG9vbHMvcmVzYW1wbGVyX3Rvb2xzL2Zpci5jcHAKaW5kZXggY2MzZDUwOS4uNjJlZGRjYSAxMDA2NDQKLS0tIGEvdG9vbHMvcmVzYW1wbGVyX3Rvb2xzL2Zpci5jcHAKKysrIGIvdG9vbHMvcmVzYW1wbGVyX3Rvb2xzL2Zpci5jcHAKQEAgLTIwLDE1ICsyMCwyNSBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogCi1zdGF0aWMgZG91YmxlIHNpbmMoZG91YmxlIHgpIHsKK3N0YXRpYyBpbmxpbmUgZG91YmxlIHNpbmMoZG91YmxlIHgpIHsKICAgICBpZiAoZmFicyh4KSA9PSAwLjBmKSByZXR1cm4gMS4wZjsKICAgICByZXR1cm4gc2luKHgpIC8geDsKIH0KIAotc3RhdGljIGRvdWJsZSBzcXIoZG91YmxlIHgpIHsKK3N0YXRpYyBpbmxpbmUgZG91YmxlIHNxcihkb3VibGUgeCkgewogICAgIHJldHVybiB4Kng7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50NjRfdCB0b2ludChkb3VibGUgeCwgaW50NjRfdCBtYXh2YWwpIHsKKyAgICBpbnQ2NF90IHY7CisKKyAgICB2ID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oZmxvb3IoeCAqIG1heHZhbCArIDAuNSkpOworICAgIGlmICh2ID49IG1heHZhbCkgeworICAgICAgICByZXR1cm4gbWF4dmFsIC0gMTsgLy8gZXJyb3IhCisgICAgfQorICAgIHJldHVybiB2OworfQorCiBzdGF0aWMgZG91YmxlIEkwKGRvdWJsZSB4KSB7CiAgICAgLy8gZnJvbSB0aGUgTnVtZXJpY2FsIFJlY2lwZXMgaW4gQyBwLiAyMzcKICAgICBkb3VibGUgYXgsYW5zLHk7CkBAIC01NCwxMSArNjQsMTIgQEAKICAgICByZXR1cm4gSTAoYmV0YSAqIHNxcnQoMS4wIC0gc3FyKCgyLjAqaykvTiAtIDEuMCkpKSAvIEkwKGJldGEpOwogfQogCi0KIHN0YXRpYyB2b2lkIHVzYWdlKGNoYXIqIG5hbWUpIHsKICAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAgICJ1c2FnZTogJXMgWy1oXSBbLWRdIFstcyBzYW1wbGVfcmF0ZV0gWy1jIGN1dC1vZmZfZnJlcXVlbmN5XSBbLW4gaGFsZl96ZXJvX2Nyb3NzaW5nc10gWy1mIHtmbG9hdHxmaXhlZH1dIFstYiBiZXRhXSBbLXYgZEJGU10gWy1sIGxlcnBdXG4iCi0gICAgICAgICAgICAiICAgICAgICVzIFstaF0gWy1kXSBbLXMgc2FtcGxlX3JhdGVdIFstYyBjdXQtb2ZmX2ZyZXF1ZW5jeV0gWy1uIGhhbGZfemVyb19jcm9zc2luZ3NdIFstZiB7ZmxvYXR8Zml4ZWR9XSBbLWIgYmV0YV0gWy12IGRCRlNdIC1wIE0vTlxuIgorICAgICAgICAgICAgInVzYWdlOiAlcyBbLWhdIFstZF0gWy1zIHNhbXBsZV9yYXRlXSBbLWMgY3V0LW9mZl9mcmVxdWVuY3ldIFstbiBoYWxmX3plcm9fY3Jvc3NpbmdzXSIKKyAgICAgICAgICAgICIgWy1mIHtmbG9hdHxmaXhlZHxmaXhlZDE2fV0gWy1iIGJldGFdIFstdiBkQkZTXSBbLWwgbGVycF1cbiIKKyAgICAgICAgICAgICIgICAgICAgJXMgWy1oXSBbLWRdIFstcyBzYW1wbGVfcmF0ZV0gWy1jIGN1dC1vZmZfZnJlcXVlbmN5XSBbLW4gaGFsZl96ZXJvX2Nyb3NzaW5nc10iCisgICAgICAgICAgICAiIFstZiB7ZmxvYXR8Zml4ZWR8Zml4ZWQxNn1dIFstYiBiZXRhXSBbLXYgZEJGU10gLXAgTS9OXG4iCiAgICAgICAgICAgICAiICAgIC1oICAgIHRoaXMgaGVscCBtZXNzYWdlXG4iCiAgICAgICAgICAgICAiICAgIC1kICAgIGRlYnVnLCBwcmludCBjb21tYS1zZXBhcmF0ZWQgY29lZmZpY2llbnQgdGFibGVcbiIKICAgICAgICAgICAgICIgICAgLXAgICAgZ2VuZXJhdGUgcG9seS1waGFzZSBmaWx0ZXIgY29lZmZpY2llbnRzLCB3aXRoIHNhbXBsZSBpbmNyZW1lbnQgTS9OXG4iCkBAIC02Niw2ICs3Nyw3IEBACiAgICAgICAgICAgICAiICAgIC1jICAgIGN1dC1vZmYgZnJlcXVlbmN5ICgyMDQ3OClcbiIKICAgICAgICAgICAgICIgICAgLW4gICAgbnVtYmVyIG9mIHplcm8tY3Jvc3NpbmdzIG9uIG9uZSBzaWRlICg4KVxuIgogICAgICAgICAgICAgIiAgICAtbCAgICBudW1iZXIgb2YgbGVycGluZyBiaXRzICg0KVxuIgorICAgICAgICAgICAgIiAgICAtbSAgICBudW1iZXIgb2YgcG9seXBoYXNlcyAocmVsYXRlZCB0byAtbCwgZGVmYXVsdCAxNilcbiIKICAgICAgICAgICAgICIgICAgLWYgICAgb3V0cHV0IGZvcm1hdCwgY2FuIGJlIGZpeGVkLXBvaW50IG9yIGZsb2F0aW5nLXBvaW50IChmaXhlZClcbiIKICAgICAgICAgICAgICIgICAgLWIgICAga2Fpc2VyIHdpbmRvdyBwYXJhbWV0ZXIgYmV0YSAoNy44NjUgWy04MGRCXSlcbiIKICAgICAgICAgICAgICIgICAgLXYgICAgYXR0ZW51YXRpb24gaW4gZEJGUyAoMClcbiIsCkBAIC03Nyw4ICs4OSw3IEBACiBpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCiB7CiAgICAgLy8gbmMgaXMgdGhlIG51bWJlciBvZiBiaXRzIHRvIHN0b3JlIHRoZSBjb2VmZmljaWVudHMKLSAgICBjb25zdCBpbnQgbmMgPSAzMjsKLQorICAgIGludCBuYyA9IDMyOwogICAgIGJvb2wgcG9seXBoYXNlID0gZmFsc2U7CiAgICAgdW5zaWduZWQgaW50IHBvbHlNID0gMTYwOwogICAgIHVuc2lnbmVkIGludCBwb2x5TiA9IDE0NzsKQEAgLTg4LDcgKzk5LDYgQEAKICAgICBkb3VibGUgYXR0ZW4gPSAxOwogICAgIGludCBmb3JtYXQgPSAwOwogCi0KICAgICAvLyBpbiBvcmRlciB0byBrZWVwIHRoZSBlcnJvcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5lYXIKICAgICAvLyBpbnRlcnBvbGF0aW9uIG9mIHRoZSBjb2VmZmljaWVudHMgYmVsb3cgdGhlIHF1YW50aXphdGlvbiBlcnJvcgogICAgIC8vIHdlIG11c3Qgc2F0aXNmeToKQEAgLTEwNCw3ICsxMTQsNiBAQAogICAgIC8vIFNtaXRoLCBKLk8uIERpZ2l0YWwgQXVkaW8gUmVzYW1wbGluZyBIb21lIFBhZ2UKICAgICAvLyBodHRwczovL2Njcm1hLnN0YW5mb3JkLmVkdS9+am9zL3Jlc2FtcGxlLywgMjAxMS0wMy0yOQogICAgIC8vCi0gICAgaW50IG56ID0gNDsKIAogICAgIC8vICAgICAgICAgfCAwLjExMDIqKEEgLSA4LjcpICAgICAgICAgICAgICAgICAgICAgICAgIEEgPiA1MAogICAgIC8vICBiZXRhID0gfCAwLjU4NDIqKEEgLSAyMSleMC40ICsgMC4wNzg4NiooQSAtIDIxKSAgIDIxIDw9IEEgPD0gNTAKQEAgLTEyMywzMyArMTMyLDMzIEBACiAgICAgLy8gICAxMDAgZEIgICAxMC4wNTYKICAgICBkb3VibGUgYmV0YSA9IDcuODY1OwogCi0KICAgICAvLyAyKm56YyA9IChBIC0gOCkgLyAoMi4yODUgKiBkdykKICAgICAvLyAgICAgIHdpdGggZHcgdGhlIHRyYW5zaXRpb24gd2lkdGggPSAyKnBpKmRGL0ZzCiAgICAgLy8KICAgICBpbnQgbnpjID0gODsKIAotICAgIC8vCi0gICAgLy8gRXhhbXBsZToKLSAgICAvLyA0NC4xIEtIeiB0byA0OCBLSHogcmVzYW1wbGluZwotICAgIC8vIDEwMCBkQiByZWplY3Rpb24gYWJvdmUgMjggS0h6Ci0gICAgLy8gICAodGhlIHNwZWN0cnVtIHdpbGwgZm9sZCBhcm91bmQgMjQgS0h6IGFuZCB3ZSB3YW50IDEwMCBkQiByZWplY3Rpb24KLSAgICAvLyAgICBhdCB0aGUgcG9pbnQgd2hlcmUgdGhlIGZvbGRpbmcgcmVhY2hlcyAyMCBLSHopCi0gICAgLy8gIC4uLl9fX3xfX19fXwotICAgIC8vICAgICAgICB8ICAgICBcfAotICAgIC8vICAgICAgICB8IF9fX18vfFxfX19fCi0gICAgLy8gICAgICAgIHwvYWxpYXN8ICAgICBcCi0gICAgLy8gIC0tLS0tLS8tLS0tLS0rLS0tLS0tXC0tLS0tLS0tLT4gS0h6Ci0gICAgLy8gICAgICAgMjAgICAgIDI0ICAgICAyOAorICAgIC8qCisgICAgICogRXhhbXBsZToKKyAgICAgKiA0NC4xIEtIeiB0byA0OCBLSHogcmVzYW1wbGluZworICAgICAqIDEwMCBkQiByZWplY3Rpb24gYWJvdmUgMjggS0h6CisgICAgICogICAodGhlIHNwZWN0cnVtIHdpbGwgZm9sZCBhcm91bmQgMjQgS0h6IGFuZCB3ZSB3YW50IDEwMCBkQiByZWplY3Rpb24KKyAgICAgKiAgICBhdCB0aGUgcG9pbnQgd2hlcmUgdGhlIGZvbGRpbmcgcmVhY2hlcyAyMCBLSHopCisgICAgICogIC4uLl9fX3xfX19fXworICAgICAqICAgICAgICB8ICAgICBcfAorICAgICAqICAgICAgICB8IF9fX18vfFxfX19fCisgICAgICogICAgICAgIHwvYWxpYXN8ICAgICBcCisgICAgICogIC0tLS0tLS8tLS0tLS0rLS0tLS0tXC0tLS0tLS0tLT4gS0h6CisgICAgICogICAgICAgMjAgICAgIDI0ICAgICAyOAorICAgICAqCisgICAgICogVHJhbnNpdGlvbiBiYW5kIDggS0h6LCBvciBkdyA9IDEuMDQ3MgorICAgICAqCisgICAgICogYmV0YSA9IDEwLjA1NgorICAgICAqIG56YyAgPSAyMAorICAgICAqLwogCi0gICAgLy8gVHJhbnNpdGlvbiBiYW5kIDggS0h6LCBvciBkdyA9IDEuMDQ3MgotICAgIC8vCi0gICAgLy8gYmV0YSA9IDEwLjA1NgotICAgIC8vIG56YyAgPSAyMAotICAgIC8vCi0KKyAgICBpbnQgTSA9IDEgPDwgNDsgLy8gbnVtYmVyIG9mIHBoYXNlcyBmb3IgaW50ZXJwb2xhdGlvbgogICAgIGludCBjaDsKLSAgICB3aGlsZSAoKGNoID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICI6aGRzOmM6bjpmOmw6YjpwOnY6IikpICE9IC0xKSB7CisgICAgd2hpbGUgKChjaCA9IGdldG9wdChhcmdjLCBhcmd2LCAiOmhkczpjOm46ZjpsOm06YjpwOnY6ejoiKSkgIT0gLTEpIHsKICAgICAgICAgc3dpdGNoIChjaCkgewogICAgICAgICAgICAgY2FzZSAnZCc6CiAgICAgICAgICAgICAgICAgZGVidWcgPSB0cnVlOwpAQCAtMTY5LDEzICsxNzgsMjYgQEAKICAgICAgICAgICAgIGNhc2UgJ24nOgogICAgICAgICAgICAgICAgIG56YyA9IGF0b2kob3B0YXJnKTsKICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ20nOgorICAgICAgICAgICAgICAgIE0gPSBhdG9pKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlICdsJzoKLSAgICAgICAgICAgICAgICBueiA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBNID0gMSA8PCBhdG9pKG9wdGFyZyk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlICdmJzoKLSAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcChvcHRhcmcsImZpeGVkIikpIGZvcm1hdCA9IDA7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChvcHRhcmcsImZsb2F0IikpIGZvcm1hdCA9IDE7Ci0gICAgICAgICAgICAgICAgZWxzZSB1c2FnZShhcmd2WzBdKTsKKyAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcChvcHRhcmcsICJmaXhlZCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAob3B0YXJnLCAiZml4ZWQxNiIpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IDA7CisgICAgICAgICAgICAgICAgICAgIG5jID0gMTY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAob3B0YXJnLCAiZmxvYXQiKSkgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAnYic6CiAgICAgICAgICAgICAgICAgYmV0YSA9IGF0b2Yob3B0YXJnKTsKQEAgLTE5MywxMSArMjE1LDE0IEBACiAgICAgLy8gY3V0IG9mZiBmcmVxdWVuY3kgcmF0aW8gRmMvRnMKICAgICBkb3VibGUgRmNyID0gRmMgLyBGczsKIAotCiAgICAgLy8gdG90YWwgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyAob25lIHNpZGUpCi0gICAgY29uc3QgaW50IE0gPSAoMSA8PCBueik7CisKICAgICBjb25zdCBpbnQgTiA9IE0gKiBuemM7CiAKKyAgICAvLyBsZXJwICh3aGljaCBpcyBtb3N0IHVzZWZ1bCBpZiBNIGlzIGEgcG93ZXIgb2YgMikKKworICAgIGludCBueiA9IDA7IC8vIHJlY2FsY3VsYXRlIG56IGFzIHRoZSBiaXRzIG5lZWRlZCB0byByZXByZXNlbnQgTQorICAgIGZvciAoaW50IGkgPSBNLTEgOyBpOyBpPj49MSwgbnorKyk7CiAgICAgLy8gZ2VuZXJhdGUgdGhlIHJpZ2h0IGhhbGYgb2YgdGhlIGZpbHRlcgogICAgIGlmICghZGVidWcpIHsKICAgICAgICAgcHJpbnRmKCIvLyBjbWQtbGluZTogIik7CkBAIC0yMDcsNyArMjMyLDcgQEAKICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgICBpZiAoIXBvbHlwaGFzZSkgewogICAgICAgICAgICAgcHJpbnRmKCJjb25zdCBpbnQzMl90IFJFU0FNUExFX0ZJUl9TSVpFICAgICAgICAgICA9ICVkO1xuIiwgTik7Ci0gICAgICAgICAgICBwcmludGYoImNvbnN0IGludDMyX3QgUkVTQU1QTEVfRklSX0xFUlBfSU5UX0JJVFMgID0gJWQ7XG4iLCBueik7CisgICAgICAgICAgICBwcmludGYoImNvbnN0IGludDMyX3QgUkVTQU1QTEVfRklSX0lOVF9QSEFTRVMgICAgID0gJWQ7XG4iLCBNKTsKICAgICAgICAgICAgIHByaW50ZigiY29uc3QgaW50MzJfdCBSRVNBTVBMRV9GSVJfTlVNX0NPRUYgICAgICAgPSAlZDtcbiIsIG56Yyk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBwcmludGYoImNvbnN0IGludDMyX3QgUkVTQU1QTEVfRklSX1NJWkUgICAgICAgICAgID0gJWQ7XG4iLCAyKm56Yypwb2x5Tik7CkBAIC0yMjQsNyArMjQ5LDcgQEAKICAgICAgICAgZm9yIChpbnQgaT0wIDsgaTw9TSA7IGkrKykgeyAvLyBhbiBleHRyYSBzZXQgb2YgY29lZnMgZm9yIGludGVycG9sYXRpb24KICAgICAgICAgICAgIGZvciAoaW50IGo9MCA7IGo8bnpjIDsgaisrKSB7CiAgICAgICAgICAgICAgICAgaW50IGl4ID0gaipNICsgaTsKLSAgICAgICAgICAgICAgICBkb3VibGUgeCA9ICgyLjAgKiBNX1BJICogaXggKiBGY3IpIC8gKDEgPDwgbnopOworICAgICAgICAgICAgICAgIGRvdWJsZSB4ID0gKDIuMCAqIE1fUEkgKiBpeCAqIEZjcikgLyBNOwogICAgICAgICAgICAgICAgIGRvdWJsZSB5ID0ga2Fpc2VyKGl4K04sIDIqTiwgYmV0YSkgKiBzaW5jKHgpICogMi4wICogRmNyOwogICAgICAgICAgICAgICAgIHkgKj0gYXR0ZW47CiAKQEAgLTIzMiwxOCArMjU3LDIwIEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChqID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuICAgICIpOwogICAgICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgICAgIGlmICghZm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGludDY0X3QgeWkgPSBmbG9vcih5ICogKCgxVUxMPDwobmMtMSkpKSArIDAuNSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh5aSA+PSAoMUxMPDwobmMtMSkpKSB5aSA9ICgxTEw8PChuYy0xKSktMTsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIweCUwOHgsICIsIGludDMyX3QoeWkpKTsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB5aSA9IHRvaW50KHksIDFVTEw8PChuYy0xKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChuYyA+IDE2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIjB4JTA4eCwgIiwgaW50MzJfdCh5aSkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIweCUwNHgsICIsIGludDMyX3QoeWkpJjB4ZmZmZik7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBwcmludGYoIiUuOWclcyAiLCB5LCBkZWJ1ZyA/ICIsIiA6ICJmLCIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoaW50IGo9MCA7IGo8cG9seU4gOyBqKyspIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaj0wIDsgajxwb2x5TiA7IGorKykgewogICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBwaGFzZQogICAgICAgICAgICAgZG91YmxlIHAgPSAoKHBvbHlNKmopICUgcG9seU4pIC8gZG91YmxlKHBvbHlOKTsKICAgICAgICAgICAgIGlmICghZGVidWcpIHByaW50ZigiXG4gICAgIik7CkBAIC0yNTQsOSArMjgxLDEyIEBACiAgICAgICAgICAgICAgICAgZG91YmxlIHkgPSBrYWlzZXIoaStOLCAyKk4sIGJldGEpICogc2luYyh4KSAqIDIuMCAqIEZjcjs7CiAgICAgICAgICAgICAgICAgeSAqPSBhdHRlbjsKICAgICAgICAgICAgICAgICBpZiAoIWZvcm1hdCkgewotICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHlpID0gZmxvb3IoeSAqICgoMVVMTDw8KG5jLTEpKSkgKyAwLjUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoeWkgPj0gKDFMTDw8KG5jLTEpKSkgeWkgPSAoMUxMPDwobmMtMSkpLTE7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiMHglMDh4IiwgaW50MzJfdCh5aSkpOworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHlpID0gdG9pbnQoeSwgMVVMTDw8KG5jLTEpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5jID4gMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiMHglMDh4LCAiLCBpbnQzMl90KHlpKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIjB4JTA0eCwgIiwgaW50MzJfdCh5aSkmMHhmZmZmKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJS45ZyVzIiwgeSwgZGVidWcgPyAiIiA6ICJmIik7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjc3LDUgKzMwNywzIEBACiB9CiAKIC8vIGh0dHA6Ly93d3cuY3NlZS51bWJjLmVkdS9oZWxwL3NvdW5kL0FGc3AtVjJSMS9odG1sL2F1ZGlvL1Jlc2FtcEF1ZGlvLmh0bWwKLQotCg==